diff --git a/.github/workflows/lctt-article-badge.yml b/.github/workflows/lctt-article-badge.yml new file mode 100644 index 0000000000..aef3d9613d --- /dev/null +++ b/.github/workflows/lctt-article-badge.yml @@ -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 }} diff --git a/.github/workflows/lctt-article-checker.yml b/.github/workflows/lctt-article-checker.yml new file mode 100644 index 0000000000..32d4354454 --- /dev/null +++ b/.github/workflows/lctt-article-checker.yml @@ -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; diff --git a/.github/workflows/lctt-article-status.yml b/.github/workflows/lctt-article-status.yml new file mode 100644 index 0000000000..69ac7d5be8 --- /dev/null +++ b/.github/workflows/lctt-article-status.yml @@ -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 }} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0b12ca6653..0000000000 --- a/.travis.yml +++ /dev/null @@ -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 diff --git a/lctt2020.md b/lctt2020.md new file mode 100644 index 0000000000..ededeb7081 --- /dev/null +++ b/lctt2020.md @@ -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),面向红帽旗下的原创播客《[代码英雄](https://www.redhat.com/en/command-line-heroes) Command Line Heroes》进行定向的翻译,目前,第一季度的翻译成功已经全部在 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, 希望我们可以在下一个七年,再次相遇。 + diff --git a/published/201601/20151127 Linux or UNIX grep Command Tutorial series 7--Linux or UNIX View Only Configuration File Directives Uncommented Lines of a Config File.md b/published/201601/20151127 Linux or UNIX grep Command Tutorial series 7--Uncommented Lines of a Config File.md similarity index 100% rename from published/201601/20151127 Linux or UNIX grep Command Tutorial series 7--Linux or UNIX View Only Configuration File Directives Uncommented Lines of a Config File.md rename to published/201601/20151127 Linux or UNIX grep Command Tutorial series 7--Uncommented Lines of a Config File.md diff --git a/published/201608/20160615 Explanation of “Everything is a File” and Types of Files in Linux.md b/published/201608/20160615 Explanation of Everything is a File and Types of Files in Linux.md old mode 100755 new mode 100644 similarity index 100% rename from published/201608/20160615 Explanation of “Everything is a File” and Types of Files in Linux.md rename to published/201608/20160615 Explanation of Everything is a File and Types of Files in Linux.md diff --git a/published/201610/20160604 How to Build Your First Slack Bot with Python.md b/published/201610/20160604 How to Build Your First Slack Bot with Python.md old mode 100755 new mode 100644 diff --git a/published/201610/20160724 Terminator A Linux Terminal Emulator With Multiple Terminals In One Window.md b/published/201610/20160724 Terminator A Linux Terminal Emulator With Multiple Terminals In One Window.md old mode 100755 new mode 100644 diff --git a/published/201610/20160811 How to Mount Remote Linux Filesystem or Directory Using SSHFS Over SSH.md b/published/201610/20160811 How to Mount Remote Linux Filesystem or Directory Using SSHFS Over SSH.md old mode 100755 new mode 100644 diff --git a/published/201610/20160812 What is copyleft.md b/published/201610/20160812 What is copyleft.md old mode 100755 new mode 100644 diff --git a/published/201611/20160513 aria2 (Command Line Downloader) command examples.md b/published/201611/20160513 aria2 (Command Line Downloader) command examples.md old mode 100755 new mode 100644 diff --git a/published/201611/20160914 Down and dirty with Windows Nano Server 2016.md b/published/201611/20160914 Down and dirty with Windows Nano Server 2016.md old mode 100755 new mode 100644 diff --git a/published/201611/20161025 3 Ways to Delete All Files in a Directory Except One or Few Files with Extensions.md b/published/201611/20161025 3 Ways to Delete All Files in a Directory Except One or Few Files with Extensions.md old mode 100755 new mode 100644 diff --git a/published/201611/20161025 How to Start Linux Command in Background and Detach Process in Terminal.md b/published/201611/20161025 How to Start Linux Command in Background and Detach Process in Terminal.md old mode 100755 new mode 100644 diff --git a/published/201701/20160610 Setting Up Real-Time Monitoring with Ganglia.md b/published/201701/20160610 Setting Up Real-Time Monitoring with Ganglia.md old mode 100755 new mode 100644 diff --git a/published/201804/20180206 Programming in Color with ncurses.md b/published/201804/20180206 Programming in Color with ncurses.md old mode 100755 new mode 100644 diff --git a/published/201908/20190730 How to create a pull request in GitHub.md b/published/201908/20190730 How to create a pull request in GitHub.md old mode 100755 new mode 100644 diff --git a/published/201908/20190817 GNOME and KDE team up on the Linux desktop, docs for Nvidia GPUs open up, a powerful new way to scan for firmware vulnerabilities, and more news.md b/published/201908/20190817 GNOME and KDE team up on the Linux desktop, docs for Nvidia GPUs open up.md similarity index 100% rename from published/201908/20190817 GNOME and KDE team up on the Linux desktop, docs for Nvidia GPUs open up, a powerful new way to scan for firmware vulnerabilities, and more news.md rename to published/201908/20190817 GNOME and KDE team up on the Linux desktop, docs for Nvidia GPUs open up.md diff --git a/published/201909/20190831 Google opens Android speech transcription and gesture tracking, Twitter-s telemetry tooling, Blender-s growing adoption, and more news.md b/published/201909/20190831 Google opens Android speech transcription and gesture tracking.md similarity index 100% rename from published/201909/20190831 Google opens Android speech transcription and gesture tracking, Twitter-s telemetry tooling, Blender-s growing adoption, and more news.md rename to published/201909/20190831 Google opens Android speech transcription and gesture tracking.md diff --git a/published/20200228 4 technologists on careers in tech for minorities.md b/published/20200228 4 technologists on careers in tech for minorities.md new file mode 100644 index 0000000000..34ffe23bcd --- /dev/null +++ b/published/20200228 4 technologists on careers in tech for minorities.md @@ -0,0 +1,125 @@ +[#]: collector: (lujun9972) +[#]: translator: (M4Xrun) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13480-1.html) +[#]: subject: (4 technologists on careers in tech for minorities) +[#]: via: (https://opensource.com/article/20/2/careers-tech-minorities) +[#]: author: (Shilla Saebi https://opensource.com/users/shillasaebi) + +4 位技术专家谈少数族群的技术职业 +====== + +> 了解 BHM 对他们意味着什么,什么影响了他们的职业生涯,为想要进入科技领域的少数族群提供资源,等等。 + +![Team meeting][1] + +为了纪念 BHM,我收集了一些我最喜欢的技术专家和开源贡献者的意见。这四位正在为下一代铺路,同时也在为他们在科技行业所做的工作铺路。了解 BHM 对他们意味着什么,是什么影响了他们的职业生涯,为想要进入科技领域的少数族群提供资源,等等。 + +**[Tameika Reed][2],Women In Linux 创始人** + +自 Women In Linux 发起以来,Tameika 一直致力于探索基础设施、网络安全、DevOps 和物联网领域的职业生涯,并致力于领导力和持续技能的培养。作为一个自学成才的系统管理员,Tameika 相信学习技术的最好方法就是深入其中。为了给女性一个全面的角度来看技术,Tameika 每周都会举办一次线上会议来探讨 Hyperledger、Kubernetes、微服务和高性能计算等 Linux 常规之外的技术。Tameika 的职业生涯包括与 OSCon、LISA 2018、Seagl、HashiCorp EU 2019 不同的会议以及各种当地活动进行会议发言。 + +**[Michael Scott Winslow][3],Comcast 公司核心应用与平台总监** + +“我是一个父亲、丈夫、兄弟、儿子。我出生在一个小家庭,所以我很乐于把朋友们变成一个大家庭。当我把我的名字附在某件事上时,我就非常希望它能成功,所以我很在意我参与的事情。噢,在我的职业生涯中我已经做了数十年的软件开发。我解决问题,和别人合作一起帮助解决大问题,我带领、引导和指导年轻的软件工程师的同时观察我想要学习的人。” + +**[Bryan Liles][4],VMware 资深工程师** + +“我正在和我们的团队一起重新思考开发人员如何与 Kubernetes 进行交互。当我不工作的时候,我就制造机器人和在社区里努力激励下一代的软件工程师。” + +**[Mutale Nkonde][5],AI For the People(AFP)首席执行官** + +AFP 是一家非营利性的创意机构。在创办非营利组织之前,Nkonde 从事人工智能治理工作。在此期间,她是向美国众议院提出《算法和深度伪造算法法案》以及《无生物识别障碍住房法案》的团队成员之一。Nkonde 的职业生涯中最开始是做广播记者,曾在英国广播公司(BBC)、美国有线电视新闻网(CNN)和美国广播公司(ABC)工作。她还广泛从事种族和科技方面的写作,并在哈佛大学和斯坦福大学获得奖学金。 + +### 是什么影响了你选择技术领域的职业? + +当我回到大学的时候,我害怕电脑。我害怕电脑是因为我从大学辍学了。之后我又回去了,我就把尽我所能学习作为自己的任务。这是我至今的座右铭,学习永不停止。— Tameika Reed + +我不会拐弯抹角,我小时候是个极客!在我 10 岁的时候,我就从印刷杂志上读到的代码开始每天写 GW-BASIC。在我上高中的时候,我给了自己一点喘息的时间来享受生活,但是当到了为大学选择专业的时候,这是一个很容易做出的选择。我留在了科技行业,这得感谢我一路走来遇到的了不起的导师和同事。— Michael Scott Winslow + +我从中学就开始写软件了。我喜欢告诉电脑去做事情并看到结果。长大后,我很快就意识到,拥有一份让我满意、收入高的工作才是正确的选择。— Bryan Liles + +我想知道为什么科技公司雇佣的黑人女性这么少。 — Mutale Nkonde + +### 在开源技术领域有没有某个特别的人给了你启发? + +我从很多其他人和项目中得到启发。比如我喜欢看到其他人来到 [Women In Linux][6],并确定他们想去哪里。我试着让人们从更全面的角度来看科技,这样他们就可以决定自己喜欢什么。说自己想在科技行业工作很容易,但要入手并坚持下去很难。你不必仅仅是一个程序员,你也可以成为一个云计算架构师。— Tameika Reed + +[Kelsey Hightower][7]、[Bryan Liles][4] 和 Kim Scott 激励了我。他们是如此真实!他们说的都是我每天的感受和经历。做好你的工作!别抱怨了!承认你的行为,并明白你是如何促成你的处境的![Gene Kim][8] 也给了我很大的启发。作为 DevOps 运动的领导者,我看到自己在追随和模仿他做的很多事情。 — Michael Scott Winslow + +不,我没有看到我想要的灵感,所以我努力成为 20 年前那个给我启发的人。 — Bryan Liles + +太多了!我最喜欢的一个是:[Dorothy Vaughan][9],她是美国第一个为 IBM 沃森电脑编程的人。她的故事被记录在电影《Hidden Figures》中。 — Mutale Nkonde + +### 你有什么特别的资源可以推荐给那些想要加入科技行业的少数人吗? + +有,我建议你在 Twitter 上交一些朋友,然后提问。以下是我在科技界关注和欣赏的一些人: — Tameika Reed + + * [@techgirl1908][10] + * [@bryanl][4] + * [@kelseyhightower][7] + * [@kstewart][11] + * [@tiffani][12] + * [@EricaJoy][13] + * [@womeninlinux][6] + * [@ArlanWasHere][14] + * [@blkintechnology][15] + * [@digundiv][16] + +受重视的新人训练营确实缩短了人们加入科技行业的时间。我遇到过几位经过培训的专业人士,他们都比 4 年制学校的同行更出色。我认为我们可以真正开始尊重人们创造的成果,而不是技术的熟练。 — Michael Scott Winslow + +我不确定我能推荐什么具体的东西。科技是一个很大的整体,所以没有一个简单的答案。我的建议是选择你认为会感兴趣的东西,并努力成为这个方面的专家。从问为什么开始,而不是怎么做,并且开始理解事物是如何一起运作的。 — Bryan Liles + +这取决于他们想做什么工作。对于那些在科技和社会公正的交汇处工作的人,我推荐 Safiya Noble 的《[Algorithms of Oppression][17]》一书。 —Mutale Nkonde + +### 你对有色人种将科技作为他们的职业有什么建议? + +我建议你学习自己的技能。你将是一个永远的学习者。总会有人或事挡在你的路上,你的反应和行动将取决于你自己。永远不要拒绝第一个提议,要知道自己的价值。我看技术就像看艺术一样。发展需要时间,所以要对自己有耐心,拔掉插头说不也没关系。 — Tameika Reed + +作为一个有点像行业保护者一样的人,我不想要不适合技术的人。所以要真正判断自己是否适合科技。你是一个能解决问题的人吗?你是否理性多于感性?你是否经常发现自己在创造过程?如果是这样,无论你的背景如何,我认为你都可以在科技行业找到一个家。— Michael Scott Winslow + +事情不会那么简单。你的进步会因为你的族群而减慢。你必须更努力工作。把逆境当作动力。你要比周围的人准备的更充分,这样当机会出现时你就能够应对它。找一个与你相似的人的网络,私下发泄不满,公开展示实力。你属于这里,你就能成功。 — Bryan Liles + +除了为一家公司工作,也在发展公共利益技术领域,我们的工作中心是技术如何影响真实的人。许多领导这项工作的人是有色人种妇女,黑人妇女正在取得巨大的进步。— Mutale Nkonde + +### BHM 对你来说意味着什么? + +意味着永不停止,为你永远不会忘记。 —Tameika Reed + +BHM 对我来说意味着关注塔斯克基飞行队而不是奴隶制。强调我们如何为历史做出贡献,而不是如何成为历史的受害者。我希望人们理解我们的骄傲来自哪里,而不是我们的愤怒。在我们的人民身上发生了很多非常糟糕的事情,但我们还站在这里。坚强!— Michael Scott Winslow + +BHM 是一个反思被遗忘的美国黑人历史的日子。我把它当作是感谢我的祖先所做的牺牲的时刻。— Bryan Liles + +这是一个集中体现全球黑人所作贡献的时刻。我喜欢它,这是我一年中最喜欢的时间之一。 — Mutale Nkonde + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/careers-tech-minorities + +作者:[Shilla Saebi][a] +选题:[lujun9972][b] +译者:[M4Xrun](https://github.com/M4Xrun) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/shillasaebi +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/meeting-team-listen-communicate.png?itok=KEBP6vZ_ (Team meeting) +[2]: https://www.linkedin.com/in/tameika-reed-1a7290128/ +[3]: https://twitter.com/michaelswinslow +[4]: https://twitter.com/bryanl +[5]: https://twitter.com/mutalenkonde +[6]: https://twitter.com/WomenInLinux +[7]: https://twitter.com/kelseyhightower +[8]: https://twitter.com/RealGeneKim +[9]: https://en.wikipedia.org/wiki/Dorothy_Vaughan +[10]: https://twitter.com/techgirl1908 +[11]: https://twitter.com/kstewart +[12]: https://twitter.com/tiffani +[13]: https://twitter.com/EricaJoy +[14]: https://twitter.com/ArlanWasHere +[15]: https://twitter.com/blkintechnology +[16]: https://twitter.com/digundiv +[17]: http://algorithmsofoppression.com/ diff --git a/published/20190107 Different Ways To Update Linux Kernel For Ubuntu.md b/published/202004/20190107 Different Ways To Update Linux Kernel For Ubuntu.md similarity index 100% rename from published/20190107 Different Ways To Update Linux Kernel For Ubuntu.md rename to published/202004/20190107 Different Ways To Update Linux Kernel For Ubuntu.md diff --git a/published/20190116 Best Audio Editors For Linux.md b/published/202004/20190116 Best Audio Editors For Linux.md similarity index 100% rename from published/20190116 Best Audio Editors For Linux.md rename to published/202004/20190116 Best Audio Editors For Linux.md diff --git a/published/20190205 Installing Kali Linux on VirtualBox- Quickest - Safest Way.md b/published/202004/20190205 Installing Kali Linux on VirtualBox- Quickest - Safest Way.md similarity index 100% rename from published/20190205 Installing Kali Linux on VirtualBox- Quickest - Safest Way.md rename to published/202004/20190205 Installing Kali Linux on VirtualBox- Quickest - Safest Way.md diff --git a/published/20190429 10 moments that shaped Linux history.md b/published/202004/20190429 10 moments that shaped Linux history.md similarity index 100% rename from published/20190429 10 moments that shaped Linux history.md rename to published/202004/20190429 10 moments that shaped Linux history.md diff --git a/published/20190523 Run your blog on GitHub Pages with Python.md b/published/202004/20190523 Run your blog on GitHub Pages with Python.md similarity index 100% rename from published/20190523 Run your blog on GitHub Pages with Python.md rename to published/202004/20190523 Run your blog on GitHub Pages with Python.md diff --git a/published/20190605 What is GraphQL.md b/published/202004/20190605 What is GraphQL.md similarity index 100% rename from published/20190605 What is GraphQL.md rename to published/202004/20190605 What is GraphQL.md diff --git a/published/20190612 How to write a loop in Bash.md b/published/202004/20190612 How to write a loop in Bash.md similarity index 100% rename from published/20190612 How to write a loop in Bash.md rename to published/202004/20190612 How to write a loop in Bash.md diff --git a/published/20190612 Why use GraphQL.md b/published/202004/20190612 Why use GraphQL.md similarity index 100% rename from published/20190612 Why use GraphQL.md rename to published/202004/20190612 Why use GraphQL.md diff --git a/published/202004/20190712 What is Silverblue.md b/published/202004/20190712 What is Silverblue.md new file mode 100644 index 0000000000..7437135b98 --- /dev/null +++ b/published/202004/20190712 What is Silverblue.md @@ -0,0 +1,98 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12153-1.html) +[#]: subject: (What is Silverblue?) +[#]: via: (https://fedoramagazine.org/what-is-silverblue/) +[#]: author: (Tomáš Popela https://fedoramagazine.org/author/tpopela/) + +Silverblue 是什么? +====== + +![][1] + +Fedora Silverblue 在 Fedora 世界内外越来越受欢迎。因此,根据社区的反馈,以下是关于这个项目的一些有趣问题的答案。如果你有任何其他与 Silverblue 相关的问题,请在评论区留言,我们会在未来的文章中回答。 + +### Silverblue 是什么? + +Silverblue 是新一代桌面操作系统的代号,之前被称为 Atomic Workstation。该操作系统是通过利用 [rpm-ostree 项目][2]创建的映像来交付的。这种系统的主要优点是速度、安全性、原子更新和不变性。 + +### “Silverblue” 到底是什么意思? + +“Team Silverblue” 或简称 “Silverblue”,没有任何隐藏的含义。该项目以前被称为 Atomic Workstation,大约两个月后更名时选中了这个名字。在这个过程中,审查过 150 多个单词或单词组合。最终选择了 “Silverblue”,因为它有一个可用的域名以及社交网络账号。人们可以把它看成是 Fedora 的蓝色品牌的一个新的品牌形象,可以用在诸如“加油,Silverblue 团队!”或“想加入该团队,改进 Silverblue 吗?”这样的短语中。 + +### 何谓 ostree? + +[OSTree(或 libostree)是一个项目][3],它结合了一个类似 Git 的提交和下载可引导文件系统树的模型,以及用于部署它们和管理引导加载程序配置的层。OSTree 由 rpm-ostree 使用,这是 Silverblue 使用的一个基于包/镜像的混合系统。它原子化地复制了一个基础操作系统,并允许用户在需要时在基础操作系统之上“层叠”传统的 RPM。 + +### 为何使用 Silverblue? + +因为它可以让你专注于你的工作,而不是你正在运行的操作系统。因为系统的更新是原子式的,所以它更稳健。你唯一需要做的事情就是重新启动到新的镜像中。此外,如果当前启动的镜像有什么问题,你可以很容易地重启/回滚到之前可以工作的镜像,如果有的话。如果没有,你可以使用 `ostree` 命令下载并启动过去生成的任何其他镜像。 + +另一个好处是可以在不同的分支(或者用旧的语境说就是不同的 Fedora 风味版本)之间轻松切换。你可以轻松地尝试 [Rawhide][4] 或 [updates-testing][5] 分支,然后返回到包含当前稳定版本的分支。另外,如果你想尝试一些新奇的东西,也可以考虑试试 Silverblue。 + +### 不可变的操作系统有什么好处? + +其中一个主要的好处是安全。基础操作系统是以只读的形式挂载的,因此不能被恶意软件修改。唯一可以改变系统的方法是通过 `rpm-ostree` 实用程序。 + +另一个好处是健壮性。普通用户几乎不可能在不小心或无意中删除了一些系统库后,导致操作系统回到不启动或无法正常工作的状态。试着想想你过去的这些经历,就可以明白 Silverblue 可以如何帮助你。 + +### 如何在 Silverblue 中管理应用程序和包? + +对于图形化用户界面的应用程序,建议使用 [Flatpak][6] —— 如果应用程序是以 Flatpak 的形式提供的话。用户可以选择来自 Fedora 的 Flatpak,和从 Fedora 包及 Fedora 自己的基础架构中构建的 Flatpak,或者是目前有更广泛的交付品的 Flathub。用户可以通过已经支持 Fedora Silverblue 的 GNOME “软件”轻松安装它们。 + +用户首先发现的一件事就是操作系统中没有预装 `dnf`。主要原因是它不能在 Silverblue 上工作 —— 它的部分功能被 `rpm-ostree` 命令所取代。用户可以通过使用 `rpm-ostree install PACKAGE` 来层叠传统的软件包。但只有在没有其他方法的情况下,才应该使用这种方式。这是因为从存储库中提取新的系统镜像时,每次更改系统镜像时都必须重新构建系统镜像,以容纳层叠的包或从基础操作系统中删除及替换为其他版本的包。 + +Fedora Silverblue 自带的默认 GUI 应用程序集是基础操作系统的一部分。团队正在努力将它们移植到 Flatpak 上,这样它们就可以通过这种方式分发。其中一个好处是,基础操作系统将变得更小,更容易维护和测试,用户可以更容易修改他们的默认安装环境。如果你想看一下它是怎么做的,或者有什么帮助,可以看看官方的[文档][7]。 + +### 什么是 Toolbox? + +[Toolbox][8] 是一个让普通用户可以轻松使用容器的项目。它通过使用 podman 的无 root 容器环境来实现。Toolbox 可以让你在常规的 Fedora 环境中轻松、快速地创建一个容器,你可以在这个容器上折腾或开发,而与你的操作系统分离。 + +### Silverblue 有路线图吗? + +形式上没有,因为我们正在关注在测试过程中发现的问题和社区的反馈。我们目前正在使用 Fedora 的 [Taiga][9] 来进行规划。 + +### Silverblue 的发布周期是多少? + +它和普通的 Fedora Workstation 是一样的。每 6 个月发布一次新版本,支持期为 13 个月。团队计划每两周(或更长时间)发布一次更新,而不是像现在这样每天发布一次。这样一来,更新可以在发送给其他用户之前,由 QA 和社区志愿者进行更彻底的测试。 + +### 不可变操作系统的未来前景如何? + +从我们的角度来看,桌面的未来会走向到不可变的操作系统。这对用户来说是最安全的,Android、ChromeOS、ChromeOS、最近的 macOS Catalina 全都在底层采用了这种方式。而对于 Linux 桌面来说,一些第三方软件期望写到操作系统的问题还是存在的。HP 打印机驱动程序就是一个很好的例子。 + +另一个问题是系统中的部分软件如何分发和安装。字体就是一个很好的例子。目前在 Fedora 中,它们是以 RPM 包的形式分发的。如果你想使用它们,你必须层叠它们,然后重新启动到新创建的包含它们的镜像中。 + +### 标准版 Workstation 的前景如何? + +Silverblue 有可能会取代普通的 Workstation 版本。但 Silverblue 要提供与 Workstation 版本相同的功能和用户体验还有很长的路要走。在此期间,这两款桌面产品将同时推出。 + +### Atomic Workstation 或 Fedora CoreOS 与这些有什么关系? + +Atomic Workstation 是在更名为 Fedora Silverblue 之前的项目名称。 + +Fedora CoreOS 是一个不同但相似的项目。它与 Silverblue 共享一些基本技术,如 `rpm-ostree`、`toolbox` 等。尽管如此,CoreOS 是一个更简约、专注于容器、自动更新的操作系统。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/what-is-silverblue/ + +作者:[Tomáš Popela][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/tpopela/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2019/07/what-is-fedora-silverblue-816x345.jpg +[2]: https://rpm-ostree.readthedocs.io/en/latest/ +[3]: https://ostree.readthedocs.io/en/latest/ +[4]: https://fedoraproject.org/wiki/Releases/Rawhide +[5]: https://fedoraproject.org/wiki/QA:Updates_Testing +[6]: https://flatpak.org/ +[7]: https://docs.fedoraproject.org/en-US/flatpak/tutorial/ +[8]: https://github.com/debarshiray/toolbox +[9]: https://teams.fedoraproject.org/project/silverblue/ diff --git a/published/20190814 9 open source cloud native projects to consider.md b/published/202004/20190814 9 open source cloud native projects to consider.md similarity index 100% rename from published/20190814 9 open source cloud native projects to consider.md rename to published/202004/20190814 9 open source cloud native projects to consider.md diff --git a/published/20190822 How the Linux desktop has grown.md b/published/202004/20190822 How the Linux desktop has grown.md similarity index 100% rename from published/20190822 How the Linux desktop has grown.md rename to published/202004/20190822 How the Linux desktop has grown.md diff --git a/published/202004/20191014 How to make a Halloween lantern with Inkscape.md b/published/202004/20191014 How to make a Halloween lantern with Inkscape.md new file mode 100644 index 0000000000..1cd31042d1 --- /dev/null +++ b/published/202004/20191014 How to make a Halloween lantern with Inkscape.md @@ -0,0 +1,155 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12152-1.html) +[#]: subject: (How to make a Halloween lantern with Inkscape) +[#]: via: (https://opensource.com/article/19/10/how-make-halloween-lantern-inkscape) +[#]: author: (Jess Weichler https://opensource.com/users/cyanide-cupcake) + +如何使用 Inkscape 制作万圣节灯笼 +====== + +> 使用开源软件为你最喜欢的万圣节鬼屋制作一个有趣和怪异的装饰品。 + +![万圣节 - 背光飞行的蝙蝠][1] + +使用开源软件装饰一个独一无二的万圣节灯笼! + +通常,灯笼的一部分结构体是不透明的,以阻挡内部的光线。灯笼之所以成为灯笼,是因为其去掉了一些东西 :从结构体上切开的窗口,这样光线就可以射出。虽然对于照明来说不实用,但是一个有着怪异形状窗口和隐藏暗色轮廓的灯笼却可以令人兴奋,并创造出很多乐趣。 + +这篇演示如何使用 [Inkscape][2] 创建你自己的灯笼。如果还没有 Inkscape ,在 Linux 上,你可以从软件库中安装它,在 MacOS 和 Windows 上,你可以从[Inkscape 网站][3] 上下载它. + +### 使用材料 + + * 模板([A4][4] 或[信纸][5]大小) + * 卡片纸(黑色是传统色) + * 描图纸(可选) + * 裁纸刀、尺子、切割垫板(可使用工艺切割机/激光切割机代替) + * 工艺胶 + * LED 茶灯"蜡烛" + +安全注意事项:这个项目只使用电池操作的蜡烛。 + +### 理解模板 + +首先,从上面的链接下载你所在区域(A4 或信纸)的合适的模板,然后在 Inkscape 中打开它。 + +![灯笼模板荧光屏][6] + +灰白色的棋盘格背景是透明的(从技术角度来说,它是 alpha 通道。) + +黑色基板构成了灯笼。现在,没有窗口可以让光线穿过;灯笼有一个非镂空的黑色基板。你将在 Inkscape 中使用**并集**和**差集**选项来数字化的设计窗口。 + +蓝色虚线表示折线。橙色实线表示参考线。采光窗口不应该放在橙色盒子的外面。 + +模板的左侧是你可以在你设计中使用的一些预先制作好的对象。 + +### 创建一个窗口或形状 + +1. 创建一个看起来像你想要的窗口样式的对象。可以使用 Inkscape 左侧工具栏中的一些形状工具来创建对象。此外,你可以下载共创或公共领域的剪贴画,并导入 PNG 文件到你的项目中。 +2. 当你对对象的形状满意时,在顶部菜单中选择“路径” -> “对象转化成路径” 将其转换为一个路径(而不是一个形状,Inkscape 视其为两种不同的对象)。 + + ![对象到路径 菜单][7] + +3. 在基板形状的上面放置对象。 +4. 选择对象和黑色基板。通过先单击一个,并按住 `Shift` 按键,再选择另一个来完成。 +5. 从顶部菜单选择“路径” -> “差集” 来从基板的对象中移除形状。这将创建灯笼中的一个窗口。 + + ![路径 > 差集 菜单][8] + +### 添加对象到窗口中 + +在制作了一个窗口后,你可以添加对象到其中来创建一个场景。 + +提示: + +* 所有的对象,包括文本,必须连接到灯笼的基板,否则,在切割后会掉落下来,并留下一片空白。 +* 避免小而复杂的细微之处。即使使用激光切割机或工艺切割机等机器,也很难切割这些细微之处。 + +1. 创建或导入一个对象。 +2. 放置对象到窗口内,以便它至少接触基板的两侧。 +3. 选择对象后,从顶部菜单选择“连接” -> “对象转化成路径”。 + + ![对象到路径 菜单][9] + +4. 选择对象和黑色基板,通过在按住 `Shift` 按键的同时单击每一个来完成。 +5. 选择“路径” -> “并集”来使对象和基板合二为一。 + +### 添加文本 + +文本既可以从基板剪出文字来创建一个窗口(就像我对星星所做的那样),或者也可以添加到一个窗口上(它可以阻挡来自灯笼内部的光线)。如果你要创建一个窗口,只需要执行下面的步骤 1 和步骤 2,然后使用“差集”来从基板移除文本。 + +1. 从左侧边栏中选择文本工具来创建文本。粗体字体效果最好。 + + ![文本工具][10] + +2. 选择你的文本,然后从顶部菜单选择“路径” -> “对象转化成路径”。这将转换文本对象为一个路径。注意,这个步骤意味着你将不能再编辑该文本,所以,*只有当*你确定你拥有想要的单词后,执行这个步骤。 +3. 在你转换文本后,你可以按键盘上的 `F2` 来激活节点编辑器工具,当选择使用这个工具时,可以清楚地显示文本的节点。 + + ![选中的文本使用节点编辑器][11] + +4. 取消文本分组。 +5. 调整每个字母,以便使其与相邻字母或基板稍微重叠。 + + ![重叠文本][12] + +6. 为将所有的字母彼此连接,并连接到基板,重新选择所有文本和基板,然后选择“路径” -> “并集”。 + + ![使用 路径 > 并集 连接字母和基板][13] + +### 准备打印 + +下面是手工切割灯笼的说明。如果使用激光切割机或工艺切割机,遵循硬件所需要的技巧来准备好你的文件。 + +1. 在“图层”面板中,单击“安全”图层旁边的“眼睛”图标来隐藏安全线。如果你看不到图层面板,通过顶部菜单选择“图层” -> “图层”来显示它。 +2. 选择黑色基板。在“填充和笔划”面板中,设置填充为“X”(意味着*不填充*),设置“笔划”为纯黑色(对于喜欢十六进制的粉丝来说是 `#000000ff` )。 + + ![设置填充和笔划][14] + +3. 使用“文件” -> “打印”来打印你的图案。 +4. 使用一把工艺刀和直尺,小心地绕着每一条黑线切割。在蓝色虚线上轻划,然后折叠。 + + ![裁剪灯笼][15] + +5. 要完成窗口的制作,剪切描图纸为每个窗口的大小,然后粘贴它到灯笼的内侧。 + + ![添加描图纸][16] + +6. 在折条处把灯笼的边粘在一起。 +7. 接通电池供电的 LED 蜡烛,并放置它到你灯笼中。 + + ![完成灯笼][17] + +现在你的灯笼已经完成了,准备好点亮你的鬼屋了。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/10/how-make-halloween-lantern-inkscape + +作者:[Jess Weichler][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/cyanide-cupcake +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/halloween_bag_bat_diy.jpg?itok=24M0lX25 (Halloween - backlit bat flying) +[2]: https://opensource.com/article/18/1/inkscape-absolute-beginners +[3]: http://inkscape.org +[4]: https://www.dropbox.com/s/75qzjilg5ak2oj1/papercraft_lantern_A4_template.svg?dl=0 +[5]: https://www.dropbox.com/s/8fswdge49jwx91n/papercraft_lantern_letter_template%20.svg?dl=0 +[6]: https://opensource.com/sites/default/files/uploads/lanterntemplate_screen.png (Lantern template screen) +[7]: https://opensource.com/sites/default/files/uploads/lantern1.png (Object to path menu) +[8]: https://opensource.com/sites/default/files/uploads/lantern2.png (Object > Difference menu) +[9]: https://opensource.com/sites/default/files/uploads/lantern3.png (Object to path menu) +[10]: https://opensource.com/sites/default/files/uploads/lantern4.png (Text tool) +[11]: https://opensource.com/sites/default/files/uploads/lantern5.png (Text selected with Node editor) +[12]: https://opensource.com/sites/default/files/uploads/lantern6.png (Overlapping the text) +[13]: https://opensource.com/sites/default/files/uploads/lantern7.png (Connecting letters and base with Path > Union) +[14]: https://opensource.com/sites/default/files/uploads/lantern8.png (Setting fill and stroke) +[15]: https://opensource.com/sites/default/files/uploads/lantern9.jpg (Cutting out the lantern) +[16]: https://opensource.com/sites/default/files/uploads/lantern10.jpg (Adding tracing paper) +[17]: https://opensource.com/sites/default/files/uploads/lantern11.jpg (Completed lantern) diff --git a/published/20191209 Use the Fluxbox Linux desktop as your window manager.md b/published/202004/20191209 Use the Fluxbox Linux desktop as your window manager.md similarity index 100% rename from published/20191209 Use the Fluxbox Linux desktop as your window manager.md rename to published/202004/20191209 Use the Fluxbox Linux desktop as your window manager.md diff --git a/published/20191216 Relive Linux history with the ROX desktop.md b/published/202004/20191216 Relive Linux history with the ROX desktop.md similarity index 100% rename from published/20191216 Relive Linux history with the ROX desktop.md rename to published/202004/20191216 Relive Linux history with the ROX desktop.md diff --git a/published/202004/20191220 The Difference Between DNF and YUM, Why is Yum Replaced by DNF.md b/published/202004/20191220 The Difference Between DNF and YUM, Why is Yum Replaced by DNF.md new file mode 100644 index 0000000000..8521ab4291 --- /dev/null +++ b/published/202004/20191220 The Difference Between DNF and YUM, Why is Yum Replaced by DNF.md @@ -0,0 +1,68 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12161-1.html) +[#]: subject: (The Difference Between DNF and YUM, Why is Yum Replaced by DNF?) +[#]: via: (https://www.2daygeek.com/comparison-difference-between-dnf-vs-yum/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +DNF 和 Yum 的区别,为什么 Yum 会被 DNF 取代? +====== + +由于 Yum 中许多长期存在的问题仍未得到解决,因此 [Yum 包管理器][1]已被 [DNF 包管理器][2]取代。这些问题包括性能差、内存占用过多、依赖解析速度变慢等。 + +DNF 使用 `libsolv` 进行依赖解析,由 SUSE 开发和维护,旨在提高性能。 + +Yum 主要是用 Python 编写的,它有自己的应对依赖解析的方法。它的 API 没有完整的文档,它的扩展系统只允许 Python 插件。 + +Yum 是 RPM 的前端工具,它管理依赖关系和资源库,然后使用 RPM 来安装、下载和删除包。 + +为什么他们要建立一个新的工具,而不是修复现有的问题呢? + +Ales Kozamblak 解释说,这个修复在技术上是不可行的,而且 Yum 团队还没有准备好立即接受修改。 + +另外,最大的挑战是,Yum 有 56000 行代码,但 DNF 只有 29000 行代码。 + +所以除了分叉,没有办法解决。 + +不过 Yum 的运行情况还算可以。 + + +编号 | DNF(Dandified YUM) | YUM(Yellowdog Updater, Modified) +---|---|--- +1 | DNF 使用 libsolv 来解析依赖关系,由 SUSE 开发和维护 | YUM 使用公开的 API 来解析依赖关系 +2 | API 有完整的文档 | API 没有完整的文档 +3 | 由 C、C++、Python 编写的 | 只用 Python 编写 +4 | DNF 目前在 Fedora、RHEL 8、CentOS 8、OEL 8 和 Mageia 6/7 中使用 | YUM 目前在 RHEL 6/7、CentOS 6/7、OEL 6/7 中使用 +5 | DNF 支持各种扩展 | Yum 只支持基于 Python 的扩展 +6 | API 有良好的文档,因此很容易创建新的功能 | 因为 API 没有正确的文档化,所以创建新功能非常困难 +7 | DNF 在同步存储库的元数据时,使用的内存较少 | 在同步存储库的元数据时,YUM 使用了过多的内存 +8 | DNF 使用满足性算法来解决依赖关系解析(它是用字典的方法来存储和检索包和依赖信息)| 由于使用公开 API 的原因,Yum 依赖性解析变得迟钝 +9 | 从内存使用量和版本库元数据的依赖性解析来看,性能都不错 | 总的来说,在很多因素的影响下,表现不佳 +10 | DNF 更新:在 DNF 更新过程中,如果包中包含不相关的依赖,则不会更新 | YUM 将在没有验证的情况下更新软件包 +11 | 如果启用的存储库没有响应,DNF 将跳过它,并继续使用可用的存储库处理事务 | 如果有存储库不可用,YUM 会立即停止 +12 | `dnf update` 和 `dnf upgrade` 是等价的 | 在 Yum 中则不同 +13 | 安装包的依赖关系不更新 | Yum 为这种行为提供了一个选项 +14 | 清理删除的包:当删除一个包时,DNF 会自动删除任何没有被用户明确安装的依赖包 | Yum 不会这样做 +15 | 存储库缓存更新计划:默认情况下,系统启动后 10 分钟后,DNF 每小时会对配置的存储库检查一次更新。这个动作由系统定时器单元 `dnf-makecache.timer` 控制 | Yum 也会这样做 +16 | 内核包不受 DNF 保护。不像 Yum,你可以删除所有的内核包,包括运行中的内核包 | Yum 不允许你删除运行中的内核 +17 | libsolv:用于解包和读取资源库。hawkey: 为 libsolv 提供简化的 C 和 Python API 库。librepo: 提供 C 和 Python(类似 libcURL)API 的库,用于下载 Linux 存储库元数据和软件包。libcomps: 是 yum.comps 库的替代品。它是用纯 C 语言编写的库,有 Python 2 和 Python 3 的绑定。| Yum 不使用单独的库来执行这些功能 +18 | DNF 包含 29000 行代码 | Yum 包含 56000 行代码 +19 | DNF 由 Ales Kozumplik 开发 | YUM 由 Zdenek Pavlas、Jan Silhan 和团队成员开发 + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/comparison-difference-between-dnf-vs-yum/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/ +[2]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ diff --git a/published/20191224 Why your Python code should be flat and sparse.md b/published/202004/20191224 Why your Python code should be flat and sparse.md similarity index 100% rename from published/20191224 Why your Python code should be flat and sparse.md rename to published/202004/20191224 Why your Python code should be flat and sparse.md diff --git a/published/20200211 Navigating man pages in Linux.md b/published/202004/20200211 Navigating man pages in Linux.md similarity index 100% rename from published/20200211 Navigating man pages in Linux.md rename to published/202004/20200211 Navigating man pages in Linux.md diff --git a/published/202004/20200213 Manage complex Git workspaces with Great Teeming Workspaces.md b/published/202004/20200213 Manage complex Git workspaces with Great Teeming Workspaces.md new file mode 100644 index 0000000000..9ae4ee5618 --- /dev/null +++ b/published/202004/20200213 Manage complex Git workspaces with Great Teeming Workspaces.md @@ -0,0 +1,173 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12156-1.html) +[#]: subject: (Manage complex Git workspaces with Great Teeming Workspaces) +[#]: via: (https://opensource.com/article/20/2/git-great-teeming-workspaces) +[#]: author: (Daniel Gryniewicz https://opensource.com/users/dang) + +使用 GTWS 管理复杂的 Git 工作空间 +====== + +> GTWS 是一系列脚本,它使我们在开发环境中管理不同的项目和项目的各个版本变得很容易。 + +![](https://img.linux.net.cn/data/attachment/album/202004/27/182149xh9s7kb5bkf5875b.jpg) + +[Great Teeming Workspaces][2](GTWS)是一个 Git 的复杂工作空间管理工具包,它使我们在开发环境中管理不同的项目和项目的各个版本变得很容易。 + +有点像 Python 的 [venv][3],但不是为 Python 语言准备的。GTWS 用来管理多个项目的多个版本的工作空间。你可以很容易地创建、更新、进入和离开工作空间,每个项目或版本的组合(最多)有一个本地的 origin,用来与 upstream 同步 — 其余的所有工作空间都从本地的 origin 更新。 + +### 部署 + +``` +${GTWS_ORIGIN}//[/] +${GTWS_BASE_SRCDIR}////{[,...]} +``` + +源代码目录的每一级(包括全局的家目录)可以包含一个 `.gtwsrc` 文件,这个文件中维护与当前级相关的设置和 bash 代码。每一级的配置会覆盖上一级。 + +### 安装 + +用下面的命令检出 GTWS: + +``` +git clone https://github.com/dang/gtws.git +``` + +配置你的 `${HOME}/.gtwsrc`。它应该包含 `GTWS_ORIGIN`,也可以再包含 `GTWS_SETPROMPT`。 + +把仓库目录加到环境变量中: + +``` +export PATH="${PATH}:/path/to/gtws +``` + +### 配置 + +通过级联 `.gtwsrc` 文件来进行配置。它从根目录向下遍历,会执行在每级目录中找到的 `.gtwsrc` 文件。下级目录的文件会覆盖上一级。 + +在你最上层的文件 `~/.gtws/.gtwsrc` 中进行如下设置: + + * `GTWS_BASE_SRCDIR`:所有项目源文件目录树的基目录。默认为 `$HOME/src`。 + * `GTWS_ORIGIN`: 指定 origin git 目录树的路径。默认为 `$HOME/origin`。 + * `GTWS_SETPROMPT`: 可选配置。如果配置了这个参数,shell 提示符会有工作空间的名字。 + * `GTWS_DEFAULT_PROJECT`: 不指定项目或项目未知时默认的项目名。如果不指定,使用命令行时必须指明项目。 + * `GTWS_DEFAULT_PROJECT_VERSION`: 检出的默认版本。默认为 `master`。 + +在每个项目的根目录进行以下设置: + + * `GTWS_PROJECT`: 项目的名字(和基目录)。 + * `gtws_project_clone`: 这个函数用于克隆一个项目的指定版本。如果未定义,它会假定项目的 origin 对每一个版本都有一个单独的目录,这样会导致克隆一堆 Git 仓库。 + * `gtws_project_setup`: 在克隆完所有的仓库后,可以选择是否调用这个函数,调用后可以对项目进行必要的配置,如在 IDE 中配置工作空间。 + +在项目版本级进行以下设置: + + * `GTWS_PROJECT_VERSION:` 项目的版本。用于正确地从 origin 拉取代码。类似 Git 中的分支名字。 + +下面这些参数可以在目录树的任意地方进行配置,如果能生效,它们可以被重写多次: + + * `GTWS_PATH_EXTRA`: 这些是工作空间中加到路径后的额外的路径元素。 + * `GTWS_FILES_EXTRA`: 这些是不在版本控制内,但应该在工作空间中被检出的额外的文件。这些文件包括 `.git/info/exclude`,每个文件都与仓库的基目录相关联。 + +### origin 目录 + +`GTWS_ORIGIN` (大部分脚本中)指向拉取和推送的原始 Git 检出目录。 + +`${GTWS_ORIGIN}` 部署: + + * `/` + * 这是一个项目的仓库的基目录。 + * 如果指定了 `gtws_project_clone`,你可以配置任意的部署路径。 + * 如果没有指定 `gtws_project_clone`,这个路径下必须有个名为 `git` 的子目录,且 `git` 目录下有一系列用来克隆的裸 Git 仓库。 + +### 工作流示例 + +假设你有一个项目名为 `Foo`,它的 upstream 为 `github.com/foo/foo.git`。这个仓库有个名为 `bar` 的子模块,它的 upstream 是 `github.com/bar/bar.git`。Foo 项目在 master 分支开发,使用稳定版本的分支。 + +为了能在 Foo 中使用 GTWS,你首先要配置目录结构。本例中假设你使用默认的目录结构。 + + * 配置你最上层的 `.gtwsrc`: + * `cp ${GTWS_LOC}/examples/gtwsrc.top ~/.gtwsrc` + * 根据需要修改 `~/.gtwsrc`。 + * 创建顶级目录: + * `mkdir -p ~/origin ~/src` + * 创建并配置项目目录: + * `mkdir -p ~/src/foo` + + `cp ${GTWS_LOC}/examples/gtwsrc.project ~/src/foo/.gtwsrc` + * 根据需要修改 `~/src/foo/.gtwsrc`。 + * 创建并配置 master 版本目录: + * `mkdir -p ~/src/foo/master` + + `cp ${GTWS_LOC}/examples/gtwsrc.version ~/src/foo/master/.gtwsrc` + * 根据需要修改 `~/src/foo/master/.gtwsrc`。 + * 进入版本目录并创建一个临时工作空间来配置镜像: + * `mkdir -p ~/src/foo/master/tmp` + + `cd ~/src/foo/master/tmp` + + `git clone --recurse-submodules git://github.com/foo/foo.git` + + `cd foo` + + `gtws-mirror -o ~/origin -p foo`(译注:这个地方原文有误,不加 `-s` 参数会报错) + * 上面命令会创建 `~/origin/foo/git/foo.git` 和 `~/origin/foo/submodule/bar.git`。 + * 以后的克隆操作会从这些 origin 而不是 upstream 克隆。 + * 现在可以删除工作空间了。 + +到现在为止,Foo 的 master 分支的工作可以结束了。假设你现在想修复一个 bug,名为 `bug1234`。你可以脱离你当前的工作空间为修复这个 bug 单独创建一个工作空间,之后在新创建的工作空间中开发。 + + * 进入版本目录,创建一个新的工作空间: + * `cd ~/src/foo/master` + + `mkws bug1234` + * 上面的命令创建了 `bug1234/`,在这个目录下检出了 Foo(和它的子模块 `bar`),并创建了 `build/foo` 来构建它。 + * 有两种方式进入工作空间: + * `cd ~/src/foo/master/bug1234` + + `startws` + + 或者 + + `cd ~/src/foo/master/` + + `startws bug1234` + * 上面的命令在 `bug1234` 工作空间中开启了一个子 shell。这个 shell 有 GTWS 的环境和你在各级 `.gtwsrc` 文件中设置的环境。它也把你工作空间的基目录加入到了 CD,因此你可以从 base 路径 `cd` 到相关的目录中。 + * 现在你可以修复 `bug1234` 了,构建、测试、提交你的修改。当你可以把代码推送到 upstream 时,执行下面的命令: + + `cd foo` + + `wspush`  + * `wspush` 会把代码推送到与你工作空间相关的分支 — 先推送到本地的 origin,再推送到 upstream。 + * 当 upstream 有修改时,你可以用下面的命令同步到本地: + + `git sync` + * 上面的命令调用了 GTWS 的 `git-sync` 脚本,会从本地 origin 更新代码。使用下面的命令来更新本地的 origin: + + `git sync -o`  + * 上面的命令会更新你本地的 origin 和子模块的镜像,然后用那些命令来更新你的检出仓库的代码。`git-sync` 也有一些其他的很好的工鞥。 + * 当要结束工作空间中的工作时,直接退出 shell: + + `exit` + * 你可以在任何时间重复进入工作空间,也可以在同一时间在相同的工作空间中开多个 shell。 + * 当你不需要某个工作空间时,你可以使用 `rmws` 来删除它,或者直接删除它的目录树。 + * 还有一个脚本 `tmws` 使用 tmux 进入工作空间,能创建一系列的窗口/窗格,这完美契合我的工作流。你可以根据你自己的需求来修改它。 + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/git-great-teeming-workspaces + +作者:[Daniel Gryniewicz][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dang +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://github.com/dang/gtws +[3]: https://docs.python.org/3/library/venv.html diff --git a/published/20200228 Getting started with Linux firewalls.md b/published/202004/20200228 Getting started with Linux firewalls.md similarity index 100% rename from published/20200228 Getting started with Linux firewalls.md rename to published/202004/20200228 Getting started with Linux firewalls.md diff --git a/published/20200309 Fish - A Friendly Interactive Shell.md b/published/202004/20200309 Fish - A Friendly Interactive Shell.md similarity index 100% rename from published/20200309 Fish - A Friendly Interactive Shell.md rename to published/202004/20200309 Fish - A Friendly Interactive Shell.md diff --git a/published/20200311 Directing Kubernetes traffic with Traefik.md b/published/202004/20200311 Directing Kubernetes traffic with Traefik.md similarity index 100% rename from published/20200311 Directing Kubernetes traffic with Traefik.md rename to published/202004/20200311 Directing Kubernetes traffic with Traefik.md diff --git a/published/20200311 What you need to know about variables in Emacs.md b/published/202004/20200311 What you need to know about variables in Emacs.md similarity index 100% rename from published/20200311 What you need to know about variables in Emacs.md rename to published/202004/20200311 What you need to know about variables in Emacs.md diff --git a/published/20200312 Make SSL certs easy with k3s.md b/published/202004/20200312 Make SSL certs easy with k3s.md similarity index 100% rename from published/20200312 Make SSL certs easy with k3s.md rename to published/202004/20200312 Make SSL certs easy with k3s.md diff --git a/published/20200313 What is the internet backbone and how it works.md b/published/202004/20200313 What is the internet backbone and how it works.md similarity index 100% rename from published/20200313 What is the internet backbone and how it works.md rename to published/202004/20200313 What is the internet backbone and how it works.md diff --git a/published/20200320 Build a private social network with a Raspberry Pi.md b/published/202004/20200320 Build a private social network with a Raspberry Pi.md similarity index 100% rename from published/20200320 Build a private social network with a Raspberry Pi.md rename to published/202004/20200320 Build a private social network with a Raspberry Pi.md diff --git a/published/20200320 Control the firewall at the command line.md b/published/202004/20200320 Control the firewall at the command line.md similarity index 100% rename from published/20200320 Control the firewall at the command line.md rename to published/202004/20200320 Control the firewall at the command line.md diff --git a/published/20200320 How to Check Password Expiration Date for All Users on Linux.md b/published/202004/20200320 How to Check Password Expiration Date for All Users on Linux.md similarity index 100% rename from published/20200320 How to Check Password Expiration Date for All Users on Linux.md rename to published/202004/20200320 How to Check Password Expiration Date for All Users on Linux.md diff --git a/published/20200323 Don-t love diff- Use Meld instead.md b/published/202004/20200323 Don-t love diff- Use Meld instead.md similarity index 100% rename from published/20200323 Don-t love diff- Use Meld instead.md rename to published/202004/20200323 Don-t love diff- Use Meld instead.md diff --git a/published/20200325 Linux firewall basics with ufw.md b/published/202004/20200325 Linux firewall basics with ufw.md similarity index 100% rename from published/20200325 Linux firewall basics with ufw.md rename to published/202004/20200325 Linux firewall basics with ufw.md diff --git a/published/20200326 3 open source tools for sticking to a budget.md b/published/202004/20200326 3 open source tools for sticking to a budget.md similarity index 100% rename from published/20200326 3 open source tools for sticking to a budget.md rename to published/202004/20200326 3 open source tools for sticking to a budget.md diff --git a/published/20200327 Build a private chat server with a Raspberry Pi and Rocket.Chat.md b/published/202004/20200327 Build a private chat server with a Raspberry Pi and Rocket.Chat.md similarity index 100% rename from published/20200327 Build a private chat server with a Raspberry Pi and Rocket.Chat.md rename to published/202004/20200327 Build a private chat server with a Raspberry Pi and Rocket.Chat.md diff --git a/published/20200329 How to install Microsoft TrueType Fonts on Ubuntu-based Distributions.md b/published/202004/20200329 How to install Microsoft TrueType Fonts on Ubuntu-based Distributions.md similarity index 100% rename from published/20200329 How to install Microsoft TrueType Fonts on Ubuntu-based Distributions.md rename to published/202004/20200329 How to install Microsoft TrueType Fonts on Ubuntu-based Distributions.md diff --git a/published/20200329 Oracle Announces Java 14- How to Install it on Ubuntu Linux.md b/published/202004/20200329 Oracle Announces Java 14- How to Install it on Ubuntu Linux.md similarity index 100% rename from published/20200329 Oracle Announces Java 14- How to Install it on Ubuntu Linux.md rename to published/202004/20200329 Oracle Announces Java 14- How to Install it on Ubuntu Linux.md diff --git a/published/20200329 The Keyring Concept in Ubuntu- What is It and How to Use it.md b/published/202004/20200329 The Keyring Concept in Ubuntu- What is It and How to Use it.md similarity index 100% rename from published/20200329 The Keyring Concept in Ubuntu- What is It and How to Use it.md rename to published/202004/20200329 The Keyring Concept in Ubuntu- What is It and How to Use it.md diff --git a/published/20200329 Turn Your Regular TV into a Smart TV With KDE Plasma Bigscreen.md b/published/202004/20200329 Turn Your Regular TV into a Smart TV With KDE Plasma Bigscreen.md similarity index 100% rename from published/20200329 Turn Your Regular TV into a Smart TV With KDE Plasma Bigscreen.md rename to published/202004/20200329 Turn Your Regular TV into a Smart TV With KDE Plasma Bigscreen.md diff --git a/published/20200330 Using data from spreadsheets in Fedora with Python.md b/published/202004/20200330 Using data from spreadsheets in Fedora with Python.md similarity index 100% rename from published/20200330 Using data from spreadsheets in Fedora with Python.md rename to published/202004/20200330 Using data from spreadsheets in Fedora with Python.md diff --git a/published/20200331 5 ways to level up your Vim skills.md b/published/202004/20200331 5 ways to level up your Vim skills.md similarity index 100% rename from published/20200331 5 ways to level up your Vim skills.md rename to published/202004/20200331 5 ways to level up your Vim skills.md diff --git a/published/20200401 How to Find Which Graphics Card do You Have in Linux.md b/published/202004/20200401 How to Find Which Graphics Card do You Have in Linux.md similarity index 100% rename from published/20200401 How to Find Which Graphics Card do You Have in Linux.md rename to published/202004/20200401 How to Find Which Graphics Card do You Have in Linux.md diff --git a/published/20200401 IEEE Standards Association Launches an Open Source Collaboration Platform.md b/published/202004/20200401 IEEE Standards Association Launches an Open Source Collaboration Platform.md similarity index 100% rename from published/20200401 IEEE Standards Association Launches an Open Source Collaboration Platform.md rename to published/202004/20200401 IEEE Standards Association Launches an Open Source Collaboration Platform.md diff --git a/published/20200402 How to Upgrade to Ubuntu 20.04 Beta from 18.04 - 19.10.md b/published/202004/20200402 How to Upgrade to Ubuntu 20.04 Beta from 18.04 - 19.10.md similarity index 100% rename from published/20200402 How to Upgrade to Ubuntu 20.04 Beta from 18.04 - 19.10.md rename to published/202004/20200402 How to Upgrade to Ubuntu 20.04 Beta from 18.04 - 19.10.md diff --git a/published/20200403 Scheduling tasks on Linux using the at command.md b/published/202004/20200403 Scheduling tasks on Linux using the at command.md similarity index 100% rename from published/20200403 Scheduling tasks on Linux using the at command.md rename to published/202004/20200403 Scheduling tasks on Linux using the at command.md diff --git a/published/20200403 Take back your dotfiles with Chezmoi.md b/published/202004/20200403 Take back your dotfiles with Chezmoi.md similarity index 100% rename from published/20200403 Take back your dotfiles with Chezmoi.md rename to published/202004/20200403 Take back your dotfiles with Chezmoi.md diff --git a/published/202004/20200404 Bodhi Linux 5.1 Review- Slightly Different Lightweight Linux.md b/published/202004/20200404 Bodhi Linux 5.1 Review- Slightly Different Lightweight Linux.md new file mode 100644 index 0000000000..f4380adb2a --- /dev/null +++ b/published/202004/20200404 Bodhi Linux 5.1 Review- Slightly Different Lightweight Linux.md @@ -0,0 +1,121 @@ +[#]: collector: (lujun9972) +[#]: translator: (qfzy1233) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12155-1.html) +[#]: subject: (Bodhi Linux 5.1 Review: Slightly Different Lightweight Linux) +[#]: via: (https://itsfoss.com/bodhi-linux-review/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +Bodhi Linux 5.1 一览: 略有不同的轻量化 Linux +====== + +Bodhi Linux 是一个基于 Ubuntu 的[轻量级 Linux 发行版][1]。与其他大多数发行版不同,Bodhi 使用自己的 Moksha 桌面,并专注于为你提供一个可以在旧计算机上运行的最简设置。 + +### 什么是 Bodhi Linux? + +![](https://img.linux.net.cn/data/attachment/album/202004/27/093318yawppv07zqpva4j6.png) + +[Bodhi Linux][3] 最早于 2011 年推出。它以“[简约、高效和用户自定义][4]”为设计理念。开发人员旨在提供一个“[实用但不臃肿的系统][5]”。因此,它使用轻量级的 Moksha 桌面,只预装了基本的应用程序。这一做法是为了给用户一个稳定的平台来构建他们想要的系统。它基于最新版的 Ubuntu 长期支持版本。 + +### Moksha 桌面 + +![Bodhi Desktop][6] + +起初 Bodhi 是装载着 [Enlightenment 桌面环境][7]的。Bodhi Linux 一直被认为是“Enlightenment 系的” Linux 发行版。事实上,“Bodhi”(菩提)这个词是基于梵文的“开悟 enlightenment”。 + +然而,当 Enlightenment 18 版本发布以后,这一切都改变了。该版本是如此的糟糕,以至于它并没有集成到 Bodhi 中。Enlightenment 19 发布后修复了一些问题,但仍然存在一些不足。 + +在尝试与 Enlightenment 开发团队合作却毫无进展之后,Bodhi 开发者在 2015 年[复刻][8]了 Enlightenment 17。新的桌面环境被命名为 [Moksha][9],它是基于梵文单词“解脱、解放或释放”。你可以在 [GitHub][10] 上找到它的代码。 + +### 5.1.0 有什么新特性? + +- [Bodhi Linux 5.1 Trailer](https://youtu.be/e8wcRL9F3p8) + +[Bodhi 5.1.0][12] 是这两年内发布的第一个版本,也是基于 Ubuntu 18.04 的第二个版本。除了更新包,它还有新的默认图标和主题。该版本对默认应用程序做了几处更改。预装版 Leafpad 取代了 epad 并且 [GNOME Web][13](也被称为 Epiphany)代替了 [Midori][14]。删除了 eepDater 系统更新器。 + +目前有[四个不同的版本][15]的 Bodhi5.1.0 可以[下载][16]: 标准版Standard硬件支持版Hwe兼容版Legacy软件包版AppPack。 + +* 标准适用于过去十年内电脑配置。它不推送内核更新。 +* 硬件支持版是 Bodhi 家族的新成员,其设计用来包括对更新的硬件的支持,并会接收到内核更新。5.1 版本的使用的是 5.3.0-42 内核。 +* 兼容版是仅有的 32 位版本。它使用“较旧的 4.9.0-6-686 Linux 内核,该内核针对旧的(15 年以上)硬件进行了优化。这个内核也不包括许多老系统不支持的 PAE 扩展。” +* 软件包版是为那些想要一个开箱即用的全载系统的人准备的,并预装了许多应用程序。 + +### Bodhi Linux 的系统要求 + +最低系统要求: + + * 500 MHz 处理器 + * 256 MB 内存 + * 5 GB 的硬盘存储空间 + +推荐系统要求: + + * 1.0 GHz 处理器 + * 512 MB 内存 + * 10 GB 的硬盘存储空间 + +### 体验 Bodhi Linux + +![Old Bodhi Linux][17] + +由于它是基于 Ubuntu 的,所以安装 Bodhi 非常简单。当我登录到 Bodhi 后,新的主题和图标集让我大吃一惊。上次我安装 Bodhi(包括几个月前的 5.0)时,我认为它需要换一个新的外观。之前的主题并没有什么问题,但看起来像是二十一世纪初的东西。新的主题使它看起来更具现代感。 + +![Bodhi Linux 5.1][18] + +我也很高兴看到 Midori 浏览器被 GNOME Web 所取代。我不是 [Midori 浏览器][19]的粉丝。对我来说,它总是显得功能太少了。(不过,随着 [Midori Next][20] 的推出,这种情况可能会改变。)GNOME Web 更像是我需要的网页浏览器。最重要的是它带有 Firefox Sync,这样我就可以同步我所有的书签和密码了。 + +与许多 Linux 发行版不同,Bodhi 并没有一个独立的软件中心。相反,如果你点击 AppCenter 图标,它会打开浏览器,并导航到 Bodhi 网站的软件中心页面 [AppCenter 页面][21]。这里的应用程序是按类别排序的,它们中的大多数是[轻量级应用程序][22]。 + +![Bodhi Linux Appcenter][23] + +如果你点击其中一个页面并点击“安装”,(在你输入密码之后)Bodhi 就会安装它。这是通过一个名为 [apturl][24] 的小程序实现的,它是“是一个非常简单的从网页浏览器安装软件包的方法”。它非常灵巧,我希望更多基于 Ubuntu 的发行版使用它。 + +总的来说,我喜欢 Moksha 桌面。它坚持我们几十年来看到的桌面风格(这是我最喜欢的)。它不会影响你,却很容易改变和定制。我唯一怀念的是,当我按下超级键时,应用程序菜单不打开。但我猜你不可能拥有生活中的一切。 + +### 结语 + +我对最近发布的 Bodhi Linux 感到十分惊喜。过去,我经常折腾它。并且我一直很喜欢它,但最近的这个版本是迄今为止最好的。在某种程度上,他们打破了 Bodhi 只适合老系统的想法,加入了对较新内核的支持。 + +如果你想换换个环境,同时又想在 Ubuntu 的世界里寻找新的风景,那就试试[Bodhi Linux][3]吧。 + +你用过 Bodhi Linux 吗?你最喜欢的基于 Ubuntu 的发行版是什么?请在下面的评论中告诉我们。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/bodhi-linux-review/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[qfzy1233](https://github.com/qfzy1233) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/lightweight-linux-beginners/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/bodhi-start-page.png?resize=800%2C500&ssl=1 +[3]: https://www.bodhilinux.com/ +[4]: https://www.bodhilinux.com/w/wiki/ +[5]: https://www.bodhilinux.com/w/what-is-bodhi-linux/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/bodhi-desktop.jpg?resize=800%2C500&ssl=1 +[7]: https://www.enlightenment.org/start +[8]: https://www.bodhilinux.com/2015/04/28/introducing-the-moksha-desktop/ +[9]: https://www.bodhilinux.com/moksha-desktop/ +[10]: https://github.com/JeffHoogland/moksha +[11]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 +[12]: https://www.bodhilinux.com/2020/03/25/bodhi-linux-5-1-0-released/ +[13]: https://wiki.gnome.org/Apps/Web/ +[14]: https://en.wikipedia.org/wiki/Midori_(web_browser +[15]: https://www.bodhilinux.com/w/selecting-the-correct-iso-image/ +[16]: https://www.bodhilinux.com/download/ +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/bodhi.png?resize=800%2C400&ssl=1 +[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/bodhi-Linux-5-1-screenshot.jpg?ssl=1 +[19]: https://itsfoss.com/midori-browser/ +[20]: https://www.midori-browser.org/2020/01/15/midori-next-come-on-yarovi-we-can/ +[21]: https://www.bodhilinux.com/a/ +[22]: https://itsfoss.com/lightweight-alternative-applications-ubuntu/ +[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/Bodhi-Linux-AppCenter.png?resize=800%2C500&ssl=1 +[24]: https://wiki.ubuntu.com/AptUrl +[25]: https://reddit.com/r/linuxusersgroup diff --git a/published/20200404 What is Arch User Repository (AUR)- How to Use AUR on Arch and Manjaro Linux.md b/published/202004/20200404 What is Arch User Repository (AUR)- How to Use AUR on Arch and Manjaro Linux.md similarity index 100% rename from published/20200404 What is Arch User Repository (AUR)- How to Use AUR on Arch and Manjaro Linux.md rename to published/202004/20200404 What is Arch User Repository (AUR)- How to Use AUR on Arch and Manjaro Linux.md diff --git a/published/20200407 15 years of Git- How to get started or learn something new.md b/published/202004/20200407 15 years of Git- How to get started or learn something new.md similarity index 100% rename from published/20200407 15 years of Git- How to get started or learn something new.md rename to published/202004/20200407 15 years of Git- How to get started or learn something new.md diff --git a/published/20200407 Bitwarden- A Free - Open Source Password Manager.md b/published/202004/20200407 Bitwarden- A Free - Open Source Password Manager.md similarity index 100% rename from published/20200407 Bitwarden- A Free - Open Source Password Manager.md rename to published/202004/20200407 Bitwarden- A Free - Open Source Password Manager.md diff --git a/published/20200407 New Linux Distribution UbuntuDDE Brings The Beautiful Deepin Desktop to Ubuntu.md b/published/202004/20200407 New Linux Distribution UbuntuDDE Brings The Beautiful Deepin Desktop to Ubuntu.md similarity index 100% rename from published/20200407 New Linux Distribution UbuntuDDE Brings The Beautiful Deepin Desktop to Ubuntu.md rename to published/202004/20200407 New Linux Distribution UbuntuDDE Brings The Beautiful Deepin Desktop to Ubuntu.md diff --git a/published/20200408 Create web tutorials with Reveal.js and Git.md b/published/202004/20200408 Create web tutorials with Reveal.js and Git.md similarity index 100% rename from published/20200408 Create web tutorials with Reveal.js and Git.md rename to published/202004/20200408 Create web tutorials with Reveal.js and Git.md diff --git a/published/20200408 How to Create Templates in LibreOffice to Save Time and Increase Productivity.md b/published/202004/20200408 How to Create Templates in LibreOffice to Save Time and Increase Productivity.md similarity index 100% rename from published/20200408 How to Create Templates in LibreOffice to Save Time and Increase Productivity.md rename to published/202004/20200408 How to Create Templates in LibreOffice to Save Time and Increase Productivity.md diff --git a/published/20200409 Here-s How to Find Out Which Desktop Environment You are Using.md b/published/202004/20200409 Here-s How to Find Out Which Desktop Environment You are Using.md similarity index 100% rename from published/20200409 Here-s How to Find Out Which Desktop Environment You are Using.md rename to published/202004/20200409 Here-s How to Find Out Which Desktop Environment You are Using.md diff --git a/published/20200410 How I-m using AI to translate -wash your hands- in 500 languages.md b/published/202004/20200410 How I-m using AI to translate -wash your hands- in 500 languages.md similarity index 100% rename from published/20200410 How I-m using AI to translate -wash your hands- in 500 languages.md rename to published/202004/20200410 How I-m using AI to translate -wash your hands- in 500 languages.md diff --git a/published/20200410 How to Go Full Dark Mode in Ubuntu 20.04.md b/published/202004/20200410 How to Go Full Dark Mode in Ubuntu 20.04.md similarity index 100% rename from published/20200410 How to Go Full Dark Mode in Ubuntu 20.04.md rename to published/202004/20200410 How to Go Full Dark Mode in Ubuntu 20.04.md diff --git a/published/20200413 A handy utility for creating Raspberry Pi SD card images.md b/published/202004/20200413 A handy utility for creating Raspberry Pi SD card images.md similarity index 100% rename from published/20200413 A handy utility for creating Raspberry Pi SD card images.md rename to published/202004/20200413 A handy utility for creating Raspberry Pi SD card images.md diff --git a/published/20200413 How to Add Multiple Time Zones in Ubuntu.md b/published/202004/20200413 How to Add Multiple Time Zones in Ubuntu.md similarity index 100% rename from published/20200413 How to Add Multiple Time Zones in Ubuntu.md rename to published/202004/20200413 How to Add Multiple Time Zones in Ubuntu.md diff --git a/published/20200413 How to install Python on Linux.md b/published/202004/20200413 How to install Python on Linux.md similarity index 100% rename from published/20200413 How to install Python on Linux.md rename to published/202004/20200413 How to install Python on Linux.md diff --git a/published/20200415 How to Open Files and Folders as Administrator in Nautilus File Manager in Linux.md b/published/202004/20200415 How to Open Files and Folders as Administrator in Nautilus File Manager in Linux.md similarity index 100% rename from published/20200415 How to Open Files and Folders as Administrator in Nautilus File Manager in Linux.md rename to published/202004/20200415 How to Open Files and Folders as Administrator in Nautilus File Manager in Linux.md diff --git a/published/20200416 How to package Python applications for Linux.md b/published/202004/20200416 How to package Python applications for Linux.md similarity index 100% rename from published/20200416 How to package Python applications for Linux.md rename to published/202004/20200416 How to package Python applications for Linux.md diff --git a/published/20200417 12 Linux Commands to Have Some Fun in the Terminal.md b/published/202004/20200417 12 Linux Commands to Have Some Fun in the Terminal.md similarity index 100% rename from published/20200417 12 Linux Commands to Have Some Fun in the Terminal.md rename to published/202004/20200417 12 Linux Commands to Have Some Fun in the Terminal.md diff --git a/published/20200418 Ethernet consortium announces completion of 800GbE spec.md b/published/202004/20200418 Ethernet consortium announces completion of 800GbE spec.md similarity index 100% rename from published/20200418 Ethernet consortium announces completion of 800GbE spec.md rename to published/202004/20200418 Ethernet consortium announces completion of 800GbE spec.md diff --git a/published/202004/20200421 MystiQ- A Free and Open Source Audio-Video Converter.md b/published/202004/20200421 MystiQ- A Free and Open Source Audio-Video Converter.md new file mode 100644 index 0000000000..c4c99dac95 --- /dev/null +++ b/published/202004/20200421 MystiQ- A Free and Open Source Audio-Video Converter.md @@ -0,0 +1,88 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12160-1.html) +[#]: subject: (MystiQ: A Free and Open Source Audio/Video Converter) +[#]: via: (https://itsfoss.com/mystiq/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +MystiQ:一个自由开源的音视频转换器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202004/28/223258cr9rxzyrj344kh68.jpg) + +> MystiQ 是一款全新的开源视频转换工具,适用于 Linux 和 Windows。它的底层使用 FFMPEG,并为你提供了一个基于 Qt 的整洁干净的图形界面。 + +### MystiQ,一个基于 QT 的 FFmpeg GUI 前端 + +![][1] + +音频/视频转换工具可为每位跨多个平台的计算机用户提供方便。 + +出于同样的原因,我想着重介绍 [MystiQ][2] 是个好主意,这是一个相对较新的视频/音频转换器工具,适用于 Linux 和 Windows。截至目前,它还不支持 macOS,但可能会在不久的将来支持。 + +MystiQ 是基于 [Qt 5 界面][4]的 [FFmpeg][3] 图形前端。现在,你可以随时[在 Linux 命令行中安装并使用 ffmpeg][5],但这不是很舒服,是吗?这就是为什么 [Handbrake][6] 和 MystiQ 之类的工具可以使我们的生活更方便的原因。 + +由于 MystiQ 基于 FFmpeg,因此你可以将其用于一些基本的视频编辑,例如修剪、旋转等。 + +让我们来看看它的功能。 + +### MystiQ 视频转换器的功能 + +![][7] + +即使 MystiQ 目前还算是一个新事物,但它也包含了一组很好的基本功能。以下它提供的: + + * 视频转换 + * 音频转换(也可从视频中提取音频) + * 支持的格式:MP4、WEBM、MKV、MP3、MOV、OGG、WAV、ASF、FLV、3GP、M4A 等。 + * 跨平台(Windows 和 Linux) + * 适用于 32 位和 64 位系统的安装包 + * 能够调整音频质量(采样率、比特率等)进行转换 + * 基本的视频编辑功能(剪辑视频、插入字幕、旋转视频、缩放视频等) + * 将彩色视频转换为黑白 + * 有几个预设方案,可轻松转换视频以获得最佳质量或获得最佳压缩效果。 + +### 安装 MystiQ + +你可能没有在软件中心中找到它,但将它安装在 Linux 发行版上非常容易。 + +它提供了 .AppImage 文件和 .deb / .rpm 文件(32 位和 64 位软件包)。如果你不清楚如何使用的话,可以阅读[如何使用 AppImage 文件][10]。 + +如果你想帮助他们测试软件进行改进,你还可以找到他们的 [GitHub 页面][11],并查看源码或任何近期的预发布软件包。 + +你可以在其官方网站下载适用于 Linux 和 Windows 的安装程序文件。 + +- [下载 MystiQ][2] + +### 总结 + +在本文中,我使用 [Pop!_OS][12] 20.04 测试了 MytiQ 转换器,并且在转换视频和音频时没遇到任何问题。而且,对于像我这样的普通用户来说,它的转换速度足够快。 + +欢迎尝试一下,让我知道你对它的想法!另外,如果你在 Linux 上一直使用其他工具转换视频和音频,那它是什么? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/mystiq/ + +作者:[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/04/mystiq-converter-ft.jpg?ssl=1 +[2]: https://mystiqapp.com/ +[3]: https://www.ffmpeg.org/ +[4]: https://www.qt.io/ +[5]: https://itsfoss.com/ffmpeg/ +[6]: https://itsfoss.com/handbrake/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/mystiq-options.jpg?ssl=1 +[9]: https://itsfoss.com/sound-converter-linux/ +[10]: https://itsfoss.com/use-appimage-linux/ +[11]: https://github.com/swl-x/MystiQ/ +[12]: https://system76.com/pop diff --git a/published/202004/20200422 How to Check the Available Network Interfaces, Associated IP Addresses, MAC Addresses, and Interface Speed on Linux.md b/published/202004/20200422 How to Check the Available Network Interfaces, Associated IP Addresses, MAC Addresses, and Interface Speed on Linux.md new file mode 100644 index 0000000000..8464da643e --- /dev/null +++ b/published/202004/20200422 How to Check the Available Network Interfaces, Associated IP Addresses, MAC Addresses, and Interface Speed on Linux.md @@ -0,0 +1,198 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12165-1.html) +[#]: subject: (How to Check the Available Network Interfaces, Associated IP Addresses, MAC Addresses, and Interface Speed on Linux) +[#]: via: (https://www.2daygeek.com/linux-unix-check-network-interfaces-names-nic-speed-ip-mac-address/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在 Linux 上检查网卡信息 +====== + +![](https://img.linux.net.cn/data/attachment/album/202004/29/214835m1ms3n00s6qbcycz.jpg) + +默认情况下,在设置服务器时你会配置主网络接口。这是每个人所做的构建工作的一部分。有时出于各种原因,你可能需要配置额外的网络接口。 + +这可以是通过网络绑定bonding/协作teaming来提供高可用性,也可以是用于应用需求或备份的单独接口。 + +为此,你需要知道计算机有多少接口以及它们的速度来配置它们。 + +有许多命令可检查可用的网络接口,但是我们仅使用 `ip` 命令。以后,我们会另外写一篇文章来全部介绍这些工具。 + +在本教程中,我们将向你显示可用网络网卡(NIC)信息,例如接口名称、关联的 IP 地址、MAC 地址和接口速度。 + +### 什么是 ip 命令 + +[ip 命令][1] 类似于 `ifconfig`, 用于分配静态 IP 地址、路由和默认网关等。 + +``` +# ip a + +1: lo: mtu 65536 qdisc noqueue state UNKNOWN + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 + link/ether fa:16:3e:a0:7d:5a brd ff:ff:ff:ff:ff:ff + inet 192.168.1.101/24 brd 192.168.1.101 scope global eth0 + inet6 fe80::f816:3eff:fea0:7d5a/64 scope link + valid_lft forever preferred_lft forever +``` + +### 什么是 ethtool 命令 + +`ethtool` 用于查询或控制网络驱动或硬件设置。 + +``` +# ethtool eth0 +``` + +### 1)如何在 Linux 上使用 ip 命令检查可用的网络接口 + +在不带任何参数的情况下运行 `ip` 命令时,它会提供大量信息,但是,如果仅需要可用的网络接口,请使用以下定制的 `ip` 命令。 + +``` +# ip a |awk '/state UP/{print $2}' + +eth0: +eth1: +``` + +### 2)如何在 Linux 上使用 ip 命令检查网络接口的 IP 地址 + +如果只想查看 IP 地址分配给了哪个接口,请使用以下定制的 `ip` 命令。 + +``` +# ip -o a show | cut -d ' ' -f 2,7 +或 +ip a |grep -i inet | awk '{print $7, $2}' + +lo 127.0.0.1/8 +192.168.1.101/24 +192.168.1.102/24 +``` + +### 3)如何在 Linux 上使用 ip 命令检查网卡的 MAC 地址 + +如果只想查看网络接口名称和相应的 MAC 地址,请使用以下格式。 + +检查特定的网络接口的 MAC 地址: + +``` +# ip link show dev eth0 |awk '/link/{print $2}' +00:00:00:55:43:5c +``` + +检查所有网络接口的 MAC 地址,创建该脚本: + +``` +# vi /opt/scripts/mac-addresses.sh + +#!/bin/sh +ip a |awk '/state UP/{print $2}' | sed 's/://' | while read output; +do + echo $output: + ethtool -P $output +done +``` + +运行该脚本获取多个网络接口的 MAC 地址: + +``` +# sh /opt/scripts/mac-addresses.sh + +eth0: +Permanent address: 00:00:00:55:43:5c +eth1: +Permanent address: 00:00:00:55:43:5d +``` + +### 4)如何在 Linux 上使用 ethtool 命令检查网络接口速度 + +如果要在 Linux 上检查网络接口速度,请使用 `ethtool` 命令。 + +检查特定网络接口的速度: + +``` +# ethtool eth0 |grep "Speed:" + +Speed: 10000Mb/s +``` + +检查所有网络接口速度,创建该脚本: + +``` +# vi /opt/scripts/port-speed.sh + +#!/bin/sh +ip a |awk '/state UP/{print $2}' | sed 's/://' | while read output; +do + echo $output: + ethtool $output |grep "Speed:" +done +``` + +运行该脚本获取多个网络接口速度: + +``` +# sh /opt/scripts/port-speed.sh + +eth0: +Speed: 10000Mb/s +eth1: +Speed: 10000Mb/s +``` + +### 5)验证网卡信息的 Shell 脚本 + +通过此 shell 脚本你可以收集上述所有信息,例如网络接口名称、网络接口的 IP 地址,网络接口的 MAC 地址以及网络接口的速度。创建该脚本: + +``` +# vi /opt/scripts/nic-info.sh + +#!/bin/sh +hostname +echo "-------------" +for iname in $(ip a |awk '/state UP/{print $2}') +do + echo "$iname" + ip a | grep -A2 $iname | awk '/inet/{print $2}' + ip a | grep -A2 $iname | awk '/link/{print $2}' + ethtool $iname |grep "Speed:" +done +``` + +运行该脚本检查网卡信息: + +``` +# sh /opt/scripts/nic-info.sh + +vps.2daygeek.com +---------------- +eth0: +192.168.1.101/24 +00:00:00:55:43:5c +Speed: 10000Mb/s +eth1: +192.168.1.102/24 +00:00:00:55:43:5d +Speed: 10000Mb/s +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/linux-unix-check-network-interfaces-names-nic-speed-ip-mac-address/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/ip-command-configure-network-interface-usage-linux/ +[2]: https://www.2daygeek.com/category/shell-script/ diff --git a/published/202004/20200422 Things You Should Know About Ubuntu 20.04.md b/published/202004/20200422 Things You Should Know About Ubuntu 20.04.md new file mode 100644 index 0000000000..a6a56b25f2 --- /dev/null +++ b/published/202004/20200422 Things You Should Know About Ubuntu 20.04.md @@ -0,0 +1,129 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12158-1.html) +[#]: subject: (Things You Should Know About Ubuntu 20.04) +[#]: via: (https://itsfoss.com/ubuntu-20-04-faq/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +关于 Ubuntu 20.04 你应该了解的事情 +====== + +[Ubuntu 20.04][1] 已经发布,你可能对升级、安装等有一些问题和疑问。 + +我在各种社交媒体渠道上主持了一些问答环节,回答像你这样的读者的疑虑。我将列出这些关于 Ubuntu 20.04 的常见问题,并给出答案。我希望它能帮助你消除你的疑虑。如果你仍有问题,请随时在下面的评论栏提问。 + +### Ubuntu 20.04:已回复的问题 + +![][2] + +为了澄清一下,这里的一些答案也许受我个人意见的影响。如果你是一个有经验的 Ubuntu 用户,有些问题听起来可能有点愚蠢,但它对 Ubuntu 新用户不是这样。 + +#### Ubuntu 20.04 何时发布? + +Ubuntu 20.04 LTS 于 2020 年 4 月 23 日发布。所有变种,如 Kubuntu、Lubuntu,、Xubuntu、Budgie、MATE 都将和 20.04 同一天发布。 + +#### Ubuntu 20.04 的系统要求是什么? + +对于默认的 GNOME 版本,应至少具有 4GB 的内存、2GHz 双核处理器和至少 25GB 的磁盘空间。 + +其他 [Ubuntu 变种][3]可能有不同的系统要求。 + +#### 我可以在 32 位系统上使用 Ubuntu 20.04 吗? + +完全不行。你不能在 32 位系统上使用 Ubuntu 20.04。即使你使用的是 32 位 Ubuntu 18.04,也不能升级到 Ubuntu 20.04。32 位的系统 ISO 是以前用的。 + +![Error while upgrading 32-bit Ubuntu 18.04 to Ubuntu 20.04][4] + +#### 我可以在 Ubuntu 20.04 上使用 Wine 吗? + +是的,你仍然可以在 Ubuntu 20.04 上使用 Wine,因为仍然用于 Wine 和 [Steam Play][5] 软件包所需的 32 位库。 + +#### 我需要购买 Ubuntu 20.04 或许可证? + +不,Ubuntu 完全可以免费使用。你不必像在 Windows 中那样购买许可证密钥或激活 Ubuntu。 + +Ubuntu 的下载页会请求你捐赠一些资金,如果你想为开发这个强大的操作系统捐钱,由你自己决定。 + +#### GNOME 版本是什么? + +Ubuntu 20.04 有 GNOME 3.36。 + +#### Ubuntu 20.04 的性能是否优于 Ubuntu 18.04? + +是的,在几个方面。Ubuntu 20.04 系统速度更快,甚至超快。我在下面这个视频的 4:40 处展示了性能对比。 + +- [video](https://img.linux.net.cn/static/video/Top%207%20Best%20Features%20You%27ll%20Love%20in%20Ubuntu%2020.04-lpq8pm_xkSE.mp4) + +在 GNOME 3.36 中,滚动、窗口动画和其他 UI 元素更加流畅,提供了更流畅的体验。 + +#### Ubuntu 20.04 将支持多长时间? + +它是一个长期支持(LTS)版本,与任何 LTS 版本一样,它将在五年内得到支持。这意味着 Ubuntu 20.04 将在 2025 年 4 月之前获得安全和维护更新。 + +#### 升级到 Ubuntu 20.04 时,是否会丢失数据? + +你可以从 Ubuntu 19.10 或 Ubuntu 18.04 升级到 Ubuntu 20.04。你无需创建 live USB 并从中安装。你所需要的是一个良好的互联网连接,来下载约 1.5GB 的数据。 + +从现有系统升级不会破坏你的文件。你应该会留有所有文件,并且大多数现有软件应具有相同的版本或升级后的版本。 + +如果你使用了某些第三方工具或[其他 PPA][6],升级过程将禁用它们。如果 Ubuntu 20.04 可以使用这些其他存储库,那么可以再次启用它们。 + +升级大约需要一个小时,重启后,你将登录到新版本。 + +虽然你的数据不会被触碰,并且不会丢失系统文件和配置,但最好在外部设备备份重要数据。 + +#### 何时可以升级到 Ubuntu 20.04? + +![][7] + +如果你正在使用 Ubuntu 19.10 并有正确的更新设置(如前面部分所述),那么应在发布后的几天内通知你升级到 Ubuntu 20.04。 + +对于 Ubuntu 18.04 用户,可能需要几周时间才能正式通知他们 Ubuntu 20.04 可用。可能,你可能会在第一个点版本 Ubuntu 20.04.1 后获得提示。 + +#### 如果我升级到 Ubuntu 20.04,我可以降级到 19.10 或 18.04 吗? + +不行。虽然升级到新版本很容易,但无法选择降级。如果你想回到 Ubuntu 18.04,你需要重新[安装 Ubuntu 18.04][8]。 + +#### 我使用的是 Ubuntu 18.04 LTS。我应该升级到 Ubuntu 20.04 LTS 吗? + +这取决于你。如果你对 Ubuntu 20.04 中的新功能印象深刻,并希望上手尝试,那么你应该升级。 + +如果你想要一个更稳定的系统,我建议等待第一个点版本 Ubuntu 20.04.1,新版本会有 bug 修复。20.04.1 通常在 Ubuntu 20.04 发布后大约两个月到来。 + +无论是那种情况,我都建议你或早或晚升级到 Ubuntu 20.04。Ubuntu 20.04 具有更新的内核、性能改进,尤其是仓库中有更新版本的软件。 + +在外部磁盘上进行备份,并且有良好的互联网连接,升级不应成为问题。 + +#### 我应该重新安装 Ubuntu 20.04 还是从 18.04/19.10 升级到 Ubuntu? + +如果你可以选择,请备份数据,并重新安装 Ubuntu 20.04。 + +从现有版本升级到 20.04 是一个方便的选择。然而,在我看来,它仍然保留有一些旧版本的痕迹/包。全新安装更加干净。 + +#### 关于 Ubuntu 20.04 的任何其他问题? + +如果你对 Ubuntu 20.04 有任何疑问,请随时在下面发表评论。如果你认为应该将其他信息添加到列表中,请让我知道。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ubuntu-20-04-faq/ + +作者:[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://linux.cn/article-12142-1.html +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu_20_04_faq.jpg?ssl=1 +[3]: https://itsfoss.com/which-ubuntu-install/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-32-bit.jpg?ssl=1 +[5]: https://itsfoss.com/steam-play/ +[6]: https://itsfoss.com/ppa-guide/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/upgrade-ubuntu-20-04.jpg?ssl=1 +[8]: https://itsfoss.com/install-ubuntu/ diff --git a/published/20200424 Ubuntu 20.04 LTS Released. Download Now.md b/published/202004/20200424 Ubuntu 20.04 LTS Released. Download Now.md similarity index 100% rename from published/20200424 Ubuntu 20.04 LTS Released. Download Now.md rename to published/202004/20200424 Ubuntu 20.04 LTS Released. Download Now.md diff --git a/published/202004/20200424 What you need to know about open source ad blockers.md b/published/202004/20200424 What you need to know about open source ad blockers.md new file mode 100644 index 0000000000..c28cbc6080 --- /dev/null +++ b/published/202004/20200424 What you need to know about open source ad blockers.md @@ -0,0 +1,56 @@ +[#]: collector: (lujun9972) +[#]: translator: (CrazyShipOne) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12157-1.html) +[#]: subject: (What you need to know about open source ad blockers) +[#]: via: (https://opensource.com/article/20/4/ad-blockers) +[#]: author: (Joshua Pearce https://opensource.com/users/jmpearce) + +开源的广告拦截器不但节能,而且能拯救生命! +====== +> 三个开源广告拦截器与“无广告拦截器”对照组进行了测试。 + +![](https://img.linux.net.cn/data/attachment/album/202004/27/220109b86sidn56sn6inoh.jpg) + +一项旨在调查自由开源的广告拦截器节能的情况的[研究][2],意外地发现了互联网广告正在浪费你大量的时间。 + +更重要的是,研究结果表明了你可以挽救回这些失去的时间。这项研究评估发现,使用 [uBlock Origin][3](一个开源免费的广告拦截器)的情况下平均每个网民一年可以节约超过 100 个小时的时间。uBlock Origin 是测试中最有效的广告拦截器,不过其他的广告拦截器也为网民节省了时间、能源以及金钱。 + +![Ad blocker screen comparison][4] + +在研究结果中,[AdBlock+][5] 减少了 11% 的页面加载时间,[Privacy Badger][6] 减少了 22%,[uBlock Origin][3] 减少了 28%。对于单独一个页面来说这个时间並不算多,但是网民们一半以上的浏览时间都是在网站间快速跳转,通常在一个页面停留少于 15 秒。鉴于这种情况,加载广告的额外时间加起来就很多了。 + +发布于 Technologies 杂志上的《[用开源的广告拦截器节能][7]》一文最初旨在解决日益增长的能源消耗问题。随着全球网民每日上网时间超过 6.5 小时,与互联网相关的用电量正在快速地增加。以美国人为例,自 2000 年他们的上网时间已经增加了一倍,几乎达到每周 24 小时。开源广告拦截器通过消灭上网和观看视频时产生的广告,潜在地减少了时间,从而减少用电。 + +在研究过程中,对三个开源广告拦截器与“无广告拦截器”对照组进行了测试。研究人员记录了浏览全球访问量最大的网站的页面加载时间,其中包括网络搜索(谷歌、雅虎、必应)、信息(Weather.com、维基百科)和新闻网站(CNN、福克斯、纽约时报)。除此之外,研究还分析了观看流行与非流行视频内容时广告所花费的时间。这部分研究由于缺乏 Youtube 上流行和非流行内容观看比例的数据而非常具有挑战性。每个视频浪费在广告观看上的时间可以从 0.06% 到惊人的 21% 不等。而且,这还只是浏览器上记录的加载广告而失去的时间。 + +总的来说,研究结果表明加载广告所浪费的能源并不是是小事。由于运行电脑所使用的大量电力仍然来自于煤炭,而煤炭会造成空气污染和过早死亡,因此该研究分析了广告拦截器拯救美国人生命的潜力。(LCTT 译注:由于这项研究是美国人完成的,所以这里仅提及了美国人,但是同理可推至全球。)结果是令人震惊的:如果美国人都使用开源广告拦截器,每年节约的能源将会拯救超过 36 个美国人的生命。 + +电能即金钱,所以削减广告也可以为消费者节约钱财。在美国,如果所有的网民都在他们的电脑上开启 [Privacy Badger][8],美国人每年可以节约超过 9100 万美元。在全球范围内,调查研究的结果则更令人吃惊。uBlock Origin 每年可以为全球消费者节约 18 亿美元。 + +这项研究始于人们因为新冠肺炎大流行而被迫居家之前,因此所有的数据都可以被认为是保守的估算。整体来说,研究发现了开源广告拦截器是一项潜在的节能技术。 + +虽然自由开源的广告拦截器可以节约能源,对自然环境也有好处,但你可能主要是为了拦截恼人的广告和节省自己的时间而使用它们。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/ad-blockers + +作者:[Joshua Pearce][a] +选题:[lujun9972][b] +译者:[CrazyShipOne](https://github.com/CrazyShipOne) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jmpearce +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_desktop_website_checklist_metrics.png?itok=OKKbl1UR (Browser of things) +[2]: https://www.mdpi.com/2227-7080/8/2/18 +[3]: https://github.com/gorhill/uBlock +[4]: https://opensource.com/sites/default/files/uploads/os_ad_blocker_story_.png (Ad blocker screen comparison) +[5]: https://adblockplus.org/ +[6]: https://privacybadger.org/ +[7]: https://www.academia.edu/42434401/Energy_Conservation_with_Open_Source_Ad_Blockers +[8]: https://privacybadger.org/ diff --git a/published/202004/20200425 What Happened to IPv5- Why there is IPv4, IPv6 but no IPv5.md b/published/202004/20200425 What Happened to IPv5- Why there is IPv4, IPv6 but no IPv5.md new file mode 100644 index 0000000000..3a8ab6b8bd --- /dev/null +++ b/published/202004/20200425 What Happened to IPv5- Why there is IPv4, IPv6 but no IPv5.md @@ -0,0 +1,76 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12168-1.html) +[#]: subject: (What Happened to IPv5? Why there is IPv4, IPv6 but no IPv5?) +[#]: via: (https://itsfoss.com/what-happened-to-ipv5/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +IPv5 发生了什么?为什么有 IPv4、IPv6 但没有 IPv5? +====== + +如果你花过很多时间在互联网上,那么你应该已经听说过计算机每天使用的 IPv4 和 IPv6 协议。 + +你可能会问的一个问题是:为什么没有 IPv5?为什么 IPv6 在 IPv4 之后而不是 IPv5 之后出现?是否有 IPv5,如果是,那么 IPv5 发生了什么? + +答案是肯定的,曾经有一个 IPv5。让我解释一下这里发生的事。 + +### 互联网的早期历史 + +![ARPA Logical Map in 1977 | Image courtesy: Wikipedia][1] + +在 1960 年代后期,美国国防部的[高级研究计划局][2](DARPA)发起了一个[项目][3]来连接全国的计算机。最初的目标是创建一个由全国 ARPA 资助的所有计算机组成的网络系统。 + +由于这是第一次将如此规模的网络整合在一起,因此他们也在不断发展自己的技术和硬件。他们首先做的工作之一就是开发名为[传输控制协议][4]Transmission Control Protocol(TCP)的互联网协议Internet Protocol(IP)。该协议“可靠、有序,并会对运行于通过 IP 网络传输的主机上的应用的八进制(字节)流通讯进行错误检测”。简单来说,它可以确保数据安全到达。 + +最初,TCP 被设计为[“主机级别的端到端协议以及封装和路由协议”][5]。但是,他们意识到他们需要拆分协议以使其更易于管理。于是决定由 IP 协议处理封装和路由。 + +那时,TCP 已经经历了三个版本,因此新协议被称为 IPv4。 + +### IPv5 的诞生 + +IPv5 开始时有个不同的名字:互联网流协议Internet Stream Protocol(ST)。它是[由 Apple、NeXT 和 Sun Microsystems][6] 为试验流式语音和视频而创建的。 + +该新协议能够“在保持通信的同时,以特定频率传输数据包”。 + +### 那么 IPv5 发生了什么? + +![][7] + +IPv5 从未被接受为正式的互联网协议。这主要是由于 32 位限制。 + +IPV5 使用与 IPv4 相同的寻址系统。每个地址由 0 到 255 之间的四组数字组成。这将可能的地址数量限制为 [43 亿][6]个。 + +在 1970 年代初,这似乎比全世界所需要的还要多。但是,互联网的爆炸性增长证明了这一想法是错误的。2011 年,世界上的IPv4地址正式用完了。 + +在 1990 年代,一个新项目开始致力于研究下一代互联网协议(IPng)。这形成了 128 位的 IPv6。IPv6 地址包含 [“8 组 4 字符的十六进制数字”][6],它可以包含从 0 到 9 的数字和从 A 到 F 的字母。与 IPv4 不同,IPv6 拥有数万亿个可能的地址,因此我们应该能安全一阵子。 + +同时,IPv5 奠定了 VoIP 的基础,而该技术已被我们用于当今世界范围内的通信。**因此,我想在某种程度上,你可以说 IPv5 仍然可以保留到了今天**。 + +希望你喜欢有关互联网历史的轶事。你可以阅读其他[关于 Linux 和技术的琐事文章][8]。 + +如果你觉得这篇文章有趣,请花一点时间在社交媒体、Hacker News 或 [Reddit][9] 上分享它。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/what-happened-to-ipv5/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/Arpa_internet.png?fit=800%2C573&ssl=1 +[2]: https://en.wikipedia.org/wiki/DARPA +[3]: https://en.wikipedia.org/wiki/ARPANET +[4]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol +[5]: https://fcw.com/articles/2006/07/31/what-ever-happened-to-ipv5.aspx +[6]: https://www.lifewire.com/what-happened-to-ipv5-3971327 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/what-happened-to-ipv5.png?ssl=1 +[8]: https://itsfoss.com/category/story/ +[9]: https://reddit.com/r/linuxusersgroup diff --git a/published/202004/20200428 Fedora 32 is officially here.md b/published/202004/20200428 Fedora 32 is officially here.md new file mode 100644 index 0000000000..acad6862f5 --- /dev/null +++ b/published/202004/20200428 Fedora 32 is officially here.md @@ -0,0 +1,77 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12164-1.html) +[#]: subject: (Fedora 32 is officially here!) +[#]: via: (https://fedoramagazine.org/announcing-fedora-32/) +[#]: author: (Matthew Miller https://fedoramagazine.org/author/mattdm/) + +Fedora 32 正式发布! +====== + +![][1] + +它来了! 我们很荣幸地宣布 Fedora 32 的发布。感谢成千上万的 Fedora 社区成员和贡献者的辛勤工作,我们又一次准时发布了。 + +如果你只想马上就能拿到它,请马上访问 。更多详情,请继续阅读本文。 + +### Fedora 的全部变种 + +Fedora Editions 是针对特定的“展示”用途输出的。 + +Fedora Workstation 专注于桌面系统。特别是,它面向的是那些希望获得“可以工作的” Linux 操作系统体验的软件开发者。这个版本采用了 [GNOME 3.36][2],一如既往地有很多很棒的改进。我最喜欢的是新的锁屏! + +Fedora Server 以一种易于部署的方式为系统管理员带来了新锐的开源服务器软件。对于边缘计算用例,[Fedora IoT][3] 为 IoT 生态系统提供了坚实的基础。 + +Fedora CoreOS 是一个新兴的 Fedora Edition。它是一个自动更新的、最小化的操作系统,用于安全地大规模运行容器化工作负载。它提供了几个[更新流][4],遵循大约每两周一次的自动更新。目前,next 流是基于 Fedora 32,后续还有 testing 流和 stable 流。你可以从[下载页面][5]中找到关于按 next 流发布的工件的信息,并在 [Fedora CoreOS 文档][6]中找到关于如何使用这些工件的信息。 + +当然,我们制作的不仅仅是 Editions。[Fedora Spins][7] 和[实验室][8]针对的是不同的受众和用例,包括[Fedora 天文学实验室][9],它为业余和专业的天文学家带来了完整的开源工具链,还有像 [KDE Plasma][10] 和 [Xfce][11] 这样的桌面环境。Fedora 32 中新增的 [计算神经科学实验室][12] 是由我们的神经科学特别兴趣小组开发的,它可以实现计算神经科学。 + +还有,别忘了我们的备用架构,[ARM AArch64、Power 和 S390x][13]。特别值得一提的是,我们改进了对 Rockchip 系统级芯片的支持,包括 Rock960、RockPro64 和 Rock64。 + +### 一般性的改进 + +无论你使用 Fedora 的哪个变体,你都能获得最新的开源世界。遵循我们的“[First][14]”理念,我们更新了关键的编程语言和系统库包,包括 GCC 10、Ruby 2.7 和 Python 3.8。当然,随着 Python 2 已经过了报废期,我们已经从 Fedora 中删除了大部分 Python 2 包,但我们为仍然需要它的开发者和用户提供了一个遗留的 python27 包。在 Fedora Workstation 中,我们默认启用了 EarlyOOM 服务,以改善低内存情况下的用户体验。 + +我们非常期待你能尝试一下新版本的使用体验! 现在就去 下载它。或者如果你已经在运行 Fedora 操作系统,请按照简单的[升级说明][15]进行升级。 + +### 万一出现问题…… + +如果你遇到问题,请查看[Fedora 32 常见错误][16]页面,如果有问题,请访问我们的 [Askedora][17] 用户支持平台。 + +### 谢谢大家 + +感谢在这个发布周期中为 Fedora 项目做出贡献的成千上万的人,特别是感谢那些在大流行期间为又一次准时发布而付出额外努力的人。Fedora 是一个社区,很高兴看到我们彼此之间的支持。我邀请大家参加 4 月28-29 日的[红帽峰会虚拟体验][18],了解更多关于 Fedora 和其他社区的信息。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/announcing-fedora-32/ + +作者:[Matthew Miller][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/mattdm/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/04/f32-final-816x345.png +[2]: https://www.gnome.org/news/2020/03/gnome-3-36-released/ +[3]: https://iot.fedoraproject.org/ +[4]: https://docs.fedoraproject.org/en-US/fedora-coreos/update-streams/ +[5]: https://getfedora.org/en/coreos/download?stream=next +[6]: https://docs.fedoraproject.org/en-US/fedora-coreos/getting-started/ +[7]: https://spins.fedoraproject.org/ +[8]: https://labs.fedoraproject.org/ +[9]: https://labs.fedoraproject.org/en/astronomy/ +[10]: https://spins.fedoraproject.org/en/kde/ +[11]: https://spins.fedoraproject.org/en/xfce/ +[12]: https://labs.fedoraproject.org/en/comp-neuro +[13]: https://alt.fedoraproject.org/alt/ +[14]: https://docs.fedoraproject.org/en-US/project/#_first +[15]: https://docs.fedoraproject.org/en-US/quick-docs/upgrading/ +[16]: https://fedoraproject.org/wiki/Common_F32_bugs +[17]: http://ask.fedoraproject.org +[18]: https://www.redhat.com/en/summit diff --git a/published/202004/20200429 Manjaro 20 Lysia Arrives with ZFS and Snap Support.md b/published/202004/20200429 Manjaro 20 Lysia Arrives with ZFS and Snap Support.md new file mode 100644 index 0000000000..2ed94dd0a8 --- /dev/null +++ b/published/202004/20200429 Manjaro 20 Lysia Arrives with ZFS and Snap Support.md @@ -0,0 +1,110 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12166-1.html) +[#]: subject: (Manjaro 20 Lysia Arrives with ZFS and Snap Support) +[#]: via: (https://itsfoss.com/manjaro-20-release/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Manjaro 20 Lysia 到来,支持 ZFS 和 Snap +====== + +![](https://img.linux.net.cn/data/attachment/album/202004/29/232925j8paomvp11pfu12v.jpg) + +> Manjaro Linux 刷新了其 Manjaro 20 “Lysia” 的 ISO。现在在 Pamac 中支持了 Snap 和 Flatpak 软件包。在 Manjaro Architect 安装程序中增加了 ZFS 选项,并使用最新的内核 5.6 作为基础。 + +最近新的发行版的发布像下雨一样。在上周发布了 [Ubuntu 20.04 LTS](https://linux.cn/article-12142-1.html) ,紧接着 [Fedora 32](https://linux.cn/article-12164-1.html) 也刚刚发布,而现在 [Manjaro 发布了版本 20][1],代号为 Lysia。 + +### Manjaro 20 Lysia 有什么新东西? + +其实有很多。让我给大家介绍一下 Manjaro 20 中的一些主要新功能。 + +#### 新的抹茶主题 + +Manjaro 20 有一个新的默认主题,名为 Matcha(抹茶)。它让桌面看起来更有质感。 + +![][2] + +#### 对 Snap 和 Flatpak 的支持 + +Snap 和 Flatpak 软件包的支持得到了改进。如果你愿意,你可以在命令行中使用它们。 + +你还可以在 Pamac 图形界面包管理器中启用 Snap 和 Flatpak 支持。 + +![Enable Snap support in Pamac Manjaro][3] + +启用后,你可以在 Pamac 软件管理器中找到并安装 Snap/Flatpak 应用程序。 + +![Snap applications in Pamac][4] + +#### Pamac 提供了基于搜索安装新软件的方式(在 GNOME 中) + +在 GNOME 变种中,如果你搜索某个东西,Pamac 软件管理器会提供安装符合查询的软件。在其他使用 GNOME 桌面的发行版中,GNOME 软件中心也会这样做。 + +#### ZFS 支持登陆了 Manjaro Architect + +现在,你可以在 Manjaro Linux 中轻松地使用 ZFS 作为根文件系统。在 [Manjaro Architect][6] 中提供了对 [ZFS 文件系统][5]的支持。 + +请注意,我说的是 Manjaro Architect,即基于终端的安装程序。它和普通的图形化的 [Calamares 安装程序][7]不一样。 + +![][8] + +#### Linux kernel 5.6 + +最新的稳定版 [Linux 内核 5.6][9] 带来了更多的硬件支持,如 thunderbolt、Nvidia 和 USB4。你也可以使用 [WireGuard VPN][10]。 + +![][11] + +#### 其他杂项变化 + + * 新的桌面环境版本:Xfce 4.14、GNOME 3.36 和 KDE Plasma 5.18。 + * 新的默认 shell 是 zsh。 + * Display-Profiles 允许你存储一个或多个配置文件,用于你的首选显示配置。 + * 改进后的 Gnome-Layout-Switcher。 + * 最新的驱动程序。 + * 改进和完善了 Manjaro 工具。 + +### 如何取得 Manjaro 20 Lysia? + +如果你已经在使用 Manjaro,只需更新你的 Manjaro Linux 系统,你就应该已经在使用 Lysia 了。 + +Manjaro 采用了滚动发布模式,这意味着你不必手动从一个版本升级到另一个版本。只要有新的版本发布,不需要重新安装就可以使用了。 + +既然 Manjaro 是滚动发布的,为什么每隔一段时间就会发布一个新版本呢?这是因为他们要刷新 ISO,这样下载 Manjaro 的新用户就不用再安装过去几年的更新了。这就是为什么 Arch Linux 也会每个月刷新一次 ISO 的原因。 + +Manjaro 的“ISO 刷新”是有代号和版本的,因为它可以帮助开发者清楚地标明每个开发阶段的发展方向。 + +所以,如果你已经在使用它,只需使用 Pamac 或命令行[更新你的 Manjaro Linux 系统][12]即可。 + +如果你想尝试 Manjaro 或者想使用 ZFS,那么你可以通过从它的网站上[下载 ISO][14] 来[安装 Manjaro][13]。 + +愿你喜欢新的 Manjaro Linux 发布。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/manjaro-20-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://forum.manjaro.org/t/manjaro-20-0-lysia-released/138633 +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/manjaro-20-lysia.jpeg?resize=800%2C440&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/enable-snap-in-pamac-manjaro.jpg?resize=800%2C490&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/snap-app-pacman.jpg?resize=800%2C489&ssl=1 +[5]: https://itsfoss.com/what-is-zfs/ +[6]: https://itsfoss.com/manjaro-architect-review/ +[7]: https://calamares.io/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/pacman-prompts-install-apps.jpg?resize=800%2C331&ssl=1 +[9]: https://itsfoss.com/linux-kernel-5-6/ +[10]: https://itsfoss.com/wireguard/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/manjaro-20-neofetch-screen.jpg?resize=800%2C495&ssl=1 +[12]: https://itsfoss.com/update-arch-linux/ +[13]: https://itsfoss.com/install-manjaro-linux/ +[14]: https://manjaro.org/download/ diff --git a/published/202005/20180425 An introduction to the GNU Core Utilities - Opensource.com.md b/published/202005/20180425 An introduction to the GNU Core Utilities - Opensource.com.md new file mode 100644 index 0000000000..fe61c265f0 --- /dev/null +++ b/published/202005/20180425 An introduction to the GNU Core Utilities - Opensource.com.md @@ -0,0 +1,127 @@ +GNU 核心实用程序简介 +====== + +> 大多数 Linux 系统管理员需要做的事情都可以在 GNU coreutils 或 util-linux 中找到。 + +![](https://img.linux.net.cn/data/attachment/album/202005/10/172312hofgh88i3g6jajfj.jpg) + +许多 Linux 系统管理员最基本和常用的工具主要包括在两套实用程序中:[GNU 核心实用程序(coreutils)][3]和 util-linux。它们的基本功能允许系统管理员执行许多管理 Linux 系统的任务,包括管理和操作文本文件、目录、数据流、存储介质、进程控制、文件系统等等。 + +这些工具是不可缺少的,因为没有它们,就不可能在 Unix 或 Linux 计算机上完成任何有用的工作。鉴于它们的重要性,让我们来研究一下它们。 + +### GNU coreutils + +要了解 GNU 核心实用程序的起源,我们需要乘坐时光机进行一次短暂的旅行,回到贝尔实验室的 Unix 早期。[编写 Unix][8] 是为了让 Ken Thompson、Dennis Ritchie、Doug McIlroy 和 Joe Ossanna 可以继续他们在大型多任务和多用户计算机项目 [Multics][9] 上的工作:开发一个叫做《太空旅行》游戏的小东西。正如今天一样,推动计算技术发展的似乎总是游戏玩家。这个新的操作系统比 Multics(LCTT 译注:multi- 字头的意思是多数的)的局限性更大,因为一次只能有两个用户登录,所以被称为 Unics(LCTT 译注:uni- 字头的意思是单独的)。后来这个名字被改成了 Unix。 + +随着时间的推移,Unix 取得了如此巨大的成功,开始贝尔实验室基本上是将其赠送给大学,后来送给公司也只是收取介质和运输的费用。在那个年代,系统级的软件是在组织和程序员之间共享的,因为在系统管理这个层面,他们努力实现的是共同的目标。 + +最终,AT&T 公司的[老板们][10]决定,他们应该在 Unix 上赚钱,并开始使用限制更多的、昂贵的许可证。这发生在软件变得更加专有、受限和封闭的时期,从那时起,与其他用户和组织共享软件变得不可能。 + +有些人不喜欢这种情况,于是用自由软件来对抗。Richard M. Stallman(RMS),他带领着一群“反叛者”试图编写一个开放的、自由的可用操作系统,他们称之为 GNU 操作系统。这群人创建了 GNU 实用程序,但并没有产生一个可行的内核。 + +当 Linus Torvalds 开始编写和编译 Linux 内核时,他需要一套非常基本的系统实用程序来开始执行一些稍微有用的工作。内核并不提供命令或任何类型的命令 shell,比如 Bash,它本身是没有任何用处的,因此,Linus 使用了免费提供的 GNU 核心实用程序,并为 Linux 重新编译了它们。这让他拥有了一个完整的、即便是相当基本的操作系统。 + +你可以通过在终端命令行中输入命令 `info coreutils` 来了解 GNU 核心实用程序的全部内容。下面的核心实用程序列表就是这个信息页面的一部分。这些实用程序按功能进行了分组,以方便查找;在终端中,选择你想了解更多信息的组,然后按回车键。 + +``` +* Output of entire files::       cat tac nl od base32 base64 +* Formatting file contents::     fmt pr fold +* Output of parts of files::     head tail split csplit +* Summarizing files::            wc sum cksum b2sum md5sum sha1sum sha2 +* Operating on sorted files::    sort shuf uniq comm ptx tsort +* Operating on fields::          cut paste join +* Operating on characters::      tr expand unexpand +* Directory listing::            ls dir vdir dircolors +* Basic operations::             cp dd install mv rm shred +* Special file types::           mkdir rmdir unlink mkfifo mknod ln link readlink +* Changing file attributes::     chgrp chmod chown touch +* Disk usage::                   df du stat sync truncate +* Printing text::                echo printf yes +* Conditions::                   false true test expr +* Redirection::                  tee +* File name manipulation::       dirname basename pathchk mktemp realpath +* Working context::              pwd stty printenv tty +* User information::             id logname whoami groups users who +* System context::               date arch nproc uname hostname hostid uptime +* SELinux context::              chcon runcon +* Modified command invocation::  chroot env nice nohup stdbuf timeout +* Process control::              kill +* Delaying::                     sleep +* Numeric operations::           factor numfmt seq +``` + +这个列表里有 102 个实用程序。它涵盖了在 Unix 或 Linux 主机上执行基本任务所需的许多功能。但是,很多基本的实用程序都缺失了,例如,`mount` 和 `umount` 命令不在这个列表中。这些命令和其他许多不在 GNU 核心实用程序中的命令可以在 util-linux 中找到。 + +### util-linux + +util-linix 实用程序包中包含了许多系统管理员常用的其它命令。这些实用程序是由 Linux 内核组织发布的,这 107 条命令中几乎每一个都来自原本是三个单独的集合 —— fileutils、shellutils 和 textutils,2003 年它们被[合并成一个包][11]:util-linux。 + +``` +agetty          fsck.minix      mkfs.bfs        setpriv +blkdiscard      fsfreeze        mkfs.cramfs     setsid +blkid           fstab           mkfs.minix      setterm +blockdev        fstrim          mkswap          sfdisk +cal             getopt          more            su +cfdisk          hexdump         mount           sulogin +chcpu           hwclock         mountpoint      swaplabel +chfn            ionice          namei           swapoff +chrt            ipcmk           newgrp          swapon +chsh            ipcrm           nologin         switch_root +colcrt          ipcs            nsenter         tailf +col             isosize         partx           taskset +colrm           kill            pg              tunelp +column          last            pivot_root      ul +ctrlaltdel      ldattach        prlimit         umount +ddpart          line            raw             unshare +delpart         logger          readprofile     utmpdump +dmesg           login           rename          uuidd +eject           look            renice          uuidgen +fallocate       losetup         reset           vipw +fdformat        lsblk           resizepart      wall +fdisk           lscpu           rev             wdctl +findfs          lslocks         RTC Alarm       whereis +findmnt         lslogins        runuser         wipefs +flock           mcookie         script          write +fsck            mesg            scriptreplay    zramctl +fsck.cramfs     mkfs            setarch +``` + +这些实用程序中的一些已经被淘汰了,很可能在未来的某个时候会从集合中被踢出去。你应该看看[维基百科的 util-linux 页面][12]来了解其中许多实用程序的信息,而 man 页面也提供了关于这些命令的详细信息。 + +### 总结 + +这两个 Linux 实用程序的集合,GNU 核心实用程序和 util-linux,共同提供了管理 Linux 系统所需的基本实用程序。在研究这篇文章的过程中,我发现了几个有趣的实用程序,这些实用程序是我从不知道的。这些命令中的很多都是很少需要的,但当你需要的时候,它们是不可缺少的。 + +在这两个集合里,有 200 多个 Linux 实用工具。虽然 Linux 的命令还有很多,但这些都是管理一个典型的 Linux 主机的基本功能所需要的。 + +--- + +via: [https://opensource.com/article/18/4/gnu-core-utilities][17] + +作者: [David Both][18] 选题者: [lujun9972][19] 译者: [wxy][20] 校对: [wxy][21] + +本文由 [LCTT][22] 原创编译,[Linux中国][23] 荣誉推出 + +[1]: https://pixabay.com/en/tiny-people-core-apple-apple-half-700921/ +[2]: https://creativecommons.org/publicdomain/zero/1.0/ +[3]: https://www.gnu.org/software/coreutils/coreutils.html +[4]: https://opensource.com/life/17/10/top-terminal-emulators?intcmp=7016000000127cYAAQ +[5]: https://opensource.com/article/17/2/command-line-tools-data-analysis-linux?intcmp=7016000000127cYAAQ +[6]: https://opensource.com/downloads/advanced-ssh-cheat-sheet?intcmp=7016000000127cYAAQ +[7]: https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=7016000000127cYAAQ +[8]: https://en.wikipedia.org/wiki/History_of_Unix +[9]: https://en.wikipedia.org/wiki/Multics +[10]: https://en.wikipedia.org/wiki/Pointy-haired_Boss +[11]: https://en.wikipedia.org/wiki/GNU_Core_Utilities +[12]: https://en.wikipedia.org/wiki/Util-linux +[13]: https://opensource.com/users/dboth +[14]: https://opensource.com/users/dboth +[15]: https://opensource.com/users/dboth +[16]: https://opensource.com/participate +[17]: https://opensource.com/article/18/4/gnu-core-utilities +[18]: https://opensource.com/users/dboth +[19]: https://github.com/lujun9972 +[20]: https://github.com/译者ID +[21]: https://github.com/校对者ID +[22]: https://github.com/LCTT/TranslateProject +[23]: https://linux.cn/ diff --git a/published/202005/20180612 Systemd Services- Reacting to Change.md b/published/202005/20180612 Systemd Services- Reacting to Change.md new file mode 100644 index 0000000000..8a7be7cde2 --- /dev/null +++ b/published/202005/20180612 Systemd Services- Reacting to Change.md @@ -0,0 +1,266 @@ +Systemd 服务:响应变化 +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/12/001037iz91uu9b15dqb9w3.jpg) + +[我有一个这样的电脑棒][1](图1),我把它用作通用服务器。它很小且安静,由于它是基于 x86 架构的,因此我为我的打印机安装驱动没有任何问题,而且这就是它大多数时候干的事:与客厅的共享打印机和扫描仪通信。 + +![ComputeStick][3] + +*一个英特尔电脑棒。欧元硬币大小。* + +大多数时候它都是闲置的,尤其是当我们外出时,因此我认为用它作监视系统是个好主意。该设备没有自带的摄像头,也不需要一直监视。我也不想手动启动图像捕获,因为这样就意味着在出门前必须通过 SSH 登录,并在 shell 中编写命令来启动该进程。 + +因此,我以为应该这么做:拿一个 USB 摄像头,然后只需插入它即可自动启动监视系统。如果这个电脑棒重启后发现连接了摄像头也启动监视系统就更加分了。 + +在先前的文章中,我们看到 systemd 服务既可以[手动启动或停止][5],也可以[在满足某些条件时启动或停止][6]。这些条件不限于操作系统在启动或关机时序中达到某种状态,还可以在你插入新硬件或文件系统发生变化时进行。你可以通过将 Udev 规则与 systemd 服务结合起来实现。 + +### 有 Udev 支持的热插拔 + +Udev 规则位于 `/etc/udev/rules` 目录中,通常是由导致一个动作action条件conditions赋值assignments的单行语句来描述。 + +有点神秘。让我们再解释一次: + +通常,在 Udev 规则中,你会告诉 systemd 当设备连接时需要查看什么信息。例如,你可能想检查刚插入的设备的品牌和型号是否与你让 Udev 等待的设备的品牌和型号相对应。这些就是前面提到的“条件”。 + +然后,你可能想要更改一些内容,以便以后可以方便使用该设备。例如,更改设备的读写权限:如果插入 USB 打印机,你会希望用户能够从打印机读取信息(用户的打印应用程序需要知道其模型、制造商,以及是否准备好接受打印作业)并向其写入内容,即发送要打印的内容。更改设备的读写权限是通过你之前阅读的“赋值” 之一完成的。 + +最后,你可能希望系统在满足上述条件时执行某些动作,例如在插入某个外部硬盘时启动备份程序以复制重要文件。这就是上面提到的“动作”的例子。 + +了解这些之后, 来看看以下几点: + +``` +ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="e207", +SYMLINK+="mywebcam", TAG+="systemd", MODE="0666", ENV{SYSTEMD_WANTS}="webcam.service" +``` + +规则的第一部分, + +``` +ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="03f0", +ATTRS{idProduct}=="e207" [etc... ] +``` + +表明了执行你想让系统执行的其他动作之前设备必须满足的条件。设备必须被添加到(`ACTION=="add"`)机器上,并且必须添加到 `video4linux` 子系统中。为了确保仅在插入正确的设备时才应用该规则,你必须确保 Udev 正确识别设备的制造商(`ATTRS{idVendor}=="03f0"`)和型号(`ATTRS{idProduct}=="e207"`)。 + +在本例中,我们讨论的是这个设备(图2): + +![webcam][8] + +*这个试验使用的是 HP 的摄像头。* + +注意怎样用 `==` 来表示这是一个逻辑操作。你应该像这样阅读上面的简要规则: + +> 如果添加了一个设备并且该设备由 video4linux 子系统控制,而且该设备的制造商编码是 03f0,型号是 e207,那么... + +但是,你从哪里获取的这些信息?你在哪里找到触发事件的动作、制造商、型号等?你可要使用多个来源。你可以通过将摄像头插入机器并运行 `lsusb` 来获得 `IdVendor` 和 `idProduct` : + +``` +lsusb +Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub +Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub +Bus 003 Device 003: ID 03f0:e207 Hewlett-Packard +Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +Bus 001 Device 003: ID 04f2:b1bb Chicony Electronics Co., Ltd +Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub +Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +``` + +我用的摄像头是 HP 的,你在上面的列表中只能看到一个 HP 设备。`ID` 提供了制造商和型号,它们以冒号(`:`)分隔。如果你有同一制造商的多个设备,不确定哪个是哪个设备,请拔下摄像头,再次运行 `lsusb` , 看看少了什么。 + +或者... + +拔下摄像头,等待几秒钟,运行命令 `udevadmin monitor --environment` ,然后重新插入摄像头。当你使用的是HP摄像头时,你将看到: + +``` +udevadmin monitor --environment +UDEV [35776.495221] add /devices/pci0000:00/0000:00:1c.3/0000:04:00.0 + /usb3/3-1/3-1:1.0/input/input21/event11 (input) +.MM_USBIFNUM=00 +ACTION=add +BACKSPACE=guess +DEVLINKS=/dev/input/by-path/pci-0000:04:00.0-usb-0:1:1.0-event + /dev/input/by-id/usb-Hewlett_Packard_HP_Webcam_HD_2300-event-if00 +DEVNAME=/dev/input/event11 +DEVPATH=/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/ + usb3/3-1/3-1:1.0/input/input21/event11 +ID_BUS=usb +ID_INPUT=1 +ID_INPUT_KEY=1 +ID_MODEL=HP_Webcam_HD_2300 +ID_MODEL_ENC=HPx20Webcamx20HDx202300 +ID_MODEL_ID=e207 +ID_PATH=pci-0000:04:00.0-usb-0:1:1.0 +ID_PATH_TAG=pci-0000_04_00_0-usb-0_1_1_0 +ID_REVISION=1020 +ID_SERIAL=Hewlett_Packard_HP_Webcam_HD_2300 +ID_TYPE=video +ID_USB_DRIVER=uvcvideo +ID_USB_INTERFACES=:0e0100:0e0200:010100:010200:030000: +ID_USB_INTERFACE_NUM=00 +ID_VENDOR=Hewlett_Packard +ID_VENDOR_ENC=Hewlettx20Packard +ID_VENDOR_ID=03f0 +LIBINPUT_DEVICE_GROUP=3/3f0/e207:usb-0000:04:00.0-1/button +MAJOR=13 +MINOR=75 +SEQNUM=3162 +SUBSYSTEM=input +USEC_INITIALIZED=35776495065 +XKBLAYOUT=es +XKBMODEL=pc105 +XKBOPTIONS= +XKBVARIANT= +``` + +可能看起来有很多信息要处理,但是,看一下这个:列表前面的 `ACTION` 字段, 它告诉你刚刚发生了什么事件,即一个设备被添加到系统中。你还可以在其中几行中看到设备名称的拼写,因此可以非常确定它就是你要找的设备。输出里还显示了制造商的ID(`ID_VENDOR_ID = 03f0`)和型号(`ID_VENDOR_ID = 03f0`)。 + +这为你提供了规则条件部分需要的四个值中的三个。你可能也会想到它还给了你第四个,因为还有一行这样写道: + +``` +SUBSYSTEM=input +``` + +小心!尽管 USB 摄像头确实是提供输入的设备(键盘和鼠标也是),但它也属于 usb 子系统和其他几个子系统。这意味着你的摄像头被添加到了多个子系统,并且看起来像多个设备。如果你选择了错误的子系统,那么你的规则可能无法按你期望的那样工作,或者根本无法工作。 + +因此,第三件事就是检查网络摄像头被添加到的所有子系统,并选择正确的那个。为此,请再次拔下摄像头,然后运行: + +``` +ls /dev/video* +``` + +这将向你显示连接到本机的所有视频设备。如果你使用的是笔记本,大多数笔记本都带有内置摄像头,它可能会显示为 `/dev/video0` 。重新插入摄像头,然后再次运行 `ls /dev/video*`。 + +现在,你应该看到多一个视频设备(可能是`/dev/video1`)。 + +现在,你可以通过运行 `udevadm info -a /dev/video1` 找出它所属的所有子系统: + +``` +udevadm info -a /dev/video1 + +Udevadm info starts with the device specified by the devpath and then +walks up the chain of parent devices. It prints for every device +found, all possible attributes in the udev rules key format. +A rule to match, can be composed by the attributes of the device +and the attributes from one single parent device. + + looking at device '/devices/pci0000:00/0000:00:1c.3/0000:04:00.0 +  /usb3/3-1/3-1:1.0/video4linux/video1': + KERNEL=="video1" + SUBSYSTEM=="video4linux" + DRIVER=="" + ATTR{dev_debug}=="0" + ATTR{index}=="0" + ATTR{name}=="HP Webcam HD 2300: HP Webcam HD" + +[etc...] +``` + +输出持续了相当长的时间,但是你感兴趣的只是开头的部分:`SUBSYSTEM =="video4linux"`。你可以将这行文本直接复制粘贴到你的规则中。输出的其余部分(为简洁未显示)为你提供了更多的信息,例如制造商和型号 ID,同样是以你可以复制粘贴到你的规则中的格式。 + +现在,你有了识别设备的方式吗,并明确了什么事件应该触发该动作,该对设备进行修改了。 + +规则的下一部分,`SYMLINK+="mywebcam", TAG+="systemd", MODE="0666"` 告诉 Udev 做三件事:首先,你要创建设备的符号链接(例如 `/dev/video1` 到 `/dev/mywebcam`。这是因为你无法预测系统默认情况下会把那个设备叫什么。当你拥有内置摄像头并热插拔一个新的时,内置摄像头通常为 `/dev/video0`,而外部摄像头通常为 `/dev/video1`。但是,如果你在插入外部 USB 摄像头的情况下重启计算机,则可能会相反,内部摄像头可能会变成 `/dev/video1` ,而外部摄像头会变成 `/dev/video0`。这想告诉你的是,尽管你的图像捕获脚本(稍后将看到)总是需要指向外部摄像头设备,但是你不能依赖它是 `/dev/video0` 或 `/dev/video1`。为了解决这个问题,你告诉 Udev 创建一个符号链接,该链接在设备被添加到 `video4linux` 子系统的那一刻起就不会再变,你将使你的脚本指向该链接。 + +第二件事就是将 `systemd` 添加到与此规则关联的 Udev 标记列表中。这告诉 Udev,该规则触发的动作将由 systemd 管理,即它将是某种 systemd 服务。 + +注意在这个两种情况下是如何使用 `+=` 运算符的。这会将值添加到列表中,这意味着你可以向 `SYMLINK` 和 `TAG` 添加多个值。 + +另一方面,`MODE` 值只能包含一个值(因此,你可以使用简单的 `=` 赋值运算符)。`MODE` 的作用是告诉 Udev 谁可以读或写该设备。如果你熟悉 `chmod`(你读到此文, 应该会熟悉),你就也会熟悉[如何用数字表示权限][9]。这就是它的含义:`0666` 的含义是 “向所有人授予对设备的读写权限”。 + +最后, `ENV{SYSTEMD_WANTS}="webcam.service"` 告诉 Udev 要运行什么 systemd 服务。 + +将此规则保存到 `/etc/udev/rules.d` 目录名为 `90-webcam.rules`(或类似的名称)的文件中,你可以通过重启机器或运行以下命令来加载它: + +``` +sudo udevadm control --reload-rules && udevadm trigger +``` + +### 最后是服务 + +Udev 规则触发的服务非常简单: + +``` +# webcam.service + +[Service] +Type=simple +ExecStart=/home/[user name]/bin/checkimage.sh +``` + +基本上,它只是运行存储在你个人 `bin/` 中的 `checkimage.sh` 脚本并将其放到后台。[这是你在先前的文章中看过的内容][5]。它看起来似乎很小,但那只是因为它是被 Udev 规则调用的,你刚刚创建了一种特殊的 systemd 单元,称为 `device` 单元。 恭喜。 + +至于 `webcam.service` 调用的 `checkimage.sh` 脚本,有几种方法从摄像头抓取图像并将其与前一个图像进行比较以检查变化(这是 `checkimage.sh` 所做的事),但这是我的方法: + +``` +#!/bin/bash +# This is the checkimage.sh script + +mplayer -vo png -frames 1 tv:// -tv driver=v4l2:width=640:height=480:device= + /dev/mywebcam &>/dev/null +mv 00000001.png /home/[user name]/monitor/monitor.png + +while true +do + mplayer -vo png -frames 1 tv:// -tv driver=v4l2:width=640:height=480:device=/dev/mywebcam &>/dev/null + mv 00000001.png /home/[user name]/monitor/temp.png + + imagediff=`compare -metric mae /home/[user name]/monitor/monitor.png /home/[user name] + /monitor/temp.png /home/[user name]/monitor/diff.png 2>&1 > /dev/null | cut -f 1 -d " "` + if [ `echo "$imagediff > 700.0" | bc` -eq 1 ] + then + mv /home/[user name]/monitor/temp.png /home/[user name]/monitor/monitor.png + fi + + sleep 0.5 +done +``` + +首先使用[MPlayer][10]从摄像头抓取一帧(`00000001.png`)。注意,我们怎样将 `mplayer` 指向 Udev 规则中创建的 `mywebcam` 符号链接,而不是指向 `video0` 或 `video1`。然后,将图像传输到主目录中的 `monitor/` 目录。然后执行一个无限循环,一次又一次地执行相同的操作,但还使用了[Image Magick 的 compare 工具][11]来查看最后捕获的图像与 `monitor/` 目录中已有的图像之间是否存在差异。 + +如果图像不同,则表示摄像头的镜框里某些东西动了。该脚本将新图像覆盖原始图像,并继续比较以等待更多变动。 + +### 插线 + +所有东西准备好后,当你插入摄像头后,你的 Udev 规则将被触发并启动 `webcam.service`。 `webcam.service` 将在后台执行 `checkimage.sh` ,而 `checkimage.sh` 将开始每半秒拍一次照。你会感觉到,因为摄像头的 LED 在每次拍照时将开始闪。 + +与往常一样,如果出现问题,请运行: + +``` +systemctl status webcam.service +``` + +检查你的服务和脚本正在做什么。 + +### 接下来 + +你可能想知道:为什么要覆盖原始图像?当然,系统检测到任何动静,你都想知道发生了什么,对吗?你是对的,但是如你在下一部分中将看到的那样,将它们保持原样,并使用另一种类型的 systemd 单元处理图像将更好,更清晰和更简单。 + +请期待下一篇。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/blog/intro-to-linux/2018/6/systemd-services-reacting-change + +作者:[Paul Brown][a] +选题:[lujun9972][b] +译者:[messon007](https://github.com/messon007) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/users/bro66 +[b]: https://github.com/lujun9972 +[1]: https://www.intel.com/content/www/us/en/products/boards-kits/compute-stick/stk1a32sc.html +[2]: https://www.linux.com/files/images/fig01png +[3]: https://lcom.static.linuxfound.org/sites/lcom/files/fig01.png +[4]: https://www.linux.com/licenses/category/used-permission +[5]: https://linux.cn/article-9700-1.html +[6]: https://linux.cn/article-9703-1.html +[7]: https://www.linux.com/files/images/fig02png +[8]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/fig02.png?itok=esFv4BdM (webcam) +[9]: https://chmod-calculator.com/ +[10]: https://mplayerhq.hu/design7/news.html +[11]: https://www.imagemagick.org/script/compare.php +[12]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux diff --git a/published/202005/20190915 How to Configure SFTP Server with Chroot in Debian 10.md b/published/202005/20190915 How to Configure SFTP Server with Chroot in Debian 10.md new file mode 100644 index 0000000000..51a75f3521 --- /dev/null +++ b/published/202005/20190915 How to Configure SFTP Server with Chroot in Debian 10.md @@ -0,0 +1,199 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12186-1.html) +[#]: subject: (How to Configure SFTP Server with Chroot in Debian 10) +[#]: via: (https://www.linuxtechi.com/configure-sftp-chroot-debian10/) +[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) + +如何在 Debian 10 中配置 Chroot 环境的 SFTP 服务 +====== + +SFTP 意思是“安全文件传输协议Secure File Transfer Protocol” 或 “SSH 文件传输协议SSH File Transfer Protocol”,它是最常用的用于通过 `ssh` 将文件从本地系统安全地传输到远程服务器的方法,反之亦然。`sftp` 的主要优点是,除 `openssh-server` 之外,我们不需要安装任何额外的软件包,在大多数的 Linux 发行版中,`openssh-server` 软件包是默认安装的一部分。`sftp` 的另外一个好处是,我们可以允许用户使用 `sftp` ,而不允许使用 `ssh` 。 + +![](https://img.linux.net.cn/data/attachment/album/202005/05/223518ip4mbdi4nggbdtgu.jpg) + +当前发布的 Debian 10 代号为 ‘Buster’,在这篇文章中,我们将演示如何在 Debian 10 系统中在 “监狱式的” Chroot 环境中配置 `sftp`。在这里,Chroot 监狱式环境意味着,用户不能超出各自的家目录,或者用户不能从各自的家目录更改目录。下面实验的详细情况: + +* OS = Debian 10 +* IP 地址 = 192.168.56.151 + +让我们跳转到 SFTP 配置步骤, + +### 步骤 1、使用 groupadd 命令给 sftp 创建一个组 + +打开终端,使用下面的 `groupadd` 命令创建一个名为的 `sftp_users` 组: + +``` +root@linuxtechi:~# groupadd sftp_users +``` + +### 步骤 2、添加用户到组 sftp_users 并设置权限 + +假设你想创建新的用户,并且想添加该用户到 `sftp_users` 组中,那么运行下面的命令, + +**语法:** + +``` +# useradd -m -G sftp_users <用户名> +``` + +让我们假设用户名是 `jonathan`: + +``` +root@linuxtechi:~# useradd -m -G sftp_users jonathan +``` + +使用下面的 `chpasswd` 命令设置密码: + +``` +root@linuxtechi:~# echo "jonathan:<输入密码>" | chpasswd +``` + +假设你想添加现有的用户到 `sftp_users` 组中,那么运行下面的 `usermod` 命令,让我们假设已经存在的用户名称是 `chris`: + +``` +root@linuxtechi:~# usermod -G sftp_users chris +``` + +现在设置用户所需的权限: + +``` +root@linuxtechi:~# chown root /home/jonathan /home/chris/ +``` + +在各用户的家目录中都创建一个上传目录,并设置正确地所有权: + +``` +root@linuxtechi:~# mkdir /home/jonathan/upload +root@linuxtechi:~# mkdir /home/chris/upload +root@linuxtechi:~# chown jonathan /home/jonathan/upload +root@linuxtechi:~# chown chris /home/chris/upload +``` + +**注意:** 像 Jonathan 和 Chris 之类的用户可以从他们的本地系统上传文件和目录。 + +### 步骤 3、编辑 sftp 配置文件 /etc/ssh/sshd_config + +正如我们已经陈述的,`sftp` 操作是通过 `ssh` 完成的,所以它的配置文件是 `/etc/ssh/sshd_config`,在做任何更改前,我建议首先备份文件,然后再编辑该文件,接下来添加下面的内容: + +``` +root@linuxtechi:~# cp /etc/ssh/sshd_config /etc/ssh/sshd_config-org +root@linuxtechi:~# vim /etc/ssh/sshd_config +...... +#Subsystem sftp /usr/lib/openssh/sftp-server +Subsystem sftp internal-sftp + +Match Group sftp_users + X11Forwarding no + AllowTcpForwarding no + ChrootDirectory %h + ForceCommand internal-sftp +...... +``` + +保存并退出文件。 + +为使上述更改生效,使用下面的 `systemctl` 命令来重新启动 `ssh` 服务: + +``` +root@linuxtechi:~# systemctl restart sshd +``` + +在上面的 `sshd_config` 文件中,我们已经注释掉了以 `Subsystem` 开头的行,并添加了新的条目 `Subsystem sftp internal-sftp` 和新的行。而 + +`Match Group sftp_users` –> 它意味着如果用户是 `sftp_users` 组中的一员,那么将应用下面提到的规则到这个条目。 + +`ChrootDierctory %h` –> 它意味着用户只能在他们自己各自的家目录中更改目录,而不能超出他们各自的家目录。或者换句话说,我们可以说用户是不允许更改目录的。他们将在他们的目录中获得监狱一样的环境,并且不能访问其他用户的目录和系统的目录。 + +`ForceCommand internal-sftp` –> 它意味着用户仅被限制到只能使用 `sftp` 命令。 + +### 步骤 4、测试和验证 sftp + +登录到你的 `sftp` 服务器的同一个网络上的任何其它的 Linux 系统,然后通过我们放入 `sftp_users` 组中的用户来尝试 ssh 和 sftp 服务。 + +``` +[root@linuxtechi ~]# ssh root@linuxtechi +root@linuxtechi's password: +Write failed: Broken pipe +[root@linuxtechi ~]# ssh root@linuxtechi +root@linuxtechi's password: +Write failed: Broken pipe +[root@linuxtechi ~]# +``` + +以上操作证实用户不允许 `ssh` ,现在使用下面的命令尝试 `sftp`: + +``` +[root@linuxtechi ~]# sftp root@linuxtechi +root@linuxtechi's password: +Connected to 192.168.56.151. +sftp> ls -l +drwxr-xr-x 2 root 1001 4096 Sep 14 07:52 debian10-pkgs +-rw-r--r-- 1 root 1001 155 Sep 14 07:52 devops-actions.txt +drwxr-xr-x 2 1001 1002 4096 Sep 14 08:29 upload +``` + +让我们使用 sftp 的 `get` 命令来尝试下载一个文件: + +``` +sftp> get devops-actions.txt +Fetching /devops-actions.txt to devops-actions.txt +/devops-actions.txt 100% 155 0.2KB/s 00:00 +sftp> +sftp> cd /etc +Couldn't stat remote file: No such file or directory +sftp> cd /root +Couldn't stat remote file: No such file or directory +sftp> +``` + +上面的输出证实我们能从我们的 sftp 服务器下载文件到本地机器,除此之外,我们也必须测试用户不能更改目录。 + +让我们在 `upload` 目录下尝试上传一个文件: + +``` +sftp> cd upload/ +sftp> put metricbeat-7.3.1-amd64.deb +Uploading metricbeat-7.3.1-amd64.deb to /upload/metricbeat-7.3.1-amd64.deb +metricbeat-7.3.1-amd64.deb 100% 38MB 38.4MB/s 00:01 +sftp> ls -l +-rw-r--r-- 1 1001 1002 40275654 Sep 14 09:18 metricbeat-7.3.1-amd64.deb +sftp> +``` + +这证实我们已经成功地从我们的本地系统上传一个文件到 sftp 服务中。 + +现在使用 winscp 工具来测试 sftp 服务,输入 sftp 服务器 IP 地址和用户的凭证: + +![][3] + +在 “Login” 上单击,然后尝试下载和上传文件: + +![][4] + +现在,在 `upload` 文件夹中尝试上传文件: + +![][5] + +上面的窗口证实上传是完好地工作的,这就是这篇文章的全部。如果这些步骤能帮助你在 Debian 10 中使用 chroot 环境配置 SFTP 服务器s,那么请分享你的反馈和评论。 + +-------------------------------------------------------------------------------- + +via: https://www.linuxtechi.com/configure-sftp-chroot-debian10/ + +作者:[Pradeep Kumar][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linuxtechi.com/author/pradeep/ +[b]: https://github.com/lujun9972 +[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 +[2]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Configure-sftp-debian10.jpg +[3]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Winscp-sftp-debian10.jpg +[4]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Download-file-winscp-debian10-sftp.jpg +[5]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Upload-File-using-winscp-Debian10-sftp.jpg diff --git a/published/202005/20200222 How to install TT-RSS on a Raspberry Pi.md b/published/202005/20200222 How to install TT-RSS on a Raspberry Pi.md new file mode 100644 index 0000000000..e3f83399d4 --- /dev/null +++ b/published/202005/20200222 How to install TT-RSS on a Raspberry Pi.md @@ -0,0 +1,227 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12264-1.html) +[#]: subject: (How to install TT-RSS on a Raspberry Pi) +[#]: via: (https://opensource.com/article/20/2/ttrss-raspberry-pi) +[#]: author: (Patrick H. Mullins https://opensource.com/users/pmullins) + +怎样在树莓派上安装 TT-RSS +====== + +> 使用 Tiny Tiny RSS 来保护你阅读新闻馈送时的隐私。 + +![](https://img.linux.net.cn/data/attachment/album/202005/29/230337vmazkl65hh61l0qq.png) + +[Tiny Tiny RSS][2](TT-RSS)是一个自由开源的基于 Web 的新闻馈送feed(RSS/Atom)阅读器和聚合工具。它非常适合那些注重隐私,并且仍然依赖 RSS 来获取日常新闻的人。TT-RSS 是自行托管的软件,因此你可以 100% 的掌控你的服务器、数据以及你的全部隐私。它还支持大量的插件、扩展和主题。你喜欢黑暗模式的界面?没问题。想基于关键词过滤发来的消息?TT-RSS 也能让你得偿所愿。 + +![Tiny Tiny RSS screenshot][3] + +现在你知道 TT-RSS 是什么了,那么为什么你可能会想用它。我会讲述要把它安装到树莓派或 Debian 10 服务器上你需要了解的所有的东西。 + +### 安装和配置 TT-RSS + +要把 TT-RSS 安装到树莓派上,你还需要安装和配置最新版本的 PHP(本文撰写时 PHP 最新版本是 7.3)、后端数据库 PostgreSQL、Nginx web 服务器、Git,最后才是 TT-RSS。 + +#### 1、安装 PHP 7 + +安装 PHP 7 是整个过程中最复杂的部分。幸运的是,它并不像看起来那样困难。从安装下面的支持包开始: + +``` +$ sudo apt install -y ca-certificates apt-transport-https +``` + +现在,添加存储库 PGP 密钥: + +``` +$ wget -q https://packages.sury.org/php/apt.gpg -O- | sudo apt-key add - +``` + +下一步,把 PHP 库添加到你的 apt 源: + +``` +$ echo "deb https://packages.sury.org/php/ buster main" | sudo tee /etc/apt/sources.list.d/php.list +``` + +然后更新你的存储库索引: + +``` +$ sudo apt update +``` + +最后,安装 PHP 7.3(或最新版本)和一些通用组件: + +``` +$ sudo apt install -y php7.3 php7.3-cli php7.3-fpm php7.3-opcache php7.3-curl php7.3-mbstring php7.3-pgsql php7.3-zip php7.3-xml php7.3-gd php7.3-intl +``` + +上面的命令默认你使用的后端数据库是 PostgreSQL,会安装 `php7.3-pgsql`。如果你想用 MySQL 或 MariaDB,你可以把命令参数改为 `php7.3-mysql`。 + +下一步,确认 PHP 已安装并在你的树莓派上运行着: + +``` +$ php -v +``` + +现在是时候安装和配置 Web 服务器了。 + +#### 2、安装 Nginx + +可以用下面的命令安装 Nginx: + +``` +$ sudo apt install -y nginx +``` + +修改默认的 Nginx 虚拟主机配置,这样 Web 服务器才能识别 PHP 文件以及知道如何处理它们。 + +``` +$ sudo nano /etc/nginx/sites-available/default +``` + +你可以安全地删除原文件中的所有内容,用下面的内容替换: + +``` +server { + listen 80 default_server; + listen [::]:80 default_server; + + root /var/www/html; + index index.html index.htm index.php; + server_name _; + + location / { + try_files $uri $uri/ =404; + } + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/run/php/php7.3-fpm.sock; + } + +} +``` + +按 `Ctrl+O` 保存修改后的配置文件,然后按 `Ctrl+X` 退出 Nano。你可以用下面的命令测试你的新配置文件: + + +``` +$ nginx -t +``` + +如果没有报错,重启 Nginx 服务: + +``` +$ systemctl restart nginx +``` + +#### 3、安装 PostgreSQL + +接下来是安装数据库服务器。在树莓派上安装 PostgreSQL 超级简单: + +``` +$ sudo apt install -y postgresql postgresql-client postgis +``` + +输入下面的命令看一下数据库服务器安装是否成功: + +``` +$ psql --version +``` + +#### 4、创建 Tiny Tiny RSS 数据库 + +在做其他事之前,你需要创建一个数数据库,用来给 TT-RSS 软件保存数据。首先,登录 PostgreSQL 服务器: + +``` +sudo -u postgres psql +``` + +下一步,新建一个用户,设置密码: + +``` +CREATE USER username WITH PASSWORD 'your_password' VALID UNTIL 'infinity'; +``` + +然后创建一个给 TT-RSS 用的数据库: + + +``` +CREATE DATABASE tinyrss; +``` + +最后,给新建的用户赋最高权限: + +``` +GRANT ALL PRIVILEGES ON DATABASE tinyrss to user_name; +``` + +这是安装数据库的步骤。你可以输入 `\q` 来退出 `psql` 程序。 + +#### 5、安装 Git + +安装 TT-RSS 需要用 Git,所以输入下面的命令安装 Git: + +``` +$ sudo apt install git -y +``` + +现在,进入到 Nginx 服务器的根目录: + +``` +$ cd /var/www/html +``` + +下载 TT-RSS 最新源码: + +``` +$ git clone https://git.tt-rss.org/fox/tt-rss.git tt-rss +``` + +注意,这一步会创建一个 `tt-rss` 文件夹。 + +#### 6、安装和配置Tiny Tiny RSS + +现在是安装和配置你的新 TT-RSS 服务器的最后时刻了。首先,确认下你在浏览器中能打开 `http://your.site/tt-rss/install/index.php`。如果浏览器显示 `403 Forbidden`,那么就证明 `/var/www/html` 文件夹的权限没有设置正确。下面的命令通常能解决这个问题: + +``` +$ chmod 755 /var/www/html/ -v +``` + +如果一切正常,你会看到 TT-RSS 安装页面,它会让你输入一些数据的信息。你只需要输入前面你创建的数据库用户名和密码;数据库名;主机名填 `localhost`;端口填 `5432`。 + +点击“Test Configuration”。如果一切正常,你会看到一个标记着“Initialize Database”的红色按钮。点击它来开始安装。结束后,你会看到一个配置文件,你可以把它复制到 TT-RSS 的目录,另存为 `config.php`。 + +安装过程结束后,浏览器输入 `http://yoursite/tt-rss/` 打开 TT-RSS,使用默认的凭证登录(用户名:`admin`,密码:`password`)。登录后系统会提示你修改密码。我强烈建议你尽快修改密码。 + +### 配置 TT-RSS + +如果一切正常,你现在就可以开始使用 TT-RSS 了。建议你新建一个非管理员用户,使用新用户名登录,并开始导入你的馈送、订阅,按照你的意愿来配置它。 + +最后,并且是超级重要的事,不要忘了阅读 TT-RSS 维基上的 [Updating Feeds][4] 部分。它讲述了如何创建一个简单的 systemd 服务来更新馈送。如果你跳过了这一步,你的 RSS 馈送就不会自动更新。 + +### 总结 + +呵!工作量不小,但是你做完了!你现在有自己的 RSS 聚合服务器了。想了解 TT-RSS 更多的知识?我推荐你去看官方的 [FAQ][5]、[支持][6]论坛,和详细的[安装][7]笔记。如果你有任何问题,尽情地在下面评论吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/ttrss-raspberry-pi + +作者:[Patrick H. Mullins][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/pmullins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life-raspberrypi_0.png?itok=Kczz87J2 (Raspberries with pi symbol overlay) +[2]: https://tt-rss.org/ +[3]: https://opensource.com/sites/default/files/uploads/tt-rss.jpeg (Tiny Tiny RSS screenshot) +[4]: https://tt-rss.org/wiki/UpdatingFeeds +[5]: https://tt-rss.org/wiki/FAQ +[6]: https://community.tt-rss.org/c/tiny-tiny-rss/support +[7]: https://tt-rss.org/wiki/InstallationNotes diff --git a/published/202005/20200317 Create Stunning Pixel Art With Free and Open Source Editor Pixelorama.md b/published/202005/20200317 Create Stunning Pixel Art With Free and Open Source Editor Pixelorama.md new file mode 100644 index 0000000000..7a267a672e --- /dev/null +++ b/published/202005/20200317 Create Stunning Pixel Art With Free and Open Source Editor Pixelorama.md @@ -0,0 +1,105 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12173-1.html) +[#]: subject: (Create Stunning Pixel Art With Free and Open Source Editor Pixelorama) +[#]: via: (https://itsfoss.com/pixelorama/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +使用 Pixelorama 创建令人惊叹的像素艺术 +====== + +> Pixelorama 是一个跨平台、自由开源的 2D 精灵编辑器。它在一个整洁的用户界面中提供了创建像素艺术所有必要工具。 + +### Pixelorama:开源 Sprite 编辑器 + +[Pixelorama][1] 是 [Orama 互动][2]公司的年轻游戏开发人员创建的一个工具。他们已经开发了一些 2D 游戏,其中一些使用了像素艺术。 + +虽然 Orama 主要从事于游戏开发,但开发人员也创建实用工具,帮助他们(和其他人)创建这些游戏。 + +自由开源的精灵Sprite编辑器 Pixelorama 就是这样一个实用工具。它构建在 [Godot 引擎][3]之上,非常适合创作像素艺术。 + +![Pixelorama screenshot][4] + +你看到上面截图中的像素艺术了吗?它是使用 Pixelorama 创建的。这段视频展示了制作上述图片的时间推移视频。 + +### Pixelorama 的功能 + +以下是 Pixelorama 提供的主要功能: + + * 多种工具,如铅笔、橡皮擦、填充桶、取色器等 + * 多层系统,你可以根据需要添加、删除、上下移动、克隆和合并多个层 + * 支持 Spritesheets + * 导入图像并在 Pixelorama 中编辑它们 + * 带有 [Onion Skinning][5] 的动画时间线 + * 自定义画笔 + * 以 Pixelorama 的自定义文件格式 .pxo 保存并打开你的项目 + * 水平和垂直镜像绘图 + * 用于创建图样的磁贴模式 + * 拆分屏幕模式和迷你画布预览 + * 使用鼠标滚轮缩放 + * 无限次撤消和重做 + * 缩放、裁剪、翻转、旋转、颜色反转和去饱和图像 + * 键盘快捷键 + * 提供多种语言 + * 支持 Linux、Windows 和 macOS + +### 在 Linux 上安装 Pixelorama + +Pixelorama 提供 Snap 应用,如果你使用的是 Ubuntu,那么可以在软件中心找到它。 + +![Pixelorama is available in Ubuntu Software Center][6] + +或者,如果你在 [Linux 发行版上启用了 Snap 支持][7],那么可以使用此命令安装它: + +``` +sudo snap install pixelorama +``` + +如果你不想使用 Snap,不用担心。你可以从[他们的 GitHub 仓库][8]下载最新版本的 Pixelorama,[解压 zip 文件][9],你会看到一个可执行文件。授予此文件执行权限,并双击它运行应用。 + +- [下载 Pixelorama][10] + +### 总结 + +![Pixelorama Welcome Screen][11] + +在 Pixeloaram 的功能中,它说你可以导入图像并对其进行编辑。我想,这只是对某些类型的文件,因为当我尝试导入 PNG 或 JPEG 文件,程序崩溃了。 + +然而,我可以像一个 3 岁的孩子那样随意涂鸦并制作像素艺术。我对艺术不是很感兴趣,但我认为这[对 Linux 上的数字艺术家是个有用的工具][12]。 + +我喜欢这样的想法:尽管是游戏开发人员,但他们创建的工具,可以帮助其他游戏开发人员和艺术家。这就是开源的精神。 + +如果你喜欢这个项目,并且会使用它,请考虑通过捐赠来支持他们。[It’s FOSS 捐赠了][13] 25 美元,以感谢他们的努力。 + +- [向 Pixelorama 捐赠(主要开发者的个人 Paypal 账户)][14] + +你喜欢 Pixelorama 吗?你是否使用其他开源精灵编辑器?请随时在评论栏分享你的观点。 + +-------------------------------------------------------------------------------- +via: https://itsfoss.com/pixelorama/ + +作者:[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://www.orama-interactive.com/pixelorama +[2]: https://www.orama-interactive.com/ +[3]: https://godotengine.org/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/pixelorama-v6.jpg?ssl=1 +[5]: https://en.wikipedia.org/wiki/Onion_skinning +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/pixelorama-ubuntu-software-center.jpg?ssl=1 +[7]: https://itsfoss.com/install-snap-linux/ +[8]: https://github.com/Orama-Interactive/Pixelorama +[9]: https://itsfoss.com/unzip-linux/ +[10]: https://github.com/Orama-Interactive/Pixelorama/releases +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/pixelorama.jpg?ssl=1 +[12]: https://itsfoss.com/best-linux-graphic-design-software/ +[13]: https://itsfoss.com/donations-foss/ +[14]: https://www.paypal.me/erevos diff --git a/published/202005/20200323 How to create a personal file server with SSH on Linux.md b/published/202005/20200323 How to create a personal file server with SSH on Linux.md new file mode 100644 index 0000000000..14abf4cc64 --- /dev/null +++ b/published/202005/20200323 How to create a personal file server with SSH on Linux.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12255-1.html) +[#]: subject: (How to create a personal file server with SSH on Linux) +[#]: via: (https://opensource.com/article/20/3/personal-file-server-ssh) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +怎样在 Linux 下用 SSH 搭建个人文件服务器 +====== + +> 通过 SSH 连接远程 Linux 系统很简单。下面是教程。 + +![](https://img.linux.net.cn/data/attachment/album/202005/27/120338v62cakrqnccpjckk.jpg) + +树莓派是一个有用且价格低廉的家庭服务器,可用于很多事情。我的树莓派最常用来做[打印服务器][2],可以在我的家庭网络中共享激光打印机,或作为个人文件服务器保存项目副本和其他数据。 + +我的文件服务器有很多用途。假设说我现在有一个项目,比如一本新书,我想把我的工作和所有相关的文件都复制一份快照。这种场景下,我只需要把 `BookProject` 文件夹复制到文件服务器的 `BookBackup` 文件夹。 + +或者我现在正在清理我的本地文件时,发现一些我不需要的文件,但是我不确定是否要删除,我会把它们复制到文件服务器的 `KeepForLater` 文件夹。这是我日常 Linux 系统中清除杂乱的文件,并将不常用的文件卸载到个人文件服务器上的方便方法。 + +用树莓派或其他 Linux 系统搭建个人文件服务器不需要配置 NFS(网络文件系统Network File System>)或 CIFS(通用互联网文件系统Common Internet File System)或改造其他的文件共享系统如 WebDAV。你可以很轻松的使用 SSH 来搭建远程文件服务器。下面是教程。 + +### 在远程服务器上配置 SSHD + +你的 Linux 系统可能已经安装了 SSH 守护进程(`sshd`),甚至它已经默认运行了。如果没有,你可以使用你 Linux 发行版本上的任何控制面板来轻松配置 SSH。我在树莓派上运行了 [Fedora ARM][3],通过 Web 浏览器访问树莓派的 9090 端口,我可以远程访问控制面板。(在我的家庭网络中,树莓派的 IP 地址是 `10.0.0.11`,因此我连接的是 `10.0.0.11:9090`。)如果 SSH 守护进程没有默认运行,你可以在控制面板的“服务”里把它设置为开机启动。 + +![sshd in the list of system services][4] + +你可以在系统服务列表里找到 `sshd`。 + +![slider to activate sshd][5] + +如果 `sshd` 没有开启,点击切换按钮打开它。 + +### 你有账号吗? + +你需要有个远程系统的账号。它可以与你本地系统的账号相同,也可以不同。 + +在流行的 Raspbian 发行版本上,默认的账号名是 `pi`。但是其他的 Linux 发行版本可能需要你在安装系统时就设置一个唯一的新用户。如果你不知道你的用户名,你可以用系统的控制面板创建一个。在我的树莓派上,我创建了一个 `jhall` 账号,与我日常用的 Linux 桌面机器的用户名相同。 + +![Set up a new account on Fedora Server][6] + +如果你用的是 Fedora 服务器,你可以点击“创建新账号”按钮。 + +![Set password or SSH key][7] + +不要忘记设置密码或添加公钥。 + +### 可选:添加公钥 + +如果你把公钥添加到远程 Linux 系统上,你就可以不使用密码登录。这一步是可选的;如果你愿意,你仍可以用密码登录。 + +你可以在下面的文章中学到更多关于 SSH 密钥的信息: + +* [SSH 密钥管理工具][8] +* [用 Seahorse 对 SSH 密钥进行图形化管理][9] +* [如何管理多个 SSH 密钥][10] +* [使用 GPG 密钥作为鉴权依据开启 SSH 访问][11] + +### 创建文件管理器的快捷方式 + +现在你已经在远程系统上启动 SSH 守护进程了,也设置了用户名和密码,最后一步就是在你本地的文件管理器中创建一个快捷方式,地址映射到远程 Linux 系统。我的桌面是 GNOME,但是在其他的 Linux 桌面上的基本操作步骤都是一样的。 + +#### 建立初始连接 + +在 GNOME 的文件管理器中,在左边导航栏找到 “+其它位置” 按钮。点击它会出现一个 “连接到服务器” 提示框。在框中输入远程 Linux 服务器的地址,地址以 SSH 连接协议开头。 + +![Creating a shortcut in GNOME file manager][12] + +GNOME 文件管理器支持多种连接协议。要通过 SSH 进行连接,服务器地址请以 `sftp://` 或 `ssh://` 开头。 + +如果你远程 Linux 系统的用户名与本地的相同,那么你只需要输入服务器的地址和文件夹路径就可以了。比如要连接到我的树莓派的 `/home/jhall` 目录,我输入: + +``` +sftp://10.0.0.11/home/jhall +``` + +![GNOME file manager Connect to Server][13] + +如果你远程 Linux 系统的用户名与本地的不同,你可以在远程系统地址前加 `@` 符号来指定远程系统的用户名。要连接到远程的 Raspbian 系统,你可能要输入: + +``` +sftp://pi@10.0.0.11/home/pi +``` + +![GNOME file manager Connect to Server][14] + +如果你没有把公钥添加到远程服务器,那么你需要输入密码。如果你已经添加,GNOME 文件管理器应该会自动打开远程系统上的文件夹来让你跳转到不同的目录。 + +![GNOME file manager connection][15] + +#### 创建一个快捷方式,之后就可以轻松连接服务器 + +在 GNOME 文件管理器中,这很简单。右击导航栏中远程系统的名字,选择“添加书签”。这一步操作就创建了连接到远程路径的快捷方式。 + +![GNOME file manager - adding bookmark][16] + +如果你想把标签中的快捷方式改成一个更容易记的名字,你可以右击快捷方式选择“重命名”。 + +### 总结 + +通过 SSH 连接到远程 Linux 系统是很简单的事。你可以用相同的方式连接到家庭文件服务器以外的其他系统。我还创建了一个能让我立即访问我的提供商 Web 服务器上的文件的快捷方式,和另一个能迅速打开我的项目服务器的文件夹的快捷方式。SSH 使它成为一个安全的连接;所有的传输都是加密的。当我通过 SSH 打开远程的文件时,我可以像在本地操作一样使用 GNOME 文件管理器轻松打开远程文件。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/3/personal-file-server-ssh + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer) +[2]: https://opensource.com/article/18/3/print-server-raspberry-pi +[3]: https://arm.fedoraproject.org/ +[4]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-sshd.png (sshd in the list of system services) +[5]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-sshd-service.png (slider to activate sshd) +[6]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-accounts_create-user.png (Set up a new account on Fedora Server) +[7]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-accounts.png (Set password or SSH key) +[8]: https://linux.cn/article-11947-1.html +[9]: https://linux.cn/article-9451-1.html +[10]: https://opensource.com/article/19/4/gpg-subkeys-ssh-manage +[11]: https://opensource.com/article/19/4/gpg-subkeys-ssh +[12]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-other-locations.png (Creating a shortcut in GNOME file manager) +[13]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-other-sftp.png (GNOME file manager Connect to Server) +[14]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-other-sftp-username.png (GNOME file manager Connect to Server) +[15]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-remote-jhall.png (GNOME file manager connection) +[16]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-remote-jhall-add-bookmark.png (GNOME file manager - adding bookmark) diff --git a/published/202005/20200324 Audacious 4.0 Released With Qt 5- Here-s How to Install it on Ubuntu.md b/published/202005/20200324 Audacious 4.0 Released With Qt 5- Here-s How to Install it on Ubuntu.md new file mode 100644 index 0000000000..8b46842802 --- /dev/null +++ b/published/202005/20200324 Audacious 4.0 Released With Qt 5- Here-s How to Install it on Ubuntu.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12250-1.html) +[#]: subject: (Audacious 4.0 Released With Qt 5: Here’s How to Install it on Ubuntu) +[#]: via: (https://itsfoss.com/audacious-4-release/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +如何安装使用 Qt 5 的音频播放器 Audacious 4.0 +====== + +[Audacious][1] 是一个开源音频播放器,可用于包括 Linux 在内的多个平台。继上次发布主版本将近 2 年后,Audacious 4.0 带来了一些重大变化。 + +最新版本的 Audacious 4.0 默认带 [Qt 5][2] 用户界面。你仍然可以和以前一样使用旧的 GTK2 UI,但是,新功能仅会添加到 Qt UI 中。 + +让我们看下发生了什么变化,以及如何在 Linux 系统上安装最新的 Audacious。 + +### Audacious 4.0 关键变化和功能 + +![Audacious 4 Release][3] + +当然,主要的变化是默认使用 Qt 5 UI。除此之外,他们的[官方公告][4]中提到了许多改进和功能补充,它们是: + +* 单击播放列表列头可对播放列表进行排序 +* 拖动播放列表列头会更改列顺序 +* 应用中的音量和时间步长设置 +* 隐藏播放列表标签的新选项 +* 按路径对播放列表排序,现在将文件夹排序在文件后面 +* 实现了额外的 MPRIS 调用,以与 KDE 5.16+ 兼容 +* 新的基于 OpenMPT 的跟踪器模块插件 +* 新的 VU Meter 可视化插件 +* 添加了使用 SOCKS 网络代理的选项 +* 换歌插件现在可在 Windows 上使用 +* 新的“下一张专辑”和“上一张专辑”命令 +* Qt UI 中的标签编辑器现在可以一次编辑多个文件 +* 为 Qt UI 实现均衡器预设窗口 +* 歌词插件获得了在本地保存和加载歌词的能力 +* 模糊范围和频谱分析器可视化已移植到 Qt +* MIDI 插件 “SoundFont 选择”已移植到 Qt +* JACK 输出插件获得了一些新选项 +* 添加了无限循环 PSF 文件的选项 + +如果你以前不了解它,你可以轻松安装它,并使用均衡器和 [LADSP][5] 效果器来调整音乐体验。 + +![Audacious Winamp Classic Interface][6] + +### 如何在 Ubuntu 上安装 Audacious 4.0 + +值得注意的是,[非官方 PPA][7] 是由 [UbuntuHandbook][8] 提供的。你可以按照以下说明在 Ubuntu 16.04、18.04、19.10 和 20.04 上进行安装。 + +1、首先,你必须在终端中输入以下命令将 PPA 添加到系统中: + +``` +sudo add-apt-repository ppa:ubuntuhandbook1/apps +``` + +2、接下来,你需要从仓库中更新(刷新)软件包信息,然后继续安装该应用。方法如下: + +``` +sudo apt update +sudo apt install audacious audacious-plugins +``` + +就是这样。你无需执行其他任何操作。无论什么情况,如果你想[删除 PPA 和软件][9],只需按顺序输入以下命令: + +``` +sudo add-apt-repository --remove ppa:ubuntuhandbook1/apps +sudo apt remove --autoremove audacious audacious-plugins +``` + +你也可以在它的 GitHub 页面上查看有关源码的更多信息,并根据需要在其他 Linux 发行版上进行安装。 + +- [Audacious 源代码][10] + +### 总结 + +新功能和 Qt 5 UI 开关对于改善用户体验和音频播放器的功能应该是一件好事。如果你是经典 Winamp 界面的粉丝,它也可以正常工作。但缺少其公告中提到的一些功能。 + +你可以尝试一下,并在下面的评论中让我知道你的想法! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/audacious-4-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://audacious-media-player.org +[2]: https://doc.qt.io/qt-5/qt5-intro.html +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/audacious-4-release.jpg?ssl=1 +[4]: https://audacious-media-player.org/news/45-audacious-4-0-released +[5]: https://www.ladspa.org/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/audacious-winamp.jpg?ssl=1 +[7]: https://itsfoss.com/ppa-guide/ +[8]: http://ubuntuhandbook.org/index.php/2020/03/audacious-4-0-released-qt5-ui/ +[9]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ +[10]: https://github.com/audacious-media-player/audacious diff --git a/published/202005/20200326 Tricks for getting around your Linux file system.md b/published/202005/20200326 Tricks for getting around your Linux file system.md new file mode 100644 index 0000000000..d9d6cf1006 --- /dev/null +++ b/published/202005/20200326 Tricks for getting around your Linux file system.md @@ -0,0 +1,142 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12239-1.html) +[#]: subject: (Tricks for getting around your Linux file system) +[#]: via: (https://www.networkworld.com/article/3533421/tricks-for-getting-around-your-linux-file-system.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +在 Linux 文件系统中导航的技巧 +====== + +> cd 命令可能是任何 Linux 用户学习的前 10 个命令之一,但这并不是在 Linux 文件系统中导航的唯一方法,这里还有其他一些方法。 + +![](https://img.linux.net.cn/data/attachment/album/202005/22/114058yrzlx94rz9lbx974.jpg) + +无论你是在文件系统中四处查看、寻找文件还是尝试进入重要目录,Linux 都可以提供很多帮助。在本文中,我们将介绍一些技巧,使你可以在文件系统中移动,查找和使用所需的命令也更加轻松。 + +### 添加到 \$PATH + +确保你不必花费大量时间在 Linux 系统上查找命令的最简单、最有用的方法之一就是在 `$PATH` 变量中添加适当的目录。但是,添加到 `$PATH` 变量中的目录顺序非常重要。它们确定系统在目录中查找要运行命令的目录顺序--在找到第一个匹配项时停止。 + +例如,你可能希望将家目录放在第一个,这样,如果你创建的脚本与其他可执行文件有相同的名称,那么只要输入该脚本的名称,它便会运行。 + +要将家目录添加到 `$PATH` 变量中,可以执行以下操作: + +``` +$ export PATH=~:$PATH +``` + +`~` 字符代表家目录。 + +如果将脚本保存在 `bin` 目录中,下面的会有效: + +``` +$ export PATH=~/bin:$PATH +``` + +然后,你可以运行位于家目录中的脚本,如下所示: + +``` +$ myscript +Good morning, you just ran /home/myacct/bin/myscript +``` + +**重要提示:**上面显示的命令会添加到你的搜索路径中,因为 `$PATH`(当前路径)被包含在内。它们不会覆盖它。你的搜索路径应该在你的 `.bashrc` 文件中配置,任何你打算永久化的更改也应该添加到那里。 + +### 使用符号链接 + +符号链接提供了一种简单而明显的方式来记录可能经常需要使用的目录的位置。例如,如果你管理网站的内容,那么可能需要通过创建如下链接来使你的帐户“记住”网页文件的位置: + +``` +ln -s /var/www/html www +``` + +参数的顺序很重要。第一个(`/var/www/html`)是目标,第二个是你创建的链接的名称。如果你当前不在家目录中,那么以下命令将执行相同的操作: + +``` +ln -s /var/www/html ~/www +``` + +设置好之后,你可以使用 `cd www` 进入 `/var/www/html`。 + +### 使用 shopt + +`shopt` 命令还提供了一种让移动到其他目录更加容易的方法。当你使用 `shopt` 的 `autocd` 选项时,只需输入名称即可转到目录。例如: + +``` +$ shopt -s autocd +$ www +cd -- www +/home/myacct/www +$ pwd -P +/var/www/html + +$ ~/bin +cd -- /home/myacct/bin +$ pwd +/home/myacct/bin +``` + +在上面的第一组命令中,启用了 `shopt` 命令的 `autocd` 选项。输入 `www`,就会调用 `cd www` 命令。由于此符号链接是在上面的 `ln` 命令示例之一中创建的,因此将我们移至 `/var/www/html`。 `pwd -P` 命令显示实际位置。 + +在第二组中,键入 `~/bin` 会调用 `cd` 进入在用户家目录的 `bin` 目录。 + +请注意,当你输入的是命令时,`autocd` 行为将*不会*生效,即使它也是目录的名称。 + +`shopt` 是 bash 内置命令,它有很多选项。这只是意味着你不必在要进入每个目录的名称之前输入 `cd`。 + +要查看 `shopt` 的其他选项,只需输入 `shopt`。 + +### 使用 \$CDPATH + +可能进入特定目录的最有用技巧之一,就是将你希望能够轻松进入的路径添加到 `$CDPATH` 中。这将创建一个目录列表,只需输入完整路径名的一部分即可进入。 + +一方面,这可能有点棘手。你的 `$CDPATH` 需要包含要移动到的目录的父目录,而不是目录本身。 + +例如,假设你希望仅通过输入 `cd html` 就可以移至 `/var/www/html` 目录,并仅使用 `cd` 和简单目录名即可移至 `/var/log` 中的子目录。在这种情况下,此 `$CDPATH` 就可以起作用: + +``` +$ CDPATH=.:/var/log:/var/www +``` + +你将看到: + +``` +$ cd journal +/var/log/journal +$ cd html +/var/www/html +``` + +当你输入的不是完整路径时,`$CDPATH` 就会生效。它向下查看其目录列表,以查看指定的目录是否存在于其中一个目录中。找到匹配项后,它将带你到那里。 + +在 `$CDPATH` 开头保持 `.` 意味着你可以进入本地目录,而不必在 `$CDPATH` 中定义它们。 + +``` +$ export CDPATH=".:$CDPATH" +$ Videos +cd -- Videos +/home/myacct/Videos +``` + +在 Linux 文件系统键切换并不难,但是如果你使用一些方便的技巧轻松地到达各个位置,那你可以节省一些大脑细胞。 + + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3533421/tricks-for-getting-around-your-linux-file-system.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[2]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy) +[3]: https://www.facebook.com/NetworkWorld/ +[4]: https://www.linkedin.com/company/network-world diff --git a/published/202005/20200331 Rambox is an All-in-one Messenger for Linux.md b/published/202005/20200331 Rambox is an All-in-one Messenger for Linux.md new file mode 100644 index 0000000000..93a73f4a54 --- /dev/null +++ b/published/202005/20200331 Rambox is an All-in-one Messenger for Linux.md @@ -0,0 +1,96 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12171-1.html) +[#]: subject: (Rambox is an All-in-one Messenger for Linux) +[#]: via: (https://itsfoss.com/rambox/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Rambox:Linux 中多合一的消息收发工具 +====== + +> Rambox 是一个多合一消息收发工具,允许你将多种服务(如 Discord、Slack、Facebook Messenger)和数百个此类服务结合在一起。 + +### Rambox:在单个应用中添加多个消息服务 + +![][1] + +Rambox 是通过安装单个应用管理多个通信服务的最佳方式之一。你可以在一个界面使用[多个消息服务][2],如 Facebook Messenger、Gmail chats、AOL、Discord、Google Duo、[Viber][3] 等。 + +这样,你就不需要安装单独的应用或者在浏览器中一直打开着。你可以使用主密码锁定 Rambox 应用。你还可以使用“请勿打扰”功能。 + +Rambox 提供可免费使用的[开源社区版][4]。付费专业版允许你访问 600 多个应用,而社区版则包含 99 多个应用。专业版本具有额外的功能,如主题、休眠、ad-block、拼写检查和高级支持。 + +不用担心。开源社区版本身非常有用,你甚至不需要这些专业功能。 + +### Rambox 的功能 + +![][5] + +虽然你应该在开源版中找到大多数基本功能,但你可能会注意到其中一些功能仅限于专业版。 + +此处,我说下所有的基本功能: + + * 在开源版本中,你有大约 100 个应用/服务可供选择 + * 能够使用单个主密码锁保护应用 + * 能够锁定加载的每个会话 + * 请勿打扰模式 + * 能够跨多个设备同步应用和配置 + * 你可以创建和添加自定义应用 + * 支持键盘快捷键 + * 启用/禁用应用而无需删除它们 + * JS 和 CSS 注入支持,以调整应用的样式 + * Ad-block (**专业版**) + * 休眠支持 (**专业版**) + * 主题支持(**专业版**) + * 移动设备视图 (**专业版**) + * 拼写检查 (**专业版**) + * 工作时间 - 计划传入通知的时间 (**专业版**) + * 支持代理 (**专业版**) + +除了我在这里列出的内容外,你还可以在 Rambox Pro 版本中找到更多功能。要了解有关它的更多信息,你可以参考[正式功能列表][6]。 + +还值得注意的是,你不能超过 3 个活跃并发设备的连接。 + +### 在 Linux 上安装 Rambox + +你可以在[官方下载页][4]获取 .AppImage 文件来运行 Rambox。如果你不清楚,你可以参考我们的指南,了解如何[在 Linux 上使用 AppImage 文件][7]。 + +另外,你也可以从 [Snap 商店][8]获取它。此外,请查看其 [GitHub release][9] 部分的 .deb / .rpm 或其他包。 + +- [下载 Rambox 社区版][4] + +### 总结 + +使用 Rambox 安装大量应用可能会有点让人不知所措。因此,我建议你在添加更多应用并将其用于工作时监视内存使用情况。 + +还有一个类似的应用称为 [Franz][10],它也像 Rambox 部分开源、部分高级版。 + +尽管像 Rambox 或 Franz 这样的解决方案非常有用,但它们并不总是节约资源,特别是如果你同时使用数十个服务。因此,请留意系统资源(如果你注意到对性能的影响)。 + +除此之外,这是一个令人印象深刻的应用。你有试过了么?欢迎随时让我知道你的想法! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/rambox/ + +作者:[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/03/rambox-ce.jpg?ssl=1 +[2]: https://itsfoss.com/best-messaging-apps-linux/ +[3]: https://itsfoss.com/viber-linux-client-beta-install/ +[4]: https://rambox.pro/#ce +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/rambox-preferences.png?ssl=1 +[6]: https://rambox.pro/#features +[7]: https://itsfoss.com/use-appimage-linux/ +[8]: https://snapcraft.io/rambox +[9]: https://github.com/ramboxapp/community-edition/releases +[10]: https://itsfoss.com/franz-messaging-app/ diff --git a/published/202005/20200401 3 Python templating languages you should (probably) never use.md b/published/202005/20200401 3 Python templating languages you should (probably) never use.md new file mode 100644 index 0000000000..a5a7502767 --- /dev/null +++ b/published/202005/20200401 3 Python templating languages you should (probably) never use.md @@ -0,0 +1,177 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12252-1.html) +[#]: subject: (3 Python templating languages you should (probably) never use) +[#]: via: (https://opensource.com/article/20/4/python-templating-languages) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +你应该(或许)没使用过的 3 种 Python 模板语言 +====== + +> 包括这 3 个模板语言在内,Python 积累了许多模板语言。 + +![](https://img.linux.net.cn/data/attachment/album/202005/26/110220lxie9osmd592m5ee.jpg) + +当需要使用模板语言来编写 [Python][2] Web 应用时,有很多健壮的解决方案。 + +有 [Jinja2][3]、[Genshi 和 Mako][4]。甚至还有 [Chameleon][5] 之类的解决方案,虽然有些陈旧,但仍被 [Pyramid][6] 框架推荐。 + +Python 已经存在了很长时间。此时,在系统的深处,它积累了一些几乎被遗忘的模板语言,它们都是值得一试的。 + +这些语言就像桉树上可爱的考拉一样,在自己的生态圈里快乐地生活着,有时也会有危险的工作,这些都是很少有人听说过的模板语言,使用过的应该更少。 + +### 3、string.Template + +你是否曾经想过:“如何获得一种没有任何特性的模板语言,而且同时也不需要 `pip install` 安装任何东西?” Python 标准库已经为你提供了答案。虽然没有循环和条件,但 `string.Template` 类是一种最小的模板语言。 + +使用它很简单。 + +``` +>>> import string +>>> greeting = string.Template("Hello, $name, good $time!") +>>> greeting.substitute(name="OpenSource.com", time="afternoon") +'Hello, OpenSource.com, good afternoon!' +``` + +### 2、twisted.web.template + +你会给一个包罗万象的库送什么礼物? + +当然,不是模板语言,因为它已经有了。twisted.web.template 中嵌套了两种模板语言。一种是基于 XML 的,并有一个[很棒的文档][7]。 + +但是它还有另一种,一种基于使用 Python 作为领域特定语言(DSL)来生成 HTML 文档。 + +它基于两个原语:包含标签对象的 `twisted.web.template.tags` 和渲染它们的 `twisted.web.template.flattenString`。由于它是 Twisted 的一部分,因此它内置支持高效异步渲染。 + +此例将渲染一个小页面: + +``` +async def render(reactor): + my_title = "A Fun page" + things = ["one", "two", "red", "blue"] + template = tags.html( + tags.head( + tags.title(my_title), + ), + tags.body( + tags.h1(my_title), + tags.ul( + [tags.li(thing) for thing in things], + ), + tags.p( + task.deferLater(reactor, 3, lambda: "Hello "), + task.deferLater(reactor, 3, lambda: "world!"), + ) + ) + ) + res = await flattenString(None, template) + res = res.decode('utf-8') + with open("hello.html", 'w') as fpout: + fpout.write(res) +``` + +该模板是使用 `tags.` 来指示层次结构的常规 Python 代码。原生支持渲染字符串,因此任何字符串都正常。 + +要渲染它,你需要做的是添加调用: + +``` +from twisted.internet import task, defer +from twisted.web.template import tags, flattenString + +def main(reactor): +    return defer.ensureDeferred(render(reactor)) +``` + +最后写上: + + +``` +task.react(main) +``` + +只需 3 秒(而不是 6 秒),它将渲染一个不错的 HTML 页面。在实际中,这些 `deferLater` 可以是对 HTTP API 的调用:它们将并行发送和处理,而无需付出任何努力。我建议你阅读关于[更好地使用 Twisted][8]。不过,这已经可以工作了。 + +### 1、Quixote + +你会说:“但是 Python 并不是针对 HTML 领域而优化的领域特定语言。” 如果有一种语言可以[转化][9]到 Python,但是更适合定义模板,而不是像 Python 那样按原样解决呢?如果可以的话,请使用“Python 模板语言”(PTL)。 + +编写自己的语言,有时被说成是一个攻击假想敌人的唐吉坷德项目。当 Quixote(可在 [PyPI][10] 中找到)的创造者决定这样做时,并没有受此影响。 + +以下将渲染与上面 Twisted 相同的模板。*警告:以下不是有效的 Python 代码*: + +``` +import time + +def render [html] (): + my_title = "A Fun page" + things = ["one", "two", "red", "blue"] + "" + my_title + "</head>

" + my_title + "

" + "
    " + for thing in things: + "
  • " + thing + "
  • " + "

    " + time.sleep(3) + (lambda: "Hello ")() + time.sleep(3) + (lambda: "world!")() + "

    " + "" + +def write(): + result = render() + with open("hello.html", 'w') as fpout: + fpout.write(str(result)) +``` + +但是,如果将它放到 `template.ptl` 文件中,那么可以将其导入到 Quixote 中,并写出可以渲染模板的版本: + + +``` +>>> from quixote import enable_ptl +>>> enable_ptl() +>>> import template +>>> template.write() +``` + +Quixote 安装了一个导入钩子,它会将 PTL 文件转换为 Python。请注意,此渲染需要 6 秒,而不是 3 秒。你不再获得自由的异步性。 + +### Python 中的模板太多 + +Python 库的历史悠久且曲折,其中一些库可以或多或少都能达到类似结果(例如,Python [包管理][11])。 + +我希望你喜欢探索这三种*可以*用 Python 创建模板的方式。另外,我建议从[这三个库之一][4]开始了解。 + +你是否有另一种深奥的模板方法?请在下面的评论中分享! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/python-templating-languages + +作者:[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/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://opensource.com/resources/python +[3]: https://opensource.com/article/20/2/jinja2-cheat-sheet +[4]: https://opensource.com/resources/python/template-libraries +[5]: https://chameleon.readthedocs.io/en/latest/ +[6]: https://opensource.com/article/18/5/pyramid-framework +[7]: https://twistedmatrix.com/documents/13.1.0/web/howto/twisted-templates.html +[8]: https://opensource.com/article/20/3/treq-python +[9]: https://en.wikipedia.org/wiki/Source-to-source_compiler +[10]: https://pypi.org/project/Quixote/ +[11]: https://opensource.com/article/19/4/managing-python-packages diff --git a/published/202005/20200401 The ins and outs of high-performance computing as a service.md b/published/202005/20200401 The ins and outs of high-performance computing as a service.md new file mode 100644 index 0000000000..ef96b09ffe --- /dev/null +++ b/published/202005/20200401 The ins and outs of high-performance computing as a service.md @@ -0,0 +1,96 @@ +[#]: collector: (lujun9972) +[#]: translator: (messon007) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12202-1.html) +[#]: subject: (The ins and outs of high-performance computing as a service) +[#]: via: (https://www.networkworld.com/article/3534725/the-ins-and-outs-of-high-performance-computing-as-a-service.html) +[#]: author: (Josh Fruhlinger https://www.networkworld.com/author/Josh-Fruhlinger/) + +超算即服务:超级计算机如何上云 +====== + +> 高性能计算(HPC)服务可能是一种满足不断增长的超级计算需求的方式,但依赖于使用场景,它们不一定比使用本地超级计算机好。 + +![](https://img.linux.net.cn/data/attachment/album/202005/09/223805mrjfjzecr3hceais.jpg) + +导弹和军用直升机上的电子设备需要工作在极端条件下。美国国防承包商麦考密克·史蒂文森公司McCormick Stevenson Corp.在部署任何物理设备之前都会事先模拟它所能承受的真实条件。模拟依赖于像 Ansys 这样的有限元素分析软件,该软件需要强大的算力。 + +几年前的一天,它出乎意料地超出了计算极限。 + +麦考密克·史蒂文森公司的首席工程师 Mike Krawczyk 说:“我们的一些工作会使办公室的计算机不堪重负。购买机器并安装软件在经济上或计划上都不划算。”相反,他们与 Rescale 签约,该公司销售其超级计算机系统上的处理能力,而这只花费了他们购买新硬件上所需的一小部分。 + +麦考密克·史蒂文森公司已成为被称为超级计算即服务或高性能计算即服务(两个紧密相关的术语)市场的早期采用者之一。根据国家计算科学研究所的定义,HPC 是超级计算机在计算复杂问题上的应用,而超级计算机是处理能力最先进的那些计算机。 + +无论叫它什么,这些服务都在颠覆传统的超级计算市场,并将 HPC 能力带给以前负担不起的客户。但这不是万能的,而且绝对不是即插即用的,至少现在还不是。 + +### HPC 服务实践 + +从最终用户的角度来看,HPC 即服务类似于早期大型机时代的批处理模型。 “我们创建一个 Ansys 批处理文件并将其发送过去,运行它,然后将结果文件取下来,然后导入到本地,” Krawczyk 说。 + +在 HPC 服务背后,云提供商在其自己的数据中心中运行超级计算基础设施,尽管这不一定意味着当你听到“超级计算机”时你就会看到最先进的硬件。正如 IBM OpenPOWER 计算技术副总裁 Dave Turek 解释的那样,HPC 服务的核心是“相互互连的服务器集合。你可以调用该虚拟计算基础设施,它能够在你提出问题时,使得许多不同的服务器并行工作来解决问题。” + +理论听起来很简单。但都柏林城市大学数字商业教授 Theo Lynn 表示,要使其在实践中可行,需要解决一些技术问题。普通计算与 HPC 的区别在于那些互联互通 —— 高速的、低延时的而且昂贵的 —— 因此需要将这些互连引入云基础设施领域。在 HPC 服务可行之前,至少需要将存储性能和数据传输也提升到与本地 HPC 相同的水平。 + +但是 Lynn 说,一些制度创新相比技术更好的帮助了 HPC 服务的起飞。特别是,“我们现在看到越来越多的传统 HPC 应用采用云友好的许可模式 —— 这在过去是阻碍采用的障碍。” + +他说,经济也改变了潜在的客户群。“云服务提供商通过向那些负担不起传统 HPC 所需的投资成本的低端 HPC 买家开放,进一步开放了市场。随着市场的开放,超大规模经济模型变得越来越多,更可行,成本开始下降。” + +### 避免本地资本支出 + +HPC 服务对传统超级计算长期以来一直占据主导地位的私营部门客户具有吸引力。这些客户包括严重依赖复杂数学模型的行业,包括麦考密克·史蒂文森公司等国防承包商,以及石油和天然气公司、金融服务公司和生物技术公司。都柏林城市大学的 Lynn 补充说,松耦合的工作负载是一个特别好的用例,这意味着许多早期采用者将其用于 3D 图像渲染和相关应用。 + +但是,何时考虑 HPC 服务而不是本地 HPC 才有意义?对于德国的模拟烟雾在建筑物中的蔓延和火灾对建筑物结构部件的破坏的 hhpberlin 公司来说,答案是在它超出了其现有资源时。 + +Hpberlin 公司数值模拟的科学负责人 Susanne Kilian 说:“几年来,我们一直在运行自己的小型集群,该集群具有多达 80 个处理器核。……但是,随着应用复杂性的提高,这种架构已经越来越不足以支撑;可用容量并不总是够快速地处理项目。” + +她说:“但是,仅仅花钱买一个新的集群并不是一个理想的解决方案:鉴于我们公司的规模和管理环境,不断地维护这个集群(定期进行软件和硬件升级)是不现实的。另外,需要模拟的项目数量会出现很大的波动,因此集群的利用率并不是真正可预测的。通常,使用率很高的阶段与很少使用或不使用的阶段交替出现。”通过转换为 HPC 服务模式,hhpberlin 释放了过剩的产能,并无需支付升级费用。 + +IBM 的 Turek 解释了不同公司在评估其需求时所经历的计算过程。对于拥有 30 名员工的生物科学初创公司来说,“你需要计算,但你真的不可能让 15% 的员工专门负责计算。这就像你可能也会说你不希望有专职的法律代表,所以你也会把它作为一项服务来做。”不过,对于一家较大的公司而言,最终归结为权衡 HPC 服务的运营费用与购买内部超级计算机或 HPC 集群的费用。 + +到目前为止,这些都是你采用任何云服务时都会遇到的类似的争论。但是,可以 HPC 市场的某些特殊性将使得衡量运营支出(OPEX)与资本支出(CAPEX)时选择前者。超级计算机不是诸如存储或 x86 服务器之类的商用硬件;它们非常昂贵,技术进步很快会使其过时。正如麦考密克·史蒂文森公司的 Krawczyk 所说,“这就像买车:只要车一开走,它就会开始贬值。”对于许多公司,尤其是规模较大,灵活性较差的公司,购买超级计算机的过程可能会陷入无望的泥潭。IBM 的 Turek 说:“你会被规划问题、建筑问题、施工问题、培训问题所困扰,然后必须执行 RFP。你必须得到 CIO 的支持。你必须与内部客户合作以确保服务的连续性。这是一个非常、非常复杂的过程,并没有很多机构有非常出色的执行力。” + +一旦你选择走 HPC 服务的路线,你会发现你会得到你期望从云服务中得到的许多好处,特别是仅在业务需要时才需付费的能力,从而可以带来资源的高效利用。Gartner 高级总监兼分析师 Chirag Dekate 表示,当你对高性能计算有短期需求时,突发性负载是推动选择 HPC 服务的关键用例。 + +他说:“在制造业中,在产品设计阶段前后,HPC 活动往往会达到很高的峰值。但是,一旦产品设计完成,在其余产品开发周期中,HPC 资源的利用率就会降低。” 相比之下,他说:“当你拥有大型的、长期运行的工作时,云计算的经济性才会逐渐减弱。” + +通过巧妙的系统设计,你可以将这些 HPC 服务突发活动与你自己的内部常规计算集成在一起。埃森哲Accenture实验室常务董事 Teresa Tung 举了一个例子:“通过 API 访问 HPC 可以与传统计算无缝融合。在模型构建阶段,传统的 AI 流水线可能会在高端超级计算机上进行训练,但是最终经过反复按预期运行的训练好的模型将部署在云端的其他服务上,甚至部署在边缘设备上。” + +### 它并不适合所有的应用场景 + +HPC 服务适合批处理和松耦合的场景。这与一个常见的 HPC 缺点有关:数据传输问题。高性能计算本身通常涉及庞大的数据集,而将所有这些信息通过互联网发送到云服务提供商并不容易。IBM 的 Turek 说:“我们与生物技术行业的客户交流,他们每月仅在数据费用上就花费 1000 万美元。” + +而钱并不是唯一的潜在问题。构建一个利用数据的工作流程,可能会对你的工作流程提出挑战,让你绕过数据传输所需的漫长时间。hhpberlin 的 Kilian 说:“当我们拥有自己的 HPC 集群时,当然可以随时访问已经产生的仿真结果,从而进行交互式的临时评估。我们目前正努力达到在仿真的任意时刻都可以更高效地、交互地访问和评估云端生成的数据,而无需下载大量的模拟数据。” + +Mike Krawczyk 提到了另一个绊脚石:合规性问题。国防承包商使用的任何服务都需要遵从《国际武器交易条例》(ITAR),麦考密克·史蒂文森公司之所以选择 Rescale,部分原因是因为这是他们发现的唯一符合的供应商。如今,尽管有更多的公司使用云服务,但任何希望使用云服务的公司都应该意识到使用其他人的基础设施时所涉及的法律和数据保护问题,而且许多 HPC 场景的敏感性使得 HPC 即服务的这个问题更加突出。 + +此外,HPC 服务所需的 IT 治理超出了目前的监管范围。例如,你需要跟踪你的软件许可证是否允许云使用­ —— 尤其是专门为本地 HPC 群集上运行而编写的软件包。通常,你需要跟踪 HPC 服务的使用方式,它可能是一个诱人的资源,尤其是当你从员工习惯的内部系统过渡到有可用的空闲的 HPC 能力时。例如,Avanade 全球平台高级主管兼 Azure 平台服务全球负责人 Ron Gilpin 建议,将你使用的处理核心的数量回拨给那些对时间不敏感的任务。他说:“如果一项工作只需要用一小时来完成而不需要在十分钟内就完成,那么它可以使用 165 个处理器而不是 1,000 个,从而节省了数千美元。” + +### 对 HPC 技能的要求很高 + +一直以来,采用 HPC 的最大障碍之一就是其所需的独特的内部技能,而 HPC 服务并不能神奇使这种障碍消失。Gartner 的 Dekate 表示:“许多 CIO 将许多工作负载迁移到了云上,他们看到了成本的节约、敏捷性和效率的提升,因此相信在 HPC 生态中也可以达成类似的效果。一个普遍的误解是,他们可以通过彻底地免去系统管理员,并聘用能解决其 HPC 工作负载的新的云专家,从而以某种方式优化人力成本。”对于 HPC 即服务来说更是如此。 + +“但是 HPC 并不是一个主流的企业环境。” 他说。“你正在处理通过高带宽、低延迟的网络互联的高端计算节点,以及相当复杂的应用和中间件技术栈。许多情况下,甚至连文件系统层也是 HPC 环境所独有的。没有对应的技能可能会破坏稳定性。” + +但是超级计算技能的供给却在减少,Dekate 将其称为劳动力“老龄化”,这是因为这一代开发人员将目光投向了新兴的初创公司,而不是学术界或使用 HPC 的更老套的公司。因此,HPC 服务供应商正在尽其所能地弥补差距。IBM 的 Turek 表示,许多 HPC 老手将总是想运行他们自己精心调整过的代码,并需要专门的调试器和其他工具来帮助他们在云端实现这一目标。但是,即使是 HPC 新手也可以调用供应商构建的代码库,以利用超级计算的并行处理能力。第三方软件提供商出售的交钥匙软件包可以减少 HPC 的许多复杂性。 + +埃森哲的 Tung 表示,该行业需要进一步加大投入才能真正繁荣。她说:“HPCaaS 已经创建了具有重大影响力的新功能,但还需要做的是使它易于被数据科学家、企业架构师或软件开发人员使用。这包括易用的 API、文档和示例代码。它包括解答问题的用户支持。仅仅提供 API 是不够的,API 需要适合特定的用途。对于数据科学家而言,这可能是以 Python 形式提供,并容易更换她已经在使用的框架。价值来自于使这些用户能够通过新的效率和性能最终使他们的工作得到改善,只要他们能够访问新的功能就可以了。” 如果供应商能够做到这一点,那么 HPC 服务才能真正将超级计算带给大众。 + + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3534725/the-ins-and-outs-of-high-performance-computing-as-a-service.html + +作者:[Josh Fruhlinger][a] +选题:[lujun9972][b] +译者:[messon007](https://github.com/messon007) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Josh-Fruhlinger/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/article/3236875/embargo-10-of-the-worlds-fastest-supercomputers.html +[2]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy) +[3]: https://www.facebook.com/NetworkWorld/ +[4]: https://www.linkedin.com/company/network-world diff --git a/published/202005/20200404 Best Raspberry Pi Operating Systems for Various Purposes.md b/published/202005/20200404 Best Raspberry Pi Operating Systems for Various Purposes.md new file mode 100644 index 0000000000..25ebd65fcd --- /dev/null +++ b/published/202005/20200404 Best Raspberry Pi Operating Systems for Various Purposes.md @@ -0,0 +1,353 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12219-1.html) +[#]: subject: (Best Raspberry Pi Operating Systems for Various Purposes) +[#]: via: (https://itsfoss.com/raspberry-pi-os/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +用于各种用途的最佳树莓派操作系统 +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/15/105040b17d6v7gdmj63k3k.jpg) + +[树莓派][1] 是一款不可缺少的单板电脑,在很多工作中都能派上用场。不相信?只要[看看这个树莓派项目列表][2],就能了解这个小小的设备能做什么。 + +考虑到树莓派用途这么多,为它选择一个合适的操作系统就极其重要。当然,你可以用 Linux 做很多事,但专门为特定目的配置的操作系统可以为你节省大量的时间和精力。 + +因此,本文中我要介绍一些专门为树莓派量身定制的流行且实用的操作系统。 + +### 由于有树莓派镜像工具,安装任何操作系统到树莓派上都很容易 + +[在 SD 卡上安装树莓派操作系统][3]比以前容易得多。你只需下载[树莓派镜像][4]就可以快速地安装任何树莓派操作系统。请看下面的官方视频,你就知道有多简单。 + +- [HOW TO INSTALL RASPBIAN OS to your Raspberry Pi with ease - Raspberry Pi Imager](https://youtu.be/J024soVgEeM) + +你也可以使用 [NOOBS][5](新开箱即用软件New Out Of the Box Software)在树莓派上轻松安装各种的操作系统。你还可以从他们的 [NOOBS 官方下载页面][5]提到的支持的零售商列表中获得预装 SD 卡。 + +欢迎在他们的[官方文档][6]中了解更多关于安装操作系统的信息。 + +- [下载树莓派操作系统][4] + +现在你知道了怎么安装它(以及从哪儿获取),让我来重点介绍几个有用的树莓派操作系统,希望对你有所帮助。 + +### 适用于树莓派的各种操作系统 + +请注意,我花了一些精力筛选出了那些被积极维护的树莓派操作系统项目。如果某个项目在不久的将来会停止维护,请在评论区告诉我,我会更新本文。 + +另一件事是,我关注到现在最新的版本是树莓派 4,但是下面的列表不应被认为是树莓派 4 的操作系统列表,这些系统应该也能用于树莓派 3、3B+ 和其他变种,但是请参照项目的官方网站了解详细信息。 + +**注意:** 排名不分先后。 + +#### 1、Raspbian OS:官方的树莓派操作系统 + +![][7] + +Raspbian OS 是官方支持的树莓派板卡操作系统。它集成了很多工具,用于教育、编程以及其他广泛的用途。具体来说,它包含了 Python、Scratch、Sonic Pi、Java 和其他一些重要的包。 + +最初,Raspbian OS 是基于 Debian 的,并预装了大量有用的包。因此,当你安装 Raspbian OS 后,你可能就不需要特意安装基本工具了 — 你会发现大部分工具已经提前安装好了。 + +Raspbian OS 是被积极地维护着的,它也是最流行的树莓派操作系统之一。你可以使用 [NOOBS][5] 或参照[官方文档][6]来安装它。 + +- [Raspbian OS][8] + +#### 2、Ubuntu MATE:适合通用计算需求 + +![][9] + +尽管 Raspbian 是官方支持的操作系统,但它的特点不是最新、最大的软件包。因此,如果你想更快的更新,想用最新的包,你可以试试 Ubuntu MATE 的树莓派版本。 + +Ubuntu MATE 的树莓派定制版是值得安装的非常不错的轻量级发行版。它还被广泛用于 [NVIDIA 的 Jetson Nano][10]。换言之,你可以在树莓派的很多场景下使用它。 + +为了更好地帮助你,我们还有一份详细的教程:[怎样在树莓派上安装 Ubuntu MATE][11]。 + +- [Ubuntu MATE for Raspberry Pi][12] + +#### 3、Ubuntu Server:把树莓派作为一台 Linux 服务器来使用 + +![][13] + +如果你计划把你的树莓派当作项目的某个服务器来使用,那么安装 Ubuntu Server 会是一个不错的选择。 + +Ubuntu Server 有 32 位和 64 位的镜像。你可以根据你的板卡类型(是否支持 64 位)来选择对应的操作系统。 + +然而,值得注意的一点是 Ubuntu Server 不是为桌面用户定制的。因此,你需要留意 Ubuntu Server 默认不会安装图形用户界面。 + +- [Ubuntu Server][14] + +#### 4、LibreELEC:适合做媒体服务器 + +![][15] + +我们已经有一个 [Linux 下可用的媒体服务器软件][16],LibreELEC 在列表中。 + +它是一个很棒的轻量级操作系统,让你可以在树莓派上安装 [KODI][17]。你可以尝试使用树莓派镜像工具来安装它。 + +你可以很容易地找到他们的[官方下载页面][18],并找到适合你板卡的安装镜像。 + +- [LibreELEC][19] + +#### 5、OSMC:适合做媒体服务器 + +![][20] + +OSMC 是另一个 Linux 下[流行的媒体服务器软件][16]。如果要把树莓派板作为媒体中心设备,那么 OSMC 是你可以向他人推荐的操作系统之一。 + +类似 LibreELEC,OSMC 也运行 KODI,可以帮助你管理你的媒体文件和欣赏你已有的素材。 + +OSMC 没有正式提及对树莓派 4 的支持。因此,如果你的树莓派是树莓派 3 或更早的版本,那么应该没有问题。 + +- [OSMC][21] + +#### 6、RISC OS:最初的 ARM 操作系统 + +![][22] + +RISC OS 最初是为 ARM 设备打造的,至今已有近 30 年左右的历史。 + +如果你想了解,我们也有篇详细介绍 [RISC OS][23] 的文章。简而言之,RISC OS 也是为诸如树莓派的现代基于 ARM 的单板计算机定制的。它的用户界面很简单,更专注于性能。 + +同样的,这并不是为树莓派 4 量身定做的。因此,如果你的树莓派是 3 或更早的版本,你可以试一下。 + +- [RISC OS][24] + +#### 7、Mozilla WebThings Gateway:适合 IoT 项目 + +![][25] + +作为 Mozilla 的 [IoT 设备的开源实现][26]的一部分,WebThings Gateway 让你可以监控和控制所有连接的 IoT 设备。 + +你可以参考[官方文档][27]来检查所需的环境,遵照指导把安装到树莓派上。它确实是适合 IoT 应用的最有用的树莓派操作系统之一。 + +- [WebThings Gateway][28] + +#### 8、Ubuntu Core:适合 IoT 项目 + +Ubuntu Core 是又一个树莓派操作系统,适用于潜在的 [IoT][29] 应用,或者只是测试一下 Snap。 + +Ubuntu Core 是专门为 IoT 设备或者具体来说是树莓派定制的。我不会刻意宣传它 —— 但是 Ubuntu Core 是一款适合树莓派板卡的安全操作系统。你可以自己尝试一下! + +- [Ubuntu Core][30] + +#### 9、DietPi:轻量级树莓派操作系统 + +![][31] + +DietPi 是一款轻量级的 [Debian][32] 操作系统,它还宣称比 “Raspbian Lite” 操作系统更轻量。 + +虽然它被视作一款轻量级的树莓派操作系统,但它提供了很多功能,可以在多个使用场景中派上用场。从简单的软件安装包到备份解决方案,还有很多功能值得探索。 + +如果你想安装一个低内存占用而性能相对更好的操作系统,你可以尝试一下 DietPi。 + +- [DietPi][33] + +#### 10、Lakka Linux:打造复古的游戏主机 + +![][34] + +想让你的树莓派变成一个复古的游戏主机? + +Lakka Linux 发行版本最初是建立在 RetroArch 模拟器上的。因此,你可以立刻在树莓派上获得所有的复古游戏。 + +如果你想了解,我们也有一篇介绍 [Lakka Linux][35] 的文章。或者直接上手吧! + +- [Lakka][36] + +#### 11、RetroPie:适合复古游戏 + +![][37] + +RetroPie 是另一款可以让树莓派变成复古游戏主机的树莓派操作系统。它提供了几个配置工具,让你可以自定义主题,或者调整模拟器即可拥有最好的复古游戏。 + +值得注意的是它不包含任何有版权的游戏。你可以试一下,看看它是怎么工作的! + +- [RetroPie][38] + +#### 12、Kali Linux:适合低成本渗透 + +![][39] + +想要在你的树莓派上尝试和学习一些道德黑客技巧吗?[Kali Linux][64] 会是最佳选择。是的,Kali Linux 通常在最新的树莓派一发布就会支持它。 + +Kali Linux 不仅适合树莓派,它也支持很多其他设备。尝试一下,玩得愉快! + +- [Kali Linux][40] + +#### 13、OpenMediaVault:适合网络附加存储(NAS) + +![][41] + +如果你想在极简的硬件上搭建 [NAS][42] 解决方案,树莓派可以帮助你。 + +OpenMediaVault 最初是基于 Debian Linux 的,提供了大量功能,如基于 Web 的管理能力、插件支持,等等。它支持大多数树莓派型号,因此你可以尝试下载并安装它! + +- [OpenMediaVault][43] + +#### 14、ROKOS:适合加密挖矿 + +![][44] + +如果你对加密货币和比特币很感兴趣,那么 ROKOS 会吸引你。 + +ROKOS 是基于 Debian 的操作系统,基本上可以让你把你的树莓派变成一个节点,同时预装了相应的驱动程序和软件包。当然,在安装之前你需要了解它是怎么工作的。因此,如果你对此不太了解,我建议你先调研下。 + +- [ROKOS][45] + +#### 15、Alpine Linux:专注于安全的轻量级 Linux + +当今年代,很多用户都在寻找专注于安全和[隐私的发行版本][46]。如果你也是其中一员,你可以试试在树莓派上安装 Alpine Linux。 + +如果你是个树莓派新手,它可能不像你想象的那样对用户友好(或者说对初学者来说容易上手)。但是,如果你想尝试一些不一样的东西,那么你可以试试 Alpine Linux 这个专注于安全的 Linux 发行版本。 + +- [Alpine Linux][47] + +#### 16、Kano OS:适合儿童教育的操作系统 + +![][48] + +如果你在寻找一款能让学习变得有趣还能教育儿童的树莓派操作系统,那么 Kano OS 是个不错的选择。 + +它正在积极维护中,而且 Kano OS 上的桌面集成的用户体验相当简单,玩起来也很有趣,可以让孩子们从中学习。 + +- [Kano OS][49] + +#### 17、KDE Plasma Bigscreen:把普通电视转换为智能电视 + +![][50] + +这是 KDE 一个正在开发中的项目。在树莓派上安装 [KDE “等离子大屏”][51] 后,你可以把普通电视变成智能电视。 + +你不需要特殊的遥控器来控制电视,你可以使用普通的遥控器。 + +“等离子大屏”也集成了 [MyCroft 开源 AI][52] 作为声控。 + +这个项目还在测试阶段,所以如果你想尝试,可能会有一些错误和问题。 + +- [Plasma Bigscreen][53] + +#### 18、Manjaro Linux:为你提供多功能的桌面体验 + +![][54] + +如果你想在树莓派上寻找一个基于 Arch 的 Linux 发行版,那么 Manjaro Linux 应该是一个很好的补充,它可以做很多事情,适合一般的计算任务。 + +Manjaro Linux ARM 版也支持最新的树莓派 4。它为你的树莓派或任何[树莓派替代品][55]提供了 XFCE 和 KDE Plasma 变体。 + +此外,它似乎还提供了树莓派设备上最快/最好的体验之一。如果你还没试过,那就试试吧! + +- [Manjaro ARM][56] + +#### 19、Volumio:作为一个开源音乐播放器使用 + +![][57] + +想做一个廉价的音乐发烧友系统?Volumio 应该可以帮到你。 + +它是一个自由而开源的操作系统([GitHub][58]),还支持集成多个设备的能力。你可以通过一个简单的 Web 控制界面,对所有连接的设备进行管理。除了免费版之外,它还提供了一个高级版,可以让你获得独家功能。 + +它也确实支持最新的树莓派 4。所以,如果你对调整已有的家庭立体声系统有一定的兴趣,想要获得最佳的音质,不妨试试这个。 + +- [Volumio][59] + +#### 20、FreeBSD + +不想使用 Linux 发行版?不用担心,你也可以用 FreeBSD 在树莓派上安装一个类 UNIX 操作系统。 + +如果你不知道的话,我们有一篇关于 [FreeBSD 项目][60]的详细文章。 + +一旦你按照他们的[官方说明][61]安装好之后,你可以利用它来进行任何 DIY 实验,或者只是把它作为一个轻量级的桌面系统来完成特定的任务。 + +- [FreeBSD][62] + +#### 21、NetBSD + +NetBSD 是另一个令人印象深刻的类 UNIX 操作系统,你可以在树莓派上安装。它的目标是成为一个跨多个系统的便携式操作系统。 + +如果你在其他系统中使用过它,你可能已经知道它的好处了。然而,它不仅仅是一个轻量级的便携式操作系统,它的特点是拥有一套有用的功能,可以完成各种任务。 + +- [NetBSD][63] + +### 结语 + +我相信还有很多为树莓派定制的操作系统 — 但是我尽力列出了被积极维护的最流行的或最有用的操作系统。 + +如果你觉得我遗漏了最合适树莓派的操作系统,尽情在下面的评论去告诉我吧! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/raspberry-pi-os/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[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.raspberrypi.org/ +[2]: https://itsfoss.com/raspberry-pi-projects/ +[3]: https://linux.cn/article-12136-1.html +[4]: https://www.raspberrypi.org/downloads/ +[5]: https://www.raspberrypi.org/downloads/noobs/ +[6]: https://www.raspberrypi.org/documentation/installation/installing-images/README.md +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/raspbian_home_screen.jpg?resize=800%2C492&ssl=1 +[8]: https://www.raspbian.org/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/04/Desktop-ubuntu.jpg?resize=800%2C600&ssl=1 +[10]: https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-nano/ +[11]: https://linux.cn/article-10817-1.html +[12]: https://ubuntu-mate.org/raspberry-pi/ +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/ubunt-server.png?ssl=1 +[14]: https://ubuntu.com/download/raspberry-pi +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/libreelec.jpg?resize=800%2C600&ssl=1 +[16]: https://itsfoss.com/best-linux-media-server/ +[17]: https://kodi.tv/ +[18]: https://libreelec.tv/downloads_new/ +[19]: https://libreelec.tv/ +[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/osmc-server.jpg?resize=800%2C450&ssl=1 +[21]: https://osmc.tv/ +[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/10/riscos5.1.jpg?resize=800%2C600&ssl=1 +[23]: https://itsfoss.com/risc-os-is-now-open-source/ +[24]: https://www.riscosopen.org/content/ +[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/web-things-gateway.png?ssl=1 +[26]: https://iot.mozilla.org/about/ +[27]: https://iot.mozilla.org/docs/gateway-getting-started-guide.html +[28]: https://iot.mozilla.org/gateway/ +[29]: https://en.wikipedia.org/wiki/Internet_of_things +[30]: https://ubuntu.com/download/raspberry-pi-core +[31]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/diet-pi.jpg?ssl=1 +[32]: https://www.debian.org/ +[33]: https://dietpi.com/ +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2016/08/lakkaos.jpg?resize=1024%2C640&ssl=1 +[35]: https://linux.cn/article-10158-1.html +[36]: http://www.lakka.tv/ +[37]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/retro-pie.png?ssl=1 +[38]: https://retropie.org.uk/ +[39]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/kali-linux-pi.png?ssl=1 +[40]: https://www.offensive-security.com/kali-linux-arm-images/ +[41]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/openmediavault.jpg?ssl=1 +[42]: https://en.wikipedia.org/wiki/Network-attached_storage +[43]: https://www.openmediavault.org/ +[44]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/rocos-bitcoin-pi.jpg?ssl=1 +[45]: https://rokos.space/ +[46]: https://itsfoss.com/privacy-focused-linux-distributions/ +[47]: https://alpinelinux.org/ +[48]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/kano-os-pi.jpeg?ssl=1 +[49]: https://kano.me/row/downloadable +[50]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/plasma-bigscreen-menu.jpg?ssl=1 +[51]: https://itsfoss.com/kde-plasma-bigscreen/ +[52]: https://itsfoss.com/mycroft-mark-2/ +[53]: https://plasma-bigscreen.org/#download-jumpto +[54]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/manjaro-arm.jpg?w=800&ssl=1 +[55]: https://linux.cn/article-10823-1.html +[56]: https://manjaro.org/download/#raspberry-pi-4 +[57]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/volumio.jpg?w=800&ssl=1 +[58]: https://github.com/volumio +[59]: https://volumio.org/ +[60]: https://itsfoss.com/freebsd-interview-deb-goodkin/ +[61]: https://www.freebsdfoundation.org/freebsd/how-to-guides/installing-freebsd-for-raspberry-pi/ +[62]: https://www.freebsd.org/ +[63]: https://www.netbsd.org/ +[64]: https://linux.cn/article-10690-1.html diff --git a/published/202005/20200407 How to avoid man-in-the-middle cyber attacks.md b/published/202005/20200407 How to avoid man-in-the-middle cyber attacks.md new file mode 100644 index 0000000000..8ae4bb8a6d --- /dev/null +++ b/published/202005/20200407 How to avoid man-in-the-middle cyber attacks.md @@ -0,0 +1,80 @@ +[#]: collector: "lujun9972" +[#]: translator: "tinyeyeser" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12191-1.html" +[#]: subject: "How to avoid man-in-the-middle cyber attacks" +[#]: via: "https://opensource.com/article/20/4/mitm-attacks" +[#]: author: "Jackie Lam https://opensource.com/users/beenverified" + +如何避免中间人攻击(MITM) +====== + +> 首先搞明白到底什么是中间人攻击(MITM),才能避免成为此类高科技窃听的受害者。 + +![](https://img.linux.net.cn/data/attachment/album/202005/07/100655i7og1eqsw6o3ww81.jpg) + +当你使用电脑发送数据或与某人在线通话的时候,你一定采取了某种程度的安全隐私手段。 + +但如果有第三方在你不知情的情况下窃听,甚至冒充某个你信任的商业伙伴窃取破坏性的信息呢?你的私人数据就这样被放在了危险分子的手中。 + +这就是臭名昭著的中间人攻击man-in-the-middle(MITM)。 + +### 到底什么是中间人攻击? + +黑客潜入到你与受害者或是某个设备间的通信过程中,窃取敏感信息(多数是身份信息)进而从事各种违法行为的过程,就是一次中间人攻击。Scamicide 公司创始人 Steve J. J. Weisman 介绍说: + +> “中间人攻击也可以发生在受害者与某个合法 app 或网页中间。当受害者以为自己面对的是正常 app 或网页时,其实 Ta 正在与一个仿冒的 app 或网页互动,将自己的敏感信息透露给了不法分子。” + +中间人攻击诞生于 1980 年代,是最古老的网络攻击形式之一。但它却更为常见。Weisman 解释道,发生中间人攻击的场景有很多种: + + * **攻陷一个未有效加密的 WiFi 路由器**:该场景多见于人们使用公共 WiFi 的时候。“虽然家用路由器也很脆弱,但黑客攻击公共 WiFi 网络的情况更为常见。”Weisman 说,“黑客的目标就是从毫无戒心的人们那里窃取在线银行账户这样的敏感信息。” + * **攻陷银行、金融顾问等机构的电子邮件账户**:“一旦黑客攻陷了这些电子邮件系统,他们就会冒充银行或此类公司给受害者发邮件”,Weisman 说,”他们以紧急情况的名义索要个人信息,诸如用户名和密码。受害者很容易被诱骗交出这些信息。” + * **发送钓鱼邮件**:窃贼们还可能冒充成与受害者有合作关系的公司,向其索要个人信息。“在多个案例中,钓鱼邮件会引导受害者访问一个伪造的网页,这个伪造的网页看起来就和受害者常常访问的合法公司网页一模一样。”Weisman 说道。 + * **在合法网页中嵌入恶意代码**:攻击者还会把恶意代码(通常是 JavaScript)嵌入到一个合法的网页中。“当受害者加载这个合法网页时,恶意代码首先按兵不动,直到用户输入账户登录或是信用卡信息时,恶意代码就会复制这些信息并将其发送至攻击者的服务器。”网络安全专家 Nicholas McBride 介绍说。 + +### 有哪些中间人攻击的著名案例? + +联想作为主流的计算机制造厂商,在 2014 到 2015 年售卖的消费级笔记本电脑中预装了一款叫做 VisualDiscovery 的软件,拦截用户的网页浏览行为。当用户的鼠标在某个产品页面经过时,这款软件就会弹出一个来自合作伙伴的类似产品的广告。 + +这起中间人攻击事件的关键在于:VisualDiscovery 拥有访问用户所有私人数据的权限,包括身份证号、金融交易信息、医疗信息、登录名和密码等等。所有这些访问行为都是在用户不知情和未获得授权的情况下进行的。联邦交易委员会(FTC)认定此次事件为欺诈与不公平竞争。2019 年,联想同意为此支付 8300 万美元的集体诉讼罚款。 + +### 我如何才能避免遭受中间人攻击? + + * **避免使用公共 WiFi**:Weisman 建议,从来都不要使用公开的 WiFi 进行金融交易,除非你安装了可靠的 VPN 客户端并连接至可信任的 VPN 服务器。通过 VPN 连接,你的通信是加密的,信息也就不会失窃。 + * **时刻注意:**对要求你更新密码或是提供用户名等私人信息的邮件或文本消息要时刻保持警惕。这些手段很可能被用来窃取你的身份信息。 + + 如果不确定收到的邮件来自于确切哪一方,你可以使用诸如电话反查或是邮件反查等工具。通过电话反查,你可以找出未知发件人的更多身份信息。通过邮件反查,你可以尝试确定谁给你发来了这条消息。 + + 通常来讲,如果发现某些方面确实有问题,你可以听从公司中某个你认识或是信任的人的意见。或者,你也可以去你的银行、学校或其他某个组织,当面寻求他们的帮助。总之,重要的账户信息绝对不要透露给不认识的“技术人员”。 + + * **不要点击邮件中的链接**:如果有人给你发了一封邮件,说你需要登录某个账户,不要点击邮件中的链接。相反,要通过平常习惯的方式自行去访问,并留意是否有告警信息。如果在账户设置中没有看到告警信息,给客服打电话的时候也*不要*联系邮件中留的电话,而是联系站点页面中的联系人信息。 + * **安装可靠的安全软件**:如果你使用的是 Windows 操作系统,安装开源的杀毒软件,如 [ClamAV][2]。如果使用的是其他平台,要保持你的软件安装有最新的安全补丁。 + * **认真对待告警信息**:如果你正在访问的页面以 HTTPS 开头,浏览器可能会出现一则告警信息。例如,站点证书的域名与你尝试访问的站点域名不相匹配。千万不要忽视此类告警信息。听从告警建议,迅速关掉页面。确认域名没有输入错误的情况下,如果情况依旧,要立刻联系站点所有者。 + * **使用广告屏蔽软件**:弹窗广告(也叫广告软件攻击)可被用于窃取个人信息,因此你还可以使用广告屏蔽类软件。对个人用户来说,中间人攻击其实是很难防范的,因为它被设计出来的时候,就是为了让受害者始终蒙在鼓里,意识不到任何异常。有一款不错的开源广告屏蔽软件叫 [uBlock origin][4]。可以同时支持 Firefox 和 Chromium(以及所有基于 Chromium 的浏览器,例如 Chrome、Brave、Vivaldi、Edge 等),甚至还支持 Safari。 + +### 保持警惕 + +要时刻记住,你并不需要立刻就点击某些链接,你也并不需要听从某个陌生人的建议,无论这些信息看起来有多么紧急。互联网始终都在。你大可以先离开电脑,去证实一下这些人的真实身份,看看这些“无比紧急”的页面到底是真是假。 + +尽管任何人都可能遭遇中间人攻击,只要弄明白何为中间人攻击,理解中间人攻击如何发生,并采取有效的防范措施,就可以保护自己避免成为其受害者。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/mitm-attacks + +作者:[Jackie Lam][a] +选题:[lujun9972][b] +译者:[tinyeyeser](https://github.com/tinyeyeser) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/beenverified +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_password_chaos_engineer_monster.png?itok=J31aRccu "Security monster" +[2]: https://www.clamav.net +[3]: https://opensource.com/article/20/1/stop-typosquatting-attacks +[4]: https://github.com/gorhill/uBlock +[5]: https://www.beenverified.com/crime/what-is-a-man-in-the-middle-attack/ +[6]: https://creativecommons.org/licenses/by-sa/2.0/ diff --git a/published/202005/20200407 How to use pyenv to run multiple versions of Python on a Mac.md b/published/202005/20200407 How to use pyenv to run multiple versions of Python on a Mac.md new file mode 100644 index 0000000000..3bcf991e02 --- /dev/null +++ b/published/202005/20200407 How to use pyenv to run multiple versions of Python on a Mac.md @@ -0,0 +1,172 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12241-1.html) +[#]: subject: (How to use pyenv to run multiple versions of Python on a Mac) +[#]: via: (https://opensource.com/article/20/4/pyenv) +[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg) + +如何在 Mac 上使用 pyenv 运行多个版本的 Python +====== + +> 如果你在 macOS 上运行的项目需要没有安装的 Python 版本,请试试 pyenv。 + +![](https://img.linux.net.cn/data/attachment/album/202005/23/112041pawp65alw6tmea6l.jpg) + +即使对于有经验的开发人员,管理本地 Python 开发环境仍然是一个挑战。尽管有详细的[软件包管理策略][2],但仍需要采取另外的步骤来确保你在需要时运行所需的 Python 版本。 + +### 为什么 Python 版本重要? + +起初这是一个奇怪的概念,但是编程语言会像其他任何软件一样发生变化。它们有错误、修复和更新,就像你喜欢的 [API][3] 和任何其他软件一样。同样,不同的发行版由称为[语义化版本][4]的三位数标识。 + +> 😭😭😭 [pic.twitter.com/yt1Z2439W8][5] +> +> — Denny Perez (@dennyperez18) [May 28, 2019][6] + +多年来,Python 2 是该语言的常用主要版本。在 2020 年 1 月,Python 2 [到达最后寿命][7],此后,Python 的核心维护者将仅支持 Python 3。Python 3 稳步发展,并定期发布新更新。对我来说定期获取这些更新很重要。 + +最近,我试图在 macOS 上运行一个依赖于 Python 3.5.9 的项目,而我的系统上并没有安装这个版本。我认为 Python 包管理器 `pip` 可以安装它,但事实并非如此: + +``` +$ pip install python3.5.9 +Collecting python3.5.9 +  ERROR: Could not find a version that satisfies the requirement python3.5.9 (from versions: none) +ERROR: No matching distribution found for python3.5.9 +``` + +或者,我也可以从官方 Python 网站下载该版本,但我如何在我的 Mac 上与现有的 Python 版本一起运行?每次运行时指定 Python 解释器版本(例如 python3.7 或 python3.5)似乎很容易出错。一定会有更好的方法。 + +(说明:我知道这对经验丰富的 Python 开发人员没有意义,但对当时的我来说是有意义的。我很乐意谈一谈为什么我仍然认为它应该这样做。) + +### 安装和设置 pyenv + +值得庆幸的是,`pyenv` 可以绕开这一系列复杂的问题。首先,我需要安装 `pyenv`。我可以[从源码][8]克隆并编译它,但是我更喜欢通过 Homebrew 包管理器来管理软件包: + +``` +$ brew install pyenv +``` + +为了通过 `pyenv` 使用 Python 版本,必须了解 shell 的 `PATH` 变量。`PATH` 决定了 shell 通过命令的名称来搜索文件的位置。你必须确保 shell 程序能够找到通过 `pyenv` 运行的 Python 版本,而不是默认安装的版本(通常称为*系统版本*)。如果不更改路径,那么结果如下: + +``` +$ which python +/usr/bin/python +``` + +这是 Python 的系统版本。 + +要正确设置 `pyenv`,可以在 Bash 或 zsh 中运行以下命令: + +``` +$ PATH=$(pyenv root)/shims:$PATH +``` + +现在,如果你检查 Python 的版本,你会看到它是 `pyenv` 管理的版本: + +``` +$ which python +/Users/my_username/.pyenv/shims/python +``` + +该导出语句(`PATH=`)仅会对该 shell 实例进行更改,为了使更改永久生效,你需要将它添加到点文件当中。由于 zsh 是 macOS 的默认 shell,因此我将重点介绍它。将相同的语法添加到 `~/.zshrc` 文件中: + +``` +$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc +``` + +现在,每次我们在 zsh 中运行命令时,它将使用 `pyenv` 版本的 Python。请注意,我在 `echo` 中使用了单引号,因此它不会评估和扩展命令。 + +`.zshrc` 文件仅管理 zsh 实例,因此请确保检查你的 shell 程序并编辑关联的点文件。如果需要再次检查默认 shell 程序,可以运行 `echo $SHELL`。如果是 zsh,请使用上面的命令。如果你使用 Bash,请将 `~/.zshrc` 更改为 `~/.bashrc`。如果你想了解更多信息,可以在 `pyenv` 的 `README` 中深入研究[路径设置][9]。 + +### 使用 pyenv 管理 Python 版本 + +现在 `pyenv` 已经可用,我们可以看到它只有系统 Python 可用: + +``` +$ pyenv versions +system +``` + +如上所述,你绝对不想使用此版本([阅读更多有关信息][10])。现在 `pyenv` 已正确设置,我希望它能有我经常使用的几个不同版本的 Python。 + +有一种方法可以通过运行 `pyenv install --list` 来查看 pyenv 可以访问的所有仓库中的所有 Python 版本。这是一个很长的列表,将来回顾的时候可能会有所帮助。目前,我决定在 [Python 下载页面][11]找到的每个最新的“点版本”(3.5.x 或 3.6.x,其中 x 是最新的)。因此,我将安装 3.5.9 和 3.8.0: + +``` +$ pyenv install 3.5.9 +$ pyenv install 3.8.0 +``` + +这将需要一段时间,因此休息一会(或阅读上面的链接之一)。有趣的是,输出中显示了该版本的 Python 的下载和构建。例如,输出显示文件直接来自 [Python.org][12]。 + +安装完成后,你可以设置默认值。我喜欢最新的,因此将全局默认 Python 版本设置为最新版本: + +``` +$ pyenv global 3.8.0 +``` + +该版本立即在我的 shell 中设置完成。确认一下: + +``` +$ python -V +Python 3.8.0 +``` + +我要运行的项目仅适于 Python 3.5,因此我将在本地设置该版本并确认: + +``` +$ pyenv local 3.5.9 +$ python -V +Python 3.5.9 +``` + +因为我在 `pyenv` 中使用了 `local` 选项,所以它向当前目录添加了一个文件来跟踪该信息。 + +``` +$ cat .python-version +3.5.9 +``` + +现在,我终于可以为想要的项目设置虚拟环境,并确保运行正确版本的 Python。 + +``` +$ python -m venv venv +$ source ./venv/bin/activate +(venv) $ which python +/Users/mbbroberg/Develop/my_project/venv/bin/python +``` + +要了解更多信息,请查看有关[在 Mac 上管理虚拟环境][13]的教程。 + +### 总结 + +默认情况下,运行多个 Python 版本可能是一个挑战。我发现 `pyenv` 可以确保在我需要时可以有我需要的 Python 版本。 + +你还有其他初学者或中级 Python 问题吗? 请发表评论,我们将在以后的文章中考虑介绍它们。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/pyenv + +作者:[Matthew Broberg][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/mbbroberg +[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://opensource.com/article/19/4/managing-python-packages +[3]: https://opensource.com/article/19/5/api-evolution-right-way +[4]: https://semver.org/ +[5]: https://t.co/yt1Z2439W8 +[6]: https://twitter.com/dennyperez18/status/1133505310516232203?ref_src=twsrc%5Etfw +[7]: https://opensource.com/article/19/11/end-of-life-python-2 +[8]: https://github.com/pyenv/pyenv +[9]: https://github.com/pyenv/pyenv#understanding-path +[10]: https://opensource.com/article/19/5/python-3-default-mac +[11]: https://www.python.org/downloads/ +[12]: http://python.org +[13]: https://linux.cn/article-11086-1.html diff --git a/published/202005/20200408 My Linux Story- From 8-bit enthusiast to Unix sysadmin.md b/published/202005/20200408 My Linux Story- From 8-bit enthusiast to Unix sysadmin.md new file mode 100644 index 0000000000..60ab428ad3 --- /dev/null +++ b/published/202005/20200408 My Linux Story- From 8-bit enthusiast to Unix sysadmin.md @@ -0,0 +1,78 @@ +[#]: collector: (lujun9972) +[#]: translator: (Acceleratorrrr) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12228-1.html) +[#]: subject: (My Linux Story: From 8-bit enthusiast to Unix sysadmin) +[#]: via: (https://opensource.com/article/20/4/linux-story) +[#]: author: (James Farrell https://opensource.com/users/jamesf) + +我的 Linux 故事:从 8 位发烧友到 Unix 系统管理员 +====== + +> 我是如何从一个电脑爱好者成为职业系统管理员和 Linux 粉丝的。 + +![](https://img.linux.net.cn/data/attachment/album/202005/18/132731pnnzy7t5tz7hvc6z.jpg) + +故事得从 1980 年中期我父母给家里购买[苹果 \]\[c][2] 开始。尽管很喜欢打游戏,但我还是很快被实用又好玩的 BASIC 编程迷住了。那个年代的人们还是把电脑当作小一点的打字机对待,所以拥有“高级电脑技能”的人可以轻松使用他们的魔法。 + +以用 BASIC 和点阵打印机自动生成惩罚作业来举个例子。被罚写两百遍道歉时,我问老师我可不可以用打字代替手写。经过同意后,我写了 5 行 BASIC 语句来自动生成作业。另外一个小技巧是用非可视化文本编辑器,比如用 AppleWorks 微调字体、行距和边距,把学期论文“拉长”到要求的篇幅。 + +对电脑的痴迷很快让我得到了带有内存驱动卡和 x86 协处理器的苹果 ][gs。那时候,调制解调器和 BBS 刚开始火起来,有了这样的双处理器系统后,我就可以安装各种琳琅满目的软件。但是由于调制解调器 2400bps 的速度限制,对我每天都要下载几 KB 的有趣东西形成了阻碍。我对苹果痴迷一段时间,不久之后就换了。 + +### 探索 Unix + +我的本科专业是计算机信息系统,研究生专业是计算机科学。本科教育主要使用个人电脑,很少涉及大型分时系统。研究生的时候才开始真正有意思起来,拨号进入带有互联网连接的 Unix 简直打开了新世界的大门。尽管我依然用着我的双处理器 ][gs 来使用调制解调器还有写写论文,不过 Unix 系统真正吸引了我的注意力,因为它可以访问通用的 Telnet 游戏、文件传输协议(FTP)、在线邮箱和进行 C 语言编程。当时 Gopher 非常受欢迎,特别是在我们这群终端用户当中。 + +被分到学院计算机部门是我研究生命运的转折点,这个部门主管学校的计算机服务。学生们可以使用 X Window 终端来登录基于 [Ultrix][3] 的系统。大部分都是灰度的黑白界面,彩色处理在当时非常占用 CPU,也很影响系统性能。也有一些彩色系统还不错,但是这些机器都很慢。 + +我很喜欢那个时候,我有系统管理员权限而且工作是维护系统和网络。我有一些很好的导师,他们对我选择从事系统管理员而不是程序员起了关键作用(尽管我至今仍然热爱编程)。 + +### 从 Unix 到 Linux + +稀缺是创造之母,当需要分享匮乏的学校电脑系统资源的时候,我们学生们变得富有创造力。需要用电脑的学生是 Ultrix 工作站承受量的三到五倍,所以寻找资源往往是个难题(特别是要交付项目的时候)。在不需要图形化显示的时候,我们有一个 56k 的点对点协议的调制解调器池可供远程系统访问接入。但是找到一个有空余资源的机器并共享系统进行源码编译通常会导致进度缓慢。和大部分人一样,我发现晚上工作通常会有所帮助,但我还需要其它一些东西让我的项目迭代快一点。 + +后来学校的一个系统管理员建议我去看一个免费提供的 Unix 系统。那就是 Linux,它被装在 3.5 英寸的软盘里。多亏我们学校超快的 T1 线路,我很容易就搜索到新闻组和其他资源来学习如何下载它。它全是基于 32 位的英特尔 PC 机的,而我并没有这一类的设备。 + +幸运的是,我在学校的工作让我有机会接触到堆积如山的废旧电脑,所以命运的齿轮又开始旋转起来。 + +我找到了足够多的废旧 PC 组装了一个可靠的 80386 PC,带有足够内存(我确定不到 1GB),它有一个能用的显卡、一个细缆(同轴)以太网卡和一个硬盘。我所用的镜像是 Linux 内核 0.98,我不记得它是不是正式发行版的一部分了(可能是 SLS)。我所记得的是,它有一系列的软盘镜像,第一张软盘启动内核和一个最小安装程序,然后格式化硬盘,接着要求插入每个后续的软盘来安装 GNU 核心实用程序。在核心实用程序装好并引导系统之后,你可以下载和安装其他的软件包镜像,比如编译器之类的。 + +这是我学术道路上巨大的福音。在没有运行 X Window 显示服务器的情况下,这台电脑性能比学校的 Ultrix 工作站强很多。学校允许我把这台机器连到校园网络,挂载学校的学生网络文件系统(NFS)共享,并且能直接访问互联网。因为我的研究生课程用 [GCC][5](还有 Perl 4)来完成大部分学生作业,所以我可以在本地进行开发工作。这使得我可以独享关键资源,从而使我能够更快速地迭代我的项目。 + +但是,这个方案不是完美的。硬件有时会有点不稳定(这可能就是它们被丢弃的原因),但我都能搞定。真正让我感受到的是 Linux 和 Ultrix 在操作系统和系统库层面的差异。我开始理解移植软件到其他操作系统的意义,我可以自由地在任何地方开发,但是我必须以 Ultrix 编译的二进制文件交付项目。在一个平台上完美运行的 C 语言代码可能在另一个平台出错。这非常令人沮丧,但是我可能本能的察觉到了早期 Linux 解引用空指针的方法。Linux 倾向于把它作为空操作处理,但是 Ultrix 会立即触发核心转储和段错误 [SIGSEGV][6]。这是我第一次程序移植时的重大发现,正好在要交作业的几天之前。这同时对我研究 C++ 造成了一些麻烦,因为我粗心地同时使用了 `malloc()`/`free()` 和自动[构造函数和析构函数][7]处理,让我的项目到处都是空指针炸弹。 + +研究生课程快结束的时候,我升级到了一台性能野兽工作站:一颗英特尔 486DX2 66MHz 芯片、一块 SCSI 硬盘、一块光驱和一个 1024x768 RGB 显示器,并且还用一个 16550 UART 串口卡完美地匹配了我的新 US Robotics V.Everything 牌调制解调器。它可以双启动 Windows 和 Linux 系统,但更重要的是显卡和 CPU 的速度让我的开发环境幸福感倍增。那台旧的 386 依然在学校服役,不过我我现在大部分繁重的功课和钻研都转移到了家里。 + +和 [Mike Harris][8] 关于 90 年代的 Linux 故事类似,我真的对当时流行的 CD 集合很着迷。我住的附近有家新开的 Micro Center 计算机商店,这个宝库充满了电脑配件、高级专业书籍和你能想到的各种 Linux(以及免费的 Unix)CD。我还记得 [Yggdrasil][9] 和 [Slackware][10] 是我最喜欢的发行版。真正让人难以置信的是 CD 存储空间的巨大容量 —— 650MB!使它成为获得软件的必不可少的载体。是的,你可以用 56k 的速度下载,但是真的很慢。更别提大部分人负担不起存档这么多供以后使用的闲置数据。 + +### 而到了今天 + +就是这些开启了我长达 25 年的系统管理员的职业生涯和开源软件的乐趣。Linux 一直是我事业和个人开发中的重要组成部分。最近我依旧醉心于 Linux(主要是 CentOS、RedHat 和 Ubuntu),但也经常从 [FreeBSD][11] 和其他炫酷开源软件中得到乐趣。 + +Linux 让我来到了 Opensource.com,我希望在这里能回馈社区,为新一代电脑爱好者出一份力。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/linux-story + +作者:[James Farrell][a] +选题:[lujun9972][b] +译者:[Accelerator](https://github.com/Acceleratorrrr) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jamesf +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) +[2]: https://en.wikipedia.org/wiki/Apple_IIc +[3]: https://en.wikipedia.org/wiki/Ultrix +[4]: https://en.wikipedia.org/wiki/Point-to-Point_Protocol +[5]: https://en.wikipedia.org/wiki/GNU_Compiler_Collection +[6]: https://en.wikipedia.org/wiki/Segmentation_fault +[7]: https://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm +[8]: https://linux.cn/article-11831-1.html +[9]: https://en.wikipedia.org/wiki/Yggdrasil_Linux/GNU/X +[10]: http://slackware.com +[11]: https://www.freebsd.org/ diff --git a/published/202005/20200413 9 open source CSS frameworks for frontend web development.md b/published/202005/20200413 9 open source CSS frameworks for frontend web development.md new file mode 100644 index 0000000000..00ab65d520 --- /dev/null +++ b/published/202005/20200413 9 open source CSS frameworks for frontend web development.md @@ -0,0 +1,249 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12227-1.html) +[#]: subject: (9 open source CSS frameworks for frontend web development) +[#]: via: (https://opensource.com/article/20/4/open-source-css-frameworks) +[#]: author: (Bryant Son https://opensource.com/users/brson) + +9 个用于前端 Web 开发的开源 CSS 框架 +====== + +> 探索开源 CSS 框架,找到适合你的项目的框架。 + +![](https://img.linux.net.cn/data/attachment/album/202005/18/094922of81rqfiei8x78xi.jpg) + +当大多数人想到 Web 开发时,通常会想到 HTML 或 JavaScript。他们通常会忘记对网站的欣赏能力有更大影响的技术:[级联样式表][2]cascading style sheets(简称 CSS)。据维基百科的说法,CSS 既是网页中最重要的部分,也是最常被遗忘的部分,尽管它是万维网的三大基石技术之一。 + +本文将探讨九种流行的、强大的、开源的框架,是这些框架让构建漂亮的网站前端的 CSS 开发变得简单明了。 + +名称 | 介绍| 许可证 +---|---|--- +[Bootstrap][3] | 最流行的 CSS 框架,来自 Twitter | MIT +[PatternFly][4] | 开源框架,来自 Red Hat | MIT +[MDC Web][5] | Material Design 组件开源框架,来自 Google | MIT +[Pure][6] | 开源框架,来自 Yahoo | BSD +[Foundation][7] | 前端框架,来自 Zurb 基金会 | MIT +[Bulma][8] | 现代 CSS 框架,基于 Flexbox | MIT +[Skeleton][9] | 轻量级 CSS 框架 | MIT +[Materialize][10] | 基于 Material Design 的 CSS 框架 | MIT +[Bootflat][11] | 开源 Flat UI 工具,基于 Bootstrap 3.3.0 | MIT + +### Bootstrap + +[Bootstrap][2] 无疑是最流行的 CSS 框架,它是所有前端 Web 设计的开端。Bootstrap 由 Twitter 开发,提供了可用性、功能性和可扩展性。 + +![Bootstrap homepage][13] + +Bootstrap 还提供了大量的[例子][14]来帮助你入门。 + +![Bootstrap examples][15] + +使用 Bootstrap,你可以将不同的组件和布局拼接在一起,创造出有趣的页面设计。它还提供了大量详细的文档。 + +![Bootstrap documentation][16] + +Bootstrap 的 [GitHub][3] 仓库有超过 19000 个提交和 1100 个贡献者。它基于 MIT 许可证,所以(和这个列表中的所有框架一样)你也可以加入并贡献。 + +![Bootstrap GitHub][17] + +### PatternFly + +[PatternFly][18] 是由 Red Hat 开发的一个开源的(MIT 许可证)CSS 框架。PatternFly 采取了与 Bootstrap 不同的方法:Bootstrap 是为任何对创建一个漂亮网站感兴趣的人而设计的,而 PatternFly 主要针对企业级应用开发者,它提供的组件,如条形图、图表和导航,对于创建强大的、指标驱动的仪表盘非常有吸引力。事实上,Red Hat 在其产品(如 OpenShift)的设计中也使用了这个 CSS 框架。 + +![PatternFly homepage][19] + +除了静态 HTML 之外,PatternFly 还支持 ReactJS 框架,ReactJS 是 Facebook 开发的一个流行的 JavaScript 框架。 + +![PatternFly ReactJS support][20] + +PatternFly 有许多高级组件,如条形图、图表、[模态窗口][21]和布局等,适用于企业级应用。 + +![PatternFly chart component][22] + +PatternFly 的 [GitHub][4] 页面列出了超过 1050 个提交和 44 个贡献者。PatternFly 得到了很多人的关注,欢迎大家踊跃贡献。 + +![PatternFly GitHub][23] + +### MDC Web + +凭借其大获成功的安卓平台,谷歌以一个名为 [Material Design][24] 的概念制定了自己的标准设计准则。Material Design 标准旨在体现在所有谷歌的产品中,这些标准也可以面向大众,并且在 MIT 许可证下开源。 + +![Material Design homepage][25] + +Material Design 有许多“用于创建用户界面的交互式构建块”的[组件][26]。这些按钮、卡片、背景等可用于创建网站或移动应用程序的任何类型的用户界面。 + +![Material Components webpage][27] + +维护人员为不同的平台提供了详尽的文档。 + +![Material Design documentation][28] + +还有分步教程,其中包含用于实现不同目标的练习。 + +![Material Design tutorial][29] + +Material 组件的 GitHub 页面承载了面向不同平台的存储库,包括用于网站开发的 [Material Web 组件(MDC Web)][5]。MDC Web 有超过 5700 个提交和 349 个贡献者。 + +![MDC Web GitHub][30] + +### Pure + +Bootstrap、Patternfly 和 MDC Web 都是非常强大的 CSS 框架,但是它们可能相当的笨重和复杂。如果你想要一个轻量级的 CSS 框架,它更接近于自己编写 CSS,但又能帮助你建立一个漂亮的网页,可以试试 [Pure.css][31]。Pure 是一个轻量级的 CSS 框架,它的体积很小。它是由 Yahoo 开发的,在 BSD 许可证下开源。 + +![Pure.css homepage][32] + +尽管体积小,但 Pure 提供了建立一个漂亮网页的很多必要的组件。 + +![Pure.css components][33] + +Pure 的 [GitHub][6] 页面显示它有超过 565 个提交和 59 个贡献者。 + +![Pure.css GitHub][34] + +### Foundation + +[Foundation][35] 号称是世界上最先进的响应式前端框架。它提供了先进的功能和教程,用于构建专业网站。 + +![Foundation homepage][36] + +该框架被许多公司、组织甚至政客[使用][37],并且有大量的文档可用。 + +![Foundation documentation][38] + +Foundation 的 [GitHub][7] 页面显示有近 17000 个提交和 1000 个贡献者。和这个列表中的大多数其他框架一样,它也是在 MIT 许可证下提供的。 + +![Foundation GitHub][39] + +### Bulma + +[Bulma][40] 是一个基于 Flexbox 的开源框架,在 MIT 许可证下提供。Bulma 是一个相当轻量级的框架,因为它只需要一个 CSS 文件。 + +![Bulma homepage][41] + +Bulma 有简洁明快的文档,让你可以很容易地选择你想要探索的主题。它也有很多网页组件,你可以直接拿起来在设计中使用。 + +![Bulma documentation][42] + +Bulma 的 [GitHub][8] 页面列出了 1400 多个提交和 300 多个贡献者。 + +![Bulma GitHub][43] + +### Skeleton + +如果连 Pure 都觉得太重了,那么还有一个叫 [Skeleton][44] 的更轻量级框架。Skeleton 库只有 400 行左右的长度,而且这个框架只提供了开始你的 CSS 框架之旅的基本组件。 + +![Skeleton homepage][45] + +尽管它很简单,但 Skeleton 提供了详细的文档,可以帮助你马上上手。 + +![Skeleton documentation][46] + +Skeleton 的 [GitHub][9] 列出了 167 个提交和 22 个贡献者。然而,它不是很活跃,它的最后一次更新是在 2014 年,所以在使用之前可能需要一些维护。由于它是在 MIT 许可证下发布的,你可以自行维护。 + +![Skeleton GitHub][47] + +### Materialize + +[Materialize][48] 是一个基于 Google 的 Material Design 的响应式前端框架,带有由 Materialize 的贡献者开发的附加主题和组件。 + +![Materialize homepage][49] + +Materialize 的文档页面非常全面,而且相当容易理解。它的组件页面包括按钮、卡片、导航等等。 + +![Materialize documentation][50] + +Materialize 是 MIT 许可证下的开源项目,它的 [GitHub][10] 列出了超过 3800 个提交和 250 个贡献者。 + +![Materialize GitHub][51] + +### Bootflat + +[Bootflat][52] 是由 Twitter 的 Bootstrap 衍生出来的一个开源 CSS 框架。与 Bootstrap 相比, Bootflat 更简单,框架组件更轻量级。 + +![Bootflat homepage][53] + +Bootflat 的[文档][54]几乎像是受到了宜家的启发 —— 它显示的是每个组件的图片,没有太多的文字。 + +![Bootflat docs][55] + +Bootflat 是在 MIT 许可证下提供的,其 [GitHub][11] 页面包括 159 个提交和 8 个贡献者。 + +![Bootflat GitHub][56] + +### 你应该选择哪个 CSS 框架? + +对于开源的 CSS 框架,你有很多选择,这取决于你想要的工具功能有多丰富或简单。就像所有的技术决定一样,没有一个正确的答案,只有在给定的时间和项目中才有正确的选择。 + +尝试一下其中的一些,看看要在下一个项目中使用哪个。另外,我有没有错过任何有趣的开源 CSS 框架?请在下面的评论中分享你的反馈和想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/open-source-css-frameworks + +作者:[Bryant Son][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/brson +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet) +[2]: https://en.wikipedia.org/wiki/Cascading_Style_Sheets +[3]: https://github.com/twbs/bootstrap +[4]: https://github.com/patternfly/patternfly +[5]: https://github.com/material-components/material-components-web +[6]: https://github.com/pure-css/pure +[7]: https://github.com/foundation/foundation-sites +[8]: https://github.com/jgthms/bulma +[9]: https://github.com/dhg/Skeleton +[10]: https://github.com/Dogfalo/materialize +[11]: https://github.com/bootflat/bootflat.github.io +[12]: https://getbootstrap.com +[13]: https://opensource.com/sites/default/files/uploads/2_bootstrapscreenshot.jpg (Bootstrap homepage) +[14]: https://getbootstrap.com/docs/4.4/examples/ +[15]: https://opensource.com/sites/default/files/uploads/3_bootstrapsamples.jpg (Bootstrap examples) +[16]: https://opensource.com/sites/default/files/uploads/4_bootstrapdocs.jpg (Bootstrap documentation) +[17]: https://opensource.com/sites/default/files/uploads/5_bootstrapgithub.jpg (Bootstrap GitHub) +[18]: https://www.patternfly.org +[19]: https://opensource.com/sites/default/files/uploads/6_patternflyhomepage.jpg (PatternFly homepage) +[20]: https://opensource.com/sites/default/files/uploads/7_patternflyreactjs.jpg (PatternFly ReactJS support) +[21]: https://en.wikipedia.org/wiki/Modal_window +[22]: https://opensource.com/sites/default/files/uploads/8_patternflycomponents.jpg (PatternFly chart component) +[23]: https://opensource.com/sites/default/files/uploads/9_patternflygithub.jpg (PatternFly GitHub) +[24]: https://material.io +[25]: https://opensource.com/sites/default/files/uploads/10_materialhome.jpg (Material Design homepage) +[26]: https://material.io/components/ +[27]: https://opensource.com/sites/default/files/uploads/11_materialcomponents.jpg (Material Components webpage) +[28]: https://opensource.com/sites/default/files/uploads/12_materialdocs.jpg (Material Design documentation) +[29]: https://opensource.com/sites/default/files/uploads/13_materialtutorial.jpg (Material Design tutorial) +[30]: https://opensource.com/sites/default/files/uploads/15_materialgithub.jpg (MDC Web GitHub) +[31]: https://purecss.io +[32]: https://opensource.com/sites/default/files/uploads/16_purehome.jpg (Pure.css homepage) +[33]: https://opensource.com/sites/default/files/uploads/17_purecomponents.jpg (Pure.css components) +[34]: https://opensource.com/sites/default/files/uploads/18_puregithub.jpg (Pure.css GitHub) +[35]: https://get.foundation +[36]: https://opensource.com/sites/default/files/uploads/19_foundationhome.jpg (Foundation homepage) +[37]: https://zurb.com/responsive +[38]: https://opensource.com/sites/default/files/uploads/21_foundationdocs.jpg (Foundation documentation) +[39]: https://opensource.com/sites/default/files/uploads/22_foundationgithub.jpg (Foundation GitHub) +[40]: https://bulma.io +[41]: https://opensource.com/sites/default/files/uploads/23_bulmahome.jpg (Bulma homepage) +[42]: https://opensource.com/sites/default/files/uploads/24_bulmadoc.jpg (Bulma documentation) +[43]: https://opensource.com/sites/default/files/uploads/25_bulmagithub.jpg (Bulma GitHub) +[44]: http://getskeleton.com +[45]: https://opensource.com/sites/default/files/uploads/26_skeletonhome.jpg (Skeleton homepage) +[46]: https://opensource.com/sites/default/files/uploads/27_skeletondocs.jpg (Skeleton documentation) +[47]: https://opensource.com/sites/default/files/uploads/28_skeletongithub.jpg (Skeleton GitHub) +[48]: https://materializecss.com +[49]: https://opensource.com/sites/default/files/uploads/29_materializehome.jpg (Materialize homepage) +[50]: https://opensource.com/sites/default/files/uploads/30_materializedocs.jpg (Materialize documentation) +[51]: https://opensource.com/sites/default/files/uploads/31_materializegithub.jpg (Materialize GitHub) +[52]: http://bootflat.github.io +[53]: https://opensource.com/sites/default/files/uploads/32_bootflathome.jpg (Bootflat homepage) +[54]: http://bootflat.github.io/documentation.html +[55]: https://opensource.com/sites/default/files/uploads/33_bootflatdocs.jpg (Bootflat docs) +[56]: https://opensource.com/sites/default/files/uploads/34_bootflatgithub.jpg (Bootflat GitHub) diff --git a/published/202005/20200414 How I containerize a build system.md b/published/202005/20200414 How I containerize a build system.md new file mode 100644 index 0000000000..e268f779ff --- /dev/null +++ b/published/202005/20200414 How I containerize a build system.md @@ -0,0 +1,163 @@ +[#]: collector: (lujun9972) +[#]: translator: (LazyWolfLin) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12232-1.html) +[#]: subject: (How I containerize a build system) +[#]: via: (https://opensource.com/article/20/4/how-containerize-build-system) +[#]: author: (Ravi Chandran https://opensource.com/users/ravichandran) + +对构建系统进行容器化的指南 +====== + +> 搭建一个通过容器分发应用的可复用系统可能很复杂,但这儿有个好方法。 + +![](https://img.linux.net.cn/data/attachment/album/202005/19/085248ausakkjfu05akqr2.jpg) + +一个用于将源代码转换成可运行的应用的构建系统是由工具和流程共同组成。在转换过程中还涉及到代码的受众从软件开发者转变为最终用户,无论最终用户是运维的同事还是部署的同事。 + +在使用容器搭建了一些构建系统后,我觉得有一个不错的可复用的方法值得分享。虽然这些构建系统被用于编译机器学习算法和为嵌入式硬件生成可加载的软件镜像,但这个方法足够抽象,可用于任何基于容器的构建系统。 + +这个方法是以一种易于使用和维护的方式搭建或组织构建系统,但并不涉及处理特定编译器或工具容器化的技巧。它适用于软件开发人员构建软件,并将可维护镜像交给其他技术人员(无论是系统管理员、运维工程师或者其他一些头衔)的常见情况。该构建系统被从终端用户中抽象出来,这样他们就可以专注于软件。 + +### 为什么要容器化构建系统? + +搭建基于容器的可复用构建系统可以为软件团队带来诸多好处: + + * **专注**:我希望专注于应用的开发。当我调用一个工具进行“构建”时,我希望这个工具集能生成一个随时可用的二进制文件。我不想浪费时间在构建系统的查错上。实际上,我宁愿不了解,或者说不关心构建系统。 + * **一致的构建行为**:无论在哪种使用情况下,我都想确保整个团队使用相同版本的工具集并在构建时得到相同的结果。否则,我就得不断地处理“我这咋就是好的”的麻烦。在团队项目中,使用相同版本的工具集并对给定的输入源文件集产生一致的输出是非常重要。 + * **易于部署和升级**:即使向每个人都提供一套详细说明来安装一个项目的工具集,也可能会有人翻车。问题也可能是由于每个人对自己的 Linux 环境的个性化修改导致的。在团队中使用不同的 Linux 发行版(或者其他操作系统),情况可能还会变得更复杂。当需要将工具集升级到下一版本时,问题很快就会变得更糟糕。使用容器和本指南将使得新版本升级非常简单。 + +对我在项目中使用的构建系统进行容器化的这些经验显然很有价值,因为它可以缓解上述问题。我倾向于使用 Docker 作为容器工具,虽然在相对特殊的环境中安装和网络配置仍可能出现问题,尤其是当你在一个使用复杂代理的企业环境中工作时。但至少现在我需要解决的构建系统问题已经很少了。 + +### 漫步容器化的构建系统 + +我创建了一个[教程存储库][2],随后你可以克隆并检查它,或者按照本文内容进行操作。我将逐个介绍存储库中的文件。这个构建系统非常简单(它运行 `gcc`),从而可以让你专注于这个构建系统结构上。 + +### 构建系统需求 + +我认为构建系统中有两个关键点: + + * **标准化构建调用**:我希望能够指定一些形如 `/path/to/workdir` 的工作目录来构建代码。我希望以如下形式调用构建: + + ./build.sh /path/to/workdir + + 为了使得示例的结构足够简单(以便说明),我将假定输出也在 `/path/to/workdir` 路径下的某处生成。(否则,将增加容器中显示的卷的数量,虽然这并不困难,但解释起来比较麻烦。) + * **通过 shell 自定义构建调用**:有时,工具集会以出乎意料的方式被调用。除了标准的工具集调用 `build.sh` 之外,如果需要还可以为 `build.sh` 添加一些选项。但我一直希望能够有一个可以直接调用工具集命令的 shell。在这个简单的示例中,有时我想尝试不同的 `gcc` 优化选项并查看效果。为此,我希望调用: + + ./shell.sh /path/to/workdir + + 这将让我得到一个容器内部的 Bash shell,并且可以调用工具集和访问我的工作目录(`workdir`),从而我可以根据需要尝试使用这个工具集。 + +### 构建系统的架构 + +为了满足上述基本需求,这是我的构架系统架构: + +![Container build system architecture][3] + +在底部的 `workdir` 代表软件开发者用于构建的任意软件源码。通常,这个 `workdir` 是一个源代码的存储库。在构建之前,最终用户可以通过任何方式来操纵这个存储库。例如,如果他们使用 `git` 作为版本控制工具的话,可以使用 `git checkout` 切换到他们正在工作的功能分支上并添加或修改文件。这样可以使得构建系统独立于 `workdir` 之外。 + +顶部的三个模块共同代表了容器化的构建系统。最左边的黄色模块代表最终用户与构建系统交互的脚本(`build.sh` 和 `shell.sh`)。 + +在中间的红色模块是 Dockerfile 和相关的脚本 `build_docker_image.sh`。开发运营者(在这个例子中指我)通常将执行这个脚本并生成容器镜像(事实上我多次执行它直到一切正常为止,但这是另一回事)。然后我将镜像分发给最终用户,例如通过容器信任注册库container trusted registry进行分发。最终用户将需要这个镜像。另外,他们将克隆构建系统的存储库(即一个与[教程存储库][2]等效的存储库)。 + +当最终用户调用 `build.sh` 或者 `shell.sh` 时,容器内将执行右边的 `run_build.sh` 脚本。接下来我将详细解释这些脚本。这里的关键是最终用户不需要为了使用而去了解任何关于红色或者蓝色模块或者容器工作原理的知识。 + +### 构建系统细节 + +把教程存储库的文件结构映射到这个系统结构上。我曾将这个原型结构用于相对复杂构建系统,因此它的简单并不会造成任何限制。下面我列出存储库中相关文件的树结构。文件夹 `dockerize-tutorial` 能用构建系统的其他任何名称代替。在这个文件夹下,我用 `workdir` 的路径作参数调用 `build.sh` 或 `shell.sh`。 + +``` +dockerize-tutorial/ +├── build.sh +├── shell.sh +└── swbuilder +    ├── build_docker_image.sh +    ├── install_swbuilder.dockerfile +    └── scripts +        └── run_build.sh +``` + +请注意,我上面特意没列出 `example_workdir`,但你能在教程存储库中找到它。实际的源码通常存放在单独的存储库中,而不是构建工具库中的一部分;本教程为了不必处理两个存储库,所以我将它包含在这个存储库中。 + +如果你只对概念感兴趣,本教程并非必须的,因为我将解释所有文件。但是如果你继续本教程(并且已经安装 Docker),首先使用以下命令来构建容器镜像 `swbuilder:v1`: + +``` +cd dockerize-tutorial/swbuilder/ +./build_docker_image.sh +docker image ls  # resulting image will be swbuilder:v1 +``` + +然后调用 `build.sh`: + +``` +cd dockerize-tutorial +./build.sh ~/repos/dockerize-tutorial/example_workdir +``` + +下面是 [build.sh][4] 的代码。这个脚本从容器镜像 `swbuilder:v1` 实例化一个容器。而这个容器实例映射了两个卷:一个将文件夹 `example_workdir` 挂载到容器内部路径 `/workdir` 上,第二个则将容器外的文件夹 `dockerize-tutorial/swbuilder/scripts` 挂载到容器内部路径 `/scripts` 上。 + +``` +docker container run                              \ +    --volume $(pwd)/swbuilder/scripts:/scripts    \ +    --volume $1:/workdir                          \ +    --user $(id -u ${USER}):$(id -g ${USER})      \ +    --rm -it --name build_swbuilder swbuilder:v1  \ +    build +``` + +另外,`build.sh` 还会用你的用户名(以及组,本教程假设两者一致)去运行容器,以便在访问构建输出时不出现文件权限问题。 + +请注意,[shell.sh][5] 和 `build.sh` 大体上是一致的,除了两点不同:`build.sh` 会创建一个名为 `build_swbuilder` 的容器,而 `shell.sh` 则会创建一个名为 `shell_swbuilder` 的容器。这样一来,当其中一个脚本运行时另一个脚本被调用也不会产生冲突。 + +两个脚本之间的另一处关键不同则在于最后一个参数:`build.sh` 传入参数 `build` 而 `shell.sh` 则传入 `shell`。如果你看了用于构建容器镜像的 [Dockerfile][6],就会发现最后一行包含了下面的 `ENTRYPOINT` 语句。这意味着上面的 `docker container run` 调用将使用 `build` 或 `shell` 作为唯一的输入参数来执行 `run_build.sh` 脚本。 + +``` +# run bash script and process the input command +ENTRYPOINT [ "/bin/bash", "/scripts/run_build.sh"] +``` + +[run_build.sh][7] 使用这个输入参数来选择启动 Bash shell 还是调用 `gcc` 来构建 `helloworld.c` 项目。一个真正的构建系统通常会使用 Makefile 而非直接运行 `gcc`。 + +``` +cd /workdir + +if [ $1 = "shell" ]; then     +    echo "Starting Bash Shell" +    /bin/bash +elif [ $1 = "build" ]; then +    echo "Performing SW Build" +    gcc helloworld.c -o helloworld -Wall +fi +``` + +在使用时,如果你需要传入多个参数,当然也是可以的。我处理过的构建系统,构建通常是对给定的项目调用 `make`。如果一个构建系统有非常复杂的构建调用,则你可以让 `run_build.sh` 调用 `workdir` 下最终用户编写的特定脚本。 + +### 关于 scripts 文件夹的说明 + +你可能想知道为什么 `scripts` 文件夹位于目录树深处而不是位于存储库的顶层。两种方法都是可行的,但我不想鼓励最终用户到处乱翻并修改里面的脚本。将它放到更深的地方是一个让他们更难乱翻的方法。另外,我也可以添加一个 `.dockerignore` 文件去忽略 `scripts` 文件夹,因为它不是容器必需的部分。但因为它很小,所以我没有这样做。 + +### 简单而灵活 + +尽管这一方法很简单,但我在几个相当不同的构建系统中使用过,发现它相当灵活。相对稳定的部分(例如,一年仅修改数次的给定工具集)被固定在容器镜像内。较为灵活的部分则以脚本的形式放在镜像外。这使我能够通过修改脚本并将更改推送到构建系统存储库中,轻松修改调用工具集的方式。用户所需要做的是将更改拉到本地的构建系统存储库中,这通常是非常快的(与更新 Docker 镜像不同)。这种结构使其能够拥有尽可能多的卷和脚本,同时使最终用户摆脱复杂性。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/how-containerize-build-system + +作者:[Ravi Chandran][a] +选题:[lujun9972][b] +译者:[LazyWolfLin](https://github.com/LazyWolfLin) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/ravichandran +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_2015-3-osdc-lead.png?itok=O6aivM_W (Containers on a ship on the ocean) +[2]: https://github.com/ravi-chandran/dockerize-tutorial +[3]: https://opensource.com/sites/default/files/uploads/build_sys_arch.jpg (Container build system architecture) +[4]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/build.sh +[5]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/shell.sh +[6]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/swbuilder/install_swbuilder.dockerfile +[7]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/swbuilder/scripts/run_build.sh diff --git a/published/202005/20200416 Learning to love systemd.md b/published/202005/20200416 Learning to love systemd.md new file mode 100644 index 0000000000..5cacf21a0c --- /dev/null +++ b/published/202005/20200416 Learning to love systemd.md @@ -0,0 +1,318 @@ +[#]: collector: (lujun9972) +[#]: translator: (messon007) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12214-1.html) +[#]: subject: (Learning to love systemd) +[#]: via: (https://opensource.com/article/20/4/systemd) +[#]: author: (David Both https://opensource.com/users/dboth) + +学会爱上 systemd +====== + +> systemd 是所有进程之母,负责将 Linux 主机启动到可以做生产性任务的状态。 + +![](https://img.linux.net.cn/data/attachment/album/202005/13/085016gy86wj713zh7xq71.jpg) + +systemd(是的,全小写,即使在句子开头也是小写),是初始化程序(`init`)和 SystemV 初始化脚本的现代替代者。此外,它还有更多功能。 + +当我想到 `init` 和 SystemV 初始化时,像大多数系统管理员一样,我想到的是 Linux 的启动和关闭,而不是真正意义上的管理服务,例如在服务启动和运行后对其进行管理。像 `init` 一样,systemd 是所有进程之母,它负责使 Linux 主机启动到可以做生产性任务的状态。systemd 设定的一些功能比老的初始化程序要广泛得多,它要管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。 + +本系列文章是基于我的三期 Linux 培训课程《[使用和管理 Linux:从零开始进行学习系统管理][2]》部分内容的摘录,探讨了 systemd 在启动和启动完成后的功能。 + +### Linux 引导 + +Linux 主机从关机状态到运行状态的完整启动过程很复杂,但它是开放的并且是可知的。在详细介绍之前,我将简要介绍一下从主机硬件被上电到系统准备好用户登录的过程。大多数时候,“引导过程”被作为一个整体来讨论,但这是不准确的。实际上,完整的引导和启动过程包含三个主要部分: + +* 硬件引导:初始化系统硬件 +* Linux 引导boot:加载 Linux 内核和 systemd +* Linux 启动startup:systemd 为主机的生产性工作做准备 + +Linux 启动阶段始于内核加载了 `init` 或 systemd(取决于具体发行版使用的是旧的方式还是还是新的方式)之后。`init` 和 systemd 程序启动并管理所有其它进程,它们在各自的系统上都被称为“所有进程之母”。 + +将硬件引导与 Linux 引导及 Linux 启动区分开,并明确定义它们之间的分界点是很重要的。理解它们的差异以及它们每一个在使 Linux 系统进入生产状态所起的作用,才能够管理这些进程,并更好地确定大部分人所谓的“启动”问题出在哪里。 + +启动过程按照三步引导流程,使 Linux 计算机进入可进行生产工作的状态。当内核将主机的控制权转移到 systemd 时,启动环节开始。 + +### systemd 之争 + +systemd 引起了系统管理员和其它负责维护 Linux 系统正常运行人员的广泛争议。在许多 Linux 系统中,systemd 接管了大量任务,这在某些开发者和sysadmins群体中引起了反对和不和谐。 + +SystemV 和 systemd 是执行 Linux 启动环节的两种不同的方法。SystemV 启动脚本和 `init` 程序是老的方法,而使用目标target的 systemd 是新方法。尽管大多数现代 Linux 发行版都使用较新的 systemd 进行启动、关机和进程管理,但仍有一些发行版未采用。原因之一是某些发行版维护者和系统管理员喜欢老的 SystemV 方法,而不是新的 systemd。 + +我认为两者都有其优势。 + +#### 为何我更喜欢 SystemV + +我更喜欢 SystemV,因为它更开放。使用 Bash 脚本来完成启动。内核启动 `init` 程序(这是一个编译后的二进制)后,`init` 启动 `rc.sysinit` 脚本,该脚本执行许多系统初始化任务。`rc.sysinit` 执行完后,`init` 启动 `/etc/rc.d/rc` 脚本,该脚本依次启动 `/etc/rc.d/rcX.d` 中由 SystemV 启动脚本定义的各种服务。其中 `X` 是待启动的运行级别号。 + +除了 `init` 程序本身之外,所有这些程序都是开放且易于理解的脚本。可以通读这些脚本并确切了解整个启动过程中发生的事情,但是我不认为有太多系统管理员真正做到这一点。每个启动脚本都被编了号,以便按特定顺序启动预期的服务。服务是串行启动的,一次只能启动一个服务。 + +systemd 是由 Red Hat 的 Lennart Poettering 和 Kay Sievers 开发的,它是一个由大型的、编译的二进制可执行文件构成的复杂系统,不访问其源码就无法理解。它是开源的,因此“访问其源代码”并不难,只是不太方便。systemd 似乎表现出对 Linux 哲学多个原则的重大驳斥。作为二进制文件,systemd 无法被直接打开供系统管理员查看或进行简单更改。systemd 试图做所有事情,例如管理正在运行的服务,同时提供明显比 SystemV 更多的状态信息。它还管理硬件、进程、进程组、文件系统挂载等。systemd 几乎涉足于现代 Linux 主机的每个方面,使它成为系统管理的一站式工具。所有这些都明显违反了“程序应该小,且每个程序都应该只做一件事并做好”的原则。 + +#### 为何我更喜欢 systemd + +我更喜欢用 systemd 作为启动机制,因为它会根据启动阶段并行地启动尽可能多的服务。这样可以加快整个的启动速度,使得主机系统比 SystemV 更快地到达登录屏幕。 + +systemd 几乎可以管理正在运行的 Linux 系统的各个方面。它可以管理正在运行的服务,同时提供比SystemV 多得多的状态信息。它还管理硬件、进程和进程组、文件系统挂载等。systemd 几乎涉足于现代 Linux 操作系统的每方面,使其成为系统管理的一站式工具。(听起来熟悉吧?) + +systemd 工具是编译后的二进制文件,但该工具包是开放的,因为所有配置文件都是 ASCII 文本文件。可以通过各种 GUI 和命令行工具来修改启动配置,也可以添加或修改各种配置文件来满足特定的本地计算环境的需求。 + +#### 真正的问题 + +你认为我不能喜欢两种启动系统吗?我能,我会用它们中的任何一个。 + +我认为,SystemV 和 systemd 之间大多数争议的真正问题和根本原因在于,在系统管理层面[没有选择权][3]。使用 SystemV 还是 systemd 已经由各种发行版的开发人员、维护人员和打包人员选择了(但有充分的理由)。由于 `init` 极端的侵入性,挖出并替换 `init` 系统会带来很多影响,会带来很多在发行版设计过程之外难以解决的后果。 + +尽管该选择实际上是为我而选的,但我的Linux主机能不能开机、能不能工作,这是我平时最关心的。作为最终用户,甚至是系统管理员,我主要关心的是我是否可以完成我的工作,例如写我的书和这篇文章,安装更新以及编写脚本来自动化所有事情。只要我能做我的工作,我就不会真正在意发行版中使用的启动系统。 + +在启动或服务管理出现问题时,我会在意。无论主机上使用哪种启动系统,我都足够了解如何沿着事件顺序来查找故障并进行修复。 + +#### 替换SystemV + +以前曾有过用更现代的东西替代 SystemV 的尝试。大约在两个版本中,Fedora 使用了一个叫作 Upstart 的东西来替换老化的 SystemV,但是它没有取代 `init`,也没有提供我所注意到的任何变化。由于 Upstart 并未对 SystemV 的问题进行任何显著的改变,所以在这个方向上的努力很快就被放弃了,转而使用 systemd。 + +尽管大部分 Linux 开发人员都认可替换旧的 SystemV 启动系统是个好主意,但许多开发人员和系统管理员并不喜欢 systemd。与其重新讨论人们在 systemd 中遇到的或曾经遇到过的所有所谓的问题,不如带你去看两篇好文章,尽管有些陈旧,但它们涵盖了大多数内容。Linux 内核的创建者 Linus Torvalds 对 systemd 似乎不感兴趣。在 2014 年 ZDNet 的一篇文章《[Linus Torvalds 和其他人对 Linux 上的 systemd 的看法][4]》中,Linus 清楚地表达了他的感受。 + +> “实际上我对 systemd 本身没有任何特别强烈的意见。我对一些核心开发人员有一些问题,我认为他们在对待错误和兼容性方面过于轻率,而且我认为某些设计细节是疯狂的(例如,我不喜欢二进制日志),但这只是细节,不是大问题。” + +如果你对 Linus 不太了解的话,我可以告诉你,如果他不喜欢某事,他是非常直言不讳的,很明确,而且相当明确的表示不喜欢。他解决自己对事物不满的方式已经被社会更好地接受了。 + +2013 年,Poettering 写了一篇很长的博客,他在文章驳斥了[关于 systemd 的迷思][5],同时对创建 systemd 的一些原因进行了深入的剖析。这是一分很好的读物,我强烈建议你阅读。 + +### systemd 任务 + +根据编译过程中使用的选项(不在本系列中介绍),systemd 可以有多达 69 个二进制可执行文件执行以下任务,其中包括: + +* `systemd` 程序以 1 号进程(PID 1)运行,并提供使尽可能多服务并行启动的系统启动能力,它额外加快了总体启动时间。它还管理关机顺序。 +* `systemctl` 程序提供了服务管理的用户接口。 +* 支持 SystemV 和 LSB 启动脚本,以便向后兼容。 +* 服务管理和报告提供了比 SystemV 更多的服务状态数据。 +* 提供基本的系统配置工具,例如主机名、日期、语言环境、已登录用户的列表,正在运行的容器和虚拟机、系统帐户、运行时目录及设置,用于简易网络配置、网络时间同步、日志转发和名称解析的守护进程。 +* 提供套接字管理。 +* systemd 定时器提供类似 cron 的高级功能,包括在相对于系统启动、systemd 启动时间、定时器上次启动时间的某个时间点运行脚本。 +* 它提供了一个工具来分析定时器规范中使用的日期和时间。 +* 能感知分层的文件系统挂载和卸载功能可以更安全地级联挂载的文件系统。 +* 允许主动的创建和管理临时文件,包括删除。 +* D-Bus 的接口提供了在插入或移除设备时运行脚本的能力。这允许将所有设备(无论是否可插拔)都被视为即插即用,从而大大简化了设备的处理。 +* 分析启动环节的工具可用于查找耗时最多的服务。 +* 它包括用于存储系统消息的日志以及管理日志的工具。 + +### 架构 + +这些以及更多的任务通过许多守护程序、控制程序和配置文件来支持。图 1 显示了许多属于 systemd 的组件。这是一个简化的图,旨在提供概要描述,因此它并不包括所有独立的程序或文件。它也不提供数据流的视角,数据流是如此复杂,因此在本系列文章的背景下没用。 + +![系统架构][6] + +*图 1:systemd 的架构,作者 Shmuel Csaba Otto Traian (CC BY-SA 3.0)* + +如果要完整地讲解 systemd 就需要一本书。你不需要了解图 1 中的 systemd 组件是如何组合在一起的细节。只需了解支持各种 Linux 服务管理以及日志文件和日志处理的程序和组件就够了。但是很明显, systemd 并不是某些批评者所宣称的那样,它是一个单一的怪物。 + +### 作为 1 号进程的 systemd + +systemd 是 1 号进程(PID 1)。它的一些功能,比老的 SystemV3 `init` 要广泛得多,用于管理正在运行的 Linux 主机的许多方面,包括挂载文件系统以及启动和管理 Linux 生产主机所需的系统服务。与启动环节无关的任何 systemd 任务都不在本文讨论范围之内(但本系列后面的一些文章将探讨其中的一些任务)。 + +首先,systemd 挂载 `/etc/fstab` 所定义的文件系统,包括所有交换文件或分区。此时,它可以访问位于 `/etc` 中的配置文件,包括它自己的配置文件。它使用其配置链接 `/etc/systemd/system/default.target` 来确定将主机引导至哪个状态或目标。`default.target` 文件是指向真实目标文件的符号链接。对于桌面工作站,通常是 `graphical.target`,它相当于 SystemV 中的运行级别 5。对于服务器,默认值更可能是 `multi-user.target`,相当于 SystemV 中的运行级别 3。`emergency.target` 类似于单用户模式。目标target服务service是 systemd 的单元unit。 + +下表(图 2)将 systemd 目标与老的 SystemV 启动运行级别进行了比较。systemd 提供 systemd 目标别名以便向后兼容。目标别名允许脚本(以及许多系统管理员)使用 SystemV 命令(如 `init 3`)更改运行级别。当然,SystemV 命令被转发给 systemd 进行解释和执行。 + +systemd 目标 | SystemV 运行级别 | 目标别名 | 描述 +--- | --- | --- | --- +`default.target` | | | 此目标总是通过符号连接的方式成为 `multi-user.target` 或 `graphical.target` 的别名。systemd 始终使用 `default.target` 来启动系统。`default.target` 绝不应该设为 `halt.target`,`poweroff.target` 或 `reboot.target` 的别名。 +`graphic.target` | 5 | `runlevel5.target` |带有 GUI 的 `multi-user.target`。 + | 4 | `runlevel4.target` |未用。在 SystemV 中运行级别 4 与运行级别 3 相同。可以创建并自定义此目标以启动本地服务,而无需更改默认的 `multi-user.target`。 +`multi-user.target` | 3 | `runlevel3.target` |所有服务在运行,但仅有命令行界面(CLI)。 + | 2 | `runlevel2.target` | 多用户,没有 NFS,其它所有非 GUI 服务在运行。 +`rescue.target` | 1 | `runlevel1.target` | 基本系统,包括挂载文件系统,运行最基本的服务和主控制台的恢复 shell。 +`emergency.target` | S | |单用户模式:没有服务运行;不挂载文件系统。这是最基本的工作级别,只有主控制台上运行的一个紧急 Shell 供用户与系统交互。 +`halt.target` | | | 停止系统而不关闭电源。 +`reboot.target` | 6 | `runlevel6.target` | 重启。 +`poweroff.target` | 0 | `runlevel0.target` | 停止系统并关闭电源。 + +*图 2:SystemV 运行级别与 systemd 目标和一些目标别名的比较* + +每个目标在其配置文件中都描述了一个依赖集。systemd 启动必须的依赖项,这些依赖项是运行 Linux 主机到特定功能级别所需的服务。当目标配置文件中列出的所有依赖项被加载并运行后,系统就在该目标级别运行了。在图 2 中,功能最多的目标位于表的顶部,从顶向下,功能逐步递减。 + +systemd 还会检查老的 SystemV `init` 目录,以确认是否存在任何启动文件。如果有,systemd 会将它们作为配置文件以启动它们描述的服务。网络服务是一个很好的例子,在 Fedora 中它仍然使用 SystemV 启动文件。 + +图 3(如下)是直接从启动手册页复制来的。它显示了 systemd 启动期间一般的事件环节以及确保成功启动的基本顺序要求。 + +``` + cryptsetup-pre.target + | + (various low-level v + API VFS mounts: (various cryptsetup devices...) + mqueue, configfs, | | + debugfs, ...) v | + | cryptsetup.target | + | (various swap | | remote-fs-pre.target + | devices...) | | | | + | | | | | v + | v local-fs-pre.target | | | (network file systems) + | swap.target | | v v | + | | v | remote-cryptsetup.target | + | | (various low-level (various mounts and | | | + | | services: udevd, fsck services...) | | remote-fs.target + | | tmpfiles, random | | | / + | | seed, sysctl, ...) v | | / + | | | local-fs.target | | / + | | | | | | / + \____|______|_______________ ______|___________/ | / + \ / | / + v | / + sysinit.target | / + | | / + ______________________/|\_____________________ | / + / | | | \ | / + | | | | | | / + v v | v | | / + (various (various | (various | |/ + timers...) paths...) | sockets...) | | + | | | | | | + v v | v | | + timers.target paths.target | sockets.target | | + | | | | v | + v \_______ | _____/ rescue.service | + \|/ | | + v v | + basic.target rescue.target | + | | + ________v____________________ | + / | \ | + | | | | + v v v | + display- (various system (various system | + manager.service services services) | + | required for | | + | graphical UIs) v v + | | multi-user.target + emergency.service | | | + | \_____________ | _____________/ + v \|/ + emergency.target v + graphical.target +``` + +*图 3: systemd 启动图* + +`sysinit.target` 和 `basic.target` 目标可以看作启动过程中的检查点。尽管 systemd 的设计目标之一是并行启动系统服务,但是某些服务和功能目标必须先启动,然后才能启动其它服务和目标。直到该检查点所需的所有服务和目标被满足后才能通过这些检查点。 + +当 `sysinit.target` 所依赖的所有单元都完成时,就会到达 `sysinit.target`。所有这些单元,包括挂载文件系统、设置交换文件、启动 Udev、设置随机数生成器种子、启动低层服务以及配置安全服务(如果一个或多个文件系统是加密的)都必须被完成,但在 `sysinit.target` 中,这些任务可以并行执行。 + +`sysinit.target` 启动了系统接近正常运行所需的所有低层服务和单元,它们也是进入 `basic.target` 所需的。 + +在完成 `sysinit.target` 之后,systemd 会启动实现下一个目标所需的所有单元。`basic.target` 通过启动所有下一目标所需的单元来提供一些额外功能。包括设置为各种可执行程序目录的路径、设置通信套接字和计时器之类。 + +最后,用户级目标 `multi-user.target` 或 `graphical.target` 被初始化。要满足 `graphical.target` 的依赖必须先达到 `multi-user.target`。图 3 中带下划线的目标是通常的启动目标。当达到这些目标之一时,启动就完成了。如果 `multi-user.target` 是默认设置,那么你应该在控制台上看到文本模式的登录界面。如果 `graphical.target` 是默认设置,那么你应该看到图形的登录界面。你看到的具体的 GUI 登录界面取决于你的默认显示管理器。 + +引导手册页还描述并提供了引导到初始化 RAM 磁盘和 systemd 关机过程的图。 + +systemd 还提供了一个工具,该工具列出了完整的启动过程或指定单元的依赖项。单元是一个可控的 systemd 资源实体,其范围可以从特定服务(例如 httpd 或 sshd)到计时器、挂载、套接字等。尝试以下命令并滚动查看结果。 + +``` +systemctl list-dependencies graphical.target +``` + +注意,这会完全展开使系统进入 `graphical.target` 运行模式所需的顶层目标单元列表。也可以使用 `--all` 选项来展开所有其它单元。 + +``` +systemctl list-dependencies --all graphical.target +``` + +你可以使用 `less` 命令来搜索诸如 `target`、`slice` 和 `socket` 之类的字符串。 + +现在尝试下面的方法。 + +``` +systemctl list-dependencies multi-user.target +``` + +和 + +``` +systemctl list-dependencies rescue.target +``` + +和 + +``` +systemctl list-dependencies local-fs.target +``` + +和 + +``` +systemctl list-dependencies dbus.service +``` + +这个工具帮助我可视化我正用的主机的启动依赖细节。继续花一些时间探索一个或多个 Linux 主机的启动树。但是要小心,因为 systemctl 手册页包含以下注释: + +> “请注意,此命令仅列出当前被服务管理器加载到内存的单元。尤其是,此命令根本不适合用于获取特定单元的全部反向依赖关系列表,因为它不会列出被单元声明了但是未加载的依赖项。” + +### 结尾语 + +即使在没有深入研究 systemd 之前,很明显能看出它既强大又复杂。显然,systemd 不是单一、庞大、独体且不可知的二进制文件。相反,它是由许多较小的组件和旨在执行特定任务的子命令组成。 + +本系列的下一篇文章将更详细地探讨 systemd 的启动,以及 systemd 的配置文件,更改默认的目标以及如何创建简单服务单元。 + +### 资源 + +互联网上有大量关于 systemd 的信息,但是很多都很简短、晦涩甚至是带有误导。除了本文提到的资源外,以下网页还提供了有关 systemd 启动的更详细和可靠的信息。 + +* Fedora 项目有一个很好的实用的 [systemd 指南][7]。它有你需要知道的通过 systemd 来配置、管理和维护 Fedora 主机所需的几乎所有知识。 +* Fedora 项目还有一个不错的[速记表][8],将老的 SystemV 命令与对比的 systemd 命令相互关联。 +* 有关 systemd 的详细技术信息及创建它的原因,请查看 [Freedesktop.org][9] 对 [systemd 描述][10]。 +* [Linux.com][11] 的“systemd 的更多乐趣”提供了更高级的 systemd [信息和技巧][12]。 + +还有针对 Linux 系统管理员的一系列技术性很强的文章,作者是 systemd 的设计师和主要开发者 Lennart Poettering。这些文章是在 2010 年 4 月至 2011 年 9 月之间撰写的,但它们现在和那时一样有用。关于 systemd 及其生态的其它许多好文都基于这些论文。 + +* [重新思考 1 号进程][13] +* [systemd 系统管理员篇 I][14] +* [systemd 系统管理员篇 II][15] +* [systemd 系统管理员篇 III][16] +* [systemd 系统管理员篇 IV][17] +* [systemd 系统管理员篇 V][18] +* [systemd 系统管理员篇 VI][19] +* [systemd 系统管理员篇 VII][20] +* [systemd 系统管理员篇 VIII][21] +* [systemd 系统管理员篇 IX][22] +* [systemd 系统管理员篇 X][23] +* [systemd 系统管理员篇 XI][24] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/systemd + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[messon007](https://github.com/messon007) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background) +[2]: http://www.both.org/?page_id=1183 +[3]: http://www.osnews.com/story/28026/Editorial_Thoughts_on_Systemd_and_the_Freedom_to_Choose +[4]: https://www.zdnet.com/article/linus-torvalds-and-others-on-linuxs-systemd/ +[5]: http://0pointer.de/blog/projects/the-biggest-myths.html +[6]: https://opensource.com/sites/default/files/uploads/systemd-architecture.png (systemd architecture) +[7]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[8]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[9]: http://Freedesktop.org +[10]: http://www.freedesktop.org/wiki/Software/systemd +[11]: http://Linux.com +[12]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[13]: http://0pointer.de/blog/projects/systemd.html +[14]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[15]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[16]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[17]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[18]: http://0pointer.de/blog/projects/three-levels-of-off.html +[19]: http://0pointer.de/blog/projects/changing-roots +[20]: http://0pointer.de/blog/projects/blame-game.html +[21]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[22]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[23]: http://0pointer.de/blog/projects/instances.html +[24]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202005/20200417 Create a SDN on Linux with open source.md b/published/202005/20200417 Create a SDN on Linux with open source.md new file mode 100644 index 0000000000..e05b649ee1 --- /dev/null +++ b/published/202005/20200417 Create a SDN on Linux with open source.md @@ -0,0 +1,185 @@ +[#]: collector: (lujun9972) +[#]: translator: (messon007) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12199-1.html) +[#]: subject: (Create a SDN on Linux with open source) +[#]: via: (https://opensource.com/article/20/4/quagga-linux) +[#]: author: (M Umer https://opensource.com/users/noisybotnet) + +在 Linux 上使用开源软件创建 SDN +====== + +> 使用开源路由协议栈 Quagga,使你的 Linux 系统成为一台路由器。 + +![](https://img.linux.net.cn/data/attachment/album/202005/09/093541rqx3zr5dxn3yvnq6.jpg) + +网络路由协议分为两大类:内部网关协议和外部网关协议。路由器使用内部网关协议在单个自治系统内共享信息。如果你用的是 Linux,则可以通过开源(GPLv2)路由协议栈 [Quagga][2] 使其表现得像一台路由器。 + +### Quagga 是什么? + +Quagga 是一个[路由软件包][3],并且是 [GNU Zebra][4] 的一个分支。它为类 Unix 平台提供了所有主流路由协议的实现,例如开放最短路径优先(OSPF),路由信息协议(RIP),边界网关协议(BGP)和中间系统到中间系统协议(IS-IS)。 + +尽管 Quagga 实现了 IPv4 和 IPv6 的路由协议,但它并不是一个完整的路由器。一个真正的路由器不仅实现了所有路由协议,而且还有转发网络流量的能力。 Quagga 仅仅实现了路由协议栈,而转发网络流量的工作由 Linux 内核处理。 + +### 架构 + +Quagga 通过特定协议的守护程序实现不同的路由协议。守护程序名称与路由协议相同,加了字母“d”作为后缀。Zebra 是核心,也是与协议无关的守护进程,它为内核提供了一个[抽象层][5],并通过 TCP 套接字向 Quagga 客户端提供 Zserv API。每个特定协议的守护程序负责运行相关的协议,并基于交换的信息来建立路由表。 + +![Quagga architecture][6] + +### 环境 + +本教程通过 Quagga 实现的 OSPF 协议来配置动态路由。该环境包括两个名为 Alpha 和 Beta 的 CentOS 7.7 主机。两台主机共享访问 **192.168.122.0/24** 网络。 + +**主机 Alpha:** + +IP:192.168.122.100/24 +网关:192.168.122.1 + +**主机 Beta:** + +IP:192.168.122.50/24 +网关:192.168.122.1 + +### 安装软件包 + +首先,在两台主机上安装 Quagga 软件包。它存在于 CentOS 基础仓库中: + +``` +yum install quagga -y +``` + +### 启用 IP 转发 + +接下来,在两台主机上启用 IP 转发,因为它将由 Linux 内核来执行: + +``` +sysctl -w net.ipv4.ip_forward = 1 +sysctl -p +``` + +### 配置 + +现在,进入 `/etc/quagga` 目录并为你的设置创建配置文件。你需要三个文件: + +* `zebra.conf`:Quagga 守护程序的配置文件,你可以在其中定义接口及其 IP 地址和 IP 转发 +* `ospfd.conf`:协议配置文件,你可以在其中定义将通过 OSPF 协议提供的网络 +* `daemons`:你将在其中指定需要运行的相关的协议守护程序 + +在主机 Alpha 上, + +``` + [root@alpha]# cat /etc/quagga/zebra.conf +interface eth0 + ip address 192.168.122.100/24 + ipv6 nd suppress-ra +interface eth1 + ip address 10.12.13.1/24 + ipv6 nd suppress-ra +interface lo +ip forwarding +line vty + +[root@alpha]# cat /etc/quagga/ospfd.conf +interface eth0 +interface eth1 +interface lo +router ospf + network 192.168.122.0/24 area 0.0.0.0 + network 10.12.13.0/24 area 0.0.0.0 +line vty + +[root@alphaa ~]# cat /etc/quagga/daemons +zebra=yes +ospfd=yes +``` + +在主机 Beta 上, + +``` +[root@beta quagga]# cat zebra.conf +interface eth0 + ip address 192.168.122.50/24 + ipv6 nd suppress-ra +interface eth1 + ip address 10.10.10.1/24 + ipv6 nd suppress-ra +interface lo +ip forwarding +line vty + +[root@beta quagga]# cat ospfd.conf +interface eth0 +interface eth1 +interface lo +router ospf + network 192.168.122.0/24 area 0.0.0.0 + network 10.10.10.0/24 area 0.0.0.0 +line vty + +[root@beta ~]# cat /etc/quagga/daemons +zebra=yes +ospfd=yes +``` + +### 配置防火墙 + +要使用 OSPF 协议,必须允许它通过防火墙: + +``` +firewall-cmd --add-protocol=ospf –permanent + +firewall-cmd –reload +``` + +现在,启动 `zebra` 和 `ospfd` 守护程序。 + +``` +# systemctl start zebra +# systemctl start ospfd +``` + +用下面命令在两个主机上查看路由表: + +``` +[root@alpha ~]# ip route show   +default via 192.168.122.1 dev eth0 proto static metric 100 +10.10.10.0/24 via 192.168.122.50 dev eth0 proto zebra metric 20 +10.12.13.0/24 dev eth1 proto kernel scope link src 10.12.13.1 +192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.100 metric 100 +``` + +你可以看到 Alpha 上的路由表包含通过 **192.168.122.50** 到达 **10.10.10.0/24** 的路由项,它是通过协议 zebra 获取的。同样,在主机 Beta 上,该表包含通过 **192.168.122.100** 到达网络 **10.12.13.0/24** 的路由项。 + +``` +[root@beta ~]# ip route show +default via 192.168.122.1 dev eth0 proto static metric 100 +10.10.10.0/24 dev eth1 proto kernel scope link src 10.10.10.1 +10.12.13.0/24 via 192.168.122.100 dev eth0 proto zebra metric 20 +192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.50 metric 100 +``` + +### 结论 + +如你所见,环境和配置相对简单。要增加复杂性,你可以向路由器添加更多网络接口,以为更多网络提供路由。你也可以使用相同的方法来实现 BGP 和 RIP 协议。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/quagga-linux + +作者:[M Umer][a] +选题:[lujun9972][b] +译者:[messon007](https://github.com/messon007) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/noisybotnet +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://www.quagga.net/ +[3]: https://en.wikipedia.org/wiki/Quagga_(software) +[4]: https://www.gnu.org/software/zebra/ +[5]: https://en.wikipedia.org/wiki/Abstraction_layer +[6]: https://opensource.com/sites/default/files/uploads/quagga_arch.png (Quagga architecture) diff --git a/published/202005/20200417 How to compress files on Linux 5 ways.md b/published/202005/20200417 How to compress files on Linux 5 ways.md new file mode 100644 index 0000000000..5ba0c7feeb --- /dev/null +++ b/published/202005/20200417 How to compress files on Linux 5 ways.md @@ -0,0 +1,203 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12190-1.html) +[#]: subject: (How to compress files on Linux 5 ways) +[#]: via: (https://www.networkworld.com/article/3538471/how-to-compress-files-on-linux-5-ways.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +在 Linux 上压缩文件的 5 种方法 +====== + +> 在 Linux 系统上有很多可以用于压缩文件的工具,但它们的表现并不都是一样的,也不是所有的压缩效果都是一样的。在这篇文章中,我们比较其中的五个工具。 + +![](https://img.linux.net.cn/data/attachment/album/202005/06/231536tgxma941yb8dgl53.jpg) + +在 Linux 上有不少用于压缩文件的命令。最新最有效的一个方法是 `xz`,但是所有的方法都有节省磁盘空间和维护备份文件供以后使用的优点。在这篇文章中,我们将比较这些压缩命令并指出显著的不同。 + +### tar + +`tar` 命令不是专门的压缩命令。它通常用于将多个文件拉入一个单个的文件中,以便容易地传输到另一个系统,或者将文件作为一个相关的组进行备份。它也提供压缩的功能,这就很有意义了,附加一个 `z` 压缩选项能够实现压缩文件。 + +当使用 `z` 选项为 `tar` 命令附加压缩过程时,`tar` 使用 `gzip` 来进行压缩。 + +就像压缩一组文件一样,你可以使用 `tar` 来压缩单个文件,尽管这种操作与直接使用 `gzip` 相比没有特别的优势。要使用 `tar` 这样做,只需要使用 `tar cfz newtarfile filename` 命令来标识要压缩的文件,就像标识一组文件一样,像这样: + +``` +$ tar cfz bigfile.tgz bigfile + ^ ^ + | | + +- 新的文件 +- 将被压缩的文件 + +$ ls -l bigfile* +-rw-rw-r-- 1 shs shs 103270400 Apr 16 16:09 bigfile +-rw-rw-r-- 1 shs shs 21608325 Apr 16 16:08 bigfile.tgz +``` + +注意,文件的大小显著减少了。 + +如果你愿意,你可以使用 `tar.gz` 扩展名,这可能会使文件的特征更加明显,但是大多数的 Linux 用户将很可能会意识到与 `tgz` 的意思是一样的 – `tar` 和 `gz` 的组合来显示文件是一个压缩的 tar 文件。在压缩完成后,你将同时得到原始文件和压缩文件。 + +要将很多文件收集在一起并在一个命令中压缩出 “tar ball”,使用相同的语法,但要指定要包含的文件为一组,而不是单个文件。这里有一个示例: + +``` +$ tar cfz bin.tgz bin/* + ^ ^ + | +-- 将被包含的文件 + + 新的文件 +``` + +### zip + +`zip` 命令创建一个压缩文件,与此同时保留原始文件的完整性。语法像使用 `tar` 一样简单,只是你必需记住,你的原始文件名称应该是命令行上的最后一个参数。 + +``` +$ zip ./bigfile.zip bigfile +updating: bigfile (deflated 79%) +$ ls -l bigfile bigfile.zip +-rw-rw-r-- 1 shs shs 103270400 Apr 16 11:18 bigfile +-rw-rw-r-- 1 shs shs 21606889 Apr 16 11:19 bigfile.zip +``` + +### gzip + +`gzip` 命令非常容易使用。你只需要键入 `gzip`,紧随其后的是你想要压缩的文件名称。不像上述描述的命令,`gzip` 将“就地”“加密”文件。换句话说,原始文件将被“加密”文件替换。 + +``` +$ gzip bigfile +$ ls -l bigfile* +-rw-rw-r-- 1 shs shs 21606751 Apr 15 17:57 bigfile.gz +``` + +### bzip2 + +像使用 `gzip` 命令一样,`bzip2` 将在你选择的文件“就地”压缩,不留下原始文件。 + +``` +$ bzip bigfile +$ ls -l bigfile* +-rw-rw-r-- 1 shs shs 18115234 Apr 15 17:57 bigfile.bz2 +``` + +### xz + +`xz` 是压缩命令团队中的一个相对较新的成员,在压缩文件的能力方面,它是一个领跑者。像先前的两个命令一样,你只需要将文件名称提供给命令。再强调一次,原始文件被就地压缩。 + +``` +$ xz bigfile +$ ls -l bigfile* +-rw-rw-r-- 1 shs shs 13427236 Apr 15 17:30 bigfile.xz +``` + +对于大文件来说,你可能会注意到 `xz` 将比其它的压缩命令花费更多的运行时间,但是压缩的结果却是非常令人赞叹的。 + +### 对比 + +大多数人都听说过“大小不是一切”。所以,让我们比较一下文件大小以及一些当你计划如何压缩文件时的问题。 + +下面显示的统计数据都与压缩单个文件相关,在上面显示的示例中使用 `bigfile`。这个文件是一个大的且相当随机的文本文件。压缩率在一定程度上取决于文件的内容。 + +#### 大小减缩率 + +当比较时,上面显示的各种压缩命产生下面的结果。百分比表示压缩文件与原始文件的比较效果。 + +``` +-rw-rw-r-- 1 shs shs 103270400 Apr 16 14:01 bigfile +------------------------------------------------------ +-rw-rw-r-- 1 shs shs 18115234 Apr 16 13:59 bigfile.bz2 ~17% +-rw-rw-r-- 1 shs shs 21606751 Apr 16 14:00 bigfile.gz ~21% +-rw-rw-r-- 1 shs shs 21608322 Apr 16 13:59 bigfile.tgz ~21% +-rw-rw-r-- 1 shs shs 13427236 Apr 16 14:00 bigfile.xz ~13% +-rw-rw-r-- 1 shs shs 21606889 Apr 16 13:59 bigfile.zip ~21% +``` + +`xz` 命令获胜,最终只有压缩文件 13% 的大小,但是所有这些压缩命令都相当显著地减少原始文件的大小。 + +#### 是否替换原始文件 + +`bzip2`、`gzip` 和 `xz` 命令都用压缩文件替换原始文件。`tar` 和 `zip` 命令不替换。 + +#### 运行时间 + +`xz` 命令似乎比其它命令需要花费更多的时间来“加密”文件。对于 `bigfile` 来说,大概的时间是: + +``` +命令 运行时间 +tar 4.9 秒 +zip 5.2 秒 +bzip2 22.8 秒 +gzip 4.8 秒 +xz 50.4 秒 +``` + +解压缩文件很可能比压缩时间要短得多。 + +#### 文件权限 + +不管你对压缩文件设置什么权限,压缩文件的权限将基于你的 `umask` 设置,但 `bzip2` 除外,它保留了原始文件的权限。 + +#### 与 Windows 的兼容性 + +`zip` 命令创建的文件可以在 Windows 系统以及 Linux 和其他 Unix 系统上使用(即解压),而无需安装其他工具,无论这些工具可能是可用还是不可用的。 + +### 解压缩文件 + +解压文件的命令与压缩文件的命令类似。在我们运行上述压缩命令后,这些命令用于解压缩 `bigfile`: + + * tar: `tar xf bigfile.tgz` + * zip: `unzip bigfile.zip` + * gzip: `gunzip bigfile.gz` + * bzip2: `bunzip2 bigfile.gz2` + * xz: `xz -d bigfile.xz` 或 `unxz bigfile.xz` + +### 自己运行压缩对比 + +如果你想自己运行一些测试,抓取一个大的且可以替换的文件,并使用上面显示的每个命令来压缩它 —— 最好使用一个新的子目录。你可能需要先安装 `xz`,如果你想在测试中包含它的话。这个脚本可能更容易地进行压缩,但是可能需要花费几分钟完成。 + +``` +#!/bin/bash + +# 询问用户文件名称 +echo -n "filename> " +read filename + +# 你需要这个,因为一些命令将替换原始文件 +cp $filename $filename-2 + +# 先清理(以免先前的结果仍然可用) +rm $filename.* + +tar cvfz ./$filename.tgz $filename > /dev/null +zip $filename.zip $filename > /dev/null +bzip2 $filename +# 恢复原始文件 +cp $filename-2 $filename +gzip $filename +# 恢复原始文件 +cp $filename-2 $filename +xz $filename + +# 显示结果 +ls -l $filename.* + +# 替换原始文件 +mv $filename-2 $filename +``` + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3538471/how-to-compress-files-on-linux-5-ways.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy) +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/translated/tech/20200420 4 Git scripts I can-t live without.md b/published/202005/20200420 4 Git scripts I can-t live without.md similarity index 81% rename from translated/tech/20200420 4 Git scripts I can-t live without.md rename to published/202005/20200420 4 Git scripts I can-t live without.md index 089c81e20f..43102c69e6 100644 --- a/translated/tech/20200420 4 Git scripts I can-t live without.md +++ b/published/202005/20200420 4 Git scripts I can-t live without.md @@ -1,8 +1,8 @@ [#]: collector: (lujun9972) [#]: translator: (wxy) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12180-1.html) [#]: subject: (4 Git scripts I can't live without) [#]: via: (https://opensource.com/article/20/4/git-extras) [#]: author: (Vince Power https://opensource.com/users/vincepower) @@ -12,11 +12,11 @@ > Git Extras 版本库包含了 60 多个脚本,它们是 Git 基本功能的补充。以下是如何安装、使用和贡献的方法。 -![Person using a laptop][1] +![](https://img.linux.net.cn/data/attachment/album/202005/03/211446dshwbzoh235b3gre.jpg) -2005 年,[Linus Torvalds][2] 创建了 [Git][3],以取代他之前用于维护 Linux 内核的专有的分布式源码控制管理解决方案。从那时起,Git 已经成为开源和云原生开发团队的主流版本控制解决方案。 +2005 年,[Linus Torvalds][2] 创建了 [Git][3],以取代他之前用于维护 Linux 内核的分布式源码控制管理的专有解决方案。从那时起,Git 已经成为开源和云原生开发团队的主流版本控制解决方案。 -但即使是像 Git 这样功能丰富的应用程序,也没有人们想要或需要的每个功能,所以人们会花大力气去创建这些功能。就 Git 而言,这个人就是 [TJ Holowaychuk][4]。他的 [Git Extras][5] 项目承载了 60 多个“附加功能”,这些功能扩展了 Git 的基本功能。 +但即使是像 Git 这样功能丰富的应用程序,也没有人们想要或需要的每个功能,所以会有人花大力气去创建这些缺少的功能。就 Git 而言,这个人就是 [TJ Holowaychuk][4]。他的 [Git Extras][5] 项目承载了 60 多个“附加功能”,这些功能扩展了 Git 的基本功能。 ### 使用 Git 附加功能 @@ -24,9 +24,9 @@ #### git-ignore -`git ignore` 是一个方便的附加功能,它可以让你手动添加文件类型和注释到 `.git-ignore` 文件中,而不需要打开文本编辑器。它可以操作你的个人用户帐户的全局忽略文件和单独用于你正在工作的版本库的忽略文件。 +`git ignore` 是一个方便的附加功能,它可以让你手动添加文件类型和注释到 `.git-ignore` 文件中,而不需要打开文本编辑器。它可以操作你的个人用户帐户的全局忽略文件和单独用于你正在工作的版本库中的忽略文件。 -在没有参数的情况下执行 `git ignore` 会先列出全局忽略文件,然后是本地的忽略文件。 +在不提供参数的情况下执行 `git ignore` 会先列出全局忽略文件,然后是本地的忽略文件。 ``` $ git ignore @@ -105,7 +105,7 @@ branch.master.merge=refs/heads/master * `git mr` 检出来自 GitLab 的合并请求。 * `git pr` 检出来自 GitHub 的拉取请求。 -无论是哪种情况,你只需要合并请求号、拉取请求号或完整的 URL,它就会抓取远程引用,检出分支,并调整配置,这样 Git 就知道要替换哪个分支了。 +无论是哪种情况,你只需要合并请求号/拉取请求号或完整的 URL,它就会抓取远程引用,检出分支,并调整配置,这样 Git 就知道要替换哪个分支了。 ``` $ git mr 51 @@ -142,7 +142,7 @@ $ git extras --help $ brew install git-extras ``` -在 Linux 上,每个平台的原生包管理器中都有 Git Extras。有时,你需要启用一个额外的仓库,比如在 CentOS 上的 [EPEL][10],然后运行一条命令。 +在 Linux 上,每个平台原生的包管理器中都包含有 Git Extras。有时,你需要启用额外的仓库,比如在 CentOS 上的 [EPEL][10],然后运行一条命令。 ``` $ sudo yum install git-extras @@ -152,9 +152,9 @@ $ sudo yum install git-extras ### 贡献 -你是否你认为 Git 中有缺少的功能,并且已经构建了一个脚本来处理它?为什么不把它作为 Git Extras 发布版的一部分,与全世界分享呢? +你是否认为 Git 中有缺少的功能,并且已经构建了一个脚本来处理它?为什么不把它作为 Git Extras 发布版的一部分,与全世界分享呢? -要做到这一点,请将该功能贡献到 Git Extras 仓库中。更多具体细节请参见仓库中的 [CONTRIBUTING.md][12] 文件,但基本的操作方法很简单。 +要做到这一点,请将该功能贡献到 Git Extras 仓库中。更多具体细节请参见仓库中的 [CONTRIBUTING.md][12] 文件,但基本的操作方法很简单: 1. 创建一个处理该功能的 Bash 脚本。 2. 创建一个基本的 man 文件,让大家知道如何使用它。 @@ -171,7 +171,7 @@ via: https://opensource.com/article/20/4/git-extras 作者:[Vince Power][a] 选题:[lujun9972][b] 译者:[wxy](https://github.com/wxy) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/published/202005/20200421 Using Python to visualize COVID-19 projections.md b/published/202005/20200421 Using Python to visualize COVID-19 projections.md new file mode 100644 index 0000000000..aaf5fc72d0 --- /dev/null +++ b/published/202005/20200421 Using Python to visualize COVID-19 projections.md @@ -0,0 +1,238 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12172-1.html) +[#]: subject: (Using Python to visualize COVID-19 projections) +[#]: via: (https://opensource.com/article/20/4/python-data-covid-19) +[#]: author: (AnuragGupta https://opensource.com/users/999anuraggupta) + +使用 Python 来可视化 COVID-19 预测 +====== + +> 我将演示如何利用提供的全球病毒传播的开放数据,使用开源库来创建两个可视效果。 + +![](https://img.linux.net.cn/data/attachment/album/202005/01/193624a2p2osojyf0yg4go.jpg) + +使用 [Python][2] 和一些图形库,你可以预测 COVID-19 确诊病例总数,也可以显示一个国家(本文以印度为例)在给定日期的死亡总数。人们有时需要帮助解释和处理数据的意义,所以本文还演示了如何为五个国家创建一个动画横条形图,以显示按日期显示病例的变化。 + +### 印度的确诊病例和死亡人数预测 + +这要分三步来完成。 + +#### 1、下载数据 + +科学数据并不总是开放的,但幸运的是,许多现代科学和医疗机构都乐于相互之间及与公众共享信息。关于 COVID-19 病例的数据可以在网上查到,并且经常更新。 + +要解析这些数据,首先必须先下载。 。 + +直接将数据加载到 Pandas `DataFrame` 中。Pandas 提供了一个函数 `read_csv()`,它可以获取一个 URL 并返回一个 `DataFrame` 对象,如下所示。 + +``` +import pycountry +import plotly.express as px +import pandas as pd +URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv' +df1 = pd.read_csv(URL_DATASET) +print(df1.head(3)) # 获取数据帧中的前 3 项 +print(df1.tail(3)) # 获取数据帧中的后 3 项 +``` + +数据集的顶行包含列名。 + +1. `Date` +2. `Country` +3. `Confirmed` +4. `Recovered` +5. `Deaths` + +`head` 查询的输出包括一个唯一的标识符(不作为列列出)和每个列的条目。 + +``` +0 2020-01-22 Afghanistan 0 0 0 +1 2020-01-22 Albania 0 0 0 +1 2020-01-22 Algeria 0 0 0 +``` + +`tail` 查询的输出类似,但包含数据集的尾端。 + +``` +12597 2020-03-31 West Bank and Gaza 119 18 1 +12598 2020-03-31 Zambia 35 0 0 +12599 2020-03-31 Zimbabwe 8 0 1 +``` + +从输出中,可以看到 DataFrame(`df1`)有以下几个列: + +1. 日期 +2. 国家 +3. 确诊 +4. 康复 +5. 死亡 + +此外,你可以看到 `Date` 栏中的条目从 1 月 22 日开始到 3 月 31 日。这个数据库每天都会更新,所以你会有当前的值。 + +#### 2、选择印度的数据 + +在这一步中,我们将只选择 DataFrame 中包含印度的那些行。这在下面的脚本中可以看到。 + +``` +#### ----- Step 2 (Select data for India)---- +df_india = df1[df1['Country'] == 'India'] +print(df_india.head(3)) +``` + +#### 3、数据绘图 + +在这里,我们创建一个条形图。我们将把日期放在 X 轴上,把确诊的病例数和死亡人数放在 Y 轴上。这一部分的脚本有以下几个值得注意的地方。 + + * `plt.rcParams["figure.figsize"]=20,20` 这一行代码只适用于 Jupyter。所以如果你使用其他 IDE,请删除它。 + * 注意这行代码:`ax1 = plt.gca()`。为了确保两个图,即确诊病例和死亡病例的图都被绘制在同一个图上,我们需要给第二个图的 `ax` 对象。所以我们使用 `gca()` 来完成这个任务。(顺便说一下,`gca` 代表 “获取当前坐标轴get current axis”) + +完整的脚本如下所示。 + +``` +# Author:- Anurag Gupta # email:- 999.anuraggupta@gmail.com +%matplotlib inline +import matplotlib.pyplot as plt +import pandas as pd + +#### ----- Step 1 (Download data)---- +URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv' +df1 = pd.read_csv(URL_DATASET) +# print(df1.head(3)) # Uncomment to see the dataframe + +#### ----- Step 2 (Select data for India)---- +df_india = df1[df1['Country'] == 'India'] +print(df_india.head(3)) + +#### ----- Step 3 (Plot data)---- +# Increase size of plot +plt.rcParams["figure.figsize"]=20,20 # Remove if not on Jupyter +# Plot column 'Confirmed' +df_india.plot(kind = 'bar', x = 'Date', y = 'Confirmed', color = 'blue') + +ax1 = plt.gca() +df_india.plot(kind = 'bar', x = 'Date', y = 'Deaths', color = 'red', ax = ax1) +plt.show() +``` + +整个脚本[可在 GitHub 上找到][4]。 + +### 为五个国家创建一个动画水平条形图 + +关于 Jupyter 的注意事项:要在 Jupyter 中以动态动画的形式运行,而不是静态 png 的形式,你需要在单元格的开头添加一个神奇的命令,即: `%matplotlib notebook`。这将使图形保持动态,而不是显示为静态的 png 文件,因此也可以显示动画。如果你在其他 IDE 上,请删除这一行。 + +#### 1、下载数据 + +这一步和前面的脚本完全一样,所以不需要重复。 + +#### 2、创建一个所有日期的列表 + +如果你检查你下载的数据,你会发现它有一列 `Date`。现在,这一列对每个国家都有一个日期值。因此,同一个日期会出现多次。我们需要创建一个只具有唯一值的日期列表。这会用在我们条形图的 X 轴上。我们有一行代码,如 `list_dates = df[‘Date’].unique()`。`unique()` 方法将只提取每个日期的唯一值。 + +#### 3、挑选五个国家并创建一个 `ax` 对象。 + +做一个五个国家的名单。(你可以选择你喜欢的国家,也可以增加或减少国家的数量。)我也做了一个五个颜色的列表,每个国家的条形图的颜色对应一种。(如果你喜欢的话,也可以改一下。)这里有一行重要的代码是:`fig, ax = plt.subplots(figsize=(15, 8))`。这是创建一个 `ax` 对象所需要的。 + +#### 4、编写回调函数 + +如果你想在 Matplotlib 中做动画,你需要创建一个名为 `matplotlib.animation.FuncAnimation` 的类的对象。这个类的签名可以在网上查到。这个类的构造函数,除了其他参数外,还需要一个叫 `func` 的参数,你必须给这个参数一个回调函数。所以在这一步中,我们会写个回调函数,这个回调函数会被反复调用,以渲染动画。 + +#### 5、创建 `FuncAnimation` 对象 + +这一步在上一步中已经部分说明了。 + +我们创建这个类的对象的代码是: + +``` +my_anim = animation.FuncAnimation(fig = fig, func = plot_bar, + frames = list_dates, blit = True, + interval=20) +``` + +要给出的三个重要参数是: + +* `fig`,必须给出一个 fig 对象,也就是我们之前创建的 fig 对象。 +* `func`,必须是回调函数。 +* `frames`,必须包含要做动画的变量。在我们这里,它是我们之前创建的日期列表。 + +#### 6、将动画保存为 mp4 文件 + +你可以将创建的动画保存为 mp4 文件。但是,你需要 `ffmpeg`。你可以用 `pip` 下载:`pip install ffmpeg-python`,或者用 conda(在 Jupyter 上):`install -c conda-forge ffmpeg`。 + +最后,你可以使用 `plt.show()` 运行动画。请注意,在许多平台上,`ffmpeg` 可能无法正常工作,可能需要进一步“调整”。 + +``` +%matplotlib notebook +# Author:- Anurag Gupta # email:- 999.anuraggupta@gmail.com +import pandas as pd +import matplotlib.pyplot as plt +import matplotlib.animation as animation +from time import sleep + +#### ---- Step 1:- Download data +URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv' +df = pd.read_csv(URL_DATASET, usecols = ['Date', 'Country', 'Confirmed']) +# print(df.head(3)) # uncomment this to see output + +#### ---- Step 2:- Create list of all dates +list_dates = df['Date'].unique() +# print(list_dates) # Uncomment to see the dates + +#### --- Step 3:- Pick 5 countries. Also create ax object +fig, ax = plt.subplots(figsize=(15, 8)) +# We will animate for these 5 countries only +list_countries = ['India', 'China', 'US', 'Italy', 'Spain'] +# colors for the 5 horizontal bars +list_colors = ['black', 'red', 'green', 'blue', 'yellow'] + +### --- Step 4:- Write the call back function +# plot_bar() is the call back function used in FuncAnimation class object +def plot_bar(some_date): + df2 = df[df['Date'].eq(some_date)] + ax.clear() + # Only take Confirmed column in descending order + df3 = df2.sort_values(by = 'Confirmed', ascending = False) + # Select the top 5 Confirmed countries + df4 = df3[df3['Country'].isin(list_countries)] + # print(df4) # Uncomment to see that dat is only for 5 countries + sleep(0.2) # To slow down the animation + # ax.barh() makes a horizontal bar plot. + return ax.barh(df4['Country'], df4['Confirmed'], color= list_colors) + +###----Step 5:- Create FuncAnimation object--------- +my_anim = animation.FuncAnimation(fig = fig, func = plot_bar, + frames= list_dates, blit=True, + interval=20) + +### --- Step 6:- Save the animation to an mp4 +# Place where to save the mp4. Give your file path instead +path_mp4 = r'C:\Python-articles\population_covid2.mp4' +# my_anim.save(path_mp4, fps=30, extra_args=['-vcodec', 'libx264']) +my_anim.save(filename = path_mp4, writer = 'ffmpeg', + fps=30, + extra_args= ['-vcodec', 'libx264', '-pix_fmt', 'yuv420p']) +plt.show() +``` + +完整的脚本[可以在 GitHub 上找到][5]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/python-data-covid-19 + +作者:[AnuragGupta][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/999anuraggupta +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/colorful_sound_wave.png?itok=jlUJG0bM (Colorful sound wave graph) +[2]: https://opensource.com/resources/python +[3]: mailto:999.anuraggupta@gmail.com +[4]: https://raw.githubusercontent.com/ag999git/jupyter_notebooks/master/corona_bar_india +[5]: https://raw.githubusercontent.com/ag999git/jupyter_notebooks/master/corona_bar_animated diff --git a/translated/tech/20200423 Difference Between YUM and RPM Package Manager.md b/published/202005/20200423 Difference Between YUM and RPM Package Manager.md similarity index 92% rename from translated/tech/20200423 Difference Between YUM and RPM Package Manager.md rename to published/202005/20200423 Difference Between YUM and RPM Package Manager.md index c0bf8b7352..bf916108e1 100644 --- a/translated/tech/20200423 Difference Between YUM and RPM Package Manager.md +++ b/published/202005/20200423 Difference Between YUM and RPM Package Manager.md @@ -1,8 +1,8 @@ [#]: collector: (lujun9972) [#]: translator: (wxy) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12170-1.html) [#]: subject: (Difference Between YUM and RPM Package Manager) [#]: via: (https://www.2daygeek.com/comparison-difference-between-yum-vs-rpm/) [#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) @@ -10,6 +10,8 @@ YUM 和 RPM 包管理器的不同之处 ====== +![](https://img.linux.net.cn/data/attachment/album/202004/30/215525o4e88nen85d8dzd7.jpg) + 软件包管理器在 Linux 系统中扮演着重要的角色。它允许你安装、更新、查看、搜索和删除软件包,以满足你的需求。 每个发行版都有自己的一套包管理器,依据你的 Linux 发行版来分别使用它们。 @@ -18,7 +20,7 @@ RPM 是最古老的传统软件包管理器之一,它是为基于 Red Hat 的 > 如果你想知道 [YUM 和 DNF 包管理器的区别][1]请参考该文章。 -这意味着 yum 可以自动下载并安装所有需要的依赖项,但 rpm 会告诉你安装一个依赖项列表,然后你必须手动安装。 +这意味着 `yum` 可以自动下载并安装所有需要的依赖项,但 `rpm` 会告诉你安装一个依赖项列表,然后你必须手动安装。 当你想用 [rpm 命令][2] 安装一组包时,这实际上是不可能的,而且很费时间。 @@ -76,13 +78,13 @@ via: https://www.2daygeek.com/comparison-difference-between-yum-vs-rpm/ 作者:[Magesh Maruthamuthu][a] 选题:[lujun9972][b] 译者:[wxy](https://github.com/wxy) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]: https://www.2daygeek.com/author/magesh/ [b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/comparison-difference-between-dnf-vs-yum/ +[1]: https://linux.cn/article-12161-1.html [2]: https://www.2daygeek.com/linux-rpm-command-examples-manage-packages-fedora-centos-rhel-systems/ [3]: https://www.2daygeek.com/linux-yum-command-examples-manage-packages-rhel-centos-systems/ [4]: https://www.2daygeek.com/list-of-command-line-package-manager-for-linux/ diff --git a/published/202005/20200424 16 Things to do After Installing Ubuntu 20.04.md b/published/202005/20200424 16 Things to do After Installing Ubuntu 20.04.md new file mode 100644 index 0000000000..ded221ab6c --- /dev/null +++ b/published/202005/20200424 16 Things to do After Installing Ubuntu 20.04.md @@ -0,0 +1,283 @@ +[#]: collector: (lujun9972) +[#]: translator: (qfzy1233) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12183-1.html) +[#]: subject: (16 Things to do After Installing Ubuntu 20.04) +[#]: via: (https://itsfoss.com/things-to-do-after-installing-ubuntu-20-04/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +安装完 Ubuntu 20.04 后要做的 16 件事 +====== + +> 以下是安装 Ubuntu 20.04 之后需要做的一些调整和事项,它将使你获得更流畅、更好的桌面 Linux 体验。 + +[Ubuntu 20.04 LTS(长期支持版)带来了许多新的特性][1]和观感上的变化。如果你要安装 Ubuntu 20.04,让我向你展示一些推荐步骤便于你的使用。 + +### 安装完 Ubuntu 20.04 LTS “Focal Fossa” 后要做的 16 件事 + +![][2] + +我在这里提到的步骤仅是我的建议。如果一些定制或调整不适合你的需要和兴趣,你可以忽略它们。 + +同样的,有些步骤看起来很简单,但是对于一个 Ubuntu 新手来说是必要的。 + +这里的一些建议适用于启用 GNOME 作为默认桌面 Ubuntu 20.04,所以请检查 [Ubuntu 版本][3]和[桌面环境][4]。 + +以下列表便是安装了代号为 Focal Fossa 的 Ubuntu 20.04 LTS 之后要做的事。 + +#### 1、通过更新和启用额外的软件仓库来准备你的系统 + +安装 Ubuntu 或任何其他 Linux 发行版之后,你应该做的第一件事就是更新它。Linux 的运作是建立在本地的可用软件包数据库上,而这个缓存需要同步以便你能够安装软件。 + +升级 Ubuntu 非常简单。你可以运行软件更新从菜单(按 `Super` 键并搜索 “software updater”): + +![Ubuntu 20.04 的软件升级器][5] + +你也可以在终端使用以下命令更新你的系统: + +``` +sudo apt update && sudo apt upgrade +``` + +接下来,你应该确保启用了 [universe(宇宙)和 multiverse(多元宇宙)软件仓库][6]。使用这些软件仓库,你可以访问更多的软件。我还推荐阅读关于 [Ubuntu 软件仓库][6]的文章,以了解它背后的基本概念。 + +在菜单中搜索 “Software & Updates”: + +![软件及更新设置项][7] + +请务必选中软件仓库前面的勾选框: + +![启用额外的软件仓库][8] + +#### 2、安装媒体解码器来播放 MP3、MPEG4 和其他格式媒体文件 + +如果你想播放媒体文件,如 MP3、MPEG4、AVI 等,你需要安装媒体解码器。由于各个国家的版权问题, Ubuntu 在默认情况下不会安装它。 + +作为个人,你可以[使用 Ubuntu Restricted Extra 安装包][9]很轻松地安装这些媒体编解码器。这将[在你的 Ubuntu 系统安装][10]媒体编解码器、Adobe Flash 播放器和微软 True Type 字体等。 + +你可以通过[点击这个链接][11]来安装它(它会要求在软件中心打开它),或者使用以下命令: + +``` +sudo apt install ubuntu-restricted-extras +``` + +如果遇到 EULA 或许可证界面,请记住使用 `tab` 键在选项之间进行选择,然后按回车键确认你的选择。 + +![按 tab 键选择 OK 并按回车键][12] + +#### 3、从软件中心或网络上安装软件 + +现在已经设置好了软件仓库并更新了软件包缓存,应该开始安装所需的软件了。 + +在 Ubuntu 中安装应用程序有几种方法,最简单和正式的方法是使用软件中心。 + +![Ubuntu 软件中心][14] + +如果你想要一些关于软件的建议,请参考这个[丰富的各种用途的 Ubuntu 应用程序列表][15]。 + +一些软件供应商提供了 .deb 文件来方便地安装他们的应用程序。你可以从他们的网站获得 .deb 文件。例如,要[在 Ubuntu 上安装谷歌 Chrome][16],你可以从它的网站上获得 .deb 文件,双击它开始安装。 + +#### 4、享受 Steam Proton 和 GameModeEnjoy 上的游戏 + +[在 Linux 上进行游戏][17]已经有了长足的发展。你不再受限于自带的少数游戏。你可以[在 Ubuntu 上安装 Steam][18]并享受许多游戏。 + +[Steam 新的 Proton 项目][19]可以让你在 Linux 上玩许多只适用于 Windows 的游戏。除此之外,Ubuntu 20.04 还默认安装了 [Feral Interactive 的 GameMode][20]。 + +GameMode 会自动调整 Linux 系统的性能,使游戏具有比其他后台进程更高的优先级。 + +这意味着一些支持 GameMode 的游戏(如[古墓丽影·崛起][21])在 Ubuntu 上的性能应该有所提高。 + +#### 5、管理自动更新(适用于进阶用户和专家) + +最近,Ubuntu 已经开始自动下载并安装对你的系统至关重要的安全更新。这是一个安全功能,作为一个普通用户,你应该让它保持默认开启。 + +但是,如果你喜欢自己进行配置更新,而这个自动更新经常导致你[“无法锁定管理目录”错误][22],也许你可以改变自动更新行为。 + +你可以选择“立即显示”,这样一有安全更新就会立即通知你,而不是自动安装。 + +![管理自动更新设置][23] + +#### 6、控制电脑的自动挂起和屏幕锁定 + +如果你在笔记本电脑上使用 Ubuntu 20.04,那么你可能需要注意一些电源和屏幕锁定设置。 + +如果你的笔记本电脑处于电池模式,Ubuntu 会在 20 分钟不活动后休眠系统。这样做是为了节省电池电量。就我个人而言,我不喜欢它,因此我禁用了它。 + +类似地,如果你离开系统几分钟,它会自动锁定屏幕。我也不喜欢这种行为,所以我宁愿禁用它。 + +![Ubuntu 20.04 的电源设置][24] + +#### 7、享受夜间模式 + +[Ubuntu 20.04 中最受关注的特性][25]之一是夜间模式。你可以通过进入设置并在外观部分中选择它来启用夜间模式。 + +![开启夜间主题 Ubuntu][26] + +你可能需要做一些[额外的调整来获得完整的 Ubuntu 20.04 夜间模式][27]。 + +#### 8、控制桌面图标和启动程序 + +如果你想要一个最简的桌面,你可以禁用桌面上的图标。你还可以从左侧禁用启动程序,并在顶部面板中禁用软件状态栏。 + +所有这些都可以通过默认的新 GNOME 扩展来控制,该程序默认情况下已经可用。 + +![禁用 Ubuntu 20 04 的 Dock][28] + +顺便说一下,你也可以通过“设置”->“外观”来将启动栏的位置改变到底部或者右边。 + +#### 9、使用表情符和特殊字符,或从搜索中禁用它 + +Ubuntu 提供了一个使用表情符号的简单方法。在默认情况下,有一个专用的应用程序叫做“字符”。它基本上可以为你提供表情符号的 [Unicode][29]。 + +不仅是表情符号,你还可以使用它来获得法语、德语、俄语和拉丁语字符的 unicode。单击符号你可以复制 unicode,当你粘贴该代码时,你所选择的符号便被插入。 + +![Ubuntu 表情符][30] + +你也能在桌面搜索中找到这些特殊的字符和表情符号。也可以从搜索结果中复制它们。 + +![表情符出现在桌面搜索中][31] + +如果你不想在搜索结果中看到它们,你应该禁用搜索功能对它们的访问。下一节将讨论如何做到这一点。 + +#### 10、掌握桌面搜索 + +GNOME 桌面拥有强大的搜索功能,大多数人使用它来搜索已安装的应用程序,但它不仅限于此。 + +按 `Super` 键并搜索一些东西,它将显示与搜索词匹配的任何应用程序,然后是系统设置和软件中心提供的匹配应用程序。 + +![桌面搜索][32] + +不仅如此,搜索还可以找到文件中的文本。如果你正在使用日历,它也可以找到你的会议和提醒。你甚至可以在搜索中进行快速计算并复制其结果。 + +![Ubuntu搜索的快速计算][33] + +你可以进入“设置”中来控制可以搜索的内容和顺序。 + +![][34] + +#### 11、使用夜灯功能,减少夜间眼睛疲劳 + +如果你在晚上使用电脑或智能手机,你应该使用夜灯功能来减少眼睛疲劳。我觉得这很有帮助。 + +夜灯的特点是在屏幕上增加了一种黄色的色调,比白光少了一些挤压感。 + +你可以在“设置”->“显示”切换到夜灯选项卡来开启夜光功能。你可以根据自己的喜好设置“黄度”。 + +![夜灯功能][35] + +#### 12、使用 2K/4K 显示器?使用分辨率缩放得到更大的图标和字体 + +如果你觉得图标、字体、文件夹在你的高分辨率屏幕上看起来都太小了,你可以利用分辨率缩放。 + +启用分辨率缩放可以让你有更多的选项来从 100% 增加到 200%。你可以选择适合自己喜好的缩放尺寸。 + +![在设置->显示中启用高分缩放][36] + +#### 13、探索 GNOME 扩展功能以扩展 GNOME 桌面可用性 + +GNOME 桌面有称为“扩展”的小插件或附加组件。你应该[学会使用 GNOME 扩展][37]来扩展系统的可用性。 + +如下图所示,天气扩展顶部面板中显示了天气信息。不起眼但十分有用。你也可以在这里查看一些[最佳 GNOME 扩展][38]。不需要全部安装,只使用那些对你有用的。 + +![天气扩展][39] + +#### 14、启用“勿扰”模式,专注于工作 + +如果你想专注于工作,禁用桌面通知会很方便。你可以轻松地启用“勿扰”模式,并静音所有通知。 + +![启用“请勿打扰”清除桌面通知][40] + +这些通知仍然会在消息栏中,以便你以后可以阅读它们,但是它们不会在桌面上弹出。 + +#### 15、清理你的系统 + +这是你安装 Ubuntu 后不需要马上做的事情。但是记住它会对你有帮助。 + +随着时间的推移,你的系统将有大量不再需要的包。你可以用这个命令一次性删除它们: + +``` +sudo apt autoremove +``` + +还有其他[清理 Ubuntu 以释放磁盘空间的方法][41],但这是最简单和最安全的。 + +#### 16、根据你的喜好调整和定制 GNOME 桌面 + +我强烈推荐[安装 GNOME 设置工具][42]。这将让你可以通过额外的设置来进行定制。 + +![Gnome 设置工具][43] + +比如,你可以[以百分比形式显示电池容量][44]、[修正在触摸板右键问题][45]、改变 Shell 主题、改变鼠标指针速度、显示日期和星期数、改变应用程序窗口行为等。 + +定制是没有尽头的,我可能仅使用了它的一小部分功能。这就是为什么我推荐[阅读这些][42]关于[自定义 GNOME 桌面][46]的文章。 + +你也可以[在 Ubuntu 中安装新主题][47],不过就我个人而言,我喜欢这个版本的默认主题。这是我第一次在 Ubuntu 发行版中使用默认的图标和主题。 + +#### 安装 Ubuntu 之后你会做什么? + +如果你是 Ubuntu 的初学者,我建议你[阅读这一系列 Ubuntu 教程][48]开始学习。 + +这就是我的建议。安装 Ubuntu 之后你要做什么?分享你最喜欢的东西,我可能根据你的建议来更新这篇文章。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/things-to-do-after-installing-ubuntu-20-04/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[qfzy1233](https://github.com/qfzy1233) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-12146-1.html +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/things-to-do-after-installing-ubuntu-20-04.jpg?ssl=1 +[3]: https://linux.cn/article-9872-1.html +[4]: https://linux.cn/article-12124-1.html +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-updater-ubuntu-20-04.jpg?ssl=1 +[6]: https://itsfoss.com/ubuntu-repositories/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-updates-settings-ubuntu-20-04.jpg?ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/extra-repositories-ubuntu-20.jpg?ssl=1 +[9]: https://linux.cn/article-11906-1.html +[10]: https://linux.cn/article-12074-1.html +[11]: //ubuntu-restricted-extras/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/installing_ubuntu_restricted_extras.jpg?ssl=1 +[13]: https://itsfoss.com/remove-install-software-ubuntu/ +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-center-ubuntu-20.png?resize=800%2C509&ssl=1 +[15]: https://itsfoss.com/best-ubuntu-apps/ +[16]: https://itsfoss.com/install-chrome-ubuntu/ +[17]: https://linux.cn/article-7316-1.html +[18]: https://itsfoss.com/install-steam-ubuntu-linux/ +[19]: https://linux.cn/article-10054-1.html +[20]: https://github.com/FeralInteractive/gamemode +[21]: https://en.wikipedia.org/wiki/Rise_of_the_Tomb_Raider +[22]: https://itsfoss.com/could-not-get-lock-error/ +[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/auto-updates-ubuntu.png?resize=800%2C361&ssl=1 +[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/power-settings-ubuntu-20-04.png?fit=800%2C591&ssl=1 +[25]: https://www.youtube.com/watch?v=lpq8pm_xkSE +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/enable-dark-theme-ubuntu.png?ssl=1 +[27]: https://linux.cn/article-12098-1.html +[28]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/disable-dock-ubuntu-20-04.png?ssl=1 +[29]: https://en.wikipedia.org/wiki/List_of_Unicode_characters +[30]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/emoji-ubuntu.jpg?ssl=1 +[31]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/emojis-desktop-search-ubuntu.jpg?ssl=1 +[32]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-desktop-search-1.jpg?ssl=1 +[33]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/quick-calculations-ubuntu-search.jpg?ssl=1 +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/search-settings-control-ubuntu.png?resize=800%2C534&ssl=1 +[35]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/nightlight-ubuntu-20-04.png?ssl=1 +[36]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/fractional-scaling-ubuntu.jpg?ssl=1 +[37]: https://itsfoss.com/gnome-shell-extensions/ +[38]: https://itsfoss.com/best-gnome-extensions/ +[39]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/weather-extension-ubuntu.jpg?ssl=1 +[40]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/do-not-distrub-option-ubuntu-20-04.png?ssl=1 +[41]: https://itsfoss.com/free-up-space-ubuntu-linux/ +[42]: https://itsfoss.com/gnome-tweak-tool/ +[43]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/gnome-tweaks-tool-ubuntu-20-04.png?fit=800%2C551&ssl=1 +[44]: https://itsfoss.com/display-battery-ubuntu/ +[45]: https://itsfoss.com/fix-right-click-touchpad-ubuntu/ +[46]: https://itsfoss.com/gnome-tricks-ubuntu/ +[47]: https://itsfoss.com/install-themes-ubuntu/ +[48]: https://itsfoss.com/getting-started-with-ubuntu/ diff --git a/published/202005/20200425 Inlining optimisations in Go.md b/published/202005/20200425 Inlining optimisations in Go.md new file mode 100644 index 0000000000..12f1cb67b7 --- /dev/null +++ b/published/202005/20200425 Inlining optimisations in Go.md @@ -0,0 +1,213 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12176-1.html) +[#]: subject: (Inlining optimisations in Go) +[#]: via: (https://dave.cheney.net/2020/04/25/inlining-optimisations-in-go) +[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) + +Go 中的内联优化 +====== + +> 本文讨论 Go 编译器是如何实现内联的,以及这种优化方法如何影响你的 Go 代码。 + +![](https://img.linux.net.cn/data/attachment/album/202005/02/222202e3v3pppkhnndpbpn.jpg) + +*请注意:*本文重点讨论 *gc*,这是来自 [golang.org](https://github.com/golang/go) 的事实标准的 Go 编译器。讨论到的概念可以广泛适用于其它 Go 编译器,如 gccgo 和 llgo,但它们在实现方式和功效上可能有所差异。 + +### 内联是什么? + +内联inlining就是把简短的函数在调用它的地方展开。在计算机发展历程的早期,这个优化是由程序员手动实现的。现在,内联已经成为编译过程中自动实现的基本优化过程的其中一步。 + +### 为什么内联很重要? + +有两个原因。第一个是它消除了函数调用本身的开销。第二个是它使得编译器能更高效地执行其他的优化策略。 + +#### 函数调用的开销 + +在任何语言中,调用一个函数 [^1] 都会有消耗。把参数编组进寄存器或放入栈中(取决于 ABI),在返回结果时的逆反过程都会有开销。引入一次函数调用会导致程序计数器从指令流的一点跳到另一点,这可能导致管道滞后。函数内部通常有前置处理preamble,需要为函数执行准备新的栈帧,还有与前置相似的后续处理epilogue,需要在返回给调用方之前释放栈帧空间。 + +在 Go 中函数调用会消耗额外的资源来支持栈的动态增长。在进入函数时,goroutine 可用的栈空间与函数需要的空间大小进行比较。如果可用空间不同,前置处理就会跳到运行时runtime的逻辑中,通过把数据复制到一块新的、更大的空间的来增长栈空间。当这个复制完成后,运行时就会跳回到原来的函数入口,再执行栈空间检查,现在通过了检查,函数调用继续执行。这种方式下,goroutine 开始时可以申请很小的栈空间,在有需要时再申请更大的空间。[^2] + +这个检查消耗很小,只有几个指令,而且由于 goroutine 的栈是成几何级数增长的,因此这个检查很少失败。这样,现代处理器的分支预测单元可以通过假定检查肯定会成功来隐藏栈空间检查的消耗。当处理器预测错了栈空间检查,不得不放弃它在推测性执行所做的操作时,与为了增加 goroutine 的栈空间运行时所需的操作消耗的资源相比,管道滞后的代价更小。 + +虽然现代处理器可以用预测性执行技术优化每次函数调用中的泛型和 Go 特定的元素的开销,但那些开销不能被完全消除,因此在每次函数调用执行必要的工作过程中都会有性能消耗。一次函数调用本身的开销是固定的,与更大的函数相比,调用小函数的代价更大,因为在每次调用过程中它们做的有用的工作更少。 + +因此,消除这些开销的方法必须是要消除函数调用本身,Go 的编译器就是这么做的,在某些条件下通过用函数的内容来替换函数调用来实现。这个过程被称为*内联*,因为它在函数调用处把函数体展开了。 + +#### 改进的优化机会 + +Cliff Click 博士把内联描述为现代编译器做的优化措施,像常量传播(LCTT 译注:此处作者笔误,原文为 constant proportion,修正为 constant propagation)和死代码消除一样,都是编译器的基本优化方法。实际上,内联可以让编译器看得更深,使编译器可以观察调用的特定函数的上下文内容,可以看到能继续简化或彻底消除的逻辑。由于可以递归地执行内联,因此不仅可以在每个独立的函数上下文处进行这种优化决策,也可以在整个函数调用链中进行。 + +### 实践中的内联 + +下面这个例子可以演示内联的影响: + +```go +package main + +import "testing" + +//go:noinline +func max(a, b int) int { + if a > b { + return a + } + return b +} + +var Result int + +func BenchmarkMax(b *testing.B) { + var r int + for i := 0; i < b.N; i++ { + r = max(-1, i) + } + Result = r +} +``` + +运行这个基准,会得到如下结果:[^3] + +```bash +% go test -bench=. +BenchmarkMax-4 530687617 2.24 ns/op +``` + +在我的 2015 MacBook Air 上 `max(-1, i)` 的耗时约为 2.24 纳秒。现在去掉 `//go:noinline` 编译指令,再看下结果: + +```bash +% go test -bench=. +BenchmarkMax-4 1000000000 0.514 ns/op +``` + +从 2.24 纳秒降到了 0.51 纳秒,或者从 `benchstat` 的结果可以看出,有 78% 的提升。 + +```bash +% benchstat {old,new}.txt +name old time/op new time/op delta +Max-4 2.21ns ± 1% 0.49ns ± 6% -77.96% (p=0.000 n=18+19) +``` + +这个提升是从哪儿来的呢? + +首先,移除掉函数调用以及与之关联的前置处理 [^4] 是主要因素。把 `max` 函数的函数体在调用处展开,减少了处理器执行的指令数量并且消除了一些分支。 + +现在由于编译器优化了 `BenchmarkMax`,因此它可以看到 `max` 函数的内容,进而可以做更多的提升。当 `max` 被内联后,`BenchmarkMax` 呈现给编译器的样子,看起来是这样的: + +```go +func BenchmarkMax(b *testing.B) { + var r int + for i := 0; i < b.N; i++ { + if -1 > i { + r = -1 + } else { + r = i + } + } + Result = r +} +``` + +再运行一次基准,我们看一下手动内联的版本和编译器内联的版本的表现: + +```bash +% benchstat {old,new}.txt +name old time/op new time/op delta +Max-4 2.21ns ± 1% 0.48ns ± 3% -78.14% (p=0.000 n=18+18) +``` + +现在编译器能看到在 `BenchmarkMax` 里内联 `max` 的结果,可以执行以前不能执行的优化措施。例如,编译器注意到 `i` 初始值为 `0`,仅做自增操作,因此所有与 `i` 的比较都可以假定 `i` 不是负值。这样条件表达式 `-1 > i` 永远不是 `true`。[^5] + +证明了 `-1 > i` 永远不为 true 后,编译器可以把代码简化为: + +```go +func BenchmarkMax(b *testing.B) { + var r int + for i := 0; i < b.N; i++ { + if false { + r = -1 + } else { + r = i + } + } + Result = r +} +``` + +并且因为分支里是个常量,编译器可以通过下面的方式移除不会走到的分支: + +```go +func BenchmarkMax(b *testing.B) { + var r int + for i := 0; i < b.N; i++ { + r = i + } + Result = r +} +``` + +这样,通过内联和由内联解锁的优化过程,编译器把表达式 `r = max(-1, i))` 简化为 `r = i`。 + +### 内联的限制 + +本文中我论述的内联称作叶子内联leaf inlining:把函数调用栈中最底层的函数在调用它的函数处展开的行为。内联是个递归的过程,当把函数内联到调用它的函数 A 处后,编译器会把内联后的结果代码再内联到 A 的调用方,这样持续内联下去。例如,下面的代码: + +```go +func BenchmarkMaxMaxMax(b *testing.B) { + var r int + for i := 0; i < b.N; i++ { + r = max(max(-1, i), max(0, i)) + } + Result = r +} +``` + +与之前的例子中的代码运行速度一样快,因为编译器可以对上面的代码重复地进行内联,也把代码简化到 `r = i` 表达式。 + +下一篇文章中,我会论述当 Go 编译器想要内联函数调用栈中间的某个函数时选用的另一种内联策略。最后我会论述编译器为了内联代码准备好要达到的极限,这个极限 Go 现在的能力还达不到。 + +[^1]: 在 Go 中,一个方法就是一个有预先定义的形参和接受者的函数。假设这个方法不是通过接口调用的,调用一个无消耗的函数所消耗的代价与引入一个方法是相同的。 +[^2]: 在 Go 1.14 以前,栈检查的前置处理也被垃圾回收器用于 STW,通过把所有活跃的 goroutine 栈空间设为 0,来强制它们切换为下一次函数调用时的运行时状态。这个机制[最近被替换][8]为一种新机制,新机制下运行时可以不用等 goroutine 进行函数调用就可以暂停 goroutine。 +[^3]: 我用 `//go:noinline` 编译指令来阻止编译器内联 `max`。这是因为我想把内联 `max` 的影响与其他影响隔离开,而不是用 `-gcflags='-l -N'` 选项在全局范围内禁止优化。关于 `//go:` 注释在[这篇文章][10]中详细论述。 +[^4]: 你可以自己通过比较 `go test -bench=. -gcflags=-S` 有无 `//go:noinline` 注释时的不同结果来验证一下。 +[^5]: 你可以用 `-gcflags=-d=ssa/prove/debug=on` 选项来自己验证一下。 + +#### 相关文章: + +1. [使 Go 变快的 5 件事](https://dave.cheney.net/2014/06/07/five-things-that-make-go-fast) +2. [为什么 Goroutine 的栈空间会无限增长?](https://dave.cheney.net/2013/06/02/why-is-a-goroutines-stack-infinite) +3. [Go 中怎么写基准测试](https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go) +4. [Go 中隐藏的编译指令](https://dave.cheney.net/2018/01/08/gos-hidden-pragmas) + +-------------------------------------------------------------------------------- + +via: https://dave.cheney.net/2020/04/25/inlining-optimisations-in-go + +作者:[Dave Cheney][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://dave.cheney.net/author/davecheney +[b]: https://github.com/lujun9972 +[1]: https://github.com/golang/go +[2]: tmp.gBQ2tEtMHc#easy-footnote-bottom-1-4053 (In Go, a method is just a function with a predefined formal parameter, the receiver. The relative costs of calling a free function vs a invoking a method, assuming that method is not called through an interface, are the same.) +[3]: tmp.gBQ2tEtMHc#easy-footnote-bottom-2-4053 (Up until Go 1.14 the stack check preamble was also used by the garbage collector to stop the world by setting all active goroutine’s stacks to zero, forcing them to trap into the runtime the next time they made a function call. This system was recently replaced with a mechanism which allowed the runtime to pause an goroutine without waiting for it to make a function call.) +[4]: tmp.gBQ2tEtMHc#easy-footnote-bottom-3-4053 (I’m using the //go:noinline pragma to prevent the compiler from inlining max. This is because I want to isolate the effects of inlining on max rather than disabling optimisations globally with -gcflags='-l -N'. I go into detail about the //go: comments in this presentation.) +[5]: tmp.gBQ2tEtMHc#easy-footnote-bottom-4-4053 (You can check this for yourself by comparing the output of go test -bench=. -gcflags=-S with and without the //go:noinline annotation.) +[6]: tmp.gBQ2tEtMHc#easy-footnote-bottom-5-4053 (You can check this yourself with the -gcflags=-d=ssa/prove/debug=on flag.) +[7]: tmp.gBQ2tEtMHc#easy-footnote-1-4053 +[8]: https://github.com/golang/proposal/blob/master/design/24543-non-cooperative-preemption.md +[9]: tmp.gBQ2tEtMHc#easy-footnote-2-4053 +[10]: https://dave.cheney.net/2018/01/08/gos-hidden-pragmas +[11]: tmp.gBQ2tEtMHc#easy-footnote-3-4053 +[12]: tmp.gBQ2tEtMHc#easy-footnote-4-4053 +[13]: tmp.gBQ2tEtMHc#easy-footnote-5-4053 +[14]: https://dave.cheney.net/2014/06/07/five-things-that-make-go-fast (Five things that make Go fast) +[15]: https://dave.cheney.net/2013/06/02/why-is-a-goroutines-stack-infinite (Why is a Goroutine’s stack infinite ?) +[16]: https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go (How to write benchmarks in Go) +[17]: https://dave.cheney.net/2018/01/08/gos-hidden-pragmas (Go’s hidden #pragmas) diff --git a/published/202005/20200427 How to secure your Linux email services with SSL-TLS.md b/published/202005/20200427 How to secure your Linux email services with SSL-TLS.md new file mode 100644 index 0000000000..48c2138c7a --- /dev/null +++ b/published/202005/20200427 How to secure your Linux email services with SSL-TLS.md @@ -0,0 +1,196 @@ +[#]: collector: (lujun9972) +[#]: translator: (Acceleratorrrr) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12217-1.html) +[#]: subject: (How to secure your Linux email services with SSL/TLS) +[#]: via: (https://opensource.com/article/20/4/securing-linux-email) +[#]: author: (Marc Skinner https://opensource.com/users/marc-skinner) + +如何利用 SSL/TLS 保护你的 Linux 邮件服务 +====== + +> 通过理解安全证书来保护你的 Linux 邮件服务。 + +![](https://img.linux.net.cn/data/attachment/album/202005/13/215637khaogmririavnrlk.jpg) + +通常,不管你是通过简单邮件传输协议Simple Mail Transport Protocol(SMTP)或者互联网消息访问协议Internet Message Access Protocol(IMAP)或邮局协议Post Office Protocol(POP)发送或者接受邮件,邮件服务默认都是以无保护的明文来传输数据。近来随着数据加密成为越来越多程序的共识,你需要安全套接层Secure Sockets Layer/传输层安全性Transport Layer Security(SSL/TLS)的安全证书来保护你的邮件服务。 + +首先,快速回顾一下邮件服务和协议的基本流程。邮件通过 SMTP 从 TCP 端口 25 发出。这个协议依靠 DNS 邮件交换服务器Mail eXchanger(MX)记录的地址信息来传输邮件。当邮件到达邮件服务器后,可以被以下两种服务中的任意一种检索:使用 TCP 端口 143 的 IMAP,或者使用 TCP 端口 110 的 POP3(邮局协议第 3 版)。然而,以上服务都默认使用明文传输邮件和认证信息。这非常的不安全! + +为了保护电子邮件数据和认证,这些服务都增加了一个安全功能,使它们可以利用 SSL/TLS 证书对数据流和通讯进行加密封装。SSL/TLS 是如何加密数据的细节不在本文讨论范围,有兴趣的话可以阅读 [Bryant Son 关于互联网安全的文章][2]了解更多细节。概括的说,SSL/TLS 加密是一种基于公钥和私钥的算法。 + +通过加入这些安全功能后,这些服务将监听在新的 TCP 端口: + +服务 | 默认 TCP 端口 | SSL/TLS 端口 +---|---|--- +SMTP | 25 | 587 +IMAP | 143 | 993 +POP3 | 110 | 995 + +### 生成 SSL/TLS 证书 + +[OpenSSL][3] 可以生成免费的 SSL/TLS 证书,或者你也可以从公共证书颁发机构Certificate Authoritie(CA)购买。过去,生成自签发证书十分简单而且通用,但是由于安全被日益重视,大部分的邮件客户端是不信任自签发证书的,除非手动设置。 + +如果你只是自己使用或者做做测试,那就使用自签发证书省点钱吧。但是如果很多人或者客户也需要使用的话,那最好还是从受信任的证书颁发机构购买。 + +不管是哪种情况,开始请求新证书的过程是使用 Linux 系统上的 OpenSSL 工具来创建一个证书签发请求Certificate Signing Request完全合规域名Fully Qualified Domain Name(FQDN)、邮件联系信息等等。当你输入完这些信息后,私钥和 CSR 文件就生成完毕了。 + +#### 如果你想生成自签发证书 + +如果你想要生成自签发证书的话,在运行以上 CSR 命令之前,你必须先创建一个[自己的根 CA][4]。你可以通过以下方法创建自己的根 CA。 + +``` +$ openssl genrsa -des3 -out myCA.key 2048 +``` + +命令行会提示你输入一个密码。请输入一个复杂点的密码而且不要弄丢了,因为这将会是根 CA 私钥的密码,正如其名称所示,它是你的证书中所有信任关系的根。 + +接下来,生成根 CA 证书: + +``` +$ openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem +``` + +在回答完一些问题后,你就拥有一个有效期为 5 年的根 CA 证书了。 + +用之前生成的 CSR 文件,你可以请求生成一个新证书,并由您刚才创建的根 CA 签名。 + +``` +$ openssl x509 -req -in mail.mydomain.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out mail.mydomain.pem -days 1825 -sha256 +``` + +输入你的根 CA 私钥的密码来创建和签署证书。 + +现在你有了配置电子邮件服务以增强安全性所需的两个文件:私匙文件 `mail.mydomain.key` 和公开证书文件 `mail.mydomain.pem`。 + +#### 如果你愿意购买证书 + +如果你愿意从机构购买证书,则需要上传 CSR 文件到证书颁发机构的系统中,它将会被用于生成 SSL/TLS 证书。证书可作为文件下载,比如 `mail.mydomain.pem`。很多 SSL 机构也需要你下载一个中间证书。如果是这样的话,你必须把这个两个证书合并成一个,这样电子邮件服务就可以将这两个证书结合起来处理。可以使用以下命令把你的证书和第三方中间证书合并在一起: + +``` +$ cat mail.mydomain.pem gd_bundle-g2-g1.crt > mail.mydomain.pem +``` + +值得一提的是 `.pem` 文件后缀代表隐私增强邮件Privacy-Enhanced Mail。 + +现在你就有全部的设置邮件服务安全所需文件了:私匙文件 `mail.mydomain.key` 和组合的公开证书文件 `mail.mydomain.pem`。 + +### 为你的文件生成一个安全的文件夹 + +不管你是的证书是自签发的或者从机构购买,你都需要生成一个安全的,管理员拥有的文件夹用于保存这两个文件。可以使用以下命令来生成: + +``` +$ mkdir /etc/pki/tls +$ chown root:root /etc/pki/tls +$ chmod 700 /etc/pki/tls +``` + +在复制文件到 `/etc/pki/tls` 后,再次设置这些文件的权限: + +``` +$ chmod 600 /etc/pki/tls/* +``` + +### 配置你的 SMTP 和 IMAP 服务 + +接下来,让 SMTP 和 IMAP 服务使用新的安全证书。我们用 `postfix` 和 `dovecot` 来作为例子。 + +用你顺手的编辑器来编辑 `/etc/postfix/main.cf` 文件。添加以下几行: + +``` +smtpd_use_tls = yes +smtpd_tls_cert_file = /etc/pki/tls/mail.mydomain.pem +smtpd_tls_key_file = /etc/pki/tls/mail.mydomain.key +``` + +### 自定义选项 + +以下选项可以启用或禁用各种加密算法,协议等等: + +``` +smtpd_tls_eecdh_grade = strong +smtpd_tls_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 +smtpd_tls_mandatory_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 +smtpd_tls_mandatory_ciphers = high +smtpd_tls_security_level=may +smtpd_tls_ciphers = high +tls_preempt_cipherlist = yes +smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL +smtpd_tls_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL +smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 +smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 +``` + +编辑 `/etc/dovecot/dovecot.conf` 文件,添加以下三行: + +``` +ssl = required +ssl_cert = </etc/pki/tls/mail.mydomain.pem +ssl_key = </etc/pki/tls/mail.mydomain.key +``` + +添加下列更多选项来启用或禁用各种加密算法、协议等等(我把这些留给你来理解): + +``` +ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:ALL:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SSLv2 +ssl_prefer_server_ciphers = yes +ssl_protocols = !SSLv2 !SSLv3 !TLSv1 !TLSv1.1 +ssl_min_protocol = TLSv1.2 +``` + +### 设置 SELinux 上下文 + +如果你的 Linux 发行版启用了 SELinux,请为你的新证书文件设置正确的 SELinux 上下文。 + +对于 Postfix 设置 SELinux: + +``` +$ chcon -u system_u -t cert_t mail.mydomain.* +``` + +对于 Dovecot 设置 SELinux: + +``` +$ chcon -u system_u -t dovecot_cert_t mail.mydomain.* +``` + +重启这些服务,并与你相应更新过的电子邮件客户端配置连接。有些电子邮件客户端会自动探测到新的端口,有些则需要你手动更新。 + +### 测试配置 + +用 `openssl` 命令行和 `s_client` 插件来简单测试一下: + +``` +$ openssl s_client -connect mail.mydomain.com:993 +$ openssl s_client -starttls imap -connect mail.mydomain.com:143 +$ openssl s_client -starttls smtp -connect mail.mydomain.com:587 +``` + +这些测试命令会打印出很多信息,关于你使用的连接、证书、加密算法、会话和协议。这不仅是一个验证新设置的好方法,也可以确认你使用了适当的证书,以及在 postfix 或 dovecot 配置文件中定义的安全设置正确。 + +保持安全! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/securing-linux-email + +作者:[Marc Skinner][a] +选题:[lujun9972][b] +译者:[Acceleratorrrr](https://github.com/Acceleratorrrr) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/marc-skinner +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/newsletter_email_mail_web_browser.jpg?itok=Lo91H9UH (email or newsletters via inbox and browser) +[2]: https://linux.cn/article-11699-1.html +[3]: https://www.openssl.org/ +[4]: https://en.wikipedia.org/wiki/Root_certificate diff --git a/published/202005/20200428 Lubuntu 20.04 Review- Lightweight, Minimalistic, Polished.md b/published/202005/20200428 Lubuntu 20.04 Review- Lightweight, Minimalistic, Polished.md new file mode 100644 index 0000000000..3b04dc37b8 --- /dev/null +++ b/published/202005/20200428 Lubuntu 20.04 Review- Lightweight, Minimalistic, Polished.md @@ -0,0 +1,150 @@ +[#]: collector: (lujun9972) +[#]: translator: (qfzy1233) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12242-1.html) +[#]: subject: (Lubuntu 20.04 Review: Lightweight, Minimalistic, Polished) +[#]: via: (https://itsfoss.com/lubuntu-20-04-review/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +Lubuntu 20.04 点评:轻量、简约、文雅 +====== + +> Lubuntu 20.04 LTS 与之前的 LTS 版本有很大的不同。它旨在给你一个更完善的体验,而不仅仅是关注旧电脑。请阅读更多关于 Lubuntu 20.04 的内容。 + +### Lubuntu 20.04 点评:第一个基于 LXQt 的长期支持版 + +我在 Lubuntu 20.04 发行前几天就已经开始使用它了。我通常使用 Arch 阵营中 Manjaro 和 Cinnamon 桌面,所以使用 Lubuntu 对我来说是一个愉快的改变。 + +以下是我在使用 Lubuntu 20.04.时的一些感受和注记。 + +#### 再见 LXDE,你好 LXQt! + +长期以来,[Lubuntu][1] 都依靠 [LXDE][2] 来提供轻量级的 Linux 体验。但现在,它使用的是 LXQt 桌面环境。 + +[LXDE][3] 是基于 GTK(GNOME 所使用的库),更具体地说是基于 2020 年的 GTK+ 2。由于对 GTK+ 3 不满意,LXDE 开发人员 Hong Jen Yee 决定将整个桌面移植到 Qt(KDE 所使用的库)。LXDE 的 Qt 移植版本和 [Razor-qt][4] 项目合并形成 [LXQt][5]。所以现在,LXDE 和 LXQt 作为单独的项目而共存。 + +既然 LXDE 开发者本身专注于 LXQt,那么 Lubuntu 坚持使用三年多前上一次稳定发布版的桌面环境 LXDE 是没有意义的。 + +因此,Lubuntu 18.04 是使用 [LXDE][3] 的最后一个版本。幸运的是,这是一个长期支持版本。Lubuntu 团队将提供支持直到 2021 年。 + +![][6] + +#### 不仅适于老机器 + +随着在 2020 年“老机器”的定义发生了变化,Lubuntu 18.04 成为了最后一个 32 位版本。现在,即使是一台 10 年前的老机器也至少有 2G 的内存和一个双核 64 位处理器。 + +因此,Lubuntu 团队将不再设置最低的系统需求,也不再主要关注旧硬件。尽管 LXQt 仍然是一个轻量级的、经典而不失精致的、功能丰富的桌面环境。 + +在 Lubuntu 20.04 LTS 发布之前,Lubuntu 的第一个 LXQt 发行版是 18.10,开发人员经历了三个标准发行版来完善 LXQt 桌面,这是一个很好的开发策略。 + +#### 不用常规的 Ubiquity,Lubuntu 20.04 使用的是 Calamares 安装程序 + +![Lubuntu 20.04 Calamares 安装程序][8] + +在新版本中使用了全新的 [Calamares][9] 安装程序,取代了其它 [Ubuntu 官方版本][10]使用的 Ubiquity 安装程序。 + +整个安装过程在大约能在 10 分钟内完成,比之前 Lubuntu 的版本稍微快一些。 + +由于镜像文件附带了预先安装的基本应用程序,所以你可以很快就可以完成系统的完全配置。 + +#### 不要直接从 Lubuntu 18.04 升级到 Lubuntu 20.04 + +通常,你可以[将 Ubuntu 从一个 LTS 版本升级到另一个 LTS 版本][11]。但是 Lubuntu 团队建议不要从 Lubuntu 18.04 升级到 20.04。他们建议重新安装,这才是正确的。 + +Lubuntu 18.04 使用 LXDE 桌面,20.04 使用 LXQt。由于桌面环境的巨大变化,从 18.04 升级到 20.04 将导致系统崩溃。 + +#### 更多的 KDE 和 Qt 应用程序 + +![][12] + +下面是在这个新版本中默认提供的一些应用程序,正如我们所看到的,并非所有应用程序都是轻量级的,而且大多数应用程序都是基于 Qt 的。 + +甚至使用的软件中心也是 KDE 的 Discover,而不是 Ubuntu 的 GNOME 软件中心。 + + * Ark – 归档文件管理器 + * Bluedevil – 蓝牙连接管理 + * Discover 软件中心 – 包管理系统 + * FeatherPad – 文本编辑器 + * FireFox – 浏览器 + * K3b – CD/DVD 刻录器 + * Kcalc – 计算器 + * KDE 分区管理器 – 分区管理工具 + * LibreOffice – 办公套件(Qt 界面版本) + * LXimage-Qt – 图片查看器及截图制作 + * Muon – 包管理器 + * Noblenote – 笔记工具 + * PCManFM-Qt – 文件管理器 + * Qlipper – 剪贴板管理工具 + * qPDFview – PDF 阅读器 + * PulseAudio – 音频控制器 + * Qtransmission – BT 下载工具(Qt 界面版本) + * Quassel – IRC 客户端 + * ScreenGrab – 截屏制作工具 + * Skanlite – 扫描工具 + * 启动盘创建工具 – USB 启动盘制作工具 + * Trojita – 邮件客户端 + * VLC – 媒体播放器 + * [MPV 视频播放器][13] + +#### 测试 Lubuntu 20.04 LTS + +LXQt 版 Lubuntu 的启动时间不到一分钟,虽然是从 SSD 启动的。 + +LXQt 目前需要的内存比基于 Gtk+ 2 的 LXDE 稍微多一点,但是另一种 Gtk+ 3 工具包也需要更多的内存。 + +在重新启动之后,系统以非常低的内存占用情况运行,大约只有 340 MB(按照现代标准),比 LXDE 多 100 MB。 + +![htop 在 Lubuntu 20.04 上运行][14] + +LXQt 不仅适用于硬件较旧的用户,也适用于那些希望在新机器上获得简约经典体验的用户。 + +桌面布局看起来类似于 KDE 的 Plasma 桌面,你觉得呢? + +![Lubuntu 20.04 桌面环境][15] + +在左下角有一个应用程序菜单,一个用于显示固定和活动的应用程序的任务栏,右下角有一个系统托盘。 + +Lubuntu 的 LXQt 版本可以很容易的定制,所有的东西都在菜单的首选项下,大部分的关键项目都在 LXQt “设置”中。 + +值得一提的是,LXQt 在默认情况下使用流行的 [Openbox 窗口管理器][16]。 + +与前三个发行版一样,20.04 LTS 附带了一个默认的黑暗主题 Lubuntu Arc,但是如果不适合你的口味,可以快速更换,也很方便。 + +就日常使用而言,事实证明,Lubuntu 20.04 向我证明,其实每一个 Ubuntu 的分支版本都完全没有问题。 + +#### 结论 + +Lubuntu 团队已经成功地过渡到一个现代的、依然轻量级的、极简的桌面环境。LXDE 看起来被遗弃了,迁移到一个活跃的项目也是一件好事。 + +我希望 Lubuntu 20.04 能够让你和我一样热爱,如果是这样,请在下面的评论中告诉我。请继续关注! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/lubuntu-20-04-review/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[qfzy1233](https://github.com/qfzy1233) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://lubuntu.me/ +[2]: https://github.com/lxde +[3]: https://lxde.org/ +[4]: https://web.archive.org/web/20160220061334/http://razor-qt.org/ +[5]: https://lxqt.org/ +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/Lubuntu-20-04-review.jpg?ssl=1 +[7]: https://itsfoss.com/lubuntu-no-more-old-distro/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/lubuntu-20-04-installer.jpg?ssl=1 +[9]: https://calamares.io/ +[10]: https://itsfoss.com/which-ubuntu-install/ +[11]: https://itsfoss.com/upgrade-ubuntu-version/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/Lubuntu-20.04.gif?ssl=1 +[13]: https://itsfoss.com/mpv-video-player/ +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/htop.jpg?fit=800%2C629&ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/Lubuntu-20.04-desktop.jpg?fit=800%2C450&ssl=1 +[16]: https://en.wikipedia.org/wiki/Openbox diff --git a/published/202005/20200428 Upgrading Fedora 31 to Fedora 32.md b/published/202005/20200428 Upgrading Fedora 31 to Fedora 32.md new file mode 100644 index 0000000000..c2c4bc0301 --- /dev/null +++ b/published/202005/20200428 Upgrading Fedora 31 to Fedora 32.md @@ -0,0 +1,99 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12195-1.html) +[#]: subject: (Upgrading Fedora 31 to Fedora 32) +[#]: via: (https://fedoramagazine.org/upgrading-fedora-31-to-fedora-32/) +[#]: author: (Adam Šamalík https://fedoramagazine.org/author/asamalik/) + +将 Fedora 31 升级到 Fedora 32 +====== + +![][1] + +Fedora 32 [已经发布][2]。你可能想升级系统以获得 Fedora 中的最新功能。Fedora Workstation 有图形化的升级方法。另外,Fedora 提供了命令行方法,用于将 Fedora 31 升级到 Fedora 32。 + +升级前,请访问 [Fedora 32 个常见 bug 的维基页面][3],查看是否存在可能影响升级的问题。尽管 Fedora 社区试图确保升级正常进行,但是无法为用户可能使用的每种软硬件组合提供保证。 + +### 将 Fedora 31 Workstation 升级到 Fedora 32 + +在新版本发布不久之后就会出现通知,告诉你有可用的升级。你可以单击该通知启动 “GNOME 软件”。或者,你可以从 GNOME Shell 中选择“软件”。 + +在 “GNOME 软件”中选择更新Updates选项卡,你会看到一个页面通知你 Fedora 32 现在可用。 + +如果你在此页面看不到任何内容,请尝试使用左上方的重新加载按钮。发布后,所有系统可能都需要一段时间才能看到可用的升级。 + +选择下载Download获取升级包。你可以继续做事直到下载完成。然后使用 “GNOME 软件”重启系统并应用升级。升级需要时间,因此你可能需要喝杯咖啡,稍后再回来。 + +### 使用命令行 + +如果你是从 Fedora 的先前版本升级的,那么你可能对 `dnf upgrade` 插件很熟悉。这个方法是推荐和受支持的从 Fedora 31 升级到 Fedora 32 的方法。使用此插件将使你轻松地升级到 Fedora 32。 + +#### 1、更新软件并备份系统 + +在开始升级过程之前,请确保你有 Fedora 31 的最新软件。如果你安装了模块化软件modular software,这尤为重要。`dnf` 和 “GNOME 软件”的最新版本对某些模块化流的升级过程进行了改进。要更新软件,请使用 “GNOME 软件” 或在终端中输入以下命令。 + +``` +sudo dnf upgrade --refresh +``` + +此外,在继续操作之前,请确保备份系统。有关备份的帮助,请参阅 Fedora Magazine 上的[备份系列][4]。 + +#### 2、安装 DNF 插件 + +接下来,打开终端并输入以下命令安装插件: + +``` +sudo dnf install dnf-plugin-system-upgrade +``` + +#### 3、使用 DNF 开始更新 + +现在,你的系统已更新、已备份、并且已安装 DNF 插件,你可以在终端中使用以下命令开始升级: + +``` +sudo dnf system-upgrade download --releasever=32 +``` + +这个命令将开始在本地下载所有的升级包,为升级做准备。如果你在升级的时候因为没有更新的包、依赖关系破损或退役的包而出现问题,请在输入上述命令时添加 `--allowerasing` 标志。这将允许 DNF 移除可能阻碍系统升级的软件包。 + +#### 4、重启并升级 + +当上一个命令完成了所有升级包的下载,你的系统就可以重新启动了。要将系统引导至升级过程,请在终端中输入以下命令: + +``` +sudo dnf system-upgrade reboot +``` + +此后,系统将重启。在许多版本之前,`fedup` 工具会在内核选择/启动页上创建一个新选项。使用 `dnf-plugin-system-upgrade` 包,你的系统会重启进入 Fedora 31 当前安装的内核;这个是正常的。在选择内核之后,你的系统会立即开始升级过程。 + +现在可能是喝杯咖啡休息的好时机!完成后,系统将重启,你将能够登录到新升级的 Fedora 32 系统。 + +![][5] + +### 解决升级问题 + +有时,升级系统时可能会出现意外问题。如果你遇到任何问题,请访问 [DNF 系统升级文档][6],以获取有关故障排除的更多信息。 + +如果升级时遇到问题,并且系统上安装了第三方仓库,那么在升级时可能需要禁用这些仓库。对于 Fedora 不提供的仓库的支持,请联系仓库的提供者。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/upgrading-fedora-31-to-fedora-32/ + +作者:[Adam Šamalík][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/asamalik/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/04/31-32-816x345.png +[2]: https://linux.cn/article-12164-1.html +[3]: https://fedoraproject.org/wiki/Common_F32_bugs +[4]: https://fedoramagazine.org/taking-smart-backups-duplicity/ +[5]: https://cdn.fedoramagazine.org/wp-content/uploads/2016/06/Screenshot_f23-ws-upgrade-test_2016-06-10_110906-1024x768.png +[6]: https://docs.fedoraproject.org/en-US/quick-docs/dnf-system-upgrade/#Resolving_post-upgrade_issues diff --git a/published/202005/20200428 Using Files and Folders on Desktop Screen in Ubuntu.md b/published/202005/20200428 Using Files and Folders on Desktop Screen in Ubuntu.md new file mode 100644 index 0000000000..a58f9a7895 --- /dev/null +++ b/published/202005/20200428 Using Files and Folders on Desktop Screen in Ubuntu.md @@ -0,0 +1,102 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12198-1.html) +[#]: subject: (Using Files and Folders on Desktop Screen in Ubuntu) +[#]: via: (https://itsfoss.com/add-files-on-desktop-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +在 Ubuntu 桌面中使用文件和文件夹 +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/08/224609chff5qn5ccah56af.jpg) + +> 此初学者教程讨论了 在Ubuntu 桌面上添加文件和文件夹时可能遇到的一些困难。 + +我认识一些习惯将所有重要/常用文件放在桌面上以便快速访问的人。 + +![][1] + +我不喜欢杂乱的桌面,但是我可以想象它实际上可能对某些人有所帮助。 + +在过去的几个版本中,很难在 Ubuntu 的默认 GNOME 桌面上添加文件。这并不是 Ubuntu 的错。 + +[GNOME][2] 的开发者认为,桌面上没有图标和文件的存身之地。当你可以在菜单中轻松搜索文件时,无需将文件放在桌面上。这在部分情况下是事实。 + +这就是为什么 [GNOME 的文件管理器 Nautilus][3] 的较新版本不能很好地支持桌面上的图标和文件的原因。 + +也就是说,在桌面上添加文件和文件夹并非没有可能。让我告诉你如何做。 + +### 在 Ubuntu 的桌面上添加文件和文件夹 + +![][4] + +我在本教程中使用的是 Ubuntu 20.04。对于其他 Ubuntu 版本,步骤可能会有所不同。 + +#### 将文件和文件夹添加到“桌面文件夹” + +如果打开文件管理器,你应该在左侧边栏或文件夹列表中看到一个名为“桌面”的条目。此文件夹(以某种方式)代表你的桌面。 + +![Desktop folder can be used to add files to the desktop screen][5] + +你添加到此文件夹的所有内容都会反映在桌面上。 + +![Anything added to the Desktop folder will be reflected on the desktop screen][6] + +如果你从“桌面文件夹”中删除文件,那么文件也会从桌面中删除。 + +#### 将文件拖放到桌面不起作用 + +现在,如果你尝试从文件管理器往桌面上拖放文件,它会不起使用。这不是一个 bug,它是一个使很多人恼火的功能。 + +一种临时方案是打开两个文件管理器。在其中一个打开“桌面”文件夹,然后将文件拖放到该文件夹​​中,它们将被添加到桌面上。 + +我知道这并不理想,但是你没有太多选择。 + +#### 你不能使用 Ctrl+C 和 Ctrl+V 在桌面上复制粘贴,请使用右键单击菜单 + +更恼人的是,你不能使用 `Ctrl+V`(著名的键盘快捷键)将文件粘贴到桌面上。 + +但是,你仍然可以使用右键单击,然后选择“粘贴”,将文件复制到桌面上。你甚至可以通过这种方式创建新文件夹。 + +![Right click menu can be used for copy-pasting files to desktop][7] + +是否有意义?对我来说不是,但这就是 Ubuntu 20.04 的方式。 + +#### 你无法使用 Delete 键删除文件和文件夹,请再次使用右键菜单 + +更糟糕的是,你无法使用 `Delete` 键或 `Shift+Delete` 键从桌面上删除文件。但是你仍然可以右键单击文件或文件夹,然后选择“移至回收站”来删除文件。 + +![Delete files from desktop using right click][8] + +好了,你现在知道至少有一种方法可以在桌面上添加文件,但有一些限制。不幸的是,这还没有结束。 + +你无法在桌面上用名称搜索文件。通常,如果你开始输入 “abc”,那么以 “abc” 开头的文件会高亮显示。但是在这里不行。 + +我不知道为什么在桌面上添加文件受到了如此多的限制。值得庆幸的是,我不会经常使用它,否则我会感到非常沮丧。 + +如果有兴趣,你也可以阅读[在 Ubuntu 桌面上添加应用快捷方式][9]这篇文章。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/add-files-on-desktop-ubuntu/ + +作者:[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://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/files-on-desktop-ubuntu.jpg?ssl=1 +[2]: https://www.gnome.org/ +[3]: https://wiki.gnome.org/Apps/Files +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/adding-files-desktop-ubuntu.png?ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/desktop-folder-ubuntu.png?ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/adding-files-desktop-screen-ubuntu.jpg?ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/adding-new-files-ubuntu-desktop.jpg?ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/delete-files-from-desktop-ubuntu.jpg?ssl=1 +[9]: https://itsfoss.com/ubuntu-desktop-shortcut/ diff --git a/published/202005/20200428 What-s new in Fedora 32 Workstation.md b/published/202005/20200428 What-s new in Fedora 32 Workstation.md new file mode 100644 index 0000000000..17050794d2 --- /dev/null +++ b/published/202005/20200428 What-s new in Fedora 32 Workstation.md @@ -0,0 +1,87 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12201-1.html) +[#]: subject: (What’s new in Fedora 32 Workstation) +[#]: via: (https://fedoramagazine.org/whats-new-fedora-32-workstation/) +[#]: author: (Ryan Lerch https://fedoramagazine.org/author/ryanlerch/) + +Fedora 32 Workstation 的新功能 +====== + +![][1] + +Fedora 32 Workstation 是我们免费的领先操作系统的[最新版本][2]。你现在可以从[官方网站][3]下载它。Fedora 32 Workstation 中有几个新的且值得注意的变化。请阅读下面的详情。 + +### GNOME 3.36 + +Fedora 32 Workstation 包含了适合所有用户的 GNOME 桌面环境的最新版本。Fedora 32 Workstation 中的 GNOME 3.36 包含了许多更新和改进,包括: + +#### 重新设计的锁屏界面 + +Fedora 32 中的锁屏是一种全新的体验。新设计消除了以前版本中使用的“窗口阴影”,并着重于易用性和速度。 + +![Unlock screen in Fedora 32][4] + +#### 新的扩展程序 + +Fedora 32 有新的“扩展”应用,它可轻松管理你的 GNOME 扩展。过去,扩展是使用“软件”和/或“调整工具”来安装、配置和启用的。 + +![The new Extensions application in Fedora 32][5] + +请注意,默认情况下,Fedora 32 上未安装这个“扩展”应用。需要使用“软件”进行搜索和安装,或在终端中使用以下命令: + +``` +sudo dnf install gnome-extensions-app +``` + +#### 重新组织的设置应用 + +敏锐的 Fedora 用户会注意到“设置”应用已重新组织。设置类别的结构更加扁平,因此可以一次看到更多设置。 + +此外,“关于”中现在有有关系统的更多信息,包括正在运行的窗口系统(例如 Wayland)。 + +![The reorganized settings application in Fedora 32][6] + +#### 重新设计的通知/日历弹出框 + +单击桌面顶部的“日期和时间”可切换“通知/日历”弹出窗口,其中有许多小的样式调整项。此外,弹出窗口现在有“请勿打扰”开关,可快速禁用所有通知。这在希望只显示屏幕而不显示个人通知时很有用。 + +![The new Notification / Calendar popover in Fedora 32 ][7] + +#### 重新设计的时钟应用 + +Fedora 32 完全重新设计了时钟。该设计在较小的窗口中效果更好。 + +![The Clocks application in Fedora 32][8] + +GNOME 3.36 还提供了许多其他功能和增强。有关更多信息,请查看 [GNOME 3.36 的发布说明][9]。 + +### 改进的内存不足处理 + +以前,如果系统内存不足,那么可能会遇到大量使用交换(也称为 [交换抖动][10])–有时会导致 Workstation UI 变慢或在一段时间内无响应。Fedora 32 Workstation 现在默认启用 EarlyOOM。EarlyOOM 可以让用户在低内存的情况下,存在大量使用交换的情况下,更快速地恢复和恢复对系统的控制。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/whats-new-fedora-32-workstation/ + +作者:[Ryan Lerch][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/ryanlerch/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/04/fedora32workstation-816x345.jpg +[2]: https://linux.cn/article-12164-1.html +[3]: https://getfedora.org/workstation +[4]: https://fedoramagazine.org/wp-content/uploads/2020/04/unlock.gif +[5]: https://fedoramagazine.org/wp-content/uploads/2020/04/extensions.png +[6]: https://fedoramagazine.org/wp-content/uploads/2020/04/settings.png +[7]: https://fedoramagazine.org/wp-content/uploads/2020/04/donotdisturb.png +[8]: https://fedoramagazine.org/wp-content/uploads/2020/04/clocks.png +[9]: https://help.gnome.org/misc/release-notes/3.36/ +[10]: https://en.wikipedia.org/wiki/Thrashing_(computer_science) diff --git a/published/202005/20200429 Drop PNG and JPG for your online images- Use WebP.md b/published/202005/20200429 Drop PNG and JPG for your online images- Use WebP.md new file mode 100644 index 0000000000..7f581e778f --- /dev/null +++ b/published/202005/20200429 Drop PNG and JPG for your online images- Use WebP.md @@ -0,0 +1,165 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12193-1.html) +[#]: subject: (Drop PNG and JPG for your online images: Use WebP) +[#]: via: (https://opensource.com/article/20/4/webp-image-compression) +[#]: author: (Jeff Macharyas https://opensource.com/users/jeffmacharyas) + +线上图片请抛弃 PNG 和 JPG:使用 WebP +====== + +> 了解一下这个开源的图片编辑工具来节省时间和空间。 + +![](https://img.linux.net.cn/data/attachment/album/202005/07/143932l22hot7ebhbbqjmm.jpg) + +WebP 是 2010 年 Google 开发的一种图片格式,它为网页上的图片提供了卓越的无损和有损压缩。网站开发者们可以使用 WebP 来创建尺寸更小、细节更丰富的图片,以此来提高网站的速度。更快的加载速度对于网站的用户体验和网站的营销效果是至关重要的。 + +为了在所有设备和用户中达到最佳加载效果,你网站上的图片文件大小不应该超过 500 KB。 + +与 PNG 图片相比,WebP 无损图片通常至少要比 PNG 图片小 25%。在同等的 SSIM(结构相似度structural similarity)质量指标下,WebP 有损图片通常比 JPEG 图片小 25% 到 34%。 + +无损 WebP 也支持透明度。而在可接受有损 RGB 压缩的情况下,有损 WebP 也支持透明度,通常其大小比 PNG 文件小三倍。 + +Google 报告称,把动画 GIF 文件转换为有损 WebP 后文件大小减少了 64%,转换为无损 WebP 后文件大小减少了 19%。 + +WebP 文件格式是一种基于 RIFF(资源互换文件格式resource interchange file format)的文档格式。你可以用 [hexdump][2] 看到文件的签名是 `52 49 46 46`(RIFF): + + +``` +$ hexdump --canonical pixel.webp +00000000  52 49 46 46 26 00 00 00  [...]  |RIFF&...WEBPVP8 | +00000010  1a 00 00 00 30 01 00 9d  [...]  |....0....*......| +00000020  0e 25 a4 00 03 70 00 fe  [...]  |.%...p...`....| +0000002e +``` + +独立的 libwebp 库作为 WebP 技术规范的参考实现,可以从 Google 的 [Git 仓库][3] 或 tar 包中获得。 + +全球在用的 80% 的 web 浏览器兼容 WebP 格式。本文撰写时,Apple 的 Safari 浏览器还不兼容。解决这个问题的方法是将 JPG/PNG 图片与 WebP 图片一起提供,有一些方法和 Wordpress 插件可以做到这一点。 + +### 为什么要这样做? + +我的部分工作是设计和维护我们组织的网站。由于网站是个营销工具,而网站的速度是衡量用户体验的重要指标,我一直致力于提高网站速度,通过把图片转换为 WebP 来减少图片大小是一个很好的解决方案。 + +我使用了 web.dev 来检测其中一个网页,该工具是由 Lighthouse 提供服务的,遵循 Apache 2.0 许可证,可以在 找到。 + +据其官方描述,“LIghthouse 是一个开源的,旨在提升网页质量的自动化工具。你可以在任何公共的或需要鉴权的网页上运行它。它有性能、可用性、渐进式 web 应用、SEO 等方面的审计。你可以在 Chrome 浏览器的开发工具中运行 Lighthouse,也可以通过命令行或作为 Node 模块运行。你输入一个 URL 给 Lighthouse,它会对这个网页进行一系列的审计,然后生成这个网页的审计结果报告。从报告的失败审计条目中可以知道应该怎么优化网页。每条审计都有对应的文档解释为什么该项目是重要的,以及如何修复它。” + +### 创建更小的 WebP 图片 + +我测试的页面返回了三张图片。在它生成的报告中,它提供了推荐和目标。我选择了它报告有 650 KB 的 `app-graphic` 图片。通过把它转换为 WebP 格式,预计可以把图片大小降到 61 KB,节省 589 KB。我在 Photoshop 中把它转换了,用默认的 WebP 设置参数保存它,它的文件大小为 44.9 KB。比预期的还要好!从下面的 Photoshop 截图中可以看出,两张图在视觉质量上完全一样。 + +![WebP vs JPG comparison][4] + +*左图:650 KB(实际大小)。右图: 44.9 KB(转换之后的目标大小)。* + +当然,也可以用开源图片编辑工具 [GIMP][5] 把图片导出为 WebP。它提供了几个质量和压缩的参数: + +![GIMP dialog for exporting webp, as a webp][6] + +另一张图放大后: + +![WebP vs PNG comparison][7] + +PNG(左图)和 WebP(右图),都是从 JPG 转换而来,两图对比可以看出 WebP 不仅在文件大小更小,在视觉质量上也更优秀。 + +### 把图片转换为 WebP + +你也可以用 Linux 的命令行工具把图片从 JPG/PNG 转换为 WebP: + +在命令行使用 `cwebp` 把 PNG 或 JPG 图片文件转换为 WebP 格式。你可以用下面的命令把 PNG 图片文件转换为质量参数为 80 的 WebP 图片。 + +``` +cwebp -q 80 image.png -o image.webp +``` + +你还可以用 [Image Magick][8],这个工具可能在你的发行版本软件仓库中可以找到。转换的子命令是 `convert`,它需要的所有参数就是输入和输出文件: + +``` +convert pixel.png pixel.webp +``` + +### 使用编辑器把图片转换为 WebP + +要在图片编辑器中来把图片转换为 WebP,可以使用 [GIMP][9]。从 2.10 版本开始,它原生地支持 WebP。 + +如果你是 Photoshop 用户,由于 Photoshop 默认不包含 WebP 支持,因此你需要一个转换插件。遵循 Apache License 2.0 许可证发布的 WebPShop 0.2.1 是一个用于打开和保存包括动画图在内的 WebP 图片的 Photoshop 模块,在 可以找到。 + +为了能正常使用它,你需要把它放进 Photoshop 插件目录下的 `bin` 文件夹: + +Windows x64 :`C:\Program Files\Adobe\Adobe Photoshop\Plug-ins\WebPShop.8bi` + +Mac:`Applications/Adobe Photoshop/Plug-ins/WebPShop.plugin` + +### Wordpress 上的 WebP + +很多网站是用 Wordpress 搭建的(我的网站就是)。因此,Wordpress 怎么上传 WebP 图片?本文撰写时,它还不支持。但是,当然已经有插件来满足这种需求,因此你可以在你的网站上同时准备 WebP 和 PNG/JPG 图片(为 Apple 用户)。 + +在 [Marius Hosting][11] 有下面的[说明][10]: + +“直接向 Wordpress 上传 WebP 图片会怎样?这很简单。向你的主题 `functions.php` 文件添加几行内容就可以了。Wordpress 默认不支持展示和上传 WebP 文件,但是我会向你介绍一下怎么通过几个简单的步骤来让它支持。登录进你的 Wordpress 管理员界面,进入‘外观/主题编辑器’找到 `functions.php`。复制下面的代码粘贴到该文件最后并保存: + +``` +//** *Enable upload for webp image files.*/ +function webp_upload_mimes($existing_mimes) { + $existing_mimes['webp'] = 'image/webp'; + return $existing_mimes; +} +add_filter('mime_types', 'webp_upload_mimes'); +``` + +如果你想在‘媒体/媒体库’时看到缩略图预览,那么你需要把下面的代码也添加到 `functions.php` 文件。为了找到 `functions.php` 文件,进入‘外观/主题编辑器’并搜索 `functions.php`,然后复制下面的代码粘贴到文件最后并保存: + +``` +//** * Enable preview / thumbnail for webp image files.*/ +function webp_is_displayable($result, $path) { + if ($result === false) { + $displayable_image_types = array( IMAGETYPE_WEBP ); + $info = @getimagesize( $path ); + + if (empty($info)) { + $result = false; + } elseif (!in_array($info[2], $displayable_image_types)) { + $result = false; + } else { + $result = true; + } + } + + return $result; +} +add_filter('file_is_displayable_image', 'webp_is_displayable', 10, 2); +``` + +” + +### WebP 和未来 + +WebP 是一个健壮而优化的格式。它看起来更好,压缩率更高,并具有其他大部分常见图片格式的所有特性。不必再等了,现在就使用它吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/webp-image-compression + +作者:[Jeff Macharyas][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[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/painting_computer_screen_art_design_creative.png?itok=LVAeQx3_ (Painting art on a computer screen) +[2]: https://opensource.com/article/19/8/dig-binary-files-hexdump +[3]: https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html +[4]: https://opensource.com/sites/default/files/uploads/webp-vs-jpg-app-graphic.png (WebP vs JPG comparison) +[5]: http://gimp.org +[6]: https://img.linux.net.cn/data/attachment/album/202005/07/143538plu797s4wmhy9b1p.jpg (GIMP dialog for exporting webp, as a webp) +[7]: https://opensource.com/sites/default/files/uploads/xcompare-png-left-webp-right.png (WebP vs PNG comparison) +[8]: https://imagemagick.org +[9]: https://en.wikipedia.org/wiki/GIMP +[10]: https://mariushosting.com/how-to-upload-webp-files-on-wordpress/ +[11]: https://mariushosting.com/ diff --git a/published/202005/20200429 The life-changing magic of git rebase -i.md b/published/202005/20200429 The life-changing magic of git rebase -i.md new file mode 100644 index 0000000000..54665c70fe --- /dev/null +++ b/published/202005/20200429 The life-changing magic of git rebase -i.md @@ -0,0 +1,79 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12231-1.html) +[#]: subject: (The life-changing magic of git rebase -i) +[#]: via: (https://opensource.com/article/20/4/git-rebase-i) +[#]: author: (Dave Neary https://opensource.com/users/dneary) + +完美生活:git rebase -i +====== + +> 让大家觉得你一次就能写出完美的代码,并让你的补丁更容易审核和合并。 + +![](https://img.linux.net.cn/data/attachment/album/202005/18/185911fvwztwyp4lvbzkw4.jpg) + +软件开发是混乱的。有很多错误的转折、有需要修复的错别字、有需要修正的错误、有需要稍后纠正的临时和粗陋的代码,还有在以后的开发过程中发现一次又一次的问题。有了版本控制,在创建“完美”的最终产品(即准备提交给上游的补丁)的过程中,你会有一个记录着每一个错误转折和修正的原始记录。就像电影中的花絮一样,它们会让人有点尴尬,有时也会让人觉得好笑。 + +如果你使用版本控制来定期保存你的工作线索,然后当你准备提交审核的东西时,又可以隐藏所有这些私人草稿工作,并只提交一份单一的、完美的补丁,那不是很好吗?`git rebase -i`,是重写历史记录的完美方法,可以让大家觉得你一次就写出了完美的代码! + +### git rebase 的作用是什么? + +如果你不熟悉 Git 的复杂性,这里简单介绍一下。在幕后,Git 将项目的不同版本与唯一标识符关联起来,这个标识符由父节点的唯一标识符的哈希以及新版本与其父节点的差异组成。这样就形成了一棵修订树,每个签出项目的人都会得到自己的副本。不同的人可以把项目往不同的方向发展,每个方向都可能从不同的分支点开始。 + +![Master branch vs. private branch][2] + +*左边是 origin 版本库中的主分支,右边是你个人副本中的私有分支。* + +有两种方法可以将你的工作与原始版本库中的主分支整合起来:一种是使用合并:`git merge`,另一种是使用变基:`git rebase`。它们的工作方式非常不同。 + +当你使用 `git merge` 时,会在主分支(`master`)上创建一个新的提交,其中包括所有来自原始位置(`origin`)的修改和所有本地的修改。如果有任何冲突(例如,如果别人修改了你也在修改的文件),则将这些冲突标记出来,并且你有机会在将这个“合并提交”提交到本地版本库之前解决这些冲突。当你将更改推送回父版本库时,所有的本地工作都会以分支的形式出现在 Git 版本库的其他用户面前。 + +但是 `git rebase` 的工作方式不同。它会回滚你的提交,并从主分支(`master`)的顶端再次重放这些提交。这导致了两个主要的变化。首先,由于你的提交现在从一个不同的父节点分支出来,它们的哈希值会被重新计算,并且任何克隆了你的版本库的人都可能得到该版本库的一个残破副本。第二,你没有“合并提交”,所以在将更改重放到主分支上时会识别出任何合并冲突,因此,你需要在进行变基rebase之前先修复它们。现在,当你现在推送你的修改时,你的工作不会出现在分支上,并且看起来像是你是在主分支的最新的提交上写入了所有的修改。 + +![Merge commits preserve history, and rebase rewrites history.][3] + +*合并提交(左)保留了历史,而变基(右)重写历史。* + +然而,这两种方式都有一个缺点:在你准备好分享代码之前,每个人都可以看到你在本地处理问题时的所有涂鸦和编辑。这就是 `git rebase` 的 `--interactive`(或简写 `-i`)标志发挥作用的地方。 + +### git rebase -i 登场 + +`git rebase` 的最大优点是它可以重写历史。但是,为什么仅止于假装你从后面的点分支出来呢?有一种更进一步方法可以重写你是如何准备就绪这些代码的:`git rebase -i`,即交互式的 `git rebase`。 + +这个功能就是 Git 中的 “魔术时光机” 功能。这个标志允许你在做变基时对修订历史记录进行复杂的修改。你可以隐藏你的错误! 将许多小的修改合并到一个崭新的功能补丁中! 重新排列修改历史记录中的显示顺序! + +![output of git rebase -i][4] + +当你运行 `git rebase -i` 时,你会进入一个编辑器会话,其中列出了所有正在被变基的提交,以及可以对其执行的操作的多个选项。默认的选择是选择(`Pick`)。 + +* `Pick`:会在你的历史记录中保留该提交。 +* `Reword`:允许你修改提交信息,可能是修复一个错别字或添加其它注释。 +* `Edit`:允许你在重放分支的过程中对提交进行修改。 +* `Squash`:可以将多个提交合并为一个。 +* 你可以通过在文件中移动来重新排序提交。 + +当你完成后,只需保存最终结果,变基操作就会执行。在你选择修改提交的每个阶段(无论是用 `reword`、`edit`、`squash` 还是发生冲突时),变基都会停止,并允许你在继续提交之前进行适当的修改。 + +上面这个例子的结果是 “One-liner bug fix” 和 “Integate new header everywhere” 被合并到一个提交中,而 “New header for docs website” 和 “D'oh - typo. Fixed” 合并到另一个提交中。就像变魔术一样,其他提交的工作还在你的分支中,但相关的提交已经从你的历史记录中消失了! + +这使得使用 `git send-email` 或者用你新整理好的补丁集在父版本库中创建一个拉取请求,然后来提交一个干净的补丁给上游项目变得很容易。这有很多好处,包括让你的代码更容易审核,更容易接受,也更容易合并。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/git-rebase-i + +作者:[Dave Neary][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/dneary +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop.png?itok=pGfEfu2S (Hands programming) +[2]: https://opensource.com/sites/default/files/uploads/master-private-branches.png (Master branch vs. private branch) +[3]: https://opensource.com/sites/default/files/uploads/merge-commit-vs-rebase.png (Merge commits preserve history, and rebase rewrites history.) +[4]: https://opensource.com/sites/default/files/uploads/git-rebase-i.png (output of git rebase -i) diff --git a/published/202005/20200429 Why strace doesn-t work in Docker.md b/published/202005/20200429 Why strace doesn-t work in Docker.md new file mode 100644 index 0000000000..57e5a5b42e --- /dev/null +++ b/published/202005/20200429 Why strace doesn-t work in Docker.md @@ -0,0 +1,161 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12251-1.html) +[#]: subject: (Why strace doesn't work in Docker) +[#]: via: (https://jvns.ca/blog/2020/04/29/why-strace-doesnt-work-in-docker/) +[#]: author: (Julia Evans https://jvns.ca/) + +为什么 strace 在 Docker 中不起作用? +====== + +在编辑“容器如何工作”爱好者杂志的能力页面时,我想试着解释一下为什么 `strace` 在 Docker 容器中无法工作。 + +这里的问题是 —— 如果我在笔记本上的 Docker 容器中运行 `strace`,就会出现这种情况: + +``` +$ docker run -it ubuntu:18.04 /bin/bash +$ # ... install strace ... +[email protected]:/# strace ls +strace: ptrace(PTRACE_TRACEME, ...): Operation not permitted +``` + +`strace` 通过 `ptrace` 系统调用起作用,所以如果不允许使用 `ptrace`,它肯定是不能工作的! 这个问题很容易解决 —— 在我的机器上,是这样解决的: + +``` +docker run --cap-add=SYS_PTRACE -it ubuntu:18.04 /bin/bash +``` + +但我对如何修复它不感兴趣,我想知道为什么会出现这种情况。为什么 `strace` 不能工作,为什么`--cap-add=SYS_PTRACE` 可以解决这个问题? + +### 假设 1:容器进程缺少 `CAP_SYS_PTRACE` 能力。 + +我一直以为原因是 Docker 容器进程默认不具备 `CAP_SYS_PTRACE` 能力。这和它可以被 `--cap-add=SYS_PTRACE` 修复是一回事,是吧? + +但这实际上是不合理的,原因有两个。 + +原因 1:在实验中,作为一个普通用户,我可以对我的用户运行的任何进程进行 `strace`。但如果我检查我的当前进程是否有 `CAP_SYS_PTRACE` 能力,则没有: + +``` +$ getpcaps $$ +Capabilities for `11589': = +``` + +原因 2:`capabilities` 的手册页对 `CAP_SYS_PTRACE` 的介绍是: + +``` +CAP_SYS_PTRACE + * Trace arbitrary processes using ptrace(2); +``` + +所以,`CAP_SYS_PTRACE` 的作用是让你像 root 一样,可以对任何用户拥有的**任意**进程进行 `ptrace`。你不需要用它来对一个只是由你的用户拥有的普通进程进行 `ptrace` 。 + +我用第三种方法测试了一下(LCTT 译注:此处可能原文有误) —— 我用 `docker run --cap-add=SYS_PTRACE -it ubuntu:18.04 /bin/bash` 运行了一个 Docker 容器,去掉了 `CAP_SYS_PTRACE` 能力,但我仍然可以跟踪进程,虽然我已经没有这个能力了。什么?为什么?! + +### 假设 2:关于用户命名空间的事情? + +我的下一个(没有那么充分的依据的)假设是“嗯,也许这个过程是在不同的用户命名空间里,而 `strace` 不能工作,因为某种原因而行不通?”这个问题其实并不相关,但这是我观察时想到的。 + +容器进程是否在不同的用户命名空间中?嗯,在容器中: + +``` +root@e27f594da870:/# ls /proc/$$/ns/user -l +... /proc/1/ns/user -> 'user:[4026531837]' +``` + +在宿主机: + +``` +bork@kiwi:~$ ls /proc/$$/ns/user -l +... /proc/12177/ns/user -> 'user:[4026531837]' +``` + +因为用户命名空间 ID(`4026531837`)是相同的,所以容器中的 root 用户和主机上的 root 用户是完全相同的用户。所以,绝对没有理由不能够对它创建的进程进行 `strace`! + +这个假设并没有什么意义,但我(之前)没有意识到 Docker 容器中的 root 用户和主机上的 root 用户同一个,所以我觉得这很有意思。 + +### 假设 3:ptrace 系统的调用被 seccomp-bpf 规则阻止了 + +我也知道 Docker 使用 seccomp-bpf 来阻止容器进程运行许多系统调用。而 `ptrace` 在[被 Docker 默认的 seccomp 配置文件阻止的系统调用列表][2]中!(实际上,允许的系统调用列表是一个白名单,所以只是`ptrace` 不在默认的白名单中。但得出的结果是一样的。) + +这很容易解释为什么 `strace` 在 Docker 容器中不能工作 —— 如果 `ptrace` 系统调用完全被屏蔽了,那么你当然不能调用它,`strace` 就会失败。 + +让我们来验证一下这个假设 —— 如果我们禁用了所有的 seccomp 规则,`strace` 能在 Docker 容器中工作吗? + +``` +$ docker run --security-opt seccomp=unconfined -it ubuntu:18.04 /bin/bash +$ strace ls +execve("/bin/ls", ["ls"], 0x7ffc69a65580 /* 8 vars */) = 0 +... it works fine ... +``` + +是的,很好用!很好。谜底解开了,除了..... + +### 为什么 `--cap-add=SYS_PTRACE` 能解决问题? + +我们还没有解释的是:为什么 `--cap-add=SYS_PTRACE` 可以解决这个问题? + +`docker run` 的手册页是这样解释 `--cap-add` 参数的。 + +``` +--cap-add=[] + Add Linux capabilities +``` + +这跟 seccomp 规则没有任何关系! 怎么回事? + +### 我们来看看 Docker 源码 + +当文档没有帮助的时候,唯一要做的就是去看源码。 + +Go 语言的好处是,因为依赖关系通常是在一个 Go 仓库里,你可以通过 `grep` 来找出做某件事的代码在哪里。所以我克隆了 `github.com/moby/moby`,然后对一些东西进行 `grep`,比如 `rg CAP_SYS_PTRACE`。 + +我认为是这样的。在 `containerd` 的 seccomp 实现中,在 [contrib/seccomp/seccomp/seccomp_default.go][3] 中,有一堆代码来确保如果一个进程有一个能力,那么它也会(通过 seccomp 规则)获得访问权限,以使用与该能力相关的系统调用。 + +``` +case "CAP_SYS_PTRACE": + s.Syscalls = append(s.Syscalls, specs.LinuxSyscall{ + Names: []string{ + "kcmp", + "process_vm_readv", + "process_vm_writev", + "ptrace", + }, + Action: specs.ActAllow, + Args: []specs.LinuxSeccompArg{}, + }) +``` + +在 moby 中的 [profile/seccomp/seccomp.go][4] 和 [默认的 seccomp 配置文件][5]中,也有一些其他的代码似乎做了一些非常类似的事情,所以有可能就是这个代码在做这个事情。 + +所以我想我们有答案了! + +### Docker 中的 `--cap-add` 做的事情比它说的要多 + +结果似乎是,`--cap-add` 并不像手册页里说的那样,它更像是 `--cap-add-and-also-whiteelist-some-extra-system-calls-if-required`。这很有意义! 如果你具有一个像 `--CAP_SYS_PTRACE` 这样的能力,可以让你使用 `process_vm_readv` 系统调用,但是该系统调用被 seccomp 配置文件阻止了,那对你没有什么帮助! + +所以当你给容器 `CAP_SYS_PTRACE` 能力时,允许使用 `process_vm_readv` 和 `ptrace` 系统调用似乎是一个合理的选择。 + +### 就这样! + +这是个有趣的小事情,我认为这是一个很好的例子,说明了容器是由许多移动的部件组成的,它们以不完全显而易见的方式一起工作。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/04/29/why-strace-doesnt-work-in-docker/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://wizardzines.com/zines/containers +[2]: https://docs.docker.com/engine/security/seccomp/ +[3]: https://github.com/containerd/containerd/blob/4be98fa28b62e8a012491d655a4d6818ef87b080/contrib/seccomp/seccomp_default.go#L527-L537 +[4]: https://github.com/moby/moby/blob/cc0dfb6e7b22ad120c60a9ce770ea15415767cf9/profiles/seccomp/seccomp.go#L126-L132 +[5]: https://github.com/moby/moby/blob/master/profiles/seccomp/default.json#L723-L739 diff --git a/published/202005/20200430 10 ways to analyze binary files on Linux.md b/published/202005/20200430 10 ways to analyze binary files on Linux.md new file mode 100644 index 0000000000..35fedf607a --- /dev/null +++ b/published/202005/20200430 10 ways to analyze binary files on Linux.md @@ -0,0 +1,314 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12187-1.html) +[#]: subject: (10 ways to analyze binary files on Linux) +[#]: via: (https://opensource.com/article/20/4/linux-binary-analysis) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) + +在 Linux 上分析二进制文件的 10 种方法 +====== + +> 这些简单的命令和工具可以帮助你轻松完成分析二进制文件的任务。 + +![](https://img.linux.net.cn/data/attachment/album/202005/05/232115nn0oduodo4oztv0a.jpg) + +“这个世界上有 10 种人:懂二进制的人和不懂二进制的人。” + +我们每天都在与二进制文件打交道,但我们对二进制文件却知之甚少。我所说的二进制,是指你每天运行的可执行文件,从命令行工具到成熟的应用程序都是。 + +Linux 提供了一套丰富的工具,让分析二进制文件变得轻而易举。无论你的工作角色是什么,如果你在 Linux 上工作,了解这些工具的基本知识将帮助你更好地理解你的系统。 + +在这篇文章中,我们将介绍其中一些最流行的 Linux 工具和命令,其中大部分都是 Linux 发行版的一部分。如果没有找到,你可以随时使用你的软件包管理器来安装和探索它们。请记住:学习在正确的场合使用正确的工具需要大量的耐心和练习。 + +### file + +它的作用:帮助确定文件类型。 + +这将是你进行二进制分析的起点。我们每天都在与文件打交道,并非所有的文件都是可执行类型,除此之外还有各种各样的文件类型。在你开始之前,你需要了解要分析的文件类型。是二进制文件、库文件、ASCII 文本文件、视频文件、图片文件、PDF、数据文件等文件吗? + +`file` 命令将帮助你确定你所处理的文件类型。 + +``` +$ file /bin/ls +/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=94943a89d17e9d373b2794dcb1f7e38c95b66c86, stripped +$ +$ file /etc/passwd +/etc/passwd: ASCII text +$ +``` + +### ldd + +它的作用:打印共享对象依赖关系。 + +如果你已经在一个可执行的二进制文件上使用了上面的 `file` 命令,你肯定会看到输出中的“动态链接dynamically linked”信息。它是什么意思呢? + +在开发软件的时候,我们尽量不要重造轮子。有一组常见的任务是大多数软件程序需要的,比如打印输出或从标准输入/打开的文件中读取等。所有这些常见的任务都被抽象成一组通用的函数,然后每个人都可以使用,而不是写出自己的变体。这些常用的函数被放在一个叫 `libc` 或 `glibc` 的库中。 + +如何找到可执行程序所依赖的库?这就是 `ldd` 命令的作用了。对动态链接的二进制文件运行该命令会显示出所有依赖库和它们的路径。 + +``` +$ ldd /bin/ls + linux-vdso.so.1 => (0x00007ffef5ba1000) + libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fea9f854000) + libcap.so.2 => /lib64/libcap.so.2 (0x00007fea9f64f000) + libacl.so.1 => /lib64/libacl.so.1 (0x00007fea9f446000) + libc.so.6 => /lib64/libc.so.6 (0x00007fea9f079000) + libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fea9ee17000) + libdl.so.2 => /lib64/libdl.so.2 (0x00007fea9ec13000) + /lib64/ld-linux-x86-64.so.2 (0x00007fea9fa7b000) + libattr.so.1 => /lib64/libattr.so.1 (0x00007fea9ea0e000) + libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fea9e7f2000) +$ +``` + +### ltrace + +它的作用:库调用跟踪器。 + +我们现在知道如何使用 `ldd` 命令找到一个可执行程序所依赖的库。然而,一个库可以包含数百个函数。在这几百个函数中,哪些是我们的二进制程序正在使用的实际函数? + +`ltrace` 命令可以显示运行时从库中调用的所有函数。在下面的例子中,你可以看到被调用的函数名称,以及传递给该函数的参数。你也可以在输出的最右边看到这些函数返回的内容。 + +``` +$ ltrace ls +__libc_start_main(0x4028c0, 1, 0x7ffd94023b88, 0x412950 +strrchr("ls", '/') = nil +setlocale(LC_ALL, "") = "en_US.UTF-8" +bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale" +textdomain("coreutils") = "coreutils" +__cxa_atexit(0x40a930, 0, 0, 0x736c6974756572) = 0 +isatty(1) = 1 +getenv("QUOTING_STYLE") = nil +getenv("COLUMNS") = nil +ioctl(1, 21523, 0x7ffd94023a50) = 0 +<< snip >> +fflush(0x7ff7baae61c0) = 0 +fclose(0x7ff7baae61c0) = 0 ++++ exited (status 0) +++ +$ +``` + +### hexdump + +它的作用:以 ASCII、十进制、十六进制或八进制显示文件内容。 + +通常情况下,当你用一个应用程序打开一个文件,而它不知道如何处理该文件时,就会出现这种情况。尝试用 `vim` 打开一个可执行文件或视频文件,你屏幕上会看到的只是抛出的乱码。 + +在 `hexdump` 中打开未知文件,可以帮助你看到文件的具体内容。你也可以选择使用一些命令行选项来查看用 ASCII 表示的文件数据。这可能会帮助你了解到它是什么类型的文件。 + +``` +$ hexdump -C /bin/ls | head +00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............| +00000010  02 00 3e 00 01 00 00 00  d4 42 40 00 00 00 00 00  |..>......B@.....| +00000020  40 00 00 00 00 00 00 00  f0 c3 01 00 00 00 00 00  |@...............| +00000030  00 00 00 00 40 00 38 00  09 00 40 00 1f 00 1e 00  |....@.8...@.....| +00000040  06 00 00 00 05 00 00 00  40 00 00 00 00 00 00 00  |........@.......| +00000050  40 00 40 00 00 00 00 00  40 00 40 00 00 00 00 00  |@.@.....@.@.....| +00000060  f8 01 00 00 00 00 00 00  f8 01 00 00 00 00 00 00  |................| +00000070  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |................| +00000080  38 02 00 00 00 00 00 00  38 02 40 00 00 00 00 00  |8.......8.@.....| +00000090  38 02 40 00 00 00 00 00  1c 00 00 00 00 00 00 00  |8.@.............| +$ +``` + +### strings + +它的作用:打印文件中的可打印字符的字符串。 + +如果你只是在二进制中寻找可打印的字符,那么 `hexdump` 对于你的使用场景来说似乎有点矫枉过正,你可以使用 `strings` 命令。 + +在开发软件的时候,各种文本/ASCII 信息会被添加到其中,比如打印信息、调试信息、帮助信息、错误等。只要这些信息都存在于二进制文件中,就可以用 `strings` 命令将其转储到屏幕上。 + +``` +$ strings /bin/ls +``` + +### readelf + +它的作用:显示有关 ELF 文件的信息。 + +ELF(可执行和可链接文件格式Executable and Linkable File Format)是可执行文件或二进制文件的主流格式,不仅是 Linux 系统,也是各种 UNIX 系统的主流文件格式。如果你已经使用了像 `file` 命令这样的工具,它告诉你文件是 ELF 格式,那么下一步就是使用 `readelf` 命令和它的各种选项来进一步分析文件。 + +在使用 `readelf` 命令时,有一份实际的 ELF 规范的参考是非常有用的。你可以在[这里][2]找到该规范。  + +``` +$ readelf -h /bin/ls +ELF Header: +  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 +  Class:                             ELF64 +  Data:                              2's complement, little endian +  Version:                           1 (current) +  OS/ABI:                            UNIX - System V +  ABI Version:                       0 +  Type:                              EXEC (Executable file) +  Machine:                           Advanced Micro Devices X86-64 +  Version:                           0x1 +  Entry point address:               0x4042d4 +  Start of program headers:          64 (bytes into file) +  Start of section headers:          115696 (bytes into file) +  Flags:                             0x0 +  Size of this header:               64 (bytes) +  Size of program headers:           56 (bytes) +  Number of program headers:         9 +  Size of section headers:           64 (bytes) +  Number of section headers:         31 +  Section header string table index: 30 +$ +``` + +### objdump + +它的作用:从对象文件中显示信息。 + +二进制文件是通过你编写的源码创建的,这些源码会通过一个叫做编译器的工具进行编译。这个编译器会生成相对于源代码的机器语言指令,然后由 CPU 执行特定的任务。这些机器语言代码可以通过被称为汇编语言的助记词来解读。汇编语言是一组指令,它可以帮助你理解由程序所进行并最终在 CPU 上执行的操作。 + +`objdump` 实用程序读取二进制或可执行文件,并将汇编语言指令转储到屏幕上。汇编语言知识对于理解 `objdump` 命令的输出至关重要。 + +请记住:汇编语言是特定于体系结构的。 + +``` +$ objdump -d /bin/ls | head + +/bin/ls: file format elf64-x86-64 + +Disassembly of section .init: + +0000000000402150 <_init@@Base>: + 402150: 48 83 ec 08 sub $0x8,%rsp + 402154: 48 8b 05 6d 8e 21 00 mov 0x218e6d(%rip),%rax # 61afc8 <__gmon_start__> + 40215b: 48 85 c0 test %rax,%rax +$ +``` + +### strace + +它的作用:跟踪系统调用和信号。 + +如果你用过前面提到的 `ltrace`,那就把 `strace` 想成是类似的。唯一的区别是,`strace` 工具不是追踪调用的库,而是追踪系统调用。系统调用是你与内核对接来完成工作的。 + +举个例子,如果你想把一些东西打印到屏幕上,你会使用标准库 `libc` 中的 `printf` 或 `puts` 函数;但是,在底层,最终会有一个名为 `write` 的系统调用来实际把东西打印到屏幕上。 + +``` +$ strace -f /bin/ls +execve("/bin/ls", ["/bin/ls"], [/* 17 vars */]) = 0 +brk(NULL) = 0x686000 +mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f967956a000 +access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) +open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 +fstat(3, {st_mode=S_IFREG|0644, st_size=40661, ...}) = 0 +mmap(NULL, 40661, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9679560000 +close(3) = 0 +<< snip >> +fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 +mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9679569000 +write(1, "R2 RH\n", 7R2 RH +) = 7 +close(1) = 0 +munmap(0x7f9679569000, 4096) = 0 +close(2) = 0 +exit_group(0) = ? ++++ exited with 0 +++ +$ +``` + +### nm + +它的作用:列出对象文件中的符号。 + +如果你所使用的二进制文件没有被剥离,`nm` 命令将为你提供在编译过程中嵌入到二进制文件中的有价值的信息。`nm` 可以帮助你从二进制文件中识别变量和函数。你可以想象一下,如果你无法访问二进制文件的源代码时,这将是多么有用。 + +为了展示 `nm`,我们快速编写了一个小程序,用 `-g` 选项编译,我们会看到这个二进制文件没有被剥离。 + +``` +$ cat hello.c +#include + +int main() { + printf("Hello world!"); + return 0; +} +$ +$ gcc -g hello.c -o hello +$ +$ file hello +hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=3de46c8efb98bce4ad525d3328121568ba3d8a5d, not stripped +$ +$ ./hello +Hello world!$ +$ + + +$ nm hello | tail +0000000000600e20 d __JCR_END__ +0000000000600e20 d __JCR_LIST__ +00000000004005b0 T __libc_csu_fini +0000000000400540 T __libc_csu_init + U __libc_start_main@@GLIBC_2.2.5 +000000000040051d T main + U printf@@GLIBC_2.2.5 +0000000000400490 t register_tm_clones +0000000000400430 T _start +0000000000601030 D __TMC_END__ +$ +``` + +### gdb + +它的作用:GNU 调试器。 + +好吧,不是所有的二进制文件中的东西都可以进行静态分析。我们确实执行了一些运行二进制文件(进行分析)的命令,比如 `ltrace` 和 `strace`;然而,软件由各种条件组成,这些条件可能会导致执行不同的替代路径。 + +分析这些路径的唯一方法是在运行时环境,在任何给定的位置停止或暂停程序,并能够分析信息,然后再往下执行。 + +这就是调试器的作用,在 Linux 上,`gdb` 就是调试器的事实标准。它可以帮助你加载程序,在特定的地方设置断点,分析内存和 CPU 的寄存器,以及更多的功能。它是对上面提到的其他工具的补充,可以让你做更多的运行时分析。 + +有一点需要注意的是,一旦你使用 `gdb` 加载一个程序,你会看到它自己的 `(gdb)` 提示符。所有进一步的命令都将在这个 `gdb` 命令提示符中运行,直到你退出。 + +我们将使用我们之前编译的 `hello` 程序,使用 `gdb` 来看看它的工作原理。 + +``` +$ gdb -q ./hello +Reading symbols from /home/flash/hello...done. +(gdb) break main +Breakpoint 1 at 0x400521: file hello.c, line 4. +(gdb) info break +Num Type Disp Enb Address What +1 breakpoint keep y 0x0000000000400521 in main at hello.c:4 +(gdb) run +Starting program: /home/flash/./hello + +Breakpoint 1, main () at hello.c:4 +4 printf("Hello world!"); +Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.6.x86_64 +(gdb) bt +#0 main () at hello.c:4 +(gdb) c +Continuing. +Hello world![Inferior 1 (process 29620) exited normally] +(gdb) q +$ +``` + +### 结语 + +一旦你习惯了使用这些原生的 Linux 二进制分析工具,并理解了它们提供的输出,你就可以转向更高级和专业的开源二进制分析工具,比如 [radare2][3]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/linux-binary-analysis + +作者:[Gaurav Kamathe][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/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tux_linux_penguin_code_binary.jpg?itok=TxGxW0KY (Tux with binary code background) +[2]: http://www.skyfree.org/linux/references/ELF_Format.pdf +[3]: https://github.com/radareorg/radare2 diff --git a/published/202005/20200430 Three Methods Boot CentOS-RHEL 7-8 Systems in Single User Mode.md b/published/202005/20200430 Three Methods Boot CentOS-RHEL 7-8 Systems in Single User Mode.md new file mode 100644 index 0000000000..4b7edb67e9 --- /dev/null +++ b/published/202005/20200430 Three Methods Boot CentOS-RHEL 7-8 Systems in Single User Mode.md @@ -0,0 +1,165 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12181-1.html) +[#]: subject: (Three Methods Boot CentOS/RHEL 7/8 Systems in Single User Mode) +[#]: via: (https://www.2daygeek.com/boot-centos-7-8-rhel-7-8-single-user-mode/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +以单用户模式启动 CentOS/RHEL 7/8 的三种方法 +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/03/230109uw1f9zvv9upbhwv8.jpg) + +单用户模式,也被称为维护模式,超级用户可以在此模式下恢复/修复系统问题。 + +通常情况下,这类问题在多用户环境中修复不了。系统可以启动但功能不能正常运行或者你登录不了系统。 + +在基于 [Red Hat][1](RHEL)7/8 的系统中,使用 `runlevel1.target` 或 `rescue.target` 来实现。 + +在此模式下,系统会挂载所有的本地文件系统,但不开启网络接口。 + +系统仅启动特定的几个服务和修复系统必要的尽可能少的功能。 + +当你想运行文件系统一致性检查来修复损坏的文件系统,或忘记 root 密码后重置密码,或要修复系统上的一个挂载点问题时,这个方法会很有用。 + +你可以用下面三种方法以单用户模式启动 [CentOS][2]/[RHEL][3] 7/8 系统。 + + * 方法 1:通过向内核添加 `rd.break` 参数来以单用户模式启动 CentOS/RHEL 7/8 系统 + * 方法 2:通过用 `init=/bin/bash` 或 `init=/bin/sh` 替换内核中的 `rhgb quiet` 语句来以单用户模式启动 CentOS/RHEL 7/8 系统 + * 方法 3:通过用 `rw init=/sysroot/bin/sh` 参数替换内核中的 `ro` 语句以单用户模式启动 CentOS/RHEL 7/8 系统 + +### 方法 1 + +通过向内核添加 `rd.break` 参数来以单用户模式启动 CentOS/RHEL 7/8 系统。 + +重启你的系统,在 GRUB2 启动界面,按下 `e` 键来编辑选中的内核。你需要选中第一行,第一个是最新的内核,然而如果你想用旧的内核启动系统你也可以选择其他的行。 + +![](https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-2.png) + +根据你的 RHEL/CentOS 版本,找到 `linux16` 或 `linux` 语句,按下键盘上的 `End` 键,跳到行末,像下面截图中展示的那样添加关键词 `rd.break`,按下 `Ctrl+x` 或 `F10` 来进入单用户模式。 + +如果你的系统是 RHEL/CentOS 7,你需要找 `linux16`,如果你的系统是 RHEL/CentOS 8,那么你需要找 `linux`。 + +![](https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-3.png) + +这个修改会让你的 root 文件系统以 “只读(`ro`)” 模式挂载。你可以用下面的命令来验证下。下面的输出也明确地告诉你当前是在 “紧急模式Emergency Mode”。 + +``` +# mount | grep root +``` + +![](https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-5.png) + +为了修改 `sysroot` 文件系统,你需要用读写模式(`rw`)重新挂载它。 + +``` +# mount -o remount,rw /sysroot +``` + +运行下面的命令修改环境,这就是大家熟知的 “监禁目录” 或 “chroot 监狱”。 + +``` +# chroot /sysroot +``` + +![](https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-8.png) + +现在,单用户模式已经完全准备好了。当你修复了你的问题要退出单用户模式时,执行下面的步骤。 + +CentOS/RHEL 7/8 默认使用 SELinux,因此创建下面的隐藏文件,这个文件会在下一次启动时重新标记所有文件。 + +``` +# touch /.autorelabel +``` + +最后,用下面的命令重启系统。你也可以输入两次 `exit` 命令来重启你的系统。 + +``` +# reboot -f +``` + +### 方法 2 + +通过用 `init=/bin/bash` 或 `init=/bin/sh` 替换内核中的 `rhgb quiet` 语句来以单用户模式启动 CentOS/RHEL 7/8 系统。 + +重启你的系统,在 GRUB2 启动界面,按下 `e` 键来编辑选中的内核。 + +![](https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-2.png) + +找到语句 `rhgb quiet`,用 `init=/bin/bash` 或 `init=/bin/sh` 替换它,然后按下 `Ctrl+x` 或 `F10` 来进入单用户模式。 + +`init=/bin/bash` 的截图。 + +![](https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-1.png) + +`init=/bin/sh` 的截图。 + +![](https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-1a.png) + +默认情况下,上面的操作会以只读(`ro`)模式挂载你的 `/` 分区,因此你需要以读写(`rw`)模式重新挂载 `/` 文件系统,这样才能修改它。 + +``` +# mount -o remount,rw / +``` + +![](https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-4.png) + +现在你可以执行你的任务了。当结束时,执行下面的命令来开启重启时的 SELinux 重新标记。 + +``` +# touch /.autorelabel +``` + +最后,重启系统。 + +``` +# exec /sbin/init 6 +``` + +### 方法 3 + +通过用 `rw init=/sysroot/bin/sh` 参数替换内核中的 `ro` 单词,以单用户模式启动 CentOS/RHEL 7/8 系统。 + +为了中断自动启动的过程,重启你的系统并在 GRUB2 启动界面按下任意键。 + +现在会展示你系统上所有可用的内核,选择最新的内核,按下 `e` 键来编辑选中的内核参数。 + +找到以 `linux` 或 `linux16` 开头的语句,用 `rw init=/sysroot/bin/sh` 替换 `ro`。替换完后按下 `Ctrl+x` 或 `F10` 来进入单用户模式。 + +运行下面的命令把环境切换为 “chroot 监狱”。 + +``` +# chroot /sysroot +``` + +如果需要,做出必要的修改。修改完后,执行下面的命令来开启重启时的 SELinux 重新标记。 + +``` +# touch /.autorelabel +``` + +最后,重启系统。 + +``` +# reboot -f +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/boot-centos-7-8-rhel-7-8-single-user-mode/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/category/red-hat/ +[2]: https://www.2daygeek.com/category/centos/ +[3]: https://www.2daygeek.com/category/rhel/ +[4]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 diff --git a/published/202005/20200501 How to Handle Automatic Updates in Ubuntu.md b/published/202005/20200501 How to Handle Automatic Updates in Ubuntu.md new file mode 100644 index 0000000000..4339c22494 --- /dev/null +++ b/published/202005/20200501 How to Handle Automatic Updates in Ubuntu.md @@ -0,0 +1,129 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12257-1.html) +[#]: subject: (How to Handle Automatic Updates in Ubuntu) +[#]: via: (https://itsfoss.com/auto-updates-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Ubuntu 中处理自动的无人值守升级 +====== + +> 本教程教你如何处理无人值守的升级,即 Ubuntu Linux 的自动系统更新。 + +![](https://img.linux.net.cn/data/attachment/album/202005/27/234040fxb0nkc53pk0nxvx.jpg) + +有时,当你尝试[关闭 Ubuntu 系统][1]时,可能看到这个阻止你关闭的页面: + +> 关机过程中正在进行无人值守升级,请不要关闭计算机。 + +![Unattended Upgrade In Progress In Ubuntu][2] + +你可能会问这个“无人值守升级”是什么,怎么会在你不知情的情况下运行呢? + +原因是 [Ubuntu][3] 非常重视系统的安全性。默认情况下,它会每天自动检查系统更新,如果发现安全更新,它会下载这些更新并自行安装。对于正常的系统和应用更新,它会通过软件更新程序通知你。 + +由于所有这些都是在后台发生的,所以在你尝试关闭系统或尝试自行安装应用程序之前,你甚至不会意识到这一点。 + +在这些无人值守的升级过程中,尝试安装新软件,会导致著名的[无法获得锁定的错误][4]。 + +![][5] + +如你所见,自动更新带来了一些小麻烦。你可以选择禁用自动更新,但这意味着你必须一直手动检查并[更新你的 Ubuntu 系统][6]。 + +> **你真的需要禁用自动更新吗?** +> +> 请注意,这是一项安全功能。Linux 实际上允许你禁用系统中的所有功能,甚至禁用这些安全功能。 +> +> 但是我认为,作为普通用户,**你不应该禁用自动更新**。毕竟,它可以确保你的系统安全。 +> +> 为了确保系统的安全性,你可以忍受自动更新所带来的小麻烦。 + +现在,你已经收到警告,还是觉得承担手动更新系统的额外任务更好,那么让我们看看如何处理自动更新。 + +与往常一样,有两种方法可以做到:GUI 和命令行。 我将向你展示两种方法。 + +我在这里使用 Ubuntu 20.04,但是这些步骤对 Ubuntu 18.04 和任何其他 Ubuntu 版本均有效。 + +### 方法 1:以图形方式禁用 Ubuntu 中的自动更新 + +进入菜单并查找“软件和更新”工具。 + +![Software & Updates Settings][7] + +在此处,进入“更新”选项卡。查找“自动检查更新”。默认情况下,它设置为“每日”。 + +你可以将其更改为“从不”,你的系统将永远不会检查更新。如果不检查更新,它就不会找到要安装的新的更新。 + +![Disable Auto Updates in Ubuntu Completely][8] + +如果这样做,那么必须不时手动更新系统。但是,这是额外的工作,你可能不会一直记得。 + +#### 在 Ubuntu 中处理自动更新的更好方法 + +就个人而言,我建议让它自己检查更新。如果你不希望它自动安装更新,那么可以更改该行为,以通知有关安全更新的可用性。 + +保持“自动检查更新”为“每日”,然后将“有安全更新时”选项更改为“立即显示”,而不是“自动下载并安装”。 + +![Get notified for security updates instead of automatically installing them][9] + +这样,它会检查是否有更新,而不是在后台自动安装更新,软件更新程序会通知你有可用于系统的更新。而你的系统已经完成正常的系统和软件更新。 + +![Get notified about security updates][10] + +使用此设置,关闭系统时将不会看到“正在进行的无人值守升级”。但是,由于两个不同的进程无法同时使用 apt 包管理器,因此你仍然可能会遇到“无法锁定”错误。 + +我相信这是一个更好的解决方案,你不认为是么? + +如我承诺的同时有 GUI 和命令行方法一样,让我向你展示如何在终端中禁用无人值守的升级。 + +### 如何在 Ubuntu 中使用命令行禁用自动更新 + +你可以在 `/etc/apt/apt.conf.d/20auto-upgrades` 中找到自动升级设置。Ubuntu 终端中的默认文本编辑器是 Nano,因此你可以使用以下命令来编辑此文件: + +``` +sudo nano /etc/apt/apt.conf.d/20auto-upgrades +``` + +现在,如果你不希望系统自动检查更新,那么可以将 `APT::Periodic::Update-Package-Lists` 的值更改为 `"0"`。 + +``` +APT::Periodic::Update-Package-Lists "0"; +APT::Periodic::Unattended-Upgrade "0"; +``` + +如果你希望它检查更新但不自动安装无人值守的升级,那么可以选择将其设置为: + +``` +APT::Periodic::Update-Package-Lists "1"; +APT::Periodic::Unattended-Upgrade "0"; +``` + +### 最后 + +由于某种原因,启用了自动安全更新,建议你保持这种状态。这个小烦恼实际上并不值得冒险损害系统安全性。你怎么看? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/auto-updates-ubuntu/ + +作者:[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/schedule-shutdown-ubuntu/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/unattended-upgrade-in-progress-in-ubuntu.png?ssl=1 +[3]: https://ubuntu.com/ +[4]: https://itsfoss.com/could-not-get-lock-error/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/Could_not_get_lock.jpg?ssl=1 +[6]: https://itsfoss.com/update-ubuntu/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-updates-settings-ubuntu-20-04.jpg?ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/disable-auto-updates-ubuntu.jpg?ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/handle-auto-updates-ubuntu.jpg?ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/updates-available-ubuntu.png?ssl=1 diff --git a/published/202005/20200501 Using mergerfs to increase your virtual storage.md b/published/202005/20200501 Using mergerfs to increase your virtual storage.md new file mode 100644 index 0000000000..de9b8af2c7 --- /dev/null +++ b/published/202005/20200501 Using mergerfs to increase your virtual storage.md @@ -0,0 +1,143 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12207-1.html) +[#]: subject: (Using mergerfs to increase your virtual storage) +[#]: via: (https://fedoramagazine.org/using-mergerfs-to-increase-your-virtual-storage/) +[#]: author: (Curt Warfield https://fedoramagazine.org/author/rcurtiswarfield/) + +使用 mergefs 增加虚拟存储 +====== + +![][1] + +如果你想在一个媒体项目中用到了多个磁盘或分区,不想丢失任何现有数据,但又想将所有文件都存放在一个驱动器下,该怎么办?这时,mergefs 就能派上用场! + +[mergerfs][2] 是一个联合文件系统,旨在简化存储和管理众多商业存储设备上的文件。 + +你需要从他们的 [GitHub][3] 页面获取最新的 RPM。Fedora 的版本名称中带有 “fc” 和版本号。例如,这是 Fedora 31 的版本: [mergerfs-2.29.0-1.fc31.x86_64.rpm][4]。 + +### 安装和配置 mergefs + +使用 `sudo` 安装已下载的 mergefs 软件包: + +``` +$ sudo dnf install mergerfs-2.29.0-1.fc31.x86_64.rpm +``` + +现在,你可以将多个磁盘挂载为一个驱动器。如果你有一台媒体服务器,并且希望所有媒体文件都显示在一个地方,这将很方便。如果将新文件上传到系统,那么可以将它们复制到 mergefs 目录,mergefs 会自动将它们复制具有足够可用空间的磁盘上。 + +这是使你更容易理解的例子: + +``` +$ df -hT | grep disk +/dev/sdb1 ext4 23M 386K 21M 2% /disk1 +/dev/sdc1 ext4 44M 1.1M 40M 3% /disk2 + +$ ls -l /disk1/Videos/ +total 1 +-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv + +$ ls -l /disk2/Videos/ +total 2 +-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv +-rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv +``` + +在此例中挂载了两块磁盘,分别为 `disk1` 和 `disk2`。两个驱动器都有一个包含文件的 `Videos` 目录。 + +现在,我们将使用 mergefs 挂载这些驱动器,使它们看起来像一个更大的驱动器。 + +``` +$ sudo mergerfs -o defaults,allow_other,use_ino,category.create=mfs,moveonenospc=true,minfreespace=1M /disk1:/disk2 /media +``` + +mergefs 手册页非常庞杂,因此我们将说明上面提到的选项。 + + * `defaults`:除非指定,否则将使用默认设置。 + * `allow_other`:允许 `sudo` 或 `root` 以外的用户查看文件系统。 + * `use_ino`:让 mergefs 提供文件/目录 inode 而不是 libfuse。虽然不是默认值,但建议你启用它,以便链接的文件共享相同的 inode 值。 + * `category.create=mfs`:根据可用空间在驱动器间传播文件。 + * `moveonenospc=true`:如果启用,那么如果写入失败,将进行扫描以查找具有最大可用空间的驱动器。 + * `minfreespace=1M`:最小使用空间值。 + * `disk1`:第一块硬盘。 + * `disk2`:第二块硬盘。 + * `/media`:挂载驱动器的目录。 + +看起来是这样的: + +``` +$ df -hT | grep disk +/dev/sdb1 ext4 23M 386K 21M 2% /disk1 +/dev/sdc1 ext4 44M 1.1M 40M 3% /disk2 + +$ df -hT | grep media +1:2 fuse.mergerfs 66M 1.4M 60M 3% /media +``` + +你可以看到现在 mergefs 挂载显示的总容量为 66M,这是两块硬盘的总容量。 + +继续示例: + +有一个叫 `Baby's second Xmas.mkv` 的 30M 视频。让我们将其复制到用 mergerfs 挂载的 `/media` 文件夹中。 + +``` +$ ls -lh "Baby's second Xmas.mkv" +-rw-rw-r--. 1 curt curt 30M Apr 20 08:45 Baby's second Xmas.mkv +$ cp "Baby's second Xmas.mkv" /media/Videos/ +``` + +这是最终结果: + +``` +$ df -hT | grep disk +/dev/sdb1 ext4 23M 386K 21M 2% /disk1 +/dev/sdc1 ext4 44M 31M 9.8M 76% /disk2 + +$ df -hT | grep media +1:2 fuse.mergerfs 66M 31M 30M 51% /media +``` + +从磁盘空间利用率中可以看到,因为 `disk1` 没有足够的可用空间,所以 mergefs 自动将文件复制到 `disk2`。 + +这是所有文件详情: + +``` +$ ls -l /disk1/Videos/ +total 1 +-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv + +$ ls -l /disk2/Videos/ +total 30003 +-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv +-rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 Baby's second Xmas.mkv +-rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv + +$ ls -l /media/Videos/ +total 30004 +-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv +-rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 Baby's second Xmas.mkv +-rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv +-rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv +``` + +当你将文件复制到 mergefs 挂载点时,它将始终将文件复制到有足够可用空间的硬盘上。如果池中的所有驱动器都没有足够的可用空间,那么你将无法复制它们。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/using-mergerfs-to-increase-your-virtual-storage/ + +作者:[Curt Warfield][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/rcurtiswarfield/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/04/mergerfs-816x346.png +[2]: https://github.com/trapexit/mergerfs +[3]: https://github.com/trapexit/mergerfs/releases +[4]: https://github.com/trapexit/mergerfs/releases/download/2.29.0/mergerfs-2.29.0-1.fc31.x86_64.rpm diff --git a/published/202005/20200502 Mid-stack inlining in Go.md b/published/202005/20200502 Mid-stack inlining in Go.md new file mode 100644 index 0000000000..588286626a --- /dev/null +++ b/published/202005/20200502 Mid-stack inlining in Go.md @@ -0,0 +1,208 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12184-1.html) +[#]: subject: (Mid-stack inlining in Go) +[#]: via: (https://dave.cheney.net/2020/05/02/mid-stack-inlining-in-go) +[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) + +Go 中对栈中函数进行内联 +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/04/230304avxkxlyoozbiw1bn.jpg) + +[上一篇文章][1]中我论述了叶子内联leaf inlining是怎样让 Go 编译器减少函数调用的开销的,以及延伸出了跨函数边界的优化的机会。本文中,我要论述内联的限制以及叶子内联与栈中内联mid-stack inlining的对比。 + +### 内联的限制 + +把函数内联到它的调用处消除了调用的开销,为编译器进行其他的优化提供了更好的机会,那么问题来了,既然内联这么好,内联得越多开销就越少,*为什么不尽可能多地内联呢?* + +内联可能会以增加程序大小换来更快的执行时间。限制内联的最主要原因是,创建许多函数的内联副本会增加编译时间,并导致生成更大的二进制文件的边际效应。即使把内联带来的进一步的优化机会考虑在内,太激进的内联也可能会增加生成的二进制文件的大小和编译时间。 + +内联收益最大的是[小函数][2],相对于调用它们的开销来说,这些函数做很少的工作。随着函数大小的增长,函数内部做的工作与函数调用的开销相比省下的时间越来越少。函数越大通常越复杂,因此优化其内联形式相对于原地优化的好处会减少。 + +### 内联预算 + +在编译过程中,每个函数的内联能力是用*内联预算*计算的 [^1]。开销的计算过程可以巧妙地内化,像一元和二元等简单操作,在抽象语法数Abstract Syntax Tree(AST)中通常是每个节点一个单位,更复杂的操作如 `make` 可能单位更多。考虑下面的例子: + +```go +package main + +func small() string { + s := "hello, " + "world!" + return s +} + +func large() string { + s := "a" + s += "b" + s += "c" + s += "d" + s += "e" + s += "f" + s += "g" + s += "h" + s += "i" + s += "j" + s += "k" + s += "l" + s += "m" + s += "n" + s += "o" + s += "p" + s += "q" + s += "r" + s += "s" + s += "t" + s += "u" + s += "v" + s += "w" + s += "x" + s += "y" + s += "z" + return s +} + +func main() { + small() + large() +} +``` + +使用 `-gcflags=-m=2` 参数编译这个函数能让我们看到编译器分配给每个函数的开销: + +```bash +% go build -gcflags=-m=2 inl.go +# command-line-arguments +./inl.go:3:6: can inline small with cost 7 as: func() string { s := "hello, world!"; return s } +./inl.go:8:6: cannot inline large: function too complex: cost 82 exceeds budget 80 +./inl.go:38:6: can inline main with cost 68 as: func() { small(); large() } +./inl.go:39:7: inlining call to small func() string { s := "hello, world!"; return s } +``` + +编译器根据函数 `func small()` 的开销(7)决定可以对它内联,而 `func large()` 的开销太大,编译器决定不进行内联。`func main()` 被标记为适合内联的,分配了 68 的开销;其中 `small` 占用 7,调用 `small` 函数占用 57,剩余的(4)是它自己的开销。 + +可以用 `-gcflag=-l` 参数控制内联预算的等级。下面是可使用的值: + + * `-gcflags=-l=0` 默认的内联等级。 + * `-gcflags=-l`(或 `-gcflags=-l=1`)取消内联。 + * `-gcflags=-l=2` 和 `-gcflags=-l=3` 现在已经不使用了。和 `-gcflags=-l=0` 相比没有区别。 + * `-gcflags=-l=4` 减少非叶子函数和通过接口调用的函数的开销。[^2] + +#### 不确定语句的优化 + +一些函数虽然内联的开销很小,但由于太复杂它们仍不适合进行内联。这就是函数的不确定性,因为一些操作的语义在内联后很难去推导,如 `recover`、`break`。其他的操作,如 `select` 和 `go` 涉及运行时的协调,因此内联后引入的额外的开销不能抵消内联带来的收益。 + +不确定的语句也包括 `for` 和 `range`,这些语句不一定开销很大,但目前为止还没有对它们进行优化。 + +### 栈中函数优化 + +在过去,Go 编译器只对叶子函数进行内联 —— 只有那些不调用其他函数的函数才有资格。在上一段不确定的语句的探讨内容中,一次函数调用就会让这个函数失去内联的资格。 + +进入栈中进行内联,就像它的名字一样,能内联在函数调用栈中间的函数,不需要先让它下面的所有的函数都被标记为有资格内联的。栈中内联是 David Lazar 在 Go 1.9 中引入的,并在随后的版本中做了改进。[这篇文稿][5]深入探究了保留栈追踪行为和被深度内联后的代码路径里的 `runtime.Callers` 的难点。 + +在前面的例子中我们看到了栈中函数内联。内联后,`func main()` 包含了 `func small()` 的函数体和对 `func large()` 的一次调用,因此它被判定为非叶子函数。在过去,这会阻止它被继续内联,虽然它的联合开销小于内联预算。 + +栈中内联的最主要的应用案例就是减少贯穿函数调用栈的开销。考虑下面的例子: + +```go +package main + +import ( + "fmt" + "strconv" +) + +type Rectangle struct {} + +//go:noinline +func (r *Rectangle) Height() int { + h, _ := strconv.ParseInt("7", 10, 0) + return int(h) +} + +func (r *Rectangle) Width() int { + return 6 +} + +func (r *Rectangle) Area() int { return r.Height() * r.Width() } + +func main() { + var r Rectangle + fmt.Println(r.Area()) +} +``` + +在这个例子中, `r.Area()` 是个简单的函数,调用了两个函数。`r.Width()` 可以被内联,`r.Height()` 这里用 `//go:noinline` 指令标注了,不能被内联。[^3] + +```bash +% go build -gcflags='-m=2' square.go +# command-line-arguments +./square.go:12:6: cannot inline (*Rectangle).Height: marked go:noinline +./square.go:17:6: can inline (*Rectangle).Width with cost 2 as: method(*Rectangle) func() int { return 6 } +./square.go:21:6: can inline (*Rectangle).Area with cost 67 as: method(*Rectangle) func() int { return r.Height() * r.Width() } +./square.go:21:61: inlining call to (*Rectangle).Width method(*Rectangle) func() int { return 6 } +./square.go:23:6: cannot inline main: function too complex: cost 150 exceeds budget 80 +./square.go:25:20: inlining call to (*Rectangle).Area method(*Rectangle) func() int { return r.Height() * r.Width() } +./square.go:25:20: inlining call to (*Rectangle).Width method(*Rectangle) func() int { return 6 } +``` + +由于 `r.Area()` 中的乘法与调用它的开销相比并不大,因此内联它的表达式是纯收益,即使它的调用的下游 `r.Height()` 仍是没有内联资格的。 + +#### 快速路径内联 + +关于栈中内联的效果最令人吃惊的例子是 2019 年 [Carlo Alberto Ferraris][7] 通过允许把 `sync.Mutex.Lock()` 的快速路径(非竞争的情况)内联到它的调用方来[提升它的性能][7]。在这个修改之前,`sync.Mutex.Lock()` 是个很大的函数,包含很多难以理解的条件,使得它没有资格被内联。即使锁可用时,调用者也要付出调用 `sync.Mutex.Lock()` 的代价。 + +Carlo 把 `sync.Mutex.Lock()` 分成了两个函数(他自己称为外联outlining)。外部的 `sync.Mutex.Lock()` 方法现在调用 `sync/atomic.CompareAndSwapInt32()` 且如果 CAS(比较并交换Compare and Swap)成功了之后立即返回给调用者。如果 CAS 失败,函数会走到 `sync.Mutex.lockSlow()` 慢速路径,需要对锁进行注册,暂停 goroutine。[^4] + +```bash +% go build -gcflags='-m=2 -l=0' sync 2>&1 | grep '(*Mutex).Lock' +../go/src/sync/mutex.go:72:6: can inline (*Mutex).Lock with cost 69 as: method(*Mutex) func() { if "sync/atomic".CompareAndSwapInt32(&m.state, 0, mutexLocked) { if race.Enabled { }; return }; m.lockSlow() } +``` + +通过把函数分割成一个简单的不能再被分割的外部函数,和(如果没走到外部函数就走到的)一个处理慢速路径的复杂的内部函数,Carlo 组合了栈中函数内联和[编译器对基础操作的支持][9],减少了非竞争锁 14% 的开销。之后他在 `sync.RWMutex.Unlock()` 重复这个技巧,节省了另外 9% 的开销。 + +[^1]: 不同发布版本中,在考虑该函数是否适合内联时,Go 编译器对同一函数的预算是不同的。 +[^2]: 时刻记着编译器的作者警告过[“更高的内联等级(比 -l 更高)可能导致错误或不被支持”][11]。 Caveat emptor。 +[^3]: 编译器有足够的能力来内联像 `strconv.ParseInt` 的复杂函数。作为一个实验,你可以尝试去掉 `//go:noinline` 注释,使用 `-gcflags=-m=2` 编译后观察。 +[^4]: `race.Enable` 表达式是通过传递给 `go` 工具的 `-race` 参数控制的一个常量。对于普通编译,它的值是 `false`,此时编译器可以完全省略代码路径。 + +### 相关文章: + + 1. [Go 中的内联优化][15] + 2. [goroutine 的栈为什么会无限增长?][16] + 3. [栈追踪和 errors 包][17] + 4. [零值是什么,为什么它很有用?][18] + +-------------------------------------------------------------------------------- + +via: https://dave.cheney.net/2020/05/02/mid-stack-inlining-in-go + +作者:[Dave Cheney][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://dave.cheney.net/author/davecheney +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-12176-1.html +[2]: https://medium.com/@joshsaintjacque/small-functions-considered-awesome-c95b3fd1812f +[3]: tmp.FyRthF1bbF#easy-footnote-bottom-1-4076 (The budget the Go compiler applies to each function when considering if it is eligible for inlining changes release to release.) +[4]: tmp.FyRthF1bbF#easy-footnote-bottom-2-4076 (Keep in mind that the compiler authors warn that “Additional levels of inlining (beyond -l) may be buggy and are not supported”. Caveat emptor.) +[5]: https://docs.google.com/presentation/d/1Wcblp3jpfeKwA0Y4FOmj63PW52M_qmNqlQkNaLj0P5o/edit#slide=id.p +[6]: tmp.FyRthF1bbF#easy-footnote-bottom-3-4076 (The compiler is powerful enough that it can inline complex functions like strconv.ParseInt. As a experiment, try removing the //go:noinline annotation and observe the result with -gcflags=-m=2.) +[7]: https://go-review.googlesource.com/c/go/+/148959 +[8]: tmp.FyRthF1bbF#easy-footnote-bottom-4-4076 (The expression race.Enable is a constant controlled by the -race flag passed to the go tool. It is false for normal builds which allows the compiler to elide those code paths entirely.) +[9]: https://dave.cheney.net/2019/08/20/go-compiler-intrinsics +[10]: tmp.FyRthF1bbF#easy-footnote-1-4076 +[11]: https://github.com/golang/go/blob/be08e10b3bc07f3a4e7b27f44d53d582e15fd6c7/src/cmd/compile/internal/gc/inl.go#L11 +[12]: tmp.FyRthF1bbF#easy-footnote-2-4076 +[13]: tmp.FyRthF1bbF#easy-footnote-3-4076 +[14]: tmp.FyRthF1bbF#easy-footnote-4-4076 +[15]: https://dave.cheney.net/2020/04/25/inlining-optimisations-in-go (Inlining optimisations in Go) +[16]: https://dave.cheney.net/2013/06/02/why-is-a-goroutines-stack-infinite (Why is a Goroutine’s stack infinite ?) +[17]: https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package (Stack traces and the errors package) +[18]: https://dave.cheney.net/2013/01/19/what-is-the-zero-value-and-why-is-it-useful (What is the zero value, and why is it useful?) diff --git a/published/202005/20200502 Pop OS 20.04 Review- Best Ubuntu-based Distribution Just Got Better.md b/published/202005/20200502 Pop OS 20.04 Review- Best Ubuntu-based Distribution Just Got Better.md new file mode 100644 index 0000000000..731c14fa0b --- /dev/null +++ b/published/202005/20200502 Pop OS 20.04 Review- Best Ubuntu-based Distribution Just Got Better.md @@ -0,0 +1,228 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12175-1.html) +[#]: subject: (Pop OS 20.04 Review: Best Ubuntu-based Distribution Just Got Better) +[#]: via: (https://itsfoss.com/pop-os-20-04-review/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Pop!_OS 20.04 点评:最好的基于 Ubuntu 的发行版越来越好了 +====== + +> Pop!_OS 20.04 是一款令人印象深刻的基于 Ubuntu 的 Linux 发行版。我在这篇评论中回顾了其主要的新功能,并分享了我对最新版本的体验。 + +现在,Ubuntu 20.04 LTS 及其官方变体版本已经发布了 - 是时候看看 [System76][1] 的 Pop!_OS 20.04 了,这是基于 Ubuntu 的最好的发行版之一。 + +老实说,Pop!_OS 是我最喜欢的 Linux 发行版,主要用于我做的所有事情。 + +现在,Pop!_OS 20.04 终于来了。是时候来看看它提供了哪些功能,以及你是否应该升级? + +### Pop!_OS 20.04 LTS 中有什么新东西? + +![][2] + +从视觉上看,Pop!\_OS 20.04 LTS 与 Pop!\_OS 19.10 并没有太大的区别。然而,你可以发现几个新功能和改进。 + +但是,如果你之前使用的是 Pop!_OS 18.04 LTS,则可以发现有很多东西可以尝试。 + +随着 [GNOME 3.36][3] 的到来,及其带来的一些新功能,Pop!_OS 20.04 成为了一个令人激动的版本。 + +总的来说,以下是一些主要的亮点。 + + * 自动窗口平铺 + * 新的应用程序切换器和启动器 + * 在 Pop!_Shop 中增加了对 Flatpack 的支持。 + * GNOME 3.36 + * Linux 内核 5.4 + * 改进的混合图形支持 + +虽然听起来很有趣,但我们还是来了解一下详细的变化,以及到目前为止 Pop!_OS 20.04 的体验如何。 + +#### Pop!_OS 20.04 中的用户体验提升 + +毫无疑问,很多 Linux 发行版都提供了开箱即用的用户体验。同样的,[Ubuntu 20.04 LTS 也有一流的改进和功能][4]。 + +而对于 System76 的 Pop!_OS,他们总是试图更进一步。并且,大多数新功能旨在通过提供有用的功能来改善用户体验。 + +在这里,我将介绍一些改进,其中包括 [GNOME 3.36][3] 和 Pop!_OS 特有的一些功能。 + +#### 支持系统托盘图标 + +总算是有了!这可能不是什么大的改变 —— 但 Pop!_OS 以前没有支持系统托盘图标(或小程序图标)。 + +![][5] + +随着 20.04 LTS 的发布,默认情况就有了系统托盘,不需要任何扩展。 + +依靠系统托盘图标的程序可能并不多 —— 但它仍然是重要的东西。 + +就我而言,我以前无法在 Pop!_OS 19.10 上使用 [ActivityWatch][6] —— 但现在可以了。 + +#### 自动窗口平铺 + +![][7] + +自动窗口平铺是我一直想尝试的东西 —— 但从来没花时间使用过 [i3][9] 这样的[平铺窗口管理器][8]来设置它,更别说是 [Regolith 桌面][10]了。 + +在 Pop!_OS 20.04 中,你就不需要这样做了。自动窗口平铺功能已经内置,无需设置。 + +它还提供了“显示活动提示”的选项,也就是说,它将高亮显示活动窗口以避免混淆。而且,你还可以调整窗口之间的间隙。 + +![][11] + +你可以在他们的官方视频中看到它是如何工作的: + +- [System76 Pop!_OS 20.04 - Auto Tiling](https://youtu.be/-fltwBKsMY0) + +而且,我得说,这是 Pop!_OS 20.04 上最大的新增功能之一,有可能帮助你更有效地进行多任务处理。 + +即使每次使用该功能都很方便,但为了最大程度地利用它,最好是使用一个大于 21 英寸的显示屏(至少)! 而且,因为这个原因 —— 我真的很想把我的显示器也升级一下! + +#### 新的扩展应用 + +![][13] + +Pop!_OS 内置了一些独特的 GNOME 扩展。但是,你不需要用 GNOME Tweaks 来管理扩展。 + +新增加的 “Extensions” 应用可以让你在 Pop!_OS 20.04 上配置和管理扩展程序。 + +#### 改进的通知中心 + +![][14] + +在新的 GNOME 3.36 中,通知中心的外观经过了改进。这里,我启用了黑暗模式。 + +#### 新的应用程序切换器 & 启动器 + +![][15] + +你仍然可以用 `ALT+TAB` 或 `Super+TAB` 来浏览正在运行的应用程序。 + +但是,当你有很多事情要做的时候,这很耗时。所以,在 Pop!_OS 20.04上,你可以使用 `Super+ /` 激活应用程序切换器和启动器。 + +一旦你习惯了这个快捷键,它将是非常方便的东西。 + +除此以外,你可能会发现 Pop!_OS 20.04 上的图标/窗口在视觉上有许多其它细微的改进。 + +#### 新的登录界面 + +嗯,这是 GNOME 3.36 带来的一个明显的变化。但是,它看起来确实很不错! + +![][16] + +#### Pop!_Shop 支持 Flatpak + +通常,Pop!_Shop 已经是一个非常有用的东西了,包括它自有的在内,它带有一个巨大的软件仓库。 + +现在,在 Pop!\_OS 20.04 中,你可以用 Pop!_Shop 安装任何可用软件的 Debian 包或 Flatpak(通过 Flathub) —— 当然,前提是某个软件有 Flatpak 软件包。 + +如果你没有使用 Pop!_OS 20.04,你可能要看看[如何在 Linux 上使用 Flatpak][18]。 + +![][19] + +就我个人而言,我并不是 Flatpak 的粉丝,但有些应用如 GIMP 需要你安装 Flatpak 包才能获得最新版本。所以,在 Pop!_Shop 上直接支持了 Flatpak 绝对是一件好事。 + +#### 键盘快捷键更改 + +如果你习惯了 Pop!_OS 19.10 或更早的版本上现有的键盘快捷键,这可能会让你很烦。 + +不管是哪种情况,有几个重要的键盘快捷键变化可能会改善你的体验,如下: + + * 锁定屏幕:`Super + L` 改为 `Super + Escape`。 + * 移动工作区:`Super + 上/下箭头键` 改为 `Super + CTRL + 上/下箭头键`。 + * 关闭窗口:`Super + W` 变更为 `Super + Q`。 + * 切换最大化:`Super +向上箭头` 改为 `Super + M`。 + +#### Linux 内核 5.4 + +与其他大多数最新的 Linux 发行版相似,Pop!_OS 20.04 搭载了 [Linux 内核 5.4][20]。 + +所以,很明显,你可以期望获得对 [exFAT 支持][21]、改进的 AMD 图形兼容性以及它附带所有其他功能。 + +#### 性能提升 + +尽管 Pop!_OS 并不称自己是轻量级的 Linux 发行版,但它仍然是一个资源节约型的发行版。而且,有了 GNOME 3.36 的支持,它的速度应该足够快了。 + +考虑到我已经将 Pop!\_OS 作为主要发行版使用已经一年多了,我从来没有遇到过性能问题。这就是你安装了 Pop!_OS 20.04 之后的资源使用情况(取决于你的系统配置)。 + +![][22] + +给你一个作为参考,我的台式机配置包括 i5-7400 处理器、16GB 内存(2400MHz)、NVIDIA GTX 1050ti 显卡和 SSD。 + +我不是一个系统基准测试的忠实拥护者,因为除非你去尝试,否则它并不能让你知道特定的应用或游戏的性能。 + +你可以试试 [Phoronix 测试套件][23]来分析你的系统表现。但是,Pop!_OS 20.04 LTS 应该是一个很爽快的体验! + +#### 软件包更新 & 其他改进 + +尽管每个基于Ubuntu的发行版都受益于Ubuntu 20.04 LTS的改进,但也有一些 Pop!_OS 特有的错误修复和改进。 + +除此之外,一些主要的应用程序/包(如 Firefox 75.0)也已经更新到了最新版本。 + +到现在为止,应该没有任何严重的错误,至少对我来说没有。 + +你可以在 [GitHub 上查看他们的开发进度][24],以了解他们在测试期间已经修复的问题和发布后即将修复的问题。 + +### 下载 & 支持 Pop!_OS 20.04 + +![][25] + +在这个版本中,System76 终于增加了一个可选的订阅模式来支持 Pop!_OS 的开发。 + +你可以免费下载 Pop!_OS 20.04 —— 但如果你想支持他们,我建议你只需要 \$1/月就可以订阅。 + +- [Pop!_OS 20.04][26] + +### 我对 Pop OS 20.04 的看法 + +我必须提到的是,我正在为最新的 20.04 版本提供全新的墙纸。但是,这没什么大不了的。 + +有了窗口平铺功能、支持 flatpak,以及众多其他改进,到目前为止,我对 Pop!_OS 20.04 的体验是一流的。另外,很高兴看到他们在一些流行软件的开箱即用支持上突出了他们对创意专业人士的关注。 + +![][27] + +Ubuntu 20.04 的所有优点,再加上 System76 的一些额外的加料,让我印象深刻! + +你试过 Pop!_OS 20.04 吗?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/pop-os-20-04-review/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://system76.com +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/pop_os_20_04_review.jpg?ssl=1 +[3]: https://itsfoss.com/gnome-3-36-release/ +[4]: https://itsfoss.com/ubuntu-20-04-release-features/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/system-tray-icons-pop-os.jpg?ssl=1 +[6]: https://activitywatch.net/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/pop-os-automatic-screen-tiling.png?ssl=1 +[8]: https://en.wikipedia.org/wiki/Tiling_window_manager +[9]: https://i3wm.org/ +[10]: https://itsfoss.com/regolith-linux-desktop/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/tile-feature-options-popos.jpg?ssl=1 +[12]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/pop-os-extensions.jpg?ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/notification-center-pop-os.jpg?ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/pop-os-application-launcher.jpg?ssl=1 +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/pop-os-20-04-lock-screen.jpg?ssl=1 +[17]: https://launchpad.net/~system76/+archive/ubuntu/pop +[18]: https://itsfoss.com/flatpak-guide/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/pop-os-flatpak-deb.jpg?ssl=1 +[20]: https://itsfoss.com/linux-kernel-5-4/ +[21]: https://itsfoss.com/mount-exfat/ +[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/pop-os-20-04-performance.jpg?ssl=1 +[23]: https://www.phoronix-test-suite.com/ +[24]: https://github.com/orgs/pop-os/projects/13 +[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/support-pop-os.jpg?ssl=1 +[26]: https://pop.system76.com/ +[27]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/pop-os-stem-focus.jpg?ssl=1 diff --git a/published/202005/20200504 4 cool new projects to try in COPR for May 2020.md b/published/202005/20200504 4 cool new projects to try in COPR for May 2020.md new file mode 100644 index 0000000000..9a63887910 --- /dev/null +++ b/published/202005/20200504 4 cool new projects to try in COPR for May 2020.md @@ -0,0 +1,108 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12230-1.html) +[#]: subject: (4 cool new projects to try in COPR for May 2020) +[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-april-2020/) +[#]: author: (Dominik Turecek https://fedoramagazine.org/author/dturecek/) + +COPR 仓库中 4 个很酷的新项目(2020.05) +====== + +![][1] + +COPR 是个人软件仓库[集合][2],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。 + +本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 [COPR 用户文档][3]。 + +### Ytop + +[ytop][4] 是类似于 `htop` 的命令行系统监视器。它们之间的主要区别是,`ytop` 在显示进程及其 CPU 和内存使用率的顶部显示了系统的 CPU、内存和网络使用率随时间变化的图表。此外,`ytop` 还显示磁盘使用情况和计算机温度。最后,`ytop` 支持多种配色方案以及创建新配色的选项。 + +![][5] + +#### 安装说明 + +[该仓库][6]当前为 Fedora 30、31、32 和 Rawhide 以及 EPEL 7 提供了 `ytop`。要安装 `ytop`,请[带上 sudo][7] 使用以下命令: + +``` +sudo dnf copr enable atim/ytop +sudo dnf install ytop +``` + +### Ctop + +[ctop][8] 是另一个命令行系统监视器。但是,与 `htop` 和 `ytop` 不同,`ctop` 专注于显示容器的资源使用情况。`ctop` 同时显示计算机上运行的所有容器的 CPU、内存、网络和磁盘使用情况的概要,以及单个容器的更全面的信息,包括一段时间内资源使用情况的图表。当前,`ctop` 支持 Docker 和 runc 容器。 + +![][9] + +#### 安装说明 + +[该仓库][10]当前为 Fedora 31、32 和 Rawhide 以及 EPEL 7 还有其他发行版提供了安装包。要安装 `ctop`,请使用以下命令: + +``` +sudo dnf copr enable fuhrmann/ctop +sudo dnf install ctop +``` + +### Shortwave + +[shortwave][11] 是用于收听广播电台的程序。`shortwave` 使用广播电台的社区数据库 [www.radio-browser.info][12]。在此数据库中,你可以发现或搜索广播电台,将它们添加到库中,然后收听。此外,`shortwave` 还提供有关当前播放歌曲的信息,并且还可以记录这些歌曲。 + +![][13] + +#### 安装说明 + +[该仓库][14] 当前为 Fedora 31、32 和 Rawhide 提供了 shortwave。要安装 `shortwave`,请使用以下命令: + +``` +sudo dnf copr enable atim/shortwave +sudo dnf install shortwave +``` + +### Setzer + +[setzer][15] 是 LaTeX 编辑器,它可以构建 pdf 文档并查看它们。它提供了各种类型文档(例如文章或幻灯片)的模板。此外,`setzer` 还有许多特殊符号、数学符号和希腊字母的按钮。 + +![][16] + +#### 安装说明 + +[该仓库][17] 当前为 Fedora 30、31、32 和 Rawhide 提供了 `setzer`。要安装 `setzer`,请使用以下命令: + +``` +sudo dnf copr enable lyessaadi/setzer +sudo dnf install setzer +``` + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-april-2020/ + +作者:[Dominik Turecek][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/dturecek/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2017/08/4-copr-945x400.jpg +[2]: https://copr.fedorainfracloud.org/ +[3]: https://docs.pagure.org/copr.copr/user_documentation.html# +[4]: https://github.com/cjbassi/ytop +[5]: https://fedoramagazine.org/wp-content/uploads/2020/04/ytop.png +[6]: https://copr.fedorainfracloud.org/coprs/atim/ytop/ +[7]: https://fedoramagazine.org/howto-use-sudo/ +[8]: https://github.com/bcicen/ctop +[9]: https://fedoramagazine.org/wp-content/uploads/2020/04/ctop.png +[10]: https://copr.fedorainfracloud.org/coprs/fuhrmann/ctop/ +[11]: https://github.com/ranfdev/shortwave +[12]: http://www.radio-browser.info/gui/#!/ +[13]: https://fedoramagazine.org/wp-content/uploads/2020/04/shortwave.png +[14]: https://copr.fedorainfracloud.org/coprs/atim/shortwave/ +[15]: https://www.cvfosammmm.org/setzer/ +[16]: https://fedoramagazine.org/wp-content/uploads/2020/04/setzer.png +[17]: https://copr.fedorainfracloud.org/coprs/lyessaadi/setzer/ diff --git a/published/202005/20200505 Browse the Peer-to-peer Web With Beaker Browser.md b/published/202005/20200505 Browse the Peer-to-peer Web With Beaker Browser.md new file mode 100644 index 0000000000..701d66156e --- /dev/null +++ b/published/202005/20200505 Browse the Peer-to-peer Web With Beaker Browser.md @@ -0,0 +1,124 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12203-1.html) +[#]: subject: (Browse the Peer-to-peer Web With Beaker Browser) +[#]: via: (https://itsfoss.com/beaker-browser/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +使用 Beaker 浏览器浏览对等 Web +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/10/082745ztmi4kqh4iq449ll.jpg) + +在过去 50 年中,我们所了解的互联网没有什么变化,全球的网民使用他们的设备从遍布在世界各地的服务器上检索数据。 + +一群专业的技术专家想改变现状,使互联网变成人们可以连接和直接分享信息的地方,而不是依赖一个中心服务器(去中心化)。 + +我们已经在 It’s FOSS 讨论过很多这样的去中心化的服务。[YouTube 竞品:LBRY][1]、[Twitter 竞品:Mastodon][2] 是其中的两个例子。 + +今天我将要介绍另一个这样的产品,名为 [Beaker 浏览器][3],它的设计目标是浏览对等 Web。 + +![Beaker Browser][4] + +### “对等 Web” 是什么? + +根据 Beaker 浏览器的[开发者之一][5]的描述,“对等 Web 是一项实验性的技术 ……旨在提高我们掌控 Web 的能力。” + +还有,他们说对等 Web 有三个主要原则:任何一点都可以成为服务器;多台计算机可以为同一个网站提供服务;没有后端。 + +从这些原则中你可以看出,对等 Web 的思想与 BitTorrent 很像,文件由多个对端做种,这些对端共同承担带宽负载。这减少了一个用户需要提供给他们的网站的总带宽。 + +![Beaker Browser Settings][6] + +对等 Web 另一个重要的方面是创作者对于他们自己的想法的控制能力。当今年代,平台都是由庞大的组织控制的,往往拿你的数据为他们所用。Beaker 把数据的控制能力返还给了内容创造者。 + +### 使用 Beaker 浏览去中心化的 web + +[Beaker 浏览器][3] 是在 2016 年被创建的。该项目(及其周边技术)由[蓝链实验室][7]的三人团队创建。Beaker 浏览器使用 [Dat 协议][8]在计算机之间共享数据。使用 Dat 协议的网站以 `dat://` 而不是 `http://` 开头。 + +Dat 协议的优势如下: + + * 快速 – 档案能立即从多个源同步。 + * 安全 – 所有的更新都是有签名和经过完整性检查的。 + * 灵活 – 可以在不修改档案 URL 的情况下迁移主机。 + * 版本控制 – 每次修改都被写到只能追加的版本日志中。 + * 去中心化 – 任何设备都可以作为承载档案的主机。 + +![Beaker Browser Seeding][9] + +Beaker 浏览器本质上是阉割版的 Chromium,原生支持 `dat://` 地址,也可以访问普通的 `http://` 站点。 + +每次访问一个 dat 站点,在你请求时该站点的内容才会下载到你的计算机。例如,在一个站点上的 about 页面中有一张 Linux Torvalds 的图片,只有在你浏览到该站点的这个页面时,才会下载这张图片。 + +此外,当你浏览一个 dat 网站时,“[你会短暂性的][10]重新上传或做种你从该网站上下载的所有文件。”你也可以选择为网站(主动)做种来帮助创造者。 + +![Beaker Browser Menu][11] + +由于 Beaker 的志向就是创建一个更开放的网络,因此你可以很容易地查看任何网站的源码。不像在大多数浏览器上你只能看到当前浏览的页面的源码那样,使用 Beaker 你能以类似 GitHub 的视图查看整个站点的结构。你甚至可以复刻这个站点,并托管你自己的版本。 + +除了浏览基于 dat 的网站外,你还可以创建自己的站点。在 Beaker 浏览器的菜单里,有创建新网站或空项目的选项。如果你选择了创建一个新网站,Beaker 会搭建一个小的演示站点,你可以使用浏览器里自带的编辑器来编辑。 + +然而,如果你像我一样更喜欢用 Markdown,你可以选择创建一个空项目。Beaker 会创建一个站点的结构,赋给它一个 `dat://` 地址。你只需要创建一个 `index.md` 文件后就行了。这有个[简短教程][12],你可以看到更多信息。你也可以用创建空项目的方式搭建一个 web 应用。 + +![Beaker Browser Website Template][13] + +由于 Beaker 的角色是个 Web 服务器和站点做种者,当你关闭它或关机后你的站点就不可用了。幸运的是,你不必一直开着你的计算机或浏览器。你也可以使用名为 [Hashbase][14] 的做种服务或者你可以搭建一个 [homebase][15] 做种服务器。 + +虽然 Beaker [适用于][16] Linux、Windows 和 macOS,但是在使用 Beaker 之前,还是要查阅下[各平台的教程][17]。 + +### Beaker 浏览器不是大众可用的,但它有这个意图 + +当第一次接触到时,我对 Beaker 浏览器有极高的热情。(但是)如它现在的名字一样(烧杯),Beaker 浏览器仍是非常实验性的。我尝试浏览过的很多 dat 站点还不可用,因为用户并没有为站点做种。当站点恢复可用时 Beaker 确实可以选择通知你。 + +![Beaker Browser No Peer][18] + +另一个问题是,Beaker 是真正阉割版的 Chromium。它不能安装扩展或主题。你只能使用白色主题和极少的工具集。我不会把 Beaker 浏览器作为常用浏览器,而且能访问 dat 网站并不是把它留在系统上的充分条件。 + +我曾经寻找一个能支持 `dat://` 协议的 Firefox 扩展。我确实找到了这样一款扩展,但它需要安装一系列其他的软件。相比而言,安装 Beaker 比安装那些软件容易点。 + +就如它现在的名字一样,Beaker 不适合我。也许在将来更多的人使用 Beaker 或者其他浏览器支持 dat 协议。那时会很有趣。目前而言,聊胜于无。 + +在使用 Beaker 的时间里,我用内建的工具创建了一个[网站][19]。不要担心,我已经为它做种了。 + +![Beaker Bowser Site Source][20] + +你怎么看 Beaker 浏览器?你怎么看对等 Web?请尽情在下面评论。 + +如果你觉得本文有意思,请花点时间把它分享到社交媒体,Hacker News 或 [Reddit][21]。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/beaker-browser/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/lbry/ +[2]: https://itsfoss.com/mastodon-open-source-alternative-twitter/ +[3]: https://beakerbrowser.com/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/beaker-browser.jpg?resize=800%2C426&ssl=1 +[5]: https://pfrazee.hashbase.io/blog/what-is-the-p2p-web +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/beaker-bowser-setting.jpg?resize=800%2C573&ssl=1 +[7]: https://bluelinklabs.com/ +[8]: https://www.datprotocol.com/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/beaker-bowser-seedding.jpg?resize=800%2C466&ssl=1 +[10]: https://beakerbrowser.com/docs/faq/ +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/beaker-browser-menu.jpg?ssl=1 +[12]: https://beakerbrowser.com/docs/guides/create-a-markdown-site +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/beaker-browser-website-template.jpg?resize=800%2C459&ssl=1 +[14]: https://hashbase.io/ +[15]: https://github.com/beakerbrowser/homebase +[16]: https://beakerbrowser.com/install/ +[17]: https://beakerbrowser.com/docs/guides/ +[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/beaker-browser-no-peer.jpg?resize=800%2C424&ssl=1 +[19]: https://41bfbd06731e8d9c5d5676e8145069c69b254e7a3b710ddda4f6e9804529690c/ +[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/beaker-bowser-source.jpg?resize=800%2C544&ssl=1 +[21]: https://reddit.com/r/linuxusersgroup diff --git a/published/202005/20200506 After More Than 3 Years, Inkscape 1.0 is Finally Here With Tons of Feature Improvements.md b/published/202005/20200506 After More Than 3 Years, Inkscape 1.0 is Finally Here With Tons of Feature Improvements.md new file mode 100644 index 0000000000..fcf6c3b3ca --- /dev/null +++ b/published/202005/20200506 After More Than 3 Years, Inkscape 1.0 is Finally Here With Tons of Feature Improvements.md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12188-1.html) +[#]: subject: (After More Than 3 Years, Inkscape 1.0 is Finally Here With Tons of Feature Improvements) +[#]: via: (https://itsfoss.com/inkscape-1-release/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +经过了 3 年,Inkscape 1.0 终于发布了 +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/06/094055fvnh9nnnbybwl4jn.jpg) + +虽然我不是这方面的专业人员,但可以肯定地说,Inkscape 是[最好的矢量图形编辑器][1]之一。 + +不仅仅因为它是自由开源软件,而且对于数字艺术家来说,它是一个非常有用的应用程序。 + +上一次发布(0.92 版本)是在 3 年前。现在,终于,[Inkscape 宣布了它的 1.0 版本][2] —— 增加了很多新的功能和改进。 + +### Inkscape 1.0 里的新东西 + +![Inkscape 1.0][3] + +在这里,让我重点介绍一下 Inkscape 1.0 版本中重要关键变化。 + +#### 首个原生 macOS 应用 + +对于像 Inkscape 这样的神奇工具来说,适当的跨平台支持总是好的。在这个最新的版本中,它推出了原生的 macOS 应用。 + +请注意,这个 macOS 应用仍然是一个**预览版**,还有很多改进的空间。不过,在无需 [XQuartz][4] 的情况下就做到了更好的系统集成,对于 macOS 用户来说,应该是一个值得期许的进步。 + +#### 性能提升 + +不管是什么应用程序/工具,都会从显著的性能提升中受益,而 Inkscape 也是如此。 + +随着其 1.0 版本的发布,他们提到,当你使用 Inkscape 进行各种创意工作时,你会发现性能更加流畅。 + +除了在 macOS 上(仍为“预览版”),Inkscape 在 Linux 和 Windows 上的运行都是很好的。 + +#### 改进的 UI 和 HiDPI 支持 + +![][5] + +他们在发布说明中提到: + +> ……达成了一个重要的里程碑,使 Inkscape 能够使用最新的软件(即 GTK+3)来构建编辑器的用户界面。拥有 HiDPI(高分辨率)屏幕的用户要感谢 2018 年波士顿黑客节期间的团队合作,让更新后的 GTK 轮子开始运转起来。 + +从 GTK+3 的用户界面到高分辨率屏幕的 HiDPI 支持,这都是一次精彩的升级。 + +更不要忘了,你还可以获得更多的自定义选项来调整外观和感受。 + +#### 新增功能 + +![][6] + +即便是从纸面上看,这些列出新功能都看起来不错。根据你的专业知识和你的喜好,这些新增功能应该会派上用场。 + +以下是新功能的概述: + + * 新改进过的实时路径效果(LPE)功能。 + * 新的可搜索的 LPE 选择对话框。 + * 自由式绘图用户现在可以对画布进行镜像和旋转。 + * 铅笔工具的新的 PowerPencil 模式提供了压感的宽度,并且终于可以创建封闭路径了。 + * 包括偏移、PowerClip 和 PowerMask LPE 在内的新路径效果会吸引艺术类用户。 + * 能够创建复制引导、将网格对齐到页面上、测量工具的路径长度指示器和反向 Y 轴。 + * 能够导出带有可点击链接和元数据的 PDF 文件。 + * 新的调色板和网状渐变,可在网页浏览器中使用。 + +虽然我已经尝试着整理了这个版本中添加的关键功能列表,但你可以在他们的[发布说明][7]中获得全部细节。 + +#### 其他重要变化 + +作为重大变化之一,Inkscape 1.0 现在支持 Python 3。而且,随着这一变化,你可能会注意到一些扩展程序无法在最新版本中工作。 + +所以,如果你的工作依赖于某个扩展程序的工作流程,我建议你仔细看看他们的[发布说明][7],了解所有的技术细节。 + +### 在 Linux 上下载和安装 Inkscape 1.0 + +Inkscape 1.0 有用于 Linux 的 AppImage 和 Snap 软件包,你可以从 Inkscape 的网站上下载。 + +- [下载 Inkscape 1.0 for Linux][8] + +如果你还不知道,可以查看[如何在 Linux 上使用 AppImage 文件][9]来入门。你也可以参考[这个 Snap 指南][10]。 + +Ubuntu 用户可以在 Ubuntu 软件中心找到 Inskcape 1.0 的 Snap 版本。 + +我在 [Pop!_OS 20.04][11] 上使用了 AppImage 文件,工作的很好。你可以详细体验所有的功能,看看它的效果如何。 + +你试过了吗?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/inkscape-1-release/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/vector-graphics-editors-linux/ +[2]: https://inkscape.org/news/2020/05/04/introducing-inkscape-10/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/inkscape-1-0.jpg?ssl=1 +[4]: https://en.wikipedia.org/wiki/XQuartz +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/inkscape-ui-customization.jpg?ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/inkscape-live-path-effects.jpg?ssl=1 +[7]: https://wiki.inkscape.org/wiki/index.php/Release_notes/1.0 +[8]: https://inkscape.org/release/1.0/gnulinux/ +[9]: https://itsfoss.com/use-appimage-linux/ +[10]: https://itsfoss.com/install-snap-linux/ +[11]: https://itsfoss.com/pop-os-20-04-review/ diff --git a/published/202005/20200506 Customizing my open source PHP framework for web development.md b/published/202005/20200506 Customizing my open source PHP framework for web development.md new file mode 100644 index 0000000000..de6b46f8b7 --- /dev/null +++ b/published/202005/20200506 Customizing my open source PHP framework for web development.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12235-1.html) +[#]: subject: (Customizing my open source PHP framework for web development) +[#]: via: (https://opensource.com/article/20/5/codeigniter) +[#]: author: (Wee Ben Sen https://opensource.com/users/bswee14) + +自定义用于 Web 开发的开源 PHP 框架 Codeigniter +====== + +> Codeigniter 是一个 PHP 框架,可以使公司进行开发具有灵活性和便捷性的高性能网站。 + +![](https://img.linux.net.cn/data/attachment/album/202005/21/102637vslj5zqk52x98a52.jpg) + +PHP Codeigniter 是一个开源框架,为商业应用提供易于使用的 PHP 编程语言和强大的编码工具。它还提供商务智能、服务器监视、开发和应用集成功能。这是一个相对冷清的项目,你很少听到它,但它功能强大,许多刚接触的开发人员都对此感到惊讶和耳目一新。 + +我在新加坡的一家在线学习服务提供商处使用 [Codeigniter][2]。我们提供的服务并不算常见,没有可以作为模板的默认功能集或现有后台管理系统,所以我需要一个能提供良好的、可靠的、可以建立在此基础上的原始材料。最初,我考虑用其他平台(如 Wordpress)用于我们的网站。但是,我决定使用 Codeigniter,因为它的灵活性,以及集成了在我们的补课匹配过程中需要的功能。 + +以下是打动我使用 Codeigniter 的原因: + +* 与 MySQL 数据库的集成 —— 主要功能是允许客户端浏览导师的数据库并添加导师,例如类似于电子商务平台的“购物车”。 +* 客户端界面系统 —— 用户可以登录来管理偏好并编辑详细信息,修改所教的科目、旅游的地区、手机号码、地址等。 +* 定制的管理员面板 —— 管理员可以使用定制的管理面板访问客户提交的资料,它与客户服务功能集成在一起,因此管理员可以单独跟进。 +* 付款系统 —— 管理面板带有与 Paypal 集成的发票和付款网关。 +* CMS 编辑器界面 —— 管理员能够编辑博客和文章中的文本和图像,以及添加新页面。 + +该项目花费了大约六个月的时间来完成,另外花了两个月的调试时间。如果我需要从头开始构建所有,或者尝试重新设计现有的框架以满足我们的需求,那将花费更长的时间,而且可能最终无法满足客户需求。 + +### 功能和优点 + +PHP Codeigniter还有很多吸引开发者的功能,包括错误处理和代码格式化,这些功能在各种编码情景下都非常有用。它支持模板,可用于向现有网站添加功能或生成新网站。有许多基于 web 系统商业需要的功能,包括使用自定义标签。即使没有编程经验的普通开发人员也可以使用大多数工具。 + +Codeigniter 的主要功能是: + +* XML 核心服务, +* HTTP/FTP 核心服务 +* AppData 和 PHP 沙箱功能 +* XSLT 和 HTML 模板 +* 加密的信息传输 +* PCM Codeigniter 服务器监控 +* 应用集成 +* 文件传输协议(FTP) +* 服务台支持 +* Apache POI(用于托管网站的内容管理基础架构) + +#### 兼容性 + +Codeigniter 与许多领先的软件程序兼容,例如 PHP、MySQL、[MariaDB][3]、[phpMyAdmin][4]、[Apache][5]、OpenBSD、XSLT、[SQLite][6] 等。许多公司更喜欢使用 Codeigniter 产品来满足网站要求,因为它们易于使用和集成。如果你不想创建自己的网站,你可以找到许多提供自定义 Web 开发服务的开发人员和设计机构。 + +#### 安全 + +Codeigniter 还通过 SSL 加密提供数据安全性。加密可以保护数据免受入侵者和防火墙外部威胁的侵害。数据存储功能还允许对公司网站进行安全审核。 + +#### 其它功能 + +一家优秀的 PHP Web 开发公司会使用几种高级技术和第三方技术,例如 XML 和 PHP。它为企业提供了一个完整的平台,可以开发出具有看起来专业的、好用的商业网站。Codeigniter 使得第三方技术的使用变得容易,并可以与常见的 Web 开发软件一起使用。这使得 Web 公司可以轻松地使用所选模块创建网站。大多数 PHP 开发者也为个人提供支持和培训服务。 + +### 使用 PHP 框架 Codeigniter + +Codeigniter 给企业提供了完整的 PHP 开发包,它将提供强大的功能、灵活性和性能完美结合在一起。到目前为止,我很满意我们的网站,并不断地升级和添加新的功能。并不断升级和增加新的功能。我期待着发现我们的网站还能用 Codeigniter 做些什么。你也是这样么? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/codeigniter + +作者:[Wee Ben Sen][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/bswee14 +[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://codeigniter.com/ +[3]: http://mariadb.org/ +[4]: https://www.phpmyadmin.net/ +[5]: http://apache.org/ +[6]: http://sqlite.org/ diff --git a/published/202005/20200506 Managing Git projects with submodules and subtrees.md b/published/202005/20200506 Managing Git projects with submodules and subtrees.md new file mode 100644 index 0000000000..d52aef42a6 --- /dev/null +++ b/published/202005/20200506 Managing Git projects with submodules and subtrees.md @@ -0,0 +1,196 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12244-1.html) +[#]: subject: (Managing Git projects with submodules and subtrees) +[#]: via: (https://opensource.com/article/20/5/git-submodules-subtrees) +[#]: author: (Manaswini Das https://opensource.com/users/manaswinidas) + +使用子模块和子树来管理 Git 项目 +====== + +> 使用子模块和子树来帮助你管理多个存储库中共有的子项目。 + +![](https://img.linux.net.cn/data/attachment/album/202005/23/201323myyhob22eg2y2jqt.jpg) + +如果你参与了开源项目的开发,那么你很可能已经用了 Git 来管理你的源码。你可能遇到过有很多依赖和/或子项目的项目。你是如何管理它们的? + +对于一个开源组织,要实现社区**和**产品的单一来源文档和依赖管理比较棘手。文档和项目往往会碎片化和变得冗余,这致使它们很难维护。 + +### 必要性 + +假设你想把单个项目作为一个存储库内的子项目,传统的方法是把该项目复制到父存储库中,但是,如果你想要在多个父项目中使用同一个子项目呢?如果把子项目复制到所有父项目中,当有更新时,你都要在每个父项目中做修改,这是不太可行的。这会导致父项目中的冗余和数据不一致,使更新和维护子项目变得很困难。 + +### Git 子模块和子树 + +如果你可以用一条命令把一个项目放进另一个项目中,会怎样呢?如果你随时可以把一个项目作为子项目添加到任意数目的项目中,并可以同步更新修改呢?Git 提供了这类问题的解决方案:Git 子模块submodule和 Git 子树subtree。创建这些工具的目的是以更加模块化的水平来支持共用代码的开发工作流,旨在 Git 存储库源码管理source-code management(SCM)与它下面的子树之间架起一座桥梁。 + +![Cherry tree growing on a mulberry tree][2] + +*生长在桑树上的樱桃树* + +下面是本文要详细介绍的概念的一个真实应用场景。如果你已经很熟悉树形结构,这个模型看起来是下面这样: + +![Tree with subtrees][3] + +### Git 子模块是什么? + +Git 在它默认的包中提供了子模块,子模块可以把 Git 存储库嵌入到其他存储库中。确切地说,Git 子模块指向子树中的某次提交。下面是我 [Docs-test][4] GitHub 存储库中的 Git 子模块的样子: + +![Git submodules screenshot][5] + +[文件夹@提交 Id][6] 格式表明这个存储库是一个子模块,你可以直接点击文件夹进入该子树。名为 `.gitmodules` 的配置文件包含所有子模块存储库的详细信息。我的存储库的 `.gitmodules` 文件如下: + +![Screenshot of .gitmodules file][7] + +你可以用下面的命令在你的存储库中使用 Git 子模块: + +#### 克隆一个存储库并加载子模块 + +克隆一个含有子模块的存储库: + +``` +$ git clone --recursive +``` + +如果你之前已经克隆了存储库,现在想加载它的子模块: + +``` +$ git submodule update --init +``` + +如果有嵌套的子模块: + +``` +$ git submodule update --init --recursive +``` + +#### 下载子模块 + +串行地连续下载多个子模块是很枯燥的工作,所以 `clone` 和 `submodule update` 会支持 `--jobs` (或 `-j`)参数: + +例如,想一次下载 8 个子模块,使用: + +``` +$ git submodule update --init --recursive -j 8 +$ git clone --recursive --jobs 8 +``` + +#### 拉取子模块 + +在运行或构建父项目之前,你需要确保依赖的子项目都是最新的。 + +拉取子模块的所有修改: + +``` +$ git submodule update --remote +``` + +#### 使用子模块创建存储库: + +向一个父存储库添加子树: + +``` +$ git submodule add +``` + +初始化一个已存在的 Git 子模块: + +``` +$ git submodule init +``` + +你也可以通过为 `submodule update` 命令添加 `--update` 参数在子模块中创建分支和追踪提交: + +``` +$ git submodule update --remote +``` + +#### 更新子模块的提交 + +上面提到过,一个子模块就是一个指向子树中某次提交的链接。如果你想更新子模块的提交,不要担心。你不需要显式地指定最新的提交。你只需要使用通用的 `submodule update` 命令: + +``` +$ git submodule update +``` + +就像你平时创建父存储库和把父存储库推送到 GitHub 那样添加和提交就可以了。 + +#### 从一个父存储库中删除一个子模块 + +仅仅手动删除一个子项目文件夹不会从父项目中移除这个子项目。想要删除名为 `childmodule` 的子模块,使用: + +``` +$ git rm -f childmodule +``` + +虽然 Git 子模块看起来很容易上手,但是对于初学者来说,有一定的使用门槛。 + +### Git 子树是什么? + +Git 子树 subtree,是在 Git 1.7.11 引入的,让你可以把任何存储库的副本作为子目录嵌入另一个存储库中。它是 Git 项目可以注入和管理项目依赖的几种方法之一。它在常规的提交中保存了外部依赖信息。Git 子树提供了整洁的集成点,因此很容易复原它们。 + +如果你参考 [GitHub 提供的子树教程][8]来使用子树,那么无论你什么时候添加子树,在本地都不会看到 `.gittrees` 配置文件。这让我们很难分辨哪个是子树,因为它们看起来很像普通的文件夹,但是它们却是子树的副本。默认的 Git 包中不提供带 `.gittrees` 配置文件的 Git 子树版本,因此如果你想要带 `.gittrees` 配置文件的 git-subtree 命令,必须从 Git 源码存储库的 [/contrib/subtree 文件夹][9] 下载 git-subtree。 + +你可以像克隆其他常规的存储库那样克隆任何含有子树的存储库,但由于在父存储库中有整个子树的副本,因此克隆过程可能会持续很长时间。 + +你可以用下面的命令在你的存储库中使用 Git 子树。 + +#### 向父存储库中添加一个子树 + +想要向父存储库中添加一个子树,首先你需要执行 `remote add`,之后执行 `subtree add` 命令: + +``` +$ git remote add remote-name +$ git subtree add --prefix=folder/ remote-name subtree-branchname +``` + +上面的命令会把整个子项目的提交历史合并到父存储库。 + +#### 向子树推送修改以及从子树拉取修改 + +``` +$ git subtree push-all +``` + +或者 + +``` +$ git subtree pull-all +``` + +### 你应该使用哪个? + +任何工具都有优缺点。下面是一些可能会帮助你决定哪种最适合你的特性: + + * Git 子模块的存储库占用空间更小,因为它们只是指向子项目的某次提交的链接,而 Git 子树保存了整个子项目及其提交历史。 + * Git 子模块需要在服务器中可访问,但子树是去中心化的。 + * Git 子模块大量用于基于组件的开发,而 Git 子树多用于基于系统的开发。 + +Git 子树并不是 Git 子模块的直接可替代项。有明确的说明来指导我们该使用哪种。如果有一个归属于你的外部存储库,使用场景是向它回推代码,那么就使用 Git 子模块,因为推送代码更容易。如果你有第三方代码,且不会向它推送代码,那么使用 Git 子树,因为拉取代码更容易。 + +自己尝试使用 Git 子树和子模块,然后在评论中留下你的使用感想。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/git-submodules-subtrees + +作者:[Manaswini Das][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/manaswinidas +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet) +[2]: https://opensource.com/sites/default/files/uploads/640px-bialbero_di_casorzo.jpg (Cherry tree growing on a mulberry tree) +[3]: https://opensource.com/sites/default/files/subtree_0.png (Tree with subtrees) +[4]: https://github.com/manaswinidas/Docs-test/ +[5]: https://opensource.com/sites/default/files/uploads/git-submodules_github.png (Git submodules screenshot) +[6]: mailto:folder@commitId +[7]: https://opensource.com/sites/default/files/uploads/gitmodules.png (Screenshot of .gitmodules file) +[8]: https://help.github.com/en/github/using-git/about-git-subtree-merges +[9]: https://github.com/git/git/tree/master/contrib/subtree diff --git a/published/202005/20200506 Speed up administration of Kubernetes clusters with k9s.md b/published/202005/20200506 Speed up administration of Kubernetes clusters with k9s.md new file mode 100644 index 0000000000..2d3665fc79 --- /dev/null +++ b/published/202005/20200506 Speed up administration of Kubernetes clusters with k9s.md @@ -0,0 +1,232 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12247-1.html) +[#]: subject: (Speed up administration of Kubernetes clusters with k9s) +[#]: via: (https://opensource.com/article/20/5/kubernetes-administration) +[#]: author: (Jessica Cherry https://opensource.com/users/cherrybomb) + +k9s:你没看错,这是一个加速 k8s 集群管理的工具 +====== + +> 看看这个很酷的 Kubernetes 管理的终端 UI。 + +![](https://img.linux.net.cn/data/attachment/album/202005/25/104742pqjmiroc44honcs5.jpg) + +通常情况下,我写的关于 Kubernetes 管理的文章中用的都是做集群管理的 `kubectl` 命令。然而最近,有人给我介绍了 [k9s][2] 项目,可以让我快速查看并解决 Kubernetes 中的日常问题。这极大地改善了我的工作流程,我会在这篇教程中告诉你如何上手它。  + +它可以安装在 Mac、Windows 和 Linux 中,每种操作系统的说明可以在[这里][2]找到。请先完成安装,以便能够跟上本教程。 + +我会使用 Linux 和 Minikube,这是一种在个人电脑上运行 Kubernetes 的轻量级方式。按照[此教程][3]或使用[该文档][4]来安装它。 + +### 设置 k9s 配置文件 + +安装好 `k9s` 应用后,从帮助命令开始总是很好的起点。 + +``` +$ k9s help +``` + +正如你在帮助信息所看到的,我们可以用 `k9s` 来配置很多功能。我们唯一需要进行的步骤就是编写配置文件。而 `info` 命令会告诉我们该应用程序要在哪里找它的配置文件。 + +``` +$ k9s info + ____ __.________ +| |/ _/ __ \______ +| < \____ / ___/ +| | \ / /\___ \ +|____|__ \ /____//____ > + \/ \/ + +Configuration: /Users/jess/.k9s/config.yml +Logs: /var/folders/5l/c1y1gcw97szdywgf9rk1100m0000gn/T/k9s-jess.log +Screen Dumps: /var/folders/5l/c1y1gcw97szdywgf9rk1100m0000gn/T/k9s-screens-jess +``` + +如果要添加配置文件,该配置目录不存在的话就创建它,然后添加一个配置文件。 + +``` +$ mkdir -p ~/.k9s/ +$ touch ~/.k9s/config.yml +``` + +在这篇介绍中,我们将使用 `k9s` 版本库中推荐的默认 `config.yml`。维护者请注意,这种格式可能会有变化,可以[在这里查看][5]最新版本。 + +``` +k9s: +  refreshRate: 2 +  headless: false +  readOnly: false +  noIcons: false +  logger: +    tail: 200 +    buffer: 500 +    sinceSeconds: 300 +    fullScreenLogs: false +    textWrap: false +    showTime: false +  currentContext: minikube +  currentCluster: minikube +  clusters: +    minikube: +      namespace: +        active: "" +        favorites: +        - all +        - kube-system +        - default +      view: +        active: dp +  thresholds: +    cpu: +      critical: 90 +      warn: 70 +    memory: +      critical: 90 +      warn: 70 +``` + +我们设置了 `k9s` 寻找本地的 minikube 配置,所以我要确认 minikube 已经上线可以使用了。 + +``` +$ minikube status +host: Running +kubelet: Running +apiserver: Running +kubeconfig: Configured +``` + +### 运行 k9s 来探索一个 Kubernetes 集群 + +有了配置文件,并指向我们的本地集群,我们现在可以运行 `k9s` 命令了。 + +``` +$ k9s +``` + +启动后,会弹出 `k9s` 的基于文本的用户界面。在没有指定命名空间标志的情况下,它会向你显示默认命名空间中的 Pod。 + +![K9s screenshot][6] + +如果你运行在一个有很多 Pod 的环境中,默认视图可能会让人不知所措。或者,我们可以将注意力集中在给定的命名空间上。退出该应用程序,运行 `k9s -n `,其中 `` 是已存在的命名空间。在下图中,我运行了 `k9s -n minecraft`,它显示了我损坏的 Pod: + +![K9s screenshot][7] + +所以,一旦你有了 `k9s` 后,有很多事情你可以更快地完成。  + +通过快捷键来导航 `k9s`,我们可以随时使用方向键和回车键来选择列出的项目。还有不少其他的通用快捷键可以导航到不同的视图。 + +* `0`:显示在所有命名空间中的所有 Pod + ![K9s screenshot][8] +* `d`:描述所选的 Pod + ![K9s screenshot][9] +* `l`:显示所选的 Pod 的日志 + ![Using k9s to show Kubernetes pod logs][10] + +你可能会注意到 `k9s` 设置为使用 [Vim 命令键][11],包括使用 `J` 和 `K` 键上下移动等。Emacs 用户们,败退吧 :) + +### 快速查看不同的 Kubernetes 资源 + +需要去找一个不在 Pod 里的东西吗?是的,我也需要。当我们输入冒号(`:`)键时,可以使用很多快捷方式。从那里,你可以使用下面的命令来导航。 + +* `:svc`:跳转到服务视图 + ![K9s screenshot][12] +* `:deploy`:跳转到部署视图 + ![K9s screenshot][13] +* `:rb`:跳转到角色绑定视图,用于 [基于角色的访问控制(RBAC)][14]管理 + ![K9s screenshot][15] +* `:namespace`:跳转到命名空间视图 + ![K9s screenshot][16] +* `:cj`:跳转到 cronjob 视图,查看集群中计划了哪些作业。 + ![K9s screenshot][17] + +这个应用最常用的工具是键盘;要在任何页面往上或下翻页,请使用方向键。如果你需要退出,记得使用 Vim 绑定键,键入 `:q`,然后按回车键离开。 + +### 用 k9s 排除 Kubernetes 的故障示例 + +当出现故障的时候,`k9s` 怎么帮忙?举个例子,我让几个 Pod 由于配置错误而死亡。下面你可以看到我那个可怜的 “hello” 部署死了。当我们将其高亮显示出来,可以按 `d` 运行 `describe` 命令,看看是什么原因导致了故障。 + +![K9s screenshot][18] + +![K9s screenshot][19] + +草草掠过那些事件并不能告诉我们故障原因。接下来,我按了 `esc` 键,然后通过高亮显示 Pod 并输入`shift-l` 来检查日志。 + +![K9s screenshot][20] + +不幸的是,日志也没有提供任何有用的信息(可能是因为部署从未正确配置过),而且 Pod 也没有出现。 + +然后我使用 `esc` 退了出来,我看看删除 Pod 是否能解决这个问题。要做到这一点,我高亮显示该 Pod,然后使用 `ctrl-d`。幸好 `k9s` 在删除前会提示用户。  + +![K9s screenshot][21] + +虽然我确实删除了这个 Pod,但部署资源仍然存在,所以新的 Pod 会重新出现。无论什么原因(我们还不知道),它还会继续重启并死掉。 + +在这里,我会重复查看日志,描述资源,甚至使用 `e` 快捷方式来编辑运行中的 Pod 以排除故障行为。在这个特殊情况下,失败的 Pod 是因为没有配置在这个环境下运行。因此,让我们删除部署来停止崩溃接着重启的循环。 + +我们可以通过键入 `:deploy` 并点击回车进入部署。从那里我们高亮显示并按 `ctrl-d` 来删除。 + +![K9s screenshot][22] + +![K9s screenshot][23] + +这个有问题的部署被干掉了! 只用了几个按键就把这个失败的部署给清理掉了。 + +### k9s 是极其可定制的 + +这个应用有很多自定义选项、乃至于 UI 的配色方案。这里有几个可编辑的选项,你可能会感兴趣。 + +* 调整你放置 `config.yml` 文件的位置(这样你就可以把它存储在[版本控制][24]中)。 +* 在 `alias.yml` 文件中添加[自定义别名][25]。 +* 在 `hotkey.yml` 文件中创建[自定义热键][26]。 +* 探索现有的[插件][27]或编写自己的插件。 + +整个应用是在 YAML 文件中配置的,所以定制化对于任何 Kubernetes 管理员来说都会觉得很熟悉。 + +### 用 k9s 简化你的生活 + +我倾向于以一种非常手动的方式来管理我团队的系统,更多的是为了锻炼脑力,而不是别的。当我第一次听说 `k9s` 的时候,我想,“这只是懒惰的 Kubernetes 而已。”于是我否定了它,然后回到了到处进行人工干预的状态。实际上,当我在处理积压工作时就开始每天使用它,而让我震惊的是它比单独使用 `kubectl` 快得多。现在,我已经皈依了。  + +了解你的工具并掌握做事情的“硬道理”很重要。还有一点很重要的是要记住,就管理而言,重要的是要更聪明地工作,而不是更努力。使用 `k9s`,就是我践行这个目标的方法。我想,我们可以把它叫做懒惰的 Kubernetes 管理,也没关系。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/kubernetes-administration + +作者:[Jessica Cherry][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/cherrybomb +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/game-dogs-chess-play-lead.png?itok=NAuhav4Z (Dogs playing chess) +[2]: https://github.com/derailed/k9s +[3]: https://opensource.com/article/18/10/getting-started-minikube +[4]: https://kubernetes.io/docs/tasks/tools/install-minikube/ +[5]: https://github.com/derailed/k9s#k9s-configuration +[6]: https://opensource.com/sites/default/files/uploads/k9s_1.png (K9s screenshot) +[7]: https://opensource.com/sites/default/files/uploads/k9s_2.png (K9s screenshot) +[8]: https://opensource.com/sites/default/files/uploads/k9s_3.png (K9s screenshot) +[9]: https://opensource.com/sites/default/files/uploads/k9s_5_0.png (K9s screenshot) +[10]: https://opensource.com/sites/default/files/uploads/k9s-show-logs-opensourcedotcom.png (Using k9s to show Kubernetes pod logs) +[11]: https://opensource.com/article/19/3/getting-started-vim +[12]: https://opensource.com/sites/default/files/uploads/k9s_5.png (K9s screenshot) +[13]: https://opensource.com/sites/default/files/uploads/k9s_6.png (K9s screenshot) +[14]: https://kubernetes.io/docs/reference/access-authn-authz/rbac/ +[15]: https://opensource.com/sites/default/files/uploads/k9s_7.png (K9s screenshot) +[16]: https://opensource.com/sites/default/files/uploads/k9s_8.png (K9s screenshot) +[17]: https://opensource.com/sites/default/files/uploads/k9s_9.png (K9s screenshot) +[18]: https://opensource.com/sites/default/files/uploads/k9s_10.png (K9s screenshot) +[19]: https://opensource.com/sites/default/files/uploads/k9s_11.png (K9s screenshot) +[20]: https://opensource.com/sites/default/files/uploads/k9s_12.png (K9s screenshot) +[21]: https://opensource.com/sites/default/files/uploads/k9s_13.png (K9s screenshot) +[22]: https://opensource.com/sites/default/files/uploads/k9s_14.png (K9s screenshot) +[23]: https://opensource.com/sites/default/files/uploads/k9s_15.png (K9s screenshot) +[24]: https://opensource.com/article/19/3/move-your-dotfiles-version-control +[25]: https://k9scli.io/topics/aliases/ +[26]: https://k9scli.io/topics/hotkeys/ +[27]: https://github.com/derailed/k9s/tree/master/plugins diff --git a/published/202005/20200506 Three Methods to Check Uptime of MySQL-MariaDB Database Server on Linux.md b/published/202005/20200506 Three Methods to Check Uptime of MySQL-MariaDB Database Server on Linux.md new file mode 100644 index 0000000000..a319cb3be6 --- /dev/null +++ b/published/202005/20200506 Three Methods to Check Uptime of MySQL-MariaDB Database Server on Linux.md @@ -0,0 +1,139 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12263-1.html) +[#]: subject: (Three Methods to Check Uptime of MySQL/MariaDB Database Server on Linux) +[#]: via: (https://www.2daygeek.com/check-mysql-mariadb-database-server-uptime-linux/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +在 Linux 上检查 MySQL/MariaDB 数据库正常运行时间的三种方法 +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/29/211031hqb8qlyddtlrt2fl.jpg) + +我们都知道在 Linux 中使用 `uptime` 命令的目的。它用于检查 [Linux 系统的正常运行时间][1]以及系统上次启动以来运行的时间。 + +而 Linux 管理员的工作是保持系统正常运行。 + +如果要检查 Linux 上的其他服务(例如 [Apache][2]、MySQL、MariaDB、sftp 等)运行了多长时间,该怎么做? + +每个服务都有自己的命令来检查服务的正常运行时间。但是你也可以为此使用其他命令。 + +### 方法 1:如何使用 ps 命令在 Linux 上检查 MySQL/MariaDB 数据库的正常运行时间 + +[ps 命令][3]的意思是进程状态process status。这是最基本的命令之一,它显示了系统正在运行的进程的详细信息。 + +为此,你首先需要使用 [pidof 命令][5]查找 [MySQL][4]/[MariaDB][6] 的 PID。 + +``` +# pidof mysqld | cut -d" " -f1 + +2412 +``` + +获取 MySQL/MariaDB 的 PID 后,请在 `ps` 命令中使用 `--etime` 选项获得正常运行时间。 + +* `--etime`:自进程启动以来经过的时间,形式为 `[[DD-]hh:]mm:ss`。 + +``` +# ps -p 2412 -o etime + + ELAPSED +2-08:49:30 +``` + +或者,在 `ps` 命令中使用 `--lstart` 选项来获取指定 PID 的正常运行时间。 + +``` +# ps -p 2412 -o lstart + + STARTED +Sat May 2 03:02:15 2020 +``` + +MySQL/MariaDB 进程已经运行了 2 天 03 小时 02 分 15 秒。 + +### 方法 2:如何使用 systemctl 命令在 Linux 上检查 MySQL/MariaDB 数据库的正常运行时间 + +[systemctl 命令][7]用于控制 systemd 系统和服务管理器。 + +systemd 是新的初始化系统和系统管理器,现在大多数 Linux 发行版都淘汰了传统的 SysVinit 管理器而采用了 systemd。 + +``` +# systemctl status mariadb +或者 +# systemctl status mysql + +● mariadb.service - MariaDB 10.1.44 database server + Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled) + Drop-In: /etc/systemd/system/mariadb.service.d + └─migrated-from-my.cnf-settings.conf + Active: active (running) since Sat 2020-05-02 03:02:18 UTC; 2 days ago + Docs: man:mysqld(8) + https://mariadb.com/kb/en/library/systemd/ + Process: 2448 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) + Process: 2388 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=/usr/bin/galera_recovery; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS) + Process: 2386 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) + Main PID: 2412 (mysqld) + Status: "Taking your SQL requests now…" + CGroup: /system.slice/mariadb.service + └─2412 /usr/sbin/mysqld + +May 03 21:41:26 ns2.2daygeek.com mysqld[2412]: 2020-05-03 21:41:26 140328136861440 [Warning] Host name '1.1.1.1' could not be resolved: … not known +May 04 02:00:46 ns2.2daygeek.com mysqld[2412]: 2020-05-04 2:00:46 140328436418304 [Warning] IP address '1.1.1.1' has been resolved to the host name '2…ss itself. +May 04 03:01:31 ns2.2daygeek.com mysqld[2412]: 2020-05-04 3:01:31 140328436111104 [Warning] IP address '1.1.1.1' could not be resolved: Temporary fai…resolution +May 04 04:03:06 ns2.2daygeek.com mysqld[2412]: 2020-05-04 4:03:06 140328136861440 [Warning] IP address '1.1.1.1' could not be resolved: Name or ser… not known +May 04 07:23:54 ns2.2daygeek.com mysqld[2412]: 2020-05-04 7:23:54 140328435189504 [Warning] IP address '1.1.1.1' could not be resolved: Name or service not known +May 04 08:03:31 ns2.2daygeek.com mysqld[2412]: 2020-05-04 8:03:31 140328436418304 [Warning] IP address '1.1.1.1' could not be resolved: Name or service not known +May 04 08:25:56 ns2.2daygeek.com mysqld[2412]: 2020-05-04 8:25:56 140328135325440 [Warning] IP address '1.1.1.1' could not be resolved: Name or service not known +Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable. +Hint: Some lines were ellipsized, use -l to show in full. +``` + +### 方法 3:如何使用 MySQLAdmin 命令在 Linux 上检查 MySQL/MariaDB 数据库的正常运行时间 + +[MySQLAdmin][8] 是安装 MySQL 软件包时安装的 MySQL 服务器命令行程序。 + +MySQLAdmin 客户端允许你在 MySQL 服务器上执行一些基本的管理功能。 + +它用于创建数据库、删除数据库、设置 root 密码、更改 root 密码、检查 MySQL 状态、验证 MySQL 功能、监视 mysql 进程以及验证服务器的配置。 + +``` +# mysqladmin -u root -pPassword version + +mysqladmin Ver 8.42 Distrib 5.7.27, for Linux on x86_64 +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Server version 5.7.27 +Protocol version 10 +Connection Localhost via UNIX socket +UNIX socket /var/lib/mysql/mysql.sock +Uptime: 1 day 10 hours 44 min 13 sec +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/check-mysql-mariadb-database-server-uptime-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://www.2daygeek.com/linux-system-server-uptime-check/ +[2]: https://www.2daygeek.com/check-find-apache-httpd-web-server-uptime-linux/ +[3]: https://www.2daygeek.com/linux-ps-command-find-running-process-monitoring/ +[4]: https://www.2daygeek.com/category/mysql/ +[5]: https://www.2daygeek.com/check-find-parent-process-id-pid-ppid-linux/ +[6]: https://www.2daygeek.com/category/mariadb/ +[7]: https://www.2daygeek.com/sysvinit-vs-systemd-cheatsheet-systemctl-command-usage/ +[8]: https://www.2daygeek.com/linux-mysqladmin-command-administrate-mysql-mariadb-server/ diff --git a/published/202005/20200507 Ubuntu Studio To Replace Xfce With KDE Plasma Desktop Environment.md b/published/202005/20200507 Ubuntu Studio To Replace Xfce With KDE Plasma Desktop Environment.md new file mode 100644 index 0000000000..d349c73567 --- /dev/null +++ b/published/202005/20200507 Ubuntu Studio To Replace Xfce With KDE Plasma Desktop Environment.md @@ -0,0 +1,71 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12223-1.html) +[#]: subject: (Ubuntu Studio To Replace Xfce With KDE Plasma Desktop Environment) +[#]: via: (https://itsfoss.com/ubuntu-studio-opts-for-kde/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Ubuntu Studio 将用 KDE Plasma 桌面环境替换 Xfce +====== + +[Ubuntu Studio][1] 是一个流行的 [Ubuntu 官方变种][2],它是为从事音频制作、视频、图形、摄影和书籍出版的创意内容创建者量身定制的。它提供了许多多媒体内容创建应用,开箱即用,体验极佳。 + +在最近的 20.04 LTS 版本发布之后,Ubuntu Studio 团队在其[官方公告][3]中强调了一些非常重要的内容。而且,也许不是每个人都注意到关键信息,即 Ubuntu Studio 的未来。 + +Ubuntu Studio 20.04 将是带有 [Xfce 桌面环境][4]的最后一个版本。将来的所有发行版都将改用 [KDE Plasma][5]。 + +### 为什么 Ubuntu Studio 放弃 XFCE? + +![][6] + +据他们的澄清,Ubuntu Studio 并不专注于任何特定的外观/感受,而是旨在提供最佳的用户体验。同时,KDE 被证明是一个更好的选择。 + +> 事实证明,Plasma 为图形艺术家和摄影师提供了更好的工具,例如在 Gwenview、Krita 甚至文件管理器 Dolphin 中都可以看出。此外,它对 Wacom 平板的支持比其他任何桌面环境都更好。 + +> 它已经变得如此之好,以至于现在大部分 Ubuntu Studio 团队成员都在使用通过 Ubuntu Studio 安装程序添加了 Ubuntu Studio 的 Kubuntu 作为日常工作使用。既然我们中的这么多人都在使用 Plasma,因此在我们的下一个版本中过渡到 Plasma 似乎是个好时机。 + +当然,每一个桌面环境都是针对不同的用户量身定制的。在此,他们认为 KDE Plasma 是最适合取代 XFCE 的桌面环境,可以为所有用户提供更好的用户体验。 + +尽管我不确定用户对此会有何反应,因为每个用户都有不同的偏好。如果现有用户对 KDE 没有问题,那就没什么大问题。 + +值得注意的是,Ubuntu Studio 还提到了为什么 KDE 可能是它们的更好选择: + +> 在没有 Akonadi 的情况下,Plasma 桌面环境的资源使用与 Xfce 一样轻量级,甚至更轻。Fedora Jam 和 KXStudio 等其他以音频为重点的 Linux 发行版在历史上一直使用 KDE Plasma 桌面环境,并且在音频方面做得很好。 + +此外,他们还强调了 [Jason Evangelho 在福布斯杂志上的一篇文章][7],其中一些基准测试表明 KDE 几乎与 Xfce 一样轻量级。尽管这是一个好的迹象,我们仍然需要等待用户试驾 KDE 驱动的 Ubuntu Studio。只有这样,我们才能观察到 Ubuntu Studio 放弃 XFCE 桌面环境的决定是否正确。 + +### 更改后,Ubuntu Studio 用户将发生什么变化? + +在带有 KDE 的 Ubuntu Studio 20.10 及更高版本上的整体工作流程可能会受到影响(或改善)。 + +但是,升级过程(从 20.04 到 20.10)会导致系统损坏。因此,全新安装 Ubuntu Studio 20.10 或更高版本将是唯一的方法。 + +他们还提到,他们还会不断评估与预安装的应用是否存在重复。所以,相信在未来的日子里,更多的细节也会随之而来。 + +Ubuntu Studio 是最近一段时间内第二个改变了主桌面环境的发行版。先前,[Lubuntu][8] 从 LXDE 切换到 LXQt。 + +你如何看待这种变化?欢迎在下面的评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ubuntu-studio-opts-for-kde/ + +作者:[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://ubuntustudio.org/ +[2]: https://itsfoss.com/which-ubuntu-install/ +[3]: https://ubuntustudio.org/2020/04/ubuntu-studio-20-04-lts-released/ +[4]: https://xfce.org +[5]: https://kde.org/plasma-desktop +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-studio-kde-xfce.jpg?ssl=1 +[7]: https://www.forbes.com/sites/jasonevangelho/2019/10/23/bold-prediction-kde-will-steal-the-lightweight-linux-desktop-crown-in-2020 +[8]: https://itsfoss.com/lubuntu-20-04-review/ diff --git a/published/202005/20200508 5 ways to split your Linux terminal.md b/published/202005/20200508 5 ways to split your Linux terminal.md new file mode 100644 index 0000000000..3bc58045fa --- /dev/null +++ b/published/202005/20200508 5 ways to split your Linux terminal.md @@ -0,0 +1,158 @@ +[#]: collector: (lujun9972) +[#]: translator: (HankChow) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12236-1.html) +[#]: subject: (5 ways to split your Linux terminal) +[#]: via: (https://opensource.com/article/20/5/split-terminal) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +5 种拆分 Linux 终端的方法 +====== + +> 本文介绍了 Linux 提供的拆分终端的方法,它能够帮助你完成多任务工作。那么,你最喜欢哪一款终端复用工具呢? + +![](https://img.linux.net.cn/data/attachment/album/202005/21/132437ypzpqqppqh1qfznh.jpg) + +没有什么问题是不能用一个 Linux 终端解决的,如果不行,那就用两个。 + +很早以前,[终端其实是一个物理设备][2],而现在的终端实际上是在计算机上被模拟出来的一个应用程序。当你使用终端和计算机进行交互的时候,就会发现,只打开一个终端是不够用的。在进行编译、数据处理等长时间任务的时候,你不得不打开一个新终端或新选项卡tab来同时进行其它工作。 + +如果你是系统管理员,你就需要更多的终端窗口,以便连接到多个不同的主机上并行工作了。 + +在 Linux 系统中,终端应用程序在很久之前就已经开始带有选项卡功能了。而现在的终端应用程序里,选项卡已经是标配功能了,这是非常流行的趋势。尽管如此,工作的时候在多个选项卡之间来回切换,或多或少也会分散我们的注意力,甚至带来不便。 + +而最好的解决方案就是将整个屏幕划分为多个部分,这样多个终端就可以在同一个终端应用程序窗口中同时存在。Linux 发行版中也有很多相关的工具可以实现这一功能。 + +### Shell、终端和控制台 + +在此之前,我们首先要明确 Shell、终端terminal控制台console这三个概念。想要详细了解的话,请参阅 [Enable Sysadmin][2] 博客上的相关文章。 + +简而言之: + +* **Shell** 是带有命令提示符prompt的用于输入、输出的界面。准确地说,[POSIX][3] 桌面底层也运行着一个 Shell,即使这个 Shell 对用户不可见,因为用户会话就是由这个 Shell 启动的。 +* **终端**是在图形界面服务器(例如 X11 或 Wayland)中运行的应用程序,其中加载了一个 Shell。只有在终端窗口启动之后,才算是运行了一个终端。终端可以认为是操作 Shell 的一个入口。 +* **控制台**(或称“虚拟控制台”)通常表示在桌面环境以外使用的 Shell,你可以通过 `Alt+Ctrl+F2` 进入控制台,通常情况下从 `F3` 到 `F7` 都是不同的控制台,其中桌面环境有可能是 `F1` 或者 `F7`,这在不同的发行版中可能会有所不同。 + +因此,有些应用程序提供的功能是拆分 Shell 或者控制台,有些应用程序的功能则是拆分终端。 + +### tmux + +![tmux terminal][4] + +[tmux][5] 可以说是最灵活、最强大的屏幕拆分工具了,它通过键盘控制对多个终端的复用,因此你可以将一个控制台叠放在另一个控制台上面,并在两个控制台之间切换。你还可以将整个屏幕等分为多个控制台,以便同时观察不同控制台上的状况。 + +`tmux` 的所有操作都是通过键盘完成的,这就意味着你的手不需要离开键盘去寻找鼠标。为此,你需要记住一些按键组合。 + +如果你只用 `tmux` 来做屏幕拆分,那你只需要记住一下这些命令: + + * `Ctrl-B %` 竖直拆分屏幕(两个 Shell 分别位于左右) + * `Ctrl-B "` 水平拆分屏幕(两个 Shell 分别位于上下) + * `Ctrl-B O` 切换到另一个 Shell + * `Ctrl-B ?` 查看帮助 + * `Ctrl-B d` 断开 `tmux` 并让其在后台运行(可以使用 `tmux attach` 重新进入) + +`tmux` 的一大好处是,在一台计算机上启动 `tmux` 会话之后,也可以从另一台计算机上进入到这个会话,由此可以看出,`tmux` 对 Shell 进行了守护进程化daemonize。 + +例如,当我在树莓派上运行 `tmux`,我就可以从计算机上连接到树莓派并登录 IRC,当我断开连接时,树莓派上的 `tmux` 会继续运行,并等待我的下一次连接,在此期间 IRC 是处于持续登录状态的。 + +### GNU Screen + +![GNU Screen terminal][6] + +[GNU Screen][7] 也是一个 Shell 复用工具,类似于 `tmux`,你可以在断开一个活动会话后重连到其中,它也支持竖直或水平拆分屏幕。 + +`screen` 的灵活性比 `tmux` 要弱一些。它默认的绑定按键组合是 `Ctrl-A`,和 Bash 中光标移动到行首的快捷键是一样的。因此,当你正在运行 `screen` 的时候,如果想要将光标移动到行首,就需要多按一次 `Ctrl-A`。而我自己的做法是,在 `$HOME/.screenrc` 文件中将绑定按键组合重新设置为 `Ctrl-J`。 + +``` +escape ^jJ +``` + +尽管 `screen` 在屏幕拆分功能上做得很好,但 `tmux` 上的一些缺点在 Screen 上也同样存在。例如在拆分 Shell 时,在一个新的面板中不会启动新的 Shell ,而是需要使用 `Ctrl-A Tab` 导航到另一个面板(如果你按照我的方式重新设置了按键组合,需要对应地把 `Ctrl-A` 改为 `Ctrl-J`),然后通过 `Ctrl-A C` 手动创建一个新的 Shell。 + +和 `tmux` 不同的是,`screen` 在退出一个 Shell 的时候,屏幕拆分状态不会改变,这样的设计在某些情况下是比较适合的,但麻烦之处在于需要手动管理屏幕拆分状态。 + +尽管如此,`screen` 还是一个相当可靠灵活的应用程序,在无法使用 `tmux` 的时候,你可以选择 `screen` 作为备选方案。 + +在默认按键方案下,`screen` 常用的基本命令包括: + + * `Ctrl-A |` 竖直拆分屏幕(两个 Shell 分别位于左右) + * `Ctrl-A S` 水平拆分屏幕(两个 Shell 分别位于上下) + * `Ctrl-A Tab` 切换到另一个 Shell + * `Ctrl-A ?` 查看帮助 + * `Ctrl-A d` 断开 `screen` 并让其在后台运行(可以使用 `screen -r` 重新进入) + +### Konsole + +![Konsole screen][8] + +[Konsole][9] 是 KDE Plasma 桌面使用的终端应用程序。和 KDE 一样,Konsole 也以高度可定制、功能强大的特点而著称。 + +和 `tmux`、GNU Screen 类似,Konsole 也具有拆分屏幕的功能。由于 Konsole 是图形界面的终端,因此还可以用鼠标来控制它的屏幕拆分。 + +Konsole 的屏幕拆分功能在“查看View”菜单中。它也支持竖直和水平方向的拆分,只要点击鼠标就可以切换到另一个面板上。每个面板都是一个独立的终端,因此都可以拥有独立的主题和标签页。 + +Konsole 和 `tmux`、GNU Screen 最大的不同之处在于不能断开和重新连接 Konsole。除非使用远程桌面软件,否则只能在打开 Konsole 时使用,这一点和大多数图形界面应用程序是一样的。 + +### Emacs + +![Emacs rpg][10] + +严格来说,Emacs 并不算是一个终端复用工具,但它的使用界面支持拆分和调整大小,同时还带有一个内建的终端。 + +如果 Emacs 是你日常使用的文本编辑器,你就可以在不关闭编辑器的情况下,在不同的应用程序之间轻松互相切换。由于 Emacs eshell 模块是通过 eLISP 实现的,因此你可以在 Emacs 中使用相同的命令进行交互,让一些繁琐的操作变得更为简单。 + +如果你是在图形界面中使用 Emacs,还可以使用鼠标进行操作。例如通过点击切换面板、用鼠标调整拆分屏幕的的大小等等。尽管如此,键盘的操作速度还是更快,因此记住一些键盘快捷键还是很有必要的。 + +Emacs 的一些重要快捷键包括: + + * `Ctrl-X 3` 竖直拆分屏幕(两个 Shell 分别位于左右) + * `Ctrl-X 2` 水平拆分屏幕(两个 Shell 分别位于上下) + * `Ctrl-X O` (大写字母 `O`)切换到另一个 Shell(你也可以使用鼠标操作) + * `Ctrl-X 0` (数字 `0`)关闭当前面板 + +如果你运行了 emacs-client 的话,就可以像 tmux 和 GNU Screen 一样断开和重新连接到 Emacs 了。 + +### 窗口管理器 + +![Ratpoison split screen][11] + +除了文本编辑器之外,一些 Linux 桌面也同样具有拆分屏幕、加载终端这样的功能。例如 [Ratpoison][12]、[Herbsluftwm][13]、i3、Awesome,甚至是启用了特定设置的 KDE Plasma 桌面,都可以将多个应用程序在桌面上分块显示。 + +这些桌面可以让各个应用程序占据屏幕的固定位置,而不是浮在你的桌面“之上”,因此你可以在多个应用程序窗口之间轻松切换。你还可以打开多个终端,排布成网格,就像终端复用工具一样。更进一步,你还可以在你的桌面复用工具中加载一个终端复用工具。 + +而且,没有什么可以阻止你在里面载入 Emacs 并分割缓冲区。没有人知道,如果你把它更进一步,会发生什么,大多数 Linux 用户不会外传这种秘密。 + +和 `tmux`、GNU Screen 不同,你在断开与桌面的连接后无法重新连接到同一个桌面会话,除非你使用了远程桌面软件进行连接。 + +### 更多选择 + +除了上面介绍到的工具以外,还有诸如 [Tilix][14]、Terminator 这样的终端模拟器,它们同样可以实现屏幕拆分、嵌入终端组件等功能。欢迎在评论区分享你喜欢的终端拆分工具。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/split-terminal + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[HankChow](https://github.com/HankChow) +校对:[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/freedos.png?itok=aOBLy7Ky (4 different color terminal windows with code) +[2]: https://www.redhat.com/sysadmin/terminals-shells-consoles +[3]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[4]: https://opensource.com/sites/default/files/uploads/terminal-split-tmux2.png (tmux terminal) +[5]: https://github.com/tmux/tmux +[6]: https://opensource.com/sites/default/files/uploads/terminal-split-screen.png (GNU Screen terminal) +[7]: https://www.gnu.org/software/screen/ +[8]: https://opensource.com/sites/default/files/uploads/konsole.jpg (Konsole screen) +[9]: https://konsole.kde.org +[10]: https://opensource.com/sites/default/files/uploads/emacs-rpg_0.jpg (Emacs rpg) +[11]: https://opensource.com/sites/default/files/uploads/advent-ratpoison-split_0.jpg (Ratpoison split screen) +[12]: https://opensource.com/article/19/12/ratpoison-linux-desktop +[13]: https://opensource.com/article/19/12/herbstluftwm-linux-desktop +[14]: https://gnunn1.github.io/tilix-web/ diff --git a/published/202005/20200508 Fixing -Unable to parse package file -var-lib-apt-lists- Error in Ubuntu and Other Linux Distributions.md b/published/202005/20200508 Fixing -Unable to parse package file -var-lib-apt-lists- Error in Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..41c25c7d8d --- /dev/null +++ b/published/202005/20200508 Fixing -Unable to parse package file -var-lib-apt-lists- Error in Ubuntu and Other Linux Distributions.md @@ -0,0 +1,118 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12216-1.html) +[#]: subject: (Fixing “Unable to parse package file /var/lib/apt/lists” Error in Ubuntu and Other Linux Distributions) +[#]: via: (https://itsfoss.com/unable-to-parse-package-file/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +修复 Ubuntu 中的 “Unable to parse package file” 错误 +====== + +过去,我已经讨论了许多 [Ubuntu 更新错误][1]。如果你[使用命令行更新 Ubuntu][2],那可能会遇到一些“错误”。 + +其中一些“错误”基本上是内置功能,可防止对系统进行不必要的更改。在本教程中,我不会涉及那些细节。 + +在本文中,我将向你展示如何解决在更新系统或安装新软件时可能遇到的以下错误: + +``` +Reading package lists… Error! +E: Unable to parse package file /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease +E: The package lists or status file could not be parsed or opened. +``` + +在 Debian 中可能会遇到类似的错误: + +``` +E: Unable to parse package file /var/lib/apt/extended_states (1) +``` + +即使遇到 `The package cache file is corrupted` 也完全不必惊慌。这真的很容易“修复”。 + +### 在基于 Ubuntu 和 Debian 的 Linux 发行版中处理 “Unable to parse package file” 错误 + +![][3] + +以下是你需要做的。仔细查看 [Ubuntu][4] 报错文件的名称和路径。 + +``` +Reading package lists… Error! +E: Unable to parse package file /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease +E: The package lists or status file could not be parsed or opened. +``` + +例如,上面的错误是在报 `/var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease` 文件错误。 + +这让你想到这个文件不正确。现在,你需要做的就是删除该文件并重新生成缓存。 + +``` +sudo rm +``` + +因此,这里我可以使用以下命令:`sudo rm /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_bionic_InRelease`,然后使用 `sudo apt update` 命令重建缓存。 + +#### 给初学者的分步指导 + +如果你熟悉 Linux 命令,那么可能知道如何使用绝对路径删除文件。对于新手用户,让我指导你安全删除文件。 + +首先,你应该进入文件目录: + +``` +cd /var/lib/apt/lists/ +``` + +现在删除无法解析的文件: + +``` +sudo rm archive.ubuntu.com_ubuntu_dists_bionic_InRelease +``` + +现在,如果你再次运行更新,将重新生成 apt 缓存。 + +``` +sudo apt update +``` + +#### 有很多文件无法解析? + +如果你在更新系统时有一个或两个文件无法解析,那么问题不大。但是,如果系统报错有十个或二十个此类文件,那么一一删除它们就太累了。 + +在这种情况下,你可以执行以下操作来删除整个缓存,然后再次生成它: + +``` +sudo rm -r /var/lib/apt/lists/* +sudo apt update +``` + +#### 解释这为何能解决问题 + +`/var/lib/apt` 是与 apt 软件包管理器相关的文件和数据的存储目录。`/var/lib/apt/lists` 是用于保存系统 `source.list` 中指定的每个软件包资源信息的目录。 + +简单点来说,`/var/lib/apt/lists` 保存软件包信息缓存。当你要安装或更新程序时,系统会在此目录中检查该软件包中的信息。如果找到了该包的详细信息,那么它将进入远程仓库并实际下载程序或其更新。 + +当你运行 `sudo apt update` 时,它将构建缓存。这就是为什么即使删除 `/var/lib/apt/lists` 目录中的所有内容,运行更新也会建立新的缓存的原因。 + +这就是处理文件无法解析问题的方式。你的系统报某个软件包或仓库信息以某种方式损坏(下载失败或手动更改 `sources.list`)。删除该文件(或所有文件)并重建缓存即可解决此问题。 + +#### 仍然有错误? + +这应该能解决你的问题。但是,如果问题仍然存在,或者你还有其他相关问题,请在评论栏告诉我,我将尽力帮助你。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/unable-to-parse-package-file/ + +作者:[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-update-error/ +[2]: https://itsfoss.com/update-ubuntu/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/Unable-to-parse-package-file.png?ssl=1 +[4]: https://ubuntu.com/ diff --git a/published/202005/20200508 Getting started with FreeBSD as a desktop operating system.md b/published/202005/20200508 Getting started with FreeBSD as a desktop operating system.md new file mode 100644 index 0000000000..ef63e7b696 --- /dev/null +++ b/published/202005/20200508 Getting started with FreeBSD as a desktop operating system.md @@ -0,0 +1,69 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12225-1.html) +[#]: subject: (Getting started with FreeBSD as a desktop operating system) +[#]: via: (https://opensource.com/article/20/5/furybsd-linux) +[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) + +使用 FreeBSD 作为桌面操作系统 +====== + +> FuryBSD 的实时桌面环境能让你在实际使用之前先尝试。 + +![FuryBSD Post-Install XFCE Desktop][10] + +[FreeBSD][2] 是一个很棒的操作系统,但是从设计上讲,它并没有自带桌面环境。如果不从 FreeBSD 的 [ports 和软件包集][3]安装其他软件,那么 FreeBSD 仅能体验命令行。下面的截图显示了在安装过程中选择了每个“可选系统组件”后,登录 FreeBSD 12.1 的样子。 + +![FreeBSD][4] + +FreeBSD 可以用各种桌面环境中的任何一种来变成桌面操作系统,但是这需要时间、精力和[遵循大量书面说明][5]。使用使用 desktop-installer 包(为用户提供基于文本的菜单并帮助自动执行大部分过程)仍然非常耗时。这两种方法的最大问题是,用户可能在花了很多时间进行设置之后,可能会发现他们的硬件系统与 FreeBSD 不完全兼容。 + +[FuryBSD][6] 通过提供实时桌面镜像来解决此问题,用户可以在安装之前对其进行评估。目前,FuryBSD 提供 Xfce 镜像和 KDE 镜像。每个镜像都提供了一个已预安装桌面环境的 FreeBSD。如果用户试用该镜像并发现其硬件工作正常,那么他们可以安装 FuryBSD,并拥有一个由 FreeBSD 驱动的即用桌面操作系统。在本文中,我会使用 Xfce 镜像,但 KDE 镜像的工作原理完全一样。 + +对于安装过 Linux 发行版、BSD 或任何其他类 Unix 的开源操作系统的人,FuryBSD 的上手过程应该很熟悉。从 FuryBSD 网站下载 ISO,将它复制到闪存盘,然后从闪存盘启动计算机。如果从闪存盘引导失败,请确保“安全引导”已禁用。 + +![FuryBSD Live XFCE Desktop][7] + +从闪存盘启动后,桌面环境将自动加载。除了“家”、“文件系统”和“回收站”图标外,实时桌面还有用于配置 Xorg 的工具、入门指南、FuryBSD 安装程序和系统信息程序的图标。除了这些额外功能以及一些自定义的 Xfce 设置和壁纸外,桌面环境除了基本的 Xfce 应用和 Firefox 之外并没有其他功能。 + +![FuryBSD Xorg Tool][8] + +此时仅加载基本的图形驱动,但足以检查 FuryBSD 是否支持系统的有线和无线网络接口。如果网络接口没有一个能自动工作,那么 `Getting Started.txt` 文件包含有关尝试配置网络接口和其他配置任务的说明。如果至少有一个网络接口有效,那么可以使用 Configure Xorg 应用安装 Intel、NVidia 或 VirtualBox 图形驱动。它将下载并安装驱动,并且需要重新启动 Xorg。如果系统未自动重新登录到实时镜像用户,那么密码为 `furybsd`(你可以使用它来登录)。配置后,图形驱动将转移到已安装的系统中。 + +![FuryBSD Installer - ZFS Configuration][9] + +如果一切都可以在实时环境中正常运行,那么 FuryBSD 安装程序可以将 FuryBSD 配置并安装到计算机上。该安装程序在终端中运行,但提供与大多数其他 BSD 和 Linux 安装程序相同的选项。系统将要求用户设置系统的主机名、配置 ZFS 存储、设置 root 密码,添加至少一个非 root 用户以及配置时间和日期。完成后,系统可以引导到预装有 Xfce (或 KDE)的 FreeBSD 中。FuryBSD 完成了所有困难的工作,甚至还花了很多精力使桌面看起来更漂亮。 + + + +如上所述,桌面环境没有大量预装软件,因此几乎肯定要安装额外的软件包。最快的方法是在终端中使用 `pkg` 命令。该命令的行为很像 `dnf` 和 `apt`,因此使用过其中之一的来自 Linux 发行版的用户在查找和安装软件包时应该感到很熟悉。FreeBSD 的软件包集合非常多,因此大多数知名的开源软件包都可用。 + +如果用户在没有太多 FreeBSD 经验的情况下尝试 FuryBSD,应查阅 [FreeBSD 手册][11],以了解有关如何以 FreeBSD 的方式操作。有任何 Linux 发行版或其他 BSD 使用经验的用户应该能弄清很多事情,但是手册可以帮助你弄清一些差异。进一步了解 FreeBSD 的一个很好的资源是 Michael W. Lucas 的 《[Absolute FreeBSD,第三版][12]》。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/furybsd-linux + +作者:[Joshua Allen Holm][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/holmja +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/web_browser_desktop_devlopment_design_system_computer.jpg?itok=pfqRrJgh (web development and design, desktop and browser) +[2]: https://www.freebsd.org +[3]: https://www.freebsd.org/ports/ +[4]: https://opensource.com/sites/default/files/uploads/freebsd.png (FreeBSD) +[5]: https://www.freebsdfoundation.org/freebsd/how-to-guides/installing-a-desktop-environment-on-freebsd/ +[6]: https://www.furybsd.org +[7]: https://opensource.com/sites/default/files/uploads/furybsd_live_xfce_desktop.png (FuryBSD Live XFCE Desktop) +[8]: https://opensource.com/sites/default/files/uploads/furybsd_xorg_tool.png (FuryBSD Xorg Tool) +[9]: https://opensource.com/sites/default/files/uploads/furybsd_installer_-_zfs_configuration.png (FuryBSD Installer - ZFS Configuration) +[10]: https://opensource.com/sites/default/files/uploads/furybsd_post-install_xfce_desktop.png (FuryBSD Post-Install XFCE Desktop) +[11]: https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ +[12]: https://nostarch.com/absfreebsd3 diff --git a/published/202005/20200509 Ensmallening Go binaries by prohibiting comparisons.md b/published/202005/20200509 Ensmallening Go binaries by prohibiting comparisons.md new file mode 100644 index 0000000000..1d1a6b1590 --- /dev/null +++ b/published/202005/20200509 Ensmallening Go binaries by prohibiting comparisons.md @@ -0,0 +1,162 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12238-1.html) +[#]: subject: (Ensmallening Go binaries by prohibiting comparisons) +[#]: via: (https://dave.cheney.net/2020/05/09/ensmallening-go-binaries-by-prohibiting-comparisons) +[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) + +通过禁止比较让 Go 二进制文件变小 +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/22/101617lcha7vvqzhh7d565.jpg) + +大家常规的认知是,Go 程序中声明的类型越多,生成的二进制文件就越大。这个符合直觉,毕竟如果你写的代码不去操作定义的类型,那么定义一堆类型就没有意义了。然而,链接器的部分工作就是检测没有被程序引用的函数(比如说它们是一个库的一部分,其中只有一个子集的功能被使用),然后把它们从最后的编译产出中删除。常言道,“类型越多,二进制文件越大”,对于多数 Go 程序还是正确的。 + +本文中我会深入讲解在 Go 程序的上下文中“相等”的意义,以及为什么[像这样][1]的修改会对 Go 程序的大小有重大的影响。 + +### 定义两个值相等 + +Go 的语法定义了“赋值”和“相等”的概念。赋值是把一个值赋给一个标识符的行为。并不是所有声明的标识符都可以被赋值,如常量和函数就不可以。相等是通过检查标识符的内容是否相等来比较两个标识符的行为。 + +作为强类型语言,“相同”的概念从根源上被植入标识符的类型中。两个标识符只有是相同类型的前提下,才有可能相同。除此之外,值的类型定义了如何比较该类型的两个值。 + +例如,整型是用算数方法进行比较的。对于指针类型,是否相等是指它们指向的地址是否相同。映射和通道等引用类型,跟指针类似,如果它们指向相同的地址,那么就认为它们是相同的。 + +上面都是按位比较相等的例子,即值占用的内存的位模式是相同的,那么这些值就相等。这就是所谓的 memcmp,即内存比较,相等是通过比较两个内存区域的内容来定义的。 + +记住这个思路,我过会儿再来谈。 + +### 结构体相等 + +除了整型、浮点型和指针等标量类型,还有复合类型:结构体。所有的结构体以程序中的顺序被排列在内存中。因此下面这个声明: + +``` +type S struct { + a, b, c, d int64 +} +``` + +会占用 32 字节的内存空间;`a` 占用 8 个字节,`b` 占用 8 个字节,以此类推。Go 的规则说如果结构体所有的字段都是可以比较的,那么结构体的值就是可以比较的。因此如果两个结构体所有的字段都相等,那么它们就相等。 + +``` +a := S{1, 2, 3, 4} +b := S{1, 2, 3, 4} +fmt.Println(a == b) // 输出 true +``` + +编译器在底层使用 memcmp 来比较 `a` 的 32 个字节和 `b` 的 32 个字节。 + +### 填充和对齐 + +然而,在下面的场景下过分简单化的按位比较的策略会返回错误的结果: + +``` +type S struct { + a byte + b uint64 + c int16 + d uint32 +} + +func main() + a := S{1, 2, 3, 4} + b := S{1, 2, 3, 4} + fmt.Println(a == b) // 输出 true +} +``` + +编译代码后,这个比较表达式的结果还是 `true`,但是编译器在底层并不能仅依赖比较 `a` 和 `b` 的位模式,因为结构体有*填充*。 + +Go 要求结构体的所有字段都对齐。2 字节的值必须从偶数地址开始,4 字节的值必须从 4 的倍数地址开始,以此类推 [^1]。编译器根据字段的类型和底层平台加入了填充来确保字段都*对齐*。在填充之后,编译器实际上看到的是 [^2]: + +``` +type S struct { + a byte + _ [7]byte // 填充 + b uint64 + c int16 + _ [2]int16 // 填充 + d uint32 +} +``` + +填充的存在保证了字段正确对齐,而填充确实占用了内存空间,但是填充字节的内容是未知的。你可能会认为在 Go 中 填充字节都是 0,但实际上并不是 — 填充字节的内容是未定义的。由于它们并不是被定义为某个确定的值,因此按位比较会因为分布在 `s` 的 24 字节中的 9 个填充字节不一样而返回错误结果。 + +Go 通过生成所谓的相等函数来解决这个问题。在这个例子中,`s` 的相等函数只比较函数中的字段略过填充部分,这样就能正确比较类型 `s` 的两个值。 + +### 类型算法 + +呵,这是个很大的设置,说明了为什么,对于 Go 程序中定义的每种类型,编译器都会生成几个支持函数,编译器内部把它们称作类型的算法。如果类型是一个映射的键,那么除相等函数外,编译器还会生成一个哈希函数。为了维持稳定,哈希函数在计算结果时也会像相等函数一样考虑诸如填充等因素。 + +凭直觉判断编译器什么时候生成这些函数实际上很难,有时并不明显,(因为)这超出了你的预期,而且链接器也很难消除没有被使用的函数,因为反射往往导致链接器在裁剪类型时变得更保守。 + +### 通过禁止比较来减小二进制文件的大小 + +现在,我们来解释一下 Brad 的修改。向类型添加一个不可比较的字段 [^3],结构体也随之变成不可比较的,从而强制编译器不再生成相等函数和哈希函数,规避了链接器对那些类型的消除,在实际应用中减小了生成的二进制文件的大小。作为这项技术的一个例子,下面的程序: + +``` +package main + +import "fmt" + +func main() { + type t struct { + // _ [0][]byte // 取消注释以阻止比较 + a byte + b uint16 + c int32 + d uint64 + } + var a t + fmt.Println(a) +} +``` + +用 Go 1.14.2(darwin/amd64)编译,大小从 2174088 降到了 2174056,节省了 32 字节。单独看节省的这 32 字节似乎微不足道,但是考虑到你的程序中每个类型及其传递闭包都会生成相等和哈希函数,还有它们的依赖,这些函数的大小随类型大小和复杂度的不同而不同,禁止它们会大大减小最终的二进制文件的大小,效果比之前使用 `-ldflags="-s -w"` 还要好。 + +最后总结一下,如果你不想把类型定义为可比较的,可以在源码层级强制实现像这样的奇技淫巧,会使生成的二进制文件变小。 + +* * * + +附录:在 Brad 的推动下,[Cherry Zhang][5] 和 [Keith Randall][6] 已经在 Go 1.15 做了大量的改进,修复了最严重的故障,消除了无用的相等和哈希函数(虽然我猜想这也是为了避免这类 CL 的扩散)。 + +[^1]: 在 32 位平台上 `int64` 和 `unit64` 的值可能不是按 8 字节对齐的,因为平台原生的是以 4 字节对齐的。查看 [议题 599][7] 了解内部详细信息。 +[^2]: 32 位平台会在 `a` 和 `b` 的声明中填充 `_ [3]byte`。参见前一条。 +[^3]: Brad 使用的是`[0]func()`,但是所有能限制和禁止比较的类型都可以。添加了一个有 0 个元素的数组的声明后,结构体的大小和对齐不会受影响。 + +#### 相关文章: + + 1. [Go 运行时如何高效地实现映射(不使用泛型)][11] + 2. [空结构体][12] + 3. [填充很难][13] + 4. [Go 中有类型的 nil(2)][14] + +-------------------------------------------------------------------------------- + +via: https://dave.cheney.net/2020/05/09/ensmallening-go-binaries-by-prohibiting-comparisons + +作者:[Dave Cheney][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://dave.cheney.net/author/davecheney +[b]: https://github.com/lujun9972 +[1]: https://github.com/golang/net/commit/e0ff5e5a1de5b859e2d48a2830d7933b3ab5b75f +[2]: tmp.uBLyaVR1Hm#easy-footnote-bottom-1-4116 (On 32bit platforms int64 and uint64 values may not be 8 byte aligned as the natural alignment of the platform is 4 bytes. See issue 599 for the gory details.) +[3]: tmp.uBLyaVR1Hm#easy-footnote-bottom-2-4116 (32 bit platforms would see _ [3]byte padding between the declaration of a and b. See previous.) +[4]: tmp.uBLyaVR1Hm#easy-footnote-bottom-3-4116 (Brad used [0]func(), but any type that the spec limits or prohibits comparisons on will do. By declaring the array has zero elements the type has no impact on the size or alignment of the struct.) +[5]: https://go-review.googlesource.com/c/go/+/231397 +[6]: https://go-review.googlesource.com/c/go/+/191198 +[7]: https://github.com/golang/go/issues/599 +[8]: tmp.uBLyaVR1Hm#easy-footnote-1-4116 +[9]: tmp.uBLyaVR1Hm#easy-footnote-2-4116 +[10]: tmp.uBLyaVR1Hm#easy-footnote-3-4116 +[11]: https://dave.cheney.net/2018/05/29/how-the-go-runtime-implements-maps-efficiently-without-generics (How the Go runtime implements maps efficiently (without generics)) +[12]: https://dave.cheney.net/2014/03/25/the-empty-struct (The empty struct) +[13]: https://dave.cheney.net/2015/10/09/padding-is-hard (Padding is hard) +[14]: https://dave.cheney.net/2017/08/09/typed-nils-in-go-2 (Typed nils in Go 2) diff --git a/published/202005/20200511 Can-t Install Deb File on Ubuntu 20.04- Here-s What You Need to do.md b/published/202005/20200511 Can-t Install Deb File on Ubuntu 20.04- Here-s What You Need to do.md new file mode 100644 index 0000000000..bc6bc1aec8 --- /dev/null +++ b/published/202005/20200511 Can-t Install Deb File on Ubuntu 20.04- Here-s What You Need to do.md @@ -0,0 +1,79 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12220-1.html) +[#]: subject: (Can’t Install Deb File on Ubuntu 20.04? Here’s What You Need to do!) +[#]: via: (https://itsfoss.com/cant-install-deb-file-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +无法在 Ubuntu 20.04 上安装 Deb 文件?这是你需要做的! +====== + +> 双击 deb 文件后无法通过 Ubuntu 20.04 的软件中心安装?你不是唯一遇到此问题的人。本教程展示了解决方法。 + +![](https://img.linux.net.cn/data/attachment/album/202005/15/112149cfdyg556upv6vd66.jpg) + +在“[安装 Ubuntu 20.04 之后要做的事][1]”一文中,一些读者提到他们[用 Deb 文件安装软件][2]遇到了麻烦。 + +我发现这很奇怪,因为使用 deb 文件安装程序是最简单的方法之一。你要做的就是双击下载的文件,它会在软件中心中打开(默认情况下)。单击安装,它要求你输入密码,并在几秒钟/分钟内安装了该软件。 + +我[从 19.10 升级到 Ubuntu 20.04][3]直到今天都没有遇到这个问题。 + +我下载了 .deb 文件来安装 [Rocket Chat Messenger][4],然后双击该文件安装时,文件用存档管理器打开。这不是我所期望的。 + +![DEB files opened with Archive Manager instead of Software Center][5] + +“修复”很简单,我将在本教程中向你展示。 + +### 在 Ubuntu 20.04 中安装 deb 文件 + +由于某些原因,在 Ubuntu 20.04 中 deb 文件的默认打开程序被设置为存档管理器。存档管理器是用于[解压 zip][6] 和其他压缩文件。 + +解决此问题的方法非常简单。[在 Ubuntu 中更改默认应用][7],将打开 DEB 文件从“存档管理器”改到“软件安装”。让我告诉你步骤。 + +**步骤 1:**右键单击下载的 .deb 文件,然后选择**属性**: + +![][8] + +**步骤 2:**进入“**打开方式**”标签,选择“**软件安装**”,然后点击“**设置为默认**”。 + +![][9] + +这样,以后所有的 .deb 文件都将通过“软件安装”即软件中心打开。 + +双击 .deb 文件确认,看看是否在软件中心中打开。 + +### 忽视的 bug 还是愚蠢的功能? + +为什么会用存档管理器打开 deb 文件让人无法理解。我确实希望这是一个 bug,而不是像[在 Ubuntu 20.04 中不允许在桌面上拖放文件][10]这样的怪异功能。 + +既然我们在讨论 deb 文件的安装,就让我告诉你一个不错的工具 [gdebi][11]。它是一个轻量级应用,其唯一目的是安装 DEB 文件。有时它也可以处理依赖关系。 + +你可以了解更多有关[使用 gdebi 并默认设为安装 deb 文件的工具][12]。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/cant-install-deb-file-ubuntu/ + +作者:[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://linux.cn/article-12183-1.html +[2]: https://itsfoss.com/install-deb-files-ubuntu/ +[3]: https://itsfoss.com/upgrade-ubuntu-version/ +[4]: https://rocket.chat/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/error-opening-deb-file.png?ssl=1 +[6]: https://itsfoss.com/unzip-linux/ +[7]: https://itsfoss.com/change-default-applications-ubuntu/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/open-deb-files.png?ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/deb-file-install-fix-ubuntu.png?fit=800%2C454&ssl=1 +[10]: https://itsfoss.com/add-files-on-desktop-ubuntu/ +[11]: https://launchpad.net/gdebi +[12]: https://itsfoss.com/gdebi-default-ubuntu-software-center/ diff --git a/published/202005/20200520 How to configure your router using VTY shell.md b/published/202005/20200520 How to configure your router using VTY shell.md new file mode 100644 index 0000000000..5b2874fa82 --- /dev/null +++ b/published/202005/20200520 How to configure your router using VTY shell.md @@ -0,0 +1,188 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12268-1.html) +[#]: subject: (How to configure your router using VTY shell) +[#]: via: (https://opensource.com/article/20/5/vty-shell) +[#]: author: (M Umer https://opensource.com/users/noisybotnet) + +如何使用 VTY Shell 配置路由器 +====== + +> FRR(free range routing)给了你实现多种协议的选择。本指南将帮助你入门。 + +![](https://img.linux.net.cn/data/attachment/album/202005/31/122310xi9aag5iqihqgcxl.jpg) + +最近,我写了一篇文章,解释了如何使用 [Quagga][2] 路由套件实现开放式最短路径优先Open Shortest Path First(OSPF)。可以使用多个软件套件代替 Quagga 来实现不同的路由协议。其中一种是 FRR(free range routing)。 + +### FRR + +[FRR][3] 是一个路由软件套件,它衍生自 Quagga,并在 GNU GPL2 许可下分发。与 Quagga 一样,它为类 Unix 平台提供了所有主要路由协议的实现,例如 OSPF、路由信息协议Routing Information Protocol(RIP)、边界网关协议Border Gateway Protocol(BGP) 和中间系统到中间系统Intermediate system-to-intermediate system (IS-IS)。 + +开发了 Quagga 的一些公司,例如 Big Switch Networks、Cumulus、Open Source Routing 和 6wind,创建了 FRR 以在 Quagga 的良好基础上进行改善。 + +#### 体系结构 + +FRR 是一组守护进程,它们可以共同构建路由表。每个主协议都在其自己的守护进程中实现,并且这些守护进程与独立于协议的核心守护进程 Zebra 通信,后者提供内核路由表更新、接口查找以及不同路由协议之间路由的重新分配。每个特定协议的守护进程负责运行相关协议并根据交换的信息构建路由表。 + +![FRR architecture][4] + +### VTY shell + +[VTYSH][5] 是 FRR 路由引擎的集成 shell。它将每个守护进程中定义的所有 CLI 命令合并,并在单个 shell 中将它们呈现给用户。它提供了类似于 Cisco 的命令行模式,并且许多命令与 Cisco IOS 命令相似。CLI 有不同的模式,某些命令仅在特定模式下可用。 + +### 设置 + +在本教程中,我们将使用 FRR 配置动态路由来实现路由信息协议(RIP)。我们可以通过两种方式来做到这一点:在编辑器中编辑协议守护进程配置文件或使用 VTY Shell。在此例中,我们将使用 VTY shell。我们的设置包括两个名为 Alpha 和 Beta 的 CentOS 7.7 主机。这两台主机都有两个网络接口,并共享对 192.168.122.0/24 网络的访问。我们将广播 10.12.11.0/24 和 10.10.10.0/24 网络的路由。 + +对于主机 Alpha: + +* eth0 IP:192.168.122.100/24 +* 网关:192.168.122.1 +* eth1 IP:10.10.10.12/24 + +对于主机 Beta: + +* eth0 IP:192.168.122.50/24 +* 网关:192.168.122.1 +* eth1 IP:10.12.11.12/24 + +#### 安装软件包 + +首先,我们需要在两台主机上都安装 FRR 软件包。可以按照[官方 FRR 文档][6]中的说明进行操作。 + +#### 启用 IP 转发 + +对于路由,我们需要在两台主机上都启用 IP 转发,因为这将由 Linux 内核执行: + +``` +sysctl -w net.ipv4.conf.all.forwarding = 1 +sysctl -w net.ipv6.conf.all.forwarding = 1 +sysctl -p +``` + +#### 启用 RIPD 守护进程 + +安装后,所有配置文件将保存在 `/etc/frr` 目录中。 必须通过编辑 `/etc/frr/daemons` 文件显式启用守护进程。该文件确定启动 FRR 服务时激活哪些守护进程。要启用特定的守护进程,只需将相应的 `no` 改为 `yes`。之后的服务重启将启动守护进程。 + +![FRR daemon restart][7] + +#### 防火墙配置 + +由于 RIP 协议使用 UDP 作为传输协议,并被分配了 520 端口,因此我们需要在 `firewalld` 配置中允许该端口。 + +``` +firewall-cmd --add-port=520/udp –permanent +firewalld-cmd -reload +``` + +现在,我们可以使用以下命令启动 FRR 服务: + +``` +systemctl start frr +``` + +#### 使用 VTY 进行配置 + +现在,我们需要使用 VTY Shell 配置 RIP。 + +在主机 Alpha 上: + +``` +[root@alpha ~]# vtysh + +Hello, this is FRRouting (version 7.2RPKI). +Copyright 1996-2005 Kunihiro Ishiguro, et al. + +alpha# configure terminal +alpha(config)# router rip +alpha(config-router)# network 192.168.122.0/24 +alpha(config-router)# network 10.10.10.0/24 +alpha(config-router)# route 10.10.10.5/24 +alpha(config-router)# do write +Note: this version of vtysh never writes vtysh.conf +Building Configuration... +Configuration saved to /etc/frr/ripd.conf +Configuration saved to /etc/frr/staticd.conf +alpha(config-router)# do write memory +Note: this version of vtysh never writes vtysh.conf +Building Configuration... +Configuration saved to /etc/frr/ripd.conf +Configuration saved to /etc/frr/staticd.conf +alpha(config-router)# exit +``` + +类似地,在主机 Beta 上: + +``` +[root@beta ~]# vtysh + +Hello, this is FRRouting (version 7.2RPKI). +Copyright 1996-2005 Kunihiro Ishiguro, et al. + +beta# configure terminal +beta(config)# router rip +beta(config-router)# network 192.168.122.0/24 +beta(config-router)# network 10.12.11.0/24 +beta(config-router)# do write +Note: this version of vtysh never writes vtysh.conf +Building Configuration... +Configuration saved to /etc/frr/zebra.conf +Configuration saved to /etc/frr/ripd.conf +Configuration saved to /etc/frr/staticd.conf +beta(config-router)# do write memory +Note: this version of vtysh never writes vtysh.conf +Building Configuration... +Configuration saved to /etc/frr/zebra.conf +Configuration saved to /etc/frr/ripd.conf +Configuration saved to /etc/frr/staticd.conf +beta(config-router)# exit +``` + +完成后,像下面这样检查两台主机路由: + +``` +[root@alpha ~]# ip route show +default via 192.168.122.1 dev eth0 proto static metric 100 +10.10.10.0/24 dev eth1 proto kernel scope link src 10.10.10.12 metric 101 +10.12.11.0/24 via 192.168.122.50 dev eth0 proto 189 metric 20 +192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.100 metric 100 +``` + +我们可以看到 Alpha 上的路由表通过 `192.168.122.50` 包含了 `10.12.11.0/24` 的条目,它是通过 RIP 提供的。 + +类似地,在 Beta 上,该表通过 `192.168.122.100` 包含了 `10.10.10.0/24` 的条目。 + +``` +[root@beta ~]# ip route show +default via 192.168.122.1 dev eth0 proto static metric 100 +10.10.10.0/24 via 192.168.122.100 dev eth0 proto 189 metric 20 +10.12.11.0/24 dev eth1 proto kernel scope link src 10.12.11.12 metric 101 +192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.50 metric 100 +``` + +### 总结 + +如你所见,设置和配置相对简单。要增加复杂性,我们可以向路由器添加更多的网络接口,以为更多的网络提供路由。可以在编辑器中编辑配置文件来进行配置,但是使用 VTY Shell 在单个组合会话中为我们提供了所有 FRR 守护进程的前端。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/vty-shell + +作者:[M Umer][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/noisybotnet +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/connections_wires_sysadmin_cable.png?itok=d5WqHmnJ (Multi-colored and directional network computer cables) +[2]: https://linux.cn/article-12199-1.html +[3]: https://en.wikipedia.org/wiki/FRRouting +[4]: https://opensource.com/sites/default/files/uploads/frr_architecture.png (FRR architecture) +[5]: http://docs.frrouting.org/projects/dev-guide/en/latest/vtysh.html +[6]: http://docs.frrouting.org/projects/dev-guide/en/latest/building-frr-for-centos7.html +[7]: https://opensource.com/sites/default/files/uploads/frr_daemon_restart.png (FRR daemon restart) diff --git a/published/202005/20200525 How to Properly Install and Setup KDE Plasma on Arch Linux.md b/published/202005/20200525 How to Properly Install and Setup KDE Plasma on Arch Linux.md new file mode 100644 index 0000000000..93defdb7c9 --- /dev/null +++ b/published/202005/20200525 How to Properly Install and Setup KDE Plasma on Arch Linux.md @@ -0,0 +1,137 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12258-1.html) +[#]: subject: (How to Properly Install and Setup KDE Plasma on Arch Linux) +[#]: via: (https://itsfoss.com/install-kde-arch-linux/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 Arch Linux 上正确安装和设置 KDE Plasma? +====== + +我相信你是按照[这份很棒的指南安装来 Arch Linux][1] 的,这篇指南最后提到了 [GNOME 桌面][2]的安装步骤。 + +但现在,不是每个人都是 GNOME 的粉丝,有几个读者要求我们向他们展示如何在 [Arch Linux][4] 上配置 [KDE 桌面][3]。 + +因此,我创建了这个指南来演示如何在 Arch Linux 上正确安装和配置 KDE 桌面(也被称为 KDE Plasma桌面)的步骤。 + +### 如何在 Arch Linux 上安装和设置 KDE 桌面环境? + +![][5] + +请记住,KDE 不允许直接以 root 身份登录。如果你已经安装了 Arch Linux 并以 root 身份使用,你应该创建一个新的用户,并给它以 root 身份运行命令的 sudo 权限。 + +如果你只是最小化安装了 Arch Linux,那么你可能是以 TTY 终端方式登录的。如果你使用的是其他桌面环境,步骤也是一样的。 + +让我们开始吧! + +#### 步骤 1:创建一个 sudo 用户(如果你只有 root 用户) + +你可以使用 [useradd 命令][6]来创建一个新用户。我创建的用户名为 `dimitrios`(这是我的名字)。你可以使用与你的名字匹配的东西。 + +选项 `-m` 为新创建的用户创建一个主目录。 + +``` +useradd -m dimitrios +``` + +你还应该为这个用户设置一个密码。使用此命令: + +``` +passwd dimitrios +``` + +现在你已经创建了用户,给它 sudo 权限。首先,安装 sudo 和一个像 [nano][8] 这样的[命令行文本编辑器][7]。 + +``` +pacman -S sudo nano +``` + +sudo 的配置文件是 `/etc/sudoers`。该文件应该使用 `visudo` 来编辑,它会锁定 `sudoers` 文件,将编辑的内容保存到一个临时文件中,并在复制到 `/etc/sudoers` 之前检查该文件的语法。 + +要使用 `nano` 作为 `visudo` 编辑器,请这样设置: + +``` +EDITOR=nano visudo +``` + +像我的示例那样添加下面这一行,然后保存并退出。 + +``` +dimitrios ALL=(ALL) ALL +``` + +![Adding Sudoer in Arch Linux][9] + +保存你的更改,然后退出编辑器。你现在在 Arch Linux 上有了一个 sudo 用户。 + +#### 步骤 2 :安装 KDE Plasma 桌面 + +要运行 KDE 桌面,你需要以下软件包。 + + * [Xorg][10] 组 + * [KDE Plasma][3] 桌面环境 + * [Wayland][11] KDE Plasma 的会话 + * [KDE 应用程序][12]组(包括 KDE 特有的应用程序:Dolphin 管理器和其他有用的应用程序)。 + +你可以用下面的命令安装上述部分。 + +``` +pacman -S xorg plasma plasma-wayland-session kde-applications +``` + +安装后,启用显示管理器和网络管理器服务。 + +``` +systemctl enable sddm.service +systemctl enable NetworkManager.service +``` + +快完成了。关闭你的系统。 + +``` +shutdown now +``` + +重新打开系统电源,你应该会看到 KDE 的登录界面。你还记得为你的 sudo 用户设置的密码吗?用它来登录。 + +![Arch KDE Plasma Desktop][13] + +#### 接下来? + +你可能会想探索一下[基本的 pacman 命令][14],了解一下 [Arch 用户资源库][15],了解一下 [AUR 助手][16]。 + +希望这篇教程对你在 Arch Linux 上安装 KDE 桌面有所帮助。如果你在安装过程中遇到任何障碍或困难,请在下面的评论中告诉我们。 + +你最喜欢的桌面环境或窗口管理器是什么?请告诉我们,别忘了在我们的社交媒体上订阅。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-kde-arch-linux/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-9170-1.html +[2]: https://www.gnome.org/ +[3]: https://kde.org/plasma-desktop +[4]: https://www.archlinux.org/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/install-kde-arch-linux.png?ssl=1 +[6]: https://linuxhandbook.com/useradd-command/ +[7]: https://itsfoss.com/command-line-text-editors-linux/ +[8]: https://www.nano-editor.org/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/adding-sudoer-arch-linux.png?ssl=1 +[10]: https://wiki.archlinux.org/index.php/Xorg +[11]: https://wiki.archlinux.org/index.php/Wayland +[12]: https://www.archlinux.org/groups/x86_64/kde-applications/ +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/Arch-Plasma-desktop.jpg?fit=800%2C450&ssl=1 +[14]: https://itsfoss.com/pacman-command/ +[15]: https://linux.cn/article-12107-1.html +[16]: https://linux.cn/article-12019-1.html diff --git a/published/202005/20200525 Now You Can Run Linux Apps in Windows (Thanks to WSL).md b/published/202005/20200525 Now You Can Run Linux Apps in Windows (Thanks to WSL).md new file mode 100644 index 0000000000..21173f87f8 --- /dev/null +++ b/published/202005/20200525 Now You Can Run Linux Apps in Windows (Thanks to WSL).md @@ -0,0 +1,105 @@ +[#]: collector: (lujun9972) +[#]: translator: (lnrCoder) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12254-1.html) +[#]: subject: (Now You Can Run Linux Apps in Windows (Thanks to WSL)) +[#]: via: (https://itsfoss.com/run-linux-apps-windows-wsl/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +现在你可以在 Windows 中运行 Linux 应用了 +====== + +![](https://img.linux.net.cn/data/attachment/album/202005/27/111439z64u19z6ct6r46kb.jpg) + +微软最近的 “[Build 2020][1]” 开发者大会公布了一些有趣的公告。我不确定这该令人兴奋还是该令人怀疑 —— 但是微软,你现在比以往任何时候都受到我们的关注。 + +同时,在所有的这些公告中,能够在 WSL(Windows Subsystem for Linux)上运行 GUI 应用程序的功能备受关注。 + +更不要忘了 [Xamrin.Forms 更名为 MAUI 的尴尬结局][2],它与 [Nitrux Linux][4] 的 Uri Herrera 的现有开源项目([Maui Project][3])名字冲突。 + +以防你不清楚,WSL 是一种环境,可让你在 Windows 10 中获得 Linux 控制台的体验。它也是在 [Windows 中运行 Linux 命令的最佳方法][5]之一。 + +正如 [Liam Dawe][7] 认为的那样,通过博客文章([DirectX ❤ Linux][6])发布的公告可能是只是个公关诱饵。但是,仍然值得一提。 + +### WSL 上对 Linux GUI 应用程序的支持 + +![][8] + +最近,Microsoft 在在线开发者大会上宣布了 WSL(即 WSL 2)的一系列新功能。 + +[Windows 包管理器][9]、[Windows 终端 1.0][10],以及其他一些功能的引入是其亮点。 + +但是, WSL 2 对 GPU 硬件加速的支持非常重要。 + +那么,是否意味着你可以使用 WSL 在 Windows 上运行 Linux 应用程序呢?看起来像是。 + +微软计划通过使用全新的 Linux 内核驱动程序 `dxgkrnl` 来实现它。为了给你一个技术性的简报, 我在这里引用他们的公告中的描述: + +![Linux Kernel Driver Wsl][11] + +> dxgkrnl 是一个全新的 Linux 内核驱动程序,它将 `/dev/dxg` 设备提供给用户模式的 Linux。 `/dev/dxg` 提供了一组 IOCTL,它们与 Winodws 上的原生 WDDM D3DKMT 内核服务层非常相似。Linux 内核中的 dxgkrnl 通过 VM 总线连接到 Windows 主机上,并使用此 VM 总线连接与物理 GPU 进行通讯。 + +我不是这方面的专家,但这意味着 WSL 上的 Linux 应用程序将与原生的 Windows 应用程序一样可以访问 GPU。 + +针对 GUI 应用程序的支持将在今年秋季的晚些时候提供(而不是 2020 年 5 月的更新) —— 所以我们要看看什么时候提供。 + +微软专门针对的是那些希望在 Windows 上轻松使用 Linux IDE 的开发人员。谷歌也在瞄准同样的用户群,[将 GUI Linux 应用程序引入到 Chromebook][12]。 + +那么,对于那些坚持使用 Windows 的用户来说,这是个好消息。但是,这是真的吗? + +### 微软爱上了 Linux —— 真的吗? + +![Microsoft Loves Linux][13] + +他们在 Windows 上整合 Linux 环境来拥抱 Linux 及其优势的努力,绝对是一件好事。 + +但是,它真的能给**桌面 Linux 用户**带来什么好处呢?到目前为止,我还没有看到任何实际的好处。 + +在这里,你可以有不同的看法。但是,我认为 WSL 的开发对于 Linux 桌面用户来说没有真正的价值。至少,到目前为止没有。 + +有趣的是,[Linux Unplugged podcast][14] 上有人强调了微软的举动,认为这与他们的 EEE(拥抱、延伸和扑灭Embrace, extend, and extinguish)的思路是一致的。 + +可能吧,谁知道呢?当然,他们为实现这一目标而付出的努力值得赞赏 —— 同时又令人感到兴奋和神秘。 + +### 这是否以为着 Windows 用户将不必再转到 Linux? + +微软之所以在其平台上集成 Linux,是因为他们知道 Liunx 的能力,也知道开发人员(或用户)喜欢使用它的原因。 + +但是,随着 WSL 2 的更新,如果这种情况持续下去,我倾向于同意 Abhishek 的看法: + +> 最终,桌面 Linux 将被限制在 Windows 下,成为桌面应用程序…… + +好吧,当然,原生的体验暂时还是比较好的。而且,很难看到现有的 Linux 桌面用户会使用 Windows 来将其替代。但是,这仍然值得担心。 + +你如何看待这一切?我不认为 WSL 对于被迫使用 Windows 的用户有什么好处 —— 但是,从长远来看,你认为微软在 WSL 方面的进展本质上是敌意还是对 Linux 有帮助? + +在评论中让我知道你的想法! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/run-linux-apps-windows-wsl/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[lnrCoder](https://github.com/lnrCoder) +校对:[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://news.microsoft.com/build2020/ +[2]: https://itsfoss.com/microsoft-maui-kde-row/ +[3]: https://mauikit.org/ +[4]: https://itsfoss.com/nitrux-linux/ +[5]: https://itsfoss.com/run-linux-commands-in-windows/ +[6]: https://devblogs.microsoft.com/directx/directx-heart-linux/ +[7]: https://www.gamingonlinux.com/2020/05/microsoft-build-directx-and-linux-plus-more +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/Linux-GUI-app-Windows-WSL.png?ssl=1 +[9]: https://devblogs.microsoft.com/commandline/windows-package-manager-preview/ +[10]: https://devblogs.microsoft.com/commandline/windows-terminal-1-0/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/linux-kernel-driver-wsl.png?ssl=1 +[12]: https://itsfoss.com/linux-apps-chromebook/ +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/microsoft-loves-linux.jpg?ssl=1 +[14]: https://linuxunplugged.com/354 diff --git a/published/202005/20200526 How to write about open source software.md b/published/202005/20200526 How to write about open source software.md new file mode 100644 index 0000000000..fb883d8e59 --- /dev/null +++ b/published/202005/20200526 How to write about open source software.md @@ -0,0 +1,175 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12267-1.html) +[#]: subject: (How to write about open source software) +[#]: via: (https://opensource.com/article/20/5/write-about-open-source-software) +[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) + +如何为开源软件写作文章 +====== + +> 通过以下提示,成为一个更好的作者。 + +![](https://img.linux.net.cn/data/attachment/album/202005/31/115044ecfpxc2q9z0ca8wq.jpg) + +开始接触开源社区的一个方法就是写关于它的文章。你可以贡献技术文档,分享你如何使用软件,或者为我们社区写一篇文章。但是开始写作说起来容易做起来难。我听到的最常见的两个不写文章的借口是:“我没有什么新东西可写”和“我不是一个好的作者”。我在这里是为了打破这两个误区。 + +### 你应该写什么? + +> “寻找那些经常被遗漏的故事。” +> 埃里克·拉尔森 + +对于某些人来说,写作的最大障碍是找到要写的想法或话题。很容易就落入了这样的思维陷阱:“这个话题已经写过了,何必再麻烦。” + +我不是第一个写文章的人,也不会是最后一个。我带来的是我独特的视角和这些年来所学到的东西。曾经有人向我请教过一些关于写作入门的建议,或者是如何让自己的写作更上一层楼。我决定把这些建议变成一篇文章。 + +文如其人,没有人会以你的方式来述事,你的经验和观点可能正是别人所需要的。 + +这里有一些提示,可以帮助你想出一个主题: + +* 你最近学到了什么东西?写出你是如何学习的,你学到了什么,或使你感到惊讶的事情。 +* 你经常被问到的问题是什么?把答案写出来。 +* 你最近是否在搜索一篇怎么做的文章,但在搜索结果中,你对排名靠前的文章不满意?请写出你要找的文章。 +* 你是否参加过会议或研讨会?写一篇会后总结来说明你所学到的东西。 +* 你开始使用新工具了吗?写一份操作指南或入门指南。 + +### 你写的是什么类型的文章? + +有不同类型的文章,包括: + +* 技术文档 +* 操作指南 +* 博客 +* 白皮书或电子书 +* 回顾性的文章 + +内容的类型会影响你的写作风格和语气。博客更加非正式和是对话式的。而技术文档更正式,更具有指导性。 + +### 你是为谁而写的? + +每一篇文章都应该有一个单一的受众。受众是指你为之写作的对象是什么类型的人。在你开始写作之前,写下你的读者的一些特征是有助于写作的。重要的是要考虑到你要为谁写,以及你**不是为**谁写的 —— 确定你的目标受众将决定要包括哪些内容和不包括哪些内容。 + +例如,我在写这篇文章的时候,我设想的目标受众是这样的: + +* 有基本的写作和语法知识 +* 有兴趣提高写作能力 +* 在技术领域担任开发人员、销售工程师、客户经理或类似职位的工作 +* 不是经验丰富或资深的作者,可能在个人或工作博客上发表过几篇文章,想写更多的文章。 +* 非虚构写作 + +如果你有针对多个受众的内容,可以考虑针对不同的受众将其分解成不同的内容。对你的受众要考虑的一些方面: + +* 专业水平:新手、中级、高级 +* 作用:管理人员、个人贡献者 +* 目标:他们为什么要阅读这些? + +### 言语很重要 + +你选择的言语会对读者产生影响。晦涩难懂的词汇会使文章更难理解,不常见的词汇会让读者觉得自己很笨,某些词汇可能会不小心冒犯读者。作为一个作者,你的目标是避免所有这些。下面是怎么做的: + +#### 使用日常用语 + +不要把写作作为炫耀你的词汇量或你从“每日一字”台历上学到的单词的方式。写作是为了让读者能够理解。每一篇文章都有相关的阅读水平。如果你写的是技术文档,那么你的目标大约是初中的阅读水平。这并不意味着你的受众只有初中的教育水平。它意味着你的写作会更容易被人理解。你想让人们对这些言语过目不忘,还是想让他们觉得自己学到了什么?虽然你可以使用长而复杂的词汇,但并不意味着你应该这样做。使用简单的语言不一定意味着你的文章会很无聊。 + +使用 [Hemingway 应用][2]等工具来检查你的作品的可读性(它不是开源的,但很优秀)。比如说,在初稿之后,这篇文章被评定为五年级的阅读水平。Hemingway 还提供了如何改进写作的建议 —— 找出难以理解的句子或需要改变选词的地方。 + +如果你想要找出替代的词汇,可以查看 [Plain English Campaign][3] 的建议或 [Power Thesaurus][4] 的众包建议。 + +#### 知道应该规避哪些词 + +> “每次你想写‘非常’的时候,就用‘该死的’代替;你的编辑会把它删掉,而作品就会如它应有的那样。” +> 马克·吐温 + +在写教程或指南的时候,这里有一些要避免的词,包括“简单simple”、“容易easy”和“就这样just”。你是你所写的主题的专家,经过多年的实践,可能会觉得事情很简单。而初学者可能会觉得事情不“简单”,也不“容易”。你的读者可能会感到沮丧,因为他们觉得过程或解释并不简单。 + +你是否曾经因为无法理解作者的意思而不得不反复重读一个句子或段落?你有没有因为一篇文章对你来说没有意义而放弃过?我有过。 + +作为一个作者,你希望你的读者感到困惑或不理解吗?我希望不会。 + +在你的写作中要避免的其它词语: + +* 这件事That +* 真的Really +* 非常Very +* 所以So +* 为了In order to + +一般来说,这些词可以在不改变句子意思的情况下删除。 + +在我写完之后,我会在文档中搜索这些词。当我在这篇文章中搜索时,我发现了以下这句话: + +> “这并不意味着你的受众只有初中的教育水平*这件事*,而意味着你的写作会更容易被理解*这件事*。” + +这句话中出现了两个“这件事That”的例子。它们并没有给句子增加价值。它们可以被删除而不改变其含义。删除这些词汇可以缩短句子,并且更短的句子更容易理解。而说到短句,我还把它改写成了两句话。 + +> “这并不意味着你的受众只有初中的教育水平。它意味着你的写作会更容易被人理解。” + +#### 使用包容性语言 + +词语和短语的历史背景可能会导致人们感到被排斥或冒犯。在写作时,你要让读者感到被包容。当你使用包容性的语言时,会让读者感到被理解、被尊重,感觉被包容。我参考了 Buffer 中的这篇[关于使用包容性语言的指南][5]。 + +### 修订和编辑 + +> “几乎所有好的写作都是从糟糕的第一次努力开始的。你需要从某个地方开始。” +> 安妮·拉莫特 + +写作是一个迭代的过程。如果你认为作者们坐在办公桌前,在一个小时内就能完成一篇文章准备发表,那么请你再想一想。有些文章需要我花几个星期的时间来完成。以下是我的标准流程: + +* 写一个粗略的初稿。我说的粗略,我的意思是*粗陋*。写的时候不用担心语法问题。目的是让文字从我的脑海中浮现出来,写在纸上。这一步可能需要一个小时到几周的时间。 +* 将草稿放一段时间。这可能需要几个小时到几天的时间,这取决于出版时间线。 +* 审阅草稿。进行调整和编辑。 +* 征求反馈意见,可以是同事或朋友的反馈意见。在这个阶段的反馈中,我的重点是明确性。是否有意义?是否有什么令人困惑的地方?有什么缺失的部分? +* 纳入反馈意见。无论你的写作经验有多丰富,让其他作者审阅你的作品,都会让你的作品变得更好。 + +在这个阶段,我有了一个相当扎实的草稿。现在到了我最不喜欢的写作部分 —— 编辑。我之前提到的 Hemingway 应用不仅能告诉你阅读水平,还能提供改进写作的建议。我还使用 Grammarly 来帮助编辑语法。关于 Grammarly 的开源替代工具,请查看[语言工具网站][6]或这篇文章中的[开源写作工具][7]。 + +我的写作挑战之一就是适当地使用逗号。Grammarly 可以帮助我找出我缺失或滥用逗号的地方。Grammarly 发现了 43 个这篇文章的最终草稿的正确性问题。其中大部分是逗号错误。 + +![Errors identified by Grammarly][8] + +除了语法错误之外,该应用程序还提供了一些建议,以帮助提高清晰度、参与度和表达能力(其中一些功能可能在免费版中没有)。这包括单词选择和使用主动语气与被动语气等。有些建议我接受,有些则拒绝。在审查了所有的警报和建议后,Grammarly 会在各个方面进行反馈。 + +![Grammarly results][10] + +不要害怕寻求写作上的帮助。每一个好的作者背后都有一个好的编辑或好的编辑应用。 + +### 文体指南 + +文体指南为改善书面交流提供了标准。它们包括标点符号、语法和用词等方面。如果是为你的公司撰写文档,请检查一下公司是否有文体指南。如果没有文体指南,或者你是为自己写的,下面是一些常用的文体指南: + +* [芝加哥文体手册][11] +* [谷歌开发者文档指南][12] +* [微软写作文体指南][13] +* [美联社文体手册][14] + +写作是一种与社区分享自己的思想和知识的方式。开始写作的唯一方法就是开始打字。用这些建议来微调你的写作。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/write-about-open-source-software + +作者:[Dawn Parzych][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/dawnparzych +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/doc-dish-lead.png?itok=h3fCkVmU (Typewriter in the grass) +[2]: http://www.hemingwayapp.com/ +[3]: http://www.plainenglish.co.uk/the-a-z-of-alternative-words.html +[4]: https://www.powerthesaurus.org/ +[5]: https://open.buffer.com/inclusive-language-tech/ +[6]: https://languagetool.org/ +[7]: https://opensource.com/article/20/3/open-source-writing-tools +[8]: https://opensource.com/sites/default/files/uploads/grammarlyerrors.png (Errors identified by Grammarly) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://opensource.com/sites/default/files/uploads/grammarlyresults.png (Grammarly results) +[11]: https://www.chicagomanualofstyle.org/home.html +[12]: https://developers.google.com/style +[13]: https://docs.microsoft.com/en-us/style-guide/welcome/ +[14]: https://www.apstylebook.com/ diff --git a/published/20200511 Start using systemd as a troubleshooting tool.md b/published/20200511 Start using systemd as a troubleshooting tool.md new file mode 100644 index 0000000000..60bb8550d3 --- /dev/null +++ b/published/20200511 Start using systemd as a troubleshooting tool.md @@ -0,0 +1,264 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13452-1.html) +[#]: subject: (Start using systemd as a troubleshooting tool) +[#]: via: (https://opensource.com/article/20/5/systemd-troubleshooting-tool) +[#]: author: (David Both https://opensource.com/users/dboth) + +使用 systemd 作为问题定位工具 +====== + +> 虽然 systemd 并非真正的故障定位工具,但其输出中的信息为解决问题指明了方向。 + +![](https://img.linux.net.cn/data/attachment/album/202106/02/214321uqzzrqza9mlt9iam.jpg) + +没有人会认为 systemd 是一个故障定位工具,但当我的 web 服务器遇到问题时,我对 systemd 和它的一些功能的不断了解帮助我找到并规避了问题。 + +我遇到的问题是这样,我的服务器 yorktown 为我的家庭办公网络提供名称服务 、DHCP、NTP、HTTPD 和 SendMail 邮件服务,它在正常启动时未能启动 Apache HTTPD 守护程序。在我意识到它没有运行之后,我不得不手动启动它。这个问题已经持续了一段时间,我最近才开始尝试去解决它。 + +你们中的一些人会说,systemd 本身就是这个问题的原因,根据我现在了解的情况,我同意你们的看法。然而,我在使用 SystemV 时也遇到了类似的问题。(在本系列文章的 [第一篇][2] 中,我探讨了围绕 systemd 作为旧有 SystemV 启动程序和启动脚本的替代品所产生的争议。如果你有兴趣了解更多关于 systemd 的信息,也可以阅读 [第二篇][3] 和 [第三篇][4] 文章。)没有完美的软件,systemd 和 SystemV 也不例外,但 systemd 为解决问题提供的信息远远多于 SystemV。 + +### 确定问题所在 + +找到这个问题根源的第一步是确定 httpd 服务的状态: + +``` +[root@yorktown ~]# systemctl status httpd +● httpd.service - The Apache HTTP Server +   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) +   Active: failed (Result: exit-code) since Thu 2020-04-16 11:54:37 EDT; 15min ago +     Docs: man:httpd.service(8) +  Process: 1101 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE) + Main PID: 1101 (code=exited, status=1/FAILURE) +   Status: "Reading configuration..." +      CPU: 60ms + +Apr 16 11:54:35 yorktown.both.org systemd[1]: Starting The Apache HTTP Server... +Apr 16 11:54:37 yorktown.both.org httpd[1101]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to address 192.168.0.52:80 +Apr 16 11:54:37 yorktown.both.org httpd[1101]: no listening sockets available, shutting down +Apr 16 11:54:37 yorktown.both.org httpd[1101]: AH00015: Unable to open logs +Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE +Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Failed with result 'exit-code'. +Apr 16 11:54:37 yorktown.both.org systemd[1]: Failed to start The Apache HTTP Server. +[root@yorktown ~]# +``` + +这种状态信息是 systemd 的功能之一,我觉得比 SystemV 提供的任何功能都要有用。这里的大量有用信息使我很容易得出逻辑性的结论,让我找到正确的方向。我从旧的 `chkconfig` 命令中得到的是服务是否在运行,以及如果它在运行的话,进程 ID(PID)是多少。这可没多大帮助。 + +该状态报告中的关键条目显示,HTTPD 不能与 IP 地址绑定,这意味着它不能接受传入的请求。这表明网络启动速度不够快,因为 IP 地址还没有设置好,所以 HTTPD 服务还没有准备好与 IP 地址绑定。这是不应该发生的,所以我查看了我的网络服务的 systemd 启动配置文件;在正确的 `after` 和 `requires` 语句下,所有这些似乎都没问题。下面是我服务器上的 `/lib/systemd/system/httpd.service` 文件: + +``` +# Modifying this file in-place is not recommended, because changes +# will be overwritten during package upgrades. To customize the +# behaviour, run "systemctl edit httpd" to create an override unit. + +# For example, to pass additional options (such as -D definitions) to +# the httpd binary at startup, create an override unit (as is done by +# systemctl edit) and enter the following: + +# [Service] +# Environment=OPTIONS=-DMY_DEFINE + +[Unit] +Description=The Apache HTTP Server +Wants=httpd-init.service +After=network.target remote-fs.target nss-lookup.target httpd-init.service +Documentation=man:httpd.service(8) + +[Service] +Type=notify +Environment=LANG=C + +ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND +ExecReload=/usr/sbin/httpd $OPTIONS -k graceful +# Send SIGWINCH for graceful stop +KillSignal=SIGWINCH +KillMode=mixed +PrivateTmp=true + +[Install] +WantedBy=multi-user.target +``` + +`httpd.service` 单元文件明确规定,它应该在 `network.target` 和 `httpd-init.service`(以及其他)之后加载。我试着用 `systemctl list-units` 命令找到所有这些服务,并在结果数据流中搜索它们。所有这些服务都存在,应该可以确保在设置网络 IP 地址之前,httpd 服务没有加载。 + +### 第一个解决方案 + +在互联网上搜索了一下,证实其他人在 httpd 和其他服务也遇到了类似的问题。这似乎是由于其中一个所需的服务向 systemd 表示它已经完成了启动,但实际上它却启动了一个尚未完成的子进程。通过更多搜索,我想到了一个规避方法。 + +我搞不清楚为什么花了这么久才把 IP 地址分配给网卡。所以我想,如果我可以将 HTTPD 服务的启动推迟合理的一段时间,那么 IP 地址就会在那个时候分配。 + +幸运的是,上面的 `/lib/systemd/system/httpd.service` 文件提供了一些方向。虽然它说不要修改它,但是它还是指出了如何操作:使用 `systemctl edit httpd` 命令,它会自动创建一个新文件(`/etc/systemd/system/httpd.service.d/override.conf`)并打开 [GNU Nano][5] 编辑器(如果你对 Nano 不熟悉,一定要看一下 Nano 界面底部的提示)。 + +在新文件中加入以下代码并保存: + +``` +[root@yorktown ~]# cd /etc/systemd/system/httpd.service.d/ +[root@yorktown httpd.service.d]# ll +total 4 +-rw-r--r-- 1 root root 243 Apr 16 11:43 override.conf +[root@yorktown httpd.service.d]# cat override.conf +# Trying to delay the startup of httpd so that the network is +# fully up and running so that httpd can bind to the correct +# IP address +# +# By David Both, 2020-04-16 + +[Service] +ExecStartPre=/bin/sleep 30 +``` + +这个覆盖文件的 `[Service]` 段有一行代码,将 HTTPD 服务的启动时间推迟了 30 秒。下面的状态命令显示了等待时间里的服务状态: + +``` +[root@yorktown ~]# systemctl status httpd +● httpd.service - The Apache HTTP Server +   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) +  Drop-In: /etc/systemd/system/httpd.service.d +           └─override.conf +           /usr/lib/systemd/system/httpd.service.d +           └─php-fpm.conf +   Active: activating (start-pre) since Thu 2020-04-16 12:14:29 EDT; 28s ago +     Docs: man:httpd.service(8) +Cntrl PID: 1102 (sleep) +    Tasks: 1 (limit: 38363) +   Memory: 260.0K +      CPU: 2ms +   CGroup: /system.slice/httpd.service +           └─1102 /bin/sleep 30 + +Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server... +Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server. +[root@yorktown ~]# +``` + +这个命令显示了 30 秒延迟过后 HTTPD 服务的状态。该服务已经启动并正常运行。 + +``` +[root@yorktown ~]# systemctl status httpd +● httpd.service - The Apache HTTP Server +   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) +  Drop-In: /etc/systemd/system/httpd.service.d +           └─override.conf +           /usr/lib/systemd/system/httpd.service.d +           └─php-fpm.conf +   Active: active (running) since Thu 2020-04-16 12:15:01 EDT; 1min 18s ago +     Docs: man:httpd.service(8) +  Process: 1102 ExecStartPre=/bin/sleep 30 (code=exited, status=0/SUCCESS) + Main PID: 1567 (httpd) +   Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec" +    Tasks: 213 (limit: 38363) +   Memory: 21.8M +      CPU: 82ms +   CGroup: /system.slice/httpd.service +           ├─1567 /usr/sbin/httpd -DFOREGROUND +           ├─1569 /usr/sbin/httpd -DFOREGROUND +           ├─1570 /usr/sbin/httpd -DFOREGROUND +           ├─1571 /usr/sbin/httpd -DFOREGROUND +           └─1572 /usr/sbin/httpd -DFOREGROUND + +Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server... +Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server. +``` + +我本来可以实验下更短的延迟时间是否也能奏效,但是我的系统并不用那么严格,所以我觉得不这样做。目前系统的工作状态很可靠,所以我很高兴。 + +因为我收集了所有这些信息,我将其作为 Bug[1825554][6] 报告给红帽 Bugzilla。我相信报告 Bug 比抱怨 Bug 更有有用。 + +### 更好的解决方案 + +把这个问题作为 bug 上报几天后,我收到了回复,表示 systemd 只是一个管理工具,如果 httpd 需要在满足某些要求之后被拉起,需要在单元文件中表达出来。这个回复指引我去查阅 `httpd.service` 的手册页。我希望我能早点发现这个,因为它是比我自己想出的更优秀的解决方案。这种方案明确的针对了前置目标单元,而不仅仅是随机延迟。 + +来自 [httpd.service 手册页][7]: + +> **在启动时开启服务** +> +> `httpd.service` 和 `httpd.socket` 单元默认是 _禁用_ 的。为了在启动阶段开启 httpd 服务,执行:`systemctl enable httpd.service`。在默认配置中,httpd 守护进程会接受任何配置好的 IPv4 或 IPv6 地址的 80 口上的连接(如果安装了 mod_ssl,就会接受 443 端口上的 TLS 连接)。 +> +> 如果 httpd 被配置成依赖任一特定的 IP 地址(比如使用 `Listen` 指令),该地址可能只在启动阶段可用,又或者 httpd 依赖其他服务(比如数据库守护进程),那么必须配置该服务,以确保正确的启动顺序。 +> +> 例如,为了确保 httpd 在所有配置的网络接口配置完成之后再运行,可以创建一个带有以下代码段的 drop-in 文件(如上述): +> +> ``` +> [Unit] +> After=network-online.target +> Wants=network-online.target +> ``` + + +我仍然觉得这是个 bug,因为在 `httpd.conf` 配置文件中使用 Listen 指令是很常见的,至少在我的经验中。我一直在使用 Listen 指令,即使在只有一个 IP 地址的主机上,在多个网卡和 IP 地址的机器上这显然也是有必要的。在 `/usr/lib/systemd/system/httpd.service` 默认配置文件中加入上述几行,对不使用 `Listen` 指令的不会造成问题,对使用 `Listen` 指令的则会规避这个问题。 + +同时,我将使用建议的方法。 + +### 下一步 + +本文描述了一个我在服务器上启动 Apache HTTPD 服务时遇到的一个问题。它指引你了解我在解决这个问题上的思路,并说明了我是如何使用 systemd 来协助解决问题。我也介绍了我用 systemd 实现的规避方法,以及我按照我的 bug 报告得到的更好的解决方案。 + +如我在开头处提到的那样,这有很大可能是一个 systemd 的问题,特别是 httpd 启动的配置问题。尽管如此,systemd 还是提供了工具让我找到了问题的可能来源,并制定和实现了规避方案。两种方案都没有真正令我满意地解决问题。目前,这个问题根源依旧存在,必须要解决。如果只是在 `/usr/lib/systemd/system/httpd.service` 文件中添加推荐的代码,那对我来说是可行的。 + +在这个过程中我发现了一件事,我需要了解更多关于定义服务启动顺序的知识。我会在下一篇文章中探索这个领域,即本系列的第五篇。 + +### 资源 + +网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息。 + +- Fedora 项目有一篇切实好用的 [systemd 入门][8],它囊括了几乎所有你需要知道的关于如何使用 systemd 配置、管理和维护 Fedora 计算机的信息。 +- Fedora 项目也有一个不错的 [备忘录][9],交叉引用了过去 SystemV 命令和 systemd 命令做对比。 +- 关于 systemd 的技术细节和创建这个项目的原因,请查看 [Freedesktop.org][10] 上的 [systemd 描述][11]。 +- [Linux.com][12] 的“更多 systemd 的乐趣”栏目提供了更多高级的 systemd [信息和技巧][13]。 + +此外,还有一系列深度的技术文章,是由 systemd 的设计者和主要开发者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间,但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章: + + * [Rethinking PID 1][14] + * [systemd for Administrators,Part I][15] + * [systemd for Administrators,Part II][16] + * [systemd for Administrators,Part III][17] + * [systemd for Administrators,Part IV][18] + * [systemd for Administrators,Part V][19] + * [systemd for Administrators,Part VI][20] + * [systemd for Administrators,Part VII][21] + * [systemd for Administrators,Part VIII][22] + * [systemd for Administrators,Part IX][23] + * [systemd for Administrators,Part X][24] + * [systemd for Administrators,Part XI][25] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/systemd-troubleshooting-tool + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/find-file-linux-code_magnifying_glass_zero.png?itok=E2HoPDg0 (Magnifying glass on code) +[2]: https://opensource.com/article/20/4/systemd +[3]: https://opensource.com/article/20/4/systemd-startup +[4]: https://opensource.com/article/20/4/understanding-and-using-systemd-units +[5]: https://www.nano-editor.org/ +[6]: https://bugzilla.redhat.com/show_bug.cgi?id=1825554 +[7]: https://www.mankier.com/8/httpd.service#Description-Starting_the_service_at_boot_time +[8]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[9]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[10]: http://Freedesktop.org +[11]: http://www.freedesktop.org/wiki/Software/systemd +[12]: http://Linux.com +[13]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[14]: http://0pointer.de/blog/projects/systemd.html +[15]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[16]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[17]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[18]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[19]: http://0pointer.de/blog/projects/three-levels-of-off.html +[20]: http://0pointer.de/blog/projects/changing-roots +[21]: http://0pointer.de/blog/projects/blame-game.html +[22]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[23]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[24]: http://0pointer.de/blog/projects/instances.html +[25]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202006/20190218 Talk, then code.md b/published/202006/20190218 Talk, then code.md new file mode 100644 index 0000000000..5e4c56af1d --- /dev/null +++ b/published/202006/20190218 Talk, then code.md @@ -0,0 +1,55 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12319-1.html) +[#]: subject: (Talk, then code) +[#]: via: (https://dave.cheney.net/2019/02/18/talk-then-code) +[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) + +给开源项目贡献代码时:先讨论,再编码 +====== + +我所参与的开源项目遵循的是一种这样的理念,我把它描述为 “先讨论,再编码”。我认为一般来说这是开发软件的好方法,我想花一点时间来谈谈这种方法的好处。 + +### 避免伤害感情 + +先讨论你想做的改变最重要的原因是避免伤害感情。我经常看到一个贡献者闭门造车地提交了一个 PR,却发现他的努力工作被拒绝了。这可能有一堆原因:PR 太大了,PR 没有遵循本地风格,PR 修复了一个对项目不重要的问题或者最近间接修复了的问题,等等。 + +这些问题的根本原因都是缺乏沟通。“先讨论,再编码” 理念的目标不是阻碍你或给你带来挫折,而是确保一个功能第一次就能正确落地,而不至于产生大量的维护债务。无论是改动的作者,还是审查者,当一个改动突然出现时,并暗示说 “好吧,我已经做完了,你要做的就是合并它,对吧?”,先讨论可以让他们不必背负伤害感情的情绪负担。 + +### 讨论应该如何进行? + +每一个新功能或错误修复都应该在工作开始前与项目的维护者讨论。私下试验是可以的,但不要在没有讨论之前就发送修改。 + +对于简单的改动,“讨论” 的定义可以只是 GitHub 议题中的一个设计草图。如果你的 PR 修复了一个 bug,你应该链接到它修复的 bug。如果没有,你应该先提出一个 bug,等待维护者确认后再发送 PR。这可能看起来有点落后 —— 谁不希望一个 bug 被修复呢 —— 但考虑到这个 bug 可能是对软件工作方式的误解,也可能是一个更大问题的症状,这需要进一步调查。 + +对于比较复杂的改动,尤其是功能请求,我建议在发送代码之前,先分发一份设计文档并达成一致。这不一定是一个完整的文档,发一个议题,带个草图可能就足够了,但关键是在用代码搞定之前,先用文字达成一致。 + +在任何情况下,你都不应该继续发送你的代码,直到维护者同意你的方法是他们所满意的。拉取请求是日常生活,而不仅仅是为了赶着过节。 + +### 代码审查,而不是由委员会设计 + +代码审查不是争论设计的地方。这有两个原因。首先,大多数代码审查工具都不适合长长的评论会话,GitHub 的 PR 界面在这方面非常糟糕,Gerrit 比较好,但很少有管理员团队会维护 Gerrit 实例。更重要的是,在代码审查阶段就出现了分歧,说明大家对如何实现这个变化并没有达成一致。 + +* * * + +讨论你想写的代码,然后再写你所讨论的代码。请不要反其道而行之。 + +-------------------------------------------------------------------------------- + +via: https://dave.cheney.net/2019/02/18/talk-then-code + +作者:[Dave Cheney][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://dave.cheney.net/author/davecheney +[b]: https://github.com/lujun9972 +[1]: https://dave.cheney.net/2013/09/07/how-to-include-c-code-in-your-go-package (How to include C code in your Go package) +[2]: https://dave.cheney.net/2015/11/05/lets-talk-about-logging (Let’s talk about logging) +[3]: https://dave.cheney.net/2016/04/11/the-value-of-tdd (The value of TDD) +[4]: https://dave.cheney.net/2016/03/12/suggestions-for-contributing-to-an-open-source-project (Suggestions for contributing to an Open Source project) diff --git a/published/202006/20190510 Learn to change history with git rebase.md b/published/202006/20190510 Learn to change history with git rebase.md new file mode 100644 index 0000000000..339e4ef696 --- /dev/null +++ b/published/202006/20190510 Learn to change history with git rebase.md @@ -0,0 +1,605 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12271-1.html) +[#]: subject: (Learn to change history with git rebase!) +[#]: via: (https://git-rebase.io/) +[#]: author: (git-rebase https://git-rebase.io/) + +学习用 Git 变基来改变历史! +====== + +[Git][1] 核心的附加价值之一就是编辑历史记录的能力。与将历史记录视为神圣的记录的版本控制系统不同,在 Git 中,我们可以修改历史记录以适应我们的需要。这为我们提供了很多强大的工具,让我们可以像使用重构来维护良好的软件设计实践一样,编织良好的提交历史。这些工具对于新手甚至是有经验的 Git 用户来说可能会有些令人生畏,但本指南将帮助我们揭开强大的 git-rebase 的神秘面纱。 + +> 值得注意的是:一般建议不要修改公共分支、共享分支或稳定分支的历史记录。编辑特性分支和个人分支的历史记录是可以的,编辑还没有推送的提交也是可以的。在编辑完提交后,可以使用 `git push -f` 来强制推送你的修改到个人分支或特性分支。 + +尽管有这么可怕的警告,但值得一提的是,本指南中提到的一切都是非破坏性操作。实际上,在 Git 中永久丢失数据是相当困难的。本指南结尾介绍了在犯错误时进行纠正的方法。 + +### 设置沙盒 + +我们不想破坏你的任何实际的版本库,所以在整个指南中,我们将使用一个沙盒版本库。运行这些命令来开始工作。[^1] + +``` +git init /tmp/rebase-sandbox +cd /tmp/rebase-sandbox +git commit --allow-empty -m"Initial commit" +``` + +如果你遇到麻烦,只需运行 `rm -rf /tmp/rebase-sandbox`,并重新运行这些步骤即可重新开始。本指南的每一步都可以在新的沙箱上运行,所以没有必要重做每个任务。 + +### 修正最近的提交 + +让我们从简单的事情开始:修复你最近的提交。让我们向沙盒中添加一个文件,并犯个错误。 + +``` +echo "Hello wrold!" >greeting.txt +git add greeting.txt +git commit -m"Add greeting.txt" +``` + +修复这个错误是非常容易的。我们只需要编辑文件,然后用 `--amend` 提交就可以了,就像这样: + +``` +echo "Hello world!" >greeting.txt +git commit -a --amend +``` + +指定 `-a` 会自动将所有 Git 已经知道的文件进行暂存(例如 Git 添加的),而 `--amend` 会将更改的内容压扁到最近的提交中。保存并退出你的编辑器(如果需要,你现在可以修改提交信息)。你可以通过运行 `git show` 看到修复的提交。 + +``` +commit f5f19fbf6d35b2db37dcac3a55289ff9602e4d00 (HEAD -> master) +Author: Drew DeVault +Date: Sun Apr 28 11:09:47 2019 -0400 + + Add greeting.txt + +diff --git a/greeting.txt b/greeting.txt +new file mode 100644 +index 0000000..cd08755 +--- /dev/null ++++ b/greeting.txt +@@ -0,0 +1 @@ ++Hello world! +``` + +### 修复较旧的提交 + +`--amend` 仅适用于最近的提交。如果你需要修正一个较旧的提交会怎么样?让我们从相应地设置沙盒开始: + +``` +echo "Hello!" >greeting.txt +git add greeting.txt +git commit -m"Add greeting.txt" + +echo "Goodbye world!" >farewell.txt +git add farewell.txt +git commit -m"Add farewell.txt" +``` + +看起来 `greeting.txt ` 像是丢失了 `"world"`。让我们正常地写个提交来解决这个问题: + +``` +echo "Hello world!" >greeting.txt +git commit -a -m"fixup greeting.txt" +``` + +现在文件看起来正确,但是我们的历史记录可以更好一点 —— 让我们使用新的提交来“修复”(`fixup`)最后一个提交。为此,我们需要引入一个新工具:交互式变基。我们将以这种方式编辑最后三个提交,因此我们将运行 `git rebase -i HEAD~3`(`-i` 代表交互式)。这样会打开文本编辑器,如下所示: + +``` +pick 8d3fc77 Add greeting.txt +pick 2a73a77 Add farewell.txt +pick 0b9d0bb fixup greeting.txt + +# Rebase f5f19fb..0b9d0bb onto f5f19fb (3 commands) +# +# Commands: +# p, pick = use commit +# f, fixup = like "squash", but discard this commit's log message +``` + +这是变基计划,通过编辑此文件,你可以指导 Git 如何编辑历史记录。我已经将该摘要削减为仅与变基计划这一部分相关的细节,但是你可以在文本编辑器中浏览完整的摘要。 + +当我们保存并关闭编辑器时,Git 将从其历史记录中删除所有这些提交,然后一次执行一行。默认情况下,它将选取(`pick`)每个提交,将其从堆中召唤出来并添加到分支中。如果我们对此文件根本没有做任何编辑,则将直接回到起点,按原样选取每个提交。现在,我们将使用我最喜欢的功能之一:修复(`fixup`)。编辑第三行,将操作从 `pick` 更改为 `fixup`,并将其立即移至我们要“修复”的提交之后: + +``` +pick 8d3fc77 Add greeting.txt +fixup 0b9d0bb fixup greeting.txt +pick 2a73a77 Add farewell.txt +``` + +> **技巧**:我们也可以只用 `f` 来缩写它,以加快下次的速度。 + +保存并退出编辑器,Git 将运行这些命令。我们可以检查日志以验证结果: + +``` +$ git log -2 --oneline +fcff6ae (HEAD -> master) Add farewell.txt +a479e94 Add greeting.txt +``` + +### 将多个提交压扁为一个 + +在工作时,当你达到较小的里程碑或修复以前的提交中的错误时,你可能会发现写很多提交很有用。但是,在将你的工作合并到 `master` 分支之前,将这些提交“压扁”(`squash`)到一起以使历史记录更清晰可能很有用。为此,我们将使用“压扁”(`squash `)操作。让我们从编写一堆提交开始,如果要加快速度,只需复制并粘贴这些: + +``` +git checkout -b squash +for c in H e l l o , ' ' w o r l d; do + echo "$c" >>squash.txt + git add squash.txt + git commit -m"Add '$c' to squash.txt" +done +``` + +要制作出一个写着 “Hello,world” 的文件,要做很多事情!让我们开始另一个交互式变基,将它们压扁在一起。请注意,我们首先签出了一个分支来进行尝试。因此,因为我们使用 `git rebase -i master` 进行的分支,我们可以快速变基所有提交。结果: + +``` +pick 1e85199 Add 'H' to squash.txt +pick fff6631 Add 'e' to squash.txt +pick b354c74 Add 'l' to squash.txt +pick 04aaf74 Add 'l' to squash.txt +pick 9b0f720 Add 'o' to squash.txt +pick 66b114d Add ',' to squash.txt +pick dc158cd Add ' ' to squash.txt +pick dfcf9d6 Add 'w' to squash.txt +pick 7a85f34 Add 'o' to squash.txt +pick c275c27 Add 'r' to squash.txt +pick a513fd1 Add 'l' to squash.txt +pick 6b608ae Add 'd' to squash.txt + +# Rebase 1af1b46..6b608ae onto 1af1b46 (12 commands) +# +# Commands: +# p, pick = use commit +# s, squash = use commit, but meld into previous commit +``` + +> **技巧**:你的本地 `master` 分支独立于远程 `master` 分支而发展,并且 Git 将远程分支存储为 `origin/master`。结合这种技巧,`git rebase -i origin/master` 通常是一种非常方便的方法,可以变基所有尚未合并到上游的提交! + +我们将把所有这些更改压扁到第一个提交中。为此,将第一行除外的每个“选取”(`pick`)操作都更改为“压扁”(`squash`),如下所示: + +``` +pick 1e85199 Add 'H' to squash.txt +squash fff6631 Add 'e' to squash.txt +squash b354c74 Add 'l' to squash.txt +squash 04aaf74 Add 'l' to squash.txt +squash 9b0f720 Add 'o' to squash.txt +squash 66b114d Add ',' to squash.txt +squash dc158cd Add ' ' to squash.txt +squash dfcf9d6 Add 'w' to squash.txt +squash 7a85f34 Add 'o' to squash.txt +squash c275c27 Add 'r' to squash.txt +squash a513fd1 Add 'l' to squash.txt +squash 6b608ae Add 'd' to squash.txt +``` + +保存并关闭编辑器时,Git 会考虑片刻,然后再次打开编辑器以修改最终的提交消息。你会看到以下内容: + +``` +# This is a combination of 12 commits. +# This is the 1st commit message: + +Add 'H' to squash.txt + +# This is the commit message #2: + +Add 'e' to squash.txt + +# This is the commit message #3: + +Add 'l' to squash.txt + +# This is the commit message #4: + +Add 'l' to squash.txt + +# This is the commit message #5: + +Add 'o' to squash.txt + +# This is the commit message #6: + +Add ',' to squash.txt + +# This is the commit message #7: + +Add ' ' to squash.txt + +# This is the commit message #8: + +Add 'w' to squash.txt + +# This is the commit message #9: + +Add 'o' to squash.txt + +# This is the commit message #10: + +Add 'r' to squash.txt + +# This is the commit message #11: + +Add 'l' to squash.txt + +# This is the commit message #12: + +Add 'd' to squash.txt + +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# +# Date: Sun Apr 28 14:21:56 2019 -0400 +# +# interactive rebase in progress; onto 1af1b46 +# Last commands done (12 commands done): +# squash a513fd1 Add 'l' to squash.txt +# squash 6b608ae Add 'd' to squash.txt +# No commands remaining. +# You are currently rebasing branch 'squash' on '1af1b46'. +# +# Changes to be committed: +# new file: squash.txt +# +``` + +默认情况下,这是所有要压扁的提交的消息的组合,但是像这样将其保留肯定不是你想要的。不过,旧的提交消息在编写新的提交消息时可能很有用,所以放在这里以供参考。 + +> **提示**:你在上一节中了解的“修复”(`fixup`)命令也可以用于此目的,但它会丢弃压扁的提交的消息。 + +让我们删除所有内容,并用更好的提交消息替换它,如下所示: + +``` +Add squash.txt with contents "Hello, world" + +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# +# Date: Sun Apr 28 14:21:56 2019 -0400 +# +# interactive rebase in progress; onto 1af1b46 +# Last commands done (12 commands done): +# squash a513fd1 Add 'l' to squash.txt +# squash 6b608ae Add 'd' to squash.txt +# No commands remaining. +# You are currently rebasing branch 'squash' on '1af1b46'. +# +# Changes to be committed: +# new file: squash.txt +# +``` + +保存并退出编辑器,然后检查你的 Git 日志,成功! + +``` +commit c785f476c7dff76f21ce2cad7c51cf2af00a44b6 (HEAD -> squash) +Author: Drew DeVault +Date: Sun Apr 28 14:21:56 2019 -0400 + + Add squash.txt with contents "Hello, world" +``` + +在继续之前,让我们将所做的更改拉入 `master` 分支中,并摆脱掉这一草稿。我们可以像使用 `git merge` 一样使用 `git rebase`,但是它避免了创建合并提交: + +``` +git checkout master +git rebase squash +git branch -D squash +``` + +除非我们实际上正在合并无关的历史记录,否则我们通常希望避免使用 `git merge`。如果你有两个不同的分支,则 `git merge` 对于记录它们合并的时间非常有用。在正常工作过程中,变基通常更为合适。 + +### 将一个提交拆分为多个 + +有时会发生相反的问题:一个提交太大了。让我们来看一看拆分它们。这次,让我们写一些实际的代码。从一个简单的 C 程序 [^2] 开始(你仍然可以将此代码段复制并粘贴到你的 shell 中以快速执行此操作): + +``` +cat <main.c +int main(int argc, char *argv[]) { + return 0; +} +EOF +``` + +首先提交它: + +``` +git add main.c +git commit -m"Add C program skeleton" +``` + +然后把这个程序扩展一些: + +``` +cat <main.c +#include <stdio.h> + +const char *get_name() { + static char buf[128]; + scanf("%s", buf); + return buf; +} + +int main(int argc, char *argv[]) { + printf("What's your name? "); + const char *name = get_name(); + printf("Hello, %s!\n", name); + return 0; +} +EOF +``` + +提交之后,我们就可以准备学习如何将其拆分: + +``` +git commit -a -m"Flesh out C program" +``` + +第一步是启动交互式变基。让我们用 `git rebase -i HEAD~2` 来变基这两个提交,给出的变基计划如下: + +``` +pick 237b246 Add C program skeleton +pick b3f188b Flesh out C program + +# Rebase c785f47..b3f188b onto c785f47 (2 commands) +# +# Commands: +# p, pick = use commit +# e, edit = use commit, but stop for amending +``` + +将第二个提交的命令从 `pick` 更改为 `edit`,然后保存并关闭编辑器。Git 会考虑一秒钟,然后向你建议: + +``` +Stopped at b3f188b... Flesh out C program +You can amend the commit now, with + + git commit --amend + +Once you are satisfied with your changes, run + + git rebase --continue +``` + +我们可以按照以下说明为提交*添加*新的更改,但我们可以通过运行 `git reset HEAD^` 来进行“软重置” [^3]。如果在此之后运行 `git status`,你将看到它取消了提交最新的提交,并将其更改添加到工作树中: + +``` +Last commands done (2 commands done): + pick 237b246 Add C program skeleton + edit b3f188b Flesh out C program +No commands remaining. +You are currently splitting a commit while rebasing branch 'master' on 'c785f47'. + (Once your working directory is clean, run "git rebase --continue") + +Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git checkout -- ..." to discard changes in working directory) + + modified: main.c + +no changes added to commit (use "git add" and/or "git commit -a") +``` + +为了对此进行拆分,我们将进行*交互式提交*。这使我们能够选择性地仅提交工作树中的特定更改。运行 `git commit -p` 开始此过程,你将看到以下提示: + +``` +diff --git a/main.c b/main.c +index b1d9c2c..3463610 100644 +--- a/main.c ++++ b/main.c +@@ -1,3 +1,14 @@ ++#include <stdio.h> ++ ++const char *get_name() { ++ static char buf[128]; ++ scanf("%s", buf); ++ return buf; ++} ++ + int main(int argc, char *argv[]) { ++ printf("What's your name? "); ++ const char *name = get_name(); ++ printf("Hello, %s!\n", name); + return 0; + } +Stage this hunk [y,n,q,a,d,s,e,?]? +``` + +Git 仅向你提供了一个“大块”(即单个更改)以进行提交。不过,这太大了,让我们使用 `s` 命令将这个“大块”拆分成较小的部分。 + +``` +Split into 2 hunks. +@@ -1 +1,9 @@ ++#include ++ ++const char *get_name() { ++ static char buf[128]; ++ scanf("%s", buf); ++ return buf; ++} ++ + int main(int argc, char *argv[]) { +Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? +``` + +> **提示**:如果你对其他选项感到好奇,请按 `?` 汇总显示。 + +这个大块看起来更好:单一、独立的更改。让我们按 `y` 来回答问题(并暂存那个“大块”),然后按 `q` 以“退出”交互式会话并继续进行提交。会弹出编辑器,要求输入合适的提交消息。 + +``` +Add get_name function to C program + +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# +# interactive rebase in progress; onto c785f47 +# Last commands done (2 commands done): +# pick 237b246 Add C program skeleton +# edit b3f188b Flesh out C program +# No commands remaining. +# You are currently splitting a commit while rebasing branch 'master' on 'c785f47'. +# +# Changes to be committed: +# modified: main.c +# +# Changes not staged for commit: +# modified: main.c +# +``` + +保存并关闭编辑器,然后我们进行第二次提交。我们可以执行另一次交互式提交,但是由于我们只想在此提交中包括其余更改,因此我们将执行以下操作: + +``` +git commit -a -m"Prompt user for their name" +git rebase --continue +``` + +最后一条命令告诉 Git 我们已经完成了此提交的编辑,并继续执行下一个变基命令。这样就行了!运行 `git log` 来查看你的劳动成果: + +``` +$ git log -3 --oneline +fe19cc3 (HEAD -> master) Prompt user for their name +659a489 Add get_name function to C program +237b246 Add C program skeleton +``` + +### 重新排序提交 + +这很简单。让我们从设置沙箱开始: + +``` +echo "Goodbye now!" >farewell.txt +git add farewell.txt +git commit -m"Add farewell.txt" + +echo "Hello there!" >greeting.txt +git add greeting.txt +git commit -m"Add greeting.txt" + +echo "How're you doing?" >inquiry.txt +git add inquiry.txt +git commit -m"Add inquiry.txt" +``` + +现在 `git log` 看起来应如下所示: + +``` +f03baa5 (HEAD -> master) Add inquiry.txt +a4cebf7 Add greeting.txt +90bb015 Add farewell.txt +``` + +显然,这都是乱序。让我们对过去的 3 个提交进行交互式变基来解决此问题。运行 `git rebase -i HEAD~3`,这个变基规划将出现: + +``` +pick 90bb015 Add farewell.txt +pick a4cebf7 Add greeting.txt +pick f03baa5 Add inquiry.txt + +# Rebase fe19cc3..f03baa5 onto fe19cc3 (3 commands) +# +# Commands: +# p, pick = use commit +# +# These lines can be re-ordered; they are executed from top to bottom. +``` + +现在,解决方法很简单:只需按照你希望提交出现的顺序重新排列这些行。应该看起来像这样: + +``` +pick a4cebf7 Add greeting.txt +pick f03baa5 Add inquiry.txt +pick 90bb015 Add farewell.txt +``` + +保存并关闭你的编辑器,而 Git 将为你完成其余工作。请注意,在实践中这样做可能会导致冲突,参看下面章节以获取解决冲突的帮助。 + +### git pull --rebase + +如果你一直在由上游更新的分支 ``(比如说原始远程)上做一些提交,通常 `git pull` 会创建一个合并提交。在这方面,`git pull` 的默认行为等同于: + +``` +git fetch origin +git merge origin/ +``` + +假设本地分支 `` 配置为从原始远程跟踪 `` 分支,即: + +``` +$ git config branch..remote +origin +$ git config branch..merge +refs/heads/ +``` +还有另一种选择,它通常更有用,并且会让历史记录更清晰:`git pull --rebase`。与合并方式不同,这基本上 [^4] 等效于以下内容: + +``` +git fetch origin +git rebase origin/ +``` + +合并方式更简单易懂,但是如果你了解如何使用 `git rebase`,那么变基方式几乎可以做到你想要做的任何事情。如果愿意,可以将其设置为默认行为,如下所示: + +``` +git config --global pull.rebase true +``` + +当你执行此操作时,从技术上讲,你在应用我们在下一节中讨论的过程……因此,让我们也解释一下故意执行此操作的含义。 + +### 使用 git rebase 来变基 + +具有讽刺意味的是,我最少使用的 Git 变基功能是它以之命名的功能:变基分支。假设你有以下分支: + +``` +A--B--C--D--> master + \--E--F--> feature-1 + \--G--> feature-2 +``` + +事实证明,`feature-2` 不依赖于 `feature-1` 的任何更改,它依赖于提交 E,因此你可以将其作为基础脱离 `master`。因此,解决方法是: + +``` +git rebase --onto master feature-1 feature-2 +``` + +非交互式变基对所有牵连的提交都执行默认操作(`pick`)[^5] ,它只是简单地将不在 `feature-1` 中的 `feature-2` 中提交重放到 `master` 上。你的历史记录现在看起来像这样: + +``` +A--B--C--D--> master + | \--G--> feature-2 + \--E--F--> feature-1 +``` + +### 解决冲突 + +解决合并冲突的详细信息不在本指南的范围内,将来请你注意另一篇指南。假设你熟悉通常的解决冲突的方法,那么这里是专门适用于变基的部分。 + +有时,在进行变基时会遇到合并冲突,你可以像处理其他任何合并冲突一样处理该冲突。Git 将在受影响的文件中设置冲突标记,`git status` 将显示你需要解决的问题,并且你可以使用 `git add` 或 `git rm` 将文件标记为已解决。但是,在 `git rebase` 的上下文中,你应该注意两个选项。 + +首先是如何完成冲突解决。解决由于 `git merge` 引起的冲突时,与其使用 `git commit` 那样的命令,更适当的变基命令是 `git rebase --continue`。但是,还有一个可用的选项:`git rebase --skip`。 这将跳过你正在处理的提交,它不会包含在变基中。这在执行非交互性变基时最常见,这时 Git 不会意识到它从“其他”分支中提取的提交是与“我们”分支上冲突的提交的更新版本。 + +### 帮帮我! 我把它弄坏了! + +毫无疑问,变基有时会很难。如果你犯了一个错误,并因此而丢失了所需的提交,那么可以使用 `git reflog` 来节省下一天的时间。运行此命令将向你显示更改一个引用(即分支和标记)的每个操作。每行显示你的旧引用所指向的内容,你可对你认为丢失的 Git 提交执行 `git cherry-pick`、`git checkout`、`git show` 或任何其他操作。 + +[^1]: 我们添加了一个空的初始提交以简化本教程的其余部分,因为要对版本库的初始提交进行变基需要特殊的命令(即` git rebase --root`)。 +[^2]: 如果要编译此程序,请运行 `cc -o main main.c`,然后运行 `./main` 查看结果。 +[^3]: 实际上,这是“混合重置”。“软重置”(使用 `git reset --soft` 完成)将暂存更改,因此你无需再次 `git add` 添加它们,并且可以一次性提交所有更改。这不是我们想要的。我们希望选择性地暂存部分更改,以拆分提交。 +[^4]: 实际上,这取决于上游分支本身是否已变基或删除/压扁了某些提交。`git pull --rebase` 尝试通过在 `git rebase` 和 `git merge-base` 中使用 “复刻点fork-point” 机制来从这种情况中恢复,以避免变基非本地提交。 +[^5]: 实际上,这取决于 Git 的版本。直到 2.26.0 版,默认的非交互行为以前与交互行为稍有不同,这种方式通常并不重要。 + +-------------------------------------------------------------------------------- + +via: https://git-rebase.io/ + +作者:[git-rebase][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://git-rebase.io/ +[b]: https://github.com/lujun9972 +[1]: https://git-scm.com/ +[2]: https://git-scm.com/docs/git-rebase + diff --git a/published/202006/20190814 How to install Python on Windows.md b/published/202006/20190814 How to install Python on Windows.md new file mode 100644 index 0000000000..b49ab0d1de --- /dev/null +++ b/published/202006/20190814 How to install Python on Windows.md @@ -0,0 +1,195 @@ +[#]: collector: (lujun9972) +[#]: translator: (011011100010110101101111) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12335-1.html) +[#]: subject: (How to install Python on Windows) +[#]: via: (https://opensource.com/article/19/8/how-install-python-windows) +[#]: author: (Seth Kenlon https://opensource.com/users/sethhttps://opensource.com/users/greg-p) + +如何在 Windows 上安装 Python +====== + +> 安装 Python,启动 IDE,然后你就可以在 Windows 系统下进行编程了。 + +![](https://img.linux.net.cn/data/attachment/album/202006/20/232632iggga8agp5gablg5.jpg) + +你是否想学习编程呢?可以从 [Python][2] 开始,它因为简洁的语法和面向对象的特性而非常受欢迎,是最常见的编程语言之一。而且 Python 是一门解释型语言,这意味着你无需知道如何把 Python 代码编译为机器语言 —— Python 会帮你做到这一点,从而使你能够在编写代码的同时立即进行测试。 + +但是你也不能仅仅因为 Python 学习起来简单而低估了它强大的潜能,无论是在[电影][4][工作室][5]、视频游戏工作室,还是在金融机构、IT 机构、制造业,都有 Python 的身影,甚至很多业余爱好者、[艺术家][6]、教师和许多其他人都使用 Python。 + +另一方面,Python 也是一门严肃的编程语言,学习它需要付出和实践。还有,你什么都不需要马上做,就几乎可以在任何计算机平台上安装并尝试使用 Python ,因此,如果你使用的是 Windows 操作系统,那本文正适合你。 + +如果你使用的是开源的 Linux 操作系统,那你可以 [在 Linux 上安装][7] 并 [尝试使用 Python][8]。 + +### 如何获取 Python + +你可以从 [Python 官方网站][9] 上去下载 Python。在 Python 官方网站下载页,可以将鼠标悬停在 “Downloads” 按钮上,待菜单展开后,再将鼠标悬停在 “Windows” 选项,最后点击按钮就可以下载最新版的 Python 了。 + +![Downloading Python on Windows][10] + +或者你也可以直接点击 “Downloads” 按钮,然后在下载页中选择特定的版本去下载。 + +### 安装 Python + +下载好安装包后,直接打开就可以启动安装程序了。 + +安装时,选择默认的安装路径比较好,最重要的是要将 Python 添加到搜索路径中,否则 Python 应用程序不知道它该从哪里找到 Python 必须的运行时环境;默认认安装时并没有选中这一项,需要手动勾选安装窗口的 “Add Python 3.7 to Path” ,然后点击继续。 + +![Select "Add Python 3 to PATH"][11] + +由于 Windows 需要经过你的批准才会允许安装非微软官方发行的应用程序,因此你必须要在弹出 “User Account Control”(UAC) 系统提示窗口的时候 点击 “Yes” 来继续完成安装。 + +![Windows UAC][12] + +这时候你就需要耐心等待,系统会自动将 Python 软件包分发到合适的位置,等待过后,也就意味着你已经成功的安装了 Python ,你就可以愉快的与 Python 玩耍了! + +### 安装一个 IDE + +虽然说你仅需要一个文本编辑器,就可以开始编写 Python 代码了,但是我依然建议你使用 IDE(集成开发环境)来进行开发,这样开发起来就会变得方便很多。IDE 会将文本编辑器和一些好用的 Python 功能集成到一起,使用起来非常友好。你可以考虑选择 IDLE 3 或者 NINJA-IDE 来作为你的 IDE。 + +#### IDLE 3 + +Python 自带一款 IDE,名字叫 IDLE。虽然你可以使用任何文本编辑器编写 Python 代码,但 IDE 通常会提供 [Notepad++][13] 之类的纯文本编辑器所没有的代码高亮、语法检测等功能,甚至在 IDE 里可以直接通过鼠标点击 “Run” 按钮就能快速运行 Python 代码。 + +想要启动 IDLE ,可以点击 Windows 的 “开始” (或者 “Windows”)按钮,然后输入 `python` 来进行搜索。这时候可能会搜索到多个选项,选择 IDLE 启动就好了。 + +![IDLE 3 IDE][14] + +如果在 “开始” 菜单中没有搜到,你也可以在 “开始” 菜单输入 `cmd` (或同时按下键盘 `win + R` 键) 来启动 Windows 命令提示符,然后输入下面命令来启动 IDLE : + +``` +C:\Windows\py.exe +``` + +如果还是无法启动的话,可是试着重新安装 Python ,安装时记得务必要在安装向导中选中 “Add Python to PATH”。详细说明,可以参考 [Python 官方文档][15] 。 + +#### Ninja-IDE + +如果你已经有一些编程经验,而且你觉得 IDLE 对你来说有些简陋的话,你也可以试试 [Ninja-IDE][16]。 Ninja-IDE 是一款非常出色的 Python IDE,它具有代码高亮功能,并且它会自动帮你检测诸如拼写错误、引号或括号缺失以及其他语法错误。而且它还可以显示行号(调试的时候会非常有用)、缩进标记甚至可以直接通过点击 “Run” 按钮来运行你的代码。 + +![Ninja-IDE][17] + +如果要安装 Ninja-IDE ,你可以访问 Ninja-IDE 的官网 [下载 Windows 安装程序][18] 。步骤跟安装 Python 大同小异:下载安装包、允许 Windows 安装非微软官方的应用程序,然后等待完成安装即可。 + +Ninja-IDE 安装完成后,双击 Windows 桌面或开始菜单下的 Ninja-IDE 就可以启动了。 + +### 告诉 Python 怎么做 + +关键字能让 Python 知道你想要做什么。在 IDLE 或者 Ninja-IDE ,打开 “文件” 菜单,创建一个新文件。 + +在 Ninja-IDE 中,不要创建一个新项目,而是单独创建一个新文件就可以了。 + +在你用 IDLE 或者 Ninja-IDE 新建的文件中,输入以下代码: + +``` +print("Hello world.") +``` + +* 如果你使用的是 IDLE ,请点击 “运行” 菜单,选择 “运行模块” 选项来运行你的程序。 +* 如果你使用的是 Ninja ,请单击左侧按钮栏中的 “运行文件” 按钮。 + +![Running code in Ninja-IDE][19] + +任何时间当你想要执行代码,IDE 都会提示你先保存当前正在处理的文件,然后再继续。 + +`print` 关键字会告诉 Python 打印出你在括号和引号中输入的所有文本。 + +但是别高兴地太早,Python 的核心库也就只能访问 `print` 和 `help` 之类的基本关键字、函数等。 + +如果想要使用更多的关键字和函数,你就需要使用 `import` 关键字去加载它们。好了,先在你的 IDLE 或者 Ninja 中新建一个文件,命名为 `pen.py` 。 + +**警告**:不要把你新建的文件命名为 `turtle.py` ,因为 `turtle.py` 是包含了你要控制的 turtle 程序的文件名称,使用 `turtle.py` 作为文件名会让 Python 感到困惑,因为它以为你想要引入你自己的文件。 + +在你新建的文件中输入一下代码,并运行: + +``` +import turtle +``` + +[Turtle][20] 是一个用起来非常有意思的模块. 把这段代码添加到你的文件内: + +``` +turtle.begin_fill() +turtle.forward(100) +turtle.left(90) +turtle.forward(100) +turtle.left(90) +turtle.forward(100) +turtle.left(90) +turtle.forward(100) +turtle.end_fill() +``` + +来看看你可以使用 turtle 模块来绘制出哪些图案。 + +想要清空 turtle 绘制的区域的话,你可以使用 `turtle.clear()` 函数。那你知道 `turtle.color("blue")` 是用来做什么的吗? + +我们来试一下更复杂点的程序: + +``` +import turtle as t +import time + +t.color("blue") +t.begin_fill() + +counter = 0 + +while counter < 4: +    t.forward(100) +    t.left(90) +    counter = counter+1 + +t.end_fill() +time.sleep(2) +``` + +给你个挑战,试试修改代码,让它得到下图所示的结果: + +![Example Python turtle output][21] + +当你完成这段代码后,你就可以继续学习更多有意思的模块了。这个 [入门级骰子游戏][22] 就是个不错的开始。 + +### 保持 Pythonic + +Python 是一门非常有趣的语言,它的模块几乎能实现所有你想要实现的功能。正如你所看到的,Python 入门很容易,只要你对自己有耐心,很快就会发现自己在理解和编写 Python 时能像写汉字一样流畅。你可以多阅读关于 [Python 的文章][23],试着自己编写一些小片段,然后看看 Python 会执行出什么结果。如果想要把 Python 真正融合到你实际工作中,你可以试试 Linux ,Linux 具有在本地可编写脚本的功能,而其他系统却没有。 + +祝你好运,记得保持 Pythonic。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/8/how-install-python-windows + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[LiuWenlong](https://github.com/011011100010110101101111) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/sethhttps://opensource.com/users/greg-p +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop.png?itok=pGfEfu2S (Hands programming) +[2]: https://www.python.org/ +[3]: https://opensource.com/article/19/7/get-modular-python-classes +[4]: https://github.com/edniemeyer/weta_python_db +[5]: https://www.python.org/about/success/ilm/ +[6]: https://opensource.com/article/19/7/rgb-cube-python-scribus +[7]: https://opensource.com/article/19/7/ways-get-started-linux +[8]: https://opensource.com/article/17/10/python-101 +[9]: https://www.python.org/downloads/ +[10]: https://opensource.com/sites/default/files/uploads/win-python-install.jpg (Downloading Python on Windows) +[11]: https://opensource.com/sites/default/files/uploads/win-python-path.jpg (Select "Add Python 3 to PATH") +[12]: https://opensource.com/sites/default/files/uploads/win-python-publisher.jpg (Windows UAC) +[13]: https://notepad-plus-plus.org/ +[14]: https://opensource.com/sites/default/files/uploads/idle3.png (IDLE 3 IDE) +[15]: http://docs.python.org/3/using/windows.html +[16]: http://ninja-ide.org/ +[17]: https://opensource.com/sites/default/files/uploads/win-python-ninja.jpg (Ninja-IDE) +[18]: http://ninja-ide.org/downloads/ +[19]: https://opensource.com/sites/default/files/uploads/ninja_run.png (Running code in Ninja-IDE) +[20]: https://opensource.com/life/15/8/python-turtle-graphics +[21]: https://opensource.com/sites/default/files/uploads/win-python-idle-turtle.jpg (Example Python turtle output) +[22]: https://opensource.com/article/17/10/python-101#python-101-dice-game +[23]: https://opensource.com/sitewide-search?search_api_views_fulltext=Python diff --git a/published/202006/20190816 Cockpit and the evolution of the Web User Interface.md b/published/202006/20190816 Cockpit and the evolution of the Web User Interface.md new file mode 100644 index 0000000000..779df7312d --- /dev/null +++ b/published/202006/20190816 Cockpit and the evolution of the Web User Interface.md @@ -0,0 +1,169 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12324-1.html) +[#]: subject: (Cockpit and the evolution of the Web User Interface) +[#]: via: (https://fedoramagazine.org/cockpit-and-the-evolution-of-the-web-user-interface/) +[#]: author: (Shaun Assam https://fedoramagazine.org/author/sassam/) + +Cockpit 及其网页用户界面的演变 +====== + +![][1] + +3 年多以前,Fedora 杂志发表了一篇题为《[Cockpit 概览][2]》的文章。从那时起,Cockit 的界面有了一些引人注目的变化。今天的 Cockpit 更加简洁,更大的字体更好地利用了屏幕的空间。 + +本文将介绍它的用户界面的一些变化。还将探讨一些在网页界面中可用的通用工具,以简化那些单调的系统管理员任务。 + +### Cockpit 驾驶舱安装 + +Cockpit 可以使用 `dnf install cockpit` 命令安装。这提供了一个最小的设置,提供了使用该界面所需的基本工具。 + +另一个选择是安装 “Headless Management” 组,这将安装用于扩展 Cockpit 功能的附加包。它包括用于 NetworkManager、软件包、磁盘和 SELinux 管理的扩展。 + +运行以下命令,在启动时启用 Web 服务并打开防火墙端口: + +``` +$ sudo systemctl enable --now cockpit.socket +Created symlink /etc/systemd/system/sockets.target.wants/cockpit.socket -> /usr/lib/systemd/system/cockpit.socket + +$ sudo firewall-cmd --permanent --add-service cockpit +success +$ sudo firewall-cmd --reload +success +``` + +### 登录网页界面 + +要访问网页界面,打开你最喜欢的浏览器,在地址栏中输入该服务器的域名或 IP,然后输入服务端口(9090)。由于 Cockpit 使用 HTTPS,安装过程中会创建一个自签证书来加密密码和其他敏感数据。你可以安全地接受这个证书,或者向你的系统管理员或受信任的来源请求 CA 证书。 + +一旦证书被接受,就会出现新改进的登录屏幕。长期使用的用户会注意到用户名和密码字段已被移到顶部。此外,凭证字段后面的白色背景会立即吸引用户的注意力。 + +![][3] + +自上一篇文章后,登录界面增加了一个功能,就是用 `sudo` 权限登录 —— 如果你的账号是 `wheel` 组的成员。勾选 “对于特权任务,重用我的密码” 旁边的方框,就可以提升你的权限。 + +登录界面的另一个版本是连接到同样运行 Cockpit Web 服务的远程服务器的选项。点击 “其他选项” 并输入远程机器的主机名或 IP 地址,从本地浏览器管理它。 + +### 主屏幕视图 + +一开始,我们就会看到基本概述,带有常见的系统信息,这包括机器的品牌和型号、操作系统、系统是否是最新的,等等。 + +![][4] + +点击系统的品牌/型号会显示硬件信息,如 BIOS/固件。它还包括与 `lspci` 中可以看到的组件的详情。 + +![][5] + +点击任何一个选项,右边都会显示该设备的详细信息。例如,“CPU 核心百分比” 选项显示了用户和内核使用了多少 CPU 核心的详细信息。此外,“内存和交换” 图表显示了系统内存的使用量、缓存量和交换分区的活动量。“磁盘 I/O” 和 “网络流量” 图表连到了 Cockpit 的 “存储和网络” 部分。这些内容将在接下来详细探讨系统工具的一篇文章中重新探讨。 + +#### SSH 密钥和认证 + +由于安全是系统管理员的关键因素,Cockpit 现在有了查看机器 MD5 和 SHA256 密钥指纹的选项。点击 “显示指纹” 选项可以显示服务器的 ECDSA、ED25519 和 RSA 指纹密钥。 + +![][6] + +你也可以通过点击右上角的用户名,选择“验证”,添加自己的密钥。点击 “添加密钥”,可以在其他系统上验证该机器。你也可以通过点击右侧的 “X” 按钮,撤销你在 Cockpit Web 服务中的权限。 + +![][7] + +#### 更改主机名和加入域 + +更改主机名可以在主页上一键解决。单击当前显示的主机名,并在“更改主机名”框中输入新名称。最新的功能之一是提供了一个 “简称” 的选项。 + +Cockpit 增加的另一个功能是可以连接到目录服务器。点击 “加入域”,会出现一个弹窗,要求提供域地址或名称、组织单位(可选)和域管理员的凭证。“Domain Membership” 组提供了加入 LDAP 服务器所需的所有包,包括 FreeIPA,以及流行的 Active Directory。 + +要退出域,请点击域名,然后点击 “离开域”。将会出现一个警告,解释一旦系统不再在域上将会发生的变化。要确认,点击红色的 “离开域” 按钮。 + +![][8] + +#### 配置 NTP 和系统日期和时间 + +使用命令行和编辑配置文件绝对可以完成最大限度的调整。然而,有些时候,一些更直接的方法就足够了。通过 Cockpit,你可以选择手动设置或使用 NTP 自动设置系统的日期和时间。一旦同步,右边的信息图标就会由红色变成蓝色。如果你手动设置日期和时间,该图标将消失。 + +要更改时区,请输入洲,下面会弹出城市列表。 + +![][9] + +#### 关机和重启 + +你可以在 Cockpit 的主屏幕上轻松关闭和重启服务器。你也可以延迟关机/重启,并发送消息警告用户。 + +![][10] + +#### 设置性能配置文件 + +如果安装了 `tuned` 和 `tuned-utils` 包,可以在主屏幕上更改性能配置文件。默认情况下,它被设置为推荐的配置文件。然而,如果服务器的用途需要更多的性能,我们可以在 Cockpit 中更改配置文件以满足这些需求。 + +![][11] + +### 网页版终端控制台 + +一个 Linux 系统管理员的工具箱如果不能访问终端,将毫无用处。终端使得管理员可以对服务器进行微调,而不仅仅是 Cockpit 中的内容。随着主题功能的加入,管理员可以根据自己的喜好快速调整文字和背景颜色。 + +另外,如果你错输入了 `exit` 命令,点击右上角的 “重置” 按钮,会提供一个闪烁着光标的新屏幕。 + +![][12] + +### 添加远程服务器和仪表板布局 + +“Headless Management” 组包括了仪表盘模块(`cockpit-dashboard`)。它以实时图表的形式提供了 CPU、内存、网络和磁盘性能的概览。远程服务器也可以通过同一界面进行添加和管理。 + +例如,要在仪表盘中添加远程计算机,请单击 “+” 按钮。输入服务器的名称或 IP 地址,并选择你要的颜色。这有助于你在图中区分服务器的统计数据。要在服务器之间进行切换,请点击主机名称(如下面的屏幕动画所示)。要从列表中删除一个服务器,点击勾选标记图标,然后点击红色垃圾桶图标。下面的例子演示了 Cockpit 如何管理一台名为 `server02.local.lan` 的远程机器。 + +![][13] + +### 文档和寻找帮助 + +一如既往,手册页是查找文档的好地方。在命令行结果中进行简单搜索即可找到与使用和配置该 Web 服务的不同方面有关的页面。 + +``` +$ man -k cockpit +cockpit (1) - Cockpit +cockpit-bridge (1) - Cockpit Host Bridge +cockpit-desktop (1) - Cockpit Desktop integration +cockpit-ws (8) - Cockpit web service +cockpit.conf (5) - Cockpit configuration file +``` + +Fedora 仓库中也有一个名为 `cockpit-doc` 的软件包。这个软件包的描述是最好的解释。 + +> 《Cockpit 部署和开发者指南》向系统管理员展示了如何在他们的机器上部署 Cockpit,并帮助开发者嵌入或扩展 Cockpit。 + +更多文档请访问 。 + +### 结论 + +本文只涉及 Cockpit 中的一些主要功能。管理存储设备、网络、用户账户和软件控制将在下一篇文章中介绍。此外,可选的扩展,如 389 目录服务,以及用于处理 Fedora Silverblue 中的软件包的`cockpit-ostree` 模块。 + +随着越来越多的用户采用 Cockpit,可选的功能会继续增加。这个界面对于想要一个轻量级界面来控制服务器的管理员来说是非常理想的。 + +你对 Cockpit 有什么看法?在下面的评论中分享你的经验和想法。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/cockpit-and-the-evolution-of-the-web-user-interface/ + +作者:[Shaun Assam][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/sassam/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-816x345.jpg +[2]: https://fedoramagazine.org/cockpit-overview/ +[3]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-login-screen.png +[4]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-home-screen.png +[5]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-system-info.gif +[6]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-ssh-key-fingerprints.png +[7]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-authentication.png +[8]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-hostname-domain.gif +[9]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-date-time.png +[10]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-power-options.gif +[11]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-tuned.gif +[12]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-terminal.gif +[13]: https://fedoramagazine.org/wp-content/uploads/2019/08/cockpit-add-remote-servers.gif diff --git a/published/202006/20191125 My top 5 Ansible modules.md b/published/202006/20191125 My top 5 Ansible modules.md new file mode 100644 index 0000000000..f114d6ca59 --- /dev/null +++ b/published/202006/20191125 My top 5 Ansible modules.md @@ -0,0 +1,76 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12304-1.html) +[#]: subject: (My top 5 Ansible modules) +[#]: via: (https://opensource.com/article/19/11/ansible-modules) +[#]: author: (Mark Phillips https://opensource.com/users/markp) + +我最喜欢用的 5 个 Ansible 模块 +====== + +> 了解如何通过这些 Ansible 模块实现几乎任何事情。 + +![](https://img.linux.net.cn/data/attachment/album/202006/10/214614z2jv4zvet5kw322o.jpg) + +在我成长的时候,我爷爷在他的花园里有一个棚子。他经常会花几个小时在那里制作和修复东西。这是在我们有互联网之前的事情,所以我花了很多时间看他在那个棚子里创造东西。虽然棚子里有很多工具,从钻头到车床到电器配件,还有很多东西我至今都无法辨认,但他使用的只是他手头的一小部分。然而,他能做到的事情似乎永远没有极限。 + +我之所以告诉你这个故事,是因为我觉得我的职业生涯是在一个隐喻的棚子里度过的。计算机也是如此多的工具,都在一个狭小(虚拟?)的空间里。而工具棚中又有工具棚 —— 我最喜欢的是 Ansible。最近的 2.9 版本有 3,681 个模块! **3,681 个啊!**当我在 2013 年夏天第一次开始使用 Ansible 时,1.2.1 版本只有 113 个模块,然而,正如[我当时写的][2],我仍然可以实现任何我想象到的东西。 + +模块是 Ansible 的支柱,是让重任轻装上阵的齿轮。它们被设计为做好一项工作,从而实现了 [Unix 哲学][3]。我们就是这样来把这么多的模块捆绑在一起,作为乐团的指挥,Ansible 现在有很多乐器可以听从它的指挥。 + +回顾一下我多年来的 Ansible 剧本和角色的 Git 仓库,我发现我只用了 35 个模块。这个小的子集被用来构建大型基础设施。不过,我想知道如果用一个更小的子集可以实现什么?当我回顾这 35 个模块时,我在思考,我能否只用 5 个模块就能达到同样的效果。因此,以下是我最喜欢的五个模块,顺序无关。 + +### 5. authorized_key + +SSH 是 Ansible 的核心,至少对于除了 Windows 以外的几乎所有其他功能都是如此。在 Ansible 中高效使用 SSH 的关键(没有双关语)是……[密钥][5]!顺便提一下,你可以用 SSH 密钥为安全性做很多非常酷的事情。值得仔细阅读 [sshd 手册页][6]中的 “authorized_keys” 部分。如果你需要精细的用户访问控制,管理 SSH 密钥可能会变得很费力,尽管我可以用接下来的两个我最爱的模块中的任何一个,但我更喜欢使用 [authorized_key][4] 这个模块,因为它[可以通过变量轻松管理][7]。 + +### 4. file + +除了显而易见的将文件放置在某个地方的功能外,[file][8] 模块还可以设置所有权和权限。我想说的是,这样一个模块就能带来很多的好处。很大一部分安全问题也与设置权限有关,所以 [file][8] 模块和 [authorized_key][4] 可以很好地配合在一起使用。 + +### 3. template + +操作文件内容的方法太多了,我看到很多人都在使用 [lineinfile][10]。我自己也用它做过小任务。但是,[template][9] 模块就清晰多了,因为你维护了整个文件的上下文。我更喜欢以任何人都可以*轻松*理解的方式编写 Ansible 的内容 —— 对我而言,这意味着容易理解正在发生的事情。[template][9] 的使用意味着能够看到你正在放置内容的整个文件、全部你正在改变的变量。 + +### 2. uri + +当前发布版中的许多模块利用 Ansible 作为编排工具。它们与另一个服务对话,而不是做一些具体的事情,比如把一个文件放到一个地方。通常,这种对话也是通过 HTTP 进行的。在许多这样的模块出现之前,你*可以*直接使用 [uri][11] 模块对 API 进行编程。它是一个强大的访问工具,可以使你能够做很多事情。在我的 Ansible 虚拟棚子里,我不会少了它。 + +### 1. shell + +这是我们工具包里的王牌、瑞士军刀。如果你为如何控制其他东西而非常苦恼,别说,说就是 [shell][12]。有人会说,我们这样说是让 Ansible 成为了 Bash 脚本 —— 但是,我想说的是,这还是有点好处的,因为可以在你的剧本和角色中使用 `name` 参数记录下每一步。对我来说,这就像一个很大的奖励一样。早在我还在做咨询的时候,我曾经帮助一个数据库管理员(DBA)迁移到 Ansible。这位 DBA 并不喜欢改变,对改变工作方法也是推三阻四。于是,为了简化迁移到 Ansible 方式,我们在 Ansible 中使用 [shell][12] 模块调用了一些现有的数据库管理脚本。并在任务中附带了翔实的 `name` 声明。 + +通过这五个模块,你可以实现很多事情。是的,为完成特定任务而设计的模块会让你的生活更加轻松。但是,借助简单的工程设计,你几乎可以事半功倍。Ansible 开发者 Brian Coca 是这方面的大师,[他的技巧和窍门讲座][13]总是值得一看。 + +* * * + +你觉得我喜欢的五大模块怎么样?如果你也必须限制在这么多模块,你会选择哪五个,为什么?在下面的评论中告诉我吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/11/ansible-modules + +作者:[Mark Phillips][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/markp +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mandelbrot_set.png?itok=bmPc0np5 +[2]: http://probably.co.uk/post/puppet-vs-chef-vs-ansible/ +[3]: https://en.wikipedia.org/wiki/Unix_philosophy#Do_One_Thing_and_Do_It_Well +[4]: https://docs.ansible.com/ansible/latest/modules/authorized_key_module.html +[5]: https://linux.die.net/man/1/ssh-keygen +[6]: https://linux.die.net/man/8/sshd +[7]: https://github.com/phips/ansible-demos/blob/3bf59df1eb2390b31b5c42333197e2fbb7fec93f/roles/ansible-users/tasks/main.yml#L35 +[8]: https://docs.ansible.com/ansible/latest/modules/file_module.html +[9]: https://docs.ansible.com/ansible/latest/modules/template_module.html +[10]: https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html +[11]: https://docs.ansible.com/ansible/latest/modules/uri_module.html +[12]: https://docs.ansible.com/ansible/latest/modules/shell_module.html +[13]: https://www.ansible.com/ansible-tips-and-tricks diff --git a/published/202006/20200304 Getting started with the Gutenberg editor in Drupal.md b/published/202006/20200304 Getting started with the Gutenberg editor in Drupal.md new file mode 100644 index 0000000000..55ad82e25a --- /dev/null +++ b/published/202006/20200304 Getting started with the Gutenberg editor in Drupal.md @@ -0,0 +1,121 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12273-1.html) +[#]: subject: (Getting started with the Gutenberg editor in Drupal) +[#]: via: (https://opensource.com/article/20/3/gutenberg-editor-drupal) +[#]: author: (MaciejLukianski https://opensource.com/users/maciejlukianski) + +Drupal 中的 Gutenberg 编辑器入门 +====== + +> 了解如何在 Drupal 中集成使用 WordPress 中流行的所见即所得编辑器。 + +![Text editor on a browser, in blue][1] + +自 2017 年以来,WordPress 的 [Gutenberg][2] 插件中的所见即所得编辑器就真的很不错。但是,Drupal 社区尚未就内容管理系统(CMS)编辑体验的最佳方法达成共识。但在社区的大量努力下,出现了一个强有力的新选择,将 [Gutenberg 与 Drupal 集成在一起][3]。 + +以前,Drupal 8 中有两种主要的内容创建方法: + +* 在[基于段落的方法][4]中,内容是由称为段落的实体组合而成。目前,大约有 100,000 个网站使用“段落”(Paragraphs)模块(根据 Drupal 说法)。 +* [Layout-Builder 方法][5]使用 Drupal 8.5 附带的编辑工具。它仍然在改进,但是它是下一个强有力的竞争者,因为它确实与 Drupal 内核很好地集成在一起。由于 Layout-Builder 是 Drupal 的一部分,因此无法获得使用情况的统计信息。 + +在 2018 年底,由 Fronkom(一家专注于开源解决方案的挪威数字机构)领导的 Drupal 社区将 WordPress Gutenberg 项目作为贡献模块移植到了 Drupal 中。让我们看一下 Gutenberg 在 Drupal 中的工作方式(包括一些很酷的 Drupal 特有的集成)。 + +### 安装 + +安装 [Gutenberg 模块][6]与安装任何 Drupal 模块一样简单,并且有良好的[安装文档][7]。 + +### 配置 + +Gutenberg 已集成到 Drupal 的默认内容实体创建工作流中。你可以将其用于你选择的任何内容类型,前提是内容类型至少有一个文本区域字段,它是 Gutenberg 编辑器输出的位置。 + +要在 Drupal 中的内容类型启用 Gutenberg 项目,你必须进入设置:“结构 -> 内容类型”,并且,从要你想使用 Gutenberg 的内容类型旁边的下拉框中单击“编辑”。 + +![Drupal settings][8] + +在出现的窗口中,向下滚动并选择左侧的“Gutenberg 体验”选项卡,你可以在其中找到下面描述的设置。选择“启用 Gutenberg 体验”。 + +![Drupal Gutenberg settings][9] + +#### 模板 + +这是 WordPress 开箱即用的很酷的功能之一。它能让你用 JSON 结构定义新页面模板。它将使用虚拟占位符内容预填充所有新创建的文章,这将有助于编辑者正确地构造内容。在上面的截图中,我添加了一个标题和一个段落。请注意,必须转义任何双引号。 + +#### 模板锁 + +此设置允许你定义是否允许用户删除占位符内容,添加新块或仅编辑现有的预填充内容。 + +#### 允许的 Gutenberg 和 Drupal 块 + +这是 Gutenberg Drupal 侧的另一个超酷功能。Drupal 允许用户创建各种类型的块来设计页面。例如,你可以创建一个块,其中包含五个最新博客的列表、最新评论或用于收集用户电子邮件的表单。 + +Gutenberg 与 Drupal 的深度集成允许用户在编辑时选择哪些 Drupal 块可供用户使用(例如,限制嵌入 YouTube),并将块用作内联内容。这是一个非常方便的功能,允许对用户体验进行精细控制。 + +在全新安装的 Drupal 中,没有太多的选择,但站点通常有许多提供各种功能的块。在下面的截图中,选择了“搜索表单”的 Drupal 块。 + +![Drupal Gutenberg blocks][10] + +完成配置后,点击“保存内容类型”。 + +### 使用 Drupal Gutenberg 发布内容 + +启用 Gutenberg 内容类型后,它将接管大部分编辑体验。 + +![Drupal Gutenberg content screen][11] + +在主窗口中,你可以看到我在上面的模板配置中添加的虚拟占位符内容。 + +#### 特定于 Drupal 的选项 + +在右侧,Drupal 提供了一些字段和设置。例如,“标题” 字段是 Drupal 中所需的单独字段,因此它不在主页面上。 + +在“标题”下面,根据在 Drupal 中安装的模块和设置的选项,其他设置可能有所不同。你可以看到“修订日志消息”、“菜单设置”、“评论设置”以及添加“URL 别名”。 + +通常,Drupal 内容类型由多个文本字段组成,如标记、类别、复选框、图像字段等。当你启用 Gutenberg 内容类型时,这些附加字段可在“更多设置”选项卡中提供。 + +你现在可以添加内容 —— 它的工作方式与 WordPress Gutenberg 中的相同,并有额外的添加 Drupal 块的选项。 + +在下面的截图中,你可以看到当我添加一些文本替换占位符文本、来自 Drupal 的搜索块、标题、标记和自定义 URL 别名后发生的情况。 + +![Drupal Gutenberg entering text][12] + +点击“保存”后,你的内容将发布。 + +![Drupal Gutenberg output][13] + +就是这样,它工作良好。 + +### 共同工作以获得更好的软件体验 + +Drupal 中的 Gutenberg 工作良好。这是一个可供选择的方式,允许编辑者控制网站的外观,直至最细微的细节。它的采用率正在增长,截至本文撰写时,已有 1,000 多个安装,每月有 50 个新安装。Drupal 集成添加了其他很酷的功能,如细粒度权限、占位符内容,以及内联包含 Drupal 块的功能,这些功能在 WordPress 插件中没有。 + +很高兴看到两个独立项目的社区共同努力实现为人们提供更好的软件的共同目标。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/3/gutenberg-editor-drupal + +作者:[MaciejLukianski][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/maciejlukianski +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png?itok=lcf-m6N7 (Text editor on a browser, in blue) +[2]: https://wordpress.org/plugins/gutenberg/ +[3]: https://drupalgutenberg.org/ +[4]: https://www.droptica.com/blog/flexible-and-easy-content-creation-drupal-paragraphs-module/ +[5]: https://www.droptica.com/blog/layout-builder-building-drupal-8-layouts/ +[6]: https://www.drupal.org/project/gutenberg +[7]: https://www.drupal.org/docs/8/extending-drupal-8/installing-drupal-8-modules +[8]: https://opensource.com/sites/default/files/uploads/gutenberg_edit.png (Drupal settings) +[9]: https://opensource.com/sites/default/files/uploads/gutenberg_settings.png (Drupal Gutenberg settings) +[10]: https://opensource.com/sites/default/files/uploads/gutenberg_blocks.png (Drupal Gutenberg blocks) +[11]: https://opensource.com/sites/default/files/uploads/gutenberg_contentwindow.png (Drupal Gutenberg content screen) +[12]: https://opensource.com/sites/default/files/uploads/gutenberg_entry.png (Drupal Gutenberg entering text) +[13]: https://opensource.com/sites/default/files/uploads/gutenberg-demo.png (Drupal Gutenberg output) diff --git a/published/202006/20200506 6 open source alternatives to Wunderlist.md b/published/202006/20200506 6 open source alternatives to Wunderlist.md new file mode 100644 index 0000000000..e79d80ac5d --- /dev/null +++ b/published/202006/20200506 6 open source alternatives to Wunderlist.md @@ -0,0 +1,123 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12314-1.html) +[#]: subject: (6 open source alternatives to Wunderlist) +[#]: via: (https://opensource.com/article/20/5/alternatives-list) +[#]: author: (Jen Wike Huger https://opensource.com/users/jen-wike) + +6 个开源的奇妙清单(Wunderlist)替代品 +====== + +> 喜欢列表?看看这个便捷的开源应用程序列表,以管理你所有的列表! + +![](https://img.linux.net.cn/data/attachment/album/202006/14/142722a639gqqrgg7x6hb5.jpg) + +奇妙清单(Wunderlist)是一款清单应用,受到很多人的喜爱,但从 2020 年 5 月 6 日起,它就永远停止了。它的网站鼓励现有用户下载并使用“微软待办”来代替它。这很诱人,因为它可以轻松导入你多年来制作的所有这些列表。不过话又说回来,也许这是个机会,可以“近藤麻理惠”一下这些列表,并削减一些事务。(你真的需要 30 个列表吗?很显然,我觉得我需要,所以我不做评判。) + +我有各种各样的清单,从“2020 年花园的植物”到“给丈夫的礼物”。有些是清单,有些是待办事项清单,有些是为了清单而清单。 + +对我和我丈夫来说,最有用的清单是我们共享的杂货清单。我们都有手机上的应用程序,我们都把东西添加到列表中,但在他去购物之前,我们分别在手机上审查它(是的,你没看错),他把东西放进购物车时,他就会勾掉它。这让整个过程变得出奇的高效,我想我们节省了一些钱,因为我们喜欢坚持按清单购物。 + +虽然奇妙清单的用户很喜欢它,但它并不是完全独一无二的。还有无数的列表应用。对于奇妙清单,我特别喜欢它将简洁性和设计感结合在一起,而且它成功实现了一些有用的功能,比如与他人分享和协作,列表的动态复选框,以及在移动和网页界面上的良好用户体验。我也很喜欢用它来做一个不“活跃”文档的列表:一个我不会每周都回顾或定期进展的列表,就像我用来进行头脑风暴的许多列表一样(包括我一直想写的小说...)。 + +从这些年来我们发表的许多精彩文章中,我整理了一系列奇妙清单的开源替代方案,从简单的任务管理和待办事项清单到复杂的笔记记录和流程管理,这些列表工具可能会满足你的需求。或者,如果你是那个在丢得到处都是的纸条和便签上书写任务和备注的人,这可能是尝试这些数字工具之一的好时机。 + +### Tasks:可与 OwnCloud 配合 + +Tasks 是一款自由开源的应用,你可以从 [F-droid][2] 安装。Tasks 是一款只适用于手机的应用,但它可以同步到各种地方,非常灵活。你可以将你的列表保存到 NextCloud 或 OwnCloud、Google Tasks、Apple Reminders 以及几乎所有你有账户的 CalDAV 服务器上。 + +Tasks 的默认视图是每日视图,所以你输入的任何任务都被假定为从今天开始的任务。如果你像我一样,想维护几个不同的列表,你可以用标签来实现。当你创建一个标签时,你就为任务创建了一个类别。你可以为它指定一种颜色和一个图标,这样每个任务列表都是独一无二的。 + +这需要一点时间来适应,但标签有很多优点。因为所有的任务都是有标签的,你可以通过点击你想过滤的标签来查看任务组,但你也可以按天甚至按地点过滤。这意味着,当你去采购杂货时,你的杂货列表会成为活跃的默认列表,而当你回到家时,你的日常生活列表又会成为活跃的列表。 + +通过将你的数据同步到你的一个在线账户,你可以与亲人、合作者和同事分享列表。 + +另一个伟大的功能是,如果你每天早上上班时都有相同的任务,或者每周杂货清单中有 20 个相同的项目,你可以创建定期重复的任务。 + +评测者:Seth Kenlon + +![Screenshot of Tasks interface][3] + +### OpenTasks:适于长列表 + +[OpenTasks][4] 是一款优秀的任务管理工具,可以创建带有各种设置的个人任务。它在创建任务时支持多种字段,从基本的东西,如名称和描述,到更复杂的项目,如选择任务是私人、公共还是机密。OpenTasks 与其他替代品最大的不同之处在于它在应用的主屏幕上使用了选项卡。这些选项卡可以让你快速看到到期的任务、即将开始的任务、按优先级排序的任务,以及按当前完成进度排序的任务。许多其他应用程序支持做这样的事情,但 OpenTasks 很快就能轻松访问这些列表。 + +[阅读完整的 OpenTasks 评测][5],作者:Joshua Allen Holm。 + +![OpenTasks in Google Play store][6] + +### Mirakel:嵌套列表的绝佳之选 + +[Mirakel][7] 是一款任务管理应用,它拥有现代化的用户界面,并支持你在这样一款程序中可能想要的几乎所有格式。Mirakel 在基础层面上支持多个被称为“元列表”的列表。创建一个单独的任务有大量的选项,有截止日期、提醒、进度跟踪、标签、备注、子任务和文件附件,所有这些都构成了任务条目的一部分。 + +[阅读完整的 Mirakel 评测][5],作者:Joshua Allen Holm。 + +![Screenshot from website of Mirakel app][8] + +### Todo:简单有效,随处可用 + +[Todo.txt][9] 是我不断反复推荐的两个待办事项和任务管理应用之一(另一个是 Org 模式)。而让我不断推荐的原因是,它简单、便携、易懂,而且有很多很棒的附加组件,即使一台机器有这个程序而其他机器上没有,也不会破坏它。而且由于它是一个 Bash shell 脚本,我从来没有发现不支持它的系统。阅读更多关于[如何安装和使用 Todo.txt][10]。 + +[阅读完整的 todo.txt 评测][10],作者:Kevin Sonney。 + +![Drop-down menu for Todo.txt][11] + +### Joplin:最佳私人列表 + +[Joplin][12] 是一个 NodeJS 应用程序,它可以在本地运行和存储信息,允许你加密任务,并支持多种同步方法。Joplin 可以作为控制台或图形应用程序在 Windows、Mac 和 Linux 上运行。Joplin 还拥有 Android 和 iOS 的移动应用,这意味着你的笔记随处可用,而不需要大费周章。Joplin 甚至允许你用 Markdown、HTML 或纯文本来格式化你的笔记。 + +[阅读完整的 Joplin 评测][13],作者:Kevin Sonney。 + +![Joplin graphical version ][14] + +### CherryTree:最好的 Evernote / OneNote / Keep 替代品 + +[CherryTree][15] 是一个 GPLv3 许可的应用程序,它以节点的形式组织信息。每个节点都可以有子节点,让你轻松组织你的列表和思想。而且,子节点可以有自己的子节点,具有独立的属性。 + +[阅读完整的 CherryTree 评测][16],作者:Ben Cotton。 + +![CherryTree's hierarchical note layout][17] + +### 附赠:Wekan,给看板粉丝 + +看板kanban是当今敏捷流程的主流。我们中的许多人(包括我自己)不仅用它们来组织我们的工作,还用它们来组织我们的个人生活。我认识一些艺术家,他们使用 Trello 这样的应用程序来跟踪他们的委托清单,以及正在进行和已经完成的工作。但这些应用往往与工作账户或商业服务挂钩。让我们看看 [Wekan][18],这是一个开源的看板,你可以在本地或你选择的服务上运行。Wekan 提供了与其他看板应用相同的功能,比如创建面板、列表、泳道和卡片,在列表之间拖放,分配给用户,给卡片贴标签,以及做几乎所有你在现代看板中期待的事情。 + +[阅读完整的 Wekan 评测][19],作者:Kevin Sonney。 + +![Wekan kanban board][20] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/alternatives-list + +作者:[Jen Wike Huger][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jen-wike +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_hands_team_collaboration.png?itok=u82QepPk (a checklist for a team) +[2]: https://f-droid.org/en/packages/org.tasks/ +[3]: https://opensource.com/sites/default/files/uploads/screenshot_tasks_resized.jpg (Screenshot of Tasks interface) +[4]: https://play.google.com/store/apps/details?id=org.dmfs.tasks +[5]: https://opensource.com/article/17/1/task-management-time-tracking-android +[6]: https://opensource.com/sites/default/files/uploads/opentasks_rezied.jpg (OpenTasks in Google Play store) +[7]: https://mirakel.azapps.de/ +[8]: https://opensource.com/sites/default/files/uploads/mirakel_web_resized.jpg (Screenshot from website of Mirakel app) +[9]: http://todotxt.org/ +[10]: https://linux.cn/article-11835-1.html +[11]: https://opensource.com/sites/default/files/uploads/todo.txtmenu_3.png (Drop-down menu for Todo.txt) +[12]: https://joplin.cozic.net/ +[13]: https://linux.cn/article-10476-1.html +[14]: https://opensource.com/sites/default/files/uploads/joplin-1.png (Joplin graphical version ) +[15]: https://www.giuspen.com/cherrytree/ +[16]: https://opensource.com/article/19/5/cherrytree-notetaking +[17]: https://opensource.com/sites/default/files/uploads/cherrytree.png (CherryTree's hierarchical note layout) +[18]: https://wekan.github.io/ +[19]: https://linux.cn/article-10454-1.html +[20]: https://opensource.com/sites/default/files/uploads/wekan-board.png (Wekan kanban board) diff --git a/published/202006/20200507 Ubuntu Cinnamon Remix 20.04 Review- The Perfect Blend of Ubuntu With Cinnamon.md b/published/202006/20200507 Ubuntu Cinnamon Remix 20.04 Review- The Perfect Blend of Ubuntu With Cinnamon.md new file mode 100644 index 0000000000..322e26fa60 --- /dev/null +++ b/published/202006/20200507 Ubuntu Cinnamon Remix 20.04 Review- The Perfect Blend of Ubuntu With Cinnamon.md @@ -0,0 +1,157 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12316-1.html) +[#]: subject: (Ubuntu Cinnamon Remix 20.04 Review: The Perfect Blend of Ubuntu With Cinnamon) +[#]: via: (https://itsfoss.com/ubuntu-cinnamon-remix-review/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +Ubuntu Remix Cinnamon 20.04 评测:Ubuntu 与 Cinnamon 的完美融合 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/15/113226uq8ohzycrrc52q52.jpeg) + +推出于 2011 年的 GNOME 3,其 GNOME Shell 迎来了社区的赞扬的同时,也招致了一些人的反对。很多用户和开发者都很喜欢原来的 GNOME 界面,以至于有几个小组复刻了它,其中的一个小组 —— Linux Mint 团队创建了 [Cinnamon 桌面环境][1]。 + +Cinnamon 桌面成为了 Linux Mint 的标志型产品。多年来,Cinnamon 一直是 [Linux Mint][2] 的代名词。在过去的几年里,随着 Cinnamon 的普及,这种情况略有改变。现在其他发行版也开始提供 Cinnamon 桌面环境,[Manjaro][3] 就是这样一个例子。 + +几个月前,我们向大家介绍了一个[新 Ubuntu 变体][4],它提供了开箱即用的 Cinnamon 桌面体验,今天就让我们来深入了解一下 [Ubuntu Cinnamon Remix][5]。 + +### 为什么是 Ubuntu Cinnamon Remix 而不是 Linux Mint? + +的确,Linux Mint 是基于 Ubuntu 的,很多 Linux Mint 的用户都会有这样的疑问:既然 Linux Mint 已经如此成熟,而且用户体验也大致相同,那么换成 Ubuntu 有什么意义吗? + +Ubuntu Cinnamon Remix 与 Linux Mint 有很多小的区别,但有一个关键的区别是 Linux 爱好者不能忽视的。 + +Linux Mint 是基于 “LTS”(长期支持)版本的 Ubuntu,这意味着它一直落后于 Canonical 的 6 个月的更新节奏。Ubuntu Cinnamon Remix 则可以得益于较新的内核以及其他 6 个月周期内的功能升级和较新的软件。 + +另一个关键的区别是,Ubuntu Cinnamon Remix 将 “继承” [Snap 支持][6],而 Linux Mint 则拥抱 [FlatPak][7]。Ubuntu Cinnamon Remix 使用 Ubuntu 软件中心而不是 Mint 软件管理器。 + +我是 Cinnamon 的忠实粉丝,所以我选择了评测这款 Ubuntu 和 Cinnamon 的混合版,在这里我分享一下我的体验。 + +### 体验 Ubuntu Cinnamon Remix + +只要有机会,我总会提到 [Calamares 安装程序][8]有多快,感谢 Ubuntu Cinnamon Remix 团队如此选择。 + +![Calamares Installer][9] + +新安装的 Ubuntu Cinnamon Remix 会消耗大约 750 MB 的内存。这与 Linux Mint Cinnamon 非常相似。 + +![An idle Cinnamon takes 750 MB of RAM][10] + +美丽的 [Kimmo 主题][11]和橙色调的 Ubuntu 壁纸也给我留下了深刻的印象,看来这是一个非常细致的努力的结果。 + +![Ubuntu Cinammon Remix 20.04 Desktop][12] + +#### 足够让你开始的工具 + +和其他 Ubuntu 发行版一样,Ubuntu Cinnamon Remix 也包含了一些重要的生产力工具,下面是其中一些: + +* 火狐浏览器 +* Thunderbird - 电子邮件客户端 +* LibreOffice套件 +* Celluloid - 多媒体播放器 +* [GIMP][13] - 图像处理软件 +* Synaptic 软件包管理器 +* Gnome 软件中心 +* [Gparted][14] - 分区管理器 + +使用 Ubuntu Cinnamon Remix 作为我的主要平台已经有几天了,它满足了我的高期望。Ubuntu 稳定如磐石,速度非常快,在日常工作中我没有遇到任何问题。 + +#### 给 Linux Mint 爱好者的 Ubuntu + +你是否热衷于 Ubuntu Cinnamon,却习惯了 Linux Mint 主题?点击下面的内容,看看如何获得一个完整的 Linux Mint 主题包,以及如何配置它来保持 Ubuntu 的传统。 + +给 Ubuntu Cinnamon Remix 以真正的 Mint 感受: + +首先你必须下载并解压以下内容,通过终端很容易完成。 + +获取 Linux Mint-X 图标包: + +``` +wget http://packages.linuxmint.com/pool/main/m/mint-x-icons/mint-x-icons_1.5.5_all.deb +``` + +获取 Linux Mint-Y 图标包: + +``` +wget http://packages.linuxmint.com/pool/main/m/mint-y-icons/mint-y-icons_1.3.9_all.deb +``` + +获取 Linux Mint 主题: + +``` +wget http://packages.linuxmint.com/pool/main/m/mint-themes/mint-themes_1.8.4_all.deb +``` + +安装下载的软件包: + +``` +sudo dpkg -i ./mint-x-icons_1.5.5_all.deb ./mint-y-icons_1.3.9_all.deb ./mint-themes_1.8.4_all.deb +``` + +完成后,点击左下角的菜单按钮,输入 “themes”。你也可以在系统设置中找到“主题”功能。 + +![Accessing Themes][15] + +打开后更换 kimmo 图标和主题,如下图所示。Linux Mint 默认的“绿色”是普通的 Mint-Y,而橙色是 Ubuntu 的最佳选择。 + +![Linux Mint Theme Settings][16] + +#### 为 Cinnamon 迷们准备的美食 + +让我们承认吧,审美很重要。Cinnamon 拥有简洁优雅的外观、易于阅读的字体和漂亮的色彩对比主题。Cinnamon 提供了一个整洁的桌面,只需进入系统设置下的桌面菜单,即可轻松配置桌面图标。你也可以选择桌面图标只显示在主显示器上、只显示在副显示器上,或者同时显示在两个显示器上。这也适用于超过两台显示器的设置。 + +![Ubuntu Cinnamon Remix Desklets][17] + +桌面组件和小程序是一种小型的、单一用途的应用程序,可以分别添加到你的桌面或面板上。在众多的应用程序中,最常用的是 CPU 或资源监控器、天气小程序、便签和日历。 + +Cinnamon 控制中心集中提供许多桌面配置选项。通过访问 “主题” 部分,你可以选择桌面基本方案和图标、窗口边框、鼠标指针和控件外观。字体对桌面的整体外观有很大的影响,而 Cinnamon 让改变字体比以往任何时候都要容易。 + +Cinnamon 控制中心配置对新用户来说也足够简单,相比之下,KDE Plasma 会因为大量的配置选项而导致新用户感到困惑。 + +![][18] + +Cinnamon 面板包含用于启动程序的菜单、基本的系统托盘和应用程序选择器。面板的配置很简单,添加新的程序启动器只需在主菜单中找到你要添加的程序,右击图标,选择 “添加到面板” 即可。你也可以将启动程序图标添加到桌面,以及 Cinnamon 的 “收藏夹” 启动栏中。如果你不喜欢面板上图标的顺序,只需在面板栏上点击右键,进入面板的 “编辑” 模式,重新排列图标即可。 + +### 结论 + +无论你是决定给你的桌面 “加点料”,还是考虑从 [Windows 迁移到 Linux][19],Cinnamon 社区都为你制作了大量的香料。 + +传统而又优雅,可定制而又简单,Ubuntu Cinnamon Remix 是一个有趣的项目,前途无量,对于喜欢 Ubuntu 的 Cinnamon 桌面爱好者来说,这可能是一个不二之选。 + +你觉得 Ubuntu Cinnamon Remix 怎么样?你已经使用过它了吗? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ubuntu-cinnamon-remix-review/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Cinnamon_(desktop_environment) +[2]: https://www.linuxmint.com/ +[3]: https://manjaro.org/ +[4]: https://itsfoss.com/ubuntudde/ +[5]: https://ubuntucinnamon.org/ +[6]: https://snapcraft.io/ +[7]: https://flatpak.org/ +[8]: https://calamares.io/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/Calamares-Installer.png?resize=800%2C426&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/htop-running-on-Ubuntu-Cinnamon-Remix-20.04.png?ssl=1 +[11]: https://github.com/Ubuntu-Cinnamon-Remix/kimmo-gtk-theme +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/Ubuntu-Cinammon-Remix-20.04-desktop.png?resize=800%2C450&ssl=1 +[13]: https://itsfoss.com/gimp-2-10-release/ +[14]: https://itsfoss.com/gparted/ +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/accessing-themes.png?ssl=1 +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/Linux-Mint-theme-settings.png?ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-cinnamon-remix-desklets.jpg?fit=800%2C450&ssl=1 +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-cinnamon-control.jpg?fit=800%2C450&ssl=1 +[19]: https://itsfoss.com/windows-like-linux-distributions/ diff --git a/published/202006/20200511 How to manage network services with firewall-cmd.md b/published/202006/20200511 How to manage network services with firewall-cmd.md new file mode 100644 index 0000000000..6fcbfc11b9 --- /dev/null +++ b/published/202006/20200511 How to manage network services with firewall-cmd.md @@ -0,0 +1,130 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12276-1.html) +[#]: subject: (How to manage network services with firewall-cmd) +[#]: via: (https://fedoramagazine.org/how-to-manage-network-services-with-firewall-cmd/) +[#]: author: (dan01 https://fedoramagazine.org/author/dan01/) + +如何使用 firewall-cmd 管理网络服务 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/03/090806hcmc9cxcbbcuccbe.jpg) + +在上一篇文章中,我们探讨了如何在 Fedora 中[用命令行控制防火墙][2]。 + +现在你将看到如何“添加”、“删除”和“列出”服务、协议和端口,以便“阻止”或“允许”它们。 + +### 简短回顾 + +首先,最好检查一下防火墙的*状态*,看它是否正在运行。如我们先前所学,你可以使用状态选项(`firewall-cmd ‐‐state`)来得到。 + +下一步是获取网络接口适用的zone。例如,我使用的桌面有两个网络接口:一个*物理*接口(`enp0s3`),代表我实际的*网卡*,和*虚拟*接口(`virbr0`),它由 KVM 等虚拟化软件使用。要查看哪些域处于活动状态,请运行 `firewall-cmd ‐‐get-active-zones`。 + +现在,你知道了你感兴趣的域,可以使用 `firewall-cmd ‐‐info-zone=FedoraWorkstation` 这样的命令列出该域的规则。 + +### 读取区域信息 + +要显示*特定域*的信息,请运行 `firewall-cmd ‐‐zone=ZoneName ‐‐list-all`,或使用以下命令显示默认域的信息: + +``` +[dan@localhost ~]$ firewall-cmd --list-all +FedoraWorkstation (active) +target: default +icmp-block-inversion: no +interfaces: enp0s3 +sources: +services: dhcpv6-client mdns samba-client ssh +ports: 1025-65535/udp 1025-65535/tcp +protocols: +masquerade: no +forward-ports: +source-ports: +icmp-blocks: +rich rules: +``` + +现在,让我们查看输出。第一行表明以下信息关联的域以及该域当前是否在使用中。 + +`target: default`:告诉我们这是默认域。可以通过 `‐‐set-default-zone=ZoneName` 和 `‐‐get-default-zone` 设置或获取。 + +`icmp-block-inversion` 表明是否阻止 [ICMP][3] 请求。例如,如果机器响应来自网络上其他机器的 ping 请求。 + +`interfaces` 字段显示接受此域的所有接口。 + +### 处理服务、端口和协议 + +现在,重点关注 `services`、`ports` 和 `protocols` 所在行。默认情况下,防火墙将阻止所有端口、服务和协议,而只允许列出的。 + +在这里,你可以看到允许的服务是非常基本的客户端服务。例如,访问网络上的共享文件夹(`samba-client`)、与 DNS 服务器通信或通过 SSH(`ssh` 服务)连接到计算机。你可以将 `service` 视为与端口组合的协议,例如 `ssh` 服务使用 SSH 协议,并且按照惯例使用 22 端口。通过允许 `ssh` 服务,你实际上所做的就是允许传入的连接在默认 22 端口上使用 SSH 协议。 + +请注意,根据经验,名称中带有 `client` 字样的服务是指传出连接,也就是你使用你的 IP 作为源对外部的*连接*,与之相反的是 `ssh` 服务,比如,它将接受传入连接(监听来自外部的连接)。 + +你可以在文件 `/etc/services` 中查找服务。例如,如果你想知道这些服务使用什么端口和协议: + +``` +[dan@localhost ~]$ cat /etc/services | grep ssh +ssh 22/tcp # The Secure Shell (SSH) Protocol +ssh 22/udp # The Secure Shell (SSH) Protocol +``` + +你可以看到 SSH 同时使用 TCP 和 UDP 的 22 端口。此外,如果你希望查看所有可用的服务,只需使用 `firewall-cmd --get-services`。 + +#### 打开端口 + +如果要阻止端口、服务或协议,请确保在此处未列出它们。展开来说,如果要允许服务,那么需要将它添加到列表中。 + +假设你要打开 `5000` 端口用于 TCP 连接。为此,请运行: + +``` +sudo firewall-cmd --zone=FedorwaWorkstation --permanent --add-port=5000/tcp +``` + +请注意,你需要指定规则适用的域。添加规则时,还需要如上指定它是 `tcp` 还是 `udp` 端口。`--permanent` 参数将规则设置为即使系统重启后也可以保留。 + +再次查看你所在区域的信息: + +``` +[dan@localhost ~]$ firewall-cmd --list-all +FedoraWorkstation (active) +target: default +icmp-block-inversion: no +interfaces: enp0s3 +sources: +services: dhcpv6-client mdns samba-client ssh +ports: 1025-65535/udp 1025-65535/tcp 5000/tcp +protocols: +masquerade: no +forward-ports: +source-ports: +icmp-blocks: +rich rules: +``` + +类似地,如果你想从列表删除该端口,请运行: + +``` +sudo firewall-cmd --zone=FedorwaWorkstation --permanent --remove-port=5000/tcp +``` + +相同的 `remove` (`‐‐remove-protocol`、`‐‐remove-service`) 和 `add`(`‐‐add-protocol`、`‐‐add-service`)选项同样适用于*服务*和*协议*。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/how-to-manage-network-services-with-firewall-cmd/ + +作者:[dan01][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/dan01/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/05/services-firewall-cmd-816x345.jpg +[2]: https://linux.cn/article-12103-1.html +[3]: https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol +[4]: https://unsplash.com/@tkaiser?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[5]: https://unsplash.com/s/photos/poke-hole?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/published/202006/20200511 Modify a disk image to create a Raspberry Pi-based homelab.md b/published/202006/20200511 Modify a disk image to create a Raspberry Pi-based homelab.md new file mode 100644 index 0000000000..256945adc4 --- /dev/null +++ b/published/202006/20200511 Modify a disk image to create a Raspberry Pi-based homelab.md @@ -0,0 +1,227 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12277-1.html) +[#]: subject: (Modify a disk image to create a Raspberry Pi-based homelab) +[#]: via: (https://opensource.com/article/20/5/disk-image-raspberry-pi) +[#]: author: (Chris Collins https://opensource.com/users/clcollins) + +修改磁盘镜像来创建基于树莓派的家庭实验室 +====== + +> 使用树莓派或其它单板机创建一个“家庭私有云”。 + +![](https://img.linux.net.cn/data/attachment/album/202006/03/123435csm7ys7mkbw7ggjy.jpg) + +构建一个[家庭实验室][2]可以是一个有趣的方式,可以让你学习的新概念和实验新技术时还能自娱自乐。得益于以 [树莓派][3] 为首的单板计算机(SBC)的流行,在舒适的家里就可以轻松构建一个多计算机实验室。比起试图在主流的云服务商建立的相同配置,创建一个“家庭私有云”以花更少的钱来体验到云原生技术,也是一个极好的方法。 + +这篇文章阐述如何修改树莓派或其它的单板机的磁盘镜像,预配置主机的 SSH,并禁用首次启动时强制竞选交互配置的服务。这是一个让你的设备“即启动,即运行”的极好方法,类似于云端实例。之后,你可以使用自动化的流程通过 SSH 连接来进行更专业和更深入的配置。 + +此外, 当向你的实验室添加更多的树莓派时,修改磁盘镜像可以来让你只需要将该镜像写到一个 SD 卡、放入树莓派中就可以了! + +![Multiple Raspberry Pi computers, a switch, and a power bank][4] + +### 解压缩和挂载镜像 + +对于这个项目,你需要修改一个服务器磁盘镜像。在测试期间,我使用 [Fedora Server 31 ARM][5]。在你下载该磁盘镜像并[验证其校验和][6]之后,你需要将其解压缩并挂载其到宿主机的文件系统的某个位置上,以便你可以根据需要修改它。 + +你可以使用 [xz][7] 命令通过 `--decompress` 参数来解压缩 Fedora 服务器镜像: + + +``` +xz --decompress Fedora-Server-armhfp-X-y.z-sda.raw.xz +``` + +这会留下一个解压缩后的原始磁盘镜像(它会自动地替换 `.xz` 压缩文件)。这个原始磁盘镜像就像它听起来的那样:一个包含格式化后安装好的磁盘上的所有数据的文件。这包含分区信息、启动分区、root 分区以及其它分区。你需要挂载你打算在其中进行修改的分区,但是要做到这一点,你需要知道磁盘镜像中的分区起始位置和扇区大小,这样你才可以挂载该文件正确的扇区。 + +幸运的是,你可以在一个磁盘镜像上使用 [fdisk][8] 命令,就像在实际磁盘上使用一样容易。使用 `--list` 或 `-l` 参数来查看分区的列表和其信息: + +``` +# 使用 fdisk 来列出原始镜像文件的分区: +$ fdisk -l Fedora-Server-armhfp-31-1.9-sda.raw +Disk Fedora-Server-armhfp-X-y.z-sda.raw: 3.2 GiB, 3242196992 bytes, 6332416 sectors +Units: sectors of 1 * 512 = 512 bytes +Sector size (logical/physical): 512 bytes / 512 bytes +I/O size (minimum/optimal): 512 bytes / 512 bytes +Disklabel type: dos +Disk identifier: 0xdaad9f57 + +Device                               Boot   Start     End Sectors  Size Id Type +Fedora-Server-armhfp-X-y.z-sda.raw1         8192  163839  155648   76M  c W95 F +Fedora-Server-armhfp-X-y.z-sda.raw2 *     163840 1163263  999424  488M 83 Linux +Fedora-Server-armhfp-X-y.z-sda.raw3      1163264 6047743 4884480  2.3G 83 Linux +``` + +你需要的所有信息都可在上面的输出中获得。第 3 行表示扇区大小(包括逻辑和物理的):512 字节 / 512 字节。 + +设备列表显示的是原始磁盘镜像中的分区。第一个,`Fedora-Server-armhfp-X-y.z-sda.raw1` 毫无疑问是引导程序分区,因为它是第一个,很小(仅仅 76MB),而且类型被标识为 `c`,即 W95 FAT32(LBA),这是一个从 SD 卡启动的 FAT32 分区。 + +第二个分区也不是非常大,只有 488MB。这个分区是一个 Linux 原生类型分区(Id 83),它可能是包含内核和 [initramfs][9] 的 Linux 启动分区。 + +第三个分区可能是你需要的东西:它有 2.3GB 大小,所以在它其中应该有发行版的主要部分,并且它是一个 Linux 原生分区类型,这也是在预料之中的。这个分区应该包含了你需要修改的分区和数据。 + +第三个分区从扇区 1163264 开始(在 `fdisk` 的输出中被显示为 `Start` 列),所以你的挂载偏移量是 `595591168`,计算方法是将扇区大小(512)乘以起始扇区(1163264)(即 `512 * 1163264`)。这意味着你需要以偏移量 `595591168` 挂载该文件,才能挂载到正确位置。 + +装备了这些信息,现在你可以将第三个分区挂载到你的家目录中了: + +``` +$ mkdir ~/mnt +$ sudo mount -o loop,offset=595591168 Fedora-Server-armhfp-X-y.z-sda.raw ~/mnt +$ ls ~/mnt +``` + +### 直接在磁盘镜像中作业 + +在磁盘镜像被解压缩和被挂载到宿主机上的一个位置后,就可以修改镜像以符合你的需求。在我看来,对镜像进行更改的最简单的方法是使用 `chroot` 来将你会话的工作根目录更改为挂载镜像的工作根目录。不过,有点棘手。 + +在你改变了根目录后,你的会话将使用新的根目录下的二进制文件。除非你是在一个 ARM 系统做这些所有的操作,否则解压缩后的磁盘镜像的架构将与你正在使用的宿主机系统不同。即使在 chroot 环境中,宿主机系统也无法使用一个不同架构的二进制文件。至少,不能在本机使用。 + +幸运的是,这里有一个解决方案:qemu-user-static。来自 [Debian Wiki][10] 的说明: + +> “[qemu-user-static] 提供了用户模式的仿真二进制文件,是静态构建的。在这个模式中,QEMU 可以在一个 CPU 上启动为另一个 CPU 编译的 Linux 进程 …… 如果安装了 binfmt-support 软件包,qemu-user-static 软件包会注册提供的仿真器可以处理的二进制文件格式,以便其能够直接运行其他架构的二进制文件。” + +这正是你需要在 chroot 环境中非本地架构中工作所需的。如果宿主机系统是 Fedora,使用 DNF 来安装 `qemu-user-static` 软件包,并重新启动 `systemd-binfmt.service`: + +``` +# 使用 DNF 启用非本地的 arch chroot 环境,添加新的二进制文件格式信息 +# 输出镜像了精简 +$ dnf install qemu-user-static +$ systemctl restart systemd-binfmt.service +``` + +使用这种方法,你一个能够更改根目录到挂载的磁盘镜像,运行 `uname` 命令来验证一切都在正常: + +``` +sudo chroot ~/mnt/ /usr/bin/uname -a -r +Linux marvin 5.5.16-200.fc31.x86_64 #1 SMP Wed Apr 8 16:43:33 UTC 2020 armv7l armv7l armv7l GNU/Linux +``` + +在 chroot 环境中运行 `uname` 将在输出中显示 `armv7l`,这个原始磁盘镜像的架构, 而不是宿主机的架构。一切如预期,可以继续修改镜像了。 + +### 修改磁盘镜像 + +现在你可以直接切换到这个基于 ARM 的磁盘镜像中,并在该环境中工作了,你可以对镜像自身镜像修改了。你需要设置该镜像,以便它能够启动并可立即访问,而不需要在树莓派上做任何额外的设置。为此,你需要安装并启用 sshd(OpenSSH 守护进程),并为 SSH 访问添加授权密码。 + +为了使其表现得更像一个云环境,实现在家里建立私有云的梦想,添加一个本地用户,给予该用户 `sudo` 权限,并(为了像云端的重度用户一样)允许该用户无需密码就可以使用 `sudo`。 + +所以,你将做的事情是: + + * 安装并启用 SSHD(SSHD 已经在 Fedora ARM 镜像中安装并启用,但是你可能需要为你发行版手动执行这些工作) + * 设置一个本地用户 + * 允许本地用户来使用 `sudo`(无需密码,可选) + * 添加授权密钥 + * 允许 root 使用授权密码镜像 SSH(可选) + +我使用 GitHub 功能,它允许你上传你的 SSH 公钥,并在 [https://github.com/.keys][11] 处可访问。我发现这是一种很方便的分发公钥的方法,不过我生性多疑,我总是检查下载的密钥是否与我预期的匹配。如果你不想使用这种方法,你可以从你宿主机中复制你公钥到 chroot 环境中,或者你可以将公钥托管在你控制的 Web 服务器上以便使用相同的工作流。 + +要开始修改磁盘镜像,再次切换根目录到挂载的磁盘镜像中,这次启动一个 shell,以便可以运行多个命令: + +``` +# 为了简洁起见,省略了这些命令的输出(如果有的话) +$ sudo chroot ~/mnt /bin/bash + +# 安装 openssh-server ,并启用它 (在 Fedora 上已经完成) +$ dnf install -y openssh-server +$ systemctl enable sshd.service + +# 允许 root 使用授权密码访问 SSH +$ mkdir /root/.ssh + +# 下载或者另外添加授权密码文件,你的公共密码 +# 将 URL 替换为你自己公共密码的路径 +$ curl -o /root/.ssh/authorized_keys +$ chmod 700 /root/.ssh +$ chmod 600 /root/.ssh/authorized_keys + +# 添加一个本地用户,并放置他们到 wheel 组中 +# 将组和用户更改为您想要的一切 +useradd -g chris -G wheel -m -u 1000 chris + +# 下载并添加你的授权密码 +# 像你上面所做的那样更改 home 目录和URL +mkdir /home/chris/.ssh +curl -o /home/chris/.ssh/authorized_keys +chmod 700 /home/chris/.ssh +chmod 600 /home/chris/.ssh/authorized_keys +chown -R chris.chris /home/chris/.ssh/ + +# 允许 wheel 组( 使用你的本地用户) 不需要使用密码来使用 suso +echo "%wheel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/91-wheel-nopasswd +``` + +这就是树莓派或其它单板机在首次启动时需要完成设置 SSH 的全部工作。不过,每个发行版都有自己的特点。例如,Raspbian 已经包含一个本地用户:`pi`,并且不使用 `wheel` 组。因此对于 Raspbian 来说,最好使用现有用户,或者删除 `pi` 用户,并使用另一个用户来替换它。 + +在 Fedora ARM 的情况下,镜像会在首次引导启动时提示你完成设置。这会破坏你在上面所做的修改的目的,尤其是在设置完成之前,它会完全阻止启动。你的目标是使树莓派的功能类似于私有云的基础设施的一部分一样运行,而这个工作流程包括在主机启动时通过 SSH 远程设置主机。 禁用初始化设置,它由 `initial-setup.service` 控制: + +``` +# 对多用户和图形目标禁用 initial-setup.service +unlink /etc/systemd/system/multi-user.target.wants/initial-setup.service +unlink /etc/systemd/system/graphical.target.wants/initial-setup.service +``` + +当你在 chroot 环境时,你可以对你系统做任何你想做的其它更改,或者就放在那里,在第一次启动后,按照云原生的工作流通过 SSH 进行配置。 + +### 重新压缩并安装修改后的镜像 + +完成了这些更改后,剩下的就是重新压缩磁盘镜像,并将其安装其到你的树莓派的 SD 卡上。 + +确保退出 chroot 环境,然后卸载磁盘镜像: + +``` +$ sudo umount ~/mnt/ +``` + +就像最初解压缩镜像一样,你可以再次使用 `xz` 命令来压缩镜像。通过使用 `--keep` 参数,`xz` 将保留原始的镜像,而不是清理掉它。虽然这会占用更多的磁盘空间,但保留下来的未压缩镜像将允许你对正在处理的镜像进行增量更改,而不需要每次都对其进行解压缩。这对于在测试和调整镜像时节省时间是非常好的。 + +``` +# 压缩压缩磁盘镜像为一个 .xz 文件,但保留原始磁盘镜像 +xz --compress Fedora-Server-armhfp-31-1.9-sda.raw --keep +``` + +压缩过程将花费一些时间,所以趁着这个时间站起来,舒展身体,让你的血液再次流动。 + +在压缩完成后,可以将新的、已修改过的磁盘镜像复制到 SD 卡上,以便与树莓派一起使用。标准的 `dd` 方法将镜像放置到 SD 卡上也很好用,但是我喜欢使用 Fedora 的 `arm-image-installer`,因为它因为它在处理未经编辑的镜像时提供了一些选项。它对编辑过的镜像也很好用,并且比 `dd` 命令更友好一些。 + +确保检查 SD 卡在哪个磁盘驱动器上,并用 `--media` 参数使用它: + +``` +# 使用 arm-image-installer 来复制已修改的磁盘镜像到 SD 卡上 +arm-image-installer --image=Fedora-Server-armhfp-X-y.z-sda.raw.xz --target=rpi3 --media=/dev/sdc --norootpass --resizefs -y +``` + +现在,你已经为树莓派或其它单板机准备好了一个新的、已修改的 Fedora Server ARM 镜像,准备好启动并立即 SSH 到你的修改镜像中。这种方法也可以用来做其它的修改,并且你也可以使用其它发行版的原始磁盘镜像,如果你更喜欢它们,而不是 Fedora 的话。这是一个开始构建家庭实验室私有云的良好基础。在以后的文章中,我将指导你使用云技术和自动化建立一个家庭实验室。 + +### 延伸阅读 + +为了学习如何做这篇文章中的事情,我做了很多研究。以下是我找到的两个对学习如何定制磁盘映像和使用非原生架构最有帮助的资料。它们对我从“不知道自己在做什么”到“我能够完成它!”非常有帮助。 + + * [如何修改你的自定义 Linux 发行版的原始磁盘镜像][12] + * [使用 DNF 维基][13] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/disk-image-raspberry-pi + +作者:[Chris Collins][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/clcollins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers) +[2]: https://opensource.com/article/19/3/home-lab +[3]: https://opensource.com/resources/raspberry-pi +[4]: https://opensource.com/sites/default/files/uploads/raspberrypi_homelab.jpg (Multiple Raspberry Pi computers, a switch, and a power bank) +[5]: https://arm.fedoraproject.org/ +[6]: https://arm.fedoraproject.org/verify.html +[7]: https://tukaani.org/xz/ +[8]: https://en.wikipedia.org/wiki/Fdisk +[9]: https://wiki.debian.org/initramfs +[10]: https://wiki.debian.org/RaspberryPi/qemu-user-static +[11]: https://github.com/%3Cyour_github_username%3E.keys +[12]: https://www.linux.com/news/how-modify-raw-disk-image-your-custom-linux-distro/ +[13]: https://wiki.mageia.org/en/Using_DNF#Setting_up_a_container_for_a_non-native_architectur diff --git a/published/202006/20200514 How IoT will rescue aviation.md b/published/202006/20200514 How IoT will rescue aviation.md new file mode 100644 index 0000000000..c6cd6c0ee8 --- /dev/null +++ b/published/202006/20200514 How IoT will rescue aviation.md @@ -0,0 +1,61 @@ +[#]: collector: (lujun9972) +[#]: translator: (Yufei-Yan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12367-1.html) +[#]: subject: (How IoT will rescue aviation) +[#]: via: (https://www.networkworld.com/article/3543318/how-iot-will-rescue-aviation.html) +[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) + +物联网将如何拯救航空业 +====== + +> 为防止感染新冠病毒的乘客登机,欧洲飞机制造商,空中客车公司正在研究能够识别病毒的物联网传感器。 + +![Stéphan Valentin][1] + +一家开发传感器来探测飞机上和机场中的爆炸物和其他化学物品的生物技术公司正在和空中客车合作,一同开发一种可以检测已经感染新冠病毒乘客的传感器。 + +Koniku 的创始人兼首席执行管 Osh Agabi 在[一篇博文][3]中说,总部位于加州的 Konibu 公司和空中客车(Airbus)公司从 2017 年就开始合作共同开发能够探测出不同化学物质的非接触式设备。 + +他们希望通过识别从呼吸或者汗液中的气味来判断是否感染新冠病毒,因为这些气味可能是新冠病毒中化学物质的标记。“大多数感染和疾病都会或多或少的改变我们呼吸和汗液里的化学成分,也就会产生不同的气味,” Agabi 写道。“如果我们检测到这些气味,我们就可以检测是否存在感染。” + +这两家公司希望能够识别这种新冠病毒的特异性标记,并且能找到一种可以检测这些标记的物联网(IoT)传感器,这些传感器配备有通过基因工程改造过的受体,从而对病毒进行探测。“那些受体会过滤空气中的分子,并且当它们接触到已经提前被编程检测的存在威胁或危险的分子化合物的时候,就会产生一个信号,”他写道。 + +他说,乘客将通过走过一个装有传感器的封闭通道来进行筛选。“通过对构成这些受体细胞中的 DNA 进行编程,使其对出现在感染者呼吸或者汗液中的化合物作出反应,我们相信,我们将能够迅速且可靠地筛查新冠病毒,并且确定一个人是否已经被感染,”他写道。 + +其他类型的非接触检测器已经在使用中了,包括皮肤温度升高elevated-skin-temperature(EST)摄像头。 + +意大利的最主要的机场 Leonardo da Vinci 购置了三个热成像头盔来发现发烧的人。机场已经配备了固定的热感应扫描仪,并且订购了更多的这种设备。[根据当地媒体 Fiumicino Online 的报道][5],被发现潜在发烧的乘客被会要求做进一步的医学检查。 + +位于中国深圳制造这种头盔的 KC Wearable 公司表示,这种头盔可以由员工佩戴,并且可以与乘客保持一定的距离。 + +制造热感应摄像头的 FLIR Systems 公司在其本月的[财报][6]中表示,对 EST 系统的需求正在持续增加。 + +“尽管这些热感应摄像头不能检测或者诊断任何医疗状况,但这些摄像头可以作为识别皮肤温度升高的有效工具。”报告说。 + +FLIR 公司 CEO Jim Cannon 在本月的收入电话会议上表示,“许多公司都在寻求在他们的设施中安装这种技术,以便解除就地避难shelter-in-place法令”。[根据路透社报道][8],通用汽车就是其中之一。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3543318/how-iot-will-rescue-aviation.html + +作者:[Patrick Nelson][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/Patrick-Nelson/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2018/08/passenger-view_of_airplane_wing_above_clouds_travel_journey_transportation_by_stephan_valentin_cc0_via_unsplash_1200x800-100766542-large.jpg +[2]: https://creativecommons.org/publicdomain/zero/1.0/ +[3]: https://www.linkedin.com/pulse/what-happens-when-airports-open-back-up-osh-agabi/?src=aff-lilpar&veh=aff_src.aff-lilpar_c.partners_pkw.10078_plc.Skimbit%20Ltd._pcrid.449670_learning&trk=aff_src.aff-lilpar_c.partners_pkw.10078_plc.Skimbit%20Ltd._pcrid.449670_learning&clickid=WNmzMlyalxyOUI7wUx0Mo34HUkiwwpy%3APQ3X1Y0&irgwc=1 +[4]: https://www.networkworld.com/newsletters/signup.html +[5]: https://www.fiumicino-online.it/articoli/cronaca-2/fase-2-all-aeroporto-di-fiumicino-lo-smart-helmet-per-controllare-la-febbre-a-distanza +[6]: https://flir.gcs-web.com/news-releases/news-release-details/flir-systems-announces-first-quarter-2020-financial-results +[7]: https://www.fool.com/earnings/call-transcripts/2020/05/06/flir-systems-inc-flir-q1-2020-earnings-call-transc.aspx +[8]: https://uk.reuters.com/article/us-flir-systems-gm/general-motors-taps-flir-systems-for-fever-check-cameras-at-factories-idUKKBN22J02B +[9]: https://www.facebook.com/NetworkWorld/ +[10]: https://www.linkedin.com/company/network-world diff --git a/published/202006/20200525 How to Execute a Command or Script at Reboot or Startup.md b/published/202006/20200525 How to Execute a Command or Script at Reboot or Startup.md new file mode 100644 index 0000000000..f3e2a0e45d --- /dev/null +++ b/published/202006/20200525 How to Execute a Command or Script at Reboot or Startup.md @@ -0,0 +1,151 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12279-1.html) +[#]: subject: (How to Execute a Command or Script at Reboot or Startup) +[#]: via: (https://www.2daygeek.com/execute-run-linux-scripts-command-at-reboot-startup/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在重启或启动时执行命令或脚本 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/04/091837g664qu0y206aqoo9.jpg) + +众总所周知 Linux 可以在启动时添加服务。例如,如果要在[启动时添加][1] Apache Httpd 服务,你可以在 `chkconfig` 和 `systemctl` 命令的帮助下完成此操作。 + +有时你需要在启动时添加自定义脚本、命令或服务,该怎么做?你可以使用以下三种方法来做到。 + +在本文中,我们将通过示例向你展示如何使用这些方法。 + +### 方法 1:如何使用 /etc/rc.d/rc.local 文件在重启或启动时运行脚本或命令 + +传统上,`/etc/rc.local` 文件是在切换到多用户运行级别的过程结束时,在所有正常的计算机服务启动之后执行的。 + +此方法也适用于 systemd 系统。 + +你需要将你的脚本位置添加到 `/etc/rc.d/rc.local` 文件中以在启动时运行。 + +确保该文件有运行权限: + +``` +# chmod +x /etc/rc.d/rc.local +``` + +作为演示,我们将创建一个简单的示例脚本。你可以根据需要创建任何脚本。 + +``` +# vi /opt/scripts/run-script-on-boot.sh + +#!/bin/bash +date > /root/on-boot-output.txt +hostname > /root/on-boot-output.txt +``` + +脚本完成后,设置可执行权限: + +``` +# chmod +x /opt/scripts/run-script-on-boot.sh +``` + +最后,将该脚本添加到文件底部: + +``` +# vi /etc/rc.d/rc.local + +/opt/scripts/run-script-on-boot.sh +``` + +[重启系统][2]进行检查: + +``` +# reboot +``` + +### 方法 2:如何使用 crontab 在重启或启动时执行命令或脚本 + +cron 在特定时间在后台自动执行计划的作业。可以在 [cron 任务][3]中使用特殊的字符串 `@reboot` 来完成。`@reboot` 是一个特殊的字符串,它允许用户在启动时运行任何命令或脚本。 + +此示例在系统重启时运行 `/opt/scripts/run-script-on-boot.sh` 文件。我们将使用与上面相同的脚本。 + +为此,只需在 crontab 文件中添加以下条目: + +``` +# crontab -e + +@reboot /opt/scripts/run-script-on-boot.sh +``` + +重启系统进行检查: + +``` +# reboot +``` + +### 方法 3:如何使用 systemd 服务单元在重启或启动时运行命令或脚本 + +此方法仅适用于 systemd 系统。该方法非常简单。 + +我们将使用上面相同的脚本进行演示。 + +为此,你需要创建一个 systemd 启动脚本并将其放在 `/etc/systemd/system/` 目录中。 + +这是我们的示例 systemd 启动单元脚本: + +``` +# vi sample-on-boot-script.service + +[Unit] +Description=Run a Custom Script at Startup +After=default.target + +[Service] +ExecStart=/opt/scripts/run-script-on-boot.sh + +[Install] +WantedBy=default.target +``` + +将单元脚本放置在 systemd 所在位置后,运行以下命令更新 systemd 配置文件并启用服务: + +``` +# systemctl daemon-reload +# systemctl enable sample-on-boot-script.service +``` + +重启系统进行检查: + +``` +# reboot +``` + +### 额外提示 + +如果你想在后台运行脚本,你需要在最后加上 `&` 符号 + +``` +/Path/To/My_Script & +``` + +如果你想以不同用户运行命令,使用以下格式: + +``` +su - $USER -c /Path/To/My_Script +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/execute-run-linux-scripts-command-at-reboot-startup/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/enable-disable-services-on-boot-linux-chkconfig-systemctl-command/ +[2]: https://www.2daygeek.com/6-commands-to-shutdown-halt-poweroff-reboot-the-linux-system/ +[3]: https://www.2daygeek.com/linux-crontab-cron-job-to-schedule-jobs-task/ diff --git a/published/202006/20200525 How to Make a GIF in GIMP -Simple Tutorial.md b/published/202006/20200525 How to Make a GIF in GIMP -Simple Tutorial.md new file mode 100644 index 0000000000..5d9f949b7f --- /dev/null +++ b/published/202006/20200525 How to Make a GIF in GIMP -Simple Tutorial.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12289-1.html) +[#]: subject: (How to Make a GIF in GIMP [Simple Tutorial]) +[#]: via: (https://itsfoss.com/make-gif-in-gimp/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +初级:如何在 GIMP 中制作 GIF +====== + +制作一个 GIF 可能是一件很有趣的事,很多用户可能都想如何制作一个 GIF。你可以使用功能强大的开源图像编辑软件 [GIMP][1] 创建一个非常简单的 GIF。 + +在这篇 GIMP 教程中,我将向你展示如何在 GIMP 中创建一个简单的 GIF。 + +### 在 GIMP 中制作一个 GIF + +![][2] + +使用 GIMP 作为一个动画制作工具需要你把每个图层都看作动画的一帧。在这篇教程中,我将创建一个简单的基于我们的徽标的网页横幅。我将使用 2 个图像作为我的图层,但当你制作自己的 GIF 时,你可以随意添加更多的图像。 + +我在这里使用的方法叫做“组合法”,在这个方法中,新的帧被添加到先前的帧中。我的想法是制作一个“频闪”的网页横幅,来在对一些重要的事情引起注意。 + +我假设你已经 [在 Ubuntu 或其它使用的操作系统中安装了 GIMP][3]。让我们开始制作 GIF 吧。 + +#### 步骤 1 + +从“文件”菜单中,单击“作为图层打开”,并选择你想包含在 GIF 中的所有图像。然后单击“打开”。 + +![][4] + +你可以排序图层标签页中的图像。GIF 的帧序列将从最下面的图层开始,从下到上运行每一层图层。 + +![][5] + +从主菜单中选择“滤镜”,接着选择“动画”,最后单击“优化(用于 GIF)”。 + +![][6] + +> “优化”做了什么? +> +> 优化会检查每一个图层,如果来自前一帧的信息在下一帧中没有改变,则重复使用这些信息。它只存储新更改的像素值,并清除任何重复的部分。 +> +> 如果一帧与前一帧完全相同,那么它将完全删除这一幅帧,并且前一帧将恰当地在屏幕上停留更长时间。 + +要查看该 GIF,从主菜单中单击“滤镜”,接着单击“动画”和“回放”。 + +![][7] + +按下“回放”按钮来启动 GIF。要保存该 GIF,在文件菜单上选择“文件”,单击“导出为”。 + +![][8] + +命名你的 GIF,并选择你想将其保存到的文件夹。在“选择文件类型”时,选择 “GIF 图像”。 + +![][9] + +当提示时,选择“作为动画”、“反复循环”,设置期望的延迟值,并单击“上面输入的延迟用于所有帧”来生效。 + +最重要的选项是设置帧处理动作为“累积各图层(组合)”,以便为我们的横幅获取“频闪”效果。单击“导出”作为最后一个步骤。 + +![][10] + +你的 GIF 已经准备好了! + +![][11] + +这是一个浅显易懂的示例,不过 GIMP 在动画创作方面有很多能力,需要大量的学习和实践才能掌握它。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/make-gif-in-gimp/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://www.gimp.org/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/create-gif-in-gimp.jpg?ssl=1 +[3]: https://itsfoss.com/gimp-2-10-release/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/1.-open-as-layers.jpeg?ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/layers-order.jpg?ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/2.-optimize-for-gif-1.png?fit=800%2C647&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/3.-playback.png?fit=800%2C692&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/4.-export-as.png?ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/5.-save-as-gif.png?fit=800%2C677&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/6.-export-options-1.png?ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/its-foss-logo.gif?fit=800%2C417&ssl=1 +[12]: https://itsfoss.com/subscribe-to-newsletter/ diff --git a/published/202006/20200525 How to Manipulate an Ethernet Card Using the ethtool Command.md b/published/202006/20200525 How to Manipulate an Ethernet Card Using the ethtool Command.md new file mode 100644 index 0000000000..faf7eb196d --- /dev/null +++ b/published/202006/20200525 How to Manipulate an Ethernet Card Using the ethtool Command.md @@ -0,0 +1,304 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12290-1.html) +[#]: subject: (How to Manipulate an Ethernet Card Using the ethtool Command) +[#]: via: (https://www.2daygeek.com/linux-ethtool-command-view-change-ethernet-adapter-settings-nic-card/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何使用 ethtool 命令管理以太网卡 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/06/223359syh8n37luz8hhllh.jpg) + +`ethtool` 用于查看和修改网络设备(尤其是有线以太网设备)的驱动参数和硬件设置。你可以根据需要更改以太网卡的参数,包括自动协商、速度、双工和局域网唤醒等参数。通过对以太网卡的配置,你的计算机可以通过网络有效地进行通信。该工具提供了许多关于接驳到你的 Linux 系统的以太网设备的信息。 + +在这篇文章中,我们将告诉你如何更改以下的参数以及如何查看这些参数。这篇文章将帮助你在 Linux 系统中排除与以太网卡相关的问题。 + +下面的信息将帮助你了解以太网卡的工作原理。 + +* **半双工**:半双工模式允许设备一次只能发送或接收数据包。 +* **全双工**:全双工模式允许设备可以同时发送和接收数据包。 +* **自动协商**:自动协商是一种机制,允许设备自动选择最佳网速和工作模式(全双工或半双工模式)。 +* **速度**:默认情况下,它会使用最大速度,你可以根据自己的需要改变它。 +* **链接检测**:链接检测可以显示网卡的状态。如果显示为 `no`,请尝试重启网卡。如果链路检测仍显示 `no`,则检查交换机与系统之间连接的线缆是否有问题。 + +### 如何在 Linux 上安装 ethtool + +默认情况下,大多数系统上应该已经安装了 `ethtool`。如果没有,你可以从发行版的官方版本库中安装。 + +对于 RHEL/CentOS 6/7 系统,请使用 [yum 命令][1] 安装 `ethtool`: + +``` +$ sudo yum install -y ethtool +``` + +对于 RHEL/CentOS 8 和 Fedora 系统,请使用 [dnf 命令][2] 安装 `ethtool`: + +``` +$ sudo yum install -y ethtool +``` + +对于基于 Debian 的系统,请使用 [apt 命令][3] 或 [apt-get 命令][4] 安装 `ethtool`: + +``` +$ sudo apt-get install ethtool +``` + +对于 openSUSE 系统,使用 [zypper 命令][5] 安装 `ethtool`: + +``` +$ sudo zypper install -y ethtool +``` + +对于 Arch Linux 系统,使用 [pacman 命令][6] 安装 `ethtool`: + +``` +$ sudo pacman -S ethtool +``` + +### 如何检查 Linux 上的可用网络接口 + +你可以使用 [ip 命令][7]或 `ifconfig` 命令(在现代发行版中已被淘汰)来验证可用的、活动的网卡的名称和其他细节: + +``` +# ip a +或 +# ifconfig + +1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever +2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000 + link/ether 00:10:22:35:23:sf brd ff:ff:ff:ff:ff:ff + inet 192.164.23.100/24 brd 192.164.23.255 scope global eth0 + valid_lft forever preferred_lft forever +``` + +### 如何检查 Linux 上的网卡(NIC)信息 + +掌握了以太网卡名称后,就可以使用 `ethtool` 命令轻松查看其详细信息,如下所示。 + +在 Linux 系统中,每个网卡(NIC)都被分配了唯一的名称,如 ethX、enpXXX 等。 + +* 旧的 Linux 发行版使用的是 `eth[X]` 格式。例如,RHEL 6 和它们的旧版本。 +* 现代的 Linux 发行版使用 `enp[XXX]` 或 `ens[XXX]` 格式。例如,大多数现代 Linux 发行版都使用这种格式,包括 RHEL 7、Debian 10、Ubuntu 16.04 LTS。 + +``` +# ethtool eth0 + +Settings for eth0: + Supported ports: [ TP ] + Supported link modes: 1000baseT/Full + 10000baseT/Full + Supported pause frame use: No + Supports auto-negotiation: No + Supported FEC modes: Not reported + Advertised link modes: Not reported + Advertised pause frame use: No + Advertised auto-negotiation: No + Advertised FEC modes: Not reported + Speed: 10000Mb/s + Duplex: Full + Port: Twisted Pair + PHYAD: 0 + Transceiver: internal + Auto-negotiation: off + MDI-X: Unknown + Supports Wake-on: uag + Wake-on: d + Link detected: yes +``` + +### 如何检查以太网卡的驱动程序和固件版本 + +你可以使用 `ethtool` 命令的 `-i` 选项检查驱动程序版本、固件版本和总线的详细信息,如下所示: + +``` +# ethtool -i eth0 + +driver: vmxnet3 +version: 1.4.16.0-k-NAPI +firmware-version: +expansion-rom-version: +bus-info: 0000:0b:00.0 +supports-statistics: yes +supports-test: no +supports-eeprom-access: no +supports-register-dump: yes +supports-priv-flags: no +``` + +### 如何检查网络使用情况统计 + +你可以使用 `ethtool` 命令中的 `-S` 选项来查看网络使用情况统计。它可以显示传输的字节数、接收的字节数、错误数等。 + +``` +# ethtool -S eth0 + +NIC statistics: + Tx Queue#: 0 + TSO pkts tx: 2053 + TSO bytes tx: 7167572 + ucast pkts tx: 4028081 + ucast bytes tx: 399093197 + mcast pkts tx: 0 + mcast bytes tx: 0 + bcast pkts tx: 0 + bcast bytes tx: 0 + pkts tx err: 0 + pkts tx discard: 0 + drv dropped tx total: 0 + too many frags: 0 + giant hdr: 0 + hdr err: 0 + tso: 0 + ring full: 0 + pkts linearized: 0 + hdr cloned: 0 + giant hdr: 0 + Tx Queue#: 1 + TSO pkts tx: 1955 + TSO bytes tx: 6536945 + ucast pkts tx: 3711838 + ucast bytes tx: 346309662 + mcast pkts tx: 0 + mcast bytes tx: 0 + bcast pkts tx: 1186 + bcast bytes tx: 49812 + pkts tx err: 0 + pkts tx discard: 0 + drv dropped tx total: 0 + too many frags: 0 + giant hdr: 0 + hdr err: 0 + tso: 0 + ring full: 0 + pkts linearized: 0 + hdr cloned: 0 + giant hdr: 0 + Rx Queue#: 0 + LRO pkts rx: 0 + LRO byte rx: 0 + ucast pkts rx: 5084776 + ucast bytes rx: 4673133395 + mcast pkts rx: 0 + mcast bytes rx: 0 + bcast pkts rx: 154143 + bcast bytes rx: 45415676 + pkts rx OOB: 0 + pkts rx err: 0 + drv dropped rx total: 0 + err: 0 + fcs: 0 + rx buf alloc fail: 0 + Rx Queue#: 1 + LRO pkts rx: 0 + LRO byte rx: 0 + ucast pkts rx: 6346769 + ucast bytes rx: 4835534292 + mcast pkts rx: 0 + mcast bytes rx: 0 + bcast pkts rx: 3464 + bcast bytes rx: 714646 + pkts rx OOB: 0 + pkts rx err: 0 + drv dropped rx total: 0 + err: 0 + fcs: 0 + rx buf alloc fail: 0 + tx timeout count: 0 +``` + +### 如何改变以太网设备的速度 + +你可以根据需要改变以太网的速度。当你进行此更改时,网卡将自动掉线,你需要使用 [ifup 命令][8] 或 `ip` 命令或 `nmcli` 命令将其重新上。 + +``` +# ethtool -s eth0 speed 100 +# ip link set eth0 up +``` + +### 如何在 Linux 上启用/禁用以太网卡的自动协商? + +你可以使用 `ethtool` 命令中的 `autoneg` 选项启用或禁用自动协商,如下图所示: + +``` +# ethtool -s eth0 autoneg off +# ethtool -s eth0 autoneg on +``` + +### 如何同时更改多个参数 + +如果你想使用 `ethtool` 命令同时更改以太网卡的多个参数,请使用下面的格式: + +``` +Syntax: +ethtool –s [device_name] speed [10/100/1000] duplex [half/full] autoneg [on/off] +``` + +``` +# ethtool –s eth0 speed 1000 duplex full autoneg off +``` + +### 如何检查特定网卡的自动协商、RX 和 TX + +要查看关于特定以太网设备的自动协商等详细信息,请使用以下格式: + +``` +# ethtool -a eth0 +``` + +### 如何从多个设备中识别出特定的网卡(闪烁网卡上的 LED) + +如果你想识别一个特定的物理接口,这个选项非常有用。下面的 `ethtool` 命令会使 `eth0` 端口的 LED 灯闪烁: + +``` +# ethtool -p eth0 +``` + +### 如何在 Linux 中永久设置这些参数 + +在系统重启后,你使用 `ethtool` 所做的更改将被默认恢复。 + +要使自定义设置永久化,你需要更新网络配置文件中的值。根据你的 Linux 发行版,你可能需要将此值更新到正确的文件中。 + +对于基于 RHEL 的系统。你必须使用 `ETHTOOL_OPTS` 变量: + +``` +# vi /etc/sysconfig/network-scripts/ifcfg-eth0 + +ETHTOOL_OPTS="speed 1000 duplex full autoneg off" +``` + +对于基于 Debian 的系统: + +``` +# vi /etc/network/interfaces + +post-up ethtool -s eth0 speed 1000 duplex full autoneg off +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/linux-ethtool-command-view-change-ethernet-adapter-settings-nic-card/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/linux-yum-command-examples-manage-packages-rhel-centos-systems/ +[2]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ +[3]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/ +[4]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/ +[5]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/ +[6]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/ +[7]: https://www.2daygeek.com/ip-command-configure-network-interface-usage-linux/ +[8]: https://www.2daygeek.com/enable-disable-up-down-nic-network-interface-port-linux-using-ifconfig-ifdown-ifup-ip-nmcli-nmtui/ diff --git a/published/202006/20200525 How to Remove Files Older than N Days Using Tmpwatch-Tmpreaper on Linux.md b/published/202006/20200525 How to Remove Files Older than N Days Using Tmpwatch-Tmpreaper on Linux.md new file mode 100644 index 0000000000..5f0859154c --- /dev/null +++ b/published/202006/20200525 How to Remove Files Older than N Days Using Tmpwatch-Tmpreaper on Linux.md @@ -0,0 +1,182 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12284-1.html) +[#]: subject: (How to Remove Files Older than N Days Using Tmpwatch/Tmpreaper on Linux) +[#]: via: (https://www.2daygeek.com/how-to-remove-files-older-than-n-days-using-tmpwatch-tmpreaper-on-linux/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何使用 Tmpwatch/Tmpreaper 删除旧文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/05/091806zrnwahdl9fdyznrw.jpg) + +你可能忘记了删除计算机上某个目录中不再需要的文件的操作。这可能是“下载”或任何其他目录。它可能已经增长了一段时间。 + +即便有足够的存储空间,你也应该删除它们,因为这会在列出文件时降低系统速度。同样,当一个目录中有成千上万个文件时,它可能很会很臃肿。 + +当你不知道要检查的文件名时,很难在特定目录中找到文件。 + +我们可以通过结合使用 `find` 命令和一些组合来做到这一点,我们过去已经写过一篇文章。 + +* [使用 Bash 脚本在 Linux 中删除早于 “X” 天的文件/文件夹][1] + +今天,我们将向你展示如何在 Linux 上使用 Tmpwatch 程序来实现这一目标。 + +### 什么是 tmpwatch + +`tmpwatch` 会在指定目录中递归删除指定时间段内未被访问的文件。通常,它用于自动清除临时文件系统目录,例如 `/tmp` 和 `/var/tmp`。 + +它只会删除空目录、常规文件和符号链接。它不会切换到其他文件系统,并避开了属于根用户的 `lost+found` 目录。 + +默认情况下,`tmpwatch` 会根据文件的 atime(访问时间)而不是 mtime(修改时间)删除文件。 + +你可以在 `tmpwatch` 命令中添加其他参数来更改这些行为。 + +**警告:** 请不要在 `/` 中运行 `tmpwatch` 或 `tmpreaper`,因为该程序中没有防止这种情况的机制。 + +### 如何在 Linux 上安装 tmpwatch + +可以在官方仓库中按以下方式安装 `tmpwatch`。 + +对于 RHEL/CentOS 6 系统,请使用 [yum 命令][2]安装 `tmpwatch`。 + +``` +$ sudo yum install -y tmpwatch +``` + +对于 Debian 和 Ubuntu 系统,请使用 [apt 命令][3] 或 [apt-get 命令][4] 安装 `tmpreaper`。 + +``` +$ sudo apt-get install tmpreaper +``` + +对于 openSUSE 系统,请使用 [zypper 命令][5] 安装 `tmpwatch`。 + +``` +$ sudo zypper install -y tmpwatch +``` + +对于 Fedora 系统,请使用 [dnf 命令][6] 安装 `tmpwatch`。 + +``` +$ sudo dnf install -y tmpwatch +``` + +**请注意:** 如果你使用的是基于 Debian 的系统,请使用 `tmpreaper` 而不是 `tmpwatch`。所有示例都可以如预期工作。 + +### 了解关键选项和参数 + +* `atime`(文件上次访问时间):显示命令或脚本等任意进程最后一次访问文件中数据的时间。 +* `mtime`(文件上次修改时间):显示修改文件内容或保存文件的时间。除非是更改文件属性,否则大多数情况下 `ctime` 和 `mtime` 会相同。 +* `ctime`(文件上次更改时间):显示文件元数据更改时间。这意味着更改文件属性的时间(如所有权或组等)。 +* `dirmtime`(目录的上次修改时间):显示目录的上一次修改时间。 + +时间参数定义删除文件的阈值。 + +* `d` – 天 +* `h` – 小时 +* `m` – 分钟 +* `s` – 秒 + +### 如何使用 tmpwatch 命令删除一段时间未访问的文件 + +正如我在本文开头所说,`tmpwatch` 默认根据文件访问时间(`atime`)来删除文件。另外,由于小时是默认参数,因此如果使用小时单位,那么无需在时间上添加后缀。 + +例如,运行以下命令以递归方式删除过去 5 个小时未访问的文件。 + +``` +# tmpwatch 5 /tmp +``` + +运行以下命令删除最近 10 个小时未修改的文件。如果要使用修改时间(`mtime`)来删除文件,那么需要在 `tmpwatch` 命令中添加 `-m` 选项。 + +``` +# tmpwatch -m 10 /home/daygeek/Downloads +``` + +### 如何使用 tmpwatch 命令删除超过 “X” 天未访问的文件 + +如果要使用天数删除文件,那么需要添加后缀 `d`。以下示例删除了 30 天以上的文件。 + +``` +# tmpwatch 30d /home/daygeek/Downloads +``` + +### 如何使用 tmpwatch 命令删除一段时间内未访问的所有文件 + +以下命令将基于修改时间(`mtime`)删除所有类型的文件,而不仅仅是常规文件、符号链接和目录。 + +``` +# tmpwatch -am 12 /tmp +``` + +### 如何在 tmpwatch 中排除目录 + +以下命令将删除过去 10 个小时未修改的所有文件,并排除目录。 + +``` +# tmpwatch -am 10 --nodirs /home/daygeek/Downloads +``` + +### 如何在 tmpwatch 中排除特定路径 + +以下命令将删除过去 10 个小时未被修改的所有文件,除了下面排除的文件夹。 + +``` +# tmpwatch -am 10 --exclude=/home/daygeek/Downloads/Movies /home/daygeek/Downloads +``` + +### 如何在 tmpwatch 中排除特定模式 + +以下命令将删除过去 10 小时未被修改的所有文件,除了满足下面列出的模式的文件。 + +``` +# tmpwatch -am 10 --exclude-pattern='*.pdf' /home/daygeek/Downloads +``` + +### 如何让 tmpwatch 命令空运行 + +如果要空运行,请运行以下命令。 + +``` +# tmpwatch -t 5h /home/daygeek/Downloads +``` + +### 如何设置 cronjob 来使用 tmpwatch 定期删除文件 + +默认情况下,它在 `/etc/cron.daily/tmpreaper` 目录下有一个 [cronjob][7] 文件。该 cronjob 根据位于 `/etc/timereaper.conf` 中的配置文件工作。你可以根据需要自定义文件。 + +它每天运行一次,并删除 7 天之前的文件。 + +另外,如果你希望常规执行某项操作,那么可以根据需要手动添加一个 cronjob。 + +``` +# crontab -e + +0 10 * * * /usr/sbin/tmpwatch 15d /home/daygeek/Downloads +``` + +上面的 cronjob 将在每天上午 10 点删除早于 15 天的文件。 + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/how-to-remove-files-older-than-n-days-using-tmpwatch-tmpreaper-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-11490-1.html +[2]: https://www.2daygeek.com/linux-yum-command-examples-manage-packages-rhel-centos-systems/ +[3]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/ +[4]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/ +[5]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/ +[6]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ +[7]: https://www.2daygeek.com/linux-crontab-cron-job-to-schedule-jobs-task/ diff --git a/published/202006/20200525 Linux Mint 20- Release Date, Features and Everything Important Associated With it.md b/published/202006/20200525 Linux Mint 20- Release Date, Features and Everything Important Associated With it.md new file mode 100644 index 0000000000..77ec2ec8d7 --- /dev/null +++ b/published/202006/20200525 Linux Mint 20- Release Date, Features and Everything Important Associated With it.md @@ -0,0 +1,120 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12297-1.html) +[#]: subject: (Linux Mint 20: Release Date, Features and Everything Important Associated With it) +[#]: via: (https://itsfoss.com/linux-mint-20/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux Mint 20 发布前一窥 +====== + +[Ubuntu 20.04 LTS 版本发布了][1]。这对 Linux Mint 用户来说也是一个好消息。一个新的 Ubuntu LTS 版本意味着新的 Linux Mint 主要版本也将很快随之出现。 + +为什么这么说呢?因为 Linux Mint 是基于 Ubuntu 的长期支持(LTS)版本的。Mint 18 系列是基于 Ubuntu 16.04 LTS,Mint 19 是基于 Ubuntu 18.04 LTS 等等。 + +与 Ubuntu 不同,Linux Mint 没有固定的发布时间表。根据以往的趋势,我可以做出一个明智的猜测,[Linux Mint][2] 20 应该会在今年 6 月发布。 + +### Linux Mint 20 “Ulyana” 即将推出的新功能 + +![][3] + +让我们来看看代号为 Ulyana 的 Linux Mint 20 中提出的一些主要新功能和变化。 + +#### 1. 提高 Nemo 文件管理器的性能 + +Nemo 文件管理器计划中的性能改进之一是它处理缩略图的方式。你可能还没有意识到,但缩略图的生成需要相当多的系统资源(以及磁盘空间)。试着打开一个有几千张图片的文件夹,你会发现 CPU 的消耗会上升。 + +在 Linux Mint 20 中,其目标是优先考虑内容和导航,并尽可能地延迟缩略图的渲染。这意味着在缩略图渲染之前,文件夹的内容会以通用图标显示出来。这不会让人觉得赏心悦目,但你会注意到性能的改善。 + +#### 2. 两种焕然一新的颜色变体 + +默认情况下,Linux Mint 是绿色/薄荷色的风格。还有一些其它的颜色点缀。Linux Mint 20 新添加了两种可爱的的粉红色和青蓝色。 + +以及新的青蓝色风格: + +![Linux Mint Aqua][4] + +这里是新的粉红色风格: + +![Linux Mint Pink][5] + +#### 3. 没有过度偏重于 Snap 包 + +Ubuntu 20.04 将 snap 包的优先级放在了通常的 apt 包之前。事实上,如果你在 Ubuntu 20.04 中使用 `apt` 命令安装 Chromium 浏览器时,它会自动安装 snap 版本。 + +Linux Mint 团队显然对此不满意,他们确认 Mint 20 将不会安装 snaps 或 snapd。它还将禁止 `apt` 使用 snapd。 + +你仍然可以自己手动安装 snap 包。只是不会由 `apt` 来安装它们。 + +#### 4. 有了这个新工具,跨网络共享文件变得很简单。 + +Linux Mint 20 将提供一个[新的 GUI 工具][6],可以轻松地在本地网络上共享文件,而无需任何额外的配置。 + +![New tool for sharing files across the network][7] + +#### 5. 更好地整合了 Electron 应用程序的桌面 + +[Electron][8] 是一个开源框架,它允许使用 Web 技术构建跨平台的桌面应用程序。有些人称它为懒惰的方法,因为应用程序运行在 Chromium 浏览器之上。然而,这可以让开发人员轻松地将他们的应用程序提供给 Linux(和 macOS)。[Linux 上的 Slack][9] 就是众多这样的例子之一。 + +Linux Mint 20 将对 Electron 应用提供更好的支持,并改进系统托盘和桌面通知的集成。 + +#### 6. 改进的支持多显示器的比例缩放功能 + +![improved multi-monitor support][10] + +一个提议的改变是在 Linux Mint 20 中加入支持多显示器的比例缩放功能。如果你有一个 HiDPI 和非 HiDPI 显示器的组合,你可以为它们每一个选择不同的分辨率、刷新率和不同的分数缩放。 + +在 Mint 20 的登录屏幕,可以让你跨多个显示器拉伸显示背景。 + +#### 7. 改进对 Nvidia Optimus 的支持 + +在 Mint 20 中,Nvidia prime 小程序会显示 GPU 渲染器。你也可以直接从系统托盘中的菜单中选择切换到哪块卡。 + +![Switch between GPUs][12] + +你也可以使用 Nvidia “On-Demand” 模式。在这种模式下,将使用英特尔卡来渲染会话。而如视频播放器或视频编辑器这样的兼容应用程序可以在应用程序菜单中打开时使用 Nvidia GPU。 + +![Run an application with NVIDIA GPU][13] + +#### 8. 不再支持 32 位 + +虽然 Ubuntu 18.04 在两年前就放弃了 32 位 ISO,但 Linux Mint 19 系列一直提供 32 位 ISO 的下载和安装。 + +这种情况在 Linux Mint 20 中有所改变。Linux Mint 20 已经没有 32 位版本了。这是因为 32 位支持从 Ubuntu 20.04 中完全消失了。 + +#### 还有什么? + +Cinnamon 4.6 桌面版的发布带来了很多视觉上的变化。 + +在 Ubuntu 20.04 中,应该会有一些“引擎盖下”的变化,比如 Linux Kernel 5.4,取消了 Python 2 的支持,加入 [Wireguard VPN][11] 等。 + +随着开发的进展,我会在本文中更新更多的功能。敬请期待。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-mint-20/ + +作者:[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/ubuntu-20-04-release-features/ +[2]: https://www.linuxmint.com/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/Linux-Mint-20.png?ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/mint-20-aqua.jpg?ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/mint-20-pink-1.jpg?ssl=1 +[6]: https://blog.linuxmint.com/?p=3863 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/mint-20-warpinator-1.png?ssl=1 +[8]: https://www.electronjs.org/ +[9]: https://itsfoss.com/slack-use-linux/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/monitor_display_Linux_mint_20.png?ssl=1 +[11]: https://itsfoss.com/wireguard/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/nvidia-prime-applet-linux-mint-20.png?w=386&ssl=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/nvidia-on-deman-feature-linux-mint-20.png?w=526&ssl=1 diff --git a/published/202006/20200525 Track Your Screen Time in Linux with ActivityWatch.md b/published/202006/20200525 Track Your Screen Time in Linux with ActivityWatch.md new file mode 100644 index 0000000000..e1b6cd5fa1 --- /dev/null +++ b/published/202006/20200525 Track Your Screen Time in Linux with ActivityWatch.md @@ -0,0 +1,129 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12302-1.html) +[#]: subject: (Track Your Screen Time in Linux with ActivityWatch) +[#]: via: (https://itsfoss.com/activitywatch/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +使用 ActivityWatch 跟踪你在 Linux 中的屏幕使用时间 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/10/104854yumcnhp8smmjxcht.jpg) + +> ActivityWatch 是一款开源的隐私友好型应用程序,可追踪你在台式电脑或移动设备上的使用时间。 + +### ActivityWatch: 一个追踪你在哪个应用程序上花了多少时间的开源应用程序 + +![ActivityWatch lets you check the time spent on various applications][1] + +[ActivityWatch][2] 是一款跨平台的开源应用,可以帮助你追踪使用时间,衡量你的工作效率。它可以追踪你花在应用程序、浏览器上的时间,以及你是否 AFK(远离键盘)或系统处于休眠状态。 + +不只是追踪时间,它还提供了一堆有用的功能,通过可视化的方式帮助你轻松分析你是如何花费时间的,从而有可能提高你的生产力。 + +![][3] + +它是 [RescueTime][4] 和 [ManicTime][5] 等专有产品的绝佳替代品。 + +ActivityWatch 可用于 Linux、Windows、macOS 和 [Android][6]。它还提供了 Chrome 和 Firefox 的浏览器扩展。截至目前,App Store 上还没有它的 iOS 版应用。 + +![][7] + +它刚刚进入该领域,正在积极开发,以解决任何现有的问题并引入新的功能,如在多个设备上同步你的活动数据的能力。 + +**对于注重隐私的用户来说,我应该提到,收集的数据被存储在你本地的设备上。这是一件好事,因为你可以跟踪你的花费时间,而不会被别人跟踪。** + +### ActivityWatch 的功能 + +![][8] + +基本上,ActivityWatch 可以让你监控你的活动,以分析不良的屏幕使用时间,或改善你在设备上工作的时间管理。 + +具体来说,它提供了几个有用的功能,主要有: + +* 摘要你的日常活动及按使用时间排序的应用和程序列表。 +* 追踪你的浏览器活动的时间,使用浏览器扩展来获得每个活动标签所花费时间的确切数据。 +* 追踪 AFK 和非 AFK 时间。(AFK - “Away From Keyboard” 的缩写,即不在电脑前) +* 提供不同的可视化时间线,以监测你的活动。 +* 能够使用 [watchers][9] 跟踪你在编辑器上写代码的时间。 +* 记录你的活动,以分析你的生产力。 +* 将花费的时间进行分类,可以帮助你详细分析。 +* 可以添加更多的类别和调整时间轴的持续时长。 +* 能够将数据导出/导入为 [JSON][10] 文件。 +* 实验性的秒表功能。 +* 本地存储数据,以尊重用户隐私。 + +### 在 Linux 上安装 ActivityWatch + +> 注:如果你的 Linux 发行版不支持系统托盘图标,你需要遵循这个[文档][11]来解决这个问题。 + +不幸的是,你找不到 AppImage、Flatpak 或 Snap 软件包。然而,对于 Manjaro 或 Arch Linux 有可以安装的 [AUR][12] 包。 + +对于所有其它的 Linux 发行版,你会得到一个 ZIP 文件,其中包括一个要运行的 `aw-qt` 应用程序。 + +要运行它,你需要[解压 zip 归档文件][13],然后通过双击 `aw-qt` 应用程序运行二进制文件来安装它。 + +![Aw Qt][14] + +你也可以使用终端: + +``` +cd activitywatch-v0.9.2-linux-x86_64 +sudo ./aw-qt +``` + +解压文件夹的位置和文件名可能会有所不同 —— 所以请确保你导航到正确的目录,然后使用上面的命令。完成后,你可以从系统托盘图标访问 ActivityWatch,或者直接前往 [localhost:5600][15] 访问它。 + +你也可以查看他们的 [GitHub 页面][16]或[官方网站][2]来探索更多关于它的信息。 + +- [下载 ActivityWatch][2] + +顺便提一句,如果你计划经常使用 ActivityWatch,你应该将下载的文件移动到 `/opt` 目录下,并在 `/usr/share/bin` 目录下创建一个链接到 `aw-qt` 可执行文件符号链接。这样一来,该应用程序可以作为一个常规命令供系统上的所有用户使用。类似的方法在 [PopcornTime 安装教程][17]中也有演示。 + +### 我对 ActivityWatch 的看法 + +![][18] + +在 [Pop!_OS 20.04][19] 上,时间跟踪功能可以完全正常地工作,也支持系统托盘图标。你可能会遇到一个错误,不能让你从系统托盘图标访问 ActivityWatch(这也是一个 [GitHub 上的已知问题][20])。在这种情况下,你需要通过 [localhost:5600][15] 来访问它。 + +就个人而言,考虑到我在桌面上使用它,并且没有计划在智能手机上使用它,我对提供的功能相当满意。 + +我必须得向你推荐尝试这个不错的开源项目,并一路支持他们。如果你喜欢这个项目,请随时通过添加星标或赞助[他们的 GitHub 仓库][21]来表示你的赞赏。 + +欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/activitywatch/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/activitywatch.png?fit=800%2C607&ssl=1 +[2]: https://activitywatch.net/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/activitywatch-afk.jpg?ssl=1 +[4]: https://itsfoss.com/recommends/rescuetime/ +[5]: https://www.manictime.com/ +[6]: https://play.google.com/store/apps/details?id=net.activitywatch.android +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/activitywatch-timeline.jpg?ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/activitywatch-settings.jpg?ssl=1 +[9]: https://docs.activitywatch.net/en/latest/watchers.html +[10]: https://en.wikipedia.org/wiki/JSON +[11]: https://docs.activitywatch.net/en/latest/getting-started.html +[12]: https://aur.archlinux.org/packages/activitywatch-bin/ +[13]: https://itsfoss.com/unzip-linux/ +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/aw-qt.jpg?ssl=1 +[15]: https://itsfoss.com/activitywatch/5600 +[16]: https://github.com/ActivityWatch +[17]: https://itsfoss.com/popcorn-time-ubuntu-linux/ +[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/activitywatch-screenshot.jpg?ssl=1 +[19]: https://itsfoss.com/pop-os-20-04-review/ +[20]: https://github.com/ActivityWatch/activitywatch/issues/208 +[21]: https://github.com/ActivityWatch/activitywatch diff --git a/published/202006/20200525 Ubuntu Budgie 20.04 Review- Smooth, Polished - Plenty of Changes.md b/published/202006/20200525 Ubuntu Budgie 20.04 Review- Smooth, Polished - Plenty of Changes.md new file mode 100644 index 0000000000..26bcd153cd --- /dev/null +++ b/published/202006/20200525 Ubuntu Budgie 20.04 Review- Smooth, Polished - Plenty of Changes.md @@ -0,0 +1,165 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12354-1.html) +[#]: subject: (Ubuntu Budgie 20.04 Review: Smooth, Polished & Plenty of Changes) +[#]: via: (https://itsfoss.com/ubuntu-budgie-20-04-review/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +Ubuntu Budgie 20.04 LTS:平滑、精致和丰富的变化 +====== + +正如我们向读者承诺的那样,我们将对 [Ubuntu 20.04 LTS 版本][1]的所有主要特色版进行评测。在这个续篇中,我们将对 Ubuntu Budgie 进行评测。 + +![Ubuntu Budgie Desktop][2] + +顾名思义,[Ubuntu Budgie][3] 是使用 [Budgie 桌面环境][5]的 [Ubuntu 官方特色版][4]。这个版本是 Ubuntu 家族中较新的一位成员。Ubuntu Budgie 的第一个版本是 16.04,它在 17.04 版本时被接受为官方特色版。 + +他们的[目标][6]是“结合 Budgie 界面的简洁和优雅,以生产具有现代范式的面向桌面的传统发行版。” + +### Ubuntu Budgie 20.04 评测:哪些改变了,哪些没有! + +[自 18.04 LTS 发布以来,Ubuntu Budgie][7] 有了令人惊讶的更新和改进: + + * 苹果风格的新菜单 + * 默认采用基于 Budgie 的网络管理小程序 + * 新的 Window Shuffler 允许你通过快捷键平铺应用程序 + * 快速切换桌面布局的新工具 + * 支持 4k 分辨率 + * 新的默认应用程序:GNOME Firmware 和 Drawing + * 现在已经为 20.04 重构了向后移植包 + * 默认浏览器是火狐 + * 默认使用 Catfish 搜索文件和文本 + * 在 Budgie 中集成了 Nemo 文件管理器 + * 由于错误,系统托盘小程序被移除了 + * 默认情况下,事件警报声被禁用 + * 修复了键盘快捷键神秘失踪的问题 + * 更好的锁屏样式 + * 由于社区的需求,文件应用 Nautilus 已被 Nemo 取代 + * Plank 坞站现在已经切换到屏幕底部,是透明的,并且默认有弹跳动画 + * 快速笔记和热角小程序已从 Python 移植到 Vala,以提高速度 + * Celluloid 取代了 MPV + * 更新了 GNOME 的依赖性 + +![][8] + +Ubuntu Budgie 现在随附了 Budgie 桌面环境的最新版本(10.5.1)。改进包括: + + * 在 Budgie 桌面设置中新增 Raven 部分 + * Raven 通知可以分组,通知可以关闭 + * 重新打造了图标任务列表 + * 能够设置虚拟桌面的数量 + +Ubuntu Budgie 自带了大量的 Budgie 小程序applet微应用min-app。它们可以通过 Ubuntu Budgie “欢迎”应用来安装。 + +![Ubuntu Budgie Welcome][9] + + * WeatherShow:显示未来五天的天气预报,每 3 小时更新一次 + * Wallstreet:一个可以循环展示你的图像文件夹中的壁纸工具 + * Visual-space:一个紧凑的工作区切换器 + * Dropby:这个小程序可让你在面板上快速管理 U 盘 + * Kangaroo:从面板上快速浏览文件夹 + * 垃圾桶小程序:管理你的垃圾桶 + * Fuzzyclock:以模糊的方式显示时间 + * 工作区秒表:允许你跟踪在每个工作区花费的时间 + +完整的变更和更新列表,请访问[变更日志][10]。 + +#### 系统要求 + +Ubuntu Budgie 20.04 更新了[系统要求][11]: + + * 4GB 或以上的内存 + * 64 位的 Intel 和 AMD 处理器 + * 在 CSM 模式下启动的 UEFI 电脑 + * 基于英特尔的现代苹果电脑 + +如你所见,Budgie 并不是一个真正的轻量级选择。 + +#### 安装的应用 + +![][12] + +Ubuntu Budgie 中默认包含了以下有用的应用程序: + + * AisleRiot Solitaire + * Geary + * Catfish 搜索工具 + * Cheese 网络摄像头工具 + * GNOME Drawing + * GNOME 2048 + * GNOME Mahjongg + * GNOME Mines + * GNOME Sudoku + * Gthumb + * LibreOffice + * Maps + * Rhythmbox + * Tilix + * Ubuntu Budgie 欢迎应用 + * Evince 文档查看器 + * Plank + * Celluloid + +![Ubuntu Budgie Ram Usage][13] + +### 安装 + +起初,我无法让 Ubuntu Budgie 进入即用live环境来安装它。结果发现 Ubuntu Budgie 试图通过 EFI 来启动,我从 [Ubuntu Budgie 论坛][14]得到了解决方案。 + +当出现紫色的闪屏时,我必须按下 `ESC` 键并选择 `legacy`。之后,它就如常启动了,安装也没有问题了。我只在 Ubuntu Budgie 上遇到过这个问题。我下载并尝试了 Ubuntu MATE 20.04 ISO,但没有遇到类似的问题。 + +### Ubuntu Budgie 20.04 的体验 + +![][15] + +除了这个安装上的小问题,我使用 Ubuntu Budgie 的体验非常愉快。自 [Ikey][16] 第一次创建 Budgie 桌面以来,Budgie 桌面已经进步了很多,并且已经成为一个非常成熟的选择。Ubuntu Budgie 的目标是“生产一个面向桌面的传统发行版”。它确实做到了极致。他们所做的所有改变都在不断地为他们的产品增添更多的光彩。 + +总的来说,Ubuntu Budgie 是一个非常漂亮的发行版。从默认的主题到壁纸选择,你可以看出他们付出了很多努力,视觉体验非常吸引人。 + +需要注意的是,Ubuntu Budgie 并不适合低配置的系统。我在戴尔 Latitude D630 上运行它。在没有打开任何应用程序的情况下,它使用了大约 700MB 的内存。 + +在 Ubuntu Budgie 中,让我喜欢的部分超乎我的预期,其中一个部分是 [Tilix 终端模拟器][17]。Tilix 允许你在右侧或下方添加终端窗口。它有很多很多功能,我简直爱死了它,我打算在我的其他 Linux 系统上也安装它。 + +### 关于 Ubuntu Budgie 20.04 的最后感想 + +Ubuntu Budgie 是众多官方版本中一个很受欢迎的新版本。Budgie 给人的感觉非常流畅和精致。它不会让你觉得碍手碍脚,而是帮你完成工作。 + +如果你厌倦了当前的桌面环境,想体验一下新的东西,不妨来看看。如果你对当前的环境感到满意,那么就试试 Ubuntu Budgie 的即用 DVD。你可能会喜欢上它。 + +![关于 Ubuntu Budgie][18] + +你是否已经尝试过 Ubuntu 20.04 Budgie?你对它的使用体验如何?如果没有用过,你现在使用的是哪个版本的 Ubuntu 20.04? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ubuntu-budgie-20-04-review/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/download-ubuntu-20-04/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-busgie-desktop.png?resize=800%2C500&ssl=1 +[3]: https://ubuntubudgie.org/ +[4]: https://itsfoss.com/which-ubuntu-install/ +[5]: https://en.wikipedia.org/wiki/Budgie_ +[6]: https://ubuntubudgie.org/about-us/ +[7]: https://itsfoss.com/ubuntu-budgie-18-review/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-budgie-desktop-settings.jpeg?ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-budgie-welcome.png?resize=800%2C472&ssl=1 +[10]: https://ubuntubudgie.org/2020/04/21/ubuntu-budgie-20-04lts-release-notes-for-18-04-upgraders/ +[11]: https://ubuntubudgie.org/downloads/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-budgie-applications.jpeg?ssl=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-budgie-ram-usage.png?resize=800%2C600&ssl=1 +[14]: https://discourse.ubuntubudgie.org/t/cant-get-ub-to-boot/3397 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-budgie-20-04.jpg?ssl=1 +[16]: https://itsfoss.com/ikey-doherty-serpent-interview/ +[17]: https://gnunn1.github.io/tilix-web/ +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/ubuntu-budgie-about.png?resize=800%2C648&ssl=1 diff --git a/published/202006/20200525 Ubuntu MATE 20.04 LTS Review- Better Than Ever.md b/published/202006/20200525 Ubuntu MATE 20.04 LTS Review- Better Than Ever.md new file mode 100644 index 0000000000..86e6a6c6d2 --- /dev/null +++ b/published/202006/20200525 Ubuntu MATE 20.04 LTS Review- Better Than Ever.md @@ -0,0 +1,171 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12341-1.html) +[#]: subject: (Ubuntu MATE 20.04 LTS Review: Better Than Ever) +[#]: via: (https://itsfoss.com/ubuntu-mate-20-04-review/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Ubuntu MATE 20.04 LTS:士别三日,当刮目相待 +====== + +Ubuntu MATE 20.04 LTS 无疑是最流行的 [Ubuntu 官方特色版本][1]之一。 + +不仅仅是我,这份[Ubuntu 20.04 调查报告][2]也持同样观点。不过不管流行与否,它都是一个令人印象深刻的 Linux 发行版,尤其是用在较旧的硬件上时。事实上,它也是可用的[最轻量的 Linux 发行版][3]之一。 + +所以,我想在一个虚拟机中尝试一下,为你提供一个概览,这样你可以了解其中有何值得期盼的变化,以及是否值得尝试。 + +### 在 Ubuntu MATE 20.04 LTS 中有什么新功能? + +- [video](https://www.youtube.com/embed/WBZyXDHw4HA) + +Ubuntu MATE 20.04 LTS 的主要亮点应该是增加了 MATE Desktop 1.24。 + +你可以期待 MATE Desktop 1.24 中的所有新特色都被打包到 Ubuntu MATE 20.04 中。除此之外,还有很多重要的变化、改进和增补。 + +这是 Ubuntu MATE 20.04 中变化的概述: + + * 新增 MATE Desktop 1.24 + * 大量视觉改进 + * 数十处错误修复 + * 基于 [Linux 内核 5.4][5] 系列 + * 添加了实验性的 [ZFS][6] 支持 + * 添加了来自 [Feral Interactive][7] 的 GameMode + * 一些软件包更新 + +现在,为了更好地了解 Ubuntu MATE 20.04,我将给你提供更多的细节。 + +### 用户体验改善 + +![][8] + +考虑到越来越多的用户倾向于在桌面上使用 Linux,而用户体验在桌面中起着至关重要的作用。 + +如果有一些易于使用和令人愉悦的东西,那么第一印象就会有很大不同。 + +对于 Ubuntu MATE 20.04 LTS,我没有感到失望。就我个人而言,我是最新的 [GNOME 3.36][9] 的粉丝。我喜欢在我 [Pop!_OS 20.04][10] 上使用它,但是随着 [MATE 1.24][11] 的出现,使得 Ubuntu MATE 也同样具有很好的体验。 + +你会看到窗口管理器有一些重大更改,包括:增加了用于重新调整大小的隐形边框,HiDPI 图标渲染,重新设计了 `ALT+TAB` 工作区切换器的弹出窗口和一些其它的更改,这些是最新的 MATE 1.24 桌面环境的一部分。 + +![][12] + +此外, MATE Tweak 也得到了一些贴心的改进,即使你更改桌面的布局,也可以保留用户偏好。新的 MATE 欢迎屏幕也会告知用户更改桌面布局的能力,因此,用户无需不断摸索就能知道这个变化。 + +此外,我最喜欢的新增功能之一是可以预览最小化的应用程序。 + +例如,你已经最小化了一个应用程序,但是你想在拉起它之前看到它的预览 —— 现在你只需将鼠标悬停在任务栏上就可以做到这一点,如下图所示: + +![][13] + +不过,我必须指出,并不是每个应用程序都可以如预期般的工作。因此,这个功能是有缺陷的,还需要改进。 + +### 应用程序新增或升级 + +![][14] + +在 MATE 20.04 中,你会注意到有一个新的固件更新器,它是 [fwupd][15] 的 GTK 前端。你可以使用这个更新器来轻松地管理你的固件驱动。 + +这个版本也使用 Evolution 替换了 Thunderbird 电子邮件客户端。尽管 [Thunderbird][16] 是一个非常流行的电子邮件客户端,但是 [Evolution][17] 与 MATE 桌面集成得更好,并且证明它更有用。 + +![][18] + +考虑到我们已经搭载了 MATE 1.24,你也将发现一个新的时间和日期管理应用程序。不仅如此,如果你需要一个放大镜,Ubuntu MATE 20.04 还内置了 [Magnus][19]。 + +![][20] + +Ubuntu MATE 20.04 也包括了众多预安装的软件包/应用程序的升级包。 + +![][21] + +尽管这些是小的增补,但却能在很大程度上帮助发行版变得更有用。 + +### Linux Kernel 5.4 + +Ubuntu MATE 20.04 带有 2019 年最后一个主要的稳定版内核,即 [Linux 内核 5.4][5]。 + +使用该内核,你可以获得原生的 [exFAT 支持][22]、改进的硬件支持。更不用说,拥有 [WireGuard][23] VPN 的支持也是一件极好的事。 + +所以,你会注意到 Linux Kernel 5.4 的众多好处,包括内核锁定功能。如果你好奇,你可以阅读我们关于 [Linux Kernel 5.4][5] 的新闻报道来了解更多的细节。 + +### 增加了 Feral Interactive 的 GameMode + +以将游戏带到 Linux 平台而闻名的 Feral Interactive 带来了一款实用的命令行工具,即 [GameMode][7]。 + +它没有提供图形界面,但是在启动一个游戏前,你可以使用命令行请求临时性的系统优化。 + +虽然这可能不会给每个系统都带来很大的不同,而是给玩游戏提供了更多的资源,并且 GameMode 可以确保你获得必要的优化。 + +### 实验性的 ZFS 安装选项 + +你可以使用 ZFS 作为根文件系统了。值得注意的是,它是一个实验性的功能,如果你不确定自己在做什么,那么就不应该使用它。 + +要更好地了解 ZFS,我建议你阅读我们的一篇文章,[John Paul][24] 所写的《[ZFS 是什么][6]》的文章。 + +### 性能和其它的改进 + +Ubuntu MATE 是一款完美的轻量级发行版,同时也是一款适合现代台式机的发行版。 + +![][25] + +在这个评测中,我没有运行任何特殊的基准测试工具,以一个普通用户来说,我在虚拟机设置中没有发现任何性能问题。我在一台使用了一颗 i5-7400 处理器、配备 GTX 1050 显卡和 16 GB 内存的主机系统上进行了测试。并且,我将 7 GB 的内存 + 768 MB 的显存 + 2 个处理器核心分配给了虚拟机。 + +![][26] + +如果你要自己测试它,请随时告诉我你对它的感觉如何。 + +总的来说,除了所有主要的改进之外,还有一些细微的改变/修复/改进,使得 Ubuntu MATE 20.04 LTS 成为了一个很好的升级版本。 + +### 我应该升级吗? + +如果你正在运行 Ubuntu MATE 19.10,你应该立即升级它,因为它的支持将在 2020 年 6 月结束。 + +对于 Ubuntu MATE 18.04 用户(支持到 2021 年 4 月)来说,这取决于你的需求。如果你需要最新发布版本的功能,你应该选择立即升级它。 + +但是,如果你不一定需要新的功能,你可以查看[现存的错误列表][27] 并加入 [Ubuntu MATE 社区][28] 来了解更多最新发布版本的问题。 + +在你做完必要的研究后,你可以继续升级你的系统到 Ubuntu MATE 20.04 LTS,它将支持到 2023 年 4 月。 + +你试过最新的 Ubuntu MATE 20.04 吗?你认为它怎么样?在评论中让我知道。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ubuntu-mate-20-04-review/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/which-ubuntu-install/ +[2]: https://ubuntu.com/blog/ubuntu-20-04-survey-results +[3]: https://itsfoss.com/lightweight-linux-beginners/ +[4]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 +[5]: https://itsfoss.com/linux-kernel-5-4/ +[6]: https://itsfoss.com/what-is-zfs/ +[7]: https://github.com/FeralInteractive/gamemode +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-20-04.jpg?ssl=1 +[9]: https://itsfoss.com/gnome-3-36-release/ +[10]: https://linux.cn/article-12175-1.html +[11]: https://mate-desktop.org/blog/2020-02-10-mate-1-24-released/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-desktop-layout.png?ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-minimized-app.png?ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-20-04-firmware.png?ssl=1 +[15]: https://fwupd.org +[16]: https://www.thunderbird.net/en-US/ +[17]: https://wiki.gnome.org/Apps/Evolution +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-evolution.png?ssl=1 +[19]: https://kryogenix.org/code/magnus/ +[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-magnus.jpg?ssl=1 +[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-apps.png?ssl=1 +[22]: https://cloudblogs.microsoft.com/opensource/2019/08/28/exfat-linux-kernel/ +[23]: https://wiki.ubuntu.com/WireGuard +[24]: https://itsfoss.com/author/john/ +[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-system-reosource.jpg?ssl=1 +[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-focal-neofetch.png?ssl=1 +[27]: https://bugs.launchpad.net/ubuntu-mate +[28]: https://ubuntu-mate.community/ diff --git a/published/202006/20200527 How to Format a USB Disk as exFAT on Linux -Graphically and Command Line.md b/published/202006/20200527 How to Format a USB Disk as exFAT on Linux -Graphically and Command Line.md new file mode 100644 index 0000000000..9252d16b1c --- /dev/null +++ b/published/202006/20200527 How to Format a USB Disk as exFAT on Linux -Graphically and Command Line.md @@ -0,0 +1,121 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12294-1.html) +[#]: subject: (How to Format a USB Disk as exFAT on Linux [Graphically and Command Line]) +[#]: via: (https://itsfoss.com/format-exfat-linux/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 Linux 上将 USB 盘格式化为 exFAT +====== + +> 本教程教你如何在 Linux 系统上以 exFAT 格式格式化 USB 盘。同时包括 GUI 和命令行两种方法。 + +长期以来,[FAT][1] 是用于格式化磁盘文件系统的默认选择。它与几乎所有主要操作系统兼容。 + +FAT 文件系统的一个主要问题是你不能传输大于 4GB 的文件。这意味着即使你的 USB 盘有 32GB 的可用空间,如果你尝试传输 ISO 镜像或其他大于 4GB 的文件,传输也会失败。 + +这会[在 Linux 中创建 Windows 的可启动 USB 盘][2]的情况下造成问题。你不能使用 [NTFS][3],并且 FAT 文件系统有 4GB 的大小限制。 + +为了克服 FAT 文件系统的限制,微软推出了 [exFAT 文件系统][4]。在本教程中,我将向你展示如何使用 exFAT 文件系统中格式化 USB 盘。 + +### 先决条件 + +从 [Linux kernel 5.4][7] 开始,Linux 内核本身中启用了 exFAT 文件系统支持。[检查正在运行的 Linux 内核版本][8]。如果是内核 5.4 或更高版本,那么应该没问题。 + +不然,你必须[启用 exFAT 支持][9]。在基于 Ubuntu 的发行版中,你可以安装以下软件包: + +``` +sudo apt install exfat-fuse exfat-utils +``` + +### 方法 1:使用 GNOME 磁盘工具将磁盘格式化为 exFAT + +![][10] + +使用 “[GNOME 磁盘][11]” 格式化驱动器是一项简单的工作。它预装在许多 Linux 发行版中。 + +插入外部 USB 盘。在菜单中查找 “Disk”,然后打开 “GNOME 磁盘” 应用。第一步,选择要格式化的驱动器,然后按照我的步骤操作。 + +**警告:请注意你要选择格式化的磁盘。请勿意外格式化主磁盘。** + +![][12] + +诸如 Ext4、NTFS、FAT 之类的常用文件系统将首先出现。要使用 exFAT,请选择 “其它”,然后单击 “下一步”。 + +![][13] + +最后一步:在此页面上选择 exFAT 文件系统,然后单击 “创建”。完成了! + +![][14] + +看到在 Linux 中以图形方式创建 exFAT 磁盘有多么容易了吧?现在,让我向你展示终端方法。 + +### 方法 2:在 Linux 命令行中将磁盘格式化为 exFAT(适用于高级用户) + +[fdisk][15] 是一个交互式命令行程序,它可在硬盘上创建和操作分区表和分区。实际上,它被认为是 [Linux 最佳分区工具][16]之一。 + +插入外部硬盘,然后在终端中输入以下命令: + +``` +sudo fdisk -l +``` + +![][17] + +这将列出计算机中的所有硬盘和分区。识别出要在外部硬盘上格式化的分区。应该会提示磁盘大小。对我而言,USB 盘被标记为 `/dev/sdb1`。 + +识别出 USB 盘后,请使用以下命令将它格式化为 exfat。将 `/dev/sdXn` 替换为你的磁盘 ID。`LABEL` 是你要为磁盘命名的名称,例如 `Data`、`MyUSB` 等。 + +``` +sudo mkfs.exfat -n LABEL /dev/sdXn +``` + +![][18] + +可选地,运行 `fsck` 检查,以确保格式化正确。 + +``` +sudo fsck.exfat /dev/sdXn +``` + +就是这样。享受 exFAT 盘吧。 + +### 你是否成功创建了exFAT 盘? + +我希望你觉得本教程足够简单,并建立坚实的分区知识基础的第一步。 + +从长远来看,有时简单易用的技巧将让你拥有一个更好的 Linux。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/format-exfat-linux/ + +作者:[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://en.wikipedia.org/wiki/File_Allocation_Table +[2]: https://itsfoss.com/bootable-windows-usb-linux/ +[3]: https://en.wikipedia.org/wiki/NTFS +[4]: https://en.wikipedia.org/wiki/ExFAT +[5]: tmp.YPwoWNgq9W#graphical-method +[6]: tmp.YPwoWNgq9W#command-line +[7]: https://itsfoss.com/linux-kernel-5-4/ +[8]: https://itsfoss.com/find-which-kernel-version-is-running-in-ubuntu/ +[9]: https://itsfoss.com/mount-exfat/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/format-exfat-linux.jpg?ssl=1 +[11]: https://wiki.gnome.org/Apps/Disks +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/1.-gnome-disks-2.png?ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/2.-gnome-disks.jpg?ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/3.-gnome-disks.jpg?ssl=1 +[15]: https://www.tldp.org/HOWTO/Partition/fdisk_partitioning.html +[16]: https://itsfoss.com/partition-managers-linux/ +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/sudo-fdisk-l-1.jpg?ssl=1 +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/sdXn.jpg?ssl=1 diff --git a/published/202006/20200528 Simplify data visualization in Python with Plotly.md b/published/202006/20200528 Simplify data visualization in Python with Plotly.md new file mode 100644 index 0000000000..870947b3e2 --- /dev/null +++ b/published/202006/20200528 Simplify data visualization in Python with Plotly.md @@ -0,0 +1,353 @@ +[#]: collector: (lujun9972) +[#]: translator: (MjSeven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12356-1.html) +[#]: subject: (Simplify data visualization in Python with Plotly) +[#]: via: (https://opensource.com/article/20/5/plotly-python) +[#]: author: (Shaun Taylor-Morgan https://opensource.com/users/shaun-taylor-morgan) + +使用 Plotly 来简化 Python 中的数据可视化 +====== + +> Plotly 是一个数据绘图库,具有整洁的接口,它旨在允许你构建自己的 API。 + +![](https://img.linux.net.cn/data/attachment/album/202006/27/215314y0rkrz0e9zw7wd2o.jpg) + +Plotly 是一个绘图生态系统,可以让你在 [Python][2] 以及 JavaScript 和 R 中进行绘图。在本文中,我将重点介绍[使用 Python 库进行绘图][3]。 + +Plotly 有三种不同的 Python API,你可以选择不同的方法来使用它: + + * 类似于 Matplotlib 的面向对象的 API + * 数据驱动的 API,通过构造类似 JSON 的数据结构来定义绘图 + * 类似于 Seaborn 的高级绘图接口,称为 “Plotly Express” API + +我将通过使用每个 API 来绘制相同的图来探索它们:英国大选结果的分组柱状图。 + +在我们进一步探讨之前,请注意,你可能需要调整你的 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') +``` + +现在我们可以继续进行了。 + +### 使用图对象来绘制图 + +Plotly 面向对象的 API 被称为 `graph_objects`,它有点类似于 [Matplotlib 的面向对象 API][7]。 + +要创建一个柱状图,你可以构造一个包含四个柱状图的对象: + +``` +# 导入 Plotly 和数据 +import plotly.graph_objects as go +from votes import wide as df + +# 得到 x 列表 +years = df['year'] +x = list(range(len(years))) + +# 定义绘图 +bar_plots = [ +  go.Bar(x=x, y=df['conservative'], name='Conservative', marker=go.bar.Marker(color='#0343df')), +  go.Bar(x=x, y=df['labour'], name='Labour', marker=go.bar.Marker(color='#e50000')), +  go.Bar(x=x, y=df['liberal'], name='Liberal', marker=go.bar.Marker(color='#ffff14')), +  go.Bar(x=x, y=df['others'], name='Others', marker=go.bar.Marker(color='#929591')), +] + +# 指定样式 +layout = go.Layout( +  title=go.layout.Title(text="Election results", x=0.5), +  yaxis_title="Seats", +  xaxis_tickmode="array", +  xaxis_tickvals=list(range(27)), +  xaxis_ticktext=tuple(df['year'].values), +) +    +# 绘制柱状图 +fig = go.Figure(data=bar_plots, layout=layout) + +# 告诉 Plotly 去渲染 +fig.show() +``` + +与 Matplotlib 不同的是,你无需手动计算柱状图的 `x` 轴位置,Plotly 会帮你适配。 + +最终结果图: + +![A multi-bar plot made using Graph Objects][8] + +*A multi-bar plot made using Graph Objects (© 2019 [Anvil][9])* + +### 使用 Python 数据结构来绘图 + +你还可以使用 Python 基本数据结构来定义绘图,它与面对对象 API 具有相同的结构。这直接对应于 Plotly 的 JavaScript 实现的 JSON API。 + +``` +# 定义绘图数据 +fig = { +    'data': [ +        {'type': 'bar', 'x': x, 'y': df['conservative'], 'name': 'Conservative', 'marker': {'color': '#0343df'}}, +        {'type': 'bar', 'x': x, 'y': df['labour'], 'name': 'Labour', 'marker': {'color': '#e50000'}}, +        {'type': 'bar', 'x': x, 'y': df['liberal'], 'name': 'Liberal', 'marker': {'color': '#ffff14'}}, +        {'type': 'bar', 'x': x, 'y': df['others'], 'name': 'Others', 'marker': {'color': '#929591'}}, +    ], +    'layout': { +        'title': {'text': 'Election results', 'x': 0.5}, +        'yaxis': {'title': 'Seats'}, +        'xaxis': { +            'tickmode': 'array', +            'tickvals': list(range(27)), +            'ticktext': tuple(df['year'].values), +        } +    } +} + +# 告诉 Plotly 去渲染它 +pio.show(fig) +``` + +最终结果与上次完全相同: + +![A multi-bar plot made using JSON-like data structures][10] + +*A multi-bar plot made using JSON-like data structures (© 2019 [Anvil][9])* + +#### 使用 Plotly Express 进行绘图 + +[Plotly Express][11] 是对图对象进行封装的高级 API。 + +你可以使用一行代码来绘制柱状图: + +``` +# 导入 Plotly 和数据 +import plotly.express as px +from votes import long as df + +# 定义颜色字典获得自定义栏颜色 +cmap = { +    'Conservative': '#0343df', +    'Labour': '#e50000', +    'Liberal': '#ffff14', +    'Others': '#929591', +} + +# 生成图 +fig = px.bar(df, x="year", y="seats", color="party", barmode="group", color_discrete_map=cmap) +``` + +这里使用了[长表][12]Long Form 数据,也称为“整洁数据”。这些列代表年份、政党和席位,而不是按政党划分。这与在 [Seaborn][13] 中制作柱状图非常相似。 + +``` +>> print(long) +     year         party  seats +0    1922  Conservative    344 +1    1923  Conservative    258 +2    1924  Conservative    412 +3    1929  Conservative    260 +4    1931  Conservative    470 +..    ...           ...    ... +103  2005        Others     30 +104  2010        Others     29 +105  2015        Others     80 +106  2017        Others     59 +107  2019        Others     72 + +[108 rows x 3 columns] +``` + +你可以访问底层的图对象 API 进行详细调整。如添加标题和 `y` 轴标签: + +``` +# 使用图对象 API 来调整绘图 +import plotly.graph_objects as go +fig.layout = go.Layout( +    title=go.layout.Title(text="Election results", x=0.5), +    yaxis_title="Seats", +) +``` + +最后,让 Plotly 渲染: + +``` +fig.show() +``` + +这将在未使用的端口上运行一个临时 Web 服务器,并打开默认的 Web 浏览器来查看图像(Web 服务器将会马上被关闭)。 + +不幸的是,结果并不完美。`x` 轴被视为整数,因此两组之间的距离很远且很小,这使得我们很难看到趋势。 + +![使用 Plotly Express 制作的柱状图][14] + +*A multi-bar plot made using Plotly Express (© 2019 [Anvil][9])* + +你可能会尝试通过将 `x` 值转换为字符串来使 Plotly Express 将其视为字符串,这样它就会以均匀的间隔和词法顺序来绘制。不幸的是,它们的间隔还是很大,像在 `graph_objects`中那样设置 `xaxis_tickvals` 也不行。 + +与 [Seaborn][13] 中的类似示例不同,在这种情况下,抽象似乎没有提供足够的[应急方案][15]来提供你想要的东西,但是也许你可以编写*自己*的 API? + +### 构建自己的 Plotly API + +对 Plotly 的操作方式不满意?那就构建自己的 Plotly API! + +Plotly 的核心是一个 JavaScript 库,它使用 [D3][16] 和 [stack.gl][17] 进行绘图。JavaScript 库的接口使用指定的 JSON 结构来绘图。因此,你只需要输出 JavaScript 库喜欢使用的 JSON 结构就好了。 + +Anvil 这样做是为了创建一个完全在浏览器中工作的 Python Plotly API。 + +![Ployly 使用 JavaScript 库创建图形,由其它语言库通过 JSON 使用][18] + +*Plotly uses a JavaScript library to create plots, driven by libraries in other languages via JSON (© 2019 [Anvil][9])* + +在 Anvil 版本中,你可以同时使用图对象 API 和上面介绍的 Python 数据结构方法。运行完全相同的命令,将数据和布局分配给 Anvil 应用程序中的 [Plot 组件][19]。 + +这是用 Anvil 的客户端 Python API 绘制的多列柱状图: + +``` +# 导入 Anvil 库 +from ._anvil_designer import EntrypointTemplate +from anvil import * +import anvil.server + +# 导入客户端 Plotly +import plotly.graph_objs as go + +# 这是一个 Anvil 表单 +class Entrypoint(EntrypointTemplate): +  def __init__(self, **properties): +    # Set Form properties and Data Bindings. +    self.init_components(**properties) + +    # 从服务器获取数据 +    data = anvil.server.call('get_election_data') +    +    # 获取一个方便的 x 值列表 +    years = data['year'] +    x = list(range(len(years))) + +    # 定义绘图 +    bar_plots = [ +      go.Bar(x=x, y=data['conservative'], name='Conservative', marker=go.Marker(color='#0343df')), +      go.Bar(x=x, y=data['labour'], name='Labour', marker=go.Marker(color='#e50000')), +      go.Bar(x=x, y=data['liberal'], name='Liberal', marker=go.Marker(color='#ffff14')), +      go.Bar(x=x, y=data['others'], name='Others', marker=go.Marker(color='#929591')), +    ] +    # 规定布局 +    layout = { +      'title': 'Election results', +      'yaxis': {'title': 'Seats'}, +      'xaxis': { +        'tickmode': 'array', +        'tickvals': list(range(27)), +        'ticktext': data['year'], +      }, +    } + +    # 生成多列柱状图 +    self.plot_1.data = bar_plots +    self.plot_1.layout = layout +``` + +绘图逻辑与上面相同,但是它完全在 Web 浏览器中运行,绘图是由用户计算机上的 Plotly JavaScript 库完成的!与本系列的所有其它 [Python 绘图库][3]相比,这是一个很大的优势。因为其它 Python 库都需要在服务器上运行。 + +这是在 Anvil 应用中运行的交互式 Plotly 图: + +![The election plot on the web using Anvil's client-side-Python Plotly library][20] + +*The election plot on the web using Anvil's [client-side-Python][21] Plotly library (© 2019 [Anvil][9])* + +你可以[复制此示例][22]作为一个 Anvil 应用程序(注意:Anvil 需要注册才能使用)。 + +在前端运行 Plotly 还有另一个优势:它为自定义交互行为提供了更多选项。 + +### 在 Plotly 中自定义交互 + +Plotly 绘图不仅是动态的,你可以自定义它们的互动行为。例如,你可以在每个柱状图中使用 `hovertemplate` 自定义工具提示的格式: + +``` + go.Bar( + x=x, + y=df['others'], + name='others', + marker=go.bar.Marker(color='#929591'), + hovertemplate='Seats: %{y}', + ), +``` + +当你把这个应用到每个柱状图时,你会看到以下结果: + +![A multi-bar plot with custom tool-tips][23] + +*A multi-bar plot with custom tool-tips (© 2019 [Anvil][9])* + +这很有用,当你想要在某些事件发生时执行任何你想要的代码就更好了(例如,当用户将鼠标悬停在栏上,你想要显示一个相关选举的信息框)。在 Anvil 的 Plotly 库中,你可以将事件处理程序绑定到诸如悬停之类的事件,这使得复杂的交互成为可能。 + +![A multi-bar plot with a hover event handler][24] + +*A multi-bar plot with a hover event handler (© 2019 [Anvil][9])* + +你可以通过将方法绑定到绘图的悬停事件来实现: + +``` + def plot_1_hover(self, points, **event_args): + """This method is called when a data point is hovered.""" + i = points[0]['point_number'] + self.label_year.text = self.data['year'][i] + self.label_con.text = self.data['conservative'][i] + self.label_lab.text = self.data['labour'][i] + self.label_lib.text = self.data['liberal'][i] + self.label_oth.text = self.data['others'][i] + url = f"https://en.wikipedia.org/wiki/{self.data['year'][i]}_United_Kingdom_general_election" + self.link_more_info.text = url + self.link_more_info.url = url +``` + +这是一种相当极端的交互性,从开发人员的角度来看,也是一种极端的可定制性。这都要归功于 Plotly 的架构 —— 它有一个简洁的接口,明确的设计是为了让你建立自己的API。如果到处都能看到这种伟大的设计,那将会很有帮助! + +### 使用 Bokeh 进行自定义交互 + +现在你已经了解了 Plotly 如何使用 JavaScript 来创建动态图,并且可以使用 Anvil 的客户端编写 Python 代码在浏览器中实时编辑它们。 + +Bokeh 是另一个 Python 绘图库,它可以输出可嵌入 Web 应用程序的 HTML 文档,并获得与 Plotly 提供的功能类似的动态功能(如果你想知道如何发音,那就是 “BOE-kay”)。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/plotly-python + +作者:[Shaun Taylor-Morgan][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/shaun-taylor-morgan +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/colorful_sound_wave.png?itok=jlUJG0bM (Colorful sound wave graph) +[2]: https://opensource.com/resources/python +[3]: https://linux.cn/article-12327-1.html +[4]: https://opensource.com/article/20/4/install-python-linux +[5]: thttps://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/plotly.png (A multi-bar plot made using Graph Objects) +[9]: https://anvil.works/blog/plotting-in-plotly +[10]: https://opensource.com/sites/default/files/uploads/plotly-pio.png (A multi-bar plot made using JSON-like data structures) +[11]: https://plot.ly/python/plotly-express/ +[12]: https://anvil.works/blog/tidy-data +[13]: https://opensource.com/article/20/5/seaborn-visualization-python +[14]: https://opensource.com/sites/default/files/uploads/plotly-express.png (A multi-bar plot made using Plotly Express) +[15]: https://anvil.works/blog/escape-hatches-and-ejector-seats +[16]: https://d3js.org/ +[17]: http://stack.gl/ +[18]: https://opensource.com/sites/default/files/uploads/plotly-arch.png (Plotly uses a JavaScript library to create plots, driven by libraries in other languages via JSON) +[19]: https://anvil.works/docs/client/components/plots +[20]: https://opensource.com/sites/default/files/uploads/plotting-in-anvil.gif (The election plot on the web using Anvil's client-side-Python Plotly library) +[21]: https://anvil.works/docs/client/python +[22]: https://anvil.works/login?app-name=Plotting%20in%20Plotly&app-author=shaun%40anvil.works +[23]: https://opensource.com/sites/default/files/uploads/plotly-tooltips.png (A multi-bar plot with custom tool-tips) +[24]: https://opensource.com/sites/default/files/uploads/plotly-event-handling.gif (A multi-bar plot with a hover event handler) diff --git a/published/202006/20200529 20 productivity tools for the Linux terminal.md b/published/202006/20200529 20 productivity tools for the Linux terminal.md new file mode 100644 index 0000000000..a373c3bb21 --- /dev/null +++ b/published/202006/20200529 20 productivity tools for the Linux terminal.md @@ -0,0 +1,137 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12274-1.html) +[#]: subject: (20 productivity tools for the Linux terminal) +[#]: via: (https://opensource.com/article/20/6/productivity-tools-linux-terminal) +[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) + +20 个 Linux 终端下的生产力工具 +====== + +> 来试下这些开源工具。你的效率一定会提升。 + +![Computer screen with files or windows open][1] + +诚然,很多人使用计算机来娱乐。但是一些人会用来工作,他们的理论是计算机应当能帮我们更快、更好、更有条理地做事。实际应用中,如果没有根据每个人的工作风格来做一些小小的手动配置,计算机也不会提升我们的效率。 + +[Kevin Sonney][2] 喜欢设计系统,今年他在一个 20 篇文章的系列中介绍了 18 种不同的生产力工具,不仅涵盖了网络方面,也涉及了一些能提升他的工作效率的工具。Kevin 最喜欢的所有的工具都收集到了本文,下面概括介绍每种工具的用途。 + +### 文件同步 + +![][3] + +重要的文件应谨慎管理。 + + * [Syncthing][4] 能使不同设备上的文件彼此同步。*设备*可以是 Linux、Windows 或 Mac,也可以是服务器、Android 平板或手机,等等。文件可以是你期望在多台机器间同步的任意文件。Syncthing 是轻量级的点对点工具,因此你不需要支付服务费,你不需要第三方的服务器,而且它很快。 + * 同步是一件事,但有时你还需要帮忙处理你拥有的文件。假设你想要一个应用程序在作为一个图形化应用和作为控制台应用时表现不同行为,你可以通过修改符号链接指向的不同的配置文件来达成,如 `.foo-gui` 和 `.foo-term`。这完全可以手动修改,但也可以用脚本处理,或者你可以试试 [GNU Stow][5]。 + +### 邮件管理 + +![][6] + +我们都依赖于邮件和收件箱,但似乎很少有人对自己管理邮件的方式满意。如果你喜欢用终端工作,为什么不在终端里管理邮件呢?在终端里收发邮件是一件事,但是要能在终端里组织你的邮件就更棒了。如果你的职业是打字员或是天生写脚本的人,试试这类工具吧。 + + * 我每天用 [OfflineIMAP][7] 把工作邮件同步到笔记本,以便用 Mutt 看邮件。它是很特别的工具,只做一件事:保证本地的邮件副本与远程的收件箱完全同步。配置和用 [cron][8] 调度它都相当简单,然后你就可以忘了它的存在。它相当简单,你与 IMAP 打交道的每一刻时间都应该用它。 + * [Notmuch][9] 能为邮件消息建立索引、加标签以及搜索邮件。如果你的收件箱出了问题,它可以让你*不需要*花费很大精力去补救。 + * [Vim][10] 可以收发邮件和管理你的日历。 + * 当然,[Emacs][11] 可以收发邮件和管理你的日历。 + +### 日历和联系人 + +![][12] + +我用过的所有的 Linux 系统都预装了 `cal` 命令。这是一个在终端下用的便捷小日历,它也是个很好的速查工具。然而,它几乎不能被称为一个日历应用程序。[iCalendar][13] 规范(与 Apple 的旧桌面日历无关)中提供了丰富的共享日历功能,虽然 `.ics` 的约会和事件是纯文本的,但没有在终端中管理它们的工作流。至少,在 khal 和 vdirsyncer 出现之前不存在。 + + * [Khal][14] 是基于控制台的读写 `.ics` 文件的日历工具。 + * [Vdirsyncer][14] 是一个能把线上日历(和联系人)同步到本地的终端命令。Khal 在本地运行,vdirsyncer 在远程运行,这样远程的日历能与你管理的本地日历保持同步。 + * 管理联系人可能会很难,但是如果你用了 [Khard][15] 这个可以读写 vCard 格式文件的终端命令,就会变得简单。反过来,这些文件可以使用 vdirsyncer(你可能已经在使用 khal 日历)同步到远程服务器上。这使得日历和联系人管理变得简单,而且[搭建个人信息管理(PIM)服务器][16]也比以前容易得多。 + +### 待办清单 + +![][17] + + * 组织你每天的行程有很多种方式,但是最简单的一种是用 [todo.txt][18],一个简单、便携、易于理解的系统,即使设备上没有安装 todo.txt 也不会出现问题。todo.txt 能正常运行的原因是,它就是一个 Bash 脚本,能在几乎所有你能找到的的设备上运行。操作过程很简单:下载脚本,安装到家目录,用一个简单的命令开始调度任务。如果你的计算机上没有安装 `todo.sh` 命令,那么你的待办清单仍然可以作为纯文本文件来使用,你可以在需要时手动更新它。 + * [Jrnl][19] 是一个能追踪的你的日常议程和活动的数字笔记本。如果你要摘抄桌面上的报纸的片段或者把随意的想法写下来,那么这就是你要找的程序。 + +### 保持联络 + +![][20] + +沟通是关键,然而现在似乎比以往更多的是聊天平台的问题。这不仅仅是几个客户端,而是几个独立的网络。你怎么管理它们?这里有两个方案。 + + * 如果你有很多的联系人分布在太多的聊天网络中,那么你应该试试 [BitlBee][21],使用这个单一的聊天客户端就可以关联其他所有的聊天网络。 + * [Rainbow Stream][22] 是个推特客户端,能让你不被开放的网页浏览器分心,而又能紧跟时事。 + +### 消息通知 + +![][23] + +网页浏览器很好,但有时过犹不及。你希望能及时收到消息,但是你又不想全身心地陷入到互联网中。因为互联网是建立在开放的规范和大量的开源技术的基础上的,你不必在一个界面中做所有的事。对于不同的任务有不同的*客户端*,它们可以让你用自己喜欢的界面来获取你需要的信息。 + + * [Tuir][24] 是一个 Reddit 终端客户端。 + * [Newsboat][25] 是一个 RSS 阅读器。 + * [Wego][26] 是天气预报工具。 + * [Vim][27] 可以帮助你登录 Reddit 和 Twitter。 + * [Emacs][28] 能让你保持与 Reddit、Twitter 和聊天客户端的联系。 + +### 保持终端一直开启 + +![][29] + +如果你正在用终端工作,那么关闭它的意义是什么呢?摆脱 `exit` 和 `Ctrl+D` 的诱惑,让你的控制台一直开启着。 + + * [Tmux][30] 能分割你的终端,让一个终端窗口“分层"到另一个窗口之上,甚至从一台计算机离开到另一台计算机后,能保持相同的终端会话。 + * [DESQview][31] 是另一种方式:它本质上是一个终端窗口管理器。 + +### 未完待续 + +本文列出的工具只是 Linux 终端的神奇生产力工具中的一小部分。这个清单会结束,但你自己的清单可以继续。找到你喜欢的工具,学习它们,并将其发挥出最大的优势。当然,一个好的工具不一定要提高你的生产力:有时你最喜欢的命令也可以是能让你最快乐的命令。你的工作是找到自己喜欢的命令,用它们来改变世界。 + +玩得愉快! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/productivity-tools-linux-terminal + +作者:[Alan Smithee][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alansmithee +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/users/ksonney +[3]: https://opensource.com/sites/default/files/uploads/productivity_2-1.png +[4]: https://linux.cn/article-11793-1.html +[5]: https://linux.cn/article-11796-1.html +[6]: https://opensource.com/sites/default/files/uploads/productivity_3-1.png +[7]: https://linux.cn/article-11804-1.html +[8]: https://opensource.com/article/17/11/how-use-cron-linux +[9]: https://linux.cn/article-11807-1.html +[10]: https://linux.cn/article-11908-1.html +[11]: https://linux.cn/article-11932-1.html +[12]: https://opensource.com/sites/default/files/uploads/productivity_5-1.png +[13]: https://tools.ietf.org/html/rfc5545 +[14]: https://linux.cn/article-11812-1.html +[15]: https://linux.cn/article-11834-1.html +[16]: https://opensource.com/alternatives/google-calendar +[17]: https://opensource.com/sites/default/files/uploads/productivity_7-1.png +[18]: https://linux.cn/article-11835-1.html +[19]: https://linux.cn/article-11846-1.html +[20]: https://opensource.com/sites/default/files/uploads/productivity_9-1.png +[21]: https://linux.cn/article-11856-1.html +[22]: https://linux.cn/article-11858-1.html +[23]: https://opensource.com/sites/default/files/uploads/productivity_13-1.png +[24]: https://linux.cn/article-11869-1.html +[25]: https://linux.cn/article-11876-1.html +[26]: https://linux.cn/article-11879-1.html +[27]: https://linux.cn/article-11912-1.html +[28]: https://linux.cn/article-11956-1.html +[29]: https://opensource.com/sites/default/files/uploads/productivity_14-1.png +[30]: https://linux.cn/article-11900-1.html +[31]: https://linux.cn/article-11892-1.html diff --git a/published/202006/20200529 Add interactivity to your Python plots with Bokeh.md b/published/202006/20200529 Add interactivity to your Python plots with Bokeh.md new file mode 100644 index 0000000000..87a6640ddd --- /dev/null +++ b/published/202006/20200529 Add interactivity to your Python plots with Bokeh.md @@ -0,0 +1,221 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12329-1.html) +[#]: subject: (Add interactivity to your Python plots with Bokeh) +[#]: via: (https://opensource.com/article/20/5/bokeh-python) +[#]: author: (Shaun Taylor-Morgan https://opensource.com/users/shaun-taylor-morgan) + +使用 Bokeh 为你的 Python 绘图添加交互性 +====== + +> 在 Bokeh 中绘图比其他一些绘图库要复杂一些,但付出额外的努力是有回报的。 + +![](https://img.linux.net.cn/data/attachment/album/202006/18/164708zz7tjxz7m7ax5lt3.jpg) + +在这一系列文章中,我通过在每个 Python 绘图库中制作相同的多条形绘图,来研究不同 Python 绘图库的特性。这次我重点介绍的是 [Bokeh][2](读作 “BOE-kay”)。 + +Bokeh 中的绘图比[其它一些绘图库][3]要复杂一些,但付出的额外努力是有回报的。Bokeh 的设计既允许你在 Web 上创建自己的交互式绘图,又能让你详细控制交互性如何工作。我将通过给我在这个系列中一直使用的多条形图添加工具提示来展示这一点。它绘制了 1966 年到 2020 年之间英国选举结果的数据。 + +![][4] + +*绘图的放大视图(©2019 年 [Anvil][5])* + +### 制作多条形图 + +在我们继续之前,请注意你可能需要调整你的 Python 环境来让这段代码运行,包括以下: + +- 运行最新版本的 Python (在 [Linux][11]、[Mac][12] 和 [Windows][13] 上的说明) +- 确认你运行的 Python 版本能与这些库一起工作。 + +数据可在线获得,可以用 Pandas 导入。 + +``` +import pandas as pd +df = pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv') +``` + +现在我们可以继续进行了。 + +为了做出多条形图,你需要对你的数据进行一下调整。 + +原始数据是这样的: + +``` +>> print(long) + year party seats +0 1966 Conservative 253 +1 1970 Conservative 330 +2 Feb 1974 Conservative 297 +3 Oct 1974 Conservative 277 +4 1979 Conservative 339 +.. ... ... ... +103 2005 Others 30 +104 2010 Others 29 +105 2015 Others 80 +106 2017 Others 59 +107 2019 Others 72 + +[60 rows x 3 columns] +``` + +你可以把数据看成是每一个可能的 `(year, party)` 组合的一系列 `seats` 值。这正是 Bokeh 处理的方式。你需要做一个 `(year, party)` 元组的列表: + +``` +# 得到每种可能的 (year, party) 组合的元组 +x = [(str(r[1]['year']), r[1]['party']) for r in df.iterrows()] + +# This comes out as [('1922', 'Conservative'), ('1923', 'Conservative'), ... ('2019', 'Others')] +``` + +这些将是 `x` 值。`y` 值就是席位(`seats`)。 + +``` +y = df['seats'] +``` + +现在你的数据看起来应该像这样: + +``` +x                               y +('1966', 'Conservative')        253 +('1970', 'Conservative')        330 +('Feb 1974', 'Conservative')    297 +('Oct 1974', 'Conservative')    277 +('1979', 'Conservative')        339 + ...      ...                   ... +('2005', 'Others')              30 +('2010', 'Others')              29 +('2015', 'Others')              80 +('2017', 'Others')              59 +('2019', 'Others')              72 +``` + +Bokeh 需要你将数据封装在它提供的一些对象中,这样它就能给你提供交互功能。将你的 `x` 和 `y` 数据结构封装在一个 `ColumnDataSource` 对象中。 + +``` + from bokeh.models import ColumnDataSource + + source = ColumnDataSource(data={'x': x, 'y': y}) +``` + +然后构造一个 `Figure` 对象,并传入你用 `FactorRange` 对象封装的 `x` 数据。 + +``` +    from bokeh.plotting import figure +    from bokeh.models import FactorRange +    +    p = figure(x_range=FactorRange(*x), width=2000, title="Election results") +``` + +你需要让 Bokeh 创建一个颜色表,这是一个特殊的 `DataSpec` 字典,它根据你给它的颜色映射生成。在这种情况下,颜色表是一个简单的党派名称和一个十六进制值之间的映射。 + +``` +    from bokeh.transform import factor_cmap + +    cmap = { +        'Conservative': '#0343df', +        'Labour': '#e50000', +        'Liberal': '#ffff14', +        'Others': '#929591', +    } +    fill_color = factor_cmap('x', palette=list(cmap.values()), factors=list(cmap.keys()), start=1, end=2) +``` + +现在你可以创建条形图了: + +``` +    p.vbar(x='x', top='y', width=0.9, source=source, fill_color=fill_color, line_color=fill_color) +``` + +Bokeh 图表上数据的可视化形式被称为“字形glyphs”,因此你已经创建了一组条形字形。 + +调整图表的细节,让它看起来像你想要的样子。 + +``` +    p.y_range.start = 0 +    p.x_range.range_padding = 0.1 +    p.yaxis.axis_label = 'Seats' +    p.xaxis.major_label_orientation = 1 +    p.xgrid.grid_line_color = None +``` + +最后,告诉 Bokeh 你现在想看你的绘图: + +``` +   from bokeh.io import show + +   show(p) +``` + +这将绘图写入一个 HTML 文件,并在默认的 Web 浏览器中打开它。如下结果: + +![][6] + +*Bokeh 中的多条形绘图(©2019年[Anvil][5])* + +它已经有了一些互动功能,比如盒子缩放。 + +![][7] 。 + +*Bokeh 内置的盒子缩放(©2019[Anvil][5])* + +但 Bokeh 的厉害之处在于你可以添加自己的交互性。在下一节中,我们通过在条形图中添加工具提示来探索这个问题。 + +### 给条形图添加工具提示 + +要在条形图上添加工具提示,你只需要创建一个 `HoverTool` 对象并将其添加到你的绘图中。 + +``` +    h = HoverTool(tooltips=[ +        ('Seats', '@y'), +        ('(Year, Party)', '(@x)') +    ]) +    p.add_tools(h) +``` + +参数定义了哪些数据会显示在工具提示上。变量 `@y` 和 `@x` 是指你传入 `ColumnDataSource` 的变量。你还可以使用一些其他的值。例如,光标在图上的位置由 `$x` 和 `$y` 给出(与 `@x` 和 `@y` 没有关系)。 + +下面是结果: + +![][8] + +*选举图,现在带有工具提示(© 2019 [Anvil][5])* + +借助 Bokeh 的 HTML 输出,将绘图嵌入到 Web 应用中时,你可以获得完整的交互体验。你可以在[这里][9]把这个例子复制为 Anvil 应用(注:Anvil 需要注册才能使用)。 + +现在,你可以看到付出额外努力在 Bokeh 中将所有数据封装在 `ColumnDataSource` 等对象的原因了。作为回报,你可以相对轻松地添加交互性。 + +### 回归简单:Altair + +Bokeh 是四大最流行的绘图库之一,本系列将研究[它们各自的特别之处][3]。 + +我也在研究几个因其有趣的方法而脱颖而出的库。接下来,我将看看 [Altair][10],它的声明式 API 意味着它可以做出非常复杂的绘图,而不会让你头疼。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/bokeh-python + +作者:[Shaun Taylor-Morgan][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/shaun-taylor-morgan +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://bokeh.org/ +[3]: https://linux.cn/article-12327-1.html +[4]: https://opensource.com/sites/default/files/uploads/bokeh-closeup.png (A zoomed-in view on the plot) +[5]: https://anvil.works/blog/plotting-in-bokeh +[6]: https://opensource.com/sites/default/files/uploads/bokeh_0.png (A multi-bar plot in Bokeh) +[7]: https://opensource.com/sites/default/files/uploads/bokeh-box-zoom.gif (Bokeh's built-in box zoom) +[8]: https://opensource.com/sites/default/files/uploads/bokeh-tooltips.gif (The election graph, now with tooltips) +[9]: https://anvil.works/build#clone:CFRUWSM6PQ6JUUXH%3dSX4SACDSXBB4UOIVEVPWXH55%7cMYTOLCU2HM5WKJYM%3d6VJKGRSF74TCCVDG5CTVDOCS +[10]: https://altair-viz.github.io/ +[11]: https://opensource.com/article/20/4/install-python-linux +[12]: https://opensource.com/article/19/5/python-3-default-mac +[13]: https://opensource.com/article/19/8/how-install-python-windows \ No newline at end of file diff --git a/published/202006/20200529 How to find and remove broken symlinks on Linux.md b/published/202006/20200529 How to find and remove broken symlinks on Linux.md new file mode 100644 index 0000000000..0c67037b00 --- /dev/null +++ b/published/202006/20200529 How to find and remove broken symlinks on Linux.md @@ -0,0 +1,112 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12298-1.html) +[#]: subject: (How to find and remove broken symlinks on Linux) +[#]: via: (https://www.networkworld.com/article/3546252/how-to-find-and-remove-broken-symlinks-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +如何在 Linux 上查找和删除损坏的符号链接 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/09/095016y7ranx1tssxdsttd.jpg) + +> 符号链接是指向另一个文件的 Linux 文件。如果删除了被引用的文件,符号链接会保留,但不会显示有问题,除非你尝试使用它。以下是查找和删除指向文件已被删除的符号链接的简单方法。 + +符号链接symbolic link在 Linux 系统上扮演了非常有用的角色。它们可以帮助你记住重要文件在系统上的位置,使你更容易访问这些文件,并让你不必为了更方便访问大文件而复制它们,从而节省了大量的空间。 + +### 什么是符号链接? + +通常称它们为“符号链接”或“软链接”,符号链接是非常小的文件。实际上,符号链接真正包含的是它指向的文件的名称,通常包含路径(相对于当前位置或绝对路径)。如果有个名为 `ref1` 的文件指向名为 `/apps/refs/ref-2020` 的文件,那么 `ref1` 的长度将为 19 个字符,即使 `ref-202` 文件有 2TB。如果指向 `./ref-2020`,那么长度仅为 10 个字符。如果指向 `ref-2020`,那么只有 8 个字节。 + +如果你执行 `vi ref1` 之类的命令(其中 `ref1` 是符号链接的名称),你将编辑 `ref1` 指向的文件,而不是符号链接本身的内容。Linux 系统知道如何使用符号链接,并且可以做正确的事。同样,如果你使用诸如 `cat`、`more`、`head` 或 `tail` 之类的命令,那么将查看引用文件的内容。 + +另一方面,如果删除符号链接,你将删除该链接,而不是引用的文件。再说一次,Linux 知道怎么做。符号链接使得使用和共享文件更加容易,仅此而已。 + +#### 符号链接损坏时 + +当一个符号链接所指向的文件从系统中删除或重新命名时,符号链接将不再起作用。符号链接只不过是存储在某个特定目录中的引用而已,它不会随着指向它的文件发生变化而更新或删除。它一直指向被引用的文件,即使这个文件早已消失。 + +如果你尝试使用指向一个不存在的文件的符号链接,那么将出现如下错误: + +``` +$ tail whassup +tail: cannot open 'whassup' for reading: No such file or directory +``` + +如果你尝试访问指向自身的符号链接(是的,奇怪的事情发生了),你将看到类似以下的内容: + +``` +$ cat loopy +cat: loopy: Too many levels of symbolic links +$ ls -l loopy +lrwxrwxrwx 1 shs shs 5 May 28 18:07 loopy -> loopy +``` + +而且,如果(上面的)长列表的第一个字母没有引起你的注意,这表示该文件是符号链接。`rwxrwxrwx` 权限是标准权限,并不反映符号链接指向的文件的权限。 + +### 查找损坏的符号链接 + +`find` 命令有一个选项,能让你找到指向不再存在的文件的符号链接。此命令列出当前目录中的符号链接: + +``` +$ find . -type l +``` + +`l` (小写字母 `L`)告诉 `find` 命令查找符号链接。 + +另一方面,下面的命令在当前目录中查找指向*不存在*的文件的符号链接: + +``` +$ find . -xtype l +``` + +为了避免在该命令尝试查找你无权检查的文件或目录时发生错误,你可以将所有错误输出到 `/dev/null`,如下所示: + +``` +$ find . -xtype l 2>/dev/null +``` + +你也可以使用此命令找到损坏的符号链接。它比前面的更长,但做的是同样的事情: + +``` +$ find . -type l ! -exec test -e {} \; -print 2>/dev/null +``` + +### 如何处理损坏的符号链接 + +除非你知道符号链接引用的文件会被替换,否则最好的方法是直接删除损坏的链接。实际上,如果需要,你可以使用一条命令查找并删除损坏的符号链接,如: + +``` +$ find . -xtype l 2>/dev/null -exec rm {} \; +``` + +该命令的 `rm {}` 部分会变成“删除文件”的命令 + +如果你想将符号链接与不同的文件相关联,你必须先删除该符号链接,然后重新创建它,使其指向新文件。这是一个例子: + +``` +$ rm ref1 +$ ln -s /apps/data/newfile ref1 +``` + +### 总结 + +符号链接使引用的文件更易于查找和使用,但有时它会比那些宣传去年已经关闭的餐馆的路标还过分。`find` 命令可以帮助你摆脱损坏的符号链接,或者提醒你没有你可能仍然需要的文件。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3546252/how-to-find-and-remove-broken-symlinks-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://www.facebook.com/NetworkWorld/ +[2]: https://www.linkedin.com/company/network-world diff --git a/published/202006/20200529 What is the Difference Between Soft link vs Hard link in Linux.md b/published/202006/20200529 What is the Difference Between Soft link vs Hard link in Linux.md new file mode 100644 index 0000000000..da090386ec --- /dev/null +++ b/published/202006/20200529 What is the Difference Between Soft link vs Hard link in Linux.md @@ -0,0 +1,72 @@ +[#]: collector: (lujun9972) +[#]: translator: (HankChow) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12270-1.html) +[#]: subject: (What is the Difference Between Soft link vs Hard link in Linux?) +[#]: via: (https://www.2daygeek.com/difference-between-soft-link-vs-hard-link-linux/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + + +Linux 中软链接和硬链接的区别 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/01/082717bilg8nmx808oxzgn.jpg) + +链接Link是一种快捷访问机制,它通过一个文件指向原始文件或目录的方式实现快捷访问,同时还记录了原始文件或目录的一些信息。 + +链接允许多个不同文件对同一个文件进行引用。 + +### 什么是软链接 + +符号链接Symbolic Link(symlink),又称软链接Soft Link,是一种特殊的文件,它指向 Linux 系统上的另一个文件或目录。 + +这和 Windows 系统中的快捷方式有点类似,链接文件中记录的只是原始文件的路径,并不记录原始文件的内容。 + +符号链接通常用于对库文件进行链接,也常用于链接日志文件和网络文件系统Network File System(NFS)上共享的目录。 + +### 什么是硬链接 + +硬链接是原始文件的一个镜像副本。创建硬链接后,如果把原始文件删除,链接文件也不会受到影响,因为此时原始文件和链接文件互为镜像副本。 + +为什么要创建链接文件而不直接复制文件呢? + +当你需要将同一个文件保存在多个不同位置,而且还要保持持续更新的时候,硬链接的重要性就体现出来了。 + +如果你只是单纯把文件复制到另一个位置,那么另一个位置的文件只会保存着复制那一刻的文件内容,后续也不会跟随着原始文件持续更新。 + +而使用硬链接时,各个镜像副本的文件内容都会同时更新。 + +### 软链接和硬链接的区别 + +下表列出了软链接和硬链接之间的区别。 + +\# | 软链接 | 硬链接 +---|---|--- +1 | 软链接类似于 Windows 系统中的快捷方式 | 硬链接是原始文件的一个镜像副本 +2 | 软链接又称符号链接 | 硬链接没有别名 +3 | 链接中任何一个文件发生改变,都会同步到连接中的其它文件 | 和软链接一样 +4 | 软链接可以跨文件系统进行创建 | 硬链接不可以跨文件系统进行创建 +5 | 软链接可以指向文件或目录 | 硬链接只能指向文件 +6 | 链接文件和原始文件之间的 inode 和文件权限不完全一致 | 链接文件和原始文件的 inode 和文件权限完全一致 +7 | 链接文件只记录原始文件的路径,不记录原始文件的内容 | 链接文件记录了原始文件的内容 +8 | 如果原始文件被移除,软链接就会因为指向不存在的文件而失效。这被称为“挂起链接hanging link” | 即使原始文件被移除,链接文件也不受影响。 +9 | 通过 `ln -s <原始文件> <链接文件>` 命令创建软链接 | 通过 `ln <原始文件> <链接文件>` 命令创建硬链接 +10 | 软链接文件的文件权限中有一个特殊标记 `l` | 硬链接文件没有特殊标记 +11 | 通过 `find / -type l` 命令可以查找软链接文件 | 通过 `find / -samefile <原始文件>` 命令可以查找硬链接文件 +12 | 通过 `symlinks <目录>` 命令可以查找失效的软链接 | 硬链接不存在失效链接 + + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/difference-between-soft-link-vs-hard-link-linux/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[HankChow](https://github.com/HankChow) +校对:[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 diff --git a/published/202006/20200531 Looking for Some Good Note Taking Apps on Linux- Here are the Best Notes Apps we Found for You.md b/published/202006/20200531 Looking for Some Good Note Taking Apps on Linux- Here are the Best Notes Apps we Found for You.md new file mode 100644 index 0000000000..f2fafaa32c --- /dev/null +++ b/published/202006/20200531 Looking for Some Good Note Taking Apps on Linux- Here are the Best Notes Apps we Found for You.md @@ -0,0 +1,290 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12307-1.html) +[#]: subject: (Looking for Some Good Note Taking Apps on Linux? Here are the Best Notes Apps we Found for You) +[#]: via: (https://itsfoss.com/note-taking-apps-linux/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +9 款 Linux 上的最佳笔记应用 +====== + +无论你做什么,做笔记总是一个好习惯。是的,有很多笔记应用可以帮助你实现这个目标。但是,Linux 上的开源笔记应用怎么样呢? + +别担心,你不需要无休止地在互联网上搜索,就能找到 Linux 下最好的笔记应用。在这里,我挑选了一些最令人印象深刻的开源笔记应用。 + +![][1] + +请注意,此列表没有特定的排名顺序。 + +### 1、Joplin + +![][2] + +主要功能: + +* 支持 Markdown +* 支持附件 +* 支持加密 +* 跨平台,包括 Android 应用 + +[Joplin][9] 是一款令人印象深刻的自由开源笔记应用,支持加密。凭借其提供的出色的功能,它也是目前[最好的 Evernote 替代品][3]之一。事实上,我就是因为它提供的功能才从 Evernote 转移到 Joplin。 + +你可以选择添加待办事项列表、普通笔记,或者把它作为一个 Markdown 编辑器来写东西。它适用于 Linux、Windows、macOS、Android 和 iOS。你还可以选择使用 [Dropbox][4]、OneDrive、[NextCloud][5] 或 WebDAV 来同步你的笔记。 + +如果你好奇,可以阅读我们关于 [Joplin][6] 的详细文章来了解更多。 + +#### 如何安装? + +你可以用一个 AppImage 文件来安装 Joplin。我已经在 Ubuntu 20.04 LTS 上试过了,和预期的一样没有问题。要找到该文件,你可以前往其官方网站或探索他们的 [GitHub 页面][7]。 + +如果你不知道如何安装它,请按照我们的[使用 AppImage 文件][8]指南来开始。 + +另外,如果你想使用终端,你可以键入下面的命令,通过脚本来安装它(在这个过程中还会添加一个桌面图标)。 + +``` +wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh | bash +``` + +### 2、Simplenote + +![][10] + +主要功能: + +* 支持 Markdown +* 简约的用户界面 +* 通过你的 Simplenote 帐户轻松地进行同步 +* 有 32 位软件包 +* 跨平台,包括移动应用程序 + +顾名思义,它是一款简约的自由开源笔记应用。 + +由 [Automattic][11](WordPress 背后的公司)开发,[Simplenote][13] 可以让你在多个设备上无缝同步你的笔记。它支持 Android、iOS、Windows、Linux,以及 macOS。 + +与其它一些笔记应用不同的是,你会注意到它的界面非常简单,可能不会提供很多功能。但是,你可以为你的笔记添加标签。 + +#### 如何安装? + +它提供了 .deb / .rpm 软件包以及一个 AppImage 文件。你可以在它的 [GitHub 发布部分][12]中找到这些文件。 + +### 3、Laverna + +**注:** 它已经不再积极开发了,但它仍然可以正常工作。 + +![][14] + +主要功能: + +* 支持 Markdown +* 支持加密 +* 支持同步 + +[Laverna][15] 是一个有趣的开源笔记应用程序,还提供加密(这是可选的)。 + +你可以把它作为一个基于 Web 的笔记应用,也可以作为电脑上的应用使用。它适用于 Linux、Mac 和 Windows。 + +虽然它除了支持加密外,还具有记事本应用的所有基本功能,但并没有一个可以使用的移动应用。所以,这是一个只有当你是一个桌面用户,并且在 Web 浏览器上完成大部分事情时才能使用的东西。 + +#### 如何安装? + +它提供了一个压缩文件,可在其[官方网站][15]上获得。下载之后,你需要解压并启动可执行文件来开始。 + +### 4、Standard Notes + +![][16] + +主要功能: + +* 支持 Markdown +* 支持加密 +* 支持同步 +* 笔记的版本历史(付费计划) +* 跨平台,包括移动应用程序 +* 提供了 32 位包。 +* 提供付费选择 + +又一款开源笔记应用,为你的笔记和附件提供加密。 + +与 Laverna 不同,[Standard Notes][18] 正在积极开发中。虽然它提供了大量的功能,但其中一些功能以“扩展功能”或扩展插件仅提供给付费用户,这是偏昂贵的(每月订阅)。你也可以参考我们另外一篇关于 [Standard Notes][17] 的文章来了解更多信息。 + +总的来说,你会得到 Markdown 支持、加密附件和笔记的能力、版本历史、备份支持(OneDrive、Google Drive 等)以及更多这样有用的功能。 + +#### 如何安装? + +它提供了一个 AppImage 文件,可以在你的 Linux 发行版上安装它。你只需要前往它的[官方网站][18]下载即可。如果你不知道如何使用这个文件,可以参考我们的 [AppImage 指南][8]。 + +对于其他可用的软件包或源代码,你可以参考他们的 [GitHub 页面][19]。 + +### 5、Boost Note + +![][20] + +主要功能: + +* 支持 Markdown +* 适用于开发者 +* 跨平台 + +[Boost Note][21] 是一款对使用 Linux 的程序员有用的笔记应用。你可以用它写你的代码,也可以用来写笔记、文档等等。 + +它提供了一个简洁直观的用户界面,并提供了 Linux 上笔记应用的所有基本功能。 + +#### 如何安装? + +你可以选择其[官网][22]上为 Ubuntu 提供的 .deb 文件。如果你想在其他 Linux 发行版上尝试,你还可以找到一个 AppImage 文件来开始使用。 + +如果你好奇,也可以查看他们的 [GitHub 页面][23]来探索更多关于它的内容或复刻它。 + +### 6、Tomboy Notes(新一代) + +![][24] + +主要功能: + +* 轻量级笔记应用 +* 支持同步 +* 跨平台 + +一款轻量级且极其简单的记事应用怎么样? + +好吧,你可能知道旧版的 [Tomboy Notes][25] 已经不再开发了。幸运的是,有一个新一代的 [Tomboy Notes NG][27] 版本。你可以配置存储笔记的路径,并快速开始记笔记。 + +这款应用仅仅只有约 2MB 的下载量。所以,如果你正在寻找一个轻量级的解决方案 —— 那就是它。它可能无法用于智能手机,但你肯定可以在 Windows、Linux 和 MacOS 上使用它。 + +#### 如何安装? + +你可以在他们的 [GitHub 发布部分][26]中找到 .deb / .rpm 和其他包。对于其他的 Linux 发行版,你可以关注他们 GitHub 页面的文档来了解更多。 + +### 7、RedNoteBook + +![][28] + +主要功能 + +* 传统的日记式记事应用 +* 有模板 +* 离线使用 + +对于想要在 Linux 上使用离线笔记应用的用户来说,[RedNotebook][30] 应该是一个不错的选择。 + +是的,它不支持同步,如果你是一个不想要同步功能的人,RedNoteBook 应该是一款传统风格的记事应用,侧边栏为日历。 + +它主要是为喜欢离线日记的用户量身定做的。它还为你提供了几个模板,方便你创建某些笔记。 + +#### 如何安装? + +如果你使用的是 Ubuntu(或者其他基于 Ubuntu 的发行版),你可以通过 PPA 来安装它。下面是你在终端中输入的安装方法: + +``` +sudo add-apt-repository ppa:rednotebook/stable +sudo apt-get update +sudo apt-get install rednotebook +``` + +对于其他的 Linux 发行版,你可以得到 [Flatpak 软件包][29]。 + +### 8、TagSpaces + +![][31] + +主要特点: + +* 丰富的用户界面 +* 支持管理文件 +* 支持同步 +* 提供付费选择 + +[TagSpaces][34] 是一款适用于 Linux 的精美笔记应用。不仅仅局限于创建笔记,你还可以管理照片和其他文档。 + +与其他一些可用的笔记应用不同,它不提供加密功能。所以,你可以尝试像 [Syncthing][32] 这样支持 Dropbox 和 Nextcloud 的工具来安全地同步你的数据。 + +如果你想要特定的功能和支持,你也可以选择它的付费计划。 + +#### 如何安装? + +你可以在他们的 [GitHub 发布区][33]中找到 .deb 文件和一个 AppImage 文件来安装。无论哪种情况,你都可以把它也构建起来。 + +### 9、Trilium Notes + +![][35] + +主要功能: + +* 分层记事应用 +* 支持加密 +* 支持同步 + +[Trilium Notes][39] 并不只是又一款笔记应用,它是一款专注于建立个人知识库的分层笔记应用。 + +是的,你也可以将它用于普通用途 —— 但它是为特定用户量身定制的,他们希望能够以分层方式管理笔记。 + +我个人还没有使用过 —— 除了测试。欢迎试用,多多探讨。 + +#### 如何安装? + +只需前往其 [GitHub 发布区][36],并抓取 [.deb 文件在 Ubuntu 上安装][37]。如果你正在寻找其他 Linux 发行版上可用的软件包,你也可以从源代码构建它,或者下载并[解压缩文件][38]。 + +### 总结 + +我对 Linux 上的笔记应用的推荐到此结束。我已经用过很多个,目前决定用 Simplenote 来做快速笔记,用 Joplin 来收集章节中的笔记。 + +你是否知道一些应该包括在这个列表中的其它 Linux 笔记应用程序?为什么不在评论区告诉我们呢? + +你更喜欢哪个笔记应用程序?我很想知道你通常在 Linux 上寻找的最好的笔记应用程序是什么。 + +欢迎在下面的评论部分分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/note-taking-apps-linux/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/Note-Taking-Apps-linux.jpg?ssl=1 +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/01/joplin_ubuntu.jpg?ssl=1 +[3]: https://itsfoss.com/5-evernote-alternatives-linux/ +[4]: https://www.dropbox.com/ +[5]: https://nextcloud.com/ +[6]: https://linux.cn/article-11896-1.html +[7]: https://github.com/laurent22/joplin +[8]: https://itsfoss.com/use-appimage-linux/ +[9]: https://joplinapp.org/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/simplenote-new.jpg?ssl=1 +[11]: https://automattic.com/ +[12]: https://github.com/Automattic/simplenote-electron/releases/tag/v1.16.0 +[13]: https://simplenote.com +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/laverna.png?resize=800%2C623&ssl=1 +[15]: https://laverna.cc +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/11/standard-notes-shot.jpg?resize=800%2C578&ssl=1 +[17]: https://itsfoss.com/standard-notes/ +[18]: https://standardnotes.org +[19]: https://github.com/standardnotes +[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/boostnote.png?resize=800%2C579&ssl=1 +[21]: https://itsfoss.com/boostnote-linux-review/ +[22]: https://boostnote.io/ +[23]: https://github.com/BoostIO/Boostnote +[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/tomboy-notes-ng.jpg?ssl=1 +[25]: https://github.com/tomboy-notes/tomboy +[26]: https://github.com/tomboy-notes/tomboy-ng/releases +[27]: https://github.com/tomboy-notes/tomboy-ng +[28]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/rednotebook.png?ssl=1 +[29]: https://flathub.org/apps/details/app.rednotebook.RedNotebook +[30]: https://rednotebook.sourceforge.io +[31]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/tagspaces.png?resize=800%2C523&ssl=1 +[32]: https://itsfoss.com/syncthing/ +[33]: https://github.com/tagspaces/tagspaces/releases/ +[34]: https://www.tagspaces.org/ +[35]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/trilium-notes.png?ssl=1 +[36]: https://github.com/zadam/trilium/releases +[37]: https://itsfoss.com/install-deb-files-ubuntu/ +[38]: https://itsfoss.com/unzip-linux/ +[39]: https://github.com/zadam/trilium/ diff --git a/published/202006/20200601 How to write a VS Code extension.md b/published/202006/20200601 How to write a VS Code extension.md new file mode 100644 index 0000000000..366052a86a --- /dev/null +++ b/published/202006/20200601 How to write a VS Code extension.md @@ -0,0 +1,298 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12310-1.html) +[#]: subject: (How to write a VS Code extension) +[#]: via: (https://opensource.com/article/20/6/vs-code-extension) +[#]: author: (Ashique Hussain Ansari https://opensource.com/users/uidoyen) + +如何编写 VS Code 扩展 +====== + +> 通过为流行的代码编辑器编写自己的扩展来添加缺失的功能。 + +![](https://img.linux.net.cn/data/attachment/album/202006/13/105415w5u1d0z5bdoneb82.jpg) + +Visual Studio Code(VS Code)是微软为 Linux、Windows 和 macOS 创建的跨平台代码编辑器。遗憾的是,微软版本的 [VS Code][2] 是在 [Microsoft Software License][3] 下发布的,这不是一个开源的许可证。然而,它的源代码是开源的,在 MIT 许可证下由 [VSCodium][4] 项目发布。 + +VSCodium 和 VS Code一样,支持扩展、内嵌式 Git 控制、GitHub 集成、语法高亮、调试、智能代码补完、代码片段等。换句话说,对于大多数用户来说,使用 VS Code 和 VSCodium 没有什么区别,而且后者是完全开源的! + +### 什么是 VS Code 扩展? + +扩展extension可以让你为 VS Code 或 VSCodium 添加功能。你可以在 GUI 中或从终端安装扩展。 + +你也可以构建自己的扩展。有几个你可能想学习如何构建扩展的原因: + +1. **想要添加一些功能:** 如果缺失你想要的功能,你可以创建一个扩展来添加它。 +2. **为了乐趣和学习:** 扩展 API 允许你探索 VSCodium 是如何工作的,这是一件有趣的事情。 +3. **为了提高您的技能:** 创建扩展可以提高你的编程技能。 +4. **为了成名:** 创建一个对他人有用的扩展可以提高你的公众形象。 + +### 安装工具 + +在你开始之前,你必须已经安装了 [Node.js][5]、[npm][6] 和 VS Code 或 [VSCodium][4]。 + +要生成一个扩展,你还需要以下工具:[Yeoman][7],是一个开源的客户端脚手架工具,可以帮助你搭建新项目;以及 [vscode-generator-code][8],是 VS Code 团队创建的 Yeoman 生成器。 + +### 构建一个扩展 + +在本教程中,你将构建一个扩展,它可以为应用程序初始化一个 Docker 镜像。 + +#### 生成一个扩展骨架 + +要在全局范围内安装并运行 Yeoman 生成器,请在命令提示符或终端中输入以下内容: + +``` +npm install -g yo generator-code +``` + +导航到要生成扩展的文件夹,键入以下命令,然后按回车: + +``` +yo code +``` + +根据提示,你必须回答一些关于你的扩展的问题: + +* **你想创建什么类型的扩展?** 使用上下箭头选择其中一个选项。在本文中,我将只介绍第一个选项,`New Extension (TypeScript)`。 +* **你的扩展名称是什么?** 输入你的扩展名称。我的叫 `initdockerapp`。(我相信你会有一个更好的名字。) +* **你的扩展的标识符是什么?** 请保持原样。 +* **你的扩展的描述是什么?** 写一些关于你的扩展的内容(你可以现在填写或稍后编辑它)。 +* **初始化 Git 仓库?** 这将初始化一个 Git 仓库,你可以稍后添加 `set-remote`。 +* **使用哪个包管理器?** 你可以选择 `yarn` 或 `npm`;我使用 `npm`。 + +按回车键后,就会开始安装所需的依赖项。最后显示: + +> "Your extension **initdockerapp** has been created!" + +干的漂亮! + +### 检查项目的结构 + +检查你生成的东西和项目结构。导航到新的文件夹,并在终端中键入 `cd initdockerapp`。 + +一旦你进入该目录,键入 `.code`。它将在你的编辑器中打开,看起来像这样。 + +![Project file structure in VSCodium][9] + +(Hussain Ansari, [CC BY-SA 4.0][10]) + +最需要注意的两个文件是 `src` 文件夹内的 `package.json` 和 `extension.ts`。 + +#### package.json + +首先来看看 `package.json`,它应该是这样的。 + +``` +{ + "name": "initdockerapp", + "displayName": "initdockerapp", + "description": "", + "version": "0.0.1", + "engines": { + "vscode": "^1.44.0" + }, + "categories": [ + "Other" + ], + "activationEvents": [ + "onCommand:initdockerapp.initialize" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "initdockerapp.initialize", + "title": "Initialize A Docker Application" + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -p ./", + "lint": "eslint src --ext ts", + "watch": "tsc -watch -p ./", + "pretest": "npm run compile && npm run lint", + "test": "node ./out/test/runTest.js" + }, + "devDependencies": { + "@types/vscode": "^1.44.0", + "@types/glob": "^7.1.1", + "@types/mocha": "^7.0.2", + "@types/node": "^13.11.0", + "eslint": "^6.8.0", + "@typescript-eslint/parser": "^2.26.0", + "@typescript-eslint/eslint-plugin": "^2.26.0", + "glob": "^7.1.6", + "mocha": "^7.1.1", + "typescript": "^3.8.3", + "vscode-test": "^1.3.0" + } +} +{ + "name": "initdockerapp", + "displayName": "initdockerapp", + "description": "", + "version": "0.0.1", + "engines": { + "vscode": "^1.44.0" + }, + "categories": [ + "Other" + ], + "activationEvents": [ + "onCommand:initdockerapp.initialize" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "initdockerapp.initialize", + "title": "Initialize A Docker Application" + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -p ./", + "lint": "eslint src --ext ts", + "watch": "tsc -watch -p ./", + "pretest": "npm run compile && npm run lint", + "test": "node ./out/test/runTest.js" + }, + "devDependencies": { + "@types/vscode": "^1.44.0", + "@types/glob": "^7.1.1", + "@types/mocha": "^7.0.2", + "@types/node": "^13.11.0", + "eslint": "^6.8.0", + "@typescript-eslint/parser": "^2.26.0", + "@typescript-eslint/eslint-plugin": "^2.26.0", + "glob": "^7.1.6", + "mocha": "^7.1.1", + "typescript": "^3.8.3", + "vscode-test": "^1.3.0" + } +} +``` + +如果你是 Node.js 开发者,其中一些可能看起来很熟悉,因为 `name`、`description`、`version` 和 `scripts` 是 Node.js 项目的常见部分。 + +有几个部分是非常重要的: + +* `engines`:说明该扩展将支持哪个版本的 VS Code / VSCodium。 +* `categories`:设置扩展类型;你可以从 `Languages`、`Snippets`、`Linters`、`Themes`、`Debuggers`、`Formatters`、`Keymaps` 和 `Other` 中选择。 +* `contributes`:可用于与你的扩展一起运行的命令清单。 +* `main`:扩展的入口点。 +* `activationEvents`:指定激活事件发生的时间。具体来说,这决定了扩展何时会被加载到你的编辑器中。扩展是懒加载的,所以在激活事件触发之前,它们不会被激活。 + +#### src/extension.ts + +接下来看看 `src/extension.ts`,它应该是这样的: + +``` +// The module 'vscode' contains the VSCodium extensibility API +// Import the module and reference it with the alias vscode in your code below +import * as vscode from "vscode"; +const fs = require("fs"); +const path = require("path"); + +// this method is called when your extension is activated +// your extension is activated the very first time the command is executed +export function activate(context: vscode.ExtensionContext) { + + // Use the console to output diagnostic information (console.log) and errors (console.error) + // This line of code will only be executed once when your extension is activated + console.log('Congratulations, your extension "initdockerapp" is now active!'); + + // The command has been defined in the package.json file + // Now provide the implementation of the command with registerCommand + // The commandId parameter must match the command field in package.json + let disposable = vscode.commands.registerCommand('initdockerapp.initialize', () => { + // The code you place here will be executed every time your command is executed + + let fileContent =` + FROM node:alpine + WORKDIR /usr/src/app + + COPY package.json . + RUN npm install + + COPY . . + + EXPOSE 3000 + CMD ["npm", "start"] + `; + + fs.writeFile(path.join(vscode.workspace.rootPath, "Dockerfile"), fileContent, (err:any) => { + if (err) { + return vscode.window.showErrorMessage("Failed to initialize docker file!"); + } + vscode.window.showInformationMessage("Dockerfile has been created!"); + }); + }); + + context.subscriptions.push(disposable); +} + +// this method is called when your extension is deactivated +export function deactivate() {} +``` + +这是为你的扩展写代码的地方。已经有一些自动生成的代码了,我再来分析一下。 + +注意,`vscode.command.registerCommand` 里面的 `initdockerapp.initialize` 和 `package.json` 里面的命令是一样的。它需要两个参数。 + +1. 要注册的命令名称 +2. 执行命令的功能 + +另一个需要注意的函数是 `fs.writeFile`,这是你写在 `vscode.command.registerCommand` 函数里面的。这将在你的项目根目录下创建一个 Dockerfile,并在其中附加代码来创建一个 Docker 镜像。 + +### 调试扩展 + +现在你已经写好了扩展,是时候调试它了。点击“Run”菜单,选择“Start Debugging”(或者直接按 `F5`)打开调试窗口。 + +在调试窗口里面点击“Add Folder”或“Clone Repository”按钮,打开该项目。 + +接下来,用 `Ctrl+Shift+P`(在 macOS 上,用 `Command` 键代替 `Ctrl`)打开命令面板,运行 `Initialize A Docker Application`。 + +* 第一次运行此命令时,自 VSCodium 启动后,激活函数尚未执行。因此,调用激活函数,并由激活 函数注册该命令。 +* 如果命令已注册,那么它将被执行。 + +你会看到右下角有一条信息,上面写着:`Dockerfile has been created!`。这就创建了一个 Dockerfile,里面有一些预定义的代码,看起来是这样的: + +![Running the new extension command][11] + +(Hussain Ansari, [CC BY-SA 4.0][10]) + +### 总结 + +有许多有用的 API 可以帮助你创建你想要构建的扩展。VS Code 扩展 API 还有许多其他强大的方法可以使用。 + +你可以在 VS Code 扩展 API 文档中了解更多关于 VS Code API 的信息。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/vs-code-extension + +作者:[Ashique Hussain Ansari][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/uidoyen +[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://code.visualstudio.com/ +[3]: https://code.visualstudio.com/license +[4]: https://vscodium.com/ +[5]: https://nodejs.org/en/ +[6]: https://www.npmjs.com/ +[7]: https://yeoman.io/ +[8]: https://github.com/Microsoft/vscode-generator-code +[9]: https://opensource.com/sites/default/files/uploads/vscode-tree.png (Project file structure in VSCodium) +[10]: https://creativecommons.org/licenses/by-sa/4.0/ +[11]: https://opensource.com/sites/default/files/uploads/vscode-run-command.png (Running the new extension command) diff --git a/published/202006/20200601 Use FastAPI to build web services in Python.md b/published/202006/20200601 Use FastAPI to build web services in Python.md new file mode 100644 index 0000000000..00dcf9cd0d --- /dev/null +++ b/published/202006/20200601 Use FastAPI to build web services in Python.md @@ -0,0 +1,188 @@ +[#]: collector: (lujun9972) +[#]: translator: (HankChow) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12280-1.html) +[#]: subject: (Use FastAPI to build web services in Python) +[#]: via: (https://fedoramagazine.org/use-fastapi-to-build-web-services-in-python/) +[#]: author: (Clément Verna https://fedoramagazine.org/author/cverna/) + +使用 Python FastAPI 构建 Web 服务 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/04/105930wr333sx3erz3k2ur.jpg) + +[FastAPI][2] 是一个使用 Python 编写的 Web 框架,还应用了 Python asyncio 库中最新的优化。本文将会介绍如何搭建基于容器的开发环境,还会展示如何使用 FastAPI 实现一个小型 Web 服务。 + +### 起步 + +我们将使用 Fedora 作为基础镜像来搭建开发环境,并使用 Dockerfile 为镜像注入 FastAPI、[Uvicorn][3] 和 [aiofiles][4] 这几个包。 + +``` +FROM fedora:32 +RUN dnf install -y python-pip \ + && dnf clean all \ + && pip install fastapi uvicorn aiofiles +WORKDIR /srv +CMD ["uvicorn", "main:app", "--reload"] +``` + +在工作目录下保存 `Dockerfile` 之后,执行 `podman` 命令构建容器镜像。 + +``` +$ podman build -t fastapi . +$ podman images +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/fastapi latest 01e974cabe8b 18 seconds ago 326 MB +``` + +下面我们可以开始创建一个简单的 FastAPI 应用程序,并通过容器镜像运行。 + +``` +from fastapi import FastAPI + +app = FastAPI() + +@app.get("/") +async def root(): + return {"message": "Hello Fedora Magazine!"} +``` + +将上面的代码保存到 `main.py` 文件中,然后执行以下命令开始运行: + +``` +$ podman run --rm -v $PWD:/srv:z -p 8000:8000 --name fastapi -d fastapi +$ curl http://127.0.0.1:8000 +{"message":"Hello Fedora Magazine!" +``` + +这样,一个基于 FastAPI 的 Web 服务就跑起来了。由于指定了 `--reload` 参数,一旦 `main.py` 文件发生了改变,整个应用都会自动重新加载。你可以尝试将返回信息 `"Hello Fedora Magazine!"` 修改为其它内容,然后观察效果。 + +可以使用以下命令停止应用程序: + +``` +$ podman stop fastapi +``` + +### 构建一个小型 Web 服务 + +接下来我们会构建一个需要 I/O 操作的应用程序,通过这个应用程序,我们可以看到 FastAPI 自身的特点,以及它在性能上有什么优势(可以在[这里][5]参考 FastAPI 和其它 Python Web 框架的对比)。为简单起见,我们直接使用 `dnf history` 命令的输出来作为这个应用程序使用的数据。 + +首先将 `dnf history` 命令的输出保存到文件。 + +``` +$ dnf history | tail --lines=+3 > history.txt +``` + +在上面的命令中,我们使用 `tail` 去除了 `dnf history` 输出内容中无用的表头信息。剩余的每一条 `dnf` 事务都包括了以下信息: + + * `id`:事务编号(每次运行一条新事务时该编号都会递增) + * `command`:事务中运行的 `dnf` 命令 + * `date`:执行事务的日期和时间 + +然后修改 `main.py` 文件将相关的数据结构添加进去。 + +``` +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + +class DnfTransaction(BaseModel): + id: int + command: str + date: str +``` + +FastAPI 自带的 [pydantic][6] 库让你可以轻松定义一个数据类,其中的类型注释对数据的验证也提供了方便。 + +再增加一个函数,用于从 `history.txt` 文件中读取数据。 + +``` +import aiofiles + +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + +class DnfTransaction(BaseModel): + id: int + command: str + date: str + + +async def read_history(): + transactions = [] + async with aiofiles.open("history.txt") as f: + async for line in f: + transactions.append(DnfTransaction( + id=line.split("|")[0].strip(" "), + command=line.split("|")[1].strip(" "), + date=line.split("|")[2].strip(" "))) + return transactions +``` + +这个函数中使用了 `aiofiles` 库,这个库提供了一个异步 API 来处理 Python 中的文件,因此打开文件或读取文件的时候不会阻塞其它对服务器的请求。 + +最后,修改 `root` 函数,让它返回事务列表中的数据。 + +``` +@app.get("/") +async def read_root(): + return await read_history() +``` + +执行以下命令就可以看到应用程序的输出内容了。 + +``` +$ curl http://127.0.0.1:8000 | python -m json.tool +[ +{ +"id": 103, +"command": "update", +"date": "2020-05-25 08:35" +}, +{ +"id": 102, +"command": "update", +"date": "2020-05-23 15:46" +}, +{ +"id": 101, +"command": "update", +"date": "2020-05-22 11:32" +}, +.... +] +``` + +### 总结 + +FastAPI 提供了一种使用 asyncio 构建 Web 服务的简单方法,因此它在 Python Web 框架的生态中日趋流行。要了解 FastAPI 的更多信息,欢迎查阅 [FastAPI 文档][2]。 + +本文中的代码可以在 [GitHub][7] 上找到。 + + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/use-fastapi-to-build-web-services-in-python/ + +作者:[Clément Verna][a] +选题:[lujun9972][b] +译者:[HankChow](https://github.com/HankChow) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/cverna/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/05/fastapi-python-816x345.jpg +[2]: https://fastapi.tiangolo.com/ +[3]: https://www.uvicorn.org/ +[4]: https://github.com/Tinche/aiofiles +[5]: https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=composite&l=z8kflr-v&a=2&f=jz8cg-0-3s-0-3k-6bo-0-0-18y74-8s5c-0 +[6]: https://pydantic-docs.helpmanual.io/ +[7]: https://github.com/cverna/fastapi_app +[8]: https://unsplash.com/@jankubita?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[9]: https://unsplash.com/s/photos/fast-snake?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/published/202006/20200601 When to choose C or Python for a command-line interface.md b/published/202006/20200601 When to choose C or Python for a command-line interface.md new file mode 100644 index 0000000000..868894f61f --- /dev/null +++ b/published/202006/20200601 When to choose C or Python for a command-line interface.md @@ -0,0 +1,247 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12286-1.html) +[#]: subject: (When to choose C or Python for a command-line interface) +[#]: via: (https://opensource.com/article/20/6/c-python-cli) +[#]: author: (Erik O'Shaughnessy https://opensource.com/users/jnyjny) + +用 Python 解析命令行参数 +====== + +> 借鉴 C 语言的历史,学习如何用 Python 编写有用的 CLI 程序。 + +![](https://img.linux.net.cn/data/attachment/album/202006/05/231539dyinqzceci4ci8vv.jpg) + +本文的目标很简单:帮助新的 Python 开发者了解一些关于[命令行接口][2](CLI)的历史和术语,并探讨如何在 Python 中编写这些有用的程序。 + +### 最初…… + +首先,从 [Unix][3] 的角度谈谈命令行界面设计。 + +Unix 是一种计算机操作系统,也是 Linux 和 macOS(以及许多其他操作系统)的祖先。在图形用户界面之前,用户通过命令行提示符与计算机进行交互(想想如今的 [Bash][4] 环境)。在 Unix 下开发这些程序的主要语言是 [C][5],它的[功能][6]非常强大。 + +因此,我们至少应该了解 [C 程序][7]的基础知识。 + +假设你没有读过上面那个链接的内容,C 程序的基本架构是一个叫做 `main` 的函数,它的签名是这样的。 + +``` +   int main(int argc, char **argv) +   { +   ... +   } +``` + +对于 Python 程序员来说,这应该不会显得太奇怪。C 函数首先有一个返回类型、一个函数名,然后是括号内的类型化参数。最后,函数的主体位于大括号之间。函数名 `main` 是[运行时链接器][8](构造和运行程序的程序)如何决定从哪里开始执行你的程序。如果你写了一个 C 程序,而它没有包含一个名为 `main` 的函数,它将什么也做不了。伤心。 + +函数参数变量 `argc` 和 `argv` 共同描述了程序被调用时用户在命令行输入的字符串列表。在典型的 Unix 命名传统中,`argc` 的意思是“参数计数argument count”,`argv` 的意思是“参数向量argument vector”。向量听起来比列表更酷,而 `argl` 听起来就像一个要勒死的求救声。我们是 Unix 系统的程序员,我们不求救。我们让*其他人*哭着求救。 + +#### 再进一步 + +``` +$ ./myprog foo bar -x baz +``` + +如果 `myprog` 是用 C 语言实现的,则 `argc` 的值是 5,而 `argv` 是一个有五个条目的字符指针数组。(不要担心,如果这听起来过于技术,那换句话说,这是一个由五个字符串组成的列表。)向量中的第一个条目 `argv[0]` 是程序的名称。`argv` 的其余部分包含参数。 + +``` +   argv[0] == "./myprog" +   argv[1] == "foo" +   argv[2] == "bar" +   argv[3] == "-x" +   argv[4] == "baz" +    +   /* 注:不是有效的 C 代码 */ +``` + +在 C 语言中,你有很多方法来处理 `argv` 中的字符串。你可以手动地循环处理数组 `argv`,并根据程序的需要解释每个字符串。这相对来说比较简单,但会导致程序的接口大相径庭,因为不同的程序员对什么是“好”有不同的想法。 + +``` +include + +/* 一个打印 argv 内容的简单 C 程序。 */ + +int main(int argc, char **argv) { + int i; + + for(i=0; i +#include + +#define OPTSTR "b:f:" + +extern char *optarg; + +int main(int argc, char **argv) { + int opt; + char *bar = NULL; + char *foo = NULL; + + while((opt=getopt(argc, argv, OPTSTR)) != EOF) + switch(opt) { + case 'b': + bar = optarg; + break; + case 'f': + foo = optarg; + break; + case 'h': + default': + fprintf(stderr, "Huh? try again."); + exit(-1); + /* NOTREACHED */ + } + printf("%s\n", foo ? foo : "Empty foo"); + printf("%s\n", bar ? bar : "Empty bar"); +} +``` + +就个人而言,我*希望* Python 有*开关*,但这[永远][12]、永远不会[发生][13]。 + +#### GNU 时代 + +[GNU][14] 项目出现了,并为他们实现的传统 Unix 命令行工具引入了更长的格式参数,比如`--file-format foo`。当然,我们这些 Unix 程序员很讨厌这样,因为打字太麻烦了,但是就像我们这些旧时代的恐龙一样,我们输了,因为用户*喜欢*更长的选项。我从来没有写过任何使用 GNU 风格选项解析的代码,所以这里没有代码示例。 + +GNU 风格的参数也接受像 `-f foo` 这样的短名,也必须支持。所有这些选择都给程序员带来了更多的工作量,因为他们只想知道用户要求的是什么,然后继续进行下去。但用户得到了更一致的用户体验:长格式选项、短格式选项和自动生成的帮助,使用户不必再试图阅读臭名昭著的难以解析的[手册][15]页面(参见 [ps][16] 这个特别糟糕的例子)。 + +### 但我们正在讨论 Python? + +你现在已经接触了足够多(太多?)的命令行的历史,对如何用我们最喜欢的语言来编写 CLI 有了一些背景知识。Python 在命令行解析方面给出了类似的几个选择:自己解析,自给自足batteries-included的方式,以及大量的第三方方式。你选择哪一种取决于你的特定情况和需求。 + +#### 首先,自己解析 + +你可以从 [sys][17] 模块中获取程序的参数。 + +``` +import sys + +if __name__ == '__main__': +   for value in sys.argv: +       print(value) +``` + +#### 自给自足 + +在 Python 标准库中已经有几个参数解析模块的实现:[getopt][18]、[optparse][19],以及最近的 [argparse][20]。`argparse` 允许程序员为用户提供一致的、有帮助的用户体验,但就像它的 GNU 前辈一样,它需要程序员做大量的工作和“[模板代码][21]”才能使它“奏效”。 + +``` +from argparse import ArgumentParser + +if __name__ == "__main__": + +   argparser = ArgumentParser(description='My Cool Program') +   argparser.add_argument("--foo", "-f", help="A user supplied foo") +   argparser.add_argument("--bar", "-b", help="A user supplied bar") +    +   results = argparser.parse_args() +   print(results.foo, results.bar) +``` + +好处是当用户调用 `--help` 时,有自动生成的帮助。但是[自给自足][22]batteries included的优势呢?有时,你的项目情况决定了你对第三方库的访问是有限的,或者说是没有,你不得不用 Python 标准库来“凑合”。 + +#### CLI 的现代方法 + +然后是 [Click][23]。`Click` 框架使用[装饰器][24]的方式来构建命令行解析。突然间,写一个丰富的命令行界面变得有趣而简单。在装饰器的酷炫和未来感的使用下,很多复杂的东西都消失了,用户惊叹于自动支持关键字补完以及上下文帮助。所有这些都比以前的解决方案写的代码更少。任何时候,只要你能写更少的代码,还能把事情做好,就是一种胜利。而我们都想要胜利。 + +``` +import click + +@click.command() +@click.option("-f", "--foo", default="foo", help="User supplied foo.") +@click.option("-b", "--bar", default="bar", help="User supplied bar.") +def echo(foo, bar): +    """My Cool Program +    +    It does stuff. Here is the documentation for it. +    """ +    print(foo, bar) +    +if __name__ == "__main__": +    echo() +``` + +你可以在 `@click.option` 装饰器中看到一些与 `argparse` 相同的模板代码。但是创建和管理参数分析器的“工作”已经被抽象化了。现在,命令行参数被解析,而值被赋给函数参数,从而函数 `echo` 被*魔法般地*调用。 + +在 `Click` 接口中添加参数就像在堆栈中添加另一个装饰符并将新的参数添加到函数定义中一样简单。 + +### 但是,等等,还有更多! + +[Typer][25] 建立在 `Click` 之上,是一个更新的 CLI 框架,它结合了 `Click` 的功能和现代 Python [类型提示][26]。使用 `Click` 的缺点之一是必须在函数中添加一堆装饰符。CLI 参数必须在两个地方指定:装饰符和函数参数列表。`Typer` [免去你造轮子][27] 去写 CLI 规范,让代码更容易阅读和维护。 + +``` +import typer + +cli = typer.Typer() + +@cli.command() +def echo(foo: str = "foo", bar: str = "bar"): +    """My Cool Program +    +    It does stuff. Here is the documentation for it. +    """ +    print(foo, bar) +    +if __name__ == "__main__": +    cli() +``` + +### 是时候开始写一些代码了 + +哪种方法是正确的?这取决于你的用例。你是在写一个只有你才会使用的快速而粗略的脚本吗?直接使用 `sys.argv` 然后继续编码。你需要更强大的命令行解析吗?也许 `argparse` 就够了。你是否有很多子命令和复杂的选项,你的团队是否会每天使用它?现在你一定要考虑一下 `Click` 或 `Typer`。作为一个程序员的乐趣之一就是魔改出替代实现,看看哪一个最适合你。 + +最后,在 Python 中有很多用于解析命令行参数的第三方软件包。我只介绍了我喜欢或使用过的那些。你喜欢和/或使用不同的包是完全可以的,也是我们所期望的。我的建议是先从这些包开始,然后看看你最终的结果。 + +去写一些很酷的东西吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/c-python-cli + +作者:[Erik O'Shaughnessy][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/jnyjny +[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://en.wikipedia.org/wiki/Command-line_interface +[3]: https://en.wikipedia.org/wiki/Unix +[4]: https://www.gnu.org/software/bash/ +[5]: https://en.wikipedia.org/wiki/C_(programming_language) +[6]: https://www.toptal.com/c/after-all-these-years-the-world-is-still-powered-by-c-programming +[7]: https://opensource.com/article/19/5/how-write-good-c-main-function +[8]: https://en.wikipedia.org/wiki/Dynamic_linker +[9]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[10]: https://en.wikipedia.org/wiki/C_standard_library +[11]: http://man7.org/linux/man-pages/man3/getopt.3.html +[12]: https://www.python.org/dev/peps/pep-0275/ +[13]: https://www.python.org/dev/peps/pep-3103/ +[14]: https://www.gnu.org +[15]: https://en.wikipedia.org/wiki/Man_page +[16]: http://man7.org/linux/man-pages/man1/ps.1.html +[17]: https://docs.python.org/3/library/sys.html +[18]: https://docs.python.org/2/library/getopt.html +[19]: https://docs.python.org/2/library/optparse.html +[20]: https://docs.python.org/3/library/argparse.html +[21]: https://en.wikipedia.org/wiki/Boilerplate_code +[22]: https://www.python.org/dev/peps/pep-0206/ +[23]: https://click.palletsprojects.com/en/7.x/ +[24]: https://wiki.python.org/moin/PythonDecorators +[25]: https://typer.tiangolo.com +[26]: https://docs.python.org/3/library/typing.html +[27]: https://en.wikipedia.org/wiki/Don%27t_repeat_yourself +[28]: https://pybit.es/guest-exploring-python-clis.html diff --git a/published/202006/20200602 Linux Lite 5.0 Released With UEFI Support - Other Major Improvements.md b/published/202006/20200602 Linux Lite 5.0 Released With UEFI Support - Other Major Improvements.md new file mode 100644 index 0000000000..f17baf1796 --- /dev/null +++ b/published/202006/20200602 Linux Lite 5.0 Released With UEFI Support - Other Major Improvements.md @@ -0,0 +1,128 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12287-1.html) +[#]: subject: (Linux Lite 5.0 Released With UEFI Support & Other Major Improvements) +[#]: via: (https://itsfoss.com/linux-lite-5-release/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Linux Lite 5.0 发布,带有 UEFI 支持和其他重大改进 +====== + +Linux Lite 是[适合 Windows 用户的最佳 Linux 发行版][1]之一。 不仅限于此,它还是最受欢迎的[轻量级 Linux 发行版][2]之一。 + +基于 Ubuntu 18.04 的 Linux Lite 4.x 系列虽然不错,但没有 [UEFI 支持][3]。 但是现在基于 [Ubuntu 20.04][4] 的 Linux Lite 5.0 终于来了,我很高兴看到这些变化! + +在本文中,我们将介绍 Linux Lite 5.0 的新增功能。 + +### Linux Lite 5.0:关键变更 + +![][5] + +即使 Linux Lite 从 2.x 就开始支持 UEFI,但他们总是默认发布非 UEFI 的。 + +但是,在 Linux Lite 5.0 中,他们终于增加了开箱即用的 [UEFI][3] 默认支持以及许多重大改进。让我们看看发生了什么变化: + +#### UEFI 支持 + +Linux Lite 5.0 支持开箱即用的 UEFI。但是,他们建议禁用[安全启动][6],即使该功能可以工作。 + +![][7] + +你可以看看他们的[论坛文章][8],以了解更多信息。此外,你还可以在新的内置**帮助手册**中找到有关此的更多信息。 + +#### 基于 Ubuntu 的发行版,没有隐藏的遥测 + +如果你正在寻找基于 Ubuntu 的 Linux 发行版,且没有任何隐藏的遥测功能,那么 Linux Lite 5.0 似乎是理想的选择。 + +在[发布公告][9]中,他们在变更日志中提到了它,并提供了截图: + +![][10] + +#### GUFW 防火墙替换为 firewalld + +你可能已经读过[在 Linux 上使用 GUFW 设置防火墙][11],但从 Linux Lite 5.0 开始,它已由 [firewalld][12] 取代。 + +![][13] + +似乎 [GUFW][14] 不能像 firewalld 那样配置。因此,他们决定替换它。 + +默认情况下,它是禁用的。但是,你可以按照**帮助手册**中的教程选择启用它。 + +#### 新的 Whisker 菜单 + +![][15] + +[Whisker 菜单][16]已更新至最新可用的软件包(v2.4.4)。 除了更新之外,你还可以注意到**安装更新**现在被固定在收藏夹。 + +#### HiDPI 设置 + +![][17] + +如果需要,你会发现从**设置菜单**中设置 HiDPI 非常容易。 + +#### 已添加 XFCE 屏幕保护程序 + +在 Linux Lite 5.0 中,你还将注意到添加了 [XFCE 屏幕保护程序][18],默认情况下它处于禁用状态。 + +![][19] + +这是一个简单的补充,对于一直想要屏幕保护程序并能够对其进行调整的用户而言,这将很有用。 + +### 其他重要改进 + +除了上面提到的关键要点外,还有其他一些改进对于 Linux Lite 5.0 用户而言应该是很方便的。我在这里列出其中一些: + + * [Mousepad][20] 替换 [Leafpad][21] + * 新的更新通知 + * 在即时启动时进行完整性检查 + * 对**帮助手册**的重大改进 + * Lite 软件中用 Chrome 取代了 Chromium + * 新的布局选项 + * Lite 欢迎页面和 Lite 用户管理器现在更新到 GTK3 和 Python3。 + * 欢迎页面添加了新的选择:**选择深色或浅色主题、UEFI 和安全启动、反馈** + * 改进的 Lite 小部件 + +如果你想进一步了解更改,可以在其[官方公告][9]中找到详细的更改列表。 + +### 总结 + +我认为 Linux Lite 5.0 比以往任何时候要好,并且随着最近新增的功能,对于许多新 Linux 用户来说,它也是一个绝佳的选择。 + +你如何看待 Linux Lite 5.0?在下面的评论中让我知道你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-lite-5-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://itsfoss.com/windows-like-linux-distributions/ +[2]: https://itsfoss.com/lightweight-linux-beginners/ +[3]: https://help.ubuntu.com/community/UEFI +[4]: https://itsfoss.com/ubuntu-20-04-release-features/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-lite-5.jpg?ssl=1 +[6]: https://en.wikipedia.org/wiki/Hardware_restriction#Secure_boot +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-lite-uefi.png?ssl=1 +[8]: https://www.linuxliteos.com/forums/uefi-secure-boot/ +[9]: https://www.linuxliteos.com/forums/release-announcements/linux-lite-5-0-final-released/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-lite-5-telemetry.png?ssl=1 +[11]: https://itsfoss.com/set-up-firewall-gufw/ +[12]: https://firewalld.org/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-lite-5-firewall.jpg?ssl=1 +[14]: http://gufw.org/ +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/whisker-menu-linux-lite.jpg?ssl=1 +[16]: https://gottcode.org/xfce4-whiskermenu-plugin/ +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-lite-5-hidpi.png?ssl=1 +[18]: https://docs.xfce.org/apps/screensaver/start +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-lite-5-screensaver.jpg?ssl=1 +[20]: https://salsa.debian.org/xfce-team/apps/mousepad +[21]: https://tarot.freeshell.org/leafpad/ diff --git a/published/202006/20200602 Using pandas to plot data in Python.md b/published/202006/20200602 Using pandas to plot data in Python.md new file mode 100644 index 0000000000..f51dd2f1e1 --- /dev/null +++ b/published/202006/20200602 Using pandas to plot data in Python.md @@ -0,0 +1,133 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12333-1.html) +[#]: subject: (Using pandas to plot data in Python) +[#]: via: (https://opensource.com/article/20/6/pandas-python) +[#]: author: (Shaun Taylor-Morgan https://opensource.com/users/shaun-taylor-morgan) + +使用 Pandas 在 Python 中绘制数据 +====== + +> Pandas 是一个非常流行的 Python 数据操作库。学习怎样使用它的 API 绘制数据。 + +![](https://img.linux.net.cn/data/attachment/album/202006/19/231720ed0jd9s99h9cute7.jpg) + +在有关基于 Python 的绘图库的系列文章中,我们将对使用 Pandas 这个非常流行的 Python 数据操作库进行绘图进行概念性的研究。Pandas 是 Python 中的标准工具,用于对进行数据可扩展的转换,它也已成为[从 CSV 和 Excel 格式导入和导出数据][2]的流行方法。 + +除此之外,它还包含一个非常好的绘图 API。这非常方便,你已将数据存储在 Pandas DataFrame 中,那么为什么不使用相同的库进行绘制呢? + +在本系列中,我们将在每个库中制作相同的多条形柱状图,以便我们可以比较它们的工作方式。我们使用的数据是 1966 年至 2020 年的英国大选结果: + +![Matplotlib UK election results][3] + +### 自行绘制的数据 + +在继续之前,请注意你可能需要调整 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') +``` + +现在我们已经准备好了。在本系列文章中,我们已经看到了一些令人印象深刻的简单 API,但是 Pandas 一定能夺冠。 + +要在 x 轴上绘制按年份和每个党派分组的柱状图,我只需要这样做: + +``` +import matplotlib.pyplot as plt +ax = df.plot.bar(x='year') +plt.show() +``` + +只有四行,这绝对是我们在本系列中创建的最棒的多条形柱状图。 + +我以[宽格式][7]使用数据,这意味着每个党派都有一列: + +``` + year conservative labour liberal others +0 1966 253 364 12 1 +1 1970 330 287 6 7 +2 Feb 1974 297 301 14 18 +.. ... ... ... ... ... +12 2015 330 232 8 80 +13 2017 317 262 12 59 +14 2019 365 202 11 72 +``` + +这意味着 Pandas 会自动知道我希望如何分组,如果我希望进行不同的分组,Pandas 可以很容易地[重组 DataFrame][8]。 + +与 [Seaborn][9] 一样,Pandas 的绘图功能是 Matplotlib 之上的抽象,这就是为什么要调用 Matplotlib 的 `plt.show()` 函数来实际生成绘图的原因。 + +看起来是这样的: + +![pandas unstyled data plot][10] + +看起来很棒,特别是它又这么简单!让我们对它进行样式设置,使其看起来像 [Matplotlib][11] 的例子。 + +#### 调整样式 + +我们可以通过访问底层的 Matplotlib 方法轻松地调整样式。 + +首先,我们可以通过将 Matplotlib 颜色表传递到绘图函数来为柱状图着色: + +``` +from matplotlib.colors import ListedColormap +cmap = ListedColormap(['#0343df', '#e50000', '#ffff14', '#929591']) +ax = df.plot.bar(x='year', colormap=cmap) +``` + +我们可以使用绘图函数的返回值设置坐标轴标签和标题,它只是一个 [Matplotlib 的 Axis 对象][12]。 + +``` +ax.set_xlabel(None) +ax.set_ylabel('Seats') +ax.set_title('UK election results') +``` + +这是现在的样子: + +![pandas styled plot][13] + +这与上面的 Matplotlib 版本几乎相同,但是只用了 8 行代码而不是 16 行!我内心的[代码高手][14]非常高兴。 + +### 抽象必须是可转义的 + +与 Seaborn 一样,向下访问 Matplotlib API 进行细节调整的能力确实很有帮助。这是给出抽象[紧急出口][15]使其既强大又简单的一个很好的例子。 + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/pandas-python + +作者:[Shaun Taylor-Morgan][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/shaun-taylor-morgan +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/panda.png?itok=0lJlct7O (Two pandas sitting in bamboo) +[2]: https://anvil.works/docs/data-tables/csv-and-excel +[3]: https://opensource.com/sites/default/files/uploads/matplotlib_2.png (Matplotlib UK election results) +[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://anvil.works/blog/tidy-data +[8]: https://anvil.works/blog/tidy-data#converting-between-long-and-wide-data-in-pandas +[9]: https://anvil.works/blog/plotting-in-seaborn +[10]: https://opensource.com/sites/default/files/uploads/pandas-unstyled.png (pandas unstyled data plot) +[11]: https://opensource.com/article/20/5/matplotlib-python +[12]: https://matplotlib.org/api/axis_api.html#axis-objects +[13]: https://opensource.com/sites/default/files/uploads/pandas_3.png (pandas styled plot) +[14]: https://en.wikipedia.org/wiki/Code_golf +[15]: https://anvil.works/blog/escape-hatches-and-ejector-seats +[16]: https://anvil.works/blog/plotting-in-pandas \ No newline at end of file diff --git a/published/202006/20200602 Using the Lightweight Apt Package Manager Synaptic in Ubuntu and Other Debian-based Linux Distributions.md b/published/202006/20200602 Using the Lightweight Apt Package Manager Synaptic in Ubuntu and Other Debian-based Linux Distributions.md new file mode 100644 index 0000000000..3a33690599 --- /dev/null +++ b/published/202006/20200602 Using the Lightweight Apt Package Manager Synaptic in Ubuntu and Other Debian-based Linux Distributions.md @@ -0,0 +1,174 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12353-1.html) +[#]: subject: (Using the Lightweight Apt Package Manager Synaptic in Ubuntu and Other Debian-based Linux Distributions) +[#]: via: (https://itsfoss.com/synaptic-package-manager/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +在 Ubuntu 中使用轻量的 Apt 软件包管理器 Synaptic +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/26/220622uh75qnmmzgh58lpv.jpg) + +这周推荐的开源软件是 Synaptic。学习这个经过时光积淀的软件包管理器能做哪些现代软件管理器做不到的事情。 + +### Synaptic 软件包管理器是什么? + +[Synaptic][1] 是一个轻量级的 [apt 软件包管理器系统][2]的 GUI 前端,使用在 Debian、Ubuntu、Linux Mint 以及其它很多基于 Debian/Ubuntu 发行版中。 + +总的来说,所有你可以 [在终端中使用 apt-get 命令][3] 来做的事,都可以通过 Synaptic 来实现。 + +![][4] + +曾几何时,Synaptic 几乎是所有基于 Debian Linux 发行版的默认图形化软件包管理器。它被认为是一种用户友好的、易于使用的管理应用程序的方法。 + +随着像 [GNOME “软件”][5] 和 [KDE “发现”][6] 等现代软件包管理器工具带来更现代和直观的图形用户界面,事情发生了变化。这些软件包管理器有更好的界面,以一种更友好的方式显示软件包信息,带有缩略图、评分和评论。 + +最后,Synaptic [的使用被局限于在大多数的轻量级 Linux 发行版][7] 中。 + +#### 为什么你要使用像 Synaptic 软件包管理器这样的 “古老的” 软件? + +当然,在多大数的情况下,你没有必要这样做。 + +但是,Synaptic 仍然比 GNOME “软件” 的功能要很多。记住,它基本上是 `apt` 的 GUI 前端,这意味着它(几乎)可以做任何你能够 [在终端中使用 apt 命令][8] 所做的事。 + +例如,如果你想 [在 Ubuntu 中阻止特定的软件包更新][9],你可以在 Synaptic 中做到这一点,但是你却不能 GNOME/Ubuntu 的软件中心中实现。 + +![][10] + +另外,我注意到 Ubuntu 20.04 的软件中心存在一些问题。它加载速度缓慢,它搜索软件包时缓慢,并且它充满了 snap 应用程序(不是每个人都喜欢)。 + +Synaptic 也是 [Ubuntu 中一个轻量级应用程序][7],使用可以可以让你感觉你的系统快一点。 + +#### Synaptic 软件包管理器的功能 + +下面是对 Synaptic 的概况: + + * 更新软件包缓存 + * 升级整个系统 + * 管理软件包包存储库 + * 通过名称、描述、维护者、版本、依赖项等搜索软件包 + * 通过组、状态(安装与否)、源或更多信息列出软件包 + * 通过名称、状态、大小或版本排序软件包 + * 获取与软件包相关的信息 + * 锁定软件包版本 + * 安装指定版本的软件包 + +还有很多功能,大家可以自己去探索。 + +### 如何在 Ubuntu 上安装 Synaptic 软件包管理器 + +Synaptic 软件包管理器可在 Ubuntu 的 Universe 存储库中获得。如果 Universe 存储库未启用,你可以在软件中心中找到Synaptic: + +![Synaptic 在 Ubuntu 软件中心][11] + +你也可以通过命令行来安装 Synaptic 。先确保启用 universe 存储库: + +``` +sudo add-apt-repository univers +``` + +然后更新缓存(在 Ubuntu 18.04 及更高版本中不需要): + +``` +sudo apt update +``` + +现在,使用下面的命令来安装 synaptic 软件包管理器: + +``` +sudo apt install synaptic +``` + +这就是所有的安装过程。 + +### 如何使用 Synaptic 软件包管理器 + +在安装后,你可以在菜单中开始搜索 Synaptic 并启动它: + +![][12] + +可以看到,这个界面不是最好看的界面之一。注意复选框的颜色。白色意味着软件包未安装,绿色意味软件包已安装。 + +![][4] + +你可以搜索一个应用程序并单击复选框将标记其为安装。它也将(以绿色的形式)高亮将被作为依赖关系项目的软件包。单击应用来安装选择的软件包: + +![][13] + +你可以使用 Synaptic [查看在 Ubuntu 中安装的所有软件包][14] 。你也可以从这个视图中选择移除软件包。 + +![][15] + +你可以根据源显示各个存储库中可用的软件包。这是查看 [哪个 PPA 提供什么软件包][16]的好方法。你可以通过如上所述的方法来安装或移除软件包。 + +![][17] + +通常,当你更新 Ubuntu 时,所有的软件包都会同时更新。使用 Synaptic,你可以轻松地选择你需要更新/升级到较新版本的软件包。 + +![][18] + +你也可以锁定软件包的版本,以便它们就不会随着系统更新而被更新。 + +![][10] + +你也可以使用 Synaptic 搜索软件包。这类似于 [使用 apt-cache search 命令搜索软件包][19]。 + +![][20] + +如果你认为你做了错误的选择,你可以从“编辑”菜单中单击撤销。 + +你可以使用 Synaptic 做很多事,我无法涵盖所有可能的用法。我在这里已经涵盖了最常见的一些方法,如果你将要去使用 Synaptic 的话,我留给你去探索。 + +### Synaptic 并不适合所有的人 + +如果你不喜欢 Synaptic,你可以在软件中心中移除它,或在终端中使用这个命令: + +``` +sudo apt remove synaptic +``` + +Ubuntu 还有另一个被称为 [AppGrid][21] 的轻量级软件包管理器。据我所知,它已经有一段时间没有更新了。 + +Synaptic 当然并不适合所有的人。它列出了你在常规软件中心中看不到的库和包。如果你移除了一个你不知道的库,那么它可能会引起问题。 + +我认为 Synaptic 更适合于中高级用户,他们既想更好地控制软件包管理器又不想使用命令行方法。 + +你有什么要说的吗?你使用过 Synaptic 软件包管理器吗?你是使用软件中心还是你只在终端中探索?请在评论区中分享你的喜好。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/synaptic-package-manager/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[robsean](https://github.comrobsean) +校对:[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://www.nongnu.org/synaptic/ +[2]: https://en.wikipedia.org/wiki/APT_(software) +[3]: https://itsfoss.com/apt-get-linux-guide/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/synaptic-interface.png?ssl=1 +[5]: https://wiki.gnome.org/Apps/Software +[6]: https://userbase.kde.org/Discover +[7]: https://itsfoss.com/lightweight-alternative-applications-ubuntu/ +[8]: https://itsfoss.com/apt-command-guide/ +[9]: https://itsfoss.com/prevent-package-update-ubuntu/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/lock-version-synaptic.png?ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/synaptic-ubuntu-software-center.png?ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/synaptic-package-manager-ubuntu.jpg?ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/install-packages-in-synaptic.png?ssl=1 +[14]: https://itsfoss.com/list-installed-packages-ubuntu/ +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/remove-packages-using-synaptic.png?ssl=1 +[16]: https://itsfoss.com/ppa-guide/ +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/see-packages-by-repositories-synaptic.png?ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/upgrade-packages-synaptic.png?ssl=1 +[19]: https://itsfoss.com/apt-search-command/ +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/search-results-synaptic.png?ssl=1 +[21]: https://itsfoss.com/app-grid-lighter-alternative-ubuntu-software-center/ diff --git a/published/202006/20200604 Devuan Beowulf 3.0 is the Latest Stable Release Based on Debian 10.4 Buster (and Free From systemd).md b/published/202006/20200604 Devuan Beowulf 3.0 is the Latest Stable Release Based on Debian 10.4 Buster (and Free From systemd).md new file mode 100644 index 0000000000..14d4670ffe --- /dev/null +++ b/published/202006/20200604 Devuan Beowulf 3.0 is the Latest Stable Release Based on Debian 10.4 Buster (and Free From systemd).md @@ -0,0 +1,97 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12308-1.html) +[#]: subject: (Devuan Beowulf 3.0 is the Latest Stable Release Based on Debian 10.4 Buster) +[#]: via: (https://itsfoss.com/devuan-3-release/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +没有 systemd 的 Devuan Beowulf 3.0 发布 +====== + +[Devuan GNU+Linux][1] 是 [Debian][2] 的分支,它不含有 [systemd][3]。如果你想知道 systemd 有什么问题,我们可以改天再讨论这个话题。 + +不过,如果你想要一个没有 systemd 的 Linux 发行版,那么 Devuan Beowulf 3.0 的发布对你来说应该是个好消息。 + +### Devuan Beowulf 3.0 有什么新增功能? + +![](https://img.linux.net.cn/data/attachment/album/202006/12/112455y003411l1k8yykp0.jpg) + +Devuan 通常因其提供了替代性的[初始化][5]系统(如 [SysV][6])而受到喜爱。 + +在本文中,我们将介绍 Devuan Beowulf 3.0 中的主要亮点。 + +#### 基于 Debian 10.4 Buster + +[Debian 10 Buster][7] 无疑是一款令人印象深刻的发行版系列,它的最新版本是 Debian 10.4。 + +而 Devuan Beowulf 3.0,是基于最新的 Debian 10.4 Buster 更新版本的。如果你不了解,可以查看 [Debian 10.4 Buster 的官方公告][8],以了解更多信息。 + +#### Linux Kernel 4.19 + +在它的最新版本中装有 [Linux Kernel 4.19 LTS][9] 也是一个很好的加分项。 + +当然,这不是最新的内核,因为我们身处 “Debian 领域”,这里的事物并非总是最新的,但更加稳定。这个新内核应该可以解决以前版本中可能遇到的几个问题。 + +#### 支持 ppc64el 架构 + +对 [ppc64el][10] 的支持在大多数时候都不是大事,但支持 PowerPC 和 Power ISA 处理器是一个优势。 + +顺便提一句,Devuan GNU+Linux 已经支持 i386、amd64、armel、armhf 和 arm64 架构。 + +#### 添加 runit 和 OpenRC 作为可选项 + +想要更多替代的的初始化系统吗?现在最新版本中可选 [runit][11] 和 [openrc][12]。 + +#### 其他变化 + +除了上面的这样亮点外,你还可以发现它添加了独立守护进程 [eudev][13] 和 [elogind][14]。 + +启动页面、显示管理器和桌面主题也有了细微的变化。例如,启动菜单显示的是 “Debian” 而不是 “Devuan”。 + +如果你想了解有关 Devuan Beowulf 3.0.0 变更的更多技术详细信息,那么可以查看[官方发行说明][15]。 + +> 花絮 +> +> Devuan 的发布版本以小行星命名。Beowulf 是一个[编号为 38086 的小行星][16]。 + +### 总结 + +最新稳定版本的 Devuan Beowulf 3.0 是提供无 systemd 的发行版的很好的进展。 + +如果你想支持 Devuan 项目,请[在财务上为他们的项目捐款][17]或[通过其他方式][18]。 + +你觉得这个版本怎么样?请在下面评论让我知道你的想法! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/devuan-3-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://devuan.org +[2]: https://www.debian.org +[3]: https://en.wikipedia.org/wiki/Systemd +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/devuan-beowulf.jpg?ssl=1 +[5]: https://en.wikipedia.org/wiki/Init +[6]: https://wiki.archlinux.org/index.php/SysVinit +[7]: https://itsfoss.com/debian-10-buster/ +[8]: https://www.debian.org/News/2020/20200509 +[9]: https://itsfoss.com/linux-kernel-4-19-lts-release/ +[10]: https://en.wikipedia.org/wiki/Ppc64 +[11]: https://en.wikipedia.org/wiki/Runit +[12]: https://en.wikipedia.org/wiki/OpenRC +[13]: https://wiki.gentoo.org/wiki/Eudev +[14]: https://wiki.gentoo.org/wiki/Elogind +[15]: https://files.devuan.org/devuan_beowulf/Release_notes.txt +[16]: https://en.wikipedia.org/wiki/Meanings_of_minor_planet_names:_38001%E2%80%9339000#086 +[17]: https://devuan.org/os/donate +[18]: https://dev1galaxy.org/viewtopic.php?pid=1380#p1380 diff --git a/published/202006/20200604 How to Install Nvidia Drivers on Fedora Linux.md b/published/202006/20200604 How to Install Nvidia Drivers on Fedora Linux.md new file mode 100644 index 0000000000..724a854583 --- /dev/null +++ b/published/202006/20200604 How to Install Nvidia Drivers on Fedora Linux.md @@ -0,0 +1,131 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12301-1.html) +[#]: subject: (How to Install Nvidia Drivers on Fedora Linux) +[#]: via: (https://itsfoss.com/install-nvidia-drivers-fedora/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +如何在 Fedora Linux 中安装 Nvidia 驱动 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/10/094702c7of7scjyucmc5f1.jpg) + +与大多数 Linux 发行版一样,[Fedora][1] 并未默认安装专有的 [Nvidia][2] 驱动。 + +默认的开源 [Nouveau 驱动][3]在大多数情况下都可以使用,但是你可能会遇到屏幕撕裂等问题。 + +![Display issue in Fedora with Nouveau graphics driver][4] + +如果遇到此类图形/视频问题,那么可能需要在 Fedora 中安装官方专有的 Nvidia 驱动。让我告诉你如何安装。 + +### 在 Fedora 中安装 Nvidia 驱动 + +我在本教程中使用 [Fedora 32][5],但它应适用于其他 Fedora 版本。 + +#### 步骤 1 + +在做其他任何操作之前,请先确保你的系统是最新的。你可以使用软件中心,也可以在终端中使用以下命令: + +``` +sudo dnf update +``` + +#### 步骤 2 + +由于 Fedora 没有提供 Nvidia 驱动,因此你需要在系统中添加 [RPMFusion 仓库][6]。你可以在终端中使用以下命令: + +``` +sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm +``` + +> 不喜欢终端么?那使用 GUI 的方法添加 RPMFusion 仓库。 +> +> 如果你使用 Firefox,那么还可以从浏览器添加 RPMFusion 仓库。进入这个[配置页面][7],然后向下滚动到 “Graphical Setup via Firefox web browser”。单击自由和非自由仓库的链接。这将下载 .rpm 文件,并安装仓库。 +> +> ![RPMFusion Browser Installation][8] +> +> 你可以双击下载的 RPM 文件进行安装。 +> +> ![RPMFusion in the Software Center][9] + +#### 步骤 3 + +现在,你需要确定 [Linux 系统中有哪些显卡(或芯片)][10]。打开终端并输入以下命令: + +``` +lspci -vnn | grep VGA +``` + +![Video Card Lookup in Fedora][11] + +接下来,你需要查找与该芯片对应的驱动。你可以在[此处][12]找到 Nvidia 芯片的列表。你也可以使用[此工具][13]搜索设备。 + +**注意**:请记住,即使 Nvidia 列表显示了更多驱动,但也只有三个驱动可以安装。Nvidia 驱动支持最新的显卡。nvidia-390 和 nvidia-340 驱动支持旧设备。 + +#### 步骤 4 + +要安装所需的驱动,请在终端中输入以下一个命令。下面的命令是用于我的显卡的命令。根据你的系统相应调整。 + +``` +sudo dnf install akmod-nvidia sudo dnf install xorg-x11-drv-nvidia-390xx akmod-nvidia-390xx sudo dnf install xorg-x11-drv-nvidia-340xx akmod-nvidia-340xx +``` + +![Nvidia terminal installation][14] + +#### 步骤 5 + +要使更改生效,请重启系统。你的系统重启可能需要比较长的时间,因为它将 Nvidia 驱动注入到 Linux 内核中。 + +重启并登录系统后,你会看到更好的视觉效果,并且不会出现屏幕撕裂的情况。 + +![Fedora with Nvidia drivers][15] + +### 额外的提示 + +这是可选步骤,但建议这样做。添加 RPMFusion 仓库时,你可以访问常规仓库中不可用的多媒体包。 + +此命令将为使用 [gstreamer][16] 的应用安装软件包: + +``` +sudo dnf groupupdate multimedia --setop="install_weak_deps=False" --exclude=PackageKit-gstreamer-plugin +``` + +此命令将安装声音和视频软件包所需的包: + +``` +sudo dnf groupupdate sound-and-video +``` + +希望本教程对在 Fedora 上安装 Nvidia 驱动很有用。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-nvidia-drivers-fedora/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://getfedora.org/ +[2]: https://www.nvidia.com/en-us/ +[3]: https://en.wikipedia.org/wiki/Nouveau_(software) +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/fedora-nouveau.jpg?resize=800%2C500&ssl=1 +[5]: https://itsfoss.com/fedora-32/ +[6]: https://rpmfusion.org/RPM%20Fusion +[7]: https://rpmfusion.org/Configuration +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/rpmfusion-gui-install.png?resize=800%2C500&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/rpmfusion-gui-install2.png?resize=800%2C500&ssl=1 +[10]: https://itsfoss.com/check-graphics-card-linux/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/video-card-lookup-fedora.png?ssl=1 +[12]: https://us.download.nvidia.com/XFree86/Linux-x86/367.57/README/supportedchips.html +[13]: https://www.nvidia.com/Download/index.aspx?lang=en-us +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/nvidia-cli-install.png?resize=800%2C500&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/fedora-nvidia.jpg?resize=800%2C500&ssl=1 +[16]: https://en.wikipedia.org/wiki/GStreamer diff --git a/published/202006/20200604 How to generate an EPUB file on Fedora.md b/published/202006/20200604 How to generate an EPUB file on Fedora.md new file mode 100644 index 0000000000..021271376f --- /dev/null +++ b/published/202006/20200604 How to generate an EPUB file on Fedora.md @@ -0,0 +1,112 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12313-1.html) +[#]: subject: (How to generate an EPUB file on Fedora) +[#]: via: (https://fedoramagazine.org/how-to-generate-an-epub-file-on-fedora/) +[#]: author: (John Paul Wohlscheid https://fedoramagazine.org/author/johnblood/) + +如何在 Fedora 上生成 EPUB 电子书 +====== + +![][1] + +在智能手机上阅读内容正在变得越来越流行。每一部手机都有它自己的电子书阅读器。可能你不知道,在 Fedora 创建你自己的电子书文件是非常容易的。 + +这篇文章展示了使用两种不同的方法来创建一个 [EPUB][2] 文件。EPUB 格式是最流行的格式之一,并且被很多开源软件所支持。 + +绝大数的人们将会询问 “在很容易创建 PDF 文件的情况下,为什么要花费时间和精力来创建 EPUB 文件?” 答案是: “你曾经尝试看过每次只能看到一张纸的一小部分的吗?”为阅读一个 PDF 文件,你不得不经常缩放和移动文档,或者将其缩放到一个小尺寸来适合屏幕大小。在另一方面,EPUB 文件则被设计成可以适合很多不同的屏幕类型。 + +### 方法 1: ghostwriter 和 pandoc + +第一种方法创建一个速成版的电子书文件。它使用一个名为 [ghostwriter][3] 的 Markdown 编辑器,和一个名为 [pandoc][4] 的命令行文档转换工具。 + +你可以从软件中心搜查和安装它们,也可以从终端中安装它们。如果你使用终端来安装它们,运行这个命令: + +``` +sudo dnf install pandoc ghostwriter +``` + +对于那些不知道 [Markdown][5] 是什么的人们来说,在这里有一个简要的解释:它是一个大约在 15 年前创建的简单的标记语言。它使用简单的语法来格式化纯文本。Markdown 文件可以随后转换成很多其它文档格式的文件。 + +![ghostwriter][6] + +对于工具,ghostwriter 是一个跨平台的易于使用的 Markdown 编辑器。pandoc 是一个非常易于使用的文档转换工具,可以处理数百种不同的格式。 + +要创建你的电子书,打开 ghostwriter,开始编写你的文档。如果你以前使用过 Markdown,你可能习惯于在文档的“标题 1”的前面放置一个 `#` 符号来作为标题。像这样: `# My Man Jeeves`。然而,pandoc 将不会识别其为标题,并将在你的电子书的顶部放置一个一个大的 “UNTITLED” 。相反地在你的标题前放置一个 `%` 来作为标题。例如,`% My Man Jeeves` 。章节应该被格式为“标题 2”,例如,`## Leave It to Jeeves`。如果你有子章节,使用“标题 3”(`###`)。 + +![][7] + +在你的文档完成后,单击“文件 -> 导出”(或按 `Ctrl+E` 键)。在对话框中,在几个 Markdown 转换器中进行选择。如果这是你第一次使用 ghostwriter ,默认选择的是 Sundown 转换器。从对话框中,选择 pandoc 。接下来单击“导出”。现在你的 EPUB 文件已经创建好了。 + +![ghostwriter 导出对话框][8] + +注意: 如果你得到一个与 pandoc 有关的错误,关闭“智能排版”,并再试一次。 + +### 方法 2: calibre + +如果你想要一个更完美的电子书,那这就是你正在寻找的方法。它需要更多的步骤,但是是值得的。 + +![][9] + +首先,安装一个名为 [calibre][10] 的应用程序。calibre 不仅仅是一个电子书阅读器,它也是一个电子书管理器系统。你可以从软件中心安装它,也可以从终端安装它: + +``` +sudo dnf install calibre +``` + +在这个方法中,你可以在 LibreOffice、ghostwriter,或者其它你选择的编辑器中编写你的文档。确保书籍的标题被格式为“标题 1”,章节被格式为“标题 2”,子章节被格式为“标题 3”。 + +接下来,导出你的文档为一个 HTML 文件。 + +现在添加该文件到 calibre 。打开 calibre ,并单击 “添加书籍”。calibre 会用几秒钟来添加文件。 + +![][11] + +在文件导入后,通过单击 “编辑元数据” 按钮来编辑文件的元数据。在这里你可以填写书的标题和作者的姓名。你也可以上传一个封面图片(如果你有的话),或者 calibre 将为你生成一个封面。 + +![][12] + +接下来,单击 “转换书籍” 按钮。在新的对话框中,选择 “界面与外观” 部分的 “布局” 标签页。勾选 “删除段间空行” 选项。这将更加严格地缩进每一段的内容。 + +![][13] + +现在,设置目录。选择 “内容目录” 部分。这里有三个需要注意的选项: “一级目录”、“二级目录” 和 “三级目录”。对于每一个选项点击其末尾处的魔法棒按钮。在新的对话框中,选择应用于目录表项的 HTML 标记。例如,为“一级目录”选择 “h1”。 + +![][14] + +接下来,告诉 calibre 包含内容目录。选择 “输出 EPUB” 部分并勾选 “插入内联目录”。单击“确定“ 创建 epub 文件。 + +![][15] + +现在,你有了一个看起来很专业的电子书文件。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/how-to-generate-an-epub-file-on-fedora/ + +作者:[John Paul Wohlscheid][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://fedoramagazine.org/author/johnblood/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/05/epub-how_to-816x345.png +[2]: https://en.wikipedia.org/wiki/EPUB +[3]: https://github.com/wereturtle/ghostwriter +[4]: https://pandoc.org/ +[5]: https://fedoramagazine.org/applications-for-writing-markdown/ +[6]: https://fedoramagazine.org/wp-content/uploads/2020/05/ghostwriter-1024x640.jpg +[7]: https://fedoramagazine.org/wp-content/uploads/2020/05/ghostwriter-menu-1024x640.jpg +[8]: https://fedoramagazine.org/wp-content/uploads/2020/05/ghostwriter-export-1024x640.jpg +[9]: https://fedoramagazine.org/wp-content/uploads/2020/05/calibre-pre-1024x640.jpg +[10]: https://calibre-ebook.com/ +[11]: https://fedoramagazine.org/wp-content/uploads/2020/05/calibre-metadata-1024x640.jpg +[12]: https://fedoramagazine.org/wp-content/uploads/2020/05/calibre-lookandfeel-1024x640.jpg +[13]: https://fedoramagazine.org/wp-content/uploads/2020/05/calibre-toc2-1024x640.jpg +[14]: https://fedoramagazine.org/wp-content/uploads/2020/05/calibre-epub-output-1024x640.jpg +[15]: https://fedoramagazine.org/wp-content/uploads/2020/05/calibre-post-1024x640.jpg diff --git a/published/202006/20200604 Now You Can Buy Linux Certified Lenovo ThinkPad and ThinkStation (for the Best Possible Out of The Box Linux Experience).md b/published/202006/20200604 Now You Can Buy Linux Certified Lenovo ThinkPad and ThinkStation (for the Best Possible Out of The Box Linux Experience).md new file mode 100644 index 0000000000..7fed915dff --- /dev/null +++ b/published/202006/20200604 Now You Can Buy Linux Certified Lenovo ThinkPad and ThinkStation (for the Best Possible Out of The Box Linux Experience).md @@ -0,0 +1,89 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12283-1.html) +[#]: subject: (Now You Can Buy Linux Certified Lenovo ThinkPad and ThinkStation (for the Best Possible Out of The Box Linux Experience)) +[#]: via: (https://itsfoss.com/lenovo-linux-certified/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +现在你可以购买通过 Linux 认证的联想 ThinkPad 和 ThinkStation +====== + +曾经有一段时间,[ThinkPad][1] 是 Linux 用户的首选系统。但那是在 ThinkPad 还是 [IBM][2] 的产品的时候。当[联想在 2005 年收购了 IBM 的个人电脑业务][3]之后,(我觉得)事情开始发生了变化。 + +ThinkPad 曾经是一个令人惊叹的系列笔记本电脑,稳定可靠、值得信赖、坚如磐石,你只要问问 2010 年代以前用过它的人就知道了。 + +但在 2010 年前后,联想 ThinkPad 开始失去了它的魅力。它充满了一个又一个的问题,消费者们抱怨性能不佳。 + +而对于 Linux 用户来说,情况就更糟糕了。它的安全启动与 UEFI [给 Linux 用户带来了问题][4]。[与 Linux 的争论][5]就这样没完没了。 + +我为什么要回忆起这些?因为联想似乎正在努力提高 Linux 的兼容性。对于 Linux 爱好者来说,联想的最新公告是一个极好的消息。 + +### 联想 ThinkPad 和 ThinkStation 全系产品将通过 Linux 认证 + +![][6] + +联想[宣布][7],将对**全部工作站产品进行 Ubuntu 和红帽等顶级 Linux 发行版的认证**,这包括所有机型和配置。 + +作为 Linux 用户,这对你来说意味着什么?它意味着,如果你购买了联想电脑,你将获得**最好的开箱即用的 Linux 体验**。 + +等一下?不是可以随便在任何电脑上安装 Linux 吗,不管是联想还是幻想?当然,你可以。但是,当你把现有的(Windows)操作系统清除掉,自己安装 Linux 时,你可能会遇到硬件兼容性的问题,如没有声音、Wi-Fi 无法工作等。 + +开箱即用的体验很重要,因为并不是每个人都愿意花时间去修复声音、显卡、Wi-Fi 和蓝牙等问题,而不是专注于自己的实际工作,因为他们买电脑的目的就是为了这个。 + +来自 [Ubuntu][8] 和 Red Hat 的开发人员会对联想系统的每一个硬件组件进行测试和验证,以确保联想系统的每一个硬件组件都能正常工作。 + +### Ubuntu、Red Hat 以及更多 + +![][9] + +为此,联想选择了两款顶级 Linux 发行版。Red Hat 是企业级 Linux 桌面和服务器的热门选择。而 Ubuntu 当然是普遍流行的。 + +这意味着,联想的计算机在使用 Ubuntu LTS 版本和 Red Hat Linux 时,会以最佳状态工作。联想甚至会在其中预装 Ubuntu 和 Red Hat 两种版本的系统。 + +但是,这还没有结束。Fedora 是 Red Hat 的一个社区项目,联想也会在 ThinkPad P53 和 P1 Gen 2 系统上预装 Fedora。 + +有很多基于 Ubuntu LTS 版本的 Linux 发行版。大多数情况下,这些发行版在外观、应用和其他图形化的东西上都不一样,但它们使用的是与 Ubuntu 相同的基础。 + +这应该意味着,基于 Ubuntu 的发行版,如 Linux Mint、Elementary OS 等也会与联想的设备有更好的硬件兼容性。 + +联想还将这些设备驱动直接发送给上游的 Linux 内核中,帮助它们的系统在整个生命周期内都保持稳定性和兼容性。这一点是非常棒的。 + +### 它能帮助增加 Linux 用户群吗? + +开箱即用的体验很重要。它可以让你专注于系统上应该做的重要任务,而不是故障排除。 + +我有一台[预装了 Ubuntu 的戴尔 XPS 笔记本][10]。这是唯一一台几乎不需要从我这一端进行硬件故障排除的设备,即使我手动安装了其它基于 Ubuntu 的发行版,也不需要进行硬件故障排除。 + +我很高兴看到联想为提高 Linux 的兼容性做出了更多努力。现在在[预装 Linux 的电脑列表][11]中有了更多的选择。 + +我不知道联想在其计算机产品中提供 Linux 是否有助于增加 Linux 用户群。大多数时候人们都会要 Windows,Linux 不会成为首要关注点。 + +但联想在设备上让自己的计算机产品更多的使用 Linux,这一点还是值得称赞的。我希望其他厂商也能这样做。希望没有什么坏处:) + + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/lenovo-linux-certified/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/ThinkPad +[2]: https://www.ibm.com/ +[3]: https://in.pcmag.com/laptops/38093/10-years-later-looking-back-at-the-ibm-lenovo-pc-deal +[4]: https://www.phoronix.com/scan.php?page=news_item&px=mtiyotg +[5]: https://www.engadget.com/2016-09-21-lenovo-pc-linux-trouble.html +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/lenevo-linux-certified-systems.jpg?ssl=1 +[7]: https://news.lenovo.com/pressroom/press-releases/lenovo-brings-linux-certification-to-thinkpad-and-thinkstation-workstation-portfolio-easing-deployment-for-developers-data-scientists/ +[8]: https://ubuntu.com/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/thinkpad-ubuntu.jpg?resize=800%2C582&ssl=1 +[10]: https://itsfoss.com/dell-xps-13-ubuntu-review/ +[11]: https://itsfoss.com/get-linux-laptops/ diff --git a/published/202006/20200604 Using AppImage for Linux package management.md b/published/202006/20200604 Using AppImage for Linux package management.md new file mode 100644 index 0000000000..ea7908af31 --- /dev/null +++ b/published/202006/20200604 Using AppImage for Linux package management.md @@ -0,0 +1,100 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12317-1.html) +[#]: subject: (Using AppImage for Linux package management) +[#]: via: (https://opensource.com/article/20/6/appimages) +[#]: author: (David Clinton https://opensource.com/users/dbclinton) + +使用 AppImage 进行 Linux 软件包管理 +====== + +> AppImage 在自足的环境中分发应用, 它适用于任何 Linux 发行版。 + +![](https://img.linux.net.cn/data/attachment/album/202006/15/140050aazux37axew7e0xk.jpg) + +管理 Linux 机器(尤其是远程机器)的一个重要分就是管理和安装软件。当本地应用程序出现问题时,或者文件系统上的某些文件损坏需要修复时,你通常会希望推送更新,而不必走很多路坐在物理屏幕前。正如我在 Pluralsight 课程《[Linux 系统维护和故障排除][2]》中所解释的那样,许多问题当然可以通过 Bash 脚本解决,但是仍有很多情况下,除了老式的二进制文件外,没有其他选择。 + +想象一下,你的某些远程系统需要安装新的应用程序,这样使用这些计算机的团队成员就能够执行某些业务。能够利用 Debian 或 RPM 之类的主要 Linux 仓库系统的集成和自动化,可以使你的管理任务变得更加容易。 + +正如 Linus Torvalds 永不厌倦地提醒我们的那样,太多的 Linux 软件管理系统的问题是 [Linux 软件管理系统太多了][3]。多年来,应用开发甚至是 Linux 的采用都变得愈加复杂起来,因为你为了提供你的软件(比如,放到 Debian 仓库)而投入的所有时间和工作,对于你想让它们进入 RPM 系统并没有什么帮助,对于 SUSE 的 Zypper 管理器也一样,没有什么帮助。 + +解决软件孤岛问题的一种有前途的方案是分发具有自足环境的应用,它们可以在任何 Linux 发行版上运行。在这个年轻且不断发展的领域中,选择之一是 [AppImage][4]。 + +### 使用 AppImage + +我全面投入到了 AppImage。就像我提到的其他软件包管理系统一样,如果你需要的话,有很多复杂的功能可以使用。但是,从本质上讲,AppImage 非常简单。AppImage 不像大多数其他包管理器一样通过仓库工作,它使用单个、独立的文件,可以直接发送或通过网站共享。 + +下面是个展示它的美妙之处的例子。当我在用 AppImage 时,我在一个技术论坛上看到了一个很老的讨论,它让我找到了一个同样久远且废弃的 GitHub 项目以及相关的 YAML 和配方文件。它们旨在自动构建准备生成 AppImage 包所需的相当复杂的基础架构。尽管该基础架构全部是在 5 年前的 Ubuntu 版本上构建的,但是当我将它们放在一起并运行 `appimagetool` 命令时,它创建了一个 AppImage 文件,它可在我当前的桌面上无缝运行。我不认为有很多有五年历史的 GitHub 复杂项目可以使用其他技术运行,而无需认真重做。 + +但是这里我我不会介绍这个案例。相反,我将用一个简单的 Hello World 程序向你展示它是如何工作的。首先,请确保本地已安装 AppStream 包。 + +对于基于 Debian 的系统,运行: + +``` +$ sudo apt install appstream +``` + +对于 RPM 系统,请使用: + +``` +$ sudo dnf install appstream +``` + +克隆[这篇文章][5]中提及的 Git 仓库,我会基于它示例: + +``` +$ git clone +$ cd appimage-resources +$ ls hello-world-appimage +``` + +接下来,使用 `cd` 进入 Git 新创建的目录。这里有两个目录。请使用 `hello-world-appimage`。另一个是更复杂的项目,你也应该考虑尝试一下。 + +Linux GUI 系统会读取 `helloworld.desktop` 文件来知道如何呈现桌面图标。事实证明,当前的这个文件会在以后给你带来点麻烦,因此请进行一些小修改:添加 `Categories=` 这行并为其赋予值 `GNOME`。不要忘记最后的分号: + + +``` +$ nano hello-world-appimage/helloworld.desktop +        add Categories=GNOME; +``` + +从 [AppImage GitHub 项目][6]下载 `appimagetool` 预编译的二进制文件。访问 GitHub 的原因之一:那里有很多出色的文档和资源。下载二进制文件后,使文件可执行,并将 `hello-world-appimage` 目录传给它。但是首先,你需要告诉它你想要的架构。由于某些原因,一个名字以 x86\_64 结尾的工具都不能自行确定是否该使用 x86\_64 来构建应用程序(我不知道这是怎么回事)。 + +``` +$ wget +$ chmod +x appimagetool-x86_64.AppImage +$ ARCH=x86_64 ./appimagetool-x86_64.AppImage hello-world-appimage +``` + +如果你没有看到任何错误消息,那么表示完成了,请运行: + +``` +$ ls +$ ./hello-world-appimage-x86_64.AppImage +``` + +### 总结 + +AppImage 是软件包管理的非常有效的选择。当你探索它时,我想你会发现它是 Linux 发行版默认软件包系统的很好的替代品。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/appimages + +作者:[David Clinton][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/dbclinton +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_gift_giveaway_box_520x292.png?itok=w1YQhNH1 (Gift box opens with colors coming out) +[2]: https://pluralsight.pxf.io/VMKQj +[3]: https://itsfoss.com/desktop-linux-torvalds/ +[4]: https://appimage.org/ +[5]: https://www.booleanworld.com/creating-linux-apps-run-anywhere-appimage/ +[6]: https://github.com/AppImage/AppImageKit/releases diff --git a/published/202006/20200607 5 ways to boost your Kubernetes knowledge.md b/published/202006/20200607 5 ways to boost your Kubernetes knowledge.md new file mode 100644 index 0000000000..8912c4aa92 --- /dev/null +++ b/published/202006/20200607 5 ways to boost your Kubernetes knowledge.md @@ -0,0 +1,89 @@ +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12320-1.html" +[#]: subject: "5 ways to boost your Kubernetes knowledge" +[#]: via: "https://opensource.com/article/20/6/kubernetes-anniversary" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" + +提升你 Kubernetes 技能的 5 种方式 +====== + +> 值此周年纪念之际,来通过这些深度文章和实践项目了解下 Kubernetes。 + +![](https://img.linux.net.cn/data/attachment/album/202006/16/191023lqq0d5zv5vggr2vg.png) + +在云原生的成长期,开发者们发现在一个小型的、原子化的、精简的 Linux 镜像里编写应用程序很方便,这些镜像与它们所运行的服务器共享资源。从技术上讲,这些基于内核命名空间的小环境定义被称为[容器][2]。随着容器的激增,系统管理员们很快意识到,开发一个不仅能帮助他们管理容器,还能帮助他们管理下面的虚拟化基础设施的工具变得至关重要。于是,[Kubernetes][3] 应运而生。 + +Kubernetes 是一个可扩展开源平台,用于管理容器。它可以帮助管理员和开发者们围绕容器管理工作负载、服务和进程。它促进了声明式配置,更容易实现自动化。在它相对较短的生命周期中,它已经催生了一个迅速成长的生态系统,其中包括来自大量公司和项目的服务、支持和工具。 + +如果你想对这项重要的云技术有更多的了解,这里有一些能帮忙你更深入学习的文章。还有 5 个项目可以帮你把学到的东西付诸实践。 + +### 遏制容器乱象 + +2016 年,我们发布了《[使用 Kubernetes 遏制容器乱象][4]》,这是一篇由 Terry Ryan 写的关于 Kubernetes 的介绍性文章,讲述了 Kubernetes 如何帮助管理员和架构师们努力应对容器。如果你想找一篇从底层介绍容器是做什么的以及 Kubernetes 是如何实现容器管理的,那么你应该先读下本文。本文适合零基础的读者,解释了所有重要的概念,因此你能迅速了解相关技术。 + +如果想进阶了解内核层面发生的一些神奇的事情,请阅读 Jessica Cherry 对 [Kubernetes 命名空间][5]的解释。 + +延伸阅读: + +- [一文了解 Kubernetes 是什么?](https://linux.cn/article-8800-1.html) +- [Kubernetes 是什么?](https://linux.cn/article-8858-1.html) + +### Kubernetes:为什么它很重要? + +Kubernetes 提供了基础设施即服务Infrastructure-as-a-Service(IaaS)解决方案(类似 OpenStack)的便利和一个完整的平台即服务Platform as a Service(PaaS)。它为你提供了管理基础设施的抽象能力,以及在裸金属基础层面进行故障排除所需的工具。如果你执着于使用单一的裸金属服务器,你可能需要阅读下 Tim Potter 写的《[你为什么需要 Kubernetes][6]》。他的文章对比了 IaaS 和 PaaS,解释了为什么 Kubernetes 如此广泛地被使用。你可能并不是一定需要 Kubernetes 或容器,但是重要的是知道什么情况下需要。 + +延伸阅读: + +- [使用 Kubernetes 的 5 个理由](https://linux.cn/article-10973-1.html) +- [你(多半)不需要 Kubernetes](https://linux.cn/article-10469-1.html) + +### 在树莓派上运行 Kubernetes + +熟悉 Kubernetes 的最好方法莫过于自己运行它。不幸的是,不是每个人都有一个云服务基层设施(或者有足够的钱来租用一个)可供其支配。而幸运的是,Chris Collins 提供了《[在树莓派上运行 Kubernetes][7]》的教程。结合他的另外几篇关于《[Cloud-init][8]》和《[Cloud-init 服务][9]》的教程(也是在树莓派上运行),你可以搭建任何你想要的家庭实验室,这样你就可以学习如何管理属于自己的开放混合云。 + +### Kubernetes 命令 + +一旦你运行起 Kubernetes 后,可以看看 Jessica Cherry 的文章和附带的备忘清单,这个清单列出了所有的[基本的 Kubernetes 命令][10]。在她的文章中,她解释了 `kubectl` 命令的语法,简单讲述了每个命令和子命令是用来做什么的。 + +### 有趣的 Kubernetes 项目 + +没有什么比拥有技术却不知道该怎么用它更令人沮丧的了。例如,在你的办公桌上有一个树莓派是一回事,但是决定它的 CPU 应该用来做什么工作却完全是另一回事。我们发布了很多教程,来指导你完成你的 Kubernetes 之路的探索: + + * [Helm][11] 是一个 Kubernetes 的包管理器。你可以在它的帮助下,很快熟悉 Kubernetes 环境。 + * 学习下 [Operator SDK][12] 的所有内容,来熟悉 Kubernetes 的对象和操作器。 + * [在 Kubernetes 之上搭建网络文件系统(NFS)][13] + * 学习如何使用 [Skipper][14] 或 [Traefik][15] 进行流量调度。 + +最重要的,花点时间来熟悉容器和 Kubernetes。不论你先把容器化的应用放到服务器、云上还是桌面,它们都是能帮助你理解的重要的范例,因为它们是一个强大的构造,可以让 Linux 的应用变得更好、更健壮、鲁棒性更好、更简单。一定要投入精力去学习它们,你不会后悔的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/kubernetes-anniversary + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[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/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek "Ship captain sailing the Kubernetes seas" +[2]: https://opensource.com/article/18/11/behind-scenes-linux-containers +[3]: https://opensource.com/resources/what-is-kubernetes +[4]: https://opensource.com/life/16/9/containing-container-chaos-kubernetes +[5]: https://linux.cn/article-11749-1.html +[6]: https://linux.cn/article-8902-1.html +[7]: https://linux.cn/article-8499-1.html +[8]: https://opensource.com/article/20/5/cloud-init-raspberry-pi-homelab +[9]: https://opensource.com/article/20/5/create-simple-cloud-init-service-your-homelab +[10]: https://opensource.com/article/20/5/kubectl-cheat-sheet +[11]: https://linux.cn/article-12007-1.html +[12]: https://opensource.com/article/20/3/kubernetes-operator-sdk +[13]: https://opensource.com/article/20/6/kubernetes-nfs-client-provisioning +[14]: https://opensource.com/article/20/4/http-kubernetes-skipper +[15]: https://opensource.com/article/20/3/kubernetes-traefik diff --git a/published/202006/20200609 Style your data plots in Python with Pygal.md b/published/202006/20200609 Style your data plots in Python with Pygal.md new file mode 100644 index 0000000000..89fc30a3a1 --- /dev/null +++ b/published/202006/20200609 Style your data plots in Python with Pygal.md @@ -0,0 +1,119 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12364-1.html) +[#]: subject: (Style your data plots in Python with Pygal) +[#]: via: (https://opensource.com/article/20/6/pygal-python) +[#]: author: (Shaun Taylor-Morgan https://opensource.com/users/shaun-taylor-morgan) + +使用 Pygal 在 Python 中设置数据图的样式 +====== + +> 介绍一种更时尚的 Python 绘图库。 + +![](https://img.linux.net.cn/data/attachment/album/202006/30/120650hlf8lm0em3l1m8zd.jpg) + +[Python][2] 有很多可以将数据可视化的库。其中一个互动性较强的库是 Pygal,我认为这个库适合喜欢漂亮事物的人。它可以生成用户可以与之交互的漂亮的 SVG(可缩放矢量图形)文件。SVG 是交互式图形的标准格式,仅使用几行 Python 就可以带来丰富的用户体验。 + +### 使用 Pygal 进行时尚的 Python 绘图 + +在本文中,我们要重新创建多柱状图,用来表示 1966 年至 2020 年英国大选的结果: + +![Pygal plot][3] + +在继续之前,请注意你可能需要调整 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') +``` + +现在我们可以继续进行了。。数据如下所示: + +``` +        year  conservative  labour  liberal  others +0       1966           253     364       12       1 +1       1970           330     287        6       7 +2   Feb 1974           297     301       14      18 +..       ...           ...     ...      ...     ... +12      2015           330     232        8      80 +13      2017           317     262       12      59 +14      2019           365     202       11      72 +``` + +在 Pygal 中进行绘制会以一种易于阅读的方式显示。首先,我们以一种简化柱状图定义的方式定义样式对象。然后我们将自定义样式以及其他元数据传递给 `Bar` 对象: + +``` +import pygal +from pygal.style import Style + +custom_style = Style( + colors=('#0343df', '#e50000', '#ffff14', '#929591'), + font_family='Roboto,Helvetica,Arial,sans-serif', + background='transparent', + label_font_size=14, +) + +c = pygal.Bar( + title="UK Election Results", + style=custom_style, + y_title='Seats', + width=1200, + x_label_rotation=270, +) +``` + +然后,我们将数据添加到 `Bar` 对象中: + +``` +c.add('Conservative', df['conservative']) +c.add('Labour', df['labour']) +c.add('Liberal', df['liberal']) +c.add('Others', df['others']) + +c.x_labels = df['year'] +``` + +最后,我们将图另存为 SVG 文件: + +``` +c.render_to_file('pygal.svg') +``` + +结果是一个交互式 SVG 图,你可以在此 gif 中看到: + +![The Python pygal library can generate rich SVG files as seen here][7] + +精美简单,并且效果漂亮。 + +### 总结 + +Python 中的某些绘图工具需要非常详细地构建每个对象,而 Pygal 从一开始就为你提供这些。如果你手边有数据并且想做一个干净、漂亮、简单的交互式图表,请尝试一下 Pygal。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/pygal-python + +作者:[Shaun Taylor-Morgan][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/shaun-taylor-morgan +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_python.jpg?itok=G04cSvp_ (Python in a coffee cup.) +[2]: https://opensource.com/article/20/4/plot-data-python +[3]: https://opensource.com/sites/default/files/uploads/pygal_1.png (Pygal plot) +[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/sites/default/files/uploads/pygal-interactive_3.gif (The Python pygal library can generate rich SVG files as seen here) +[8]: https://anvil.works/blog/plotting-in-pygal diff --git a/published/202006/20200610 5 ways to examine the content of files on Linux.md b/published/202006/20200610 5 ways to examine the content of files on Linux.md new file mode 100644 index 0000000000..90f1db340d --- /dev/null +++ b/published/202006/20200610 5 ways to examine the content of files on Linux.md @@ -0,0 +1,241 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12340-1.html) +[#]: subject: (5 ways to examine the content of files on Linux) +[#]: via: (https://www.networkworld.com/article/3561490/5-ways-to-examine-the-content-of-files-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +在 Linux 上查看文件内容的 5 种方法 +====== + +> 如何使用 cat、more、head 和 tail 命令查看 Linux 文件的内容,而不仅仅是文本文件。 + +![](https://img.linux.net.cn/data/attachment/album/202006/23/121047zz9gwx9dwz155m2w.jpg) + +Linux 提供了许多命令来查看文件的内容,包 括 `cat`、`more`、`head` 和 `tail`,但这只是一个开始。 + +一方面,即使是最显而易见的命令也有很多许多用户不会去使用的选项。还有一些普普通通的命令提供了一些独特的功能。在本文中,我们将介绍查看文件内容的命令,以及如何定制这些视图以更好地满足你的需求的选项。 + +### cat + +`cat` 命令将文本文件的全部内容发送到终端窗口以供查看。实际上,如果你输入 `cat`,然后输入包含数千行内容的文件名,那么这些行将以极快的速度在你的窗口中滚动,你将无法看到除了最后一屏外的其他文本。对于 Linux 用户来说 `cat` 命令很熟悉,但即使是这个基本命令也提供了许多有用的选项,例如对输出中的行进行编号,这是我们许多人可能从未使用过的。更进一步,你不仅可以对行进行编号,还可以选择如何编号。 + +对每行进行编号就像这样: + +``` +$ cat -n msg + 1 Hello -- + 2 + 3 I hope you are having a wonderful day! + 4 + 5 + 6 That's it for ... now + 7 + 8 bye! + 9 + 10 s. +``` + +你也可以只对有内容的行编号。请注意,对于此命令,仅包含空格的行不被视为“空”,而是会被编号。 + +``` +$ cat -b msg + 1 Hello -- + + 2 I hope you are having a wonderful day! + + + 3 That's it for ... now + + 4 bye! + + 5 s. +``` + +`cat` 命令允许你使用 `-s` 选项忽略重复的空白行,但是要完全忽略空白行你必须添加另一个命令。 + +``` +$ cat -s msg +Hello -- + +I hope you are having a wonderful day! + +That's it for ... now + +bye! + +s. +``` + +要忽略所有空白行,只需如下将 `cat` 的输出通过管道传递给 `grep` 命令。 点(`.`)匹配包含任意字符的文本,因此它将显示任意非空的行,用于结束一行的回车换行做匹配(LCTT 译注:此处原文有误,径改)。 + +``` +$ cat msg | grep . +Hello -- +I hope you are having a wonderful day! +That's it for ... now +bye! +s. +``` + +`-E` 选项通过在每行末尾加 `$` 符提供视觉提示,来显示行尾是否还有多余的空格。 + +``` +$ cat -E msg +Hello --$ +$ +I hope you are having a wonderful day! $ +$ +$ +That's it for ... now$ +$ +bye!$ +$ +s.$ +``` + +使用 `-A` 时,既可以在每行的末尾显示 `$` 字符,并且制表符会显示为 `^I` 而不是空白。 + +``` +$ cat -A msg +Hello --$ +$ +I hope you are having a wonderful day!$ +$ +$ +That’s it for ...^Inow$ +$ +bye!$ +$ +s.$ +``` + +### 使用 head 和 tail 显示文件部分内容 + +`head` 和 `tail` 显示文件的头部或尾部,默认为十行。 你可以使用 `-3`(显示 3 行)或 `-11`(显示 11 行)之类的字符串来指定要查看的其它行数。`tail` 命令与 `head` 的工作方式相同,但是显示文件的尾部而不是头部。 + +``` +$ head -3 msg +Hello -- +I hope you are having a wonderful day! +$ tail -3 msg +bye! + +s. +``` + +你还可以结合使用 `head` 和 `tail` 命令来查看文件中间的文本。你只需要选择起点和想要查看行数即可。在此例中,命令将在文件中显示第二个一百行,并在 `cat` 的帮助下为这些行编号。 + +``` +$ cat -b mybigfile | head -200 | tail -100 + 101 Invoice #2020-06-07a sent to vendor + ... +``` + +### 使用 more 或者 less 浏览一屏文本 + +`more` 命令是一次浏览一屏内容的自然之选,而 `less` 通过使用上下键盘箭头增加了在文件中上下移动的能力,这样你就可以遍历内容,然后在文件中回退。 + +### 使用 od 查看文本的两种方法 + +`od`(八进制转储)命令能够以常规文本和一系列 ASCII 值(即该文本在文件中的实际编码方式)的形式查看文件。在下面的例子中可以看到,带编号的行显示了 ASCII 数字值,而其他行则显示了文本和不可打印的字符。 + +``` +$ od -bc msg +0000000 110 145 154 154 157 040 055 055 012 012 111 040 150 157 160 145 + H e l l o - - \n \n I h o p e +0000020 040 171 157 165 040 141 162 145 040 150 141 166 151 156 147 040 + y o u a r e h a v i n g +0000040 141 040 167 157 156 144 145 162 146 165 154 040 144 141 171 041 + a w o n d e r f u l d a y ! +0000060 012 012 012 124 150 141 164 047 163 040 151 164 040 146 157 162 + \n \n \n T h a t ' s i t f o r +0000100 040 056 056 056 011 156 157 167 012 012 142 171 145 041 012 012 + . . . \t n o w \n \n b y e ! \n \n +0000120 163 056 012 + s . \n +``` + +请注意,换行符显示为 `\n`(八进制 `012`),而制表符显示为 `\t`(八进制 `011`)。 + +`od` 命令特别有用的用途之一是查看非文本文件以获取可以标识文件类型的信息。在这里,我们看到 `JFIF`(JPEG 文件交换格式)标签,该标签让 `file` 之类报告文件类型的命令将它标示为 jpg 文件。这里还有很多其他有用的信息,特别是如果你对这些文件的格式感到好奇的话。 + +在接下来的命令中,我们查看 jpg 文件的开始部分。 + +``` +$ od -bc arrow.jpg | head -12 +0000000 377 330 377 340 000 020 112 106 111 106 000 001 001 000 000 001 + 377 330 377 340 \0 020 J F I F \0 001 001 \0 \0 001 +0000020 000 001 000 000 377 333 000 103 000 003 002 002 002 002 002 003 + \0 001 \0 \0 377 333 \0 C \0 003 002 002 002 002 002 003 +0000040 002 002 002 003 003 003 003 004 006 004 004 004 004 004 010 006 + 002 002 002 003 003 003 003 004 006 004 004 004 004 004 \b 006 +0000060 006 005 006 011 010 012 012 011 010 011 011 012 014 017 014 012 + 006 005 006 \t \b \n \n \t \b \t \t \n \f 017 \f \n +0000100 013 016 013 011 011 015 021 015 016 017 020 020 021 020 012 014 + \v 016 \v \t \t \r 021 \r 016 017 020 020 021 020 \n \f +0000120 022 023 022 020 023 017 020 020 020 377 333 000 103 001 003 003 + 022 023 022 020 023 017 020 020 020 377 333 \0 C 001 003 003 +``` + +如果我们要 `file` 命令提供有关此图像的信息,我们可能会看到类似下面这样的信息。`file` 命令从文件开头的数据中提取了所有这些描述性信息: + +``` +$ file arrow.jpg +arrow.png: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 500x375, components 3 +``` + +### 使用 jp2a 将文件视为基于文本的图像 + +如果你只能在命令行工作,并且想了解特定图像包含的内容,那么可以使用 `jp2a`(jpeg to ascii)之类的工具提供字符渲染。图像在这种格式下的识别程度取决于文件。不要有太多期待,因为你将看到的图像版本是“低分辨率”下的测试!这是一只分辨率很低的帝王企鹅。(请离远点看) + +``` +$ jp2a Emperor_Penguin.jpg +MMMMMMMMWOdkNMMMMMMMMMMMMMMMMMMM +MMMXK0kc.... ,OKMMMMMMMMMMMMMMMM +MMNK0Ol... :Xx'dNMMMMMMMMMMMMM +MMMMMMMd;lx00Oo. ..xMMMMMMMMMMMM +MMMMMMK.OXMMMMMN,...lMMMMMMMMMMM +MMMMMMx'KXNNMMMMK....0MMMMMMMMMM +MMMMMMx:kkKNWWMMMl.. 'NMMMMMMMMM +MMMMMMddx0NNNWMMMK'...;NMMMMMMMM +MMMMMMck0NNWWWWWMMd ..lMMMMMMMM +MMMMMM.d0KXNWWWWMMo ...WMMMMMMM +MMMMMM.xOXNNWNMMMW. ....KMMMMMMM +MMMMMM'kKNKWXWMMMK ..'.0MMMMMMM +MMMMMMxckXNNNNMMMX .:..XMMMMMMM +MMMMMMW;xKNWWWMMMM. .;. NMMMMMMM +MMMMMMMok0NNWNWMMMx .l..MMMMMMMM +MMMMMMMkxOKXWXNMMMMl.:'dMMMMMMMM +MMMMMMM0dKOdKXXNMMMMNx,WMMMMMMMM +MMMMMMMWoKxldXKNNMMMMM;MMMMMMMMM +MMMMMMMMxxxxdNWNXNMMMM;MMMMMMMMM +MMMMMMMMxOcoo0XOOOOWMW,kMMMMMMMM +MMMMMMM0xK;.cO0dNX:0XXd;NMMMMMMM +MMMNkdd:,'ldXXO0xl;x0kx:;lKMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +``` + +### 总结 + +Linux 上有很多命令可以通过各种方式查看文件的内容。其中一些选项在你需要处理文件内容时可能会非常有用。其它的只是……有趣。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3561490/5-ways-to-examine-the-content-of-files-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://unsplash.com/photos/q65bNe9fW-w +[2]: https://creativecommons.org/publicdomain/zero/1.0/ +[3]: https://www.facebook.com/NetworkWorld/ +[4]: https://www.linkedin.com/company/network-world diff --git a/published/202006/20200610 How to Change Folder Color in Ubuntu 20.04.md b/published/202006/20200610 How to Change Folder Color in Ubuntu 20.04.md new file mode 100644 index 0000000000..42f0043ab2 --- /dev/null +++ b/published/202006/20200610 How to Change Folder Color in Ubuntu 20.04.md @@ -0,0 +1,126 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12311-1.html) +[#]: subject: (How to Change Folder Color in Ubuntu 20.04) +[#]: via: (https://itsfoss.com/folder-color-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Ubuntu 20.04 中更改文件夹颜色 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/13/133146y1bjzb73jj141143.jpg) + +[Ubuntu 20.04][1] 中默认的 Yaru 主题赋予它优美、现代的外观。默认 Yaru 主题中的文件夹是紫色的外观,以与 Ubuntu 的品牌保持一致。 + +如果你不喜欢紫色,可以在 Ubuntu 中自由更改颜色主题。你可以更改 Ubuntu 的主题以使其有不同的颜色,但这将意味着放弃 Yaru 主题。 + +如果你只想在 Ubuntu 20.04 中更改文件夹的颜色,可以有两种方法: + +* 为选定的文件夹赋予不同的颜色和标志(以便更好地组织文件和文件夹) +* 通过更改 Yaru 颜色主题来更改所有文件夹的颜色 + +让我向你展示两种方法。 + +### 更改所选文件和文件夹的颜色和标志 + +![][2] + +我知道有些人将他们的文件夹使用不同的颜色或放在不同的位置,来表示工作正在进行中还是待处理或已完成。 + +如果你也是这样的,那么可以使用 [Folder Color 工具][3]更改文件夹的颜色。你还可以在文件夹中添加标志(绿色的勾号表示完成,加号表示新的,感叹号表示重要等)。你可以在上一张图片中看到一些例子。 + +你还可以在文件上使用 “Folder Color” 工具。你不能更改文件图标的颜色,但可以添加标志。 + +如果你在 Ubuntu 20.04 中[使用 Yaru 主题][4],你可以使用[官方 PPA][5]: + +``` +sudo add-apt-repository ppa:costales/yaru-colors-folder-color +``` + +现在,使用 Yaru 兼容包安装 Folder Color。 + +``` +sudo apt install folder-color yaru-colors-folder-color +``` + +安装后,你必须使用 `nautilus -q` 命令重启 Nautilus 文件管理器。之后,你可以进入文件管理器,右键单击文件夹或文件。你会在上下文菜单中看到 Folder Color 的选项。你将在此处看到颜色和标志选项。 + +![][6] + +你还可以通过在菜单**通过选择“默认”恢复原始文件夹颜色**。 + +对于 Ubuntu 18.04 或更早版本,可以从软件中心安装 Folder Color。它还可用于 Linux Mint/Cinnamon 桌面的 Nemo 文件管理器和 MATE 桌面的 [Caja 文件管理器][7]。 + +#### 如何删除 Folder Color? + +如果你不想使用 Folder Color,你可以删除应用并删除 PPA。首先删除该应用: + +``` +sudo apt remove folder-color yaru-colors-folder-color +``` + +现在[删除 PPA][8]: + +``` +sudo add-apt-repository -r ppa:costales/yaru-colors-folder-color +``` + +### Yaru Colors 主题包更改 Yaru 主题颜色 + +![Yaru Colors Blue Theme Variant][9] + +如果你想继续使用 Yaru 主题但使用不同的颜色,那么需要[Yaru Colors 主题包][10]。 + +Yaru Colors 由 12 种 Yaru 颜色变体组成。它们浅绿色、蓝色、棕色、深蓝色、绿色、灰色、MATE 绿、橙色、粉红色、紫色、红色和黄色。 + +主题包括 GTK 主题、图标、光标和 GNOME Shell 主题。 + + * 图标:更改文件夹的强调色 + * GTK 主题:更改应用窗口的强调色 + * 光标主题:向光标添加几乎可以忽略的色彩轮廓 + * GNOME Shell 主题:更改消息托盘和系统托盘中的强调色 + +你可以从它的 GitHub 仓库下载 Yaru Colors 主题包: + +#### 下载 Yaru Colors 主题包 + +在提取内容时,你会发现图标、主题文件夹,这两个文件夹都包含上述十二种颜色。你可以分别在 `~/.local/share/.icons` 和 `~/.local/share/themes` 文件夹中复制图标和主题文件夹。 + +如果你不想亲自复制,那么你可以在解压文件夹中找到 `install.sh` 脚本。你可以运行它来通过交互式终端会话安装全部或选定的几个主题。 + +![][11] + +要更改 GNOME Shell 主题,你必须[使用 GNOME Tweak 工具][12]。你也可以使用 GNOME Tweak 将图标和主题更改回默认。 + +![][13] + +享受为你的 Ubuntu 生活增色 :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/folder-color-ubuntu/ + +作者:[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/download-ubuntu-20-04/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/folder-colors-yaru-ubuntu.png?ssl=1 +[3]: https://foldercolor.tuxfamily.org/ +[4]: https://itsfoss.com/ubuntu-community-theme/ +[5]: https://launchpad.net/folder-color +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/change-folder-color-ubuntu.png?ssl=1 +[7]: https://github.com/mate-desktop/caja +[8]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/yaru-colors-blue-theme-variant.jpg?ssl=1 +[10]: https://github.com/Jannomag/Yaru-Colors +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/yaru-colors-theme-install.png?resize=800%2C513&ssl=1 +[12]: https://itsfoss.com/gnome-tweak-tool/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/restore-yaru-gnome-tweak.png?resize=800%2C557&ssl=1 diff --git a/published/202006/20200610 How to write functions in Bash.md b/published/202006/20200610 How to write functions in Bash.md new file mode 100644 index 0000000000..1df7f0efc2 --- /dev/null +++ b/published/202006/20200610 How to write functions in Bash.md @@ -0,0 +1,103 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12323-1.html) +[#]: subject: (How to write functions in Bash) +[#]: via: (https://opensource.com/article/20/6/bash-functions) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +如何在 Bash 中编写函数 +====== + +> 通过编写函数来减少代码的冗余和维护。 + +![](https://img.linux.net.cn/data/attachment/album/202006/17/125913hf1efce5c48cebrc.jpg) + +在编程时,实际上是在定义要由计算机执行的过程procedure例程routine。一个简单的类比是将计算机编程与烤面包进行比较:你一次列出了要组建工作环境的配料,然后列出了烤面包所必须采取的步骤。在编程和烘烤中,必须以不同的间隔重复执行某些步骤。例如,在烤面包中,这可能是酵母培养的过程: + +``` +STIR=100 +SNOOZE=86400 + +function feed_culture { +  remove_from(pantry) +  add(flour, water) +  stir($STIR) +  sleep($SNOOZE) +} +``` + +然后,揉面和醒发面团: + +``` +KNEAD=600 +SNOOZE=7200 + +function process_dough { +  remove_from(proofing_drawer) +  knead($KNEAD) +  return_to_drawer($SNOOZE) +} +``` + +在编程中,这些子例程subroutines可以表示为函数function。函数对程序员很重要,因为它们有助于减少代码中的冗余,从而减少了所需的维护量。例如,在以编程方式烤制面包的假想场景中,如果你需要更改面团醒发的用时,只要你之前使用函数,那么你只需更改一次用时,或使用变量(在示例代码中为 `SNOOZE`)或直接在处理面团的子程序中更改用时。这样可以节省你很多时间,因为你不必通过你的代码库遍历每个可能正在醒发的面团,更不用说担心错过一个。许多 bug 是由未更改的缺失的值或执行不正确的 `sed` 命令引起的,它们希望捕获所有可能而不必手动寻找。 + +在 [Bash][2] 中,无论是在编写的脚本或在独立的文件中,定义函数和使用它们一样简单。如果将函数保存到独立的文件中。那么可以将它 `source` 到脚本中,就像 `include` C 语言或 C++ 中的库或将模块 `import` 到 Python 中一样。要创建一个 Bash 函数,请使用关键字 `function`: + +``` +function foo { +# code here +} +``` + +这是一个如何在函数中使用参数的例子(有些人为设计,因此可能会更简单): + +``` +#!/usr/bin/env bash +ARG=$1 + +function mimic { +  if [[ -z $ARG ]]; then +    ARG='world' +  fi +  echo "hello $ARG" +} + +mimic $ARG +``` + +结果如下: + +``` +$ ./mimic +hello world +$ ./mimic everybody +hello everybody +``` + +请注意脚本的最后一行,它会执行该函数。对于编写脚本的新手来说,这是一个普遍的困惑点:函数不会自动执行。它们作为*潜在的*例程存在,直到被调用。 + +如果没有调用该函数,那么函数只是被定义,并且永远不会运行。 + +如果你刚接触 Bash,请尝试在包含最后一行的情况下执行示例脚本一次,然后在注释掉最后一行的情况下再次执行示例脚本。 + +### 使用函数 + +即使对于简单的脚本,函数也是很重要的编程概念。你越适应函数,在面对一个不仅需要声明性的命令行,还需要更多动态的复杂问题时,你就会越容易。将通用函数保存在单独的文件中还可以节省一些工作,因为它将帮助你建立常用的程序,以便你可以在项目间重用它们。看看你的脚本习惯,看是否适合使用函数。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/bash-functions + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop) +[2]: https://opensource.com/resources/what-bash diff --git a/published/202006/20200611 How I stream video with OBS and WebSockets.md b/published/202006/20200611 How I stream video with OBS and WebSockets.md new file mode 100644 index 0000000000..56e391979e --- /dev/null +++ b/published/202006/20200611 How I stream video with OBS and WebSockets.md @@ -0,0 +1,137 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12347-1.html) +[#]: subject: (How I stream video with OBS and WebSockets) +[#]: via: (https://opensource.com/article/20/6/obs-websockets-streaming) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +如何用 OBS 和 WebSockets 播放视频流 +====== + +> 用这些简化了 WebSockets 的开源支持工具来控制你的流媒体。 + +![](https://img.linux.net.cn/data/attachment/album/202006/25/105128sdod30qqu4z5oooo.jpg) + +[OBS][2] 是现在视频直播的主流之一。它是直播流媒体到 Twitch 的首选软件,Twitch 是近来最受欢迎的视频直播网站之一。有一些非常好的附加组件,可以让流媒体人从他们的手机或另一个屏幕上进行控制,而不影响正在运行的视频。事实证明,使用 [Node-RED][3] 和 [obs-websockets][4] 插件来构建自己的控制面板真的很容易。 + +![My OBS Control Dashboard][5] + +*我的 OBS 控制仪表盘* + +我知道你们很多人在想什么 —— “他在同一句话中提到了 WebSockets 和简单?”很多人在设置和使用 WebSockets 时遇到了困难,WebSockets 允许通过 Web 服务器的单一连接进行双向通信。Node-RED 内置了对 WebSockets 的支持,是让这一切变得简单的原因之一,至少与编写自己的客户端/服务器相比是如此。 + +在开始之前,请确保你已经安装和配置了 OBS。首先下载并安装[最新稳定版的 obs-websockets][6]插件。对于本文来说,默认的设置就可以了,但我强烈建议你之后按照说明来保护 obs-websockets 的安全。 + +接下来,[下载并安装 Node-RED][7],可以在同一个系统上,也可以在不同的系统上(比如树莓派)。同样,默认的安装对我们这篇文章来说是够了,但最好按照他们网站上的指示进行安全安装。 + +现在是有趣的部分。启动 Node-RED,打开网页界面(默认在 ),你有了一个空白的画布。打开右边的“汉堡”菜单,选择“管理口味Manage Palate”。然后点击“安装”标签,搜索 `node-red-contrib-dashboard` 和 `node-red-contrib-rbe` 模块。 + +安装好这些模块后,点击右侧列表,将以下模块拖拽到画布上。 + + * 1 Websocket Out + * 1 Websocket In + * 1 Debug + * 1 Inject + * 1 Switch + * 1 Change + * 2 JSON + * 1 Catch + +以下列顺序连接它们: + +``` +Inject->Button->Change->JSON->Websocket Out + +Websocket In->JSON->Switch->RBE->Debug + +Catch->Debug +``` + +![The basic flows][8] + +*基本流程* + +当 “Button” 被按下时(或 “Inject” 节点发送一个时间戳),有效载荷通过 “change” 节点发送,从 JSON 对象转换为字符串,然后发送到 “WebSocket Out” 节点。当 “WebSocket In” 节点收到消息后,会将其转换为 JSON 对象,如果不是重复的,则发送到 “Debug” 节点进行输出。而 “Catch” 节点会捕捉到任何错误,并将其放入 “Debug” 面板中。 + +那有效载荷里有什么呢?让我们设置好一切,一探究竟。 + +首先,双击 “Button” 打开设置对话框。先使用下拉菜单将有效载荷改为 “JSON”。在该字段中,添加以下内容: + +``` +{"request-type":"GetVersion"} +``` + +启用 “If msg arrives on input, emulate a button click” 复选框,然后点击 “Done” 关闭 “Button” 配置。当消息从 “Inject” 节点传来时,或者 UI 中的 “Button” 被按下,它将把 JSON 有效载荷发送到下一个节点。 + +![Setting up the button][9] + +*设置 “Button”* + +现在打开 “Change” 节点。我们要将 `msg.payload.message-id` 设置为 `msg._msgid`,方法是将第一个字段从 `payload` 改为 `payload.message-id`,然后使用第二个字段的下拉菜单将类型从 `String` 改为 `msg.`,然后我们将 `_msgid` 放入该字段。这样就会把唯一的消息 ID 复制到 JSON 对象的有效载荷中,这样每个请求就有一个唯一的 ID 进行跟踪。 + +然后将其发送到 “JSON” 节点,以便将 JSON 对象转换为字符串,然后传递给 “Websocket Out” 节点。打开 “Websocket Out” 节点,配置到 OBS 的连接。首先,将 `Type` 更改为 `Connect to`,然后单击铅笔图标以创建新的连接 URL。将其设置为 `ws://OBSMachine:4444/`,然后关闭对话框进行保存。`OBSMachine` 是 OBS 和 obs-websocket 运行的机器名称。例如,如果 Node-RED 运行在同一台机器上,则为 `ws://localhost:4444`,如果是在名为 `luxuria.local` 的机器上,则为 `ws://luxuria.local:4444`。关闭并更新 “Websocket Out” 节点。这将向 OBS 中的 WebSocket 发送有效载荷文本字符串。 + +![Websocket Out Node configuration][10] + +*“Websocket Out” 节点配置* + +进入 “WebSocket In” 流程!打开 “WebSocket In” 节点,并对其设置 `Type` 为 `Connect to` 和我们之前定义的连接的 URL(应自动填充)。接下来是第二个 “JSON” 节点,我们可以不用管它。它接受 OBS 的输出,并将其转换为有效载荷对象。 + +接下来,我们将从中过滤出常规的心跳和状态更新。打开 “Switch”,将 `Property` 值设置为 `payload["update-type"]`。现在从它下面的下拉菜单中选择 `Is Not Null`。点击 `+` 添加第二个选项,并从下拉菜单中选择 `otherwise`。 + +![Switch Node configuration][11] + +*“Switch” 节点配置* + +将 “Switch” 上的新输出直接连接到 “Debug” 节点的输入。 + +RBE 节点将过滤掉重复的内容,需要告诉它要观察什么字段。由于它应该连接到 “Switch” 的输出,而它只发送状态更新,所以这一点很重要,因为 obs-websocket 每隔几秒钟就会发送更新。默认情况下,RBE 会比较整个有效载荷对象,它将不断变化。打开 RBE 节点,将 `Property` 从 `payload` 改为 `payload.streaming`。如果 `payload` 的 `streaming` 值发生了变化,那么就把消息传递过去,否则就丢弃。 + +最后一步是将 “Debug” 节点的输出从 `msg.payload` 改为完整的 `msg` 对象。这使我们能够看到整个对象,有时在 `payload` 之外还有有用的信息。 + +现在,单击 “Deploy” 以激活更改。希望 WebSocket 节点下面会有绿色的 `Connected` 消息。如果它们是红色或黄色的,则连接 URL 可能不正确,需要更新,或者连接被阻止。请确保远程机器上的 4444 端口是开放的、可用的,并且 OBS 正在运行! + +如果没有 RBE 节点对 `streaming` 值的过滤,调试面板(点击画布右侧的“虫子”图标)大约现在就会被心跳消息填满。点击 “Inject” 节点左边的按钮,发送一个模拟按钮点击的信号。如果一切顺利,你应该会看到一个对象到达,它有一个 `obs-websocket` 可以做的所有事情的列表。 + +![The response to "GetVersion"][12] + +*对 “GetVersion” 的回应* + +现在在另一个标签或窗口中打开 `http://localhost:1880/ui`。它应该显示一个单一的按钮。按下它! 调试面板应该会显示和之前一样的信息。 + +恭喜你!你已经发送了你的第一个(希望不是最后一个)WebSocket 消息! + +这只是使用 obs-websockets 和 Node-RED 可以做的事情的起步。支持的完整文档记录在 obs-websockets 的 GitHub 仓库的 `protocol.md` 文件中。通过一点点的实验,你可以创建一个功能齐全的控制面板来启动和停止流媒体、改变场景,以及更多。如果你和我一样,在意识到之前,你就可以设置好各种控件了。 + +![OBS Websocket][13] + +*如此多的能力让我有点疯* + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/obs-websockets-streaming + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LIFE_film.png?itok=aElrLLrw (An old-fashioned video camera) +[2]: https://obsproject.com/ +[3]: https://nodered.org/ +[4]: https://github.com/Palakis/obs-websocket +[5]: https://opensource.com/sites/default/files/uploads/obscontrol-img1.png.jpg (My OBS Control Dashboard) +[6]: https://github.com/palakis/obs-websocket/releases +[7]: https://nodered.org/docs/getting-started/ +[8]: https://opensource.com/sites/default/files/uploads/obscontrol-img2.png.jpg (The basic flows) +[9]: https://opensource.com/sites/default/files/uploads/obscontrol-img3.png.jpg (Setting up the button) +[10]: https://opensource.com/sites/default/files/uploads/obscontrol-img4.png.jpg (Websocket Out Node configuration) +[11]: https://opensource.com/sites/default/files/uploads/obscontrol-img5.png.jpg (Switch Node configuration) +[12]: https://opensource.com/sites/default/files/uploads/obscontrol-img6.png.jpg (The response to "GetVersion") +[13]: https://opensource.com/sites/default/files/uploads/obscontrol-img7.png.jpg (OBS Websocket) diff --git a/published/202006/20200612 Import functions and variables into Bash with the source command.md b/published/202006/20200612 Import functions and variables into Bash with the source command.md new file mode 100644 index 0000000000..f8dc02f78e --- /dev/null +++ b/published/202006/20200612 Import functions and variables into Bash with the source command.md @@ -0,0 +1,126 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12346-1.html) +[#]: subject: (Import functions and variables into Bash with the source command) +[#]: via: (https://opensource.com/article/20/6/bash-source-command) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 source 命令将函数和变量导入 Bash +====== + +> source 就像 Python 的 import 或者 Java 的 include。学习它来扩展你的 Bash 能力。 + +![](https://img.linux.net.cn/data/attachment/album/202006/24/235417tbzjpdbpbzkbjeul.jpg) + +登录 Linux shell 时,你将继承特定的工作环境。对于 shell 而言,“环境environment”意味着已经为你设置了某些变量,以确保你的命令可以按预期工作。例如,[PATH][2] 环境变量定义 shell 从哪里查找命令。没有它,几乎在 Bash 中尝试执行的所有操作都会因“命令未发现” 错误而失败。在执行日常任务时,环境对你几乎是不可见的,但它很重要。 + +有多种方法可以影响你的 shell 环境。你可以在配置文件中进行修改,例如 `~/.bashrc` 和 `~/.profile`,你可以在启动时运行服务,还可以创建自己的自定义命令或编写自己的 [Bash 函数][3] 。 + +### 通过 source 添加到你的环境 + +Bash(以及其他一些 shell)有一个称为 `source` 的内置命令。这就是令人困惑的地方:`source` 执行与命令 `.` 相同的功能(是的,那只是一个点),而与 `Tcl` 命令的 `source` 不是同一个(如果你输入 `man source`,也许在屏幕上显示的是它)。实际上,内置的 `source` 命令根本不在你的 `PATH` 中。这是 Bash 附带的命令,要获取有关它的更多信息,可以输入 `help source`。 + +`.` 命令兼容 [POSIX][4]。 但 `source` 命令不是 POSIX 定义的,但可以与 `.` 命令互换使用。 + +根据 Bash `help`,`source` 命令在你当前的 shell 中执行一个文件。 “在你当前的 shell 中” 这句很重要,因为它表示它不会启动子 shell。因此,用 `source` 执行的任何操作都发生在内部并影响*当前*环境。 + +在探讨 `source` 对环境的影响之前,请用 `source` 命令导入一个测试文件,以确保其按预期执行代码。首先,创建一个简单的 Bash 脚本并将其保存为 `hello.sh`: + +``` +#!/usr/bin/env bash +echo "hello world" +``` + +使用 `source`,即使该脚本不设置可执行也可以运行: + +``` +$ source hello.sh +hello world +``` + +你也可以使用内置的 `.` 命令获得相同的结果: + +``` +$ . hello.sh +hello world +``` + +`source` 和 `.` 命令成功地执行了测试文件的内容。 + +### 设置变量和导入函数 + + 你可以使用 `source` 将文件 “导入” 到 shell 环境中,就像你可以在 C 或 C++ 中使用 `include` 关键字引用一个库,或者在 Python 中使用 `import` 关键字引入一个模块一样。这是 `source` 的最常见用法之一,它也是 `.bashrc` 中的一个默认包含方式,通过 `source` 导入 `.bash_aliases`,以便将任何你自定义的别名在登录时导入到你的环境。 + +这是导入 Bash 函数的示例。首先,在名为 `myfunctions` 的文件中创建一个函数。它将打印你的公共 IP 地址和本地 IP 地址: + +``` +function myip() { +        curl       + +        ip addr | grep inet$IP | \ +        cut -d"/" -f 1 | \ +        grep -v 127\\.0 | \ +        grep -v \:\:1 | \ +        awk '{$1=$1};1' +} +``` + +将该函数导入你的 shell: + +``` +$ source myfunctions +``` + +测试新函数: + +``` +$ myip +93.184.216.34 +inet 192.168.0.23 +inet6 fbd4:e85f:49c:2121:ce12:ef79:0e77:59d1 +inet 10.8.42.38 +``` + +### source 的搜索 + +当你在 Bash 中使用 `source` 时,它将在当前目录中搜索你引用的文件。但并非所有 shell 都这样,因此,如果你不使用 Bash,请查看文档。 + +如果 Bash 找不到要执行的文件,它将搜索你的 `PATH`。同样,这并不是所有 shell 的默认设置,因此,如果你不使用 Bash,请查看文档。 + +这些都是 Bash 中不错的便利功能。这种出奇地强大,因为它允许你将常用函数保存在磁盘上的一个集中的位置,然后将你的环境视为集成开发环境 (IDE)。你不必担心函数的存储位置,因为你知道它们在你的本地位置等同于在 `/usr/include` 下,因此无论你在哪,当你导入它们时,Bash 都可以找到它们。 + +例如,你可以创建一个名为 `~/.local/include` 的目录作为常见函数存储区,然后将此代码块放入 `.bashrc` 文件中: + +``` +for i in $HOME/.local/include/*; +  do source $i +done +``` + +这会将 `~/.local/include` 中所有包含自定义函数的文件“导入”到 shell 环境中。 + +当你使用 `source` 或 `.` 命令时,Bash 是唯一搜索当前目录和 `PATH` 的 shell。 + +### 将 source 用于开源 + +使用 `source` 或 `.` 来执行文件是影响环境同时保持变更模块化的一种便捷方法。在下次考虑将大量代码复制并粘贴到 `.bashrc` 文件中时,请考虑将相关函数或别名组放入专用文件中,然后使用 `source` 导入它们。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/bash-source-command + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) +[2]: https://opensource.com/article/17/6/set-path-linux +[3]: https://opensource.com/article/20/6/how-write-functions-bash +[4]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains diff --git a/published/202006/20200615 How to use Bash history commands.md b/published/202006/20200615 How to use Bash history commands.md new file mode 100644 index 0000000000..f410a9ff13 --- /dev/null +++ b/published/202006/20200615 How to use Bash history commands.md @@ -0,0 +1,154 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12344-1.html) +[#]: subject: (How to use Bash history commands) +[#]: via: (https://opensource.com/article/20/6/bash-history-commands) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +如何使用 Bash history 命令 +====== + +> Bash 的 history 命令在它提供的功能数量上超过了所有其他 Linux Shell 历史接口。 + +![](https://img.linux.net.cn/data/attachment/album/202006/24/101620c0uj0dgg0buo9nib.jpg) + +Bash 有丰富的历史。也就是说,它是一个古老的的 shell,还有一个更古老的 Shell (Bourne shell)的前辈,但是它还有一个很棒的 `history` 命令,它提供的功能数量超过了所有其他 shell 的历史接口。 [Bash][2] 版本的 `history` 可进行反向搜索、快速调用、重写历史记录等。 + +`history` 命令与许多其他命令不同。你可能习惯于将命令作为可执行文件放在常见的系统级位置,例如 `/usr/bin`、`/usr/local/bin` 或者 `~/bin`。 内置的 `history` 命令不在你的 `PATH` 中并且没有物理位置: + + +``` +$ which history + +which: no history in [PATH] +``` + +相反,`history` 是 shell 本身的内置函数: + +``` +$ type history +history is a shell builtin +$ help history +history: history [-c] [-d offset] [n] or +history -anrw [filename] or +history -ps arg [arg...] + +Display or manipulate the history list. +[...] +``` + +出于这个原因,每个 shell 中的历史功能都是独特的,因此你在 Bash 中使用的功能可能无法在 Tcsh 或 Fish 或 Dash 中使用,而在这些 shell 中使用的功能可能也无法在 Bash 中使用。在某些情况下,了解 Bash 可以做什么可能会激发其他 shell 的用户创建有趣的改造来复制 Bash 行为,并且可能会解锁你从未知道的 Bash 功能。 + +### 查看你的 Bash 历史 + +`history` 命令最基本、最频繁的用法是查看 shell 会话的历史记录: + + +``` +$ echo "hello" +hello +$ echo "world" +world +$ history +  1  echo "hello" +  2  echo "world" +  3  history +``` + +### 事件指示器 + +事件指示器Event designator按事件搜索你的历史记录。在这里,“事件”是指记录在历史中的命令,以换行符划定。换句话说,一行一个事件,以索引号来标记。 + +事件指示器大多以感叹号开头,有时也称为 “bang”(`!`)。 + +要从你的历史记录中重新运行命令,请使用感叹号,之后紧跟(之间没有空格)所需命令的索引号。例如,假设第 1 行包含命令 `echo "hello"`,你想要想再次运行它: + + +``` +$ !1 +echo "hello" +hello +``` + +你可以使用相对定位,提供基于你历史中当前位置向后的负数行号。例如,返回到历史中倒数第三个条目: + +``` +$ echo "foo" +foo +$ echo "bar" +bar +$ echo "baz" +baz +$ !-3 +echo "foo" +foo +``` + +如果只想回去一行,那么可以使用速记 `!!` 代替 `!-1`。这节省了按键时间! + +``` +$ echo "foo" +$ !! +echo "foo" +foo +``` + +### 字符串搜索 + +你也可以对条目搜索特定的字符串,反过来搜索要运行命令。要搜索以指定字符串*开始*的命令,请使用感叹号,之后紧跟(没有空格)要搜索的字符串: + +``` +$ echo "foo" +$ true +$ false +$ !echo +echo "foo" +foo +``` + +你还可以在任意位置(不仅是开头)搜索包含该字符串的命令。为此,请像之前一样使用 `!` 加上要搜索的字符串,但在字符串的两端都用问号(`?`)围绕起来。如果你知道该字符串后紧跟一个换行符,那么可以省略最后的问号(就是在按*回车*之前输入的最后字符): + +``` +$ echo "foo" +$ true +$ false +$ !?foo? +echo "foo" +foo +``` + +### 字符串替换 + +类似于在行首搜索字符串,你可以搜索字符串并用新字符串替换它,以更改命令: + +``` +$ echo "hello" +hello +$ echo "world" +world +$ ^hello^foo +echo "foo" +foo +``` + +### 让 history 有用 + +在 Bash 中,`history` 命令的功能远远超过此处介绍的内容,但这是一个很好的开始, 可以让你习惯使用你的历史记录, 而不是仅仅把它当作一个参考。经常使用 `history` 命令,并试试无需输入命令即可执行的操作。你可能会感到惊讶! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/bash-history-commands + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) +[2]: https://opensource.com/resources/what-bash diff --git a/published/202006/20200615 Introduction to Homebrew- the painless way to install anything on a Mac.md b/published/202006/20200615 Introduction to Homebrew- the painless way to install anything on a Mac.md new file mode 100644 index 0000000000..7253cba52c --- /dev/null +++ b/published/202006/20200615 Introduction to Homebrew- the painless way to install anything on a Mac.md @@ -0,0 +1,221 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12338-1.html) +[#]: subject: (Introduction to Homebrew: the painless way to install anything on a Mac) +[#]: via: (https://opensource.com/article/20/6/homebrew-mac) +[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg) + + +Homebrew :在 Mac 上无痛安装软件 +====== + +> Homebrew 软件包管理器可以让你轻松地在 Mac 上安装和更新应用程序和实用程序。 + +![](https://img.linux.net.cn/data/attachment/album/202006/22/102739xum6zqmoh6sso0n6.jpg) + +在我追求“万物自动化”的过程中,我一直坚持走在用代码来管理我的 Mac 笔记本电脑的路上。与其用鼠标或触控板手动管理我的应用程序和实用程序,我更喜欢使用软件包管理软件来安装、更新和删除不需要的软件。 + +这对 Mac 用户来说是个挑战。Mac 的操作系统 macOS 始终落后于 Linux 的一个地方就是在包管理方面。Mac 用户没有默认的软件包管理器,而 Linux 用户则有很多选择 —— 从熟悉的 `yum` 和 `apt` 到现代的 [Flatpak][2]。但 Mac 呢? + +这就是 [Homebrew][3] 的作用。Homebrew(自酿)填补了 MacOS 事实上的软件包管理器的空白(它也是 Linux 上的又一个可选的包管理器)。它为任何熟悉命令行的人提供了令人难以置信的流畅而直接的体验,如果你是新手,它是学习命令行的好方法。 + +(LCTT 译注:Homebrew 系统中采用了大量针对自酿啤酒相关的比喻,大家在使用过程中会发现这些有趣的形容。) + +如果你在 Mac 上还没有 Homebrew,你可以这样来安装: + +``` +$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" +``` + +该命令将执行 Homebrew 团队提供的安装程序脚本。如果你喜欢谨慎一点,可以 `curl` 下来这个文件,审核后再手动运行。 + +``` +$ curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh --output homebrew_installer.sh +$ more homebrew_installer.sh # 审核该脚本,直到你觉得没问题了 +$ bash homebrew_installer.sh +``` + +### 使用“酿造”来管理你的命令行实用程序 + +Homebrew 号称它“可以安装苹果(或你的 Linux 系统)默认没有安装的必需之物”。安装是通过 `brew`(酿造)命令进行的,它使我们能够访问成千上万的命令行实用程序,但不是更复杂的应用程序。 + +对于我们这些搞技术的人来说,符合“必需之物”类别的实用工具包括显示目录结构的方便的 `tree` 命令和我用来 [管理多个 Python 版本][4] 的 `pyenv`。 + +你可以用 `search` 子命令看到 Homebrew 中所有的“秘方formula”,我用 `wc` 命令显示有多少个“秘方”。 + +``` +# -l 统计行数 +$ brew search | wc -l +    5013 +``` + +有 5000 多个“秘方”,这是一个不可思议的软件数量。所以,在搜索那个庞大的清单之前,最好先对自己想要的东西有个概念。值得庆幸的是,浏览起来很方便。“秘方”被编入并集中存储到核心库中,核心库按操作系统划分(Mac 在 [Homebrew Core][5],Linux 在 [Linux Core][6])。它们也可以通过 Homebrew API 和[网站][7]列出。 + +口碑是另一个寻找实用工具的好方法。考虑到这一点,如果你正在寻找灵感,这里有一些我的最爱: + +* `pyenv`、`rbenv` 和 `nodenv` 分别用于管理 Python、Ruby 和 Node.js 的版本 +* `imagemagick` 用于可脚本化的图像编辑 +* `pandoc` 用于可脚本化的文件转换(我经常从 .docx 切换到 .md 或 .html) +* `hub` 为 GitHub 用户提供了[更好的 Git 体验][8]。 +* `tldr` 提供了解如何使用命令行工具的例子 + +举个例子,看看 [tldr 页面][9],这是一个用户友好的替代方式,可以滚动浏览应用程序的手册页。你可以通过再次运行 `search` 来确认它是否可用: + +``` +$ brew search tldr +==> Formulae +tldr ✔ +``` + +成功了!这个对勾让你知道它是可用的。现在你可以安装它了: + +``` +$ brew install tldr +==> Downloading https://homebrew.bintray.com/bottles/tldr-1.3.0_2.catalina.bottle.tar.gz +Already downloaded: /Users/mbbroberg/Library/Caches/Homebrew/downloads/901bc14594a9283e9ab20aec942dc5a9a2befb7e96e1b0fcccb4e3257918813c--tldr-1.3.0_2.catalina.bottle.tar.gz +==> Installing tldr +==> Pouring tldr-1.3.0_2.catalina.bottle.tar.gz +🍺 /usr/local/Cellar/tldr/1.3.0_2: 6 files, 35.5KB +``` + +值得庆幸的是,Homebrew 预先构建了二进制文件,所以你不必在本地机器上从源代码构建。这样就节省了很多时间,并免除了 CPU 风扇的噪音。我对 Homebrew 赞赏的另一件事是,你可以在不完全了解其含义的情况下欣赏此功能。 + +但如果你喜欢,看看复杂的东西也是很有趣的。对 `tldr` 运行 `info` 子命令,你可以看到所有的依赖管理、源代码,甚至公共分析。 + +``` +$ brew info tldr +tldr: stable 1.3.0 (bottled), HEAD +Simplified and community-driven man pages +https://tldr.sh/ +Conflicts with: + tealdeer (because both install `tldr` binaries) +/usr/local/Cellar/tldr/1.3.0_2 (6 files, 35.5KB) * + Poured from bottle on 2020-05-20 at 15:12:12 +From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/tldr.rb +==> Dependencies +Build: pkg-config ✔ +Required: libzip ✔ +==> Options +--HEAD + Install HEAD version +==> Analytics +install: 2,811 (30 days), 7,875 (90 days), 27,105 (365 days) +install-on-request: 2,806 (30 days), 7,860 (90 days), 27,080 (365 days) +build-error: 0 (30 days) +``` + +最后,和其他优秀的软件包管理器一样,Homebrew 的 `brew uninstall` 子命令可用于快速清理和删除未使用的实用程序。 + +### 用“酒桶”管理你的应用程序 + +命令行实用程序是一匹孤狼,但完整的应用程序呢?Homebrew 保持了其标准命令的简单性,只通过其默认的 `brew` 命令行界面安装单文件应用。而应用程序不符合这种结构。它们的目录层次比较复杂,比单一的二进制要复杂得多。 + +幸运的是,Mac 上的 Homebrew 包含了一个名为 `cask`(酒桶)的子命令,用于处理更复杂的多目录结构。特别好的是,`cask` 使用了与标准 `brew` 命令类似的命令结构,所以你可以使用类似的 `search`、`install` 和 `info` 子命令: + +``` +brew search --cask | wc -l +    4772 +``` + +哇,有近 5000 个应用程序,在 [Homebrew 的网站][10]上浏览更方便。 + +我将用我新喜欢的一款应用来引导你完成 `cask`。[Meld][11](我[在 Opensource.com 上读到的][12])。这是一个功能丰富的编辑器,可以帮助管理合并冲突。在它的网站上有下载的链接,我可以运行安装程序,并将其拖放到我的应用程序文件夹中。但我不想再这样做了,我用的是 Homebrew。 + +首先,我可以通过稍微不同的语法确认它可以使用: + +``` +$ brew search --casks meld +==> Casks +meld +``` + +然后我使用 `cask` 子命令来安装它: + +``` +$ brew cask install meld +==> Downloading https://github.com/yousseb/meld/releases/download/osx-19/meldmerge.dmg +==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/28624006/66cb25 +######################################################################## 100.0% +==> Verifying SHA-256 checksum for Cask 'meld'. +==> Installing Cask meld +==> Moving App 'Meld.app' to '/Applications/Meld.app'. +==> Linking Binary 'meld.wrapper.sh' to '/usr/local/bin/meld'. +🍺 meld was successfully installed! +``` + +Homebrew 不仅安装了应用程序,而且还在我当前的路径 `/usr/local/bin/` 下提供了它。现在,我可以从命令行运行 `meld` 或从应用程序文件夹中启动应用程序。 + +### 更新一切的“酿造升级” + +我一直使用软件包管理器的主要原因是,我可以不断升级我的软件,以避免已知的安全漏洞,并确保我总是有最新的功能。如果我手工安装所有的东西,我必须关注每一个工具和应用程序,以了解它是否有自动更新程序,如果没有,就得自己拉回最新的版本。 + +升级功能是优秀的软件包管理的闪光点。由于我没有什么特殊的版本要求,所以我只需要运行一个命令就可以顺利更新一切: + +``` +$ brew upgrade +==> Upgrading 6 outdated packages: +helm 3.2.1 -> 3.2.2 +python@3.8 3.8.2_4 -> 3.8.3 +ipython 7.14.0 -> 7.15.0 +go 1.14.2_1 -> 1.14.3 +libzip 1.6.1 -> 1.6.1_1 +sqlite 3.31.1 -> 3.32.1 +``` + +如果你有更复杂的需求,或者想在安装升级前关注一下升级情况,有很多功能标志可供选择。例如,`-n` 提供了一个 “模拟运行”,列出了可用的升级,而不会进行安装。你也可以 “[钉][13]” 住应用程序版本来防止它升级。 + +### 备份你的安装 + +当该工具允许你像其它[点文件的版本控制方案][14]一样备份你的安装环境时,命令行实用程序和应用程序的管理就跳到了一个全新的水平。Homebrew 就有这样的功能,可以在 `dump` 子命令下使用。它会生成一个 `Brewfile`,这是一个可重复使用的当前所有安装的工具的列表。要从你的安装的环境中生成一个,进入你的合适的文件夹并运行: + +``` +$ cd ~/Development/dotfiles # 这是我的点文件的文件夹 +$ brew bundle dump +``` + +当我换了机器,想用 Homebrew 安装相同的应用程序时,我就会进入装有 `Brewfile` 的文件夹并运行。 + +``` +$ brew bundle +``` + +它将在我的新机器上安装所有列出的“秘方”和“酒桶”。 + +### 用 Homebrew 进行软件包管理 + +Homebrew 是我常用的命令行工具和应用程序的管理器。它可以让我保持有条理和及时更新,它的设计在易用性和功能深度之间取得了美丽的平衡。Homebrew 将软件包管理的细节最小化到只需要你知道的程度,大多数用户都会从中受益。 + +如果你对 Linux 软件包管理器已经驾轻就熟,你可能会认为 Homebrew 太简单了,但不要误以为 Homebrew 的易用性是功能的缺乏。稍微深入一点看,就会发现很多高级选项,远远超出了我在这里向你展示的范围。将 `-h` 添加到任何 `brew` 子命令中,会显示可用来升级、删除、故障排除,甚至使用模板贡献新 “秘方” 的丰富功能。 + +总的来说,Homebrew 可以让一个重度命令行的 Mac 用户变得很开心。此外,它是开源的,所以如果你愿意,你可以[贡献代码][15]。尝试一下它,让我知道你的想法,在下面留下评论。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/homebrew-mac + +作者:[Matthew Broberg][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mbbroberg +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_gift_giveaway_box_520x292.png?itok=w1YQhNH1 (Gift box opens with colors coming out) +[2]: https://opensource.com/article/19/10/how-build-flatpak-packaging +[3]: https://brew.sh +[4]: https://opensource.com/article/20/4/pyenv +[5]: https://github.com/Homebrew/homebrew-core +[6]: https://github.com/Homebrew/linuxbrew-core +[7]: https://formulae.brew.sh/formula/ +[8]: https://opensource.com/article/20/3/github-hub +[9]: https://github.com/tldr-pages/tldr +[10]: https://formulae.brew.sh/cask/ +[11]: https://meldmerge.org/ +[12]: https://opensource.com/article/20/3/meld +[13]: https://docs.brew.sh/FAQ#how-do-i-stop-certain-formulae-from-being-updated +[14]: https://opensource.com/article/19/3/move-your-dotfiles-version-control +[15]: https://github.com/Homebrew/brew diff --git a/published/202006/20200619 How to dump the GOSSAFUNC graph for a method.md b/published/202006/20200619 How to dump the GOSSAFUNC graph for a method.md new file mode 100644 index 0000000000..36c75fc7af --- /dev/null +++ b/published/202006/20200619 How to dump the GOSSAFUNC graph for a method.md @@ -0,0 +1,99 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12350-1.html) +[#]: subject: (How to dump the GOSSAFUNC graph for a method) +[#]: via: (https://dave.cheney.net/2020/06/19/how-to-dump-the-gossafunc-graph-for-a-method) +[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) + +在 Go 中如何转储一个方法的 GOSSAFUNC 图 +====== + +![](https://img.linux.net.cn/data/attachment/album/202006/26/083943vymvmc67p7s3oman.jpg) + +Go 编译器的 SSA 后端包含一种工具,可以生成编译阶段的 HTML 调试输出。这篇文章介绍了如何为函数*和*方法打印 SSA 输出。 + +让我们从一个包含函数、值方法和指针方法的示例程序开始: + +``` +package main + +import ( + "fmt" +) + +type Numbers struct { + vals []int +} + +func (n *Numbers) Add(v int) { + n.vals = append(n.vals, v) +} + +func (n Numbers) Average() float64 { + sum := 0.0 + for _, num := range n.vals { + sum += float64(num) + } + return sum / float64(len(n.vals)) +} + + +func main() { + var numbers Numbers + numbers.Add(200) + numbers.Add(43) + numbers.Add(-6) + fmt.Println(numbers.Average()) +} +``` + +通过 `GOSSAFUNC` 环境变量控制 SSA 调试输出。此变量含有要转储的函数的名称。这*不是*函数的完全限定名。对于上面的 `func main`,函数名称为 `main` *而不是* `main.main`。 + +``` +% env GOSSAFUNC=main go build +runtime +dumped SSA to ../../go/src/runtime/ssa.html +t +dumped SSA to ./ssa.html +``` + +在这个例子中,`GOSSAFUNC=main` 同时匹配了 `main.main` 和一个名为 `runtime.main` 的函数。[^1]这有点不走运,但是实际上可能没什么大不了的,因为如果你要对代码进行性能调整,它就不会出现在 `func main` 中的巨大的意大利面块中。 + +你的代码更有可能在*方法*中,你可能已经看到这篇文章,并寻找能够转储方法的 SSA 输出。 + +要为指针方法 `func (n *Numbers) Add` 打印 SSA 调试,等效函数名为 `(*Numbers).Add`:[^2] + +``` +% env "GOSSAFUNC=(*Numbers).Add" go build +t +dumped SSA to ./ssa.html +``` + +要为值方法 `func (n Numbers) Average` 打印 SSA 调试,等效函数名为 `(*Numbers).Average`,*即使这是一个值方法*: + +``` +% env "GOSSAFUNC=(*Numbers).Average" go build +t +dumped SSA to ./ssa.html +``` + +[^1]: 如果你没有从源码构建 Go,那么 `runtime` 软件包的路径可能是只读的,并且可能会收到错误消息。请不要使用 `sudo` 来解决此问题。 +[^2]: 请注意 shell 引用 + + +-------------------------------------------------------------------------------- + +via: https://dave.cheney.net/2020/06/19/how-to-dump-the-gossafunc-graph-for-a-method + +作者:[Dave Cheney][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://dave.cheney.net/author/davecheney +[b]: https://github.com/lujun9972 + diff --git a/published/202006/20200621 How to Make Ubuntu Look Like macOS in 5 Easy Steps.md b/published/202006/20200621 How to Make Ubuntu Look Like macOS in 5 Easy Steps.md new file mode 100644 index 0000000000..9d5d5f7cf6 --- /dev/null +++ b/published/202006/20200621 How to Make Ubuntu Look Like macOS in 5 Easy Steps.md @@ -0,0 +1,240 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12361-1.html) +[#]: subject: (How to Make Ubuntu Look Like macOS in 5 Easy Steps) +[#]: via: (https://itsfoss.com/make-ubuntu-look-like-macos/) +[#]: author: (Community https://itsfoss.com/author/itsfoss/) + +5 个简单步骤使你的 Ubuntu 看起来像 macOS +====== + +定制是 [我为什么使用 Linux][1] 的一个主要原因。定制桌面 Linux 的道路是永无止境的。你可以更改图标、主题、字体、终端、添加屏幕小工具、[指示器小程序][2]、扩展等诸如此类的东西。 + +我们已经介绍了很多桌面环境定制的建议和技巧。在这篇文章中,我将向你展示如何使 Ubuntu 看起来像 macOS。 + +很多人使用 macOS,是因为它的简单和优雅的外观。你可能不同意这一点,但这仍然是一个流行的观点。甚至有的 Linux 发行版也有类似 macOS 外观和感觉。 + +一位读者要求我们展示如何使 Ubuntu 看起来像 macOS,因此我们写了这篇教程。事实上,这是一个用来展示桌面 Linux 定制能力的很好的示例。 + +不过,你没有必要为定制外观而安装一个新的发行版。你可以在你自己的系统上做一些调整来给予你一个类似 macOS 的外观。 + +### 如何给你的 Ubuntu Linux 进行 macOS 改造 + +![][3] + +尽管这篇文章是对 Ubuntu 的建议,但是你也可以在其它使用 GNOME 桌面环境的发行版中使用这些建议,几乎可以不做任何改动。请确保[检查一下你的桌面环境][4]。 + +说实话,即使你使用的是其它的桌面环境,你仍然可以得到一些关于要做哪些更改的提示。但是你必须确保使用你的桌面环境的工具按照步骤进行。 + +#### 必要条件: GNOME Tweaks 和 GNOME 扩展 + +请确保 [安装 GNOME Tweaks 工具][5]。你需要它来更改主题和图标。 + +你也需要 [启用 GNOME 扩展][6] 来更改 GNOME Shell 和添加重要的要点。 + +在你启用 GNOME 扩展后,你需要从 [GNOME 扩展][7] 网站安装“用户主题” 扩展,或者只需要转到 [这个超链接][8] ,并单击开关来将其打开。 + +我也希望你对 [在 Ubuntu 上安装主题][9] 有一定的了解。不过,我还是简单的谈了一下这个主题。 + +让我们依次看看每个步骤。 + +#### 步骤 1: 安装一个 macOS 风格的 GTK 主题 + +因为重点是使 GNOME 看起来像 macOS,所以你应该选择一个像 macOS 一样的主题。有很多主题都是像 macOS 一样的。 + +##### 下载一个你选择的主题 + +你可以转到 [Gnome-look][10] 站点,并搜索关于 GTK3 的主题。如果你在 Gnome-look 网站上看到 “Pling” 字样,不用担心,它们都是来自同一个供应商。 + +你可以选择任何你想要的主题。下面是一些我认为你应该看看的macOS主题: + +- [mcOS 11][11] +- [McHigh Sierra][12] +- [Catalina][13] +- [McMojave][14] + +在这篇文章中,我将使用 “[McMojave][14]”。你可以选择任何你想要的主题。你将在网站的右侧找到下拉式的下载按钮,单击它。 + +![McMojave 暗黑主题][15] + +在这里你可以找到各种 “.tar.xz” 文件。这些不同的文件包含了相同的主题,但有一些小的差异。像在 “McMojave” 中,我们有像暗黑主题和明亮主题的变体。你可以尝试所有的主题,或者从之间随意选择一个你喜欢的。 + +##### 设置下载的主题 + +提取下载的主题,并复制这些提取的主题文件夹到 `.local/share/themes` 文件夹下。 + +打开 GNOME Tweak 工具,并更改应用程序和 Shell 的主题。在你更改主题的同时,你可以看到黄色、绿色和红色三个按钮,以及左上角的苹果标志。你也可以看到在面板项上的一些更改。 + +![McMojave GTK 和 Shell 主题][16] + +#### 步骤 2: 安装像 macOS 一样的图标 + +macOS 外观改造的下一步骤是使用像 macOS 一样的图标。 + +##### 下载图标集合 + +这里有一些我建议使用的图标集合,你可以从 Gnome-look 网站下载: + +- [McMojave-circle][17] +- [Mojave CT-icons][18] +- [Cupertino icons][19] + +在这篇文章中,我将使用 “[McMojave-circle][17]” ,你可以随意使用任何你喜欢的图标。 + +就像主题一样,你可以从右侧的下拉式的 “下载” 按钮下载图标集合。在这里你也可以找到同一种图标的不同版本。 + +![Mcmojave Circle][20] + +##### 设置图标 + +现在设置下载的图标。为此,提取下载文件中的文件夹并复制它到你的家目录下的 `.icons` 文件夹。 查看这篇关于 [在 Ubuntu 中安装图标主题][9] 的文章。 + +这是这种图标看起来的样子: + +![McMojave Circle 图标外观][21] + +#### 步骤 3: 添加类似 macOS 样子的坞站 + +没有类似 macOS 样子的坞站dock,你的 Ubuntu 就看起来不像 macOS。在 Linux 上有很多可用的坞站。我喜欢 “[Dash to Dock][22]”,我会在这里使用它。 + +“Dash to Dock” 是一个 GNOME 扩展。到现在为止,你已经熟悉 GNOME 扩展。只需要转到 [这个超链接][23] ,并单击切换按钮来安装它。你的原本的坞站将自动被 “Dash to Dock” 所替换。 + +你可以通过右键单击 “show applications” 按钮(最右边的菜单按钮)并选择 “Dash to dock settings” 来更改设置。 + +![Dash To Dock][24] + +#### 步骤 4: 使用 macOS 壁纸 + +大多数复杂的东西已经完成。现在是时候设置 macOS 壁纸了。你可以从下面的超链接下载 macOS 默认壁纸: + +- [下载 macOS 壁纸][25] + +##### 更改桌面背景 + +我将使用 “Mojave Day” 壁纸。右键单击已下载的的图像,并选择 “设置为壁纸” 选项来更改壁纸。 + +在设置这个壁纸后,这是我系统外观的样子: + +![][26] + +##### 更改锁屏壁纸 + +锁屏壁纸选项已经从 [Ubuntu 20.04][27] 的设置中移除。现在它使用一个模糊的桌面壁纸作为锁屏壁纸。 + +要设置一个自定义锁屏壁纸,你可以使用 “[Lock screen background][28]” 扩展。 + +打开 “Lock screen background” 扩展设置,并设置锁屏壁纸。 + +![锁屏背景设置][29] + +这是锁屏现在的样子。如果你感到好奇话,这里是 [如何在 Ubuntu 中截图锁屏][30]。 + +![锁屏][31] + +![登录屏幕][32] + +#### 步骤 5: 更改系统字体 + +这几年,macOS 的主要系统字体是 “San Francisco” 。但是,这个字体并不是公共领域的,而是像苹果生态系统中的许多其他东西一样,是专有字体。基于这个原因,你不能使用这种字体。 + +你能做的就是使用一种看起来像 San Francisc 字体一样的开源字体。我建议使用 Google 的 [Roboto][33] 字体,或 Adobe 的 [Source Sans Pro][34] 。 + +[在 Ubuntu 中安装字体是很简单的][35] 。下载 字体的 zip 文件,只需要在提取出来的文件夹中双击 ttf 文件。它会给你一个选项来逐一安装字体。 + +如果你想节省时间并一次安装所有的字体,提取其中所有的字体到你的家目录(`~/.fonts`)下的 `.fonts` 目录中。 + +![安装字体][36] + +在你安装字体后,你可以使用 GNOME Tweaks 工具来更改系统字体。 + +![设置字体][37] + +#### 额外提示:Spotlight 式的应用程序启动器(如果你像更进一步的话) + +如果你是 macOS Spotlight 启动器的粉丝,那么你在 Linux 上也能找到类似的东西。我最喜欢的这类启动器的软件包是 “[Albert][38]”。 + +你可以 [在 Albert 网站上找到它的安装说明][39] 。 + +安装完成后,打开 Albert 并设置快捷键(你想打开该启动器的组合键)就可以了。我想,在 macOS 中 `Command + Space` 键是来启动 Spotlight;在 Ubuntu 中,你可以设置 `Super+Space` [快捷键][40]。 + +你会会得到很多内置的主题,在下面的图片中,我使用 “Spotlight dark” 主题。 + +Albert 不能直接启动应用程序,你必须授予它在哪里可以进行搜索的权限。 + +![Albert 设置][41] + +在设置后,这是它看起来的样子: + +![Albert 暗黑主题][42] + +这是我的 Ubuntu 20.04 在完成所有定制后的样子。它看起来像 macOS 吗? 仁者见仁,智者见智。 + +![macOS 主题][43] + +![Ubuntu 使用 macOS 外观改造][44] + +如此,这就是你如何使你的 GNOME 桌面看起来像 macOS 一样的步骤。正如我在开始时所说的,这是一个很好的 Linux 桌面定制功能的示例。 + +如果你有新的注意或有任何疑问;评论区全是你的地盘。 + +本文由 Sumeet 编写,并由 Abhishek Prakash 提供补充输入信息。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/make-ubuntu-look-like-macos/ + +作者:[Sumeet][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/itsfoss/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/why-use-linux/ +[2]: https://itsfoss.com/best-indicator-applets-ubuntu/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/Make-Ubuntu-Look-like-MacOS.png?ssl=1 +[4]: https://linux.cn/article-12124-1.html +[5]: https://itsfoss.com/gnome-tweak-tool/ +[6]: https://linux.cn/article-9447-1.html +[7]: https://extensions.gnome.org/ +[8]: https://extensions.gnome.org/extension/19/user-themes/ +[9]: https://itsfoss.com/install-themes-ubuntu/ +[10]: https://www.gnome-look.org/ +[11]: https://www.pling.com/p/1220826 +[12]: https://www.pling.com/p/1013714 +[13]: https://www.pling.com/p/1226871 +[14]: https://www.pling.com/p/1275087 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/McMojave-dark-theme.png?ssl=1 +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/McMojave-Desktop.png?ssl=1 +[17]: https://www.gnome-look.org/p/1305429/ +[18]: https://www.gnome-look.org/p/1210856/ +[19]: https://www.gnome-look.org/p/1102582/ +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/McMojave-circle-.png?ssl=1 +[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/McMojave-circle-icons-look.png?fit=800%2C494&ssl=1 +[22]: https://github.com/micheleg/dash-to-dock +[23]: https://extensions.gnome.org/extension/307/dash-to-dock/ +[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/Dash-to-dock-1.png?ssl=1 +[25]: https://oswallpapers.com/category/mac-os/ +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Wallpaper.png?fit=800%2C450&ssl=1 +[27]: https://itsfoss.com/ubuntu-20-04-release-features/ +[28]: https://extensions.gnome.org/extension/1476/unlock-dialog-background/ +[29]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/Lock-screen-background-setting.png?ssl=1 +[30]: https://itsfoss.com/screenshot-login-screen-ubuntu-linux/ +[31]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/Lock-screen-1.png?ssl=1 +[32]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/Login-screen-1.png?ssl=1 +[33]: https://fonts.google.com/specimen/Roboto?query=robot +[34]: https://adobe-fonts.github.io/source-sans-pro/ +[35]: https://itsfoss.com/install-fonts-ubuntu/ +[36]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/Fonts.png?ssl=1 +[37]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Set-fonts.png?ssl=1 +[38]: https://albertlauncher.github.io/ +[39]: https://albertlauncher.github.io/docs/installing/ +[40]: https://itsfoss.com/ubuntu-shortcuts/ +[41]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/Albert-settings.png?ssl=1 +[42]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Albert-look.png?ssl=1 +[43]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/macOS-theme.png?fit=800%2C450&ssl=1 +[44]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/macOS-theme-2.png?fit=800%2C450&ssl=1 diff --git a/published/202006/20200623 Make the switch from Mac to Linux easier with Homebrew.md b/published/202006/20200623 Make the switch from Mac to Linux easier with Homebrew.md new file mode 100644 index 0000000000..f28c5fbf98 --- /dev/null +++ b/published/202006/20200623 Make the switch from Mac to Linux easier with Homebrew.md @@ -0,0 +1,263 @@ +[#]: collector: (lujun9972) +[#]: translator: (nophDog) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12358-1.html) +[#]: subject: (Make the switch from Mac to Linux easier with Homebrew) +[#]: via: (https://opensource.com/article/20/6/homebrew-linux) +[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg) + +Homebrew 让你从 Mac 切换到 Linux 更轻松 +====== + +> 不管你是想要更舒服地从 Mac 搬到 Linux,还是不满意常规的 Linux 包管理器,都可以试试 Homebrew。 + +![](https://img.linux.net.cn/data/attachment/album/202006/28/091127an02f8oae0pln3as.jpg) + +[Homebrew][2] 项目最初是为了给 Mac 用户提供一个非官方的 Linux 式的包管理器。用户很快就爱上了它友好的界面以及帮助性的提示,而且,它已经被移植到 Linux 系统 —— 这看起来像是一个奇怪的命运转折。 + +一开始,有两个分开的项目分别针对 macOS 和 Linux (Homebrew 与 Linuxbrew),但是现在是由 Homebrew 核心管理着这两个操作系统。由于我正 [从 Mac 切换到 Linux][3],所以一直在研究我在 macOS 最常用的开源软件在 Linux 表现如何,最终,我很高兴地发现 Homebrew 对 Linux 的支持太赞了! + +### 为什么要在 Linux 使用 Homebrew 呢? + +长期使用 Linux 的用户对 Homebrew 的第一反应是:“为什么不直接使用……呢”,省略号代表他们喜欢的某个 Linux 包管理器。基于 Debian 的系统早就有了 `apt`,基于 Fedora 的系统则有 `dnf` 和 `yum`,并且像 Flatpak 跟 AppImage 这样的项目,在两种系统上都能流畅运行。我花了不少时间尝试这些技术,不得不说,它们都有其强大之处。 + +那我为什么还要 [坚持使用 Homebrew][4] 呢?首先,我对它非常熟悉。在为我过去使用的专有软件寻找开源替代品的过程中,我已经学会了许多使用方法,而保持一些熟悉的东西,比如 Homebrew,可以让我专注于一次学习一件事情,而不是被不同系统间的差异搞垮。 + +此外,我没有看到哪一个包管理器像 Homebrew 一样,对用户如此友好。正如默认的帮助命令一样,命令井然有序: + +``` +$ brew -h +Example usage: +  brew search [TEXT|/REGEX/] +  brew info [FORMULA...] +  brew install FORMULA... +  brew update +  brew upgrade [FORMULA...] +  brew uninstall FORMULA... +  brew list [FORMULA...] + +Troubleshooting: +  brew config +  brew doctor +  brew install --verbose --debug FORMULA + +Contributing: +  brew create [URL [--no-fetch]] +  brew edit [FORMULA...] + +Further help: +  brew commands +  brew help [COMMAND] +  man brew +  +``` + +过于简短的输出可能会被误解为它功能局限,但是你简单看看每一个子命令,都有很丰富的功能。虽然上面的列表只有短短 23 行,但对高级用户来说,光是子命令 `install` 就包含整整 79 行的帮助信息: + +``` +$ brew --help | wc -l +23 +$ brew install --help | wc -l +79 +``` + +它可以选择忽略或者安装依赖关系,也可以选择用源代码编译以及用什么编译器来编译某个确切的上游 Git 提交,或者选择应用的官方 “灌装” 版。总而言之,Homebrew 即适合新手,也同样能满足老鸟。 + +### 开始在 Linux 使用 Homebrew + +如果你想要试着使用 Homebrew,可以用这个单行脚本在 Mac 或者 Linux 上进行安装: + +``` +$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" +``` + +这条命令会立即开始安装 Homebrew。如果你比较谨慎,可以使用 `curl` 将该文件下载到本地,检查完毕之后再运行。 + +``` +$ curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh --output homebrew_installer.sh +$ more homebrew_installer.sh # 审核该脚本,直到你觉得没问题了 +$ bash homebrew_installer.sh +``` + +对 Linux 的安装步骤还包括如何配置点文件,对于 Debian 系统来说是 `~/.profile`,对于 Fedora 系统是 `~/.bash_profile`。 + +``` +$ test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv) +$ test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile +$ echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile +``` + +为了确认已经安装好,Homebrew 团队提供一个空的 `hello` “秘方” 供测试: + +``` +$ brew install hello +==> Downloading https://linuxbrew.bintray.com/bottles/hello-2.10.x86_64_linux.bottle.tar.gz +######################################################################## 100.0% +==> Pouring hello-2.10.x86_64_linux.bottle.tar.gz +🍺 /home/linuxbrew/.linuxbrew/Cellar/hello/2.10: 52 files, 595.6KB +``` + +看起来安装毫无问题,让我来试试更多操作。 + +### 命令行工具 Brew + +Homebrew 宣称自己是一款默认只 “安装你需要而 [Linux] 没有的东西”的应用程序。 + +你可以用 `brew` 命令安装任何打包在 Homebrew 中的命令行软件。这些包的定义文件叫做 “秘方formula”,而且它们通过“瓶子bottle”来编译并分享。在 Homebrew 的世界里,还有许多 “啤酒方面” 的术语,但这个包管理器主要目的是让软件便于使用。 + +都有些什么样的软件呢?对我这样的技术玩家(既然你已经在读这篇文章,估计你也是)来说最方便的东西。例如,便利的 `tree` 命令,可以展示目录结构,或者 `pyenv`,我用它来 [在 Mac 管理不同版本 Python][5]。 + +你可以用 `search` 命令查看所有可以安装的“秘方”,在后面加上 `wc` 命令看看一共有多少: + +``` +# -l 选项统计行数 +$ brew search | wc -l +    5087 +``` + +迄今为止,一共有 5000 多个 “秘方”,这囊括了很多软件。需要注意的是:并非所有 “秘方” 都能在 Linux 运行。在 `brew search --help` 输出中有一节提到可以按软件运行的操作系统来筛选软件。它会在浏览器打开用于每个操作系统的软件仓库。我运行的是 Fedora,所以我会用它来试一试: + +``` +$ brew search --fedora tree +``` + +浏览器打开了网址 `https://apps.fedoraproject.org/packages/s/tree`,向我展示了所有 Fedora 的可用选项。你也可以通过其它方法进行浏览。“秘方” 被集中整理到由操作系统划分的核心仓库当中(Mac 在 [Homebrew Core][6],Linux 在 [Linux Core][7])。同样也可以通过 Homebrew API [在网页显示][8]。 + +即使有这些选择,我还是通过其它用户的推荐找到很多新工具。我列出一些我最喜欢的工具,你可以在里面找点灵感: + + * `pyenv`、`rbenv` 和 `nodenv` 用来管理(相应的) Python、Ruby 和 Node.js 版本 + * `imagemagick` 用于脚本化编辑图片 + * `pandoc` 用于脚本化转换文档格式(我通常将 .docx 文件转成 .md 或者 .html) + * `hub` 为 GitHub 用户提供 [更好的 Git 体验][9] + * `tldr` 展示了命令工具的使用范例 + +想要深入了解 Homebrew,可以去 [trldr 页面][10] 看看,比起应用的 man 页面,它要友好得多。使用 `search` 命令确认你可以安装: + +``` +$ brew search tldr +==> Formulae +tldr ✔ +``` + +太好了!对勾说明你可以安装。那么继续吧: + +``` +$ brew install tldr +==> Downloading https://linuxbrew.bintray.com/bottles/tldr-1.3.0_2.x86_64_linux.bottle.1.tar.gz +######################################################################## 100.0% +==> Pouring tldr-1.3.0_2.x86_64_linux.bottle.1.tar.gz +🍺 /home/linuxbrew/.linuxbrew/Cellar/tldr/1.3.0_2: 6 files, 63.2KB +``` + +Homebrew 提供了编译好的二进制文件,所以你不必在本地机器上从源码编译。这能节省很多时间,也不用听 CPU 风扇的噪声。我很欣赏 Homebrew 的另外一点是,你不完全理解每一个选项的含义也不会影响正常使用。若你想自己编译,可以在 `brew install` 命令后面加上 `-s` 或者 `--build-from-source` 标识,这样就能从源码编译 “秘方”(即便已经有一个 “瓶子” 存在)。 + +同样,软件底层的复杂性也很有意思。使用 `info` 可以查看 `tldr` 软件的依赖管理,“秘方” 的源代码存放在磁盘上的何处,甚至还能查看公开分析。 + +``` +$ brew info tldr +tldr: stable 1.3.0 (bottled), HEAD +Simplified and community-driven man pages +https://tldr.sh/ +Conflicts with: + tealdeer (because both install `tldr` binaries) +/home/linuxbrew/.linuxbrew/Cellar/tldr/1.3.0_2 (6 files, 63.2KB) * + Poured from bottle on 2020-06-08 at 15:56:15 +From: https://github.com/Homebrew/linuxbrew-core/blob/master/Formula/tldr.rb +==> Dependencies +Build: pkg-config ✔ +Required: libzip ✔, curl ✔ +==> Options +--HEAD + Install HEAD version +==> Analytics +install: 197 (30 days), 647 (90 days), 1,546 (365 days) +install-on-request: 197 (30 days), 646 (90 days), 1,546 (365 days) +build-error: 0 (30 days) +``` + +### 从 Mac 到 Linux 的一点不足 + +在 macOS,Homebrew 的 `cask`(“酒桶”)子命令可以让用户使用命令行安装、管理整个应用软件。不幸的是,`cask` 还不能在任何 Linux 发行版上使用。我在安装一个开源工具时发现了这点: + +``` +$ brew cask install tusk +Error: Installing casks is supported only on macOS +``` + +我在 [论坛上][11] 问了一下,很快得到其他用户的反馈。总结一下,方案如下: + +* 复刻 Homebrew 项目,构建这个特性,然后像别人展示其价值 +* 给该软件写一个 “秘方”,然后从源代码编译 +* 为该软件创建一个第三方仓库 + +最后一个是我最感兴趣的。Homebrew 通过 [创建并维护 “水龙头tap”][12] (另一个受啤酒影响的术语)管理第三方仓库。随着你对系统越来越熟悉,并想加入生态系统, “水龙头” 是值得研究的。 + +### 备份 Homebrew 的安装记录 + +我最中意的 Homebrew 特性之一就是你可以像其它任何 [用版本控制工具来备份点文件][13] 一样备份你的安装记录。为了实现这个目的,Homebrew 提供 `bundle`(“捆扎”)子命令,它可以控制一个叫 `dump`(“倾倒”)的子命令生成一个 `Brewfile`。这个文件包含你目前所有安装的工具列表,可以重复使用。进入你想使用的目录然后运行命令,它会根据你所安装的软件生成 `Brewfile`: + +``` +$ cd ~/Development/dotfiles # This is my dotfile folder +$ brew bundle dump +$ ls Brewfile +Brewfile +``` + +当我换了一台机器,想要安装一样的软件时,进入含有 `Brewfile` 的文件夹,然后重新安装: + +``` +$ ls Brewfile +Brewfile +$ brew bundle +``` + +它会在我的新机器上安装所有列出的 “秘方”。 + +#### 在 Mac 和 Linux 同时管理 Brewfile + +`Brewfile` 非常适合备份你目前的安装记录,但是如果某些在 Mac 上运行的软件无法运行在 Linux 呢?或者刚好相反?我发现不管是 Mac 还是 Linux,如果软件无法在当前操作系统运行,Homebrew 会优雅地忽略那一行。如果它遇到不兼容的请求(比如使用 `brew` 在 Linux 安装 “酒桶cask” 时),它会选择跳过,继续安装过程: + +``` +$ brew bundle --file=Brewfile.example + +Skipping cask licecap (on Linux) +Skipping cask macdown (on Linux) +Installing fish +Homebrew Bundle complete! 1 Brewfile dependency now installed. +``` + +为了保持配置文件的简洁,我在两个操作系统上使用同一份 `Brewfile`,因为它只安装与操作系统相关的版本,所以我一直没有遇到任何问题。 + +### 使用 Homebrew 管理软件包 + +Homebrew 已经成了我必备的命令行工具,由于我很熟悉它,所以在 Linux 上的体验也充满乐趣。Homebrew 让我的工具井然有序,并且时刻保持更新,我愈发欣赏它在实用性与功能上找到的平衡点。我更喜欢将软件包管理的细节保持在用户需要了解的最小程度,大多数人都会从中受益。如果你已经很熟悉 Linux 包管理器了,Homebrew 可能会让你觉得很基础,但稍微深入一点看,就会发现它的高级选项远远超过本文的内容。 + +对 Linux 用户来说,他们有很多包管理器可以选择。如果你来自 MacOS,Homebrew 会让你宾至如归。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/homebrew-linux + +作者:[Matthew Broberg][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://opensource.com/users/mbbroberg +[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://brew.sh/ +[3]: https://opensource.com/article/19/10/why-switch-mac-linux +[4]: https://opensource.com/article/20/6/homebrew-mac +[5]: https://opensource.com/article/20/4/pyenv +[6]: https://github.com/Homebrew/homebrew-core +[7]: https://github.com/Homebrew/linuxbrew-core +[8]: https://formulae.brew.sh/formula/ +[9]: https://opensource.com/article/20/3/github-hub +[10]: https://github.com/tldr-pages/tldr +[11]: https://discourse.brew.sh/t/add-linux-support-to-existing-cask/5766 +[12]: https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap +[13]: https://opensource.com/article/19/3/move-your-dotfiles-version-control diff --git a/published/202006/20200624 Customize your Raspberry Pi operating system for everyday use.md b/published/202006/20200624 Customize your Raspberry Pi operating system for everyday use.md new file mode 100644 index 0000000000..52fc766db8 --- /dev/null +++ b/published/202006/20200624 Customize your Raspberry Pi operating system for everyday use.md @@ -0,0 +1,107 @@ +[#]: collector: (lujun9972) +[#]: translator: (Yufei-Yan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12365-1.html) +[#]: subject: (Customize your Raspberry Pi operating system for everyday use) +[#]: via: (https://opensource.com/article/20/6/custom-raspberry-pi) +[#]: author: (Patrick H. Mullins https://opensource.com/users/pmullins) + +定制用于日常使用的树莓派系统 +====== + +> 安装精简版树莓派系统,让你的树莓派更加轻盈。 + +![](https://img.linux.net.cn/data/attachment/album/202006/30/133836pfm4u3sq073ffmbf.jpg) + +你有一个运行[树莓派系统][2]Raspberry Pi OS(以前称为 Raspbian)操作系统的树莓派Raspberry Pi,你肯定知道,它是一个非常棒的小型电脑,有一个很好的操作系统,对于初学者来说,它包括了你可能想要的一切。然而,一旦你熟悉了它,并且想用它干一些别的事情的时候,你可能不想要那个默认囊括了一切组件的操作系统。 + +在这种情况下,你两个选择:要么你可以绞尽脑汁地把所有你不需要的东西都删干净,要么你还可以用精简版树莓派系统Raspberry Pi OS Lite来构建专门为你的需求而定制的轻量级操作系统。我的建议是,用第二种方法,既简便又节省时间。 + +### Raspberry Pi OS Lite + +“精简版Lite”的树莓派系统Raspberry Pi OS其实没什么特别的,就是一个基于最新版本的 [Debian][3] 的最小化镜像。这个镜像仅包含了操作系统核心和启动到命令行的部分,而不会进入图形桌面。可以将这个作为你的定制树莓派系统的基础。这之后的所有东西都是建立在这个核心之上的。 + +前往树莓派基金会的网站上[下载][2]这个轻量级镜像。下载完成后,查看详细的[安装指南][4],这里面介绍了在 Linux、Windows 或者 macOS 下如何烧制树莓派操作系统的 SD 卡。 + +如果你计划用树莓派作为一个极简系统来运行一些脚本和服务的话,差不多这么多就够了。如果你还想干更多事,那继续往下读。 + +### X Window + +首先,如果偶尔需要通过图形用户界面(GUI)连接到你的树莓派,安装一个窗口系统还是不错的。 + +[X Window 系统][5],有时候称为 X11,是 Unix 操作系统上一个常见的基本窗口系统。X11 提供了一套 GUI 桌面环境的基本框架。它可以让你通过窗口、鼠标和键盘与计算机交互。 + +#### 安装 X Window + +下面这一行安装了能让 X11 运行的最少的包。 + +``` +sudo apt install -y --no-install-recommends xserver-xorg-core xserver-xorg xfonts-base xinit +``` + +如果使用 `--no-install-recommends`,则只安装了主要的一些依赖(`Depends` 字段中的包)。这样可以节省很多空间,因为没有安装那些建议却不一定需要的包。 + +### 进阶:使用 Xfce 桌面环境 + +如果你愿意,可以就此停下了,然后开始使用 X Window 作为你的桌面。不过,我并不建议这么做。X Window 自带的这种最小化的窗口管理工具走的是极简主义风格,某种程度上让人感觉过时了。相反,我建议安装现代化的桌面环境,比如说像 Xfce、GNOME 或者 KDE。当用在微型计算机上时,我更倾向于 [Xfce][6] 而不是其他的,因为它就是为资源有限的系统设计的,而且你可以通过主题、图标或者其他东西对它进行定制。 + +#### 安装 Xfce + +安装 Xfce 桌面环境相当简单。只需要: + +``` +sudo apt install -y --no-install-recommends xfce4 desktop-base lightdm +``` + +这就够了。你现在安装了 X Window(X11)和 Xfce 了。现在是时候来定制一下环境并且安装一些核心应用了。 + +### 核心应用 + +目前为止,你已经安装了 X Window(X11)、Xfce 桌面环境和 LightDM(一个 Xfce 自带的显示管理器)。现在,你已经有了一个可以启动并且正常使用的轻量级的完整系统。不过,在彻底完成之前,我还是喜欢装一些核心应用。 + +下面这条命令安装了一个终端程序、[Audacious][7] 音频播放器、[Ristretto][8] 图像浏览器、[Mousepad][9] 文本编辑器、[File Roller][10] 存档管理器和 [Thunar][11] 容量管理器。 + +``` +sudo apt install -y --no-install-recommends xfce4-terminal audacious ristretto +sudo apt install -y --no-install-recommends mousepad file-roller thunar-volman +``` + +#### 其他可选项 + +其他一些你可能想安装的东西,包括一个好的网络管理器、任务管理器、PDF 阅读器和通知工具,以及桌面背景管理器、截图工具、一些新的图标和光标主题。简单来说,如果树莓派是你的首选系统,这些都算是日常工作的一些补充。 + +``` +sudo apt install -y --no-install-recommends network-manager xfce4-taskmanager xfce4-notifyd +sudo apt install -y --no-install-recommends  xpdf gnome-icon-theme dmz-cursor-theme +``` + +### 下一步该做什么? + +如果一切都正常工作的话,你现在就有一个基于 Xfce 和 Debian Lite 超轻量级操作系统的树莓派了。我建议现在你去 Xfce 网站上查看其它很酷的好东西,这些你都可以安装并使用。下一步做什么完全由你决定! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/custom-raspberry-pi + +作者:[Patrick H. Mullins][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/pmullins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/raspberrypi_cartoon.png?itok=m3TcBONJ (Cartoon graphic of Raspberry Pi board) +[2]: https://www.raspberrypi.org/downloads/raspberry-pi-os/ +[3]: https://www.debian.org/ +[4]: https://www.raspberrypi.org/documentation/installation/installing-images/README.md +[5]: https://en.wikipedia.org/wiki/X_Window_System +[6]: http://xfce.org +[7]: https://audacious-media-player.org/ +[8]: https://docs.xfce.org/apps/ristretto/start +[9]: https://github.com/codebrainz/mousepad +[10]: https://gitlab.gnome.org/GNOME/file-roller +[11]: https://docs.xfce.org/xfce/thunar/thunar-volman +[12]: https://goodies.xfce.org/ diff --git a/published/202007/20180730 50 Best Ubuntu Apps You Should Be Using Right Now.md b/published/202007/20180730 50 Best Ubuntu Apps You Should Be Using Right Now.md new file mode 100644 index 0000000000..3c9039e20f --- /dev/null +++ b/published/202007/20180730 50 Best Ubuntu Apps You Should Be Using Right Now.md @@ -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/ diff --git a/published/202007/20190213 How to build a WiFi picture frame with a Raspberry Pi.md b/published/202007/20190213 How to build a WiFi picture frame with a Raspberry Pi.md new file mode 100644 index 0000000000..6e66448709 --- /dev/null +++ b/published/202007/20190213 How to build a WiFi picture frame with a Raspberry Pi.md @@ -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 diff --git a/published/202007/20190624 Book Review- A Byte of Vim.md b/published/202007/20190624 Book Review- A Byte of Vim.md new file mode 100644 index 0000000000..d0cbb158b6 --- /dev/null +++ b/published/202007/20190624 Book Review- A Byte of Vim.md @@ -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 diff --git a/published/202007/20190702 One CI-CD pipeline per product to rule them all.md b/published/202007/20190702 One CI-CD pipeline per product to rule them all.md new file mode 100644 index 0000000000..b093c265ef --- /dev/null +++ b/published/202007/20190702 One CI-CD pipeline per product to rule them all.md @@ -0,0 +1,133 @@ +[#]: collector: (lujun9972) +[#]: translator: (chunibyo-wly) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12392-1.html) +[#]: subject: (One CI/CD pipeline per product to rule them all) +[#]: via: (https://opensource.com/article/19/7/cicd-pipeline-rule-them-all) +[#]: author: (Willy-Peter Schaub https://opensource.com/users/wpschaub/users/bclaster/users/matt-micene/users/barkerd427) + +使用一条 CI/CD 流水线管理所有的产品 +====== + +> 统一的持续集成与持续交付的流水线的构想是一种梦想吗? + +![](https://img.linux.net.cn/data/attachment/album/202007/07/224752iib7xgh7icr8478f.jpg) + +当我加入 WorkSafeBC 负责云端运维和工程流程优化的云端运维团队时,我和大家分享了我的梦想,那就是一个工具化的流水线,每一个产品都可以持续集成和持续交付。 + +根据 Lukas Klose 的说法,[流程][2]flow(在软件工程的语境内)是“软件系统以稳定和可预测的速度创造价值的状态”。我认为这是最大的挑战和机遇之一,特别是在复杂的新兴解决方案领域。我力求通过一种持续、高效和优质的解决方案,提供一种持续交付模式,并且能够构建正确的事物让我们的用户感到满意。想办法把我们的系统分解成更小的碎片,这些碎片本身是有价值的,使团队能够渐进式地交付价值。这需要业务和工程部门改变思维方式。 + +### 持续集成和持续交付的(CI/CD)流水线 + +CI/CD 流水线是一种 DevOps 实践,用于更频繁、一致、可靠的地交付代码变更。它可以帮助敏捷开发团队提高**部署频率**,减少**变更准备时间**、**变更失败率**和关键绩效指标(KPI)的**平均恢复时间**,从而提高质量并且实现更快的交付。唯一的先决条件就是坚实的开发流程、对质量的心态和对需求从构想到废弃的责任心,以及一个全面的流水线(如下图所示)。 + +![Prerequisites for a solid development process][3] + +它简化了工程流程和产品,以稳定基础架构环境;优化工作流程;并创建一致的、可重复的、自动化的任务。正如 Dave Snowden 的 [Cynefin Sensemaking][4] 模型所说的那样,这样就允许我们将复杂不可解决的任务变成了复杂可解决的任务,降低了维护成本,提高了质量和可靠性。 + +精简流程的一部分是将 [浪费实践类型][5]wasteful practice types Muri(过载)、Mura(变异)和 Muda(浪费)的浪费降低最低。 + + * **Muri(过载)**:避免过度工程化,避免与商业价值不相关的功能以及过多的文档。 + * **Mura(变异)**:改善审批和验证流程(比如,安全签批);推动 [左移提前][6]shift-left 策略以推行单元测试、安全漏洞扫描与代码质量检查;并改进风险评定。 + * **Muda(浪费)**:避免技术债、错误或前期的详细文档等浪费。 + +看起来 80% 的重点都集中在提供一种可以集成和协作的工程产品上,这些系统可以采用一个创意和计划、开发、测试和监控你的解决方案。然而,一个成功的转型和工程系统是由 5% 的产品、15% 的过程和 80% 的开发人员组成的。 + +我们可以使用的产品有很多。比如,Azure DevOps 为持续集成(CI)、持续交付(CD)和可扩展性提供了丰富支持,并与 Stryker、SonarQube、WhiteSource、Jenkins 和 Octopus 等开源集成和商用成品(COTS)软件即服务(SaaS)进行集成。对于工程师来说,关注产品总是一种诱惑,但请记住,它们只是我们旅程的 5%。 + +![5% about products, 15% about process, 80% about people][7] + +最大的挑战是打破数十年的规则、规定和已经步入舒适区的流程:“*我们一直都是这样做的;为什么需要改变呢?*” + +开发和运维人员之间的摩擦导致了各种支离破碎的、重复的、不间断的集成和交付流水线。开发人员希望能访问所有东西,以便持续迭代,让用户使用起来和持续地快速发布。运维人员希望将所有东西锁起来,保护业务、用户和品质。这些矛盾在不经意间导致了很难做到一种自动化的流程,进而导致发布周期晚于预期。 + +让我们使用最近的一次白板讨论中的片段来探索流水线。 + +想要支持流水线的变化是一项困难并且花费巨大的工作;版本和可追溯性的不一致使得这个问题变得更加复杂,因此不断精简开发流程和流水线是一项挑战。 + +![Improving quality and visibility of pipelines][8] + +我主张一些原则使得每个产品都能使用通用流水线: + + * 使一切可自动化的东西都自动化 + * 一次构建 + * 保持持续集成和持续交付 + * 保持持续精简和改进 + * 保持一个构建的定义 + * 保持一个发布流水线的定义 + * 尽早、频繁地扫描漏洞,并且*尽快失败* + * 尽早、频繁地进行测试,并且*尽快失败* + * 保持已发布版本的可追踪和监控 + +但是,如果我要打破这些,最重要的原则就是*保持简单*。如果你不能说明流水线化的原因(是什么、为什么)和过程(如何),你或许是不了解自己的软件过程的。我们大多数人想要的不是最好的、超现代的和具有革命意义的流水线 —— 我们仅仅是需要一个功能强大的、有价值的和能促进工程的流水线。首先需要解决的是那 80% —— 文化、人员和他们的心态。请你的 CI/CD 骑士们穿上闪亮的盔甲,在他们的盾牌上贴上 TLA(两个/三个字母的缩写two/three-lettered acronym)符号,加入到实践和经验工程的力量中来。 + +### 统一流水线 + +让我们逐步完成我们的白板会议实践。 + +![CI build/CD release pipeline][9] + +每个应用使用一套构建定义来定义一个 CI/CD 流水线,用来触发*拉取请求的预合并验证*与*持续集成*的构建。生成一个带有调试信息的*发布*的构建,并且将其上传到 [符号服务器][10]。这使开发人员可以在本地和远程生产环境进行调试,而在不用考虑需要加载哪个构建和符号,符号服务器为我们施展了这样的魔法。 + +![Breaking down the CI build pipeline][11] + +在构建过程中进行尽可能多的验证(*左移提前*),这允许开发新特性的团队可以尽快失败,不断的提高整体的产品质量,并在拉取请求中为代码审核人员提供宝贵证据。你喜欢有大量提交的拉取请求吗?还是一个带有少数提交和提供了漏洞检查、测试覆盖率、代码质量检查和 [Stryker][12] 突变残余等支持的拉取请求?就我个人而言,我投后者的票。 + +![Breaking down the CD release pipeline][13] + +不要使用构建转换来生成多个特定环境的构建。通过一个构建实现*发布时转换*、*标记化*和 XML/JSON 的*值替换*。换句话说,*右移滞后*具体环境的配置。 + +![Shift-right the environment-specific configuration][14] + +安全存储发布配置数据,并且根据数据的*信任度*和*敏感度*,让开发和运维都能使用。使用开源的密钥管理工具、Azure 密钥保险库、AWS 密钥管理服务或者其他产品,记住你的工具箱中有很多方便的工具。 + +![Dev-QA-production pipeline][15] + +使用*用户组*而不是*用户*,将审批人管理从跨多个流水线的多个阶段移动到简单的组成员。 + +![Move approver management to simple group membership][16] + +创建一条流水线并且对赋予特定的交付阶段的权限,而不是重复流水线让团队进入他们感兴趣的地方。 + +![Pipeline with access to specific delivery stages][17] + +最后,但并非最不重要的是,拥抱拉取请求,以帮助提高对代码仓库的洞察力和透明度,增进整体质量、协作,并将预验证构建发布到选定的环境,比如,开发环境。 + +这是整个白板更正式的视图。 + +![The full pipeline][18] + +所以,你对 CI/CD 流水线有什么想法和经验?我的通过*一条流水线来管理它们*的这个梦想是空想吗? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/7/cicd-pipeline-rule-them-all + +作者:[Willy-Peter Schaub][a] +选题:[lujun9972][b] +译者:[chunibyo-wly](https://github.com/chunibyo-wly) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/wpschaub/users/bclaster/users/matt-micene/users/barkerd427 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=RPkPPtDe (An intersection of pipes.) +[2]: https://continuingstudies.sauder.ubc.ca/courses/agile-delivery-methods/ii861 +[3]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-2.png (Prerequisites for a solid development process) +[4]: https://en.wikipedia.org/wiki/Cynefin_framework +[5]: https://www.lean.org/lexicon/muda-mura-muri +[6]: https://en.wikipedia.org/wiki/Shift_left_testing +[7]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-3.png (5% about products, 15% about process, 80% about people) +[8]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-4_0.png (Improving quality and visibility of pipelines) +[9]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-5_0.png (CI build/CD release pipeline) +[10]: https://en.wikipedia.org/wiki/Microsoft_Symbol_Server +[11]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-6.png (Breaking down the CI build pipeline) +[12]: https://stryker-mutator.io/ +[13]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-7.png (Breaking down the CD release pipeline) +[14]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-8.png (Shift-right the environment-specific configuration) +[15]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-9.png (Dev-QA-production pipeline) +[16]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-10.png (Move approver management to simple group membership) +[17]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-11.png (Pipeline with access to specific delivery stages) +[18]: https://opensource.com/sites/default/files/uploads/devops_pipeline_pipe-12.png (The full pipeline) diff --git a/published/202007/20190808 Sending custom emails with Python.md b/published/202007/20190808 Sending custom emails with Python.md new file mode 100644 index 0000000000..d27fc38226 --- /dev/null +++ b/published/202007/20190808 Sending custom emails with Python.md @@ -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 + + +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}} + + +<> +``` + +模板的起头定义了邮件的接收者、发送者和主题。在空行之后,是邮件的内容。该邮件需要从 `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 +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 + + +<> + + +>>> 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 +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 +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 + + +<> + + +>>> 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 +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 %} + + +<> + + +$ 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 diff --git a/published/202007/20191031 4 Python tools for getting started with astronomy.md b/published/202007/20191031 4 Python tools for getting started with astronomy.md new file mode 100644 index 0000000000..e197bd3721 --- /dev/null +++ b/published/202007/20191031 4 Python tools for getting started with astronomy.md @@ -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 工具包竟然演进到如此好用,任何人都可以轻松编写 [数据还原][9]data reduction 脚本,产生出高质量的数据产品。天文数据易于获取,而且大部分是可以公开使用的,你要做的只是去寻找相关数据。 + +比如,负责 VLT 运行的 ESO,直接在他们的网站上提供数据下载服务,只要访问 [www.eso.org/UserPortal][10] 并在首页创建用户就可以享有数据下载服务。如果你需要 SPHERE 数据,可以下载附近任何一个包含系外行星exoplanet或者原恒星盘proto-stellar discs的恒星的全部数据集。对任何 Python 高手而言,通过还原数据发现深藏于噪声中的行星或者原恒星盘,实在是件令人兴奋的事。 + +我鼓励你下载 ESO 或其它天文影像数据,开启你的探索历程。这里提供几条建议: + +1. 首先要有一个高质量的数据集。看一些有关包含系外行星或者原恒星盘的较近恒星的论文,然后在 之类的网站检索数据。需要注意的是,前述网站上的数据有的标注为红色,有的标注为绿色,标注为红色的数据是尚未公开的,在相应的“发布日期”处会注明数据将来公开的时间。 +2. 了解一些用于获取你所用数据的仪器的信息。尽量对数据的获取有一个基本的理解,对标准的数据还原之后应该是什么样子做到心中有数。所有的望远镜和仪器都有这方面的文档供公开获取。 +3. 必须考虑天文数据的标准问题,并予以校正: + + 1. 数据以 FITS 格式文件保存。需要使用 `pyfits` 或者 `astropy` (包含 `pyfits` )将其读入到 `NumPy` 数组。有些情况下,数据是三维的,需要沿 z 轴使用 `numpy.median` 将数据转换为二维数组。有些 SPHERE 数据在同一幅影像中包含了同一片天空的两份拷贝(各自使用了不同的滤波器),这时候需要使用 **索引** 和 **切片** 将它们分离出来。 + 2. 全黑图master dark坏点图bad pixel map。所有仪器都有快门全关(完全无光)状态拍摄的特殊图片,使用 **NumPy 掩膜数组** 从中分离出坏点图。坏点图非常重要,你在合成最终的清晰图像过程中,需要持续跟踪坏点。有些情况下,这还有助于你从原始科学数据中扣除暗背景的操作。 + 3. 一般情况下,天文仪器还要拍标准响应图master flat frame。这是对均匀的单色标准光源拍摄的一张或者一组图片。你需要将所有的原始数据除以标准响应之后再做后续处理(同样,使用 Numpy 掩膜数组实现的话,这仅仅是一个简单的除法运算)。 + 4. 对行星影像,为了使行星在明亮恒星背景下变得可见,需要仰仗日冕仪coronagraph角差分成像angular differential imaging技术。这一步需要识别影像的光学中心,这是比较棘手的环节之一,过程中要使用 `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 diff --git a/published/202007/20200103 What you need to know about Rust in 2020.md b/published/202007/20200103 What you need to know about Rust in 2020.md new file mode 100644 index 0000000000..50a2b02f43 --- /dev/null +++ b/published/202007/20200103 What you need to know about Rust in 2020.md @@ -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 diff --git a/published/202007/20200428 Open source has room for everyone.md b/published/202007/20200428 Open source has room for everyone.md new file mode 100644 index 0000000000..38fe8f56fd --- /dev/null +++ b/published/202007/20200428 Open source has room for everyone.md @@ -0,0 +1,73 @@ +[#]: collector: (lujun9972) +[#]: translator: (guevaraya) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12399-1.html) +[#]: subject: (Open source has room for everyone) +[#]: via: (https://opensource.com/article/20/4/interview-Megan-Byrd-Sanicki) +[#]: author: (Jay Barber https://opensource.com/users/jaybarber) + +开源代码广阔天地造福人类 +====== + +> 了解 2020 年开源社区女性奖获得者 Megan Byrd-Sanicki 如何将人们聚集在一起。 + +![蒲公英般浮于水面][1] + +“在成长的过程中,我曾经有点像陆军元帅,” 2020 年[开源社区女性奖获得者][2] Megan Byrd-Sanicki 笑着说。“我总是那个把同学们拉到一起的人。‘大家来吧,我们告诉你们规则。’我也会注意旁听,尝试找出没有被接纳进来的人,并把他们拉进圈子。” + +![Megan Sanicki 的照片, 已经许可使用][3] + +这种将人们聚集在一起,并为他们建立一个组织,让他们表现出色的动力贯穿了她的大部分职业生涯和社区工作。“我回想起二年级体育课上的我,不得不承认,今天的我依然是这样的人。” + +作为第一任 [Drupal 协会][4]执行主任,Megan 十年来活跃于开源社区,现在是谷歌开源项目办公室的研发和运营主管。“我很幸运能担任这个职位,因为它可以让我看到谷歌 2000 多个不同目标、不同治理结构、不同策略的开源项目。这个也是难得的学习机会。” Megan 最近被推选为 [开源代码促进会][5]的董事会成员,她努力加强该组织为全球项目和企业提供的开源领导力。 + +### 从地下室台阶上学到的知识 + +Megan 原以为她会从商,远离循规的技术。坐在地下室台阶上,耳濡目染父亲的销售电话,到 16 岁时候就知道父亲的所有产品系列,也熟悉了其他知识。 + +“我从父亲学到了做生意就是解决问题和帮助别人” Megan 说。“在我的职业生涯这个信念我始终放在第一位。在某些角度看选择这条路我并不觉得奇怪;这是我个人选择的自然延伸,但它也把我带到了我从未梦想过的地方。” + +开源事业对 Megan 不仅仅是一个职业;她在她的社区活动中也使用同样的理念。“现在,我正在与 [Covid Act Now][6] 的一大群优秀的工程师、数据科学家以及流行病科学家合作。团队成员是义务提供他们的专业知识,公开合作,为政府公共人员提供数据建模,以便他们快速的做出有效的决策。” + +她也活跃于 [FOSS Responders][7],这是一个为受 COVID-19 事件影响的开源项目和社区成员点亮温暖的组织。“在疫情期间,项目很难得到他们需要的帮助。我们可以帮忙需要帮忙的组织和个人扩散他们的请求。”这个组织的一个重要的事务是管理 [FOSS Responders 基金][7],这是一个寻求开源项目基金的融资需求的机制,避免社区衰亡。 + +### 在这不断变化的世界中一群可爱的人 + +影响 Megan 参与到社区的两个宗旨分别是对开源的明确承诺和把大家团结在一起的动力。“人们有梦想的时候,他们就积极的去实现它,这就造就了共同的信念和强烈的 ‘为什么’。人们很容易围绕着‘为什么’参与其中。我知道我是这样做的。” Megan 在被问到她这么努力时说到。 + +“不管是帮助 Drupal 基金会筹集资金的任务还是赋能开源项目可持续发展,都会对人类产生真正的影响。帮助人们达到他们的目标,实现他们的梦想和愿景,而我也实实在在感受到收获这种蝴蝶效应般的热情。” + +开源技术在技术领域占的比重越来越大,Megan 对未来抱有很大希望。“令人兴奋的是故事还没有结束。作为一个社区,我们还在摸索,”她说:“关于开源,我们需要学习的东西太多了,我们的外部环境不断发生变化,它可以以多种方式发展,同时我们周围的环境也在变化。我们需要正确的对话,并找出如何共同发展的方法。确保每个人都有一席之地。” + +用她的话说,这些都是经常从她的父亲生意电话里听到的感悟,做生意就是解决问题并帮助别人。“帮助更多的人学习如何使用和贡献开源来解决问题,的确是一件有益的事情。不管是推动创新,提升效率,还是实现业务目标,有很多方法可以从开源中获得价值。” + +### 属于你的荣耀 + +当被问到对其他想参与到开源社区的女性有哪些建议时,Megan 兴奋的说:“请记住,在开源社区,所有人都有一席之地。这可能会让人望而生畏,但是从我的经验来看,人们都想帮忙。当你需要帮助的时候,就寻求帮助,但也要清楚你能在哪里做出贡献,如何做出贡献,以及你的需求是什么。” + +她也认识到,在开源领域的所有声音中,有时会感觉到缺乏集中的领导力,但她提醒不要把它看成是一种只留给少数人的特权角色。“做你期望的领导者。当社区领导角色空缺时,每个个体可以自己填补空缺。每一个开源的贡献者都是领导者,不管是领导他人,领导社区,甚至领导自己。不要等待被动赋予属于你的权力和精彩。” + +对 Megan 来说,开源之旅就如:一个前途不明朗的心路之旅。尽管如此,对风险和未来的不确定性她从不逃避。“我把生命看作一张你正在编织的美丽挂毯,日复一日,你仅仅看到后面的线头。如果你可以看到全貌,你将意识到,你只要每天尽自己最大的努力,就会以无数的方式为这个美好的作品做出贡献。” + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/interview-Megan-Byrd-Sanicki + +作者:[Jay Barber][a] +选题:[lujun9972][b] +译者:[guevaraya](https://github.com/guevaraya) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jaybarber +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/dandelion_blue_water_hand.jpg?itok=QggW8Wnw (Dandelion held out over water) +[2]: https://www.redhat.com/en/about/women-in-open-source +[3]: https://opensource.com/sites/default/files/uploads/megan_sanicki_headshot_small_0.png (Photo by Megan Sanicki, Used with permission) +[4]: https://www.drupal.org/association +[5]: https://opensource.org/ +[6]: https://www.covidactnow.org/ +[7]: https://fossresponders.com/ +[8]: https://opensource.com/article/20/4/interview-Netha-Hussain diff --git a/published/202007/20200514 What is IoT- The internet of things explained.md b/published/202007/20200514 What is IoT- The internet of things explained.md new file mode 100644 index 0000000000..00ed2a05ef --- /dev/null +++ b/published/202007/20200514 What is IoT- The internet of things explained.md @@ -0,0 +1,155 @@ +[#]: collector: (lujun9972) +[#]: translator: (Yufei-Yan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12411-1.html) +[#]: subject: (What is IoT? The internet of things explained) +[#]: via: (https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html) +[#]: author: (Josh Fruhlinger https://www.networkworld.com/author/Josh-Fruhlinger/) + +物联网(IoT)简介 +====== + +> 物联网(IoT)是一个由智能设备连接起来的网络,并提供了丰富的数据,但是它也有可能是一场安全领域的噩梦。 + +![](https://img.linux.net.cn/data/attachment/album/202007/13/144427tnrjnnh686n5kgtn.jpg) + +物联网Internet of Things(IoT)是一个统称,指的是越来越多不属于传统计算设备,但却连接到互联网接收或发送数据,或既接收也发送的电子设备组成的网络。 + +现在有数不胜数的东西可以归为这一类:可以联网的“智能”版传统设备,比如说电冰箱和灯泡;那些只能运行于有互联网环境的小设备,比如像 Alexa 之类的电子助手;与互联网连接的传感器,它们正在改变着工厂、医疗、运输、物流中心和农场。 + +### 什么是物联网? + +物联网将互联网、数据处理和分析的能力带给了现实的实物世界。对于消费者来说,这就意味着不需要键盘和显示器这些东西,就能和这个全球信息网络进行互动;他们的日常用品当中,很多都可以通过该网络接受操作指令,而只需很少的人工干预。 + +互联网长期以来为知识工作提供了便利,在企业环境当中,物联网也能为制造和分销带来同样的效率。全球数以百万计甚至数十亿计的嵌入式具有互联网功能的传感器正在提供令人难以置信丰富的数据集,企业可以利用这些数据来保证他们运营的安全、跟踪资产和减少人工流程。研究人员也可以使用物联网来获取人们的喜好和行为数据,尽管这些行为可能会严重影响隐私和安全。 + +### 它有多大? + +一句话:非常庞大。[Priceonomics 对此进行了分析][2]:在 2020 年的时候,有超过 50 亿的物联网设备,这些设备可以生成 4.4 泽字节zettabyte(LCTT 译注:1 zettabyte = 109 terabyte = 1012 gigabyte)的数据。相比较,物联网设备在 2013 年仅仅产生了 1000 亿千兆字节gigabyte的数据。在物联网市场上可能挣到的钱也同样让人瞠目;到 2025 年,这块市场的价值可以达到 1.6 万亿美元到 14.4 万亿美元不等。 + +### 物联网的历史 + +一个联网设备和传感器无处不在的世界,是科幻小说中最经典的景象之一。物联网传说中将 1970 年 [卡耐基•梅隆大学的一台连接到 APRANET 的自动贩卖机][3] 称之为世界上第一个物联网设备,而且许多技术都被吹捧为可以实现 “智能” 的物联网式特征,使其颇具有未来主义的光彩。但是“物联网”这个词是由英国的技术专家 [Kevin Ashton][4] 于 1999 年提出来的。 + +一开始,技术是滞后于当时对未来的憧憬的。每个与互联网相连的设备都需要一个处理器和一种能和其他东西通信的方式,无线的最好,这些因素都增加了物联网大规模实际应用的成本和性能要求,这种情况至少一直持续到 21 世纪头十年中期,直到摩尔定律赶上来。 + +一个重要的里程碑是 [RFID 标签的大规模使用][5],这种价格低廉的极简转发器可以被贴在任何物品上,然后这些物品就可以连接到更大的互联网上了。对于设计者来说,无处不在的 Wi-Fi 和 4G 让任何地方的无线连接都变得非常简单。而且,IPv6 的出现再也不用让人们担心把数十亿小设备连接到互联网上会将 IP 地址耗尽。(相关报道:[物联网网络可以促进 IPv6 的使用吗?][6]) + +### 物联网是如何工作的? + +物联网的基本元素是收集数据的设备。广义地说,它们是和互联网相连的设备,所以每一个设备都有 IP 地址。它们的复杂程度不一,这些设备涵盖了从工厂运输货物的自动驾驶车辆到监控建筑温度的简单传感器。这其中也包括每天统计步数的个人手环。为了让这些数据变得有意义,就需要对其收集、处理、过滤和分析,每一种数据都可以通过多种方式进行处理。 + +采集数据的方式是将数据从设备上传输到采集点。可以通过各种无线或者有线网络进行数据的转移。数据可以通过互联网发送到具有存储空间或者计算能力的数据中心或者云端,或者这些数据也可以分段进行传输,由中间设备汇总数据后再沿路径发送。 + +处理数据可以在数据中心或者云端进行,但是有时候这不太可行。对于一些非常重要的设备,比如说工业领域的关停设备,从设备上将数据发送到远程数据中心的延迟太大了。发送、处理、分析数据和返回指令(在管道爆炸之前关闭阀门)这些操作,来回一趟的时间可能要花费非常多的时间。在这种情况下,边缘计算edge-computing就可以大显身手了,智能边缘设备可以汇总数据、分析数据,在需要的时候进行回应,所有这些都在相对较近的物理距离内进行,从而减少延迟。边缘设备可以有上游连接,这样数据就可以进一步被处理和储存。 + +![][7] + +*物联网是如何工作的。* + +### 物联网设备的一些例子 + +本质上,任何可以搜集来自于真实世界数据,并且可以发送回去的设备都可以参与到物联网生态系统中。典型的例子包括智能家居设备、射频识别标签(RFID)和工业传感器。这些传感器可以监控一系列的因素,包括工业系统中的温度和压力、机器中关键设备的状态、患者身上与生命体征相关的信号、水电的使用情况,以及其它许许多多可能的东西。 + +整个工厂的机器人可以被认为是物联网设备,在工业环境和仓库中移动产品的自主车辆也是如此。 + +其他的例子包括可穿戴设备和家庭安防系统。还有一些其它更基础的设备,比如说[树莓派][8]和[Arduino][9],这些设备可以让你构建你自己的物联网终端节点。尽管你可能会认为你的智能手机是一台袖珍电脑,但它很可能也会以非常类似物联网的方式将你的位置和行为数据传送到后端服务。 + +#### 设备管理 + +为了能让这些设备一起工作,所有这些设备都需要进行验证、分配、配置和监控,并且在必要时进行修复和更新。很多时候,这些操作都会在一个单一的设备供应商的专有系统中进行;要么就完全不会进行这些操作,而这样也是最有风险的。但是整个业界正在向[标准化的设备管理模式][10]过渡,这使得物联网设备之间可以相互操作,并保证设备不会被孤立。 + +#### 物联网通信标准和协议 + +当物联网上的小设备和其他设备通信的时候,它们可以使用各种通信标准和协议,这其中许多都是为这些处理能力有限和电源功率不大的设备专门定制的。你一定听说过其中的一些,尽管有一些设备使用的是 Wi-Fi 或者蓝牙,但是更多的设备是使用了专门为物联网世界定制的标准。比如,ZigBee 就是一个低功耗、远距离传输的无线通信协议,而 MQTT(消息队列遥测传输Message Queuing Telemetry Transport)是为连接在不可靠或者易发生延迟的网络上的设备定制的一个发布/订阅信息协议。(参考 Network World 的词汇表:[物联网标准和协议](11)。) + +物联网也会受益于 5G 为蜂窝网络带来的高速度和高带宽,尽管这种使用场景会[滞后于普通的手机][12]。 + +### 物联网、边缘计算和云 + +![][13] + +*边缘计算如何使物联网成为可能。* + +对于许多物联网系统来说,大量的数据会以极快的速度涌来,这种情况催生了一个新的科技领域,[边缘计算][14]edge computing,它由放置在物联网设备附近的设备组成,处理来自那些设备的数据。这些机器对这些数据进行处理,只将相关的素材数据发送到一个更集中的系统系统进行分析。比如,想象一个由几十个物联网安防摄像头组成的网络,边缘计算会直接分析传入的视频,而且只有当其中一个摄像头检测到有物体移动的时候才向安全操作中心(SoC)发出警报,而不会是一下子将所有的在线数据流全部发送到建筑物的 SoC。 + +一旦这些数据已经被处理过了,它们又去哪里了呢?好吧,它也许会被送到你的数据中心,但是更多情况下,它最终会进入云。 + +对于物联网这种间歇或者不同步的数据来往场景来说,具有弹性的云计算是再适合不过的了。许多云计算巨头,包括[谷歌][15]、[微软][16]和[亚马逊][17],都有物联网产品。 + +### 物联网平台 + +云计算巨头们正在尝试出售的,不仅仅是存放传感器搜集的数据的地方。他们正在提供一个可以协调物联网系统中各种元素的完整平台,平台会将很多功能捆绑在一起。本质上,物联网平台作为中间件,将物联网设备和边缘网关与你用来处理物联网数据的应用程序连接起来。也就是说,每一个平台的厂商看上去都会对物联网平台应该是什么这个问题有一些稍微不同的解释,以更好地[与其他竞争者拉开差距][18]。 + +### 物联网和数据 + +正如前面所提到的,所有这些物联网设备收集了 ZB 级的数据,这些数据通过边缘网关被发送到平台上进行处理。在很多情况下,这些数据就是要部署物联网的首要原因。通过从现实世界中的传感器搜集来的数据,企业就可以实时的作出灵活的决定。 + +例如,Oracle 公司[假想了一个这样的场景][19],当人们在主题公园的时候,会被鼓励下载一个可以提供公园信息的应用。同时,这个程序会将 GPS 信号发回到公园的管理部门来帮助他们预测排队时间。有了这些信息,公园就可以在短期内(比如通过增加员工数量来提升景点的一些容量)和长期内(通过了解哪些设施最受欢迎,那些最不受欢迎)采取行动。 + +这些决定可以在没有人工干预的情况作出。比如,从化工厂管道中的压力传感器收集的数据可以通过边缘设备的软件进行分析,从而发现管道破裂的威胁,这样的信息可以触发关闭阀门的信号,从而避免泄漏。 + +### 物联网和大数据分析 + +主题公园的例子可以让你很容易理解,但是和许多现实世界中物联网收集数据的操作相比,就显得小菜一碟了。许多大数据业务都会使用到来自物联网设备收集的信息,然后与其他数据关联,这样就可以分析预测到人类的行为。Software Advice 给出了[一些例子][20],其中包括由 Birst 提供的一项服务,该服务将从联网的咖啡机中收集的咖啡冲泡的信息与社交媒体上发布的帖子进行匹配,看看顾客是否在网上谈论咖啡品牌。 + +另一个最近才发生的戏剧性的例子,X-Mode 发布了一张基于位置追踪数据的地图,地图上显示了在 2020 年 3 月春假的时候,正当新冠病毒在美国加速传播的时候,人们在劳德代尔堡Ft. Lauderdale聚会完[最终都去了哪里][21]。这张地图令人震撼,不仅仅是因为它显示出病毒可能的扩散方向,更是因为它说明了物联网设备是可以多么密切地追踪我们。(更多关于物联网和分析的信息,请点击[此处][22]。) + +### 物联网数据和 AI + +物联网设备能够收集的数据量远远大于任何人类能够以有效的方式处理的数据量,而且这肯定也不是能实时处理的。我们已经看到,仅仅为了理解从物联网终端传来的原始数据,就需要边缘计算设备。此外,还需要检测和处理可能就是[完全错误的数据][23]。 + +许多物联网供应商也同时提供机器学习和人工智能的功能,可以用来理解收集来的数据。比如,IBM 的 Jeopardy!-winning Watson 平台就可以在[物联网数据集上进行训练][24],这样就可以在预测性维护领域产生有用的结果 —— 比如说,分析来自无人机的数据,可以区分桥梁上轻微的损坏和需要重视的裂缝。同时,ARM 也在研发[低功耗芯片][25],它可以在物联网终端上提供 AI 的能力。 + +### 物联网和商业 + +物联网的商业用途包括跟踪客户、库存和重要部件的状态。[IoT for All][26] 列举了四个已经被物联网改变的行业: + +* **石油和天然气**:与人工干预相比,物联网传感器可以更好的检测孤立的钻井现场。 +* **农业**:通过物联网传感器获得的田间作物的数据,可以用来提高产量。 +* **采暖通风**:制造商可以监控全国各地的气候控制系统。 +* **实体零售**:当顾客在商店的某些地方停留的时候,可以通过手机进行微目标定位,提供优惠信息。 + +更普遍的情况是,企业正在寻找能够在[四个领域][27]上获得帮助的物联网解决方案:能源使用、资产跟踪、安全领域和客户体验。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html + +作者:[Josh Fruhlinger][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/Josh-Fruhlinger/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/category/internet-of-things/ +[2]: https://priceonomics.com/the-iot-data-explosion-how-big-is-the-iot-data/ +[3]: https://www.machinedesign.com/automation-iiot/article/21836968/iot-started-with-a-vending-machine +[4]: https://www.visioncritical.com/blog/kevin-ashton-internet-of-things +[5]: https://www.networkworld.com/article/2319384/rfid-readers-route-tag-traffic.html +[6]: https://www.networkworld.com/article/3338106/can-iot-networking-drive-adoption-of-ipv6.html +[7]: https://images.idgesg.net/images/article/2020/05/nw_how_iot_works_diagram-100840757-orig.jpg +[8]: https://www.networkworld.com/article/3176091/10-killer-raspberry-pi-projects-collection-1.html +[9]: https://www.networkworld.com/article/3075360/arduino-targets-the-internet-of-things-with-primo-board.html +[10]: https://www.networkworld.com/article/3258812/the-future-of-iot-device-management.html +[11]: https://www.networkworld.com/article/3235124/internet-of-things-definitions-a-handy-guide-to-essential-iot-terms.html +[12]: https://www.networkworld.com/article/3291778/what-s-so-special-about-5g-and-iot.html +[13]: https://images.idgesg.net/images/article/2017/09/nw_how_edge_computing_works_diagram_1400x1717-100736111-orig.jpg +[14]: https://www.networkworld.com/article/3224893/what-is-edge-computing-and-how-it-s-changing-the-network.html +[15]: https://cloud.google.com/solutions/iot +[16]: https://azure.microsoft.com/en-us/overview/iot/ +[17]: https://aws.amazon.com/iot/ +[18]: https://www.networkworld.com/article/3336166/why-are-iot-platforms-so-darn-confusing.html +[19]: https://blogs.oracle.com/bigdata/how-big-data-powers-the-internet-of-things +[20]: https://www.softwareadvice.com/resources/iot-data-analytics-use-cases/ +[21]: https://www.cnn.com/2020/04/04/tech/location-tracking-florida-coronavirus/index.html +[22]: https://www.networkworld.com/article/3311919/iot-analytics-guide-what-to-expect-from-internet-of-things-data.html +[23]: https://www.networkworld.com/article/3396230/when-iot-systems-fail-the-risk-of-having-bad-iot-data.html +[24]: https://www.networkworld.com/article/3449243/watson-iot-chief-ai-can-broaden-iot-services.html +[25]: https://www.networkworld.com/article/3532094/ai-everywhere-iot-chips-coming-from-arm.html +[26]: https://www.iotforall.com/4-unlikely-industries-iot-changing/ +[27]: https://www.networkworld.com/article/3396128/the-state-of-enterprise-iot-companies-want-solutions-for-these-4-areas.html diff --git a/published/202007/20200522 Turn your Raspberry Pi homelab into a network filesystem.md b/published/202007/20200522 Turn your Raspberry Pi homelab into a network filesystem.md new file mode 100644 index 0000000000..cff0ca4ee7 --- /dev/null +++ b/published/202007/20200522 Turn your Raspberry Pi homelab into a network filesystem.md @@ -0,0 +1,286 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12413-1.html) +[#]: subject: (Turn your Raspberry Pi homelab into a network filesystem) +[#]: via: (https://opensource.com/article/20/5/nfs-raspberry-pi) +[#]: author: (Chris Collins https://opensource.com/users/clcollins) + +把你的树莓派家庭实验室变成一个网络文件系统 +====== + +> 使用 NFS 服务器将共享文件系统添加到你的家庭实验室。 + +![](https://img.linux.net.cn/data/attachment/album/202007/14/154349bgrgrwzexluuvzev.jpg) + +共享文件系统是为家庭实验室增加通用性和功能性的好方法。在实验室中为客户端共享一个集中的文件系统,使得组织数据、进行备份和共享数据变得相当容易。这对于在多个服务器上进行负载均衡的 Web 应用和 [Kubernetes][2] 使用的持久化卷来说,尤其有用,因为它允许在任何数量的节点上用持久化数据来轮转 Pod。 + +无论你的家庭实验室是由普通计算机、多余的企业服务器,还是树莓派或其他单板计算机(SBC)组成,共享文件系统都是一种有用的资产,而网络文件系统(NFS)服务器是创建共享文件系统的好方法。 + +我之前写过关于[建立“家庭私有云”][3]的文章,这是一个由树莓派或其他 SBC 组成的家庭实验室,也许还有其他一些消费类硬件或台式 PC。NFS 服务器是这些组件之间共享数据的理想方式。由于大多数 SBC 的操作系统是通过 SD 卡运行的,所以存在一些挑战。尤其是在用作计算机的操作系统磁盘时,SD 卡的故障率会增加,它们并不是用来不断地读写的。你实际需要的是一个真正的硬盘:它们通常比 SD 卡的每 GB 价格便宜,特别是对于较大的磁盘,而且它们不太可能持续发生故障。树莓派 4 现在带有 USB 3.0 接口,而 USB 3.0 硬盘无处不在,价格也很实惠。这是一个完美的搭配。在这个项目中,我将使用一个 2TB 的 USB 3.0 外置硬盘插入到运行 NFS 服务器的树莓派 4 中。 + +![Raspberry Pi with a USB hard disk][4] + +### 安装 NFS 服务器软件 + +我在树莓派上运行 Fedora 服务器,但这个项目也可以在其他发行版上运行。要在 Fedora 上运行 NFS 服务器,你需要 `nfs-utils` 包,幸运的是它已经安装好了(至少在 Fedora 31 中是这样)。如果你打算运行 NFSv3 服务,你还需要 `rpcbind` 包,但它不是 NFSv4 的严格要求。 + +如果你的系统中还没有这些软件包,请使用 `dnf` 命令安装它们。 + +``` +# 安装 nfs-utils 和 rpcbind +$ sudo dnf install nfs-utils rpcbind +``` + +Raspbian 是另一个与树莓派一起使用的流行操作系统,设置几乎完全相同。软件包名称不同而已,但这是唯一的主要区别。要在运行 Raspbian 的系统上安装 NFS 服务器,你需要以下软件包。 + + * `nfs-common`:这些文件是 NFS 服务器和客户端的通用文件。 + * `nfs-kernel-server`:主要的 NFS 服务器软件包。 + +Raspbian 使用 `apt-get` 来管理软件包(而不是像 Fedora 那样使用 `dnf`),所以用它来安装软件包。 + +``` +# 对于 Raspbian 系统,使用 apt-get 来安装 NFS 软件包 +$ sudo apt-get install nfs-common nfs-kernel-server +``` + +### 准备一个 USB 硬盘作为存储设备 + +正如我上面提到的,USB 硬盘是为树莓派或其他 SBC 提供存储的好选择,尤其是用于操作系统磁盘镜像的 SD 卡并不适合这个用途。对于家庭私有云,你可以使用廉价的 USB 3.0 硬盘进行大规模存储。插入磁盘,使用 `fdisk` 找出分配给它的设备 ID,就可以使用它工作了。 + +``` +# 使用 fdisk 找到你的硬盘 +# 无关的硬盘信息已经省略 +$ sudo fdisk -l + +Disk /dev/sda: 1.84 TiB, 2000398933504 bytes, 3907029167 sectors +Disk model: BUP Slim BK +Units: sectors of 1 * 512 = 512 bytes +Sector size (logical/physical): 512 bytes / 512 bytes +I/O size (minimum/optimal): 512 bytes / 512 bytes +Disklabel type: dos +Disk identifier: 0xe3345ae9 + +Device     Boot Start        End    Sectors  Size Id Type +/dev/sda1        2048 3907028991 3907026944  1.8T 83 Linux +``` + +为了清楚起见,在上面的例子输出中,除了我感兴趣的那个磁盘,我省略了所有其它磁盘的信息。你可以看到我想使用的 USB 磁盘被分配了设备 `/dev/sda`,你可以看到一些关于型号的信息(`Disk model: BUP Slim BK`),这有助于我识别正确的磁盘。该磁盘已经有了一个分区,它的大小也证实了它就是我要找的磁盘。 + +注意:请确保正确识别你的设备的磁盘和分区。它可能与上面的例子不同。 + +在驱动器上创建的每个分区都有一个特殊的通用唯一标识符(UUID)。计算机使用 UUID 来确保它使用 `/etc/fstab` 配置文件将正确的分区挂载到正确的位置。你可以使用 `blkid` 命令检索分区的 UUID。 + +``` +# 获取该分区的块设备属性 +# 确保你使用了合适的分区,它应该有所不同。 +$ sudo blkid /dev/sda1 + +/dev/sda1: LABEL="backup" UUID="bd44867c-447c-4f85-8dbf-dc6b9bc65c91" TYPE="xfs" PARTUUID="e3345ae9-01" +``` + +在这里,`/dev/sda1` 的 UUID 是 `bd44867c-447c-4f85-8dbf-dc6b9bc65c91`。你的 UUID 会有所不同,所以要记下来。 + +### 配置树莓派在启动时挂载这个磁盘,然后挂载它 + +现在你已经确定了要使用的磁盘和分区,你需要告诉计算机如何挂载它,每次启动时都要这样做。现在就去挂载它。因为这是一个 USB 磁盘,可能会被拔掉,所以你还要配置树莓派在启动时如果磁盘没有插入或有其它不可用情况时不要等待。 + +在 Linux 中,通过将分区添加到 `/etc/fstab` 配置文件中,包括你希望它被挂载的位置和一些参数来告诉计算机如何处理它。这个例子将把分区挂载到 `/srv/nfs`,所以先创建这个路径: + +``` +# 创建该磁盘分区的挂载点 +$ sudo mkdir -p /srv/nfs +``` + +接下来,使用以下语法格式修改 `/etc/fstab` 文件: + +``` +                   +``` + +使用你之前确定的 UUID 作为磁盘 ID。正如我在上一步提到的,挂载点是 `/srv/nfs`。对于文件系统类型,通常最好选择其实际的文件系统,但是因为这是一个 USB 磁盘,所以使用 `auto`。 + +对于选项值,使用 `nosuid,nodev,nofail`。 + +#### 关于手册页的一个旁白 + +其实,有*很多*可能的选项,手册页(`man`)是查看它们的最好方法。查看 `fstab` 的手册页是一个很好的开始。 + +``` +# 打开 fstab 的手册页 +$ man fstab +``` + +这将打开与 `fstab` 命令相关的手册/文档。在手册页中,每个选项都被分解成了不同的内容,以显示它的作用和常用的选择。例如,“第四个字段(fs_mntopts)”给出了该字段中可用选项的一些基本信息,并引导你到 `man 8 mount` 中获取 `mount` 选项更深入的描述。这是有道理的,因为 `/etc/fstab` 文件,本质上是告诉计算机如何自动挂载磁盘,就像你手动使用 `mount` 命令一样。 + +你可以从 `mount` 的手册页中获得更多关于你将使用的选项的信息。数字 8 表示手册页的章节。在这里,第 8 章节是*系统管理工具和守护进程*。 + +你可以从 `man` 的手册页中得到标准章节的列表。 + +回到挂载磁盘,让我们看看 `man 8 mount`。 + +``` +# 打开第 8 章节的 mount 手册页 +$ man 8 mount +``` + +在这个手册页中,你可以查看上面列出的选项的作用。 + + * `nosuid`:不理会 suid/guid 位。不允许放在 U 盘上的任何文件以 root 身份执行。这是一个良好的安全实践。 + * `nodev`:不识别文件系统中的字符或块特殊设备,即不理会在 U 盘上的任何设备节点。另一个良好的安全实践。 + * `nofail`:如果设备不存在,不要记录任何错误。这是一个 U 盘,可能没有插入,所以在这种情况下,它将被忽略。 + +回到你正在添加到 `/etc/fstab` 文件的那一行,最后还有两个选项:`fs_freq` 和 `fs_passno`。它们的值与一些过时的选项有关,*大多数*现代系统对这两个选项都只用 `0`,特别是对 USB 磁盘上的文件系统而言。`fs_freq` 的值与 `dump` 命令和文件系统的转储有关。`fs_passno` 的值定义了启动时要 `fsck` 的文件系统及其顺序,如果设置了这个值,通常根分区是 `1`,其他文件系统是 `2`,将该值设置为 `0` 以跳过在该分区上使用 `fsck`。 + +在你喜欢的编辑器中,打开 `/etc/fstab` 文件,添加 U 盘上分区的条目,将这里的值替换成前面步骤中得到的值。 + +``` +# With sudo, or as root, add the partition info to the /etc/fstab file +UUID="bd44867c-447c-4f85-8dbf-dc6b9bc65c91"    /srv/nfs    auto    nosuid,nodev,nofail,noatime 0 0 +``` + +### 启用并启动 NFS 服务器 + +安装好软件包,并将分区添加到你的 `/etc/fstab` 文件中,现在你可以开始启动 NFS 服务器了。在 Fedora 系统中,你需要启用和启动两个服务:`rpcbind` 和 `nfs-server`。使用 `systemctl` 命令来完成这项工作。 + +``` +# 启动 NFS 服务器和 rpcbind +$ sudo systemctl enable rpcbind.service +$ sudo systemctl enable nfs-server.service +$ sudo systemctl start rpcbind.service +$ sudo systemctl start nfs-server.service +``` + +在 Raspbian 或其他基于 Debian 的发行版上,你只需要使用 `systemctl` 命令启用并启动 `nfs-kernel-server` 服务即可,方法同上。 + +#### RPCBind + +rpcbind 工具用于将远程过程调用(RPC)服务映射到其监听的端口。根据 rpcbind 手册页: + +> “当一个 RPC 服务启动时,它会告诉 rpcbind 它正在监听的地址,以及它准备服务的 RPC 程序号。当客户机想对给定的程序号进行 RPC 调用时,它首先与服务器机器上的 rpcbind 联系,以确定 RPC 请求应该发送到哪里的地址。” + +在 NFS 服务器这个案例中,rpcbind 会将 NFS 的协议号映射到 NFS 服务器监听的端口上。但是,NFSv4 不需要使用 rpcbind。如果你*只*使用 NFSv4 (通过从配置中删除版本 2 和版本 3),则不需要使用 rpcbind。我把它放在这里是为了向后兼容 NFSv3。 + +### 导出挂载的文件系统 + +NFS 服务器根据另一个配置文件 `/etc/exports` 来决定与哪些远程客户端共享(导出)哪些文件系统。这个文件只是一个 IP(或子网)与要共享的文件系统的映射,以及一些选项(只读或读写、root 去除等)。该文件的格式是: + +``` +<目录>     <主机>(选项) +``` + +在这个例子中,你将导出挂载到 `/srv/nfs` 的分区。这是“目录”部分。 + +第二部分,主机,包括你要导出这个分区的主机。这些主机可以是单个主机:使用具有完全限定域名(FQDN)或主机名、主机的 IP 地址来指定;也可以是一组主机:使用通配符字符来匹配域(如 *.example.org)、IP 网络(如无类域间路由 CIDR 标识)或网组表示。 + +第三部分包括应用于该导出的选项。 + + * `ro/rw`:将文件系统导出为只读或读写。 + * `wdelay`:如果即将进行另一次写入,则推迟对磁盘的写入,以提高性能(如果你使用的是固态 USB 磁盘,这*可能*没有那么有用) + * `root_squash`:防止客户机上的任何 root 用户在主机上有 root 权限,并将 root UID 设置为 `nfsnobody` 作为安全防范措施。 + +测试导出你挂载在 `/srv/nfs` 处的分区到一个客户端 —— 例如,一台笔记本电脑。确定你的客户机的 IP 地址(我的笔记本是 `192.168.2.64`,但你的可能会不同)。你可以把它共享到一个大的子网,但为了测试,请限制在单个 IP 地址上。这个 IP 的 CIDR 标识是 `192.168.2.64/32`,`/32` 子网代表一个 IP。 + +使用你喜欢的编辑器编辑 `/etc/exports` 文件,写上你的目录、主机 CIDR 以及 `rw` 和 `root_squash` 选项。 + +``` +# 像这样编辑你的 /etc/exports 文件,替换为你的系统上的信息 +/srv/nfs    192.168.2.64/32(rw,root_squash) +``` + +注:如果你从另一个地方复制了 `/etc/exports` 文件,或者用副本覆盖了原文件,你可能需要恢复该文件的 SELinux 上下文。你可以使用 `restorecon` 命令来恢复。 + +``` +# 恢复 /etc/exports 文件的 SELinux 上下文 +$ sudo restorecon /etc/exports +``` + +完成后,重新启动 NFS 服务器,以接收对 `/etc/exports` 文件的更改。 + +``` +# 重新启动 NFS 服务器 +$ sudo systemctl restart nfs-server.service +``` + +### 给 NFS 服务打开防火墙 + +有些系统,默认不运行[防火墙服务][6]。比如 Raspbian,默认是开放 iptables 规则,不同服务打开的端口在机器外部立即就可以使用。相比之下,Fedora 服务器默认运行的是 firewalld 服务,所以你必须为 NFS 服务器(以及 rpcbind,如果你将使用 NFSv3)打开端口。你可以通过 `firewall-cmd` 命令来实现。 + +检查 firewalld 使用的区域并获取默认区域。对于 Fedora 服务器,这是 `FedoraServer` 区域。 + +``` +# 列出区域 +# 出于简洁省略了部分输出 +$ sudo firewall-cmd --list-all-zones + +# R获取默认区域信息 +# 记下默认区域 +$ sudo firewall-cmd --get-default-zone + +# 永久加入 nfs 服务到允许端口列表 +$ sudo firewall-cmd --add-service=nfs --permanent + +# 对于 NFSv3,我们需要再加一些端口: nfsv3、 rpc-mountd、 rpc-bind +$ sudo firewall-cmd --add-service=(nfs3,mountd,rpc-bind) + +# 查看默认区域的服务,以你的系统中使用的默认区域相应替换 +$ sudo firewall-cmd --list-services --zone=FedoraServer + +# 如果一切正常,重载 firewalld +$ sudo firewall-cmd --reload +``` + +就这样,你已经成功地将 NFS 服务器与你挂载的 U 盘分区配置在一起,并将其导出到你的测试系统中进行共享。现在你可以在你添加到导出列表的系统上测试挂载它。 + +### 测试 NFS 导出 + +首先,从 NFS 服务器上,在 `/srv/nfs` 目录下创建一个文件来读取。 + +``` +# 创建一个测试文件以共享 +echo "Can you see this?" >> /srv/nfs/nfs_test +``` + +现在,在你添加到导出列表中的客户端系统上,首先确保 NFS 客户端包已经安装好。在 Fedora 系统上,它是 `nfs-utils` 包,可以用 `dnf` 安装。Raspbian 系统有 `libnfs-utils` 包,可以用 `apt-get` 安装。 + +安装 NFS 客户端包: + +``` +# 用 dnf 安装 nfs-utils 软件包 +$ sudo dnf install nfs-utils +``` + +一旦安装了客户端包,你就可以测试 NFS 的导出了。同样在客户端,使用带有 NFS 服务器 IP 和导出路径的 `mount` 命令,并将其挂载到客户端的一个位置,在这个测试中是 `/mnt` 目录。在这个例子中,我的 NFS 服务器的 IP 是 `192.168.2.109`,但你的可能会有所不同。 + +``` +# 挂载 NFS 服务器的输出到客户端主机 +# 确保替换为你的主机的相应信息 +$ sudo mount 192.168.2.109:/srv/nfs /mnt + +# 查看 nfs_test 文件是不是可见 +$ cat /mnt/nfs_test +Can you see this? +``` + +成功了!你现在已经有了一个可以工作的 NFS 服务器,可以与多个主机共享文件,允许多个读/写访问,并为你的数据提供集中存储和备份。家庭实验室的共享存储有很多选择,但 NFS 是一种古老的、高效的、可以添加到你的“家庭私有云”家庭实验室中的好选择。本系列未来的文章将扩展如何在客户端上自动挂载 NFS 共享,以及如何将 NFS 作为 Kubernetes 持久卷的存储类。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/nfs-raspberry-pi + +作者:[Chris Collins][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/clcollins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_cloud21x_cc.png?itok=5UwC92dO (Blue folders flying in the clouds above a city skyline) +[2]: https://opensource.com/resources/what-is-kubernetes +[3]: https://linux.cn/article-12277-1.html +[4]: https://opensource.com/sites/default/files/uploads/raspberrypi_with_hard-disk.jpg (Raspberry Pi with a USB hard disk) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/18/9/linux-iptables-firewalld diff --git a/published/202007/20200525 Foliate- A Modern eBook Reader App for Linux.md b/published/202007/20200525 Foliate- A Modern eBook Reader App for Linux.md new file mode 100644 index 0000000000..39fc680f6e --- /dev/null +++ b/published/202007/20200525 Foliate- A Modern eBook Reader App for Linux.md @@ -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 \ No newline at end of file diff --git a/published/202007/20200525 How Cloud-init can be used for your Raspberry Pi homelab.md b/published/202007/20200525 How Cloud-init can be used for your Raspberry Pi homelab.md new file mode 100644 index 0000000000..e297ca2521 --- /dev/null +++ b/published/202007/20200525 How Cloud-init can be used for your Raspberry Pi homelab.md @@ -0,0 +1,83 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12371-1.html) +[#]: subject: (How Cloud-init can be used for your Raspberry Pi homelab) +[#]: via: (https://opensource.com/article/20/5/cloud-init-raspberry-pi-homelab) +[#]: author: (Chris Collins https://opensource.com/users/clcollins) + +在你的树莓派家庭实验室中使用 Cloud-init +====== + +> 了解了云行业的标准,该向你的家庭实验室自动添加新设备和用户了。 + +![](https://img.linux.net.cn/data/attachment/album/202007/01/203559wt8tnnnxnc6jcnn8.jpg) + +[Cloud-init][2](可以说)是一个标准,云提供商用它来为云实例提供初始化和配置数据。它最常用于新实例的首次启动,以自动完成网络设置、账户创建和 SSH 密钥安装等使新系统上线所需的任何事情,以便用户可以访问它。 + +在之前的一篇文章《[修改磁盘镜像来创建基于树莓派的家庭实验室][3]》中,我展示了如何为像树莓派这样的单板计算机定制操作系统镜像以实现类似的目标。有了 Cloud-init,就不需要向镜像中添加自定义数据。一旦在镜像中启用了它,你的虚拟机、物理服务器,甚至是小小的树莓派都可以表现得像你自己的 “家庭私有云” 中的云计算实例。新机器只需插入、打开,就可以自动成为你的[家庭实验室][4]的一部分。 + +说实话,Cloud-init 的设计并没有考虑到家庭实验室。正如我所提到的,你可以很容易地修改给定的一套系统磁盘镜像,以启用 SSH 访问并在第一次启动后对它们进行配置。Cloud-init 是为大规模的云提供商设计的,这些提供商需要容纳许多客户,维护一组小的镜像,并为这些客户提供访问实例的机制,而无需为每个客户定制一个镜像。拥有单个管理员的家庭实验室则不会面临同样的挑战。 + +不过,Cloud-init 在家庭实验室中也不是没有可取之处。教育是我的家庭私有云项目的目标之一,而为你的家庭实验室设置 Cloud-init 是一个很好的方式,可以获得大大小小的云提供商大量使用的技术的经验。Cloud-init 也是其他初始配置选项的替代方案之一。与其为家庭实验室中的每台设备定制每个镜像、ISO 等,并在你要进行更改时面临繁琐的更新,不如直接启用 Cloud-init。这减少了技术债务 —— 还有什么比*个人*技术债务更糟糕的吗?最后,在你的家庭实验室中使用 Cloud-init 可以让你的私有云实例与你拥有的或将来可能拥有的任何公有云实例表现相同 —— 这是真正的[混合云][5]。 + +### 关于 Cloud-init + +当为 Cloud-init 配置的实例启动并且服务开始运行时(实际上是 systemd 中的四个服务,以处理启动过程中的依赖关系),它会检查其配置中的[数据源][6],以确定其运行在什么类型的云中。每个主要的云提供商都有一个数据源配置,告诉实例在哪里以及如何检索配置信息。然后,实例使用数据源信息检索云提供商提供的配置信息(如网络信息和实例识别信息)和客户提供的配置数据(如要复制的授权密钥、要创建的用户账户以及许多其他可能的任务)。 + +检索数据后,Cloud-init 再对实例进行配置:设置网络、复制授权密钥等,最后完成启动过程。然后,远程用户就可以访问它,准备好使用 [Ansible][7] 或 [Puppet][8] 等工具进行进一步的配置,或者准备好接收工作负载并开始分配任务。 + +### 配置数据 + +如上所述,Cloud-init 使用的配置数据来自两个潜在来源:云提供商和实例用户。在家庭实验室中,你扮演着这两种角色:作为云提供商提供网络和实例信息,作为用户提供配置信息。 + +#### 云提供商元数据文件 + +在你的云提供商角色中,你的家庭实验室数据源将为你的私有云实例提供一个元数据文件。这个[元数据][9]文件包含实例 ID、云类型、Python 版本(Cloud-init 用 Python 编写并使用 Python)或要分配给主机的 SSH 公钥等信息。如果你不使用 DHCP(或 Cloud-init 支持的其他机制,如镜像中的配置文件或内核参数),元数据文件还可能包含网络信息。 + +#### 用户提供的用户数据文件 + +Cloud-init 的真正价值在于用户数据文件。[用户数据][10]文件由用户提供给云提供商,并包含在数据源中,它将实例从一台普通的机器变成了用户舰队的一员。用户数据文件可以以可执行脚本的形式出现,与正常情况下脚本的工作方式相同;也可以以云服务配置 YAML 文件的形式出现,利用 [Cloud-init 的模块][11] 来执行配置任务。 + +### 数据源 + +数据源是由云提供商提供的服务,它为实例提供了元数据和用户数据文件。实例镜像或 ISO 被配置为告知实例正在使用什么数据源。 + +例如,亚马逊 AWS 提供了一个 [link-local][12] 文件,它将用实例的自定义数据来响应实例的 HTTP 请求。其他云提供商也有自己的机制。幸运的是,对于家庭私有云项目来说,也有 NoCloud 数据源。 + +[NoCloud][13] 数据源允许通过内核命令以键值对的形式提供配置信息,或通过挂载的 ISO 文件系统以用户数据和元数据文件的形式提供。这些对于虚拟机来说很有用,尤其是与自动化搭配来创建虚拟机。 + +还有一个 NoCloudNet 数据源,它的行为类似于 AWS EC2 数据源,提供一个 IP 地址或 DNS 名称,通过 HTTP 从这里检索用户数据和元数据。这对于你的家庭实验室中的物理机器来说是最有帮助的,比如树莓派、[NUC][14] 或多余的服务器设备。虽然 NoCloud 可以工作,但它需要更多的人工关注 —— 这是云实例的反模式。 + +### 家庭实验室的 Cloud-init + +我希望这能让你了解到 Cloud-init 是什么,以及它对你的家庭实验室有何帮助。它是一个令人难以置信的工具,被主要的云提供商所接受,在家里使用它可以是为了教育和乐趣,并帮助你自动向实验室添加新的物理或虚拟服务器。之后的文章将详细介绍如何创建简单的静态和更复杂的动态 Cloud-init 服务,并指导你将它们纳入你的家庭私有云。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/cloud-init-raspberry-pi-homelab + +作者:[Chris Collins][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/clcollins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/innovation_lightbulb_gears_devops_ansible.png?itok=TSbmp3_M (gears and lightbulb to represent innovation) +[2]: https://cloudinit.readthedocs.io/ +[3]: https://linux.cn/article-12277-1.html +[4]: https://opensource.com/article/19/3/home-lab +[5]: https://www.redhat.com/en/topics/cloud-computing/what-is-hybrid-cloud +[6]: https://cloudinit.readthedocs.io/en/latest/topics/datasources.html +[7]: https://www.ansible.com/ +[8]: https://puppet.com/ +[9]: https://cloudinit.readthedocs.io/en/latest/topics/instancedata.html# +[10]: https://cloudinit.readthedocs.io/en/latest/topics/format.html +[11]: https://cloudinit.readthedocs.io/en/latest/topics/modules.html +[12]: https://en.wikipedia.org/wiki/Link-local_address +[13]: https://cloudinit.readthedocs.io/en/latest/topics/datasources/nocloud.html +[14]: https://en.wikipedia.org/wiki/Next_Unit_of_Computing diff --git a/published/202007/20200527 Add nodes to your private cloud using Cloud-init.md b/published/202007/20200527 Add nodes to your private cloud using Cloud-init.md new file mode 100644 index 0000000000..1f0939e103 --- /dev/null +++ b/published/202007/20200527 Add nodes to your private cloud using Cloud-init.md @@ -0,0 +1,315 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12407-1.html) +[#]: subject: (Add nodes to your private cloud using Cloud-init) +[#]: via: (https://opensource.com/article/20/5/create-simple-cloud-init-service-your-homelab) +[#]: author: (Chris Collins https://opensource.com/users/clcollins) + +使用 Cloud-init 将节点添加到你的私有云中 +====== + +> 像主流云提供商的处理方式一样,在家中添加机器到你的私有云。 + +![](https://img.linux.net.cn/data/attachment/album/202007/12/100823rj096h3ax4hhehey.jpg) + +[Cloud-init][2] 是一种广泛使用的行业标准方法,用于初始化云实例。云提供商使用 Cloud-init 来定制实例的网络配置、实例信息,甚至用户提供的配置指令。它也是一个可以在你的“家庭私有云”中使用的很好的工具,可以为你的家庭实验室的虚拟机和物理机的初始设置和配置添加一点自动化 —— 并了解更多关于大型云提供商是如何工作的信息。关于更多的细节和背景,请看我之前的文章《[在你的树莓派家庭实验室中使用 Cloud-init][3]》。 + +![A screen showing the boot process for a Linux server running Cloud-init ][4] + +*运行 Cloud-init 的 Linux 服务器的启动过程(Chris Collins,[CC BY-SA 4.0][5])* + +诚然,Cloud-init 对于为许多不同客户配置机器的云提供商来说,比对于由单个系统管理员运行的家庭实验室更有用,而且 Cloud-init 解决的许多问题对于家庭实验室来说可能有点多余。然而,设置它并了解它的工作原理是了解更多关于这种云技术的好方法,更不用说它是首次启动时配置设备的好方法。 + +本教程使用 Cloud-init 的 NoCloud 数据源,它允许 Cloud-init 在传统的云提供商环境之外使用。本文将向你展示如何在客户端设备上安装 Cloud-init,并设置一个运行 Web 服务的容器来响应客户端的请求。你还将学习如何审查客户端从 Web 服务中请求的内容,并修改 Web 服务的容器,以提供基本的、静态的 Cloud-init 服务。 + +### 在现有系统上设置 Cloud-init + +Cloud-init 可能在新系统首次启动时最有用,它可以查询配置数据,并根据指令对系统进行定制。它可以[包含在树莓派和单板计算机的磁盘镜像中][6],也可以添加到用于配给provision虚拟机的镜像中。对于测试用途来说,无论是在现有系统上安装并运行 Cloud-init,还是安装一个新系统,然后设置 Cloud-init,都是很容易的。 + +作为大多数云提供商使用的主要服务,大多数 Linux 发行版都支持 Cloud-init。在这个例子中,我将使用 Fedora 31 Server 来安装树莓派,但在 Raspbian、Ubuntu、CentOS 和大多数其他发行版上也可以用同样的方式来完成。 + +#### 安装并启用云计算初始服务 + +在你想作为 Cloud-init 客户端的系统上,安装 Cloud-init 包。如果你使用的是 Fedora: + +``` +# Install the cloud-init package +dnf install -y cloud-init +``` + +Cloud-init 实际上是四个不同的服务(至少在 systemd 下是这样),这些服务负责检索配置数据,并在启动过程的不同阶段进行配置更改,这使得可以做的事情更加灵活。虽然你不太可能直接与这些服务进行太多交互,但在你需要排除一些故障时,知道它们是什么还是很有用的。它们是: + + * cloud-init-local.service + * cloud-init.service + * cloud-config.service + * cloud-final.service + +启用所有四个服务: + +``` +# Enable the four cloud-init services +systemctl enable cloud-init-local.service +systemctl enable cloud-init.service +systemctl enable cloud-config.service +systemctl enable cloud-final.service +``` + +#### 配置数据源以查询 + +启用服务后,请配置数据源,客户端将从该数据源查询配置数据。有[许多数据源类型][7],而且大多数都是为特定的云提供商配置的。对于你的家庭实验室,请使用 NoCloud 数据源,(如上所述)它是为在没有云提供商的情况下使用 Cloud-init 而设计的。 + +NoCloud 允许以多种方式包含配置信息:以内核参数中的键/值对,用于在启动时挂载的 CD(或虚拟机中的虚拟 CD);包含在文件系统中的文件中;或者像本例中一样,通过 HTTP 从指定的 URL(“NoCloud Net” 选项)获取配置信息。 + +数据源配置可以通过内核参数提供,也可以在 Cloud-init 配置文件 `/etc/cloud/cloud.cfg` 中进行设置。该配置文件对于使用自定义磁盘镜像设置 Cloud-init 或在现有主机上进行测试非常方便。 + +Cloud-init 还会合并在 `/etc/cloud/cloud.cfg.d/` 中找到的任何 `*.cfg` 文件中的配置数据,因此为了保持整洁,请在 `/etc/cloud/cloud.cfg.d/10_datasource.cfg` 中配置数据源。Cloud-init 可以通过使用以下语法从 `seedfrom` 键指向的 HTTP 数据源中读取数据。 + +``` +seedfrom: http://ip_address:port/ +``` + +IP 地址和端口是你将在本文后面创建的 Web 服务。我使用了我的笔记本电脑的 IP 和 8080 端口。这也可以是 DNS 名称。 + +创建 `/etc/cloud/cloud.cfg.d/10_datasource.cfg` 文件: + +``` +# Add the datasource: +# /etc/cloud/cloud.cfg.d/10_datasource.cfg + +# NOTE THE TRAILING SLASH HERE! +datasource: +  NoCloud: +    seedfrom: http://ip_address:port/ +``` + +客户端设置就是这样。现在,重新启动客户端后,它将尝试从你在 `seedfrom` 键中输入的 URL 检索配置数据,并进行必要的任何配置更改。 + +下一步是设置一个 Web 服务器来侦听客户端请求,以便你确定需要提供的服务。 + +### 设置网络服务器以审查客户请求 + +你可以使用 [Podman][8] 或其他容器编排工具(如 Docker 或 Kubernetes)快速创建和运行 Web 服务器。这个例子使用的是 Podman,但同样的命令也适用于 Docker。 + +要开始,请使用 `fedora:31` 容器镜像并创建一个容器文件(对于 Docker 来说,这会是一个 Dockerfile)来安装和配置 Nginx。从该容器文件中,你可以构建一个自定义镜像,并在你希望提供 Cloud-init 服务的主机上运行它。 + +创建一个包含以下内容的容器文件: + +``` +FROM fedora:31 + +ENV NGINX_CONF_DIR "/etc/nginx/default.d" +ENV NGINX_LOG_DIR "/var/log/nginx" +ENV NGINX_CONF "/etc/nginx/nginx.conf" +ENV WWW_DIR "/usr/share/nginx/html" + +# Install Nginx and clear the yum cache +RUN dnf install -y nginx \ + && dnf clean all \ + && rm -rf /var/cache/yum + +# forward request and error logs to docker log collector +RUN ln -sf /dev/stdout ${NGINX_LOG_DIR}/access.log \ + && ln -sf /dev/stderr ${NGINX_LOG_DIR}/error.log + +# Listen on port 8080, so root privileges are not required for podman +RUN sed -i -E 's/(listen)([[:space:]]*)(\[\:\:\]\:)?80;$/\1\2\38080 default_server;/' $NGINX_CONF +EXPOSE 8080 + +# Allow Nginx PID to be managed by non-root user +RUN sed -i '/user nginx;/d' $NGINX_CONF +RUN sed -i 's/pid \/run\/nginx.pid;/pid \/tmp\/nginx.pid;/' $NGINX_CONF + +# Run as an unprivileged user +USER 1001 + +CMD ["nginx", "-g", "daemon off;"] +``` + +注:本例中使用的容器文件和其他文件可以在本项目的 [GitHub 仓库][9]中找到。 + +上面容器文件中最重要的部分是改变日志存储方式的部分(写到 STDOUT 而不是文件),这样你就可以在容器日志中看到进入该服务器的请求。其他的一些改变使你可以在没有 root 权限的情况下使用 Podman 运行容器,也可以在没有 root 权限的情况下运行容器中的进程。 + +在 Web 服务器上的第一个测试并不提供任何 Cloud-init 数据;只是用它来查看 Cloud-init 客户端的请求。 + +创建容器文件后,使用 Podman 构建并运行 Web 服务器镜像: + +``` +# Build the container image +$ podman build -f Containerfile -t cloud-init:01 . + +# Create a container from the new image, and run it +# It will listen on port 8080 +$ podman run --rm -p 8080:8080 -it cloud-init:01 +``` + +这会运行一个容器,让你的终端连接到一个伪 TTY。一开始看起来什么都没有发生,但是对主机 8080 端口的请求会被路由到容器内的 Nginx 服务器,并且在终端窗口中会出现一条日志信息。这一点可以用主机上的 `curl` 命令进行测试。 + +``` +# Use curl to send an HTTP request to the Nginx container +$ curl http://localhost:8080 +``` + +运行该 `curl` 命令后,你应该会在终端窗口中看到类似这样的日志信息: + +``` +127.0.0.1 - - [09/May/2020:19:25:10 +0000] "GET / HTTP/1.1" 200 5564 "-" "curl/7.66.0" "-" +``` + +现在,有趣的部分来了:重启 Cloud-init 客户端,并观察 Nginx 日志,看看当客户端启动时, Cloud-init 向 Web 服务器发出了什么请求。 + +当客户端完成其启动过程时,你应该会看到类似的日志消息。 + +``` +2020/05/09 22:44:28 [error] 2#0: *4 open() "/usr/share/nginx/html/meta-data" failed (2: No such file or directory), client: 127.0.0.1, server: _, request: "GET /meta-data HTTP/1.1", host: "instance-data:8080" +127.0.0.1 - - [09/May/2020:22:44:28 +0000] "GET /meta-data HTTP/1.1" 404 3650 "-" "Cloud-Init/17.1" "-" +``` + +注:使用 `Ctrl+C` 停止正在运行的容器。 + +你可以看到请求是针对 `/meta-data` 路径的,即 `http://ip_address_of_the_webserver:8080/meta-data`。这只是一个 GET 请求 —— Cloud-init 并没有向 Web 服务器发送任何数据。它只是盲目地从数据源 URL 中请求文件,所以要由数据源来识别主机的要求。这个简单的例子只是向任何客户端发送通用数据,但一个更大的家庭实验室应该需要更复杂的服务。 + +在这里,Cloud-init 请求的是[实例元数据][10]信息。这个文件可以包含很多关于实例本身的信息,例如实例 ID、分配实例的主机名、云 ID,甚至网络信息。 + +创建一个包含实例 ID 和主机名的基本元数据文件,并尝试将其提供给 Cloud-init 客户端。 + +首先,创建一个可复制到容器镜像中的 `meta-data` 文件。 + +``` +instance-id: iid-local01 +local-hostname: raspberry +hostname: raspberry +``` + +实例 ID(`instance-id`)可以是任何东西。但是,如果你在 Cloud-init 运行后更改实例 ID,并且文件被送达客户端,就会触发 Cloud-init 再次运行。你可以使用这种机制来更新实例配置,但你应该意识到它是这种工作方式。 + +`local-hostname` 和 `hostname` 键正如其名,它们会在 Cloud-init 运行时为客户端设置主机名信息。 + +在容器文件中添加以下行以将 `meta-data` 文件复制到新镜像中。 + +``` +# Copy the meta-data file into the image for Nginx to serve it +COPY meta-data ${WWW_DIR}/meta-data +``` + +现在,用元数据文件重建镜像(使用一个新的标签以方便故障排除),并用 Podman 创建并运行一个新的容器。 + +``` +# Build a new image named cloud-init:02 +podman build -f Containerfile -t cloud-init:02 . + +# Run a new container with this new meta-data file +podman run --rm -p 8080:8080 -it cloud-init:02 +``` + +新容器运行后,重启 Cloud-init 客户端,再次观察 Nginx 日志。 + +``` +127.0.0.1 - - [09/May/2020:22:54:32 +0000] "GET /meta-data HTTP/1.1" 200 63 "-" "Cloud-Init/17.1" "-" +2020/05/09 22:54:32 [error] 2#0: *2 open() "/usr/share/nginx/html/user-data" failed (2: No such file or directory), client: 127.0.0.1, server: _, request: "GET /user-data HTTP/1.1", host: "instance-data:8080" +127.0.0.1 - - [09/May/2020:22:54:32 +0000] "GET /user-data HTTP/1.1" 404 3650 "-" "Cloud-Init/17.1" "-" +``` + +你看,这次 `/meta-data` 路径被提供给了客户端。成功了! + +然而,客户端接着在 `/user-data` 路径上寻找第二个文件。该文件包含实例所有者提供的配置数据,而不是来自云提供商的数据。对于一个家庭实验室来说,这两个都是你自己提供的。 + +你可以使用[许多 user-data 模块][11]来配置你的实例。对于这个例子,只需使用 `write_files` 模块在客户端创建一些测试文件,并验证 Cloud-init 是否工作。 + +创建一个包含以下内容的用户数据文件: + +``` +#cloud-config + +# Create two files with example content using the write_files module +write_files: + - content: | +    "Does cloud-init work?" +   owner: root:root +   permissions: '0644' +   path: /srv/foo + - content: | +   "IT SURE DOES!" +   owner: root:root +   permissions: '0644' +   path: /srv/bar +``` + +除了使用 Cloud-init 提供的 `user-data` 模块制作 YAML 文件外,你还可以将其制作成一个可执行脚本供 Cloud-init 运行。 + +创建 `user-data` 文件后,在容器文件中添加以下行,以便在重建映像时将其复制到镜像中: + +``` +# Copy the user-data file into the container image +COPY user-data ${WWW_DIR}/user-data +``` + +重建镜像,并创建和运行一个新的容器,这次使用用户数据信息: + +``` +# Build a new image named cloud-init:03 +podman build -f Containerfile -t cloud-init:03 . + +# Run a new container with this new user-data file +podman run --rm -p 8080:8080 -it cloud-init:03 +``` + +现在,重启 Cloud-init 客户端,观察 Web 服务器上的 Nginx 日志: + +``` +127.0.0.1 - - [09/May/2020:23:01:51 +0000] "GET /meta-data HTTP/1.1" 200 63 "-" "Cloud-Init/17.1" "-" +127.0.0.1 - - [09/May/2020:23:01:51 +0000] "GET /user-data HTTP/1.1" 200 298 "-" "Cloud-Init/17.1" "- +``` + +成功了!这一次,元数据和用户数据文件都被送到了 Cloud-init 客户端。 + +### 验证 Cloud-init 已运行 + +从上面的日志中,你知道 Cloud-init 在客户端主机上运行并请求元数据和用户数据文件,但它用它们做了什么?你可以在 `write_files` 部分验证 Cloud-init 是否写入了你在用户数据文件中添加的文件。 + +在 Cloud-init 客户端上,检查 `/srv/foo` 和 `/srv/bar` 文件的内容: + +``` +# cd /srv/ && ls +bar foo +# cat foo +"Does cloud-init work?" +# cat bar +"IT SURE DOES!" +``` + +成功了!文件已经写好了,并且有你期望的内容。 + +如上所述,还有很多其他模块可以用来配置主机。例如,用户数据文件可以配置成用 `apt` 添加包、复制 SSH 的 `authorized_keys`、创建用户和组、配置和运行配置管理工具等等。我在家里的私有云中使用它来复制我的 `authorized_keys`、创建一个本地用户和组,并设置 sudo 权限。 + +### 你接下来可以做什么 + +Cloud-init 在家庭实验室中很有用,尤其是专注于云技术的实验室。本文所演示的简单服务对于家庭实验室来说可能并不是超级有用,但现在你已经知道 Cloud-init 是如何工作的了,你可以继续创建一个动态服务,可以用自定义数据配置每台主机,让家里的私有云更类似于主流云提供商提供的服务。 + +在数据源稍显复杂的情况下,将新的物理(或虚拟)机器添加到家中的私有云中,可以像插入它们并打开它们一样简单。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/create-simple-cloud-init-service-your-homelab + +作者:[Chris Collins][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/clcollins +[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://cloudinit.readthedocs.io/ +[3]: https://linux.cn/article-12371-1.html +[4]: https://opensource.com/sites/default/files/uploads/cloud-init.jpg (A screen showing the boot process for a Linux server running Cloud-init ) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://linux.cn/article-12277-1.html +[7]: https://cloudinit.readthedocs.io/en/latest/topics/datasources.html +[8]: https://podman.io/ +[9]: https://github.com/clcollins/homelabCloudInit/tree/master/simpleCloudInitService/data +[10]: https://cloudinit.readthedocs.io/en/latest/topics/instancedata.html#what-is-instance-data +[11]: https://cloudinit.readthedocs.io/en/latest/topics/modules.html diff --git a/published/202007/20200605 Build a Kubernetes cluster with the Raspberry Pi.md b/published/202007/20200605 Build a Kubernetes cluster with the Raspberry Pi.md new file mode 100644 index 0000000000..3055c80de0 --- /dev/null +++ b/published/202007/20200605 Build a Kubernetes cluster with the Raspberry Pi.md @@ -0,0 +1,424 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12421-1.html) +[#]: subject: (Build a Kubernetes cluster with the Raspberry Pi) +[#]: via: (https://opensource.com/article/20/6/kubernetes-raspberry-pi) +[#]: author: (Chris Collins https://opensource.com/users/clcollins) + +用树莓派构建 Kubernetes 集群 +====== + +> 将 Kubernetes 安装在多个树莓派上,实现自己的“家庭私有云”容器服务。 + +![](https://img.linux.net.cn/data/attachment/album/202007/15/234152ivw1y2wwhmhmpuvo.jpg) + +[Kubernetes][2] 从一开始就被设计为云原生的企业级容器编排系统。它已经成长为事实上的云容器平台,并由于接受了容器原生虚拟化和无服务器计算等新技术而继续发展。 + +从微型的边缘计算到大规模的容器环境,无论是公有云还是私有云环境,Kubernetes 都可以管理其中的容器。它是“家庭私有云”项目的理想选择,既提供了强大的容器编排,又让你有机会了解一项这样的技术 —— 它的需求如此之大,与云计算结合得如此彻底,以至于它的名字几乎就是“云计算”的代名词。 + +没有什么比 Kubernetes 更懂“云”,也没有什么能比树莓派更合适“集群起来”!在廉价的树莓派硬件上运行本地的 Kubernetes 集群是获得在真正的云技术巨头上进行管理和开发的经验的好方法。 + +### 在树莓派上安装 Kubernetes 集群 + +本练习将在三个或更多运行 Ubuntu 20.04 的树莓派 4 上安装 Kubernetes 1.18.2 集群。Ubuntu 20.04(Focal Fossa)提供了针对 64 位 ARM(ARM64)的树莓派镜像(64 位内核和用户空间)。由于目标是使用这些树莓派来运行 Kubernetes 集群,因此运行 AArch64 容器镜像的能力非常重要:很难找到 32 位的通用软件镜像乃至于标准基础镜像。借助 Ubuntu 20.04 的 ARM64 镜像,可以让你在 Kubernetes 上使用 64 位容器镜像。 + +#### AArch64 vs. ARM64;32 位 vs. 64 位;ARM vs. x86 + +请注意,AArch64 和 ARM64 实际上是同一种东西。不同的名称源于它们在不同社区中的使用。许多容器镜像都标为 AArch64,并能在标为 ARM64 的系统上正常运行。采用 AArch64/ARM64 架构的系统也能够运行 32 位的 ARM 镜像,但反之则不然:32 位的 ARM 系统无法运行 64 位的容器镜像。这就是 Ubuntu 20.04 ARM64 镜像如此有用的原因。 + +这里不会太深入地解释不同的架构类型,值得注意的是,ARM64/AArch64 和 x86\_64 架构是不同的,运行在 64 位 ARM 架构上的 Kubernetes 节点无法运行为 x86\_64 构建的容器镜像。在实践中,你会发现有些镜像没有为两种架构构建,这些镜像可能无法在你的集群中使用。你还需要在基于 Arch64 的系统上构建自己的镜像,或者跳过一些限制以让你的常规的 x86\_64 系统构建 Arch64 镜像。在“家庭私有云”项目的后续文章中,我将介绍如何在常规系统上构建 AArch64 镜像。 + +为了达到两全其美的效果,在本教程中设置好 Kubernetes 集群后,你可以在以后向其中添加 x86\_64 节点。你可以通过使用 [Kubernetes 的污点taint容忍toleration][3] 能力,由 Kubernetes 的调度器将给定架构的镜像调度到相应的节点上运行。 + +关于架构和镜像的内容就不多说了。是时候安装 Kubernetes 了,开始吧! + +#### 前置需求 + +这个练习的要求很低。你将需要: + +* 三台(或更多)树莓派 4(最好是 4GB 内存的型号)。 +* 在全部树莓派上安装 Ubuntu 20.04 ARM64。 + +为了简化初始设置,请阅读《[修改磁盘镜像来创建基于树莓派的家庭实验室][4]》,在将 Ubuntu 镜像写入 SD 卡并安装在树莓派上之前,添加一个用户和 SSH 授权密钥(`authorized_keys`)。 + +### 配置主机 + +在 Ubuntu 被安装在树莓派上,并且可以通过 SSH 访问后,你需要在安装 Kubernetes 之前做一些修改。 + +#### 安装和配置 Docker + +截至目前,Ubuntu 20.04 在 base 软件库中提供了最新版本的 Docker,即 v19.03,可以直接使用 `apt` 命令安装它。请注意,包名是 `docker.io`。请在所有的树莓派上安装 Docker: + +``` +# 安装 docker.io 软件包 +$ sudo apt install -y docker.io +``` + +安装好软件包后,你需要做一些修改来启用 [cgroup][5](控制组)。cgroup 允许 Linux 内核限制和隔离资源。实际上,这可以让 Kubernetes 更好地管理其运行的容器所使用的资源,并通过让容器彼此隔离来增加安全性。 + +在对所有树莓派进行以下修改之前,请检查 `docker info` 的输出: + +``` +# 检查 `docker info` +# 省略了某些输出 +$ sudo docker info +(...) + Cgroup Driver: cgroups +(...) +WARNING: No memory limit support +WARNING: No swap limit support +WARNING: No kernel memory limit support +WARNING: No kernel memory TCP limit support +WARNING: No oom kill disable support +``` + +上面的输出突出显示了需要修改的部分:cgroup 驱动和限制支持。 + +首先,将 Docker 使用的默认 cgroup 驱动从 `cgroups` 改为 `systemd`,让 systemd 充当 cgroup 管理器,确保只有一个 cgroup 管理器在使用。这有助于系统的稳定性,这也是 Kubernetes 所推荐的。要做到这一点,请创建 `/etc/docker/daemon.json` 文件或将内容替换为: + +``` +# 创建或替换 /etc/docker/daemon.json 以启用 cgroup 的 systemd 驱动 + +$ sudo cat > /etc/docker/daemon.json <容器网络接口Container Network Interface(CNI)加载项使用。本练习使用的是 [Flannel][7] CNI。你选择的 CIDR 不应该与你的家庭网络中当前使用的任何 CIDR 重叠,也不应该与你的路由器或 DHCP 服务器管理的 CIDR 重叠。确保使用一个比你预期需要的更大的子网:**总是**有比你最初计划的更多的 Pod!在这个例子中,我将使用 CIDR 地址 `10.244.0.0/16`,但你可以选择一个适合你的。 + +有了这些决定,你就可以初始化控制平面节点了。用 SSH 或其他方式登录到你为控制平面指定的节点。 + +#### 初始化控制平面 + +Kubernetes 使用一个引导令牌来验证被加入集群的节点。当初始化控制平面节点时,需要将此令牌传递给 `kubeadm init` 命令。用 `kubeadm token generate` 命令生成一个令牌: + +``` +# 生成一个引导令牌来验证加入集群的节点 +$ TOKEN=$(sudo kubeadm token generate) +$ echo $TOKEN +d584xg.xupvwv7wllcpmwjy +``` + +现在你可以使用 `kubeadm init` 命令来初始化控制平面了: + +``` +# 初始化控制平面 +#(输出略) +$ sudo kubeadm init --token=${TOKEN} --kubernetes-version=v1.18.2 --pod-network-cidr=10.244.0.0/16 +``` + +如果一切顺利,你应该在输出的最后看到类似这样的东西: + +``` +Your Kubernetes control-plane has initialized successfully! + +To start using your cluster, you need to run the following as a regular user: + + mkdir -p $HOME/.kube + sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config + sudo chown $(id -u):$(id -g) $HOME/.kube/config + +You should now deploy a pod network to the cluster. +Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: + https://kubernetes.io/docs/concepts/cluster-administration/addons/ + +Then you can join any number of worker nodes by running the following on each as root: + +kubeadm join 192.168.2.114:6443 --token zqqoy7.9oi8dpkfmqkop2p5 \ + --discovery-token-ca-cert-hash sha256:71270ea137214422221319c1bdb9ba6d4b76abfa2506753703ed654a90c4982b +``` + +注意两点:第一,Kubernetes 的 `kubectl` 连接信息已经写入到 `/etc/kubernetes/admin.conf`。这个 kubeconfig 文件可以复制到用户的 `~/.kube/config` 中,可以是主节点上的 root 用户或普通用户,也可以是远程机器。这样你就可以用 `kubectl` 命令来控制你的集群。 + +其次,输出中以 `kubernetes join` 开头的最后一行是你可以运行的命令,你可以运行这些命令加入更多的节点到集群中。 + +将新的 kubeconfig 复制到你的用户可以使用的地方后,你可以用 `kubectl get nodes` 命令来验证控制平面是否已经安装: + +``` +# 显示 Kubernetes 集群中的节点 +# 你的节点名称会有所不同 +$ kubectl get nodes +NAME         STATUS   ROLES    AGE     VERSION +elderberry   Ready    master   7m32s   v1.18.2 +``` + +#### 安装 CNI 加载项 + +CNI 加载项负责 Pod 网络的配置和清理。如前所述,这个练习使用的是 Flannel CNI 加载项,在已经设置好 `podCIDR` 值的情况下,你只需下载 Flannel YAML 并使用 `kubectl apply` 将其安装到集群中。这可以用 `kubectl apply -f -` 从标准输入中获取数据,用一行命令完成。这将创建管理 Pod 网络所需的 ClusterRoles、ServiceAccounts 和 DaemonSets 等。 + +下载并应用 Flannel YAML 数据到集群中: + +``` +# 下载 Flannel YAML 数据并应用它 +# (输出略) +$ curl -sSL https://raw.githubusercontent.com/coreos/flannel/v0.12.0/Documentation/kube-flannel.yml | kubectl apply -f - +``` + +#### 将计算节点加入到集群中 + +有了 CNI 加载项,现在是时候将计算节点添加到集群中了。加入计算节点只需运行 `kube init` 命令末尾提供的 `kubeadm join` 命令来初始化控制平面节点。对于你想加入集群的其他树莓派,登录主机,运行命令即可: + +``` +# 加入节点到集群,你的令牌和 ca-cert-hash 应各有不同 +$ sudo kubeadm join 192.168.2.114:6443 --token zqqoy7.9oi8dpkfmqkop2p5 \ +    --discovery-token-ca-cert-hash sha256:71270ea137214422221319c1bdb9ba6d4b76abfa2506753703ed654a90c4982b +``` + +一旦你完成了每个节点的加入,你应该能够在 `kubectl get nodes` 的输出中看到新节点: + +``` +# 显示 Kubernetes 集群中的节点 +# 你的节点名称会有所不同 +$ kubectl get nodes +NAME         STATUS   ROLES    AGE     VERSION +elderberry   Ready    master   7m32s   v1.18.2 +gooseberry    Ready    <none>   2m39s   v1.18.2 +huckleberry   Ready    <none>   17s     v1.18.2 +``` + +#### 验证集群 + +此时,你已经拥有了一个完全正常工作的 Kubernetes 集群。你可以运行 Pod、创建部署和作业等。你可以使用[服务][8]从集群中的任何一个节点访问集群中运行的应用程序。你可以通过 NodePort 服务或入口控制器实现外部访问。 + +要验证集群正在运行,请创建一个新的命名空间、部署和服务,并检查在部署中运行的 Pod 是否按预期响应。此部署使用 `quay.io/clcollins/kube-verify:01` 镜像,这是一个监听请求的 Nginx 容器(实际上,与文章《[使用 Cloud-init 将节点添加到你的私有云][9]》中使用的镜像相同)。你可以在[这里][10]查看镜像的容器文件。 + +为部署创建一个名为 `kube-verify` 的命名空间: + +``` +# 创建一个新的命名空间 +$ kubectl create namespace kube-verify +# 列出命名空间 +$ kubectl get namespaces +NAME              STATUS   AGE +default           Active   63m +kube-node-lease   Active   63m +kube-public       Active   63m +kube-system       Active   63m +kube-verify       Active   19s +``` + +现在,在新的命名空间创建一个部署: + +``` +# 创建一个新的部署 +$ cat < + + + +``` + +成功了!你的服务正在运行,容器内的 Nginx 正在响应你的请求。你的服务正在运行,容器内的 Nginx 正在响应你的请求。 + +此时,你的树莓派上有一个正在运行的 Kubernetes 集群,安装了一个 CNI 加载项(Flannel),并有一个运行 Nginx Web 服务器的测试部署和服务。在大型公有云中,Kubernetes 有不同的入口控制器来与不同的解决方案交互,比如最近报道的 [Skipper][12] 项目。同样,私有云也有与硬件负载均衡器设备(如 F5 Networks 的负载均衡器)交互的入口控制器,或用于处理进入节点的流量的 Nginx 和 HAProxy 控制器。 + +在以后的文章中,我将通过安装自己的入口控制器来解决将集群中的服务暴露给外界的问题。我还将研究动态存储供应器和 StorageClasses,以便为应用程序分配持久性存储,包括利用你在上一篇文章《[将树莓派家庭实验室变成网络文件系统][13]》中设置的 NFS 服务器来为你的 Pod 创建按需存储。 + +### 去吧,Kubernetes + +“Kubernetes”(κυβερνήτης)在希腊语中是飞行员的意思 —— 但这是否意味着驾驶船只以及引导船只的人?诶,不是。“Kubernan”(κυβερνάω)是希腊语“驾驶”或“引导”的意思,因此,去吧,Kubernan,如果你在会议上或其它什么活动上看到我,请试着给我一个动词或名词的通行证,以另一种语言 —— 我不会说的语言。 + +免责声明:如前所述,我不会读也不会讲希腊语,尤其是古希腊语,所以我选择相信我在网上读到的东西。你知道那是怎么一回事。我对此有所保留,放过我吧,因为我没有开“对我来说都是希腊语”这种玩笑。然而,只是提一下,虽然我可以开玩笑,但是实际上没有,所以我要么偷偷摸摸,要么聪明,要么两者兼而有之。或者,两者都不是。我并没有说这是个好笑话。 + +所以,去吧,像专业人员一样在你的家庭私有云中用自己的 Kubernetes 容器服务来试运行你的容器吧!当你越来越得心应手时,你可以修改你的 Kubernetes 集群,尝试不同的选项,比如前面提到的入口控制器和用于持久卷的动态 StorageClasses。 + +这种持续学习是 [DevOps][14] 的核心,持续集成和新服务交付反映了敏捷方法论,当我们学会了处理云实现的大规模扩容,并发现我们的传统做法无法跟上步伐时,我们就接受了这两种方法论。 + +你看,技术、策略、哲学、一小段希腊语和一个可怕的原始笑话,都汇聚在一篇文章当中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/kubernetes-raspberry-pi + +作者:[Chris Collins][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/clcollins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/raspberrypi_cartoon.png?itok=m3TcBONJ (Cartoon graphic of Raspberry Pi board) +[2]: https://opensource.com/resources/what-is-kubernetes +[3]: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ +[4]: https://linux.cn/article-12277-1.html +[5]: https://en.wikipedia.org/wiki/Cgroups +[6]: https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing +[7]: https://github.com/coreos/flannel +[8]: https://kubernetes.io/docs/concepts/services-networking/service/ +[9]: https://linux.cn/article-12407-1.html +[10]: https://github.com/clcollins/homelabCloudInit/blob/master/simpleCloudInitService/data/Containerfile +[11]: http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" +[12]: https://opensource.com/article/20/4/http-kubernetes-skipper +[13]: https://linux.cn/article-12413-1.html +[14]: https://opensource.com/tags/devops diff --git a/published/202007/20200608 How to Create Curve Text in GIMP in 5 Simple Steps -GIMP Beginner-s Tutorial.md b/published/202007/20200608 How to Create Curve Text in GIMP in 5 Simple Steps -GIMP Beginner-s Tutorial.md new file mode 100644 index 0000000000..3a6c0a44d4 --- /dev/null +++ b/published/202007/20200608 How to Create Curve Text in GIMP in 5 Simple Steps -GIMP Beginner-s Tutorial.md @@ -0,0 +1,114 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12396-1.html) +[#]: subject: (How to Create Curve Text in GIMP in 5 Simple Steps [GIMP Beginner’s Tutorial]) +[#]: via: (https://itsfoss.com/curve-text-gimp/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +GIMP 教程:如何在 GIMP 中创建曲线文本 +====== + +当你在 GIMP 中制作一个徽章、海报或其它任何作品时,你需要扭曲或弯曲一些文本。多功能的 [GIMP][1] 工具提供了一些创建弯曲文本的方法。取决于你将如何使用它和你想给予文本的弧度,有一些适合不同情况的方法。 + +在本篇教程中,我将向你展示我最喜欢的创建曲线文本的方法。 + +### 如何在 GIMP 中创建曲线文本 + +![][2] + +请确保你已经在你的系统上安装了 GIMP。 + +#### 步骤 1: 创建一个你想要的匹配曲线的路径 + +创建一个新的图像或打开一个现有的图像。选择 “工具 -> 路径”,然后大致考虑曲线文本的位置,通过分别单击路径点的开始点和结束点来创建路径。 + +![创建一个路径][3] + +**然后给你的路径一个曲率。**首先向上或向下拖动中间的直线,然后通过移动调整点进行微调。这将给予它一个拱形结构。 + +![弯曲路径][4] + +#### 步骤 2: 创建你想弯曲的文本 + +当你对自己的曲线路径满意时,你可以移动到接下来的步骤,并 **创建你的文本**。 + +你可能想更改字体及其大小。我的选择只是为了演示用途。 + +![创建一个文本][5] + +#### 步骤 3: 创建一个新的图层 + +我强烈建议分割 GIMP 图像中的每个不同的元素到不同的图层中,以便很容易地控制它们,像移动,打开/关闭一个元素等等。 + +遵循这一规则,我们要弯曲的文本将被放置到一个新的图层中。建议使用像 “Curved Text” 一样的名字来命名你的新的图层,或者一些类似的东西来很容易地识别它。 + +![为弯曲的文本创建一个新的图层][6] + +#### 步骤 4: 弯曲文本 + +现在你需要在你的文本图层上单击,接下来在其上右击,并单击“文字对齐路径”来折弯你的文本。弯曲的文本将被放置到新创建的图层。 + +![文字对齐路径][7] + +你把文本弯曲了!让我们使用颜色填充文本来使其更令人满意。 + +### 步骤 5: 最后的修饰和导出 + +单击弯曲的文本图层,然后转到路径选项卡来选择文本边界。 + +![路径选择][8] + +最后,选择油漆桶工具,选择一种颜色,并如下应用你的选择区。 + +![][9] + +随着最后一步的到来,打开不需要的层的可见性,只保留曲线文本。接下来,需要导出你的文件为你喜欢的图像格式。 + +![][10] + +#### 额外提示:创建阴影效果 + +我还有一个作为一次挑战的额外的步骤,如果你想更进一步的话。让我们在 [GIMP 中勾勒文本][11]以创建一个弯曲文本的阴影效果。 + +我将给予你一些提示: + + * 重新启用所有图层 + * 单击弯曲文本图层,并使用移动工具来到处移动文本 + * 创建另一个图层,并使用黑色来重复油漆桶填充程序 + * 以一种模拟一种阴影位置的方式覆盖图层(你可能需要更改图层顺序) + * 关闭辅助图层 + +最终结果: + +![][12] + +让我在评论区知道你们对这篇 GIMP 教程的想法,以及有多少人尝试了这一额外的步骤。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/curve-text-gimp/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://www.gimp.org/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/Curve-text-in-GIMP.jpg?ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/1image-1.png?fit=800%2C508&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/2.png?fit=800%2C500&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/3.png?fit=800%2C503&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/new-layer.png?fit=800%2C637&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/text-along-path.png?fit=800%2C625&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/path-to-selection.png?ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/6.png?fit=800%2C539&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/4.png-copy.png?ssl=1 +[11]: https://itsfoss.com/gimp-text-outline/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/its-foss-curved.jpg?fit=800%2C409&ssl=1 +[13]: https://itsfoss.com/subscribe-to-newsletter/ diff --git a/published/202007/20200611 Stop debugging Go with Println and use Delve instead.md b/published/202007/20200611 Stop debugging Go with Println and use Delve instead.md new file mode 100644 index 0000000000..ed93db45b4 --- /dev/null +++ b/published/202007/20200611 Stop debugging Go with Println and use Delve instead.md @@ -0,0 +1,552 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxbwolf) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12400-1.html) +[#]: subject: (Stop debugging Go with Println and use Delve instead) +[#]: via: (https://opensource.com/article/20/6/debug-go-delve) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) + +使用 Delve 代替 Println 来调试 Go 程序 +====== + +> Delve 是能让调试变成轻而易举的事的万能工具包。 + +![](https://img.linux.net.cn/data/attachment/album/202007/09/234357pavw88sbxab0makj.jpg) + +你上次尝试去学习一种新的编程语言时什么时候?你有没有持之以恒,你是那些在新事物发布的第一时间就勇敢地去尝试的一员吗?不管怎样,学习一种新的语言也许非常有用,也会有很多乐趣。 + +你尝试着写简单的 “Hello, world!”,然后写一些示例代码并执行,继续做一些小的修改,之后继续前进。我敢保证我们都有过这个经历,不论我们使用哪种技术。假如你尝试用一段时间一种语言,并且你希望能够精通它,那么有一些事物能在你的进取之路上帮助你。 + +其中之一就是调试器。有些人喜欢在代码中用简单的 “print” 语句进行调试,这种方式很适合代码量少的简单程序;然而,如果你处理的是有多个开发者和几千行代码的大型项目,你应该使用调试器。 + +最近我开始学习 Go 编程语言了,在本文中,我们将探讨一种名为 Delve 的调试器。Delve 是专门用来调试 Go 程序的工具,我们会借助一些 Go 示例代码来了解下它的一些功能。不要担心这里展示的 Go 示例代码;即使你之前没有写过 Go 代码也能看懂。Go 的目标之一是简单,因此代码是始终如一的,理解和解释起来都很容易。 + +### Delve 介绍 + +Delve 是托管在 [GitHub][2] 上的一个开源项目。 + +它自己的文档中写道: + +> Delve 是 Go 编程语言的调试器。该项目的目标是为 Go 提供一个简单、全功能的调试工具。Delve 应该是易于调用和易于使用的。当你使用调试器时,事情可能不会按你的思路运行。如果你这样想,那么你不适合用 Delve。 + +让我们来近距离看一下。 + +我的测试系统是运行着 Fedora Linux 的笔记本电脑,Go 编译器版本如下: + +``` +$ cat /etc/fedora-release +Fedora release 30 (Thirty) +$ +$ go version +go version go1.12.17 linux/amd64 +$ +``` + +### Golang 安装 + +如果你没有安装 Go,你可以运行下面的命令,很轻松地就可以从配置的仓库中获取。 + +``` +$ dnf install golang.x86_64 +``` + +或者,你可以在[安装页面][3]找到适合你的操作系统的其他安装版本。 + +在开始之前,请先确认已经设置好了 Go 工具依赖的下列各个路径。如果这些路径没有设置,有些示例可能不能正常运行。你可以在 SHELL 的 RC 文件中轻松设置这些环境变量,我的机器上是在 `$HOME/bashrc` 文件中设置的。 + +``` +$ go env | grep GOPATH +GOPATH="/home/user/go" +$ +$ go env | grep GOBIN +GOBIN="/home/user/go/gobin" +$ +``` + +### Delve 安装 + +你可以像下面那样,通过运行一个简单的 `go get` 命令来安装 Delve。`go get` 是 Golang 从外部源下载和安装需要的包的方式。如果你安装过程中遇到了问题,可以查看 [Delve 安装教程][4]。 + +``` +$ go get -u github.com/go-delve/delve/cmd/dlv +$ +``` + +运行上面的命令,就会把 Delve 下载到你的 `$GOPATH` 的位置,如果你没有把 `$GOPATH` 设置成其他值,那么默认情况下 `$GOPATH` 和 `$HOME/go` 是同一个路径。 + +你可以进入 `go/` 目录,你可以在 `bin/` 目录下看到 `dlv`。 + +``` +$ ls -l $HOME/go +total 8 +drwxrwxr-x. 2 user user 4096 May 25 19:11 bin +drwxrwxr-x. 4 user user 4096 May 25 19:21 src +$ +$ ls -l ~/go/bin/ +total 19596 +-rwxrwxr-x. 1 user user 20062654 May 25 19:17 dlv +$ +``` + +因为你把 Delve 安装到了 `$GOPATH`,所以你可以像运行普通的 shell 命令一样运行它,即每次运行时你不必先进入它所在的目录。你可以通过 `version` 选项来验证 `dlv` 是否正确安装。示例中安装的版本是 1.4.1。 + +``` +$ which dlv +~/go/bin/dlv +$ +$ dlv version +Delve Debugger +Version: 1.4.1 +Build: $Id: bda606147ff48b58bde39e20b9e11378eaa4db46 $ +$ +``` + +现在,我们一起在 Go 程序中使用 Delve 来理解下它的功能以及如何使用它们。我们先来写一个 `hello.go`,简单地打印一条 `Hello, world!` 信息。 + +记着,我把这些示例程序放到了 `$GOBIN` 目录下。 + +``` +$ pwd +/home/user/go/gobin +$ +$ cat hello.go +package main + +import "fmt" + +func main() { +        fmt.Println("Hello, world!") +} +$ +``` + +运行 `build` 命令来编译一个 Go 程序,它的输入是 `.go` 后缀的文件。如果程序没有语法错误,Go 编译器把它编译成一个二进制可执行文件。这个文件可以被直接运行,运行后我们会在屏幕上看到 `Hello, world!` 信息。 + +``` +$ go build hello.go +$ +$ ls -l hello +-rwxrwxr-x. 1 user user 1997284 May 26 12:13 hello +$ +$ ./hello +Hello, world! +$ +``` + +### 在 Delve 中加载程序 + +把一个程序加载进 Delve 调试器有两种方式。 + +#### 在源码编译成二进制文件之前使用 debug 参数 + +第一种方式是在需要时对源码使用 `debug` 命令。Delve 会为你编译出一个名为 `__debug_bin` 的二进制文件,并把它加载进调试器。 + +在这个例子中,你可以进入 `hello.go` 所在的目录,然后运行 `dlv debug` 命令。如果目录中有多个源文件且每个文件都有自己的主函数,Delve 则可能抛出错误,它期望的是单个程序或从单个项目构建成单个二进制文件。如果出现了这种错误,那么你就应该用下面展示的第二种方式。 + +``` +$ ls -l +total 4 +-rw-rw-r--. 1 user user 74 Jun  4 11:48 hello.go +$ +$ dlv debug +Type 'help' for list of commands. +(dlv) +``` + +现在打开另一个终端,列出目录下的文件。你可以看到一个多出来的 `__debug_bin` 二进制文件,这个文件是由源码编译生成的,并会加载进调试器。你现在可以回到 `dlv` 提示框继续使用 Delve。 + +``` +$ ls -l +total 2036 +-rwxrwxr-x. 1 user user 2077085 Jun  4 11:48 __debug_bin +-rw-rw-r--. 1 user user      74 Jun  4 11:48 hello.go +$ +``` + +#### 使用 exec 参数 + +如果你已经有提前编译好的 Go 程序或者已经用 `go build` 命令编译完成了,不想再用 Delve 编译出 `__debug_bin` 二进制文件,那么第二种把程序加载进 Delve 的方法在这些情况下会很有用。在上述情况下,你可以使用 `exec` 命令来把整个目录加载进 Delve 调试器。 + +``` +$ ls -l +total 4 +-rw-rw-r--. 1 user user 74 Jun  4 11:48 hello.go +$ +$ go build hello.go +$ +$ ls -l +total 1956 +-rwxrwxr-x. 1 user user 1997284 Jun  4 11:54 hello +-rw-rw-r--. 1 user user      74 Jun  4 11:48 hello.go +$ +$ dlv exec ./hello +Type 'help' for list of commands. +(dlv) +``` + +### 查看 delve 帮助信息 + +在 `dlv` 提示符中,你可以运行 `help` 来查看 Delve 提供的多种帮助选项。命令列表相当长,这里我们只列举一些重要的功能。下面是 Delve 的功能概览。 + +``` +(dlv) help +The following commands are available: + +Running the program: + +Manipulating breakpoints: + +Viewing program variables and memory: + +Listing and switching between threads and goroutines: + +Viewing the call stack and selecting frames: + +Other commands: + +Type help followed by a command for full documentation. +(dlv) +``` + +#### 设置断点 + +现在我们已经把 hello.go 程序加载进了 Delve 调试器,我们在主函数处设置断点,稍后来确认它。在 Go 中,主程序从 `main.main` 处开始执行,因此你需要给这个名字提供个 `break` 命令。之后,我们可以用 `breakpoints` 命令来检查断点是否正确设置了。 + +不要忘了你还可以用命令简写,因此你可以用 `b main.main` 来代替 `break main.main`,两者效果相同,`bp` 和 `breakpoints` 同理。你可以通过运行 `help` 命令查看帮助信息来找到你想要的命令简写。 + +``` +(dlv) break main.main +Breakpoint 1 set at 0x4a228f for main.main() ./hello.go:5 +(dlv) breakpoints +Breakpoint runtime-fatal-throw at 0x42c410 for runtime.fatalthrow() /usr/lib/golang/src/runtime/panic.go:663 (0) +Breakpoint unrecovered-panic at 0x42c480 for runtime.fatalpanic() /usr/lib/golang/src/runtime/panic.go:690 (0) +        print runtime.curg._panic.arg +Breakpoint 1 at 0x4a228f for main.main() ./hello.go:5 (0) +(dlv) +``` + +#### 程序继续执行 + +现在,我们用 `continue` 来继续运行程序。它会运行到断点处中止,在我们的例子中,会运行到主函数的 `main.main` 处中止。从这里开始,我们可以用 `next` 命令来逐行执行程序。请注意,当我们运行到 `fmt.Println("Hello, world!")` 处时,即使我们还在调试器里,我们也能看到打印到屏幕的 `Hello, world!`。 + +``` +(dlv) continue +> main.main() ./hello.go:5 (hits goroutine(1):1 total:1) (PC: 0x4a228f) +     1: package main +     2: +     3: import "fmt" +     4: +=>   5:      func main() { +     6:         fmt.Println("Hello, world!") +     7: } +(dlv) next +> main.main() ./hello.go:6 (PC: 0x4a229d) +     1: package main +     2: +     3: import "fmt" +     4: +     5: func main() { +=>   6:              fmt.Println("Hello, world!") +     7: } +(dlv) next +Hello, world! +> main.main() ./hello.go:7 (PC: 0x4a22ff) +     2: +     3: import "fmt" +     4: +     5: func main() { +     6:         fmt.Println("Hello, world!") +=>   7:      } +(dlv) +``` + +#### 退出 Delve + +你随时可以运行 `quit` 命令来退出调试器,退出之后你会回到 shell 提示符。相当简单,对吗? + +``` +(dlv) quit +$ +``` + +### Delve 的其他功能 + +我们用其他的 Go 程序来探索下 Delve 的其他功能。这次,我们从 [golang 教程][5] 中找了一个程序。如果你要学习 Go 语言,那么 Golang 教程应该是你的第一站。 + +下面的程序,`functions.go` 中简单展示了 Go 程序中是怎样定义和调用函数的。这里,我们有一个简单的把两数相加并返回和值的 `add()` 函数。你可以像下面那样构建程序并运行它。 + +``` +$ cat functions.go +package main + +import "fmt" + +func add(x int, y int) int { +        return x + y +} + +func main() { +        fmt.Println(add(42, 13)) +} +$ +``` + +你可以像下面那样构建和运行程序。 + +``` +$ go build functions.go  && ./functions +55 +$ +``` + +#### 进入函数 + +跟前面展示的一样,我们用前面提到的一个选项来把二进制文件加载进 Delve 调试器,再一次在 `main.main` 处设置断点,继续运行程序直到断点处。然后执行 `next` 直到 `fmt.Println(add(42, 13))` 处;这里我们调用了 `add()` 函数。我们可以像下面展示的那样,用 Delve 的 `step` 命令从 `main` 函数进入 `add()` 函数。 + +``` +$ dlv debug +Type 'help' for list of commands. +(dlv) break main.main +Breakpoint 1 set at 0x4a22b3 for main.main() ./functions.go:9 +(dlv) c +> main.main() ./functions.go:9 (hits goroutine(1):1 total:1) (PC: 0x4a22b3) +     4: +     5: func add(x int, y int) int { +     6:         return x + y +     7: } +     8: +=>   9:      func main() { +    10:         fmt.Println(add(42, 13)) +    11: } +(dlv) next +> main.main() ./functions.go:10 (PC: 0x4a22c1) +     5: func add(x int, y int) int { +     6:         return x + y +     7: } +     8: +     9: func main() { +=>  10:              fmt.Println(add(42, 13)) +    11: } +(dlv) step +> main.add() ./functions.go:5 (PC: 0x4a2280) +     1: package main +     2: +     3: import "fmt" +     4: +=>   5:      func add(x int, y int) int { +     6:         return x + y +     7: } +     8: +     9: func main() { +    10:         fmt.Println(add(42, 13)) +(dlv) +``` + +#### 使用`文件名:行号`来设置断点 + +上面的例子中,我们经过 `main` 函数进入了 `add()` 函数,但是你也可以在你想加断点的地方直接使用“文件名:行号”的组合。下面是在 `add()` 函数开始处加断点的另一种方式。 + +``` +(dlv) break functions.go:5 +Breakpoint 1 set at 0x4a2280 for main.add() ./functions.go:5 +(dlv) continue +> main.add() ./functions.go:5 (hits goroutine(1):1 total:1) (PC: 0x4a2280) +     1: package main +     2: +     3: import "fmt" +     4: +=>   5:      func add(x int, y int) int { +     6:         return x + y +     7: } +     8: +     9: func main() { +    10:         fmt.Println(add(42, 13)) +(dlv) +``` + +#### 查看当前的栈信息 + +现在我们运行到了 `add()` 函数,我们可以在 Delve 中用 `stack` 命令查看当前栈的内容。这里在 `0` 位置展示了栈顶的函数 `add()` ,紧接着在 `1` 位置展示了调用 `add()` 函数的 `main.main`。在 `main.main` 下面的函数属于 Go 运行时,是用来处理加载和执行该程序的。 + +``` +(dlv) stack +0  0x00000000004a2280 in main.add +   at ./functions.go:5 +1  0x00000000004a22d7 in main.main +   at ./functions.go:10 +2  0x000000000042dd1f in runtime.main +   at /usr/lib/golang/src/runtime/proc.go:200 +3  0x0000000000458171 in runtime.goexit +   at /usr/lib/golang/src/runtime/asm_amd64.s:1337 +(dlv) +``` + +#### 在帧之间跳转 + +在 Delve 中我们可以用 `frame` 命令实现帧之间的跳转。在下面的例子中,我们用 `frame` 实现了从 `add()` 帧跳到 `main.main` 帧,以此类推。 + +``` +(dlv) frame 0 +> main.add() ./functions.go:5 (hits goroutine(1):1 total:1) (PC: 0x4a2280) +Frame 0: ./functions.go:5 (PC: 4a2280) +     1: package main +     2: +     3: import "fmt" +     4: +=>   5:      func add(x int, y int) int { +     6:         return x + y +     7: } +     8: +     9: func main() { +    10:         fmt.Println(add(42, 13)) +(dlv) frame 1 +> main.add() ./functions.go:5 (hits goroutine(1):1 total:1) (PC: 0x4a2280) +Frame 1: ./functions.go:10 (PC: 4a22d7) +     5: func add(x int, y int) int { +     6:         return x + y +     7: } +     8: +     9: func main() { +=>  10:              fmt.Println(add(42, 13)) +    11: } +(dlv) +``` + +#### 打印函数参数 + +一个函数通常会接收多个参数。在 `add()` 函数中,它的入参是两个整型。Delve 有个便捷的 `args` 命令,它能打印出命令行传给函数的参数。 + +``` +(dlv) args +x = 42 +y = 13 +~r2 = 824633786832 +(dlv) +``` + +#### 查看反汇编码 + +由于我们是调试编译出的二进制文件,因此如果我们能查看编译器生成的汇编语言指令将会非常有用。Delve 提供了一个 `disassemble` 命令来查看这些指令。在下面的例子中,我们用它来查看 `add()` 函数的汇编指令。 + +``` +(dlv) step +> main.add() ./functions.go:5 (PC: 0x4a2280) +     1: package main +     2: +     3: import "fmt" +     4: +=>   5:      func add(x int, y int) int { +     6:         return x + y +     7: } +     8: +     9: func main() { +    10:         fmt.Println(add(42, 13)) +(dlv) disassemble +TEXT main.add(SB) /home/user/go/gobin/functions.go +=>   functions.go:5  0x4a2280   48c744241800000000   mov qword ptr [rsp+0x18], 0x0 +        functions.go:6  0x4a2289   488b442408           mov rax, qword ptr [rsp+0x8] +        functions.go:6  0x4a228e   4803442410           add rax, qword ptr [rsp+0x10] +        functions.go:6  0x4a2293   4889442418           mov qword ptr [rsp+0x18], rax +        functions.go:6  0x4a2298   c3                   ret +(dlv) +``` + +#### 单步退出函数 + +另一个功能是 `stepout`,这个功能可以让我们跳回到函数被调用的地方。在我们的例子中,如果我们想回到 `main.main` 函数,我们只需要简单地运行 `stepout` 命令,它就会把我们带回去。在我们调试大型代码库时,这个功能会是一个非常便捷的工具。 + +``` +(dlv) stepout +> main.main() ./functions.go:10 (PC: 0x4a22d7) +Values returned: +        ~r2: 55 + +     5: func add(x int, y int) int { +     6:         return x + y +     7: } +     8: +     9: func main() { +=>  10:              fmt.Println(add(42, 13)) +    11: } +(dlv) +``` + +#### 打印变量信息 + +我们一起通过 [Go 教程][6] 的另一个示例程序来看下 Delve 是怎么处理 Go 中的变量的。下面的示例程序定义和初始化了一些不同类型的变量。你可以构建和运行程序。 + +``` +$ cat variables.go +package main + +import "fmt" + +var i, j int = 1, 2 + +func main() { +        var c, python, java = true, false, "no!" +        fmt.Println(i, j, c, python, java) +} +$ + +$ go build variables.go &&; ./variables +1 2 true false no! +$ +``` + +像前面说过的那样,用 `delve debug` 在调试器中加载程序。你可以在 Delve 中用 `print` 命令通过变量名来展示他们当前的值。 + +``` +(dlv) print c +true +(dlv) print java +"no!" +(dlv) +``` + +或者,你还可以用 `locals` 命令来打印函数内所有的局部变量。 + +``` +(dlv) locals +python = false +c = true +java = "no!" +(dlv) +``` + +如果你不知道变量的类型,你可以用 `whatis` 命令来通过变量名来打印它的类型。 + +``` +(dlv) whatis python +bool +(dlv) whatis c +bool +(dlv) whatis java +string +(dlv) +``` + +### 总结 + +现在我们只是了解了 Delve 所有功能的皮毛。你可以自己去查看帮助内容,尝试下其它的命令。你还可以把 Delve 绑定到运行中的 Go 程序上(守护进程!),如果你安装了 Go 源码库,你甚至可以用 Delve 导出 Golang 库内部的信息。勇敢去探索吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/debug-go-delve + +作者:[Gaurav Kamathe][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bug_software_issue_tracking_computer_screen.jpg?itok=6qfIHR5y (Bug tracking magnifying glass on computer screen) +[2]: https://github.com/go-delve/delve +[3]: https://golang.org/doc/install +[4]: https://github.com/go-delve/delve/blob/master/Documentation/installation/linux/install.md +[5]: https://tour.golang.org/basics/4 +[6]: https://tour.golang.org/basics/9 diff --git a/published/202007/20200616 How to know if you-re ready to switch from Mac to Linux.md b/published/202007/20200616 How to know if you-re ready to switch from Mac to Linux.md new file mode 100644 index 0000000000..271caf1707 --- /dev/null +++ b/published/202007/20200616 How to know if you-re ready to switch from Mac to Linux.md @@ -0,0 +1,141 @@ +[#]: collector: (lujun9972) +[#]: translator: (nophDog) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12375-1.html) +[#]: subject: (How to know if you're ready to switch from Mac to Linux) +[#]: via: (https://opensource.com/article/20/6/mac-to-linux) +[#]: author: (Marko Saric https://opensource.com/users/markosaric) + +你是否已经准备好从 Mac 切换到 Linux 了? +====== + +> 你几乎可以在 Linux 上做任何你在 Mac 上可以做的事情 —— 这是你拥有一个开源操作系统的自由。 + +![](https://img.linux.net.cn/data/attachment/album/202007/02/222534g8bdabsllplnzl6c.jpg) + +我[从 Mac 转到 Linux][2] 已经两年了。在使用 Linux 之前,我用的 Apple 的系统用了 15 年,而当我在 2018 年安装第一个 Linux 发行版时,还只是一个纯粹的新手。 + +这些日子以来,我只用 Linux,我可以用它完成任何任务。浏览网页、观看 Netflix 影片、写作以及编辑我的 Wordpress [博客][3],甚至还在上面跑我的[开源网页分析项目][4]。 + +我甚至还不是一个开发者!Linux 被认为不适合日常使用,对非技术人员也不够友好的日子已经一去不返了。 + +最近有很多关于 Mac 的讨论,越来越多的人已经在考虑转到 Linux。我打算分享我的切换过程中的一些经验,帮助其它新手也能从容转移。 + +### 你该不该换? + +在换系统之前,最好想清楚,因为有时候 Linux 可能跟你预期不一样。如果你仍希望跟 Apple Watch 无缝配对、可以用 FaceTime 给朋友打电话、或者你想打开 iMovie 看视频,那最好还是不要换了。这些都是 Apple 的专有产品,你只能在 Apple 的“围墙花园”里面使用。如果离不开 Apple 的生态系统,那么 Linux 可能不太适合你。 + +我对 Apple 生态没有太多挂念,我不用 iPhone,所以跟手机的协作没那么必要。我也不用 iCloud、FaceTime,当然也包括 Siri。我早就对开源充满兴趣,只是一直没有行动。 + +### 检查你的必备软件清单 + +我还在使用 Mac 的时候,就已经开始探索开源软件,我发现大部分在 Mac 上使用的软件,在 Linux 也可以运行。 + +很熟悉用火狐浏览网页吗?在 Linux 上它也可以运行。想用 VLC 看视频?它也有 Linux 版本。喜欢用 Audacity 录制、编辑音频?它正在 Linux 上等着你呢。你用 OBS Studio 直播?在 Linux 直接下载安装吧。一直用 Telegram 跟朋友和家人保持联系吗?Linux 上当然少不了它。 + +此外,Linux 不仅仅意味着开源软件。你最喜欢的大部分(也可能是所有)非 Apple 专有软件,都能在 Linux 见到它们的身影。Spotify、Slack、Zoom、Stream、Discord、Skype、Chrome 以及很多闭源软件,都可以使用。而且,在你 Mac 浏览器里面运行的任何东西,同样能够运行在 Linux 浏览器。 + +你能在 Linux 找到你的必备软件,或者更好的替代品吗?请再三确认,做到有备无患。用你最常用的搜索引擎,在网上检索一下。搜索“软件名 + Linux” 或者“软件名 + Linux 替代品”,然后再去 [Flathub][5] 网站查看你能在 Linux 用 Flatpak 安装的专有软件有哪些。 + +### 请牢记:Linux 不等于 Mac + +如果你希望能够从 Mac 轻松转移到 Linux,我相信有一点很重要,你需要保持包容的思想以及愿意学习新操作系统的心态。Linux 并不等于 Mac,所以你需要给自己一些时间去接触并了解它。 + +如果你想让 Linux 用起来、看起来跟你习惯的 macOS 一模一样,那么 Linux 可能也不适合你。尽管你可以通过各种方法[把 Linux 桌面环境打造得跟 macOS 相似][14],但我觉得要想成功转移到 Linux,最好的办法是从拥抱 Linux 开始。 + +试试新的工作流,该怎么用就怎么用。不要总想着把 Linux 变成其它东西。你会跟我一样,像享受 Mac 一样享受 Linux,甚至能有更好的体验感。 + +还记得你第一次使用 Mac 吧:你肯定花了不少时间去习惯它的用法。那么请给 Linux 同样多的时间和关怀。 + +### 选择一个 Linux 发行版 + +有别于 Windows 和 macOS,Linux 不止一个单一的操作系统。不同的 Linux 操作系统被称作发行版,开始使用 Linux 之后,我尝试过好几个不同的发行版。我也用过不同的桌面环境,或者图形界面。在美观度、易用性、工作流以及集成软件上,它们有很大差异。 + +尽管作为 Mac 的替代品,被提及最多的是 [ElementaryOS][6] 和 [Pop!_OS][7],但我仍建议从 [Fedora 工作站][8] 开始,理由如下: + +- 使用 [Fedora 介质写入器][9],容易安装 +- 几乎可以支持你所有的硬件,开箱即用 +- 支持最新的 Linux 软件 +- 运行原生无改动的 GNOME 桌面环境 +- 有一个大型开发团队以及一个庞大的社区在背后支持 + +在我看来,对从 macOS 过来的新手来说,[GNOME][10] 是易用性、一致性、流畅性和用户体验最好的桌面环境。它拥有 Linux 世界中最多的开发资源和用户基数,所以你的使用体验会很好。 + +Fedora 可以为你打开一扇 Linux 的大门,当你适应之后,就可以开始进一步探索各个发行版、桌面环境,甚至窗口管理器之类的玩意了。 + +### 熟悉 GNOME + +GNOME 是 Fedora 和许多其它 Linux 发行版的默认窗口管理器。它最近 [升级到 GNOME 3.36][11],带来了 Mac 用户会喜欢的现代设计。 + +一定要做好心理准备,Linux、Fedora 工作站和 GNOME 并不是 Apple 和 macOS。GNOME 非常干净、简约、现代、独创。它不会分散你的注意力,没有桌面图标,没有可见的坞站,窗口上甚至没有最小化和最大化按钮。但是不要慌张,如果你去尝试,它会证明这是你用过最好、最有生产力的操作系统。 + +GNOME 不会给你带来困扰。启动之后,你唯一能看到的东西只有顶栏和背景图片。顶栏由这几样东西组成,“活动”在左边,时间和日期在中间(这也是你的通知中心),右边是网络、蓝牙、VPN、声音、亮度、电池等托盘图标之类的东西。 + +#### 为什么 GNOME 像 Mac + +你会注意到一些跟 macOS 的相似之处,例如窗口吸附、空格预览(用起来跟 “Quick Look” 一模一样)。 + +如果你把鼠标光标移动到左上角,点击顶栏的“活动”,或者按下键盘上超级键(`Super` 键,也就是 Mac 上的 `ஐ` 键),你会看到“活动概览”。它有点像 macOS 系统上“调度中心”和“聚焦搜索”的结合体。它会在屏幕中间展示已打开软件和窗口的概览。在左手边,你可以看到坞站,上面有你打开的软件和常用软件。所有打开的软件下面会有一个指示标志,在右手边,你可以看到不同的工作区。 + +在顶栏中间,有一个搜索框。只要你开始输入,焦点就会转移到搜索框。它能搜索你已经安装的软件和文件内容,可以在软件中心搜索指定的软件、进行计算、向你展示时间或者天气,当然它能做的还有很多。它就像“聚焦”一样。只需开始输入你要搜索的内容,按下回车就可以打开软件或者文件。 + +你也能看到一列安装好的软件(更像 Mac 上的“启动台”),点击坞站中的“显示应用”图标,或者按 `Super + A` 就行。 + +总体来说,Linux 是一个轻量级的系统,即使在很老的硬件上也能跑得很顺畅,跟 macOS 比起来仅仅占用很少的磁盘空间。并且不像 macOS,你可以删除任何你不想要或不需要的预装软件。 + +#### 自定义你的 GNOME 设置 + +浏览一下 GNOME 设置,熟悉它的选项,做一些更改,让它用起来更舒服。下面是一些我装好 GNOME 必做的事情。 + +- 在“鼠标和触摸板”中,我禁用“自然滚动”、启用“轻触点击”。 +- 在“显示”中,我打开“夜光”功能,在晚上,屏幕会让颜色变暖,减少眼睛疲劳。 +- 我也安装了 [GNOME 优化][12],因为它可以更改额外的设置选项。 +- 在“GNOME 优化”中,我启用了 “Over-Amplification” 设置,这样就能获得更高的音量。 +- 在“GNOME 优化”中,相比默认的亮色主题,我更喜欢 “Adwaita Dark” 主题。 + +#### 习惯使用键盘操作 + +GNOME 是以一个极度以键盘为中心的操作系统,所以尽量多使用键盘。在 GNOME 设置中的“键盘快捷键”部分,你可以找到各个快捷键。 + +你也可以根据自己的理想工作流程来设置键盘快捷键。我将我最常用的应用程序设置为使用超级键打开。比如说,`Super + B` 打开我的浏览器,`Super + F` 打开“文件”,`Super + T` 打开终端。我还把 `Ctrl + Q` 设置成关闭窗口。 + +我使用 `Super + Tab` 在打开的应用程序之间切换,`Super + H` 隐藏一个窗口,`F11` 全屏打开软件,`Super + Left` 把窗口吸附到屏幕左边,`Super + Right` 把窗口吸附到屏幕左边,等等。 + +### 在 Mac 上尝试 Linux 之后再做决定 + +在完全安装 Linux 之前,在你的 Mac 上先尝试 Fedora。从 [Fefora 官网][9]下载 ISO 镜像。使用 [Etcher][13] 将 ISO 镜像写入 USB 驱动器,然后在启动时点击 `Option` 键,这样你就可以在即用模式下尝试了。 + +现在您无需在 Mac 上安装任何东西就可以探索 Fedora 工作站了。试试各种东西,能否正常工作:能不能连接 WiFi?触控板是否正常?有没有声音?等等。 + +也记得花时间来尝试 GNOME。测试我上面提到的不同功能。打开一些安装好的软件。如果一切看起来都还不错,如果你喜欢这样的 Fedora 工作站和 GNOME,并且很肯定这就是你想要的,那么把它安装到你的 Mac 吧。 + +尽情探索 Linux 世界吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/mac-to-linux + +作者:[Marko Saric][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://opensource.com/users/markosaric +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_browser_web_desktop.png?itok=Bw8ykZMA (Digital images of a computer desktop) +[2]: https://markosaric.com/linux/ +[3]: https://markosaric.com/how-start-blog/ +[4]: https://plausible.io/open-source-website-analytics +[5]: https://flathub.org/apps +[6]: https://opensource.com/article/20/2/macbook-linux-elementary +[7]: https://support.system76.com/articles/pop-basics/ +[8]: https://getfedora.org/ +[9]: https://getfedora.org/en/workstation/download/ +[10]: https://www.gnome.org/ +[11]: https://www.gnome.org/news/2020/03/gnome-3-36-released/ +[12]: https://wiki.gnome.org/Apps/Tweaks +[13]: https://www.balena.io/etcher/ +[14]: https://linux.cn/article-12361-1.html \ No newline at end of file diff --git a/published/202007/20200616 How to loop forever in bash on Linux.md b/published/202007/20200616 How to loop forever in bash on Linux.md new file mode 100644 index 0000000000..756836f72f --- /dev/null +++ b/published/202007/20200616 How to loop forever in bash on Linux.md @@ -0,0 +1,143 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12368-1.html) +[#]: subject: (How to loop forever in bash on Linux) +[#]: via: (https://www.networkworld.com/article/3562576/how-to-loop-forever-in-bash-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +如何在 Linux 的 bash 中永远循环 +====== + +![tine ivanic][1] + +在 Linux 中有很多永远循环(或直到你决定停止)的方法,你可以在命令行或脚本中执行此操作。 + +`for` 和 `while` 命令使这件事非常容易。关于相应的语法和策略,只有几件事要牢记。 + +### 使用 while + +最简单的永远循环之一是使用 `while` 命令,后面跟上条件 `true`。 你不必使用诸如 `while [ 1 -eq 1 ]` 之类的逻辑或类似的测试。 `while true` 测试表示循环将一直运行,直到你使用 `CTRL-C` 停止循环、关闭终端窗口或注销为止。这是一个例子: + +``` +$ while true +> do +> echo Keep running +> sleep 3 +> done +Keep running +Keep running +Keep running +^C +``` + +你也可以使用 `while :` 做同样的事情。这里的关键是 `:` 总是返回成功,因此就像 `while true` 一样,此测试永远不会失败,并且循环会继续运行: + +``` +$ while : +> do +> echo Keep running +> sleep 3 +> done +Keep running +Keep running +^C +``` + +如果你在脚本中插入了无限循环,并想提醒使用它的人如何退出脚本,那么可以使用 `echo` 命令添加提示: + +``` +while : +do + echo Keep running + echo "Press CTRL+C to exit" + sleep 1 +done +``` + +### 使用 for + +`for` 命令还提供了一种永远循环的简便方法。虽然不如 `while true` 明显,但语法相当简单。你只需要在有界循环中替换参数即可,它通常类似于 “c 从等于 1 开始递增,直到 5”: + +``` +$ for (( c=1; c<=5; c++ )) +``` + +不指定任何参数的情况下: + +``` +$ for (( ; ; )) +``` + +没有起始值、增量或退出测试,此循环将永远运行或被强制停止: + +``` +$ for (( ; ; )) +> do +> echo Keep running +> echo “Press CTRL+C to exit” +> sleep 2 +> done +Keep your spirits up +Keep your spirits up +Keep your spirits up +``` + +### 为什么要永远循环? + +在现实中,你不会想永远循环下去,但一直运行直到想要回家、工作完成或者遇到问题才退出并不罕见。任何构造为无限循环的循环都可以设置为根据各种情况退出。 + +该脚本将一直处理数据直到下午 5 点,或者说检查发现第一次超过 5 点的时间: + +``` +#!/bin/bash + +while true +do + if [ `date +%H` -ge 17 ]; then + exit # exit script + fi + echo keep running + ~/bin/process_data # do some work +done +``` + +如果要退出循环而不是退出脚本,请使用 `break` 命令而不是 `exit`。 + +``` +#!/bin/bash + +while true +do + if [ `date +%H` -ge 17 ]; then + break # exit loop + fi + echo keep running + ~/bin/process_data +done +… run other commands here … +``` + +### 总结 + +永远循环很容易。指定要停止循环的条件却需要花费一些额外的精力。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3562576/how-to-loop-forever-in-bash-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2020/06/nw_circular-staircase_loop_infinity_nautilus_by-tine-ivanic-via-unsplash-100848725-large.jpg +[2]: https://creativecommons.org/publicdomain/zero/1.0/ +[3]: https://www.networkworld.com/article/3242170/linux/invaluable-tips-and-tricks-for-troubleshooting-linux.html +[4]: https://www.facebook.com/NetworkWorld/ +[5]: https://www.linkedin.com/company/network-world diff --git a/published/202007/20200617 4 essential tools to set up your Python environment for success.md b/published/202007/20200617 4 essential tools to set up your Python environment for success.md new file mode 100644 index 0000000000..26309e20ba --- /dev/null +++ b/published/202007/20200617 4 essential tools to set up your Python environment for success.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12369-1.html) +[#]: subject: (4 essential tools to set up your Python environment for success) +[#]: via: (https://opensource.com/article/20/6/python-tools) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +建立成功的 Python 环境的 4 个基本工具 +====== + +> 选择的这些工具将简化你的 Python 环境,以实现顺畅和一致的开发实践。 + +![](https://img.linux.net.cn/data/attachment/album/202007/01/123009yolmlzp1yu1y88ew.jpg) + +Python 是一门出色的通用编程语言,经常作为第一门编程语言来教授。二十年来,我为它撰写了很多本书,而它仍然是[我的首选语言][2]。虽然通常来说这门语言是简洁明了的,但是(正如 [xkcd][3] 讽刺的),从来没有人说过配置 Python 环境也是一样的简单。 + +![xkcd python illustration][4] + +*一个复杂的Python环境。 [xkcd][3]* + +在日常生活中有很多使用 Python 的方法。我将解释我是如何使用这些 Python 生态系统工具的。但坦诚的说,我仍在寻找更好的替代品。 + +### 使用 pyenv 来管理 Python 版本 + +我发现在机器上运行一个特定版本的 Python 的最好方法是使用 `pyenv`。这个软件可以在 Linux、Mac OS X 和 WSL2 上工作:这是我通常关心的三个 “类 UNIX” 环境。 + +安装 `pyenv` 本身有时会有点棘手。一种方法是使用专用的 [pyenv 安装程序][5],它使用 `curl | bash` 方法来进行(详见其说明)。 + +如果你是在 Mac 上(或者你运行 Homebrew 的其他系统),你可以按照[这里][6]的说明来安装和使用 `pyenv`。 + +按照说明安装和设置了 `pyenv` 之后,你可以使用 `pyenv global` 来设置一个 “默认的” Python 版本。一般来说,你会选择你的 “首选” 版本。这通常是最新的稳定版本,但如果有其他考虑因素也可能做出不同的选择。 + +### 使用 virtualenvwrapper 让虚拟环境更简单 + +使用 `pyenv` 安装 Python 的一个好处是,你所有后继安装的 Python 解释器环境都是你自己的,而不是操作系统层面的。 + +虽然在 Python 本身内部安装东西通常不是最好的选择,但有一个例外:在上面选择的 “首选” Python 中,安装并配置 `virtualenvwrapper`。这样你就可以瞬间创建和切换到虚拟环境。 + +我在[这篇文章中][7]具体介绍了如何安装和使用 `virtualenvwrapper`。 + +这里我推荐一个独特的工作流程:你可以制作一个可以大量重复运行的虚拟环境,用来做运行器runner。在这个环境中,可以安装你最喜欢的运行器 —— 也就是你会经常用来运行其他软件的软件。就目前而言,我的首选是 `tox`。 + +### 使用 tox 作为 Python 运行器 + +[tox][8] 是一个很好的工具,可以让你的 Python 测试自动化。在每个 Python 环境中,我都会创建一个 `tox.ini` 文件。无论我使用什么系统做持续集成,都可以运行它,我可以用上面文章中描述的 `virtualenvwrapper` 的 `workon` 语法在本地运行同样的东西: + +``` +$ workon runner +$ tox +``` + +这个工作流程之所以重要,是因为我要在多个版本的 Python 和多个版本的依赖库中测试我的代码。这意味着在 `tox` 运行器中会有多个环境。一些会尝试在最新的依赖关系中运行,一些会尝试在冻结的依赖关系中运行(接下来会有更多的介绍),我也可能会用 `pip-compile` 在本地生成这些环境。 + +附注:我目前正在[研究使用 nox][9] 作为 `tox` 的替代品。原因超出了本文的范畴,但值得一试。 + +### 使用 pip-compile 进行 Python 依赖性管理 + +Python 是一种动态编程语言,这意味着它在每次执行代码时都会加载其依赖关系。能否确切了解每个依赖项的具体运行版本可能意味着是平稳运行代码还是意外崩溃。这意味着我们必须考虑依赖管理工具。 + +对于每个新项目,我都会包含一个 `requirements.in` 文件,(通常)只有以下内容: + +``` +. +``` + +是的,没错。只有一个点的单行。我在 `setup.py` 文件中记录了 “宽松” 的依赖关系,比如 `Twisted>=17.5`。这与 `Twisted==18.1` 这样的确切依赖关系形成了鲜明对比,后者在需要一个特性或错误修复时,难以升级到新版本的库。 + +`.` 的意思是 “当前目录”,它使用当前目录下的 `setup.py` 作为依赖关系的来源。 + +这意味着使用 `pip-compile requirements.in > requirements.txt` 会创建一个冻结的依赖文件。你可以在 `virtualenvwrapper` 创建的虚拟环境中或者 `tox.ini` 中使用这个依赖文件。 + +有时,也可以从 `requirements-dev.in`(内容:`.[dev]`)生成 `requirements-dev.txt`,或从 `requirements-test.in`(内容:`.[test]`)生成 `requirements-test.txt`。 + +我正在研究在这个流程中是否应该用 [dephell][10] 代替 `pip-compile`。`dephell` 工具有许多有趣的功能,比如使用异步 HTTP 请求来下载依赖项。 + +### 结论 + +Python 的功能既强大又赏心悦目。为了编写这些代码,我依靠了一个对我来说很有效的特定工具链。工具 `pyenv`、`virtualenvwrapper`、`tox` 和 `pip-compile` 都是独立的。但是,它们各有各的作用,没有重叠,它们一起打造了一个强大的 Python 工作流。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/python-tools + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_programming_question.png?itok=cOeJW-8r (Python programming language logo with question marks) +[2]: https://opensource.com/article/19/10/why-love-python +[3]: https://xkcd.com/1987/ +[4]: https://opensource.com/sites/default/files/uploads/python_environment_xkcd_1.png (xkcd python illustration) +[5]: https://github.com/pyenv/pyenv-installer +[6]: https://linux.cn/article-12241-1.html +[7]: https://linux.cn/article-11086-1.html +[8]: https://opensource.com/article/19/5/python-tox +[9]: https://nox.thea.codes/en/stable/ +[10]: https://github.com/dephell/dephell diff --git a/published/202007/20200622 7 open source alternatives to VS Code.md b/published/202007/20200622 7 open source alternatives to VS Code.md new file mode 100644 index 0000000000..6526252de9 --- /dev/null +++ b/published/202007/20200622 7 open source alternatives to VS Code.md @@ -0,0 +1,128 @@ +[#]: collector: (lujun9972) +[#]: translator: (nophDog) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12382-1.html) +[#]: subject: (7 open source alternatives to VS Code) +[#]: via: (https://opensource.com/article/20/6/open-source-alternatives-vs-code) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +VS Code 的 7 个开源替代品 +====== + +> 为了避免使用微软版本的 VS Code,我们需要另行选择一个开源的代码编辑器。 + +![](https://img.linux.net.cn/data/attachment/album/202007/05/112348n834svpa48v08vsa.png) + +Visual Studio Code,也叫 VS Code,是一个跨平台代码编辑器,通用于 Linux、Windows 以及 macOS。它既能编辑简单文本,也能像集成开发环境(IDE)一样管理整个代码库。它可以通过插件进行扩展,并且已经被证明是一个可靠的文本编辑器,很轻松地就击败了非开源的强大竞品编辑器。 + +微软以开源的方式发布了 VS Code,但是你从微软下载的版本其实并不是开源的。然而,你仍有办法以开源的方式使用 VS Code,或者直接选择其它的开源替代品。 + +### 以开源的方式构建 VS Code + +你可以在 [GitHub][2] 获得 VS Code 的源代码。然而当你 [从微软][3] 下载 VS Code 时,你会发现它是基于 [微软软件许可证][4] 授权的。这并不是一个开源许可证。其区别在于构建过程。 + +Chris Dias 是微软 VS Code 项目开发者之一,他对 VS Code [作了一个对比][5],就像 Chrome 浏览器和其开源的“上游”项目 [Chromium][6] 一样。VS Code 确实是基于开源代码库构建的。微软官方发布的版本带有一些与微软相关的功能,包括一项商标、一个插件库、一个 C# 调试器以及遥测。但如果你克隆仓库然后自行编译,这些东西都不会被加入,所以你会得到一个名为 Code - OSS 的“干净”版本(OSS 代表开源软件)。 + +实际上,VS Code 与 Code - OSS 之间的差异很小。最值得注意的是,VS Code 包含遥测功能,它会记录使用数据。微软不可能监控你的一举一动,而且目前越来越多软件都在收集使用数据。是否在乎 VS Code 的遥测功能,完全取决于你自己。如果你不希望它追踪你的使用情况,这里有一些很棒的 VS Code(开源)替代品。 + +### VSCodium + +![Code OSS screenshot][7] + +最简单的替代方案就是构建不带微软附属功能的 VS Code 版本。[VSCodium][9] 项目提供了可下载的 Code-OSS 可执行文件,它基于 VS Code 代码库编译,没有配置微软的 `product.json` 中的改变。VSCodium 的开发者还竭尽全力禁用了所有难以寻找的遥测选项,除非你自行编译,否则这已经是你能找到的最干净的 VS Code 版本了。 + +VSCodium 提醒说,VS Code 悄悄地包含了一些专有工具,这些工具无法与开源版本一起提供。这包括一个 C# 调试器和部分插件。如果你需要它们,可以在 [文档中] 找到解决办法。假如你依赖 VS Code 中某些特定的功能,你应该验证它在 VSCodium 中是否可以发挥功用。 + +此外,你还应该验证是否已禁用所有的遥测功能。 + +### Code - OSS + +如果不想用 VSCodium 的版本,你可以自己 [从头编译 VS Code][12],得到一样的版本。可执行文件叫做 `Code - OSS`,而不是 `VSCode`,适用于 VSCodium 的许可证限制也适用于你的构建,而工作方式也是一样。 + +如果通过编译源码构建应用,首次启动时你要确保 [所有遥测都已经被禁用]。 + +### Atom + +![Atom screenshot][13] + +[Atom][14] 是一个类似于 IDE 的文本编辑器,当微软收购 Github 的同时也收购了它。和 VS Code 一样,你可以使用插件,扩展 Atom 编辑器,此外,你还能通过自己的工具和主题实现定制。它开源且与 Github 集成。简而言之,只要你能找到你想用的插件,或者你愿意自己动手写,那么 Atom 几乎可以满足你的一切需求。 + +跟 VS Code 一样,Atom 也 [默认包含遥测][15]。你可以禁用这个功能,而且跟 VS Code 不同的是,使用插件不受任何限制,所以不必再因为隐私改变你的工作流。对写代码的人来说,毫无疑问 Atom 是很有用的工具,而对于 [使用电脑的任何人][16],它同样会是一个很赞的编辑器。如果你需要一个顺手的通用文本编辑器,请试试 Atom。 + +### GNOME Builder + +![GNOME Builder screenshot][17] + +为 GNOME 桌面而开发的 IDE,[GNOME Builder][18] 是一个 Linux 平台的代码编辑器,专门用于构建 GNOME 应用。如果你为 Linux 构建应用程序,希望轻松解决兼容性问题,那么 Builder 就是最简单的选择。从 [Flathub.org][19] 安装 Builder;当你开启一个新项目,如果没有安装 GNOME SDK,它会提醒你。这意味着当维护你的应用时,你不必刻意关注 GNOME 的状态,因为 Builder 在替你做这件事。 + +然而,Builder 不仅能构建 GNOME 程序。它还支持各种各样的编程语言,包括 Python、Rust、C/C++、Java、Go、JavaScript、TypeScript、VB.NET、Markdown 和几种标记语言等等。它对部分语言有全面的支持,包括自动补全以及弹出式函数定义,但是其它语言仅仅含有一些比较方便的功能,例如语法高亮跟自动匹配括号。不管你是不是一个专门的程序员,或者你只想要一个给力的 HTML 和 CSS 编辑器,这个 IDE 都能让你舒心使用。 + +### Geany + +![Geany screenshot][20] + +[Geany][21] 是一个强大、稳定而轻量级的编辑器,它有很多有用的特性,能帮你写 Bash、Python、Lua、XML、HTML、LaTex,当然远不止这些。对 50 种各种编程及脚本语言、标记语言和各种文件类型(比如 .diff 和 .po),Geany 都有很好的支持。退一万步讲,Geany 还有括号匹配和语法高亮 —— 通常来说,它包含更多功能。 + +Geany 是一个小型编辑器,但是通过插件,你可以为它添加特性,例如项目视图面板、文件系统树、调试、终端等,直到它看起来像一个 IDE。当然,萝卜白菜各有所爱,你也可以尽量使它保持简洁易用。如果因为电脑 CPU 或者内存的限制而无法使用 VS Code,那么很明显 Geany 可以作为你的选择。它只占用少量内存,而且启动迅速。即便跟运行在终端里的 Vim 相比,Geany 稍显笨重,但就算在树莓派,它也能做到快速、灵活。 + +### Brackets + +![Brackets screenshot][22] + +[Brackets][23] 是一款面向网页开发者的文本编辑器和 IDE。对于 HTML、CSS、JavaScript、PHP 甚至 Python,它都有很强大的支持。而且跟 VS Code 一样,它也有一个很丰富的插件生态,所以你可以最大限度地扩展它,以适应你所有编程语言的工作。 + +有的插件用于辅助解析语言、运行脚本,甚至编译执行代码。Brackets 有一个传统的界面,不管你是否熟悉 IDE 或者像记事本一样简单的文本编辑器,都能驾轻就熟。如果稍微花点时间,添加几个相关插件,然后熟悉它们,你会发现 Brackets 真的是一个很精妙、很有用的编辑器,不管你输入什么,它都能通过自动补全、提示帮你避免低级错误。假如你是程序员,它能帮你加快测验和调试周期。 + +### Che + +![Che screenshot][24] + +如果你喜欢新技术,那你应当尝试 [Che][25] 编辑器。这是一个基于云的 IDE,所以它默认以软件即服务(SaaS)的形式运行,但它是完全开源的,如果你有 Kubernetes 实例,那就可以运行为*你自己的* SaaS。 + +Che 不仅是一个在线 IDE,而且是一个为云开发而构建的 IDE。在 Che 的概念里,用户无需查看本地文件系统。由于它在云端工作,所以你也可以这么做。事实上,如果你有一台 Git 服务器,那就可以直接把它当作你的文件系统,在它的仓库中完成你的项目。当然,你也可以下载所有文件做本地备份。 + +但 Che 的主要特点,也是云开发者最为兴奋的一点,它是一个功能全面、带有 Kubernetes 感知功能的开源 IDE。如果你正在为云构建应用、网站或容器(或三者的组合),那么 Che 是一个你需要尝试的编辑器。 + +### 那么你的选择是? + +你有没有在使用这些 VS Code 替代品中的某一个呢?想不想挑一个试试呢?欢迎在评论中分享你的见解。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/open-source-alternatives-vs-code + +作者:[Seth Kenlon][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://opensource.com/users/seth +[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]: https://github.com/microsoft/vscode +[3]: https://code.visualstudio.com/ +[4]: https://code.visualstudio.com/license +[5]: https://github.com/Microsoft/vscode/issues/60#issuecomment-161792005 +[6]: https://www.chromium.org/ +[7]: https://opensource.com/sites/default/files/uploads/code-oss.png (Code OSS screenshot) +[8]: https://creativecommons.org/licenses/by-sa/4.0/ +[9]: https://vscodium.com/ +[10]: https://github.com/VSCodium/vscodium/blob/master/DOCS.md +[11]: https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting +[12]: https://github.com/Microsoft/vscode/wiki/How-to-Contribute#build-and-run +[13]: https://opensource.com/sites/default/files/uploads/atom.jpg (Atom screenshot) +[14]: http://atom.io +[15]: https://discuss.atom.io/t/how-do-i-disable-the-metrics-or-tracking/24520 +[16]: https://opensource.com/article/19/4/write-git +[17]: https://opensource.com/sites/default/files/uploads/builder.png (GNOME Builder screenshot) +[18]: https://wiki.gnome.org/Apps/Builder +[19]: https://flathub.org/apps/details/org.gnome.Builder +[20]: https://opensource.com/sites/default/files/uploads/geany.png (Geany screenshot) +[21]: https://www.geany.org/ +[22]: https://opensource.com/sites/default/files/uploads/brackets.jpg (Brackets screenshot) +[23]: http://brackets.io/ +[24]: https://opensource.com/sites/default/files/uploads/che-cpp.jpg (Che screenshot) +[25]: https://www.eclipse.org/che/extend/ diff --git a/published/202007/20200622 Linux tools for improving your time management.md b/published/202007/20200622 Linux tools for improving your time management.md new file mode 100644 index 0000000000..af35552fa3 --- /dev/null +++ b/published/202007/20200622 Linux tools for improving your time management.md @@ -0,0 +1,119 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12388-1.html) +[#]: subject: (Linux tools for improving your time management) +[#]: via: (https://opensource.com/article/20/6/linux-time-management) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) + +时间管理专家的 Linux 工具 +====== + +> 无论你是需要帮助来保持专注、保持及时性,还是为了找到避免重复的捷径,这些 Linux 工具能够帮助你。 + +![](https://img.linux.net.cn/data/attachment/album/202007/07/084943stbchr65ke6r1cqh.jpg) + +生产力是一个主观术语,但从本质上讲,它是衡量特定任务完成效率的标准。每个人都有不同的方式来提高他们的生产力:有些人需要帮助专注于任务里、有些人需要特殊的工作环境、有些人需要警报和提醒以避免错过截止日期,还有些人需要协助处理重复的手工活。幸运的是,有多种工具和技术可为你提供所需的特定支持。特别地,如果你是 Linux 用户,有一些调整可以帮助你提高生产力。这是我经常使用的两个。 + +### 剪贴板指示器 + +你是否在日常使用中,在多个文档之间的大量使用复制和粘贴?如果是这样,那么 [剪贴板指示器][2] 应该成为你的首选方案之一。将剪贴板指示器作为 GNOME 扩展安装到 Linux 发行版中。以我的经验,它对 GNOME Shell 的性能影响很小,至少比我尝试过的其他方案要小。 + +该工具添加了一个指示器菜单到顶部面板,并缓存剪贴板历史。你可以设置历史记录大小、要预览的字符数量。它可以在复制时显示通知,并充当保存任意复制内容的临时空间。 + +![Clipboard indicator menu on GNOME desktop][3] + +安装扩展程序和连接器的最简单方法是使用发行版的包管理器。 + +对于 Fedora、CentOS 或 RHEL,请使用: + +``` +$ sudo dnf install chrome-gnome-shell +``` + +在 Ubuntu 或 Debian 上,请改用 `apt install`。 + +安装完成后,进入 并查看已安装的扩展。 + +如果你使用的是 Firefox,请使用 Firefox 浏览器附加组件并安装 “GNOME Shell integration”。你将在 Firefox 工具栏中看到一个很小的脚印图标,它将带你进入“扩展”页面。在该页面上,搜索 “Clipboard Indicator” 扩展并启用它。 + +现在,按照提示下载 GNOME 扩展并激活它。你可以查看 `~/.local/share/gnome-shell/extensions` 来浏览你的扩展。 + +好了!你将在 GNOME 桌面的右上角看到一个新图标。复制任意内容并尝试其设置。 + +也可以使用以下命令通过 Git 进行快速安装:将仓库克隆到本地的 gnome-shell 扩展目录中: + +``` +$ git clone https://github.com/Tudmotu/gnome-shell-extension-clipboard-indicator.git ~/.local/share/gnome-shell/extensions/clipboard-indicator@tudmotu.com +``` + +进入 GNOME Tweaks 工具,然后从“扩展”页面激活它。 + +### 番茄计时器(Pomodoro) + +![Using the pomodoro timer on GNOME][4] + +Pomodoro 技术是一种时间管理理念,旨在为用户提供最大注意力。每个 25 分钟的工作时间称为“pomodoro”(意大利语的“番茄”);每个番茄之后,你需要休息五分钟。每四个番茄时间,即每 100 分钟,你就要休息 15 至 20 分钟。如果你有大量的待办事项,那么使用 Pomodoro 技术可以通过强迫你遵守严格的时间安排来帮助你更快地完成项目。 + +可以通过 GNOME Tweaks 网页 (extensions.gnome.org)或通过命令行来管理安装过程。对于后者,请根据你的 Linux 发行版和版本,并使用以下命令进行安装: + +``` +$ sudo dnf install gnome-shell-extension-pomodoro +``` + +或者,如果你希望从源代码构建: + +``` +$ git clone -b gnome-3.34 https://github.com/codito/gnome-pomodoro.git +$ cd gnome-pomodoro +``` + +源码有许多依赖关系,其中许多可能已经安装。为了确保这点,请安装以下内容。 + +``` +$ sudo dnf install autoconf-archive gettext vala vala-tools pkg-config desktop-file-utils glib2-devel gtk3-devel libappstream-glib-devel libappindicator-gtk3-devel libcanberra-devel libpeas-devel sqlite-devel gom-devel gobject-introspection-devel gsettings-desktop-schemas-devel gstreamer1-devel +``` + +在源代码的解压目录中,完成构建。 + +``` +$ ./autogen.sh --prefix=/usr --datadir=/usr/share  +$ make  +$ sudo make install  +``` + +不管是怎么安装的,请进入 GNOME Tweaks 并打开番茄计时器。如果你还没有 GNOME Tweaks,请通过包管理器或所选的软件安装程序进行安装。例如,在 Fedora 上: + +``` +$ sudo dnf install gnome-tweaks +``` + +在 Ubuntu 或 Debian上,请改用 `apt install`。 + +Pomodoro 桌面集成当前可在 GNOME Shell 中使用,并且它们计划在将来支持更多桌面。 查看 获取有关该项目的最新信息。同时,对于 KDE 用户,还有一个名为 [Fokus][5] 的替代品。 + +### Linux 上的生产力 + +生产力是个人的,但这是我们所有人都在以某种方式追求的东西。这些工具中的每一个要么节省了我的时间,要么使我的工作效率提高了,它们可以与 Linux 快速集成。 + +你是否有喜欢的生产力工具?请在评论中分享! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/linux-time-management + +作者:[Sudeshna Sur][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/sudeshna-sur +[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://extensions.gnome.org/extension/779/clipboard-indicator/ +[3]: https://opensource.com/sites/default/files/uploads/gnome-tweaks-productivity_0.png (Clipboard indicator menu on GNOME desktop) +[4]: https://opensource.com/sites/default/files/uploads/pomodoro-timer-fedora-opensourcecom.png (Using the pomodoro timer on GNOME) +[5]: https://store.kde.org/p/1308861/ diff --git a/published/202007/20200622 Missing Photoshop on Linux- Use PhotoGIMP and Convert GIMP into Photoshop.md b/published/202007/20200622 Missing Photoshop on Linux- Use PhotoGIMP and Convert GIMP into Photoshop.md new file mode 100644 index 0000000000..0b75d249c9 --- /dev/null +++ b/published/202007/20200622 Missing Photoshop on Linux- Use PhotoGIMP and Convert GIMP into Photoshop.md @@ -0,0 +1,103 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12373-1.html) +[#]: subject: (Missing Photoshop on Linux? Use PhotoGIMP and Convert GIMP into Photoshop) +[#]: via: (https://itsfoss.com/photogimp/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +在 Linux 上缺少 Photoshop?使用 PhotoGIMP 将 GIMP 变为 Photoshop +====== + +[Adobe Photoshop][1] 不适用于桌面 Linux。GIMP 是 [Linux 上 Adobe Photoshop 的最佳替代品][2]。 + +如果你使用过 Photoshop,那么你会注意到 [GIMP][3] 和 Photoshop 相比有不同的设置、键盘快捷键和布局。 + +这没有错。毕竟,它们都是两种不同的软件,而且它们不必看起来相同。 + +但是,习惯了 Photoshop 的人们发现在切换到 GIMP 的时很难忘记他们反复学习的肌肉记忆。这可能会使某些人感到沮丧,因为使用新的界面意味着要学习大量的键盘快捷键,并花时间在查找工具位于何处。 + +为了帮助从 Photoshop 切换到 GIMP 的人,[Diolinux][4] 推出了一个在 GIMP 中模仿 Adobe Photoshop 的工具。 + +### PhotoGIMP:在 Linux 中为 GIMP 提供 Adobe Photoshop 的外观 + +![][5] + +[PhotoGIMP][6] 不是独立的图形软件。它是 GIMP 2.10 的补丁。你需要在系统上安装 GIMP 才能使用 PhotoGIMP。 + +当你应用 PhotoGIMP 补丁时,它将更改 GIMP 布局以模仿 Adobe Photoshop。 + + * 默认安装数百种新字体 + * 安装新的 Python 过滤器,例如 “heal selection” + * 添加新的启动画面 + * 添加新的默认设置以最大化画布空间 + * 添加类似于 Adobe Photoshop 的键盘快捷键 + +PhotoGIMP 还在自定义 `.desktop` 文件中添加新的图标和名称。让我们看看如何使用它。 + +### 在 Linux 上安装 PhotoGIMP (适合中级到专业用户) + +PhotoGIMP 本质是一个补丁。在 Linux 中下载并[解压 zip 文件][7]。你将在解压的文件夹中找到以下隐藏的文件夹: + + * `.icons`:其中包含新的 PhotoGIMP 图标 + * `.local`:包含个性化的 `.desktop` 文件,以便你在系统菜单中看到的是 PhotoGIMP 而不是 GIMP + * `.var`:包含 GIMP 补丁的主文件夹 + +你应该[使用 Ctrl+H 快捷键在 Ubuntu 中显示隐藏文件][8]。 + +警告:建议你备份 GIMP 配置文件,以便在不喜欢 PhotoGIMP 时可以还原。只需将 GIMP 配置文件复制到其他位置即可备份。 + +目前,PhotoGIMP 主要与通过 [Flatpak][9] 安装的 GIMP 兼容。如果你使用 Flatpak 安装了 GIMP,那么只需将这些隐藏的文件夹复制粘贴到家目录中,它将 GIMP 转换为 Adobe Photoshop 类似的设置。 + +但是,如果你通过 apt、snap 或发行版的包管理器安装了 GIMP,那么必须找到 GIMP 的配置文件夹,然后粘贴 PhotoGIMP 的 `.var` 目录的内容。当出现询问时,请选择合并选项并替换同名的现有文件。 + +我[使用 apt 在 Ubuntu 20.04 中安装了 GIMP][10]。对我来说,GIMP 配置文件在 `~/.config/GIMP/2.10`。我复制了 `.var/app/org.gimp.GIMP/config/GIMP/2.10` 目录,并启动 GIMP 查看 PhotoGIMP 的启动页。 + +这是打了 PhotoGIMP 补丁后的 GIMP 界面: + +![][11] + +我尝试了几个 Photoshop 快捷键来检查它所做的更改,一切似乎可以正常工作。 + +- [下载 PhotoGIMP][12] + +我还找到了 [Snap 包形式的 PhotoGIMP][13],但它是 2019 年的,我不确定它是否可以在所有地方使用,或者仅适用于 snap 安装。 + +### 总结 + +这不是类似的第一个项目。几年前,我们有一个类似的项目叫 Gimpshop。Gimpshop 项目在过去的几年中没有任何进展,可以肯定地认为该项目已经死亡。有一个名为 Gimpshop 的网站,但该网站来自冒名者试图以 Gimpshop 的名义获利。 + +我不是 Adobe Photoshop 用户。我甚至不是 GIMP 专家,这就是为什么我们的 [GIMP 教程][14] 用 Dimitrios 的原因。 + +因此,我无法评论 PhotoGIMP 项目的实用性。如果你熟悉这两种软件,那么应该能够比我更好地进行判断。 + +如果你尝试使用 PhotoGIMP,请与他人分享你的经验,并告诉我们是否值得安装。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/photogimp/ + +作者:[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://www.adobe.com/in/products/photoshop.html +[2]: https://itsfoss.com/open-source-photoshop-alternatives/ +[3]: https://www.gimp.org/ +[4]: https://diolinux.com.br/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/photogimp-feature.jpg?ssl=1 +[6]: https://github.com/Diolinux/PhotoGIMP +[7]: https://itsfoss.com/unzip-linux/ +[8]: https://itsfoss.com/hide-folders-and-show-hidden-files-in-ubuntu-beginner-trick/ +[9]: https://flatpak.org/ +[10]: https://itsfoss.com/gimp-2-10-release/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/photogimp-editor-interface.jpg?resize=800%2C538&ssl=1 +[12]: https://github.com/Diolinux/PhotoGIMP/releases +[13]: https://snapcraft.io/photogimp +[14]: https://itsfoss.com/tag/gimp-tips/ diff --git a/published/202007/20200622 Protect your system with fail2ban and firewalld blacklists.md b/published/202007/20200622 Protect your system with fail2ban and firewalld blacklists.md new file mode 100644 index 0000000000..4cd9c9c586 --- /dev/null +++ b/published/202007/20200622 Protect your system with fail2ban and firewalld blacklists.md @@ -0,0 +1,339 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12417-1.html) +[#]: subject: (Protect your system with fail2ban and firewalld blacklists) +[#]: via: (https://fedoramagazine.org/protect-your-system-with-fail2ban-and-firewalld-blacklists/) +[#]: author: (hobbes1069 https://fedoramagazine.org/author/hobbes1069/) + +使用 fail2ban 和 FirewallD 黑名单保护你的系统 +====== + +![][1] + +如果你运行的服务器有面向公众的 SSH 访问,你可能遇到过恶意登录尝试。本文介绍了如何使用两个实用程序来防止入侵者进入我们的系统。 + +为了防止反复的 ssh 登录尝试,我们来看看 fail2ban。而且,如果你不经常旅行,基本上停留在一两个国家,你可以将 FirewallD 配置为只允许[从你选择的国家访问][2]。 + +首先,让我们为不熟悉这些应用程序的人员介绍一些术语,以完成这项工作: + +**fail2ban**:一个守护进程,用于禁止发生多次认证错误的主机。fail2ban 将监控 SystemD 日志,以查找对任何已启用的“监狱jail”的失败的验证尝试。在达到指定失败次数后,它将添加一个防火墙规则,在配置的时间内阻止该特定 IP 地址。 + +**FirewallD**:一个带有 D-Bus 接口的防火墙守护进程,提供动态防火墙。除非你另行决定使用传统的 iptables,否则你已经在所有支持的 Fedora 和 CentOS 上安装了 FirewallD。 + +### 假定前提 + +* 主机系统有一个互联网连接,并且要么是直接暴露在互联网上,要么是通过 DMZ(这两个都是非常糟糕的想法,除非你知道你在做什么),要么是有一个端口从路由器转发过来。 +* 虽然大部分的内容可能适用于其他系统,但本文假设当前系统是 Fedora(31 及以上)或 RHEL/CentOS 8 版本。在 CentOS 上,你必须用 `sudo dnf install epel-release` 启用 Fedora EPEL 仓库。 + +### 安装与配置 + +#### Fail2Ban + +很有可能已经有某个 Firewalld 区已经允许 SSH 访问,但 sshd 服务本身默认没有启用。要手动启动它,并且不在启动时永久启用它: + +``` +$ sudo systemctl start sshd +``` + +或者在系统启动时启用,并同时启动它: + +``` +$ sudo systemctl enable --now sshd +``` + +下一步就是安装、配置、启用 fail2ban。和往常一样,安装可以通过命令行完成: + +``` +$ sudo dnf install fail2ban +``` + +安装完毕后,下一步就是配置“监狱”(你要以设置的任何阈值监视并禁止的服务)。默认情况下,IP 会被禁止 1 小时(这其实不够长)。最好的做法是使用 `*.local` 文件覆盖系统默认值,而不是直接修改 `*.config` 文件。如果我们查看我的 `jail.local`,我们可以看到: + +``` +# cat /etc/fail2ban/jail.local +[DEFAULT] + +# "bantime" is the number of seconds that a host is banned. +bantime = 1d + +# A host is banned if it has generated "maxretry" during the last "findtime" +findtime = 1h + +# "maxretry" is the number of failures before a host get banned. +maxretry = 5 +``` + +换成通俗的语言讲,就是在过去一小时内尝试 5 次后,该 IP 将被封禁 1 天。对于多次被封的 IP,也可以选择增加封禁时间,但这是另一篇文章的主题。 + +下一步是配置“监狱”。在本教程中显示的是 `sshd`,但其他服务的步骤大致相同。在 `/etc/fail2ban/jail.d` 中创建一个配置文件。这是我的文件: + +``` +# cat /etc/fail2ban/jail.d/sshd.local +[sshd] +enabled = true +``` + +就这么简单! 很多配置已经在为 Fedora 构建的软件包中处理了(提示:我是当前的维护者)。接下来启用并启动 fail2ban 服务: + +``` +$ sudo systemctl enable --now fail2ban +``` + +希望没有立即出错,如果没有,请使用下面的命令检查 fail2ban 的状态: + +``` +$ sudo systemctl status fail2ban +``` + +如果它没有错误地启动,应该是这样的: + +``` +$ systemctl status fail2ban +● fail2ban.service - Fail2Ban Service +Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled) +Active: active (running) since Tue 2020-06-16 07:57:40 CDT; 5s ago +Docs: man:fail2ban(1) +Process: 11230 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS) +Main PID: 11235 (f2b/server) +Tasks: 5 (limit: 4630) +Memory: 12.7M +CPU: 109ms +CGroup: /system.slice/fail2ban.service +└─11235 /usr/bin/python3 -s /usr/bin/fail2ban-server -xf start +Jun 16 07:57:40 localhost.localdomain systemd[1]: Starting Fail2Ban Service… +Jun 16 07:57:40 localhost.localdomain systemd[1]: Started Fail2Ban Service. +Jun 16 07:57:41 localhost.localdomain fail2ban-server[11235]: Server ready +``` + +如果是刚刚启动的,fail2ban 不太可能显示任何有意思的信息,但要检查 fail2ban 的状态,并确保“监狱”被启用,请输入: + +``` +$ sudo fail2ban-client status +Status +|- Number of jail: 1 +`- Jail list: sshd +``` + +sshd “监狱”的上级状态也会显示出来。如果启用了多个“监狱”,它们会在这里显示出来。 + +要查看一个“监狱”的详细状态,只需在前面的命令中添加“监狱”名称。下面是我的系统的输出,它已经运行了一段时间。我已经从输出中删除了被禁止的 IP: + +``` +$ sudo fail2ban-client status sshd +Status for the jail: sshd +|- Filter +| |- Currently failed: 8 +| |- Total failed: 4399 +| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd +`- Actions + |- Currently banned: 101 + |- Total banned: 684 + `- Banned IP list: ... +``` + +监控 fail2ban 日志文件是否有入侵尝试,可以通过“尾随”日志来实现: + +``` +$ sudo tail -f /var/log/fail2ban.log +``` + +`tail` 是一个很好的命令行工具,默认情况下,它可以显示一个文件的最后 10 行。添加 `-f` 告诉它尾随文件,这是个观察一个仍在被写入的文件的很好方式。 + +由于输出的内容中有真实的 IP,所以这里不会提供样本,但它的可读性很高。`INFO` 行通常是登录的尝试。如果从一个特定的 IP 地址进行了足够多的尝试,你会看到一个 `NOTICE` 行显示一个 IP 地址被禁止。在达到禁止时间后,你会看到一个 `NOTICE` 解禁行。 + +注意几个警告行。最常见的情况是,当添加了一个禁止后,fail2ban 发现该 IP 地址已经在其禁止数据库中,这意味着禁止可能无法正常工作。如果是最近安装的 fail2ban 包,它应该被设置为 FirewallD 的富规则。这个包在 fail2ban-0.11.1-6 版本时从 ipset 方式切换到了富规则方式,所以如果你的 fail2ban 安装时间较早,它可能还在尝试使用 ipset 方式,这种方式使用的是传统的 iptables,不是很可靠。 + +#### FirewallD 配置 + +##### 被动还是主动? + +有两种策略可以分开或一起使用:**被动**地将单个 IP 地址或**主动**地根据来源国将子网永久列入黑名单。 + +对于被动方式,一旦 fail2ban 运行了一段时间,最好再运行 `sudo fail2ban-client status sshd` 来看看有哪些坏蛋。很可能会有很多被禁止的 IP 地址。选择一个,然后试着对它运行 `whois`。在输出结果中可能会有很多有趣的信息,但是对于这个方法来说,只有来源国是重要的。为了保持简单,让我们过滤掉除了国家以外的所有信息。 + +在这个例子中,我们将使用一些著名的域名: + +``` +$ whois google.com | grep -i country +Registrant Country: US +Admin Country: US +Tech Country: US +``` + +``` +$ whois rpmfusion.org | grep -i country +Registrant Country: FR +``` + +``` +$ whois aliexpress.com | grep -i country +Registrant Country: CN +``` + +使用 `grep -i` 的原因是为了使 `grep` 不区分大小写,而大多数条目都使用的是 “Country”,而有些条目则是全小写的 “country”,所以这种方法无论如何都能匹配。 + +现在知道了尝试入侵的来源国,问题是,“是否有来自这个国家的人有合法的理由连接到这台计算机?”如果答案是否定的,那么封锁整个国家应该是可以接受的。 + +从功能上看,主动式方法它与被动式方法没有太大区别,然而,来自有些国家的入侵企图是非常普遍的。如果你的系统既不放在这些国家里,也没有任何源自这些国家的客户,那么为什么不现在就把它们加入黑名单而是等待呢?(LCTT 译注:我的经验是,动辄以国家的范畴而列入黑名单有些过于武断。建议可以将该 IP 所属的 WHOIS 网段放入到黑名单,因为这些网段往往具有相同的使用性质,如都用于用户接入或 IDC 托管,其安全状况也大致相同,因此,如果有来自该网段的某个 IP 的恶意尝试,可以预期该网段内的其它 IP 也可能被利用来做这样的尝试。) + +##### 黑名单脚本和配置 + +那么如何做到这一点呢?用 FirewallD ipset。我开发了下面的脚本来尽可能地自动化这个过程: + +``` +#!/bin/bash +# Based on the below article +# https://www.linode.com/community/questions/11143/top-tip-firewalld-and-ipset-country-blacklist + +# Source the blacklisted countries from the configuration file +. /etc/blacklist-by-country + +# Create a temporary working directory +ipdeny_tmp_dir=$(mktemp -d -t blacklist-XXXXXXXXXX) +pushd $ipdeny_tmp_dir + +# Download the latest network addresses by country file +curl -LO http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz +tar xf all-zones.tar.gz + +# For updates, remove the ipset blacklist and recreate +if firewall-cmd -q --zone=drop --query-source=ipset:blacklist; then + firewall-cmd -q --permanent --delete-ipset=blacklist +fi + +# Create the ipset blacklist which accepts both IP addresses and networks +firewall-cmd -q --permanent --new-ipset=blacklist --type=hash:net \ + --option=family=inet --option=hashsize=4096 --option=maxelem=200000 \ + --set-description="An ipset list of networks or ips to be dropped." + +# Add the address ranges by country per ipdeny.com to the blacklist +for country in $countries; do + firewall-cmd -q --permanent --ipset=blacklist \ + --add-entries-from-file=./$country.zone && \ + echo "Added $country to blacklist ipset." +done + +# Block individual IPs if the configuration file exists and is not empty +if [ -s "/etc/blacklist-by-ip" ]; then + echo "Adding IPs blacklists." + firewall-cmd -q --permanent --ipset=blacklist \ + --add-entries-from-file=/etc/blacklist-by-ip && \ + echo "Added IPs to blacklist ipset." +fi + +# Add the blacklist ipset to the drop zone if not already setup +if firewall-cmd -q --zone=drop --query-source=ipset:blacklist; then + echo "Blacklist already in firewalld drop zone." +else + echo "Adding ipset blacklist to firewalld drop zone." + firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist +fi + +firewall-cmd -q --reload + +popd +rm -rf $ipdeny_tmp_dir +``` + +这个应该安装到 `/usr/local/sbin`,不要忘了让它可执行! + +``` +$ sudo chmod +x /usr/local/sbin/firewalld-blacklist +``` + +然后创建一个配置文件 `/etc/blacklist-by-country`: + +``` +# Which countries should be blocked? +# Use the two letter designation separated by a space. +countries="" +``` + +而另一个配置文件 `/etc/blacklist-by-ip`,每行只有一个 IP,没有任何额外的格式化。 + +在这个例子中,从 ipdeny 的区文件中随机选择了 10 个国家: + +``` +# ls | shuf -n 10 | sed "s/\.zone//g" | tr '\n' ' ' +nl ee ie pk is sv na om gp bn +``` + +现在只要在配置文件中加入至少一个国家,就可以运行了! + +``` +$ sudo firewalld-blacklist + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 142 100 142 0 0 1014 0 --:--:-- --:--:-- --:--:-- 1014 +100 662k 100 662k 0 0 989k 0 --:--:-- --:--:-- --:--:-- 989k +Added nl to blacklist ipset. +Added ee to blacklist ipset. +Added ie to blacklist ipset. +Added pk to blacklist ipset. +Added is to blacklist ipset. +Added sv to blacklist ipset. +Added na to blacklist ipset. +Added om to blacklist ipset. +Added gp to blacklist ipset. +Added bn to blacklist ipset. +Adding ipset blacklist to firewalld drop zone. +success +``` + +要验证 FirewallD 黑名单是否成功,请检查 `drop` 区和 `blacklist` ipset。 + +``` +$ sudo firewall-cmd --info-zone=drop +drop (active) + target: DROP + icmp-block-inversion: no + interfaces: + sources: ipset:blacklist + services: + ports: + protocols: + masquerade: no + forward-ports: + source-ports: + icmp-blocks: + rich rules: + +$ sudo firewall-cmd --info-ipset=blacklist | less +blacklist + type: hash:net + options: family=inet hashsize=4096 maxelem=200000 + entries: +``` + +第二条命令将输出所有的子网,这些子网是基于被封杀的国家而添加的,可能会相当长。 + +### 那么现在我该怎么做? + +虽然在开始的时候,监控的频率会比较高,但随着时间的推移,入侵尝试的次数应该会随着黑名单的增加而减少。那么目标应该是维护而不是主动监控。 + +为此,我创建了一个 SystemD 服务文件和定时器,这样每月都会刷新由 ipdeny 维护的每个国家的子网。事实上,这里讨论的所有内容都可以从我的 [pagure.io](https://pagure.io/firewalld-blacklist) 项目中下载。 + +是不是很高兴你看完了整篇文章?现在只要把服务文件和定时器下载到 `/etc/systemd/system/`,并启用定时器就行了: + +``` +$ sudo systemctl daemon-reload +$ sudo systemctl enable --now firewalld-blacklist.timer +``` + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/protect-your-system-with-fail2ban-and-firewalld-blacklists/ + +作者:[hobbes1069][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/hobbes1069/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/06/fail2ban-and-firewalld-816x345.png +[2]: https://www.linode.com/community/questions/11143/top-tip-firewalld-and-ipset-country-blacklist diff --git a/published/202007/20200624 How to Disable Dock on Ubuntu 20.04 and Gain More Screen Space.md b/published/202007/20200624 How to Disable Dock on Ubuntu 20.04 and Gain More Screen Space.md new file mode 100644 index 0000000000..3ca4e2946f --- /dev/null +++ b/published/202007/20200624 How to Disable Dock on Ubuntu 20.04 and Gain More Screen Space.md @@ -0,0 +1,113 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12414-1.html) +[#]: subject: (How to Disable Dock on Ubuntu 20.04 and Gain More Screen Space) +[#]: via: (https://itsfoss.com/disable-ubuntu-dock/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Ubuntu 20.04 上禁用坞站(dock) +====== + +左侧的启动器已成为 [Ubuntu][1] 桌面的标识。它是在 [Unity 桌面][2]中引入的,甚至在 [Ubuntu 切换到 GNOME][3]时就有了,它复刻了 “Dash to Panel”,以在 [GNOME][4] 上创建一个类似的坞站dock。 + +就个人而言,我发现它对于快速访问常用应用非常方便,但并非所有人都希望它额外占用屏幕上的一些空间。 + +从 [Ubuntu 20.04][5] 开始,你可以轻松禁用坞站。在本教程中,让我向你展示如何以图形和命令的方式执行此操作。 + +![][6] + +### 通过扩展应用禁用 Ubuntu Dock + +[Ubuntu 20.04 的主要功能][7]之一是引入“扩展Extension”应用来管理系统上的 GNOME 扩展。只需在 GNOME 菜单中查找它(按下 Windows 键并输入): + +![Look for Extensions app in the menu][8] + +> 没有找到扩展应用? +> +> 如果尚未安装,你应该启用 GNOME Shell 扩展,“扩展” GUI 是此软件包的一部分。 +> +> ``` +> sudo apt install gnome-shell-extensions +> ``` +> +> 这仅对 [GNOME 3.36][9] 或 Ubuntu 20.04(或更高版本) 中的更高版本有效。 + +启动“扩展”应用,你应该在“内置”扩展下看到 Ubuntu Dock。你只需要关闭即可禁用坞站。 + +![Disable Ubuntu Dock][10] + +更改是即时的,你会看到坞站立即消失。 + +你可以用相同的方式恢复。只需打开它,它就会立即显示。 + +在 Ubuntu 20.04 中非常容易隐藏坞站,不是吗? + +### 替代方法:通过命令行禁用 Ubuntu 坞站 + +如果你是终端爱好者,并且喜欢在终端中做事,那么我有一个对你而言的好消息。你可以从命令行禁用 Ubuntu 坞站。 + +使用 `Ctrl+Alt+T` 打开终端。你可能已经知道 [Ubuntu 中的键盘快捷键][11]。 + +在终端中,使用以下命令列出所有可用的 GNOME 扩展: + +``` +gnome-extensions list +``` + +这将显示类似于以下的输出: + +![List GNOME Extensions][12] + +默认的 Ubuntu 坞站扩展是 `ubuntu-dock@ubuntu.com`。你可以使用以下命令将其禁用: + +``` +gnome-extensions disable ubuntu-dock@ubuntu.com +``` + +屏幕上不会显示任何输出,但是你会注意到启动器(坞站)从左侧消失了。 + +如果需要,你可以使用与上面相同的命令再次启用它,但使用启用选项: + +``` +gnome-extensions enable ubuntu-dock@ubuntu.com +``` + +### 总结 + +在 Ubuntu 18.04 中也有禁用坞站的方法。但是,如果你尝试在 18.04 中删除它,这可能会导致不想要的结果。删除此软件包也会删除 ubuntu-desktop 包,最终可能会导致系统崩溃,例如没有应用菜单。 + +这就是为什么我不建议在 Ubuntu 18.04 上删除它的原因。 + +好消息是 Ubuntu 20.04 提供了一种隐藏任务栏的方法。用户拥有更大的自由度和更多的屏幕空间。说到更多的屏幕空间,你是否知道可以[从 Firefox 移除顶部标题栏并获得更多的屏幕空间][14]? + +我想知道你喜欢怎样的 Ubuntu 桌面?要坞站,不要坞站,还是不要 GNOME? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/disable-ubuntu-dock/ + +作者:[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://ubuntu.com/ +[2]: https://itsfoss.com/keeping-ubuntu-unity-alive/ +[3]: https://itsfoss.com/ubuntu-unity-shutdown/ +[4]: https://www.gnome.org/ +[5]: https://itsfoss.com/download-ubuntu-20-04/ +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/disable-dock-in-ubuntu.png?ssl=1 +[7]: https://itsfoss.com/ubuntu-20-04-release-features/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/GNOME-extensions-app-ubuntu.jpg?ssl=1 +[9]: https://itsfoss.com/gnome-3-36-release/ +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/disable-ubuntu-dock.png?ssl=1 +[11]: https://itsfoss.com/ubuntu-shortcuts/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/list-gnome-extensions.png?ssl=1 +[13]: https://itsfoss.com/cdn-cgi/l/email-protection +[14]: https://itsfoss.com/remove-title-bar-firefox/ diff --git a/published/202007/20200625 How to stress test your Linux system.md b/published/202007/20200625 How to stress test your Linux system.md new file mode 100644 index 0000000000..a9cc40f818 --- /dev/null +++ b/published/202007/20200625 How to stress test your Linux system.md @@ -0,0 +1,208 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12389-1.html) +[#]: subject: (How to stress test your Linux system) +[#]: via: (https://www.networkworld.com/article/3563334/how-to-stress-test-your-linux-system.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +如何对你的 Linux 系统进行压力测试 +====== + +> 如果你想了解 Linux 服务器在重压之下的运行情况,那么给 Linux 服务器施加压力是个不错的主意。在这篇文章中,我们将看一些工具,可以帮助你增加服务器压力并衡量结果。 + +![](https://images.idgesg.net/images/article/2020/06/stress-test2_linux-penguin-stress-ball_hand-squeezing_by-digitalsoul-getty-images_1136841639-100850120-large.jpg) + +为什么你会想给你的 Linux 系统施加压力呢?因为有时你可能想知道当一个系统由于大量运行的进程、繁重的网络流量、过多的内存使用等原因而承受很大的压力时,它的表现如何。这种压力测试可以帮助确保系统已经做好了 “上市” 的准备。 + +如果你需要预测应用程序可能需要多长时间才能做出反应,以及哪些(如果有的话)进程可能会在重负载下失败或运行缓慢,那么在前期进行压力测试是一个非常好的主意。 + +幸运的是,对于那些需要能够预测 Linux 系统在压力下的反应的人来说,你可以采用一些有用的技术和工具来使这个过程更容易。在这篇文章中,我们将研究其中的一些。 + +### 自己动手做个循环 + +第一种技术是在命令行上运行一些循环,观察它们对系统的影响。这种方式可以大大增加 CPU 的负荷。使用 `uptime` 或类似的命令可以很容易地看到结果。 + +在下面的命令中,我们启动了四个无尽循环。你可以通过添加数字或使用 bash 表达式,如 `{1...6}` 来代替 `1 2 3 4` 以增加循环次数: + +``` +for i in 1 2 3 4; do while : ; do : ; done & done +``` + +在命令行上输入后,将在后台启动四个无尽循环: + +``` +$ for i in 1 2 3 4; do while : ; do : ; done & done +[1] 205012 +[2] 205013 +[3] 205014 +[4] 205015 +``` + +在这种情况下,发起了作业 1-4,作业号和进程号会相应显示出来。 + +要观察对平均负载的影响,请使用如下所示的命令。在本例中,`uptime` 命令每 30 秒运行一次: + +``` +$ while true; do uptime; sleep 30; done +``` + +如果你打算定期运行这样的测试,你可以将循环命令放入脚本 `watch-it` 中。 + +``` +#!/bin/bash + +while true +do + uptime + sleep 30 +done +``` + +在输出中,你可以看到平均负载是如何增加的,然后在循环结束后又开始下降。 + +``` + 11:25:34 up 5 days, 17:27, 2 users, load average: 0.15, 0.14, 0.08 + 11:26:04 up 5 days, 17:27, 2 users, load average: 0.09, 0.12, 0.08 + 11:26:34 up 5 days, 17:28, 2 users, load average: 1.42, 0.43, 0.18 + 11:27:04 up 5 days, 17:28, 2 users, load average: 2.50, 0.79, 0.31 + 11:27:34 up 5 days, 17:29, 2 users, load average: 3.09, 1.10, 0.43 + 11:28:04 up 5 days, 17:29, 2 users, load average: 3.45, 1.38, 0.54 + 11:28:34 up 5 days, 17:30, 2 users, load average: 3.67, 1.63, 0.66 + 11:29:04 up 5 days, 17:30, 2 users, load average: 3.80, 1.86, 0.76 + 11:29:34 up 5 days, 17:31, 2 users, load average: 3.88, 2.06, 0.87 + 11:30:04 up 5 days, 17:31, 2 users, load average: 3.93, 2.25, 0.97 + 11:30:34 up 5 days, 17:32, 2 users, load average: 3.64, 2.35, 1.04 <== 循环停止 + 11:31:04 up 5 days, 17:32, 2 users, load average: 2.20, 2.13, 1.01 11:31:34 up 5 days, 17:33, 2 users, load average: 1.40, 1.94, 0.98 +``` + +因为所显示的负载分别代表了 1、5 和 15 分钟的平均值,所以这些值需要一段时间才能恢复到系统接近正常的状态。 + +要停止循环,请发出像下面这样的 `kill` 命令 —— 假设作业号是 1-4,就像本篇文章前面显示的那样。如果你不确定,可以使用 `jobs` 命令来确认作业号。 + +``` +$ kill %1 %2 %3 %4 +``` + +### 增加压力的专用工具 + +另一种方法是使用专门为你制造系统压力的工具。其中一种叫做 `stress`(压力),可以以多种方式对系统进行压力测试。`stress` 工具是一个工作负载生成器,提供 CPU、内存和磁盘 I/O 压力测试。 + +在使用 `--cpu` 选项时,`stress` 命令使用平方根函数强制 CPU 努力工作。指定的 CPU 数量越多,负载上升的速度就越快。 + +下面第二个脚本(`watch-it-2`)可以用来衡量对系统内存使用的影响。请注意,它使用 `free` 命令来查看加压的效果。 + +``` +$ cat watch-it-2 +#!/bin/bash + +while true +do + free + sleep 30 +done +``` + +发起任务并观察压力: + +``` +$ stress --cpu 2 + +$ ./watch-it + 13:09:14 up 5 days, 19:10, 2 users, load average: 0.00, 0.00, 0.00 + 13:09:44 up 5 days, 19:11, 2 users, load average: 0.68, 0.16, 0.05 + 13:10:14 up 5 days, 19:11, 2 users, load average: 1.20, 0.34, 0.12 + 13:10:44 up 5 days, 19:12, 2 users, load average: 1.52, 0.50, 0.18 + 13:11:14 up 5 days, 19:12, 2 users, load average: 1.71, 0.64, 0.24 + 13:11:44 up 5 days, 19:13, 2 users, load average: 1.83, 0.77, 0.30 +``` + +在命令行中指定的 CPU 越多,负载就增加的越快。 + +``` +$ stress --cpu 4 +$ ./watch-it + 13:47:49 up 5 days, 19:49, 2 users, load average: 0.00, 0.00, 0.00 + 13:48:19 up 5 days, 19:49, 2 users, load average: 1.58, 0.38, 0.13 + 13:48:49 up 5 days, 19:50, 2 users, load average: 2.61, 0.75, 0.26 + 13:49:19 up 5 days, 19:50, 2 users, load average: 3.16, 1.06, 0.38 + 13:49:49 up 5 days, 19:51, 2 users, load average: 3.49, 1.34, 0.50 + 13:50:19 up 5 days, 19:51, 2 users, load average: 3.69, 1.60, 0.61 +``` + +`stress` 命令也可以通过 `--io`(输入/输出)和 `--vm`(内存)选项增加 I/O 和内存的负载来给系统施加压力。 + +在接下来的这个例子中,运行这个增加内存压力的命令,然后启动 `watch-it-2` 脚本。 + +``` +$ stress --vm 2 + +$ watch-it-2 + total used free shared buff/cache available +Mem: 6087064 662160 2519164 8868 2905740 5117548 +Swap: 2097148 0 2097148 + total used free shared buff/cache available +Mem: 6087064 803464 2377832 8864 2905768 4976248 +Swap: 2097148 0 2097148 + total used free shared buff/cache available +Mem: 6087064 968512 2212772 8864 2905780 4811200 +Swap: 2097148 0 2097148 +``` + +`stress` 的另一个选项是使用 `--io` 选项为系统添加输入/输出活动。在这种情况下,你可以使用这样的命令: + +``` +$ stress --io 4 +``` + +然后你可以使用 `iotop` 观察受压的 I/O。注意,运行 `iotop` 需要 root 权限。 + +之前: + +``` +$ sudo iotop -o +Total DISK READ: 0.00 B/s | Total DISK WRITE: 19.36 K/s +Current DISK READ: 0.00 B/s | Current DISK WRITE: 27.10 K/s + TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND + 269308 be/4 root 0.00 B/s 0.00 B/s 0.00 % 1.24 % [kworker~fficient] + 283 be/3 root 0.00 B/s 19.36 K/s 0.00 % 0.26 % [jbd2/sda1-8] +``` + +之后: + +``` +Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s +Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s + TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND + 270983 be/4 shs 0.00 B/s 0.00 B/s 0.00 % 51.45 % stress --io 4 + 270984 be/4 shs 0.00 B/s 0.00 B/s 0.00 % 51.36 % stress --io 4 + 270985 be/4 shs 0.00 B/s 0.00 B/s 0.00 % 50.95 % stress --io 4 + 270982 be/4 shs 0.00 B/s 0.00 B/s 0.00 % 50.80 % stress --io 4 + 269308 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.09 % [kworker~fficient] +``` + +`stress` 只是给系统增加压力的若干工具之一。另一个较新的工具,`stress-ng`,将在以后的文章中介绍。 + +### 总结 + +用于系统压力测试的各种工具可以帮助你预测系统在真实世界的情况下如何响应,在这些情况下,它们受到增加的流量和计算需求。 + +虽然我们在文章中展示的是创建和测量各种类型的压力的方法,但最终的好处是压力如何帮助确定你的系统或应用程序对它的反应。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3563334/how-to-stress-test-your-linux-system.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/newsletters/signup.html +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/published/202007/20200625 Make Bash history more useful with these tips.md b/published/202007/20200625 Make Bash history more useful with these tips.md new file mode 100644 index 0000000000..1757367d61 --- /dev/null +++ b/published/202007/20200625 Make Bash history more useful with these tips.md @@ -0,0 +1,146 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12381-1.html) +[#]: subject: (Make Bash history more useful with these tips) +[#]: via: (https://opensource.com/article/20/6/bash-history-control) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +这些技巧让 Bash 命令历史更加有用 +====== + +> 告诉 Bash 你想要它记住什么,甚至删除不需要的记录重写历史。 + +![](https://img.linux.net.cn/data/attachment/album/202007/05/091205hkg0egl2gge2gx9z.jpg) + +运行 [Bash][2] 的 Linux 终端有内置的历史记录,你可以用来跟踪最近的操作。要查看你的 Bash 会话的历史记录,请使用内置命令 `history`: + +``` +$ echo "foo" +foo +$ echo "bar" +bar +$ history +  1  echo "foo" +  2  echo "bar" +  3  history +``` + +与大多数命令不一样,`history` 命令不是文件系统上的可执行文件,而是 Bash 的功能。你可以使用 `type` 命令来验证: + +``` +$ type history +history is a shell builtin +``` + +### 历史控制 + +shell 历史记录的行数上限由 `HISTSIZE` 变量定义。你可以在 `.bashrc` 文件中设置此变量。以下将你的历史记录设置为 3,000 行,之后将最早的行删除以为最新命令腾出空间,该命令位于列表的底部: + +``` +export HISTSIZE=3000 +``` + +还有其他与历史相关的变量。 `HISTCONTROL` 变量控制哪些历史被记录。你可以在 `.bashrc` 中写入下面的行来强制 Bash 排除以空格开头的命令: + +``` +export HISTCONTROL=$HISTCONTROL:ignorespace +``` + +现在,如果你输入以空格开头的命令,那么它将不会记录在历史记录中: + +``` +$ echo "hello" +$     mysql -u bogus -h badpassword123 mydatabase +$ echo "world" +$ history +  1  echo "hello" +  2  echo "world" +  3  history +``` + +你也可以避免重复的条目: + +``` +export HISTCONTROL=$HISTCONTROL:ignoredups +``` + +现在,如果你一个接着一个输入两个命令,历史记录中只会显示一个: + +``` +$ ls +$ ls +$ ls +$ history +  1  ls +  2  history +``` + +如果你喜欢这两个忽略功能,那么可以使用 `ignoreboth`: + +``` +export HISTCONTROL=$HISTCONTROL:ignoreboth +``` + +### 从历史记录中删除命令 + +有时你会犯一个错误,在 shell 中输入了一些敏感内容,或者你​​只是想清理历史记录,以便它更准确地表示让某件事正常工作所采取的步骤。如果要从 Bash 的历史记录中删除命令,请在要删除的项目的行号上使用 `-d` 选项: + +``` +$ echo "foo" +foo +$ echo "bar" +bar +$ history | tail +  535  echo "foo" +  536  echo "bar" +  537  history | tail +$ history -d 536 +$ history | tail +  535  echo "foo" +  536  history | tail +  537  history -d 536 +  538  history | tail +``` + +要停止添加 `history` 条目,只要在 `HISTCONTROL` 环境变量中有 `ignorespace`,就可以在命令前添加空格: + +``` +$  history | tail +  535  echo "foo" +  536  echo "bar" +$  history -d 536 +$  history | tail +  535  echo "foo" +``` + +你可以使用 `-c` 选项清除所有会话历史记录: + +``` +$ history -c +$  history +$ +``` + +### history 命令的经验 + +操纵历史通常没有听起来那么危险,尤其是当你有目标地管理它时。例如,如果你要记录一个复杂的问题,通常最好使用会话历史来记录命令,因为通过将命令插入历史记录,你能运行它们并从而测试过程。很多时候,不执行历史命令会导致忽略小的步骤或写错小细节。 + +按需使用历史会话,并明智地控制历史记录。享受历史修改吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/bash-history-control + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb (A person programming) +[2]: https://opensource.com/resources/what-bash diff --git a/published/202007/20200626 Docker and Fedora 32.md b/published/202007/20200626 Docker and Fedora 32.md new file mode 100644 index 0000000000..51d9073614 --- /dev/null +++ b/published/202007/20200626 Docker and Fedora 32.md @@ -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 diff --git a/published/202007/20200626 Open source tools for translating British to American English.md b/published/202007/20200626 Open source tools for translating British to American English.md new file mode 100644 index 0000000000..a2f1f35abb --- /dev/null +++ b/published/202007/20200626 Open source tools for translating British to American English.md @@ -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] 是一个使用 Java(GNU 许可)编写的开源多语言文本到语音合成平台。方便的[基于浏览器的界面][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/ diff --git a/published/202007/20200627 An open source browser extension to zoom in on images.md b/published/202007/20200627 An open source browser extension to zoom in on images.md new file mode 100644 index 0000000000..bc056c0938 --- /dev/null +++ b/published/202007/20200627 An open source browser extension to zoom in on images.md @@ -0,0 +1,51 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12384-1.html) +[#]: subject: (An open source browser extension to zoom in on images) +[#]: via: (https://opensource.com/article/20/6/hoverzoom) +[#]: author: (Jeff Macharyas https://opensource.com/users/jeffmacharyas) + +一个可放大图像的开源的浏览器扩展 +====== + +> 想细看网络图像并不总是那么简单,但是 Hover Zoom+ 让它像鼠标滑动一样容易。 + +![Digital images of a computer desktop][1] + +你是否曾经在访问网站时希望查看更大的图像?我经常遇到这种情况,而要做到这点并不总是那么容易。 + +有时,我在源码中筛选,使用 `Ctrl + F` 搜索图像,复制图像源地址并将其粘贴到新窗口中,以便以全尺寸查看图像。或者,另一个选择是右键单击,复制图像地址,然后粘贴到新选项卡中。 + +![Example image source code ][2] + +Hover Zoom+ 让这个过程更加简单。Hover Zoom+ 是一个简单 Chrome 扩展程序,在 MIT 许可证下发布,可在 Chrome 商店中找到,它的源码可在 [GitHub][3] 上获得。它也适用于 Firefox。 + +这个应用使得该过程更加容易。只需将鼠标悬停在图像上,你将看到一个弹出窗口来显示该图像的全部内容,它会匹配你的浏览器窗口,无论图像是否被裁剪(或者图像尺寸适当,它看上去会是一样的)。这可能很有趣,因为有时可能会裁剪原始图像,以适应空间或聚焦于图像的特定部分。但是,你无法右键单击并直接从弹出窗口中保存图像。 + +根据加州圣何塞的开发人员 Oleg Anashkin 的说法,“这是原始 HoverZoom 扩展的开源版本,现已被恶意软件所占领,并被从商店中删除。在此版本中,所有间谍软件均已删除,许多 bug 已被修复,并添加了新功能。它默认不会收集任何统计信息。” + +我在 Windows 10 笔记本上的 Chrome 中安装了此扩展,然后试用了一下。安装扩展后,我将鼠标悬停在图像上,它在弹出窗口中显示了比实际更大的图像。 + +但是,Hover Zoom+ 不适用于所有网站或所有图像。它适用于 Facebook 和 Twitter,但不适用于这些网站上的赞助内容。用户可以轻松切换该应用以针对特定站点启用或禁用它。使用 Hover Zoom+ 可以很容易地看到 Instagram 上的这只可爱小猫而无需实际阅读帖子(方便!): + +![Zoomed-in image of a kitten from Facebook][4] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/hoverzoom + +作者:[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/computer_browser_web_desktop.png?itok=Bw8ykZMA (Digital images of a computer desktop) +[2]: https://opensource.com/sites/default/files/uploads/source.jpg (Example image source code) +[3]: https://github.com/extesy/hoverzoom/ +[4]: https://opensource.com/sites/default/files/uploads/fb-cat.jpg (HoverZoom+ enlarged image) diff --git a/published/202007/20200627 Learn Shell Scripting for Free With These Resources -PDF, Video Courses and Interactive Websites.md b/published/202007/20200627 Learn Shell Scripting for Free With These Resources -PDF, Video Courses and Interactive Websites.md new file mode 100644 index 0000000000..a4bcd85506 --- /dev/null +++ b/published/202007/20200627 Learn Shell Scripting for Free With These Resources -PDF, Video Courses and Interactive Websites.md @@ -0,0 +1,178 @@ +[#]: collector: (lujun9972) +[#]: translator: (Yufei-Yan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12379-1.html) +[#]: subject: (Learn Shell Scripting for Free With These Resources [PDF, Video Courses and Interactive Websites]) +[#]: via: (https://itsfoss.com/shell-scripting-resources/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +学习 Shell 脚本编程的免费资源 +====== + +> 你想学习 shell 脚本编程吗?或者你想提升现有的 bash 知识?我收集了以下免费的资源来帮助你学习 shell 脚本编程。 + +(LCTT 译注:毫无疑问,这些都是英文的) + +shell 是一个命令行解释器,它允许你输入命令并获得输出。当你在使用终端的时候,你就已经在看 shell 了。 + +是的,shell 是一个你可以和它进行交互的命令行界面,你可以通过它给操作系统某种指令。虽然有不同类型的 shell,但是 [bash][1](GNU Bourne-Again Shell)是在各 Linux 发行版中最流行的。 + +当谈到 shell 脚本编程的时候,也就意味着 —— 用户希望使用脚本来执行多条命令来获得一个输出。 + +也许你需要学习 shell 脚本编程作为你的课程或者工作的一部分。了解 shell 脚本编程也可以帮助你在 Linux 中自动化某些重复的任务。 + +不管出于什么原因学习 shell 脚本编程,都可以看看这些我给你展示的资源。 + +### 最好的免费学习 shell 脚本编程的资源 + +![][2] + +还没在你的系统上安装 Linux?不用担心。有很多种方法[在 Windows 上使用 Linux 终端][3]。你也可以在某些情况下[使用在线 Linux 终端][4]来练习 shell 脚本编程。 + +#### 1、学习 Shell —— 互动网站 + +![][5] + +如果你正在找一个互动网站来学习 shell 脚本编程,并且还可以在线试试,“[学习 Shell][6]” 是一个不错的起点。 + +它涵盖了基础知识,并且也提供了一些高级的练习。通常,内容还是简明扼要的 —— 因此,我建议你看看这个网站。 + +#### 2、Shell 脚本编程教程 —— 门户网站 + +![][7] + +“[Shell 脚本编程教程][8]” 是一个完全专注于 shell 脚本编程的网站。你可以选择免费阅读其中的资源,也可以购买 PDF、实体书籍和电子书来支持他们。 + +当然,花钱买纸质的版本或者电子书不是强制的。但是,这些免费资源查看起来还是很方便的。 + +#### 3、Udemy:Shell 脚本 —— 免费视频课程 + +![][9] + +毫无疑问,[Udemy][10] 是最受欢迎的在线课程平台之一。而且,除了付费认证课程之外,它还提供了不包含证书的免费内容。 + +“[Shell 脚本][11]” 是 Udemy 上推荐度最高的免费课程之一。你不需要花费任何费用就可以注册这门课。 + +#### 4、Udemy:Bash Shell 脚本编程 —— 免费视频课程 + +![][12] + +Udemy 上另一个专注于 [bash shell 脚本编程][29]的有趣且免费的课程。与前面提到的课程相比,这个资源似乎更受欢迎。所以,你可以注册这门课,看看它都教些什么。 + +别忘了 Udemy 的免费课程不能提供证书。但是,它确实是一个让人印象深刻的免费 shell 脚本编程学习资源。 + +#### 5、Bash 研究院 —— 互动游戏在线门户 + +![][13] + +顾名思义,“[Bash 研究院][15]” 专注于向用户提供 bash shell 的教学。 + +尽管它没有很多的内容,它还是非常适合初学者和有一定经验的用户。不仅仅局限于指导 —— 它也可以提供交互式的游戏来练习,不过目前已经不能用了。 + +因此,如果这个足够有趣,你可以去看看这个 [Github 页面][14],并且如果你愿意的话,还可以复刻它并对现有资源进行改进。 + +#### 6、LinkedIn:学习 Bash 脚本编程 —— 免费视频课程 + +![][16] + +LinkedIn 提供了大量免费课程来帮助你提成技能,并且为更多工作做好准备。你还可以找到一些专注于 shell 脚本编程的课程,这些课程有助于重温基本技能或者这个过程中获得一些高级技能。 + +在这里,我提供一个 [学习 Bash 脚本编程][17] 的课程链接,你还可以发现其他类似的免费课程。 + +#### 7、高级 Bash 脚本编程指南 —— 免费 PDF 书籍 + +![][18] + +这是一个令人印象深刻的《[高级 Bash 脚本编程指南][19]》,并且可以免费获得到它的 PDF 版本。这个 PDF 资源没有版权限制,在公开领域是完全免费的。 + +尽管这个资源主要是提供高级的知识,通过参考这个 PDF 并且开始学习 shell 脚本编程,它还是很适合初学者的。 + +#### 8、专业 Bash 笔记 —— 免费 PDF 书籍 + +![][20] + +如果你已经对 Bash Shell 脚本编程比较熟悉或者只是想快速总结一下,那这是一个很好的参考。 + +这个《[专业 Bash 笔记][21]》可以免费下载的书有 100 多页,通过简单的描述和例子,这本书涵盖了各种各样的主题。 + +#### 9、Tutorialspoint —— 门户网站 + +![][22] + +“[Tutorialspoint][24]” 是一个非常流行的学习各种编程语言的门户网站。我想说这对于初学者学习基础知识非常好。 + +也许这不太适合作为一个详细的资源——但是它应该是不错的免费资源。 + +#### 10、旧金山城市学院:在线笔记 —— 门户网站 + +![][25] + +也许这不是最好的免费资源 —— 但是如果你已经为学习 shell 脚本编程做好了探索每种资源的准备,为什么不看看旧金山城市学院的 “[在线笔记][26]” 呢? + +当我在网上随便搜索关于 shell 脚本编程的资源的时候,我偶然遇到到了这个资源。 + +同样需要注意的是,这个在线笔记可能会有点过时。但是,这应该还是一个值得探索的有趣资源。 + +#### 荣誉奖: Linux 手册 + +![][27] + +不要忘记,bash 手册也应该是一个相当不错的免费资源,可以用它来查看命令和使用方法。 + +尽管它不是专门为你掌握 shell 脚本编程而量身打造的,它依然是一个你可以免费使用的重要网络资源。你可以选择访问在线手册,或者直接打开终端然后输入以下命令: + +``` +man bash +``` + +### 总结 + +有很多很受欢迎的付费资源,比如这些[最好的 Linux 书籍][28]。从网络上的一些免费资源开始学习 shell 脚本编程还是很方便的。 + +除了我提到的这些,我敢肯定网上还有不计其数的资源可以帮助你学习 shell 脚本编程。 + +你喜欢换上面提到的资源吗?如果你知道我可能错过的非常棒的免费资源,记得在下面评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/shell-scripting-resources/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Bash_(Unix_shell) +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Learn-Shell-Scripting.png?ssl=1 +[3]: https://itsfoss.com/run-linux-commands-in-windows/ +[4]: https://itsfoss.com/online-linux-terminals/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/learnshell.png?ssl=1 +[6]: https://www.learnshell.org/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/shell-scripting-tutorial.png?ssl=1 +[8]: https://www.shellscript.sh/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/shell-scripting-udemy.png?ssl=1 +[10]: https://www.udemy.com +[11]: https://www.udemy.com/course/shell-scripting-i/ +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/bash-shell-scripting.png?ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/the-bash-academy.png?ssl=1 +[14]: https://github.com/lhunath/guide.bash.academy +[15]: https://guide.bash.academy/ +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/learn-bash-scripting-linkedin.png?ssl=1 +[17]: https://www.linkedin.com/learning/learning-bash-scripting +[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/advanced-bash-scripting-pdf.png?ssl=1 +[19]: http://tldp.org/LDP/abs/abs-guide.pdf +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/Bash-Notes-for-Professional.jpg?ssl=1 +[21]: https://goalkicker.com/BashBook/ +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/tutorialspoint-shell.png?ssl=1 +[23]: https://en.wikipedia.org/wiki/Programming_language +[24]: https://www.tutorialspoint.com/unix/shell_scripting.htm +[25]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/scripting-notes-ccsf.png?ssl=1 +[26]: https://fog.ccsf.edu/~gboyd/cs160b/online/index.html +[27]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/bash-linux-man-page.png?ssl=1 +[28]: https://itsfoss.com/best-linux-books/ +[29]: https://www.udemy.com/course/complete-bash-shell-scripting/ \ No newline at end of file diff --git a/published/202007/20200628 How to crop images in GIMP -Quick Tip.md b/published/202007/20200628 How to crop images in GIMP -Quick Tip.md new file mode 100644 index 0000000000..df99b3db25 --- /dev/null +++ b/published/202007/20200628 How to crop images in GIMP -Quick Tip.md @@ -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] + +你还可以通过菜单访问裁剪工具:“工具 → 变形工具 → 裁剪Tools → Transform Tools → Crop”。 + +激活该工具后,你会注意到画布上的鼠标光标会发生变化,以表示正在使用“裁剪工具”。 + +现在,你可以在图像画布上的任意位置单击鼠标左键,并将鼠标拖到某个位置以创建裁剪边界。此时你不必担心精度,因为你可以在实际裁剪之前修改最终选区。 + +![Crop Selection][4] + +此时,将鼠标光标悬停在所选内容的四个角上会更改鼠标光标并高亮显示该区域。现在,你可以微调裁剪的选区。你可以单击并拖动任何边或角来移动部分选区。 + +选定完区域后,你只需按键盘上的回车键即可进行裁剪。 + +如果你想重新开始或者不裁剪,你可以按键盘上的 `Esc` 键。 + +#### 方法 2 + +裁剪图像的另一种方法是使用“矩形选择工具”进行选择:“工具 → 选择工具 → 选择矩形Tools → Selection Tools → Rectangle Select”。 + +![][5] + +然后,你可以使用与“裁剪工具”相同的方式高亮选区,并调整选区。选择好后,可以通过以下方式裁剪图像来适应选区:“图像 → 裁剪为选区Image → Crop to Selection”。 + +![][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/ diff --git a/published/202007/20200628 Linux Mint 20 is Officially Available Now- The Performance and Visual Improvements Make it an Exciting New Release.md b/published/202007/20200628 Linux Mint 20 is Officially Available Now- The Performance and Visual Improvements Make it an Exciting New Release.md new file mode 100644 index 0000000000..2ad86e500c --- /dev/null +++ b/published/202007/20200628 Linux Mint 20 is Officially Available Now- The Performance and Visual Improvements Make it an Exciting New Release.md @@ -0,0 +1,110 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12376-1.html) +[#]: subject: (Linux Mint 20 is Officially Available Now! The Performance and Visual Improvements Make it an Exciting New Release) +[#]: via: (https://itsfoss.com/linux-mint-20-download/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Linux Mint 20 正式发布了!你该升级吗? +====== + +![](https://img.linux.net.cn/data/attachment/album/202007/03/083110avnb4rwi0rwzh56r.jpg) + +Linux Mint 20 “Ulyana” 终于发布了,可以下载了。 + +Linux Mint 19 基于 Ubuntu 18.04 LTS,而 [Mint 20][1] 则基于 [Ubuntu 20.04 LTS][2] —— 所以你会发现很多不同的地方、改进的地方,可能更棒了。 + +既然它来了,让我们来看看它的新功能,在哪里下载它,以及如何升级你的系统。 + +### Linux Mint 20:有什么新东西? + +我们制作了一段关于 Linux Mint 20 的初步视觉印象的视频,让大家更好地了解。 + +- [video](https://youtu.be/7knHfN-NUZk) + +说到 Linux Mint 20 的发布,有很多事情要谈。虽然我们已经介绍了 Linux Mint 20 的新的关键[功能][1],但我还是在这里提几点,让大家一目了然。 + + * Nemo 文件管理器在生成缩略图方面的性能提升 + * 一些重新设计的颜色主题 + * Linux Mint 20 将禁止 APT 使用 Snapd + * 一个新的图形用户界面工具,用于通过本地网络共享文件 + * 改进对多显示器的支持 + * 改进对笔记本电脑的混合图形支持 + * 不再有 32 位版本 + +除了这些变化之外,你还会注意到 Cinnamon 4.6 桌面更新后的一些视觉变化。 + +以下是 Linux Mint 20 Cinnamon 版的一些截图。 + +![Mint 20 Welcome Screen][4] + +![Mint 20 Color Themes][5] + +![Mint 20 Nemo File Manager][6] + +![Mint 20 Nemo File Manager Blue Color Theme][7] + +![Mint 20 Wallpapers][8] + +![Mint 20 Redesigned Gdebi Installer][9] + +![Mint 20 Warpinator Tool for Sharing Files on Local Network][10] + +![Mint 20 Terminal][11] + +### 升级到 Linux Mint 20:你需要知道什么? + +如果你已经在使用 Linux Mint,你可以选择升级到 Linux Mint 20。 + + * 如果你使用的是 Linux Mint 20 测试版,你可以升级到 Mint 20 稳定版。 + * 如果你正在使用 Linux Mint 19.3(这是 Mint 19 的最新迭代),你可以将系统升级到 Linux Mint 20,而不需要进行重新安装 + * Linux Mint 20 没有 32 位版本。如果你**使用 32 位的 Mint 19 系列,你将无法升级到 Mint 20** + * 如果你使用的是 Linux Mint 18 系列,你必须先通过 Mint 19 系列升级。在我看来,重新安装 Mint 20 会比较省时省事 + * 如果你使用的是 Linux Mint 17、16、15 或更低版本,你一定不要再使用它们了。这些版本已经不支持了 + +我们有一个详细的指南,展示了从 18.3 到 19 [升级 Linux Mint 版本][12]的步骤。我猜测 Mint 20 的步骤应该也是一样的。我们的团队会对 Mint 19.3 到 Mint 20 的升级做一些测试,并在适用的情况下更新这个指南。 + +在你继续升级之前,请确保备份你的数据和[使用 Timeshift 创建系统快照][13]。 + +### 下载Linux Mint 20 + +你可以简单地前往其官方下载页面,为自己抓取最新的稳定 ISO。你会发现官方支持的桌面环境的 ISO,即 Cinnamon、MATE 和 Xfce。 + +此外,还为那些网络连接缓慢或不稳定的用户提供了 Torrent链接。 + +- [下载 Linux Mint 20][14] + +如果你只是想在不更换主系统的情况下试一试,我建议先[在 VirtualBox 中安装 Linux Mint 20][15],看看这是不是你喜欢的东西。 + +你试过 Linux Mint 20 了吗?你对这个版本有什么看法?请在下面的评论区告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-mint-20-download/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-12297-1.html +[2]: https://itsfoss.com/download-ubuntu-20-04/ +[3]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/mint-20-welcome-screen.png?fit=800%2C397&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/mint-20-color-themes.png?fit=800%2C396&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/mint-20-nemo-file-manager.png?fit=800%2C397&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/mint-20-nemo-file-manager-blue-color-theme.png?fit=800%2C450&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/mint-20-wallpapers.png?fit=800%2C450&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/mint-20-redesigned-gdebi-installer.png?fit=800%2C582&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/mint-20-warpinator.png?fit=800%2C397&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/mint-20-terminal.png?fit=800%2C540&ssl=1 +[12]: https://itsfoss.com/upgrade-linux-mint-version/ +[13]: https://itsfoss.com/backup-restore-linux-timeshift/ +[14]: https://linuxmint.com/download.php +[15]: https://itsfoss.com/install-linux-mint-in-virtualbox/ diff --git a/published/202007/20200628 entr- rerun your build when files change.md b/published/202007/20200628 entr- rerun your build when files change.md new file mode 100644 index 0000000000..6fd30b30d8 --- /dev/null +++ b/published/202007/20200628 entr- rerun your build when files change.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12403-1.html) +[#]: subject: (entr: rerun your build when files change) +[#]: via: (https://jvns.ca/blog/2020/06/28/entr/) +[#]: author: (Julia Evans https://jvns.ca/) + +entr:文件更改时重新运行构建 +====== + +![](https://img.linux.net.cn/data/attachment/album/202007/11/094223uct6386d9iwctmbh.jpg) + +这是一篇简短的文章。我是最近才发现 [entr][1] 的,我很惊奇从来没有人告诉过我?!因此,如果你和我一样,那么我告诉你它是什么。 + +[entr 的网站][1]上对它已经有很好的解释,也有很多示例。 + +总结在其头部:`entr` 是一个命令行工具,当每次更改一组指定文件中的任何一个时,都能运行一个任意命令。你在标准输入给它传递要监控的文件列表,如下所示: + +``` +git ls-files | entr bash my-build-script.sh +``` + +或者 + +``` +find . -name *.rs | entr cargo test +``` + +或者任何你希望的。 + +### 快速反馈很棒 + +就像世界上的每个程序员一样,我发现每次更改代码时都必须手动重新运行构建/测试非常烦人。 + +许多工具(例如 hugo 和 flask)都有一个内置的系统,可以在更改文件时自动重建,这很棒! + +但是通常我会自己编写一些自定义的构建过程(例如 `bash build.sh`),而 `entr` 让我有了一种神奇的构建经验,我只用一行 bash 就能得到即时反馈,知道我的改变是否修复了那个奇怪的 bug。万岁! + +### 重启服务器(entr -r) + +但是如果你正在运行服务器,并且每次都需要重新启动服务器怎么办?如果你传递 `-r`,那么 `entr` 会帮你的 + +``` +git ls-files | entr -r python my-server.py +``` + +### 清除屏幕(entr -c) + +另一个简洁的标志是 `-c`,它让你可以在重新运行命令之前清除屏幕,以免被前面构建的输出分散注意力。 + +### 与 git ls-files 一起使用 + +通常,我要跟踪的文件集和我在 git 中的文件列表大致相同,因此将 `git ls-files` 传递给 `entr` 是很自然的事情。 + +我现在有一个项目,有时候我刚创建的文件还没有在 git 里。那么如果你想包含未被跟踪的文件怎么办呢?这些 `git` 命令行参数就可以做到(我是从一个读者的邮件中得到的,谢谢你!): + +``` +git ls-files -cdmo --exclude-standard | entr your-build-script +``` + +有人给我发了邮件,说他们做了一个 `git-entr` 命令,可以执行: + +``` +git ls-files -cdmo --exclude-standard | entr -d "$@" +``` + +我觉得这真是一个很棒的主意。 + +### 每次添加新文件时重启:entr -d + +`git ls-files` 的另一个问题是有时候我添加一个新文件,当然它还没有在 git 中。`entr` 为此提供了一个很好的功能。如果你传递 `-d`,那么如果你在 `entr` 跟踪的任何目录中添加新文件,它就会退出。 + +我将它与一个 `while` 循环配合使用,它将重启 `entr` 来包括新文件,如下所示: + +``` +while true +do +{ git ls-files; git ls-files . --exclude-standard --others; } | entr -d your-build-scriot +done +``` + +### entr 在 Linux 上的工作方式:inotify + +在 Linux 中,`entr` 使用 `inotify`(用于跟踪文件更改这样的文件系统事件的系统)工作。如果用 `strace` 跟踪它,那么你会看到每个监控文件的 `inotify_add_watch` 系统调用,如下所示: + +``` +inotify_add_watch(3, "static/stylesheets/screen.css", IN_ATTRIB|IN_CLOSE_WRITE|IN_CREATE|IN_DELETE_SELF|IN_MOVE_SELF) = 1152 +``` + +### 就这样了 + +我希望这可以帮助一些人了解 `entr`! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/06/28/entr/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: http://eradman.com/entrproject/ diff --git a/published/202007/20200630 Painless file extraction on Linux.md b/published/202007/20200630 Painless file extraction on Linux.md new file mode 100644 index 0000000000..4cd4d39c8c --- /dev/null +++ b/published/202007/20200630 Painless file extraction on Linux.md @@ -0,0 +1,141 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12410-1.html) +[#]: subject: (Painless file extraction on Linux) +[#]: via: (https://www.networkworld.com/article/3564265/painless-file-extraction-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +Linux 上无痛文件提取 +====== + +![](https://img.linux.net.cn/data/attachment/album/202007/12/233401zickd110d2dl6u6f.jpg) + +从 Linux 系统的存档中提取文件没有拔牙那么痛苦,但有时看起来更复杂。在这篇文章中,我们将看看如何轻松地从 Linux 系统中可能遇到的几乎所有类型的存档中提取文件。 + +它们有很多格式,从 .gz 到 .tbz2,这些文件的命名方式都各有一些不同。当然,你可以记住所有从存档中提取文件的各种命令以及它们的选项,但是你也可以将所有经验保存到脚本中,而不再担心细节。 + +在本文中,我们将一系列提取命令组合成一个脚本,它会调用适当的命令根据文档名提取文件的内容。该脚本首先以一些命令来验证是否已经提供了一个文件名作为参数,或要求运行脚本的人提供文件名。 + +``` +#!/bin/bash + +if [ $# -eq 0 ]; then + echo -n "filename> " + read filename +else + filename=$1 +fi + +if [ ! -f "$filename" ]; then + echo "No such file: $filename" + exit $? +fi +``` + +了解了么?如果未提供任何参数,脚本将提示输入文件名,如果存在则使用它。然后,它验证文件是否实际存在。如果不是,那么脚本退出。 + +下一步是使用 bash 的 `case` 语句根据存档文件的名称调用适当的提取命令。对于其中某些文件类型(例如 .bz2),也可以使用除 `tar` 之外的其它命令,但是对于每种文件命名约定,我们仅包含一个提取命令。因此,这是带有各种存档文件名的 `case` 语句: + +``` + case $filename in + *.tar) tar xf $filename;; + *.tar.bz2) tar xjf $filename;; + *.tbz) tar xjf $filename;; + *.tbz2) tar xjf $filename;; + *.tgz) tar xzf $filename;; + *.tar.gz) tar xzf $filename;; + *.gz) gunzip $filename;; + *.bz2) bunzip2 $filename;; + *.zip) unzip $filename;; + *.Z) uncompress $filename;; + *) echo "No extract option for $filename" +esac +``` + +如果提供给脚本的文件扩展名与脚本已知的扩展名都不匹配,那么会发出 “No extract option for $filename” 的消息。如果缺少你使用的任何存档类型,只需将它们与所需的提取命令一起添加即可。 + +将 bash 头添加到脚本顶部,使其可执行,然后就可以开始了。 + +``` +#!/bin/bash + +if [ $# -eq 0 ]; then + echo -n "filename> " + read filename +else + filename=$1 +fi + +if [ ! -f "$filename" ]; then + echo "No such file: $filename" + exit $? +fi + +case $filename in + *.tar) tar xf $filename;; + *.tar.bz2) tar xjf $filename;; + *.tbz) tar xjf $filename;; + *.tbz2) tar xjf $filename;; + *.tgz) tar xzf $filename;; + *.tar.gz) tar xzf $filename;; + *.gz) gunzip $filename;; + *.bz2) bunzip2 $filename;; + *.zip) unzip $filename;; + *.Z) uncompress $filename;; + *.rar) rar x $filename ;; + *) +``` + +如果你希望脚本在提取文件时显示内容,请将详细选项(`-v`)添加到每个命令参数字符串中: + +``` +#!/bin/bash + +if [ $# -eq 0 ]; then + echo -n "filename> " + read filename +else + filename=$1 +fi + +if [ ! -f "$filename" ]; then + echo "No such file: $filename" + exit $? +fi + +case $filename in + *.tar) tar xvf $filename;; + *.tar.bz2) tar xvjf $filename;; + *.tbz) tar xvjf $filename;; + *.tbz2) tar xvjf $filename;; + *.tgz) tar xvzf $filename;; + *.tar.gz) tar xvzf $filename;; + *.gz) gunzip -v $filename;; + *.bz2) bunzip2 -v $filename;; + *.zip) unzip -v $filename;; + *.Z) uncompress -v $filename;; + *) echo "No extract option for $filename" +esac +``` + +### 总结 + +虽然可以为每个可能用到的提取命令创建别名,但是让脚本为遇到的每种文件类型提供命令要比自己停下来编写每个命令和选项容易。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3564265/painless-file-extraction-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://www.facebook.com/NetworkWorld/ +[2]: https://www.linkedin.com/company/network-world diff --git a/published/202007/20200630 Read and write data from anywhere with redirection in the Linux terminal.md b/published/202007/20200630 Read and write data from anywhere with redirection in the Linux terminal.md new file mode 100644 index 0000000000..b55f7d8875 --- /dev/null +++ b/published/202007/20200630 Read and write data from anywhere with redirection in the Linux terminal.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: (nophDog) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12385-1.html) +[#]: subject: (Read and write data from anywhere with redirection in the Linux terminal) +[#]: via: (https://opensource.com/article/20/6/redirection-bash) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +通过重定向在 Linux 终端任意读写数据 +====== + +> 重定向是一种十分高效的数据流动方式,它能帮你减少很多鼠标和键盘上的操作。 + +![](https://img.linux.net.cn/data/attachment/album/202007/06/005419nh6mzxkmmmbsslbb.jpg) + +对于任何编程或脚本语言,输入与输出重定向都是很自然的功能。严格来说,当你使用电脑时,数据自然而然地在发生着重定向。从 `stdin`(标准输入,通常是你的键盘或者鼠标)读取输入,输入则发往 `stdout`(标准输出,一段文本或者数据流),最后错误信息送至 `stderr`。如果你使用 [Bash][2] 或 [Zsh][3] 之类的 shell,那么理解这些数据流能够让你更好地控制信息流向。 + +标准输入、标准输出以及标准错误输出都存在于 Linux 文件系统中。你可以在 `/dev` 查看: + +``` +$ ls /dev/std* +/dev/stderr@  /dev/stdin@  /dev/stdout@ +``` + +你可能没法直接使用它们,但将它们想象成你能传递数据的元位置,会很有帮助。 + +重定向的基础很简单:用一些 `>` 符号重定向输出,然后用另外一些 `<` 符号重定向输入。 + +### 重定向输出 + +将 [ls][4] 命令的输出写入一个文件: + +``` +$ ls > list.txt +``` + +你没法像平常那样看到 `ls` 的输出,因为它们并没有被发送到屏幕,而是被写入 `list.txt` 文件了,这个功能用处太多了,事实上,你甚至可以用它来将文件内容拷贝到另一个文件。不一定是文本文件,你也可以用将重定向用于二进制数据: + +``` +$ cat image.png > picture.png +``` + +(你可能会好奇为什么要这样做,有时候对于 [文件权限信息][5] 而间接有用。) + +### 重定向输入 + +你也能将输入重定向“到”一个命令。可以说,它没有重定向输出那么有用,因为许多命令已经被硬编码,只从你的参数中接收输入。但是,如果某个命令需要一系列参数,而且你把这些参数写在文件里,想要快速“复制粘贴”到终端的时候(除非你并不想复制粘贴),它就帮得上忙了。 + +``` +$ sudo dnf install $(嵌入文档here-document(简写成 here-doc)和嵌入字符串here-string 技巧。这种输入方法将一整块文本重定向至标准输入流,直到碰见一个特殊的文件结束标记(许多人习惯用 `EOF`,实际上你可以使用任何字符串,只要它是唯一的)。试着把这些(在第二个 `EOF` 标记之前)敲进你的终端: + +``` +$ echo << EOF +> foo +> bar +> baz +> EOF +``` + +输出结果: + +``` +foo +bar +baz +``` + +使用 [Bash][2] 编写脚本的人常常用这个技巧,将数行文本一次性写入文件或者打印到屏幕上。只要你别忘了末尾的文件结束标记,这会是一个帮你避免大量繁琐 `echo` 或 `printf` 语句的好办法。 + +嵌入字符串类似于嵌入文档,但是它只含有一个字符串(或者用引号包裹的几个字符串,同样会被当成一个字符串) + +``` +$ cat <<< "foo bar baz" +foo bar baz +``` + +### 重定向错误信息 + +错误信息流叫做 `stderr`,通过 `2>` 实现这个目的。下面这个命令把错误信息定向到 `output.log` 文件: + +``` +$ ls /nope 2> output.log +``` + +### 将数据送往 /dev/null + +既然标准输入、标准输出和错误输出都有自己的位置,那么“空空如也”也应该在 Linux 文件系统占有一席之地。没错,它叫做 `null`,位于 `/dev`,频繁使用的人懒得说 “slash dev slash null”,于是索性叫它 “devnull”。 + +通过重定向,你可以把数据发送到 `/dev/null`。比如,`find` 命令常常会输出很多具体信息,而且在搜索文件遇到权限冲突时,会事无巨细地报告: + +``` +$ find ~ -type f +/home/seth/actual.file +find: `/home/seth/foggy': Permission denied +find: `/home/seth/groggy': Permission denied +find: `/home/seth/soggy': Permission denied +/home/seth/zzz.file +``` + +`find` 命令把那些当作错误,所以你可以只把错误信息重定向至 `/dev/null`: + + +``` +$ find ~ -type f 2>; /dev/null +/home/seth/actual.file +/home/seth/zzz.file +``` + +### 使用重定向 + +在 Bash 中,重定向是转移数据的有效方法。你可能不会频繁使用重定向,但是学会如何使用它,能帮你在打开文件、复制粘贴数据这类需要移动鼠标、大量按键操作上,节省很多不必要的时间。不要做如此浪费时间的事情。使用重定向,好好享受生活。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/redirection-bash + +作者:[Seth Kenlon][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://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop.png?itok=pGfEfu2S (Hands programming) +[2]: https://opensource.com/resources/what-bash +[3]: https://opensource.com/article/19/9/getting-started-zsh +[4]: https://opensource.com/article/19/7/master-ls-command +[5]: https://opensource.com/article/19/8/linux-permissions-101 diff --git a/published/202007/20200701 13 Things To Do After Installing Linux Mint 20.md b/published/202007/20200701 13 Things To Do After Installing Linux Mint 20.md new file mode 100644 index 0000000000..eda69868ad --- /dev/null +++ b/published/202007/20200701 13 Things To Do After Installing Linux Mint 20.md @@ -0,0 +1,215 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12404-1.html) +[#]: subject: (13 Things To Do After Installing Linux Mint 20) +[#]: via: (https://itsfoss.com/things-to-do-after-installing-linux-mint-20/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +安装 Linux Mint 20 后需要做的 13 件事 +====== + +![](https://img.linux.net.cn/data/attachment/album/202007/11/113643ich99s7y7kw7ckw9.jpg) + +Linux Mint 毫无疑问是 [最佳 Linux 发行版][1] 之一,特别是考虑到 [Linux Mint 20][2] 的功能,我确信你也会同意这一说法。 + +假设你错过了我们的新闻报道,[Linux Mint 20 终于可以下载了][3]。 + +当然,如果你使用 Linux Mint 有一段时间了,你可能知道最好做一些什么。但是,对于新用户来说,在安装 Linux Mint 20 后,你需要做一些事,让你的体验更比以往任何时候都好。 + +### 在安装 Linux Mint 20 后建议做的事 + +在这篇文章中,我将列出其中一些要做的事来帮助你改善 Linux Mint 20 的用户体验。 + +#### 1、执行一次系统更新 + +![][4] + +安装后首先应该马上检查的是 —— 使用更新管理器进行系统更新,如上图所示。 + +为什么?因为你需要构建可用软件的本地缓存。更新所有软件包的更新也是一个好主意。 + +如果你喜欢使用终端,只需输入下面的命令来执行系统更新: + +``` +sudo apt update && sudo apt upgrade -y +``` + +#### 2、使用 Timeshift 来创建系统快照 + +![][5] + +如果你想在意外更改或错误更新后快速地恢复系统状态,有一个系统快照总是很有用的。 + +因此,如果你希望能够随时备份你的系统状态,那么使用 Timeshift 配置和创建系统快照是超级重要的。 + +如果你还不知道如何使用它的话,你可以遵循我们 [使用 Timeshift][6] 的详细指南。 + +#### 3、安装有用的软件 + +尽管在 Linux Mint 20 中已经安装有一些有用的预安装应用程序,你可能需要安装一些没有随之一起出炉的必不可少的应用程序。 + +你可以简单地使用软件包管理器或 synaptic 软件包管理器来查找和安装所需要的软件。 + +对于初学者来说,如果你想探索各种各样的工具,那么你可以遵循我们的 [必不可少的 Linux 应用程序][7] 的列表。 + +也参见: + +- [75 个最常用的 Linux 应用程序(2018 年)](https://linux.cn/article-10099-1.html) +- 100 个最佳 Ubuntu 应用([上](https://linux.cn/article-11044-1.html)、[中](https://linux.cn/article-11048-1.html)、[下](https://linux.cn/article-11057-1.html)) + +这里是一个我最喜欢的软件包列表,我希望你也来尝试一下: + + * [VLC 多媒体播放器][8] 用于视频播放 + * [FreeFileSync][9] 用来同步文件 + * [Flameshot][10] 用于截图 + * [Stacer][11] 用来优化和监控系统 + * [ActivityWatch][12] 用来跟踪你的屏幕时间并保持高效唤醒 + +#### 4、自定义主题和图标 + +![][13] + +当然,这在技术上不是必不可少的事,除非你想更改 Linux Mint 20 的外观和感觉。 + +但是,[在 Linux Mint 中更改主题和图标是非常容易的][14] ,而不需要安装任何额外的东西。 + +你会在欢迎屏幕中获得优化外观的选项。或者,你只需要进入 “主题”,并开始自定义主题。 + +![][15] + +为此,你可以搜索它或在系统设置中如上图所示找到它。 + +根据你正在使用的桌面环境,你也可以看看可用的 [最佳图标主题][16]。 + +#### 5、启用 Redshift 来保护你的眼睛 + +![][17] + +你可以在 Linux Mint 上搜索 “[Redshift][18]”,并启用它以在晚上保护你的眼睛。如你在上面的截图所见,它将根据时间自动地调整屏幕的色温。 + +你可能想启用自动启动选项,以便它在你重新启动计算机时自动启动。它可能与 [Ubuntu 20.04 LTS][19] 的夜光功能不太一样,但是如果你不需要自定义时间表或微调色温的能力,那么它就足够好了。 + +#### 6、启用 snap(如果需要的话) + +尽管 Ubuntu 比前所未有的更倾向于推崇使用 Snap,但是 Linux Mint 团队却反对使用它。因此,它禁止 APT 使用 snapd。 + +因此,你将无法获得 snap 开箱即用的支持。然而,你迟早会意识到一些软件包只以 Snap 的格式打包。在这种情况下,你将不得不在 Mint 上启用对 snap 的支持。 + +``` +sudo apt install snapd +``` + +在你完成后,你可以遵循我们的指南来了解更多关于 [在 Linux 上安装和使用 snap][20] 的信息。 + +#### 7、学习使用 Flatpak + +默认情况下,Linux Mint 带有对 Flatpak 的支持。所以,不管你是讨厌使用 snap 或只是更喜欢使用 Flatpak,在系统中保留它是个好主意。 + +现在,你只需要遵循我们关于 [在 Linux 上使用 Flatpak][21] 的指南来开始吧! + +#### 8、清理或优化你的系统 + +优化或清理系统总是好的,以避免不必要的垃圾文件占用存储空间。 + +你可以通过在终端机上输入以下内容,快速删除系统中不需要的软件包: + +``` +sudo apt autoremove +``` + +除此之外,你也可以遵循我们 [在 Linux Mint 上释放空间的一些建议][22] 。 + +#### 9、使用 Warpinator 通过网络发送/接收文件 + +Warpinator 是 Linux Mint 20 的一个新功能,可以让你在连接到网络的多台电脑上共享文件。这里是它看起来的样子: + +![][23] + +你只需要在菜单中搜索它就可以开始了! + +#### 10、使用驱动程序管理器 + +![驱动器管理器][24] + +如果你正在使用需要驱动程序的 Wi-Fi 设备、NVIDIA 显卡或 AMD 显卡,以及其它设备(如果适用的话)时,驱动程序管理器是一个重要的部分。 + +你只需要找到驱动程序管理器并启用它。它应该可以检测到正在使用的任何专有驱动程序,或者你也可以使用驱动程序管理器来利用 DVD 来安装驱动程序。 + +#### 11、设置防火墙 + +![][25] + +在大多数情况下,你可能已经保护了你的家庭网络。但是,如果你想在 Linux Mint 上有一些特殊的防火墙设置,你可以通过在菜单中搜索 “Firewall” 来实现。 + +正如你在上述截图中所看到的,你可以为家庭、企业和公共设置不同的配置文件。你只需要添加规则,并定义什么是允许访问互联网的,什么是不允许的。 + +你可以阅读我们关于 [使用 UFW 配置防火墙][26] 的详细指南。 + +#### 12、学习管理启动应用程序 + +如果你是一个有经验的用户,你可能已经知道这一点了。但是,新用户经常忘记管理他们的启动应用程序,最终影响了系统启动时间。 + +你只需要从菜单中搜索 “Startup Applications” ,你可以启动它来查找像这样的东西: + +![][27] + +你可以简单地切换你想要禁用的那些启动应用程序,添加一个延迟计时器,或从启动应用程序的列表中完全地移除它。 + +#### 13、安装必不可少的游戏应用程序 + +当然,如果你对游戏感兴趣,你可能想去阅读我们关于 [在 Linux 上的游戏][28] 的文章来探索所有的选择。 + +但是,对于初学者来说,你可以尝试安装 [GameHub][29]、[Steam][30] 和 [Lutris][31] 来玩一些游戏。 + +### 总结 + +就是这样,各位!在大多数情况下,如果你在安装 Linux Mint 20 后按照上面的要点进行操作,使其发挥出最好的效果,应该就可以了。 + +我确信你还能够做更多的事。我想知道你喜欢在安装 Linux Mint 20 后马上做了什么。在下面的评论中告诉我你的想法吧! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/things-to-do-after-installing-linux-mint-20/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-linux-distributions/ +[2]: https://linux.cn/article-12297-1.html +[3]: https://linux.cn/article-12376-1.html +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-mint-20-system-update.png?ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/snapshot-linux-mint-timeshift.jpeg?ssl=1 +[6]: https://linux.cn/article-11619-1.html +[7]: https://linux.cn/article-10165-1.html +[8]: https://www.videolan.org/vlc/ +[9]: https://itsfoss.com/freefilesync/ +[10]: https://itsfoss.com/flameshot/ +[11]: https://itsfoss.com/optimize-ubuntu-stacer/ +[12]: https://itsfoss.com/activitywatch/ +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-mint-20-theme.png?ssl=1 +[14]: https://itsfoss.com/install-icon-linux-mint/ +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-mint-20-system-settings.png?ssl=1 +[16]: https://itsfoss.com/best-icon-themes-ubuntu-16-04/ +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-mint-20-redshift-1.png?ssl=1 +[18]: https://itsfoss.com/install-redshift-linux-mint/ +[19]: https://itsfoss.com/ubuntu-20-04-release-features/ +[20]: https://itsfoss.com/install-snap-linux/ +[21]: https://itsfoss.com/flatpak-guide/ +[22]: https://itsfoss.com/free-up-space-ubuntu-linux/ +[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/mint-20-warpinator-1.png?ssl=1 +[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2013/12/Additional-Driver-Linux-Mint-16.png?ssl=1 +[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-mint-20-firewall.png?ssl=1 +[26]: https://itsfoss.com/set-up-firewall-gufw/ +[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/linux-mint-20-startup-applications.png?ssl=1 +[28]: https://itsfoss.com/linux-gaming-guide/ +[29]: https://itsfoss.com/gamehub/ +[30]: https://store.steampowered.com +[31]: https://lutris.net diff --git a/published/202007/20200701 Back up your phone-s storage with this Linux utility.md b/published/202007/20200701 Back up your phone-s storage with this Linux utility.md new file mode 100644 index 0000000000..c7c9c67789 --- /dev/null +++ b/published/202007/20200701 Back up your phone-s storage with this Linux utility.md @@ -0,0 +1,214 @@ +[#]: collector: (lujun9972) +[#]: translator: (summer2233) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12415-1.html) +[#]: subject: (Back up your phone's storage with this Linux utility) +[#]: via: (https://opensource.com/article/20/7/gphoto2-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 Linux 实用程序 gPhoto2 备份手机存储 +====== + +> 尽情地拍照吧,gphoto2 能够方便、快速地将照片从你的设备传输到 Linux 计算机上。 + +![](https://img.linux.net.cn/data/attachment/album/202007/14/170729pzljppapojy44ro4.jpg) + +移动设备的最大缺点之一就是其将数据从设备传输到计算机很困难。移动设备在这一缺点上有着悠久的历史。早期的移动设备,如 Pilot 和掌上电脑 PDA 设备,需要使用特殊的同步软件来传输数据(你必须小心翼翼地做这件事,因为你的设备可能会因为电池耗尽而导致数据永久丢失);旧版 iPod 只提供特定平台的界面。现代移动设备默认将你的数据发送到在线帐户,以便你可以在计算机上再次下载。 + +好消息——如果你正在运行 Linux,你可以使用 `gphoto2` 命令与移动设备进行连接。`gphoto2` 最初是作为一种与数码相机通信的方式而开发的,那时的数码相机只有传统的相机功能,现在的 `gphoto2` 可以和许多不同种类的移动设备通讯。别让这个名字骗了你,它可以处理所有类型的文件,而不仅仅是照片。更棒的是,它可以编写脚本、很灵活、并且比大多数 GUI 界面功能强大得多。 + +如果你曾经为在计算机和移动设备之间同步数据而苦恼,请了解一下 `gphoto2`。 + +### 安装 gPhoto2 + +很可能你的 Linux 系统已经安装了 libgphoto2,因为它是与移动设备连接的一个关键库,但你可能还需要安装命令 `gphoto2`,该命令可能在你的存储库中。 + +在 Fedora 或 RHEL 上: + +``` +$ sudo dnf install gphoto2 +``` + +在 Debian 或 Ubuntu 上: + +``` +$ sudo apt install gphoto2 +``` + +### 验证兼容性 + +若要确认你的移动设备是否受支持,请使用 `--list-cameras`,通过管道传输到 `less`: + +``` +$ gPhoto2 --list-cameras | less +``` + +或者你可以通过管道把它传送到 `grep` 来搜索一个词。例如,如果你有三星 Galaxy,则使用 `grep`,并通过选项 `-i` 关闭区分大小写: + +``` +$ gphoto2 --list-cameras | grep -i galaxy +  "Samsung Galaxy models (MTP)" +  "Samsung Galaxy models (MTP+ADB)" +  "Samsung Galaxy models Kies mode" +``` + +这证实了三星 Galaxy 设备支持通过 MTP 连接和通过 ADB 连接 MTP。 + +如果你没有在列表中找到自己的移动设备,你仍然可以尝试使用 `gphoto2`,可能你的设备在列表中使用了不同的称呼。 + +### 查找移动设备 + +要使用 gPhoto2,首先必须将移动设备插入计算机,设置为 MTP 模式,并且授予计算机与它交互的权限。这通常需要在你的移动设备上操作,往往是在屏幕上按下一个按钮,以允许其文件系统被刚刚连接的计算机访问。 + +![Screenshot of allow access message][2] + +如果你不授权电脑访问移动设备,那么 gPhoto2 可以检测到你的移动设备,但它不能与之交互。 + +要确保计算机检测到你连接的移动设备,请使用 `--auto-detect` 选项: + +``` +$ gphoto2 --auto-detect +Model                       Port +--------------------------------------- +Samsung Galaxy models (MTP) usb:002,010 +``` + +如果你的移动设备没有被检测到,请先检查数据线,然后检查你的设备是否配置为通过 MTP、ADB 或其它 gPhoto2 支持的协议连接,如 `--list-cameras` 所示。 + +### 查询你的设备支持的特性 + +对于现代设备,通常有过多的潜在功能,但并非所有移动设备都支持这些功能。你可以用 `--abilities` 选项来确定自己的移动设备支持哪些功能。我觉得结果看起来直观。 + +``` +$ gphoto2 --abilities +Abilities for camera            : Samsung Galaxy models (MTP) +Serial port support             : no +USB support                     : yes +Capture choices                 : Capture not supported by driver +Configuration support           : no +Delete selected files on camera : yes +Delete all files on camera      : no +File preview (thumbnail) support: no +File upload support             : yes +``` + +如果只连接一个设备,那么不需要指定查询的设备。但是,如果连接了多个 gPhoto2 可以与之交互的设备,则可以通过端口、相机型号或 usbid 指定设备。 + +### 与你的移动设备交互 + +如果你的设备支持拍摄功能,则可以从计算机调用你的摄像头来获取媒体。例如,要拍摄照片: + +``` +$ gphoto2 --capture-image +``` + +要拍摄照片并立即将其传输到连接的计算机: + +``` +$ gphoto2 --capture-image-and-download +``` + +你也可以录制视频和声音。如果连接了多个拍摄设备,可以按端口、相机型号或 usbid 指定要使用的设备: + +``` +$ gphoto2 --camera "Samsung Galaxy models (MTP)" \ +--capture-image-and-download +``` + +### 文件和文件夹 + +要想更加智能地管理移动设备上的文件,你需要了解 gPhoto2 连接的文件系统的结构。 + +你可以使用 `--get-folders` 选项查看可用文件夹: + +``` +$ gphoto2 --list-folders +There are 2 folders in folder '/'.                                             + - store_00010001 + - store_00020002 +There are 0 folders in folder '/store_00010001'. +There are 0 folders in folder '/store_00020002'. +``` + +每个文件夹代表设备上的一个存储单元。在本例中,`store_00010001` 是内部存储器,`store_00020002` 是 SD 卡,这可能与你的设备的结构不同。 + +### 获取文件 + +现在你知道了设备的文件夹布局,就可以从设备获取照片了。你可以使用许多不同的选项,具体取决于你想从设备中获取什么。 + +如果你知道绝对路径,则可以获取指定的文件: + +``` +$ gphoto2 --get-file IMG_0001.jpg --folder /store_00010001/myphotos +``` + +你可以同时获得所有的文件: + +``` +$ gphoto2 --get-all-files --folder /store_00010001/myfiles +``` + +你可以只获取音频文件: + +``` +gphoto2 --get-all-audio-data --folder /store_00010001/mysounds +``` + +gPhoto2 还有其他的选择,其中大多数取决于你连接的设备和使用协议是否支持。 + +### 上传文件 + +现在你知道了潜在的目标文件夹,就可以将文件从计算机上传到你的设备。例如,假设有一个名为 `example.epub` 的文件在当前目录中,你可以使用 `--upload-file` 选项和 `--folder` 选项将文件发送到设备并指定要上传到的目录: + +``` +$ gphoto2 --upload file example.epub \ +--folder store_00010001 +``` + +如果你希望将多个文件上传到同一个位置,你可以在设备上创建一个目录: + + +``` +$ gphoto2 --mkdir books \ +--folder store_00010001 +$ gphoto2 --upload-file *.epub \ +--folder store_00010001/books +``` + +### 列出文件 + +若要查看设备上的文件,请使用 `--list-files` 选项: + +``` +$ gphoto2 --list-files --folder /store_00010001 +There is 1 file in folder '/store_00010001' +#1     example.epub 17713 KB application/x-unknown +$ gphoto2 --list-files --folder /store_00010001/books +There is 1 file in folder '/store_00010001' +#1    example0.epub 17713 KB application/x-unknown +#2    example1.epub 12264 KB application/x-unknown +[...] +``` + +### 探索你的使用方式 + +gPhoto2 的大部分功能取决于你的设备,因此不同用户的体验可能不尽相同。在 `gphoto2 --help` 中列出了许多操作供你探索。使用gPhoto2,再也不用费劲把文件从你的设备传输到电脑上了! + +这些开源图片库能够帮助你组织文件,并让的图片看起来很棒。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/gphoto2-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[summer2233](https://github.com/summer2233) +校对:[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/idea_innovation_mobile_phone.png?itok=RqVtvxkd (A person looking at a phone) +[2]: https://opensource.com/sites/default/files/uploads/gphoto2-mtp-allow.jpg (Screenshot of allow access message) diff --git a/published/202007/20200701 Customizing Bash.md b/published/202007/20200701 Customizing Bash.md new file mode 100644 index 0000000000..547ae50180 --- /dev/null +++ b/published/202007/20200701 Customizing Bash.md @@ -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 (图形用户界面Graphical User Interface)跟 CLI(命令行界面Command-Line Interface),它们用来区分图形和基于字符的 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 可以运行的模式包括:登录login非登录non-login远程remote、POSIX、Unix sh、受限restricted,以及使用与用户不同的 UID/GID 模式。各种模式是可以相互组合的。比如,交互式 + 受限 + POSIX 或者非交互式 + 非登录 + 远程。不同的启动模式,决定着 Bash 所读取的启动文件。理解这些操作模式,有助于帮助我们修改启动文件。 + +根据 Bash 参考手册,它会: + +> 1. 从文件中...、从作为 `-c` 调用选项传入参数的字符...,或者从用户的终端中读取输入。 +> 2. 将输入分解成单词和操作符,遵循 [它的] 引用规则。...这些标记使用元字符隔开。这一步执行别名展开。 +> 3. 将标记解析成简单与复合命令。 +> 4. 执行各种 shell 展开...,将展开之后的标记分解成文件名...以及命令和参数的列表。 +> 5. 执行必要的重定向...并从参数列表中去除重定向操作符及其操作数。 +> 6. 执行命令。 +> 7. 必要时等待命令完成,并收集退出状态。 +> +> **Bash 参考文档** +> **第五版,Bash 版本 5.0** +> **2019 年 5 月** + +当用户开启终端模拟器进入命令行环境时,便启动了一次交互式 shell 会话。GNOME 终端默认以非登录模式为用户打开 Shell。你可以在 “编辑 → 首选项 → 配置文件 → 命令Edit → Preferences → Profilles → Command” 中配置 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` 会援引source `/etc/bashrc` 文件,读取并执行其中的命令,然后查找并读取执行 `/etc/profile.d` 目录中以 `.sh` 结尾的文件。同样的,`~/.bash_profile` 通常也会援引source `~/.bashrc` 文件。`/etc/bashrc` 和 `~/.bashrc` 都会进行检查,避免重复援引source。 + +(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 版本的特性,因为在网上找到的信息有时可能太老(过时了)或太新(你的系统还没有安装)。 + +- +- (在该网站中,你必须要输入一个有效的电子邮箱地址,或者注册,才能下载。) +- + +对本文有各种形式(点文件示例、提示,以及脚本文件)贡献的社区成员: + + * Micah Abbott – 首席质量工程师 + * John Lebon – 首席软件工程师 + * Dusty Mabe – 首席软件工程师 + * Colin Walters – 高级首席软件工程师 + +示例点文件和脚本可以在这个存储库中找到: + +- + +请仔细检查上面所提供的存储库中的信息。有些可能已经过时了。里面还包含很多开发中的自定义脚本和宠物容器pet container配置例子,那些不是点文件。我推荐从 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 diff --git a/published/202007/20200701 How to install Java on a Mac.md b/published/202007/20200701 How to install Java on a Mac.md new file mode 100644 index 0000000000..0e59880994 --- /dev/null +++ b/published/202007/20200701 How to install Java on a Mac.md @@ -0,0 +1,193 @@ +[#]: collector: (lujun9972) +[#]: translator: (Yufei-Yan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12393-1.html) +[#]: subject: (How to install Java on a Mac) +[#]: via: (https://opensource.com/article/20/7/install-java-mac) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) + +如何在 Mac 上安装 Java +====== + +> macOS 用户可以运行 Java 的开源版本,以及用于云原生cloud native开发的新框架。 + +![](https://img.linux.net.cn/data/attachment/album/202007/08/123211djuaz9io7l9dlpd7.jpg) + +五月底,Java 庆祝了它的 25 周年纪念日,为了纪念这一时刻,世界各地的开发人员使用 [#MovedByJava][3] 这一标签分享他们使用这一编程语言的成就、记忆以及愿景。 + +> 我的时间线: +> +> * 1999 开始学习 Java +> * 2007 创建 [@grailsframework][4] +> * 2008 共同创建 G20ne +> * 2009 被 SpringSource 收购 +> * 2015 加入 [@ObjectComputing][5] +> * 2018 创建 [@micronautfw][6] / 获得 [@groundbreakers][7] 奖 +> * 2019 成为 [@Java_Champions][8] +> +> 感谢你 [@java][9]![#MovedByJava][10] +> +> — Graeme Rocher (@graemerocher) [2020年5月21日][11] + +多年来,许多技术和趋势都促进了 Java 堆栈的开发、部署和在标准应用程序服务器上运行多个应用的能力。为 [Kubernetes][12] 构建容器镜像使得 Java 开发者可以在多个云环境中打包和部署[微服务][13]microservices,而不是在虚拟机上运行几个应用程序服务器。 + +![Timeline of technology contributions to Java][14] + +有了这些技术,Java 应用程序栈被优化为运行更大的堆和可以在运行时做出决策的高动态框架。然而不幸的是,这些努力还不足以使 Java 成为开发人员为无服务器serverless和事件驱动平台开发云原生cloud native Java 应用程序的首选编程语言。其他语言填补了这部分空缺,特别是 JavaScript、Python 和 Go,而 Rust 和 WebAssembly 也成了新的选择。 + +尽管存在这种竞争,[云原生 Java][16]cloud native Java 正在对以云为中心的软件开发产生影响。好在,新的 Java 框架(比如,[Quarkus][17]、[Micronaut][18] 和 [Helidon][19])最近已经战胜了这些挑战,它们提供了编译速度更快而且更小的应用,同时它们在设计之初就将分布式系统考虑了进去。 + +### 如何在 macOS 上安装 Java + +Java 开发的未来将从更多人安装和使用 Java 开始。因此,我将介绍如何在 macOS 上安装并开始使用 Java 开发环境。(如果你运行的是 Linux,请查看 Seth Kenlon 的文章《[如何在 Linux 上安装 Java][20]》) + +#### 通过 Brew 仓库安装 OpenJDK + +Homebrew 是 macOS 事实上的标准软件包管理器。如果你还没有安装的话,Matthew Broberg 的文章《[Homebrew 简介][21]》将带你完成这些步骤。 + +当你在 Mac 上安装好 Homebrew 后,使用 `brew` 命令安装 [OpenJDK][22],这是编写 Java 应用程序的开源方式: + +``` +$ brew cask install java +``` + +不到一分钟就能看到: + +``` +🍺 java was successfully installed! +``` + +通过 `java -version` 命令确认 OpenJDK 已经正确安装: + +``` +$ java -version +openjdk version "14.0.1" 2020-04-14 +OpenJDK Runtime Environment (build 14.0.1+7) +OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing +``` + +从输出中可以确认 OpenJDK 14 (本文撰写时的最新版本)已经安装。 + +#### 从二进制文件安装 OpenJDK + +如果你并不热衷于包管理器,并且更愿意自己来管理 Java 的话,那么你总是可以选择下载并且手动安装。 + +我在 OpenJDK 主页上找到了最新版本的下载链接。下载 OpenJDK 14 的二进制文件: + +``` +$ wget https://download.java.net/java/GA/jdk14.0.1/664493ef4a6946b186ff29eb326336a2/7/GPL/openjdk-14.0.1_osx-x64_bin.tar.gz +``` + +移动到你保存二进制文件的目录,然后解压: + +``` +$ tar -xf openjdk-14.0.1_osx-x64_bin.tar.gz +``` + +接下来,将 Java 加入到你的 PATH: + +``` +$ export PATH=$PWD/jdk-14.0.1.jdk/Contents/Home/bin:$PATH +``` + +同时,将这条命令加到你的点文件中,`.bash_profile` 还是 `.zshrc` 取决于你运行的 shell。你可以在《[如何在 Linux 中设置你的 $PATH 变量][23]》一文中了解更多关于配置 `$PATH` 变量的内容。 + +最后,验证你安装的 OpenJDK 14: + +``` +$ java -version +openjdk version "14.0.1" 2020-04-14 +OpenJDK Runtime Environment (build 14.0.1+7) +OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing) +``` + +### 在 Mac 上编写你的第一个[微服务][13]microservices + +现在,你已经准备好在 maxOS 上使用 OpenJDK 堆栈开发云原生cloud native Java 应用程序了。在本教程中,你将在 [Quarkus][17] 上创建一个新的 Java 项目,这个项目使用依赖注入dependency injection来公布 REST API。 + +你需要 [Maven][24] 启动,它是一个非常流行的 Java 依赖管理器。从 Maven 的网站[安装][25]它,或者通过 Homebrew 使用 `brew install maven` 命令。 + +执行以下 Maven 命令来配置 Quarkus 项目,并且创建一个简单的 web 应用: + +``` +$ mvn io.quarkus:quarkus-maven-plugin:1.5.1.Final:create \ +    -DprojectGroupId=com.example \ +    -DprojectArtifactId=getting-started \ +    -DclassName="com.example.GreetingResource" \ +    -Dpath="/hello" +cd getting-started +``` + +运行这个应用: + +``` +$ ./mvnw quarkus:dev +``` + +当应用程序运行的时候,你可以看到这个输出: + +``` +__  ____  __  _____   ___  __ ____  ______ + --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ + -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   +\--\\___\\_\\____/_/ |_/_/|_/_/|_|\\____/___/   +2020-06-13 00:03:06,413 INFO  [io.quarkus] (Quarkus Main Thread) getting-started 1.0-SNAPSHOT on JVM (powered by Quarkus 1.5.1.Final) started in 1.125s. Listening on: +2020-06-13 00:03:06,416 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. +2020-06-13 00:03:06,416 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy] +``` + +使用 `curl` 命令访问 REST 端点: + +``` +$ curl -w "\n" http://localhost:8080/hello +hello +``` + +恭喜!通过使用 Mavan 和 Quarkus,你很快从没有安装 Java 的环境里创建了第一个 web 应用。 + +### 接下来用 Java 做什么 + +Java 是一个成熟的编程语言,通过专门为云原生cloud native应用程序开发设计的新框架,Java 的热度会一直持续下去。 + +如果你正走在这样构建未来应用的路上,你可能会对更多实用的 Quarkus 开发课程或其他现代化框架感兴趣。无论你在构建什么,下一步是配置你的文本编辑器。阅读我关于《[在 VS Code 用 Quarkus 编写 Java][26]》的教程,然后再看看你能做什么。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/install-java-mac + +作者:[Daniel Oh][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/daniel-oh +[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://opensource.com/resources/java +[3]: https://twitter.com/search?q=%23MovedByJava&src=typed_query +[4]: https://twitter.com/grailsframework?ref_src=twsrc%5Etfw +[5]: https://twitter.com/ObjectComputing?ref_src=twsrc%5Etfw +[6]: https://twitter.com/micronautfw?ref_src=twsrc%5Etfw +[7]: https://twitter.com/groundbreakers?ref_src=twsrc%5Etfw +[8]: https://twitter.com/Java_Champions?ref_src=twsrc%5Etfw +[9]: https://twitter.com/java?ref_src=twsrc%5Etfw +[10]: https://twitter.com/hashtag/MovedByJava?src=hash&ref_src=twsrc%5Etfw +[11]: https://twitter.com/graemerocher/status/1263484918157410304?ref_src=twsrc%5Etfw +[12]: https://opensource.com/resources/what-is-kubernetes +[13]: https://opensource.com/resources/what-are-microservices +[14]: https://opensource.com/sites/default/files/uploads/javatimeline.png (Timeline of technology contributions to Java) +[15]: https://creativecommons.org/licenses/by-sa/4.0/ +[16]: https://opensource.com/article/20/1/cloud-native-java +[17]: https://quarkus.io/ +[18]: https://micronaut.io/ +[19]: https://helidon.io/#/ +[20]: https://linux.cn/article-11614-1.html +[21]: https://linux.cn/article-12338-1.html +[22]: https://openjdk.java.net/ +[23]: https://opensource.com/article/17/6/set-path-linux +[24]: https://maven.apache.org/index.html +[25]: https://maven.apache.org/install.html +[26]: https://opensource.com/article/20/4/java-quarkus-vs-code diff --git a/published/202007/20200702 Customizing my Linux terminal with tmux and Git.md b/published/202007/20200702 Customizing my Linux terminal with tmux and Git.md new file mode 100644 index 0000000000..127da8332b --- /dev/null +++ b/published/202007/20200702 Customizing my Linux terminal with tmux and Git.md @@ -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 编程或编写一个传递了五次的管道,也不会超出屏幕界限。这样做的代价是简单的命令序列(新建、复制、移动)会更快地滚动出我的屏幕。 + +行末是 [阿列夫零][5]Aleph null 字符,它是最小的[无穷基数][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/ diff --git a/published/202007/20200702 Ex-Solus Dev is Now Creating a Truly Modern Linux Distribution Called Serpent Linux.md b/published/202007/20200702 Ex-Solus Dev is Now Creating a Truly Modern Linux Distribution Called Serpent Linux.md new file mode 100644 index 0000000000..a8c6507f06 --- /dev/null +++ b/published/202007/20200702 Ex-Solus Dev is Now Creating a Truly Modern Linux Distribution Called Serpent Linux.md @@ -0,0 +1,83 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12401-1.html) +[#]: subject: (Ex-Solus Dev is Now Creating a Truly Modern Linux Distribution Called Serpent Linux) +[#]: via: (https://itsfoss.com/serpent-os-announcement/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Solus Linux 创始人正在开发一个没有 GNU 的“真正现代”的 Linux 发行版 +====== + +曾经创建独立 Linux 发行版 Solus 的开发人员 [Ikey Doherty][1] 宣布了他的新项目:Serpent OS。 + +[Serpent OS][2] 是一个**不想**被归类为“轻量级、用户友好、注重隐私的 Linux 桌面发行版”。 + +相反,Serpent OS 具有“与主流产品不同的目标”。具体怎么样?请继续阅读。 + +### Serpent OS:制作“真正现代”的 Linux 发行版 + +![][3] + +Serpent 采用发行版优先,兼容靠后的方法。这使他们可以做出一些非常大胆的决定。 + +Ikey 表示,这个项目不会对阻碍 Linux 的负面角色容忍。例如,不会容忍 NVIDIA 在其 GPU 上缺乏对 Wayland 加速的支持,并将 NVIDIA 专有驱动加入发行版黑名单。 + +这是 Serpent Linux 项目的拟议计划(摘自[其网站][4]): + + * 不再分割 usrbin + * 100% clang 构建(包括内核) + * musl 作为 libc,依靠编译器优化而不是内联 asm + * 使用 libc++ 而不是 libstdc++ + * LLVM 的 binutils 变体(lld、as 等) + * 混合源代码/二进制分发 + * 从 x86\_64 通用基线转移到更新的 CPU,包括针对 Intel 和 AMD 的优化 + * 包管理器中基于功能的订阅(硬件/用户选择等) + * 只支持 UEFI。不支持老式启动方式 + * 完全开源,包括引导程序/重建脚本 + * 针对高工作负载进行了认真的优化 + * 第三方应用仅依赖于容器。没有兼容性修改 + * 仅支持 Wayland。将调查通过容器的 X11 兼容性 + * 完全无状态的管理工具和上游补丁 + +Ikey 大胆地宣称 Serpent Linux 不是 Serpent GNU/Linux,因为它不再依赖于 GNU 工具链或运行时。 + +Serpent OS 项目的开发将于 7 月底开始。没有确定最终稳定版本的时间表。 + +### 要求过高?但是 Ikey 过去做到了 + +你可能会怀疑 Serpent OS 是否会出现,是否能够兑现其所作的所有承诺。 + +但是 Ikey Doherty 过去已经做到了。如果我没记错的话,他首先基于 Debian 创建了 SolusOS。他于 2013 年停止了基于 [Debian 的 SolusOS][5] 的开发,甚至它还没有进入 Beta 阶段。 + +然后,他从头开始创建 [evolve OS][6],而不是使用其他发行版作为基础。由于某些命名版权问题,项目名称已更改为 Solus(是的,相同的旧名称)。[Ikey 在 2018 年退出了 Solus 项目][7],其他开发人员现在负责该项目。 + +Solus 是一个独立的 Linux 发行版,它为我们提供了漂亮的 Budgie 桌面环境。 + +Ikey 过去做到了(当然,在其他开发人员的帮助下)。他现在也应该能够做到。 + +### 看好还是不看好? + +你如何看待这个 Serpent Linux?你是否认为是时候让开发人员采取大胆的立场,并着眼于未来开发操作系统,而不是坚持过去?请分享你的观点。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/serpent-os-announcement/ + +作者:[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/ikey-doherty-serpent-interview/ +[2]: https://www.serpentos.com/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/serpent-linux.png?ssl=1 +[4]: https://www.serpentos.com/about/ +[5]: https://distrowatch.com/table.php?distribution=solusos +[6]: https://itsfoss.com/beta-evolve-os-released/ +[7]: https://itsfoss.com/ikey-leaves-solus/ diff --git a/published/202007/20200703 openSUSE Leap 15.2 Released With Focus on Containers, AI and Encryption.md b/published/202007/20200703 openSUSE Leap 15.2 Released With Focus on Containers, AI and Encryption.md new file mode 100644 index 0000000000..522ce76e8c --- /dev/null +++ b/published/202007/20200703 openSUSE Leap 15.2 Released With Focus on Containers, AI and Encryption.md @@ -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 diff --git a/published/202007/20200706 Project OWL- IoT trying to hold connectivity together in disasters.md b/published/202007/20200706 Project OWL- IoT trying to hold connectivity together in disasters.md new file mode 100644 index 0000000000..bd52eec6e3 --- /dev/null +++ b/published/202007/20200706 Project OWL- IoT trying to hold connectivity together in disasters.md @@ -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 项目:物联网正尝试在灾难中让一切保持联络 +====== + +> 当自然灾害破坏了传统的通信连接时,配置在多跳网络mesh network的物联网设备可以迅速部署以提供基本的连接。 + +![](https://img.linux.net.cn/data/attachment/album/202007/21/135614mwr8rxr6lw5xefjs.jpg) + +OWL 项目负责人在最近的开源峰会上说,一个以多跳网络、物联网和 LoRa 连接为中心的开源项目可以帮助急救和受灾人员在自然灾害之后保持联系。 + +OWL 项目的应用场景是当在自然灾害之后频繁发生的通信中断时。无论是蜂窝网络还是有线网络,大范围的中断会频繁阻碍急救服务、供应和在暴风雨或其他重大灾难后必须解决关键问题的信息流。 + +该项目通过一大群“鸭子duck”(便宜、易于部署且不需要现有基础设施支持的小型无线模块)实现这个目的。一些“鸭子”是太阳能的,其它一些则用的是耐用电池。每只“鸭子”配备一个 LoRa 无线电,用于在网络上和其它“鸭子”进行通信,同时还配备有 Wi-Fi,而且可能配备蓝牙和 GPS 来实现其他功能。 + +这个想法是这样的,当网络瘫痪时,用户可以使用他们的智能手机或者笔记本电脑与“鸭子”建立一个 Wi-Fi 连接,这个“鸭子”可以将小块的信息传递到网络的其他部分。信息向网络后端传递,直到到达“鸭子爸爸papaduck”,“鸭子爸爸”装备了可以与云上的 OWL 数据管理系统连接的卫星系统(OWL 代表 ”组织organization位置whereabouts物流logistics”)。信息可以通过云在智能手机或者网页上进行可视化,甚至可以通过 API 插入到现有的系统中。 + +秘密在于“鸭群ClusterDuck” 协议,这是一个开源固件,即使在一些模块不能正常工作的网络中,它仍然能保持信息流通。它就是设计用来工作在大量便宜且容易获取的计算硬件上,类似树莓派的硬件,这样可以更容易且更快捷的建立一个“鸭群”网络。 + +创始人 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 diff --git a/published/202007/20200707 What you need to know about hash functions.md b/published/202007/20200707 What you need to know about hash functions.md new file mode 100644 index 0000000000..062179dd21 --- /dev/null +++ b/published/202007/20200707 What you need to know about hash functions.md @@ -0,0 +1,84 @@ +[#]: collector: (lujun9972) +[#]: translator: (Yufei-Yan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12408-1.html) +[#]: subject: (What you need to know about hash functions) +[#]: via: (https://opensource.com/article/20/7/hash-functions) +[#]: author: (Mike Bursell https://opensource.com/users/mikecamel) + +关于哈希(散列)函数你应该知道的东西 +====== + +> 从输出的哈希值反推回输入,这从计算的角度是不可行的。 + +![](https://img.linux.net.cn/data/attachment/album/202007/12/145709d3ne3vee330oh3lv.jpg) + +无论安全从业人员用计算机做什么,有一种工具对他们每个人都很有用:加密哈希(散列)hash函数。这听起来很神秘、很专业,甚至可能有点乏味,但是, 在这里,关于什么是哈希函数以及它们为什么对你很重要,我会作出一个简洁的解释。 + +加密哈希函数,比如 SHA-256 或者 MD5,接受一组二进制数据(通常是字节)作为输入,并且对每个可能的输入集给出一个希望唯一hopefully unique的输出。对于任意模式的输入,给定的哈希函数的输出(“哈希值”)的长度都是一样的(对于 SHA-256,是 32 字节或者 256 比特,这从名字中就能看出来)。最重要的是:从输出的哈希值反推回输入,这从计算的角度是不可行的implausible(密码学家讨厌 “不可能impossible” 这个词)。这就是为什么它们有时候被称作单向哈希函数one-way hash function。 + +但是哈希函数是用来做什么的呢?为什么“唯一”的属性如此重要? + +### 唯一的输出 + +在描述哈希函数的输出时,“希望唯一hopefully unique”这个短语是至关重要的,因为哈希函数就是用来呈现完全唯一的输出。比如,哈希函数可以用于验证 *你* 下载的文件副本的每一个字节是否和 *我* 下载的文件一样。你下载一个 Linux 的 ISO 文件或者从 Linux 的仓库中下载软件时,你会看到使用这个验证过程。没有了唯一性,这个技术就没用了,至少就通常的目的而言是这样的。 + +如果两个不同的输入产生了相同的输出,那么这样的哈希过程就称作“碰撞collision”。事实上,MD5 算法已经被弃用,因为虽然可能性微乎其微,但它现在可以用市面上的硬件和软件系统找到碰撞。 + +另外一个重要的特性是,消息中的一个微小变化,甚至只是改变一个比特位,都可能会在输出中产生一个明显的变化(这就是“雪崩效应avalanche effect”)。 + +### 验证二进制数据 + +哈希函数的典型用途是当有人给你一段二进制数据,确保这些数据是你所期望的。无论是文本、可执行文件、视频、图像或者一个完整的数据库数据,在计算世界中,所有的数据都可以用二进制的形式进行描述,所以至少可以这么说,哈希是广泛适用的。直接比较二进制数据是非常缓慢的且计算量巨大,但是哈希函数在设计上非常快。给定两个大小为几 M 或者几 G 的文件,你可以事先生成它们的哈希值,然后在需要的时候再进行比较。 + +通常,对哈希值进行签名比对大型数据集本身进行签名更容易。这个特性太重要了,以至于密码学中对哈希值最常见的应用就是生成“数字”签名。 + +由于生成数据的哈希值很容易,所以通常不需要有两套数据。假设你想在你的电脑上运行一个可执行文件。但是在你运行之前,你需要检查这个文件就是你要的文件,没有被黑客篡改。你可以方便快捷的对文件生成哈希值,只要你有一个这个哈希值的副本,你就可以相当肯定这就是你想要的文件。 + +下面是一个简单的例子: + +``` +$ shasum -a256 ~/bin/fop +87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c  /home/bob/bin/fop +``` + +如果我知道 `fop` 这个可执行文件的 SHA-256 校验和,这是由供应商(这个例子中是 Apache 基金会)提供的: + +``` +87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c +``` + +然后我就可以确信,我驱动器上的这个可执行文件和 Apache 基金会网站上发布的文件是一模一样的。这就是哈希函数难以发生碰撞(或者至少是 *很难通过计算得到碰撞*)这个性质的重要之处。如果黑客能将真实文件用哈希值相同的文件轻易的进行替换,那么这个验证过程就毫无用处。 + +事实上,这些性质还有更技术性的名称,我上面所描述的将三个重要的属性混在了一起。更准确地说,这些技术名称是: + +1. 抗原像性pre-image resistance:给定一个哈希值,即使知道用了什么哈希函数,也很难得到用于创建它的消息。 +2. 抗次原像性second pre-image resistance:给定一个消息,很难找到另一个消息,使得这个消息可以产生相同的哈希值。 +3. 抗碰撞性collision resistance:很难得到任意两个可以产生相同哈希值的消息。 + +*抗碰撞性* 和 *抗次原像性* 也许听上去是同样的性质,但它们具有细微而显著的不同。*抗次原像性* 说的是如果 *已经* 有了一个消息,你也很难得到另一个与之哈希值相匹配的消息。*抗碰撞性* 使你很难找到两个可以生成相同哈希值的消息,并且要在哈希函数中实现这一性质则更加困难。 + +让我回到黑客试图替换文件(可以通过哈希值进行校验)的场景。现在,要在“外面”使用加密哈希算法(除了使用那些在现实世界中由独角兽公司开发的完全无 Bug 且安全的实现之外),还有一些重要且困难的附加条件需要满足。认真的读者可能已经想到了其中一些,特别需要指出的是: + +1. 你必须确保自己所拥有的哈希值副本也没有被篡改。 +2. 你必须确保执行哈希算法的实体能够正确执行并报告了结果。 +3. 你必须确保对比两个哈希值的实体确实报告了这个对比的正确结果。 + +确保你能满足这些条件绝对不是一件容易的事。这就是可信平台模块Trusted Platform Modules(TPM)成为许多计算系统一部分的原因之一。它们扮演着信任的硬件基础,可以为验证重要二进制数据真实性的加密工具提供保证。TPM 对于现实中的系统来说是有用且重要的工具,我也打算将来写一篇关于 TPM 的文章。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/hash-functions + +作者:[Mike Bursell][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/mikecamel +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc_OpenData_CityNumbers.png?itok=lC03ce76 +[2]: https://aliceevebob.com/2020/06/16/whats-a-hash-function/ diff --git a/published/202007/20200708 How to decipher Linux release info.md b/published/202007/20200708 How to decipher Linux release info.md new file mode 100644 index 0000000000..55a2d68d8c --- /dev/null +++ b/published/202007/20200708 How to decipher Linux release info.md @@ -0,0 +1,138 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12418-1.html) +[#]: subject: (How to decipher Linux release info) +[#]: via: (https://www.networkworld.com/article/3565432/how-to-decipher-linux-release-info.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +如何解密 Linux 版本信息 +====== + +> 显示和解释有关 Linux 版本的信息比看起来要复杂一些。 + +![christin hume / Linux / Modified by IDG Comm.][1] + +与引用一个简单的版本号不同,识别 Linux 版本有很多种方法。即使只是快速查看一下 `uname` 命令的输出,也可以告诉你一些信息。这些信息是什么,它告诉你什么? + +在本文中,我们将认真研究 `uname` 命令的输出以及其他一些命令和文件提供的版本说明。 + +### 使用 uname + +每当在 Linux 系统终端窗口中执行命令 `uname -a` 时,都会显示很多信息。那是因为这个小小的 `a` 告诉 `uname` 命令你想查看该命令能提供的*全部*输出。结果显示的内容将告诉你许多有关该系统的各种信息。实际上,显示的每一块信息都会告诉你一些关于系统的不同信息。 + +例如,`uname -a` 输出看起来像这样: + +``` +$ uname -a +Linux dragonfly 5.4.0-37-generic #41-Ubuntu SMP Wed Jun 3 18:57:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux +``` + +尽管这可能不太重要,但你可以使用一个按适当的顺序包含 `uname` 所有选项来显示相同的信息: + +``` +$ uname -snmrvpio +Linux dragonfly 5.4.0-37-generic #41-Ubuntu SMP Wed Jun 3 18:57:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux +``` + +要将这一长串信息分解为单独的块,可以使用类似这样的 `for` 循环来遍历每个选项: + +``` +$ for option in s n m r v p i o; do echo -n "$option: "; uname -$option; done +s: Linux +n: dragonfly +m: x86_64 +r: 5.4.0-37-generic +v: #41-Ubuntu SMP Wed Jun 3 18:57:02 UTC 2020 +p: x86_64 +i: x86_64 +o: GNU/Linux +``` + +该循环显示了该选项提供了哪些信息。`uname` 手册页提供了每个选项的描述。以下是清单: + +- Linux –- 内核名称(选项 `s`) +- dragonfly –- 节点名(选项 `n`) +- x86_64 –- 机器硬件名(选项 `m`) +- 5.4.0-37-generic –- 内核发布版本(选项 `r`) +- #41-Ubuntu SMP Wed Jun 3 18:57:02 UTC 2020 -- 内核版本(选项 `v`) +- x86_64 –- 处理器(选项 `p`) +- x86_64 –- 硬件平台(选项 `i`) +- GNU/Linux –- 操作系统(选项 `o`) + +要更深入地研究显示的信息,请认真查看显示的内核发行数据。第四行中的 `5.4.0-37` 不仅仅是一串任意数字。每个数字都很重要。 + + * `5` 表示内核版本 + * `4` 表示主要版本 + * `0` 表示次要版本 + * `37` 表示最新补丁 + +此外,在上面的循环中输出的第 5 行(内核版本)中的 `#41` 表示此发布版本已编译 41 次。 + +如果你只想显示所有信息中的一项,那么单个选项可能很有用。例如,命令 `uname -n` 可以仅告诉你系统名称,而 `uname -r` 仅可以告诉你内核发布版本。在盘点服务器或构建脚本时,这些和其他选项可能很有用。 + +在 Red Hat 系统时,`uname -a` 命令将提供相同种类的信息。这是一个例子: + +``` +$ uname -a +Linux fruitfly 4.18.0-107.el8.x86_64 #1 SMP Fri Jun 14 13:46:34 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux +``` + +### 发行版信息 + +如果你需要了解运行的发行版是什么,那么 `uname` 的输出不会对你有太大帮助。毕竟,内核版本与发行版不同。关于这个信息,你可以在 Ubuntu 和其他基于 Debian 的系统上使用 `lsb_release -r` 命令,而在 Red Hat 上可以显示 `/etc/redhat-release` 文件的内容。 + +对于 Debian 系统: + +``` +$ lsb_release -r +Release: 20.04 +``` + +对于 Red Hat 及相关系统: + +``` +$ cat /etc/redhat-release +Red Hat Enterprise Linux release 8.1 Beta (Ootpa) +``` + +### 使用 /proc/version + +`/proc/version` 文件还可以提供有关 Linux 版本的信息。该文件中提供的信息与 `uname -a` 输出有很多共同点。以下是例子。 + +在 Ubuntu 上: + +``` +$ cat /proc/version +Linux version 5.4.0-37-generic (buildd@lcy01-amd64-001) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #41-Ubuntu SMP Wed Jun 3 18:57:02 UTC 2020 +``` + +在 RedHat 上: + +``` +$ cat /proc/version +Linux version 4.18.0-107.el8.x86_64 (mockbuild@x86-vm-09.build.eng.bos.redhat.com) (gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)) #1 SMP Fri Jun 14 13:46:34 UTC 2019 +``` + +### 总结 + +Linux 系统提供了很多关于内核和发行版安装的信息。你只需要知道在哪里或如何寻找并理解它的含义。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3565432/how-to-decipher-linux-release-info.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2020/07/linux_woman-with-laptop_keyboard_code_programmer_devops_by-christin-hume-via-unsplash_linux_-100850842-large.jpg +[2]: https://creativecommons.org/publicdomain/zero/1.0/ +[3]: https://www.facebook.com/NetworkWorld/ +[4]: https://www.linkedin.com/company/network-world diff --git a/published/202007/20200708 Program IoT systems using Python with this VSCode plugin for RTOS.md b/published/202007/20200708 Program IoT systems using Python with this VSCode plugin for RTOS.md new file mode 100644 index 0000000000..a59350cf87 --- /dev/null +++ b/published/202007/20200708 Program IoT systems using Python with this VSCode plugin for RTOS.md @@ -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) diff --git a/published/202007/20200709 Btrfs to be the Default Filesystem on Fedora- Fedora 33 Starts Testing Btrfs Switch.md b/published/202007/20200709 Btrfs to be the Default Filesystem on Fedora- Fedora 33 Starts Testing Btrfs Switch.md new file mode 100644 index 0000000000..e360444220 --- /dev/null +++ b/published/202007/20200709 Btrfs to be the Default Filesystem on Fedora- Fedora 33 Starts Testing Btrfs Switch.md @@ -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 diff --git a/published/202007/20200709 What you need to know about automation testing in CI-CD.md b/published/202007/20200709 What you need to know about automation testing in CI-CD.md new file mode 100644 index 0000000000..d5b7f7dd3a --- /dev/null +++ b/published/202007/20200709 What you need to know about automation testing in CI-CD.md @@ -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 diff --git a/published/202007/20200713 My Linux story- From Linux user to contributor.md b/published/202007/20200713 My Linux story- From Linux user to contributor.md new file mode 100644 index 0000000000..0d8c6d5d62 --- /dev/null +++ b/published/202007/20200713 My Linux story- From Linux user to contributor.md @@ -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 工程师、自动化顾问和高级敏捷专家scrum master。我开始是在 Ubuntu 上学习 Linux,但是后来作为系统管理员转到 CentOS,然后我又转到 Fedora 作为个人使用。但是我对技术的喜爱要远比我使用第一个 Linux 发行版要早的多,而且是来自于一部电影。 + +我最喜欢的电影是《黑客Hackers》。最精彩的一幕发生在电影的开头。电影一开始,一群特工冲进一所房子抓捕臭名昭著的黑客 Zero Cool。我们马上发现 Zero Cool 其实是 11 岁的 Dade Murphy,他在一天之内成功瘫痪了 1507 台计算机系统。他被指控犯罪,他的家人被处以重罚。而且,在他 18 岁之前,他都被禁止使用电脑或按键式电话。 + +劳伦斯·梅森Laurence Mason扮演的 Paul Cook,又名 Nikon 勋爵,是我最喜欢角色。其中一个主要原因是,我从没有看过一个黑客电影里面的人物长的像我,所以我被他的形象深深吸引了。他很神秘。这让我耳目一新,并且感到自豪,我对 IT 充满了热情,我也是一个和他很像的极客。 + +![Taz with astronaut][2] + +### 成为一个 Linux 贡献者 + +15 年前,我开始使用 Linux。当我成为一个 Linux 管理员的时候,Linux 就成了我的激情所在。我一直尝试找到某种方式能够为开源作出贡献,当时我还不知道该从哪开始。因为这个社区实在是太大了,我不知道自己能否真正成为一个有影响力的人,但当我发现一些人认可我的兴趣,还对我进行指导,我开始彻底打开心扉,问各种问题,并且从社区中学习。自从那以后,Fedora 社区一直是我做贡献的最主要社区。 + +我现在对于向开源做贡献还是有点稚嫩。当我意识到我可以用代码以外的方式来贡献时,我对开源的想法发生了改变。我更喜欢通过文档做一些贡献,因为我本质上不是一个软件开发人员,而且社区里面最迫切的需求正是文档。请记住:用户的技能和开发人员的技能同样重要。 + +### 我的硬件是什么? + +硬件也很重要,而且现在几乎所有东西都可以运行 Linux。现在,我家里的配置包括: + + * 联想 Thinksever TS140,64 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 作为我的项目的开源看板kanban + * [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/ diff --git a/published/202007/20200713 My feature-rich and minimal Linux terminal.md b/published/202007/20200713 My feature-rich and minimal Linux terminal.md new file mode 100644 index 0000000000..301fb64e95 --- /dev/null +++ b/published/202007/20200713 My feature-rich and minimal Linux terminal.md @@ -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/ diff --git a/published/202007/20200713 Top 5 Open Source Video Conferencing Tools for Remote Working and Online Meetings.md b/published/202007/20200713 Top 5 Open Source Video Conferencing Tools for Remote Working and Online Meetings.md new file mode 100644 index 0000000000..3c7727f220 --- /dev/null +++ b/published/202007/20200713 Top 5 Open Source Video Conferencing Tools for Remote Working and Online Meetings.md @@ -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/ diff --git a/published/202007/20200714 My Linux story- breaking language barriers with open source.md b/published/202007/20200714 My Linux story- breaking language barriers with open source.md new file mode 100644 index 0000000000..53f2611c0a --- /dev/null +++ b/published/202007/20200714 My Linux story- breaking language barriers with open source.md @@ -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 做日常工作比其他任何操作系统都要舒服。我也为能与一个能让人们用自己的语言交流的项目联系在一起而感到自豪。它也为长期以来由于不会说英语而被认为处于“数字鸿沟digital divide”另一端的人们带来了计算能力。孟加拉语实际上是世界上使用最广泛的语言之一,这个项目消除了全球人口中很大一部分人接触数字科技的主要语言壁垒。 + +### 加入开源 + +加入到开源运动中来很容易。主动做一些对自己有用的事情,然后思索一下所做的事情如何能对他人也有帮助。关键在于使它免费可用,它可以给世界带来难以估量的价值。 + +-------------------------------------------------------------------------------- + +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/ diff --git a/published/202007/20200715 What-s the difference between DevSecOps and agile software development.md b/published/202007/20200715 What-s the difference between DevSecOps and agile software development.md new file mode 100644 index 0000000000..38b9f14c28 --- /dev/null +++ b/published/202007/20200715 What-s the difference between DevSecOps and agile software development.md @@ -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 diff --git a/published/202007/20200718 Ubuntu 19.10 Reaches End of Life. Upgrade to Ubuntu 20.04 As Soon As Possible.md b/published/202007/20200718 Ubuntu 19.10 Reaches End of Life. Upgrade to Ubuntu 20.04 As Soon As Possible.md new file mode 100644 index 0000000000..a3e48b4bb3 --- /dev/null +++ b/published/202007/20200718 Ubuntu 19.10 Reaches End of Life. Upgrade to Ubuntu 20.04 As Soon As Possible.md @@ -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 diff --git a/published/202007/20200720 Why People Are Crazy About Arch Linux- What-s so Special About it.md b/published/202007/20200720 Why People Are Crazy About Arch Linux- What-s so Special About it.md new file mode 100644 index 0000000000..5f4ad27495 --- /dev/null +++ b/published/202007/20200720 Why People Are Crazy About Arch Linux- What-s so Special About it.md @@ -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? What’s 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 在他的书《原子习惯Atomic Habits》中提到的那样,**人类的大脑喜欢挑战,但前提是在一个最理想的困难区域**。 + +还记得你第一次安装成功 Linux 时的感觉吗?即便你安装的是 Linux Mint。这给了你一种成就感:你成功安装了 Linux! + +如果你已经使用 Ubuntu、Fedora 或其他发行版一段时间了,现在开始感到舒适(或厌倦),你可以尝试安装一下 Arch Linux。 + +对于一个有一定经验的 Linux 用户来说,[成功安装 Arch Linux][13]本身就会给你一种成就感。 + +这是一个挑战,但却是可以实现的。如果你建议一个新的 Linux 用户尝试 Arch Linux 或者更复杂的 Linux 发行版比如 [Linux From Scratch(LFS)][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/ diff --git a/published/202007/20200727 Getting started as an open source builder and more industry trends.md b/published/202007/20200727 Getting started as an open source builder and more industry trends.md new file mode 100644 index 0000000000..769f5a9af1 --- /dev/null +++ b/published/202007/20200727 Getting started as an open source builder and more industry trends.md @@ -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/ diff --git a/published/202007/20200730 Defining cloud native, expanding the ecosystem, and more industry trends.md b/published/202007/20200730 Defining cloud native, expanding the ecosystem, and more industry trends.md new file mode 100644 index 0000000000..d5a52e2a1b --- /dev/null +++ b/published/202007/20200730 Defining cloud native, expanding the ecosystem, and more industry trends.md @@ -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 diff --git a/published/202007/20200731 Beginner-friendly Terminal-based Text Editor GNU Nano Version 5.0 Released.md b/published/202007/20200731 Beginner-friendly Terminal-based Text Editor GNU Nano Version 5.0 Released.md new file mode 100644 index 0000000000..c5b64697b1 --- /dev/null +++ b/published/202007/20200731 Beginner-friendly Terminal-based Text Editor GNU Nano Version 5.0 Released.md @@ -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 diff --git a/published/202008/20190222 Developer happiness- What you need to know.md b/published/202008/20190222 Developer happiness- What you need to know.md new file mode 100644 index 0000000000..706599ea05 --- /dev/null +++ b/published/202008/20190222 Developer happiness- What you need to know.md @@ -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/ diff --git a/published/202008/20190329 9 open source tools for building a fault-tolerant system.md b/published/202008/20190329 9 open source tools for building a fault-tolerant system.md new file mode 100644 index 0000000000..6c541e30f7 --- /dev/null +++ b/published/202008/20190329 9 open source tools for building a fault-tolerant system.md @@ -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/O:Kafka 和 RabbitMQ + +多线程开发在过去很流行,但是现在已经不鼓励这种做法了,取而代之的是异步的、非阻塞的 I/O 模式。对于 Java,这一点在 [EnterpriseJavaBean(EJB)规范][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 diff --git a/published/202008/20190620 How to use OpenSSL- Hashes, digital signatures, and more.md b/published/202008/20190620 How to use OpenSSL- Hashes, digital signatures, and more.md new file mode 100644 index 0000000000..ccca0f17d9 --- /dev/null +++ b/published/202008/20190620 How to use OpenSSL- Hashes, digital signatures, and more.md @@ -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/)包含了一个带有最新版本的表格。每个版本都有两个哈希值hash:160 位 SHA1 和 256 位 SHA256。这些值可以用来验证下载的文件是否与存储库中的原始文件相匹配:下载者在本地重新计算下载文件的哈希值,然后将结果与原始文件进行比较。现代系统有计算这种哈希值的实用程序。例如,Linux 有 `md5sum` 和 `sha256sum`。OpenSSL 本身也提供了类似的命令行实用程序。 + +哈希值被用于计算的许多领域。例如,比特币区块链使用 SHA256 哈希值作为区块标识符。挖比特币就是生成一个低于指定阈值的 SHA256 哈希值,也就是至少有 N 个前导零的哈希值。(N 的值可以上升或下降,这取决于特定时间的挖矿生产力)。作为一个兴趣点,如今的矿机是为并行生成 SHA256 哈希值而设计的硬件集群。在 2018 年的一个高峰期,全球的比特币矿工每秒产生约 7500 万个太哈希值terahash —— 这真是一个不可思议的数字。 + +网络协议也使用哈希值(在这里通常叫做“校验和checksum”)来支持消息的完整性;也就是说,保证收到的消息与发送的消息是一样的。消息发送者计算消息的校验和,并将结果与消息一起发送。当消息到达时,接收方重新计算校验和。如果发送的校验和与重新计算的校验和不一致,那么消息在传输过程中可能出现了一些问题,或者发送的校验和出现了问题,或者两者都出现了问题。在这种情况下,应该重新发送消息和它的校验和,或者至少应该触发一个错误情况。(如 UDP 这样的低级网络协议不会理会校验和。) + +哈希的其他例子大家都很熟悉。比如一个网站,要求用户用密码进行验证,用户在浏览器中输入密码,然后,他们通过 HTTPS 连接到服务器,密码从浏览器加密发送到服务器。一旦密码到达服务器,就会被解密,然后进行数据库表的查询。 + +在这个查询表中应该存储什么?存储密码本身是有风险的。风险要小得多的方式是存储一个由密码生成的哈希值,也许在计算哈希值之前“加一些salt(额外的位)改善口味”。你的密码可能会被发送到 Web 服务器上,但网站可以向你保证,密码不会存储在那里。 + +哈希值还出现在安全的各个领域。例如,基于哈希值的消息认证码hash-based message authentication code([HMAC][3])使用一个哈希值和一个秘密的加密密钥cryptographic key来认证通过网络发送的消息。HMAC 码轻量级且易于在程序中使用,在 Web 服务中很受欢迎。一个 X509 数字证书包括一个称为指纹fingerprint的哈希值,它可以方便证书验证。一个存放于内存中的可信存储truststore可以实现为一个以这种指纹为键的查找表 —— 作为一个支持恒定查找时间的哈希映射hash map。来自传入的证书的指纹可以与可信存储中的密钥进行比较,以确定是否匹配。 + +密码学哈希函数cryptographic hash function应该具有什么特殊属性?它应该是单向one-way的,这意味着很难被逆转。一个加密哈希函数应该是比较容易计算的,但是计算它的反函数(将哈希值映射回输入位串的函数)在计算上应该是困难的。下面是一个描述,用 `chf` 作为加密哈希函数,我的密码 `foobar` 作为样本输入。 + +``` + +---+ +foobar—>|chf|—>hash value ## 简单直接 + +--–+ +``` + +相比之下,逆向操作是不可行的: + +``` + +-----------+ +hash value—>|chf inverse|—>foobar ## 棘手困难 + +-----------+ +``` + +例如,回忆一下 SHA256 哈希函数。对于一个任意长度为 N > 0 的输入位串,这个函数会生成一个 256 位的固定长度的哈希值;因此,这个哈希值甚至不会反映出输入位串的长度 N,更不用说字符串中每个位的值了。顺便说一下,SHA256 不容易受到[长度扩展攻击][4]length extension attack。唯一有效的逆向工程方法是通过蛮力搜索将计算出的 SHA256 哈希值逆向返回到输入位串,这意味着需要尝试所有可能的输入位串,直到找到与目标哈希值匹配的位串。这样的搜索在 SHA256 这样一个完善的加密哈希函数上是不可行的。 + +现在,最后一个回顾的知识点是有序in order。加密哈希值是统计学上的唯一,而不是无条件的唯一,这意味着两个不同的输入位串产生相同的哈希值是不太可能的,但也不是不可能的 —— 这称之为碰撞collision。[生日问题][5]提供了一个很好的反直觉的碰撞例子。对各种哈希算法的抗碰撞性collision resistance有着广泛的研究。例如,MD5(128 位哈希值)在大约 2^21 次哈希之后,抗碰撞能力就会崩溃。对于 SHA1(160 位哈希值),大约在 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 +``` + +这种对密码学哈希函数的研究,为我们仔细研究数字签名及其与密钥对的关系奠定了基础。 + +### 数字签名 + +顾名思义,数字签字digital signature可以附在文件或其他一些电子工件artifact(如程序)上,以证明其真实性。因此,这种签名类似于纸质文件上的手写签名。验证数字签名就是要确认两件事:第一,被担保的工件在签名被附上后没有改变,因为它部分是基于文件的加密学哈希值。第二,签名属于一个人(例如 Alice),只有她才能获得一对密钥中的私钥。顺便说一下,对代码(源码或编译后的代码)进行数字签名已经成为程序员的普遍做法。 + +让我们来了解一下数字签名是如何创建的。如前所述,没有公钥和私钥对就没有数字签名。当使用 OpenSSL 创建这些密钥时,有两个独立的命令:一个是创建私钥,另一个是从私钥中提取匹配的公钥。这些密钥对用 base64 编码,在这个过程中可以指定它们的大小。 + +私钥private key由数值组成,其中两个数值(一个模数modulus和一个指数exponent)组成了公钥。虽然私钥文件包含了公钥public key,但提取出来的公钥并**不会**透露相应私钥的值。 + +因此,生成的带有私钥的文件包含了完整的密钥对。将公钥提取到自己的文件中是很实用的,因为这两把钥匙有不同的用途,而这种提取方式也将私钥可能被意外公开的危险降到最低。 + +接下来,这对密钥的私钥被用来生成目标工件(如电子邮件)的哈希值,从而创建签名。在另一端,接收者的系统使用这对密钥的公钥来验证附在工件上的签名。 + +现在举个例子。首先,用 OpenSSL 生成一个 2048 位的 RSA 密钥对: + +``` +openssl genpkey -out privkey.pem -algorithm rsa 2048 +``` + +在这个例子中,我们可以舍去 `-algorithm rsa` 标志,因为 `genpkey` 默认为 RSA 类型。文件的名称(`privkey.pem`)是任意的,但是隐私增强邮件Privacy Enhanced Mail(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` 程序,无论多么轻微,然后再试一次。 + +### 数字证书 + +数字证书digital certificate汇集了到目前为止所分析的各个部分:哈希值、密钥对、数字签名和加密/解密。生产级证书的第一步是创建一个证书签名请求certificate signing request(CSR),然后将其发送给证书颁发机构certificate authority(CA)。在 OpenSSL 的例子中,要做到这一点,请运行: + +``` +openssl req -out myserver.csr -new -newkey rsa:4096 -nodes -keyout myserverkey.pem +``` + +这个例子生成了一个 CSR 文档,并将该文档存储在文件 `myserver.csr`(base64 文本)中。这里的目的是:CSR 文档要求 CA 保证与指定域名相关联的身份,域名也就是 CA 所说的通用名common name(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 握手的认证阶段,自签证书self-signed certificate就能满足要求,尽管任何现代浏览器都会警告说这样的证书毫无价值。继续这个例子,自签证书的 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 私钥包含的值是用来生成公钥的。但是,给定的公钥**不会**泄露匹配的私钥。关于底层数学理论的介绍,见 。 + +数字证书与用于生成该证书的密钥对之间存在着重要的对应关系,即使证书只是自签的: + +* 数字证书包含构成公钥的指数和模数值。这些值是最初生成的 PEM 文件中密钥对的一部分,在本例中,是文件 `myserver.pem`。 +* 指数exponent几乎总是 65,537(如本例中),所以可以忽略。 +* 密钥对的模数modulus应该与数字证书的模数相匹配。 + +模数是一个很大的值,为了便于阅读,可以进行哈希处理。下面是两个 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 服务器就加密套件cipher suite达成一致,其中包括要使用的算法。在本例中,该套件是 `ECDHE-RSA-AES128-GCM-SHA256`。 + +现在值得关注的两个要素是 RSA 密钥对算法和 AES128 块密码,用于在握手成功的情况下对消息进行加密和解密。关于加密/解密,这个过程有两种流派:对称symmetric非对称asymmetric。在对称流派中,加密和解密使用的是*相同的*密钥,这首先就引出了密钥分发问题key distribution problem。如何将密钥安全地分发给双方?在非对称流派中,一个密钥用于加密(在这种情况下,是 RSA 公钥),但另一个密钥用于解密(在这种情况下,是来自同一对密钥的 RSA 私钥)。 + +`client` 程序拥有来认证证书的 Google Web 服务器的公钥,而 Web 服务器拥有来自同一对密钥的私钥。因此,`client` 程序可以向 Web 服务器发送加密信息,而 Web 服务器可以单独对该通信进行解密。 + +在 TLS 的情况下,对称方式有两个显著的优势: + +* 在 `client` 程序与 Google Web 服务器之间的互动中,认证是单向的。Google Web 服务器向 `client` 程序发送三张证书,但 `client` 程序并没有向 Web 服务器发送证书,因此,Web 服务器没有来自客户端的公钥,无法加密发给客户端的消息。 +* 使用 AES128 的对称加密/解密比使用 RSA 密钥的非对称加密/解密快了**近千倍**。 + +TLS 握手将两种加密/解密方式巧妙地结合在一起。在握手过程中,`client` 程序会生成随机位,即所谓的预主密pre-master secret(PMS)。然后,`client` 程序用服务器的公钥对 PMS 进行加密,并将加密后的 PMS 发送给服务器,服务器再用 RSA 密钥对的私钥对 PMS 信息进行解密: + +``` + +-------------------+ encrypted PMS +--------------------+ +client PMS--->|server’s public key|--------------->|server’s private key|--->server PMS + +-------------------+ +--------------------+ +``` + +在这个过程结束时,`client` 程序和 Google Web 服务器现在拥有相同的 PMS 位。每一方都使用这些位生成一个主密码master secret,并立即生成一个称为会话密钥session key的对称加密/解密密钥。现在有两个不同但等价的会话密钥,连接的每一方都有一个。在 `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 diff --git a/published/202008/20200107 Bash Script to Check How Long the High CPU-Memory Consumption Processes Runs on Linux.md b/published/202008/20200107 Bash Script to Check How Long the High CPU-Memory Consumption Processes Runs on Linux.md new file mode 100644 index 0000000000..59ebd1255b --- /dev/null +++ b/published/202008/20200107 Bash Script to Check How Long the High CPU-Memory Consumption Processes Runs on Linux.md @@ -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` 是进程状态processes status,它显示有关系统上活动/正在运行的进程的信息。 + +它提供了当前进程的快照以及详细信息,例如用户名、用户 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/ diff --git a/published/202008/20200318 Share data between C and Python with this messaging library.md b/published/202008/20200318 Share data between C and Python with this messaging library.md new file mode 100644 index 0000000000..83c68e0bdb --- /dev/null +++ b/published/202008/20200318 Share data between C and Python with this messaging library.md @@ -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 +#include + +// 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 +// For EXIT_* +#include +// For memcpy() +#include +// For sleep() +#include + +#include + +#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 +// For EXIT_* +#include +// For memcpy() +#include +// For sleep() +#include + +#include + +#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 diff --git a/published/202008/20200331 How failure-driven development makes you successful.md b/published/202008/20200331 How failure-driven development makes you successful.md new file mode 100644 index 0000000000..6b6bc55b96 --- /dev/null +++ b/published/202008/20200331 How failure-driven development makes you successful.md @@ -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 diff --git a/published/202008/20200519 24 Linux desktops you need to try.md b/published/202008/20200519 24 Linux desktops you need to try.md new file mode 100644 index 0000000000..f96ba38567 --- /dev/null +++ b/published/202008/20200519 24 Linux desktops you need to try.md @@ -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 有那么多的桌面可供选择。你可以把它归结为个人喜好和对效率低下的低容忍度,但优化用户界面也有技术上的好处。例如,老电脑难以跟上用户界面的更新,可以使用轻量级桌面[赋予它新的生命]() 。另外,你可能只是想把 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 diff --git a/published/202008/20200521 Easy DNS configuration with PowerDNS for nameservers.md b/published/202008/20200521 Easy DNS configuration with PowerDNS for nameservers.md new file mode 100644 index 0000000000..0a0f7aa7ae --- /dev/null +++ b/published/202008/20200521 Easy DNS configuration with PowerDNS for nameservers.md @@ -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) diff --git a/published/202008/20200526 FreeFileSync- Open Source File Synchronization Tool.md b/published/202008/20200526 FreeFileSync- Open Source File Synchronization Tool.md new file mode 100644 index 0000000000..6c35a380e3 --- /dev/null +++ b/published/202008/20200526 FreeFileSync- Open Source File Synchronization Tool.md @@ -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/ diff --git a/published/202008/20200603 Code your hardware using this open source RTOS.md b/published/202008/20200603 Code your hardware using this open source RTOS.md new file mode 100644 index 0000000000..067f5d0213 --- /dev/null +++ b/published/202008/20200603 Code your hardware using this open source RTOS.md @@ -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) diff --git a/published/202008/20200610 Concise data plotting in Python with Altair.md b/published/202008/20200610 Concise data plotting in Python with Altair.md new file mode 100644 index 0000000000..9f68890aa5 --- /dev/null +++ b/published/202008/20200610 Concise data plotting in Python with Altair.md @@ -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 diff --git a/published/202008/20200611 Never forget your password with this Python encryption algorithm.md b/published/202008/20200611 Never forget your password with this Python encryption algorithm.md new file mode 100644 index 0000000000..5d236b50d9 --- /dev/null +++ b/published/202008/20200611 Never forget your password with this Python encryption algorithm.md @@ -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])* + +当然,你不会把自己的主密码告诉其它任何人,因为这是密码管理的首要原则。有没有其它变通的办法,免除这种难以承受的密码之重? + +试试 [Shamir 秘密共享算法][6]Shamir's Secret Sharing,这是一种可以将保密内容进行分块保存,且只能将片段拼合才能恢复保密内容的算法。 + +先分别通过一个古代的和一个现代的故事,看看 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 diff --git a/published/202008/20200612 3 reasons to contribute to open source now.md b/published/202008/20200612 3 reasons to contribute to open source now.md new file mode 100644 index 0000000000..02ec8fa726 --- /dev/null +++ b/published/202008/20200612 3 reasons to contribute to open source now.md @@ -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 diff --git a/published/202008/20200616 Perform Common PDF Editing Tasks Like Merge, Split, Rotate With Free and Open Source PDF Mix Tool.md b/published/202008/20200616 Perform Common PDF Editing Tasks Like Merge, Split, Rotate With Free and Open Source PDF Mix Tool.md new file mode 100644 index 0000000000..1da4367b17 --- /dev/null +++ b/published/202008/20200616 Perform Common PDF Editing Tasks Like Merge, Split, Rotate With Free and Open Source PDF Mix Tool.md @@ -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 文件,同时指定确切的页面。它让你能够调整页面数、旋转,还能使用 “交替混合Alternate mix” 反转页面顺序合并。 + +![][6] + +你只需要单击 “添加 PDF 文件Add PDF File” 添加文件,然后使用可用的选项对其进行编辑(如上图所示),最后生成编辑的 PDF。 + +#### 旋转页面 + +你可以在合并多个文件或仅对单个 PDF 文件进行操作时旋转 PDF 文件的页面。 + +对于合并文件,你可以参考上面的截图。但是当你选择一个文件时,它看上去像这样: + +![][7] + +你有多种选择,但是要旋转页面,需要选择 “编辑页面布局Edit page layout” 选项,如上截图所示。 + +#### 添加或删除页面 + +要从其他 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/ diff --git a/published/202008/20200623 Jitsi Meet- A Free - Open Source Video Conferencing Solution That is Also Free to Use Without Any Set Up.md b/published/202008/20200623 Jitsi Meet- A Free - Open Source Video Conferencing Solution That is Also Free to Use Without Any Set Up.md new file mode 100644 index 0000000000..48a344eca5 --- /dev/null +++ b/published/202008/20200623 Jitsi Meet- A Free - Open Source Video Conferencing Solution That is Also Free to Use Without Any Set Up.md @@ -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/ diff --git a/published/202008/20200706 Set up Vim as your Rust IDE.md b/published/202008/20200706 Set up Vim as your Rust IDE.md new file mode 100644 index 0000000000..24d86798e8 --- /dev/null +++ b/published/202008/20200706 Set up Vim as your Rust IDE.md @@ -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 diff --git a/published/202008/20200710 Use DNS over TLS.md b/published/202008/20200710 Use DNS over TLS.md new file mode 100644 index 0000000000..9b55039cf6 --- /dev/null +++ b/published/202008/20200710 Use DNS over TLS.md @@ -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 diff --git a/published/202008/20200713 4 Mac terminal customizations even a curmudgeon can love.md b/published/202008/20200713 4 Mac terminal customizations even a curmudgeon can love.md new file mode 100644 index 0000000000..3ea183bba5 --- /dev/null +++ b/published/202008/20200713 4 Mac terminal customizations even a curmudgeon can love.md @@ -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 diff --git a/published/202008/20200715 An example of very lightweight RESTful web services in Java.md b/published/202008/20200715 An example of very lightweight RESTful web services in Java.md new file mode 100644 index 0000000000..4c8d4f9857 --- /dev/null +++ b/published/202008/20200715 An example of very lightweight RESTful web services in Java.md @@ -0,0 +1,682 @@ +[#]: collector: (lujun9972) +[#]: translator: (Yufei-Yan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12555-1.html) +[#]: subject: (An example of very lightweight RESTful web services in Java) +[#]: via: (https://opensource.com/article/20/7/restful-services-java) +[#]: author: (Marty Kalin https://opensource.com/users/mkalindepauledu) + +一个用 Java 实现的超轻量级 RESTful Web 服务示例 +====== + +> 通过管理一套图书的完整代码示例,来探索轻量级的 RESTful 服务。 + +![](https://img.linux.net.cn/data/attachment/album/202008/27/071808tt9zlno3b6lmbgl8.jpg) + +Web 服务,以这样或那样的形式,已经存在了近二十年。比如,[XML-RPC 服务][2]出现在 90 年代后期,紧接着是用 SOAP 分支编写的服务。在 XML-RPC 和 SOAP 这两个开拓者之后出现后不久,REST 架构风格的服务在大约 20 年前也出现了。[REST][4] 风格(以下简称 Restful)服务现在主导了流行的网站,比如 eBay、Facebook 和 Twitter。尽管分布式计算的 Web 服务有很多替代品(如 Web 套接字、微服务和远程过程调用的新框架),但基于 Restful 的 Web 服务依然具有吸引力,原因如下: + + * Restful 服务建立在现有的基础设施和协议上,特别是 Web 服务器和 HTTP/HTTPS 协议。一个拥有基于 HTML 的网站的组织可以很容易地为客户添加 Web 服务,这些客户对数据和底层功能更感兴趣,而不是对 HTML 的表现形式感兴趣。比如,亚马逊就率先通过网站和 Web 服务(基于 SOAP 或 Restful)提供相同的信息和功能。 + * Restful 服务将 HTTP 当作 API,因此避免了复杂的软件分层,这种分层是基于 SOAP 的 Web 服务的明显特征。比如,Restful API 支持通过 HTTP 命令(POST-GET-PUT-DELETE)进行标准的 CRUD(增加-读取-更新-删除)操作;通过 HTTP 状态码可以知道请求是否成功或者为什么失败。 + * Restful Web 服务可以根据需要变得简单或复杂。Restful 是一种风格,实际上是一种非常灵活的风格,而不是一套关于如何设计和构造服务的规定。(伴随而来的缺点是,可能很难确定哪些服务不能算作 Restful 服务。) + * 作为使用者或者客户端,Restful Web 服务与语言和平台无关。客户端发送 HTTP(S) 请求,并以适合现代数据交换的格式(如 JSON)接收文本响应。 + * 几乎每一种通用编程语言都至少对 HTTP/HTTPS 有足够的(通常是强大的)支持,这意味着 Web 服务的客户端可以用这些语言来编写。 + +这篇文章将通过一段完整的 Java 代码示例来探讨轻量级的 Restful 服务。 + +### 基于 Restful 的“小说” Web 服务 + +基于 Restful 的“小说” web 服务包含三个程序员定义的类: + + * `Novel` 类代表一个小说,只有三个属性:机器生成的 ID、作者和标题。属性可以根据实际情况进行扩展,但我还是想让这个例子看上去更简单一些。 + * `Novels` 类包含了用于各种任务的工具类:将一个 `Novel` 或者它们的列表的纯文本编码转换成 XML 或者 JSON;支持在小说集合上进行 CRUD 操作;以及从存储在文件中的数据初始化集合。`Novels` 类在 `Novel` 实例和 servlet 之间起中介作用。 + * `NovelsServlet` 类是从 `HttpServlet` 中继承的,`HttpServlet` 是一段健壮且灵活的代码,自 90 年代末的早期企业级 Java 就已经存在了。对于客户端的 CRUD 请求,servlet 可以当作 HTTP 的端点。 servlet 代码主要用于处理客户端的请求和生成相应的响应,而将复杂的细节留给 `Novels` 类中的工具类进行处理。 + +一些 Java 框架,比如 Jersey(JAX-RS)和 Restlet,就是为 Restful 服务设计的。尽管如此,`HttpServlet` 本身为完成这些服务提供了轻量、灵活、强大且充分测试过的 API。我会通过下面的“小说”例子来说明。 + +### 部署“小说” Web 服务 + +当然,部署“小说” Web 服务需要一个 Web 服务器。我的选择是 [Tomcat][5],但是如果该服务托管在 Jetty 或者甚至是 Java 应用服务器上,那么这个服务应该至少可以工作(著名的最后一句话!)。[在我的网站上][6]有总结了如何安装 Tomcat 的 README 文件和代码。还有一个附带文档的 Apache Ant 脚本,可以用来构建“小说”服务(或者任何其他服务或网站),并且将它部署在 Tomcat 或相同的服务。 + +Tomcat 可以从它的[官网][7]上下载。当你在本地安装后,将 `TOMCAT_HOME` 设置为安装目录。有两个子目录值得关注: + + * `TOMCAT_HOME/bin` 目录包含了类 Unix 系统(`startup.sh` 和 `shutdown.sh`)和 Windows(`startup.bat` 和 `shutdown.bat`) 的启动和停止脚本。Tomcat 作为 Java 应用程序运行。Web 服务器的 servlet 容器叫做 Catalina。(在 Jetty 中,Web 服务器和容器的名字一样。)当 Tomcat 启动后,在浏览器中输入 `http://localhost:8080/` 可以查看详细文档,包括示例。 + * `TOMCAT_HOME/webapps` 目录是已部署的 Web 网站和服务的默认目录。部署网站或 Web 服务的直接方法是复制以 `.war` 结尾的 JAR 文件(也就是 WAR 文件)到 `TOMCAT_HOME/webapps` 或它的子目录下。然后 Tomcat 会将 WAR 文件解压到它自己的目录下。比如,Tomcat 会将 `novels.war` 文件解压到一个叫做 `novels` 的子目录下,并且保留 `novels.war` 文件。一个网站或 Web 服务可以通过删除 WAR 文件进行移除,也可以用一个新版 WAR 文件来覆盖已有文件进行更新。顺便说一下,调试网站或服务的第一步就是检查 Tomcat 已经正确解压 WAR 文件;如果没有的话,网站或服务就无法发布,因为代码或配置中有致命错误。 + * 因为 Tomcat 默认会监听 8080 端口上的 HTTP 请求,所以本机上的 URL 请求以 `http://localhost:8080/` 开始。 + +通过添加不带 `.war` 后缀的 WAR 文件名来访问由程序员部署的 WAR 文件: + +``` +http://locahost:8080/novels/ +``` + +如果服务部署在 `TOMCAT_HOME` 下的一个子目录中(比如,`myapps`),这会在 URL 中反映出来: + +``` +http://locahost:8080/myapps/novels/ +``` + +我会在靠近文章结尾处的测试部分提供这部分的更多细节。 + +如前所述,我的主页上有一个包含 Ant 脚本的 ZIP 文件,这个文件可以编译并且部署网站或者服务。(这个 ZIP 文件中也包含一个 `novels.war` 的副本。)对于“小说”这个例子,命令的示例(`%` 是命令行提示符)如下: + +``` +% ant -Dwar.name=novels deploy +``` + +这个命令首先会编译 Java 源代码,并且创建一个可部署的 `novels.war` 文件,然后将这个文件保存在当前目录中,再复制到 `TOMCAT_HOME/webapps` 目录中。如果一切顺利,`GET` 请求(使用浏览器或者命令行工具,比如 `curl`)可以用来做一个测试: + +``` +% curl http://localhost:8080/novels/ +``` + +默认情况下,Tomcat 设置为 热部署hot deploys:Web 服务器不需要关闭就可以进行部署、更新或者移除一个 web 应用。 + +### “小说”服务的代码 + +让我们回到“小说”这个例子,不过是在代码层面。考虑下面的 `Novel` 类: + +#### 例 1:Novel 类 + +```java +package novels; + +import java.io.Serializable; + +public class Novel implements Serializable, Comparable { +    static final long serialVersionUID = 1L; +    private String author; +    private String title; +    private int id; + +    public Novel() { } + +    public void setAuthor(final String author) { this.author = author; } +    public String getAuthor() { return this.author; } +    public void setTitle(final String title) { this.title = title; } +    public String getTitle() { return this.title; } +    public void setId(final int id) { this.id = id; } +    public int getId() { return this.id; } + +    public int compareTo(final Novel other) { return this.id - other.id; } +} +``` + +这个类实现了 `Comparable` 接口中的 `compareTo` 方法,因为 `Novel` 实例是存储在一个线程安全的无序 `ConcurrentHashMap` 中。在响应查看集合的请求时,“小说”服务会对从映射中提取的集合(一个 `ArrayList`)进行排序;`compareTo` 的实现通过 `Novel` 的 ID 将它按升序排序。 + +`Novels` 类中包含多个实用工具函数: + +#### 例 2:Novels 实用工具类 + +```java +package novels; + +import java.io.IOException; +import java.io.File; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.BufferedReader; +import java.nio.file.Files; +import java.util.stream.Stream; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.Collections; +import java.beans.XMLEncoder; +import javax.servlet.ServletContext; // not in JavaSE +import org.json.JSONObject; +import org.json.XML; + +public class Novels { +    private final String fileName = "/WEB-INF/data/novels.db"; +    private ConcurrentMap novels; +    private ServletContext sctx; +    private AtomicInteger mapKey; + +    public Novels() { +        novels = new ConcurrentHashMap(); +        mapKey = new AtomicInteger(); +    } + +    public void setServletContext(ServletContext sctx) { this.sctx = sctx; } +    public ServletContext getServletContext() { return this.sctx; } + +    public ConcurrentMap getConcurrentMap() { +        if (getServletContext() == null) return null; // not initialized +        if (novels.size() < 1) populate(); +        return this.novels; +    } + +    public String toXml(Object obj) { // default encoding +        String xml = null; +        try { +            ByteArrayOutputStream out = new ByteArrayOutputStream(); +            XMLEncoder encoder = new XMLEncoder(out); +            encoder.writeObject(obj); +            encoder.close(); +            xml = out.toString(); +        } +        catch(Exception e) { } +        return xml; +    } + +    public String toJson(String xml) { // option for requester +        try { +            JSONObject jobt = XML.toJSONObject(xml); +            return jobt.toString(3); // 3 is indentation level +        } +        catch(Exception e) { } +        return null; +    } + +    public int addNovel(Novel novel) { +        int id = mapKey.incrementAndGet(); +        novel.setId(id); +        novels.put(id, novel); +        return id; +    } + +    private void populate() { +        InputStream in = sctx.getResourceAsStream(this.fileName); +        // Convert novel.db string data into novels. +        if (in != null) { +            try { +                InputStreamReader isr = new InputStreamReader(in); +                BufferedReader reader = new BufferedReader(isr); + +                String record = null; +                while ((record = reader.readLine()) != null) { +                    String[] parts = record.split("!"); +                    if (parts.length == 2) { +                        Novel novel = new Novel(); +                        novel.setAuthor(parts[0]); +                        novel.setTitle(parts[1]); +                        addNovel(novel); // sets the Id, adds to map +                    } +                } +                in.close(); +            } +            catch (IOException e) { } +        } +    } +} +``` + +最复杂的方法是 `populate`,这个方法从一个包含在 WAR 文件中的文本文件读取。这个文本文件包括了“小说”的初始集合。要打开此文件,`populate` 方法需要 `ServletContext`,这是一个 Java 映射类型,包含了关于嵌入在 servlet 容器中的 servlet 的所有关键信息。这个文本文件有包含了像下面这样的记录: + +``` +Jane Austen!Persuasion +``` + +这一行被解析为两部分(作者和标题),由感叹号(`!`)分隔。然后这个方法创建一个 `Novel` 实例,设置作者和标题属性,并且将“小说”加到容器中,保存在内存中。 + +`Novels` 类也有一些实用工具函数,可以将“小说”容器编码为 XML 或 JSON,取决于发出请求的人所要求的格式。默认是 XML 格式,但是也可以请求 JSON 格式。一个轻量级的 XML 转 JSON 包提供了 JSON。下面是关于编码的更多细节。 + +#### 例 3:NovelsServlet 类 + +```java +package novels; + +import java.util.concurrent.ConcurrentMap; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.beans.XMLEncoder; +import org.json.JSONObject; +import org.json.XML; + +public class NovelsServlet extends HttpServlet { +    static final long serialVersionUID = 1L; +    private Novels novels; // back-end bean + +    // Executed when servlet is first loaded into container. +    @Override +    public void init() { +        this.novels = new Novels(); +        novels.setServletContext(this.getServletContext()); +    } + +    // GET /novels +    // GET /novels?id=1 +    @Override +    public void doGet(HttpServletRequest request, HttpServletResponse response) { +        String param = request.getParameter("id"); +        Integer key = (param == null) ? null : Integer.valueOf((param.trim())); + +        // Check user preference for XML or JSON by inspecting +        // the HTTP headers for the Accept key. +        boolean json = false; +        String accept = request.getHeader("accept"); +        if (accept != null && accept.contains("json")) json = true; + +        // If no query string, assume client wants the full list. +        if (key == null) { +            ConcurrentMap map = novels.getConcurrentMap(); +            Object list = map.values().toArray(); +            Arrays.sort(list); + +            String payload = novels.toXml(list);        // defaults to Xml +            if (json) payload = novels.toJson(payload); // Json preferred? +            sendResponse(response, payload); +        } +        // Otherwise, return the specified Novel. +        else { +            Novel novel = novels.getConcurrentMap().get(key); +            if (novel == null) { // no such Novel +                String msg = key + " does not map to a novel.\n"; +                sendResponse(response, novels.toXml(msg)); +            } +            else { // requested Novel found +                if (json) sendResponse(response, novels.toJson(novels.toXml(novel))); +                else sendResponse(response, novels.toXml(novel)); +            } +        } +    } + +    // POST /novels +    @Override +    public void doPost(HttpServletRequest request, HttpServletResponse response) { +        String author = request.getParameter("author"); +        String title = request.getParameter("title"); + +        // Are the data to create a new novel present? +        if (author == null || title == null) +            throw new RuntimeException(Integer.toString(HttpServletResponse.SC_BAD_REQUEST)); + +        // Create a novel. +        Novel n = new Novel(); +        n.setAuthor(author); +        n.setTitle(title); + +        // Save the ID of the newly created Novel. +        int id = novels.addNovel(n); + +        // Generate the confirmation message. +        String msg = "Novel " + id + " created.\n"; +        sendResponse(response, novels.toXml(msg)); +    } + +    // PUT /novels +    @Override +    public void doPut(HttpServletRequest request, HttpServletResponse response) { +        /* A workaround is necessary for a PUT request because Tomcat does not +           generate a workable parameter map for the PUT verb. */ +        String key = null; +        String rest = null; +        boolean author = false; + +        /* Let the hack begin. */ +        try { +            BufferedReader br = +                new BufferedReader(new InputStreamReader(request.getInputStream())); +            String data = br.readLine(); +            /* To simplify the hack, assume that the PUT request has exactly +               two parameters: the id and either author or title. Assume, further, +               that the id comes first. From the client side, a hash character +               # separates the id and the author/title, e.g., + +                  id=33#title=War and Peace +            */ +            String[] args = data.split("#");      // id in args[0], rest in args[1] +            String[] parts1 = args[0].split("="); // id = parts1[1] +            key = parts1[1]; + +            String[] parts2 = args[1].split("="); // parts2[0] is key +            if (parts2[0].contains("author")) author = true; +            rest = parts2[1]; +        } +        catch(Exception e) { +            throw new RuntimeException(Integer.toString(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); +        } + +        // If no key, then the request is ill formed. +        if (key == null) +            throw new RuntimeException(Integer.toString(HttpServletResponse.SC_BAD_REQUEST)); + +        // Look up the specified novel. +        Novel p = novels.getConcurrentMap().get(Integer.valueOf((key.trim()))); +        if (p == null) { // not found +            String msg = key + " does not map to a novel.\n"; +            sendResponse(response, novels.toXml(msg)); +        } +        else { // found +            if (rest == null) { +                throw new RuntimeException(Integer.toString(HttpServletResponse.SC_BAD_REQUEST)); +            } +            // Do the editing. +            else { +                if (author) p.setAuthor(rest); +                else p.setTitle(rest); + +                String msg = "Novel " + key + " has been edited.\n"; +                sendResponse(response, novels.toXml(msg)); +            } +        } +    } + +    // DELETE /novels?id=1 +    @Override +    public void doDelete(HttpServletRequest request, HttpServletResponse response) { +        String param = request.getParameter("id"); +        Integer key = (param == null) ? null : Integer.valueOf((param.trim())); +        // Only one Novel can be deleted at a time. +        if (key == null) +            throw new RuntimeException(Integer.toString(HttpServletResponse.SC_BAD_REQUEST)); +        try { +            novels.getConcurrentMap().remove(key); +            String msg = "Novel " + key + " removed.\n"; +            sendResponse(response, novels.toXml(msg)); +        } +        catch(Exception e) { +            throw new RuntimeException(Integer.toString(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); +        } +    } + +    // Methods Not Allowed +    @Override +    public void doTrace(HttpServletRequest request, HttpServletResponse response) { +        throw new RuntimeException(Integer.toString(HttpServletResponse.SC_METHOD_NOT_ALLOWED)); +    } + +    @Override +    public void doHead(HttpServletRequest request, HttpServletResponse response) { +        throw new RuntimeException(Integer.toString(HttpServletResponse.SC_METHOD_NOT_ALLOWED)); +    } + +    @Override +    public void doOptions(HttpServletRequest request, HttpServletResponse response) { +        throw new RuntimeException(Integer.toString(HttpServletResponse.SC_METHOD_NOT_ALLOWED)); +    } + +    // Send the response payload (Xml or Json) to the client. +    private void sendResponse(HttpServletResponse response, String payload) { +        try { +            OutputStream out = response.getOutputStream(); +            out.write(payload.getBytes()); +            out.flush(); +        } +        catch(Exception e) { +            throw new RuntimeException(Integer.toString(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); +        } +    } +} +``` + +上面的 `NovelsServlet` 类继承了 `HttpServlet` 类,`HttpServlet` 类继承了 `GenericServlet` 类,后者实现了 `Servlet` 接口: + +```java +NovelsServlet extends HttpServlet extends GenericServlet implements Servlet +``` + +从名字可以很清楚的看出来,`HttpServlet` 是为实现 HTTP(S) 上的 servlet 设计的。这个类提供了以标准 HTTP 请求动词(官方说法,方法methods)命名的空方法: + + * `doPost` (Post = 创建) + * `doGet` (Get = 读取) + * `doPut` (Put = 更新) + * `doDelete` (Delete = 删除) + +其他一些 HTTP 动词也会涉及到。`HttpServlet` 的子类,比如 `NovelsServlet`,会重载相关的 `do` 方法,并且保留其他方法为no-ops。`NovelsServlet` 重载了七个 `do` 方法。 + +每个 `HttpServlet` 的 CRUD 方法都有两个相同的参数。下面以 `doPost` 为例: + +```java +public void doPost(HttpServletRequest request, HttpServletResponse response) { +``` + +`request` 参数是一个 HTTP 请求信息的映射,而 `response` 提供了一个返回给请求者的输出流。像 `doPost` 的方法,结构如下: + + * 读取 `request` 信息,采取任何适当的措施生成一个响应。如果该信息丢失或者损坏了,就会生成一个错误。 + * 使用提取的请求信息来执行适当的 CRUD 操作(在本例中,创建一个 `Novel`),然后使用 `response` 输出流为请求者编码一个适当的响应。在 `doPost` 例子中,响应就是已经成功生成一个新“小说”并且添加到容器中的一个确认。当响应被发送后,输出流就关闭了,同时也将连接关闭了。 + +### 关于方法重载的更多内容 + +HTTP 请求的格式相对比较简单。下面是一个非常熟悉的 HTTP 1.1 的格式,注释由双井号分隔: + +``` +GET /novels              ## start line +Host: localhost:8080     ## header element +Accept-type: text/plain  ## ditto +... +[body]                   ## POST and PUT only +``` + +第一行由 HTTP 动词(在本例中是 `GET`)和以名词(在本例中是 `novels`)命名目标资源的 URI 开始。报头中包含键-值对,用冒号分隔左面的键和右面的值。报头中的键 `Host`(大小写敏感)是必须的;主机名 `localhost` 是当前机器上的本地符号地址,`8080` 端口是 Tomcat web 服务器上等待 HTTP 请求的默认端口。(默认情况下,Tomcat 在 8443 端口上监听 HTTP 请求。)报头元素可以以任意顺序出现。在这个例子中,`Accept-type` 报头的值是 MIME 类型 `text/plain`。 + +一些请求(特别是 `POST` 和 `PUT`)会有报文,而其他请求(特别是 `GET` 和 `DELETE`)没有。如果有报文(可能为空),以两个换行符将报头和报文分隔开;HTTP 报文包含一系列键-值对。对于无报文的请求,比如说查询字符串,报头元素就可以用来发送信息。下面是一个用 ID 2 对 `/novels` 资源的 `GET` 请求: + +``` +GET /novels?id=2 +``` + +通常来说,查询字符串以问号开始,并且包含一个键-值对,尽管这个键-值可能值为空。 + +带有 `getParameter` 和 `getParameterMap` 等方法的 `HttpServlet` 很好地回避了有报文和没有报文的 HTTP 请求之前的差异。在“小说”例子中,`getParameter` 方法用来从 `GET`、`POST` 和 `DELETE` 方法中提取所需的信息。(处理 `PUT` 请求需要更底层的代码,因为 Tomcat 没有提供可以解析 `PUT` 请求的参数映射。)下面展示了一段在 `NovelsServlet` 中被重载的 `doPost` 方法: + +```java +@Override +public void doPost(HttpServletRequest request, HttpServletResponse response) { +   String author = request.getParameter("author"); +   String title = request.getParameter("title"); +   ... +``` + +对于没有报文的 `DELETE` 请求,过程基本是一样的: + +```java +@Override +public void doDelete(HttpServletRequest request, HttpServletResponse response) { +   String param = request.getParameter("id"); // id of novel to be removed +   ... +``` + +`doGet` 方法需要区分 `GET` 请求的两种方式:一种是“获得所有”,而另一种是“获得某一个”。如果 `GET` 请求 URL 中包含一个键是一个 ID 的查询字符串,那么这个请求就被解析为“获得某一个”: + +``` +http://localhost:8080/novels?id=2  ## GET specified +``` + +如果没有查询字符串,`GET` 请求就会被解析为“获得所有”: + +``` +http://localhost:8080/novels       ## GET all +``` + +### 一些值得注意的细节 + +“小说”服务的设计反映了像 Tomcat 这样基于 Java 的 web 服务器是如何工作的。在启动时,Tomcat 构建一个线程池,从中提取请求处理程序,这种方法称为 “每个请求一个线程one thread per request” 模型。现在版本的 Tomcat 使用非阻塞 I/O 来提高个性能。 + +“小说”服务是作为 `NovelsServlet` 类的单个实例来执行的,该实例也就维护了一个“小说”集合。相应的,也就会出现竞态条件,比如出现两个请求同时被处理: + + * 一个请求向集合中添加一个新“小说”。 + * 另一个请求获得集合中的所有“小说”。 + +这样的结果是不确定的,取决与 _读_ 和 _写_ 的操作是以怎样的顺序进行操作的。为了避免这个问题,“小说”服务使用了线程安全的 `ConcurrentMap`。这个映射的关键是生成了一个线程安全的 `AtomicInteger`。下面是相关的代码片段: + +```java +public class Novels { +    private ConcurrentMap novels; +    private AtomicInteger mapKey; +    ... +``` + +默认情况下,对客户端请求的响应被编码为 XML。为了简单,“小说”程序使用了以前的 `XMLEncoder` 类;另一个包含更丰富功能的方式是使用 JAX-B 库。代码很简单: + +```java +public String toXml(Object obj) { // default encoding +   String xml = null; +   try { +      ByteArrayOutputStream out = new ByteArrayOutputStream(); +      XMLEncoder encoder = new XMLEncoder(out); +      encoder.writeObject(obj); +      encoder.close(); +      xml = out.toString(); +   } +   catch(Exception e) { } +   return xml; +} +``` + +`Object` 参数要么是一个有序的“小说” `ArraList`(用以响应“获得所有get all”请求),要么是一个 `Novel` 实例(用以响应“获得一个get one”请求),又或者是一个 `String`(确认消息)。 + +如果 HTTP 请求报头指定 JSON 作为所需要的类型,那么 XML 就被转化成 JSON。下面是 `NovelsServlet` 中的 `doGet` 方法中的检查: + +```java +String accept = request.getHeader("accept"); // "accept" is case insensitive +if (accept != null && accept.contains("json")) json = true; +``` + +`Novels`类中包含了 `toJson` 方法,可以将 XML 转换成 JSON: + +```java +public String toJson(String xml) { // option for requester +   try { +      JSONObject jobt = XML.toJSONObject(xml); +      return jobt.toString(3); // 3 is indentation level +   } +   catch(Exception e) { } +   return null; +} +``` + +`NovelsServlet`会对各种类型进行错误检查。比如,`POST` 请求应该包含新“小说”的作者和标题。如果有一个丢了,`doPost` 方法会抛出一个异常: + +```java +if (author == null || title == null) +   throw new RuntimeException(Integer.toString(HttpServletResponse.SC_BAD_REQUEST)); +``` + +`SC_BAD_REQUEST` 中的 `SC` 代表的是 状态码status code,`BAD_REQUEST` 的标准 HTTP 数值是 400。如果请求中的 HTTP 动词是 `TRACE`,会返回一个不同的状态码: + +```java +public void doTrace(HttpServletRequest request, HttpServletResponse response) { +   throw new RuntimeException(Integer.toString(HttpServletResponse.SC_METHOD_NOT_ALLOWED)); +} +``` + +### 测试“小说”服务 + +用浏览器测试 web 服务会很不顺手。在 CRUD 动词中,现代浏览器只能生成 `POST`(创建)和 `GET`(读取)请求。甚至从浏览器发送一个 `POST` 请求都有点不好办,因为报文需要包含键-值对;这样的测试通常通过 HTML 表单完成。命令行工具,比如说 [curl][21],是一个更好的选择,这个部分展示的一些 `curl` 命令,已经包含在我网站的 ZIP 文件中了。 + +下面是一些测试样例,没有展示相应的输出结果: + +``` +% curl localhost:8080/novels/ +% curl localhost:8080/novels?id=1 +% curl --header "Accept: application/json" localhost:8080/novels/ +``` + +第一条命令请求所有“小说”,默认是 XML 编码。第二条命令请求 ID 为 1 的“小说”,XML 编码。最后一条命令通过 `application/json` 添加了 `Accept` 报头元素,作为所需要的 MIME 类型。“获得一个get one”命令也可以用这个报头。这些请求用了 JSON 而不是 XML 编码作为响应。 + +下面两条命令在集合中创建了一个新“小说”,并且确认添加了进去: + +``` +% curl --request POST --data "author=Tolstoy&title=War and Peace" localhost:8080/novels/ +% curl localhost:8080/novels?id=4 +``` + +`curl` 中的 `PUT` 命令与 `POST` 命令相似,不同的地方是 `PUT` 的报文没有使用标准的语法。在 `NovelsServlet` 中关于 `doPut` 方法的文档中有详细的介绍,但是简单来说,Tomcat 不会对 `PUT` 请求生成合适的映射。下面是一个 `PUT` 命令和确认命令的的例子: + +``` +% curl --request PUT --data "id=3#title=This is an UPDATE" localhost:8080/novels/ +% curl localhost:8080/novels?id=3 +``` + +第二个命令确认了集合已经更新。 + +最后,`DELETE` 命令会正常运行: + +``` +% curl --request DELETE localhost:8080/novels?id=2 +% curl localhost:8080/novels/ +``` + +这个请求是删除 ID 为 2 的“小说”。第二个命令会显示剩余的“小说”。 + +### web.xml 配置文件 + +尽管官方规定它是可选的,`web.xml` 配置文件是一个生产级别网站或服务的重要组成部分。这个配置文件可以配置独立于代码的路由、安全性,或者网站或服务的其他功能。“小说”服务的配置通过为该服务的请求分配一个 URL 模式来配置路由: + +```xml + + +    novels +    novels.NovelsServlet +    novels +    /* + +``` + +`servlet-name` 元素为 servlet 全名(`novels.NovelsServlet`)提供了一个缩写(`novels`),然后这个名字在下面的 `servlet-mapping` 元素中使用。 + +回想一下,一个已部署服务的 URL 会在端口号后面有 WAR 文件的文件名: + +``` +http://localhost:8080/novels/ +``` + +端口号后斜杠后的 URI,是所请求资源的“路径”,在这个例子中,就是“小说”服务。因此,`novels` 出现在了第一个单斜杠后。 + +在 `web.xml` 文件中,`url-patter` 被指定为 `/*`,代表 “以 `/novels` 为起始的任意路径”。假设 Tomcat 遇到了一个不存在的 URL,像这样: + +``` +http://localhost:8080/novels/foobar/ +``` + +`web.xml` 配置也会指定这个请求被分配到“小说” servlet 中,因为 `/*` 模式也包含 `/foobar`。因此,这个不存在的 URL 也会得到像上面合法路径的相同结果。 + +生产级别的配置文件可能会包含安全相关的信息,包括连接级别wire-level用户角色users-roles。即使在这种情况下,配置文件的大小也只会是这个例子中的两到三倍大。 + +### 总结 + +`HttpServlet` 是 Java web 技术的核心。像“小说”这样的网站或 web 服务继承了这个类,并且根据需求重载了相应的 `do` 动词方法。像 Jersay(JAX-RS)或 Restlet 这样的 Restful 框架通过提供定制的 servlet 完成了基本相同的功能,针对框架中的 web 应用程序的请求,这个 servlet 扮演着 HTTP(S) 终端endpoint的角色。 + +当然,基于 servlet 的应用程序可以访问 web 应用程序中所需要的任何 Java 库。如果应用程序遵循关注点分离separation-of-concerns原则,那么 servlet 代码仍然相当简单:代码会检查请求,如果存在缺陷,就会发出适当的错误;否则,代码会调用所需要的功能(比如,查询数据库,以特定格式为响应编码),然后向请求这发送响应。`HttpServletRequest` 和 `HttpServletReponse` 类型使得读取请求和编写响应变得简单。 + +Java 的 API 可以从非常简单变得相当复杂。如果你需要用 Java 交付一些 Restful 服务的话,我的建议是在做其他事情之前先尝试一下简单的 `HttpServlet`。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/restful-services-java + +作者:[Marty Kalin][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/mkalindepauledu +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: http://xmlrpc.com/ +[3]: https://en.wikipedia.org/wiki/Representational_state_transfer +[4]: https://www.redhat.com/en/topics/integration/whats-the-difference-between-soap-rest +[5]: http://tomcat.apache.org/ +[6]: https://condor.depaul.edu/mkalin +[7]: https://tomcat.apache.org/download-90.cgi +[8]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+serializable +[9]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[10]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+integer +[11]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+object +[12]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+bytearrayoutputstream +[13]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+exception +[14]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+inputstream +[15]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+inputstreamreader +[16]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+bufferedreader +[17]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+ioexception +[18]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+arrays +[19]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+runtimeexception +[20]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+outputstream +[21]: https://curl.haxx.se/ diff --git a/published/202008/20200716 Summarizing your command usage on Linux.md b/published/202008/20200716 Summarizing your command usage on Linux.md new file mode 100644 index 0000000000..ef0b331fb1 --- /dev/null +++ b/published/202008/20200716 Summarizing your command usage on Linux.md @@ -0,0 +1,181 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12517-1.html) +[#]: subject: (Summarizing your command usage on Linux) +[#]: via: (https://www.networkworld.com/article/3567050/summarizing-your-command-usage-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +汇总你在 Linux 上的命令使用情况 +====== + +> 使用合适的命令,你可以快速了解 Linux 系统上使用的命令以及执行的频率。 + +![](https://img.linux.net.cn/data/attachment/album/202008/14/221303ln67fl62nsfb7nys.jpg) + +汇总 Linux 系统上使用的命令只需一串相对简单的命令以及几条管道将它们绑定在一起。当你的历史记录缓冲区保留了最近的 1,000 或 2,000 条命令时,总结你的命令活动可能会变得很乏味。这篇文章提供了一种方便的方法来汇总命令的使用情况,并高亮显示最常用的命令。 + +首先,请记住,典型的命令历史记录可能看起来像这样。请注意,命令是显示在命令序列号之后,并紧跟其参数。 + +``` +91 sudo apt-get install ccrypt + ^ + +-- command +``` + +请注意,`history` 命令遵循 `HISTSIZE` 的设置,这会决定保留多少条命令。可能是 500、1,000 或更多。如果你不喜欢它的设置,那么可以在 `.bashrc` 或其他启动文件中添加或更改 `HISTSIZE` 设置。 + +``` +$ echo $HISTSIZE +1000 +$ history | wc -l +1000 +$ grep HISTSIZE ~/.bashrc +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +``` + +记下大量命令的主要好处之一是,它可以让你轻松地重新运行过去使用的命令,而不必重新输入或记住它们。它还能让你轻松地查看你在一个任务中已经做了多少工作。单独使用 `history` 命令时,你会看到类似下面这样,最早的在最前面: + +``` +$ history + 7 vi tasks + 8 alias + 9 echo $HISTTIMEFORMAT + 10 history + 11 date + … +``` + +查看最新使用命令需要查看记录的命令的尾部: + +``` +$ history | tail -4 + 1007 echo $HISTSIZE + 1008 history | wc -l + 1009 history + 1010 history | tail -4 +``` + +另外,你可以使用 `tail` 命令查看 `.bash_history` 文件的尾部,但是 `history` 命令显示的数字可以让你输入如 `!1010` 这样的数字重新运行命令,这点通常更有用。 + +要提供已使用命令的汇总(例如 `vi` 和 `echo`),你可以首先使用 `awk` 将命令与 `history` 中保存的其他信息分隔开来: + +``` +$ history | awk '{print $2}' +vi +alias +echo +history +date +… +``` + +如果你将历史记录中的命令列表传递给 `sort` 命令以按字母顺序对命令进行分组,那么会得到以下内容: + +``` +$ history | awk '{print $2}' | sort +7z +7z +alias +apropos +cd +cd +… +``` + +接下来,将 `sort` 命令的输出传递给 `uniq -c` ,这将计算每个命令使用了多少次: + +``` +$ history | awk '{print $2}' | sort | uniq -c + 2 7z + 1 alias + 2 apropos + 38 cd + 21 chmod +… +``` + +最后,添加第二个 `sort` 命令按倒序对命令组计数进行排序,这将先列出最常用的命令: + +``` +$ history | awk '{print $2}' | sort | uniq -c | sort -nr + 178 ls + 95 vi + 63 cd + 53 sudo + 41 more +… +``` + +这样可以让你了解使用最多的命令,但不会包括任何你可能故意从历史记录文件中删除的命令,例如: + +``` +HISTIGNORE="pwd:clear:man:history" +``` + +### 当修改了历史记录格式时 + +对于默认的历史记录格式,`history` 命令输出中的第一个字段将是每个命令的序号,第二个字段是使用的命令。因此,上面所有 `awk` 命令都设置成显示 `$2`。 + +``` +$ alias cmds='history | awk '\''{print $2}'\'' | sort | uniq -c | sort -nr' +``` + +如果你像下面那样将日期和时间添加了到 `history` 命令中,那么你还必须修改所设置的别名: + +``` +$ echo $HISTTIMEFORMAT +%d/%m/%y %T +``` + +这个日期/时间信息有时会很有帮助,但是这意味着你必须在选择 `history` 命令的第 4 个字段而不是第 2 个字段来汇总命令,因为你的历史记录条目将如下所示: + +``` +91 05/07/20 16:37:39 sudo apt-get install ccrypt + ^ + +-- command +``` + +因此,在将 `$2` 变为 `$4` 之后,用于检查 `history` 命令的别名将改为这样: + +``` +$ alias cmds='history | awk '\''{print $4}'\'' | sort | uniq -c | sort -nr' +``` + +可将别名保存在 `.bashrc` 或其他启动文件中,请确保在 `$` 符号前面插入反斜杠,以便 bash 不会尝试解释 `$4`。 + +``` +alias cmds='history | awk '\''{print \$2}'\'' | uniq -c | sort -nr' +alias cmds='history | awk '\''{print \$4}'\'' | uniq -c | sort -nr' +``` + +请注意,日期和时间信息与命令本身保存在历史记录文件的不同行中。因此,添加此信息后,bash 历史记录文件的行数将增加一倍,尽管在 `history` 命令输出时不会: + +``` +$ wc -l .bash_history +2000 .bash_history +$ history | wc -l +1000 +``` + +### 总结 + +你可以随时决定要保留多少命令历史记录,哪些命令不值得记录,以使你的命令摘要最有用。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3567050/summarizing-your-command-usage-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://www.facebook.com/NetworkWorld/ +[2]: https://www.linkedin.com/company/network-world diff --git a/published/202008/20200717 Debug Linux using ProcDump.md b/published/202008/20200717 Debug Linux using ProcDump.md new file mode 100644 index 0000000000..237932ece5 --- /dev/null +++ b/published/202008/20200717 Debug Linux using ProcDump.md @@ -0,0 +1,406 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12533-1.html) +[#]: subject: (Debug Linux using ProcDump) +[#]: via: (https://opensource.com/article/20/7/procdump-linux) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) + +使用微软的 ProcDump 调试 Linux 进程 +====== + +> 用这个微软的开源工具,获取进程信息。 + +![](https://img.linux.net.cn/data/attachment/album/202008/20/095646k5wz7cd11vyc7lhr.jpg) + +微软越来越心仪 Linux 和开源,这并不是什么秘密。在过去几年中,该公司稳步地增加了对开源的贡献,包括将其部分软件和工具移植到 Linux。2018 年底,微软[宣布][2]将其 [Sysinternals][3] 的部分工具以开源的方式移植到 Linux,[Linux 版的 ProcDump][4]是其中的第一个。 + +如果你在 Windows 上从事过调试或故障排除工作,你可能听说过 Sysinternals,它是一个“瑞士军刀”工具集,可以帮助系统管理员、开发人员和 IT 安全专家监控和排除 Windows 环境的故障。 + +Sysinternals 最受欢迎的工具之一是 [ProcDump][5]。顾名思义,它用于将正在运行的进程的内存转储到磁盘上的一个核心文件中。然后可以用调试器对这个核心文件进行分析,了解转储时进程的状态。因为之前用过 Sysinternals,所以我很想试试 ProcDump 的 Linux 移植版。 + +### 开始使用 Linux 上的 ProcDump + +要试用 Linux 上的 ProcDump,你需要下载该工具并编译它。(我使用的是 Red Hat Enterprise Linux,尽管这些步骤在其他 Linux 发行版上应该是一样的): + +``` +$ cat /etc/redhat-release +Red Hat Enterprise Linux release 8.2 (Ootpa) +$ +$ uname -r +4.18.0-193.el8.x86_64 +$ +``` + +首先,克隆 Linux 版 ProcDump 的版本库。 + +``` +$ git clone https://github.com/microsoft/ProcDump-for-Linux.git +Cloning into 'ProcDump-for-Linux'... +remote: Enumerating objects: 40, done. +remote: Counting objects: 100% (40/40), done. +remote: Compressing objects: 100% (33/33), done. +remote: Total 414 (delta 14), reused 14 (delta 6), pack-reused 374 +Receiving objects: 100% (414/414), 335.28 KiB | 265.00 KiB/s, done. +Resolving deltas: 100% (232/232), done. +$ +$ cd ProcDump-for-Linux/ +$ +$ ls +azure-pipelines.yml  CONTRIBUTING.md  docs     INSTALL.md  Makefile    procdump.gif  src +CODE_OF_CONDUCT.md   dist             include  LICENSE     procdump.1  README.md     tests +$ +``` + +接下来,使用 `make` 构建程序。它能准确地输出编译源文件所需的 [GCC][6] 命令行参数。 + +``` +$ make +rm -rf obj +rm -rf bin +rm -rf /root/ProcDump-for-Linux/pkgbuild +gcc -c -g -o obj/Logging.o src/Logging.c -Wall -I ./include -pthread -std=gnu99 +gcc -c -g -o obj/Events.o src/Events.c -Wall -I ./include -pthread -std=gnu99 +gcc -c -g -o obj/ProcDumpConfiguration.o src/ProcDumpConfiguration.c -Wall -I ./include -pthread -std=gnu99 +gcc -c -g -o obj/Handle.o src/Handle.c -Wall -I ./include -pthread -std=gnu99 +gcc -c -g -o obj/Process.o src/Process.c -Wall -I ./include -pthread -std=gnu99 +gcc -c -g -o obj/Procdump.o src/Procdump.c -Wall -I ./include -pthread -std=gnu99 +gcc -c -g -o obj/TriggerThreadProcs.o src/TriggerThreadProcs.c -Wall -I ./include -pthread -std=gnu99 +gcc -c -g -o obj/CoreDumpWriter.o src/CoreDumpWriter.c -Wall -I ./include -pthread -std=gnu99 +gcc -o bin/procdump obj/Logging.o obj/Events.o obj/ProcDumpConfiguration.o obj/Handle.o obj/Process.o obj/Procdump.o obj/TriggerThreadProcs.o obj/CoreDumpWriter.o -Wall -I ./include -pthread -std=gnu99 +gcc -c -g -o obj/ProcDumpTestApplication.o tests/integration/ProcDumpTestApplication.c -Wall -I ./include -pthread -std=gnu99 +gcc -o bin/ProcDumpTestApplication obj/ProcDumpTestApplication.o -Wall -I ./include -pthread -std=gnu99 +$ +``` + +编译过程中会创建两个新的目录。第一个是 `obj/` 目录,存放编译期间创建的对象文件。第二个(也是更重要的)目录是 `bin/`,它是存储编译出的 `procdump` 程序的地方。它还会编译另一个名为 `ProcDumpTestApplication` 的测试二进制文件: + +``` +$ ls obj/ +CoreDumpWriter.o  Handle.o   ProcDumpConfiguration.o  ProcDumpTestApplication.o  TriggerThreadProcs.o +Events.o          Logging.o  Procdump.o               Process.o +$ +$ +$ ls bin/ +procdump  ProcDumpTestApplication +$ +$ file bin/procdump +bin/procdump: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=6e8827db64835ea0d1f0941ac3ecff9ee8c06e6b, with debug_info, not stripped +$ +$ file bin/ProcDumpTestApplication +bin/ProcDumpTestApplication: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c8fd86f53c07df142e52518815b2573d1c690e4e, with debug_info, not stripped +$ +``` + +在此情况下,每次运行 `procdump` 实用程序时,你都必须移动到 `bin/` 文件夹中。要使它在系统中的任何地方都可以使用,运行 `make install`。这将这个二进制文件复制到通常的 `bin/` 目录中,它是你的 shell `$PATH` 的一部分: + +``` +$ which procdump +/usr/bin/which: no procdump in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin) +$ +$ make install +mkdir -p //usr/bin +cp bin/procdump //usr/bin +mkdir -p //usr/share/man/man1 +cp procdump.1 //usr/share/man/man1 +$ +$ which procdump +/usr/bin/procdump +$ +``` + +安装时,ProcDump 提供了一个手册页,你可以用 `man procdump` 访问: + +``` +$ man procdump +$ +``` + +### 运行 ProcDump + +要转储一个进程的内存,你需要向 ProcDump 提供它的进程 ID(PID)。你可以使用机器上任何正在运行的程序或守护进程。在这个例子中,我将使用一个永远循环的小 C 程序。编译程序并运行它(要退出程序,按 `Ctrl+C`,如果程序在后台运行,则使用 `kill` 命令并输入 PID): + +``` +$ cat progxyz.c +#include + +int main() { +        for (;;) +        { +                printf("."); +                sleep(1); +        } +        return 0; +} +$ +$ gcc progxyz.c -o progxyz +$ +$ ./progxyz & +[1] 350498 +$ +``` + +运行该程序,你可以使用 `pgrep` 或 `ps` 找到它的 PID。记下 PID: + +``` +$ pgrep progxyz +350498 +$ +$ ps -ef | grep progxyz +root      350498  345445  0 03:29 pts/1    00:00:00 ./progxyz +root      350508  347350  0 03:29 pts/0    00:00:00 grep --color=auto progxyz +$ +``` + +当测试进程正在运行时,调用 `procdump` 并提供 PID。下面的输出表明了该进程的名称和 PID,并报告它生成了一个核心转储文件,并显示其文件名: + +``` +$ procdump -p 350498 + +ProcDump v1.1.1 - Sysinternals process dump utility +Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license. +Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi +Monitors a process and writes a dump file when the process exceeds the +specified criteria. + +Process:                progxyz (350498) +CPU Threshold:          n/a +Commit Threshold:       n/a +Polling interval (ms):  1000 +Threshold (s):  10 +Number of Dumps:        1 + +Press Ctrl-C to end monitoring without terminating the process. + +[03:30:00 - INFO]: Timed: +[03:30:01 - INFO]: Core dump 0 generated: progxyz_time_2020-06-24_03:30:00.350498 +$ +``` + +列出当前目录的内容,你应该可以看到新的核心文件。文件名与 `procdump` 命令显示的文件名一致,日期、时间、PID 都会附加在文件名上: + +``` +$ ls -l progxyz_time_2020-06-24_03\:30\:00.350498 +-rw-r--r--. 1 root root 356848 Jun 24 03:30 progxyz_time_2020-06-24_03:30:00.350498 +$ +$ file progxyz_time_2020-06-24_03\:30\:00.350498 +progxyz_time_2020-06-24_03:30:00.350498: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './progxyz', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './progxyz', platform: 'x86_64' +$ +``` + +### 用 GNU 项目调试器分析核心文件。 + +要查看是否可以读取该转储文件,调用 [GNU 项目调试器][7](`gdb`)。记得提供测试二进制文件的路径,这样你就可以看到堆栈上所有的函数名。在这里,`bt`(回溯)表明,当转储被采集时,`sleep()` 函数正在执行: + +``` +$ gdb -q ./progxyz ./progxyz_time_2020-06-24_03\:30\:00.350498 +Reading symbols from ./progxyz...(no debugging symbols found)...done. +[New LWP 350498] +Core was generated by `./progxyz'. +#0  0x00007fb6947e9208 in nanosleep () from /lib64/libc.so.6 +Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-101.el8.x86_64 +(gdb) bt +#0  0x00007fb6947e9208 in nanosleep () from /lib64/libc.so.6 +#1  0x00007fb6947e913e in sleep () from /lib64/libc.so.6 +#2  0x00000000004005f3 in main () +(gdb) +``` + +### gcore 怎么样? + +Linux 用户会很快指出,Linux 已经有一个叫 `gcore` 的命令,大多数 Linux 发行版都有这个命令,它的作用和 ProcDump 完全一样。你说的对。如果你从来没有使用过它,可以尝试用 `gcore` 来转储一个进程的核心。再次运行测试程序,然后运行 `gcore`,并提供 PID 作为参数: + +``` +$ ./progxyz & +[1] 350664 +$ +$ +$ pgrep progxyz +350664 +$ +$ +$ gcore 350664 +0x00007fefd3be2208 in nanosleep () from /lib64/libc.so.6 +Saved corefile core.350664 +[Inferior 1 (process 350664) detached] +$ +``` + +`gcore` 打印一条消息,说它已将核心文件保存到一个特定的文件中。检查当前目录,找到这个核心文件,然后再次使用 `gdb` 加载它: + +``` +$ +$ ls -l  core.350664 +-rw-r--r--. 1 root root 356848 Jun 24 03:34 core.350664 +$ +$ +$ file core.350664 +core.350664: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './progxyz', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './progxyz', platform: 'x86_64' +$ +$ gdb -q ./progxyz ./core.350664 +Reading symbols from ./progxyz...(no debugging symbols found)...done. +[New LWP 350664] +Core was generated by `./progxyz'. +#0  0x00007fefd3be2208 in nanosleep () from /lib64/libc.so.6 +Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-101.el8.x86_64 +(gdb) bt +#0  0x00007fefd3be2208 in nanosleep () from /lib64/libc.so.6 +#1  0x00007fefd3be213e in sleep () from /lib64/libc.so.6 +#2  0x00000000004005f3 in main () +(gdb) q +$ +``` + +为了使 `gcore` 可以工作,你需要确保以下设置到位。首先,确保为核心文件设置了 `ulimit`,如果设置为 `0`,核心文件将不会被生成。第二,确保 `/proc/sys/kernel/core_pattern` 有正确的设置来指定核心模式: + +``` +$ ulimit -c +unlimited +$ +``` + +### 你应该使用 ProcDump 还是 gcore? + +有几种情况下,你可能更喜欢使用 ProcDump 而不是 gcore,ProcDump 有一些内置的功能,在一些情况下可能很有用。 + +#### 等待测试二进制文件的执行 + +无论是使用 ProcDump 还是 gcore,测试进程必须被执行并处于运行状态,这样才能提供一个 PID 来生成核心文件。但 ProcDump 有一个功能,就是等待特定的二进制文件运行,一旦发现运行的测试二进制文件与给定的名称相匹配,它就会为该测试二进制文件生成一个核心文件。它可以使用 `-w` 参数和程序名称而不是 PID 来启用。这个功能在测试程序快速退出的情况下很有用。 + +下面是它的工作原理。在这个例子中,没有名为 `progxyz` 的进程在运行: + +``` +$ pgrep progxyz +$ +``` + +用 `-w` 参数调用 `procdump`,让它保持等待。在另一个终端,调用测试二进制 `progxyz`: + +``` +$ procdump -w progxyz + +ProcDump v1.1.1 - Sysinternals process dump utility +Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license. +Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi +Monitors a process and writes a dump file when the process exceeds the +specified criteria. + +Process:                progxyz (pending) +CPU Threshold:          n/a +Commit Threshold:       n/a +Polling interval (ms):  1000 +Threshold (s):  10 +Number of Dumps:        1 + +Press Ctrl-C to end monitoring without terminating the process. + +[03:39:23 - INFO]: Waiting for process 'progxyz' to launch... +``` + +然后,从另一个终端调用测试二进制 `progxyz`: + +``` +$ ./progxyz & +[1] 350951 +$ +``` + +ProcDump 立即检测到该二进制正在运行,并转储这个二进制的核心文件: + +``` +[03:39:23 - INFO]: Waiting for process 'progxyz' to launch... +[03:43:22 - INFO]: Found process with PID 350951 +[03:43:22 - INFO]: Timed: +[03:43:23 - INFO]: Core dump 0 generated: progxyz_time_2020-06-24_03:43:22.350951 +$ + +$ ls -l progxyz_time_2020-06-24_03\:43\:22.350951 +-rw-r--r--. 1 root root 356848 Jun 24 03:43 progxyz_time_2020-06-24_03:43:22.350951 +$ +$ file progxyz_time_2020-06-24_03\:43\:22.350951 +progxyz_time_2020-06-24_03:43:22.350951: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './progxyz', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './progxyz', platform: 'x86_64' +$ +``` + +#### 多个核心转储 + +另一个重要的 ProcDump 功能是,你可以通过使用命令行参数 `-n ` 指定要生成多少个核心文件。核心转储之间的默认时间间隔是 `10` 秒,但你可以使用 `-s ` 参数修改。这个例子使用 ProcDump 对测试二进制文件进行了三次核心转储: + +``` +$ ./progxyz & +[1] 351014 +$ +$ procdump -n 3 -p 351014 + +ProcDump v1.1.1 - Sysinternals process dump utility +Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license. +Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi +Monitors a process and writes a dump file when the process exceeds the +specified criteria. + +Process:                progxyz (351014) +CPU Threshold:          n/a +Commit Threshold:       n/a +Polling interval (ms):  1000 +Threshold (s):  10 +Number of Dumps:        3 + +Press Ctrl-C to end monitoring without terminating the process. + +[03:45:20 - INFO]: Timed: +[03:45:21 - INFO]: Core dump 0 generated: progxyz_time_2020-06-24_03:45:20.351014 +[03:45:31 - INFO]: Timed: +[03:45:32 - INFO]: Core dump 1 generated: progxyz_time_2020-06-24_03:45:31.351014 +[03:45:42 - INFO]: Timed: +[03:45:44 - INFO]: Core dump 2 generated: progxyz_time_2020-06-24_03:45:42.351014 +$ +$ ls -l progxyz_time_2020-06-24_03\:45\:* +-rw-r--r--. 1 root root 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:20.351014 +-rw-r--r--. 1 root root 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:31.351014 +-rw-r--r--. 1 root root 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:42.351014 +$ +``` + +#### 基于 CPU 和内存使用情况的核心转储 + +ProcDump 还可以让你在测试二进制或进程达到一定的 CPU 或内存阈值时触发核心转储。ProcDump 的手册页显示了调用 ProcDump 时使用的命令行参数: + +- `-C`:当 CPU 超过或等于指定值时,触发核心转储生成(0 到 100 * nCPU)。 +- `-c`:当 CPU 小于指定值时,触发核心转储生成(0 到 100 * nCPU)。  +- `-M`:当内存提交超过或等于指定值(MB)时,触发核心转储生成。 +- `-m`:当内存提交小于指定值(MB)时,触发核心转储生成。 +- `-T`:当线程数超过或等于指定值时触发。 +- `-F`:当文件描述符数量超过或等于指定值时触发。 +- `-I`:轮询频率,单位为毫秒(默认为 1000)。 + +例如,当给定 PID 的 CPU 使用率超过 70% 时,可以要求 ProcDump 转储核心: + +``` +procdump -C 70 -n 3 -p 351014 +``` + +### 结论 + +ProcDump 是一长串被移植到 Linux 的 Windows 程序中的一个有趣的补充。它不仅为 Linux 用户提供了额外的工具选择,而且可以让 Windows 用户在 Linux 上工作时更有熟悉的感觉。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/procdump-linux + +作者:[Gaurav Kamathe][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/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/dumptruck_car_vehicle_storage_container_road.jpg?itok=TWK0CbX_ (Dump truck rounding a turn in the road) +[2]: https://www.zdnet.com/article/microsoft-working-on-porting-sysinternals-to-linux/ +[3]: https://docs.microsoft.com/en-us/sysinternals/ +[4]: https://github.com/Microsoft/ProcDump-for-Linux +[5]: https://docs.microsoft.com/en-us/sysinternals/downloads/procdump +[6]: https://gcc.gnu.org/ +[7]: https://www.gnu.org/software/gdb/ diff --git a/published/202008/20200717 Decentralized Messaging App Riot Rebrands to Element.md b/published/202008/20200717 Decentralized Messaging App Riot Rebrands to Element.md new file mode 100644 index 0000000000..ffa0796b6d --- /dev/null +++ b/published/202008/20200717 Decentralized Messaging App Riot Rebrands to Element.md @@ -0,0 +1,74 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12563-1.html) +[#]: subject: (Decentralized Messaging App Riot Rebrands to Element) +[#]: via: (https://itsfoss.com/riot-to-element/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +去中心化的消息应用 Riot 改名为 Element +====== + +Riot 曾经是,现在也是一款基于开源 Matrix 协议的去中心化即时通讯应用。 + +6 月底,Riot 即时通讯客户端宣布将改名。他们透露,他们的新名字是 [Element][1]。让我们来看看 Riot 为什么要改名,还有哪些要改。 + +### 为什么从 Riot 改名为 Element? + +![][2] + +在说到最新的公告之前,我们先来看看他们当初为什么要改名。 + +根据 6 月 23 日的一篇[博客文章][3],该组织改名有三个原因。 + +首先,他们表示“某大型游戏公司”曾多次阻止他们注册 Riot 和 Riot.im 产品名称的商标。如果要我猜的话,他们可能指的就是这家[“游戏公司”][4])。 + +其次,他们选择 Riot 这个名字的初衷是为了“唤起一些破坏性和活力的东西”。他们担心人们反而认为这个应用是“专注于暴力”。我想,当前的情形下,这个名字并不算好。 + +第三,他们希望澄清 Riot 涉及的众多品牌名称所造成的混乱。例如,Riot 是由一家名为 New Vector 的公司创建的,而 Riot 是托管在 Modular 上,Modular 也是 New Vector 的产品。他们希望简化他们的命名系统,以避免混淆潜在客户。当人们寻找消息解决方案时,他们希望他们只需要寻找一个名字:Element。 + +### 元素即一切 + +![][5] + +从 7 月 15 日开始,该应用的名称和公司的名称已经改为 Element(元素)。他们的 Matrix 托管服务现在将被称为 Element Matrix Services。他们的公告很好地总结了这一点。 + +> “对于那些第一次发现我们的人来说,Element 是 Matrix 通信网络中的旗舰级安全协作应用。Element 让你拥有自己的端到端加密聊天服务器,同时还能与更广泛的 Matrix 网络中的其他人连接。” + +他们之所以选择 Element 这个名字,是因为它“反映了我们在设计 RiotX 时对简单和清晰的强调;这个名字突出了我们一心一意将 Element 打造成可以想象的最优雅和最实用的主流通讯应用的使命”。他们还说,他们想要一个“能唤起数据所有权和自我主权的概念”的名字。他们还认为这是一个很酷的名字。 + +### 除了改个名之外 + +![][6] + +最近的公告也表明,此举不仅仅是简单的改名。Element 还发布了“新一代安卓版 Matrix 客户端”。该客户端的前身是 RiotX,现在改名为 Element。(还有呢?)它对以前的客户端进行了彻底的重写,现在支持 VoIP 通话和小部件。Element 还将在 iOS 上推出,支持 iOS 13,并提供“全新的推送通知支持”。 + +Element Web 客户端也得到了一些关爱,更新了 UI 和新的更容易阅读的字体。他们还“重写了房间列表控件 —— 增加了房间预览(!!)、按字母顺序排列、可调整列表大小、改进的通知用户界面等”。他们还开始努力改进端到端加密。 + +### 最后思考 + +Element 公司的人迈出了一大步,做出了这样的重大改名。他们可能会在短期内失去一些客户。(这可能主要是由于出于某种原因没有意识到名称的改变,或者不喜欢改变)。然而从长远来看,品牌简化将帮助他们脱颖而出。 + +我唯一要提到的负面说明是,这是他们在该应用历史上的第三次改名。在 2016 年发布时,它最初被命名为 Vector。当年晚些时候改名为 Riot。希望 Element 能一直用下去。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/riot-to-element/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://element.io/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/riot-to-element.png?ssl=1 +[3]: https://element.io/blog/the-world-is-changing/ +[4]: https://en.wikipedia.org/wiki/Riot_Games +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/element-desktop.jpg?ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/element-apps.jpg?ssl=1 +[7]: http://reddit.com/r/linuxusersgroup diff --git a/published/202008/20200717 How to configure an SSH proxy server with Squid.md b/published/202008/20200717 How to configure an SSH proxy server with Squid.md new file mode 100644 index 0000000000..5062eb7245 --- /dev/null +++ b/published/202008/20200717 How to configure an SSH proxy server with Squid.md @@ -0,0 +1,107 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12476-1.html) +[#]: subject: (How to configure an SSH proxy server with Squid) +[#]: via: (https://fedoramagazine.org/configure-ssh-proxy-server/) +[#]: author: (Curt Warfield https://fedoramagazine.org/author/rcurtiswarfield/) + +如何使用 Squid 配置 SSH 代理服务器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202008/01/162730tx0czx60xs6wz00c.jpg) + +有时你无法从本地连接到 SSH 服务器。还有时,你可能想为 SSH 连接添加额外的安全层。在这些情况下,通过代理服务器连接到 SSH 服务器是一种解决方式。 + +[Squid][2] 是提供缓存和代理服务的全功能代理服务器应用。它通常用于在浏览过程中重用和缓存以前请求的网页来帮助缩短响应时间并减少网络带宽。 + +但是在本篇中,你将配置 Squid 作为 SSH 代理服务器,因为它是强大的受信任代理服务器,易于配置。 + +### 安装和配置 + +使用 [sudo][3] 安装 squid 软件包: + +``` +$ sudo dnf install squid -y +``` + +squid 配置文件非常庞大,但是我们只需要配置其中一些。Squid 使用访问控制列表来管理连接。 + +编辑 `/etc/squid/squid.conf` 文件,确保你有下面解释的两行。 + +首先,指定你的本地 IP 网络。默认配置文件已经列出了最常用的,但是如果没有,你需要添加你的配置。例如,如果你的本地 IP 网络范围是 192.168.1.X,那么这行会是这样: + +``` +acl localnet src 192.168.1.0/24 +``` + +接下来,添加以下行,将 SSH 端口添加为安全端口: + +``` +acl Safe_ports port 22 +``` + +保存该文件。现在启用并重启 squid 代理服务: + +``` +$ sudo systemctl enable squid +$ sudo systemctl restart squid +``` + +squid 代理默认监听 3128 端口。配置 firewalld 允许此服务: + +``` +$ sudo firewall-cmd --add-service=squid --perm +$ sudo firewall-cmd --reload +``` + +### 测试 ssh 代理连接 + +要通过 ssh 代理服务器连接到服务器,我们将使用 `netcat`。 + +如果尚未安装 `nmap-ncat`,请安装它: + +``` +$ sudo dnf install nmap-ncat -y +``` + +这是标准 ssh 连接示例: + +``` +$ ssh user@example.com +``` + +这是使用 squid 代理服务器作为网关连接到该服务器的方式。 + +此示例假定 squid 代理服务器的 IP 地址为 192.168.1.63。你还可以使用 squid 代理服务器的主机名或 FQDN: + +``` +$ ssh user@example.com -o "ProxyCommand nc --proxy 192.168.1.63:3128 %h %p" +``` + +以下是这些选项的含义: + + * `ProxyCommand` – 告诉 ssh 使用代理命令。 + * `nc` – 用于建立与代理服务器连接的命令。这是 netcat 命令。 + * `%h` – 代理服务器的主机名或 IP 地址的占位符。 + * `%p` – 代理服务器端口号的占位符。 + +有很多方法可以配置 SSH 代理服务器,但这是入门​​的简单方法。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/configure-ssh-proxy-server/ + +作者:[Curt Warfield][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/rcurtiswarfield/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/07/squid_ssh_proxy-816x345.png +[2]: http://www.squid-cache.org/ +[3]: https://fedoramagazine.org/howto-use-sudo/ diff --git a/published/202008/20200720 Balloon-powered internet service goes live in Kenya.md b/published/202008/20200720 Balloon-powered internet service goes live in Kenya.md new file mode 100644 index 0000000000..782f7bae60 --- /dev/null +++ b/published/202008/20200720 Balloon-powered internet service goes live in Kenya.md @@ -0,0 +1,65 @@ +[#]: collector: (lujun9972) +[#]: translator: (JonnieWayy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12485-1.html) +[#]: subject: (Balloon-powered internet service goes live in Kenya) +[#]: via: (https://www.networkworld.com/article/3566295/balloon-powered-internet-service-goes-live-in-kenya.html) +[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) + +气球驱动的互联网服务在肯尼亚上线 +====== + +> Alphabet 的衍生产品 [Loon][1] 使用气球创建了一个由蜂窝塔构成的漂浮网络。 + +![](https://images.idgesg.net/images/article/2020/07/loon-aerial-100852193-large.jpg) + +ISP [Telkom Kenya][2] 正在启动第一个使用气球的商业化 4G LTE 服务,气球的作用是在漂浮在平流层中作为蜂窝塔网络。 + +据 Alphabet 的衍生产品及底层技术提供商 [Loon][1] 的首席执行官 Alastair Westgarth 所说,这项服务起初将会覆盖肯尼亚接近 19000 平方英里的范围。 Westgarth 在 [Medium][3] 上的一篇文章中说,将会有大约 35 个或更多的气球组成编队,它们持续不断地移动,漂浮在地表上方大约 12 英里的平流层中。“我们将 Loon 称为漂浮的蜂窝塔网络。” Westgarth 说道。 + +Telkom Kenya 的首席执行官 Mugo Kibati 在一篇[新闻稿][4]中提到,传统互联网对肯尼亚的服务不足,这是采用这种输送装置的原因。“…… 具有互联网功能的气球能够为生活在偏远地区的许多肯尼亚人提供联系,这些地区服务不足或是完全没有服务,仍然处于不利地位。” Kibati 说道。远程医疗和在线教育是两个预期的用例。 + +在测试中, Loon 实现了 19 毫秒延迟的 18.9 Mbps 下行速度,以及 4.74 Mbps 的上行速度。 Westgarth 说,该服务能够用于“语音通话、视频通话、 YouTube、 WhatsApp、电子邮件、发短信、网页浏览”和其他应用程序。 + +从更大的角度看,从平流层提供互联网服务对于[物联网(IoT )][5]来说是一个诱人的主张。在高空,网络覆盖范围可能会更广泛,并且覆盖范围可以随着需求的变化而变化(例如,采矿区的移动)。此外,要建立或处理的地面基础设施更少。 比方说,开发人员可以避免铺设电缆所需的私有地产的纠纷。 + +可以想象,服务中断也更加可控。提供商可以发射另一台设备,而不必通过复杂的远程地面基础设施来跟踪故障。备用气球可随时备用。 + +### 基于无人机的互联网交付 + +另一家正在探索大气层互联网的组织是软银,它称其 260 英尺宽的 HAWK30 无人机是“平流层中的漂浮基站”。(参见相关故事:[软银计划到 2023 年实现无人机交付的物联网和互联网][6]) + +日本大型电信公司对平流层传输的互联网感兴趣的原因之一是,该群岛易于发生自然灾害,例如地震。与传统的基站相比,地球上空的浮动基站更容易移动,从而可以更快、更灵活地应对自然灾害。 + +实际上,Loon 的气球已经成功地用于在灾难后提供互联网服务:例如,在 2017 年波多黎各的飓风 Maria 之后,Loon 提供了连接。 + +Westgarth 说,自最初开发以来,Loon 的气球已经取得了长足的发展。现如今,发射是通过自动设备执行的,该设备可以每半小时一次将与地面站点相连的气球推到 60000 英尺高空,而不像以前那样人工进行。 + +机器学习算法会处理导航,以尝试向用户提供持续的服务。但是,这并非总是可能的,因为风(尽管在地面上没有那么大)和受限的空域都会影响覆盖范围,尽管 Westgarth 称之为“精心编排组织的气球舞蹈”。 + +此外,这些设备是太阳能供电的,这意味着它们只能够在白天工作并提供互联网(或重新定位自身,或向其他气球传输互联网)。出于上述原因和其他的一些原因, Westgarth 和 Kibati 指出,气球必须扩大现有的基础设施和计划,但这并不是一个完整的解决方案。 + +Westgarth 说:“为了连接现在和将来需要它的所有人员和事物,我们需要开阔我们的思维;我们需要在连通性生态系统中增加新的一层。” + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3566295/balloon-powered-internet-service-goes-live-in-kenya.html + +作者:[Patrick Nelson][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://www.networkworld.com/author/Patrick-Nelson/ +[b]: https://github.com/lujun9972 +[1]: https://loon.com/ +[2]: https://www.telkom.co.ke/ +[3]: https://medium.com/loon-for-all/loon-is-live-in-kenya-259d81c75a7a +[4]: https://telkom.co.ke/telkom-and-loon-announce-progressive-deployment-loon-technology-customers-july +[5]: https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html +[6]: https://www.networkworld.com/article/3405170/softbank-plans-drone-delivered-iot-and-internet-by-2023.html +[7]: https://www.facebook.com/NetworkWorld/ +[8]: https://www.linkedin.com/company/network-world diff --git a/published/202008/20200721 Video Trimmer- A No-nonsense, Simple Video Trimming Application for Linux Desktop.md b/published/202008/20200721 Video Trimmer- A No-nonsense, Simple Video Trimming Application for Linux Desktop.md new file mode 100644 index 0000000000..1be71f5264 --- /dev/null +++ b/published/202008/20200721 Video Trimmer- A No-nonsense, Simple Video Trimming Application for Linux Desktop.md @@ -0,0 +1,76 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12480-1.html) +[#]: subject: (Video Trimmer: A No-nonsense, Simple Video Trimming Application for Linux Desktop) +[#]: via: (https://itsfoss.com/video-trimmer/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Video Trimmer:Linux 桌面中的傻瓜级的视频修剪应用 +====== + +> 一个非常简单的工具,无需重新编码即可快速修剪视频。我们来看看它提供了什么。 + +你可能已经知道 Linux 的一些[最佳免费视频编辑器][1],但并不是每个人都需要它们提供的所有功能。 + +有时,你只想快速执行一项操作,例如修剪视频。你是选择探索功能完善的视频编辑器但只是执行简单的修剪操作,还是希望使用便捷工具来修剪视频? + +当然,这取决于你的个人喜好以及处理视频的方式。但是,对于大多数用户而言,首选是使用非常容易使用的修剪工具。 + +因此,我想重点介绍一个傻瓜级的开源工具,即 “[Video Trimmer][2]”,它可以快速修剪视频。 + +![][3] + +### Video Trimmer:一个用于快速修剪视频的傻瓜应用 + +Video Trimmer 是一个开源应用,它可帮助你修剪视频片段而无需重新编码。因此,基本上,你可以能够修剪视频而不会失去原始质量。 + +你要做的就是使用 Video Trimmer 打开视频文件,然后使用鼠标选择要修剪的时间区域。 + +你可以手动设置要修剪的时间范围,也可以仅使用鼠标拖动区域进行修剪。当然,如果视频文件很长,而且你不知道从哪里看,手动设置时间戳可能需要一段时间。 + +为了让你有个印象,请看下面的截图,看看在使用 Video Trimmer 时可用的选项: + +![][4] + +### 在 Linux 上安装 Video Trimmer + +Video Trimmer 仅作为 [Flathub][5] 上的 Flatpak 软件包提供。因此,你应该能够在 Flatpak 支持的任何 Linux 发行版上安装它,而不会出现任何问题。 + +以防你不了解 Flatpak,你可能想要参考我们的[使用和安装 Flatpak][6] 指南。 + +- [下载 Video Trimmer(Flathub)][5] + +### 总结 + +Video Trimmer 底层使用 [ffmpeg][7]。它所做的可以在终端中轻松[使用 ffmpeg 命令][8]完成。但是,并非所有人都希望使用终端来剪辑视频的一部分。Video Trimmer 之类的工具可以帮助像我这样的人。 + +由于某些原因,如果你想寻找一种替代方法,也可以尝试使用 [VidCutter][9]。当然,你始终可以依靠 [Linux 中的顶级视频编辑器][10](例如 [OpenShot][11]) 来修剪视频以及执行一些高级操作的能力。 + +你认为在 Linux 中使用 Video Trimmer 如何?你是否有其他喜欢的视频修剪工具?在下面的评论中让我知道你的想法! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/video-trimmer/ + +作者:[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://itsfoss.com/open-source-video-editors/ +[2]: https://gitlab.gnome.org/YaLTeR/video-trimmer +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/video-trimmer.jpg?ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/video-trimmer-screenshot.jpg?ssl=1 +[5]: https://flathub.org/apps/details/org.gnome.gitlab.YaLTeR.VideoTrimmer +[6]: https://itsfoss.com/flatpak-guide/ +[7]: https://ffmpeg.org/ +[8]: https://itsfoss.com/ffmpeg/ +[9]: https://itsfoss.com/vidcutter-video-editor-linux/ +[10]: https://linux.cn/article-10185-1.html +[11]: https://itsfoss.com/openshot-video-editor-release/ diff --git a/published/202008/20200722 The feature that makes D my favorite programming language.md b/published/202008/20200722 The feature that makes D my favorite programming language.md new file mode 100644 index 0000000000..74ecc7473c --- /dev/null +++ b/published/202008/20200722 The feature that makes D my favorite programming language.md @@ -0,0 +1,150 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12489-1.html) +[#]: subject: (The feature that makes D my favorite programming language) +[#]: via: (https://opensource.com/article/20/7/d-programming) +[#]: author: (Lawrence Aberba https://opensource.com/users/aberba) + +我最喜欢的 D 语言功能 +====== + +> UFCS 能让你能够编写自然的可重用代码而不会牺牲便利性。 + +![](https://img.linux.net.cn/data/attachment/album/202008/05/215524d9j62oui7mgm7ms9.jpg) + +早在 2017 年,我就写过为什么 [D 语言是开发的绝佳选择][2]的文章。但是 D 语言中有一个出色的功能我没有充分的展开介绍:[通用函数调用语法][3]Universal Function Call Syntax(UFCS)。UFCS 是 D 语言中的一种[语法糖][4],它可以在类型(字符串、数字、布尔值等)上链接任何常规函数,就像该类型的成员函数一样。 + +如果你尚未安装 D 语言,请[安装 D 语言编译器][5],以便你可以自己[运行 D 代码][6]。 + +看一下以下示例代码: + +``` +// file: ufcs_demo.d + +module ufcs_demo; + +import std.stdio : writeln; + +int[] evenNumbers(int[] numbers) +{ + import std.array : array; + import std.algorithm : filter; + + return numbers.filter!(n => n % 2 == 0).array; +} + +void main() +{ + writeln(evenNumbers([1, 2, 3, 4])); +} +``` + +使用你喜欢的 D 语言编译器进行编译,查看这个简单示例应用做了什么: + +``` +$ dmd ufcs_demo.d +$ ./ufcs_demo +[2, 4] +``` + +但是,使用作为 D 语言的内置功能的 UFCS ,你还可以自然方式编写代码: + +``` +... +writeln([1, 2, 3, 4].evenNumbers()); +... +``` + +或完全删除现在多余的括号,使 `evenNumbers` 看起来像是一个属性: + +``` +... +writeln([1, 2, 3, 4].evenNumbers); // prints 2, 4 +... +``` + +因此,完整的代码现在变为: + +``` +// file: ufcs_demo.d + +module ufcs_demo; + +import std.stdio : writeln; + +int[] evenNumbers(int[] numbers) +{ + import std.array : array; + import std.algorithm : filter; + + return numbers.filter!(n => n % 2 == 0).array; +} + +void main() +{ + writeln([1, 2, 3, 4].evenNumbers); +} +``` + +使用你最喜欢的 D 语言编译器进行编译,然后尝试一下。 如预期的那样,它产生相同的输出: + +``` +$ dmd ufcs_demo.d +$ ./ufcs_demo +[2, 4] +``` + +在编译过程中,编译器*自动地*将数组作为函数的第一个参数。这是一个常规模式,使得使用 D 语言成为一种乐趣,因此,它与你自然而然考虑代码的感觉非常相似。结果就是函数式编程。 + +你可能会猜出这打印的是什么: + +``` +//file: cool.d +import std.stdio : writeln; +import std.uni : asLowerCase, asCapitalized; + +void main() +{ +    string mySentence = "D IS COOL"; +    writeln(mySentence.asLowerCase.asCapitalized); +} +``` + +确认一下: + + +``` +$ dmd cool.d +$ ./cool +D is cool +``` + +结合[其他 D 语言的功能][7],UFCS 使你能够编写可重用的代码,并在不牺牲便利性的情况下自然地进行编写。 + +### 是时候尝试 D 语言了 + +就像我之前写的那样,D 语言是一种很棒的开发语言。从 [D 语言的下载页面][8]可以很容易地进行安装,因此请下载编译器,查看示例,并亲自体验 D 语言。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/d-programming + +作者:[Lawrence Aberba][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/aberba +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://opensource.com/article/17/5/d-open-source-software-development +[3]: http://ddili.org/ders/d.en/ufcs.html +[4]: https://en.wikipedia.org/wiki/Syntactic_sugar +[5]: https://tour.dlang.org/tour/en/welcome/install-d-locally +[6]: https://tour.dlang.org/tour/en/welcome/run-d-program-locally +[7]: https://dlang.org/comparison.html +[8]: https://dlang.org/download.html diff --git a/published/202008/20200722 Tiny Yet Useful- 13 Raspberry Pi Zero Alternatives That Cost Less Than -20.md b/published/202008/20200722 Tiny Yet Useful- 13 Raspberry Pi Zero Alternatives That Cost Less Than -20.md new file mode 100644 index 0000000000..ee522608b8 --- /dev/null +++ b/published/202008/20200722 Tiny Yet Useful- 13 Raspberry Pi Zero Alternatives That Cost Less Than -20.md @@ -0,0 +1,355 @@ +[#]: collector: (lujun9972) +[#]: translator: (silentdawn-zz) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12502-1.html) +[#]: subject: (Tiny Yet Useful: 13 Raspberry Pi Zero Alternatives That Cost Less Than $20) +[#]: via: (https://itsfoss.com/raspberry-pi-zero-alternatives/) +[#]: author: (Chinmay https://itsfoss.com/author/chinmay/) + +个头小本事大:13 种 20 美元以下的树莓派 Zero 替代品 +====== + +最近两年,[树莓派 Zero][1] 和 [树莓派 Zero W][2] 作为新成员出现在树莓派产品线中。这些超小型的单板计算机大受欢迎,而且会在相当长的一段时间内成为创客和 DIY 社区的 [树莓派项目][3] 的一部分。 + +为了实现更小尺寸和有效地控制价位,它们不得不在许多特性上做出让步,如放弃专用网口、采用更慢的处理器等(与其它们同族的全功能版相比)。 + +早先的一篇文章中,我们罗列了 [树莓派的最佳替代品][4]。这里,我将给出树莓派 Zero 和树莓派 Zero W 的一些替代品。 + +### 树莓派 Zero 替代品:应用于物联网和嵌入式项目的超小单板计算机 + +![][9] + +受益于开源设计和开源软件栈,我们有为不同项目提供的具有各种功能集的优秀替代品。所有这些板子运行的都是嵌入式 Linux 的各种变体。 + +尽管树莓派 Zero 和树莓派 Zero W 的发布价格分别是 5 美元和 10 美元,但即使是在美国境内,也很难按这个价格买到。在美国之外,更是要花 12 和 20 美元才有可能买到。 + +知道了这些,让我们看看一些 20 美元以下的树莓派 Zero 替代品。 + +#### 1、香蕉派 BPI M2 Zero + +![][10] + +香蕉派 M2 Zero 售价 **18 美元**,与树莓派 Zero W 拥有相同的布局。它看起来像是树莓派 Zero W 的复制品,但也仅仅是外形像而已。它使用的是更快的全志 H2+ SOC 芯片,而且可以外接网络模块。它还可以运行多种基于 Linux 的操作系统。 + +**主要参数** + + * 全志 H2+ 四核 Cortex-A7 处理器,Mali400MP2 GPU,H265/HEVC 1080P + * 512M DDR3 内存(与 GPU 共享) + * 40 针接口,与树莓派 3 兼容 + * 板载 WiFi(AP6212)、蓝牙,外部天线连接口 + * CSI 摄像头输入接口 + * 电源及复位按钮 + * Mini HDMI 视频输出 + +详情可参阅 [Banana Pi Wiki][11]。 + +#### 2、香蕉派 BPI-M2 Magic(BPi-M2M) + +![][13] + +这个型号有 2 个变体,无板载 eMMC 闪存的标价 **20 美元**。这是相对其尺寸而言拥有更大处理能力的小型单板计算机。我觉得毫无疑问它很适合作为物联网和自动家居中的触控面板和显示面板。其板载电源管理系统也很有吸引力。 + +**主要参数** + + * 全志 A33/R16 四核 ARM Cortex-A7 处理器,MALI 400 MP2 GPU + * 板载 802.11 b/g/n 2.4GHz WiFi(AP6212),蓝牙 4.0,支持 BLE + * 512MB DDR3(与 GPU 共享) + * MIPI 串行显示接口(DSI),4 数据通道 + * CSI 摄像头输入接口,最大分辨率 1080p 时可达 30 帧/秒 + * 板载话筒和电池管理 + * 无 HDMI 输出 + +详情可参阅 [Banana Pi Wiki][14]。 + +#### 3、香蕉派 BPI-P2 Maker + +![][16] + +它是带有板载网络模块及支持网口供电(POE)的最小的单板计算机之一,此板售价 **13 美元**(带有 POE 模块的版本售价 **19 美元**)。和香蕉派 M2 Zero 一样,使用的是全志 H2+ SOC 芯片,是块非常有趣的板子。它具有板载 8 GB eMMC 存储空间及摄像头接口,同时具有 POE 功能,可用于 DIY 监控摄像,也可以作为基本的机器学习处理器使用。 + +**主要参数** + + * 处理器:全志 H2+,四核,Cortex-A7 架构 + * 512MB DDR 3 同步动态随机存取内存 + * 板载 WiFi(AP6212)和蓝牙 + * 板载 8G eMMC 闪存 + * 100M 网络 + * Mini HDMI + * CSI 摄像头接口 + * 具有 POE 模块,支持 IEEE 802.3af PoE 标准 + +详情可参阅 [Banana Pi Wiki][17]。 + +#### 4、桔子派 Zero LTS + +![][19] + +当前支持板载网络及 POE 的最小且最便宜的单板计算机,售价仅为 **11.49 美元**(256 MB 内存版本售价 **9.49 美元**)。其采用非常常见的全志 H2+ 处理器,并通过 GPIO 和 13 针功能头提供可靠的扩展方式。 + +**主要参数** + + * 全志 H2+ 四核 Cortex-A7 架构处理器,视频支持 H.265/HEVC 1080P + * Mali400MP2 GPU @600MHz + * 256MB/512MB DDR3 SDRAM(与 GPU 共用)(256 MB 版为标准版) + * 10/100M 自适应网络,RJ45 网口,POE 功能默认关闭 + * WiFi 使用 XR819 方案,支持 IEEE 802.11 b/g/n + * 26 针 GPIO 连接头 + * 13 针连接头,包含 2 路 USB、红外线接口和声音端口(MIC、AV) + +详情可参阅 [官方网站][20]。 + +#### 5、桔子派 i96 + +![][24] + +尺寸仅有 6×3 平方厘米,个头最小的型号之一,售价 **8.8 美元**。该板使用 [RDA8810PL 处理器][25],可作为相当先进的功能手机,(据厂商称)适合摄像应用,最高可以 30 帧/秒的速率采集 1080p 分辨率的图像。在同等价位产品中,输入输出功能出色。 + +**主要参数** + + * RDA8810PL ARM Cortex-A5 32 位单核处理器 + * Vivante 出品 GC860 GPU + * 集成 256MB LPDDR2 SDRAM + * RDA5991 方案的 WiFi 和蓝牙 + * CSI 摄像头输入接口 + * 40 针 GPIO 头 + +详情可参阅 [官方网站][26]。 + +#### 6、桔子派 PC + +![][28] + +该板售价 **15 美元**,包含了很多功能。是在同等价位板子中少有的集成了 1 GB 内存的型号之一。采用全志 H3 SoC 芯片,可解码 4K HEVC/H.265 视频。具有 HDMI 输出口并支持 HDCP 和 CEC。该单板计算机可以通过安装软件成为一个很好用的媒体盒子。它竟然还配备了板载红外接收器和话筒。 + +**主要参数** + + * 全志 H3 四核 Cortex-A7 架构处理器,主频 1.6 GHz + * 1GB DDR3 内存(与 GPU 共享) + * 支持 4K 输出的 HDMI + * CSI 摄像头接口,板载话筒 + * SD 卡槽 + * IR 接收器 + * 3.5mm 音频接口 + * 网络接口 + * 板上无 WiFi 和蓝牙 + +桔子派 PC 还有一种减配版,使用的是同样的处理器,只是内存容量要小。 + +详情可参阅 [官方网站][29]。 + +#### 7、桔子派 One 和桔子派 Lite + +这两种板子与桔子派 PC 一样,使用的是全志 H3 处理器,但配备的是 512MB 内存。 + +**主要参数** + + * 全志 H3 四核处理器 + * HDMI 输出,支持 4K 高清 + * SD 卡槽 + * 512 MB DDR3 内存 + * CSI 摄像头接口 + +![Orange Pi Lite][31] + +![Orange Pi One][32] + +桔子派 Lite 售价 **12 美元**,不支持板载有线网络,但提供了 WiFi 联网功能。其具有板载话筒和红外接收器。详情可参阅 [官方网站][33]。 + +桔子派 One 售价 **11 美元**,具有板载有线网络,但不支持 WiFi。详情可参阅 [官方网站][35]。 + +在桔子派相关内容的最后,我想简单提一下他们提供的几种适合自定义应用的板子。 + + * 桔子派 R1 – 具有双有线网口的小板子,可用于构建网络设备。 + * Orange Pi 2G IOT 和 Orange Pi 3G IOT - 这些板子分别提供了 2G 和 3G 蜂窝网络连接能力,适合作为物联网设备。 + +这些板子都不超过 **20 美元**,详情可参阅 [官方网站][37]。 + +#### 8、NanoPi Neo LTS + +![][38] + +起步价 **9.99 美元**,该板非常袖珍(4x4 平方厘米),与桔子派 Zero 规格相似。不同的是,它使用的是更为强悍的全志 H3 SoC 芯片和高达 512MB 的内存。虽然无任何板载 WiFi 和蓝牙芯片,但可以通过 USB 接口外接相关器件获得相应功能。该板非常适合作为无显示器的 Linux 服务器、DNS 过滤器(如 Pi-Hole),同时也很适合作为物联网应用的边缘设备使用。通过 GPIO 可以扩展出你需要的很多功能。 + +**主要参数** + + * 全志 H3 四核处理器,Cortex A7 内核,主频 1.2 GHz + * 512 MB 内存 + * Micro SD 卡槽(最高支持 128 GB) + * 10/100 Mbps 网口 + * 冗余 GPIO 针可实现其它所需功能 + +可从 [官方网站][39] 了解详情及购买。 + +![][40] + +NanoPi NEO 的极简版称为 NanoPi NEO Core LTS,该极简版为满足工业应用需求增加了 eMMC 存储,且通过扩展 GPIO 提供了板载 USB 接口和板载网络接口。详情参阅 [这里][41]。 + +![][42] + +Nano NEO Air 的 WiFi/蓝牙版称为 NanoPi NEO Air,提供了 eMMC 存储和摄像头输入接口,提供了板载 USB 接口和板载网络接口。详情参阅 [这里][43]. + +#### 9、Zero Pi + +![][44] + +这是所有这里提到的板子中,我最感兴趣的板子之一,售价 **9.99 美元**,具有板载千兆网口,使用全志 H3 处理器,小而强悍,适合应用于网络相关场景。它可以运行 OpenWRT,和其配备的千兆网络相得益彰。在作为 DNS 服务器运行的同时,还可以运行 Pi-Hole 的多个实例。 + +**主要参数** + + * 全志 H3 四核处理器,Cortex A7 架构,主频最高 1.2GHz + * 512MB 内存 + * USB 2.0 接口 + * 可运行 OpenWRT + +可从 [官方网站][45] 了解详情及下单购买。 + +#### 10、NanoPi NEO 2 + +![][46] + +NanoPi NEO 2 售价 **19.99 美元**,是 NanoPi NEO 的 2 倍。其外形尺寸与 NanoPi Neo 相同,但使用的是全志 H5 处理器,并配备了千兆网功能。这使得该板子个头小而性能强。 + +**主要参数** + + * 全志 H5 处理器,四核 64 位,高性能 Cortex A53 架构 + * Hexacore Mali450 GPU + * 512MB 内存 + * 1Gbps 板载网络 + * 24 针 GPIO + * 包含音频及红外之类功能的外接口 + +可从 [官方网站][47] 了解详情及下单购买。 + +上面的链接是关于 NanoPi 系列板子的。除此之外,还有一些其它有趣的板子,如配备双千兆网口的,以及针对摄像头应用的。 + +#### 11、La Frite + +![][48] + +出品商是 [Le Potato][49],售价 **20 美元**,主要面向媒体消费及流媒体。它通过 HDMI 2.0 接口以 HDR 方式实现 1080p 视频播放,支持最新的安卓 9 /电视、上游的 Linux、u-boot、Kodi 等。 + +**主要参数** + + * Amlogic S805X 处理器,四核,Cortex-A53 架构,主频 1.2GHz + * 最大 1GB DDR4 SDRAM + * Amlogic 视频引擎 10,支持 H.264、H.265 和 VP9 解码,最高能以 60 帧/秒的速率实现 1080p 高清 + * 百兆网 + * 红外接器 + * 40 针 GPIO + +详情可参阅 [官方网站][50]。 + +#### 12、Onion Omega2+ + +![][51] + +如果你需要的是应用于物联网场景的单板计算机,那么 [Onion Omega][52] 2+ 是替代树莓派 Zero 的很好选择。它是针对物联网的开发平台,运行的是基于 [OpenWRT][53] 的嵌入式 Linux 开发环境。 + +**主要参数** + + * MT7688 SoC 芯片 + * 2.4 GHz WiFi,支持 IEEE 802.11 b/g/n + * 128 MB DDR2 内存 + * 32 MB 板载闪存 + * MicroSD 卡槽 + * USB 2.0 + * 12 个 GPIO 引针 + +你可以 **13 美元** 的单价从 [官方网站][54] 购买其极简版,并可以选配各种附件。 + +#### 13、VoCore2 + +![][55] + +VoCore2 肯定是类似产品中最小的一款,极简版尺寸只有 1 英寸见方,售价 **17.99 美元**。小巧的尺寸使得其能方便的嵌入到不同的应用场合,而且允许根据需要扩充不同的特性。该板使用过的是联发科针对中低端路由器的处理器 MT7628 处理器。生产商声明将持续供应至 2025 年,这是个不错的消息。 + +**主要参数** + + * 联发科 MT7628 处理器,主频 580 MHz,MIPS 24K + * 128MB DDR2 内存, 内存刷新率 166 MHz + * 1 或 5 网口,100 Mbps 网络 + * 无线网,支持 802.11n,双收双发,网速最高 300Mbps + * 板载 16M NOR 存储器,支持最大 2TB SDXC 卡 + * 一个板载 U.FL 槽(天线接口) + +你可以从 [此处][56] 了解更多细节。 + +### 结束语 + +无可否认,不同规格和特性的各种单板计算机可以满足千变万化的使用需求。另外,绝大部分此类产品都基于开源设计,运行着开源软件。这绝对是硬核玩家不可多得的乐园。 + +由于新冠病毒的肆虐,要上手这些板子可能要稍费周折,期待情况能尽快好转! + +如果各位知道树莓派 Zero 和树莓派 Zero W 的其它有趣的替代型号,请留言。我们根据情况检查充实。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/raspberry-pi-zero-alternatives/ + +作者:[Chinmay][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://itsfoss.com/author/chinmay/ +[b]: https://github.com/lujun9972 +[1]: https://www.raspberrypi.org/products/raspberry-pi-zero/ +[2]: https://itsfoss.com/raspberry-pi-zero-w/ +[3]: https://itsfoss.com/raspberry-pi-projects/ +[4]: https://linux.cn/article-10823-1.html +[5]: https://i1.wp.com/m.media-amazon.com/images/I/517BwcAPmTL._SL160_.jpg?ssl=1 +[6]: https://www.amazon.com/dp/B072N3X39J?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 +[7]: https://www.amazon.com/gp/prime/?tag=chmod7mediate-20 (Amazon Prime) +[8]: https://www.amazon.com/dp/B072N3X39J?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Buy on Amazon) +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/raspberry-pi-zero-alterantives.png?ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/banana-pi-zero-1.png?ssl=1 +[11]: http://wiki.banana-pi.org/Banana_Pi_BPI-M2_ZERO#Hardware_interfaces +[12]: https://www.aliexpress.com/item/32839074880.html?spm=2114.12010612.8148356.2.258c72dbKctWv3 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/Banana-Pi-M2M-2-1.jpg?ssl=1 +[14]: http://wiki.banana-pi.org/Banana_Pi_BPI-M2M +[15]: https://www.aliexpress.com/item/32836172813.html?spm=2114.12010612.8148356.2.25ac76c2BKPl43 +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/Banana-Pi-P2-Zero-1.png?ssl=1 +[17]: http://wiki.banana-pi.org/Banana_Pi_BPI-P2_Zero +[18]: https://www.aliexpress.com/item/32953609399.html?spm=2114.12010612.8148356.6.6d4070a9ktu2qs +[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/Orange-Pi-Zero-LTS.png?ssl=1 +[20]: http://www.orangepi.org/orangepizerolts/ +[21]: https://i0.wp.com/m.media-amazon.com/images/I/51wOvNrzHkL._SL160_.jpg?ssl=1 +[22]: https://www.amazon.com/dp/B07ZYJGPF8?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Orange Pi Zero Single Board Computer Quad Core Open-Source Development Board 512MB with WiFi Antenna) +[23]: https://www.amazon.com/dp/B07ZYJGPF8?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Buy on Amazon) +[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/Orange-Pi-i96.png?ssl=1 +[25]: https://www.openhacks.com/uploadsproductos/2016030304473558.pdf +[26]: http://www.orangepi.org/OrangePii96/ +[27]: https://www.aliexpress.com/item/32819068354.html?spm=2114.12010612.8148356.2.7cb16aa1JdhlzK +[28]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/opipc.png?ssl=1 +[29]: http://www.orangepi.org/orangepipc/ +[30]: https://www.aliexpress.com/item/32448079125.html +[31]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/Orange-Pi-Lite.png?ssl=1 +[32]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/Orange-Pi-One.png?ssl=1 +[33]: http://www.orangepi.org/orangepilite/ +[34]: https://www.aliexpress.com/item/32662738571.html?spm=2114.12010612.8148356.16.222f4f44KYIA5v +[35]: http://www.orangepi.org/orangepione/ +[36]: https://www.aliexpress.com/item/32603308880.html?spm=a2g0o.detail.1000060.1.4fb86a5eWkGEex&gps-id=pcDetailBottomMoreThisSeller&scm=1007.13339.146401.0&scm_id=1007.13339.146401.0&scm-url=1007.13339.146401.0&pvid=9042001e-bc4a-471b-a3a0-9f0d276d0c3f&_t=gps-id:pcDetailBottomMoreThisSeller,scm-url:1007.13339.146401.0,pvid:9042001e-bc4a-471b-a3a0-9f0d276d0c3f,tpp_buckets:668%230%23131923%2358_668%23808%237756%23236_668%23888%233325%232_668%232846%238111%23464_668%232717%237564%23664_ +[37]: http://www.orangepi.org +[38]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/NanoPi-NEO_04-900x630-1.jpg?ssl=1 +[39]: https://www.friendlyarm.com/index.php?route=product/product&path=69&product_id=132&sort=p.price&order=ASC +[40]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/Core_04-900x630-1.jpg?ssl=1 +[41]: https://www.friendlyarm.com/index.php?route=product/product&path=69&product_id=212&sort=p.price&order=ASC +[42]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/air_03-900x630-1.jpg?ssl=1 +[43]: https://www.friendlyarm.com/index.php?route=product/product&path=69&product_id=151&sort=p.price&order=ASC +[44]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/ZeroPi_03-900x630-1.jpg?ssl=1 +[45]: https://www.friendlyarm.com/index.php?route=product/product&path=69&product_id=266&sort=p.price&order=ASC +[46]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/NEO2_04-900x630-1.jpg?ssl=1 +[47]: https://www.friendlyarm.com/index.php?route=product/product&product_id=180 +[48]: https://i0.wp.com/cdn.shopify.com/s/files/1/1098/4826/products/84988b14aa58054c0a4cbf8c03466fa9_original_1024x1024.jpg?resize=544%2C306&ssl=1 +[49]: https://libre.computer/products/boards/aml-s905x-cc/ +[50]: https://libre.computer/products/boards/aml-s805x-ac/ +[51]: https://i0.wp.com/onion.io/wp-content/uploads/2019/08/OM-O2P.jpg?resize=424%2C424&ssl=1 +[52]: https://itsfoss.com/onion-omega-2/ +[53]: https://openwrt.org/ +[54]: https://onion.io/ +[55]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/VoCore2.png?resize=719%2C319&ssl=1 +[56]: https://vocore.io/v2.html +[57]: https://vocore.io/ diff --git a/published/202008/20200727 5 open source IDE tools for Java.md b/published/202008/20200727 5 open source IDE tools for Java.md new file mode 100644 index 0000000000..39a7e37d65 --- /dev/null +++ b/published/202008/20200727 5 open source IDE tools for Java.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12542-1.html) +[#]: subject: (5 open source IDE tools for Java) +[#]: via: (https://opensource.com/article/20/7/ide-java) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) + +5 个开源的 Java IDE 工具 +====== + +> Java IDE 工具提供了大量的方法来根据你的独特需求和偏好创建一个编程环境。 + +![](https://img.linux.net.cn/data/attachment/album/202008/22/235441wnnorcvo4olasv8o.jpg) + +通过简化程序员的工作,[Java][2] 框架可以使他们的生活更加轻松。这些框架是为了在各种服务器环境上运行各种应用程序而设计开发的;这包括解析注解、扫描描述符、加载配置以及在 Java 虚拟机(JVM)上启动实际的服务等方面的动态行为。控制这么多的任务需要更多的代码,这就很难降低内存占用、加快新应用的启动时间。无论如何,据 [TIOBE 指数][3],在当今使用的编程语言中 Java 一直排名前三,拥有着 700 万到 1000 万开发者的社区。 + +有这么多用 Java 编写的代码,这意味着有一些很好的集成开发环境(IDE)可供选择,可以为开发人员提供有效地编写、整理、测试和运行 Java 应用程序所需的所有工具。 + +下面,我将按字母顺序介绍五个我最喜欢的用于编写 Java 的开源 IDE 工具,以及如何配置它们的基本功能。 + +### BlueJ + +[BlueJ][4] 为 Java 初学者提供了一个集成的教育性 Java 开发环境。它也可以使用 Java 开发工具包(JDK)开发小型软件。各种版本和操作系统的安装方式都可以在[这里][5]找到。 + +在笔记本电脑上安装 BlueJ IDE 后,启动一个新项目,点击项目Project菜单中的新项目New Project,然后从创建一个新类New Class开始编写 Java 代码。生成的示例方法和骨架代码如下所示: + +![BlueJ IDE screenshot][6] + +BlueJ 不仅为学校的 Java 编程课的教学提供了一个交互式的图形用户界面(GUI),而且可以让开发人员在不编译源代码的情况下调用函数(即对象、方法、参数)。 + +### Eclipse + +[Eclipse][7] 是桌面计算机上最著名的 Java IDE 之一,它支持 C/C++、JavaScript 和 PHP 等多种编程语言。它还允许开发者从 Eclipse 市场中的添加无穷无尽的扩展,以获得更多的开发便利。[Eclipse 基金会][8]提供了一个名为 [Eclipse Che][9] 的 Web IDE,供 DevOps 团队在多个云平台上用托管的工作空间创建出一个敏捷软件开发环境。 + +[可以在这里下载][10];然后你可以创建一个新的项目或从本地目录导入一个现有的项目。在[本文][11]中找到更多 Java 开发技巧。 + +![Eclipse IDE screenshot][12] + +### IntelliJ IDEA + +[IntelliJ IDEA CE(社区版)][13]是 IntelliJ IDEA 的开源版本,为 Java、Groovy、Kotlin、Rust、Scala 等多种编程语言提供了 IDE。IntelliJ IDEA CE 在有经验的开发人员中也非常受欢迎,可以用它来对现有源码进行重构、代码检查、使用 JUnit 或 TestNG 构建测试用例,以及使用 Maven 或 Ant 构建代码。可在[这里][14]下载它。 + +IntelliJ IDEA CE 带有一些独特的功能;我特别喜欢它的 API 测试器。例如,如果你用 Java 框架实现了一个 REST API,IntelliJ IDEA CE 允许你通过 Swing GUI 设计器来测试 API 的功能。 + +![IntelliJ IDEA screenshot][15] + +IntelliJ IDEA CE 是开源的,但其背后的公司也提供了一个商业的终极版。可以在[这里][16]找到社区版和终极版之间的更多差异。 + +### Netbeans IDE + +[NetBeans IDE][17] 是一个 Java 的集成开发环境,它允许开发人员利用 HTML5、JavaScript 和 CSS 等支持的 Web 技术为独立、移动和网络架构制作模块化应用程序。NetBeans IDE 允许开发人员就如何高效管理项目、工具和数据设置多个视图,并帮助他们在新开发人员加入项目时使用 Git 集成进行软件协作开发。 + +[这里][18]下载的二进制文件支持 Windows、macOS、Linux 等多个平台。在本地环境中安装了 IDE 工具后,新建项目向导可以帮助你创建一个新项目。例如,向导会生成骨架代码(有部分需要填写,如 `// TODO 代码应用逻辑在此`),然后你可以添加自己的应用代码。 + +### VSCodium + +[VSCodium][19] 是一个轻量级、自由的源代码编辑器,允许开发者在 Windows、macOS、Linux 等各种操作系统平台上安装,是基于 [Visual Studio Code][20] 的开源替代品。其也是为支持包括 Java、C++、C#、PHP、Go、Python、.NET 在内的多种编程语言的丰富生态系统而设计开发的。Visual Studio Code 默认提供了调试、智能代码完成、语法高亮和代码重构功能,以提高开发的代码质量。 + +在其[资源库][21]中有很多下载项。当你运行 Visual Studio Code 时,你可以通过点击左侧活动栏中的“扩展”图标或按下 `Ctrl+Shift+X` 键来添加新的功能和主题。例如,当你在搜索框中输入 “quarkus” 时,就会出现 Visual Studio Code 的 Quarkus 工具,该扩展允许你[在 VS Code 中使用 Quarkus 编写 Java][22]: + +![VSCodium IDE screenshot][23] + +### 总结 + +Java 作为最广泛使用的编程语言和环境之一,这五种只是 Java 开发者可以使用的各种开源 IDE 工具的一小部分。可能很难知道哪一个是正确的选择。和以往一样,这取决于你的具体需求和目标 —— 你想实现什么样的工作负载(Web、移动应用、消息传递、数据交易),以及你将使用 IDE 扩展功能部署什么样的运行时(本地、云、Kubernetes、无服务器)。虽然丰富的选择可能会让人不知所措,但这也意味着你可能可以找到一个适合你的特殊情况和偏好的选择。 + +你有喜欢的开源 Java IDE 吗?请在评论中分享吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/ide-java + +作者:[Daniel Oh][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/daniel-oh +[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/resources/java +[3]: https://www.tiobe.com/tiobe-index/ +[4]: https://www.bluej.org/about.html +[5]: https://www.bluej.org/versions.html +[6]: https://opensource.com/sites/default/files/uploads/5_open_source_ide_tools_to_write_java_and_how_you_begin_it.png (BlueJ IDE screenshot) +[7]: https://www.eclipse.org/ide/ +[8]: https://www.eclipse.org/ +[9]: https://opensource.com/article/19/10/cloud-ide-che +[10]: https://www.eclipse.org/downloads/ +[11]: https://opensource.com/article/19/10/java-basics +[12]: https://opensource.com/sites/default/files/uploads/os_ide_2.png (Eclipse IDE screenshot) +[13]: https://www.jetbrains.com/idea/ +[14]: https://www.jetbrains.org/display/IJOS/Download +[15]: https://opensource.com/sites/default/files/uploads/os_ide_3.png (IntelliJ IDEA screenshot) +[16]: https://www.jetbrains.com/idea/features/editions_comparison_matrix.html +[17]: https://netbeans.org/ +[18]: https://netbeans.org/downloads/8.2/rc/ +[19]: https://vscodium.com/ +[20]: https://opensource.com/article/20/6/open-source-alternatives-vs-code +[21]: https://github.com/VSCodium/vscodium#downloadinstall +[22]: https://opensource.com/article/20/4/java-quarkus-vs-code +[23]: https://opensource.com/sites/default/files/uploads/os_ide_5.png (VSCodium IDE screenshot) diff --git a/published/202008/20200727 Analyze your web server log files with this Python tool.md b/published/202008/20200727 Analyze your web server log files with this Python tool.md new file mode 100644 index 0000000000..8143e4acb1 --- /dev/null +++ b/published/202008/20200727 Analyze your web server log files with this Python tool.md @@ -0,0 +1,114 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12512-1.html) +[#]: subject: (Analyze your web server log files with this Python tool) +[#]: via: (https://opensource.com/article/20/7/python-lars) +[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall) + +使用这个 Python 工具分析你的 Web 服务器日志文件 +====== + +> 这个 Python 模块可以以多种格式收集网站使用日志并输出良好结构化数据以进行分析。 + +![](https://img.linux.net.cn/data/attachment/album/202008/13/155936kpaay0ypkmyk9qd0.jpg) + +是否想知道有多少访问者访问过你的网站?或哪个页面、文章或下载最受欢迎?如果你是自托管的博客或网站,那么无论你使用的是 Apache、Nginx 还是 Microsoft IIS(是的,没错),[lars][2]都可以为你提供帮助。 + +Lars 是 [Python][3] 写的 Web 服务器日志工具包。这意味着你可以使用 Python 通过简单的代码来回溯(或实时)解析日志,并对数据做任何你想做的事:将它存储在数据库中、另存为 CSV 文件,或者立即使用 Python 进行更多分析。 + +Lars 是 [Dave Jones][4] 写的另一个隐藏的宝石。我最初是在本地 Python 用户组中看到 Dave 演示 lars。几年后,我们开始在 [piwheels][5] 项目中使用它来读取 Apache 日志并将行插入到我们的 Postgres 数据库中。当树莓派用户从 [piwheels.org][6] 下载 Python 包时,我们会记录文件名、时间戳、系统架构(Arm 版本)、发行版名称/版本,Python 版本等。由于它是一个关系数据库,因此我们可以将这些结果加入其他表中以获得有关文件的更多上下文信息。 + +你可以使用以下方法安装lars: + +``` +$ pip install lars +``` + +在某些系统上,正确的方式是 `sudo` `pip3 install lars`。 + +首先,找到一个 Web 访问日志并制作一个副本。你需要将日志文件下载到计算机上进行操作。我在示例中使用的是 Apache 日志,但是经过一些小(且直观)的更改,你可以使用 Nginx 或 IIS。在典型的 Web 服务器上,你会在 `/var/log/apache2/` 中找到 Apache 日志,通常是 `access.log`、`ssl_access.log`(对于 HTTPS)或 gzip 压缩后的轮转日志文件,如 `access-20200101.gz` 或者 `ssl_access-20200101.gz` 。 + +首先,日志是什么样的? + +``` +81.174.152.222 - - [30/Jun/2020:23:38:03 +0000] "GET / HTTP/1.1" 200 6763 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0" +``` + +这是一个显示了请求源 IP 地址、时间戳、请求文件路径(在本例中是主页 `/`)、HTTP 状态代码,用户代理(Ubuntu 上的 Firefox)等的请求。 + +你的日志文件将充满这样的条目,不仅是每个打开的页面,还包括返回的每个文件和资源:每个 CSS 样式表、JavaScript 文件和图像,每个 404 请求、每个重定向、每个爬虫。要从日志中获取有意义的数据,你需要对条目进行解析、过滤和排序。这就是 Lars 的用处。本示例将打开一个日志文件并打印每一行的内容: + +``` +with open('ssl_access.log') as f: +    with ApacheSource(f) as source: +        for row in source: +            print(row) +``` + +它会为每条日志显示如下结果: + +``` +Row(remote_host=IPv4Address('81.174.152.222'), ident=None, remote_user=None, time=DateTime(2020, 6, 30, 23, 38, 3), request=Request(method='GET', url=Url(scheme='', netloc='', path_str='/', params='', query_str='', fragment=''), protocol='HTTP/1.1'), status=200, size=6763) +``` + +它解析了日志条目,并将数据放入结构化格式中。该条目已成为具有与条目数据相关属性的[命名元组][7]namedtuple,因此,例如,你可以使用 `row.status` 访问状态代码,并使用 `row.request.url.path_str` 访问路径: + +``` +with open('ssl_access.log') as f: +    with ApacheSource(f) as source: +        for row in source: +            print(f'hit {row.request.url.path_str} with status code {row.status}') +``` + + +如果你只想显示 404 请求,可以执行以下操作: + +``` +with open('ssl_access.log') as f: +    with ApacheSource(f) as source: +        for row in source: +            if row.status == 404: +                print(row.request.url.path_str) + +``` + +你可能要对这些数据去重,并打印独立的 404 页面数量: + +``` +s = set() +with open('ssl_access.log') as f: +    with ApacheSource(f) as source: +        for row in source: +            if row.status == 404: +                s.add(row.request.url.path_str) +print(len(s)) +``` + +我和 Dave 一直在努力扩展 piwheel 的日志记录器,使其包含网页点击量、软件包搜索等内容,归功于 lars,这些并不难。它不会告诉我们有关用户的任何答案。我们仍然需要进行数据分析,但它去掉了复杂不便的文件格式,并以我们可以利用的方式将它放入我们的数据库。 + +查阅 lars 的文档,以了解如何读取 Apache、Nginx 和 IIS 日志,并了解你还可以使用它做什么。再次感谢 Dave 提供的出色工具! + +最初发布在 Ben Nuttall 的 Tooling Blog 中,并获许重新发布。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/python-lars + +作者:[Ben Nuttall][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/bennuttall +[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://lars.readthedocs.io/en/latest/ +[3]: https://opensource.com/resources/python +[4]: https://twitter.com/waveform80/ +[5]: https://opensource.com/article/18/10/piwheels-python-raspberrypi +[6]: http://piwheels.org +[7]: https://docs.python.org/3/library/collections.html#collections.namedtuple \ No newline at end of file diff --git a/published/202008/20200728 BigBlueButton- Open Source Software for Online Teaching.md b/published/202008/20200728 BigBlueButton- Open Source Software for Online Teaching.md new file mode 100644 index 0000000000..846d64ff0a --- /dev/null +++ b/published/202008/20200728 BigBlueButton- Open Source Software for Online Teaching.md @@ -0,0 +1,92 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12492-1.html) +[#]: subject: (BigBlueButton: Open Source Software for Online Teaching) +[#]: via: (https://itsfoss.com/bigbluebutton/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +BigBlueButton:开源在线教学软件 +====== + +> BigBlueButton 是一个为在线教学量身定制的开源视频会议工具。让我们来看看它提供了什么。 + +在 2020 年,在家远程工作是一种新常态。当然,你不可能远程完成所有事情,但是在线教学是可以的。 + +尽管许多老师和学校组织不熟悉那些所有的出色工具,但某些[最好的开源视频会议工具][1]在一定程度上满足了要求。 + +在我提到的视频通话软件中,[BigBlueButton][2] 引起了我的注意。在这里,我将为你简单介绍。 + +### BigBlueButton:用于在线教学的开源 Web 会议系统 + +![][3] + +BigBlueButton 是一个开源的网络会议方案,它旨在简化在线学习。 + +它是完全免费的,但是需要你在自己的服务器上安装才能将其用作成熟的在线学习解决方案。 + +BigBlueButton 提供了非常好的一组功能。你可以轻松地尝试[演示实例][4],并在学校的服务器上进行安装。 + +开始之前,请先了解以下功能: + +### BigBlueButton 的功能 + +BigBlueButton 为教师和学校的量身定制了一系列在线课堂的有用功能,你可以获得: + + * 现场白板 + * 给公共和私人发消息 + * 支持网络摄像头 + * 支持会话记录 + * 支持表情符号 + * 能够将用户分组以进行团队协作 + * 支持投票 + * 屏幕共享 + * 支持多用户白板 + * 能够自行托管 + * 提供用于轻松集成到 Web 应用中的 API + +除了提供的功能外,你还能看到易于使用的 UI,即 [Greenlight][5] (BigBlueButton 的前端界面),当你在服务器上配置时可以安装它。 + +你可以尝试演示实例来临时免费地教你的学生。但是,考虑到使用[演示实例][4]来尝试 BigBlueButton 的局限性(限制为 60 分钟),建议你将它托管在服务器上,以探索其提供的所有功能。 + +为了更清楚地了解这些功能是如何工作的,你可能需要看下它的[官方教程](https://www.youtube.com/embed/Q2tG2SS4gXA)。 + +### 在你的服务器上安装 BigBlueButton + +他们提供了[详细文档][6],它对每个开发人员都会有用。安装它最简单、最快捷的方法是使用 [bbb-install 脚本][7],但是如果不成功,你也可以探索其他选项。 + +对于刚接触的人,你需要一台至少运行 Ubuntu 16.04 LTS 的服务器。在为 BigBlueButton 部署服务器之前,你应该查看[最低要求][8]。 + +你可以在它的 [GitHub 页面][9]中进一步了解该项目。 + +- [试用 BigBlueButton][2] + +如果你正在为在线教学寻求解决方案,那么 BigBlueButton 是一个不错的选择。 + +它可能不提供原生的智能手机应用,但你肯定可以用手机上的网络浏览器来访问它。当然,最好找一台笔记本电脑/计算机来访问在线教学平台,但它也可以在移动设备上使用。 + +你认为 BigBlueButton 的在线教学如何?有没有更好的开源项目可以替代?在下面的评论中让我知道! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/bigbluebutton/ + +作者:[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://linux.cn/article-12453-1.html +[2]: https://bigbluebutton.org/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/big-blue-button.png?ssl=1 +[4]: http://demo.bigbluebutton.org/ +[5]: https://bigbluebutton.org/2018/07/09/greenlight-2-0/ +[6]: https://docs.bigbluebutton.org/ +[7]: https://github.com/bigbluebutton/bbb-install +[8]: https://docs.bigbluebutton.org/2.2/install.html#minimum-server-requirements +[9]: https://github.com/bigbluebutton diff --git a/published/202008/20200728 Digging for DNS answers on Linux.md b/published/202008/20200728 Digging for DNS answers on Linux.md new file mode 100644 index 0000000000..c958e7dfb4 --- /dev/null +++ b/published/202008/20200728 Digging for DNS answers on Linux.md @@ -0,0 +1,229 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12509-1.html) +[#]: subject: (Digging for DNS answers on Linux) +[#]: via: (https://www.networkworld.com/article/3568488/digging-for-dns-answers-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +在 Linux 上挖掘 DNS 应答中的秘密 +====== + +> dig 是一个强大而灵活的工具,用于查询域名系统(DNS)服务器。在这篇文章中,我们将深入了解它的工作原理以及它能告诉你什么。 + +![](https://img.linux.net.cn/data/attachment/album/202008/11/235200wlyytlaymlylfdff.jpg) + +`dig` 是一款强大而灵活的查询 DNS 名称服务器的工具。它执行 DNS 查询,并显示参与该过程的名称服务器返回的应答以及与搜索相关的细节。系统管理员和 [DNS][3] 管理员经常使用 `dig` 来帮助排除 DNS 问题。在这篇文章中,我们将深入了解它的工作原理,看看它能告诉我们什么。 + +开始之前,对 DNS(域名系统)的工作方式有一个基本的印象是很有帮助的。它是全球互联网的关键部分,因为它提供了一种查找世界各地的服务器的方式,从而可以与之连接。你可以把它看作是互联网的地址簿,任何正确连接到互联网的系统,都应该能够使用它来查询任何正确注册的服务器的 IP 地址。 + +### dig 入门 + +Linux 系统上一般都默认安装了 `dig` 工具。下面是一个带有一点注释的 `dig` 命令的例子: + +``` +$ dig www.networkworld.com + +; <<>> DiG 9.16.1-Ubuntu <<>> www.networkworld.com <== 你使用的 dig 版本 +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6034 +;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 + +;; OPT PSEUDOSECTION: +; EDNS: version: 0, flags:; udp: 65494 +;; QUESTION SECTION: <== 你的查询细节 +;www.networkworld.com. IN A + +;; ANSWER SECTION: <== 结果 + +www.networkworld.com. 3568 IN CNAME idg.map.fastly.net. +idg.map.fastly.net. 30 IN A 151.101.250.165 + +;; Query time: 36 msec <== 查询用时 +;; SERVER: 127.0.0.53#53(127.0.0.53) <== 本地缓存解析器 +;; WHEN: Fri Jul 24 19:11:42 EDT 2020 <== 查询的时间 +;; MSG SIZE rcvd: 97 <== 返回的字节数 +``` + +如果你得到了一个这样的应答,是好消息吗?简短的回答是“是”。你得到了及时的回复。状态字段(`status: NOERROR`)显示没有问题。你正在连接到一个能够提供所要求的信息的名称服务器,并得到一个回复,告诉你一些关于你所查询的系统的重要细节。简而言之,你已经验证了你的系统和域名系统相处得很好。 + +其他可能的状态指标包括: + +- `SERVFAIL`:被查询的名称存在,但没有数据或现有数据无效。 +- `NXDOMAIN`:所查询的名称不存在。 +- `REFUSED`:该区域的数据不存在于所请求的权威服务器中,并且在这种情况下,基础设施没有设置为提供响应服务。 + +下面是一个例子,如果你要查找一个不存在的域名,你会看到什么? + +``` +$ dig cannotbe.org + +; <<>> DiG 9.16.1-Ubuntu <<>> cannotbe.org +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 35348 +;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 +``` + +一般来说,`dig` 比 `ping` 会提供更多的细节,如果域名不存在,`ping` 会回复 “名称或服务未知”。当你查询一个合法的系统时,你可以看到域名系统对该系统知道些什么,这些记录是如何配置的,以及检索这些数据需要多长时间。 + +(LCTT 译注:`dig` 也比 `nslookup` 提供的数据更多。此外,`dig` 采用的是操作系统的解析库,而 `nslookup` 采用的是自己提供的解析库,这有时候会带来不同的行为。最后,有趣的一点是,`dig` 的返回的格式是符合 BIND 区域文件格式的。) + +事实上,有时 `dig` 可以在 `ping` 完全不能响应的时候进行响应,当你试图确定一个连接问题时,这种信息是非常有用的。 + +### DNS 记录类型和标志 + +在上面的第一个查询中,我们可以看到一个问题,那就是同时存在 `CNAME` 和 `A` 记录。`CNAME`(规范名称canonical name)就像一个别名,把一个域名指向另一个域名。你查询的大多数系统不会有 `CNAME` 记录,而只有 `A` 记录。如果你运行 `dig localhost` 命令,你会看到一个 `A` 记录,它就指向 `127.0.0.1` —— 这是每个系统都使用的“回环”地址。`A` 记录用于将一个名字映射到一个 IP 地址。 + +DNS 记录类型包括: + +* `A` 或 `AAAA`:IPv4 或 IPv6 地址 +* `CNAME`:别名 +* `MX`:邮件交换器 +* `NS`:名称服务器 +* `PTR`:一个反向条目,让你根据 IP 地址找到系统名称 +* `SOA`:表示授权记录开始 +* `TXT` 一些相关文本 + +我们还可以在上述输出的第五行看到一系列的“标志”。这些定义在 [RFC 1035][4] 中 —— 它定义了 DNS 报文头中包含的标志,甚至显示了报文头的格式。 + +``` + 1 1 1 1 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 ++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +| ID | ++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +|QR| Opcode |AA|TC|RD|RA| Z | RCODE | ++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +| QDCOUNT | ++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +| ANCOUNT | ++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +| NSCOUNT | ++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +| ARCOUNT | ++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +``` + +在上面的初始查询中,第五行显示的标志是: + +* `qr` = 查询 +* `rd` = 进行递归查询 +* `ra` = 递归数据可用 + +RFC 中描述的其他标志包括: + +* `aa` = 权威答复 +* `cd` = 检查是否禁用 +* `ad` = 真实数据 +* `opcode` = 一个 4 位字段 +* `tc` = 截断 +* `z`(未使用) + +### 添加 +trace 选项 + +如果你添加 `+trace` 选项,你将从 `dig` 得到更多的输出。它会添加更多信息,显示你的 DNS 查询如何通过名称服务器的层次结构找到你要找的答案。 + +下面显示的所有 `NS` 记录都反映了名称服务器 —— 这只是你将看到的数据的第一部分,因为查询通过名称服务器的层次结构来追踪你要找的东西: + +``` +$ dig +trace networkworld.com + +; <<>> DiG 9.16.1-Ubuntu <<>> +trace networkworld.com +;; global options: +cmd +. 84895 IN NS k.root-servers.net. +. 84895 IN NS e.root-servers.net. +. 84895 IN NS m.root-servers.net. +. 84895 IN NS h.root-servers.net. +. 84895 IN NS c.root-servers.net. +. 84895 IN NS f.root-servers.net. +. 84895 IN NS a.root-servers.net. +. 84895 IN NS g.root-servers.net. +. 84895 IN NS l.root-servers.net. +. 84895 IN NS d.root-servers.net. +. 84895 IN NS b.root-servers.net. +. 84895 IN NS i.root-servers.net. +. 84895 IN NS j.root-servers.net. +;; Received 262 bytes from 127.0.0.53#53(127.0.0.53) in 28 ms +... +``` + +最终,你会得到与你的要求直接挂钩的信息: + +``` +networkworld.com. 300 IN A 151.101.2.165 +networkworld.com. 300 IN A 151.101.66.165 +networkworld.com. 300 IN A 151.101.130.165 +networkworld.com. 300 IN A 151.101.194.165 +networkworld.com. 14400 IN NS ns-d.pnap.net. +networkworld.com. 14400 IN NS ns-a.pnap.net. +networkworld.com. 14400 IN NS ns0.pcworld.com. +networkworld.com. 14400 IN NS ns1.pcworld.com. +networkworld.com. 14400 IN NS ns-b.pnap.net. +networkworld.com. 14400 IN NS ns-c.pnap.net. +;; Received 269 bytes from 70.42.185.30#53(ns0.pcworld.com) in 116 ms +``` + +### 挑选响应者 + +你可以使用 `@` 符号来指定一个特定的名称服务器来处理你的查询。在这里,我们要求 Google 的主名称服务器响应我们的查询: + +``` +$ dig @8.8.8.8 networkworld.com + +; <<>> DiG 9.16.1-Ubuntu <<>> @8.8.8.8 networkworld.com +; (1 server found) +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43640 +;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 + +;; OPT PSEUDOSECTION: +; EDNS: version: 0, flags:; udp: 512 +;; QUESTION SECTION: +;networkworld.com. IN A + +;; ANSWER SECTION: +networkworld.com. 299 IN A 151.101.66.165 +networkworld.com. 299 IN A 151.101.194.165 +networkworld.com. 299 IN A 151.101.130.165 +networkworld.com. 299 IN A 151.101.2.165 + +;; Query time: 48 msec +;; SERVER: 8.8.8.8#53(8.8.8.8) +;; WHEN: Sat Jul 25 11:21:19 EDT 2020 +;; MSG SIZE rcvd: 109 +``` + +下面所示的命令对 `8.8.8.8` IP 地址进行反向查找,以显示它属于 Google 的 DNS 服务器。 + +``` +$ nslookup 8.8.8.8 +8.8.8.8.in-addr.arpa name = dns.google. +``` + +### 总结 + +`dig` 命令是掌握 DNS 工作原理和在出现连接问题时排除故障的重要工具。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3568488/digging-for-dns-answers-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://images.techhive.com/images/article/2017/01/05_tools-100704412-large.jpg +[2]: https://creativecommons.org/licenses/by/2.0/legalcode +[3]: https://www.networkworld.com/article/3268449/what-is-dns-and-how-does-it-work.html +[4]: https://tools.ietf.org/html/rfc1035 +[5]: https://www.facebook.com/NetworkWorld/ +[6]: https://www.linkedin.com/company/network-world diff --git a/published/202008/20200729 Bypass your Linux firewall with SSH over HTTP.md b/published/202008/20200729 Bypass your Linux firewall with SSH over HTTP.md new file mode 100644 index 0000000000..5f66d24517 --- /dev/null +++ b/published/202008/20200729 Bypass your Linux firewall with SSH over HTTP.md @@ -0,0 +1,94 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12504-1.html) +[#]: subject: (Bypass your Linux firewall with SSH over HTTP) +[#]: via: (https://opensource.com/article/20/7/linux-shellhub) +[#]: author: (Domarys https://opensource.com/users/domarys) + +借助 HTTP 通过 SSH 绕过 Linux 防火墙 +====== + +> 需要远程工作的看一下。使用这个有用的开源解决方案,从任何地方快速地连接和访问你的所有设备。 + +![](https://img.linux.net.cn/data/attachment/album/202008/10/231746xs4363yc03cptzbc.jpg) + +随着对连接和远程工作的需求的增长,访问远程计算资源变得越来越重要。但是,提供对设备和硬件的外部访问的要求使此任务变得复杂而有风险。旨在减少此类麻烦的 [ShellHub][2] 是一个云服务器,允许从任何外部网络常规访问这些设备。 + +ShellHub 是一个 Apache 2.0 许可的开源解决方案,它可满足所有这些需求,并允许用户通过一个帐户连接和管理多个设备。它的开发是为了方便开发者和程序员的工作,使得任何硬件架构的 Linux 设备的远程访问成为可能。 + +仔细观察,ShellHub 方案使用 HTTP 传输层来封装 SSH 协议。这种传输层的选择可以在大多数网络上无缝使用,因为大多数公司的防火墙规则和策略通常都可以使用并接受它。 + +下面这些示例使用 2020 年 6 月 10 日发布的 ShellHub 版本 0.3.2。 + +### 使用 ShellHub + +要访问该平台,只需进入 [shellhub.io][3] 并注册一个自己的帐户。你的注册数据将帮助开发团队了解用户资料并提供有关如何改进平台的更多信息。 + +![ShellHub registration form][4] + +*图 1:[shellhub.io][5] 中的注册表格* + +ShellHub 有直观、简洁的界面,这让所有的信息和功能都能以最快的方式呈现。注册后,你会看到一块仪表板,这时可以注册你的第一台设备。 + +### 添加设备 + +要启用通过 ShellHub 连接设备,你需要生成一个标识符,它用于在设备连接到服务器时对你的设备进行身份验证。 + +此标识必须配置在代理(ShellHub 客户端)内部,该代理必须与镜像一起保存在设备中,或者必须添加为 Docker 容器。 + +ShellHub 默认使用 Docker 运行代理,这非常方便,因为它在现有系统上提供了一种无痛的添加方式,支持 Docker 是唯一的要求。要添加设备,你需要粘贴命令行,它显示在 ShellHub Cloud 的对话框中(请参见图 2)。 + +![Figure 2: Adding a device to the ShellHub Cloud][6] + +*图 2:将设备添加到 ShellHub Cloud* + +设备默认使用它的 MAC 地址作为其主机名。在内部,该设备由其密钥标识,这是在设备注册期间生成的,用于与服务器进行身份验证。 + +### 访问设备 + +要访问你的设备,只需进入仪表板中的“查看所有设备”,或单击左侧菜单上的“设备”。这将列出你所有已注册的设备。 + +设备状态可在页面上轻松看到。在线设备旁边会显示一个绿色图标,可以单击终端图标进行连接。你接着输入密码,最后单击”连接“按钮,请参见(图 3)。 + +![Figure 3: Accessing a device using the terminal on the web][7] + +*图 3:使用网络上的终端访问设备* + +另一种访问设备的方法是从类似 [PuTTY][8]、[Termius][9] 之类的 SSH 客户端,甚至 Linux 终端访问。我们可以使用称为 SSHID 的 ShellHub 标识作为连接的目的地址(例如 `ssh username@SSHID`)。图 4 说明了如何使用在终端中使用 Linux SSH 客户端连接到我们的计算机。 + +![Figure 4: Connecting to a device using the Linux terminal][11] + +*图 4:使用 Linux 终端连接到设备* + +无论你何时登录 ShellHub Cloud 平台,你都可以访问仪表板上的所有已注册设备,这样你可以随时随地访问它们。ShellHub 通过一个开源平台,以透明的方式为您与远程机器保持通信安全的过程增加了简单性。 + +在 [GitHub][2] 上加入 ShellHub 社区,或随时通过 [Gitter][12] 或通过电子邮件 [contato@ossystems.com.br][13] 向开发团队发送你的建议或反馈。我们很乐意收到社区成员的贡献! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/linux-shellhub + +作者:[Domarys][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/domarys +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/terminal_command_linux_desktop_code.jpg?itok=p5sQ6ODE (Terminal command prompt on orange background) +[2]: https://github.com/shellhub-io/shellhub +[3]: https://www.shellhub.io/ +[4]: https://opensource.com/sites/default/files/uploads/shellhub_registration_form_0.png (ShellHub registration form) +[5]: https://opensource.com/article/20/7/www.shellhub.io +[6]: https://opensource.com/sites/default/files/figure2.gif +[7]: https://opensource.com/sites/default/files/figure3.gif +[8]: https://www.putty.org/ +[9]: https://termius.com/ +[10]: mailto:username@SSHID +[11]: https://opensource.com/sites/default/files/figure4.gif +[12]: https://gitter.im/shellhub-io/community?at=5e39ad8b3aca1e4c5f633e8f +[13]: mailto:contato@ossystems.com.br diff --git a/published/202008/20200730 10 cheat sheets for Linux sysadmins.md b/published/202008/20200730 10 cheat sheets for Linux sysadmins.md new file mode 100644 index 0000000000..53e7766a2d --- /dev/null +++ b/published/202008/20200730 10 cheat sheets for Linux sysadmins.md @@ -0,0 +1,128 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12490-1.html) +[#]: subject: (10 cheat sheets for Linux sysadmins) +[#]: via: (https://opensource.com/article/20/7/sysadmin-cheat-sheets) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Linux 系统管理员的 10 份速查表 +====== + +> 这些快速参考指南让系统管理员的生活和日常工作变得更轻松,而且它们都是免费提供的。 + +![](https://img.linux.net.cn/data/attachment/album/202008/05/222202qildlyr1lnqwq0o4.jpg) + +作为一名系统管理员,你做所的不是一件工作,而是**全部**工作,而且往往每一件工作都是随时随地出现,毫无预兆。除非你每天都只做一项任务,否则当需要的时候,你可能并不总是都能将所有的命令和选项都记在脑海里。这就是为什么我喜欢速查表的原因。 + +速查表可以帮助你避免愚蠢的错误,它们可以让你不必翻阅数页的文档,并让你高效地完成任务。我为每位系统管理员挑选了我最喜欢的 10 个速查表,无论他的经验水平如何。 + +### 网络 + +我们的《[Linux 网络][2]》速查表是速查表界的的瑞士军刀,它包含了最常见的网络命令的简单提醒,包括 `nslookup`、`tcpdump`、`nmcli`、`netstat`、`traceroute` 等。最重要的是,它用了 `ip` 命令,所以你终于可以不用再默认使用 `ifconfig` 命令了! + +### 防火墙 + +系统管理员有两种:了解 `iptables` 的和使用前一类人编写的 `iptables` 配置文件的。如果你是第一类人,你可以继续使用你的 `iptables` 配置,有没有 [firewalld][3] 都无所谓。 + +如果你是第二类人,你终于可以放下你的 iptables 焦虑,拥抱 firewalld 的轻松。阅读《[用 firewall-cmd 保护你的 Linux 网络][4]》,然后下载我们的《[firewalld 速查表][5]》来记住你所学到的东西,保护你的网络端口从未如此简单。 + +### SSH + +许多系统管理员都用的是 [POSIX][6] shell,所以可以在别人的计算机上运行的远程 shell 是 Linux 上最重要的工具之一也就不足为奇了。任何学习服务器管理的人通常很早就学会了使用 SSH,但我们中的许多人只学习了基础知识。 + +当然,SSH 可以在远程机器上打开一个交互式的 shell,但它的功能远不止这些。比如说,你需要在远程机器上进行图形化登录。远程主机的用户要么不在键盘旁边,要么无法理解你启用 VNC 的指令。只要你有 SSH 权限,就可以为他们打开端口。 + +``` +$ ssh -L 5901:localhost:5901 +``` + +通过我们的《[SSH 速查表][7]》了解更多。 + +### Linux 用户和权限 + +传统的大型机和 UNIX 超级计算机风格的用户账户现在基本上已经被 Samba、LDAP 和 OpenShift等系统所取代。然而,这并没有改变对管理员和服务账户仔细管理的需求。为此,你仍然需要熟悉`useradd`、`usermod`、`chown`、`chmod`、`passwd`、`gpasswd`、`umask` 等命令。 + +把我的《[用户和权限速查表][8]》放在手边,你就可以随时对与用户管理有关的任务进行合理的概览,并有实例命令演示你需要做的任何事情的正确语法。 + +### 基本的 Linux 命令 + +并不是所有的系统管理员都会把所有的时间花在终端上。无论你是否喜欢在桌面上工作,还是刚开始使用 Linux,有时为常用的终端命令提供一个任务导向的参考是很好的。 + +对于一个为灵活性和即兴性而设计的界面来说,找到所有你可能需要的东西是很困难的,但我的《[常用命令速查表][9]》是相当全面的。这张速查表以任何技术型桌面用户的典型生活为蓝本,涵盖了用命令在计算机内导航、寻找文件的绝对路径、复制和重命名文件、建立目录、启动系统服务等内容。 + +### Git + +在计算机的历史上,版本控制曾经是只有开发者才需要的东西。但那是过去,而 Git 是现在。对于任何希望跟踪从 Bash 脚本到配置文件、文档和代码的变化的人来说,版本控制是一个重要的工具。Git 适用于每个人,包括程序员、网站可靠性工程师(SRE),甚至系统管理员。 + +获取我们的《[Git 速查表][10]》来学习要领、基本工作流程和最重要的 Git 标志。 + +### Curl + +Curl 不一定是系统管理员专用的工具,从技术上讲,它“只是”一个用于终端的非交互式 Web 浏览器。你可能几天都不用它一次。然而,你很有可能会发现 Curl 对你每天要做的事情很有用,不管是快速参考网站上的一些信息,还是排除网络主机的故障,或者是验证你运行或依赖的一个重要 API。 + +Curl 是一个向服务器传输数据的命令,它支持的协议包括 HTTP、FTP、IMAP、LDAP、POP3、SCP、SFTP、SMB、SMTP 等。它是一个重要的网络工具,所以下载我们的《[Curl 速查表][11]》,开始探索 Curl 吧。 + +### SELinux + +Linux 的安全策略在默认情况下是很好的,root 权限和用户权限之间有很强的分离,但 SELinux 使用标签系统对其进行了改进。在配置了 SELinux 的主机上,每个进程和每个文件对象(或目录、网络端口、设备等)都有一个标签。SELinux 提供了一套规则来控制进程标签对对象(如文件)标签的访问。 + +有时候你需要调整 SELinux 策略,或者调试一些安装时没有正确设置的东西,或者深入了解当前的策略。我们的《[SELinux 速查表][12]》可以提供帮助。 + +### Kubectl + +无论你是已经迁移到了开放的混合云、封闭的私有云,还是你还在研究这样的迁移需要准备什么,你都需要了解 Kubernetes。虽然云确实还需要人去摆弄物理服务器,但作为一个系统管理员,你的未来肯定会涉及到容器,而没有什么比 Kubernetes 更能做到这一点。 + +虽然 [OpenShift][13] 为 Kubernetes 提供了流畅的“仪表盘”体验,但有时需要一种直接的方法,这正是 `kubectl` 提供的。下一次当你不得不到处推送容器时,请确保你手头有我们的《[kubectl 速查表][14]》。 + +### awk + +近几年来,Linux 经历了很多创新,有虚拟机、容器、新的安全模型、新的初始化系统、云等等。然而有些东西似乎永远不会改变。尤其是,系统管理员需要从日志文件和其它无尽的数据流中解析和隔离信息。仍然没有比 Aho、Weinberger 和 Kernighan 的经典 `awk` 命令更适合这项工作的工具。 + +当然,自从 1977 年它被编写出来后,`awk` 已经走过了很长的路,新的选项和功能使它更容易使用。但如果你不是每天都在使用 `awk`,那么多的选项和语法可能会让你有点不知所措。下载我们的《[awk 速查表][15]》,了解 GNU awk 的工作原理。 + +### 赠品:Bash 脚本编程 + +速查表是有用的,但如果你想找更全面的东西,你可以下载我们的《[Bash 脚本编程手册][16]》。这本指南教你如何将你从速查表中了解到的所有命令和经验结合到脚本中,帮助你建立一个随时能用的自动化解决方案库来解决你的日常问题。本书内容丰富,详细讲解了 Bash 的工作原理、脚本与交互式命令的区别、如何捕捉错误等。 + +### 赋能系统管理员 + +你是一名系统管理员吗? + +你正在成为一名系统管理员的路上吗? + +你是否对系统管理员一天都在做什么感到好奇? + +如果是的话,请查看《[赋能系统管理员][17]》,这里有来自业界最勤奋的系统管理员的新文章,讲述他们的工作,以及 Linux 和开源如何让这一切成为可能。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/sysadmin-cheat-sheets + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_linux11x_cc.png?itok=XMDOouJR (People work on a computer server with devices) +[2]: https://opensource.com/downloads/cheat-sheet-networking +[3]: https://firewalld.org/ +[4]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd +[5]: https://opensource.com/downloads/firewall-cheat-sheet +[6]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[7]: https://opensource.com/downloads/advanced-ssh-cheat-sheet +[8]: https://opensource.com/downloads/linux-permissions-cheat-sheet +[9]: https://opensource.com/downloads/linux-common-commands-cheat-sheet +[10]: https://opensource.com/downloads/cheat-sheet-git +[11]: https://opensource.com/downloads/curl-command-cheat-sheet +[12]: https://opensource.com/downloads/cheat-sheet-selinux +[13]: https://opensource.com/tags/openshift +[14]: https://opensource.com/downloads/kubectl-cheat-sheet +[15]: https://opensource.com/downloads/cheat-sheet-awk-features +[16]: https://opensource.com/downloads/bash-scripting-ebook +[17]: http://redhat.com/sysadmin diff --git a/published/202008/20200801 How to Install the Latest Version of Handbrake on Ubuntu-based Linux Distributions -Quick Tip.md b/published/202008/20200801 How to Install the Latest Version of Handbrake on Ubuntu-based Linux Distributions -Quick Tip.md new file mode 100644 index 0000000000..f29ae37c39 --- /dev/null +++ b/published/202008/20200801 How to Install the Latest Version of Handbrake on Ubuntu-based Linux Distributions -Quick Tip.md @@ -0,0 +1,92 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12515-1.html) +[#]: subject: (How to Install the Latest Version of Handbrake on Ubuntu-based Linux Distributions [Quick Tip]) +[#]: via: (https://itsfoss.com/install-handbrake-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Ubuntu 上安装最新版本的 Handbrake +====== + +> 此快速教程介绍了如何使用在基于 Ubuntu 的发行版上使用官方 PPA 安装最新版本的 HandBrake。 + +![](https://img.linux.net.cn/data/attachment/album/202008/13/223818yghmgmagqggm2pa0.jpg) + +[HandBrake][1] 是可用于 Linux、Windows 和 macOS 的最受欢迎的开源视频转换器之一。 + +此 GUI 应用让你只需单击几下即可将视频从一种格式转换为另一种格式。你还可以根据需要自定义输出视频。 + +[HandBrake][2] 存在于 [Ubuntu 的通用存储库][3]中,但它可能并不总是最新版本。让我向你展示如何在 Ubuntu 和其他基于 Ubuntu 的发行版(如 Linux Mint、Linux Lite、elementray OS 等)上获得最新的 HandBrake。 + +### 在基于 Ubuntu 的 Linux 发行版上安装最新的 HandBrake + +HandBrake 的开发人员维护着一个[官方的 PPA][4]。[使用此 PPA][5],你可以轻松地在基于 Ubuntu 的发行版中安装最新版本的 HandBrake。 + +打开终端,然后使用以下命令添加 PPA 仓库。需要时按下回车键: + +``` +sudo add-apt-repository ppa:stebbins/handbrake-releases +``` + +你可能需要更新本地软件包缓存(在 Ubuntu 18.04 和更高版本中不是必需的): + +``` +sudo apt update +``` + +现在,使用以下命令安装最新版本的 HandBrake: + +``` +sudo apt-get install handbrake-gtk +``` + +这个方法最好的地方是会删除旧的 handbrake 软件包,从而避免安装两个不同版本的 handbrake。 + +![][6] + +在你的 Linux 系统上享受最新最好的 HandBrake 并转换视频。 + +### 从系统中卸载 HandBrake + +由于某些原因,如果你不喜欢 HandBrake 并希望将它删除,那么需要执行以下操作。 + +打开终端并使用以下命令卸载 HandBrake: + +``` +sudo apt remove handbrake-gtk +``` + +现在,你已经删除了该应用,如果你不再需要它,那么[删除它的 PPA][7] 是一个好主意。 + +``` +sudo add-apt-repository -r ppa:stebbins/handbrake-releases +``` + +在询问时确认。 + +在这篇快速 Ubuntu 教程中,你学习了使用 PPA 安装最新的 HandBrake 的步骤。你还了解了正确删除它的步骤。 + +我希望你觉得这篇快速教程有用。如果你有任何问题或建议,请在下面发表评论。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-handbrake-ubuntu/ + +作者:[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://handbrake.fr/ +[2]: https://itsfoss.com/handbrake/ +[3]: https://itsfoss.com/ubuntu-repositories/ +[4]: https://launchpad.net/~stebbins/+archive/ubuntu/handbrake-releases +[5]: https://itsfoss.com/ppa-guide/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/install-handbrake-ubuntu.png?resize=800%2C498&ssl=1 +[7]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ diff --git a/published/202008/20200802 Manjaro vs Arch Linux- What-s the Difference- Which one is Better.md b/published/202008/20200802 Manjaro vs Arch Linux- What-s the Difference- Which one is Better.md new file mode 100644 index 0000000000..a16f98b07a --- /dev/null +++ b/published/202008/20200802 Manjaro vs Arch Linux- What-s the Difference- Which one is Better.md @@ -0,0 +1,154 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12527-1.html) +[#]: subject: (Manjaro vs Arch Linux: What’s the Difference? Which one is Better?) +[#]: via: (https://itsfoss.com/manjaro-vs-arch-linux/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +Manjaro 和 Arch Linux 有何不同,哪个更好? +====== + +> Manjaro 还是 Arch Linux?如果说 Manjaro 是基于 Arch 的,那么它和 Arch 又有什么不同呢?请在这篇比较文章中阅读 Arch 和 Manjaro 的不同之处吧。 + +大多数[适合初学者的 Linux 发行版][1]都是基于 Ubuntu 的。随着 Linux 用户经验的增加,一些人开始尝试使用更高级的发行版,主要是在“Arch 领域”。 + +这个所谓的 “Arch 领域”以两个发行版为主。[Arch Linux][2] 本身和 [Manjaro][3]。还有其他[基于 Arch 的 Linux 发行版][4],但都没有这两个发行版受欢迎。 + +如果你在 Arch 和 Manjaro 之间感到困惑,那么这个比较应该能帮助你。 + +### Manjaro 和 Arch Linux:它们有什么不同或相似之处? + +![][5] + +我试图在各个方面比较这两种发行版。请记住,我并没有只关注差异,我还指出了它们的相似之处。 + +#### 两者都是滚动发布的版本,但不是同一种类型 + +在 Arch 和 Manjaro 中,没有像 Ubuntu 或 Fedora 那样每隔几个月或几年就会有一次“发布”。只要[保持你的 Arch 或 Manjaro 系统的更新][6],你将永远拥有最新版本的操作系统和软件包。你不需要像以往一样担心升级你的安装版本。 + +如果你打算在某个时候进行全新安装,请记住,Manjaro 和 Arch 都会定期更新它的安装 ISO。这被称为 ISO 刷新,它确保新安装的系统不必安装过去几个月中所有可用的新系统更新。 + +但 Arch 和 Manjaro 的滚动发布模式是有区别的。 + +除了社区维护的 Arch 用户软件库Arch User Repository(AUR)之外,Manjaro 也维护着自己的独立软件库,这些软件库也包含了非 Arch 提供的软件包。那些原本由 Arch 官方软件库提供的流行软件包将首先进行彻底的测试(必要时打上补丁),然后 Manjaro 再次发布,这通常比 Arch 晚两周左右,发布到 Manjaro 自己的稳定软件库供公众使用。 + +![][7] + +适应这个测试过程的一个后果是,Manjaro 永远不会像 Arch 一样那么激进尝鲜。但这样一来,就使得 Manjaro 比 Arch 稍微稳定一些,也不容易破坏你的系统。 + +#### 包管理 - Pacman 和 Pamac + +Arch 和 Manjaro 都提供了基于命令行的软件包管理工具 Pacman,它是用 C 语言编写的,使用 `tar` 来打包应用程序。换句话说,你可以[使用相同的 pacman 命令][8]来管理两个发行版的软件包。 + +除了 Pacman,Manjaro 还开发了一个名为 Pamac 的 GUI 应用程序,用于在 Manjaro 上轻松安装软件。这使得使用 Manjaro 比使用 Arch 更容易。 + +![Manjaro 的 Pamac GUI 包管理器][9] + +请注意,你也可以在 Arch Linux 中从 AUR 安装 Pamac,但该工具是 Manjaro 的组成部分。 + +#### Manjaro 硬件检测工具(MHWD) + +Pamac 并不是 Manjaro 团队开发的唯一帮助用户的 GUI 工具。Manjaro 还有一个专门的工具,用于检测硬件并为其推荐驱动程序。 + +![Manjaro 硬件配置 GUI 工具][10] + +这个硬件检测工具非常有用,可以说是 [Manjaro 受到社区喜爱的主要原因][11]之一。它使得检测、安装、使用或从一个驱动切换到另一个驱动都非常简单,让硬件兼容性成为了过去。 + +#### 驱动程序支持 + +Manjaro 为 GPU 驱动提供了极大的支持。我们都知道多年来 Linux 在安装驱动程序(特别是 Nvidia)方面存在问题。 + +当[安装 Manjaro][12] 时,它给出了从开源(自由)或非开源(非自由)图形驱动安装开始的选项。当你选择“非自由”时,它会自动检测你的显卡,并为其安装最合适的驱动程序,因此 GPU 可以开箱即用。 + +由于有了上一节中看到的硬件检测工具,甚至在安装 Manjaro 时,安装显卡驱动会更加容易。 + +如果你有一个带有 Nvidia Optimus 卡(混合 GPU)的系统,它与 Manjaro 配合良好。你会有很多方式来让它工作。 + +在 Arch Linux 中,你必须为你的机器安装(如果你能找到)合适的驱动程序。 + +#### 访问 Arch 用户软件库(AUR) + +[Arch 用户软件库][13](AUR)是一个面向基于 Arch 的 Linux 发行版用户的社区驱动的软件库。AUR 的创建是为了组织和分享来自社区的新软件包,并帮助加快流行软件包被纳入[社区软件库][14]。 + +大量进入官方软件库的新软件包都是从 AUR 开始的。在 AUR 中,用户能够贡献自己的软件包构建(`PKGBUILD` 和相关文件)。 + +你可以在 Arch 和 Manjaro 中使用 AUR。 + +#### 桌面环境 + +好吧!你可以在任何 Linux 发行版上使用几乎所有的桌面环境。Arch 和 Manjaro 也不例外。 + +然而,一个专门的桌面风格或版本可以让用户更容易地在桌面环境里获得顺畅的体验。 + +默认的 Arch ISO 并不包含任何桌面环境。例如,你想[在 Arch Linux 上安装 KDE][15],你必须在[安装 Arch Linux][16] 时或在之后下载安装它。 + +而 Manjaro 则为 Xfce、KDE 和 GNOME 等桌面环境提供了不同的 ISO。Manjaro 社区还维护着 MATE、Cinnamon、LXDE、LXQt、OpenBox 等桌面环境的 ISO。 + +#### 安装程序 + +![Arch 即用启动][17] + +Manjaro 是基于 Arch Linux 的,它是兼容 Arch 的,但**它不是 Arch**。它甚至不是只有一个图形安装程序的预配置版本的 Arch。Arch 并不具备通常的舒适的开箱即用,这也是为什么大多数人喜欢更简单的东西。Manjaro 为你提供了简单的入口,但支持你成为经验丰富的用户或资深用户。 + +#### 文档和支持 + +Arch 和 Manjaro 都有自己的维基页面和支持论坛来帮助各自的用户。 + +虽然 Manjaro 有一个不错的[维基][18]文档,但 [Arch 维基][19]则不可同日而语。你可以在 Arch 维基中找到关于 Arch Linux 各方面的详细信息。 + +#### 目标受众 + +关键的区别在于 [Arch 针对的是抱着自己动手的态度的用户][20],他们愿意阅读文档,自己解决问题。 + +而 Manjaro 则是针对那些没有那么多经验或者不想花时间组装操作系统的 Linux 用户。 + +### 结论 + +有些人经常说 Manjaro 是给那些不会安装 Arch 的人用的。但我认为这是不对的。不是每个人都想从头配置 Arch,或者没有太多时间。 + +Manjaro 绝对是一只野兽,但与 Arch 截然不同。**快速、强大,并总是保持更新**,Manjaro 提供了 Arch 操作系统的所有优点,但特别强调**稳定性、用户友好性和可访问性**,既适合新手,也适合有经验的用户。 + +Manjaro 并不像 Arch Linux 那样极简主义。在 Arch 中,你从一个空白的画布开始,手动调整每个设置。当默认的 Arch 安装完成后,你在命令行就有了一个正在运行的 Linux 实例。想要一个[图形化桌面环境][21]?那就自己来吧 —— 有很多选择。选择一个,安装,然后配置它。你可以从中学到很多东西,特别是如果你是 Linux 新手的话。你会对系统是如何组合在一起的,以及为什么要以这样的方式安装东西有很好的理解。 + +我希望你现在对 Arch 和 Manjaro 有了更好的理解。现在,你明白了它们是相似而不同的了吧。 + +我已经发表了我的看法。不要犹豫,请在评论区分享你的观点。在 Arch 和 Manjaro 之间,你更喜欢哪一个,为什么。 + +Abhishek Prakash 也此文补充了内容。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/manjaro-vs-arch-linux/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-linux-beginners/ +[2]: https://www.archlinux.org/ +[3]: https://manjaro.org/ +[4]: https://itsfoss.com/arch-based-linux-distros/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/arch-vs-manjaro.png?ssl=1 +[6]: https://itsfoss.com/update-arch-linux/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/repositories.png?ssl=1 +[8]: https://itsfoss.com/pacman-command/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/Pamac.png?resize=800%2C534&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/hardware-detection.png?ssl=1 +[11]: https://itsfoss.com/why-use-manjaro-linux/ +[12]: https://itsfoss.com/install-manjaro-linux/ +[13]: https://linux.cn/article-12107-1.html +[14]: https://wiki.archlinux.org/index.php/Community_repository +[15]: https://linux.cn/article-12258-1.html +[16]: https://itsfoss.com/install-arch-linux/ +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/Arch-live-boot.jpg?ssl=1 +[18]: https://wiki.manjaro.org/index.php?title=Main_Page +[19]: https://wiki.archlinux.org/ +[20]: https://linux.cn/article-12445-1.html +[21]: https://itsfoss.com/best-linux-desktop-environments/ diff --git a/published/202008/20200802 Why making mistakes makes me a better sysadmin.md b/published/202008/20200802 Why making mistakes makes me a better sysadmin.md new file mode 100644 index 0000000000..af4d719498 --- /dev/null +++ b/published/202008/20200802 Why making mistakes makes me a better sysadmin.md @@ -0,0 +1,59 @@ +[#]: collector: (lujun9972) +[#]: translator: (Starryi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12521-1.html) +[#]: subject: (Why making mistakes makes me a better sysadmin) +[#]: via: (https://opensource.com/article/20/8/sysadmin-mistakes) +[#]: author: (Ben Cotton https://opensource.com/users/bcotton) + +为什么犯错让我成为一个更好的系统管理员 +====== + +> 诀窍就是同一个错误不要犯两次。 + +![](https://img.linux.net.cn/data/attachment/album/202008/16/001203jeyztczb8t6q8egc.jpg) + +到目前为止,我已做了十多年 [Fedora][2] 贡献者。 Fedora 有一个由开发者和用户组成的大型社区,其中每一个人,不管是极富洞察力的用户还是出色的程序员,都有一些独有的技能。我喜欢这样的社区,因为它能激励我培养自己的新技能。 + +对我来说,培养技能最好的方法就是犯错,比如把事情搞得一团糟。犯什么样的错误不重要,因为相比错误本身,我在脱离困境的过程里学习到了什么更重要。 + +### 为什么犯错误是好事 + +我依然记得我犯的第一个计算机错误。我家的第一台电脑是我叔叔升职后送个我们的爱普生笔记本电脑,它有一个特别快的 10 MHz 处理器,因为太重了,所以还有一个手提把手。我很喜欢它。 + +它运行 DOS,但有一个基于文本的菜单应用,所以对新手用户比较友好。硬盘菜单有十个“页面”,每个“页面”可以配置十个命令。我们有一个游戏页面,还有一个页面放些“无聊的东西”,比如文字处理程序和电子表格等等。 + +硬盘菜单还有一些其他功能,当我玩腻了游戏,就会去探索它们。有一天,我决定使用菜单的账户功能。账户不会改变出现的应用程序,但在某种程度上,可以防止对应用程序未经授权的访问。你可以直接跳到 DOS 中取代它,但使用账户仍然是一个不错的尝试。 + +我为自己、父母和妹妹创建了账户。虽然我父母有点不开心,但他们最终迁就了我。万事顺遂了一段时间后,妹妹忘记了她的账户密码。于是,我父母让我删掉她的密码,但是没有妹妹的密码去登录账户,我就无法删除她的密码(那是在 90 年代初,一个比现在简单得多的时代)。要怎么办?要怎么办? + +那以后一段时间,我们一直试着猜测密码,直到有一天,我决定尝试做一些我还没有做过的事情。当我第一次创建帐户时,我设置了一个主密码。如果我输入主密码来代替我妹妹的密码,会发生什么呢? + +如果你在想,“这当然不会有用的”,那么显然你不熟悉 90 年代安全策略的天真幼稚。有了主密码(顺便说一下,主密码是 “worf” ,指的是企业号星舰的克林贡人安全主管,如果你不是《星际迷航:下一代》粉丝的话),我可以删除所有密码。于是,家里的每个人又都可以毫无障碍地使用电脑了。 + +### 试运行的重要性 + +在那之后,我又犯了更大更有益的错误。比如,在我第一次做系统管理员时,当时我正整理一些数据以重新配置存储阵列。有一次,我意外地颠倒了源路径和目标路径,而且那是一个带有 `——delete` 标志的 `rsync` 命令。真的是太糟糕了! + +幸运的是,我自己的账户也崩溃了,这让我的道歉更容易被其他受影响的用户接受。对我们所有人来说更幸运的是,我们有备份。所以那天结束的时候,每个人的文件都找回来了,我还学到了一个宝贵的教训,那就是在进行破坏性同步之前,先使用 `--dry-run` 标志试运行。 + +### 以正确的方式处理错误 + +我不介意犯错误。这些年来,我积累了很多实践经验,学到的诀窍就是不要犯同样的错误。从错误中学习能让我在技能和事业上取得进步,并发现新的会犯的错误。作为 Linux 系统管理员,我总是试图在一个安全的环境(测试平台就很好)中犯错误,确保我可以从错误中恢复(备份真的非常非常重要!),并给以后的我留个笔记,这样他就不会重复犯错(文档是你的朋友)。当然,还要勇于承认自己的错误,并在出现问题时清楚地与用户沟通。如果我一直这样做,也许有一天我就会觉得我很清楚我在做什么! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/sysadmin-mistakes + +作者:[Ben Cotton][a] +选题:[lujun9972][b] +译者:[Starryi](https://github.com/Starryi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/bcotton +[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]: http://getfedora.org diff --git a/published/202008/20200803 Do math in the Linux shell with GNU bc.md b/published/202008/20200803 Do math in the Linux shell with GNU bc.md new file mode 100644 index 0000000000..c0b41ddb60 --- /dev/null +++ b/published/202008/20200803 Do math in the Linux shell with GNU bc.md @@ -0,0 +1,164 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12506-1.html) +[#]: subject: (Do math in the Linux shell with GNU bc) +[#]: via: (https://opensource.com/article/20/7/bc-math) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 GNU bc 在 Linux Shell 中进行数学运算 +====== + +> 在 shell 中使用 bc 更好地做算数,它是一种用于高级计算的数学语言。 + +![](https://img.linux.net.cn/data/attachment/album/202008/11/105133c86k08rf028jjd6a.jpg) + +大多数 [POSIX][2] 系统带有 [GNU bc][3],这是一种任意精度的数字处理语言。它的语法类似于 C,但是它也支持交互式执行语句和处理来自标准输入(`stdin`)的数据。因此,它通常是以下问题的答案:“我如何在 Linux shell 中进行数学运算?”这种回应方式在网上很常见: + +``` +$ echo "1+1" | bc +2 +``` + +尽管这是完全正确的,但很少有用户认为,与更直观的方式相比,它很优雅,例如: + +``` +$ 1+1  # 这不能工作 +2 +``` + +交互模式要容易一些: + +``` +$ bc +1+1 +2 +quit +$ +``` + +但是交互模式并不总是适合简单计算想要的直观工作流,比如直接输入你想要的计算。因此我推荐 Bluebat 的[纯 Bash 计算器][4]。 + +`bc` 实际上提供了一种用于高级计算的数学语言。 + +### 含高级函数的 mathlib + +`bc` 本身提供了基本的数学函数。你可以在交互式模式下测试它们: + +``` +$ bc +3^2 +9 +(3^2)*(9)/3 +27 +``` + +使用 `--mathlib` 选项获取高级函数,包括正弦、余弦、正切等。在交互式模式下,你可以测试其中一些。下面是 90 度的余弦: + +``` +c(90) +-.44807361612917015236 +``` + +9 的正弦: + +``` +s(9) +.41211848524175656975 +``` + +### 创建你自己的 bc 函数 + +你还可以在 `bc` 中创建自己的函数。函数定义以 `define` 关键字开始,并用大括号括起来。下面是一个输入到交互式会话中的简单函数,它返回给它的任意数字: + +``` +$ bc +define echo(n) { +  return (n); +} +``` + +在同一个交互式会话中,测试一下: + +``` +echo(2) +2 +echo(-2) +-2 +``` + +### bc 中的 if 语句 + +`bc` 语言还有各种控制语句,其中最简单的是 `if`/`else`。语法乍一看可能很熟悉,但在如何处理大括号方面有些不同。请注意,`if` 语句的 `else` 子句包含在大括号中,而 `then` 子句不是,但两者都用分号终止。下面是一个返回数字 `n` 的绝对值的函数: + +``` +define abso(n) { +  if ( n > 0 ) return (n); +  { return (-n); } +} +``` + +在同一个交互式会话中,测试一下: + +``` +abso(-5) +5 +abso(5) +5 +``` + +### 将数据导入 bc + +使用交互式会话对于快速计算和实验是可以容忍的,但在退出时会丢失数据,并且在出错时很难编辑。幸运的是,`bc` 可以从外部文件加载变量和函数。 + +下面是一个包含两个变量(`sol` 和 `foo`)的文件,以及一个用于查找绝对值的自定义 `abso` 函数: + +``` +sol=299792458 + +foo=42 + +define abso(n) { +  if ( n > 0 ) return (n); +  { return (-n); } +} +``` + +将它保存到名为 `bcvars.bc` 的文件中,以便导入 `bc` 交互式会话: + +``` +$ bc bcvars.bc +foo +42 +sol +299792458 +abso(-23) +23 +``` + +### 使用 bc 助力你的数学 + +`bc` 语言相对简单,前提是你知道足够的数学知识来构造任何你想完成的方程。虽然 `bc` 默认提供了有用的基本函数,并允许你创建自己的函数,但你可以通过站在巨人的肩膀上来减少工作量。加载了用于数学基础知识和特定任务(例如,计算复利)的新函数的文件可从 [GNU bc 页][5]获得,同时也可获得 `bc` [完整文档][6]。 + +如果你有兴趣在 shell 里更好地处理数学,试试 `bc` 。它不会使你成为数学天才,但它可能会让过程更简单。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/bc-math + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/math_money_financial_calculator_colors.jpg?itok=_yEVTST1 (old school calculator) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://www.gnu.org/software/bc/ +[4]: https://raw.githubusercontent.com/bluebat/.bash/master/bashbc.sh +[5]: http://phodd.net/gnu-bc/ +[6]: https://www.gnu.org/software/bc/manual/html_mono/bc.html diff --git a/published/202008/20200804 Creating and debugging Linux dump files.md b/published/202008/20200804 Creating and debugging Linux dump files.md new file mode 100644 index 0000000000..7bed062411 --- /dev/null +++ b/published/202008/20200804 Creating and debugging Linux dump files.md @@ -0,0 +1,244 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12554-1.html) +[#]: subject: (Creating and debugging Linux dump files) +[#]: via: (https://opensource.com/article/20/8/linux-dump) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) + +在 Linux 上创建并调试转储文件 +====== + +> 了解如何处理转储文件将帮你找到应用中难以重现的 bug。 + +![](https://img.linux.net.cn/data/attachment/album/202008/26/234535rhnwdc783swgsbqw.jpg) + +崩溃转储、内存转储、核心转储、系统转储……这些全都会产生同样的产物:一个包含了当应用崩溃时,在那个特定时刻应用的内存状态的文件。 + +这是一篇指导文章,你可以通过克隆示例的应用仓库来跟随学习: + +``` +git clone https://github.com/hANSIc99/core_dump_example.git +``` + +### 信号如何关联到转储 + +信号是操作系统和用户应用之间的进程间通讯。Linux 使用 [POSIX 标准][2]中定义的信号。在你的系统上,你可以在 `/usr/include/bits/signum-generic.h` 找到标准信号的定义。如果你想知道更多关于在你的应用程序中使用信号的信息,这有一个信息丰富的 [signal 手册页][3]。简单地说,Linux 基于预期的或意外的信号来触发进一步的活动。 + +当你退出一个正在运行的应用程序时,应用程序通常会收到 `SIGTERM` 信号。因为这种类型的退出信号是预期的,所以这个操作不会创建一个内存转储。 + +以下信号将导致创建一个转储文件(来源:[GNU C库][4]): + + * `SIGFPE`:错误的算术操作 + * `SIGILL`:非法指令 + * `SIGSEGV`:对存储的无效访问 + * `SIGBUS`:总线错误 + * `SIGABRT`:程序检测到的错误,并通过调用 `abort()` 来报告 + * `SIGIOT`:这个信号在 Fedora 上已经过时,过去在 [PDP-11][5] 上用 `abort()` 时触发,现在映射到 SIGABRT + +### 创建转储文件 + +导航到 `core_dump_example` 目录,运行 `make`,并使用 `-c1` 开关执行该示例二进制: + +``` +./coredump -c1 +``` + +该应用将以状态 4 退出,带有如下错误: + +![Dump written][6] + +“Abgebrochen (Speicherabzug geschrieben) ”(LCTT 译注:这是德语,应该是因为本文作者系统是德语环境)大致翻译为“分段故障(核心转储)”。 + +是否创建核心转储是由运行该进程的用户的资源限制决定的。你可以用 `ulimit` 命令修改资源限制。 + +检查当前创建核心转储的设置: + +``` +ulimit -c +``` + +如果它输出 `unlimited`,那么它使用的是(建议的)默认值。否则,用以下方法纠正限制: + +``` +ulimit -c unlimited +``` + +要禁用创建核心转储,可以设置其大小为 0: + +``` +ulimit -c 0 +``` + +这个数字指定了核心转储文件的大小,单位是块。 + +### 什么是核心转储? + +内核处理核心转储的方式定义在: + +``` +/proc/sys/kernel/core_pattern +``` + +我运行的是 Fedora 31,在我的系统上,该文件包含的内容是: + +``` +/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h +``` + +这表明核心转储被转发到 `systemd-coredump` 工具。在不同的 Linux 发行版中,`core_pattern` 的内容会有很大的不同。当使用 `systemd-coredump` 时,转储文件被压缩保存在 `/var/lib/systemd/coredump` 下。你不需要直接接触这些文件,你可以使用 `coredumpctl`。比如说: + +``` +coredumpctl list +``` + +会显示系统中保存的所有可用的转储文件。 + +使用 `coredumpctl dump`,你可以从最后保存的转储文件中检索信息: + +``` +[stephan@localhost core_dump_example]$ ./coredump  +Application started… + +(…….) + +Message: Process 4598 (coredump) of user 1000 dumped core. + +Stack trace of thread 4598: +#0 0x00007f4bbaf22625 __GI_raise (libc.so.6) +#1 0x00007f4bbaf0b8d9 __GI_abort (libc.so.6) +#2 0x00007f4bbaf664af __libc_message (libc.so.6) +#3 0x00007f4bbaf6da9c malloc_printerr (libc.so.6) +#4 0x00007f4bbaf6f49c _int_free (libc.so.6) +#5 0x000000000040120e n/a (/home/stephan/Dokumente/core_dump_example/coredump) +#6 0x00000000004013b1 n/a (/home/stephan/Dokumente/core_dump_example/coredump) +#7 0x00007f4bbaf0d1a3 __libc_start_main (libc.so.6) +#8 0x000000000040113e n/a (/home/stephan/Dokumente/core_dump_example/coredump) +Refusing to dump core to tty (use shell redirection or specify — output). +``` + +这表明该进程被 `SIGABRT` 停止。这个视图中的堆栈跟踪不是很详细,因为它不包括函数名。然而,使用 `coredumpctl debug`,你可以简单地用调试器(默认为 [GDB][8])打开转储文件。输入 `bt`(回溯backtrace的缩写)可以得到更详细的视图: + +``` +Core was generated by `./coredump -c1'. +Program terminated with signal SIGABRT, Aborted. +#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 +50  return ret; +(gdb) bt +#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 +#1  0x00007fc37a9aa8d9 in __GI_abort () at abort.c:79 +#2  0x00007fc37aa054af in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7fc37ab14f4b "%s\n") at ../sysdeps/posix/libc_fatal.c:181 +#3  0x00007fc37aa0ca9c in malloc_printerr (str=str@entry=0x7fc37ab130e0 "free(): invalid pointer") at malloc.c:5339 +#4  0x00007fc37aa0e49c in _int_free (av=<optimized out>, p=<optimized out>, have_lock=0) at malloc.c:4173 +#5  0x000000000040120e in freeSomething(void*) () +#6  0x0000000000401401 in main () +``` + +与后续帧相比,`main()` 和 `freeSomething()` 的内存地址相当低。由于共享对象被映射到虚拟地址空间末尾的区域,可以认为 `SIGABRT` 是由共享库中的调用引起的。共享对象的内存地址在多次调用之间并不是恒定不变的,所以当你看到多次调用之间的地址不同时,完全可以认为是共享对象。 + +堆栈跟踪显示,后续的调用源于 `malloc.c`,这说明内存的(取消)分配可能出了问题。 + +在源代码中,(即使没有任何 C++ 知识)你也可以看到,它试图释放一个指针,而这个指针并没有被内存管理函数返回。这导致了未定义的行为,并导致了 `SIGABRT`。 + +``` +void freeSomething(void *ptr){ + free(ptr); +} +int nTmp = 5; +int *ptrNull = &nTmp; +freeSomething(ptrNull); +``` + +systemd 的这个 `coredump` 工具可以在 `/etc/systemd/coredump.conf` 中配置。可以在 `/etc/systemd/systemd-tmpfiles-clean.timer` 中配置轮换清理转储文件。 + +你可以在其[手册页][10]中找到更多关于 `coredumpctl` 的信息。 + +### 用调试符号编译 + +打开 `Makefile` 并注释掉第 9 行的最后一部分。现在应该是这样的: + +``` +CFLAGS =-Wall -Werror -std=c++11 -g +``` + +`-g` 开关使编译器能够创建调试信息。启动应用程序,这次使用 `-c2` 开关。 + +``` +./coredump -c2 +``` + +你会得到一个浮点异常。在 GDB 中打开该转储文件: + +``` +coredumpctl debug +``` + +这一次,你会直接被指向源代码中导致错误的那一行: + +``` +Reading symbols from /home/stephan/Dokumente/core_dump_example/coredump… +[New LWP 6218] +Core was generated by `./coredump -c2'. +Program terminated with signal SIGFPE, Arithmetic exception. +#0 0x0000000000401233 in zeroDivide () at main.cpp:29 +29 nRes = 5 / nDivider; +(gdb) +``` + +键入 `list` 以获得更好的源代码概览: + +``` +(gdb) list +24      int zeroDivide(){ +25          int nDivider = 5; +26          int nRes = 0; +27          while(nDivider > 0){ +28              nDivider--; +29              nRes = 5 / nDivider; +30          } +31          return nRes; +32      } +``` + +使用命令 `info locals` 从应用程序失败的时间点检索局部变量的值: + +``` +(gdb) info locals +nDivider = 0 +nRes = 5 +``` + +结合源码,可以看出,你遇到的是零除错误: + +``` +nRes = 5 / 0 +``` + +### 结论 + +了解如何处理转储文件将帮助你找到并修复应用程序中难以重现的随机错误。而如果不是你的应用程序,将核心转储转发给开发人员将帮助她或他找到并修复问题。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/linux-dump + +作者:[Stephan Avenwedde][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/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/find-file-linux-code_magnifying_glass_zero.png?itok=E2HoPDg0 (Magnifying glass on code) +[2]: https://en.wikipedia.org/wiki/POSIX +[3]: https://man7.org/linux/man-pages/man7/signal.7.html +[4]: https://www.gnu.org/software/libc/manual/html_node/Program-Error-Signals.html#Program-Error-Signals +[5]: https://en.wikipedia.org/wiki/PDP-11 +[6]: https://opensource.com/sites/default/files/uploads/dump_written.png (Dump written) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://www.gnu.org/software/gdb/ +[9]: http://www.opengroup.org/onlinepubs/009695399/functions/free.html +[10]: https://man7.org/linux/man-pages/man1/coredumpctl.1.html diff --git a/published/202008/20200805 How to Install Itch on Ubuntu and Other Linux Distributions.md b/published/202008/20200805 How to Install Itch on Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..73289b3d7d --- /dev/null +++ b/published/202008/20200805 How to Install Itch on Ubuntu and Other Linux Distributions.md @@ -0,0 +1,103 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12526-1.html) +[#]: subject: (How to Install Itch on Ubuntu and Other Linux Distributions) +[#]: via: (https://itsfoss.com/install-itch-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Ubuntu 和其它的 Linux 发行版上安装 Itch +====== + +![][7] + +[Itch][1] 是独立数字创造者的平台,主要专注于独立游戏。它最初是一个托管、销售和下载独立视频游戏的网站。但是现在,Itch 也提供书籍、漫画、工具、棋类游戏、原声带等来自独立创造者的数字内容。 + +作为一名用户,你或者能够免费下载这些数字内容,或者按照创造者设定的价格下载。你所有下载和购买的东西都同步到你的账户,以便你可以在任何你想的时间内下载它们。 + +它有点像 Steam,但是更专注于独立开发者和创作者。 + +你可以从它的网站浏览 Itch ,但是 Itch 也提供了一个 [开源的桌面客户端][2],有一些额外的优势。使用桌面客户端: + + * 你可以浏览游戏和其它的内容,并下载它们到你的系统上。 + * 桌面客户端会自动更新所有新功能。 + * 你下载的游戏也自动更新。 + * 如果你在 Itch 玩基于浏览器的游戏, 那么你可以使用 Itch 桌面客户端离线玩。 + +在这篇教程中,我将向你展示在 Ubuntu 或其它任何 Linux 发行版上安装 Itch 的步骤。 + +### 在 Linux 桌面上安装 Itch + +Itch 提供一个名称为 itch-setup 的安装器。你可以从它的下载网页下载这个文件。 + +- [下载 Linux 版 Itch][3] + +这个 itch-setup 文件可以工作在任何的 Linux 发行版上,只要它已经安装有 GTK 3 (libgtk-3-0)。大多数当前的 Linux 发行版应该已经有它了。 + +在你下载安装文件后,在其上面右击并给予它可执行权限。 + +![右击并给予文件可执行权限][4] + +现在在这个安装文件上通过双击来运行。它将下载 Itch 的最新版本。 + +![][5] + +实际花费的时间取决于你的网速。几分钟后,你应该会看到这个屏幕,要求你登录你的 Itch 账号。 + +![][6] + +在你登录后,你可以浏览游戏和其它的内容,并下载/购买它们。 + +整个安装过程类似于 [在 Ubuntu 上安装 Steam][8]。 + +你可以在 `~/.itch` 文件夹中找到 Itch 的文件。你从 Itch 下载的内容通常位于 `~/.config/itch` 。补充一句,`~` 意味着你的家目录。 + +### 从你的系统中移除 Itch 桌面应用程序 + +出于某些原因,如果你不想再使用 Itch ,你可以从你的系统中移除它。为此,麻烦的是,你需要使用终端。 + +打开一个终端,并使用下面的命令: + +``` +~/.itch/itch-setup --uninstall +``` + +它不会移除你的内容库。如果你想移除下载的游戏和材料,你可以手动删除 `~/.config/itch` 文件夹。 + +``` +rm -r ~/.config/itch +``` + +### 你用 Itch 吗? + +Itch 是一个独立创作者的道德平台,也是这种模式的支持者。Itch 使用 “你想付多少钱就付多少钱”,买家可以支付大于或相等内容创作者设置的任何金额。 + +Itch 也有开放收益分享模式。创作者可以与 Itch 分享部分他们产生的收入,也可以不分享。 + +就我个人而言,我更喜欢像 Itch 和 Humble Bundle 这些有道德的商店。像 Humble Bundle 一样,Itch 也时不时地进行销售和捆绑销售。这有助于你节省资金,并支持独立开发者和创作者。 + +你使用 Itch ,还是 Humble Bundle ?你还使用哪种类似的平台? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-itch-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itch.io/?ac=ywUpyBMGXvG +[2]: https://github.com/itchio/itch +[3]: https://itch.io/app +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/itch-installer-linux.png?ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/installing-itch-linux.jpg?ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/itch-running-linux.jpg?ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/itch-game-page.png?resize=800%2C441&ssl=1 +[8]: https://itsfoss.com/install-steam-ubuntu-linux/ +[9]: https://itsfoss.com/affiliate-policy/ diff --git a/published/202008/20200807 Microsoft uses AI to boost its reuse, recycling of server parts.md b/published/202008/20200807 Microsoft uses AI to boost its reuse, recycling of server parts.md new file mode 100644 index 0000000000..47a50cb5a0 --- /dev/null +++ b/published/202008/20200807 Microsoft uses AI to boost its reuse, recycling of server parts.md @@ -0,0 +1,56 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12552-1.html) +[#]: subject: (Microsoft uses AI to boost its reuse, recycling of server parts) +[#]: via: (https://www.networkworld.com/article/3570451/microsoft-uses-ai-to-boost-its-reuse-recycling-of-server-parts.html) +[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) + +微软利用 AI 提升服务器部件的重复使用和回收率 +====== + +> 准备好在提到数据中心设备时,听到更多的“循环”一词。 + +![](https://img.linux.net.cn/data/attachment/album/202008/25/234108f8yz3c3la8xw18mn.jpg) + +微软正在将人工智能引入到对数百万台服务器进行分类的任务中,以确定哪些部件可以回收,在哪里回收。 + +新计划要求在微软全球各地的数据中心建立所谓的“循环中心Circular Center”,在那里,人工智能算法将用于从退役的服务器或其他硬件中分拣零件,并找出哪些零件可以在园区内重新使用。 + +微软表示,它的数据中心有超过 300 万台服务器和相关硬件,一台服务器的平均寿命约为 5 年。另外,微软正在全球范围内扩张,所以其服务器数量应该会增加。 + +循环中心就是要快速整理库存,而不是让过度劳累的员工疲于奔命。微软计划到 2025 年将服务器部件的重复使用率提高 90%。微软总裁 Brad Smith 在宣布这一举措的一篇[博客][2]中写道:“利用机器学习,我们将对退役的服务器和硬件进行现场处理。我们会将那些可以被我们以及客户重复使用和再利用的部件进行分类,或者出售。” + +Smith 指出,如今,关于废物的数量、质量和类型,以及废物的产生地和去向,都没有一致的数据。例如,关于建造和拆除废物的数据并不一致,我们要一个标准化的方法,有更好的透明度和更高的质量。 + +他写道:“如果没有更准确的数据,几乎不可能了解运营决策的影响,设定什么目标,如何评估进展,以及废物去向方法的行业标准。” + +根据微软的说法,阿姆斯特丹数据中心的一个循环中心试点减少了停机时间,并增加了服务器和网络部件的可用性,供其自身再利用和供应商回购。它还降低了将服务器和硬件运输到处理设施的成本,从而降低了碳排放。 + +“循环经济circular economy”一词正在科技界流行。它是基于服务器硬件的循环利用,将那些已经使用了几年但仍可用的设备重新投入到其他地方服务。ITRenew 是[我在几个月前介绍过][3]的一家二手超大规模服务器的转售商,它对这个词很感兴趣。 + +该公司表示,首批微软循环中心将建在新的主要数据中心园区或地区。它计划最终将这些中心添加到已经存在的园区中。 + +微软曾明确表示要在 2030 年之前实现“碳负排放”,而这只是其中几个项目之一。近日,微软宣布在其位于盐湖城的系统开发者实验室进行了一项测试,用一套 250kW 的氢燃料电池系统为一排服务器机架连续供电 48 小时,微软表示这是以前从未做过的事情。 + +微软首席基础设施工程师 Mark Monroe 在一篇[博客][4]中写道:“这是我们所知道的最大的以氢气运行的计算机备用电源系统,而且它的连续测试时间最长。”他说,近年来氢燃料电池的价格大幅下降,现在已经成为柴油发电机的可行替代品,但燃烧更清洁。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3570451/microsoft-uses-ai-to-boost-its-reuse-recycling-of-server-parts.html + +作者:[Andy Patrizio][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Andy-Patrizio/ +[b]: https://github.com/lujun9972 +[2]: https://blogs.microsoft.com/blog/2020/08/04/microsoft-direct-operations-products-and-packaging-to-be-zero-waste-by-2030/ +[3]: https://www.networkworld.com/article/3543810/for-sale-used-low-mileage-hyperscaler-servers.html +[4]: https://news.microsoft.com/innovation-stories/hydrogen-datacenters/ +[5]: https://www.facebook.com/NetworkWorld/ +[6]: https://www.linkedin.com/company/network-world diff --git a/published/202008/20200807 install Fedora on a Raspberry Pi 3.md b/published/202008/20200807 install Fedora on a Raspberry Pi 3.md new file mode 100644 index 0000000000..a6d54a8de3 --- /dev/null +++ b/published/202008/20200807 install Fedora on a Raspberry Pi 3.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12520-1.html) +[#]: subject: (install Fedora on a Raspberry Pi 3) +[#]: via: (https://fedoramagazine.org/install-fedora-on-a-raspberry-pi/) +[#]: author: (Nick Hardiman https://fedoramagazine.org/author/nickhardiman/) + +在树莓派 3 上安装 Fedora +====== + +![][1] + +> 在树莓派上运行 Fedora。 + +[树莓派基金会][2]这几年来生产了很多型号。本文的安装过程已经在第三代树莓派上进行了测试:[3B v1.2][3] 和 [B+][4](较旧的 [树莓派 2][5] 和新的 [树莓派 4][6] 都还没有测试)。这些是已经发布了几年的信用卡大小的树莓派。 + +### 获取硬件 + +你需要一些硬件组件,包括树莓派。你不需要任何 [HaT(安装在顶部的硬件)][7] 板或 USB 天线。如果你使用过树莓派,那么可能会有这些。 + + * **当前网络**。也许是你的家庭实验室。 + * **网线**。连接当前网络到树莓派 + * **树莓派 3**,型号 B 或 B+。 + * **电源**。 + * **8 GB 或更大容量的 micro-SD 卡**。 + * **键盘**和**显示器**。 + +键盘和显示器共同组成本地控制台。即使没有控制台,也能进行操作(尽管很复杂),例如设置自动安装然后通过网络连接。在 Fedora 首次启动时,本地控制台可轻松回应配置问题。同样,在 AP 配置期间出错可能会破坏网络配置,从而阻止远程用户连入。 + +### 下载 Fedora Minimal + + * 查找 Fedora 的[其他可选架构镜像][8]。 + * 下载 [ARM® aarch64 架构镜像][9]。 + +Fedora Minimal 镜像是 [Fedora 的其他可选下载之一][10],它有所有必需的核心软件包和网络软件包(嗯,是几乎,注意下面的 dnsmasq)。该镜像包含一个现成的文件系统,它已经安装了 400 多个软件包。此最小镜像不包括流行的软件包,像开发环境、互联网服务或桌面。这些类型的软件不是这里所必需的,如果安装它们,可能会占用过多的内存。 + +Fedora Minimal 原始镜像可安装在小型 SD 卡上,并在少于 1GB 的内存中运行(这些旧的树莓派有 1GB 的内存)。 + +下载文件的名称类似于 `Fedora-Minimal-32-1.6.aarch64.raw.xz`。该文件已压缩,大小约为 700MB。文件解压缩后为 5GB。这是一个 ext4 文件系统,它大部分是空的:已使用约 1GB,空余 4GB。这些空的空间是压缩文件比未压缩的原始文件小得多的原因。 + +### 复制到 micro-SD 卡 + + * 将镜像复制到 micro-SD 卡。 + +这可能比听起来更复杂,而且会带来痛苦的体验。找到一个[良好的 micro-SD 卡][11]需要花费精力。然后是将卡插到计算机的挑战。也许你的笔记本电脑有全尺寸的 SD 卡插槽,你还需要卡适配器,或者你需要一个 USB 适配器。然后,在进行复制时,操作系统可能会帮助你,也可能会妨碍你。你可能很幸运有 [Fedora Media Writer][12],或使用这些 Linux 命令: + +``` +unxz ./Fedora-Minimal-32-1.6.aarch64.raw.xz +dd if=./Fedora-Minimal-32-1.6.aarch64.raw of=/dev/mmcblk0 bs=8M status=progress oflag=direct +``` + +### 安装 Fedora + + * 连接树莓派、电源线、网线和 micro-SD 卡。 + * 打开电源。 + * 当图形芯片通电时,看见彩色框。 + * 等待 [anaconda 安装程序][13]启动。 + * 回答 anaconda 的设置问题。 + +操作系统的初始配置需要几分钟的时间。等待启动需要花费几分钟,还需要花费一些时间填写 anaconda 的文本安装程序的问题。在下面的例子中,用户名为 `nick`,并且还是管理员(`wheel` 组的成员)。 + +恭喜你!你的树莓派已启动并可运行。 + +### 更新软件 + + * 用 `dnf update` 更新软件包。 + * 通过 `systemctl reboot` 重启。 + +多年来,很多人为使树莓派正常工作付出了很多工作。使用最新的软件,以确保你从他们的辛勤工作中受益。如果你跳过此步骤,你可能会发现有些东西无法正常工作。 + +此次更新下载并安装了约一百个软件包。由于存储设备是 micro-SD 卡,因此写入新软件的过程很慢。这就是 90 年代使用存储器的感觉。 + +### 可以摆弄的东西 + +如果你想摆弄的话,此时可以设置其他一些内容。这都是可选的。试试这些。 + + * `sudo hostnamectl set-hostname raspi` 替换 `localhost` 主机名。 + * 用 `ip addr` 查找 IP 地址。 + * 尝试 SSH 登录,甚至使用 `ssh-copy-id` 设置基于密钥的登录。 + * 使用 `systemctl poweroff` 关机。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/install-fedora-on-a-raspberry-pi/ + +作者:[Nick Hardiman][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/nickhardiman/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/07/fedora-on-rpi-816x346.png +[2]: https://www.raspberrypi.org/about/ +[3]: https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ +[4]: https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/ +[5]: https://www.raspberrypi.org/products/raspberry-pi-2-model-b/ +[6]: https://www.raspberrypi.org/products/raspberry-pi-4-model-b/ +[7]: https://www.raspberrypi.org/blog/introducing-raspberry-pi-hats/ +[8]: https://alt.fedoraproject.org/alt/ +[9]: https://download.fedoraproject.org/pub/fedora-secondary/releases/32/Spins/aarch64/images/Fedora-Minimal-32-1.6.aarch64.raw.xz +[10]: https://alt.fedoraproject.org/ +[11]: https://www.jeffgeerling.com/blog/2019/raspberry-pi-microsd-card-performance-comparison-2019 +[12]: https://fedoramagazine.org/make-fedora-usb-stick/ +[13]: https://fedoraproject.org/wiki/Anaconda diff --git a/published/202008/20200808 An attempt to make a font look more handwritten.md b/published/202008/20200808 An attempt to make a font look more handwritten.md new file mode 100644 index 0000000000..806f9caf59 --- /dev/null +++ b/published/202008/20200808 An attempt to make a font look more handwritten.md @@ -0,0 +1,121 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12545-1.html) +[#]: subject: (An attempt to make a font look more handwritten) +[#]: via: (https://jvns.ca/blog/2020/08/08/handwritten-font/) +[#]: author: (Julia Evans https://jvns.ca/) + +一次让字体看起来更像手写体的尝试 +====== + +![](https://img.linux.net.cn/data/attachment/album/202008/24/111019lzpc280kkvlfpv1p.jpg) + +其实我对这个实验的结果并不是特别满意,但我还是想分享一下,因为摆弄字体是件非常简单和有趣的事情。而且有人问我怎么做,我告诉她我会写一篇博文来介绍一下 :) + +### 背景:原本的手写体 + +先交代一些背景信息:我有一个我自己的手写字体,我已经在我的电子杂志中使用了好几年了。我用一个叫 [iFontMaker][1] 的令人愉快的应用程序制作了它。他们在网站上自诩为“你可以在 5 分钟内只用手指就能制作出你的手工字体”。根据我的经验,“5 分钟”的部分比较准确 —— 我可能花了更多的时间,比如 15 分钟。我对“只用手指”的说法持怀疑态度 —— 我用的是 Apple Pencil,它的精确度要好得多。但是,使用该应用程序制作你的笔迹的 TTF 字体是非常容易的,如果你碰巧已经有了 Apple Pencil 和 iPad,我认为这是一个有趣的方式,我只花了 7.99 美元。 + +下面是我的字体的样子。左边的“CONNECT”文字是我的实际笔迹,右边的段落是字体。其实有 2 种字体 —— 有一种是普通字体,一种是手写的“等宽”字体。(其实实际并不是等宽,我还没有想好如何在 iFontMaker 中制作一个实际的等宽字体) + +![][2] + +### 目标:在字体上做更多的字符变化 + +在上面的截图中,很明显可以看出这是一种字体,而不是实际的笔迹。当你有两个相同的字母相邻时,就最容易看出来,比如“HTTP”。 + +所以我想,使用一些 OpenType 的功能,以某种方式为这个字体引入更多的变化,比如也许两个 “T” 可以是不同的。不过我不知道该怎么做! + +### 来自 Tristan Hume 的主意:使用 OpenType! + +然后我在 5 月份的 !!Con 2020 上(所有的[演讲录音都在这里!][3])看到了 Tristan Hume 的这个演讲:关于使用 OpenType 通过特殊的字体将逗号插入到大的数字中。他的演讲和博文都很棒,所以这里有一堆链接 —— 下面现场演示也许是最快看到他的成果的方式。 + + * 一个现场演示: [Numderline 测试][4] + * 博客文章:[将逗号插入到大的数字的各个位置:OpenType 冒险][5] + * 谈话:[!!Con 2020 - 使用字体塑型,把逗号插入到大的数字的各个位置!][6] + * GitHub 存储库: https://github.com/trishume/numderline/blob/master/patcher.py + +### 基本思路:OpenType 允许你根据上下文替换字符 + +我一开始对 OpenType 到底是什么非常困惑。目前我仍然不甚了然,但我知道到你可以编写极其简单的 OpenType 规则来改变字体的外观,而且你甚至不需要真正了解字体。 + +下面是一个规则示例: + +``` +sub a' b by other_a; +``` + +这里 `sub a' b by other_a;` 的意思是:如果一个 `a` 字形是在一个 `b` 之前,那么替换 `a` 为字形 `other_a`。 + +所以这意味着我可以让 `ab` 和 `ac` 在字体中出现不同的字形。这并不像手写体那样随机,但它确实引入了一点变化。 + +### OpenType 参考文档:真棒 + +我找到的最好的 OpenType 文档是这个 [OpenType™ 特性文件规范][7] 资料。里面有很多你可以做的很酷的事情的例子,比如用一个连字替换 “ffi”。 + +### 如何应用这些规则:fonttools + +为字体添加新的 OpenType 规则是超容易的。有一个 Python 库叫 `fonttools`,这 5 行代码会把放在 `rules.fea` 中的 OpenType 规则列表应用到字体文件 `input.ttf` 中。 + +``` +from fontTools.ttLib import TTFont +from fontTools.feaLib.builder import addOpenTypeFeatures + +ft_font = TTFont('input.ttf') +addOpenTypeFeatures(ft_font, 'rules.fea', tables=['GSUB']) +ft_font.save('output.ttf') +``` + +`fontTools` 还提供了几个名为 `ttx` 和 `fonttools` 的命令行工具。`ttx` 可以将 TTF 字体转换为 XML 文件,这对我很有用,因为我想重新命名我的字体中的一些字形,但我对字体一无所知。所以我只是将我的字体转换为 XML 文件,使用 `sed` 重命名字形,然后再次使用 `ttx` 将 XML 文件转换回 `ttf`。 + +`fonttools merge` 可以让我把我的 3 个手写字体合并成 1 个,这样我就在 1 个文件中得到了我需要的所有字形。 + +### 代码 + +我把我的极潦草的代码放在一个叫 [font-mixer][8] 的存储库里。它大概有 33 行代码,我认为它不言自明。(都在 `run.sh` 和 `combine.py` 中) + +### 结果 + +下面是旧字体和新字体的小样。我不认为新字体的“感觉”更像手写体 —— 有更多的变化,但还是比不上实际的手写体文字(在下面)。 + +我觉得稍微有点不可思议,它明明还是一种字体,但它却要假装成不是字体: + +![][9] + +而这是实际手写的同样的文字的样本: + +![][10] + +如果我在制作另外 2 种手写字体的时候,把原来的字体混合在一起,再仔细一点,可能效果会更好。 + +### 添加 OpenType 规则这么容易,真酷! + +这里最让我欣喜的是,添加 OpenType 规则来改变字体的工作方式是如此的容易,比如你可以很容易地做出一个“the”单词总是被“teh”代替的字体(让错别字一直留着!)。 + +不过我还是不知道如何做出更逼真的手写字体:)。我现在还在用旧的那个字体(没有额外的变化),我对它很满意。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/08/08/handwritten-font/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://2ttf.com/ +[2]: https://jvns.ca/images/font-sample-connect.png +[3]: http://bangbangcon.com/recordings.html +[4]: https://thume.ca/numderline/ +[5]: https://blog.janestreet.com/commas-in-big-numbers-everywhere/ +[6]: https://www.youtube.com/watch?v=Biqm9ndNyC8 +[7]: https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html +[8]: https://github.com/jvns/font-mixer/ +[9]: https://jvns.ca/images/font-mixer-comparison.png +[10]: https://jvns.ca/images/handwriting-sample.jpeg diff --git a/published/202008/20200809 Open Source Drawing App Pinta Sees New Release After 5 Years. Here-s How to Get it.md b/published/202008/20200809 Open Source Drawing App Pinta Sees New Release After 5 Years. Here-s How to Get it.md new file mode 100644 index 0000000000..f9c356010c --- /dev/null +++ b/published/202008/20200809 Open Source Drawing App Pinta Sees New Release After 5 Years. Here-s How to Get it.md @@ -0,0 +1,108 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12501-1.html) +[#]: subject: (Open Source Drawing App Pinta Sees New Release After 5 Years. Here’s How to Get it!) +[#]: via: (https://itsfoss.com/pinta-new-release/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +开源绘画应用 Pinta 在 5 年后迎来新版本 +====== + +> 开源绘画应用 Pinta 时隔 5 年多迎来新版本。新版本修复了众多 BUG,并增加了新功能。 + +[Pinta][1] 是一款[开源绘画应用,适用于 Linux][2]、Windows 和 macOS。你可以用它来进行自由手绘/素描。你也可以用它在现有的图片上添加箭头、方框、文字等。 + +![][3] + +日前,Pinta 1.7 版本在时隔近 5 年后发布。让我们来看看新版本中都有哪些功能。 + +### Pinta 1.7 的新功能 + +以下是最新版本的 Pinta 带来的新功能: + + * 可以在图片之间切换的标签视图 + * 增加了一个平滑擦除工具 + * 拖放 URL 以在 Pinta 中下载并打开图像进行编辑 + * 铅笔工具可以在不同的混合模式之间切换 + * 按住 Ctrl 键可以缩放“选定移动”工具 + * 矩形选择工具现在在选区的每个角落显示不同的箭头光标 + * 提高了与选区互动时的性能,特别是对大图像而言 + +还有许多 bug 修复,这应该会改善整个 Pinta 的体验。你可以在[官方发布说明][4]中了解更多变化。 + +### 在 Ubuntu 和其他 Linux 发行版上安装 Pinta 1.7 + +对于 Ubuntu 和基于 Ubuntu 的 Linux 发行版,有一个[官方 PPA 可用][5]。如果你使用的是 Ubuntu 18.04 或 20.04,可以使用这个 PPA。 + +打开一个终端,使用下面的命令来添加新的仓库。你会被要求输入你的密码。你可能已经知道,当你在终端中输入密码时,不会有任何显示。只要输入密码,然后按回车键就可以了。 + +``` +sudo add-apt-repository ppa:pinta-maintainers/pinta-stable +``` + +在 Ubuntu 18.04 和更高版本上已不再需要,但其他一些发行版可能需要更新缓存: + +``` +sudo apt update +``` + +现在用这个命令安装最新版本的 Pinta: + +``` +sudo apt install pinta +``` + +好的是,如果你之前安装了 Pinta 1.6,它就会更新到新版本。 + +#### 移除 Pinta + +要删除通过 PPA 安装的 Pinta,请使用此命令: + +``` +sudo apt remove pinta +``` + +你还应该[删除此 PPA][6]: + +``` +sudo add-apt-repository -r ppa:pinta-maintainers/pinta-stable +``` + +#### 在其他发行版上安装 Pinta + +在我上次检查时,Pinta 1.7 还没有在 Fedora 或 AUR 上出现。你可以等待一段时间,或者下载源码自己试试。 + +- [下载 Pinta 1.7][7] + +Pinta 团队也更新了用户指南,提供了详细的文档。如果你是新手或者想深入使用 Pinta,可以参考[本用户指南][8]进行参考。 + +### 结束语 + +我很高兴能看到 Pinta 的新版本。它是我编辑图像的常用工具,可以为教程添加箭头、方框和文字。最近我使用 [Shutter][9] 来达到这个目的,但有了这个新版本,我也许会再次改用 Pinta。 + +你呢?你使用 Pinta 吗,或者你过去用过它吗?你期待使用新版本吗? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/pinta-new-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://www.pinta-project.com/ +[2]: https://itsfoss.com/open-source-paint-apps/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/pinta-1-7.png?resize=800%2C517&ssl=1 +[4]: https://www.pinta-project.com/releases/1-7 +[5]: https://launchpad.net/~pinta-maintainers/+archive/ubuntu/pinta-stable +[6]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ +[7]: https://www.pinta-project.com/releases/ +[8]: https://www.pinta-project.com/user-guide/ +[9]: https://itsfoss.com/install-shutter-ubuntu/ diff --git a/published/202008/20200810 Merging and sorting files on Linux.md b/published/202008/20200810 Merging and sorting files on Linux.md new file mode 100644 index 0000000000..4bee2f31c7 --- /dev/null +++ b/published/202008/20200810 Merging and sorting files on Linux.md @@ -0,0 +1,155 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12539-1.html) +[#]: subject: (Merging and sorting files on Linux) +[#]: via: (https://www.networkworld.com/article/3570508/merging-and-sorting-files-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +合并和排序 Linux 上的文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202008/22/102250i3943is48r34w4nz.jpg) + +在 Linux 上合并和排序文本的方法有很多种,但如何去处理它取决于你试图做什么:你是只想将多个文件的内容放入一个文件中,还是以某种方式组织它,让它更易于使用。在本文中,我们将查看一些用于排序和合并文件内容的命令,并重点介绍结果有何不同。 + +### 使用 cat + +如果你只想将一组文件放到单个文件中,那么 `cat` 命令是一个容易的选择。你所要做的就是输入 `cat`,然后按你希望它们在合并文件中的顺序在命令行中列出这些文件。将命令的输出重定向到要创建的文件。如果指定名称的文件已经存在,那么文件将被覆盖。例如: + +``` +$ cat firstfile secondfile thirdfile > newfile +``` + +如果要将一系列文件的内容添加到现有文件中,而不是覆盖它,只需将 `>` 变成 `>>`。 + +``` +$ cat firstfile secondfile thirdfile >> updated_file +``` + +如果你要合并的文件遵循一些方便的命名约定,那么任务可能更简单。如果可以使用正则表达式指定所有文件名,那就不必列出所有文件。例如,如果文件全部以 `file` 结束,如上所示,你可以进行如下操作: + +``` +$ cat *file > allfiles +``` + +请注意,上面的命令将按字母数字顺序添加文件内容。在 Linux 上,一个名为 `filea` 的文件将排在名为 `fileA` 的文件的前面,但会在 `file7` 的后面。毕竟,当我们处理字母数字序列时,我们不仅需要考虑 `ABCDE`,还需要考虑 `0123456789aAbBcCdDeE`。你可以使用 `ls *file` 这样的命令来查看合并文件之前文件的顺序。 + +注意:首先确保你的命令包含合并文件中所需的所有文件,而不是其他文件,尤其是你使用 `*` 等通配符时。不要忘记,用于合并的文件仍将单独存在,在确认合并后,你可能想要删除这些文件。 + +### 按时间期限合并文件 + +如果要基于每个文件的时间期限而不是文件名来合并文件,请使用以下命令: + +``` +$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done +``` + +使用 `-tr` 选项(`t` = 时间,`r` = 反向)将产生按照最早的在最前排列的文件列表。例如,如果你要保留某些活动的日志,并且希望按活动执行的顺序添加内容,则这非常有用。 + +上面命令中的 `$$` 表示运行命令时的进程 ID。不是很必要使用此功能,但它几乎不可能会无意添加到现有的文件,而不是创建新文件。如果使用 `$$`,那么生成的文件可能如下所示: + +``` +$ ls -l BigFile.* +-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914 +``` + +### 合并和排序文件 + +Linux 提供了一些有趣的方式来对合并之前或之后的文件内容进行排序。 + +#### 按字母对内容进行排序 + +如果要对合并的文件内容进行排序,那么可以使用以下命令对整体内容进行排序: + +``` +$ cat myfile.1 myfile.2 myfile.3 | sort > newfile +``` + +如果要按文件对内容进行分组,请使用以下命令对每个文件进行排序,然后再将它添加到新文件中: + +``` +$ for file in `ls myfile.?`; do sort $file >> newfile; done +``` + +#### 对文件进行数字排序 + +要对文件内容进行数字排序,请在 `sort` 中使用 `-n` 选项。仅当文件中的行以数字开头时,此选项才有用。请记住,按照默认顺序,`02` 将小于 `1`。当你要确保行以数字排序时,请使用 `-n` 选项。 + +``` +$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz +``` + +如果文件中的行以 `2020-11-03` 或 `2020/11/03`(年月日格式)这样的日期格式开头,`-n` 选项还能让你按日期对内容进行排序。其他格式的日期排序将非常棘手,并且将需要更复杂的命令。 + +### 使用 paste + +`paste` 命令允许你逐行连接文件内容。使用此命令时,合并文件的第一行将包含要合并的每个文件的第一行。以下是示例,其中我使用了大写字母以便于查看行的来源: + +``` +$ cat file.a +A one +A two +A three + +$ paste file.a file.b file.c +A one B one C one +A two B two C two +A three B three C thee + B four C four + C five +``` + +将输出重定向到另一个文件来保存它: + +``` +$ paste file.a file.b file.c > merged_content +``` + +或者,你可以将每个文件的内容在同一行中合并,然后将文件粘贴在一起。这需要使用 `-s`(序列)选项。注意这次的输出如何显示每个文件的内容: + +``` +$ paste -s file.a file.b file.c +A one A two A three +B one B two B three B four +C one C two C thee C four C five +``` + +### 使用 join + +合并文件的另一个命令是 `join`。`join` 命令让你能基于一个共同字段合并多个文件的内容。例如,你可能有一个包含一组同事的电话的文件,其中,而另一个包含了同事的电子邮件地址,并且两者均按个人姓名列出。你可以使用 `join` 创建一个包含电话和电子邮件地址的文件。 + +一个重要的限制是文件的行必须是相同的顺序,并在每个文件中包括用于连接的字段。 + +这是一个示例命令: + +``` +$ join phone_numbers email_addresses +Sandra 555-456-1234 bugfarm@gmail.com +Pedro 555-540-5405 +John 555-333-1234 john_doe@gmail.com +Nemo 555-123-4567 cutie@fish.com +``` + +在本例中,即使缺少附加信息,第一个字段(名字)也必须存在于每个文件中,否则命令会因错误而失败。对内容进行排序有帮助,而且可能更容易管理,但只要顺序一致,就不需要这么做。 + +### 总结 + +在 Linux 上,你有很多可以合并和排序存储在单独文件中的数据的方式。这些方法可以使原本繁琐的任务变得异常简单。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3570508/merging-and-sorting-files-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/published/202008/20200811 Don-t ignore .gitignore.md b/published/202008/20200811 Don-t ignore .gitignore.md new file mode 100644 index 0000000000..7e1b1bc47a --- /dev/null +++ b/published/202008/20200811 Don-t ignore .gitignore.md @@ -0,0 +1,94 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12524-1.html) +[#]: subject: (Don't ignore .gitignore) +[#]: via: (https://opensource.com/article/20/8/dont-ignore-gitignore) +[#]: author: (Rajeev Bera https://opensource.com/users/acompiler) + +不要忽视 .gitignore +====== + +> 使用 .gitignore 文件是提高代码和 Git 仓库质量的最佳实践之一。 + +![](https://img.linux.net.cn/data/attachment/album/202008/16/211643mahzp0zthbh0z55w.jpg) + +我注意到很多开发者没有使用 `.gitignore` 文件,尽管使用 `.gitignore` 文件来指定你不希望 Git 在版本控制中跟踪的文件是[最佳实践][2]之一。`.gitignore` 可以提高代码质量,所以你不应该忽略版本库中的 [.gitignore][3]。 + +### 什么是 .gitignore? + +Git 仓库中的文件可以是: + + 1. **未跟踪的**:未被暂存或提交的变更。 + 2. **跟踪的**:已暂存或提交的变更。 + 3. **忽略的**:你让 Git 忽略的文件。 + +有些文件你希望 Git 忽略,不要在你的版本库中跟踪它,这些文件包括许多自动生成的或特定于平台的文件,以及其他本地配置文件,如: + + 1. 含有敏感信息的文件 + 2. 编译出的代码,如 `.dll` 或 `.class`。 + 3. 系统文件,如 `.DS_Store` 或 `Thumbs.db`。 + 4. 含有临时信息的文件,如日志、缓存等。 + 5. 生成的文件,如 `dist` 文件夹。 + +如果你不想让 Git 跟踪版本库中的某些文件,不过这不能通过 [Git 命令][4]做到。(虽然你可以用 `git rm` 命令停止跟踪一个文件,比如 `git rm --cached`。)相反,你需要使用 `.gitignore` 文件,这是一个告诉 Git 不要跟踪哪些文件的文本文件。 + +创建 `.gitignore` 文件很简单,只需创建一个文本文件并命名为 `.gitignore`。记得在文件名的开头有一个点(`.`)。就这样就完成了。 + +### 编写 .gitignore 文件的规则 + +根据[文档][3],“`.gitignore` 文件中的每一行都指定了一个模式。” + +在此上下文中,“模式”可以指一个特定的文件名,或者指文件名的某些部分结合上通配符。换句话说,`example.txt` 是匹配名为 `example.txt` 的文件的有效模式,而 `ex*txt` 是匹配名为 `example.txt` 以及 `export.txt` 的文件的有效模式。 + +以下是一些帮助你正确设置 `.gitignore` 文件的基本规则: + + 1. 任何以哈希(`#`)开头的行都是注释。 + 2. `\` 字符可以转义特殊字符。 + 3. `/` 字符表示该规则只适用于位于同一文件夹中的文件和文件夹。 + 4. 星号(`*`)表示任意数量的字符(零个或更多)。 + 5. 两个星号(`**`)表示任意数量的子目录。 + 6. 一个问号(`?`)代替零个或一个字符。 + 7. 一个感叹号(`!`)会反转特定的规则(即包括了任何被前一个模式排除的文件)。 + 8. 空行会被忽略,所以你可以用它们来增加空间,使你的文件更容易阅读。 + 9. 在末尾添加 `/` 会忽略整个目录路径。 + +### 本地与全局 .gitignore 文件的比较 + +有两种类型的 `.gitignore` 文件: + + * **本地**:放在 Git 仓库的根目录下,只在该仓库中工作,并且必须提交到该仓库中。 + * **全局**:放在你的主目录根目录下,影响你在你的机器上使用的每个仓库,不需要提交。 + +很多开发者在项目仓库中使用本地的 `.gitignore` 文件,但很少有人使用全局的 `.gitignore` 文件。使用全局文件最显著的优势是,你不需要提交就可以使用它,而且做一个改动会影响你所有的版本库。 + +### Git 忽略的优势 + +除了确保特定的文件不被 Git 追踪之外,使用 `.gitignore` 文件还有其他好处。 + + 1. 通过忽略不需要的文件,它可以帮助你保持代码库的干净。 + 2. 它可以控制代码库的大小,这在你正在做一个大项目的时候特别有用。 + 3. 你的每一次提交、推送和拉取请求都将是干净的。 + +### 结束语 + +Git 很强大,但归根结底,它只是一个计算机程序而已。使用最佳实践并保持你的代码仓库稳定是一个团队的努力,其中要做到一件事就是使用 `.gitignore` 文件。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/dont-ignore-gitignore + +作者:[Rajeev Bera][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/acompiler +[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://opensource.com/article/20/7/git-repos-best-practices +[3]: https://git-scm.com/docs/gitignore +[4]: https://acompiler.com/git-commands/ diff --git a/published/202008/20200811 Photoflare- An Open Source Image Editor for Simple Editing Needs.md b/published/202008/20200811 Photoflare- An Open Source Image Editor for Simple Editing Needs.md new file mode 100644 index 0000000000..8d1712c3ce --- /dev/null +++ b/published/202008/20200811 Photoflare- An Open Source Image Editor for Simple Editing Needs.md @@ -0,0 +1,118 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12538-1.html) +[#]: subject: (Photoflare: An Open Source Image Editor for Simple Editing Needs) +[#]: via: (https://itsfoss.com/photoflare/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Photoflare:满足简单编辑需求的开源图像编辑器 +====== + +> Photoflare 是一款可用于 Linux 和 Windows 上的图像编辑器。它有一个免费而开源的社区版本。 + +在 Linux 上编辑图像时,GIMP 显然是首选。但是,如果你不需要高级编辑功能,GIMP 可能会让人不知所措。这是像 Photoflare 这样的应用立足的地方。 + +### PhotoFlare:一个简单的图像编辑器 + +![][1] + +Photoflare 是一个在简单易用的界面里提供了基本的图像编辑功能的编辑器。 + +它受流行的 Windows 应用 [PhotoFiltre][2] 的启发。这个程序不是一个克隆品,它是用 C++ 从头开始编写的,并使用 Qt 框架作为界面。 + +它的功能包括裁剪、翻转/旋转、调整图像大小。你还可以使用诸如油漆刷、油漆桶、喷雾罐、模糊工具和橡皮擦之类的工具。魔术棒工具可让你选择图像的特定区域。 + +你还可以在图像上添加线条和文本。你还可以更改图像的色调。 + +你也可以像其他[画图应用][3]一样从头开始创建图像。 + +批处理编辑选项可让你同时为多张图片调整大小、转换文件格式和添加滤镜。 + +![Batch Editing Feature in Photoflare | Photo Credit: Photoflare website][4] + +### Photoflare 的功能 + +为了方便参考,我将列出 Photoflare 的主要功能: + +* 创建/绘制图像 +* 裁剪图像 +* 旋转图像 +* 调整图像大小 +* 使用画笔、油漆桶、喷涂、模糊工具和图像等工具编辑图像 +* 在图像上添加线条和文字 +* 更改图像的色调 +* 添加老照片滤镜 +* 批量调整大小、滤镜等 + +### 在 Linux 上安装 Photflare + +![][5] + +在 Photoflare 的网站上,你可以找到定价以及每月订阅的选项。但是,该应用是开源的,它的[源码可在 GitHub 上找到][6]。 + +应用也是“免费”使用的。[定价/订购部分][7]用于该项目的财务支持。你可以免费下载它,如果你喜欢该应用并且会继续使用,请考虑给它捐赠。 + +Photoflare 有[官方 PPA][8],适用于 Ubuntu 和基于 Ubuntu 的发行版。此 PPA 可用于 Ubuntu 18.04 和 20.04 版本。 + +打开终端,逐一输入下面的命令安装 Photoflare: + +``` +sudo add-apt-repository ppa:photoflare/photoflare-stable +sudo apt update +sudo apt install photoflare +``` + +要从基于 Ubuntu 的发行版中删除 Photoflare,请使用以下命令: + +``` +sudo apt remove photoflare +``` + +最好也删除 PPA: + +``` +sudo add-apt-repository -r ppa:photoflare/photoflare-stable +``` + +Arch Linux 和 Manjaro 用户可以[从 AUR 获取][9]。 + +Fedora 没有现成的软件包,因此你需要获取源码: + +- [Photoflare 源代码][6] + +### Photoflare 的经验 + +我发现它与 [Pinta][10] 有点相似,但功能更多。它是用于基本图像编辑的简单工具。批处理功能是加分项。 + +我注意到图像在打开编辑时看起来不够清晰。我打开一张截图进行编辑,字体看起来很模糊。但是,保存图像并在[图像查看器][11]中打开后,没有显示此问题。 + +总之,如果你不需要专业级的图像编辑,它是一个不错的工具。 + +如果你曾经使用过或会去尝试它,请分享你的 Photoflare 使用经验。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/photoflare/ + +作者:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/Photoflare.jpg?ssl=1 +[2]: http://photofiltre.free.fr/frames_en.htm +[3]: https://itsfoss.com/open-source-paint-apps/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/batch_editing_photoflare.png?ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/photoflare-editor-linux.png?resize=800%2C580&ssl=1 +[6]: https://github.com/PhotoFlare/photoflare +[7]: https://photoflare.io/pricing/ +[8]: https://launchpad.net/~photoflare/+archive/ubuntu/photoflare-stable +[9]: https://aur.archlinux.org/packages/photoflare-git/ +[10]: https://itsfoss.com/pinta-new-release/ +[11]: https://itsfoss.com/image-viewers-linux/ \ No newline at end of file diff --git a/published/202008/20200813 AI system analyzes code similarities, makes progress toward automated coding.md b/published/202008/20200813 AI system analyzes code similarities, makes progress toward automated coding.md new file mode 100644 index 0000000000..ddfb8102e8 --- /dev/null +++ b/published/202008/20200813 AI system analyzes code similarities, makes progress toward automated coding.md @@ -0,0 +1,56 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12569-1.html) +[#]: subject: (AI system analyzes code similarities, makes progress toward automated coding) +[#]: via: (https://www.networkworld.com/article/3570389/ai-system-analyzes-code-similarities-makes-progress-toward-automated-coding.html) +[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) + +AI 系统向自动化编码迈进 +====== + +> 来自 Intel、MIT 和佐治亚理工学院的研究人员正在研究一个 AI 引擎,它可以分析代码的相似性,以确定代码的实际作用,为自动化软件编写奠定了基础。 + +![](https://img.linux.net.cn/data/attachment/album/202008/31/231333fklk447gw4w4b4vk.jpg) + +随着人工智能(AI)的快速发展,我们是否会进入计算机智能到足以编写自己的代码并和人类一起完成工作?新的研究表明,我们可能正在接近这个里程碑。 + +来自 MIT 和佐治亚理工学院的研究人员与 Intel 合作开发了一个人工智能引擎,被称为机器推断代码相似性(MISIM),它旨在分析软件代码并确定它与其他代码的相似性。最有趣的是,该系统有学习代码的潜力,然后利用这种智能来改变软件的编写方式。最终,人们可以解释希望程序做什么,然后机器编程(MP)系统可以拿出一个已经编写完的应用。 + +Intel 首席科学家兼机器编程研究总监/创始人 Justin Gottschlich 在该公司的[新闻稿][2]中说:“当完全实现时,MP 能让每个人都能以任何最适合自己的方式 —— 无论是代码、自然语言还是其他东西 —— 来表达自己的意图以创建软件。这是一个大胆的目标,虽然还有很多工作要做,但 MISIM 是朝着这个目标迈出的坚实一步。” + +### 它是如何工作的 + +Intel 解释说,神经网络“根据它们被设计执行的作业”给代码片段打出相似度分数。例如,两个代码样本可能看起来完全不同,但由于它们执行相同的功能,因此被评为相同。然后,该算法可以确定哪个代码片段更有效率。 + +例如,代码相似性系统的原始版本被用于抄袭检测。然而,有了 MISIM,该算法会查看代码块,并试图根据上下文确定这些代码段是否具有相似的特征,或者是否有相似的目标。然后,它可以提供性能方面的改进,例如说,总体效率的改进。 + +MISIM 的关键是创造者的意图,它标志着向基于意图的编程的进步,它可以使软件的设计基于非程序员创造者想要实现的目标。通过基于意图的编程,算法会借助于一个开源代码池,而不是依靠传统的、手工的方法,编译一系列类似于步骤的编程指令,逐行告诉计算机如何做某件事。 + +Intel 解释说:“MISIM 与现有代码相似性系统的核心区别在于其新颖的上下文感知语义结构 (CASS),其目的是将代码的实际作用提炼出来。与其他现有的方法不同,CASS 可以根据特定的上下文进行配置,使其能够捕捉到更高层次的代码描述信息。CASS 可以更具体地洞察代码的作用,而不是它是如何做的。” + +这是在没有编译器(编程中的一个阶段,将人类可读代码转换为计算机程序)的情况下完成的。方便的是,可以执行部分片段,只是为了看看那段代码中会发生什么。另外,该系统摆脱了软件开发中一些比较繁琐的部分,比如逐行查找错误。更多细节可以在该小组的论文([PDF][3])中找到。 + +Intel 表示,该团队的 MISIM 系统比之前的代码相似性系统识别相似代码的准确率高 40 倍。 + +一个 Redditor,Heres_your_sign [对 MISIM 报道][4]的评论中有趣地指出,幸好计算机不写需求。这位 Redditor 认为,那是自找麻烦。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3570389/ai-system-analyzes-code-similarities-makes-progress-toward-automated-coding.html + +作者:[Patrick Nelson][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Patrick-Nelson/ +[b]: https://github.com/lujun9972 +[2]: https://newsroom.intel.com/news/intel-mit-georgia-tech-machine-programming-code-similarity-system/#gs.d8qd40 +[3]: https://arxiv.org/pdf/2006.05265.pdf +[4]: https://www.reddit.com/r/technology/comments/i2dxed/this_ai_could_bring_us_computers_that_can_write/ +[5]: https://www.facebook.com/NetworkWorld/ +[6]: https://www.linkedin.com/company/network-world diff --git a/published/202008/20200814 Come test a new release of pipenv, the Python development tool.md b/published/202008/20200814 Come test a new release of pipenv, the Python development tool.md new file mode 100644 index 0000000000..f6f5410c59 --- /dev/null +++ b/published/202008/20200814 Come test a new release of pipenv, the Python development tool.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12540-1.html) +[#]: subject: (Come test a new release of pipenv, the Python development tool) +[#]: via: (https://fedoramagazine.org/come-test-a-new-release-of-pipenv-the-python-development-tool/) +[#]: author: (torsava https://fedoramagazine.org/author/torsava/) + +快来测试 Python 开发工具 pipenv 的新版本 +====== + +![][1] + +[pipenv][2] 是一个可帮助 Python 开发人员维护具有特定一组依赖关系的隔离虚拟环境,以实现可重新复制的开发和部署环境的工具。它类似于其他编程语言中的工具如 bundler、composer、npm、cargo、yarn 等。 + +最近发布了新版本的 pipenv 2020.6.2。现在可以在 Fedora 33 和 Rawhide 中使用它。对于较旧的 Fedora,维护人员决定打包到 [COPR][3] 中来先进行测试。所以在他们把它推送到稳定的Fedora版本之前,来试试吧。新版本没有带来任何新颖的功能,但是经过两年的开发,它解决了许多问题,并且在底层做了很多不同的事情。之前可以正常工作的应该可以继续工作,但是可能会略有不同。 + +### 如何获取 + +如果你已经在运行 Fedora 33 或 Rawhide,请运行 `$ sudo dnf upgrade pipenv` 或者 `$ sudo dnf install pipenv`,你将获得新版本。 + +在 Fedora 31 或 Fedora 32 上,你需要使用 [copr 仓库][3],直到经过测试的包出现在官方仓库中为止。要启用仓库,请运行: + +``` +$ sudo dnf copr enable @python/pipenv +``` + +然后将 `pipenv` 升级到新版本,运行: + +``` +$ sudo dnf upgrade pipenv +``` + +或者,如果尚未安装,请通过以下方式安装: + +``` +$ sudo dnf install pipenv +``` + +如果你需要回滚到官方维护的版本,可以运行: + +``` +$ sudo dnf copr disable @python/pipenv +$ sudo dnf distro-sync pipenv +``` + +*COPR 不受 Fedora 基础架构的官方支持。使用软件包需要你自担风险。* + +### 如何使用 + +如果你有用旧版本 `pipenv` 管理的项目,你应该可以毫无问题地使用新版本。如果有问题请让我们知道。 + +如果你还不熟悉 `pipenv` 或想开始一个新项目,请参考以下快速指南: + +创建一个工作目录: + +``` +$ mkdir new-project && cd new-project +``` + +使用 Python 3 初始化 `pipenv`: + +``` +$ pipenv --three +``` + +安装所需的软件包,例如: + +``` +$ pipenv install six +``` + +生成 `Pipfile.lock` 文件: + +``` +$ pipenv lock +``` + +现在,你可以将创建的 `Pipfile` 和 `Pipfile.lock` 文件提交到版本控制系统(例如 git)中,其他人可以在克隆的仓库中使用此命令来获得相同的环境: + +``` +$ pipenv install +``` + +有关更多示例,请参见 [pipenv 的文档][4]。 + +### 如何报告问题 + +如果你使用新版本的 `pipenv` 遇到任何问题,请[在 Fedora 的 Bugzilla中 报告问题][5]。Fedora 官方仓库和 copr 仓库中 `pipenv` 软件包的维护者是相同的人。请在报告中指出是新版本。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/come-test-a-new-release-of-pipenv-the-python-development-tool/ + +作者:[torsava][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/torsava/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2018/06/pipenv-install-816x345.jpg +[2]: https://github.com/pypa/pipenv +[3]: https://copr.fedorainfracloud.org/coprs/g/python/pipenv/ +[4]: https://pipenv.pypa.io/en/latest/install/ +[5]: https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&component=pipenv diff --git a/published/202008/20200817 Use GNU on Windows with MinGW.md b/published/202008/20200817 Use GNU on Windows with MinGW.md new file mode 100644 index 0000000000..153eedab60 --- /dev/null +++ b/published/202008/20200817 Use GNU on Windows with MinGW.md @@ -0,0 +1,141 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12549-1.html) +[#]: subject: (Use GNU on Windows with MinGW) +[#]: via: (https://opensource.com/article/20/8/gnu-windows-mingw) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 Mingw 在 Windows 上使用 GNU +====== + +> 在 Windows 上安装 GNU 编译器集合(gcc)和其他 GNU 组件来启用 GNU Autotools。 + +![](https://img.linux.net.cn/data/attachment/album/202008/25/085619rr331p13shpt6htp.jpg) + +如果你是一名使用 Windows 的黑客,你不需要专有应用来编译代码。借助 [Minimalist GNU for Windows][2](MinGW)项目,你可以下载并安装 [GNU 编译器集合(GCC)][3]以及其它几个基本的 GNU 组件,以在 Windows 计算机上启用 [GNU Autotools][4]。 + +### 安装 MinGW + +安装 MinGW 的最简单方法是通过 mingw-get,它是一个图形用户界面 (GUI) 应用,可帮助你选择要安装哪些组件,并让它们保持最新。要运行它,请从项目主页[下载 mingw-get-setup.exe][5]。像你安装其他 EXE 一样,在向导中单击完成安装。 + +![Installing mingw-get][6] + +### 在 Windows 上安装 GCC + +目前为止,你只安装了一个程序,或者更准确地说,一个称为 mingw-get 的专用的*包管理器*。启动 mingw-get 选择要在计算机上安装的 MinGW 项目应用。 + +首先,从应用菜单中选择 mingw-get 启动它。 + +![Installing GCC with MinGW][8] + +要安装 GCC,请单击 GCC 和 G++ 包来标记要安装 GNU C、C++ 编译器。要完成此过程,请从 mingw-get 窗口左上角的**安装**菜单中选择**应用更改**。 + +安装 GCC 后,你可以使用完整路径在 [PowerShell][9] 中运行它: + +``` +PS> C:\MinGW\bin\gcc.exe --version +gcc.exe (MinGW.org GCC Build-x) x.y.z +Copyright (C) 2019 Free Software Foundation, Inc. +``` + +### 在 Windows 上运行 Bash + +虽然它自称 “minimalist”(最小化),但 MinGW 还提供一个可选的 [Bourne shell][10] 命令行解释器,称为 MSYS(它代表最小系统Minimal System)。它是微软的 `cmd.exe` 和 PowerShell 的替代方案,它默认是 Bash。除了是(自然而然的)最流行的 shell 之一外,Bash 在将开源应用移植到 Windows 平台时很有用,因为许多开源项目都假定了 [POSIX][11] 环境。 + +你可以在 mingw-get GUI 或 PowerShell 内安装 MSYS: + +``` +PS> mingw-get install msys +``` + +要尝试 Bash,请使用完整路径启动它: + +``` +PS> C:\MinGW\msys/1.0/bin/bash.exe +bash.exe-$ echo $0 +"C:\MinGW\msys/1.0/bin/bash.exe" +``` + +### 在 Windows 上设置路径 + +你可能不希望为要使用的每个命令输入完整路径。将包含新 GNU 可执行文件的目录添加到 Windows 中的路径中。需要添加两个可执行文件的根目录:一个用于 MinGW(包括 GCC 及其相关工具链),另一个用于 MSYS(包括 Bash、GNU 和 [BSD][12] 项目中的许多常用工具)。 + +若要在 Windows 中修改环境,请单击应用菜单并输入 `env`。 + +![Edit your env][13] + +这将打开“首选项”窗口。点击窗口底部附近的“环境变量”按钮。 + +在“环境变量”窗口中,双击底部面板中的“路径”选区。 + +在“编辑环境变量”窗口中,单击右侧的“新增”按钮。创建一个新条目 `C:\MinCW\msys\1.0\bin`,然后单击 “确定”。以相同的方式创建第二条 `C:\MinGW\bin`,然后单击 “确定”。 + +![Set your env][14] + +在每个首选项窗口中接受这些更改。你可以重启计算机以确保所有应用都检测到新变量,或者只需重启 PowerShell 窗口。 + +从现在开始,你可以调用任何 MinGW 命令而不指定完整路径,因为完整路径位于 PowerShell 继承的 Windows 系统的 `%PATH%` 环境变量中。 + +### Hello world + +你已经完成设置,因此可以对新的 MinGW 系统进行小测试。如果你是 [Vim][15] 用户,请启动它,然后输入下面的 “hello world” 代码: + +``` +#include +#include + +using namespace std; + +int main() { + cout << "Hello open source." << endl; + return 0; +} +``` + +将文件保存为 `hello.cpp`,然后使用 GCC 的 C++ 组件编译文件: + +``` +PS> gcc hello.cpp --output hello +``` + +最后,运行它: + +``` +PS> .\a.exe +Hello open source. +PS> +``` + +MinGW 的内容远不止我在这里所能介绍的。毕竟,MinGW 打开了一个完整的开源世界和定制代码的潜力,因此请充分利用它。对于更广阔的开源世界,你还可以[试试 Linux][16]。当所有的限制都被消除后,你会惊讶于可能的事情。但与此同时,请试试 MinGW,并享受 GNU 的自由。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/gnu-windows-mingw + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/more_windows.jpg?itok=hKk64RcZ (Windows) +[2]: http://mingw.org +[3]: https://gcc.gnu.org/ +[4]: https://opensource.com/article/19/7/introduction-gnu-autotools +[5]: https://osdn.net/projects/mingw/releases/ +[6]: https://opensource.com/sites/default/files/uploads/mingw-install.jpg (Installing mingw-get) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/uploads/mingw-packages.jpg (Installing GCC with MinGW) +[9]: https://opensource.com/article/19/8/variables-powershell +[10]: https://en.wikipedia.org/wiki/Bourne_shell +[11]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[12]: https://opensource.com/article/19/3/netbsd-raspberry-pi +[13]: https://opensource.com/sites/default/files/uploads/mingw-env.jpg (Edit your env) +[14]: https://opensource.com/sites/default/files/uploads/mingw-env-set.jpg (Set your env) +[15]: https://opensource.com/resources/what-vim +[16]: https://opensource.com/article/19/7/ways-get-started-linux diff --git a/published/202008/20200818 IBM details next-gen POWER10 processor.md b/published/202008/20200818 IBM details next-gen POWER10 processor.md new file mode 100644 index 0000000000..182beb3ff8 --- /dev/null +++ b/published/202008/20200818 IBM details next-gen POWER10 processor.md @@ -0,0 +1,53 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12546-1.html) +[#]: subject: (IBM details next-gen POWER10 processor) +[#]: via: (https://www.networkworld.com/article/3571415/ibm-details-next-gen-power10-processor.html) +[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) + +IBM 披露了下一代 POWER10 处理器细节 +====== + +![](https://images.idgesg.net/images/article/2020/08/power-10_06-100854570-large.jpg) + +> 新的 CPU 针对企业混合云和 AI 推断进行了优化,它采用了为 PB 级内存集群开发的新技术。 + +IBM 上周一公布了最新的 POWER RISC CPU 系列,该系列针对企业混合云计算和人工智能 (AI)推理进行了优化,同时还进行了其他一些改进。 + +Power 是上世纪 90 年代最后一款 Unix 处理器,当时 Sun Microsystems、HP、SGI 和 IBM 都有竞争性的 Unix 系统,以及与之配合的 RISC 处理器。后来,Unix 让位给了 Linux,RISC 让位给了 x86,但 IBM 坚持了下来。 + +这是 IBM 的第一款 7 纳米处理器,IBM 宣称它将在与前代 POWER9 相同的功率范围内,将容量和处理器能效提升多达三倍。该处理器采用 15 核设计(实际上是 16 核,但其中一个没有使用),并允许采用单芯片或双芯片型号,因此 IBM 可以在同一外形尺寸中放入两个处理器。每个核心最多可以有 8 个线程,每块 CPU 最多支持 4TB 的内存。 + +更有趣的是一种名为 Memory Inception 的新内存集群技术。这种形式的集群允许系统将另一台物理服务器中的内存当作自己的内存来看待。因此,服务器不需要在每个机箱中放很多内存,而是可以在内存需求激增的时候,从邻居那里借到内存。或者,管理员可以在集群的中间设置一台拥有大量内存的服务器,并在其周围设置一些低内存服务器,这些服务器可以根据需要从大内存服务器上借用内存。 + +所有这些都是在 50 到 100 纳秒的延迟下完成的。IBM 的杰出工程师 William Starke 在宣布前的视频会议上说:“这已经成为行业的圣杯了。与其在每个机器里放很多内存,不如当我们对内存的需求激增时,我可以向邻居借。” + +POWER10 使用的是一种叫做开放内存接口(OMI)的东西,因此服务器现在可以使用 DDR4,上市后可以升级到 DDR5,它还可以使用 GPU 中使用的 GDDR6 内存。理论上,POWER10 将具备 1TB/秒的内存带宽和 1TB/秒的 SMP 带宽。 + +与 POWER9 相比,POWER10 处理器每个核心的 AES 加密引擎数量增加了四倍。这实现了多项安全增强功能。首先,这意味着在不降低性能的情况下进行全内存加密,因此入侵者无法扫描内存内容。 + +其次,它可以为容器提供隔离的硬件和软件安全。这是为了解决更高密度的容器相关的行安全考虑。如果一个容器被入侵,POWER10 处理器的设计能够防止同一虚拟机中的其他容器受到同样的入侵影响。 + +最后,POWER10 提供了核心内的 AI 业务推断。它通过片上支持用于训练的 bfloat16 以及 AI 推断中常用的 INT8 和 INT4 实现。这将允许事务性负载在应用中添加 AI 推断。IBM 表示,POWER10 中的 AI 推断是 POWER9 的 20 倍。 + +公告中没有提到的是对操作系统的支持。POWER 运行 IBM 的 Unix 分支 AIX,以及 Linux。这并不太令人惊讶,因为这个消息是在 Hot Chips 上发布的,Hot Chips 是每年在斯坦福大学举行的年度半导体会议。Hot Chips 关注的是最新的芯片进展,所以软件通常被排除在外。 + +IBM 一般会在发布前一年左右公布新的 POWER 处理器,所以有足够的时间进行 AIX 的更新。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3571415/ibm-details-next-gen-power10-processor.html + +作者:[Andy Patrizio][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Andy-Patrizio/ +[b]: https://github.com/lujun9972 +[1]: https://www.facebook.com/NetworkWorld/ +[2]: https://www.linkedin.com/company/network-world diff --git a/published/202008/20200819 How to Convert Text Files between Unix and DOS (Windows) Formats.md b/published/202008/20200819 How to Convert Text Files between Unix and DOS (Windows) Formats.md new file mode 100644 index 0000000000..a7cfa20b4e --- /dev/null +++ b/published/202008/20200819 How to Convert Text Files between Unix and DOS (Windows) Formats.md @@ -0,0 +1,222 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12558-1.html) +[#]: subject: (How to Convert Text Files between Unix and DOS Windows Formats) +[#]: via: (https://www.2daygeek.com/how-to-convert-text-files-between-unix-and-dos-windows-formats/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何将文本文件在 Unix 和 DOS(Windows)格式之间转换 +====== + +![](https://img.linux.net.cn/data/attachment/album/202008/27/235550klfnz34lzpnchf7g.jpg) + +作为一名 Linux 管理员,你可能已经注意到了一些开发者请求将文件从 DOS 格式转换为 Unix 格式,反之亦然。 + +这是因为这些文件是在 Windows 系统上创建的,并由于某种原因被复制到 Linux 系统上。 + +这本身没什么问题,但 Linux 系统上的一些应用可能不能理解这些新的换行符,所以在使用之前,你需要转换它们。 + +DOS 文本文件带有回车(`CR` 或 `\r`)和换行(`LF` 或 `\n`)一对字符作为它们的换行符,而 Unix 文本只有换行(`LF`)符。 + +有很多方法可以将 DOS 文本文件转换为 Unix 格式。 + +但我推荐使用一个名为 `dos2unix` / `unix2dos` 的特殊工具将文本在 DOS 和 Unix 格式之间转换。 + + * `dos2unix`:将文本文件从 DOS 格式转换为 Unix 格式。 + * `unix2dos`:将文本文件从 Unix 格式转换为 DOS 格式。 + * `tr`、`awk` 和 [sed 命令][1]:这些可以用于相同的目的。 + +使用 `od`(八进制转储octal dump)命令可以很容易地识别文件是 DOS 格式还是 Unix 格式,如下图所示: + +``` +# od -bc windows.txt +0000000 125 156 151 170 040 151 163 040 141 040 146 162 145 145 040 157 +U n i x i s a f r e e o +0000020 160 145 156 163 157 165 162 143 145 040 157 160 145 162 141 164 +p e n s o u r c e o p e r a t +0000040 151 156 147 040 163 171 163 164 145 155 015 012 123 165 160 145 +i n g s y s t e m \r \n S u p e +0000060 162 040 143 157 155 160 165 164 145 162 163 040 141 162 145 040 +r c o m p u t e r s a r e +0000100 162 165 156 156 151 156 147 040 157 156 040 125 116 111 130 015 +r u n n i n g o n U N I X \r +0000120 012 071 065 045 040 157 146 040 167 145 142 163 151 164 145 163 +\n 9 5 % o f w e b s i t e s +0000140 040 141 162 145 040 162 165 156 156 151 156 147 040 157 156 040 +a r e r u n n i n g o n +0000160 114 151 156 165 170 040 117 123 015 012 101 156 171 164 150 151 +L i n u x O S \r \n A n y t h i +0000200 156 147 040 143 141 156 040 142 145 040 144 157 156 145 040 157 +n g c a n b e d o n e o +0000220 156 040 114 151 156 165 170 015 012 +n L i n u x \r \n +0000231 +``` + +上面的输出清楚地表明这是一个 DOS 格式的文件,因为它包含了转义序列 `\r\n`。 + +同时,当你在终端上打印文件输出时,你会得到下面的输出: + +``` +# cat windows.txt +Unix is a free opensource operating system +Super computers are running on UNIX +95% of websites are running on Linux OS +Anything can be done on Linux +``` + +### 如何在 Linux 上安装 dos2unix? + +`dos2unix` 可以很容易地从发行版的官方仓库中安装。 + +对于 RHEL/CentOS 6/7 系统,使用 [yum 命令][2] 安装 `dos2unix`。 + +``` +$ sudo yum install -y dos2unix +``` + +对于 RHEL/CentOS 8 和 Fedora 系统,使用 [dnf 命令][3] 安装 `dos2unix`。 + +``` +$ sudo yum install -y dos2unix +``` + +对于基于 Debian 的系统,使用 [apt 命令][4] 或 [apt-get 命令][5] 来安装 `dos2unix`。 + +``` +$ sudo apt-get update +$ sudo apt-get install dos2unix +``` + +对于 openSUSE 系统,使用 [zypper命令][6] 安装 `dos2unix`。 + +``` +$ sudo zypper install -y dos2unix +``` + +### 1)如何将 DOS 文件转换为 UNIX 格式? + +以下命令将 `windows.txt` 文件从 DOS 转换为 Unix 格式。 + +对该文件的修改是删除文件每行的 `\r`。 + +``` +# dos2unix windows.txt +dos2unix: converting file windows.txt to Unix format … +``` + +``` +# cat windows.txt +0000000 125 156 151 170 040 151 163 040 141 040 146 162 145 145 040 157 +U n i x i s a f r e e o +0000020 160 145 156 163 157 165 162 143 145 040 157 160 145 162 141 164 +p e n s o u r c e o p e r a t +0000040 151 156 147 040 163 171 163 164 145 155 012 123 165 160 145 162 +i n g s y s t e m \n S u p e r +0000060 040 143 157 155 160 165 164 145 162 163 040 141 162 145 040 162 +c o m p u t e r s a r e r +0000100 165 156 156 151 156 147 040 157 156 040 125 116 111 130 012 071 +u n n i n g o n U N I X \n 9 +0000120 065 045 040 157 146 040 167 145 142 163 151 164 145 163 040 141 +5 % o f w e b s i t e s a +0000140 162 145 040 162 165 156 156 151 156 147 040 157 156 040 114 151 +r e r u n n i n g o n L i +0000160 156 165 170 040 117 123 012 101 156 171 164 150 151 156 147 040 +n u x O S \n A n y t h i n g +0000200 143 141 156 040 142 145 040 144 157 156 145 040 157 156 040 114 +c a n b e d o n e o n L +0000220 151 156 165 170 012 +i n u x \n +0000225 +``` + +上面的命令将覆盖原始文件。 + +如果你想保留原始文件,请使用以下命令。这将把转换后的输出保存为一个新文件。 + +``` +# dos2unix -n windows.txt unix.txt +dos2unix: converting file windows.txt to file unix.txt in Unix format … +``` + +#### 1a)如何使用 tr 命令将 DOS 文件转换为 UNIX 格式。 + +正如文章开头所讨论的,你可以如下所示使用 `tr` 命令将 DOS 文件转换为 Unix 格式。 + +``` +Syntax: tr -d '\r' < source_file > output_file +``` + +下面的 `tr` 命令将 DOS 格式的文件 `windows.txt` 转换为 Unix 格式文件 `unix.txt`。 + +``` +# tr -d '\r' < windows.txt >unix.txt +``` + +注意:不能使用 `tr` 命令将文件从 Unix 格式转换为 Windows(DOS)。 + +#### 1b)如何使用 awk 命令将 DOS 文件转换为 UNIX 格式。 + +使用以下 `awk` 命令格式将 DOS 文件转换为 Unix 格式。 + +``` +Syntax: awk '{ sub("\r$", ""); print }' source_file.txt > output_file.txt +``` + +以下 `awk` 命令将 DOS 文件 `windows.txt` 转换为 Unix 格式文件 `unix.txt`。 + +``` +# awk '{ sub("\r$", ""); print }' windows.txt > unix.txt +``` + +### 2)如何将 UNIX 文件转换为 DOS 格式? + +当你把一个文件从 UNIX 转换为 DOS 格式时,它会在每一行中添加一个回车(`CR` 或 `\r`)。 + +``` +# unix2dos unix.txt +unix2dos: converting file unix.txt to DOS format … +``` + +该命令将保留原始文件。 + +``` +# unix2dos -n unix.txt windows.txt +unix2dos: converting file unix.txt to file windows.txt in DOS format … +``` + +#### 2a)如何使用 awk 命令将 UNIX 文件转换为 DOS 格式? + +使用以下 `awk` 命令格式将 UNIX 文件转换为 DOS 格式。 + +``` +Syntax: awk 'sub("$", "\r")' source_file.txt > output_file.txt +``` + +下面的 `awk` 命令将 `unix.txt` 文件转换为 DOS 格式文件 `windows.txt`。 + +``` +# awk 'sub("$", "\r")' unix.txt > windows.txt +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/how-to-convert-text-files-between-unix-and-dos-windows-formats/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/linux-sed-to-find-and-replace-string-in-files/ +[2]: https://www.2daygeek.com/linux-yum-command-examples-manage-packages-rhel-centos-systems/ +[3]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ +[4]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/ +[5]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/ +[6]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/ diff --git a/published/202008/20200821 Being open to open values.md b/published/202008/20200821 Being open to open values.md new file mode 100644 index 0000000000..9de553292a --- /dev/null +++ b/published/202008/20200821 Being open to open values.md @@ -0,0 +1,58 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12561-1.html) +[#]: subject: (Being open to open values) +[#]: via: (https://opensource.com/open-organization/20/8/being-open-to-open-values) +[#]: author: (Heidi Hess von Ludewig https://opensource.com/users/heidi-hess-von-ludewig) + +对开放的价值观持开放态度 +====== + +> 开放管理可能会让人感到恐惧。一位经理人解释了为什么值得冒这个风险。 + +![Open Lego CAD][1] + +在本期的“[用开放的价值观管理][2]”系列中,我和美国一家全国性保险公司的定价总监、人事经理 Braxton 聊了聊。 + +2018 年 6 月,Braxton 联系到了开放组织社区的红帽人员。他想了解更多关于他*和*他的团队如何使用开放的价值观,以不同的方式工作。我们很乐意提供帮助。于是我帮助 Braxton 和他的团队组织了一个关于[开放组织原则][3]的研讨会,并在之后还保持着联系,这样我就可以了解他在变得更加开放的过程中的风险。 + +最近我们采访了 Braxton,并和他一起坐下来听了事情的进展。[产业/组织心理学家和员工参与度专家][4] Tracy Guiliani 和 [Bryan Behrenshausen][5] 一起加入了采访。我们的谈话范围很广,探讨了了解开源价值观后的感受,如何利用它们来改变组织,以及它们如何帮助 Braxton 和他的团队更好地工作和提高参与度。 + +与 Braxton 合作是一次异常有意义的经历。它让我们直接见证了一个人如何将开放组织社区驱动的研讨会材料融入动态变化,并使他、他的团队和他的组织受益。开放组织大使*一直*在寻求帮助人们获得关于开放价值的见解和知识,使他们能够理解文化变革和[自己组织内的转型][6]。 + +他和他的团队正在以对他们有效的方式执行他们独特的开放价值观,并且让团队实现的利益超过了提议变革在时间和精力上的投入。 + +Braxton 对开放组织原则的*解释*和使组织更加开放的策略,让我们深受启发。 + +Braxton 承认,他的更开放的目标并不包括“制造另一个红帽”。相反,他和他的团队是在以对他们有效的方式,以及让团队实现的利益超过提议的变革所带来的时间和精力投入,来执行他们独特的开放价值观。 + +在我们采访的第一部分,你还会听到 Braxton 描述: + + 1. 在了解了透明性、协作性、适应性、社区性和包容性这五种开放式组织价值观之后,“开放式管理”对他意味着什么? + 2. 他的一些开放式管理做法。 + 3. 他如何在他的团队中倡导开放文化,如何在后来者中鼓励开源价值观,以及他所体验到的好处。 + 4. 当人们试图改造自己的组织时,对开源价值观最大的误解是什么? + +- [收听对 Braxton 的采访](https://opensource.com/sites/default/files/images/open-org/braxton_1.ogg) + +-------------------------------------------------------------------------------- + +via: https://opensource.com/open-organization/20/8/being-open-to-open-values + +作者:[Heidi Hess von Ludewig][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/heidi-hess-von-ludewig +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open-lego.tiff_.png?itok=mQglOhW_ (Open Lego CAD) +[2]: https://opensource.com/open-organization/managing-with-open-values +[3]: https://github.com/open-organization/open-org-definition +[4]: https://opensource.com/open-organization/20/5/commitment-engagement-org-psychology +[5]: https://opensource.com/users/bbehrens +[6]: https://opensource.com/open-organization/18/4/rethinking-ownership-across-organization diff --git a/published/202008/20200825 11 ways to list and sort files on Linux.md b/published/202008/20200825 11 ways to list and sort files on Linux.md new file mode 100644 index 0000000000..135df819e9 --- /dev/null +++ b/published/202008/20200825 11 ways to list and sort files on Linux.md @@ -0,0 +1,212 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12560-1.html) +[#]: subject: (11 ways to list and sort files on Linux) +[#]: via: (https://www.networkworld.com/article/3572590/11-ways-to-list-and-sort-files-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +把 Linux 上的文件列表和排序玩出花来 +====== + +![](https://img.linux.net.cn/data/attachment/album/202008/28/213742y8cxnbnjpopzd5j0.jpg) + +> Linux 命令可以提供文件的详细信息,也可以自定义显示的文件列表,甚至可以深入到文件系统的目录中,只要你愿意看。 + +在 Linux 系统上,有许多方法可以列出文件并显示它们的信息。这篇文章回顾了一些提供文件细节的命令,并提供了自定义文件列表的选项,以满足你的需求。 + +大多数命令都会列出单个目录中的文件,而其他命令则可以深入到文件系统的目录中,只要你愿意看。 + +当然,最主要的文件列表命令是 `ls`。然而,这个命令有大量的选项,可以只查找和列出你想看的文件。另外,还有 `find` 可以帮助你进行非常具体的文件搜索。 + +### 按名称列出文件 + +最简单的方法是使用 `ls` 命令按名称列出文件。毕竟,按名称(字母数字顺序)列出文件是默认的。你可以选择 `ls`(无细节)或 `ls -l`(大量细节)来决定你看到什么。 + +``` +$ ls | head -6 +8pgs.pdf +Aesthetics_Thank_You.pdf +alien.pdf +Annual_Meeting_Agenda-20190602.pdf +bigfile.bz2 +bin +$ ls -l | head -6 +-rw-rw-r-- 1 shs shs 10886 Mar 22 2019 8pgs.pdf +-rw-rw-r-- 1 shs shs 284003 May 11 2019 Aesthetics_Thank_You.pdf +-rw-rw-r-- 1 shs shs 38282 Jan 24 2019 alien.pdf +-rw-rw-r-- 1 shs shs 97358 May 19 2019 Annual_Meeting_20190602.pdf +-rw-rw-r-- 1 shs shs 18115234 Apr 16 17:36 bigfile.bz2 +drwxrwxr-x 4 shs shs 8052736 Jul 10 13:17 bin +``` + +如果你想一次查看一屏的列表,可以将 `ls` 的输出用管道送到 `more` 命令中。 + +### 按相反的名字顺序排列文件 + +要按名称反转文件列表,请添加 `-r`(反转Reverse)选项。这就像把正常的列表倒过来一样。 + +``` +$ ls -r +$ ls -lr +``` + +### 按文件扩展名列出文件 + +`ls` 命令不会按内容分析文件类型,它只会处理文件名。不过,有一个命令选项可以按扩展名列出文件。如果你添加了 `-X` (扩展名eXtension)选项,`ls` 将在每个扩展名类别中按名称对文件进行排序。例如,它将首先列出没有扩展名的文件(按字母数字顺序),然后是扩展名为 `.1`、`.bz2`、`.c` 等的文件。 + +### 只列出目录 + +默认情况下,`ls` 命令将同时显示文件和目录。如果你想只列出目录,你可以使用 `-d`(目录Directory)选项。你会得到一个像这样的列表: + +``` +$ ls -d */ +1/ backups/ modules/ projects/ templates/ +2/ html/ patches/ public/ videos/ +bin/ new/ private/ save/ +``` + +### 按大小排列文件 + +如果你想按大小顺序列出文件,请添加 `-S`(大小Size)选项。但请注意,这实际上不会显示文件的大小(以及其他文件的细节),除非你还添加 `-l`(长列表Long listing)选项。当按大小列出文件时,一般来说,看到命令在按你的要求做事情是很有帮助的。注意,默认情况下是先显示最大的文件。添加 `-r` 选项可以反过来(即 `ls -lSr`)。 + +``` +$ ls -lS +total 959492 +-rw-rw-r-- 1 shs shs 357679381 Sep 19 2019 sav-linux-free-9.tgz +-rw-rw-r-- 1 shs shs 103270400 Apr 16 17:38 bigfile +-rw-rw-r-- 1 shs shs 79117862 Oct 5 2019 Nessus-8.7.1-ubuntu1110_amd64.deb +``` + +### 按属主列出文件 + +如果你想按属主列出文件(例如,在一个共享目录中),你可以把 `ls` 命令的输出传给 `sort`,并通过添加 `-k3` 来按第三个字段排序,从而挑出属主一栏。 + +``` +$ ls -l | sort -k3 | more +total 56 +-rw-rw-r-- 1 dory shs 0 Aug 23 12:27 tasklist +drwx------ 2 gdm gdm 4096 Aug 21 17:12 tracker-extract-files.121 +srwxr-xr-x 1 root root 0 Aug 21 17:12 ntf_listenerc0c6b8b4567 +drwxr-xr-x 2 root root 4096 Aug 21 17:12 hsperfdata_root + ^ + | +``` + +事实上,你可以用这种方式对任何字段进行排序(例如,年份)。只是要注意,如果你要对一个数字字段进行排序,则要加上一个 `n`,如 `-k5n`,否则你将按字母数字顺序进行排序。这种排序技术对于文件内容的排序也很有用,而不仅仅是用于列出文件。 + +### 按年份排列文件 + +使用 `-t`(修改时间Time modified)选项按年份顺序列出文件 —— 它们的新旧程度。添加 `-r` 选项,让最近更新的文件在列表中最后显示。我使用这个别名来显示我最近更新的文件列表。 + +``` +$ alias recent='ls -ltr | tail -8' +``` + +请注意,文件的更改时间和修改时间是不同的。`-c`(更改时间time Changed)和 `-t`(修改时间)选项的结果并不总是相同。如果你改变了一个文件的权限,而没有改变其他内容,`-c` 会把这个文件放在 `ls` 输出的顶部,而 `-t` 则不会。如果你想知道其中的区别,可以看看 `stat` 命令的输出。 + +``` +$ stat ckacct + File: ckacct + Size: 200 Blocks: 8 IO Block: 4096 regular file +Device: 801h/2049d Inode: 829041 Links: 1 +Access: (0750/-rwxr-x---) Uid: ( 1000/ shs) Gid: ( 1000/ shs) +Access: 2020-08-20 16:10:11.063015008 -0400 +Modify: 2020-08-17 07:26:34.579922297 -0400 <== content changes +Change: 2020-08-24 09:36:51.699775940 -0400 <== content or permissions changes + Birth: - +``` + +### 按组别列出文件 + +要按关联的组别对文件进行排序,你可以将一个长列表的输出传给 `sort` 命令,并告诉它在第 4 列进行排序。 + +``` +$ ls -l | sort -k4 +``` + +### 按访问日期列出文件 + +要按访问日期(最近访问的日期在前)列出文件,使用 `-ltu` 选项。`u` 强制“按访问日期”排列顺序。 + +``` +$ ls -ltu +total 959500 +-rwxr-x--- 1 shs shs 200 Aug 24 09:42 ckacct <== most recently used +-rw-rw-r-- 1 shs shs 1335 Aug 23 17:45 lte +``` + +### 单行列出多个文件 + +有时,精简的文件列表更适合手头的任务。`ls` 命令甚至有这方面的选项。为了在尽可能少的行上列出文件,你可以使用 `--format=comma` 来用逗号分隔文件名,就像这个命令一样: + +``` +$ ls --format=comma +1, 10, 11, 12, 124, 13, 14, 15, 16pgs-landscape.pdf, 16pgs.pdf, 17, 18, 19, +192.168.0.4, 2, 20, 2018-12-23_OoS_2.pdf, 2018-12-23_OoS.pdf, 20190512_OoS.pdf, +'2019_HOHO_application working.pdf' … +``` + +喜欢用空格?使用 `--format=across` 代替。 + +``` +$ ls --format=across z* +z zip zipfiles zipfiles1.bat zipfiles2.bat +zipfiles3.bat zipfiles4.bat zipfiles.bat zoom_amd64.deb zoomap.pdf +zoom-mtg +``` + +### 增加搜索的深度 + +虽然 `ls` 一般只列出单个目录中的文件,但你可以选择使用 `-R` 选项(递归Recursively)地列出文件,深入到整个目录的深处。 + +``` +$ ls -R zzzzz | grep -v "^$" +zzzzz: +zzzz +zzzzz/zzzz: +zzz +zzzzz/zzzz/zzz: +zz +zzzzz/zzzz/zzz/zz: +z +zzzzz/zzzz/zzz/zz/z: +sleeping +``` + +另外,你也可以使用 `find` 命令,对深度进行限制或不限制。在这个命令中,我们指示 `find` 命令只在三个层次的目录中查找: + +``` +$ find zzzzz -maxdepth 3 +zzzzz +zzzzz/zzzz +zzzzz/zzzz/zzz +zzzzz/zzzz/zzz/zz +``` + +### 选择 ls 还是 find + +当你需要列出符合具体要求的文件时,`find` 命令可能是比 `ls` 更好的工具。 + +与 `ls` 不同的是,`find` 命令会尽可能地深入查找,除非你限制它。它还有许多其他选项和一个 `-exec` 子命令,允许在找到你要找的文件后采取一些特定的行动。 + +### 总结 + +`ls` 命令有很多用于列出文件的选项。了解一下它们。你可能会发现一些你会喜欢的选项。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3572590/11-ways-to-list-and-sort-files-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://www.facebook.com/NetworkWorld/ +[2]: https://www.linkedin.com/company/network-world diff --git a/published/202008/20200825 OnionShare- An Open-Source Tool to Share Files Securely Over Tor Network.md b/published/202008/20200825 OnionShare- An Open-Source Tool to Share Files Securely Over Tor Network.md new file mode 100644 index 0000000000..523072c7ee --- /dev/null +++ b/published/202008/20200825 OnionShare- An Open-Source Tool to Share Files Securely Over Tor Network.md @@ -0,0 +1,161 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12564-1.html) +[#]: subject: (OnionShare: An Open-Source Tool to Share Files Securely Over Tor Network) +[#]: via: (https://itsfoss.com/onionshare/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +OnionShare:一个安全共享文件的开源工具 +====== + +> OnionShare 是一个自由开源工具,它利用 Tor 网络安全和匿名地共享文件。 + +![](https://img.linux.net.cn/data/attachment/album/202008/30/103623ty2r6sz03y32o99o.jpg) + +已经有很多在线服务可以安全地共享文件,但它可能不是完全匿名的。 + +此外,你必须依靠一个集中式服务来共享文件,如果服务决定像 [Firefox Send][1] 那样关闭,那你不能真正依靠它来一直安全地共享文件。 + +考虑到这些,OnionShare 是一个让人惊叹的开源工具,它让你使用 [Tor Onion 服务][2]来共享文件。它应该是所有云端文件共享服务的一个很好的替代品。 + +让我们来看看它提供了什么以及它是如何工作的。 + +![][3] + +### OnionShare: 通过 Tor 匿名分享文件 + +[OnionShare][4] 是一款有趣的开源工具,可用于 Linux、Windows 和 macOS。 + +它可以让你安全地将文件直接从你的电脑分享给接收者,而不会在这个过程中暴露你的身份。你不必注册任何帐户,它也不依赖于任何集中式存储服务。 + +它基本上是在 Tor 网络上的点对点服务。接收者只需要有一个 [Tor 浏览器][5]就可以下载/上传文件到你的电脑上。如果你好奇的话,我也建议你去看看我们的 [Tor 指南][6]来探索更多关于它的内容。 + +让我们来看看它的功能。 + +### OnionShare 的功能 + +对于一个只想要安全和匿名的普通用户来说,它不需要调整。不过,如果你有需要,它也有一些高级选项。 + +* 跨平台支持(Windows、macOS和 Linux)。 +* 发送文件 +* 接收文件 +* 命令行选项 +* 发布洋葱站点 +* 能够使用桥接(如果你的 Tor 连接不起作用) +* 能够使用持久 URL 进行共享(高级用户)。 +* 隐身模式(更安全) + +你可以通过 GitHub 上的[官方用户指南][7]来了解更多关于它们的信息。 + +### 在 Linux 上安装 OnionShare + +你应该可以在你的软件中心找到 OnionShare 并安装它。如果没有,你可以在 Ubuntu 发行版上使用下面的命令添加 PPA: + +``` +sudo add-apt-repository ppa:micahflee/ppa +sudo apt update +sudo apt install -y onionshare +``` + +如果你想把它安装在其他 Linux 发行版上,你可以访问[官方网站][4]获取 Fedora 上的安装说明以及构建说明。 + +- [下载 OnionShare][4] + +### OnionShare 如何工作? + +当你安装好后,一切都很明了且易于使用。但是,如果你想开始,让我告诉你它是如何工作的。 + +完成后,它加载并连接到 Tor 网络。 + +#### 共享文件 + +![][8] + +你只需要在电脑上添加你要分享的文件,然后点击 “**Start sharing**”。 + +完成后,右下角的状态应该是 “**Sharing**”,然后会生成一个 **OnionShare 地址**(自动复制到剪贴板),如下图所示。 + +![][9] + +现在接收方需要的是 OnionShare 的地址,它看上去是这样的。 + +``` +http://onionshare:xyz@jumbo2127k6nekzqpff2p2zcxcsrygbnxbitsgnjcfa6v47wvyd.onion +``` + +接着 Tor 浏览器开始下载文件。 + +值得注意的是,下载完成后(文件传输完成),文件共享就会停止。到时候也会通知你。 + +所以,如果你要再次分享或与他人分享,你必须重新分享,并将新的 OnionShare 地址发送给接收者。 + +#### 允许接收文件 + +如果你想生成一个 URL,让别人直接上传文件到你的电脑上(要注意你与谁分享),你可以在启动 OnionShare 后点击 **Receive Files** 标签即可。 + +![][10] + +你只需要点击 “**Start Receive Mode**” 按钮就可以开始了。接下来,你会得到一个 OnionShare 地址(就像共享文件时一样)。 + +接收者必须使用 Tor 浏览器访问它并开始上传文件。它应该像下面这样: + +![][11] + +虽然当有人上传文件到你的电脑上时,你会收到文件传输的通知,但完成后,你需要手动停止接收模式。 + +#### 下载/上传文件 + +考虑到你已经安装了 Tor 浏览器,你只需要在 URL 地址中输入 OnionShare 的地址,确认登录(按 OK 键),它看上去像这样。 + +![][12] + +同样,当你得到一个上传文件的地址时,它看上去是这样的。 + +![][13] + +#### 发布洋葱站点 + +如果你想的话,你可以直接添加文件来托管一个静态的洋葱网站。当然,正因为是点对点的连接,所以在它从你的电脑上传输每个文件时,加载速度会非常慢。 + +![][14] + +我试着用[免费模板][15]测试了一下,效果很好(但很慢)。所以,这可能取决于你的网络连接。 + +### 总结 + +除了上面提到的功能,如果需要的话,你还可以使用命令行进行一些高级的调整。 + +OnionShare 的确是一款令人印象深刻的开源工具,它可以让你轻松地匿名分享文件,而不需要任何特殊的调整。 + +你尝试过 OnionShare 吗?你知道有类似的软件么?请在下面的评论中告诉我! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/onionshare/ + +作者:[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://itsfoss.com/firefox-send/ +[2]: https://community.torproject.org/onion-services/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/onionshare-screenshot.jpg?resize=800%2C629&ssl=1 +[4]: https://onionshare.org/ +[5]: https://itsfoss.com/install-tar-browser-linux/ +[6]: https://itsfoss.com/tor-guide/ +[7]: https://github.com/micahflee/onionshare/wiki +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/onionshare-share.png?resize=800%2C604&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/onionshare-file-shared.jpg?resize=800%2C532&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/onionshare-receive-files.jpg?resize=800%2C655&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/onionshare-receive-mode.jpg?resize=800%2C529&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/onionshare-download.jpg?resize=800%2C499&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/onionshare-upload.jpg?resize=800%2C542&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/onionshare-onion-site.jpg?resize=800%2C366&ssl=1 +[15]: https://www.styleshout.com/free-templates/kards/ diff --git a/published/202008/20200826 Glances - A Versatile System Monitoring Tool for Linux Systems.md b/published/202008/20200826 Glances - A Versatile System Monitoring Tool for Linux Systems.md new file mode 100644 index 0000000000..e223385591 --- /dev/null +++ b/published/202008/20200826 Glances - A Versatile System Monitoring Tool for Linux Systems.md @@ -0,0 +1,228 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12567-1.html) +[#]: subject: (Glances – A Versatile System Monitoring Tool for Linux Systems) +[#]: via: (https://itsfoss.com/glances/) +[#]: author: (Chinmay https://itsfoss.com/author/chinmay/) + +Glances:多功能 Linux 系统监控工具 +====== + +![](https://img.linux.net.cn/data/attachment/album/202008/30/212820tgdi7iou6dg6qqq2.jpg) + +Linux 上最常用的[命令行进程监控工具][1]是 `top` 和它那色彩斑斓、功能丰富的表弟 [htop][2]。 + +要[监控 Linux 上的温度][3],可以使用 [lm-sensors][4]。同样,还有很多实用工具可以监控其他实时指标,如磁盘 I/O、网络统计等。 + +[Glances][5] 是一个系统监控工具,它把这些都联系在一起,并提供了更多的功能。我最喜欢的是,你可以在远程 Linux 服务器上运行 Glances 来监控本地系统的系统资源,也可以通过 Web 浏览器监控。 + +下面是它的外观。下面截图中的终端已经[用 Pywal 工具美化过,可以根据壁纸自动改变颜色][6]。 + +![][7] + +你也可以将它集成到像 [Grafana][8] 这样的工具中,在一个直观的仪表盘中监控统计数据。 + +它是用 Python 编写的,这意味着它的绝大多数功能都可以在大多数平台上使用。 + +### Glances 的功能 + +![Glances Data In Grafana Dashboard][9] + +让我们快速浏览一下 Glances 提供的主要功能: + + * 可以监控系统上的 15 个之多的指标(包括 Docker 容器)。 + * 灵活的使用模式:单机模式、客户端-服务器模式、通过 SSH 和 Web 模式。 + * 可用于集成的各种 REST API 和 XML-RPC API。 + * 支持将数据轻松导出到不同的服务和数据库。 + * 高度的可配置性和适应不同的需求。 + * 非常全面的文档。 + +### 在 Ubuntu 和其他 Linux 发行版上安装 Glances + +Glances 在许多 Linux 发行版的官方软件库中都有。这意味着你可以使用你的发行版的软件包管理器来轻松安装它。 + +在基于 Debian/Ubuntu 的发行版上,你可以使用以下命令: + +``` +sudo apt install glances +``` + +你也可以使用 snap 包安装最新的 Glances: + +``` +sudo snap install glances +``` + +由于 Glances 是基于 Python 的,你也可以使用 PIP 在大多数 Linux 发行版上安装它。先[安装 PIP][10],然后用它来安装 Glances: + +``` +sudo pip3 install glances +``` + +如果没有别的办法,你还可以使用 Glances 开发者提供的自动安装脚本。虽然我们不建议直接在你的系统上随便运行脚本,但这完全取决于你自己: + +``` +curl -L https://bit.ly/glances | /bin/bash +``` + +你可以从他们的[文档][11]中查看其他安装 Glances 的方法,甚至你还可以把它作为一个 Docker 容器来安装。 + +### 使用 Glances 监控本地系统上的 Linux 系统资源(独立模式) + +你可以通过在终端上运行这个命令,轻松启动 Glances 来监控你的本地机器: + +``` +glances +``` + +你可以立即观察到,它将很多不同的信息整合在一个屏幕上。我喜欢它在顶部显示电脑的公共和私人 IP: + +![][12] + +Glances 也是交互式的,这意味着你可以在它运行时使用命令与它互动。你可以按 `s` 将传感器显示在屏幕上;按 `k` 将 TCP 连接列表显示在屏幕上;按 `1` 将 CPU 统计扩展到显示单个线程。 + +你也可以使用方向键在进程列表中移动,并按不同的指标对表格进行排序。 + +你可以通过各种命令行选项来启动 Glances。此外,它还有很多交互式命令。你可以在他们的[丰富的文档][13]中找到完整的列表。 + +按 `Ctrl+C` 键退出 Glances。 + +### 使用 Glances 监控远程 Linux 系统(客户端-服务器模式) + +要监控远程计算机,你可以在客户端-服务器模式下使用 Glances。你需要在两个系统上都安装 Glances。 + +在远程 Linux 系统上,使用 `-s` 选项在服务器模式下启动 Glances: + +``` +glances -s +``` + +在客户端系统中,使用下面的命令在客户端模式下启动 Glances 并连接到服务器: + +``` +glances -c server_ip_address +``` + +你也可以通过 SSH 进入任何一台电脑,然后启动 Glances,它可以完美地工作。更多关于客户端-服务器模式的信息请看[这里][14]。 + +### 使用 Glances 在 Web 浏览器中监控 Linux 系统资源(Web 模式) + +Glances 也可以在 Web 模式下运行。这意味着你可以使用 Web 浏览器来访问 Glances。与之前的客户端-服务器模式不同,你不需要在客户端系统上安装 Glances。 + +要在 Web 模式下启动 Glances,请使用 `-w` 选项: + +``` +glances -w +``` + +请注意,即使在 Linux 服务器上,它也可能显示 “Glances Web User Interface started on http://0.0.0.0:61208”,而实际上它使用的是服务器的 IP 地址。 + +最主要的是它使用的是 61208 端口号,你可以用它来通过网络浏览器访问 Glances。只要在服务器的 IP 地址后面输入端口号,比如 。 + +你也可以在本地系统中使用 访问。 + +![][15] + +Web 模式也模仿终端的样子。网页版是根据响应式设计原则打造的,即使在手机上也很好看。 + +你可能想用密码来保护 Web 模式,这样只有授权的人才能使用它。默认的用户名是 `glances`。 + +``` +root@localhost:~# glances -w --password +Define the Glances webserver password (glances username): +Password (confirm): +Do you want to save the password? [Yes/No]: n +Glances Web User Interface started on http://0.0.0.0:61208/ +``` + +你可以在[快速入门指南][16]中找到关于配置密码的更多信息。 + +### 导出 Glances 数据到不同的服务 + +使用 Glances 最大的优势之一就是开箱即用,它支持将数据导出到各种数据库、服务,并无缝集成到各种数据管道中。 + +你可以在监控的同时用这个命令导出到 CSV: + +``` +glances --export csv --export-csv-file /tmp/glances.csv +``` + +`/tmp/glances.csv` 是文件的位置。数据以时间序列的形式整齐地填入。 + +![][17] + +你也可以导出到其它大型应用程序,如 [Prometheus][18],以启用条件触发器和通知。 + +它可以直接插入到消息服务(如 RabbitMQ、MQTT)、流媒体平台(如 Kafka),并将时间序列数据导出到数据库(如 InfluxDB),并使用 Grafana 进行可视化。 + +你可以在[这里][19]查看服务和导出选项的整个列表。 + +### 使用 REST API 将 Glances 与其他服务进行整合 + +这是整个栈中我最喜欢的功能。Glances 不仅可以将各种指标汇集在一起,还可以通过 API 将它们暴露出来。 + +这个简单而强大的功能使得为任何特定的用例构建自定义应用程序、服务和中间件应用程序变得非常容易。 + +当你在 Web 模式下启动 Glances 时,REST API 服务器会自动启动。要在 API 服务器模式下启动它,你可以使用以下命令: + +``` +glances -w --disable-webui +``` + +[REST API][20] 的文档很全面,其响应也很容易与 Web 应用集成。这使得使用类似 [Node-RED][21] 这样的工具可以很容易地构建一个统一的仪表盘来监控多个服务器。 + +![][22] + +Glances 也提供了一个 XML-RPC 服务器,你可以在[这里][23]查看文档。 + +### 关于 Glances 的结束语 + +Glances 使用 [psutil][24] Python 库来访问不同的系统统计数据。早在 2017 年,我就曾使用相同的库构建了一个简单的 API 服务器来检索 CPU 的使用情况。我能够使用 Node-RED 构建的仪表盘监控一个集群中的所有树莓派。 + +Glances 可以为我节省一些时间,同时提供更多的功能,可惜我当时并不知道它。 + +在写这篇文章的时候,我确实尝试着在我的树莓派上安装 Glances,可惜所有的安装方法都出现了一些错误,失败了。当我成功后,我会更新文章,或者可能再写一篇文章,介绍在树莓派上安装的步骤。 + +我希望 Glances 能提供一种顶替 `top` 或 `htop` 等的方法。让我们希望在即将到来的版本中得到它。 + +我希望这能给你提供大量关于 Glances 的信息。你们使用什么系统监控工具呢,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/glances/ + +作者:[Chinmay][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/chinmay/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/linux-system-monitoring-tools/ +[2]: https://hisham.hm/htop/ +[3]: https://itsfoss.com/monitor-cpu-gpu-temp-linux/ +[4]: https://github.com/lm-sensors/lm-sensors +[5]: https://nicolargo.github.io/glances/ +[6]: https://itsfoss.com/pywal/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/glances-linux.png?resize=800%2C510&ssl=1 +[8]: https://grafana.com/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/glances-data-in-grafana-dashboard.jpg?resize=800%2C472&ssl=1 +[10]: https://itsfoss.com/install-pip-ubuntu/ +[11]: https://github.com/nicolargo/glances/blob/master/README.rst#installation +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/Screenshot-from-2020-08-13-11-54-18.png?resize=800%2C503&ssl=1 +[13]: https://glances.readthedocs.io/en/latest/cmds.html +[14]: https://glances.readthedocs.io/en/latest/quickstart.html#central-client +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/Screenshot-from-2020-08-13-16-49-11.png?resize=800%2C471&ssl=1 +[16]: https://glances.readthedocs.io/en/stable/quickstart.html +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/Screenshot-from-2020-08-13-12-25-40.png?resize=800%2C448&ssl=1 +[18]: https://prometheus.io/ +[19]: https://glances.readthedocs.io/en/latest/gw/index.html +[20]: https://github.com/nicolargo/glances/wiki/The-Glances-RESTFULL-JSON-API +[21]: https://nodered.org/ +[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/Screenshot-from-2020-08-13-17-49-41.png?resize=800%2C468&ssl=1 +[23]: https://github.com/nicolargo/glances/wiki +[24]: https://pypi.org/project/psutil/ diff --git a/published/202009/20190105 Why Sorting is O(N log N).md b/published/202009/20190105 Why Sorting is O(N log N).md new file mode 100644 index 0000000000..36aadec5bb --- /dev/null +++ b/published/202009/20190105 Why Sorting is O(N log N).md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: (silentdawn-zz) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12594-1.html) +[#]: subject: (Why Sorting is O\(N log N\)) +[#]: via: (https://theartofmachinery.com/2019/01/05/sorting_is_nlogn.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) + +为什么排序的复杂度为 O(N log N) +====== + +基本上所有正而八经的算法教材都会解释像快速排序quicksort堆排序heapsort这样的排序算法有多快,但并不需要复杂的数学就能证明你可以逐渐趋近的速度有多快。 + +> 关于标记的一个严肃说明: +> +> 大多数计算机专业的科学家使用大写字母 O 标记来指代“趋近,直到到达一个常数比例因子”,这与数学专业所指代的意义是有所区别的。这里我使用的大 O 标记的含义与计算机教材所指相同,但至少不会和其他数学符号混用。 + +### 基于比较的排序 + +先来看个特例,即每次比较两个值大小的算法(快速排序、堆排序,及其它通用排序算法)。这种思想后续可以扩展至所有排序算法。 + +#### 一个简单的最差情况下的计数角度 + +假设有 4 个互不相等的数,且顺序随机,那么,可以通过只比较一对数字完成排序吗?显然不能,证明如下:根据定义,要对该数组排序,需要按照某种顺序重新排列数字。换句话说,你需要知道用哪种排列方式?有多少种可能的排列?第一个数字可以放在四个位置中的任意一个,第二个数字可以放在剩下三个位置中的任意一个,第三个数字可以放在剩下两个位置中的任意一个,最后一个数字只有剩下的一个位置可选。这样,共有 $4×3×2×1 = 4! = 24$ 种排列可供选择。通过一次比较大小,只能产生两种可能的结果。如果列出所有的排列,那么“从小到大”排序对应的可能是第 8 种排列,按“从大到小”排序对应的可能是第 24 种排列,但无法知道什么时候需要的是其它 22 种排列。 + +通过 2 次比较,可以得到 2×2=4 种可能的结果,这仍然不够。只要比较的次数少于 5(对应 $2^{5} = 32$ 种输出),就无法完成 4 个随机次序的数字的排序。如果 $W(N)$ 是最差情况下对 $N$ 个不同元素进行排序所需要的比较次数,那么, + +$$ +2^{W(N)} \geq N! +$$ + +两边取以 2 为底的对数,得: + +$$ +W(N) \geq \log_{2}{N!} +$$ + +$N!$ 的增长近似于 $N^{N}$ (参阅 [Stirling 公式][1]),那么, + +$$ +W(N) \succeq \log N^{N} = N\log N +$$ + +这就是最差情况下从输出计数的角度得出的 $O(N\log N)$ 上限。 + +#### 从信息论角度的平均状态的例子 + +使用一些信息论知识,就可以从上面的讨论中得到一个更有力的结论。下面,使用排序算法作为信息传输的编码器: + + 1. 任取一个数,比如 15 + 2. 从 4 个数字的排列列表中查找第 15 种排列 + 3. 对这种排列运行排序算法,记录所有的“大”、“小”比较结果 + 4. 用二进制编码发送比较结果 + 5. 接收端重新逐步执行发送端的排序算法,需要的话可以引用发送端的比较结果 + 6. 现在接收端就可以知道发送端如何重新排列数字以按照需要排序,接收端可以对排列进行逆算,得到 4 个数字的初始顺序 + 7. 接收端在排列表中检索发送端的原始排列,指出发送端发送的是 15 + +确实,这有点奇怪,但确实可以。这意味着排序算法遵循着与编码方案相同的定律,包括理论所证明的不存在通用的数据压缩算法。算法中每次比较发送 1 比特的比较结果编码数据,根据信息论,比较的次数至少是能表示所有数据的二进制位数。更技术语言点,[平均所需的最小比较次数是输入数据的香农熵,以比特为单位][2]。熵是衡量信息等不可预测量的数学度量。 + +包含 $N$ 个元素的数组,元素次序随机且无偏时的熵最大,其值为 $\log_{2}{N!}$ 个比特。这证明 $O(N\log N)$ 是一个基于比较的对任意输入排序的最优平均值。 + +以上都是理论说法,那么实际的排序算法如何做比较的呢?下面是一个数组排序所需比较次数均值的图。我比较的是理论值与快速排序及 [Ford-Johnson 合并插入排序][3] 的表现。后者设计目的就是最小化比较次数(整体上没比快速排序快多少,因为生活中相对于最大限度减少比较次数,还有更重要的事情)。又因为合并插入排序merge-insertion sort是在 1959 年提出的,它一直在调整,以减少了一些比较次数,但图示说明,它基本上达到了最优状态。 + +![随机排列 100 个元素所需的平均排序次数图。最下面的线是理论值,约 1% 处的是合并插入算法,原始 quicksort 大约在 25% 处。][4] + +一点点理论导出这么实用的结论,这感觉真棒! + +#### 小结 + +证明了: + + 1. 如果数组可以是任意顺序,在最坏情况下至少需要 $O(N\log N)$ 次比较。 + 2. 数组的平均比较次数最少是数组的熵,对随机输入而言,其值是 $O(N\log N)$ 。 + +注意,第 2 个结论允许基于比较的算法优于 $O(N\log N)$,前提是输入是低熵的(换言之,是部分可预测的)。如果输入包含很多有序的子序列,那么合并排序的性能接近 $O(N)$。如果在确定一个位之前,其输入是有序的,插入排序性能接近 $O(N)$。在最差情况下,以上算法的性能表现都不超出 $O(N\log N)$。 + +### 一般排序算法 + +基于比较的排序在实践中是个有趣的特例,但从理论上讲,计算机的 [CMP][5] 指令与其它指令相比,并没有什么特别之处。在下面两条的基础上,前面两种情形都可以扩展至任意排序算法: + + 1. 大多数计算机指令有多于两个的输出,但输出的数量仍然是有限的。 + 2. 一条指令有限的输出意味着一条指令只能处理有限的熵。 + +这给出了 $O(N\log N)$ 对应的指令下限。任何物理上可实现的计算机都只能在给定时间内执行有限数量的指令,所以算法的执行时间也有对应 $O(N\log N)$ 的下限。 + +#### 什么是更快的算法? + +一般意义上的 $O(N\log N)$ 下限,放在实践中来看,如果听人说到任何更快的算法,你要知道,它肯定以某种方式“作弊”了,其中肯定有圈套,即它不是一个可以处理任意大数组的通用排序算法。可能它是一个有用的算法,但最好看明白它字里行间隐含的东西。 + +一个广为人知的例子是基数排序radix sort算法,它经常被称为 $O(N)$ 排序算法,但它只能处理所有数字都能放入 $k$ 比特的情况,所以实际上它的性能是 $O({kN})$。 + +什么意思呢?假如你用的 8 位计算机,那么 8 个二进制位可以表示 $2^{8} = 256$ 个不同的数字,如果数组有上千个数字,那么其中必有重复。对有些应用而言这是可以的,但对有些应用就必须用 16 个二进制位来表示,16 个二进制位可以表示 $2^{16} = 65,536$ 个不同的数字。32 个二进制位可以表示 $2^{32} = 4,294,967,296$ 不同的数字。随着数组长度的增长,所需要的二进制位数也在增长。要表示 $N$ 个不同的数字,需要 $k \geq \log_{2}N$ 个二进制位。所以,只有允许数组中存在重复的数字时,$O({kN})$ 才优于 $O(N\log N)$。 + +一般意义上输入数据的 $O(N\log N)$ 的性能已经说明了全部问题。这个讨论不那么有趣因为很少需要在 32 位计算机上对几十亿整数进行排序,[如果有谁的需求超出了 64 位计算机的极限,他一定没有告诉别人][6]。 + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2019/01/05/sorting_is_nlogn.html + +作者:[Simon Arneaud][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://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: http://hyperphysics.phy-astr.gsu.edu/hbase/Math/stirling.html +[2]: https://en.wikipedia.org/wiki/Shannon%27s_source_coding_theorem +[3]: https://en.wikipedia.org/wiki/Merge-insertion_sort +[4]: https://theartofmachinery.com/images/sorting_is_nlogn/sorting_algorithms_num_comparisons.svg +[5]: https://c9x.me/x86/html/file_module_x86_id_35.html +[6]: https://sortbenchmark.org/ diff --git a/published/202009/20190226 Reducing security risks with centralized logging.md b/published/202009/20190226 Reducing security risks with centralized logging.md new file mode 100644 index 0000000000..030f7450ed --- /dev/null +++ b/published/202009/20190226 Reducing security risks with centralized logging.md @@ -0,0 +1,81 @@ +[#]: collector: (lujun9972) +[#]: translator: (leommxj) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12591-1.html) +[#]: subject: (Reducing security risks with centralized logging) +[#]: via: (https://opensource.com/article/19/2/reducing-security-risks-centralized-logging) +[#]: author: (Hannah Suarez https://opensource.com/users/hcs) + +通过集中日志记录来减少安全风险 +====== + +> 集中日志并结构化待处理的日志数据可缓解与缺少日志相关的风险 + +![](https://img.linux.net.cn/data/attachment/album/202009/07/231016a8v8gva9gmc5hgv9.jpg) + +日志记录和日志分析对于保护基础设施安全来说至关重要,尤其是当我们考虑到通用漏洞的时候。这篇文章基于我在 FOSDEM'19 上的闪电秀《[Let's use centralized log collection to make incident response teams happy][1]》,目的是提高大家对日志匮乏这种安全问题的重视,提供一种避免风险的方法,并且倡议更多的安全实践(利益声明: 我为 NXLog 工作)。 + +### 为什么要收集日志?为什么要集中日志记录? + +确切的说,日志是写入磁盘的仅追加的记录序列。在实际生活中,日志可以在你尝试寻找异常的根源时帮助你调查基础设施的问题。当你有多个使用自己的标准与格式的日志的异构系统,并且想用一种可靠的方法来接收和处理它们的时候,挑战就来临了。这通常以元数据为代价的。集中日志记录解决方案需要共性,这种共性常常会去除许多开源日志记录工具所提供的丰富的元数据。 + +### 日志记录与监控匮乏的安全风险 + +开源 Web 应用程序安全项目Open Web Application Security Project([OWASP][2])是一个为业界贡献了许多杰出项目(包括许多专注于软件安全的[工具][3])的非营利组织。OWASP 定期为应用开发人员和维护者报告最危险的安全挑战。在最新一版《[10 项最严重的 Web 应用程序安全风险][4]》中,OWASP 将日志记录和监控匮乏加入了列表中。OWASP 警告下列情况会导致日志记录、检测、监控和主动响应的匮乏: + + * 未记录重要的可审计性事件,如:登录、登录失败和高额交易。 + * 告警和错误事件未能产生、产生不足或不清晰的日志信息。 + * 日志信息仅在本地存储。 + * 对于实时或准实时的主动攻击,应用程序无法检测、处理和告警。 + +可以通过集中日志记录(例如,不仅将日志本地存储)和结构化日志数据以进一步分析来缓解上述情形(例如,在告警仪表盘和安全套件中)。 + +举例来说, 假设一个 DNS 查询会导向名为 hacked.badsite.net 的恶意网站。通过 DNS 监控,管理员监控并且主动的分析 DNS 请求与响应。DNS 监控的效果依赖于充足的日志记录与收集来发现潜在问题,同样也依赖于结构化 DNS 日志的结果来进一步分析。 + +``` +2019-01-29 +Time (GMT)      Source                  Destination             Protocol-Info +12:42:42.112898 SOURCE_IP               xxx.xx.xx.x             DNS     Standard query 0x1de7  A hacked.badsite.net +``` + +你可以在 [NXLog 社区版][5] 中自己尝试一下这个例子,也可以尝试其他例子和代码片段。 (再次声明:我为 NXLog 工作) + +### 重要的一点:非结构化数据与结构化数据 + +花费一点时间来考虑下日志数据格式是很重要的。例如,让我们来考虑以下日志消息: + +``` +debug1: Failed password for invalid user amy from SOURCE_IP port SOURCE_PORT ssh2 +``` + +这段日志包含了一个预定义的结构,例如冒号前面的元数据关键词(`debug1`)然而,余下的日志字段是一个未结构化的字符串(`Failed password for invalid user amy from SOURCE_IP port SOURCE_PORT ssh2`)。因此,即便这个消息是人类可轻松阅读的格式,但它不是一个计算机容易解析的格式。 + +非结构化的事件数据存在局限性,包括难以解析、搜索和分析日志。重要的元数据通常以一种自由字符串的形式作为非结构化数据字段,就像上面的例子一样。日志管理员会在他们尝试标准化/归一化日志数据与集中日志源的过程中遇到这个问题。 + +### 接下来怎么做 + +除了集中和结构化日志之外,确保你收集了正确的日志数据——Sysmon、PowerShell、Windows 事件日志、DNS 调试日志、ETW、内核监控、文件完整性监控、数据库日志、外部云日志等等。同样也要选用适当的工具和流程来来收集、汇总和帮助理解数据。 + +希望这对你从不同日志源中集中日志收集提供了一个起点:将日志发送到仪表盘、监控软件、分析软件以及像安全性资讯与事件管理(SIEM)套件等外部源。 + +你的集中日志策略会是怎么样?请在评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/2/reducing-security-risks-centralized-logging + +作者:[Hannah Suarez][a] +选题:[lujun9972][b] +译者:[leommxj](https://github.com/leommxj) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hcs +[b]: https://github.com/lujun9972 +[1]: https://fosdem.org/2019/schedule/event/lets_use_centralized_log_collection_to_make_incident_response_teams_happy/ +[2]: https://www.owasp.org/index.php/Main_Page +[3]: https://github.com/OWASP +[4]: https://www.owasp.org/index.php/Top_10-2017_Top_10 +[5]: https://nxlog.co/products/nxlog-community-edition/download diff --git a/published/202009/20190501 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-1.md b/published/202009/20190501 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-1.md new file mode 100644 index 0000000000..94bf12cab7 --- /dev/null +++ b/published/202009/20190501 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-1.md @@ -0,0 +1,239 @@ +[#]: collector: "lujun9972" +[#]: translator: "jlztan" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12634-1.html" +[#]: subject: "Monitor and Manage Docker Containers with Portainer.io (GUI tool) – Part-1" +[#]: via: "https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-part1/" +[#]: author: "Shashidhar Soppin https://www.linuxtechi.com/author/shashidhar/" + +用 Portainer.io 来监控和管理 Docker 容器(1) +====== + +![](https://img.linux.net.cn/data/attachment/album/202009/20/225425zaepvexqvg7nndqv.jpg) + +随着 Docker 的使用量越来越大,监控 Docker 容器正在变得更有挑战性。每天都有大量的 Docker 容器被创建,因此如何监控它们就变得非常重要。目前已经有一些内置的工具和技术,不过对它们进行配置有一些复杂。随着基于微服务的架构正在变成接下来事实上的标准,学会这种技术将为你的知识库再添一项新技能。 + +基于上述场景,对一种轻量、健壮的镜像管理工具的需求日益增加。Portainer.io 解决了这个问题。 Portainer.io(最新版本是 1.20.2)非常轻量,只需 2-3 个命令就可以配置好,已经在 Docker 用户中流行起来。 + +比起其他工具,这个工具有很多优势,其中一些如下所示: + + * 轻量(安装此工具仅需 2 到 3 个命令,与此同时安装镜像的大小在 26 M 到 30 M 之间) + * 健壮且易用 + * 可用于 Docker 监控和构建 + * 提供对 Docker 环境的详细概况 + * 可以管理容器、镜像、网络和卷 + * Portainer 部署方便,仅需一个 Docker 命令(可以在任意地方运行) + * 可以对完整的 Docker 容器环境进行监控 + +Portainer 同时具有以下服务: + +- 社区支持 +- 企业支持 +- 与合作伙伴 OEM 服务一起的专业服务 + +Portainer 的功能和特性如下: + + 1. 配备了漂亮的仪表盘,易于使用和监控 + 2. 自带大量内置模板,便于操作和创建 + 3. 服务支持(仅 OEM 和企业用户) + 4. 对容器、镜像、网络、卷以及配置进行几乎实时的监控 + 5. 包含 Docker 集群监控功能 + 6. 功能多样的用户管理 + +另请阅读:[如何在 Ubuntu 16.04 / 18.04 LTS 版本中安装 Docker CE][1] + +### 如何在 Ubuntu Linux / RHEL / CentOS 系统上安装和配置 Portainer.io + +注意:下面的安装过程是在 Ubuntu 18.04 上完成的,但是对 RHEL 和 CentOS 同样适用,同时假设你已经在系统上安装了 Docker CE。 + +``` +root@linuxtechi:~$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 18.04 LTS +Release: 18.04 +Codename: bionic +root@linuxtechi:~$ +``` + +为 Portainer 创建卷: + +``` +root@linuxtechi:~$ sudo docker volume create portainer_data +portainer_data +root@linuxtechi:~$ +``` + +使用下面的 Docker 命令来运行 Portainer 容器: + +``` +root@linuxtechi:~$ sudo docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer +Unable to find image 'portainer/portainer:latest' locally +latest: Pulling from portainer/portainer +d1e017099d17: Pull complete +0b1e707a06d2: Pull complete +Digest: sha256:d6cc2c20c0af38d8d557ab994c419c799a10fe825e4aa57fea2e2e507a13747d +Status: Downloaded newer image for portainer/portainer:latest +35286de9f2e21d197309575bb52b5599fec24d4f373cc27210d98abc60244107 +root@linuxtechi:~$ +``` + +安装完成之后,通过主机或 Docker 的 IP 加上 Docker 引擎使用的 9000 端口在浏览器中打开 Portainer。 + +注意:如果 Docker 所在主机的系统防火墙开启,需要确保 9000 端口被放行,否则浏览器页面将无法打开。 + +在我这边,我的 Docker 主机/引擎的 IP 是 `192.168.1.16`,所以 URL 就是 `http://192.168.1.16:9000` + +![Portainer-Login-User-Name-Password][2] + +在创建管理员用户时,请确保密码是 8 个字符,同时用户名为 `admin`,然后点击 “Create User”。 + +接下来进入如下所示的页面,选中 “Local” 矩形框。 + +![Connect-Portainer-Local-Docker][4] + +点击 “Connect”, + +可以看到 admin 用户的漂亮首页如下所示, + +![Portainer-io-Docker-Monitor-Dashboard][6] + +现在 Portainer 已经准备好运行和管理你的 Docker 容器了,同时也可用于容器监控。 + +### 在 Portainer 中管理容器镜像 + +![Portainer-Endpoints][8] + +检查当前的状态,可以看到有两个容器已经在运行了,如果你创建另一个也会立即显示出来。 + +像下面这样,在命令行中启动一个或两个容器, + +``` +root@linuxtechi:~$ sudo docker run --name test -it debian +Unable to find image 'debian:latest' locally +latest: Pulling from library/debian +e79bb959ec00: Pull complete +Digest: sha256:724b0fbbda7fda6372ffed586670573c59e07a48c86d606bab05db118abe0ef5 +Status: Downloaded newer image for debian:latest +root@linuxtechi:/# +``` + +然后在 Portainer 页面中点击刷新按钮(会出现一条让你确认的消息,点击上面的 “Continue”),就可以像下面高亮显示的一样看到 3 个容器了。 + +![Portainer-io-new-container-image][10] + +点击上图中红圈圈出来的 “containers”,下一个页面会显示 “Dashboard Endpoint summary”。 + +![Portainer-io-Docker-Container-Dash][12] + +在这个页面中,点击上图高亮和红圈圈出来的 “Containers”,就可以对容器进行监控了。 + +### 以简单的方式对容器进行监控 + +继续上面的步骤,就会出现一个如下所示精致、漂亮的 “Container list” 页面。 + +![Portainer-Container-List][14] + +所有的容器都可以在这里进行控制(停止、启动等等)。 + +1、在这个页面上,停止我们之前启动的 “test” 容器(这是一个我们早先启动的 debian 容器)。 + +选中此容器前面的复选框,然后点击上面的“Stop”按钮来停止。 + +![Stop-Container-Portainer-io-dashboard][16] + +在命令行中,你也会看到这个容器现在已经停止或退出了: + +``` +root@linuxtechi:~$ sudo docker container ls -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +d45902e717c0 debian "bash" 21 minutes ago Exited (0) 49 seconds ago test +08b96eddbae9 centos:7 "/bin/bash" About an hour ago Exited (137) 9 minutes ago mycontainer2 +35286de9f2e2 portainer/portainer "/portainer" 2 hours ago Up About an hour 0.0.0.0:9000->9000/tcp compassionate_benz +root@linuxtechi:~$ +``` + +2、现在,在 Portainer 页面中启动已经停止的两个容器(test 和 mycontainer2) + +选中已停止的这两个容器前面的复选框,然后点击 “Start”。 + +![Start-Containers-Portainer-GUI][18] + +你会立即看到两条窗口提醒,内容是“容器成功启动”,并且两个容器的状态变为正在运行。 + +![Conatiner-Started-successfully-Portainer-GUI][20] + +### 一步步探索其他多种选项和特性 + +1、点击高亮的“Images”,你会看到如下页面: + +![Docker-Container-Images-Portainer-GUI][22] + +这是可用的容器列表,其中一些可能没在运行。这些容器可以被导入、导出或者上传到不同的位置,截图如下所示。 + +![Upload-Docker-Container-Image-Portainer-GUI][24] + +2、点击高亮的“Volumes”,显示如下页面: + +![Volume-list-Portainer-io-gui][26] + +3、通过下面的操作,可以很容易的添加卷。点击添加卷按钮,出现如下页面,在名称输入框中输入卷名称,例如 “myvol”,然后点击 “Create the volume” 按钮: + +![Volume-Creation-Portainer-io-gui][28] + +新创建的卷如下所示(状态为未使用): + +![Volume-unused-Portainer-io-gui][30] + +### 结论 + +通过上面的安装步骤,你可以到配置和使用 Portainer.io 的多种选项是多么简单和精美,它提供了用于构建和监控 Docker 容器的多种功能和选项。如前所述,这个一个非常轻量的工具,因此不会给主机系统增加任何负担。下一组选项将在本系列的第 2 部分中进行探讨。 + +另请阅读: [用 Portainer.io 来监控和管理 Docker 容器(2)][32] + +-------------------------------------------------------------------------------- + +via: https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-part1/ + +作者:[Shashidhar Soppin][a] +选题:[lujun9972][b] +译者:[jlztan](https://github.com/jlztan) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linuxtechi.com/author/shashidhar/ +[b]: https://github.com/lujun9972 +[1]: https://www.linuxtechi.com/how-to-setup-docker-on-ubuntu-server-16-04/ +[2]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Login-User-Name-Password-1024x681.jpg +[3]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Login-User-Name-Password.jpg +[4]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Connect-Portainer-Local-Docker-1024x538.jpg +[5]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Connect-Portainer-Local-Docker.jpg +[6]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-Docker-Monitor-Dashboard-1024x544.jpg +[7]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-Docker-Monitor-Dashboard.jpg +[8]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Endpoints-1024x252.jpg +[9]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Endpoints.jpg +[10]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-new-container-image-1024x544.jpg +[11]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-new-container-image.jpg +[12]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-Docker-Container-Dash-1024x544.jpg +[13]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-Docker-Container-Dash.jpg +[14]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Container-List-1024x538.jpg +[15]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Container-List.jpg +[16]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Stop-Container-Portainer-io-dashboard-1024x447.jpg +[17]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Stop-Container-Portainer-io-dashboard.jpg +[18]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Start-Containers-Portainer-GUI-1024x449.jpg +[19]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Start-Containers-Portainer-GUI.jpg +[20]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Conatiner-Started-successfully-Portainer-GUI-1024x538.jpg +[21]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Conatiner-Started-successfully-Portainer-GUI.jpg +[22]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker-Container-Images-Portainer-GUI-1024x544.jpg +[23]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker-Container-Images-Portainer-GUI.jpg +[24]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Upload-Docker-Container-Image-Portainer-GUI-1024x544.jpg +[25]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Upload-Docker-Container-Image-Portainer-GUI.jpg +[26]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-list-Portainer-io-gui-1024x544.jpg +[27]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-list-Portainer-io-gui.jpg +[28]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-Creation-Portainer-io-gui-1024x544.jpg +[29]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-Creation-Portainer-io-gui.jpg +[30]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-unused-Portainer-io-gui-1024x544.jpg +[31]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-unused-Portainer-io-gui.jpg +[32]: https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/ diff --git a/published/202009/20191031 Advance your awk skills with two easy tutorials.md b/published/202009/20191031 Advance your awk skills with two easy tutorials.md new file mode 100644 index 0000000000..4fa911cfd9 --- /dev/null +++ b/published/202009/20191031 Advance your awk skills with two easy tutorials.md @@ -0,0 +1,271 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12658-1.html) +[#]: subject: (Advance your awk skills with two easy tutorials) +[#]: via: (https://opensource.com/article/19/10/advanced-awk) +[#]: author: (Dave Neary https://opensource.com/users/dneary) + +通过两个简单的教程来提高你的 awk 技能 +====== + +> 超越单行的 awk 脚本,学习如何做邮件合并和字数统计。 + +![](https://img.linux.net.cn/data/attachment/album/202009/28/154624jk8w4ez6oujbur8j.jpg) + +`awk` 是 Unix 和 Linux 用户工具箱中最古老的工具之一。`awk` 由 Alfred Aho、Peter Weinberger 和 Brian Kernighan(即工具名称中的 A、W 和 K)在 20 世纪 70 年代创建,用于复杂的文本流处理。它是流编辑器 `sed` 的配套工具,后者是为逐行处理文本文件而设计的。`awk` 支持更复杂的结构化程序,是一门完整的编程语言。 + +本文将介绍如何使用 `awk` 完成更多结构化的复杂任务,包括一个简单的邮件合并程序。 + +### awk 的程序结构 + +`awk` 脚本是由 `{}`(大括号)包围的功能块组成,其中有两个特殊的功能块,`BEGIN` 和 `END`,它们在处理第一行输入流之前和最后一行处理之后执行。在这两者之间,块的格式为: + +``` +模式 { 动作语句 } +``` + +当输入缓冲区中的行与模式匹配时,每个块都会执行。如果没有包含模式,则函数块在输入流的每一行都会执行。 + +另外,以下语法可以用于在 `awk` 中定义可以从任何块中调用的函数。 + +``` +function 函数名(参数列表) { 语句 } +``` + +这种模式匹配块和函数的组合允许开发者结构化的 `awk` 程序,以便重用和提高可读性。 + +### awk 如何处理文本流 + +`awk` 每次从输入文件或流中一行一行地读取文本,并使用字段分隔符将其解析成若干字段。在 `awk` 的术语中,当前的缓冲区是一个*记录*。有一些特殊的变量会影响 `awk` 读取和处理文件的方式: + + * `FS`(字段分隔符field separator)。默认情况下,这是任何空格字符(空格或制表符)。 + * `RS`(记录分隔符record separator)。默认情况下是一个新行(`n`)。 + * `NF`(字段数number of fields)。当 `awk` 解析一行时,这个变量被设置为被解析出字段数。 + * `$0:` 当前记录。 + * `$1`、`$2`、`$3` 等:当前记录的第一、第二、第三等字段。 + * `NR`(记录数number of records)。迄今已被 `awk` 脚本解析的记录数。 + +影响 `awk` 行为的变量还有很多,但知道这些已经足够开始了。 + +### 单行 awk 脚本 + +对于一个如此强大的工具来说,有趣的是,`awk` 的大部分用法都是基本的单行脚本。也许最常见的 `awk` 程序是打印 CSV 文件、日志文件等输入行中的选定字段。例如,下面的单行脚本从 `/etc/passwd` 中打印出一个用户名列表: + +``` +awk -F":" '{print $1 }' /etc/passwd +``` + +如上所述,`$1` 是当前记录中的第一个字段。`-F` 选项将 `FS` 变量设置为字符 `:`。 + +字段分隔符也可以在 `BEGIN` 函数块中设置: + +``` +awk 'BEGIN { FS=":" } {print $1 }' /etc/passwd +``` + +在下面的例子中,每一个 shell 不是 `/sbin/nologin` 的用户都可以通过在该块前面加上匹配模式来打印出来: + +``` +awk 'BEGIN { FS=":" } ! /\/sbin\/nologin/ {print $1 }' /etc/passwd +``` + +### awk 进阶:邮件合并 + +现在你已经掌握了一些基础知识,尝试用一个更具有结构化的例子来深入了解 `awk`:创建邮件合并。 + +邮件合并使用两个文件,其中一个文件(在本例中称为 `email_template.txt`)包含了你要发送的电子邮件的模板: + +``` +From: Program committee +To: {firstname} {lastname} <{email}> +Subject: Your presentation proposal + +Dear {firstname}, + +Thank you for your presentation proposal: + {title} + +We are pleased to inform you that your proposal has been successful! We +will contact you shortly with further information about the event +schedule. + +Thank you, +The Program Committee +``` + +而另一个则是一个 CSV 文件(名为 `proposals.csv`),里面有你要发送邮件的人: + +``` +firstname,lastname,email,title +Harry,Potter,hpotter@hogwarts.edu,"Defeating your nemesis in 3 easy steps" +Jack,Reacher,reacher@covert.mil,"Hand-to-hand combat for beginners" +Mickey,Mouse,mmouse@disney.com,"Surviving public speaking with a squeaky voice" +Santa,Claus,sclaus@northpole.org,"Efficient list-making" +``` + +你要读取 CSV 文件,替换第一个文件中的相关字段(跳过第一行),然后把结果写到一个叫 `acceptanceN.txt` 的文件中,每解析一行就递增文件名中的 `N`。 + +把 `awk` 程序写在一个叫 `mail_merge.awk` 的文件中。在 `awk` 脚本中的语句用 `;` 分隔。第一个任务是设置字段分隔符变量和其他几个脚本需要的变量。你还需要读取并丢弃 CSV 中的第一行,否则会创建一个以 `Dear firstname` 开头的文件。要做到这一点,请使用特殊函数 `getline`,并在读取后将记录计数器重置为 0。 + +``` +BEGIN { +  FS=","; +  template="email_template.txt"; +  output="acceptance"; +  getline; +  NR=0; +} +``` + +主要功能非常简单:每处理一行,就为各种字段设置一个变量 —— `firstname`、`lastname`、`email` 和 `title`。模板文件被逐行读取,并使用函数 `sub` 将任何出现的特殊字符序列替换为相关变量的值。然后将该行以及所做的任何替换输出到输出文件中。 + +由于每行都要处理模板文件和不同的输出文件,所以在处理下一条记录之前,需要清理和关闭这些文件的文件句柄。 + +``` +{ +        # 从输入文件中读取关联字段 +        firstname=$1; +        lastname=$2; +        email=$3; +        title=$4; + +        # 设置输出文件名 +        outfile=(output NR ".txt"); + +        # 从模板中读取一行,替换特定字段, +        # 并打印结果到输出文件。 +        while ( (getline ln < template) > 0 ) +        { +                sub(/{firstname}/,firstname,ln); +                sub(/{lastname}/,lastname,ln); +                sub(/{email}/,email,ln); +                sub(/{title}/,title,ln); +                print(ln) > outfile; +        } + +        # 关闭模板和输出文件,继续下一条记录 +        close(outfile); +        close(template); +} +``` + +你已经完成了! 在命令行上运行该脚本: + +``` +awk -f mail_merge.awk proposals.csv +``` + +或 + +``` +awk -f mail_merge.awk < proposals.csv +``` + +你会在当前目录下发现生成的文本文件。 + +### awk 进阶:字频计数 + +`awk` 中最强大的功能之一是关联数组,在大多数编程语言中,数组条目通常由数字索引,但在 `awk` 中,数组由一个键字符串进行引用。你可以从上一节的文件 `proposals.txt` 中存储一个条目。例如,在一个单一的关联数组中,像这样: + +``` +        proposer["firstname"]=$1; +        proposer["lastname"]=$2; +        proposer["email"]=$3; +        proposer["title"]=$4; +``` + +这使得文本处理变得非常容易。一个使用了这个概念的简单的程序就是词频计数器。你可以解析一个文件,在每一行中分解出单词(忽略标点符号),对行中的每个单词进行递增计数器,然后输出文本中出现的前 20 个单词。 + +首先,在一个名为 `wordcount.awk` 的文件中,将字段分隔符设置为包含空格和标点符号的正则表达式: + +``` +BEGIN { + # ignore 1 or more consecutive occurrences of the characters + # in the character group below + FS="[ .,:;()<>{}@!\"'\t]+"; +} +``` + +接下来,主循环函数将遍历每个字段,忽略任何空字段(如果行末有标点符号,则会出现这种情况),并递增行中单词数: + +``` +{ +        for (i = 1; i <= NF; i++) { +                if ($i != "") { +                        words[$i]++; +                } +        } +} +``` + +最后,处理完文本后,使用 `END` 函数打印数组的内容,然后利用 `awk` 的能力,将输出的内容用管道输入 shell 命令,进行数字排序,并打印出 20 个最常出现的单词。 + +``` +END { +        sort_head = "sort -k2 -nr | head -n 20"; +        for (word in words) { +                printf "%s\t%d\n", word, words[word] | sort_head; +        } +        close (sort_head); +} +``` + +在这篇文章的早期草稿上运行这个脚本,会产生这样的输出: + +``` +[dneary@dhcp-49-32.bos.redhat.com]$ awk -f wordcount.awk < awk_article.txt +the 79 +awk 41 +a 39 +and 33 +of 32 +in 27 +to 26 +is 25 +line 23 +for 23 +will 22 +file 21 +we 16 +We 15 +with 12 +which 12 +by 12 +this 11 +output 11 +function 11 +``` + +### 下一步是什么? + +如果你想了解更多关于 `awk` 编程的知识,我强烈推荐 Dale Dougherty 和 Arnold Robbins 所著的《[Sed 和 awk][8]》这本书。 + +`awk` 编程进阶的关键之一是掌握“扩展正则表达式”。`awk` 为你可能已经熟悉的 sed [正则表达式][9]语法提供了几个强大的补充。 + +另一个学习 `awk` 的好资源是 [GNU awk 用户指南][10]。它有一个完整的 `awk` 内置函数库的参考资料,以及很多简单和复杂的 `awk` 脚本的例子。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/10/advanced-awk + +作者:[Dave Neary][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/dneary +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_hands_team_collaboration.png?itok=u82QepPk (a checklist for a team) +[2]: mailto:pc@event.org +[3]: mailto:hpotter@hogwarts.edu +[4]: mailto:reacher@covert.mil +[5]: mailto:mmouse@disney.com +[6]: mailto:sclaus@northpole.org +[7]: mailto:dneary@dhcp-49-32.bos.redhat.com +[8]: https://www.amazon.com/sed-awk-Dale-Dougherty/dp/1565922255/book +[9]: https://en.wikibooks.org/wiki/Regular_Expressions/POSIX-Extended_Regular_Expressions +[10]: https://www.gnu.org/software/gawk/manual/gawk.html diff --git a/published/202009/20200118 3 Methods to Install the Latest PHP 7 Package on CentOS-RHEL 7 and CentOS-RHEL 6.md b/published/202009/20200118 3 Methods to Install the Latest PHP 7 Package on CentOS-RHEL 7 and CentOS-RHEL 6.md new file mode 100644 index 0000000000..c1525f1969 --- /dev/null +++ b/published/202009/20200118 3 Methods to Install the Latest PHP 7 Package on CentOS-RHEL 7 and CentOS-RHEL 6.md @@ -0,0 +1,221 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12615-1.html) +[#]: subject: (3 Methods to Install the Latest PHP 7 Package on CentOS/RHEL 7 and CentOS/RHEL 6) +[#]: via: (https://www.2daygeek.com/install-php-7-on-centos-6-centos-7-rhel-7-redhat-7/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +在 CentOS/RHEL 7/6 上安装最新 PHP 7 软件包的 3 种方法 +====== + +![](https://img.linux.net.cn/data/attachment/album/202009/14/235431i92iqjj2we0vegyj.jpg) + +PHP 是最流行的开源通用脚本语言,被广泛用于 Web 开发。它是 LAMP 栈应用程序套件的一部分,用于创建动态网站。流行的 CMS 应用程序 WordPress,Joomla 和 Drupal 都是用 PHP 语言开发的。这些应用程序的安装和配置都需要 PHP 7。PHP 7 可以更快地加载你的 Web 应用程序,并消耗更少的服务器资源。 + +在默认情况下,CentOS/RHEL 6 操作系统在其官方存储库中提供 PHP 5.3,而 CentOS/RHEL 7 则提供 PHP 5.4。 + +在本文中,我们将向你展示如何在 CentOS/RHEL 7 和 CentOS/RHEL 6 系统上安装最新版本的 PHP。 + +这可以通过在系统中添加必要的 [附加第三方 RPM 存储库][1] 来完成。 + +### 方法-1:如何使用软件集合存储库(SCL)在 CentOS 6/7 上安装 PHP 7 + +现在,SCL 存储库由 CentOS SIG 维护,该组织不仅重新构建了 Red Hat Software Collections,还提供了自己的一些其他软件包。 + +它包含各种程序的较新版本,这些程序可以与现有的旧软件包一起安装,并可以使用 `scl` 命令调用。 + +要想在 CentOS 上安装软件集合存储库(SCL),请运行以下 [yum 命令][2]: + +``` +# yum install centos-release-scl +``` + +运行以下命令可以验证 SCL 存储库中可用的 PHP 7 版本: + +``` +# yum --disablerepo="*" --enablerepo="centos-sclo-rh" list *php + +Loaded plugins: fastestmirror, langpacks +Loading mirror speeds from cached hostfile +centos-sclo-rh: centos.mirrors.estointernet.in +Available Packages +php54-php.x86_64 5.4.40-4.el7 centos-sclo-rh +php55-php.x86_64 5.5.21-5.el7 centos-sclo-rh +rh-php70-php.x86_64 7.0.27-2.el7 centos-sclo-rh +rh-php71-php.x86_64 7.1.30-2.el7 centos-sclo-rh +rh-php72-php.x86_64 7.2.24-1.el7 centos-sclo-rh +``` + +运行以下命令可以从 SCL 中安装 PHP 7.2 到你的系统中: + +``` +# yum --disablerepo="*" --enablerepo="centos-sclo-rh" install rh-php72-php +``` + +如果需要为 PHP 7.2 安装其他模块,则可以通过运行以下命令格式来安装它们。 例如,你可以通过执行以下命令来安装 `gd` 和 `pdo` 软件包: + +``` +# yum --disablerepo="*" --enablerepo="centos-sclo-rh" install rh-php72-php-gd rh-php72-php-pdo +``` + +### 方法-1a:如何使用软件集合存储库(SCL)在 RHEL 7 上安装 PHP 7 + +对于 Red Hat 7,启用以下存储库以安装最新的 PHP 7 软件包: + +``` +# sudo subscription-manager repos --enable rhel-7-server-extras-rpms +# sudo subscription-manager repos --enable rhel-7-server-optional-rpms +# sudo subscription-manager repos --enable rhel-server-rhscl-7-rpms +``` + +运行以下命令从 RHSCL 库中搜索可用的 PHP 7 版本: + +``` +# yum search rh-php* +``` + +运行以下命令,你可以轻松地从 RHSCL 存储库中把 PHP7.3 安装到你的 RHEL 7 计算机上: + +``` +# yum install rh-php73 +``` + +### 方法-2:如何使用 Remi 存储库在 CentOS 6/7 上安装 PHP 7 + +[Remi 存储库][3] 存储和维护着最新版本的 PHP 软件包,其中包含大量的库,扩展和工具。 有一些是从 Fedora 和 EPEL 反向移植的。 + +这是 CentOS 社区认可的存储库,它不会修改或影响任何基础软件包。 + +作为前提条件,如果你的系统上尚未安装 [EPEL 存储库][4],该操作会首先安装它。 + +你可以轻松地从 Remi 存储库中找到可用的 PHP 7 软件包版本,因为它会为每个版本添加一个单独的存储库。 你可以使用 [ls 命令][5] 查看它们: + +``` +# ls -lh /etc/yum.repos.d/remi-php* + +-rw-r--r--. 1 root root 456 Sep 6 01:31 /etc/yum.repos.d/remi-php54.repo +-rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php70.repo +-rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php71.repo +-rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php72.repo +-rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php73.repo +-rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php74.repo +``` + +运行以下命令,你可以轻松地从 Remi 存储库中把 PHP7.4 安装到你的 CentOS 6/7 计算机上: + +``` +# yum --disablerepo="*" --enablerepo="remi-php74" install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo +``` + +### 方法-2a:如何使用 Remi 存储库在 RHEL 7 上安装 PHP 7 + +对于 Red Hat 7,请安装以下存储库以安装最新的 PHP 7 软件包。 + +在 RHEL 7 上安装 EPEL 存储库: + +``` +# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm +``` + +在 RHEL 7 上安装 Remi 存储库: + +``` +# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm +``` + +启用可选的 RPMS 存储库: + +``` +# subscription-manager repos --enable=rhel-7-server-optional-rpms +``` + +运行以下命令,可以轻松地从 remi 存储库中,把 PHP 7.4 安装在 RHEL 7 系统上: + +``` +# yum --disablerepo="*" --enablerepo="remi-php74" install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo +``` + +要验证 PHP 7 的安装版本,请运行以下命令: + +``` +# php -v + +PHP 7.4.1 (cli) (built: Dec 17 2019 16:35:58) ( NTS ) +Copyright (c) The PHP Group +Zend Engine v3.4.0, Copyright (c) Zend Technologies +``` + +### 方法-3:如何使用 IUS 社区存储库在 CentOS 6/7 上安装 PHP 7 + +IUS 社区存储库是 CentOS 社区批准的第三方 RPM 存储库,其中包含 PHP、Python、MySQL 等软件的最新上游版本,以及用于 Enterprise Linux(RHEL 和 CentOS)5、6 和 7 的软件包。 + +[IUS 社区存储库][6] 与 EPEL 存储库具有依赖性,因此我们必须在安装 IUS 存储库之前先安装 EPEL 存储库。 请按照以下步骤将 EPEL 和 IUS 社区存储库安装并启用到 RPM 系统,然后再安装软件包。 + +EPEL软件包包含在 CentOS Extras 存储库中,并默认启用,因此,我们可以通过运行以下命令来安装它: + +``` +# yum install epel-release +``` + +下载 IUS 社区存储库的 Shell 脚本如下: + +``` +# curl 'https://setup.ius.io/' -o setup-ius.sh + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 1914 100 1914 0 0 6563 0 --:--:-- --:--:-- --:--:-- 133k +``` + +安装/启用 IUS 社区存储库: + +``` +# sh setup-ius.sh +``` + +运行如下命来检查 IUS 存储库中可用的 PHP 7 版本: + +``` +# yum --disablerepo="*" --enablerepo="ius" list *php7* + +Loaded plugins: fastestmirror, langpacks +Loading mirror speeds from cached hostfile +Available Packages +mod_php71u.x86_64 7.1.33-1.el7.ius ius +mod_php72u.x86_64 7.2.26-1.el7.ius ius +mod_php73.x86_64 7.3.13-1.el7.ius ius +php71u-bcmath.x86_64 7.1.33-1.el7.ius ius +php71u-cli.x86_64 7.1.33-1.el7.ius ius +php71u-common.x86_64 7.1.33-1.el7.ius ius +php71u-dba.x86_64 7.1.33-1.el7.ius ius +php71u-dbg.x86_64 7.1.33-1.el7.ius ius +php71u-devel.x86_64 7.1.33-1.el7.ius ius +php71u-embedded.x86_64 7.1.33-1.el7.ius ius +``` + +运行以下命令你可以轻松地从 IUS 存储库中安装 PHP 7.3 到你 CentOS 6/7 系统上: + +``` +# yum --disablerepo="*" --enablerepo="ius" install php73-common php73-cli php73-gd php73-gd php73-mysqlnd php73-ldap php73-soap php73-mbstring +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/install-php-7-on-centos-6-centos-7-rhel-7-redhat-7/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/8-additional-thirdparty-yum-repositories-centos-rhel-fedora-linux/ +[2]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/ +[3]: https://www.2daygeek.com/install-enable-remi-repository-on-centos-rhel-fedora-linux/ +[4]: https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-oracle-linux/ +[5]: https://www.2daygeek.com/linux-unix-ls-command-display-directory-contents/ +[6]: https://www.2daygeek.com/install-enable-ius-community-repository-on-rhel-centos/ diff --git a/published/202009/20200415 Tweaking history on Linux.md b/published/202009/20200415 Tweaking history on Linux.md new file mode 100644 index 0000000000..0bd28438f6 --- /dev/null +++ b/published/202009/20200415 Tweaking history on Linux.md @@ -0,0 +1,189 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12596-1.html) +[#]: subject: (Tweaking history on Linux) +[#]: via: (https://www.networkworld.com/article/3537214/tweaking-history-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +在 Linux 上调整命令历史 +====== + +> 在 Linux 系统上,bash shell 的 history 命令可以方便地回顾和重用命令,但是你要控制它记住多少,忘记多少,有很多事情要做。 + +![](https://img.linux.net.cn/data/attachment/album/202009/08/232418c2121m2euw3aaw58.jpg) + +Linux 系统中的 bash `history` 命令有助于记住你以前运行过的命令,并重复这些命令,而不必重新输入。 + +如果可以的话,你肯定会很高兴不用翻阅十几页的手册,每过一会再次列出你的文件,而是通过输入 `history` 查看以前运行的命令。在这篇文章中,我们将探讨如何让 `history` 命令记住你希望它记住的内容,并忘记那些可能没有什么“历史价值”的命令。 + +### 查看你的命令历史 + +要查看以前运行过的命令,你只需输入 `history`。你可能会看到一长串命令。记忆的命令数量取决于在 `~/.bashrc` 文件中设置的名为 `$HISTSIZE` 的环境变量,但是如果你想保存更多或更少的命令,你可以根据你的需要改变这个设置。 + +要查看历史记录,请使用 `history` 命令: + +``` +$ history +209 uname -v +210 date +211 man chage +... +``` + +要查看将显示的最大命令数量: + +``` +$ echo $HISTSIZE +500 +``` + +你可以通过运行这样的命令来改变 `$HISTSIZE` 并使之永久化: + +``` +$ export HISTSIZE=1000 +$ echo "HISTSIZE=1000" >> ~/.bashrc +``` + +在为你保留多少历史记录和当你输入 `history` 时显示多少历史记录之间也有区别。`$HISTSIZE` 变量控制显示多少历史记录,而 `$HISTFILESIZE` 变量控制在你的 `.bash_history` 文件中保留多少命令。 + +``` +$ echo $HISTSIZE +1000 +$ echo $HISTFILESIZE +2000 +``` + +你可以通过计算历史文件中的行数来验证第二个变量: + +``` +$ wc -l .bash_history +2000 .bash_history +``` + +需要注意的是,在登录会话中输入的命令在注销前不会被添加到你的 `.bash_history` 文件中,尽管它们会立即显示在 `history` 命令输出中。 + +### 使用历史 + +有三种方法可以重发你在 `history` 中发现的命令。最简单的方法,特别是当你想重用的命令是最近运行的时候,通常是输入一个 `!` 后面跟上命令中足够多的首字母来唯一地识别它。 + +``` +$ !u +uname -v +#37-Ubuntu SMP Thu Mar 26 20:41:27 UTC 2020 +``` + +另一种简单的重复命令的方法是,只需按上箭头键,直到显示了该命令,然后按回车键。 + +另外,如果你运行 `history` 命令,并看到你想重新运行的命令被列出,你可以输入一个 `!` 后面跟着命令左边显示的序号。 + +``` +$ !209 +uname -v +#37-Ubuntu SMP Thu Mar 26 20:41:27 UTC 2020 +``` + +### 隐藏历史 + +如果你想在一段时间内停止记录命令,你可以使用这个命令: + +``` +$ set +o history +``` + +当你输入 `history` 时,你输入的命令不会显示出来,当你退出会话或退出终端时,它们也不会被添加到你的 `.bash_history` 文件中。 + +要取消这个设置,使用 `set -o history`。 + +要使它永久化,你可以把它添加到你的 `.bashrc` 文件中,尽管不使用命令历史记录通常不是一个好主意。 + +``` +$ echo 'set +o history' >> ~/.bashrc +``` + +要暂时清除历史记录,这样在输入 `history` 时只显示之后输入的命令,可以使用 `history -c`(清除)命令: + +``` +$ history | tail -3 +209 uname -v +210 date +211 man chage +$ history -c +$ history +1 history +``` + +注意:在输入 `history -c` 后输入的命令不会被添加到 `.bash_history` 文件中。 + +### 控制历史 + +许多系统上的 `history` 命令的设置会默认包括一个名为 `$HISTCONTROL` 的变量,以确保即使你连续运行同一命令七次,也只会被记住一次。它还可以确保你在首先输入一个或多个空格后跟着的命令将从你的命令历史记录中忽略。 + +``` +$ grep HISTCONTROL .bashrc +HISTCONTROL=ignoreboth +``` + +`ignoreboth` 的意思是“忽略重复的命令和以空格开头的命令”。例如,如果你输入这些命令: + +``` +$ echo try this +$ date +$ date +$ date +$ pwd +$ history +``` + +你的 `history` 命令应该像这样报告: + +``` +$ history +$ echo try this +$ date +$ history +``` + +请注意,连续的 `date` 命令被缩减为一条,以空格缩进的命令被省略。 + +### 忽略历史 + +要忽略某些命令,使它们在你输入 `history` 时不会出现,也不会被添加到你的 `.bash_history` 文件中,可以使用 `$HISTIGNORE` 设置。例如: + +``` +$ export HISTIGNORE=”history:cd:exit:ls:pwd:man” +``` + +这个设置将导致所有的 `history`、`cd`、`exit`、`ls`、`pwd` 和 `man` 命令从你的 `history` 命令的输出和 `.bash_history` 文件中被忽略。 + +如果你想把这个设置变成永久性的,你必须把它添加到你的 `.bashrc` 文件中。 + +``` +$ echo 'HISTIGNORE="history:cd:exit:ls:pwd:man"' >> .bashrc +``` + +这个设置只是意味着当你回看以前运行的命令时,列表不会被你在查看命令历史记录时不想看到的命令所干扰。 + +### 记住、忽略和忘记过去的命令 + +命令历史记录很有用,因为它可以帮助你记住最近使用过的命令,并提醒你最近所做的更改。它还可以让你更容易地重新运行命令,特别是那些有一串参数但你不一定想重新创建的命令。定制你的历史设置可以让你对命令历史的使用变得更容易,更有效率。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3537214/tweaking-history-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://unsplash.com/photos/iqeG5xA96M4 +[2]: https://creativecommons.org/publicdomain/zero/1.0/ +[3]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy) +[4]: https://www.facebook.com/NetworkWorld/ +[5]: https://www.linkedin.com/company/network-world diff --git a/published/202009/20200625 Wi-Fi 6E- When it-s coming and what it-s good for.md b/published/202009/20200625 Wi-Fi 6E- When it-s coming and what it-s good for.md new file mode 100644 index 0000000000..7fb3d60133 --- /dev/null +++ b/published/202009/20200625 Wi-Fi 6E- When it-s coming and what it-s good for.md @@ -0,0 +1,77 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12650-1.html) +[#]: subject: (Wi-Fi 6E: When it’s coming and what it’s good for) +[#]: via: (https://www.networkworld.com/article/3563832/wi-fi-6e-when-its-coming-and-what-its-good-for.html) +[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/) + +Wi-Fi 6E:它何时到来,又有何作用? +====== + +> Extreme Networks 的一位高管表示,近来专用于 Wi-Fi 的新无线频谱可以提供更多的信道和更高的密度部署,但是要支持它的设备要到 2020 年才能得到广泛部署。 + +![](https://images.idgesg.net/images/article/2019/09/cso_wireless_network_management_security_alert_iot_internet_of_things_thinkstock_685417850_1200x800-100810374-large.jpg) + +今年开春 [FCC 在 6GHz 频段内开辟了一系列新的未授权的无线频谱][1],该频谱旨在用于 Wi-Fi,以提供更低的延迟和更快的数据速率。新频谱的范围更短,与已经专用于 Wi-Fi 的频段相比支持的信道也更多,因此适合在体育场馆等高密度区域部署。 + +为了进一步了解什么是 Wi-Fi 6E 以及它与 Wi-Fi 6 有何不同,我最近与网络解决方案提供商 Extreme Networks 的产品管理总监 Perry Correll 进行了交谈。 + +**了解更多关于 5G 和 WiFi 6 的信息** + + * [什么是 5G?相较于 4G 它更好吗?][2] + * [如何确定 WiFi 6 是否适合你?][3] + * [什么是 MU-MIMO?为什么它在你的无线路由器中不可或缺?][4] + * [何时使用 5G?何时使用 WiFi 6?][5] + * [企业如何为5G网络做准备呢?][6] + +**Kerravala: Wi-Fi 6 似乎得到了许多热捧,而 Wi-Fi 6E 却没有。为什么?** + +**Correll:** 所有这些带 666 的数字会混乱得会吓死你。我们已经有了 Wi-Fi 6、Wi-Fi 6E,之后,Wi-Fi 6 还有其它的增强功能,比如多用户多入多出(多用户 MIMO)功能。还有就是 6GHz 频谱,但这并不是 Wi-Fi 6 的名称的由来:它是第六代 Wi-Fi。最重要的是,我们刚刚掌握了 5G,并且已经在谈论 6G —— 认真的讲,这更容易搞混了。 + +**Kerravala: 为什么我们需要 Wi-Fi 6E 和普通的 Wi-Fi 6?** + +**Correll:** 上一次我们在 UNII-2 和 UNII-2 扩展中得到提升是在 15 年前,而在当时智能手机甚至还没有兴起。现在能够获得 1.2GHz 的频谱已经非常大了。使用 Wi-Fi 6E,我们不是将 Wi-Fi 空间增加一倍,事实上,我们将可用空间增加了三倍。根据你所处的地点,频谱的数量要多三倍、四倍或五倍。此外,你不必担心 DFS(动态频率选择dynamic frequency selection),尤其是在室内。 + +Wi-Fi 6E 不会比 Wi-Fi 6 更快,也不会添加增强的技术功能。最妙的是运行 6GHz 需要 Wi-Fi 6 或以上的客户端。所以,我们不会有任何缓慢的客户端,也不会有很多噪声。我们将在更干净的环境中使用更快的设备来得到高性能。 + +**Kerravala: 也能用更宽的信道吗** + +**Correll:** 没错,那是一件很酷的事情。如果你处于一个典型的企业环境中,20 和 40MHz 基本上就是你需要的。在体育馆这种高密度环境中,想要使用 80 或 160MHz 的带宽就会变得很困难了。更宽的信道将会真正有助于像虚拟现实这类应用,它可以利用这些信道占用频谱中剩余的部分。这可能是最大的用例了。 + +在未来的三四年里,如果你想在体育场做数字标识牌或者边缘屏幕处理,则可以使用 160MHz 的 80% 带宽,而不会受到其他任何影响。已经有传言说 Wi-Fi 7 将会有 320MHz 宽的频道。 + +**Kerravala: 这将主要是对大多数 Wi-Fi 策略的增强吗?** + +**Correll:** 短期内肯定会处于先锐领域。首批产品大概会在今年底发布,它们将是消费类产品。对于企业来说,支持 6GHz 的产品将会在明年亮相。在 2022 年之前,你不会真正看到它密集出现——所以,短期内不会。对于智能手机公司来说,Wi-Fi 并不是什么大事,他们更愿意关注其他功能。 + +但它仍是一个巨大的机会。6GHz 与 CBRS(公民宽带无线电服务)或 5G 相比,最棒的一点是(许多人)宁愿坚持使用 Wi-Fi,也不愿迁移到不同的架构。这些用户将推动驱动部件制造商转向物联网设备或机器人或任何需要 6GHz 的设备。这是一个干净的频谱,可能比普通的 Wi-Fi 6 还要便宜也更节能。 + +**Kerravala: 有人说 5G 会替代 Wi-Fi 6。但这有什么实际意义呢?** + +**Correll:** 现实中,你不可能在每个设备中插入 SIM 卡。但是其中一个大问题是数据所有权,因为运营商将拥有你的数据,而不是你。如果你想使用你的数据进行任何类型的业务分析,运营商是否会以一定价格将数据返还给你?这是一个可怕的想法。 + +Wi-Fi 不会消失有太多的理由。当具备 Wi-Fi 6 和 5G 功能的设备问世时,其他只有 Wi-Fi 功能的笔记本电脑、平板电脑和物联网设备将会发生什么呢?要么是只支持 Wi-Fi 的设备,要么是支持 Wi-Fi 和 5G 的设备,但 5G 不会完全取代 Wi-Fi。如果你看看 5G 无线网络的骨干网,Wi-Fi 就是其中的一个组成部分。这是一个幸福的大家庭。这些技术是为了共存而设计的。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3563832/wi-fi-6e-when-its-coming-and-what-its-good-for.html + +作者:[Zeus Kerravala][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://www.networkworld.com/author/Zeus-Kerravala/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/article/3540288/how-wi-fi-6e-boosts-wireless-spectrum-five-fold.html +[2]: https://www.networkworld.com/article/3203489/what-is-5g-how-is-it-better-than-4g.html +[3]: https://www.networkworld.com/article/3356838/how-to-determine-if-wi-fi-6-is-right-for-you.html +[4]: https://www.networkworld.com/article/3250268/what-is-mu-mimo-and-why-you-need-it-in-your-wireless-routers.html +[5]: https://www.networkworld.com/article/3402316/when-to-use-5g-when-to-use-wi-fi-6.html +[6]: https://www.networkworld.com/article/3306720/mobile-wireless/how-enterprises-can-prep-for-5g.html +[7]: https://www.facebook.com/NetworkWorld/ +[8]: https://www.linkedin.com/company/network-world diff --git a/published/202009/20200708 6 best practices for teams using Git.md b/published/202009/20200708 6 best practices for teams using Git.md new file mode 100644 index 0000000000..22db8f87b8 --- /dev/null +++ b/published/202009/20200708 6 best practices for teams using Git.md @@ -0,0 +1,125 @@ +[#]: collector: (lujun9972) +[#]: translator: (LazyWolfLin) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12621-1.html) +[#]: subject: (6 best practices for teams using Git) +[#]: via: (https://opensource.com/article/20/7/git-best-practices) +[#]: author: (Ravi Chandran https://opensource.com/users/ravichandran) + + 6 个在团队中使用 Git 的最佳实践 +====== + +> 采用这些 Git 协作策略,让团队工作更高效。 + +![](https://img.linux.net.cn/data/attachment/album/202009/16/234908ge77j9j799i4eaj7.jpg) + +Git 非常有助于小团队管理他们的软件开发进度,但有些方法能让你变得更高效。我发现了许多有助于我的团队的最佳实践,尤其是当不同 Git 水平的新人加入时。 + +### 在你的团队中正式确立 Git 约定 + +每个人都应当遵循对于分支命名、标记和编码的规范。每个组织都有自己的规范或者最佳实践,并且很多建议都可以从网上免费获取,而重要的是尽早选择合适的规范并在团队中遵循。 + +同时,不同的团队成员的 Git 水平参差不齐。你需要创建并维护一组符合团队规范的基础指令,用于执行通用的 Git 操作。 + +### 正确地合并变更 + +每个团队成员都需要在一个单独的功能分支上开发。但即使是使用了单独的分支,每个人也会修改一些共同的文件。当把更改合并回 `master` 分支时,合并通常无法自动进行。可能需要手动解决不同的人对同一文件不同变更的冲突。这就是你必须学会如何处理 Git 合并的原因。 + +现代编辑器具有协助解决 [Git 合并冲突][2]的功能。它们对同一文件的每个部分提供了合并的各种选择,例如,是否保留你的更改,或者是保留另一分支的更改,亦或者是全部保留。如果你的编辑器不支持这些功能,那么可能是时候换一个代码编辑器了。 + +### 经常变基你的功能分支 + +当你持续地开发你的功能分支时,请经常对它做变基rebase:`rebase master`。这意味着要经常执行以下步骤: + +``` +git checkout master +git pull +git checkout feature-xyz  # 假设的功能分支名称 +git rebase master  # 可能需要解决 feature-xyz 上的合并冲突 +``` + +这些步骤会在你的功能分支上[重写历史][3](这并不是件坏事)。首先,它会使你的功能分支获得 `master` 分支上当前的所有更新。其次,你在功能分支上的所有提交都会在该分支历史的顶部重写,因此它们会顺序地出现在日志中。你可能需要一路解决遇到的合并冲突,这也许是个挑战。但是,这是解决冲突最好的时机,因为它只影响你的功能分支。 + +在解决完所有冲突并进行回归测试后,如果你准备好将功能分支合并回 `master`,那么就可以在再次执行上述的变基步骤几次后进行合并: + +``` +git checkout master +git pull +git merge feature-xyz +``` + +在此期间,如果其他人也将和你有冲突的更改推送到 `master`,那么 Git 合并将再次发生冲突。你需要解决它们并重新进行回归测试。 + +还有一些其他的合并哲学(例如,只使用合并而不使用变基以防止重写历史),其中一些甚至可能更简单易用。但是,我发现上述方法是一个干净可靠的策略。提交历史日志将以有意义的功能序列进行排列。 + +如果使用“纯合并”策略(上面所说的,不进行定期的变基),那么 `master` 分支的历史将穿插着所有同时开发的功能的提交。这样混乱的历史很难回顾。确切的提交时间通常并不是那么重要。最好是有一个易于查看的历史日志。 + +### 在合并前压扁提交 + +当你在功能分支上开发时,即使再小的修改也可以作为一个提交。但是,如果每个功能分支都要产生五十个提交,那么随着不断地增添新功能,`master` 分支的提交数终将无谓地膨胀。通常来说,每个功能分支只应该往 `master` 中增加一个或几个提交。为此,你需要将多个提交压扁Squash成一个或者几个带有更详细信息的提交中。通常使用以下命令来完成: + +``` +git rebase -i HEAD~20  # 查看可进行压扁的二十个提交 +``` + +当这条命令执行后,将弹出一个提交列表的编辑器,你可以通过包括遴选pick压扁squash在内的数种方式编辑它。“遴选”一个提交即保留这个提交。“压扁”一个提交则是将这个提交合并到前一个之中。使用这些方法,你就可以将多个提交合并到一个提交之中,对其进行编辑和清理。这也是一个清理不重要的提交信息的机会(例如,带错字的提交)。 + +总之,保留所有与提交相关的操作,但在合并到 `master` 分支前,合并并编辑相关信息以明确意图。注意,不要在变基的过程中不小心删掉提交。 + +在执行完诸如变基之类的操作后,我会再次看看 `git log` 并做最终的修改: + +``` +git commit --amend +``` + +最后,由于重写了分支的 Git 提交历史,必须强制更新远程分支: + +``` +git push -f +``` + +### 使用标签 + +当你完成测试并准备从 `master` 分支部署软件到线上时,又或者当你出于某种原因想要保留当前状态作为一个里程碑时,那么可以创建一个 Git 标签。对于一个积累了一些变更和相应提交的分支而言,标签就是该分支在那一时刻的快照。一个标签可以看作是没有历史记录的分支,也可以看作是直接指向标签创建前那个提交的命名指针。 + +所谓的“配置控制”就是在不同的里程碑上保存代码的状态。大多数项目都有一个需求,能够重现任一里程碑上的软件源码,以便在需要时重新构建。Git 标签为每个代码的里程碑提供了一个唯一标识。打标签非常简单: + +``` +git tag milestone-id -m "short message saying what this milestone is about" +git push --tags   # 不要忘记将标签显式推送到远程 +``` + +考虑这样一种情况:Git 标签对应的软件版本已经分发给客户,而客户报告了一个问题。尽管代码库中的代码可能已经在继续开发,但通常情况下为了准确地重现客户问题以便做出修复,必须回退到 Git 标签对应的代码状态。有时候新代码可能已经修复了那个问题,但并非一直如此。通常你需要切换到特定的标签并从那个标签创建一个分支: + +``` +git checkout milestone-id        # 切换到分发给客户的标签 +git checkout -b new-branch-name  # 创建新的分支用于重现 bug +``` + +此外,如果带附注的标记和带签名的标记有助于你的项目,可以考虑使用它们。 + +### 让软件运行时打印标签 + +在大多数嵌入式项目中,从代码版本构建出的二进制文件有固定的名称,这样无法从它的名称推断出对应的 Git 标签。在构建时“嵌入标签”有助于将未来发现的问题精准地关联到特定的构建版本。在构建过程中可以自动地嵌入标签。通常,`git describe` 生成的标签字符串会在代码编译前插入到代码中,以便生成的可执行文件能够在启时时输出标签字符串。当客户报告问题时,可以指导他们给你发送启动时输出的内容。 + +### 总结 + +Git 是一个需要花时间去掌握的复杂工具。使用这些实践可以帮助团队成功地使用 Git 协作,无论他们的知识水平。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/git-best-practices + +作者:[Ravi Chandran][a] +选题:[lujun9972][b] +译者:[LazyWolfLin](https://github.com/LazyWolfLin) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/ravichandran +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/christina-wocintechchat-com-rg1y72ekw6o-unsplash_1.jpg?itok=MoIv8HlK (Women in tech boardroom) +[2]: https://opensource.com/article/20/4/git-merge-conflict +[3]: https://opensource.com/article/20/4/git-rebase-i diff --git a/published/202009/20200721 Manage network connections from the Linux command line with nmcli.md b/published/202009/20200721 Manage network connections from the Linux command line with nmcli.md new file mode 100644 index 0000000000..8b9b2f8d36 --- /dev/null +++ b/published/202009/20200721 Manage network connections from the Linux command line with nmcli.md @@ -0,0 +1,305 @@ +[#]: collector: "lujun9972" +[#]: translator: "FSSlc" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12599-1.html" +[#]: subject: "Manage network connections from the Linux command line with nmcli" +[#]: via: "https://opensource.com/article/20/7/nmcli" +[#]: author: "Dave McKay https://opensource.com/users/davemckay" + +在命令行中使用 nmcli 来管理网络连接 +====== + +> nmcli 命令赋予你直接在 Linux 命令行操作 NetworkManager 工具的能力。 + +![](https://img.linux.net.cn/data/attachment/album/202009/10/100302z2xq9cieqyekxbdc.jpg) + +[nmcli][2] 命令赋予你直接在 Linux 命令行操作 NetworkManager 工具的能力。它是 NetworkManager 软件包集成的一部分,通过使用一些 [应用程序接口][3](API)来获取 NetworkManager 的功能。 + +`nmcli` 发布于 2010 年,用以替代其他配置网络接口和连接的方法,例如 [ifconfig][4]。因为它是一个 [命令行界面][5](CLI)工具,被设计用在终端窗口和脚本中,所以对于那些工作在没有 [图形用户界面][6](GUI)的系统的管理员来说,它是一个非常理想的工具。 + +### ncmli 的语法 + +`nmcli` 命令可以使用*选项*来更改它的行为,使用*子命令*来告诉 `nmcli` 想使用它的那部分功能,使用*操作*来告诉 `nmcli` 你想执行什么操作。 + +``` +$ nmcli <选项> <子命令> <操作> +``` + +`nmcli` 一共有 8 个子命令,每个子命令有一些相关的网络操作: + + * `help` 提供有关 `nmcli` 命令和使用方法的帮助信息 + * `general` 返回 NetworkManager 的状态和总体配置信息 + * `networking` 提供命令来查询某个网络连接的状态和启动、禁用连接的功能 + * `radio` 提供命令来查询某个 WiFi 网络连接的状态和启动、禁用连接的功能 + * `monitor` 提供命令来监控 NetworkManager 的活动并观察网络连接的状态改变 + * `connection` 提供命令来启用或禁用网络接口、添加新的连接、删除已有连接等功能 + * `device` 主要被用于更改与某个设备(例如接口名称)相关联的连接参数或者使用一个已有的连接来连接设备 + * `secret` 注册 `nmcli` 来作为一个 NetworkManager 的秘密代理,用以监听秘密信息。这个子命令很少会被用到,因为当连接到网络时,`nmcli` 会自动做这些事 + +### 简单的示例 + +首先,我们验证一下 NetworkManager 正在运行并且 `nmcli` 可以与之通信: + +``` +$ nmcli general +STATE      CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN     +connected  full          enabled  enabled  enabled  enabled +``` + +探测总是管理一个系统的首要部分。为了列出内存或磁盘上的网络连接配置,可以使用下面的命令: + +``` +$ nmcli connection show +NAME                UUID                                  TYPE      DEVICE +Wired connection 1  ac3241e4-b424-35d6-aaa7-07498561688d  ethernet  enp0s3 +Wired connection 2  2279d917-fa02-390c-8603-3083ec5a1d3e  ethernet  enp0s8 +Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9 +``` + +上面的命令使用了 `connection` 子命令中的 `show` 操作。 + +用来运行上面这个例子的测试机器上运行着 Ubuntu 20.04,它安装了 3 个网络适配器:`enp0s3`、`enp0s8`和 `enp0s9`。 + +### 连接管理 + +理解 `nmcli` 的术语是非常重要的。一个网络连接connection包含了一个连接的所有信息。你可以将它看作一个网络配置configuration。“连接”包含了与其相关的所有信息,包括 [数据链路层][7] 和 [IP 地址信息][8] 。它们是 [OSI 网络模型][9] 中的第 2 和第 3 层。 + +当你在 Linux 上配置网络时,通常来说你是在为某个网络设备(它们是安装在一个电脑中的网络接口)配置连接。当一个连接被某个设备所使用,那么就可以说这个连接被激活active或者上线up了,反之是停用inactive下线down。 + +#### 添加网络连接 + +`nmcli` 允许你快速地创建网络连接并同时为该连接指定参数。为了通过使用“有线连接 2” `enp0s8` 来创建一个新的连接,你可以利用 `sudo` 来运行下面的命令: + +``` +$ sudo nmcli connection add type ethernet ifname enp0s8 +Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully added. +``` + +其中 `type` 选项指定需要一个 [Ethernet][10] 类型的连接,而 `ifname`(接口名)选项指定你想要为这个连接使用的网络接口设备。 + +让我们看看发生了什么变化: + +``` +$ nmcli connection show +NAME                UUID                                  TYPE      DEVICE +Wired connection 1  ac3241e4-b424-35d6-aaa7-07498561688d  ethernet  enp0s3 +Wired connection 2  2279d917-fa02-390c-8603-3083ec5a1d3e  ethernet  enp0s8 +Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9 +ethernet-enp0s8     09d26960-25a0-440f-8b20-c684d7adc2f5  ethernet  --   +``` + +通过上图可以看到新的连接 `ethernet-enp0s8` 已经创建好了。它的 [通用唯一标识符][11]Universally Unique IDentifier(UUID)也一同被赋予,并且其连接类型为 “Ethernet”。我们可以使用 `up` 子命令再加上连接名称(或 UUID)来使得这个连接被激活: + +``` +$ nmcli connection up ethernet-enp0s8 +Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4) +``` + +再次查看激活的连接: + +``` +$ nmcli connection show --active +NAME                UUID                                  TYPE      DEVICE +Wired connection 1  ac3241e4-b424-35d6-aaa7-07498561688d  ethernet  enp0s3 +ethernet-enp0s8     09d26960-25a0-440f-8b20-c684d7adc2f5  ethernet  enp0s8 +Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9 +``` + +可以看到新的连接 `ethernet-enp0s8` 现在已经被激活了,并且与 `enp0s8` 网络接口设备绑定。 + +#### 调整连接 + +`nmcli` 命令使得调整现有连接的参数变得更加容易。也许你想将某个网络接口从 [动态主机配置协议][12]Dynamic Host Configuration Protocol(DHCP)改为静态 IP 地址。 + +假设你需要为你的新连接分配一个固定的 IP 地址 `192.168.4.26`,那么你需要使用两个命令,一个用于设定 IP 地址,另一个用来将获取 IP 地址的方法改为 `manual`(手动): + +``` +$ nmcli connection modify ethernet-enp0s8 ipv4.address 192.168.4.26/24 +$ nmcli connection modify ethernet-enp0s8 ipv4.method manual +``` + +记得指定 [子网掩码][13],在我们这个测试的连接中,它是 [无类域间路由][14] Classless Inter-Domain Routing(CIDR)中的 `255.255.255.0` 或 `/24` + +为了使得你的更改生效,你需要通过停止再重新启用该连接。下面的第一个命令是停用该连接,第二个命令则是启用它: + +``` +$ nmcli connection down ethernet-enp0s8 +Connection 'ethernet-enp0s8' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4) +$ nmcli connection up ethernet-enp0s8 +Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6) +``` + +假如你想将连接设置为使用 DHCP,则需要将上面的 `manual` 改为 `auto`(自动): + +``` +$ nmcli connection modify ethernet-enp0s8 ipv4.method auto +``` + +### 设备管理 + +`nmcli` 命令中的 `device` 子命令允许你管理安装在你电脑中的网络接口。 + +#### 检查设备状态 + +可以使用下面的命令来快速检查所有网络接口的状态: + +``` +$ nmcli device status +DEVICE  TYPE      STATE      CONNECTION         +enp0s3  ethernet  connected  Wired connection 1 +enp0s8  ethernet  connected  ethernet-enp0s8     +enp0s9  ethernet  connected  Wired connection 3 +lo      loopback  unmanaged  --   +``` + +#### 显示设备详情 + +为了检查某个网络接口的详情,可以使用 `device` 子命令中的 `show` 操作。假如你不提供某个设备的名称,那么会获取并展示所有设备的详情。你可以上下翻动来查看这些信息。 + +要查看你最近添加的连接所对应的设备 `enp0s8`,你可以使用下面的命令,请注意验证它使用的 IP 地址是否为先前你要求设置的那个: + +``` +$ nmcli device show enp0s8 +GENERAL.DEVICE:                         enp0s8 +GENERAL.TYPE:                           ethernet +GENERAL.HWADDR:                         08:00:27:81:16:20 +GENERAL.MTU:                            1500 +GENERAL.STATE:                          100 (connected) +GENERAL.CONNECTION:                     ethernet-enp0s8 +GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/6 +WIRED-PROPERTIES.CARRIER:               on +IP4.ADDRESS[1]:                         192.168.4.26/24 +IP4.GATEWAY:                            -- +IP4.ROUTE[1]:                           dst = 192.168.4.0/24, nh = 0.0.0.0, mt = 103 +IP6.ADDRESS[1]:                         fe80::6d70:90de:cb83:4491/64 +IP6.GATEWAY:                            -- +IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 103 +IP6.ROUTE[2]:                           dst = ff00::/8, nh = ::, mt = 256, table=255 +``` + +上面的输出非常细致,它主要显示了下面这些内容: + + * **网络接口名称**,在这个示例中是 `enp0s8`,它是 [udev][15] 分配的 + * **网络连接类型**,在这个示例中是物理的 Ethernet 连接 + * 设备的媒介访问控制media access control(MAC)地址,它被用来在网络中识别该设备 + * [最大传输单元][17],在单个传输中最大协议数据单位的大小,任何大于这个大小的数据将被分为多个包来进行传输 + * 该设备**当前已经处于连接状态** + * 这个设备使用的连接名称是 `ethernet-enp0s8` + * 这个设备使用的 IP 地址如上面所要求的那样,被设置为 `192.168.4.26/24` + +其他的信息则是与这个设备连接的网络相关的默认路由和网关设置信息。 + +#### nmcli 的交互式编辑器 + +尽管 `nmcli` 是一个命令行工具,但它还包含一个基本的交互式编辑器,`edit` 子命令将为你指定的连接打开一个交互式编辑器,例如: + +``` +$ nmcli connection edit ethernet-enp0s8 +``` + +它将显示少量的帮助文字,接着是 `nmcli` 的命令提示符: + +``` +===| nmcli interactive connection editor |=== + +Editing existing '802-3-ethernet' connection: 'ethernet-enp0s8' + +Type 'help' or '?' for available commands. +Type 'print' to show all the connection properties. +Type 'describe [.]' for detailed property description. + +You may edit the following settings: connection, 802-3-ethernet (ethernet), 802-1x, dcb, sriov, ethtool, match, ipv4, ipv6, tc, proxy +nmcli> +``` + +假如你输入 `print` 然后敲击 `Enter` 键, `nmcli` 将列举出与这个接口相关的所有属性。这些属性有很多,你可以上下翻动来查看这个列表: + +``` +=============================================================================== +                 Connection profile details (ethernet-enp0s8) +=============================================================================== +connection.id:                          ethernet-enp0s8 +connection.uuid:                        09d26960-25a0-440f-8b20-c684d7adc2f5 +connection.stable-id:                   -- +connection.type:                        802-3-ethernet +connection.interface-name:              enp0s8 +connection.autoconnect:                 yes +connection.autoconnect-priority:        0 +connection.autoconnect-retries:         -1 (default) +connection.multi-connect:               0 (default) +connection.auth-retries:                -1 +connection.timestamp:                   1593967212 +connection.read-only:                   no +connection.permissions:                 -- +connection.zone:                        -- +connection.master:                      -- +connection.slave-type:                  -- +connection.autoconnect-slaves:          -1 (default) +connection.secondaries:                 -- +``` + +如果你想将你的连接改为 DHCP,则请输入 `goto ipv4` 然后敲 `Enter` 键: + +``` +nmcli> goto ipv4 +You may edit the following properties: method, dns, dns-search, dns-options, dns-priority, addresses, gateway, routes, route-metric, route-table, routing-rules, ignore-auto-routes, ignore-auto-dns, dhcp-client-id, dhcp-iaid, dhcp-timeout, dhcp-send-hostname, dhcp-hostname, dhcp-fqdn, dhcp-hostname-flags, never-default, may-fail, dad-timeout +nmcli ipv4> +``` + +你想改变的属性是 `method`,再继续敲 `set method auto` 然后敲 `Enter` 键: + +``` +nmcli ipv4> set method auto +Do you also want to clear 'ipv4.addresses'? [yes]: +``` + +假如你想让这个连接清除掉这个静态 IP 地址,则请敲 `Enter` 键,如果要保留,则输入 `no` 然后敲 `Enter` 键。假如你想在将来再次使用它,你可以保留这个 IP 地址。即便存储了一个静态的 IP 地址,如果 `method` 被设置为 `auto` ,它仍然会使用 DHCP。 + +最后输入 `save` 来保存你的更改: + +``` +nmcli ipv4> save +Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully updated. +nmcli ipv4> +``` + +输入 `quit` 来离开 `nmcli` 的交互式编辑器窗口。假如你不想离开,可以输入 `back` 来回到最开始的命令行提示符界面,然后继续使用这个编辑器。 + +### nmcli 的更多内容 + +浏览交互式编辑器,你就可以看到 `nmcli` 有多少设定和每个设定有多少属性。交互式编辑器是一个简洁的工具,但如果需要在命令行或者在脚本中使用 `nmcli`,你还是需要使用常规的命令行版本。 + +现在你有了这些基础知识,你还可以查看 `nmcli` 的 [man 页面][2] 来查看它还可以提供什么更多功能。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/nmcli + +作者:[Dave McKay][a] +选题:[lujun9972][b] +译者:[FSSLC](https://github.com/FSSlc) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/davemckay +[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://developer.gnome.org/NetworkManager/stable/nmcli.html +[3]: https://en.wikipedia.org/wiki/Application_programming_interface +[4]: https://man7.org/linux/man-pages/man8/ifconfig.8.html +[5]: https://en.wikipedia.org/wiki/Command-line_interface +[6]: https://en.wikipedia.org/wiki/Graphical_user_interface +[7]: https://en.wikipedia.org/wiki/Data_link_layer +[8]: https://en.wikipedia.org/wiki/IP_address +[9]: https://en.wikipedia.org/wiki/OSI_model +[10]: https://en.wikipedia.org/wiki/Ethernet +[11]: https://en.wikipedia.org/wiki/Universally_unique_identifier +[12]: https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol +[13]: https://en.wikipedia.org/wiki/Subnetwork +[14]: https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing +[15]: https://en.wikipedia.org/wiki/Udev +[16]: https://en.wikipedia.org/wiki/MAC_address +[17]: https://en.wikipedia.org/wiki/Maximum_transmission_unit + diff --git a/published/202009/20200722 SCP user-s migration guide to rsync.md b/published/202009/20200722 SCP user-s migration guide to rsync.md new file mode 100644 index 0000000000..1a4120215e --- /dev/null +++ b/published/202009/20200722 SCP user-s migration guide to rsync.md @@ -0,0 +1,182 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12575-1.html) +[#]: subject: (SCP user’s migration guide to rsync) +[#]: via: (https://fedoramagazine.org/scp-users-migration-guide-to-rsync/) +[#]: author: (chasinglogic https://fedoramagazine.org/author/chasinglogic/) + +scp 用户的 rsync 迁移指南 +====== + +![](https://img.linux.net.cn/data/attachment/album/202009/03/102942u7rxf79a7rsr9txz.jpg) + +在 [SSH 8.0 预发布公告][2]中,OpenSSH 项目表示,他们认为 scp 协议已经过时,不灵活,而且不容易修复,然后他们继而推荐使用 `sftp` 或 `rsync` 来进行文件传输。 + +然而,很多用户都是从小用着 `scp` 命令长大的,所以对 `rsync` 并不熟悉。此外,`rsync` 可以做的事情也远不止复制文件,这可能会给菜鸟们留下复杂和难以掌握的印象。尤其是,`scp` 命令的标志大体上可以直接对应到 `cp` 命令的标志,而 `rsync` 命令的标志却和它大相径庭。 + +本文将为熟悉 `scp` 的人提供一个介绍和过渡的指南。让我们跳进最常见的场景:复制文件和复制目录。 + +### 复制文件 + +对于复制单个文件而言,`scp` 和 `rsync` 命令实际上是等价的。比方说,你需要把 `foo.txt` 传到你在名为 `server` 的服务器上的主目录下: + +``` +$ scp foo.txt me@server:/home/me/ +``` + +相应的 `rsync` 命令只需要输入 `rsync` 取代 `scp`: + +``` +$ rsync foo.txt me@server:/home/me/ +``` + +### 复制目录 + +对于复制目录,就有了很大的分歧,这也解释了为什么 `rsync` 会被认为比 `scp` 更复杂。如果你想把 `bar` 目录复制到 `server` 服务器上,除了指定 `ssh` 信息外,相应的 `scp` 命令和 `cp` 命令一模一样。 + +``` +$ scp -r bar/ me@server:/home/me/ +``` + +对于 `rsync`,考虑的因素比较多,因为它是一个比较强大的工具。首先,我们来看一下最简单的形式: + +``` +$ rsync -r bar/ me@server:/home/me/ +``` + +看起来很简单吧?对于只包含目录和普通文件的简单情况,这就可以了。然而,`rsync` 更在意发送与主机系统中一模一样的文件。让我们来创建一个稍微复杂一些,但并不罕见的例子: + +``` +# 创建多级目录结构 +$ mkdir -p bar/baz +# 在其根目录下创建文件 +$ touch bar/foo.txt +# 现在创建一个符号链接指回到该文件 +$ cd bar/baz +$ ln -s ../foo.txt link.txt +# 返回原位置 +$ cd - +``` + +现在我们有了一个如下的目录树: + +``` +bar +├── baz +│ └── link.txt -> ../foo.txt +└── foo.txt + +1 directory, 2 files +``` + +如果我们尝试上面的命令来复制 `bar`,我们会注意到非常不同的(并令人惊讶的)结果。首先,我们来试试 `scp`: + +``` +$ scp -r bar/ me@server:/home/me/ +``` + +如果你 `ssh` 进入你的服务器,看看 `bar` 的目录树,你会发现它和你的主机系统有一个重要而微妙的区别: + +``` +bar +├── baz +│ └── link.txt +└── foo.txt + +1 directory, 2 files +``` + +请注意,`link.txt` 不再是一个符号链接,它现在是一个 `foo.txt` 的完整副本。如果你习惯于使用 `cp`,这可能会是令人惊讶的行为。如果你尝试使用 `cp -r` 复制 `bar` 目录,你会得到一个新的目录,里面的符号链接和 `bar` 的一样。现在如果我们尝试使用之前的 `rsync` 命令,我们会得到一个警告: + +``` +$ rsync -r bar/ me@server:/home/me/ +skipping non-regular file "bar/baz/link.txt" +``` + +`rsync` 警告我们它发现了一个非常规文件,并正在跳过它。因为你没有告诉它可以复制符号链接,所以它忽略了它们。`rsync` 在手册中有一节“符号链接”,解释了所有可能的行为选项。在我们的例子中,我们需要添加 `-links` 标志: + +``` +$ rsync -r --links bar/ me@server:/home/me/ +``` + +在远程服务器上,我们看到这个符号链接是作为一个符号链接复制过来的。请注意,这与 `scp` 复制符号链接的方式不同。 + +``` +bar/ +├── baz +│ └── link.txt -> ../foo.txt +└── foo.txt + +1 directory, 2 files +``` + +为了省去一些打字工作,并利用更多的文件保护选项,在复制目录时可以使用归档标志 `-archive`(简称 `-a`)。该归档标志将做大多数人所期望的事情,因为它可以实现递归复制、符号链接复制和许多其他选项。 + +``` +$ rsync -a bar/ me@server:/home/me/ +``` + +如果你感兴趣的话,`rsync` 手册页有关于存档标志的深入解释。 + +### 注意事项 + +不过,使用 `rsync` 有一个注意事项。使用 `scp` 比使用 `rsync` 更容易指定一个非标准的 ssh 端口。例如,如果 `server` 使用 8022 端口的 SSH 连接,那么这些命令就会像这样: + +``` +$ scp -P 8022 foo.txt me@server:/home/me/ +``` + +而在使用 `rsync` 时,你必须指定要使用的“远程 shell”命令,默认是 `ssh`。你可以使用 `-e` 标志来指定。 + +``` +$ rsync -e 'ssh -p 8022' foo.txt me@server:/home/me/ +``` + +`rsync` 会使用你的 `ssh` 配置;但是,如果你经常连接到这个服务器,你可以在你的 `~/.ssh/config` 文件中添加以下代码。这样你就不需要再为 `rsync` 或 `ssh` 命令指定端口了! + +``` +Host server + Port 8022 +``` + +另外,如果你连接的每一台服务器都在同一个非标准端口上运行,你还可以配置 `RSYNC_RSH` 环境变量。 + +### 为什么你还是应该切换到 rsync? + +现在我们已经介绍了从 `scp` 切换到 `rsync` 的日常使用案例和注意事项,让我们花一些时间来探讨一下为什么你可能想要使用 `rsync` 的优点。很多人在很久以前就已经开始使用 `rsync` 了,就是因为这些优点。 + +#### 即时压缩 + +如果你和服务器之间的网络连接速度较慢或有限,`rsync` 可以花费更多的 CPU 处理能力来节省网络带宽。它通过在发送数据之前对数据进行即时压缩来实现。压缩可以用 `-z` 标志来启用。 + +#### 差量传输 + +`rsync` 也只在目标文件与源文件不同的情况下复制文件。这可以在目录中递归地工作。例如,如果你拿我们上面的最后一个 `bar` 的例子,并多次重新运行那个 `rsync` 命令,那么在最初的传输之后就不会有任何传输。如果你知道你会重复使用这些命令,例如备份到 U 盘,那么使用 `rsync` 即使是进行本地复制也是值得的,因为这个功能可以节省处理大型数据集的大量的时间。 + +#### 同步 + +顾名思义,`rsync` 可以做的不仅仅是复制数据。到目前为止,我们只演示了如何使用 `rsync` 复制文件。如果你想让 `rsync` 把目标目录变成源目录的样子,你可以在 `rsync` 中添加删除标志 `-delete`。这个删除标志使得 `rsync` 将从源目录中复制不存在于目标目录中的文件,然后它将删除目标目录中不存在于源目录中的文件。结果就是目标目录和源目录完全一样。相比之下,`scp` 只会在目标目录下添加文件。 + +### 结论 + +对于简单的使用情况,`rsync` 并不比老牌的 `scp` 工具复杂多少。唯一显著的区别是在递归复制目录时使用 `-a` 而不是 `-r`。然而,正如我们看到的,`rsync` 的 `-a` 标志比 `scp` 的 `-r` 标志更像 `cp` 的 `-r` 标志。 + +希望通过这些新命令,你可以加快你的文件传输工作流程。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/scp-users-migration-guide-to-rsync/ + +作者:[chasinglogic][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/chasinglogic/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/07/scp-rsync-816x345.png +[2]: https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html diff --git a/published/202009/20200728 How to create a documentation site with Docsify and GitHub Pages.md b/published/202009/20200728 How to create a documentation site with Docsify and GitHub Pages.md new file mode 100644 index 0000000000..5c67a47e64 --- /dev/null +++ b/published/202009/20200728 How to create a documentation site with Docsify and GitHub Pages.md @@ -0,0 +1,259 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12572-1.html) +[#]: subject: (How to create a documentation site with Docsify and GitHub Pages) +[#]: via: (https://opensource.com/article/20/7/docsify-github-pages) +[#]: author: (Bryant Son https://opensource.com/users/brson) + +如何使用 Docsify 和 GitHub Pages 创建一个文档网站 +====== + +> 使用 Docsify 创建文档网页并发布到 GitHub Pages 上。 + +![](https://img.linux.net.cn/data/attachment/album/202009/01/211718hws6rvvziks2zrkc.jpg) + +文档是帮助用户使用开源项目一个重要部分,但它并不总是开发人员的首要任务,因为他们可能更关注的是使他们的应用程序更好,而不是帮助人们使用它。对开发者来说,这就是为什么让发布文档变得更容易是如此有价值的原因。在本教程中,我将向你展示一个这样做的方式:将 [Docsify][2] 文档生成器与 [GitHub Pages][3] 结合起来。  + +如果你喜欢通过视频学习,可以访问 YouTube 版本的教程: + +- [video](https://youtu.be/ccA2ecqKyHo) + +默认情况下,GitHub Pages 会提示用户使用 [Jekyll][4],这是一个支持 HTML、CSS 和其它网页技术的静态网站生成器。Jekyll 可以从以 Markdown 格式编码的文档文件中生成一个静态网站,GitHub 会自动识别它们的 `.md` 或 `.markdown` 扩展名。虽然这种设置很好,但我想尝试一下其他的东西。 + +幸运的是,GitHub Pages 支持 HTML 文件,这意味着你可以使用其他网站生成工具(比如 Docsify)在这个平台上创建一个网站。Docsify 是一个采用 MIT 许可证的开源项目,其具有可以让你在 GitHub Pages 上轻松创建一个有吸引力的、先进的文档网站的[功能][5]。 + +![Docsify][6] + +### 开始使用 Docsify + +安装 Docsify 有两种方法: + + 1. 通过 NPM 安装 Docsify 的命令行界面(CLI)。 + 2. 手动编写自己的 `index.html`。 + +Docsify 推荐使用 NPM 方式,但我将使用第二种方案。如果你想使用 NPM,请按照[快速入门指南][8]中的说明进行操作。 + +### 从 GitHub 下载示例内容 + +我已经在[该项目的 GitHub 页面][9]上发布了这个例子的源代码。你可以单独下载这些文件,也可以通过以下方式[克隆这个存储库][10]。 + +``` +git clone https://github.com/bryantson/OpensourceDotComDemos +``` + +然后 `cd` 进入 `DocsifyDemo` 目录。 + +我将在下面为你介绍这些代码,它们克隆自我的示例存储库中,这样你就可以理解如何修改 Docsify。如果你愿意,你也可以从头开始创建一个新的 `index.html` 文件,就像 Docsify 文档中的的[示例][11]一样: + +``` + + + + + + + + + + + +
    + + + + +``` + +### 探索 Docsify 如何工作 + +如果你克隆了我的 [GitHub 存储库][10],并切换到 `DocsifyDemo` 目录下,你应该看到这样的文件结构: + +![File contents in the cloned GitHub][19] + +文件/文件夹名称 | 内容 +---|--- +`index.html` | 主要的 Docsify 初始化文件,也是最重要的文件 +`_sidebar.md` | 生成导航 +`README.md` | 你的文档根目录下的默认 Markdown 文件 +`images` | 包含了 `README.md` 中的示例 .jpg 图片 +其它目录和文件 | 包含可导航的 Markdown 文件 + +`index.html` 是 Docsify 可以工作的唯一要求。打开该文件,你可以查看其内容: + +``` + + + + + + + + + + Docsify Demo + + +
    + + + + +``` + +这本质上只是一个普通的 HTML 文件,但看看这两行: + +``` + +... 一些其它内容 ... + +``` + +这些行使用内容交付网络(CDN)的 URL 来提供 CSS 和 JavaScript 脚本,以将网站转化为 Docsify 网站。只要你包含这些行,你就可以把你的普通 GitHub 页面变成 Docsify 页面。 + +`` 标签后的第一行指定了要渲染的内容: + +``` +
    +``` + +Docsify 使用[单页应用][21](SPA)的方式来渲染请求的页面,而不是刷新一个全新的页面。 + +最后,看看 ` +``` + +在这个块中: + + * `el` 属性基本上是说:“嘿,这就是我要找的 `id`,所以找到它并在那里呈现。” + * 改变 `repo` 值,以确定当用户点击右上角的 GitHub 图标时,会被重定向到哪个页面。 + ![GitHub icon][22] + * 将 `loadSideBar` 设置为 `true` 将使 Docsify 查找包含导航链接的 `_sidebar.md` 文件。 + +你可以在 Docsify 文档的[配置][23]部分找到所有选项。 + +接下来,看看 `_sidebar.md` 文件。因为你在 `index.html` 中设置了 `loadSidebar` 属性值为 `true`,所以 Docsify 会查找 `_sidebar.md` 文件,并根据其内容生成导航文件。示例存储库中的 `_sidebar.md` 内容是: + +``` + + + +* [HOME](./) + +* [Tutorials](./tutorials/index) + * [Tomcat](./tutorials/tomcat/index) + * [Cloud](./tutorials/cloud/index) + * [Java](./tutorials/java/index) + +* [About](./about/index) + +* [Contact](./contact/index) +``` + +这会使用 Markdown 的链接格式来创建导航。请注意 “Tomcat”、“Cloud” 和 “Java” 等链接是缩进的;这意味着它们被渲染为父链接下的子链接。 + +像 `README.md` 和 `images` 这样的文件与存储库的结构有关,但所有其它 Markdown 文件都与你的 Docsify 网页有关。 + +根据你的需求,随意修改你下载的文件。下一步,你将把这些文件添加到你的 GitHub 存储库中,启用 GitHub Pages,并完成项目。 + +### 启用 GitHub 页面 + +创建一个示例的 GitHub 存储库,然后使用以下 GitHub 命令检出、提交和推送你的代码: + +``` +$ git clone 你的 GitHub 存储库位置 +$ cd 你的 GitHub 存储库位置 +$ git add . +$ git commit -m "My first Docsify!" +$ git push +``` + +设置你的 GitHub Pages 页面。在你的新 GitHub 存储库中,点击 “Settings”: + +![Settings link in GitHub][24] + +向下滚动直到看到 “GitHub Pages”: + +![GitHub Pages settings][25] + +查找 “Source” 部分: + +![GitHub Pages settings][26] + +点击 “Source” 下的下拉菜单。通常,你会将其设置为 “master branch”,但如果你愿意,也可以使用其他分支: + +![Setting Source to master branch][27] + +就是这样!你现在应该有一个链接到你的 GitHub Pages 的页面了。点击该链接将带你到那里,然后用 Docsify 渲染: + +![Link to GitHub Pages docs site][28] + +它应该像这样: + +![Example Docsify site on GitHub Pages][29] + +### 结论 + +通过编辑一个 HTML 文件和一些 Markdown 文本,你可以用 Docsify 创建一个外观精美的文档网站。你觉得怎么样?请留言,也可以分享其他可以和 GitHub Pages 一起使用的开源工具。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/docsify-github-pages + +作者:[Bryant Son][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/brson +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet) +[2]: https://docsify.js.org +[3]: https://pages.github.com/ +[4]: https://docs.github.com/en/github/working-with-github-pages/about-github-pages-and-jekyll +[5]: https://docsify.js.org/#/?id=features +[6]: https://opensource.com/sites/default/files/uploads/docsify1_ui.jpg (Docsify) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://docsify.js.org/#/quickstart?id=quick-start +[9]: https://github.com/bryantson/OpensourceDotComDemos/tree/master/DocsifyDemo +[10]: https://github.com/bryantson/OpensourceDotComDemos +[11]: https://docsify.js.org/#/quickstart?id=manual-initialization +[12]: http://december.com/html/4/element/html.html +[13]: http://december.com/html/4/element/head.html +[14]: http://december.com/html/4/element/meta.html +[15]: http://december.com/html/4/element/link.html +[16]: http://december.com/html/4/element/body.html +[17]: http://december.com/html/4/element/div.html +[18]: http://december.com/html/4/element/script.html +[19]: https://opensource.com/sites/default/files/uploads/docsify3_files.jpg (File contents in the cloned GitHub) +[20]: http://december.com/html/4/element/title.html +[21]: https://en.wikipedia.org/wiki/Single-page_application +[22]: https://opensource.com/sites/default/files/uploads/docsify4_github-icon_rev_0.jpg (GitHub icon) +[23]: https://docsify.js.org/#/configuration?id=configuration +[24]: https://opensource.com/sites/default/files/uploads/docsify5_githubsettings_0.jpg (Settings link in GitHub) +[25]: https://opensource.com/sites/default/files/uploads/docsify6_githubpageconfig_rev.jpg (GitHub Pages settings) +[26]: https://opensource.com/sites/default/files/uploads/docsify6_githubpageconfig_rev2.jpg (GitHub Pages settings) +[27]: https://opensource.com/sites/default/files/uploads/docsify8_setsource_rev.jpg (Setting Source to master branch) +[28]: https://opensource.com/sites/default/files/uploads/docsify9_link_rev.jpg (Link to GitHub Pages docs site) +[29]: https://opensource.com/sites/default/files/uploads/docsify2_examplesite.jpg (Example Docsify site on GitHub Pages) diff --git a/published/202009/20200804 Leaving Google- Five Years On.md b/published/202009/20200804 Leaving Google- Five Years On.md new file mode 100644 index 0000000000..796b5b0c01 --- /dev/null +++ b/published/202009/20200804 Leaving Google- Five Years On.md @@ -0,0 +1,141 @@ +[#]: collector: (lujun9972) +[#]: translator: (JonnieWayy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12614-1.html) +[#]: subject: (Leaving Google: Five Years On) +[#]: via: (https://theartofmachinery.com/2020/08/04/leaving_google.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) + +离开 Google:五年以来 +====== + +![](https://img.linux.net.cn/data/attachment/album/202009/14/231115kqsf6q25s25ms66m.jpg) + +大约五年前的今天,我上交了 Google 员工证,然后走出了悉尼 Google 办公室,开启了一段自谋职业的崭新生活。我认为我应该详述一下这个故事,因为我通过阅读 [Michael Lynch][1] 的作品而收获颇丰。正如你所看到的,我仍然花费了几年时间才开始考虑写这篇文章,但是最终我告诉自己,倘若我不在五周年纪念日写它,我就永远也不会写了。 + +这篇文章有点儿长,但是我希望它对那些对于在大型技术公司工作感兴趣的新开发人员或是想要离职的大型企业雇员能够有所帮助。我将谈谈我进入 Google,在 Google 工作和辞职的故事,以及之后我做了什么。如果你想了解更多的细节,可以随时询问,不过我已经有很多博文要写,所以不能保证有什么深入的内容。 + +同样地,冒着显而易见的劳工风险:我已经有 5 年不在 Google 工作了,所以请不要以这个故事来作为当今 Google 或是 Google 雇员经历全貌的字面描述。但是,我认为其中的许多内容仍然与一般性的技术职业有关。 + +### 通往 Google 的艰辛道路 + +2005 年,我获得了第一份带薪的编程工作,是在当地的电力公司工作,把一些旧的 Pascal 代码用不同的编译器在不同的操作系统上运行。这基本上只是我为了挣外快而做的暑期工,同年我还刚刚开始攻读我数学和物理的学位。他们很高兴有一个本科生能够胜任这份工作。我被这些大人吓了一跳,因为他们不仅只是对我的编程爱好感兴趣,而且真的还会为此给我钱。 + +直到 2007 年毕业以前,我一直在做类似的工作。我喜欢编程工作,而 Google 是一家从事着很酷的编程工作的很酷的公司,因此我申请了实习。 Google 的面试过程以困难而著称,所以我花了好几个星期时间练习了所有我在网上能够找到的 Google 面试题。我认为 13 年里面试流程并没有发生太大的变化 —— 我提交了简历,受邀参加了几轮电话面试,这些面试问的几乎都是算法问题(我记得有一个动态规划问题和一个分治几何问题)。我通过了最初的几轮面试,然后受邀前往悉尼接受了由 Google 的工程师们进行的为期一天的现场面试。我回到家里,等待 Google HR 的电话,这个过程漫长得像是有一辈子。我被拒绝了。 + +对于我们收到的拒绝和失败感到难过很自然,因此我们并不会经常谈及它们。但是出于同样的原因,其他人也不会去谈论他们自己的失败,这只会使得情况变得更加糟糕。当我后来真的进入 Google 时,我觉得作为一个此前被拒绝过的人,我一定有哪里做得不对,但是有一天我和一群同事坐在一张桌子旁,开始交谈。那时候我才发现,实际上我身边的很多人都至少被拒绝过一次。我甚至都不是“最差的”。有个家伙开玩笑说,他肯定是因为 Google HR 厌倦了拒绝他才得以进来的。我说的也是一些相当厉害的工程师 —— 有些人负责着我一直在用的代码,而我打赌你也在用。 + +进行面试的公司通常会为每个名额面试两名或更多的候选人。这意味着比起录用,会有更多的拒绝,所以一般面试参与者被拒绝的可能性要大于被录用。然而我们一直忘记了这一点。四个开发人员参加面试,一个被录用了,其他三个在社交媒体上抱怨这场面试是如何的漏洞百出,因为他们个人被拒绝了。当然,面试远非完美,但是我们需要停止如此个人化地谈论它。 + +只要你能够找到问题所在并知道如何去改进自己,拒绝和失败就没有那么糟糕。Google 的面试主要针对算法,我在其中磕磕拌拌地摸索,但绝对没有能够脱颖而出。 + +在被 Google 拒绝以后,我得到了两样东西,并进行了为期一年的休假。第一件东西是澳大利亚商务编号(ABN),我用它来提供数学与科学补习课程,以及技术工作合同。我获得的另一样东西是一张大学科技图书馆的借书证。我当时并不打算再次去参加 Google 的面试,但是那次的面试经历告诉我还有很多东西是我所不知道的。我就在图书馆开设课程给大家做辅导,并在期间阅读书籍。顺便说一句,有些人认为我为我的补习业务所做的所有这些财务工作和其他东西很奇怪,而大多数补习老师都只收现金。但是我学到了许多对我日后生活很有帮助的东西,所以我一点儿都不后悔。 + +2009 年,我根据一个叫 Persi Diaconis 的魔术师转行为数学家的作品,进行了一个数学荣誉课程(也就是学士学位四年级)。计算机科学系让我选修他们的一个算法单元作为其中的一部分。 + +就像我所说的那样,我本来并没有打算再去 Google 面试,但是让我快速地讲讲这是怎么发生的。我从高中就开始学习日语,因此在 2012 年,我决定尝试在东京生活。这基本上行得通,除了我犯了一个相当大的错误 —— 我没有任何日语方面的纸质资质证明,因此很难获得工作面试。最终,我的一个已经被 Google 录用的朋友建议我再试一次。与 Google 所有的办事处一样, Google 东京的官方商务语言是英语,因此他们不要求我具有日语资质证明。 + +### Google 面试,再一次 + +我的朋友向 Google HR 推荐了我。这绝对有帮助,但是如果你自己得到了被推荐的机会,也不要太过于兴奋。它所能够确保的是你的简历会被注意到(不是小事)并且免去一次电话面试,但你仍然得通过剩下的电话面试和现场面试。 + +这一次我用来自 [Project Euler][2] 和 [Google CodeJam][3] 的题进行练习。电话面试过程中,我不得不在 Google Doc 上进行一些在线编程,这有点儿尴尬,但是除此以外电话面试一切顺利。然后我受邀前往六本木的 Mori Tower 办公室进行了为期一天的现场面试。 + +![Mori Tower in Tokyo, where I interviewed for Google. It's the sixth tallest building in the city, which means it's huge. \(Photo from here.\)][4] + +我的首个面试非常糟糕。我的脑子僵住了。我知道我能够解出那些题目,但是直到面试官走出房间我才想出答案。我立刻就感到很放松,并且意识到这是一个三元搜索问题。这是在是很令人沮丧,但是我觉得继续前进,看看剩下的面试进展如何。 + +其中的两道面试题很糟糕。其中之一直至今日仍然是我遇到过的最糟糕的面试问题。面试官说:“你用同一输入运行一个程序两次,得到了两个不同的结果。告诉我这是为什么。”我回答道:“当这种情况在现代计算机上发生而且并不在我的预期之中时,通常是竞态条件。”他只说:“不,这不是竞态条件。”然后看着我等着我的下一个回答。如果他有兴趣讨论一下的话,这个问题本该是一个很棒的问题,但是很显然他实际上只想玩“猜猜神秘数”。对于我所说的几乎全部内容,他只是回答:“不。”显然,该程序完全是确定性的,不存储任何状态,并且不依赖于环境(例如磁盘或是实时时钟),但却在每次执行时都给出不同的结果。我怀疑我们对于“被存储的状态”或是“环境”的含义还是某些东西有着不同的理解,但是我无法区分。有一次(变得绝望了)我试着问电子元件的温度变化是否会有影响,而他说:“不,那会是一个竞态条件,我已经告诉过你这不是竞态条件了。”最终,面试结束了,而我仍然不知道那个秘密数字是什么。 + +我讲这个故事的原因是,我听说过许多更为平淡的恐怖故事,用以证明面试官是憎恶面试者的坏人。然而,与流行的刻板印象所相反的是,当天的大多数面试基本上都还可以,面试官也很友好并且很尊重人。面试也着实很困难,因此最好减少面试官的工作量。希望那个“猜数字”面试官从 Google HR 那里得到的反馈是,他的问题对于作出聘用决定没什么帮助。 + +这次,面试带来了一份要约,但是有一个小问题:这份工作在悉尼,担任站点可靠性工程师(SRE)。我以前从未听说过 SRE,但是我和一位悉尼的资深 SRE 通了电话,他解释说他注意到了我在天然气行业从事嵌入式工程的经历,并且认为 SRE 会和适合我,因为同样强调可靠性与拟合紧密约束。 + +在东京花了大约一年时间来建立起自己的生活,我不想抛弃一切然后搬到悉尼,但是我绝不可能会拒绝一份来自 Google 的要约。与招聘人员交谈时,我确实犯了一个非常愚蠢的错误:我被问到当时能赚多少钱,然后我就脱口而出。[别这么做][5]。这意味着不管在面试中发生了什么事情,或是你上一份工作中被底薪了多少,或者其它什么。你可能会被拒绝,或者会在原来的薪水基础上得到一些象征性的提升,并且如果你试图进一步协商,会被认为疯狂而又不合理。就我而言,我的收入甚至远远低于 Google 的入门级职位。我无法肯定地说全是这样,但是在 2013 年我搬到了悉尼,在 Google Maps 成为了一名新毕业生级别的 SRE。 + +### 悉尼的 Google Maps SRE + +像 Maps 这样的产品实际上是若干个软件项目,每个都有自己的开发人员团队。甚至诸如路线查找之类的功能实际上也是多个软件项目 —— 从交通时刻表数据收集,到线路计算,再到结果渲染,等等等等。 SRE 的工作包含两个方面:一方面是为各个项目提供待命,实时响应任何生产事故;另一方面(在无需救火时)则是将生产事故中所积攒的经验应用到其他项目中去,并且发现其中可能出错的方式,或是发现使其性能更好的机会。Google 的 SRE 还需要像开发人员的内部咨询小组一样,对部署实践、自动化、监控或是类似的问题提供咨询。 + +这项工作相当紧张。作为一个团队,我们每周至少需要处理一次生产事故,否则就要为更多的服务提供支持。每个礼拜,悉尼的所有 SRE 都会聚在一起,交流发生过的故障事件或是有关如何使事情更好地运转的新技巧。学习曲线的感觉就像是再次成为了一名本科生。 + +我有时会感到震惊,听说我选择离开 Google 的人会问:“但是你不会想念那些福利吗?!”物质上的福利(例如伙食等等)绝对很棒,但是它们是你可以买到的东西,因此,不,它们不是我所想念的东西。如果你问我所想念的是什么,我会说是在那里工作的人们。与你可能听说过的不同,傲慢的人不喜欢在 Google 之类的地方工作。有一个臭名昭著的故事,一个自恋的人在 Google 找了份工作,并假装自己是各方面的顶级专家,让自己尴尬不已。他待了不到半年就离开了。总的来说,与我工作过的其他地方相比,这里的文化在傲慢、指责以及政治方面很少。另一方面,Google 并没有垄断好同事。 + +不过,有一种公司政治是个大问题。晋升需要“展示影响”,而众所周知的是,要做到这一点最简单的方法是发布一些新事物(不是惟一的方法,但是最简单)。结果是 Googler 们比起改进现有的解决方案,对于推广他们自己内测品质的原型方案更感兴趣。在 SRE 之间,我们经常开玩笑说, Google 内部有两种软件:一种是老的东西,工作得很好,但已经废弃了,甚至连考虑使用都是不够谷歌化的;另一种是热门的新东西,尽管它们还不能用,但却是今天 100% 可以使用的官方工具。作为 SRE,我们经常亲眼看到新的热点事物出了什么问题(有时甚至在没出 alpha 之前它就已经成了过时的旧东西)。([我此前已经对这类事物进行了更为深入的讨论。][6]) + +这不是我们这些愤世疾俗的 SRE 所想象的东西;这在公司中被公认为是一个问题,而我记得有人向我保证,晋升委员会已经开始通过维护工作等方式寻找关于其影响的证据。 + +### 晋升申请 + +2015 年,在 Google 工作了两年之后,我的经理告诉我,现在是时候申请一个高于我新毕业生水准的晋升了。晋升过程是每年两次由晋升委员会进行集中管理的。你可以先提出申请,然后加上一份对你所从事过的项目的简短描述,再加上同事的推荐信。委员会将会进行审查,然后给你赞成或反对的意见。仅仅有你经理的推荐是不够的,因为你的经理有想让你获得晋升的动机。手下有高级别的员工有助于你自己的职业发展。 + +长话短说,我提交了我的申请,而委员会说不。事实上,这是个相当糟糕的拒绝。我不记得详细的答复了,但感觉就像是委员会在我的申请中寻找可以不屑一顾的东西。例如,我从事过的一个项目是一个内部工具,它出现了功能需求的积压。我查看了这个项目,发现根本问题在于它已经超出了构建它的键值存储,需要一个合适的数据库。我主张切换到关系数据库,并实现了它:模式、数据迁移、查询、实时站点迁移等等。新查询的速度要快得多,而且(更重要的是)可以有效地支持新功能。在进行迁移之前,我必须要解决的一个问题是大部分代码没有被测试所覆盖,而这是由于大部分的代码都不可测试。我使用依赖注入以及[我此前讨论过的其他技巧][7]重构了代码,而这使我能够构建一组回归测试套件。我记得这个项目被驳回主要是被评价为测试单元的编写是“新毕业生水平的工作”。 + +我的经理真的很支持我,并且写了上诉。他没有给我看,但是我认为这是可以被缩减成 “WTF” 的若干页(更雄辩而详尽地论述)。以下是一些我也认为这一回复有点 “WTF” 的原因: + +Google SRE 有一种“关键人物”的概念。一个项目的关键人物有两个角色:一个是比起其他 SRE 对于软件项目有着更为深入的了解,以便你能够回答他们可能会提出的问题;另一个角色是作为项目本身的开发人员的第一联络人,以便他们的所有 SRE 问题都能得到回答。 Google 的职业阶梯指南说,关键人物不应该处于“新毕业生水准”,而应该晋升。正如我在申请中所写的,我是三个项目的关键人物。 + +我的关键人物经历使得想要找到同意支持我的晋升申请的资深开发人员很容易。当他们发现我是新毕业生级别时都十分震惊。他们都同意支持我的申请,认可我已经处在了一个更高的级别。 + +在我的申请之中,我提到曾担任过一组新毕业实习生的导师。当我提出申请时,他们之中的许多人都已经被聘用为了正式雇员。我足够资深,可以去担任他们的导师,但是还绝不足以晋升到比他们更高的级别。 + +给我经理上诉的回复与最初的审查截然不同。这次,我“大大超出了对于我‘新毕业生’级别工作的期望”,但是问题在于他们需要稍多一些时间来确保我能够晋升到新毕业生加一的级别。我被告知在接下来的 6 个月时间里,倘若我能够继续超出预期,直到下一个晋升周期,也许那时我就会得到晋升。上诉结束了;这就是最终结果。 + +我写了一封电子邮件,表示我要采取另一种选择。就像许多科技公司一样, Google 也有员工持股计划。在开始工作时,你会得到一笔象征性的补助金,而在各个“投资”里程碑时刻,你会收到真正的股份。我的下一次股票授予是在几个月之后。从那以后,我将不再为 Google 工作。 + +### 我离开的原因 + +任何辞职的决定并不容易,而某天你或许会面临同样的抉择。以下是一些有助于我作出决定的因素。([我在以前的一篇贴子里对一些这类想法进行了更深入的解释。][8]) + +如果你思考一下,考虑到我并不是字面意义上真正的应届毕业生, Google 的评价应该是这样的:“你正在做一些非常错误的事情。在 X、 Y 还有 Z 方面有所改进之前,你根本不会得到晋升。”被告知“你远远超出了预期,但是我们还需要 6 个月左右的时间”,这是毫无道理的。没有人关注我是否有能力做好我的工作。我得到了许多借口,但是没有能够帮助我提高的任何有用反馈。(注意:有时候你必须要明确地要求反馈。经理们可能会陷入捍卫自己所给出的绩效评级的陷阱,而不会去考虑报告是否需要反馈。) + +我也不确定晋升委员会会在 6 个月里看到什么他们在已经过去的 2 年时间里都没有看到的问题。他们难保不会再要求 6 个月时间?如果我需要花上多年时间来证明自己以获得新毕业生加一的级别晋升,那么我升到新毕业生加二的时候得有多老呢? + +刚加入 Google 时,我的工作级别无关紧要,因为我当时学到了那么多东西,并且能在我的简历里写入一家著名的公司。两年过后,等式变得不同了。 Google 所提供给我的未来所具有的价值正在下降,而 Google 之外机会的价值却正在上升。 Google 的职位实际上在 Google 之外几乎毫无意义。在过去的 5 年间,许多人都问过我在 Google 做过什么,但是没有一个人问我在 Google 是什么职位,也没人称我为“新毕业生”。尽管我在短期内受到了财务方面的打击,但实际上在我上交员工证的那天我就已经得到了晋升。 + +值得称赞的是,Google 没有做过任何类似于以下的事情,但是在其他公司中却很常见:试图让员工对于要求加薪感到内疚。在几年前我工作过的地方,一些工程师在一次成功发布会后,在许多紧要关头要求加薪。管理层扮演起了受害者的角色,并且指责工程师们是在“强迫他们”。(大约 6 个月时间后,他们失去了自己大部分的工程团队。)如果你真的愿意就辞职时间进行配合(例如,在发布日期之后,而不是前一周),并且愿意记录下你的知识并做了整理等等,那么你仅仅是由于雇主支付给你的工资不足而“强迫他们”。 + +名义上,我在 Google 留下了大量未授予的股票。但是知道你拥有股票时,股票才属于你。我只是得到了未来会有分红的承诺,而我可以将其除以所需的时间来将其转换为同等的工资率。为这项投资工作 2 个月是值得的,为了剩余的投资工作数年是不值得的。不要被授予股票的偏见所迷惑。 + +什么时候不应该辞职呢?嗯,与在其他地方相比,你能得到的很多吗?公司的职业发展道路不是天上掉下来的,他们是一系列的业务报价,代表着你将为什么样的公司评估而工作。如果你认为自己能得到很多(考虑到所有的薪酬和像是工作环境之类的无形资产),很好!否则,是时候认真考虑一下下一步该做什么了。 + +### 离开 Google 之后 + +我应当警告你的是,我采取了高增长的战略,但是牺牲了短期稳定性。如果对你而言稳定性更为重要,你应该做出不一样的选择。我的 A 计划、 B 计划、 C 计划都失败了,我最终花费了几个月时间苦苦找寻出路。最后,我在一家小型网店得到了一份合同,为 [Safety Town][9] 工作,一家政府建立的面向孩子们的道路安全网站。那里的薪水较之于 Google 是一个巨大的缩减,尤其是考虑到这是我几个月以来的第一份工作。但是,你知道,我真的很享受这个项目。当然了,它不像 Google 那么“酷”,而且可能一些学校里的孩子也不觉得它酷。另一方面,在 Google,我只是机器中的一个螺丝钉。 Safety Town 有一个小团队,每个人都扮演着至关重要的角色。在 Safety Town 项目中,我是后端工程师, Safety Town 当时是我唯一需要费心的事情。而且可能一些孩子已经在这个网站上学到了一两件有关道路安全的事情。从那以后,我做了很多项目,大多数都更大,但是我仍然会向人们展示 Safety Town。 + +![Screenshot of Safety Town home page, owned by Australian NSW government.][10] + +我记得 Google 悉尼办事处的一张海报,上面写着:“飞向月球吧!即使你错过了,你也会降落在群星之中!”人们很容易忘记,即使你不是在为知名公司或初创公司做“登月计划”,你也可以拥有高质量的生活。 + +这儿有一个帮助我获得合同的窍门。我会去参加悉尼的科技活动,站在能看到求职公告板的范围之中,等着看见有人在上面写东西。假设他们正在为一个保险公司项目写 CSS 开发方面的信息。即使我对 CSS 或保险不是特别感兴趣,我也会晃悠过去说:“嗨,这是个什么类型的保险项目?”这是最容易的开启谈话的方式,因为在他们努力往求职公告板上的狭小缝隙中写字的时候,满脑子都是这个项目。通常情况下,这样的谈话仍然不会为我带来一份工作,但是偶尔也会发现一些我能够帮上忙的东西。有些活动没有求职公告板,但是组织者们往往很乐意把麦克风递给别人几分钟。这为他们的活动增添了社区参与度。 + +我在做了一个政府采购的网站后,我取得了重大的突破,因为我学会了不至于对政府采购一窍不通。很难确切说出这些知识的价值,但是不到一年过后,我就签署了一份政府合同,比我此前所期望的要多了 40%。(不过,我如今没有做那么多的政府和大型企业的工作了。) + +大约一年半过后,我有了自己的一人公司。随着我声誉的建立,我逐渐获得了更多类似于 SRE 的工作。基本上,从事开发工作是我的“工作”,然后几个月后就有一个需要 SRE/DevOps 帮助的人联系了我。我事实上既喜欢 SRE,也喜欢纯开发工作,但是供求关系意味着 SRE 工作是个好工作。我仍然可以在空余时间编程。 + +说起这个,工作与生活的平衡是我在新生活中最喜欢的事情。没有人在两份合同之间给我酬劳,但是我可以通过在业余项目中学习新东西来充分利用这一间隙。在一个漫长而又紧张的合同之后,我休息了一下,[进行了为期一个月的背包徒步旅行,探索了日本乡村][11]。这是我期待了很长时间的一次旅行,但是在入职 Google 之前我需要更多的钱,而在 Google 供职期间我又需要更多的时间。自营职业远非没有压力,也不是适合每一个人的,但是有的压力会让你感到死气沉沉,有的压力则会让你越发充满活力。于我而言,自主营生是第二种,我想说,和在 Google 时相比,过去的 5 年间我的压力总体上有所减轻。对于我来说,至少我能够诚实地说我不后悔当初加入 Google,也不后悔当初离开 Google。 + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2020/08/04/leaving_google.html + +作者:[Simon Arneaud][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://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://mtlynch.io/why-i-quit-google/ +[2]: https://projecteuler.net +[3]: https://codingcompetitions.withgoogle.com/codejam +[4]: https://theartofmachinery.com/images/leaving_google/mori-tower.jpg +[5]: https://www.kalzumeus.com/2012/01/23/salary-negotiation/ +[6]: https://theartofmachinery.com/2019/03/19/hello_world_marketing.html +[7]: https://theartofmachinery.com/2016/03/28/dirtying_pure_functions_can_be_useful.html +[8]: https://theartofmachinery.com/2018/10/07/payrise_by_switching_jobs.html +[9]: https://www.safetytown.com.au/ +[10]: https://theartofmachinery.com/images/leaving_google/safetytown.png diff --git a/published/202009/20200813 How to use printf to format output.md b/published/202009/20200813 How to use printf to format output.md new file mode 100644 index 0000000000..1afc039622 --- /dev/null +++ b/published/202009/20200813 How to use printf to format output.md @@ -0,0 +1,207 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12573-1.html) +[#]: subject: (How to use printf to format output) +[#]: via: (https://opensource.com/article/20/8/printf) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +如何使用 printf 来格式化输出 +====== + +> 来了解一下 printf ,一个神秘的、灵活的和功能丰富的函数,可以替换 echo、print 和 cout。 + +![](https://img.linux.net.cn/data/attachment/album/202009/02/001109wp3xdtr27xop25e7.jpg) + +当我开始学习 Unix 时,我很早就接触到了 `echo` 命令。同样,我最初的 [Python][2] 课程也涉及到了 `print` 函数。再想起学习 C++ 和 [Java][2] 时学到 `cout` 和 `systemout`。似乎每种语言都骄傲地宣称拥有一种方便的单行输出方法,并生怕这种方式要过时一样宣传它。 + +但是当我翻开中级教程的第一页后,我遇到了 `printf`,一个晦涩难懂的、神秘莫测的,又出奇灵活的函数。本文一反向初学者隐藏 `printf` 这个令人费解的传统,旨在介绍这个不起眼的 `printf` 函数,并解释如何在几乎所有语言中使用它。 + +### printf 简史 + +术语 `printf` 代表“格式化打印print formatted”,它可能最早出现 [Algol 68][3] 编程语言中。自从它被纳入到 C 语言后,`printf` 已经在 C++、Java、Bash、PHP 中一次次重新实现,并且很可能在你最喜欢的 “后 C” 语言中再次出现。 + +显然,它很受欢迎,但很多人认为它的语法很复杂,尤其是与 `echo` 或 `print` 或 `cout` 等替代的函数相比尤为明显。例如,这是在 Bash 中的一个简单的 `echo` 语句: + +``` +$ echo hello +hello +$ +``` + +这是在 Bash 中使用 `printf` 得到同样结果: + +``` +$ printf "%s\n" hello +hello +$ +``` + +但是所增加的复杂性反而让你拥有很多功能,这是为什么 `printf` 值得学习的确切原因。 + +### printf 输出 + +在 `printf` 背后的基本思想是:它能够基于与内容*分离的*样式信息来格式化输出。例如,这里是 `printf` 认可的视作特殊字符的特定序列集合。你喜欢的语言可能会有或多或少的序列,但是通常包含: + + * `\n`: 新行 + * `\r`: 回车换行 + * `\t`: 水平制表符 + * `\NNN`: 一个包含一个到三个数字,使用八进制值表示的特殊字节 + +例如: + +``` +$ printf "\t\123\105\124\110\n" +     SETH +$ +``` + +在这个 Bash 示例中, `printf` 渲染一个制表符后,然后是分配给四个八进制值字符串的 ASCII 字符,并以一个生成一个新行(`\n`)的控制序列结束。 + +如果同样使用 `echo` 来输出会产生更多的字符: + +``` +$ printf "\t\123\105\124\110\n" +\t\123\105\124\110\n +$ +``` + +使用 Python 的 `print` 函数来完成同样的任务,你会发现 Python 的 `print` 命令比你想象的要强大: + +``` +>>> print("\t\123\n") +        S + +>>> +``` + +显然,Python 的 `print` 包含传统的 `printf` 特性以及简单的 `echo` 或 `cout` 的特性。 + +不过,这些示例包括的只是文字字符,尽管在某些情况下它们也很有用,但它们可能是 `printf` 最不重要的部分。`printf` 的真正的威力在于格式化说明。 + +### 使用 printf 格式化输出 + +格式化说明符是以一个百分号(`%`)开头的字符。 + +常见的格式化说明符包括: + + * `%s`: 字符串 + * `%d`: 数字 + * `%f`: 浮点数字 + * `%o`: 一个八进制的数字 + +这些格式化说明符是 `printf` 语句的占位符,你可以使用一个在其它地方提供的值来替换你的 `printf` 语句中的占位符。这些值在哪里提供取决于你使用的语言和它的语法,这里有一个简单的 Java 例子: + +``` +string var="hello\n"; +system.out.printf("%s", var); +``` + +把这个代码包裹在适当的样板文件中,在执行后,将呈现: + +``` +$ ./example +hello +$ +``` + +但是,当一个变量的内容更改时,有意思的地方就来了。假设你想基于不断增加的数字来更新输出: + +``` +#include + +int main() { +  int var=0; +  while ( var < 100) { +    var++; +  printf("Processing is %d% finished.\n", var); +  } +  return 0; +} +``` + +编译并运行: + +``` +Processing is 1% finished. +[...] +Processing is 100% finished. +``` + +注意,在代码中的两个 `%` 将被解析为一个打印出来的 `%` 符号。 + +### 使用 printf 限制小数位数 + +数字也可以是很复杂,`printf` 提供很多格式化选项。你可以对浮点数使用 `%f` 限制打印出多少个小数位。通过把一个点(`.`)和一个限制的数放置在百分符号和 `f` 之间, 你可以告诉 `printf` 打印多少位小数。这是一个简单的用 Bash 写的简练示例: + +``` +$ printf "%.2f\n" 3.141519 +3.14 +$ +``` + +类似的语法也适用于其它的语言。这里是一个 C 语言的示例: + +``` +#include +#include + +int main() { +  fprintf(stdout, "%.2f\n", 4 * atan(1.0)); +  return 0; +} +``` + +对于三位小数,使用 `.3f` ,依次类推。 + +### 使用 printf 来在数字上添加逗号 + +因为位数大的数字很难解读,所以通常使用一个逗号来断开大的数字。你可以在百分号和 `d` 之间放置一个撇号(`'`),让 `printf` 根据需要添加逗号: + +``` +$ printf "%'d\n" 1024 +1,024 +$ printf "%'d\n" 1024601 +1,024,601 +$ +``` + +### 使用 printf 来添加前缀零 + +`printf` 的另一个常用的用法是对文件名称中的数字强制实行一种特定的格式。例如,如果你在一台计算机上有 10 个按顺序排列的文件,计算机可能会把 `10.jpg` 排在 `1.jpg` 之前,这可能不是你的本意。当你以编程的方式写一个到文件时,你可以使用 `printf` 来用前缀为 0 的字符形成文件名称。这是一个简单的用 Bash 写的简练示例: + +``` +$ printf "%03d.jpg\n" {1..10} +001.jpg +002.jpg +[...] +010.jpg +``` + +注意:每个数字最多使用 3 位数字。 + +### 使用 printf + +正如这些 `printf` 示例所显示,包括控制字符,尤其是 `\n` ,可能会冗长,并且语法相对复杂。这就是为什么开发像 `echo` 和 `cout` 之类的快捷方式的原因。不过,如果你时不时地使用 `printf` ,你就会习惯于这种语法,并且它也会变成你的习惯。我不认为 `printf` 有任何理由成为你在日常活动中打印时的*首选*,但是它是一个很好的工具,当你需要它时,它不会拖累你。 + +花一些时间学习你所选择语言中的 `printf`,并且当你需要时就使用它。它是一个强有力的工具,你不会后悔随时可用的工具。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/printf + +作者:[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/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer) +[2]: https://opensource.com/resources/python +[3]: https://opensource.com/article/20/6/algol68 +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html +[5]: http://www.opengroup.org/onlinepubs/009695399/functions/atan.html diff --git a/published/202009/20200823 Linux Jargon Buster- What is Desktop Environment in Linux.md b/published/202009/20200823 Linux Jargon Buster- What is Desktop Environment in Linux.md new file mode 100644 index 0000000000..63d9286ccb --- /dev/null +++ b/published/202009/20200823 Linux Jargon Buster- What is Desktop Environment in Linux.md @@ -0,0 +1,87 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12579-1.html) +[#]: subject: (Linux Jargon Buster: What is Desktop Environment in Linux?) +[#]: via: (https://itsfoss.com/what-is-desktop-environment/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是桌面环境? +====== + +![][6] + +在桌面 Linux 世界中,最常用的术语之一就是桌面环境Desktop Environment(DE)。如果你是 Linux 的新手,你应该了解一下这个经常使用的术语。 + +### 什么是 Linux 中的桌面环境? + +桌面环境是一个组件的组合体,为你提供常见的图形用户界面graphical user interface(GUI)元素组件,如图标、工具栏、壁纸和桌面小部件。借助桌面环境,你可以像在 Windows 中一样使用鼠标和键盘使用 Linux。 + +有几种不同的桌面环境,这些桌面环境决定了你的 Linux 系统的样子以及你与它的交互方式。 + +大多数桌面环境都有自己的一套集成的应用程序和实用程序,这样用户在使用操作系统时就能得到统一的感受。所以,你会得到一个文件资源管理器、桌面搜索、应用程序菜单、壁纸和屏保实用程序、文本编辑器等。 + +如果没有桌面环境,你的 Linux 系统就只有一个类似于终端的实用程序,你只能用命令与之交互。 + +![Screenshot of GNOME Desktop Environment][1] + +### Linux 中各种桌面环境 + +桌面环境有时也被简称为 DE。 + +如前所述,Linux 有[各种桌面环境可供选择][2]。为什么这么说呢? + +可以把桌面环境看成是衣服。衣服决定了你的样子。如果你穿紧身牛仔裤和平底鞋,你会很好看,但穿着这些衣服跑步或登山就不舒服了。 + +[GNOME][3] 这样桌面环境注重现代的外观和用户体验,而像 [Xfce][4] 这样的桌面环境更注重使用更少的计算资源,而不是花哨的图形。 + +![Screenshot of Xfce Desktop Environment][5] + +你的衣服取决于你的需要,决定了你的外观,桌面环境也是如此。你必须决定你是想要一些好看的东西,还是让你的系统运行得更快。 + +一些[流行的桌面环境][2]有: + + * GNOME - 使用大量的系统资源,但给你一个现代的、精致的系统 + * Xfce - 外观复古但占用资源很少 + * KDE - 可高度定制的桌面,适度占用系统资源 + * LXDE - 唯一的重点是尽可能少地使用资源 + * Budgie - 现代的外观和适度占用系统资源 + +### Linux 发行版及其桌面环境变体 + +同样的桌面环境可以在多个 Linux 发行版上使用,一个 Linux 发行版也可能提供多个桌面环境。 + +例如,Fedora 和 Ubuntu 都默认使用 GNOME 桌面,但 Fedora 和 Ubuntu 都提供了其他桌面环境。 + +Linux 的优点和灵活性在于,你可以自己在任何 Linux 发行版上安装桌面环境。但大多数 Linux 发行版都为你省去了这个麻烦,并为不同的桌面环境提供了随时安装的 ISO 镜像。 + +例如 [Manjaro Linux][7] 默认使用 Xfce,但如果你喜欢在 Manjaro 上使用 GNOME,也可以下载 GNOME 版本的 ISO。 + +### 最后... + +桌面环境是 Linux 桌面计算机的重要组成部分,而 Linux 服务器通常依靠命令行界面。并不是说不能在 Linux 服务器上安装桌面环境,但这是画蛇添足,浪费了重要的系统资源,而这些资源可以被服务器上运行的应用程序所利用。 + +我希望你现在对 Linux 中的桌面环境有了一些了解。我强烈推荐你阅读我的[关于什么是 Linux 以及为什么有这么多 Linux 发行版][8]的解释文章。我很有预感,你会喜欢我用它做的比喻。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/what-is-desktop-environment/ + +作者:[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://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/gnome-3-36-screenshot.jpg?resize=800%2C450&ssl=1 +[2]: https://itsfoss.com/best-linux-desktop-environments/ +[3]: https://www.gnome.org/ +[4]: https://www.xfce.org/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2015/12/Ubuntu-XFCE-Chromebook-e1451426418482-1.jpg?resize=701%2C394&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/what-is-desktop-environment-linux.png?resize=800%2C450&ssl=1 +[7]: https://manjaro.org/ +[8]: https://itsfoss.com/what-is-linux/ diff --git a/published/202009/20200824 Recognize more devices on Linux with this USB ID Repository.md b/published/202009/20200824 Recognize more devices on Linux with this USB ID Repository.md new file mode 100644 index 0000000000..ecd9d71005 --- /dev/null +++ b/published/202009/20200824 Recognize more devices on Linux with this USB ID Repository.md @@ -0,0 +1,170 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12612-1.html) +[#]: subject: (Recognize more devices on Linux with this USB ID Repository) +[#]: via: (https://opensource.com/article/20/8/usb-id-repository) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) + +利用这个 USB ID 仓库识别更多 Linux 上的设备 +====== + +> 这是一个包含了所有已知 USB 设备 ID 的开源项目。 + +![](https://img.linux.net.cn/data/attachment/album/202009/13/225426zpfbfopxhjxomuxf.jpg) + +市场上有成千上万的 USB 设备:键盘、扫描仪、打印机、鼠标和其他无数的设备,都能在 Linux 上工作。它们的供应商详情都存储在 USB ID 仓库中。 + +### lsusb + +Linux `lsusb` 命令列出了连接到系统的 USB 设备的信息,但有时信息不完整。例如,我最近注意到我的一个 USB 设备的品牌没有被识别。设备是可以使用的,但是在列出我所连接的 USB 设备的详情中没有提供任何识别信息。以下是我的 `lsusb` 命令的输出: + +``` +$ lsusb +Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub +Bus 001 Device 004: ID 046d:082c Logitech, Inc. +Bus 001 Device 003: ID 0951:16d2 Kingston Technology +Bus 001 Device 002: ID 18f8:1486   +Bus 001 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply +Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +``` + +正如你在最后一栏中看到的,有一个设备没有制造商描述。要确定这个设备是什么,我必须对我的 USB 设备树进行更深入的检查。幸运的是,`lsusb` 命令有更多的选项。其中一个选项是 `-D device`,来获取每个设备的详细信息,正如手册页面所解释的那样: + +> “不会扫描 `/dev/bus/usb` 目录,而只显示给定设备文件所属设备的信息。设备文件应该是类似 `/dev/bus/usb/001/001` 这样的文件。这个选项会像 `v` 选项一样显示详细信息,但你必须是 root 用户才行。" + +我认为如何将设备路径传递给 `lsusb` 命令并不容易,但在仔细阅读手册页和初始输出后,我能够确定如何构造它。USB 设备驻留在 UDEV 文件系统中。它们的设备路径始于 USB 设备目录 `/dev/bus/usb/`。路径的其余部分由设备的总线 ID 和设备 ID 组成。我的无描述设备是 `Bus 001 Device 002`,被翻译成了 `001/002`,完成的路径为 `/dev/bus/usb/001/002`。现在我可以把这个路径传给 `lsusb`。我还会用管道传给 `more`,因为这里往往有很多信息: + +``` +$ lsusb -D /dev/bus/usb/001/002 |more +Device: ID 18f8:1486   +Device Descriptor: +  bLength                18 +  bDescriptorType         1 +  bcdUSB               1.10 +  bDeviceClass            0 (Defined at Interface level) +  bDeviceSubClass         0 +  bDeviceProtocol         0 +  bMaxPacketSize0         8 +  idVendor           0x18f8 +  idProduct          0x1486 +  bcdDevice            1.00 +  iManufacturer           0 +  iProduct                1 +  iSerial                 0 +  bNumConfigurations      1 +  Configuration Descriptor: +    bLength                 9 +    bDescriptorType         2 +    wTotalLength           59 +    bNumInterfaces          2 +    bConfigurationValue     1 +    iConfiguration          0 +    bmAttributes         0xa0 +      (Bus Powered) +      Remote Wakeup +    MaxPower              100mA +    Interface Descriptor: +      bLength                 9 +      bDescriptorType         4 +      bInterfaceNumber        0 +      bAlternateSetting       0 +      bNumEndpoints           1 +      bInterfaceClass         3 Human Interface Device +      bInterfaceSubClass      1 Boot Interface Subclass +      bInterfaceProtocol      2 Mouse +      iInterface              0 +        HID Device Descriptor: +``` + +不幸的是,这里并没有提供我希望找到的细节。初始输出中出现的两个字段 `idVendor` 和 `idProduct` 都是空的。这有些帮助,因为往下看一下,就会发现 `Mouse` 这个词。所以,这个设备就是我的鼠标。 + +### USB ID 仓库 + +这让我不禁想知道如何才能填充这些字段,不仅是为了自己,也是为了其他 Linux 用户。原来已经有了一个开源项目:[USB ID 仓库][2]。它是一个公共仓库,它包含了 USB 设备中使用的所有已知 ID。它也被用于各种程序中,包括 [USB Utilities][3],用于显示人类可读的设备名称。 + +![The USB ID Repository Site][4] + +你可以从网站上或通过下载数据库来浏览特定设备的仓库。也欢迎用户提交新的数据。我要为我的鼠标提交数据,因为它没有在里面。 + +### 更新你的 USB ID + +USB ID 数据库存储在一个名为 `usb.ids` 的文件中。这个文件的位置可能会因 Linux 发行版的不同而不同。 + +在 Ubuntu 18.04 中,这个文件位于 `/var/lib/usbutils`。要更新数据库,使用命令 `update-usbids`,你需要用 root 权限或 `sudo` 来运行。 + +``` +$ sudo update-usbids +``` + +如果有新文件,它就会被下载。当前的文件将被备份,并被替换为新文件: + +``` +$ ls -la +total 1148 +drwxr-xr-x  2 root root   4096 Jan 15 00:34 . +drwxr-xr-x 85 root root   4096 Nov  7 08:05 .. +-rw-r--r--  1 root root 614379 Jan  9 15:34 usb.ids +-rw-r--r--  1 root root 551472 Jan 15 00:34 usb.ids.old +``` + +最新版本的 Fedora Linux 将数据库文件保存在 `/usr/share/hwdata` 中。而且,没有更新脚本。而是,数据库由一个名为 `hwdata` 的软件包维护。 + +``` +# dnf info hwdata + +Installed Packages +Name         : hwdata +Version      : 0.332 +Release      : 1.fc31 +Architecture : noarch +Size         : 7.5 M +Source       : hwdata-0.332-1.fc31.src.rpm +Repository   : @System +From repo    : updates +Summary      : Hardware identification and configuration data +URL          : https://github.com/vcrhonek/hwdata +License      : GPLv2+ +Description  : hwdata contains various hardware identification and configuration data, +             : such as the pci.ids and usb.ids databases. +``` + +现在我的 USB 设备列表在这个之前未命名的设备旁边显示了一个名字。比较一下上面的输出: + +``` +$ lsusb +Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub +Bus 001 Device 004: ID 046d:082c Logitech, Inc. HD Webcam C615 +Bus 001 Device 003: ID 0951:16d2 Kingston Technology +Bus 001 Device 014: ID 18f8:1486 [Maxxter] +Bus 001 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply +Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +``` + +你可能会注意到,随着仓库定期更新新设备和现有设备的详细信息,其他设备的描述也会发生变化。 + +### 提交新数据 + +提交新数据有两种方式:使用网站或通过电子邮件发送特殊格式的补丁文件。在开始之前,我阅读了提交指南。首先,我必须注册一个账户,然后我需要使用项目的提交系统提供我鼠标的 ID 和名称。添加任何 USB 设备的过程都是一样的。 + +你使用过 USB ID 仓库么?如果有,请在评论中分享你的反馈。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/usb-id-repository + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/usb-hardware.png?itok=ROPtNZ5V (Multiple USB plugs in different colors) +[2]: http://www.linux-usb.org/usb-ids.html +[3]: https://sourceforge.net/projects/linux-usb/files/ +[4]: https://opensource.com/sites/default/files/uploads/theusbidrepositorysite.png (The USB ID Repository Site) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202009/20200826 Create and run Python apps on your Android phone.md b/published/202009/20200826 Create and run Python apps on your Android phone.md new file mode 100644 index 0000000000..09d8138226 --- /dev/null +++ b/published/202009/20200826 Create and run Python apps on your Android phone.md @@ -0,0 +1,169 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12582-1.html) +[#]: subject: (Create and run Python apps on your Android phone) +[#]: via: (https://opensource.com/article/20/8/python-android-mobile) +[#]: author: (Phani Adabala https://opensource.com/users/adabala) + +在你的 Android 手机上创建和运行 Python 应用 +====== + +> 使用 Termux 和 Flask 在你的移动设备上创建、开发和运行一个网页应用。 + +![](https://img.linux.net.cn/data/attachment/album/202009/04/214901zsohgryndzrcs6zz.jpg) + +学习和使用 Python 是很有趣的。由于它越来越受欢迎,有越来越多的方式可以让计算世界比现在更好。 + +想象一下,只需一个 Android 移动设备和开源工具,就可以构建和运行一个 Python 应用,无论是开发一个命令行工具从互联网上获取你最喜欢的文章,还是启动一个直接在掌上设备运行的网页服务器,所有这些都可以实现。这将完全改变你对移动设备的看法,将它从一个仅仅让你消费内容的设备变成一个帮助你发挥创造力的设备。 + +在本文中,我将演示运行和测试一个简单的 Python 应用所需的所有的工具、软件包、步骤和各种零零散散的东西。我使用 [Flask 框架][2]来创建一个简单的 “Hello, World!” 应用,并在一个简单而强大的网页服务器上运行。最棒的是,这一切都发生在手机上。不需要笔记本或台式机。 + +### 在 Android 上安装 Termux + +首先,[安装 Termux 应用程序][3]。Termux 是一个强大的终端仿真器,它提供了所有最流行的 Linux 命令,加上数百个额外的包,以便于安装。它不需要任何特殊的权限,你可以使用默认的 [Google Play][4] 商店或开源应用仓库 [F-Droid][5] 来安装。 + +![Welcome to Termux][6] + +安装 Termux 后,启动它并使用 Termux 的 `pkg` 命令执行一些必要的软件安装。 + +订阅附加仓库 `root-repo`: + +``` +$ pkg install root-repo +``` + +执行更新,使所有安装的软件达到最新状态。 + +``` +$ pkg update +``` + +最后,安装 Python: + +``` +$ pkg install python +``` + +![Install Python][7] + +安装和自动配置完成后,就可以构建你的应用了。 + +### 在 Android 上构建一个 Android 应用 + +现在你已经安装了一个终端,你可以在很大程度上像使用另一台 Linux 电脑一样使用你的 Android 手机。这很好地展示了终端到底有多强大。 + +首先创建一个项目目录: + +``` +$ mkdir Source +$ cd Source +``` + +接下来,创建一个 Python 虚拟环境。这是 Python 开发者的常见做法,它有助于让你的 Python 项目独立于你的开发系统(在本例中是你的手机)。在你的虚拟环境中,你将能够安装特定于你应用的 Python 模块。 + +``` +$ python -m venv venv +``` + +激活你的新虚拟环境(注意,开头的两个点用空格隔开) + +``` +$ . ./venv/bin/activate +(env)$ +``` + +请注意你的 shell 提示符现在以 `(env)` 开头,表示你在虚拟环境中。 + +现在使用 `pip` 安装 Flask Python 模块。 + +``` +(env) $ pip install flask +``` + +### 在 Android 上写 Python 代码 + +你已经准备好了。现在你需要为你的应用编写代码。 + +要做到这一点,你需要有经典文本编辑器的经验。我使用的是 `vi`。如果你不熟悉 `vi`,请安装并试用 `vimtutor`,它(如其名称所暗示的)可以教你如何使用这个编辑器。如果你有其他你喜欢的编辑器,如 `jove`、`jed`、`joe` 或 `emacs`,你可以安装并使用其中一个。 + +现在,由于这个演示程序非常简单,你也可以直接使用 shell 的 heredoc 功能,它允许你直接在提示符中输入文本。 + +``` +(env)$ cat << EOF >> hello_world.py +> from flask import Flask +> app = Flask(__name__) +> +> @app.route('/') +> def hello_world(): +> return 'Hello, World!' +> EOF +(env)$ +``` + +这只有六行代码,但有了它,你可以导入 Flask,创建一个应用,并将传入流量路由到名为 `hello_world` 的函数。 + +![Vim on Android][8] + +现在你已经准备好了网页服务器的代码。现在是时候设置一些[环境变量][9],并在你的手机上启动一个网页服务器了。 + +``` +(env) $ export FLASK_APP=hello_world.py +(env) $ export FLASK_ENV=development +(evn) $ python hello_world.py +``` + +![Running a Flask app on your phone][10] + +启动应用后,你会看到这条消息: + +``` +serving Flask app… running on http://127.0.0.1:5000/ +``` + +这表明你现在在 localhost(也就是你的设备)上运行着一个微型网页服务器。该服务器正在监听来自 5000 端口的请求。 + +打开你的手机浏览器并进入到 `http://localhost:5000`,查看你的网页应用。 + +![Your web app][11] + +你并没有损害手机的安全性。你只运行了一个本地服务器,这意味着你的手机不接受来自外部世界的请求。只有你可以访问你的 Flask 服务器。 + +为了让别人看到你的服务器,你可以在 `run` 命令中加入 `--host=0.0.0.0` 来禁用 Flask 的调试模式。这会打开你的手机上的端口,所以要谨慎使用。 + +``` +(env) $ export FLASK_ENV=”” +(env) $ flask run –host=0.0.0.0 +``` + +按 `Ctrl+C` 停止服务器(使用特殊的 `Termux` 键来作为 `Ctrl` 键)。 + +### 决定下一步怎么做 + +你的手机可能不是一个严肃的网页应用的理想服务器平台,但这个例子证明了可能性是无限的。你可能会在 Android 手机上编程,只是因为这是一种方便的实践方式,或者因为你有一个令人兴奋的本地化网页应用的新想法,或者你只是碰巧使用 Flask 应用来完成自己的日常任务。正如爱因斯坦曾经说过的“想象力比知识更重要”,对于任何一个新手编码者,或者一个经验丰富的 Linux 或 Android 爱好者来说,这是一个有趣的小项目。它可以扩展到无穷的层次,所以让你的好奇心接手,并做出一些令人兴奋的东西! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/python-android-mobile + +作者:[Phani Adabala][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/adabala +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tux_penguin_linux_android.jpg?itok=ctgANLI7 (Tux and Android stuffed animals on shelf) +[2]: https://opensource.com/article/18/4/flask +[3]: https://opensource.com/article/20/8/termux +[4]: https://play.google.com/store/apps/details?id=com.termux +[5]: https://f-droid.org/repository/browse/?fdid=com.termux +[6]: https://opensource.com/sites/default/files/termux-flask-1_0.webp (Welcome to Termux) +[7]: https://opensource.com/sites/default/files/termux-install-python.webp (Install Python) +[8]: https://opensource.com/sites/default/files/termux-python-vim.webp (Vim on Android) +[9]: https://opensource.com/article/19/8/what-are-environment-variables +[10]: https://opensource.com/sites/default/files/termux-flask-run.webp (Running a Flask app on your phone) +[11]: https://opensource.com/sites/default/files/flask-app-android.webp (Your web app) diff --git a/published/202009/20200826 Customize your GNOME desktop theme.md b/published/202009/20200826 Customize your GNOME desktop theme.md new file mode 100644 index 0000000000..096944a7a7 --- /dev/null +++ b/published/202009/20200826 Customize your GNOME desktop theme.md @@ -0,0 +1,97 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12586-1.html) +[#]: subject: (Customize your GNOME desktop theme) +[#]: via: (https://opensource.com/article/20/8/gnome-themes) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) + +自定义你的 GNOME 桌面主题 +====== + +> 使用“优化”和它的用户主题扩展来改变你的 Linux UI。 + +![](https://img.linux.net.cn/data/attachment/album/202009/06/110116kmufkkc31akwfp1w.jpg) + +GNOME 是一个相当简单和精简的 Linux 图形用户界面(GUI),很多用户喜欢它的简约外观。虽然它基本上是开箱即用的,但你可以根据自己的喜好来定制 [GNOME][2] 。有了 GNOME “优化” 和用户主题扩展,你可以改变顶部栏、窗口标题栏、图标、光标和许多其他 UI 选项的外观。 + +### 开始使用 + +在你改变你的 GNOME 主题之前,你必须安装 “[优化][3]Tweaks” 并启用用户主题扩展。 + +#### 安装 GNOME “优化” + +你可以在 GNOME “软件”中找到“优化”,只需点击一个按钮就可以快速安装。 + +![Install Tweaks in Software Center][4] + +如果你喜欢命令行,请使用你的软件包管理器。例如,在 Fedora 或 CentOS 上: + +``` +$ sudo dnf install gnome-tweaks +``` + +在 Debian 或类似的发行版: + +``` +$ sudo apt install gnome-tweaks +``` + +#### 启用用户主题 + +要启用用户主题扩展,启动“优化”并选择“扩展Extensions”。找到 “用户主题User themes
    ”,点击滑块启用。 + +![Enable User Themes Extension][6] + +### 获取主题 + +现在你已经完成了这些预先条件,你已经准备好寻找和下载一些主题了。一个寻找新主题的好网站是 [GNOME-Look.org][7]。 + +在页面的左侧有一个主题类别的列表。当你找到一个你想要的主题,你需要下载它。我直接把 `.tar` 文件下载到我的家目录下的 `.themes` 目录(你可能需要先创建这个目录)。 + +``` +$ mkdir ~/.themes +``` + +如果你想让所有用户都能使用这个主题,请把它放在 `/usr/share/themes` 中。 + +``` +$ tar xvf theme_archive.tar.xz +``` + +下载后,解压压缩包。你可以删除 `.tar.xz` 文件以节省一些磁盘空间。 + +### 应用主题 + +要应用你的新主题,在“优化”中进入“外观Appearance”。在这里,你可以为你的桌面的每个方面选择不同的选项。 + +![Apply a theme][8] + +### 多样性是生活的调剂品 + +自从第一个图形界面面市以来,能够用不同的墙纸、颜色、字体等个性化电脑桌面一直是一个受欢迎的功能。GNOME “优化”和用户主题扩展可以在所有 GNU/Linux 操作系统上的 GNOME 桌面环境中实现这种自定义。而且开源社区还在持续提供广泛的主题、图标、字体和壁纸,任何人都可以下载、尝试和定制。 + +你最喜欢的 GNOME 主题是什么,你为什么喜欢它们?请在评论中分享。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/gnome-themes + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/custom_gnomes.png?itok=iG98iL8d (Gnomes in a window.) +[2]: https://www.gnome.org/ +[3]: https://wiki.gnome.org/Apps/Tweaks +[4]: https://opensource.com/sites/default/files/uploads/gnome-install_tweaks_gui.png (Install Tweaks in Software Center) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/gnome-enable_user_theme_extension.png (Enable User Themes Extension) +[7]: https://www.gnome-look.org +[8]: https://opensource.com/sites/default/files/uploads/gnome-apply_theme.png (Apply a theme) diff --git a/published/202009/20200826 Manage your software repositories with this open source tool.md b/published/202009/20200826 Manage your software repositories with this open source tool.md new file mode 100644 index 0000000000..47eee04059 --- /dev/null +++ b/published/202009/20200826 Manage your software repositories with this open source tool.md @@ -0,0 +1,85 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12617-1.html) +[#]: subject: (Manage your software repositories with this open source tool) +[#]: via: (https://opensource.com/article/20/8/manage-repositories-pulp) +[#]: author: (Melanie Corr https://opensource.com/users/melanie-corr) + +用这个开源工具管理你的软件仓库 +====== + +> 这篇文章介绍 Pulp,一个开源仓库管理解决方案,它的使用范围和功能在不断增长。 + +![](https://img.linux.net.cn/data/attachment/album/202009/15/205353hlidoullmmj44vzq.jpg) + +[Foreman][2] 是一个强大的管理和自动化产品,它为 Linux 环境的管理员提供了企业级的解决方案,它适用于四个关键场景:供应管理、配置管理、补丁管理和内容管理。Foreman 中内容管理功能的一个主要组成部分是由 Pulp 项目提供的。虽然 Pulp 是这个产品的一个组成部分,但它也是一个独立的、自由开源的项目,自身也在取得巨大的进步。 + +让我们来看看 Pulp 项目,特别是最新版本 Pulp 3 的功能。 + +### 什么是 Pulp? + +Pulp 是一个管理软件包仓库,并将其提供给大量的消费者的平台。你可以使用 Pulp 在不同环境中镜像、同步、上传和推广各种内容,如 RPM、Python 包、Ansible 集合、容器镜像等。如果你有几十个、几百个甚至上千个软件包,并需要更好的方式来管理它们,Pulp 可以帮助你。 + +最新的主要版本是 [Pulp 3][3],它于 2019 年 12 月发布。Pulp 3 是多年来收集用户需求的结晶,并对现有的 Pulp 架构进行了全面的技术改造,以提高可靠性和灵活性。另外,它还包含了大量的新功能。 + +### 谁在使用 Pulp? + +大多数情况下,在 Pulp 用户管理的企业软件环境中,内容的稳定性和可靠性是最重要的。Pulp 用户希望有一个平台来开发内容,而不用担心仓库可能会消失。他们希望以安全的方式在其生命周期环境的不同阶段推广内容,优化磁盘空间并扩展环境以满足新的需求。他们还需要灵活处理各种内容类型。Pulp 3 提供了这些以及更多功能。 + +### 在一处管理各类内容 + +安装 Pulp 后,你可以为你计划管理的内容类型添加[内容插件][4],将内容镜像到本地,添加私人托管的内容,并根据你的需求混合内容。例如,如果你是 Ansible 用户,而你又不想在 Ansible Galaxy 上托管你的私有内容,你可以添加 Pulp Ansible 插件,镜像你所需要的公共 Ansible 内容,并将 Pulp 作为一个内部平台,在你的组织中管理和分发可扩展的公共和私有 Ansible 角色和集合的混合。你可以用任何内容类型执行此操作。有各种各样的内容插件可供选择,包括 RPM、Debian、Python、容器和 Ansible 等等。还有一个文件插件,你可以用它来管理 ISO 镜像等文件。 + +如果你没有找到你所需的内容类型插件,Pulp 3 引入了新的插件 API 和插件模板,你可以轻松创建一个属于自己的 Pulp 插件。你可以根据[插件编写指南][5]自动生成一个最小可用的插件,然后从那里开始构建。 + +### 高可用性 + +在 Pulp 3 中,从 MongoDB 到 PostgreSQL 的转变促进了性能和数据完整性的重大改进。Pulp 用户现在有了一个完全开源的技术栈,它可以提供高可用性(HA)和更好的扩展性。 + +### 仓库版本管理 + +使用 Pulp 3,你可以毫无风险地进行试验。每次你添加或删除内容时,Pulp 都会创建一个不可变的仓库版本,这样你就可以回滚到早期的版本,从而保证操作的安全性和稳定性。通过使用发布和分发,你可以公开一个仓库的多个版本,你可以将其作为回滚到早期版本的另一种方法。如要回滚,你可以简单地将你的分发指向一个旧的发布。 + +### 磁盘优化 + +任何软件开发环境的主要挑战之一是磁盘优化。如果你不断地下载包,例如,你今天需要但明天不再需要的仓库每日构建,那么磁盘空间将很快成为一个问题。Pulp 3 的设计已经考虑到了磁盘优化。当默认下载并保存所有的软件包,你也可以启用“按需”或“流式”选项。“按需”选项只下载和保存客户要求的内容,从而节省了磁盘空间。使用“流式”选项,它也会根据客户的要求进行下载,但它不会将内容保存在 Pulp 中。这对于同步内容是非常理想的,例如,从一个每日仓库同步,并让你在后期免于执行磁盘清理。 + +### 多种存储选项 + +即使进行了最好的磁盘优化,随着项目的发展,你可能需要一种方法来扩展你的部署以满足需求。除了本地文件存储,Pulp 还支持一系列的云存储选项,如 Amazon S3 和 Azure,以确保你可以扩展满足你的部署需求。 + +### 保护你的内容 + +Pulp 3 可以选择添加 [Certguard][6] 插件,该插件提供了一个支持 X.509 的 ContentGuard,它要求客户在收到 Pulp 的内容之前提交证明其对内容的权利的证书。 + +只要客户端的证书没有过期,且由证书颁发机构签署,并在创建时存储在 Certguard 上,任何客户端在请求时提供基于 X.509 或基于 Red Hat 订阅管理证书都将获得授权。客户端使用安全传输层(TLS)提供证书,这证明客户端不仅有证书,还有它的密钥。你可以放心地开发,知道你的内容正在受到保护。 + +Pulp 团队也在积极为整个 Pulp 部署一个基于角色的访问控制系统,这样管理员就可以确保正确的用户可以访问正确的环境。 + +### 在容器中试用 Pulp + +如果你有兴趣亲自评估 Pulp 3,你可以使用 Docker 或 Podman 轻松[在容器中安装 Pulp 3][7]。Pulp 团队一直在努力简化安装过程。你也可以使用 [Ansible 剧本][8] 来自动完成 Pulp 3 的全部安装和配置。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/manage-repositories-pulp + +作者:[Melanie Corr][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/melanie-corr +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/fruit-orange-pomegranate-pulp-unsplash.jpg?itok=4cvODZDJ (Oranges and pomegranates) +[2]: https://opensource.com/article/17/8/system-management-foreman +[3]: https://pulpproject.org/about-pulp-3/ +[4]: https://pulpproject.org/content-plugins/ +[5]: https://docs.pulpproject.org/plugins/plugin-writer/index.html +[6]: https://pulp-certguard.readthedocs.io/en/latest/ +[7]: https://pulpproject.org/pulp-in-one-container/ +[8]: https://pulp-installer.readthedocs.io/en/latest/ diff --git a/published/202009/20200826 What is DNS and how does it work.md b/published/202009/20200826 What is DNS and how does it work.md new file mode 100644 index 0000000000..344cd3d372 --- /dev/null +++ b/published/202009/20200826 What is DNS and how does it work.md @@ -0,0 +1,135 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12602-1.html) +[#]: subject: (What is DNS and how does it work?) +[#]: via: (https://www.networkworld.com/article/3268449/what-is-dns-and-how-does-it-work.html) +[#]: author: (Keith Shaw, Josh Fruhlinger ) + +什么是 DNS,它是如何工作的? +====== + +> 域名系统解析互联网网站的名称及其底层 IP 地址,并在此过程中增加了效率和安全性。 + +![](https://images.techhive.com/images/article/2017/04/domain-name-systems-dns-100719737-large.jpg) + +域名系统Domain Name System(DNS)是互联网的基础之一,然而大多数不懂网络的人可能并不知道他们每天都在使用它来工作、查看电子邮件或在智能手机上浪费时间。 + +就其本质而言,DNS 是一个与数字匹配的名称目录。这些数字,在这里指的是 IP 地址,计算机用 IP 地址来相互通信。大多数对 DNS 的描述都是用电话簿来比喻,这对于 30 岁以上的人来说是没有问题的,因为他们知道电话簿是什么。 + +如果你还不到 30 岁,可以把 DNS 想象成你的智能手机的联系人名单,它将人们的名字与他们的电话号码及电子邮件地址进行匹配,然后这个联系人名单的就像地球上的人一样多。 + +### DNS 简史 + +当互联网还非常、非常小的时候,人们很容易将特定的 IP 地址与特定的计算机对应起来,但随着越来越多的设备和人加入到不断发展的网络中,这种简单的情况就没法持续多久了。现在仍然可以在浏览器中输入一个特定的 IP 地址来到达一个网站,但当时和现在一样,人们希望得到一个由容易记忆的单词组成的地址,也就是我们今天所认识的那种域名(比如 linux.cn)。在 20 世纪 70 年代和 80 年代早期,这些名称和地址是由一个人指定的,她是[斯坦福大学的 Elizabeth Feinler][2],她在一个名为 [HOSTS.TXT][3] 的文本文件中维护着一个主列表,记录了每一台连接互联网的计算机。 + +随着互联网的发展,这种局面显然无法维持下去,尤其是因为 Feinler 只处理加州时间下午 6 点之前的请求,而且圣诞节也要请假。1983 年,南加州大学的研究人员 Paul Mockapetris 受命在处理这个问题的多种建议中提出一个折中方案。但他基本上无视了所有提出的建议,而是开发了自己的系统,他将其称为 DNS。虽然从那时起,现今的它显然发生了很大的变化,但在基本层面上,它的工作方式仍然与将近 40 年前相同。 + +### DNS 服务器是如何工作的 + +将名字与数字相匹配的 DNS 目录并不是整个藏在互联网的某个黑暗角落。截至 2017 年底,[它记录了超过 3.32 亿个域名][4],如果作为一个目录确实会非常庞大。就像互联网本身一样,该目录分布在世界各地,存储在域名服务器(一般简称为 DNS 服务器)上,这些服务器都会非常有规律地相互沟通,以提供更新和冗余。 + +### 权威 DNS 服务器与递归 DNS 服务器的比较 + +当你的计算机想要找到与域名相关联的 IP 地址时,它首先会向递归recursive DNS 服务器(也称为递归解析器)提出请求。递归解析器是一个通常由 ISP 或其他第三方提供商运营的服务器,它知道需要向其他哪些 DNS 服务器请求解析一个网站的名称与其 IP 地址。实际拥有所需信息的服务器称为权威authoritative DNS 服务器。 + +### DNS 服务器和 IP 地址 + +每个域名可以对应一个以上的 IP 地址。事实上,有些网站有数百个甚至更多的 IP 地址与一个域名相对应。例如,你的计算机访问 [www.google.com][5] 所到达的服务器,很可能与其他国家的人在浏览器中输入相同的网站名称所到达的服务器完全不同。 + +该目录的分布式性质的另一个原因是,如果这个目录只在一个位置,在数百万,可能是数十亿在同一时间寻找信息的人中共享,那么当你在寻找一个网站时,你需要花费多少时间才能得到响应 —— 这就像是排着长队使用电话簿一样。 + +### 什么是 DNS 缓存? + +为了解决这个问题,DNS 信息在许多服务器之间共享。但最近访问过的网站的信息也会在客户端计算机本地缓存。你有可能每天使用 google.com 好几次。你的计算机不是每次都向 DNS 名称服务器查询 google.com 的 IP 地址,而是将这些信息保存在你的计算机上,这样它就不必访问 DNS 服务器来解析这个名称的 IP 地址。额外的缓存也可能出现在用于将客户端连接到互联网的路由器上,以及用户的互联网服务提供商(ISP)的服务器上。有了这么多的缓存,实际上对 DNS 名称服务器的查询数量比看起来要少很多。 + +### 如何找到我的 DNS 服务器? + +一般来说,当你连接到互联网时,你使用的 DNS 服务器将由你的网络提供商自动建立。如果你想看看哪些服务器是你的主要名称服务器(一般是递归解析器,如上所述),有一些网络实用程序可以提供关于你当前网络连接的信息。[Browserleaks.com][6] 是一个很好的工具,它提供了很多信息,包括你当前的 DNS 服务器。 + +### 我可以使用 8.8.8.8 的 DNS 吗? + +但要记住,虽然你的 ISP 会设置一个默认的 DNS 服务器,但你没有义务使用它。有些用户可能有理由避开他们 ISP 的 DNS —— 例如,有些 ISP 使用他们的 DNS 服务器将不存在的地址的请求重定向到[带有广告的网页][7]。 + +如果你想要一个替代方案,你可以将你的计算机指向一个公共 DNS 服务器,以它作为一个递归解析器。最著名的公共 DNS 服务器之一是谷歌的,它的 IP 地址是 8.8.8.8 和 8.8.4.4。Google 的 DNS 服务往往是[快速的][8],虽然对 [Google 提供免费服务的别有用心的动机][9]有一定的质疑,但他们无法真正从你那里获得比他们从 Chrome 浏览器中获得的更多信息。Google 有一个页面,详细说明了如何[配置你的电脑或路由器][10]连接到 Google 的 DNS。 + +### DNS 如何提高效率 + +DNS 的组织结构有助于保持事情的快速和顺利运行。为了说明这一点,让我们假设你想访问 linux.cn。 + +如上所述,对 IP 地址的初始请求是向递归解析器提出的。递归解析器知道它需要请求哪些其他 DNS 服务器来解析一个网站(linux.cn)的名称与其 IP 地址。这种搜索会传递至根服务器,它知道所有顶级域名的信息,如 .com、.net、.org 以及所有国家域名,如 .cn(中国)和 .uk(英国)。根服务器位于世界各地,所以系统通常会将你引导到地理上最近的一个服务器。 + +一旦请求到达正确的根服务器,它就会进入一个顶级域名(TLD)名称服务器,该服务器存储二级域名的信息,即在你写在 .com、.org、.net 之前的单词(例如,linux.cn 的信息是 “linux”)。然后,请求进入域名服务器,域名服务器掌握着网站的信息和 IP 地址。一旦 IP 地址被找到,它就会被发回给客户端,客户端现在可以用它来访问网站。所有这一切都只需要几毫秒的时间。 + +因为 DNS 在过去的 30 多年里一直在工作,所以大多数人都认为它是理所当然的。在构建系统的时候也没有考虑到安全问题,所以[黑客们充分利用了这一点][11],制造了各种各样的攻击。 + +### DNS 反射攻击 + +DNS 反射攻击可以用 DNS 解析器服务器的大量信息淹没受害者。攻击者使用伪装成受害者的 IP 地址来向他们能找到的所有开放的 DNS 解析器请求大量的 DNS 数据。当解析器响应时,受害者会收到大量未请求的 DNS 数据,使其不堪重负。 + +### DNS 缓存投毒 + +[DNS 缓存投毒][12]可将用户转移到恶意网站。攻击者设法在 DNS 中插入虚假的地址记录,这样,当潜在的受害者请求解析其中一个中毒网站的地址时,DNS 就会以另一个由攻击者控制的网站的 IP 地址作出回应。一旦访问了这些假网站,受害者可能会被欺骗,泄露密码或下载了恶意软件。 + +### DNS 资源耗尽 + +[DNS 资源耗尽][13]攻击可以堵塞 ISP 的 DNS 基础设施,阻止 ISP 的客户访问互联网上的网站。攻击者注册一个域名,并通过将受害者的名称服务器作为域名的权威服务器来实现这种攻击。因此,如果递归解析器不能提供与网站名称相关的 IP 地址,就会询问受害者的名称服务器。攻击者会对自己注册的域名产生大量的请求,并查询不存在的子域名,这就会导致大量的解析请求发送到受害者的名称服务器,使其不堪重负。 + +### 什么是 DNSSec? + +DNS 安全扩展是为了使参与 DNS 查询的各级服务器之间的通信更加安全。它是由负责 DNS 系统的互联网名称与数字地址分配机构Internet Corporation for Assigned Names and Numbers(ICANN)设计的。 + +ICANN 意识到 DNS 顶级、二级和三级目录服务器之间的通信存在弱点,可能会让攻击者劫持查询。这将允许攻击者用恶意网站的 IP 地址来响应合法网站的查询请求。这些网站可能会向用户上传恶意软件,或者进行网络钓鱼和网络欺骗攻击。 + +DNSSec 将通过让每一级 DNS 服务器对其请求进行数字签名来解决这个问题,这就保证了终端用户发送进来的请求不会被攻击者利用。这就建立了一个信任链,这样在查询的每一步,请求的完整性都会得到验证。 + +此外,DNSSec 可以确定域名是否存在,如果不存在,它就不会让该欺诈性域名交付给寻求域名解析的无辜请求者。 + +随着越来越多的域名被创建,越来越多的设备继续通过物联网设备和其他“智能”系统加入网络,随着[更多的网站迁移到 IPv6][14],将需要维持一个健康的 DNS 生态系统。大数据和分析的增长也[带来了对 DNS 管理的更大需求][15]。 + +### SIGRed: 蠕虫病毒 DNS 漏洞再次出现 + +最近,随着 Windows DNS 服务器缺陷的发现,全世界都看到了 DNS 中的弱点可能造成的混乱。这个潜在的安全漏洞被称为 SIGRed,[它需要一个复杂的攻击链][16],但利用未打补丁的 Windows DNS 服务器,有可能在客户端安装和执行任意恶意代码。而且该漏洞是“可蠕虫传播”的,这意味着它可以在没有人为干预的情况下从计算机传播到计算机。该漏洞被认为足够令人震惊,以至于美国联邦机构[被要求他们在几天时间内安装补丁][17]。 + +### DNS over HTTPS:新的隐私格局 + +截至本报告撰写之时,DNS 正处于其历史上最大的一次转变的边缘。谷歌和 Mozilla 共同控制着浏览器市场的大部分份额,他们正在鼓励向 [DNS over HTTPS][18](DoH)的方向发展,在这种情况下,DNS 请求将被已经保护了大多数 Web 流量的 HTTPS 协议加密。在 Chrome 的实现中,浏览器会检查 DNS 服务器是否支持 DoH,如果不支持,则会将 DNS 请求重新路由到谷歌的 8.8.8.8。 + +这是一个并非没有争议的举动。早在上世纪 80 年代就在 DNS 协议上做了大量早期工作的 Paul Vixie 称此举对安全来说是“[灾难][19]”:例如,企业 IT 部门将更难监控或引导穿越其网络的 DoH 流量。不过,Chrome 浏览器是无所不在的,DoH 不久就会被默认打开,所以让我们拭目以待。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3268449/what-is-dns-and-how-does-it-work.html + +作者:[Keith Shaw][a], [Josh Fruhlinger][c] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Keith-Shaw/ +[c]: https://www.networkworld.com/author/Josh-Fruhlinger/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/newsletters/signup.html +[2]: https://www.internethalloffame.org/blog/2012/07/23/why-does-net-still-work-christmas-paul-mockapetris +[3]: https://tools.ietf.org/html/rfc608 +[4]: http://www.verisign.com/en_US/domain-names/dnib/index.xhtml?section=cc-tlds +[5]: http://www.google.com +[6]: https://browserleaks.com/ip +[7]: https://www.networkworld.com/article/2246426/comcast-redirects-bad-urls-to-pages-with-advertising.html +[8]: https://www.networkworld.com/article/3194890/comparing-the-performance-of-popular-public-dns-providers.html +[9]: https://blog.dnsimple.com/2015/03/why-and-how-to-use-googles-public-dns/ +[10]: https://developers.google.com/speed/public-dns/docs/using +[11]: https://www.networkworld.com/article/2838356/network-security/dns-is-ubiquitous-and-its-easily-abused-to-halt-service-or-steal-data.html +[12]: https://www.networkworld.com/article/2277316/tech-primers/tech-primers-how-dns-cache-poisoning-works.html +[13]: https://www.cloudmark.com/releases/docs/whitepapers/dns-resource-exhaustion-v01.pdf +[14]: https://www.networkworld.com/article/3254575/lan-wan/what-is-ipv6-and-why-aren-t-we-there-yet.html +[15]: http://social.dnsmadeeasy.com/blog/opinion/future-big-data-dns-analytics/ +[16]: https://www.csoonline.com/article/3567188/wormable-dns-flaw-endangers-all-windows-servers.html +[17]: https://federalnewsnetwork.com/cybersecurity/2020/07/cisa-gives-agencies-a-day-to-remedy-windows-dns-server-vulnerability/ +[18]: https://www.networkworld.com/article/3322023/dns-over-https-seeks-to-make-internet-use-more-private.html +[19]: https://www.theregister.com/2018/10/23/paul_vixie_slaps_doh_as_dns_privacy_feature_becomes_a_standard/ +[20]: https://www.facebook.com/NetworkWorld/ +[21]: https://www.linkedin.com/company/network-world diff --git a/published/202009/20200827 Information could be half the world-s mass by 2245, says researcher.md b/published/202009/20200827 Information could be half the world-s mass by 2245, says researcher.md new file mode 100644 index 0000000000..4cd711cf56 --- /dev/null +++ b/published/202009/20200827 Information could be half the world-s mass by 2245, says researcher.md @@ -0,0 +1,60 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12592-1.html) +[#]: subject: (Information could be half the world's mass by 2245, says researcher) +[#]: via: (https://www.networkworld.com/article/3570438/information-could-be-half-the-worlds-mass-by-2245-says-researcher.html) +[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) + +研究人员表示,到 2245 年信息量可能占世界质量的一半 +====== + +> 根据一位理论物理学家的说法,由于创建和存储数字信息所使用的能源和资源数量,数据应该被视为物理的,而不仅仅是看不见的一和零。 + +![](https://images.idgesg.net/images/article/2019/07/global_connections_digital_world_map_planet_earth_particles_light_by_luza_studios_gettyimages-1022793086_2400x1600-100806717-large.jpg) + +一位大学学者建议,数字内容应该与气体、液体、等离子体和固体一样,被视为第五种物质状态。 + +英国朴茨茅斯大学高级讲师、发表在《AIP Advances》杂志上的《[信息灾难][1]》一文的作者 Melvin Vopson 称,由于以物理和数字方式创建、存储和分发数据所使用的能量和资源,数据已经发生了演变,现在应该被视为质量。 + +Vopson 还声称,数字比特正在走向压倒地球的道路,最终将超过原子的数量。 + +给数字信息分配质量的想法建立在一些现有数据点的基础之上。Vopson 引用了 IBM 的一项估计,发现数据每天以 2.5 万亿字节的速度产生。他还将每英寸超过 1 太比特terabit的数据存储密度考虑在内,将比特的大小与原子的大小进行比较。 + +假设数据生成量每年增长 50%,根据宣布 Vopson 研究的[媒体发布][2],“比特的数量将在大约 150 年内等于地球上的原子数量。” + +新闻稿中写道:“大约 130 年后,维持数字信息创造所需的动力将等于地球上目前产生的所有动力,到 2245 年,地球上一半的质量将转化为数字信息质量。” + +Vopson 补充说,COVID-19 大流行正在提高数字数据创造的速度,并加速这一进程。 + +他警告说,一个饱和点即将到来:“即使假设未来的技术进步将比特大小降低到接近原子本身的大小,这个数字信息量所占的比重将超过地球的大小,从而导致我们所定义的‘信息灾难’。”Vopson 在[论文][3]中写道。 + +“我们正在一点一点地改变这个星球,这是一场看不见的危机,”Vopson 说,他是希捷科技公司的前研发科学家。 + +Vopson 并不是一个人在探索,信息并不是简单的不可察觉的 1 和 0。根据发布的消息,Vopson 借鉴了爱因斯坦广义相对论中的质能对比;将热力学定律应用于信息的 Rolf Landauer 的工作;以及数字比特的发明者 Claude Shannon 的工作。 + +“当一个人将信息内容带入现有的物理理论中时,这几乎就像物理学中的一切都多了一个维度,”Vopson 说。 + +他的论文总结道,随着增长速度似乎不可阻挡,数字信息生产“将消耗地球上大部分的电力能源,从而导致道德和环境问题。”他的论文总结道。 + +有趣的是,除此以外,Vopson 还提出,如果像他所预测的那样,未来地球的质量主要由信息位组成,并且有足够的动力创造出来(不确定),那么“可以设想未来的世界主要由计算机模拟,并由数字比特和计算机代码主导,”他写道。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3570438/information-could-be-half-the-worlds-mass-by-2245-says-researcher.html + +作者:[Patrick Nelson][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Patrick-Nelson/ +[b]: https://github.com/lujun9972 +[1]: https://aip.scitation.org/doi/10.1063/5.0019941 +[2]: https://publishing.aip.org/publications/latest-content/digital-content-on-track-to-equal-half-earths-mass-by-2245/ +[3]: https://aip.scitation.org/doi/full/10.1063/5.0019941 +[4]: https://www.facebook.com/NetworkWorld/ +[5]: https://www.linkedin.com/company/network-world diff --git a/published/202009/20200827 Use this command-line tool to find security flaws in your code.md b/published/202009/20200827 Use this command-line tool to find security flaws in your code.md new file mode 100644 index 0000000000..3edc6fcfaa --- /dev/null +++ b/published/202009/20200827 Use this command-line tool to find security flaws in your code.md @@ -0,0 +1,129 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12576-1.html) +[#]: subject: (Use this command-line tool to find security flaws in your code) +[#]: via: (https://opensource.com/article/20/8/static-code-security-analysis) +[#]: author: (Ari Noman https://opensource.com/users/arinoman) + +使用命令行工具 Graudit 来查找你代码中的安全漏洞 +====== + +> 凭借广泛的语言支持,Graudit 可以让你在开发过程中的审计你的代码安全。 + +![](https://img.linux.net.cn/data/attachment/album/202009/03/114037qhi2h282wghbp74n.jpg) + +测试是软件开发生命周期(SDLC)的重要组成部分,它有几个阶段。今天,我想谈谈如何在代码中发现安全问题。 + +在开发软件的时候,你不能忽视安全问题。这就是为什么有一个术语叫 DevSecOps,它的基本职责是识别和解决应用中的安全漏洞。有一些用于检查 [OWASP 漏洞][2]的开源解决方案,它将通过创建源代码的威胁模型来得出结果。 + +处理安全问题有不同的方法,如静态应用安全测试(SAST)、动态应用安全测试(DAST)、交互式应用安全测试(IAST)、软件组成分析等。 + +静态应用安全测试在代码层面运行,通过发现编写好的代码中的错误来分析应用。这种方法不需要运行代码,所以叫静态分析。 + +我将重点介绍静态代码分析,并使用一个开源工具进行实际体验。 + +### 为什么要使用开源工具检查代码安全? + +选择开源软件、工具和项目作为开发的一部分有很多理由。它不会花费任何金钱,因为你使用的是一个由志趣相投的开发者社区开发的工具,而他们希望帮助其他开发者。如果你有一个小团队或一个初创公司,找到开源软件来检查你的代码安全是很好的。这样可以让你不必单独雇佣一个 DevSecOps 团队,让你的成本降低。 + +好的开源工具总是考虑到灵活性,它们应该能够在任何环境中使用,覆盖尽可能多的情况。这让开发人员更容易将该软件与他们现有的系统连接起来。 + +但是有的时候,你可能需要一个功能,而这个功能在你选择的工具中是不可用的。那么你就可以选择复刻其代码,在其上开发自己的功能,并在你的系统中使用。 + +因为,大多数时候,开源软件是由社区驱动的,开发的速度往往是该工具的用户的加分项,因为他们会根据用户的反馈、问题或 bug 报告来迭代项目。 + +### 使用 Graudit 来确保你的代码安全 + +有各种开源的静态代码分析工具可供选择,但正如你所知道的,工具分析的是代码本身,这就是为什么没有通用的工具适用于所有的编程语言。但其中一些遵循 OWASP 指南,尽量覆盖更多的语言。 + +在这里,我们将使用 [Graudit][3],它是一个简单的命令行工具,可以让我们找到代码库中的安全缺陷。它支持不同的语言,但有一个固定的签名集。 + +Graudit 使用的 `grep` 是 GNU 许可证下的工具,类似的静态代码分析工具还有 Rough Auditing Tool for Security(RATS)、Securitycompass Web Application Analysis Tool(SWAAT)、flawfinder 等。但 Graudit 的技术要求是最低的,并且非常灵活。不过,你可能还是有 Graudit 无法满足的要求。如果是这样,你可以看看这个[列表][4]的其他的选择。 + +我们可以将这个工具安装在特定的项目下,或者全局命名空间中,或者在特定的用户下,或者任何我们喜欢地方,它很灵活。我们先来克隆一下仓库。 + +``` +$ git clone https://github.com/wireghoul/graudit +``` + +现在,我们需要创建一个 Graudit 的符号链接,以便我们可以将其作为一个命令使用。 + +``` +$ cd ~/bin && mkdir graudit +$ ln --symbolic ~/graudit/graudit ~/bin/graudit +``` + +在 `.bashrc` (或者你使用的任何 shell 的配置文件)中添加一个别名。 + +``` +#------ .bashrc ------ + +alias graudit="~/bin/graudit" +``` + +重新加载 shell: + +``` +$ source ~/.bashrc # 或 +$ exex $SHELL +``` + +让我们通过运行这个来检查是否成功安装了这个工具。 + +``` +$ graudit -h +``` + +如果你得到类似于这样的结果,那么就可以了。 + +![Graudit terminal screen showing help page][5] + +*图 1 Graudit 帮助页面* + +我正在使用我现有的一个项目来测试这个工具。要运行该工具,我们需要传递相应语言的数据库。你会在 signatures 文件夹下找到这些数据库。 + +``` +$ graudit -d ~/gradit/signatures/js.db +``` + +我在现有项目中的两个 JavaScript 文件上运行了它,你可以看到它在控制台中抛出了易受攻击的代码。 + +![JavaScript file showing Graudit display of vulnerable code][6] + +![JavaScript file showing Graudit display of vulnerable code][7] + +你可以尝试在你的一个项目上运行这个,项目本身有一个长长的[数据库][8]列表,用于支持不同的语言。 + +### Graudit 的优点和缺点 + +Graudit 支持很多语言,这使其成为许多不同系统上的用户的理想选择。由于它的使用简单和语言支持广泛,它可以与其他免费或付费工具相媲美。最重要的是,它们正在开发中,社区也支持其他用户。 + +虽然这是一个方便的工具,但你可能会发现很难将某个特定的代码识别为“易受攻击”。也许开发者会在未来版本的工具中加入这个功能。但是,通过使用这样的工具来关注代码中的安全问题总是好的。 + +### 总结 + +在本文中,我只介绍了众多安全测试类型中的一种:静态应用安全测试。从静态代码分析开始很容易,但这只是一个开始。你可以在你的应用开发流水线中添加其他类型的应用安全测试,以丰富你的整体安全意识。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/static-code-security-analysis + +作者:[Ari Noman][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/arinoman +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_code_screen_display.jpg?itok=2HMTzqz0 (Code on a screen) +[2]: https://owasp.org/www-community/vulnerabilities/ +[3]: https://github.com/wireghoul/graudit +[4]: https://project-awesome.org/mre/awesome-static-analysis +[5]: https://opensource.com/sites/default/files/uploads/graudit_1.png (Graudit terminal screen showing help page) +[6]: https://opensource.com/sites/default/files/uploads/graudit_2.png (JavaScript file showing Graudit display of vulnerable code) +[7]: https://opensource.com/sites/default/files/uploads/graudit_3.png (JavaScript file showing Graudit display of vulnerable code) +[8]: https://github.com/wireghoul/graudit#databases diff --git a/published/202009/20200828 Use GraphQL as an API gateway to monitor microservices.md b/published/202009/20200828 Use GraphQL as an API gateway to monitor microservices.md new file mode 100644 index 0000000000..a9daa6a877 --- /dev/null +++ b/published/202009/20200828 Use GraphQL as an API gateway to monitor microservices.md @@ -0,0 +1,110 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12588-1.html) +[#]: subject: (Use GraphQL as an API gateway to monitor microservices) +[#]: via: (https://opensource.com/article/20/8/microservices-graphql) +[#]: author: (Rigin Oommen https://opensource.com/users/riginoommen) + +使用 GraphQL 作为 API 网关来监控微服务 +====== + +> 在问题导致关键的微服务瘫痪之前,使用 GraphQL 的监控功能帮助你及早发现问题。 + +![](https://img.linux.net.cn/data/attachment/album/202009/06/205052ve8eebyamcace4v8.jpg) + +[微服务][2]和 [GraphQL][3] 就像面包和黄油一样,是一个很好的组合。它们本身都很棒,结合起来就更棒了。了解你的微服务的健康状况是很重要的,因为它们运行着重要的服务。如果等到某个关键的服务崩溃了才诊断问题,那是很愚蠢的。让 GraphQL 帮助你及早发现问题并不需要花费太多精力。 + +![GraphQL in Microservices][4] + +常规的健康检查可以让你观察和测试你的服务,在问题影响到你的业务、客户或项目之前,尽早得到通知。说起来很简单,但健康检查到底要做什么呢? + +以下是我在设计服务检查时考虑的因素: + +服务器健康检查的要求: + + 1. 我需要了解我的微服务的可用性状态。 + 2. 我希望能够管理服务器的负载。 + 3. 我希望对我的微服务进行端到端(e2e)测试。 + 4. 我应该能够预测中断。 + +![Service health in microservices][5] + +### 做服务器健康检查的方法 + +进行健康检查可能比较棘手,因为理论上,你可以检查的东西几乎是无穷无尽的。我喜欢从小处着手,运行最基本的测试:ping 测试。这只是测试运行应用的服务器是否可用。然后,我加强测试以评估特定问题,思考服务器中最重要的元素。我想到那些如果突然消失的话将是灾难性的事情。 + + 1. **Ping 检查:**Ping 是最简单的监控类型。它只是检查你的应用是否在线。 + 2. **脚本化浏览器:**脚本化浏览器比较高级。像 [Selenium][6] 这样的浏览器自动化工具可以让你实现自定义的监控规则集。 + 3. **API 测试:**API 测试用于监控 API 端点。这是 ping 检查模型的高级版本,你可以根据 API 响应来定义监控计划。 + +### 使用 GraphQL 进行健康检查 + +在一个典型的基于 REST 的微服务中,你需要从头开始构建健康检查功能。这是一个时间密集型的过程,但使用 GraphQL 就不用担心了。 + +根据它的[网站][7]称: + +> “GraphQL 是一种用于 API 的查询语言,也是一种用现有数据完成这些查询的运行时环境。GraphQL 为你的 API 中的数据提供了一个完整的、可理解的描述,让客户有能力精确地仅查询他们所需要的东西,让 API 更容易随着时间的推移而进化,并实现强大的开发者工具。” + +当你启动一个 GraphQL 微服务时,你还可以获得监控微服务的运行状况的供给。这是一个隐藏的宝贝。 + +正如我上面提到的,你可以用 GraphQL 端点执行 API 测试以及 ping 检查。 + +Apollo GraphQL 服务器提供了一个默认的端点,它可以返回有关你的微服务和服务器健康的信息。它不是很复杂:如果服务器正在运行,它就会返回状态码 200。 + +默认端点是 `/.well-known/apollo/server-health`。 + +![Health Check with GraphQL][8] + +### 高级健康检查 + +在某些情况下,基本的健康检查可能不足以确保系统的完整性。例如,紧密耦合的系统需要更多的业务逻辑来确保系统的健康。 + +Apollo GraphQL 在定义服务器的同时,通过声明一个 `onHealthCheck` 函数来有效地管理这种情况。 + +``` +* Defining the Apollo Server */ +const apollo = new ApolloServer({ + playground: process.env.NODE_ENV !== 'production', + typeDefs: gqlSchema, + resolvers: resolver, + onHealthCheck: () => { + return new Promise((resolve, reject) => { + // Replace the `true` in this conditional with more specific checks! + if (true) { + resolve(); + } else { + reject(); + } + }); + } +}); +``` + +当你定义一个 `onHealthCheck` 方法时,它返回一个 promise,如果服务器准备好了,它就会返回 `resolve`,如果有错误,它就会返回 `reject`。 + +GraphQL 让监控 API 变得更容易。此外,在你的服务器基础架构中使用它可以使代码变得可扩展。如果你想尝试采用 GraphQL 作为你的新基础设施定义,请参见我的 GitHub 仓库中的[示例代码和配置][9]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/microservices-graphql + +作者:[Rigin Oommen][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/riginoommen +[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/what-are-microservices +[3]: https://opensource.com/article/19/6/what-is-graphql +[4]: https://opensource.com/sites/default/files/uploads/graphql-microservices.png (GraphQL in Microservices) +[5]: https://opensource.com/sites/default/files/uploads/servicehealth.png (Service health in microservices) +[6]: https://www.selenium.dev/ +[7]: https://graphql.org/ +[8]: https://opensource.com/sites/default/files/uploads/healthcheck.png (Health Check with GraphQL) +[9]: https://github.com/riginoommen/example-graphql diff --git a/published/202009/20200829 Best Free Online Markdown Editors That Are Also Open Source.md b/published/202009/20200829 Best Free Online Markdown Editors That Are Also Open Source.md new file mode 100644 index 0000000000..d15d98c8ff --- /dev/null +++ b/published/202009/20200829 Best Free Online Markdown Editors That Are Also Open Source.md @@ -0,0 +1,188 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12624-1.html) +[#]: subject: (Best Free Online Markdown Editors That Are Also Open Source) +[#]: via: (https://itsfoss.com/online-markdown-editors/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +免费开源的在线 Markdown 编辑器 +====== + +[Markdown][1] 是一种有用的轻量级[标记语言][2],很多人喜欢用它来编写文档或做网页发布。很多人都使用 Markdown 来写文章。 + +有[几个适用于 Linux 的 Markdown 编辑器][3],你可以安装并使用。 + +但是,如果你不想在你的系统上安装另一个程序怎么办?也许你暂时使用的系统无法安装一个应用程序?也许你只是想要一个能让你实时协作的 Markdown 编辑器? + +无论你的需求是什么,在线 Markdown 编辑器通过提供协作功能、发布集成、笔记同步和一些在线功能,让很多事情变得简单。 + +因此,我整理了一份在线 Markdown 编辑器列表。 + +### 免费的在线 Markdown 编辑器 + +我尽量把重点放在代码开源的在线 Markdown 编辑器上。你可以使用它们的官方网站或将其部署到你的服务器上。 + +注:本列表没有特定排名顺序。 + +#### 1、StackEdit + +![][4] + +[StackEdit][5] 是目前最流行的开源在线 Markdown 编辑器之一。 + +它提供了一个很好的用户界面,并有一堆有用的功能。协作能力、同步能力,以及能够将你的文件发布/保存到 Blogger、WordPress、GitHub 和其他一些服务是 StackEdit 的一些关键功能。 + +不要忘了,你还可以使用一些 Markdown 扩展来支持 LaTeX 数学表达式、UML 图等。它的界面是一个所见即所得的编辑器,可以让你轻松使用 Markdown。它还可以离线工作,如果你需要的话,它还提供了一个 chrome 应用程序和扩展。 + +在 StackEdit 上导入/导出文件也很容易。如果你需要在你的服务器上托管它,你可以看看它在 [GitHub][6] 上的源代码,了解更多细节。 + +- [StackEdit][7] + +#### 2、Dillinger + +![][8] + +Dillinger 也是一个有趣的开源在线 Markdown 编辑器。与 StackEdit 类似,你也可以与 Dropbox、GitHub、Medium、Google Drive、Bitbucket 和 OneDrive 链接并保存文件。 + +你也可以选择在需要时简单地导入/导出文件。Dillinger 的用户界面比你在 StackEdit 上看到的更简单,但它也可以工作。与 StackEdit 不同的是,你没有 LaTeX 表达式或图表的 Markdown 扩展支持,如果你只是需要一个简单的在线 Markdown 编辑器,这是一个不错的选择。 + +如果你需要,你可以选择将它部署在服务器上的 Docker 容器中。关于它的更多技术细节,你不妨看看它的 [GitHub 页面][9]。 + +- [Dillinger][10] + +#### 3、Write.as + +![][11] + +Write.as 基于该团队开发的自由开源软件 [WriteFreely][12],所以如果你愿意的话,你可以简单地把它托管在自己的服务器上免费使用它。 + +你也可以使用 Write.as 服务作为一个具有基本功能的免费在线 Markdown 编辑器。为了使它发挥最大的作用,你可能想选购一份付费订阅。付费的功能包括自定义主题、新闻通讯、照片托管和多个博客等等。 + +它支持 Markdown,可以让 [Mastodon][13]、[ActivityPub][14] 和 [Pleroma][15] 上的任何人轻松关注和分享你的博客文章。 + +你可以在它的 [GitHub 页面][16]上探索更多关于 WriteFreely 的信息,或者使用 Write.as 开始。 + +- [Write.as][17] + +#### 4、Editor.md + +![][18] + +这是一个有趣的开源 Markdown 编辑器,还可以嵌入到自己的网页上。 + +它支持实时预览、GitHub 风格的 Markdown,它有一个所见即所得的编辑器以及一堆有用的功能。除了基本的 Markdown 支持外,它还支持表情符、LaTeX 表达式、流程图等。 + +你也可以选择自己托管,更多信息请看它的 [GitHub 页面][19]。 + +- [Editor.md][20] + +#### 5、CodiMD + +![][21] + +CodiMD 从一开始就不是一个成熟的在线服务。但是,它是一个开源项目,通过托管在服务器上,你可以实时协作文档或笔记。 + +它基于 [HackMD][22] 的源代码,并提供了一个[演示实例][23]来提供测试。我个人很喜欢它还提供了一个黑暗模式,而且很容易使用。 + +对于它未来的发布版本(在写这篇文章的时候),它将改名为 “HedgeDoc”。 + +你可以在它的 [GitHub 页面][24]上找到所有关于通过 Docker/Kubernetes 在服务器上部署它的相关信息以及其他手动配置选项。 + +- [CodiMD][25] + +#### 6、Wri.pe + +![][26] + +Wri.pe 是一款简单的开源在线 Markdown 编辑器,虽然已经不再维护,但它仍然活着而且可用。 + +它的特点是实时预览和可以导出或保存你的笔记到 Dropbox/Evernote。考虑到它没有积极维护,你可能不会依赖它,但当我测试它时,它和预期一样可以工作。 + +你可以看看它的 [GitHub 页面][27]或官方网站来了解更多关于它的信息。 + +- [Wri.pe][28] + +### 附带提名 + +下面是一些提供 Markdown 访问的工具。 + +#### Markdown Web Dingus + +![][29] + +这是由 Markdown 语言的创造者提供的一个简单而免费的在线 Markdown 编辑器。它并不是一个成熟的在线编辑器,也不支持导入/导出, + +但是,如果你只是想要一个在线编辑器来预览你的 Markdown 代码,这可能是一个不错的选择。不仅仅局限于编辑器,你还可以在网站的侧边栏得到一个语法速查表。所以,你也可以在这里尝试和学习。 + +- [Markdown Web Dingus][30] + +#### Markdown Journal + +![][31] + +[Markdown Journal][32] 是 [GitHub][33] 上的一个有趣的开源项目,但已经停止开发了。你可以通过它的在线编辑器使用 Markdown 语言创建日记,并直接保存在你的 Dropbox 账户上。当我试图创建日志时,我注意到发生了内部服务器错误,但你可以了解一下它。 + +#### Etherpad + +![][34] + +[Etherpad][35] 是另一个令人印象深刻的开源在线编辑器,但它并没有开箱即用的 Markdown 支持。你可能会注意到通过一些插件可以在你的服务器上启用 Markdown 编辑,但还不够完美。所以,你可能要注意一点。它有一个[公共实例][36]的列表,也可以尝试一下。 + +### 总结 + +考虑到很多在线编辑器、CMS 和记事本服务都支持 Markdown,如果你想把它发布到网站上,像 [WordPress][37] 这样的服务/应用也是一个不错的选择。 + +你更喜欢用哪个 Markdown 编辑器?我是否错过了你最喜欢的东西?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/online-markdown-editors/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Markdown +[2]: https://en.wikipedia.org/wiki/Markup_language +[3]: https://itsfoss.com/best-markdown-editors-linux/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/stackedit-screenshot.png?resize=800%2C396&ssl=1 +[5]: https://itsfoss.com/stackedit-markdown-editor/ +[6]: https://github.com/benweet/stackedit +[7]: https://stackedit.io/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/dillinger-screenshot.jpg?resize=800%2C390&ssl=1 +[9]: https://github.com/joemccann/dillinger +[10]: https://dillinger.io/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/write-as-screenshot.jpg?resize=800%2C505&ssl=1 +[12]: https://writefreely.org/ +[13]: https://itsfoss.com/mastodon-open-source-alternative-twitter/ +[14]: https://en.wikipedia.org/wiki/ActivityPub +[15]: https://pleroma.social/ +[16]: https://github.com/writeas/writefreely +[17]: https://write.as/ +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/editor-md-screenshot.jpg?resize=800%2C436&ssl=1 +[19]: https://github.com/pandao/editor.md +[20]: http://editor.md.ipandao.com/en.html +[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/codiMD.png?resize=800%2C525&ssl=1 +[22]: https://hackmd.io/ +[23]: https://demo.codimd.org/ +[24]: https://github.com/codimd/server +[25]: https://demo.codimd.org +[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/wri-pe-screenshot.jpg?resize=800%2C558&ssl=1 +[27]: https://github.com/masuidrive/open-wripe +[28]: https://wri.pe/ +[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/markdown-web-dingus.jpg?resize=800%2C616&ssl=1 +[30]: https://daringfireball.net/projects/markdown/dingus +[31]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/markdown-journal.jpg?resize=800%2C656&ssl=1 +[32]: https://markdownjournal.com/ +[33]: https://github.com/maciakl/MarkdownJournal +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/etherpad-public-instance.png?resize=800%2C556&ssl=1 +[35]: https://etherpad.org/ +[36]: https://github.com/ether/etherpad-lite/wiki/Sites-that-run-Etherpad-Lite +[37]: https://wordpress.com/ diff --git a/published/202009/20200830 Linux Jargon Buster- What is a Display Server in Linux- What is it Used for.md b/published/202009/20200830 Linux Jargon Buster- What is a Display Server in Linux- What is it Used for.md new file mode 100644 index 0000000000..f5a7bbcdb3 --- /dev/null +++ b/published/202009/20200830 Linux Jargon Buster- What is a Display Server in Linux- What is it Used for.md @@ -0,0 +1,119 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12589-1.html) +[#]: subject: (Linux Jargon Buster: What is a Display Server in Linux? What is it Used for?) +[#]: via: (https://itsfoss.com/display-server/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +Linux 黑话解释:什么是显示服务器,用来做什么? +====== + +![][3] + +在 Linux 相关的文章、新闻和讨论中,你会经常遇到显示服务器display server、Xorg、Wayland 等名词。 + +在这篇解释文章中,我将讨论 Linux 中的显示服务器。 + +### 什么是显示服务器? + +显示服务器是一个程序,它负责协调其客户端与操作系统的其他部分之间,以及硬件和操作系统之间的输入和输出。基本上,多亏了显示服务器,你才能以图形化的方式使用你的计算机(GUI)。如果没有显示服务器,你只能局限于命令行界面(TTY)。 + +显示服务器提供了一个图形环境的框架,使你可以使用鼠标和键盘与应用程序进行交互。 + +显示服务器通过[显示服务器协议][1](如 X11)与客户端进行通信。显示服务器是图形用户界面 —— 特别是窗口系统 —— 中的一个关键组件。 + +不要把显示服务器和[桌面环境][2]混淆。桌面环境的下层使用的是显示服务器。 + +听起来很熟悉,但又不完全清楚?让我来解释一下。 + +### Linux 上的显示服务器协议 + +Linux 中有三种显示服务器协议,分别是 X11、Wayland 和 Mir。下面我就给大家简单介绍一下这些显示服务器。 + +#### X11 + +X11(也称 X)是已经存在多年的传统显示服务器。它是 Linux 发行版中最常用的显示服务器。 + +![X 架构][4] + +X11 通信协议,使用显示服务器 [X.org 服务器][5]。它接收来自[设备驱动程序][6]的输入事件,并将它们提供给它的一个客户端。 + +显示服务器也从客户端接收数据,它处理数据并进行合成,在 Linux 上,它将数据传递给三个内核组件之一:[DRM][7]、[gem][8] 或 [KMS 驱动][9]。 + +X.Org 服务器是一个显示服务器,它依靠第二个程序:[合成窗口管理器][10],来进行合成。例如 [Mutter][11] 或 [KWin][12]。GNOME 使用的是 Mutter。 + +#### Wayland + +按照其网站的说法,Wayland “旨在作为 X 的更简单的替代品,更容易开发和维护”。 + +而事实上 [Wayland][13] 就是现代的显示服务器,它应该取代传统的 X 显示服务器。 + +对它的采用还在普及中。Ubuntu 曾试图在 17.10 版本中改用 Wayland 作为默认的显示服务器,但这个尝试遭到了负面反馈。 + +很多 GUI 应用程序及其框架都依赖于 X 服务器。这些应用程序在 Wayland 上无法正常工作。 + +这迫使 Ubuntu 继续使用 X 作为默认显示服务器。它仍然提供了使用 Wayland 的选项,但不再是默认的了。 + +即使在今天,绝大多数的发行版都默认使用 X 显示服务器。 + +![Wayland 架构][14] + +实施 Wayland 显示服务器协议的显示服务器,被称为 [Wayland 合成器][15]。和 X11 上的一样,Wayland 合成器负责处理其客户端的输入和输出,但同时也进行[合成][16],这与 X11 相反。 + +几个 Wayland 合成器是 [Weston][17]、[Mutter][18]、[KWin][12] 或 [Enlightenment][19]。 + +#### Mir + +[Mir 显示服务器][20]自带的 Mir 显示服务器协议,与 X11 和 Wayland 使用的协议不同。它是由 [Canonical][21] 开发的,作为 Unity 开发的一部分,打算成为 [Ubuntu][22] 的首选显示服务器。 + +但在 2017 年,它已经被 [Ubuntu] 桌面版的 Wayland 显示服务器所取代,不过 Mir 的开发还在继续,用于物联网(IoT)应用。 + +#### 为什么我们还在使用 Xorg? + +Wayland 作为比较新的产品,相比 Xorg 来说,还不是很稳定。作为客户端的程序,必须知道如何与显示服务器进行通信。 + +因此,很多程序在使用 Wayland 时可能无法运行。Ubuntu 默认切换到 Wayland 的实验证实了这一点。 + +### 结束语 + +我希望你对 Linux 中的显示服务器概念有了更好的理解。我已经尽量不谈太多的技术细节,但我无法完全避免。 + +欢迎你的反馈和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/display-server/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/X_Window_System_core_protocol +[2]: https://linux.cn/article-12579-1.html +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/display-server-linux.png?resize=800%2C450&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/x-architecture-1.png?resize=800%2C507&ssl=1 +[5]: https://en.wikipedia.org/wiki/X.Org_Server +[6]: https://en.wikipedia.org/wiki/Device_driver +[7]: https://en.wikipedia.org/wiki/Direct_Rendering_Manager +[8]: https://en.wikipedia.org/wiki/Graphics_Execution_Manager +[9]: https://en.wikipedia.org/wiki/KMS_driver +[10]: https://en.wikipedia.org/wiki/Compositing_window_manager +[11]: https://en.wikipedia.org/wiki/Mutter_(window_manager) +[12]: https://en.wikipedia.org/wiki/KWin +[13]: https://wayland.freedesktop.org/ +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/wayland-architecture-1.png?resize=800%2C500&ssl=1 +[15]: https://en.wikipedia.org/wiki/Wayland_compositor +[16]: https://en.wikipedia.org/wiki/Compositing +[17]: https://en.wikipedia.org/wiki/Weston_(software) +[18]: https://en.wikipedia.org/wiki/Mutter_(software) +[19]: https://en.wikipedia.org/wiki/Enlightenment_(software) +[20]: https://mir-server.io/ +[21]: https://canonical.com/ +[22]: https://itsfoss.com/install-ubuntu/ diff --git a/published/202009/20200831 Military looks to ultraviolet networks for secure battlefield communication.md b/published/202009/20200831 Military looks to ultraviolet networks for secure battlefield communication.md new file mode 100644 index 0000000000..4e4c176e60 --- /dev/null +++ b/published/202009/20200831 Military looks to ultraviolet networks for secure battlefield communication.md @@ -0,0 +1,59 @@ +[#]: collector: (lujun9972) +[#]: translator: (silentdawn-zz) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12611-1.html) +[#]: subject: (Military looks to ultraviolet networks for secure battlefield communication) +[#]: via: (https://www.networkworld.com/article/3572372/military-looks-to-ultraviolet-networks-for-secure-battlefield-communication.html) +[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) + +美国军方正探索战场保密通信用紫外网络 +====== + +> 美国军方想以开放空间传输的紫外线为载体,为士兵开发新的更安全的通讯网络。 + +![](https://images.idgesg.net/images/article/2018/02/security_safety_guarding_mobile_laptop_endpoint_protection_thinkstock_906578404-100750806-large.jpg) + +美国军方研究者之所以探索战场环境下的紫外光通信的应用,是因为这种技术可能实现敌对方无法侦测的通信。 + +研究者关注的一个方面是衰减效应,即信号强度随传播距离的增加而减弱的自然现象。他们想知道是否存在一个合适的距离范围,在该范围内,信号强度足够弱,以至于敌对方几乎无法侦测,但又足够强,使得友方可以侦测并建立通信。他们说他们观察到了这种情况,但关于他们相关工作的 [研究论文][1] 并没有讲这个距离范围究竟是多少。 + +一份军方出版物提到,“紫外通信具有独特的传输特性,不但可以实现非视距连接,而且让敌对方难以侦测。” + +这个研究由美军作战能力发展司令部 [军队研究实验室][2] 主导,其重点是开发一个基础架构,为未来研究提供可量化环境,在该环境下,己方既可以使用紫外通信,也能够避免敌对方的侦测。研究过程中他们还有另外两个发现: + + * 最差情况,即敌对方探测器与己方发射器在视线范围内,但友方接收器不在视线范围内,问题不像想象中严重。 + * 转换紫外线发射器的发射方向不是降低敌对方探测到通信信号可能性的有效方式。 + +研究者计划分析下面四种场景,场景中涵盖了己方紫外发射器、友方接收器、敌对方探测器相对位置关系: + + * 友方接收器、敌对方探测器都在发射器的视线范围内。 + * 友方接收器在发射器视线范围内,但敌对方探测器不在视线范围内(最佳条件)。 + * 敌对方探测器在发射器的视线范围内,但友方接收器不在视线范围内(最差条件)。 + * 友方接收器、敌对方探测器均不在视线范围内。 + +假定敌对方试图通过时域上的光子计数来发现相干通信信号,进而判定正在进行通信。 + +科学家们承认这么一个事实,即越靠近发射器,信号越容易被侦测。所以紫外通信中发射器的有效使用依赖于对敌对方探测器位置的准确感知。 + +“我们提供了一个基础框架,使得对紫外通信系统实际可探测性与期望性能间差距的根本限制因素的研究得以进行。” 研究者之一,Robert Drost 博士如是说。 + +“我们的研究确保了团队对紫外波段用于通信的潜力及有限性有了根本上的理解。我坚信这种理解将影响到未来军队网络通信能力的发展。” + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3572372/military-looks-to-ultraviolet-networks-for-secure-battlefield-communication.html + +作者:[Patrick Nelson][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://www.networkworld.com/author/Patrick-Nelson/ +[b]: https://github.com/lujun9972 +[1]: https://www.osapublishing.org/DirectPDFAccess/4516B0FD-2152-4663-9A9899BF00560B7C_433781/oe-28-16-23640.pdf?da=1&id=433781&seq=0&mobile=no +[2]: https://www.arl.army.mil +[3]: https://www.facebook.com/NetworkWorld/ +[4]: https://www.linkedin.com/company/network-world diff --git a/published/202009/20200902 Design a book cover with an open source alternative to InDesign.md b/published/202009/20200902 Design a book cover with an open source alternative to InDesign.md new file mode 100644 index 0000000000..390747395c --- /dev/null +++ b/published/202009/20200902 Design a book cover with an open source alternative to InDesign.md @@ -0,0 +1,110 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12620-1.html) +[#]: subject: (Design a book cover with an open source alternative to InDesign) +[#]: via: (https://opensource.com/article/20/9/open-source-publishing-scribus) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +用 InDesign 的开源替代方案 Scribus 设计书籍封面 +====== + +> 使用开源的出版软件 Scribus 来制作你的下一本自出版书籍的封面。 + +![](https://img.linux.net.cn/data/attachment/album/202009/16/213714ppvfzm6idv9nnynp.jpg) + +我最近写完了一本关于 [C 语言编程][2]的书,我通过 [Lulu.com][3] 自行出版。我已经用 Lulu 做了好几个图书项目,它是一个很棒的平台。今年早些时候,Lulu 做了一些改变,让作者在创作图书封面时有了更大的控制权。以前,你只需上传一对大尺寸图片作为书的封面和封底。现在,Lulu 允许作者上传完全按照你的书的尺寸定制的 PDF。 + +你可以使用 [Scribus][4] 这个开源页面布局程序来创建封面。下面是我的做法。 + +### 下载一个模板 + +当你在 Lulu 上输入图书的信息时,最终会进入设计Design栏。在该页面的设计封面Design Your Cover部分,你会发现一个方便的下载模板Download Template按钮,它为你的图书封面提供了一个 PDF 模板。 + +![Lulu Design your Cover page][5] + +下载此模板,它为你提供了在 Scribus 中创建自己的书籍封面所需的信息。 + +![Lulu's cover template][7] + +最重要的细节是: + + * 文件总尺寸(含出血)Total Document Size (with bleed) + * 出血区(从裁切边缘)Bleed area (from trim edge) + * 书脊区Spine area + +出血Bleed是一个印刷术语,在准备“印刷就绪”文件时,这个术语很重要。它与普通文件中的页边距不同。打印文件时,你会为顶部、底部和侧面设置一个页边距。在大多数文档中,页边距通常为一英寸左右。 + +但在印刷就绪的文件中,文档的尺寸需要比成品书大一些,因为书籍的封面通常包括颜色或图片,一直到封面的边缘。为了创建这种设计,你要使颜色或图片超出你的边距,印刷厂就会把多余的部分裁切掉,使封面缩小到准确的尺寸。因此,“裁切”就是印刷厂将封面精确地裁剪成相应尺寸。而“出血区”就是印刷厂裁掉的多余部分。 + +如果你没有出血区,印刷厂就很难完全按照尺寸印刷封面。如果打印机只偏离了一点点,你的封面最终会在边缘留下一个微小的、白色的、没有印刷的边缘。使用出血和修剪意味着你的封面每次都能看起来正确。 + +### 在 Scribus 中设置书籍的封面文档 + +要在 Scribus 中创建新文档,请从定义文档尺寸的新文档New Document对话框开始。单击出血Bleeds选项卡,并输入 PDF 模板所说的出血尺寸。Lulu 图书通常在所有边缘使用 0.125 英寸的出血量。 + +对于 Scribus 中的文档总尺寸,你不能只使用 PDF 模板上的文档总尺寸。如果这样做,你的 Scribus 文档的尺寸会出现错误。相反,你需要做一些数学计算来获取正确的尺寸。 + +看下 PDF 模板中的文件总尺寸(含出血)Total Document Size (with bleed)。这是将要发送给打印机的 PDF 的总尺寸,它包括封底、书脊和封面(包含出血)。要在 Scribus 中输入正确的尺寸,你必须从所有边缘中减去出血。例如,我最新的书的尺寸是四开本Crown Quarto,装订后尺寸为 7.44" x 9.68",书脊宽度为 0.411"。加上 0.125" 的出血量,文件总尺寸(含出血)是 15.541" × 9.93"。因此,我在 Scribus 中的文档尺寸是: + + * 宽:15.541-(2 x 0.125)=15.291" + * 高:9.93-(2 x 0.125)=9.68" + +![Scribus document setup][8] + +这将设置一个新的适合我的书的封面尺寸的 Scribus 文档。新的 Scribus 文档尺寸应与 PDF 模板上列出的“文件总尺寸(含出血)”完全匹配。 + +### 从书脊开始 + +在 Scribus 中创建新的书籍封面时,我喜欢从书脊区域开始。这可以帮助我验证我是否在 Scribus 中正确定义了文档。 + +使用矩形Rectangle工具在文档上绘制一个彩色方框,书脊需要出现在那里。你不必完全按照正确的尺寸和位置来绘制,只要大小差不多并使用属性Properties来设置正确的值即可。在形状的属性中,选择左上角基点,然后输入书脊需要放在的 x、y 位置和尺寸。同样,你需要做一些数学计算,并使用 PDF 模板上的尺寸作为参考。 + +![Empty Scribus document][9] + +例如,我的书的修边尺寸是 7.44"×9.68",这是印刷厂修边后的封面和封底的尺寸。我的书的书脊大小是 0.411",出血量是 0.125"。也就是说,书脊的左上角 X、Y 的正确位置是: + + * X 位置(出血量+裁剪宽度):0.411+7.44=7.8510" + * Y 位置(减去出血量):-0.125" + +矩形的尺寸是我的书封面的全高(包括出血)和 PDF 模板中标明的书脊宽度。 + + * 宽度:0.411" + * 高度:9.93" + +将矩形的填充Fill设置为你喜欢的颜色,将笔触Stroke设置为None以隐藏边界。如果你正确地定义了 Scribus 文档,你应该最终得到一个矩形,它可以延伸到位于文档中心的图书封面的顶部和底部边缘。 + +![Book spine in Scribus][10] + +如果矩形与文档不完全匹配,可能是你在创建 Scribus 文档时设置了错误的尺寸。由于你还没有在书的封面上花太多精力,所以可能最容易的做法是重新开始,而不是尝试修复你的错误。 + +### 剩下的就看你自己了 + +接下来,你可以创建你的书的封面的其余部分。始终使用 PDF 模板作为指导。封底在左边,封面在右边 + +我可以做一个简单的书籍封面,但我缺乏艺术能力,无法创造出真正醒目的设计。在自己设计了几个书的封面后,我对那些能设计出好封面的人产生了敬意。但如果你只是需要制作一个简单的封面,你可以通过开源软件自己动手。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/open-source-publishing-scribus + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/books_read_list_stack_study.png?itok=GZxb9OAv (Stack of books for reading) +[2]: https://opensource.com/article/20/8/c-programming-cheat-sheet +[3]: https://www.lulu.com/ +[4]: https://www.scribus.net/ +[5]: https://opensource.com/sites/default/files/uploads/lulu-download-template.jpg (Lulu Design your Cover page) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/lulu-pdf-template.jpg (Lulu's cover template) +[8]: https://opensource.com/sites/default/files/uploads/scribus-new-document.jpg (Scribus document setup) +[9]: https://opensource.com/sites/default/files/uploads/scribus-empty-document.jpg (Empty Scribus document) +[10]: https://opensource.com/sites/default/files/uploads/scribus-spine-rectangle.jpg (Book spine in Scribus) diff --git a/published/202009/20200903 Rclone Browser Enables You to Sync Data With Cloud Services in Linux Graphically.md b/published/202009/20200903 Rclone Browser Enables You to Sync Data With Cloud Services in Linux Graphically.md new file mode 100644 index 0000000000..df58ec759d --- /dev/null +++ b/published/202009/20200903 Rclone Browser Enables You to Sync Data With Cloud Services in Linux Graphically.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12605-1.html) +[#]: subject: (Rclone Browser Enables You to Sync Data With Cloud Services in Linux Graphically) +[#]: via: (https://itsfoss.com/rclone-browser/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Rclone Browser 让你在 Linux 中以图形化的方式与云服务同步数据 +====== + +> Rclone Browser 是一款高效的 GUI 程序,它可以让你轻松地使用 Rclone 管理和同步云存储上的数据。在这里,我们来看看它提供的功能和工作方式。 + +如果你想原生地在 Linux 上毫不费力地使用 One Drive 或 [Google Drive][1],你可以选择像 [Insync][2] 这样的高级 GUI 工具。 + +如果你能在终端上下功夫,你可以使用 [rclone][4] 与许多 [Linux 上的云存储服务][5]进行同步。我们有一份详细的[在 Linux 中使用 Rclone 与 OneDrive 同步的指南][6]。 + +[rclone][4] 是一个相当流行且有用的命令行工具。rclone 提供的功能是很多有经验的用户需要的。 + +然而,即使它足够有用,也不是每个人都能从终端使用它。 + +因此,在本文中,我将介绍一个令人印象深刻的 GUI “Rclone Browser”,它可以让你轻松地使用 Rclone 管理和同步云存储上的数据。 + +值得注意的是,rclone 确实提供了一个实验性的基于 Web 的 GUI。但我们将在这里专注于 [Rclone Browser][7]。 + +![][8] + +### Rclone Browser:Rclone 的开源 GUI + +Rclone Browser 是一款可以让你浏览、修改、上传/下载、列出文件,并在想充分利用远程存储位置的情况下,做更多你想做的事情的 GUI。 + +它提供了一个简单的用户界面,并且工作良好(根据我的快速测试)。让我们详细看看它提供的功能以及如何开始使用它。 + +### Rclone Browser 的功能 + +![][9] + +它提供了很多选项和控制来管理远程存储位置。根据你的使用情况,你可能会发现它的功能丰富或不知所措。以下是它的功能: + + * 浏览和修改 rclone 远程存储位置 + * 支持加密云存储 + * 支持自定义位置和配置加密 + * 不需要额外的配置。它将使用相同的 rclone 配置文件(如果你有的话) + * 在不同的标签页中同时导航多个位置 + * 按层次列出文件(按文件名、大小和修改日期) + * rclone 命令的执行是异步的,不会使 GUI 冻结 + * 你可以上传、下载、创建新文件夹、重命名、删除文件和文件夹 + * 上传文件时支持拖放 + * 在 VLC 等播放器中播放流媒体文件 + * 挂载和卸载文件夹/云端驱动器 + * 能够计算文件夹的大小、导出文件列表,并将 rclone 命令复制到剪贴板 + * 支持便携模式 + * 支持共享驱动器(如果你使用 Google Drive)。 + * 针对支持共享链接的远程存储服务,支持获取共享链接 + * 能够创建任务,你可以很容易地保存,以便以后再次运行或编辑。 + * 黑暗模式 + * 跨平台支持(Windows、macOS 和 Linux)。 + +### 在 Linux 上安装 Rclone Browser + +在使用 Rclone Browser 之前,你需要在你的 Linux 发行版上安装 rclone。请按照[官方安装说明][10]来安装。 + +你可以在 [GitHub 页面][7]的[发布页][11]找到 Rclone Browser 的 AppImage 文件。所以,你在任何 Linux 发行版上运行它都不会有问题。 + +如果你不知道 AppImage,我会推荐你阅读我们的[在 Linux 上使用 AppImage][12] 指南。 + +你也可以选择构建它。操作说明在 GitHub 页面上。 + +- [下载 Rclone Browser][7] + +### 开始使用 Rclone Browser + +在这里,我只分享一下使用 Rclone Browser 应该知道的几件事。 + +![][13] + +如果你在终端中使用 rclone 时有任何现有的远程位置,它将自动显示在 GUI 中。你也可以点击 “Refresh” 按钮来获取最新的新增内容。 + +如上图所示,当你点击 “Config” 按钮时,它会启动终端,让你轻松地添加一个新的远程或按你的要求配置它。当终端弹出的时候不用担心,Rclone browser 会执行命令来完成所有必要的任务,你只需要在需要的时候设置或编辑一些东西。你不需要执行任何 rclone 命令。 + +如果你有一些现有的远程位置,你可以使用 “Open” 按钮打开它们,并在不同的标签页中访问云存储,如下所示。 + +![][14] + +你可以轻松地挂载云驱动器,上传/下载文件,获取详细信息,共享文件夹的公共链接(如果支持),以及直接播放流媒体文件。 + +如果你想复制、移动或与远程存储位置同步数据,你可以简单地创建一个任务来完成。只需确保设置正确,你可以模拟执行或者直接运行任务。 + +你可以在 “Jobs” 页面找到所有正在运行的任务,如果需要,你可以取消/停止它们。 + +![][15] + +除了上面提到的所有基本功能外,你可以前往 “File->Preferences” 更改 rclone 位置、挂载选项、下载文件夹、带宽设置以及代理。 + +![][16] + +要了解更多关于它的用法和功能,你可能需要前往 [GitHub 页面][7]了解所有的技术信息。 + +### 总结 + +Rclone Browser 对于每一位想要使用 rclone 强大功能的 Linux 用户来说,绝对是得心应手。 + +你是否已经尝试过了呢?你更喜欢通过 GUI 还是终端来使用 rclone?请在下面的评论中告诉我你的想法! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/rclone-browser/ + +作者:[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://itsfoss.com/use-google-drive-linux/ +[2]: https://itsfoss.com/recommends/insync/ +[3]: https://itsfoss.com/affiliate-policy/ +[4]: https://rclone.org/ +[5]: https://itsfoss.com/cloud-services-linux/ +[6]: https://itsfoss.com/use-onedrive-linux-rclone/ +[7]: https://github.com/kapitainsky/RcloneBrowser +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/Cloud-sync.gif?resize=800%2C450&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/rclone-browser-screenshot.jpg?resize=800%2C618&ssl=1 +[10]: https://rclone.org/install/ +[11]: https://github.com/kapitainsky/RcloneBrowser/releases/tag/1.8.0 +[12]: https://itsfoss.com/use-appimage-linux/ +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/rclone-browser-howto.png?resize=800%2C412&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/rclone-browser-drive.png?resize=800%2C505&ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/rclone-browser-task.jpg?resize=800%2C493&ssl=1 +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/rclone-browser-preferences.jpg?resize=800%2C590&ssl=1 diff --git a/published/202009/20200903 Soon You-ll be Able to Convert Any Website into Desktop Application in Linux Mint.md b/published/202009/20200903 Soon You-ll be Able to Convert Any Website into Desktop Application in Linux Mint.md new file mode 100644 index 0000000000..3582dedd8e --- /dev/null +++ b/published/202009/20200903 Soon You-ll be Able to Convert Any Website into Desktop Application in Linux Mint.md @@ -0,0 +1,97 @@ +[#]: collector: (lujun9972) +[#]: translator: (koolape) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12581-1.html) +[#]: subject: (Soon You’ll be Able to Convert Any Website into Desktop Application in Linux Mint) +[#]: via: (https://itsfoss.com/web-app-manager-linux-mint/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +很快你就能在 Linux Mint 上将任何网站转化为桌面应用程序了 +====== + +设想一下,你正忙于一项任务且需要在浏览器中打开超过 20 个页面,大多数页面都和工作有关。 + +还有一些是 YouTube 或其他音乐流媒体网站。 + +完成任务后需要关闭浏览器,但这会将包括工作相关和听音乐的网页等所有网页一起关掉。 + +然后你需要再次打开这些网页并登录账号以回到原来的进度。 + +这看起来令人沮丧,对吧?Linux Mint 理解你的烦恼,因此有了下面这个新项目帮助你应对这些问题。 + +![][1] + +在[最近的一篇文章][2]中,Linux Mint 团队披露了正在开发一个名叫“网页应用管理器Web App Manager”的新工具。 + +该工具让你能够像使用桌面程序那样以独立窗口运行你最喜爱的网页。 + +在将网页添加为网页应用程序的时候,你可以给这个程序取名字并添加图标。也可以将它添加到不同的分类,以便在菜单中搜索这个应用。还可以指定用什么浏览器打开应用。启用/禁用导航栏的选项也有。 + +![在 Linux Mint 中添加网页应用程序][3] + +例如,将 YouTube 添加为网页应用程序: + +![Linux Mint 中的网页应用程序][4] + +运行 YouTube 程序将通过你所使用的浏览器打开一个独立的页面。 + +![YouTube 网页应用程序][5] + +网页应用程序拥有常规桌面应用程序有的大多数功能特点,如使用 `Alt+Tab` 切换。 + +![使用 Alt+Tab 切换网页应用][6] + +甚至还能将应用固定到面板/任务栏方便打开。 + +![添加到面板的 YouTube 网页应用][7] + +该管理器目前处于 beta 开发阶段,但已经使用起来已经相对比较稳定了。不过目前还没有面向大众发放,因为翻译工作还未完成。 + +如果你在使用 Linux Mint 并想尝试这个工具,可在下方下载 beta 版本的 deb 文件: + +- [下载 beta 版][8] + +### 网页应用的好处 + +有读者问到这个网页应用管理器与 Chrome 和其他一些网页浏览器中已有的其他类似功能相比的好处。让我来展开一下这个话题。 + +- 你可以使用 URL 的特定部分(example.com/tool 而不是 example.com)作为应用程序。 +- 添加自定义图标的可能性对于没有清晰的 favicon 的网站来说非常方便。 +- 你可以使用一个没有任何扩展的轻量级浏览器来打开网页应用,而不是像 Chrome/Chromium 这样的常规网页浏览器。它的速度应该更快。 +- 你的网页应用可以被整合到应用菜单中。你可以像其他应用程序一样搜索它。 + +### 网页应用程序在桌面环境的 Linux 中不是什么新事物 + +网页应用程序不是由 Linux Mint 独创的,而是早在大约 10 年前就有了。 + +你可能还记得 Ubuntu 在 2013-2014 年向 Unity 桌面中加入了网页应用程序这项特性。 + +轻量级 Linux 发行版 PeppermintOS 自 2010 年起就将 ICE(网页应用程序工具)列为其主要特色之一。实际上,Linux Mint 的网页应用程序管理器也是基于 [ICE][9] 的。 + +我个人喜欢网页应用程序,因为有用。 + +你怎么看 Linux Mint 中的网页应用程序呢,这是你期待使用的吗?欢迎在下方评论。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/web-app-manager-linux-mint/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[koolape](https://github.com/koolape) +校对:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/Web-App-Manager-linux-mint.jpg?resize=800%2C450&ssl=1 +[2]: https://blog.linuxmint.com/?p=3960 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/Add-web-app-in-Linux-Mint.png?resize=600%2C489&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/Web-Apps-in-Linux-Mint.png?resize=600%2C489&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/youtube-web-app-linux-mint.jpg?resize=800%2C611&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/web-app-alt-tab-switcher.jpg?resize=721%2C576&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/panel.jpg?resize=470%2C246&ssl=1 +[8]: http://www.linuxmint.com/tmp/blog/3960/webapp-manager_1.0.3_all.deb +[9]: https://github.com/peppermintos/ice diff --git a/published/202009/20200904 Build a remote management console using Python and Jupyter Notebooks.md b/published/202009/20200904 Build a remote management console using Python and Jupyter Notebooks.md new file mode 100644 index 0000000000..8134eb911a --- /dev/null +++ b/published/202009/20200904 Build a remote management console using Python and Jupyter Notebooks.md @@ -0,0 +1,102 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12606-1.html) +[#]: subject: (Build a remote management console using Python and Jupyter Notebooks) +[#]: via: (https://opensource.com/article/20/9/remote-management-jupyter) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +使用 Jupyter Notebooks 构建一个远程管理控制台 +====== + +> 把 Jupyter 变成一个远程管理控制台。 + +![](https://img.linux.net.cn/data/attachment/album/202009/12/115114jct1g15e9ucsr6ua.jpg) + +SSH 是一个强大的远程管理工具,但有些细节还不够好。编写一个成熟的远程管理控制台听起来好像是一件很费劲的事情。当然,开源社区中肯定有人已经写了一些东西吧? + +是的,他们已经写出来了,它的名字是 [Jupyter][2]。你可能会认为 Jupyter 是那些数据科学家用来分析一周内的广告点击趋势之类的工具。这并没有错,它确实是的,而且它是一个很好的工具。但这仅仅刻画是它的表面。 + +### 关于 SSH 端口转发 + +有时,你可以通过 22 端口进入一台服务器。一般你也连接不到其他端口。也许你是通过另一个有更多访问权限的“堡垒机”,或者限制主机或端口的网络防火墙访问 SSH。当然,限制访问的 IP 范围是有充分理由的。SSH 是远程管理的安全协议,但允许任何人连接到任何端口是相当不必要的。 + +这里有一个替代方案:运行一个简单的 SSH 端口转发命令,将本地端口转发到一个“远程”本地连接上。当你运行像 `-L 8111:127.0.0.1:8888` 这样的 SSH 端口转发命令时,你是在告诉 SSH 将你的*本地*端口 `8111` 转发到它认为的“远程”主机 `127.0.0.1:8888`。远程主机认为 `127.0.0.1` 就是它本身。 + +就像在《芝麻街》节目一样,“这里”是一个微妙的词。 + +地址 `127.0.0.1` 就是你告诉网络的“这里”。 + +### 实际动手学习 + +这可能听起来很混乱,但运行比解释它更简单。 + +``` +$ ssh -L 8111:127.0.0.1:8888 moshez@172.17.0.3 +Linux 6ad096502e48 5.4.0-40-generic #44-Ubuntu SMP Tue Jun 23 00:01:04 UTC 2020 x86_64 + +The programs included with the Debian GNU/Linux system are free software; +the exact distribution terms for each program are described in the +individual files in /usr/share/doc/*/copyright. + +Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent +permitted by applicable law. +Last login: Wed Aug 5 22:03:25 2020 from 172.17.0.1 +$ jupyter/bin/jupyter lab --ip=127.0.0.1 +[I 22:04:29.771 LabApp] JupyterLab application directory is /home/moshez/jupyter/share/jupyter/lab +[I 22:04:29.773 LabApp] Serving notebooks from local directory: /home/moshez +[I 22:04:29.773 LabApp] Jupyter Notebook 6.1.1 is running at: +[I 22:04:29.773 LabApp] http://127.0.0.1:8888/?token=df91012a36dd26a10b4724d618b2e78cb99013b36bb6a0d1 +<删节> +``` + +端口转发 `8111` 到 `127.0.0.1`,并在远程主机上启动 Jupyter,它在 `127.0.0.1:8888` 上监听。 + +现在你要明白,Jupyter 在撒谎。它认为你需要连接到 `8888` 端口,但你把它转发到 `8111` 端口。所以,当你把 URL 复制到浏览器后,但在点击回车之前,把端口从 `8888` 修改为 `8111`。 + +![Jupyter remote management console][3] + +这就是你的远程管理控制台。如你所见,底部有一个“终端”图标。点击它可以启动一个终端。 + +![Terminal in Jupyter remote console][5] + +你可以运行一条命令。创建一个文件会在旁边的文件浏览器中显示出来。你可以点击该文件,在本地的编辑器中打开它。 + +![Opening a file][6] + +你还可以下载、重命名或删除文件: + +![File options in Jupyter remote console][7] + +点击**上箭头**就可以上传文件了。那就上传上面的截图吧。 + +![Uploading a screenshot][8] + +最后说个小功能,Jupyter 可以让你直接通过双击远程图像查看。 + +哦,对了,如果你想用 Python 做系统自动化,还可以用 Jupyter 打开笔记本。 + +所以,下次你需要远程管理防火墙环境的时候,为什么不使用 Jupyter 呢? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/remote-management-jupyter + +作者:[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/computer_space_graphic_cosmic.png?itok=wu493YbB (Computer laptop in space) +[2]: https://jupyter.org/ +[3]: https://opensource.com/sites/default/files/uploads/output_1_0.png (Jupyter remote management console) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/output_3_0.png (Terminal in Jupyter remote console) +[6]: https://opensource.com/sites/default/files/uploads/output_5_0.png (Opening a file) +[7]: https://opensource.com/sites/default/files/uploads/output_7_0.png (File options in Jupyter remote console) +[8]: https://opensource.com/sites/default/files/uploads/output_9_0.png (Uploading a screenshot) diff --git a/published/202009/20200907 Linux Jargon Buster- What is a Linux Distribution- Why is it Called a ‘Distribution.md b/published/202009/20200907 Linux Jargon Buster- What is a Linux Distribution- Why is it Called a ‘Distribution.md new file mode 100644 index 0000000000..88dcc5cdeb --- /dev/null +++ b/published/202009/20200907 Linux Jargon Buster- What is a Linux Distribution- Why is it Called a ‘Distribution.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12609-1.html) +[#]: subject: (Linux Jargon Buster: What is a Linux Distribution? Why is it Called a ‘Distribution’?) +[#]: via: (https://itsfoss.com/what-is-linux-distribution/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是 Linux 发行版?为什么它被称为“发行版”? +====== + +> 在这一章的 Linux 黑话解释中,我们来讨论一些基本的东西。 + +![][8] + +让我们来讨论一下什么是 Linux 发行版,为什么它被称为发行版distribution(或简称 distro),以及,它与 Linux 内核有什么不同。你还会了解到为什么有些人坚称 Linux 为 GNU/Linux。 + +### 什么是 Linux 发行版? + +Linux 发行版是一个由 Linux 内核、[GNU 工具][1]、附加软件和软件包管理器组成的操作系统,它也可能包括[显示服务器][9]和[桌面环境][2],以用作常规的桌面操作系统。 + +这个术语之所以是 “Linux 发行版”,是因为像 Debian、Ubuntu 这样的机构“发行”了 Linux 内核以及所有必要的软件及实用程序(如网络管理器、软件包管理器、桌面环境等),使其可以作为一个操作系统使用。 + +你的发行版还负责提供更新来维护其内核和其他实用程序。 + +所以,“Linux” 是内核,而 “Linux 发行版”是操作系统。这就是为什么它们有时也被称为基于 Linux 的操作系统的原因。 + +如果不是很理解以上所有的内容,不要担心。下面我将详细解释一下。 + +### “Linux 只是一个内核,不是一个操作系统。”这是什么意思? + +你可能看到到过这句话,这说的没错。内核是一个操作系统的核心,它接近于具体硬件。你使用应用程序和 shell 与它交互。 + +![Linux 内核结构][3] + +为了理解这一点,我就用我在《[什么是 Linux 的详细指南][4]》中曾用过的那个比喻。把操作系统看成车辆,把内核看成引擎。你不能直接驱动引擎。同样,你也不能直接使用内核。 + +![操作系统类比][5] + +一个 Linux 发行版可以看作是一个汽车制造商(比如丰田或福特)为你提供的现成的汽车,就像 Ubuntu 或 Fedora 发行版的发行商为你提供的一个基于 Linux 的现成操作系统一样。 + +### 什么是 GNU/Linux? + +让我们再来看看这张图片。1991 年的时候,[Linus Torvalds][6] 创造的只是其中的最内圈,即 Linux 内核。 + +![Linux 内核结构][3] + +要使用 Linux,即使是以最原始的形式,甚至没有 GUI,你也需要一个 shell。最常见的是 Bash shell。 + +然后,你需要在 shell 中运行一些命令来完成一些工作。你能记起一些基本的 Linux 命令吗?比如 `cat`、`cp`、`mv`、`grep`、`find`、`diff`、`gzip` 等等。 + +严格来说,这些所谓的“Linux 命令”并不是只属于 Linux。它们中的很多都来源于 UNIX 操作系统。 + +在 Linux 诞生之前,Richard Stallman 就已经在 1983 年创建了自由软件项目free software project中的第一个项目:GNU(GNU 是“GNU is Not Unix” 的递归缩写)。[GNU 项目][7]实现了许多流行的 Unix 实用程序,如 `cat`、`grep`、`awk`、shell(`bash`),同时还开发了自己的编译器(GCC)和编辑器(Emacs)。 + +在 80 年代,UNIX 是专有软件,而且超级昂贵。这就是为什么 Linus Torvalds 开发了一个类似 UNIX 的新内核的原因。为了与 Linux 内核进行交互,Linus Torvalds 使用了 GNU 工具,这些工具在其 GPL 开源许可证下是免费的。 + +有了这些 GNU 工具,它的行为也像 UNIX 一样。这就是为什么 Linux 也被称为类 UNIX 操作系统的原因。 + +你无法想象没有 shell 和所有这些命令的 Linux。由于 Linux 与 GNU 工具集成得很深,几乎是完全依赖于 GNU 工具,所以纯粹主义者要求 GNU 应该得到应有的认可,这就是为什么他们坚称它为 GNU Linux(写成 GNU/Linux)。 + +### 总结 + +那么,该用哪个术语?Linux、GNU/Linux、Linux 发行版,基于 Linux 的操作系统还是类 UNIX 操作系统?这取决于你的上下文。我已经为你提供了足够的细节,让你对这些相关的术语有更好的理解。 + +我希望你喜欢这个 Linux 黑话解释系列,并能学习到新的东西。欢迎你的反馈和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/what-is-linux-distribution/ + +作者:[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://www.gnu.org/manual/blurbs.html +[2]: https://itsfoss.com/what-is-desktop-environment/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/Linux_Kernel_structure.png?resize=800%2C350&ssl=1 +[4]: https://itsfoss.com/what-is-linux/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/operating_system_analogy.png?resize=800%2C350&ssl=1 +[6]: https://itsfoss.com/linus-torvalds-facts/ +[7]: https://www.gnu.org/gnu/thegnuproject.en.html +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/what-is-linux-distribution.png?resize=800%2C450&ssl=1 +[9]: https://linux.cn/article-12589-1.html \ No newline at end of file diff --git a/published/202009/20200907 Program hardware from the Linux command line.md b/published/202009/20200907 Program hardware from the Linux command line.md new file mode 100644 index 0000000000..7ecd05315d --- /dev/null +++ b/published/202009/20200907 Program hardware from the Linux command line.md @@ -0,0 +1,217 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12667-1.html) +[#]: subject: (Program hardware from the Linux command line) +[#]: via: (https://opensource.com/article/20/9/hardware-command-line) +[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) + +使用 RT-Thread 的 FinSH 对硬件进行编程 +====== + +> 由于物联网(IoT)的兴起,对硬件进行编程变得越来越普遍。RT-Thread 可以让你可以用 FinSH 从 Linux 命令行与设备进行沟通、 + +![](https://img.linux.net.cn/data/attachment/album/202009/29/233059w523g55qzvo53h6i.jpg) + +RT-Thread 是一个开源的[实时操作系统][2],用于对物联网(IoT)设备进行编程。FinSH 是 [RT-Thread][3] 的命令行组件,它提供了一套操作界面,使用户可以从命令行与设备进行沟通。它主要用于调试或查看系统信息。 + +通常情况下,开发调试使用硬件调试器和 `printf` 日志来显示。但在某些情况下,这两种方法并不是很有用,因为它是从运行的内容中抽象出来的,而且它们可能很难解析。不过 RT-Thread 是一个多线程系统,当你想知道一个正在运行的线程的状态,或者手动控制系统的当前状态时,这很有帮助。因为它是多线程的,所以你能够拥有一个交互式的 shell,你可以直接在设备上输入命令、调用函数来获取你需要的信息,或者控制程序的行为。如果你只习惯于 Linux 或 BSD 等现代操作系统,这在你看来可能很普通,但对于硬件黑客来说,这是极其奢侈的,远超将串行电缆直接连线到电路板上以获取一丝错误的做法。 + +FinSH 有两种模式。 + + * C 语言解释器模式,称为 c-style。 + * 传统的命令行模式,称为 msh(模块 shell)。 + +在 C 语言解释器模式下,FinSH 可以解析执行大部分 C 语言的表达式,并使用函数调用访问系统上的函数和全局变量。它还可以从命令行创建变量。 + +在 msh 模式下,FinSH 的操作与 Bash 等传统 shell 类似。 + +### GNU 命令标准 + +当我们在开发 FinSH 时,我们了解到,在编写命令行应用程序之前,你需要熟悉 GNU 命令行标准。这个标准实践的框架有助于给界面带入熟悉感,这有助于开发人员在使用时感到舒适和高效。 + +一个完整的 GNU 命令主要由四个部分组成。 + + 1. 命令名(可执行文件):命令行程序的名称; + 2. 子命令:命令程序的子函数名称。 + 3. 选项:子命令函数的配置选项。 + 4. 参数:子命令函数配置选项的相应参数。 + +你可以在任何命令中看到这一点。以 Git 为例: + +``` +git reset --hard HEAD~1 +``` + +这一点可以分解为: + +![GNU command line standards][4] + +可执行的命令是 `git`,子命令是 `reset`,使用的选项是 `--head`,参数是 `HEAD~1`。 + +再举个例子: + +``` +systemctl enable --now firewalld +``` + +可执行的命令是 `systemctl`,子命令是 `enable`,选项是 `--now`,参数是 `firewalld`。 + +想象一下,你想用 RT-Thread 编写一个符合 GNU 标准的命令行程序。FinSH 拥有你所需要的一切,并且会按照预期运行你的代码。更棒的是,你可以依靠这种合规性,让你可以自信地移植你最喜欢的 Linux 程序。 + +### 编写一个优雅的命令行程序 + +下面是一个 RT-Thread 运行命令的例子,RT-Thread 开发人员每天都在使用这个命令: + +``` +usage: env.py package [-h] [--force-update] [--update] [--list] [--wizard] +                      [--upgrade] [--printenv] + +optional arguments: +  -h, --help      show this help message and exit +  --force-update  force update and clean packages, install or remove the +                  packages by your settings in menuconfig +  --update        update packages, install or remove the packages by your +                  settings in menuconfig +  --list          list target packages +  --wizard        create a new package with wizard +  --upgrade       upgrade local packages list and ENV scripts from git repo +  --printenv      print environmental variables to check +``` + +正如你所看到的那样,它看起来很熟悉,行为就像你可能已经在 Linux 或 BSD 上运行的大多数 POSIX 应用程序一样。当使用不正确或不充分的语法时,它会提供帮助,它支持长选项和短选项。这种通用的用户界面对于任何使用过 Unix 终端的人来说都是熟悉的。 + +### 选项种类 + +选项的种类很多,按长短可分为两大类。 + + 1. 短选项:由一个连字符加一个字母组成,如 `pkgs -h` 中的 `-h` 选项。 + 2. 长选项:由两个连字符加上单词或字母组成,例如,`scons- --target-mdk5` 中的 `--target` 选项。 + +你可以把这些选项分为三类,由它们是否有参数来决定。 + + 1. 没有参数:该选项后面不能有参数。 + 2. 参数必选:选项后面必须有参数。 + 3. 参数可选:选项后可以有参数,但不是必需的。 + +正如你对大多数 Linux 命令的期望,FinSH 的选项解析非常灵活。它可以根据空格或等号作为定界符来区分一个选项和一个参数,或者仅仅通过提取选项本身并假设后面的内容是参数(换句话说,完全没有定界符)。 + + * `wavplay -v 50` + * `wavplay -v50` + * `wavplay --vol=50` + +### 使用 optparse + +如果你曾经写过命令行程序,你可能会知道,一般来说,你所选择的语言有一个叫做 optparse 的库或模块。它是提供给程序员的,所以作为命令的一部分输入的选项(比如 `-v` 或 `--verbose`)可以与命令的其他部分进行*解析*。这可以帮助你的代码从一个子命令或参数中获取一个选项。 + +当为 FinSH 编写一个命令时,`optparse` 包希望使用这种格式: + +``` +MSH_CMD_EXPORT_ALIAS(pkgs, pkgs, this is test cmd.); +``` + +你可以使用长形式或短形式,或者同时使用两种形式来实现选项。例如: + +``` +static struct optparse_long long_opts[] = +{ +    {"help"        , 'h', OPTPARSE_NONE}, // Long command: help, corresponding to short command h, without arguments. +    {"force-update",  0 , OPTPARSE_NONE}, // Long comman: force-update, without arguments +    {"update"      ,  0 , OPTPARSE_NONE}, +    {"list"        ,  0 , OPTPARSE_NONE}, +    {"wizard"      ,  0 , OPTPARSE_NONE}, +    {"upgrade"     ,  0 , OPTPARSE_NONE}, +    {"printenv"    ,  0 , OPTPARSE_NONE}, +    { NULL         ,  0 , OPTPARSE_NONE} +}; +``` + +创建完选项后,写出每个选项及其参数的命令和说明: + +``` +static void usage(void) +{ +    rt_kprintf("usage: env.py package [-h] [--force-update] [--update] [--list] [--wizard]\n"); +    rt_kprintf("                      [--upgrade] [--printenv]\n\n"); +    rt_kprintf("optional arguments:\n"); +    rt_kprintf("  -h, --help      show this help message and exit\n"); +    rt_kprintf("  --force-update  force update and clean packages, install or remove the\n"); +    rt_kprintf("                  packages by your settings in menuconfig\n"); +    rt_kprintf("  --update        update packages, install or remove the packages by your\n"); +    rt_kprintf("                  settings in menuconfig\n"); +    rt_kprintf("  --list          list target packages\n"); +    rt_kprintf("  --wizard        create a new package with wizard\n"); +    rt_kprintf("  --upgrade       upgrade local packages list and ENV scripts from git repo\n"); +    rt_kprintf("  --printenv      print environmental variables to check\n"); +} +``` + +下一步是解析。虽然你还没有实现它的功能,但解析后的代码框架是一样的: + +``` +int pkgs(int argc, char **argv) +{ + int ch; + int option_index; + struct optparse options; + + if(argc == 1) + { + usage(); + return RT_EOK; + } + + optparse_init(&options, argv); + while((ch = optparse_long(&options, long_opts, &option_index)) != -1) + { + ch = ch; + + rt_kprintf("\n"); + rt_kprintf("optopt = %c\n", options.optopt); + rt_kprintf("optarg = %s\n", options.optarg); + rt_kprintf("optind = %d\n", options.optind); + rt_kprintf("option_index = %d\n", option_index); + } + rt_kprintf("\n"); + + return RT_EOK; +} +``` + +这里是函数头文件: + +``` +#include "optparse.h" +#include "finsh.h" +``` + +然后,编译并下载到设备上。 + +![Output][6] + +### 硬件黑客 + +对硬件进行编程似乎很吓人,但随着物联网的发展,它变得越来越普遍。并不是所有的东西都可以或者应该在树莓派上运行,但在 RT-Thread,FinSH 可以让你保持熟悉的 Linux 感觉。 + +如果你对在裸机上编码感到好奇,不妨试试 RT-Thread。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/hardware-command-line + +作者:[Alan Smithee][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/alansmithee +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt) +[2]: https://opensource.com/article/20/6/open-source-rtos +[3]: https://github.com/RT-Thread/rt-thread +[4]: https://opensource.com/sites/default/files/uploads/command-line-apps_2.png (GNU command line standards) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/command-line-apps_3.png (Output) diff --git a/published/202009/20200909 How to Connect to WiFi from the Terminal in Ubuntu Linux.md b/published/202009/20200909 How to Connect to WiFi from the Terminal in Ubuntu Linux.md new file mode 100644 index 0000000000..0d5ba1fe40 --- /dev/null +++ b/published/202009/20200909 How to Connect to WiFi from the Terminal in Ubuntu Linux.md @@ -0,0 +1,199 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12629-1.html) +[#]: subject: (How to Connect to WiFi from the Terminal in Ubuntu Linux) +[#]: via: (https://itsfoss.com/connect-wifi-terminal-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Linux 终端中连接 WiFi? +====== + +> 在本教程中,你将学习如何在 Ubuntu 中从终端连接到无线网络。如果你在使用 Ubuntu 服务器时,无法访问常规的[桌面环境][1],这将对你非常有帮助。 + +我的家用电脑主要使用桌面 Linux。我也有多台 Linux 服务器用于托管网站以及开源软件,如 [Nextcloud][2]、[Discourse][3]、Ghost、Rocket Chat 等。 + +我可以使用 [Linode][4] 在云端几分钟内快速部署 Linux 服务器。但最近,我在我的树莓派上安装了 [Ubuntu 服务器][5]。这是我第一次在物理设备上安装服务器,我不得不做一些额外的事情来通过命令行将 Ubuntu 服务器连接到 WiFi。 + +在本教程中,我将展示在 Ubuntu Linux 中使用终端连接到 WiFi 的步骤。你应该: + + * 不要害怕使用终端编辑文件。 + * 知道 wifi 接入点名称 (SSID) 和密码。 + +### 在 Ubuntu 中从终端连接到 WiFi + +![][6] + +当你使用 Ubuntu 桌面时,连接到 WiFi 是很容易的,因为你有图形用户界面,可以很容易地做到这一点。但当你使用 Ubuntu 服务器时就不一样了,因为你只能使用命令行。 + +Ubuntu 使用 [Netplan][7] 工具来轻松配置网络。在 Netplan 中,你可以创建一个包含网络接口描述的 YAML 文件,然后在 `netplan` 命令行工具的帮助下,生成所有需要的配置。 + +让我们看看如何使用 Netplan 从终端连接到无线网络。 + +#### 步骤 1:确定你的无线网络接口名称 + +有几种方法可以识别你的网络接口名称。你可以使用 `ip` 命令、过时的 `ipconfig` 命令或查看这个文件: + +``` +ls /sys/class/net +``` + +这应该会展示所有可用的网络接口(以太网、WiFi 和环回)。无线网络接口名称以 `w` 开头,通常命名类似 `wlanX`、`wlpxyz`。 + +``` +[email protected]:~$ ls /sys/class/net +eth0 lo wlan0 +``` + +记下这个接口名。你将在下一步使用它。 + +#### 步骤 2:编辑 Netplan 配置文件中的 wifi 接口详细信息 + +Netplan 配置文件在 `/etc/netplan` 目录下。如果你查看这个目录的内容,你应该看到类似 `01-network-manager-all.yml` 或 `50-cloud-init.yaml` 等文件。 + +如果是 Ubuntu 服务器,你应该有 `50-cloud-init.yaml` 文件。如果是桌面计算机,应该是 `01-network-manager-all.yml` 文件。 + +Linux 桌面计算机的 Network Manager 允许你选择一个无线网络。你可以在它的配置中硬编码写入 WiFi 接入点。这可以在自动掉线的情况下(比如挂起)时帮助到你。 + +不管是哪个文件,都可以打开编辑。我希望你对 Nano 编辑器有一点[熟悉][8],因为 Ubuntu 预装了它。 + +``` +sudo nano /etc/netplan/50-cloud-init.yaml +``` + +YAML 文件对空格、缩进和对齐方式非常敏感。不要使用制表符,在看到缩进的地方使用 4 个空格(或 2 个,以 YAML 文件中已经使用的为准)代替。 + +基本上,你需要添加以下几行,引号中是接入点名称(SSID) 和密码(通常): + +``` +wifis: + wlan0: + dhcp4: true + optional: true + access-points: + "SSID_name": + password: "WiFi_password" +``` + +再说一次,保持我所展示的对齐方式,否则 YAML 文件不能被解析,它会抛出一个错误。 + +你的完整配置文件可能是这样的: + +``` +# This file is generated from information provided by the datasource. Changes +# to it will not persist across an instance reboot. To disable cloud-init's +# network configuration capabilities, write a file +# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: +# network: {config: disabled} +network: + ethernets: + eth0: + dhcp4: true + optional: true + version: 2 + wifis: + wlan0: + dhcp4: true + optional: true + access-points: + "SSID_name": + password: "WiFi_password" +``` + +我觉得很奇怪,尽管有消息说更改不会在实例重启后保留,但它仍然可以工作。 + +不管怎样,用这个命令生成配置: + +``` +sudo netplan generate +``` + +现在应用它: + +``` +sudo netplan apply +``` + +如果你幸运的话,你应该连上网络。尝试 `ping` 一个网站或运行 `apt` 更新命令。 + +然而,事情可能不会那么顺利,你可能会看到一些错误。如果是这种情况,请尝试一些额外的步骤。 + +#### 可能的故障排除 + +当你使用 `netplan apply` 命令时,你有可能在输出中看到类似这样的错误。 + +``` +Failed to start netplan-wpa-wlan0.service: Unit netplan-wpa-wlan0.service not found. +Traceback (most recent call last): + File "/usr/sbin/netplan", line 23, in + netplan.main() + File "/usr/share/netplan/netplan/cli/core.py", line 50, in main + self.run_command() + File "/usr/share/netplan/netplan/cli/utils.py", line 179, in run_command + self.func() + File "/usr/share/netplan/netplan/cli/commands/apply.py", line 46, in run + self.run_command() + File "/usr/share/netplan/netplan/cli/utils.py", line 179, in run_command + self.func() + File "/usr/share/netplan/netplan/cli/commands/apply.py", line 173, in command_apply + utils.systemctl_networkd('start', sync=sync, extra_services=netplan_wpa) + File "/usr/share/netplan/netplan/cli/utils.py", line 86, in systemctl_networkd + subprocess.check_call(command) + File "/usr/lib/python3.8/subprocess.py", line 364, in check_call + raise CalledProcessError(retcode, cmd) +subprocess.CalledProcessError: Command '['systemctl', 'start', '--no-block', 'systemd-networkd.service', 'netplan-wpa-wlan0.service']' returned non-zero exit status 5. +``` + +可能是 `wpa_supplicant` 服务没有运行。运行这个命令: + +``` +sudo systemctl start wpa_supplicant +``` + +再次运行 `netplan apply`。如果它能解决这个问题,那就太好了。否则,使用下面的命令[关闭 Ubuntu 系统][9]: + +``` +shutdown now +``` + +重新启动 Ubuntu 系统,登录并再次生成和运行 `netplan apply`: + +``` +sudo netplan generate +sudo netplan apply +``` + +现在可能会显示警告(而不是错误)。这是警告而不是错误。我检查了[正在运行的 systemd 服务][10],发现 `netplan-wpa-wlan0.service` 已经在运行了。可能是因为它已经在运行了,而且 `netplan apply` 更新了配置文件(即使没有任何改变),所以显示了警告。 + +``` +Warning: The unit file, source configuration file or drop-ins of netplan-wpa-wlan0.service changed on disk. Run 'systemctl daemon-reload' to reload units. +``` + +这并不重要,你可以通过运行 `apt update` 来检查网络是否已经正常工作。 + +我希望你能够在本教程的帮助下,在 Ubuntu 中使用命令行连接到 WiFi。如果你仍然遇到困难,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/connect-wifi-terminal-ubuntu/ + +作者:[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/what-is-desktop-environment/ +[2]: https://itsfoss.com/nextcloud/ +[3]: https://www.discourse.org/ +[4]: https://itsfoss.com/recommends/linode/ +[5]: https://itsfoss.com/install-ubuntu-server-raspberry-pi/ +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/connect-to-wifi-from-terminal-ubuntu.png?resize=800%2C450&ssl=1 +[7]: https://netplan.io/ +[8]: https://itsfoss.com/nano-editor-guide/ +[9]: https://itsfoss.com/schedule-shutdown-ubuntu/ +[10]: https://linuxhandbook.com/systemd-list-services/ diff --git a/published/202009/20200909 Manage your SSH connections with this open source tool.md b/published/202009/20200909 Manage your SSH connections with this open source tool.md new file mode 100644 index 0000000000..10e4bd0f0c --- /dev/null +++ b/published/202009/20200909 Manage your SSH connections with this open source tool.md @@ -0,0 +1,122 @@ +[#]: collector: "lujun9972" +[#]: translator: "hom" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12632-1.html" +[#]: subject: "Manage your SSH connections with this open source tool" +[#]: via: "https://opensource.com/article/20/9/ssh-connection-manager" +[#]: author: "Kenneth Aaron https://opensource.com/users/flyingrhino" + +使用开源工具 nccm 管理 SSH 连接 +====== + +> 使用 nccm 让你的终端连接 SSH 会话更快、更稳、更轻松。 + +![](https://img.linux.net.cn/data/attachment/album/202009/19/233942j6ne6wllnlbnjd36.jpg) + +OpenSSH 很常用,但没有一个知名的连接管理器,因此我开发了 ncurses SSH 连接管理器(`nccm`)来填补这个重要的空白。 `nccm` 是一个简单的 SSH 连接管理器,具有非常便于移植的终端界面(就如项目名称所示,使用 ncurses 编写)。最重要的是,它使用起来非常简单。有了 `nccm`,你可以花费最少的精力和最少的按键连接到你选择的 SSH 会话。 + +### 安装 nccm + +最快的方式是从它的 [Git 仓库][2]克隆该项目: + +``` +$ git clone https://github.com/flyingrhinonz/nccm nccm.git +``` + +在 `nccm.git/nccm` 的文件夹中有两个文件:`nccm` 自身和 `nccm.yml` 配置文件。 + +首先将 `nccm` 脚本复制到系统目录 `/usr/local/bin/` 中并添加执行权限,也可以通过使用`install` 命令来完成操作: + +``` +$ sudo install -m755 nccm –target-directory /usr/local/bin +``` + +文件 `nccm.yml` 可以拷贝到以下任意一个位置,默认从找到的第一个位置获取配置: + + * `~/.config/nccm/nccm.yml` + * `~/.nccm.yml` + * `~/nccm.yml` + * `/etc/nccm.yml` + +`nccm` 需要在 Python 3 的环境中运行,这在大部分的 Linux 环境是没问题的。大多数 Python 库的依赖包已经作为 Python 3 的一部分存在,但是,有一些 YAML 的依赖包和实用程序是你必须安装的。 + +如果你没有安装 `pip`,你可以使用包管理器来安装它。在安装的同时,也请安装 `yamllint` 应用程序来帮助你验证 `nccm.yml` 文件。 + +在 Debian 或类似系统使用 `apt` 命令: + +``` +$ sudo apt install python3-pip yamllint +``` + +在 Fedora 或者类似系统使用 `dnf` 命令: + +``` +$ sudo dnf install python3-pip yamllint +``` + +`PyYAML` 也是必须安装的,可以通过使用 `pip` 来安装: + +``` +$ pip3 install --user PyYAML +``` + +### 使用 nccm + +开始之前,需要修改 `nccm.yml` 文件来添加 SSH 连接配置,可以参照示例文件格式化 YAML 文件。仿照示例文件在开头添加连接名称,配置项使用两个空格缩进。不要忘了冒号(`:`),这是 YAML 的语言的格式。 + +不要担心你的 SSH 会话信息以何顺序排列,因为 `nccm` 在程序内提供了排序的方式。 + +如果修改完成,可以使用 `yamllint` 来校验配置: + +``` +$ yamllint ~/.config/nccm/nccm.yml +``` + +如果没有错误信息返回,说明文件的内容格式是正确的,可以进行下面的步骤。 + +如果 `nccm` 可以[从你的路径][3]中找到并且可以执行,那么输入 `nccm` 就可以启动 TUI(文本用户界面)了。如果你看到 Python 3 抛出的异常,请检查依赖包是否正确安装,任何异常都应该提到缺少的依赖包。 + +只要你没有在 YAML 配置文件中更改 `ncm_config_control` 模式,那么你可以使用以下的键盘按键来控制: + + * `Up`/`Down` 方向键 - 移动光标 + * `Home`/`End` - 跳转到文件开始和结尾 + * `PgUp`/`PgDn` - 以页为单位查看 + * `Left`/`Right` 方向键 - 水平滚动 + * `TAB` - 在文本框之间移动 + * 回车 - 连接选中的 SSH 会话 + * `Ctrl-h` - 显示帮助菜单 + * `Ctrl-q`/`Ctrl-c` - 退出 + * `F1`-`F5` 或 `!` `@` `#` `$` `%` - 按 1-5 列排序 + +使用 `F1` 到 `F5` 来按 1-5 列排序,如果你的设备占用了这些 `F1` - `F5` 键,你可以使用`!` `@` `#` `$` `%` 来替代。默认界面显示 4 列内容,但我们将用户名和服务器地址作为单独的列来排序,这样我们就有了 5 个排序方式。你也可以通过再次按下排序的按键来逆转排序。在选中的行上按回车可以建立会话。 + +![nccm screenshot terminal view][4] + +在 `Filter` 文本框中输入过滤内容,会用输入的内容以“与”的关系来过滤输出内容。这是不区分大小写的,而条目间用空白分隔。在 `Conn` 部分也是如此,但在这里按回车键可以连接到那个特定的条目编号。 + +这个工具还有许多功能需要你去发掘,比如专注模式,这些部分留下等待你去探索,也可以查看项目主页或者内置的帮助文档查看更多细节内容。 + +项目的 YAML 配置文件的文档是完善的,所以你可以查阅修改使 `nccm` 使用起来更加顺手。`nccm` 项目是非常希望得到你的反馈的,所以你可以复刻该项目然后添加更多新功能,欢迎大家提出拉取请求。 + +### 使用 nccm 来放松连接 SSH 的压力 + +像我一样,我希望这个工具可以对你有用,感谢能够为开源工作增加自己的贡献,请接受 `nccm` 作为我对开源项目自由、高效工作所做的贡献。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/ssh-connection-manager + +作者:[Kenneth Aaron][a] +选题:[lujun9972][b] +译者:[hom](https://github.com/hom) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/flyingrhino +[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://github.com/flyingrhinonz/nccm +[3]: https://opensource.com/article/17/6/set-path-linux +[4]: https://opensource.com/sites/default/files/uploads/nccm_screenshot.png "nccm screenshot terminal view" diff --git a/published/202009/20200909 Using the Linux stat command to create flexible file listings.md b/published/202009/20200909 Using the Linux stat command to create flexible file listings.md new file mode 100644 index 0000000000..866f29bba6 --- /dev/null +++ b/published/202009/20200909 Using the Linux stat command to create flexible file listings.md @@ -0,0 +1,131 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12637-1.html) +[#]: subject: (Using the Linux stat command to create flexible file listings) +[#]: via: (https://www.networkworld.com/article/3573802/using-the-linux-stat-command-to-create-flexible-file-listings.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +使用 Linux stat 命令创建灵活的文件列表 +====== + +![](https://img.linux.net.cn/data/attachment/album/202009/21/223030wi3xfx2eprij13z2.jpg) + +`stat` 命令提供了很多关于文件的详细信息。 + +它不仅提供了文件最近变化的日期/时间,还显示了最近访问文件的时间和权限变化。它可以同时告诉你文件的字节大小和块的数量。它可以显示文件使用的 inode 以及文件类型。它包括了文件所有者和相关用户组的名称和 UID/GID。它以 “rwx”(被称为 “人类可读” 格式)和数字方式显示文件权限。在某些系统中,它甚至可能包括文件创建的日期和时间(称为“出生”)。 + +除了提供所有这些信息外,`stat` 命令还可以用来创建文件列表。这些列表非常灵活,你可以选择包含上述任何或全部信息。 + +要生成一个自定义列表,你只需要使用 `stat` 命令的 `-c`(或 `--format`)选项,并指定你想要包含的字段。例如,要创建一个以两种格式显示文件权限的列表,使用这个命令: + +``` +$ stat -c '%n %a %A' my* +my.banner 664 -rw-rw-r-- +mydir 775 drwxrwxr-x +myfile 664 -rw-rw-r-- +myjunk 777 lrwxrwxrwx +mykey 664 -rw-rw-r-- +mylog 664 -rw-rw-r-- +myscript 755 -rwxr-xr-x +mytext 664 -rw-rw-r-- +mytext.bak 664 -rw-rw-r-- +mytwin 50 -rw-r----- +mywords 664 -rw-rw-r-- +``` + +如上例所示,`%n` 代表文件名,`%a` 代表八进制的权限,`%A` 代表 `rwx` 形式的权限。完整的列表如后面所示。 + +要为这个命令创建一个别名,输入这个命令,或在 `.bashrc` 文件中添加这个定义。 + +``` +$ alias ls_perms="stat -c '%n %a %A'" +``` + +要创建一个非常接近 `ls -l` 提供的长列表,可以这样做: + +``` +$ stat -c '%A %h %U %G %s %y %n' my* +-rw-rw-r-- 1 shs shs 255 2020-04-01 16:20:00.899374215 -0400 my.banner +drwxrwxr-x 2 shs shs 4096 2020-09-07 12:50:20.224470760 -0400 mydir +-rw-rw-r-- 1 shs shs 6 2020-05-16 11:12:00.460355387 -0400 myfile +lrwxrwxrwx 1 shs shs 11 2020-05-28 18:49:21.666792608 -0400 myjunk +-rw-rw-r-- 1 shs shs 655 2020-01-14 15:56:08.540540488 -0500 mykey +-rw-rw-r-- 1 shs shs 8 2020-03-04 17:13:21.406874246 -0500 mylog +-rwxr-xr-x 1 shs shs 201 2020-09-07 12:50:41.316745867 -0400 myscript +-rw-rw-r-- 1 shs shs 40 2019-06-06 08:54:09.538663323 -0400 mytext +-rw-rw-r-- 1 shs shs 24 2019-06-06 08:48:59.652712578 -0400 mytext.bak +-rw-r----- 2 shs shs 228 2019-04-12 19:37:12.790284604 -0400 mytwin +-rw-rw-r-- 1 shs shs 1983 2020-08-10 14:39:57.164842370 -0400 mywords +``` + +不同之处包括: 1、不试图将字段排成可辨认的一列,2、日期是 `yy-mm-dd` 格式,3、时间字段更精确,4、增加了时区(-0400 是 EDT)。 + +如果你想根据最后一次访问的日期来列出文件(例如,用 `cat` 命令来显示),使用这样的命令: + +``` +$ stat -c '%n %x' my* | sort -k2 +mytwin 2019-04-22 11:25:20.656828964 -0400 +mykey 2020-08-20 16:10:34.479324431 -0400 +mylog 2020-08-20 16:10:34.527325066 -0400 +myfile 2020-08-20 16:10:57.815632794 -0400 +mytext.bak 2020-08-20 16:10:57.935634379 -0400 +mytext 2020-08-20 16:15:42.323391985 -0400 +mywords 2020-08-20 16:15:43.479407259 -0400 +myjunk 2020-09-07 10:04:26.543980300 -0400 +myscript 2020-09-07 12:50:41.312745815 -0400 +my.banner 2020-09-07 13:22:38.105826116 -0400 +mydir 2020-09-07 14:53:10.171867194 -0400 +``` + +用 `stat` 列出文件细节时,可用的选项包括: + + * `%a` - 八进制的访问权限(注意 `#` 和 `0` 的 printf 标志) + * `%A` – 人类可读的访问权限 + * `%b` – 分配的块数(见 `%B`) + * `%B` – `%b` 报告的每个块的字节数 + * `%C` – SELinux 安全上下文字符串 + * `%d` – 十进制的设备编号 + * `%D` – 十六进制的设备编号 + * `%f` – 十六进制的原始模式 + * `%F` – 文件类型 + * `%g` – 所有者的组 ID + * `%G` – 所有者的组名 + * `%h` – 硬链接的数量 + * `%i` – inode 编号 + * `%m` – 挂载点 + * `%n` – 文件名 + * `%N` – 如果是符号链接,会解引用为指向的文件名 + * `%o` – 最佳 I/O 传输大小提示 + * `%s` – 以字节为单位的总大小 + * `%t` – 十六进制的主要设备类型,用于字符/块设备特殊文件 + * `%T` – 十六进制的次要设备类型,用于字符/块设备特殊文件 + * `%u` – 所有者的用户 ID + * `%U` – 所有者的用户名 + * `%w` – 文件创建时间,以人类可读形式; 如果未知,则为 `-`。 + * `%W` – 文件创建时间,以 UNIX 纪元以来的秒数形式;如果未知,则为 `0`。 + * `%x` – 上次访问时间,以人类可读形式 + * `%X` – 上次访问时间,以 UNIX 纪元以来的秒数形式 + * `%y` – 上次数据修改时间,以人类可读形式 + * `%Y` – 上次数据修改时间,以 UNIX 纪元以来的秒数形式 + * `%z` – 上次状态改变的时间,以人类可读形式 + * `%Z` – 上次状态改变的时间,以 UNIX 纪元以来的秒数形式 + +这些字段的选择都列在手册页中,你可以选择任何一个,不过用你喜欢的选项创建一些别名应该可以省去很多麻烦。有些选项,如 SELinux 安全上下文字符串,除非在系统中有使用,它将不可用。文件创建时间只有在你的系统保留该信息的情况下才可用。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3573802/using-the-linux-stat-command-to-create-flexible-file-listings.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/published/202009/20200911 The New YubiKey 5C NFC Security Key Lets You Use NFC to Easily Authenticate Your Secure Devices.md b/published/202009/20200911 The New YubiKey 5C NFC Security Key Lets You Use NFC to Easily Authenticate Your Secure Devices.md new file mode 100644 index 0000000000..aa56effebd --- /dev/null +++ b/published/202009/20200911 The New YubiKey 5C NFC Security Key Lets You Use NFC to Easily Authenticate Your Secure Devices.md @@ -0,0 +1,79 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12630-1.html) +[#]: subject: (The New YubiKey 5C NFC Security Key Lets You Use NFC to Easily Authenticate Your Secure Devices) +[#]: via: (https://itsfoss.com/yubikey-5c-nfc/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +全新的 YubiKey 5C NFC 安全密钥让你可以使用 NFC 轻松认证你的安全设备 +====== + +如果你格外谨慎,会使用最好的认证方法来保护你的在线帐户的安全,你可能知道 [Yubico][1]。他们制作的硬件认证安全密钥可以取代[双因素认证][2],并摆脱在线账户的密码认证系统。 + +基本上,你只需将安全密钥插在电脑上,或者使用智能手机上的 NFC 来解锁访问账户。这样一来,你的认证方式就会完全保持离线状态。 + +![](https://img.linux.net.cn/data/attachment/album/202009/18/174323ior6v6xp1y1or1ov.jpg) + +当然,你可以随时使用 [Linux 中好用的密码管理器][4]。但如果你拥有一家公司,或为公司工作,或者只是对自己的隐私和安全格外谨慎,想增加一层额外的安全保护,这些硬件安全密钥可能值得一试。这些设备最近得到的进一步普及。 + +Yubico 的最新产品 [YubiKey 5C NFC][5] 可能令人印象深刻,因为它既可以作为 Type-C 的 USB 密钥使用,也可以作为 NFC 使用(只要用密钥碰触你的设备)。 + +下面,让我们来看看这款安全密钥的概况。 + +(LCTT 译注:请注意本文中的购买连接是原文作者的受益链接,如果你对此担心,请阅读其[受益政策][6]。) + +### Yubico 5C NFC:概述 + +![][7] + +YubiKey 5C NFC 是最新的产品,它同时使用 USB-C 和 NFC。因此,你可以轻松地将它插入 Windows、macOS 和 Linux 电脑。除了电脑,你还可以将其与 Android 或 iOS 智能手机或平板电脑配合使用。 + +不仅仅局限于 USB-C 和 NFC 的支持(这是件好事),它也恰好是世界上第一个支持智能卡的多协议安全密钥。 + +对于普通消费者来说,硬件安全密钥并不那么常见,因为它的成本很高。但在疫情流行的过程中,随着远程办公的兴起,一个更安全的认证系统肯定会派上用场。 + +以下是 Yubico 在其新闻稿中提到的内容: + +> Yubico 首席产品官 Guido Appenzeller 表示:“如今人们工作和上网的方式与几年前大不相同,尤其是在过去几个月内。用户不再仅仅被一种设备或服务所束缚,也不再希望受限于此。这就是为什么 YubiKey 5C NFC 是我们最受欢迎的安全密钥之一。它与大多数现代电脑和手机兼容,并可以在一系列传统和现代应用中良好运行。归根结底,我们的客户渴望的是无论如何都能“正常工作”的安全性。” + +YubiKey 5C NFC 支持的协议有 FIDO2、WebAuthn、FIDO U2F、PIV(智能卡)、OATH-HOTP 和 OATH-TOTP (基于哈希和时间的一次性密码)、[OpenPGP][8]、YubiOTP 和挑战应答认证。 + +考虑到所有这些协议,你可以轻松地保护任何支持硬件认证的在线帐户,同时还可以访问身份访问管理 (IAM) 解决方案。因此,这对个人用户和企业来说都是一个很好的选择。 + +### 定价和渠道 + +YubiKey 5C NFC 的价格为 55 美元。你可以直接从他们的[在线商店][5]订购,或者从你所在国家的任何授权经销商处购买。花费可能也会根据运输费用的不同而有所不同,但对于那些想要为他们的在线账户提供最佳安全级别的用户而言,55 美元似乎是个不错的价格。 + +值得注意的是,如果你订购两个以上的 YubiKeys,你可以获得批量折扣。 + +- [订购 YubiKey 5C NFC][5] + +### 总结 + +无论你是想保护你的云存储帐户还是其他在线帐户的安全,如果你不介意花点钱来保护你的数据安全,Yubico 的最新产品是值得一试的。 + +你是否使用过 YubiKey 或其他安全密钥,如 LibremKey 等?你对它的体验如何?你认为这些设备值得花钱吗? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/yubikey-5c-nfc/ + +作者:[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://itsfoss.com/recommends/yubikey/ +[2]: https://ssd.eff.org/en/glossary/two-factor-authentication +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/yubikey-5c-nfc-desktop.jpg?resize=800%2C671&ssl=1 +[4]: https://itsfoss.com/password-managers-linux/ +[5]: https://itsfoss.com/recommends/yubico-5c-nfc/ +[6]: https://itsfoss.com/affiliate-policy/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/yubico-5c-nfc.jpg?resize=800%2C671&ssl=1 +[8]: https://www.openpgp.org/ diff --git a/published/202009/20200912 Shutdown Taking Too Long- Here-s How to Investigate and Fix Long Shutdown Time in Linux.md b/published/202009/20200912 Shutdown Taking Too Long- Here-s How to Investigate and Fix Long Shutdown Time in Linux.md new file mode 100644 index 0000000000..250d06cd7f --- /dev/null +++ b/published/202009/20200912 Shutdown Taking Too Long- Here-s How to Investigate and Fix Long Shutdown Time in Linux.md @@ -0,0 +1,135 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12635-1.html) +[#]: subject: (Shutdown Taking Too Long? Here’s How to Investigate and Fix Long Shutdown Time in Linux) +[#]: via: (https://itsfoss.com/long-shutdown-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +关机时间太长的调查和解决的方法 +====== + +![](https://img.linux.net.cn/data/attachment/album/202009/20/233812o1kd114jzq11lq1l.jpg) + +> 你的 Linux 系统关机时间太长么?以下是你可以采取的步骤,来找出导致延迟关机的原因并解决这个问题。 + +我希望你对 [sigterm 和 sigkill][1] 的概念有一点熟悉。 + +当你[关闭 Linux 系统][2]时,它会发送终止信号(sigterm),并礼貌地要求正在运行的进程停止。有些进程不符合该行为,它们会忽略终止信号并继续运行。 + +这可能会导致关机过程的延迟,因为你的系统会在一个预定义的时间段内等待运行的进程停止。在这个时间段之后,它会发送 `kill` 信号来强制停止所有剩余的运行进程并关闭系统。 + +事实上,在某些情况下,你会在黑屏上看到一个类似 “a stop job is running” 的信息。 + +如果你的系统关闭时间太长,你可以做以下工作: + + * 检查哪个进程/服务耗时过长,以及你是否能删除或重新配置它,使其正常运行。 + * 更改系统强制停止运行进程前的默认等待时间。(快速而不优雅的方式) + +我的操作系统是使用 systemd 的 Ubuntu。这里的命令和步骤适用于任何使用 systemd 的 Linux 发行版(大多数发行版都是这样)。 + +![][3] + +### 检查哪些进程会导致 Linux 的长时间关机 + +如果你想找出问题所在,你应该检查上次关机时发生了什么。使用这个命令来获得“我知道你上个会话做了什么”(I Know What You Did Last Summer 的双关语)的力量。 + +``` +journalctl -rb -1 +``` + +[journalctl 命令][4]能让你读取系统日志。使用选项 `-b -1` 可以过滤最后一次启动会话的日志。使用选项 `-r` 时,日志将按时间倒序显示。 + +换句话说,`journalctl -rb -1` 命令将显示最后一次关闭 Linux 系统之前的系统日志。这里就是你需要分析 Linux 系统长时间关机问题的地方。 + +#### 没有 journal 日志?下面是你应该做的。 + +如果没有 journal 日志,请确认你的发行版是否使用 systemd。 + +即使在一些使用 systemd 的 Linux 发行版上,journal 日志也没有被默认激活。 + +请确认 `/var/log/journal` 是否存在。如果不存在,请创建它: + +``` +sudo mkdir /var/log/journal +``` + +你还应该检查 `/etc/systemd/journald.conf` 文件的内容,并确保 `Storage` 的值被设置为自动(`auto`)或持久(`persistent`)。 + +你是否在日志中发现可疑的东西?是否有一个进程/服务拒绝停止?如果是,调查一下是否可以在没有副作用的情况下删除它,或者是否可以重新配置它。请不要在这里盲目地去删除东西。你应该对这个进程有所了解。 + +### 通过减少默认停止超时来加快 Linux 中的关机速度(快速修复) + +关机的默认等待时间通常设置为 90 秒。在这个时间之后,你的系统会尝试强制停止服务。 + +如果你想让你的 Linux 系统快速关闭,你可以改变这个等待时间。 + +你可以在位于 `/etc/systemd/system.conf` 的配置文件中找到所有的 systemd 设置。这个文件中应该有很多以 `#` 开头的行。它们代表了文件中各条目的默认值。 + +在开始之前,最好先复制一份原始文件。 + +``` +sudo cp /etc/systemd/system.conf /etc/systemd/system.conf.orig +``` + +在这里寻找 `DefaultTimeoutStopSec`。它可能被设置为 90 秒。 + +``` +#DefaultTimeoutStopSec=90s +``` + +你得把这个值改成更方便的,比如 5 秒或 10 秒。 + +``` +DefaultTimeoutStopSec=5s +``` + +如果你不知道如何在终端中编辑配置文件,可以使用这个命令在系统默认的文本编辑器(如 Gedit)中打开文件进行编辑: + +``` +sudo xdg-open /etc/systemd/system.conf +``` + +![Change Shutdown Time Settings Ubuntu][5] + +不要忘记**删除 DefaultTimeoutStopSec 前的 `#` 号**。保存文件并重启系统。 + +这将帮助你减少 Linux 系统的关机延迟。 + +#### 看门狗问题! + +Linux 有一个名为看门狗的模块,用于监控某些服务是否在运行。它可以被配置为在系统因软件错误而挂起时自动重启系统。 + +在桌面系统上使用看门狗是不常见的,因为你可以手动关闭或重启系统。它经常被用于远程服务器上。 + +首先检查看门狗是否在运行: + +``` +ps -af | grep watch* +``` + +如果你的系统正在运行看门狗,你可以在 systemd 配置文件 `/etc/systemd/system.conf` 中将 `ShutdownWatchdogSec` 的值从 10 分钟改为更低的值。 + +### 你能解决关机时间过长的问题吗? + +希望本教程能帮助你解决系统长时间关机的问题。如果你成功解决了这个问题,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/long-shutdown-linux/ + +作者:[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://linuxhandbook.com/sigterm-vs-sigkill/ +[2]: https://itsfoss.com/schedule-shutdown-ubuntu/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/troubleshoot-long-shutdown-linux.gif?resize=800%2C450&ssl=1 +[4]: https://linuxhandbook.com/journalctl-command/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/change-shutdown-time-settings-ubuntu.png?resize=797%2C322&ssl=1 diff --git a/published/202009/20200914 How Nextcloud simplified the signup process for decentralization.md b/published/202009/20200914 How Nextcloud simplified the signup process for decentralization.md new file mode 100644 index 0000000000..f3475a562f --- /dev/null +++ b/published/202009/20200914 How Nextcloud simplified the signup process for decentralization.md @@ -0,0 +1,120 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12656-1.html) +[#]: subject: (How Nextcloud simplified the signup process for decentralization) +[#]: via: (https://opensource.com/article/20/9/decentralization-signup) +[#]: author: (Jan C. Borchardt https://opensource.com/users/jancborchardt) + +Nextcloud 如何简化去中心化的注册流程? +====== + +> Nextcloud 是开源软件,我们不提供托管服务,但我们却能从根本上简化注册体验。 + +![](https://img.linux.net.cn/data/attachment/album/202009/27/100351eqd88qub0b3ww0tu.jpg) + +我们一直有个列表,上面有几十个 Nextcloud 提供商,然而我听到的最常见的问题,即使是我的技术方面的朋友,也是: + +> ”嗨,Jan,你推荐哪个 Nextcloud 提供商?” + +当然,这也是可以理解的。如果你有一长串的供应商,你怎么选择?托管商在附近?名字可爱?标志最大? + +每一个使用服务器的去中心化开源解决方案都在努力解决这些: + + * Mastodon 有 [joinmastodon.org][2] 来选择社区,但很明显主实例是 mastodon.social。 + * Diaspora 有[joindiaspora.com][3],它也是主实例。 + * Matrix 有 [matrix.to][4],还有一个在 [Element.io][5] 的应用(多平台)。 + * WordPress 有 [wordpress.com][6]。我不确定是否有提供商能接近它的知名度。 + * PeerTube 有一堆实例,都有不同的技术细节。 + * Pixelfed 在[beta.joinpixelfed.org][7] 有一个早期版本的实例选择器,以及在 [pixelfed.social][8] 有一个大型实例。 + * 还有更多的去中心化开源应用的例子,这里列出了如何通过终端访问它、设置 Rust 实现、或使其在网络打印机上运行。 + +这就导致了一些问题: + + * 🔮 人们不知道该选哪个,有错失恐惧症Fear Of Missing Out(FOMO),然后根本不选。这就是选择的悖论! + * 🕸 网络并不是真正的去中心化,因为大多数人都在少数服务器上,或者主要是只有一台服务器。 + +Nextcloud 不存在这些问题。 + +### 我们的解决方案:简单注册 + +这是它是如何工作的: + +当你下载我们的手机或桌面应用时,你首先看到的是“登录”或“使用供应商注册”的选择。这是任何专有应用都会做的事情: + +![Android client][9] + +选择“注册”可打开应用中的[简易注册页面][10]。 + +![Web client][11] + +你输入你的电子邮件地址,然后点击“注册”。 + +输入密码,就可以了! 🎉 + +> ”等一下,这怎么这么简单?“ + +我知道,对吧?✨ + +事实上,它甚至比很多集中式的应用更简单,在那里你需要输入你的全名和电话号码,然后点击谷歌的验证码。 + +这基本上可以归结为: + +### 我们为你选择 + +而不是面对一个无法判断什么适合你供应商的名单,我们只向你展示一个选择。就好像我是你的朋友一样,我回答了那个关于我推荐哪家供应商的问题。 + +很好!😊 + +澄清一下:你可以修改供应商,但默认的应该很适合你。目前,它只是地理位置上离你最近的提供商。 + +除此之外,我们对通过简单注册列出的提供商有一些要求,以确保无论你选择哪一个提供商都能获得良好的用户体验: + + * 🎁 2 GB 的免费存储空间,而且不仅仅是试用期。 + * 🍱 一套核心应用。文件、日历、联系人、邮件、通话、任务、笔记。有些供应商甚至提供更多。 + * 🛡 最新版本,让你始终保持最新的功能、修复和安全更新。 + +除此之外,我们还提出了一个尊重隐私的流程。当你点击“注册”时,你的邮件不会发送给我们,而是直接发送给你选择的供应商,这将无缝过渡到他们的设置步骤,在那里你选择一个密码。这意味着在 Nextcloud 不会有任何数据泄露给我们,我们甚至不知道你选择的是哪家提供商! + +因此,虽然我们提供这项服务,而且它超级容易使用,但我们只做绝对最低限度的数据处理,以连接你与你的理想供应商。 + +### 去中心化项目需要简单的注册方式 + +很多开源软件项目可以从简单注册这样的体验中受益。我们[在最初发布的时候写过有关它的文章][12],我们希望这篇文章能澄清使它成功的设计决策,以便它能被更多项目采用。 + +去中心化是赋能,但只有当人们即使不知道服务器是什么也能简单注册时,才是真正的革命。 + +当然,现在也还不完美。比如,如果你已经在 Nextcloud 实例上有了账户,任何一个应用的登录过程都会要求你输入一个服务器地址,而很多人根本不知道那是什么。比如在很多邮件应用中,在这一步会有一个最受欢迎的供应商列表,底部有一个“自定义服务器”的条目。这也可能是一种可能性,但同样带来了系统过于集中的风险,或者让人们对选择什么感到困惑。 + +所以,我们不断尝试为所有 Nextcloud 桌面和移动应用改进这一点,比如 Nextcloud Talk 或者所有优秀的社区开发的应用。在 Android 上,我们与 DAVx5(Android 上的日历和联系人同步)紧密集成,而且,对于其他 Android 应用,还有一个[单点登录库][13]。不幸的是,在 iOS 上,就没有那么容易了,因为应用必须来自同一个开发者才能共享凭证。 + +如果你想合作解决类似这些有趣的挑战,[来加入我们的 Nextcloud 设计团队吧][14]! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/decentralization-signup + +作者:[Jan C. Borchardt][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/jancborchardt +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003601_05_mech_osyearbook2016_cloud_cc.png?itok=XSV7yR9e (clouds in the sky with blue pattern) +[2]: https://joinmastodon.org/ +[3]: https://joindiaspora.com +[4]: https://matrix.to +[5]: http://Element.io +[6]: https://wordpress.com +[7]: http://beta.joinpixelfed.org +[8]: http://pixelfed.social +[9]: https://opensource.com/sites/default/files/nextcloud-android-small.png (Android client) +[10]: https://nextcloud.com/signup +[11]: https://opensource.com/sites/default/files/nextcloud-web-small.png (Web client) +[12]: https://nextcloud.com/blog/introducing-simple-signup-you-can-now-get-started-with-nextcloud-in-2-steps/ +[13]: https://github.com/nextcloud/Android-SingleSignOn +[14]: https://nextcloud.com/design diff --git a/published/202009/20200914 Incremental backups with Btrfs snapshots.md b/published/202009/20200914 Incremental backups with Btrfs snapshots.md new file mode 100644 index 0000000000..2feb57cf58 --- /dev/null +++ b/published/202009/20200914 Incremental backups with Btrfs snapshots.md @@ -0,0 +1,102 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12653-1.html) +[#]: subject: (Incremental backups with Btrfs snapshots) +[#]: via: (https://fedoramagazine.org/btrfs-snapshots-backup-incremental/) +[#]: author: (Alessio https://fedoramagazine.org/author/alciregi/) + +使用 Btrfs 快照进行增量备份 +====== + +![](https://img.linux.net.cn/data/attachment/album/202009/26/112524cppfppjpvplyjzyx.jpg) + +快照snapshot是 Btrfs 的一个有趣的功能。快照是一个子卷的副本。生成快照是立即的。然而,生成快照与执行 `rsync` 或 `cp` 不同,快照并不是一创建就会占用空间。 + +> 编者注:来自 [BTRFS Wiki][2]:快照简单的来说就是一个子卷,它使用 Btrfs 的 COW 功能与其他子卷共享其数据(和元数据)。 + +占用的空间将随着原始子卷或快照本身(如果它是可写的)的数据变化而增加。子卷中已添加/修改的文件和已删除的文件仍然存在于快照中。这是一种方便的备份方式。 + +### 使用快照进行备份 + +快照驻留在子卷所在的同一磁盘上。你可以像浏览普通目录一样浏览它,并按照生成快照时的状态恢复文件的副本。顺便说一下,在快照子卷的同一磁盘上生成快照并不是一个理想的备份策略:如果硬盘坏了,快照也会丢失。快照的一个有趣的功能是可以将快照发送到另一个位置。快照可以被发送到外部硬盘或通过 SSH 发送到远程系统(目标文件系统也需要格式化为 Btrfs)。要实现这个,需要使用命令 `btrfs send` 和 `btrfs receive`。 + +### 生成快照 + +要使用 `btrfs send` 和 `btrfs receive` 命令,重要的是要将快照创建为只读,而快照默认是可写的。 + +下面的命令将对 `/home` 子卷进行快照。请注意 `-r` 标志代表只读。 + +``` +sudo btrfs subvolume snapshot -r /home /.snapshots/home-day1 +``` + +快照的名称可以是当前日期,而不是 `day1`,比如 `home-$(date +%Y%m%d)`。快照看起来像普通的子目录。你可以把它们放在任何你喜欢的地方。目录 `/.snapshots` 可能是一个不错的选择,以保持它们的整洁和避免混淆。 + +> 编者注:快照不会对自己进行递归快照。如果你创建了一个子卷的快照,子卷所包含的每一个子卷或快照都会被映射到快照里面的一个同名的空目录。 + +### 使用 btrfs send 进行备份 + +在本例中,U 盘中的目标 Btrfs 卷被挂载为 `/run/media/user/mydisk/bk`。发送快照到目标卷的命令是: + +``` +sudo btrfs send /.snapshots/home-day1 | sudo btrfs receive /run/media/user/mydisk/bk +``` + +这被称为初始启动,它相当于一个完整的备份。这个任务需要一些时间,取决于 `/home` 目录的大小。显然,后续的增量发送只需要更短的时间。 + +### 增量备份 + +快照的另一个有用的功能是能够以增量的方式执行发送任务。让我们再来生成一个快照。 + +``` +sudo btrfs subvolume snapshot -r /home /.snapshots/home-day2 +``` + +为了执行增量发送任务,需要指定上一个快照作为基础,并且这个快照必须存在于源文件和目标文件中。请注意 `-p` 选项。 + +``` +sudo btrfs send -p /.snapshot/home-day1 /.snapshot/home-day2 | sudo btrfs receive /run/media/user/mydisk/bk +``` + +再来一次(一天之后): + +``` +sudo btrfs subvolume snapshot -r /home /.snapshots/home-day3 + +sudo btrfs send -p /.snapshot/home-day2 /.snapshot/home-day3 | sudo btrfs receive /run/media/user/mydisk/bk +``` + +### 清理 + +操作完成后,你可以保留快照。但如果你每天都执行这些操作,你可能最终会有很多快照。这可能会导致混乱,并可能会在你的磁盘上使用大量的空间。因此,如果你认为你不再需要一些快照,删除它们是一个很好的建议。 + +请记住,为了执行增量发送,你至少需要最后一个快照。这个快照必须存在于源文件和目标文件中。 + +``` +sudo btrfs subvolume delete /.snapshot/home-day1 +sudo btrfs subvolume delete /.snapshot/home-day2 +sudo btrfs subvolume delete /run/media/user/mydisk/bk/home-day1 +sudo btrfs subvolume delete /run/media/user/mydisk/bk/home-day2 +``` + +注意:第 3 天的快照被保存在源文件和目标文件中。这样,明天(第 4 天),你就可以执行新的增量 `btrfs send`。 + +最后的建议是,如果 U 盘的空间很大,可以考虑在目标盘中保留多个快照,而在源盘中只保留最后一个快照。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/btrfs-snapshots-backup-incremental/ + +作者:[Alessio][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/alciregi/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/08/butterfs-816x346.png +[2]: https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Snapshots diff --git a/published/202009/20200914 Linux Jargon Buster- What is a Long Term Support (LTS) Release- What is Ubuntu LTS.md b/published/202009/20200914 Linux Jargon Buster- What is a Long Term Support (LTS) Release- What is Ubuntu LTS.md new file mode 100644 index 0000000000..12a89fe142 --- /dev/null +++ b/published/202009/20200914 Linux Jargon Buster- What is a Long Term Support (LTS) Release- What is Ubuntu LTS.md @@ -0,0 +1,100 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12618-1.html) +[#]: subject: (Linux Jargon Buster: What is a Long Term Support \(LTS\) Release? What is Ubuntu LTS?) +[#]: via: (https://itsfoss.com/long-term-support-lts/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Linux 黑话解释:什么是长期支持(LTS)版本?什么是 Ubuntu LTS? +====== + +在 Linux 的世界里,特别是谈到 [Ubuntu][1] 的时候,你会遇到 LTS(长期支持Long Term Support)这个词。 + +如果你是一个经验丰富的 Linux 用户,你可能知道 Linux 发行版的各个方面,比如 LTS 版本。但是,新用户或不太懂技术的用户可能不知道。 + +在这一章 Linux 黑话解释中,你将了解什么是 Linux 发行版的 LTS 版本。 + +### 什么是长期支持(LTS)版本? + +长期支持(LTS)版本通常与应用程序或操作系统有关,你会在较长的时间内获得安全、维护和(有时有)功能的更新。 + +LTS 版本被认为是最稳定的版本,它经历了广泛的测试,并且大多包含了多年积累的改进。 + +需要注意的是,LTS 版本的软件不一定涉及功能更新,除非有一个更新的 LTS 版本。但是,你会在 LTS 版本的更新中得到必要的错误修复和安全修复。 + +LTS 版本被推荐给生产级的消费者、企业和商家,因为你可以获得多年的软件支持,而且软件更新不会破坏系统。 + +如果你注意到任何软件的非 LTS 版本,它通常是具有新功能和较短支持时间跨度(例如 6-9 个月)的前沿版本,而 LTS 版本的支持时间为 3-5 年。 + +![][2] + +为了让大家更清楚的了解 LTS 和非 LTS 版本的区别,我们来看看选择 LTS 版本的一些优缺点。 + +#### LTS 版本的优点 + + * 软件更新与安全和维护修复的时间很长(Ubuntu 有 5 年支持) + * 广泛的测试 + * 软件更新不会带来破坏系统的变化 + * 你有足够的时间为下一个 LTS 版本准备系统 + +#### LTS 版本的缺点 + + * 不提供最新和最强的功能 + * 你可能会错过最新的硬件支持 + * 你也可能会错过最新的应用程序升级 + +现在,你知道了什么是 LTS 版本及其优缺点,是时候了解一下 Ubuntu 的 LTS 版本了。Ubuntu 是最流行的 Linux 发行版之一,也是少数同时拥有 LTS 和非 LTS 版本的发行版之一。 + +这就是为什么我决定用一整个章节来介绍它。 + +### 什么是 Ubuntu LTS? + +自 2006 年以来,Ubuntu 每六个月发布一个非 LTS 版本,每两年发布一个 LTS 版本,这一点一直如此。 + +最新的 LTS 版本是 [Ubuntu 20.04][3],它将被支持到 2025 年 4 月。换句话说,Ubuntu 20.04 在那之前都会收到软件更新。非 LTS 版本只支持九个月。 + +你会发现 Ubuntu LTS 版本总是被标为 “LTS”。至少,在 [Ubuntu 官方网站][4]上浏览最新的 Ubuntu 版本时是这样的。 + +为了让你更清楚,如果你见过 Ubuntu 16.04 LTS,那就意味着:**它早在 2016 年 4 月就已经发布,并且支持到 2021 年**(想想**5 年的软件更新**)。 + +同样,你也可以通过计算每个 Ubuntu LTS 版本发布日期接下来的**5 年**软件支持期来估计其更新支持情况。 + +### Ubuntu LTS 软件更新包括什么? + +![][5] + +Ubuntu LTS 版本在其发布的生命周期内都会收到安全和维护更新。除非该版本达到[生命末期(EOL)][6],否则你将获得所有必要的安全和错误修复。 + +在 LTS 版本中你不会注意到任何功能升级。所以,如果你想尝试最新的实验性技术,你可能需要将你的 Ubuntu 版本升级到一个非 LTS 版本。 + +我建议你参考我们最新的 [Ubuntu 升级指南][7]来了解更多关于升级 Ubuntu 的信息。 + +我也建议你阅读我们的文章[安装哪个 Ubuntu 版本][8],以消除你对不同 Ubuntu 版本的困惑,比如 [Xubuntu][9] 或 [Kubuntu][10],它们有什么不同。 + +我希望你现在对 LTS 这个术语有了更好的理解,尤其是在 Ubuntu LTS 方面。敬请关注未来更多的 Linux 黑话解释。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/long-term-support-lts/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://ubuntu.com/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/display-server-linux.png?resize=800%2C450&ssl=1 +[3]: https://itsfoss.com/download-ubuntu-20-04/ +[4]: https://ubuntu.com +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/ubuntu-lts-release.png?resize=800%2C397&ssl=1 +[6]: https://itsfoss.com/end-of-life-ubuntu/ +[7]: https://itsfoss.com/upgrade-ubuntu-version/ +[8]: https://itsfoss.com/which-ubuntu-install/ +[9]: https://xubuntu.org/ +[10]: https://kubuntu.org/ diff --git a/published/202009/20200915 KeePassXC is An Amazing Community Driven Open Source Password Manager -Not Cloud Based.md b/published/202009/20200915 KeePassXC is An Amazing Community Driven Open Source Password Manager -Not Cloud Based.md new file mode 100644 index 0000000000..94d5aa5334 --- /dev/null +++ b/published/202009/20200915 KeePassXC is An Amazing Community Driven Open Source Password Manager -Not Cloud Based.md @@ -0,0 +1,107 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12642-1.html) +[#]: subject: (KeePassXC is An Amazing Community Driven Open Source Password Manager [Not Cloud Based]) +[#]: via: (https://itsfoss.com/keepassxc/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +KeePassXC:社区驱动的开源密码管理器(不基于云服务) +====== + +![](https://img.linux.net.cn/data/attachment/album/202009/23/054245jxx9pyzk8p3kbxhw.jpg) + +> KeePassXC 是一款有用的开源跨平台密码管理器,即使它不是云端工具,在功能上也毫不逊色。下面,我们就来快速了解一下它。 + +### KeePassXC:一个跨平台的开源密码管理器 + +![][1] + +KeePassXC 是 [KeePassX][2] 的社区复刻版本,旨在成为 [KeePass Password Safe][3](适用于 Windows)的跨平台移植。它是完全免费使用和跨平台的(Windows、Linux 和 macOS)。 + +事实上,它是目前 [Linux 最佳密码管理器][4]之一。它的功能选项既适合新手,也适合那些想要进一步控制以保护系统上的密码数据库的高级用户。 + +是的,与我[最喜欢的 Bitwarden 密码管理器][5]不同,KeePassXC 不是基于云端的,密码永远不会离开系统。有些用户确实喜欢不把密码和秘密保存在云服务器中。 + +当你开始使用密码管理器时,你应该能在它上找到你所需要的所有基本功能。但是,在这里,为了让你初步了解,我会强调提到一些它提供的功能。 + +### KeePassXC 的功能 + +![][6] + +值得注意的是,对于一个新手来说,这些功能可能会让人有点不知所措。但是,考虑到你想充分使用它,我想你应该真正了解它所提供的功能: + +* 密码生成器 +* 能够从 1Password、KeePass 1 和任何 CSV 文件导入密码。 +* 通过导出和同步 SSL 证书支持,轻松共享数据库。 +* 支持数据库加密 (256 位 AES) +* 浏览器集成(可选) +* 能够搜索你的凭证 +* 在应用中自动输入密码 +* 数据库报告,以检查密码的健康状况和其他统计数字 +* 支持导出为 CSV 和 HTML +* 支持双因素认证令牌 +* 支持将文件附加到密码中 +* 支持 YubiKey +* 支持命令行 +* 支持集成 SSH 代理 +* 必要时改变加密算法 +* 能够使用 DuckDuckGO 下载网站图标 +* 数据库超时自动锁定 +* 清除剪贴板和搜索查询的能力 +* 自动保存文件 +* 支持文件夹/嵌套文件夹 +* 设置密码的有效期 +* 提供黑暗主题 +* 跨平台支持 + +正如你所看到的,它的确是一款功能丰富的密码管理器。所以,我建议你如果想使用提供的每一个功能,就好好探索它。 + +![][7] + +### 在 Linux 上安装 KeePassXC + +你应该能在你安装的发行版的软件中心找到它。 + +你也可以从官方网站上获得 AppImage 文件。如果你还不知道的话,我建议你去看看我们的[在 Linux 中使用 AppImage 文件][8]的指南。 + +另外,你还会发现有一个 snap 包可以用。除此之外,你还可以得到 Ubuntu PPA、Debian 包、Fedora 包和 Arch 包。 + +如果你好奇,你可以直接探索[官方下载页面][9]的可用包,并查看他们的 [GitHub 页面][10]的源代码。 + +- [下载 KeePassXC][11] + +### 总结 + +如果你不是 [Bitwarden][5] 等云端开源密码管理器的粉丝,KeePassXC 应该是你的绝佳选择。 + +在这里你得到的功能数量可以让你可以在多个平台上保证密码的安全和易于维护。即使没有开发团队的“官方”移动应用,你也可以尝试他们的一些[推荐应用][12],它们与其数据库兼容,并提供相同的功能。 + +你尝试过 KeePassXC 吗?你更喜欢使用什么作为你的密码管理器?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/keepassxc/ + +作者:[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/09/keepassxc-screenshot.jpg?resize=800%2C580&ssl=1 +[2]: https://www.keepassx.org/ +[3]: https://keepass.info +[4]: https://itsfoss.com/password-managers-linux/ +[5]: https://itsfoss.com/bitwarden/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/keepassxc-screenshot-1.jpg?resize=800%2C579&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/keepassxc-settings.png?resize=800%2C587&ssl=1 +[8]: https://itsfoss.com/use-appimage-linux/ +[9]: https://keepassxc.org/download/ +[10]: https://github.com/keepassxreboot/keepassxc +[11]: https://keepassxc.org +[12]: https://keepassxc.org/docs/#faq-platform-mobile \ No newline at end of file diff --git a/published/202009/20200916 Huawei ban could complicate 5G deployment.md b/published/202009/20200916 Huawei ban could complicate 5G deployment.md new file mode 100644 index 0000000000..64da10ca4b --- /dev/null +++ b/published/202009/20200916 Huawei ban could complicate 5G deployment.md @@ -0,0 +1,69 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12659-1.html) +[#]: subject: (Huawei ban could complicate 5G deployment) +[#]: via: (https://www.networkworld.com/article/3575408/huawei-ban-could-complicate-5g-deployment.html) +[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) + +对华为的禁令可能使 5G 部署复杂化 +====== + +> 对华为、中兴的禁令意味着无线运营商建设 5G 服务的选择减少了。 + +![](https://images.idgesg.net/images/article/2019/02/5g_wireless_technology_network_connections_by_credit-vertigo3d_gettyimages-1043302218_3x2-100787550-large.jpg) + +随着运营商竞相建设他们的 5G 网络,由于美国联邦政府的压力,在美国购买所需设备的选择比其他国家少,这可能会减缓部署。 + +在 2018 年的《国防授权法案》中,总部位于中国的华为和中兴通讯都被禁止向美国政府提供设备,此后不久又全面禁止进口。这极大地改变了竞争格局,并引发了美国 5G 的形态可能因此而改变的问题。 + +Gartner 的分析师 Michael Porowski 表示,虽然还不完全清楚,但运营商可以在哪里购买 5G 设备的限制有可能会减缓部署速度。 + +他说:”供应商数量仍然很多:爱立信、诺基亚、三星。中兴和华为都是更经济的选择。如果它们可用,你可能会看到更快的采用速度。” + +451 Research 的研究总监 Christian Renaud 表示,业界普遍认为,华为设备既成熟又价格低廉,而在没有华为的情况下,运营商也没有明确的替代方案。 + +他说:“目前,会有采用诺基亚或爱立信标准的运营商。(而且)现在判断谁最成熟还为时过早,因为部署是如此有限。” + +这种争论在运营商本身的覆盖地图上可以得到证实。虽然他们很快就大肆宣传 5G 服务在美国的许多市场上已经有了,但实际的地理覆盖范围大多局限于大城市核心区的公共场所。简而言之,大部分地区的 5G 部署还没有到来。 + +部署缓慢是有充分理由的。5G 接入点的部署密度要远高于上一代的无线技术,这使得该过程更加复杂且耗时。还有一个问题是,目前可用的 5G 用户设备数量还很少。 + +Renaud 说:“这就好比说,在有人发明汽车之前,说‘我已经有了这条八车道的高速公路’。” + +设备供应商目前的部分目标是通过私有部署来展示 5G 的潜力,这些部署将该技术用做信号隧道backhaul,用于支持[物联网][8]和其他针对单个企业的链接场景。 + +Renaud 说:“(设备供应商)都在大力推动私有部署这一块,然后他们可以利用这一点说:你看,我可以用在布鲁克林造船厂或某个私有部署的 5G 网络中,所以,如果可以的话……,它可以用于支持人们观看 YouTube。” + +对中国的禁令的一个不幸结果可能是供应商为满足 5G 要求而遵循的规范的分裂。Renaud 称,如果非中国供应商必须为允许华为和中兴的市场制作一个版本,而为不允许华为和中兴的地方制作不同的版本,这可能会给他们带来新的麻烦。 + +他说:“这将把成本负担转移到设备制造商身上,来试图支持不同的运营商实施。我们会造成非技术性的壁垒。”而这些,反过来又会导致客户体验受到影响。 + +但是,5G 已经通过[开放无线接入网技术][9]拥抱了更高的互操作性的趋势,它将 5G 栈各层之间的软件接口标准化。运营商和设备商都接受了这一推动,使得互操作性更有可能,这可能会在未来吸引更多的参与者。 + +当然,即便是普遍的互操作性,设备制造商仍然会试图建立客户依赖性。他说“在试图锁定客户的供应商和试图保持供应商中立的客户之间,总是会有一场拉锯战。这不会有很大的改变。(但是)我们显然已经看到了试图更加开放的动向。” + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3575408/huawei-ban-could-complicate-5g-deployment.html + +作者:[Jon Gold][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Jon-Gold/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/article/3203489/what-is-5g-fast-wireless-technology-for-enterprises-and-phones.html +[2]: https://www.networkworld.com/article/3568253/how-5g-frequency-affects-range-and-speed.html +[3]: https://www.networkworld.com/article/3568614/private-5g-can-solve-some-enterprise-problems-that-wi-fi-can-t.html +[4]: https://www.networkworld.com/article/3488799/private-5g-keeps-whirlpool-driverless-vehicles-rolling.html +[5]: https://www.networkworld.com/article/3570724/5g-can-make-for-cost-effective-private-backhaul.html +[6]: https://www.networkworld.com/article/3529291/cbrs-wireless-can-bring-private-5g-to-enterprises.html +[8]: https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html +[9]: https://www.networkworld.com/article/3574977/carriers-vendors-work-to-promote-5g-network-flexibility-with-open-standards.html +[10]: https://www.facebook.com/NetworkWorld/ +[11]: https://www.linkedin.com/company/network-world diff --git a/published/202009/20200916 Teach Python with Jupyter Notebooks.md b/published/202009/20200916 Teach Python with Jupyter Notebooks.md new file mode 100644 index 0000000000..423ef5b0a1 --- /dev/null +++ b/published/202009/20200916 Teach Python with Jupyter Notebooks.md @@ -0,0 +1,322 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12646-1.html) +[#]: subject: (Teach Python with Jupyter Notebooks) +[#]: via: (https://opensource.com/article/20/9/teach-python-jupyter) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +用 Jupyter Notebook 教 Python +====== + +> 有了 Jupyter、PyHamcrest,用一点测试的代码把它们连在一起,你就可以教任何适用于单元测试的 Python 内容。 + +![](https://img.linux.net.cn/data/attachment/album/202009/24/045721mubdfdx1tb11fibi.jpg) + +关于 Ruby 社区的一些事情一直让我印象深刻,其中两个例子是对测试的承诺和对易于上手的强调。这两方面最好的例子是 [Ruby Koans][2],在这里你可以通过修复测试来学习 Ruby。 + +要是我们能把这些神奇的工具也用于 Python,我们应该可以做得更好。是的,使用 [Jupyter Notebook][3]、[PyHamcrest][4],再加上一点类似于胶带的粘合代码,我们可以做出一个包括教学、可工作的代码和需要修复的代码的教程。 + +首先,需要一些“胶布”。通常,你会使用一些漂亮的命令行测试器来做测试,比如 [pytest][5] 或 [virtue][6]。通常,你甚至不会直接运行它。你使用像 [tox][7] 或 [nox][8] 这样的工具来运行它。然而,对于 Jupyter 来说,你需要写一小段粘合代码,可以直接在其中运行测试。 + +幸运的是,这个代码又短又简单: + +``` +import unittest + +def run_test(klass): +    suite = unittest.TestLoader().loadTestsFromTestCase(klass) +    unittest.TextTestRunner(verbosity=2).run(suite) +    return klass +``` + +现在,装备已经就绪,可以进行第一次练习了。 + +在教学中,从一个简单的练习开始,建立信心总是一个好主意。 + +那么,让我们来修复一个非常简单的测试: + +``` +@run_test +class TestNumbers(unittest.TestCase): + + def test_equality(self): + expected_value = 3 # 只改这一行 + self.assertEqual(1+1, expected_value) +``` + +``` + test_equality (__main__.TestNumbers) ... FAIL + + ====================================================================== + FAIL: test_equality (__main__.TestNumbers) + ---------------------------------------------------------------------- + Traceback (most recent call last): + File "", line 6, in test_equality + self.assertEqual(1+1, expected_value) + AssertionError: 2 != 3 + + ---------------------------------------------------------------------- + Ran 1 test in 0.002s + + FAILED (failures=1) +``` + +“只改这一行” 对学生来说是一个有用的标记。它准确地表明了需要修改的内容。否则,学生可以通过将第一行改为 `return` 来修复测试。 + +在这种情况下,修复很容易: + +``` +@run_test +class TestNumbers(unittest.TestCase): + + def test_equality(self): + expected_value = 2 # 修复后的代码行 + self.assertEqual(1+1, expected_value) +``` + +``` + test_equality (__main__.TestNumbers) ... ok + + ---------------------------------------------------------------------- + Ran 1 test in 0.002s + + OK +``` + +然而,很快,`unittest` 库的原生断言将被证明是不够的。在 `pytest` 中,通过重写 `assert` 中的字节码来解决这个问题,使其具有神奇的属性和各种启发式方法。但这在 Jupyter notebook 中就不容易实现了。是时候挖出一个好的断言库了:PyHamcrest。 + +``` +from hamcrest import * +@run_test +class TestList(unittest.TestCase): + + def test_equality(self): + things = [1, + 5, # 只改这一行 + 3] + assert_that(things, has_items(1, 2, 3)) +``` + +``` + test_equality (__main__.TestList) ... FAIL + + ====================================================================== + FAIL: test_equality (__main__.TestList) + ---------------------------------------------------------------------- + Traceback (most recent call last): + File "", line 8, in test_equality + assert_that(things, has_items(1, 2, 3)) + AssertionError: + Expected: (a sequence containing <1> and a sequence containing <2> and a sequence containing <3>) + but: a sequence containing <2> was <[1, 5, 3]> + + + ---------------------------------------------------------------------- + Ran 1 test in 0.004s + + FAILED (failures=1) +``` + +PyHamcrest 不仅擅长灵活的断言,它还擅长清晰的错误信息。正因为如此,问题就显而易见了。`[1, 5, 3]` 不包含 `2`,而且看起来很丑: + +``` +@run_test +class TestList(unittest.TestCase): + + def test_equality(self): + things = [1, + 2, # 改完的行 + 3] + assert_that(things, has_items(1, 2, 3)) +``` + +``` + test_equality (__main__.TestList) ... ok + + ---------------------------------------------------------------------- + Ran 1 test in 0.001s + + OK +``` + +使用 Jupyter、PyHamcrest 和一点测试的粘合代码,你可以教授任何适用于单元测试的 Python 主题。 + +例如,下面可以帮助展示 Python 从字符串中去掉空白的不同方法之间的差异。 + +``` +source_string = " hello world " + +@run_test +class TestList(unittest.TestCase): + + # 这是个赠品:它可以工作! + def test_complete_strip(self): + result = source_string.strip() + assert_that(result, + all_of(starts_with("hello"), ends_with("world"))) + + def test_start_strip(self): + result = source_string # 只改这一行 + assert_that(result, + all_of(starts_with("hello"), ends_with("world "))) + + def test_end_strip(self): + result = source_string # 只改这一行 + assert_that(result, + all_of(starts_with(" hello"), ends_with("world"))) +``` + +``` + test_complete_strip (__main__.TestList) ... ok + test_end_strip (__main__.TestList) ... FAIL + test_start_strip (__main__.TestList) ... FAIL + + ====================================================================== + FAIL: test_end_strip (__main__.TestList) + ---------------------------------------------------------------------- + Traceback (most recent call last): + File "", line 19, in test_end_strip + assert_that(result, + AssertionError: + Expected: (a string starting with ' hello' and a string ending with 'world') + but: a string ending with 'world' was ' hello world ' + + + ====================================================================== + FAIL: test_start_strip (__main__.TestList) + ---------------------------------------------------------------------- + Traceback (most recent call last): + File "", line 14, in test_start_strip + assert_that(result, + AssertionError: + Expected: (a string starting with 'hello' and a string ending with 'world ') + but: a string starting with 'hello' was ' hello world ' + + + ---------------------------------------------------------------------- + Ran 3 tests in 0.006s + + FAILED (failures=2) +``` + +理想情况下,学生们会意识到 `.lstrip()` 和 `.rstrip()` 这两个方法可以满足他们的需要。但如果他们不这样做,而是试图到处使用 `.strip()` 的话: + +``` +source_string = " hello world " + +@run_test +class TestList(unittest.TestCase): + + # 这是个赠品:它可以工作! + def test_complete_strip(self): + result = source_string.strip() + assert_that(result, + all_of(starts_with("hello"), ends_with("world"))) + + def test_start_strip(self): + result = source_string.strip() # 改完的行 + assert_that(result, + all_of(starts_with("hello"), ends_with("world "))) + + def test_end_strip(self): + result = source_string.strip() # 改完的行 + assert_that(result, + all_of(starts_with(" hello"), ends_with("world"))) +``` + +``` + test_complete_strip (__main__.TestList) ... ok + test_end_strip (__main__.TestList) ... FAIL + test_start_strip (__main__.TestList) ... FAIL + + ====================================================================== + FAIL: test_end_strip (__main__.TestList) + ---------------------------------------------------------------------- + Traceback (most recent call last): + File "", line 19, in test_end_strip + assert_that(result, + AssertionError: + Expected: (a string starting with ' hello' and a string ending with 'world') + but: a string starting with ' hello' was 'hello world' + + + ====================================================================== + FAIL: test_start_strip (__main__.TestList) + ---------------------------------------------------------------------- + Traceback (most recent call last): + File "", line 14, in test_start_strip + assert_that(result, + AssertionError: + Expected: (a string starting with 'hello' and a string ending with 'world ') + but: a string ending with 'world ' was 'hello world' + + + ---------------------------------------------------------------------- + Ran 3 tests in 0.007s + + FAILED (failures=2) +``` + +他们会得到一个不同的错误信息,显示去除了过多的空白: + +``` +source_string = " hello world " + +@run_test +class TestList(unittest.TestCase): + + # 这是个赠品:它可以工作! + def test_complete_strip(self): + result = source_string.strip() + assert_that(result, + all_of(starts_with("hello"), ends_with("world"))) + + def test_start_strip(self): + result = source_string.lstrip() # Fixed this line + assert_that(result, + all_of(starts_with("hello"), ends_with("world "))) + + def test_end_strip(self): + result = source_string.rstrip() # Fixed this line + assert_that(result, + all_of(starts_with(" hello"), ends_with("world"))) +``` + +``` + test_complete_strip (__main__.TestList) ... ok + test_end_strip (__main__.TestList) ... ok + test_start_strip (__main__.TestList) ... ok + + ---------------------------------------------------------------------- + Ran 3 tests in 0.005s + + OK +``` + +在一个比较真实的教程中,会有更多的例子和更多的解释。这种使用 Jupyter Notebook 的技巧,有的例子可以用,有的例子需要修正,可以用于实时教学,可以用于视频课,甚至,可以用更多的其它零散用途,让学生自己完成一个教程。 + +现在就去分享你的知识吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/teach-python-jupyter + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/read_book_guide_tutorial_teacher_student_apaper.png?itok=_GOufk6N (Person reading a book and digital copy) +[2]: https://github.com/edgecase/ruby_koans +[3]: https://jupyter.org/ +[4]: https://github.com/hamcrest/PyHamcrest +[5]: https://docs.pytest.org/en/stable/ +[6]: https://github.com/Julian/Virtue +[7]: https://tox.readthedocs.io/en/latest/ +[8]: https://nox.thea.codes/en/stable/ diff --git a/published/202009/20200917 What-s new with rdiff-backup.md b/published/202009/20200917 What-s new with rdiff-backup.md new file mode 100644 index 0000000000..81cdddede3 --- /dev/null +++ b/published/202009/20200917 What-s new with rdiff-backup.md @@ -0,0 +1,120 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12663-1.html) +[#]: subject: (What's new with rdiff-backup?) +[#]: via: (https://opensource.com/article/20/9/rdiff-backup-linux) +[#]: author: (Patrik Dufresne https://opensource.com/users/patrik-dufresne) + +11 年后重新打造的 rdiff-backup 2.0 有什么新功能? +====== + +> 这个老牌 Linux 备份方案迁移到了 Python 3 提供了添加许多新功能的机会。 + +![](https://img.linux.net.cn/data/attachment/album/202009/29/094858pb9pa3sppsq9x5z1.jpg) + +2020 年 3 月,[rdiff-backup][2] 升级到了 2.0 版,这距离上一个主要版本已经过去了 11 年。2020 年初 Python 2 的废弃是这次更新的动力,但它为开发团队提供了整合其他功能和优势的机会。 + +大约二十年来,`rdiff-backup` 帮助 Linux 用户在本地或远程维护他们的数据的完整备份,而无需无谓地消耗资源。这是因为这个开源解决方案可以进行反向增量备份,只备份从上一次备份中改变的文件。 + +这次改版(或者说,重生)得益于一个新的、自组织的开发团队(由来自 [IKUS Software][3] 的 Eric Zolf 和 Patrik Dufresne,以及来自 [Seravo][4] 的 Otto Kekäläinen 共同领导)的努力,为了所有 `rdiff-backup` 用户的利益,他们齐心协力。 + +### rdiff-backup 的新功能 + +在 Eric 的带领下,随着向 Python 3 的迁移,项目被迁移到了一个新的、不受企业限制的[仓库][5],以欢迎贡献。团队还整合了多年来提交的所有补丁,包括对稀疏文件的支持和对硬链接的修复。 + +#### 用 Travis CI 实现自动化 + +另一个巨大的改进是增加了一个使用开源 [Travis CI][6] 的持续集成/持续交付(CI/CD)管道。这允许在各种环境下测试 `rdiff-backup`,从而确保变化不会影响方案的稳定性。CI/CD 管道包括集成所有主要平台的构建和二进制发布。 + +#### 使用 yum 和 apt 轻松安装 + +新的 `rdiff-backup` 解决方案可以运行在所有主流的 Linux 发行版上,包括 Fedora、Red Hat、Elementary、Debian 等。Frank 和 Otto 付出了艰辛的努力,提供了开放的仓库以方便访问和安装。你可以使用你的软件包管理器安装 `rdiff-backup`,或者按照 GitHub 项目页面上的[分步说明][7]进行安装。 + +#### 新的主页 + +团队将网站从 Savannah 迁移到了 GitHub Pages,并对 [rdiff-backup.net][2] 官网进行了改版,加入了新的内容,让外观和感觉更加到位。 + +### 如何使用 rdiff-backup + +如果你是 `rdiff-backup` 的新手,你可能会对它的易用性感到惊讶。备份方案应该让你对备份和恢复过程感到舒适,而不是吓人。 + +#### 开始备份 + +要开始备份到本地驱动器,例如通过 USB 连接的驱动器,输入 `rdiff-backup` 命令,然后输入要备份的驱动器和要存储文件的目标目录。 + +例如,要备份到名为 `my_backup_drive` 的本地驱动器,请输入: + +``` +$ rdiff-backup /home/tux/ /run/media/tux/my_backup_drive/ +``` + +要将数据备份到异地存储,请使用远程服务器的位置,并在 `::` 后面指向备份驱动器的挂载点: + +``` +$ rdiff-backup /home/tux/ tux@example.com::/my_backup_drive/ +``` + +你可能需要[设置 SSH 密钥][8]来使这个过程更轻松。 + +#### 还原文件 + +做备份的原因是有时文件会丢失。为了使恢复尽可能简单,你甚至不需要 `rdiff-backup` 来恢复文件(虽然使用 `rdiff-backup` 命令提供了一些方便)。 + +如果你需要从备份驱动器中获取一个文件,你可以使用 `cp` 将其从备份驱动器复制到本地系统,或者对于远程驱动器使用 `scp` 命令。 + +对于本地驱动器,使用: + +``` +$ cp _run_media/tux/my_backup_drive/Documents/example.txt ~/Documents +``` + +或者用于远程驱动器: + +``` +$ scp tux@example.com::/my_backup_drive/Documents/example.txt ~/Documents +``` + +然而,使用 `rdiff-backup` 命令提供了其他选项,包括 `--restore-as-of`。这允许你指定你要恢复的文件的哪个版本。 + +例如,假设你想恢复一个文件在四天前的版本: + +``` +$ rdiff-backup --restore-as-of 4D /run/media/tux/foo.txt ~/foo_4D.txt +``` + +你也可以用 `rdiff-backup` 来获取最新版本: + +``` +$ rdiff-backup --restore-as-of now /run/media/tux/foo.txt ~/foo_4D.txt` +``` + +就是这么简单。另外,`rdiff-backup` 还有很多其他选项,例如,你可以从列表中排除文件,从一个远程备份到另一个远程等等,这些你可以在[文档][9]中了解。 + +### 总结 + +我们的开发团队希望用户能够喜欢这个改版后的开源 `rdiff-backup` 方案,这是我们不断努力的结晶。我们也感谢我们的贡献者,他们真正展示了开源的力量。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/rdiff-backup-linux + +作者:[Patrik Dufresne][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/patrik-dufresne +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer) +[2]: https://rdiff-backup.net/ +[3]: https://www.ikus-soft.com/en/ +[4]: https://seravo.fi/english +[5]: https://github.com/rdiff-backup/rdiff-backup +[6]: https://en.wikipedia.org/wiki/Travis_CI +[7]: https://github.com/rdiff-backup/rdiff-backup#installation +[8]: https://opensource.com/article/20/8/how-ssh +[9]: https://rdiff-backup.net/docs/examples.html diff --git a/published/202009/20200918 How to Fix -Repository is not valid yet- Error in Ubuntu Linux.md b/published/202009/20200918 How to Fix -Repository is not valid yet- Error in Ubuntu Linux.md new file mode 100644 index 0000000000..096e922410 --- /dev/null +++ b/published/202009/20200918 How to Fix -Repository is not valid yet- Error in Ubuntu Linux.md @@ -0,0 +1,99 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12666-1.html) +[#]: subject: (How to Fix “Repository is not valid yet” Error in Ubuntu Linux) +[#]: via: (https://itsfoss.com/fix-repository-not-valid-yet-error-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何修复 Ubuntu Linux 中的 “Release file is not valid yet” 错误 +====== + +我最近[在我的树莓派上安装了 Ubuntu 服务器][1]。我[在 Ubuntu 终端连接上了 Wi-Fi][2],然后做了我在安装任何 Linux 系统后都会做的事情,那就是更新系统。 + +当我使用 `sudo apt update` 命令时,它给了一个对我而言特别的错误。它报出仓库的发布文件在某个时间段内无效。 + +> E: Release file for is not valid yet (invalid for another 159d 15h 20min 52s). Updates for this repository will not be applied.** + +下面是完整输出: + +``` +ubuntu@ubuntu:~$ sudo apt update +Hit:1 http://ports.ubuntu.com/ubuntu-ports focal InRelease +Get:2 http://ports.ubuntu.com/ubuntu-ports focal-updates InRelease [111 kB] +Get:3 http://ports.ubuntu.com/ubuntu-ports focal-backports InRelease [98.3 kB] +Get:4 http://ports.ubuntu.com/ubuntu-ports focal-security InRelease [107 kB] +Reading package lists... Done +E: Release file for http://ports.ubuntu.com/ubuntu-ports/dists/focal/InRelease is not valid yet (invalid for another 21d 23h 17min 25s). Updates for this repository will not be applied. +E: Release file for http://ports.ubuntu.com/ubuntu-ports/dists/focal-updates/InRelease is not valid yet (invalid for another 159d 15h 21min 2s). Updates for this repository will not be applied. +E: Release file for http://ports.ubuntu.com/ubuntu-ports/dists/focal-backports/InRelease is not valid yet (invalid for another 159d 15h 21min 32s). Updates for this repository will not be applied. +E: Release file for http://ports.ubuntu.com/ubuntu-ports/dists/focal-security/InRelease is not valid yet (invalid for another 159d 15h 20min 52s). Updates for this repository will not be applied. + +``` + +### 修复 Ubuntu 和其他 Linux 发行版中 “Release file is not valid yet” 的错误。 + +![][3] + +错误的原因是系统上的时间和现实世界的时间不同。 + +你看,每个仓库文件都是在某个日期签名的,你可以通过查看发布文件信息了解: + +``` +sudo head /var/lib/apt/lists/ports.ubuntu.com_ubuntu_dists_focal_InRelease +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +Origin: Ubuntu +Label: Ubuntu +Suite: focal +Version: 20.04 +Codename: focal +Date: Thu, 23 Apr 2020 17:33:17 UTC +Architectures: amd64 arm64 armhf i386 ppc64el riscv64 s390x +``` + +现在,由于某些原因,我的 Ubuntu 服务器上的时间是过去时间,这也是为什么 Ubuntu 报出发布文件已经无效 X 天的原因。 + +如果你连接到了互联网,你可以**等待几分钟让系统同步时间**。 + +如果不行,你可以强制系统使用本地时间作为实时时钟(硬件时钟): + +``` +sudo timedatectl set-local-rtc 1 +``` + +`timedatectl` 命令可以让你在 Linux 上配置时间、日期和[更改时区][4]。 + +你应该不需要重新启动。它可以立即工作,你可以通过[更新你的 Ubuntu 系统][5]再次验证它。 + +如果问题解决了,你可以将[实时时钟][6]设置为使用 UTC(Ubuntu 推荐的)。 + +``` +sudo timedatectl set-local-rtc 0 +``` + +**是否为你解决了这个问题?** + +我希望这个提示能帮助你解决这个错误。如果你仍然遇到这个问题,请在评论栏告诉我,我会尽力帮助你。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/fix-repository-not-valid-yet-error-ubuntu/ + +作者:[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/install-ubuntu-server-raspberry-pi/ +[2]: https://itsfoss.com/connect-wifi-terminal-ubuntu/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/Repository-not-valid-yet-error-ubuntu.png?resize=800%2C450&ssl=1 +[4]: https://itsfoss.com/change-timezone-ubuntu/ +[5]: https://itsfoss.com/update-ubuntu/ +[6]: https://www.computerhope.com/jargon/r/rtc.htm diff --git a/published/202009/20200921 Linux Jargon Buster- What is a Rolling Release Distribution.md b/published/202009/20200921 Linux Jargon Buster- What is a Rolling Release Distribution.md new file mode 100644 index 0000000000..572d1011fc --- /dev/null +++ b/published/202009/20200921 Linux Jargon Buster- What is a Rolling Release Distribution.md @@ -0,0 +1,108 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12639-1.html) +[#]: subject: (Linux Jargon Buster: What is a Rolling Release Distribution?) +[#]: via: (https://itsfoss.com/rolling-release/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是滚动发行版? +====== + +在了解了[什么是 Linux][1]、[什么是 Linux 发行版][2]之后,当你开始使用 Linux 时,你可能会在 Linux 论坛的讨论中遇到“滚动发布rolling release”这个名词。 + +在这篇 Linux 黑话解释文章中,你将了解到 Linux 发行版的滚动发布模式。 + +### 什么是滚动发布? + +在软件开发中,滚动发布是一种模式,在这种模式下,软件的更新是连续推出的,而不是分批的版本。这样软件就能始终保持更新。滚动发行版rolling release distribution遵循同样的模式,它提供最新的 Linux 内核和软件版本,在它们一发布就提供。 + +[Arch Linux][3] 是滚动发行版中最流行的例子,然而 [Gentoo][4] 是最古老的滚动发行版,目前仍在开发中。 + +当你使用一个滚动发行版时,你会得到小而频繁的更新。这里没有像 Ubuntu 那样的重大 XYZ 版本发布。你会定期[更新 Arch][5]或其他滚动发行版,你将永远拥有最新版本的发行版。 + +滚动发布也是以测试为代价的。当最新的更新开始给你的系统带来问题时,你也许会受到“惊吓”。 + +### 对比滚动式发布与点版本式发布的发行版 + +![][6] + +许多 Linux 发行版,如 Debian、Ubuntu、Linux Mint、Fedora 等都遵循点版本point release模式。他们每隔几个月/年就会发布一个主要的 XYZ 版本。 + +点版本由 Linux 内核、桌面环境和其他软件的新版本组成。 + +当一个新的点版本发行版的主要版本发布时,你必须[专门来升级你的系统][7]。 + +相反,在滚动发行版中,当它从开发者那里发布时,你会不断地获得新的功能更新。这样,你不需要在几个月或几年后进行版本升级。你总是拥有最新的东西。 + +**哦,但我的 Ubuntu 也会定期更新,几乎每周一次。这是否意味着 Ubuntu 也在滚动发布?** + +![][8] + +不,Ubuntu 不是滚动发布。你看,你通常从 Ubuntu 得到的更新是安全和维护更新(除了一些软件,比如 Mozilla Firefox),而不是新功能的发布。 + +例如,GNOME 3.38 已经发布了,但 Ubuntu LTS 20.04 版不会给你 GNOME 3.38。它将坚持使用 3.36 版本。如果 GNOME 3.36 有安全或维护更新,你会在 Ubuntu 的更新中得到它。 + +LibreOffice 版本也是如此。Ubuntu 20.04 LTS 坚持使用 LibreOffice 6.x 系列,而 LibreOffice 7 已经发布了。请记住,我说的是官方软件库中的软件版本。你可以自由地从他们的官方网站上下载一个更新版本的 LibreOffice,或者使用 PPA。但你不会从 Ubuntu 的软件库中得到它。 + +当 Ubuntu 发布下一个版本 Ubuntu 20.10 时,你会得到 LibreOffice 7 和 GNOME 3.38。 + +**为什么一些滚动发行版有“版本号”和发行版名称?** + +![][9] + +这是一个合理的问题。Arch Linux 是滚动发布的,它总是让你的系统保持更新,然而你会看到像 Arch Linux 2020.9.01 这样的版本号。 + +现在想象一下,你在 2018 年安装了 Arch Linux。你定期更新你的 Arch Linux 系统,所以你在 2020 年 9 月拥有所有最新的内核和软件。 + +但是,如果你决定在 2020 年 9 月在一个新系统上安装 Arch Linux 会发生什么?如果你使用 2018 年使用的相同的安装介质,你将不得不安装过去两年或更长时间内发布的所有系统更新。这很不方便,不是吗? + +这就是为什么 Arch Linux(和其他滚动发行版)每个月或每隔几个月都会提供一个新的 ISO(操作系统安装程序镜像文件),其中包含所有最新的软件。**这就是所谓的 ISO 刷新**。这样一来,新用户就会得到一个更新的 Linux 发行版。 + +如果你已经在使用滚动发行版,你就不用担心新的 ISO 刷新了。你的系统已经和它对等了。ISO 刷新对那些要在新系统上安装它的人是有帮助的。 + +### 滚动式发布的利与弊 + +滚动发布模式的好处是,你可以得到小而频繁的更新。你总是可以从你的发行版的仓库中获得最新的内核和最新的软件版本。 + +然而,这也可能带来新软件不可预见的问题。点版本发行版通常会对系统中集成的基本组件进行测试,以避免带来令人不便的错误。而在滚动发行版中,情况就不一样了,在滚动发行版中,软件一经开发者发布就会被推出。 + +### 你应该使用滚动发行版还是点版本发行版? + +![][10] + +这取决于你。如果你是一个新的 Linux 用户,或者如果你不习惯于排除你的 Linux 系统的故障,请坚持使用你选择的点版本发行版。这也建议用于你的生产和关键任务的机器,在这里你会想要一个稳定的系统。 + +如果你想要最新的和最棒的 Linux 内核和软件,并且你不害怕花费一些时间在故障排除上(时常发生),你可以选择滚动发行版。 + +在这一点上,我还想提到 Manjaro Linux 的混合滚动发布模式。Manjaro 确实遵循滚动发布模式,你不必将系统升级到较新的版本。不过,Manjaro 也会对基本的软件组件进行测试,而不是盲目的向用户推出。这也是[为什么这么多人使用 Manjrao Linux][11] 的原因之一。 + +### 我讲清楚了吗? + +希望你现在对“滚动发行版”这个词有了稍微的了解。如果你对它仍有一些疑问,请留言,我会尽力回答。我可能会更新文章以涵盖你的问题。祝你愉快 :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/rolling-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/what-is-linux/ +[2]: https://linux.cn/article-12609-1.html +[3]: https://www.archlinux.org/ +[4]: https://www.gentoo.org/ +[5]: https://itsfoss.com/update-arch-linux/ +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/what-is-rolling-release-distribution.png?resize=800%2C450&ssl=1 +[7]: https://itsfoss.com/upgrade-ubuntu-version/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/updates-available-ubuntu.png?resize=800%2C433&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/arch-linux-iso-refresh.png?resize=799%2C388&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/rolling-vs-point-release-distribution.png?resize=800%2C350&ssl=1 +[11]: https://itsfoss.com/why-use-manjaro-linux/ diff --git a/published/202009/20200921 Teach Python with the Mu editor.md b/published/202009/20200921 Teach Python with the Mu editor.md new file mode 100644 index 0000000000..ba38d69784 --- /dev/null +++ b/published/202009/20200921 Teach Python with the Mu editor.md @@ -0,0 +1,138 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12654-1.html) +[#]: subject: (Teach Python with the Mu editor) +[#]: via: (https://opensource.com/article/20/9/teach-python-mu) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +使用 Mu 编辑器教授 Python +====== + +> Mu 让你轻松学会如何编写 Python 代码。 + +![](https://img.linux.net.cn/data/attachment/album/202009/26/115018dkf3lvfyekifliec.jpg) + +在学校里,教孩子们编程是非常流行的。很多年前,在 Apple II 和 [Logo][2] 编程的年代,我学会了创建乌龟turtle绘图。我很喜欢学习如何对虚拟乌龟进行编程,后来也帮助学生进行编程。 + +大约五年前,我了解了 [Python 的 turtle 模块][3],这是我 Python 之旅的转折点。很快,我开始使用 `turtle` 模块来教学生 Python 编程基础,包括使用它来创建有趣的图形。 + +### 开始使用 Python 的 turtle 模块 + +在 Linux 或 macOS 电脑上,你只需打开一个终端,输入 `python`,你就会看到 Python shell。 + +如果你使用的是 Windows 电脑,则需要先安装 Python,到 Python 网站上[下载][4]最新的稳定版。 + +接下来,用 `import turtle ` 或 `import turtle as t` 将 `turtle` 模块导入 Python 中。然后你就可以开始享受创建乌龟绘图的乐趣了。 + +### 认识一下 Mu + +在我的 Python 冒险的早期,我使用了 [IDLE][5],它是 Python 的集成开发环境。它比在 Python shell 中输入命令要容易得多,而且我可以编写和保存程序供以后使用。我参加了一些在线课程,阅读了许多关于 Python 编程的优秀书籍。我教老师和学生如何使用 IDLE 创建乌龟绘图。 + +IDLE 是一个很大的改进,但在克利夫兰的 PyConUS 2019 上,我看到了 [Nicholas Tollervey][6]的演讲,这改变了我学习和教授 Python 的方式。Nick 是一位教育家,他创建了 [Mu][7],一个专门为年轻程序员(甚至像我这样的老程序员)设计的 Python 编辑器。Mu 可以安装在 Linux、macOS 和 Windows 上。它很容易使用,并且附带了优秀的[文档][8]和[教程][9]。 + +在 Linux 上,你可以通过命令行安装 Mu。 + +在 Ubuntu 或 Debian 上: + +``` +$ sudo apt install mu-editor +``` + +在 Fedora 或类似的地方: + +``` +$ sudo dnf install mu +``` + +或者,你可以使用 Python 来进行安装。首先,确保你已经安装了 Python 3: + +``` +$ python --version +``` + +如果失败了,就试试: + +``` +$ python3 --version +``` + +假设你有 Python 3 或更高版本,使用 Python 包管理器 `pip` 安装 Mu。 + +``` +$ python -m pip install mu-editor --user +``` + +然后你可以从命令行运行 Mu,或者创建一个快捷方式: + +``` +$ python -m pip install shortcut mu-editor --user +``` + +[树莓派][10]上默认安装了 Mu,这是一个很大的优点。在过去的几年里,我已经向学生介绍了使用树莓派和 Mu 编辑器的 Python 编程。 + +### 如何用 Mu 教授 Python + +Mu 是向学生展示 Python 入门的好方法。下面是我如何教学生开始使用它。 + +1. 打开 Mu 编辑器。 + + ![Mu editor][11] +2. 输入 `import turtle` 导入 `turtle` 模块,就可以让乌龟动起来了。我的第一课是用 Python 代码画一个简单的正方形。 + + ![Mu editor][13] +3. 保存这个程序,确保文件名以 .py 结尾。 + + ![Saving program in Mu][14] +4. 运行程序。哪怕是运行这样一个简单的程序都会让人兴奋,看到你写的程序的图形输出是很有趣的。 + + ![Running Python program in Mu][15] + +### 超越基础知识 + +在上完这节简单的课后,我讲解了有一些方法可以简化和扩展学生所学的基础知识。一是创建一个更简单的 `turtle` 对象,`import turtle as t`。然后我介绍了一个 `for` 循环,用另外一种 `turtle` 方法画一个正方形。 + +![for loops in Python with Mu][16] + +接下来,我将展示如何创建一个 `my_square` 函数,作为另一种绘制正方形的方法。 + +![my_square function][17] + +后来,我通过介绍其他 `turtle` 模块方法,包括 `penup`、`pendown` 和 `pencolor` 来扩展这个概念。很快,我的学生们就开始开发更复杂的程序,并对其进行迭代。 + +![Mu editor][18] + +我一直渴望学习,我很想知道你在学校或家里是如何教授 Python 的。请在评论中分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/teach-python-mu + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://en.wikipedia.org/wiki/Logo_(programming_language) +[3]: https://docs.python.org/3/library/turtle.html +[4]: https://www.python.org/downloads/windows/ +[5]: https://docs.python.org/3/library/idle.html +[6]: https://ntoll.org/ +[7]: https://codewith.mu/en/download +[8]: https://codewith.mu/en/howto/ +[9]: https://codewith.mu/en/tutorials/ +[10]: https://www.raspberrypi.org/blog/mu-python-ide/ +[11]: https://opensource.com/sites/default/files/uploads/mu-1_open.png (Mu editor) +[12]: https://creativecommons.org/licenses/by-sa/4.0/ +[13]: https://opensource.com/sites/default/files/uploads/mu-2_square.png (Mu editor) +[14]: https://opensource.com/sites/default/files/uploads/mu-3_save.png (Saving program in Mu) +[15]: https://opensource.com/sites/default/files/uploads/mu-4_run.png (Running Python program in Mu) +[16]: https://opensource.com/sites/default/files/uploads/mu-5_for-loop.png (for loops in Python with Mu) +[17]: https://opensource.com/sites/default/files/uploads/mu-6_my_square.png (my_square function) +[18]: https://opensource.com/sites/default/files/uploads/mu-7_beyond-basics.png (Mu editor) diff --git a/published/202009/20200923 Meet eDEX-UI, A Sci-Fi Inspired Linux Terminal Emulator With Some Cool Features.md b/published/202009/20200923 Meet eDEX-UI, A Sci-Fi Inspired Linux Terminal Emulator With Some Cool Features.md new file mode 100644 index 0000000000..0e0aabb207 --- /dev/null +++ b/published/202009/20200923 Meet eDEX-UI, A Sci-Fi Inspired Linux Terminal Emulator With Some Cool Features.md @@ -0,0 +1,105 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12655-1.html) +[#]: subject: (Meet eDEX-UI, A Sci-Fi Inspired Linux Terminal Emulator With Some Cool Features) +[#]: via: (https://itsfoss.com/edex-ui-sci-fi-terminal/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +eDEX-UI:一款科幻风格的酷炫 Linux 终端仿真器 +====== + +> eDEX-UI 是一个很酷的科幻电影式的终端仿真器,看起来很酷,有大量包括系统监控在内的选项。让我们来快速看看它提供了什么。 + +你可能已经知道了[大量有趣的 Linux 命令][1]。但你知道当谈到 Linux 命令行时,还有什么有趣的东西吗?那就是终端本身。 + +是的,终端仿真器(俗称终端)也可以很有趣。还记得 80 年代和 90 年代初的[酷炫复古的终端,给你一个复古的终端][2]吗? + +那一款深受 《[创:战纪][3]TRON Legacy》 电影特效启发的养眼终端感觉怎么样? + +在本文中,让我们来看看一款神奇的跨平台终端模拟器,注意口水! + +### eDEX-UI: 一个很酷的终端仿真器 + +[eDEX-UI][5] 是一款开源的跨平台终端仿真器,它为你呈现了一个科幻风格的外观和一些有用的功能。 + +它最初的灵感来自于 [DEX UI][6] 项目,但该项目已经不再维护。 + +尽管 eDEX-UI 的重点是外观和未来主义主题的终端,但它也可以作为一个 [Linux 系统监控工具][7]。怎么说呢?因为当你在终端中工作时,它可以在侧边栏中显示系统的统计信息。事实上,其开发者提到,他的目标是将其改进为一个可用的系统管理工具。 + +让我们来看看它还提供了什么,以及如何让它安装到你的电脑上。 + +### eDEX-UI 的特点 + +![][8] + +eDEX-UI 本质上是一个终端仿真器。你可以像普通终端一样使用它来运行命令和其他任何你可以在终端中做的事情。 + +它以全屏方式运行,侧边栏和底部面板可以监控系统和网络的统计信息。此外,还有一个用于触摸设备的虚拟键盘。 + +我做了一个简短的视频,我建议你观看这个视频,看看这个很酷的终端模拟器运行起来是什么样子。**播放视频时要打开声音**(相信我)。 + +- [视频](https://player.vimeo.com/video/460435965) + +eDEX-UI 的特点: + + * 多标签 + * 对 curses 的支持 + * 目录查看器,显示当前工作目录的内容 + * 显示系统信息,包括主板信息、网络状态、IP、网络带宽使用情况、CPU 使用情况、CPU 温度、RAM 使用情况等 + * 自定义选项,以改变主题、键盘布局、CSS 注入 + * 可选的声音效果,让你有一种黑客的感觉 + * 跨平台支持(Windows、macOS 和 Linux) + +### 在 Linux 上安装 eDEX + +![eDEX-UI with Matrix theme][10] + +如前所述,它支持所有主要平台,包括 Windows、macOS,当然还有 Linux。 + +要在 Linux 发行版上安装它,你可以从它的 [GitHub 发布部分][11]中抓取 AppImage 文件,或者在包括 [AUR][13] 在内的[可用资源库][12]中找到它。如果你不知道,我建议你去看一下我们关于[在 Linux 中使用 AppImage][14] 的指南。 + +你可以访问它的 GitHub 页面,如果你喜欢它,可以随时星标他们的仓库。 + +- [eDEX-UI][5] + +### 我对 eDEX-UI 的体验 + +因为它的科幻风格的外观,我喜欢这个终端仿真器。但是,我发现它对系统资源的消耗相当大。我没有[检查我的 Linux 系统的 CPU 温度][15],但 CPU 消耗肯定很高。 + +所以,如果你需要它运行在后台或单独的工作空间中(像我这样),你可能要注意这一点。除此以外,它是一个令人印象深刻的工具,拥有目录查看器和系统资源监控等有用的选项。 + +顺便说一句,如果你想模拟黑客来娱乐一下客人和孩子们,[那么可以试试好莱坞工具][16]。 + +你觉得 eDEX-UI 怎么样?你是想试一试,还是觉得太幼稚/过于复杂? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/edex-ui-sci-fi-terminal/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/funny-linux-commands/ +[2]: https://itsfoss.com/cool-retro-term/ +[3]: https://www.imdb.com/title/tt1104001/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/edex-ui-hacking-terminal.jpg?resize=800%2C450&ssl=1 +[5]: https://github.com/GitSquared/edex-ui +[6]: https://github.com/seenaburns/dex-ui +[7]: https://itsfoss.com/linux-system-monitoring-tools/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/edex-ui-screenshot-1.png?resize=800%2C450&ssl=1 +[9]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/edex-ui-screenshot.png?resize=800%2C450&ssl=1 +[11]: https://github.com/GitSquared/edex-ui/releases +[12]: https://repology.org/project/edex-ui/versions +[13]: https://itsfoss.com/aur-arch-linux/ +[14]: https://itsfoss.com/use-appimage-linux/ +[15]: https://itsfoss.com/check-laptop-cpu-temperature-ubuntu/ +[16]: https://itsfoss.com/hollywood-hacker-screen/ diff --git a/published/202010/20180414 Go on very small hardware Part 2.md b/published/202010/20180414 Go on very small hardware Part 2.md new file mode 100644 index 0000000000..fdce9ab34c --- /dev/null +++ b/published/202010/20180414 Go on very small hardware Part 2.md @@ -0,0 +1,935 @@ +[#]: collector: (oska874) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12747-1.html) +[#]: subject: (Go on very small hardware Part 2) +[#]: via: (https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html) +[#]: author: (Michał Derkacz https://ziutek.github.io/) + +Go 语言在极小硬件上的运用(二) +============================================================ + +![](https://img.linux.net.cn/data/attachment/album/201909/24/210256yihkuy8kcigugr2h.png) + +在本文的 [第一部分][2] 的结尾,我承诺要写关于接口的内容。我不想在这里写有关接口或完整或简短的讲义。相反,我将展示一个简单的示例,来说明如何定义和使用接口,以及如何利用无处不在的 `io.Writer` 接口。还有一些关于反射reflection半主机semihosting的内容。 + +![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/board.jpg) + +接口是 Go 语言的重要组成部分。如果你想了解更多有关它们的信息,我建议你阅读《[高效的 Go 编程][3]》 和 [Russ Cox 的文章][4]。 + +### 并发 Blinky – 回顾 + +当你阅读前面示例的代码时,你可能会注意到一中打开或关闭 LED 的反直觉方式。 `Set` 方法用于关闭 LED,`Clear` 方法用于打开 LED。这是由于在 漏极开路配置open-drain configuration 下驱动了 LED。我们可以做些什么来减少代码的混乱?让我们用 `On` 和 `Off` 方法来定义 `LED` 类型: + +``` +type LED struct { + pin gpio.Pin +} + +func (led LED) On() { + led.pin.Clear() +} + +func (led LED) Off() { + led.pin.Set() +} +``` + +现在我们可以简单地调用 `led.On()` 和 `led.Off()`,这不会再引起任何疑惑了。 + +在前面的所有示例中,我都尝试使用相同的 漏极开路配置open-drain configuration来避免代码复杂化。但是在最后一个示例中,对于我来说,将第三个 LED 连接到 GND 和 PA3 引脚之间并将 PA3 配置为推挽模式push-pull mode会更容易。下一个示例将使用以此方式连接的 LED。 + +但是我们的新 `LED` 类型不支持推挽配置,实际上,我们应该将其称为 `OpenDrainLED`,并定义另一个类型 `PushPullLED`: + +``` +type PushPullLED struct { + pin gpio.Pin +} + +func (led PushPullLED) On() { + led.pin.Set() +} + +func (led PushPullLED) Off() { + led.pin.Clear() +} +``` + +请注意,这两种类型都具有相同的方法,它们的工作方式也相同。如果在 LED 上运行的代码可以同时使用这两种类型,而不必注意当前使用的是哪种类型,那就太好了。 接口类型可以提供帮助: + +``` +package main + +import ( + "delay" + + "stm32/hal/gpio" + "stm32/hal/system" + "stm32/hal/system/timer/systick" +) + +type LED interface { + On() + Off() +} + +type PushPullLED struct{ pin gpio.Pin } + +func (led PushPullLED) On() { + led.pin.Set() +} + +func (led PushPullLED) Off() { + led.pin.Clear() +} + +func MakePushPullLED(pin gpio.Pin) PushPullLED { + pin.Setup(&gpio.Config{Mode: gpio.Out, Driver: gpio.PushPull}) + return PushPullLED{pin} +} + +type OpenDrainLED struct{ pin gpio.Pin } + +func (led OpenDrainLED) On() { + led.pin.Clear() +} + +func (led OpenDrainLED) Off() { + led.pin.Set() +} + +func MakeOpenDrainLED(pin gpio.Pin) OpenDrainLED { + pin.Setup(&gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain}) + return OpenDrainLED{pin} +} + +var led1, led2 LED + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + gpio.A.EnableClock(false) + led1 = MakeOpenDrainLED(gpio.A.Pin(4)) + led2 = MakePushPullLED(gpio.A.Pin(3)) +} + +func blinky(led LED, period int) { + for { + led.On() + delay.Millisec(100) + led.Off() + delay.Millisec(period - 100) + } +} + +func main() { + go blinky(led1, 500) + blinky(led2, 1000) +} + +``` + +我们定义了 `LED` 接口,它有两个方法: `On` 和 `Off`。 `PushPullLED` 和 `OpenDrainLED` 类型代表两种驱动 LED 的方式。我们还定义了两个用作构造函数的 `Make*LED` 函数。这两种类型都实现了 `LED` 接口,因此可以将这些类型的值赋给 `LED` 类型的变量: + +``` +led1 = MakeOpenDrainLED(gpio.A.Pin(4)) +led2 = MakePushPullLED(gpio.A.Pin(3)) +``` + +在这种情况下,可赋值性assignability在编译时检查。赋值后,`led1` 变量包含一个 `OpenDrainLED{gpio.A.Pin(4)}`,以及一个指向 `OpenDrainLED` 类型的方法集的指针。 `led1.On()` 调用大致对应于以下 C 代码: + +``` +led1.methods->On(led1.value) +``` + +如你所见,如果仅考虑函数调用的开销,这是相当廉价的抽象。 + +但是,对接口的任何赋值都会导致包含有关已赋值类型的大量信息。对于由许多其他类型组成的复杂类型,可能会有很多信息: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 10356 196 212 10764 2a0c cortexm0.elf +``` + +如果我们不使用 [反射][5],可以通过避免包含类型和结构字段的名称来节省一些字节: + +``` +$ egc -nf -nt +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 10312 196 212 10720 29e0 cortexm0.elf +``` + +生成的二进制文件仍然包含一些有关类型的必要信息和关于所有导出方法(带有名称)的完整信息。在运行时,主要是当你将存储在接口变量中的一个值赋值给任何其他变量时,需要此信息来检查可赋值性。 + +我们还可以通过重新编译所导入的包来删除它们的类型和字段名称: + +``` +$ cd $HOME/emgo +$ ./clean.sh +$ cd $HOME/firstemgo +$ egc -nf -nt +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 10272 196 212 10680 29b8 cortexm0.elf +``` + +让我们加载这个程序,看看它是否按预期工作。这一次我们将使用 [st-flash][6] 命令: + +``` +$ arm-none-eabi-objcopy -O binary cortexm0.elf cortexm0.bin +$ st-flash write cortexm0.bin 0x8000000 +st-flash 1.4.0-33-gd76e3c7 +2018-04-10T22:04:34 INFO usb.c: -- exit_dfu_mode +2018-04-10T22:04:34 INFO common.c: Loading device parameters.... +2018-04-10T22:04:34 INFO common.c: Device connected is: F0 small device, id 0x10006444 +2018-04-10T22:04:34 INFO common.c: SRAM size: 0x1000 bytes (4 KiB), Flash: 0x4000 bytes (16 KiB) in pages of 1024 bytes +2018-04-10T22:04:34 INFO common.c: Attempting to write 10468 (0x28e4) bytes to stm32 address: 134217728 (0x8000000) +Flash page at addr: 0x08002800 erased +2018-04-10T22:04:34 INFO common.c: Finished erasing 11 pages of 1024 (0x400) bytes +2018-04-10T22:04:34 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id +2018-04-10T22:04:34 INFO flash_loader.c: Successfully loaded flash loader in sram + 11/11 pages written +2018-04-10T22:04:35 INFO common.c: Starting verification of write complete +2018-04-10T22:04:35 INFO common.c: Flash written and verified! jolly good! + +``` + +我没有将 NRST 信号连接到编程器,因此无法使用 `-reset` 选项,必须按下复位按钮才能运行程序。 + +![Interfaces](https://ziutek.github.io/images/mcu/f030-demo-board/interfaces.png) + +看来,`st-flash` 与此板配合使用有点不可靠(通常需要复位 ST-LINK 加密狗)。此外,当前版本不会通过 SWD 发出复位命令(仅使用 NRST 信号)。软件复位是不现实的,但是它通常是有效的,缺少它会将会带来不便。对于板卡程序员board-programmer 来说 OpenOCD 工作得更好。 + +### UART + +UART(通用异步收发传输器Universal Aynchronous Receiver-Transmitter)仍然是当今微控制器最重要的外设之一。它的优点是以下属性的独特组合: + +* 相对较高的速度, +* 仅两条信号线(在 半双工half-duplex 通信的情况下甚至一条), +* 角色对称, +* 关于新数据的 同步带内信令synchronous in-band signaling(起始位), +* 在传输 words 内的精确计时。 + +这使得最初用于传输由 7-9 位的字组成的异步消息的 UART,也被用于有效地实现各种其他物理协议,例如被 [WS28xx LEDs][7] 或 [1-wire][8] 设备使用的协议。 + +但是,我们将以其通常的角色使用 UART:从程序中打印文本消息。 + +``` +package main + +import ( + "io" + "rtos" + + "stm32/hal/dma" + "stm32/hal/gpio" + "stm32/hal/irq" + "stm32/hal/system" + "stm32/hal/system/timer/systick" + "stm32/hal/usart" +) + +var tts *usart.Driver + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + gpio.A.EnableClock(true) + tx := gpio.A.Pin(9) + + tx.Setup(&gpio.Config{Mode: gpio.Alt}) + tx.SetAltFunc(gpio.USART1_AF1) + d := dma.DMA1 + d.EnableClock(true) + tts = usart.NewDriver(usart.USART1, d.Channel(2, 0), nil, nil) + tts.Periph().EnableClock(true) + tts.Periph().SetBaudRate(115200) + tts.Periph().Enable() + tts.EnableTx() + + rtos.IRQ(irq.USART1).Enable() + rtos.IRQ(irq.DMA1_Channel2_3).Enable() +} + +func main() { + io.WriteString(tts, "Hello, World!\r\n") +} + +func ttsISR() { + tts.ISR() +} + +func ttsDMAISR() { + tts.TxDMAISR() +} + +//c:__attribute__((section(".ISRs"))) +var ISRs = [...]func(){ + irq.USART1: ttsISR, + irq.DMA1_Channel2_3: ttsDMAISR, +} + +``` + +你会发现此代码可能有些复杂,但目前 STM32 HAL 中没有更简单的 UART 驱动程序(在某些情况下,简单的轮询驱动程序可能会很有用)。 `usart.Driver` 是使用 DMA 和中断来减轻 CPU 负担的高效驱动程序。 + +STM32 USART 外设提供传统的 UART 及其同步版本。要将其用作输出,我们必须将其 Tx 信号连接到正确的 GPIO 引脚: + +``` +tx.Setup(&gpio.Config{Mode: gpio.Alt}) +tx.SetAltFunc(gpio.USART1_AF1) +``` + +在 Tx-only 模式下配置 `usart.Driver` (rxdma 和 rxbuf 设置为 nil): + +``` +tts = usart.NewDriver(usart.USART1, d.Channel(2, 0), nil, nil) +``` + +我们使用它的 `WriteString` 方法来打印这句名言。让我们清理所有内容并编译该程序: + +``` +$ cd $HOME/emgo +$ ./clean.sh +$ cd $HOME/firstemgo +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 12728 236 176 13140 3354 cortexm0.elf +``` + +要查看某些内容,你需要在 PC 中使用 UART 外设。 + +**请勿使用 RS232 端口或 USB 转 RS232 转换器!** + +STM32 系列使用 3.3V 逻辑,但是 RS232 可以产生 -15 V ~ +15 V 的电压,这可能会损坏你的 MCU。你需要使用 3.3V 逻辑的 USB 转 UART 转换器。流行的转换器基于 FT232 或 CP2102 芯片。 + +![UART](https://ziutek.github.io/images/mcu/f030-demo-board/uart.jpg) + +你还需要一些终端仿真程序(我更喜欢 [picocom][9])。刷新新图像,运行终端仿真器,然后按几次复位按钮: + +``` +$ openocd -d0 -f interface/stlink.cfg -f target/stm32f0x.cfg -c 'init; program cortexm0.elf; reset run; exit' +Open On-Chip Debugger 0.10.0+dev-00319-g8f1f912a (2018-03-07-19:20) +Licensed under GNU GPL v2 +For bug reports, read + http://openocd.org/doc/doxygen/bugs.html +debug_level: 0 +adapter speed: 1000 kHz +adapter_nsrst_delay: 100 +none separate +adapter speed: 950 kHz +target halted due to debug-request, current mode: Thread +xPSR: 0xc1000000 pc: 0x080016f4 msp: 0x20000a20 +adapter speed: 4000 kHz +** Programming Started ** +auto erase enabled +target halted due to breakpoint, current mode: Thread +xPSR: 0x61000000 pc: 0x2000003a msp: 0x20000a20 +wrote 13312 bytes from file cortexm0.elf in 1.020185s (12.743 KiB/s) +** Programming Finished ** +adapter speed: 950 kHz +$ +$ picocom -b 115200 /dev/ttyUSB0 +picocom v3.1 + +port is : /dev/ttyUSB0 +flowcontrol : none +baudrate is : 115200 +parity is : none +databits are : 8 +stopbits are : 1 +escape is : C-a +local echo is : no +noinit is : no +noreset is : no +hangup is : no +nolock is : no +send_cmd is : sz -vv +receive_cmd is : rz -vv -E +imap is : +omap is : +emap is : crcrlf,delbs, +logfile is : none +initstring : none +exit_after is : not set +exit is : no + +Type [C-a] [C-h] to see available commands +Terminal ready +Hello, World! +Hello, World! +Hello, World! +``` + +每次按下复位按钮都会产生新的 “Hello,World!”行。一切都在按预期进行。 + +要查看此 MCU 的 双向bi-directional UART 代码,请查看 [此示例][10]。 + +### io.Writer 接口 + +`io.Writer` 接口可能是 Go 中第二种最常用的接口类型,仅次于 `error` 接口。其定义如下所示: + +``` +type Writer interface { + Write(p []byte) (n int, err error) +} +``` + +`usart.Driver` 实现了 `io.Writer`,因此我们可以替换: + +``` +tts.WriteString("Hello, World!\r\n") +``` + +为 + +``` +io.WriteString(tts, "Hello, World!\r\n") +``` + +此外,你需要将 `io` 包添加到 `import` 部分。 + +`io.WriteString` 函数的声明如下所示: + +``` +func WriteString(w Writer, s string) (n int, err error) +``` + +如你所见,`io.WriteString` 允许使用实现了 `io.Writer` 接口的任何类型来编写字符串。在内部,它检查基础类型是否具有 `WriteString` 方法,并使用该方法代替 `Write`(如果可用)。 + +让我们编译修改后的程序: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15456 320 248 16024 3e98 cortexm0.elf +``` + +如你所见,`io.WriteString` 导致二进制文件的大小显着增加:15776-12964 = 2812 字节。 Flash 上没有太多空间了。是什么引起了这么大规模的增长? + +使用这个命令: + +``` +arm-none-eabi-nm --print-size --size-sort --radix=d cortexm0.elf +``` + +我们可以打印两种情况下按其大小排序的所有符号。通过过滤和分析获得的数据(`awk`,`diff`),我们可以找到大约 80 个新符号。最大的十个如下所示: + +``` +> 00000062 T stm32$hal$usart$Driver$DisableRx +> 00000072 T stm32$hal$usart$Driver$RxDMAISR +> 00000076 T internal$Type$Implements +> 00000080 T stm32$hal$usart$Driver$EnableRx +> 00000084 t errors$New +> 00000096 R $8$stm32$hal$usart$Driver$$ +> 00000100 T stm32$hal$usart$Error$Error +> 00000360 T io$WriteString +> 00000660 T stm32$hal$usart$Driver$Read +``` + +因此,即使我们不使用 `usart.Driver.Read` 方法,但它被编译进来了,与 `DisableRx`、`RxDMAISR`、`EnableRx` 以及上面未提及的其他方法一样。不幸的是,如果你为接口赋值了一些内容,就需要它的完整方法集(包含所有依赖项)。对于使用大多数方法的大型程序来说,这不是问题。但是对于我们这种极简的情况而言,这是一个巨大的负担。 + +我们已经接近 MCU 的极限,但让我们尝试打印一些数字(你需要在 `import` 部分中用 `strconv` 替换 `io` 包): + +``` +func main() { + a := 12 + b := -123 + + tts.WriteString("a = ") + strconv.WriteInt(tts, a, 10, 0, 0) + tts.WriteString("\r\n") + tts.WriteString("b = ") + strconv.WriteInt(tts, b, 10, 0, 0) + tts.WriteString("\r\n") + + tts.WriteString("hex(a) = ") + strconv.WriteInt(tts, a, 16, 0, 0) + tts.WriteString("\r\n") + tts.WriteString("hex(b) = ") + strconv.WriteInt(tts, b, 16, 0, 0) + tts.WriteString("\r\n") +} +``` + +与使用 `io.WriteString` 函数的情况一样,`strconv.WriteInt` 的第一个参数的类型为 `io.Writer`。 + +``` +$ egc +/usr/local/arm/bin/arm-none-eabi-ld: /home/michal/firstemgo/cortexm0.elf section `.rodata' will not fit in region `Flash' +/usr/local/arm/bin/arm-none-eabi-ld: region `Flash' overflowed by 692 bytes +exit status 1 +``` + +这一次我们的空间超出的不多。让我们试着精简一下有关类型的信息: + +``` +$ cd $HOME/emgo +$ ./clean.sh +$ cd $HOME/firstemgo +$ egc -nf -nt +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15876 316 320 16512 4080 cortexm0.elf +``` + +很接近,但很合适。让我们加载并运行此代码: + +``` +a = 12 +b = -123 +hex(a) = c +hex(b) = -7b +``` + +Emgo 中的 `strconv` 包与 Go 中的原型有很大的不同。它旨在直接用于写入格式化的数字,并且在许多情况下可以替换沉重的 `fmt` 包。 这就是为什么函数名称以 `Write` 而不是 `Format` 开头,并具有额外的两个参数的原因。 以下是其用法示例: + +``` +func main() { + b := -123 + strconv.WriteInt(tts, b, 10, 0, 0) + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, 6, ' ') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, 6, '0') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, 6, '.') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, -6, ' ') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, -6, '0') + tts.WriteString("\r\n") + strconv.WriteInt(tts, b, 10, -6, '.') + tts.WriteString("\r\n") +} +``` + +下面是它的输出: + +``` +-123 + -123 +-00123 +..-123 +-123 +-123 +-123.. +``` + +### Unix 流 和 莫尔斯电码Morse code + +由于大多数写入的函数都使用 `io.Writer` 而不是具体类型(例如 C 中的 `FILE` ),因此我们获得了类似于 Unix stream 的功能。在 Unix 中,我们可以轻松地组合简单的命令来执行更大的任务。例如,我们可以通过以下方式将文本写入文件: + +``` +echo "Hello, World!" > file.txt +``` + +`>` 操作符将前面命令的输出流写入文件。还有 `|` 操作符,用于连接相邻命令的输出流和输入流。 + +多亏了流,我们可以轻松地转换/过滤任何命令的输出。例如,要将所有字母转换为大写,我们可以通过 `tr` 命令过滤 `echo` 的输出: + +``` +echo "Hello, World!" | tr a-z A-Z > file.txt +``` + +为了显示 `io.Writer` 和 Unix 流之间的类比,让我们编写以下代码: + +``` +io.WriteString(tts, "Hello, World!\r\n") +``` + +采用以下伪 unix 形式: + +``` +io.WriteString "Hello, World!" | usart.Driver usart.USART1 +``` + +下一个示例将显示如何执行此操作: + +``` +io.WriteString "Hello, World!" | MorseWriter | usart.Driver usart.USART1 +``` + +让我们来创建一个简单的编码器,它使用莫尔斯电码对写入的文本进行编码: + +``` +type MorseWriter struct { + W io.Writer +} + +func (w *MorseWriter) Write(s []byte) (int, error) { + var buf [8]byte + for n, c := range s { + switch { + case c == '\n': + c = ' ' // Replace new lines with spaces. + case 'a' <= c && c <= 'z': + c -= 'a' - 'A' // Convert to upper case. + } + if c < ' ' || 'Z' < c { + continue // c is outside ASCII [' ', 'Z'] + } + var symbol morseSymbol + if c == ' ' { + symbol.length = 1 + buf[0] = ' ' + } else { + symbol = morseSymbols[c-'!'] + for i := uint(0); i < uint(symbol.length); i++ { + if (symbol.code>>i)&1 != 0 { + buf[i] = '-' + } else { + buf[i] = '.' + } + } + } + buf[symbol.length] = ' ' + if _, err := w.W.Write(buf[:symbol.length+1]); err != nil { + return n, err + } + } + return len(s), nil +} + +type morseSymbol struct { + code, length byte +} + +//emgo:const +var morseSymbols = [...]morseSymbol{ + {1<<0 | 1<<1 | 1<<2, 4}, // ! ---. + {1<<1 | 1<<4, 6}, // " .-..-. + {}, // # + {1<<3 | 1<<6, 7}, // $ ...-..- + + // Some code omitted... + + {1<<0 | 1<<3, 4}, // X -..- + {1<<0 | 1<<2 | 1<<3, 4}, // Y -.-- + {1<<0 | 1<<1, 4}, // Z --.. +} +``` + +你可以在 [这里][11] 找到完整的 `morseSymbols` 数组。 `//emgo:const` 指令确保 `morseSymbols` 数组不会被复制到 RAM 中。 + +现在我们可以通过两种方式打印句子: + +``` +func main() { + s := "Hello, World!\r\n" + mw := &MorseWriter{tts} + + io.WriteString(tts, s) + io.WriteString(mw, s) +} +``` + +我们使用指向 `MorseWriter` `&MorseWriter{tts}` 的指针而不是简单的 `MorseWriter{tts}` 值,因为 `MorseWriter` 太大,不适合接口变量。 + +与 Go 不同,Emgo 不会为存储在接口变量中的值动态分配内存。接口类型的大小受限制,相当于三个指针(适合 `slice` )或两个 `float64`(适合 `complex128`)的大小,以较大者为准。它可以直接存储所有基本类型和小型 “结构体/数组” 的值,但是对于较大的值,你必须使用指针。 + +让我们编译此代码并查看其输出: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15152 324 248 15724 3d6c cortexm0.elf +``` + +``` +Hello, World! +.... . .-.. .-.. --- --..-- .-- --- .-. .-.. -.. ---. +``` + +### 终极闪烁 + +Blinky 是等效于 “Hello,World!” 程序的硬件。一旦有了摩尔斯编码器,我们就可以轻松地将两者结合起来以获得终极闪烁程序: + +``` +package main + +import ( + "delay" + "io" + + "stm32/hal/gpio" + "stm32/hal/system" + "stm32/hal/system/timer/systick" +) + +var led gpio.Pin + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + gpio.A.EnableClock(false) + led = gpio.A.Pin(4) + + cfg := gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain, Speed: gpio.Low} + led.Setup(&cfg) +} + +type Telegraph struct { + Pin gpio.Pin + Dotms int // Dot length [ms] +} + +func (t Telegraph) Write(s []byte) (int, error) { + for _, c := range s { + switch c { + case '.': + t.Pin.Clear() + delay.Millisec(t.Dotms) + t.Pin.Set() + delay.Millisec(t.Dotms) + case '-': + t.Pin.Clear() + delay.Millisec(3 * t.Dotms) + t.Pin.Set() + delay.Millisec(t.Dotms) + case ' ': + delay.Millisec(3 * t.Dotms) + } + } + return len(s), nil +} + +func main() { + telegraph := &MorseWriter{Telegraph{led, 100}} + for { + io.WriteString(telegraph, "Hello, World! ") + } +} + +// Some code omitted... + +``` + +在上面的示例中,我省略了 `MorseWriter` 类型的定义,因为它已在前面展示过。完整版可通过 [这里][12] 获取。让我们编译它并运行: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 11772 244 244 12260 2fe4 cortexm0.elf +``` + +![Ultimate Blinky](https://ziutek.github.io/images/mcu/f030-demo-board/morse.png) + +### 反射 + +是的,Emgo 支持 [反射][13]。`reflect` 包尚未完成,但是已完成的部分足以实现 `fmt.Print` 函数族了。来看看我们可以在小型 MCU 上做什么。 + +为了减少内存使用,我们将使用 [半主机][14]semihosting 作为标准输出。为了方便起见,我们还编写了简单的 `println` 函数,它在某种程度上类似于 `fmt.Println`。 + +``` +package main + +import ( + "debug/semihosting" + "reflect" + "strconv" + + "stm32/hal/system" + "stm32/hal/system/timer/systick" +) + +var stdout semihosting.File + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + var err error + stdout, err = semihosting.OpenFile(":tt", semihosting.W) + for err != nil { + } +} + +type stringer interface { + String() string +} + +func println(args ...interface{}) { + for i, a := range args { + if i > 0 { + stdout.WriteString(" ") + } + switch v := a.(type) { + case string: + stdout.WriteString(v) + case int: + strconv.WriteInt(stdout, v, 10, 0, 0) + case bool: + strconv.WriteBool(stdout, v, 't', 0, 0) + case stringer: + stdout.WriteString(v.String()) + default: + stdout.WriteString("%unknown") + } + } + stdout.WriteString("\r\n") +} + +type S struct { + A int + B bool +} + +func main() { + p := &S{-123, true} + + v := reflect.ValueOf(p) + + println("kind(p) =", v.Kind()) + println("kind(*p) =", v.Elem().Kind()) + println("type(*p) =", v.Elem().Type()) + + v = v.Elem() + + println("*p = {") + for i := 0; i < v.NumField(); i++ { + ft := v.Type().Field(i) + fv := v.Field(i) + println(" ", ft.Name(), ":", fv.Interface()) + } + println("}") +} + +``` + +`semihosting.OpenFile` 函数允许在主机端打开/创建文件。特殊路径 `:tt` 对应于主机的标准输出。 + +`println` 函数接受任意数量的参数,每个参数的类型都是任意的: + +``` +func println(args ...interface{}) +``` + +可能是因为任何类型都实现了空接口 `interface{}`。 `println` 使用 [类型开关][15] 打印字符串,整数和布尔值: + +``` +switch v := a.(type) { +case string: + stdout.WriteString(v) +case int: + strconv.WriteInt(stdout, v, 10, 0, 0) +case bool: + strconv.WriteBool(stdout, v, 't', 0, 0) +case stringer: + stdout.WriteString(v.String()) +default: + stdout.WriteString("%unknown") +} +``` + +此外,它还支持任何实现了 `stringer` 接口的类型,即任何具有 `String()` 方法的类型。在任何 `case` 子句中,`v` 变量具有正确的类型,与 `case` 关键字后列出的类型相同。 + +`reflect.ValueOf(p)` 函数通过允许以编程的方式分析其类型和内容的形式返回 `p`。如你所见,我们甚至可以使用 `v.Elem()` 取消引用指针,并打印所有结构体及其名称。 + +让我们尝试编译这段代码。现在让我们看看如果编译时没有类型和字段名,会有什么结果: + +``` +$ egc -nt -nf +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 16028 216 312 16556 40ac cortexm0.elf +``` + +闪存上只剩下 140 个可用字节。让我们使用启用了半主机的 OpenOCD 加载它: + +``` +$ openocd -d0 -f interface/stlink.cfg -f target/stm32f0x.cfg -c 'init; program cortexm0.elf; arm semihosting enable; reset run' +Open On-Chip Debugger 0.10.0+dev-00319-g8f1f912a (2018-03-07-19:20) +Licensed under GNU GPL v2 +For bug reports, read + http://openocd.org/doc/doxygen/bugs.html +debug_level: 0 +adapter speed: 1000 kHz +adapter_nsrst_delay: 100 +none separate +adapter speed: 950 kHz +target halted due to debug-request, current mode: Thread +xPSR: 0xc1000000 pc: 0x08002338 msp: 0x20000a20 +adapter speed: 4000 kHz +** Programming Started ** +auto erase enabled +target halted due to breakpoint, current mode: Thread +xPSR: 0x61000000 pc: 0x2000003a msp: 0x20000a20 +wrote 16384 bytes from file cortexm0.elf in 0.700133s (22.853 KiB/s) +** Programming Finished ** +semihosting is enabled +adapter speed: 950 kHz +kind(p) = ptr +kind(*p) = struct +type(*p) = +*p = { + X. : -123 + X. : true +} +``` + +如果你实际运行此代码,则会注意到半主机运行缓慢,尤其是在逐字节写入时(缓冲很有用)。 + +如你所见,`*p` 没有类型名称,并且所有结构字段都具有相同的 `X.` 名称。让我们再次编译该程序,这次不带 `-nt -nf` 选项: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 16052 216 312 16580 40c4 cortexm0.elf +``` + +现在已经包括了类型和字段名称,但仅在 ~~_main.go_ 文件中~~ `main` 包中定义了它们。该程序的输出如下所示: + +``` +kind(p) = ptr +kind(*p) = struct +type(*p) = S +*p = { + A : -123 + B : true +} +``` + +反射是任何易于使用的序列化库的关键部分,而像 [JSON][16] 这样的序列化 ~~算法~~ 在物联网IoT时代也越来越重要。 + +这些就是我完成的本文的第二部分。我认为有机会进行第三部分,更具娱乐性的部分,在那里我们将各种有趣的设备连接到这块板上。如果这块板装不下,我们就换一块大一点的。 + +-------------------------------------------------------------------------------- + +via: https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html + +作者:[Michał Derkacz][a] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://ziutek.github.io/ +[1]:https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html +[2]:https://linux.cn/article-11383-1.html +[3]:https://golang.org/doc/effective_go.html#interfaces +[4]:https://research.swtch.com/interfaces +[5]:https://blog.golang.org/laws-of-reflection +[6]:https://github.com/texane/stlink +[7]:http://www.world-semi.com/solution/list-4-1.html +[8]:https://en.wikipedia.org/wiki/1-Wire +[9]:https://github.com/npat-efault/picocom +[10]:https://github.com/ziutek/emgo/blob/master/egpath/src/stm32/examples/f030-demo-board/usart/main.go +[11]:https://github.com/ziutek/emgo/blob/master/egpath/src/stm32/examples/f030-demo-board/morseuart/main.go +[12]:https://github.com/ziutek/emgo/blob/master/egpath/src/stm32/examples/f030-demo-board/morseled/main.go +[13]:https://blog.golang.org/laws-of-reflection +[14]:http://infocenter.arm.com/help/topic/com.arm.doc.dui0471g/Bgbjjgij.html +[15]:https://golang.org/doc/effective_go.html#type_switch +[16]:https://en.wikipedia.org/wiki/JSON diff --git a/published/202010/20180710 Building a Messenger App- Messages.md b/published/202010/20180710 Building a Messenger App- Messages.md new file mode 100644 index 0000000000..2bd517bca5 --- /dev/null +++ b/published/202010/20180710 Building a Messenger App- Messages.md @@ -0,0 +1,315 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12680-1.html) +[#]: subject: (Building a Messenger App: Messages) +[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-messages/) +[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) + +构建一个即时消息应用(四):消息 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/04/114458z1p1188epequ686p.jpg) + +本文是该系列的第四篇。 + + * [第一篇: 模式][1] + * [第二篇: OAuth][2] + * [第三篇: 对话][3] + +在这篇文章中,我们将对端点进行编码,以创建一条消息并列出它们,同时还将编写一个端点以更新参与者上次阅读消息的时间。 首先在 `main()` 函数中添加这些路由。 + +``` +router.HandleFunc("POST", "/api/conversations/:conversationID/messages", requireJSON(guard(createMessage))) +router.HandleFunc("GET", "/api/conversations/:conversationID/messages", guard(getMessages)) +router.HandleFunc("POST", "/api/conversations/:conversationID/read_messages", guard(readMessages)) +``` + +消息会进入对话,因此端点包含对话 ID。 + +### 创建消息 + +该端点处理对 `/api/conversations/{conversationID}/messages` 的 POST 请求,其 JSON 主体仅包含消息内容,并返回新创建的消息。它有两个副作用:更新对话 `last_message_id` 以及更新参与者 `messages_read_at`。 + +``` +func createMessage(w http.ResponseWriter, r *http.Request) { + var input struct { + Content string `json:"content"` + } + defer r.Body.Close() + if err := json.NewDecoder(r.Body).Decode(&input); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + errs := make(map[string]string) + input.Content = removeSpaces(input.Content) + if input.Content == "" { + errs["content"] = "Message content required" + } else if len([]rune(input.Content)) > 480 { + errs["content"] = "Message too long. 480 max" + } + if len(errs) != 0 { + respond(w, Errors{errs}, http.StatusUnprocessableEntity) + return + } + + ctx := r.Context() + authUserID := ctx.Value(keyAuthUserID).(string) + conversationID := way.Param(ctx, "conversationID") + + tx, err := db.BeginTx(ctx, nil) + if err != nil { + respondError(w, fmt.Errorf("could not begin tx: %v", err)) + return + } + defer tx.Rollback() + + isParticipant, err := queryParticipantExistance(ctx, tx, authUserID, conversationID) + if err != nil { + respondError(w, fmt.Errorf("could not query participant existance: %v", err)) + return + } + + if !isParticipant { + http.Error(w, "Conversation not found", http.StatusNotFound) + return + } + + var message Message + if err := tx.QueryRowContext(ctx, ` + INSERT INTO messages (content, user_id, conversation_id) VALUES + ($1, $2, $3) + RETURNING id, created_at + `, input.Content, authUserID, conversationID).Scan( + &message.ID, + &message.CreatedAt, + ); err != nil { + respondError(w, fmt.Errorf("could not insert message: %v", err)) + return + } + + if _, err := tx.ExecContext(ctx, ` + UPDATE conversations SET last_message_id = $1 + WHERE id = $2 + `, message.ID, conversationID); err != nil { + respondError(w, fmt.Errorf("could not update conversation last message ID: %v", err)) + return + } + + if err = tx.Commit(); err != nil { + respondError(w, fmt.Errorf("could not commit tx to create a message: %v", err)) + return + } + + go func() { + if err = updateMessagesReadAt(nil, authUserID, conversationID); err != nil { + log.Printf("could not update messages read at: %v\n", err) + } + }() + + message.Content = input.Content + message.UserID = authUserID + message.ConversationID = conversationID + // TODO: notify about new message. + message.Mine = true + + respond(w, message, http.StatusCreated) +} +``` + +首先,它将请求正文解码为包含消息内容的结构。然后,它验证内容不为空并且少于 480 个字符。 + +``` +var rxSpaces = regexp.MustCompile("\\s+") + +func removeSpaces(s string) string { + if s == "" { + return s + } + + lines := make([]string, 0) + for _, line := range strings.Split(s, "\n") { + line = rxSpaces.ReplaceAllLiteralString(line, " ") + line = strings.TrimSpace(line) + if line != "" { + lines = append(lines, line) + } + } + return strings.Join(lines, "\n") +} +``` + +这是删除空格的函数。它遍历每一行,删除两个以上的连续空格,然后回非空行。 + +验证之后,它将启动一个 SQL 事务。首先,它查询对话中的参与者是否存在。 + +``` +func queryParticipantExistance(ctx context.Context, tx *sql.Tx, userID, conversationID string) (bool, error) { + if ctx == nil { + ctx = context.Background() + } + var exists bool + if err := tx.QueryRowContext(ctx, `SELECT EXISTS ( + SELECT 1 FROM participants + WHERE user_id = $1 AND conversation_id = $2 + )`, userID, conversationID).Scan(&exists); err != nil { + return false, err + } + return exists, nil +} +``` + +我将其提取到一个函数中,因为稍后可以重用。 + +如果用户不是对话参与者,我们将返回一个 `404 NOT Found` 错误。 + +然后,它插入消息并更新对话 `last_message_id`。从这时起,由于我们不允许删除消息,因此 `last_message_id` 不能为 `NULL`。 + +接下来提交事务,并在 goroutine 中更新参与者 `messages_read_at`。 + +``` +func updateMessagesReadAt(ctx context.Context, userID, conversationID string) error { + if ctx == nil { + ctx = context.Background() + } + + if _, err := db.ExecContext(ctx, ` + UPDATE participants SET messages_read_at = now() + WHERE user_id = $1 AND conversation_id = $2 + `, userID, conversationID); err != nil { + return err + } + return nil +} +``` + +在回复这条新消息之前,我们必须通知一下。这是我们将要在下一篇文章中编写的实时部分,因此我在那里留一了个注释。 + +### 获取消息 + +这个端点处理对 `/api/conversations/{conversationID}/messages` 的 GET 请求。 它用一个包含会话中所有消息的 JSON 数组进行响应。它还具有更新参与者 `messages_read_at` 的副作用。 + +``` +func getMessages(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + authUserID := ctx.Value(keyAuthUserID).(string) + conversationID := way.Param(ctx, "conversationID") + + tx, err := db.BeginTx(ctx, &sql.TxOptions{ReadOnly: true}) + if err != nil { + respondError(w, fmt.Errorf("could not begin tx: %v", err)) + return + } + defer tx.Rollback() + + isParticipant, err := queryParticipantExistance(ctx, tx, authUserID, conversationID) + if err != nil { + respondError(w, fmt.Errorf("could not query participant existance: %v", err)) + return + } + + if !isParticipant { + http.Error(w, "Conversation not found", http.StatusNotFound) + return + } + + rows, err := tx.QueryContext(ctx, ` + SELECT + id, + content, + created_at, + user_id = $1 AS mine + FROM messages + WHERE messages.conversation_id = $2 + ORDER BY messages.created_at DESC + `, authUserID, conversationID) + if err != nil { + respondError(w, fmt.Errorf("could not query messages: %v", err)) + return + } + defer rows.Close() + + messages := make([]Message, 0) + for rows.Next() { + var message Message + if err = rows.Scan( + &message.ID, + &message.Content, + &message.CreatedAt, + &message.Mine, + ); err != nil { + respondError(w, fmt.Errorf("could not scan message: %v", err)) + return + } + + messages = append(messages, message) + } + + if err = rows.Err(); err != nil { + respondError(w, fmt.Errorf("could not iterate over messages: %v", err)) + return + } + + if err = tx.Commit(); err != nil { + respondError(w, fmt.Errorf("could not commit tx to get messages: %v", err)) + return + } + + go func() { + if err = updateMessagesReadAt(nil, authUserID, conversationID); err != nil { + log.Printf("could not update messages read at: %v\n", err) + } + }() + + respond(w, messages, http.StatusOK) +} +``` + +首先,它以只读模式开始一个 SQL 事务。检查参与者是否存在,并查询所有消息。在每条消息中,我们使用当前经过身份验证的用户 ID 来了解用户是否拥有该消息(`mine`)。 然后,它提交事务,在 goroutine 中更新参与者 `messages_read_at` 并以消息响应。 + +### 读取消息 + +该端点处理对 `/api/conversations/{conversationID}/read_messages` 的 POST 请求。 没有任何请求或响应主体。 在前端,每次有新消息到达实时流时,我们都会发出此请求。 + +``` +func readMessages(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + authUserID := ctx.Value(keyAuthUserID).(string) + conversationID := way.Param(ctx, "conversationID") + + if err := updateMessagesReadAt(ctx, authUserID, conversationID); err != nil { + respondError(w, fmt.Errorf("could not update messages read at: %v", err)) + return + } + + w.WriteHeader(http.StatusNoContent) +} +``` + +它使用了与更新参与者 `messages_read_at` 相同的函数。 + +* * * + +到此为止。实时消息是后台仅剩的部分了。请等待下一篇文章。 + +- [源代码][4] + +-------------------------------------------------------------------------------- + +via: https://nicolasparada.netlify.com/posts/go-messenger-messages/ + +作者:[Nicolás Parada][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://nicolasparada.netlify.com/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-11396-1.html +[2]: https://linux.cn/article-11510-1.html +[3]: https://linux.cn/article-12056-1.html +[4]: https://github.com/nicolasparada/go-messenger-demo diff --git a/published/202010/20180710 Building a Messenger App- Realtime Messages.md b/published/202010/20180710 Building a Messenger App- Realtime Messages.md new file mode 100644 index 0000000000..3d70445693 --- /dev/null +++ b/published/202010/20180710 Building a Messenger App- Realtime Messages.md @@ -0,0 +1,175 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12685-1.html) +[#]: subject: (Building a Messenger App: Realtime Messages) +[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-realtime-messages/) +[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) + +构建一个即时消息应用(五):实时消息 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/05/091113edbuavorm89looja.jpg) + +本文是该系列的第五篇。 + + * [第一篇: 模式][1] + * [第二篇: OAuth][2] + * [第三篇: 对话][3] + * [第四篇: 消息][4] + +对于实时消息,我们将使用 [服务器发送事件][5]Server-Sent Events。这是一个打开的连接,我们可以在其中传输数据流。我们会有个端点,用户会在其中订阅发送给他的所有消息。 + +### 消息户端 + +在 HTTP 部分之前,让我们先编写一个映射map ,让所有客户端都监听消息。 像这样全局初始化: + +```go +type MessageClient struct { + Messages chan Message + UserID string +} + +var messageClients sync.Map +``` + +### 已创建的新消息 + +还记得在 [上一篇文章][4] 中,当我们创建这条消息时,我们留下了一个 “TODO” 注释。在那里,我们将使用这个函数来调度一个 goroutine。 + +```go +go messageCreated(message) +``` + +把这行代码插入到我们留注释的位置。 + +```go +func messageCreated(message Message) error { + if err := db.QueryRow(` + SELECT user_id FROM participants + WHERE user_id != $1 and conversation_id = $2 + `, message.UserID, message.ConversationID). + Scan(&message.ReceiverID); err != nil { + return err + } + + go broadcastMessage(message) + + return nil +} + +func broadcastMessage(message Message) { + messageClients.Range(func(key, _ interface{}) bool { + client := key.(*MessageClient) + if client.UserID == message.ReceiverID { + client.Messages <- message + } + return true + }) +} +``` + +该函数查询接收者 ID(其他参与者 ID),并将消息发送给所有客户端。 + +### 订阅消息 + +让我们转到 `main()` 函数并添加以下路由: + +```go +router.HandleFunc("GET", "/api/messages", guard(subscribeToMessages)) +``` + +此端点处理 `/api/messages` 上的 GET 请求。请求应该是一个 [EventSource][6] 连接。它用一个事件流响应,其中的数据是 JSON 格式的。 + +```go +func subscribeToMessages(w http.ResponseWriter, r *http.Request) { + if a := r.Header.Get("Accept"); !strings.Contains(a, "text/event-stream") { + http.Error(w, "This endpoint requires an EventSource connection", http.StatusNotAcceptable) + return + } + + f, ok := w.(http.Flusher) + if !ok { + respondError(w, errors.New("streaming unsupported")) + return + } + + ctx := r.Context() + authUserID := ctx.Value(keyAuthUserID).(string) + + h := w.Header() + h.Set("Cache-Control", "no-cache") + h.Set("Connection", "keep-alive") + h.Set("Content-Type", "text/event-stream") + + messages := make(chan Message) + defer close(messages) + + client := &MessageClient{Messages: messages, UserID: authUserID} + messageClients.Store(client, nil) + defer messageClients.Delete(client) + + for { + select { + case <-ctx.Done(): + return + case message := <-messages: + if b, err := json.Marshal(message); err != nil { + log.Printf("could not marshall message: %v\n", err) + fmt.Fprintf(w, "event: error\ndata: %v\n\n", err) + } else { + fmt.Fprintf(w, "data: %s\n\n", b) + } + f.Flush() + } + } +} +``` + +首先,它检查请求头是否正确,并检查服务器是否支持流式传输。我们创建一个消息通道,用它来构建一个客户端,并将其存储在客户端映射中。每当创建新消息时,它都会进入这个通道,因此我们可以通过 `for-select` 循环从中读取。 + +服务器发送事件Server-Sent Events使用以下格式发送数据: + +```go +data: some data here\n\n +``` + +我们以 JSON 格式发送: + +```json +data: {"foo":"bar"}\n\n +``` + +我们使用 `fmt.Fprintf()` 以这种格式写入响应写入器writter,并在循环的每次迭代中刷新数据。 + +这个循环会一直运行,直到使用请求上下文关闭连接为止。我们延迟了通道的关闭和客户端的删除,因此,当循环结束时,通道将被关闭,客户端不会收到更多的消息。 + +注意,服务器发送事件Server-Sent Events(EventSource)的 JavaScript API 不支持设置自定义请求头😒,所以我们不能设置 `Authorization: Bearer `。这就是为什么 `guard()` 中间件也会从 URL 查询字符串中读取令牌的原因。 + +* * * + +实时消息部分到此结束。我想说的是,这就是后端的全部内容。但是为了编写前端代码,我将再增加一个登录端点:一个仅用于开发的登录。 + +- [源代码][7] + +-------------------------------------------------------------------------------- + +via: https://nicolasparada.netlify.com/posts/go-messenger-realtime-messages/ + +作者:[Nicolás Parada][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://nicolasparada.netlify.com/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-11396-1.html +[2]: https://linux.cn/article-11510-1.html +[3]: https://linux.cn/article-12056-1.html +[4]: https://linux.cn/article-12680-1.html +[5]: https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events +[6]: https://developer.mozilla.org/en-US/docs/Web/API/EventSource +[7]: https://github.com/nicolasparada/go-messenger-demo diff --git a/published/202010/20180712 Building a Messenger App- Development Login.md b/published/202010/20180712 Building a Messenger App- Development Login.md new file mode 100644 index 0000000000..9a4654f57d --- /dev/null +++ b/published/202010/20180712 Building a Messenger App- Development Login.md @@ -0,0 +1,145 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12692-1.html) +[#]: subject: (Building a Messenger App: Development Login) +[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-dev-login/) +[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) + +构建一个即时消息应用(六):仅用于开发的登录 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/07/101437garmhgi9aza9f9fz.jpg) + +本文是该系列的第六篇。 + + * [第一篇: 模式][1] + * [第二篇: OAuth][2] + * [第三篇: 对话][3] + * [第四篇: 消息][4] + * [第五篇: 实时消息][5] + +我们已经实现了通过 GitHub 登录,但是如果想把玩一下这个 app,我们需要几个用户来测试它。在这篇文章中,我们将添加一个为任何用户提供登录的端点,只需提供用户名即可。该端点仅用于开发。 + +首先在 `main()` 函数中添加此路由。 + +```go +router.HandleFunc("POST", "/api/login", requireJSON(login)) +``` + +### 登录 + +此函数处理对 `/api/login` 的 POST 请求,其中 JSON body 只包含用户名,并以 JSON 格式返回通过认证的用户、令牌和过期日期。 + +```go +func login(w http.ResponseWriter, r *http.Request) { + if origin.Hostname() != "localhost" { + http.NotFound(w, r) + return + } + + var input struct { + Username string `json:"username"` + } + if err := json.NewDecoder(r.Body).Decode(&input); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + defer r.Body.Close() + + var user User + if err := db.QueryRowContext(r.Context(), ` + SELECT id, avatar_url + FROM users + WHERE username = $1 + `, input.Username).Scan( + &user.ID, + &user.AvatarURL, + ); err == sql.ErrNoRows { + http.Error(w, "User not found", http.StatusNotFound) + return + } else if err != nil { + respondError(w, fmt.Errorf("could not query user: %v", err)) + return + } + + user.Username = input.Username + + exp := time.Now().Add(jwtLifetime) + token, err := issueToken(user.ID, exp) + if err != nil { + respondError(w, fmt.Errorf("could not create token: %v", err)) + return + } + + respond(w, map[string]interface{}{ + "authUser": user, + "token": token, + "expiresAt": exp, + }, http.StatusOK) +} +``` + +首先,它检查我们是否在本地主机上,或者响应为 `404 Not Found`。它解码主体跳过验证,因为这只是为了开发。然后在数据库中查询给定用户名的用户,如果没有,则返回 `404 NOT Found`。然后,它使用用户 ID 作为主题发布一个新的 JSON Web 令牌。 + +```go +func issueToken(subject string, exp time.Time) (string, error) { + token, err := jwtSigner.Encode(jwt.Claims{ + Subject: subject, + Expiration: json.Number(strconv.FormatInt(exp.Unix(), 10)), + }) + if err != nil { + return "", err + } + return string(token), nil +} +``` + +该函数执行的操作与 [前文][2] 相同。我只是将其移过来以重用代码。 + +创建令牌后,它将使用用户、令牌和到期日期进行响应。 + +### 种子用户 + +现在,你可以将要操作的用户添加到数据库中。 + +```sql +INSERT INTO users (id, username) VALUES + (1, 'john'), + (2, 'jane'); +``` + +你可以将其保存到文件中,并通过管道将其传送到 Cockroach CLI。 + +```bash +cat seed_users.sql | cockroach sql --insecure -d messenger +``` + +* * * + +就是这样。一旦将代码部署到生产环境并使用自己的域后,该登录功能将不可用。 + +本文也结束了所有的后端开发部分。 + +- [源代码][6] + +-------------------------------------------------------------------------------- + +via: https://nicolasparada.netlify.com/posts/go-messenger-dev-login/ + +作者:[Nicolás Parada][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://nicolasparada.netlify.com/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-11396-1.html +[2]: https://linux.cn/article-11510-1.html +[3]: https://linux.cn/article-12056-1.html +[4]: https://linux.cn/article-12680-1.html +[5]: https://linux.cn/article-12685-1.html +[6]: https://github.com/nicolasparada/go-messenger-demo diff --git a/published/202010/20180716 Building a Messenger App- Access Page.md b/published/202010/20180716 Building a Messenger App- Access Page.md new file mode 100644 index 0000000000..b35c83efdc --- /dev/null +++ b/published/202010/20180716 Building a Messenger App- Access Page.md @@ -0,0 +1,459 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12704-1.html) +[#]: subject: (Building a Messenger App: Access Page) +[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-access-page/) +[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) + +构建一个即时消息应用(七):Access 页面 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/10/101345zj7gfybyee2g9x9e.jpg) + +本文是该系列的第七篇。 + + * [第一篇: 模式][1] + * [第二篇: OAuth][2] + * [第三篇: 对话][3] + * [第四篇: 消息][4] + * [第五篇: 实时消息][5] + * [第六篇: 仅用于开发的登录][6] + +现在我们已经完成了后端,让我们转到前端。 我将采用单页应用程序方案。 + +首先,我们创建一个 `static/index.html` 文件,内容如下。 + +```html + + + + + + Messenger + + + + + + +``` + +这个 HTML 文件必须为每个 URL 提供服务,并且使用 JavaScript 负责呈现正确的页面。 + +因此,让我们将注意力转到 `main.go` 片刻,然后在 `main()` 函数中添加以下路由: + +```go +router.Handle("GET", "/...", http.FileServer(SPAFileSystem{http.Dir("static")})) + +type SPAFileSystem struct { + fs http.FileSystem +} + +func (spa SPAFileSystem) Open(name string) (http.File, error) { + f, err := spa.fs.Open(name) + if err != nil { + return spa.fs.Open("index.html") + } + return f, nil +} +``` + +我们使用一个自定义的文件系统,因此它不是为未知的 URL 返回 `404 Not Found`,而是转到 `index.html`。 + +### 路由器 + +在 `index.html` 中我们加载了两个文件:`styles.css` 和 `main.js`。我把样式留给你自由发挥。 + +让我们移动到 `main.js`。 创建一个包含以下内容的 `static/main.js` 文件: + +```javascript +import { guard } from './auth.js' +import Router from './router.js' + +let currentPage +const disconnect = new CustomEvent('disconnect') +const router = new Router() + +router.handle('/', guard(view('home'), view('access'))) +router.handle('/callback', view('callback')) +router.handle(/^\/conversations\/([^\/]+)$/, guard(view('conversation'), view('access'))) +router.handle(/^\//, view('not-found')) + +router.install(async result => { + document.body.innerHTML = '' + if (currentPage instanceof Node) { + currentPage.dispatchEvent(disconnect) + } + currentPage = await result + if (currentPage instanceof Node) { + document.body.appendChild(currentPage) + } +}) + +function view(pageName) { + return (...args) => import(`/pages/${pageName}-page.js`) + .then(m => m.default(...args)) +} +``` + +如果你是这个博客的关注者,你已经知道它是如何工作的了。 该路由器就是在 [这里][7] 显示的那个。 只需从 [@nicolasparada/router][8] 下载并保存到 `static/router.js` 即可。 + +我们注册了四条路由。 在根路由 `/` 处,我们展示 `home` 或 `access` 页面,无论用户是否通过身份验证。 在 `/callback` 中,我们展示 `callback` 页面。 在 `/conversations/{conversationID}` 上,我们展示对话或 `access` 页面,无论用户是否通过验证,对于其他 URL,我们展示一个 `not-found` 页面。 + +我们告诉路由器将结果渲染为文档主体,并在离开之前向每个页面调度一个 `disconnect` 事件。 + +我们将每个页面放在不同的文件中,并使用新的动态 `import()` 函数导入它们。 + +### 身份验证 + +`guard()` 是一个函数,给它两个函数作为参数,如果用户通过了身份验证,则执行第一个函数,否则执行第二个。它来自 `auth.js`,所以我们创建一个包含以下内容的 `static/auth.js` 文件: + +```javascript +export function isAuthenticated() { + const token = localStorage.getItem('token') + const expiresAtItem = localStorage.getItem('expires_at') + if (token === null || expiresAtItem === null) { + return false + } + + const expiresAt = new Date(expiresAtItem) + if (isNaN(expiresAt.valueOf()) || expiresAt <= new Date()) { + return false + } + + return true +} + +export function guard(fn1, fn2) { + return (...args) => isAuthenticated() + ? fn1(...args) + : fn2(...args) +} + +export function getAuthUser() { + if (!isAuthenticated()) { + return null + } + + const authUser = localStorage.getItem('auth_user') + if (authUser === null) { + return null + } + + try { + return JSON.parse(authUser) + } catch (_) { + return null + } +} +``` + +`isAuthenticated()` 检查 `localStorage` 中的 `token` 和 `expires_at`,以判断用户是否已通过身份验证。`getAuthUser()` 从 `localStorage` 中获取经过身份验证的用户。 + +当我们登录时,我们会将所有的数据保存到 `localStorage`,这样才有意义。 + +### Access 页面 + +![access page screenshot][9] + +让我们从 `access` 页面开始。 创建一个包含以下内容的文件 `static/pages/access-page.js`: + +```javascript +const template = document.createElement('template') +template.innerHTML = ` +

    Messenger

    + Access with GitHub +` + +export default function accessPage() { + return template.content +} +``` + +因为路由器会拦截所有链接点击来进行导航,所以我们必须特别阻止此链接的事件传播。 + +单击该链接会将我们重定向到后端,然后重定向到 GitHub,再重定向到后端,然后再次重定向到前端; 到 `callback` 页面。 + +### Callback 页面 + +创建包括以下内容的 `static/pages/callback-page.js` 文件: + +```javascript +import http from '../http.js' +import { navigate } from '../router.js' + +export default async function callbackPage() { + const url = new URL(location.toString()) + const token = url.searchParams.get('token') + const expiresAt = url.searchParams.get('expires_at') + + try { + if (token === null || expiresAt === null) { + throw new Error('Invalid URL') + } + + const authUser = await getAuthUser(token) + + localStorage.setItem('auth_user', JSON.stringify(authUser)) + localStorage.setItem('token', token) + localStorage.setItem('expires_at', expiresAt) + } catch (err) { + alert(err.message) + } finally { + navigate('/', true) + } +} + +function getAuthUser(token) { + return http.get('/api/auth_user', { authorization: `Bearer ${token}` }) +} +``` + +`callback` 页面不呈现任何内容。这是一个异步函数,它使用 URL 查询字符串中的 token 向 `/api/auth_user` 发出 GET 请求,并将所有数据保存到 `localStorage`。 然后重定向到 `/`。 + +### HTTP + +这里是一个 HTTP 模块。 创建一个包含以下内容的 `static/http.js` 文件: + +```javascript +import { isAuthenticated } from './auth.js' + +async function handleResponse(res) { + const body = await res.clone().json().catch(() => res.text()) + + if (res.status === 401) { + localStorage.removeItem('auth_user') + localStorage.removeItem('token') + localStorage.removeItem('expires_at') + } + + if (!res.ok) { + const message = typeof body === 'object' && body !== null && 'message' in body + ? body.message + : typeof body === 'string' && body !== '' + ? body + : res.statusText + throw Object.assign(new Error(message), { + url: res.url, + statusCode: res.status, + statusText: res.statusText, + headers: res.headers, + body, + }) + } + + return body +} + +function getAuthHeader() { + return isAuthenticated() + ? { authorization: `Bearer ${localStorage.getItem('token')}` } + : {} +} + +export default { + get(url, headers) { + return fetch(url, { + headers: Object.assign(getAuthHeader(), headers), + }).then(handleResponse) + }, + + post(url, body, headers) { + const init = { + method: 'POST', + headers: getAuthHeader(), + } + if (typeof body === 'object' && body !== null) { + init.body = JSON.stringify(body) + init.headers['content-type'] = 'application/json; charset=utf-8' + } + Object.assign(init.headers, headers) + return fetch(url, init).then(handleResponse) + }, + + subscribe(url, callback) { + const urlWithToken = new URL(url, location.origin) + if (isAuthenticated()) { + urlWithToken.searchParams.set('token', localStorage.getItem('token')) + } + const eventSource = new EventSource(urlWithToken.toString()) + eventSource.onmessage = ev => { + let data + try { + data = JSON.parse(ev.data) + } catch (err) { + console.error('could not parse message data as JSON:', err) + return + } + callback(data) + } + const unsubscribe = () => { + eventSource.close() + } + return unsubscribe + }, +} +``` + +这个模块是 [fetch][10] 和 [EventSource][11] API 的包装器。最重要的部分是它将 JSON web 令牌添加到请求中。 + +### Home 页面 + +![home page screenshot][12] + +因此,当用户登录时,将显示 `home` 页。 创建一个具有以下内容的 `static/pages/home-page.js` 文件: + +```javascript +import { getAuthUser } from '../auth.js' +import { avatar } from '../shared.js' + +export default function homePage() { + const authUser = getAuthUser() + const template = document.createElement('template') + template.innerHTML = ` +
    +
    + ${avatar(authUser)} + ${authUser.username} +
    + +
    + + + ` + const page = template.content + page.getElementById('logout-button').onclick = onLogoutClick + return page +} + +function onLogoutClick() { + localStorage.clear() + location.reload() +} +``` + +对于这篇文章,这是我们在 `home` 页上呈现的唯一内容。我们显示当前经过身份验证的用户和注销按钮。 + +当用户单击注销时,我们清除 `localStorage` 中的所有内容并重新加载页面。 + +### Avatar + +那个 `avatar()` 函数用于显示用户的头像。 由于已在多个地方使用,因此我将它移到 `shared.js` 文件中。 创建具有以下内容的文件 `static/shared.js`: + +```javascript +export function avatar(user) { + return user.avatarUrl === null + ? `
    ` + : `${user.username}'s avatar` +} +``` + +如果头像网址为 `null`,我们将使用用户的姓名首字母作为初始头像。 + +你可以使用 `attr()` 函数显示带有少量 CSS 样式的首字母。 + +```css +.avatar[data-initial]::after { + content: attr(data-initial); +} +``` + +### 仅开发使用的登录 + +![access page with login form screenshot][13] + +在上一篇文章中,我们为编写了一个登录代码。让我们在 `access` 页面中为此添加一个表单。 进入 `static/ages/access-page.js`,稍微修改一下。 + +```javascript +import http from '../http.js' + +const template = document.createElement('template') +template.innerHTML = ` +

    Messenger

    +
    + + +
    + Access with GitHub +` + +export default function accessPage() { + const page = template.content.cloneNode(true) + page.getElementById('login-form').onsubmit = onLoginSubmit + return page +} + +async function onLoginSubmit(ev) { + ev.preventDefault() + + const form = ev.currentTarget + const input = form.querySelector('input') + const submitButton = form.querySelector('button') + + input.disabled = true + submitButton.disabled = true + + try { + const payload = await login(input.value) + input.value = '' + + localStorage.setItem('auth_user', JSON.stringify(payload.authUser)) + localStorage.setItem('token', payload.token) + localStorage.setItem('expires_at', payload.expiresAt) + + location.reload() + } catch (err) { + alert(err.message) + setTimeout(() => { + input.focus() + }, 0) + } finally { + input.disabled = false + submitButton.disabled = false + } +} + +function login(username) { + return http.post('/api/login', { username }) +} +``` + +我添加了一个登录表单。当用户提交表单时。它使用用户名对 `/api/login` 进行 POST 请求。将所有数据保存到 `localStorage` 并重新加载页面。 + +记住在前端完成后删除此表单。 + +* * * + +这就是这篇文章的全部内容。在下一篇文章中,我们将继续使用主页添加一个表单来开始对话,并显示包含最新对话的列表。 + +- [源代码][14] + +-------------------------------------------------------------------------------- + +via: https://nicolasparada.netlify.com/posts/go-messenger-access-page/ + +作者:[Nicolás Parada][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://nicolasparada.netlify.com/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-11396-1.html +[2]: https://linux.cn/article-11510-1.html +[3]: https://linux.cn/article-12056-1.html +[4]: https://linux.cn/article-12680-1.html +[5]: https://linux.cn/article-12685-1.html +[6]: https://linux.cn/article-12692-1.html +[7]: https://nicolasparada.netlify.com/posts/js-router/ +[8]: https://unpkg.com/@nicolasparada/router +[9]: https://nicolasparada.netlify.com/img/go-messenger-access-page/access-page.png +[10]: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API +[11]: https://developer.mozilla.org/en-US/docs/Web/API/EventSource +[12]: https://nicolasparada.netlify.com/img/go-messenger-access-page/home-page.png +[13]: https://nicolasparada.netlify.com/img/go-messenger-access-page/access-page-v2.png +[14]: https://github.com/nicolasparada/go-messenger-demo diff --git a/published/202010/20180719 Building a Messenger App- Home Page.md b/published/202010/20180719 Building a Messenger App- Home Page.md new file mode 100644 index 0000000000..741206a4a7 --- /dev/null +++ b/published/202010/20180719 Building a Messenger App- Home Page.md @@ -0,0 +1,254 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12722-1.html) +[#]: subject: (Building a Messenger App: Home Page) +[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-home-page/) +[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) + +构建一个即时消息应用(八):Home 页面 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/15/213116evlwzdwwv66kmldj.jpg) + +本文是该系列的第八篇。 + + * [第一篇: 模式][1] + * [第二篇: OAuth][2] + * [第三篇: 对话][3] + * [第四篇: 消息][4] + * [第五篇: 实时消息][5] + * [第六篇: 仅用于开发的登录][6] + * [第七篇: Access 页面][7] + +继续前端部分,让我们在本文中完成 `home` 页面的开发。 我们将添加一个开始对话的表单和一个包含最新对话的列表。 + +### 对话表单 + +![conversation form screenshot][8] + +转到 `static/ages/home-page.js` 文件,在 HTML 视图中添加一些标记。 + +```html +
    + +
    +``` + +将该表单添加到我们显示 “auth user” 和 “logout” 按钮部分的下方。 + +```js +page.getElementById('conversation-form').onsubmit = onConversationSubmit +``` + +现在我们可以监听 “submit” 事件来创建对话了。 + +```js +import http from '../http.js' +import { navigate } from '../router.js' + +async function onConversationSubmit(ev) { + ev.preventDefault() + + const form = ev.currentTarget + const input = form.querySelector('input') + + input.disabled = true + + try { + const conversation = await createConversation(input.value) + input.value = '' + navigate('/conversations/' + conversation.id) + } catch (err) { + if (err.statusCode === 422) { + input.setCustomValidity(err.body.errors.username) + } else { + alert(err.message) + } + setTimeout(() => { + input.focus() + }, 0) + } finally { + input.disabled = false + } +} + +function createConversation(username) { + return http.post('/api/conversations', { username }) +} +``` + +在提交时,我们使用用户名对 `/api/conversations` 进行 POST 请求,并重定向到 `conversation` 页面(用于下一篇文章)。 + +### 对话列表 + +![conversation list screenshot][9] + +还是在这个文件中,我们将创建 `homePage()` 函数用来先异步加载对话。 + +```js +export default async function homePage() { + const conversations = await getConversations().catch(err => { + console.error(err) + return [] + }) + /*...*/ +} + +function getConversations() { + return http.get('/api/conversations') +} +``` + +然后,在标记中添加一个列表来渲染对话。 + +```html +
      +``` + +将其添加到当前标记的正下方。 + +```js +const conversationsOList = page.getElementById('conversations') +for (const conversation of conversations) { + conversationsOList.appendChild(renderConversation(conversation)) +} +``` + +因此,我们可以将每个对话添加到这个列表中。 + +```js +import { avatar, escapeHTML } from '../shared.js' + +function renderConversation(conversation) { + const messageContent = escapeHTML(conversation.lastMessage.content) + const messageDate = new Date(conversation.lastMessage.createdAt).toLocaleString() + + const li = document.createElement('li') + li.dataset['id'] = conversation.id + if (conversation.hasUnreadMessages) { + li.classList.add('has-unread-messages') + } + li.innerHTML = ` + +
      + ${avatar(conversation.otherParticipant)} + ${conversation.otherParticipant.username} +
      +
      +

      ${messageContent}

      + +
      +
      + ` + return li +} +``` + +每个对话条目都包含一个指向对话页面的链接,并显示其他参与者信息和最后一条消息的预览。另外,您可以使用 `.hasUnreadMessages` 向该条目添加一个类,并使用 CSS 进行一些样式设置。也许是粗体字体或强调颜色。 + +请注意,我们需要转义信息的内容。该函数来自于 `static/shared.js` 文件: + +```js +export function escapeHTML(str) { + return str + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} +``` + +这会阻止将用户编写的消息显示为 HTML。如果用户碰巧编写了类似以下内容的代码: + +```js + +``` + +这将非常烦人,因为该脚本将被执行😅。所以,永远记住要转义来自不可信来源的内容。 + +### 消息订阅 + +最后但并非最不重要的一点,我想在这里订阅消息流。 + +```js +const unsubscribe = subscribeToMessages(onMessageArrive) +page.addEventListener('disconnect', unsubscribe) +``` + +在 `homePage()` 函数中添加这一行。 + +```js +function subscribeToMessages(cb) { + return http.subscribe('/api/messages', cb) +} +``` + +函数 `subscribe()` 返回一个函数,该函数一旦调用就会关闭底层连接。这就是为什么我把它传递给 “断开连接”disconnect事件的原因;因此,当用户离开页面时,事件流将被关闭。 + +```js +async function onMessageArrive(message) { + const conversationLI = document.querySelector(`li[data-id="${message.conversationID}"]`) + if (conversationLI !== null) { + conversationLI.classList.add('has-unread-messages') + conversationLI.querySelector('a > div > p').textContent = message.content + conversationLI.querySelector('a > div > time').textContent = new Date(message.createdAt).toLocaleString() + return + } + + let conversation + try { + conversation = await getConversation(message.conversationID) + conversation.lastMessage = message + } catch (err) { + console.error(err) + return + } + + const conversationsOList = document.getElementById('conversations') + if (conversationsOList === null) { + return + } + + conversationsOList.insertAdjacentElement('afterbegin', renderConversation(conversation)) +} + +function getConversation(id) { + return http.get('/api/conversations/' + id) +} +``` + +每次有新消息到达时,我们都会在 DOM 中查询会话条目。如果找到,我们会将 `has-unread-messages` 类添加到该条目中,并更新视图。如果未找到,则表示该消息来自刚刚创建的新对话。我们去做一个对 `/api/conversations/{conversationID}` 的 GET 请求,以获取在其中创建消息的对话,并将其放在对话列表的前面。 + +* * * + +以上这些涵盖了主页的所有内容 😊。 +在下一篇文章中,我们将对 conversation 页面进行编码。 + +- [源代码][10] + +-------------------------------------------------------------------------------- + +via: https://nicolasparada.netlify.com/posts/go-messenger-home-page/ + +作者:[Nicolás Parada][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://nicolasparada.netlify.com/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-11396-1.html +[2]: https://linux.cn/article-11510-1.html +[3]: https://linux.cn/article-12056-1.html +[4]: https://linux.cn/article-12680-1.html +[5]: https://linux.cn/article-12685-1.html +[6]: https://linux.cn/article-12692-1.html +[7]: https://linux.cn/article-12704-1.html +[8]: https://nicolasparada.netlify.com/img/go-messenger-home-page/conversation-form.png +[9]: https://nicolasparada.netlify.com/img/go-messenger-home-page/conversation-list.png +[10]: https://github.com/nicolasparada/go-messenger-demo diff --git a/published/202010/20180720 Building a Messenger App- Conversation Page.md b/published/202010/20180720 Building a Messenger App- Conversation Page.md new file mode 100644 index 0000000000..95f91cabfa --- /dev/null +++ b/published/202010/20180720 Building a Messenger App- Conversation Page.md @@ -0,0 +1,269 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12723-1.html) +[#]: subject: (Building a Messenger App: Conversation Page) +[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-conversation-page/) +[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) + +构建一个即时消息应用(九):Conversation 页面 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/15/220239arr978u7t7oulv73.jpg) + +本文是该系列的第九篇,也是最后一篇。 + + * [第一篇: 模式][1] + * [第二篇: OAuth][2] + * [第三篇: 对话][3] + * [第四篇: 消息][4] + * [第五篇: 实时消息][5] + * [第六篇: 仅用于开发的登录][6] + * [第七篇: Access 页面][7] + * [第八篇: Home 页面][8] + +在这篇文章中,我们将对对话conversation页面进行编码。此页面是两个用户之间的聊天室。在顶部我们将显示其他参与者的信息,下面接着的是最新消息列表,以及底部的消息表单。 + +### 聊天标题 + +![chat heading screenshot][9] + +让我们从创建 `static/pages/conversation-page.js` 文件开始,它包含以下内容: + +```js +import http from '../http.js' +import { navigate } from '../router.js' +import { avatar, escapeHTML } from '../shared.js' + +export default async function conversationPage(conversationID) { + let conversation + try { + conversation = await getConversation(conversationID) + } catch (err) { + alert(err.message) + navigate('/', true) + return + } + + const template = document.createElement('template') + template.innerHTML = ` +
      + ← Back + ${avatar(conversation.otherParticipant)} + ${conversation.otherParticipant.username} +
      + + + ` + const page = template.content + return page +} + +function getConversation(id) { + return http.get('/api/conversations/' + id) +} +``` + +此页面接收路由从 URL 中提取的会话 ID。 + +首先,它向 `/api/ conversations/{conversationID}` 发起一个 GET 请求,以获取有关对话的信息。 如果出现错误,我们会将其显示,并重定向回 `/`。然后我们呈现有关其他参与者的信息。 + +### 对话列表 + +![chat heading screenshot][10] + +我们也会获取最新的消息并显示它们。 + +```js +let conversation, messages +try { + [conversation, messages] = await Promise.all([ + getConversation(conversationID), + getMessages(conversationID), + ]) +} +``` + +更新 `conversationPage()` 函数以获取消息。我们使用 `Promise.all()` 同时执行这两个请求。 + +```js +function getMessages(conversationID) { + return http.get(`/api/conversations/${conversationID}/messages`) +} +``` + +发起对 `/api/conversations/{conversationID}/messages` 的 GET 请求可以获取对话中的最新消息。 + +```html +
        +``` + +现在,将该列表添加到标记中。 + +```js +const messagesOList = page.getElementById('messages') +for (const message of messages.reverse()) { + messagesOList.appendChild(renderMessage(message)) +} +``` + +这样我们就可以将消息附加到列表中了。我们以时间倒序来显示它们。 + +```js +function renderMessage(message) { + const messageContent = escapeHTML(message.content) + const messageDate = new Date(message.createdAt).toLocaleString() + + const li = document.createElement('li') + if (message.mine) { + li.classList.add('owned') + } + li.innerHTML = ` +

        ${messageContent}

        + + ` + return li +} +``` + +每个消息条目显示消息内容本身及其时间戳。使用 `.mine`,我们可以将不同的 css 类附加到条目,这样您就可以将消息显示在右侧。 + +### 消息表单 + +![chat heading screenshot][11] + +```html +
        + + +
        +``` + +将该表单添加到当前标记中。 + +```js +page.getElementById('message-form').onsubmit = messageSubmitter(conversationID) +``` + +将事件监听器附加到 “submit” 事件。 + +```js +function messageSubmitter(conversationID) { + return async ev => { + ev.preventDefault() + + const form = ev.currentTarget + const input = form.querySelector('input') + const submitButton = form.querySelector('button') + + input.disabled = true + submitButton.disabled = true + + try { + const message = await createMessage(input.value, conversationID) + input.value = '' + const messagesOList = document.getElementById('messages') + if (messagesOList === null) { + return + } + + messagesOList.appendChild(renderMessage(message)) + } catch (err) { + if (err.statusCode === 422) { + input.setCustomValidity(err.body.errors.content) + } else { + alert(err.message) + } + } finally { + input.disabled = false + submitButton.disabled = false + + setTimeout(() => { + input.focus() + }, 0) + } + } +} + +function createMessage(content, conversationID) { + return http.post(`/api/conversations/${conversationID}/messages`, { content }) +} +``` + + +我们利用 [partial application][12] 在 “submit” 事件处理程序中获取对话 ID。它 从输入中获取消息内容,并用它对 `/api/conversations/{conversationID}/messages` 发出 POST 请求。 然后将新创建的消息添加到列表中。 + +### 消息订阅 + +为了实现实时,我们还将订阅此页面中的消息流。 + +```js +page.addEventListener('disconnect', subscribeToMessages(messageArriver(conversationID))) +``` + +将该行添加到 `conversationPage()` 函数中。 + +```js +function subscribeToMessages(cb) { + return http.subscribe('/api/messages', cb) +} + +function messageArriver(conversationID) { + return message => { + if (message.conversationID !== conversationID) { + return + } + + const messagesOList = document.getElementById('messages') + if (messagesOList === null) { + return + + } + messagesOList.appendChild(renderMessage(message)) + readMessages(message.conversationID) + } +} + +function readMessages(conversationID) { + return http.post(`/api/conversations/${conversationID}/read_messages`) +} +``` + +在这里我们仍然使用这个应用的部分来获取会话 ID。 +当新消息到达时,我们首先检查它是否来自此对话。如果是,我们会将消息条目预先添加到列表中,并向 `/api/conversations/{conversationID}/read_messages` 发起 POST 一个请求,以更新参与者上次阅读消息的时间。 + +* * * + +本系列到此结束。 消息应用现在可以运行了。 + +- [源代码][13] +- [演示][14] + +-------------------------------------------------------------------------------- + +via: https://nicolasparada.netlify.com/posts/go-messenger-conversation-page/ + +作者:[Nicolás Parada][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://nicolasparada.netlify.com/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-11396-1.html +[2]: https://linux.cn/article-11510-1.html +[3]: https://linux.cn/article-12056-1.html +[4]: https://linux.cn/article-12680-1.html +[5]: https://linux.cn/article-12685-1.html +[6]: https://linux.cn/article-12692-1.html +[7]: https://linux.cn/article-12704-1.html +[8]: https://linux.cn/article-12722-1.html +[9]: https://nicolasparada.netlify.com/img/go-messenger-conversation-page/heading.png +[10]: https://nicolasparada.netlify.com/img/go-messenger-conversation-page/list.png +[11]: https://nicolasparada.netlify.com/img/go-messenger-conversation-page/form.png +[12]: https://en.wikipedia.org/wiki/Partial_application +[13]: https://github.com/nicolasparada/go-messenger-demo +[14]: https://go-messenger-demo.herokuapp.com/ diff --git a/published/202010/20190102 Using Yarn on Ubuntu and Other Linux Distributions.md b/published/202010/20190102 Using Yarn on Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..0222a78d37 --- /dev/null +++ b/published/202010/20190102 Using Yarn on Ubuntu and Other Linux Distributions.md @@ -0,0 +1,273 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12737-1.html) +[#]: subject: (Using Yarn on Ubuntu and Other Linux Distributions) +[#]: via: (https://itsfoss.com/install-yarn-ubuntu) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +在 Ubuntu 和其他 Linux 发行版上使用 Yarn +====== + +> 本速成教程向你展示了在 Ubuntu 和 Debian Linux 上安装 Yarn 包管理器的官方方法。你还将学习到一些基本的 Yarn 命令以及彻底删除 Yarn 的步骤。 + +[Yarn][1] 是 Facebook 开发的开源 JavaScript 包管理器。它是流行的 npm 包管理器的一个替代品,或者应该说是改进。 [Facebook 开发团队][2] 创建 Yarn 是为了克服 [npm][3] 的缺点。 Facebook 声称 Yarn 比 npm 更快、更可靠、更安全。 + +与 npm 一样,Yarn 为你提供一种自动安装、更新、配置和删除从全局注册库中检索到的程序包的方法。 + +Yarn 的优点是它更快,因为它可以缓存已下载的每个包,所以无需再次下载。它还将操作并行化,以最大化资源利用率。在执行每个已安装的包代码之前,Yarn 还使用 [校验和来验证完整性][4]。 Yarn 还保证可以在一个系统上运行的安装,在任何其他系统上都会以完全相同地方式工作。 + +如果你正 [在 Ubuntu 上使用 node.js][5],那么你的系统上可能已经安装了 npm。在这种情况下,你可以使用 npm 通过以下方式全局安装 Yarn: + +``` +sudo npm install yarn -g +``` + +不过,我推荐使用官方方式在 Ubuntu/Debian 上安装 Yarn。 + +### 在 Ubuntu 和 Debian 上安装 Yarn [官方方式] + +![Yarn JS][6] + +这里提到的说明应该适用于所有版本的 Ubuntu,例如 Ubuntu 18.04、16.04 等。同样的一组说明也适用于 Debian 和其他基于 Debian 的发行版。 + +由于本教程使用 `curl` 来添加 Yarn 项目的 GPG 密钥,所以最好验证一下你是否已经安装了 `curl`。 + +``` +sudo apt install curl +``` + +如果 `curl` 尚未安装,则上面的命令将安装它。既然有了 `curl`,你就可以使用它以如下方式添加 Yarn 项目的 GPG 密钥: + +``` +curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +``` + +在此之后,将存储库添加到源列表中,以便将来可以轻松地升级 Yarn 包,并进行其余系统更新: + +``` +sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list' +``` + +你现在可以继续了。[更新 Ubuntu][7] 或 Debian 系统,以刷新可用软件包列表,然后安装 Yarn: + +``` +sudo apt update +sudo apt install yarn +``` + +这将一起安装 Yarn 和 node.js。该过程完成后,请验证是否已成功安装 Yarn。 你可以通过检查 Yarn 版本来做到这一点。 + +``` +yarn --version +``` + +对我来说,它显示了这样的输出: + +``` +yarn --version +1.12.3 +``` + +这意味着我的系统上安装了 Yarn 版本 1.12.3。 + +### 使用 Yarn + +我假设你对 JavaScript 编程以及依赖项的工作原理有一些基本的了解。我在这里不做详细介绍。我将向你展示一些基本的 Yarn 命令,这些命令将帮助你入门。 + +#### 使用 Yarn 创建一个新项目 + +与 `npm` 一样,Yarn 也可以使用 `package.json` 文件。在这里添加依赖项。所有依赖包都缓存在项目根目录下的 `node_modules` 目录中。 + +在项目的根目录中,运行以下命令以生成新的 `package.json` 文件: + +它会问你一些问题。你可以按回车键跳过或使用默认值。 + +``` +yarn init +yarn init v1.12.3 +question name (test_yarn): test_yarn_proect +question version (1.0.0): 0.1 +question description: Test Yarn +question entry point (index.js): +question repository url: +question author: abhishek +question license (MIT): +question private: +success Saved package.json +Done in 82.42s. +``` + +这样,你就得到了一个如下的 `package.json` 文件: + +``` +{ + "name": "test_yarn_proect", + "version": "0.1", + "description": "Test Yarn", + "main": "index.js", + "author": "abhishek", + "license": "MIT" +} +``` + +现在你有了 `package.json`,你可以手动编辑它以添加或删除包依赖项,也可以使用 Yarn 命令(首选)。 + +#### 使用 Yarn 添加依赖项 + +你可以通过以下方式添加对特定包的依赖关系: + +``` +yarn add <包名> +``` + +例如,如果你想在项目中使用 [Lodash][8],则可以使用 Yarn 添加它,如下所示: + +``` +yarn add lodash +yarn add v1.12.3 +info No lockfile found. +[1/4] Resolving packages… +[2/4] Fetching packages… +[3/4] Linking dependencies… +[4/4] Building fresh packages… +success Saved lockfile. +success Saved 1 new dependency. +info Direct dependencies +└─ [email protected] +info All dependencies +└─ [email protected] +Done in 2.67s. +``` + +你可以看到,此依赖项已自动添加到 `package.json` 文件中: + +``` +{ + "name": "test_yarn_proect", + "version": "0.1", + "description": "Test Yarn", + "main": "index.js", + "author": "abhishek", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.11" + } +} +``` + +默认情况下,Yarn 将在依赖项中添加最新版本的包。如果要使用特定版本,可以在添加时指定。 + +``` +yarn add package@version-or-tag +``` + +像往常一样,你也可以手动更新 `package.json` 文件。 + +#### 使用 Yarn 升级依赖项 + +你可以使用以下命令将特定依赖项升级到其最新版本: + +``` +yarn upgrade <包名> +``` + +它将查看所​​涉及的包是否具有较新的版本,并且会相应地对其进行更新。 + +你还可以通过以下方式更改已添加的依赖项的版本: + +``` +yarn upgrade package_name@version_or_tag +``` + +你还可以使用一个命令将项目的所有依赖项升级到它们的最新版本: + +``` +yarn upgrade +``` + +它将检查所有依赖项的版本,如果有任何较新的版本,则会更新它们。 + +#### 使用 Yarn 删除依赖项 + +你可以通过以下方式从项目的依赖项中删除包: + +``` +yarn remove <包名> +``` + +#### 安装所有项目依赖项 + +如果对你 `project.json` 文件进行了任何更改,则应该运行: + +``` +yarn +``` + +或者, + +``` +yarn install +``` + +一次安装所有依赖项。 + +### 如何从 Ubuntu 或 Debian 中删除 Yarn + +我将通过介绍从系统中删除 Yarn 的步骤来完成本教程,如果你使用上述步骤安装 Yarn 的话。如果你意识到不再需要 Yarn 了,则可以将它删除。 + +使用以下命令删除 Yarn 及其依赖项。 + +``` +sudo apt purge yarn +``` + +你也应该从源列表中把存储库信息一并删除掉: + +``` +sudo rm /etc/apt/sources.list.d/yarn.list +``` + +下一步删除已添加到受信任密钥的 GPG 密钥是可选的。但要做到这一点,你需要知道密钥。你可以使用 `apt-key` 命令获得它: + +``` +Warning: apt-key output should not be parsed (stdout is not a terminal) pub rsa4096 2016-10-05 [SC] 72EC F46A 56B4 AD39 C907 BBB7 1646 B01B 86E5 0310 uid [ unknown] Yarn Packaging yarn@dan.cx sub rsa4096 2016-10-05 [E] sub rsa4096 2019-01-02 [S] [expires: 2020-02-02] +``` + +这里的密钥是以 `pub` 开始的行中 GPG 密钥指纹的最后 8 个字符。 + +因此,对于我来说,密钥是 `86E50310`,我将使用以下命令将其删除: + +``` +sudo apt-key del 86E50310 +``` + +你会在输出中看到 `OK`,并且 Yarn 包的 GPG 密钥将从系统信任的 GPG 密钥列表中删除。 + +我希望本教程可以帮助你在 Ubuntu、Debian、Linux Mint、 elementary OS 等操作系统上安装 Yarn。 我提供了一些基本的 Yarn 命令,以帮助你入门,并完成了从系统中删除 Yarn 的完整步骤。 + +希望你喜欢本教程,如果有任何疑问或建议,请随时在下面留言。 + + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-yarn-ubuntu + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[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://yarnpkg.com/lang/en/ +[2]: https://code.fb.com/ +[3]: https://www.npmjs.com/ +[4]: https://itsfoss.com/checksum-tools-guide-linux/ +[5]: https://itsfoss.com/install-nodejs-ubuntu/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/yarn-js-ubuntu-debian.jpeg?resize=800%2C450&ssl=1 +[7]: https://itsfoss.com/update-ubuntu/ +[8]: https://lodash.com/ diff --git a/published/202010/20190521 How to Disable IPv6 on Ubuntu Linux.md b/published/202010/20190521 How to Disable IPv6 on Ubuntu Linux.md new file mode 100644 index 0000000000..a187054afd --- /dev/null +++ b/published/202010/20190521 How to Disable IPv6 on Ubuntu Linux.md @@ -0,0 +1,221 @@ +[#]: collector: (lujun9972) +[#]: translator: (rakino) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12689-1.html) +[#]: subject: (How to Disable IPv6 on Ubuntu Linux) +[#]: via: (https://itsfoss.com/disable-ipv6-ubuntu-linux/) +[#]: author: (Sergiu https://itsfoss.com/author/sergiu/) + +如何在 Ubuntu Linux 上禁用 IPv6 +====== + +想知道怎样在 Ubuntu 上**禁用 IPv6** 吗?我会在这篇文章中介绍一些方法,以及为什么你应该考虑这一选择;以防改变主意,我也会提到如何**启用,或者说重新启用 IPv6**。 + +### 什么是 IPv6?为什么会想要禁用它? + +[互联网协议第 6 版][1]Internet Protocol version 6(IPv6)是互联网协议(IP)的最新版本。互联网协议是一种通信协议,它为网络上的计算机提供识别和定位系统,并在互联网上进行通信路由。IPv6 于 1998 年设计,以取代 IPv4 协议。 + +**IPv6** 意在提高安全性与性能的同时保证地址不被用尽;它可以在全球范围内为每台设备分配唯一的以 **128 位比特**存储的地址,而 IPv4 只使用了 32 位比特。 + +![Disable IPv6 Ubuntu][2] + +尽管 IPv6 的目标是取代 IPv4,但目前还有很长的路要走;互联网上只有不到 **30%** 的网站支持 IPv6([这里][3] 是谷歌的统计),IPv6 有时也给 [一些应用带来问题][4]。 + +由于 IPv6 使用全球(唯一分配的)路由地址,以及(仍然)有互联网服务供应商Internet Service Provider(ISP)不提供 IPv6 支持的事实,IPv6 这一功能在提供全球服务的**虚拟私人网络**Virtual Private Network(VPN)供应商的优先级列表中处于较低的位置,这样一来,他们就可以专注于对 VPN 用户最重要的事情:安全。 + +不想让自己暴露在各种威胁之下可能是另一个让你想在系统上禁用 IPv6 的原因。虽然 IPv6 本身比 IPv4 更安全,但我所指的风险是另一种性质上的。如果你不实际使用 IPv6 及其功能,那么[启用 IPv6 后,你会很容易受到各种攻击][5],因而为黑客提供另一种可能的利用工具。 + +同样,只配置基本的网络规则是不够的;你必须像对 IPv4 一样,对调整 IPv6 的配置给予同样的关注,这可能会是一件相当麻烦的事情(维护也是)。并且随着 IPv6 而来的将会是一套不同于 IPv4 的问题(鉴于这个协议的年龄,许多问题已经可以在网上找到了),这又会使你的系统多了一层复杂性。 + +据观察,在某些情况下,禁用 IPv6 有助于提高 Ubuntu 的 WiFi 速度。 + +### 在 Ubuntu 上禁用 IPv6 [高级用户] + +在本节中,我会详述如何在 Ubuntu 上禁用 IPv6 协议,请打开终端(默认快捷键:`CTRL+ALT+T`),让我们开始吧! + +**注意:** 接下来大部分输入终端的命令都需要 root 权限(`sudo`)。 + +> 警告! +> +> 如果你是一个普通 Linux 桌面用户,并且偏好稳定的工作系统,请避开本教程,接下来的部分是为那些知道自己在做什么以及为什么要这么做的用户准备的。 + +#### 1、使用 sysctl 禁用 IPv6 + +首先,可以执行以下命令来**检查** IPv6 是否已经启用: + +``` +ip a +``` + +如果启用了,你应该会看到一个 IPv6 地址(网卡的名字可能会与图中有所不同) + +![IPv6 Address Ubuntu][7] + +在教程《[在 Ubuntu 中重启网络][8]》(LCTT 译注:其实这篇文章并没有提到使用 sysctl 的方法……)中,你已经见过 `sysctl` 命令了,在这里我们也同样会用到它。要**禁用 IPv6**,只需要输入三条命令: + +``` +sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 +sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1 +sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1 +``` + +检查命令是否生效: + +``` +ip a +``` + +如果命令生效,你应该会发现 IPv6 的条目消失了: + +![IPv6 Disabled Ubuntu][9] + +然而这种方法只能**临时禁用 IPv6**,因此在下次系统启动的时候,IPv6 仍然会被启用。 + +(LCTT 译注:这里的临时禁用是指这次所做的改变直到此次关机之前都有效,因为相关的参数是存储在内存中的,可以改变值,但是在内存断电后就会丢失;这种意义上来讲,下文所述的两种方法都是临时的,只不过改变参数值的时机是在系统启动的早期,并且每次系统启动时都有应用而已。那么如何完成这种意义上的永久改变?答案是在编译内核的时候禁用相关功能,然后要后悔就只能重新编译内核了(悲)。) + +一种让选项持续生效的方式是修改文件 `/etc/sysctl.conf`,在这里我用 `vim` 来编辑文件,不过你可以使用任何你想使用的编辑器,以及请确保你拥有**管理员权限**(用 `sudo`): + +![Sysctl Configuration][10] + +将下面这几行(和之前使用的参数相同)加入到文件中: + +``` +net.ipv6.conf.all.disable_ipv6=1 +net.ipv6.conf.default.disable_ipv6=1 +net.ipv6.conf.lo.disable_ipv6=1 +``` + +执行以下命令应用设置: + +``` +sudo sysctl -p +``` + +如果在重启之后 IPv6 仍然被启用了,而你还想继续这种方法的话,那么你必须(使用 root 权限)创建文件 `/etc/rc.local` 并加入以下内容: + +``` +#!/bin/bash +# /etc/rc.local + +/etc/sysctl.d +/etc/init.d/procps restart + +exit 0 +``` + +接着使用 [chmod 命令][11] 来更改文件权限,使其可执行: + +``` +sudo chmod 755 /etc/rc.local +``` + +这会让系统(在启动的时候)从之前编辑过的 sysctl 配置文件中读取内核参数。 + +#### 2、使用 GRUB 禁用 IPv6 + +另外一种方法是配置 **GRUB**,它会在系统启动时向内核传递参数。这样做需要编辑文件 `/etc/default/grub`(请确保拥有管理员权限)。 + +![GRUB Configuration][13] + +现在需要修改文件中分别以 `GRUB_CMDLINE_LINUX_DEFAULT` 和 `GRUB_CMDLINE_LINUX` 开头的两行来在启动时禁用 IPv6: + +``` +GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ipv6.disable=1" +GRUB_CMDLINE_LINUX="ipv6.disable=1" +``` + +(LCTT 译注:这里是指在上述两行内增加参数 `ipv6.disable=1`,不同的系统中这两行的默认值可能有所不同。) + +保存文件,然后执行命令: + +``` +sudo update-grub +``` + +(LCTT 译注:该命令用以更新 GRUB 的配置文件,在没有 `update-grub` 命令的系统中需要使用 `sudo grub-mkconfig -o /boot/grub/grub.cfg` ) + +设置会在重启后生效。 + +### 在 Ubuntu 上重新启用 IPv6 + +要想重新启用 IPv6,你需要撤销之前的所有修改。不过只是想临时启用 IPv6 的话,可以执行以下命令: + +``` +sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0 +sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0 +sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0 +``` + +否则想要持续启用的话,看看是否修改过 `/etc/sysctl.conf`,可以删除掉之前增加的部分,也可以将它们改为以下值(两种方法等效): + +``` +net.ipv6.conf.all.disable_ipv6=0 +net.ipv6.conf.default.disable_ipv6=0 +net.ipv6.conf.lo.disable_ipv6=0 +``` + +然后应用设置(可选): + +``` +sudo sysctl -p +``` + +(LCTT 译注:这里可选的意思可能是如果之前临时启用了 IPv6 就没必要再重新加载配置文件了) + +这样应该可以再次看到 IPv6 地址了: + +![IPv6 Reenabled in Ubuntu][14] + +另外,你也可以删除之前创建的文件 `/etc/rc.local`(可选): + +``` +sudo rm /etc/rc.local +``` + +如果修改了文件 `/etc/default/grub`,回去删掉你所增加的参数: + +``` +GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" +GRUB_CMDLINE_LINUX="" +``` + +然后更新 GRUB 配置文件: + +``` +sudo update-grub +``` + +### 尾声 + +在这篇文章中,我介绍了在 Linux 上**禁用 IPv6** 的方法,并简述了什么是 IPv6 以及可能想要禁用掉它的原因。 + +那么,这篇文章对你有用吗?你有禁用掉 IPv6 连接吗?让我们评论区见吧~ + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/disable-ipv6-ubuntu-linux/ + +作者:[Sergiu][a] +选题:[lujun9972][b] +译者:[rakino](https://github.com/rakino) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/sergiu/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/IPv6 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/disable_ipv6_ubuntu.png?fit=800%2C450&ssl=1 +[3]: https://www.google.com/intl/en/ipv6/statistics.html +[4]: https://whatismyipaddress.com/ipv6-issues +[5]: https://www.internetsociety.org/blog/2015/01/ipv6-security-myth-1-im-not-running-ipv6-so-i-dont-have-to-worry/ +[6]: https://itsfoss.com/remove-drive-icons-from-unity-launcher-in-ubuntu/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/ipv6_address_ubuntu.png?fit=800%2C517&ssl=1 +[8]: https://linux.cn/article-10804-1.html +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/ipv6_disabled_ubuntu.png?fit=800%2C442&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/sysctl_configuration.jpg?fit=800%2C554&ssl=1 +[11]: https://linuxhandbook.com/chmod-command/ +[12]: https://itsfoss.com/find-which-kernel-version-is-running-in-ubuntu/ +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/grub_configuration-1.jpg?fit=800%2C565&ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/ipv6_address_ubuntu-1.png?fit=800%2C517&ssl=1 diff --git a/published/202010/20190822 Things You Didn-t Know About GNU Readline.md b/published/202010/20190822 Things You Didn-t Know About GNU Readline.md new file mode 100644 index 0000000000..12dc0a568d --- /dev/null +++ b/published/202010/20190822 Things You Didn-t Know About GNU Readline.md @@ -0,0 +1,132 @@ +[#]: collector: (lujun9972) +[#]: translator: (rakino) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12706-1.html) +[#]: subject: (Things You Didn't Know About GNU Readline) +[#]: via: (https://twobithistory.org/2019/08/22/readline.html) +[#]: author: (Two-Bit History https://twobithistory.org) + +你所不知的 GNU Readline +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/10/222755etdndudtu97wddz7.jpg) + +有时我会觉得自己的计算机是一栋非常大的房子,我每天都会访问这栋房子,也对一楼的大部分房间都了如指掌,但仍然还是有我没有去过的卧室,有我没有打开过的衣柜,有我没有探索过的犄角旮旯。我感到有必要更多地了解我的计算机了,就像任何人都会觉得有必要看看自己家里从未去过的房间一样。 + +GNU Readline 是个不起眼的小软件库,我依赖了它多年却没有意识到它的存在,也许有成千上万的人每天都在不经意间使用它。如果你用 Bash shell 的话,每当你自动补全一个文件名,或者在输入的一行文本中移动光标,以及搜索之前命令的历史记录时,你都在使用 GNU Readline;当你在 Postgres(`psql`)或是 Ruby REPL(`irb`)的命令行界面中进行同样的操作时,你依然在使用 GNU Readline。很多软件都依赖 GNU Readline 库来实现用户所期望的功能,不过这些功能是如此的辅助与不显眼,以至于在我看来很少有人会停下来去想它是从哪里来的。 + +GNU Readline 最初是自由软件基金会在 20 世纪 80 年代创建的,如今作为每个人的基础计算设施的重要的、甚至看不见的组成部分的它,由一位志愿者维护。 + +### 充满特色 + +GNU Readline 库的存在,主要是为了增强各种命令行界面,它提供了一组通用的按键,使你可以在一个单行输入中移动和编辑。例如,在 Bash 提示符中按下 `Ctrl-A`,你的光标会跳到行首,而按下 `Ctrl-E` 则会跳到行末;另一个有用的命令是 `Ctrl-U`,它会删除该行中光标之前的所有内容。 + +有很长一段时间,我通过反复敲击方向键来在命令行上移动,如今看来这十分尴尬,也不知道为什么,当时的我从来没有想过可以有一种更快的方法。当然了,没有哪一个熟悉 Vim 或 Emacs 这种文本编辑器的程序员愿意长时间地击打方向键,所以像 Readline 这样的东西必然会被创造出来。在 Readline 上可以做的绝非仅仅跳来跳去,你可以像使用文本编辑器那样编辑单行文本——这里有删除单词、单词换位、大写单词、复制和粘贴字符等命令。Readline 的大部分按键/快捷键都是基于 Emacs 的,它基本上就是一个单行文本版的 Emacs 了,甚至还有录制和重放宏的功能。 + +我从来没有用过 Emacs,所以很难记住所有不同的 Readline 命令。不过 Readline 有着很巧妙的一点,那就是能够切换到基于 Vim 的模式,在 Bash 中可以使用内置的 `set` 命令来这样做。下面会让 Readline 在当前的 shell 中使用 Vim 风格的命令: + +``` +$ set -o vi +``` + +该选项启用后,就可以使用 `dw` 等命令来删除单词了,此时相当于 Emacs 模式下的 `Ctrl-U` 的命令是 `d0`。 + +我第一次知道有这个功能的时候很兴奋地想尝试一下,但它对我来说并不是那么好用。我很高兴知道有这种对 Vim 用户的让步,在使用这个功能上你可能会比我更幸运,尤其是你还没有使用 Readline 的默认按键的话;我的问题在于,我听说有基于 Vim 的界面时已经学会了几种默认按键,因此即使启用了 Vim 的选项,也一直在错误地用着默认的按键;另外因为没有某种指示器,所以 Vim 的模态设计在这里会很尴尬——你很容易就忘记了自己处于哪个模式,就因为这样,我卡在了一种虽然使用 Vim 作为文本编辑器,但却在 Readline 上用着 Emacs 风格的命令的情况里,我猜其他很多人也是这样的。 + +如果你觉得 Vim 和 Emacs 的键盘命令系统诡异而神秘(这并不是没有道理的),你可以按照喜欢的方式自定义 Readline 的键绑定。Readline 在启动时会读取文件 `~/.inputrc`,它可以用来配置各种选项与键绑定,我做的一件事是重新配置了 `Ctrl-K`:通常情况下该命令会从光标处删除到行末,但我很少这样做,所以我在 `~/.inputrc` 中添加了以下内容,把它绑定为直接删除整行: + +``` +Control-k: kill-whole-line +``` + +每个 Readline 命令(文档中称它们为 “函数” )都有一个名称,你可以用这种方式将其与一个键序列联系起来。如果你在 Vim 中编辑 `~/.inputrc`,就会发现 Vim 知道这种文件类型,还会帮你高亮显示有效的函数名,而不高亮无效的函数名。 + +`~/.inputrc` 可以做的另一件事是通过将键序列映射到输入字符串上来创建预制宏。[Readline 手册][1]给出了一个我认为特别有用的例子:我经常想把一个程序的输出保存到文件中,这意味着我得经常在 Bash 命令中追加类似 `> output.txt` 这样的东西,为了节省时间,可以把它做成一个 Readline 宏: + +``` +Control-o: "> output.txt" +``` + +这样每当你按下 `Ctrl-O` 时,你都会看到 `> output.txt` 被添加到了命令行光标的后面,这样很不错! + +不过你可以用宏做的可不仅仅是为文本串创建快捷方式;在 `~/.inputrc` 中使用以下条目意味着每次按下 `Ctrl-J` 时,行内已有的文本都会被 `$(` 和 `)` 包裹住。该宏先用 `Ctrl-A` 移动到行首,添加 `$(` ,然后再用 `Ctrl-E` 移动到行尾,添加 `)`: + +``` +Control-j: "\C-a$(\C-e)" +``` + +如果你经常需要像下面这样把一个命令的输出用于另一个命令的话,这个宏可能会对你有帮助: + +``` +$ cd $(brew --prefix) +``` + +`~/.inputrc` 文件也允许你为 Readline 手册中所谓的 “变量” 设置不同的值,这些变量会启用或禁用某些 Readline 行为,你也可以使用这些变量来改变 Readline 中像是自动补全或者历史搜索这些行为的工作方式。我建议开启的一个变量是 `revert-all-at-newline`,它是默认关闭的,当这个变量关闭时,如果你使用反向搜索功能从命令历史记录中提取一行并编辑,但随后又决定搜索另一行,那么你所做的编辑会被保存在历史记录中。我觉得这样会很混乱,因为这会导致你的 Bash 命令历史中出现从未运行过的行。所以在你的 `~/.inputrc` 中加入这个: + +``` +set revert-all-at-newline on +``` + +在你用 `~/.inputrc` 设置了选项或键绑定以后,它们会适用于任何使用 Readline 库的地方,显然 Bash 也包括在内,不过你也会在其它像是 `irb` 和 `psql` 这样的程序中受益。如果你经常使用关系型数据库的命令行界面,一个用于插入 `SELECT * FROM` 的 Readline 宏可能会很有用。 + +### Chet Ramey + +GNU Readline 如今由凯斯西储大学的高级技术架构师 Chet Ramey 维护,Ramey 同时还负责维护 Bash shell;这两个项目都是由一位名叫 Brian Fox 的自由软件基金会员工在 1988 年开始编写的,但从 1994 年左右开始,Ramey 一直是它们唯一的维护者。 + +Ramey 通过电子邮件告诉我,Readline 远非一个原创的想法,它是为了实现 POSIX 规范所规定的功能而被创建的,而 POSIX 规范又是在 20 世纪 80 年代末被制定的。许多早期的 shell,包括 Korn shell 和至少一个版本的 Unix System V shell,都包含行编辑功能。1988 年版的 Korn shell(`ksh88`)提供了 Emacs 风格和 Vi/Vim 风格的编辑模式。据我从[手册页][2]中得知,Korn shell 会通过查看 `VISUAL` 和 `EDITOR` 环境变量来决定你使用的模式,这一点非常巧妙。POSIX 中指定 shell 功能的部分近似于 `ksh88` 的实现,所以 GNU Bash 也要实现一个类似的灵活的行编辑系统来保持兼容,因此就有了 Readline。 + +Ramey 第一次参与 Bash 开发时,Readline 还是 Bash 项目目录下的一个单一的源文件,它其实只是 Bash 的一部分;随着时间的推移,Readline 文件慢慢地成为了独立的项目,不过直到 1994 年(Readline 2.0 版本发布),Readline 才完全成为了一个独立的库。 + +Readline 与 Bash 密切相关,Ramey 也通常把 Readline 与 Bash 的发布配对,但正如我上面提到的,Readline 是一个可以被任何有命令行界面的软件使用的库,而且它真的很容易使用。下面是一个例子,虽然简单,但这就是在 C 程序中使用 Readline 的方法。向 `readline()` 函数传递的字符串参数就是你希望 Readline 向用户显示的提示符: + +``` +#include +#include +#include "readline/readline.h" + +int main(int argc, char** argv) +{ + char* line = readline("my-rl-example> "); + printf("You entered: \"%s\"\n", line); + + free(line); + + return 0; +} +``` + +你的程序会把控制权交给 Readline,它会负责从用户那里获得一行输入(以这样的方式让用户可以做所有花哨的行编辑工作),一旦用户真正提交了这一行,Readline 就会把它返回给你。在我的库搜索路径中有 Readline 库,所以我可以通过调用以下内容来链接 Readline 库,从而编译上面的内容: + +``` +$ gcc main.c -lreadline +``` + +当然,Readline 的 API 比起那个单一的函数要丰富得多,任何使用它的人都可以对库的行为进行各种调整,库的用户(开发者)甚至可以添加新的函数,来让最终用户可以通过 `~/.inputrc` 来配置它们,这意味着 Readline 非常容易扩展。但是据我所知,即使是 Bash ,虽然事先有很多配置,最终也会像上面的例子一样调用简单的 `readline()` 函数来获取输入。(参见 GNU Bash 源代码中的[这一行][3],Bash 似乎在这里将获取输入的责任交给了 Readline)。 + +Ramey 现在已经在 Bash 和 Readline 上工作了二十多年,但他的工作却从来没有得到过报酬 —— 他一直都是一名志愿者。Bash 和 Readline 仍然在积极开发中,尽管 Ramey 说 Readline 的变化比 Bash 慢得多。我问 Ramey 作为这么多人使用的软件唯一的维护者是什么感觉,他说可能有几百万人在不知不觉中使用 Bash(因为每个苹果设备都运行 Bash),这让他担心一个破坏性的变化会造成多大的混乱,不过他已经慢慢习惯了所有这些人的想法。他还说他会继续在 Bash 和 Readline 上工作,因为在这一点上他已经深深地投入了,而且他也只是单纯地喜欢把有用的软件提供给世界。 + +_你可以在 [Chet Ramey 的网站][4]上找到更多关于他的信息。_ + +_喜欢这篇文章吗?我会每四周写出一篇像这样的文章。关注推特帐号 [@TwoBitHistory][5] 或者[订阅 RSS][6] 来获取更新吧!_ + +-------------------------------------------------------------------------------- + +via: https://twobithistory.org/2019/08/22/readline.html + +作者:[Two-Bit History][a] +选题:[lujun9972][b] +译者:[rakino](https://github.com/rakino) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://twobithistory.org +[b]: https://github.com/lujun9972 +[1]: https://tiswww.case.edu/php/chet/readline/readline.html +[2]: https://web.archive.org/web/20151105130220/http://www2.research.att.com/sw/download/man/man1/ksh88.html +[3]: https://github.com/bminor/bash/blob/9f597fd10993313262cab400bf3c46ffb3f6fd1e/parse.y#L1487 +[4]: https://tiswww.case.edu/php/chet/ +[5]: https://twitter.com/TwoBitHistory +[6]: https://twobithistory.org/feed.xml +[7]: https://twitter.com/TwoBitHistory/status/1112492084383092738?ref_src=twsrc%5Etfw diff --git a/published/202010/20191105 My first contribution to open source- Making a decision.md b/published/202010/20191105 My first contribution to open source- Making a decision.md new file mode 100644 index 0000000000..a8863ea7ff --- /dev/null +++ b/published/202010/20191105 My first contribution to open source- Making a decision.md @@ -0,0 +1,59 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12768-1.html) +[#]: subject: (My first contribution to open source: Making a decision) +[#]: via: (https://opensource.com/article/19/11/my-first-open-source-contribution-mistake-decisions) +[#]: author: (Galen Corey https://opensource.com/users/galenemco) + +我的第一次开源贡献:做出决定 +====== + +> 一位新的开源贡献者告诉你如何加入到开源项目中。 + +![](https://img.linux.net.cn/data/attachment/album/202010/30/112350rh0xwp1x1y6awehn.jpg) + +先前,我把我的第一次开源贡献的拖延归咎于[冒牌综合症][2]。但还有一个我无法忽视的因素:我做出决定太艰难了。在[成千上百万][3]的开源项目中选择时,选择一个要做贡献的项目是难以抉择的。如此重负,以至于我常常不得不关掉我的笔记本去思考:“或许我改天再做吧”。 + +错误之二是让我对做出决定的恐惧妨碍了我做出第一次贡献。在理想世界里,也许开始我的开源之旅时,心中就已经有了一个真正关心和想去做的具体项目,但我有的只是总得为开源项目做出贡献的模糊目标。对于那些处于同一处境的人来说,这儿有一些帮助我挑选出合适的项目(或者至少是一个好的项目)来做贡献的策略。 + +### 经常使用的工具 + +一开始,我不认为有必要将自己局限于已经熟悉的工具或项目。有一些项目我之前从未使用过,但由于它们的社区很活跃,或者它们解决的问题很有趣,因此看起来很有吸引力。 + +但是,考虑我投入到这个项目中的时间有限,我决定继续投入到我了解的工具上去。要了解工具需求,你需要熟悉它的工作方式。如果你想为自己不熟悉的项目做贡献,则需要完成一个额外的步骤来了解代码的功能和目标。这个额外的工作量可能是有趣且值得的,但也会使你的工作时间加倍。因为我的目标主要是贡献,投入到我了解的工具上是缩小范围的很好方式。回馈一个你认为有用的项目也是有意义的。 + +### 活跃而友好的社区 + +在选择项目的时候,我希望在那里有人会审查我写的代码才会觉得有信心。当然,我也希望审核我代码的人是个和善的人。毕竟,把你的作品放在那里接受公众监督是很可怕的。虽然我对建设性的反馈持开放态度,但开发者社区中的一些有毒角落是我希望避免的。 + +为了评估我将要加入的社区,我查看了我正在考虑加入的仓库的议题issue部分。我要查看核心团队中是否有人定期回复。更重要的是,我试着确保没有人在评论中互相诋毁(这在议题讨论中是很常见的)。我还留意了那些有行为准则的项目,概述了什么是适当的和不适当的在线互动行为。 + +### 明确的贡献准则 + +因为这是我第一次为开源项目做出贡献,在此过程中我有很多问题。一些项目社区在流程的文档记录方面做的很好,可以用来指导挑选其中的议题并发起拉取请求。 [Gatsby][4] 是这种做法的典范,尽管那时我没有选择它们,因为在此之前我从未使用过该产品。 + +这种清晰的文档帮助我们缓解了一些不知如何去做的不安全感。它也给了我希望:项目对新的贡献者是开放的,并且会花时间来查看我的工作。除了贡献准则外,我还查看了议题部分,看看这个项目是否使用了“第一个好议题good first issue”标志。这是该项目对初学者开放的另一个迹象(并可以帮助你学会要做什么)。 + +### 总结 + +如果你还没有计划好选择一个项目,那么选择合适的领域进行你的第一个开源贡献更加可行。列出一系列标准可以帮助自己缩减选择范围,并为自己的第一个拉取请求找到一个好的项目。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/11/my-first-open-source-contribution-mistake-decisions + +作者:[Galen Corey][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/galenemco +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lightbulb-idea-think-yearbook-lead.png?itok=5ZpCm0Jh (Lightbulb) +[2]: https://opensource.com/article/19/10/my-first-open-source-contribution-mistakes +[3]: https://github.blog/2018-02-08-open-source-project-trends-for-2018/ +[4]: https://www.gatsbyjs.org/contributing/ diff --git a/published/202010/20200512 Scan your Linux security with Lynis.md b/published/202010/20200512 Scan your Linux security with Lynis.md new file mode 100644 index 0000000000..e945d3b86d --- /dev/null +++ b/published/202010/20200512 Scan your Linux security with Lynis.md @@ -0,0 +1,380 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12696-1.html) +[#]: subject: (Scan your Linux security with Lynis) +[#]: via: (https://opensource.com/article/20/5/linux-security-lynis) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) + +使用 Lynis 扫描 Linux 安全性 +====== + +> 使用这个全面的开源安全审计工具检查你的 Linux 机器的安全性。 + +![](https://img.linux.net.cn/data/attachment/album/202010/08/095516k6bdgeb6jhiajutm.jpg) + +你有没有想过你的 Linux 机器到底安全不安全?Linux 发行版众多,每个发行版都有自己的默认设置,你在上面运行着几十个版本各异的软件包,还有众多的服务在后台运行,而我们几乎不知道或不关心这些。 + +要想确定安全态势(指你的 Linux 机器上运行的软件、网络和服务的整体安全状态),你可以运行几个命令,得到一些零碎的相关信息,但你需要解析的数据量是巨大的。 + +如果能运行一个工具,生成一份关于机器安全状况的报告,那就好得多了。而幸运的是,有一个这样的软件:[Lynis][2]。它是一个非常流行的开源安全审计工具,可以帮助强化基于 Linux 和 Unix 的系统。根据该项目的介绍: + +> “它运行在系统本身,可以进行深入的安全扫描。主要目标是测试安全防御措施,并提供进一步强化系统的提示。它还将扫描一般系统信息、易受攻击的软件包和可能的配置问题。Lynis 常被系统管理员和审计人员用来评估其系统的安全防御。” + +### 安装 Lynis + +你的 Linux 软件仓库中可能有 Lynis。如果有的话,你可以用以下方法安装它: + +``` +dnf install lynis +``` + +或 + +``` +apt install lynis +``` + +然而,如果你的仓库中的版本不是最新的,你最好从 GitHub 上安装它。(我使用的是 Red Hat Linux 系统,但你可以在任何 Linux 发行版上运行它)。就像所有的工具一样,先在虚拟机上试一试是有意义的。要从 GitHub 上安装它: + +``` +$ cat /etc/redhat-release +Red Hat Enterprise Linux Server release 7.8 (Maipo) +$ +$ uname  -r +3.10.0-1127.el7.x86_64 +$ +$ git clone https://github.com/CISOfy/lynis.git +Cloning into 'lynis'... +remote: Enumerating objects: 30, done. +remote: Counting objects: 100% (30/30), done. +remote: Compressing objects: 100% (30/30), done. +remote: Total 12566 (delta 15), reused 8 (delta 0), pack-reused 12536 +Receiving objects: 100% (12566/12566), 6.36 MiB | 911.00 KiB/s, done. +Resolving deltas: 100% (9264/9264), done. +$ +``` + +一旦你克隆了这个版本库,那么进入该目录,看看里面有什么可用的。主要的工具在一个叫 `lynis` 的文件里。它实际上是一个 shell 脚本,所以你可以打开它看看它在做什么。事实上,Lynis 主要是用 shell 脚本来实现的: + +``` +$ cd lynis/ +$ ls +CHANGELOG.md        CONTRIBUTING.md  db           developer.prf  FAQ             include  LICENSE  lynis.8  README     SECURITY.md +CODE_OF_CONDUCT.md  CONTRIBUTORS.md  default.prf  extras         HAPPY_USERS.md  INSTALL  lynis    plugins  README.md +$ +$ file lynis +lynis: POSIX shell script, ASCII text executable, with very long lines +$ +``` + +### 运行 Lynis + +通过给 Lynis 一个 `-h` 选项来查看帮助部分,以便有个大概了解: + +``` +$ ./lynis -h +``` + +你会看到一个简短的信息屏幕,然后是 Lynis 支持的所有子命令。 + +接下来,尝试一些测试命令以大致熟悉一下。要查看你正在使用的 Lynis 版本,请运行: + +``` +$ ./lynis show version +3.0.0 +$ +``` + +要查看 Lynis 中所有可用的命令: + +``` +$ ./lynis show commands + +Commands: +lynis audit +lynis configure +lynis generate +lynis show +lynis update +lynis upload-only + +$ +``` + +### 审计 Linux 系统 + +要审计你的系统的安全态势,运行以下命令: + +``` +$ ./lynis audit system +``` + +这个命令运行得很快,并会返回一份详细的报告,输出结果可能一开始看起来很吓人,但我将在下面引导你来阅读它。这个命令的输出也会被保存到一个日志文件中,所以你可以随时回过头来检查任何可能感兴趣的东西。 + +Lynis 将日志保存在这里: + +``` +  Files: +  - Test and debug information      : /var/log/lynis.log +  - Report data                     : /var/log/lynis-report.dat +``` + +你可以验证是否创建了日志文件。它确实创建了: + +``` +$ ls -l /var/log/lynis.log +-rw-r-----. 1 root root 341489 Apr 30 05:52 /var/log/lynis.log +$ +$ ls -l /var/log/lynis-report.dat +-rw-r-----. 1 root root 638 Apr 30 05:55 /var/log/lynis-report.dat +$ +``` + +### 探索报告 + +Lynis 提供了相当全面的报告,所以我将介绍一些重要的部分。作为初始化的一部分,Lynis 做的第一件事就是找出机器上运行的操作系统的完整信息。之后是检查是否安装了什么系统工具和插件: + +``` +[+] Initializing program +------------------------------------ + - Detecting OS... [ DONE ] + - Checking profiles... [ DONE ] + + --------------------------------------------------- + Program version: 3.0.0 + Operating system: Linux + Operating system name: Red Hat Enterprise Linux Server 7.8 (Maipo) + Operating system version: 7.8 + Kernel version: 3.10.0 + Hardware platform: x86_64 + Hostname: example + --------------------------------------------------- +<<截断>> + +[+] System Tools +------------------------------------ + - Scanning available tools... + - Checking system binaries... + +[+] Plugins (phase 1) +------------------------------------ + Note: plugins have more extensive tests and may take several minutes to complete + + - Plugin: pam + [..] + - Plugin: systemd + [................] +``` + +接下来,该报告被分为不同的部分,每个部分都以 `[+]` 符号开头。下面可以看到部分章节。(哇,要审核的地方有这么多,Lynis 是最合适的工具!) + +``` +[+] Boot and services +[+] Kernel +[+] Memory and Processes +[+] Users, Groups and Authentication +[+] Shells +[+] File systems +[+] USB Devices +[+] Storage +[+] NFS +[+] Name services +[+] Ports and packages +[+] Networking +[+] Printers and Spools +[+] Software: e-mail and messaging +[+] Software: firewalls +[+] Software: webserver +[+] SSH Support +[+] SNMP Support +[+] Databases +[+] LDAP Services +[+] PHP +[+] Squid Support +[+] Logging and files +[+] Insecure services +[+] Banners and identification +[+] Scheduled tasks +[+] Accounting +[+] Time and Synchronization +[+] Cryptography +[+] Virtualization +[+] Containers +[+] Security frameworks +[+] Software: file integrity +[+] Software: System tooling +[+] Software: Malware +[+] File Permissions +[+] Home directories +[+] Kernel Hardening +[+] Hardening +[+] Custom tests +``` + +Lynis 使用颜色编码使报告更容易解读。 + + * 绿色。一切正常 + * 黄色。跳过、未找到,可能有个建议 + * 红色。你可能需要仔细看看这个 + +在我的案例中,大部分的红色标记都是在 “Kernel Hardening” 部分找到的。内核有各种可调整的设置,它们定义了内核的功能,其中一些可调整的设置可能有其安全场景。发行版可能因为各种原因没有默认设置这些,但是你应该检查每一项,看看你是否需要根据你的安全态势来改变它的值: + +``` +[+] Kernel Hardening +------------------------------------ +  - Comparing sysctl key pairs with scan profile +    - fs.protected_hardlinks (exp: 1)                         [ OK ] +    - fs.protected_symlinks (exp: 1)                          [ OK ] +    - fs.suid_dumpable (exp: 0)                               [ OK ] +    - kernel.core_uses_pid (exp: 1)                           [ OK ] +    - kernel.ctrl-alt-del (exp: 0)                            [ OK ] +    - kernel.dmesg_restrict (exp: 1)                          [ DIFFERENT ] +    - kernel.kptr_restrict (exp: 2)                           [ DIFFERENT ] +    - kernel.randomize_va_space (exp: 2)                      [ OK ] +    - kernel.sysrq (exp: 0)                                   [ DIFFERENT ] +    - kernel.yama.ptrace_scope (exp: 1 2 3)                   [ DIFFERENT ] +    - net.ipv4.conf.all.accept_redirects (exp: 0)             [ DIFFERENT ] +    - net.ipv4.conf.all.accept_source_route (exp: 0)          [ OK ] +    - net.ipv4.conf.all.bootp_relay (exp: 0)                  [ OK ] +    - net.ipv4.conf.all.forwarding (exp: 0)                   [ OK ] +    - net.ipv4.conf.all.log_martians (exp: 1)                 [ DIFFERENT ] +    - net.ipv4.conf.all.mc_forwarding (exp: 0)                [ OK ] +    - net.ipv4.conf.all.proxy_arp (exp: 0)                    [ OK ] +    - net.ipv4.conf.all.rp_filter (exp: 1)                    [ OK ] +    - net.ipv4.conf.all.send_redirects (exp: 0)               [ DIFFERENT ] +    - net.ipv4.conf.default.accept_redirects (exp: 0)         [ DIFFERENT ] +    - net.ipv4.conf.default.accept_source_route (exp: 0)      [ OK ] +    - net.ipv4.conf.default.log_martians (exp: 1)             [ DIFFERENT ] +    - net.ipv4.icmp_echo_ignore_broadcasts (exp: 1)           [ OK ] +    - net.ipv4.icmp_ignore_bogus_error_responses (exp: 1)     [ OK ] +    - net.ipv4.tcp_syncookies (exp: 1)                        [ OK ] +    - net.ipv4.tcp_timestamps (exp: 0 1)                      [ OK ] +    - net.ipv6.conf.all.accept_redirects (exp: 0)             [ DIFFERENT ] +    - net.ipv6.conf.all.accept_source_route (exp: 0)          [ OK ] +    - net.ipv6.conf.default.accept_redirects (exp: 0)         [ DIFFERENT ] +    - net.ipv6.conf.default.accept_source_route (exp: 0)      [ OK ] +``` + +看看 SSH 这个例子,因为它是一个需要保证安全的关键领域。这里没有什么红色的东西,但是 Lynis 对我的环境给出了很多强化 SSH 服务的建议: + +``` +[+] SSH Support +------------------------------------ +  - Checking running SSH daemon                               [ FOUND ] +    - Searching SSH configuration                             [ FOUND ] +    - OpenSSH option: AllowTcpForwarding                      [ SUGGESTION ] +    - OpenSSH option: ClientAliveCountMax                     [ SUGGESTION ] +    - OpenSSH option: ClientAliveInterval                     [ OK ] +    - OpenSSH option: Compression                             [ SUGGESTION ] +    - OpenSSH option: FingerprintHash                         [ OK ] +    - OpenSSH option: GatewayPorts                            [ OK ] +    - OpenSSH option: IgnoreRhosts                            [ OK ] +    - OpenSSH option: LoginGraceTime                          [ OK ] +    - OpenSSH option: LogLevel                                [ SUGGESTION ] +    - OpenSSH option: MaxAuthTries                            [ SUGGESTION ] +    - OpenSSH option: MaxSessions                             [ SUGGESTION ] +    - OpenSSH option: PermitRootLogin                         [ SUGGESTION ] +    - OpenSSH option: PermitUserEnvironment                   [ OK ] +    - OpenSSH option: PermitTunnel                            [ OK ] +    - OpenSSH option: Port                                    [ SUGGESTION ] +    - OpenSSH option: PrintLastLog                            [ OK ] +    - OpenSSH option: StrictModes                             [ OK ] +    - OpenSSH option: TCPKeepAlive                            [ SUGGESTION ] +    - OpenSSH option: UseDNS                                  [ SUGGESTION ] +    - OpenSSH option: X11Forwarding                           [ SUGGESTION ] +    - OpenSSH option: AllowAgentForwarding                    [ SUGGESTION ] +    - OpenSSH option: UsePrivilegeSeparation                  [ OK ] +    - OpenSSH option: AllowUsers                              [ NOT FOUND ] +    - OpenSSH option: AllowGroups                             [ NOT FOUND ] +``` + +我的系统上没有运行虚拟机或容器,所以这些显示的结果是空的: + +``` +[+] Virtualization +------------------------------------ + +[+] Containers +------------------------------------ +``` + +Lynis 会检查一些从安全角度看很重要的文件的文件权限: + +``` +[+] File Permissions +------------------------------------ +  - Starting file permissions check +    File: /boot/grub2/grub.cfg                                [ SUGGESTION ] +    File: /etc/cron.deny                                      [ OK ] +    File: /etc/crontab                                        [ SUGGESTION ] +    File: /etc/group                                          [ OK ] +    File: /etc/group-                                         [ OK ] +    File: /etc/hosts.allow                                    [ OK ] +    File: /etc/hosts.deny                                     [ OK ] +    File: /etc/issue                                          [ OK ] +    File: /etc/issue.net                                      [ OK ] +    File: /etc/motd                                           [ OK ] +    File: /etc/passwd                                         [ OK ] +    File: /etc/passwd-                                        [ OK ] +    File: /etc/ssh/sshd_config                                [ OK ] +    Directory: /root/.ssh                                     [ SUGGESTION ] +    Directory: /etc/cron.d                                    [ SUGGESTION ] +    Directory: /etc/cron.daily                                [ SUGGESTION ] +    Directory: /etc/cron.hourly                               [ SUGGESTION ] +    Directory: /etc/cron.weekly                               [ SUGGESTION ] +    Directory: /etc/cron.monthly                              [ SUGGESTION ] +``` + +在报告的底部,Lynis 根据报告的发现提出了建议。每项建议后面都有一个 “TEST-ID”(为了下一部分方便,请将其保存起来)。 + +``` + Suggestions (47): + ---------------------------- + * If not required, consider explicit disabling of core dump in /etc/security/limits.conf file [KRNL-5820] + https://cisofy.com/lynis/controls/KRNL-5820/ + + * Check PAM configuration, add rounds if applicable and expire passwords to encrypt with new values [AUTH-9229] + https://cisofy.com/lynis/controls/AUTH-9229/ +``` + +Lynis 提供了一个选项来查找关于每个建议的更多信息,你可以使用 `show details` 命令和 TEST-ID 号来访问: + +``` +./lynis show details TEST-ID +``` + +这将显示该测试的其他信息。例如,我检查了 SSH-7408 的详细信息: + +``` +$ ./lynis show details SSH-7408 +2020-04-30 05:52:23 Performing test ID SSH-7408 (Check SSH specific defined options) +2020-04-30 05:52:23 Test: Checking specific defined options in /tmp/lynis.k8JwazmKc6 +2020-04-30 05:52:23 Result: added additional options for OpenSSH < 7.5 +2020-04-30 05:52:23 Test: Checking AllowTcpForwarding in /tmp/lynis.k8JwazmKc6 +2020-04-30 05:52:23 Result: Option AllowTcpForwarding found +2020-04-30 05:52:23 Result: Option AllowTcpForwarding value is YES +2020-04-30 05:52:23 Result: OpenSSH option AllowTcpForwarding is in a weak configuration state and should be fixed +2020-04-30 05:52:23 Suggestion: Consider hardening SSH configuration [test:SSH-7408] [details:AllowTcpForwarding (set YES to NO)] [solution:-] +``` + +### 试试吧 + +如果你想更多地了解你的 Linux 机器的安全性,请试试 Lynis。如果你想了解 Lynis 是如何工作的,可以研究一下它的 shell 脚本,看看它是如何收集这些信息的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/linux-security-lynis + +作者:[Gaurav Kamathe][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/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer) +[2]: https://github.com/CISOfy/lynis diff --git a/published/202010/20200521 Use the internet from the command line with curl.md b/published/202010/20200521 Use the internet from the command line with curl.md new file mode 100644 index 0000000000..9880cead4e --- /dev/null +++ b/published/202010/20200521 Use the internet from the command line with curl.md @@ -0,0 +1,171 @@ +[#]: collector: (lujun9972) +[#]: translator: (MjSeven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12772-1.html) +[#]: subject: (Use the internet from the command line with curl) +[#]: via: (https://opensource.com/article/20/5/curl-cheat-sheet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 curl 从命令行访问互联网 +====== + +> 下载我们整理的 curl 备忘录。要在不使用图形界面的情况下从互联网上获取所需的信息,curl 是一种快速有效的方法。 + +![](https://img.linux.net.cn/data/attachment/album/202010/31/000543n032ud499yy4d94v.jpg) + +`curl` 通常被视作一款非交互式 Web 浏览器,这意味着它能够从互联网上获取信息,并在你的终端中显示,或将其保存到文件中。从表面看,这是 Web 浏览器,类似 Firefox 或 Chromium 所做的工作,只是它们默认情况下会*渲染*信息,而 `curl` 会下载并显示原始信息。实际上,`curl` 命令可以做更多的事情,并且能够使用多种协议与服务器进行双向传输数据,这些协议包括 HTTP、FTP、SFTP、IMAP、POP3、LDAP、SMB、SMTP 等。对于普通终端用户来说,这是一个有用的工具;而对于系统管理员,这非常便捷;对于微服务和云开发人员来说,它是一个质量保证工具。 + +`curl` 被设计为在没有用户交互的情况下工作,因此与 Firefox 不同,你必须从头到尾考虑与在线数据的交互。例如,如果想要在 Firefox 中查看网页,你需要启动 Firefox 窗口。打开 Firefox 后,在地址栏或搜索引擎中输入要访问的网站。然后,导航到网站,然后单击要查看的页面。 + +对于 `curl` 来说也是如此,不同之处在于你需要一次执行所有操作:在启动 `curl` 的同时提供需要访问的互联网地址,并告诉它是否要将数据保存在终端或文件中。当你必须与需要身份验证的网站或 API 进行交互时,会变得有点复杂,但是一旦你学习了 `curl` 命令语法,它就会变得自然而然。为了帮助你掌握它,我们在一个方便的[备忘录][2]中收集了相关的语法信息。 + +### 使用 curl 下载文件 + +你可以通过提供指向特定 URL 的链接来使用 `curl` 命令下载文件。如果你提供的 URL 默认为 `index.html`,那么将下载此页面,并将下载的文件显示在终端屏幕上。你可以将数据通过管道传递到 `less`、`tail` 或任何其它命令: + +``` +$ curl "http://example.com" | tail -n 4 +

        Example Domain

        +

        This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.

        +

        More information...

        + +``` + +由于某些 URL 包含特殊字符,shell 通常会将其解释,因此最安全的做法用引号将 URL 包起来。 + +某些文件无法很好的在终端中转换显示。你可以使用 `--remote-name` 选项使文件根据服务器上的命名进行保存: + +``` +$ curl --remote-name "https://example.com/linux-distro.iso" +$ ls +linux-distro.iso +``` + +或者,你可以使用 `--output` 选项来命名你想要下载的内容: + +``` +curl "http://example.com/foo.html" --output bar.html +``` + +### 使用 curl 列出带有远程目录的内容 + +因为 `curl` 不是交互式的,所以很难浏览页面上的可下载元素。如果你要连接的远程服务器允许,可以使用 `curl` 来列出目录的内容: + +``` +$ curl --list-only "https://example.com/foo/" +``` + +### 继续中断下载 + +如果你正在下载一个非常大的文件,你可能会发现有时候必须中断下载。`curl` 非常智能,可以确定下载从何处中断并继续下载。这意味着,下一次当你下载一个 4GB 的 Linux 发行版的 ISO 出现问题时,就不必重新开始了。`--continue-at` 的语法有点不寻常:如果你知道下载中断时的字节数,你可以提供给 `curl`;否则,你可以使用单独的一个破折号(`-`)指示 curl 自动检测: + +``` +$ curl --remote-name --continue-at - "https://example.com/linux-distro.iso" +``` + +### 下载文件序列 + +如果你需要下载多个文件而不是一个大文件,那么 `curl` 可以帮助你解决这个问题。假设你知道要下载的文件的位置和文件名模式,则可以使用 `curl` 的序列标记:中括号里是整数范围的起点和终点。对于输出文件名,使用 `#1` 表示第一个变量: + +``` +$ curl "https://example.com/file_[1-4].webp" --output "file_#1.webp" +``` + +如果你需要使用其它变量来表示另一个序列,按照每个变量在命令中出现的顺序表示它们。例如,在这个命令中,`#1` 指目录 `images_000` 到 `images_009`,而 `#2` 指目录 `file_1.webp` 至 `file_4.webp`: + +``` +$ curl "https://example.com/images_00[0-9]/file_[1-4].webp" --output "file_#1-#2.webp" +``` + +### 从站点下载所有 PNG 文件 + +你也可以仅使用 `curl` 和 `grep` 进行一些基本的 Web 抓取操作,以找到想要下载的内容。例如,假设你需要下载与正在归档网页关联的所有图像,首先,下载引用了图像的页面。将页面内通过管道传输到 `grep`,搜索所需的图片类型(在此示例中为 PNG)。最后,创建一个 `while` 循环来构造下载 URL,并将文件保存到你的计算机: + +``` +$ curl https://example.com |\ +grep --only-matching 'src="[^"]*.[png]"' |\ +cut -d\" -f2 |\ +while read i; do \ +curl https://example.com/"${i}" -o "${i##*/}"; \ +done +``` + +这只是一个示例,但它展示了 `curl` 与 Unix 管道和一些基本而巧妙的解析结合使用时是多么的灵活。 + +### 获取 HTML 头 + +用于数据交换的协议在计算机发送通信的数据包中嵌入了大量元数据。HTTP 头是数据初始部分的组件。在连接一个网站出现问题时,查看这些报文头(尤其是响应码)会有所帮助: + +``` +curl --head "https://example.com" +HTTP/2 200 +accept-ranges: bytes +age: 485487 +cache-control: max-age=604800 +content-type: text/html; charset=UTF-8 +date: Sun, 26 Apr 2020 09:02:09 GMT +etag: "3147526947" +expires: Sun, 03 May 2020 09:02:09 GMT +last-modified: Thu, 17 Oct 2019 07:18:26 GMT +server: ECS (sjc/4E76) +x-cache: HIT +content-length: 1256 +``` + +### 快速失败 + +响应 200 通常是 HTTP 成功指示符,这是你与服务器连接时通常期望的结果。著名的 404 响应表示找不到页面,而 500 则表示服务器在处理请求时出现了错误。 + +要查看协商过程中发生了什么错误,添加 `--show-error` 选项: + +``` +$ curl --head --show-error "http://opensource.ga" +``` + +除非你可以访问要连接的服务器,否则这些问题将很难解决,但是 `curl` 通常会尽力连接你指定的地址。有时在网络上进行测试时,无休止的重试似乎只会浪费时间,因此你可以使用 `--fail-early` 选项来强制 `curl` 在失败时迅速退出: + +``` +curl --fail-early "http://opensource.ga" +``` + +### 由 3xx 响应指定的重定向查询 + +300 这个系列的响应更加灵活。具体来说,301 响应意味着一个 URL 已被永久移动到其它位置。对于网站管理员来说,重新定位内容并留下“痕迹”是一种常见的方式,这样访问旧地址的人们仍然可以找到它。默认情况下,`curl` 不会进行 301 重定向,但你可以使用 `--localtion` 选项使其继续进入 301 响应指向的目标: + +``` +$ curl "https://iana.org" | grep title +301 Moved Permanently +$ curl --location "https://iana.org" +Internet Assigned Numbers Authority +``` + +### 展开短网址 + +如果你想要在访问短网址之前先查看它们,那么 `--location` 选项非常有用。短网址对于有字符限制的社交网络(当然,如果你使用[现代和开源的社交网络][4]的话,这可能不是问题),或者对于用户不能复制粘贴长地址的印刷媒体来说是有用处的。但是,它们也可能存在风险,因为其目的地址本质上是隐藏的。通过结合使用 `--head` 选项仅查看 HTTP 头,`--location` 选项可以查看一个 URL 的最终地址,你可以查看一个短网址而无需加载其完整的资源: + +``` +$ curl --head --location "" +``` + +### 下载我们的 curl 备忘录 + +一旦你开始考虑了将探索 web 由一条命令来完成,那么 `curl` 就成为一种快速有效的方式,可以从互联网上获取所需的信息,而无需麻烦图形界面。为了帮助你适应到工作流中,我们创建了一个 [curl 备忘录][2],它包含常见的 `curl` 用法和语法,包括使用它查询 API 的概述。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/curl-cheat-sheet + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image) +[2]: https://opensource.com/downloads/curl-command-cheat-sheet +[3]: https://www.iana.org/domains/example"\>More +[4]: https://opensource.com/article/17/4/guide-to-mastodon diff --git a/published/202010/20200629 Using Bash traps in your scripts.md b/published/202010/20200629 Using Bash traps in your scripts.md new file mode 100644 index 0000000000..361a1aba6b --- /dev/null +++ b/published/202010/20200629 Using Bash traps in your scripts.md @@ -0,0 +1,142 @@ +[#]: collector: (lujun9972) +[#]: translator: (HankChow) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12715-1.html) +[#]: subject: (Using Bash traps in your scripts) +[#]: via: (https://opensource.com/article/20/6/bash-trap) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +在脚本中使用 Bash 信号捕获 +====== + +> 无论你的脚本是否成功运行,信号捕获trap都能让它平稳结束。 + +![](https://img.linux.net.cn/data/attachment/album/202010/13/182135f2nktcrnryncisg8.jpg) + +Shell 脚本的启动并不难被检测到,但 Shell 脚本的终止检测却并不容易,因为我们无法确定脚本会按照预期地正常结束,还是由于意外的错误导致失败。当脚本执行失败时,将正在处理的内容记录下来是非常有用的做法,但有时候这样做起来并不方便。而 [Bash][2] 中 `trap` 命令的存在正是为了解决这个问题,它可以捕获到脚本的终止信号,并以某种预设的方式作出应对。 + +### 响应失败 + +如果出现了一个错误,可能导致发生一连串错误。下面示例脚本中,首先在 `/tmp` 中创建一个临时目录,这样可以在临时目录中执行解包、文件处理等操作,然后再以另一种压缩格式进行打包: + +``` +#!/usr/bin/env bash +CWD=`pwd` +TMP=${TMP:-/tmp/tmpdir} + +## create tmp dir +mkdir "${TMP}" + +## extract files to tmp +tar xf "${1}" --directory "${TMP}" + +## move to tmpdir and run commands +pushd "${TMP}" +for IMG in *.jpg; do + mogrify -verbose -flip -flop "${IMG}" +done +tar --create --file "${1%.*}".tar *.jpg + +## move back to origin +popd + +## bundle with bzip2 +bzip2 --compress "${TMP}"/"${1%.*}".tar \ + --stdout > "${1%.*}".tbz + +## clean up +/usr/bin/rm -r /tmp/tmpdir +``` + +一般情况下,这个脚本都可以按照预期执行。但如果归档文件中的文件是 PNG 文件而不是期望的 JPEG 文件,脚本就会在中途失败,这时候另一个问题就出现了:最后一步删除临时目录的操作没有被正常执行。如果你手动把临时目录删掉,倒是不会造成什么影响,但是如果没有手动把临时目录删掉,在下一次执行这个脚本的时候,它必须处理一个现有的临时目录,里面充满了不可预知的剩余文件。 + +其中一个解决方案是在脚本开头增加一个预防性删除逻辑用来处理这种情况。但这种做法显得有些暴力,而我们更应该从结构上解决这个问题。使用 `trap` 是一个优雅的方法。 + +### 使用 trap 捕获信号 + +我们可以通过 `trap` 捕捉程序运行时的信号。如果你使用过 `kill` 或者 `killall` 命令,那你就已经使用过名为 `SIGTERM` 的信号了。除此以外,还可以执行 `trap -l` 或 `trap --list` 命令列出其它更多的信号: + +``` +$ trap --list + 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP + 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1 +11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM +16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP +21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ +26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR +31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3 +38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8 +43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 +48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 +53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7 +58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2 +63) SIGRTMAX-1  64) SIGRTMAX +``` + +可以被 `trap` 识别的信号除了以上这些,还包括: + + * `EXIT`:进程退出时发出的信号 + * `ERR`:进程以非 0 状态码退出时发出的信号 + * `DEBUG`:表示调试模式的布尔值 + +如果要在 Bash 中实现信号捕获,只需要在 `trap` 后加上需要执行的命令,再加上需要捕获的信号列表就可以了。 + +例如,下面的这行语句可以捕获到在进程运行时用户按下 `Ctrl + C` 组合键发出的 `SIGINT` 信号: + +``` +trap "{ echo 'Terminated with Ctrl+C'; }" SIGINT +``` + +因此,上文中脚本的缺陷可以通过使用 `trap` 捕获 `SIGINT`、`SIGTERM`、进程错误退出、进程正常退出等信号,并正确处理临时目录的方式来修复: + +``` +#!/usr/bin/env bash +CWD=`pwd` +TMP=${TMP:-/tmp/tmpdir} + +trap \ + "{ /usr/bin/rm -r "${TMP}" ; exit 255; }" \ + SIGINT SIGTERM ERR EXIT + +## create tmp dir +mkdir "${TMP}" +tar xf "${1}" --directory "${TMP}" + +## move to tmp and run commands +pushd "${TMP}" +for IMG in *.jpg; do + mogrify -verbose -flip -flop "${IMG}" +done +tar --create --file "${1%.*}".tar *.jpg + +## move back to origin +popd + +## zip tar +bzip2 --compress $TMP/"${1%.*}".tar \ + --stdout > "${1%.*}".tbz +``` + +对于更复杂的功能,还可以用 [Bash 函数][3]来简化 `trap` 语句。 + +### Bash 中的信号捕获 + +信号捕获可以让脚本在无论是否成功执行所有任务的情况下都能够正确完成清理工作,能让你的脚本更加可靠,这是一个很好的习惯。尽管尝试把信号捕获加入到你的脚本里看看能够起到什么作用吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/bash-trap + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[HankChow](https://github.com/HankChow) +校对:[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/programming-code-keyboard-laptop.png?itok=pGfEfu2S (Hands programming) +[2]: https://opensource.com/resources/what-bash +[3]: https://opensource.com/article/20/6/how-write-functions-bash diff --git a/published/202010/20200723 Automate testing for website errors with this Python tool.md b/published/202010/20200723 Automate testing for website errors with this Python tool.md new file mode 100644 index 0000000000..5b0284b231 --- /dev/null +++ b/published/202010/20200723 Automate testing for website errors with this Python tool.md @@ -0,0 +1,140 @@ +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12700-1.html" +[#]: subject: "Automate testing for website errors with this Python tool" +[#]: via: "https://opensource.com/article/20/7/seodeploy" +[#]: author: "JR Oakes https://opensource.com/users/jroakes" + +使用这个 Python 工具对网站 SEO 问题进行自动化测试 +====== + +> SEODeploy 可以帮助我们在网站部署之前识别出 SEO 问题。 + +![](https://img.linux.net.cn/data/attachment/album/202010/09/194928xbqvdd81amapgdae.jpg) + +作为一个技术性搜索引擎优化开发者,我经常被请来协助做网站迁移、新网站发布、分析实施和其他一些影响网站在线可见性和测量等领域,以控制风险。许多公司每月经常性收入的很大一部分来自用户通过搜索引擎找到他们的产品和服务。虽然搜索引擎已经能妥善地处理没有被良好格式化的代码,但在开发过程中还是会出问题,对搜索引擎如何索引和为用户显示页面产生不利影响。 + +我曾经也尝试通过评审各阶段会破坏 SEO(搜索引擎优化search engine optimization)的问题来手动降低这种风险。我的团队最终审查到的结果,决定了该项目是否可以上线。但这个过程通常很低效,只能用于有限的页面,而且很有可能出现人为错误。 + +长期以来,这个行业一直在寻找可用且值得信赖的方式来自动化这一过程,同时还能让开发人员和搜索引擎优化人员在必须测试的内容上获得有意义的发言权。这是非常重要的,因为这些团队在开发冲刺中优先级通常会发生冲突,搜索引擎优化者需要推动变化,而开发人员需要控制退化和预期之外的情况。 + +### 常见的破坏 SEO 的问题 + +我合作过的很多网站有成千上万的页面,甚至上百万。实在令人费解,为什么一个开发过程中的改动能影响这么多页面。在 SEO 的世界中,Google 或其他搜索引擎展示你的页面时,一个非常微小和看起来无关紧要的修改也可能导致全网站范围的变化。在部署到生产环境之前,必须要处理这类错误。 + +下面是我去年见过的几个例子。 + +#### 偶发的 noindex + +在部署到生产环境之后,我们用的一个专用的第三方 SEO 监控工具 [ContentKing][2] 马上发现了这个问题。这个错误很隐蔽,因为它在 HTML 中是不可见的,确切地说,它隐藏在服务器响应头里,但它能很快导致搜索不可见。 + +``` +HTTP/1.1 200 OK +Date: Tue May 25 2010 21:12:42 GMT +[...] +X-Robots-Tag: noindex +[...] +``` + +#### canonical 小写 + +上线时错误地把整个网站的 [canonical 链接元素][3]全改成小写了。这个改动影响了接近 30000 个 URL。在修改之前,所有的 URL 大小写都正常(例如 `URL-Path` 这样)。这之所以是个问题是因为 `canonical` 链接元素是用来给 Google 提示一个网页真实的规范 URL 版本的。这个改动导致很多 URL 被从 Google 的索引中移除并用小写的版本(`/url-path`)重新建立索引。影响范围是流量损失了 10% 到 15%,也污染了未来几个星期的网页监控数据。 + +#### 源站退化 + +有个网站的 React 实现复杂而奇特,它有个神奇的问题,`origin.domain.com` URL 退化显示为 CDN 服务器的源站。它会在网站元数据(如 `canonical` 链接元素、URL 和 Open Graph 链接)中间歇性地显示原始的主机而不是 CDN 边缘主机。这个问题在原始的 HTML 和渲染后的 HTML 中都存在。这个问题影响搜索的可见性和在社交媒体上的分享质量。 + +### SEODeploy 介绍 + +SEO 通常使用差异测试工具来检测渲染后和原始的 HTML 的差异。差异测试是很理想的,因为它避免了肉眼测试的不确定性。你希望检查 Google 对你的页面的渲染过程的差异,而不是检查用户对你页面的渲染。你希望查看下原始的 HTML 是什么样的,而不是渲染后的 HTML,因为 Google 的渲染过程是有独立的两个阶段的。 + +这促使我和我的同事创造了 [SEODeploy][4] 这个“在部署流水线中用于自动化 SEO 测试的 Python 库。”我们的使命是: + +> 开发一个工具,让开发者能提供若干 URL 路径,并允许这些 URL 在生产环境和预演环境的主机上进行差异测试,尤其是对 SEO 相关数据的非预期的退化。 + +SEODeploy 的机制很简单:提供一个每行内容都是 URL 路径的文本文件,SEODeploy 对那些路径运行一系列模块,对比生产环境production预演环境staging的 URL,把检测到的所有的错误和改动信息报告出来。 + +![SEODeploy overview][5] + +这个工具及其模块可以用一个 YAML 文件来配置,可以根据预期的变化进行定制。 + +![SEODeploy output][7] + +最初的发布版本包含下面的的核心功能和概念: + + 1. **开源**:我们坚信分享代码可以被大家批评、改进、扩展、分享和复用。 + 2. **模块化**:Web 开发中有许多不同的堆栈和边缘案例。SEODeploy 工具在概念上很简单,因此采用模块化用来控制复杂性。我们提供了两个建好的模块和一个实例模块来简述基本结构。 + 3. **URL 抽样**:由于它不是对所有 URL 都是可行和有效的,因此我们引入了一种随机抽取 XML 网站地图 URL 或被 ContentKing 监控的 URL 作为样本的方法。 + 4. **灵活的差异检测**:Web 数据是凌乱的。无论被检测的数据是什么类型(如 ext、数组或列表、JSON 对象或字典、整数、浮点数等等),差异检测功能都会尝试将这些数据转换为差异信息。 + 5. **自动化**: 你可以在命令行来调用抽样和运行方法,将 SEODeploy 融合到已有的流水线也很简单。 + +### 模块 + +虽然核心功能很简单,但在设计上,SEODeploy 的强大功能和复杂度体现在模块上。模块用来处理更难的任务:获取、清理和组织预演服务器和生产服务器上的数据来作对比。 + +#### Headless 模块 + +[Headless 模块][8] 是为那些从库里获取数据时不想为第三方服务付费的开发者准备的。它可以运行任意版本的 Chrome,会从每组用来比较的 URL 中提取渲染的数据。 + +Headless 模块会提取下面的核心数据用来比较: + + 1. SEO 内容,如标题、H1-H6、链接等等。 + 2. 从 Chrome 计时器Timings和 CDP(Chrome 开发工具协议Chrome DevTools Protocol)性能 API 中提取性能数据 + 3. 计算出的性能指标,包括 CLS(累积布局偏移Cumulative Layout Shift),这是 Google 最近发布的一个很受欢迎的 [Web 核心数据][9] + 4. 从上述 CDP 的覆盖率 API 获取的 CSS 和 JavaScript 的覆盖率数据 + +这个模块引入了处理预演环境、网络速度预设(为了让对比更规范化)等功能,也引入了一个处理在预演对比数据中替换预演主机的方法。开发者也能很容易地扩展这个模块,以收集他们想要在每个页面上进行比较的任何其他数据。 + +#### 其他模块 + +我们为开发者创建了一个[示例模块][10],开发者可以参照它来使用框架创建一个自定义的提取模块。另一个示例模块是与 ContentKing 结合的。ContentKing 模块需要有 ContentKing 订阅,而 Headless 可以在所有能运行 Chrome 的机器上运行。 + +### 需要解决的问题 + +我们有扩展和强化工具库的[计划][11],但正在寻求开发人员的[反馈][12],了解哪些是可行的,哪些是不符合他们的需求。我们正在解决的问题和条目有: + + 1. 对于某些对比元素(尤其是 schema),动态时间戳会产生误报。 + 2. 把测试数据保存到数据库,以便查看部署历史以及与上次的预演推送进行差异测试。 + 3. 通过云基础设施的渲染,强化提取的规模和速度。 + 4. 把测试覆盖率从现在的 46% 提高到 99% 以上。 + 5. 目前,我们依赖 [Poetry][13] 进行部署管理,但我们希望发布一个 PyPl 库,这样就可以用 `pip install` 轻松安装。 + 6. 我们还在关注更多使用时的问题和相关数据。 + +### 开始使用 + +这个项目在 [GitHub][4] 上,我们对大部分功能都提供了 [文档][14]。 + +我们希望你能克隆 SEODeploy 并试试它。我们的目标是通过这个由技术性搜索引擎优化开发者开发的、经过开发者和工程师们验证的工具来支持开源社区。我们都见过验证复杂的预演问题需要多长时间,也都见过大量 URL 的微小改动能有什么样的业务影响。我们认为这个库可以为开发团队节省时间、降低部署过程中的风险。 + +如果你有问题或者想提交代码,请查看项目的[关于][15]页面。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/seodeploy + +作者:[JR Oakes][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jroakes +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY "Computer screen with files or windows open" +[2]: https://www.contentkingapp.com/ +[3]: https://en.wikipedia.org/wiki/Canonical_link_element +[4]: https://github.com/locomotive-agency/SEODeploy +[5]: https://opensource.com/sites/default/files/uploads/seodeploy.png "SEODeploy overview" +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/seodeploy_output.png "SEODeploy output" +[8]: https://locomotive-agency.github.io/SEODeploy/modules/headless/ +[9]: https://web.dev/vitals/ +[10]: https://locomotive-agency.github.io/SEODeploy/modules/creating/ +[11]: https://locomotive-agency.github.io/SEODeploy/todo/ +[12]: https://locomotive-agency.github.io/SEODeploy/about/#contact +[13]: https://python-poetry.org/ +[14]: https://locomotive-agency.github.io/SEODeploy/ +[15]: https://locomotive-agency.github.io/SEODeploy/about/ diff --git a/published/202010/20200810 How to read Lynis reports to improve Linux security.md b/published/202010/20200810 How to read Lynis reports to improve Linux security.md new file mode 100644 index 0000000000..41188a41c1 --- /dev/null +++ b/published/202010/20200810 How to read Lynis reports to improve Linux security.md @@ -0,0 +1,216 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12697-1.html) +[#]: subject: (How to read Lynis reports to improve Linux security) +[#]: via: (https://opensource.com/article/20/8/linux-lynis-security) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) + +如何阅读 Lynis 报告提高 Linux 安全性 +====== + +> 使用 Lynis 的扫描和报告来发现和修复 Linux 安全问题。 + +![](https://img.linux.net.cn/data/attachment/album/202010/08/102355k7jakojhz9x8xamx.jpg) + +当我读到 Gaurav Kamathe 的文章《[使用 Lynis 扫描 Linux 安全性][2]》时,让我想起了我在美国劳工部担任系统管理员的日子。我那时的职责之一是保证我们的 Unix 服务器的安全。每个季度,都会有一个独立的核查员来审查我们服务器的安全状态。每次在核查员预定到达的那一天,我都会运行 Security Readiness Review(SRR),这是一个扫描工具,它使用一大套脚本来识别和报告任何安全线索。SRR 是开源的,因此我可以查看所有源码脚本及其功能。这使我能够查看其代码,确定具体是什么问题,并迅速修复它发现的每个问题。 + +### 什么是 Lynis? + +[Lynis][3] 是一个开源的安全审计工具,它的工作原理和 SRR 很像,它会扫描 Linux 系统,并提供它发现的任何弱点的详细报告。同样和 SRR 一样,它也是由一大套脚本组成的,每个脚本都会检查一个特定的项目,例如,最小和最大密码时间要求。 + +运行 Lynis 后,你可以使用它的报告来定位每个项目的脚本,并了解 Lynis 是如何检查和报告每个问题的。你也可以使用相同的脚本代码来创建新的代码来自动解决。 + +### 如何阅读 Lynis 报告 + +由于 Gaurav 的文章介绍了 Lynis 的安装和使用,在本文中,我将展示一些如何阅读和使用其报告的例子。 + +请从运行一次审计开始: + +``` +# lynis audit system --quick +``` + +完成后,完整的报告将显示在你的屏幕上。在底部,“Suggestions” 部分列出了所有可能需要修复以更好地加固系统的项目,以及每个项目的 TEST-ID。 + +要想加固系统并减少列表的大小,请开始解决每个项目。在 “Suggestions” 部分的描述可能包含了你需要采取的全部行动。如果没有,你可以使用 `show details` 命令。 + +``` +# lynis show details TEST-ID +``` + +例如,在我的系统中,有一条建议是: + +> 找不到 `locate` 所需的数据库,运行 `updatedb` 或 `locate.updatedb` 来创建这个文件。[FILE-6410] + +看起来我只需要运行 `updatedb` 命令就行,但如果我想确定一下,我可以使用 Lynis 的 `show details` 选项。 + +``` +# lynis show details FILE-6410 +2020-06-16 20:54:33 Performing test ID FILE-6410 (Checking Locate database) +2020-06-16 20:54:33 Test: Checking locate database +2020-06-16 20:54:33 Result: file /var/lib/mlocate/mlocate.db not found +2020-06-16 20:54:33 Result: file /var/lib/locate/locatedb not found +2020-06-16 20:54:33 Result: file /var/lib/locatedb not found +2020-06-16 20:54:33 Result: file /var/lib/slocate/slocate.db not found +2020-06-16 20:54:33 Result: file /var/cache/locate/locatedb not found +2020-06-16 20:54:33 Result: file /var/db/locate.database not found +2020-06-16 20:54:33 Result: database not found +2020-06-16 20:54:33 Suggestion: The database required for 'locate' could not be found. Run 'updatedb' or 'locate.updatedb' to create this file. [test:FILE-6410] [details:-] [solution:-] +2020-06-16 20:54:33 ==== +``` + +这些细节表明 Lynis 无法找到各种文件。这个情况描述的非常清楚。我可以运行 `updatedb` 命令,然后重新检查这个测试。 + +``` +# updatedb +# lynis --tests FILE-6410 +``` + +重新检查细节时,会显示它发现哪个文件满足了测试: + +``` +# lynis show details FILE-6410 +2020-06-16 21:38:40 Performing test ID FILE-6410 (Checking Locate database) +2020-06-16 21:38:40 Test: Checking locate database +2020-06-16 21:38:40 Result: locate database found (/var/lib/mlocate/mlocate.db) +2020-06-16 21:38:40 Result: file /var/lib/locate/locatedb not found +2020-06-16 21:38:40 Result: file /var/lib/locatedb not found +2020-06-16 21:38:40 Result: file /var/lib/slocate/slocate.db not found +2020-06-16 21:38:40 Result: file /var/cache/locate/locatedb not found +2020-06-16 21:38:40 Result: file /var/db/locate.database not found +2020-06-16 21:38:40 ==== +``` + +### 深入挖掘 + +Lynis 的许多建议并不像这个建议那样直接。如果你不确定某个发现或建议指的是什么,就很难知道如何解决问题。假设你在一个新的 Linux 服务器上运行 Lynis,有几项与 SSH 守护进程有关的内容,其中一项是关于 `MaxAuthTries` 的设置: + +``` +* Consider hardening SSH configuration [SSH-7408] + - Details : MaxAuthTries (6 --> 3) + https://cisofy.com/lynis/controls/SSH-7408/ +``` + +要解决这个问题,你需要知道 SSH 配置文件的位置。一个经验丰富的 Linux 管理员可能已经知道在哪里找到它们,但如果你不知道,有一个方法可以看到 Lynis 在哪里找到它们。 + +#### 定位 Lynis 测试脚本 + +Lynis 支持多种操作系统,因此你的安装位置可能有所不同。在 Red Hat Enterprise Linux 或 Fedora Linux 系统中,使用 `rpm` 命令来查找测试文件: + +``` +# rpm -ql lynis +``` + +这将列出所有测试文件,并报告它们在 `lynis/include` 目录下的位置。在这个目录下搜索你想知道的 TEST-ID(本例中为 SSH-7408): + +``` +# grep SSH-7408 /usr/share/lynis/include/* +/usr/share/lynis/include/tests_ssh:    # Test        : SSH-7408 +``` + +#### 查找 SSH 问题 + +名为 `tests_ssh` 的文件中包含了 TEST-ID,在这里可以找到与 SSH 相关的扫描函数。看看这个文件,就可以看到 Lynis 扫描器调用的各种函数。第一部分在一个名为 `SSH_DAEMON_CONFIG_LOCS` 的变量中定义了一个目录列表。下面几节负责检查 SSH 守护进程的状态、定位它的配置文件,并识别它的版本。我在 SSH-7404 测试中找到了查找配置文件的代码,描述为 “确定 SSH 守护进程配置文件位置”。这段代码包含一个 `for` 循环,在列表中的项目中搜索一个名为 `sshd_config` 的文件。我可以用这个逻辑来自己进行搜索: + +``` +# find /etc /etc/ssh /usr/local/etc/ssh /opt/csw/etc/ssh -name sshd_config +/etc/ssh/sshd_config +/etc/ssh/sshd_config +find: ‘/usr/local/etc/ssh’: No such file or directory +find: ‘/opt/csw/etc/ssh’: No such file or directory +``` + +进一步探索这个文件,就会看到寻找 SSH-7408 的相关代码。这个测试涵盖了 `MaxAuthTries` 和其他一些设置。现在我可以在 SSH 配置文件中找到该变量: + +``` +# grep MaxAuthTries /etc/ssh/sshd_config +#MaxAuthTries 6 +``` + +#### 修复法律横幅问题 + +Lynis 还报告了一个与登录系统时显示的法律横幅有关的发现。在我的家庭桌面系统上(我并不希望有很多其他人登录),我没有去改变默认的 `issue` 文件。企业或政府的系统很可能被要求包含一个法律横幅,以警告用户他们的登录和活动可能被记录和监控。Lynis 用 BANN-7126 测试和 BANN-7130 测试报告了这一点: + +``` +* Add a legal banner to /etc/issue, to warn unauthorized users [BANN-7126] + https://cisofy.com/lynis/controls/BANN-7126/ + +* Add legal banner to /etc/issue.net, to warn unauthorized users [BANN-7130] + https://cisofy.com/lynis/controls/BANN-7130/ +``` + +我在运行 Fedora 32 工作站的系统上没有发现什么: + +``` +# cat /etc/issue /etc/issue.net +\S +Kernel \r on an \m (\l) + +\S +Kernel \r on an \m (\l) +``` + +我可以添加一些诸如 “keep out” 或 “don't break anything” 之类的内容,但测试的描述并没有提供足够的信息来解决这个问题,所以我又看了看 Lynis 的脚本。我注意到 `include` 目录下有一个叫 `tests_banners` 的文件;这似乎是一个很好的地方。在 `grep` 的帮助下,我看到了相关的测试: + +``` +# grep -E 'BANN-7126|BANN-7130' /usr/share/lynis/include/tests_banners +    # Test        : BANN-7126 +    Register --test-no BANN-7126 --preqs-met ${PREQS_MET} --weight L --network NO --category security --description "Check issue banner file contents" +    # Test        : BANN-7130 +    Register --test-no BANN-7130 --preqs-met ${PREQS_MET} --weight L --network NO --category security --description "Check issue.net banner file contents" +``` + +在检查了测试文件中的相关代码后,我发现这两个测试都是通过一个 `for` 循环来迭代一些预定义的法律术语: + +``` +for ITEM in ${LEGAL_BANNER_STRINGS}; do +``` + +这些法律术语存储在文件顶部定义的变量 `LEGAL_BANNER_STRINGS` 中。向后滚动到顶部可以看到完整的清单: + +``` +LEGAL_BANNER_STRINGS="audit access authori condition connect consent continu criminal enforce evidence forbidden intrusion law legal legislat log monitor owner penal policy policies privacy private prohibited record restricted secure subject system terms warning" +``` + +我最初的建议(“keep out” 或 “don't break anything”)不会满足这个测试,因为它们不包含这个列表中的任何单词。 + +下面这条横幅信息包含了几个必要的词,因此,它将满足这个测试,并防止 Lynis 报告它: + +> Attention, by continuing to connect to this system, you consent to the owner storing a log of all activity. Unauthorized access is prohibited. + +请注意,这条信息必须被添加到 `/etc/issue` 和 `/etc/issue.net` 中。 + +### 使其可重复 + +你可以手动进行这些编辑,但你可能要考虑自动化。例如,可能有许多设置需要更改,或者你可能需要在许多服务器上定期进行这些编辑。创建一个加固脚本将是简化这个过程的好方法。对于 SSH 配置,在你的加固脚本中的一些 `sed` 命令可以解决这些发现。或者,你可以使用 `echo` 语句来添加合法的横幅。 + +``` +sed -i '/MaxAuthTries/s/#MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config + +echo "Legal Banner" | tee -a /etc/issue /etc/issue.net +``` + +自动化使你能够创建一个可重复的脚本,可以在你的基础设施中保存和管理。你也可以在你的初始服务器配置中加入这个脚本。 + +### 加固你的系统 + +这种类型的练习可以提高你的脚本技能,既可以跟着现有的代码走,也可以写自己的脚本。因为 Lynis 是开源的,所以你可以很容易地看到你的系统是如何被检查的,以及它的报告意味着什么。最终的结果将是一个完善的系统,你可以在审计人员来的时候随时向他们炫耀。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/linux-lynis-security + +作者:[Alan Formy-Duval][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/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-password.jpg?itok=KJMdkKum (Lock) +[2]: https://linux.cn/article-12696-1.html +[3]: https://github.com/CISOfy/lynis diff --git a/published/202010/20200811 TCP window scaling, timestamps and SACK.md b/published/202010/20200811 TCP window scaling, timestamps and SACK.md new file mode 100644 index 0000000000..cd47284eb7 --- /dev/null +++ b/published/202010/20200811 TCP window scaling, timestamps and SACK.md @@ -0,0 +1,304 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12710-1.html) +[#]: subject: (TCP window scaling, timestamps and SACK) +[#]: via: (https://fedoramagazine.org/tcp-window-scaling-timestamps-and-sack/) +[#]: author: (Florian Westphal https://fedoramagazine.org/author/strlen/) + +TCP 窗口缩放、时间戳和 SACK +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/12/114050up4695djpw6n4tu9.jpg) + +Linux TCP 协议栈具有无数个可以更改其行为的 `sysctl` 旋钮。 这包括可用于接收或发送操作的内存量、套接字的最大数量、可选的特性和协议扩展。 + +有很多文章出于各种“性能调优”或“安全性”原因,建议禁用 TCP 扩展,比如时间戳或选择性确认Selective ACKnowledgments(SACK)。 + +本文提供了这些扩展功能的背景,为什么会默认启用,它们之间是如何关联的,以及为什么通常情况下将它们关闭是个坏主意。 + +### TCP 窗口缩放 + +TCP 可以承受的数据传输速率受到几个因素的限制。其中包括: + +* 往返时间Round trip time(RTT)。 + + 这是数据包到达目的地并返回回复所花费的时间。越低越好。 +* 所涉及的网络路径的最低链路速度。 +* 丢包频率。 +* 新数据可用于传输的速度。 + + 例如,CPU 需要能够以足够快的速度将数据传递到网络适配器。如果 CPU 需要首先加密数据,则适配器可能必须等待新数据。同样地,如果磁盘存储不能足够快地读取数据,则磁盘存储可能会成为瓶颈。 +* TCP 接收窗口的最大可能大小。 + + 接收窗口决定了 TCP 在必须等待接收方报告接收到该数据之前可以传输多少数据(以字节为单位)。这是由接收方宣布的。接收方将在读取并确认接收到传入数据时不断更新此值。接收窗口的当前值包含在 [TCP 报头][2] 中,它是 TCP 发送的每个数据段的一部分。因此,只要发送方接收到来自对等方的确认,它就知道当前的接收窗口。这意味着往返时间(RTT)越长,发送方获得接收窗口更新所需的时间就越长。 + +TCP 的未确认(正在传输)数据被限制为最多 64KB。在大多数网络场景中,这甚至还不足以维持一个像样的数据速率。让我们看看一些例子。 + +**理论数据速率** + +在往返时间(RTT)为 100 毫秒的情况下,TCP 每秒最多可以传输 640KB。在延迟为 1 秒的情况下,最大理论数据速率降至只有 64KB/s。 + +这是因为接收窗口的原因。一旦发送了 64KB 的数据,接收窗口就已经满了。发送方必须等待,直到对等方通知它应用程序已经读取了至少一部分数据。 + +发送的第一个段会把 TCP 窗口缩减去该段的大小。在接收窗口值的更新信息可用之前,需要往返一次。当更新以 1 秒的延迟到达时,即使链路有足够的可用带宽,也会导致 64KB 的限制。 + +为了充分利用一个具有几毫秒延迟的快速网络,必须有一个比传统 TCP 支持的窗口更大的窗口。“64KB 限制”是协议规范的产物:TCP 头只为接收窗口大小保留了 16 个位。这允许接收窗口最大为 64KB。在 TCP 协议最初设计时,这个大小并没有被视为一个限制。 + +不幸的是,想通过仅仅更改 TCP 头来支持更大的最大窗口值是不可能的。如果这样做就意味着 TCP 的所有实现都必须同时更新,否则它们将无法相互理解。为了解决这个问题,我们改变了对接收窗口值的解释。 + +“窗口缩放选项”允许你改变这个解释,同时保持与现有实现的兼容性。 + +#### TCP 选项:向后兼容的协议扩展 + +TCP 支持可选扩展。这允许使用新特性增强协议,而无需立即更新所有实现。当 TCP 发起方连接到对等方时,它还会发送一个支持的扩展列表。所有扩展都遵循相同的格式:一个唯一的选项号,后跟选项的长度以及选项数据本身。 + +TCP 响应方检查连接请求中包含的所有选项号。如果它遇到一个不能理解的选项号,则会跳过 +该选项号附带的“长度”字节的数据,并检查下一个选项号。响应方忽略了从答复中无法理解的内容。这使发送方和接收方都够理解所支持的公共选项集。 + +使用窗口缩放时,选项数据总是由单个数字组成。 + +### 窗口缩放选项 + +``` +Window Scale option (WSopt): Kind: 3, Length: 3 +    +---------+---------+---------+ +    | Kind=3  |Length=3 |shift.cnt| +    +---------+---------+---------+ +         1         1         1 +``` + +[窗口缩放][3] 选项告诉对等方,应该使用给定的数字缩放 TCP 标头中的接收窗口值,以获取实际大小。 + +例如,一个宣告窗口缩放因子为 7 的 TCP 发起方试图指示响应方,任何将来携带接收窗口值为 512 的数据包实际上都会宣告 65536 字节的窗口。增加了 128 倍(2^7)。这将允许最大为 8MB 的 TCP 窗口。 + +不能理解此选项的 TCP 响应方将会忽略它,为响应连接请求而发送的 TCP 数据包(SYN-ACK)不会包含该窗口缩放选项。在这种情况下,双方只能使用 64k 的窗口大小。幸运的是,默认情况下,几乎每个 TCP 栈都支持并默认启用了此选项,包括 Linux。 + +响应方包括了它自己所需的缩放因子。两个对等方可以使用不同的因子。宣布缩放因子为 0 也是合法的。这意味着对等方应该如实处理它接收到的接收窗口值,但它允许应答方向上的缩放值,然后接收方可以使用更大的接收窗口。 + +与 SACK 或 TCP 时间戳不同,窗口缩放选项仅出现在 TCP 连接的前两个数据包中,之后无法更改。也不可能通过查看不包含初始连接三次握手的连接的数据包捕获来确定缩放因子。 + +支持的最大缩放因子为 14。这将允许 TCP 窗口的大小高达 1GB。 + +**窗口缩放的缺点** + +在非常特殊的情况下,它可能导致数据损坏。但在你禁用该选项之前,要知道通常情况下是不可能损坏的。还有一种解决方案可以防止这种情况。不幸的是,有些人在没有意识到它与窗口缩放的关系的情况下禁用了该解决方案。首先,让我们看一下需要解决的实际问题。想象以下事件序列: + + 1. 发送方发送段:s_1、s_2、s_3、... s_n。 + 2. 接收方看到:s_1、s_3、... s_n,并发送对 s_1 的确认。 + 3. 发送方认为 s_2 丢失,然后再次发送。它还发送了段 s_n+1 中包含的新数据。 + 4. 接收方然后看到:s_2、s_n+1,s_2:数据包 s_2 被接收两次。 + +当发送方过早触发重新传输时,可能会发生这种情况。在正常情况下,即使使用窗口缩放,这种错误的重传也绝不会成为问题。接收方将只丢弃重复项。 + +#### 从旧数据到新数据 + +TCP 序列号最多可以为 4GB。如果它变得大于此值,则该序列会回绕到 0,然后再次增加。这本身不是问题,但是如果这种问题发生得足够快,则上述情况可能会造成歧义。 + +如果在正确的时刻发生回绕,则序列号 s_2(重新发送的数据包)可能已经大于 s_n+1。因此,在最后的步骤(4)中,接收方可以将其解释为:s_2、s_n+1、s_n+m,即它可以将 “旧” 数据包 s_2 视为包含新数据。 + +通常,这不会发生,因为即使在高带宽链接上,“回绕”也只会每隔几秒钟或几分钟发生一次。原始数据包和不需要的重传的数据包之间的间隔将小得多。 + +例如,对于 50MB/s 的传输速度,重复项要迟到一分钟以上才会成为问题。序列号的回绕速度没有快到让小的延迟会导致这个问题。 + +一旦 TCP 达到 “GB/s” 的吞吐率,序列号的回绕速度就会非常快,以至于即使只有几毫秒的延迟也可能会造成 TCP 无法检测出的重复项。通过解决接收窗口太小的问题,TCP 现在可以用于以前无法实现的网络速度,这会产生一个新的,尽管很少见的问题。为了在 RTT 非常低的环境中安全使用 GB/s 的速度,接收方必须能够检测到这些旧的重复项,而不必仅依赖序列号。 + +### TCP 时间戳 + +#### 最佳截止日期 + +用最简单的术语来说,[TCP 时间戳][3]只是在数据包上添加时间戳,以解决由非常快速的序列号回绕引起的歧义。如果一个段看起来包含新数据,但其时间戳早于上一个在接收窗口内的数据包,则该序列号已被重新回绕,而“新”数据包实际上是一个较旧的重复项。这解决了即使在极端情况下重传的歧义。 + +但是,该扩展不仅仅是检测旧数据包。TCP 时间戳的另一个主要功能是更精确的往返时间测量(RTTm)。 + +#### 需要准确的 RTT 估算 + +当两个对等方都支持时间戳时,每个 TCP 段都携带两个附加数字:时间戳值和回显时间戳。 + +``` +TCP Timestamp option (TSopt): Kind: 8, Length: 10 ++-------+----+----------------+-----------------+ +|Kind=8 | 10 |TS Value (TSval)|EchoReply (TSecr)| ++-------+----+----------------+-----------------+ +    1      1         4                4 +``` + +准确的 RTT 估算对于 TCP 性能至关重要。TCP 会自动重新发送未确认的数据。重传由计时器触发:如果超时,则 TCP 会将尚未收到确认的一个或多个数据包视为丢失。然后再发送一次。 + +但是,“尚未得到确认” 并不意味着该段已丢失。也有可能是接收方到目前为止没有发送确认,或者确认仍在传输中。这就造成了一个两难的困境:TCP 必须等待足够长的时间,才能让这种轻微的延迟变得无关紧要,但它也不能等待太久。 + +**低网络延迟 VS 高网络延迟** + +在延迟较高的网络中,如果计时器触发过快,TCP 经常会将时间和带宽浪费在不必要的重发上。 + +然而,在延迟较低的网络中,等待太长时间会导致真正发生数据包丢失时吞吐量降低。因此,在低延迟网络中,计时器应该比高延迟网络中更早到期。所以,TCP 重传超时不能使用固定常量值作为超时。它需要根据其在网络中所经历的延迟来调整该值。 + +**往返时间的测量** + +TCP 选择基于预期的往返时间(RTT)的重传超时。RTT 事先是未知的。它是通过测量发送的段与 TCP 接收到该段所承载数据的确认之间的增量来估算的。 + +由于多种因素使其而变得复杂。 + + * 出于性能原因,TCP 不会为收到的每个数据包生成新的确认。它等待的时间非常短:如果有更多的数据段到达,则可以通过单个 ACK 数据包确认其接收。这称为“累积确认”cumulative ACK。 + * 往返时间并不恒定。这是有多种因素造成的。例如,客户端可能是一部移动电话,随其移动而切换到不同的基站。也可能是当链路或 CPU 的利用率提高时,数据包交换花费了更长的时间。 + * 必须重新发送的数据包在计算过程中必须被忽略。这是因为发送方无法判断重传数据段的 ACK 是在确认原来的传输数据(毕竟已到达)还是在确认重传数据。 + +最后一点很重要:当 TCP 忙于从丢失中恢复时,它可能仅接收到重传段的 ACK。这样,它就无法在此恢复阶段测量(更新)RTT。所以,它无法调整重传超时,然后超时将以指数级增长。那是一种非常具体的情况(它假设其他机制,如快速重传或 SACK 不起作用)。但是,使用 TCP 时间戳,即使在这种情况下也会进行 RTT 评估。 + +如果使用了扩展,则对等方将从 TCP 段的扩展空间中读取时间戳值并将其存储在本地。然后,它将该值作为 “回显时间戳” 放入发回的所有数据段中。 + +因此,该选项带有两个时间戳:它的发送方自己的时间戳和它从对等方收到的最新时间戳。原始发送方使用 “回显时间戳” 来计算 RTT。它是当前时间戳时钟与 “回显时间戳” 中所反映的值之间的增量。 + +**时间戳的其他用途** + +TCP 时间戳甚至还有除 PAWS(防止序列号回绕Protection Against Wrapped Sequences) 和 RTT 测量以外的其他用途。例如,可以检测是否不需要重发。如果该确认携带较旧的回显时间戳,则该确认针对的是初始数据包,而不是重新发送的数据包。 + +TCP 时间戳的另一个更晦涩的用例与 TCP [syn cookie][4] 功能有关。 + +**在服务器端建立 TCP 连接** + +当连接请求到达的速度快于服务器应用程序可以接受新的传入连接的速度时,连接积压最终将达到其极限。这可能是由于系统配置错误或应用程序中的错误引起的。当一个或多个客户端发送连接请求而不对 “SYN ACK” 响应做出反应时,也会发生这种情况。这将用不完整的连接填充连接队列。这些条目需要几秒钟才会超时。这被称为“同步泛洪攻击”syn flood attack。 + +**TCP 时间戳和 TCP Syn Cookie** + +即使队列已满,某些 TCP 协议栈也允许继续接受新连接。发生这种情况时,Linux 内核将在系统日志中打印一条突出的消息: + +> 端口 P 上可能发生 SYN 泛洪。正在发送 Cookie。检查 SNMP 计数器。 + +此机制将完全绕过连接队列。通常存储在连接队列中的信息被编码到 SYN/ACK 响应 TCP 序列号中。当 ACK 返回时,可以根据序列号重建队列条目。 + +序列号只有有限的空间来存储信息。因此,使用 “TCP Syn Cookie” 机制建立的连接不能支持 TCP 选项。 + +但是,对两个对等点都通用的 TCP 选项可以存储在时间戳中。ACK 数据包在回显时间戳字段中反映了该值,这也允许恢复已达成共识的 TCP 选项。否则,cookie 连接受标准的 64KB 接收窗口限制。 + +**常见误区 —— 时间戳不利于性能** + +不幸的是,一些指南建议禁用 TCP 时间戳,以减少内核访问时间戳时钟来获取当前时间所需的次数。这是不正确的。如前所述,RTT 估算是 TCP 的必要部分。因此,内核在接收/发送数据包时总是采用微秒级的时间戳。 + +在包处理步骤的其余部分中,Linux 会重用 RTT 估算所需的时钟时间戳。这还避免了将时间戳添加到传出 TCP 数据包的额外时钟访问。 + +整个时间戳选项在每个数据包中仅需要 10 个字节的 TCP 选项空间,这不会显著减少可用于数据包有效负载的空间。 + +**常见误区 —— 时间戳是个安全问题** + +一些安全审计工具和(较旧的)博客文章建议禁用 TCP 时间戳,因为据称它们泄露了系统正常运行时间:这样一来,便可以估算系统/内核的补丁级别。这在过去是正确的:时间戳时钟基于不断增加的值,该值在每次系统引导时都以固定值开始。时间戳值可以估计机器已经运行了多长时间(正常运行时间 `uptime`)。 + +从 Linux 4.12 开始,TCP 时间戳不再显示正常运行时间。发送的所有时间戳值都使用对等设备特定的偏移量。时间戳值也每 49 天回绕一次。 + +换句话说,从地址 “A” 出发,或者终到地址 “A” 的连接看到的时间戳与到远程地址 “B” 的连接看到的时间戳不同。 + +运行 `sysctl net.ipv4.tcp_timeamp=2` 以禁用随机化偏移。这使得分析由诸如 `wireshark` 或 `tcpdump` 之类的工具记录的数据包跟踪变得更容易 —— 从主机发送的数据包在其 TCP 选项时间戳中都具有相同的时钟基准。因此,对于正常操作,默认设置应保持不变。 + +### 选择性确认 + +如果同一数据窗口中的多个数据包丢失了,TCP 将会出现问题。这是因为 TCP 确认是累积的,但仅适用于按顺序到达的数据包。例如: + + * 发送方发送段 s_1、s_2、s_3、... s_n + * 发送方收到 s_2 的 ACK + * 这意味着 s_1 和 s_2 都已收到,并且发送方不再需要保留这些段。 + * s_3 是否应该重新发送? s_4 呢? s_n? + +发送方等待 “重传超时” 或 “重复 ACK” 以使 s_2 到达。如果发生重传超时或到达了 s_2 的多个重复 ACK,则发送方再次发送 s_3。 + +如果发送方收到对 s_n 的确认,则 s_3 是唯一丢失的数据包。这是理想的情况。仅发送单个丢失的数据包。 + +如果发送方收到的确认段小于 s_n,例如 s_4,则意味着丢失了多个数据包。发送方也需要重传下一个数据段。 + +**重传策略** + +可能只是重复相同的序列:重新发送下一个数据包,直到接收方指示它已处理了直至 s_n 的所有数据包为止。这种方法的问题在于,它需要一个 RTT,直到发送方知道接下来必须重新发送的数据包为止。尽管这种策略可以避免不必要的重传,但要等到 TCP 重新发送整个数据窗口后,它可能要花几秒钟甚至更长的时间。 + +另一种方法是一次重新发送几个数据包。当丢失了几个数据包时,此方法可使 TCP 恢复更快。在上面的示例中,TCP 重新发送了 s_3、s_4、s_5、...,但是只能确保已丢失 s_3。 + +从延迟的角度来看,这两种策略都不是最佳的。如果只有一个数据包需要重新发送,第一种策略是快速的,但是当多个数据包丢失时,它花费的时间太长。 + +即使必须重新发送多个数据包,第二个也是快速的,但是以浪费带宽为代价。此外,这样的 TCP 发送方在进行不必要的重传时可能已经发送了新数据。 + +通过可用信息,TCP 无法知道丢失了哪些数据包。这就是 TCP [选择性确认][5](SACK)的用武之地了。就像窗口缩放和时间戳一样,它是另一个可选的但非常有用的 TCP 特性。 + +**SACK 选项** + +``` +   TCP Sack-Permitted Option: Kind: 4, Length 2 +   +---------+---------+ +   | Kind=4  | Length=2| +   +---------+---------+ +``` + +支持此扩展的发送方在连接请求中包括 “允许 SACK” 选项。如果两个端点都支持该扩展,则检测到数据流中丢失数据包的对等方可以将此信息通知发送方。 + +``` +   TCP SACK Option: Kind: 5, Length: Variable +                     +--------+--------+ +                     | Kind=5 | Length | +   +--------+--------+--------+--------+ +   |      Left Edge of 1st Block       | +   +--------+--------+--------+--------+ +   |      Right Edge of 1st Block      | +   +--------+--------+--------+--------+ +   |                                   | +   /            . . .                  / +   |                                   | +   +--------+--------+--------+--------+ +   |      Left Edge of nth Block       | +   +--------+--------+--------+--------+ +   |      Right Edge of nth Block      | +   +--------+--------+--------+--------+ +``` + +接收方遇到 s_2 后跟 s_5 ... s_n,则在发送对 s_2 的确认时将包括一个 SACK 块: + +``` + +                +--------+-------+ +                | Kind=5 |   10  | ++--------+------+--------+-------+ +| Left edge: s_5                 | ++--------+--------+-------+------+ +| Right edge: s_n                | ++--------+-------+-------+-------+ +``` + +这告诉发送方到 s_2 的段都是按顺序到达的,但也让发送方知道段 s_5 至 s_n 也已收到。然后,发送方可以重新发送那两个数据包(s_3、s_4),并继续发送新数据。 + +**神话般的无损网络** + +从理论上讲,如果连接不会丢包,那么 SACK 就没有任何优势。或者连接具有如此低的延迟,甚至等待一个完整的 RTT 都无关紧要。 + +在实践中,无损行为几乎是不可能保证的。即使网络及其所有交换机和路由器具有足够的带宽和缓冲区空间,数据包仍然可能丢失: + + * 主机操作系统可能面临内存压力并丢弃数据包。请记住,一台主机可能同时处理数万个数据包流。 + * CPU 可能无法足够快地消耗掉来自网络接口的传入数据包。这会导致网络适配器本身中的数据包丢失。 + * 如果 TCP 时间戳不可用,即使一个非常小的 RTT 的连接也可能在丢失恢复期间暂时停止。 + +使用 SACK 不会增加 TCP 数据包的大小,除非连接遇到数据包丢失。因此,几乎没有理由禁用此功能。几乎所有的 TCP 协议栈都支持 SACK —— 它通常只在不进行 TCP 批量数据传输的低功耗 IOT 类的设备上才不存在。 + +当 Linux 系统接受来自此类设备的连接时,TCP 会自动为受影响的连接禁用 SACK。 + +### 总结 + +本文中研究的三个 TCP 扩展都与 TCP 性能有关,最好都保留其默认设置:启用。 + +TCP 握手可确保仅使用双方都可以理解的扩展,因此,永远不需因为对等方可能不支持而全局禁用该扩展。 + +关闭这些扩展会导致严重的性能损失,尤其是 TCP 窗口缩放和 SACK。可以禁用 TCP 时间戳而不会立即造成不利影响,但是现在没有令人信服的理由这样做了。启用它们还可以支持 TCP 选项,即使在 SYN cookie 生效时也是如此。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/tcp-window-scaling-timestamps-and-sack/ + +作者:[Florian Westphal][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/strlen/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/08/tcp-window-scaling-816x346.png +[2]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure +[3]: https://www.rfc-editor.org/info/rfc7323 +[4]: https://en.wikipedia.org/wiki/SYN_cookies +[5]: https://www.rfc-editor.org/info/rfc2018 diff --git a/published/202010/20200820 Learn the basics of programming with C.md b/published/202010/20200820 Learn the basics of programming with C.md new file mode 100644 index 0000000000..8e54cdc13d --- /dev/null +++ b/published/202010/20200820 Learn the basics of programming with C.md @@ -0,0 +1,266 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12732-1.html) +[#]: subject: (Learn the basics of programming with C) +[#]: via: (https://opensource.com/article/20/8/c-programming-cheat-sheet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +C 语言简单编程速成 +====== + +> 我们将所有的 C 语言要素放置到一份易读的备忘录上。 + +![](https://img.linux.net.cn/data/attachment/album/202010/18/213610t3do3u7oev2udoyn.png) + +1972 年,丹尼斯·里奇Dennis Ritchie任职于贝尔实验室Bell Labs,在几年前,他和他的团队成员发明了 Unix 。在创建了一个经久不衰的操作系统(至今仍在使用)之后,他需要一种好的方法来对这些 Unix 计算机编程,以便它们可用执行新的任务。在现在看来,这很奇怪,但在当时,编程语言相对较少,Fortran、Lisp、[Algol][2] 以及 B 语言都很流行,但是,对于贝尔实验室的研究员们想要做的事情来说,它们还是远远不够的。丹尼斯·里奇表现出一种后来被称为程序员的主要特征的特质:创造了他自己的解决方案。他称之为 C 语言,并且在近 50 年后,它仍在广泛的使用。 + +### 为什么你应该学习 C 语言 + +今天,有很多语言为程序员提供了比 C 语言更多的特性。最明显的是 C++ 语言,这是一种以相当露骨的方式命名的语言,它构建在 C 语言之上,创建了一种很好的面向对象语言。不过,许多其它语言的存在是有充分理由的。计算机擅长一致的重复,因此任何可预见的东西都可以构建在编程语言中,对程序员来说这意味着更少的工作量。为什么在 C++ 语言中用一行语句就可以将一个 `int` 转换为一个 `long` 时(`long x = long(n);`),还要在 C 语言用两行语句呢? + +然而,C 语言在今天仍然有用。 + +首先,C 语言是一种相当简约和直接的语言。除了编程的基础知识之外,并没有很高级的概念,这很大程度上是因为 C 语言实际上就是现代编程语言的基础之一。例如,C 语言的特性之一是数组,但是它不提供字典(除非你自己写一个)。当你学习 C 语言时,你会学习编程的基础组成部分,它可以帮助你认识到如今的编程语言的改进及其的精心设计。 + +因为 C 语言是一种最小化的编程语言,你的应用程序很可能会获得性能上的提升,这在其它许多编程语言中是看不到的。当你考虑你的代码可以执行多快的时候,很容易陷入锱铢必较的境地,因此,重要的是要问清楚你是否*需要*为某一特定任务提供更多的速度。与 Python 或 Java 相比,使用 C 语言,你在每行代码中需要纠结的地方更少。C 语言程序运行很快。这是 Linux 内核使用 C 语言编写的一个很好的理由。 + +最后,C 语言很容易入门,特别是,如果你正在运行 Linux,就已经能运行 C 语言代码了,因为 Linux 系统包含 GNU C 库(`glibc`)。为了编写和构建 C 语言程序,你需要做的全部工作就是安装一个编译器,打开一个文本编辑器,开始编码。 + +### 开始学习 C 语言 + +如果你正在运行 Linux ,你可以使用你的软件包管理器安装一个 C 编译器。在 Fedora 或 RHEL 上: + +``` +$ sudo dnf install gcc +``` + +在 Debian 及其衍生系统上: + +``` +$ sudo apt install build-essential +``` + +在 macOS 上,你可以 [安装 Homebrew][3] ,并使用它来安装 [GCC][4]: + +``` +$ brew install gcc +``` + +在 Windows 上, 你可以使用 [MinGW][5] 安装一套最小的包含 GCC 的 GNU 实用程序集。 + +在 Linux 或 macOS 上验证你已经安装的 GCC: + +``` +$ gcc --version +gcc (GCC) x.y.z +Copyright (C) 20XX Free Software Foundation, Inc. +``` + +在 Windows 上,提供 EXE 文件的完整路径: + +``` +PS> C:\MinGW\bin\gcc.exe --version +gcc.exe (MinGW.org GCC Build-2) x.y.z +Copyright (C) 20XX Free Software Foundation, Inc. +``` + +### C 语法 + +C 语言不是一种脚本语言。它是一种编译型语言,这意味着它由 C 编译器处理来产生一个二进制可执行文件。这不同于脚本语言(如 [Bash][6])或混合型语言(如 [Python][7])。 + +在 C 语言中,你可以创建*函数*来执行你希望做到的任务。默认情况下,执行的是一个名为 `main` 的函数。 + +这里是一个使用 C 语言写的简单的 “hello world” 程序: + +``` +#include + +int main() { + printf("Hello world"); + return 0; +} +``` + +第一行包含一个被称为 `stdio.h`(标准输入和输出)的 *头文件*,它基本上是自由使用的、非常初级的 C 语言代码,你可以在你自己的程序中重复使用它。然后创建了一个由一条基本的输出语句构成的名为 `main` 的函数。保存这些文本到一个被称为 `hello.c` 的文件中,然后使用 GCC 编译它: + +``` +$ gcc hello.c --output hello +``` + +尝试运行你的 C 语言程序: + +``` +$ ./hello +Hello world$ +``` + +#### 返回值 + +这是 Unix 哲学的一部分,一个函数在执行后“返回”一些东西:在成功时不返回任何东西,在失败时返回其它的一些东西(例如,一个错误信息)。这些返回的内容通常使用数字(确切地说是整数)表示:`0` 表示没有错误,任何大于 `0` 的数字都表示一些不成功的状态。 + +Unix 和 Linux 被设计成在运行成功时保持沉默是很明智的。这是为了让你在执行一系列命令时,假设没有任何错误或警告会妨碍你的工作,从而可以始终为成功执行做准备。类似地,在 C 语言中的函数在设计上也预期不出现错误。 + +你可以通过一个小的修改,让你的程序看起来是失败的,就可以看到这一点: + +``` +include + +int main() { + printf("Hello world"); + return 1; +} +``` + +编译它: + +``` +$ gcc hello.c --output failer +``` + +现在使用一个内置的 Linux 测试方式来运行它。仅在*成功*时,`&&` 操作符才会执行一个命令的第二部分。例如: + +``` +$ echo "success" && echo "it worked" +success +it worked +``` + +在*失败*时,`||` 测试会执行一个命令的第二部分。 + +``` +$ ls blah || echo "it did not work" +ls: cannot access 'blah': No such file or directory +it did not work +``` + +现在,尝试你的程序,在成功时,它*不*返回 `0`;而是返回 `1`: + +``` +$ ./failer && echo "it worked" +String is: hello +``` + +这个程序成功地执行了,但是没有触发第二个命令。 + +#### 变量和类型 + +在一些语言中,你可以创建变量而不具体指定变量所包含的数据的*类型*。这些语言如此设计使得解释器需要对一个变量运行一些测试来视图发现变量是什么样的数据类型。例如,`var=1` 定义了一个整型数,当你创建一个表达式将 `var` 与某些东西相加时,Python 知道显然它是一个整型数。它同样知道当你连接 `hello` 和 `world` 时,单词 `world` 是一个字符串。 + +C 语言不会为你做任何这些识别和调查;你必须自己定义你的变量类型。这里有几种变量类型,包括整型(`int`),字符型(`char`),浮点型(`float`),布尔型(`boolean`)。 + +你可能也注意到这里没有字符串类型。与 Python 和 Java 和 Lua 以及其它的编程语言不同,C 语言没有字符串类型,而是将字符串看作一个字符数组。 + +这里是一些简单的代码,它建立了一个 `char` 数组变量,然后使用 [printf][9] 将数组变量和一段简单的信息打印到你的屏幕上: + +``` +#include + +int main() { + char var[6] = "hello"; + printf("Your string is: %s\r\n",var); +} +``` + +你可能会注意到,这个代码示例向一个由五个字母组成的单词提供了六个字符的空间。这是因为在字符串的结尾有处一个隐藏的终止符,它占用了数组中的一个字节。你可以通过编译和执行代码来运行它: + +``` +$ gcc hello.c --output hello +$ ./hello +hello +``` + +### 函数 + +和其它的编程语言一样,C 函数也接受可选的参数。你可以通过定义你希望函数接受的数据类型,来将参数从一个函数传递到另一个函数: + +``` +#include + +int printmsg(char a[]) { + printf("String is: %s\r\n",a); +} + +int main() { + char a[6] = "hello"; + printmsg(a); + return 0; +} +``` + +简单地将一个函数分解为两个函数的这种方法并不是非常有用,但是它演示了默认运行 `main` 函数以及如何在函数之间传递数据。 + +### 条件语句 + +在真实的编程中,你通常希望你的代码根据数据做出判断。这是使用*条件*语句完成的,`if` 语句是其中最基础的一个语句。 + +为了使这个示例程序更具动态性,你可以包含 `string.h` 头文件,顾名思义,它包含用于检查字符串的代码。尝试使用来自 `string.h` 文件中的 `strlen` 函数测试传递给 `printmsg` 函数的字符串是否大于 `0`: + +``` +#include +#include + +int printmsg(char a[]) { + size_t len = strlen(a); + if ( len > 0) { + printf("String is: %s\r\n",a); + } +} + +int main() { + char a[6] = "hello"; + printmsg(a); + return 1; +} +``` + +正如在这个示例中所实现的,该条件永远都不会是非真的,因为所提供的字符串总是 `hello`,它的长度总是大于 `0`。这个不够认真的重新实现的 `echo` 命令的最后一点要做是接受来自用户的输入。 + +### 命令参数 + +`stdio.h` 文件包含的代码在每次程序启动时提供了两个参数: 一个是命令中包含多少项的计数(`argc`),一个是包含每个项的数组(`argv`)。例如, 假设你发出这个虚构的命令: + +``` +$ foo -i bar +``` + +`argc` 是 `3`,`argv` 的内容是: + + * `argv[0] = foo` + * `argv[1] = -i` + * `argv[2] = bar` + +你可以修改示例 C 语言程序来以字符串方式接受 `argv[2]`,而不是默认的 `hello` 吗? + +### 命令式编程语言 + +C 语言是一种命令式编程语言。它不是面向对象的,也没有类结构。使用 C 语言的经验可以教你很多关于如何处理数据,以及如何更好地管理你的代码运行时生成的数据。多使用 C 语言,你最后能够编写出其它语言(例如 Python 和 Lua)可以使用的库。 + +想要了解更多关于 C 的知识,你需要使用它。在 `/usr/include/` 中查找有用的 C 语言头文件,并且看看你可以做什么小任务来使 C 语言对你有用。在学习的过程中,使用来自 FreeDOS 的 [Jim Hall][12] 编写的 [C 语言忘备录][11]。它在一张双面纸忘备录上放置了所有的基本要素,所以在你练习时,可以立即访问 C 语言语法的所有要素。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/c-programming-cheat-sheet + +作者:[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/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image) +[2]: https://opensource.com/article/20/6/algol68 +[3]: https://opensource.com/article/20/6/homebrew-mac +[4]: https://gcc.gnu.org/ +[5]: https://opensource.com/article/20/8/gnu-windows-mingw +[6]: https://opensource.com/resources/what-bash +[7]: https://opensource.com/resources/python +[8]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[9]: https://opensource.com/article/20/8/printf +[10]: http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html +[11]: https://opensource.com/downloads/c-programming-cheat-sheet +[12]: https://opensource.com/users/jim-hall diff --git a/published/202010/20200826 What is IPv6, and why aren-t we there yet.md b/published/202010/20200826 What is IPv6, and why aren-t we there yet.md new file mode 100644 index 0000000000..9eb7aef27a --- /dev/null +++ b/published/202010/20200826 What is IPv6, and why aren-t we there yet.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12688-1.html) +[#]: subject: (What is IPv6, and why aren’t we there yet?) +[#]: via: (https://www.networkworld.com/article/3254575/what-is-ipv6-and-why-aren-t-we-there-yet.html) +[#]: author: (Keith Shaw, Josh Fruhlinger ) + +什么是 IPv6,为什么我们还未普及? +====== + +> 自 1998 年以来,IPv6 一直在努力解决 IPv4 可用 IP 地址的不足的问题,然而尽管 IPv6 在效率和安全方面具有优势,但其采用速度仍然缓慢。 + +![](https://images.idgesg.net/images/article/2017/11/ipv6newip-100740801-large.jpg) + +在大多数情况下,已经没有人一再对互联网地址耗尽的可怕境况发出警告,因为,从互联网协议版本 4(IPv4)的世界到 IPv6 的迁移,虽然缓慢,但已经坚定地开始了,并且相关软件已经到位,以防止许多人预测的地址耗竭。 + +但在我们看到 IPv6 的现状和发展方向之前,让我们先回到互联网寻址的早期。 + +### 什么是 IPv6,为什么它很重要? + +IPv6 是最新版本的互联网协议Internet Protocol(IP),它可以跨互联网识别设备,从而确定它们的位置。每一个使用互联网的设备都要通过自己的 IP 地址来识别,以便可以通过互联网通信。在这方面,它就像你需要知道街道地址和邮政编码一样,以便邮寄信件。 + +之前的版本 IPv4 采用 32 位寻址方案,可以支持 43 亿台设备,本以为已经足够。然而,互联网、个人电脑、智能手机以及现在物联网设备的发展证明,这个世界需要更多的地址。 + +幸运的是,互联网工程任务组Internet Engineering Task Force(IETF)在 20 年前就认识到了这一点。1998 年,它创建了 IPv6,使用 128 位寻址方式来支持大约 340 亿亿亿trillion trillion(或者 2 的 128 次幂,如果你喜欢用这种表示方式的话)。IPv4 的地址可表示为四组一至三位十进制数,IPv6 则使用八组四位十六进制数字,用冒号隔开。 + +### IPv6 的好处是什么? + +IETF 在其工作中为 IPv6 加入了对 IPv4 增强的功能。IPv6 协议可以更有效地处理数据包,提高性能和增加安全性。它使互联网服务提供商(ISP)能够通过使他们的路由表更有层次性来减少其大小。 + +### 网络地址转换(NAT)和 IPv6 + +IPv6 的采用被推迟,部分原因是网络地址转换network address translation(NAT)导致的,NAT 可以将私有 IP 地址转化为公共 IP 地址。这样一来,拥有私有 IP 地址的企业的机器就可以向位于私有网络之外拥有公共 IP 地址的机器发送和接收数据包。 + +如果没有 NAT,拥有数千台或数万台计算机的大公司如果要与外界通信,就会吞噬大量的公有 IPv4 地址。但是这些 IPv4 地址是有限的,而且接近枯竭,以至于不得不限制分配。 + +NAT 有助于缓解这个问题。有了 NAT,成千上万的私有地址计算机可以通过防火墙或路由器等 NAT 设备呈现在公共互联网上。 + +NAT 的工作方式是,当一台拥有私有 IP 地址的企业计算机向企业网络外的公共 IP 地址发送数据包时,首先会进入 NAT 设备。NAT 在翻译表中记下数据包的源地址和目的地址。NAT 将数据包的源地址改为 NAT 设备面向公众的地址,并将数据包一起发送到外部目的地。当数据包回复时,NAT 将目的地址翻译成发起通信的计算机的私有 IP 地址。这样一来,一个公网 IP 地址可以代表多台私有地址的计算机。 + +### 谁在部署 IPv6? + +运营商网络和互联网服务供应商是最早开始在其网络上部署 IPv6 的群体,其中移动网络处于领先地位。例如,T-Mobile USA 有超过 90% 的流量通过 IPv6,Verizon Wireless 紧随其后,占 82.25%。根据行业组织 [World Ipv6 Launch][3] 的数据,Comcast 和 AT&T 的网络分别为 63% 和 65%。 + +主要网站则排在其后 —— World IPv6 Launch 称,目前 Alexa 前 1000 的网站中只有不到 30% 可以通过 IPv6 到达。 + +企业在部署方面比较落后,根据互联网协会Internet Society的[《2017年 IPv6 部署状况》报告][4],只有不到四分之一的企业宣传其 IPv6 前缀。复杂性、成本和完成迁移所需时间都是他们给出的理由。此外,一些项目由于软件兼容性的问题而被推迟。例如,一份 [2017 年 1 月的报告][5]称,Windows 10 中的一个 bug “破坏了微软在其西雅图总部推出纯 IPv6 网络的努力”。 + +### 何时会有更多部署? + +互联网协会表示,IPv4 地址的价格将在 2018 年达到顶峰,然后在 IPv6 部署通过 50% 大关后,价格会下降。目前,[根据 Google][6],全球的 IPv6 采用率为 20% 到 22%,但在美国约为 32%。 + +随着 IPv4 地址的价格开始下降,互联网协会建议企业出售现有的 IPv4 地址,以帮助资助其 IPv6 的部署。根据[一个发布在 GitHub 上的说明][7],麻省理工学院已经这样做了。这所大学得出的结论是,其有 800 万个 IPv4 地址是“过剩”的,可以在不影响当前或未来需求的情况下出售,因为它还持有 20 个非亿级nonillion IPv6 地址。(非亿级地址是指数字 1 后面跟着 30 个零)。 + +此外,随着部署的增多,更多的公司将开始对 IPv4 地址的使用收费,而免费提供 IPv6 服务。[英国的 ISP Mythic Beasts][8] 表示,“IPv6 连接是标配”,而 “IPv4 连接是可选的额外服务”。 + +### IPv4 何时会被“关闭”? + +在 2011 年至 2018 年期间,世界上大部分地区[“用完”了新的 IPv4 地址][9] —— 但我们不会完全没有 IPv4 地址,因为 IPv4 地址会被出售和重新使用(如前所述),而剩余的地址将用于 IPv6 过渡。 + +目前还没有正式的 IPv4 关闭日期,所以人们不用担心有一天他们的互联网接入会突然消失。随着越来越多的网络过渡,越来越多的内容网站支持 IPv6,以及越来越多的终端用户为 IPv6 功能升级设备,世界将慢慢远离 IPv4。 + +### 为什么没有 IPv5? + +曾经有一个 IPv5,也被称为互联网流协议Internet Stream Protocol,简称 ST。它被设计用于跨 IP 网络的面向连接的通信,目的是支持语音和视频。 + +它在这个任务上是成功的,并被实验性地使用。它的一个缺点是它的 32 位地址方案 —— 与 IPv4 使用的方案相同,从而影响了它的普及。因此,它存在着与 IPv4 相同的问题 —— 可用的 IP 地址数量有限。这导致了发展出了 IPv6 并和最终得到采用。尽管 IPv5 从未被公开采用,但它已经用掉了 IPv5 这个名字。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3254575/what-is-ipv6-and-why-aren-t-we-there-yet.html + +作者:[Keith Shaw][a],[Josh Fruhlinger][c] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Keith-Shaw/ +[c]: https://www.networkworld.com/author/Josh-Fruhlinger/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/article/3235805/lan-wan/ipv6-deployment-guide.html#tk.nww-fsb +[2]: https://www.networkworld.com/article/3214388/lan-wan/how-to-plan-your-migration-to-ipv6.html#tk.nww-fsb +[3]: http://www.worldipv6launch.org/measurements/ +[4]: https://www.internetsociety.org/resources/doc/2017/state-of-ipv6-deployment-2017/ +[5]: https://www.theregister.co.uk/2017/01/19/windows_10_bug_undercuts_ipv6_rollout/https://www.theregister.co.uk/2017/01/19/windows_10_bug_undercuts_ipv6_rollout/ +[6]: https://www.google.com/intl/en/ipv6/statistics.html +[7]: https://gist.github.com/simonster/e22e50cd52b7dffcf5a4db2b8ea4cce0 +[8]: https://www.mythic-beasts.com/sales/ipv6 +[9]: https://ipv4.potaroo.net/ +[10]: https://www.facebook.com/NetworkWorld/ +[11]: https://www.linkedin.com/company/network-world diff --git a/published/202010/20200901 Create a mobile app with Flutter.md b/published/202010/20200901 Create a mobile app with Flutter.md new file mode 100644 index 0000000000..3b525da7c6 --- /dev/null +++ b/published/202010/20200901 Create a mobile app with Flutter.md @@ -0,0 +1,245 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12693-1.html) +[#]: subject: (Create a mobile app with Flutter) +[#]: via: (https://opensource.com/article/20/9/mobile-app-flutter) +[#]: author: (Vitaly Kuprenko https://opensource.com/users/kooper) + +使用 Flutter 创建 App +====== + +> 使用流行的 Flutter 框架开始你的跨平台开发之旅。 + +![](https://img.linux.net.cn/data/attachment/album/202010/07/112953m9g419z1gc2i07z1.jpg) + +[Flutter][2] 是一个深受全球移动开发者欢迎的项目。该框架有一个庞大的、友好的爱好者社区,随着 Flutter 帮助程序员将他们的项目带入移动领域,这个社区还在继续增长。 + +本教程旨在帮助你开始使用 Flutter 进行移动开发。阅读之后,你将了解如何快速安装和设置框架,以便开始为智能手机、平板电脑和其他平台开发。 + +本操作指南假定你已在计算机上安装了 [Android Studio][3],并且具有一定的使用经验。 + +### 什么是 Flutter ? + +Flutter 使得开发人员能够为多个平台构建应用程序,包括: + + * Android + * iOS + * Web(测试版) + * macOS(正在开发中) + * Linux(正在开发中) + +对 macOS 和 Linux 的支持还处于早期开发阶段,而 Web 支持预计很快就会发布。这意味着你可以立即试用其功能(如下所述)。 + +### 安装 Flutter + +我使用的是 Ubuntu 18.04,但其他 Linux 发行版安装过程与之类似,比如 Arch 或 Mint。 + +#### 使用 snapd 安装 + +要使用 [Snapd][4] 在 Ubuntu 或类似发行版上安装 Flutter,请在终端中输入以下内容: + +``` +$ sudo snap install flutter --classic + +$ sudo snap install flutter –classic +flutter 0+git.142868f from flutter Team/ installed +``` + +然后使用 `flutter` 命令启动它。 首次启动时,该框架会下载到你的计算机上: + +``` +$ flutter +Initializing Flutter +Downloading https://storage.googleapis.com/flutter_infra[...] +``` + +下载完成后,你会看到一条消息,告诉你 Flutter 已初始化: + +![Flutter initialized][5] + +#### 手动安装 + +如果你没有安装 Snapd,或者你的发行版不是 Ubuntu,那么安装过程会略有不同。在这种情况下,请[下载][7] 为你的操作系统推荐的 Flutter 版本。 + +![Install Flutter manually][8] + +然后将其解压缩到你的主目录。 + +在你喜欢的文本编辑器中打开主目录中的 `.bashrc` 文件(如果你使用 [Z shell][9],则打开 `.zshc`)。因为它是隐藏文件,所以你必须首先在文件管理器中启用显示隐藏文件,或者使用以下命令从终端打开它: + +``` +$ gedit ~/.bashrc & +``` + +将以下行添加到文件末尾: + +``` +export PATH="$PATH:~/flutter/bin" +``` + +保存并关闭文件。 请记住,如果在你的主目录之外的其他位置解压 Flutter,则 [Flutter SDK 的路径][10] 将有所不同。 + +关闭你的终端,然后再次打开,以便加载新配置。 或者,你可以通过以下命令使配置立即生效: + +``` +$ . ~/.bashrc +``` + +如果你没有看到错误,那说明一切都是正常的。 + +这种安装方法比使用 `snap` 命令稍微困难一些,但是它非常通用,可以让你在几乎所有的发行版上安装该框架。 + +#### 检查安装结果 + +要检查安装结果,请在终端中输入以下内容: + +``` +flutter doctor -v +``` + +你将看到有关已安装组件的信息。 如果看到错误,请不要担心。 你尚未安装任何用于 Flutter SDK 的 IDE 插件。 + +![Checking Flutter installation with the doctor command][11] + +### 安装 IDE 插件 + +你应该在你的 [集成开发环境(IDE)][12] 中安装插件,以帮助它与 Flutter SDK 接口、与设备交互并构建代码。 + +Flutter 开发中常用的三个主要 IDE 工具是 IntelliJ IDEA(社区版)、Android Studio 和 VS Code(或 [VSCodium][13])。我在本教程中使用的是 Android Studio,但步骤与它们在 IntelliJ Idea(社区版)上的工作方式相似,因为它们构建在相同的平台上。 + +首先,启动 Android Studio。打开 “Settings”,进入 “Plugins” 窗格,选择 “Marketplace” 选项卡。在搜索行中输入 “Flutter”,然后单击 “Install”。 + +![Flutter plugins][14] + +你可能会看到一个安装 “Dart” 插件的选项;同意它。如果看不到 Dart 选项,请通过重复上述步骤手动安装它。我还建议使用 “Rainbow Brackets” 插件,它可以让代码导航更简单。 + +就这样!你已经安装了所需的所有插件。你可以在终端中输入一个熟悉的命令进行检查: + +``` +flutter doctor -v +``` + +![Checking Flutter plugins with the doctor command][15] + +### 构建你的 “Hello World” 应用程序 + +要启动新项目,请创建一个 Flutter 项目: + +1、选择 “New -> New Flutter project”。 + +![Creating a new Flutter plugin][16] + +2、在窗口中,选择所需的项目类型。 在这种情况下,你需要选择 “Flutter Application”。 + +3、命名你的项目为 `hello_world`。 请注意,你应该使用合并的名称,因此请使用下划线而不是空格。 你可能还需要指定 SDK 的路径。 + +![Naming a new Flutter plugin][17] + +4、输入软件包名称。 + +你已经创建了一个项目!现在,你可以在设备上或使用模拟器启动它。 + +![Device options in Flutter][18] + +选择你想要的设备,然后按 “Run”。稍后,你将看到结果。 + +![Flutter demo on mobile device][19] + +现在你可以在一个 [中间项目][20] 上开始工作了。 + +### 尝试 Flutter for web + +在安装 Flutter 的 Web 组件之前,你应该知道 Flutter 目前对 Web 应用程序的支持还很原始。 因此,将其用于复杂的项目并不是一个好主意。 + +默认情况下,基本 SDK 中不启用 “Flutter for web”。 要打开它,请转到 beta 通道。 为此,请在终端中输入以下命令: + +``` +flutter channel beta +``` + +![flutter channel beta output][21] + +接下来,使用以下命令根据 beta 分支升级 Flutter: + +``` +flutter upgrade +``` + +![flutter upgrade output][22] + +要使 “Flutter for web” 工作,请输入: + +``` +flutter config --enable-web +``` + +重新启动 IDE;这有助于 Android Studio 索引新的 IDE 并重新加载设备列表。你应该会看到几个新设备: + +![Flutter for web device options][23] + +选择 “Chrome” 会在浏览器中启动一个应用程序, “Web Server” 会提供指向你的 Web 应用程序的链接,你可以在任何浏览器中打开它。 + +不过,现在还不是急于开发的时候,因为你当前的项目不支持 Web。要改进它,请打开项目根目录下的终端,然后输入: + +``` +flutter create +``` + +此命令重新创建项目,并添加 Web 支持。 现有代码不会被删除。 + +请注意,目录树已更改,现在有了一个 `web` 目录: + +![File tree with web directory][24] + +现在你可以开始工作了。 选择 “Chrome”,然后按 “Run”。 稍后,你会看到带有应用程序的浏览器窗口。 + +![Flutter web app demo][25] + +恭喜你! 你刚刚为浏览器启动了一个项目,并且可以像其他任何网站一样继续使用它。 + +所有这些都来自同一代码库,因为 Flutter 使得几乎无需更改就可以为移动平台和 Web 编写代码。 + +### 用 Flutter 做更多的事情 + +Flutter 是用于移动开发的强大工具,而且它也是迈向跨平台开发的重要一步。 了解它,使用它,并将你的应用程序交付到所有平台! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/mobile-app-flutter + +作者:[Vitaly Kuprenko][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/kooper +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/idea_innovation_mobile_phone.png?itok=RqVtvxkd (A person looking at a phone) +[2]: https://flutter.dev/ +[3]: https://developer.android.com/studio +[4]: https://snapcraft.io/docs/getting-started +[5]: https://opensource.com/sites/default/files/uploads/flutter1_initialized.png (Flutter initialized) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://flutter.dev/docs/get-started/install/linux +[8]: https://opensource.com/sites/default/files/uploads/flutter2_manual-install.png (Install Flutter manually) +[9]: https://opensource.com/article/19/9/getting-started-zsh +[10]: https://opensource.com/article/17/6/set-path-linux +[11]: https://opensource.com/sites/default/files/uploads/flutter3_doctor.png (Checking Flutter installation with the doctor command) +[12]: https://www.redhat.com/en/topics/middleware/what-is-ide +[13]: https://opensource.com/article/20/6/open-source-alternatives-vs-code +[14]: https://opensource.com/sites/default/files/uploads/flutter4_plugins.png (Flutter plugins) +[15]: https://opensource.com/sites/default/files/uploads/flutter5_plugincheck.png (Checking Flutter plugins with the doctor command) +[16]: https://opensource.com/sites/default/files/uploads/flutter6_newproject.png (Creating a new Flutter plugin) +[17]: https://opensource.com/sites/default/files/uploads/flutter7_projectname.png (Naming a new Flutter plugin) +[18]: https://opensource.com/sites/default/files/uploads/flutter8_launchflutter.png (Device options in Flutter) +[19]: https://opensource.com/sites/default/files/uploads/flutter9_demo.png (Flutter demo on mobile device) +[20]: https://opensource.com/article/18/6/flutter +[21]: https://opensource.com/sites/default/files/uploads/flutter10_beta.png (flutter channel beta output) +[22]: https://opensource.com/sites/default/files/uploads/flutter11_upgrade.png (flutter upgrade output) +[23]: https://opensource.com/sites/default/files/uploads/flutter12_new-devices.png (Flutter for web device options) +[24]: https://opensource.com/sites/default/files/uploads/flutter13_tree.png (File tree with web directory) +[25]: https://opensource.com/sites/default/files/uploads/flutter14_webapp.png (Flutter web app demo) diff --git a/published/202010/20200903 A practical guide to learning awk.md b/published/202010/20200903 A practical guide to learning awk.md new file mode 100644 index 0000000000..66c613a352 --- /dev/null +++ b/published/202010/20200903 A practical guide to learning awk.md @@ -0,0 +1,142 @@ +[#]: collector: (lujun9972) +[#]: translator: (HankChow) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12686-1.html) +[#]: subject: (A practical guide to learning awk) +[#]: via: (https://opensource.com/article/20/9/awk-ebook) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +awk 实用学习指南 +====== + +> 下载我们的电子书,学习如何更好地使用 `awk`。 + +![](https://img.linux.net.cn/data/attachment/album/202010/05/100648zcubcpww627627nw.jpg) + +在众多 [Linux][2] 命令中,`sed`、`awk` 和 `grep` 恐怕是其中最经典的三个命令了。它们引人注目或许是由于名字发音与众不同,也可能是它们无处不在,甚至是因为它们存在已久,但无论如何,如果要问哪些命令很有 Linux 风格,这三个命令是当之无愧的。其中 `sed` 和 `grep` 已经有很多简洁的标准用法了,但 `awk` 的使用难度却相对突出。 + +在日常使用中,通过 `sed` 实现字符串替换、通过 `grep` 实现过滤,这些都是司空见惯的操作了,但 `awk` 命令相对来说是用得比较少的。在我看来,可能的原因是大多数人都只使用 `sed` 或者 `grep` 的一些变化实现某些功能,例如: + +``` +$ sed -e 's/foo/bar/g' file.txt +$ grep foo file.txt +``` + +因此,尽管你可能会觉得 `sed` 和 `grep` 使用起来更加顺手,但实际上它们还有更多更强大的作用没有发挥出来。当然,我们没有必要在这两个命令上钻研得很深入,但我有时会好奇自己“学习”命令的方式。很多时候我会记住一整串命令“咒语”,而不会去了解其中的运作过程,这就让我产生了一种很熟悉命令的错觉,我可以随口说出某个命令的好几个选项参数,但这些参数具体有什么作用,以及它们的相关语法,我都并不明确。 + +这大概就是很多人对 `awk` 缺乏了解的原因了。 + +### 为使用而学习 awk + +`awk` 并不深奥。它是一种相对基础的编程语言,因此你可以把它当成一门新的编程语言来学习:使用一些基本命令来熟悉语法、了解语言中的关键字并实现更复杂的功能,然后再多加练习就可以了。 + +### awk 是如何解析输入内容的 + +`awk` 的本质是将输入的内容看作是一个数组。当 `awk` 扫描一个文本文件时,会把每一行作为一条记录record,每一条记录中又分割为多个字段field。`awk` 记录了各条记录各个字段的信息,并通过内置变量 `NR`(记录数) 和 `NF`(字段数) 来调用相关信息。例如一下这个命令可以查看文件的行数: + +``` +$ awk 'END { print NR;}' example.txt +36 +``` + +从上面的命令可以看出 `awk` 的基本语法,无论是一个单行命令还是一整个脚本,语法都是这样的: + +``` +模式或关键字 { 操作 } +``` + +在上面的例子中,`END` 是一个关键字而不是模式,与此类似的另一个关键字是 `BEGIN`。使用 `BEGIN` 或 `END` 可以让 `awk` 在解析内容前或解析内容后执行大括号中指定的操作。 + +你可以使用模式pattern作为过滤器或限定符,这样 `awk` 只会对匹配模式的对应记录执行指定的操作。以下这个例子就是使用 `awk` 实现 `grep` 命令在文件中查找“Linux”字符串的功能: + +``` +$ awk '/Linux/ { print $0; }' os.txt +OS: CentOS Linux (10.1.1.8) +OS: CentOS Linux (10.1.1.9) +OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11) +OS: Elementary Linux (10.1.2.4) +OS: Elementary Linux (10.1.2.5) +OS: Elementary Linux (10.1.2.6) +``` + +`awk` 会将文件中的每一行作为一条记录,将一条记录中的每个单词作为一个字段,默认情况下会以空格作为字段分隔符field separator(`FS`)切割出记录中的字段。如果想要使用其它内容作为分隔符,可以使用 `--field-separator` 选项指定分隔符: + +``` +$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt + CentOS Linux (10.1.1.8) + CentOS Linux (10.1.1.9) + Red Hat Enterprise Linux (RHEL) (10.1.1.11) + Elementary Linux (10.1.2.4) + Elementary Linux (10.1.2.5) + Elementary Linux (10.1.2.6) +``` + +在上面的例子中,可以看到在 `awk` 处理后每一行的行首都有一个空格,那是因为在源文件中每个冒号(`:`)后面都带有一个空格。和 `cut` 有所不同的是,`awk` 可以指定一个字符串作为分隔符,就像这样: + +``` +$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt +CentOS Linux (10.1.1.8) +CentOS Linux (10.1.1.9) +Red Hat Enterprise Linux (RHEL) (10.1.1.11) +Elementary Linux (10.1.2.4) +Elementary Linux (10.1.2.5) +Elementary Linux (10.1.2.6) +``` + +### awk 中的函数 + +可以通过这样的语法在 `awk` 中自定义函数: + +``` +函数名称(参数) { 操作 } +``` + +函数的好处在于只需要编写一次就可以多次复用,因此函数在脚本中起到的作用会比在构造单行命令时大。同时 `awk` 自身也带有很多预定义的函数,并且工作原理和其它编程语言或电子表格一样。你只需要了解函数需要接受什么参数,就可以放心使用了。 + +`awk` 中提供了数学运算和字符串处理的相关函数。数学运算函数通常比较简单,传入一个数字,它就会传出一个结果: + +``` +$ awk 'BEGIN { print sqrt(1764); }' +42 +``` + +而字符串处理函数则稍微复杂一点,但 [GNU awk 手册][3]中也有充足的文档。例如 `split()` 函数需要传入一个待分割的单一字段、一个用于存放分割结果的数组,以及用于分割的定界符delimiter。 + +例如前面示例中的输出内容,每条记录的末尾都包含了一个 IP 地址。由于变量 `NF` 代表的是每条记录的字段数量,刚好对应的是每条记录中最后一个字段的序号,因此可以通过引用 `NF` 将每条记录的最后一个字段传入 `split()` 函数: + +``` +$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt +subnet: 1 +subnet: 1 +subnet: 1 +subnet: 2 +subnet: 2 +subnet: 2 +``` + +还有更多的函数,没有理由将自己限制在每个 `awk` 代码块中。你可以在终端中使用 `awk` 构建复杂的管道,也可以编写 `awk` 脚本来定义和使用你自己的函数。 + +### 下载电子书 + +使用 `awk` 本身就是一个学习 `awk` 的过程,即使某些操作使用 `sed`、`grep`、`cut`、`tr` 命令已经完全足够了,也可以尝试使用 `awk` 来实现。只要熟悉了 `awk`,就可以在 Bash 中自定义一些 `awk` 函数,进而解析复杂的数据。 + +[下载我们的这本电子书][4](需注册)学习并开始使用 `awk` 吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/awk-ebook + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[HankChow](https://github.com/hankchow) +校对:[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/computer_code_programming_laptop.jpg?itok=ormv35tV (Person programming on a laptop on a building) +[2]: https://opensource.com/resources/linux +[3]: https://www.gnu.org/software/gawk/manual/gawk.html +[4]: https://opensource.com/downloads/awk-ebook diff --git a/published/202010/20200908 How to install software with Ansible.md b/published/202010/20200908 How to install software with Ansible.md new file mode 100644 index 0000000000..40a7ea77ad --- /dev/null +++ b/published/202010/20200908 How to install software with Ansible.md @@ -0,0 +1,215 @@ +[#]: collector: (lujun9972) +[#]: translator: (MjSeven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12703-1.html) +[#]: subject: (How to install software with Ansible) +[#]: via: (https://opensource.com/article/20/9/install-packages-ansible) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +如何使用 Ansible 安装软件 +====== + +> 使用 Ansible 剧本自动安装和更新设备上的软件。 + +![](https://img.linux.net.cn/data/attachment/album/202010/10/095024hh65atkh6cc8ntn9.jpg) + +Ansible 是系统管理员和开发人员用来保持计算机系统处于最佳状态的一种流行的自动化工具。与可扩展框架一样,[Ansible][2] 本身功能有限,它真正的功能体现在许多模块中。在某种程度上,Ansible 模块就是 [Linux][3] 系统的命令。它们针对特定问题提供解决方案,而维护计算机时的一项常见任务是使所有计算机的更新和一致。 + +我曾经使用软件包的文本列表来保持系统或多或少的同步:我会列出笔记本电脑上安装的软件包,然后将其与台式机或另一台服务器之间进行交叉参考,手动弥补差异。当然,在 Linux 机器上安装和维护应用程序是 Ansible 的一项基本功能,这意味着你可以在自己关心的计算机上列出所需的内容。 + +### 寻找正确的 Ansible 模块 + +Ansible 模块的数量非常庞大,如何找到能完成你任务的模块?在 Linux 中,你可以在应用程序菜单或 `/usr/bin` 中查找要运行的应用程序。使用 Ansible 时,你可以参考 [Ansible 模块索引][4]。 + +这个索引按照类别列出。稍加搜索,你就很可能找到所需的模块。对于包管理,[Packaging 模块][5]几乎适用于所有带包管理器的系统。 + +### 动手写一个 Ansible 剧本 + +首先,选择本地计算机上的包管理器。例如,如果你打算在运行 Fedora 的笔记本电脑上编写 Ansible 指令(在 Ansible 中称为“剧本playbook”),那么从 `dnf` 模块开始。如果你在 Elementary OS 上编写,使用 `apt` 模块,以此类推。这样你就可以开始进行测试和验证,并可以在以后扩展到其它计算机。 + +第一步是创建一个代表你的剧本的目录。这不是绝对必要的,但这是一个好习惯。Ansible 只需要一个配置文件就可以运行在 YAML 中,但是如果你以后想要扩展剧本,你就可以通过改变目录和文件的方式来控制 Ansible。现在,只需创建一个名为 `install_packages` 或类似的目录: + +``` +$ mkdir ~/install_packages +``` + +你可以根据自己的喜好来命名 Ansible 的剧本,但通常将其命名为 `site.yml`: + +``` +$ touch ~/install_packages/site.yml +``` + +在你最喜欢的文本编辑器中打开 `site.yml`,添加以下内容: + +``` +--- +- hosts: localhost + tasks: + - name: install packages + become: true + become_user: root + dnf: + state: present + name: + - tcsh + - htop +``` + +你必须调整使用的模块名称以匹配你使用的发行版。在此示例中,我使用 `dnf` 是因为我在 Fedora Linux 上编写剧本。 + +就像 Linux 终端中的命令一样,知道 **如何** 来调用 Ansible 模块就已经成功了一半。这个示例剧本遵循标准剧本格式: + + * `hosts` 是一台或多台计算机。在本示例中,目标计算机是 `localhost`,即你当前正在使用的计算机(而不是你希望 Ansible 连接的远程系统)。 + * `tasks` 是你要在主机上执行的任务列表。 + * `name` 是任务的人性化名称。在这种情况下,我使用 `install packages`,因为这就是该任务正在做的事情。 + * `become` 允许 Ansible 更改运行此任务的用户。 + * `become_user` 允许 Ansible 成为 `root` 用户来运行此任务。这是必须的,因为只有 root 用户才能使用 `dnf` 安装应用程序。 + * `dnf` 是模块名称,你可以在 Ansible 网站上的模块索引中找到。 + +`dnf` 下的节点是 `dnf` 模块专用的。这是模块文档的关键所在。就像 Linux 命令的手册页一样,模块文档会告诉你可用的选项和所需的参数。 + +![Ansible 文档][6] + +安装软件包是一个相对简单的任务,仅需要两个元素。`state` 选项指示 Ansible 检查系统上是否存在 **软件包**,而 `name` 选项列出要查找的软件包。Ansible 会针对机器的 **状态** 进行调整,因此模块指令始终意味着更改。假如 Ansible 扫描了系统状态,发现剧本里描述的系统(在本例中,`tcsh` 和 `htop` 存在)与实际状态存在冲突,那么 Ansible 的任务是进行必要的更改来使系统与剧本匹配。Ansible 可以通过 `dnf`(或 `apt` 或者其它任何包管理器)模块进行更改。 + +每个模块可能都有一组不同的选项,所以在编写剧本时,要经常参考模块文档。除非你对模块非常熟悉,否则这是期望模块完成工作的唯一合理方法。 + +### 验证 YAML + +剧本是用 YAML 编写的。因为 YAML 遵循严格的语法,所以安装 `yamllint` 来检查剧本是很有帮助的。更妙的是,有一个专门针对 Ansible 的检查工具称为 `ansible-lint`,它专门为剧本而生。在继续之前,安装它。 + +在 Fedora 或 CentOs 上: + +``` +$ sudo dnf ins tall yamllint python3-ansible-lint +``` + +在 Debian、Elementary 或 Ubuntu 上,同样的: + +``` +$ sudo apt install yamllint ansible-lint +``` + +使用 `ansible-link` 来验证你的剧本。如果你无法使用 `ansible-lint`,你可以使用 `yamllint`。 + +``` +$ ansible-lint ~/install_packages/site.yml +``` + +成功则不返回任何内容,但如果文件中有错误,则必须先修复它们,然后再继续。复制和粘贴过程中的常见错误包括在最后一行的末尾省略换行符、使用制表符而不是空格来缩进。在文本编辑器中修复它们,重新运行 `ansible-lint`,重复这个过程,直到 `ansible-lint` 或 `yamllint` 没有返回为止。 + +### 使用 Ansible 安装一个应用 + +现在你有了一个可验证的有效剧本,你终于可以在本地计算机上运行它了,因为你碰巧知道该剧本定义的任务需要 root 权限,所以在调用 Ansible 时必须使用 `--ask-become-pass` 选项,因此系统会提示你输入管理员密码。 + +开始安装: + +``` +$ ansible-playbook --ask-become-pass ~/install_packages/site.yml +BECOME password: +PLAY [localhost] ****************************** + +TASK [Gathering Facts] ****************************** +ok: [localhost] + +TASK [install packages] ****************************** +ok: [localhost] + +PLAY RECAP ****************************** +localhost: ok=0 changed=2 unreachable=0 failed=0 [...] +``` + +这些命令被执行后,目标系统将处于与剧本中描述的相同的状态。 + +### 在远程系统上安装应用程序 + +通过这么多操作来替换一个简单的命令可能会适得其反,但是 Ansible 的优势是它可以在你的所有系统中实现自动化。你可以使用条件语句使 Ansible 在不同的系统上使用特定的模块,但是现在,假定所有计算机都使用相同的包管理器。 + +要连接到远程系统,你必须在 `/etc/ansible/hosts` 文件中定义远程系统,该文件与 Ansible 是一起安装的,所以它已经存在了,但它可能是空的,除了一些解释性注释之外。使用 `sudo` 在你喜欢的文本编辑器中打开它。 + +你可以通过其 IP 地址或主机名(只要主机名可以解析)定义主机。例如,如果你已经在 `/etc/hosts` 中定义了 `liavara` 并可以成功 `ping` 通,那么你可以在 `/etc/ansible/hosts` 中将 `liavara` 设置为主机。或者,如果你正在运行一个域名服务器或 Avahi 服务器并且可以 `ping` 通 `liavara`,那么你就可以在 `/etc/ansible/hosts` 中定义它。否则,你必须使用它的 IP 地址。 + +你还必须成功地建立与目标主机的安全 shell(SSH)连接。最简单的方法是使用 `ssh-copy-id` 命令,但是如果你以前从未与主机建立 SSH 连接,[阅读我关于如何创建自动 SSH 连接的文章][8]。 + +一旦你在 `/etc/ansible/hosts` 文件中输入了主机名或 IP 地址后,你就可以在剧本中更改 `hosts` 定义: + +``` +--- +- hosts: all +  tasks: +    - name: install packages +      become: true +      become_user: root +      dnf: +        state: present +        name: +         - tcsh +         - htop +``` + +再次运行 `ansible-playbook`: + +``` +$ ansible-playbook --ask-become-pass ~/install_packages/site.yml +``` + +这次,剧本会在你的远程系统上运行。 + +如果你添加更多主机,则有许多方法可以过滤哪个主机执行哪个任务。例如,你可以创建主机组(服务器的 `webserves`,台式机的 `workstations`等)。 + +### 适用于混合环境的 Ansible + +到目前为止,我们一直假定 Ansible 配置的所有主机都运行相同的操作系统(都是是使用 `dnf` 命令进行程序包管理的操作系统)。那么,如果你要管理不同发行版的主机,例如 Ubuntu(使用 `apt`)或 Arch(使用 `pacman`),或者其它的操作系统时,该怎么办? + +只要目标操作系统具有程序包管理器([MacOs 有 Homebrew][9],[Windows 有 Chocolatey][10]),Ansible 就能派上用场。 + +这就是 Ansible 优势最明显的地方。在 shell 脚本中,你必须检查目标主机上有哪些可用的包管理器,即使使用纯 Python,也必须检查操作系统。Ansible 不仅内置了这些功能,而且还具有在剧本中使用命令结果的机制。你可以使用 `action` 关键字来执行由 Ansible 事实收集子系统提供的变量定义的任务,而不是使用 `dnf` 模块。 + +``` +--- +- hosts: all +  tasks: +    - name: install packages +      become: true +      become_user: root +      action: > +       {{ ansible_pkg_mgr }} name=htop,transmission state=present update_cache=yes +``` + +`action` 关键字会加载目标插件。在本例中,它使用了 `ansible_pkg_mgr` 变量,该变量由 Ansible 在初始 **收集信息** 期间填充。你不需要告诉 Ansible 收集有关其运行操作系统的事实,所以很容易忽略这一点,但是当你运行一个剧本时,你会在默认输出中看到它: + +``` +TASK [Gathering Facts] ***************************************** +ok: [localhost] +``` + +`action` 插件使用来自这个探针的信息,使用相关的包管理器命令填充 `ansible_pkg_mgr`,以安装在 `name` 参数之后列出的程序包。使用 8 行代码,你可以克服在其它脚本选项中很少允许的复杂跨平台难题。 + +### 使用 Ansible + +现在是 21 世纪,我们都希望我们的计算机设备能够互联并且相对一致。无论你维护的是两台还是 200 台计算机,你都不必一次又一次地执行相同的维护任务。使用 Ansible 来同步生活中的计算机设备,看看 Ansible 还能为你做些什么。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/install-packages-ansible + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[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://opensource.com/resources/what-ansible +[3]: https://opensource.com/resources/linux +[4]: https://docs.ansible.com/ansible/latest/modules/modules_by_category.html +[5]: https://docs.ansible.com/ansible/latest/modules/list_of_packaging_modules.html +[6]: https://opensource.com/sites/default/files/uploads/ansible-module.png (Ansible documentation) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/article/20/8/how-ssh +[9]: https://opensource.com/article/20/6/homebrew-mac +[10]: https://opensource.com/article/20/3/chocolatey diff --git a/published/202010/20200910 Automate your container orchestration with Ansible modules for Kubernetes.md b/published/202010/20200910 Automate your container orchestration with Ansible modules for Kubernetes.md new file mode 100644 index 0000000000..c30f1e28d9 --- /dev/null +++ b/published/202010/20200910 Automate your container orchestration with Ansible modules for Kubernetes.md @@ -0,0 +1,252 @@ +[#]: collector: (lujun9972) +[#]: translator: (HankChow) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12766-1.html) +[#]: subject: (Automate your container orchestration with Ansible modules for Kubernetes) +[#]: via: (https://opensource.com/article/20/9/ansible-modules-kubernetes) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 Ansible 的 Kubernetes 模块实现容器编排自动化 +====== + +> 将 Kubernetes 与 Ansible 结合实现云端自动化。此外,还可以参照我们的 Ansible 的 k8s 模块速查表。 + +![](https://img.linux.net.cn/data/attachment/album/202010/28/211747jhlttlf3f81xrffi.jpg) + +[Ansible][2] 是实现自动化工作的优秀工具,而 [Kubernetes][3] 则是容器编排方面的利器,要是把两者结合起来,会有怎样的效果呢?正如你所猜测的,Ansible + Kubernetes 的确可以实现容器编排自动化。 + +### Ansible 模块 + +实际上,Ansible 本身只是一个用于解释 YAML 文件的框架。它真正强大之处在于它[丰富的模块][4],所谓模块module,就是在 Ansible 剧本playbook 中让你得以通过简单配置就能调用外部应用程序的一些工具。 + +Ansible 中有模块可以直接操作 Kubernetes,也有对一些相关组件(例如 [Docker][5] 和 [Podman][6])实现操作的模块。学习使用一个新模块的过程和学习新的终端命令、API 一样,可以先从文档中了解这个模块在调用的时候需要接受哪些参数,以及这些参数在外部应用程序中产生的具体作用。 + +### 访问 Kubernetes 集群 + +在使用 Ansible Kubernetes 模块之前,先要有能够访问 Kubernetes 集群的权限。在没有权限的情况下,可以尝试使用一个短期在线试用账号,但我们更推荐的是按照 Kubernetes 官网上的指引,或是参考 Braynt Son 《[入门 Kubernetes][8]》的教程安装 [Minikube][7]。Minikube 提供了一个单节点 Kubernetes 实例的安装过程,你可以像使用一个完整集群一样对其进行配置和交互。 + +- 下载 [Ansible k8s 速记表][9](需注册) + +在安装 Minikube 之前,你需要确保你的环境支持虚拟化并安装 `libvirt`,然后对 `libvirt` 用户组授权: + +``` +$ sudo dnf install libvirt +$ sudo systemctl start libvirtd +$ sudo usermod --append --groups libvirt `whoami` +$ newgrp libvirt +``` + +#### 安装 Python 模块 + +为了能够在 Ansible 中使用 Kubernetes 相关的模块,你需要安装以下这些 Python 模块: + +``` +$ pip3.6 install kubernetes --user +$ pip3.6 install openshift --user +``` + +#### 启动 Kubernetes + +如果你使用的是 Minikube 而不是完整的 Kubernetes 集群,请使用 `minikube` 命令在本地创建一个最精简化的 Kubernetes 实例: + +``` +$ minikube start --driver=kvm2 --kvm-network default +``` + +然后等待 Minikube 完成初始化,这个过程所需的时间会因实际情况而异。 + +### 获取集群信息 + +集群启动以后,通过 `cluster-info` 选项就可以获取到集群相关信息了: + +``` +$ kubectl cluster-info +Kubernetes master is running at https://192.168.39.190:8443 +KubeDNS is running at https://192.168.39.190:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + +To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. +``` + +### 使用 k8s 模块 + +Ansible 使用 `k8s` 这个模块来实现对 Kubernetes 的操作,在剧本中使用 `k8s` 模块就可以对 Kuvernetes 对象进行管理。这个模块描述了 `kubectl` 命令的最终状态,例如对于以下这个使用 `kubectl` 创建新的[命名空间][10]的操作: + +``` +$ kubectl create namespace my-namespace +``` + +这是一个很简单的操作,而对这个操作的最终状态用 YAML 文件来描述是这样的: + +``` +- hosts: localhost +  tasks: +    - name: create namespace +      k8s: +        name: my-namespace +        api_version: v1 +        kind: Namespace +        state: present +``` + +如果你使用的是 Minikube,那么主机名(`hosts`)应该定义为 `localhost`。需要注意的是,所使用的模块也定义了可用参数的语法(例如 `api_version` 和 `kind` 参数)。 + +在运行这个剧本之前,先通过 `yamllint` 命令验证是否有错误: + +``` +$ yamllint example.yaml +``` + +确保没有错误之后,运行剧本: + +``` +$ ansible-playbook ./example.yaml +``` + +可以验证新的命名空间是否已经被创建出来: + +``` +$ kubectl get namespaces +NAME              STATUS   AGE +default           Active   37h +kube-node-lease   Active   37h +kube-public       Active   37h +kube-system       Active   37h +demo              Active   11h +my-namespace      Active   3s +``` + +### 使用 Podman 拉取容器镜像 + +容器是个 Linux 系统,几乎是最小化的,可以由 Kubernetes 管理。[LXC 项目][11]和 Docker 定义了大部分的容器规范。最近加入容器工具集的是 Podman,它不需要守护进程就可以运行,为此受到了很多用户的欢迎。 + +通过 Podman 可以从 Docker Hub 或者 Quay.io 等存储库拉取容器镜像。这一操作对应的 Ansible 语法也很简单,只需要将存储库网站提供的镜像路径写在剧本中的相应位置就可以了: + +``` +   - name: pull an image +      podman_image: +        name: quay.io/jitesoft/nginx +``` + +使用 `yamllint` 验证: + +``` +$ yamllint example.yaml +``` + +运行剧本: + +``` +$ ansible-playbook ./example.yaml +[WARNING]: provided hosts list is empty, only localhost is available. +Note that the implicit localhost does not match 'all' + +PLAY [localhost] ************************ + +TASK [Gathering Facts] ************************ +ok: [localhost] + +TASK [create k8s namespace] ************************ +ok: [localhost] + +TASK [pull an image] ************************ +changed: [localhost] + +PLAY RECAP ************************ +localhost: ok=3 changed=1 unreachable=0 failed=0 +           skipped=0 rescued=0 ignored=0 +``` + +### 使用 Ansible 实现部署 + +Ansible 除了可以执行小型维护任务以外,还可以通过剧本实现其它由 `kubectl` 实现的功能,因为两者的 YAML 文件之间只有少量的差异。在 Kubernetes 中使用的 YAML 文件只需要稍加改动,就可以在 Ansible 剧本中使用。例如下面这个用于使用 `kubectl` 命令部署 Web 服务器的 YAML 文件: + +``` +apiVersion: apps/v1 +kind: Deployment +metadata: +  name: my-webserver +spec: +  selector: +    matchLabels: +      run: my-webserver +  replicas: 1 +  template: +    metadata: +      labels: +        run: my-webserver +    spec: +      containers: +      - name: my-webserver +        image: nginx +        ports: +        - containerPort: 80 +``` + +如果你对其中的参数比较熟悉,你只要把 YAML 文件中的大部分内容放到剧本中的 `definition` 部分,就可以在 Ansible 中使用了: + +``` +   - name: deploy a web server +      k8s: +        api_version: v1 +        namespace: my-namespace +        definition: +          kind: Deployment +          metadata: +            labels: +              app: nginx +            name: nginx-deploy +          spec: +            replicas: 1 +            selector: +              matchLabels: +                app: nginx +            template: +              metadata: +                labels: +                  app: nginx +              spec: +                containers: +                  - name: my-webserver +                    image: quay.io/jitesoft/nginx +                    ports: +                      - containerPort: 80 +                        protocol: TCP +``` + +执行完成后,使用 `kubectl` 命令可以看到预期中的的部署deployment: + +``` +$ kubectl -n my-namespace get pods +NAME                      READY  STATUS +nginx-deploy-7fdc9-t9wc2  1/1    Running +``` + +### 在云上使用模块 + +随着现在越来越多的开发和部署工作往云上转移的趋势,我们必须了解如何在云上实现自动化。其中 `k8s` 和 `podman_image` 这两个模块只是云开发中的其中一小部分。你可以在你的工作流程中寻找一些需要自动化的任务,并学习如何使用 Ansible 让你在这些任务上事半功倍。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/ansible-modules-kubernetes + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[HankChow](https://github.com/HankChow) +校对:[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/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek (Ship captain sailing the Kubernetes seas) +[2]: https://opensource.com/resources/what-ansible +[3]: https://opensource.com/resources/what-is-kubernetes +[4]: https://docs.ansible.com/ansible/latest/modules/modules_by_category.html +[5]: https://opensource.com/resources/what-docker +[6]: http://podman.io +[7]: https://kubernetes.io/docs/tasks/tools/install-minikube +[8]: https://opensource.com/article/18/10/getting-started-minikube +[9]: https://opensource.com/downloads/ansible-k8s-cheat-sheet +[10]: https://opensource.com/article/19/10/namespaces-and-containers-linux +[11]: https://www.redhat.com/sysadmin/exploring-containers-lxc diff --git a/published/202010/20200914 NFC vs. Bluetooth LE- When to use which.md b/published/202010/20200914 NFC vs. Bluetooth LE- When to use which.md new file mode 100644 index 0000000000..ddac09e47d --- /dev/null +++ b/published/202010/20200914 NFC vs. Bluetooth LE- When to use which.md @@ -0,0 +1,64 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12735-1.html) +[#]: subject: (NFC vs. Bluetooth LE: When to use which) +[#]: via: (https://www.networkworld.com/article/3574932/nfc-vs-bluetooth-le-when-to-use-which.html) +[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) + +近场通信 vs. 低功耗蓝牙:如何抉择 +====== + +> 近场通信(NFC)和低功耗蓝牙(BLE)是适合企业不同用途的低功耗无线技术。 + +![](https://images.idgesg.net/images/article/2020/08/distributed_network_of_wifi_wi-fi_internet_connections_across_cityscape_by_metamorworks_gettyimages-926502948_2400x1600-100855926-large.jpg) + +在低功率、相对短距离连接的众多选择中,有两种技术脱颖而出——近场通信(NFC)和低功耗蓝牙(BLE)。两者都具有相对低廉的部署成本且易于使用。 + +NFC 作为许多现代智能卡片的背后技术而为大众所熟知。NFC 芯片必须十分接近(在几厘米内)读卡器来实现连接,但这是它主要企业用例(安全性和访问控制)的一个优势。 + +BLE 是主要蓝牙标准的低功耗衍生品,以较低的潜在吞吐量换来了能耗的显著降低,从而能够适应更广泛的潜在用例。 + +接下来,我们将对每种技术及其主要用例进行更深入的描述。 + +### NFC 的未来 + +NFC 在近距离接触范围内工作(设备间必须靠近到几厘米范围内来进行连接),一个可读的无源 NFC “标签”根本不需要任何独立电源,它会从读卡器的信号中汲取能量,工作频率约为 13.5MHz,在主动读取芯片时需要 100-700µA 的电量。 + +“短距离实际上是它的优势。”Gartner 研究高级总监兼分析师说, “NFC 的一大优点是它不仅仅是无线电,还内置了一个庞大的安全协议。”也就是说,潜在的不良行为者必须非常接近——使用专用设备、在几米的范围内——才能检测到正在发生的 NFC 连接。NFC 还可以施行在 SSL 技术上面一层以提高安全性。 + +考虑到 NFC 本就起源于非接触式支付技术,这不足为奇。它在这一领域的根基在于对零售商的吸引力,零售商可以利用 NFC 让客户在购买商品前获取相关的信息、获得优惠券或者向店员寻求帮助,只需将手机接触到 NFC 热点即可。 + +尽管 NFC 只能在一个很近的范围内使用,这限制了使用 NFC 技术用例场景,但它不仅仅是为了开门和买一杯拿铁。NFC 可以用于引导连接,便于设备间轻松快速的配对,因此用户只需在会议室中将手机贴近配备好的投影仪,即可创建一个 NFC 连接,并验证智能手机是否是一个可连接的授权设备,并进行演示。演示文稿或者视频数据本身不会通过 NFC 来传输,但是 NFC 握手可作为另外的无线协议(例如 Wi-Fi 网络或者任何其他更高带宽可以传输数据的网络)间的验证,从而无需用户登录。 + +### BLE 的特点 + +相较之下,BLE 的工作距离要远的多(长达几十米),其最大带宽 :1 Mbit/s 约为 NFC 连接的两倍。它是著名的蓝牙技术的产物,相较于主线标准的更低功耗,它为机器到机器的连接做了优化。在连接两端的耗电量均小于 15 mA,实用范围约为 10米,可通过 AES 加密保护连接。 + +然而,根据 Forrester 首席分析师 Andre Kindness 的说法,它远非 NFC 的替代品。 + +他说:“从信息传递角度来看, [NFC] 比 BLE 快得多。”BLE 通常需要几分之一秒或更长时间的验证并安全连接,而 NFC 几乎在瞬间完成连接。 + +不过,根据 IDC 高级研究分析师 Patrick Filkins 的说法,相较于 NFC,BLE 由于范围更广而有着更多的通用性。 + +他说:“我认为 BLE 比较适合企业”。而类似于资产追踪、室内导航和目标广告的用例只是冰山一角。 + +对于企业,结果是相当直接的——NFC 用例大多与公司使用蓝牙的用例是分开的,对于少有的可以选择的重叠,相对的优势和劣势显而易见。NFC 距离很短、价格便宜、可即时连接以及数据转换率较低。BLE 的工作距离更远、传输速率更高,成本也更高,连接时还需要一点时间来进行“握手”。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3574932/nfc-vs-bluetooth-le-when-to-use-which.html + +作者:[Jon Gold][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://www.networkworld.com/author/Jon-Gold/ +[b]: https://github.com/lujun9972 +[1]: https://www.networkworld.com/newsletters/signup.html +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/published/202010/20200916 How to Create-Configure LVM (Logical Volume Management) in Linux.md b/published/202010/20200916 How to Create-Configure LVM (Logical Volume Management) in Linux.md new file mode 100644 index 0000000000..d89593b28d --- /dev/null +++ b/published/202010/20200916 How to Create-Configure LVM (Logical Volume Management) in Linux.md @@ -0,0 +1,325 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12670-1.html) +[#]: subject: (How to Create/Configure LVM in Linux) +[#]: via: (https://www.2daygeek.com/create-lvm-storage-logical-volume-manager-in-linux/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在 Linux 中创建/配置 LVM(逻辑卷管理) +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/01/111414m2y0mdhgvd9j1bgv.jpg) + +逻辑卷管理Logical Volume Management(LVM)在 Linux 系统中扮演着重要的角色,它可以提高可用性、磁盘 I/O、性能和磁盘管理的能力。 + +LVM 是一种被广泛使用的技术,对于磁盘管理来说,它是非常灵活的。 + +它在物理磁盘和文件系统之间增加了一个额外的层,允许你创建一个逻辑卷而不是物理磁盘。 + +LVM 允许你在需要的时候轻松地调整、扩展和减少逻辑卷的大小。 + +![](https://img.linux.net.cn/data/attachment/album/202010/01/111230el14fubc4ku55o3k.jpeg) + +### 如何创建 LVM 物理卷? + +你可以使用任何磁盘、RAID 阵列、SAN 磁盘或分区作为 LVM 物理卷Physical Volume(PV)。 + +让我们想象一下,你已经添加了三个磁盘,它们是 `/dev/sdb`、`/dev/sdc` 和 `/dev/sdd`。 + +运行以下命令来[发现 Linux 中新添加的 LUN 或磁盘][2]: + +``` +# ls /sys/class/scsi_host +host0 +``` + +``` +# echo "- - -" > /sys/class/scsi_host/host0/scan +``` + +``` +# fdisk -l +``` + +**创建物理卷 (`pvcreate`) 的一般语法:** + +``` +pvcreate [物理卷名] +``` + +当在系统中检测到磁盘,使用 `pvcreate` 命令初始化 LVM PV: + +``` +# pvcreate /dev/sdb /dev/sdc /dev/sdd +Physical volume "/dev/sdb" successfully created +Physical volume "/dev/sdc" successfully created +Physical volume "/dev/sdd" successfully created +``` + +**请注意:** + + * 上面的命令将删除给定磁盘 `/dev/sdb`、`/dev/sdc` 和 `/dev/sdd` 上的所有数据。 + * 物理磁盘可以直接添加到 LVM PV 中,而不必是磁盘分区。 + +使用 `pvdisplay` 和 `pvs` 命令来显示你创建的 PV。`pvs` 命令显示的是摘要输出,`pvdisplay` 显示的是 PV 的详细输出: + +``` +# pvs +PV VG Fmt Attr PSize PFree +/dev/sdb lvm2 a-- 15.00g 15.00g +/dev/sdc lvm2 a-- 15.00g 15.00g +/dev/sdd lvm2 a-- 15.00g 15.00g +``` + +``` +# pvdisplay + +"/dev/sdb" is a new physical volume of "15.00 GiB" +--- NEW Physical volume --- +PV Name /dev/sdb +VG Name +PV Size 15.00 GiB +Allocatable NO +PE Size 0 +Total PE 0 +Free PE 0 +Allocated PE 0 +PV UUID 69d9dd18-36be-4631-9ebb-78f05fe3217f + +"/dev/sdc" is a new physical volume of "15.00 GiB" +--- NEW Physical volume --- +PV Name /dev/sdc +VG Name +PV Size 15.00 GiB +Allocatable NO +PE Size 0 +Total PE 0 +Free PE 0 +Allocated PE 0 +PV UUID a2092b92-af29-4760-8e68-7a201922573b + +"/dev/sdd" is a new physical volume of "15.00 GiB" +--- NEW Physical volume --- +PV Name /dev/sdd +VG Name +PV Size 15.00 GiB +Allocatable NO +PE Size 0 +Total PE 0 +Free PE 0 +Allocated PE 0 +PV UUID d92fa769-e00f-4fd7-b6ed-ecf7224af7faS +``` + +### 如何创建一个卷组 + +卷组Volume Group(VG)是 LVM 结构中的另一层。基本上,卷组由你创建的 LVM 物理卷组成,你可以将物理卷添加到现有的卷组中,或者根据需要为物理卷创建新的卷组。 + +**创建卷组 (`vgcreate`) 的一般语法:** + +``` +vgcreate [卷组名] [物理卷名] +``` + +使用以下命令将一个新的物理卷添加到新的卷组中: + +``` +# vgcreate vg01 /dev/sdb /dev/sdc /dev/sdd +Volume group "vg01" successfully created +``` + +**请注意:**默认情况下,它使用 4MB 的物理范围Physical Extent(PE),但你可以根据你的需要改变它。 + +使用 `vgs` 和 `vgdisplay` 命令来显示你创建的 VG 的信息: + +``` +# vgs vg01 +VG #PV #LV #SN Attr VSize VFree +vg01 3 0 0 wz--n- 44.99g 44.99g +``` + +``` +# vgdisplay vg01 +--- Volume group --- +VG Name vg01 +System ID +Format lvm2 +Metadata Areas 3 +Metadata Sequence No 1 +VG Access read/write +VG Status resizable +MAX LV 0 +Cur LV 0 +Open LV 0 +Max PV 0 +Cur PV 3 +Act PV 3 +VG Size 44.99 GiB +PE Size 4.00 MiB +Total PE 11511 +Alloc PE / Size 0 / 0 +Free PE / Size 11511 / 44.99 GiB +VG UUID d17e3c31-e2c9-4f11-809c-94a549bc43b7 +``` + +### 如何扩展卷组 + +如果 VG 没有空间,请使用以下命令将新的物理卷添加到现有卷组中。 + +**卷组扩展 (`vgextend`)的一般语法:** + +``` +vgextend [已有卷组名] [物理卷名] +``` + +``` +# vgextend vg01 /dev/sde + Volume group "vg01" successfully extended +``` + +### 如何以 GB 为单位创建逻辑卷? + +逻辑卷Logical Volume(LV)是 LVM 结构中的顶层。逻辑卷是由卷组创建的块设备。它作为一个虚拟磁盘分区,可以使用 LVM 命令轻松管理。 + +你可以使用 `lvcreate` 命令创建一个新的逻辑卷。 + +**创建逻辑卷(`lvcreate`) 的一般语法:** + +``` +lvcreate –n [逻辑卷名] –L [逻辑卷大小] [要创建的 LV 所在的卷组名称] +``` + +运行下面的命令,创建一个大小为 10GB 的逻辑卷 `lv001`: + +``` +# lvcreate -n lv001 -L 10G vg01 +Logical volume "lv001" created +``` + +使用 `lvs` 和 `lvdisplay` 命令来显示你所创建的 LV 的信息: + +``` +# lvs /dev/vg01/lvol01 +LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert +lv001 vg01 mwi-a-m-- 10.00g lv001_mlog 100.00 +``` + +``` +# lvdisplay /dev/vg01/lv001 +--- Logical volume --- +LV Path /dev/vg01/lv001 +LV Name lv001 +VG Name vg01 +LV UUID ca307aa4-0866-49b1-8184-004025789e63 +LV Write Access read/write +LV Creation host, time localhost.localdomain, 2020-09-10 11:43:05 -0700 +LV Status available +# open 0 +LV Size 10.00 GiB +Current LE 2560 +Segments 1 +Allocation inherit +Read ahead sectors auto +- currently set to 256 +Block device 253:4 +``` + +### 如何以 PE 大小创建逻辑卷? + +或者,你可以使用物理范围(PE)大小创建逻辑卷。 + +### 如何计算 PE 值? + +很简单,例如,如果你有一个 10GB 的卷组,那么 PE 大小是多少? + +默认情况下,它使用 4MB 的物理范围,但可以通过运行 `vgdisplay` 命令来检查正确的 PE 大小,因为这可以根据需求进行更改。 + +``` +10GB = 10240MB / 4MB (PE 大小) = 2560 PE +``` + +**用 PE 大小创建逻辑卷 (`lvcreate`) 的一般语法:** + +``` +lvcreate –n [逻辑卷名] –l [物理扩展 (PE) 大小] [要创建的 LV 所在的卷组名称] +``` + +要使用 PE 大小创建 10GB 的逻辑卷,命令如下: + +``` +# lvcreate -n lv001 -l 2560 vg01 +``` + +### 如何创建文件系统 + +在创建有效的文件系统之前,你不能使用逻辑卷。 + +**创建文件系统的一般语法:** + +``` +mkfs –t [文件系统类型] /dev/[LV 所在的卷组名称]/[LV 名称] +``` + +使用以下命令将逻辑卷 `lv001` 格式化为 ext4 文件系统: + +``` +# mkfs -t ext4 /dev/vg01/lv001 +``` + +对于 xfs 文件系统: + +``` +# mkfs -t xfs /dev/vg01/lv001 +``` + +### 挂载逻辑卷 + +最后,你需要挂载逻辑卷来使用它。确保在 `/etc/fstab` 中添加一个条目,以便系统启动时自动加载。 + +创建一个目录来挂载逻辑卷: + +``` +# mkdir /lvmtest +``` + +使用挂载命令[挂载逻辑卷][3]: + +``` +# mount /dev/vg01/lv001 /lvmtest +``` + +在 [/etc/fstab 文件][4]中添加新的逻辑卷详细信息,以便系统启动时自动挂载: + +``` +# vi /etc/fstab +/dev/vg01/lv001 /lvmtest xfs defaults 0 0 +``` + +使用 [df 命令][5]检查新挂载的卷: + +``` +# df -h /lvmtest +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/vg01-lv001 15360M 34M 15326M 4% /lvmtest +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/create-lvm-storage-logical-volume-manager-in-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://www.2daygeek.com/wp-content/uploads/2020/09/create-lvm-storage-logical-volume-manager-in-linux-2.png +[2]: https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/ +[3]: https://www.2daygeek.com/mount-unmount-file-system-partition-in-linux/ +[4]: https://www.2daygeek.com/understanding-linux-etc-fstab-file/ +[5]: https://www.2daygeek.com/linux-check-disk-space-usage-df-command/ diff --git a/published/202010/20200917 GNOME 3.38 is Here With Customizable App Grid, Performance Improvements and Tons of Other Changes.md b/published/202010/20200917 GNOME 3.38 is Here With Customizable App Grid, Performance Improvements and Tons of Other Changes.md new file mode 100644 index 0000000000..b51f072124 --- /dev/null +++ b/published/202010/20200917 GNOME 3.38 is Here With Customizable App Grid, Performance Improvements and Tons of Other Changes.md @@ -0,0 +1,121 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12726-1.html) +[#]: subject: (GNOME 3.38 is Here With Customizable App Grid, Performance Improvements and Tons of Other Changes) +[#]: via: (https://itsfoss.com/gnome-3-38-release/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +GNOME 3.38:可定制应用程序网格、性能改善 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/16/203906xys0py0nvi1d01ss.jpg) + +[GNOME 3.36][1] 带来大量亟需的改进,同时也带来性能的重大提升。现在,在 6 个月后,我们终于引来了 GNOME 3.38,并带来了一系列重大的变化。 + +### GNOME 3.38 主要特色 + +这里是 GNOME 3.38 (代码名称:Orbis) 的主要亮点: + +- [video](https://www.youtube.com/embed/DZ_P5W9r2JY) + +#### 可定制应用程序菜单 + +作为 GNOME 3.38 重大更改中的一部分,应用程序网格(或称应用菜单)现在是可以可定制的。 + +现在,你可以通过拖拽每个应用程序图标来创建文件夹,将它们移到文件夹,或移出文件夹并将其设置回应用网格。你也可以在应用网格中随心所欲地调整图标的位置。 + +![][3] + +此外,这些变化是一些即将到来的设计更改的基本组成部分,因此,看到我们可以期待的东西会很令人兴奋。 + +#### 日历菜单更新 + +![][4] + +随着最近一次的 GNOME 更新,通知区整洁了很多,但是现在随着 GNOME 3.38 的到来,你终于可以通过日历区域的正下方访问日历事件,使事情变得方便且容易访问。 + +它不是一个重大的视觉改造,但也是一些改善。 + +#### 家长控制改善 + +作为 GNOME 3.38 一部分,你将会注意家长控制服务。它支持与桌面、shell、设置以及其它各种各样组件的集成,来帮助你限制用户可以访问的内容。 + +#### 重新启动按钮 + +一些细微的改善导致了巨大的变化,重新启动按钮正是其中的一个变化。先单击 “关闭电源” / “关机” 按钮,再单击 “重新启动” 按钮的操作来重新启动系统总是让人很烦。 + +因此,随着 GNOME 3.38 的到来,你将最终会注意到一个作为单独按钮的 “重新启动” ,这将节省你的单击次数,平复你烦闷的心情。 + +#### 屏幕录制改善 + +[GNOME shell 内置的屏幕录制][5] 现在是一项独立的系统服务,这可能会使录制屏幕成为一种平滑流畅的体验。 + +另外,窗口截屏也有一些改善,并修复了一些错误: + +- [video](https://www.youtube.com/embed/c29ge3KwBk8) + +#### GNOME 应用程序更新 + +GNOME 计算器也收到很多的错误修复。除此之外,你也将发现 [epiphany GNOME 浏览器][6] 的一些重大改变。 + +GNOME Boxes 现在允许你从一个操作系统列表中选择将要运行的操作系统,GNOME 地图也有一些图像用户界面上的更改。 + +当然,不仅限于这些,你页将注意到 GNOME 控制中心、联系人、照片、Nautilus,以及其它一些软件包的细微更新和修复。 + +#### 性能和多显示器支持改善 + +这里有一大堆底层的改进来全面地改善 GNOME 3.38 。例如,[Mutter][7] 有一些重要的修正,它现在允许在两个显示器中使用不同的刷新频率。 + +![][8] + +先前,如果一台显示器的刷新频率为 60 Hz,而另一台的刷新频率为 144 Hz ,那么刷新频率较慢的显示器将限制另外一台显示器的刷新频率。但是,随着在 GNOME 3.38 中的改善,它将能够处理多个显示器,而不会使显示器相互限制。 + +另外,[Phoronix][9] 报告的一些更改指出,在一些情况下,缩短大约 10% 的渲染时间。因此,这绝对是一个很棒的性能优化。 + +#### 各种各样的其它更改 + + * 电池百分比指示器 + * 电源菜单中的重新启动选项 + * 新的欢迎指引 + * 指纹登录 + * 二维码扫描以共享 Wi-Fi 热点 + * GNOME 浏览器的隐私和其它改善 + * GNOME 地图现在反应敏捷并能根据屏幕大小改变其大小 + * 重新修订的图标 + +你可以在它们的官方 [更改日志][10] 中找到一个详细的更改列表。 + +### 总结 + +GNOME 3.38 确实是一个令人赞叹的更新,它改善了 GNOME 用户体验。尽管 GNOME 3.36 带来了性能的很大改善,但是针对 GNOME 3.38 的更多优化仍然是一件非常好的事. + +GNOME 3.38 将在 Ubuntu 20.10 和 [Fedora 33][11] 中可用。Arch 和 Manjaro 用户应该很快就能获得。 + +我认为有很多变化是朝着正确的方向发展的。你觉得呢? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gnome-3-38-release/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/gnome-3-36-release/ +[2]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/gnome-app-arranger.jpg?resize=799%2C450&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/gnome-3-38-calendar-menu.png?resize=800%2C721&ssl=1 +[5]: https://itsfoss.com/gnome-screen-recorder/ +[6]: https://en.wikipedia.org/wiki/GNOME_Web +[7]: https://en.wikipedia.org/wiki/Mutter_(software) +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/gnome-multi-monitor-refresh-rate.jpg?resize=800%2C369&ssl=1 +[9]: https://www.phoronix.com/scan.php?page=news_item&px=GNOME-3.38-Last-Min-Mutter +[10]: https://help.gnome.org/misc/release-notes/3.38 +[11]: https://itsfoss.com/fedora-33/ diff --git a/published/202010/20200918 How to Extend-Increase LVM-s (Logical Volume Resize) in Linux.md b/published/202010/20200918 How to Extend-Increase LVM-s (Logical Volume Resize) in Linux.md new file mode 100644 index 0000000000..db9b0c9679 --- /dev/null +++ b/published/202010/20200918 How to Extend-Increase LVM-s (Logical Volume Resize) in Linux.md @@ -0,0 +1,173 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12673-1.html) +[#]: subject: (How to Extend/Increase LVM’s in Linux) +[#]: via: (https://www.2daygeek.com/extend-increase-resize-lvm-logical-volume-in-linux/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在 Linux 中扩展/增加 LVM 大小(逻辑卷调整) +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/01/234018qgnwilmmzom8xarb.jpg) + +扩展逻辑卷非常简单,只需要很少的步骤,而且不需要卸载某个逻辑卷就可以在线完成。 + +LVM 的主要目的是灵活的磁盘管理,当你需要的时候,可以很方便地调整、扩展和缩小逻辑卷的大小。 + +如果你是逻辑卷管理(LVM) 新手,我建议你从我们之前的文章开始学习。 + + * **第一部分:[如何在 Linux 中创建/配置 LVM(逻辑卷管理)][1]** + +![](https://img.linux.net.cn/data/attachment/album/202010/01/233946ybwbnw4zanjbn00e.jpeg) + +扩展逻辑卷涉及到以下步骤: + + * 检查逻辑卷(LV)所在的卷组中是否有足够的未分配磁盘空间 + * 如果有,你可以使用这些空间来扩展逻辑卷 + * 如果没有,请向系统中添加新的磁盘或 LUN + * 将物理磁盘转换为物理卷(PV) + * 扩展卷组 + * 增加逻辑卷大小 + * 扩大文件系统 + * 检查扩展的文件系统大小 + +### 如何创建 LVM 物理卷? + +使用 `pvcreate` 命令创建 LVM 物理卷。 + +当在操作系统中检测到磁盘,使用 `pvcreate` 命令初始化 LVM 物理卷: + +``` +# pvcreate /dev/sdc +Physical volume "/dev/sdc" successfully created +``` + +**请注意:** + + * 上面的命令将删除磁盘 `/dev/sdc` 上的所有数据。 + * 物理磁盘可以直接添加到 LVM 物理卷中,而不是磁盘分区。 + +使用 `pvdisplay` 命令来显示你所创建的物理卷: + +``` +# pvdisplay /dev/sdc + +"/dev/sdc" is a new physical volume of "10.00 GiB" +--- NEW Physical volume --- +PV Name /dev/sdc +VG Name +PV Size 10.00 GiB +Allocatable NO +PE Size 0 +Total PE 0 +Free PE 0 +Allocated PE 0 +PV UUID 69d9dd18-36be-4631-9ebb-78f05fe3217f +``` + +### 如何扩展卷组 + +使用以下命令在现有的卷组(VG)中添加一个新的物理卷: + +``` +# vgextend vg01 /dev/sdc +Volume group "vg01" successfully extended +``` + +使用 `vgdisplay` 命令来显示你所创建的物理卷: + +``` +# vgdisplay vg01 +--- Volume group --- +VG Name vg01 +System ID +Format lvm2 +Metadata Areas 2 +Metadata Sequence No 1 +VG Access read/write +VG Status resizable +MAX LV 0 +Cur LV 0 +Open LV 0 +Max PV 0 +Cur PV 2 +Act PV 2 +VG Size 14.99 GiB +PE Size 4.00 MiB +Total PE 3840 +Alloc PE / Size 1280 / 4.99 +Free PE / Size 2560 / 9.99 GiB +VG UUID d17e3c31-e2c9-4f11-809c-94a549bc43b7 +``` + +### 如何扩展逻辑卷? + +使用以下命令增加现有逻辑卷大小。 + +**逻辑卷扩展(`lvextend`)的常用语法:** + +``` +lvextend [要增加的额外空间] [现有逻辑卷名称] +``` + +使用下面的命令将现有的逻辑卷增加 10GB: + +``` +# lvextend -L +10G /dev/mapper/vg01-lv002 +Rounding size to boundary between physical extents: 5.90 GiB +Size of logical volume vg01/lv002 changed from 5.00 GiB (1280 extents) to 15.00 GiB (3840 extents). +Logical volume var successfully resized +``` + +使用 PE 大小来扩展逻辑卷: + +``` +# lvextend -l +2560 /dev/mapper/vg01-lv002 +``` + +要使用百分比(%)扩展逻辑卷,请使用以下命令: + +``` +# lvextend -l +40%FREE /dev/mapper/vg01-lv002 +``` + +现在,逻辑卷已经扩展,你需要调整文件系统的大小以扩展逻辑卷内的空间: + +对于基于 ext3 和 ext4 的文件系统,运行以下命令: + +``` +# resize2fs /dev/mapper/vg01-lv002 +``` + +对于 xfs 文件系统,使用以下命令: + +``` +# xfs_growfs /dev/mapper/vg01-lv002 +``` + +使用 [df 命令][3]查看文件系统大小: + +``` +# df -h /lvmtest1 +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/vg01-lv002 15360M 34M 15326M 4% /lvmtest1 +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/extend-increase-resize-lvm-logical-volume-in-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-12670-1.html +[2]: https://www.2daygeek.com/wp-content/uploads/2020/09/extend-increase-resize-lvm-logical-volume-in-linux-3.png +[3]: https://www.2daygeek.com/linux-check-disk-space-usage-df-command/ diff --git a/published/202010/20200921 Installing and running Vagrant using qemu-kvm.md b/published/202010/20200921 Installing and running Vagrant using qemu-kvm.md new file mode 100644 index 0000000000..336a5bd209 --- /dev/null +++ b/published/202010/20200921 Installing and running Vagrant using qemu-kvm.md @@ -0,0 +1,153 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12676-1.html) +[#]: subject: (Installing and running Vagrant using qemu-kvm) +[#]: via: (https://fedoramagazine.org/vagrant-qemukvm-fedora-devops-sysadmin/) +[#]: author: (Andy Mott https://fedoramagazine.org/author/amott/) + +使用 qemu-kvm 安装和运行 Vagrant +====== + +![][1] + +Vagrant 是一个出色的工具,DevOps 专业人员、程序员、系统管理员和普通极客来使用它来建立可重复的基础架构来进行开发和测试。引用自它的网站: + +> Vagrant 是用于在单工作流程中构建和管理虚拟机环境的工具。凭借简单易用的工作流程并专注于自动化,Vagrant 降低了开发环境的设置时间,提高了生产效率,并使“在我的机器上可以工作”的借口成为过去。 +> +> 如果你已经熟悉 Vagrant 的基础知识,那么该文档为所有的功能和内部结构提供了更好的参考。 +> +> Vagrant 提供了基于行业标准技术构建的、易于配置、可复制、可移植的工作环境,并由一个一致的工作流程控制,帮助你和你的团队最大限度地提高生产力和灵活性。 +> +> + +本指南将逐步介绍使 Vagrant 在基于 Fedora 的计算机上工作所需的步骤。 + +我从最小化安装 Fedora 服务器开始,因为这样可以减少宿主机操作系统的内存占用,但如果你已经有一台可以使用的 Fedora 机器,无论是服务器还是工作站版本,那么也没问题。 + +### 检查机器是否支持虚拟化 + +``` +$ sudo lscpu | grep Virtualization +``` + +``` +Virtualization: VT-x +Virtualization type: full +``` + +### 安装 qemu-kvm + +``` +sudo dnf install qemu-kvm libvirt libguestfs-tools virt-install rsync +``` + +### 启用并启动 libvirt 守护进程 + +``` +sudo systemctl enable --now libvirtd +``` + +### 安装 Vagrant + +``` +sudo dnf install vagrant +``` + +### 安装 Vagrant libvirtd 插件 + +``` +sudo vagrant plugin install vagrant-libvirt +``` + +### 添加一个 box + +``` +vagrant box add fedora/32-cloud-base --provider=libvirt +``` + +(LCTT 译注:以防你不知道,box 是 Vagrant 中的一种包格式,Vagrant 支持的任何平台上的任何人都可以使用盒子来建立相同的工作环境。) + +### 创建一个最小化的 Vagrantfile 来测试 + +``` +$ mkdir vagrant-test +$ cd vagrant-test +$ vi Vagrantfile +``` + +``` +Vagrant.configure("2") do |config| + config.vm.box = "fedora/32-cloud-base" +end +``` + +**注意文件名和文件内容的大小写。** + +### 检查文件 + +``` +vagrant status +``` + +``` +Current machine states: + +default not created (libvirt) + +The Libvirt domain is not created. Run 'vagrant up' to create it. +``` + +### 启动 box + +``` +vagrant up +``` + +### 连接到你的新机器 + +``` +vagrant ssh +``` + +完成了。现在你的 Fedora 机器上 Vagrant 可以工作了。 + +要停止该机器,请使用 `vagrant halt`。这只是简单地停止机器,但保留虚拟机和磁盘。 +要关闭并删除它,请使用 `vagrant destroy`。这将删除整个机器和你在其中所做的任何更改。 + +### 接下来的步骤 + +在运行 `vagrant up` 命令之前,你不需要下载 box。你可以直接在 Vagrantfile 中指定 box 和提供者,如果还没有的话,Vagrant 会下载它。下面是一个例子,它还设置了内存量和 CPU 数量: + +``` +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure("2") do |config| + config.vm.box = "fedora/32-cloud-base" + config.vm.provider :libvirt do |libvirt| + libvirt.cpus = 1 + libvirt.memory = 1024 + end +end +``` + +关于使用 Vagrant、创建你自己的机器和使用不同 box 的更多信息,请参见官方文档 。 + +有一个庞大的仓库,你可以随时下载使用这些 box,它们的的官方仓库是 Vagrant Cloud - 。这里有些是基本的操作系统,有些提供完整的功能,如数据库、网络服务器等。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/vagrant-qemukvm-fedora-devops-sysadmin/ + +作者:[Andy Mott][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/amott/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/09/vagrant-beginner-howto-816x346.png diff --git a/published/202010/20200922 How to Reduce-Shrink LVM-s (Logical Volume Resize) in Linux.md b/published/202010/20200922 How to Reduce-Shrink LVM-s (Logical Volume Resize) in Linux.md new file mode 100644 index 0000000000..7d1348c83f --- /dev/null +++ b/published/202010/20200922 How to Reduce-Shrink LVM-s (Logical Volume Resize) in Linux.md @@ -0,0 +1,169 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12740-1.html) +[#]: subject: (How to Reduce/Shrink LVM’s \(Logical Volume Resize\) in Linux) +[#]: via: (https://www.2daygeek.com/reduce-shrink-decrease-resize-lvm-logical-volume-in-linux/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在 Linux 中减少/缩小 LVM 大小(逻辑卷调整) +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/21/210459ydp5an23nfzgglyy.jpg) + +减少/缩小逻辑卷是数据损坏的最高风险。 + +所以,如果可能的话,尽量避免这种情况,但如果没有其他选择的话,那就继续。 + +缩减 LVM 之前,建议先做一个备份。 + +当你在 LVM 中的磁盘空间耗尽时,你可以通过缩小现有的没有使用全部空间的 LVM,而不是增加一个新的物理磁盘,在卷组上腾出一些空闲空间。 + +**需要注意的是:** 在 GFS2 或者 XFS 文件系统上不支持缩小。 + +如果你是逻辑卷管理 (LVM) 的新手,我建议你从我们之前的文章开始学习。 + +* **第一部分:[如何在 Linux 中创建/配置 LVM(逻辑卷管理)][1]** +* **第二部分:[如何在 Linux 中扩展/增加 LVM(逻辑卷调整)][2]** + +![](https://img.linux.net.cn/data/attachment/album/202010/21/210610kikq1xynfje7hjaa.jpeg) + +减少逻辑卷涉及以下步骤: + + * 卸载文件系统 + * 检查文件系统是否有任何错误 + * 缩小文件系统的大小 + * 缩小逻辑卷的大小 + * 重新检查文件系统是否存在错误(可选) + * 挂载文件系统 + * 检查减少后的文件系统大小 + +**比如:** 你有一个 **100GB** 的没有使用全部空间的 LVM,你想把它减少到 **80GB**,这样 **20GB** 可以用于其他用途。 + +``` +# df -h /testlvm1 + +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/vg01-lv002 100G 15G 85G 12% /testlvm1 +``` + +### 卸载文件系统 + +使用 `umount` 命令卸载文件系统: + +``` +# umount /testlvm1 +``` + +### 检查文件系统是否有任何错误 + +使用 `e2fsck` 命令检查文件系统是否有错误: + +``` +# e2fsck -f /dev/mapper/vg01-lv002 + +e2fsck 1.42.9 (28-Dec-2013) +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +/dev/mapper/vg01-lv002: 13/6553600 files (0.0% non-contiguous), 12231854/26212352 blocks +``` + +### 缩小文件系统 + +下面的命令将把 `testlvm1` 文件系统从 **100GB** 缩小到 **80GB**。 + +**文件系统大小调整的常用语法(`resize2fs`)**: + +``` +resize2fs [现有逻辑卷名] [新的文件系统大小] +``` + +实际命令如下: + +``` +# resize2fs /dev/mapper/vg01-lv002 80G + +resize2fs 1.42.9 (28-Dec-2013) +Resizing the filesystem on /dev/mapper/vg01-lv002 to 28321400 (4k) blocks. +The filesystem on /dev/mapper/vg01-lv002 is now 28321400 blocks long. +``` + +### 减少逻辑卷 (LVM) 容量 + +现在使用 `lvreduce` 命令缩小逻辑卷(LVM) 的大小。通过下面的命令, `/dev/mapper/vg01-lv002` 将把逻辑卷 (LVM) 从 100GB 缩小到 80GB。 + +**LVM 缩减 (`lvreduce`) 的常用语法**: + +``` +lvreduce [新的 LVM 大小] [现有逻辑卷名称] +``` + +实际命令如下: + +``` +# lvreduce -L 80G /dev/mapper/vg01-lv002 + +WARNING: Reducing active logical volume to 80.00 GiB +THIS MAY DESTROY YOUR DATA (filesystem etc.) +Do you really want to reduce lv002? [y/n]: y +Reducing logical volume lv002 to 80.00 GiB +Logical volume lv002 successfully resized +``` + +### 可选:检查文件系统是否有错误 + +缩减 LVM 后再次检查文件系统是否有错误: + +``` +# e2fsck -f /dev/mapper/vg01-lv002 + +e2fsck 1.42.9 (28-Dec-2013) +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +/dev/mapper/vg01-lv002: 13/4853600 files (0.0% non-contiguous), 1023185/2021235 blocks +``` + +### 挂载文件系统并检查缩小后的大小 + +最后挂载文件系统,并检查缩小后的文件系统大小。 + +使用 `mount` 命令[挂载逻辑卷][4]: + +``` +# mount /testlvm1 +``` + +使用 [df 命令][5]检查挂载的卷。 + +``` +# df -h /testlvm1 + +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/vg01-lv002 80G 15G 65G 18% /testlvm1 +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/reduce-shrink-decrease-resize-lvm-logical-volume-in-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-12670-1.html +[2]: https://linux.cn/article-12673-1.html +[3]: https://www.2daygeek.com/wp-content/uploads/2020/09/reduce-shrink-decrease-resize-lvm-logical-volume-in-linux-1.png +[4]: https://www.2daygeek.com/mount-unmount-file-system-partition-in-linux/ +[5]: https://www.2daygeek.com/linux-check-disk-space-usage-df-command/ diff --git a/published/202010/20200923 Find security issues in Go code using gosec.md b/published/202010/20200923 Find security issues in Go code using gosec.md new file mode 100644 index 0000000000..a18b93ad79 --- /dev/null +++ b/published/202010/20200923 Find security issues in Go code using gosec.md @@ -0,0 +1,378 @@ +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12681-1.html" +[#]: subject: "Find security issues in Go code using gosec" +[#]: via: "https://opensource.com/article/20/9/gosec" +[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe" + +使用 gosec 检查 Go 代码中的安全问题 +====== + +> 来学习下 Go 语言的安全检查工具 gosec。 + +![](https://img.linux.net.cn/data/attachment/album/202010/04/125129bh4qxxsyqpvqjtx4.jpg) + +[Go 语言][2]写的代码越来越常见,尤其是在容器、Kubernetes 或云生态相关的开发中。Docker 是最早采用 Golang 的项目之一,随后是 Kubernetes,之后大量的新项目在众多编程语言中选择了 Go。 + +像其他语言一样,Go 也有它的长处和短处(如安全缺陷)。这些缺陷可能会因为语言本身的缺陷加上程序员编码不当而产生,例如,C 代码中的内存安全问题。 + +无论它们出现的原因是什么,安全问题都应该在开发过程的早期修复,以免在封装好的软件中出现。幸运的是,静态分析工具可以帮你以更可重复的方式处理这些问题。静态分析工具通过解析用某种编程语言写的代码来找到问题。 + +这类工具中很多被称为 linter。传统意义上,linter 更注重的是检查代码中编码问题、bug、代码风格之类的问题,它们可能不会发现代码中的安全问题。例如,[Coverity][3] 是一个很流行的工具,它可以帮助寻找 C/C++ 代码中的问题。然而,也有一些工具专门用来检查源码中的安全问题。例如,[Bandit][4] 可以检查 Python 代码中的安全缺陷。而 [gosec][5] 则用来搜寻 Go 源码中的安全缺陷。`gosec` 通过扫描 Go 的 AST(抽象语法树abstract syntax tree)来检查源码中的安全问题。 + +### 开始使用 gosec + +在开始学习和使用 `gosec` 之前,你需要准备一个 Go 语言写的项目。有这么多开源软件,我相信这不是问题。你可以在 GitHub 的 [热门 Golang 仓库][6]中找一个。 + +本文中,我随机选了 [Docker CE][7] 项目,但你可以选择任意的 Go 项目。 + +#### 安装 Go 和 gosec + +如果你还没安装 Go,你可以先从仓库中拉取下来。如果你用的是 Fedora 或其他基于 RPM 的 Linux 发行版本: + +``` +$ dnf install golang.x86_64 +``` + +如果你用的是其他操作系统,请参照 [Golang 安装][8]页面。 + +使用 `version` 参数来验证 Go 是否安装成功: + +``` +$ go version +go version go1.14.6 linux/amd64 +``` + +运行 `go get` 命令就可以轻松地安装 `gosec`: + +``` +$ go get github.com/securego/gosec/cmd/gosec +``` + +上面这行命令会从 GitHub 下载 `gosec` 的源码,编译并安装到指定位置。在仓库的 `README` 中你还可以看到[安装该工具的其他方法][9]。 + +`gosec` 的源码会被下载到 `$GOPATH` 的位置,编译出的二进制文件会被安装到你系统上设置的 `bin` 目录下。你可以运行下面的命令来查看 `$GOPATH` 和 `$GOBIN` 目录: + +``` +$ go env | grep GOBIN +GOBIN="/root/go/gobin" +$ go env | grep GOPATH +GOPATH="/root/go" +``` + +如果 `go get` 命令执行成功,那么 `gosec` 二进制应该就可以使用了: + +``` +$ ls -l ~/go/bin/ +total 9260 +-rwxr-xr-x. 1 root root 9482175 Aug 20 04:17 gosec +``` + +你可以把 `$GOPATH` 下的 `bin` 目录添加到 `$PATH` 中。这样你就可以像使用系统上的其他命令一样来使用 `gosec` 命令行工具(CLI)了。 + +``` +$ which gosec +/root/go/bin/gosec +$ +``` + +使用 `gosec` 命令行工具的 `-help` 选项来看看运行是否符合预期: + +``` +$ gosec -help + +gosec - Golang security checker + +gosec analyzes Go source code to look for common programming mistakes that +can lead to security problems. + +VERSION: dev +GIT TAG: +BUILD DATE: + +USAGE: +``` + +之后,创建一个目录,把源码下载到这个目录作为实例项目(本例中,我用的是 Docker CE): + +``` +$ mkdir gosec-demo +$ cd gosec-demo/ +$ pwd +/root/gosec-demo +$ git clone https://github.com/docker/docker-ce.git +Cloning into 'docker-ce'... +remote: Enumerating objects: 1271, done. +remote: Counting objects: 100% (1271/1271), done. +remote: Compressing objects: 100% (722/722), done. +remote: Total 431003 (delta 384), reused 981 (delta 318), pack-reused 429732 +Receiving objects: 100% (431003/431003), 166.84 MiB | 28.94 MiB/s, done. +Resolving deltas: 100% (221338/221338), done. +Updating files: 100% (10861/10861), done. +``` + +代码统计工具(本例中用的是 `cloc`)显示这个项目大部分是用 Go 写的,恰好迎合了 `gosec` 的功能。 + + +``` +$ ./cloc /root/gosec-demo/docker-ce/ + 10771 text files. + 8724 unique files. + 2560 files ignored. + + +----------------------------------------------------------------------------------- +Language files blank comment code +----------------------------------------------------------------------------------- +Go 7222 190785 230478 1574580 +YAML 37 4831 817 156762 +Markdown 529 21422 0 67893 +Protocol Buffers 149 5014 16562 10071 +``` + +### 使用默认选项运行 gosec + +在 Docker CE 项目中使用默认选项运行 `gosec`,执行 `gosec ./...` 命令。屏幕上会有很多输出内容。在末尾你会看到一个简短的 “Summary”,列出了浏览的文件数、所有文件的总行数,以及源码中发现的问题数。 + +``` +$ pwd +/root/gosec-demo/docker-ce +$ time gosec ./... +[gosec] 2020/08/20 04:44:15 Including rules: default +[gosec] 2020/08/20 04:44:15 Excluding rules: default +[gosec] 2020/08/20 04:44:15 Import directory: /root/gosec-demo/docker-ce/components/engine/opts +[gosec] 2020/08/20 04:44:17 Checking package: opts +[gosec] 2020/08/20 04:44:17 Checking file: /root/gosec-demo/docker-ce/components/engine/opts/address_pools.go +[gosec] 2020/08/20 04:44:17 Checking file: /root/gosec-demo/docker-ce/components/engine/opts/env.go +[gosec] 2020/08/20 04:44:17 Checking file: /root/gosec-demo/docker-ce/components/engine/opts/hosts.go + +# End of gosec run + +Summary: + Files: 1278 + Lines: 173979 + Nosec: 4 + Issues: 644 + +real 0m52.019s +user 0m37.284s +sys 0m12.734s +$ +``` + +滚动屏幕你会看到不同颜色高亮的行:红色表示需要尽快查看的高优先级问题,黄色表示中优先级的问题。 + +#### 关于误判 + +在开始检查代码之前,我想先分享几条基本原则。默认情况下,静态检查工具会基于一系列的规则对测试代码进行分析,并报告出它们发现的*所有*问题。这是否意味着工具报出来的每一个问题都需要修复?非也。这个问题最好的解答者是设计和开发这个软件的人。他们最熟悉代码,更重要的是,他们了解软件会在什么环境下部署以及会被怎样使用。 + +这个知识点对于判定工具标记出来的某段代码到底是不是安全缺陷至关重要。随着工作时间和经验的积累,你会慢慢学会怎样让静态分析工具忽略非安全缺陷,使报告内容的可执行性更高。因此,要判定 `gosec` 报出来的某个问题是否需要修复,让一名有经验的开发者对源码做人工审计会是比较好的办法。 + +#### 高优先级问题 + +从输出内容看,`gosec` 发现了 Docker CE 的一个高优先级问题,它使用的是低版本的 TLS(传输层安全Transport Layer Security)。无论什么时候,使用软件和库的最新版本都是确保它更新及时、没有安全问题的最好的方法。 + +``` +[/root/gosec-demo/docker-ce/components/engine/daemon/logger/splunk/splunk.go:173] - G402 (CWE-295): TLS MinVersion too low. (Confidence: HIGH, Severity: HIGH) + 172: + > 173: tlsConfig := &tls.Config{} + 174: +``` + +它还发现了一个弱随机数生成器。它是不是一个安全缺陷,取决于生成的随机数的使用方式。 + +``` +[/root/gosec-demo/docker-ce/components/engine/pkg/namesgenerator/names-generator.go:843] - G404 (CWE-338): Use of weak random number generator (math/rand instead of crypto/rand) (Confidence: MEDIUM, Severity: HIGH) + 842: begin: + > 843: name := fmt.Sprintf("%s_%s", left[rand.Intn(len(left))], right[rand.Intn(len(right))]) + 844: if name == "boring_wozniak" /* Steve Wozniak is not boring */ { +``` + +#### 中优先级问题 + +这个工具还发现了一些中优先级问题。它标记了一个通过与 `tar` 相关的解压炸弹这种方式实现的潜在的 DoS 威胁,这种方式可能会被恶意的攻击者利用。 + +``` +[/root/gosec-demo/docker-ce/components/engine/pkg/archive/copy.go:357] - G110 (CWE-409): Potential DoS vulnerability via decompression bomb (Confidence: MEDIUM, Severity: MEDIUM) + 356: + > 357: if _, err = io.Copy(rebasedTar, srcTar); err != nil { + 358: w.CloseWithError(err) +``` + +它还发现了一个通过变量访问文件的问题。如果恶意使用者能访问这个变量,那么他们就可以改变变量的值去读其他文件。 + +``` +[/root/gosec-demo/docker-ce/components/cli/cli/context/tlsdata.go:80] - G304 (CWE-22): Potential file inclusion via variable (Confidence: HIGH, Severity: MEDIUM) + 79: if caPath != "" { + > 80: if ca, err = ioutil.ReadFile(caPath); err != nil { + 81: return nil, err +``` + +文件和目录通常是操作系统安全的最基础的元素。这里,`gosec` 报出了一个可能需要你检查目录的权限是否安全的问题。 + +``` +[/root/gosec-demo/docker-ce/components/engine/contrib/apparmor/main.go:41] - G301 (CWE-276): Expect directory permissions to be 0750 or less (Confidence: HIGH, Severity: MEDIUM) + 40: // make sure /etc/apparmor.d exists + > 41: if err := os.MkdirAll(path.Dir(apparmorProfilePath), 0755); err != nil { + 42: log.Fatal(err) +``` + +你经常需要在源码中启动命令行工具。Go 使用内建的 exec 库来实现。仔细地分析用来调用这些工具的变量,就能发现安全缺陷。 + +``` +[/root/gosec-demo/docker-ce/components/engine/testutil/fakestorage/fixtures.go:59] - G204 (CWE-78): Subprocess launched with variable (Confidence: HIGH, Severity: MEDIUM) + 58: + > 59: cmd := exec.Command(goCmd, "build", "-o", filepath.Join(tmp, "httpserver"), "github.com/docker/docker/contrib/httpserver") + 60: cmd.Env = append(os.Environ(), []string{ +``` + +#### 低优先级问题 + +在这个输出中,gosec 报出了一个 `unsafe` 调用相关的低优先级问题,这个调用会绕开 Go 提供的内存保护。再仔细分析下你调用 `unsafe` 的方式,看看是否有被别人利用的可能性。 + +``` +[/root/gosec-demo/docker-ce/components/engine/pkg/archive/changes_linux.go:264] - G103 (CWE-242): Use of unsafe calls should be audited (Confidence: HIGH, Severity: LOW) + 263: for len(buf) > 0 { + > 264: dirent := (*unix.Dirent)(unsafe.Pointer(&buf[0])) + 265: buf = buf[dirent.Reclen:] + + + +[/root/gosec-demo/docker-ce/components/engine/pkg/devicemapper/devmapper_wrapper.go:88] - G103 (CWE-242): Use of unsafe calls should be audited (Confidence: HIGH, Severity: LOW) + 87: func free(p *C.char) { + > 88: C.free(unsafe.Pointer(p)) + 89: } +``` + +它还标记了源码中未处理的错误。源码中出现的错误你都应该处理。 + +``` +[/root/gosec-demo/docker-ce/components/cli/cli/command/image/build/context.go:172] - G104 (CWE-703): Errors unhandled. (Confidence: HIGH, Severity: LOW) + 171: err := tar.Close() + > 172: os.RemoveAll(dockerfileDir) + 173: return err +``` + +### 自定义 gosec 扫描 + +使用 `gosec` 的默认选项会带来很多的问题。然而,经过人工审计,随着时间推移你会掌握哪些问题是不需要标记的。你可以自己指定排除和包含哪些测试。 + +我上面提到过,`gosec` 是基于一系列的规则从 Go 源码中查找问题的。下面是它使用的完整的[规则][10]列表: + +- G101:查找硬编码凭证 +- G102:绑定到所有接口 +- G103:审计 `unsafe` 块的使用 +- G104:审计未检查的错误 +- G106:审计 `ssh.InsecureIgnoreHostKey` 的使用 +- G107: 提供给 HTTP 请求的 url 作为污点输入 +- G108: `/debug/pprof` 上自动暴露的剖析端点 +- G109: `strconv.Atoi` 转换到 int16 或 int32 时潜在的整数溢出 +- G110: 潜在的通过解压炸弹实现的 DoS +- G201:SQL 查询构造使用格式字符串 +- G202:SQL 查询构造使用字符串连接 +- G203:在 HTML 模板中使用未转义的数据 +- G204:审计命令执行情况 +- G301:创建目录时文件权限分配不合理 +- G302:使用 `chmod` 时文件权限分配不合理 +- G303:使用可预测的路径创建临时文件 +- G304:通过污点输入提供的文件路径 +- G305:提取 zip/tar 文档时遍历文件 +- G306: 写到新文件时文件权限分配不合理 +- G307: 把返回错误的函数放到 `defer` 内 +- G401:检测 DES、RC4、MD5 或 SHA1 的使用 +- G402:查找错误的 TLS 连接设置 +- G403:确保最小 RSA 密钥长度为 2048 位 +- G404:不安全的随机数源(`rand`) +- G501:导入黑名单列表:crypto/md5 +- G502:导入黑名单列表:crypto/des +- G503:导入黑名单列表:crypto/rc4 +- G504:导入黑名单列表:net/http/cgi +- G505:导入黑名单列表:crypto/sha1 +- G601: 在 `range` 语句中使用隐式的元素别名 + +#### 排除指定的测试 + +你可以自定义 `gosec` 来避免对已知为安全的问题进行扫描和报告。你可以使用 `-exclude` 选项和上面的规则编号来忽略指定的问题。 + +例如,如果你不想让 `gosec` 检查源码中硬编码凭证相关的未处理的错误,那么你可以运行下面的命令来忽略这些错误: + +``` +$ gosec -exclude=G104 ./... +$ gosec -exclude=G104,G101 ./... +``` + +有时候你知道某段代码是安全的,但是 `gosec` 还是会报出问题。然而,你又不想完全排除掉整个检查,因为你想让 `gosec` 检查新增的代码。通过在你已知为安全的代码块添加 `#nosec` 标记可以避免 `gosec` 扫描。这样 `gosec` 会继续扫描新增代码,而忽略掉 `#nosec` 标记的代码块。 + +#### 运行指定的检查 + +另一方面,如果你只想检查指定的问题,你可以通过 `-include` 选项和规则编号来告诉 `gosec` 运行哪些检查: + +``` +$ gosec -include=G201,G202 ./... +``` + +#### 扫描测试文件 + +Go 语言自带对测试的支持,通过单元测试来检验一个元素是否符合预期。在默认模式下,`gosec` 会忽略测试文件,你可以使用 `-tests` 选项把它们包含进来: + +``` +gosec -tests ./... +``` + +#### 修改输出的格式 + +找出问题只是它的一半功能;另一半功能是把它检查到的问题以用户友好同时又方便工具处理的方式报告出来。幸运的是,`gosec` 可以用不同的方式输出。例如,如果你想看 JSON 格式的报告,那么就使用 `-fmt` 选项指定 JSON 格式并把结果保存到 `results.json` 文件中: + +``` +$ gosec -fmt=json -out=results.json ./... + +$ ls -l results.json +-rw-r--r--. 1 root root 748098 Aug 20 05:06 results.json +$ + + { + "severity": "LOW", + "confidence": "HIGH", + "cwe": { + "ID": "242", + "URL": "https://cwe.mitre.org/data/definitions/242.html" + }, + "rule_id": "G103", + "details": "Use of unsafe calls should be audited", + "file": "/root/gosec-demo/docker-ce/components/engine/daemon/graphdriver/graphtest/graphtest_unix.go", + "code": "304: \t// Cast to []byte\n305: \theader := *(*reflect.SliceHeader)(unsafe.Pointer(\u0026buf))\n306: \theader. Len *= 8\n", + "line": "305", + "column": "36" + }, +``` + +### 用 gosec 检查容易被发现的问题 + +静态检查工具不能完全代替人工代码审计。然而,当代码量变大、有众多开发者时,这样的工具往往有助于以可重复的方式找出容易被发现的问题。它对于帮助新开发者识别和在编码时避免引入这些安全缺陷很有用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/gosec + +作者:[Gaurav Kamathe][a] +选题:[lujun9972][b] +译者:[lxbowlf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_3reasons.png?itok=k6F3-BqA "A lock on the side of a building" +[2]: https://golang.org/ +[3]: https://www.synopsys.com/software-integrity/security-testing/static-analysis-sast.html +[4]: https://pypi.org/project/bandit/ +[5]: https://github.com/securego/gosec +[6]: https://github.com/trending/go +[7]: https://github.com/docker/docker-ce +[8]: https://golang.org/doc/install +[9]: https://github.com/securego/gosec#install +[10]: https://github.com/securego/gosec#available-rules + diff --git a/published/202010/20200925 5 questions to ask yourself when writing project documentation.md b/published/202010/20200925 5 questions to ask yourself when writing project documentation.md new file mode 100644 index 0000000000..3b59da6ca5 --- /dev/null +++ b/published/202010/20200925 5 questions to ask yourself when writing project documentation.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12691-1.html) +[#]: subject: (5 questions to ask yourself when writing project documentation) +[#]: via: (https://opensource.com/article/20/9/project-documentation) +[#]: author: (Alexei Leontief https://opensource.com/users/alexeileontief) + +编写项目文档时要问自己的 5 个问题 +====== + +> 使用有效沟通的一些基本原则可以帮助你创建与你的品牌一致的、编写良好、内容丰富的项目文档。 + +![](https://img.linux.net.cn/data/attachment/album/202010/06/223150omjnutjpml8inc9n.jpg) + +在开始实际撰写又一个开源项目的文档之前,甚至在采访专家之前,最好回答一些有关新文档的高级问题。 + +著名的传播理论家 Harold Lasswell 在他 1948 年的文章《社会中的传播结构和功能The Structure and Function of Communication in Society》中写道: + +> (一种)描述沟通行为的方便方法是回答以下问题: +> +> * 谁 +> * 说什么 +> * 在哪个渠道 +> * 对谁 +> * 有什么效果? + +作为一名技术交流者,你可以运用 Lasswell 的理论,回答关于你文档的类似问题,以更好地传达你的信息,达到预期的效果。 + +### 谁:谁是文档的所有者? + +或者说,文档背后是什么公司?它想向受众传达什么品牌形象?这个问题的答案将极大地影响你的写作风格。公司可能有自己的风格指南,或者至少有正式的使命声明,在这种情况下,你应该从这开始。 + +如果公司刚刚起步,你可以向文件的主人提出上述问题。作为作者,将你为公司创造的声音和角色与你自己的世界观和信念结合起来是很重要的。这将使你的写作看起来更自然,而不像公司的行话。 + +### 说什么:文件类型是什么? + +你需要传达什么信息?它是什么类型的文档:用户指南、API 参考、发布说明等?许多文档类型有模板或普遍认可的结构,这些结构为你提供一个开始的地方,并帮助确保包括所有必要的信息。 + +### 在哪个渠道:文档的格式是什么? + +对于技术文档,沟通的渠道通常会告诉你文档的最终格式,也就是 PDF、HTML、文本文件等。这很可能也决定了你应该使用什么工具来编写你的文档。 + +### 对谁:目标受众是谁? + +谁会阅读这份文档?他们的知识水平如何?他们的工作职责和主要挑战是什么?这些问题将帮助你确定你应该覆盖什么内容,是否应该应该涉及细节,是否可以使用特定的术语,等等。在某些情况下,这些问题的答案甚至可以影响你使用的语法的复杂性。 + +### 有什么效果:文档的目的是什么? + +在这里,你应该定义这个文档要为它的潜在读者解决什么问题,或者它应该为他们回答什么问题。例如,你的文档的目的可以是教你的客户如何使用你的产品。 + +这时,你可以参考 [Divio][2] 建议的方法。根据这种方法,你可以根据文档的总体方向,将任何文档分为四种类型之一:学习、解决问题、理解或获取信息。 + +在这个阶段,另一个很好的问题是,这个文档要解决什么业务问题(例如,如何削减支持成本)。带着业务问题,你可能会看到你写作的一个重要角度。 + +### 总结 + +上面的问题旨在帮助你形成有效沟通的基础,并确保你的文件涵盖了所有应该涵盖的内容。你可以把它们分解成你自己的问题清单,并把它们放在身边,以便在你有文件要创建的时候使用。当你面对空白页无从着笔时,这份清单也可能会派上用场。希望它能激发你的灵感,帮助你产生想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/project-documentation + +作者:[Alexei Leontief][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/alexeileontief +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003784_02_os.comcareers_resume_rh1x.png?itok=S3HGxi6E (A person writing.) +[2]: https://documentation.divio.com/ diff --git a/published/202010/20200926 10 Open Source Static Site Generators to Create Fast and Resource-Friendly Websites.md b/published/202010/20200926 10 Open Source Static Site Generators to Create Fast and Resource-Friendly Websites.md new file mode 100644 index 0000000000..6878aea281 --- /dev/null +++ b/published/202010/20200926 10 Open Source Static Site Generators to Create Fast and Resource-Friendly Websites.md @@ -0,0 +1,218 @@ +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12671-1.html" +[#]: subject: "10 Open Source Static Site Generators to Create Fast and Resource-Friendly Websites" +[#]: via: "https://itsfoss.com/open-source-static-site-generators/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" + +10 大静态网站生成工具 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/01/123903lx1q0w2oh1lxx7wh.jpg) + +> 在寻找部署静态网页的方法吗?这几个开源的静态网站生成工具可以帮你迅速部署界面优美、功能强大的静态网站,无需掌握复杂的 HTML 和 CSS 技能。 + +### 静态网站是什么? + +技术上来讲,静态网站是指网页不是由服务器动态生成的。HTML、CSS 和 JavaScript 文件就静静地躺在服务器的某个路径下,它们的内容与终端用户接收到的版本是一样的。原始的源码文件已经提前编译好了,源码在每次请求后都不会变化。 + +Linux.CN 是一个依赖多个数据库的动态网站,当有浏览器的请求时,网页就会生成并提供服务。大部分网站是动态的,你与这些网站互动时,大量的内容会经常改变。 + +静态网站有一些好处,比如加载时间更短,请求的服务器资源更少、更安全(值得商榷)。 + +传统上,静态网站更适合于创建只有少量网页、内容变化不频繁的小网站。 + +然而,随着静态网站生成工具出现后,静态网站的适用范围越来越大。你还可以使用这些工具搭建博客网站。 + +我整理了几个开源的静态网站生成工具,这些工具可以帮你搭建界面优美的网站。 + +### 最好的开源静态网站生成工具 + +请注意,静态网站不会提供很复杂的功能。如果你需要复杂的功能,那么你可以参考适用于动态网站的[最佳开源 CMS][1]列表。 + +#### 1、Jekyll + +![][2] + +Jekyll 是用 [Ruby][3] 写的最受欢迎的开源静态生成工具之一。实际上,Jekyll 是 [GitHub 页面][4] 的引擎,它可以让你免费用 GitHub 托管网站。 + +你可以很轻松地跨平台配置 Jekyll,包括 Ubuntu。它利用 [Markdown][5]、[Liquid][5](模板语言)、HTML 和 CSS 来生成静态的网页文件。如果你要搭建一个没有广告或推广自己工具或服务的产品页的博客网站,它是个不错的选择。 + +它还支持从常见的 CMS(内容管理系统Content management system)如 Ghost、WordPress、Drupal 7 迁移你的博客。你可以管理永久链接、类别、页面、文章,还可以自定义布局,这些功能都很强大。因此,即使你已经有了一个网站,如果你想转成静态网站,Jekyll 会是一个完美的解决方案。你可以参考[官方文档][6]或 [GitHub 页面][7]了解更多内容。 + +- [Jekyll][8] + +#### 2、Hugo + +![][9] + +Hugo 是另一个很受欢迎的用于搭建静态网站的开源框架。它是用 [Go 语言][10]写的。 + +它运行速度快、使用简单、可靠性高。如果你需要,它也可以提供更高级的主题。它还提供了一些有用的快捷方式来帮助你轻松完成任务。无论是组合展示网站还是博客网站,Hogo 都有能力管理大量的内容类型。 + +如果你想使用 Hugo,你可以参照它的[官方文档][11]或它的 [GitHub 页面][12]来安装以及了解更多相关的使用方法。如果需要的话,你还可以将 Hugo 部署在 GitHub 页面或任何 CDN 上。 + +- [Hugo][13] + +#### 3、Hexo + +![][14] + +Hexo 是一个有趣的开源框架,基于 [Node.js][15]。像其他的工具一样,你可以用它搭建相当快速的网站,不仅如此,它还提供了丰富的主题和插件。 + +它还根据用户的每个需求提供了强大的 API 来扩展功能。如果你已经有一个网站,你可以用它的[迁移][16]扩展轻松完成迁移工作。 + +你可以参照[官方文档][17]或 [GitHub 页面][18] 来使用 Hexo。 + +- [Hexo][19] + +#### 4、Gatsby + +![][20] + +Gatsby 是一个越来越流行的开源网站生成框架。它使用 [React.js][21] 来生成快速、界面优美的网站。 + +几年前在一个实验性的项目中,我曾经非常想尝试一下这个工具,它提供的成千上万的新插件和主题的能力让我印象深刻。与其他静态网站生成工具不同的是,你可以使用 Gatsby 生成一个网站,并在不损失任何功能的情况下获得静态网站的好处。 + +它提供了与很多流行的服务的整合功能。当然,你可以不使用它的复杂的功能,或将其与你选择的流行 CMS 配合使用,这也会很有趣。你可以查看他们的[官方文档][22]或它的 [GitHub 页面][23]了解更多内容。 + +- [Gatsby][24] + +#### 5、VuePress + +![][25] + +VuePress 是由 [Vue.js][26] 支持的静态网站生成工具,而 Vue.js 是一个开源的渐进式 JavaScript 框架。 + +如果你了解 HTML、CSS 和 JavaScript,那么你可以无压力地使用 VuePress。你应该可以找到几个有用的插件和主题来为你的网站建设开个头。此外,看起来 Vue.js 的更新一直很活跃,很多开发者都在关注 Vue.js,这是一件好事。 + +你可以参照他们的[官方文档][27]和 [GitHub 页面][28]了解更多。 + +- [VuePress][29] + +#### 6、Nuxt.js + +![][30] + +Nuxt.js 使用了 Vue.js 和 Node.js,但它致力于模块化,并且有能力依赖服务端而非客户端。不仅如此,它的目标是为开发者提供直观的体验,并提供描述性错误,以及详细的文档等。 + +正如它声称的那样,在你用来搭建静态网站的所有工具中,Nuxt.js 可以做到功能和灵活性两全其美。他们还提供了一个 [Nuxt 线上沙盒][31],让你不费吹灰之力就能直接测试它。 + +你可以查看它的 [GitHub 页面][32]和[官方网站][33]了解更多。 + +- [Nuxt.js][33] + +#### 7、Docusaurus + +![][34] + +Docusaurus 是一个有趣的开源静态网站生成工具,为搭建文档类网站量身定制。它还是 [Facebook 开源计划][35]的一个项目。 + +Docusaurus 是用 React 构建的。你可以使用所有的基本功能,像文档版本管理、文档搜索和翻译大多是预先配置的。如果你想为你的产品或服务搭建一个文档网站,那么可以试试 Docusaurus。 + +你可以从它的 [GitHub 页面][36]和它的[官网][37]获取更多信息。 + +- [Docusaurus][37] + +#### 8、Eleventy + +![][38] + +Eleventy 自称是 Jekyll 的替代品,旨在以更简单的方法来制作更快的静态网站。 + +它似乎很容易上手,而且它还提供了适当的文档来帮助你。如果你想找一个简单的静态网站生成工具,Eleventy 似乎会是一个有趣的选择。 + +你可以参照它的 [GitHub 页面][39]和[官网][40]来了解更多的细节。 + +- [Eleventy][40] + +#### 9、Publii + +![][41] + +Publii 是一个令人印象深刻的开源 CMS,它能使生成一个静态网站变得很容易。它是用 [Electron][42] 和 Vue.js 构建的。如果有需要,你也可以把你的文章从 WorkPress 网站迁移过来。此外,它还提供了与 GitHub 页面、Netlify 及其它类似服务的一键同步功能。 + +如果你利用 Publii 生成一个静态网站,你还可以得到一个所见即所得的编辑器。你可以从[官网][43]下载它,或者从它的 [GitHub 页面][44]了解更多信息。 + +- [Publii][43] + +#### 10、Primo + +![][45] + +一个有趣的开源静态网站生成工具,目前开发工作仍很活跃。虽然与其他的静态生成工具相比,它还不是一个成熟的解决方案,有些功能还不完善,但它是一个独特的项目。 + +Primo 旨在使用可视化的构建器帮你构建和搭建网站,这样你就可以轻松编辑和部署到任意主机上。 + +你可以参照[官网][46]或查看它的 [GitHub 页面][47]了解更多信息。 + +- [Primo][46] + +### 结语 + +还有很多文章中没有列出的网站生成工具。然而,我试图提到最好的静态生成器,为您提供最快的加载时间,最好的安全性和令人印象深刻的灵活性。 + +列表中没有你最喜欢的工具?在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/open-source-static-site-generators/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/open-source-cms/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/01/jekyll-screenshot.jpg?resize=800%2C450&ssl=1 +[3]: https://www.ruby-lang.org/en/ +[4]: https://pages.github.com/ +[5]: https://github.com/Shopify/liquid/wiki +[6]: https://jekyllrb.com/docs/ +[7]: https://github.com/jekyll/jekyll +[8]: https://jekyllrb.com/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/hugo.jpg?resize=800%2C414&ssl=1 +[10]: https://golang.org/ +[11]: https://gohugo.io/getting-started/ +[12]: https://github.com/gohugoio/hugo +[13]: https://gohugo.io/ +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/hexo.jpg?resize=800%2C213&ssl=1 +[15]: https://nodejs.org/en/ +[16]: https://hexo.io/api/migrator.html +[17]: https://hexo.io/docs/ +[18]: https://github.com/hexojs/hexo +[19]: https://hexo.io/ +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/gatsbyjs.png?resize=800%2C388&ssl=1 +[21]: https://reactjs.org/ +[22]: https://www.gatsbyjs.com/docs/ +[23]: https://github.com/gatsbyjs/gatsby +[24]: https://www.gatsbyjs.com/ +[25]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/VuePress.jpg?resize=800%2C498&ssl=1 +[26]: https://vuejs.org/ +[27]: https://vuepress.vuejs.org/guide/ +[28]: https://github.com/vuejs/vuepress +[29]: https://vuepress.vuejs.org/ +[30]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/nuxtjs.jpg?resize=800%2C415&ssl=1 +[31]: https://template.nuxtjs.org/ +[32]: https://github.com/nuxt/nuxt.js +[33]: https://nuxtjs.org/ +[34]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/docusaurus.jpg?resize=800%2C278&ssl=1 +[35]: https://opensource.facebook.com/ +[36]: https://github.com/facebook/docusaurus +[37]: https://docusaurus.io/ +[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/eleventy.png?resize=800%2C375&ssl=1 +[39]: https://github.com/11ty/eleventy/ +[40]: https://www.11ty.dev/ +[41]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/publii.jpg?resize=800%2C311&ssl=1 +[42]: https://www.electronjs.org +[43]: https://getpublii.com/ +[44]: https://github.com/GetPublii/Publii +[45]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/primo-af.jpg?resize=800%2C394&ssl=1 +[46]: https://primo.af/ +[47]: https://github.com/primo-app/primo-desktop diff --git a/published/202010/20200926 Linux Jargon Buster- What is FOSS (Free and Open Source Software)- What is Open Source.md b/published/202010/20200926 Linux Jargon Buster- What is FOSS (Free and Open Source Software)- What is Open Source.md new file mode 100644 index 0000000000..69af9d8b63 --- /dev/null +++ b/published/202010/20200926 Linux Jargon Buster- What is FOSS (Free and Open Source Software)- What is Open Source.md @@ -0,0 +1,129 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12748-1.html) +[#]: subject: (Linux Jargon Buster: What is FOSS \(Free and Open Source Software\)? What is Open Source?) +[#]: via: (https://itsfoss.com/what-is-foss/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是 FOSS(自由和开源软件)?什么是开源? +====== + +![][7] + +什么是 FOSS? + +在过去,我曾多次被问到这个问题,现在是时候解释一下什么是 Linux 和软件世界中的 FOSS 了。 + +这个区别很重要,因为 FOSS 是一个通用的词汇,它可以根据上下文的不同而有不同的含义。在这里,我讨论的是软件中的 FOSS 原则。 + +### 什么是 FOSS? + +FOSS 是指自由和开放源码软件Free and Open Source Software。这并不意味着软件是免费的。它意味着软件的源代码是开放的,任何人都可以自由使用、研究和修改代码。这个原则允许人们像一个社区一样为软件的开发和改进做出贡献。 + +#### FOSS 的起源 + +在上世纪 60、70 年代,计算机以硬件为主,硬件价格昂贵。它们主要由大学的学者或实验室的研究人员使用。以前有限的软件都是免费的,或者是带有它们的源代码,用户可以根据自己的需要修改源代码。 + +在上世纪 70 年代末和 80 年代初,制造商为了不让自己的软件在竞争对手的计算机上运行,停止了分发源代码。 + +这种限制性的许可导致了那些习惯和喜欢修改软件的人的不便和不喜。上世纪 80 年代中期,Richard Stallman 发起了自由软件运动Free Software Movement。 + +[Stallman 指明了一个软件要成为 FOSS 的四个基本自由][1]。 + +![自由软件自由][2] + +为了便于理解,我将它们重新表述: + + * 任何用户应能为任何目的运行软件。 + * 用户应能自由查看软件的源代码,如有需要,应允许用户修改代码。 + * 用户应能自由地将软件的副本分发给他人。 + * 如果用户修改了代码,她/他应该可以自由地将修改后的代码发布给他人。修改后的代码必须开放源代码。 + +如果有兴趣,我建议阅读这篇关于 [FOSS 的历史][3]的文章。 + +### FOSS 中的 “Free” 并不意味着免费 + +![][4] + +你可能已经注意到了,自由和开源软件中的 “Free” 并不意味着它是免费的,它意味着运行、修改和分发软件的“自由”。 + +人们经常错误地认为,FOSS 或开源软件不能有价格标签。这是不正确的。 + +大多数 FOSS 都是免费提供的,原因有很多: + + * 源代码已经向公众开放,所以一些开发者认为没有必要在下载软件时贴上价格标签。 + * 有些项目是由一些志愿者免费提供的。因此,主要的开发者认为对这么多人免费贡献的东西收费是不道德的。 + * 有些项目是由较大的企业或非营利组织支持和/或开发的,这些组织会雇佣开发人员在他们的开源项目上工作。 + * 有些开发者创建开源项目是出于兴趣,或者出于他们对用代码为世界做贡献的热情。对他们来说,下载量、贡献和感谢的话比金钱更重要。 + +为了避免强调 “免费”,有些人使用了 FLOSS 这个词(LCTT 译注:有时候也写作 F/LOSS)。FLOSS 是自由和开源软件Free/Libre Open Source Software的缩写。单词 Libre(意为自由)与 gartuit/gratis(免费)不同。 + +> “Free” 是言论自由的自由,而不是免费啤酒的免费。 + +### FOSS 项目如何赚钱? + +开源项目不赚钱是一个神话。红帽是第一个达到 10 亿美元大关的开源公司。[IBM 以 340 亿美元收购了红帽][5]。这样的例子有很多。 + +许多开源项目,特别是企业领域的项目,都会提供收费的支持和面向企业的功能。这是红帽、SUSE Linux 和更多此类项目的主要商业模式。 + +一些开源项目,如 Discourse、WordPress 等,则提供其软件的托管实例,并收取一定的费用。 + +许多开源项目,特别是桌面应用程序,依靠捐赠。VLC、GIMP、Inkscape 等这类开源软件就属于这一类。有[资助开源项目的方法][6],但通常,你会在项目网站上找到捐赠链接。 + +利用开源软件赚钱可能很难,但也不是完全不可能。 + +### 但我不是程序员,我为什么要关心一个软件是否开源? + +这是一个合理的问题。你不是一个软件开发者,只是一个普通的计算机用户。即使软件的源代码是可用的,你也不会理解程序的工作原理。 + +这很好。你不会明白,但有必要技能的人就会明白,这才是最重要的。 + +你可以这样想。也许你不会理解一份复杂的法律文件。但如果你有看文件的自由,并保留一份副本,你就可以咨询某个人,他可以检查文件中的法律陷阱。 + +换句话说,开源软件具有透明度。 + +### FOSS 与开源之间的区别是什么? + +你会经常遇到 FOSS 和开源Open Source的术语。它们经常被互换使用。 + +它们是同一件事吗?这很难用“是”和“不是”来回答。 + +你看,FOSS 中的“Free”一词让很多人感到困惑,因为人们错误地认为它是免费的。企业高管、高层和决策者往往会关注自由和开源中的“免费”。由于他们是商业人士,专注于为他们的公司赚钱,“自由”一词在采用 FOSS 原则时起到了威慑作用。 + +这就是为什么在上世纪 90 年代中期创立了一个名为[开源促进会][8]Open Source Initiative的新组织。他们从自由和开放源码软件中去掉了“自由”一词,并创建了自己的[开放源码的定义][9],以及自己的一套许可证。 + +“开源Open Source”一词在软件行业特别流行。高管们对开源更加适应。开源软件的采用迅速增长,我相信 “免费”一词的删除确实起到了作用。 + +### 有问题吗? + +这正如我在[什么是 Linux 发行版][10]一文中所解释的那样,FOSS/开源的概念在 Linux 的发展和普及中起到了很大的作用。 + +我试图在这篇黑话解释文章中用更简单的语言解释 FOSS 和开源的概念,而试图避免在细节或技术精度上做过多的阐述。 + +我希望你现在对这个话题有了更好的理解。如果你有问题或建议,欢迎留言并继续讨论。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/what-is-foss/ + +作者:[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://www.gnu.org/philosophy/free-sw.html +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/foss-freedoms.jpg?resize=800%2C671&ssl=1 +[3]: https://itsfoss.com/history-of-foss/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/think-free-speech-not-free-beer.jpg?resize=800%2C800&ssl=1 +[5]: https://itsfoss.com/ibm-red-hat-acquisition/ +[6]: https://itsfoss.com/open-source-funding-platforms/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/what-is-foss.png?resize=800%2C450&ssl=1 +[8]: https://opensource.org/ +[9]: https://opensource.org/osd +[10]: https://itsfoss.com/what-is-linux-distribution/ diff --git a/published/202010/20200928 Create template files in GNOME.md b/published/202010/20200928 Create template files in GNOME.md new file mode 100644 index 0000000000..932b6d352c --- /dev/null +++ b/published/202010/20200928 Create template files in GNOME.md @@ -0,0 +1,72 @@ +[#]: collector: (lujun9972) +[#]: translator: (rakino) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12699-1.html) +[#]: subject: (Create template files in GNOME) +[#]: via: (https://opensource.com/article/20/9/gnome-templates) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) + +在 GNOME 中创建文档模板 +====== + +> 制作模板可以让你更快地开始写作新的文档。 + +![](https://img.linux.net.cn/data/attachment/album/202010/08/215333mgqpiuqufhgidfpz.jpg) + +我只是偶然发现了 [GNOME][2] 的一个新功能(对我来说是的):创建文档模版。模版template也被称作样版文件boilerplate,一般是有着特定格式的空文档,例如律师事务所的信笺,在其顶部有着律所的名称和地址;另一个例子是银行以及保险公司的保函,在其底部页脚包含着某些免责声明。由于这类信息很少改变,你可以把它们添加到空文档中作为模板使用。 + +一天,在浏览我的 Linux 系统文件的时候,我点击了模板Templates文件夹,然后刚好发现窗口的上方有一条消息写着:“将文件放入此文件夹并用作新文档的模板”,以及一个“获取详情……” 的链接,打开了模板的 [GNOME 帮助页面][3]。 + +![Message at top of Templates folder in GNOME Desktop][4] + +### 创建模板 + +在 GNOME 中创建模板非常简单。有几种方法可以把文件放进模板文件夹里:你既可以通过图形用户界面(GUI)或是命令行界面(CLI)从另一个位置复制或移动文件,也可以创建一个全新的文件;我选择了后者,实际上,我创建了两个文件。 + +![My first two GNOME templates][6] + +我的第一份模板是为 Opensource.com 的文章准备的,它有一个输入标题的位置以及关于我的名字和文章使用的许可证的几行。我的文章使用 Markdown 格式,所以我将模板创建为了一个新的 Markdown 文档——`Opensource.com Article.md`: + +```` +# Title     +``` +An article for Opensource.com +by: Alan Formy-Duval +Creative Commons BY-SA 4.0 +``` + +```` + +我将这份文档保存在了 `/home/alan/Templates` 文件夹内,现在 GNOME 就可以将这个文件识别为模板,并在我要创建新文档的时候提供建议了。 + +### 使用模板 + +每当我有了新文章的灵感的时候,我只需要在我计划用来组织内容的文件夹里单击右键,然后从新建文档New Document列表中选择我想要的模板就可以开始了。 + +![Select the template by name][7] + +你可以为各种文档或文件制作模板。我写这篇文章时使用了我为 Opensource.com 的文章创建的模板。程序员可能会把模板用于软件代码,这样的话也许你想要只包含 `main()` 的模板。 + +GNOME 桌面环境为 Linux 及相关操作系统的用户提供了一个非常实用、功能丰富的界面。你最喜欢的 GNOME 功能是什么,你又是怎样使用它们的呢?请在评论中分享~ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/gnome-templates + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[rakino](https://github.com/rakino) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_desk_home_laptop_browser.png?itok=Y3UVpY0l (Digital images of a computer desktop) +[2]: https://www.gnome.org/ +[3]: https://help.gnome.org/users/gnome-help/stable/files-templates.html.en +[4]: https://opensource.com/sites/default/files/uploads/gnome-message_at_top_border.png (Message at top of Templates folder in GNOME Desktop) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/gnome-first_two_templates_border.png (My first two GNOME templates) +[7]: https://opensource.com/sites/default/files/uploads/gnome-new_document_menu_border.png (Select the template by name) diff --git a/published/202010/20200928 How to Use the Firefox Task Manager (to Find and Kill RAM and CPU Eating Tabs and Extensions).md b/published/202010/20200928 How to Use the Firefox Task Manager (to Find and Kill RAM and CPU Eating Tabs and Extensions).md new file mode 100644 index 0000000000..7fbd012005 --- /dev/null +++ b/published/202010/20200928 How to Use the Firefox Task Manager (to Find and Kill RAM and CPU Eating Tabs and Extensions).md @@ -0,0 +1,91 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12708-1.html) +[#]: subject: (How to Use the Firefox Task Manager \(to Find and Kill RAM and CPU Eating Tabs and Extensions\)) +[#]: via: (https://itsfoss.com/firefox-task-manager/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +如何使用 Firefox 任务管理器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/11/103209cc1l7ktc7asacjhe.jpg) + +> 查找并杀死占用内存和 CPU 的标签页和扩展程序 + +Firefox 在 Linux 用户中很受欢迎。它是几个 Linux 发行版上的默认 Web 浏览器。 + +在它所提供的许多功能之中,Firefox 也提供了一个自己的任务管理器。 + +不过,在 Linux 中既然你有[任务管理器][1]这种形式的[系统监控工具][2],为什么还要使用 Firefox 的呢?这里有个很好的理由。 + +假设你的系统占用了太多的内存或 CPU。如果你使用 `top` 或其他一些系统[资源监控工具,如 Glances][3],你会发现这些工具无法区分是哪个打开的标签或扩展占用了资源。 + +通常情况下,每个 Firefox 标签页都显示为 “Web 内容Web Content”。你可以看到是某个 Firefox 进程导致了这个问题,但这无法准确判断是哪个标签页或扩展。 + +这时你可以使用 Firefox 任务管理器。让我来告诉你怎么做! + +### Firefox 任务管理器 + +有了 Firefox 任务管理器,你就可以列出所有消耗系统资源的标签页、跟踪器和附加组件。 + +![][4] + +正如你在上面的截图中所看到的,你会看到标签页的名称、类型(标签或附加组件)、能源影响和消耗的内存。 + +其它的都不言自明,但**“能源影响”指的是 CPU 的使用**,如果你使用的是笔记本电脑,它是一个很好的指标,可以告诉你什么东西会更快耗尽电池电量。 + +#### 在 Firefox 中访问任务管理器 + +令人意外的是,任务管理器没有 [Firefox 键盘快捷键][5]。 + +要快速启动 Firefox 任务管理器,可以在地址栏中输入 `about:performance`,如下图所示。 + +![Quickly access task manager in Firefox][6] + +另外,你也可以点击“菜单”图标,然后进入“更多”选项,如下截图所示。 + +![Accessing task manager in Firefox][7] + +接下来,你会发现选择“任务管理器”的选项,只需点击它就行。 + +![][8] + +#### 使用 Firefox 任务管理器 + +到这后,你可以检查资源的使用情况,展开标签页来查看跟踪器和它的使用情况,也可以选择关闭标签,如下截图高亮所示。 + +![][9] + +以下是你应该知道的: + + * “能源影响”指的是 CPU 消耗。 + * 子框架或子任务通常是与需要在后台运行的标签相关联的跟踪器/脚本。 + +通过这个任务管理器,你可以发现网站上的流氓脚本,以及它是否导致你的浏览器变慢。 + +这并不是什么 高科技,但并不是所有人都知道 Firefox 任务管理器。现在你知道了,它应该很方便,你觉得呢? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/firefox-task-manager/ + +作者:[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://itsfoss.com/task-manager-linux/ +[2]: https://itsfoss.com/linux-system-monitoring-tools/ +[3]: https://itsfoss.com/glances/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/firefox-task-manager-shot.png?resize=800%2C519&ssl=1 +[5]: https://itsfoss.com/firefox-keyboard-shortcuts/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/firefox-url-performance.jpg?resize=800%2C357&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/firefox-task-manager-steps.jpg?resize=800%2C779&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/firefox-task-manager-menu.jpg?resize=800%2C465&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/firefox-task-manager-close-tab.png?resize=800%2C496&ssl=1 diff --git a/published/202010/20200928 How to view information on your Linux devices with lshw.md b/published/202010/20200928 How to view information on your Linux devices with lshw.md new file mode 100644 index 0000000000..b2a76f2661 --- /dev/null +++ b/published/202010/20200928 How to view information on your Linux devices with lshw.md @@ -0,0 +1,269 @@ +[#]: collector: (lujun9972) +[#]: translator: (rakino) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12702-1.html) +[#]: subject: (How to view information on your Linux devices with lshw) +[#]: via: (https://www.networkworld.com/article/3583598/how-to-view-information-on-your-linux-devices-with-lshw.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +如何使用 lshw 查看 Linux 设备信息 +====== + +> Linux 系统上的 lshw 命令提供的系统设备信息比我们大多数人想象的要多得多。 + +![Kali Linux logo / gears / binary data][1] + +虽然 `lshw` 命令(列出硬件list hardware,读作 “ls hardware”)远不是每个人最先学会的 50 个 Linux 命令之一,但它可以提供很多系统硬件的有用信息。 + +它以一种相当易于理解的格式提取出可能比你知道的更多的信息。在看到描述、(设备)逻辑名称、大小等以后,你可能会理解到自己能获得多少信息。 + +这篇文章会研究 `lshw` 给出的信息,但侧重于磁盘及相关硬件。下面是 `lshw` 的输出示例: + +``` +$ sudo lshw -C disk + *-disk:0 + description: SCSI Disk + product: Card Reader-1 + vendor: JIE LI + physical id: 0.0.0 + bus info: scsi@4:0.0.0 + logical name: /dev/sdc + version: 1.00 + capabilities: removable + configuration: logicalsectorsize=512 sectorsize=512 + *-medium + physical id: 0 + logical name: /dev/sdc +``` + +请注意,你需要使用 `sudo` 运行 `lshw` 命令以确保能得到所有可用的信息。 + +虽然我们在上面的命令中要求了输出“磁盘(`disk`)”(上面只包含了原始输出里五个条目中的一个),这里的输出却不是一个硬盘,而是读卡器——磁盘的一种。注意系统将这个设备命名为了 `/dev/sdc`。 + +系统的主磁盘上也有相似的信息: + +``` +*-disk + description: ATA Disk + product: SSD2SC120G1CS175 + physical id: 0 + bus info: scsi@0:0.0.0 + logical name: /dev/sda <==这里 + version: 1101 + serial: PNY20150000778410606 + size: 111GiB (120GB) + capabilities: partitioned partitioned:dos + configuration: ansiversion=5 logicalsectorsize=512 sectorsize=512 signature= + f63b5929 +``` + +这块硬盘是 `/dev/sda`。这个系统上的硬盘都显示为 `ATA` 磁盘,`ATA` 是一种把控制器与盘体集成在一起的磁盘驱动器实现。 + +要获得“磁盘”类设备的简略列表,可以运行下面这条命令。注意其中有两个设备被列出了两次,所以我们看到的仍然是五个磁盘设备。 + +``` +$ sudo lshw -short -C disk +H/W path Device Class Description +============================================================= +/0/100/1d/1/1/0.0.0 /dev/sdc disk Card Reader-1 +/0/100/1d/1/1/0.0.0/0 /dev/sdc disk +/0/100/1d/1/1/0.0.1 /dev/sdd disk 2 +/0/100/1d/1/1/0.0.1/0 /dev/sdd disk +/0/100/1f.2/0 /dev/sda disk 120GB SSD2SC120G1CS175 +/0/100/1f.2/1 /dev/cdrom disk DVD+-RW GSA-H73N +/0/100/1f.5/0.0.0 /dev/sdb disk 500GB SAMSUNG HE502HJ +``` + +如果你决定要查看系统上的 **所有** 设备,请坐稳了;你会得到一个包含的东西比你通常认为的“设备”要多得多的列表,下面是一个例子,这是一个“简短(`short`)”(信息很少)的列表: + +``` +$ sudo lshw -short +[sudo] password for shs: +H/W path Device Class Description +============================================================= + system Inspiron 530s +/0 bus 0RY007 +/0/0 memory 128KiB BIOS +/0/4 processor Intel(R) Core(TM)2 Duo CPU +/0/4/a memory 32KiB L1 cache +/0/4/b memory 6MiB L2 cache +/0/24 memory 6GiB System Memory +/0/24/0 memory 2GiB DIMM DDR2 Synchronous 667 +/0/24/1 memory 1GiB DIMM DDR2 Synchronous 667 +/0/24/2 memory 2GiB DIMM DDR2 Synchronous 667 +/0/24/3 memory 1GiB DIMM DDR2 Synchronous 667 +/0/1 generic +/0/10 generic +/0/11 generic +/0/12 generic +/0/13 generic +/0/14 generic +/0/15 generic +/0/17 generic +/0/18 generic +/0/19 generic +/0/2 generic +/0/20 generic +/0/100 bridge 82G33/G31/P35/P31 Express DRAM +/0/100/1 bridge 82G33/G31/P35/P31 Express PCI +/0/100/1/0 display Caicos [Radeon HD 6450/7450/84 +/0/100/1/0.1 multimedia Caicos HDMI Audio [Radeon HD 6 +/0/100/19 enp0s25 network 82562V-2 10/100 Network Connec +/0/100/1a bus 82801I (ICH9 Family) USB UHCI +/0/100/1a/1 usb3 bus UHCI Host Controller +/0/100/1a.1 bus 82801I (ICH9 Family) USB UHCI +/0/100/1a.1/1 usb4 bus UHCI Host Controller +/0/100/1a.1/1/2 input Rock Candy Wireless Keyboard +/0/100/1a.2 bus 82801I (ICH9 Family) USB UHCI +/0/100/1a.2/1 usb5 bus UHCI Host Controller +/0/100/1a.2/1/2 input USB OPTICAL MOUSE +/0/100/1a.7 bus 82801I (ICH9 Family) USB2 EHCI +/0/100/1a.7/1 usb1 bus EHCI Host Controller +/0/100/1b multimedia 82801I (ICH9 Family) HD Audio +/0/100/1d bus 82801I (ICH9 Family) USB UHCI +/0/100/1d/1 usb6 bus UHCI Host Controller +/0/100/1d/1/1 scsi4 storage CD04 +/0/100/1d/1/1/0.0.0 /dev/sdc disk Card Reader-1 +/0/100/1d/1/1/0.0.0/0 /dev/sdc disk +/0/100/1d/1/1/0.0.1 /dev/sdd disk 2 +/0/100/1d/1/1/0.0.1/0 /dev/sdd disk +/0/100/1d.1 bus 82801I (ICH9 Family) USB UHCI +/0/100/1d.1/1 usb7 bus UHCI Host Controller +/0/100/1d.2 bus 82801I (ICH9 Family) USB UHCI +/0/100/1d.2/1 usb8 bus UHCI Host Controller +/0/100/1d.7 bus 82801I (ICH9 Family) USB2 EHCI +/0/100/1d.7/1 usb2 bus EHCI Host Controller +/0/100/1d.7/1/2 multimedia USB Live camera +/0/100/1e bridge 82801 PCI Bridge +/0/100/1e/1 communication HSF 56k Data/Fax Modem +/0/100/1f bridge 82801IR (ICH9R) LPC Interface +/0/100/1f.2 scsi0 storage 82801IR/IO/IH (ICH9R/DO/DH) 4 +/0/100/1f.2/0 /dev/sda disk 120GB SSD2SC120G1CS175 +/0/100/1f.2/0/1 /dev/sda1 volume 111GiB EXT4 volume +/0/100/1f.2/1 /dev/cdrom disk DVD+-RW GSA-H73N +/0/100/1f.3 bus 82801I (ICH9 Family) SMBus Con +/0/100/1f.5 scsi3 storage 82801I (ICH9 Family) 2 port SA +/0/100/1f.5/0.0.0 /dev/sdb disk 500GB SAMSUNG HE502HJ +/0/100/1f.5/0.0.0/1 /dev/sdb1 volume 433GiB EXT4 volume +/0/3 system PnP device PNP0c02 +/0/5 system PnP device PNP0b00 +/0/6 storage PnP device PNP0700 +/0/7 system PnP device PNP0c02 +/0/8 system PnP device PNP0c02 +/0/9 system PnP device PNP0c01 +``` + +运行下面的命令来列出设备类别,并统计每个类别中的设备数量。 + +``` +$ sudo lshw -short | awk ‘{print substr($0,36,13)}’ | tail -n +3 | sort | uniq -c + 4 bridge + 18 bus + 1 communication + 7 disk + 1 display + 12 generic + 2 input + 8 memory + 3 multimedia + 1 network + 1 processor + 4 storage + 6 system + 2 volume +``` + +**注意:** 上面使用 `awk` 命令从 `lshw` 的输出中选择 Class(类别)栏是这样实现的:使用 `$0`(选取完整行),但只取从正确位置(第 36 个字符)开始的子串,而因为“类别”中并没有条目的长度超过 13 个字符,所以子串就在那里结束。命令中 `tail -n +3` 的部分移除了标题和下面的`=====`,所以最终的列表中只包含了那 14 种设备类型。 + +(LCTT 译注:上面的命令中 `awk` 的部分在选取子串时是从第 36 个字符开始的,这个数字基本上取决于最长的设备逻辑名称的长度,因而在不同的系统环境中可能有所不同,一个例子是,当你的系统上有 NVMe SSD 时,可能需要将其改为 41。) + +你会发现在没有使用 `-short` 选项的时候,每一个磁盘类设备都会有大约 12 行的输出,包括像是 `/dev/sda` 这样的逻辑名称,磁盘大小和种类等等。 + +``` +$ sudo lshw -C disk +[sudo] password for shs: + *-disk:0 + description: SCSI Disk + product: Card Reader-1 <== 读卡器? + vendor: JIE LI + physical id: 0.0.0 + bus info: scsi@4:0.0.0 + logical name: /dev/sdc + version: 1.00 + capabilities: removable + configuration: logicalsectorsize=512 sectorsize=512 + *-medium + physical id: 0 + logical name: /dev/sdc + *-disk:1 + description: SCSI Disk + product: 2 + vendor: AC4100 - + physical id: 0.0.1 + bus info: scsi@4:0.0.1 + logical name: /dev/sdd + capabilities: removable + configuration: logicalsectorsize=512 sectorsize=512 + *-medium + physical id: 0 + logical name: /dev/sdd + *-disk + description: ATA Disk + product: SSD2SC120G1CS175 + physical id: 0 + bus info: scsi@0:0.0.0 + logical name: /dev/sda <== 主要磁盘 + version: 1101 + serial: PNY20150000778410606 + size: 111GiB (120GB) + capabilities: partitioned partitioned:dos + configuration: ansiversion=5 logicalsectorsize=512 sectorsize=512 signature=f63b5929 + *-cdrom <== 也叫 /dev/sr0 + description: DVD writer + product: DVD+-RW GSA-H73N + vendor: HL-DT-ST + physical id: 1 + bus info: scsi@1:0.0.0 + logical name: /dev/cdrom + logical name: /dev/cdrw + logical name: /dev/dvd + logical name: /dev/dvdrw + logical name: /dev/sr0 + version: B103 + serial: [ + capabilities: removable audio cd-r cd-rw dvd dvd-r + configuration: ansiversion=5 status=nodisc + *-disk + description: ATA Disk + product: SAMSUNG HE502HJ + physical id: 0.0.0 + bus info: scsi@3:0.0.0 + logical name: /dev/sdb <== 次要磁盘 + version: 0002 + serial: S2B6J90B501053 + size: 465GiB (500GB) + capabilities: partitioned partitioned:dos + configuration: ansiversion=5 logicalsectorsize=512 sectorsize=512 signature=7e67ccf3 +``` + +### 总结 + +`lshw` 命令提供了一些我们许多人通常不会处理的信息,不过即使你只用了其中的一部分,知道有多少信息可用还是很不错的。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3583598/how-to-view-information-on-your-linux-devices-with-lshw.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[rakino](https://github.com/rakino) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2020/02/kali_linux_tools_abstract_gears_binary_data_by_nevarpp_gettyimages-688718788_2400x1600-100832674-large.jpg +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/published/202010/20200929 Drawing is an Open Source MS-Paint Type of App for Linux Desktop.md b/published/202010/20200929 Drawing is an Open Source MS-Paint Type of App for Linux Desktop.md new file mode 100644 index 0000000000..2c998c10ba --- /dev/null +++ b/published/202010/20200929 Drawing is an Open Source MS-Paint Type of App for Linux Desktop.md @@ -0,0 +1,119 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12712-1.html) +[#]: subject: (Drawing is an Open Source MS-Paint Type of App for Linux Desktop) +[#]: via: (https://itsfoss.com/drawing-app/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Drawing:一款开源的类似微软画图的 Linux 桌面应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/12/231731q0pgrkzidsguosps.jpg) + +> Drawing 是一个基本的图像编辑器,就像微软画图一样。有了这个开源的应用,你可以画箭头、线条、几何图形、添加颜色和其他你期望在普通绘图应用程序中做的事情。 + +### Drawing: 一个简单的 Linux 绘图应用 + +![][1] + +对于从 Windows XP (或更早版本)开始使用电脑的人来说,微软画图Paint是一个有趣的应用,是个可以随便画一些草图的应用。在这个被 Photoshop 和 GIMP 主导的世界里,画图应用仍然具有一定的现实意义。 + +有几个[可用于 Linux 的绘画应用][2],我打算在这个列表中再添加一个。 + +这款应用不出意外地叫做 [Drawing][3],你可以在 Linux 桌面和 Linux 智能手机上使用它。 + +### Drawing 应用的功能 + +![][4] + +Drawing 拥有你所期待的绘图应用的所有功能。你可以: + + * 从头开始创建新的绘图 + * 编辑现有的 PNG、JPEG 或 BMP 图像文件 + * 添加几何图形、线条、箭头等 + * 虚线 + * 使用铅笔工具进行自由手绘 + * 使用曲线和形状工具 + * 裁剪图像 + * 缩放图像到不同的像素大小 + * 添加文本 + * 选择图像的一部分(矩形、自由选择和颜色选择) + * 旋转图像 + * 添加复制到剪贴板的图像 + * 可在偏好中使用橡皮擦、荧光笔、油漆桶、颜色选择、颜色选择器工具 + * 无限撤销 + * 滤镜可以增加模糊、像素化、透明度等 + +### 我使用 Drawing 的经验 + +![][5] + +这个应用是新出现的,并且有不错的用户界面。它具有你期望在标准的绘画应用中找到的所有基本功能。 + +它有一些额外的工具,如颜色选择和拾色器,但在使用时可能会混淆。没有什么文档描述这些工具的使用,要全靠你自己摸索。 + +它的体验很流畅,作为图像编辑工具,我觉得这个工具很有潜力取代 Shutter (是的,我[用 Shutter 编辑截图][6])。 + +我觉得最麻烦的是,添加元素后无法编辑/修改。你有撤消和重做选项,但如果你想修改一个你在 12 步前添加的文本,你就必须重做所有的步骤。这是未来的版本中开发者可能要做的一些改进。 + +### 在 Linux 上安装 Drawing + +这是一款 Linux 专属应用。它也适用于基于 Linux 的智能手机,如 [PinePhone][7]。 + +有多种方式可以安装 Drawing。它在许多主要的 Linux 发行版的仓库中都有。 + +#### 基于 Ubuntu 的发行版 + +Drawing 包含在 Ubuntu 的 universe 仓库中,这意味着你可以从 Ubuntu 软件中心安装它。 + +但是,如果你想要最新的版本,有一个 [PPA][8] 可以轻松地在 Ubuntu、Linux Mint 和其他基于 Ubuntu 的发行版上安装 Drawing。 + +使用下面的命令: + +``` +sudo add-apt-repository ppa:cartes/drawing +sudo apt update +sudo apt install drawing +``` + +如果你想删除它,你可以使用以下命令: + +``` +sudo apt remove drawing +sudo add-apt-repository -r ppa:cartes/drawing +``` + +#### 其他 Linux 发行版 + +检查你的发行版的包管理器中是否有 Drawing,然后在那里安装。如果你想要最新的版本,你可以使用 Flatpak 版本的应用。 + +- [Drawing Flatpak][9] + +### 总结 + +你还在用画图应用么?你用的是哪一款?如果你已经尝试过 Drawing,你的体验如何? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/drawing-app/ + +作者:[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://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/drawing-app-interface.jpg?resize=789%2C449&ssl=1 +[2]: https://itsfoss.com/open-source-paint-apps/ +[3]: https://maoschanz.github.io/drawing/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/drawing-screenshot.jpg?resize=800%2C489&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/using-drawing-app-linux.png?resize=787%2C473&ssl=1 +[6]: https://itsfoss.com/install-shutter-ubuntu/ +[7]: https://itsfoss.com/pinephone/ +[8]: https://launchpad.net/~cartes/+archive/ubuntu/drawing +[9]: https://flathub.org/apps/details/com.github.maoschanz.drawing diff --git a/published/202010/20200930 Present Slides in Linux Terminal With This Nifty Python Tool.md b/published/202010/20200930 Present Slides in Linux Terminal With This Nifty Python Tool.md new file mode 100644 index 0000000000..d780724635 --- /dev/null +++ b/published/202010/20200930 Present Slides in Linux Terminal With This Nifty Python Tool.md @@ -0,0 +1,101 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12719-1.html) +[#]: subject: (Present Slides in Linux Terminal With This Nifty Python Tool) +[#]: via: (https://itsfoss.com/presentation-linux-terminal/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +在 Linux 终端中展示幻灯片 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/15/000226j34xnkzzg7z7x9ka.jpg) + +演示文稿往往是枯燥的。这就是为什么有些人会添加动画或漫画/meme 来增加一些幽默和风格来打破单调。 + +如果你需要在你的大学或公司的演示文稿中加入一些独特的风格,那么使用 Linux 终端怎么样?想象一下,这将是多么酷的事情啊! + +### Present:Linux 终端中进行演示 + +在终端中可以做很多[有趣好玩的事情][1]。制作和展示幻灯片只是其中之一。 + +这个基于 Python 的应用名为 [Present][2],它可以让你创建基于 Markdown 和 YML 的幻灯片,你可以在你的大学或公司里演讲,并以真正的极客风格取悦人们。 + +我制作了一个视频,展示了在 Linux 终端中用 Present 演示一些东西的样子。 + +- [VIDEO](https://img.linux.net.cn/static/video/Makes%20ASCII%20Based%20Presentation%20Slides%20in%20Linux%20terminal-462902030.mp4) + +#### Present 的功能 + +你可以用 Present 做以下事情: + + * 使用 Markdown 语法在幻灯片中添加文本 + * 用箭头或 `PgUp`/`Down` 键控制幻灯片 + * 改变前景和背景颜色 + * 在幻灯片中添加图像 + * 增加代码块 + * 播放模拟代码,并用 codio YML 文件输出 + +#### 在 Linux 上安装 Present + +Present 是一个基于 Python 的工具,你可以使用 PIP 来安装它。你应该确保用这个命令[在 Ubuntu 上安装 Pip][4]: + +``` +sudo apt install python3-pip +``` + +如果你使用的是其他发行版,请检查你的包管理器来安装 PIP3。 + +安装 PIP 后,你就可以以这种方式全局安装 Present: + +``` +sudo pip3 install present +``` + +你也可以只为当前用户安装,但你也必须将 `~/.local/bin` 添加到你的 `PATH` 环境变量。 + +#### 在 Linux 终端中使用 Present 来创建和展示幻灯片 + +![][5] + +由于 Present 使用了 Markdown 语法,你应该用它来创建自己的幻灯片。在这里使用 [Markdown 编辑器][6]会有帮助。 + +Present 需要一个 Markdown 文件来读取和播放幻灯片。你可以[下载这个示例幻灯片][7],但你需要单独下载嵌入的图像,并将它放在图像文件夹内。 + + * 在 Markdown 文件中使用 `—` 来分隔幻灯片。 + * 使用 Markdown 语法在幻灯片中添加文本。 + * 使用以下语法添加图片 `![RC] (images/name.png)`。 + * 通过添加像 `` 这样的语法来改变幻灯片的颜色。 + * 使用像 `` 这样的语法来添加带有效果的幻灯片。 + * 使用 [codio 语法][8] 添加代码运行模拟。 + * 使用 `q` 退出演示,并用左/右箭头或 `PgUp`/`Down` 键控制幻灯片。 + +请记住,在演示时调整终端窗口的大小会把东西搞乱,按回车键也是如此。 + +### 总结 + +如果你熟悉 Markdown 和终端,使用 Present 对你来说并不困难。 + +你不能把它和常规的用 Impress、MS Office 等制作的幻灯片相比,但偶尔使用,它是一个很酷的工具。如果你是计算机科学/网络专业的学生,或者是开发人员或系统管理员,你的同事一定会觉得很有趣。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/presentation-linux-terminal/ + +作者:[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/funny-linux-commands/ +[2]: https://github.com/vinayak-mehta/present +[4]: https://itsfoss.com/install-pip-ubuntu/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/presentation-in-linux-terminal.png?resize=800%2C494&ssl=1 +[6]: https://itsfoss.com/best-markdown-editors-linux/ +[7]: https://github.com/vinayak-mehta/present/blob/master/examples/sample.md +[8]: https://present.readthedocs.io/en/latest/codio.html diff --git a/published/202010/20200930 Recovering deleted files on Linux with testdisk.md b/published/202010/20200930 Recovering deleted files on Linux with testdisk.md new file mode 100644 index 0000000000..c8c8e0dac0 --- /dev/null +++ b/published/202010/20200930 Recovering deleted files on Linux with testdisk.md @@ -0,0 +1,201 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12674-1.html) +[#]: subject: (Recovering deleted files on Linux with testdisk) +[#]: via: (https://www.networkworld.com/article/3575524/recovering-deleted-files-on-linux-with-testdisk.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +用 testdisk 恢复 Linux 上已删除的文件 +====== + +> 这篇文章介绍了 testdisk,这是恢复最近删除的文件(以及用其他方式修复分区)的工具之一,非常方便。 + +![](https://images.idgesg.net/images/article/2018/01/survival_life-preserver_risk_swimming_rescue-100747102-large.jpg) + +当你在 Linux 系统上删除一个文件时,它不一定会永远消失,特别是当你最近才刚刚删除了它的时候。 + +除非你用 `shred` 等工具把它擦掉,否则数据仍然会放在你的磁盘上 —— 而恢复已删除文件的最佳工具之一 `testdisk` 可以帮助你拯救它。虽然 `testdisk` 具有广泛的功能,包括恢复丢失或损坏的分区和使不能启动磁盘可以重新启动,但它也经常被用来恢复被误删的文件。 + +在本篇文章中,我们就来看看如何使用 `testdisk` 恢复已删除的文件,以及该过程中的每一步是怎样的。由于这个过程需要不少的步骤,所以当你做了几次之后,你可能会觉得操作起来会更加得心应手。 + +### 安装 testdisk + +可以使用 `apt install testdisk` 或 `yum install testdisk` 等命令安装 `testdisk`。有趣的是,它不仅是一个 Linux 工具,而且还适用于 MacOS、Solaris 和 Windows。 + +文档可在 [cgsecurity.org][1] 中找到。 + +### 恢复文件 + +首先,你必须以 `root` 身份登录,或者有 `sudo` 权限才能使用 `testdisk`。如果你没有 `sudo` 访问权限,你会在这个过程一开始就被踢出,而如果你选择创建了一个日志文件的话,最终会有这样的消息: + +``` +TestDisk exited normally. +jdoe is not in the sudoers file. This incident will be reported. +``` + +当你用 `testdisk` 恢复被删除的文件时,你最终会将恢复的文件放在你启动该工具的目录下,而这些文件会属于 `root`。出于这个原因,我喜欢在 `/home/recovery` 这样的目录下启动。一旦文件被成功地还原和验证,就可以将它们移回它们的所属位置,并将它们的所有权也恢复。 + +在你可以写入的选定目录下开始: + +``` +$ cd /home/recovery +$ testdisk +``` + +`testdisk` 提供的第一页信息描述了该工具并显示了一些选项。至少在刚开始,创建个日志文件是个好主意,因为它提供的信息可能会被证明是有用的。下面是如何做的: + +``` +Use arrow keys to select, then press Enter key: +>[ Create ] Create a new log file + [ Append ] Append information to log file + [ No Log ] Don’t record anything +``` + +左边的 `>` 以及你看到的反转的字体和背景颜色指出了你按下回车键后将使用的选项。在这个例子中,我们选择了创建日志文件。 + +然后会提示你输入密码(除非你最近使用过 `sudo`)。 + +下一步是选择被删除文件所存储的磁盘分区(如果没有高亮显示的话)。根据需要使用上下箭头移动到它。然后点两次右箭头,当 “Proceed” 高亮显示时按回车键。 + +``` +Select a media (use Arrow keys, then press Enter): + Disk /dev/sda - 120 GB / 111 GiB - SSD2SC120G1CS1754D117-551 +>Disk /dev/sdb - 500 GB / 465 GiB - SAMSUNG HE502HJ + Disk /dev/loop0 - 13 MB / 13 MiB (RO) + Disk /dev/loop1 - 101 MB / 96 MiB (RO) + Disk /dev/loop10 - 148 MB / 141 MiB (RO) + Disk /dev/loop11 - 36 MB / 35 MiB (RO) + Disk /dev/loop12 - 52 MB / 49 MiB (RO) + Disk /dev/loop13 - 78 MB / 75 MiB (RO) + Disk /dev/loop14 - 173 MB / 165 MiB (RO) + Disk /dev/loop15 - 169 MB / 161 MiB (RO) +>[Previous] [ Next ] [Proceed ] [ Quit ] +``` + +在这个例子中,被删除的文件在 `/dev/sdb` 的主目录下。 + +此时,`testdisk` 应该已经选择了合适的分区类型。 + +``` +Disk /dev/sdb - 500 GB / 465 GiB - SAMSUNG HE502HJ + +Please select the partition table type, press Enter when done. + [Intel ] Intel/PC partition +>[EFI GPT] EFI GPT partition map (Mac i386, some x86_64...) + [Humax ] Humax partition table + [Mac ] Apple partition map (legacy) + [None ] Non partitioned media + [Sun ] Sun Solaris partition + [XBox ] XBox partition + [Return ] Return to disk selection +``` + +在下一步中,按向下箭头指向 “[ Advanced ] Filesystem Utils”。 + +``` +[ Analyse ] Analyse current partition structure and search for lost partitions +>[ Advanced ] Filesystem Utils + [ Geometry ] Change disk geometry + [ Options ] Modify options + [ Quit ] Return to disk selection +``` + +接下来,查看选定的分区。 + +``` +Partition Start End Size in sectors +> 1 P Linux filesys. data 2048 910155775 910153728 [drive2] +``` + +然后按右箭头选择底部的 “[ List ]”,按回车键。 + +``` +[ Type ] [Superblock] >[ List ] [Image Creation] [ Quit ] +``` + +请注意,它看起来就像我们从根目录 `/` 开始,但实际上这是我们正在工作的文件系统的基点。在这个例子中,就是 `/home`。 + +``` +Directory / <== 开始点 + +>drwxr-xr-x 0 0 4096 23-Sep-2020 17:46 . + drwxr-xr-x 0 0 4096 23-Sep-2020 17:46 .. + drwx——— 0 0 16384 22-Sep-2020 11:30 lost+found + drwxr-xr-x 1008 1008 4096 9-Jul-2019 14:10 dorothy + drwxr-xr-x 1001 1001 4096 22-Sep-2020 12:12 nemo + drwxr-xr-x 1005 1005 4096 19-Jan-2020 11:49 eel + drwxrwxrwx 0 0 4096 25-Sep-2020 08:08 recovery +... +``` + +接下来,我们按箭头指向具体的主目录。 + +``` +drwxr-xr-x 1016 1016 4096 17-Feb-2020 16:40 gino +>drwxr-xr-x 1000 1000 20480 25-Sep-2020 08:00 shs +``` + +按回车键移动到该目录,然后根据需要向下箭头移动到子目录。注意,如果选错了,可以选择列表顶部附近的 `..` 返回。 + +如果找不到文件,可以按 `/`(就像在 `vi` 中开始搜索时一样),提示你输入文件名或其中的一部分。 + +``` +Directory /shs <== current location + Previous +... + -rw-rw-r— 1000 1000 426 8-Apr-2019 19:09 2-min-topics +>-rw-rw-r— 1000 1000 24667 8-Feb-2019 08:57 Up_on_the_Roof.pdf +``` + +一旦你找到需要恢复的文件,按 `c` 选择它。 + +注意:你会在屏幕底部看到有用的说明: + +``` +Use Left arrow to go back, Right to change directory, h to hide deleted files + q to quit, : to select the current file, a to select all files + C to copy the selected files, c to copy the current file <== +``` + +这时,你就可以在起始目录内选择恢复该文件的位置了(参见前面的说明,在将文件移回原点之前,先在一个合适的地方进行检查)。在这种情况下,`/home/recovery` 目录没有子目录,所以这就是我们的恢复点。 + +注意:你会在屏幕底部看到有用的说明: + +``` +Please select a destination where /shs/Up_on_the_Roof.pdf will be copied. +Keys: Arrow keys to select another directory + C when the destination is correct + Q to quit +Directory /home/recovery <== 恢复位置 +``` + +一旦你看到 “Copy done! 1 ok, 0 failed” 的绿色字样,你就会知道文件已经恢复了。 + +在这种情况下,文件被留在 `/home/recovery/shs` 下(起始目录,附加所选目录)。 + +在将文件移回原来的位置之前,你可能应该先验证恢复的文件看起来是否正确。确保你也恢复了原来的所有者和组,因为此时文件由 root 拥有。 + +**注意:** 对于文件恢复过程中的很多步骤,你可以使用退出(按 `q` 或“[ Quit ]”)来返回上一步。如果你愿意,可以选择退出选项一直回到该过程中的第一步,也可以选择按下 `^c` 立即退出。 + +#### 恢复训练 + +使用 `testdisk` 恢复文件相对来说没有痛苦,但有些复杂。在恐慌时间到来之前,最好先练习一下恢复文件,让自己有机会熟悉这个过程。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3575524/recovering-deleted-files-on-linux-with-testdisk.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://www.cgsecurity.org/testdisk.pdf +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/published/202010/20201005 Linux Jargon Buster- What is a Package Manager in Linux- How Does it Work.md b/published/202010/20201005 Linux Jargon Buster- What is a Package Manager in Linux- How Does it Work.md new file mode 100644 index 0000000000..ea001d9fd9 --- /dev/null +++ b/published/202010/20201005 Linux Jargon Buster- What is a Package Manager in Linux- How Does it Work.md @@ -0,0 +1,112 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12713-1.html) +[#]: subject: (Linux Jargon Buster: What is a Package Manager in Linux? How Does it Work?) +[#]: via: (https://itsfoss.com/package-manager/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是包管理器?它是如何工作的? +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/13/094827peunhns3nn3qceno.jpg) + +[Linux 发行版之间有什么不同][1]的要点之一是包管理。在这篇 Linux 黑话解释中,你将了解 Linux 中的打包和包管理器。你将了解什么是包,什么是包管理器,它们是如何工作的,以及有什么包管理器。 + +### 什么是包管理器? + +简单来说,“包管理器package manager”(或“软件包管理器”)是一种工具,它允许用户在操作系统上安装、删除、升级、配置和管理软件包。软件包管理器可以是像“软件中心”这样的图形化应用,也可以是像 [apt-get][2] 或 [pacman][3] 这样的命令行工具。 + +你会发现我经常在教程和文章中使用“包”这个词。要了解包管理器,你必须了解什么是包。 + +### 什么是包? + +一个“package”(或“软件包”)通常指的是一个应用程序,它可以是一个 GUI 应用程序、命令行工具或(其他软件程序需要的)软件库。包本质上是一个存档文件,包含二进制可执行文件、配置文件,有时还包含依赖关系的信息。 + +在旧时代,[软件曾经是从它的源代码安装的][4]。你会参考一个文件(通常命名为 `README`),看看它需要什么软件组件、二进制文件的位置。它通常包括一个配置脚本或 `Makefile`。你必须自己编译该软件或自己处理所有的依赖关系(有些软件需要安装其他软件)。 + +为了摆脱这种复杂性,Linux 发行版创建了自己的打包格式,为终端用户提供随时可用的二进制文件(预编译软件),以便安装软件,同时提供一些[元数据][5](版本号、描述)和依赖关系。 + +这就像烤蛋糕与买蛋糕一样。 + +![][6] + +大约在上世纪 90 年代中期,Debian 创建了 DEB 打包格式(`.deb`),Red Hat Linux 创建了 RPM(Red Hat Package Manager 的缩写)打包系统(`.rpm`)。编译源代码的方式仍然存在,但现在是可选的。 + +要与打包系统交互或使用打包系统,你需要一个包管理器。 + +### 包管理器是如何工作的? + +请记住,包管理器是一个通用的概念,它并不是 Linux 独有的。你会经常发现各种软件或编程语言的包管理器。有[只是针对 Python 包的 PIP 包管理器][7]。甚至 [Atom 编辑器也有自己的包管理器][8]。 + +由于本文的重点是 Linux,所以我会从 Linux 的角度出发。不过,这里的大部分解释也可以应用于一般的包管理器。 + +我创建了这个图(基于 SUSE Wiki),这样你就可以很容易理解包管理器是如何工作的。 + +![][9] + +几乎所有的 Linux 发行版都有“软件仓库software repository”,它基本上是软件包的集合。是的,可以有不止一个软件库。软件库包含不同种类的软件包。 + +软件仓库也有元数据文件,其中包含了软件包的信息,如软件包的名称、版本号、软件包的描述和软件仓库名称等。这就是你在 Ubuntu/Debian 中使用 [apt show 命令][10]所看到的。 + +你的系统上的包管理器首先会与元数据进行交互。包管理器在你的系统上创建了一个元数据的本地缓存。当你运行包管理器的更新选项(例如 `apt update`)时,它会通过引用仓库中的元数据来更新本地元数据缓存。 + +当你运行软件包管理器的安装命令(例如 `apt install package_name`)时,软件包管理器会引用这个缓存。如果它在缓存中找到了包的信息,它就会使用互联网连接到相应的仓库,并在你的系统上安装之前先下载包。 + +一个包可能有依赖关系。意思是说,它可能需要安装其他软件包。软件包管理器通常会处理这些依赖关系,并将其与你正在安装的软件包一起自动安装。 + +![Linux 中包管理器会处理依赖关系][11] + +同样,当你使用包管理器删除一个包时,它要么自动删除,要么通知你系统有未使用的包可以清理。 + +除了安装、删除这些显而易见的任务外,你还可以使用包管理器对包进行配置,并根据自己的需要进行管理。例如,你可以在常规的系统更新中[防止升级某个包的版本][12]。你的包管理器可能还能做很多事情。 + +### 不同种类的包管理器 + +包管理器因打包系统而异,但同一打包系统却可能有多个包管理器。 + +例如,RPM 有 [Yum][13] 和 [DNF][14] 包管理器。对于 DEB,你有 `apt-get`、[aptitude][15] 等基于命令行的包管理器。 + +![Synaptic 包管理器][16] + +软件包管理器不一定是基于命令行的,也有图形化的软件包管理工具,比如 [Synaptic][17]。你的发行版的“软件中心”也是一个软件包管理器,即使它在底层运行的是 `apt-get` 或 DNF。 + +### 结论 + +我不想进一步详细介绍这个话题,虽然我可以继续说下去,但这将偏离本主题的目标 —— 即让你对 Linux 中的包管理器有一个基本的了解。 + +我暂时忽略了新的通用打包格式,比如 Snap 和 Flatpak。 + +我希望你对 Linux 中的包管理系统有更好的理解。如果你还有困惑,或者你对这个主题有一些问题,请发表评论。我会尽量回答你的问题,如果需要的话,我会在本文中更新新的内容。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/package-manager/ + +作者:[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/what-is-linux/ +[2]: https://itsfoss.com/apt-vs-apt-get-difference/ +[3]: https://itsfoss.com/pacman-command/ +[4]: https://itsfoss.com/install-software-from-source-code/ +[5]: https://www.computerhope.com/jargon/m/metadata.htm +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/source-code-comilation-vs-packaging.png?resize=800%2C450&ssl=1 +[7]: https://itsfoss.com/install-pip-ubuntu/ +[8]: https://itsfoss.com/install-packages-in-atom/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/linux-package-manager-explanation.png?resize=800%2C450&ssl=1 +[10]: https://itsfoss.com/apt-search-command/ +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/package-manager-handling-dependencies-in-linux.png?resize=800%2C450&ssl=1 +[12]: https://itsfoss.com/prevent-package-update-ubuntu/ +[13]: https://fedoraproject.org/wiki/Yum +[14]: https://fedoraproject.org/wiki/DNF +[15]: https://wiki.debian.org/Aptitude +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/see-packages-by-repositories-synaptic.png?resize=799%2C548&ssl=1 +[17]: https://itsfoss.com/synaptic-package-manager/ diff --git a/published/202010/20201006 Simplify your web experience with this internet protocol alternative.md b/published/202010/20201006 Simplify your web experience with this internet protocol alternative.md new file mode 100644 index 0000000000..dd013f7416 --- /dev/null +++ b/published/202010/20201006 Simplify your web experience with this internet protocol alternative.md @@ -0,0 +1,99 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12738-1.html) +[#]: subject: (Simplify your web experience with this internet protocol alternative) +[#]: via: (https://opensource.com/article/20/10/gemini-internet-protocol) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用互联网协议替代方案 Gemini 简化你的 Web 体验 +====== + +> 用 Gemini 协议发现更安静、更简单的互联网新角落。 + +![](https://img.linux.net.cn/data/attachment/album/202010/21/070950dzph7mlm0h035h3o.jpg) + +如果你很久以前就已经上网了,或者是知识非常丰富,你可能还记得一个早期的文本共享协议,叫做 [Gopher][2]。Gopher 最终被 HTTP 协议所取代,当然,HTTP 协议是现代万维网的基础。对于很多人来说,“互联网internet”和“万维网World Wide Web”是一回事,因为很多人没有意识到在网上进行了*非* www 子域下的任何操作。 + +但一直以来,都有各种网络协议在互联网络上共享信息:Telnet、FTP、SSH、Torrent、GNUnet 等等。最近,在这一系列的替代品中又多了一个,它叫 [Gemini][3]。 + +Gemini(双子座)协议,以“水星计划”和“阿波罗计划”的基础实验之间的太空任务命名,旨在和平地处在 Gopher 和 HTTP 之间。无论如何,它的目的并不是要取代现代 Web,但它确实试图创造一个简化的网络和一个现代化的 Gopher。 + +它的发展历史虽然可能很年轻,但意义重大,原因有很多。当然,人们会因为技术和哲学上的原因而对现代 Web 表示质疑,但它只是一般的臃肿。当你真正想要的是一个非常具体的问题的可靠答案时,那么无数次点击谷歌搜索的结果让人感觉过头了。 + +许多人使用 Gopher 就是因为这个原因:它的规模小到可以让小众的兴趣很容易找到。然而,Gopher 是一个旧的协议,它对编程、网络和浏览做出了一些假设,但这些假设已经不再适用了。 Gemini 的目标是将最好的网络带入一种类似于 Gopher 但易于编程的格式。一个简单的 Gemini 浏览器可以用几百行代码写成,并且有一个非常好的浏览器用 1600 行左右写成。这对于程序员、学生和极简主义者来说都是一个强大的功能。 + +### 如何浏览 Gemini + +就像早期的网络一样,Gemini 的规模很小,所以有一个列表列出了运行 Gemini 网站的已知服务器。就像浏览 HTTP 站点需要一个网页浏览器一样,访问 Gemini 站点也需要一个 Gemini 浏览器。在 [Gemini 网站][4]上列出了有几个可用的浏览器。 + +最简单的一个是 [AV-98][5] 客户端。它是用 Python 编写的,在终端中运行。要想试试的话,请下载它: + +``` +$ git clone https://tildegit.org/solderpunk/AV-98.git +``` + +进入下载目录,运行 AV-98: + +``` +$ cd AV-98.git +$ python3 ./main.py +``` + +客户端是一个交互式的提示符。它有有限的几个命令,主要的命令是简单的 `go`,后面跟着一个 Gemini 服务器地址。在已知的 [Gemini 服务器][6]列表中选择一个看起来很有趣的服务器,然后尝试访问它: + +``` +AV-98> go gemini://example.club + +Welcome to the example.club Gemini server! + +Here are some folders of ASCII art: + +[1] Penguins +[2] Wildebeests +[3] Demons +``` + +导航是按照编号的链接来进行的。例如,要进入 `Penguins` 目录,输入 `1` 然后按回车键: + + +``` +AV-98> 1 + +[1] Gentoo +[2] Emperor +[3] Little Blue +``` + +要返回,输入 `back` 并按回车键: + +``` +AV-98> back +``` + +更多命令,请输入 `help`。 + +### 用 Gemini 作为你的 web 替代 + +Gemini 协议非常简单,初级和中级程序员都可以为其编写客户端,而且它是在互联网上分享内容的一种简单快捷的方式。虽然万维网的无处不在对广泛传播是有利的,但总有替代方案的空间。看看 Gemini,发现更安静、更简单的互联网的新角落。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/gemini-internet-protocol + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) +[2]: https://en.wikipedia.org/wiki/Gopher_%28protocol%29 +[3]: https://gemini.circumlunar.space/ +[4]: https://gemini.circumlunar.space/clients.html +[5]: https://tildegit.org/solderpunk/AV-98 +[6]: https://portal.mozz.us/gemini/gemini.circumlunar.space/servers diff --git a/published/202010/20201008 Integrate your calendar with Ansible to avoid schedule conflicts.md b/published/202010/20201008 Integrate your calendar with Ansible to avoid schedule conflicts.md new file mode 100644 index 0000000000..a37438c779 --- /dev/null +++ b/published/202010/20201008 Integrate your calendar with Ansible to avoid schedule conflicts.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12733-1.html) +[#]: subject: (Integrate your calendar with Ansible to avoid schedule conflicts) +[#]: via: (https://opensource.com/article/20/10/calendar-ansible) +[#]: author: (Nicolas Leiva https://opensource.com/users/nicolas-leiva) + +将你的日历与 Ansible 集成,以避免与日程冲突 +====== + +> 通过将日历应用集成到 Ansible 中,确保你的自动化工作流计划不会与其他东西冲突。 + +![](https://img.linux.net.cn/data/attachment/album/202010/18/221110wk9kd9ewrde11zxx.jpg) + +“随时”是执行自动化工作流的好时机吗?出于不同的原因,答案可能是否定的。 + +如果要避免同时进行更改,以最大限度地减少对关键业务流程的影响,并降低意外服务中断的风险,则在你的自动化运行的同时,其他任何人都不应该试图进行更改。 + +在某些情况下,可能存在一个正在进行的计划维护窗口。或者,可能有大型事件即将来临、一个关键的业务时间、或者假期(你或许不想在星期五晚上进行更改)。 + +![Street scene with a large calendar and people walking][2] + +无论出于什么原因,你都希望将此信息发送到你的自动化平台,以防止在特定时间段内执行周期性或临时任务。用变更管理的行话,我说的是当变更活动不应该发生时,指定封锁窗口。 + +### Ansible 中的日历集成 + +如何在 [Ansible][5] 中实现这个功能?虽然它本身没有日历功能,但 Ansible 的可扩展性将允许它与任何具有 API 的日历应用集成。 + +目标是这样的:在执行任何自动化或变更活动之前,你要执行一个 `pre-task` ,它会检查日历中是否已经安排了某些事情(目前或最近),并确认你没有在一个阻塞的时间段中。 + +想象一下,你有一个名为 `calendar` 的虚构模块,它可以连接到一个远程日历,比如 Google 日历,以确定你指定的时间是否已经以其他方式被标记为繁忙。你可以写一个类似这样的剧本: + +``` +- name: Check if timeslot is taken +  calendar: +    time: "{{ ansible_date_time.iso8601 }}" +  register: output +``` + +Ansible 实际会给出 `ansible_date_time`,将其传递给 `calendar` 模块,以验证时间的可用性,以便它可以注册响应 (`output`),用于后续任务。 + +如果你的日历是这样的: + +![Google Calendar screenshot][6] + +那么这个任务的输出就会指明这个时间段被占用的事实 (`busy: true`): + +``` +ok: [localhost] => { +   "output": { +       "busy": true, +       "changed": false, +       "failed": false, +       "msg": "The timeslot 2020-09-02T17:53:43Z is busy: true" +   } +} +``` + +### 阻止任务运行 + +接下来,[Ansible Conditionals][8] 将帮助阻止所有之后任务的执行。一个简单的例子,你可以在下一个任务上使用 `when` 语句来强制它只有当上一个输出中的 `busy` 字段不是 `true` 时,它才会运行: + +``` +tasks: +  - shell: echo "Run this only when not busy!" +    when: not output.busy +``` + +### 总结 + +在[上一篇文章][9]中,我说过 Ansible 是一个将事物连接在一起的框架,将不同的组成部分相互连接,以协调端到端自动化工作流。 + +这篇文章探讨了 Ansible 剧本如何与日历应用集成以检查可用性。然而,我只做了一些表面工作!例如,你的任务也可以阻止日历中的一个时间段,这里的发挥空间很大。 + +在我的下一篇文章中,我将深入 `calendar` 模块是如何构建的,以及其他编程语言如何与 Ansible 一起使用。如果你和我一样是 [Go][10] 的粉丝,请继续关注! + +* * * + +_这篇文章最初发表在 Medium 上,名为 [Ansible and Google Calendar integration for change management][11],采用 CC BY-SA 4.0 许可,经许可后转载。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/calendar-ansible + +作者:[Nicolas Leiva][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/nicolas-leiva +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calendar.jpg?itok=jEKbhvDT (Calendar close up snapshot) +[2]: https://opensource.com/sites/default/files/uploads/street-calendar.jpg (Street scene with a large calendar and people walking) +[3]: https://www.flickr.com/photos/7841127@N02/4217116202 +[4]: https://creativecommons.org/licenses/by-nd/2.0/ +[5]: https://docs.ansible.com/ansible/latest/index.html +[6]: https://opensource.com/sites/default/files/uploads/googlecalendarexample.png (Google Calendar screenshot) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html +[9]: https://medium.com/swlh/python-and-ansible-to-automate-a-network-security-workflow-28b9a44660c6 +[10]: https://golang.org/ +[11]: https://medium.com/swlh/ansible-and-google-calendar-integration-for-change-management-7c00553b3d5a diff --git a/published/202010/20201009 How to Install Deepin Desktop on Ubuntu 20.04 LTS.md b/published/202010/20201009 How to Install Deepin Desktop on Ubuntu 20.04 LTS.md new file mode 100644 index 0000000000..84fc35c76f --- /dev/null +++ b/published/202010/20201009 How to Install Deepin Desktop on Ubuntu 20.04 LTS.md @@ -0,0 +1,133 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12724-1.html) +[#]: subject: (How to Install Deepin Desktop on Ubuntu 20.04 LTS) +[#]: via: (https://itsfoss.com/install-deepin-ubuntu/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +如何在 Ubuntu 20.04 LTS 上安装深度(Deepin)桌面环境 +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/15/223607kqs5zguiq53fkkig.png) + +> 本教程向你展示在 Ubuntu 上安装深度(Deepin)桌面环境的正确步骤。还提到了移除步骤。 + +毫无疑问,深度操作系统(Deepin OS)是一个 [漂亮的 Linux 发行版][1]。最近发布的 [深度操作系统 V20][2] 就更加美观了。 + +[深度操作系统][3] 是基于 [Debian][4] 的,默认的存储库镜像太慢了。如果你更愿意使用 Ubuntu,可以选择 [UbuntuDDE Linux 发行版][5] 形式的 Ubuntu 的深度操作系统的变体。它还不是 [官方的 Ubuntu 风格][6] 之一。 + +[重新安装新的发行版][7] 是一个麻烦,因为你会丢失数据,你将不得不在新安装的 UbuntuDDE 上重新安装你的应用程序。 + +一个更简单的选择是在现有的 Ubuntu 系统上安装深度桌面环境(DDE)。毕竟,你可以轻松地在一个系统中安装多个[桌面环境][8]。 + +不要烦恼,这很容易做到,如果你不喜欢,也可以恢复这些更改。让我来告诉你怎么做。 + +### 在 Ubuntu 20.04 上安装深度桌面环境 + +UbuntuDDE 团队已为他们的发行版创建了一个 PPA,你可以使用相同的 PPA 在 Ubuntu 20.04 上安装深度桌面环境。请记住,此 PPA 仅适用于 Ubuntu 20.04。请阅读有关 [在 Ubuntu 中使用 PPA][10]。 + +> 没有深度桌面环境 V20 +> +> 你将在此处使用 PPA 安装的深度桌面环境还不是新的 V20。它可能会在 Ubuntu 20.10 发布后出现,但是我们不能担保。 + +以下是你需要遵循的步骤: + +**步骤 1**:你需要首先在终端上输入以下内容,来添加 [Ubuntu DDE Remix 团队的官方 PPA][11]: + +``` +sudo add-apt-repository ppa:ubuntudde-dev/stable +``` + +**步骤 2**:添加存储库以后,继而安装深度桌面环境。 + +``` +sudo apt install ubuntudde-dde +``` + +![][12] + +现在,安装将启动,一段时间后,将要求你选择显示管理器display manager。 + +![][13] + +如果需要深度桌面主题的锁屏,则需要选择 “lightdm”。如果不需要,你可以将其设置为 “gdm3”。 + +如果你看不到此选项,可以通过键入以下命令来获得它,然后选择你首选的显示管理器: + +``` +sudo dpkg-reconfigure lightdm +``` + +**步骤 3**: 完成后,你必须退出并通过选择 “Deepin” 会话再次登录,或者重新启动系统。 + +![][14] + + +就是这样。马上在你的 Ubuntu 20.04 LTS 系统上享受深度桌面环境体验吧! + +![][15] + +### 从 Ubuntu 20.04 删除深度桌面 + +如果你不喜欢这种体验,或者由于某些原因它有 bug,可以按照以下步骤将其删除。 + +**步骤 1**: 如果你已将 “lightdm” 设置为显示管理器,则需要在卸载深度桌面环境之前将显示管理器设置为 “gdm3”。为此,请键入以下命令: + +``` +sudo dpkg-reconfigure lightdm +``` + +![Select gdm3 on this screen][13] + +然后,选择 “gdm3” 继续。 + +完成此操作后,你只需输入以下命令即可完全删除深度桌面环境: + +``` +sudo apt remove startdde ubuntudde-dde +``` + +你只需重启即可回到原来的 Ubuntu 桌面环境。如果图标没有响应,只需打开终端(`CTRL + ALT + T`)并输入: + + +``` +reboot +``` + +### 总结 + +有不同的 [桌面环境选择][16] 是件好事。如果你真的喜欢深度桌面环境的界面,那么这可能是在 Ubuntu 上体验深度操作系统的一种方式。 + +如果你有任何疑问或遇到任何问题,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-deepin-ubuntu/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/beautiful-linux-distributions/ +[2]: https://itsfoss.com/deepin-20-review/ +[3]: https://www.deepin.org/en/ +[4]: https://www.debian.org/ +[5]: https://itsfoss.com/ubuntudde/ +[6]: https://itsfoss.com/which-ubuntu-install/ +[7]: https://itsfoss.com/reinstall-ubuntu/ +[8]: https://itsfoss.com/what-is-desktop-environment/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/ubuntu-20-with-deepin.jpg?resize=800%2C386&ssl=1 +[10]: https://itsfoss.com/ppa-guide/ +[11]: https://launchpad.net/~ubuntudde-dev/+archive/ubuntu/stable +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/deepin-desktop-install.png?resize=800%2C534&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/deepin-display-manager.jpg?resize=800%2C521&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/deepin-session-ubuntu.jpg?resize=800%2C414&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/ubuntu-20-with-deepin-1.png?resize=800%2C589&ssl=1 +[16]: https://itsfoss.com/best-linux-desktop-environments/ diff --git a/published/202010/20201009 How to Remove Physical Volume from a Volume Group in LVM.md b/published/202010/20201009 How to Remove Physical Volume from a Volume Group in LVM.md new file mode 100644 index 0000000000..92d4b4c6c1 --- /dev/null +++ b/published/202010/20201009 How to Remove Physical Volume from a Volume Group in LVM.md @@ -0,0 +1,181 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12750-1.html) +[#]: subject: (How to Remove Physical Volume from a Volume Group in LVM) +[#]: via: (https://www.2daygeek.com/linux-remove-delete-physical-volume-pv-from-volume-group-vg-in-lvm/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何从 LVM 的卷组中删除物理卷? +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/25/101355kav72t5iy5yj55tg.jpg) + +如果你的 LVM 不再需要使用某个设备,你可以使用 `vgreduce` 命令从卷组中删除物理卷。 + +`vgreduce` 命令可以通过删除物理卷来缩小卷组的容量。但要确保该物理卷没有被任何逻辑卷使用,请使用 `pvdisplay` 命令查看。如果物理卷仍在使用,你必须使用 `pvmove` 命令将数据转移到另一个物理卷。 + +数据转移后,它就可以从卷组中删除。 + +最后使用 `pvremove` 命令删除空物理卷上的 LVM 标签和 LVM 元数据。 + + * **第一部分:[如何在 Linux 中创建/配置 LVM(逻辑卷管理)][1]** + * **第二部分:[如何在 Linux 中扩展/增加 LVM 大小(逻辑卷调整)][2]** + * **第三部分:[如何在 Linux 中减少/缩小 LVM 大小(逻辑卷调整)][3]** + +![](https://img.linux.net.cn/data/attachment/album/202010/25/101424vgcio5fooi9uo5gh.jpeg) + +### 将扩展块移动到现有物理卷上 + +使用 `pvs` 命令检查是否使用了所需的物理卷(我们计划删除 LVM 中的 `/dev/sdc` 磁盘)。 + +``` +# pvs -o+pv_used + +PV VG Fmt Attr PSize PFree Used +/dev/sda myvg lvm2 a- 75.00G 14.00G 61.00G +/dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G +/dev/sdc myvg lvm2 a- 17.15G 12.15G 5.00G +``` + +如果使用了,请检查卷组中的其他物理卷是否有足够的空闲扩展块extent。 + +如果有的话,你可以在需要删除的设备上运行 `pvmove` 命令。扩展块将被分配到其他设备上。 + +``` +# pvmove /dev/sdc + +/dev/sdc: Moved: 2.0% +… +/dev/sdc: Moved: 79.2% +… +/dev/sdc: Moved: 100.0% +``` + +当 `pvmove` 命令完成后。再次使用 `pvs` 命令检查物理卷是否有空闲。 + +``` +# pvs -o+pv_used + +PV VG Fmt Attr PSize PFree Used +/dev/sda myvg lvm2 a- 75.00G 1.85G 73.15G +/dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G +/dev/sdc myvg lvm2 a- 17.15G 17.15G 0 +``` + +如果它是空闲的,使用 `vgreduce` 命令从卷组中删除物理卷 `/dev/sdc`。 + +``` +# vgreduce myvg /dev/sdc +Removed "/dev/sdc" from volume group "vg01" +``` + +最后,运行 `pvremove` 命令从 LVM 配置中删除磁盘。现在,磁盘已经完全从 LVM 中移除,可以用于其他用途。 + +``` +# pvremove /dev/sdc +Labels on physical volume "/dev/sdc" successfully wiped. +``` + +### 移动扩展块到新磁盘 + +如果你在卷组中的其他物理卷上没有足够的可用扩展。使用以下步骤添加新的物理卷。 + +向存储组申请新的 LUN。分配完毕后,运行以下命令来[在 Linux 中发现新添加的 LUN 或磁盘][5]。 + +``` +# ls /sys/class/scsi_host +host0 +``` + +``` +# echo "- - -" > /sys/class/scsi_host/host0/scan +``` + +``` +# fdisk -l +``` + +操作系统中检测到磁盘后,使用 `pvcreate` 命令创建物理卷。 + +``` +# pvcreate /dev/sdd +Physical volume "/dev/sdd" successfully created +``` + +使用以下命令将新的物理卷 `/dev/sdd` 添加到现有卷组 `vg01` 中。 + +``` +# vgextend vg01 /dev/sdd +Volume group "vg01" successfully extended +``` + +现在,使用 `pvs` 命令查看你添加的新磁盘 `/dev/sdd`。 + +``` +# pvs -o+pv_used + +PV VG Fmt Attr PSize PFree Used +/dev/sda myvg lvm2 a- 75.00G 14.00G 61.00G +/dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G +/dev/sdc myvg lvm2 a- 17.15G 12.15G 5.00G +/dev/sdd myvg lvm2 a- 60.00G 60.00G 0 +``` + +使用 `pvmove` 命令将数据从 `/dev/sdc` 移动到 `/dev/sdd`。 + +``` +# pvmove /dev/sdc /dev/sdd + +/dev/sdc: Moved: 10.0% +… +/dev/sdc: Moved: 79.7% +… +/dev/sdc: Moved: 100.0% +``` + +数据移动到新磁盘后。再次使用 `pvs` 命令检查物理卷是否空闲。 + +``` +# pvs -o+pv_used + +PV VG Fmt Attr PSize PFree Used +/dev/sda myvg lvm2 a- 75.00G 14.00G 61.00G +/dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G +/dev/sdc myvg lvm2 a- 17.15G 17.15G 0 +/dev/sdd myvg lvm2 a- 60.00G 47.85G 12.15G +``` + +如果空闲,使用 `vgreduce` 命令从卷组中删除物理卷 `/dev/sdc`。 + +``` +# vgreduce myvg /dev/sdc +Removed "/dev/sdc" from volume group "vg01" +``` + +最后,运行 `pvremove` 命令从 LVM 配置中删除磁盘。现在,磁盘已经完全从 LVM 中移除,可以用于其他用途。 + +``` +# pvremove /dev/sdc +Labels on physical volume "/dev/sdc" successfully wiped. +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/linux-remove-delete-physical-volume-pv-from-volume-group-vg-in-lvm/ + +作者:[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-12670-1.html +[2]: https://linux.cn/article-12673-1.html +[3]: https://linux.cn/article-12740-1.html +[4]: https://www.2daygeek.com/wp-content/uploads/2020/10/remove-delete-physical-volume-pv-from-volume-group-vg-lvm-linux-2.png +[5]: https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/ diff --git a/published/202010/20201010 6 Essential Things To Do After Installing Manjaro Linux.md b/published/202010/20201010 6 Essential Things To Do After Installing Manjaro Linux.md new file mode 100644 index 0000000000..9f4147f6c6 --- /dev/null +++ b/published/202010/20201010 6 Essential Things To Do After Installing Manjaro Linux.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (rakino) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12721-1.html) +[#]: subject: (6 Essential Things To Do After Installing Manjaro Linux) +[#]: via: (https://itsfoss.com/things-to-do-after-installing-manjaro/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +安装 Manjaro Linux 后必做的 6 件事 +====== + +你刚刚[全新安装了 Manjaro Linux][1],那么现在该做什么呢? + +下面是我推荐你在安装后进行的一些必不可少的步骤。 + +不过说实话,这些都是我在安装 Manjaro 后喜欢做的事,根据你的需求,步骤可能会有所不同。 + +### 推荐在安装完 Manjaro Linux 后去做的事 + +![][2] + +我使用的是 Xfce 版的 Manjaro,但这些步骤也适用于 [Manjaro][3] 的其它桌面环境版本。 + +#### 1、设置最快的镜像 + +在更新系统之前,我建议先整理一下镜像列表。在刷新 Manjaro 系统和从软件仓库下载软件包的时候,优化后的镜像列表会对系统的性能产生明显的影响。 + +打开终端模拟器并输入以下命令: + +``` +sudo pacman-mirrors --fasttrack +``` + +![][4] + +#### 2、更新系统 + +保持系统更新可以降低安全漏洞的发生机率,在安装新的软件之前也建议刷新一下系统的软件仓库。 + +你可以用下面的命令来[更新 Manjaro 系统][5]: + +``` +sudo pacman -Syu +``` + +![][6] + +#### 3、启用 AUR、Snap 以及 Flatpak 支持 + +[Arch 用户仓库Arch User Repository(AUR)][7]是用户选择[基于 Arch Linux 的系统][8]的一个主要理由。你可以在 AUR 中访问到大量的附加软件。 + +(LCTT 译注:AUR 中的 PKGBUILD 均为用户上传且未经审核,使用者需要自负责任,在构建软件包前请注意检查其中内容是否合理。) + +作为可选项,你可以直接在 Pacman 图形化软件包管理器中启用对 [Snap][9] 以及 [Flatpak][10] 的支持。 + +![][11] + +#### 启用 TRIM(仅 SSD) + +如果你的根分区已经安装在了 SSD 上,启用 [TRIM][12] 会是你在安装 Manjaro 后需要做的一件事。TRIM 会帮助清理 SSD 中的块,从而延长 SSD 的使用寿命。 + +要在 Manjaro 中启用 TRIM,请在终端中输入以下命令: + +``` +sudo systemctl enable fstrim.timer +``` + +![][13] + +#### 5、安装内核(高级用户) + +我在 [Manjaro 评测][14]中提到的一个话题就是,你可以在图形界面中轻易地更换内核。 + +喜欢使用命令行?你也可以在终端中列出系统中已安装的内核以及安装新的内核。 + +列出已安装的内核: + +``` +mhwd-kernel -li +``` + +安装新内核(以最新的 5.8 版本内核为例): + +``` +sudo mhwd-kernel -i linux58 +``` + +![][15] + +#### 6、安装微软 TrueType 字体(如果需要) + +我经常在个人电脑上编辑工作文件,因此我需要 Times New Roman 或 Arial 等微软字体。 + +如果你也需要使用微软字体,可以从 [AUR][7] 中取得这个[软件包][16]。如果你想要在命令行中管理 AUR 软件包,可以选择安装一个 [AUR 助手][17]。 + +![][18] + +### 结论 + +如果你想在一个预配置、为桌面优化的发行版上享受 Arch Linux 的优点,[Manjaro 是一个很好的发行版][19]。虽然它预置了很多东西,但由于每个人设置和需求的不同,有几个步骤是不能提前完成的。 + +除开已经提到的步骤,还有哪一步对你来说是必不可少的?请在下面的评论中告诉我们。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/things-to-do-after-installing-manjaro/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[rakino](https://github.com/rakino) +校对:[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://itsfoss.com/install-manjaro-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/things-to-do-after-installing-manjaro.jpg?resize=800%2C450&ssl=1 +[3]: https://manjaro.org +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/manjaro-fasttrack.png?resize=800%2C600&ssl=1 +[5]: https://itsfoss.com/update-arch-linux/ +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/sudo-pacman-Syu.png?resize=800%2C504&ssl=1 +[7]: https://itsfoss.com/aur-arch-linux/ +[8]: https://itsfoss.com/arch-based-linux-distros/ +[9]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/ +[10]: https://itsfoss.com/flatpak-guide/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/pamac-2.png?resize=800%2C600&ssl=1 +[12]: https://en.wikipedia.org/wiki/Trim_(computing) +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/fstrim.timer_.png?resize=800%2C600&ssl=1 +[14]: https://itsfoss.com/manjaro-linux-review/ +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/manjaro-cli-kernels.png?resize=800%2C600&ssl=1 +[16]: https://aur.archlinux.org/packages/ttf-ms-fonts +[17]: https://itsfoss.com/best-aur-helpers/ +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/ttf-ms-fonts.png?resize=800%2C600&ssl=1 +[19]: https://itsfoss.com/why-use-manjaro-linux/ diff --git a/published/202010/20201012 Could Microsoft be en route to dumping Windows in favor of Linux.md b/published/202010/20201012 Could Microsoft be en route to dumping Windows in favor of Linux.md new file mode 100644 index 0000000000..db061a927a --- /dev/null +++ b/published/202010/20201012 Could Microsoft be en route to dumping Windows in favor of Linux.md @@ -0,0 +1,88 @@ +[#]: collector: (wxy) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12718-1.html) +[#]: subject: (Could Microsoft be en route to dumping Windows in favor of Linux?) +[#]: via: (https://www.techrepublic.com/article/could-microsoft-be-en-route-to-dumping-windows-in-favor-of-linux/) +[#]: author: (Jack Wallen https://www.techrepublic.com/meet-the-team/us/jack-wallen/) + +微软能否放弃 Windows 转向 Linux? +====== + +> Jack Wallen 认为,Microsoft Linux 是 Microsoft 桌面操作系统的下一个演进方向。他解释了为什么这将是一个对 Microsoft、IT 专业人士、用户和 Linux 社区的双赢。 + +![](https://tr1.cbsistatic.com/hub/i/r/2014/08/20/123daeb8-d6ce-4f0b-986e-225d55bf12e3/resize/770x/a693d56694587dbe5d025db7b8d79c48/linux-and-windows.jpg) + +我尊敬的同事 Steven J. Vaughan-Nichols 在姊妹网站 ZDNet 上发表了一篇出色的文章,名为《[基于 Linux 的 Windows 非常有意义][1]》,他在文中讨论了 Eric S. Raymond 的[观点](https://linux.cn/article-12664-1.html),即我们正接近桌面战争的最后阶段。Vaughan-Nichols 猜测,下一个合乎逻辑的步骤是在 Linux 内核上运行的 Windows 界面。 + +这是有道理的,尤其是考虑到微软在 [Windows 的 Linux 子系统(WSL)][2] 上的努力。然而,从我过去几年所目睹的一切来看,我认为可以得出一个对微软更有意义的结论。 + +### Microsoft Linux: 为什么它是最好的解决方案 + +一度,微软的最大摇钱树是软件,确切地说是 Windows 和 Microsoft Office。但是,就像科技行业中的所有事物一样,进化也在发生,而拒绝进化的科技公司失败了。 + +微软明白这一点,并且它已经进化了。一个恰当的例子是:[Microsoft Azure][4]。微软的云计算服务,以及 [AWS][5] 和 [Google Cloud][6] 已经成为这个不断变化的行业的巨大推动力。Azure 已成为微软新世界的摇钱树 —— 多到以至于这家在桌面电脑市场上享有垄断地位的公司已经开始意识到,或许还有更好的方式来利用桌面计算机。 + +这种优势很容易通过 Linux 来实现,但不是你可能想到的 Linux。Vaughan-Nichols 所建议的 Microsoft Linux 对于微软来说可能是一个很好的垫脚石,但我相信该公司需要做出一个更大的飞跃。我说的是登月规模的飞跃 —— 这将使所有参与者的生活变得更加轻松。 + +我说的是深入 Linux 领域。忘掉在 Linux 内核上运行 [Windows 10][7] 界面的桌面版本吧,最后承认 Microsoft Linux 可能是当今世界的最佳解决方案。 + +微软发布一个完整的 Linux 发行版将对所有参与者来说意味着更少的挫败感。微软可以将其在 Windows 10 桌面系统上的开发工作转移到一个更稳定、更可靠、更灵活、更经考验的桌面系统上来。微软可以从任意数量的桌面系统中选择自己的官方风格:GNOME、KDE、Pantheon、Xfce、Mint、Cinnamon... 不胜枚举。微软可以按原样使用桌面,也可以为它们做出贡献,创造一些更符合用户习惯的东西。 + +### 开发:微软并没有摆脱困境 + +这并不意味着微软在开发方面将摆脱困境。微软也希望对 Wine 做出重大贡献,以确保其所有产品均可在兼容层上顺畅运行,并且默认集成到操作系统中,这样最终用户就不必为安装 Windows 应用程序做任何额外的工作。 + +### Windows 用户需要 Defender + +微软开发团队也希望将 Windows Defender 移植到这个新的发行版中。等一等。什么?我真的是在暗示 Microsoft Linux 需要 Windows Defender 吗?是的,我确定。为什么? + +最终用户仍然需要防范 [网络钓鱼][8] 诈骗phishing scams、恶意 URL 和其他类型的攻击。普通的 Windows 用户可能不会意识到,Linux 和安全使用实践的结合远比 Windows 10 和 Windows Defender 要安全得多。所以,是的,将 Windows Defender 移植到 Microsoft Linux 将是保持用户基础舒适的一个很好的步骤。 + +这些用户将很快了解在台式计算机上工作的感觉,而不必处理 Windows 操作系统带来的日常困扰。更新更流畅、更值得信赖、更安全,桌面更有意义。 + +### 微软、用户和 IT 专业人士的双赢 + +微软一直在尽其所能将用户从标准的基于客户端的软件迁移到云和其他托管解决方案,并且其软件摇钱树已经变成了以网络为中心和基于订阅的软件。所有这些 Linux 用户仍然可以使用 [Microsoft 365][10] 和它必须提供的任何其他 [软件即服务][11]Software as a Service(SaaS)解决方案——所有这些都来自于 Linux 操作系统的舒适性和安全性。 + +这对微软和消费者而言是双赢的,因为这样 Windows 没有那么多令人头疼的事情要处理(通过捕获漏洞和对其专有解决方案进行安全补丁),消费者可以得到一个更可靠的解决方案而不会错过任何东西。 +如果微软打对了牌,他们可以对 KDE 或几乎任何 Linux 桌面环境重新设置主题,使其与 Windows 10 界面没有太大区别。 + +如果布局得当,消费者甚至可能都不知道其中的区别——“Windows 11” 将仅仅是 Microsoft 桌面操作系统的下一个演进版本。 + +说到胜利,IT 专业人员将花费更少的时间来处理病毒、恶意软件和操作系统问题,而把更多的时间用于保持网络(以及为该网络供动力的服务器)的运行和安全上。 + +### 大卖场怎么办? + +这是个关键的地方。为了让这一做法真正发挥作用,微软将不得不完全放弃 Windows,转而使用自己风格的 Linux。基于同样的思路,微软需要确保大卖场里的 PC 都安装了 Microsoft Linux 系统。没有半途而废的余地——微软必须全力以赴,以确保这次转型的成功。 + +一旦大卖场开始销售安装了 Microsoft Linux 的 PC 和笔记本电脑,我预测这一举措对所有相关人员来说将会是一个巨大的成功。微软会被视为终于推出了一款值得消费者信赖的操作系统;消费者将拥有一个这样的桌面操作系统,它不会带来太多令人头疼的事情,而会带来真正的生产力和乐趣;Linux 社区最终将主导桌面计算机。 + +### Microsoft Linux:时机已到 + +你可能会认为这个想法很疯狂,但如果你真的仔细想想,微软 Windows 的演进就是朝着这个方向发展的。为什么不绕过这个时间线的中途部分,而直接跳到一个为所有参与者带来成功的终极游戏呢? Microsoft Linux 正当其时。 + +--- +via: https://www.techrepublic.com/article/could-microsoft-be-en-route-to-dumping-windows-in-favor-of-linux/ + +作者:[jack-wallen][a] +选题:[wxy][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.techrepublic.com/meet-the-team/us/jack-wallen/ +[b]: https://github.com/wxy +[1]: https://www.zdnet.com/article/linux-based-windows-makes-perfect-sense/ +[2]: https://www.techrepublic.com/article/microsoft-older-windows-10-versions-now-get-to-run-windows-subsystem-for-linux-2/ +[3]: https://www.techrepublic.com/resource-library/whitepapers/microsoft-build-2020-highlights/ +[4]: https://www.techrepublic.com/article/microsoft-azure-the-smart-persons-guide/ +[5]: https://www.techrepublic.com/article/amazon-web-services-the-smart-persons-guide/ +[6]: https://www.techrepublic.com/article/google-cloud-platform-the-smart-persons-guide/ +[7]: https://www.techrepublic.com/article/windows-10-the-smart-persons-guide/ +[8]: https://www.techrepublic.com/article/phishing-and-spearphishing-a-cheat-sheet/ +[9]: https://www.techrepublic.com/article/everything-a-linux-admin-needs-to-know-about-working-from-the-command-line/ +[10]: https://www.techrepublic.com/article/microsoft-365-a-cheat-sheet/ +[11]: https://www.techrepublic.com/article/software-as-a-service-saas-a-cheat-sheet/ diff --git a/published/202010/20201012 Linux Jargon Buster- What is Display Manager in Linux.md b/published/202010/20201012 Linux Jargon Buster- What is Display Manager in Linux.md new file mode 100644 index 0000000000..2aef0b010f --- /dev/null +++ b/published/202010/20201012 Linux Jargon Buster- What is Display Manager in Linux.md @@ -0,0 +1,101 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12773-1.html) +[#]: subject: (Linux Jargon Buster: What is Display Manager in Linux?) +[#]: via: (https://itsfoss.com/display-manager/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是显示管理器? +====== + +> 在这篇 Linux 黑话解释中,你将了解 Linux 中的显示管理器。它是桌面环境的一部分吗?它的作用是什么? + +### 什么是 Linux 中的显示管理器? + +简单来说,显示管理器display manager(DM)是一个为你的 Linux 发行版提供图形登录功能的程序。它控制用户会话并管理用户认证。显示管理器会在你输入用户名和密码后,立即启动[显示服务器][1]并加载[桌面环境][2]。 + +显示管理器通常是登录界面的代名词。毕竟它是可见的部分。然而,可见的登录屏幕,也叫欢迎页greeter,只是显示管理器的一部分。 + +![登录屏幕是显示管理器的可见部分][3] + +像[各种桌面环境][4]和显示服务器一样,也有各种显示管理器。我们来看看它们。 + +### 不同的显示管理器 + +有些人认为显示管理器是桌面环境的一部分,但事实并非如此。它是一个独立的程序。 + +桌面环境可能会推荐某个显示管理器,但这并不意味着它不能与其它一些显示管理器一起工作。如果你曾经在同一个系统中安装过不止一个桌面环境,你会记得,登录界面(即显示管理器)允许你切换桌面环境。 + +![显示管理器可以与各种桌面环境配合使用][5] + +虽然显示管理器不是桌面环境本身的一部分,但它往往与桌面环境由同一个开发团队开发。它也成为桌面环境的代表。 + +例如,GNOME 桌面环境开发了 GDM(GNOME Display Manager),光看登录界面就会想到 GNOME 桌面环境。 + +![GNOME登录屏幕与GDM][6] + +一些流行的显示管理器有: + + * [GDM][7](GNOME 显示管理器GNOME Display Manager):GNOME 的首选。 + * [SDDM][8](简单桌面显示管理器Simple Desktop Display Manager):KDE 首选。 + * LightDM:由 Ubuntu 为 Unity 桌面开发。 + +### 显示管理器可以定制 + +有这么多的桌面环境可供选择,它们都有自己的显示管理器吗?不,不是这样的。 + +正如我之前提到的,可见的登录屏幕被称为欢迎页。这个欢迎页可以进行自定义来改变登录屏幕的外观。 + +事实上,许多发行版和/或桌面环境都制作了自己的欢迎页,以给用户提供一个类似于他们品牌的登录屏幕。 + +例如,Mint 的 Cinnamon 桌面使用了 LightDM,但有自己的欢迎页来给它更多的 Mint 式(或者我应该说是 Cinnamon)的外观。 + +![基于 LightDM 的 Linux Mint 登录屏幕][9] + +来看看 Kali Linux 的登录界面: + +![Kali Linux 登录界面][10] + +如果你喜欢编码和调整,你可以根据自己的喜好修改或编码自己的欢迎页。 + +### 改变显示管理器 + +如果你愿意,可以[更改显示管理器][11]。你需要先安装显示管理器。安装时你会看到切换显示管理器的选项。 + +![][12] + +如果当时没有做切换,那么以后可以通过手动配置来改变显示管理器。不同的发行版重新配置显示管理器的方法略有不同,这不在本文讨论范围内。 + +### 结语 + +希望大家对 Linux 中的显示管理器这个术语有一点了解。本黑话解释系列的目的是用非技术性的语言解释常见的 Linux 俗语和技术术语,而不涉及太多的细节。 + +欢迎大家提出意见和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/display-manager/ + +作者:[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/display-server/ +[2]: https://itsfoss.com/what-is-desktop-environment/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/05/login-screen-opensuse.jpg?resize=800%2C474&ssl=1 +[4]: https://itsfoss.com/best-linux-desktop-environments/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/deepin-session-ubuntu.jpg?resize=800%2C414&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/Login-screen-1.png?resize=800%2C450&ssl=1 +[7]: https://wiki.gnome.org/Projects/GDM +[8]: https://github.com/sddm +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/linux-mint-login-screen.jpg?resize=800%2C418&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/kali-linux-login-screen.jpg?resize=799%2C450&ssl=1 +[11]: https://itsfoss.com/switch-gdm-and-lightdm-in-ubuntu-14-04/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2014/06/Switch_between_gdm_and_lightgdm_Ubuntu.jpeg?resize=700%2C448&ssl=1 diff --git a/published/202010/20201013 Install MariaDB or MySQL on Linux.md b/published/202010/20201013 Install MariaDB or MySQL on Linux.md new file mode 100644 index 0000000000..62bd23b48e --- /dev/null +++ b/published/202010/20201013 Install MariaDB or MySQL on Linux.md @@ -0,0 +1,112 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12743-1.html) +[#]: subject: (Install MariaDB or MySQL on Linux) +[#]: via: (https://opensource.com/article/20/10/mariadb-mysql-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +在 Linux 上安装 MariaDB 或 MySQL +====== + +> 开始在 Linux 系统上使用开源的 SQL 数据库吧。 + +![](https://img.linux.net.cn/data/attachment/album/202010/22/144122hkkqrs2dhi9c7kif.jpg) + +[MariaDB][2] 和 [MySQL][3] 都是使用 SQL 的开源数据库,并且共享相同的初始代码库。MariaDB 是 MySQL 的替代品,你可以使用相同的命令(`mysql`)与 MySQL 和 MariaDB 数据库进行交互。因此,本文同时适用于 MariaDB 和 MySQL。 + +### 安装 MariaDB + +你可以使用你的 Linux 发行版的包管理器安装 MariaDB。在大多数发行版上,MariaDB 分为服务器包和客户端包。服务器包提供了数据库“引擎”,即 MariaDB 在后台运行(通常在物理服务器上)的部分,它监听数据输入或数据输出请求。客户端包提供了 `mysql` 命令,你可以用它来与服务器通信。 + +在 RHEL、Fedora、CentOS 或类似的发行版上: + +``` +$ sudo dnf install mariadb mariadb-server +``` + +在 Debian、Ubuntu、Elementary 或类似的发行版上: + +``` +$ sudo apt install mariadb-client mariadb-server +``` + +其他操作系统可能会以不同的打包系统封装 MariaDB,所以你可能需要搜索你的软件仓库来了解你的发行版的维护者是如何提供它的。 + +### 启动 MariaDB + +因为 MariaDB 被设计为部分作为数据库服务器,它可以在一台计算机上运行,并从另一台计算机上进行管理。只要你能访问运行它的计算机,你就可以使用 `mysql` 命令来管理数据库。在写这篇文章时,我在本地计算机上运行了 MariaDB,但你同样可与远程系统上托管的 MariaDB 数据库进行交互。 + +在启动 MariaDB 之前,你必须创建一个初始数据库。在初始化其文件结构时,你应该定义你希望 MariaDB 使用的用户。默认情况下,MariaDB 使用当前用户,但你可能希望它使用一个专用的用户帐户。你的包管理器可能为你配置了一个系统用户和组。使用 `grep` 查找是否有一个 `mysql` 组: + +``` +$ grep mysql /etc/group +mysql:x:27: +``` + +你也可以在 `/etc/passwd` 中寻找这个专门的用户,但通常情况下,有组就会有用户。如果没有专门的 `mysql` 用户和组,可以在 `/etc/group` 中寻找一个明显的替代品(比如 `mariadb`)。如果没有,请阅读你的发行版文档来了解 MariaDB 是如何运行的。 + +假设你的安装使用 `mysql`,初始化数据库环境: + +``` +$ sudo mysql_install_db --user=mysql +Installing MariaDB/MySQL system tables in '/var/lib/mysql'... +OK +[...] +``` + +这一步的结果显示了接下来你必须执行的配置 MariaDB 的任务: + +``` +PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER ! +To do so, start the server, then issue the following commands: + +'/usr/bin/mysqladmin' -u root password 'new-password' +'/usr/bin/mysqladmin' -u root -h $(hostname) password 'new-password' + +Alternatively you can run: +'/usr/bin/mysql_secure_installation' + +which will also give you the option of removing the test +databases and anonymous user created by default.  This is +strongly recommended for production servers. +``` + +使用你的发行版的初始化系统启动 MariaDB: + +``` +$ sudo systemctl start mariadb +``` + +在启动时启用 MariaDB 服务器: + +``` +$ sudo systemctl enable --now mariadb +``` + +现在你已经有了一个 MariaDB 服务器,为它设置一个密码: + +``` +mysqladmin -u root password 'myreallysecurepassphrase' +mysqladmin -u root -h $(hostname) password 'myreallysecurepassphrase' +``` + +最后,如果你打算在生产服务器上使用它,请在上线前运行 `mysql_secure_installation` 命令。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/mariadb-mysql-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data) +[2]: https://mariadb.org/ +[3]: https://www.mysql.com/ diff --git a/published/202010/20201014 2 Ways to Download Files From Linux Terminal.md b/published/202010/20201014 2 Ways to Download Files From Linux Terminal.md new file mode 100644 index 0000000000..0fa87fe9f0 --- /dev/null +++ b/published/202010/20201014 2 Ways to Download Files From Linux Terminal.md @@ -0,0 +1,190 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12752-1.html) +[#]: subject: (2 Ways to Download Files From Linux Terminal) +[#]: via: (https://itsfoss.com/download-files-from-linux-terminal/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +2 种从 Linux 终端下载文件的方法 +====== + +如果你被困在 Linux 终端,比如说在服务器上,如何从终端下载文件? + +在 Linux 中是没有 `download` 命令的,但是有几个 Linux 命令可用于下载文件。 + +在这篇终端技巧中,你将学习两种在 Linux 中使用命令行下载文件的方法。 + +我在这里使用的是 Ubuntu,但除了安装,其余的命令同样适用于所有其他 Linux 发行版。 + +### 使用 wget 命令从 Linux 终端下载文件 + +![][1] + +[wget][2] 也许是 Linux 和类 UNIX 系统中使用最多的命令行下载管理器。你可以使用 `wget` 下载一个文件、多个文件、整个目录甚至整个网站。 + +`wget` 是非交互式的,可以轻松地在后台工作。这意味着你可以很容易地在脚本中使用它,甚至构建像 [uGet 下载管理器][3]这样的工具。 + +让我们看看如何使用 `wget` 从终端下载文件。 + +#### 安装 wget + +大多数 Linux 发行版都预装了 `wget`。它也可以在大多数发行版的仓库中找到,你可以使用发行版的包管理器轻松安装它。 + +在基于 Ubuntu 和 Debian 的发行版上,你可以使用 [apt 包管理器][4]命令: + +``` +sudo apt install wget +``` + +#### 使用 wget 下载文件或网页 + +你只需要提供文件或网页的 URL。它将在你所在的目录下以原始名下载该文件。 + +``` +wget URL +``` + +![][5] + +要下载多个文件,你必须将它们的 URL 保存在一个文本文件中,并将该文件作为输入提供给 `wget`,就像这样: + +``` +wget -i download_files.txt +``` + +#### 用 wget 下载不同名字的文件 + +你会注意到,网页在 `wget` 中几乎总是以 `index.html` 的形式保存。为下载的文件提供自定义名称是个好主意。 + +你可以在下载时使用 `-O` (大写字母 `O`) 选项来提供输出文件名: + +``` +wget -O filename URL +``` + +![][6] + +#### 用 wget 下载一个文件夹 + +假设你正在浏览一个 FTP 服务器,你需要下载整个目录,你可以使用递归选项 `-r`: + +``` +wget -r ftp://server-address.com/directory +``` + +#### 使用 wget 下载整个网站 + +是的,你完全可以做到这一点。你可以用 `wget` 镜像整个网站。我说的下载整个网站是指整个面向公众的网站结构。 + +虽然你可以直接使用镜像选项 `-m`,但最好加上: + + * `–convert-links`:链接将被转换,使内部链接指向下载的资源,而不是网站。 + * `–page-requisites`:下载额外的东西,如样式表,使页面在离线状态下看起来更好。 + +``` +wget -m --convert-links --page-requisites website_address +``` + +![][7] + +#### 额外提示:恢复未完成的下载 + +如果你因为某些原因按 `CTRL-C` 键中止了下载,你可以用选项 `-c` 恢复之前的下载: + +``` +wget -c +``` + +### 使用 curl 在 Linux 命令行中下载文件 + +和 `wget` 一样,[curl][8] 也是 Linux 终端中最常用的下载文件的命令之一。[使用 curl][9] 的方法有很多,但我在这里只关注简单的下载。 + +#### 安装 curl + +虽然 `curl` 并不是预装的,但在大多数发行版的官方仓库中都有。你可以使用你的发行版的包管理器来安装它。 + +要[在 Ubuntu][10] 和其他基于 Debian 的发行版上安装 `curl`,请使用以下命令: + +``` +sudo apt install curl +``` + +#### 使用 curl 下载文件或网页 + +如果你在使用 `curl` 命令时没有在 URL 中带任何选项,它就会读取文件并打印在终端上。 + +要在 Linux 终端中使用 `curl` 命令下载文件,你必须使用 `-O`(大写字母 `O`)选项: + +``` +curl -O URL +``` + +![][11] + +在 Linux 中,用 `curl` 下载多个文件是比较简单的。你只需要指定多个 URL 即可: + +``` +curl -O URL1 URL2 URL3 +``` + +请记住,`curl` 不像 `wget` 那么简单。`wget` 可以将网页保存为 `index.html`,`curl` 却会抱怨远程文件没有网页的名字。你必须按照下一节的描述用一个自定义的名字来保存它。 + +#### 用不同的名字下载文件 + +这可能会让人感到困惑,但如果要为下载的文件提供一个自定义的名称(而不是原始名称),你必须使用 `-o`(小写 `O`)选项: + +``` +curl -o filename URL +``` + +![][12] + +有些时候,`curl` 并不能像你期望的那样下载文件,你必须使用选项 `-L`(代表位置)来正确下载。这是因为有些时候,链接会重定向到其他链接,而使用选项 `-L`,它就会跟随最终的链接。 + +#### 用 curl 暂停和恢复下载 + +和 `wget` 一样,你也可以用 `curl` 的 `-c` 选项恢复暂停的下载: + +``` +curl -c URL +``` + +### 总结 + +和以往一样,在 Linux 中做同一件事有多种方法。从终端下载文件也不例外。 + +`wget` 和 `curl` 只是 Linux 中最流行的两个下载文件的命令。还有更多这样的命令行工具。基于终端的网络浏览器,如 [elinks][13]、[w3m][14] 等也可以用于在命令行下载文件。 + +就个人而言,对于一个简单的下载,我更喜欢使用 `wget` 而不是 `curl`。它更简单,也不会让你感到困惑,因为你可能很难理解为什么 `curl` 不能以预期的格式下载文件。 + +欢迎你的反馈和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/download-files-from-linux-terminal/ + +作者:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/Download-Files-from-Linux-terminal.png?resize=800%2C450&ssl=1 +[2]: https://www.gnu.org/software/wget/ +[3]: https://itsfoss.com/install-latest-uget-ubuntu-linux-mint/ +[4]: https://itsfoss.com/apt-command-guide/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-file-in-linux-terminal-using-wget.png?resize=795%2C418&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-file-in-linux-terminal-using-wget-2.png?resize=795%2C418&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-entire-website-using-wget.png?resize=795%2C418&ssl=1 +[8]: https://curl.haxx.se/ +[9]: https://linuxhandbook.com/curl-command-examples/ +[10]: https://itsfoss.com/install-curl-ubuntu/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-files-in-linux-using-curl.png?resize=795%2C418&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/download-files-in-linux-using-curl-1.png?resize=795%2C418&ssl=1 +[13]: http://elinks.or.cz/ +[14]: http://w3m.sourceforge.net/ diff --git a/published/202010/20201014 MellowPlayer is a Desktop App for Various Streaming Music Services.md b/published/202010/20201014 MellowPlayer is a Desktop App for Various Streaming Music Services.md new file mode 100644 index 0000000000..b9a67ba724 --- /dev/null +++ b/published/202010/20201014 MellowPlayer is a Desktop App for Various Streaming Music Services.md @@ -0,0 +1,92 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12759-1.html) +[#]: subject: (MellowPlayer is a Desktop App for Various Streaming Music Services) +[#]: via: (https://itsfoss.com/mellow-player/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +MellowPlayer:一款用于各种流媒体音乐服务的桌面应用 +====== + +> MellowPlayer 是一个自由开源的桌面应用,可以让你在 Linux 和 Windows 上整合基于网络的音乐流媒体服务。 + +![][8] + +毋庸置疑,很多用户都喜欢使用流媒体服务来收听自己喜欢的音乐,而不是从商店购买单首音乐或者下载收藏。 + +当然,流媒体服务可以让你探索新的音乐,帮助艺术家轻松传播到更多的听众。但是,由于有许多的音乐流媒体服务([Soundcloud][1]、[Spotify][2]、[YouTube Music][3]、[Amazon Music][4] 等),因此当在使用电脑时,要有效地使用它们往往会变得很麻烦。 + +你可以[在 Linux 上安装 Spotify][5],但没有 Amazon Music 的桌面应用,所以,有可能你无法从单一门户管理流媒体服务。 + +如果一个桌面应用可以让你同时在 Windows 和 Linux 上免费整合流媒体服务呢?在本文中,我将介绍这样一款应用:[MellowPlayer][6]。 + +### MellowPlayer: 集成各种流媒体音乐服务的开源应用 + +![][7] + +MellowPlayer 是一款自由开源的跨平台桌面应用,它可以让你整合多个流媒体服务,并在一个界面上管理它们。 + +你可以整合多个支持的流媒体服务。你还可以从每个服务中获得一定程度的控制权,来调整你的体验。例如,你可以设置在 YouTube 上自动跳过或静音广告。 + +对 Windows 和 Linux 的跨平台支持绝对是一个加分项。 + +除了能够管理流媒体服务外,它还将播放器与系统托盘整合在一起来轻松控制音乐。这意味着你可以使用键盘上的媒体键来控制音乐播放器。 + +另外值得一提的是,你只要在应用内自己创建一个插件,就可以添加一个官方不支持的新服务。为了让你对它有更多的了解,下面就让我重点介绍一下所有的主要特点。 + +### MellowPlayer 的特点 + + * 跨平台 (Windows 和 Linux) + * 自由且开源 + * 基于插件的应用,让你可以通过创建一个插件来添加新的服务 + * 将服务作为本地桌面应用与系统托盘整合 + * 支持热键 + * 支持通知 + * 收听历史 + +### 在 Linux 上安装 MellowPlayer + +![][9] + +MellowPlayer 是以 [Flatpak 包][10]的形式提供的。我知道这让一些人很失望,但它在 Linux 中只有 Flaptak,Windows 中只有一个可执行文件。如果你不知道,请按照我们的[在 Linux 上使用 Flatpak][11] 指南来开始使用。 + +- [下载 MellowPlayer][12] + +### 总结 + +MellowPlayer 是一款方便的桌面应用,适合经常涉猎多种流媒体音乐服务的用户使用。尽管根据我的测试,它在 SoundCloud、YouTube 和 Spotify 上都能正常工作,但我确实注意到,当我试图重新调整窗口大小时,应用会崩溃,只是在此提醒一下。你可以在它的 [GitLab 页面][13]上了解更多关于它的内容。 + +还有两个类似的应用,可以让你播放多个流媒体音乐服务。[Nuvola][14] 和 [Nuclear Music Player][15]。你可能会想看看它们。 + +你试过 MellowPlayer 吗?欢迎在下方评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/mellow-player/ + +作者:[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://soundcloud.com +[2]: https://www.spotify.com +[3]: https://music.youtube.com +[4]: https://music.amazon.com/home +[5]: https://itsfoss.com/install-spotify-ubuntu-linux/ +[6]: https://colinduquesnoy.gitlab.io/MellowPlayer/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/mellowplayer-screenshot.jpg?resize=800%2C439&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/mellowplayer.png?resize=800%2C442&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/mellowplayer-system-integration.jpg?resize=800%2C438&ssl=1 +[10]: https://flathub.org/apps/details/com.gitlab.ColinDuquesnoy.MellowPlayer +[11]: https://itsfoss.com/flatpak-guide/ +[12]: https://colinduquesnoy.gitlab.io/MellowPlayer/#features +[13]: https://gitlab.com/ColinDuquesnoy/MellowPlayer +[14]: https://itsfoss.com/nuvola-music-player/ +[15]: https://itsfoss.com/nuclear-music-player-linux/ diff --git a/published/202010/20201014 Try Linux on any computer with this bootable USB tool.md b/published/202010/20201014 Try Linux on any computer with this bootable USB tool.md new file mode 100644 index 0000000000..9e72c9dab8 --- /dev/null +++ b/published/202010/20201014 Try Linux on any computer with this bootable USB tool.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12769-1.html) +[#]: subject: (Try Linux on any computer with this bootable USB tool) +[#]: via: (https://opensource.com/article/20/10/fedora-media-writer) +[#]: author: (Sumantro Mukherjee https://opensource.com/users/sumantro) + +用这个创建可引导 USB 的工具在电脑上尝试 Linux +====== + +> Fedora Media Writer 是创建临场版 USB 以尝试 Linux 的方便方法。 + +![](https://img.linux.net.cn/data/attachment/album/202010/30/122142c1cmcv7cxgjmw5vw.jpg) + +[Fedora Media Writer][2] 是一个小巧、轻量、全面的工具,它简化了 Linux 的入门体验。它可以下载 Fedora 的 Workstation 或 Server 版本并写入到一个可以在任何系统上引导的 USB 驱动器上,使你无需将其安装到硬盘上就可以试用 Fedora Linux。 + +Media Writer 工具可以用来创建一个临场体验的Live、可引导的 USB 驱动器。在你的平台上安装 Fedora Media Writer 应用后,你可以下载并烧录最新的 Fedora Workstation 或 Server 稳定版,也可以选择烧录你下载的任何其他镜像。而且它并不局限于英特尔 64 位设备。它还可以用于 ARM 设备,如[树莓派][3],这些设备日益变得更加强大和有用。 + +![Fedora Media Writer main screen][4] + +### 安装 Fedora Media Writer + +[安装 Fedora Media Writer][6] 有几种方式。你可以通过 GitHub [从源码编译][7]、下载 MacOS 或 Windows 版本、使用 `dnf` 或 `yum` 安装 RPM 包,或者以 Flatpak 的形式获得。 + +在 Fedora 上: + +``` +$ sudo dnf install mediawriter +``` + +最新版本请参见 GitHub 仓库的[发布][8]部分。 + +### 准备好你的媒体介质 + +首先,你需要一个 USB 驱动器来安装你的 Linux 操作系统。这就是 Fedora Media Writer 要烧录的设备。这个驱动器必须是空白或可擦除的,因为 **该 USB 驱动器上的所有数据都会被删除**。如果有任何数据,哪怕只是一个文件,如果你不想丢失,那么你必须在继续之前备份它! + +确认你的 USB 驱动器是可擦除的之后,将它插入你的电脑并启动 Fedora Media Writer。 + +### 使用 Fedora Media Writer + +当你启动 Fedora Media Writer 时,你会看到一个页面,提示你从互联网上获取一个可引导的镜像,或者从你的硬盘上加载一个自定义镜像。第一个选择是 Fedora 的最新版本。Workstation 版本适用于台式机和笔记本电脑,Server 版本适用于虚拟化、机架服务器或任何你想作为服务器运行的情况。 + +如果你选择了 Fedora 镜像,Media Writer 会下载一个光盘镜像(通常称为 “iso”,文件扩展名为 .iso),并将其保存到你的下载文件夹中,这样你就可以重复使用它来烧录另一个驱动器。 + +![Select your image][9] + +另外还有 Fedora Spins,这是来自 Fedora 社区的镜像,它旨在满足小众的兴趣。例如,如果你是 [MATE 桌面][10]的粉丝,那么你会很高兴地发现 Media Writer 提供了 MATE spin。它有很多,所以请滚动查看所有的选择。如果你是 Linux 的新手,不要被吓到或感到困惑:这些额外的选项是为老用户准备的,这些用户除了默认的选项外,还发展出了自己的偏好,所以对你来说,只使用 Workstation 或 Server 选项就行,这取决于你是想把 Fedora 作为一个桌面还是作为一个服务器操作系统来运行。 + +如果你需要一个与你当前使用的 CPU 不同架构的镜像,从窗口右上角的下拉菜单中选择 CPU 架构。 + +如果你已经将镜像保存在硬盘上,请选择“Custom Image”选项,并选择你要烧录到 USB 的发行版的 .iso 文件。 + +### 写入 USB 驱动器 + +当你下载或选择了一个镜像,你必须确认你要将该镜像写入驱动器。 + +驱动器选择下拉菜单只显示了外部驱动器,所以你不会意外地覆盖自己的硬盘驱动器。这是 Fedora Media Writer 的一个重要功能,它比你在网上看到的许多手动说明要安全得多。然而,如果你的计算机上连接了多个外部驱动器,除了你想覆盖的那个,你应该将它们全部移除,以增加安全性。 + +选择你要安装镜像的驱动器,然后单击“Write to Disk”按钮。 + +![Media write][11] + +稍等一会儿,镜像就会被写入到你的驱动器,然后可以看看 Don Watkins 对[如何从 USB 驱动器启动到 Linux][12]的出色介绍。 + +### 开始使用 Linux + +Fedora Media Writer 是一种将 Fedora Workstation 或 Server,或任何 Linux 发行版烧录到 USB 驱动器的方法,因此你可以在安装它到设备上之前试用它。试试吧,并在评论中分享你的经验和问题。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/fedora-media-writer + +作者:[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/usb-hardware.png?itok=ROPtNZ5V (Multiple USB plugs in different colors) +[2]: https://github.com/FedoraQt/MediaWriter +[3]: https://fedoraproject.org/wiki/Architectures/ARM/Raspberry_Pi +[4]: https://opensource.com/sites/default/files/uploads/fmw_mainscreen.png (Fedora Media Writer main screen) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://docs.fedoraproject.org/en-US/fedora/f32/install-guide/install/Preparing_for_Installation/#_fedora_media_writer +[7]: https://github.com/FedoraQt/MediaWriter#building +[8]: https://github.com/FedoraQt/MediaWriter/releases +[9]: https://opensource.com/sites/default/files/mediawriter-image.png +[10]: https://opensource.com/article/19/12/mate-linux-desktop +[11]: https://opensource.com/sites/default/files/mediawriter-write.png (Media write) +[12]: https://opensource.com/article/20/4/first-linux-computer diff --git a/published/202010/20201016 Set up ZFS on Linux with yum.md b/published/202010/20201016 Set up ZFS on Linux with yum.md new file mode 100644 index 0000000000..1386118d8b --- /dev/null +++ b/published/202010/20201016 Set up ZFS on Linux with yum.md @@ -0,0 +1,122 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12754-1.html) +[#]: subject: (Set up ZFS on Linux with yum) +[#]: via: (https://opensource.com/article/20/10/zfs-dnf) +[#]: author: (Sheng Mao https://opensource.com/users/ivzhh) + +在 Linux 上使用 yum 设置 ZFS +====== + +> 在 Fedora 上使用 yum 仓库来获取最新的 ZFS 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202010/26/103028g9q3v3e391c9b62v.jpg) + +我是一名 Fedora Linux 用户,我每天都会运行 `yum upgrade`。虽然这个习惯使我能够运行所有最新的软件([Fedora 的四个基础][2]之一的 “First” ,它也做到了),但它也会提醒 [ZFS][3] 存储平台和新内核之间的不兼容性。 + +作为一名开发者,有时我需要最新的 ZFS 分支的新特性。例如,ZFS 2.0.0 包含了一个令人兴奋的新功能,它大大[提高了 ZVOL 同步性能][4],这对我这个 KVM 用户来说至关重要。但这意味着,如果我想使用 2.0.0 分支,我必须自己构建 ZFS。 + +起初,我只是在每次内核更新后从它的 Git 仓库中手动编译 ZFS。如果我忘记了,ZFS 就会在下次启动时无法被识别。幸运的是,我很快就学会了如何为 ZFS 设置动态内核模块支持 ([DKMS][5])。然而,这个解决方案并不完美。首先,它没有利用强大的 [yum][6] 系统,而这个系统可以帮助解决依赖关系和升级。此外,使用 `yum` 在你自己的包和上游包之间进行切换是非常容易的。 + +在本文中,我将演示如何设置 `yum` 仓库来打包 ZFS。这个方案有两个步骤: + + 1. 从 ZFS 的 Git 仓库中创建 RPM 包。 + 2. 建立一个 `yum` 仓库来托管这些包。 + +### 创建 RPM 包 + +要创建 RPM 包,你需要安装 RPM 工具链。`yum` 提供了一个组来捆绑安装这些工具: + +``` +sudo dnf group install 'C Development Tools and Libraries' 'RPM Development Tools' +``` + +安装完这些之后,你必须从 ZFS Git 仓库中安装构建 ZFS 所需的所有包。这些包属于三个组: + + 1. [Autotools][7],用于从平台配置中生成构建文件。 + 2. 用于构建 ZFS 内核和用户态工具的库。 + 3. 构建 RPM 包的库。 + +``` +sudo dnf install libtool autoconf automake gettext createrepo \ +    libuuid-devel libblkid-devel openssl-devel libtirpc-devel \ +    lz4-devel libzstd-devel zlib-devel \ +    kernel-devel elfutils-libelf-devel \ +    libaio-devel libattr-devel libudev-devel \ +    python3-devel libffi-devel +``` + +现在你已经准备好创建你自己的包了。 + +### 构建 OpenZFS + +[OpenZFS][8] 提供了优秀的基础设施。要构建它: + + 1. 用 `git` 克隆仓库,并切换到你希望使用的分支/标签。 + 2. 运行 Autotools 生成一个 makefile。 + 3. 运行 `make rpm`,如果一切正常,RPM 文件将被放置在 `build` 文件夹中。 + +``` +$ git clone --branch=zfs-2.0.0-rc3 zfs +$ cd zfs +$ ./autogen.sh +$ ./configure +$ make rpm +``` + +### 建立一个 yum 仓库 + +在 `yum` 中,仓库是一个服务器或本地路径,包括元数据和 RPM 文件。用户设置一个 INI 配置文件,`yum` 命令会自动解析元数据并下载相应的软件包。 + +Fedora 提供了 `createrepo` 工具来设置 `yum` 仓库。首先,创建仓库,并将 ZFS 文件夹中的所有 RPM 文件复制到仓库中。然后运行 `createrepo --update` 将所有的包加入到元数据中。 + +``` +$ sudo mkdir -p /var/lib/zfs.repo +$ sudo createrepo /var/lib/zfs.repo +$ sudo cp *.rpm /var/lib/zfs.repo/ +$ sudo createrepo --update /var/lib/zfs.repo +``` + +在 `/etc/yum.repos.d` 中创建一个新的配置文件来包含仓库路径: + +``` +$ echo \ +"[zfs-local]\\nname=ZFS Local\\nbaseurl=file:///var/lib/zfs.repo\\nenabled=1\\ngpgcheck=0" |\ +sudo tee /etc/yum.repos.d/zfs-local.repo + +$ sudo dnf --repo=zfs-local list available --refresh +``` + +终于完成了!你已经有了一个可以使用的 `yum` 仓库和 ZFS 包。现在你只需要安装它们。 + +``` +$ sudo dnf install zfs +$ sudo /sbin/modprobe zfs +``` + +运行 `sudo zfs version` 来查看你的用户态和内核工具的版本。恭喜!你拥有了 [Fedora 中的 ZFS][9]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/zfs-dnf + +作者:[Sheng Mao][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/ivzhh +[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://docs.fedoraproject.org/en-US/project/#_what_is_fedora_all_about +[3]: https://zfsonlinux.org/ +[4]: https://www.phoronix.com/scan.php?page=news_item&px=OpenZFS-3x-Boost-Sync-ZVOL +[5]: https://www.linuxjournal.com/article/6896 +[6]: https://en.wikipedia.org/wiki/Yum_%28software%29 +[7]: https://opensource.com/article/19/7/introduction-gnu-autotools +[8]: https://openzfs.org/wiki/Main_Page +[9]: https://openzfs.github.io/openzfs-docs/Getting%20Started/Fedora.html diff --git a/published/202010/20201027 Fedora 33 is officially here.md b/published/202010/20201027 Fedora 33 is officially here.md new file mode 100644 index 0000000000..f1fa986952 --- /dev/null +++ b/published/202010/20201027 Fedora 33 is officially here.md @@ -0,0 +1,93 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12764-1.html) +[#]: subject: (Fedora 33 is officially here!) +[#]: via: (https://fedoramagazine.org/announcing-fedora-33/) +[#]: author: (Matthew Miller https://fedoramagazine.org/author/mattdm/) + +Fedora 33 正式发布了 +====== + +![][1] + +> 本文译自 Fedora 官方发布公告。 + +今天,我很兴奋地与大家分享数千名 Fedora 项目贡献者辛勤工作的成果:我们的最新版本 Fedora 33 来了! 这是一个有着很多变化的大版本,但我相信所有这些工作也会让您感到舒适,实现我们的目标:即为您带来最新的稳定、强大、健壮的自由和开源软件,并提供许多易于使用的产品。  + +如果您不想耽误时间,直接体验,现在就去 下载吧,欲了解详情请继续阅读! + +### 找到适合您的 Fedora 风味! + +Fedora Edition 是针对桌面、服务器和云环境中各种“体现”特定用途的目标产品,现在它也适用于物联网。 + +Fedora Workstation 专注于桌面,尤其是面向那些想要“只管去用”的 Linux 操作系统体验的软件开发者。这个版本的特点是 [GNOME 3.38][2],它一如既往地有很多很棒的改进。新增的 Tour 应用可以帮助新用户学习它们的操作方式。和我们所有其他面向桌面的变体一样,Fedora Workstation 现在使用 [BTRFS 作为默认文件系统][3]。这些发布的版本中带来了很多伟大的增强功能,这个先进的文件系统为之奠定了基础。为了您的视觉享受,Fedora 33 Workstation 现在默认提供了一个动画背景(它会基于一天中的时间变化)。 + +Fedora CoreOS 是一个新兴的 Fedora 版本。它是一个自动更新的、最小化的操作系统,用于安全地、大规模地运行容器化工作负载。它提供了几个[更新流][4],可以遵循大致每两周一次的自动更新。目前 **next** 流是基于 Fedora 33 的,**testing** 和 **stable** 流后继也会跟进。您可以从[下载页面][5]中找到关于跟随 **next** 流发布的工件的信息,并在 [Fedora CoreOS 文档][6]中找到关于如何使用这些工件的信息。 + +新晋升为 Edition 状态的 [Fedora IoT][7],为物联网生态系统和边缘计算用例提供了坚实的基础。在许多功能之外,Fedora 33 IoT 还引入了平台抽象安全Platform AbstRaction for SECurity(PARSEC),这是一个开源倡议,以平台无关的方式为硬件安全和加密服务提供了通用 API。 + +当然,我们制作的不仅仅是“官方版本”,还有 [Fedora Spin][8]和 [Lab][9]。[Fedora Spin][8] 和 [Lab][9] 针对不同的受众和用例,包括 [Fedora CompNeuro][10],它为神经科学带来了大量的开源计算建模工具,以及 [KDE Plasma][11] 和 [Xfce][12]等桌面环境。  + +此外,别忘了我们还有备用架构:[ARM AArch64、Power 和 S390x][13]。在 Fedora 33 中提供的新功能,AArch64 用户可以使用 .NET Core 语言进行跨平台开发。我们改进了对 Pine64 设备、NVidia Jetson 64 位平台以及 Rockchip 片上系统(SoC)设备的支持,包括 Rock960、RockPro64 和 Rock64。(不过,有个最新的说明:在其中一些设备上可能会出现启动问题。从现有的 Fedora 32 升级是没问题的。更多信息将在[常见错误][14]页面上公布。) + +我们也很高兴地宣布,Fedora 云镜像和 Fedora CoreOS 将首次与 Fedora 33 一起在亚马逊的 [AWS 市场][15] 中提供。Fedora 云镜像在亚马逊云中已经存在了十多年,您可以通过 AMI ID 或[点击一下][16]来启动我们的官方镜像。该市场提供了获得同样东西的另一种方式,显著扩大了 Fedora 的知名度。这也将使我们的云镜像可以更快地在新的 AWS 区域中可用。特别感谢 David Duncan 让这一切成为现实! + +### 常规改进 + +无论您使用的是哪种版本的 Fedora,您都会得到开源世界提供的最新版本。遵循我们的 [First][17] 原则,我们更新了关键的编程语言和系统库包,包括 Python 3.9、Ruby on Rails 6.0 和 Perl 5.32。在 Fedora KDE 中,我们沿用了 Fedora 32 Workstation 中的工作,默认启用了 EarlyOOM 服务,以改善低内存情况下的用户体验。 + +为了让 Fedora 的默认体验更好,我们将 nano 设置为默认编辑器。nano 是一个对新用户友好的编辑器。当然,那些想要像 vi 这样强大的编辑器的用户可以自己设置默认编辑器。 + +我们很高兴您能试用新版本! 前往 并立即下载它。或者如果您已经在运行 Fedora 操作系统,请按照这个简单的[升级说明][18]进行升级。关于 Fedora 33 新特性的更多信息,请参见[发布说明][19]。 + +### 关于安全启动的说明 + +安全启动Secure Boot是一种安全标准,它确保只有官方签署的操作系统软件才能加载到您的计算机上。这对于防止持久恶意软件非常重要,因为这些恶意软件可能会隐藏在您的计算机固件中,甚至在重新安装操作系统时也能存活。然而,在 [Boot Hole][20] 漏洞发生后,用于签署 Fedora 引导加载器Bootloader软件的加密证书将被撤销,并被新的证书取代。由于这将产生大范围的影响,撤销应该要到 2021 年第二季度或更晚才会广泛推行。 + +然而,一些用户可能已经从其他操作系统或固件更新中收到了这种撤销。在这种情况下,Fedora 将不能在启用了安全启动时进行安装。要说明的是,这不会影响大多数用户。如果它确实影响到了您,您可以暂时禁用安全启动。我们会在大范围的证书撤销之前发布一个用新证书签署的更新,在所有支持的版本上都可以使用,到那时,安全启动应该可以重新启用。 + +### 万一出现问题时…… + +如果您遇到问题,请查看 [Fedora 33 常见错误][14]页面;如果您有疑问,请访问我们的 [Ask Fedora][21] 用户支持平台。 + +### 谢谢大家 + +感谢在这个发布周期中为 Fedora 项目做出贡献的成千上万的人,尤其是那些在疫情大流行期间为使这个版本准时发布而付出额外努力的人。Fedora 是一个社区,很高兴看到我们如此互相支持。 + + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/announcing-fedora-33/ + +作者:[Matthew Miller][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/mattdm/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/10/f33-final-816x345.jpg +[2]: https://www.gnome.org/news/2020/09/gnome-3-38-released/ +[3]: https://fedoramagazine.org/btrfs-coming-to-fedora-33/ +[4]: https://docs.fedoraproject.org/en-US/fedora-coreos/update-streams/ +[5]: https://getfedora.org/en/coreos/download?stream=next +[6]: https://docs.fedoraproject.org/en-US/fedora-coreos/getting-started/ +[7]: https://getfedora.org/iot +[8]: https://spins.fedoraproject.org/ +[9]: https://labs.fedoraproject.org/ +[10]: https://labs.fedoraproject.org/en/comp-neuro/ +[11]: https://spins.fedoraproject.org/en/kde/ +[12]: https://spins.fedoraproject.org/en/xfce/ +[13]: https://alt.fedoraproject.org/alt/ +[14]: https://fedoraproject.org/wiki/Common_F33_bugs +[15]: https://aws.amazon.com/marketplace +[16]: https://getfedora.org/en/coreos/download?tab=cloud_launchable&stream=stable +[17]: https://docs.fedoraproject.org/en-US/project/#_first +[18]: https://docs.fedoraproject.org/en-US/quick-docs/upgrading/ +[19]: https://docs.fedoraproject.org/en-US/fedora/f33/release-notes/ +[20]: https://access.redhat.com/security/vulnerabilities/grub2bootloader +[21]: http://ask.fedoraproject.org diff --git a/published/202011/20180503 Go on very small hardware (Part 3).md b/published/202011/20180503 Go on very small hardware (Part 3).md new file mode 100644 index 0000000000..4fa8c39c6d --- /dev/null +++ b/published/202011/20180503 Go on very small hardware (Part 3).md @@ -0,0 +1,434 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12782-1.html) +[#]: subject: (Go on very small hardware Part 3) +[#]: via: (https://ziutek.github.io/2018/05/03/go_on_very_small_hardware3.html) +[#]: author: (Michał Derkacz ) + +Go 语言在极小硬件上的运用(三) +====== + +![](https://img.linux.net.cn/data/attachment/album/202010/24/090026to9c9sweyrw9ww37.png) + + +在本系列的 [第一][3] 和 [第二][4] 部分中讨论的大多数示例都是以某种方式闪烁的 LED。起初它可能很有趣,但是一段时间后变得有些无聊。让我们做些更有趣的事情…… + +…让我们点亮更多的 LED! + +![STM32F030F4P6][1] + +### WS281x LED + +[WS281x][5] RGB LED(及其克隆品)非常受欢迎。你可以以单个元素购买、链成长条或组装成矩阵、环或其他形状。 + +![WS2812B][6] + +它们可以串联连接,基于这个事实,你可以只用 MCU 的单个引脚就可以控制一个很长的 LED 灯条。不幸的是,它们的内部控制器使用的物理协议不能直接适用于你在 MCU 中可以找到的任何外围设备。你必须使用 位脉冲bit-banging或以特殊方式使用可用的外设。 + +哪种可用的解决方案最有效取决于同时控制的 LED 灯条数量。如果你必须驱动 4 到 16 个灯条,那么最有效的方法是 [使用定时器和 DMA][7](请不要忽略这篇文章末尾的链接)。 + +如果只需要控制一个或两个灯条,请使用可用的 SPI 或 UART 外设。对于 SPI,你只能在发送的一个字节中编码两个 WS281x 位。由于巧妙地使用了起始位和停止位,UART 允许更密集的编码:每发送一个字节 3 位。 + +我在 [此站点][8] 上找到了有关 UART 协议如何适用于 WS281x 协议的最佳解释。如果你不懂波兰语,这里是 [英文翻译][9]。 + +基于 WS281x 的 LED 仍然是最受欢迎的,但市场上也有 SPI 控制的 LED:[APA102][10]、[SK9822][11]。关于它们的三篇有趣的文章在这里:[1][12]、[2][13]、[3][14]。 + +### LED 环 + +市场上有许多基于 WS2812 的环。我有一个这样的: + +![WS2812B][15] + +它具有 24 个可单独寻址的 RGB LED(WS2812B),并暴露出四个端子:GND、5V、DI 和 DO。通过将 DI(数据输入)端子连接到上一个的 DO(数据输出)端子,可以链接更多的环或其他基于 WS2812 的东西。 + +让我们将这个环连接到我们的 STM32F030 板上。我们将使用基于 UART 的驱动程序,因此 DI 应连接到 UART 接头连接器上的 TXD 引脚。 WS2812B LED 需要至少 3.5V 的电源。 24 个 LED 会消耗大量电流,因此在编程/调试期间,最好将环上的 GND 和 5V 端子直接连接到 ST-LINK 编程器上可用的 GND 和 5V 引脚: + +![WS2812B][16] + +我们的 STM32F030F4P6 MCU 和整个 STM32 F0、F3、F7、L4 系列具有 F1、F4、L1 MCU 不具备的一项重要功能:它可以反转 UART 信号,因此我们可以将环直接连接到 UART TXD 引脚。如果你不知道我们需要这种反转,那么你可能没有读过我上面提到的 [文章][9]。 + +因此,你不能以这种方式使用流行的 [Blue Pill][17] 或 [STM32F4-DISCOVERY][18]。使用其 SPI 外设或外部反相器。有关使用 SPI 的 NUCLEO-F411RE,请参见 [圣诞树灯][19] 项目作为 UART + 逆变器的示例或 [WS2812示例][20]。 + +顺便说一下,大多数 DISCOVERY 板可能还有一个问题:它们在 VDD = 3V 而不是 3.3V 的情况下工作。 对于高 DI,WS281x 至少要求电源电压 * 0.7。如果是 5V 电源,则为 3.5V;如果是 4.7V 电源,则为 3.3V;可在 DISCOVERY 的 5V 引脚上找到。如你所见,即使在我们的情况下,第一个 LED 的工作电压也低于规格 0.2V。对于 DISCOVERY 板,如果供电 4.7V,它将工作在低于规格的 0.3V 下;如果供电 5V,它将工作在低于规格 0.5V 下。 + +让我们结束这段冗长的介绍并转到代码: + +``` +package main + +import ( + "delay" + "math/rand" + "rtos" + + "led" + "led/ws281x/wsuart" + + "stm32/hal/dma" + "stm32/hal/gpio" + "stm32/hal/irq" + "stm32/hal/system" + "stm32/hal/system/timer/systick" + "stm32/hal/usart" +) + +var tts *usart.Driver + +func init() { + system.SetupPLL(8, 1, 48/8) + systick.Setup(2e6) + + gpio.A.EnableClock(true) + tx := gpio.A.Pin(9) + + tx.Setup(&gpio.Config{Mode: gpio.Alt}) + tx.SetAltFunc(gpio.USART1_AF1) + + d := dma.DMA1 + d.EnableClock(true) + + tts = usart.NewDriver(usart.USART1, d.Channel(2, 0), nil, nil) + tts.Periph().EnableClock(true) + tts.Periph().SetBaudRate(3000000000 / 1390) + tts.Periph().SetConf2(usart.TxInv) + tts.Periph().Enable() + tts.EnableTx() + + rtos.IRQ(irq.USART1).Enable() + rtos.IRQ(irq.DMA1_Channel2_3).Enable() +} + +func main() { + var rnd rand.XorShift64 + rnd.Seed(1) + rgb := wsuart.GRB + strip := wsuart.Make(24) + black := rgb.Pixel(0) + for { + c := led.Color(rnd.Uint32()).Scale(127) + pixel := rgb.Pixel(c) + for i := range strip { + strip[i] = pixel + tts.Write(strip.Bytes()) + delay.Millisec(40) + } + for i := range strip { + strip[i] = black + tts.Write(strip.Bytes()) + delay.Millisec(20) + } + } +} + +func ttsISR() { + tts.ISR() +} + +func ttsDMAISR() { + tts.TxDMAISR() +} + +//c:__attribute__((section(".ISRs"))) +var ISRs = [...]func(){ + irq.USART1: ttsISR, + irq.DMA1_Channel2_3: ttsDMAISR, +} +``` + +#### 导入部分 + +与前面的示例相比,导入部分中的新内容是 `rand/math` 包和带有 `led/ws281x` 子树的 `led` 包。 `led` 包本身包含 `Color` 类型的定义。 `led/ws281x/wsuart` 定义了 `ColorOrder`、`Pixel` 和 `Strip` 类型。 + +我想知道如何使用 `image/color` 中的 `Color` 或 `RGBA` 类型,以及如何以它将实现 `image.Image` 接口的方式定义 `Strip`。 但是由于使用了 [gamma 校正][21] 和 大开销的 `color/draw` 包,我以简单的方式结束: + +``` +type Color uint32 +type Strip []Pixel +``` + +使用一些有用的方法。然而,这种情况在未来可能会改变。 + +#### init 函数 + +`init` 函数没有太多新颖之处。 UART 波特率从 115200 更改为 3000000000/1390 ≈ 2158273,相当于每个 WS2812 位 1390 纳秒。 CR2 寄存器中的 TxInv 位设置为反转 TXD 信号。 + +#### main 函数 + +`XorShift64` 伪随机数生成器用于生成随机颜色。 [XORSHIFT][22] 是目前由 `math/rand` 包实现的唯一算法。你必须使用带有非零参数的 `Seed` 方法显式初始化它。 + +`rgb` 变量的类型为 `wsuart.ColorOrder`,并设置为 WS2812 使用的 GRB 颜色顺序(WS2811 使用 RGB 顺序)。然后用于将颜色转换为像素。 + +`wsuart.Make(24)` 创建 24 像素的初始化条带。它等效于: + +``` +strip := make(wsuart.Strip, 24) +strip.Clear() +``` + +其余代码使用随机颜色绘制类似于 “Please Wait…” 微调器的内容。 + +`strip` 切片充当帧缓冲区。 `tts.Write(strip.Bytes())` 将帧缓冲区的内容发送到环。 + +#### 中断 + +该程序由处理中断的代码组成,与先前的 [UART 示例][23] 中的代码相同。 + +让我们编译并运行: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 14088 240 204 14532 38c4 cortexm0.elf +$ openocd -d0 -f interface/stlink.cfg -f target/stm32f0x.cfg -c 'init; program cortexm0.elf; reset run; exit' +``` + +我跳过了 `openocd` 的输出。下面的视频显示了该程序的工作原理: + +![video](https://ziutek.github.io/videos/rgbspinner.mp4) + +### 让我们做些有用的事情... + +在 [第一部分][3] 的开头,我曾问过:“Go 能深入到多低层,而还能做一些有用的事情?”。 我们的 MCU 实际上是一种低端设备(8 比特的人可能会不同意我的看法),但到目前为止,我们还没有做任何有用的事情。 + +所以... 让我们做些有用的事情... 让我们做个时钟! + +在互联网上有许多由 RGB LED 构成的时钟示例。让我们用我们的小板子和 RGB 环制作自己的时钟。我们按照下面的描述更改先前的代码。 + +#### 导入部分 + +删除 `math/rand` 包,然后添加 `stm32/hal/exti`。 + +#### 全局变量 + +添加两个新的全局变量:`btn` 和 `btnev`: + +``` +var ( + tts *usart.Driver + btn gpio.Pin + btnev rtos.EventFlag +) +``` + +它们将用来处理那些用于设置时钟的 “按钮”。我们的板子除了重置之外没有其他按钮,但是如果没有它,我们仍然可以通过某种方式进行管理。 + +#### init 函数 + +将这段代码添加到 `init` 函数: + +``` +btn = gpio.A.Pin(4) + +btn.Setup(&gpio.Config{Mode: gpio.In, Pull: gpio.PullUp}) +ei := exti.Lines(btn.Mask()) +ei.Connect(btn.Port()) +ei.EnableFallTrig() +ei.EnableRiseTrig() +ei.EnableIRQ() + +rtos.IRQ(irq.EXTI4_15).Enable() +``` + +在内部上拉电阻pull-up resistor启用的情况下,将 PA4 引脚配置为输入。它已连接至板载 LED,但这不会妨碍任何事情。更重要的是它位于 GND 引脚旁边,所以我们可以使用任何金属物体来模拟按钮并设置时钟。作为奖励,我们还有来自板载 LED 的其他反馈。 + +我们使用 EXTI 外设来跟踪 PA4 状态。它被配置为在发生任何更改时都会产生中断。 + +#### btnWait 函数 + +定义一个新的辅助函数: + +``` +func btnWait(state int, deadline int64) bool { + for btn.Load() != state { + if !btnev.Wait(1, deadline) { + return false // timeout + } + btnev.Reset(0) + } + delay.Millisec(50) // debouncing + return true +} +``` + +它等待 “按钮” 引脚上的指定状态,但只等到最后期限出现。这是稍微改进的轮询代码: + +``` +for btn.Load() != state { + if rtos.Nanosec() >= deadline { + // timeout + } +} +``` + +我们的 `btnWait` 函数不是忙于等待 `state` 或 `deadline`,而是使用 `rtos.EventFlag` 类型的 `btnev` 变量休眠,直到有事情发生。你当然可以使用通道而不是 `rtos.EventFlag`,但是后者便宜得多。 + +#### main 函数 + +我们需要全新的 `main` 函数: + +``` +func main() { + rgb := wsuart.GRB + strip := wsuart.Make(24) + ds := 4 * 60 / len(strip) // Interval between LEDs (quarter-seconds). + adjust := 0 + adjspeed := ds + for { + qs := int(rtos.Nanosec() / 25e7) // Quarter-seconds since reset. + qa := qs + adjust + + qa %= 12 * 3600 * 4 // Quarter-seconds since 0:00 or 12:00. + hi := len(strip) * qa / (12 * 3600 * 4) + + qa %= 3600 * 4 // Quarter-seconds in the current hour. + mi := len(strip) * qa / (3600 * 4) + + qa %= 60 * 4 // Quarter-seconds in the current minute. + si := len(strip) * qa / (60 * 4) + + hc := led.Color(0x550000) + mc := led.Color(0x005500) + sc := led.Color(0x000055) + + // Blend the colors if the hands of the clock overlap. + if hi == mi { + hc |= mc + mc = hc + } + if mi == si { + mc |= sc + sc = mc + } + if si == hi { + sc |= hc + hc = sc + } + + // Draw the clock and write to the ring. + strip.Clear() + strip[hi] = rgb.Pixel(hc) + strip[mi] = rgb.Pixel(mc) + strip[si] = rgb.Pixel(sc) + tts.Write(strip.Bytes()) + + // Sleep until the button pressed or the second hand should be moved. + if btnWait(0, int64(qs+ds)*25e7) { + adjust += adjspeed + // Sleep until the button is released or timeout. + if !btnWait(1, rtos.Nanosec()+100e6) { + if adjspeed < 5*60*4 { + adjspeed += 2 * ds + } + continue + } + adjspeed = ds + } + } +} +``` + +我们使用 `rtos.Nanosec` 函数代替 `time.Now` 来获取当前时间。这样可以节省大量的闪存,但也使我们的时钟变成了不知道日、月、年的老式设备,最糟糕的是它无法处理夏令时的变化。 + +我们的环有 24 个 LED,因此秒针的显示精度可以达到 2.5 秒。为了不牺牲这种精度并获得流畅的运行效果,我们使用 1/4 秒作为基准间隔。半秒就足够了,但四分之一秒更准确,而且与 16 和 48 个 LED 配合使用也很好。 + +红色、绿色和蓝色分别用于时针、分针和秒针。这允许我们使用简单的“逻辑或操作”进行颜色混合。我们 `Color.Blend` 方法可以混合任意颜色,但是我们闪存不多,所以我们选择最简单的解决方案。 + +我们只有在秒针移动时才重画时钟。 + +``` +btnWait(0, int64(qs+ds)*25e7) +``` + +上面的这行代码等待的正是那一刻,或者是按钮的按下。 + +每按一下按钮就会把时钟向前调一调。按住按钮一段时间会加速调整。 + +#### 中断 + +定义新的中断处理程序: + +``` +func exti4_15ISR() { + pending := exti.Pending() & 0xFFF0 + pending.ClearPending() + if pending&exti.Lines(btn.Mask()) != 0 { + btnev.Signal(1) + } +} +``` + +并将 `irq.EXTI4_15: exti4_15ISR` 条目添加到 ISR 数组。 + +该处理程序(或中断服务程序)处理 EXTI4_15 IRQ。 Cortex-M0 CPU 支持的 IRQ 明显少于其较大的同类兄弟处理器,因此你经常可以看到一个 IRQ 被多个中断源共享。在我们的例子中,一个 IRQ 由 12 个 EXTI 线共享。 + +exti4_15ISR 读取所有挂起的位,并从中选择 12 个更高的有效位。接下来,它清除 EXTI 中选中的位并开始处理它们。在我们的例子中,仅检查第 4 位。 `btnev.Signal(1)` 引发 `btnev.Wait(1, deadline)` 唤醒并返回 `true`。 + +你可以在 [Github][24] 上找到完整的代码。让我们来编译它: + +``` +$ egc +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15960 240 216 16416 4020 cortexm0.elf +``` + +这里所有的改进只得到 184 个字节。让我们再次重新构建所有内容,但这次在 typeinfo 中不使用任何类型和字段名: + +``` +$ cd $HOME/emgo +$ ./clean.sh +$ cd $HOME/firstemgo +$ egc -nf -nt +$ arm-none-eabi-size cortexm0.elf + text data bss dec hex filename + 15120 240 216 15576 3cd8 cortexm0.elf +``` + +现在,有了千字节的空闲空间,你可以改进一些东西。让我们看看它是如何工作的: + +![video](https://ziutek.github.io/videos/rgbclock.mp4) + +我不知道我是怎么精确打到 3:00 的!? + +以上就是所有内容!在第 4 部分(本系列的结束)中,我们将尝试在 LCD 上显示一些内容。(LCTT 译注:然而烂尾了,第三篇写于 2018 年,整个博客当年就停更了。) + +-------------------------------------------------------------------------------- + +via: https://ziutek.github.io/2018/05/03/go_on_very_small_hardware3.html + +作者:[Michał Derkacz][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://ziutek.github.io +[b]: https://github.com/lujun9972 +[1]: https://ziutek.github.io/images/mcu/f030-demo-board/board.jpg +[2]: https://ziutek.github.io/2018/05/03/go_on_very_small_hardware3.html +[3]: https://linux.cn/article-11383-1.html +[4]: https://linux.cn/article-12747-1.html +[5]: http://www.world-semi.com/solution/list-4-1.html +[6]: https://ziutek.github.io/images/led/ws2812b.jpg +[7]: http://www.martinhubacek.cz/arm/improved-stm32-ws2812b-library +[8]: http://mikrokontrolery.blogspot.com/2011/03/Diody-WS2812B-sterowanie-XMega-cz-2.html +[9]: https://translate.google.pl/translate?sl=pl&tl=en&u=http://mikrokontrolery.blogspot.com/2011/03/Diody-WS2812B-sterowanie-XMega-cz-2.html +[10]: http://neon-world.com/en/product.php +[11]: http://www.normandled.com/index.php/Product/view/id/800.html +[12]: https://cpldcpu.wordpress.com/2014/08/27/apa102/ +[13]: https://cpldcpu.wordpress.com/2014/11/30/understanding-the-apa102-superled/ +[14]: https://cpldcpu.wordpress.com/2016/12/13/sk9822-a-clone-of-the-apa102/ +[15]: https://ziutek.github.io/images/led/rgbring.jpg +[16]: https://ziutek.github.io/images/led/ring-stlink-f030.jpg +[17]: https://jeelabs.org/article/1649a/ +[18]: http://www.st.com/en/evaluation-tools/stm32f4discovery.html +[19]: https://github.com/ziutek/emgo/tree/master/egpath/src/stm32/examples/minidev/treelights +[20]: https://github.com/ziutek/emgo/tree/master/egpath/src/stm32/examples/nucleo-f411re/ws2812 +[21]: https://en.wikipedia.org/wiki/Gamma_correction +[22]: https://en.wikipedia.org/wiki/Xorshift +[23]: https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html#uart +[24]: https://github.com/ziutek/emgo/tree/master/egpath/src/stm32/examples/f030-demo-board/ws2812-clock diff --git a/published/202011/20190402 When Wi-Fi is mission-critical, a mixed-channel architecture is the best option.md b/published/202011/20190402 When Wi-Fi is mission-critical, a mixed-channel architecture is the best option.md new file mode 100644 index 0000000000..e121eea3b0 --- /dev/null +++ b/published/202011/20190402 When Wi-Fi is mission-critical, a mixed-channel architecture is the best option.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12817-1.html) +[#]: subject: (When Wi-Fi is mission-critical, a mixed-channel architecture is the best option) +[#]: via: (https://www.networkworld.com/article/3386376/when-wi-fi-is-mission-critical-a-mixed-channel-architecture-is-the-best-option.html#tk.rss_all) +[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/) + +当 Wi-Fi 成为关键业务时,混合信道架构是最好的多信道选择 +====== + +> 混合信道架构是最好的多信道选择,但它并不总是最佳的选择。当需要可靠的 Wi-Fi 时,单信道和混合 AP 提供了令人信服的替代方案。 + +![Getty Images][1] + +我曾与许多实施数字项目的公司合作过,结果却发现它们失败了。正确的想法,健全地施行,现存的市场机遇。哪里是薄弱的环节?是 Wi-Fi 网络。 + +例如,一家大型医院希望通过将遥测信息发送到移动设备,来提高临床医生对患者警报的响应时间。如果没有这个系统,护士了解病人警报的唯一途径就是通过声音警报。在所有嘈杂的背景音中,通常很难分辨噪音来自哪里。问题是这家医院中的 Wi-Fi 网络已经很多年未升级了,这导致信息传递严重延迟(通常需要 4~5 分钟)。过长的信息传递导致人们对该系统失去信心,因此许多临床医生停止使用该系统,转而使用手动警报。最终,人们认为这个项目是失败的。 + +我曾在制造业、K-12 教育、娱乐和其他行业中见过类似的案例。企业竞争的基础是客户体验,而竞争的动力来自不断扩展又无处不在的无线优势。好的 Wi-Fi 并不意味着市场领导地位,但是劣质的 Wi-Fi 将会对客户和员工产生负面影响。而在当今竞争激烈的环境下,这是灾难的根源。 + +### Wi-Fi 性能历来不一致 + +Wi-Fi 的问题在于它本身就很脆弱。我相信每个阅读这篇文章的人都经历过下载失败、连接中断、性能不一致以及连接公用热点的漫长等待时间等缺陷。 + +想象一下,你在一个会议上,在一个主题演讲之前,你可以随意地发推特、发电子邮件、浏览网页以及做其他事情。然后主讲人上台,所有观众开始拍照,上传并流传信息——然后网络崩溃了。我发现这不仅仅是一个例外,更是一种常态,强调了对[无损 Wi-Fi][3]的需求。 + +对于网络技术人员的问题是如何让一个地方的 Wi-Fi 达到全部时间都保持不间断。有人说只要加强现存的网络可以做到,这也许可以,但在某些情况下,Wi-Fi 的类型可能并不合适。 + +最常见的 Wi-Fi 部署类型是多信道,也称为微蜂窝,每个客户端通过无线信道连接到接入点(AP)。高质量的通话体验基于两点:良好的信号强度和最小的干扰。有几个因素会导致干扰,例如接入点距离太近、布局问题或者来自其他设备的干扰。为了最大程度地减少干扰,企业需要投入大量的时间和资金在[现场调查中规划最佳的信道地图][2],但即使这些做得很好,Wi-Fi 故障仍然可能发生。 + +## 多通道 Wi-Fi 并非总是最佳选择 + +对于许多铺着地毯的办公室来说,多通道 Wi-Fi 可能是可靠的,但在某些环境中,外部环境会影响性能。一个很好的例子是多租户建筑,其中有多个 Wi-Fi 网络在同一信道上传输并相互干扰。另一个例子是医院,这里有许多工作人员在多个接入点间流动。客户端将试图连接到最佳接入点,导致客户端不断断开连接并重新连接,从而导致会话中断。还有一些环境,例如学校、机场和会议设施,那里存在大量的瞬态设备,而多通道则难以跟上。 + +## 单通道 Wi-Fi 提供更好的可靠性但与此同时性能会受到影响 + +网络管理器要做什么?不一致的 Wi-Fi 只是一个既成事实吗?多信道是一种标准,但它并非是为动态物理环境或那些需要可靠的连接环境而设计的。 + +几年前提出了一项解决这些问题的替代架构。顾名思义,“单信道”Wi-Fi 在网络中为所有接入点使用单一的无线频道。可以把它想象成在一个信道上运行的单个 Wi-Fi 结构。这种架构中,接入点的位置无关紧要,因为它们都利用相同的通道,因此不会互相干扰。这有一个显而易见的简化优势,比如,如果覆盖率很低,那就没有理由再做一次昂贵的现场调查。相反,只需在需要的地方布置接入点就可以了。 + +单通道的缺点之一是总网络吞吐量低于多通道,因为只能使用一个通道。在可靠性高于性能的环境中,这可能会很好,但许多组织希望二者兼而有之。 + +## 混合接入点提供了两全其美的优势 + +单信道系统制造商最近进行了创新,将信道架构混合在一起,创造了一种“两全其美”的部署,可提供多信道的吞吐量和单信道的可靠性。举个例子,Allied Telesis 提供了混合接入点,可以同时在多信道和单信道模式下运行。这意味着可以分配一些 Web 客户端到多信道以获得最大的吞吐量,而其他的 Web 客户端则可使用单信道来获得无缝漫游体验。 + +这种混合的实际用例可能是物流设施,办公室工作人员使用多通道,但叉车操作员在整个仓库移动时使用单一通道持续连接。 + +Wi-Fi 曾是一个便利的网络,但如今它或许是所有网络中最关键的任务。传统的多信道体系也许可以工作,但应该做一些尽职调查来看看它在重负下如何运转。IT 领导者需要了解 Wi-Fi 对数字转型计划的重要性,并进行适当的测试,以确保它不是基础设施链中的薄弱环节,并为当今环境选择最佳技术。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3386376/when-wi-fi-is-mission-critical-a-mixed-channel-architecture-is-the-best-option.html + +作者:[Zeus Kerravala][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://www.networkworld.com/author/Zeus-Kerravala/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2018/09/tablet_graph_wifi_analytics-100771638-large.jpg +[2]: https://www.networkworld.com/article/3315269/wi-fi-site-survey-tips-how-to-avoid-interference-dead-spots.html +[3]: https://www.alliedtelesis.com/blog/no-compromise-wi-fi +[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture +[5]: https://www.networkworld.com/article/3273439/review-icinga-enterprise-grade-open-source-network-monitoring-that-scales.html?nsdr=true#nww-fsb +[6]: https://www.networkworld.com/article/3304307/nagios-core-monitoring-software-lots-of-plugins-steep-learning-curve.html +[7]: https://www.networkworld.com/article/3269279/review-observium-open-source-network-monitoring-won-t-run-on-windows-but-has-a-great-user-interface.html?nsdr=true#nww-fsb +[8]: https://www.networkworld.com/article/3304253/zabbix-delivers-effective-no-frills-network-monitoring.html +[9]: https://www.facebook.com/NetworkWorld/ +[10]: https://www.linkedin.com/company/network-world diff --git a/published/202011/20190925 Most enterprise networks can-t handle big data loads.md b/published/202011/20190925 Most enterprise networks can-t handle big data loads.md new file mode 100644 index 0000000000..ae1615b66f --- /dev/null +++ b/published/202011/20190925 Most enterprise networks can-t handle big data loads.md @@ -0,0 +1,60 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12803-1.html) +[#]: subject: (Most enterprise networks can't handle big data loads) +[#]: via: (https://www.networkworld.com/article/3440519/most-enterprise-networks-cant-handle-big-data-loads.html) +[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) + +大多数企业网络无法处理大数据负载 +====== + +> 随着网络中流动着越来越多的数据,由于领导力和技术问题,网络正在滞后于数据的发展速度。 + +![](https://images.idgesg.net/images/article/2019/08/gettyimages-811109186-100808291-large.jpg) + +又过了一周,另一项调查发现,IT 已经无法跟上不断膨胀的数据过载。这次的问题将主要是网络带宽和整体性能。 + +管理咨询公司埃森哲对 [300 名 IT 专业人士进行的一项调查][1] 发现,大多数人认为他们企业网络无法胜任处理大数据的任务和物联网部署的任务。只有 43% 的受访公司表示他们的网络已经准备好支持云服务、物联网和其他数字技术。 + +一个关键原因(58%)是“IT 与商业需求之间的错位”,这延缓了这些项目的进展。这是一个不同寻常的发现,因为 85% 的受访者还表示他们的网络已经完全或者大体上已经准备好支持企业的数字化计划。那么,究竟是哪一种情况呢? + +第二和第三大时常提及的障碍是“业务需求和运营需求间固有的复杂性”以及“对带宽、性能等方面的需求超过交付能力”,各占 45%。 + +由于分析技术和其他大数据技术的推动,大量传输的数据持续涌入网络线路,网络瓶颈持续增长。调查发现,带宽需求并未得到满足,目前的网络性能依旧达不到要求。 + +其他原因还包括缺乏网络技术、设备扩展和设备老化。 + +### 网络性能问题的一个解决方案:SDN + +埃森哲发现,大多数公司表示 [软件定义网络(SDN)][5] 是应对带宽和性能挑战的解决方案,77% 的受访企业在调查中表示正在部署 SDN 或者已完成部署。它指出,虽然 SDN 可能在组织的某部分中存在,它并不总是在整个企业范围内统一地推出。 + +如今看来,似乎从未有人有足够的预算来满足他们所有的 IT 雄心,但 31% 受访者认为为网络改善提供资金是“简单的”,而且是在网络基础设施团队的控制范围内,相较于直接下属(13%)或基础设施/网络主管和副总裁(19%),首席信息官/首席技术官更可能将融资过程报告为“轻松”(40%)。 + +报告指出,“仅靠传统网络无法支持数字时代所需的创新和性能。”报告呼吁拥抱新技术,但没有提到 SDN 的名字。同时它还呼吁首席执行官和他们直接下属间加强合作,因为很明显,双方在看待问题的方式上存在分歧。 + +报告总结说,“我们认为需要一种新的网络范式来确保网络满足当前和未来的业务需求。然而,尽管有进步的迹象,但变革的步伐缓慢。公司必须承担起重担,才能实现统一和标准化企业能力,提供必要的带宽、性能和安全,以支持当前和未来的业务需求”。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3440519/most-enterprise-networks-cant-handle-big-data-loads.html + +作者:[Andy Patrizio][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://www.networkworld.com/author/Andy-Patrizio/ +[b]: https://github.com/lujun9972 +[1]: https://www.accenture.com/_acnmedia/pdf-107/accenture-network-readiness-survey.pdf#zoom=50 +[2]: https://www.networkworld.com/article/3209131/lan-wan/what-sdn-is-and-where-its-going.html +[3]: https://www.networkworld.com/article/3206709/lan-wan/what-s-the-difference-between-sdn-and-nfv.html +[4]: https://www.networkworld.com/newsletters/signup.html +[5]: https://www.networkworld.com/article/3209131/what-sdn-is-and-where-its-going.html +[6]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/ +[7]: https://www.networkworld.com/article/3405522/how-network-pros-acquire-skills-for-sdn-programmable-networks.html +[8]: https://www.facebook.com/NetworkWorld/ +[9]: https://www.linkedin.com/company/network-world diff --git a/published/202011/20191003 4 open source eBook readers for Android.md b/published/202011/20191003 4 open source eBook readers for Android.md new file mode 100644 index 0000000000..89cbee1312 --- /dev/null +++ b/published/202011/20191003 4 open source eBook readers for Android.md @@ -0,0 +1,153 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12826-1.html) +[#]: subject: (4 open source eBook readers for Android) +[#]: via: (https://opensource.com/article/19/10/open-source-ereaders-android) +[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) + +四款安卓开源电子书阅读器 +====== + +> 你在寻找新的电子书阅读软件吗?来看看这四款适用于安卓的可靠的开源电子书阅读器吧。 + +![](https://img.linux.net.cn/data/attachment/album/202011/16/135728ayhh1aiqwrva50zy.jpg) + +谁不想有一个好的阅读体验?与其将时间浪费在社交媒体或[即时消息软件][2]上,不如在自己的安卓手机或平板上阅读一本书、杂志或其他文档。 + +要做到这一点,你需要的是一个适合的电子书阅读软件。接下来让我们来看一看四款可靠的、开源安卓电子书阅读器。 + +### Book Reader + +那我们先从我最喜欢的一款开源安卓电子书阅读器开始:[Book Reader][3]。它基于现在专有的 FBReader 应用的开源老版本。像 FBReader 的早期版本一样,Book Reader 小而简单,但是好用。 + +**优点:** + + * 易于操作。 + * 该应用界面遵循安卓的 [Material Design 指南][4],因此非常干净。 + * 你可以为电子书添加书签,并将文本分享至你设备上的其他应用。 + * 不断提供除英语外的其他语言的支持。 + +**缺点** + + * Book Reader 的自定义选项较少。 + * 没有内置词典或支持外部词典的功能。 + +**支持的电子书格式:** + +Book Reader 支持 EPUB、.mobi、PDF、[DjVu][5]、HTML、纯文本、 Word 文档、RTF 和 [FictionBook][6]。 + +![Book Reader Android app][7] + +Book Reader 的源码在 GNU GPL 3.0 下授权,你可以在[GitLab][8]中找到它。 + +### Cool Reader + +[Cool Reader][9] 是一个灵活易用的电子书软件。虽然我觉得该软件的图标会让想起 Windows vista 中的图标,但它确实有一些好用的功能。 + +**优点** + + * 高度自定义,你可以更改字体、行宽、段间距、连字符、字体大小、页边距以及背景色。 + * 你可以覆盖书中的样式表。我发现这对于两三本将所有文本设置为小写字母的书很有用。 + * 它会在设备启动时自动搜寻设备中的新书资源。你也可以查阅[古腾堡计划][10]和[互联网档案馆][11]中的书籍。 + +**缺点** + + * Cool Reader 的界面并不是极简或者说最现代化的。 + * 虽然它开箱即用,但实际上你需要调整一些配置来更舒适地使用 Cool Reader。 + * 应用的默认词典是专有的,尽管你可以用[开源的词典][12]来替换掉它。 + +**支持的电子书格式:** + +你可以使用 Cool Reader 来浏览 EPUB、小说、纯文本、RTF、HTML、[CHM][13] 和 TCR(Psion 系列掌上电脑的电子书格式)文件。 + +![Cool Reader Android app][14] + +Cool Reader 的源码在 GNU GPL 2 下授权,你可以在 [Sourceforge][15] 中找到它。 + +### KOReader + +[KOReader][16] 最初是为了 [E Ink][17] 电子书阅读器创建的,但后来发现它可用于安卓。在测试它时,我发现 KOReader 在同等程度下既有用又令人沮丧。很明显它绝不是一款不好的应用,但不会是我的首选。 + +**优点** + + * 高度自定义。 + * 支持多种语言。 + * 它允许你使用[词典][18](若你已安装)或者 Wikipedia(若你已连接至网络)来查单词。 + +**缺点** + + * 每一本书你都需要改变设置。在你打开一本新书时,KOReader 不会记住相关设置 + * 它的界面会让人觉得是一款专门的电子书阅读器。该应用没有安卓的外形和感受。 + +**支持的电子书格式:** + +你可以查阅 PDF、DjVu、CBT、以及 [CBZ][5] 电子书。它也支持 EPUB、小说、.mobi、Word 文档、文本文件和 [CHM][13] 文件。 + +![KOReader Android app][19] + +Cool Reader 的源码在 GNU Affero GPL 3.0 下授权,你可以在 [GitHub][20] 上找到它。 + +### Booky McBookface + +是的,这确实是[这款电子书阅读器][21]的名字。它是这篇文章中最基础的电子书阅读器,但不要因此(或者这个傻乎乎的名字)使你失望。Booky McBookface 易于使用,并且有一件事它做的很好。 + +**优点** + + * 没有多余的装饰。只有你和你的电子书。 + * 界面简洁。 + * 在安卓启动栏中的长按软件图标会弹出一个菜单,你可以从中打开正在阅读的最后一本书、获得未读书籍的列表、或者查找并打开设备上的一本书。 + +**缺点** + + * 软件中几乎没有配置选项——你可以更改字体大小和亮度,仅此而已。 + * 你需要使用屏幕底部的按钮浏览电子书。点击屏幕边缘无法操作。 + * 无法为电子书添加书签。 + +**支持的电子书格式** + +你可以使用该软件阅读 EPUB 格式、HTML 文档,或纯文本格式的电子书。 + +![Booky McBookface Android app][22] + +Booky McBookface 的源码在 GNU GPL 3.0 下授权,你可以在 [GitHub][23] 中找到它。 + +你有最喜欢的安卓开源电子书阅读器吗?在社区中留言分享一下吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/10/open-source-ereaders-android + +作者:[Scott Nesbitt][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/scottnesbitt +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_browser_program_books_read.jpg?itok=iNMWe8Bu (Computer browser with books on the screen) +[2]: https://opensource.com/article/19/3/open-messenger-client +[3]: https://f-droid.org/en/packages/com.github.axet.bookreader/ +[4]: https://material.io/design/ +[5]: https://opensource.com/article/19/3/comic-book-archive-djvu +[6]: https://en.wikipedia.org/wiki/FictionBook +[7]: https://opensource.com/sites/default/files/uploads/book_reader-book-list.png (Book Reader Android app) +[8]: https://gitlab.com/axet/android-book-reader/tree/HEAD +[9]: https://f-droid.org/en/packages/org.coolreader/ +[10]: https://www.gutenberg.org/ +[11]: https://archive.org +[12]: http://aarddict.org/ +[13]: https://fileinfo.com/extension/chm +[14]: https://opensource.com/sites/default/files/uploads/cool_reader-icons.png (Cool Reader Android app) +[15]: https://sourceforge.net/projects/crengine/ +[16]: https://f-droid.org/en/packages/org.koreader.launcher/ +[17]: https://en.wikipedia.org/wiki/E_Ink +[18]: https://github.com/koreader/koreader/wiki/Dictionary-support +[19]: https://opensource.com/sites/default/files/uploads/koreader-lookup.png (KOReader Android app) +[20]: https://github.com/koreader/koreader +[21]: https://f-droid.org/en/packages/com.quaap.bookymcbookface/ +[22]: https://opensource.com/sites/default/files/uploads/booky_mcbookface-menu.png (Booky McBookface Android app) +[23]: https://github.com/quaap/BookyMcBookface diff --git a/published/202011/20200310 Getting started with Emacs.md b/published/202011/20200310 Getting started with Emacs.md new file mode 100644 index 0000000000..01283be5a9 --- /dev/null +++ b/published/202011/20200310 Getting started with Emacs.md @@ -0,0 +1,177 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12868-1.html) +[#]: subject: (Getting started with Emacs) +[#]: via: (https://opensource.com/article/20/3/getting-started-emacs) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +10 个让你进入 Emacs 世界的技巧 +====== + +> 10 个技巧,让你深入这个有用的开源文本编辑器的世界。 + +![](https://img.linux.net.cn/data/attachment/album/202011/29/103757lccy9ljxiowooyzy.jpg) + +很多人都说想学 [Emacs][2],但很多人在短暂的接触后就退缩了。这并不是因为 Emacs 不好,也不是 Emacs 复杂。我相信,问题在于人们其实并不想“学习” Emacs,而是他们想习惯 Emacs 的传统。他们想了解那些神秘的键盘快捷键和不熟悉的术语。他们想按照他们认为的“使用目的”来使用 Emacs。 + +我很同情这一点,因为我对 Emacs 的感觉就是这样。我以为真正的 Emacs 用户都只会在终端里面运行,从来不用方向键和菜单,更不会用鼠标。这是个阻止自己开始使用 Emacs 的好办法。有足够多的独特的 `.emacs` 配置文件证明,如果说 Emacs 用户有一个共同的变化,那就是每个人使用 Emacs 的方式不同。 + +学习 Emacs 很容易。爱上 Emacs 才是最难的。要爱上 Emacs,你必须发现它所拥有的功能,而这些功能是你一直在寻找的,有时你并不知道你已经错过了它们。这需要经验。 + +获得这种经验的唯一方法就是从一开始就积极使用 Emacs。这里有十个小提示,可以帮助你找出最适合你的方法。 + +### 从 GUI 开始 + +Emacs(以及它的友好竞争者 [Vim][3])最伟大的事情之一是它可以在终端中运行,这在你 SSH 进入服务器时很有用,但在过去 15 年来制造的计算机上意义不大。Emacs 的 GUI 版本可以在极度[低功耗的设备][4]上运行,它有很多实用的功能,无论是新手还是有经验的用户都可以使用它。 + +例如,如果你不知道如何在 Emacs 中只用键盘快捷键复制一个单词,编辑菜单的复制、剪切和粘贴选择提供了最轻松的路径。没有理由因为选择了 Emacs 而惩罚自己。使用它的菜单,用鼠标选择区域,点击缓冲区内的按钮,不要让陌生感阻碍你的工作效率。 + +![Emacs slackware][5] + +这些功能被内置到 Emacs 中,是因为用户在使用它们。你应该在你需要的时候使用它们,而当你最终在 VT100 终端上通过 SSH 使用 Emacs,没有 `Alt` 或方向键的时候,你才应该使用这些晦涩的命令。 + +### 习惯术语 + +Emacs 的 UI 元素有着特殊的术语。个人计算的发展并不是建立在相同的术语上,所以很多术语对现代计算机用户来说比较陌生,还有一些术语虽然相同,但含义不同。下面是一些最常见的术语。 + + * 框架Frame。在 Emacs 中,“框架”就是现代计算机所说的“窗口”。 + * 缓冲区Buffer:“缓冲区”是 Emacs 的一个通信通道。它可以作为 Emacs 进程的命令行,也可以作为 shell,或者只是一个文件的内容。 + * 窗口Window:“窗口”是你进入一个缓冲区的视角。 + * 迷你缓冲区Mini-buffer。它是主要的命令行,位于 Emacs 窗口的底部。 + +![Emacs tutorial map][6] + +### 让 Emacs 的修饰键变得更有意义 + +在 PC 键盘上,`Ctrl` 键被称为 `C`,`Alt` 键被称为 `M`,这些键并不是 `C` 和 `M` 键,由于它们总是与相应的字母或符号键配对,所以在文档中很容易识别。 + +例如,`C-x` 在现代键盘符号中的意思是 `Ctrl+X`,`M-x` 是 `Alt+X`。就像你从任何应用程序中剪切文本时一样,同时按下这两个键。 + +不过,还有另一个层次的键盘快捷键,与现代电脑上的任何东西都完全不同。有时,键盘快捷键并不只是一个键组合,而是由一系列的按键组成。 + +例如,`C-x C-f` 的意思是像往常一样按 `Ctrl+X`,然后再按 `Ctrl+C`。 + +有时,一个键盘快捷键有混合的键型。组合键 `C-x 3` 意味着像往常一样按 `Ctrl+X`,然后按数字 `3` 键。 + +Emacs 之所以能做到这些花哨的强力组合,是因为某些键会让 Emacs 进入一种特殊的命令模式。如果你按 `C-X`(也就是 `Ctrl+X`),就是告诉 `Emacs` 进入空闲状态,等待第二个键或键盘快捷键。 + +Emacs 的文档,无论是官方的还是非官方的,都有很多键盘快捷键。在心里练习把 `C` 键翻译成 `Ctrl` 键,`M` 键翻译成 `Alt` 键,那么这些文档对你来说都会变得更有意义。 + +### 剪切、复制和粘贴的备用快捷方式 + +从规范上,复制文本是通过一系列的键盘快捷键进行的,这些快捷键取决于你想要复制或剪切的方式。 + +例如,你可以用 `M-d`(`Alt+d` 的 Emacs 行话)剪切一整个单词,或者用`C-k`(`Ctrl+K`)剪切一整行,或者用 `M-m`(`Alt+M`)剪切一个高亮区域。如果你想的话,你可以习惯这样,但如果你喜欢 `Ctrl+C` 和 `Ctrl+X` 和 `Ctrl-V`,那么你可以用这些来代替。 + +启用现代的“剪切-复制-粘贴”需要激活一个名为 CUA(通用用户访问Common User Access)的功能。要激活 CUA,请单击“选项”菜单并选择“使用 CUA 键”。启用后,`C-c` 复制高亮显示的文本,`C-x` 剪切高亮显示的文本,`C-v` 粘贴文本。这个模式只有在你选择了文本之后才会实际激活,所以你仍然可以学习 Emacs 通常使用的 `C-x` 和 `C-c` 绑定。 + +### 用哪个都好 + +Emacs 是一个应用程序,它不会意识到你对它的感情或忠诚度。如果你想只用 Emacs 来完成那些“感觉”适合 Emacs 的任务,而用不同的编辑器(比如 Vim)来完成其他任务,你可以这样做。 + +你与一个应用程序的交互会影响你的工作方式,所以如果 Emacs 中所需要的按键模式与特定任务不一致,那么就不要强迫自己使用 Emacs 来完成该任务。Emacs 只是众多可供你使用的开源工具之一,没有理由让自己只限于一种工具。 + +### 探索新函数 + +Emacs 所做的大部分工作都是一个 elisp 函数,它可以从菜单选择和键盘快捷键调用,或者在某些情况下从特定事件中调用。所有的函数都可以从迷你缓冲区(Emacs 框架底部的命令行)执行。理论上,你甚至可以通过键入 `forward-word` 和 `backward-word` 以及 `next-line` 和 `previous-line` 等函数来导航光标。这肯定是无比低效的,但这就是一种直接访问你运行的代码的方式。在某种程度上,Emacs 就是自己的 API。 + +你可以通过在社区博客上阅读有关 Emacs 的资料来了解新函数,或者你可以采取更直接的方法,使用描述函数(`describe-function`)。要获得任何函数的帮助,按 `M-x`(也就是 `Alt+X`),然后输入 `describe-function`,然后按回车键。系统会提示你输入一个函数名称,然后显示该函数的描述。 + +你可以通过键入`M-x(`Alt+X`),然后键入 `?` 来获得所有可用函数的列表。 + +你也可以在输入函数时,通过按 `M-x` 键,然后输入 `auto-complete-mode`,再按回车键,获得弹出的函数描述。激活该模式后,当你在文档中键入任何 Emacs 函数时,都会向你提供自动补完选项,以及函数的描述。 + +![Emacs function][7] + +当你找到一个有用的函数并使用它时,Emacs 会告诉你它的键盘绑定,如果有的话。如果没有的话,你可以通过打开你的 `$HOME/.emacs` 配置文件并输入键盘快捷键来自己分配一个。语法是 ` global-set-key`,后面是你要使用的键盘快捷键,然后是你要调用的函数。 + +例如,要将 `screenwriter-slugline` 函数分配一个键盘绑定: + +``` +(global-set-key (kbd “C-c s”) 'screenwriter-slugline) +``` + +重新加载配置文件,键盘快捷键就可以使用了: + +``` +M-x load-file ~/.emacs +``` + +### 紧急按钮 + +当你使用 Emacs 并尝试新的函数时,你一定会开始调用一些你并不想调用的东西。Emacs 中通用的紧急按钮是 `C-g`(就是 `Ctrl+G`)。 + +我通过将 G 与 GNU 联系起来来记住这一点,我想我是在呼吁 GNU 将我从一个错误的决定中拯救出来,但请随意编造你自己的记忆符号。 + +如果你按几下 `C-g`,Emacs 的迷你缓冲区就会回到潜伏状态,弹出窗口被隐藏,你又回到了一个普通的、无聊的文本编辑器的安全状态。 + +### 忽略键盘快捷键 + +潜在的键盘快捷键太多,在这里无法一一总结,更不希望你能记住。这是设计好的。Emacs 的目的是为了定制,当人们为 Emacs 编写插件时,他们可以定义自己的特殊键盘快捷键。 + +我们的想法不是要马上记住所有的快捷键。相反,你的目标是让你在使用 Emacs 时感到舒适。你在 Emacs 中变得越舒适,你就越会厌倦总是求助于菜单栏,你就会开始记住对你重要的组合键。 + +根据自己在 Emacs 中通常做的事情,每个人都有自己喜欢的快捷方式。一个整天用 Emacs 写代码的人可能知道运行调试器或启动特定语言模式的所有键盘快捷键,但对 Org 模式或 Artist 模式一无所知。这很自然,也很好。 + +### 使用 Bash 时练习 Emacs + +了解 Emacs 键盘快捷键的一个好处是,其中许多快捷键也适用于 Bash。 + + * `C-a`:到行首 + * `C-e`:到行尾 + * `C-k`:剪切整行 + * `M-f`:向前一个字 + * `M-b`:向后一个字 + * `M-d`:剪切一个字 + * `C-y`:贴回(粘贴)最近剪切的内容 + * `M-Shift-U`:大写一个词 + * `C-t`:交换两个字符(例如,`sl` 变成 `ls`) + +还有更多的例子,它能让你与 Bash 终端的交互速度超乎你的想象。 + +### 包 + +Emacs 有一个内置的包管理器来帮助你发现新的插件。它的包管理器包含了帮助你编辑特定类型文本的模式(例如,如果你经常编辑 JSON 文件,你可以尝试使用 ejson 模式)、嵌入的应用程序、主题、拼写检查选项、linter 等。这就是 Emacs 有可能成为你日常计算的关键所在;一旦你找到一个优秀的 Emacs 包,你可能离不开它了。 + +![Emacs emoji][8] + +你可以按 `M-x`(就是 `Alt+X`)键,然后输入 `package-list-packages` 命令,再按回车键来浏览包。软件包管理器在每次启动时都会更新缓存,所以第一次使用时要耐心等待它下载可用软件包的列表。一旦加载完毕,你可以用键盘或鼠标进行导航(记住,Emacs 是一个 GUI 应用程序)。每一个软件包的名称都是一个按钮,所以你可以将光标移到它上面,然后按回车键,或者直接用鼠标点击它。你可以在 Emacs 框架中出现的新窗口中阅读有关软件包的信息,然后用安装按钮来安装它。 + +有些软件包需要特殊的配置,有时会在它的描述中列出,但有时需要你访问软件包的主页来阅读更多的信息。例如,自动完成包 `ac-emoji` 很容易安装,但需要你定义一个符号字体。无论哪种方式都可以使用,但你只有在安装了字体的情况下才能看到相应的表情符号,除非你访问它的主页,否则你可能不会知道。 + +### 俄罗斯方块 + +Emacs 有游戏,信不信由你。有数独、拼图、扫雷、一个好玩的心理治疗师,甚至还有俄罗斯方块。这些并不是特别有用,但在任何层面上与 Emacs 进行交互都是很好的练习,游戏是让你在 Emacs 中花费时间的好方法。 + +![Emacs tetris][9] + +俄罗斯方块也是我最初接触 Emacs 的方式,所以在该游戏的所有版本中,Emacs 版本才是我真正的最爱。 + +### 使用 Emacs + +GNU Emacs 之所以受欢迎,是因为它的灵活性和高度可扩展性。人们习惯了 Emacs 的键盘快捷键,以至于他们习惯性地尝试在其他所有的应用程序中使用这些快捷键,他们将应用程序构建到 Emacs 中,所以他们永远不需要离开。如果你想让 Emacs 在你的计算生活中扮演重要角色,最终的关键是拥抱未知,开始使用 Emacs。磕磕绊绊地,直到你发现如何让它为你工作,然后安下心来,享受 40 年的舒适生活。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/3/getting-started-emacs + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/keyboaord_enter_writing_documentation.jpg?itok=kKrnXc5h (Computer keyboard typing) +[2]: https://opensource.com/downloads/emacs-cheat-sheet +[3]: https://opensource.com/downloads/cheat-sheet-vim +[4]: https://opensource.com/article/17/2/pocketchip-or-pi +[5]: https://opensource.com/sites/default/files/uploads/emacs-slackware.jpg (Emacs slackware) +[6]: https://opensource.com/sites/default/files/uploads/emacs-tutorial-map.png (Emacs tutorial map) +[7]: https://opensource.com/sites/default/files/uploads/emacs-function.jpg (Emacs function) +[8]: https://opensource.com/sites/default/files/uploads/emacs-emoji_0.jpg (Emacs emoji) +[9]: https://opensource.com/sites/default/files/uploads/emacs-tetris.jpg (Emacs tetris) diff --git a/published/202011/20200720 An introduction to mutation testing in Python.md b/published/202011/20200720 An introduction to mutation testing in Python.md new file mode 100644 index 0000000000..8d737a7cf5 --- /dev/null +++ b/published/202011/20200720 An introduction to mutation testing in Python.md @@ -0,0 +1,155 @@ +[#]: collector: (lujun9972) +[#]: translator: (MjSeven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12871-1.html) +[#]: subject: (An introduction to mutation testing in Python) +[#]: via: (https://opensource.com/article/20/7/mutmut-python) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +Python 突变测试介绍 +====== + +> 通过突变测试来修复未知的 bug。 + +![](https://img.linux.net.cn/data/attachment/album/202011/29/230106ie9xc89dj3jx1yj9.jpg) + +你一定对所有内容都进行了测试,也许你甚至在项目仓库中有一个徽章,标明有 100% 的测试覆盖率,但是这些测试真的帮到你了吗?你怎么知道的? + +开发人员很清楚单元测试的*成本*。测试必须要编写。有时它们无法按照预期工作:存在假告警或者抖动测试。在不更改任何代码的情况下有时成功,有时失败。通过单元测试发现的小问题很有价值,但是通常它们悄无声息的出现在开发人员的机器上,并且在提交到版本控制之前就已得到修复。但真正令人担忧的问题大多是看不见的。最糟糕的是,*丢失的告警*是完全不可见的:你看不到没能捕获的错误,直到出现在用户手上 —— 有时甚至连用户都看不到。 + +有一种测试可以使不可见的错误变为可见:[突变测试][2]mutation testing。 + +变异测试通过算法修改源代码,并检查每次测试是否都有“变异体”存活。任何在单元测试中幸存下来的变异体都是问题:这意味着对代码的修改(可能会引入错误)没有被标准测试套件捕获。 + +[Python][3] 中用于突变测试的一个框架是 `mutmut`。 + +假设你需要编写代码来计算钟表中时针和分针之间的角度,直到最接近的度数,代码可能会这样写: + +``` +def hours_hand(hour, minutes): +    base = (hour % 12 ) * (360 // 12) +    correction = int((minutes / 60) * (360 // 12)) +    return base + correction + +def minutes_hand(hour, minutes): +    return minutes * (360 // 60) + +def between(hour, minutes): +    return abs(hours_hand(hour, minutes) - minutes_hand(hour, minutes)) +``` + +首先,写一个简单的单元测试: + +``` +import angle + +def test_twelve(): +    assert angle.between(12, 00) == 0 +``` + +足够了吗?代码没有 `if` 语句,所以如果你查看覆盖率: + +``` +$ coverage run `which pytest` +============================= test session starts ============================== +platform linux -- Python 3.8.3, pytest-5.4.3, py-1.8.2, pluggy-0.13.1 +rootdir: /home/moshez/src/mut-mut-test +collected 1 item                                                               + +tests/test_angle.py .                                                    [100%] + +============================== 1 passed in 0.01s =============================== +``` + +完美!测试通过,覆盖率为 100%,你真的是一个测试专家。但是,当你使用突变测试时,覆盖率会变成多少? + +``` +$ mutmut run --paths-to-mutate angle.py + +Legend for output: +🎉 Killed mutants. The goal is for everything to end up in this bucket. +⏰ Timeout. Test suite took 10 times as long as the baseline so were killed. +🤔 Suspicious. Tests took a long time, but not long enough to be fatal. +🙁 Survived. This means your tests needs to be expanded. +🔇 Skipped. Skipped. + +⠋ 21/21 🎉 5 ⏰ 0 🤔 0 🙁 16 🔇 0 +``` + +天啊,在 21 个突变体中,有 16 个存活。只有 5 个通过了突变测试,但是,这意味着什么呢? + +对于每个突变测试,`mutmut` 会修改部分源代码,以模拟潜在的错误,修改的一个例子是将 `>` 比较更改为 `>=`,查看会发生什么。如果没有针对这个边界条件的单元测试,那么这个突变将会“存活”:这是一个没有任何测试用例能够检测到的潜在错误。 + +是时候编写更好的单元测试了。很容易检查使用 `results` 所做的更改: + +``` +$ mutmut results + +Survived 🙁 (16) + +---- angle.py (16) ---- + +4-7, 9-14, 16-21 +$ mutmut apply 4 +$ git diff +diff --git a/angle.py b/angle.py +index b5dca41..3939353 100644 +--- a/angle.py ++++ b/angle.py +@@ -1,6 +1,6 @@ + def hours_hand(hour, minutes): + hour = hour % 12 +- base = hour * (360 // 12) ++ base = hour / (360 // 12) + correction = int((minutes / 60) * (360 // 12)) + return base + correction +``` + +这是 `mutmut` 执行突变的一个典型例子,它会分析源代码并将运算符更改为不同的运算符:减法变加法。在本例中由乘法变为除法。一般来说,单元测试应该在操作符更换时捕获错误。否则,它们将无法有效地测试行为。按照这种逻辑,`mutmut` 会遍历源代码仔细检查你的测试。 + +你可以使用 `mutmut apply` 来应用失败的突变体。事实证明你几乎没有检查过 `hour` 参数是否被正确使用。修复它: + +``` +$ git diff +diff --git a/tests/test_angle.py b/tests/test_angle.py +index f51d43a..1a2e4df 100644 +--- a/tests/test_angle.py ++++ b/tests/test_angle.py +@@ -2,3 +2,6 @@ import angle + + def test_twelve(): + assert angle.between(12, 00) == 0 ++ ++def test_three(): ++ assert angle.between(3, 00) == 90 +``` + +以前,你只测试了 12 点钟,现在增加一个 3 点钟的测试就足够了吗? + +``` +$ mutmut run --paths-to-mutate angle.py + +⠋ 21/21 🎉 7 ⏰ 0 🤔 0 🙁 14 🔇 0 +``` + +这项新测试成功杀死了两个突变体,比以前更好,当然还有很长的路要走。我不会一一解决剩下的 14 个测试用例,因为我认为模式已经很明确了。(你能将它们降低到零吗?) + +变异测试和覆盖率一样,是一种工具,它允许你查看测试套件的全面程度。使用它使得测试用例需要改进:那些幸存的突变体中的任何一个都是人类在篡改代码时可能犯的错误,以及潜伏在程序中的隐藏错误。继续测试,愉快地搜寻 bug 吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/mutmut-python + +作者:[Moshe Zadka][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/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://opensource.com/article/19/8/mutation-testing-evolution-tdd +[3]: https://opensource.com/resources/python diff --git a/published/202011/20200804 Use your favorite programming language to provision Infrastructure as Code.md b/published/202011/20200804 Use your favorite programming language to provision Infrastructure as Code.md new file mode 100644 index 0000000000..2429ce55ae --- /dev/null +++ b/published/202011/20200804 Use your favorite programming language to provision Infrastructure as Code.md @@ -0,0 +1,452 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12862-1.html) +[#]: subject: (Use your favorite programming language to provision Infrastructure as Code) +[#]: via: (https://opensource.com/article/20/8/infrastructure-as-code-pulumi) +[#]: author: (Lee Briggs https://opensource.com/users/lbriggs) + +使用你喜欢的编程语言,将基础设施作为代码进行配置 +====== + +> 用 Node.js 或其他编程语言为你提供启动基础设施所需的一切服务。 + +![](https://img.linux.net.cn/data/attachment/album/202011/27/151108bnnggmxegfzwog46.jpg) + +当你在 IT 和技术的世界里遨游时,你会反复遇到一些术语。其中有些术语很难量化,随着时间的推移,可能会有不同的含义。[“DevOps”][2] 就是一个例子,这个词似乎(在我看来)会根据使用它的人而改变;最初的 DevOps 先驱者可能甚至不认识我们今天所说的 DevOps。 + +如果你是一个软件开发者,“基础架构即代码Infrastructure as Code”(IaC)可能是其中一个术语。IaC 是使用与你编写面向用户的功能相同的软件开发实践来声明应用程序运行的基础设施。这通常意味着使用 [Git][3] 或 [Mercurial][4] 等工具进行版本控制,使用 Puppet、Chef 或 Ansible 进行[配置管理][5]。在基础设施供应层,最常见的技术是 CloudFormation(专用于 AWS),或开源替代品 [Terraform][6],用来创建供你的应用程序运行的混合云资源。 + +在配置管理领域有很好产品可供选择,可以将 IaC 写成配置文件或首选的编程语言,但这种选择在基础设施供应领域并不常见。 + +[Pulumi][7] 提供了一个使用标准编程语言来定义基础设施的方式。它支持一系列语言,包括 [JavaScript][8]、[TypeScript][9]、[Go][10]、[Python][11] 和 [C#][12]。就像 Terraform 一样,Pulumi 对许多熟悉的云提供商有一流的支持,比如 [AWS][13]、[Azure][14]、[Google Cloud][15] 和[其他提供商][16]。 + +在本文中,我将向你展示如何使用 Pulumi 以 Node.js 编写基础设施。 + +### 先决条件 + +首先,确保你已经做好了使用 Pulumi 的准备。Pulumi 支持所有主流的操作系统,所以你安装其先决条件的方法取决于你使用的操作系统。 + +首先,安装你喜欢的编程语言的解释器。我将使用 TypeScript,所以我需要安装 `node` 二进制。请查阅 Node 的[安装说明][17],了解你的操作系统的信息。你可以在 [Mac][19] 或 [Linux][20] 上使用 [Homebrew][18] 来安装: + +``` +brew install node +``` + +在 Linux 上,你可以使用你常用的软件包管理器,如 `apt` 或 `dnf`。 + +``` +$ sudo dnf install nodejs +``` + +无论哪种情况,结果都应该是 `node` 二进制文件在你的 `$PATH` 中可用。要确认它是可访问的,运行: + +``` +node --version +``` + +接下来,安装 Pulumi 命令行界面(CLI)。你可以在 Pulumi 的文档中找到针对不同操作系统的[安装说明][21]。在 Mac 或 Linux 上使用 `brew`: + +``` +brew install pulumi +``` + +另外,你也可以使用安装脚本。首先下载并审查它,然后执行它: + +``` +$ curl -fsSL --output pulumi_installer.sh https://get.pulumi.com/ +$ more  pulumi_installer.sh +$ sh ./pulumi_installer.sh +``` + +同样,我们所希望的结果是在你的路径上有 `pulumi` 二进制。检查版本以确保你已经准备好了: + +``` +pulumi version +v2.5.0 +``` + +### 配置 Pulumi + +在你开始配置任何基础设施之前,给 Pulumi 一个存储其[状态][22]的地方。 + +Pulumi 将其状态存储在后端。默认的后端是 Pulumi 的软件即服务(它有一个针对个人用户的免费计划),但在这个例子中,我使用替代的文件后端。文件后端将在你的本地文件系统上创建一个文件来存储状态: + +``` +pulumi login --local +``` + +如果你打算和别人分享这个项目,文件后台可能不是一个好的起点。Pulumi 还可以将其状态存储在 AWS S3 等云对象存储中。要使用它,请创建一个 S3 bucket 并登录: + +``` +pulumi login --cloud-url s3://my-pulumi-state-bucket +``` + +现在你已经登录到了状态后端,你可以创建一个项目和一个堆栈了! + +在你开始创建 Pulumi 项目之前,请先了解以下 Pulumi 术语,你将在本教程中看到这些术语。 + +#### 项目 + +[项目][23]project是一个包含 `Pulumi.yaml` 文件的目录。这个文件包含了 Pulumi 需要知道的元数据,以便进行它的工作。在 `Pulumi.yaml` 文件中可以找到的示例字段有: + + * 运行时(例如,Python、Node、Go、.Net) + * 项目说明(如“我的第一个 Pulumi 项目”) + * 项目名称 + +项目是一个松散的概念,可以满足你的需求。一般来说,一个项目包含了一系列的*资源*,这些资源是你想要提供和控制的东西。你可以选择拥有资源很少的小型 Pulumi 项目,也可以选择包含所有你需要的资源的大型项目。随着你对 Pulumi 越来越熟悉,你想如何布局你的项目会变得更加清晰。 + +#### 堆栈 + +Pulumi [堆栈][24]stack允许你根据可配置的值来区分你的 Pulumi 项目。一个常见的用途是将一个项目部署到不同的环境,如开发或生产环境,或不同的地区,如欧洲、中东和非洲以及美国。 + +在入门时,你不大需要一个复杂的堆栈设置,所以本演练使用默认的堆栈名称 `dev`。 + +### 在 IaC 中使用 TypeScript + +你可以使用方便的 `pulumi new` 命令来初建bootstrap一个 Pulumi 项目。`new` 命令有一大堆标志和选项,可以帮助你入门 Pulumi,所以请继续创建你的第一个项目: + +``` +$ pulumi new typescript +This command will walk you through creating a new Pulumi project. + +Enter a value or leave blank to accept the (default), and press . +Press ^C at any time to quit. + +project name: (pulumi) my-first-project +project description: (A minimal TypeScript Pulumi program) My very first Pulumi program +Created project 'my-first-project' + +Please enter your desired stack name. +To create a stack in an organization, use the format / (e.g. `acmecorp/dev`). +stack name: (dev) dev +Created stack 'dev' + +Installing dependencies... + + +> node scripts/postinstall + +added 82 packages from 126 contributors and audited 82 packages in 2.84s + +13 packages are looking for funding + run `npm fund` for details + +found 0 vulnerabilities + +Finished installing dependencies + +Your new project is ready to go! ✨ + +To perform an initial deployment, run 'pulumi up' +``` + +这里发生了很多事情,我将其展开来说: + +第一部分是为你的 Pulumi 项目确定一个模板。我选择了通用的 `typescript` 选项,但是有[很多选项可供选择][25]。 + +这个 `new` 命令从你的模板库中抓取模板,并将这个文件复制到本地,包括运行时的依赖关系(在本例中是 `package.json`)。 + +`new` 命令通过在这个目录下运行 `npm install` 来安装这些依赖关系。然后 `npm install` 下载并安装运行 Pulumi 程序所需的一切,在这种情况下就是:`@pulumi/pulumi` NPM 包。 + +你已经准备好创建你的第一个资源了! + +### 创建你的第一个云资源 + +资源是一个由你的基础设施供应软件生命周期进行管理的东西。资源一般是一个云提供商对象cloud provider object,比如 S3 桶。Pulumi 的提供商处理 Pulumi 资源,提供商是具体的云提供商。Pulumi 有大约 [40 个提供商][26]可供你使用,但对于你的第一个资源,使用一个最简单的:[随机提供商][27]random provider。 + +随机提供者顾名思义:它幂等地创建一个随机资源(例如,可以是一个字符串),并将其存储在 Pulumi 状态中。 + +使用 `npm` 将其添加到你的 Pulumi 项目中作为依赖关系: + +``` +npm install @pulumi/random +``` + +npm 包管理器下载并安装随机提供者包,并为你安装。现在你已经准备好编写你的 Pulumi 程序了。 + +当你之前生成你的项目时,Pulumi 的初建过程创建了一个 `index.ts` TypeScript 文件。在你喜欢的集成开发环境(IDE)中打开它,并添加你的第一个资源: + +``` +import * as pulumi from "@pulumi/pulumi"; +import * as random from "@pulumi/random"; + +const password = new random.RandomString(`password`, { +    length: 10 +}) +``` + +如果你对 TypeScript 或 JavaScript 非常熟悉,这看起来会非常熟悉,因为它是用你熟悉的编程语言编写的。如果你使用的是 Pulumi 支持的其他语言之一,也是一样的。这里是之前的那个随机资源,但这次是用 Python 写的: + +``` +import pulumi_random as random + +password = random.RandomString("password", length=10) +``` + +一个 Pulumi 项目目前只支持单一一种语言,但每个项目都可以引用其他语言编写的项目,这对于多语言团队的成员来说是一个很有用的技巧。 + +你已经编写了第一个 Pulumi 资源。现在你需要部署它。 + +离开编辑器,回到命令行。在你的项目目录下,运行 `pulumi up`,然后看着神奇的事情发生: + +``` +pulumi up + +Previewing update (dev): +     Type                          Name                  Plan + +   pulumi:pulumi:Stack           my-first-project-dev  create + +   └─ random:index:RandomString  password              create + +Resources: +    + 2 to create + +Do you want to perform this update? yes +Updating (dev): +     Type                          Name                  Status + +   pulumi:pulumi:Stack           my-first-project-dev  created + +   └─ random:index:RandomString  password              created + +Resources: +    + 2 created + +Duration: 2s + +Permalink: file:///Users/lbriggs/.pulumi/stacks/dev.json +``` + +太好了,你有了第一个 Pulumi 资源! 虽然你可能很享受这种成就感,但不幸的是,这个随机资源并没有那么有用:它只是一个随机的字符串,你甚至看不到它是什么。先解决这部分问题。修改你之前的程序,在你创建的常量中加入 `export`: + +``` +import * as pulumi from "@pulumi/pulumi"; +import * as random from "@pulumi/random"; + +export const password = new random.RandomString(`password`, { +    length: 10 +}) +``` + +重新运行 `pulumi up`,看看输出: + +``` +pulumi up +Previewing update (dev): + Type Name Plan + pulumi:pulumi:Stack my-first-project-dev + +Outputs: + + password: { + + id : "&+r?{}J$J7" + + keepers : output + + length : 10 + + lower : true + + minLower : 0 + + minNumeric : 0 + + minSpecial : 0 + + minUpper : 0 + + number : true + + overrideSpecial: output + + result : "&+r?{}J$J7" + + special : true + + upper : true + + urn : "urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password" + } + +Resources: + 2 unchanged + +Do you want to perform this update? yes +Updating (dev): + Type Name Status + pulumi:pulumi:Stack my-first-project-dev + +Outputs: + + password: { + + id : "&+r?{}J$J7" + + length : 10 + + lower : true + + minLower : 0 + + minNumeric: 0 + + minSpecial: 0 + + minUpper : 0 + + number : true + + result : "&+r?{}J$J7" + + special : true + + upper : true + + urn : "urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password" + } + +Resources: + 2 unchanged + +Duration: 1s +Permalink: file:///Users/lbriggs/.pulumi/stacks/dev.json +``` + +现在你可以在 `Outputs` 的 `result` 部分下看到一个随机生成的字符串。你现在可以看到你创建的资源有很多属性。 + +这一切都很好,但如果你想享受 IaC,你得提供一些随机字符串以外的东西。试试吧。 + +### 部署一个容器 + +到目前为止,你已经通过安装依赖关系和注册一个简单的随机资源来 体验了初建你的 Pulumi。现在部署一些实际的基础设施,尽管是在你的本地机器上。 + +首先,将 `@pulumi/docker` 提供者添加到你的堆栈中。使用你选择的包管理器将其添加到项目中: + +``` +npm install @pulumi/docker +``` + +你已经从 `npm` 下拉了 Pulumi Docker 提供商包,这意味着你现在可以在你的项目中创建 Docker 镜像。 + +如果你的机器上还没有安装 Docker,现在是一个极好的时机去安装它。说明将取决于你的操作系统,所以看看 [Docker 的安装页面][28]了解信息。 + +再次打开你喜欢的 IDE,运行一个 Docker 容器。修改你之前的 `index.ts` 文件,让它看起来像这样: + +``` +import * as pulumi from "@pulumi/pulumi"; +import * as random from "@pulumi/random"; +import * as docker from "@pulumi/docker"; + +const password = new random.RandomString(`password`, { +    length: 10 +}) + +const container = new docker.Container(`my-password`, { +    image: 'hashicorp/http-echo', +    command: [ pulumi.interpolate`-text=Your super secret password is: ${password.result}` ], +    ports: [{ +        internal: 5678, +        external: 5678, +    }] +}) + +export const id = container.id +``` + +这将创建一个容器,创建一个 Web 服务器。Web 服务器的输出是你随机生成的字符串,在本例中是一个密码。运行这个,看看会发生什么: + +``` +pulumi up + +Previewing update (dev): + Type Name Plan + pulumi:pulumi:Stack my-first-project-dev + + └─ docker:index:Container my-password create + +Outputs: + + id : output + ~ password: { + id : "&+r?{}J$J7" + length : 10 + lower : true + minLower : 0 + minNumeric: 0 + minSpecial: 0 + minUpper : 0 + number : true + result : "&+r?{}J$J7" + special : true + upper : true + urn : "urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password" + } + +Resources: + + 1 to create + 2 unchanged + +Do you want to perform this update? yes +Updating (dev): + Type Name Status + pulumi:pulumi:Stack my-first-project-dev + + └─ docker:index:Container my-password created + +Outputs: + + id : "e73b34aeca34a64b72b61b0b9b8438637ce28853937bc359a1528ca99f49ddda" + password: { + id : "&+r?{}J$J7" + length : 10 + lower : true + minLower : 0 + minNumeric: 0 + minSpecial: 0 + minUpper : 0 + number : true + result : "&+r?{}J$J7" + special : true + upper : true + urn : "urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password" + } + +Resources: + + 1 created + 2 unchanged + +Duration: 2s +Permalink: file:///Users/lbriggs/.pulumi/stacks/dev.json +``` + +你会注意到在 `Outputs` 部分,你输出的值已经改变了,它只是一个 Docker 容器 ID。检查你的非常简单的密码生成器是否工作: + +``` +curl http://localhost:5678 +Your super secret password is: &+r?{}J$J7 +``` + +就是这样! 你刚刚用 TypeScript 配置了你的第一个基础架构。 + +#### 关于 Pulumi 输出的快速说明 + +你会注意到在创建 Docker 容器的代码中,它使用了一个特殊的 `pulumi.interpolate` 调用。如果你熟悉 TypeScript,你可能会好奇为什么需要这样做(因为它是 Pulumi 特有的)。这有一个有趣的原因。 + +当 Pulumi 创建一个资源时,直到程序执行时有一些值是 Pulumi 不知道的。在 Pulumi 中,这些值被称为 `Outputs`。这些 `Outputs` 可以在上面的代码中看到,例如,在你的第一个随机资源中,你使用 `export` 关键字来输出随机资源的属性,你还输出了你创建的容器的容器 ID。 + +因为 Pulumi 直到执行时才知道这些 `Outputs` 的值,所以在操作字符串时,它需要特殊的助手来使用它们。如果你想了解更多关于这个特殊的编程模型,请观看[这个短视频][29]。 + +### 总结 + +随着混合云基础架构中出现的复杂性,IaC 在很多方面都有了发展。在基础设施供应领域,Pulumi 是一个很好的选择,它可以使用你最喜欢的编程语言来供应你所需要的一切基础设施,然后你可以在你最喜欢的配置管理工具中进行标记,以采取下一步措施。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/infrastructure-as-code-pulumi + +作者:[Lee Briggs][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/lbriggs +[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://opensource.com/resources/devops +[3]: https://git-scm.com/ +[4]: https://www.mercurial-scm.org/ +[5]: https://opensource.com/article/18/12/configuration-management-tools +[6]: https://opensource.com/article/20/7/terraform-kubernetes +[7]: https://www.pulumi.com/ +[8]: https://developer.mozilla.org/en-US/docs/Web/JavaScript +[9]: https://www.typescriptlang.org/ +[10]: https://golang.org/ +[11]: https://www.python.org/ +[12]: https://en.wikipedia.org/wiki/C_Sharp_(programming_language) +[13]: https://www.pulumi.com/docs/intro/cloud-providers/aws/ +[14]: https://www.pulumi.com/docs/intro/cloud-providers/azure/ +[15]: https://www.pulumi.com/docs/intro/cloud-providers/gcp/ +[16]: https://www.pulumi.com/docs/reference/pkg/ +[17]: https://nodejs.org/en/download/ +[18]: https://brew.sh/ +[19]: https://opensource.com/article/20/6/homebrew-mac +[20]: https://opensource.com/article/20/6/homebrew-linux +[21]: https://www.pulumi.com/docs/get-started/install/ +[22]: https://www.pulumi.com/docs/intro/concepts/state/ +[23]: https://www.pulumi.com/docs/intro/concepts/project/ +[24]: https://www.pulumi.com/docs/intro/concepts/stack/ +[25]: https://github.com/pulumi/templates +[26]: https://www.pulumi.com/docs/intro/cloud-providers/ +[27]: https://www.pulumi.com/docs/intro/cloud-providers/random/ +[28]: https://docs.docker.com/get-docker/ +[29]: https://www.youtube.com/watch?v=lybOxul2otM diff --git a/published/202011/20200909 How to Install Ubuntu Server on a Raspberry Pi.md b/published/202011/20200909 How to Install Ubuntu Server on a Raspberry Pi.md new file mode 100644 index 0000000000..58c77ccb7f --- /dev/null +++ b/published/202011/20200909 How to Install Ubuntu Server on a Raspberry Pi.md @@ -0,0 +1,202 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12783-1.html) +[#]: subject: (How to Install Ubuntu Server on a Raspberry Pi) +[#]: via: (https://itsfoss.com/install-ubuntu-server-raspberry-pi/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在树莓派上安装 Ubuntu 服务器? +====== + +![][6] + +[树莓派][1]是最著名的[单板计算机][2]。最初,树莓派项目的范围旨在促进学校和发展中国家的计算机基础科学的教学。 + +它的低成本、便携性和极低的功耗,使得它的受欢迎程度远远超过预期。从气象站到家庭自动化,玩家们用树莓派搭建了许多[酷炫的项目][3]。 + +[第四代树莓派][4]具备了普通台式电脑的功能和处理能力。但本文并不是要介绍如何使用树莓派作为桌面。相反,我会告诉你如何在树莓派上安装 Ubuntu 服务器。 + +在本教程中,我将使用树莓派 4,以下是我将介绍的内容: + + * 在 microSD 卡上安装 Ubuntu 服务器 + * 在树莓派上设置无线网络连接 + * 通过 SSH 访问你的树莓派 + +![][5] + +**本教程需要以下设备**: + + * 一张 micro SD 卡(建议使用 8GB 或更大的卡) + * 一台带有 micro SD 卡读卡器的计算机(运行 Linux、Windows 或 macOS) + * 树莓派 2、3 或 4 + * 良好的互联网连接 + * 用于树莓派 2 和 3 的 HDMI 线和用于树莓派 4 的 micro HDMI 线(可选) + * 一套 USB 键盘(可选) + +### 在树莓派上安装 Ubuntu 服务器 + +在本教程中,我使用 Ubuntu 来创建树莓派 SD 卡,但你可以在其他 Linux 发行版、macOS 和 Windows 上创建它。这是因为准备 SD 卡的步骤对 Raspberry Pi Imager 工具而言是一样的。 + +Raspberry Pi Imager 工具会自动下载你[选择的树莓派系统][7]镜像。这意味着你需要一个良好的网络连接来下载 1GB 左右的数据。 + +#### 步骤 1:用 Raspberry Pi Imager 准备 SD 卡 + +确保你已将 microSD 卡插入电脑,并在电脑上安装 Raspberry Pi Imager。 + +你可以从这些链接中下载适合你操作系统的 Imager 工具: + + * [用于 Ubuntu/Debian 的 Raspberry Pi Imager][8] + * [用于 Windows 的 Raspberry Pi Imager][9] + * [用于 MacOS 的 Raspberry Pi Imager][10] + +尽管我使用的是 Ubuntu,但我不会使用上面列出的 Debian 软件包,而是使用命令行安装 snap 包。这个方法可以适用于更广泛的 Linux 发行版。 + +``` +sudo snap install rpi-imager +``` + +安装好 Raspberry Pi Imager 工具后,找到并打开它,点击 “CHOOSE OS” 菜单。 + +![][11] + +滚动菜单并点击 “Ubuntu” (“核心”和“服务器”镜像)。 + +![][12] + +从可用的镜像中,我选择了 Ubuntu 20.04 LTS 64 位。如果你有一个树莓派 2,那你只能选择 32 位镜像。 + +**重要提示:如果你使用的是最新的树莓派 4 - 8 GB 内存型号,你应该选择 64 位操作系统,否则只能使用 4 GB 内存。** + +![][13] + +从 “SD Card” 菜单中选择你的 microSD 卡,然后点击 “WRITE”。 + +![][14] + +如果它显示一些错误,请尝试再次写入它。现在它将下载 Ubuntu 服务器镜像并将其写入 micro SD 卡。 + +当这个过程完成时,它将通知你。 + +![][15] + +#### 步骤 2:在 Ubuntu 服务器上添加 WiFi 支持 + +烧录完 micro SD 卡后,你就差不多可以使用它了。在使用它之前,有一件事情你可能想做,那就是添加 Wi-Fi 支持。 + +SD 卡仍然插入读卡器中,打开文件管理器,找到卡上的 “system-boot” 分区。 + +你要找的和需要编辑的文件名为 `network-config`。 + +![][16] + +这个过程也可以在 Windows 和 MacOS 上完成。如前所述,编辑 `network-config` 文件,添加你的 Wi-Fi 凭证。 + +首先,取消矩形框内的行的注释(删除开头的标签 `#`)。 + +之后,将 `myhomewifi` 替换为你的 Wi-Fi 网络名,比如 `"itsfoss"`,将 `"S3kr1t"` 替换为 Wi-Fi 密码,用引号括起来,比如 `"12345679"`。 + +![][17] + +它可能看上去像这样: + +``` +wifis: + wlan0: + dhcp4: true + optional: true + access-points: + "your wifi name": + password: "your_wifi_password" +``` + +保存文件并将 micro SD 卡插入到你的树莓派中。在第一次启动时,如果你的树莓派无法连接到 Wi-Fi 网络,只需重启你的设备。 + +#### 步骤 3:在树莓派上使用 Ubuntu 服务器(如果你有专门的显示器、键盘和鼠标的话) + +如果你有一套额外的鼠标,键盘和显示器,你可以很容易地像其他电脑一样使用树莓派(但没有 GUI)。 + +只需将 micro SD 卡插入树莓派,连接显示器、键盘和鼠标。现在[打开你的树莓派][18]。它将出现 TTY 登录屏幕(黑色终端屏幕)并询问用户名和密码。 + + * 默认用户名:`ubuntu` + * 默认密码:`ubuntu` + +看到提示符时,用 `ubuntu` 作为密码。登录成功后,[Ubuntu 会要求你更改默认密码][19]。 + +享受你的 Ubuntu 服务器吧! + +#### 步骤 3:通过 SSH 远程连接到你的树莓派(如果你没有树莓派的显示器、键盘和鼠标的话) + +如果你没有专门与树莓派一起使用的显示器也没关系。当你可以直接通过 SSH 进入它并按照你的方式使用它时,谁还需要一个带有显示器的服务器呢? + +**在 Ubuntu 和 Mac OS**上,通常已经安装了一个 SSH 客户端。要远程连接到你的树莓派,你需要找到它的 IP 地址。检查[连接到你的网络的设备][20],看看哪个是树莓派。 + +由于我没有 Windows 机器,你可以访问[微软][21]提供的综合指南。 + +打开终端,运行以下命令: + +``` +ssh ubuntu@raspberry_pi_ip_address +``` + +你可能会看到以下信息确认连接: + +``` +Are you sure you want to continue connecting (yes/no/[fingerprint])? +``` + +输入 `yes`,然后点击回车键。 + +![][22] + +当提示时,用前面提到的 `ubuntu` 作为密码。当然,你会被要求更改密码。 + +完成后,你将自动注销,你必须使用新密码重新连接。 + +你的 Ubuntu 服务器就可以在树莓派上运行了! + +### 总结 + +在树莓派上安装 Ubuntu 服务器是一个简单的过程,而且它的预配置程度很高,使用起来很愉快。 + +我不得不说,在所有[我在树莓派上尝试的操作系统][7]中,Ubuntu 服务器是最容易安装的。我并没有夸大其词。请查看我的[在树莓派上安装 Arch Linux][23] 的指南,以供参考。 + +希望这篇指南也能帮助你在树莓派上安装 Ubuntu 服务器。如果你有问题或建议,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-ubuntu-server-raspberry-pi/ + +作者:[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.raspberrypi.org/ +[2]: https://itsfoss.com/raspberry-pi-alternatives/ +[3]: https://itsfoss.com/raspberry-pi-projects/ +[4]: https://itsfoss.com/raspberry-pi-4/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/Ubuntu-Server-20.04.1-LTS-aarch64.png?resize=800%2C600&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/ubuntu-server-raspberry-pi.png?resize=800%2C450&ssl=1 +[7]: https://itsfoss.com/raspberry-pi-os/ +[8]: https://downloads.raspberrypi.org/imager/imager_amd64.deb +[9]: https://downloads.raspberrypi.org/imager/imager.exe +[10]: https://downloads.raspberrypi.org/imager/imager.dmg +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/raspberry-pi-imager.png?resize=800%2C600&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/raspberry-pi-imager-choose-ubuntu.png?resize=800%2C600&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/raspberry-pi-imager-ubuntu-server.png?resize=800%2C600&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/raspberry-pi-imager-sd-card.png?resize=800%2C600&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/ubuntu-server-installed-raspberry-pi.png?resize=799%2C506&ssl=1 +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/ubuntu-server-pi-network-config.png?resize=800%2C565&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/Ubuntu-server-wifi.png?resize=800%2C600&ssl=1 +[18]: https://itsfoss.com/turn-on-raspberry-pi/ +[19]: https://itsfoss.com/change-password-ubuntu/ +[20]: https://itsfoss.com/how-to-find-what-devices-are-connected-to-network-in-ubuntu/ +[21]: https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/ubuntu-server-change-password.png?resize=800%2C600&ssl=1 +[23]: https://itsfoss.com/install-arch-raspberry-pi/ diff --git a/published/202011/20200918 Add throwing mechanics to your Python game.md b/published/202011/20200918 Add throwing mechanics to your Python game.md new file mode 100644 index 0000000000..b9540d8444 --- /dev/null +++ b/published/202011/20200918 Add throwing mechanics to your Python game.md @@ -0,0 +1,665 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12872-1.html) +[#]: subject: (Add throwing mechanics to your Python game) +[#]: via: (https://opensource.com/article/20/9/add-throwing-python-game) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +在你的 Python 游戏中添加投掷机制 +====== + +> 四处奔跑躲避敌人是一回事,反击敌人是另一回事。学习如何在这系列的第十二篇文章中在 Pygame 中创建平台游戏。 + +![](https://img.linux.net.cn/data/attachment/album/202011/30/124457xcj9mztw9kx9c7zj.jpg) + +这是仍在进行中的关于使用 [Pygame][3] 模块在 [Python 3][2] 中创建电脑游戏的第十二部分。先前的文章是: + + 1. [通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程][4] + 2. [使用 Python 和 Pygame 模块构建一个游戏框架][5] + 3. [如何在你的 Python 游戏中添加一个玩家][6] + 4. [用 Pygame 使你的游戏角色移动起来][7] + 5. [如何向你的 Python 游戏中添加一个敌人][8] + 6. [在 Pygame 游戏中放置平台][9] + 7. [在你的 Python 游戏中模拟引力][10] + 8. [为你的 Python 平台类游戏添加跳跃功能][11] + 9. [使你的 Python 游戏玩家能够向前和向后跑][12] + 10. [在你的 Python 平台类游戏中放一些奖励][13] + 11. [添加计分到你的 Python 游戏][14] + +我的上一篇文章本来是这一系列文章的最后一篇,它鼓励你为这个游戏编写自己的附加程序。你们很多人都这么做了!我收到了一些电子邮件,要求帮助我还没有涵盖的常用机制:战斗。毕竟,跳起来躲避坏人是一回事,但是有时候让他们走开是一件非常令人满意的事。在电脑游戏中向你的敌人投掷一些物品是很常见的,不管是一个火球、一支箭、一道闪电,还是其它适合游戏的东西。 + +与迄今为止你在这个系列中为你的平台游戏编程的任何东西不同,可投掷物品有一个*生存时间*。在你投掷一个物品后,它会如期在移动一段距离后消失。如果它是一支箭或其它类似的东西,它可能会在通过屏幕的边缘时而消失。如果它是一个火球或一道闪电,它可能会在一段时间后熄灭。 + +这意味着每次生成一个可投掷的物品时,也必须生成一个独特的衡量其生存时间的标准。为了介绍这个概念,这篇文章演示如何一次只投掷一个物品。(换句话说,每次仅存在一个投掷物品)。 一方面,这是一个游戏的限制条件,但另一方面,它却是游戏本身的运行机制。你的玩家不能每次同时投掷 50 个火球,因为每次仅允许一个投掷物品,所以当你的玩家释放一个火球来尝试击中一名敌人就成为了一项挑战。而在幕后,这也使你的代码保持简单。 + +如果你想启用每次投掷多个项目,在完成这篇教程后,通过学习这篇教程所获取的知识来挑战你自己。 + +### 创建 Throwable 类 + +如果你跟随学习这系列的其它文章,那么你应该熟悉在屏幕上生成一个新的对象基础的 `__init__` 函数。这和你用来生成你的 [玩家][6] 和 [敌人][8] 的函数是一样的。这里是生成一个 `throwable` 对象的 `__init__` 函数来: + +``` +class Throwable(pygame.sprite.Sprite): + """ + 生成一个 throwable 对象 + """ + def __init__(self, x, y, img, throw): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load(os.path.join('images',img)) + self.image.convert_alpha() + self.image.set_colorkey(ALPHA) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + self.firing = throw +``` + +同你的 `Player` 类或 `Enemy` 类的 `__init__` 函数相比,这个函数的主要区别是,它有一个 `self.firing` 变量。这个变量保持跟踪一个投掷的物品是否在当前屏幕上活动,因此当一个 `throwable` 对象创建时,将变量设置为 `1` 的合乎情理的。 + +### 判断存活时间 + +接下来,就像使用 `Player` 和 `Enemy` 一样,你需要一个 `update` 函数,以便投掷的物品在瞄准敌人抛向空中时,它会自己移动。 + +测定一个投掷的物品存活时间的最简单方法是侦测它何时离开屏幕。你需要监视的屏幕边缘取决于你投掷的物品的物理特性。 + + * 如果你的玩家正在投掷的物品是沿着水平轴快速移动的,像一只弩箭或箭或一股非常快的魔法力量,而你想监视你游戏屏幕的水平轴极限。这可以通过 `worldx` 定义。 + * 如果你的玩家正在投掷的物品是沿着垂直方向或同时沿着水平方向和垂直方向移动的,那么你必须监视你游戏屏幕的垂直轴极限。这可以通过 `worldy` 定义。 + +这个示例假设你投掷的物品向前移动一点并最终落到地面上。不过,投掷的物品不会从地面上反弹起来,而是继续掉落出屏幕。你可以尝试不同的设置来看看什么最适合你的游戏: + +``` + def update(self,worldy): + ''' + 投掷物理学 + ''' + if self.rect.y < worldy: #垂直轴 + self.rect.x += 15 #它向前移动的速度有多快 + self.rect.y += 5 #它掉落的速度有多快 + else: + self.kill() #移除投掷对象 + self.firing = 0 #解除火力发射 +``` + +为使你的投掷物品移动地更快,增加 `self.rect` 的动量值。 + +如果投掷物品不在屏幕上,那么该物品将被销毁,以及释放其所占用的寄存器。另外,`self.firing` 将被设置回 `0` 以允许你的玩家来进行另一次射击。 + +### 设置你的投掷对象 + +就像使用你的玩家和敌人一样,你必须在你的设置部分中创建一个精灵组来保持投掷对象。 + +此外,你必须创建一个非活动的投掷对象来供开始的游戏使用。如果在游戏开始时却没有一个投掷对象,那么玩家在第一次尝试投掷一柄武器时,投掷将失败。 + +这个示例假设你的玩家使用一个火球作为开始的武器,因此,每一个投掷实例都是由 `fire` 变量指派的。在后面的关卡中,当玩家获取新的技能时,你可以使用相同的 `Throwable` 类来引入一个新的变量以使用一张不同的图像。 + +在这代码块中,前两行已经在你的代码中,因此不要重新键入它们: + +``` +player_list = pygame.sprite.Group() #上下文 +player_list.add(player) #上下文 +fire = Throwable(player.rect.x,player.rect.y,'fire.png',0) +firepower = pygame.sprite.Group() +``` + +注意,每一个投掷对象的起始位置都是和玩家所在的位置相同。这使得它看起来像是投掷对象来自玩家。在第一个火球生成时,使用 `0` 来显示 `self.firing` 是可用的。 + +### 在主循环中获取投掷行为 + +没有在主循环中出现的代码不会在游戏中使用,因此你需要在你的主循环中添加一些东西,以便能在你的游戏世界中获取投掷对象。 + +首先,添加玩家控制。当前,你没有火力触发器。在键盘上的按键是有两种状态的:释放的按键,按下的按键。为了移动,你要使用这两种状态:按下按键来启动玩家移动,释放按键来停止玩家移动。开火仅需要一个信号。你使用哪个按键事件(按键按下或按键释放)来触发你的投掷对象取决于你的品味。 + +在这个代码语句块中,前两行是用于上下文的: + +``` + if event.key == pygame.K_UP or event.key == ord('w'): + player.jump(platform_list) + if event.key == pygame.K_SPACE: + if not fire.firing: + fire = Throwable(player.rect.x,player.rect.y,'fire.png',1) + firepower.add(fire) +``` + +与你在设置部分创建的火球不同,你使用一个 `1` 来设置 `self.firing` 为不可用。 + +最后,你必须更新和绘制你的投掷物品。这个顺序很重要,因此把这段代码放置到你现有的 `enemy.move` 和 `player_list.draw` 的代码行之间: + +``` + enemy.move() # 上下文 + + if fire.firing: + fire.update(worldy) + firepower.draw(world) + player_list.draw(screen) # 上下文 + enemy_list.draw(screen) # 上下文 +``` + +注意,这些更新仅在 `self.firing` 变量被设置为 1 时执行。如果它被设置为 0 ,那么 `fire.firing` 就不为 `true`,接下来就跳过更新。如果你尝试做上述这些更新,不管怎样,你的游戏都会崩溃,因为在游戏中将不会更新或绘制一个 `fire` 对象。 + +启动你的游戏,尝试挑战你的武器。 + +### 检测碰撞 + +如果你玩使用了新投掷技巧的游戏,你可能会注意到,你可以投掷对象,但是它却不会对你的敌人有任何影响。 + +原因是你的敌人没有被查到碰撞事故。一名敌人可能会被你的投掷物品所击中,但是敌人却从来不知道被击中了。 + +你已经在你的 `Player` 类中完成了碰撞检测,这非常类似。在你的 `Enemy` 类中,添加一个新的 `update` 函数: + +``` + def update(self,firepower, enemy_list): + """ + 检测火力碰撞 + """ + fire_hit_list = pygame.sprite.spritecollide(self,firepower,False) + for fire in fire_hit_list: + enemy_list.remove(self) +``` + +代码很简单。每个敌人对象都检查并看看它自己是否被 `firepower` 精灵组的成员所击中。如果它被击中,那么敌人就会从敌人组中移除和消失。 + +为集成这些功能到你的游戏之中,在主循环中调用位于新触发语句块中的函数: + +``` + if fire.firing: # 上下文 + fire.update(worldy) # 上下文 + firepower.draw(screen) # 上下文 + enemy_list.update(firepower,enemy_list) # 更新敌人 +``` + +你现在可以尝试一下你的游戏了,大多数的事情都如预期般的那样工作。不过,这里仍然有一个问题,那就是投掷的方向。 + +### 更改投掷机制的方向 + +当前,你英雄的火球只会向右移动。这是因为 `Throwable` 类的 `update` 函数将像素添加到火球的位置,在 Pygame 中,在 X 轴上一个较大的数字意味着向屏幕的右侧移动。当你的英雄转向另一个方向时,你可能希望它投掷的火球也抛向左侧。 + +到目前为止,你已经知道如何实现这一点,至少在技术上是这样的。然而,最简单的解决方案却是使用一个变量,在一定程度上对你来说可能是一种新的方法。一般来说,你可以“设置一个标记”(有时也被称为“翻转一个位”)来标明你的英雄所面向的方向。在你做完后,你就可以检查这个变量来得知火球是向左移动还是向右移动。 + +首先,在你的 `Player` 类中创建一个新的变量来代表你的游戏所面向的方向。因为我的游戏天然地面向右侧,由此我把面向右侧作为默认值: + +``` + self.score = 0 + self.facing_right = True # 添加这行 + self.is_jumping = True +``` + +当这个变量是 `True` 时,你的英雄精灵是面向右侧的。当玩家每次更改英雄的方向时,变量也必须重新设置,因此,在你的主循环中相关的 `keyup` 事件中这样做: + +``` + if event.type == pygame.KEYUP: + if event.key == pygame.K_LEFT or event.key == ord('a'): + player.control(steps, 0) + player.facing_right = False # 添加这行 + if event.key == pygame.K_RIGHT or event.key == ord('d'): + player.control(-steps, 0) + player.facing_right = True # 添加这行 +``` + +最后,更改你的 `Throwable` 类的 `update` 函数,以检测英雄是否面向右侧,并恰当地添加或减去来自火球位置的像素: + +``` + if self.rect.y < worldy: + if player.facing_right: + self.rect.x += 15 + else: + self.rect.x -= 15 + self.rect.y += 5 +``` + +再次尝试你的游戏,清除掉你游戏世界中的一些坏人。 + +![Python 平台类使用投掷能力][15] + +作为一项额外的挑战,当彻底打败敌人时,尝试增加你玩家的得分。 + +### 完整的代码 + +``` +#!/usr/bin/env python3 +# 作者: Seth Kenlon + +# GPLv3 +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <[http://www.gnu.org/licenses/>][17]. + +import pygame +import pygame.freetype +import sys +import os + +''' +变量 +''' + +worldx = 960 +worldy = 720 +fps = 40 +ani = 4 +world = pygame.display.set_mode([worldx, worldy]) +forwardx = 600 +backwardx = 120 + +BLUE = (80, 80, 155) +BLACK = (23, 23, 23) +WHITE = (254, 254, 254) +ALPHA = (0, 255, 0) + +tx = 64 +ty = 64 + +font_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "fonts", "amazdoom.ttf") +font_size = tx +pygame.freetype.init() +myfont = pygame.freetype.Font(font_path, font_size) + +''' +对象 +''' + +def stats(score, health): + myfont.render_to(world, (4, 4), "Score:"+str(score), BLUE, None, size=64) + myfont.render_to(world, (4, 72), "Health:"+str(health), BLUE, None, size=64) + +class Throwable(pygame.sprite.Sprite): + """ + 生成一个投掷的对象 + """ + def __init__(self, x, y, img, throw): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load(os.path.join('images', img)) + self.image.convert_alpha() + self.image.set_colorkey(ALPHA) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + self.firing = throw + + def update(self, worldy): + ''' + 投掷物理学 + ''' + if self.rect.y < worldy: + if player.facing_right: + self.rect.x += 15 + else: + self.rect.x -= 15 + self.rect.y += 5 + else: + self.kill() + self.firing = 0 + +# x 位置, y 位置, img 宽度, img 高度, img 文件 +class Platform(pygame.sprite.Sprite): + def __init__(self, xloc, yloc, imgw, imgh, img): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load(os.path.join('images', img)).convert() + self.image.convert_alpha() + self.image.set_colorkey(ALPHA) + self.rect = self.image.get_rect() + self.rect.y = yloc + self.rect.x = xloc + +class Player(pygame.sprite.Sprite): + """ + 生成一名玩家 + """ + + def __init__(self): + pygame.sprite.Sprite.__init__(self) + self.movex = 0 + self.movey = 0 + self.frame = 0 + self.health = 10 + self.damage = 0 + self.score = 0 + self.facing_right = True + self.is_jumping = True + self.is_falling = True + self.images = [] + for i in range(1, 5): + img = pygame.image.load(os.path.join('images', 'walk' + str(i) + '.png')).convert() + img.convert_alpha() + img.set_colorkey(ALPHA) + self.images.append(img) + self.image = self.images[0] + self.rect = self.image.get_rect() + + def gravity(self): + if self.is_jumping: + self.movey += 3.2 + + def control(self, x, y): + """ + 控制玩家移动 + """ + self.movex += x + + def jump(self): + if self.is_jumping is False: + self.is_falling = False + self.is_jumping = True + + def update(self): + """ + 更新精灵位置 + """ + + # 向左移动 + if self.movex < 0: + self.is_jumping = True + self.frame += 1 + if self.frame > 3 * ani: + self.frame = 0 + self.image = pygame.transform.flip(self.images[self.frame // ani], True, False) + + # 向右移动 + if self.movex > 0: + self.is_jumping = True + self.frame += 1 + if self.frame > 3 * ani: + self.frame = 0 + self.image = self.images[self.frame // ani] + + # 碰撞 + enemy_hit_list = pygame.sprite.spritecollide(self, enemy_list, False) + if self.damage == 0: + for enemy in enemy_hit_list: + if not self.rect.contains(enemy): + self.damage = self.rect.colliderect(enemy) + if self.damage == 1: + idx = self.rect.collidelist(enemy_hit_list) + if idx == -1: + self.damage = 0 # 设置伤害回 0 + self.health -= 1 # 减去 1 单位健康度 + + ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False) + for g in ground_hit_list: + self.movey = 0 + self.rect.bottom = g.rect.top + self.is_jumping = False # 停止跳跃 + + # 掉落世界 + if self.rect.y > worldy: + self.health -=1 + print(self.health) + self.rect.x = tx + self.rect.y = ty + + plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False) + for p in plat_hit_list: + self.is_jumping = False # 停止跳跃 + self.movey = 0 + if self.rect.bottom <= p.rect.bottom: + self.rect.bottom = p.rect.top + else: + self.movey += 3.2 + + if self.is_jumping and self.is_falling is False: + self.is_falling = True + self.movey -= 33 # 跳跃多高 + + loot_hit_list = pygame.sprite.spritecollide(self, loot_list, False) + for loot in loot_hit_list: + loot_list.remove(loot) + self.score += 1 + print(self.score) + + plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False) + + self.rect.x += self.movex + self.rect.y += self.movey + +class Enemy(pygame.sprite.Sprite): + """ + 生成一名敌人 + """ + + def __init__(self, x, y, img): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.load(os.path.join('images', img)) + self.image.convert_alpha() + self.image.set_colorkey(ALPHA) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + self.counter = 0 + + def move(self): + """ + 敌人移动 + """ + distance = 80 + speed = 8 + + if self.counter >= 0 and self.counter <= distance: + self.rect.x += speed + elif self.counter >= distance and self.counter <= distance * 2: + self.rect.x -= speed + else: + self.counter = 0 + + self.counter += 1 + + def update(self, firepower, enemy_list): + """ + 检测火力碰撞 + """ + fire_hit_list = pygame.sprite.spritecollide(self, firepower, False) + for fire in fire_hit_list: + enemy_list.remove(self) + +class Level: + def ground(lvl, gloc, tx, ty): + ground_list = pygame.sprite.Group() + i = 0 + if lvl == 1: + while i < len(gloc): + ground = Platform(gloc[i], worldy - ty, tx, ty, 'tile-ground.png') + ground_list.add(ground) + i = i + 1 + + if lvl == 2: + print("Level " + str(lvl)) + + return ground_list + + def bad(lvl, eloc): + if lvl == 1: + enemy = Enemy(eloc[0], eloc[1], 'enemy.png') + enemy_list = pygame.sprite.Group() + enemy_list.add(enemy) + if lvl == 2: + print("Level " + str(lvl)) + + return enemy_list + + # x 位置, y 位置, img 宽度, img 高度, img 文件 + def platform(lvl, tx, ty): + plat_list = pygame.sprite.Group() + ploc = [] + i = 0 + if lvl == 1: + ploc.append((200, worldy - ty - 128, 3)) + ploc.append((300, worldy - ty - 256, 3)) + ploc.append((550, worldy - ty - 128, 4)) + while i < len(ploc): + j = 0 + while j <= ploc[i][2]: + plat = Platform((ploc[i][0] + (j * tx)), ploc[i][1], tx, ty, 'tile.png') + plat_list.add(plat) + j = j + 1 + print('run' + str(i) + str(ploc[i])) + i = i + 1 + + if lvl == 2: + print("Level " + str(lvl)) + + return plat_list + + def loot(lvl): + if lvl == 1: + loot_list = pygame.sprite.Group() + loot = Platform(tx*5, ty*5, tx, ty, 'loot_1.png') + loot_list.add(loot) + + if lvl == 2: + print(lvl) + + return loot_list + +''' +Setup 部分 +''' + +backdrop = pygame.image.load(os.path.join('images', 'stage.png')) +clock = pygame.time.Clock() +pygame.init() +backdropbox = world.get_rect() +main = True + +player = Player() # 生成玩家 +player.rect.x = 0 # 转到 x +player.rect.y = 30 # 转到 y +player_list = pygame.sprite.Group() +player_list.add(player) +steps = 10 +fire = Throwable(player.rect.x, player.rect.y, 'fire.png', 0) +firepower = pygame.sprite.Group() + +eloc = [] +eloc = [300, worldy-ty-80] +enemy_list = Level.bad(1, eloc) +gloc = [] + +i = 0 +while i <= (worldx / tx) + tx: + gloc.append(i * tx) + i = i + 1 + +ground_list = Level.ground(1, gloc, tx, ty) +plat_list = Level.platform(1, tx, ty) +enemy_list = Level.bad( 1, eloc ) +loot_list = Level.loot(1) + +''' +主循环 +''' + +while main: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + try: + sys.exit() + finally: + main = False + + if event.type == pygame.KEYDOWN: + if event.key == ord('q'): + pygame.quit() + try: + sys.exit() + finally: + main = False + if event.key == pygame.K_LEFT or event.key == ord('a'): + player.control(-steps, 0) + if event.key == pygame.K_RIGHT or event.key == ord('d'): + player.control(steps, 0) + if event.key == pygame.K_UP or event.key == ord('w'): + player.jump() + + if event.type == pygame.KEYUP: + if event.key == pygame.K_LEFT or event.key == ord('a'): + player.control(steps, 0) + player.facing_right = False + if event.key == pygame.K_RIGHT or event.key == ord('d'): + player.control(-steps, 0) + player.facing_right = True + if event.key == pygame.K_SPACE: + if not fire.firing: + fire = Throwable(player.rect.x, player.rect.y, 'fire.png', 1) + firepower.add(fire) + + # 向向滚动世界 + if player.rect.x >= forwardx: + scroll = player.rect.x - forwardx + player.rect.x = forwardx + for p in plat_list: + p.rect.x -= scroll + for e in enemy_list: + e.rect.x -= scroll + for l in loot_list: + l.rect.x -= scroll + + # 向后滚动世界 + if player.rect.x <= backwardx: + scroll = backwardx - player.rect.x + player.rect.x = backwardx + for p in plat_list: + p.rect.x += scroll + for e in enemy_list: + e.rect.x += scroll + for l in loot_list: + l.rect.x += scroll + + world.blit(backdrop, backdropbox) + player.update() + player.gravity() + player_list.draw(world) + if fire.firing: + fire.update(worldy) + firepower.draw(world) + enemy_list.draw(world) + enemy_list.update(firepower, enemy_list) + loot_list.draw(world) + ground_list.draw(world) + plat_list.draw(world) + for e in enemy_list: + e.move() + stats(player.score, player.health) + pygame.display.flip() + clock.tick(fps) +``` + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/add-throwing-python-game + +作者:[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/game_pawn_grid_linux.png?itok=4gERzRkg (Gaming on a grid with penguin pawns) +[2]: https://www.python.org/ +[3]: https://www.pygame.org/news +[4]: https://linux.cn/article-9071-1.html +[5]: https://linux.cn/article-10850-1.html +[6]: https://linux.cn/article-10858-1.html +[7]: https://linux.cn/article-10874-1.html +[8]: https://linux.cn/article-10883-1.html +[9]: https://linux.cn/article-10902-1.html +[10]: https://linux.cn/article-11780-1.html +[11]: https://linux.cn/article-11790-1.html +[12]: https://linux.cn/article-11819-1.html +[13]: https://linux.cn/article-11828-1.html +[14]: https://linux.cn/article-11839-1.html +[15]: https://opensource.com/sites/default/files/uploads/pygame-throw.jpg (Python platformer with throwing capability) +[16]: https://creativecommons.org/licenses/by-sa/4.0/ +[17]: http://www.gnu.org/licenses/\> diff --git a/published/202011/20200922 Easily set image transparency using GIMP.md b/published/202011/20200922 Easily set image transparency using GIMP.md new file mode 100644 index 0000000000..435c5e3b37 --- /dev/null +++ b/published/202011/20200922 Easily set image transparency using GIMP.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12874-1.html) +[#]: subject: (Easily set image transparency using GIMP) +[#]: via: (https://opensource.com/article/20/9/chroma-key-gimp) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 GIMP 轻松地设置图片透明度 +====== + +> 使用色键(绿屏)技巧来设置你电脑游戏中图片的透明度。 + +![](https://img.linux.net.cn/data/attachment/album/202011/30/223815rdmrgx1109ngng0g.jpg) + +不管你是否正在使用 [Python][2] 或 [Lua][3] 编程一个游戏或一个 APP,你都有可能在你的游戏资源中使用 PNG 图像。PNG 格式图像的一个优点是能够存储一个 **alpha 通道**,这在一个 JPEG 格式的图像中是不可能获得的。alpha 在本质上是不可见的或透明的“颜色”。alpha 是你图像 _不可见_ 的一部分。例如,你要绘制一个甜甜圈,甜甜圈的空洞将使用 alpha 填充,你就可以看到它后面的任何东西。 + +一个常见的问题是如何找到一幅图像的 alpha 部分。有时你的编程框架,不管它是 [Python Arcade][4]、[Pygame][5]、LÖVE,或者其它的任何东西都会检测出 alpha 通道,(在适当地调用函数后)将其作为透明处理。这意味着它将不会在 alpha 部分来渲染新的像素,而留下甜甜圈的空洞。100% 是透明的,0% 是不透明的,在功能上起到“不可见”的作用。 + +有些时候,你的框架与你的图像资源在 alpha 通道的位置上是不一致的(或者,alpha 通道根本就不存在),你在你想要透明度的地方却得到像素。 + +这篇文章描述了我所知道的最可靠的方法来解决透明度的问题。 + +### 色键 + +在计算机图形学中,有一些有助于确定每一个像素是如何渲染的值。色度Chrominance(或者 chroma),描述一个像素的饱和度或强度。色键chroma key技术(也称为绿屏green screening)最初是作为一种化学工艺而发展起来的,在复印一张底片时,使用一种特定的 **无光泽** 的颜色(最初是蓝色,后来是绿色)来故意遮掩,以允许使用另一幅图像来取代曾经有蓝色或绿色屏幕的地方。这是一种简化的解释,但是它说明了计算机图形学中被称为 alpha 通道的起源。 + +alpha 通道是保存在图像中的信息,用以标识要透明的像素。例如,RGB 图像有红、绿、蓝通道。RGBA 图像包含红、绿、蓝通道,以及 alpha 通道。alpha 值的范围可以从 0 到 1 ,使用小数是也有效的。 + +因为一个 alpha 通道可以用几种不同的方法表达,因此依赖于嵌入的 alpha 通道可能是有问题的。作为替代方案,你可以在你的游戏框架中选择一种颜色并将其转化为一个 0 的 alpha 值。要做到这一点,你必须知道在你图像中的颜色值。 + +### 准备你的图片 + +要准备一个专门为色度键保留明确颜色的图形,在你最喜欢的图片编辑器中打开图片。我建议使用 [GIMP][6] 或 [Glimpse][7],但是 [mtPaint][8] 或 [Pinta][9],甚至 [Inkscape][10] 也能很好地工作,这取决于你的图像的性质,以及你将这些操作指南转换到一种不同图片编辑器工具的能力。 + +首先打开这幅 Tux 企鹅的图像: + +![Tux 企鹅][11] + +### 选择图片 + +在图片打开后,转到 **窗口** 菜单,选择 **可停靠对话框** ,接下来选择 **图层**。在 **图层** 面板中 Tux 图层上右击。从弹出菜单中,选择 **Alpha 到选区** 。如果你的图像没有内置的 alpha 通道,那么你必须手动创建你自己的选区。 + +![Alpha 到选区][13] + +为手动创建一个选区,单击来自工具箱的 **路径** 工具。 + +![GIMP 的路径工具][14] + +使用 **路径** 工具,在图像周围移动鼠标,在其轮廓的每个主要交叉点处都单击和释放(不要拖动)。 不要担心沿着曲线走;只需要找到主要的交叉点和拐角。这将在每个点处创建一个节点,并在节点中间绘制一条条线段。你不需要闭合你的路径,因此当你最后到达你开始时的交叉点时,你就完成了。 + +![在 GIMP 中创建一个路径][15] + +在你创建你的轮廓路径后,转到 **窗口** 菜单,选择 **可停靠对话框** ,接下来选择 **工具选项** 。在 **工具选项** 面板中,选择 **编辑 (Ctrl)** 。随着这项操作的激活,你可以编辑你刚刚通过单击线或单击节点绘制的路径,并通过调整它们来更好地适应你的图像。你甚至能够将直线弯曲。 + +![编辑路径][16] + +现在从 **窗口 > 可停靠对话框** 菜单中选择 **路径** 面板。在 **路径** 面板中,单击 **路径到选区** 按钮。你的绘图现在已经被选中了。 + +### 扩大选区 + +如果你觉得你的选区太紧贴了,你可以通过扩大来给予你自己的选区一些富余。当我想在一张图像周围采用或加厚一个边框时,我有时会这么扩大选区。 + +为扩大一个选区,单击 **选择** 菜单,选择 **扩大** 。输入一个像素值并单击 **确定** 。 + +### 反转选区 + +你已经选择了你的图形,但是你真正想选择的东西却 _不包括_ 你所选择的图像。这是因为你要创建一个 alpha 蒙版来定义图像中的一些内容的来被其它一些内容所替换。换句话说,你需要标记那些将被转变为不可见的像素。 + +为了反转选择区,单击 **选择** 菜单,选择 **反转** 。现在除你的图像以外的一切东西都是被选择的。 + +### 使用 alpha 填充 + +随着选择了除了你的图像以外的一切东西,再选择你想使用的颜色来指定你的 alpha 蒙版。最常用的颜色是绿色(正如你可能从术语“绿屏”中所猜到的一样)。绿色不是什么神奇的颜色,甚至也不是特定的绿色色调。之所以使用它是因为人们经常处理不包含绿色色素的图像,这样人们能够很容易分离出绿色,而不会意外地分离出图像中重要的部分。当然,如果你的图像是一位绿色的外星人或一枚绿宝石或一些 _确实_ 包含绿色的东西,那么你应该使用一种不同的颜色。只要你所选择的颜色是单一的单色,那么你就可以使用你所希望的任意颜色。如果你正在处理很多图像,你的选择应该在所有图像中保持一致。 + +![在工具箱中的前景色][17] + +使用你选择的颜色值来设置你的前景色。为确保你的选择是精确的,使用 [HTML][18] 或 [HSV][19] 表示的颜色。例如,如果你正在使用纯绿色,它可以在 GIMP(以及大多数的开放源码图像应用程序)中表示为 `00ff00`(`00` 是红色,`FF` 是绿色,`00` 是蓝色,`F` 是最大值)。 + +![设置颜色值][20] + +不管你选择什么颜色,务必记录下 HTML 或 HSV 的值,以便你可以为每一张图像使用完全相同的颜色。 + +为填充你的 alpha 蒙版,单击 **编辑** 菜单,选择 **使用前景色填充** 。 + +### 平整和导出 + +如果你在你的图像周围留下边框,设置背景颜色来着色你想使用的边界笔刷。这通常是黑色或白色,但是它也可以是任何适宜你游戏审美观的颜色。 + +在你设置背景颜色后,单击 **图像** 菜单,选择 **平整图像**。不管你是否添加了边框,这样做都是安全的。这个过程将从图像中移除 alpha 通道,并使用背景色填充任何“透明的”像素。 + +![平整图像][21] + +你现在已经为你的游戏引擎准备好了一张图像。导出图像为你的游戏引擎喜欢的任何格式,接下来使用游戏引擎所需要的每一个函数来将图像导入的你的游戏中。在的代码中,设置 alpha 值为 `00ff00`(或你使用的任何颜色),接下来使用游戏引擎的图像转换器来将该颜色作为 alpha 通道处理。 + +### 其它的方法 + +这不是唯一能在你游戏图像中获取透明度的方法。查看你游戏引擎的文档来找出它是如何默认尝试处理 alpha 通道的,在你不确定的时候,尝试让你的游戏引擎来自动侦测图像中透明度,然后再去编辑它。有时,你游戏引擎的预期值和你图像的预设值恰巧匹配,那么你就可以直接获取透明度,而不需要做任何额外的工作。 + +不过,当这些尝试都失败时,尝试一下色键。它为电影业工作了将近 100 年,它也可以为你工作。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/chroma-key-gimp + +作者:[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/gaming_grid_penguin.png?itok=7Fv83mHR (Gaming with penguin pawns) +[2]: https://opensource.com/article/17/10/python-101 +[3]: https://opensource.com/article/17/4/how-program-games-raspberry-pi +[4]: https://opensource.com/article/18/4/easy-2d-game-creation-python-and-arcade +[5]: https://opensource.com/article/17/12/game-framework-python +[6]: http://gimp.org +[7]: https://glimpse-editor.github.io +[8]: https://opensource.com/article/17/2/mtpaint-pixel-art-animated-gifs +[9]: https://www.pinta-project.com/ +[10]: http://inkscape.org +[11]: https://opensource.com/sites/default/files/uploads/tux.png (Tux the penguin) +[12]: https://creativecommons.org/licenses/by-sa/4.0/ +[13]: https://opensource.com/sites/default/files/uploads/gimp_alpha-to-selection.jpg (Alpha to selection) +[14]: https://opensource.com/sites/default/files/uploads/gimp_path-tool.jpg (GIMP Paths tool) +[15]: https://opensource.com/sites/default/files/uploads/gimp_path-create.jpg (Create a path in GIMP) +[16]: https://opensource.com/sites/default/files/uploads/gimp_path-edit.jpg (Edit path) +[17]: https://opensource.com/sites/default/files/uploads/gimp_foreground-colour.jpg (Foreground color in toolbox) +[18]: https://www.w3schools.com/colors/colors_picker.asp +[19]: https://en.wikipedia.org/wiki/HSL_and_HSV +[20]: https://opensource.com/sites/default/files/uploads/gimp_colour.jpg (Setting color values) +[21]: https://opensource.com/sites/default/files/uploads/gimp_matte.jpg (Flattening image) diff --git a/published/202011/20201001 How open source underpins blockchain technology.md b/published/202011/20201001 How open source underpins blockchain technology.md new file mode 100644 index 0000000000..8205d3b2ce --- /dev/null +++ b/published/202011/20201001 How open source underpins blockchain technology.md @@ -0,0 +1,88 @@ +[#]: collector: "lujun9972" +[#]: translator: "xiao-song-123" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12776-1.html" +[#]: subject: "How open source underpins blockchain technology" +[#]: via: "https://opensource.com/article/20/10/open-source-blockchain" +[#]: author: "Matt Shealy https://opensource.com/users/mshealy" + +开源是如何支撑区块链技术发展的 +====== + +> 创造出区块链安全性和可靠性的原因:是开放,而非监管。 + +![](https://img.linux.net.cn/data/attachment/album/202011/01/155124l5c81g86mfwgjxfx.jpg) + +当人们发现以安全性而闻名的区块链技术居然是建立在开源软件代码之上时,通常会感到非常惊讶。事实上,正是这种开放性才赋予了区块链技术的安全性和可靠性。 + +以开源方式构建的任何事物,其核心价值之一就是为了提高效率。建立起一个有着不同观点和技能的开发人员社区,这些开发人员工作在同一个代码库的时候,可以成倍增加构建出来的应用程序数量以及复杂性。 + +### 开源比人们想象中的要更加普遍 + +开源的 Linux,就是一种比较流行的操作系统。Linux 为服务器提供了许多服务,这些服务让我们可以轻松地共享个人信息。其中包括 Google、Facebook 和数千个主要网站。当我们使用这些服务时,就是在和这些在网络上运行着 Linux 系统的计算机进行交互。Chromebook 也使用 Linux,Android 手机使用的操作系统也是基于 Linux 的。 + +Linux 不属于任何一家公司,人们可以免费使用并且可以共同协作来完善创造它。自 2005 年推出以来,已经有来自 1,700 多家公司的 20,000 多名开发人员 [为其中的代码做出了贡献][2] 。 + +这就是开源软件的运作方式。大量的人为此贡献,并不断添加、修改或构建开源代码库来创建新的应用程序和平台。区块链和加密货币的大部分代码都是使用开源软件开发的。开源软件是由充满热情的用户构建的,这些用户对错误、故障或缺陷时刻保持警惕。当发现问题时,开源社区中的开发人员将一起努力来解决问题。 + +### 区块链和开源 + +整个开源区块链开发者社区都在不断地添加和完善代码库。 + +以下是区块链的基本表现方式: + + * 区块链平台具有一个交易数据库,该交易数据库允许对等方在任何时候彼此进行交易。 + * 附有用户识别标签,以方便交易。 + * 平台一定有一种安全的方式来在交易批准前对交易进行验证。 + * 无法被验证的交易不会进行。 + +开源软件允许开发者在 [去中心化应用程序(Dapp)][3]中创建这些平台,这是区块链中交易的安全、保障和可变性的关键。 + +这种去中心化的方式意味着没有中央权威机构来调解交易,没有人能控制发生的事情。直接的点对点的交易可以更快速、安全的进行。由于交易被记录在分类账簿中,它们也会分发到整个生态系统中。 + +区块链使用密码学来保证安全。每一笔交易都携带着与前一笔交易相关联的信息,以验证其真实性。这可以防止威胁者篡改数据,因为一旦数据被添加到公共分类账中,其他用户就不能更改。 + +### 区块链是开源的吗? + +虽然区块链本身在技术上可以是不开源的,但区块链系统通常是使用开源软件实现的,因为没有政府机构对其进行监管,所以这些开源软件使用的概念体现了一种开放文化。私人公司开发的用于处理金融交易的专有软件很可能受到 [政府机构][4] 的监管。在美国,这可能包括美国证券交易委员会(SEC)、联邦储备委员会和联邦存款保险公司(FDIC)。区块链技术在开放环境下使用不需要政府监管,实际上,用来验证交易的是用户社区。 + +你可以称它为一种极端的众包形式,既用于开发构建区块链平台的开源软件,也用于验证交易。这就是区块链得到如此多关注的原因之一:它有可能颠覆整个行业,因为它可以作为处理和验证交易的权威中介。 + +### 比特币,以太坊和其他加密货币 + +截至 2020 年 6 月,超过 [5000 万人拥有区块链钱包][5] 。他们大多数用于金融交易,例如交易比特币、以太坊和其他加密货币。对许多人来说,像交易员观察股票价格一样,[查看加密货币价格][6] 已成为主流。 + +加密货币平台也使用开源软件。[以太坊项目][7] 开发出了任何人都可以免费使用的开源软件,社区中大量的开发者都为此贡献了代码。比特币客户端的参考实现版是由 450 多个开发人员和工程师进行开发的,他们已经贡献了超过 150,000 个贡献。 + +加密货币区块链是一个持续增长的记录。每个被称作为块的记录按顺序链接在一起,它们互相链接形成一条链。每个块都有其自己的唯一标记,这个标记称为 [哈希][8] 。一个块包含自身的哈希值和前一个块的加密计算出的哈希值。从本质上讲,每个块都链接到前一个块,形成了无法中断的长链,每个块都包含其它区块的信息,用于验证交易。 + +在金融或是加密货币的区块链中没有中央银行。这些分布在整个互联网中的区块,建立了一个性能强大的审计跟踪系统。任何人都能够通过区块链来验证交易,但却不能更改上面的记录。 + +### 牢不可破的区块链 + +尽管区块链不受任何政府或机构的监管,但分布式的网络保证了它们的安全。随着链的增长,每一笔交易都会增加伪造的难度。区块分布在世界各地的网络中,它们使用的信任标记不可被改变,这条链条几乎变得牢不可破。 + +这种去中心化的网络,其背后的代码是开源的,这也是用户在交易中不必使用诸如银行或经纪人之类的中介就可以相互信任的原因之一。支撑加密货币平台的软件是由相互独立的开发者组建的联盟创建的,并且任何人都可以免费使用。这创造了世界上最大的制衡体系之一。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/open-source-blockchain + +作者:[Matt Shealy][a] +选题:[lujun9972][b] +译者:[xiao-song-123](https://github.com/xiao-song-123) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mshealy +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cube_innovation_process_block_container.png?itok=vkPYmSRQ "cubes coming together to create a larger cube" +[2]: https://www.linuxfoundation.org/wp-content/uploads/2020/08/2020_kernel_history_report_082720.pdf +[3]: https://www.freecodecamp.org/news/what-is-a-dapp-a-guide-to-ethereum-dapps/ +[4]: https://www.investopedia.com/ask/answers/063015/what-are-some-major-regulatory-agencies-responsible-overseeing-financial-institutions-us.asp +[5]: https://www.statista.com/statistics/647374/worldwide-blockchain-wallet-users/ +[6]: https://www.okex.com/markets +[7]: https://ethereum.org/en/ +[8]: https://opensource.com/article/18/7/bitcoin-blockchain-and-open-source diff --git a/published/202011/20201002 How to Free Up Space in -boot Partition on Ubuntu Linux.md b/published/202011/20201002 How to Free Up Space in -boot Partition on Ubuntu Linux.md new file mode 100644 index 0000000000..c73bd3a14d --- /dev/null +++ b/published/202011/20201002 How to Free Up Space in -boot Partition on Ubuntu Linux.md @@ -0,0 +1,173 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12779-1.html) +[#]: subject: (How to Free Up Space in /boot Partition on Ubuntu Linux?) +[#]: via: (https://itsfoss.com/free-boot-partition-ubuntu/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +如何在 Ubuntu Linux 上释放 /boot 分区的空间? +====== + +前几天,我收到一个警告,`/boot` 分区已经几乎满了,没有剩余空间了。是的,我有一个独立的 `/boot` 分区,我相信现在很少有人这样做了。(LCTT 译注:个人认为保留单独的 /boot 分区是个好的运维经验,除此以外,/tmp、/var 也单独划定分区比较好。) + +这是我第一次看到这样一个错误,它让我很迷惑。现在,这里有一些 [方法来释放在 Ubuntu (或基于 Ubuntu 的分区)上的分区][1] ,但是在这种情况下并不是所有的方法都能用。 + +这就是为什么我决定写这些我释放 `/boot` 分区空间的步骤的原因。 + +### 如何在 Ubuntu 上释放 /boot 分区的空间 + +![][2] + +我建议你仔细阅读这些解决方案,并由此得出最适合你情况的解决方案。解决方案的操作很容易,但是你需要在你的生产力系统上小心的执行这些解决方案。 + +#### 方法 1: 使用 apt autoremove + +你不必是一名终端专家来做这件事,它只需要一个命令,你将移除未使用的内核来释放 `/boot` 分区中是空间。 + +你所有要做的事情是,输入: + +``` +sudo apt autoremove +``` + +这个命令不仅仅可以移除未使用的内核,而且也将移除你不需要的或工具安装后所不需要的依赖项。 + +在你输入命令后,它将列出将被移除的东西,你只需要确认操作即可。如果你很好奇它将移除什么,你可以仔细检查一下看看它实际移除了什么。 + +这里是它应该看起来的样子: + +![][3] + +你必须按 `Y` 按键来继续。 + +**值得注意的是,这种方法只在你还剩余一点点空间,并且得到警告的情况下才有效。但是,如果你的 `/boot` 分区已经满了,APT 甚至可能不会工作。** + +在接下来的方法中,我将重点介绍两种不同的方法,通过这些方法你可以使用 GUI 和终端来移除旧内核来释放空间。 + +#### 方法 2: 手动移除未使用的内核 + +在你尝试 [移除一些旧内核][4] 来释放空间前,你需要识别当前活动的内核,并且确保你不会删除它。 + +为 [检查你的内核的版本][5] ,在终端中输入下面的命令: + +``` +uname -r +``` + +[uname 命令通常用于获取 Linux 系统信息][6]。在这里,这个命令显示当前正在被使用的 Linux 内核。它看起来应该是这样: + +![][7] + +现在,你已经知道你当前的 Linux 内核是什么,你必须移除一个不同于这个版本的内核。你应该把它记录在某些地方,以便你不会不知不觉地移除它。 + +接下来,要移除它,你可以使用终端或 GUI。 + +> 警告! +> +> 在删除内核时一定要额外的小心。只识别和删除旧内核,而不是当前你正在使用的内核,否则你将会拥有一个残缺的系统。 + +##### 使用一个 GUI 工具来移除旧的 Linux 内核 + +你可以使用 [Synaptic 软件包管理器][8] 或一个类似 [Stacer][9] 的工具来开始。就我个人而言,当我遇到一个满满的 `/boot` 分区且 APT 损坏时,我使用 [Stacer][6] 来丢弃旧内核。因此,让我向你展示一下它看起的样子。 + +首先,你需要启动 Stacer ,然后导航到软件包卸载器,如下面屏幕截图所示。 + +![][10] + +在这里,搜索 “image” ,你将找到你所拥有的 Linux 内核。你只需要删除旧内核版本的镜像,而不是当前内核的镜像。 + +在上面的屏幕截图中,我已经指出了我系统上的当前内核和旧内核,因此你必须注意你系统上的内核。 + +你没有必要删除任何其它东西,只需要删除旧的内核版本。 + +同样的,只需要在软件包列表中搜索 “headers” ,并删除如下显示的旧的 “headers” 版本。 + +![][11] + +作为提醒,你 **不会希望移除 `linux-headers-generic`** 。只关注一下那些与其相关的有版本号的就行。 + +然后,就这样,你完成了所有的工作,APT 将会再次工作,并且你将成功地释放来自 `/boot` 分区的一些空间。同样地,你也可以使用任意其它的软件包管理器来完成这些工作。 + +#### 使用命令行来移除旧内核 + +使用命令行来移除旧内核与使用 GUI 来移除旧内核是一样的。因此,如果你没有选择使用 GUI 软件(如果它是一台远程机器/一项远程服务)的权利,或者如果你只是对终端情有独钟,你可以仿效下面的步骤。 + +首先,使用下面的命令列出所有已安装的内核: + +``` +ls -l /boot +``` + +它应该看起来像这样: + +![][12] + +标记为 “old” 的内核,或者不匹配你当前内核版本,都是未使用的内核,你可以删除它们。 + +现在,你可以使用 `rm` 命令来移除具体指定来自 `/boot` 分区中的内核,使用下面的命令(一个命令对应一个内核): + +``` +sudo rm /boot/vmlinuz-5.4.0-7634-generic +``` + +务必检查系统的版本 — 这里可能与你的系统的版本不同。 + +如果你有很多未使用的内核,这将需要一些时间。因此,你也可以下面的命令丢弃多个内核: + +``` +sudo rm /boot/*-5.4.0-{7634}-* +``` + +为了清晰起见,你需要用逗号分隔内核版本号的最后一部分/编码,以便同时删除它们。 + +假设,我有两个旧的内核 5.4.0-7634-generic 和 5.4.0-7624 ,那么命令将是: + +``` +sudo rm /boot/*-5.4.0-{7634,7624}-* +``` + +如果你不希望在 grub 启动菜单中再看到这些旧的内核版本,你可以使用下面的命令简单地 [更新 grub][13]: + +``` +sudo update-grub +``` + +就这样,你完成了所有的工作。你已经释放了空间,还修复了可能潜在的破损的 APT 问题,如果它是一个在你的 `/boot` 分区填满后出现的重要的问题的话。 + +在一些情况下,你需要输入这些命令来修复破损的(正如我在论坛中注意到的): + +``` +sudo dpkg --configure -a +sudo apt install -f +``` + +注意,除非你发现 APT 已破损,否则你不需要输入上面的命令。就我个人而言,我不需要这些命令,但是我发现这些命令对论坛上的一些人很有用。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/free-boot-partition-ubuntu/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/free-up-space-ubuntu-linux/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/free-boot-space-ubuntu-linux.jpg?resize=800%2C450&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/apt-autoremove-screenshot.jpg?resize=800%2C415&ssl=1 +[4]: https://itsfoss.com/remove-old-kernels-ubuntu/ +[5]: https://itsfoss.com/find-which-kernel-version-is-running-in-ubuntu/ +[6]: https://linuxhandbook.com/uname/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/uname-r-screenshot.jpg?resize=800%2C198&ssl=1 +[8]: https://itsfoss.com/synaptic-package-manager/ +[9]: https://itsfoss.com/optimize-ubuntu-stacer/ +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/stacer-remove-kernel.jpg?resize=800%2C562&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/stacer-remove-kernel-header.png?resize=800%2C576&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/command-kernel-list.png?resize=800%2C432&ssl=1 +[13]: https://itsfoss.com/update-grub/ diff --git a/published/202011/20201006 Start using virtual tables in Apache Cassandra 4.0.md b/published/202011/20201006 Start using virtual tables in Apache Cassandra 4.0.md new file mode 100644 index 0000000000..ba78aa772f --- /dev/null +++ b/published/202011/20201006 Start using virtual tables in Apache Cassandra 4.0.md @@ -0,0 +1,61 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12791-1.html) +[#]: subject: (Start using virtual tables in Apache Cassandra 4.0) +[#]: via: (https://opensource.com/article/20/10/virtual-tables-apache-cassandra) +[#]: author: (Ben Bromhead https://opensource.com/users/ben-bromhead) + +如何在 Apache Cassandra 4.0 中使用虚拟表 +====== + +> 虚拟表是什么以及如何使用。 + +![](https://img.linux.net.cn/data/attachment/album/202011/04/234511kpmv6dzac6fjmr65.jpg) + +在最近的发布的 [Apache Cassandra 4.0 测试版][3]中的[众多新增功能][2]中,虚拟表virtual table是一个值得关注的功能。 + +在以前的 Cassandra 版本中,用户需要访问 Java 管理扩展Java Management Extensions([JMX][4]) 来查看 Cassandra 的细节,如运行中的压实compaction、客户端、度量和各种配置设置。虚拟表消除了这些挑战。Cassandra 4.0 测试版让用户能够从一个只读的系统表中以 Cassandra 查询语言Cassandra Query Language(CQL)行的形式查询这些细节和数据。 + +以下是之前 Cassandra 版本中基于 JMX 的机制是如何工作的。想象一下,一个用户想要检查集群中某个节点的压实状态。用户首先要建立一个 JMX 连接,在节点上运行 `nodetool compactionstats`。这个要求马上就给用户带来了一些复杂的问题。用户的客户端是否配置了 JMX 访问?Cassandra 节点和防火墙是否配置为允许 JMX 访问?是否准备好了适当的安全和审计措施,并落实到位?这些只是用户在处理 Cassandra 以前版本时必须面对的其中一些问题。 + +在 Cassandra 4.0 中,虚拟表使得用户可以利用之前配置的驱动来查询所需信息。这一变化消除了与实现和维护 JMX 访问相关的所有开销。 + +Cassandra 4.0 创建了两个新的键空间keyspace来帮助用户利用虚拟表:`system_views` 和 `system_virtual_schema`。`system_views` 键空间包含了用户查询的所有有价值的信息,有用地存储在一些表中。`system_virtual_schema` 键空间,顾名思义,存储了这些虚拟表的所有必要的模式信息。 + +![system_views and system_virtual_schema keyspaces and tables][5] + +重要的是要明白,每个虚拟表的范围仅限于其节点。任何虚拟表查询都将返回的数据,只对其协调器的节点有效,而不管一致性如何。为了简化这一要求,已经在几个驱动中添加了支持,以便在这些查询中指定协调器节点 (Python、DataStax Java 和其他驱动现在提供了这种支持)。 + +为了说明这一点,请查看这个 `sstable_tasks` 虚拟表。这个虚拟表显示了对 [SSTables][7] 的所有操作,包括压实、清理、升级等。 + +![Querying the sstable_tasks virtual table][8] + +如果用户在以前的 Cassandra 版本中运行 `nodetool compactionstats`,则会显示相同类型的信息。 在这里,这个查询发现该节点当前有一个活动的压缩。它还显示了它的进度以及它的键空间和表。得益于虚拟表,用户可以快速收集这些信息,并同样有效地获得正确诊断集群健康状况所需的能力。 + +需要说明的是,Cassandra 4.0 并没有去除对 JMX 访问的需求。JMX 仍然是查询某些指标的唯一选择。尽管如此,用户会欢迎简单地使用 CQL 来获取关键集群指标的能力。由于虚拟表提供的便利,用户可能会将之前投入到 JMX 工具的时间和资源重新投入到 Cassandra 本身。客户端工具也应该开始利用虚拟表提供的优势。 + +如果你对 Cassandra 4.0 测试版及其虚拟表功能感兴趣,请[试试试它][3]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/virtual-tables-apache-cassandra + +作者:[Ben Bromhead][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/ben-bromhead +[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://www.instaclustr.com/apache-cassandra-4-0-beta-released/ +[3]: https://cassandra.apache.org/download/ +[4]: https://en.wikipedia.org/wiki/Java_Management_Extensions +[5]: https://opensource.com/sites/default/files/uploads/cassandra_virtual-tables.png (system_views and system_virtual_schema keyspaces and tables) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://cassandra.apache.org/doc/latest/architecture/storage_engine.html#sstables +[8]: https://opensource.com/sites/default/files/uploads/cassandra_virtual-tables_sstable_tasks.png (Querying the sstable_tasks virtual table) diff --git a/published/202011/20201007 How to Clear Apt Cache and Reclaim Precious Disk Space.md b/published/202011/20201007 How to Clear Apt Cache and Reclaim Precious Disk Space.md new file mode 100644 index 0000000000..de0b5a3659 --- /dev/null +++ b/published/202011/20201007 How to Clear Apt Cache and Reclaim Precious Disk Space.md @@ -0,0 +1,123 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12787-1.html) +[#]: subject: (How to Clear Apt Cache and Reclaim Precious Disk Space) +[#]: via: (https://itsfoss.com/clear-apt-cache/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何清除 APT 缓存来回收宝贵的磁盘空间 +====== + +![][13] + +如何清除 APT 缓存?你只需使用这个 [apt-get 命令][1]选项: + +``` +sudo apt-get clean +``` + +但是,清理 APT 缓存不仅仅是运行上面的命令。 + +在本教程中,我将解释什么是 APT 缓存、为什么会使用它、为什么你要清理它,以及关于清理 APT 缓存你应该知道的其他事情。 + +我将在这里使用 Ubuntu 作为参考,但由于这是关于 APT 的,因此它也适用于 [Debian][2] 和其他基于 Debian 和 Ubuntu 的发行版,比如 Linux Mint、Deepin 等等。 + +### 什么是 APT 缓存?为什么要使用它? + +当你使用 `apt-get` 或 [apt 命令][3]安装一个软件包时(或在软件中心安装 DEB 包),APT [包管理器][4]会以 .deb 格式下载软件包及其依赖关系,并将其保存在 `/var/cache/apt/archives` 文件夹中。 + +![][5] + +下载时,`apt` 将 deb 包保存在 `/var/cache/apt/archives/partial` 目录下。当 deb 包完全下载完毕后,它会被移到 `/var/cache/apt/archives` 目录下。 + +下载完包的 deb 文件及其依赖关系后,你的系统就会[从这些 deb 文件中安装包][6]。 + +现在你明白缓存的用途了吧?系统在安装软件包之前,需要一个地方把软件包文件存放在某个地方。如果你了解 [Linux 目录结构][7],你就会明白,`/var/cache` 是合适的地方。 + +#### 为什么安装包后要保留缓存? + +下载的 deb 文件在安装完成后并不会立即从目录中删除。如果你删除了一个软件包,然后重新安装,你的系统会在缓存中查找这个软件包,并从这里获取它,而不是重新下载(只要缓存中的软件包版本与远程仓库中的版本相同)。 + +这样就快多了。你可以自己尝试一下,看看一个程序第一次安装,删除后再安装需要多长时间。你可以[使用 time 命令来了解完成一个命令需要多长时间][8]:`time sudo apt install package_name`。 + +我找不到任何关于缓存保留策略的内容,所以我无法说明 Ubuntu 会在缓存中保留下载的包多长时间。 + +#### 你应该清理 APT 缓存吗? + +这取决于你。如果你的根目录下的磁盘空间用完了,你可以清理 APT 缓存来回收磁盘空间。这是 [Ubuntu 上释放磁盘空间的几种方法][9]之一。 + +使用 [du 命令][10]检查缓存占用了多少空间: + +![][11] + +有的时候,这可能会占用几百兆,如果你正在运行一个服务器,这些空间可能是至关重要的。 + +#### 如何清理 APT 缓存? + +如果你想清除 APT 缓存,有一个专门的命令来做。所以不要去手动删除缓存目录。只要使用这个命令就可以了: + +``` +sudo apt-get clean +``` + +这将删除 `/var/cache/apt/archives` 目录的内容(除了锁文件)。以下是 `apt-get clean` 命令模拟删除内容: + +![][12] + +还有一个命令是关于清理 APT 缓存的: + +``` +sudo apt-get autoclean +``` + +与 `clean` 不同的是,`autoclean` 只删除那些无法从仓库中下载的包。 + +假设你安装了包 xyz。它的 deb 文件仍然保留在缓存中。如果现在仓库中有新的 xyz 包,那么缓存中现有的这个 xyz 包就已经过时了,没有用了。`autoclean` 选项会删除这种不能再下载的无用包。 + +#### 删除 apt 缓存安全吗? + +是的,清除 APT 创建的缓存是完全安全的。它不会对系统的性能产生负面影响。也许如果你重新安装软件包,下载时间会更长一些,但也仅此而已。 + +再说一次,使用 `apt-get clean` 命令。它比手动删除缓存目录更快、更简单。 + +你也可以使用像 [Stacer][14] 或 [Bleachbit][15] 这样的图形工具来实现这个目的。 + +#### 总结 + +在写这篇文章的时候,新的 `apt` 命令没有这样的内置选项。不过,为了保持向后的兼容性,仍然可以运行 `apt clean` (内部应该是运行了 `apt-get clean`)。请参考这篇文章来[了解 apt 和 apt-get 的区别][16]。 + +我希望你觉得这个关于 APT 缓存的解释很有趣。虽然这不是什么必要的东西,但了解这些小东西会让你对你的 Linux 系统更加了解。 + +欢迎你在评论区提出反馈和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/clear-apt-cache/ + +作者:[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/apt-get-linux-guide/ +[2]: https://www.debian.org/ +[3]: https://itsfoss.com/apt-command-guide/ +[4]: https://itsfoss.com/package-manager/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-get-clean-cache.png?resize=800%2C470&ssl=1 +[6]: https://itsfoss.com/install-deb-files-ubuntu/ +[7]: https://linuxhandbook.com/linux-directory-structure/ +[8]: https://linuxhandbook.com/time-command/ +[9]: https://itsfoss.com/free-up-space-ubuntu-linux/ +[10]: https://linuxhandbook.com/find-directory-size-du-command/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-archive-size.png?resize=800%2C233&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-get-clean-ubuntu.png?resize=800%2C339&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/Clear-Apt-Cache.png?resize=800%2C450&ssl=1 +[14]: https://itsfoss.com/optimize-ubuntu-stacer/ +[15]: https://itsfoss.com/use-bleachbit-ubuntu/ +[16]: https://itsfoss.com/apt-vs-apt-get-difference/ diff --git a/published/202011/20201014 LibreOffice Wants Apache to Drop the Ailing OpenOffice and Support LibreOffice Instead.md b/published/202011/20201014 LibreOffice Wants Apache to Drop the Ailing OpenOffice and Support LibreOffice Instead.md new file mode 100644 index 0000000000..216a944683 --- /dev/null +++ b/published/202011/20201014 LibreOffice Wants Apache to Drop the Ailing OpenOffice and Support LibreOffice Instead.md @@ -0,0 +1,81 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12775-1.html) +[#]: subject: (LibreOffice Wants Apache to Drop the Ailing OpenOffice and Support LibreOffice Instead) +[#]: via: (https://itsfoss.com/libreoffice-letter-openoffice/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +文档基金会希望 Apache 放弃陷入困境的 OpenOffice,转而支持 LibreOffice +====== + +对于 Linux 用户来说,当我们想到[微软 Office 的开源替代品][1]时,Apache OpenOffice 仍然是一个相关的推荐,这是不言而喻的。然而,在过去的几年里,OpenOffice 的发展几乎是停滞的。 + +当然,考虑到 Abhishek 早在 2016 年就写过 [Apache OpenOffice 关闭的可能性][2],这并不令人震惊。 + +现在,在一封[文档基金会的公开信][3]中,他们呼吁 Apache OpenOffice 推荐用户开始使用更好的替代品,比如 LibreOffice。在本文中,我将提到文档基金会的博文中的一些重点,以及它对 Apache OpenOffice 的意义。 + +![][4] + +### Apache OpenOffice 是历史,LibreOffice 是未来? + +尽管我当年没有使用过 OpenOffice,但可以肯定地说,它绝对不是微软 Office 的现代开源替代品。至少现在不是了。 + +是的,Apache OpenOffice 对于传统用户来说仍然是很重要的东西,在几年前是一个很好的替代品。 + +以下是 OpenOffice 和 LibreOffice 的主要发布时间线: + +![][5] + +现在 OpenOffice 已经没有重大的开发了,Apache OpenOffice 的未来是什么?一个相当活跃的项目,这个最大的开源基金会会不发布重大版本? + +这听起来并不乐观,而这正是文档基金会在他们的公开信中所强调的: + +> OpenOffice(.org),是 LibreOffice 的”父项目“,它是一个伟大的办公套件,它改变了世界。它有着引人入胜的历史,但**自从 2014 年以来,Apache OpenOffice (它现在的家)还没有一个重大的版本**。没错,六年多来,没有重大的新功能或重大更新到来,也很少发布次要版本,而且在及时的安全更新方面也存在问题。 + +对于一个普通用户来说,如果他们不知道 [LibreOffice][6],我肯定希望他们知道。但是,Apache 基金会是否应该建议 OpenOffice 用户尝试使用 LibreOffice 来体验更好或更高级的办公套件呢? + +我不知道,也许是,或者不是? + +> ...很多用户不知道 LibreOffice 的存在。OpenOffice 的品牌仍然如此强大,尽管该软件已经有六年多没有重大的版本发布,而且几乎没有人开发或支持它。 + +正如在公开信中提到的,文档基金会强调了 LibreOffice 相对于 OpenOffice的 优势/改进,并呼吁 Apache OpenOffice 开始推荐他们的用户尝试更好的东西(即 LibreOffice): + +> 我们呼吁 Apache OpenOffice 做正确的事情。我们的目标应该是**把强大的、最新的、维护良好的生产力工具送到尽可能多的人手中**。让我们一起努力吧! + +### Apache OpenOffice 应该做什么? + +如果 OpenOffice 能完成工作,用户可能不需要努力寻找替代品。那么,因为他们的缓慢开发而呼唤另一个项目,建议用户采用未来工具并推荐它是一个好主意么? + +在争论中,有人可能会说,如果你已经完成了你的目标,并且对改进 OpenOffice 没有兴趣,那么推广你的竞争对手才是公平的。而且,这并没有错,开源社区应该一直合作,以确保新用户得到最好的选择。 + +从另一个侧面来看,我们可以说,文档基金会对于 OpenOffice 到了 2020 年即使没有任何重大改进却仍然有重要意义感到沮丧。 + +我不会去评判,但当我看了这封公开信时,这些矛盾的想法就浮现在我的脑海里。 + +### 你认为是时候把 OpenOffice 搁置起来,依靠 LibreOffice 了吗? + +即使 LibreOffice 似乎是一个更优越的选择,并且绝对值得关注,你认为应该怎么做?Apache 是否应该停止 OpenOffice,并将用户重定向到 LibreOffice? + +欢迎你的意见。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/libreoffice-letter-openoffice/ + +作者:[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://itsfoss.com/best-free-open-source-alternatives-microsoft-office/ +[2]: https://itsfoss.com/openoffice-shutdown/ +[3]: https://blog.documentfoundation.org/blog/2020/10/12/open-letter-to-apache-openoffice/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/libre-office-open-office.png?resize=800%2C450&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/libre-office-open-office-derivatives.jpg?resize=1536%2C319&ssl=1 +[6]: https://itsfoss.com/libreoffice-tips/ diff --git a/published/202011/20201021 5 open source tools I can-t live without.md b/published/202011/20201021 5 open source tools I can-t live without.md new file mode 100644 index 0000000000..d60f272f59 --- /dev/null +++ b/published/202011/20201021 5 open source tools I can-t live without.md @@ -0,0 +1,101 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12804-1.html) +[#]: subject: (5 open source tools I can't live without) +[#]: via: (https://opensource.com/article/20/10/open-source-tools) +[#]: author: (Victoria Martinez de la Cruz https://opensource.com/users/vkmc) + +5 个我不可或缺的开源工具 +====== + +> 通过将这些工具放在自己的技能包中,提高你在终端内、外的工作效率。 + +![](https://img.linux.net.cn/data/attachment/album/202011/08/185810ffjljj7o830fboz3.jpg) + +前段时间,我参与了一个在科技人士中广为流传的 Twitter 话题。“挑战?只挑选五个你不能没有的工具。”我开始结合我的日常生活来思考这个问题,只挑出五个工具并不容易。我使用了许多我认为必不可少的工具,比如用来与同事和朋友联系的 [IRC][2] 客户端(是的,我仍然使用 IRC),一个用来做各种事情的出色的文本编辑器,一个用来保持有条不紊的日历应用,以及当需要更直接的互动时的一个视频会议平台。 + +所以,让我给这个挑战来个变化:选出五个能提高你工作效率的开源工具。这是我的清单。请在评论中分享你的清单。 + +### tmate + +![tmate screenshot][3] + +哦,我喜欢这个工具。`tmate` 是著名的 [tmux][5] 终端多路复用器的一个复刻,它允许你启动一个 `tmux` 会话并通过 SSH 共享。你可以用它来进行[结对编程][6](这是我的主要使用场景),也可以用来进行远程控制。 + +如果你经常与你的团队成员合作,并且你想要一个简单的、与发行版无关的、开源的方式与他们一起编程(而且共享终端访问对你来说已经足够了),这绝对是你必须加到列表中的东西。 + +在 [tmate 的网站][7]上获取更多信息,或者在 [GitHub][8] 上查看代码。 + +### ix + +`ix` 是一个命令行粘贴板。你不需要安装任何东西。你可以通过 `curl` 到 [ix.io][9] 站点来创建新的粘贴。例如,`echo Hello world. | curl -F 'f:1=<-' ix.io` 会给你一个到 ix.io 的链接,那里粘贴了消息 “Hello world” 的信息。当你想分享日志用于调试或在没有桌面环境的服务器上保存配置文件时,这非常方便。 + +有一个缺点是源码还没有公布,尽管它的目的是自由开源。如果你是作者,并且正在阅读这篇文章,请发布代码,这样我们就可以为打磨它的过程做出贡献。 + +### asciinema + +是的,这是另一个终端工具,`asciinema` 可以让你记录你的终端。使用它的方法有很多,但我一般用它来制作演示。它非常容易使用,而且有很多 Linux 发行版和其他平台的软件包。 + +要想知道它是如何工作的,可以看看这个[酷炫的演示][10]。是不是很棒? + +在 [asciinema 的网站][11]上获取更多信息,在 [GitHub][12] 上访问其源代码。 + +### GNOME Pomodoro + +![pomodoro timer gnome][13] + +好了,关于终端工具的介绍就到此为止。现在我想和大家分享一下这个简单的宝物,它让你的工作变得有条不紊。你听说过 [番茄工作法][14] 吗?Pomodoro 基本上是一个时间管理工具。它使用一个番茄形状的计时器,帮助你将时间分成工作时间和休息时间(默认情况下,25 分钟的工作后有 5 分钟的休息时间)。而且,每隔 4 个“番茄”之后,你就会有更长的休息时间(默认为 15 分钟)。这样做的目的是让你在工作时间内保持专注,而在休息时间内进行伸展和放松。 + +这听起来非常非常简单,你可能会对让一个番茄形状的时钟来控制你的生活感到犹豫,但它确实帮助我变得跟有条理,并且在试图同时专注于许多事情时避免感到疲惫。 + +无论你是什么角色,我都强烈推荐这种做法。而在众多实现它的不同工具中,我推荐 GNOME Pomodoro 应用。它适用于主要的 GNU/Linux 发行版,所以它需要你使用 GNOME 桌面环境(这可能是它的缺点)。 + +在 [GNOME Pomodoro 的网站][15]上查看更多信息,并访问其 [GitHub][16] 仓库来获取源码并了解如何做出贡献。 + +### Jitsi + +最后但同样重要的是 Jitsi。当你在一个远程、遍布全球的团队中工作时,你需要一种与人们联系的方式。即时通讯是好的,但有时最好还是开个快速会议,面对面地讨论事情(嗯,看到对方的脸)。有很多[视频会议工具][17]可用,但我很喜欢 Jitsi。不仅因为它是免费和开源的,还因为它提供了一个简洁、实用的界面。你可以设置自己的 Jitsi 服务器(用于商业目的),但你也可以通过访问 [Jitsi Meet][18] 网站来试用一个公共的 Jitsi 实例。 + +设置这种会议的一个好做法是:只有在你心中有明确的议程时才使用它。而且要时刻问自己,这个会议能不能用电子邮件代替?遵循这些准则,谨慎使用 Jitsi,你的工作日将会非常高效! + +在 [Jitsi 网站][19]上了解更多信息,并通过访问其 [GitHub][20] 仓库开始贡献。 + +* * * + +我希望我的清单能帮助你在生产力上达到一个新的水平。你的 5 个不能离开的开源生产力工具是什么?在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/open-source-tools + +作者:[Victoria Martinez de la Cruz][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/vkmc +[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://en.wikipedia.org/wiki/Internet_Relay_Chat +[3]: https://opensource.com/sites/default/files/pictures/tmate-opensource.jpg (tmate screenshot) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/article/20/7/tmux-cheat-sheet +[6]: https://en.wikipedia.org/wiki/Pair_programming +[7]: https://tmate.io/ +[8]: https://github.com/tmate-io/tmate +[9]: http://ix.io/ +[10]: https://asciinema.org/a/239367 +[11]: https://asciinema.org/ +[12]: https://github.com/asciinema/asciinema +[13]: https://opensource.com/sites/default/files/pictures/pomodoro_timer_gnome.jpg (pomodoro timer gnome) +[14]: https://en.wikipedia.org/wiki/Pomodoro_Technique +[15]: https://gnomepomodoro.org/ +[16]: https://github.com/codito/gnome-pomodoro +[17]: https://opensource.com/article/20/5/open-source-video-conferencing +[18]: https://meet.jit.si/ +[19]: https://jitsi.org/ +[20]: https://github.com/jitsi diff --git a/published/202011/20201022 5 steps to learn any programming language.md b/published/202011/20201022 5 steps to learn any programming language.md new file mode 100644 index 0000000000..e4fae4c258 --- /dev/null +++ b/published/202011/20201022 5 steps to learn any programming language.md @@ -0,0 +1,184 @@ +[#]: collector: "lujun9972" +[#]: translator: "xiao-song-123" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12842-1.html" +[#]: subject: "5 steps to learn any programming language" +[#]: via: "https://opensource.com/article/20/10/learn-any-programming-language" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" + +五步学会任何编程语言 +====== + +> 只需一点编程经验,你就可以在短短几天内(有时更少)学会一种新编程语言。 + +![](https://img.linux.net.cn/data/attachment/album/202011/19/225851j7miw3kd17joowa7.jpg) + +有些人喜欢学习新的编程语言,也有一些人觉得学习一种都是可望不可及的事情。在本文中,我将向你展示如何像程序员一样思考,这样你就可以自信地学习任何一门你想要学习的编程语言。 + +事实上,一旦你学会了如何编程,你使用的编程语言就不再是一个障碍,而更像是一种形式。实际上,这就是教育家们倡导 [让孩子尽早学习编程][2] 的众多原因之一。不管他们的入门语言有多简单,这种编程的逻辑和儿童们(或成人学习者)以后可能遇到的其他语言的逻辑有着想通之处。 + +只需有一点编程经验(你可以从我们这里的几篇介绍性文章中获得),你就可以在短短几天内(有时更短)学习任何编程语言。这并不是魔法,你也确实要为此付出一些努力。诚然,学习一种编程语言每个的可用库,或者学习打包代码以及进行交付的细微差别,需要的时间远远不止几天。但是,就入门来说,比你想像中的要容易许多,剩下的则要通过不断练习来完成。 + +当有经验的程序员静下心来学习一门新的编程语言时,他们会寻找五样东西。只要你知道了这五件事,你就可以开始编码了。 + +### 1、语法 + +![Syntax][3] + +语言的语法描述了代码的结构。这包括如何逐行编写代码,以及用于构造代码语句的实际单词。 + +例如,[Python][5] 以使用缩进来指示一个代码块在哪里结束以及另一代码块在哪里开始而闻名: + +``` +while j < rows: + while k < columns: + tile = Tile(k * w) + board.add(tile) + k += 1 + j += 1 + k = 0 +``` + +[Lua][6] 只是使用关键字 `end`: + +``` +for i,obj in ipairs(hit) do + if obj.moving == 1 then + obj.x,obj.y = v.mouse.getPosition() + end +end +``` + +[Java][7]、[C][8]、C++ 之类的编程语言使用花括号: + +``` +while (std::getline(e,r)) { + wc++; + } +``` + +编程语言的语法还包括包括库、设置变量和终止行等内容。通过练习,你将学会在阅读示例代码时下意识地识别语法需求(和惯例)。 + +#### 实践 + +当学习一门新的编程语言时,要努力理解它的语法。你不需要去记住它,只需要知道如果忘记了以后去哪里查找。使用好的 [IDE][9] 也很有帮助,因为很多 IDE 在出现语法错误时会提醒你。 + +### 2、内置函数和条件 + +![built-in words][10] + +就像自然语言一样,编程语言可以识别的合法单词是有限的。这个词汇表可以使用其他库进行扩展,但是核心语言知道一组特定的关键字。大多数语言并没有你想的那么多关键字。即使在像 C 语言这样非常低级的语言中,也只有 32 个关键字,比如 `for`、`do`、`while`、`int`、`float`、`char`、`break` 等等。 + +了解了这些关键字,你就可以编写基本的表达式,也就是构建程序的代码块。许多内置的关键字能帮助你构建条件语句,这些条件语句影响整个程序的流程。例如,如果你想编写一个允许单击和拖动图标的程序,那么你的代码就必须检测用户的鼠标指针何时位于图标上。只有当鼠标光标位于图标外部边缘相同的坐标时,才执行导致使鼠标抓取图标的代码。这是一个经典的 `if` / `then` 语句,但不同的语言可以用不同的方式表达。 + +Python 使用 `if`、`elif `和 `else` 的组合来实现条件语句,但是并不显式的关闭语句: + +``` +if var == 1: +    # action +elif var == 2: +    # some action +else: +    # some other action +``` + +[Bash][11] 使用 `if`、`elif`、`else`,并且使用 `fi` 来结束语句: + +``` +if [ "$var" = "foo" ]; then +   # action +elif [ "$var" = "bar" ]; then +   # some action +else +   # some other action +fi +``` + +然而 C 和 Java, 使用 `if`、`else` 和 `else if`,用花括号把它们括起来: + +``` +if (boolean) { +   // action +} else if (boolean) { +   // some action +} else { +   // some other action +} +``` + +各种编程语言虽然在关键字的选择和语法上有细微的变化,但基本是相同的。学习如何在编程语言中定义条件语句,包括 `if` / `then`、`do...while` 和 `case` 语句。 + +#### 实践 + +要熟悉编程语言能够理解的关键字集。在实践中,你的代码将不仅仅包含编程语言的关键字,可以肯定的是,有包含很多简单函数的库来帮助你做一些事情,诸如将输出打印到屏幕或显示窗口之类。然而,驱动这些库的逻辑始于编程语言的内置关键字。 + +### 3、数据类型 + +![Data types][12] + +代码是用来处理数据的,因此你必须学习编程语言如何识别不同类型的数据。所有编程语言都能理解整数,大多数的语言能理解小数和单个字符(`a`、`b`、`c` 等等)。它们通常被表示为 `int`、 `float`、`double` 和 `char`,当然,语言的内置词汇表会告诉你如何引用这些实体。 + +有时候,在编程语言中内置了一些额外的数据类型,也有时是通过引用库来启用复杂的数据类型。例如,Python 可以识别关键字为 `str` 的字符串,但是 C 语言的代码中必须包含 `string.h` 头文件才能实现字符串特性。 + +#### 实践 + +库可以为你的代码解锁各种类型的数据,但是学习编程语言中包含的基本数据类型是一个明智的起点。 + +### 4、运算符和解析器 + +![Operators][13] + +一旦你理解了编程语言可处理的数据类型,就可以学习如何分析这些数据了。幸运的是,数学这门学科是相当稳定的,所以算数运算符在许多语言中通常是相同的(或至少非常相似)。例如,两个整数相加通常用 `+` 符号完成,而测试一个整数是否大于另一个整数通常用 `>` 符号完成。测试是否相等通常使用 `==` 来完成(是的,是两个等号,因为通常一个等号用来赋值)。 + +当然也有一些例外,比如像 Lisp 和 Bash 语言算数运算符就不是如此,但与其他语言一样,这只是一个心理翻译的问题。一旦你了解了表达方式有何不同,很快就可以适应它。快速浏览一下一门编程语言的算数运算符通常足以让你了解算数操作是如何完成的。 + +你还需要知道如何比较和操作非数值数据,比如字符和字符串。这些通常是通过编程语言的核心库来进行的的。例如,Python 提供了 `split()` 方法,而 C 语言需要引入头文件 `string.h` 来提供 `strtok()` 函数。 + +#### 实践 + +了解用于处理基本数据类型的基本函数和关键字,并寻找可帮助你完成复杂操作的核心库。 + +### 5、函数 + +![Class][14] + +代码不只是计算机的待办清单。通常情况下,在编写代码时你往往希望向计算机提供一组理论条件和一组操作指令,当满足每个条件时计算机就会采取这些操作。尽管使用条件语句以及数学和逻辑运算符进行流控制可以做很多事情,但是引入了函数和类之后,代码会变得更加高效,因为它们使你可以定义子程序。例如,如果应用程序非常频繁地需要一个确认对话框,那么将其作为类的实例编写一次要比每次需要它时重新编写实现起来要容易得多。 + +你需要学习如何在编程语言中定义类和函数。更准确地说,你首先需要了解编程语言中是否支持类和函数。大多数现代语言都支持函数,但是类是面向对象的编程语言中所特有的。 + +#### 实践 + +学习语言中可用的结构,这些结构可以帮助你高效地编写和使用代码。 + +### 你可以学到任何东西 + +学习编程语言,就其本身而言,是一种编码过程中的子程序。一旦理解了代码如何工作,你所使用的语言就只是一种传递逻辑的媒介。学习一门新编程语言的过程几乎都是一样的:通过简单的练习来学习语法,通过学习词汇来积累进行复杂动作的能力,然后练习、练习、再练习。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/learn-any-programming-language + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[xiao-song-123](https://github.com/xiao-song-123) +校对:[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/learn-programming-code-keyboard.png?itok=xaLyptT4 "Learning to program" +[2]: https://opensource.com/article/20/9/scratch +[3]: https://opensource.com/sites/default/files/uploads/syntax_0.png "Syntax" +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/downloads/cheat-sheet-python-37-beginners +[6]: https://opensource.com/article/20/2/lua-cheat-sheet +[7]: https://opensource.com/downloads/java-cheat-sheet +[8]: https://opensource.com/downloads/c-programming-cheat-sheet +[9]: https://opensource.com/resources/what-ide +[10]: https://opensource.com/sites/default/files/uploads/builtin.png "built-in words" +[11]: https://opensource.com/downloads/bash-cheat-sheet +[12]: https://opensource.com/sites/default/files/uploads/type.png "Data types" +[13]: https://opensource.com/sites/default/files/uploads/operator.png "Operators" +[14]: https://opensource.com/sites/default/files/uploads/class.png "Class" diff --git a/published/202011/20201023 Secure NTP with NTS.md b/published/202011/20201023 Secure NTP with NTS.md new file mode 100644 index 0000000000..56b4d47fce --- /dev/null +++ b/published/202011/20201023 Secure NTP with NTS.md @@ -0,0 +1,167 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12860-1.html) +[#]: subject: (Secure NTP with NTS) +[#]: via: (https://fedoramagazine.org/secure-ntp-with-nts/) +[#]: author: (Miroslav Lichvar https://fedoramagazine.org/author/mlichvar/) + +用 NTS 保证 NTP 的安全 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/26/111649pt32v9j22x3ooa33.jpg) + +许多计算机使用网络时间协议Network Time Protocol(NTP)通过互联网来同步系统时钟。NTP 是少数几个仍在普遍使用的不安全的互联网协议之一。攻击者如果能够观察到客户端和服务器之间的网络流量,就可以向客户端提供虚假的数据,并根据客户端的实现和配置,强迫其将系统时钟设置为任何时间和日期。如果客户端的系统时钟不准确,一些程序和服务就可能无法工作。例如,如果根据客户端的系统时钟,Web 服务器的证书似乎已经过期,Web 浏览器将无法正常工作。可以使用网络时间安全Network Time Security(NTS)来保证 NTP 的安全。 + +Fedora 33 [^1] 是第一个支持 NTS 的 Fedora 版本。NTS 是一种新的 NTP 验证机制。它使客户端能够验证它们从服务器接收的数据包在传输过程中有没有被修改。当 NTS 启用时,攻击者唯一能做的就是丢弃或延迟数据包。关于 NTS 的更多细节,请参见 [RFC8915][3]。 + +使用对称密钥可以很好地保证 NTP 的安全。遗憾的是,服务器必须为每个客户端配备不同的密钥,而且密钥必须安全地分发才行。这对于本地网络上的私有服务器来说可能是实用的,但它不能扩展到有着数百万客户端的公共服务器上。 + +NTS 包括一个密钥建立Key Establishment(NTS-KE)协议,它可以自动创建服务器与其客户端之间使用的加密密钥。它在 TCP 端口 4460 上使用传输层安全Transport Layer Security(TLS)。它被设计成可以扩展到非常多的客户端,而对准确性的影响最小。服务器不需要保存任何客户端特定的状态。它为客户提供 cookie,cookie 是加密的,包含验证 NTP 数据包所需的密钥。隐私是 NTS 的目标之一。客户端在每次服务器响应时都会得到一个新的 cookie,所以它不必重复使用 cookie。这可以防止被动观察者跟踪在网络之间迁移的客户端。 + +Fedora 中默认的 NTP 客户端是 Chrony。Chrony 在 4.0 版本中增加了 NTS 支持,但并没有改变默认配置。Chrony 仍然使用 [pool.ntp.org][4] 项目中的公共服务器,而且默认情况下 NTS 没有启用。 + +目前,支持 NTS 的公共 NTP 服务器非常少。两个主要的提供商是 Cloudflare 和 Netnod。[Cloudflare 服务器][5]分布在世界各地的不同地方。他们使用的是任播anycast地址,应该可以让大多数客户到达一个接近的服务器。[Netnod 服务器][6]位于瑞典。在未来,我们可能会看到更多支持 NTS 的公共 NTP 服务器。 + +为了获得最佳的可靠性,配置 NTP 客户端的一般建议是至少有三个工作的服务器。为了达到最好的精度,建议选择距离较近的服务器,以减少网络延迟和非对称网络路由造成的不对称性。如果你不关心细粒度的精度,你可以忽略这个建议,使用任何你信任的 NTS 服务器,无论它们位于哪里。 + +如果你确实想要高准确度,但又没有近距离的 NTS 服务器,你可以将远处的 NTS 服务器和近处的非 NTS 服务器混合使用。但是,这样的配置不如只使用 NTS 服务器的配置安全。攻击者仍然不能强迫客户机接受任意时间,但他们确实对客户机的时钟及其估计精度有更大的控制权,这在某些环境下可能是不可接受的。 + +### 在安装程序中启用客户端 NTS + +安装 Fedora 33 时,你可以在“Time & Date”对话框的“Network Time”配置中启用 NTS。在点击“+”(添加)按钮之前,请输入服务器的名称并检查 NTS 支持情况。你可以添加一个或多个具有 NTS 的服务器或池。要删除默认的服务器池(`2.fedora.pool.ntp.org`),请取消选中“Use”列中的相应标记。 + +![Fedora 安装程序中的网络时间配置][7] + +### 在配置文件中启用客户端 NTS + +如果你从之前的 Fedora 版本升级,或者你没有在安装程序中启用 NTS,你可以直接在 `/etc/chrony.conf` 中启用 NTS。除了推荐的 `iburst` 选项外,还可以对指定服务器使用 `nts` 选项。例如: + +``` +server time.cloudflare.com iburst nts +server nts.sth1.ntp.se iburst nts +server nts.sth2.ntp.se iburst nts +``` + +你还应该允许客户端将 NTS 密钥和 cookie 保存到磁盘上,这样它就不必在每次启动时重复 NTS-KE 会话。在 `chrony.conf` 中添加以下一行,如果还没有的话: + +``` +ntsdumpdir /var/lib/chrony +``` + +如果不想让 DHCP 提供的 NTP 服务器与你指定的服务器混在一起,请在 `chrony.conf` 中删除或注释以下一行: + +``` +sourcedir /run/chrony-dhcp +``` + +当你完成编辑 `chrony.conf` 后,保存你的更改并重新启动 `chronyd` 服务: + +``` +systemctl restart chronyd +``` + +### 检查客户端状态 + +在 root 用户下运行以下命令,检查 NTS 密钥建立是否成功: + +``` +# chronyc -N authdata +Name/IP address Mode KeyID Type KLen Last Atmp NAK Cook CLen +========================================================================= +time.cloudflare.com NTS 1 15 256 33m 0 0 8 100 +nts.sth1.ntp.se NTS 1 15 256 33m 0 0 8 100 +nts.sth2.ntp.se NTS 1 15 256 33m 0 0 8 100 +``` + +`KeyID`、`Type` 和 `KLen` 列应该有非零值。如果它们为零,请检查系统日志中是否有来自 `chronyd` 的错误信息。一个可能的故障原因是防火墙阻止了客户端与服务器的 TCP 端口(端口 4460)的连接。 + +另一个可能的故障原因是由于客户机的时钟错误而导致证书无法验证。这是 NTS 的先有鸡还是先有蛋的问题。你可能需要手动修正日期或暂时禁用 NTS,以使 NTS 正常工作。如果你的电脑有实时时钟,几乎所有的电脑都有,而且有好的电池做备份,这种操作应该只需要一次。 + +如果计算机没有实时时钟或电池,就像一些常见的小型 ARM 计算机(如树莓派)那样,你可以在 `/etc/sysconfig/chronyd` 中添加 `-s` 选项来恢复上次关机或重启时保存的时间。时钟会落后于真实时间,但如果电脑没有关机太久,服务器的证书也没有在离到期时间太近的时候更新,应该足以让时间检查成功。作为最后的手段,你可以用 `nocerttimecheck` 指令禁用时间检查。详情请参见`chrony.conf(5)` 手册页。 + +运行下面的命令来确认客户端是否在进行 NTP 测量: + +``` +# chronyc -N sources +MS Name/IP address Stratum Poll Reach LastRx Last sample +=============================================================================== +^* time.cloudflare.com 3 6 377 45 +355us[ +375us] +/- 11ms +^+ nts.sth1.ntp.se 1 6 377 44 +237us[ +237us] +/- 23ms +^+ nts.sth2.ntp.se 1 6 377 44 -170us[ -170us] +/- 22ms +``` + +`Reach` 列应该有一个非零值,最好是 377。上图所示的值 377 是一个八进制数,它表示最后八个请求都有有效的响应。如果启用了 NTS 的话,验证检查将包括 NTS 认证。如果该值一直很少或从未达到 377,则表明 NTP 请求或响应在网络中丢失了。众所周知,一些主要的网络运营商有中间设备,它可以阻止或限制大的 NTP 数据包的速率,以缓解利用 `ntpd` 的监控协议进行的放大攻击。不幸的是,这影响了受 NTS 保护的 NTP 数据包,尽管它们不会引起任何放大。NTP 工作组正在考虑为 NTP 提供一个替代端口,作为解决这个问题的办法。 + +### 在服务器上启用 NTS + +如果你有自己的 NTP 服务器,运行着 `chronyd`,你可以启用服务器的 NTS 支持,让它的客户端安全同步。如果该服务器是其他服务器的客户端,它应该使用 NTS 或对称密钥与之同步。客户端假设同步链在所有服务器到主时间服务器之间是安全的。 + +启用服务器 NTS 类似于在 Web 服务器上启用 HTTPS。你只需要一个私钥和证书。例如,证书可以由 Let's Encrypt 权威机构使用 `certbot` 工具签署。当你有了密钥和证书文件(包括中间证书),在 `chrony.conf` 中用以下指令指定它们: + +``` +ntsserverkey /etc/pki/tls/private/foo.example.net.key +ntsservercert /etc/pki/tls/certs/foo.example.net.crt +``` + +确保之前在客户端配置中提到的 `ntsdumpdir` 指令存在于 `chrony.conf` 中。它允许服务器将其密钥保存到磁盘上,这样服务器的客户端在重启服务器时就不必获取新的密钥和 cookie 了。 + +重新启动 `chronyd` 服务: + +``` +systemctl restart chronyd +``` + +如果系统日志中没有来自 `chronyd` 的错误信息,那么它应该是可以接受客户端连接的,如果服务器有防火墙,则需要同时允许 UDP 123 和 TCP 4460 端口的 NTP 和 NTS-KE 服务。 + +你可以用下面的命令在客户端机器上进行快速测试: + +``` +$ chronyd -Q -t 3 'server foo.example.net iburst nts maxsamples 1' +2020-10-13T12:00:52Z chronyd version 4.0 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG) +2020-10-13T12:00:52Z Disabled control of system clock +2020-10-13T12:00:55Z System clock wrong by -0.001032 seconds (ignored) +2020-10-13T12:00:55Z chronyd exiting +``` + +如果你看到一个“System clock wrong”消息,说明它是正确工作的。 + +在服务器上,你可以使用下面的命令来检查它已经处理了多少个 NTS-KE 连接和认证的 NTP 数据包: + +``` +# chronyc serverstats +NTP packets received : 2143106240 +NTP packets dropped : 117180834 +Command packets received : 16819527 +Command packets dropped : 0 +Client log records dropped : 574257223 +NTS-KE connections accepted: 104 +NTS-KE connections dropped : 0 +Authenticated NTP packets : 52139 +``` + +如果你看到非零的 “NTS-KE connections accepted” 和 “Authenticated NTP packets”,这意味着至少有一些客户端能够连接到 NTS-KE 端口,并发送一个认证的 NTP 请求。 + +[^1]: Fedora 33 Beta 安装程序包含一个较旧的 Chrony 预发布版本,它不能与当前的 NTS 服务器一起工作,因为 NTS-KE 端口已经改变。因此,在安装程序中的网络时间配置中,服务器总是显示为不工作。安装后,需要更新 chrony 包,才能与当前的服务器配合使用。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/secure-ntp-with-nts/ + +作者:[Miroslav Lichvar][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/mlichvar/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/10/secure-ntp-with-nts-816x345.jpg +[2]: tmp.rl0XC1HIGm#footnote1 +[3]: https://tools.ietf.org/html/rfc8915 +[4]: https://www.pool.ntp.org +[5]: https://developers.cloudflare.com/time-services/nts/usage +[6]: https://www.netnod.se/time-and-frequency/how-to-use-nts +[7]: https://fedoramagazine.org/wp-content/uploads/2020/10/anaconda-nts.png diff --git a/published/202011/20201026 ninja- a simple way to do builds.md b/published/202011/20201026 ninja- a simple way to do builds.md new file mode 100644 index 0000000000..43911730e3 --- /dev/null +++ b/published/202011/20201026 ninja- a simple way to do builds.md @@ -0,0 +1,117 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12798-1.html) +[#]: subject: (ninja: a simple way to do builds) +[#]: via: (https://jvns.ca/blog/2020/10/26/ninja--a-simple-way-to-do-builds/) +[#]: author: (Julia Evans https://jvns.ca/) + +ninja:一个简单的构建方式 +====== + +大家好!每隔一段时间,我就会发现一款我非常喜欢的新软件,今天我想说说我最近喜欢的一款软件:[ninja][1]! + +### 增量构建很有用 + +我做了很多小项目,在这些项目中,我想设置增量构建。例如,现在我正在写一本关于 bash 的杂志,杂志的每一页都有一个 `.svg`文件。我需要将 SVG 转换为 PDF,我的做法是这样的: + +``` +for i in *.svg +do + svg2pdf $i $i.pdf # or ${i/.svg/.pdf} if you want to get really fancy +done +``` + +这很好用,但是我的 `svg2pdf` 脚本有点慢(它使用 Inkscape),而且当我刚刚只更新了一页的时候,必须等待 90 秒或者其他什么时间来重建所有的 PDF 文件,这很烦人。 + +### 构建系统是让人困惑的 + +在过去,我对使用 `make` 或 `bazel` 这样的构建系统来做我的小项目一直很反感,因为 `bazel` 是个大而复杂的东西,而 `make` 对我来说感觉有点神秘。我真的不想使用它们中的任何一个。 + +所以很长时间以来,我只是写了一个 bash 脚本或者其他的东西来进行构建,然后就认命了,有时候只能等一分钟。 + +### ninja 是一个极其简单的构建系统 + +但 `ninja` 并不复杂!以下是我所知道的关于 ninja 构建文件的语法:创建一个 `rule` 和一个 `build`: + +`rule` 有一个命令(`command`)和描述(`description`)参数(描述只是给人看的,所以你可以知道它在构建你的代码时在做什么)。 + +``` +rule svg2pdf + command = inkscape $in --export-text-to-path --export-pdf=$out + description = svg2pdf $in $out +``` + +`build` 的语法是 `build output_file: rule_name input_files`。下面是一个使用 `svg2pdf` 规则的例子。输出在规则中的 `$out` 里,输入在 `$in` 里。 + +``` +build pdfs/variables.pdf: svg2pdf variables.svg +``` + +这就完成了!如果你把这两个东西放在一个叫 `build.ninja` 的文件里,然后运行 `ninja`,ninja 会运行 `inkscape variables.svg --export-text-to-path --export-pdf=pdfs/variables.pdf`。然后如果你再次运行它,它不会运行任何东西(因为它可以告诉你已经构建了 `pdfs/variables.pdf`,而且是最新的)。 + +Ninja 还有一些更多的功能(见[手册][2]),但我还没有用过。它最初是[为 Chromium][3] 构建的,所以即使只有一个小的功能集,它也能支持大型构建。 + +### ninja 文件通常是自动生成的 + +ninja 的神奇之处在于,你不必使用一些混乱的构建语言,它们很难记住,因为你不经常使用它(比如 `make`),相反,ninja 语言超级简单,如果你想做一些复杂的事情,那么你只需使用任意编程语言生成你想要的构建文件。 + +我喜欢写一个 `build.py` 文件,或者像这样的文件,创建 ninja 的构建文件,然后运行 `ninja`: + +``` +with open('build.ninja', 'w') as ninja_file: + # write some rules + ninja_file.write(""" +rule svg2pdf + command = inkscape $in --export-text-to-path --export-pdf=$out + description = svg2pdf $in $out +""") + + # some for loop with every file I need to build + for filename in things_to_convert: + ninja_file.write(f""" +build {filename.replace('svg', 'pdf')}: svg2pdf {filename} +""") + +# run ninja +import subprocess +subprocess.check_call(['ninja']) +``` + +我相信有一堆 `ninja` 的最佳实践,但我不知道。对于我的小项目而言,我发现它很好用。 + +### meson 是一个生成 ninja 文件的构建系统 + +我对 [Meson][4] 还不太了解,但最近我在构建一个 C 程序 ([plocate][5],一个比 `locate` 更快的替代方案)时,我注意到它有不同的构建说明,而不是通常的 `./configure; make; make install`: + +``` +meson builddir +cd builddir +ninja +``` + +看起来 Meson 是一个可以用 ninja 作为后端的 C/C++/Java/Rust/Fortran 构建系统。 + +### 就是这些! + +我使用 ninja 已经有几个月了。我真的很喜欢它,而且它几乎没有给我带来让人头疼的构建问题,这让我感觉非常神奇。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/10/26/ninja--a-simple-way-to-do-builds/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://ninja-build.org/ +[2]: https://ninja-build.org/manual.html +[3]: http://neugierig.org/software/chromium/notes/2011/02/ninja.html +[4]: https://mesonbuild.com/Tutorial.html +[5]: https://blog.sesse.net/blog/tech/2020-09-28-00-37_introducing_plocate diff --git a/published/202011/20201027 KDE Neon vs Kubuntu- What-s the Difference Between the Two KDE Distribution.md b/published/202011/20201027 KDE Neon vs Kubuntu- What-s the Difference Between the Two KDE Distribution.md new file mode 100644 index 0000000000..79b0f00628 --- /dev/null +++ b/published/202011/20201027 KDE Neon vs Kubuntu- What-s the Difference Between the Two KDE Distribution.md @@ -0,0 +1,117 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12834-1.html) +[#]: subject: (KDE Neon vs Kubuntu: What’s the Difference Between the Two KDE Distribution?) +[#]: via: (https://itsfoss.com/kde-neon-vs-kubuntu/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +KDE Neon vs Kubuntu:这两款 KDE 发行版有什么区别? +====== + +当你发现两款基于 [Ubuntu][1] 并由 [KDE][2] 驱动的 Linux 发行版,你会选择哪一个? + + * [Kubuntu][3] 是 Ubuntu 的官方 KDE 版本。 + * [KDE Neon][4] 是 KDE 自己发布的基于 Ubuntu 的发行版。 + +我知道这常常会让人感到困惑,尤其是当你从来没有使用过这两个版本,但有人推荐你使用它们。因此,为了帮助你做出决定,我想整理一份 KDE Neon 和 Kubuntu 的区别(和相似之处)。 + +让我们先开始了解相似之处,然后再继续了解不同之处。 + +注:根据你的系统,你对这两个发行版的体验可能有所不同。所以,请把这篇文章作为一个参考,而不是一个”哪个更好“的比较。 + +### KDE Neon vs Kubuntu:功能上的比较 + +![][5] + +基于相似性比较发行版是一个不错的做法。所以,从理论上,我试图把最重要的区别写下来。 + +然而,值得注意的是,发行版的兼容性、性能和稳定性会根据你的硬件而有所不同,而这里没有考虑到这一点。 + +#### Ubuntu 作为基础 + +![][6] + +是的,这两个 Linux 发行版都是基于 Ubuntu 的,但 KDE Neon 只基于最新的 Ubuntu LTS 版本,而 Kubuntu 则提供了基于 Ubuntu LTS 的版本和非 LTS 版本。 + +所以,如果使用 KDE Neon,你可以期望在下一个 Ubuntu LTS 版本(每 2 年)的几个月后就能用上最新的 Ubuntu 功能。但是,对于 Kubuntu 来说,你可以选择一个非 LTS 版本,并尝试使用带有 6 个月的软件更新的最新 Ubuntu 版本。 + +KDE Neon 确实提供了测试版和开发者版,但这些都是为了测试预发布的 KDE 软件而提供的。 + +#### KDE Plasma 桌面 + +![][7] + +尽管这两个发行版都采用了 KDE plasma 桌面,而且你可以获得相同程度的定制,但 KDE Neon 会首先获得最新的 KDE Plasma 桌面。 + +如果你还不知道,KDE Neon 是由 KDE 官方团队开发的,由 Jonathan Riddell(Kubuntu 创始人)在[被 Canonical 强制赶出 Kubuntu][8] 后宣布的。 + +所以,不仅限于最新的 Plasma 桌面,如果你想尽快获得最新最好的 KDE,KDE Neon 是最佳选择。 + +Kubuntu 最终会得到更新的 KDE 软件的更新,但这需要时间。如果你不太确定需要最新的 KDE 软件/桌面,而只是需要一个稳定的 KDE 系统,你应该选择 Kubuntu LTS 版本。 + +#### 预装软件 + +开箱即用,你会发现 Kubuntu 已经预装了一些必要的工具和应用程序,但是,对于 KDE Neon,你需要找到并安装一些应用和工具。 + +从某些方面看,与 Kubuntu 相比,KDE Neon 可能是一个轻量级的发行版。然而,对于新的 Linux 用户来说,他们可能会发现 Kubuntu 是一个易于使用的体验,并预装了更多必要的软件和工具。 + +#### 软件更新 + +如果你没有使用按流量计费的连接,这可能根本不重要。但是,我应该提一下,考虑到常规的 Ubuntu LTS 修复/更新以及 KDE 软件更新,KDE Neon 会有更多的软件更新。 + +对于 Kubuntu,你只会得到 Ubuntu LTS 的更新(除非你使用的是非 LTS 版本)。所以,从技术上讲,你会有更少的更新数量。 + +#### Ubuntu KDE 版与 Plasma 的体验差异 + +![][11] + +我知道如果你没有尝试过这两个版本,你可能会认为它们很相似。但是,Kubuntu 是 Ubuntu 的官方版本,它更注重 Ubuntu 在 KDE 桌面环境上的使用体验。 + +而 KDE Neon 在技术上是一样的,但它的目的是为了获得一流的 Plasma 桌面体验,并搭载最新的东西。 + +尽管这两个发行版开箱即可完美工作,但它们有不同的愿景和相应的开发工作。你只需要决定你自己想要什么,然后选择其中之一。 + +#### 硬件兼容性 + +![Kubuntu Focus Laptop][12] + +正如我前面提到的,这不是一个基于事实的观点。但是,根据我在网上快速了解用户分享的反馈或经验,似乎 Kubuntu 可以与各种旧硬件以及新硬件(可能追溯到 2012 年)一起工作,而 KDE Neon 可能不能。 + +只需要记住,如果你尝试 KDE Neon,但由于某些原因不能工作。你知道该怎么做。 + +### 总结 + +那么,你会选择哪个呢?KDE Neon 还是 Kubuntu?这完全是你的选择。 + +两者都是[初学者友好的 Linux 发行版][13]的不错选择,但如果你想要最新的 KDE Plasma 桌面,KDE Neon 会更有优势。你可以在我们的 [KDE Neon 评测][10]中阅读更多关于它的内容。 + +欢迎在下面的评论中告诉我你的想法,你觉得它们中的任何一个有什么好的/坏的地方。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kde-neon-vs-kubuntu/ + +作者:[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://ubuntu.com/ +[2]: https://kde.org/ +[3]: https://kubuntu.org +[4]: https://neon.kde.org +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/kde-neon-vs-kubuntu.png?resize=800%2C450&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/01/install_ubuntu_8.jpg?resize=796%2C611&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/kde-plasma-5-20-feat.png?resize=800%2C394&ssl=1 +[8]: https://lwn.net/Articles/645973/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/kde-neon-review.jpg?fit=800%2C450&ssl=1 +[10]: https://itsfoss.com/kde-neon-review/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/01/kubuntu-kde.jpg?resize=800%2C450&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/01/kubuntu-focus-laptop.jpg?resize=800%2C600&ssl=1 +[13]: https://itsfoss.com/best-linux-beginners/ diff --git a/published/202011/20201027 You can Surf Internet in Linux Terminal With These Command Line Browsers.md b/published/202011/20201027 You can Surf Internet in Linux Terminal With These Command Line Browsers.md new file mode 100644 index 0000000000..54811507c5 --- /dev/null +++ b/published/202011/20201027 You can Surf Internet in Linux Terminal With These Command Line Browsers.md @@ -0,0 +1,172 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12850-1.html) +[#]: subject: (You can Surf Internet in Linux Terminal With These Command Line Browsers) +[#]: via: (https://itsfoss.com/terminal-web-browsers/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +使用命令行浏览器在 Linux 终端上网浏览 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/22/212007f9s7aabmcj4aa9lo.jpg) + +我猜你阅读这篇文章可能是用 Firefox 或基于 Chrome 的浏览器(如 [Brave][1]),或者,也可能是 Chrome 浏览器或 [Chromium][2]。 + +换句话说,你正在利用基于 GUI 的方式浏览网页。然而,在以前,人们使用终端来获取资源和浏览网页,因为所有的东西大多是基于文本的。 + +虽然现在不能从终端上获取每个信息,但对于一些文本信息,还是可以尝试使用命令行浏览器,从 Linux 终端上打开网页。 + +不仅如此,如果你访问的是远程服务器,或者只有一个没有 GUI 的终端,终端网页浏览器就可以发挥用处了。 + +因此,在本文中,我将介绍一些基于终端的 Web 浏览器,你可以在 Linux 上尝试它们。 + +### Linux 用户的最佳终端 Web 浏览器 + +注:此榜单排名不分先后。 + +#### 1、W3M + +![][3] + +`w3m` 是一个流行的基于文本的开源终端 Web 浏览器。尽管其初始项目已经不再活跃,但另一个开发者 Tatsuya Kinoshita 正在维护着它的一个活跃分支。 + +`w3m` 相当简单,支持 SSL 连接、色彩,也支持内嵌图片。当然,根据你试图访问的资源,你那边的情况可能会有所不同。根据我的简单测试,它似乎无法加载 [DuckDuckGo][4],但我可以[在终端中使用 Google][5]就够了。 + +安装后,你可以简单的在终端中输入 `w3m` 以得到帮助。如果你感兴趣的话,也可以到 [GitHub][6] 上去查看它的仓库。 + +**如何安装和使用 w3m?** + +`w3m` 在任何基于 Debian 的 Linux 发行版的默认仓库中都是可用的。如果你有一个基于 Arch 的发行版,但没有直接可用的软件包,你可能需要查看一下 [AUR][7]。 + +对于 Ubuntu,你可以通过键入以下内容来安装它: + +``` +sudo apt install w3m w3m-img +``` + +在这里,我们将 w3m 包和图片扩展一起安装,以支持内嵌图片。接下来,要开始安装,你只需要按照下面的命令进行操作即可: + +``` +w3m xyz.com +``` + +当然,你需要将 `xyz.com` 替换成任何你想浏览或测试的网站。最后,你应该知道,你可以使用键盘上的方向键来导航,当你想采取一个动作时,按回车键。 + +要退出,你可以按 `SHIFT+Q`,返回上一页是 `SHIFT+B`。其他快捷键包括用 `SHIFT+T` 打开新标签页和用 `SHIFT+U` 打开新的 URL。 + +你可以通过访问它的手册页来了解更多信息。 + +#### 2、Lynx + +![][8] + +Lynx 是另一个开源的命令行浏览器,你可以试试。幸运的是,很多的网站在使用 Lynx 时往往能正常工作,所以我说它在这方面肯定更好。我能够加载 DuckDuckGo,并使其工作。 + +除此之外,我还注意到它可以让你在访问各种 Web 资源时接受或拒绝 cookie。你也可以将它设置为总是接受或拒绝。所以,这是件好事。 + +另一方面,在终端上使用时,窗口不能很好地调整大小。我还没有寻找到任何解决方法,所以如果你正在尝试这个,你可能会想要这样做。不论如何,它都很好用,当你在终端启动它时,你会得到所有键盘快捷键的说明。 + +请注意,它与系统终端主题不匹配,所以无论你的终端看起来如何,它都会看起来不同。 + +**如何安装 Lynx?** + +与 w3m 不同的是,如果你有兴趣尝试的话,确实可以找到一些 Win32 上的安装程序。不过,在 Linux 上,它在大多数的默认仓库中都是可用的。 + +对于 Ubuntu 来说,你只需要输入: + +``` +sudo apt install lynx +``` + +要想使用,你只需要按照下面的命令进行操作: + +``` +lynx examplewebsite.com +``` + +在这里,你只需要将示例网站替换成你想要访问的资源即可。 + +如果你想找其他 Linux 发行版的软件包,可以查看他们的[官网资源][9]。 + +#### 3、Links2 + +![][10] + +Links2 是一款有趣的基于文本的浏览器,你可以在你的终端上轻松使用,用户体验良好。它提供了一个很好的界面,你启动它后,只要输入网址就可以了。 + +![][11] + +值得注意的是,主题将取决于你的终端设置,我设置为“黑绿色”主题,因此你看到的就是这个。当你以命令行浏览器的方式启动它后,你只需要按任意键就会出现 URL 提示,或者按 `Q` 键退出。它相当好用,可以渲染大多数网站的文字。 + +与 Lynx 不同的是,你没有接受或拒绝 cookie 的功能。除此之外,它似乎工作的还不错。 + +**如何安装 Links2?** + +正如你所期望的,你会发现它在大多数默认的仓库中都有。对于 Ubuntu,你可以在终端输入以下命令来安装它: + +``` +sudo apt install links2 +``` + +如果你想在其他 Linux 发行版上安装它,你可以参考它的[官方网站][12]获取软件包或文档。 + +#### 4、eLinks + +![][13] + +eLinks 类似于 Links2,但它已经不再维护了。你仍然可以在各种发行版的默认仓库中找到它,因此,我把它保留在这个列表中。 + +它不会与你的系统终端主题相融合。所以,如果你需要的话,作为一个没有“黑暗”模式的文本型浏览器,这可能不是一个漂亮的体验。 + +**如何安装 eLinks?** + +在 Ubuntu 上,安装它很容易。你只需要在终端中输入以下内容: + +``` +sudo apt install elinks +``` + +对于其他 Linux 发行版,你应该可以在标准软件仓库中找到它。但是,如果你在软件仓库中找不到它,你可以参考[官方安装说明][14]。 + +### 总结 + +在终端上运行的基于文本的 Web 浏览器并不多,这并不奇怪。一些项目,如 [Browsh][15],试图呈现一个现代的 Linux 命令行浏览器,但在我这里它不能工作。 + +虽然像 `curl` 和 `wget` 这样的工具允许你[从 Linux 命令行下载文件][16],但这些基于终端的 Web 浏览器提供了额外的功能。 + +除了命令行浏览器之外,如果你想在终端上玩玩,也可以尝试一些[Linux 命令行游戏][17]。 + +对于 Linux 终端上的文本型 Web 浏览器,你有什么看法?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/terminal-web-browsers/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/brave-web-browser/ +[2]: https://itsfoss.com/install-chromium-ubuntu/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/w3m-google.jpg +[4]: https://duckduckgo.com/ +[5]: https://itsfoss.com/review-googler-linux/ +[6]: https://github.com/tats/w3m +[7]: https://itsfoss.com/aur-arch-linux/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/lynx-terminal.jpg +[9]: https://lynx.invisible-island.net/lynx-resources.html +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/links2-terminal.jpg +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/links2-terminal-welcome.jpg +[12]: http://links.twibright.com/download.php +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/elinks-terminal.jpg +[14]: http://elinks.or.cz/documentation/installation.html +[15]: https://www.brow.sh/ +[16]: https://itsfoss.com/download-files-from-linux-terminal/ +[17]: https://itsfoss.com/best-command-line-games-linux/ diff --git a/published/202011/20201028 5 new sudo features you need to know in 2020.md b/published/202011/20201028 5 new sudo features you need to know in 2020.md new file mode 100644 index 0000000000..8472f95e4c --- /dev/null +++ b/published/202011/20201028 5 new sudo features you need to know in 2020.md @@ -0,0 +1,126 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12865-1.html) +[#]: subject: (5 new sudo features you need to know in 2020) +[#]: via: (https://opensource.com/article/20/10/sudo-19) +[#]: author: (Peter Czanik https://opensource.com/users/czanik) + +2020 年 5 个新 sudo 功能 +====== + +> 从集中会话记录、chroot 支持到 Python API,sudo 1.9 提供了许多新功能。 + +![](https://img.linux.net.cn/data/attachment/album/202011/28/143544x5cdcxzf9dcujdng.jpg) + +当你想在 [POSIX 系统][2]上执行一个操作时,最安全的方法之一就是使用 `sudo` 命令。与以 root 用户身份登录并执行命令可能是个危险的操作不同,`sudo` 授予任何被系统管理员[指定为 “sudoer”][3]的用户临时权限,来执行通常受限制的活动。 + +几十年来,这个系统帮助 Linux、Unix 和 macOS 系统免受愚蠢的错误和恶意攻击,它是当今所有主要 Linux 发行版的默认管理机制。 + +当在 2020 年 5 月发布 sudo 1.9 时,它带来了许多新功能,包括集中收集会话记录,支持 `sudo` 内的 chroot,以及 Python API。如果你对其中的任何一项感到惊讶,请阅读我的文章,了解一些 [sudo 鲜为人知的功能][4]。 + +`sudo` 不仅仅是一个管理命令的前缀。你可以微调权限,记录终端上发生的事情,使用插件扩展`sudo`,在 LDAP 中存储配置,进行广泛的日志记录,以及更多。 + +1.9.0 版本和后续的小版本增加了各种新功能(我将在下面介绍),包括: + + * 一个集中收集 `sudo` 会话记录的记录服务 + * 审计插件 API + * 审批插件 API + * Python 对插件的支持 + * `sudo` 内置 chroot 和 CWD 支持(从 1.9.3 开始) + +### 哪里可以得到 sudo 1.9? + +大多数的 Linux 发行版仍然封装了上一代的 `sudo`(1.8 版本),并且在长期支持(LTS)的发行版中会保持这个版本数年。据我所知,提供了最完整的 sudo 1.9 包的 Linux 发行版是 openSUSE[Tumbleweed][5],它是一个滚动发行版,而且该 `sudo` 包的子包中有 Python 支持。最近的 [Fedora][6] 版本包含了 sudo 1.9,但没有 Python 支持。[FreeBSD Ports][7] 有最新的 `sudo` 版本,如果你自己编译 `sudo` 而不是使用软件包,你可以启用 Python 支持。 + +如果你喜欢的 Linux 发行版还没有包含 sudo 1.9,请查看 [sudo 二进制页面][8]来查看是否有现成的包可以用于你的系统。这个页面还提供了一些商用 Unix 变种的软件包。 + +像往常一样,在你开始试验 `sudo` 设置之前,*确保你知道 root 密码*。是的,即使在 Ubuntu 上也是如此。有一个临时的“后门”是很重要的;如果没有这个后门,如果出了问题,你就必须得黑掉自己的系统。记住:语法正确的配置并不意味着每个人都可以在该系统上通过 `sudo` 做任何事情! + +### 记录服务 + +记录服务可以集中收集会话记录。与本地会话记录存储相比,这有很多优势: + + * 更方便地在一个地方进行搜索,而不是访问各个机器来寻找记录 + * 即使在发送机器停机的情况下也可以进行记录 + * 本地用户若想掩盖其轨迹,不能删除记录 + +为了快速测试,你可以通过非加密连接向记录服务发送会话。我的博客中包含了[说明][9],可以在几分钟内完成设置。对于生产环境,我建议使用加密连接。有很多可能性,所以请阅读最适合你的环境的[文档][10]。 + +### 审计插件 API + +新的审计插件 API 不是一个用户可见的功能。换句话说,你不能从 `sudoers` 文件中配置它。它是一个 API,意味着你可以从插件中访问审计信息,包括用 Python 编写的插件。你可以用很多不同的方式来使用它,比如当一些有趣的事情发生时,从 `sudo` 直接发送事件到 Elasticsearch 或日志即服务(LaaS)上。你也可以用它来进行调试,并以任何你喜欢的格式将其他难以访问的信息打印到屏幕上。 + +根据你使用它的方式,你可以在 `sudo` 插件手册页(针对 C 语言)和 `sudo` Python 插件手册中找到它的文档。在 `sudo` 源代码中可以找到 [Python 代码示例][11],在我的博客上也有一个[简化的例子][12]。 + +### 审批插件 API + +审批插件 API 可以在命令执行之前加入额外的限制。这些限制只有在策略插件成功后才会运行,因此你可以有效地添加额外的策略层,而无需更换策略插件,进而无需更换 `sudoers`。可以定义多个审批插件,而且所有插件都必须成功,命令才能执行。 + +与审计插件 API 一样,你可以从 C 和 Python 中使用它。我博客上记录的[示例 Python 代码][13]是对该 API 的一个很好的介绍。一旦你理解了它是如何工作的,你就可以扩展它来将 `sudo` 连接到工单系统,并且只批准有相关开放工单的会话。你也可以连接到人力资源数据库,这样只有当班的工程师才能获得管理权限。 + +### Python 对插件的支持 + +尽管我不是程序员,但我最喜欢的 sudo 1.9 新特性是 Python 对插件的支持。你可以用 Python 也能使用 C 语言调用大部分 API。幸运的是,`sudo` 对性能不敏感,所以运行速度相对较慢的 Python 代码对 `sudo` 来说不是问题。使用 Python 来扩展 `sudo` 有很多优势: + + * 更简单、更快速的开发 + * 不需要编译;甚至可以通过配置管理分发代码 + * 许多 API 没有现成的 C 客户端,但有 Python 代码 + +除了审计和审批插件 API 之外,还有一些其他的 API,你可以用它们做一些非常有趣的事情。 + +通过使用策略插件 API,你可以取代 `sudo` 策略引擎。请注意,你将失去大部分的 `sudo` 功能,而且没有基于 `sudoers` 的配置。这在小众情况下还是很有用的,但大多数时候,最好还是继续使用 `sudoers`,并使用审批插件 API 创建额外的策略。如果你想尝试一下,我的 [Python 插件介绍][14]提供了一个非常简单的策略:只允许使用 `id` 命令。再次确认你知道 root 密码,因为一旦启用这个策略,它就会阻止任何实际使用 `sudo` 的行为。 + +使用 I/O 日志 API,你可以访问用户会话的输入和输出。这意味着你可以分析会话中发生了什么,甚至在发现可疑情况时终止会话。这个 API 有很多可能的用途,比如防止数据泄露。你可以监控屏幕上的关键字,如果数据流中出现任何关键字,你可以在关键字出现在用户的屏幕上之前中断连接。另一种可能是检查用户正在输入的内容,并使用这些数据来重建用户正在输入的命令行。例如,如果用户输入 `rm -fr /`,你可以在按下回车键之前就断开用户的连接。 + +组插件 API 允许非 Unix 组的查找。在某种程度上,这与审批插件 API 类似,因为它也扩展了策略插件。你可以检查一个用户是否属于一个给定的组,并在后面的配置部分基于此采取行动。 + +### chroot 和 CWD 支持 + +`sudo` 的最新功能是支持 chroot 和改变工作目录(CWD),这两个选项都不是默认启用的,你需要在 `sudoers` 文件中明确启用它们。当它们被启用时,你可以调整目标目录或允许用户指定使用哪个目录。日志反映了这些设置何时被使用。 + +在大多数系统中,chroot 只对 root 用户开放。如果你的某个用户需要 chroot,你需要给他们 root 权限,这比仅仅给他们 chroot 权限要大得多。另外,你可以通过 `sudo` 允许访问 chroot 命令,但它仍然允许漏洞,他们可以获得完全的权限。当你使用 `sudo` 内置的 chroot 支持时,你可以轻松地限制对单个目录的访问。你也可以让用户灵活地指定根目录。当然,这可能会导致灾难(例如,`sudo --chroot / -s`),但至少事件会被记录下来。 + +当你通过 `sudo` 运行一个命令时,它会将工作目录设置为当前目录。这是预期的行为,但可能有一些情况下,命令需要在不同的目录下运行。例如,我记得使用过一个应用程序,它通过检查我的工作目录是否是 `/root` 来检查我的权限。 + +### 尝试新功能 + +希望这篇文章能启发你仔细研究一下 sudo 1.9。集中会话记录比在本地存储会话日志更加方便和安全。chroot 和 CWD 支持为你提供了额外的安全性和灵活性。而使用 Python 来扩展 `sudo`,可以很容易地根据你的环境来定制 `sudo`。你可以通过使用最新的 Linux 发行版或 `sudo` 网站上的即用型软件包来尝试这些新功能。 + +如果你想了解更多关于 sudo 的信息,这里有一些资源: + + * [Sudo 官网][15] + * [Sudo 博客][16] + * [Sudo on Twitter][17] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/sudo-19 + +作者:[Peter Czanik][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/czanik +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_osyearbook2016_sysadmin_cc.png?itok=Y1AHCKI4 (Wratchet set tools) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://opensource.com/article/17/12/using-sudo-delegate +[4]: https://opensource.com/article/19/10/know-about-sudo +[5]: https://software.opensuse.org/distributions/tumbleweed +[6]: https://getfedora.org/ +[7]: https://www.freebsd.org/ports/ +[8]: https://www.sudo.ws/download.html#binary +[9]: https://blog.sudo.ws/posts/2020/03/whats-new-in-sudo-1.9-recording-service/ +[10]: https://www.sudo.ws/man/sudo_logsrvd.man.html#EXAMPLES +[11]: https://github.com/sudo-project/sudo/blob/master/plugins/python/example_audit_plugin.py +[12]: https://blog.sudo.ws/posts/2020/06/sudo-1.9-using-the-new-audit-api-from-python/ +[13]: https://blog.sudo.ws/posts/2020/08/sudo-1.9-using-the-new-approval-api-from-python/ +[14]: https://blog.sudo.ws/posts/2020/01/whats-new-in-sudo-1.9-python/ +[15]: https://www.sudo.ws/ +[16]: https://blog.sudo.ws/ +[17]: https://twitter.com/sudoproject diff --git a/published/202011/20201028 How JavaScript became a serious programming language.md b/published/202011/20201028 How JavaScript became a serious programming language.md new file mode 100644 index 0000000000..3b6b15fd92 --- /dev/null +++ b/published/202011/20201028 How JavaScript became a serious programming language.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12813-1.html) +[#]: subject: (How JavaScript became a serious programming language) +[#]: via: (https://opensource.com/article/20/10/history-javascript) +[#]: author: (Nimisha Mukherjee https://opensource.com/users/nimisha) + +JavaScript 是如何成为一门严肃的编程语言的 +====== + +> 从最开始作为一种使网站变得漂亮的方式,JavaScript 已转变为一种严肃的编程语言。 + +![](https://img.linux.net.cn/data/attachment/album/202011/12/010945vezib4p1b1ti6pjt.jpg) + +JavaScript 的卑微起步始于 1995 年,是由当时在 Netscape 通信公司工作的 Brendan Eich [在短短 10 天内创建的][2]。从那时起,JavaScript 已经走过了漫长的道路,从一个让网站变得漂亮的工具变成了一种严肃的编程语言。 + +在其早期,JavaScript 被认为是一种视觉工具,它使网站变得更有趣和更有吸引力。像 [Jakarta Server Pages][3](即 JSP,以前称作 JavaServer Pages)这样的语言曾经用来完成渲染网页的繁重工作,而 JavaScript 则被用来创建基本的交互、视觉增强和动画。 + +长期以来,HTML、CSS 和 JavaScript 之间的分界并不明确。前端开发主要由 HTML、CSS 和 JavaScript 组成,形成了标准 Web 技术的“[多层蛋糕][4]”。 + +![标准 Web 技术的多层蛋糕][5] + +*标准网络技术的“[多层蛋糕][4]”(Mozilla 开发者网络,[CC BY-SA 4.0][6])* + +HTML 和 CSS 为内容提供结构、格式和样式。一旦网页要做一些超越了显示静态内容的事情,就是 JavaScript 的用武之地。Ecma 国际部开发了 JavaScript 规范,万维网联盟World Wide Web Consortium(W3C)开发了 HTML 和 CSS 规范。 + +### JavaScript 是如何获得突出地位的 + +JavaScript 是如何成为[最受欢迎的][8]编程语言的,背后有一段漫长的[历史][7]。早在 20 世纪 90 年代,Java 是王者,不可避免的人们会与它进行比较。许多工程师认为 JavaScript 不是一门好的编程语言,因为它缺乏对面向对象编程的支持。尽管当时并不明显,但其实 JavaScript 的对象模型和功能特性在其第一个版本中就已经出现了。 + +1995 年 JavaScript 匆匆发布后,网景公司将其提交给了欧洲计算机制造商协会European Computer Manufacturers Association(ECMA)国际部进行标准化。由此产生了 [ECMAScript][9],这是一个 JavaScript 标准,旨在确保不同 Web 浏览器之间网页的互操作性。ECMAScript 1 于 1997 年 6 月问世,帮助推进了 JavaScript 的标准化。 + +在此期间,PHP 和 JSP 成为了服务器端编程语言的流行选择。JSP 作为通用网关接口Common Gateway Interface([CGI][10])的首选替代方案获得了突出的地位,因为它可以在 HTML 中嵌入 Java 代码。虽然它很受欢迎,但开发人员发现将 Java 嵌入 HTML 中是不自然的。此外,即使是 HTML 上最简单的文本变化,JSP 也必须经历一个耗时的生命周期。在今天的微服务世界里,面向 JSP 的页面被认为是技术债务。  + +[PHP][11] 的工作原理与 JSP 类似,但 PHP 代码以一个通用网关接口([CGI][10])的可执行文件来处理。基于 PHP 的 Web 应用比基于 JSP 的应用更容易部署。总的来说,使用 PHP 更容易上手和运行。今天,PHP 和 JavaScript 是创建动态网站最流行的组合之一:PHP 作为服务器端脚本,JavaScript 作为客户端脚本。 + +伴随着 2006 年 [jQuery][12] 的发布,JavaScript 的应用越来越多。jQuery 是一个多用途的 JavaScript 库,简化了繁琐的文档对象模型Document Object Model(DOM)管理、事件处理和 [Ajax][13]。  + +2009 年 [Node.js][14] 的发布是 JavaScript 发展的转折点。开发者现在可以用 JavaScript 编写服务器端脚本了。紧随其后的是 2010 年发布的 [Backbone.js][15] 和 [AngularJS][16] 等框架。这导致了出现了使用单一语言进行全栈开发的概念。 + +2015 年,Ecma 国际部发布了 ECMAScript 6(ES6),它为编写复杂的应用程序增加了包括类声明在内的重要新语法。其他新特性还包括迭代器、箭头函数表达式、`let` 和 `const` 关键字、类型化数组、新的集合(映射、集合和 WeakMap)、Promise、字符串的模板字元以及许多其它很酷的特性。后来的版本又继续增加了更多的功能,使 JavaScript 更加强大、精简和可靠。 + +### 总结 + +在过去的 20 年里,JavaScript 有了长足的进步。现在大多数浏览器都在争相满足合规性,因此最新的规范推出得更快。 + +根据你的项目需求,有大量稳定的 JavaScript 框架可供选择,包括最流行的 [React][17]、[Angular][18] 和 [Vue.js][19] 等等。在本系列的下一篇文章中,我将深入探讨为什么 JavaScript 如此受欢迎。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/history-javascript + +作者:[Nimisha Mukherjee][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/nimisha +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_javascript.jpg?itok=60evKmGl (Javascript code close-up with neon graphic overlay) +[2]: https://en.wikipedia.org/wiki/JavaScript +[3]: https://en.wikipedia.org/wiki/Jakarta_Server_Pages +[4]: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript +[5]: https://opensource.com/sites/default/files/uploads/layercakewebtech.png (Layer cake of standard web technologies) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://blog.logrocket.com/history-of-frontend-frameworks/ +[8]: https://octoverse.github.com/ +[9]: https://en.wikipedia.org/wiki/ECMAScript +[10]: https://en.wikipedia.org/wiki/Common_Gateway_Interface +[11]: https://en.wikipedia.org/wiki/PHP#:~:text=PHP%20development%20began%20in%201994,Interpreter%22%20or%20PHP%2FFI. +[12]: https://en.wikipedia.org/wiki/JQuery +[13]: https://en.wikipedia.org/wiki/Ajax_(programming) +[14]: https://en.wikipedia.org/wiki/Node.js +[15]: https://en.wikipedia.org/wiki/Backbone.js +[16]: https://en.wikipedia.org/wiki/AngularJS +[17]: https://reactjs.org/ +[18]: https://angular.io/ +[19]: https://vuejs.org/ diff --git a/published/202011/20201028 How to Clear Terminal Screen in Ubuntu and Other Linux Distributions -Beginner-s Tip.md b/published/202011/20201028 How to Clear Terminal Screen in Ubuntu and Other Linux Distributions -Beginner-s Tip.md new file mode 100644 index 0000000000..bb5988667c --- /dev/null +++ b/published/202011/20201028 How to Clear Terminal Screen in Ubuntu and Other Linux Distributions -Beginner-s Tip.md @@ -0,0 +1,87 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12806-1.html) +[#]: subject: (How to Clear Terminal Screen in Ubuntu and Other Linux Distributions [Beginner’s Tip]) +[#]: via: (https://itsfoss.com/clear-terminal-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何清除 Ubuntu 和其他 Linux 发行版的终端屏幕 +====== + +![][2] + +在终端上工作时,通常会发现终端屏幕上显示了太多的命令及其输出。 + +你可能需要清除终端屏幕并专注于要执行的下一个任务。相信我,清除 Linux 终端屏幕会很有帮助。 + +### 使用 clear 命令清除 Linux 终端 + +那么,如何清除 Linux 中的终端?最简单,最常见的方法是使用 `clear` 命令: + +``` +clear +``` + +`clear` 命令无需选项。就是这么简单,但是你还需要了解其他一些内容。 + +![][1] + +`clear` 命令和其他清除屏幕的方法可能取决于你使用的终端模拟器。终端模拟器是用于访问 Linux Shell(命令行)的终端应用。 + +如果你在带有 GNOME 终端的 Ubuntu 上使用 `clear` 命令,它将清除屏幕,并且你将无法看到之前屏幕上的内容。 + +在许多其他终端模拟器或 Putty 中,它可能只清除一页屏幕。如果使用鼠标或 `PageUp` 和 `PageDown` 键滚动,那么仍然可以看到以前的屏幕输出。 + +坦白说,这取决于你的需要。如果你突然意识到需要引用以前运行的命令的输出,那么也许可以使用该方式。 + +### 在 Linux 中清除终端屏幕的其他方法 + +`clear` 命令不是清除终端屏幕的唯一方法。 + +你可以在 Linux 中使用 `Ctrl+L` [键盘快捷键][3]来清除屏幕。它适用于大多数终端模拟器。 + +``` +Ctrl+L +``` + +如果你在 GNOME 终端(Ubuntu 中默认)中使用 `Ctrl+L` 和 `clear` 命令,那么你会注意到它们的影响有所不同。`Ctrl+L` 将屏幕向下移动一页,给人一种干净的错觉,但是你仍然可以通过向上滚动来访问命令输出历史。 + +**某些其他终端模拟器将此键盘快捷键设置为 `Ctrl+Shift+K`**。 + +你也可以使用 `reset` 命令清除终端屏幕。实际上,此命令执行完整的终端重新初始化。但是,它可能比 `clear` 命令要花费更长的时间。 + +``` +reset +``` + +当你想完全清除屏幕时,还有几种其他复杂的方法可以清除屏幕。但是由于命令有点复杂,所以最好将它作为 [Linux 中的别名][4]: + +``` +alias cls='printf "\033c"' +``` + +你可以将此别名添加到你的 bash 配置文件中,以便作为命令使用。 + +我知道这是一个非常基本的主题,大多数 Linux 用户可能已经知道了,但这对于为新 Linux 用户介绍基本主题并没有什么坏处。是不是? + +在清除终端屏幕上有些秘密提示​​吗?为什么不与我们分享呢? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/clear-terminal-ubuntu/ + +作者:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/clear-command-linux.gif?resize=800%2C432&ssl=1 +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/clear-terminal-screen-linux.png?resize=800%2C450&ssl=1 +[3]: https://linuxhandbook.com/linux-shortcuts/ +[4]: https://linuxhandbook.com/linux-alias-command/ diff --git a/published/202011/20201028 What-s new in Fedora 33 Workstation.md b/published/202011/20201028 What-s new in Fedora 33 Workstation.md new file mode 100644 index 0000000000..c4027535d2 --- /dev/null +++ b/published/202011/20201028 What-s new in Fedora 33 Workstation.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12801-1.html) +[#]: subject: (What’s new in Fedora 33 Workstation) +[#]: via: (https://fedoramagazine.org/whats-new-fedora-33-workstation/) +[#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/) + +Fedora 33 Workstation 的新功能 +====== + +![][1] + +Fedora 33 Workstation 是我们这个免费的、领先的操作系统的[最新版本][2]。你现在就可以从[官方网站][3]下载它。Fedora 33 Workstation 中有一些新的和值得注意的变化。请阅读如下更多细节。 + +### GNOME 3.38 + +Fedora 33 Workstation 为各类用户提供了最新版本的 GNOME 桌面环境。在 Fedora 33 Workstation 中的 GNOME 3.38 包含了许多更新和改进,包括: + +#### 一个新的 GNOME Tour 应用 + +现在,新用户会看到一个“新的 Tour 应用,重点展示了桌面的主要功能,并为第一次使用 GNOME 的用户提供一个很好的欢迎页”。 + +![The new GNOME Tour application in Fedora 33][4] + +#### 拖动重排序应用 + +GNOME 3.38 用一个单一的可定制的、一致的视图取代了之前分开的“常用”和“所有”应用视图,这允许你重新排列应用并将它们组织到自定义文件夹中。只需点击并拖动即可移动应用。 + +![GNOME 3.38 Drag to Reorder][5] + +#### 改进屏幕录制 + +GNOME Shell 中的屏幕录制基础架构已被改进,以利用 PipeWire 和内核 API。这将有助于减少资源消耗并提高响应速度。 + +GNOME 3.38 还提供了许多额外的功能和改进。查看 [GNOME 3.38 发行说明][6]以获得更多信息。 + +#### B-tree 文件系统 + +正如[之前宣布的][7],新安装的 Fedora 33 将默认使用 [Btrfs][8]。每一个新的内核版本都会为 Btrfs 增加一些特性和增强功能。[变更日志][9]有一个完整的总结,它介绍了每个新内核版本给 Btrfs 带来的功能。 + +#### Swap on ZRAM + +Anaconda 和 Fedora IoT 多年来一直默认使用 swap-on-zram。在 Fedora 33 中,将默认启用 swap-on-zram,而不是交换分区。查看 [Fedora wiki 页面][10]了解更多关于 swap-on-zram 的细节。 + +#### 默认使用 Nano + +新的 Fedora 33 将把 `EDITOR` 环境变量默认设置为 [nano][11]。这个变化影响了一些命令行工具,当它们需要用户输入时,会打开一个文本编辑器。在早期的版本中,这个环境变量的默认值并没有被指定,而是由各个应用程序来选择一个默认的编辑器。通常情况下,应用程序会使用 [vi][12] 作为它们的默认编辑器,因为它是一个小应用,通常在大多数 Unix/Linux 操作系统的基础安装中都可以使用。由于 Fedora 33 的基本安装中包含了 nano,而且 nano 对于初学者来说更加直观,所以 Fedora 33 将默认使用 nano。当然,想要使用 vi 的用户可以在自己的环境中覆盖 `EDITOR` 变量的值。详见[Fedora 修改请求][11]获取更多信息。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/whats-new-fedora-33-workstation/ + +作者:[Gregory Bartholomew][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/glb/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/10/f33workstation-816x345.jpg +[2]: https://fedoramagazine.org/announcing-fedora-33/ +[3]: https://getfedora.org/workstation +[4]: https://fedoramagazine.org/wp-content/uploads/2020/10/fedora-33-gnome-tour-1.png +[5]: https://fedoramagazine.org/wp-content/uploads/2020/10/drag-to-reorder-1.gif +[6]: https://help.gnome.org/misc/release-notes/3.38/ +[7]: https://fedoramagazine.org/btrfs-coming-to-fedora-33/ +[8]: https://en.wikipedia.org/wiki/Btrfs +[9]: https://btrfs.wiki.kernel.org/index.php/Changelog#By_feature +[10]: https://fedoraproject.org/wiki/Changes/SwapOnZRAM +[11]: https://fedoraproject.org/wiki/Changes/UseNanoByDefault +[12]: https://en.wikipedia.org/wiki/Vi diff --git a/published/202011/20201029 Improve your database knowledge with this MariaDB and MySQL cheat sheet.md b/published/202011/20201029 Improve your database knowledge with this MariaDB and MySQL cheat sheet.md new file mode 100644 index 0000000000..6ef5aef401 --- /dev/null +++ b/published/202011/20201029 Improve your database knowledge with this MariaDB and MySQL cheat sheet.md @@ -0,0 +1,368 @@ +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12822-1.html" +[#]: subject: "Improve your database knowledge with this MariaDB and MySQL cheat sheet" +[#]: via: "https://opensource.com/article/20/10/mariadb-mysql-cheat-sheet" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" + +备忘单:提升你的 MariaDB 和 MySQL 数据库技能 +====== + +> 阅读本文并下载我们的免费备忘单,去使用开源的数据库吧。 + +![](https://img.linux.net.cn/data/attachment/album/202011/14/065421hq1qocmk3rf4npq1.jpg) + +当你写一个程序或配置一个服务时,你最终都要持久化存储信息。有时候,你只需要一个 INI 或者 [YAML][2] 配置文件就够了。而有时候,一个自定义格式的 XML 或者 JSON 或其他类似的文件会更好。 + +但也有时候你需要校验输入、快速查询信息、关联数据、通常还要熟练地处理你的用户的请求。这就是设计数据库的目的,而 [MariaDB][3](由 [MySQL][4] 的原始开发人员开发的一个分支) 是一个极佳的选项。在本文中我使用的是 MariaDB,但这些信息同样适用于 MySQL。 + +通过编程语言与数据库进行交互是很普遍的。正因如此,出现了大量 Java、Python、Lua、PHP、Ruby、C++ 和其他语言的 [SQL][5] 库。然而,在使用这些库之前,理解数据库引擎做了什么以及为什么选择数据库是重要的对我们会很有帮助。本文介绍 MariaDB 和 `mysql` 命令来帮助你熟悉数据库处理数据的基本原理。 + +如果你还没有安装 MariaDB,请查阅我的文章 [在 Linux 上安装 MariaDB][6]。如果你没有使用 Linux,请参照 MariaDB [下载页面][7]提供的指导方法。 + +### 与 MariaDB 交互 + +你可以使用 `mysql` 命令与 MariaDB 进行交互。首先使用子命令 `ping` 确认你的服务是运行着的,在提示后输入密码: + +``` +$ mysqladmin -u root -p ping +Enter password: +mysqld is alive +``` + +为了易于读者理解,打开一个交互式的 MariaDB 会话: + +``` +$ mysql -u root -p +Enter password: +Welcome to the MariaDB monitor. +Commands end with ; or \g. +[...] +Type 'help;' or '\h' for help. +Type '\c' to clear the current input statement. + +MariaDB [(none)]> +``` + +你现在是在一个 MariaDB 子 shell 中,提示符是 MariaDB 提示符。普通的 Bash 命令在这里不能使用,只能用 MariaDB 命令。输入 `help` (或 `?`)查看命令列表。这些是你的 MariaDB shell 的管理命令,使用它们可以定制你的 shell,但它们不属于 SQL 语言。 + +### 学习 SQL 基本知识 + +[结构化查询语言][8]是基于它们的能力定义的:一种通过有规则且一致的语法来查询数据库中的内容以得到有用的结果的方法。SQL 看起来像是普通的英文语句,有一点点生硬。例如,如果你登入数据库服务器,想查看有哪些库,输入 `SHOW DATABASES;` 并回车就能看到结果。 + +SQL 命令以分号作为结尾。如果你忘记输入分号,MariaDB 会认为你是想在下一行继续输入你的查询命令,在下一行你可以继续输入命令也可以输入分号结束命令。 + +``` +MariaDB [(NONE)]> SHOW DATABASES; ++--------------------+ +| DATABASE | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| test | ++--------------------+ +4 ROWS IN SET (0.000 sec) +``` + +上面的例子显示当前有四个数据库:`information_schema`、`mysql`、`performance_schema` 和 `test`。你必须指定 MariaDB 使用哪个库,才能对该库使用查询语句。指定数据库的命令是 `use`。当你选择了一个库后,MariaDB 提示框会切换为选择的库。 + +``` +MariaDB [(NONE)]> USE test; +MariaDB [(test)]> +``` + +#### 显示数据库的表 + +数据库里有*表*,与电子表格类似:有一系列的行(在数据库中称为*记录*)和列。一个行和一个列唯一确定一个*字段*。 + +查看一个数据库中可用的表(可以理解为多表单电子表格中的一页),使用 SQL 关键字 `SHOW`: + +``` +MariaDB [(test)]> SHOW TABLES; +empty SET +``` + +`test` 数据库是空的,所以使用 `use` 命令切换到 `mysql` 数据库: + +``` +MariaDB [(test)]> USE mysql; +MariaDB [(mysql)]> SHOW TABLES; + ++---------------------------+ +| Tables_in_mysql | ++---------------------------+ +| column_stats | +| columns_priv | +| db | +[...] +| time_zone_transition_type | +| transaction_registry | +| USER | ++---------------------------+ +31 ROWS IN SET (0.000 sec) +``` + +这个数据库中有很多表!`mysql` 数据库是这个 MariaDB 实例的系统管理数据库。它里面包含重要数据,比如用来管理数据库权限的用户结构。这个数据库很重要,你不需要经常直接与它交互,但是使用 SQL 脚本来操作它却很常见。当你学习 MariaDB 时理解 `mysql` 数据库很有用,因为它有助于说明一些基本的 SQL 命令。 + +#### 检查一个表 + +这个实例的 `mysql` 数据库的最后一个表名为 `USER`。这个表包含了可以访问这个数据库的用户。当前里面只有一个 root 用户,但是你可以添加不同权限的用户,赋予它们查看、更新或创建数据的权限。你可以查看一个表的列首来了解一个 MariaDB 用户的所有属性: + +``` +> SHOW COLUMNS IN USER; +MariaDB [mysql]> SHOW COLUMNS IN USER; ++-------------+---------------+------+-----+----------+ +| FIELD | TYPE | NULL | KEY | DEFAULT | ++-------------+---------------+------+-----+----------+ +| Host | CHAR(60) | NO | PRI | | +| USER | CHAR(80) | NO | PRI | | +| Password | CHAR(41) | NO | | | +| Select_priv | enum('N','Y') | NO | | N | +| Insert_priv | enum('N','Y') | NO | | N | +| Update_priv | enum('N','Y') | NO | | N | +| Delete_priv | enum('N','Y') | NO | | N | +| Create_priv | enum('N','Y') | NO | | N | +| Drop_priv | enum('N','Y') | NO | | N | +[...] +47 ROWS IN SET (0.001 sec) +``` + +#### 创建一个新的用户 + +不论你是否需要一个普通的账号来管理数据库或者为计算机配置数据库(例如安装 WordPress、Drupal 或 Joomla时),在 MariaDB 中多建一个用户账号是很普遍的。你可以通过向 `mysql` 数据库的 `USER` 表中添加一个用户或使用 SQL 关键字 `CREATE` 来提示 MariaDB 创建一个 MariaDB 用户。使用 `CREATE` 来创建新用户会默认执行一些有用的方法,因此你不需要手动生成所有的信息: + +``` +> CREATE USER 'tux'@'localhost' IDENTIFIED BY 'really_secure_password'; +``` + +#### 查看表的字段 + +你可以使用 `SELECT` 关键字来查看数据库表的字段和值。这本例中,你创建了一个名为 `tux` 的用户,因此查询 `USER` 表中的列: + +``` +> SELECT USER,host FROM USER; ++------+------------+ +| USER | host | ++------+------------+ +| root | localhost | +[...] +| tux | localhost | ++------+------------+ +7 ROWS IN SET (0.000 sec) +``` + +#### 为一个用户赋予权限 + +通过查看 `USER` 表列出的信息,你可以看到用户的状态。例如,新用户 `tux` 对这个数据库没有任何权限。使用 `WHERE` 语句你可以只查 `tux` 那一条记录。 + +``` +> SELECT USER,select_priv,insert_priv,update_priv FROM USER WHERE USER='tux'; ++------+-------------+-------------+-------------+ +| USER | select_priv | insert_priv | update_priv | ++------+-------------+-------------+-------------+ +| tux | N | N | N | ++------+-------------+-------------+-------------+ +``` + +使用 `GRANT` 命令修改用户的权限: + +``` +> GRANT SELECT ON *.* TO 'tux'@'localhost'; +> FLUSH PRIVILEGES; +``` + +验证你的修改: + +``` +> SELECT USER,select_priv,insert_priv,update_priv FROM USER WHERE USER='tux'; ++------+-------------+-------------+-------------+ +| USER | select_priv | insert_priv | update_priv | ++------+-------------+-------------+-------------+ +| tux | Y | N | N | ++------+-------------+-------------+-------------+ +``` + +`tux` 用户现在有了从所有表中查询记录的权限。 + +### 创建自定义的数据库 + +到目前为止,你一直在与默认的数据库进行交互。除了用户管理,大部分人很少会与默认的数据库进行交互。通常,你会用自定义的数据来填充创建的数据库。 + +#### 创建一个 MariaDB 数据库 + +你可能已经可以自己在 MariaDB 中创建新数据库了。创建数据库跟新建用户差不多。 + +``` +> CREATE DATABASE example; +Query OK, 1 ROW affected (0.000 sec) +> SHOW DATABASES; ++--------------------+ +| DATABASE | ++--------------------+ +| example | +[...] +``` + +使用 `use` 命令来把这个新建的数据库作为当前使用的库: + +``` +> USE example; +``` + +#### 创建一个表 + +创建表比创建数据库要复杂,因为你必须定义列首。MariaDB 提供了很多方便的函数,可以用于创建列,引入数据类型定义,自增选项,对空值的约束,自动时间戳等等。 + +下面是用来描述一系列用户的一个简单的表: + +``` +> CREATE TABLE IF NOT EXISTS member ( + -> id INT AUTO_INCREMENT PRIMARY KEY, + -> name VARCHAR(128) NOT NULL, + -> startdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP); +Query OK, 0 ROWS affected (0.030 sec) +``` + +这个表通过使用一个自动递增的方法来唯一标识每一行。表示用户名字的字段不能为空(或 `null`),每一行被创建时会自动生成时间戳。 + +使用 SQL 关键字 `INSERT` 向这个表填充一些示例数据: + +``` +> INSERT INTO member (name) VALUES ('Alice'); +Query OK, 1 ROW affected (0.011 sec) +> INSERT INTO member (name) VALUES ('Bob'); +Query OK, 1 ROW affected (0.011 sec) +> INSERT INTO member (name) VALUES ('Carol'); +Query OK, 1 ROW affected (0.011 sec) +> INSERT INTO member (name) VALUES ('David'); +Query OK, 1 ROW affected (0.011 sec) +``` + +验证一下表里的数据: + +``` +> SELECT * FROM member; ++----+-------+---------------------+ +| id | name | startdate | ++----+-------+---------------------+ +| 1 | Alice | 2020-10-03 15:25:06 | +| 2 | Bob | 2020-10-03 15:26:43 | +| 3 | Carol | 2020-10-03 15:26:46 | +| 4 | David | 2020-10-03 15:26:51 | ++----+-------+---------------------+ +4 ROWS IN SET (0.000 sec) +``` + +#### 同时增加多行数据 + +再创建一个表: + +``` +> CREATE TABLE IF NOT EXISTS linux ( + -> id INT AUTO_INCREMENT PRIMARY KEY, + -> distro VARCHAR(128) NOT NULL); +Query OK, 0 ROWS affected (0.030 sec) +``` + +填充一些示例数据,这次使用 `VALUES` 快捷方式,这样你可以一次添加多行数据。`VALUES` 关键字需要一个用括号包围的列表作为参数,也可以用逗号分隔的多个列表作为参数。 + +``` +> INSERT INTO linux (distro) + -> VALUES ('Slackware'), ('RHEL'),('Fedora'),('Debian'); +Query OK, 4 ROWS affected (0.011 sec) +Records: 4 Duplicates: 0 Warnings: 0 +> SELECT * FROM linux; ++----+-----------+ +| id | distro | ++----+-----------+ +| 1 | Slackware | +| 2 | RHEL | +| 3 | Fedora | +| 4 | Debian | ++----+-----------+ +``` + +### 关联多个表 + +现在你有两个表,之间没有关联。两个表的数据是独立的,但是你可能需要表一中的一个值来识别表二的记录。 + +你可以在表一中新增一列对应表二中的值。因为两个表都有唯一的标识符(自动递增的 `id` 字段),关联的它们的最简单的方式是,使用表一中的 `id` 字段作为表二的查询条件。 + +在表一中创建一列用来表示表二中的一个值: + +``` +> ALTER TABLE member ADD COLUMN (os INT); +Query OK, 0 ROWS affected (0.012 sec) +Records: 0 Duplicates: 0 Warnings: 0 +> DESCRIBE member; +DESCRIBE member; ++-----------+--------------+------+-----+---------+------+ +| FIELD | TYPE | NULL | KEY | DEFAULT | Extra| ++-----------+--------------+------+-----+---------+------+ +| id | INT(11) | NO | PRI | NULL | auto_| +| name | VARCHAR(128) | NO | | NULL | | +| startdate | TIMESTAMP | NO | | cur[...]| | +| os | INT(11) | YES | | NULL | | ++-----------+--------------+------+-----+---------+------+ +``` + +把 `linux` 表中的唯一 ID 分配给每个成员。因为记录已经存在,使用 `UPDATE` 关键字而不是 `INSERT`。尤其是当你想查询某行然后再更新某列值时。语法上,表达方式有点倒装,先更新后查询: + +``` +> UPDATE member SET os=1 WHERE name='Alice'; +Query OK, 1 ROW affected (0.007 sec) +ROWS matched: 1 Changed: 1 Warnings: 0 +``` + +要填充数据,请对其他名字重复执行这个过程。为了数据的多样性,在四行记录中分配三个不同的值。 + +#### 连接表 + +现在这两个表彼此有了关联,你可以使用 SQL 来展示关联的数据。数据库中有很多种连接方式,你可以尽请尝试。下面的例子是关联 `member` 表中 `os` 字段和 `linux` 表中 `id` 字段: + +``` +SELECT * FROM member JOIN linux ON member.os=linux.id; ++----+-------+---------------------+------+----+-----------+ +| id | name | startdate | os | id | distro | ++----+-------+---------------------+------+----+-----------+ +| 1 | Alice | 2020-10-03 15:25:06 | 1 | 1 | Slackware | +| 2 | Bob | 2020-10-03 15:26:43 | 3 | 3 | Fedora | +| 4 | David | 2020-10-03 15:26:51 | 3 | 3 | Fedora | +| 3 | Carol | 2020-10-03 15:26:46 | 4 | 4 | Debian | ++----+-------+---------------------+------+----+-----------+ +4 ROWS IN SET (0.000 sec) +``` + +连接 `os` 和 `id` 字段。 + +在图形化的应用中,你可以想象 `os` 字段可以在下拉菜单中设置,值的来源是 `linux` 表中的 `distro` 字段。通过使用多个表中独立却有关联的数据,你可以保证数据的一致性和有效性,使用 SQL 你可以动态地关联它们。 + +### 下载 MariaDB 和 MySQL 备忘单 + +MariaDB 是企业级的数据库。它是健壮、强大、高效的数据库引擎。学习它是你向管理 web 应用和编写语言库迈出的伟大的一步。你可以[下载 MariaDB 和 MySQL 备忘单][9],在你使用 MariaDB 时可以快速参考。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/mariadb-mysql-cheat-sheet + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[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/coverimage_cheat_sheet.png?itok=lYkNKieP "Cheat Sheet cover image" +[2]: https://www.redhat.com/sysadmin/yaml-tips +[3]: https://mariadb.org/ +[4]: https://www.mysql.com/ +[5]: https://en.wikipedia.org/wiki/SQL +[6]: https://opensource.com/article/20/10/install-mariadb-and-mysql-linux +[7]: https://mariadb.org/download +[8]: https://publications.opengroup.org/c449 +[9]: https://opensource.com/downloads/mariadb-mysql-cheat-sheet \ No newline at end of file diff --git a/published/202011/20201029 Linux Kernel 5.10 Will be the Next LTS Release and it has Some Exciting Improvements Lined Up.md b/published/202011/20201029 Linux Kernel 5.10 Will be the Next LTS Release and it has Some Exciting Improvements Lined Up.md new file mode 100644 index 0000000000..ac2f20a8e5 --- /dev/null +++ b/published/202011/20201029 Linux Kernel 5.10 Will be the Next LTS Release and it has Some Exciting Improvements Lined Up.md @@ -0,0 +1,79 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12807-1.html) +[#]: subject: (Linux Kernel 5.10 Will be the Next LTS Release and it has Some Exciting Improvements Lined Up) +[#]: via: (https://itsfoss.com/kernel-5-10/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Linux 内核 5.10 LTS 的一些令人兴奋的改进 +====== + +> Linux 内核 5.10 的开发正在进行中。已确认这是一个长期支持的版本,将带来更新的硬件支持和其他承诺的功能。 + +### Linux Kernel 5.10 将是长期支持版本 + +主要稳定内核维护者 **Greg Kroah-Hartman** 在 Linux 基金会欧洲开源峰会的 “Ask the Expert” 环节上发言,确认 Linux 5.10 将是下一个 LTS 版本。 + +尽管早期有一些关于 5.9 是 LTS 版本的猜测,但 Greg 澄清说,**一年的最后一个内核版本永远是 LTS 版本**。 + +目前来看,[Linux 内核 5.4][1] 系列恰好是最新的 LTS 版本,它增加了很多改进和硬件支持。另外,考虑到开发进度,Linux [内核 5.8][2] 是目前最大的版本,而 Linux 5.10 的第一个候选版本也很接近,所以下面有很多事情要做。 + +让我们来看看 Linux 内核 5.10 的一些功能和改进。 + +### Linux 内核 5.10 特性 + +![][4] + +**注意:** Linux 内核 5.10 仍处于早期开发阶段。因此,我们将定期更新文章,以更新最新的补充/功能。 + +#### AMD Zen 3 处理器支持 + +新的 [Ryzen 5000][5] 产品线是 2020 年最大的看点之一。所以,随着 Linux 内核 5.10 发布候选版本的推出,针对 Zen 3 处理器的各种新增功能也在陆续推出。 + +#### Intel Rocket Lake 支持 + +我并不对 Intel 的 Rocket Lake 芯片组在明年(2021 年) Q1 出货报太大希望。但是,考虑到英特尔在不断地压榨 14 纳米制程,看到 Intel Rocket Lake 在 Linux 内核 5.10 上所做的工作,绝对是一件好事。 + +#### Radeon RX 6000 系列开源驱动 + +尽管我们是在 Big Navi 揭晓前一天才报道的,但 Radeon RX 6000 系列绝对会是一个令人印象深刻的东西,可以和 NVIDIA RTX 3000 系列竞争。 + +当然,除非它和 Vega 系列或 5000 系列遇到的同样问题。 + +很高兴在 Linux 内核 5.10 上看到下一代 Radeon GPU 的开源驱动已经完成。 + +#### 文件系统优化和存储改进 + +[Phoronix][6] 报道了 5.10 也对文件系统进行了优化和存储改进。所以,从这一点来看,我们应该会看到一些性能上的改进。 + +#### 其他改进 + +毫无疑问,你应该期待新内核带来大量的驱动更新和硬件支持。 + +目前,对 SoundBlaster AE-7 的支持、对 NVIDIA Orin(AI 处理器)的早期支持以及 Tiger Lake GPU 的改进似乎是主要亮点。 + +Linux 内核 5.10 的稳定版本应该会在 12 月中旬左右发布。它将被支持至少 2 年,但可能一直会有安全和 bug 修复更新,直到 2026 年。因此,我们将继续关注下一个 Linux 内核 5.10 LTS 版本的发展,以获得任何令人兴奋的东西。 + +你对即将发布的 Linux 内核 5.10 有什么看法?请在评论中告诉我们你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kernel-5-10/ + +作者:[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://itsfoss.com/linux-kernel-5-4/ +[2]: https://itsfoss.com/kernel-5-8-release/ +[3]: https://twitter.com/gregkh/status/1320745076566433793?ref_src=twsrc%5Etfw +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/kernel-5-10-release.png?resize=800%2C450&ssl=1 +[5]: https://www.tomsguide.com/news/amd-ryzen-5000-revealed-what-it-means-for-pc-gaming +[6]: https://www.phoronix.com/scan.php?page=article&item=linux-510-features&num=1 diff --git a/published/202011/20201030 How to Use apt-cache Command in Debian, Ubuntu and Other Linux Distributions.md b/published/202011/20201030 How to Use apt-cache Command in Debian, Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..32432da3d8 --- /dev/null +++ b/published/202011/20201030 How to Use apt-cache Command in Debian, Ubuntu and Other Linux Distributions.md @@ -0,0 +1,169 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12786-1.html) +[#]: subject: (How to Use apt-cache Command in Debian, Ubuntu and Other Linux Distributions) +[#]: via: (https://itsfoss.com/apt-cache-command/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Debian、Ubuntu 中使用 apt-cache 命令 +====== + +> 使用 apt-cache 命令,你可以在本地 APT 缓存中搜索软件包的详细信息。在本教程中学习使用 apt-cache 命令。 + +### apt-cache 命令是用来干什么的? + +[APT][1] [包管理器][2]工作在软件包元数据的本地缓存上。元数据通常由包名、版本、描述、依赖关系、仓库和开发者等信息组成。通过 `apt-cache` 命令,你可以查询这个本地 APT 缓存并获得相关信息。 + +你可以搜索一个包的可用性、它的版本号、它的依赖关系等等。我将通过实例告诉你如何使用 `apt-cache`命令。 + +APT 缓存的位置是 `/var/lib/apt/lists/` 目录。缓存哪些仓库元数据取决于你的源列表中 `/etc/apt/sources.list` 文件中添加的仓库,以及位于 `/etc/apt/sources.list.d` 目录下的额外仓库文件。 + +令人惊讶的是,`apt-cache` 并不能清除 APT 缓存。为此,你必须[使用 apt-get clean 命令][3]。 + +不用说,APT 打包系统是在 Debian 和基于 Debian 的 Linux 发行版上使用的,比如 Ubuntu、Linux Mint、Elementary OS 等。你不能在 Arch 或 Fedora 上使用它。 + +### 使用 apt-cache 命令 + +![][4] + +就像其他 Linux 命令一样,`apt-cache` 也有一些可用的选项,你可以随时参考它的手册页来了解这些选项。 + +然而,你可能并不需要使用所有的选项。这就是为什么我在本教程中只向你展示 `apt-cache` 命令中最常见和最有用的例子。 + +#### 始终更新 + +更新本地 APT 缓存以与远程仓库同步是一个好主意。如何做到这一点呢?你可以使用命令: + +``` +sudo apt update +``` + +#### 搜索软件包 + +`apt-cache` 命令最常见的用途是查找软件包。你可以使用一个正则表达式来搜索本地 APT 缓存中的包。 + +``` +apt-cache search package_name +``` + +默认情况下,它会在软件包的名称和描述中查找搜索关键词。它按字母顺序显示匹配的软件包及其简短的描述。 + +![][5] + +你也可以缩小搜索范围,只在软件包名称中查找搜索词。 + +``` +apt-cache search --names-only package_name +``` + +![][6] + +如果你想知道所有匹配软件包的完整细节,你可以使用 `--full` 标志。 + +![][7] + +#### 获取详细的包装信息 + +如果你知道确切的软件包名称(或者你已经成功地通过搜索找到了它),你可以得到软件包的详细元数据信息。 + +``` +apt-cache show package_name +``` + +![][8] + +你可以看到软件包元数据中的所有细节,比如名称、版本、开发者、维护者、仓库、长短描述、软件包大小甚至是校验和。 + +还有一个选项 `showpkg` 可以显示软件包的名称、版本、正向和反向依赖关系等信息。 + +``` +apt-cache showpkg package_name +``` + +#### apt-cache 的策略 + +这是 `apt-cache` 命令中很少使用的一个选项。`policy` 选项可以帮助你调试与 [preference 文件][9]相关的问题。 + +如果你指定了软件包的名称,它将显示该软件包是否已经安装,在哪个版本的仓库中可用,以及它的优先级。 + +![][10] + +默认情况下,每个已安装的软件包版本的优先级为 100,未安装的软件包的优先级为 500。同一软件包可能有多个不同优先级的版本。APT 会安装优先级较高的版本,除非安装的版本较新。 + +如果不理解这个部分,也没关系。对于一个普通的 Linux 用户来说,会极少纠结于这么深的软件包管理知识。 + +#### 检查软件包的依赖关系和反向依赖关系。 + +你可以在安装之前(甚至在安装之后)[检查一个包的依赖关系][11]。它还会显示所有可能满足依赖关系的软件包。 + +``` +apt-cache depends package +``` + +![][12] + +你也可以通过 `apt-cahce` 检查反向依赖关系来检查哪些包是依赖于某个包的。 + +![][13] + +坦白说,看到 Ansible 这样的 DevOps 工具对 [Cowsay 这样有趣的 Linux 命令][14]有依赖性,我也很惊讶。我想可能是因为在[安装 Ansible][15]之后,它会在节点上显示一些信息。 + +#### 检查未满足的依赖性 + +你可能会被 [Ubuntu 中未满足的依赖问题][16]所困扰,其他 Linux 也有类似问题。`apt-cache` 命令提供了一个选项来检查系统中各种可用软件包的所有未满足的依赖关系。 + +``` +apt-cache unmet +``` + +![][17] + +### 结论 + +你可以用 `apt-cache` 命令列出所有可用的软件包。输出结果会很庞大,所以我建议将其与 [wc 命令][18] 结合起来,得到可用软件包的总数,就像这样: + +``` +apt-cache pkgnames | wc -l +``` + +你是否注意到你不需要成为 [root 用户][19]就可以使用 `apt-cache` 命令? + +较新的 [apt 命令][20]也有一些与 `apt-cache` 命令相对应的功能选项。由于 `apt` 比较新,所以在脚本中还是首选使用 `apt-get` 及其相关的 `apt-cache` 等命令。 + +希望你觉得本教程对你有帮助。如果你对上面讨论的任何一点有疑问或者有改进的建议,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/apt-cache-command/ + +作者:[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://wiki.debian.org/Apt +[2]: https://itsfoss.com/package-manager/ +[3]: https://itsfoss.com/clear-apt-cache/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-command.png?resize=800%2C450&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-search.png?resize=759%2C437&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-search-names-only.png?resize=759%2C209&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-show-full.png?resize=759%2C722&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-show-pkgname.png?resize=800%2C795&ssl=1 +[9]: https://debian-handbook.info/browse/stable/sect.apt-get.html#sect.apt.priorities +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-policy.png?resize=795%2C456&ssl=1 +[11]: https://itsfoss.com/check-dependencies-package-ubuntu/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-dependency-check.png?resize=768%2C304&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-reverse-dependency.png?resize=768%2C304&ssl=1 +[14]: https://itsfoss.com/funny-linux-commands/ +[15]: https://linuxhandbook.com/install-ansible-linux/ +[16]: https://itsfoss.com/held-broken-packages-error/ +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-unmet.png?resize=759%2C399&ssl=1 +[18]: https://linuxhandbook.com/wc-command/ +[19]: https://itsfoss.com/root-user-ubuntu/ +[20]: https://itsfoss.com/apt-command-guide/ diff --git a/published/202011/20201102 4 cool new projects to try in COPR from October 2020.md b/published/202011/20201102 4 cool new projects to try in COPR from October 2020.md new file mode 100644 index 0000000000..a3e17071d5 --- /dev/null +++ b/published/202011/20201102 4 cool new projects to try in COPR from October 2020.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12810-1.html) +[#]: subject: (4 cool new projects to try in COPR from October 2020) +[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-from-october-2020/) +[#]: author: (frostyx https://fedoramagazine.org/author/frostyx/) + +COPR 仓库中 4 个很酷的新项目(2020.10) +====== + +![][1] + +COPR 是个人软件仓库[集合][2],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。 + +本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 [COPR 用户文档][3]。 + +### Dialect + +[Dialect][4] 使用谷歌翻译将文本翻译成外语。它可以记住你的翻译历史,并支持自动语言检测和文本到语音等功能。用户界面简约,模仿谷歌翻译工具本身,所以它真的很容易使用。 + +![][5] + +#### 安装说明 + +目前[仓库][6]在 Fedora 33 和 Fedora Rawhide 中提供了 Dialect。要安装它,请使用下面的命令: + +``` +sudo dnf copr enable lyessaadi/dialect +sudo dnf install dialect +``` + +### GitHub CLI + +[gh][7] 是一个官方的 GitHub 命令行客户端。它在终端提供了快速的访问,并完全控制你的项目问题、拉取请求和发布。议题(和其他东西)也可以在浏览器中轻松查看,以获得更标准的用户界面,或与他人分享。 + +![][8] + +#### 安装说明 + +目前[仓库][9]在 Fedora 33 和 Fedora Rawhide 中提供了 `gh` 。要安装它,请使用下面的命令: + +``` +sudo dnf copr enable jdoss/github-cli +sudo dnf install github-cli +``` + +### Glide + +[Glide][10] 是一个基于 GStreamer 的极简主义媒体播放器。它可以播放任何 GStreamer 支持的多媒体格式的本地和远程文件。如果你需要一个多平台的具有简单用户界面的媒体播放器,你可能会想试试 Glide。 + +![][11] + +#### 安装说明 + +目前[仓库][12]在 Fedora 32、33 和 Rawhide 中提供了 Glide。要安装它,请使用下面的命令: + +``` +sudo dnf copr enable atim/glide-rs +sudo dnf install glide-rs +``` + +### Vim ALE + +[ALE][13] 是 Vim 文本编辑器的一个插件,它提供了语法和语义错误检查。它还带来了诸如代码修复和许多其他类似于 IDE 的功能,如 TAB 补全、跳转到定义、查找引用、查看文档等。 + +![][14] + +#### 安装说明 + +目前[仓库][15]在 Fedora 31、32、33 和 Rawhide 还有 EPEL8 中提供了 `vim-ale` 。要安装它,请使用下面的命令: + +``` +sudo dnf copr enable praiskup/vim-ale +sudo dnf install vim-ale +``` + +编者注:可在[此处][16]查阅以前的 COPR 文章。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-from-october-2020/ + +作者:[frostyx][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/frostyx/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2017/08/4-copr-945x400.jpg +[2]: https://copr.fedorainfracloud.org/ +[3]: https://docs.pagure.org/copr.copr/user_documentation.html +[4]: https://github.com/gi-lom/dialect +[5]: https://fedoramagazine.org/wp-content/uploads/2020/10/dialect.png +[6]: https://copr.fedorainfracloud.org/coprs/lyessaadi/dialect/ +[7]: https://github.com/cli/cli +[8]: https://fedoramagazine.org/wp-content/uploads/2020/10/github-cli.png +[9]: https://copr.fedorainfracloud.org/coprs/jdoss/github-cli/ +[10]: https://github.com/philn/glide +[11]: https://fedoramagazine.org/wp-content/uploads/2020/10/glide.png +[12]: https://copr.fedorainfracloud.org/coprs/atim/glide-rs/ +[13]: https://github.com/dense-analysis/ale +[14]: https://fedoramagazine.org/wp-content/uploads/2020/10/vim-ale.png +[15]: https://copr.fedorainfracloud.org/coprs/praiskup/vim-ale/ +[16]: https://fedoramagazine.org/?s=COPR diff --git a/published/202011/20201102 4 reasons why JavaScript is so popular.md b/published/202011/20201102 4 reasons why JavaScript is so popular.md new file mode 100644 index 0000000000..4ac7718161 --- /dev/null +++ b/published/202011/20201102 4 reasons why JavaScript is so popular.md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12830-1.html) +[#]: subject: (4 reasons why JavaScript is so popular) +[#]: via: (https://opensource.com/article/20/11/javascript-popular) +[#]: author: (Nimisha Mukherjee https://opensource.com/users/nimisha) + +JavaScript 如此受欢迎的 4 个原因 +====== + +> JavaScript 之所以能在编程语言中名列前茅,是有充分的理由的。 + +![](https://img.linux.net.cn/data/attachment/album/202011/17/102936u1hghm95bbu7xjxg.jpg) + +如 GitHub 的 [The State of the Octoverse][2] 报告的这张图所示,如果按 GitHub 上项目的贡献者数量统计,[JavaScript][3] 一直是最受欢迎的编程语言。 + +![The State of the Octoverse 报告中的热门语言][4] + +*热门语言,根据《The State of the Octoverse》(©2019,[GitHub Corp][2])* + +在本系列的 [上一篇][5] 中,我们深入了解了 JavaScript 的历史。在这篇文章中,我将分享它如此受欢迎的四个[原因][6]。 + +### 1、JavaScript 适合初级、中级和高级开发人员 + +JavaScript 不需要任何环境设置,只要打开浏览器,比如 Chrome 浏览器,导航到[开发者工具][7],就可以开始编码。编写一个 “Hello World” 的程序,就这么简单: + +``` +console.log("Hello World"); +``` + +JavaScript 的灵活性最适合中级开发人员。该语言通过让开发人员专注于解决问题来帮助你完成任务。开发者可以混合使用插件和自己的代码片段来让一个应用程序工作。 + +虽然 JavaScript 比较容易上手,但它也并不是一下子就能掌握的。如果你想达到高级水平,这里有一些你需要了解的概念: + + * **JavaScript 的[多范式][8]特性:** JavaScript 同时支持函数式编程和面向对象编程(OOP)。 + * **在 JavaScript 中应用[设计模式][9]:** 模型-视图-*([MV*][10])设计模式一直是最流行的模式之一,并促成了[多个现代框架][11]的发展。 + * **[带原型链的继承][12]:** JavaScript 由于其动态的特性,无法实现传统的 Java 基于类的模式下的 OOP。JavaScript 中的 OOP 是通过原型继承模型实现的。 + * **[闭包][13]:** 闭包可以从内部函数中访问外部函数的作用域。 + * **[柯里化][14]Currying:** 柯里化是函数的一种转换,它将函数从 `f(a, b, c)` 的调用形式转换为 `f(a)(b)(c)` 调用形式。 + * **[Promises][15] 和 [Observables][16]:** 这些可以帮助你处理异步函数。 + * **[TypeScript][17]:** 在 JavaScript 中添加了静态类型。 + +### 2、全平台 + +JavaScript 可以在任何地方运行,包括: + + * 手机、平板电脑和笔记本电脑等设备。 + * 在客户端和服务器端。 + +这种在任何地方都能运行的能力使 JavaScript 成为一种通用语言。 + +### 3、开放标准和社区 + +[ECMAScript][18] 是 JavaScript 的标准化版本,也是一种开放的标准语言。公司可以使用 ECMAScript 来创建 JavaScript 的实现。根据[维基百科][19],“ECMAScript 引擎是执行以 ECMAScript 语言标准编写的源代码(例如,JavaScript)的程序”。最流行的引擎 [V8][20] 和 [SpiderMonkey][21] 是开源项目。 + +JavaScript 已经存在了 25 年,背后有一个庞大的社区。开发者们简直目不暇接,社区已经构建了如此多的插件和框架,以至于创造了“[框架疲劳][22]”这个词。 + +### 4、现代框架 + +现代框架如 [React][23]、[Angular][24] 和 [Vue.js][25] 已经稳定下来,并且正在进行优化以获得更好的性能。大多数框架对开发者非常友好,有良好的社区支持。 + +### 未来 + +JavaScript 将长期存在。全栈开发和现代前端框架继续帮助 JavaScript 巩固其作为最受欢迎的编程语言之一的地位。 + +JavaScript 的[下一波][26]可能会将焦点放在。 + + * **[Deno][27]:** JavaScript 的现代安全运行时。 + * **网络组件:** 可重复使用的自定义元素。 + * **与 AI 和 ML 的整合:** 像 [Supernova][28] 和 [BAYOU][29] 这样的项目在将 JavaScript 与人工智能和机器学习整合方面取得了实质性的突破。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/javascript-popular + +作者:[Nimisha Mukherjee][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/nimisha +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/javascript_vim.jpg?itok=mqkAeakO (JavaScript in Vim) +[2]: https://octoverse.github.com/ +[3]: https://en.wikipedia.org/wiki/JavaScript +[4]: https://opensource.com/sites/default/files/uploads/toplanguages-the_state_of_the_octoverse.png (Top Languages from The State of the Octoverse report) +[5]: https://linux.cn/article-12813-1.html +[6]: https://medium.com/paul-heintzelman/so-why-is-javascript-so-popular-f35bd6cfeb39 +[7]: https://developers.google.com/web/tools/chrome-devtools +[8]: https://medium.com/javascript-in-plain-english/what-are-javascript-programming-paradigms-3ef0f576dfdb +[9]: https://addyosmani.com/resources/essentialjsdesignpatterns/book/ +[10]: https://developpaper.com/javascript-mv-pattern/ +[11]: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel#JavaScript_frameworks +[12]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain +[13]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures +[14]: https://javascript.info/currying-partials +[15]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise +[16]: https://rxjs-dev.firebaseapp.com/guide/observable +[17]: https://en.wikipedia.org/wiki/TypeScript +[18]: https://en.wikipedia.org/wiki/ECMAScript +[19]: https://en.wikipedia.org/wiki/List_of_ECMAScript_engines +[20]: https://en.wikipedia.org/wiki/V8_%28JavaScript_engine%29 +[21]: https://en.wikipedia.org/wiki/SpiderMonkey +[22]: https://teropa.info/blog/2015/07/15/overcoming-javascript-framework-fatigue.html +[23]: https://en.wikipedia.org/wiki/React_%28web_framework%29 +[24]: https://en.wikipedia.org/wiki/Angular_%28web_framework%29 +[25]: https://en.wikipedia.org/wiki/Vue.js +[26]: https://medium.com/@rangleio/the-future-of-javascript-in-the-front-end-world-2544c1814e2 +[27]: https://en.wikipedia.org/wiki/Deno_%28software%29 +[28]: https://techcrunch.com/2018/03/13/supernova-studio/ +[29]: https://futurism.com/military-created-ai-learned-to-program diff --git a/published/202011/20201102 Understand your Python code with this open source visualization tool.md b/published/202011/20201102 Understand your Python code with this open source visualization tool.md new file mode 100644 index 0000000000..460bdbee1f --- /dev/null +++ b/published/202011/20201102 Understand your Python code with this open source visualization tool.md @@ -0,0 +1,101 @@ +[#]: collector: "lujun9972" +[#]: translator: "xiao-song-123" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12819-1.html" +[#]: subject: "Understand your Python code with this open source visualization tool" +[#]: via: "https://opensource.com/article/20/11/python-code-viztracer" +[#]: author: "Tian Gao https://opensource.com/users/gaogaotiantian" + +使用开源可视化工具来理解你的 Python 代码 +====== + +> VizTracer 工具可以可视化并跟踪 Python 代码,让你可以更深入地了解其工作原理。 + +![](https://img.linux.net.cn/data/attachment/album/202011/13/225531g64gdav22n6d6va9.jpg) + +随着 Python 项目变得越来越大、越复杂,理解起它来就变得充满挑战性。即使是你自己独自编写了整个项目,也不可能完全知道项目是如何工作的。为了能更好的理解你的代码,调试和分析代码变得至关重要。 + +[VizTracer][2] 是一个这样的工具,它通过跟踪和可视化 Python 代码的执行过程,来帮助你对代码的理解。无需对源代码进行任何更改,VizTracer 即可记录函数的入口 / 出口,函数参数 / 返回值以及任意变量,然后通过 [Trace-Viewer][3] 使用直观的谷歌前端界面来显示数据。 + +下面是一个运行[蒙特卡洛树搜索][4]的例子: + +![Monte Carlo tree search visualization][5] + +每个函数都在时间线上以堆栈的形式记录和可视化,这样你就可以看到在运行程序时发生了什么。你可以放大查看任意特定点的详细信息: + +![Zooming in on VizTracer visualization][7] + +VizTracer 还可以自动记录函数参数和返回值。你可以单击函数条目并查看详细信息: + +![Viewing VizTracer details][8] + +或者你可以创建一个全新的信号,并用它来记录变量。例如,这显示了执行梯度下降时的成本值: + +![VizTracer gradient descent][9] + +与其他设置复杂的工具相比,VizTracer 使用起来非常简单,并且没有任何依赖关系。你可以从 pip 安装它: + +``` +pip install viztracer +``` + +你也可以通过输入来跟踪你的程序(`` 是你脚本的名称): + +``` +viztracer +``` + +VizTracer 将在你的工作目录中生成一个 HTML 报告,你可以在 Chrome 浏览器中打开它。 + +VizTracer 还提供了其他高级功能,比如过滤器功能,你可以使用它过滤掉不想跟踪的函数,获得更清晰的报告。例如,要仅包含文件中的函数,你需要: + +``` +viztracer include_files ./ --run +``` + +记录函数参数和返回值: + +``` +viztracer --log_function_args --log_return_value +``` + +记录与某个正则表达式匹配的任意变量: + +``` +# log variables starts with a +viztracer --log_var a.* --run <your_script.py> +``` + +你可以通过对源代码进行较小的修改来获得其他功能,例如自定义事件来记录数值和对象。 + +VizTracer 还包括一个虚拟调试器(vdb),它可以调试 VizTracer 的日志文件。可以用 vdb 调试你运行中的代码(与 [pdb][10] 非常相似)以便你了解代码流。有用的是,它还支持时间回溯,因为它知道发生的一切。 + +与一些原型不同,VizTracer 使用纯 C 语言实现其核心,这将极大地减少开销,使其达到类似于 [cProfile][11] 的水平。 + +VizTracer 是开源的,在 Apache 2.0 许可下发布,支持所有常见的操作系统平台(Linux、macOS 和 Windows)。你可以在 [GitHub][2] 上了解关于它的更多特性并访问源代码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/python-code-viztracer + +作者:[Tian Gao][a] +选题:[lujun9972][b] +译者:[xiao-song-123](https://github.com/xiao-song-123) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gaogaotiantian +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_programming_question.png?itok=cOeJW-8r "Python programming language logo with question marks" +[2]: https://github.com/gaogaotiantian/viztracer +[3]: http://google.github.io/trace-viewer/ +[4]: https://en.wikipedia.org/wiki/Monte_Carlo_tree_search +[5]: https://opensource.com/sites/default/files/uploads/viztracer_mcts.png "Monte Carlo tree search visualization" +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/viztracer_zoomin.png "Zooming in on VizTracer visualization" +[8]: https://opensource.com/sites/default/files/uploads/viztracer_details.png "Viewing VizTracer details" +[9]: https://opensource.com/sites/default/files/uploads/viztracer_gradient.png "VizTracer gradient descent" +[10]: https://docs.python.org/3/library/pdb.html +[11]: https://docs.python.org/2/library/profile.html#module-cProfile diff --git a/published/202011/20201103 4 ways to run Kubernetes locally.md b/published/202011/20201103 4 ways to run Kubernetes locally.md new file mode 100644 index 0000000000..9778b00d30 --- /dev/null +++ b/published/202011/20201103 4 ways to run Kubernetes locally.md @@ -0,0 +1,121 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12825-1.html) +[#]: subject: (4 ways to run Kubernetes locally) +[#]: via: (https://opensource.com/article/20/11/run-kubernetes-locally) +[#]: author: (Bryant Son https://opensource.com/users/brson) + +本地运行 Kubernetes 的 4 种方法 +====== + +> 设置一个本地开发环境,或者直接用这些工具尝试容器编排平台。 + +![](https://img.linux.net.cn/data/attachment/album/202011/16/132219hn9q9dszudbdtn35.jpg) + +[Kubernetes][2] 是一个开源的容器编排平台。它由 Google 开发,为自动化部署、扩展和管理容器化应用提供了一个开源系统。虽然大多数人在云环境中运行 Kubernetes,但在本地运行 Kubernetes 集群不仅是可能的,它还至少有两个好处: + +* 在决定使用 Kubernetes 作为主要平台部署应用之前,你可以快速试用它。 +* 在将任何东西推送到公共云之前,你可以将其设置为本地开发环境,从而实现开发环境和生产环境之间的分离。 + +无论你的情况如何,将本地 Kubernetes 环境设置为你的开发环境都是推荐的选择,因为这种设置可以创建一个安全而敏捷的应用部署流程。 + +幸运的是,有多个平台可以让你尝试在本地运行 Kubernetes,它们都是开源的,并且都是 [Apache 2.0][3] 许可。 + +* [Minikube][4] 的主要目标是成为本地 Kubernetes 应用开发的最佳工具,并支持所有适合的 Kubernetes 特性。 +* [kind][5] 使用 Docker 容器“节点”运行本地 Kubernetes 集群。 +* [CodeReady Containers][6](CRC)用来管理为测试和开发目的优化的本地 OpenShift 4.x 集群。 +* [Minishift][7] 通过在虚拟机 (VM) 内运行单节点的 OpenShift 集群,帮助你在本地运行 OpenShift 3.x 集群。 + +### Minikube + +![Minikube][8] + +[Minikube][10] 是在本地计算机上运行 Kubernetes 环境的最知名、最流行的选择。无论你使用什么操作系统,[Minikube 的文档][11]都会为你提供一个简单的[安装][12]指南。一般来说,安装 Minikube 只需运行两条命令: + +``` +$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-PLATFORM-amd64 +$ sudo install minikube-PLATFORM-amd64 /usr/local/bin/minikube +``` + +Minikube 可在 Linux、macOS 或 Windows 上快速设置本地 Kubernetes 集群,其功能如下: + +* 支持最新的 Kubernetes 版本(包括 6 个以前的小版本) +* 跨平台(Linux、macOS、Windows) +* 以虚拟机、容器或裸机的形式部署 +* 支持多个容器运行时(CRI-O、containerd、Docker) +* 用于快速推送镜像的 Docker API 端点 +* 负载均衡器、文件系统挂载、FeatureGates 和其他高级功能 +* 用于轻松安装 Kubernetes 应用的附加组件 + +因为 Minikube 是一个开源项目,你可以对它的[源代码][4]做贡献。 + +### kind + +![kind][13] + +[kind][14] 的开发者将其描述为“一个使用 Docker 容器‘节点’运行本地 Kubernetes 集群的工具”。它是为测试 Kubernetes 而设计的,但也可能用于本地开发或持续集成。 + +kind 支持: + +* 多节点(包括高可用性)集群 +* 从源码构建 Kubernetes 版本 +* Make/Bash/Docker 或 Bazel,以及预发布构建 +* Linux、MacOS 和 Windows + +此外,kind 是一个经过云原生计算基金会(CNCF)认证的 Kubernetes 合规安装程序。因为它是开源的,你可以在它的 GitHub 仓库中找到 kind 的[源码][5]。 + +### CodeReady Container (CRC) + +![CodeReady Container][15] + +如果你想在本地尝试最新版本的 OpenShift,可以尝试红帽的 [CodeReady Containers][16] (CRC)。CRC 将一个最小的 OpenShift 4.x 集群带到你的本地计算机上,为开发和测试目的提供一个最小的环境。CRC 主要针对开发者的桌面使用。 + +你可以在 GitHub 上找到 CodeReady Container 的[源码][6],也是在 Apache 2.0 许可下提供的。 + +### Minishift + +![Minishift][17] + +[Minishift][7] 项目帮助你在本地用 [OKD][19] 在虚拟机内的单节点 OpenShift 集群[运行一个版本的 OpenShift][18]。你可以用它来[尝试 OpenShift][20],或者在你的本地主机上为云开发。 + +和这个列表中的其他工具一样,Minishift 也是开源的,你可以在 GitHub 上访问它的[源码][7]。 + +### 为人服务的 Kubernetes + +正如你所看到的,有几种方法可以在本地环境中试用 Kubernetes。我有遗漏么?欢迎留言提问或提出建议。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/run-kubernetes-locally + +作者:[Bryant Son][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/brson +[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://kubernetes.io/ +[3]: https://www.apache.org/licenses/LICENSE-2.0 +[4]: https://github.com/kubernetes/minikube +[5]: https://github.com/kubernetes-sigs/kind +[6]: https://github.com/code-ready/crc +[7]: https://github.com/minishift/minishift +[8]: https://opensource.com/sites/default/files/uploads/1_minikube.jpg (Minikube) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://minikube.sigs.k8s.io/docs/ +[11]: https://minikube.sigs.k8s.io/docs +[12]: https://minikube.sigs.k8s.io/docs/start/ +[13]: https://opensource.com/sites/default/files/uploads/2_kind.jpg (kind) +[14]: https://kind.sigs.k8s.io +[15]: https://opensource.com/sites/default/files/uploads/4_crc.jpg (CodeReady Container) +[16]: https://code-ready.github.io/crc +[17]: https://opensource.com/sites/default/files/uploads/3_minishift.jpg (Minishift) +[18]: https://www.redhat.com/sysadmin/kubernetes-cluster-laptop +[19]: https://www.okd.io/ +[20]: https://www.redhat.com/sysadmin/learn-openshift-minishift \ No newline at end of file diff --git a/published/202011/20201103 GnuCash- A Powerful Open Source Accounting Software.md b/published/202011/20201103 GnuCash- A Powerful Open Source Accounting Software.md new file mode 100644 index 0000000000..f8086ecdaa --- /dev/null +++ b/published/202011/20201103 GnuCash- A Powerful Open Source Accounting Software.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12823-1.html) +[#]: subject: (GnuCash: A Powerful Open Source Accounting Software) +[#]: via: (https://itsfoss.com/gnucash/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +GnuCash:一个强大的开源会计软件 +====== + +> GnuCash 是一款流行的自由开源的会计软件,可用于管理个人财务和商业交易。 + +![](https://img.linux.net.cn/data/attachment/album/202011/14/070431j1547hbh3v2j4vhh.jpg) + +考虑到管理个人财务和商业交易的复杂性,你会发现有很多旨在简化这些的在线服务或软件工具。有些工具只是让你添加支出和收入来跟踪你的储蓄,而其他一些工具则提供不同的功能。 + +我在过去已经介绍过几个[开源会计软件][1]。在这里,我将重点介绍其中一个 — **GnuCash**,它是一款很流行的免费会计软件,为所有用户提供了很多功能。 + +### GnuCash: 自由开源的会计软件 + +![][2] + +GnuCash 是一款为专业需求量身定做的免费会计软件,可以追踪交易、股票等。它适用于 Linux、BSD、macOS 和 Windows。 + +虽然刚开始使用可能会让人不知所措,但对于管理个人交易而言很容易使用。在你开始管理一个账户,并添加交易后,你可以得到一个详细的报告。 + +### GnuCash 的功能 + +![][3] + +正如我前面提到的,GnuCash 带来了一大堆功能,这对于一个刚接触会计的人来说可能会让人不知所措,但我认为它应该是值得的: + + * 复式记账 + * 股票/债券/共同基金账户 + * 有税务支持的小企业会计(如印度的商品和服务税) + * 详细的分类报告 + * 便于分析的图表 + * 支持财务计算 + * 自动保存功能 + * 彩色编码 + * 网上银行向导 + * 日志 + * 贷款还款计算器 + * 用于快速计算的价格数据库 + * 每个类别的预算平衡表、流程、图表 + * 能够以 CSV 格式导出 + * 分别添加客户、供应商和雇员记录。 + * 计划交易记录 + * 制定预算的能力 + * 配置账单生成器,以简化会计程序。 + +我不是专家,但这只是冰山一角。你会发现有很多选项可以根据你的会计需求进行定制和设置。 + +![Gnucash Report][4] + +### 在 Linux 上安装 GnuCash + +你可以在你的 Linux 发行版的软件中心找到 GnuCash。从那里安装或使用[发行版的软件包管理器][5]。 + +对于那些想要最新版本的人来说,还可以使用 [Flatpak 包][6]。如果你不知道它,我建议你去看看我们的 [Flatpak 指南][7]。 + +另外,你也可以从源码构建,或者你可以前往他们的[官方下载页面][8]来探索适合你的 Linux 发行版选项。 + +- [GnuCash][9] + +### 总结 + +对于基本的个人理财来说,这对我来说有点复杂,因为我更喜欢安卓应用的简单。不过,如果你试上几分钟,就会发现它很容易理解,GnuCash 似乎可以灵活地满足大多数要求。 + +如果你想管理自己或企业的财务,你可以尝试一下。它绝对比在电子表格中保存数据要好。 :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gnucash/ + +作者:[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://itsfoss.com/open-source-accounting-software/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/gnucash.jpg?resize=800%2C633&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/gnucash-screenshot.jpg?resize=800%2C636&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/gnucash-report.jpg?resize=800%2C638&ssl=1 +[5]: https://itsfoss.com/package-manager/ +[6]: https://flathub.org/apps/details/org.gnucash.GnuCash +[7]: https://itsfoss.com/flatpak-guide/ +[8]: https://www.gnucash.org/download.phtml#distribution +[9]: https://www.gnucash.org diff --git a/published/202011/20201103 Linux Jargon Buster- What are GUI, CLI and TUI in Linux.md b/published/202011/20201103 Linux Jargon Buster- What are GUI, CLI and TUI in Linux.md new file mode 100644 index 0000000000..b75edaa882 --- /dev/null +++ b/published/202011/20201103 Linux Jargon Buster- What are GUI, CLI and TUI in Linux.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12809-1.html) +[#]: subject: (Linux Jargon Buster: What are GUI, CLI and TUI in Linux?) +[#]: via: (https://itsfoss.com/gui-cli-tui/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux 黑话解释:什么是 Linux 中的 GUI、CLI 和 TUI? +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/10/092051zw3ofb365a63fahl.jpg) + +当你开始使用 Linux 并关注关于 Linux 的网站和论坛时,你会经常遇到诸如 GUI、CLI 等术语,有时还会遇到 TUI。 + +这一章的 Linux 黑话解释简要解释了这些术语,以便你作为一个(新的)Linux 用户在使用这些缩写词时能够更好地理解上下文。 + +说实话,像 GUI、CLI 或 TUI 这样的术语并不是 Linux 的专属术语。这些都是通用的计算术语,你会发现在非 Linux 的讨论中也会用到它们。 + +### GUI - 图形用户界面Graphical User Interface + +这可能是你在这里最常遇到的词汇。这是因为我们专注于桌面 Linux 用户,并试图涵盖易于使用的图形化方法和应用程序。 + +GUI 应用程序(或图形应用程序)基本上是指任何可以与你的鼠标、触摸板或触摸屏交互的东西。有了图标和其他视觉概念,你可以使用鼠标指针来访问功能。 + +![GIMP:一个用于照片编辑的GUI应用程序][1] + +在 Linux 上,[桌面环境][2]为你提供了与系统交互的图形界面,然后,你可以使用 GUI 应用程序,如 GIMP,VLC、Firefox、LibreOffice、文件管理器等来完成各种任务。 + +GUI 使普通用户的计算机使用变得更加容易,否则它将仍然是一个极客专用区。 + +### CLI - 命令行界面Command Line Interface + +CLI 基本上是一个接受输入来执行某种功能的命令行程序。基本上,任何可以在终端中通过命令使用的应用程序都属于这一类。 + +![apt-cache 是一个 CLI 工具,用于在基于 Debian 的系统上与 APT 缓存交互][3] + +早期的电脑与操作系统交互没有鼠标,你必须使用命令与机器互动。 + +如果你认为这都算困难,那你应该知道,早期的计算机甚至没有一个屏幕可以看到正在输入的东西,他们用实体的纸质打印机看到他们的输入命令。我从来没有用过这样的电脑,也没有在现实生活中看到过。我用过的最接近的东西是学习期间的单片机套件。 + +![肯•汤普森和丹尼斯•里奇在 PDP11 电脑上开发 UNIX 操作系统][4] + +现在的 CLI 还有用吗?当然有。命令总是有它的好处,特别是当你处理操作系统的核心功能和配置时,比如设置防火墙、管理网络甚至[包管理][5]。 + +你可能会有一个基于 GUI 的应用程序来完成同样的任务,但命令可以让你更精细地访问这些功能。在一些情况下,你会发现 GUI 应用程序也会用命令(在它们的代码中使用)与操作系统交互。 + +![Handbrake GUI 应用程序在底层使用 FFMPEG CLI 工具][6] + +许多流行的 GUI 应用程序往往是基于 CLI 工具的。以[Handbrake][7] 为例。这是一个流行的开源媒体转换器,它底层使用的是 [FFMPEG 命令行][8]工具。 + +很明显,使用命令行工具没有图形工具那么简单。不要担心。除非你有特殊需要,否则你应该可以用图形化的方式使用 Linux 系统。然而,了解基本的 Linux 命令会有很大的帮助。 + +### TUI - 终端用户界面Terminal User Interface(也称为基于文本的用户界面Text-based User Interface) + +这是三者中最不常见的名词。TUI 基本上部分是 GUI,部分是 CLI。糊涂了吗?让我为你解释一下。 + +你已经知道,早期的计算机使用 CLI。在实际的 GUI 出现之前,基于文本的用户界面在终端中提供了一种非常基本的图形交互。你会有更多的视觉效果,也可以使用鼠标和键盘与应用程序进行交互。 + +![终端中的 nnn 文件浏览器][9] + +TUI 是基于文本的用户界面或终端用户界面的缩写。“基于文本”这个说法主要是因为你在屏幕上有一堆文本,而“终端用户界面”的说法是因为它们只在终端中使用。 + +TUI 的应用虽然不是那么常见,但你还是有一些的。[基于终端的 Web 浏览器][10]是 TUI 程序的好例子。[基于终端的游戏][11]也属于这一类。 + +![CMUS 是基于终端的音乐播放器][12] + +当你在 [Ubuntu 中安装多媒体编解码器][13]时,你可能会遇到 TUI,你必须接受 EULA 或做出选择。 + +TUI 应用程序不像 GUI 应用程序那样用户友好,它们经常会有学习曲线,但它们比命令行工具更容易使用一些。 + +### 最后…… + +TUI 应用程序通常也被认为是 CLI 应用程序,因为它们被限制在终端上。在我看来,你是否认为它们与 CLI 不同,这取决于你。 + +我希望你喜欢这篇 Linux 黑话解释。如果你对这个系列的主题有什么建议,请在评论中告诉我,我将在以后尽量涵盖它们。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gui-cli-tui/ + +作者:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2018/04/gimp-2-10-interface.jpg?resize=800%2C450&ssl=1 +[2]: https://itsfoss.com/what-is-desktop-environment/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-search-names-only.png?resize=759%2C209&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/Ken_Thompson_and_Dennis_Ritchie_at_PDP-11.jpg?resize=800%2C641&ssl=1 +[5]: https://itsfoss.com/package-manager/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/11/handbrake.png?resize=800%2C537&ssl=1 +[7]: https://itsfoss.com/handbrake/ +[8]: https://itsfoss.com/ffmpeg/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/nnn-file-browser.jpg?resize=800%2C597&ssl=1 +[10]: https://itsfoss.com/terminal-web-browsers/ +[11]: https://itsfoss.com/best-command-line-games-linux/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/07/cmus-interface.png?resize=734%2C436&ssl=1 +[13]: https://itsfoss.com/install-media-codecs-ubuntu/ diff --git a/published/202011/20201103 The New Raspberry Pi 400 is Basically a Tiny Computer Inside a Keyboard.md b/published/202011/20201103 The New Raspberry Pi 400 is Basically a Tiny Computer Inside a Keyboard.md new file mode 100644 index 0000000000..1a070873f6 --- /dev/null +++ b/published/202011/20201103 The New Raspberry Pi 400 is Basically a Tiny Computer Inside a Keyboard.md @@ -0,0 +1,99 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12793-1.html) +[#]: subject: (The New Raspberry Pi 400 is Basically a Tiny Computer Inside a Keyboard) +[#]: via: (https://itsfoss.com/raspberry-pi-400/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +新的树莓派 400:一台藏身于键盘内微型计算机 +====== + +树莓派是什么已经无需介绍。这台起初是为 DIY 爱好者打造的低规格电脑,现在可以作为全功能桌面使用了。 + +随着树莓派 400 的发布,使得它更加适合作为家庭电脑使用。树莓派 400 基本上是一台藏身于键盘内微型计算机。 + +如果你还记得,[Commodore 64][1] 在 1982 年时也是一台键盘形式的电脑。尽管树莓派 400 并不是独一无二的,但对于树莓派这样的成功产品来说,这是一个令人心仪的产品。 + +### 树莓派 400 概观 + +![][2] + +它是基于树莓派 4 的(带有 4GB 内存),并已调整附加了冷却器。它采用四核处理器,速度比以往更快。 + +除了易用性和便携性,它还可以为你节省很多桌面空间。而且,就像我一样,如果你打算买一台备用电脑来测试东西,我想我可能会选择树莓派 400,而不是组装另一台 PC 或[基于 Linux 的迷你 PC][3]。 + +尽管我在下面提到了它的技术规格,但你可以观看官方视频来了解它的外观,以及它所承诺的是否可以满足作为你的家用电脑的需求。 + +![video](https://www.youtube.com/embed/ZSvHJ97d8n8) + +### 树莓派 400 技术规格 + + * 博通 BCM2711 四核 Cortex-A72(ARM v8)64 位 SoC @ 1.8GHz + * 4GB LPDDR4-3200 + * 双频(2.4GHz 和 5.0GHz)IEEE 802.11b/g/n/ac 无线局域网 + * 蓝牙 5.0,BLE + * 千兆以太网 + * 2 个 USB 3.0 和 1 个 USB 2.0 端口 + * 水平 40 针 GPIO 头 + * 2 个 micro HDMI 端口(支持最高 4Kp60) + * H.265(4Kp60 解码);H.264(1080p60 解码,1080p30 编码);OpenGL ES 3.0 图形 + * micro SD 卡插槽,用于操作系统和数据存储 + * 78 或 79 键的小型键盘(取决于地区差异) + * 5V DC,通过 USB 连接器 + * 工作温度:环境温度 0℃ 至 +50℃。 + * 最大尺寸 286 毫米 × 122 毫米 × 23 毫米 + +![][4] + +### 定价与供应 + +这是你付出 **70** 美元,所能得到的最好的现代家用电脑,只需一个键盘就可以简单的携带到任何地方(你只需要一个屏幕连接)。 + +你可以花 70 美元只买树莓派 400,也可以花 100 美元买完整的套装,它还包括一个 USB 鼠标、micro HDMI 转 HDMI 线、USB-C 电源、一本初学者指南和一张预装了树莓派操作系统的 SD 卡。 + +如果你想知道,对于键盘布局的支持,新闻稿中是这样提到的: + +> 在发布时,我们支持英语(英国和美国)、法语、意大利语、德语和西班牙语的键盘布局,并(首次)提供翻译版的新手指南。在不久的将来,我们计划支持与我们的[官方键盘][5]相同的语言集。 + +换句话说,一开始他们就支持所有主要的键盘布局。所以,对于大多数人来说,这应该不是问题。 + +除了键盘布局的细节外,下面是你如何获得树莓派 400 的方法: + +> 英国、美国和法国的树莓派 400 [套件][6]和[电脑][7]现在就可以购买。意大利、德国和西班牙的产品正在送往树莓派授权经销商的路上,他们应该在下周就会有货。 +> +> 我们预计,印度、澳大利亚和新西兰的授权经销商将在今年年底前拿到套件和电脑。我们也在迅速推出其他地区的合规认证,因此树莓派 400 将在 2021 年的前几个月在全球范围内上市。 +> +> 当然,如果你在剑桥附近的任何地方,你可以前往[树莓派商店][8],今天就可以领取你的树莓派 400。 + +- [树莓派 400][9] + +### 总结 + +在远程办公成为新常态的当下,树莓派 400 绝对是令人印象深刻的好东西,也是非常有用的。 + +你对新的树莓派 400 有什么看法?打算买一台吗?在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/raspberry-pi-400/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Commodore_64 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/raspberry-pi-400.jpg?resize=800%2C554&ssl=1 +[3]: https://itsfoss.com/linux-based-mini-pc/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/raspberry-pi-400-shot.jpeg?resize=800%2C572&ssl=1 +[5]: https://www.raspberrypi.org/products/raspberry-pi-keyboard-and-hub/ +[6]: https://www.raspberrypi.org/products/raspberry-pi-400/ +[7]: https://www.raspberrypi.org/products/raspberry-pi-400-unit/ +[8]: https://www.raspberrypi.org/raspberry-pi-store/ +[9]: https://www.raspberrypi.org/products/raspberry-pi-400 diff --git a/published/202011/20201105 5 surprising ways I use Jupyter to improve my life.md b/published/202011/20201105 5 surprising ways I use Jupyter to improve my life.md new file mode 100644 index 0000000000..8caca94e32 --- /dev/null +++ b/published/202011/20201105 5 surprising ways I use Jupyter to improve my life.md @@ -0,0 +1,89 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12816-1.html) +[#]: subject: (5 surprising ways I use Jupyter to improve my life) +[#]: via: (https://opensource.com/article/20/11/surprising-jupyter) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +5 种令人惊讶的使用 Jupyter 的方式 +====== + +> Jupyter 不仅仅是一个数据分析工具,让我们看看如何以最有创意的方式使用这个基于 Python 的软件。 + +![](https://img.linux.net.cn/data/attachment/album/202011/12/224138d99jlp3q5qjqv5v7.jpg) + +[Jupyter][2] 项目提供了用 JupyterLab 和 Jupyter Notebook 等交互式编写软件的技术方式。这个软件通常用于数据分析,但你可能不知道(Jupyter 社区也没有想到),你可以用它做多少事情。 + +以下是我使用 Jupyter 的五大意想不到的创造性方法。 + +### 1、处理图像 + +在[图像编辑和处理][3]方面,有很多很好的开源工具 —— 从那些可以与 Photoshop 媲美的工具到实验性的 [Glimpse][4]。但即使有这么多选择,有时我还是不想离开 [Python][5] 的世界。 + +幸运的是,Jupyter 是一个做轻量级图像处理的好选择。利用 Jupyter 直接将 [Pillow][6] 对象显示为图像的优势,让你可以尽情地对图片进行实验。我甚至还用它给孩子[做了一个涂色画][7]。 + +### 2、做一个 SSH 跳板遥控器 + +由于 JupyterLab 可以让你[上传和下载][8]文件、[编辑][9]文件,甚至[运行终端][10],所以它拥有制作 SSH 跳板环境所需的所有部件。 + +通过一些 SSH 转发魔法,你可以让 Jupyter 成为防火墙另一边的[远程控制台][11]。 + +### 3、开发 Web 应用程序 + +我最喜欢的使用 Jupyter 的方式之一是用于一种意想不到的软件开发。我[做了一次演讲][12],在演讲中,我使用 Jupyter Notebook 实时开发了一个 [Web 应用][13]。讲演的最后是一个简单的表单,它是 XSS 和 CSS 安全的,并包括一些轻量级的服务器端计算。 + +一个日常的 Jupyter 用户可能不会期望它是一个最棒的 Web 开发环境,但它是一个非常强大的环境。 + +### 4、从你喜欢的服务中提取报告 + +JupyterLab 中的数据分析是一种常见的用法,但自我提升分析self-improvement analysis呢? + +你可以使用 Jupyter 来[分析你的日历][14]。如果你最喜欢的服务允许 API 导出,甚至可以让你导出一个 CSV,你可以将这些与你的日历进行关联。如果你发现你在社交媒体上发帖的时候,你的日历上写着你应该和你的经理开会,那 Jupyter 也救不了你! + +### 5、开发游戏 + +对于扩大对 Jupyter Notebook 的期望值,我最喜欢的方式是和孩子一起建立一个游戏。我之前写过这方面的文章,有一个使用 [PursuedPyBear][16] 和 Jupyter [编写游戏][15]的分步教程。 + +在试图弄清游戏机制时,这种迭代式的游戏开发方法特别有用。能够在游戏中途改变规则(对不起,我必须得这样做)是一个改变游戏规则的方法。 + +你甚至可以使用 IPywidgets 来修改数字参数,就像[这个视频][17]所示。 + +### 下载电子书 + +JupyterLab 和 Jupyter Notebooks 提供了一个不可思议的实验环境。[下载这本指南][18],其中包含了以令人吃惊的方式使用 Jupyter 的教程。  + +你是如何以创造性的方式使用它的?在下面的评论中分享你的最爱。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/surprising-jupyter + +作者:[Moshe Zadka][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/moshez +[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://jupyter.org/ +[3]: https://opensource.com/life/12/6/design-without-debt-five-tools-for-designers +[4]: https://glimpse-editor.github.io/ +[5]: https://opensource.com/resources/python +[6]: https://pillow.readthedocs.io/en/stable/index.html +[7]: https://opensource.com/article/20/8/edit-images-python +[8]: https://jupyterlab.readthedocs.io/en/stable/user/files.html#uploading-and-downloading +[9]: https://jupyterlab.readthedocs.io/en/stable/user/files.html#opening-files +[10]: https://jupyterlab.readthedocs.io/en/stable/user/terminal.html +[11]: https://opensource.com/article/20/8/remote-management-jupyter +[12]: https://opensource.com/article/20/8/write-talk-using-jupyter-notebooks +[13]: https://github.com/moshez/interactive-web-development/blob/e31ae72d8cab7637d18bc734c4e8afc10c60251f/interactive-web-development.ipynb +[14]: https://opensource.com/article/20/9/analyze-your-life-jupyter +[15]: https://opensource.com/article/20/5/python-games +[16]: https://ppb.dev/ +[17]: https://www.youtube.com/watch?v=JaTf_ZT7tE8 +[18]: https://opensource.com/downloads/jupyter-guide diff --git a/published/202011/20201105 Got Kids- Limit Computer Usage Per Account in Linux With Timekpr-nExt.md b/published/202011/20201105 Got Kids- Limit Computer Usage Per Account in Linux With Timekpr-nExt.md new file mode 100644 index 0000000000..50d25c00a5 --- /dev/null +++ b/published/202011/20201105 Got Kids- Limit Computer Usage Per Account in Linux With Timekpr-nExt.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12835-1.html) +[#]: subject: (Got Kids? Limit Computer Usage Per Account in Linux With Timekpr-nExt) +[#]: via: (https://itsfoss.com/timekpr-next/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +有孩子吗?使用 Timekpr-nExt 限制 Linux 中每个账户的电脑使用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/18/004039svxva9wrvva2xias.jpg) + +> 本周的开源软件亮点是 Timekpr-nExt。它是一个 GUI 应用,用于限制 Linux 系统中某些账户的电脑使用。对于不想让孩子花太多时间在电脑上的父母来说,这是一个方便的工具。 + +### 使用 Timekpr-nExt 在 Linux 上限制电脑使用 + +如果你家里有小孩,他们花太多时间在电脑上,你可能想对他们的使用进行一些限制。 + +可以让你根据一天的时间、一天、一周或者一月的小时数来限制某些账户的电脑使用。你也可以设置时间间隔来强制账户用户休息。 + +![][1] + +给定的时间超过后,用户会自动登出,直到满足限制条件才可以重新登录。 + +![][2] + +当然,这意味着你需要为孩子们单独设置非管理员(无 `sudo` 权限)账户。如果孩子们的账户也有管理员权限,他们可以很容易地改变设置。孩子们很聪明,你知道的。 + +### Timekpr-nExt 的功能 + +除了一个令人讨厌的风格化的名字,Timekpr-nExt 有以下功能: + +* 将系统使用限制设置为按日智能限制、每日、每周或每月限制 +* 你还可以根据时间和小时设置访问限制 +* 用户可以看到关于他们还剩多少时间的通知 +* 设置锁定动作(终止会话、关闭、暂停或锁定屏幕) +* 追踪账户的时间使用情况 + +请注意以下事项: + +* 仔细检查你正在配置的账户。**不要把自己锁定** +* 每次更改配置时,请点击应用或设置按钮,否则更改将不会被设置 +* 儿童帐户不应该有管理员操作,否则他们会覆盖设置 + +这里阅读[关于使用 Timekpr-nExt 的更多信息的文档][3]。 + +### 在 Linux 中安装 Timekpr-nExt + +对于基于 Ubuntu 的 Linux 发行版(如 Mint、Linux Lite 等),有一个[官方 PPA 可用][4]。你可以通过以下命令逐步安装它: + +``` +sudo add-apt-repository ppa:mjasnik/ppa +sudo apt update +sudo apt install timekpr-next +``` + +Arch Linux 用户可以[在 AUR 中找到它][5]。对于其他用户,请检查你的发行版仓库。如果没有这样的包,你可以尝试使用源码。 + +- [Timekpr-nExt 源码][6] + +**再说一次,不要在主账户中使用 Timekpr-nExt。你可能会把自己锁在外面。** + +你会看到两个应用的实例。使用开头有 (SU) 的那个。 + +![][7] + +#### 删除 Timekpr-nExt + +我不能确定删除 Timekpr-nExt 是否也会删除你为用户设置的限制。手动恢复他们(间隔一天 24 小时)会是一个好主意。这里没有重置按钮。 + +要删除这个应用(如果你使用 PPA 安装它),使用以下命令: + +``` +sudo apt-get remove --purge timekpr-next +``` + +同时删除 PPA 仓库: + +``` +sudo add-apt-repository -r ppa:mjasnik/ppa +``` + +和[在 Linux 上屏蔽成人内容][8]一样,这个应用也是专门针对儿童的。并不是每个人都会觉得它有用,但家里有小孩的人如果觉得有必要的话,可以使用它。 + +你是否使用其他应用来监控/限制儿童访问计算机? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/timekpr-next/ + +作者:[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://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/timekpr-next-ubuntu.png?resize=800%2C612&ssl=1 +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/timekpr-next-icon-system-notification-area.png?resize=640%2C94&ssl=1 +[3]: https://mjasnik.gitlab.io/timekpr-next/ +[4]: https://launchpad.net/~mjasnik/+archive/ubuntu/ppa +[5]: https://aur.archlinux.org/packages/timekpr-next/ +[6]: https://launchpad.net/timekpr-next +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/timekeeper-next.jpg?resize=799%2C250&ssl=1 +[8]: https://itsfoss.com/how-to-block-porn-by-content-filtering-on-ubuntu/ \ No newline at end of file diff --git a/published/202011/20201105 How to Check Free Disk Space on Linux -Terminal and GUI Methods.md b/published/202011/20201105 How to Check Free Disk Space on Linux -Terminal and GUI Methods.md new file mode 100644 index 0000000000..f8ac5b6f0e --- /dev/null +++ b/published/202011/20201105 How to Check Free Disk Space on Linux -Terminal and GUI Methods.md @@ -0,0 +1,127 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12831-1.html) +[#]: subject: (How to Check Free Disk Space on Linux [Terminal and GUI Methods]) +[#]: via: (https://itsfoss.com/check-free-disk-space-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Linux 上检查可用的磁盘空间 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/17/111346h0vrdvldsy6hlhlh.jpg) + +> 我已经使用了多少磁盘空间? + +在 Linux 上查找可用磁盘空间的最简单的方法是[使用 df 命令][1] 。`df` 命令从字面意思上代表着磁盘可用空间disk free,很明显,它将向你显示在 Linux 系统上的可用磁盘空间。 + +``` +df -h +``` + +使用 `-h` 选项,它将以人类可读的格式(MB 和 GB)来显示磁盘空间。 + +这里是针对我 Dell XPS 系统的 `df` 命令的输出,它使用了加密磁盘并且只安装了 Linux: + +![在 Linux 中使用 df 命令检查可用磁盘空间][2] + +如果上面的输出使你感到困惑,不用担心。我将介绍一些关于在 Linux 中检查可用磁盘空间的东西。我也将为桌面 Linux 用户展示 GUI 方法。 + +### 方法 1: 使用 df 命令来检查在 Linux 中的可用磁盘空间(并理解它的输出) + +当你使用 `df` 命令来检查磁盘空间时,它将显示一组“文件系统”,包括它们的大小、使用的空间和可用的空间。你实际的磁盘通常应该下面列表中的一个: + + * `/dev/sda` + * `/dev/sdb` + * `/dev/nvme0n1p` + +这不是硬性的标准,但是它可以给予你一个指示,它可以让你能够很容易地从一堆文字中辨别出真正的磁盘。 + +你的 Linux 系统在你的磁盘上可能有一些用于引导 分区、EFI 分区、根分区、交换分区、家目录等的分区。在这种情况下,这些分区在“磁盘名称”的结尾处使用一个数字来标示,像 `/dev/sda1`、`/dev/nvme0n1p2` 等等。 + +你可以从它们的挂载点来辨认出哪个分区是用于做什么的。根分区挂载在 `/`、EFI 分区在 `/boot/EFI` 等等。 + +就我的情况来说,我已经使用了根分区下磁盘空间(232 GB)的 41% 。如果你有 2 到 3 个大分区(像根分区、家目录分区等等),你将不得不在这里计算一下已使用的磁盘空间。 + +![理解 df 命令输出][3] + + * `tmpfs`:[tmpfs][4](临时文件系统)用于在虚拟存储器中保持文件。你可以随意地忽略这个虚拟文件系统。 + * `udev`:[udev 文件系统][5] 用于存储插入到你系统的设备(像 USB、网卡、CD ROM 等等)的相关信息。你也可以忽略它。 + * `/dev/loop`: 它们是环回设备。由于 snap 应用程序,在 Ubuntu 中查看磁盘时,你将看到很多的这样的设备。环回设备是虚拟设备,它们允许普通文件作为块设备文件来访问。使用环回设备,snap 应用程序在它们自己的虚拟磁盘中进行沙盒处理。尽管它们是在根分区下,但是你不需要单独计算它们使用的磁盘空间。 + +#### 丢失了磁盘空间?检查你是否挂载了所有是磁盘和分区 + +记住,`df` 命令仅显示已挂载文件系统的磁盘空间。如果你在同一块磁盘上使用多个 Linux 发行版(或者多个操作系统),或者在你的系统上有多个磁盘,你需要先挂载它们,以便查看在这些分区和磁盘上的可用磁盘空间。 + +例如,我的 [Intel NUC][6] 有两个 SSD 磁盘,并且在其上有 4 个或 5 个 Linux 分区。仅当我明确地挂载它们时,`df` 命令才会显示更多磁盘。 + +![][7] + +你可以使用 `lsblk` 命令来查看在你系统上的所有磁盘和分区。 + +![][8] + +在你有了磁盘分区名称后,你可以用这种方式来挂载它: + +``` +sudo mount /dev/sdb2 /mnt +``` + +我希望这种方法能够给你提供一个在 Linux 上检查硬盘驱动器空间的好主意。让我们看看如何在 GUI 下来完成。 + +### 方法 2: 在 GUI 下检查可用磁盘使用情况 + +在 Ubuntu 中使用 “Disk Usage Analyzer” 工具来在 GUI 的方式下检查可用磁盘空间是很容易的。 + +![Disk Usage Analyzer 工具][9] + +在这里,你将看到所有实际的磁盘和分区。你可能需要单击一些分区来挂载它们。它显示所有已挂载分区的磁盘使用情况。 + +![磁盘使用情况检查][10] + +#### 使用 GNOME 的 Disks 实用程序来检查可用磁盘空间 + +除此之外,GNOME 的 Disks 实用程序也是非常容易使用的工具。 + +![GNOME 的 Disks 工具][11] + +启动工具和选择磁盘。选择一个分区来查看可用磁盘空间。如果没有挂载分区,那么先通过单击 “▶” 图标来挂载它。 + +![检查 Ubuntu 的桌面版本的可用磁盘空间][12] + +我认为在 Linux 上的所有主要桌面环境都有某种图形工具来检查磁盘使用情况。你可以在你是桌面 Linux 系统的菜单中搜索它。 + +### 结束语 + +当然,有很多方法和工具来检查磁盘空间。为此,我向你显示了最常用的命令行方法和 GUI 方法。 + +我也解释一些可能会让你很难理解磁盘使用情况的东西。希望你喜欢它。 + +如果你有问题或建议,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/check-free-disk-space-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://linuxhandbook.com/df-command/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/free-disk-space-linux-df-command-output.png?resize=786%2C475&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/df-command-output.png?resize=800%2C600&ssl=1 +[4]: https://www.kernel.org/doc/html/latest/filesystems/tmpfs.html +[5]: https://wiki.debian.org/udev +[6]: https://itsfoss.com/install-linux-on-intel-nuc/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/df-command-ubuntu-1.png?resize=786%2C443&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/lsblk-command-to-see-disks-linux.png?resize=786%2C538&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/disk-usage-analyzer-tool-linux.jpg?resize=800%2C250&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/free-disk-space-ubuntu-desktop.png?resize=800%2C648&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/disks-tool-linux.jpg?resize=800%2C250&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/free-disk-space-check-ubuntu-desktop.png?resize=800%2C600&ssl=1 diff --git a/published/202011/20201105 How to Scan-Detect New LUNs and SCSI Disks on Linux.md b/published/202011/20201105 How to Scan-Detect New LUNs and SCSI Disks on Linux.md new file mode 100644 index 0000000000..7946201c1d --- /dev/null +++ b/published/202011/20201105 How to Scan-Detect New LUNs and SCSI Disks on Linux.md @@ -0,0 +1,163 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12820-1.html) +[#]: subject: (How to Scan/Detect New LUNs and SCSI Disks on Linux) +[#]: via: (https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在 Linux 上扫描/检测新的 LUN 和 SCSI 磁盘 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/14/001530vgyym7779ys09y7m.jpg) + +当 Linux 系统连接到 SAN(存储区域网络)后,你需要重新扫描 iSCSI 服务以发现新的 LUN。 + +要做到这一点,你必须向存储团队提供 Linux 主机的 WWN 号和所需的 LUN 大小。 + +这篇文章将帮助你[查找 Linux 主机的 WWN 号][1]。 + +当存储团队将 LUN 与给定的 Linux 主机进行了映射,他们将为你提供新的 LUN 详细信息。 + +LUN 在存储术语中被称为 LUN 的串行十六进制。 + +你需要扫描 SCSI 主机来寻找存储团队分配的新 LUN。 + +这可以通过两种方式进行,扫描每个 scsi 主机设备或运行 `rescan-scsi-bus.sh` 脚本来检测新磁盘。 + +扫描后可以在 `/dev/disk/by-id` 目录下找到它们。 + +``` +# ll /dev/disk/by-id + +total 0 +lrwxrwxrwx 1 root root 10 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684b -> ../../sdah +lrwxrwxrwx 1 root root 9 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684c -> ../../sdw +. +. +lrwxrwxrwx 1 root root 10 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684d -> ../../sdjk +lrwxrwxrwx 1 root root 10 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684e -> ../../sdaa +lrwxrwxrwx 1 root root 9 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684f -> ../../sdh +``` + +另外,如果你已经用 `multipath` 配置了它们,那么可以用 `multipath` 命令找到。 + +`multipath 主要是配置到 Oracle 数据库服务器中,以提高性能。 + +``` +# multipath -ll + +60a98000486e542d4f5a2f47694d684b dm-37 NETAPP,LUN C-Mode +size=512G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw +|-+- policy='round-robin 0' prio=50 status=active +| |- 1:0:4:18 sdoe 128:416 active ready running +| |- 0:0:4:18 sdpq 131:256 active ready running +| |- 0:0:5:18 sdsr 135:496 active ready running +| `- 1:0:5:18 sdsq 135:480 active ready running +`-+- policy='round-robin 0' prio=10 status=enabled +|- 1:0:1:18 sdfw 131:32 active ready running +|- 1:0:0:18 sdci 69:96 active ready running +|- 0:0:1:18 sdbz 68:208 active ready running +|- 0:0:0:18 sds 65:32 active ready running +|- 1:0:3:18 sdmd 69:336 active ready running +|- 1:0:2:18 sdjj 8:464 active ready running +|- 0:0:3:34 sdjt 65:368 active ready running +`- 0:0:2:34 sdgi 131:224 active ready running +``` + +这个过程适用于基于 Red Hat 6.x、7.x 和 8.x(RHEL - Red Hat Enterprise Linux)的系统,如 CentOS 和 Oracle Linux。 + +### 方法 1:如何使用 /sys 类文件在 Linux 上扫描新的 LUN 和 SCSI 磁盘 + +sysfs 文件系统是一个伪文件系统,它为内核数据结构提供了一个接口。 + +sysfs 下的文件提供了关于设备、内核模块、文件系统和其他内核组件的信息。 + +sysfs 文件系统通常被挂载在 `/sys`。通常,它是由系统自动挂载的。 + +你可以使用 `echo` 命令来扫描每个 SCSI 主机设备,如下所示: + +``` +# echo "- - -" > /sys/class/scsi_host/host[n]/scan +``` + +当你运行上面的重新扫描所有的命令时,三个破折号(`- – -`)指的是通配符选项。这些值如下: + +``` +# echo "c t l" > /sys/class/scsi_host/host[n]/scan +``` + +这里: + +* `c`:HBA 上的通道 +* `t`:SCSI 目标 ID +* `l`:LUN ID +* `n`:HBA 编号 + +运行下面的命令来查找系统中所有的主机总线编号: + +``` +# ls /sys/class/scsi_host +host0 host1 host2 +``` + +得到主机总线编号后,运行以下命令来发现新的磁盘: + +``` +# echo "- - -" > /sys/class/scsi_host/host0/scan +# echo "- - -" > /sys/class/scsi_host/host1/scan +# echo "- - -" > /sys/class/scsi_host/host2/scan +``` + +另外,还可以用 `for` 循环用一条命令进行扫描。 + +``` +# for host in ls /sys/class/scsi_host/;do echo "- - -" >/sys/class/scsi_host/${host}/scan; done +``` + +你可以使用文章开头提到的 [ls 命令][2]来检查它们。 + +``` +# ls /dev/disk/by-id | grep -i "serial-hex of LUN" +``` + +### 方法 2:如何使用 rescan-scsi-bus.sh 脚本在 Linux 上扫描新的 LUN 和 SCSI 磁盘 + +确保你已经安装了 `sg3_utils` 包来使用这个脚本。否则,运行以下命令来安装它。 + +对于 RHEL/CentOS 6/7 系统,使用 [yum 命令][3]安装 `sg3_utils`。 + +``` +# yum install -y sg3_utils +``` + +对于 RHEL/CentOS 8 和 Fedora 系统,使用 [dnf 命令][4]安装 sg3_utils。 + +``` +# dnf install -y sg3_utils +``` + +现在你可以使用 `rescan-scsi-bus.sh` 脚本重新扫描 LUN。 + +``` +# ./rescan-scsi-bus.sh +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-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://www.2daygeek.com/how-to-find-wwn-wwnn-wwpn-number-of-hba-card-in-linux/ +[2]: https://www.2daygeek.com/linux-unix-ls-command-display-directory-contents/ +[3]: https://www.2daygeek.com/linux-yum-command-examples-manage-packages-rhel-centos-systems/ +[4]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ \ No newline at end of file diff --git a/published/202011/20201105 Tweak your Git config for multiple user IDs.md b/published/202011/20201105 Tweak your Git config for multiple user IDs.md new file mode 100644 index 0000000000..746d6fc422 --- /dev/null +++ b/published/202011/20201105 Tweak your Git config for multiple user IDs.md @@ -0,0 +1,74 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12814-1.html) +[#]: subject: (Tweak your Git config for multiple user IDs) +[#]: via: (https://opensource.com/article/20/10/git-config) +[#]: author: (Ramanathan M https://opensource.com/users/muthiahramanathan) + +调整你的 Git 配置以适应多个用户 ID 的需要 +====== + +> 可以使用相同的机器用于工作和个人的 Git 提交,而无需手动重置你的配置。 + +![](https://img.linux.net.cn/data/attachment/album/202011/12/013805t4u4nu57rc6ur7nt.jpg) + +Git 的 [git config][2] 命令可以让你为 Git 设置仓库或全局选项。它有很多选项,其中的一个选项 `includeIf` 在你使用在 Git 时有双重角色时非常方便,比如说,你既是全职的开发者,又在业余时间为开源项目做贡献。在这种情况下,大多数人都不想为两个角色使用一个共同的配置,或者,至少,他们肯定希望保持配置的某些部分是不同的,尤其是当他们在两个角色中使用同一台计算机时。 + +我的情况就是这样,所以我在 Git 配置中保留了两组不同的邮件 ID。这样一来,在我工作场所的项目仓库中提交的内容就会使用我办公室的邮件 ID,而在我个人 GitHub 帐户中提交的内容则使用我个人的邮件 ID。 + +以下是我的全局配置(维护在 `$HOME/.gitconfig`)中的一个片段,我将在下文中介绍。 + +``` +[includeIf "gitdir:~/priv_scm/"] +        path = ~/priv_scm/.gitconfig +[includeIf "gitdir:~/work_scm/"] +        path = ~/work_scm/.gitconfig +``` + +### 什么是 includeIf? + +`includeIf.condition.path` 变量,是 `include` 配置指令的一部分,允许你有条件地设置自定义配置。同时,自定义配置的路径也可以作为指令的一部分来设置。 + +这个指令支持三个关键字:`gitdir`、`gitdir/I` 和 `onbranch`。我将简单解释一下 `gitdir`,我在上面的代码片段中使用了它。你可以在[文档][3]中了解其他两个关键词。 + +在 `includeIf` 指令中使用 `gitdir` 关键字会对模式进行条件检查。根据规则,如果当前工作目录与 `gitdir` 中指定的目录模式相匹配,那么它就会从给定的路径中选取配置。我将在配置片段上应用这个规则来展示它是如何被应用的。 + +在配置片段中,你可以看到一个简单的模式,`~/`,它与 `gitdir` 关键字一起使用。这个模式会被存储在 `$HOME` 环境变量中的值所替代。 + +### 如何使用它 + +如果你使用同一个系统在 GitHub 或 GitLab 上的开源项目上工作,并在工作中提交到 Git 仓库,你可以有两个顶级目录,比如 `$HOME/priv_scm` 和 `$HOME/work_scm`。在这两个目录中,你可以有两个单独的 `.gitconfig` 文件,其中包含与你的 `user.name` 和 `user.email` 相关的设置。然而,它们也可以包含存储在 `$HOME` 的全局 `.gitconfig` 中,它可以保存两个环境通用的所有自定义项。 + +这里是一个例子 `$HOME/priv_scm/.gitconfig` 的片段: + +``` +$ cat $HOME/priv_scm/.gitconfig +[user] +    name  = Ramanathan Muthiah +    email = <personal-mailid-goes-here> +``` + +有了这个配置,你就可以切换目录,并开始在开源项目上工作,而无需手动重置一些与 Git 相关的配置。这些更改会在主 `.gitconfig` 中借助 `includeIf` 条件指令自动处理。 + +### Git 小贴士 + +希望这个小贴士能帮助你组织 Git 项目。你最喜欢的 Git 小贴士是什么?请在评论中分享吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/git-config + +作者:[Ramanathan M][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/muthiahramanathan +[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://git-scm.com/docs/git-config +[3]: https://git-scm.com/docs/git-config#_conditional_includes diff --git a/published/202011/20201106 Reclaim hard-drive space with LVM.md b/published/202011/20201106 Reclaim hard-drive space with LVM.md new file mode 100644 index 0000000000..e40862864f --- /dev/null +++ b/published/202011/20201106 Reclaim hard-drive space with LVM.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12864-1.html) +[#]: subject: (Reclaim hard-drive space with LVM) +[#]: via: (https://fedoramagazine.org/reclaim-hard-drive-space-with-lvm/) +[#]: author: (Troy Curtis Jr https://fedoramagazine.org/author/troycurtisjr/) + +使用 LVM 扩展卷空间 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/27/193719d3df4p4z748f33f3.jpg) + +LVM 是一个逻辑卷管理工具,包括分配磁盘、条带化、镜像和调整逻辑卷的大小。它在 Fedora 安装中被普遍使用(在 BTRFS 作为默认文件系统之前是 LVM + Ext4)。但是你是否曾经遇到过启动系统时,GNOME 提示 home 卷几乎没有空间了!幸运的是,很有可能有一些空间在另一个卷中,而未被使用,可以用于重新分配。下面就来看看如何用 LVM 回收硬盘空间。 + +在卷之间轻松重新分配空间的关键是[逻辑卷管理器(LVM)][2]。Fedora 32 及以前的系统默认使用 LVM 来划分磁盘空间。这种技术类似于标准的硬盘分区,但 LVM 更加灵活。LVM 不仅可以实现灵活的卷大小管理,还可以实现一些高级功能,比如读写快照、在多个硬盘上进行数据条带化或镜像、将高速硬盘作为慢速硬盘的缓存等等。所有这些高级选项可能会让人有点不知所措,但调整卷的大小很简单的。 + +### LVM 基础 + +**卷组**(VG)作为 LVM 系统中的主要容器。默认情况下,Fedora 只定义了一个卷组,但你可以根据需要定义多个卷组。实际的硬盘和硬盘分区被添加到卷组中作为**物理卷**(PV)。物理卷会将可用的空间添加到卷组中。一个典型的 Fedora 安装有一个格式化的启动分区,其余的硬盘是一个配置为 LVM 物理卷的分区。 + +从这个可用空间池中,卷组分配了一个或多个**逻辑卷**(LV)。这些卷类似于硬盘分区,但没有磁盘上连续空间的限制。LVM 的逻辑卷甚至可以跨越多个设备!就像硬盘分区一样,逻辑卷有一个定义的大小,可以包含任何文件系统,然后可以挂载到特定的目录。 + +### 需要什么 + +在 gnome-disks 应用中确认系统使用 LVM ,并确保其他卷中有可用的空间。如果没有可以从另一个卷中回收的空间,这个指南就没有用。还需要一个 [Fedora 临场 CD/USB][3]。任何需要收缩的文件系统都必须卸载。从临场Live镜像运行,可以让硬盘上的所有卷保持未挂载状态,甚至包括像 `/` 和 `/home` 这样的重要目录。 + +![Use gnome-disks to verify free space][4] + +### 一句话警告 + +按照这个指南,应该不会丢失任何数据,但它确实会使用一些非常底层和强大的命令。一个错误可能会破坏硬盘上的所有数据。所以要先备份磁盘上的所有数据! + +### 调整 LVM 卷的大小 + +开始时,启动 Fedora 临场镜像并在对话框中选择 “Try Fedora”。接下来,使用 “Run Command” 启动 “blivet-gui” 应用(按 `Alt-F2`,输入 `blivet-gui`,然后按回车)。选择左侧 “LVM” 下的卷组。逻辑卷在右边。 + +![Explore logical volumes in blivet-gui][5] + +逻辑卷标签由卷组名称和逻辑卷名称组成。在本例中,卷组是 `fedora_localhost-live`,分配了 `home`、`root` 和 `swap` 逻辑卷。要找到完整的卷,选择每一个卷,点击“齿轮”图标,然后选择 “resize”。调整大小对话框中的滑块表示卷的允许大小。左边的最小值是文件系统中已经使用的空间,所以这是最小可能的尺寸大小(不删除数据)。右边的最大值是基于卷组中的最大可用空间。 + +![Resize dialog in blivet-gui][6] + +灰色的 “resize” 选项意味着该卷已经满了,而且卷组中没有可用空间。 + +现在可以更改大小了!查看所有的卷,就像上面的截图那样,找到一个有足够空间的卷。并像上面的截图那样,在所有的卷中找到一个有大量额外空间的卷。向左移动滑块来设置新的大小。腾出足够的空间对整个卷有用,但仍然要为未来的数据增长留出足够的空间。否则,这个卷将是下一个被填满的卷。 + +点击 “resize”,注意卷列表中出现了一个新项目:“free space”。现在选择这次要调整的卷,并将滑块一直向右移动。按 “resize” 键,并查看新改进的卷的布局。然而,硬盘驱动器上的任何东西现在都还没有改变。点击“勾选”选项将更改提交到磁盘。 + +![Review changes in blivet-gui][7] + +查看更改的摘要,如果一切看起来都是正确的,点击 “Ok” 继续。等待 “blivet-gui” 完成。现在重新启动回到 Fedora,可以使用之前被充满的卷上的新空间了。 + +### 为未来计划 + +要知道任何特定卷在未来需要多少空间是很困难的。与其立即分配所有可用的空闲空间,不如考虑在卷组中留出空闲空间。事实上,Fedora Server 默认在卷组中保留空间。当一个卷处于在线和使用中时,扩展卷是可能的。不需要临场镜像或重启。当一个卷几乎满的时候,可以使用部分可用空间轻松扩展卷并继续工作。遗憾的是,默认的磁盘管理器 gnome-disks 不支持 LVM 卷的大小调整,所以安装 [blivet-gui][8] 作为图形化管理工具。另外,还有一个简单的终端命令来扩展卷: + +``` +lvresize -r -L +1G /dev/fedora_localhost-live/root +``` + +### 总结 + +用 LVM 回收硬盘空间只是 LVM 功能的表面。大多数人,特别是在桌面中,可能不需要更高级的功能。然而,当需要的时候,LVM 就在那里,尽管它的实现可能会变得有点复杂。从 [Fedora 33][10] 开始,[BTRFS][9] 是默认的文件系统,没有 LVM。BTRFS 可以更容易管理,同时对于大多数常见的使用来说也足够灵活。查看最近 [Fedora Magazine 关于 BTRFS 的文章][11]了解更多。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/reclaim-hard-drive-space-with-lvm/ + +作者:[Troy Curtis Jr][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/troycurtisjr/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/lvm-resize-816x345.jpg +[2]: http://sourceware.org/lvm2/ +[3]: https://getfedora.org/en/workstation/download/ +[4]: https://fedoramagazine.org/wp-content/uploads/2020/11/gnome-disks.png +[5]: https://fedoramagazine.org/wp-content/uploads/2020/11/blivet-overview.png +[6]: https://fedoramagazine.org/wp-content/uploads/2020/11/blivet-resize-1024x525.png +[7]: https://fedoramagazine.org/wp-content/uploads/2020/11/blivet-summary-1024x525.png +[8]: https://fedoraproject.org/wiki/Blivet-gui +[9]: https://fedoramagazine.org/btrfs-coming-to-fedora-33/ +[10]: https://fedoramagazine.org/whats-new-fedora-33-workstation/ +[11]: https://fedoramagazine.org/btrfs-snapshots-backup-incremental/ diff --git a/published/202011/20201110 What I love about the newest GNOME desktop.md b/published/202011/20201110 What I love about the newest GNOME desktop.md new file mode 100644 index 0000000000..0246663267 --- /dev/null +++ b/published/202011/20201110 What I love about the newest GNOME desktop.md @@ -0,0 +1,78 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12839-1.html) +[#]: subject: (What I love about the newest GNOME desktop) +[#]: via: (https://opensource.com/article/20/11/new-gnome) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +我喜欢最新的 GNOME 桌面 +====== + +> 看看 GNOME 3.38 桌面最重要的新功能。 + +![](https://img.linux.net.cn/data/attachment/album/202011/18/225213tmv6aeev1x0t1p4k.jpg) + +Fedora 33 [刚出来][2],我就马上安装了它。在这个新版 Linux 发行版的众多功能中,其中之一是最新的 GNOME 桌面。GNOME 3.38 于 2020 年 9 月发布,我很喜欢它。 + +### 我为什么喜欢 GNOME 3.38? + +GNOME 3.38 [发布说明][3]中列出了这次更新中的一些重大的新功能。其中,新用户的欢迎页面有了重大改版,现在更加容易使用,如果你是新用户的话,它提供了更多有用的信息。 + +![The new "Welcome GNOME"][4] + +我还喜欢在 GNOME 应用概览中拖动来重新排列应用图标的功能。这让我在 GNOME 下组织我一直使用的应用变得轻而易举。你甚至可以将图标拖放到一起,并自动将它们放入一个文件夹。 + +![GNOME 3.38 Application Overview][7] + +我的家人在不同的时区,更新后的 GNOME 时钟使得添加新的世界时钟变得更加容易,所以当我给家人打电话时,我不必弄清楚现在是什么时间,他们是早一个小时还是晚一个小时?我只需查看 GNOME 时钟,就能一目了然地看到每个人的当地时间。另外,虽然我并不经常使用闹钟功能,但我喜欢我可以自己设置铃声持续时间和每个闹钟的默认“打盹”时间。 + +![Adding a new world clock in GNOME Clocks][8] + +除了所有这些功能更新之外,GNOME 3.38 中最大的改进是性能。正如 GNOME 开发者 Emmanuele Bassi [今年早些时候的解释][9]:“GNOME 中的每个人都为使速度更快而做了很多工作,即使是在树莓派等这样受限的系统上运行的人也是如此。为了让 GNOME 表现得更好,大家做了很多工作。因为人们真的很关心它”。而这一点在新版本中体现得淋漓尽致!GNOME 桌面感觉反应更灵敏。 + +![Applications running on GNOME 3.38][10] + +作为我的咨询和培训业务的一部分,我经常在几个打开的应用之间切换,包括 LibreOffice、GIMP、Inkscape、Web 浏览器等。在 GNOME 3.38 中,启动一个新的应用或在打开的应用之间切换感觉更快。 + +### 除了一件事 + +如果说新版 GNOME 中有什么我不喜欢的地方,那就是重新设计的屏幕截图工具。我一直使用这个工具来抓取屏幕上的一部分内容,并将其插入到我的演示文稿和培训文档中。 + +![GNOME Screenshot tool][11] + +当我浏览用户界面或电脑屏幕时,我自然会像阅读书籍或杂志那样浏览:从左到右,从上到下。当我使用新的屏幕截图工具进行屏幕截图时,我从左上角开始,然后进行选择。大多数时候,我只需要改变选区的捕捉区域,所以我点击那个按钮,然后寻找截图的按钮。但我总是要花点时间才能找到左上角的**截图**按钮。它并不在窗口的底部,也不是我希望找到它的地方。 + +![GNOME Screenshot tool][12] + +到目前为止,这似乎是我在 GNOME 3.38 中唯一的烦恼。总的来说,我对新的 GNOME 感到非常兴奋。我希望你也是! + +要了解更多关于 GNOME 3.38 的信息,请访问 [GNOME 网站][13]或阅读 [GNOME 3.38 公告][5]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/new-gnome + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_browser_web_desktop.png?itok=Bw8ykZMA (Digital images of a computer desktop) +[2]: https://fedoramagazine.org/announcing-fedora-33/ +[3]: https://help.gnome.org/misc/release-notes/3.38/ +[4]: https://opensource.com/sites/default/files/uploads/welcome-tour.png (The new "Welcome GNOME" ) +[5]: https://www.gnome.org/news/2020/09/gnome-3-38-released/ +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/app-overview.png (GNOME 3.38 Application Overview) +[8]: https://opensource.com/sites/default/files/uploads/world-clocks.png (Adding a new world clock in GNOME Clocks) +[9]: https://opensource.com/article/20/7/new-gnome-features +[10]: https://opensource.com/sites/default/files/uploads/desktop-busy.png (Applications running on GNOME 3.38) +[11]: https://opensource.com/sites/default/files/uploads/gnome-screenshot-tool.png (GNOME Screenshot tool) +[12]: https://opensource.com/sites/default/files/uploads/screenshot-tool-path.png (GNOME Screenshot tool) +[13]: https://www.gnome.org/ diff --git a/published/202011/20201111 Using Fedora 33 with Microsoft-s WSL2.md b/published/202011/20201111 Using Fedora 33 with Microsoft-s WSL2.md new file mode 100644 index 0000000000..fb2f0d24bd --- /dev/null +++ b/published/202011/20201111 Using Fedora 33 with Microsoft-s WSL2.md @@ -0,0 +1,112 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12845-1.html) +[#]: subject: (Using Fedora 33 with Microsoft’s WSL2) +[#]: via: (https://fedoramagazine.org/wsl-fedora-33/) +[#]: author: (Jim Perrin https://fedoramagazine.org/author/jperrin/) + +通过微软的 WSL2 使用 Fedora 33 +====== + +![][1] + +如果你像我一样,你可能会发现自己因为各种原因而运行 Windows,无论是因为工作还是游戏。当然,你可以在虚拟机或容器中运行 Fedora,但这些并不像 Windows 的 Linux 子系统(WSL)那样容易融合到普通的 Windows 体验中。通过 WSL 使用 Fedora 可以让你将这两种环境融合在一起,创造一个奇妙的开发环境。 + +### 先决条件 + +为了达成这一目标,你需要一些基本条件。你应该运行 Windows 10,并且已经安装了 WSL2。如果没有,请查看[微软文档说明][4],完成后再回来这里。微软建议为了简单起见,将 WSL2 设置为发行版的默认设置。本指南假设你已经这样做了。 + +接下来,你将需要一些解压 xz 压缩文件的方法。你可以用另一个基于 WSL 的发行版来解压,或者使用 [7zip][5]。 + +### 下载 Fedora 33 rootfs + +由于 Fedora 并没有提供实际的 rootfs 存档,所以我们将借用一个用于生成 Dockerhub 容器镜像的存档。你需要从 fedora-cloud 的 GitHub 仓库下载该 [tar.xz 文件][6] 。一旦你有了这个 tar.xz 文件,解压它,但不要展开 tar 包。你会得到一个类似 `fedora-33-时间标签.tar` 的文件。有了这个文件,你就可以构建镜像了。 + +### 组合 WSL Fedora 的构建版本 + +我喜欢使用 `c:\distros` 目录,但你可以选择几乎任何你想要的位置。无论你选择什么目录,在你导入该构建版本之前,确保其顶层路径存在。现在打开一个 CMD 或 Powershell 提示符,因为是时候导入了: + +``` +wsl.exe --import Fedora-33 c:\distros\Fedora-33 $HOME\Downloads\fedora-33.tar +``` + +你会看到 Fedora-33 显示在 WSL 的列表当中: + +``` +PS C:\Users\jperrin> wsl.exe -l -v + NAME STATE VERSION + Fedora-33 Stopped 2 +``` + +下面,你就可以开始在 WSL 中摆弄 Fedora 了,但我们还需要做一些事情来使它真正成为一个有用的 WSL 发行版。 + +``` +wsl -d Fedora-33 +``` + +这将以 root 用户的身份启动 Fedora 的 WSL 实例。下面,你将安装一些核心包并设置一个新的默认用户。你还需要配置 `sudo`,否则你将无法在以后需要安装其他东西时轻松提升权限。 + +``` +dnf update +dnf install wget curl sudo ncurses dnf-plugins-core dnf-utils passwd findutils +``` + +`wslutilites` 使用 `curl` 和 `wget` 来实现与 VS Code 的集成,所以它们很有用。由于你需要使用 COPR 仓库,你需要增加 `dnf` 功能。 + +### 添加你的用户 + +现在是时候添加你的用户,并将其设置为默认用户。 + +``` +useradd -G wheel 用户名 +passwd 用户名 +``` + +现在,你已经创建了你的用户名,并添加了密码,确保它们可以工作。退出 WSL 实例,并再次启动它,这次指定用户名。你还要测试 `sudo`,并检查你的 uid。 + +``` +wsl -d Fedora-33 -u 用户名 +$id -u +1000 +$ sudo cat /etc/shadow +``` + +假设一切正常,你现在已经准备好在 Windows 中为你的 Fedora 环境设置默认用户。要做到这一点,请退出 WSL 实例并回到 Powershell 中。这个 Powershell 单行代码可以正确配置你的用户: + +``` +Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\\*\ DistributionName | Where-Object -Property DistributionName -eq Fedora-33  | Set-ItemProperty -Name DefaultUid -Value 1000 +``` + +现在你应该可以再次启动 WSL,而不需要指定就可以成为自己的用户而不是 root。 + +### 自定义! + +至此,你已经有了可以在 WSL 中运行的基本 Fedora 33 环境,但它还没有 Windows 集成的部分。如果你想要这个,有一个 COPR 仓库可以启用。如果你选择添加这部分,你就可以直接在 shell 里面运行 Windows 应用,也可以轻松地将你的 Linux 环境与 VS Code 集成。需要注意的是,COPR 并没有得到 Fedora 基础架构的官方支持。使用该软件包,风险自担。 + +``` +dnf copr enable trustywolf/wslu +``` + +现在你可以去配置终端、设置一个 Python 开发环境,或者其它你想使用 Fedora 33 的方式。享受吧! + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/wsl-fedora-33/ + +作者:[Jim Perrin][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/jperrin/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/wsl-fedora33-816x345.jpg +[2]: https://unsplash.com/@matthias_heil?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/windows?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://docs.microsoft.com/en-us/windows/wsl/install-win10 +[5]: https://www.7-zip.org/download.html +[6]: https://github.com/fedora-cloud/docker-brew-fedora/tree/33/x86_64 diff --git a/published/202011/20201112 How to Install Google Chrome on Fedora -Beginner-s Tutorial.md b/published/202011/20201112 How to Install Google Chrome on Fedora -Beginner-s Tutorial.md new file mode 100644 index 0000000000..e78e3a2c92 --- /dev/null +++ b/published/202011/20201112 How to Install Google Chrome on Fedora -Beginner-s Tutorial.md @@ -0,0 +1,124 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12856-1.html) +[#]: subject: (How to Install Google Chrome on Fedora [Beginner’s Tutorial]) +[#]: via: (https://itsfoss.com/install-google-chrome-fedora/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 Fedora 上安装 Google Chrome 浏览器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/25/094346ig44av4l4lzh1v7t.jpg) + +Fedora 的默认网页浏览器是 Firefox。尽管它是一个优秀的网络浏览器,你可能更喜欢流行的 Google Chrome 浏览器。 + +如果你想知道如何在 Fedora 上安装 Google Chrome 浏览器,让我告诉你两种安装 Google Chrome 浏览器的方式:图形化方式和命令行方式。 + +* [图形化方式 1:通过启用 Fedora 第三方仓库从软件中心安装 Chrome 浏览器][1] +* [图形化方式 2:从谷歌浏览器网站下载 RPM 文件][2] +* [命令行方式:从 Fedora 第三方仓库安装 Chrome,一切使用命令(与 GUI 方式 1 相同)][3] + +这全取决于你喜欢哪种方式。你在 [Fedora][4] 上的 Google Chrome 浏览器都将通过这三种方式的系统更新获取定期更新。 + +### 方式 1:在 Fedora 中从软件中心安装 Google Chrome + +Fedora 提供了一个第三方仓库,其中包含了一些流行的专有软件、图形驱动程序。Google Chrome 就是其中之一。 + +第一步,确保在 Fedora 中启用第三方仓库。你应该在软件中心中看到这个选项。 + +![Step1: Fedora Third Party Repositories][5] + +启用后,只需在软件中心搜索 Chrome: + +![Step 2: Search for Chrome In Fedora Software Center][6] + +并从那里安装它: + +![Step 3: Install Chrome Fedora][7] + +还有比这更简单的吗?我觉得没有。 + +### 方式 2:在 Fedora 上从 Chrome 网站安装 Google Chrome + +如果你不想启用第三方仓库,也没关系。你不必这样做。你可以从 Chrome 的网站上下载 RPM 文件,双击并安装它。 + +访问 Google Chrome 的网站,点击下载按钮。 + +- [获取 Google Chrome][8] + +![][9] + +然后选择 .rpm 包,点击“接受并安装”。 + +![][10] + +下载结束后,双击文件,在包管理器提示时点击安装。输入密码,等待安装完成。 + +![][11] + +这是超级简单的,对吧?让我们来看看有点复杂的方式(如果你不是一个终端爱好者)。 + +### 方式 3:使用命令行在 Fedora 上安装 Chrome + +首先,你需要添加额外的 Fedora 仓库(你在方式 1 中看到的): + +``` +sudo dnf install fedora-workstation-repositories +``` + +然后启用 Google Chrome 仓库。 + +``` +sudo dnf config-manager --set-enabled google-chrome +``` + +![][12] + +要安装 Google Chrome 稳定版,请在终端运行以下命令。 + +``` +sudo dnf install google-chrome-stable +``` + +你会看到一个导入 GPG 密钥的警告,输入 `y` 继续。 + +![][13] + +你正在添加 Google Chrome 仓库。这个软件包来自这个仓库,它直接来自 Google。 + +### 总结 + +即使你使用命令行,在 Fedora 上安装 Google chrome 也相当简单。除了第三方仓库的部分,这和[在 Ubuntu 上安装 Chrome][14] 差不多。 + +现在你已经安装好了,你可能会想[查看我们的 Google Chrome 键盘快捷键列表][15]来更快地使用浏览器。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-google-chrome-fedora/ + +作者:[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]: tmp.VFVwBw56ac#gui-method-1 +[2]: tmp.VFVwBw56ac#gui-method-2 +[3]: tmp.VFVwBw56ac#cli-method +[4]: https://getfedora.org/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-third-party-repositories.jpg?resize=800%2C400&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/chrome-in-fedora.png?resize=800%2C400&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/installing-chrome-fedora.png?resize=800%2C400&ssl=1 +[8]: https://www.google.com/chrome/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-1.jpeg?resize=800%2C374&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/3.-download-rpm-chrome.png?resize=800%2C600&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/4.-install-chrome-fedora.png?resize=800%2C550&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/1.-Fedora-extra-repos.png?resize=800%2C550&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/2.-Fedora-GPG-key.png?resize=800%2C550&ssl=1 +[14]: https://itsfoss.com/install-chrome-ubuntu/ +[15]: https://itsfoss.com/google-chrome-shortcuts/ \ No newline at end of file diff --git a/published/202011/20201112 How to Install and Use Etcher on Linux for Making Live Linux USB.md b/published/202011/20201112 How to Install and Use Etcher on Linux for Making Live Linux USB.md new file mode 100644 index 0000000000..74ab8519d5 --- /dev/null +++ b/published/202011/20201112 How to Install and Use Etcher on Linux for Making Live Linux USB.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12847-1.html) +[#]: subject: (How to Install and Use Etcher on Linux for Making Live Linux USB) +[#]: via: (https://itsfoss.com/install-etcher-linux/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +如何在 Linux 上安装和使用 Etcher 来制作 Linux 临场 USB +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/21/214209xor9upp7jznd9djd.jpg) + +> Etcher 是一款流行的 USB 烧录应用,可用于创建可启动的 Linux USB。让我来告诉你如何安装它,以及如何使用它来制作一个 Linux 临场盘。 + +### Etcher:一个用于在 SD 卡和 USB 驱动器中烧录 Linux ISO 的开源工具 + +Etcher 是一个由 [Balena][1] 开发的开源项目,来用于为树莓派烧录 SD 卡。事实上,我们在[如何在 SD 卡上安装 Raspbian OS][2] 的教程中就使用了它。 + +它不仅仅局限于 SD 卡,你还可以使用 Etcher 来[制作一个可启动的 USB 驱动器][3],我们就通过它的帮助在 Linux 中制作了一个 [Manjaro 的临场 USB][4]。 + +自首次发布以来,Etcher 就以其整洁的界面和简单的使用方式引起了人们的注意。 + +![][5] + +在本文中,我将重点介绍帮助你在 Linux 上安装 Etcher 的步骤。然后,我还将展示如何使用它。在这之前,让我先给大家介绍一下它的功能。 + +### Etcher 的功能 + + * 在烧录前验证驱动器 + * 漂亮的用户界面 + * 自动检测 USB 驱动器/SD 卡,防止电脑上的硬盘被擦除。 + * 跨平台支持(Windows、macOS 和 Linux)。 + * 快速烧录 + * 简单的三步过程 + +理论上,你已经有了在 SD 卡和 USB 驱动器上烧录操作系统镜像所需的一切。同样令人激动的是,根据他们的[路线图][6],他们计划增加对多个设备的同步写入支持。 + +### 在 Linux 上安装 Etcher + +要开始使用,你需要从它的官方网站上下载它提供的 AppImage 文件(适用于任何 Linux 发行版)。 + +你只需要前往它的[主页][7],并根据你的系统(32 位/64 位)下载一个程序: + +![][8] + +在我的例子中,我下载了 Ubuntu 的 64 位 AppImage 文件。你可以通过我们的指南来了解[在 Linux 上使用 AppImage文件][9],但我会让你先知道下一步需要做什么。 + +你需要给文件执行权限,你可以右击**AppImage 文件 -> 属性**来实现。 + +![][10] + +接下来,点击权限选项卡下的“**允许作为程序执行**”,如下图所示。 + +![][11] + +现在,只需双击 AppImage 文件即可启动 Etcher! + +这应该可以在任何 Linux 发行版上运行。在任何情况下,如果你想从源码构建或者直接使用 .rpm 或 .deb 文件安装,你也可以前往它的 [Github 发布页][12]找到 RPM、DEB 和源码。 + +你也可以参考我们的[在 Ubuntu 中使用 deb 文件][13]来安装应用。 + +> 注意! +> +> 我们注意到,当你使用 Etcher 创建 Linux 发行版的临场 USB 时,它会使 USB 处于明显的不可使用状态,即它只有几 MB 的空闲空间,并且不能直接格式化。在 Linux 上,你可以[使用磁盘工具手动删除分区,然后格式化它][14]。 + +### 在 Linux 上使用 Etcher + +只需三步就可以开始使用 Etcher。在你启动它之后,根据屏幕上的提示应该是清晰的,但为了给你一个好的开始,以下是你要做的事情: + +**步骤 1:** 选择合适的 ISO 镜像文件或你需要烧录的文件的 URL(如下图所示)。 + +![][15] + +**步骤 2:** 接下来,你需要选择目标设备。它会自动检测并高亮显示可移动设备,以防止你选择任何内部存储位置。 + +![][16] + +在这里,我连接了一个 USB 驱动器,我也选择了它(如下图所示)。 + +![][17] + +**步骤 3:** 现在,你所有需要做的就是烧录镜像并等待它成功完成。 + +![][18] + +这是进度的样子: + +![][19] + +完成了! + +![][20] + +- [下载 balenaEtcher][7] + +### 总结 + +Etcher 是一个有用的工具,可以为 SD 卡和 USB 驱动器烧录操作系统镜像。我倾向于主要使用它来创建临场 USB 驱动器来测试 Linux 发行版,我对它很满意。 + +你更喜欢用什么来创建可启动驱动器?你是否已经尝试过 Etcher?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-etcher-linux/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://www.balena.io/ +[2]: https://itsfoss.com/tutorial-how-to-install-raspberry-pi-os-raspbian-wheezy/ +[3]: https://itsfoss.com/create-bootable-ubuntu-usb-drive-mac-os/ +[4]: https://itsfoss.com/create-live-usb-manjaro-linux/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/etcher-mxlinux-2.png?resize=800%2C518&ssl=1 +[6]: https://github.com/balena-io/etcher/milestones +[7]: https://www.balena.io/etcher +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-official-site-download.png?resize=800%2C580&ssl=1 +[9]: https://itsfoss.com/use-appimage-linux/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/balena-etcher-permission.jpg?resize=800%2C378&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/balena-etcher-execute.jpg?resize=800%2C445&ssl=1 +[12]: https://github.com/balena-io/etcher/releases/tag/v1.5.109 +[13]: https://itsfoss.com/install-deb-files-ubuntu/ +[14]: https://itsfoss.com/cant-format-usb-disk/ +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/balena-etcher-select.jpg?resize=800%2C521&ssl=1 +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-select-target.jpg?resize=800%2C509&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-target-device.jpg?resize=800%2C521&ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-flash.jpg?resize=800%2C516&ssl=1 +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-flashing.jpg?resize=800%2C510&ssl=1 +[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/etcher-flash-complete.jpg?resize=800%2C507&ssl=1 diff --git a/published/202011/20201114 How to Install Fedora in VirtualBox -With Steps for USB, Clipboard and Folder Sharing.md b/published/202011/20201114 How to Install Fedora in VirtualBox -With Steps for USB, Clipboard and Folder Sharing.md new file mode 100644 index 0000000000..23edba8404 --- /dev/null +++ b/published/202011/20201114 How to Install Fedora in VirtualBox -With Steps for USB, Clipboard and Folder Sharing.md @@ -0,0 +1,283 @@ +[#]: collector: (lujun9972) +[#]: translator: (frogOAO) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12854-1.html) +[#]: subject: (How to Install Fedora in VirtualBox [With Steps for USB, Clipboard and Folder Sharing]) +[#]: via: (https://itsfoss.com/install-fedora-in-virtualbox/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 VirtualBox 中安装 Fedora +====== + +如果你对 Fedora Linux 感兴趣,这有几种方式可以尝试它。 + +最简单还不影响你操作系统的方式是 [制作 Fedora 的 USB 临场启动盘][1]。 + +> **LCTT 译注**: +> +> 在 Linux 发行版的使用方式上,有一种可以无需安装而通过光盘或 USB 存储棒直接在计算机上启动完整的 Linux 操作系统的方式,这种方式称之为 “Live” 方式,如 Live CD、Live USB。 +> +> 通常,Live 一词并不翻译,不过,我认为,除了英文缩写和部分历史原因造成直接使用的英文单词,大部分场景都应该使用本地化的语言来描述,否则,中英文混杂的港台式中文,实在有些不伦不类;抑或,外文翻译本身就不存在意义了。 +> +> 因此,对于 “Live” 一词如何翻译,我们也颇费心思。这个词,在维基百科中文中,被翻译为“[自生系统](https://zh.wikipedia.org/wiki/Live_CD)”,在某些场景下偶见 “现场”、“临场” 等翻译。考虑到 Live CD/USB 的特性,我认为翻译为 “临场” 比较好。 +> +> 于此抛出愚见,希望得到大家的积极反馈。wxy@LCTT + +另一种方式是安装 VirtualBox 利用虚拟化技术来尝试 Fedora。这样,你可以在你的操作系统上像使用应用程序一样使用 Fedora。 + +通过这种方式,你可以执行更彻底的测试,而不会搞乱当前的操作系统。 + +你甚至可以复制你的虚拟环境,并在其他系统上重新安装它。听起来方便吗?让我来教你怎么做。 + +### 在 VirtualBox 上安装 Fedora + +![][2] + +让我们分步在 Oracle VirtualBox 上安装 Fedora。 + +#### 步骤一:安装 VirtualBox + +如果你的系统还没有安装 VirtualBox,你可以从官方网站下载。你可以找到 Windows、MacOs 和 Linux 的说明。 [Ubuntu 用户可以参考这个关于安装 VirtualBox 的详细教程。][3] + +![][4] + +- [下载 VirtualBox][5] + +#### 步骤二: 下载 Fedora ISO + +如果你不熟悉 Fedora,那么这些镜像你需要知道。 + +[Fedora IoT][6] 是用于可扩展基础设施的,[Fedora workstation][7] 是一个带有一组面向普通 GNOME 桌面环境中的桌面工具的镜像。[Fedora server][8] 顾名思义,是为服务器或数据中心定制的。 + +如果 GNOME 不是你的首选,你可以下载一个带有替代桌面环境的[定制版][9] Fedora 桌面。对于本教程,我选择了带有 GNOME 桌面环境的[Fedora 33][10]。 + +- [下载 Fedora][11] + +#### 步骤三: 创建一个空虚拟机并对其进行配置 + +要成功安装和运行 Fedora,至少需要 20GB 磁盘空间和 2GB RAM。不过,为了获得更流畅的用户体验,建议增加一倍。在此基础上,我将创建并配置虚拟机。 + +开启 Virtual Box 点击 “New”。 + +![创建一个新的虚拟机][12] + +需要注意,最重要的选项是 **将类型设置为 Linux ,版本设置为 Fedora (64-bit)**。如果你在名称提示符处开始输入 “Fedora”,VirtualBox 将自动为你选择正确的设置。虽然名字不一定非得是 Fedora,它可以是任何你喜欢的。 + +*如果你只能访问 32 位版本,那么你需要在 BIOS 上启用虚拟化技术,如果你有一个 AMD CPU,它被称为 SVM。最坏的情况是你的 CPU 不支持虚拟化技术。如果你不确定,先检查这个。 + +如果你的设置和我类似,点击 “create” 按钮。 + +![命名你的虚拟机,并未它指定至少 3 GB RAM][13] + +如前所述,至少需要 20GB 的磁盘空间才能安装 Fedora。我的系统上有 32GB 的内存,所以我分配了 8GB 内存。3 GB 的内存应该也没问题。 + +顺便说下内存的使用,只有在运行虚拟机时,虚拟机才会使用内存。否则,它将可用于常规使用。 + +确保其余设置与示例匹配,并点击 “Create” 按钮。 + +![以 VDI 格式分配 15-20 GB 的磁盘空间][14] + +在你点击虚拟机的 Start 按钮之前,你需要加载如下所示的 ISO [光驱]。 + +![将 Fedora ISO 添加到光驱存储中][15] + +因为你的虚拟硬盘是空的,虚拟机将从这个 ISO 启动。可以把它看作是使用临场 USB 或磁盘安装 Linux。 + +![在设置中将 ISO 添加为光驱][16] + +然后,如果你有一个多核 CPU,建议为虚拟机分配 2 个或更多的核。你可以在 “System” 选项卡下找到 CPU 核心。配置系统时,单击 “OK” 并启动虚拟机。 + +![可选:分配 CPU 核数][17] + +配置好所有内容后,单击 “Start” 按钮开始安装。 + +#### 步骤四:在 VirtualBox 中安装 Fedora。 + +如果你正确地遵循了这个过程,那么当你启动虚拟机时,你将直接从 ISO 文件启动。当你看到类似下面的屏幕时,选择 “Start Fedora”,并按回车键。 + +![Fedora 运行在虚拟机的临场环境中][18] + +要启动安装对话框,单击 “Install To Hard Drive”。 + +![点击 “install to hard drive”][19] + +在你继续安装之前,有必要定义你的键盘布局、你的时区以及最终安装操作系统的位置。 + +![选择键盘布局、日期和时间,然后是安装目标位置][20] + +分区过程很简单。你像前面的 VDI 那样划分一些空闲空间。它应该被自动识别。 + +选择你的磁盘并将存储配置设置为 “Automatic”。单击 “Done” 进入上一个对话框。 + +![磁盘应该会自动识别][21] + +一旦你配置完了上面的,点击 “Begin Installation”。 + +![开始 Fedora 的安装][22] + +现在只需等待 5 - 6 分钟即可完成安装。安装完成后,点击 “Finish installation” 按钮。 + +最后一步,需要关闭系统的电源。如果你不熟悉 GNOME 桌面环境,你可以如下这样做。 + +![安装后关闭 Fedora 临场环境][23] + +你必须手动卸载在初始步骤中加载的 ISO 文件。 + +![从光驱中移走 Fedora ISO][24] + +下一次使用 Fedora 启动虚拟机时,系统将提示你为 Fedora Linux 创建用户帐户并设置密码。 + +### 使用 VirtualBox Guest Additions 的附加功能,如剪贴板共享,文件夹共享等 + +[Guest Additions][25] 设计为在访客guest操作系统安装后安装在虚拟机中。它们包含对客户操作系统进行优化的设备驱动程序和系统应用程序,以获得更好的性能和可用性。 + +Guest Additions ISO 文件被安装为虚拟 CD-ROM 以便安装。 + +这是一个简单的过程。只需单击设备选项卡,然后单击 “Insert Guest Additions CD image”。 + +![][26] + +当提示单击 “Download” 时,系统将弹出下载 Guest Additions 镜像界面。 + +![安装 VirtualBox Guest Additions][27] + +#### 共享剪贴板 + +有时候,你需要在虚拟机和宿主机host操作系统之间移动一些内容。共享剪贴板/拖放支持将允许你在一个平台上复制项目,并将它们粘贴到另一个平台上。 + +要启用此功能,请在 VirtualBox 主页上选择 “Settings”,并按照下面的说明操作。“Bidirectional” 的选项是最方便的。 + +![启用访客和宿主系统间的剪贴板共享][28] + +#### 共享文件夹 + +有两种类型的分享: + + * 永久共享,与虚拟机设置一起保存。 + * 暂时共享,当虚拟机关闭时就会消失。可以使用 VirtualBox 管理器中的复选框创建暂时共享。 + +在本教程中,我将创建一个永久共享文件夹。在 VM 设置中添加你想要共享的宿主机系统文件夹,并选择你想要在 VM 中出现的名称。 + +![][29] + +下次启动虚拟机时,该文件夹应该显示为网络驱动器。 + +![][30] + +#### 更好的视频支持 + +虽然 Oracle VirtualBox 提供了具有基本功能的虚拟显卡,但访客系统添加的自定义视频驱动程序为你提供了超高和非标准的视频模式,以及视频加速。 + +使用 Guest Additions,操作系统的分辨率将随着你调整计算机上的 VirtualBox 窗口而动态调整大小。 + +最后,Guest Additions 可以利用你的计算机的显卡。如果你是一名游戏玩家或在 WM 中使用高效软件,这就会产生巨大的改变。 + +#### USB 和网络设备共享 + +有了 VirtualBox,用户就可以使用一个功能齐全的操作系统,而不必在不同的硬件上进行设置。然而,在宿主机和访客机器之间共享 USB 和网络设备并不像想的那样简单。 + +要访问 USB 设备,你将需要安装 [VirtualBox 扩展包][31]。 + +![安装 VirtualBox 扩展包][32] + +**下面这些仅对 Linux**,因为我使用的是 Linux。 + +为了使 VirtualBox 能够访问 USB 子系统,运行 VirtualBox 的用户(在宿主机系统上)必须属于 `vboxuser` 组。为此,打开一个终端并发出以下命令: + +``` +sudo usermod -aG vboxusers 'your username' +``` + +运行该命令后,你应该注销并重新登录,或者重新启动主机。 + +在这一步,插入你的 U 盘,通过你的 VM 设置,你应该能够找到并添加介质,如例子中所示。 + +![][33] + +当你下次启动虚拟机,你的 USB 将是可访问的。 + +![][34] + +### 额外提示:保存并导出虚拟机,以便以后可以在任何系统上使用它 + +你可能想在另一台计算机上使用虚拟机,或者是时候构建一台新机器了,并且你需要保持虚拟机的原样。只需几个简单的步骤,就可以轻松地导出当前设置并将其导入到另一台机器。 + +在 VirtualBox 主面板上,单击 “file”、“Export Appliance”。如果你喜欢键盘快捷键,你可以简单地点击 `Ctrl+E`。 + +![][35] + +选择要导出的虚拟机,然后单击 “Next”。 + +![][36] + +“Format” 选项需要注意一下。有三种不同的选项:开放虚拟化格式Open Virtualization Format 0.9、1.0 和 2.0 ,可以是 ovf 或 ova 扩展名。 + +使用 ovf 扩展名,会分别写入几个文件,而 ova 扩展名则将所有文件合并到一个开放虚拟化格式归档文件中。 + +默认格式 OVF 1.0 应该没问题。 + +![][37] + +要完成该过程,单击 “Next”,然后在下一个对话框中单击 “Export”。 + +### 总结 + +通过使用虚拟机,你不仅可以测试操作系统,还可以部署与物理机器同等重要的功能完整的系统。如今,硬件已经变得如此强大和廉价,它的大部分功能都没有被利用。 + +通过虚拟化技术,你可以使用这些浪费的资源。对物理机器的需求减少了,因此能源消耗也减少了。你可以从硬件和降低运行成本两方面省钱。 + +在大规模服务环境中,服务器虚拟化更多的是一种基本需求,而不是一种高级概念。 + +我希望本教程对你在 VirtualBox 中安装 Fedora Linux 有帮助。如果你遇到任何问题,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-fedora-in-virtualbox/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[frogOAO](https://github.com/frogOAO) +校对:[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://itsfoss.com/create-fedora-live-usb-ubuntu/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/install-fedora-in-virtualbox.png?resize=800%2C450&ssl=1 +[3]: https://itsfoss.com/install-virtualbox-ubuntu/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/download-virtulabox.jpg?resize=799%2C294&ssl=1 +[5]: https://www.virtualbox.org/ +[6]: https://getfedora.org/en/iot/ +[7]: https://getfedora.org/en/workstation/ +[8]: https://getfedora.org/en/server/ +[9]: https://spins.fedoraproject.org/ +[10]: https://itsfoss.com/fedora-33/ +[11]: https://getfedora.org/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/0.-create-a-new-vm.png?resize=800%2C550&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/1-create-vm-fedora.png?resize=800%2C533&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/2-fedora-vm-disk.png?resize=800%2C533&ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-vm-settings-iso.png?resize=800%2C640&ssl=1 +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/3-fedora-vm-settings2.png?resize=800%2C600&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/4-fedora-vm-cpu.png?resize=800%2C533&ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/6-fedora-vm-boot.png?resize=800%2C600&ssl=1 +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/7-fedora-vm-install-1.png?resize=800%2C622&ssl=1 +[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/9-fedora-vm-partitioning-2.png?resize=800%2C706&ssl=1 +[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/10-fedora-vm-hdd.png?resize=732%2C645&ssl=1 +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/12-fedora-vm-installation-1.png?resize=800%2C706&ssl=1 +[23]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/15-power-off-fedora-gnome.png?resize=800%2C706&ssl=1 +[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/remove-fedora-iso-from-optical-drive.png?resize=800%2C589&ssl=1 +[25]: https://www.virtualbox.org/manual/ch04.html +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/16-Fedora-vm-guest-additions.png?resize=800%2C706&ssl=1 +[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/17-Fedora-vm-guest-additions.png?resize=800%2C686&ssl=1 +[28]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/19-fedora-vm-shared-clipboard-2.png?resize=800%2C650&ssl=1 +[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/20-fedora-vm-shared-folders-1.png?resize=800%2C650&ssl=1 +[30]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/22-fedora-vm-shared-folders2-1.png?resize=800%2C547&ssl=1 +[31]: https://download.virtualbox.org/virtualbox/6.1.16/Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack +[32]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/21.-fedora-vm-extension-pack.png?resize=800%2C600&ssl=1 +[33]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/25.-fedora-vm-usb-1.png?resize=800%2C527&ssl=1 +[34]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/26.-fedora-vm-usb-1.png?resize=800%2C578&ssl=1 +[35]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/23.-fedora-vm-export.png?resize=800%2C600&ssl=1 +[36]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/24.-fedora-vm-export-1.png?resize=800%2C545&ssl=1 +[37]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/25.-fedora-vm-export-800x545.png?resize=800%2C545&ssl=1 diff --git a/published/202011/20201116 Podman with capabilities on Fedora.md b/published/202011/20201116 Podman with capabilities on Fedora.md new file mode 100644 index 0000000000..92123795f3 --- /dev/null +++ b/published/202011/20201116 Podman with capabilities on Fedora.md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12859-1.html) +[#]: subject: (Podman with capabilities on Fedora) +[#]: via: (https://fedoramagazine.org/podman-with-capabilities-on-fedora/) +[#]: author: (shiwanibiradar https://fedoramagazine.org/author/shiwanibiradar/) + +在 Fedora 中结合权能使用 Podman +====== + +![][1] + +容器化是一项蓬勃发展的技术。在不久的将来,多达百分之七十五的全球组织可能会运行某种类型的容器化技术。由于广泛使用的技术更容易成为黑客攻击的目标,因此保护容器的安全就显得尤为重要。本文将演示如何使用 POSIX [权能][2]Capability 来保护 Podman 容器的安全。Podman 是 RHEL8 中默认的容器管理工具。 + +### 确定 Podman 容器的权限模式 + +容器以特权模式或无特权模式运行。在特权模式下,[容器的 uid 0 被映射到宿主机的 uid 0][3]。对于某些情况,无特权的容器[缺乏对宿主机资源的充分访问能力][4]。但不管其操作模式如何,包括强制访问控制Mandatory Access Control(MAC:如 apparmor、SELinux 等)、seccomp 过滤器、删除权能Capability、命名空间等在内的技术有助于确保容器的安全。 + +要从容器外部确定特权模式: + +``` +$ podman inspect --format="{{.HostConfig.Privileged}}" +``` + +如果上面的命令返回 `true`,那么容器在特权模式下运行。如果返回 `false`,那么容器在非特权模式下运行。 + +要从容器内部确定特权模式: + +``` +$ ip link add dummy0 type dummy +``` + +如果该命令允许你创建一个接口,那么你运行的是一个特权容器,否则你运行的是一个非特权容器。 + +### 权能 + +命名空间隔离了容器的进程,使其无法任意访问宿主机的资源,也无法访问在同一宿主机上运行的其他容器的资源。然而,在**特权**容器内的进程仍然可以做一些事情,如改变 IP 路由表、跟踪任意进程和加载内核模块。权能Capability允许人们对容器内的进程可以访问或更改的资源施加更细微的限制,即使容器在特权模式下运行也一样。权能还允许人们为无特权的容器分配它本来不会拥有的特权。 + +例如,如果要将 `NET_ADMIN` 功能添加到一个无特权的容器中,以便在容器内部创建一个网络接口,你可以用下面的参数运行 `podman`: + +``` +[root@vm1 ~]# podman run -it --cap-add=NET_ADMIN centos +[root@b27fea33ccf1 /]# ip link add dummy0 type dummy +[root@b27fea33ccf1 /]# ip link +``` + +上面的命令演示了在一个无特权的容器中创建一个 `dummy0` 接口。如果没有 `NET_ADMIN` 权能,非特权容器将无法创建接口。上面的命令演示了如何将一个权能授予一个无特权的容器。 + +目前,大约有 [39 种权能][5]可以被授予或拒绝。特权容器默认会被授予许多权能。建议从特权容器中删除不需要的权能,以使其更加安全。 + +要从容器中删除所有权能: + +``` +$ podman run -it -d --name mycontainer --cap-drop=all centos +``` + +列出一个容器的权能: + +``` +$ podman exec -it 48f11d9fa512 capsh --print +``` + +上述命令显示没有向容器授予任何权能。 + +请参考 `capabilities` 手册页以获取完整的权能列表: + +``` +$ man capabilities +``` + +可以使用 `capsh` 命令来列出目前拥有的权能: + +``` +$ capsh --print +``` + +作为另一个例子,下面的命令演示了如何从容器中删除 `NET_RAW` 权能。如果没有 `NET_RAW` 权能,就不能从容器中 `ping` 互联网上的服务器。 + +``` +$ podman run -it --name mycontainer1 --cap-drop=net_raw centos +>>> ping google.com (will output error, operation not permitted) +``` + +最后一个例子,如果你的容器只需要 `SETUID` 和 `SETGID` 权能,你可以删除所有权能,然后只重新添加这两个权能来实现这样的权限设置。 + +``` +$ podman run -d --cap-drop=all --cap-add=setuid --cap-add=setgid fedora sleep 5 > /dev/null; pscap | grep sleep +``` + +上面的 `pscap` 命令会显示容器被授予的权能。 + +我希望你喜欢这个关于如何使用权能来保护 Podman 容器的简短探索。 + +谢谢! + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/podman-with-capabilities-on-fedora/ + +作者:[shiwanibiradar][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/shiwanibiradar/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2018/10/podman-816x345.jpg +[2]: https://www.linuxjournal.com/magazine/making-root-unprivileged +[3]: https://linuxcontainers.org/lxc/security/#privileged-containers +[4]: https://github.com/containers/podman/blob/master/rootless.md +[5]: https://man7.org/linux/man-pages/man7/capabilities.7.html diff --git a/published/202011/20201116 Unlock encrypted disks on Linux automatically.md b/published/202011/20201116 Unlock encrypted disks on Linux automatically.md new file mode 100644 index 0000000000..e7a44a312b --- /dev/null +++ b/published/202011/20201116 Unlock encrypted disks on Linux automatically.md @@ -0,0 +1,249 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12851-1.html) +[#]: subject: (Unlock encrypted disks on Linux automatically) +[#]: via: (https://opensource.com/article/20/11/nbde-linux) +[#]: author: (Curt Warfield https://opensource.com/users/rcurtiswarfield) + +自动解锁 Linux 上的加密磁盘 +====== + +> 通过使用网络绑定磁盘加密(NBDE),无需手动输入密码即可打开加密磁盘。 + +![](https://img.linux.net.cn/data/attachment/album/202011/23/104735lmx18sxxs18f4xcc.jpg) + +从安全的角度来看,对敏感数据进行加密以保护其免受窥探和黑客的攻击是很重要的。Linux 统一密钥设置Linux Unified Key Setup([LUKS][2])是一个很好的工具,也是 Linux 磁盘加密的通用标准。因为它将所有相关的设置信息存储在分区头部中,所以它使数据迁移变得简单。 + +要使用 LUKS 配置加密磁盘或分区,你需要使用 [cryptsetup][3] 工具。不幸的是,加密磁盘的一个缺点是,每次系统重启或磁盘重新挂载时,你都必须手动提供密码。 + +然而,网络绑定磁盘加密Network-Bound Disk Encryption(NBDE) 可以在没有任何用户干预的情况下自动安全地解锁加密磁盘。它可以在一些 Linux 发行版中使用,包括从 Red Hat Enterprise Linux 7.4、CentOS 7.4 和 Fedora 24 开始,以及之后的后续版本。 + +NBDE 采用以下技术实现: + +* [Clevis 框架][4]:一个可插拔的框架工具,可自动解密和解锁 LUKS 卷 +* [Tang 服务器][5]:用于将加密密钥绑定到网络状态的服务 + +Tang 向 Clevis 客户端提供加密密钥。据 Tang 的开发人员介绍,这为密钥托管服务提供了一个安全、无状态、匿名的替代方案。 + +由于 NBDE 使用客户端-服务器架构,你必须同时配置客户端和服务器。你可以在你的本地网络上使用一个虚拟机作为 Tang 服务器。 + +### 服务器安装 + +用 sudo 安装 Tang: + +``` +sudo yum install tang -y +``` + +启用 Tang 服务器: + +``` +sudo systemctl enable tangd.socket --now +``` + +Tang 服务器工作在 80 端口,需加入到 firewalld 防火墙。添加相应的 firewalld 规则: + + +``` +sudo firewall-cmd --add-port=tcp/80 --perm +sudo firewall-cmd --reload +``` + +现在安装好了服务器。 + +### 客户端安装 + +在本例中,假设你已经添加了一个名为 `/dev/vdc` 的新的 1GB 磁盘到你的系统中。 + +使用 `fdisk` 或 `parted` 创建主分区: + +``` +sudo fdisk /dev/vdc +``` + +完成以下步骤来安装客户端: + +``` +Welcome to fdisk (util-linux 2.23.2). + +Changes will remain in memory only, until you decide to write them. +Be careful before using the write command. + +Device does not contain a recognized partition table +Building a new DOS disklabel with disk identifier 0x4a6812d4. + +Command (m for help): +``` + +输入 `n` 来创建新的分区: + +``` +Partition type: + p primary (0 primary, 0 extended, 4 free) + e extended +Select (default p): +``` + +按下**回车**键选择主分区: + + +``` +Using default response p +Partition number (1-4, default 1): +``` + +按下回车键选择默认分区号: + +``` +First sector (2048-2097151, default 2048): +Using default value 2048 +Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +``` + +按回车键选择最后一个扇区: + +``` +Using default value 2097151 +Partition 1 of type Linux and of size 1023 MiB is set + +Command (m for help): wq +``` + +输入 `wq` 保存更改并退出 `fdisk`: + +``` +The partition table has been altered! + +Calling ioctl() to re-read partition table. +Syncing disks. +``` + +运行 `partprobe` 通知系统分区表的变化: + +``` +sudo partprobe +``` + +使用 `sudo` 安装 cryptsetup 软件包: + +``` +sudo yum install cryptsetup -y +``` + +使用 `cryptsetup luksFormat` 命令对磁盘进行加密。当提示时,你需要输入大写的 `YES`,并输入密码来加密磁盘: + +``` +sudo cryptsetup luksFormat /dev/vdc1 +WARNING! +======== +This will overwrite data on /dev/vdc1 irrevocably. + +Are you sure? (Type uppercase yes): + +Enter passphrase for /dev/vdc1: +Verify passphrase: +``` + +使用 `cryptsetup luksOpen` 命令将加密的分区映射到一个逻辑设备上。例如,使用 `encryptedvdc1` 作为名称。你还需要再次输入密码: + +``` +sudo cryptsetup luksOpen /dev/vdc1 encryptedvdc1 +Enter passphrase for /dev/vdc1: +``` + +加密分区现在在 `/dev/mapper/encryptedvdc1` 中可用。 + +在加密的分区上创建一个 XFS 文件系统: + +``` +sudo mkfs.xfs /dev/mapper/encryptedvdc1 +``` + +创建一个挂载加密分区的目录: + +``` +sudo mkdir /encrypted +``` + +使用 `cryptsetup luksClose` 命令锁定分区: + +``` +cryptsetup luksClose encryptedvdc1 +``` + +使用 `sudo` 安装 Clevis 软件包: + +``` +sudo yum install clevis clevis-luks clevis-dracut -y +``` + +修改 `/etc/crypttab`,在启动时打开加密卷: + +``` +sudo vim /etc/crypttab +``` + +增加以下一行: + +``` +encryptedvdc1 /dev/vdc1 none _netdev +``` + +修改 `/etc/fstab`,在重启时或启动时自动挂载加密卷: + +``` +sudo vim /etc/fstab +``` + +增加以下一行: + +``` +/dev/mapper/encryptedvdc1 /encrypted xfs _netdev 1 2 +``` + +在这个例子中,假设 Tang 服务器的 IP 地址是 `192.168.1.20`。如果你喜欢,也可以使用主机名或域名。 + +运行以下 `clevis` 命令: + +``` +sudo clevis bind luks -d /dev/vdc1 tang '{"url":"http://192.168.1.20"}' +The advertisement contains the following signing keys: + +rwA2BAITfYLuyNiIeYUMBzkhk7M + +Do you wish to trust these keys? [ynYN] Y +Enter existing LUKS password: +``` + +输入 `Y` 接受 Tang 服务器的密钥,并提供现有的 LUKS 密码进行初始设置。 + +通过 `systemctl` 启用 `clevis-luks-askpass.path`,以防止非根分区被提示输入密码。 + +``` +sudo systemctl enable clevis-luks-askpass.path +``` + +客户端已经安装完毕。现在,每当你重启服务器时,加密后的磁盘应该会自动解密,并通过 Tang 服务器取回密钥进行挂载。 + +如果 Tang 服务器因为任何原因不可用,你需要手动提供密码,才能解密和挂载分区。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/nbde-linux + +作者:[Curt Warfield][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/rcurtiswarfield +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-password.jpg?itok=KJMdkKum (Lock) +[2]: https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup +[3]: https://gitlab.com/cryptsetup/cryptsetup +[4]: https://github.com/latchset/clevis +[5]: https://github.com/latchset/tang \ No newline at end of file diff --git a/published/202011/20201118 LazPaint- A Free - Open Source Paint.NET Alternative.md b/published/202011/20201118 LazPaint- A Free - Open Source Paint.NET Alternative.md new file mode 100644 index 0000000000..3828710bf1 --- /dev/null +++ b/published/202011/20201118 LazPaint- A Free - Open Source Paint.NET Alternative.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12858-1.html) +[#]: subject: (LazPaint: A Free & Open Source Paint.NET Alternative) +[#]: via: (https://itsfoss.com/lazpaint/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +LazPaint:一个自由开源的 Paint.NET 替代品 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/25/120828b330z4cem3i030tl.jpg) + +> LazPaint 是一款开源 Paint.NET 替代品,支持跨平台。它是一个轻量级的程序,拥有一堆快速编辑图像的基本选项。下面是 LazPaint 的概述。 + +### LazPaint:Linux 下的开源 Paint.NET 替代品 + +![][1] + +如果你喜欢使用工具来快速编辑和处理图像和截图,你可能听说过 [Paint.NET][2],但它只适用于 Windows 系统。 + +它是一个流行的小工具,可以完成很多基本的编辑任务,同时还有一堆可用的选项。你可能知道一些[图像编辑工具][3],但 Paint.NET 是一个相当受欢迎的选择,因为对于一个普通用户来说,它易于使用,且没有任何臃肿的功能。 + +[LazPaint][4]作为 Linux、Windows 和 macOS 上 Paint.NET 的令人印象深刻的开源替代品而出现。它提供了操作图像所需的大部分基本功能,同时又易于使用。 + +![][5] + +由于它是跨平台的应用,即使你不使用 Linux 系统,你仍然可以以自由开源工具使用它,这并非没有意义。现在,让我们看一下它提供的一些功能。 + +### LazPaint 的功能 + +![][6] + +正如我前面提到的,LazPaint 提供了一堆必要的功能。在这里,我将列出关键的部分,这可以帮助你决定是否需要它。然而,我建议你去探索它,以了解更多关于它的信息。 + +* 支持所有主要的文件格式(包括分层位图和 3D 文件) +* 选区工具、裁剪选区、选区笔、反转选区 +* 支持导出到 [Krita][7] +* 以各种质量设置对图像进行重新采样 +* 运动模糊、自定义模糊、径向模糊和像素化工具 +* 可以移除透明度和扁平化图像 +* 旋转和翻转图像 +* 将图像转换为负片 +* 能够调整画布的大小 +* 变形工具(透视) +* 高级绘图工具 +* 设置工作区颜色 +* 黑暗主题 +* 支持脚本功能 +* 具有基本管理选项的层支持 +* 层效果 +* 过滤器 +* 灰度效果 +* 能够启用/禁用工具栏或将其添加到 Dock 上 + +### 在 Linux 上安装 LazPaint + +你应该可以在你的官方软件仓库中找到它,通过你的默认软件包管理器来安装它,但要获得最新版本,你需要下载 .deb 文件,或者在非 Debian 的发行版上从源码编译它。 + +我希望有一个可以在每个 Linux 发行版上获得最新的版本的 Flatpak 软件包,但目前还没有。 + +它也适用于 Windows 和 macOS。你会发现 Windows 还有一个便携版,可以派上用场。 + +- [LazPaint][4] + +### 关于 LazPaint 的总结 + +我发现它真的很容易使用,以各种质量设置来重新采样(或调整大小)图像绝对是一个加分项。如果你已经安装了它,你一定注意到,它不需要大量的存储空间,总体上是一个轻量级的程序。 + +它的速度很快,我在快速测试中的大部分功能都相当好用,没有任何问题。 + +你觉得 LazPaint 作为 Paint.NET 的替代品怎么样?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/lazpaint/ + +作者:[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/11/lazpaint.jpg?resize=800%2C397&ssl=1 +[2]: https://www.getpaint.net +[3]: https://itsfoss.com/image-applications-ubuntu-linux/ +[4]: https://lazpaint.github.io/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/lazpaint-screenshot-2.png?resize=800%2C481&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/lazpaint-screenshot.jpg?resize=800%2C484&ssl=1 +[7]: https://krita.org/en +[9]: https://itsfoss.com/drawing-app/ \ No newline at end of file diff --git a/published/202011/20201120 How to Increase Disk Size of Your Existing Virtual Machines in VirtualBox.md b/published/202011/20201120 How to Increase Disk Size of Your Existing Virtual Machines in VirtualBox.md new file mode 100644 index 0000000000..bd09032fe7 --- /dev/null +++ b/published/202011/20201120 How to Increase Disk Size of Your Existing Virtual Machines in VirtualBox.md @@ -0,0 +1,89 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12869-1.html) +[#]: subject: (How to Increase Disk Size of Your Existing Virtual Machines in VirtualBox) +[#]: via: (https://itsfoss.com/increase-disk-size-virtualbox/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 VirtualBox 中增加现有虚拟机的磁盘大小 +====== + +下面是你迟早会遇到的情况。 + +你在 [VirtualBox][1] 中安装了一个或多个操作系统。在创建这些虚拟操作系统的同时,你还在 VirtualBox 中为它们创建了虚拟硬盘。 + +你指定了虚拟磁盘的最大大小,比如说 15 或 20GB,但现在使用了一段时间后,你发现你的虚拟机已经没有空间了。 + +虽然[在 Ubuntu 和其他操作系统上有释放磁盘空间的方法][2],但更稳健的处理方式是增加 VirtualBox 中创建的虚拟机的磁盘大小。 + +是的,你可以在 VirtualBox 中扩大虚拟硬盘,即使在创建之后也可以。虽然这是一个安全且经过测试的过程,但我们强烈建议你在执行这样的操作之前,先创建一个虚拟机的备份。 + +### 如何扩大 VirtualBox 磁盘大小 + +![][3] + +我将向你展示如何在 VirtualBox 中以图形和命令行(对于 Linux 极客)方式调整磁盘大小。这两种方法都很简单直接。 + +#### 方法 1:在 VirtualBox 中使用虚拟媒体管理器 + +VirtualBox 6 增加了一个调整虚拟磁盘大小的图形化选项。你可以在 VirtualBox 主页的文件选项卡中找到它。 + +进入 “File -> Virtual Media Manager”: + +![][4] + +在列表中选择一个虚拟机,然后使用 “Size” 滑块或输入你需要的大小值。完成后点击 “Apply”。 + +![][5] + +请记住,虽然你增加了虚拟磁盘的大小,但**如果你的空间是动态分配的,那么实际的分区大小仍然不变**。 + +#### 方法 2:使用 Linux 命令行增加 VirtualBox 磁盘空间 + +如果你使用 Linux 操作系统作为宿主机,在宿主机中打开终端并输入以下命令来调整 VDI 的大小: + +``` +VBoxManage modifymedium "/path_to_vdi_file" --resize +``` + +在你按下回车执行命令后,调整大小的过程应该马上结束。 + +> 注意事项 +> +> VirtualBox 早期版本命令中的 `*modifyvdi` 和 `modifyhd` 命令也支持,并在内部映射到 `modifymedium` 命令。 + +![][6] + +如果你不确定虚拟机的保存位置,可以在 VirtualBox 主页面点击 “Files -> Preferences” 或使用键盘快捷键 `Ctrl+G` 找到默认位置。 + +![][7] + +### 总结 + +就我个人而言,我更喜欢在每个 Linux 发行版上使用终端来扩展磁盘,图形化选项是最新的 VirtualBox 版本的一个非常方便的补充。 + +这是一个简单快捷的小技巧,但对 VirtualBox 基础知识是一个很好的补充。如果你觉得这个小技巧很有用,可以看看 [VirtualBox 客户端增强包][8]的几个功能。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/increase-disk-size-virtualbox/ + +作者:[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.virtualbox.org/ +[2]: https://itsfoss.com/free-up-space-ubuntu-linux/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/enlarge-disk-size-virtualbox.png?resize=800%2C450&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/1-virtual-box-media-manager.png?resize=800%2C600&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/2-virtual-box-increase-disc-space.png?resize=800%2C505&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/3-virtual-box-increase-disc-space-terminal.png?resize=800%2C600&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/4-virtual-box-preferences.png?resize=800%2C450&ssl=1 +[8]: https://itsfoss.com/install-fedora-in-virtualbox/ diff --git a/published/202011/20201124 Compare Files and Folders Graphically in Linux With Meld.md b/published/202011/20201124 Compare Files and Folders Graphically in Linux With Meld.md new file mode 100644 index 0000000000..619f4dd774 --- /dev/null +++ b/published/202011/20201124 Compare Files and Folders Graphically in Linux With Meld.md @@ -0,0 +1,113 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12866-1.html) +[#]: subject: (Compare Files and Folders Graphically in Linux With Meld) +[#]: via: (https://itsfoss.com/meld-gui-diff/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +使用 Meld 在 Linux 中以图形方式比较文件和文件夹 +====== + +![](https://img.linux.net.cn/data/attachment/album/202011/28/145914mr5zcl2wnns8rj5j.jpg) + +如何比较两个相似的文件来检查差异?答案显而易见,就是[使用 Linux 中的 diff 命令][1]。 + +问题是,并不是每个人都能自如地在 Linux 终端中比较文件,而且 `diff` 命令的输出可能会让一些人感到困惑。 + +以这个 `diff` 命令的输出为例: + +![][2] + +这里肯定涉及到一个学习曲线。然而,如果你使用的是桌面 Linux,你可以使用 [GUI][3] 应用来轻松比较两个文件是否有任何差异。 + +有几个 Linux 中的 GUI 差异比较工具。我将在本周的 Linux 应用亮点中重点介绍我最喜欢的工具 Meld。 + +### Meld:Linux(及 Windows)下的可视化比较和合并工具 + +通过 [Meld][4],你可以将两个文件并排比较。不仅如此,你还可以对文件进行相应的修改。这是你在大多数情况下想做的事情,对吗? + +![File Comparison][5] + +Meld 还能够比较目录,并显示哪些文件是不同的。它还会显示而文件是新的或是缺失的。 + +![Directory Comparison][6] + +你也可以使用 Meld 进行三向比较。 + +![Three Way File Comparison][7] + +图形化的并排比较在很多情况下都有帮助。如果你是开发人员,你可以用它来了解代码补丁。Meld 还支持版本控制系统,如 Git、[Mercurial][8]、[Subversion][9] 等。 + +### Meld 的功能 + +![][10] + +开源的 Meld 工具具有以下主要功能: + + * 进行双向和三向差异比较 + * 就地编辑文件,差异比较立即更新 + * 在差异和冲突之间进行导航 + * 通过插入、更改和冲突相应地标示出全局和局部差异,使其可视化 + * 使用正则文本过滤来忽略某些差异 + * 语法高亮显示 + * 比较两个或三个目录,看是否有新增加、缺失和更改的文件 + * 将一些文件排除在比较之外 + * 支持流行的版本控制系统,如 Git、Mercurial、Bazaar 和 SVN + * 支持多种国际语言 + * 开源 GPL v2 许可证 + * 既可用于 Linux,也可用于 Windows + +### 在 Linux 上安装 Meld + +Meld 是一个流行的应用程序,它在大多数 Linux 发行版的官方仓库中都有。 + +检查你的发行版的软件中心,看看 Meld 是否可用。 + +![Meld In Ubuntu Software Center][11] + +另外,你也可以使用你的发行版的命令行包管理器来安装 Meld。在 [Ubuntu 上,它可以在 Universe 仓库中找到][12],并且可以[使用 apt 命令安装][13]: + +``` +sudo apt install meld +``` + +你可以在 GNOME 的 GitLab 仓库中找到 Meld 的源码: + +[Meld Source Code][14] + +### 它值得使用吗? + +我知道[大多数现代开源编辑器][15]都有这个功能,但有时你只是想要一个简单的界面,而不需要安装额外的附加软件来比较文件。Meld 就为你提供了这样的功能。 + +你是否使用一些其他工具来检查文件之间的差异?是哪种工具呢?如果你用过 Meld,你有什么经验?请在评论区分享你的意见。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/meld-gui-diff/ + +作者:[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://linuxhandbook.com/diff-command/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/diff-command-complicated-output.png?resize=795%2C551&ssl=1 +[3]: https://itsfoss.com/gui-cli-tui/ +[4]: https://meldmerge.org +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/file-comaprison-in-Linux-with-meld.png?resize=800%2C498&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/directory-comparison-in-Linux-with_meld.png?resize=800%2C497&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/three-way-file-comaprison-with-meld-in-linux.png?resize=800%2C466&ssl=1 +[8]: https://www.mercurial-scm.org/ +[9]: https://subversion.apache.org/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/meld-visual-diff.png?resize=786%2C455&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/Meld-in-Ubuntu-Software-Center.png?resize=800%2C384&ssl=1 +[12]: https://itsfoss.com/ubuntu-repositories/ +[13]: https://itsfoss.com/apt-command-guide/ +[14]: https://gitlab.gnome.org/GNOME/meld +[15]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ diff --git a/published/202012/20190115 Linux Desktop Setup - HookRace Blog.md b/published/202012/20190115 Linux Desktop Setup - HookRace Blog.md new file mode 100644 index 0000000000..4efb833a04 --- /dev/null +++ b/published/202012/20190115 Linux Desktop Setup - HookRace Blog.md @@ -0,0 +1,523 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12883-1.html) +[#]: subject: (Linux Desktop Setup · HookRace Blog) +[#]: via: (https://hookrace.net/blog/linux-desktop-setup/) +[#]: author: (Dennis Felsing http://felsin9.de/nnis/) + +十年 Linux 桌面生存指南 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/03/223817smrej5qwsbqjb3vs.jpg) + +从 2006 年开始转战 Linux 系统后,经过几年的实践,我的软件设置在过去十年内出人意料的固定。再过十年回顾一下,看看发生了什么,也许会非常有趣。在写这篇推文时,我迅速回顾了正在运行的内容: + +![htop overview][2] + +### 动机 + +我的软件介绍排序不分先后: + + * 程序应该运行在本地系统中以便我可以控制它,这其中并不包括云解决方案。 + * 程序应在终端中运行,以便于在任何地方连贯地使用它们,包括性能稍差的电脑或手机。 + * 通过使用终端软件,可以实现自动聚焦键盘。只有在一些有意义的地方,我会更喜欢使用鼠标,因为在打字期间一直伸手去拿鼠标感觉像在浪费时间。有时候过了一个小时我才注意到甚至还没有插鼠标。 + * 最好使用快速高效的软件,我不喜欢听到风扇的声音和感到房间在变热。我还可以继续长久地运行旧硬件,已经使用了 10 年的 Thinkpad x200s 还能很好地支持我所使用的软件。 + * 组合。我不想手动执行每个步骤,而是在需要时自动执行更多操作,这时自然是支持 shell。 + +### 操作系统 + +十二年前移除 Windows 系统后,我在 Linux 系统上经历了一个艰难的开始,当时我手上只有 [Gentoo Linux][3] 系统的安装光盘和一本打印的说明书,要用它们来实现一个可运行的 Linux 系统。虽然花费了几天的时间去编译和修整,但最终还是觉得自己受益颇多。 + +自此我再也没有转回 Windows 系统,但在持续的编译压力导致风扇失灵后,我将我的电脑系统切换到 [Arch Linux][4]。之后我将其他的电脑和私人服务器也切换到了 Arch Linux。作为一个滚动发布发行版,你可以随时升级软件包,但 [Arch Linux News][5] 已经详细报道了其中最主要的漏洞。 + +不过,令人烦恼的是一旦你更新了旧的内核模组,Arch Linux 就会移除旧版的相关信息。我经常注意到一旦我试着插入一个 USB 闪存盘,内核就无法加载相关组件。相反,每次内核升级后都应该进行重启。有一些 [方法][6] 可以解决这个问题,但我还没有实际地使用它们。 + +其他程序也会出现类似的情况,通常 Firefox 、 cron 或者 Samba 在升级后都需要重启,但恼人的是,它们没有警告你存在这种情况。我在工作中使用的 [SUSE][7] 很好地提醒了这种情况。 + +对于 [DDNet][8] 产品服务器,相较于 Arch Linux ,我更倾向于 [Debian][9] 系统,这样在每次升级时出现故障的几率更低。我的防火墙和路由器使用了 [OpenBSD][10] ,它拥有干净系统、文档和强大的 [pf 防火墙][11],而我现在不需要一个单独的路由器。 + +### 窗口管理器 + +从我开始使用 Gentoo 后,我很快注意到 KDE 的编译时间非常长,这让我没办法继续使用它。我四处寻找更简单的解决方案,最初使用了 [Openbox][12] 和 [Fluxbox][13]。某次,为了能更多进行纯键盘操作,我开始尝试转入平铺窗口管理器,并在研究其初始版本的时候学习了 [dwm][14] 和 [awesome][15]。 + +最终,由于 [xmonad][16]的灵活性、可扩展性以及使用纯 [Haskell][17](一种出色的函数编程语言)编写和配置,最终选择了它。一个例子是,我在家中运行一个 40" 4K 的屏幕,但经常会将它分为四个虚拟屏幕,每个虚拟屏幕显示一个工作区,每个工作区自动排列在我的窗口上。当然, xmonad 有一个对应的 [模块][18]。 + +[dzen][19] 和 [conky][20] 对我来说是一个非常简单的状态栏。我的整体 conky 配置看起来是这样的: + +``` +out_to_console yes +update_interval 1 +total_run_times 0 + +TEXT +${downspeed eth0} ${upspeed eth0} | $cpu% ${loadavg 1} ${loadavg 2} ${loadavg 3} $mem/$memmax | ${time %F %T} +``` + +输入命令直接通过管道输入 dzen2: + +``` +conky | dzen2 -fn '-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*' -bg '#000000' -fg '#ffffff' -p -e '' -x 1000 -w 920 -xs 1 -ta r +``` + +对我而言,一项重要功能是在完成工作后使终端发出蜂鸣声。只需要简单地在 zsh 中的 `PR_TITLEBAR` 变量中添加一个 `\a` 字符就可以做到,只要工作完成就可以发出蜂鸣声。当然,我使用了命令: + +``` +echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf +``` + +将 `pcspkr` 内核模块列入黑名单来禁用实际的蜂鸣声。相反 urxvt 的 `URxvt.urgentOnBell: true` 设置会将声音变为尖锐。之后 xmonad 有一个 urgency 钩子来捕捉这类信号,并且我可以使用组合键自动聚焦到当前的发出紧急信号的窗口。在 dzen 中我可以看到一个漂亮且明亮的 `#ff0000` 紧急窗口。 + +在我笔记本上所得到的最终成品是: + +![Laptop screenshot][22] + +我听说前几年 [i3][23] 变得非常流行,但它要求更多的手动窗口对齐而不是自动对齐。 + +我意识到也有像 [tmux][24] 那样的终端多路复用器,但我仍想要一些图形化应用程序,因此最终我没有有效地使用它们。 + +### 终端连续性 + +为了使终端保持活跃状态,我使用了 [dtach][25] ,它只是模拟屏幕分离功能。为了使计算机上的每个终端都可连接和断开,我编写了一个小的封装脚本。 这意味着,即使必须重新启动 X 服务器,我也可以使所有终端都运行良好,包括本地和远程终端。 + +### Shell & 编程 + +对于 shell,我使用 [zsh][28] 而不是 [bash][27],因为它有众多的功能。 + +作为终端模拟,我发现 [urxvt][29] 足够轻巧,支持 Unicode 编码和 256 色,具有出色的性能。另一个重要的功能是可以分别运行 urxvt 客户端和守护进程。因此,即使大量终端也几乎不占用任何内存(回滚缓冲区除外)。 + +对我而言,只有一种字体看起来绝对干净和完美: [Terminus][30]。 由于它是位图字体,因此所有内容都是完美像素,渲染速度极快且 CPU 使用率低。为了能使用 `CTRL-WIN-[1-7]` 在每个终端按需切换字体,我的 `~/.Xdefaults` 包含: + +``` +URxvt.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-* +dzen2.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-* + +URxvt.keysym.C-M-1: command:\033]50;-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-2: command:\033]50;-xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-3: command:\033]50;-xos4-terminus-medium-r-normal-*-18-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-4: command:\033]50;-xos4-terminus-medium-r-normal-*-22-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-5: command:\033]50;-xos4-terminus-medium-r-normal-*-24-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-6: command:\033]50;-xos4-terminus-medium-r-normal-*-28-*-*-*-*-*-*-*\007 +URxvt.keysym.C-M-7: command:\033]50;-xos4-terminus-medium-r-normal-*-32-*-*-*-*-*-*-*\007 + +URxvt.keysym.C-M-n: command:\033]10;#ffffff\007\033]11;#000000\007\033]12;#ffffff\007\033]706;#00ffff\007\033]707;#ffff00\007 +URxvt.keysym.C-M-b: command:\033]10;#000000\007\033]11;#ffffff\007\033]12;#000000\007\033]706;#0000ff\007\033]707;#ff0000\007 +``` + +对于编程和书写,我使用 [Vim][31] 语法高亮显示和 [ctags][32] 进行索引,以及一些带有 `grep` 、`sed` 和其他用于搜索和操作的常用终端窗口。这可能不像 IDE 那样舒适,但可以实现更多的自动化。 + +Vim 的一个问题是你已经习惯了它的键映射,因此希望在任何地方都使用它们。 + +在 shell 功能不够强大时,[Python][33] 和 [Nim][34] 作为脚本语言也不错。 + +### 系统监控 + +[htop][35] (查看当前站点的后台运行,是托管服务器的实时视图)非常适合快速了解软件的当前运行状态。 [lm_sensors][36] 可以监控硬件温度、风扇和电压。 [powertop][37] 是一款由 Intel 发布的优秀省电小工具。 [ncdu][38] 可以交互式分析磁盘使用情况。 + +[nmap][39]、 iptraf-ng、 [tcpdump][40] 和 [Wireshark][41] 都是分析网络问题的基本工具。 + +当然还有很多更优秀的工具。 + +### 邮件 & 同步 + +在我的家庭服务器上,我为自己所有的邮箱账号运行了 [fetchmail][42] 守护进程。fetchmail 只是检索收到的邮件并调用 [procmail][43]: + +``` +#!/bin/sh +for i in /home/deen/.fetchmail/*; do + FETCHMAILHOME=$i /usr/bin/fetchmail -m 'procmail -d %T' -d 60 +done +``` + +配置非常简单,然后等待服务器通知我们有新的邮件: + +``` +poll imap.1und1.de protocol imap timeout 120 user "dennis@felsin9.de" password "XXX" folders INBOX keep ssl idle +``` + +我的 `.procmailrc` 配置包含一些备份全部邮件的规则,并将邮件整理在对应的目录下面。例如,基于邮件列表名或者邮件标题: + +``` +MAILDIR=/home/deen/shared/Maildir +LOGFILE=$HOME/.procmaillog +LOGABSTRACT=no +VERBOSE=off +FORMAIL=/usr/bin/formail +NL=" +" + +:0wc +* ! ? test -d /media/mailarchive/`date +%Y` +| mkdir -p /media/mailarchive/`date +%Y` + +# Make backups of all mail received in format YYYY/YYYY-MM +:0c +/media/mailarchive/`date +%Y`/`date +%Y-%m` + +:0 +* ^From: .*(.*@.*.kit.edu|.*@.*.uka.de|.*@.*.uni-karlsruhe.de) +$MAILDIR/.uni/ + +:0 +* ^list-Id:.*lists.kit.edu +$MAILDIR/.uni-ml/ + +[...] +``` + +我使用 [msmtp][44] 来发送邮件,它也很好配置: + +``` +account default +host smtp.1und1.de +tls on +tls_trust_file /etc/ssl/certs/ca-certificates.crt +auth on +from dennis@felsin9.de +user dennis@felsin9.de +password XXX + +[...] +``` + +但是到目前为止,邮件还在服务器上。 我的文档全部存储在一个目录中,我使用 [Unison][45] 在所有计算机之间进行同步。Unison 可以视为双向交互式 [rsync][46],我的邮件是这个文件目录下的一部分,因此它们最终存储在我的电脑上。 + +这也意味着,尽管邮件会立即到达我的邮箱,但我只是按需拿取,而不是邮件一到达时就立即收到通知。 + +从此我使用 [mutt][47] 阅读邮件,使用侧边栏显示我的邮件目录。 `/etc/mailcap` 文件对于显示非纯文本邮件( HTML, Word 或者 PDF)不可或缺: + +``` +text/html;w3m -I %{charset} -T text/html; copiousoutput +application/msword; antiword %s; copiousoutput +application/pdf; pdftotext -layout /dev/stdin -; copiousoutput +``` + +### 新闻 & 通讯 + +[Newsboat][48] 是一个非常棒的终端 RSS/Atom 阅读器。我在一个有约 150 个提要的 `tach` 会话服务器上运行它。也可以在本地选择提要,例如: + +``` +ignore-article "https://forum.ddnet.tw/feed.php" "title =~ \"Map Testing •\" or title =~ \"Old maps •\" or title =~ \"Map Bugs •\" or title =~ \"Archive •\" or title =~ \"Waiting for mapper •\" or title =~ \"Other mods •\" or title =~ \"Fixes •\"" +``` + +我以同样的方式使用 [Irssi][49] 进行 IRC 通讯。 + +### 日历 + +[remind][50] 是一个可以从命令行获取的日历。通过编辑 `rem` 文件可以设置新的提醒: + +``` +# One time events +REM 2019-01-20 +90 Flight to China %b + +# Recurring Holidays +REM 1 May +90 Holiday "Tag der Arbeit" %b +REM [trigger(easterdate(year(today()))-2)] +90 Holiday "Karfreitag" %b + +# Time Change +REM Nov Sunday 1 --7 +90 Time Change (03:00 -> 02:00) %b +REM Apr Sunday 1 --7 +90 Time Change (02:00 -> 03:00) %b + +# Birthdays +FSET birthday(x) "'s " + ord(year(trigdate())-x) + " birthday is %b" +REM 16 Apr +90 MSG Andreas[birthday(1994)] + +# Sun +SET $LatDeg 49 +SET $LatMin 19 +SET $LatSec 49 +SET $LongDeg -8 +SET $LongMin -40 +SET $LongSec -24 + +MSG Sun from [sunrise(trigdate())] to [sunset(trigdate())] +[...] +``` + +遗憾的是,目前 remind 中还没有中国农历的提醒功能,因此中国的节日不易计算。 + +我给提醒设置了两个名字: + +``` +rem -m -b1 -q -g +``` + +按时间顺序查看待办事项清单 + +``` +rem -m -b1 -q -cuc12 -w$(($(tput cols)+1)) | sed -e "s/\f//g" | less +``` + +显示适应终端宽度的日历: + +![remcal][51] + +### 字典 + +[rdictcc][52] 是鲜为人知的字典工具,它可以使用 [dict.cc][53] 很棒的词典并将他们转存在本地数据库中: + +``` +$ rdictcc rasch +====================[ A => B ]==================== +rasch: + - apace + - brisk [speedy] + - cursory + - in a timely manner + - quick + - quickly + - rapid + - rapidly + - sharpish [Br.] [coll.] + - speedily + - speedy + - swift + - swiftly +rasch [gehen]: + - smartly [quickly] +Rasch {n} [Zittergras-Segge]: + - Alpine grass [Carex brizoides] + - quaking grass sedge [Carex brizoides] +Rasch {m} [regional] [Putzrasch]: + - scouring pad +====================[ B => A ]==================== +Rasch model: + - Rasch-Modell {n} +``` + +### 记录和阅读 + +我有一个简单记录任务的备忘录,在 Vim 会话中基本上一直处于打开状态。我也使用备忘录作为工作中“已完成”工作的记录,这样就可以检查自己每天完成了哪些任务。 + +对于写文件、信件和演示文稿,我会使用 [LaTeX][54] 进行高级排版。德式的简单信件可以这样设置,例如: + +``` +\documentclass[paper = a4, fromalign = right]{scrlttr2} +\usepackage{german} +\usepackage{eurosym} +\usepackage[utf8]{inputenc} +\setlength{\parskip}{6pt} +\setlength{\parindent}{0pt} + +\setkomavar{fromname}{Dennis Felsing} +\setkomavar{fromaddress}{Meine Str. 1\\69181 Leimen} +\setkomavar{subject}{Titel} + +\setkomavar*{enclseparator}{Anlagen} + +\makeatletter +\@setplength{refvpos}{89mm} +\makeatother + +\begin{document} +\begin{letter} {Herr Soundso\\Deine Str. 2\\69121 Heidelberg} +\opening{Sehr geehrter Herr Soundso,} + +Sie haben bei mir seit dem Bla Bla Bla. + +Ich fordere Sie hiermit zu Bla Bla Bla auf. + +\closing{Mit freundlichen Grüßen} + +\end{letter} +\end{document} +``` + +在 [我的私人网站][55] 上可以找到更多的示例文档和演示文稿。 + +[Zathura][56] 读取 PDF 文件速度很快,支持 Vim 类控件,还支持两种不同的 PDF 后端: Poppler 和 MuPDF。另一方面,在偶尔遇到 Zathura 无法打开的文件时,[Evince][57] 则显得更全能一些。 + +### 图片编辑 + +简便的选择是,[GIMP][58] 和 [Inkscape][59] 分别用于照片编辑和交互式向量图形。 + +有时 [Imagemagick][60] 已经足够好了,它可以从命令行直接使用,从而自动编辑图片。同样 [Graphviz][61] 和 [TikZ][62] 可以用来绘制曲线图和其他图表。 + +### Web 浏览器 + +对于 Web 浏览器,我一直在使用 [Firefox][63]。相较于 Chrome,它的可扩展性更好,资源使用率更低。 + +不幸的是,在 Firefox 完全改用 Chrome 风格的扩展之后, [Pentadactyl][64] 扩展的开发就停止了,所以我的浏览器中再也没有令人满意的 Vim 类控件了。 + +### 媒体播放器 + +通过设置 `vo=gpu` 以及 `hwdec=vaapi`,具有硬件解码功能的 [mpv][65] 在播放期间 CPU 的占用率保持在 5%。相较于默认的 PulseAudio,mpv 中的 `audio-channels=2` 似乎可以使我的立体扬声器/耳机获得更清晰的降级混频。一个很棒的小功能是用 `Shift-Q` 退出,而不是只用 `Q` 来保存回放位置。当你与母语是其他语言的人一起看视频时,你可以使用 `--secondary-sid=` 同时显示两种字幕,主字幕位于底部,次字幕位于屏幕顶部。 + +我的无线鼠标可以简单地通过一个小的配置文件( `~/.config/mpv/input.conf` )实现远程控制 mpv : + +``` +MOUSE_BTN5 run "mixer" "pcm" "-2" +MOUSE_BTN6 run "mixer" "pcm" "+2" +MOUSE_BTN1 cycle sub-visibility +MOUSE_BTN7 add chapter -1 +MOUSE_BTN8 add chapter 1 +``` + +[youtube-dl][66] 非常适合观看在线托管的视频,使用 `-f bestvideo+bestaudio/best --all-subs --embed-subs` 命令可获得最高质量的视频。 + +作为音乐播放器, [MOC][67] 不再活跃开发,但它仍是一个简易的播放器,可以播放各种可能的格式,包括最不常用的 Chiptune 格式。在 AUR 中有一个 [补丁][68] 增加了 PulseAudio 支持。即使在 CPU 时钟频率降到 800 MHz, MOC 也只使用了单核 CPU 的 1-2% 。 + +![moc][69] + +我的音乐收藏夹保存在我的家庭服务器上,因此我可以从任何地方访问它。它使用 [SSHFS][70] 挂载并自动安装在 `/etc/fstab/` 目录下: + +``` +root@server:/media/media /mnt/media fuse.sshfs noauto,x-systemd.automount,idmap=user,IdentityFile=/root/.ssh/id_rsa,allow_other,reconnect 0 0 +``` + +### 跨平台构建 + +除了 Linux 本身,它对于构建任何主流操作系统的软件包都很优秀! 一开始,我使用 [QEMU][71] 与旧版 Debian、 Windows 以及 Mac OS X VM 一起构建这些平台。 + +现在我在旧版 Debian 发行版上转而使用 chroot (以获得最大的 Linux 兼容性),在 Windows 上使用 [MinGW][72] 进行交叉编译,在 Mac OS X 上则使用 [OSXCross][73]。 + +用于 [构建 DDNet][74] 的脚本以及 [更新库构建的说明][75] 的脚本都基于这个。 + +### 备份 + +通常,我们都会忘记备份。即使这是最后一节,它也不应该成为事后诸葛。 + +十年前我写了 [rrb][76] (反向 rsync 备份)重新封装了 `rsync` ,因此我只需要将备份服务器的 root SSH 权限授予正在备份的计算机。令人惊讶地是,尽管我一直在使用 rrb ,但它在过去十年里没有任何改变。 + +备份文件直接存储在文件系统中。使用硬链接实现增量备份(`--link-dest`)。一个简单的 [配置][77] 定义了备份保存时间,默认为: + +``` +KEEP_RULES=( \ + 7 7 \ # One backup a day for the last 7 days + 31 8 \ # 8 more backups for the last month + 365 11 \ # 11 more backups for the last year +1825 4 \ # 4 more backups for the last 5 years +) +``` + +因为我的一些计算机没有静态 IP / DNS 但仍想使用 rrb 备份,那我会使用反向安全隧道(作为 systemd 服务): + +``` +[Unit] +Description=Reverse SSH Tunnel +After=network.target + +[Service] +ExecStart=/usr/bin/ssh -N -R 27276:localhost:22 -o "ExitOnForwardFailure yes" server +KillMode=process +Restart=always + +[Install] +WantedBy=multi-user.target +``` + +现在,隧道运行备份时,服务器可以通过 `ssh -p 27276 localhost` 命令或者使用 `.ssh/config` 到达服务器端。 + +``` +Host cr-remote + HostName localhost + Port 27276 +``` + +在谈及 SSH 技巧时,有时由于某些中断的路由会很难访问到服务器。在那种情况下你可以借道其他服务器的 SSH 连接,以获得更好的路由。在这种情况下,你可能通过美国连接访问到我的中国服务器,而来自德国的不可靠连接可能需要几个周: + +``` +Host chn.ddnet.tw + ProxyCommand ssh -q usa.ddnet.tw nc -q0 chn.ddnet.tw 22 + Port 22 +``` + +### 结语 + +感谢阅读我工具的收藏。这其中我也许遗漏了许多日常中自然成习惯的步骤。让我们来看看我的软件设置在下一年里能多稳定吧。如果你有任何问题,随时联系我 [dennis@felsin9.de][78] 。 + +在 [Hacker News][79] 下评论吧。 + +-------------------------------------------------------------------------------- + +via: https://hookrace.net/blog/linux-desktop-setup/ + +作者:[Dennis Felsing][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]: http://felsin9.de/nnis/ +[b]: https://github.com/lujun9972 +[1]: https://hookrace.net/public/linux-desktop/htop_small.png +[2]: https://hookrace.net/public/linux-desktop/htop.png +[3]: https://gentoo.org/ +[4]: https://www.archlinux.org/ +[5]: https://www.archlinux.org/news/ +[6]: https://www.reddit.com/r/archlinux/comments/4zrsc3/keep_your_system_fully_functional_after_a_kernel/ +[7]: https://www.suse.com/ +[8]: https://ddnet.tw/ +[9]: https://www.debian.org/ +[10]: https://www.openbsd.org/ +[11]: https://www.openbsd.org/faq/pf/ +[12]: http://openbox.org/wiki/Main_Page +[13]: http://fluxbox.org/ +[14]: https://dwm.suckless.org/ +[15]: https://awesomewm.org/ +[16]: https://xmonad.org/ +[17]: https://www.haskell.org/ +[18]: http://hackage.haskell.org/package/xmonad-contrib-0.15/docs/XMonad-Layout-LayoutScreens.html +[19]: http://robm.github.io/dzen/ +[20]: https://github.com/brndnmtthws/conky +[21]: https://hookrace.net/public/linux-desktop/laptop_small.png +[22]: https://hookrace.net/public/linux-desktop/laptop.png +[23]: https://i3wm.org/ +[24]: https://github.com/tmux/tmux/wiki +[25]: http://dtach.sourceforge.net/ +[26]: https://github.com/def-/tach/blob/master/tach +[27]: https://www.gnu.org/software/bash/ +[28]: http://www.zsh.org/ +[29]: http://software.schmorp.de/pkg/rxvt-unicode.html +[30]: http://terminus-font.sourceforge.net/ +[31]: https://www.vim.org/ +[32]: http://ctags.sourceforge.net/ +[33]: https://www.python.org/ +[34]: https://nim-lang.org/ +[35]: https://hisham.hm/htop/ +[36]: http://lm-sensors.org/ +[37]: https://01.org/powertop/ +[38]: https://dev.yorhel.nl/ncdu +[39]: https://nmap.org/ +[40]: https://www.tcpdump.org/ +[41]: https://www.wireshark.org/ +[42]: http://www.fetchmail.info/ +[43]: http://www.procmail.org/ +[44]: https://marlam.de/msmtp/ +[45]: https://www.cis.upenn.edu/~bcpierce/unison/ +[46]: https://rsync.samba.org/ +[47]: http://www.mutt.org/ +[48]: https://newsboat.org/ +[49]: https://irssi.org/ +[50]: https://www.roaringpenguin.com/products/remind +[51]: https://hookrace.net/public/linux-desktop/remcal.png +[52]: https://github.com/tsdh/rdictcc +[53]: https://www.dict.cc/ +[54]: https://www.latex-project.org/ +[55]: http://felsin9.de/nnis/research/ +[56]: https://pwmt.org/projects/zathura/ +[57]: https://wiki.gnome.org/Apps/Evince +[58]: https://www.gimp.org/ +[59]: https://inkscape.org/ +[60]: https://imagemagick.org/Usage/ +[61]: https://www.graphviz.org/ +[62]: https://sourceforge.net/projects/pgf/ +[63]: https://www.mozilla.org/en-US/firefox/new/ +[64]: https://github.com/5digits/dactyl +[65]: https://mpv.io/ +[66]: https://rg3.github.io/youtube-dl/ +[67]: http://moc.daper.net/ +[68]: https://aur.archlinux.org/packages/moc-pulse/ +[69]: https://hookrace.net/public/linux-desktop/moc.png +[70]: https://github.com/libfuse/sshfs +[71]: https://www.qemu.org/ +[72]: http://www.mingw.org/ +[73]: https://github.com/tpoechtrager/osxcross +[74]: https://github.com/ddnet/ddnet-scripts/blob/master/ddnet-release.sh +[75]: https://github.com/ddnet/ddnet-scripts/blob/master/ddnet-lib-update.sh +[76]: https://github.com/def-/rrb/blob/master/rrb +[77]: https://github.com/def-/rrb/blob/master/config.example +[78]: mailto:dennis@felsin9.de +[79]: https://news.ycombinator.com/item?id=18979731 diff --git a/published/202012/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md b/published/202012/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md new file mode 100644 index 0000000000..ad7e49ee81 --- /dev/null +++ b/published/202012/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md @@ -0,0 +1,186 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12956-1.html) +[#]: subject: (3 Ways to Install Deb Files on Ubuntu Linux) +[#]: via: (https://itsfoss.com/install-deb-files-ubuntu) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +在 Ubuntu Linux 上安装 Deb 文件的 3 种方法 +====== + +> 这篇初学者文章解释了如何在 Ubuntu 中安装 deb 软件包。它稍后也向你展示如何移除这些 deb 软件包。 + +这是 Ubuntu 初学者系列的另一篇文章。如果你对 Ubuntu 很陌生,你可能会想知道 [如何安装应用程序][1]。 + +最简单的方法是使用 Ubuntu 软件中心。在软件中心中搜索应用程序的名称并安装它。如果你能在软件中心中找到所有的应用程序,那么生活就太惬意了。但是,不幸的是,这是不可能的发生的。 + +一些软件包可以通过 DEB 软件包的形式获得。它们是以 .deb 扩展名为结尾的存档文件。你可以把 .deb 文件看作为 Windows 中的 .exe 文件。在 Windows 中,你双击 .exe 文件,它将开始安装过程。DEB 软件包也是非常类似的。 + +你可以从软件提供商网站的下载区域找到这些 DEB 软件包。例如,如果你想 [在 Ubuntu 上安装 Google Chrome][2] ,你可以从它的网站下载 Chrome 的 DEB 软件包。 + +现在问题产生了,你将如何安装 deb 文件呢?在 Ubuntu 中有多种安装 DEB 软件包的方法。在这篇教程中,我将向你依次地展示它们。 + +![在 Ubuntu 中安装 deb 文件][3] + +### 在 Ubuntu 和基于 Debian 的 Linux 发行版中安装 .deb 文件 + +你可以选择一个 GUI 工具或一个命令行工具来安装一个 deb 软件包。你拥有选择权。 + +让我们继续看看如何安装 deb 文件。 + +#### 方法 1: 使用默认的软件中心 + +在 Ubuntu 中,最简单的方法是使用默认的软件中心。在这里你不必要做任何特别的事。只需要转到你所下载的 .deb 文件的文件夹下(它应该是 Downloads 文件夹),并在这个文件上双击。 + +![在 Ubuntu 上的 Google Chrome 的 deb 文件][4] + +在已下载的 .deb 文件上双击以开始安装。 + +它将打开软件中心,并且你将看到安装软件时的选项。你所需要做的全部工作就是:点击安装按钮并输入你的登录密码。 + +![在 Ubuntu 软件中心中安装 Google Chrome][5] + +.deb 文件的安装将通过软件中心来执行。 + +看,它甚至比在 Windows 中安装一个 .exe 文件更简单,不是吗? + +#### 方法 2: 使用 Gdebi 应用程序来安装 deb 软件包及其依赖项 + +再提一次,如果事情总是进展顺利,生活可能会更简单一些。但是生活并不是我们熟知的那样。 + +现在,你已经知道 .deb 文件可以简单地通过软件中心来安装,接下来,让我告诉你一些软件包可能会遇到的依赖项的错误。 + +发生错误的原因是,一个程序可能依赖于另外一个软件包(库)。当开发者为你准备 DEB 软件包时,他/她可能会假设你的系统中已经有了所依赖的软件包(库)。 + +但是如果情况并不是这样的,你的系统没有这些所需要的软件包(库),你将遇到臭名昭著的“依赖项错误”。 + +软件中心不能处理这样的错误,因此你不得不使用另外一个名称为 [gdebi][6] 的工具。 + +gdebi 是一个轻量级的 GUI 应用程序,它只有安装 deb 软件包的一个用途。 + +它将识别依赖项,并尝试在安装 .deb 文件的同时安装这些依赖项。 + +![gdebi 在安装 deb 软件包时处理依赖项][7] + +就我个人而言,我更喜欢使用 gdebi 而不是使用软件包中心来安装 deb 文件。它是一个轻量级应用程序,因此安装过程看起来更快一点。更多的信息,你可以阅读[使用 gDebi ,并使其成为安装 DEB 软件包的默认设置][6]。 + +你可以从软件中心或使用下面的命令来安装 gdebi : + +``` +sudo apt install gdebi +``` + +#### 方法 3: 在命令行中使用 dpkg 安装 .deb 文件 + +如果你想在命令行中安装 deb 软件包,你可以使用 `apt` 命令或者 `dpkg` 命令。实际上,`apt` 命令在底层上使用 [dpkg][9] 命令,但是 `apt` 却更流行和易于使用。 + +如果你想对 deb 文件使用 `apt` 命令,像这样使用它: + +``` +sudo apt install path_to_deb_file +``` + +如果你想对将要安装的 deb 软件包使用 `dpkg` 命令,在这里是如何完成它: + +``` +sudo dpkg -i path_to_deb_file +``` + +在这两个命令中,你应该使用你已下载的 deb 文件的路径和名称来替换 `path_to_deb_file` 。 + +![在 Ubuntu 中使用 dpkg 命令安装 deb 文件][10] + +如果你在安装 deb 软件包的过程中得到一个依赖项的错误,你可以使用下面的命令来修复依赖项的问题: + +``` +sudo apt install -f +``` + +### 如何移除 deb 软件包 + +移除一个 deb 软件包也不是一件什么大事。并且,你不需要用于安装程序的原始的 deb 文件。 + +#### 方法 1: 使用 apt 命令移除 deb 软件包 + +你所需要的全部东西就是你所已安装程序的名称,接下来你可以使用 `apt` 或 `dpkg` 来移除这个程序。 + +``` +sudo apt remove program_name +``` + +现在,问题来了,在移除命令中,你如何找到你所需要使用的准确的程序名称?为此,`apt` 命令也有一个解决方案。 + +你可以使用 `apt` 命令找到所有已安装文件的列表,但是手动完成这一过程将会是一件令人头疼的事。因此,你可以使用 `grep` 命令来搜索你的软件包。 + +例如,在先前的部分中,我已安装 AppGrid 应用程序,但是如果我想知道准确的程序名称,我可以像这样使用一些东西: + +``` +sudo apt list --installed | grep grid +``` + +这将给予我全部的名称中含有 “grid” 的软件包,从这里,我可以得到准确的程序名称。 + +``` +apt list --installed | grep grid +WARNING: apt does not have a stable CLI interface. Use with caution in scripts. +appgrid/now 0.298 all [installed,local] +``` + +正如你所看到的,一个名称为 “appgrid” 的软件包已经安装。现在,你可以在 `apt remove` 命令中使用这个程序名称。 + +#### 方法2: 使用 dpkg 命令移除 deb 软件包 + +你可以使用 `dpkg` 来找到已安装程序的名称: + +``` +dpkg -l | grep grid +``` + +该输出将给予所有的名称中有 “grid” 的软件包。 + +``` +dpkg -l | grep grid + +ii appgrid 0.298 all Discover and install apps for Ubuntu +``` + +在上面的命令输出中的 `ii` 意味着软件包已经被正确地安装。 + +现在,你有了程序名称,你可以使用 `dpkg` 命令来移除它: + +``` +dpkg -r program_name +``` + +**提示:更新 deb 软件包** + +一些 deb 软件包 (像 Chrome)通过系统更新来提供其更新,但是对于大多数的其它的程序,你将不得不先移除已存在的程序,并在接下来安装更新的版本。 + +我希望这篇初学者指南能够帮助你在 Ubuntu 上安装 deb 软件包。我添加了移除部分,以便你可以更好地控制你所安装的程序。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-deb-files-ubuntu + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/remove-install-software-ubuntu/ +[2]: https://itsfoss.com/install-chrome-ubuntu/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/deb-packages-ubuntu.png?resize=800%2C450&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-4.jpeg?resize=800%2C347&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-5.jpeg?resize=800%2C516&ssl=1 +[6]: https://itsfoss.com/gdebi-default-ubuntu-software-center/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/gdebi-handling-dependency.jpg?ssl=1 +[8]: http://xmodulo.com +[9]: https://help.ubuntu.com/lts/serverguide/dpkg.html.en +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/install-deb-file-with-dpkg.png?ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/deb-packages-ubuntu.png?fit=800%2C450&ssl=1 diff --git a/published/202012/20190524 Dual booting Windows and Linux using UEFI.md b/published/202012/20190524 Dual booting Windows and Linux using UEFI.md new file mode 100644 index 0000000000..9c701f6487 --- /dev/null +++ b/published/202012/20190524 Dual booting Windows and Linux using UEFI.md @@ -0,0 +1,103 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12891-1.html) +[#]: subject: (Dual booting Windows and Linux using UEFI) +[#]: via: (https://opensource.com/article/19/5/dual-booting-windows-linux-uefi) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss/users/ckrzen) + +使用 UEFI 双启动 Windows 和 Linux +====== + +> 这是一份在同一台机器上设置 Linux 和 Windows 双重启动的速成解释,使用统一可扩展固件接口(UEFI)。 + +![](https://img.linux.net.cn/data/attachment/album/202012/06/101431eb02wvkk0nzkk5sw.jpg) + +我将强调一些重要点,而不是一步一步地指导你来如何配置你的系统以实现双重启动。作为一个示例,我将提到我在几个月之前新买的笔记本计算机。我先是安装 [Ubuntu Linux][2] 到整个硬盘中,这就摧毁了预装的 [Windows 10][3] 环境。几个月后,我决定安装一个不同的 Linux 发行版 [Fedora Linux][4],也决定在双重启动配置中与它一起再次安装 Windows 10 。我将强调一些极其重要的实际情况。让我们开始吧! + +### 固件 + +双重启动不仅仅是软件问题。或者说它算是软件的问题,因为它需要更改你的固件,以告诉你的机器如何开始启动程序。这里有一些和固件相关的重要事项要铭记于心。 + +#### UEFI vs BIOS + +在尝试安装前,确保你的固件配置是最佳的。现在出售的大多数计算机有一个名为 [统一可扩展固件接口][5]Unified Extensible Firmware Interface (UEFI)的新类型固件,UEFI 差不多取代了另一个名为 [基本输入输出系统][6]Basic Input Output System(BIOS)的固件类型,(包括很多固件供应商在内的很多人)通常称 BIOS 为传统启动模式Legacy Boot。 + +我不需要 BIOS,所以我选择了 UEFI 模式。 + +#### 安全启动 + +另一个重要的设置是安全启动Secure Boot。这个功能将检测启动路径是否被篡改,并阻止未经批准的操作系统的启动。现在,我禁用这个选项来确保我能够安装 Fedora Linux 。依据 Fedora 项目维基“[功能/安全启动][7]”部分的介绍可知:Fedora Linux 在安全启动选项启用的时候也可以工作。这对其它的 Linux 发行版来说可能有所不同 — 我打算今后重新研究这项设置。 + +简而言之,如果你发现在这项设置启用时你不能安装你的 Linux 操作系统,那么禁用安全启动并再次重新尝试安装。 + +### 对启动驱动器进行分区 + +如果你选择双重启动并且两个操作系统都在同一个驱动器上,那么你必须将它分成多个分区。即使你使用两个不同的驱动器进行双重启动,出于各种各样的原因,大多数 Linux 环境也最好分成几个基本的分区。这里有一些选项值得考虑。 + +#### GPT vs MBR + +如果你决定手动分区你的启动驱动器,在动手前,我建议使用[GUID 分区表][8]GUID Partition Table(GPT),而不是使用旧的[主启动记录][9]Master Boot Record(MBR) 。这种更改的原因之一是:MBR 有两个特定的限制,而 GPT 却没有: + + * MBR 可以最多拥有 15 个分区,而 GPT 可以最多拥有 128 个分区。 + * MBR 最多仅支持 2 TB 磁盘,而 GPT 使用 64 位地址,这使得它最多支持 800 万 TB 的磁盘。 + +如果你最近购买过硬盘,那么你可能会知道现代的很多硬盘都超过了 2 TB 的限制。 + +#### EFI 系统分区 + +如果你正在进行一次全新的安装或使用一块新的驱动器,那么这里可能没有可以开始的分区。在这种情况下,操作系统安装程序将先创建一个分区,即[EFI 系统分区][10]EFI System Partition(ESP)。如果你选择使用一个诸如 [gdisk][11] 之类的工具来手动分区你的驱动器,你将需要使用一些参数来创建这个分区。基于现有的 ESP ,我设置它为约 500 MB 的大小,并分配它为 `ef00`( EFI 系统 )分区类型。UEFI 规范要求格式化为 FAT32/msdos ,很可能是因为这种格式被大量的操作系统所支持。 + +![分区][12] + +### 操作系统安装 + +在你完成先前的两个任务后,你就可以安装你的操作系统了。虽然我在这里关注的是 Windows 10 和 Fedora Linux ,当安装其它组合时的过程也是非常相似。 + +#### Windows 10 + +我开始 Windows 10 的安装,并创建了一个 20 GB 的 Windows 分区。因为我先前在我的笔记本计算机上安装了 Linux ,所以驱动器已经有了一个 ESP ,我选择保留它。我删除所有的现有 Linux 和交换分区来开始一次全新安装,然后开始我的 Windows 安装。Windows 安装程序自动创建另一个 16 MB 的小分区,称为 [微软保留分区][13]Microsoft Reserved Partition(MSR)。在这完成后,在 512 GB 启动驱动器上仍然有大约 400 GB 的未分配空间。 + +接下来,我继续完成了 Windows 10 安装过程。随后我重新启动到 Windows 来确保它是工作的,在操作系统第一次启动时,创建我的用户账号,设置 Wi-Fi ,并完成其它必须的任务。 + +#### Fedora Linux + +接下来,我将心思转移到安装 Linux 。我开始了安装过程,当安装进行到磁盘配置的步骤时,我确保不会更改 Windows NTFS 和 MSR 分区。我也不会更改 ESP ,但是我设置它的挂载点为 `/boot/efi`。然后我创建常用的 ext4 格式分区, `/`(根分区)、`/boot` 和 `/home`。我创建的最后一个分区是 Linux 的交换分区(swap)。 + +像安装 Windows 一样,我继续完成了 Linux 安装,随后重新启动。令我高兴的是,在启动时[大一统启动加载程序][14]GRand Unified Boot Loader(GRUB)菜单提供选择 Windows 或 Linux 的选项,这意味着我不需要再做任何额外的配置。我选择 Linux 并完成了诸如创建我的用户账号等常规步骤。 + +### 总结 + +总体而言,这个过程是不难的,在过去的几年里,从 BIOS 过渡到 UEFI 有一些困难需要解决,加上诸如安全启动等功能的引入。我相信我们现在已经克服了这些障碍,可以可靠地设置多重启动系统。 + +我不再怀念 [Linux LOader][15](LILO)! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/5/dual-booting-windows-linux-uefi + +作者:[Alan Formy-Duval][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/alanfdoss/users/ckrzen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://www.ubuntu.com +[3]: https://www.microsoft.com/en-us/windows +[4]: https://getfedora.org +[5]: https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface +[6]: https://en.wikipedia.org/wiki/BIOS +[7]: https://fedoraproject.org/wiki/Features/SecureBoot +[8]: https://en.wikipedia.org/wiki/GUID_Partition_Table +[9]: https://en.wikipedia.org/wiki/Master_boot_record +[10]: https://en.wikipedia.org/wiki/EFI_system_partition +[11]: https://sourceforge.net/projects/gptfdisk/ +[12]: /sites/default/files/u216961/gdisk_screenshot_s.png +[13]: https://en.wikipedia.org/wiki/Microsoft_Reserved_Partition +[14]: https://en.wikipedia.org/wiki/GNU_GRUB +[15]: https://en.wikipedia.org/wiki/LILO_(boot_loader) diff --git a/published/202012/20190612 When to use 5G, when to use Wi-Fi 6.md b/published/202012/20190612 When to use 5G, when to use Wi-Fi 6.md new file mode 100644 index 0000000000..0de2050060 --- /dev/null +++ b/published/202012/20190612 When to use 5G, when to use Wi-Fi 6.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (chenmu-kk) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12914-1.html) +[#]: subject: (When to use 5G, when to use Wi-Fi 6) +[#]: via: (https://www.networkworld.com/article/3402316/when-to-use-5g-when-to-use-wi-fi-6.html) +[#]: author: (Lee Doyle ) + +何时使用 5G,何时使用 Wi-Fi 6 +====== + +> 5G 是一种蜂窝服务, Wi-Fi 6 则是短程无线接入技术,这两种技术都有使其在特定企业角色中发挥作用的特性。 + +![Thinkstock][1] + +我们已经看到了关于 [5G][2] 蜂窝还是 [Wi-Fi 6][3] 将在企业使用中胜出的大肆宣传,但事实却是这两者在很大程度上互补,这将在 21 世纪 20 年代初形成一个有趣的竞争环境。 + +### 5G 在企业中的潜力 + +5G 对企业用户的承诺是在更低的延迟下提供更高的连接速度。蜂窝技术使用许可频段,可在很大程度上消除未经许可的 WiFi 频段可能会发生的潜在干涉。像当前的 4G LTE 技术一样,5G 可以由蜂窝无线运营商提供,也可以作为专用网络构建。 + +5G 的架构需要更多的无线接入点,并且在室内可能会出现连接质量较差或没有连接。因此,典型的组织需要为连接它的 PC、路由器和其他设备评估其 [当前 4G 和潜在 5G 服务配置][4]。部署室内微蜂窝、中继器以及分布式天线可以帮助解决室内 5G 服务问题。与 4G 一样,5G 最佳的企业应用案例应该是用于真正的移动连接,例如,公共安全车和非地毯式覆盖区域(如采矿,石油与天然气开采、运输、农业和一些制造业)。 + +除了广泛的移动性,5G 在漫游时的身份验证和部署速度方面也具有优势,这正好满足临时办公室或零售点的广域网连接需求。5G 将会拥有在视频直播这样的数据拥塞的情况下分流的能力。随着 5G 标准的成熟,该技术将提高其低功耗 IoT 连接的选择。 + +未来四到五年内,5G 将从大城市和特定地区开始逐步推出;4G 技术将在未来数年内继续流行。企业用户将需要新的设备、加密狗和路由器来连接 5G 服务。例如,苹果的 iPhone 预计要到 2020 年才能支持 5G,而物联网设备需要特定的蜂窝网络兼容性才能连接到 5G。(LCTT 译注:原文发表于 2019 年中) + +Doyle Research 预计,5G 承诺的 1Gbps 和更高的带宽将对 SD-WAN 市场产生重大影响。4G LTE 已经使蜂窝服务成为主要的 WAN 连接。5G 可能比许多有线 WAN 选项(例如 MPLS 或互联网)更具成本竞争力或更便宜。5G 为企业 WAN 管理员提供了更多选择,为他们的分支站点和远程用户提供更多的带宽 —— 随着时间的推移,或将取代 MPLS。 + +### Wi-Fi 6 在企业中的潜力 + +Wi-Fi 几乎无处不在,它可以将便携式笔记本电脑、平板电脑和其他设备连接到企业网络中。Wi-Fi 6(802.11ax)是 Wi-Fi 的最新版本,并有望提高速度、降低延迟、改善聚合带宽并提供高级流量管理。虽然 Wi-Fi 6 与 5G 有一些相似之处(两者均基于正交频分多址),但 Wi-Fi 6 不太容易受到干扰,能耗更低(延长设备电池的寿命),并提高了频谱效率。 + +与典型的 Wi-Fi 相同,目前许多厂商都有 [Wi-Fi 6 早期厂商专用版本][6]。Wi-Fi 联盟计划在 2020 年获得 Wi-Fi 6 标准设备的认证。大多数企业将按照标准接入点access-point(AP)的生命周期(三年左右)升级到 Wi-Fi 6,除非他们有特定的性能/延迟要求,这将促使它们更快地升级。 + +Wi-Fi 接入点仍然会受到干涉的影响。设计和配置接入点以提供适当的覆盖范围将会是一项挑战。企业 LAN 管理者将继续需要供应商提供的工具和合作伙伴来为组织配置最理想的 Wi-Fi 覆盖。Wi-Fi 6 解决方案必须与有线区域基础建设集成。Wi-Fi 供应商需要更好地为企业提供无线和有线解决方案的统一网络管理。 + +### 有线回程的需求 + +对于这两种技术,通过无线与有线网络基础设施相结合,可以提供端到端的高速通信。在企业中,Wi-Fi 通常与区域和一些较大分支机构的有线以太网交换机搭配使用。一些设备通过电缆连接到交换机,其他设备则通过 Wi-Fi 连接,而笔记本电脑可能会同时采用这两种方法。Wi-Fi 接入点通过企业内部的以太网连接,并通过光纤连接连接到 WAN 或 Internet。 + +5G 的架构广泛使用光纤,将分布式无线接入网络连接回 5G 网络的核心。光纤通常需要提供将 5G 端点连接到基于 SaaS 的应用程序所需的高带宽,并提供实时视频和高速互联网访问。专用 5G 网络也必须满足高速有线连接要求。 + +### 切换问题 + +随着手机在 5G 和 Wi-Fi 6 之间切换,企业 IT 管理者要注意到切换挑战。这些问题会影响到性能和用户满意度。一些组织正在努力制定标准,以促进 Wi-Fi 6 和 5G 间更好的互操作性。 +由于 Wi-Fi 6 的架构与 5G 接轨,在蜂窝网络与 Wi-Fi 网络间移动的体验应该更加顺滑。 + +### 5G 和 Wi-Fi 6 的对比取决于位置、应用和设备 + +Wi-Fi 6 和 5G 在企业环境中的特定情况下相互竞争,这取决于位置、应用程序和设备类型。IT 管理者应该仔细评估他们当前和正在出现的连接性需求。Wi-Fi 将继续占领室内环境优势,而移动蜂窝网络将赢得更为广泛的室外覆盖。 + +一些重叠的情况发生在体育场馆、酒店和其他大型活动场所,许多用户将争夺带宽。政府应用(包括智能城市方面)可适用于 Wi-Fi 和蜂窝。医疗保健设施中有许多分布式医疗设备和需要连接的用户。大型分布式制造环境具有相似的特点。新兴的物联网应用环境可能是最有趣的“重叠使用案例”。 + +### 对于 IT 领导者的建议 + +虽然支持它们的无线技术正在融合,但 Wi-Fi 6 和 5G 从根本上来说是不同的网络,在企业连接中都有各自的作用。企业 IT 领导者应关注 Wi-Fi 和蜂窝网络如何相互补足,Wi-Fi 将继续作为内置技术,连接 PC 和笔记本电脑,处理手机和平板电脑数据,并实现一些物联网连接。 + +4G LTE 升级到 5G 后,仍将是手机和平板电脑连接的真正移动技术,也是 PC 连接的一种选择(通过加密狗),并在连接一些物联网设备方面越来越受欢迎。5G WAN 链路将日益成为标准,作为提高 SD-WAN 可靠性的备份和远程办公室的主要链路。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3402316/when-to-use-5g-when-to-use-wi-fi-6.html + +作者:[Lee Doyle][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://www.networkworld.com/author/Lee-Doyle/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2017/07/wi-fi_wireless_communication_network_abstract_thinkstock_610127984_1200x800-100730107-large.jpg +[2]: https://www.networkworld.com/article/3203489/what-is-5g-how-is-it-better-than-4g.html +[3]: https://www.networkworld.com/article/3215907/why-80211ax-is-the-next-big-thing-in-wi-fi.html +[4]: https://www.networkworld.com/article/3330603/5g-versus-4g-how-speed-latency-and-application-support-differ.html +[5]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture +[6]: https://www.networkworld.com/article/3309439/80211ax-preview-access-points-and-routers-that-support-the-wi-fi-6-protocol-on-tap.html +[7]: https://www.facebook.com/NetworkWorld/ +[8]: https://www.linkedin.com/company/network-world diff --git a/published/202012/20190617 How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers.md b/published/202012/20190617 How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers.md new file mode 100644 index 0000000000..2e1814d627 --- /dev/null +++ b/published/202012/20190617 How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers.md @@ -0,0 +1,172 @@ +[#]: collector: (lujun9972) +[#]: translator: (quinbyjoe) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12927-1.html) +[#]: subject: (How to Use VLAN tagged NIC \(Ethernet Card\) on CentOS and RHEL Servers) +[#]: via: (https://www.linuxtechi.com/vlan-tagged-nic-ethernet-card-centos-rhel-servers/) +[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) + +如何在 CentOS/RHEL 系统中使用带 VLAN 标记的网卡 +====== + +在某些场景中,我们希望在 Linux 服务器(CentOS/RHEL)的同一块以太网卡(NIC)上分配来自不同 VLAN 的多个 IP。这个可以通过使用 VLAN 标记接口来实现。但是要做到这一点,我们必须确保交换机的端口上连接了多个 VLAN,也就是说我们可以在交换机上添加多个 VLAN 来配置聚合端口Trunk port(LCTT 译注:一般有聚合端口Trunk port接入端口Access port混合端口Hybird port三种)。 + +![](https://img.linux.net.cn/data/attachment/album/202012/17/123821uvv3oyonqnhn2bqq.jpg) + +假设我们有一个 Linux 服务器,我们在这里有两张以太网卡(`enp0s3` 和 `enp0s8`),第一张网卡(`enp0s3`)会用于数据传输,而第二张网卡(`enp0s8`) 会用于控制/流量管理。我会使用多个 VLAN 用于数据传输(或在数据流量网卡上从不同的 VLAN 中分配多个 IP)。 + +我假设连接到我服务器的数据网卡的端口,是通过映射多个 VLAN 来配置为聚合端口。 + +下面是映射到数据传输网卡(NIC)的 VLAN: + + * VLAN ID (200), VLAN N/W = 172.168.10.0/24 + * VLAN ID (300), VLAN N/W = 172.168.20.0/24 + +要在 CentOS 7 / RHEL 7 / CentOS 8 / RHEL 8 系统中使用 VLAN 标记接口,必须加载[内核模块][1] `8021q` 。 + +加载内核模块 `8021q` 可以使用下面的命令: + +``` +[root@linuxtechi ~]# lsmod | grep -i 8021q +[root@linuxtechi ~]# modprobe --first-time 8021q +[root@linuxtechi ~]# lsmod | grep -i 8021q +8021q 29022 0 +garp 14384 1 8021q +mrp 18542 1 8021q +[root@linuxtechi ~]# +``` + +可以使用 `modinfo` 命令显示内核模块 `8021q` 的详细信息: + +``` +[root@linuxtechi ~]# modinfo 8021q +filename: /lib/modules/3.10.0-327.el7.x86_64/kernel/net/8021q/8021q.ko +version: 1.8 +license: GPL +alias: rtnl-link-vlan +rhelversion: 7.2 +srcversion: 2E63BD725D9DC11C7DA6190 +depends: mrp,garp +intree: Y +vermagic: 3.10.0-327.el7.x86_64 SMP mod_unload modversions +signer: CentOS Linux kernel signing key +sig_key: 79:AD:88:6A:11:3C:A0:22:35:26:33:6C:0F:82:5B:8A:94:29:6A:B3 +sig_hashalgo: sha256 +[root@linuxtechi ~]# +``` + +现在使用 [ip 命令][2]给 `enp0s3` 网卡标记(或映射)上 `200` 和 `300` 的 VLAN 。 + +(LCTT 译注:这是先给 `enp0s3` 网卡映射上 `200` 的 VLAN 标签。) + +``` +[root@linuxtechi ~]# ip link add link enp0s3 name enp0s3.200 type vlan id 200 +``` + +使用下面的 `ip` 命令打开接口: + +``` +[root@linuxtechi ~]# ip link set dev enp0s3.200 up +``` + +同理给 `enp0s3` 网卡映射上 `300` 的 VLAN 标签: + +``` +[root@linuxtechi ~]# ip link add link enp0s3 name enp0s3.300 type vlan id 300 +[root@linuxtechi ~]# ip link set dev enp0s3.300 up +``` + +现在使用 `ip` 命令查看标记后的接口状态: + +![tagged-interface-ip-command][3] + +现在我们可以使用下面的 `ip` 命令从它们各自的 VLAN 为已经标记的接口分配 IP 地址: + +``` +[root@linuxtechi ~]# ip addr add 172.168.10.51/24 dev enp0s3.200 +[root@linuxtechi ~]# ip addr add 172.168.20.51/24 dev enp0s3.300 +``` + +使用下面的 `ip` 命令查看是否为已标记的接口分配到 IP: + +![ip-address-tagged-nic][5] + +重启之后,上面所有通过 `ip` 命令的更改都不会保持(LCTT 译注:修改后可保存至配置文件或数据库中,如果未进行保存处理,则只有当前环境生效,重启后配置失效)。系统重启和网络服务重启(LCTT 译注:`service network restart`,或 `down` 和 `up` 命令)之后这些标记接口将不可用。 + +因此,要使标记的接口在重启后保持不变,需要使用接口的 `ifcfg` 文件。 + +编辑接口(`enp0s3`)文件 `/etc/sysconfig/network-scripts/ifcfg-enp0s3`,并且增加下面的内容: + +**作者提醒**:替换为你环境中的接口名称。 + +``` +[root@linuxtechi ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 +TYPE=Ethernet +DEVICE=enp0s3 +BOOTPROTO=none +ONBOOT=yes +``` + +保存和退出文件。 + +为 id 是 `200` 的 VLAN 创建接口文件 `/etc/sysconfig/network-scripts/ifcfg-enp0s3.200`,且增加下面的内容: + +``` +[root@linuxtechi ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.200 +DEVICE=enp0s3.200 +BOOTPROTO=none +ONBOOT=yes +IPADDR=172.168.10.51 +PREFIX=24 +NETWORK=172.168.10.0 +VLAN=yes +``` + +保存并退出此文件。 + +同理为 id 是 `300` 的 VLAN 创建接口文件 `/etc/sysconfig/network-scripts/ifcfg-enp0s3.300`,且增加下面的内容: + +``` +[root@linuxtechi ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.300 +DEVICE=enp0s3.300 +BOOTPROTO=none +ONBOOT=yes +IPADDR=172.168.20.51 +PREFIX=24 +NETWORK=172.168.20.0 +VLAN=yes +``` + +保存并退出文件,这时候使用下面的命令重启网络服务, + +``` +[root@linuxtechi ~]# systemctl restart network +``` + +现在使用下面的 `ip` 命令检验标记的接口是否已配置和启动,并且正在运行中: + +![tagged-interface-status-ip-command-linux-server][6] + +以上就是本文的全部内容,我希望你已经学会了在 CentOS 7 / 8 和 RHEL 7 / 8 服务器上如何去配置和启用 VLAN 标签接口的方法。请分享你的反馈和意见。 + +-------------------------------------------------------------------------------- + +via: https://www.linuxtechi.com/vlan-tagged-nic-ethernet-card-centos-rhel-servers/ + +作者:[Pradeep Kumar][a] +选题:[lujun9972][b] +译者:[quinbyjoe](https://github.com/quinbyjoe) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linuxtechi.com/author/pradeep/ +[b]: https://github.com/lujun9972 +[1]: https://www.linuxtechi.com/how-to-manage-kernel-modules-in-linux/ +[2]: https://www.linuxtechi.com/ip-command-examples-for-linux-users/ +[3]: https://www.linuxtechi.com/wp-content/uploads/2019/06/tagged-interface-ip-command-1024x444.jpg +[4]: https://www.linuxtechi.com/wp-content/uploads/2019/06/tagged-interface-ip-command.jpg +[5]: https://www.linuxtechi.com/wp-content/uploads/2019/06/ip-address-tagged-nic-1024x343.jpg +[6]: https://www.linuxtechi.com/wp-content/uploads/2019/06/tagged-interface-status-ip-command-linux-server-1024x656.jpg +[7]: https://www.linuxtechi.com/wp-content/uploads/2019/06/VLAN-Tagged-NIC-Linux-Server.jpg \ No newline at end of file diff --git a/published/202012/20191118 Creating a Chat Bot with Recast.AI.md b/published/202012/20191118 Creating a Chat Bot with Recast.AI.md new file mode 100644 index 0000000000..e878ea1bc2 --- /dev/null +++ b/published/202012/20191118 Creating a Chat Bot with Recast.AI.md @@ -0,0 +1,164 @@ +[#]: collector: (lujun9972) +[#]: translator: (alim0x) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12878-1.html) +[#]: subject: (Creating a Chat Bot with Recast.AI) +[#]: via: (https://opensourceforu.com/2019/11/creating-a-chat-bot-with-recast-ai/) +[#]: author: (Athira Lekshmi C.V https://opensourceforu.com/author/athira-lekshmi/) + +用 Recast.AI 创建一个聊天机器人 +====== + +[![][1]][2] + +> 据 Gartner 2018 年 2 月的报告,“到 2020 年,25% 的客户服务和支持业务将在参与渠道中整合虚拟客户助理(VCA)或聊天机器人技术,而 2017 年只有不到 2%。”鉴于此,读者会发现本教程对理解开源的 Recast.AI 机器人创建平台的工作原理很有帮助。 + +聊天机器人,包括基于语音的以及其他技术的,已经实际使用了有一阵子了。从让用户参与谋杀解密游戏,到帮助完成房地产交易和医疗诊断,聊天机器人已经跨越了多个领域。 + +有许多平台可以让用户创建和部署机器人。Recast.AI(在被 SAP 收购之后现在是 SAP Conversational AI)是其中的先行者。 + +酷炫的界面、协作性以及它所提供的分析工具,让它成为流行的选择。 + +正如 Recast 官方网站说的,“它是一个创建、训练、部署和监控智能机器人的终极协作平台。” + +### 创建一个基础的机器人 + +让我们来看看如何在 Recast 创建一个基础的机器人。 + + 1. 在 https://cai.tools.sap 创建一个账户。注册可以使用电子邮箱或者 Github 账户。 + 2. 在你登录之后,你会进入仪表板。点击右上角 “+” 新建机器人图标新建一个机器人。 + 3. 在下一个界面,你会看到一系列可选的预定义技能。暂时选择问候Greetings”(图 1)。这个机器人已经经过训练,能够理解基本的问候。 + ![图 1: 设置机器人属性][3] + 4. 给机器人提供一个名字。目前来说,你可以让机器人讲一些笑话,所以我们将它命名为 Joke Bot,选择英语作为默认语言。 + 5. 因为你不会处理任何敏感信息,所以在数据策略下选择非个人数据。然后选择公共机器人选项并点击创建一个机器人。 + +所以这就是你在 Recast 平台创建的机器人。 + +### 开发一个机器人的五个阶段 + +用 Recast 官方博客的话说,在机器人的生命中有五个阶段。 + + * 训练——教授机器人需要理解的内容 + * 构建——使用机器人构建工具创建你的对话流 + * 编写代码——将机器人连接到外部 API 或数据库 + * 连接——将机器人发布到一个或多个消息平台 + * 监控——训练机器人让它更敏锐,并且了解其使用情况 + +### 通过意图训练机器人 + +你可以在仪表板上看到搜索、分叉或创建一个意图intent的选项。“‘意图’是一系列含义相同但构造不同的表达。‘意图’是你的机器人理解能力的核心。每个‘意图’代表了机器人可以理解的一种想法。”(摘自 Recast.AI 网站) + +![图 2: 机器人面板][4] + +就像先前定的,你需要一个讲笑话的机器人。所以底线是这个机器人可以理解用户在要求它讲笑话,它不应该在用户仅仅说了“Hi”的情况下回复一个笑话——这可不妙。把用户可能说的话进行分组,比如: + +``` +Tell me a joke.(给我讲个笑话。) +Tell me a funny fact.(告诉我一个有趣的事实。) +Can you crack a joke?(你可以讲个笑话吗?) +What’s funny today?(今天有什么有趣的?) +``` +…… + +在继续从头开始创建意图之前,让我们来看看搜索/分叉选项。在搜索框输入 “Joke”(图 3)。系统给出了全球的 Recast 用户创建的公开的意图清单,这就是为什么说 Recast 天然就是协作性质的。所以其实没有必要从头开始创建所有的意图,可以在已经创建的基础上进行构建。这就降低了训练具有常见意图的机器人所需的投入。 + +![图 3: 搜索一个意图][5] + + * 选择列表中的第一个意图并将其分叉到机器人上。 + * 点击分叉Fork按钮。这个意图就添加到了机器人中(图 4)。 + ![图 4: @joke 意图][6] + * 点击意图 @joke,会显示出这个意图中已经存在的表达expression列表(图 5)。 + ![图 5: 预定义表达][7] + * 向其添加更多的表达(图 6)。 + ![图 6: 建议的表达][8] + +添加了一些表达之后,机器人会给出一些建议,像图 7 展示的那样。选择几个将它们添加到意图中。你还可以根据机器人的上下文,标记你自己的自定义实体来检测关键词。 + +![图 7: 建议的表达][9] + +### 技能 + +技能skill是一块有明确目的的对话,机器人可以据此运行并达到目标。它可以像打招呼那么简单,也可以更复杂,比如基于用户提供的信息提供电影建议。 + +技能需要的不能只是一对问答,它需要多次交互。比如考虑一个帮你学习汇率的机器人。它一开始会问原货币,然后是目标货币,最后给出准确回应。结合技能可以创建复杂的对话流。 + +下面是如何给笑话机器人创建技能: + + * 去到 构建(Build) 页。点击 “+” 图标创建技能。 + * 给技能命名 “Joke”(图 8) + ![图 8: 技能面板][10] + * 创建之后,点击这个技能。你会看到四个标签。读我Read me触发器Triggers需求Requirements动作Actions。 + * 切换到需求页面。只有在笑话意图存在的时候,你才应该存储信息。所以,像图 9 那样添加一个需求。 + ![图 9: 添加一个触发器][11] + +由于这个简单的使用范例,你不需要在需求选项卡中考虑任何特定的需求,但可以考虑只有当某些关键字或实体出现时才需要触发响应的情况——在这种情况下你需要需求。 + +需求是某个技能执行动作之前需要检索的意图或实体。需求是对话中机器人可以使用的重要信息。例如用户的姓名或位置。一旦一个需求完成,相关的值就会存储在机器人的内存中,供整个对话使用。 + +现在让我们转到动作页面设置回应response(参见图 10)。 + +![图 10: 添加动作][12] + +点击添加新消息组new message group。然后选择发送消息Send message并添加一条文本消息,在这个例子中可以是任何笑话。当然,你肯定不想让你的机器人每次都说一样的笑话,你可以添加多条消息,每次从中随机选择一条。 + +![图 11: 添加文本消息][13] + +### 频道集成 + +一个成功的机器人还依赖于它的易得性。Recast 有不少的内置消息频道集成,如 Skype for Business、Kik Messenger、Telegram、Line、Facebook Messenger、Slack、Alexa 等等。除此之外,Recast 还提供了 SDK 用于开发自定义的频道。 + +此外,Recast 还提供一个可立即使用的网页聊天(在连接页面中)。你可以自定义颜色主题、标题、机器人头像等。它给你提供了一个可以添加到页面的脚本标签。你的界面现在就可以使用了(图 12)。 + +![图 12: 设置网络聊天][14] + +网页聊天的代码是开源的,开发者可以更方便地定制外观、标准回应类型等等。面板提供了如何将机器人部署到各种频道的逐步过程说明。这个笑话机器人部署在 Telegram 和网页聊天上,就像图 13 展示的那样。 + +![图 13: 网页聊天部署][15] + +![图 14: Telegram 中开发的机器人][16] + +### 还有更多 + +Recast 支持多语言,创建机器人的时候选择一个语言作为基础,但之后你有选项可以添加更多你想要的语言。 + +![图 15: 多语言机器人][17] + +这里的例子是一个简单的静态笑话机器人,实际使用中可能需要更多的和不同系统的交互。Recast 有 Web 钩子功能,用户可以连接到不同的系统来获取回应。同时它还有详细的 API 文档来帮助使用平台的每个独立功能。 + +至于分析,Recast 有一个监控面板,帮助你了解机器人的准确度以及更加深入地训练机器人。 + +-------------------------------------------------------------------------------- + +via: https://opensourceforu.com/2019/11/creating-a-chat-bot-with-recast-ai/ + +作者:[Athira Lekshmi C.V][a] +选题:[lujun9972][b] +译者:[alim0x](https://github.com/alim0x) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensourceforu.com/author/athira-lekshmi/ +[b]: https://github.com/lujun9972 +[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/04/Build-ChatBoat.jpg?resize=696%2C442&ssl=1 (Build ChatBoat) +[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/04/Build-ChatBoat.jpg?fit=900%2C572&ssl=1 +[3]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-1-Setting-the-bot-properties.jpg +[4]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-2-Setting-the-bot-properties.jpg +[5]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-3-Searching-an-intent.jpg +[6]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-4-@joke-intent.jpg +[7]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-5-Predefined-expressions.jpg +[8]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-6-Suggested-expressions.jpg +[9]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-7-Suggested-expressions.jpg +[10]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-8-Skills-dashboard.jpg +[11]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-9-Adding-a-trigger.jpg +[12]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-10-Adding-actions.jpg +[13]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-11-Adding-text-messages.jpg +[14]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-12-Setting-up-webchat.jpg +[15]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-13-Webchat-deployed.jpg +[16]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-14-Bot-deployed-in-Telegram.jpg +[17]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-15-Multi-language-bot.jpg +[18]: https://secure.gravatar.com/avatar/d24503a2a0bb8bd9eefe502587d67323?s=100&r=g +[19]: https://opensourceforu.com/author/athira-lekshmi/ +[20]: https://opensourceforu.com/wp-content/uploads/2019/11/assoc.png +[21]: https://feedburner.google.com/fb/a/mailverify?uri=LinuxForYou&loc=en_US diff --git a/published/202012/20200421 How I use Python to map the global spread of COVID-19.md b/published/202012/20200421 How I use Python to map the global spread of COVID-19.md new file mode 100644 index 0000000000..ef37e77c5a --- /dev/null +++ b/published/202012/20200421 How I use Python to map the global spread of COVID-19.md @@ -0,0 +1,158 @@ +[#]: collector: (lujun9972) +[#]: translator: (zxp93) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12935-1.html) +[#]: subject: (How I use Python to map the global spread of COVID-19) +[#]: via: (https://opensource.com/article/20/4/python-map-covid-19) +[#]: author: (AnuragGupta https://opensource.com/users/999anuraggupta) + +如何使用 Python 绘制 COVID-19 的全球扩散图 +====== + +> 使用这些开源框架创建一个彩色地图,显示病毒的可能的传播路径。 + +![](https://img.linux.net.cn/data/attachment/album/202012/20/005146t8voetski8ocm5c2.jpg) + +对于一个全球旅行司空见惯的世界来说,疾病的传播是一个真正令人担忧的问题。一些组织会跟踪重大的流行病(还有所有普遍的流行病),并将他们的跟踪工作获得的数据公开出来。不过,这些原始的数据对人来说可能很难处理,这就是为什么数据科学如此重要的原因。比如,用 Python 和 Pandas 可视化 COVID-19 在全球范围内的传播路径可能对这些数据的分析有所帮助。 + +最开始,当面对如此大数量的原始数据时可能难以下手。但当你开始处理数据之后,慢慢地就会发现一些处理数据的方式。下面是用于处理 COVID-19 数据的一些常见的情况: + + 1. 从 GitHub 上下载 COVID-19 的国家每日传播数据,保存为一个 Pandas 中的 DataFrame 对象。这时你需要使用 Python 中的 Pandas 库。 + 2. 处理并清理下载好的数据,使其满足可视化数据的输入格式。所下载的数据的情况很好(数据规整)。这个数据有一个问题是它用国家的名字来标识国家,但最好是使用三位数的 ISO 3 码(国家代码表)来标识国家。为了生成 ISO 3 码,可是使用 `pycountry` 这个 Python 库。生成了这些代码之后,可以在原有的 DataFrame 上增加一列,然后用这些代码填充进去。 + 3. 最后为了实现可视化,使用 Plotly 库中的 `express` 模块。这篇文章是使用名为choropleth 的地图(可在 Plotly 库中获得)来可视化该疾病在全球的传播。 + +### 第一步:Corona 数据 + +从下面这个网站上下载最新的 corona 数据(LCTT 译注:2020-12-14 仍可访问,有墙): + + - + +我们之间将这个下载好的数据载入为 Pandas 的 DataFrame。Pandas 提供了一个函数, `read_csv()`,可以直接使用 URL 读取数据,并返回一个 DataFrame 对象,具体如下所示: + +``` +import pycountry +import plotly.express as px +import pandas as pd +URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv' +df1 = pd.read_csv(URL_DATASET) +print(df1.head(3))  # Get first 3 entries in the dataframe +print(df1.tail(3))  # Get last 3 entries in the dataframe +``` + +在 Jupyter 上的输出截图: + +![Jupyter screenshot][2] + +从这个输出可以看到这个 DataFrame(`df1`)包括以下几列数据: + + 1. `Date` + 2. `Country` + 3. `Confirmed` + 4. `Recovered` + 5. `Dead` + +之后还可以看到 `Date` 这一列包含了从 1 月 22 日到 3 月 31 日的条目信息。这个数据是每天更新的,所以你会得到你当天的值。 + +### 第二步:清理和修改 DataFrame + +我们要往这个 DataFrame 中增加一列数据,就是那个包含了 ISO 3 编码。可以通过以下三步完成这个任务: + + 1. 创建一个包含所有国家的列表。因为在 `df1` 的 `Country` 列中,国家都是每个日期就重复一次。所以实际上 `Country` 列中对每个国家就会有多个条目。我使用 `unique().tolist()` 函数完成这个任务。 + 2. 我使用 `d_country_code` 字典对象(初始为空),然后将其键设置为国家的名称,然后它的值设置为其对应的 ISO 3 编码。 + 3. 我使用 `pycountry.countries.search_fuzzy(country)` 为每个国家生成 ISO 3 编码。你需要明白的是这个函数的返回值是一个 `Country` 对象的列表。我将这个函数的返回值赋给 `country_data` 对象。以这个对象的第一个元素(序号 `0`)为例。这个 `\` 对象有一个 `alpha_3` 属性。所以我使用 `country_data[0].alpha_3` 就能“获得”第一个元素的 ISO 3 编码。然而,在这个 DataFrame 中有些国家的名称可能没有对应的 ISO 3 编码(比如有争议的领土)。那么对这些“国家/地区”,我就用一个空白字符串来替代 ISO 3 编码。你也可以用一个 `try-except` 代码来替换这部分。`except` 中的语句可以写:`print(‘could not add ISO 3 code for ->', country)`。这样就能在找不到这些“国家/地区”对应的 ISO 3 编码时给出一个输出提示。实际上,你会发现这些“国家/地区”会在最后的输出中用白色来表示。 + 4. 在获得了每个国家的 ISO 3 编码(有些是空白字符串)之后,我把这些国家的名称(作为键)还有国家对应的 ISO 3 编码(作为值)添加到之前的字典 `d_country_code` 中。可以使用 Python 中字典对象的 `update()` 方法来完成这个任务。 + 5. 在创建好了一个包含国家名称和对应 ISO 3 编码的字典之后,我使用一个简单的循环将他们加入到 DataFrame 中。 + +### 第三步:使用 Plotly 可视化传播路径 + +choropleth 地图是一个由彩色多边形组成的地图。它常常用来表示一个变量在空间中的变化。我们使用 Plotly 中的 `px` 模块来创建 choropleth 图,具体函数为:`px.choropleth`。 + +这个函数的所包含的参数如下: + +``` +plotly.express.choropleth(data_frame=None, lat=None, lon=None, locations=None, locationmode=None, geojson=None, featureidkey=None, color=None, hover_name=None, hover_data=None, custom_data=None, animation_frame=None, animation_group=None, category_orders={}, labels={}, color_discrete_sequence=None, color_discrete_map={}, color_continuous_scale=None, range_color=None, color_continuous_midpoint=None, projection=None, scope=None, center=None, title=None, template=None, width=None, height=None) +``` + +`choropleth()` 这个函数还有几点需要注意: + + 1. `geojson` 是一个 `geometry` 对象(上面函数第六个参数)。这个对象有点让人困扰,因为在函数文档中没有明确地提到这个对象。你可以提供,也可以不提供 `geojson` 对象。如果你提供了 `geojson` 对象,那么这个对象就会被用来绘制地球特征,如果不提供 `geojson` 对象,那这个函数默认就会使用一个内建的 `geometry` 对象。(在我们的实验中,我们使用内建的 `geometry` 对象,因此我们不会为 `geojson` 参数提供值) + 2. DataFrame 对象有一个 `data_frame` 属性,在这里我们先前就提供了一个我们创建好的`df1`。 + 3. 我们用 `Confirmed`(确诊数)来决定每个国家多边形的颜色。 + 4. 最后,我们 `Date` 列创建一个 `animation_frame`。这样我们就能通过日期来划分数据,国家的颜色会随着 `Confirmed` 的变化而变化。 + +最后完整的代码如下: + +``` +import pycountry +import plotly.express as px +import pandas as pd +# ----------- Step 1 ------------ +URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv' +df1 = pd.read_csv(URL_DATASET) +# print(df1.head) # Uncomment to see what the dataframe is like +# ----------- Step 2 ------------ +list_countries = df1['Country'].unique().tolist() +# print(list_countries) # Uncomment to see list of countries +d_country_code = {} # To hold the country names and their ISO +for country in list_countries: + try: + country_data = pycountry.countries.search_fuzzy(country) + # country_data is a list of objects of class pycountry.db.Country + # The first item ie at index 0 of list is best fit + # object of class Country have an alpha_3 attribute + country_code = country_data[0].alpha_3 + d_country_code.update({country: country_code}) + except: + print('could not add ISO 3 code for ->', country) + # If could not find country, make ISO code ' ' + d_country_code.update({country: ' '}) + +# print(d_country_code) # Uncomment to check dictionary + +# create a new column iso_alpha in the df +# and fill it with appropriate iso 3 code +for k, v in d_country_code.items(): + df1.loc[(df1.Country == k), 'iso_alpha'] = v + +# print(df1.head) # Uncomment to confirm that ISO codes added +# ----------- Step 3 ------------ +fig = px.choropleth(data_frame = df1, + locations= "iso_alpha", + color= "Confirmed", # value in column 'Confirmed' determines color + hover_name= "Country", + color_continuous_scale= 'RdYlGn', # color scale red, yellow green + animation_frame= "Date") + +fig.show() +``` + +这段代码的输出就是下面这个图的内容: + +![Map][3] + +你可以从这里下载并运行[完整代码][4]。 + +最后,这里还有一些关于 Plotly 绘制 choropleth 图的不错的资源。 + + * + * + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/python-map-covid-19 + +作者:[AnuragGupta][a] +选题:[lujun9972][b] +译者:[zhangxiangping](https://github.com/zxp93) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/999anuraggupta +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud-globe.png?itok=_drXt4Tn (Globe up in the clouds) +[2]: https://opensource.com/sites/default/files/uploads/jupyter_screenshot.png (Jupyter screenshot) +[3]: https://opensource.com/sites/default/files/uploads/map_2.png (Map) +[4]: https://github.com/ag999git/jupyter_notebooks/blob/master/corona_spread_visualization +[5]: tmp.azs72dmHFd#choropleth diff --git a/published/202012/20200711 scanimage- scan from the command line.md b/published/202012/20200711 scanimage- scan from the command line.md new file mode 100644 index 0000000000..75aac2dae6 --- /dev/null +++ b/published/202012/20200711 scanimage- scan from the command line.md @@ -0,0 +1,78 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12886-1.html) +[#]: subject: (scanimage: scan from the command line!) +[#]: via: (https://jvns.ca/blog/2020/07/11/scanimage--scan-from-the-command-line/) +[#]: author: (Julia Evans https://jvns.ca/) + +scanimage:从命令行扫描! +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/05/105822m30t6x66hz3hx6x3.jpg) + +这又是一篇关于我很喜欢的一个命令行工具的文章。 + +昨晚,出于官僚原因,我需要扫描一些文档。我以前从来没有在 Linux 上使用过扫描仪,我担心会花上好几个小时才弄明白。我从使用 `gscan2pdf` 开始,但在用户界面上遇到了麻烦。我想同时扫描两面(我知道我们的扫描仪支持),但无法使它工作。 + +### 遇到 scanimage! + +`scanimage` 是一个命令行工具,在 `sane-utils` Debian 软件包中。我想所有的 Linux 扫描工具都使用 `sane` (“scanner access now easy”) 库,所以我猜测它和其他扫描软件有类似的能力。在这里,我不需要 OCR,所以我不打算谈论 OCR。 + +### 用 scanimage -L 得到你的扫描仪的名字 + +`scanimage -L` 列出了你所有的扫描设备。 + +一开始我不能让它工作,我有点沮丧,但事实证明,我把扫描仪连接到了我的电脑上,但没有插上电源。 + +插上后,它马上就能工作了。显然我们的扫描仪叫 `fujitsu:ScanSnap S1500:2314`。万岁! + +### 用 --help 列出你的扫描仪选项 + +显然每个扫描仪有不同的选项(有道理!),所以我运行这个命令来获取我的扫描仪的选项: + +``` +scanimage --help -d 'fujitsu:ScanSnap S1500:2314' +``` + +我发现我的扫描仪支持 `--source` 选项(我可以用它来启用双面扫描)和 `--resolution` 选项(我把它改为 150,以减少文件大小,使扫描更快)。 + +### scanimage 不支持输出 PDF 文件(但你可以写一个小脚本) + +唯一的缺点是:我想要一个 PDF 格式的扫描文件,而 scanimage 似乎不支持 PDF 输出。 + +所以我写了这个 5 行的 shell 脚本在一个临时文件夹中扫描一堆 PNG 文件,并将结果保存到 PDF 中。 + +``` +#!/bin/bash +set -e + +DIR=`mktemp -d` +CUR=$PWD +cd $DIR +scanimage -b --format png -d 'fujitsu:ScanSnap S1500:2314' --source 'ADF Front' --resolution 150 +convert *.png $CUR/$1 +``` + +我像这样运行脚本:`scan-single-sided output-file-to-save.pdf` + +你可能需要为你的扫描仪设置不同的 `-d` 和 `-source`。 + +### 这真是太简单了! + +我一直以为在 Linux 上使用打印机/扫描仪是一个噩梦,我真的很惊讶 `scanimage` 可以工作。我可以直接运行我的脚本 `scan-single-sided receipts.pdf`,它将扫描文档并将其保存到 `receipts.pdf`! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/07/11/scanimage--scan-from-the-command-line/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 diff --git a/published/202012/20200928 Add sound to your Python game.md b/published/202012/20200928 Add sound to your Python game.md new file mode 100644 index 0000000000..5d898e07cb --- /dev/null +++ b/published/202012/20200928 Add sound to your Python game.md @@ -0,0 +1,156 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12877-1.html) +[#]: subject: (Add sound to your Python game) +[#]: via: (https://opensource.com/article/20/9/add-sound-python-game) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +添加声音到你的 Python 游戏 +====== + +> 通过添加声音到你的游戏中,听听当你的英雄战斗、跳跃、收集战利品时会发生什么。学习如何在这个 Pygame 系列的第十三篇文章中,创建一个声音平台类精灵。 + +![](https://img.linux.net.cn/data/attachment/album/202012/02/092244du74f14837zmo7fz.jpg) + +在 [Python 3][2] 中使用 [Pygame][3] 模块来创建电脑游戏的系列文章仍在进行中,这是第十三部分。先前的文章是: + + 1. [通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程][4] + 2. [使用 Python 和 Pygame 模块构建一个游戏框架][5] + 3. [如何在你的 Python 游戏中添加一个玩家][6] + 4. [用 Pygame 使你的游戏角色移动起来][7] + 5. [如何向你的 Python 游戏中添加一个敌人][8] + 6. [在 Pygame 游戏中放置平台][9] + 7. [在你的 Python 游戏中模拟引力][10] + 8. [为你的 Python 平台类游戏添加跳跃功能][11] + 9. [使你的 Python 游戏玩家能够向前和向后跑][12] + 10. [在你的 Python 平台类游戏中放一些奖励][13] + 11. [添加计分到你的 Python 游戏][14] + 12. [在你的 Python 游戏中加入投掷机制][15] + +Pygame 提供了一种简单的方法来集成声音到你的 Python 电脑游戏中。Pygame 的 [mixer 模块][16] 可以依据命令播放一个或多个声音,并且你也可以将这些声音混合在一起,例如,你能够在听到你的英雄收集奖励或跳过敌人声音的同时播放背景音乐。 + +集成 `mixer` 模块到一个已存在的游戏中是很容易的,因此,与其给你代码示例来向你展示放置它们的位置,不如在这篇文章解释在你的应用程序中获得声音所需的四个步骤。 + +### 启动 mixer + +首先,在你代码的设置部分,启动 `mixer` 进程。你的代码已经启动 Pygame 和 Pygame 字体,因此将它们归类到一起是一个很好的主意: + +``` +pygame.init() +pygame.font.init() +pygame.mixer.init() # add this line +``` + +### 定义声音 + +接下来,你必需定义你想要使用的声音。这样就要求你的计算机上有声音文件,就像使用字体就要求你有字体文件,使用图像就要求你有图像文件一样。 + +你还必需把这些声音与你的游戏捆绑在一起,以便任何玩你游戏的人都有这些声音文件。 + +为将一个声音与你的游戏捆绑在一起,首先在你的游戏目录中创建一个新的目录,就像你为你图像和字体创建的目录一样。称它为 `sound`: + +``` +s = 'sound' +``` + +尽管在互联网上有很多声音文件,下载这些声音文件并将其与你的游戏一起分发并不一定是合法的。这看起来是很奇怪的,因为这么多来自著名电脑游戏的声音是流行文化的一部分,但法律就是这样运作的。如果你想与你的游戏一起分发一个声音文件,你必需找到一个开源或[共创许可][17]的声音文件,它们准许与游戏一起提供声音。 + +这里有一些专门提供自由和合法的声音文件的网站,包括: + + * [Freesound][18] 托管存储所有种类的音效。 + * [Incompetech][19] 托管存储背景音乐。 + * [Open Game Art][20] 托管存储一些音效和音乐。 + +一些声音文件只要你给予作曲家或声音设计师一个致谢就可以自由使用。在与你的游戏捆绑前,仔细阅读使用条件!音乐家和声音设计师在声音上的工作就像你在代码上的工作一样努力,因此即使他们不要求,给予他们致谢也是极好的。 + +给予你的声音源文件一些致谢,在一个名为 `CREDIT` 的文本文件中列出你使用的声音,并在你的游戏文件夹中放置该文本文件。 + +你也可以尝试制作你自己的音乐。优秀的 [LMMS][21] 音频工作站易于使用,并带有很多有趣的声音。它在所有主要的平台上都可以使用,也可以导出为 [Ogg Vorbis][22](OGG)音频格式。 + +### 添加声音到 Pygame + +当你找到你喜欢的一个声音文件时,下载它。如果它是一个 ZIP 或 TAR 文件,提取它并将其移动到你游戏目录中的 `sound` 文件夹中。 + +如果声音文件的名字带有空格或特殊字符,重新命名它。文件名称是完全随意的,它的名称越简单,你就越容易输入到你的代码中。 + +大多数的电脑游戏使用 OGG 格式声音文件,因为这种格式可以占有较小空间而提供高质量的声音。当你下载一个声音文件时,它可能是一个 MP3、WAVE、FLAC 或者其它的音频格式。为保持你的文件的较高兼容性和降低下载文件大小,使用一个像 [fre:ac][23] 或 [Miro][24] 这样的工具来转换这些的文件格式为 Ogg 格式。 + +例如,假设你已经下载一个称为 `ouch.ogg` 的声音文件。 + +在你代码的设置部分中,创建一个变量,代表你想使用的声音文件: + +``` +ouch = pygame.mixer.Sound(os.path.join(s, 'ouch.ogg')) +``` + +### 触发一个声音 + +为使用一个声音,你所要做的就是在你想触发它的时候调用这个变量。例如,当你的玩家击中一名敌人时,触发 `OUCH` 声音效果: + +``` +for enemy in enemy_hit_list: + pygame.mixer.Sound.play(ouch) + score -= 1 +``` + +你可以为各种动作创建声音,例如,跳跃、收集奖励、投掷、碰撞,以及其他任何你能想象到的动作。 + +### 添加背景音乐 + +如果你有想在你的游戏的背景中播放的音乐或令人激动的音效,你可以使用 Pygame 中的 `mixer` 模块中的 `music` 函数。在你的设置部分中,加载音乐文件: + +``` +music = pygame.mixer.music.load(os.path.join(s, 'music.ogg')) +``` + +然后,开始音乐: + +``` +pygame.mixer.music.play(-1) +``` + +`-1` 值告诉 Pygame 无限循环音乐文件。你可以将其设置为从 0 到更高的值之间的任意数值,以定义音乐在停止前循环多少次。 + +### 享受音效 + +音乐和声音可以为你的游戏添加很多韵味。尝试添加一些声音到你的 Pygame 工程! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/add-sound-python-game + +作者:[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/colorful_sound_wave.png?itok=jlUJG0bM (Colorful sound wave graph) +[2]: https://www.python.org/ +[3]: https://www.pygame.org/news +[4]: https://linux.cn/article-9071-1.html +[5]: https://linux.cn/article-10850-1.html +[6]: https://linux.cn/article-10858-1.html +[7]: https://linux.cn/article-10874-1.html +[8]: https://linux.cn/article-10883-1.html +[9]: https://linux.cn/article-10902-1.html +[10]: https://linux.cn/article-11780-1.html +[11]: https://linux.cn/article-11790-1.html +[12]: https://linux.cn/article-11819-1.html +[13]: https://linux.cn/article-11828-1.html +[14]: https://linux.cn/article-11839-1.html +[15]: https://linux.cn/article-12872-1.html +[16]: https://www.pygame.org/docs/ref/mixer.html +[17]: https://opensource.com/article/20/1/what-creative-commons +[18]: https://freesound.org +[19]: https://incompetech.filmmusic.io +[20]: https://opengameart.org +[21]: https://opensource.com/life/16/2/linux-multimedia-studio +[22]: https://en.wikipedia.org/wiki/Vorbis +[23]: https://www.freac.org/index.php/en/downloads-mainmenu-330 +[24]: http://getmiro.com diff --git a/published/202012/20201005 How the Linux kernel handles interrupts.md b/published/202012/20201005 How the Linux kernel handles interrupts.md new file mode 100644 index 0000000000..2abfe041e5 --- /dev/null +++ b/published/202012/20201005 How the Linux kernel handles interrupts.md @@ -0,0 +1,111 @@ +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12965-1.html) +[#]: subject: (How the Linux kernel handles interrupts) +[#]: via: (https://opensource.com/article/20/10/linux-kernel-interrupts) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) + +Linux 内核如何处理中断 +====== + +> 中断是计算机处理数据的关键部分。 + +![](https://img.linux.net.cn/data/attachment/album/202012/29/063805o5taf82ftgz85e22.jpg) + +中断是现代 CPU 工作方式中重要的部分。例如:当你每次在键盘上按下一个按键后,CPU 会被中断以使得 PC 读取用户键盘的输入。这个过程发生得相当快,以致于在使用体验上你不会感到任何变化或损害。 + +此外,键盘并不是导致中断的唯一组件。一般来说,有三种类型的事件会导致 CPU 发生中断:硬件中断、软件中断和异常。在具体介绍不同类型的中断前,我需要先定义一些术语。 + +### 定义 + +中断请求interrupt request(IRQ)是由可编程的中断控制器programmable interrupt controlle(PIC)发起的,其目的是为了中断 CPU 和执行中断服务程序interrupt service routine(ISR)。中断服务程序(ISR)是一个小的程序,用来处理具体的数据,其具体的处理方式依赖于造成中断请求(IRQ)的原因。之前正在运行的进程在中断服务程序(ISR)运行结束前都会被中断。 + +在过去,中断请求由单独的芯片处理(中断控制器芯片 PIC),I/O 设备直接与中断控制器(PIC)相连。中断控制器(PIC)管理着多种硬件的中断请求(IRQ),并且可以直接与 CPU 通信。当一个中断请求(IRQ)产生后,中断控制器(PIC)向 CPU 写入数据,并且触发中断请求引脚(INTR)。 + +现如今,中断请求(IRQ)由 CPU 中的高级可编程中断控制器advanced programmable interrupt controller(APIC)部分来处理。每个核中都拥有属于自己的高级可编程中断控制器。 + +### 中断的类型 + +正如我前文中提到的,中断可以根据其来源分为三种类型。 + +#### 硬件中断 + +当一个硬件设备想要告诉 CPU 某一需要处理的数据已经准备好后(例如:当键盘被按下或者一个数据包到了网络接口处),它将会发送一个中断请求(IRQ)来告诉 CPU 数据是可用的。接下来会调用在内核启动时设备驱动注册的对应的中断服务程序(ISR)。 + +#### 软件中断 + +当你在播放一个视频时,音频和视频是同步播放是相当重要的,这样音乐的速度才不会变化。这是由软件中断实现的,由精确的计时器系统(称为 [jiffies][2])重复发起的。这个计时器会使得你的音乐播放器同步。软件中断也可以被特殊的指令所调用,来读取或写入数据到硬件设备。 + +当系统需要实时性时(例如在工业应用中),软件中断会变得重要。你可以在 Linux 基金会的文章中找到更多相关信息:[面向嵌入式开发者的实时 Linux 介绍][3]。 + +#### 异常 + +异常exception是你可能之前就知道的中断类型。当 CPU 执行一些将会导致除零或缺页错误的指令时,任何其他运行中的程序都会被中断。在这种情况下,你会被一个弹窗提醒,或在控制台输出中看到**段错误segmentation fault核心已转储core dumped)**。但并不是所有异常都是由指令错误引起的。 + +异常可以进一步分为错误Fault陷阱Trap终止Abort。 + + * **错误**:错误是系统可以纠正的异常。例如当一个进程尝试访问某个已经被换出到硬盘的页时。当请求的地址在进程的地址空间中,并且满足访问权限时,如果页不在内存(RAM)中,将会产生一个中断请求(IRQ),并开始启用**缺页异常处理程序**把所需的页加载到内存中。如果操作成功执行,程序将继续运行。 + * **陷阱**:陷阱主要用在调试中。如果你在某个程序中设置了一个断点,你就插入了一条可以触发陷阱执行的特殊指令。陷阱可以触发上下文切换来允许你的调试器读取和展示局部变量的值。之后程序可以继续运行。陷阱同样也是运行系统调用的方式(如杀死一个进程) + * **终止**:终止是由系统表中的硬件错误或值不一致而导致的。终止不会报告造成异常的指令的所在位置。这是最严重的中断,终止将会调用系统的**终止异常处理程序**来结束造成异常的进程。 + +### 动手实践 + +中断请求按照高级可编程中断控制器(APIC)中的优先级高低排序(0是最高优先级)。前 32 个中断(0~31)是由 CPU 指定的固定序列。你可以在 [OsDev 异常][4] 页面找到关于它们的概述。随后的中断请求可以以不同的方式进行分配。中断描述表interrupt descriptor table(IDT)中记录了中断请求(IRQ)和中断服务程序(ISR)的对应关系。Linux 中定义了从 0 到 256 的 IRQ 向量。 + +为了打印出在你的系统中已注册的中断,打开一个终端并输入: + +``` +cat /proc/interrupts +``` + +你应该会看到类似如下图的结果: + +![注册的中断列表][5] + +*内核版本为5.6.6中注册的中断 (Stephan Avenwedde, [CC BY-SA 4.0][6])* + +从左到右各列的含义依次为:中断向量号、每个 CPU(0~n)中断发生次数、硬件来源、硬件源通道信息、以及造成中断请求的设备名。 + +在表的末尾,有一些非数字的中断。它们是特定于体系结构的中断,如本地计时器中断local timer interrupt(LOC)的中断请求(IRQ)号为 236。其中一些在 Linux 内核源树中的[Linux IRQ 向量布局][7]中指定。 + +![特定于体系结构的中断][8] + +*特定于体系结构的中断 (Stephan Avenwedde, [CC BY-SA 4.0][6])* + +如果要实时获取该表,请运行如下命令: + +``` +watch -n1 "cat /proc/interrupts" +``` + +### 总结 + +正确的中断请求(IRQ)处理对于硬件、驱动和软件的正常交互是必要的。幸运地是,Linux 内核很好地完成了它,一个 PC 的普通用户几乎不会注意到内核的整个中断处理过程。 + +中断相当复杂,本文仅仅是一个关于中断的概述。如果想要深入了解该主题可以阅读 [Linux Inside 电子书][9](CC BY-NC-SA 4.0)和 [Linux 内核教程][10] 仓库。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/linux-kernel-interrupts + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[萌新阿岩](https://github.com/mengxinayan) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background) +[2]: https://elinux.org/Kernel_Timer_Systems +[3]: https://www.linuxfoundation.org/blog/2013/03/intro-to-real-time-linux-for-embedded-developers/ +[4]: https://wiki.osdev.org/Exceptions +[5]: https://opensource.com/sites/default/files/uploads/proc_interrupts_1.png (Registered interrupts list) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/irq_vectors.h +[8]: https://opensource.com/sites/default/files/uploads/proc_interrupts_2.png (Architecture-specific interrupts) +[9]: https://0xax.gitbooks.io/linux-insides/content/Interrupts/ +[10]: https://linux-kernel-labs.github.io/refs/heads/master/lectures/interrupts.html# diff --git a/published/202012/20201022 How to influence people to join open source.md b/published/202012/20201022 How to influence people to join open source.md new file mode 100644 index 0000000000..2de7e12310 --- /dev/null +++ b/published/202012/20201022 How to influence people to join open source.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12926-1.html) +[#]: subject: (How to influence people to join open source) +[#]: via: (https://opensource.com/article/20/10/influence-open-source) +[#]: author: (Joshua Pearce https://opensource.com/users/jmpearce) + +如何感召人们让其参与到开源活动中 +====== + +> 向他人介绍开源最有效的办法是,告诉他们开源可以提供给他们想要的。 + +![建筑物中的管道][1] + +如果你在浏览这里,可能你会编程,而且或许你正使用某些难以捉摸的 [Linux 发行版][2]的开源浏览器上阅读这些内容。你也许很多年没有看到过浏览器广告了,因为你正运行着一个[开源的广告拦截器][3]。当你想到企鹅时,你感到温暖而又陌生。 + +简单地说,你知道开源的力量,并且它已经成了你生活的一部分。不幸的是,并不是每个人都发现了如何利用开源的方式。他们的电脑慢得令人痛苦,当他们上网浏览时他们看到的广告比内容都多,他们把钱花在专利和版权的垃圾上。这些人中可能有些是与你有关系的,例如你的侄女和侄子。 + +### 知识就是财富 + +那么你如何向你的侄女和侄子(以及任意一个人)介绍开源? + +我尝试着回答这个问题,作为一个教授,一个以长篇大论著称的职业,我最终还是出了一本书:[《使用开源项目创造、分享和省钱》][4],由 McGraw-Hill 出版。 + +我认为诀窍在于先发现你的侄女或侄子想要获取但没有钱去购买的东西,然后向他们展示如何通过开源知识来得到他们想要的东西。 + +![可升降的桌子][5] + +*[可升降的桌子][6] (Joni Steiner and Nick Ierodiaconou, [CC-BY-SA-NC][7])* + +知识是所有商品里独特的财富。不像黄金或小麦,它不仅在分享时会保留价值,而且可以迅速增值。因为互联网信息分享成本趋近于零,因此无限地扩展了此过程。每个可以访问互联网的人都史无前例地拥有这一财富。例如,我提供[免费的仓库链接][4]到关于书籍、教育、电影、攻略、地图、音乐、照片、艺术品、软件和烹饪等内容。 + +### 不要买,而是去制作它 + +免费和开源逐渐扩展到现实世界,我们现在有机会从根本上降低通过沃尔玛或亚马逊购买的东西的成本,包括[玩具][8]、[电器][9]、[家居用品][10]和衣服。使用 3D 打印或类似的工具,结合开源分享和数字制造,使得每个人可以制造属于他们自己的复杂的、有用的工具。 + +![3D 打印的家居用品][11] + +*[3D 打印的家居用品][12] (Joshua M. Pearce, [CC BY-SA 3.0][13])* + +前些年,科学家已经[在他们的实验室][14]中做这些工作了。但是现在,任何人都可以轻松地定制满足他们具体需求的产品。已经有数百万个免费的设计可供使用。 + +![Recyclebot][15] + +*[Recyclebot][16] (Joshua M. Pearce, [GPLv3][17])* + +真正降低一个产品的价格,就要[通过垃圾来获取其原材料][18]。伴随着小规模的回收利用过程(例如我实验室正在使用的 [Recyclebots][19])最近得到了改进,这使得人们可以从废物中制造有用的产品,因此产生了一系列让人眼花缭乱的产品。最重要的是,任何人都可以利用专有系统的一小部分成本来获取到这些定制的绿色产品。我们生产出相比常规商品的销售税更低的[定制产品][20]——它们具有相同的功能,更好的定制形式,而且几乎没有成本。 + +### 了解更多 + +在[《使用开源项目创建、分享和省钱的项目》][4]一书中,我分享了在家庭制造和回收利用的潜力,以及如何利用开源来为大宗商品评分,如房屋、电力。你可以在我和 Megan Krieger 以及 Janet Callahan 三人为密歇根理工学院的 [Husky Bites][21] 录制的网络研讨会了解更多。 + +希望这些知识能足够激励你把一到两个侄女或侄子带到开源的路上来! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/influence-open-source + +作者:[Joshua Pearce][a] +选题:[lujun9972][b] +译者:[萌新阿岩](https://github.com/mengxinayan) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jmpearce +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open_pipe_red_hat_tower_building.png?itok=8ho3yi7L (pipe in a building) +[2]: https://distrowatch.com/ +[3]: https://opensource.com/article/20/4/ad-blockers +[4]: https://www.appropedia.org/Create,_Share,_and_Save_Money_Using_Open-Source_Projects +[5]: https://opensource.com/sites/default/files/uploads/opendesk_furniture_lift-standing-desk.jpg (Lift Standing Desk) +[6]: https://www.appropedia.org/File:Opendesk_furniture_lift-standing-desk.jpg +[7]: https://creativecommons.org/licenses/by-nc-sa/2.0/ +[8]: http://www.mdpi.com/2227-7080/5/3/45 +[9]: https://doi.org/10.3390/inventions3030064 +[10]: https://www.mdpi.com/2227-7080/5/1/7 +[11]: https://opensource.com/sites/default/files/uploads/3dprinted_household.jpg (3D printed household items) +[12]: https://www.appropedia.org/File:3dprinted_household.JPG +[13]: https://creativecommons.org/licenses/by-sa/3.0/ +[14]: https://opensource.com/article/20/10/open-source-hardware-savings +[15]: https://opensource.com/sites/default/files/uploads/recyclebotrep.png (Recyclebot) +[16]: https://www.appropedia.org/File:Recyclebotrep.png +[17]: https://www.gnu.org/licenses/gpl-3.0.html +[18]: https://www.academia.edu/34738483/Tightening_the_Loop_on_the_Circular_Economy_Coupled_Distributed_Recycling_and_Manufacturing_with_Recyclebot_and_RepRap_3-D_Printing +[19]: https://www.appropedia.org/Recyclebot +[20]: https://opensource.com/article/17/3/how-to-create-consumer-goods-open-hardware +[21]: https://www.facebook.com/Michigan-Tech-College-of-Engineering-109353424030003/videos/husky-bites-presents-special-guest-joshua-m-pearce/2669023713361207/ diff --git a/published/202012/20201026 7 Git tricks that changed my life.md b/published/202012/20201026 7 Git tricks that changed my life.md new file mode 100644 index 0000000000..e1bfdbfa84 --- /dev/null +++ b/published/202012/20201026 7 Git tricks that changed my life.md @@ -0,0 +1,189 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12894-1.html) +[#]: subject: (7 Git tricks that changed my life) +[#]: via: (https://opensource.com/article/20/10/advanced-git-tips) +[#]: author: (Rajeev Bera https://opensource.com/users/acompiler) + +改变我使用 Git 工作方式的七个技巧 +====== + +> 这些有用的技巧将改变你使用这个流行的版本控制系统的工作方式。 + +![](https://img.linux.net.cn/data/attachment/album/202012/07/092803d67fa7bttuuj98fb.jpg) + +Git 是目前最常见的版本控制系统之一,无论是私有系统还是公开托管的网站,都在使用它进行各种开发工作。但无论我对 Git 的使用有多熟练,似乎总有一些功能还没有被发现,下面是改变我使用 Git 工作方式的七个技巧。 + +### 1、Git 中的自动更正 + +我们有时都会打错字,但如果启用了 Git 的自动更正功能,就可以让 Git 自动修正打错的子命令。 + +假设你想用 `git status` 检查状态,却不小心输入了 `git stats`。正常情况下,Git 会告诉你 `stats` 不是一条有效的命令: + +``` +$ git stats +git: ‘stats’ is not a git command. See ‘git --help’. + +The most similar command is +status +``` + +为了避免类似的情况发生,请在 Git 配置中启用 Git 自动更正功能: + +``` +$ git config --global help.autocorrect 1 +``` + +如果你希望这个命令只适用于你当前的版本库,请省略 `--global` 选项。 + +这条命令启用了自动更正功能。更深入的教程可以在 [Git Docs][2] 中找到,但尝试一下和上面一样的错误命令,就能很好地了解这个配置的作用: + +``` +$ git stats +git: ‘stats’ is not a git command. See ‘git --help’. +On branch master +Your branch is up to date with ‘origin/master’. + +nothing to commit, working tree clean +``` + +Git 现在不会建议使用其他子命令,而是直接运行最上面的建议,在本例中是 `git status`。 + +### 2、计算你的提交量 + +你需要计算提交数量可能有很多原因。例如,许多开发者通过计算提交数量来判断何时该增加构建版本号,或者只是想了解项目的进展情况。 + +要计算提交数量其实很简单直接,下面是 Git 的命令: + +``` +$ git rev-list --count branch-name +``` + +在上面的命令中,`branch-name` 应该是当前版本库中有效的分支名称: + +``` +$ git rev-list –count master +32 +$ git rev-list –count dev +34 +``` + +### 3、优化你的仓库 + +你的代码仓库不仅对你有价值,对你的组织也有价值。你可以通过一些简单的做法来保持你的版本库的清洁和更新。其中一个最好的做法是 [使用 .gitignore 文件][3]。使用这个文件,就是告诉 Git 不要存储许多不需要的文件,比如二进制文件、临时文件等等。 + +为了进一步优化你的版本库,你可以使用 Git 的垃圾收集功能: + +``` +$ git gc --prune=now --aggressive +``` + +当你或你的团队大量使用 `pull` 或 `push` 命令时,这条命令就会起到帮助作用。 + +这个命令是一个内部工具,可以清理仓库中无法访问或 “孤儿” Git 对象。 + +### 4、备份未被跟踪的文件 + +大多数时候,删除所有未被跟踪的文件是安全的。不过很多时候,你不仅要删除,还要为你的未跟踪文件创建一个备份,以备以后需要。 + +通过 Git 和一些 Bash 命令管道,可以很容易地为你的未被跟踪的文件创建一个压缩包: + +``` +$ git ls-files --others --exclude-standard -z |\ +xargs -0 tar rvf ~/backup-untracked.zip +``` + +上面的命令制作了一个名为 `backup-untracked.zip` 的存档(并排除了 `.gitignore` 中列出的文件)。 + +### 5、了解你的 .git 文件夹 + +每个版本库都有一个 `.git` 文件夹。它是一个特殊的隐藏文件夹。 + +``` +$ ls -a +. … .git +``` + +Git 的工作主要依赖于两个部分: + + 1. 工作树(你当前签出的文件状态)。 + 2. 你的 Git 仓库的路径(即你的 `.git` 文件夹的位置,其中包含版本信息)。 + +这个文件夹存储了所有的引用和其他重要的细节,比如配置、仓库数据、HEAD 状态、日志等等。 + +如果你删除这个文件夹,你的源代码的当前状态不会被删除,但你的远程信息,如你的项目历史记录,会被删除。删除这个文件夹意味着你的项目(至少是本地副本)不再处于版本控制之下。这意味着你不能跟踪你的变化;你不能从远程拉取或推送。 + +一般来说,不需要在 `.git` 文件夹里做什么,也没有什么应该做的。它是由 Git 管理的,基本上被认为是个禁区。然而,这个目录里有一些有趣的工件,包括 HEAD 的当前状态。 + +``` +$ cat .git/HEAD +ref: refs/heads/master +``` + +它还可能包含对你的存储库的描述: + +``` +$ cat .git/description +``` + +这是一个未命名的仓库,编辑这个 `description` 文件可以命名这个仓库。 + +Git 钩子文件夹(`hooks`)也在这里,里面有一些钩子示例文件。你可以阅读这些示例来了解通过 Git 钩子可以实现什么,你也可以 [阅读 Seth Kenlon 的 Git 钩子介绍][4]。 + +### 6、查看另一个分支的文件 + +有时你想查看另一个分支的文件的内容。用一个简单的 Git 命令就可以实现,而且不需要切换分支。 + +假设你有一个名为 [README.md][5] 的文件,它在 `main` 分支中,而你正在 `dev` 分支上工作。 + +使用下面的 Git 命令,你可以在终端上完成: + +``` +$ git show main:README.md +``` + +一旦你执行了这个命令,你就可以在你的终端上查看文件的内容。 + +### 7、在 Git 中搜索 + +只需一个简单的命令,你就可以像专业人士一样在 Git 中搜索。更棒的是,即使你不确定是在哪个提交或分支上做的修改,也可以在 Git 中搜索。 + +``` +$ git rev-list --all | xargs git grep -F 'string' +``` + +例如,假设你想在你的版本库中搜索 `font-size: 52 px;` 这个字符串: + +``` +$ git rev-list –all | xargs git grep -F 'font-size: 52 px;' +F3022…9e12:HtmlTemplate/style.css: font-size: 52 px; +E9211…8244:RR.Web/Content/style/style.css: font-size: 52 px; +``` + +### 试试这些技巧 + +希望这些高级技巧对你有用,提高你的工作效率,为你节省很多时间。 + +你有喜欢的 [Git 小技巧][6] 吗?在评论中分享吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/advanced-git-tips + +作者:[Rajeev Bera][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/acompiler +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_code_help_autocorrect_code +[3]: https://linux.cn/article-12524-1.html +[4]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6 +[5]: http://README.md +[6]: https://acompiler.com/git-tips/ diff --git a/published/202012/20201030 How to rebase to Fedora 33 on Silverblue.md b/published/202012/20201030 How to rebase to Fedora 33 on Silverblue.md new file mode 100644 index 0000000000..c0c218cd07 --- /dev/null +++ b/published/202012/20201030 How to rebase to Fedora 33 on Silverblue.md @@ -0,0 +1,93 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12880-1.html) +[#]: subject: (How to rebase to Fedora 33 on Silverblue) +[#]: via: (https://fedoramagazine.org/how-to-rebase-to-fedora-33-on-silverblue/) +[#]: author: (Michal Konečný https://fedoramagazine.org/author/zlopez/) + +如何在 Silverblue 上变基到 Fedora 33? +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/02/232440exewdbwdhde4mqhv.jpg) + +Silverblue 是[一个建立在 Fedora 之上的桌面操作系统][2]。它非常适合日常使用、开发和基于容器的工作流程。它提供了[众多的优势][3],例如在出现任何问题时能够回滚。如果你想在你的 Silverblue 系统上更新到 Fedora 33,这篇文章会告诉你如何做。它不仅告诉你该怎么做,还告诉你如果发生了不可预见的事情时该如何回退。 + +在实际做变基到 Fedora 33 之前,你应该应用任何挂起的更新。在终端中输入以下内容: + +``` +$ rpm-ostree update +``` + +或通过 GNOME 软件中心安装更新并重启。 + +### 使用 GNOME 软件中心变基 + +GNOME 软件中心会在更新界面显示有新版本的 Fedora 可用。 + +![Fedora 33 is available][4] + +首先你需要做的是下载新镜像,点击 “Download” 按钮。这将需要一些时间,完成后你会看到更新已经准备好安装了。 + +![Fedora 33 is ready for installation][5] + +点击 “Install” 按钮。这一步只需要几分钟,然后会提示你重启电脑。 + +![Restart is needed to rebase to Fedora 33 Silverblue][6] + +点击 “Restart” 按钮就可以了。重启后,你将进入新的 Fedora 33 版本。很简单,不是吗? + +### 使用终端变基 + +如果你喜欢在终端上做所有的事情,那么接下来的指南就适合你。 + +使用终端变基到 Fedora 33 很简单。首先,检查 33 版本分支是否可用: + +``` +$ ostree remote refs fedora +``` + +你应该在输出中看到以下内容: + +``` +fedora:fedora/33/x86_64/silverblue +``` + +接下来,将你的系统变基到 Fedora 33 分支。 + +``` +$ rpm-ostree rebase fedora:fedora/33/x86_64/silverblue +``` + +最后要做的是重启你的电脑并启动到 Fedora 33。 + +### 如何回滚 + +如果有什么不好的事情发生。例如,如果你无法启动到 Fedora 33,那很容易回滚回去。在启动时选择 GRUB 菜单中的前一个条目,你的系统就会以切换到 Fedora 33 之前的状态启动。要使这一改变永久化,请使用以下命令: + +``` +$ rpm-ostree rollback +``` + +就是这样了。现在你知道如何将 Silverblue 变基为 Fedora 33 并回滚了。那为什么不在今天就做呢? + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/how-to-rebase-to-fedora-33-on-silverblue/ + +作者:[Michal Konečný][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/zlopez/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/02/fedora-silverblue-logo.png +[2]: https://docs.fedoraproject.org/en-US/fedora-silverblue/ +[3]: https://fedoramagazine.org/give-fedora-silverblue-a-test-drive/ +[4]: https://fedoramagazine.org/wp-content/uploads/2020/10/Screenshot-from-2020-10-29-12-53-37-1024x725.png +[5]: https://fedoramagazine.org/wp-content/uploads/2020/10/Screenshot-from-2020-10-29-13-00-15-1024x722.png +[6]: https://fedoramagazine.org/wp-content/uploads/2020/10/Screenshot-from-2020-10-29-13-01-32-1024x727.png diff --git a/published/202012/20201109 Day 1- a confusing Rails error message.md b/published/202012/20201109 Day 1- a confusing Rails error message.md new file mode 100644 index 0000000000..32c5ef8659 --- /dev/null +++ b/published/202012/20201109 Day 1- a confusing Rails error message.md @@ -0,0 +1,97 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12884-1.html) +[#]: subject: (Day 1: a confusing Rails error message) +[#]: via: (https://jvns.ca/blog/2020/11/09/day-1--a-little-rails-/) +[#]: author: (Julia Evans https://jvns.ca/) + +Rails 之旅第 1 天:一个令人困惑的 Rails 错误信息 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/04/080957f0p4piqz52bypqb5.jpg) + +今天,我开始了一个 Recurse Center 的班次学习!我认识了一些人,并开始了一个小小的有趣的 Rails 项目。我想我今天不会谈太多关于这个项目的实际内容,但这里有一些关于 Rails 一天的快速笔记。 + +### 一些关于开始的笔记 + +在建立 Rails 项目的过程中,我学到的主要是: + + 1. 它默认使用 sqlite,你必须告诉它使用 Postgres。 + 2. Rails 默认包含了大量的东西,你可以禁用。 + +我安装并 `rm -rf` Rails 大概 7 次后才满意,最后用了这个咒语: + +``` +rails new . -d postgresql --skip-sprockets --skip-javascript +``` + +主要是因为我想用 Postgres 而不是 sqlite,而且跳过 sprockets 和 javascript 似乎能让安装 Rails 的速度更快,而且我想如果我决定要它们的话,我可以在以后再安装。 + +### 官方的 Rails 指南真的很不错 + +我在创建我的 Rails 入门应用时主要参考了 2 个资源: + + * DHH 在 2005 年的 Rails 原版演讲 (这次我没有看,但上次我花了一天时间学习 Rails 时看了,我发现它很有启发和帮助)。 + * 官方的 Rails 入门指南,似乎非常简短明了 。 + +### 一个神秘的错误信息:`undefined method 'user'` + +我喜欢 bug,所以今天我遇到了一个奇怪的 Rails 错误! 我有一些看起来像这样的代码: + +``` +@user = User.new(user_params) +@user.save +``` + +很简单吧?但当这段代码运行时,我得到了这个令人费解的错误信息: + +``` +undefined method `user' for # Did you mean? super +``` + +我对这里发生的事情感到**超级**困惑,因为我没有调用一个叫做 `user` 的方法。我调用的是 `.save`。什么嘛?!我对此感到困惑和沮丧,大概呆了 20 分钟,最后我看了看我的 `User` 模型,发现了这段代码: + +``` +class User < ApplicationRecord + has_secure_password + + validates :user, presence: true, uniqueness: true +end +``` + +`validates :user...` *应该*是一些 Rails 魔法,验证每个 `User` 都有一个 `username`,而且用户名必须是唯一的。但我犯了一个错,我写的是 `user` 而不是 `username`。我把这个问题解决了,然后一切都正常了!万岁。 + +我仍然不明白我应该如何调试这个问题:堆栈跟踪告诉我问题出在 `@user.save` 行,根本没有提到 `validates :user` 的事情。我觉得一定有办法调试这个问题,但我不知道是什么办法。 + +我学 Rails 的目的就是想看看 Rails 的魔力在实践中是如何发挥的,所以这是个很有意思的 bug,早早的就掉坑里了。 + +### 一个简单的用户管理系统 + +我决定在我的玩具应用中加入用户。我在网上搜索了一下,发现有一个非常流行的叫做 [devise][1] 的工具可以处理用户。我发现它的 `README` 有点让人不知所措,而且我知道想要在我的玩具应用中建立一个非常简陋的用户管理系统,所以我遵循了这个名为《[Rails 5.2 中从零开始进行用户验证][2]》的指南,到目前为止,这个指南似乎还不错。Rails 似乎已经有了一大堆管理用户的内置东西,我真的很惊讶于这本指南的短小和我需要写的代码之少。 + +我在实现用户功能的时候了解到,Rails 有一个内置的神奇的会话管理系统(参见 [Rails 会话如何工作][3]。默认情况下,所有的会话数据似乎都存储在用户电脑上的 cookie 中,不过我想如果 cookie 太大了,你也可以把会话数据存储在数据库中。 + +已经有了会话管理系统,有了 cookie 和用户,却不太清楚到底发生了什么,这肯定是有点奇怪的,但也是挺好玩的!我们会看看情况如何。我们将拭目以待。 + +### 明天:更多的 Rails! + +也许明天我可以在实现我的有趣的 rails 应用的想法上取得一些进展! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/09/day-1--a-little-rails-/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://github.com/heartcombo/devise +[2]: https://medium.com/@wintermeyer/authentication-from-scratch-with-rails-5-2-92d8676f6836 +[3]: https://www.justinweiss.com/articles/how-rails-sessions-work/ diff --git a/published/202012/20201110 Day 2- Rails associations - dragging divs around.md b/published/202012/20201110 Day 2- Rails associations - dragging divs around.md new file mode 100644 index 0000000000..38bf83bcf2 --- /dev/null +++ b/published/202012/20201110 Day 2- Rails associations - dragging divs around.md @@ -0,0 +1,117 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12890-1.html) +[#]: subject: (Day 2: Rails associations & dragging divs around) +[#]: via: (https://jvns.ca/blog/2020/11/10/day-2--rails-associations---dragging-divs-around/) +[#]: author: (Julia Evans https://jvns.ca/) + +Rails 之旅第 2 天:Rails 关联和拖动 div +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/05/212345zz8jajhaj0hh8h2f.jpg) + +大家好!今天是我搭建这个玩具项目的第 2 天。下面再来记录一下关于 Rails 的一些有趣的事情吧! + +### 目标:做一个冰箱诗歌论坛 + +我想做一种无聊的标准网站来学习 Rails,并且其他人可以与之互动,就像一个论坛一样! 但如果人们真的可以在网站上打字,那就会产生各种各样的问题(如果他们是垃圾邮件发送者怎么办?又或者只是言语刻薄?)。 + +我想到的第一个想法是,可以让人们与网站互动,但实际上却不能在网站上打字,那就是一个“冰箱诗歌论坛”,只给你一组固定的字,你就可以随意组合。 + +所以,这就是我们的计划! + +我这个项目的目标是想知道我是否能用 Rails 来做其他的小型网络项目(而不是像我通常做的那样,使用一些更基本的东西,比如 Flask,或者放弃后端,用 Javascript 来写所有东西)。 + +### 怎么把字拖来拖去呢?jQuery 的可拖放 UI! + +我想让大家能够把文字拖动起来,但我又不想写很多 Javascript。结果发现这超级简单 —— 有一个 jQuery 库可以做到,它叫做 `draggable`!一开始,拖动并不成功。 + +一开始拖动在手机上是不行的,但是有一个技巧可以让 jQuery UI 在手机上工作,叫做 [jQuery UI touch punch][1]。下面是它的样子(有兴趣看工作原理的可以查看源码,代码很少)。 + +> `banana` `forest` `cake` `is` + +### 一个有趣的 Rails 功能:关联 + +我以前从来没有使用过关系型 ORM,对于 Rails,我很兴奋的一件事就是想看看使用 Active Record 是什么样子的!今天我了解了 Rails 的 ORM 功能之一:[关联][2]。如果你像我一样对 ORM 完全不了解的话,那就来看看是怎么回事吧。 + +在我的论坛中,我有: + + * 用户 + * 话题(我本来想把它叫做“线索”,但显然这在 Rails 中是一个保留词,所以现在叫做“话题”)。 + * 帖子 + +当显示一个帖子时,我需要显示创建该帖子的用户的用户名。所以我想我可能需要写一些代码来加载帖子,并为每个帖子加载用户,就像这样(在 Rails 中,`Post.where` 和 `User.find` 将会运行 SQL 语句,并将结果转化为 Ruby 对象): + +``` +@posts = Post.where(topic_id: id) +@posts.each do |post| + user = User.find(post.user_id) + post.user = user +end +``` + +这还不够好,它要为每个帖子做一次单独的 SQL 查询!我知道有一个更好的方法,我发现它叫做[关联][2]。这个链接是来自 的指南,到目前为止,它对我很有帮助。 + +基本上我需要做的就是: + + 1. 在 `User` 模型中添加一行 `has_many :post`。 + 2. 在 `Post` 模型中添加一行 `belongs_to :user`。 + 3. Rails 现在知道如何将这两个表连接起来,尽管我没有告诉它要连接到什么列上!我认为这是因为我按照它所期望的惯例命名了 `posts` 表中的 `user_id` 列。 + 4. 对 `User` 和 `Topic` 做完全相同的事情(一个主题也有很多帖子:`has_many :posts`)。 + +然后我加载每一个帖子和它的关联用户的代码就变成了只有一行! 就是这一行: + +``` +@posts = @topic.posts.order(created_at: :asc).preload(:user) +``` + +比起只有一行更重要的是,它不是单独做一个查询来获取每个帖子的用户,而是在 1 个查询中获取所有用户。显然,在 Rails 中,有一堆[不同的方法][3]来做类似的事情(预加载、急切加载、联接和包含?),我还不知道这些都是什么,但也许我以后会知道的。 + +### 一个有趣的 Rails 功能:脚手架! + +Rails 有一个叫 `rails` 的命令行工具,它可以生成很多代码。例如,我想添加一个 `Topic` 模型/控制器。我不用去想在哪里添加所有的代码,可以直接运行 + +``` +rails generate scaffold Topic title:text +``` + +并生成了一堆代码,这样我已经有了基本的端点来创建/编辑/删除主题(`Topic`)。例如,这是我的[现在的主题控制器][4],其中大部分我没有写(我只写了高亮的 3 行)。我可能会删除很多内容,但是有一个起点,让我可以扩展我想要的部分,删除我不想要的部分,感觉还不错。 + +### 数据库迁移! + +`rails` 工具还可以生成数据库迁移! 例如,我决定要删除帖子中的 `title` 字段。 + +下面是我要做的: + +``` +rails generate migration RemoveTitleFromPosts title:string +rails db:migrate +``` + +就是这样 —— 只要运行几个命令行咒语就可以了! 我运行了几个这样的迁移,因为我改变了对我的数据库模式的设想。它是相当直接的,到目前为止 —— 感觉很神奇。 + +当我试图在一列中的某些字段为空的地方添加一个“不为空”(`not null`)约束时,情况就变得有点有趣了 —— 迁移失败。但我可以修复违例的记录,并轻松地重新运行迁移。 + +### 今天就到这里吧! + +明天,如果我有更多的进展,也许我会把它放在互联网上。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/10/day-2--rails-associations---dragging-divs-around/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://github.com/furf/jquery-ui-touch-punch +[2]: https://guides.rubyonrails.org/association_basics.html +[3]: https://blog.bigbinary.com/2013/07/01/preload-vs-eager-load-vs-joins-vs-includes.html +[4]: https://github.com/jvns/refrigerator-forum/blob/776b3227cfd7004cb1efb00ec7e3f82a511cbdc4/app/controllers/topics_controller.rb#L13-L15 diff --git a/published/202012/20201113 The state of the art of microservices in 2020.md b/published/202012/20201113 The state of the art of microservices in 2020.md new file mode 100644 index 0000000000..217b280dcf --- /dev/null +++ b/published/202012/20201113 The state of the art of microservices in 2020.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: (zxp93) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12941-1.html) +[#]: subject: (The state of the art of microservices in 2020) +[#]: via: (https://www.linux.com/news/the-state-of-the-art-of-microservices-in-2020/) +[#]: author: (Linux.com Editorial Staff https://www.linux.com/author/linuxdotcom/) + +2020 年微服务现状 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/22/122634t2hwh2hh12bvrbsd.jpg) + +> “微服务架构风格是一种将 **单个应用程序** 开发为一套 **小型服务** 的方法,每个服务都在 **自己的进程中运行,并使用轻量级的通信机制(通常是 HTTP 类型的 API)进行通信**。这些服务是围绕 **业务能力** 构建的,并且可以通过 **全自动化的部署机制** 进行 **独立部署**。目前对这些服务几乎没有集中的管理,这些服务可以用 **不同的编程语言** 编写,也能使用 **不同的数据存储技术**。” +> +> —— James Lewis 和 Martin Fowler (2014) [^6] + +### 介绍 + +预计在 2020 年,全球云端的微服务市场将以 22.5% 的速度增长,其中美国市场预计将保持 27.4% 的增长率[^5]。目前的趋势是,开发人员将从本地托管的应用程序转移到云端。这将有助于企业最大限度地减少停机时间、优化资源并降低基础设施成本。同时专家们还预测,到了 2022 年,90% 的应用程序将会使用微服务架构进行开发[^5]。本文将帮助你了解什么是微服务,以及目前的公司如何使用它的。 + +### 什么是微服务? + +微服务已经在全球范围内被广泛使用。但是,微服务到底是什么?微服务是一种基于许多小型、互联服务的体系结构模式。它们基于 **单一责任原则**。根据 Robert C. Martin 的说法,“将因相同原因而变化的事物聚集起来,将因不同原因而变化的事物分离开来”。[^2]微服务架构也被扩展到了 **松耦合服务** 中,可以 **独立地开发、部署和维护**[^2]。 + +### 远离单体架构 + +微服务通常和传统的单体软件架构做对比。在单体架构中,软件是被设计为自足的,也就是说,这个程序中的各个组件都是互相连通和互相依赖的,而不是松散耦合的。在一个紧耦合的架构中(单体monolithic),每个组件和它相关联的组件必须按照指定的顺序组合起来,才能被执行或编译[^7]。当其中有一个组件需要更新时,整个应用都要被重写。 + +而这个现象在使用微服务架构的应用中就不会出现。因为每一个模块都是独立的,每个模块都可以更新修改而不影响程序的其他部分。因此,降低了对更改一个组件会对其他组件造成影响的风险。 + +如果公司的架构很难升级,或者维护过于复杂和昂贵,那么他们可能会遇到麻烦,不能扩展单体架构的应用[^4]。把一个复杂的任务分解成小组件,彼此独立工作,就是解决这个问题的方法。 + +![][1] + +*单一体系架构 vs. 微服务架构 (图片来自 [^3])* + +### 开发者如何构建属于自己的微服务 + +微服务以提高*可扩展性*和*性能*而闻名。然而,这些是世界各地的开发者开发属于他们自己的微服务的主要原因吗?《微服务 2020 研究现状》[^1]披露了全球开发者如何构建他们的微服务,以及他们对微服务的看法。这份报告是在来自欧洲、北美、中南美洲、中东、东南亚、澳大利亚和新西兰的 660 名微服务专家的帮助下完成的。下表列出了微服务成熟度相关问题的平均评分[^1]: + +**分类** | **平均得分(满分为5分)** +---|--- +创建新项目 | 3.8 +维护与调试 | 3.4 +工作效率 | 3.9 +解决可扩展性问题 | 4.3 +解决性能问题 | 3.9 +团队合作 | 3.9 + +从上表可知,大部分专家都对使用微服务来解决可扩展性问题感到满意。与之相反的是,维护与调试对他们来说似乎是一个挑战。 + +从他们所使用的架构技术来说,大部分专家使用 Javascript/Typescript (大约 ⅔ 的微服务是使用这些语言构建的),其次使用的是 Java。 + +尽管有很多部署微服务的选择,但大多数专家使用 AWS(49%),其次是他们自己的服务器。另外,有 62% 的人更喜欢用 AWS Lambda 作为无服务器解决方案。 + +这些人所使用的大多数微服务都使用 HTTP 进行通信,其次是 events 和 gRPC。此外,大多数专家将 RabbitMQ 用于消息代理,其次是 Kafka 和 Redis。 + +而且,大多数人使用微服务持续集成(CI)。在报告中,87% 的受访者使用诸如 GitLab CI、Jenkins 或 GitHub Actions 等 CI 解决方案。 + +在 86% 的受访者中,最受欢迎的调试解决方案是日志,其中 27% 的受访者**只**使用日志。 + +最后,大多数人认为微服务架构将成为更复杂的系统或后端开发的标准。 + +### 微服务的成功案例 + +许多公司已经从单体架构转向微服务架构。 + +#### 亚马逊 + +在 2001 年,开发延迟、编码挑战和服务相互依赖性使得亚马逊Amazon无法满足其不断增长的用户群的可扩展性需求。由于需要从头开始重构他们的单体架构,亚马逊将其单体架构应用程序拆分为小型的、独立的、针对服务的应用程序[^3][^9]。 + +2001 年,在微服务这个词开始流行之前的几年,亚马逊决定改用微服务。这一变化使得亚马逊开发了好几种支持微服务架构的解决方案,比如亚马逊 AWS。随着对微服务的快速增长和适应,亚马逊成为全球市值最高的公司,截至 2020 年 7 月 1 日,亚马逊市值为 1.433 万亿美元[^8]。 + +#### 奈飞 + +奈飞Netflix于 2007 年开始提供电影流媒体服务,到了 2008 年,它也面临着规模扩张的挑战。期间,他们经历了一次严重的数据库损坏,在三天之内,他们不能将 DVD 发送给他们的会员[^10]。这一事故使他们意识到需要将单点故障(如关系数据库)转向云中更可伸缩和更可靠的分布式系统。于是 2009 年,奈飞开始将其单体架构的应用重构为微服务。他们首先将其非面向客户的电影编码平台迁移到云端作为独立的微服务运行[^11]。在改用微服务之后,使奈飞能够解决扩展性挑战和服务中断的问题。并且它还允许他们按照每个流数据而不是数据中心的成本来降低成本[^10]。今天,奈飞每天向 190 个国家的 1.39 亿订户发送约 2.5 亿小时的内容[^11]。 + +#### Uber + +在推出 Uber 服务之后,他们在开发和发布新功能、修复 bug,以及迅速整合新的变化方面遇到了困难。因此,他们决定改用微服务,并将应用程序结构拆分为基于云的微服务。换句话说,Uber 为每个功能创建了一个微服务,比如乘客管理和出行管理。转向微服务给 Uber 带来了很多好处,比如对每项服务的所有权都有一个清晰的概念。这提高了服务访问的速度和质量,通过允许团队只关注他们需要扩展的服务,在更新虚拟服务的同时而不中断其他服务,实现了更可靠的容错,从而促进了快速扩展[^11]。 + +### 这就是可扩展性! + +关于如何提供可伸缩性的一个很好的例子是看看中国。中国人口众多,必须通过创造和试验新的解决方案来适应规模化的新挑战。统计数据显示,中国目前为大约 9 亿互联网用户提供服务[^14]。2019 年“双十一”期间(相当于国外的黑色星期五),阿里巴巴旗下各购物平台的交易峰值为每秒 544000 笔交易。阿里云处理的数据总量约为 970 PB[^15]。那么,这些数量的用户在技术上意味着什么呢? + +为了解决可伸缩性问题,许多技术应运而生。例如,[Tars][2] 由腾讯于 2008 年创建,[2018 年贡献给 Linux 基金会][3]。它也在被大规模使用,并在 10 年内得到了很大的提升[^12]。TARS 是开源的,许多组织都在大力贡献和扩展框架的特性和价值[^12]。TARS 支持多种编程语言,包括 C++、Golang、java、node.js、PHP 和 Python;它可以快速构建系统并自动生成代码,使开发人员能够专注于业务逻辑,从而有效地提高操作效率。TARS 已广泛应用于腾讯的 QQ、微信社交网络、金融服务、边缘计算、汽车、视频、网络游戏、地图、应用市场、安全等诸多核心业务。[在 2020 三月,TARS 项目转变为 TARS 基金会][4],这是一个开源微服务基金会,在建立开放式微服务平台的社区方面中,致力于提升社区贡献和成员的快速增长[^12]。 + + +**一定要看看 Linux 基金会新的免费培训课程**:《[用 TARS 构建微服务平台][5]》 + +*关于作者:* + +*Isabella Ferreira 是 Linux 基金会旗下的开源微服务基金会 TARS 基金会的布道师* + +*Mark Shan(单致豪)是腾讯开源联盟的主席,也是 TARS 基金会的董事会主席。* + +[^1]: https://tsh.io/state-of-microservices/#ebook +[^2]: https://medium.com/hashmapinc/the-what-why-and-how-of-a-microservices-architecture-4179579423a9 +[^3]: https://www.plutora.com/blog/understanding-microservices +[^4]: https://www.leanix.net/en/blog/a-brief-history-of-microservices +[^5]: https://www.charterglobal.com/five-microservices-trends-in-2020/ +[^6]: https://martinfowler.com/articles/microservices.html#footnote-etymology +[^7]: https://whatis.techtarget.com/definition/monolithic-architecture +[^8]: https://ycharts.com/companies/AMZN/market_cap +[^9]: https://thenewstack.io/led-amazon-microservices-architecture/ +[^10]: https://media.netflix.com/en/company-blog/completing-the-netflix-cloud-migration +[^11]: https://blog.dreamfactory.com/microservices-examples/ +[^12]: https://www.linuxfoundation.org/blog/2020/03/the-tars-foundation-the-formation-of-a-microservices-ecosystem/ +[^13]: https://medium.com/microservices-architecture/top-10-microservices-framework-for-2020-eefb5e66d1a2 +[^14]: https://www.statista.com/statistics/265140/number-of-internet-users-in-china/ +[^15]: https://interconnected.blog/china-scale-technology-sandbox/ + +> 本篇 Linux 基金会白金赞助商内容由腾讯贡献。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/the-state-of-the-art-of-microservices-in-2020/ + +作者:[Linux.com][a] +选题:[lujun9972][b] +译者:[zhangxiangping](https://github.com/zxp93) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/linuxdotcom/ +[b]: https://github.com/lujun9972 +[1]: https://www.linux.com/wp-content/uploads/2020/11/microservices_diagram_a.png +[2]: https://tarscloud.org/foundation/index +[3]: https://www.linuxfoundation.org/press-release/2018/06/tars-and-tseer-form-open-source-project-communities-under-the-linux-foundation-to-expand-adoption-and-pace-of-development/ +[4]: https://www.linuxfoundation.org/blog/2020/03/the-tars-foundation-the-formation-of-a-microservices-ecosystem/ +[5]: https://www.edx.org/course/building-microservice-platforms-with-tars diff --git a/published/202012/20201116 How to use Serializers in the Django Python web framework.md b/published/202012/20201116 How to use Serializers in the Django Python web framework.md new file mode 100644 index 0000000000..f3f83f18a1 --- /dev/null +++ b/published/202012/20201116 How to use Serializers in the Django Python web framework.md @@ -0,0 +1,242 @@ +[#]: collector: (lujun9972) +[#]: translator: (MjSeven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12900-1.html) +[#]: subject: (How to use Serializers in the Django Python web framework) +[#]: via: (https://opensource.com/article/20/11/django-rest-framework-serializers) +[#]: author: (Renato Oliveira https://opensource.com/users/renato-oliveira) + +如何在 Python Web 框架 Django 中使用序列化器 +====== + +> 序列化用于将数据转换为方便存储或传输的格式,然后将其重新构建以供使用。DRF 是最具有知名的序列化器。 + +![](https://img.linux.net.cn/data/attachment/album/202012/08/220845q5tz7cfftze5oem5.jpg) + +序列化是将数据转换为可以存储或传输的格式,然后对其进行重新构建的过程。在开发应用程序或将数据存储在数据库、内存或将其转换为文件时,一直会用到它。 + +我最近帮助 [Labcodes][2] 的两名初级开发人员理解序列化器,我想也可以与诸位读者分享一下我的方法。 + +假设你正在编写一个电子商务网站,你有一个订单,该订单记录了某人在某个日期以某种价格购买了一个产品: + +``` +class Order: +    def __init__(self, product, customer, price, date): +        self.product = product +        self.customer = customer +        self.price = price +        self.date = date +``` + +现在,假设你想从一个键值数据库中存储和检索订单数据。幸运的是,它的接口可以接受和返回字典,因此你需要将对象转换成字典: + +``` +def serialize_order(order): +    return { +        'product': order.product, +        'customer': order.customer, +        'price': order.price, +        'date': order.date +    } +``` + +如果你想从数据库中获取一些数据,你可以获取字典数据并将其转换为订单对象(`Order`): + +``` +def deserialize_order(order_data): +    return Order( +        product=order_data['product'], +        customer=order_data['customer'], +        price=order_data['price'], +        date=order_data['date'], +    ) +``` + +这对于简单的数据非常直接了当,但是当你需要处理一些由复杂属性构成的复杂对象时,这种方法就无法很好地扩展。你还需要处理不同类型字段的验证,这需要手工完成大量工作。 + +此时框架的序列化可以很方便的派上用场。它们使你可以创建带有少量模板的序列化器,这将适用于复杂的情况。 + +[Django][3] 提供了一个序列化模块,允许你将模型“转换”为其它格式: + +``` +from django.core import serializers + +serializers.serialize('json', Order.objects.all()) +``` + +它涵盖了 Web 应用程序最常用的种类,例如 JSON、YAML 和 XML。但是你也可以使用第三方序列化器或创建自己的序列化器。你只需要在 `settings.py` 文件中注册它: + +``` +# settings.py +SERIALIZATION_MODULES = { +    'my_format': appname.serializers.MyFormatSerializer, +} +``` + +要创建自己的 `MyFormatSerializer`,你需要实现 `.serialize()` 方法并接受一个查询集和其它选项作为参数: + +``` +class MyFormatSerializer: +    def serialize(self, queryset, **options): +        # serious serialization happening +``` + +现在,你可以将查询集序列化为新格式: + +``` +from django.core import serializers + +serializers.serialize('my_format', Order.objects.all()) +``` + +你可以使用选项参数来定义序列化程序的行为。例如,如果要定义在处理 `ForeignKeys` 时要使用嵌套序列化,或者只希望数据返回其主键,你可以传递一个 `flat=True` 参数作为选项,并在方法中处理: + +``` +class MyFormatSerializer: +    def serializer(self, queryset, **options): +        if options.get('flat', False): +            # don't recursively serialize relationships +        # recursively serialize relationships +``` + +使用 Django 序列化的一种方法是使用 `loaddata` 和 `dumpdata` 管理命令。 + +### DRF 序列化器 + +在 Django 社区中,[Django REST 框架][4](DRF)提供了最著名的序列化器。尽管你可以使用 Django 的序列化器来构建将在 API 中响应的 JSON,但 REST 框架中的序列化器提供了更出色的功能,可以帮助你处理并轻松验证复杂的数据。 + +在订单的例子中,你可以像这样创建一个序列化器: + +``` +from restframework import serializers + +class OrderSerializer(serializers.Serializer): +    product = serializers.CharField(max_length=255) +    customer = serializers.CharField(max_lenght=255) +    price = serializers.DecimalField(max_digits=5, decimal_places=2) +    date = serializers.DateField() +``` + +轻松序列化其数据: + +``` +order = Order('pen', 'renato', 10.50, date.today()) +serializer = OrderSerializer(order) + +serializer.data +# {'product': 'pen', 'customer': 'renato', 'price': '10.50', 'date': '2020-08-16'} +``` + +为了能够从数据返回实例,你需要实现两个方法:`create` 和 `update`: + +``` +from rest_framework import serializers + +class OrderSerializer(serializers.Serializer): +    product = serializers.CharField(max_length=255) +    customer = serializers.CharField(max_length=255) +    price = serializers.DecimalField(max_digits=5, decimal_places=2) +    date = serializers.DateField() + +    def create(self, validated_data): +        # 执行订单创建 +        return order + +    def update(self, instance, validated_data): +       # 执行实例更新 +       return instance +``` + +之后,你可以通过调用 `is_valid()` 来验证数据,并通过调用 `save()` 来创建或更新实例: + +``` +serializer = OrderSerializer(**data) +## 若要验证数据,在调用 save 之前必须执行 +serializer.is_valid() +serializer.save() +``` + +### 模型序列化器 + +序列化数据时,通常需要从数据库(即你创建的模型)进行数据处理。`ModelSerializer` 与 `ModelForm` 一样,提供了一个 API,用于从模型创建序列化器。假设你有一个订单模型: + +``` +from django.db import models + +class Order(models.Model): +    product = models.CharField(max_length=255) +    customer = models.CharField(max_length=255) +    price = models.DecimalField(max_digits=5, decimal_places=2) +    date = models.DateField()     +``` + +你可以像这样为它创建一个序列化器: + +``` +from rest_framework import serializers + +class OrderSerializer(serializers.ModelSerializer): +    class Meta: +        model = Order +        fields = '__all__' +``` + +Django 会自动在序列化器中包含所有模型字段,并创建 `create` 和 `udpate` 方法。 + +### 在基于类的视图(CBV)中使用序列化器 + +像 Django CBV 中的 `Forms` 一样,序列化器可以很好地与 DRF 集成。你可以设置 `serializer_class` 属性,方便序列化器用于视图: + +``` +from rest_framework import generics + +class OrderListCreateAPIView(generics.ListCreateAPIView): +    queryset = Order.objects.all() +    serializer_class = OrderSerializer +``` + +你也可以定义 `get_serializer_class()` 方法: + +``` +from rest_framework import generics + +class OrderListCreateAPIView(generics.ListCreateAPIView): +    queryset = Order.objects.all() +    +    def get_serializer_class(self): +        if is_free_order(): +            return FreeOrderSerializer +        return OrderSerializer +``` + +在 CBV 中还有其它与序列化器交互的方法。例如,[get_serializer()][5] 返回一个已经实例化的序列化器,[get_serializer_context()][6] 返回创建实例时传递给序列化器的参数。对于创建或更新数据的视图,有 `create` 和 `update`,它们使用 `is_valid` 方法验证数据,还有 [perform_create][7] 和 [perform_update][8] 调用序列化器的 `save` 方法。 + +### 了解更多 + +要了解更多资源,参考我朋友 André Ericson 的[经典 Django REST 框架][9]网站。它是一个[基于类的经典视图][10]的 REST 框架版本,可让你深入查看组成 DRF 的类。当然,官方[文档][11]也是一个很棒的资源。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/django-rest-framework-serializers + +作者:[Renato Oliveira][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/renato-oliveira +[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]: http://www.labcodes.com.br +[3]: https://www.djangoproject.com/ +[4]: https://www.django-rest-framework.org/ +[5]: http://www.cdrf.co/3.9/rest_framework.generics/CreateAPIView.html#get_serializer +[6]: http://www.cdrf.co/3.9/rest_framework.generics/CreateAPIView.html#get_serializer_context +[7]: http://www.cdrf.co/3.9/rest_framework.generics/CreateAPIView.html#perform_create +[8]: http://www.cdrf.co/3.9/rest_framework.generics/RetrieveUpdateAPIView.html#perform_update +[9]: http://www.cdrf.co/ +[10]: https://ccbv.co.uk/ +[11]: https://www.django-rest-framework.org/api-guide/serializers/#serializers diff --git a/published/202012/20201118 How to Write, Compile and Run a C Program in Ubuntu and Other Linux Distributions -Beginner-s Tip.md b/published/202012/20201118 How to Write, Compile and Run a C Program in Ubuntu and Other Linux Distributions -Beginner-s Tip.md new file mode 100644 index 0000000000..c09bbbce67 --- /dev/null +++ b/published/202012/20201118 How to Write, Compile and Run a C Program in Ubuntu and Other Linux Distributions -Beginner-s Tip.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12939-1.html) +[#]: subject: (How to Write, Compile and Run a C Program in Ubuntu and Other Linux Distributions [Beginner’s Tip]) +[#]: via: (https://itsfoss.com/run-c-program-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Ubuntu/Debian Linux 上编写、编译和运行一个 C 程序 +====== + +![][2] + +你是如何在 Linux 上使用 C 编写你的程序的?它确实是非常简单的,由三个简单的步骤组成。 + +**步骤 1**: 编写你的 C 程序,并使用一个 `.c` 的扩展名进行保存。例如,`my_program.c` 。 + +**步骤 2**: 在一个终端中使用 `gcc` 编译器来编译程序并生成目标文件,像这样: + +``` +gcc -o my_program my_program.c +``` + +**步骤 3**: 在 Linux 中,你可以以运行生成的对象文件的方式来运行你的 C 程序: + +``` +./my_program +``` + +![][1] + +这只是如何在 Linux 中编译和运行 C 程序的简要总结。假设你是 C 语言或 Linux 系统的新手,我将仔细演示这些步骤,以便你能在 Linux 环境中舒服地编写 C 程序。 + +事实上,我将讨论如何在 Linux 终端中以及在代码编辑器中运行 C 程序的两种方式。 + +### 方法 1: 在 Linux 终端中运行 C 程序 + +为了在 Linux 中运行一个 C 程序,你需要在你的系统上有一个 C 编译器。最流行的编译器是 `gcc`([GNU 编译器套件][3]GNU Compiler Collection)。 + +你可以使用你发行版的软件包管理器来安装 `gcc` 。在基于 Debian 和 Ubuntu 的 Linux 发行版中,使用 `apt` 命令: + +``` +sudo apt install gcc +``` + +切换到保存你的 C 程序的目录(或者提供路径),然后通过编译程序生成对象文件: + +``` +gcc -o my_program my_program.c +``` + +记住,提供输出对象文件(`-o my_program`)是可选的。如果你不提供,那么将自动生成一个名称为 `a.out` 的对象文件。但是这样并不好,因为编译每个 C 程序都会覆盖它,而且你也不知道这个 `a.out` 对象文件究竟属于哪个程序。 + +在你的对象文件生成后,运行它来运行 C 程序。它已经能够执行了。像这样简单地使用它: + +``` +./my_program +``` + +接下来,如果你的程序是正确的,它将显示出你所期望的输出。正如你所看到的,这和 [在 Linux 中运行 C++ 程序][4] 没什么不同。 + +*每更改一次你的程序,你都必须先重新编译它,然后再次运行生成的对象文件来运行这个新的 C 程序。* + +### 方法 2: 如何在 Linux 中使用一个诸如 VSCode 之类的代码编辑器来运行 C 程序 + +并不是每一个人都能适应命令行和终端,我完全理解这一点。 + +你可以使用一个诸如 Eclipse 或 Code Blocks 之类的真正的 C/C++ IDE ,但是它们是很重量级的程序,通常更适合于大型的项目。 + +我建议使用一个开源的代码编辑器,像 VSCode 或 Atom 。它们基本上是文本编辑器,但是你可以通过安装附加组件来直接在图形化的代码编辑器中编译和运行程序。 + +在这个示例中,我使用 [VSCode][5] 编辑器。它是一个来自微软的 [非常流行的开源的代码编辑器][6] 。 + +首先,在 Ubuntu 的 [软件中心中安装 VSCode][7] 。对于其它发行版来说,请检查你的 Linux 发行版的软件包管理器或软件中心。你可以参看它的官方网站来查看更多的信息。 + +启动 VSCode ,打开或创建一个工程,在这里创建你的 C 程序。我使用一个简单的 Hello World 程序作为示例。 + +![][8] + +你必须确保你已经在你的 Linux 系统上安装了 `gcc` 编译器。 + +``` +sudo apt install gcc +``` + +接下来你要做的事是使用一个允许你运行 C 代码的扩展。微软可能会提示你安装它的 C/C++ 程序扩展,但它的设置很复杂,因此我不推荐。 + +相反,我建议你使用 Code Runner 扩展。它是一个简单直接的扩展,你可以在不使用额外配置的情况下轻松地运行 C 和 C++ 代码。 + +转到扩展标签页,在其中搜索和安装 “Code Runner” 。 + +![安装 Code Runner 扩展来运行 C/C++ 程序][9] + +重新启动 VSCode 。现在,你能够使用下面方法中的其中一个来运行 C 代码: + + * 使用快捷键 `Ctrl+Alt+N` 。 + * 按下 `F1` ,接下来选择或输入 “Run Code” 。 + * 在文本编辑器中右键单击,从上下文菜单中单击 “Run code” 。 + +![右键单击程序文件,然后选择 Run Code][10] + +当你运行这个 C 程序时,它将会被自动编译和运行。你可以在编辑器底部打开的终端中看到输出。还有比这更好的事情吗? + +![程序输出显示在编辑器的底部][11] + +你更喜欢哪一种方法? + +在 Linux 命令行中运行一些 C 程序是没有问题的,但是使用一个代码编辑器会更容易一些,而且会节省时间。你不觉得吗? + +你可以自己决定想使用哪一种方法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/run-c-program-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/running-c-program-linux.png?resize=795%2C399&ssl=1 +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/Run-C-Program-Linux.png?resize=800%2C450&ssl=1 +[3]: https://gcc.gnu.org/ +[4]: https://itsfoss.com/c-plus-plus-ubuntu/ +[5]: https://code.visualstudio.com +[6]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[7]: https://itsfoss.com/install-visual-studio-code-ubuntu/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/c-program-visual-studio-code-linux.png?resize=800%2C441&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/running-c-program-in-linux-with-visual-studio-code.png?resize=800%2C500&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/running-c-program-in-linux-with-visual-studio-code.jpg?resize=800%2C500&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/run-c-program-in-linux-with-visual-studio-code.jpg?resize=800%2C500&ssl=1 diff --git a/published/202012/20201122 How to Save the Output of a Command to a File in Linux Terminal -Beginner-s Tip.md b/published/202012/20201122 How to Save the Output of a Command to a File in Linux Terminal -Beginner-s Tip.md new file mode 100644 index 0000000000..1f62e1d9eb --- /dev/null +++ b/published/202012/20201122 How to Save the Output of a Command to a File in Linux Terminal -Beginner-s Tip.md @@ -0,0 +1,116 @@ +[#]: collector: (lujun9972) +[#]: translator: (Mjseven) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12920-1.html) +[#]: subject: (How to Save the Output of a Command to a File in Linux Terminal [Beginner’s Tip]) +[#]: via: (https://itsfoss.com/save-command-output-to-file-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何将 Linux 终端中命令的输出保存到文件中 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/14/223956pidmznldldnnk87f.jpg) + +当你在 Linux 终端中运行命令或脚本时,它会在终端中打印输出方便你立即查看。 + +有时你需要将输出保存到文件中以备将来参考。[当然你可以在 Linux 终端中复制和粘贴][1],但是有更好的方法可以在 Linux 命令行中保存 shell 脚本或命令的输出,让我演示给你看。 + +### 方法 1:使用重定向将命令输出保存到文件中 + +你可以[在 Linux 中使用重定向来达成目的][2]。使用重定向操作符,它会将输出保存到文件中而不是在屏幕上显示。 + + * `>` 会将命令输出重定向到文件,它会替换文件中的所有内容。 + * `>>` 会将命令输出添加到文件现有内容的末尾。 + +使用标准输出重定向运算符 `>` 将输出重定向到文件: + +``` +command > file.txt +``` + +如果 `file.txt` 不存在,它会自动创建。如果你使用 `>` 再次重定向到相同的文件,文件内容将被替换为新的输出。 + +下面的示例将更好地演示它。它首先会保存 `ls -l` 命令的输出,然后,它将用 `ls *.c` 命令的输出替换文件的内容。 + +![将命令输出重定向到文件][3] + +如果你不想在保存脚本或命令的输出时丢失现有文件的内容,可以使用 `>>` : + +``` +command >> file.txt +``` + +下面这个例子更好地展示了它: + +![将命令输出重定向到文件][4] + +即使文件不存在,它也会自动创建。 + +温馨提示:将 Linux 命令输出和错误保存到一个文件中。 + +如果 Linux 命令返回错误,那么错误不会保存在文件中。你可以使用 `2>&1` 将命令的输出和错误保存到同一个文件中,如下所示: + +``` +command > file.txt 2>&1 +``` + +通常,`0` 代表标准输入,`1` 代表标准输出,`2` 代表标准错误。在这里,你要将标准错误(`2`) 重定向(`&`)到与标准输出(`1`)相同的地址。 + +### 方法 2:使用 tee 命令显示输出并将其保存到文件中 + +顺便说一句,你是否注意到,当你将命令输出发送到一个文件时,你再也无法在终端上看到它了?[Linux 的 tee 命令][5]解决了这个问题。 + +类似于将水流发送到两个方向的三通管,`tee` 命令将输出发送到终端以及文件(或作为另一个命令的输入)。你可以像这样使用它: + +``` +command | tee file.txt +``` + +同样,如果该文件不存在,它将自动创建。 + +你还可以使用 `tee` 命令 `-a` 选项进入附加模式: + +``` +command | tee -a file.txt +``` + +让我用一些简单的例子来演示: + +![][6] + +我在例子中使用了简单的 Linux 命令。但是请放心,你也可以使用这些方法来保存 bash 脚本的输出。 + +### 注意:将命令输出保存到文件时,避免管道陷阱 + +你可能对管道重定向很熟悉,可以使用它来组合 Linux 命令,但不能将输出通过管道传输到文件,它显示找不到 `output.txt` 命令: + +![][7] + +这是因为管道将一个命令的输出重定向到另一个命令的输入。在本例中,你向它传递一个了一个文件名而它期望一个命令。 + +如果你是一个 Linux 命令行新手,我希望这个快速教程对你的 Linux 知识有所帮助。[I/O 重定向][8]是一个需要注意的基本概念。 + +一如既往,欢迎提出问题和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/save-command-output-to-file-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/copy-paste-linux-terminal/ +[2]: https://linuxhandbook.com/redirection-linux/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/redirecting_command_output_to_file_in_linux.png?resize=741%2C456&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/redirecting_command_output_to_file.png?resize=741%2C494&ssl=1 +[5]: https://linuxhandbook.com/tee-command/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/display-and-save-linux-command-output.png?resize=741%2C494&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/pipe-output-to-file-linux.png?resize=687%2C266&ssl=1 +[8]: https://tldp.org/LDP/abs/html/io-redirection.html#FTN.AEN17894 diff --git a/published/202012/20201125 Get started with Fossil, an alternative to Git.md b/published/202012/20201125 Get started with Fossil, an alternative to Git.md new file mode 100644 index 0000000000..f5f40fb054 --- /dev/null +++ b/published/202012/20201125 Get started with Fossil, an alternative to Git.md @@ -0,0 +1,227 @@ +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-12875-1.html" +[#]: subject: "Get started with Fossil, an alternative to Git" +[#]: via: "https://opensource.com/article/20/11/fossil" +[#]: author: "Klaatu https://opensource.com/users/klaatu" + +了解一下 Fossil,一个 Git 的替代品 +====== + +> Fossil 是一个集版本控制系统、bug 追踪、维基、论坛以及文档解决方案于一体的系统。 + +![](https://img.linux.net.cn/data/attachment/album/202012/01/173057hfhyzyw921zll219.jpg) + +每个开发者都知道,追踪代码的修改是至关重要的。有时候你会处于好奇或者教育的目的需要展示你的项目开始和进化的历史。有时候你想让其他的开发者参与到你的项目中,因此你需要一种值得信赖的能合并不同代码分支的方法。更极端一点,有时候你为了解决一个问题而修改的代码导致已有的功能不能正常使用。 + +[Fossil][2] 源码管理系统是由著名的 [SQLite][3] 数据库的作者开发的一个集版本控制系统、bug 追踪、维基、论坛以及文档解决方案于一体的系统。 + +### 安装 Fossil + +Fossil 是一个独立的 C 程序,因此你可以从它的网站上[下载][4]后放在环境变量 [PATH][5] 中的任意位置。例如,假定 `/usr/local/bin` 已经在你的环境变量中(默认情况下是在的): + +``` +$ wget https://fossil-scm.org/home/uv/fossil-linux-x64-X.Y.tar.gz +$ sudo tar xvf fossil-linux-x64-X.Y.tar.gz --directory /usr/local/bin +``` + +你也可以通过包管理器从软件仓库中找到 Fossil,或者直接从源码编译。 + +### 创建一个 Fossil 仓库 + +如果你已经有一个代码项目,想用 Fossil 来追踪,那么第一步就是创建一个 Fossil 仓库: + +``` +$ fossil init myproject.fossil +project-id: 010836ac6112fefb0b015702152d447c8c1d8604 +server-id:  54d837e9dc938ba1caa56d31b99c35a4c9627f44 +admin-user: klaatu (initial password is "14b605") +``` + +创建 Fossil 仓库的过程中会返回三行信息:一个唯一的项目 ID、一个唯一的服务器 ID 以及管理员 ID 和密码。项目 ID 和服务器 ID 是版本数字。管理员凭证表明你对这个仓库的所有权,当你把 Fossil 作为服务器让其他用户来访问时可以使用管理员权限。 + +### Fossil 仓库工作流 + +在你使用 Fossil 仓库之前,你需要先为它的数据创建一个工作路径。你可以把这个过程类比为使用 Python 时创建一个虚拟环境或者解压一个只用来备份的 ZIP 文件。 + +创建一个工作目录并进入: + +``` +$ mkdir myprojectdir +$ cd myprojectdir +``` + +把你的 Fossil 打开到刚刚创建的目录: + +``` +$ fossil open ../myproject +project-name: +repository: /home/klaatu/myprojectdir/../myproject +local-root: /home/klaatu/myprojectdir/ +config-db: /home/klaatu/.fossil +project-code: 010836ac6112fefb0b015702152d447c8c1d8604 +checkout: 9e6cd96dd675544c58a246520ad58cdd460d1559 2020-11-09 04:09:35 UTC +tags: trunk +comment: initial empty check-in (user: klaatu) +check-ins: 1 +``` + +你可能注意到了,Fossil 在你的家目录下创建了一个名为 `.fossil` 的隐藏文件,用来追踪你的全局 Fossil 配置。这个配置不是只适用于你的一个项目的;这个文件只会在你第一次使用 Fossil 时生成。 + +#### 添加文件 + +使用 `add` 和 `commit` 子命令来向你的仓库添加文件。例如,创建一个简单的 `README` 文件,把它添加到仓库: + +``` +$ echo "My first Fossil project" > README +$ fossil add README +ADDED  README +$ fossil commit -m 'My first commit' +New_Version: 2472a43acd11c93d08314e852dedfc6a476403695e44f47061607e4e90ad01aa +``` + +#### 使用分支 + +Fossil 仓库开始时默认使用的主分支名为 `trunk`。当你想修改代码而又不影响主干代码时,你可以从 trunk 分支切走。创建新分支需要使用 `branch` 子命令,这个命令需要两个参数:一个新分支的名字,一个新分支的基分支名字。在本例中,只有一个分支 `trunk`,因此尝试创建一个名为 `dev` 的新分支: + +``` +$ fossil branch --help +Usage: fossil branch new BRANCH-NAME BASIS ?OPTIONS? +$ fossil branch new dev trunk +New branch: cb90e9c6f23a9c98e0c3656d7e18d320fa52e666700b12b5ebbc4674a0703695 +``` + +你已经创建了一个新分支,但是你当前所在的分支仍然是 `trunk`: + +``` +$ fossil branch current +trunk +``` + +使用 `checkout` 命令切换到你的新分支 `dev`: + +``` +$ fossil checkout dev +dev +``` + +#### 合并修改 + +假设你在 `dev` 分支中添加了一个新文件,完成了测试,现在想把它合并到 `trunk`。这个过程叫做*合并*。 + +首先,切回目标分支(本例中目标分支为 `trunk`): + + +``` +$ fossil checkout trunk +trunk +$ ls +README +``` + +这个分支中没有你的新文件(或者你对其他文件的修改),而那些内容是合并的过程需要的信息: + +``` +$ fossil merge dev + "fossil undo" is available to undo changes to the working checkout. +$ ls +myfile.lua  README +``` + +### 查看 Fossil 时间线 + +使用 `timeline` 选项来查看仓库的历史。这个命令列出了你的仓库的所有活动的详细信息,包括用来表示每次修改的哈希值、每次提交时填写的信息以及提交者: + +``` +$ fossil timeline +=== 2020-11-09 === +06:24:16 [5ef06e668b] added exciting new file (user: klaatu tags: dev) +06:11:19 [cb90e9c6f2] Create new branch named "dev" (user: klaatu tags: dev) +06:08:09 [a2bb73e4a3] *CURRENT* some additions were made (user: klaatu tags: trunk) +06:00:47 [2472a43acd] This is my first commit. (user: klaatu tags: trunk) +04:09:35 [9e6cd96dd6] initial empty check-in (user: klaatu tags: trunk) ++++ no more data (5) +++ +``` + +![Fossil UI][6] + +### 公开你的 Fossil 仓库 + +因为 Fossil 有个内置的 web 界面,所以 Fossil 不像 GitLab 和 Gitea 那样需要主机服务。Fossil 就是它自己的主机服务,只要你把它放在一台机器上就行了。在你公开你的 Fossil 仓库之前,你还需要通过 web 用户界面(UI)来配置一些信息: + +使用 `ui` 子命令启动一个本地的实例: + +``` +$ pwd +/home/klaatu/myprojectdir/ +$ fossil ui +``` + +“Users” 和 “Settings” 是安全相关的,“Configuration” 是项目属性相关的(包括一个合适的标题)。web 界面不仅仅是一个方便的功能。 它是能在生产环境中使用并作为 Fossil 项目的宿主机来使用的。它还有一些其他的高级选项,比如用户管理(或者叫自我管理)、在同一个服务器上与其他的 Fossil 仓库进行单点登录(SSO)。 + +当配置完成后,关掉 web 界面并按下 `Ctrl+C` 来停止 UI 引擎。像提交代码一样提交你的 web 修改。 + +``` +$ fossil commit -m 'web ui updates' +New_Version: 11fe7f2855a3246c303df00ec725d0fca526fa0b83fa67c95db92283e8273c60 +``` + +现在你可以配置你的 Fossil 服务器了。 + + 1. 把你的 Fossil 仓库(本例中是 `myproject.fossil`)复制到服务器,你只需要这一个文件。 + 2. 如果你的服务器没有安装 Fossil,就在你的服务器上安装 Fossil。在服务器上安装的过程跟在本地一样。 + 3. 在你的 `cgi-bin` 目录下(或它对应的目录,这取决于你的 HTTP 守护进程)创建一个名为 `repo_myproject.cgi` 的文件: + +``` +#!/usr/local/bin/fossil +repository: /home/klaatu/public_html/myproject.fossil +``` + +添加可执行权限: + +``` +$ chmod +x repo_myproject.cgi +``` + +你需要做的都已经做完了。现在可以通过互联网访问你的项目了。 + +你可以通过 CGI 脚本来访问 web UI,例如 `https://example.com/cgi-bin/repo_myproject.cgi`。 + +你也可以通过命令行来进行交互: + +``` +$ fossil clone https://klaatu@example.com/cgi-bin/repo_myproject.cgi +``` + +在本地的克隆仓库中工作时,你需要使用 `push` 子命令把本地的修改推送到远程的仓库,使用 `pull` 子命令把远程的修改拉取到本地仓库: + +``` +$ fossil push https://klaatu@example.com/cgi-bin/repo_myproject.cgi +``` + +### 使用 Fossil 作为独立的托管 + +Fossil 将大量的权力交到了你的手中(以及你的合作者的手中),让你不再依赖托管服务。本文只是简单的介绍了基本概念。你的代码项目还会用到很多有用的 Fossil 功能。尝试一下 Fossil。它不仅会改变你对版本控制的理解;它会让你不再考虑其他的版本控制系统。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/fossil + +作者:[Klaatu][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/klaatu +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc_dinosaur_sunset.png?itok=lbzpbW5p "Dinosaurs on land at sunset" +[2]: https://fossil-scm.org/home/doc/trunk/www/index.wiki +[3]: https://www.sqlite.org/index.html +[4]: https://fossil-scm.org/home/uv/download.html +[5]: https://opensource.com/article/17/6/set-path-linux +[6]: https://opensource.com/sites/default/files/uploads/fossil-ui.jpg "Fossil UI" +[7]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202012/20201125 Keep track of multiple Git remote repositories.md b/published/202012/20201125 Keep track of multiple Git remote repositories.md new file mode 100644 index 0000000000..4c1ce8711e --- /dev/null +++ b/published/202012/20201125 Keep track of multiple Git remote repositories.md @@ -0,0 +1,94 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12911-1.html) +[#]: subject: (Keep track of multiple Git remote repositories) +[#]: via: (https://opensource.com/article/20/11/multiple-git-repositories) +[#]: author: (Peter Portante https://opensource.com/users/portante) + +跟踪多个 Git 远程仓库 +====== + +> 拥有一致的命名标准是保持本地和上游 Git 仓库保持一致的关键。 + +![](https://img.linux.net.cn/data/attachment/album/202012/11/220828tjt9qlpmg1opvibq.jpg) + +当本地 Git 仓库的命名与远程仓库不一致时,与远程仓库协作就会变得很混乱。 + +解决此问题的一个方法是标准化两个词的使用和含义:`origin` 指的是你个人的 `example.com//*` 仓库,而 `upstream` 指的是你从 `origin` 仓库复刻fork出来的 `example.com` 仓库。换句话说,`upstream` 指的是公开提交工作的上游仓库,而 `origin` 指的是你对上游仓库的本地复刻,例如,你从这里生成拉取请求pull request(PR)。 + +以 [pbench][2] 仓库为例,下面是一个逐步建立新的本地克隆的方法,其中 `origin` 和 `upstream` 的定义是一致的。 + +1、在大多数 Git 托管服务上,当你想在上面工作时,必须对它进行复刻。当你运行自己的 Git 服务器时,这并不是必要的,但对于一个公开的代码库来说,这是一个在贡献者之间传输差异的简单方法。 + +创建一个 Git 仓库的复刻。在这个例子中,假设你的复刻位于 `example.com//pbench`。 + +2、接下来,你必须获得一个统一资源标识符 ([URI][3]),以便通过 SSH 进行克隆cloning。在大多数 Git 托管服务上,比如 GitLab 或 GitHub,它在一个标有 “Clone” 或 “Clone over SSH” 的按钮或面板上,可以将克隆 URI 复制到剪贴板中。 + +3、在你的开发系统中,使用你复制的 URI 克隆仓库: + +``` +$ git clone git@example.com:/pbench.git +``` + +这将以默认名称 `origin` 来克隆 Git 仓库,作为你的 `pbench` 仓库复刻副本。 + +4、切换到刚才克隆的目录: + +``` +$ cd ~/pbench +``` + +5、下一步,获取源仓库的 SSH URI(你最初复刻的那个)。这可能和上面的方法一样。找到 “Clone” 按钮或面板,复制克隆地址。在软件开发中,这通常被称为“上游”,因为(理论上)这是大多数提交发生的地方,而你打算让这些提交流向下游的仓库。 + +6、将 URI 添加到你的本地仓库中。是的,将有*两个不同*的远程仓库分配给你的本地仓库副本: + +``` +$ git remote add upstream git@example.com:bigproject/pbench.git +``` + +7、现在你有两个命名远程仓库:`origin` 和 `upstream`。 你可以用 `remote` 子命令查看你的远程仓库: + +``` +$ git remote -v +``` + +现在,你的本地 `master` 分支正在跟踪 `origin` 的 `master`,这不一定是你想要的。你可能想跟踪这个分支的 `upstream` 版本,因为大多数开发都在上游进行。这个想法是,你要在从上游获得的内容的基础上添加更改。 + +8、将你的本地的 `master` 分支改成跟踪 `upstream/master`: + +``` +$ git fetch upstream +$ git branch --set-upstream-to=upstream/master master +``` + +你可以对任何你想要的分支这样做,而不仅仅是 `master`。例如,有些项目使用 `dev` 分支来处理所有不稳定的变化,而将 `master` 保留给已批准发布的代码。 + +9、一旦你设置了你的跟踪分支,一定要变基(`rebase`)你的 `master` 分支,使它与上游仓库的任何新变化保持一致: + +``` +$ git remote update +$ git checkout master +$ git rebase +``` + +这是一个保持 Git 仓库在不同复刻之间同步的好方法。如果你想自动完成这项工作,请阅读 Seth Kenlon 关于[使用 Ansible 托管 Git 仓库][4]的文章。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/multiple-git-repositories + +作者:[Peter Portante][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/portante +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=fvorN0e- (Digital hand surrounding by objects, bike, light bulb, graphs) +[2]: https://github.com/distributed-system-analysis/pbench +[3]: https://en.wikipedia.org/wiki/Uniform_Resource_Identifier +[4]: https://opensource.com/article/19/11/how-host-github-gitlab-ansible diff --git a/published/202012/20201127 Getting started with Fedora CoreOS.md b/published/202012/20201127 Getting started with Fedora CoreOS.md new file mode 100644 index 0000000000..7f9a72b2da --- /dev/null +++ b/published/202012/20201127 Getting started with Fedora CoreOS.md @@ -0,0 +1,222 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12912-1.html) +[#]: subject: (Getting started with Fedora CoreOS) +[#]: via: (https://fedoramagazine.org/getting-started-with-fedora-coreos/) +[#]: author: (Clément Verna https://fedoramagazine.org/author/cverna/) + +Fedora CoreOS 入门 +====== + +![Fedora CoreOS入门][1] + +现在被称为 DevOps 时代,操作系统的关注度似乎比工具要低一些。然而,这并不意味着操作系统没有创新。(编辑注:基于 Linux 内核的众多发行版所提供的多样化产品就是一个很好的例子)。[Fedora CoreOS][4] 就对这个 DevOps 时代的操作系统应该是什么样有着独特的理念。 + +### Fedora CoreOS 的理念 + +Fedora CoreOS(FCOS)是由 CoreOS Container Linux 和 Fedora Atomic Host 合并而来。它是一个专注于运行容器化应用程序的精简的独体操作系统。安全性是首要重点,FCOS 提供了自动更新,并带有 SELinux 强化。 + +为了使自动更新能够很好地工作,它们需要非常健壮,目标是运行 FCOS 的服务器在更新后不会崩溃。这是通过使用不同的发布流(stable、testing 和 next)来实现的。每个流每 2 周发布一次,更新内容会从一个流推广到另一个流(next -> testing -> stable)。这样落地在 stable 流中的更新就有机会经过长时间的测试。 + +### 入门 + +对于这个例子,让我们使用 stable 流和一个 QEMU 基础镜像,我们可以作为一个虚拟机运行。你可以使用 [coreos-installer][5] 来下载该镜像。 + +在你的(Workstation)终端上,更新镜像的链接后,运行以下命令(编辑注:在 Silverblue 上,基于容器的 coreos 工具是最简单的方法,可以尝试一下。说明可以在 中找到,特别是 “Setup with Podman or Docker” 一节。): + +``` +$ sudo dnf install coreos-installer +$ coreos-installer download --image-url https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/32.20200907.3.0/x86_64/fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2.xz +$ xz -d fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2.xz +$ ls +fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2 +``` + +#### 创建一个配置 + +要定制一个 FCOS 系统,你需要提供一个配置文件,[Ignition][6] 将使用这个文件来配置系统。你可以用这个文件来配置诸如创建用户、添加受信任的 SSH 密钥、启用 systemd 服务等等。 + +以下配置创建了一个 `core` 用户,并在 `authorized_keys` 文件中添加了一个 SSH 密钥。它还创建了一个 systemd 服务,使用 [podman][7] 来运行一个简单的 “hello world” 容器: + +``` +version: "1.0.0" +variant: fcos +passwd: + users: + - name: core + ssh_authorized_keys: + - ssh-ed25519 my_public_ssh_key_hash fcos_key +systemd: + units: + - + contents: | + [Unit] + Description=Run a hello world web service + After=network-online.target + Wants=network-online.target + [Service] + ExecStart=/bin/podman run --pull=always --name=hello --net=host -p 8080:8080 quay.io/cverna/hello + ExecStop=/bin/podman rm -f hello + [Install] + WantedBy=multi-user.target + enabled: true + name: hello.service +``` + +在配置中加入你的 SSH 密钥后,将其保存为 `config.yaml`。接下来使用 Fedora CoreOS Config Transpiler(`fcct`)工具将这个 YAML 配置转换成有效的 Ignition 配置(JSON 格式)。 + +直接从 Fedora 的资源库中安装 `fcct`,或者从 [GitHub][8] 中获取二进制文件: + +``` +$ sudo dnf install fcct +$ fcct -output config.ign config.yaml +``` + +#### 安装并运行 Fedora CoreOS + +要运行镜像,你可以使用 libvirt 堆栈。要在 Fedora 系统上使用 `dnf` 软件包管理器安装它: + +``` +$ sudo dnf install @virtualization +``` + +现在让我们创建并运行一个 Fedora CoreOS 虚拟机: + +``` +$ chcon --verbose unconfined_u:object_r:svirt_home_t:s0 config.ign +$ virt-install --name=fcos \ +--vcpus=2 \ +--ram=2048 \ +--import \ +--network=bridge=virbr0 \ +--graphics=none \ +--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${PWD}/config.ign" \ +--disk=size=20,backing_store=${PWD}/fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2 +``` + +安装成功后,会显示一些信息并提供登录提示符: + +``` +Fedora CoreOS 32.20200907.3.0 +Kernel 5.8.10-200.fc32.x86_64 on an x86_64 (ttyS0) +SSH host key: SHA256:BJYN7AQZrwKZ7ZF8fWSI9YRhI++KMyeJeDVOE6rQ27U (ED25519) +SSH host key: SHA256:W3wfZp7EGkLuM3z4cy1ZJSMFLntYyW1kqAqKkxyuZrE (ECDSA) +SSH host key: SHA256:gb7/4Qo5aYhEjgoDZbrm8t1D0msgGYsQ0xhW5BAuZz0 (RSA) +ens2: 192.168.122.237 fe80::5054:ff:fef7:1a73 +Ignition: user provided config was applied +Ignition: wrote ssh authorized keys file for user: core +``` + +Ignition 配置文件没有为 `core` 用户提供任何密码,因此无法通过控制台直接登录。(不过,也可以通过 Ignition 配置为用户配置密码。) + +使用 `Ctrl + ]` 组合键退出虚拟机的控制台。然后检查 `hello.service` 是否在运行: + +``` +$ curl http://192.168.122.237:8080 +Hello from Fedora CoreOS! +``` + +使用预先配置的 SSH 密钥,你还可以访问虚拟机并检查其上运行的服务: + +``` +$ ssh core@192.168.122.237 +$ systemctl status hello +● hello.service - Run a hello world web service +Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled) +Active: active (running) since Wed 2020-10-28 10:10:26 UTC; 42s ago +``` + +#### zincati、rpm-ostree 和自动更新 + +zincati 服务使用自动更新驱动 rpm-ostreed。 + +检查虚拟机上当前运行的 Fedora CoreOS 版本,并检查 zincati 是否找到了更新: + +``` +$ ssh core@192.168.122.237 +$ rpm-ostree status +State: idle +Deployments: +● ostree://fedora:fedora/x86_64/coreos/stable +Version: 32.20200907.3.0 (2020-09-23T08:16:31Z) +Commit: b53de8b03134c5e6b683b5ea471888e9e1b193781794f01b9ed5865b57f35d57 +GPGSignature: Valid signature by 97A1AE57C3A2372CCA3A4ABA6C13026D12C944D0 +$ systemctl status zincati +● zincati.service - Zincati Update Agent +Loaded: loaded (/usr/lib/systemd/system/zincati.service; enabled; vendor preset: enabled) +Active: active (running) since Wed 2020-10-28 13:36:23 UTC; 7s ago +… +Oct 28 13:36:24 cosa-devsh zincati[1013]: [INFO ] initialization complete, auto-updates logic enabled +Oct 28 13:36:25 cosa-devsh zincati[1013]: [INFO ] target release '32.20201004.3.0' selected, proceeding to stage it + +... zincati reboot ... +``` + +重启后,我们再远程登录一次,检查新版的 Fedora CoreOS: + +``` +$ ssh core@192.168.122.237 +$ rpm-ostree status +State: idle +Deployments: +● ostree://fedora:fedora/x86_64/coreos/stable +Version: 32.20201004.3.0 (2020-10-19T17:12:33Z) +Commit: 64bb377ae7e6949c26cfe819f3f0bd517596d461e437f2f6e9f1f3c24376fd30 +GPGSignature: Valid signature by 97A1AE57C3A2372CCA3A4ABA6C13026D12C944D0 +ostree://fedora:fedora/x86_64/coreos/stable +Version: 32.20200907.3.0 (2020-09-23T08:16:31Z) +Commit: b53de8b03134c5e6b683b5ea471888e9e1b193781794f01b9ed5865b57f35d57 +GPGSignature: Valid signature by 97A1AE57C3A2372CCA3A4ABA6C13026D12C944D0 +``` + +`rpm-ostree status` 现在显示了两个版本的 Fedora CoreOS,一个是 QEMU 镜像中的版本,一个是更新后的最新版本。有了这两个版本,就可以使用 `rpm-ostree rollback` 命令回滚到之前的版本。 + +最后,你可以确保 hello 服务仍在运行并提供内容: + +``` +$ curl http://192.168.122.237:8080 +Hello from Fedora CoreOS! +``` + +更多信息参见:[Fedora CoreOS 更新][9]。 + +#### 删除虚拟机 + +要进行事后清理,使用以下命令删除虚拟机和相关存储: + +``` +$ virsh destroy fcos +$ virsh undefine --remove-all-storage fcos +``` + +### 结论 + +Fedora CoreOS 为在容器中运行应用程序提供了一个坚实而安全的操作系统。它在推荐主机使用声明式配置文件进行配置的 DevOps 环境中表现出色。自动更新和回滚到以前版本的操作系统的能力,可以在服务的运行过程中带来安心的感觉。 + +通过关注项目[文档][10]中的教程,了解更多关于 Fedora CoreOS 的信息。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/getting-started-with-fedora-coreos/ + +作者:[Clément Verna][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/cverna/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/fcos-gettingstarted-1-816x345.jpg +[2]: https://unsplash.com/@pawel_czerwinski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/core?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://getfedora.org/coreos/ +[5]: https://github.com/coreos/coreos-installer/releases +[6]: https://github.com/coreos/ignition +[7]: https://podman.io/ +[8]: https://github.com/coreos/fcct/releases +[9]: https://docs.fedoraproject.org/en-US/fedora-coreos/auto-updates/ +[10]: https://docs.fedoraproject.org/en-US/fedora-coreos/tutorials/ diff --git a/published/202012/20201129 How to Go Full Dark Mode With LibreOffice.md b/published/202012/20201129 How to Go Full Dark Mode With LibreOffice.md new file mode 100644 index 0000000000..21ca4829cb --- /dev/null +++ b/published/202012/20201129 How to Go Full Dark Mode With LibreOffice.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12893-1.html) +[#]: subject: (How to Go Full Dark Mode With LibreOffice) +[#]: via: (https://itsfoss.com/libreoffice-dark-mode/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +如何在 LibreOffice 中完全启用深色模式 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/07/083812n0zgss9qt175pm9z.jpg) + +[LibreOffice][1] 是一款自由开源的跨平台办公生产力软件。如果你没有充分利用它,那么必须看下 [LibreOffice 小技巧][2]。 + +甚至在非编程人员中,深色主题也越来越受欢迎。它减轻了眼睛的压力,特别适合长时间使用屏幕。有人认为,这使文本看起来清晰明了,有助于提高生产率。 + +如今,某些 Linux 发行版例如 [Ubuntu 带有深色模式][3],使你的系统具有更暗的色彩。当你打开深色模式dark mode时,某些应用将自动切换到深色模式。 + +LibreOffice 也会这样,但你编辑的主区域除外: + +![LibreOffice semi dark mode matching with the system theme][4] + +你可以更改它。如果要让 LibreOffice 进入完全深色模式,只需更改一些设置。让我告诉你如何做。 + +### 如何在 LibreOffice 中完全启用深色模式 + +如前所述,你需要先启用系统范围的深色模式。这样可以确保窗口颜色(或标题栏)与应用内深色完全融合。 + +接下来,打开套件中的**任意** LibreOffice 应用,例如 **Writer**。然后从菜单中,依次点击 **Tools -> Options -> Application Colors**,然后选择 **Document background 和 Application background** 为 **Black** 或 **Automatic**(任意适合你的方式)。 + +![][5] + +如果图标不是深色,那么可以从菜单(如下图所示)中更改它们,**Tools -> Options -> View** ,我在 MX Linux 上的个人选择是 Ubuntu 的 [Yaru][6] 图标样式(如果你使用的图标包为深色版本,请选择它) 。 + +![][7] + +当然,你也可以尝试其他 Linux 发行版的 [icon 主题][8]。 + +最终结果应如下所示: + +![][9] + +#### LibreOffice flatpak 软件包的其他技巧 + +如果你使用的是 LibreOffice 套件的 [Flatpak 软件包][10],那么 LibreOffice 的标题区域(或菜单区域)可能看起来是白色的。在这种情况下,你可以尝试进入 **Tools -> Options -> Personalization**,然后选择 “**灰色主题**”,如下截图所示。 + +![][11] + +它并不完全是黑色的,但应该可以使外观看起来更好。希望可以帮助你切换到深色主题的 LibreOffice 体验! + +#### 总结 + +深色主题逐渐开始在我们的台式机中占主导地位,它具有现代品味并减少了眼睛疲劳,尤其是在弱光条件下。 + +LibreOffice 使你可以自由地将工作环境切换为深色主题或保留浅色主题元素。实际上,你将有大量的自定义选项来调整你喜欢的内容。你是否已在 LibreOffice 上切换为深色主题?你首选哪种颜色组合?在下面的评论中让我们知道! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/libreoffice-dark-mode/ + +作者:[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.libreoffice.org +[2]: https://itsfoss.com/libreoffice-tips/ +[3]: https://itsfoss.com/dark-mode-ubuntu/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/libreOffice-dark-mode.png?resize=799%2C450&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/1-libreoffice-application-colours.png?resize=800%2C551&ssl=1 +[6]: https://extensions.libreoffice.org/en/extensions/show/yaru-icon-theme +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/2-libreoffice-iconstyle-1.png?resize=800%2C531&ssl=1 +[8]: https://itsfoss.com/best-icon-themes-ubuntu-16-04/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/3-libreoffice-dark.png?resize=800%2C612&ssl=1 +[10]: https://itsfoss.com/what-is-flatpak/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/libre-office-personalization.png?resize=800%2C636&ssl=1 diff --git a/published/202012/20201130 8 Git aliases that make me more efficient.md b/published/202012/20201130 8 Git aliases that make me more efficient.md new file mode 100644 index 0000000000..67e9e75811 --- /dev/null +++ b/published/202012/20201130 8 Git aliases that make me more efficient.md @@ -0,0 +1,256 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12904-1.html) +[#]: subject: (8 Git aliases that make me more efficient) +[#]: via: (https://opensource.com/article/20/11/git-aliases) +[#]: author: (Ricardo Gerardi https://opensource.com/users/rgerardi) + +8 个让我更有效率的 Git 别名 +====== + +> 使用别名为你最常用或复杂的 Git 命令创建快捷方式。 + +![](https://img.linux.net.cn/data/attachment/album/202012/09/202245q50ss5kncqc241sf.jpg) + +这篇出色的文章《[改变我使用 Git 工作方式的七个技巧][2]》启发了我写下另一个对我在命令行上使用 Git 的经验有重大影响的 Git 特性:别名。 + +定义 Git 的别名来替代命令有两大好处。 + + * 它简化了有许多选项的长命令,使它们更短,更容易记住。 + * 缩短了经常使用的命令,使你的工作更有效率。 + +### 如何定义和使用别名 + +要定义 Git 的别名,请使用 `git config` 命令,加上别名和要替换的命令。例如,要为 `git push` 创建别名 `p`: + +``` +$ git config --global alias.p 'push' +``` + +你可以通过将别名作为 `git` 的参数来使用别名,就像其他命令一样: + +``` +$ git p +``` + +要查看所有的别名,用 `git config` 列出你的配置: + +``` +$ git config --global -l +user.name=ricardo +user.email=ricardo@example.com +alias.p=push +``` + +你也可以用你喜欢的 shell 来定义别名,比如 Bash 或 Zsh。不过,用 Git 定义别名有几个功能是用 shell 无法实现的。首先,它允许你在不同的 shell 中使用别名,而无需额外配置。此外,它还集成了 Git 的自动更正功能,所以当你输入错误的命令时,Git 可以建议你正确的别名。最后,Git 还会将别名保存在用户配置文件中,你可以通过复制一个文件将别名转移到其他机器上。 + +无论使用哪种方法,定义别名都能改善你使用 Git 的整体体验。更多关于定义 Git 别名的信息,请看《[Git Book][4]》。 + +### 8 个有用的 Git 别名 + +现在你知道如何创建和使用别名了,来看看一些有用的别名。 + +#### 1、Git 状态 + +Git 命令行用户经常使用 `status` 命令来查看已更改或未跟踪的文件。默认情况下,这个命令提供了很多行的冗长输出,你可能不想要或不需要。你可以使用一个别名来处理这两个组件。定义别名 `st` 来缩短命令,并使用选项 `-sb` 来输出一个不那么啰嗦的状态和分支信息。 + +``` +$ git config --global alias.st 'status -sb' +``` + +如果你在一个干净的分支上使用这个别名,你的输出就像这样: + +``` +$  git st +## master +``` + +在一个带有已更改和未跟踪文件的分支上使用它,会产生这样的输出: + +``` +$ git st +## master + M test2 +?? test3 +``` + +#### 2、Git 单行日志 + +创建一个别名,以单行方式显示你的提交,使输出更紧凑: + +``` +$ git config --global alias.ll 'log --oneline' +``` + +使用这个别名可以提供所有提交的简短列表: + +``` +$ git ll +33559c5 (HEAD -> master) Another commit +17646c1 test1 +``` + +#### 3、Git 的最近一次提交 + +这将显示你最近一次提交的详细信息。这是扩展了《Git Book》中 [别名][4] 一章的例子: + +``` +$ git config --global alias.last 'log -1 HEAD --stat' +``` + +用它来查看最后的提交: + +``` +$ git last +commit f3dddcbaabb928f84f45131ea5be88dcf0692783 (HEAD -> branch1) +Author: ricardo +Date:   Tue Nov 3 00:19:52 2020 +0000 + +    Commit to branch1 + + test2 | 1 + + test3 | 0 + 2 files changed, 1 insertion(+) +``` + +#### 4、Git 提交 + +当你对 Git 仓库进行修改时,你会经常使用 `git commit`。使用 `cm` 别名使 `git commit -m` 命令更有效率: + +``` +$ git config --global alias.cm 'commit -m' +``` + +因为 Git 别名扩展了命令,所以你可以在执行过程中提供额外的参数: + +``` +$ git cm "A nice commit message" +[branch1 0baa729] A nice commit message + 1 file changed, 2 insertions(+) +``` + +#### 5、Git 远程仓库 + +`git remote -v` 命令列出了所有配置的远程仓库。用别名 `rv` 将其缩短: + +``` +$ git config --global alias.rv 'remote -v' +``` + +#### 6、Git 差异 + +`git diff` 命令可以显示不同提交的文件之间的差异,或者提交和工作树之间的差异。用 `d` 别名来简化它: + +``` +$ git config --global alias.d 'diff' +``` + +标准的 `git diff` 命令对小的改动很好用,但对于比较复杂的改动,外部工具如 `vimdiff` 就更有用。创建别名 `dv` 来使用 `vimdiff` 显示差异,并使用 `y` 参数跳过确认提示: + +``` +$ git config --global alias.dv 'difftool -t vimdiff -y' +``` + +使用这个别名来显示两个提交之间的 `file1` 差异: + +``` +$ git dv 33559c5 ca1494d file1 +``` + +![vim-diff results][5] + +#### 7、Git 配置列表 + +`gl` 别名可以更方便地列出所有用户配置: + +``` +$ git config --global alias.gl 'config --global -l' +``` + +现在你可以看到所有定义的别名(和其他配置选项): + +``` +$ git gl +user.name=ricardo +user.email=ricardo@example.com +alias.p=push +alias.st=status -sb +alias.ll=log --oneline +alias.last=log -1 HEAD --stat +alias.cm=commit -m +alias.rv=remote -v +alias.d=diff +alias.dv=difftool -t vimdiff -y +alias.gl=config --global -l +alias.se=!git rev-list --all | xargs git grep -F +``` + +#### 8、搜索提交 + +Git 别名允许你定义更复杂的别名,比如执行外部 shell 命令,可以在别名前加上 `!` 字符。你可以用它来执行自定义脚本或更复杂的命令,包括 shell 管道。 + +例如,定义 `se` 别名来搜索你的提交: + +``` +$ git config --global alias.se '!git rev-list --all | xargs git grep -F' +``` + +使用这个别名来搜索提交中的特定字符串: + +``` +$ git se test2 +0baa729c1d683201d0500b0e2f9c408df8f9a366:file1:test2 +ca1494dd06633f08519ec43b57e25c30b1c78b32:file1:test2 +``` + +### 自动更正你的别名 + +使用 Git 别名的一个很酷的好处是它与自动更正功能的原生集成。如果你犯了错误,默认情况下,Git 会建议使用与你输入的命令相似的命令,包括别名。例如,如果你把 `status` 打成了 `ts`,而不是 `st`,Git 会推荐正确的别名: + +``` +$ git ts +git: 'ts' is not a git command. See 'git --help'. + +The most similar command is +        st +``` + +如果你启用了自动更正功能,Git 会自动执行正确的命令: + +``` +$ git config --global help.autocorrect 20 +$ git ts +WARNING: You called a Git command named 'ts', which does not exist. +Continuing in 2.0 seconds, assuming that you meant 'st'. +## branch1 +?? test4 +``` + +### 优化 Git 命令 + +Git 别名是一个很有用的功能,它可以优化常见的重复性命令的执行,从而提高你的效率。Git 允许你定义任意数量的别名,有些用户会定义很多别名。我更喜欢只为最常用的命令定义别名 —— 定义太多别名会让人难以记忆,而且可能需要查找才能使用。 + +更多关于别名的内容,包括其他有用的内容,请参见 [Git 维基的别名页面][7]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/git-aliases + +作者:[Ricardo Gerardi][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/rgerardi +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/terminal_command_linux_desktop_code.jpg?itok=p5sQ6ODE (Terminal command prompt on orange background) +[2]: https://linux.cn/article-12894-1.html +[3]: mailto:ricardo@example.com +[4]: https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases +[5]: https://opensource.com/sites/default/files/uploads/vimdiff.png (vim-diff results) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://git.wiki.kernel.org/index.php/Aliases diff --git a/published/202012/20201130 An attempt at implementing char-rnn with PyTorch.md b/published/202012/20201130 An attempt at implementing char-rnn with PyTorch.md new file mode 100644 index 0000000000..ba59937319 --- /dev/null +++ b/published/202012/20201130 An attempt at implementing char-rnn with PyTorch.md @@ -0,0 +1,194 @@ +[#]: collector: (lujun9972) +[#]: translator: (zxp93) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12932-1.html) +[#]: subject: (An attempt at implementing char-rnn with PyTorch) +[#]: via: (https://jvns.ca/blog/2020/11/30/implement-char-rnn-in-pytorch/) +[#]: author: (Julia Evans https://jvns.ca/) + +用 PyTorch 实现基于字符的循环神经网络 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/19/102319oe36em6d63bolg0i.jpg) + +在过去的几周里,我花了很多时间用 PyTorch 实现了一个 [char-rnn][1] 的版本。我以前从未训练过神经网络,所以这可能是一个有趣的开始。 + +这个想法(来自 [循环神经网络的不合理效应][1])可以让你在文本上训练一个基于字符的循环神经网络recurrent neural network(RNN),并得到一些出乎意料好的结果。 + +不过,虽然没有得到我想要的结果,但是我还是想分享一些示例代码和结果,希望对其他开始尝试使用 PyTorch 和 RNN 的人有帮助。 + +这是 Jupyter 笔记本格式的代码:[char-rnn in PyTorch.ipynb][2]。你可以点击这个网页最上面那个按钮 “Open in Colab”,就可以在 Google 的 Colab 服务中打开,并使用免费的 GPU 进行训练。所有的东西加起来大概有 75 行代码,我将在这篇博文中尽可能地详细解释。 + +### 第一步:准备数据 + +首先,我们要下载数据。我使用的是古登堡项目Project Gutenberg中的这个数据:[Hans Christian Anderson’s fairy tales][3]。 + +``` +!wget -O fairy-tales.txt +``` + +这个是准备数据的代码。我使用 `fastai` 库中的 `Vocab` 类进行数据处理,它能将一堆字母转换成“词表”,然后用这个“词表”把字母变成数字。 + +之后我们就得到了一个大的数字数组(`training_set`),我们可以用于训练我们的模型。 + +``` +from fastai.text import * +text = unidecode.unidecode(open('fairy-tales.txt').read()) +v = Vocab.create((x for x in text), max_vocab=400, min_freq=1) +training_set = torch.Tensor(v.numericalize([x for x in text])).type(torch.LongTensor).cuda() +num_letters = len(v.itos) +``` + +### 第二步:定义模型 + +这个是 PyTorch 中 `LSTM` 类的封装。除了封装 `LSTM` 类以外,它还做了三件事: + + 1. 对输入向量进行 one-hot 编码,使得它们具有正确的维度。 + 2. 在 `LSTM` 层后一层添加一个线性变换,因为 `LSTM` 输出的是一个长度为 `hidden_size` 的向量,我们需要的是一个长度为 `input_size` 的向量这样才能把它变成一个字符。 + 3. 把 `LSTM` 隐藏层的输出向量(实际上有 2 个向量)保存成实例变量,然后在每轮运行结束后执行 `.detach()` 函数。(我很难解释清 `.detach()` 的作用,但我的理解是,它在某种程度上“结束”了模型的求导计算)(LCTT 译注:`detach()` 函数是将该张量的 `requires_grad` 参数设置为 `False`,即反向传播到该张量就结束。) + +``` +class MyLSTM(nn.Module): + def __init__(self, input_size, hidden_size): + super().__init__() + self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True) + self.h2o = nn.Linear(hidden_size, input_size) + self.input_size=input_size + self.hidden = None + + def forward(self, input): + input = torch.nn.functional.one_hot(input, num_classes=self.input_size).type(torch.FloatTensor).cuda().unsqueeze(0) + if self.hidden is None: + l_output, self.hidden = self.lstm(input) + else: + l_output, self.hidden = self.lstm(input, self.hidden) + self.hidden = (self.hidden[0].detach(), self.hidden[1].detach()) + + return self.h2o(l_output) +``` + +这个代码还做了一些比较神奇但是不太明显的功能。如果你的输入是一个向量(比如 `[1,2,3,4,5,6]`),对应六个字母,那么我的理解是 `nn.LSTM` 会在内部使用[沿时间反向传播][4]更新隐藏向量 6 次。 + +### 第三步:编写训练代码 + +模型不会自己训练的! + +我最开始的时候尝试用 `fastai` 库中的一个辅助类(也是 PyTorch 中的封装)。我有点疑惑因为我不知道它在做什么,所以最后我自己编写了模型训练代码。 + +下面这些代码(`epoch()` 方法)就是有关于一轮训练过程的基本信息。基本上就是重复做下面这几件事情: + + 1. 往 RNN 模型中传入一个字符串,比如 `and they ought not to teas`。(要以数字向量的形式传入) + 2. 得到下一个字母的预测结果 + 3. 计算 RNN 模型预测结果和真实的下一个字母之间的损失函数(`e`,因为 `tease` 这个单词是以 `e` 结尾的) + 4. 计算梯度(用 `loss.backward()` 函数) + 5. 沿着梯度下降的方向修改模型中参数的权重(用 `self.optimizer.step()` 函数) + +``` +class Trainer(): + def __init__(self): + self.rnn = MyLSTM(input_size, hidden_size).cuda() + self.optimizer = torch.optim.Adam(self.rnn.parameters(), amsgrad=True, lr=lr) + def epoch(self): + i = 0 + while i < len(training_set) - 40: + seq_len = random.randint(10, 40) + input, target = training_set[i:i+seq_len],training_set[i+1:i+1+seq_len] + i += seq_len + # forward pass + output = self.rnn(input) + loss = F.cross_entropy(output.squeeze()[-1:], target[-1:]) + # compute gradients and take optimizer step + self.optimizer.zero_grad() + loss.backward() + self.optimizer.step() +``` + +### 使用 nn.LSTM 沿着时间反向传播,不要自己写代码 + +开始的时候我自己写代码每次传一个字母到 LSTM 层中,之后定期计算导数,就像下面这样: + +``` +for i in range(20): + input, target = next(iter) + output, hidden = self.lstm(input, hidden) +loss = F.cross_entropy(output, target) +hidden = hidden.detach() +self.optimizer.zero_grad() +loss.backward() +self.optimizer.step() +``` + +这段代码每次传入 20 个字母,每次一个,并且在最后训练了一次。这个步骤就被称为[沿时间反向传播][4],Karpathy 在他的博客中就是用这种方法。 + +这个方法有些用处,我编写的损失函数开始能够下降一段时间,但之后就会出现峰值。我不知道为什么会出现这种现象,但之后我改为一次传入 20 个字符到 LSTM 之后(按 `seq_len` 维度),再进行反向传播,情况就变好了。 + +### 第四步:训练模型! + +我在同样的数据上重复执行了这个训练代码大概 300 次,直到模型开始输出一些看起来像英文的文本。差不多花了一个多小时吧。 + +这种情况下我也不关注模型是不是过拟合了,但是如果你在真实场景中训练模型,应该要在验证集上验证你的模型。 + +### 第五步:生成输出! + +最后一件要做的事就是用这个模型生成一些输出。我写了一个辅助方法从这个训练好的模型中生成文本(`make_preds` 和 `next_pred`)。这里主要是把向量的维度对齐,重要的一点是: + +``` +output = rnn(input) +prediction_vector = F.softmax(output/temperature) +letter = v.textify(torch.multinomial(prediction_vector, 1).flatten(), sep='').replace('_', ' ') +``` + +基本上做的事情就是这些: + + 1. RNN 层为字母表中的每一个字母或者符号输出一个数值向量(`output`)。 + 2. 这个 `output` 向量**并不是**一个概率向量,所以需要 `F.softmax(output/temperature)` 操作,将其转换为概率值(也就是所有数值加起来和为 1)。`temperature` 某种程度上控制了对更高概率的权重,在限制范围内,如果设置 `temperature=0.0000001`,它将始终选择概率最高的字母。 + 3. `torch.multinomial(prediction_vector)` 用于获取概率向量,并使用这些概率在向量中选择一个索引(如 `12`)。 + 4. `v.textify` 把 `12` 转换为字母。 + +如果我们想要处理的文本长度为 300,那么只需要重复这个过程 300 次就可以了。 + +### 结果! + +我把预测函数中的参数设置为 `temperature = 1` 得到了下面的这些由模型生成的结果。看起来有点像英语,这个结果已经很不错了,因为这个模型要从头开始“学习”英语,并且是在字符序列的级别上进行学习的。 + +虽然这些话没有什么*含义*,但我们也不知道到底想要得到什么输出。 + +> “An who was you colotal said that have to have been a little crimantable and beamed home the beetle. “I shall be in the head of the green for the sound of the wood. The pastor. “I child hand through the emperor’s sorthes, where the mother was a great deal down the conscious, which are all the gleam of the wood they saw the last great of the emperor’s forments, the house of a large gone there was nothing of the wonded the sound of which she saw in the converse of the beetle. “I shall know happy to him. This stories herself and the sound of the young mons feathery in the green safe.” +> +> “That was the pastor. The some and hand on the water sound of the beauty be and home to have been consider and tree and the face. The some to the froghesses and stringing to the sea, and the yellow was too intention, he was not a warm to the pastor. The pastor which are the faten to go and the world from the bell, why really the laborer’s back of most handsome that she was a caperven and the confectioned and thoughts were seated to have great made + +下面这些结果是当 `temperature=0.1` 时生成的,它选择字符的方式更接近于“每次都选择出现概率最高的字符”。这就使得输出结果有很多是重复的。 + +> ole the sound of the beauty of the beetle. “She was a great emperor of the sea, and the sun was so warm to the confectioned the beetle. “I shall be so many for the beetle. “I shall be so many for the beetle. “I shall be so standen for the world, and the sun was so warm to the sea, and the sun was so warm to the sea, and the sound of the world from the bell, where the beetle was the sea, and the sound of the world from the bell, where the beetle was the sea, and the sound of the wood flowers and the sound of the wood, and the sound of the world from the bell, where the world from the wood, and the sound of the + +这段输出对这几个单词 `beetles`、`confectioners`、`sun` 和 `sea` 有着奇怪的执念。 + +### 总结! + +至此,我的结果远不及 Karpathy 的好,可能有一下几个原因: + + 1. 没有足够多的训练数据。 + 2. 训练了一个小时之后我就没有耐心去查看 Colab 笔记本上的信息。 + 3. Karpathy 使用了两层LSTM,包含了更多的参数,而我只使用了一层。 + 4. 完全是另一回事。 + +但我得到了一些大致说得过去的结果!还不错! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/30/implement-char-rnn-in-pytorch/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[zhangxiangping](https://github.com/zxp93) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://karpathy.github.io/2015/05/21/rnn-effectiveness/ +[2]: https://gist.github.com/jvns/b6dda36b2fdcc02b833ed5b0c7a09112 +[3]: https://www.gutenberg.org/cache/epub/27200/pg27200.txt +[4]: https://en.wikipedia.org/wiki/Backpropagation_through_time diff --git a/published/202012/20201130 Journal five minutes a day with Jupyter.md b/published/202012/20201130 Journal five minutes a day with Jupyter.md new file mode 100644 index 0000000000..d30d609646 --- /dev/null +++ b/published/202012/20201130 Journal five minutes a day with Jupyter.md @@ -0,0 +1,151 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12887-1.html) +[#]: subject: (Journal five minutes a day with Jupyter) +[#]: via: (https://opensource.com/article/20/11/daily-journal-jupyter) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +每天用 Jupyter 写 5 分钟的日记 +====== + +> 用 Jupyter 和 Python 在你的日常写作背后实现一些自动化。 + +![](https://img.linux.net.cn/data/attachment/album/202012/05/131314woxpksatp2toe7tz.jpg) + +有些人会遵循传统,制定一年的计划。不过,一年的时间很长,所以我以季节性的主题或轨迹来规划。每个季度,我都会坐下来,看看即将到来的三个月的季节,并决定在这段时间里我将努力做什么。 + +对于我最新的主题,我决定要每天写一篇日记。我喜欢有明确的承诺,所以我承诺每天写 5 分钟。我也喜欢有可观察的承诺,哪怕只是对我而言,所以我把我的记录放在 Git 里。 + +我决定在写日记的过程中实现一些自动化,于是我使用了我最喜欢的自动化工具:[Jupyter][2]。Jupyter 有一个有趣的功能 [ipywidgets][3],这是一套用于 Jupyter Notebooks、JupyterLab 和 IPython 内核的交互式 HTML 组件。 + +如果你想跟着本文的代码走,请注意,让你的 JupyterLab 实例支持组件可能有点复杂,请按照[这些说明][4]来进行设置。 + +### 导入 ipywidgets 模块 + +首先,你需要导入一堆东西,比如 ipywidgets 和 [Twisted][5]。Twisted 模块可以用来创建一个异步时间计数器: + +``` +import twisted.internet.asyncioreactor +twisted.internet.asyncioreactor.install() +from twisted.internet import reactor, task +import ipywidgets, datetime, subprocess, functools, os +``` + +### 设置定时条目 + +用 Twisted 实现时间计数器是利用了 `task.LoopingCall`。然而,结束循环调用的唯一方法是用一个异常。倒计时时钟总会停止,所以你需要一个自定义的异常来指示“一切正常;计数器结束”: + +``` +class DoneError(Exception): +    pass +``` + +现在你已经写好了异常,你可以写定时器了。第一步是创建一个 `ipywidgets.Label` 的文本标签组件。循环使用 `divmod` 计算出分和秒,然后设置标签的文本值: + +``` +def time_out_counter(reactor): + label = ipywidgets.Label("Time left: 5:00") + current_seconds = datetime.timedelta(minutes=5).total_seconds() + def decrement(count): + nonlocal current_seconds + current_seconds -= count + time_left = datetime.timedelta(seconds=max(current_seconds, 0)) + minutes, left = divmod(time_left, minute) + seconds = int(left.total_seconds()) + label.value = f"Time left: {minutes}:{seconds:02}" + if current_seconds < 0: + raise DoneError("finished") + minute = datetime.timedelta(minutes=1) + call = task.LoopingCall.withCount(decrement) + call.reactor = reactor + d = call.start(1) + d.addErrback(lambda f: f.trap(DoneError)) + return d, label +``` + +### 从 Jupyter 组件中保存文本 + +下一步是写一些东西,将你输入的文字保存到一个文件中,并提交到 Git。另外,由于你要写 5 分钟的日记,你需要一个能给你提供写字区域的组件(滚动肯定是可以的,但一次能看到更多的文字就更好了)。 + +这就用到了组件 `Textarea`,这是一个你可以书写的文本字段,而 `Output` 则是用来给出反馈的。这一点很重要,因为 `git push` 可能会花点时间或失败,这取决于网络。如果备份失败,用反馈提醒用户很重要: + +``` +def editor(fname): +    textarea = ipywidgets.Textarea(continuous_update=False) +    textarea.rows = 20 +    output = ipywidgets.Output() +    runner = functools.partial(subprocess.run, capture_output=True, text=True, check=True) +    def save(_ignored): +        with output: +            with open(fname, "w") as fpout: +                fpout.write(textarea.value) +            print("Sending...", end='') +            try: +                runner(["git", "add", fname]) +                runner(["git", "commit", "-m", f"updated {fname}"]) +                runner(["git", "push"]) +            except subprocess.CalledProcessError as exc: +                print("Could not send") +                print(exc.stdout) +                print(exc.stderr) +            else: +                 print("Done") +    textarea.observe(save, names="value") +    return textarea, output, save +``` + +`continuous_update=False` 是为了避免每个字符都保存一遍并发送至 Git。相反,只要脱离输入焦点,它就会保存。这个函数也返回 `save` 函数,所以可以明确地调用它。 + +### 创建一个布局 + +最后,你可以使用 `ipywidgets.VBox` 把这些东西放在一起。这是一个包含一些组件并垂直显示的东西。还有一些其他的方法来排列组件,但这足够简单: + +``` +def journal(): +    date = str(datetime.date.today()) +    title = f"Log: Startdate {date}" +    filename = os.path.join(f"{date}.txt") +    d, clock = time_out_counter(reactor) +    textarea, output, save = editor(filename) +    box = ipywidgets.VBox([ +        ipywidgets.Label(title), +        textarea, +        clock, +        output +    ]) +    d.addCallback(save) +    return box +``` + +biu!你已经定义了一个写日记的函数了,所以是时候试试了。 + +``` +journal() +``` + +![Jupyter journal][6] + +你现在可以写 5 分钟了! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/daily-journal-jupyter + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tea-cup-mug-flowers-book-window.jpg?itok=JqThhl51 (Ceramic mug of tea or coffee with flowers and a book in front of a window) +[2]: https://jupyter.org/ +[3]: https://ipywidgets.readthedocs.io/en/latest/ +[4]: https://ipywidgets.readthedocs.io/en/latest/user_install.html +[5]: https://twistedmatrix.com/trac/ +[6]: https://opensource.com/sites/default/files/uploads/journaling_output_13_0.png (Jupyter journal) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202012/20201201 How this open source security tool halted significant DDoS attacks.md b/published/202012/20201201 How this open source security tool halted significant DDoS attacks.md new file mode 100644 index 0000000000..13224450d9 --- /dev/null +++ b/published/202012/20201201 How this open source security tool halted significant DDoS attacks.md @@ -0,0 +1,69 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12897-1.html) +[#]: subject: (How this open source security tool halted significant DDoS attacks) +[#]: via: (https://opensource.com/article/20/12/open-source-vs-ddos-attacks) +[#]: author: (Philippe Humeau https://opensource.com/users/philippe-humeau) + +如何在 1 分钟内阻止 7000 台机器的僵尸网络 +====== + +> 对 CrowdSec 的配置更改,在不到一分钟的时间内阻止了一个 7000 台机器的僵尸网络的攻击。 + +![](https://img.linux.net.cn/data/attachment/album/202012/07/220444x6kaedeu6ko0e7uo.jpg) + +2020 年,我们的生活和工作方式在短短几天内被彻底颠覆。随着 COVID-19 开始在全球范围内蔓延,我们将工作带回家,与同事、朋友和家人保持在线联系成为关键的必需品。这为黑客造成破坏打开了大门。例如,根据 Neustar 的数据,今年上半年全球的分布式拒绝服务(DDOS) 攻击[增长了 151%][2]。 + +[CrowdSec][3] 是一个开源的安全引擎,它可以分析访问者的行为,并提供适应各种攻击的响应。它能解析来自各种来源的日志,并应用启发式方案来识别攻击性行为,并防范大多数攻击类别。并且,它与其它安装的 CrowdSec 系统共享该情报。每次 IP 地址被阻止时,它都会通知整个用户社区。这就创建了一个[实时、协作的 IP 信誉数据库][4],利用人群的力量使互联网更加安全。 + +### CrowdSec 如何工作:案例研究 + +Sorf Networks 是一家总部位于土耳其的技术公司,为客户提供高配置的托管服务器和 DDoS 防护解决方案,它提供了一个 CrowdSec 工作的例子。Sorf 的一个客户每天都会遇到来自 1 万多台机器僵尸网络的 DDoS 攻击,并努力寻找一种能够满足技术要求的解决方案来及时处理这些攻击。 + +虽然客户采取了一般的预防措施来缓解这些攻击,比如引入 JavaScript(JS)挑战challenges、限速等,但这些措施在整个攻击面并不可行。一些 URL 需要被非常基本的软件使用,而这些软件不支持 JS 挑战。黑客就是黑客,这正是他们每天的目标:链条上最薄弱的环节。 + +Sorf Networks 首先使用 [Fail2ban][5](这启发了 CrowdSec)为其客户建立了一个 DDoS 缓解策略。它在一定程度上帮助了客户,但它太慢了。它需要 50 分钟来处理日志和处理 7000 到 10000 台机器的 DDoS 攻击。这使得它在这种情况下没有效果。另外,因为它没有禁止 IP,日志会持续堆积,它需要每秒处理几千条日志,这是不可能的。 + +在使用租用的僵尸网络进行的 DDoS 测试中,一次攻击可以高达每秒 6700 个左右的请求,这些请求来自 8600 个独立 IP。这是对一台服务器流量的捕捉: + +![Server traffic][6] + +虽然 CrowdSec 技术可以应对巨大的攻击,但其默认设置每秒只能处理约 1000 个端点。Sorf 需要一个量身定做的配置来处理单台机器上这么多的流量。 + +Sorf 的团队对 CrowdSec 的配置进行了修改,以显著提高其吞吐量来处理日志。首先,它去掉了高消耗且非关键的富集enrichment解析器,例如 [GeoIP 富集][7]。它还将允许的 goroutine 的默认数量从一个增加到五个。之后,团队又用 8000 到 9000 台主机做了一次实测,平均每秒 6000 到 7000 个请求。这个方案是有代价的,因为 CrowdSec 在运行过程中吃掉了 600% 的 CPU,但其内存消耗却保持在 270MB 左右。 + +然而,结果却显示出明显的成功: + + * 在一分钟内,CrowdSec 能够处理所有的日志 + * 95% 的僵尸网络被禁止,攻击得到有效缓解 + * 15 个域现在受到保护,不受 DDoS 攻击 + +根据 Sorf Networks 的总监 Cagdas Aydogdu 的说法,CrowdSec 的平台使团队“能够在令人难以置信的短时间内提供一个世界级的高效防御系统”。 + +* * * + +本文改编自[如何用 CrowdSec 在 1 分钟内阻止 7000 台机器的僵尸网络][8],原载于 CrowdSec 网站。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/open-source-vs-ddos-attacks + +作者:[Philippe Humeau][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/philippe-humeau +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_password_chaos_engineer_monster.png?itok=J31aRccu (Security monster) +[2]: https://www.businesswire.com/news/home/20200916005046/en/DDoS-Attacks-Increase-by-151-in-First-Half-Of-2020 +[3]: https://crowdsec.net/ +[4]: https://opensource.com/article/20/10/crowdsec +[5]: https://www.fail2ban.org +[6]: https://opensource.com/sites/default/files/uploads/crowdsec_servertraffic.png (Server traffic) +[7]: https://hub.crowdsec.net/author/crowdsecurity/configurations/geoip-enrich +[8]: https://crowdsec.net/2020/10/21/how-to-stop-a-botnet-with-crowdsec/ diff --git a/published/202012/20201201 Try Jed as your Linux terminal text editor.md b/published/202012/20201201 Try Jed as your Linux terminal text editor.md new file mode 100644 index 0000000000..b4197674e1 --- /dev/null +++ b/published/202012/20201201 Try Jed as your Linux terminal text editor.md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12901-1.html) +[#]: subject: (Try Jed as your Linux terminal text editor) +[#]: via: (https://opensource.com/article/20/12/jed) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +尝试将 Jed 作为你的 Linux 终端文本编辑器 +====== + +> Jed 方便的下拉菜单,让新用户可以轻松地使用终端文本编辑器。 + +![](https://img.linux.net.cn/data/attachment/album/202012/09/085456f7fmt74eu6eekpmt.jpg) + +你可能听说过 Emacs、Vim 和 Nano 这些典型的 Linux 文本编辑器,但 Linux 有大量的开源文本编辑器,我的目标是在 12 月份对其中的 31 个文本编辑器进行一次公平的测试。 + +在这篇文章中,我将介绍 [Jed][2],它是一个基于终端的编辑器,它的特点是有一个方便的下拉菜单,这让那些刚刚接触终端编辑器的用户,以及那些不喜欢记住每个功能的组合键的用户而言变得特别容易。 + +### 安装 Jed + +在 Linux 上,你的发行版软件仓库可能会让 Jed 通过你的软件包管理器安装: + +``` +$ sudo dnf install jed +``` + +并不是所有发行版都是如此,但它是一个很容易从源码编译的应用。首先,下载 [S 语言][3](Jed 的编写语言)并安装(其中 `x.y.z` 请替换为对应的版本号): + +``` +$ wget https://www.jedsoft.org/releases/slang/slang-x.y.z.tar.bz2 +$ tar xvf slang*bz2 +$ cd slang-x.y.z +$ ./configure ; make +$ sudo make install +``` + +安装好后,对 [Jed 源码][4]也同样操作(其中 `x.y.z` 请替换为对应的版本号): + +``` +$ wget https://www.jedsoft.org/releases/jed/jed-x.y.z.tar.bz2 +$ tar xvf jed*bz2 +$ cd jed-x.y.z +$ ./configure ; make +$ sudo make install +``` + +### 启动 Jed + +Jed 在终端中运行,所以要启动它,只需打开终端,输入 `jed`: + +``` +F10 key ==> File Edit Search Buffers Windows System Help + + + This is a scratch buffer. It is NOT saved when you exit. + + To access the menus, press F10 or ESC-m and the use the arrow + keys to navigate. + + Latest version information is available on the web from + . Other sources of JED + information include the usenet newsgroups comp.editors and + alt.lang.s-lang. To subscribe to the jed-users mailing list, see + . + + Copyright (C) 1994, 2000-2009 John E. Davis + Email comments or suggestions to . + +[ (Jed 0.99.19U) Emacs: *scratch* () 1/16 8:49am ] +``` + +### 如何使用 Jed + +Jed 自动加载的说明很清晰且很有帮助。你可以按 `F10` 键或 `Esc` 键,然后按字母 `M` 进入顶部菜单。这将使你的光标进入 Jed 顶部的菜单栏,但它不会打开菜单。要打开菜单,请按键盘上的回车键。使用方向键来浏览每个菜单。 + +屏幕上的菜单不仅对初次使用的用户很有帮助,对有经验的用户来说,它还提供了很好的键盘快捷键提醒。例如,你大概能猜到如何保存正在处理的文件。进入 **File** 菜单,选择 **Save**。如果你想加快这个过程,你可以记住 `Ctrl+X`,然后 `Ctrl+S` 的组合键(是的,这是连续的两个组合键)。 + +### 探索 Jed 的功能 + +对于一个简单的编辑器来说,Jed 拥有一系列令人惊讶的实用功能。它有一个内置的多路复用器,允许你同时打开多个文件,但它会“叠”在另一个文件之上,所以你可以在它们之间切换。你可以分割你的 Jed 窗口,让多个文件同时出现在屏幕上,改变你的颜色主题,或者打开一个 shell。 + +对于任何有 Emacs 使用经验的人来说,Jed 的许多“没有宣传”的功能,例如用于导航和控制的组合键,都是一目了然的。然而,当一个组合键与你所期望的大相径庭时,就会有一个轻微的学习(或者说没有学习)曲线。例如,GNU Emacs 中的 `Alt+B` 可以将光标向后移动一个字,但在 Jed 中,默认情况下,它是 **Buffers** 菜单的快捷键。这让我措手不及,大约本文每句话都遇到一次。 + +![Jed][8] + +Jed 也有**模式**,允许你加载模块或插件来帮助你编写特定种类的文本。例如,我使用默认的 text 模式写了这篇文章,但当我在编写 [Lua][9] 时,我能够切换到 lua 模式。这些模式提供语法高亮,并帮助匹配括号和其他分隔符。你可以在 `/usr/share/jed/lib` 中查看 Jed 捆绑了哪些模式,而且因为它们是用 S 语言编写的,你可以浏览代码,并可能学习一种新的语言。 + +### 尝试 Jed + +Jed 是一个令人愉快且清新的 Linux 终端文本编辑器。它轻量级,易于使用,设计相对简单。作为 Vi 的替代方案,你可以在你的 `~/.bashrc` 文件中(如果你是 root 用户,在 root 用户的 `~/.bashrc` 文件中)将 Jed 设置为 `EDITOR` 和 `VISUAL` 变量。今天就试试 Jed 吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/jed + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop) +[2]: https://www.jedsoft.org/jed +[3]: https://www.jedsoft.org/releases/slang/ +[4]: https://www.jedsoft.org/releases/jed +[5]: http://www.jedsoft.org/jed/\> +[6]: http://www.jedsoft.org/jed/mailinglists.html\> +[7]: mailto:jed@jedsoft.org +[8]: https://opensource.com/sites/default/files/jed.png (Jed) +[9]: https://opensource.com/article/20/2/lua-cheat-sheet diff --git a/published/202012/20201201 Zotero- An Open Source App to Help You Collect - Share Research.md b/published/202012/20201201 Zotero- An Open Source App to Help You Collect - Share Research.md new file mode 100644 index 0000000000..b07ffa5d81 --- /dev/null +++ b/published/202012/20201201 Zotero- An Open Source App to Help You Collect - Share Research.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12905-1.html) +[#]: subject: (Zotero: An Open Source App to Help You Collect & Share Research) +[#]: via: (https://itsfoss.com/zotero/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Zotero:一款帮助你收集和分享研究成果的开源应用 +====== + +> Zotero 是一款令人印象深刻的自由开源的应用,它让你可以收集、组织、引用和共享研究成果。你还可以使用 Zotero 为你的文档即时创建参考文献和书目。 + +![](https://img.linux.net.cn/data/attachment/album/202012/09/213010i6o78b6y5gifyjtf.jpg) + +通常,你可以[使用 Linux 上任何一款笔记应用][1]来收集和分享你的想法。但是,在这里,我想分享一些专门为你量身定做的东西,来帮助你收集、整理和分享你的研究成果,即 [Zotero][2]。 + +### Zotero:收集、整理和分享研究成果 + +![][3] + +Zotero 是一个完全开源的项目,你可以在 [GitHub][4] 上找到它。它的目的是帮助你轻松地收集、整理、添加笔记和分享你的研究成果。 + +而且,这一切都不需要基于云端的服务,它是完全离线的。所以,你的研究成果是属于你的。当然,除非你出于协作目的想将其同步,为此你可能需要参考[该文档][5]。 + +作为一个好的起点,你可以选择 [WebDAV 存储][6],或者直接创建一个 Zotero 帐户来轻松同步和分享你的研究成果。 + +例如,我创建了一个名为 `ankush9` 的 Zotero 账户,你可以在 找到我的研究合集(我添加到我的出版物中)。 + +![][7] + +这使得它很容易分享你组织的研究成果,你可以选择将哪些部分共享到出版物中。 + +让我着重介绍一下 Zotero 的主要功能,来帮助你决定是否需要尝试一下。 + +### Zotero 的功能 + +![][8] + + * 能够使用浏览器插件从网页直接添加信息 + * 为每份资料添加说明 + * 支持添加标签 + * 支持添加语音记录 + * 添加视频作为附件 + * 添加软件作为附件 + * 将电子邮件作为附件 + * 将播客作为附件 + * 添加博客文章 + * 添加一个文件链接 + * 根据项目建立书目 + * 离线快照存储(无需连接互联网即可访问保存的网页) + * 可以复制项目 + * 整理库中的项目 + * 提供了一个垃圾箱,可以删除你的项目,并在需要时轻松恢复。 + * 支持同步 + * 支持数据导出 + * 可整合 LibreOffice 插件 + * 使用你的 Zotero 个人资料链接轻松分享你的研究笔记。 + * 跨平台支持 + +如果你只是想快速创建书目,你可以尝试他们的另一个工具,[ZoteroBib][9]。 + +### 在 Linux 上安装 Zotero + +![][12] + +它适用于 Windows、macOS 和 Linux。对于 Linux,如果你使用的是基于 Ubuntu 的发行版(或 Ubuntu 本身),你可以下载一个 deb 文件(由第三方维护)并安装它。 + +安装 [deb 文件][13]很简单,它在 Pop OS 20.04 上工作得很好。如果你使用的是其他 Linux 发行版,你可以[解压 tar 包][14]并进行安装。 + +你可以按照[官方安装说明][15]来找到合适的方法。 + +- [下载 Zotero][2] + +### 总结 + +它有大量的功能,你可以组织、分享、引用和收集资源,以供你进行搜索。由于支持音频、视频、文本和链接,它应该适合几乎所有的东西。 + +当然,我会将它推荐给有经验的用户,让它发挥最大的作用。而且,如果你之前使用过树状图(思维导图)笔记工具的人,你就知道要做什么了。 + +你觉得 Zotero 怎么样?如果它不适合你,你有更好的替代品建议么?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/zotero/ + +作者:[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://itsfoss.com/note-taking-apps-linux/ +[2]: https://www.zotero.org/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/zotero-app.png?resize=800%2C481&ssl=1 +[4]: https://github.com/zotero/zotero +[5]: https://www.zotero.org/support/ +[6]: https://en.wikipedia.org/wiki/WebDAV +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/zotero-online-publication.jpg?resize=800%2C600&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/zotero-extension.jpg?resize=800%2C414&ssl=1 +[9]: https://zbib.org/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/zotero-preferences.png?resize=800%2C489&ssl=1 +[13]: https://itsfoss.com/install-deb-files-ubuntu/ +[14]: https://en.wikipedia.org/wiki/Tarball +[15]: https://www.zotero.org/support/installation diff --git a/published/202012/20201202 How to Add Third-Party Repositories in Fedora and Get Access to a Huge Number of Additional Software.md b/published/202012/20201202 How to Add Third-Party Repositories in Fedora and Get Access to a Huge Number of Additional Software.md new file mode 100644 index 0000000000..198b496a83 --- /dev/null +++ b/published/202012/20201202 How to Add Third-Party Repositories in Fedora and Get Access to a Huge Number of Additional Software.md @@ -0,0 +1,118 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12898-1.html) +[#]: subject: (How to Add Third-Party Repositories in Fedora and Get Access to a Huge Number of Additional Software) +[#]: via: (https://itsfoss.com/fedora-third-party-repos/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +如何在 Fedora 中添加第三方存储库以访问大量附加软件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/08/074323tkjpr2499rtjnjq0.jpg) + +在你安装 Fedora 后。你可能会发现你想要安装和使用的一些软件在软件商店中找不到。出于一些原因,这些软件包不能出现在 Fedora 存储库中。 + +不用担心,我将告诉你如何为 Fedora 添加第三方存储库来使这些软件包可使用。 + +### 在 Fedora 中的第三方存储库是什么? + +操作系统开发人员通常会决定哪些软件包可以在其存储库中使用,哪些软件包不可以在其存储库中使用。Fedora 也是如此。依据 [Fedora 文档][1] ,第三方存储库包含有 “拥有更为宽松的许可政策,并提供 Fedora 因各种原因所排除软件包” 的软件包。 + +Fedora 强制执行下面的 [准则][2] ,当它打包软件包时: + + * 如果它是专有的,它就不能包含在 Fedora 中 + * 如果它在法律上被限制,它就不能包含在 Fedora 中 + * 如果它违反美国法律(特别是联邦政府或适用于州政府的法律),它就不能包含在 Fedora 中 + +因此,有一些可以由用户自行添加的存储库。这使得用户能够访问附加的软件包。 + +### 在 Fedora 中启用 RPM Fusion 存储库 + +[RPM Fusion][3] 是 Fedora 的第三方应用程序的主要来源。RPM Fusion 是由三个项目(Dribble、Freshrpms 和 Livna)合并而成的。RPM Fusion 提供两种不同的软件存储库。 + + * free 存储库:包含开源软件。 + * nonfree 存储库:包含没有开源协议的软件,但是它们的源文件代码却是可以自由使用的。 + +这里有两种方法来启动 RPM Fusion:从终端启用,或通过点击几个按钮来启用。我们将逐一查看。 + +#### 方法 1:命令行方法 + +这是启用 RPM Fusion 存储库的最简单的方法。只需要输入下面的命令即可启用两个存储库: + +``` +sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm +``` + +会要求你输入密码、确认是否你想要安装这些存储库。在你确认后,安装过程将在几秒钟或几分钟内完成。 + +![通过命令行安装 RPM Fusion][4] + +#### 方法 2:图形用户界面方法 + +使用这个方法来启用 RPM Fusion 存储库,你需要访问 [RPM Fusion 网站][5] 。你将看到针对不同 Fedora 版本的两个存储库的链接。 + +RPM Fusion 建议先安装 free 存储库。因此,单击针对你 Fedora 版本的 free 存储库的链接。然后会打开一个窗口来询问你是否想安装该存储库。单击安装。 + +![通过图形用户界面安装 RPM Fusion][6] + +在安装过程完成后,返回并使用相同的步骤安装 nonfree 存储库。 + +### 启用 Fedora 的第三方存储库 + +Fedora 最近开始提供它自己的 [第三方应用程序存储库][7] 。在这个存储库中 [可使用的应用程序的数量][8] 是非常少的。你可以 [使用它来在 Fedora 上安装 Chrome 浏览器][9] 。除 Chrome 外,它也包含 Adobe Brackets、Atom、Steam、Vivaldi、Opera 等应用程序。 + +就像 RPM Fusion 一样,你可以通过终端或图形用户界面的方法来启用这个存储库。 + +#### 方法 1:命令行方法 + +为启用 Fedora 的第三方存储库,输入下面的命令到你的终端中: + +``` +sudo dnf install fedora-workstation-repositories +``` + +当被提示时,确保输入你的密码并输入 `Y` 来确认安装。 + +#### 方法 2:图形用户界面方法 + +如果你不习惯使用终端,你可以使用图形用户界面方法。 + +首先,你需要打开 Gnome “软件”。接下来,你需要单击右上角的汉堡菜单,并从菜单中选择“软件存储库”。 + +![Gnome 软件的菜单][10] + +在软件存储库窗口中,你将在其顶部看到写着 “第三方存储库” 字样的部分。单击“安装”按钮。当你被提示时,输入你的密码。 + +![Fedora 第三方存储库安装][11] + +随着这些附加存储库的启用,你可以安装软件到你的系统当中。你可以从软件中心管理器或使用 DNF 软件包管理器来轻松地安装它们。 + +如果你发现这篇文章很有趣,请花费一些时间来在社交媒体上分享它。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/fedora-third-party-repos/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://docs.fedoraproject.org/en-US/quick-docs/setup_rpmfusion/#third-party-repositories +[2]: https://fedoraproject.org/wiki/Forbidden_items +[3]: https://rpmfusion.org/RPM%20Fusion +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/install-rpmfusion-cli.png?resize=800%2C604&ssl=1 +[5]: https://rpmfusion.org/Configuration +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/install-rpmfusion-gui.png?resize=800%2C582&ssl=1 +[7]: https://fedoraproject.org/wiki/Workstation/Third_Party_Software_Repositories +[8]: https://fedoraproject.org/wiki/Workstation/Third_party_software_list +[9]: https://itsfoss.com/install-google-chrome-fedora/ +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/software-meni.png?resize=800%2C672&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-third-party-repo-gui.png?resize=746%2C800&ssl=1 +[12]: https://%0Areddit.com/r/linuxusersgroup diff --git a/published/202012/20201202 Why I love Emacs.md b/published/202012/20201202 Why I love Emacs.md new file mode 100644 index 0000000000..78f0c8781b --- /dev/null +++ b/published/202012/20201202 Why I love Emacs.md @@ -0,0 +1,92 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12923-1.html) +[#]: subject: (Why I love Emacs) +[#]: via: (https://opensource.com/article/20/12/emacs) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +为什么我喜欢 Emacs +====== + +> Emacs 并不是一个单纯的文本编辑器,它将掌控置于你手中,让你几乎可以解决你遇到的任何问题。 + +!["表情符号键盘"][1] + +我是一个典型的 [Emacs][2] 用户。不是我选择的 Emacs,而是它选择了我。早在我刚开始学习 Unix 的时候,我偶然发现了一个奇怪的名为 Emacs 的应用程序,它隐藏在我的电脑上,其中有一个鲜为人知的功能。传说中(而且被证明是真的),如果你在终端上输入 `emacs`,按 `Alt+X`,然后输入 `tetris`,你就可以玩一个掉方块的游戏。 + +![Tetris in Emacs][3] + +那就是我对 GNU Emacs 的印象。虽然这很肤浅,但它也准确地表明了 Emacs 的意义:用户可以重新编程他们的(虚拟)世界,并且可以用一个应用程序做*任何*他们想做的事情。在你的文本编辑器中玩俄罗斯方块可能不是你日常的主要目标,但这说明 Emacs 是一个值得骄傲的编程平台。事实上,你可以把它看作是 [Jupyter][4] 的一种先驱,它把一种强大的编程语言(准确的说叫 elisp)和自己的实时环境结合起来。因此,Emacs 作为一个文本编辑器是灵活的、可定制的、强大的。 + +如果你习惯于 Bash、Python 或类似的语言,elisp(以及扩展的 Common Lisp)不一定是最容易入门的语言。但是这种 LISP 方言是很强大的,而且因为 Emacs 是一个 LISP 解释器,所以你可以用它构建应用程序,不管它们是 Emacs 插件还是你想开发成一个独立项目的原型。极其流行的 [org 模式项目][5]就是一个例子:它是一个 Emacs 插件,同时也是一个标记语法,有移动应用可以解释和扩展其功能。类似的有用的 Emacs 内应用的例子还有很多,包括电子邮件客户端、PDF 浏览器、Web 浏览器、shell 和文件管理器。 + +### 两个界面 + +GNU Emacs 至少有两个用户界面:图形用户界面(GUI)和终端用户界面(TUI)。这有时会让人感到惊讶,因为 Emacs 经常与运行在终端中的 Vi 相提并论(尽管 gVim 为现代 Vi 的实现提供了一个 GUI)。如果你想把 GNU Emacs 以终端程序来运行,你可以用 `-nw` 选项来启动它。 + +``` +$ emacs -nw +``` + +有了 GUI 程序,你可以直接从应用程序菜单或终端启动 Emacs。 + +你可能会认为 GUI 会降低 Emacs 的效率,好像“真正的文本编辑器是在终端中运行的”,但 GUI 可以使 Emacs 更容易学习,因为它的 GUI 遵循了一些典型的惯例(菜单栏、可调节的组件、鼠标交互等)。 + +事实上,如果你把 Emacs 作为一个 GUI 应用程序来运行,你可能在一天的时间里会完全没有意识到你在 Emacs 中。只要你使用过 GUI,大多数常用的惯例都适用。例如,你可以用鼠标选择文本,导航到**编辑**菜单,选择**复制**,然后将光标放在其他地方,选择**粘贴**。要保存文档,你可以进入**文件**,然后选择**保存**或**另存为**。你可以按 `Ctrl` 键并向上滚动,使屏幕字体变大,你可以使用滚动条来浏览你的文档,等等。 + +了解 Emacs 的 GUI 形式是拉平学习曲线的好方法。 + +### Emacs 键盘快捷键 + +GNU Emacs 以复杂的键盘组合而恶名远扬。它们不仅陌生(`Alt+W` 来复制?`Ctrl+Y` 来粘贴?),而且还用晦涩难懂的术语来标注(`Alt` 被称为 `Meta`),有时它们成双成对(`Ctrl+X` 后是 `Ctrl+S` 来保存),有时则单独出现(`Ctrl+S` 来搜索)。为什么有人会故意选择使用这些呢? + +嗯,有些人不会。但那些喜欢这些的人是因为这些组合很容易融入到日常打字的节奏中(而且经常让 `Caps Lock` 键充当 `Ctrl` 键)。然而,那些喜欢不同的东西的人有几个选择: + + * “邪恶”模式让你在 Emacs 中使用 Vim 键绑定。就是这么简单。你可以保留你的肌肉记忆中的按键组合,并继承最强大的文本编辑器。 + * 通用用户访问(CUA)键保留了所有 Emacs 常用的组合键,但最令人头疼的键(复制、剪切、粘贴和撤消)都被映射到现代的键盘绑定中(分别为 `Ctrl+C`、`Ctrl+X`、`Ctrl+V` 和 `Ctrl+Z`)。 + * `global-set-key` 函数,是 Emacs 编程的一部分,允许你定义自己的键盘快捷键。传统上,用户定义的快捷键以 `Ctrl+C` 开头,但没有什么能阻止你发明自己的方案。Emacs 并不敝帚自珍,欢迎你按照自己的意愿来扭转它。 + +### 学习 Emacs + +要想很好地使用 Emacs 是需要时间的。对我来说,这意味着打印出一张[速记表][6],每天都把它放在键盘旁边。当我忘了一个键组合时,我就在我的速记表上查找它。如果它不在我的速记表上,我就学习这个键盘组合,要么通过执行该函数,并注意 Emacs 告诉我如何更快地访问它,要么通过使用 `describe-function`: + +``` +M-x describe-function: save-buffer + +save-buffer is an interactive compiled Lisp function in ‘files.el’. + +It is bound to C-x C-s, <menu-bar> <file> <save-buffer>. +[...] +``` + +当你使用它的时候,你就会学习它。你对它了解得越多,你就越有能力去改进它,使它变成你自己的。 + +### 尝试 Emacs + +人们常开玩笑说 Emacs 是一个包含文本编辑器的操作系统。也许这是在暗示 Emacs 臃肿和过于复杂,当然也有一种说法是文本编辑器根据其默认配置不应该需要 `libpoppler`(你可以不需要它来编译 Emacs)。 + +但这个笑话背后潜藏着一个更大的真相,它揭示了 Emacs 如此有趣的原因。将 Emacs 与其他文本编辑器,如 Vim、Nano,甚至 [VSCodium][7] 进行比较是没有意义的,因为 Emacs 真正重要的部分并不是你可以在窗口中输入东西并保存的这种思路。那是连 Bash 都能提供的基本功能。Emacs 的真正意义在于它如何将控制置身于你的手中,以及如何通过 Emacs Lisp([Elisp][8])解决几乎任何问题。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/emacs + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/emoji-keyboard.jpg?itok=JplrSZ9c (Emoji keyboard) +[2]: https://en.wikipedia.org/wiki/Emacs +[3]: https://opensource.com/sites/default/files/tetris.png (Tetris in Emacs) +[4]: https://opensource.com/article/20/11/surprising-jupyter +[5]: https://opensource.com/article/19/1/productivity-tool-org-mode +[6]: https://opensource.com/downloads/emacs-cheat-sheet +[7]: https://opensource.com/article/20/6/open-source-alternatives-vs-code +[8]: https://www.gnu.org/software/emacs/manual/html_node/elisp/ diff --git a/published/202012/20201203 Download the 2020 Linux Foundation Annual Report.md b/published/202012/20201203 Download the 2020 Linux Foundation Annual Report.md new file mode 100644 index 0000000000..a7ecaa4c55 --- /dev/null +++ b/published/202012/20201203 Download the 2020 Linux Foundation Annual Report.md @@ -0,0 +1,73 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12889-1.html) +[#]: subject: (Download the 2020 Linux Foundation Annual Report) +[#]: via: (https://www.linux.com/news/download-the-2020-linux-foundation-annual-report/) +[#]: author: (The Linux Foundation https://www.linuxfoundation.org/blog/2020/12/download-the-2020-linux-foundation-annual-report/) + +下载 2020 年度 Linux 基金会年度报告 +====== + +![][1] + +2020 年对于 Linux 基金会Linux Foundation(LF)和我们托管的社区来说,是充满挑战的一年。在这次大流行期间,我们都看到我们和世界各地许多同事、朋友和家人的日常生活完全改变了。在我们的社区中,有太多的人也为失去家人和朋友而悲痛。 + +看到 LF 的成员加入到对抗 COVID-19 的斗争中,令人振奋。我们在世界各地的成员为科研人员贡献了技术资源,为挣扎中的家庭和个人提供了援助,为国家和国际努力做出了贡献,有些人甚至一起在 [LF 公共卫生][3] 下创建了开源项目,以帮助各国应对这场大流行病。 + +今年,我们的项目社区在继续发展,在许多开放技术领域、开放标准、开放数据和开放硬件方面都有新的举措。今年,我们迎接了 150 多个新社区加入 LF,包括 [FINOS 基金会][4],它是开源金融服务项目的保护项目。 + +我们的 [活动团队][5] 不得不进行了重大转型,在几周内,从面对面的活动转变为虚拟活动,参与者从不足 100 人到数万人不等。这些虚拟聚会帮助我们社区中的许多人在这个困难时期建立了联系。我们也学到了很多关于未来可能通过提供虚拟体验的混合亲身活动hybrid in-person events来提供更具包容性的体验。今年,我们很想念在我们的社区中见到的许多朋友,并期待着在安全的情况下再次见到你们。 + +我们的 [培训和认证][6] 团队能够帮助 170 多万名报名参加我们免费培训课程的人。我要祝贺今年获得 LF 认证的 4 万多人。 + +《[LF 的 2020 年度工作报告][7]》显示,尽管商业环境充满挑战,但经过培训和认证的开源专业人员仍有大有需求,并能轻松地展示其价值。 + +作为我们正在进行的多元化努力的一部分,在加入反对不平等的斗争中,我们的社区专注于该如何在项目中使用语言,并寻找导师来指导下一代的贡献者。我们的社区,如 Linux 内核团队和在北美 KubeCon 上发起的 [包容性命名倡议][8]Inclusive Naming Initiative,在加强我们的互动方式上取得了进展。 + +今年是我们联合发展基金会Joint Development Foundation(JDF)和开放标准社区open standards communities的突破性一年。我们迎来了六个建立开放标准的新项目。[JDF 还被批准为 ISO/IEC JTC 1 公开发布规范(PAS)提交者][9]。今年还标志着我们的第一个开放标准社区 OpenChain 通过 PAS 程序,被正式认可为国际标准。今天,Linux 基金会可以把我们的社区,从开源仓库带到一个公认的全球标准。 + +今年,我们生态系统中的许多人已经站出来帮助安全工作。一个新的社区 [开源安全基金会][10]Open Source Security Foundation(OpenSSF)启动了,以协调专注于提高开源软件安全性的努力。 + +当我们继续在美国与挑战作斗争时,[我们也重申 LF 是全球社区的一部分][11]。 + +我们的成员必须得应对国际贸易政策变化的一年,并了解到开放源码在政治上的蓬勃发展。来自世界各地的我们的成员社区参与了开放合作open collaboration,因为它是开放、中立和透明的。这些参与者显然希望继续与全球同行合作,以应对大大小小的挑战。 + +在这困难的一年结束时,所有这些都让我们确信,开放合作是解决世界上最复杂挑战的模式。没有任何一个人、组织或政府能够单独创造出我们解决最紧迫问题所需的技术。我们代表整个 Linux 基金会团队,期待着帮助您和我们的社区应对接下来的任何挑战。 + +![][12] + +Jim Zemlin,Linux 基金会执行总监 + +- [下载 Linux 基金会 2020 年度报告][2] + +这篇文章首先发布于 [Linux 基金会][14]。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/download-the-2020-linux-foundation-annual-report/ + +作者:[The Linux Foundation][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linuxfoundation.org/blog/2020/12/download-the-2020-linux-foundation-annual-report/ +[b]: https://github.com/lujun9972 +[1]: https://www.linuxfoundation.org/wp-content/uploads/2020/12/2020-Linux-Foundation-Annual-Report_blogheader.png +[2]: http://linuxfoundation.org/2020-annual-report +[3]: https://www.lfph.io/ +[4]: https://www.finos.org/ +[5]: https://events.linuxfoundation.org/ +[6]: https://training.linuxfoundation.org/ +[7]: https://training.linuxfoundation.org/resources/2020-open-source-jobs-report/ +[8]: https://inclusivenaming.org/ +[9]: https://www.linuxfoundation.org/blog/2020/05/joint-development-foundation-recognized-as-an-iso-iec-jtc-1-pas-submitter-and-submits-openchain-for-international-review/ +[10]: https://openssf.org/ +[11]: https://www.linuxfoundation.org/blog/2020/08/open-source-collaboration-is-a-global-endeavor/ +[12]: https://www.linuxfoundation.org/wp-content/uploads/2020/12/JimZemlin_Sig-150x150.png +[13]: https://www.linuxfoundation.org/blog/2020/12/download-the-2020-linux-foundation-annual-report/ +[14]: https://www.linuxfoundation.org/ diff --git a/published/202012/20201203 Get the most out of the Vi text editor.md b/published/202012/20201203 Get the most out of the Vi text editor.md new file mode 100644 index 0000000000..18fba6c81c --- /dev/null +++ b/published/202012/20201203 Get the most out of the Vi text editor.md @@ -0,0 +1,94 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12947-1.html) +[#]: subject: (Get the most out of the Vi text editor) +[#]: via: (https://opensource.com/article/20/12/vi-text-editor) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +初识 Vi 文本编辑器 +====== + +> Vi 是典型的 Unix 文本编辑器。来了解一下它或它的各种化身:Vim、Neovim、gVim、nvi 或 Elvis,它适用于 Linux、macOS、Windows 或 BSD。 + +![](https://img.linux.net.cn/data/attachment/album/202012/23/222122wc8resp5zpo2yrcm.jpg) + +不管你用的是 Vim、Neovim、gVim、nvi,甚至是 Elvis,其实都是这个典型的 Unix 编辑器 Vi。可能每一个 Linux 和 BSD 发行版中都包含了 Vi,Vi 是一个轻量级的简约型文本编辑器,由于其简单简洁的键盘快捷键和双模式设计,很多用户都喜欢它。 + +最初的 Vi 编辑器是由 [C shell][2] 的创建者 Bill Joy 编写的应用程序。现代 Vi 的化身已经[增加了许多功能][3],包括多级撤销、插入模式下更好的导航、行折叠、语法高亮、插件支持等等。Vim 被认为是它的最流行的现代实现,大多数人在提到 Vi 时实际上是指 Vim。 + +所有这些化身都是为了同一个目标,所以本文将从通用的场景来探讨 Vi。你的计算机上的版本可能略有不同,但你仍然可以从 Vi 编辑文本的方式中获益。 + +### 安装 Vi + +如果你运行的是 Linux、macOS 或 BSD,那么你已经安装了 `vi` 命令。如果你在 Windows 上,你可以[下载 Vim 和 gVim][4]。 + +![gVim][5] + +在 [NetBSD][7]上,nvi 是 Vi 的常见替代品,而 Slackware 则提供了 [Elvis][8](和 Vim),流行的 [Neovim][9] 复刻旨在帮助用户用 [Lua][10] 扩展 Vim。 + +### 启动 Vi + +在终端中用 `vi` 命令启动 Vi 或 Vim。如果在你的系统中没有找到 `.vimrc` 文件,那么 Vim 就会以 Vi 兼容模式启动(也可以用 `-C` 选项强制启动该模式)。如果你想使用 gVim 以拥有一个图形用户界面(GUI),你可以从桌面的应用程序菜单中启动它。 + +如果你是一个刚刚学习 Vi 的新用户,使用图形用户界面是一个很好的方法,可以在你可能期望的文本编辑器的行为和 Vi 的设计行为之间提供一个缓冲带。图形用户界面版本有一个菜单栏,一些鼠标集成,一个工具栏和其他功能,这可以帮助你找到你可能认为在典型的文本编辑器中理所当然的基本功能,但还不知道如何在 Vi 中做。 + +### 如何使用 Vi + +学习 Vi 最简单的方法可能是使用 `vimtutor`,这是一个与 Vim 打包在一起的交互式教程。要开始学习该教程,启动 `vimtutor` 并阅读说明,尝试每个练习。正如教程中所说,学好 Vi 不是记住什么键做什么,而是建立肌肉记忆,以在输入时调用常用的动作。 + +#### Esc 键 + +学习 Vi 的第一件重要的事就是掌握 `Esc` 键。`Esc` 是激活*命令模式*的工具,很快你就会明白,在 Vi 中,只要你不确定,就按 `Esc`。在命令模式下,你按下的任何键都不会被输入到你正在处理的文本文档中,而是被 Vi 解释为一条命令。例如,要将光标向左移动,你可以按键盘上的 `H` 键。如果你处于*插入*模式,那么按 `H` 键就会输入字母 H,就像你期望的那样。但在*命令*模式下,按 `H` 向左移动,`L` 向右移动,`J` 向下移动,`K` 向上移动。 + +命令模式和插入模式的分离与其他文本编辑器的工作方式形成了鲜明的对比,由于这种设计,这可能是 Vi 最显著的差异化。不过有趣的是,理论上来说,它与你可能已有的工作方式并没有太大的区别。毕竟,当你把手从键盘上拿开,用鼠标选择文本时,你基本上是将自己置于一种命令模式中。在 Vi 中,你不需要把手从键盘上移开来移动鼠标,也不需要按功能键或 `Ctrl` 键,而是将*编辑器*放入一种特殊的操作模式中,使你的按键重新分配到命令上,而不是文字输入。 + +#### 扩展 Vi + +在 Vim 8.0 版本之前,Vi 在很大程度上“只是”一个文本编辑器。它有插件,但安装插件是一个手动的过程,很多用户从未想过要这么做。幸运的是,Vim 8 及以上版本提供了对插件管理的支持,使得安装和加载插件变得轻而易举。 + +安装 Vim 的插件可以通过 `vim-plug` 功能来完成。例如,要安装 Vi 文件浏览器 [NERDTree][11]: + +``` +:PlugInstall NERDTree +``` + +你也可以更新插件: + +``` +:PlugUpdate NERDTree +``` + +关于使用 `vim-plug` 和手动安装插件和主题的更多信息,请阅读我的文章《[如何安装 Vim 插件][12]》。 + +### 默认 Vi + +Vi 不仅仅流行,它还是一个 [POSIX][13] 标准。它是每个系统管理员都应该知道如何使用的应用程序,即使他们不打算每天使用它。它也是一个快速而简单的编辑器,所以一旦你熟练掌握了它,它可能就是你一直在寻找的编辑器。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/vi-text-editor + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating) +[2]: https://opensource.com/article/20/8/tcsh +[3]: https://vimhelp.org/vi_diff.txt.html#vi-differences +[4]: https://www.vim.org/download.php +[5]: https://opensource.com/sites/default/files/uploads/gvim.jpg (gVim) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/article/19/3/netbsd-raspberry-pi +[8]: https://github.com/mbert/elvis +[9]: http://neovim.io +[10]: https://opensource.com/article/20/2/lua-cheat-sheet +[11]: https://www.vim.org/scripts/script.php?script_id=1658 +[12]: https://opensource.com/article/20/2/how-install-vim-plugins +[13]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains diff --git a/published/202012/20201205 Why 2020 is the best time to use the Kate text editor.md b/published/202012/20201205 Why 2020 is the best time to use the Kate text editor.md new file mode 100644 index 0000000000..1cabfff470 --- /dev/null +++ b/published/202012/20201205 Why 2020 is the best time to use the Kate text editor.md @@ -0,0 +1,69 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12928-1.html) +[#]: subject: (Why 2020 is the best time to use the Kate text editor) +[#]: via: (https://opensource.com/article/20/12/kate-text-editor) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +为什么 2020 年是使用 Kate 文本编辑器的最佳时机? +====== + +> 了解更多关于长期受喜爱的文本编辑器的信息,它为每个用户提供了一些东西。 + +![](https://img.linux.net.cn/data/attachment/album/202012/17/133952wga2azisy8uy1ajz.jpg) + +KDE Plasma 桌面提供了很多东西:一个很棒的桌面、一个灵活的文件管理器,以及紧密集成的应用。然而,人们很容易忽视它的默认文本编辑器,其中之一就是 [Kate][2]。2020 年 12 月 14 日,[Kate 将迎来 20 岁生日][3],在其 20 年的发展历程中,它在一个简单明了的编辑器和一个适度的集成开发环境 (IDE) 之间取得了完美的平衡。 + +### 安装 Kate + +如果你正在运行 KDE Plasma 桌面,你可能已经安装了 Kate。如果还没有安装,不管你运行的是哪个桌面,你都可以在你的软件仓库中找到它。 + +另外,[你可以在 Linux 或 Chromebook 上从][4] [Flathub.org][5] 使用 Flatpak 安装 Kate。 + +在 Windows 上,[你可以从 Windows 商店获得 Kate][6]。 + +要在 macOS 上安装它,[从 KDE build 网站下载 macOS 版本][7]。 + +### 所有的功能 + +第一眼,Kate 似乎并不显眼。它看起来就像其他的文本编辑器一样:一个巨大的空白窗口,可以接受大量的输入,顶部有一个菜单栏,边缘有一些元数据来指示字符编码和行数。但当你开始使用它的那一刻,你会发现它拥有你所需要的所有功能,就在你想要的地方。 + +例如,沿着 Kate 窗口的左侧是行数,默认情况下是启用的。更好的是,当你输入常用的编码语言或标记语法时,代码折叠就会被激活。窗口右侧的文件导航面板可以快速、直观地访问文件的不同部分。而窗口底部则包含了常用模式设置,包括插入或覆盖、字符编码(如 UTF-8)和语法高亮。 + +![Kate][8] + +不过,这还不是全部。听起来可能有很多,但布局很方便,很直观。在菜单和设置中还有更多的功能。 + +Kate 的功能有集成 Git、文件浏览器、shell、打开文档或项目的面板、单词补全、XML 补全、标签式界面、分屏和插件结构,因此你可以进一步扩展其功能。 + +### 给所有用户使用的编辑器 + +Kate 的极强灵活性使它既是一个简单的文本编辑器,又是一个强大的 IDE。通过默认使用的熟悉的界面,它吸引了广大的用户;而通过提供与调试器、编译器和代码检查器集成的能力,它吸引了开发人员。 + +因为它允许用户控制它的 UI 布局,Kate 确保每个用户都能优化使用它的体验。传统上,这一直是一个难以平衡的问题:一个拥有太多功能的编辑器给人的感觉太像一个臃肿的 IDE,而一个界面简单、功能模糊的编辑器给人的感觉是基础的或不方便的。Kate 将真正有用的功能放在了 UI 的最前面,从而让每个人都能享受到,同时又让高级功能可以被发现,但又不碍事。 + +坦率地说,Kate 让人难以割舍。它使用起来很愉快,配置起来很简单,探索起来也很有趣。今天就安装 Kate 吧,试一试它。它在所有主要的平台上都可以使用,你没有什么理由不选择 Kate 作为你的新宠编辑器。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/kate-text-editor + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_code_keyboard_orange_hands.png?itok=G6tJ_64Y (Programming at a browser, orange hands) +[2]: http://kate-editor.org +[3]: https://kate-editor.org/post/2020/2020-11-08-kate-is-soon-20-years-old/ +[4]: https://flathub.org/apps/details/org.kde.kate +[5]: http://Flathub.org +[6]: https://www.microsoft.com/en-nz/p/kate/9nwmw7bb59hw?rtc=1&activetab=pivot:overviewtab +[7]: https://binary-factory.kde.org/view/MacOS/job/Kate_Release_macos/ +[8]: https://opensource.com/sites/default/files/kate.jpg (Kate) diff --git a/published/202012/20201206 Experience the useful features of the Xedit text editor.md b/published/202012/20201206 Experience the useful features of the Xedit text editor.md new file mode 100644 index 0000000000..c0c21ff7ca --- /dev/null +++ b/published/202012/20201206 Experience the useful features of the Xedit text editor.md @@ -0,0 +1,109 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12930-1.html) +[#]: subject: (Experience the useful features of the Xedit text editor) +[#]: via: (https://opensource.com/article/20/12/xedit) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +体验 Xedit 文本编辑器的实用功能 +====== + +> Xedit 是 X11 图形服务器的一部分,它不算好看,但却有足够的隐藏功能,使它成为一个严肃的文本编辑器。 + +![](https://img.linux.net.cn/data/attachment/album/202012/18/075942uzhgjgxfxve7p2ot.jpg) + +X11 图形服务器由 [X.org][2] 发布,它有一些象征性的应用来展示如何使用它提供的工具进行编程。这些应用包括从 [TWM][3] 桌面到愚蠢但催眠的 Xeyes。它还包括一个名为 Xedit 的文本编辑器,它是一个看似简单的应用,却有足够的隐藏功能,使其成为一个严肃的编辑器。 + +### 安装 Xedit + +如果你使用的是 Linux 或 BSD,你可以从你的发行版软件仓库或 ports 树中安装 Xedit。它有时会出现在一个名为 X11-apps 的软件包中,与其他 X11 应用捆绑在一起。 + +在 macOS 上,你可以安装 [XQuartz][4],它提供了 Xedit、Xeyes 和其他一些小程序(以及一个 X11 图形服务器)。 + +### 启动 Xedit + +如果它被列在你的应用菜单的话,你可以从中启动 Xedit。尽管它绝对是一个 GUI 应用,但有些发行版将它视为命令而不是 GUI 应用,所以它可能不会被列在应用菜单中。这时,你可以从终端启动 Xedit。如果你输入 `xedit &` 来启动应用,它就会启动一个空的 Xedit 编辑器,可以随时输入。如果你在输入启动命令的同时输入一个现有的文件名,Xedit 启动时会将文件加载到缓冲区。 + +``` +$ xedit example.txt & +``` + +![Xedit][5] + +### 加载文件 + +在打开的 Xedit 实例中,你可以在顶部文本输入框中输入文件的路径来加载文件。点击 **Load** 按钮(在文本输入框的左边),将文件读入 Xedit 窗口。 + +![Load Xedit][7] + +你可以同时打开多个文件。当一个文件被加载时,它将获取焦点并出现在你的主 Xedit 缓冲区(主窗口中的大文本输入框),并将任何现有的文件切换到一个隐藏的缓冲区。 + +你可以使用组合键在缓冲区之间切换,这对 Emacs 用户而言很熟悉,但对其他用户会感到困惑。首先,按下 `Ctrl+X`。放开然后按 `Ctrl+B`。 + +### 组合键 + +一开始执行需要连续*两*个键盘快捷键的操作感觉很奇怪,但过了一段时间,你就会习惯。事实上,作为一个经常使用 Emacs 的用户,我发现复合键组合很有节奏感。我很惊讶也很高兴地发现,我最喜欢的一些快捷键在 Xedit 中也有效。 + +原来,Xedit 从几个灵感来源借用了键盘快捷键。如果你是 Emacs 用户,你会发现最常见的组合在 Xedit 中有效。例如,`C-x C-f` (即 `Ctrl+X` 后是 `Ctrl+F`)可以回到顶部的文本输入框来加载文件,而 `C-x C-s`(`Ctrl+X` 后是 `Ctrl+S`)可以保存文件。令人惊讶的是,`C-x 3` 甚至可以垂直分割窗口,而 `C-x 2` 则可以水平分割,`C-x 0` 或 `C-x 1` 则可以移除分割。 + +Emacs 或 Bash 用户熟悉的编辑命令也适用: + + * `Ctrl+A` 移动到行首。 + * `Ctrl+E` 移至行尾。 + * `Alt+B` 向后移动一个单词。 + * `Ctrl+B` 向后移动一个字符。 + * `Ctrl+F` 向前移动一个字符。 + * `Alt+F` 向前移动一个单词。 + * `Ctrl+D 删除下一个字符。 + +还有更多,它们都在 Xedit 手册页面上列出。 + +### 使用行编辑模式 + +Xedit 还含有一个类似 `ex` 的行编辑器,这对 [Vi][8] 和 `ed` 甚至 `sed` 用户应该很熟悉。要进入行编辑模式,按下 `Esc` 键。这将使你处于顶部的文本输入框,但处于命令模式。编辑命令使用的语法是:*行号*后面跟着一个*命令*和*参数*。 + +比如说你有这个文本文件: + +``` +ed is the standard Unix text editor. +This is line number two. +``` + +你决定将第 1 行的 `ed` 改为 `Xedit`。在 Xedit 中,移动到第 1 行,按下 `Esc`,然后输入 `.,s/ed/Xedit/`。 + +``` +Xedit is the standard Unix text editor. +This is line number two. +``` + +不用将光标移到下一行,你可以将 `two` 改为 `the second`。按下 `Esc`,然后输入 `2,s/two/the second/`。 + +各种命令和有效的参数在 Xedit 的手册页中列出。 + +### 简单但稳定 + +Xedit 并不算好看,它很简单,没有菜单可言,但它借鉴了一些最好的 Unix 编辑器的流行的便利性。下次你在寻找新的编辑器时,不妨试试 Xedit。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/xedit + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://www.x.org/wiki/ +[3]: https://opensource.com/article/19/12/twm-linux-desktop +[4]: http://xquartz.org +[5]: https://opensource.com/sites/default/files/uploads/xedit.jpeg (Xedit) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/xedit-load.jpg (Load Xedit) +[8]: https://opensource.com/article/20/12/vi-text-editor diff --git a/published/202012/20201207 Add storage to your Fedora system with LVM.md b/published/202012/20201207 Add storage to your Fedora system with LVM.md new file mode 100644 index 0000000000..9026ead2e4 --- /dev/null +++ b/published/202012/20201207 Add storage to your Fedora system with LVM.md @@ -0,0 +1,272 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12936-1.html) +[#]: subject: (Add storage to your Fedora system with LVM) +[#]: via: (https://fedoramagazine.org/add-storage-to-your-fedora-system-with-lvm/) +[#]: author: (Tim Bosse https://fedoramagazine.org/author/maztaim/) + +使用 LVM 为你的 Fedora 系统添加存储 +====== + +![][1] + +有时需要在系统中添加另一块磁盘。这就是逻辑卷管理Logical Volume Management(LVM)的用武之地。LVM 的好处之处在于它相当灵活。有几种方法可以添加一块磁盘。这篇文章介绍了一种方法。 + +### 注意! + +这篇文章并不包括将新的磁盘物理地安装到系统中的过程。请查阅你的系统和磁盘文档,了解如何正确地进行安装。 + +**重要:** 一定要确保你已经备份重要数据。如果新磁盘已有数据,那么本文中描述的步骤将破坏数据。 + +### 最好了解 + +本文并没有深入介绍 LVM 的每一个功能,重点是添加磁盘。但基本上你要了解,LVM 有卷组volume group(VG),它由一个或多个分区和/或磁盘组成。你把这些分区或磁盘以物理卷physical volume(PV)的方式添加到卷组。一个卷组可以分成许多逻辑卷logical volume(LV)。逻辑卷可以作为文件系统、ramdisk 等其他存储使用。更多信息可以在[这里][2]中找到。 + +可以看作是,把物理卷形成一个存储池(一个卷组),然后从这个存储池中划分出逻辑卷,供你的系统直接使用。 + +### 准备 + +确保你能看到你要添加的磁盘。在添加磁盘之前使用 `lsblk` 查看哪些存储空间已经可用或正在使用。 + +``` +$ lsblk +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +zram0 251:0 0 989M 0 disk [SWAP] +vda 252:0 0 20G 0 disk +├─vda1 252:1 0 1G 0 part /boot +└─vda2 252:2 0 19G 0 part +└─fedora_fedora-root 253:0 0 19G 0 lvm / +``` + +本文使用的是带有虚拟存储的虚拟机,因此设备名称以 `vda` 开头代表第一个磁盘,`vdb` 代表第二个磁盘,以此类推。你的设备名称可能不同。许多系统会将 `sda` 作为第一个物理磁盘,`sdb` 代表第二个磁盘,以此类推。 + +当已连接新磁盘,并且你的系统已备份且正在运行,再次使用 `lsblk` 来查看新的块设备。 + +``` +$ lsblk +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +zram0 251:0 0 989M 0 disk [SWAP] +vda 252:0 0 20G 0 disk +├─vda1 252:1 0 1G 0 part /boot +└─vda2 252:2 0 19G 0 part +└─fedora_fedora-root 253:0 0 19G 0 lvm / +vdb 252:16 0 10G 0 disk +``` + +现在有一个名为 `vdb` 的新设备。该设备的位置是 `/dev/vdb`。 + +``` +$ ls -l /dev/vdb +brw-rw----. 1 root disk 252, 16 Nov 24 12:56 /dev/vdb +``` + +我们可以看到磁盘,但我们还不能用 LVM 来使用它。如果你运行 `blkid`,你应该不会看到它被列出。对于这个和之后的命令,你需要确保你的系统[已配置好,这样你可以使用 sudo][3]: + +``` +$ sudo blkid +/dev/vda1: UUID="4847cb4d-6666-47e3-9e3b-12d83b2d2448" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="830679b8-01" +/dev/vda2: UUID="k5eWpP-6MXw-foh5-Vbgg-JMZ1-VEf9-ARaGNd" TYPE="LVM2_member" PARTUUID="830679b8-02" +/dev/mapper/fedora_fedora-root: UUID="f8ab802f-8c5f-4766-af33-90e78573f3cc" BLOCK_SIZE="4096" TYPE="ext4" +/dev/zram0: UUID="fc6d7a48-2bd5-4066-9bcf-f062b61f6a60" TYPE="swap" +``` + +### 将磁盘添加到 LVM 中 + +使用 `pvcreate` 初始化磁盘。你需要传递设备的完整路径。在这个例子中,它是 `/dev/vdb`。在你的系统中,它可能是 `/dev/sdb` 或其他设备名。 + +``` +$ sudo pvcreate /dev/vdb +Physical volume "/dev/vdb" successfully created. +``` + +当你运行 `blkid` 时,你应该看到磁盘已经被初始化为一个 `LVM2_member`: + +``` +$ sudo blkid +/dev/vda1: UUID="4847cb4d-6666-47e3-9e3b-12d83b2d2448" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="830679b8-01" +/dev/vda2: UUID="k5eWpP-6MXw-foh5-Vbgg-JMZ1-VEf9-ARaGNd" TYPE="LVM2_member" PARTUUID="830679b8-02" +/dev/mapper/fedora_fedora-root: UUID="f8ab802f-8c5f-4766-af33-90e78573f3cc" BLOCK_SIZE="4096" TYPE="ext4" +/dev/zram0: UUID="fc6d7a48-2bd5-4066-9bcf-f062b61f6a60" TYPE="swap" +/dev/vdb: UUID="4uUUuI-lMQY-WyS5-lo0W-lqjW-Qvqw-RqeroE" TYPE="LVM2_member" +``` + +你可以使用 `pvs` 列出当前所有可用的物理卷: + +``` +$ sudo pvs +PV VG Fmt Attr PSize PFree +/dev/vda2 fedora_fedora lvm2 a-- <19.00g 0 +/dev/vdb lvm2 --- 10.00g 10.00g +``` + +`/dev/vdb` 被列为一个 PV (物理卷),但还没有分配到一个 VG (卷组)。 + +### 将物理卷添加到一个卷组 + +你可以使用 `vgs` 找到可用的卷组列表: + +``` +$ sudo vgs +VG #PV #LV #SN Attr VSize VFree +fedora_fedora 1 1 0 wz--n- 19.00g 0 +``` + +在本例中,只有一个卷组可用。接下来,将物理卷添加到 `fedora_fedora`: + +``` +$ sudo vgextend fedora_fedora /dev/vdb +Volume group "fedora_fedora" successfully extended +``` + +你现在应该看到物理卷已被添加到卷组中: + +``` +$ sudo pvs +PV VG Fmt Attr PSize PFree +/dev/vda2 fedora_fedora lvm2 a– <19.00g 0 +/dev/vdb fedora_fedora lvm2 a– <10.00g <10.00g +``` + +看一下卷组: + +``` +$ sudo vgs +VG #PV #LV #SN Attr VSize VFree +fedora_fedora 2 1 0 wz–n- 28.99g <10.00g +``` + +你也可以获得具体卷组和物理卷的详细列表: + +``` +$ sudo vgdisplay fedora_fedora +--- Volume group --- +VG Name fedora_fedora +System ID +Format lvm2 +Metadata Areas 2 +Metadata Sequence No 3 +VG Access read/write +VG Status resizable +MAX LV 0 +Cur LV 1 +Open LV 1 +Max PV 0 +Cur PV 2 +Act PV 2 +VG Size 28.99 GiB +PE Size 4.00 MiB +Total PE 7422 +Alloc PE / Size 4863 / 19.00 GiB +Free PE / Size 2559 / 10.00 GiB +VG UUID C5dL2s-dirA-SQ15-TfQU-T3yt-l83E-oI6pkp +``` + +看下物理卷: + +``` +$ sudo pvdisplay /dev/vdb +--- Physical volume --- +PV Name /dev/vdb +VG Name fedora_fedora +PV Size 10.00 GiB / not usable 4.00 MiB +Allocatable yes +PE Size 4.00 MiB +Total PE 2559 +Free PE 2559 +Allocated PE 0 +PV UUID 4uUUuI-lMQY-WyS5-lo0W-lqjW-Qvqw-RqeroE +``` + +现在我们已经添加了磁盘,我们可以为逻辑卷 (LV) 分配空间: + +``` +$ sudo lvs +LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert +root fedora_fedora -wi-ao---- 19.00g +``` + +看一下逻辑卷。下面是详细的逻辑卷信息: + +``` +$ sudo lvdisplay fedora_fedora/root +--- Logical volume --- +LV Path /dev/fedora_fedora/root +LV Name root +VG Name fedora_fedora +LV UUID yqc9cw-AvOw-G1Ni-bCT3-3HAa-qnw3-qUSHGM +LV Write Access read/write +LV Creation host, time fedora, 2020-11-24 11:44:36 -0500 +LV Status available +LV Size 19.00 GiB +Current LE 4863 +Segments 1 +Allocation inherit +Read ahead sectors auto +- currently set to 256 +Block device 253:0 +``` + +查看根文件系统(`/`)的大小,并将它与逻辑卷大小进行比较。 + +``` +$ df -h / +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/fedora_fedora-root 19G 1.4G 17G 8% / +``` + +逻辑卷和文件系统大小都为 19G。让我们给根逻辑卷(`root`)增加 5G。 + +``` +$ sudo lvresize -L +5G fedora_fedora/root +Size of logical volume fedora_fedora/root changed from 19.00 GiB (4863 extents) to 24.00 GiB (6143 extents). +Logical volume fedora_fedora/root successfully resized. +``` + +我们现在有 24G 的逻辑卷可用。看看根文件系统(`/`)。 + +``` +$ df -h / +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/fedora_fedora-root 19G 1.4G 17G 8% / +``` + +我们仍然显示只有 19G 的空闲空间,这是因为逻辑卷与文件系统不一样。要使用增加到逻辑卷的新空间,请调整文件系统的大小。 + +``` +$ sudo resize2fs /dev/fedora_fedora/root +resize2fs 1.45.6 (20-Mar-2020) +Filesystem at /dev/fedora_fedora/root is mounted on /; on-line resizing required +old_desc_blocks = 3, new_desc_blocks = 3 +The filesystem on /dev/fedora_fedora/root is now 6290432 (4k) blocks long. +``` + +看看文件系统的大小。 + +``` +$ df -h / +Filesystem Size Used Avail Use% Mounted on +/dev/mapper/fedora_fedora-root 24G 1.4G 21G 7% / +``` + +正如你所看到的,根文件系统(`/`)已经占用了逻辑卷上的所有可用空间,而且不需要重新启动。 + +现在你已经将一个磁盘初始化为物理卷,并使用新的物理卷扩展了卷组。之后,你增加了逻辑卷的大小,并调整了文件系统的大小,以使用逻辑卷的新空间。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/add-storage-to-your-fedora-system-with-lvm/ + +作者:[Tim Bosse][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/maztaim/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/lvm-add-disk-816x345.jpg +[2]: https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) +[3]: https://fedoramagazine.org/howto-use-sudo/ \ No newline at end of file diff --git a/published/202012/20201207 Optimize your GNOME experience with the Gedit text editor.md b/published/202012/20201207 Optimize your GNOME experience with the Gedit text editor.md new file mode 100644 index 0000000000..23b7bfe389 --- /dev/null +++ b/published/202012/20201207 Optimize your GNOME experience with the Gedit text editor.md @@ -0,0 +1,70 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12933-1.html) +[#]: subject: (Optimize your GNOME experience with the Gedit text editor) +[#]: via: (https://opensource.com/article/20/12/gedit) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 gedit 文本编辑器优化你的 GNOME 体验 +====== + +> 它是一个可以完成工作的简约编辑器,并以隐藏的增强功能使得事情更简单。 + +![](https://img.linux.net.cn/data/attachment/album/202012/19/110419snchihpnjn8juxqc.jpg) + +作为默认的文本编辑器是一项吃力不讨好的工作。人们通常把默认文本编辑器几乎看作是一个演示应用、一个稍微好一点的 “hello World” 示例,说明应用在该平台上的是如何运行的。在极少数情况下,当用户需要将一些文本保存到一个可能永远不会再看的文件中时,用户会找到默认文本编辑器。对于“严肃”的工作,他们会转向文字处理器或 IDE,或终端中的编辑器,或者至少是一个不同的文本编辑器,必须像“真正的”应用一样下载和安装。 + +很奇怪,默认的文本编辑器很难被人重视,然而 GNOME 桌面的编辑器 gedit 却被广泛认为是一个真正有价值的文本编辑器,超越了它所在的桌面。它被用作网页设计课程的必备文本编辑器,是新手开发者和系统管理员的推荐工具,也是许多桌面 Linux 用户最喜欢的可靠伙伴。 + +### 安装 gedit + +如果你运行的是 GNOME 桌面,你可能已经安装了 gedit,尽管它可能只作为“文本编辑器”出现在你的应用菜单中。如果你不确定,只需在你的活动界面中输入 `gedit`,然后在打开的文本编辑器中进入 “About” 菜单项。 + +![gedit terminal box with black background and white letters][2] + +在 Windows 上,你可以[从微软商店下载并安装 gedit][3]。 + +在 Mac 上,你可以[使用 Homebrew][4]或 [MacPorts][5] 安装 gedit。 + +### 使用 gedit + +当你第一次启动 gedit 时,你会看到一个简约的界面,包括一个文本输入面板、一个标题栏和一个位于窗口底部的状态面板。底部的状态面板提供了一些常用的设置:你想使用哪种语法高亮模式、你喜欢的制表符宽度、以及一些流行的偏好,如行号、文本换行等等。这些选项中的大部分也可以在 “Preferences” 菜单中进行全局设置,它可在应用程序右上角的 “汉堡” 样式的菜单中找到。 + +### gedit 的隐藏功能 + +从表面上看,gedit 正是它所标榜的那样:一个不起眼的文本编辑器,它不会妨碍你的工作,因此你可以在屏幕上的框中输入字母。但是,这个简单的文本编辑器却隐藏着一些你可能不知道的令人兴奋的功能,即使你已经使用它多年。 + +这些键盘功能在 gedit 中并没有被记录下来: + + * `Ctrl+D` 删除当前行。这对于编码者或以标记格式(如 Asciidoc、reST 或 CommonMark)写作的人特别有用。 + * `Ctrl+I` 会弹出 “Go to Line” 下拉框。输入一个数字,你就会立即跳到该行。 + * `Alt+向上箭头` 或 `Alt+向下箭头` 会抓取当前行,并将它在文档中向上或向下移动。 + * `Alt+向左箭头` 或 `Alt+向右箭头` 抓取最近的单词(在光标左侧)并将其向左或向右移动。 + * 要输入特殊的 Unicode 字符,请按下 `Shift+Ctrl+U` 并松开,然后输入 Unicode 字符代码。你通常必须查找字符代码(除非你已经记住了一些,但谁有记性来记住这些字符代码?)例如,要打出一只企鹅,按下 `Shift+Ctrl+U` 然后松开。当你松开按键后,你会看到一个带下划线的 U,然后输入 `1F427`,后面跟一个空格,你的 Unicode 字符就会变成一个友好的 `🐧`。诚然,这并不完全是 gedit 所独有的,但这是个很有用的技巧,而且它在 gedit 中也确实有效。 + +### 稳定简单 + +Gedit 很像 GNOME 本身。它客观上比许多同类软件(比如 KDE 的 Kate)更简单,但它仍然能够满足你日常 80% 或 90% 的期望。 + +当然,可能会有一些任务 gedit 不是最佳工具。你可能会发现自己要深入研究一些独特的日志文件,或者需要一个精确的解析器或代码检查器,你会转向专门的应用。这没关系。gedit 并不意味着对所有用户都适用。但对于那些需要文本编辑器的人来说,它是一个很好的文本编辑器,有时这就是所需要的。在 Linux 或者在任何你正在使用的平台上,试一下 gedit,因为它很有可能是一个比默认应用的更好的选择。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/gedit + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://opensource.com/sites/default/files/uploads/gedit-31_days_gedit-opensource.jpg (gedit terminal box with black background and white letters) +[3]: https://www.microsoft.com/en-nz/p/gedit +[4]: https://opensource.com/article/20/6/homebrew-mac +[5]: https://opensource.com/article/20/11/macports diff --git a/published/202012/20201208 Learn Bash by writing an interactive game.md b/published/202012/20201208 Learn Bash by writing an interactive game.md new file mode 100644 index 0000000000..9256415ebd --- /dev/null +++ b/published/202012/20201208 Learn Bash by writing an interactive game.md @@ -0,0 +1,123 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12962-1.html) +[#]: subject: (Learn Bash by writing an interactive game) +[#]: via: (https://opensource.com/article/20/12/learn-bash) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +通过编写互动游戏学习 Bash +====== + +> 编程一个简单的游戏是练习一门新语言并与其他你掌握的语言进行比较的好方法。 + +![](https://img.linux.net.cn/data/attachment/album/202012/28/010432yq3vgsqtiol9zzi6.jpg) + +学习一门新的编程语言是很有趣的。每当我尝试学习一门新的语言时,我都会专注于定义变量、编写语句和评估表达式。一旦我对这些概念有了大致的了解,我通常可以自己弄清楚其余的概念。大多数编程语言都有一些相似之处,所以一旦你了解了一种编程语言,学习下一种编程语言就是要弄清楚其独特的细节,认识到其中的差异。 + +为了帮助我练习一种新的编程语言,我喜欢写一些测试程序。我经常写的一个示例程序是一个简单的“猜数字”程序,电脑在 1 到 100 之间选一个数字,让我猜这个数字。程序会一直循环,直到我猜对为止。 + +“猜数字”程序锻炼了编程语言中的几个概念:如何给变量赋值,如何写语句,如何进行条件判断和循环。对于学习一门新的编程语言来说,这是一个很好的实践实验。 + +### 用 Bash 猜数字 + +[Bash][2] 是大多数 Linux 系统的标准 shell。除了提供丰富的命令行用户界面外,Bash 还以*脚本*的形式支持完整的编程语言。 + +如果你对 Bash 不熟悉,我推荐你看这些介绍: + + * [什么是 Bash?][3]。 + * [开始使用 Bash 编程][4] + * [系统管理员的 Bash 脚本入门][5] + * [如何在 Bash 中编写函数][6] + * [阅读更多关于 Bash 的信息][7] + +你可以通过编写一个 Bash 版本的“猜数字”游戏来探索它。这是我的实现: + +``` +#!/bin/bash + +number=$(( $RANDOM % 100 + 1 )) + +echo "Guess a number between 1 and 100" + +guess=0 + +while [ "0$guess" -ne $number ] ; do + read guess + [ "0$guess" -lt $number ] && echo "Too low" + [ "0$guess" -gt $number ] && echo "Too high" +done + +echo "That's right!" +exit 0 +``` + +### 拆解这个脚本 + +脚本中的第一行,`#!/bin/bash` 告诉 Linux 使用 Bash shell 来运行这个脚本。每个脚本都以 `#!` 字符对(LCTT 译注:释伴)开始,这表示它是一个 shell 脚本。紧跟在`#!` 后面的是要运行的 shell。在本例中,`/bin/bash` 是指 Bash shell。 + +要给一个变量赋值,在变量名后面列出 `=` 号。例如,语句 `guess=0` 给 `guess` 变量分配一个零值。 + +你也可以使用 `read` 语句提示用户输入一个值。如果你写了 `read guess` 语句,Bash 会等待用户输入一些文本,然后把这个值存储在 `guess` 变量中。 + +要引用一个变量的值,在变量名前使用 `$`。所以, 在 `guess` 变量中存储了一个值后, 你可以使用 `$guess` 来检索它。 + +你可以使用任何你喜欢的变量名称,但是 Bash 为自己保留了一些特殊的变量名称。一个特殊的变量是 `RANDOM`,每次引用它都会产生一个很大的随机数。 + +如果你想在存储一个值的同时执行一个操作,你需要用特殊的括号把语句括起来。这将告诉 Bash 先执行该语句,而 `=` 则将结果值存储在变量中。要评估一个数学表达式,使用 `$(())` 围在你的语句上。双括号表示一个*算术表达式*。在我的例子中,`number=$(( $RANDOM % 100 + 1 ))` 评估表达式 `$RANDOM % 100 + 1`,然后将值存储在 `number` 变量中。 + +标准的算术运算符,如 `+`(加)、`-`(减)、`*`(乘)、`/`(除)和 `%`(模)都适用。 + +这意味着语句 `number=$(( $RANDOM % 100 + 1 ))` 产生一个 1 到 100 之间的随机数。模数运算符(`%`)返回两个数相除后的余数。在这种情况下,Bash 将一个随机数除以 100,剩下的余数范围是 0 到 99,通过在这个值上加 1,你可以得到一个介于 1 和 100 之间的随机数。 + +Bash 支持像循环这样的*条件表达式*和*流程控制*。在“猜数字”的游戏中,只要 `guess` 中的值不等于 `number`,Bash 就会继续循环。如果猜的数小于随机数,Bash 就会打印“太低”,如果猜的数大于数字,Bash 就会打印“太高”。 + +### 它是如何工作的 + +现在你已经写好了你的 Bash 脚本,你可以运行它来玩“猜数字”游戏。一直猜,直到你找到正确的数字: + +``` +Guess a number between 1 and 100 +50 +Too high +30 +Too high +20 +Too high +10 +Too low +15 +Too high +13 +Too low +14 +That's right! +``` + +每次运行这个脚本,Bash 都会随机选择一个不同的数字。 + +这个“猜数字”游戏是学习新的编程语言时的一个很好的入门程序,因为它以一种很直接的方式锻炼了几个常见的编程概念。通过在不同的编程语言中实现这个简单的游戏,你可以展示一些核心概念,并比较每种语言的细节。 + +你有喜欢的编程语言吗?你会如何用它来写“猜数字”游戏呢?请关注本系列文章,看看你可能感兴趣的其他编程语言的例子。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/learn-bash + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) +[2]: https://en.wikipedia.org/wiki/Bash_(Unix_shell) +[3]: https://opensource.com/resources/what-bash +[4]: https://opensource.com/article/20/4/bash-programming-guide +[5]: https://opensource.com/article/20/4/bash-sysadmins-ebook +[6]: https://opensource.com/article/20/6/bash-functions +[7]: https://opensource.com/tags/bash diff --git a/published/202012/20201209 How to Pretty Print JSON File in Linux Terminal.md b/published/202012/20201209 How to Pretty Print JSON File in Linux Terminal.md new file mode 100644 index 0000000000..1a9743ea6d --- /dev/null +++ b/published/202012/20201209 How to Pretty Print JSON File in Linux Terminal.md @@ -0,0 +1,116 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12915-1.html) +[#]: subject: (How to Pretty Print JSON File in Linux Terminal) +[#]: via: (https://itsfoss.com/pretty-print-json-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Linux 终端上漂亮地打印 JSON 文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/13/122331h00a3hc63ttoc630.jpg) + +[JSON][1] 文件非常棒,因为它们以人类可读的格式存储数据集合。然而,如果 JSON 文件被最小化过,那么阅读 JSON 文件可能会很痛苦。 + +以这个为例: + +![Minified JSON is difficult to read][2] + +计算机可以很容易地读取它。即使是人也能读,但如果 JSON 文件以合适的格式显示,那么阅读就会简单很多。我的意思是 JSON 文件应该是这样读的: + +![Pretty Printed JSON is easier to read][3] + +你可以使用大多数的文本编辑器和一些插件以合适的格式显示它。然而,如果你在终端中,或者你想在你的 shell 脚本中这么做,事情会有所不同。 + +如果你有一个已最小化过的 JSON 文件,让我来告诉你如何在 Linux 终端中漂亮地输出它。 + +### 在 Linux 中用 jq 命令漂亮地打印 JSON 文件 + +[jq][4] 是一个命令行 JSON 处理器。你可以用它来切分、过滤、映射和转换结构化数据。我在这里不打算详细介绍 `jq` 命令行工具的使用。 + +要使用 `jq`,你需要先安装它。你可以使用你的[发行版的包管理器][5]来安装它。如果启用了 [universe 仓库][6],你可以使用 `apt` 命令在 Ubuntu 上安装它: + +``` +sudo apt install jq +``` + +安装好后,用下面的方法在显示屏上漂亮地打印 JSON 文件: + +``` +jq . sample.json +``` + +![Pretty printed JSON file][7] + +你可能也想用 `cat`,但我认为 `cat` 在这里没用。 + +``` +cat sample.json | jq +``` + +请记住,上述命令不会影响原始 JSON 文件。不会向它写入任何更改。 + +你可能已经知道[如何在 Linux 中把命令输出重定向到一个文件][8]。你可能也知道不能重定向到同一个文件,而且 `tee` 命令也不能保证一直有效。 + +如果你想用漂亮的格式修改原来的 JSON 文件,可以把解析后的输出结果用管道传送到一个新的文件中,然后覆盖原来的 JSON 文件。 + +``` +jq . sample.json > pretty.json +``` + +![Pretty printing JSON file in Linux Terminal][9] + +#### 额外技巧:用 jq 命令对 JSON 文件最小化。 + +让我们反过来,对一个格式良好的 JSON 文件进行最小化。要最小化 JSON 文件,你可以使用选项 `-c`。 + +``` +jq -c < pretty.json +``` + +![Minified JSON file display][10] + +如果你愿意,你也可以使用 `cat` 和重定向: + +``` +cat pretty.json | jq -c +``` + +### 在 Linux 中使用 Python 来漂亮地打印 JSON 文件 + +你更有可能是在系统中安装了 Python。如果是这样的话,你可以用它在终端漂亮地打印 JSON 文件: + +``` +python3 -m json.tool sample.json +``` + +![Pretty printing JSON with Python][11] + +我知道还有其他方法可以解析 JSON 文件并以适当的格式打印出来。你可以自己去探索,但这两种方法足以完成漂亮地打印 JSON 文件的工作。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/pretty-print-json-linux/ + +作者:[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://www.json.org +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/print-json.png?resize=759%2C253&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/pretty-printed-json.png?resize=696%2C538&ssl=1 +[4]: https://stedolan.github.io/jq/ +[5]: https://itsfoss.com/package-manager/ +[6]: https://itsfoss.com/ubuntu-repositories/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/pretty-print-json-linux-terminal.png?resize=750%2C557&ssl=1 +[8]: https://itsfoss.com/save-command-output-to-file-linux/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/pretty-printing-json-linux-terminal.png?resize=750%2C576&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/minify-json-file-linux.png?resize=777%2C253&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/pretty-print-json-with-python.png?resize=777%2C557&ssl=1 \ No newline at end of file diff --git a/published/202012/20201209 Make medit your next Linux terminal text editor.md b/published/202012/20201209 Make medit your next Linux terminal text editor.md new file mode 100644 index 0000000000..0f0470e5c9 --- /dev/null +++ b/published/202012/20201209 Make medit your next Linux terminal text editor.md @@ -0,0 +1,71 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12938-1.html) +[#]: subject: (Make medit your next Linux terminal text editor) +[#]: via: (https://opensource.com/article/20/12/medit) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +让 medit 成为你的下一个 Linux 代码编辑器 +====== + +> 这款经典的文本编辑器提供了所有的基本功能和一些让你自定义你的体验的令人兴奋的功能。 + +![](https://img.linux.net.cn/data/attachment/album/202012/21/103921rqtvtsyvyvy5bsq7.jpg) + +有了 [XEDIT][2]、jEdit、NEdit、[gedit][3],最后还有 [medit][4]。  + +在我开始搜索我还没有尝试过的编辑器之前,我还没有听说过 medit,但我很高兴发现了它。如果你正在寻找经典的 gedit 体验(大约是 Gnome 2 上),那么 medit 可能无意间提供了一种出色且现代的近似体验。它也有许多额外的功能,比如可以使用 Python、Lua 或 C 语言编写插件,以及甚至可以将 shell 脚本集成到菜单系统。所有其他常用的功能也都在这里:标签式界面、一个即时的 shell、缩进管理、语法高亮等等。 + +### 安装 medit + +你可以从 [mooedit.sourceforge.net][5] 下载 medit。它确认可以在 Linux 和 Windows 上工作。如果你使用的是 Linux,你也可以在你的仓库中找到它。在 Slackware 上,我从 [slackbuilds.org][6] 安装了它。 + +![Medit terminal showing examples of Bash script in editor][7] + +### 使用 medit + +medit 宣称自己是一个“为编程和围绕编程”打造的编辑器,事实上,它的诞生是作为一个名为 GAP([群组、算法、编程][8]Groups、Algorithms、Programming)的更大项目的一部分。它的大部分功能都是针对典型的开发者的期望而开发。例如,在 **Edit** 菜单中,有增加和减少缩进的选项,这对于任何试图以可视方式指示范围的程序员来说都是一个常见的任务(对于 Python 程序员来说也是一个明文要求),还有注释或取消注释文本块的选项。 + +有些功能对普通用户也很有用。medit 有一个易于使用的标签式界面(既在窗口顶部,也在侧面的弹出式列表中),一个用于快速浏览文件系统的侧面板,在文件中添加书签的功能等等。它还具有针对两种编程语言以及标记语言和 Markdown 的语法高亮显示功能,因此它是可以用于编辑代码和普通文本的编辑器。 + +### 颜色方案 + +当编辑没有语法关联的纯文本或像 Asciidoc 这样的格式时,medit 没有预设的高亮方案,编辑器会采用你的系统默认值。我使用的是深色主题,所以 medit 在深灰色背景上显示白色文本。 + +不过对于语法高亮,文本会根据每个单词在其结构化语言中扮演的角色而变成彩色。一开始,我对 medit 的一些选择有些沮丧,很多颜色在我的深色背景下太暗,无法辨认,而且我觉得所有重要的元素都不够显眼。如果你不喜欢 medit 选择的方案,这个问题的答案在 **Preferences** 中,你可以更改颜色主题。我把我的颜色改成了 Tango,它呈现出一个日光照射的颜色阵列,在我的深色编辑器背景下非常出色,甚至给在 medit 主题下保持白色的元素添加了颜色。 + +![Medit terminal showing examples of Bash script in editor using Tango color scheme against dark background][9] + +### 弹出式 Python 控制台 + +在 medit 窗口的底部,有一个弹出的终端,用于快速访问 shell。这是一个很好的功能,但坦率地说,在你体验过 Emacs 和 [Kate][10]之后,这感觉很普通。medit 让我惊讶的是它的弹出式 Python 控制台,它从 **Tools** 菜单中启动,并预先导入了 **moo** 和 **gtk** 模块。换句话说,当你启动 medit 的 Python shell 时,你可以查看 medit 构建自身部分的 Python 和 GTK 模块。这是一个很好的功能,也许会给你写插件的灵感(这个弹出终端的是一个用 Python 编写的插件,所以你也可以通过它的代码来了解一个插件是如何编写的)。 + +### 经典编辑 + +medit 是一款出色的基于 GTK 的编辑器,它具有所有重要的基本功能和一些诱人的额外功能,可以帮助你扩展应用并使其成为你自己的。因为它接受 C、Python、Lua 和 Bash,所以你可以将它用于这几种用途。如果你正在为你的写作寻找一个有用的编辑器,无论是代码还是 Markdown 或介于两者之间的东西,给 medit 一个机会。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/medit + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer) +[2]: https://linux.cn/article-12930-1.html +[3]: https://linux.cn/article-12933-1.html +[4]: http://mooedit.sourceforge.net/ +[5]: https://sourceforge.net/projects/mooedit/files/medit/ +[6]: https://slackbuilds.org/repository/14.2/development/medit +[7]: https://opensource.com/sites/default/files/uploads/medit-31_days_medit-opensource.png (Medit terminal showing examples of Bash script in editor) +[8]: https://www.gap-system.org/ +[9]: https://opensource.com/sites/default/files/uploads/medit-tango-colour-31_days_medit-opensource.png (Medit terminal showing examples of Bash script in editor using Tango color scheme against dark background) +[10]: https://opensource.com/article/20/12/kate-text-editor diff --git a/published/202012/20201210 Why Java developers love the jEdit text editor.md b/published/202012/20201210 Why Java developers love the jEdit text editor.md new file mode 100644 index 0000000000..f5b2cc3501 --- /dev/null +++ b/published/202012/20201210 Why Java developers love the jEdit text editor.md @@ -0,0 +1,68 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12942-1.html) +[#]: subject: (Why Java developers love the jEdit text editor) +[#]: via: (https://opensource.com/article/20/12/jedit) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +为什么 Java 开发者喜欢 jEdit 文本编辑器 +====== + +> 这款编辑器打包了 Java 的功能,并提供了大量的插件来简化你的工作流程。 + +![](https://img.linux.net.cn/data/attachment/album/202012/22/133305j08dxrqx2fmp6s12.jpg) + +Java 是一门强大的语言。也许因为它经常被看作是一种“工业级”的工具,你可能不会想到它会成为文本编辑器的基础。毕竟,对于如此能力,文本编辑几乎是太容易了。事实上,在大多数现代编程工具包中,接受文本输入的组件是一个预编程的小部件。使用 Java 工具箱,一个简单的文本编辑器可以用 100 行左右的代码编写出来。那么 [jEdit][2] 能提供什么来证明它的存在价值呢? + +嗯,实际上,它有很多功能!jEdit 应用是一个令人耳目一新的提醒,提醒人们 Java 对于日常桌面应用是多么的实用和有用。它巧妙地展示了它的基础技术的活力,并且永远忠于 Java 的永恒承诺,在*所有*的平台上都能运作。 + +### 安装 jEdit + +jEdit 是用 Java 编写的,所以它适用于任何平台。[下载][3]通用安装程序或为所选的操作系统下载自定义安装程序。下载完成后(它很小,因此不会花费很长时间),请运行安装程序。 + +如果你没有安装 Java,请学习如何在 [Linux][4]、[Mac 或 Windows][5] 上安装 Java。 + +### 使用 jEdit + +在 jEdit 中编辑文本的方式和在任何桌面文本编辑器中编辑文本的方式是一样的。如果你使用过编辑器,那么你基本上已经会使用 jEdit 了。所有常用的键盘快捷键和惯例都适用。也有一些通常针对开发者的功能,如行号、折叠(该部分文本被隐藏,这样你就可以把注意力放在其他部分)和语法高亮。 + +但是,想象一下,从 [简单的 Vim][6] 到 [复杂的 Emacs][7]的各种文本编辑器中,你会发现 jEdit 与 Emacs 类似。虽然编辑组件和任何典型桌面编辑应用一样,但 jEdit 的附加功能包括插件、可以在编辑会话中实时录制的宏、特定于某些编辑模式的功能、缓冲区选项等。这是一个积极鼓励你把它变成你自己的编辑器。 + +你可以在三个地方对 jEdit 进行自定义:缓冲区选项、全局选项和插件管理器。 + +缓冲区选项(在 “Utilities” 菜单中)使你可以调整与当前文档关联的设置。通常,jEdit 会自动检测用于你正在执行的操作的适当模式。例如,编写 XML 会触发 jEdit 的 XML 高亮显示。但是,有时你想覆盖 jEdit 已检测到或未能检测到的内容。你还可以打开“显式折叠”模式,该模式允许你手动定义希望 jEdit 视为可折叠部分的文本。 + +全局选项(在 “Utilities” 菜单中)提供了数十种首选项,这些首选项被视为 jEdit 的默认值。这包括从外观到自定义快捷方式的所有内容。 + +插件可以扩展出来 jEdit 的开发者从未想过的功能。插件提供的工作方式对 jEdit 而言并非“常规”,但可能会将繁琐的任务转变为简单甚至有趣的事情。它以其出色的 XML 解析、可停靠的 Sidekick 面板中的 Outline 插件和 XSLT 集成,实际上改变了 XML 工作流程。如果我不是已经使用了 Netbeans 来编写 Java 代码,我想我可以使用 jEdit 来代替。 + +### 面向程序员的 jEdit + +选择哪种文本编辑器取决于你打算在编辑器中做的事。它称自己为“程序员的文本编辑器”,并且我认为它是严肃的 Java 和 XML 开发的有力竞争者。但是,在编辑 Lua 代码和 Bash 脚本时,它的功能不就没有这么强了。例如,与 Emacs 之类相比,jEdit 的代码折叠不那么灵活(我无法在没有附加标记的情况下折叠 Lua 函数)。尽管确实有丰富的插件选择,但我找不到用于 AsciiDoc 和其他非代码格式工作的特别有说服力的东西。 + +对我来说,jEdit 最吸引人的特点是它是以 Java 为基础。因为它在 JVM 中运行,所以你可以确信能够使用它,而无论你使用的平台是什么,也可以不管你是否有权限在自己的主目录之外安装应用。Java 是一种流行且活跃的语言,因此 jEdit 的功能和插件维护得很好。 + +如果你是一致性的忠实拥护者、Java 开发人员,或者只是 XML 极客而拼命试图摆脱 oXygen,那么你应该试试 jEdit。它很容易上手,并且探索起来很有趣。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/jedit + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer) +[2]: http://jedit.org +[3]: http://www.jedit.org/index.php?page=download +[4]: https://linux.cn/article-11614-1.html +[5]: http://adoptopenjdk.org +[6]: https://opensource.com/article/20/12/vi-text-editor +[7]: https://linux.cn/article-12923-1.html diff --git a/published/202012/20201213 What web developers love about the Brackets text editor.md b/published/202012/20201213 What web developers love about the Brackets text editor.md new file mode 100644 index 0000000000..0fb85e3faa --- /dev/null +++ b/published/202012/20201213 What web developers love about the Brackets text editor.md @@ -0,0 +1,73 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12952-1.html) +[#]: subject: (What web developers love about the Brackets text editor) +[#]: via: (https://opensource.com/article/20/12/brackets) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Web 开发人员喜欢 Brackets 文本编辑器的原因 +====== + +> 这个基础的编辑器是面向 Web 开发人员的,它支持多种编程语言,并提供了大量的扩展,使其成为你自己的编辑器。 + +![](https://img.linux.net.cn/data/attachment/album/202012/25/092259zy4xvxs4axmysuf9.jpg) + +Brackets 文本编辑器是主要面向 Web 开发人员的编辑器。恰如其分的是,它的“编辑”菜单中充满了对 Web 编程语言用户特别有用的功能,主要是 HTML、CSS 和 Javascript 的经典组合。 + +但是,它还支持许多与互联网相关的语言和格式,包括 XML、Markdown、YAML 和 JSON、PHP、Lua、Java 和 Python,以及一些常见的通用语言,例如 C、C++,甚至是 `diff` 命令的输出。 + +### 安装 Brackets + +Brackets 可以从 [Brackets 网站][2]安装到 Linux、Windows 和 macOS 上。 + +另外,在 Linux 上,你可以从 [flathub.org][3] 以 Flatpak 安装。 + +![Brackets editor][4] + +### 使用 Brackets + +在大多数时候,Brackets 是一个“普通”的文本编辑器,其功能类似于 [jEdit][5] 或 [Medit][6]。有语法高亮、可配置的制表符间距、字符编码设置等等。这些都可以在窗口底部的状态栏中找到。 + +在“视图”菜单中,有主题设置、行号、自动换行,甚至还有分割窗口的选项,这样你可以在一个窗口中看到两个文件。 + +然而,在“编辑”菜单中,有一些的特别用于编程的功能。以下是我最喜欢的一些功能: + + * 使用 `Ctrl+[` 或 `Ctrl+]` 键盘快捷键来缩进和取消缩进文本块,这不仅对保持 HTML、CSS 和 Javascript 的整洁很有用,而且对 Python 代码也很重要。 + * 用 `Ctrl+/` 把一行变成注释。Brackets 标记注释的方式取决于你所使用的语言,所以无论你的文档是否使用斜线、破折号、箭头、井号或其他任何类型注释,这个功能都可以使用。 + * 用 `Shift+Ctrl+Up` 或 `Shift+Ctrl+Down` 在文档中将一行向上或向下移动。 + * 用 `Shift+Ctrl+D` 删除整个一行。 + * 用 `Ctrl+D` 复制整个一行。 + +这些都是看似小众的功能,你可能认为不会经常使用,但一旦你拥有了它们,你就会对它们产生依赖。 + +### 扩展 + +Brackets 还可以接受扩展,因此你和其他编码者可以添加扩展到功能中。要查看有哪些可用的扩展,请单击“文件”菜单并选择“扩展管理器”。有各种各样的扩展,包括用于调整代码格式的 Beautify、用于其他语言的多个支持包、用于转到标签开头或结尾的功能等等。 + +无论编辑器是否适合你,扩展可以使一个编辑器变得不同,所以如果你尝试 Brackets 并享受它的一切,但缺少一些重要的功能,在你放弃它之前,请浏览一下可用的扩展。 + +### 尝试 Brackets + +Brackets 是一个有点低调的编辑器。虽然它宣传自己是 “Web 代码编辑器”,但实际上它是一个不错的通用编辑器,并为常见的 Web 工具链加入了一些额外的功能。如果你喜欢 Brackets 的外观和它所提供的功能,不妨一试! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/brackets + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png?itok=lcf-m6N7 (Text editor on a browser, in blue) +[2]: http://brackets.io/ +[3]: https://flathub.org/apps/details/io.brackets.Brackets +[4]: https://opensource.com/sites/default/files/screenshot_2020-12-02_at_16.26.58.png (Brackets editor) +[5]: https://linux.cn/article-12942-1.html +[6]: https://linux.cn/article-12938-1.html \ No newline at end of file diff --git a/published/202012/20201214 Set up an Ansible lab in 20 minutes.md b/published/202012/20201214 Set up an Ansible lab in 20 minutes.md new file mode 100644 index 0000000000..6ae266a319 --- /dev/null +++ b/published/202012/20201214 Set up an Ansible lab in 20 minutes.md @@ -0,0 +1,300 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12970-1.html) +[#]: subject: (Set up an Ansible lab in 20 minutes) +[#]: via: (https://opensource.com/article/20/12/ansible-lab) +[#]: author: (Mike Calizo https://opensource.com/users/mcalizo) + +20 分钟建立一个 Ansible 实验室 +====== + +> 建立一个支持学习和实验新软件的环境。 + +![](https://img.linux.net.cn/data/attachment/album/202012/31/112636h6ck5qd60d44t0mm.jpg) + +能够构建和拆解公有云环境是非常有用的,但我们大多数人都不能轻松访问公有云。退而求其次的最好办法就是在本地机器上建立一个实验室,但即使在本地机器上运行也会带来性能、灵活性和其他挑战。大多数时候,本地机器上额外的工作负载会干扰我们日常的工作,它们当然也会影响你提供一个现成的环境来玩耍和实验新软件。 + +几年前,当我和我的团队开始学习 [Ansible][2] 时,我们就遇到了这个挑战。我们找不到一个可以单独使用的环境,我们对这种情况的失望导致我们中的一些人停止了实验。我们知道需要找到一个解决方案。 + +我们花了很多时间研究各种方案,得出了一套工具,使我们的好奇心能够在我们完全控制的环境中学习。我们可以在本地机器上轮换和拆解实验室环境,而不需要访问内部实验室或公共云。 + +本文将解释如何在 20 分钟内以完全自动化的方式在本地机器上部署自己的实验室环境。 + +你可以在我的 [GitHub 仓库][3]中找到这个练习的所有代码。 + +### 工具和软件 + +本方案使用以下工具和软件: + + * [Ansible][4] 是我们选择的自动化工具,因为它易于使用,而且足够灵活,可以满足实验室的要求。 + * [Vagrant][5] 易于使用,用于构建和维护虚拟机。 + * [VirtualBox][6] 是一个托管管理程序,可以在 Windows 和 Linux 环境中使用。 + * [Fedora v30+][7] 是我本地机器上的操作系统。 + +你必须进行以下设置才能建立环境: + + * 一个互联网连接 + * 在 BIOS 中启用虚拟化技术支持(以下是在我的联想笔记本上的[过程][8]) + * Vagrant v2.2.9 + * 最新版本的 Ansible + * 最新版本的 VirtualBox + * Fedora v30+ 宿主机操作系统 + +### 这个实验室环境有什么? + +这个项目旨在部署一个带有 Ansible 引擎和多个 Linux 节点的 Ansible 主机,以及一些预加载和预配置的应用程序(httpd 和 MySQL)。它还启用了 [Cockpit][9],这样你就可以在测试过程中监控虚拟机(VM)的状态。使用预部署的应用程序的原因是为了提高效率(所以你不必花时间安装这些组件)。这样你就可以专注于创建角色和剧本,并针对上述工具部署的环境进行测试。 + +我们确定,对于我们的用例来说,最好的方案是多机 Vagrant 环境。Vagrant 文件创建了三个 CentOS 虚拟机,以模拟两个目标主机和一个 Ansible 控制机。 + + * Host1: 没有图形用户界面(GUI),安装 httpd 和 MySQL + * Host2: 没有 GUI,安装了 httpd 和 MySQL + * Ansible-host:没有 GUI,安装了 Ansible 引擎 + +### 启用多个管理程序 + +如果使用了多个管理程序,一些管理程序可能不允许你拉起虚拟机。要解决这个问题,请遵循以下步骤(基于 Vagrant 的[安装][10]说明)。 + +首先,找出管理程序的名称: + +``` +$ lsmod | grep kvm +kvm_intel             204800  6 +kvm                   593920  1 kvm_intel +irqbypass              16384  1 kvm +``` + +我感兴趣的是 `kvm_intel`,但你可能需要另一个(比如 `kvm_amd`)。 + +以 root 身份运行以下内容,将该管理程序列入黑名单: + +``` +$ echo 'blacklist kvm-intel' >> /etc/modprobe.d/blacklist.conf +``` + +重新启动你的机器并尝试再次运行 Vagrant。 + +### Vagrant 文件 + +``` +cat Vagrantfile +``` + +``` +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure("2") do |config| +# Define VMs with static private IP addresses, vcpu, memory and vagrant-box. + boxes = [ + { + :name => "web1.demo.com", ⇒ Host1 this is one of the target nodes + :box => "centos/8", ⇒ OS version + :ram => 1024, ⇒ Allocated memory + :vcpu => 1, ⇒ Allocated CPU + :ip => "192.168.29.2" ⇒ Allocated IP address of the node + }, + { + :name => "web2.demo.com", ⇒ Host2 this is one of the target nodes + :box => "centos/8", + :ram => 1024, + :vcpu => 1, + :ip => "192.168.29.3" + }, + { + :name => "ansible-host", ⇒ Ansible Host with Ansible Engine + :box => "centos/8", + :ram => 8048, + :vcpu => 1, + :ip => "192.168.29.4" + } + ] + + # Provision each of the VMs. + boxes.each do |opts| + config.vm.define opts[:name] do |config| +# Only Enable this if you are connecting to Proxy server +# config.proxy.http = "http://usernam:password@x.y:80"⇒ Needed if you have a proxy +# config.proxy.https = "http://usernam:password@x.y:80" +# config.proxy.no_proxy = "localhost,127.0.0.1" + config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", disabled: true + config.ssh.insert_key = false + config.vm.box = opts[:box] + config.vm.hostname = opts[:name] + config.vm.provider :virtualbox do |v| ⇒ Defines the vagrant provider + v.memory = opts[:ram] + v.cpus = opts[:vcpu] + end + config.vm.network :private_network, ip: opts[:ip] + config.vm.provision :file do |file| + file.source = './keys/vagrant' ⇒ vagrant keys to allow access to the nodes + file.destination = '/tmp/vagrant' ⇒ the location to copy the vagrant key + end + config.vm.provision :shell, path: "bootstrap-node.sh" ⇒ script that copy hosts entry + config.vm.provision :ansible do |ansible| ⇒ declaration to run ansible playbook + ansible.verbose = "v" + ansible.playbook = "playbook.yml" ⇒ the playbook used to configure the hosts + end + end + end +end +``` + +这些是你需要注意的重要文件。 + + * `inventory-test.yaml`:连接到节点的清单文件 + * `playbook.yaml`:Vagrant 供应者调用的用于配置节点的剧本文件 + * `Vagrantfile':Vagrant 用来部署环境的文件 + * Vagrant 密钥文件:连接实验室环境中各节点的 Vagrant 密钥 + +你可以根据你的需要调整这些文件。Ansible 的灵活性使你有能力根据你的需要声明性地改变你的环境。 + +### 部署你的实验室环境 + +首先,克隆这个 [GitHub 仓库][11] 中的代码: + +``` +$ git clone https://github.com/mikecali/ansible-labs-101.git +Cloning into 'ansible-labs-101'... +remote: Enumerating objects: 15, done. +remote: Counting objects: 100% (15/15), done. +remote: Compressing objects: 100% (13/13), done. +remote: Total 15 (delta 2), reused 10 (delta 0), pack-reused 0 +Unpacking objects: 100% (15/15), 6.82 KiB | 634.00 KiB/s, done. +``` + +接下来,将你的目录改为 `vagrant-session-2`,并查看其内容: + +``` +$ ls +Bootstrap-node.sh   inventory   keys   playbook.yml   README.md Vagrantfile +``` + +现在你已经拥有了实验室环境所需的所有工件和配置文件。要部署环境,请运行: + +``` +$ vagrant up +``` + +只要有一个像样的网络连接,只需要 20 分钟左右就可以得到一个运行环境: + +``` +$ vagrant up +Bringing machine 'web1.demo.com' up with 'virtualbox' provider... +Bringing machine 'web2.demo.com' up with 'virtualbox' provider... +Bringing machine 'ansible-host' up with 'virtualbox' provider... +==> web1.demo.com: Importing base box 'centos/8'... +==> web1.demo.com: Matching MAC address for NAT networking... +==> web1.demo.com: Checking if box 'centos/8' version '1905.1' is up to date... +==> web1.demo.com: Setting the name of the VM: ansible-labs_web1democom_1606434176593_70913 +==> web1.demo.com: Clearing any previously set network interfaces... +==> web1.demo.com: Preparing network interfaces based on configuration... + web1.demo.com: Adapter 1: nat + web1.demo.com: Adapter 2: hostonly +==> web1.demo.com: Forwarding ports... + web1.demo.com: 22 (guest) => 2222 (host) (adapter 1) +==> web1.demo.com: Running 'pre-boot' VM customizations... +==> web1.demo.com: Booting VM... +==> web1.demo.com: Waiting for machine to boot. This may take a few minutes... + web1.demo.com: SSH address: 127.0.0.1:2222 + web1.demo.com: SSH username: vagrant + web1.demo.com: SSH auth method: private key +[...] +``` + +一旦该剧本执行完成,你会看到这样的输出: + +``` +PLAY RECAP ********************************* +Ansible-host     : ok=20 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=3 + +Real 18m14.288s +User 2m26.978s +Sys 0m26.849s +``` + +确认所有虚拟机都在运行: + +``` +$ vagrant status +Current machine states: + +Web1.demo.com    running (virtualbox) +Web2.demo.com    running (virtualbox) +ansible-host     running (virtualbox) +[...] +``` + +你可以通过登录其中一个虚拟机进一步调查。访问 `ansible-host`: + +``` +> vagrant ssh ansible-host +Activate the web console with: systemctl enable --now cockpit.socket + +Last login: Thu Nov 26 12:21:23 2020 from 10.0.2.2 +[vagrant@ansible-host ~] uptime +16:46:42 up 1:24, 1 user, load average: 0.00, 0.01, 0.04 +``` + +最后,你可以使用 Ansible 模块来 ping 你创建的其他节点: + +``` +[vagrant@ansible-host]$ ansible -i inventory-test.yaml \ +webservers -m ping -u vagrant +192.168.29.2 | SUCCESS => { +  "Ansible-facts": { +      "Discovered_interpreter_python": "/usr/libexec/platform-python" +    }, +    "Changed": false; +    "Ping": "pong" +} +[...] +``` + +### 清理 + +运行如下命令来清理环境: + +``` +$ vagrant destroy [vagrant machine name] +``` + +你的输出会像这样: + +![Output from cleaning up environment][12] + +### 有创意的学习 + +在自己的实验室里利用自己的时间学习 Ansible 这样的软件是一个好习惯,但由于受到无法控制的限制,可能会很困难。 + +有时候,你需要发挥创意,找到另一种方法。在开源社区中,你可以选择很多方案;我们选择这些工具的主要原因之一是,它们是许多人常用和熟悉的。 + +另外,请注意,这些剧本并没有按照我的要求进行优化。请随时改进它们,并在评论中分享你的工作。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/ansible-lab + +作者:[Mike Calizo][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/mcalizo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers) +[2]: https://opensource.com/resources/what-ansible +[3]: https://github.com/mikecali/ansible-labs-101 +[4]: https://www.ansible.com/ +[5]: https://www.vagrantup.com/ +[6]: https://www.virtualbox.org/ +[7]: https://getfedora.org/ +[8]: https://support.lenovo.com/pt/en/solutions/ht500006 +[9]: https://opensource.com/article/20/11/cockpit-server-management +[10]: https://www.vagrantup.com/docs/installation +[11]: https://github.com/mikecali/ansible-labs-101.git +[12]: https://opensource.com/sites/default/files/uploads/cleanup.png (Output from cleaning up environment) +[13]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202012/20201215 9 things to do in your first 10 minutes on a Linux server.md b/published/202012/20201215 9 things to do in your first 10 minutes on a Linux server.md new file mode 100644 index 0000000000..ac15ee340e --- /dev/null +++ b/published/202012/20201215 9 things to do in your first 10 minutes on a Linux server.md @@ -0,0 +1,167 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12959-1.html) +[#]: subject: (9 things to do in your first 10 minutes on a Linux server) +[#]: via: (https://opensource.com/article/20/12/linux-server) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) + +初次登录 Linux 服务器马上要做的 9 件事 +====== + +> 在将新配置的服务器投入工作之前,请确保你知道你正在使用什么。 + +![](https://img.linux.net.cn/data/attachment/album/202012/27/112042zuz1lpudkypeppeu.jpg) + +当我在 Linux 上测试软件时(这是我工作中的一个常规部分),我需要使用多台运行 Linux 的不同架构的服务器。我整备机器,安装所需的软件包,运行我的测试,收集结果,并将机器返回到仓库中,以便其他人可以使用它进行测试。 + +由于我经常这样做(甚至一天多次),我初次登录 Linux 服务器的前 10 分钟内的工作已经成为每天的仪式。当我初次登录 Linux 服务器时,我会使用命令来收集我需要的信息来寻找某些东西。我将在本文中介绍我的过程,但请注意,在大多数情况下,我只给出命令名称,所以你需要确定这些命令的具体选项,以获得你需要的信息。阅读命令的手册页是一个很好的起点。 + +### 1、第一次接触 + +当我登录到一台服务器时,我做的第一件事就是检查它是否拥有我将要运行的测试所需的操作系统、内核和硬件架构。我经常会检查一台服务器已经运行了多久。虽然这对测试系统来说并不重要,因为它会被多次重启,但我还是发现这些信息很有帮助。 + +使用下面的命令来获取这些信息。我主要使用 Red Hat Linux 进行测试,所以如果你使用其他 Linux 发行版,请在文件名中使用 `*-release` 而不是 `redhat-release`: + +``` +cat /etc/redhat-release +uname -a +hostnamectl +uptime +``` + +### 2、有人登录在上面吗? + +一旦我知道这台机器符合我的测试需求,我需要确保没有其他人同时登录该系统运行他们自己的测试。虽然考虑到整备系统会帮我处理好这个问题,这种可能性很小,但偶尔检查一下还是有好处的 —— 尤其是当我第一次登录服务器的时候。我还会检查是否有其他用户(除了 root)可以访问系统。 + +使用下面的命令来查找这些信息。最后一条命令是查找 `/etc/passwd` 文件中具有 shell 访问权限的用户;它会跳过文件中没有 shell 访问权限或 shell 设置为 `nologin` 的其他服务: + +``` +who +who -Hu +grep sh$ /etc/passwd +``` + +### 3、物理机还是虚拟机 + +现在我有了属于自己的机器,我需要确定它是一台物理机还是一台虚拟机(VM)。如果是我自己整备的这台机器,我可以确定这是我要求的东西。但是,如果你使用的是一台不是你自己整备的机器,你应该检查该机器是物理机还是虚拟机。 + +使用以下命令来识别这些信息。如果是物理系统,你会看到供应商的名称(如 HP、IBM 等)以及服务器的品牌和型号;而在虚拟机中,你应该看到 KVM、VirtualBox 等,这取决于创建虚拟机时使用了什么虚拟化软件: + +``` +dmidecode -s system-manufacturer +dmidecode -s system-product-name +lshw -c system | grep product | head -1 +cat /sys/class/dmi/id/product_name +cat /sys/class/dmi/id/sys_vendor +``` + +### 4、硬件 + +因为我经常测试连接到 Linux 机器的硬件,所以我通常使用物理服务器,而不是虚拟机。在物理机器上,我的下一步是确定服务器的硬件能力 —— 例如,运行的是什么类型的 CPU,它有多少个核心,启用了哪些标志,以及有多少内存可用于运行测试。如果我正在运行网络测试,我会检查连接到服务器的以太网或其他网络设备的类型和容量。 + +使用以下命令来显示连接到 Linux 服务器的硬件。其中一些命令在新的操作系统版本中可能会被废弃,但你仍然可以从 yum 存储库中安装它们或切换到它们的等效新命令: + +``` +lscpu or cat /proc/cpuinfo +lsmem or cat /proc/meminfo +ifconfig -a +ethtool +lshw +lspci +dmidecode +``` + +### 5、已安装的软件 + +测试软件总是需要安装额外的依赖包、库等。然而,在安装任何东西之前,我都会检查已经安装了什么(包括是什么版本),以及配置了哪些存储库,这样我就知道软件来自哪里,并可以调试任何软件包安装问题。 + +使用下面的命令来确定安装了什么软件: + +``` +rpm -qa +rpm -qa | grep +rpm -qi +yum repolist +yum repoinfo +yum install +ls -l /etc/yum.repos.d/ +``` + +### 6、运行的进程和服务 + +检查了安装的软件之后,自然就会检查系统上有哪些进程在运行。当在系统上运行性能测试时,这一点至关重要 —— 如果一个正在运行的进程、守护进程、测试软件等占用了大部分 CPU/RAM,那么在运行测试之前停止该进程是有意义的。这也可以检查测试所需的进程或守护进程是否已经启动并运行。例如,如果测试需要 `httpd` 运行,那么即使安装了软件包,启动守护进程的服务也可能没有运行。 + +使用以下命令来识别系统上正在运行的进程和已启用的服务: + +``` +pstree -pa 1 +ps -ef +ps auxf +systemctl +``` + +### 7、网络连接 + +如今的机器网络化程度很高,它们需要与网络上的其他机器或服务进行通信。我会识别服务器上哪些端口是开放的,是否有到测试机器的任何网络连接,是否启用了防火墙,如果启用了,是否屏蔽了任何端口,以及机器与哪些 DNS 服务器对话。 + +使用以下命令来识别网络服务相关信息。如果一个过时的命令不可用,请从 yum 存储库中安装它或使用等效的新命令: + +``` +netstat -tulpn +netstat -anp +lsof -i +ss +iptables -L -n +cat /etc/resolv.conf +``` + +### 8、内核 + +在进行系统测试时,我发现了解内核相关的信息是很有帮助的,比如内核版本和加载了哪些内核模块。我还会列出任何[可调整的内核参数][2]以及它们的设置,并检查启动运行中的内核时使用的选项。 + +使用以下命令来识别这些信息: + +``` +uname -r +cat /proc/cmdline +lsmod +modinfo +sysctl -a +cat /boot/grub2/grub.cfg +``` + +### 9、日志 + +现在,我已经对服务器有了很好的了解,包括安装了哪些软件,运行了哪些进程。还有一件事我无法逃避,那就是日志文件 —— 我需要知道在哪里可以查看不断更新的信息。 + +使用以下命令查看系统的日志: + +``` +dmesg +tail -f /var/log/messages +journalctl +``` + +### 接下来的步骤 + +虽然命令和实用程序会发生变化,但它们所显示的基本信息大致不变。在你专注于掌握哪些命令之前,你需要对你要寻找的信息以及它属于什么类别有一个宏观的看法。 + +由于 Linux 将大部分信息保存在文件中,这些命令基本上是从文件中读取信息,并以一种易于理解的方式呈现出来。下一步的好做法是找出每个命令用来获取信息显示的文件。一个提示:寻找这些信息的方法是 `strace` 命令。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/linux-server + +作者:[Gaurav Kamathe][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/gkamathe +[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://www.oreilly.com/library/view/red-hat-enterprise/9781785283550/ch10s05.html diff --git a/published/202012/20201215 Here are the Worthy Replacements of CentOS 8 for Your Production Linux Servers.md b/published/202012/20201215 Here are the Worthy Replacements of CentOS 8 for Your Production Linux Servers.md new file mode 100644 index 0000000000..1eec4fc85b --- /dev/null +++ b/published/202012/20201215 Here are the Worthy Replacements of CentOS 8 for Your Production Linux Servers.md @@ -0,0 +1,168 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12921-1.html) +[#]: subject: (Here are the Worthy Replacements of CentOS 8 for Your Production Linux Servers) +[#]: via: (https://itsfoss.com/rhel-based-server-distributions/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +什么 Linux 系统可以替换生产环境的 Linux 服务器上的 CentOS 8 +====== + +CentOS 是世界上最流行的服务器发行版之一。它是红帽企业 LinuxRed Hat Enterprise Linux(RHEL)的一个开源分支,提供了 RHEL 的优点,却没有 RHEL 的相关成本。 + +然而,最近情况发生了变化,[红帽正在将稳定的 CentOS 转换为滚动发布模式,即 CentOS Stream的形式][1]。CentOS 8 本来应该支持到 2029 年,但现在到 2021 年底就被迫停止了。 + +如果你的服务器使用的是 CentOS,这可能会让你不知道该何去何从。 + +你看,取代 CentOS 8 的首要选择就是 CentOS Stream。将 CentOS 8 升级到 CentOS Stream 的[过程很简单][2],你不用担心需要重新安装任何东西。 + +不过,由于 CentOS Stream 是滚动发布性质的,你可能要考虑一些对生产服务器来说更稳定的东西。我将在本文中会推荐一些 Linux 系统来帮助你做出这个决定。 + +### 基于 RHEL 的服务器 Linux 发行版,你可以考虑用来取代 CentOS + +![][3] + +我将从一些正在开发的 RHEL 分支版本开始列举,其唯一目的是取代 CentOS 8。之后,我会列出你可以马上使用的服务器发行版。 + +#### Rocky Linux(正在开发中) + +![][4] + +就在红帽宣布计划用滚动发布的 CentOS Stream 取代稳定的 CentOS 8 的同一天,CentOS 的原开发者宣布了一个新项目,为 CentOS 用户提供 RHEL 分支。 + +这个新项目名为 [Rocky Linux][5]。它的名字是为了纪念原 CentOS 项目的共同创始人之一。它是从 RHEL 8 分支出来的,目标是“100% 与 RHEL 兼容”。 + +该项目正在快速开发中,目前可能无法使用。但这是在 2021 年底 CentOS 8 支持结束时取代它的首选之一。 + +#### Lenix 项目(开发中) + +![][6] + +这是在宣布 CentOS Stream 成为默认版本一天后创建的又一个 RHEL 分支。 + +[Lenix 项目][7]是由 CloudLinux 创建的,CloudLinux 是一家面向企业的服务机构,多年来一直在提供定制化的 CentOS 服务器,鉴于他们在 CentOS 和企业服务器方面的多年经验,Lenix 项目应该是一个很有前途的 RHEL 分支,可以取代 CentOS Stream。 + +#### Oracle Linux + +![][8] + +这可能是该列表中唯一能以最佳方式使用的 RHEL 分支。不仅可以随时使用,你甚至可以[从现有的 CentOS 安装迁移到 Oracle Linux][9],而无需重新安装。 + +Oracle Linux 自 2006 年起推出。它的应用二进制 100% 兼容 RHEL,并且它提供了与每个 RHEL 版本相对应的版本。而且,你不需要与 Oracle 签署任何协议来使用 Oracle Linux。 + +Oracle Linux 有两种 Linux 内核可供选择:Oracle Linux 的[坚不可摧企业级内核][10]Unbreakable Enterprise Kernel(UEK)或红帽兼容内核 Red Hat Compatible Kernel(RHCK)。 + +只是,甲骨文在开源项目上有些黑历史,可能这也是为什么选择 CentOS 这种真正的社区分支形式而不是甲骨文 Linux 的原因。随着 CentOS 被 CentOS Stream 所取代,也许现在正是给 Oracle 一个机会的时候? + +#### ClearOS(来自惠普) + +![][11] + +[ClearOS][12] 是惠普在其 HPE ProLiant 服务器上提供的。虽然他们的网站上没有明确提到,但 ClearOS 是基于 RHEL 和 CentOS 的。 + +[Clear Center][13] 和 HPE 在这个项目上进行了合作。开源的 ClearOS 免费提供给社区。他们有自己的应用市场,混杂了免费和付费应用。你不需要为操作系统付费,但如果你选择了付费应用,你可能需要为该应用付费。 + +它可能没有那么流行,但随着 CentOS Stream 成为默认,如果惠普能抓住这个时机,ClearOS 应该能获得一些用户。他们会这么做吗?我不太确定。甲骨文正在努力吸引 CentOS 用户,但我没有看到惠普的这种努力。 + +#### Springdale Linux(普林斯顿大学的学术项目) + +![][14] + +一个由院士维护的红帽分支?这就是 Scientific Linux 吧?但 Scientific Linux 已经死了一年多了。 + +[Springdale Linux][15](SDL)是普林斯顿大学的另一个这样的项目。它之前被称为 PUIAS Linux(普林斯顿大学高级研究所Princeton University Institute for Advanced Study)。 + +目前还没有 RHEL 8 对应的 Springdale Linux,我觉得他们的开发速度可以加快一些。 + +### 不基于红帽的服务器发行版 + +好吧,到目前为止,列表中已经提到了基于红帽的发行版。现在是时候看看一些与 RHEL 无关,但仍然是生产服务器的上好选择的服务器发行版了。 + +#### YunoHost(专门为 Web 服务器定制的) + +![][16] + +[YunoHost][17] 是基于 Debian 定制的,目的是为你提供一个托管 Web 服务器的系统。 + +你可以在[树莓派等 ARM 板][18]、旧台式机和计算机上使用它,当然也可以在虚拟专用服务器(VPS)上使用。 + +YunoHost 还提供了一个基于 Web 的管理界面(灵感来自于 [Webmin][19]?),这样你就可以用图形化的方式来管理系统。这对于一个想托管 Web 服务器但又不太会命令行的人来说,是一个很大的安慰。 + +#### Debian Linux + +![][20] + +这个通用操作系统提供了一个坚如磐石的服务器发行版。对于那些想要一个稳定系统的人来说,是一个理想的选择。 + +如果你在 CentOS 上投入了太多的时间和技术,你可能会发现 [Debian][21] 略有不同,尤其是软件包管理系统。不过,我相信,对于一个经验丰富的 Linux 系统管理员来说,这应该不是什么大问题。 + +#### openSUSE + +![][22] + +SUSE 是红帽的直接竞争对手之一。他们以 [SUSE Linux Enterprise][23] 的形式提供企业级产品。他们的开源产品 openSUSE 也相当受欢迎,无论是在桌面还是服务器领域。 + +[openSUSE][24] 是一个服务器 Linux 发行版的好选择。现在的人不会明白 [SUSE 的 YAST 工具][25]在上世纪 90 年代和 2000 年初给用户带来了怎样的解脱。它仍然是管理 SUSE 系统的一个方便的工具。 + +openSUSE 有两种形式:滚动发布的 Tumbleweed 和稳定的点发布版的 Leap。我猜测你追求的是稳定性,所以 Leap 是你应该追求的目标。 + +#### Ubuntu + +![][26] + +[Ubuntu][27] 是世界上最流行的发行版,[在服务器上][28]和台式机上都是如此。这就是为什么没有 Ubuntu 这份清单就不完整的原因。 + +因为我已经使用 Ubuntu 很长时间了,所以我觉得在 Ubuntu 上托管我的 Web 服务器很舒服。但这只是我个人的想法。如果你是从 RHEL 领域过来的,这里的包管理系统和一些网络和管理组件是不同的。 + +[Ubuntu LTS 版][29]带有五年的支持,这是 CentOS 版本提供的一半长短。如果你不想升级版本,你可以选择为过时的 LTS 版本购买付费的扩展支持。 + +#### 你的选择是什么? + +我已经列出了一些基于 RHEL 的发行版以及通用服务器发行版的顶级推荐。 + +现在轮到你了,在上面列出的发行版中,你最喜欢哪个?你有什么其他的建议可以添加到这个列表中吗?请在评论区留言。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/rhel-based-server-distributions/ + +作者:[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://linux.cn/article-12902-1.html +[2]: https://linuxhandbook.com/update-to-centos-stream/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/Replace-centos.png?resize=800%2C450&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/rocky-linux.png?resize=800%2C350&ssl=1 +[5]: https://rockylinux.org +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/cloudlinux.png?resize=800%2C350&ssl=1 +[7]: https://www.reddit.com/r/ProjectLenix/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/oracle-linux.png?resize=800%2C350&ssl=1 +[9]: https://github.com/oracle/centos2ol +[10]: https://docs.oracle.com/en/operating-systems/uek/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/clear-os.jpg?resize=795%2C349&ssl=1 +[12]: https://www.clearos.com +[13]: https://www.clearcenter.com +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/springdale-linux.png?resize=800%2C350&ssl=1 +[15]: https://puias.math.ias.edu +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/yunohost.png?resize=720%2C400&ssl=1 +[17]: https://yunohost.org#/ +[18]: https://itsfoss.com/raspberry-pi-alternatives/ +[19]: https://linuxhandbook.com/use-webmin/ +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/debian-linux.png?resize=800%2C350&ssl=1 +[21]: https://www.debian.org +[22]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/opensuse.jpg?resize=800%2C350&ssl=1 +[23]: https://www.suse.com/download/sles/ +[24]: https://www.opensuse.org +[25]: https://yast.opensuse.org +[26]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/ubuntu.jpg?resize=800%2C350&ssl=1 +[27]: https://ubuntu.com/download/server +[28]: https://www.datanyze.com/market-share/operating-systems--443/ubuntu-market-share +[29]: https://itsfoss.com/long-term-support-lts/ diff --git a/published/202012/20201216 How to View Images from the Linux Terminal.md b/published/202012/20201216 How to View Images from the Linux Terminal.md new file mode 100644 index 0000000000..ba075e24c6 --- /dev/null +++ b/published/202012/20201216 How to View Images from the Linux Terminal.md @@ -0,0 +1,169 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12948-1.html) +[#]: subject: (How to View Images from the Linux Terminal) +[#]: via: (https://www.2daygeek.com/how-to-view-display-images-from-linux-terminal/) +[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) + +如何在 Linux 终端查看图像 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/23/233513zcgmggmxfd0wf9g1.png) + +Linux 有很多用于查看图像的 GUI 应用。但我从来没有尝试过用任何命令行应用来查看它。 + +幸运的是,在使用 [ImageMagick 工具][1]时,我得到了一个从终端查看图像的命令。命令名是 `“display`,它是 ImageMagick 工具的一部分。这是一个很好的工具,允许类 UNIX 用户从终端查看图像。 + +此外,我还为此用途得到了另一个很好的工具,叫做 FIM。 + +我们将向你展示如何安装并使用它从 Linux 终端查看图像。这些命令使用系统的帧缓冲framebuffer直接从命令行显示图像。 + +### 如何使用 display 命令从终端查看图像 + +[ImageMagick][2] 是一个自由开源、功能丰富、基于命令行的图像处理工具。它用于创建、编辑、合成或转换位图图像。它可以读取和写入各种格式(超过 200 种)的图像,包括 PNG、JPEG、GIF、PDF、SVG 等。它可以调整图像的大小、镜像、旋转、转换图像、调整图像颜色、应用各种特殊效果等。它支持批处理,允许你一次处理所有图像。 + +### 如何安装 ImageMagick? + +ImageMagick 软件包包含在大多数 Linux 发行版的官方仓库中。使用发行版软件包管理器来安装它。 + +**需要注意的是:**确保你的 Linux 系统上已经安装了 “[Development Tools][3]” 包,这是安装的前提条件。 + +对于 RHEL/CentOS 6/7 系统,请使用 [yum 命令][4] 安装 ImageMagick: + +``` +$ sudo yum install -y ImageMagick ImageMagick-devel +``` + +在 RHEL/CentOS 8 和 Fedora 系统,使用 [dnf 命令][5] 安装 ImageMagick: + +``` +$ sudo dnf install -y ImageMagick ImageMagick-devel +``` + +对于 Debian/Ubuntu 系统,使用 [apt 命令][6] 或 [apt-get 命令][7] 安装 ImageMagick: + +``` +$ sudo apt-get update +$ sudo apt-get install imagemagick +``` + +对于 openSUSE 系统,使用 [zypper 命令][8] 安装 ImageMagick: + +``` +$ sudo zypper install -y ImageMagick +``` + +要查看任何图像文件,请运行 `display` 命令,如下所示。你可以按下 `Esc`/`q` 按钮关闭图像: + +``` +$ display bird.jpg +``` + +![](https://www.2daygeek.com/wp-content/uploads/2020/12/how-to-view-display-images-from-linux-terminal-2.jpg) + +如果你想用指定的窗口大小打开图像,请使用 `-geometry` 标志: + +``` +$ display -geometry 1000x600 ~/Downloads/bird.jpg +``` + +你也可以通过 `display` 命令输入图像的位置信息。下面的命令可以从桌面的距顶部 800 像素和据左上角 800 像素处打开图像: + +``` +$ display -geometry 1000x600+800+800 ~/Downloads/bird.jpg +``` + +如果你想用 `display` 命令调整图像的大小,请使用以下格式: + +``` +$ display -resize 600x400 ~/Downloads/bird.jp +``` + +另外,你也可以使用百分比来调整图片的大小: + +``` +$ display -resize 50% ~/Downloads/bird.jpg +``` + +### 如何使用 fim 命令从终端查看图像 + +[FIM][10] 是一个专门为 Linux 设计的轻量级全局图像查看器。但它并不局限于 Linux,它也可配置在其他操作系统上运行,如 MS-Windows。 + +对于熟悉 VIM 文本编辑器等软件的用户来说,它是高度可定制和可脚本化的图像查看器。它可以全屏显示图像,并且可以使用键盘快捷键轻松控制。它是一款非常轻量级的工具,因为它只依赖于某些库。 + +它可以打开许多文件格式,它可以在以下视频模式下显示图像: + + * 使用 Linux 帧缓冲设备图形化。 + * 在 X/Xorg 下,使用 SDL 库图形化 + * 在 X/Xorg 下,使用 Imlib2 库图形化。 + * 使用 AAlib 库,在任意文本控制台中以 ASCII 艺术形式呈现。 + +运行时自动检测或选择正确的视频模式,如果需要,可以在构建前配置时选择加入或去除。 + +FIM 是 “Fbi IMproved” 的缩写,是 Fbi Image Viewer 的复刻版本。 + +FIM 可以很容易地安装在基于 Debian/Ubuntu 的系统上,因为该软件包在发行版的官方仓库中是可用的。对于其他发行版,你可能需要从源码编译它: + +``` +$ sudo apt install fim +``` + +安装完毕后,你可以使用以下命令显示图像: + +``` +$ fim bird.jpg +``` + +你可以使用 `-a` 选项自动缩放图像: + +``` +$ fim -a bird.jpg +``` + +![](https://www.2daygeek.com/wp-content/uploads/2020/12/how-to-view-display-images-from-linux-terminal-3.jpg) + +如果你要打开当前目录中的多个图像文件,请使用通配符将它们全部打开。使用 `PageUp`/`PageDown` 键盘快捷键移动到下一张或上一张图像: + +``` +$ fim -a *.jpg +``` + +要以 ASCII 格式查看图像,可以使用 `-t` 标志: + +``` +$ fim -t bird.jpg +``` + +下面的键盘快捷键可以让你控制图像: + + * `PageUp`/`PageDown`:上一张/下一张图片。 + * `+`/`-`:放大/缩小 + * `a`:自动缩放 + * `w`:适应宽度 + * `ESC`/`q`:退出 + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/how-to-view-display-images-from-linux-terminal/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://www.2daygeek.com/resize-convert-images-from-linux-command-line/ +[2]: https://imagemagick.org/ +[3]: https://www.2daygeek.com/install-development-tools-on-ubuntu-debian-arch-linux-mint-fedora-centos-rhel-opensuse/ +[4]: https://www.2daygeek.com/linux-yum-command-examples-manage-packages-rhel-centos-systems/ +[5]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ +[6]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/ +[7]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/ +[8]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/ +[9]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 +[10]: https://www.nongnu.org/fbi-improved/#docs diff --git a/published/202012/20201216 Why Vim users will love the Kakoune text editor.md b/published/202012/20201216 Why Vim users will love the Kakoune text editor.md new file mode 100644 index 0000000000..b38d1d977b --- /dev/null +++ b/published/202012/20201216 Why Vim users will love the Kakoune text editor.md @@ -0,0 +1,108 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12955-1.html) +[#]: subject: (Why Vim users will love the Kakoune text editor) +[#]: via: (https://opensource.com/article/20/12/kakoune) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +为什么 Vim 用户会喜欢 Kakoune 文本编辑器? +====== + +> 这个编辑器可能会让人联想到 Vim,但它也提供了很多自己独特的功能和特性。 + +![](https://img.linux.net.cn/data/attachment/album/202012/25/233039wpnwnwakzn1zwa33.jpg) + +[Kakoune][2] 文本编辑器的灵感来源于 Vi。它拥有简约的界面、简短的键盘快捷键以及独立的编辑和插入模式,乍一看确实[看起来和感觉很像 Vi][3]。然而,Kakoune 编辑器在设计和功能上都有自己独特的风格,与其说是另一个 Vim,不如说是它是它自己。 + +### 安装 + +在 Linux 和 BSD 上,你可以从你的发行版的软件仓库或 port 树上安装 Kakoune。例如,在 Fedora、CentOS 或 RHEL 上: + +``` +$ sudo dnf install kakoune +``` + +在 Debian、Ubuntu 或类似的系统上: + +``` +$ sudo apt install kakoune +``` + +在 macOS 上,你可以使用 Homebrew: + +``` +$ brew install kakoune +``` + +或者,你也可以[从源码构建][4]。 + +启动 Kakoune 的命令是 `kak`。你可以启动 Kakoune 打开空文件,也可以在启动时包含文件名让它打开: + +``` +$ kak example.txt +``` + +### 使用 Kakoune + +当你启动 Kakoune(不带文件名)时,除了在窗口底部有一个小的状态栏外,它在你的终端中打开的大部分是空的缓冲区。像 Vim 一样,Kakoune 以“正常”模式启动,它把按键作为命令,不向缓冲区输入文本。要进入*插入模式*,你必须按 `i`(代表插入Insert)或 `a`(代表追加Append)。 + +在插入模式下,Kakoune 的操作和其他编辑器一样。你在键盘上输入,然后你输入的字符就会显示在缓冲区里。在插入模式下,你可以使用方向键来浏览缓冲区。 + +### 正常模式 + +在正常模式下,你可以发出导航和文本编辑命令。这是从 Vi 传统中借用的最明显的功能。编辑命令包括复制、剪切(在传统的 Unix 编辑术语中,称为 “猛拉yank”)、粘贴单词和行、撤销、转换字符大小写等功能。下面是一些基础: + +* `d`:复制并删除当前选择(现代术语中的“剪切”) +* `c`:复制并删除当前选择,并进入插入模式 +* `Esc+Alt+d`:删除当前选择 +* `y`:复制选择 +* `p`:粘贴 +* `<`:取消所选行的缩进 +* `u`:撤消 +* `U`:重做 +* `:转为小写 +* `~`:转换为大写 + +### 选择 + +在 Kakoune 中,你的光标是一个单字符的移动选区。除非你扩展你的选区,否则任何影响选区的命令都只适用当前光标位置。例如,如果你的光标悬停在字母 `n` 上,那么复制命令(正常模式下的 `c`)会将字母 `n` 复制到剪贴板,而粘贴命令(正常模式下的 `p`)则会将字母 `n` 粘贴到缓冲区。 + +从单个字符扩展选区的最简单方法是进入正常模式,按下 `Shift` 键,同时用方向键移动光标。然而,有几种方法可以根据某些标准来扩展选区。例如,`Alt+l` 将选区从光标扩展到当前行的末端。 + +完整的文档可以在 中找到。 + +### 函数 + +除了这些基本的交互,你还可以执行命令来调用 Kakoune 的内置功能。要访问 Kakoune 的命令行,在普通模式下输入 `:`。在命令行中,你可以执行命令,包括打开文件的 `edit` 命令,保存缓冲区到文件的 `write` 命令,当然还有退出应用的 `quit`。 + +还有更多的函数,包括针对特定编程语言和文件格式的特殊选项、使用 [Ranger 文件浏览器][5]浏览文件系统的选项、改变颜色主题、搜索和替换文本等等。 + +![Kakoune][6] + +### 尝试 Kakoune + +如果你是一个有经验的 Vim 用户,或者甚至是一个只是略知一二的人,你可能会发现 Kakoune 一开始会让你感到迷惑。它与 Vim 的相似度足以让你陷入一种虚假的熟悉感。一切都与 Vim 一模一样,直到你发现了完全不同的地方。不过,如果你是一个刚接触 Vim 编辑器的新手,或者你是一个正在寻找新挑战的 Vim 用户,那么 Kakoune 可能是你的理想编辑器。 + +你自己试试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/kakoune + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-docdish-typewriterkeys-3.png?itok=NyBwMdK_ (Typewriter keys in multicolor) +[2]: https://kakoune.org/ +[3]: https://linux.cn/article-12947-1.html +[4]: https://github.com/mawww/kakoune +[5]: https://opensource.com/article/20/3/ranger-file-navigator +[6]: https://opensource.com/sites/default/files/kakoune-screenshot.png (Kakoune) \ No newline at end of file diff --git a/published/202012/20201218 Find out how your text will be read with Norka.md b/published/202012/20201218 Find out how your text will be read with Norka.md new file mode 100644 index 0000000000..ef0c0c1b17 --- /dev/null +++ b/published/202012/20201218 Find out how your text will be read with Norka.md @@ -0,0 +1,71 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12961-1.html) +[#]: subject: (Find out how your text will be read with Norka) +[#]: via: (https://opensource.com/article/20/12/norka) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +了解如何使用 Norka 编辑器阅读文本 +====== + +> 这是一个素颜朝天的文本编辑器,旨在让你的写作能被更好地阅读和理解。 + +![](https://img.linux.net.cn/data/attachment/album/202012/28/003505f3h3pppkg7enpxi9.jpg) + +有些文本编辑器是为编程而设计的,有些是为专门的文本格式而设计的,有些是为文档设计而设计的。Norka 文本编辑器是为阅读而设计的。创建一个为*阅读*而设计的文本编辑器似乎很奇怪,但实际上,如果你仔细想想,这是很有意义的。你的文字已经写了一次或三次,这取决于你个人对迭代的容忍度,但它的目的是为了在未来几年内被阅读。Norka 让你轻松地专注于你的文字如何被阅读。 + +### 安装 + +Norka 文本编辑器是 MIT 授权的,可以[作为 Flatpak 包安装在 Linux上][2]。它是开源的,所以如果你想尝试在不同的平台上安装它,你可以[克隆它的 Github 仓库][3]。 + +### Norka 的界面 + +Norka 的界面很简单。一个回到 Norka 文档集的按钮,一个导出按钮和一个偏好菜单。窗口的其余部分是供你写文字的空白空间,在右下角,有一个阅读时间计算器来帮助你了解读者可能需要多长时间才能看完你写的东西。 + +![Dark Norka terminal box with green and white text][4] + +这几乎就是 Norka 的全部内容。没有分页符或行号,没有代码折叠或正则搜索。这是一个用于文字书写的编辑器,而不设置文档样式或跟踪复杂的数据模式。 + +当然,它还有一些额外的功能。如预期那样,可以使用 `Ctrl+C` 和 `Ctrl+V` 复制和粘贴。你可以用 `Ctrl+Z` 撤销,用 `Ctrl+F` 查找。你甚至可以用 `Ctrl+:` 插入表情符号。 + +![Norka terminal box with pop up box of emoji search menu][5] + +#### 样式文本 + +虽然 Norka 绝对没有兴趣帮你设计,比如说,一本小册子或传单,但它确实有一些能力来指示你想要的文本样式。它通过 [Markdown][6] 来实现这一点,这是一个简单的纯文本书写的约定,但用特殊的符号来指示文本应该如何在 HTML、EPUB 或 PDF 或任何你的目标格式中呈现。 + +在大多数编辑器中,你必须知道 Markdown 才能使用 Markdown,但 Norka 翻译了常见的文字处理器键盘快捷键来为你生成 Markdown。例如,要使一个单词加粗,你可以按 `Ctrl+B`,它会在光标的两边插入四个星号。当你输入下一个单词时,它的两边都会有两个星号,这就是 Markdown 对粗体(默认为粗体)文本的标记。你可以在 Norka 窗口右上角的汉堡样式的菜单中查看所有的 Markdown 快捷方式。 + +#### 保存和导出 + +你可以把 Norka 想象成一个笔记本。你在 Norka 中打开的所有文档都会保留在 Norka 的内部数据库中,所有的文档都会默认自动保存。要在 Norka 外使用文件,你可以在打开的文件中点击右上角的**共享**按钮。另外,你也可以在 Norka 的文件视图中右击任何文件,选择**导出**。你可以将文档导出(或**共享**,Norka 可互换使用这两个术语)为**文本**、**HTML** 或 **Markdown**。 + +### 尝试 Norka + +Norka 便于尝试,也易于使用。它通过保持界面简单,几乎到了受限的程度,帮助你专注于写作。但限制有时也是一种强大的创意工具。 + +Norka 可能不是你进行大量修改或文本处理的最佳选择。它没有让人激动的功能,比如大小写转换、集成 `sed` 命令、字符交换等等。它是一个为读者服务的文本编辑器。如果你觉得有用,那么你可能正是 Norka 正在寻找的受众。 + +感谢你花 2 分 39 秒阅读本文! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/norka + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/reading_book_selfcare_wfh_learning_education_520.png?itok=H6satV2u (Reading a book, selfcare) +[2]: https://flathub.org/apps/details/com.github.tenderowl.norka +[3]: https://github.com/TenderOwl/Norka +[4]: https://opensource.com/sites/default/files/uploads/norka-31_days-norka-opensource.png (Dark Norka terminal box with green and white text) +[5]: https://opensource.com/sites/default/files/uploads/norka_emoji-31_days-norka-opensource.png (Norka terminal box with pop up box of emoji search menu) +[6]: https://opensource.com/article/19/9/introduction-markdown diff --git a/published/202012/20201218 How to Install RPM Files on Fedora Linux -Beginner-s Tutorial.md b/published/202012/20201218 How to Install RPM Files on Fedora Linux -Beginner-s Tutorial.md new file mode 100644 index 0000000000..b64d1e0683 --- /dev/null +++ b/published/202012/20201218 How to Install RPM Files on Fedora Linux -Beginner-s Tutorial.md @@ -0,0 +1,122 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12958-1.html) +[#]: subject: (How to Install RPM Files on Fedora Linux [Beginner’s Tutorial]) +[#]: via: (https://itsfoss.com/install-rpm-files-fedora/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Fedora Linux 上安装 RPM 文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/26/182851bxi1lstdz13siuif.jpg) + +> 这篇初学者文章介绍如何在 Fedora 和 Red Hat Linux 上安装 RPM 软件包。它也随后向你展示如何移除这些 RPM 软件包。 + +当你开始使用 Red Hat 系的 Fedora Linux 时,你早晚会偶然发现 .rpm 文件。就像在 Windows 中的 .exe 文件,以及在 Ubuntu 和 Debian 中的 .deb 文件一样,一个 rpm 文件能够使你在 [Fedora][1] 上快速安装一个软件。 + +你可以从软件中心中找到并安装大量的软件,特别是 [如果你在 Fedora 中启用附加的存储库的话][2]。但是有时你会在它们的网站上找到可用的 RPM 格式的软件包。 + +就像在 Windows 中的 .exe 文件一样,你可以通过 **下载 .rpm 文件并双击它来安装**。不用担心,我将向你展示详细的步骤。 + +### 在 Fedora 和 Red Hat Linux 上安装 RPM 文件 + +我将向你展示安装 RPM 文件的三个方法: + + * [使用软件中心安装 RPM 文件][3](GUI 方法) + * [使用 DNF 命令安装 RPM 文件][4](CLI 方法) + * [使用 Yum 命令安装 RPM 文件][5](Red Hat 的 CLI 方法) + +#### 方法 1: 使用软件中心 + +在 Fedora 中使用默认的软件中心是最简单的方法。它真地很简单。转到你下载的 .rpm 文件的文件夹位置。它通常在 “Downloads” 文件夹。 + +只需要 **双击 RPM 文件,它将会在软件中心中打开**。 + +或者,你可以在 RPM 文件上右键单击并选择通过软件中心来安装它。 + +![或者双击或者右键并选择软件安装][6] + +当它在软件中心打开时,你应该会看到“安装”选项。只需要点击“安装”按钮并在提示时输入你的账号密码。 + +![通过 Fedora 软件中心安装 RPM][7] + +它很简单,对吗? + +#### 方法 2: 使用 DNF 命令来安装 RPM 文件 + +这是命令行方法。Fedora 使用新的 `dnf` [软件包管理器][8] ,你也可以使用它来安装下载的 RPM 文件。 + +打开一个终端并切换到你下载 RPM 文件的目录下。你也可以通过到 RPM 文件的路径。像这样使用 `dnf` 命令: + +``` +sudo dnf install rpm_file_name +``` + +这是一个我 [在 Fedora 上使用 dnf 命令安装 Google Chrome][9] 屏幕截图: + +![使用 DNF 命令安装 RPM 文件][10] + +#### 方法 3: 在 Red Hat 中使用 Yum 命令安装 RPM 文件 + +不像 Fedora ,Red Hat 仍然使用很好的旧式的 Yum 软件包管理器。在这里你还不能找到 `dnf` 命令。 + +这个过程与 `dnf` 命令相同。转到 RPM 文件所在的目录或提供它的路径。 + +``` +sudo yum install path_to_RPM_file +``` + +就是这样。没有一点异常花哨的东西。 + +### 如何移除 RPM 软件包 + +移除一个 RPM 软件包也不是一个什么大的问题。并且,你不需要原始的用来安装程序的 rpm 文件。 + +你可以在软件中心中找到已安装的软件包,并从其中移除应用程序。 + +![移除 RPM 软件包][11] + +或者,你可以使用带有 `remove` 选项的 `dnf` 或 `yum` 命令。 + +使用 `dnf` ,使用这个命令: + +``` +sudo dnf remove rpm_package_name +``` + +使用 `yum` ,使用这个命令: + +``` +sudo yum remove rpm_package_name +``` + +你可能不记得准确的软件包名称,没有关系。你可以做的是输入软件包的前几个字母,然后敲击 `tab` 按键。这是假设你已经启用 `tab` 按键补全,通常是这样的。 + +这就是你需要做的全部。相当简单,对吧?作为一个初学者,你可能会为这样一个简单的任务而挣扎,我希望像这样的快速教程会让你对 Fedora 更自信一些。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-rpm-files-fedora/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://getfedora.org/ +[2]: https://itsfoss.com/fedora-third-party-repos/ +[3]: tmp.TvkJtlRJ6T#gui-method +[4]: tmp.TvkJtlRJ6T#use-dnf +[5]: tmp.TvkJtlRJ6T#use-yum +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/installing-rpm-file-fedora.png?resize=800%2C449&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/install-rpm-fedora-software-center.jpg?resize=799%2C193&ssl=1 +[8]: https://itsfoss.com/package-manager/ +[9]: https://itsfoss.com/install-google-chrome-fedora/ +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/install-rpm-using-dnf-install.jpg?resize=800%2C474&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/remove-rpm-package-fedora.jpg?resize=790%2C190&ssl=1 diff --git a/published/202012/20201220 How to use this KDE Plasma text editor.md b/published/202012/20201220 How to use this KDE Plasma text editor.md new file mode 100644 index 0000000000..35662769db --- /dev/null +++ b/published/202012/20201220 How to use this KDE Plasma text editor.md @@ -0,0 +1,72 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12964-1.html) +[#]: subject: (How to use this KDE Plasma text editor) +[#]: via: (https://opensource.com/article/20/12/kwrite-kde-plasma) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +如何使用这个 KDE Plasma 文本编辑器? +====== + +> 作为流行的 KDE Plasma 桌面的一部分,KWrite 在一个简单易用的界面中隐藏了大量有用的功能。 + +![](https://img.linux.net.cn/data/attachment/album/202012/29/010557o53b649j66a1snjv.jpg) + +KWrite 是一款适用于 KDE Plasma 桌面的文本编辑器。它的目的是成为一个通用的应用,任何人都可以在他们需要快速做笔记、写一篇学校论文、做一些编程,和/或任何其他你能想到的文本编辑器能做的事时用上它。它使用 [Kate 编辑器][2]的组件来创建一个简单的界面,但它利用这些相同的组件来提供了大量有用的功能。 + +### 安装 + +KWrite 不可用于所有环境,它是 [KDE Plasma 桌面][3]的一个组件,所以如果你正在运行 Plasma,那么你已经有了 KWrite。 + +如果你没有运行 Plasma,那么你可以安装 Plasma,这样你可以将它和 KWrite 一起开始使用,或者根据需要使用 KWrite。然而,它是作为 Plasma 桌面的默认文本编辑器,所以如果你真的想把它作为一个独立应用使用,那么安装 Kate 可能更容易。 + +### 使用 KWrite + +当你启动 KWrite 时,你会看到期望的编辑器的样子:一大块用于输入的区域,顶部有一个菜单栏和工具栏,底部有一个状态栏。这就是你在开始之前需要了解的全部内容。KWrite 是一个直观的应用,工具栏按钮用于重要的动作,如打开和保存文件,简单的菜单系统用于更高级的编辑任务。 + +![Kwrite terminal containing dark gray html code on white background][4] + +KWrite 的许多功能都是潜在的,不需要你自己去激活它们就会发生。例如,如果你打开一个用 HTML 编写的文件,那么 KWrite 会高亮显示关键字(如 `class` 和 `id`)和识别代码标签(如 `

        ` 或 `

        `),并将它们与自然语言的单词区别对待。当你加载一个用 Python 编写的文件时,也会发生同样的情况,而对于主要用自然语言编写的文件,则不会发生任何事情。 + +当然,你不必只选择 HTML、Python 和你的母语。KWrite 支持很多语言和格式(对于很多语言和格式,它甚至有自动完成选项)。 + +对于那些想要除了自动加载功能之外更多功能的用户,在编辑、视图和工具菜单中都有一些选项。例如,你可以激活动态的拼写检查、运行脚本、调出命令行、注释或取消注释一行、调整缩进、显示行号等等。 + +当从终端启动 KWrite 时,也有一些有趣的选项。例如,如果你知道要到文件中的哪一行,你可以用行号参数启动 KWrite: + +``` +$ kwrite --line 101 example.txt +``` + +你也可以使用 `--stdin` (或简写 `-i`)选项方便地将命令的输出通过管道到 KWrite。例如,这个命令下载 [example.com][5] 的首页,并在一个新的 KWrite 窗口中显示 HTML: + +``` +$ curl http://example.com | kwrite --stdin +``` + +### 尝试 KWrite + +我一直觉得 KDE 的优势之一就是它的复杂性很灵活。如果你想要一个简单的桌面,你基本上可以选择忽略任何你不想要的功能。KWrite 就是这种灵活性也适用于开发人员的一个例子。由于 Kate 具有许多功能,所以开发者有能够重用这些功能的一个子集来创建一个更干净、更专注的应用版本。 + +KWrite 是一个单文档编辑器。它没有标签,也没有任何“项目”的意识。它的目的是为那些想一次只处理一个文档的人准备的,他们希望基本的功能在默认情况下是激活的,在需要的时候可以选择强大的编辑工具。安装优秀的 Plasma 桌面,今天就来试试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/kwrite-kde-plasma + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://opensource.com/article/20/12/kate-text-editor +[3]: https://opensource.com/article/19/12/linux-kde-plasma +[4]: https://opensource.com/sites/default/files/uploads/kwrite-31_days_kwrite-opensource.png (Kwrite terminal containing dark gray html code on white background) +[5]: http://example.com diff --git a/published/202012/20201221 4 cool new projects to try in COPR from December 2020.md b/published/202012/20201221 4 cool new projects to try in COPR from December 2020.md new file mode 100644 index 0000000000..b35553cb9d --- /dev/null +++ b/published/202012/20201221 4 cool new projects to try in COPR from December 2020.md @@ -0,0 +1,118 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12971-1.html) +[#]: subject: (4 cool new projects to try in COPR from December 2020) +[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-from-december/) +[#]: author: (Jakub Kadlčík https://fedoramagazine.org/author/frostyx/) + +COPR 仓库中 4 个很酷的新项目(2020.12) +====== + +![][1] + +COPR 是个人软件仓库[集合][2],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。 + +本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 [COPR 用户文档][3]。 + +### Blanket + +[Blanket][5] 是一款播放背景声音的应用,它可能会提高你的注意力,提高你的工作效率。另外,它还可以帮助你在嘈杂的环境中放松和入睡。无论何时何地,Blanket 都可以让你在鸟鸣中醒来,在咖啡店聊天声或远离城市交通喧嚣的友好氛围下工作,然后在外面淅淅沥沥的雨声中像木头一样沉睡在壁炉旁边。还有其他流行的背景音选择,如粉色和白色噪音。 + +![][6] + +#### 安装说明 + +目前[仓库][8]为 Fedora 32 和 33 提供了 Blanket。要安装它,请使用以下命令: + +``` +sudo dnf copr enable tuxino/blanket +sudo dnf install blanket +``` + +### k9s + +[k9s][10] 是一个管理 Kubernetes 集群的命令行工具。它可以让你列出正在运行的 pod 并与之交互,读取它们的日志,挖掘已使用的资源,并总体上使操作 Kubernetes 更轻松。通过插件和可定制的用户界面的可扩展性,k9s 受到有经验用户的欢迎。 + + +![][11] + +有关[更多预览截图][12],请参见[项目页面][10]。 + +#### 安装说明 + +目前[仓库][14]为 Fedora 32、33、Fedora Rawhide 以及 EPEL 7、8、Centos Stream 等提供 k9s。要安装它,请使用以下命令: + +``` +sudo dnf copr enable luminoso/k9s +sudo dnf install k9s +``` + +### rhbzquery + +[rhbzquery][16] 是一个简单的查询 Fedora Bugzilla 的工具。它提供了一个指定搜索查询的界面,但它并不在命令行中列出结果,而是由 rhbzquery 生成 Bugzilla 的 URL,并在浏览器中打开。 + +![][17] + +#### 安装说明 + +目前[仓库][19]为 Fedora 32、33 和 Fedora Rawhide 提供 rhbzquery。要安装它,请使用以下命令: + +``` +sudo dnf copr enable petersen/rhbzquery +sudo dnf install rhbzquery +``` + +### gping + +[gping][21] 是一个比标准的 `ping` 命令更有视觉吸引力的选择,因为它以图表的形式显示结果。也可以同时 ping 多个主机,以方便比较它们的响应时间。 + +![][22] + +#### 安装说明 + +目前[仓库][24]为 Fedora 32、33、Fedora Rawhide 以及 EPEL 7 和 8 提供了 gping。要安装它,请使用以下命令: + +``` +sudo dnf copr enable atim/gping +sudo dnf install gping +``` + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-from-december/ + +作者:[Jakub Kadlčík][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/frostyx/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2017/08/4-copr-945x400.jpg +[2]: https://copr.fedorainfracloud.org/ +[3]: https://docs.pagure.org/copr.copr/user_documentation.html +[4]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#blanket +[5]: https://github.com/rafaelmardojai/blanket +[6]: https://github.com/FrostyX/fedora-magazine/raw/main/img/blanket.png +[7]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#installation-instructions +[8]: https://copr.fedorainfracloud.org/coprs/tuxino/blanket/ +[9]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#k9s +[10]: https://k9scli.io/ +[11]: https://github.com/FrostyX/fedora-magazine/raw/main/img/k9s.png +[12]: https://k9scli.io/#-previews +[13]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#installation-instructions-1 +[14]: https://copr.fedorainfracloud.org/coprs/luminoso/k9s/ +[15]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#rhbzquery +[16]: https://github.com/juhp/rhbzquery +[17]: https://github.com/FrostyX/fedora-magazine/raw/main/img/rhbzquery.png +[18]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#installation-instructions-2 +[19]: https://copr.fedorainfracloud.org/coprs/petersen/rhbzquery/ +[20]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#gping +[21]: https://github.com/orf/gping +[22]: https://github.com/FrostyX/fedora-magazine/raw/main/img/gping.png +[23]: https://github.com/FrostyX/fedora-magazine/blob/main/2020-december.md#installation-instructions-4 +[24]: https://copr.fedorainfracloud.org/coprs/atim/gping diff --git a/published/202012/20201222 4 reasons businesses adopted open source in 2020.md b/published/202012/20201222 4 reasons businesses adopted open source in 2020.md new file mode 100644 index 0000000000..fc777240bc --- /dev/null +++ b/published/202012/20201222 4 reasons businesses adopted open source in 2020.md @@ -0,0 +1,54 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12967-1.html) +[#]: subject: (4 reasons businesses adopted open source in 2020) +[#]: via: (https://opensource.com/article/20/12/open-source-survey) +[#]: author: (Chris Grams https://opensource.com/users/cgrams) + +2020 年企业采用开源的 4 个原因 +====== + +> 根据 Tidelift 的第三次开源管理调查,根据公司规模,出现了差异。 + +![](https://img.linux.net.cn/data/attachment/album/202012/30/062849dn8amhiait1cvnne.jpg) + +Tidelift 的[第三次开源管理调查][2]发现,企业在大流行期间正在转向开源,44% 的组织报告他们将增加使用开源进行应用开发。 + +我们以前见过类似现象。在以前的经济衰退中,组织转向开源[以节省成本][3],并因[其它一些转型收益][4]而留下来。我们想了解哪些长期收益对不同规模的组织最有帮助。以下是我们发现的摘要。 + +**开源正在推动成本和时间的节约,同时提高效率。** 68% 的组织提到的一个关键驱动力是节约资金和开发时间,因为使用开源减少了开发人员从头开始编写新代码的时间。近半数(48%)报告称,它提高了应用开发和维护效率。拥有超过 1000 名员工的组织更有可能将此作为鼓励使用更多开源的原因(61%,而少于 1000 人的组织为 41%)。 + +![Graph showing reasons for using open source][5] + +*(Tidelift ©2020)* + +**在组织使用更多的开源的原因中,消除供应商锁定是一个重要原因。** 我们发现 40% 的受访者将这视为主要原因。用开源软件取代昂贵的专有软件,可以确保组织更加灵活,避免对供应商的依赖。同样,规模较大的组织也倾向于这个原因。在拥有 1000 名以上员工的组织中,有 50% 的组织将此作为主要优势。 + +**增加开发人员的满意度是使用更多开源的另一个原因,有 31% 的组织提到了这一点。** 随着企业对人才的激烈竞争,他们了解确保开发人员在工作中和使用的工具中感到快乐的价值。调查发现,开发人员使用的前三种语言是 JavaScript(78%)、Python(52%)和 Java(41%)。 + +**此外,随着开源使用量的增加,83% 的组织继续对其贡献,近一半的组织制定了管理贡献的政策。** 这些政策包括:在工作时间对组织使用但不赞助或管理的项目的贡献、对他们赞助或管理的项目的贡献、在个人时间对与工作无关的(个人)项目的贡献、以及在工作时间对与工作无关的(个人)项目的贡献。 + +虽然向开源的长期迁移仍在继续,但很明显,COVID-19 的影响可能正在加速这一进程,组织继续从使用和贡献中获得更深层次的价值。 + +更多信息,请查看 [2020 年开源管理调查][2]的所有调查结果。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/open-source-survey + +作者:[Chris Grams][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/cgrams +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_graph_stats_blue.png?itok=OKCc_60D (Metrics and a graph illustration) +[2]: https://www.tidelift.com/subscription/2020-managed-open-source-survey +[3]: https://blog.tidelift.com/the-third-wave-of-open-source-migration?utm_source=opensource&utm_medium=referral&utm_campaign=2020-survey +[4]: https://blog.tidelift.com/theres-one-thing-stopping-developers-from-using-open-source-even-more?utm_source=opensource&utm_medium=referral&utm_campaign=2020-survey +[5]: https://opensource.com/sites/default/files/uploads/tidelift_reasons-for-using-open-source.png (Graph showing reasons for using open source) diff --git a/published/202012/20201222 Font Manager- A Simple Open-Source App for GTK- Desktop.md b/published/202012/20201222 Font Manager- A Simple Open-Source App for GTK- Desktop.md new file mode 100644 index 0000000000..e2ac8d1ebd --- /dev/null +++ b/published/202012/20201222 Font Manager- A Simple Open-Source App for GTK- Desktop.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12968-1.html) +[#]: subject: (Font Manager: A Simple Open-Source App for GTK+ Desktop) +[#]: via: (https://itsfoss.com/font-manager/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Font Manager:一个简单的 GTK+ 桌面的开源应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202012/30/065754mx4363qxabe8y9z0.jpg) + +> 一个非常简单的字体管理器应用,让你专注于调整 Linux 系统上的字体。 + +如果你是一个有经验的 Linux 用户,你可能会利用终端或 [调整工具][1]来管理你的 Linux 系统的字体。 + +老实说,不管 GNOME 调整工具有多有用,但是用来管理字体可能会不太够用。因此,一个单独的应用可以很好地帮助你管理字体。 + +### Font Manager:一个帮助管理字体的开源应用 + +![][2] + +Font Manager(这就是应用的字面名称)是一个专门帮助你管理字体的应用。 + +你可以获得字体族的详细信息、可用的变体,以及根据字体的高度、宽度、间距等进行过滤和调整的功能。考虑到它是一个简单的应用,因此你找不到很多功能,但是我将在下面简要介绍一些功能。 + +### Font Manager 的功能 + +![][3] + +* 可以添加字体 +* 可以删除字体 +* 根据字体族、供应商、间距、高度等因素轻松筛选字体 +* 调整字体的缩放系数 +* 调整字体的抗锯齿(软度/锐度) +* 添加字体源,以便在安装前进行预览 +* 提供快速管理的键盘快捷键 +* 开箱即用的谷歌字体集成 +* 获取关于字体族中可用字符的详细信息、许可证、字体大小、供应商、文件类型、间距、宽度和样式 + +![][4] + +总的来说,你可以轻松安装或删除字体。但是,当你管理字体时,你会得到很多帮助,如上面的截图所示。 + +### 在 Linux 上安装 Font Manager + +你有多种选择(取决于你使用的 Linux 发行版)进行安装。 + +如果你使用的是基于 Ubuntu 的发行版,你可以通过下面的命令轻松添加 PPA 来安装 Font Manager: + +``` +sudo add-apt-repository ppa:font-manager/staging +sudo apt update +sudo apt install font-manager +``` + +如果你不喜欢 [PPA][5](我更喜欢这样安装),你也可以在任何 Linux 发行版上安装一个[可用的 Flatpak 包][6]。 + +你只需要在你的 Linux 系统上启用 Flatpak,然后在你的软件中心搜索它(如果它支持 Flatpak 集成的话),或者直接输入下面的命令安装它: + +``` +flatpak install flathub org.gnome.FontManager +``` + +如果你是 Arch 用户,你可以在 [AUR][8] 中找到[包][7]。 + + +更多的安装说明,你可以参考它的[官网][9]和 [GitHub 页面][10]。 + +- [下载 Font Manager][9] + +### 总结 + +Font Manager 是一个简单的解决方案,适用于任何基于 GTK+ 的桌面环境。主要用于 GNOME,但你在其他桌面环境使用它。 + +你可以得到很多有用的信息,同时可以添加或删除字体,我想这显然是一个真正的字体管理器。 + +你对 Font Manager 有什么看法?在下面的评论中告诉我你的想法吧! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/font-manager/ + +作者:[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://itsfoss.com/gnome-tweak-tool/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/font-manager.png?resize=800%2C565&ssl=1 +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/12/font-manager-settings.jpg?resize=800%2C569&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/12/font-manager-showcase.png?resize=800%2C571&ssl=1 +[5]: https://itsfoss.com/ppa-guide/ +[6]: https://flathub.org/apps/details/org.gnome.FontManager +[7]: https://aur.archlinux.org/packages/font-manager/ +[8]: https://itsfoss.com/aur-arch-linux/ +[9]: https://fontmanager.github.io/ +[10]: https://github.com/FontManager/font-manager diff --git a/published/202101/20160302 Go channels are bad and you should feel bad.md b/published/202101/20160302 Go channels are bad and you should feel bad.md new file mode 100644 index 0000000000..74c9a6d10f --- /dev/null +++ b/published/202101/20160302 Go channels are bad and you should feel bad.md @@ -0,0 +1,445 @@ +[#]: collector: (lujun9972) +[#]: translator: (gxlct008) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12984-1.html) +[#]: subject: (Go channels are bad and you should feel bad) +[#]: via: (https://www.jtolio.com/2016/03/go-channels-are-bad-and-you-should-feel-bad) +[#]: author: (jtolio.com https://www.jtolio.com/) + +Go 通道是糟糕的,你应该也觉得很糟糕 +====== + +![](https://img.linux.net.cn/data/attachment/album/202101/05/101049y2995vz8l9mdg4bz.jpg) + +更新:如果你是从一篇题为 《[糟糕的 Go 语言](https://github.com/ksimka/go-is-not-good)》 的汇编文章看到这篇博文的话,那么我想表明的是,我很惭愧被列在这样的名单上。Go 绝对是我使用过的最不糟糕的的编程语言。在我写作本文时,我是想遏制我所看到的一种趋势,那就是过度使用 Go 的一些较复杂的部分。我仍然认为 +通道Channel可以更好,但是总体而言,Go 很棒。这就像你最喜欢的工具箱中有 [这个工具][1];它可以有用途(甚至还可能有更多的用途),它仍然可以成为你最喜欢的工具箱! + +更新 2:如果我没有指出这项对真实问题的优秀调查,那我将是失职的:《[理解 Go 中的实际并发错误][2]》。这项调查的一个重要发现是...Go 通道会导致很多错误。 + +从 2010 年中后期开始,我就断断续续地在使用 Google 的 [Go 编程语言][3],自 2012 年 1 月开始(在 Go 1.0 之前!),我就用 Go 为 [Space Monkey][4] 编写了合规的产品代码。我对 Go 的最初体验可以追溯到我在研究 Hoare 的 [通信顺序进程][5] 并发模型和 [Matt Might][7] 的 [UCombinator 研究组][8] 下的 [π-演算][6] 时,作为我([现在已重定向][9])博士工作的一部分,以更好地支持多核开发。Go 就是在那时发布的(多么巧合啊!),我当即就开始学习尝试了。 + +它很快就成为了 Space Monkey 开发的核心部分。目前,我们在 Space Monkey 的生产系统有超过 42.5 万行的纯 Go 代码(_不_ 包括我们所有的 vendored 库中的代码量,这将使它接近 150 万行),所以也并不是你见过的最多的 Go 代码,但是对于相对年轻的语言,我们是重度用户。我们之前 [写了我们的 Go 使用情况][10]。也开源了一些使用率很高的库;许多人似乎是我们的 [OpenSSL 绑定][11](比 [crypto/tls][12] 更快,但请保持 openssl 本身是最新的!)、我们的 [错误处理库][13]、[日志库][14] 和 [度量标准收集库/zipkin 客户端][15] 的粉丝。我们使用 Go、我们热爱 Go、我们认为它是目前为止我们使用过的最不糟糕的、符合我们需求的编程语言。 + +尽管我也不认为我能说服自己不要提及我的广泛避免使用 [goroutine-local-storage 库][16] (尽管它是一个你不应该使用的魔改技巧,但它是一个漂亮的魔改),希望我的其他经历足以证明我在解释我故意煽动性的帖子标题之前知道我在说什么。 + +![][17] + +### 等等,什么? + +如果你在大街上问一个有名的程序员,Go 有什么特别之处? 她很可能会告诉你 Go 最出名的是通道Channels 和 goroutine。 Go 的理论基础很大程度上是建立在 Hoare 的 CSP(通信顺序进程Communicating Sequential Processes)模型上的,该模型本身令人着迷且有趣,我坚信,到目前为止,它产生的收益远远超过了我们的预期。 + +CSP(和 π-演算)都使用通信作为核心同步原语,因此 Go 会有通道是有道理的。Rob Pike 对 CSP 着迷(有充分的理由)[相当深][18] 已经有一段时间了。([当时][19] 和 [现在][20])。 + +但是从务实的角度来看(也是 Go 引以为豪的),Go 把通道搞错了。在这一点上,通道的实现在我的书中几乎是一个坚实的反模式。为什么这么说呢?亲爱的读者,让我细数其中的方法。 + +#### 你可能最终不会只使用通道 + +Hoare 的 “通信顺序进程” 是一种计算模型,实际上,唯一的同步原语是在通道上发送或接收的。一旦使用 互斥量mutex信号量semaphore条件变量condition variable、bam,你就不再处于纯 CSP 领域。 Go 程序员经常通过高呼 “[通过交流共享内存][22]” 的 [缓存的思想][21] 来宣扬这种模式和哲学。 + +那么,让我们尝试在 Go 中仅使用 CSP 编写一个小程序!让我们成为高分接收者。我们要做的就是跟踪我们看到的最大的高分值。如此而已。 + +首先,我们将创建一个 `Game` 结构体。 + +``` +type Game struct { + bestScore int + scores chan int +} +``` + +`bestScore` 不会受到互斥量mutex的保护!这很好,因为我们只需要一个 goroutine 来管理其状态并通过通道来接收新的分值即可。 + +``` +func (g *Game) run() { + for score := range g.scores { + if g.bestScore < score { + g.bestScore = score + } + } +} +``` + +好的,现在我们将创建一个有用的构造函数来开始 `Game`。 + +``` +func NewGame() (g *Game) { + g = &Game{ + bestScore: 0, + scores: make(chan int), + } + go g.run() + return g +} +``` + +接下来,假设有人给了我们一个可以返回分数的 `Player`。它也可能会返回错误,因为可能传入的 TCP 流可能会死掉或发生某些故障,或者玩家退出。 + +``` +type Player interface { + NextScore() (score int, err error) +} +``` + +为了处理 `Player`,我们假设所有错误都是致命的,并将获得的比分向下传递到通道。 + +``` +func (g *Game) HandlePlayer(p Player) error { + for { + score, err := p.NextScore() + if err != nil { + return err + } + g.scores <- score + } +} +``` + +好极了!现在我们有了一个 `Game` 类型,可以以线程安全的方式跟踪 `Player` 获得的最高分数。 + +你圆满完成了自己的开发工作,并开始拥有客户。你将这个游戏服务器公开,就取得了令人难以置信的成功!你的游戏服务器上也许正在创建许多游戏。 + +很快,你发现人们有时会离开你的游戏。许多游戏不再有任何玩家在玩,但没有任何东西可以阻止游戏运行的循环。死掉的 `(*Game).run` goroutines 让你不知所措。 + +**挑战:** 在无需互斥量或 panics 的情况下修复上面的 goroutine 泄漏。实际上,可以滚动到上面的代码,并想出一个仅使用通道来解决此问题的方案。 + +我等着。 + +就其价值而言,它完全可以只通过通道来完成,但是请观察以下解决方案的简单性,它甚至没有这个问题: + +``` +type Game struct { + mtx sync.Mutex + bestScore int +} + +func NewGame() *Game { + return &Game{} +} + +func (g *Game) HandlePlayer(p Player) error { + for { + score, err := p.NextScore() + if err != nil { + return err + } + g.mtx.Lock() + if g.bestScore < score { + g.bestScore = score + } + g.mtx.Unlock() + } +} +``` + +你想选择哪一个?不要被欺骗了,以为通道的解决方案可以使它在更复杂的情况下更具可读性和可理解性。拆解Teardown是非常困难的。这种拆解若用互斥量mutex来做那只是小菜一碟,但最困难的是只使用 Go 专用通道来解决。另外,如果有人回复说发送通道的通道更容易推理,我马上就是感到头疼。 + +重要的是,这个特殊的情况可能真的 **很容易** 解决,而通道有一些运行时的帮助,而 Go 没有提供!不幸的是,就目前的情况来看,与 Go 的 CSP 版本相比,使用传统的同步原语synchronization primitives可以更好地解决很多问题,这是令人惊讶的。稍后,我们将讨论 Go 可以做些什么来简化此案例。 + +**练习:** 还在怀疑? 试着让上面两种解决方案(只使用通道与只使用互斥量channel-only vs mutex-only)在一旦 `bestScore` 大于或等于 100 时,就停止向 `Players` 索要分数。继续打开你的文本编辑器。这是一个很小的玩具问题。 + +这里的总结是,如果你想做任何实际的事情,除了通道之外,你还会使用传统的同步原语。 + +#### 通道比你自己实现要慢一些 + +Go 如此重视 CSP 理论,我认为其中一点就是,运行时应该可以通过通道做一些杀手级的调度优化。也许通道并不总是最直接的原语,但肯定是高效且快速的,对吧? + +![][23] + +正如 [Dustin Hiatt][24] 在 [Tyler Treat’s post about Go][25] 上指出的那样, + +> 在幕后,通道使用锁来序列化访问并提供线程安全性。 因此,通过使用通道同步对内存的访问,你实际上就是在使用锁。 被包装在线程安全队列中的锁。 那么,与仅仅使用标准库 `sync` 包中的互斥量相比,Go 的花式锁又如何呢? 以下数字是通过使用 Go 的内置基准测试功能,对它们的单个集合连续调用 Put 得出的。 + +``` +> BenchmarkSimpleSet-8 3000000 391 ns/op +> BenchmarkSimpleChannelSet-8 1000000 1699 ns/o +> +``` + +无缓冲通道的情况与此类似,甚至是在争用而不是串行运行的情况下执行相同的测试。 + +也许 Go 调度器会有所改进,但与此同时,良好的旧互斥量和条件变量是非常好、高效且快速。如果你想要提高性能,请使用久经考验的方法。 + +#### 通道与其他并发原语组合不佳 + +好的,希望我已经说服了你,有时候,你至少还会与除了通道之外的原语进行交互。标准库似乎显然更喜欢传统的同步原语而不是通道。 + +你猜怎么着,正确地将通道与互斥量和条件变量一起使用,其实是有一定的挑战性的。 + +关于通道的一个有趣的事情是,通道发送是同步的,这在 CSP 中是有很大意义的。通道发送和通道接收的目的是为了成为同步屏蔽,发送和接收应该发生在同一个虚拟时间。如果你是在执行良好的 CSP 领域,那就太好了。 + +![][26] + +实事求是地说,Go 通道也有多种缓冲方式。你可以分配一个固定的空间来考虑可能的缓冲,以便发送和接收是不同的事件,但缓冲区大小是有上限的。Go 并没有提供一种方法来让你拥有任意大小的缓冲区 —— 你必须提前分配缓冲区大小。 *这很好*,我在邮件列表上看到有人在争论,*因为无论如何内存都是有限的*。 + +What。 + +这是个糟糕的答案。有各种各样的理由来使用一个任意缓冲的通道。如果我们事先知道所有的事情,为什么还要使用 `malloc` 呢? + +没有任意缓冲的通道意味着在 *任何* 通道上的幼稚发送可能会随时阻塞。你想在一个通道上发送,并在互斥下更新其他一些记账吗?小心!你的通道发送可能被阻塞! + +``` +// ... +s.mtx.Lock() +// ... +s.ch <- val // might block! +s.mtx.Unlock() +// ... +``` + +这是哲学家晚餐大战的秘诀。如果你使用了锁,则应该迅速更新状态并释放它,并且尽可能不要在锁下做任何阻塞。 + +有一种方法可以在 Go 中的通道上进行非阻塞发送,但这不是默认行为。假设我们有一个通道 `ch := make(chan int)`,我们希望在其上无阻塞地发送值 `1`。以下是在不阻塞的情况下你必须要做的最小量的输入: + +``` +select { +case ch <- 1: // it sent +default: // it didn't +} +``` + +对于刚入门的 Go程序员来说,这并不是自然而然就能想到的事情。 + +综上所述,因为通道上的很多操作都会阻塞,所以需要对哲学家及其就餐仔细推理,才能在互斥量的保护下,成功地将通道操作与之并列使用,而不会造成死锁。 + +#### 严格来说,回调更强大,不需要不必要的 goroutines + +![][27] + +每当 API 使用通道时,或者每当我指出通道使某些事情变得困难时,总会有人会指出我应该启动一个 goroutine 来读取该通道,并在读取该通道时进行所需的任何转换或修复。 + +呃,不。如果我的代码位于热路径中怎么办?需要通道的实例很少,如果你的 API 可以设计为使用互斥量mutexes信号量semaphores回调callbacks,而不使用额外的 goroutine (因为所有事件边缘都是由 API 事件触发的),那么使用通道会迫使我在资源使用中添加另一个内存分配堆栈。是的,goroutine 比线程轻得多,但更轻量并不意味着是最轻量。 + +正如我以前 [在一篇关于使用通道的文章的评论中争论过的][28](呵呵,互联网),如果你使用回调而不是通道,你的 API *总是* 可以更通用,*总是* 更灵活,而且占用的资源也会大大减少。“总是” 是一个可怕的词,但我在这里是认真的。有证据级的东西在进行。 + +如果有人向你提供了一个基于回调的 API,而你需要一个通道,你可以提供一个回调,在通道上发送,开销不大,灵活性十足。 + +另一方面,如果有人提供了一个基于通道的 API 给你,而你需要一个回调,你必须启动一个 goroutine 来读取通道,*并且* 你必须希望当你完成读取时,没有人试图在通道上发送更多的东西,这样你就会导致阻塞的 goroutine 泄漏。 + +对于一个超级简单的实际例子,请查看 [context 接口][29](顺便说一下,它是一个非常有用的包,你应该用它来代替 [goroutine 本地存储][16])。 + +``` +type Context interface { + ... + // Done returns a channel that closes when this work unit should be canceled. + // Done 返回一个通道,该通道在应该取消该工作单元时关闭。 + Done() <-chan struct{} + + // Err returns a non-nil error when the Done channel is closed + // 当 Done 通道关闭时,Err 返回一个非 nil 错误 + Err() error + ... +} +``` + +想象一下,你要做的只是在 `Done()` 通道触发时记录相应的错误。你该怎么办?如果你没有在通道中选择的好地方,则必须启动 goroutine 进行处理: + +``` +go func() { + <-ctx.Done() + logger.Errorf("canceled: %v", ctx.Err()) +}() +``` + +如果 `ctx` 在不关闭返回 `Done()` 通道的情况下被垃圾回收怎么办?哎呀!这正是一个 goroutine 泄露! + +现在假设我们更改了 `Done` 的签名: + +``` +// Done calls cb when this work unit should be canceled. +Done(cb func()) +``` + +首先,现在日志记录非常容易。看看:`ctx.Done(func() { log.Errorf ("canceled:%v", ctx.Err()) })`。但是假设你确实需要某些选择行为。你可以这样调用它: + +``` +ch := make(chan struct{}) +ctx.Done(func() { close(ch) }) +``` + +瞧!通过使用回调,不会失去表现力。 `ch` 的工作方式类似于用于返回的通道 `Done()`,在日志记录的情况下,我们不需要启动整个新堆栈。我必须保留堆栈跟踪信息(如果我们的日志包倾向于使用它们);我必须避免将其他堆栈分配和另一个 goroutine 分配给调度程序。 + +下次你使用通道时,问问你自己,如果你用互斥量和条件变量代替,是否可以消除一些 goroutine ? 如果答案是肯定的,那么修改这些代码将更加有效。而且,如果你试图使用通道只是为了在集合中使用 `range` 关键字,那么我将不得不请你放下键盘,或者只是回去编写 Python 书籍。 + +![more like Zooey De-channel, amirite][30] + +#### 通道 API 不一致,只是 cray-cray + +在通道已关闭的情况下,执行关闭或发送消息将会引发 panics!为什么呢? 如果想要关闭通道,你需要在外部同步它的关闭状态(使用互斥量等,这些互斥量的组合不是很好!),这样其他写入者才不会写入或关闭已关闭的通道,或者只是向前冲,关闭或写入已关闭的通道,并期望你必须恢复所有引发的 panics。 + +这是多么怪异的行为。 Go 中几乎所有其他操作都有避免 panic 的方法(例如,类型断言具有 `, ok =` 模式),但是对于通道,你只能自己动手处理它。 + +好吧,所以当发送失败时,通道会出现 panic。我想这是有一定道理的。但是,与几乎所有其他带有 nil 值的东西不同,发送到 nil 通道不会引发 panic。相反,它将永远阻塞!这很违反直觉。这可能是有用的行为,就像在你的除草器上附加一个开罐器,可能有用(在 Skymall 可以找到)一样,但这肯定是意想不到的。与 nil 映射(执行隐式指针解除引用),nil 接口(隐式指针解除引用),未经检查的类型断言以及其他所有类型交互不同,nil 通道表现出实际的通道行为,就好像为该操作实例化了一个全新的通道一样。 + +接收的情况稍微好一点。在已关闭的通道上执行接收会发生什么?好吧,那会是有效操作——你将得到一个零值。好吧,我想这是有道理的。奖励!接收允许你在收到值时进行 `, ok =` 样式的检查,以确定通道是否打开。谢天谢地,我们在这里得到了 `, ok =`。 + +但是,如果你从 nil 渠道接收会发生什么呢? *也是永远阻塞!* 耶!不要试图利用这样一个事实:如果你关闭了通道,那么你的通道是 nil! + +### 通道有什么好处? + +当然,通道对于某些事情是有好处的(毕竟它们是一个通用容器),有些事情你只能用它们来做(比如 `select`)。 + +#### 它们是另一种特殊情况下的通用数据结构 + +Go 程序员已经习惯于对泛型的争论,以至于我一提起这个词就能感觉到 PTSD(创伤后应激障碍)的到来。我不是来谈论这件事的,所以擦擦额头上的汗,让我们继续前进吧。 + +无论你对泛型的看法是什么,Go 的映射、切片和通道都是支持泛型元素类型的数据结构,因为它们已经被特殊封装到语言中了。 + +在一种不允许你编写自己的泛型容器的语言中,任何允许你更好地管理事物集合的东西都是有价值的。在这里,通道是一个支持任意值类型的线程安全数据结构。 + +所以这很有用!我想这可以省去一些陈词滥调。 + +我很难把这算作是通道的胜利。 + +#### Select + +使用通道可以做的主要事情是 `select` 语句。在这里,你可以等待固定数量的事件输入。它有点像 epoll,但你必须预先知道要等待多少个套接字。 + +这是真正有用的语言功能。如果不是 `select`,通道将被彻底清洗。但是我的天呐,让我告诉你,第一次决定可能需要在多个事物中选择,但是你不知道有多少项,因此必须使用 `reflect.Select`。 + +### 通道如何才能更好? + +很难说 Go 语言团队可以为 Go 2.0 做的最具战术意义的事情是什么(Go 1.0 兼容性保证很好,但是很费劲),但这并不能阻止我提出一些建议。 + +#### 在条件变量上的 Select ! + +我们可以不需要通道!这是我提议我们摆脱一些“圣牛sacred cows”(LCTT 译注:神圣不可质疑的事物)的地方,但是让我问你,如果你可以选择任何自定义同步原语,那会有多棒?(答:太棒了。)如果有的话,我们根本就不需要通道了。 + +#### GC 可以帮助我们吗? + +在第一个示例中,如果我们能够使用定向类型的通道垃圾回收(GC)来帮助我们进行清理,我们就可以轻松地解决通道的高分服务器清理问题。 + +![][31] + +如你所知,Go 具有定向类型的通道。 你可以使用仅支持读取的通道类型(`<-chan`)和仅支持写入的通道类型(`chan<-`)。 这太棒了! + +Go 也有垃圾回收功能。 很明显,某些类型的记账方式太繁琐了,我们不应该让程序员去处理它们。 我们清理未使用的内存! 垃圾回收非常有用且整洁。 + +那么,为什么不帮助清理未使用或死锁的通道读取呢? 与其让 `make(chan Whatever)` 返回一个双向通道,不如让它返回两个单向通道(`chanReader, chanWriter:= make(chan Type)`)。 + +让我们重新考虑一下最初的示例: + +``` +type Game struct { + bestScore int + scores chan<- int +} + +func run(bestScore *int, scores <-chan int) { + // 我们不会直接保留对游戏的引用,因为这样我们就会保留着通道的发送端。 + for score := range scores { + if *bestScore < score { + *bestScore = score + } + } +} + +func NewGame() (g *Game) { + // 这种 make(chan) 返回风格是一个建议 + scoreReader, scoreWriter := make(chan int) + g = &Game{ + bestScore: 0, + scores: scoreWriter, + } + go run(&g.bestScore, scoreReader) + return g +} + +func (g *Game) HandlePlayer(p Player) error { + for { + score, err := p.NextScore() + if err != nil { + return err + } + g.scores <- score + } +} +``` + +如果垃圾回收关闭了一个通道,而我们可以证明它永远不会有更多的值,那么这个解决方案是完全可行的。是的,是的,`run` 中的评论暗示着有一把相当大的枪瞄准了你的脚,但至少现在这个问题可以很容易地解决了,而以前确实不是这样。此外,一个聪明的编译器可能会做出适当的证明,以减少这种脚枪造成的损害。 + +#### 其他小问题 + +* **Dup 通道吗?** —— 如果我们可以在通道上使用等效于 `dup` 的系统调用,那么我们也可以很容易地解决多生产者问题。 每个生产者可以关闭自己的 `dup` 版通道,而不会破坏其他生产者。 +* **修复通道 API!** —— 关闭不是幂等的吗? 在已关闭的通道上发送信息引起的 panics 没有办法避免吗? 啊! +* **任意缓冲的通道** —— 如果我们可以创建没有固定的缓冲区大小限制的缓冲通道,那么我们可以创建非阻塞的通道。 + +### 那我们该怎么向大家介绍 Go 呢? + +如果你还没有,请看看我目前最喜欢的编程文章:《[你的函数是什么颜色][32]》。虽然不是专门针对 Go,但这篇博文比我更有说服力地阐述了为什么 goroutines 是 Go 最好的特性(这也是 Go 在某些应用程序中优于 Rust 的方式之一)。 + +如果你还在使用这样的一种编程语言写代码,它强迫你使用类似 `yield` 关键字来获得高性能、并发性或事件驱动的模型,那么你就是活在过去,不管你或其他人是否知道这一点。到目前为止,Go 是我所见过的实现 M:N 线程模型(非 1:1 )的语言中最好的入门者之一,而且这种模型非常强大。 + +所以,跟大家说说 goroutines 吧。 + +如果非要我选择 Go 的另一个主要特性,那就是接口。静态类型的 [鸭子模型][33]duck typing 使得扩展、使用你自己或他人的项目变得如此有趣而令人惊奇,这也许值得我改天再写一组完全不同的文章来介绍它。 + +### 所以… + +我一直看到人们争先恐后冲进 Go,渴望充分利用通道来发挥其全部潜力。这是我对你的建议。 + +**够了!** + +当你在编写 API 和接口时,尽管“绝不”的建议可能很糟糕,但我非常肯定,通道从来没有什么时候好过,我用过的每一个使用通道的 Go API,最后都不得不与之抗争。我从来没有想过“哦 太好了,这里是一个通道;”它总是被一些变体取代,_**这是什么新鲜的地狱?**_ + +所以,_请在适当的地方,并且只在适当的地方使用通道。_ + +在我使用的所有 Go 代码中,我可以用一只手数出有多少次通道真的是最好的选择。有时候是这样的。那很好!那就用它们吧。但除此之外,就不要再使用了。 + +![][34] + +_特别感谢我的校对读者 Jeff Wendling、[Andrew Harding][35]、[George Shank][36] 和 [Tyler Treat][37] 提供的宝贵反馈。_ + +如果你想和我们一起用 Go 在 Space Monkey 项目工作,请[给我打个招呼][38]! + +-------------------------------------------------------------------------------- + +via: https://www.jtolio.com/2016/03/go-channels-are-bad-and-you-should-feel-bad + +作者:[jtolds][a] +选题:[lujun9972][b] +译者:[gxlct008](https://github.com/gxlct008) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.jtolio.com/ +[b]: https://github.com/lujun9972 +[1]: https://blog.codinghorror.com/content/images/uploads/2012/06/6a0120a85dcdae970b017742d249d5970d-800wi.jpg +[2]: https://songlh.github.io/paper/go-study.pdf +[3]: https://golang.org/ +[4]: http://www.spacemonkey.com/ +[5]: https://en.wikipedia.org/wiki/Communicating_sequential_processes +[6]: https://en.wikipedia.org/wiki/%CE%A0-calculus +[7]: http://matt.might.net +[8]: http://www.ucombinator.org/ +[9]: https://www.jtolio.com/writing/2015/11/research-log-cell-states-and-microarrays/ +[10]: https://www.jtolio.com/writing/2014/04/go-space-monkey/ +[11]: https://godoc.org/github.com/spacemonkeygo/openssl +[12]: https://golang.org/pkg/crypto/tls/ +[13]: https://godoc.org/github.com/spacemonkeygo/errors +[14]: https://godoc.org/github.com/spacemonkeygo/spacelog +[15]: https://godoc.org/gopkg.in/spacemonkeygo/monitor.v1 +[16]: https://github.com/jtolds/gls +[17]: https://www.jtolio.com/images/wat/darth-helmet.jpg +[18]: https://en.wikipedia.org/wiki/Newsqueak +[19]: https://en.wikipedia.org/wiki/Alef_%28programming_language%29 +[20]: https://en.wikipedia.org/wiki/Limbo_%28programming_language%29 +[21]: https://lesswrong.com/lw/k5/cached_thoughts/ +[22]: https://blog.golang.org/share-memory-by-communicating +[23]: https://www.jtolio.com/images/wat/jon-stewart.jpg +[24]: https://twitter.com/HiattDustin +[25]: http://bravenewgeek.com/go-is-unapologetically-flawed-heres-why-we-use-it/ +[26]: https://www.jtolio.com/images/wat/obama.jpg +[27]: https://www.jtolio.com/images/wat/yael-grobglas.jpg +[28]: http://www.informit.com/articles/article.aspx?p=2359758#comment-2061767464 +[29]: https://godoc.org/golang.org/x/net/context +[30]: https://www.jtolio.com/images/wat/zooey-deschanel.jpg +[31]: https://www.jtolio.com/images/wat/joel-mchale.jpg +[32]: http://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/ +[33]: https://en.wikipedia.org/wiki/Duck_typing +[34]: https://www.jtolio.com/images/wat/michael-cera.jpg +[35]: https://github.com/azdagron +[36]: https://twitter.com/taterbase +[37]: http://bravenewgeek.com +[38]: https://www.jtolio.com/contact/ diff --git a/published/202101/20181009 GCC- Optimizing Linux, the Internet, and Everything.md b/published/202101/20181009 GCC- Optimizing Linux, the Internet, and Everything.md new file mode 100644 index 0000000000..641a77b740 --- /dev/null +++ b/published/202101/20181009 GCC- Optimizing Linux, the Internet, and Everything.md @@ -0,0 +1,93 @@ +GCC:优化 Linux、互联网和一切 +====== + +![](https://img.linux.net.cn/data/attachment/album/202101/22/122155ujfd62u6zbx3i4b3.jpg) + +软件如果不能被电脑运行,那么它就是无用的。而在处理运行时run-time性能的问题上,即使是最有才华的开发人员也会受编译器的支配 —— 因为如果没有可靠的编译器工具链,就无法构建任何重要的东西。GNU 编译器集合GNU Compiler Collection(GCC)提供了一个健壮、成熟和高性能的工具,以帮助你充分发挥你代码的潜能。经过数十年成千上万人的开发,GCC 成为了世界上最受尊敬的编译器之一。如果你在构建应用程序是没有使用 GCC,那么你可能错过了最佳解决方案。 + +根据 LLVM.org 的说法,GCC 是“如今事实上的标准开源编译器” [^1],也是用来构建完整系统的基础 —— 从内核开始。GCC 支持超过 60 种硬件平台,包括 ARM、Intel、AMD、IBM POWER、SPARC、HP PA-RISC 和 IBM Z,以及各种操作环境,包括 GNU、Linux、Windows、macOS、FreeBSD、NetBSD、OpenBSD、DragonFly BSD、Solaris、AIX、HP-UX 和 RTEMS。它提供了高度兼容的 C/C++ 编译器,并支持流行的 C 库,如 GNU C Library(glibc)、Newlib、musl 和各种 BSD 操作系统中包含的 C 库,以及 Fortran、Ada 和 GO 语言的前端。GCC 还可以作为一个交叉编译器,可以为运行编译器的平台以外的其他平台创建可执行代码。GCC 是紧密集成的 GNU 工具链的核心组件,由 GNU 项目产生,它包括 glibc、Binutils 和 GNU 调试器(GDB)。 + +“一直以来我最喜欢的 GNU 工具是 GCC,即GNU 编译器集合GNU Compiler Collection。在开发工具非常昂贵的时候,GCC 是第二个 GNU 工具,也是使社区能够编写和构建所有其他工具的工具。这个工具一手改变了这个行业,导致了自由软件运动的诞生,因为一个好的、自由的编译器是一个社区软件的先决条件。”—— Red Hat 开源和标准团队的 Dave Neary。[^2] + +### 优化 Linux + +作为 Linux 内核源代码的默认编译器,GCC 提供了可靠、稳定的性能以及正确构建内核所需的额外扩展。GCC 是流行的 Linux 发行版的标准组件,如 ArchLinux、CentOS、Debian、Fedora、openSUSE 和 Ubuntu 这些发行版中,GCC 通常用来编译支持系统的组件。这包括 Linux 使用的默认库(如 libc、libm、libintl、libssh、libssl、libcrypto、libexpat、libpthread 和 ncurses),这些库依赖于 GCC 来提供可靠性和高性能,并且使应用程序和系统程序可以访问 Linux 内核功能。发行版中包含的许多应用程序包也是用 GCC 构建的,例如 Python、Perl、Ruby、nginx、Apache HTTP 服务器、OpenStack、Docker 和 OpenShift。各个 Linux 发行版使用 GCC 构建的大量代码组成了内核、库和应用程序软件。对于 openSUSE 发行版,几乎 100% 的原生代码都是由 GCC 构建的,包括 6135 个源程序包、5705 个共享库和 38927 个可执行文件。这相当于每周编译 24540 个源代码包。[^3] + +Linux 发行版中包含的 GCC 的基本版本用于创建定义系统应用程序二进制接口Application Binary Interface(ABI)的内核和库。用户空间User space开发者可以选择下载 GCC 的最新稳定版本,以获得高级功能、性能优化和可用性改进。Linux 发行版提供安装说明或预构建的工具链,用于部署最新版本的 GCC 以及其他 GNU 工具,这些工具有助于提高开发人员的工作效率和缩短部署时间。 + +### 优化互联网 + +GCC 是嵌入式系统中被广泛采用的核心编译器之一,支持为日益增长的物联网设备开发软件。GCC 提供了许多扩展功能,使其非常适合嵌入式系统软件开发,包括使用编译器的内建函数、#语法、内联汇编和以应用程序为中心的命令行选项进行精细控制。GCC 支持广泛的嵌入式体系结构,包括 ARM、AMCC、AVR、Blackfin、MIPS、RISC-V、Renesas Electronics V850、NXP 和 Freescale Power 处理器,可以生成高效、高质量的代码。GCC提供的交叉编译能力对这个社区至关重要,而预制的交叉编译工具链 [^4] 是一个主要需求。例如,GNU ARM 嵌入式工具链是经过集成和验证的软件包,其中包含 ARM 嵌入式 GCC 编译器、库和其它裸机软件开发所需的工具。这些工具链可用于在 Windows、Linux 和 macOS 主机操作系统上对流行的 ARM Cortex-R 和 Cortex-M 处理器进行交叉编译,这些处理器已装载于数百亿台支持互联网的设备中。[^5] + +GCC 为云计算赋能,为需要直接管理计算资源的软件提供了可靠的开发平台,如数据库和 Web 服务引擎以及备份和安全软件。GCC 完全兼容 C++ 11 和 C++ 14,为 C++ 17 和 C++ 2a 提供实验支持 [^6](LCTT 译注:本文原文发布于 2018 年),可以创建性能优异的对象代码,并提供可靠的调试信息。使用 GCC 的应用程序的一些例子包括:MySQL 数据库管理系统,它需要 Linux 的 GCC [^7];Apache HTTP 服务器,它建议使用 GCC [^8];Bacula,一个企业级网络备份工具,它需要 GCC。[^9] + +### 优化一切 + +对于高性能计算High Performance Computing(HPC)中使用的科学代码的研究和开发,GCC 提供了成熟的 C、C++ 和 Fortran 前端,以及对 OpenMP 和 OpenACC API的支持,用于基于指令的并行编程。因为 GCC 提供了跨计算环境的可移植性,它使得代码能够更容易地在各种新的和传统的客户机和服务器平台上进行测试。GCC 为 C、C++ 和 Fortran 编译器提供了 OpenMP 4.0 的完整支持,为 C 和 C++ 编译器提供了 OpenMP 4.5 完整支持。对于 OpenACC、 GCC 支持大部分 2.5 规范和性能优化,并且是唯一提供 [OpenACC][1] 支持的非商业、非学术编译器。 + +代码性能是这个社区的一个重要参数,GCC 提供了一个坚实的性能基础。Colfax Research 于 2017 年 11 月发表的一篇论文评估了 C++ 编译器在使用 OpenMP 4.x 指令并行化编译代码的速度和编译后代码的运行速度。图 1 描绘了不同编译器编译并使用单个线程运行时计算内核的相对性能。性能值经过了归一化处理,以 G++ 的性能为 1.0。 + +![performance][3] + +*图 1 为由不同编译器编译的每个内核的相对性能。(单线程,越高越好)。* + +他的论文总结道:“GNU 编译器在我们的测试中也做得很好。G++ 在六种情况中的三种情况下生成的代码速度是第二快的,并且在编译时间方面是最快的编译器之一。”[^10] + +### 谁在用 GCC? + +在 JetBrains 2018 年的开发者生态状况调查中,在接受调查的 6000 名开发者中,66% 的 C++ 程序员和 73% 的 C 程序员经常使用 GCC。[^11] 以下简要介绍 GCC 的优点,正是这些优点使它在开发人员社区中如此受欢迎。 + + * 对于需要为各种新的和遗留的计算平台和操作环境编写代码的开发人员,GCC 提供了对最广泛的硬件和操作环境的支持。硬件供应商提供的编译器主要侧重于对其产品的支持,而其他开源编译器在所支持的硬件和操作系统方面则受到很大限制。[^12] + * 有各种各样的基于 GCC 的预构建工具链,这对嵌入式系统开发人员特别有吸引力。这包括 GNU ARM 嵌入式工具链和 Bootlin 网站上提供的 138 个预编译交叉编译器工具链。[^13] 虽然其他开源编译器(如 Clang/LLVM)可以取代现有交叉编译工具链中的 GCC,但这些工具集需要开发者完全重新构建。[^14] + * GCC 通过成熟的编译器平台向应用程序开发人员提供可靠、稳定的性能。《在 AMD EPYC 平台上用 GCC 8/9 与 LLVM Clang 6/7 编译器基准测试》这篇文章提供了 49 个基准测试的结果,这些测试的编译器在三个优化级别上运行。使用 `-O3 -march=native` 级别的 GCC 8.2 RC1 在 34% 的时间里排在第一位,而在相同的优化级别 LLVM Clang 6.0 在 20% 的时间里赢得了第二位。[^15] + * GCC 为编译调试 [^16] 提供了改进的诊断方法,并为运行时调试提供了准确而有用的信息。GCC 与 GDB 紧密集成,GDB 是一个成熟且功能齐全的工具,它提供“不间断”调试,可以在断点处停止单个线程。 + * GCC 是一个得到良好支持的平台,它有一个活跃的、有责任感的社区,支持当前版本和以前的两个版本。由于每年都有发布计划,这为一个版本提供了两年的支持。 + +### GCC:仍然在继续优化 + +GCC 作为一个世界级的编译器继续向前发展。GCC 的最新版本是 8.2,于 2018 年 7 月发布(LCTT 译注:本文原文发表于 2018 年),增加了对即将推出的 Intel CPU、更多 ARM CPU 的硬件支持,并提高了 AMD 的 ZEN CPU 的性能。增加了对 C17 的初步支持,同时也对 C++2A 进行了初步工作。诊断功能继续得到增强,包括更好的发射诊断,改进了定位、定位范围和修复提示,特别是在 C++ 前端。Red Hat 的 David Malcolm 在 2018 年 3 月撰写的博客概述了 GCC 8 中的可用性改进。[^17] + +新的硬件平台继续依赖 GCC 工具链进行软件开发,例如 RISC-V,这是一种自由开放的 ISA,机器学习、人工智能(AI)和物联网细分市场都对其感兴趣。GCC 仍然是 Linux 系统持续开发的关键组件。针对 Intel 架构的 Clear Linux 项目是一个为云、客户端和物联网用例构建的新兴发行版,它提供了一个很好的示例,说明如何使用和改进 GCC 编译器技术来提高基于 Linux 的系统的性能和安全性。GCC 还被用于微软 Azure Sphere 的应用程序开发,这是一个基于 Linux 的物联网应用程序操作系统,最初支持基于 ARM 的联发科 MT3620 处理器。在培养下一代程序员方面,GCC 也是树莓派的 Windows 工具链的核心组件,树莓派是一种运行基于 Debian 的 GNU/Linux 的低成本嵌入式板,用于促进学校和发展中国家的基础计算机科学教学。 + +GCC 由 GNU 项目的创始人理查德•斯托曼Richard Stallman首次发布 于 1987 年 3 月 22 日,由于它是第一个作为自由软件发布的可移植的 ANSI C 优化编译器,因此它被认为是一个重大突破。GCC 由来自世界各地的程序员组成的社区在指导委员会的指导下维护,以确保对项目进行广泛的、有代表性的监督。GCC 的社区方法是它的优势之一,它形成了一个由开发人员和用户组成的庞大而多样化的社区,他们为项目做出了贡献并提供支持。根据 Open Hub 的说法,“GCC 是世界上最大的开源团队之一,在 Open Hub 上的所有项目团队中排名前 2%。”[^18] + +关于 GCC 的许可问题,人们进行了大量的讨论,其中大多数是混淆而不是启发。GCC 在 GNU 通用公共许可证(GPL)版本 3 或更高版本下发布,但运行时库例外。这是一个左版许可,这意味着衍生作品只能在相同的许可条款下分发。GPLv3 旨在保护 GCC,防止其成为专有软件,并要求对 GCC 代码的更改可以自由公开地进行。对于“最终用户”来说,这个编译器与其他编译器完全相同;使用 GCC 对你为自己的代码所选择的任何许可都没有区别。[^19] + + [^1]: http://clang.llvm.org/features.html#gcccompat + [^2]: https://opensource.com/article/18/9/happy-birthday-gnu + [^3]: 由 SUSE 基于最近的构建统计提供的信息。在 openSUSE 中还有其他不生成可执行镜像的源码包,这些不包括在统计中。 + [^4]: https://community.arm.com/tools/b/blog/posts/gnu-toolchain-performance-in-2018 + [^5]: https://www.arm.com/products/processors/cortex-m + [^6]: https://gcc.gnu.org/projects/cxx-status.html#cxx17 + [^7]: https://mysqlserverteam.com/mysql-8-0-source-code-improvements/ + [^8]: http://httpd.apache.org/docs/2.4/install.html + [^9]: https://blog.bacula.org/what-is-bacula/system-requirements/ +[^10]: https://colfaxresearch.com/compiler-comparison/ +[^11]: https://www.jetbrains.com/research/devecosystem-2018/ +[^12]: http://releases.llvm.org/6.0.0/tools/clang/docs/UsersManual.html +[^13]: https://bootlin.com/blog/free-and-ready-to-use-cross-compilation-toolchains/ +[^14]: https://clang.llvm.org/docs/Toolchain.html +[^15]: https://www.phoronix.com/scan.php?page=article&item=gcclang-epyc-summer18&num=1 +[^16]: https://gcc.gnu.org/wiki/ClangDiagnosticsComparison +[^17]: https://developers.redhat.com/blog/2018/03/15/gcc-8-usability-improvements/ +[^18]: https://www.openhub.net/p/gcc/factoids#FactoidTeamSizeVeryLarge +[^19]: https://www.gnu.org/licenses/gcc-exception-3.1-faq.en.html + + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/blog/2018/10/gcc-optimizing-linux-internet-and-everything + +作者:[Margaret Lewis][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/users/margaret-lewis +[b]: https://github.com/lujun9972 +[1]: https://www.openacc.org/tools +[2]: /files/images/gccjpg-0 +[3]: https://lcom.static.linuxfound.org/sites/lcom/files/gcc_0.jpg?itok=HbGnRqWX "performance" +[4]: https://www.linux.com/licenses/category/used-permission diff --git a/published/202101/20181123 Three SSH GUI Tools for Linux.md b/published/202101/20181123 Three SSH GUI Tools for Linux.md new file mode 100644 index 0000000000..63cc03c092 --- /dev/null +++ b/published/202101/20181123 Three SSH GUI Tools for Linux.md @@ -0,0 +1,148 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: subject: (Three SSH GUI Tools for Linux) +[#]: via: (https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux) +[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) +[#]: url: (https://linux.cn/article-13010-1.html) + +三种 Linux 下的 SSH 图形界面工具 +====== + +![](https://lcom.static.linuxfound.org/sites/lcom/files/ssh.jpg) + +在你作为 Linux 系统管理员的职业生涯中,你可以使用 Secure Shell(SSH)远程访问 Linux 服务器或桌面系统。很有可能,你已经使用过了。在某些情况下,你会通过 SSH 一次性登录多个 Linux 服务器。实际上,SSH 很可能是 Linux 工具箱中最常用的工具之一。因此,你会希望操作尽可能高效。对于许多系统管理员来说,没有什么比命令行更有效的了。但是,有些用户确实更喜欢 GUI 工具,尤其是从一台桌面台式机远程连接到服务器上工作时。 + +如果你碰巧喜欢 GUI 工具,那么你肯定想了解一下 Linux 上的一些出色的 SSH 图形界面工具。将其与独特的终端窗口相结合,可以从同一窗口远程访问多台计算机,你便拥有了高效工作所需的一切。让我们看以下这三个工具,找出其中一个(或多个)是否完全适合你的需求。 + +我将在 [Elementary OS][1] 上演示这些工具,但是大多数流行的发行版都可以使用它们。 + +### PuTTY + +只要是久经沙场的人都知道 [PuTTY][2]。 实际上,PuTTY 是从 Windows 环境通过 SSH 连接到 Linux 服务器的事实标准工具。但是 PuTTY 不仅适用于 Windows。实际上,从其标准存储库中,PuTTY 也可以安装到 Linux 上。 PuTTY 的功能列表包括: + + * 保存会话 + * 通过 IP 地址或主机名链接 + * 定义备用 SSH 端口 + * 链接类型定义 + * 日志记录 + * 键盘、响铃、外观、连接等选项 + * 本地和远程隧道配置 + * 支持代理 + * 支持X11 隧道 + +PuTTY GUI 主要是一种保存 SSH 会话的方式,因此,你可以更轻松地管理那些你需要不断远程登录、登出的各种 Linux 服务器和桌面台式机。从 PuTTY 连接到 Linux 服务器后,你将拥有一个可以运行的终端窗口。此时,你可能会问自己,为什么不只在终端窗口中工作?对于某些人来说,保存会话的便捷性确实使 PuTTY 值得使用。 + +在 Linux 上安装 PuTTY 很简单。例如,你可以在基于 Debian 的发行版上执行命令: + +``` +sudo apt-get install -y putty +``` + +安装后,你可以从桌面菜单运行 PuTTY GUI 或执行命令 `putty`。在“PuTTY 配置PuTTY Configuration” 窗口(图 1)中,在 “主机名(或 IP 地址)HostName (or IP address)”位置键入主机名或 IP 地址,配置端口Port”(如果不是默认值 22),从“连接类型Connection type”中选择 “SSH” ,然后单击“打开Open”。 + +![PuTTY Connection][4] + +*图 1:PuTTY 连接配置窗口。* + +建立连接后,系统将提示你输入远程服务器上的用户凭据(图 2)。 + +![log in][7] + +*图 2:使用 PuTTY 登录到远程服务器。* + +要保存会话(以便不必总是键入远程服务器信息),填写 IP 地址(或主机名),配置端口和连接类型,然后(在单击 “打开Open” 之前),在 “保存会话Saved Sessions” 顶部文本区域中键入链接的名称,然后单击 “保存Save”。 这样将保存此会话的配置。若要连接到已保存的会话,请从 “已保存的会话Saved Sessions” 窗口中选择它,单击 “加载Load”,然后单击 “打开Open”。 然后,系统将提示你输入远程服务器上的远程凭据登录远程服务器。 + +### EasySSH + +尽管 [EasySSH][8] 没有提供 PuTTY 中提供的大量配置选项,但是(顾名思义)它非常易于使用。 EasySSH 的最佳功能之一是提供标签式界面,因此你可以打开多个 SSH 连接并在它们之间快速切换。 EasySSH 的功能包括: + + * 分组(你可以将选项卡分组以获得更高效的体验)。 + * 保存用户名/密码。 + * 外观选项。 + * 支持本地和远程隧道。 + +在 Linux 桌面上安装 EasySSH 很简单,因为可以通过 flatpak 安装该应用程序(这意味着你必须在系统上安装 Flatpak )。 安装 flatpak 后,使用以下命令添加 EasySSH : + +``` +sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + +sudo flatpak install flathub com.github.muriloventuroso.easyssh +``` + +使用以下命令运行 EasySSH : + +``` +flatpak run com.github.muriloventuroso.easyssh +``` + +你可以在其中单击左上角的 “+” 按钮打开 EasySSH 应用程序。 在出现的窗口(图 3)中,根据需要配置 SSH 连接。 + +![Adding a connection][10] + +*图 3:在 EasySSH 中添加连接很简单。* + +添加连接后,它将显示在主窗口的左侧导航中(图 4)。 + +![EasySSH][12] + +*图 4:EasySSH 主窗口。* + +要在 EasySSH 中连接到远程服务器,请从左侧导航中选择它,然后单击 “连接Connect” 按钮(图 5)。 + +![Connecting][14] + +*图 5:使用 EasySSH 连接到远程服务器。* + +EasySSH 的一个注意事项是你必须在连接配置中保存用户名和密码(否则连接将失败)。这意味着有权访问运行 EasySSH 的桌面的任何人都可以在不知道密码的情况下远程访问你的服务器。因此,你必须始终记得在外出时锁定桌面屏幕(并确保使用强密码)。你最不希望的就是避免服务器受到不必要的登录攻击。 + +### Terminator + +Terminator 实际上不是 SSH GUI。相反,Terminator 的功能是作为一个单一窗口,使你可以一次运行多个终端(甚至一组终端)。实际上,你可以打开 Terminator,将窗口垂直和水平拆分(直到拥有所需的所有终端),然后通过标准 SSH 命令连接到所有远程 Linux 服务器(图 6)。 + +![Terminator][16] + +*图 6:Terminator 分为三个不同的窗口,每个窗口都连接到不同的 Linux 服务器。* + +要安装 Terminator,请执行以下命令: + +``` +sudo apt-get install -y terminator +``` + +安装后,从桌面菜单或用命令 `terminator` 打开该工具。打开窗口后,你可以在 Terminator 内部右键单击,然后选择 “水平分割Split Horizontally” 或 “垂直分割Split Vertically”。继续拆分终端,直到你打开所需的终端为止,然后开始远程管理这些服务器。使用 Terminator 的注意事项是它不是标准的 SSH GUI 工具,因为它不会保存你的会话或使你可以快速访问这些服务器。换句话说,你将始终必须手动登录到远程 Linux 服务器。但是,能够并行查看远程 Secure Shell 会话确实使管理多个远程计算机变得容易得多。 + +### 少而精的选择 + +Linux 没有多少可用的 SSH GUI 工具。为什么呢?因为大多数管理员更喜欢简单地打开终端窗口,并使用标准命令行工具来远程访问服务器。但是,如果需要 GUI 工具,则有两个可靠的选择,和一个使登录多台计算机稍微容易一些的终端。尽管对于那些寻找 SSH GUI 工具的人来说只有少数选择,但是可用的那些肯定值得你花时间,根据需要尝试其中之一。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux + +作者:[Jack Wallen][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/users/jlwallen +[b]: https://github.com/lujun9972 +[1]: https://elementary.io/ +[2]: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html +[3]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_1.jpg +[4]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_1.jpg (PuTTY Connection) +[5]: https://www.linux.com/licenses/category/used-permission +[6]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_2.jpg +[7]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_2.jpg (log in) +[8]: https://github.com/muriloventuroso/easyssh +[9]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_3.jpg +[10]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_3.jpg (Adding a connection) +[11]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_4.jpg +[12]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_4.jpg (EasySSH) +[13]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_5.jpg +[14]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_5.jpg (Connecting) +[15]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_6.jpg +[16]: https://lcom.static.linuxfound.org/sites/lcom/files/ssh_guis_6.jpg (Terminator) diff --git a/published/202101/20190104 Search, Study And Practice Linux Commands On The Fly.md b/published/202101/20190104 Search, Study And Practice Linux Commands On The Fly.md new file mode 100644 index 0000000000..f5eab0b5ac --- /dev/null +++ b/published/202101/20190104 Search, Study And Practice Linux Commands On The Fly.md @@ -0,0 +1,219 @@ +[#]: collector: (lujun9972) +[#]: translator: (qfzy1233) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13005-1.html) +[#]: subject: (Search, Study And Practice Linux Commands On The Fly!) +[#]: via: (https://www.ostechnix.com/search-study-and-practice-linux-commands-on-the-fly/) +[#]: author: (SK https://www.ostechnix.com/author/sk/) + +光速!搜索、学习和实践 Linux 命令!! +====== + +![](https://www.ostechnix.com/wp-content/uploads/2019/01/tldr-720x340.png) + +这一标题可能看起来很粗略且吸睛。请允许我解释一下我在本教程中将要阐释的内容。假设你想下载一个压缩文件,将其解压缩,并从命令行中将文件从一个位置移动到另一个位置。根据上面的场景,我们可能需要至少三个 Linux 命令,一个用于下载文件,一个用于提取下载的文件,一个用于移动文件。如果你是中高级 Linux 用户,你可以通过[一行命令][16]或脚本在几秒钟/分钟内轻松完成这一任务。但是,如果你是一个不懂得太多 Linux 命令的菜鸟你可能就需要一些帮助了。 + +当然,谷歌的快速搜索可能会找到很多结果。或者,你可以使用 [手册页][1]。但是有些手册页实在很长,很全面,但缺少有用的示例。当你在特定的标志/选项上寻找特定的信息时,你可能需要向下检索相当长的时间。值得庆幸的是,有一些 [好的手册页替代品][2],它们主要关注于实用的命令。一个很好的选择是 **TLDR 手册**。使用 TLDR 手册,我们可以通过实际示例快速轻松地学习一个 Linux 命令。要使用 TLDR 手册,我们需要 TLDR 客户端。有很多客户。今天我们就来了解一个这样的客户端,名为 **“Tldr++”**。 + +Tldr++ 是一个快速和交互式的 Tldr 客户端,用 **Go** 编程语言编写。与其他 Tldr 客户端不同,它是完全交互式的。这意味着,你可以选择一个命令,读取所有示例,并立即运行任何命令,而不必在终端中重新键入或复制/粘贴每个命令。还是不明白?没有问题。请继续阅读,以便动态学习和实践 Linux 命令。 + +### 安装 Tldr++ + +安装 Tldr++ 非常简单。从 [发布页面][3] 下载 Tldr++ 最新版本。解压它并将 Tldr++ 二进制文件移动到你的 `$PATH` 中。 + +``` +$ wget https://github.com/isacikgoz/tldr/releases/download/v0.5.0/tldr_0.5.0_linux_amd64.tar.gz +$ tar xzf tldr_0.5.0_linux_amd64.tar.gz +$ sudo mv tldr /usr/local/bin +$ sudo chmod +x /usr/local/bin/tldr +``` + +现在,运行 `tldr` 二进制代码将 TLDR 手册部署到本地系统中。 + +``` +$ tldr +``` + +示例输出: + +``` +Enumerating objects: 6, done. +Counting objects: 100% (6/6), done. +Compressing objects: 100% (6/6), done. +Total 18157 (delta 0), reused 3 (delta 0), pack-reused 18151 +Successfully cloned into: /home/sk/.local/share/tldr +``` + +![](https://www.ostechnix.com/wp-content/uploads/2019/01/tldr-2.png) + +Tldr++ 可以在 AUR 中使用。如果你使用 Arch Linux 上,你可以使用任何 AUR 助手来安装它,例如 [YaY][4]。确保你已经从系统中删除了任何现有的 TLDR 客户端,并运行以下命令安装 Tldr++。 + +``` +$ yay -S tldr++ +``` + +或者,你也可以像下面描述的那样从源代码进行编译。因为 Tldr++ 是用 Go 语言编写的,所以请确保你 Linux 系统中已经安装了 Go 语言。如果还没有安装,请参考下面的指南。 + +- [如何在 Linux 系统中安装 Go 语言](https://www.ostechnix.com/install-go-language-linux/) + +在安装好 Go 语言之后, 运行以下的命令来安装 Tldr++。 + +``` +$ go get -u github.com/isacikgoz/tldr +``` + +该命令在当前工作目录中下载 `tldr` 代码库中的内容并存储到 `go` 文件夹中。 + +现在,运行 `tldr` 二进制代码将 TLDR 手册部署到本地系统中。 + +``` +$ go/bin/tldr +``` + +示例输出: + +![][6] + +最后,将 `tldr` 二进制文件复制到你的路径中。 + +``` +$ sudo mv tldr /usr/local/bin +``` + +现在是时候看一些例子了。 + +### Tldr++ 用法 + +输入不带任何选项的 `tldr` 命令,以字母顺序显示所有命令示例。 + +![][7] + +使用 **向上/向下箭头** 来浏览命令,键入任何字母来搜索或键入命令名称来查看相应命令的示例。 `?` 以浏览更多消息,按 `Ctrl+c` 返回/退出。 + +要显示特定命令的示例命令,例如 `apt`,可以这样做: + +``` +$ tldr apt +``` + +![][8] + +从列表中选择任意示例命令并按回车键。在选定的命令前会看到一个 `*` 符号。例如,我选择第一个命令即 `sudo apt update`。现在,它会问你是否继续。如果命令正确,只需键入 `y` 继续,并输入 `sudo` 密码运行所选命令。 + +![][9] + +看到了吗?你不需要在终端中复制/粘贴或键入实际的命令。只需从列表中选择它,并极速运行! + +Tldr 手册中有数百个 Linux 命令示例。你可以每天选择一个或两个命令,并彻底学习它们。每天坚持这样的练习,尽可能多的掌握。 + +### 使用 Tldr++ 动态学习和实践 Linux 命令 + +现在回到我在第一段中提到的场景。你需要下载一个文件,将其解压缩并将其移动到不同的位置,并使其可执行。让我们看看如何使用 Tldr++ 客户端进行交互。 + +#### 第一步 – 从网上下载文件 + +要使用命令行下载文件,我们主要使用 `curl` 或 `wget` 命令。让我使用 `wget` 下载文件。要打开 `wget` 命令的 TLDR 页面,只需执行以下命令: + +``` +$ tldr wget +``` + +下面是 `wget` 命令的示例。 + +![](https://www.ostechnix.com/wp-content/uploads/2019/01/wget-tldr.png) + +你可以使用 **向上/向下箭头** 来浏览命令列表。一旦你选择了你所选择的命令,按回车键。这里我选择了第一个命令。 + +现在,输入路径来下载文件。 + +![](https://www.ostechnix.com/wp-content/uploads/2019/01/tldr-3.png) + +然后将要求你确认该命令是否正确。如果命令正确,只需键入 `yes` 或 `y` 就可以开始下载文件。 + +![][10] + +我们已经下载了文件。让我们继续解压这个文件。 + +#### 第二步 – 解压已下载的文件 + +我们下载了 tar.gz 文件。所以我将打开 TLDR 手册的 `tar` 页面。 + +``` +$ tldr tar +``` + +你将看到示例命令列表。浏览这些示例,找出哪个命令适合提取 tar.gz(gzip 格式)文件,按回车键。在我们的例子中,它是第三个命令。 + +![][11] + +现在,系统将提示你输入 tar.gz 文件的路径。只需输入路径并按回车键。Tldr++ 支持智能文件提示。这意味着它会在你键入时自动补全文件名。只需按 `TAB` 键自动完成。 + +![][12] + +如果将文件下载到其他位置,只需键入完整路径,例如 `/home/sk/Downloads/tldr_0.5.0_linux_amd64.tar.gz`。 + +输入要解压的文件的路径后,按回车键,然后输入 `y` 进行确认。 + +![][13] + +#### 第三步 – 将文件从一个目录移动到另一个目录 + +我们解压了文件。现在我们需要将文件移动到另一个位置。为了将文件从一个位置移动到另一个位置,我们使用 `mv` 命令。所以,让我们打开 TLDR 手册的 `mv` 命令。 + +``` +$ tldr mv +``` + +选择正确的命令将文件从一个位置移动到另一个位置。在我们的例子中,第一个命令可以工作,所以让我们选中它。 + +![][14] + +输入要移动的文件路径,并输入目标路径并按回车键。 + +![][15] + +**附注:** 输入 `y!` 或 `yes!` 来以 `sudo` 权限运行命令。 + +正如你在上面的截图中看到的,我将名为 ``tldr` 的文件移动到 `/usr/local/bin/`。 + +要了解更多细节,请参考项目最后给出的 GitHub 页面。 + + +### 总结 + +别误会,毫无疑问 **手册页** 是伟大的!但是,正如我已经说过的,许多手册页都很全面,缺少有用的示例。我不可能记住带有复杂标志的冗长的所有命令。有时,我花了很多时间在手册页上,却还是一窍不通。Tldr 手册帮助我在几分钟内找到了我需要的东西。而且,我们偶尔会使用一些命令,然后就会完全忘记它们。另一方面,Tldr 手册实际上在使用那些使用率很低的命令时很有帮助。Tldr++ 客户端通过智能的用户交互使这个任务变得更容易。试试吧,在下面的评论区告诉我们你对这个工具的看法。 + +以上,更多的好的分享将会陆续推出,请继续保持关注! + +祝好! + +-------------------------------------------------------------------------------- + +via: https://www.ostechnix.com/search-study-and-practice-linux-commands-on-the-fly/ + +作者:[SK][a] +选题:[lujun9972][b] +译者:[qfzy1233](https://github.com/qfzy1233) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.ostechnix.com/author/sk/ +[b]: https://github.com/lujun9972 +[1]: https://www.ostechnix.com/learn-use-man-pages-efficiently/ +[2]: https://www.ostechnix.com/3-good-alternatives-man-pages-every-linux-user-know/ +[3]: https://github.com/isacikgoz/tldr/releases +[4]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ +[5]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 +[6]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-1.png +[7]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-11.png +[8]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-12.png +[9]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-13.png +[10]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-4.png +[11]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-6.png +[12]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-7.png +[13]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-8.png +[14]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-9.png +[15]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-10.png +[16]: https://ostechnix.com/random-one-liner-linux-commands-part-1/ \ No newline at end of file diff --git a/published/202101/20190204 Getting started with Git- Terminology 101.md b/published/202101/20190204 Getting started with Git- Terminology 101.md new file mode 100644 index 0000000000..42b3d0ba0f --- /dev/null +++ b/published/202101/20190204 Getting started with Git- Terminology 101.md @@ -0,0 +1,124 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-12994-1.html) +[#]: subject: (Getting started with Git: Terminology 101) +[#]: via: (https://opensource.com/article/19/2/git-terminology) +[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg) + +Git 入门:术语基础 +====== + +> 想学习 Git?看看这个最重要的术语和命令的快速总结。 + +![](https://img.linux.net.cn/data/attachment/album/202101/08/171156gu9l8dvulxmxom6d.jpg) + +如今,对于任何希望跟踪他们的变化的人来说,版本控制是一个重要的工具。它对程序员、系统管理员和网站可靠性工程师site reliability engineers(SRE)都特别有用。确保可以从错误中恢复到已知的良好状态是一个巨大的胜利,比以前给复制的文件添加 `.old` 后缀的策略更友好。 + +但学习 Git 这件事往往被告诉大家“投身开源”的好心同行们过度简化了。在你还不明白之前,就有人要你给一个从上游upstream 变基rebase拉取请求pull request(PR)或合并请求merge request(MR),然后他们才能从你的远程版本库remote合并 —— 而且一定会删除合并提交merge commits。无论你想给开源项目做出什么好的贡献,当你看到这些你不认识的单词时,都会觉得难以融入。 + +![Git 速查表封面图][2] + +- [下载][3] 我们的 Git 速查表。 + +如果你有一两个月的时间和足够的好奇心,[Git SCM][4] 是你需要学习所有术语的权威来源。但如果你正在寻找来自实践的总结,请继续阅读。 + +### 提交就是提醒 + +对我来说,Git 最难理解的部分是 Git 最简单的概念:一个提交commit就是一个内容的集合,包括一个关于描述的信息,以及之前的提交。没有固有的代码发布策略,甚至没有内置的明确建议。这个内容甚至不一定是代码 —— 可以是*任何*你想添加到版本库的东西。提交消息commit message会对这些内容进行注释。 + +我喜欢把提交信息看作是给未来的自己的礼物:它可能会提到你编辑的文件,但更重要的是它提醒你修改这些文件的意图。添加更多关于你为什么编辑这些内容的信息,可以帮助任何使用你的版本库的人,即使那个人是你。 + +### origin/master 在哪里? + +要知道自己在 Git 项目中的位置,首先把它想成一棵树。所有 Git 项目都有一个根目录,类似于文件系统的根目录。所有的提交都是这个根目录下的分支。这样一来,分支只是一个提交的指针。按照惯例,`master` 是根目录下默认的分支名称。(LCTT 译注:世界变得快,原文发表于 2019 年,而现在有些地方开始用 `main` 替代这个名字。) + +由于 Git 是一个分布式的版本控制系统,同一个代码库分布在多个地方,所以人们经常用版本库repository这个词来表示同一个项目的所有副本。(LCTT 译注:“repository” 英文原意是仓库、存储库,在计算机环境中,常用于版本控制、软件分发等方面,有时候会统一译作“仓库”、“存储库”。但我们认为,应该根据不同语境采用更有指向性的译法。在 Git 等版本控制语境中,采用“版本库”;在软件分发方面,采用“软件库”;其它泛指或不确定的语境中,可采用“仓库”、“存储库”译法。)有本地版本库local repository,这是你编辑代码的地方(稍后会有更多的介绍),还有远程版本库remote repository,这是你完成后想把代码发送到的地方。远程版本库可以在任何地方,甚至在你的本地版本库所在的同一台计算机上,但它们通常托管在 GitLab 或 GitHub 等版本库服务上。 + +### 我在哪里? + +虽然不是官方的卖点,但迷路也是 Git 仓库的“乐趣”之一。你可以通过这套可靠的命令来找到自己的方向: + + * `git branch` —— 找到你所在的分支。 + * `git log` —— 查看你正在进行的提交。 + * `git status` —— 查看自上次提交以来你所做的编辑。 + * `git remote` —— 查看你正在跟踪的远程仓库。 + +用这些命令来定位自己的方向,当你被卡住的时候,会让你有一种方向感。 + +### 我是否已将我的提交暂存或缓存起来? + +你电脑上的代码俗称为你的工作空间workspace。但不是很明显的是,当你在 Git 仓库中时,你还有两个(是的,两个!)其他位置:索引index暂存stash。当你写了一些内容,然后**添加**时,你是把它添加到索引中,也就是准备提交的缓存内容。有的时候,你的索引中的文件还没有准备好提交,但你想查看另一个分支。这时,暂存就派上用场了。你可以使用 `git stash` 将索引了但尚未提交的文件存储到暂存区中。当你准备好取回文件时,运行 `git stash pop` 将更改带回索引中。 + +下面是一些你需要使用暂存区和缓存区的命令: + + * `git diff ...origin/master` —— 显示最近的本地提交和远程的 `origin` 版本库的 `master` 分支之间的差异。 + * `git diff --cached` —— 显示最近的本地提交与添加到本地索引的内容之间的任何差异。 + * `git stash` —— 将索引的(已添加但未提交的)文件放在暂存区堆栈中。 + * `git stash list` —— 显示暂存区堆栈中的变化。 + * `git stash pop` —— 将最近的变化从暂存库中删除。 + +### 无头骑士 + +Git 里面有各种比喻。当我想到 `HEAD` 是哪里的时候,我就会想到火车线路。如果你最终处于脱离的 HEADdetached HEAD模式,就意味着你已经脱离了这个隐喻的轨道。 + +`HEAD` 是指向当前签出分支中最近一次提交的指针。默认的“签出checkout”是指当你创建一个 Git 仓库并进入到 `master` 分支的时候。每次创建或修改到另一个分支时,你都会切换到该分支行。如果你在当前分支的某处进行 `git checkout `,`HEAD` 就会移动到该提交。如果没有提交历史记录将你的当前提交连接到已签出的提交,那么你将处于脱离的 `HEAD` 状态。如果你找不到 `HEAD` 的位置,你可以随时用 `git reset --hard origin/master` 来删除修改,回到已知状态。*警告:这将删除你上次推送到 `master` 后的任何改动。* + +### 你是上游还是下游? + +你的项目的本地副本被认为是你的本地版本库,它可能有也可能没有远程版本库 —— 远程版本库的副本是用于协作或保存的。也可能还有一个上游upstream版本库,在那里,项目的第三个副本由不同的贡献者托管和维护。 + +例如,假设我想为 Kubernetes 做贡献。我会首先将 `kubernetes/kubernetes` 项目复刻fork到我的账户下 `mbbroberg/kubernetes`。然后我会将我的项目克隆到我的本地工作区。在这种情况下,我的本地克隆是我的本地仓库,`mbbroberg/kubernetes` 是我的远程仓库,`kubernetes/kubernetes` 是上游。 + +### 合并的隐喻 + +当你深入 Git 分支时,根系统的视觉效果就会和火车轨道的形象合二为一。分支通常被用作开发一个新功能的方式,最终你想把它合并merge到主分支中。当这样做时,Git 会按顺序保留共同的提交历史,然后将你的分支的新提交追加到历史中。这个过程有一大堆的细节:是否变基rebase,是否添加一个合并提交merge commit,[Brent Laster][5] 在《[如何在 Git 中重置、恢复和返回之前的状态][6]》中会有更详细的探讨。 + +### 我想现在就去 Git + +要掌握 Git 命令的世界,有大量的术语和需要探索的地方。我希望这篇关于日常使用术语的第一人称探索能帮助你适应这一切。如果你觉得自己被卡住了或者遇到了挫折,欢迎在 Twitter [@mbbroberg][7] 上联系我。 + +#### 回顾 + + * 提交Commit —— 将当前索引的内容保存在一个新的提交中,并附上用户描述更改的日志信息。 + * 分支Branch —— 指向一个提交的指针。 + * `master` —— 第一个分支的默认名称。 + * `HEAD` —— 指向当前分支上最近一次提交的指针。 + * 合并Merge —— 合并两个或多个提交的历史。 + * 工作空间Workspace —— Git 仓库本地副本的通俗名称。 + * 工作树Working tree —— 工作区中的当前分支;任何时候你都可以在 `git status` 的输出中看到这个。 + * 缓存Cache —— 用于临时存储未提交的变更的空间。 + * 索引Index —— 变更提交前存储其变化的缓存。 + * 跟踪和未跟踪的文件 —— 没有被索引缓存的文件或尚未加入其中的文件。 + * 暂存Stash —— 另一个缓存,作为一个堆栈,在这里可以存储更改而不需要提交它们。 + * `origin` —— 远程版本库的默认名称。 + * 本地仓库Local repository —— 也就是你在工作站上保存 Git 仓库副本的地方。 + * 远程存储库Remote repository —— Git 存储库的第二副本,你可以在这里推送变更以便协作或备份。 + * 上游存储库Upstream repository —— 你跟踪的远程存储库的通俗说法。 + * 拉取请求Pull request —— 这是 GitHub 的专用术语,用于让其他人知道你推送到仓库分支的变化。 + * 合并请求Merge request —— 这是 GitLab 的专用术语,用于让其他人知道你推送到仓库分支的变化。 + * `origin/master` —— 远程版本库及其主要分支的默认名称。 + +后记:双关语是 Git 最好的部分之一,愿你喜欢。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/2/git-terminology + +作者:[Matthew Broberg][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mbbroberg +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=fvorN0e- (Digital hand surrounding by objects, bike, light bulb, graphs) +[2]: https://opensource.com/sites/default/files/uploads/git_cheat_sheet_cover.jpg (Git Cheat Sheet cover image) +[3]: https://opensource.com/downloads/cheat-sheet-git +[4]: https://git-scm.com/about +[5]: https://opensource.com/users/bclaster +[6]: https://opensource.com/article/18/6/git-reset-revert-rebase-commands +[7]: https://twitter.com/mbbroberg diff --git a/published/202101/20190205 5 Streaming Audio Players for Linux.md b/published/202101/20190205 5 Streaming Audio Players for Linux.md new file mode 100644 index 0000000000..82babefc3c --- /dev/null +++ b/published/202101/20190205 5 Streaming Audio Players for Linux.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13029-1.html) +[#]: subject: (5 Streaming Audio Players for Linux) +[#]: via: (https://www.linux.com/blog/2019/2/5-streaming-audio-players-linux) +[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) + +5 个适用于 Linux 的流式音频播放器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202101/18/220035k8mmbl1blmkb97f8.jpg) + +当我工作的时候,我会一直在后台播放音乐。大多数情况下,这些音乐是以黑胶唱片的形式在转盘上旋转。但有时我不想用这种单纯的方法听音乐时,我会选择听流媒体音频应用程序的方式。然而,由于我工作在 Linux 平台上,所以我只可以使用在我的操作系统上运行良好的软件。幸运的是,对于想在 Linux 桌面听流式音频的人来说,有很多工具可以选择。 + +事实上,Linux 为音乐流媒体提供了许多可靠的产品,我将重点介绍我最喜欢的五种用于此任务的工具。警告一句,并不是所有的玩意都是开源的。但是如果你不介意在你的开源桌面上运行一个专有的应用程序,你有一些非常棒的选择。让我们来看看有什么可用的。 + +### Spotify + +Linux 版的 Spotify 不是那种在你启动就闪退的愚蠢的、半生不熟的应用程序,也没有阉割什么功能。事实上,Spotify 的 Linux 版本与其他平台上的版本完全相同。使用 Spotify 流媒体客户端,你可以收听音乐和播客、创建播放列表、发现新的艺术家等等。Spotify 界面(图 1)非常易于导航和使用。 + +![Spotify][2] + +*图 1:Spotify 界面可以很容易地找到新的音乐和旧的收藏。* + +你可以使用 snap(使用 `sudo snap install Spotify` 命令)安装 Spotify,也可以使用以下命令从官方存储库安装 Spotify: + +``` +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 931FF8E79F0876134EDDBDCCA87FF9DF48BF1C90 +sudo echo deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list +sudo apt-get update +sudo apt-get install spotify-client +``` + +一旦安装,你就可以登录你的 Spotify 帐户,这样你就可以开始听好听的音乐,以帮助激励你完成你的工作。如果你已在其他设备上安装了 Spotify(并登录到同一帐户),则可以指定音乐应该流式传输到哪个设备(通过单击 Spotify 窗口右下角附近的“可用设备”图标)。 + +### Clementine + +Clementine 是 Linux 平台上最好的音乐播放器之一。Clementine 不仅允许用户播放本地存储的音乐,还可以连接到许多流媒体音频服务,例如: + + * Amazon Cloud Drive + * Box + * Dropbox + * Icecast + * Jamendo + * Magnatune + * RockRadio.com + * Radiotunes.com + * SomaFM + * SoundCloud + * Spotify + * Subsonic + * Vk.com + * 或其他有趣的电台 + +使用 Clementine 有两个注意事项。首先,你必须使用最新版本(因为某些软件库中可用的构建版本已过时,并且不会安装必要的流式处理插件)。第二,即使是最新的构建版本,一些流媒体服务也不会像预期的那样工作。例如,接入 Spotify 频道时,你只能使用最热门的曲目(而无法使用播放列表,或搜索歌曲的功能)。 + +使用 Clementine 互联网流媒体服务时,你会发现其中有很多你从来没有听说过的音乐家和乐队(图 2)。 + +![Clementine][5] + +*图 2:Clementine 互联网广播是寻找新音乐的好方法。* + +### Odio + +Odio 是一个跨平台的专有应用程序(可用于 Linux、MacOS 和 Windows),它允许你流式传输各种类型的互联网音乐站。广播的内容是取自 [www.radio-browser.info][6],而应用程序本身在为你呈现流方面做了令人难以置信的工作(图 3)。 + +![Odio][8] + +*图 3:Odio 接口是你能找到的最好的接口之一。* + +Odio 让你很容易找到独特的互联网广播电台,甚至可以把你找到并收藏的电台添加到你的库中。目前,在 Linux 上安装 Odio 的唯一方法是通过 Snap。如果你的发行版支持 snap 软件包,请使用以下命令安装此流应用程序: + +``` +sudo snap install odio +``` + +安装后,你可以打开应用程序并开始使用它。无需登录(或创建)帐户。Odio 的设置非常有限。实际上,它只提供了在设置窗口中选择暗色主题或亮色主题的选项。然而,尽管它可能功能有限,但 Odio 是在 Linux 上播放互联网广播的最佳选择之一。 + +### StreamTuner2 + +Streamtuner2 是一个优秀的互联网电台 GUI 工具。使用它,你可以流式播放以下音乐: + + * Internet radio stations + * Jameno + * MyOggRadio + * Shoutcast.com + * SurfMusic + * TuneIn + * Xiph.org + * YouTube + +Streamtuner2 提供了一个很好的界面(如果不是有点过时的话),可以很容易地找到和播放你喜爱的音乐。StreamTuner2 的一个警告是,它实际上只是一个用于查找你想要听到的流媒体的 GUI。当你找到一个站点时,双击它打开与流相关的应用程序。这意味着你必须安装必要的应用程序,才能播放流媒体。如果你没有合适的应用程序,你就不能播放流媒体。因此,你将花费大量的时间来确定要为某些流媒体安装哪些应用程序(图 4)。 + +![Streamtuner2][10] + +*图4:配置 Streamtuner2 需要一个坚强的心脏。* + +### VLC + +很长一段时间以来,VLC 一直被称为 Linux 最好的媒体播放工具。这是有充分理由的,因为几乎所有你丢给它的东西它都能播放。其中包括流媒体广播电台。虽然你无法让 VLC 连接到 Spotify 这样的网站,但你可以直接访问互联网广播,点击播放列表,而 VLC 毫无疑问可以打开它。考虑到目前有很多互联网广播电台,你在寻找适合自己口味的音乐方面不会有任何问题。VLC 还包括可视化工具、均衡器(图 5)等工具。 + +![VLC ][12] + +*图 5:VLC 可视化工具和均衡器特性。* + +VLC 唯一需要注意的是,你必须有一个你希望听到的互联网广播的 URL,因为这个工具本身并不能进行管理。但是有了这些链接,你就找不到比 VLC 更好的媒体播放器了。 + +### 这些工具软件怎么来的 + +如果这五个工具都不太不适合你的需要,我建议你打开你发行版的应用商店,搜索一个适合你的。有很多工具可以制作流媒体音乐、播客等等,不仅可以在 Linux 上实现,而且很简单。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/blog/2019/2/5-streaming-audio-players-linux + +作者:[Jack Wallen][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/users/jlwallen +[b]: https://github.com/lujun9972 +[2]: https://lcom.static.linuxfound.org/sites/lcom/files/spotify_0.jpg?itok=8-Ym-R61 (Spotify) +[3]: https://www.linux.com/licenses/category/used-permission +[5]: https://lcom.static.linuxfound.org/sites/lcom/files/clementine_0.jpg?itok=5oODJO3b (Clementine) +[6]: http://www.radio-browser.info +[8]: https://lcom.static.linuxfound.org/sites/lcom/files/odio.jpg?itok=sNPTSS3c (Odio) +[10]: https://lcom.static.linuxfound.org/sites/lcom/files/streamtuner2.jpg?itok=1MSbafWj (Streamtuner2) +[12]: https://lcom.static.linuxfound.org/sites/lcom/files/vlc_0.jpg?itok=QEOsq7Ii (VLC ) +[13]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux diff --git a/published/202101/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md b/published/202101/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md new file mode 100644 index 0000000000..4f74e02e9e --- /dev/null +++ b/published/202101/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md @@ -0,0 +1,436 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13041-1.html) +[#]: subject: (Install Apache, MySQL, PHP \(LAMP\) Stack On Ubuntu 18.04 LTS) +[#]: via: (https://www.ostechnix.com/install-apache-mysql-php-lamp-stack-on-ubuntu-18-04-lts/) +[#]: author: (SK https://www.ostechnix.com/author/sk/) + +在 Ubuntu 中安装 Apache、MySQL、PHP(LAMP)套件 +====== + +![](https://www.ostechnix.com/wp-content/uploads/2019/02/lamp-720x340.jpg) + +**LAMP** 套件是一种流行的开源 Web 开发平台,可用于运行和部署动态网站和基于 Web 的应用程序。通常,LAMP 套件由 Apache Web 服务器、MariaDB/MySQL 数据库、PHP/Python/Perl 程序设计(脚本)语言组成。 LAMP 是 **L**inux,**M**ariaDB/**M**YSQL,**P**HP/**P**ython/**P**erl 的缩写。 本教程描述了如何在 Ubuntu 18.04 LTS 服务器中安装 Apache、MySQL、PHP(LAMP 套件)。 + +就本教程而言,我们将使用以下 Ubuntu 测试。 + + * **操作系统**:Ubuntu 18.04.1 LTS Server Edition + * **IP 地址** :192.168.225.22/24 + +### 1. 安装 Apache Web 服务器 + +首先,利用下面命令更新 Ubuntu 服务器: + +``` +$ sudo apt update +$ sudo apt upgrade +``` + +然后,安装 Apache Web 服务器(命令如下): + +``` +$ sudo apt install apache2 +``` + +检查 Apache Web 服务器是否已经运行: + +``` +$ sudo systemctl status apache2 +``` + +输出结果大概是这样的: + +``` +● apache2.service - The Apache HTTP Server + Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: en + Drop-In: /lib/systemd/system/apache2.service.d + └─apache2-systemd.conf + Active: active (running) since Tue 2019-02-05 10:48:03 UTC; 1min 5s ago + Main PID: 2025 (apache2) + Tasks: 55 (limit: 2320) + CGroup: /system.slice/apache2.service + ├─2025 /usr/sbin/apache2 -k start + ├─2027 /usr/sbin/apache2 -k start + └─2028 /usr/sbin/apache2 -k start + +Feb 05 10:48:02 ubuntuserver systemd[1]: Starting The Apache HTTP Server... +Feb 05 10:48:03 ubuntuserver apachectl[2003]: AH00558: apache2: Could not reliably +Feb 05 10:48:03 ubuntuserver systemd[1]: Started The Apache HTTP Server. +``` + +祝贺你! Apache 服务已经启动并运行了!! + +#### 1.1 调整防火墙允许 Apache Web 服务器 + +默认情况下,如果你已在 Ubuntu 中启用 UFW 防火墙,则无法从远程系统访问 Apache Web 服务器。 必须按照以下步骤开启 `http` 和 `https` 端口。 + +首先,使用以下命令列出 Ubuntu 系统上可用的应用程序配置文件: + +``` +$ sudo ufw app list +``` + +输出结果: + +``` +Available applications: +Apache +Apache Full +Apache Secure +OpenSSH +``` + +如你所见,Apache 和 OpenSSH 应用程序已安装 UFW 配置文件。你可以使用 `ufw app info "Profile Name"` 命令列出有关每个配置文件及其包含的规则的信息。 + +让我们研究一下 “Apache Full” 配置文件。 为此,请运行: + +``` +$ sudo ufw app info "Apache Full" +``` + +输出结果: + +``` +Profile: Apache Full +Title: Web Server (HTTP,HTTPS) +Description: Apache v2 is the next generation of the omnipresent Apache web +server. + +Ports: +80,443/tcp +``` + +如你所见,“Apache Full” 配置文件包含了启用经由端口 **80** 和 **443** 的传输规则: + +现在,运行以下命令配置允许 HTTP 和 HTTPS 传入通信: + +``` +$ sudo ufw allow in "Apache Full" +Rules updated +Rules updated (v6) +``` + +如果你不想允许 HTTP 通信,而只允许 HTTP(80) 通信,请运行: + +``` +$ sudo ufw app info "Apache" +``` + +#### 1.2 测试 Apache Web 服务器 + +现在,打开 Web 浏览器并导航到 来访问 Apache 测试页。 + +![](https://www.ostechnix.com/wp-content/uploads/2016/06/apache-2.png) + +如果看到上面类似的显示内容,那就成功了。 Apache 服务器正在工作! + +### 2. 安装 MySQL + +在 Ubuntu 安装 MySQL 请运行: + +``` +$ sudo apt install mysql-server +``` + +使用以下命令验证 MySQL 服务是否正在运行: + +``` +$ sudo systemctl status mysql +``` + +输出结果: + +``` +● mysql.service - MySQL Community Server +Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enab +Active: active (running) since Tue 2019-02-05 11:07:50 UTC; 17s ago +Main PID: 3423 (mysqld) +Tasks: 27 (limit: 2320) +CGroup: /system.slice/mysql.service +└─3423 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid + +Feb 05 11:07:49 ubuntuserver systemd[1]: Starting MySQL Community Server... +Feb 05 11:07:50 ubuntuserver systemd[1]: Started MySQL Community Server. +``` + +MySQL 正在运行! + +#### 2.1 配置数据库管理用户(root)密码 + +默认情况下,MySQL root 用户密码为空。你需要通过运行以下脚本使你的 MySQL 服务器安全: + +``` +$ sudo mysql_secure_installation +``` + +系统将询问你是否要安装 “VALIDATE PASSWORD plugin(密码验证插件)”。该插件允许用户为数据库配置强密码凭据。如果启用,它将自动检查密码的强度并强制用户设置足够安全的密码。**禁用此插件是安全的**。但是,必须为数据库使用唯一的强密码凭据。如果不想启用此插件,只需按任意键即可跳过密码验证部分,然后继续其余步骤。 + +如果回答是 `y`,则会要求你选择密码验证级别。 + +``` +Securing the MySQL server deployment. + +Connecting to MySQL using a blank password. + +VALIDATE PASSWORD PLUGIN can be used to test passwords +and improve security. It checks the strength of password +and allows the users to set only those passwords which are +secure enough. Would you like to setup VALIDATE PASSWORD plugin? + +Press y|Y for Yes, any other key for No y +``` + +可用的密码验证有 “low(低)”、 “medium(中)” 和 “strong(强)”。只需输入适当的数字(0 表示低,1 表示中,2 表示强密码)并按回车键。 + +``` +There are three levels of password validation policy: + +LOW Length >= 8 +MEDIUM Length >= 8, numeric, mixed case, and special characters +STRONG Length >= 8, numeric, mixed case, special characters and dictionary file + +Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: +``` + +现在,输入 MySQL root 用户的密码。请注意,必须根据上一步中选择的密码策略,为 MySQL root 用户使用密码。如果你未启用该插件,则只需使用你选择的任意强度且唯一的密码即可。 + +``` +Please set the password for root here. + +New password: + +Re-enter new password: + +Estimated strength of the password: 50 +Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y +``` + +两次输入密码后,你将看到密码强度(在此示例情况下为 50)。如果你确定可以,请按 `y` 继续提供的密码。如果对密码长度不满意,请按其他任意键并设置一个强密码。我现在的密码可以,所以我选择了`y`。 + +对于其余的问题,只需键入 `y` 并按回车键。这将删除匿名用户、禁止 root 用户远程登录并删除 `test`(测试)数据库。 + +``` +Remove anonymous users? (Press y|Y for Yes, any other key for No) : y +Success. + +Normally, root should only be allowed to connect from +'localhost'. This ensures that someone cannot guess at +the root password from the network. + +Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y +Success. + +By default, MySQL comes with a database named 'test' that +anyone can access. This is also intended only for testing, +and should be removed before moving into a production +environment. + +Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y +- Dropping test database... +Success. + +- Removing privileges on test database... +Success. + +Reloading the privilege tables will ensure that all changes +made so far will take effect immediately. + +Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y +Success. + +All done! +``` + +以上就是为 MySQL root 用户设置密码。 + +#### 2.2 更改 MySQL 超级用户的身份验证方法 + +默认情况下,Ubuntu 系统的 MySQL root 用户为 MySQL 5.7 版本及更新的版本使用插件 `auth_socket` 设置身份验证。尽管它增强了安全性,但是当你使用任何外部程序(例如 phpMyAdmin)访问数据库服务器时,也会变得更困难。要解决此问题,你需要将身份验证方法从 `auth_socket` 更改为 `mysql_native_password`。为此,请使用以下命令登录到你的 MySQL 提示符下: + +``` +$ sudo mysql +``` + +在 MySQL 提示符下运行以下命令,找到所有 MySQL 当前用户帐户的身份验证方法: + +``` +SELECT user,authentication_string,plugin,host FROM mysql.user; +``` + +输出结果: + +``` ++------------------|-------------------------------------------|-----------------------|-----------+ +| user | authentication_string | plugin | host | ++------------------|-------------------------------------------|-----------------------|-----------+ +| root | | auth_socket | localhost | +| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | +| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | +| debian-sys-maint | *F126737722832701DD3979741508F05FA71E5BA0 | mysql_native_password | localhost | ++------------------|-------------------------------------------|-----------------------|-----------+ +4 rows in set (0.00 sec) +``` + +![][2] + +如你所见,Mysql root 用户使用 `auth_socket` 插件进行身份验证。 + +要将此身份验证更改为 `mysql_native_password` 方法,请在 MySQL 提示符下运行以下命令。 别忘了用你选择的强大唯一的密码替换 `password`。 如果已启用 VALIDATION 插件,请确保已根据当前策略要求使用了强密码。 + +``` +ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; +``` + +使用以下命令更新数据库: + +``` +FLUSH PRIVILEGES; +``` + +使用命令再次检查身份验证方法是否已更改: + +``` +SELECT user,authentication_string,plugin,host FROM mysql.user; +``` + +输出结果: + +![][3] + +好!MySQL root 用户就可以使用密码进行身份验证来访问 `mysql shell`。 + +从 MySQL 提示符下退出: + +``` +exit +``` + +### 3. 安装 PHP + +安装 PHP 请运行: + +``` +$ sudo apt install php libapache2-mod-php php-mysql +``` + +安装 PHP 后,在 Apache 文档根目录中创建 `info.php` 文件。通常,在大多数基于 Debian 的 Linux 发行版中,Apache 文档根目录为 `/var/www/html/` 或 `/var/www/`。Ubuntu 18.04 LTS 系统下,文档根目录是 `/var/www/html/`。 + +在 Apache 根目录中创建 `info.php` 文件: + +``` +$ sudo vi /var/www/html/info.php +``` + +在此文件中编辑如下内容: + +``` + +``` + +然后按下 `ESC` 键并且输入 `:wq` 保存并退出此文件。重新启动 Apache 服务使更改生效。 + +``` +$ sudo systemctl restart apache2 +``` + +#### 3.1 测试 PHP + +打开 Web 浏览器,然后导航到 URL 。 + +你就将看到 PHP 测试页面。 + +![](https://www.ostechnix.com/wp-content/uploads/2019/02/php-test-page.png) + +通常,当用户向 Web 服务器发出请求时,Apache 首先会在文档根目录中查找名为 `index.html` 的文件。如果你想将 Apache 更改为 `php` 文件提供服务而不是其他文件,请将 `dir.conf` 配置文件中的 `index.php` 移至第一个位置,如下所示: + +``` +$ sudo vi /etc/apache2/mods-enabled/dir.conf +``` + +上面的配置文件(`dir.conf`) 内容如下: + +``` + +DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm + + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet +``` + +将 `index.php` 移动到最前面。更改后,`dir.conf` 文件内容看起来如下所示。 + +``` + +DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm + + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet +``` + +然后按下 `ESC` 键并且输入 `:wq` 保存并关闭此文件。重新启动 Apache 服务使更改生效。 + +``` +$ sudo systemctl restart apache2 +``` + +#### 3.2 安装 PHP 模块 + +为了增加 PHP 的功能,可以安装一些其他的 PHP 模块。 + +要列出可用的 PHP 模块,请运行: + +``` +$ sudo apt-cache search php- | less +``` + +输出结果: + +![][4] + +使用方向键浏览结果。要退出,请输入 `q` 并按下回车键。 + +要查找任意 `php` 模块的详细信息,例如 `php-gd`,请运行: + +``` +$ sudo apt-cache show php-gd +``` + +安装 PHP 模块请运行: + +``` +$ sudo apt install php-gd +``` + +安装所有的模块(虽然没有必要),请运行: + +``` +$ sudo apt-get install php* +``` + +安装任何 `php` 模块后,请不要忘记重新启动 Apache 服务。要检查模块是否已加载,请在浏览器中打开 `info.php` 文件并检查是否存在。 + +接下来,你可能需要安装数据库管理工具,以通过 Web 浏览器轻松管理数据库。如果是这样,请按照以下链接中的说明安装 `phpMyAdmin`。 + +祝贺你!我们已经在 Ubuntu 服务器中成功配置了 LAMP 套件。 + +-------------------------------------------------------------------------------- + +via: https://www.ostechnix.com/install-apache-mysql-php-lamp-stack-on-ubuntu-18-04-lts/ + +作者:[SK][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.ostechnix.com/author/sk/ +[b]: https://github.com/lujun9972 +[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 +[2]: http://www.ostechnix.com/wp-content/uploads/2019/02/mysql-1.png +[3]: http://www.ostechnix.com/wp-content/uploads/2019/02/mysql-2.png +[4]: http://www.ostechnix.com/wp-content/uploads/2016/06/php-modules.png diff --git a/published/202101/20190215 Make websites more readable with a shell script.md b/published/202101/20190215 Make websites more readable with a shell script.md new file mode 100644 index 0000000000..a84cdfaa40 --- /dev/null +++ b/published/202101/20190215 Make websites more readable with a shell script.md @@ -0,0 +1,261 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13052-1.html) +[#]: subject: (Make websites more readable with a shell script) +[#]: via: (https://opensource.com/article/19/2/make-websites-more-readable-shell-script) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +利用 Shell 脚本让网站更具可读性 +====== + +> 测算网站的文本和背景之间的对比度,以确保站点易于阅读。 + +![](https://img.linux.net.cn/data/attachment/album/202101/25/231152ce5ufhjtufxj1eeu.jpg) + +如果希望人们发现你的网站实用,那么他们需要能够阅读它。为文本选择的颜色可能会影响网站的可读性。不幸的是,网页设计中的一种流行趋势是在打印输出文本时使用低对比度的颜色,就像在白色背景上的灰色文本。对于 Web 设计师来说,这也许看起来很酷,但对于许多阅读它的人来说确实很困难。 + +W3C 提供了《Web 内容可访问性指南Web Content Accessibility Guidelines》,其中包括帮助 Web 设计人员选择易于区分文本和背景色的指导。z这就是所谓的“对比度contrast ratio”。 W3C 定义的对比度需要进行一些计算:给定两种颜色,首先计算每种颜色的相对亮度,然后计算对比度。对比度在 1 到 21 的范围内(通常写为 1:1 到 21:1)。对比度越高,文本在背景下的突出程度就越高。例如,白色背景上的黑色文本非常醒目,对比度为 21:1。对比度为 1:1 的白色背景上的白色文本不可读。 + +[W3C 说,正文][1] 的对比度至少应为 4.5:1,标题至少应为 3:1。但这似乎是最低限度的要求。W3C 还建议正文至少 7:1,标题至少 4.5:1。 + +计算对比度可能比较麻烦,因此最好将其自动化。我已经用这个方便的 Bash 脚本做到了这一点。通常,脚本执行以下操作: + + 1. 获取文本颜色和背景颜色 + 2. 计算相对亮度 + 3. 计算对比度 + +### 获取颜色 + +你可能知道显示器上的每种颜色都可以用红色、绿色和蓝色(R、G 和 B)来表示。要计算颜色的相对亮度,脚本需要知道颜色的红、绿和蓝的各个分量。理想情况下,脚本会将这些信息读取为单独的 R、G 和 B 值。 Web 设计人员可能知道他们喜欢的颜色的特定 RGB 代码,但是大多数人不知道不同颜色的 RGB 值。作为一种替代的方法是,大多数人通过 “red” 或 “gold” 或 “maroon” 之类的名称来引用颜色。 + +幸运的是,GNOME 的 [Zenity][2] 工具有一个颜色选择器应用程序,可让你使用不同的方法选择颜色,然后用可预测的格式 `rgb(R,G,B)` 返回 RGB 值。使用 Zenity 可以轻松获得颜色值: + +``` +color=$( zenity --title 'Set text color' --color-selection --color='black' ) +``` + +如果用户(意外地)单击 “Cancel(取消)” 按钮,脚本将假定一种颜色: + +``` +if [ $? -ne 0 ] ; then +        echo '** color canceled .. assume black' +        color='rgb(0,0,0)' +fi +``` + +脚本对背景颜色值也执行了类似的操作,将其设置为 `$background`。 + +### 计算相对亮度 + +一旦你在 `$color` 中设置了前景色,并在 `$background` 中设置了背景色,下一步就是计算每种颜色的相对亮度。 [W3C 提供了一个算法][3] 用以计算颜色的相对亮度。 + +> 对于 sRGB 色彩空间,一种颜色的相对亮度定义为: +> +> L = 0.2126 * R + 0.7152 * G + 0.0722 * B +> +> R、G 和 B 定义为: +> +> if $R_{sRGB}$ <= 0.03928 then R = $R_{sRGB}$/12.92 +> +> else R = (($R_{sRGB}$+0.055)/1.055) $^{2.4}$ +> +> if $G_{sRGB}$ <= 0.03928 then G = $G_{sRGB}$/12.92 +> +> else G = (($G_{sRGB}$+0.055)/1.055) $^{2.4}$ +> +> if $B_{sRGB}$ <= 0.03928 then B = $B_{sRGB}$/12.92 +> +> else B = (($B_{sRGB}$+0.055)/1.055) $^{2.4}$ +> +> $R_{sRGB}$、$G_{sRGB}$ 和 $B_{sRGB}$ 定义为: +> +> $R_{sRGB}$ = $R_{8bit}$/255 +> +> $G_{sRGB}$ = $G_{8bit}$/255 +> +> $B_{sRGB}$ = $B_{8bit}$/255 + +由于 Zenity 以 `rgb(R,G,B)` 的格式返回颜色值,因此脚本可以轻松拉取分隔开的 R、B 和 G 的值以计算相对亮度。AWK 可以使用逗号作为字段分隔符(`-F,`),并使用 `substr()` 字符串函数从 `rgb(R,G,B)` 中提取所要的颜色值: + +``` +R=$( echo $color | awk -F, '{print substr($1,5)}' ) +G=$( echo $color | awk -F, '{print $2}' ) +B=$( echo $color | awk -F, '{n=length($3); print substr($3,1,n-1)}' ) +``` + +*有关使用 AWK 提取和显示数据的更多信息,[查看 AWK 备忘表][4]* + +最好使用 BC 计算器来计算最终的相对亮度。BC 支持计算中所需的简单 `if-then-else`,这使得这一过程变得简单。但是由于 BC 无法使用非整数指数直接计算乘幂,因此需要使用自然对数替代它做一些额外的数学运算: + +``` +echo "scale=4 +rsrgb=$R/255 +gsrgb=$G/255 +bsrgb=$B/255 +if ( rsrgb <= 0.03928 ) r = rsrgb/12.92 else r = e( 2.4 * l((rsrgb+0.055)/1.055) ) +if ( gsrgb <= 0.03928 ) g = gsrgb/12.92 else g = e( 2.4 * l((gsrgb+0.055)/1.055) ) +if ( bsrgb <= 0.03928 ) b = bsrgb/12.92 else b = e( 2.4 * l((bsrgb+0.055)/1.055) ) +0.2126 * r + 0.7152 * g + 0.0722 * b" | bc -l +``` + +这会将一些指令传递给 BC,包括作为相对亮度公式一部分的 `if-then-else` 语句。接下来 BC 打印出最终值。 + +### 计算对比度 + +利用文本颜色和背景颜色的相对亮度,脚本就可以计算对比度了。 [W3C 确定对比度][5] 是使用以下公式: + +> (L1 + 0.05) / (L2 + 0.05),这里的 +> L1 是颜色较浅的相对亮度, +> L2 是颜色较深的相对亮度。 + +给定两个相对亮度值 `$r1` 和 `$r2`,使用 BC 计算器很容易计算对比度: + +``` +echo "scale=2 +if ( $r1 > $r2 ) { l1=$r1; l2=$r2 } else { l1=$r2; l2=$r1 } +(l1 + 0.05) / (l2 + 0.05)" | bc +``` + +使用 `if-then-else` 语句确定哪个值(`$r1` 或 `$r2`)是较浅还是较深的颜色。BC 执行结果计算并打印结果,脚本可以将其存储在变量中。 + +### 最终脚本 + +通过以上内容,我们可以将所有内容整合到一个最终脚本。 我使用 Zenity 在文本框中显示最终结果: + +``` +#!/bin/sh +# script to calculate contrast ratio of colors + +# read color and background color: +# zenity returns values like 'rgb(255,140,0)' and 'rgb(255,255,255)' + +color=$( zenity --title 'Set text color' --color-selection --color='black' ) +if [ $? -ne 0 ] ; then + echo '** color canceled .. assume black' + color='rgb(0,0,0)' +fi + +background=$( zenity --title 'Set background color' --color-selection --color='white' ) +if [ $? -ne 0 ] ; then + echo '** background canceled .. assume white' + background='rgb(255,255,255)' +fi + +# compute relative luminance: + +function luminance() +{ + R=$( echo $1 | awk -F, '{print substr($1,5)}' ) + G=$( echo $1 | awk -F, '{print $2}' ) + B=$( echo $1 | awk -F, '{n=length($3); print substr($3,1,n-1)}' ) + + echo "scale=4 +rsrgb=$R/255 +gsrgb=$G/255 +bsrgb=$B/255 +if ( rsrgb <= 0.03928 ) r = rsrgb/12.92 else r = e( 2.4 * l((rsrgb+0.055)/1.055) ) +if ( gsrgb <= 0.03928 ) g = gsrgb/12.92 else g = e( 2.4 * l((gsrgb+0.055)/1.055) ) +if ( bsrgb <= 0.03928 ) b = bsrgb/12.92 else b = e( 2.4 * l((bsrgb+0.055)/1.055) ) +0.2126 * r + 0.7152 * g + 0.0722 * b" | bc -l +} + +lum1=$( luminance $color ) +lum2=$( luminance $background ) + +# compute contrast + +function contrast() +{ + echo "scale=2 +if ( $1 > $2 ) { l1=$1; l2=$2 } else { l1=$2; l2=$1 } +(l1 + 0.05) / (l2 + 0.05)" | bc +} + +rel=$( contrast $lum1 $lum2 ) + +# print results + +( cat< 容器构建有两大趋势:使用基本镜像和从头开始构建。每个都有工程上的权衡。 + +![](https://img.linux.net.cn/data/attachment/album/202101/16/223919aubhguedlt8sk8i8.jpg) + +有人说 Linux 发行版不再与容器有关。像 distroless 和 scratch 容器等可替代的方法,似乎是风靡一时。看来,我们在考虑和做出技术决策时,更多的是基于时尚感和即时的情感满足,而不是考虑我们选择的次要影响。我们应该问这样的问题:这些选择将如何影响未来六个月的维护?工程权衡是什么?这种范式转换如何影响我们的大规模构建系统? + +这真让人沮丧。如果我们忘记了工程是一个零和游戏,有可衡量的利弊权衡,有不同方法的成本和收益 —— 这样对我们自己不利,对雇主不利,对最终维护我们的代码的同事不利。最后,我们对所有的维护人员([向维护人员致敬!][1] )都是一种伤害,因为我们不欣赏他们所做的工作。 + +### 理解问题所在 + +为了理解这个问题,我们必须首先研究为什么我们使用 Linux 发行版。我将把原因分为两大类:内核和其他包。编译内核实际上相当容易。Slackware 和 Gentoo( 我的小心脏还是有点害怕)教会了我们这一点。 + +另一方面,对于一个可用的 Linux 系统需要打包大量的开发软件和应用软件,这可能会让人望而生畏。此外,确保数百万个程序包可以一起安装和工作的唯一方法是使用旧的范例:即编译它并将它作为一个工件(即 Linux 发行版)一起发布。那么,为什么 Linux 发行版要将内核和所有包一起编译呢?很简单:确保事情协调一致。 + +首先,我们来谈谈内核。内核很特别。在没有编译好的内核的情况下引导 Linux 系统有点困难。它是 Linux 操作系统的核心,也是我们在系统启动时首先依赖的。内核在编译时有很多不同的配置选项,这些选项会对硬件和软件如何在一个内核上运行产生巨大影响。这方面中的第二个问题是,系统软件(如编译器 、C 库和解释器)必须针对内核中内置的选项进行调优。Gentoo 的维基以一种发自内心的方式教我们这一点,它把每个人都变成了一个微型的开发版维护者。 + +令人尴尬的是(因为我在过去五年里一直在使用容器),我必须承认我最近才编译过内核。我必须让嵌套的 KVM 在 RHEL7 上工作,这样我才能在笔记本电脑上的 KVM 虚拟机中运行 [OpenShift on OpenStack][2] 虚拟机,以及我的 [Container Development Kit(CDK)][3]。我只想说,当时我在一个全新的 4.X 内核上启动了 RHEL7。和任何优秀的系统管理员一样,我有点担心自己错过了一些重要的配置选项和补丁。当然,我也的确错过了一些东西。比如睡眠模式无法正常工作,我的扩展底座无法正常工作,还有许多其他小的随机错误。但它在我的笔记本电脑上的一个 KVM 虚拟机上,对于 OpenStack 上的 OpenShift 的实时演示来说已经足够好了。来吧,这很有趣,对吧?但我离题了…… + +现在,我们来谈谈其他的软件包。虽然内核和相关的系统软件可能很难编译,但从工作负载的角度来看,更大的问题是编译成千上万的包,以提供一个可用的 Linux 系统。每个软件包都需要专业知识。有些软件只需要运行三个命令:`./configure`、`make` 和 `make install`。另一些则需要大量的专业知识,从在 `etc` 中添加用户和配置特定的默认值到运行安装后脚本和添加 systemd 单元文件。对于任何一个人来说,调试好你可能用得到的成千上万种不同软件所需要的一套技能都是令人望而生畏的。但是,如果你想要一个可以随时尝试新软件的可用系统,你必须学会如何编译和安装新软件,然后才能开始学习使用它。这就是没有 Linux 发行版的 Linux。当你放弃使用 Linux 发行版时,那么你就得自己编译软件。 + +关键是,你必须将所有内容构建在一起,以确保它能够以任何合理的可靠性级别协同工作,而且构建一个可用的包群需要大量的知识。这是任何一个开发人员或系统管理员都无法合理地学习和保留的知识。我描述的每个问题都适用于你的 [容器主机][4](内核和系统软件)和 [容器镜像][5](系统软件和所有其他包)——请注意:在容器镜像中还包含有编译器 、C 库、解释器和 JVM。 + +### 解决方案 + +所以你也看到了,其实使用 Linux 发行版就是解决方案。别再看了,给离你最近的软件包维护者(再次向维护人员致敬!)发张电子卡吧(等等,我是不是把我的年龄告诉别人了?)。不过说真的,这些人做了大量的工作,这真的是被低估了。Kubernetes、Istio、Prometheus,还有 Knative:我在看着你们。你们的时代要来了,到时候你们会进入维护模式,被过度使用,被低估。大约七到十年后,我将再次写这篇文章,可能是关于 Kubernetes 的。 + +### 容器构建的首要原则 + +从零开始构建和从基础镜像构建之间存在权衡。 + +#### 从基础镜像构建 + +从基础镜像构建的优点是,大多数构建操作只不过是安装或更新包。它依赖于 Linux 发行版中包维护人员所做的大量工作。它还有一个优点,即六个月甚至十年后的修补事件(使用 RHEL)是运维/系统管理员事件 (`yum update`),而不是开发人员事件(这需要通过代码找出某些函数参数不再工作的原因)。 + +你想想,应用程序代码依赖于许多库,从 JSON mung 库到对象关系映射器。与 Linux 内核和 Glibc 不同,这些类型的库很少改变 API 兼容性。这意味着三年后你的修补事件可能会变成代码更改事件,而不是 yum 更新事件。因此让他自己深入下去吧。开发人员,如果安全团队找不到防火墙黑客来阻止攻击,你将在凌晨 2 点收到短信。 + +从基础镜像构建不是完美的;还有一些缺点,比如所有被拖入的依赖项的大小。这几乎总是会使容器镜像比从头开始构建的镜像更大。另一个缺点是你并不总是能够访问最新的上游代码。这可能会让开发人员感到沮丧,尤其是当你只想使用依赖项中的一部分功能时,但是你仍然不得不将你根本用不着的东西一起打包带走,因为上游的维护人员一直在改变这个库。 + +如果你是一个 web 开发人员,正在对我翻白眼,我有一个词可以形容你:DevOps。那意味着你带着寻呼机,我的朋友。 + +#### Scratch 构建 + +Scratch 构建的优点是镜像非常小。当你不依赖容器中的 Linux 发行版时,你有很多控制权,这意味着你可以根据需要定制所有内容。这是一个最佳模型,在某些用例中是很有效的。另一个优势是你可以访问最新的软件包。你不必等待 Linux 发行版更新任何内容。是你自己在控制,所以你可以自行选择什么时候去费功夫纳入新的软件。 + +记住,控制一切都是有代价的。通常,更新到具有新特性的新库会拖如不必要的 API 更改,这意味着修复代码中的不兼容(换句话说,这就像[给牦牛剪毛][6])。在凌晨 2 点应用程序不起作用的时候给牦牛剪毛是不好玩的。幸运的是,使用容器,你可以在下一个工作日回滚并给牦牛剪毛,但它仍会占用你为业务提供新价值、为应用程序提供新功能的时间。欢迎来到系统管理员的生活。 + +好吧,也就是说,有些时候,Scratch 构建是有意义的。我完全承认,静态编译的 Golang 程序和 C 程序是 scratch/distorless 构建的两个不错的候选程序。对于这些类型的程序,每个容器构建都是一个编译事件。三年后你仍然需要担心 API 的损坏,但是如果你是一个 Golang 商店,你应该有能力随着时间的推移修复问题。 + +### 结论 + +基本上,Linux 发行版做了大量工作来节省你在常规 Linux 系统或容器上的时间。维护人员所拥有的知识是巨大的,而且没有得到真正的赞赏。容器的采用使得问题更加严重,因为它被进一步抽象了。 + +通过容器主机,Linux 发行版可以让你访问广泛的硬件生态系统,从微型 ARM 系统到 128 核 CPU x86 巨型机箱,再到云服务商的虚拟机。他们提供可工作的容器引擎和开箱即用的容器运行时环境,所以你只需启动你的容器,让其他人担心事情的进展。 + +对于容器镜像,Linux 发行版为你的项目提供了对大量软件的轻松访问。即使你从头开始构建,你也可能会看到一个包维护人员是如何构建和运送东西的 —— 一个好的艺术家是一个好的偷学者,所以不要低估这项工作的价值。 + +所以,感谢 Fedora、RHEL(Frantisek,你是我的英雄 )、Debian、Gentoo 和其他 Linux 发行版的所有维护人员。我很感激你所做的工作,尽管我是个“容器工人” + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/2/linux-distributions-still-matter-containers + +作者:[Scott McCarty][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/fatherlinux +[b]: https://github.com/lujun9972 +[1]: https://aeon.co/essays/innovation-is-overvalued-maintenance-often-matters-more +[2]: https://blog.openshift.com/openshift-on-openstack-delivering-applications-better-together/ +[3]: https://developers.redhat.com/blog/2018/02/13/red-hat-cdk-nested-kvm/ +[4]: https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.8tyd9p17othl +[5]: https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.dqlu6589ootw +[6]: https://en.wiktionary.org/wiki/yak_shaving diff --git a/published/202101/20190322 Printing from the Linux command line.md b/published/202101/20190322 Printing from the Linux command line.md new file mode 100644 index 0000000000..a497906293 --- /dev/null +++ b/published/202101/20190322 Printing from the Linux command line.md @@ -0,0 +1,175 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13012-1.html) +[#]: subject: (Printing from the Linux command line) +[#]: via: (https://www.networkworld.com/article/3373502/printing-from-the-linux-command-line.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +从 Linux 命令行进行打印 +====== + +> 在 Linux 命令行进行打印的内容比单单一个 `lp` 命令多得多,让我们来看一些可用选项。 + +![Sherry \(CC BY 2.0\)][1] + +Linux 命令行打印很容易。你可以使用 `lp` 命令来请求打印,并使用 `lpq` 命令来查看队列中有哪些打印作业,但是当你要双面打印或使用纵向模式时,这些会变得有些复杂。你可能还需要做很多其他事情,例如打印多份文档副本或取消打印作业。让我们来看看一些选项,当你从命令行打印时,如何让你的打印输出看起来如你所愿。 + +### 显示打印机配置 + +要从命令行查看打印机设置,请使用 `lpoptions` 命令。 输出应如下所示: + +``` +$ lpoptions +copies=1 device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=1553023232 marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 marker-levels=18,62,62,63 marker-names='Black\ Cartridge\ HP\ CC530A,Cyan\ Cartridge\ HP\ CC531A,Magenta\ Cartridge\ HP\ CC533A,Yellow\ Cartridge\ HP\ CC532A' marker-types=toner,toner,toner,toner number-up=1 printer-commands=none printer-info='HP Color LaserJet CP2025dn (F47468)' printer-is-accepting-jobs=true printer-is-shared=true printer-is-temporary=false printer-location printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' printer-state=3 printer-state-change-time=1553023232 printer-state-reasons=none printer-type=167964 printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn sides=one-sided +``` + +如果将其空格转换为回车符,输出可能会更人性化,请注意列出了多少设置选项。 + +注意:在下面的输出中,一些行被重新链接,以使输出更具可读性。 + +``` +$ lpoptions | tr " " '\n' +copies=1 +device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ +finishings=3 +job-cancel-after=10800 +job-hold-until=no-hold +job-priority=50 +job-sheets=none,none +marker-change-time=1553023232 +marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 +marker-levels=18,62,62,63 +marker-names='Black\ Cartridge\ HP\ CC530A, +Cyan\ Cartridge\ HP\ CC531A, +Magenta\ Cartridge\ HP\ CC533A, +Yellow\ Cartridge\ HP\ CC532A' +marker-types=toner,toner,toner,toner +number-up=1 +printer-commands=none +printer-info='HP Color LaserJet CP2025dn (F47468)' +printer-is-accepting-jobs=true +printer-is-shared=true +printer-is-temporary=false +printer-location +printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' +printer-state=3 +printer-state-change-time=1553023232 +printer-state-reasons=none +printer-type=167964 +printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn +sides=one-sided +``` + +使用 `-v` 选项时,`lpinfo` 命令将列出驱动程序和相关信息: + +``` +$ lpinfo -v +network ipp +network https +network socket +network beh +direct hp +network lpd +file cups-brf:/ +network ipps +network http +direct hpfax +network dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ <== printer +network socket://192.168.0.23 <== printer IP +``` + +`lpoptions` 命令将显示默认打印机的设置。使用 `-p` 选项指定其中一个可用打印机代号: + +``` +$ lpoptions -p LaserJet +``` + +`lpstat -p` 命令显示打印机的状态,而 `lpstat -p -d` 列出可用打印机列表。 + +``` +$ lpstat -p -d +printer Color-LaserJet-CP2025dn is idle. enabled since Tue 19 Mar 2019 05:07:45 PM EDT +system default destination: Color-LaserJet-CP2025dn +``` + +### 非常有用的命令 + +要在默认打印机上打印文档,只需使用 `lp` 命令,后跟要打印的文件名即可。 如果文件名包含空格(在 Linux 系统上很少见),请将该名称放在引号中或开始输入文件名并按 `Tab` 键调用空格的转义标志(如下面的第二个示例所示)。 + +``` +$ lp "never leave home angry" +$ lp never\ leave\ home\ angry +``` + +`lpq` 命令显示打印队列: + +``` +$ lpq +Color-LaserJet-CP2025dn is ready and printing +Rank Owner Job File(s) Total Size +active shs 234 agenda 2048 bytes +``` + +使用 `-n` 选项时,`lp` 命令可用来指定所需打印输出的份数: + +``` +$ lp -n 11 agenda +``` + +要取消打印作业,可以使用 `cancel` 或 `lprm` 命令。如果没来得及执行,则可能会看到以下信息: + +``` +$ cancel 229 +cancel: cancel-job failed: Job #229 is already completed - can't cancel. +``` + +### 双面打印 + +要以双面模式打印,你可以在 `lp` 命令中使用 `sides` 选项,该选项不但表示了在纸张的正反面进行打印,还表示了从纸张的哪个边开始打印。这个设置代表了你期望以双面纵向文档的正常方式打印。 + +``` +$ lp -o sides=two-sided-long-edge Notes.pdf +``` + +如果要所有文档以双面模式打印,则可以使用 `lpoptions` 命令更改 `sides` 设置以修改 `lp` 的设置。 + +``` +$ lpoptions -o sides=two-sided-short-edge +``` + +要恢复为单面打印,可以使用如下命令: + +``` +$ lpoptions -o sides=one-sided +``` + +#### 横向打印 + +要以横向模式打印,可以在 `lp` 命令中使用 `landscape` 选项。 + +``` +$ lp -o landscape penguin.jpg +``` + +### CUPS(Unix 通用打印系统) + +Linux 系统上使用的打印系统是基于标准的开源打印系统,称为 **CUPS**,原意是Unix 通用打印系统Common Unix Printing System。 它允许计算机充当打印服务器。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3373502/printing-from-the-linux-command-line.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2019/03/printouts-paper-100791390-large.jpg +[2]: https://www.facebook.com/NetworkWorld/ +[3]: https://www.linkedin.com/company/network-world diff --git a/published/202101/20190516 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-2.md b/published/202101/20190516 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-2.md new file mode 100644 index 0000000000..f9e59dc291 --- /dev/null +++ b/published/202101/20190516 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-2.md @@ -0,0 +1,264 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13015-1.html) +[#]: subject: (Monitor and Manage Docker Containers with Portainer.io \(GUI tool\) – Part-2) +[#]: via: (https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/) +[#]: author: (Shashidhar Soppin https://www.linuxtechi.com/author/shashidhar/) + +用 Portainer.io 来监控和管理 Docker 容器(2) +====== + +![](https://img.linux.net.cn/data/attachment/album/202101/14/204401knuxjru53n5su6ns.jpg) + +作为[第 1 部分](https://linux.cn/article-12634-1.html)的延续,本第 2 部分将介绍 Portainer 的其余功能。 + +### 监控 docker 容器镜像 + +``` +root@linuxtechi ~}$ docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +9ab9aa72f015 ubuntu "/bin/bash" 14 seconds ago Exited (0) 12 seconds ago suspicious_shannon +305369d3b2bb centos "/bin/bash" 24 seconds ago Exited (0) 22 seconds ago admiring_mestorf +9a669f3dc4f6 portainer/portainer "/portainer" 7 minutes ago Up 7 minutes 0.0.0.0:9000->9000/tcp trusting_keller +``` + +包括 `portainer`(docker 容器镜像),所有已退出和当前正在运行的 docker 镜像都会显示出来。下面的 Portainer GUI 屏幕截图显示了相同的情况。 + +![Docker_status][1] + +### 监视事件 + +单击 portainer 网页中的“Events”选项,如下所示。 + +基于 docker 容器活动生成和创建的各种事件将被提取并显示在此页面中. + +![Container-Events-Poratiner-GUI][3] + +现在检查并验证“Events”部分是如何工作的。创建一个新的 docker 容器镜像 `redis`,如下所述,在 docker 命令行检查状态:`docker ps –a`: + +``` +root@linuxtechi ~}$ docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +cdbfbef59c31 redis "docker-entrypoint.s…" About a minute ago Up About a minute 6379/tcp angry_varahamihira +9ab9aa72f015 ubuntu "/bin/bash" 10 minutes ago Exited (0) 10 minutes ago suspicious_shannon +305369d3b2bb centos "/bin/bash" 11 minutes ago Exited (0) 11 minutes ago admiring_mestorf +9a669f3dc4f6 portainer/portainer "/portainer" 17 minutes ago Up 17 minutes 0.0.0.0:9000->9000/tcp trusting_keller +``` + +单击顶部的“Event List”刷新事件列表, + +![events_updated][5] + +现在事件的页面也更新了这个变化, + +### 主机状态 + +下面是 portainer 显示主机状态的屏幕截图。这是一个简单的窗口。这显示了主机 Linux 机器的基本信息,如“CPU”、“主机名”、“操作系统信息”等。这个页面在不需要登录主机命令行的情况下提供了非常有用的信息,以便快速浏览。 + +![Host-names-Portainer][7] + +### Portainer 中的仪表板 + +到目前为止,我们已经在“Local”部分看到了基于 portainer 的各种特性。现在跳到所选 Docker 容器镜像的“Dashboard”部分。 + +在 Portainer 的网页中单击“EndPoint”选项时,会出现以下窗口: + +![End_Point_Settings][9] + +对于主机容器镜像,此仪表板有许多状态和选项。 + +#### Stacks + +单击此选项可提供任何堆栈(如果有的话)的状态。因为这里没有堆栈,所以显示为零。 + +#### Images + +单击此选项可提供主机中可用的容器镜像。此选项将显示所有活动和退出的容器镜像。 + +![Docker-Container-Images-Portainer][11] + +例如,再创建一个“Nginx”容器并刷新此列表以查看更新: + +``` +root@linuxtechi ~}$ sudo docker run nginx +Unable to find image 'nginx:latest' locally +latest: Pulling from library/nginx +27833a3ba0a5: Pull complete +ea005e36e544: Pull complete +d172c7f0578d: Pull complete +Digest: sha256:e71b1bf4281f25533cf15e6e5f9be4dac74d2328152edf7ecde23abc54e16c1c +Status: Downloaded newer image for nginx:latest +``` + +下面是刷新后的镜像界面: + +![Nginx_Image_creation][13] + +当 Nginx 镜像处于 `stopped`/`killed` 状态时,docker 的容器镜像会改变为 `unused` 状态。 + +**注**:你可以看到这里所有的镜像的细节都非常清楚,比如内存使用,创建日期和时间。与命令行选项相比,从这里维护和监视容器将非常容易。 + +#### Networks + +此选项用于网络操作。例如分配 IP 地址、创建子网、提供 IP 地址范围、访问控制(管理员和普通用户)。下面的窗口提供了各种可能选项的详细信息。根据你的需要,可以进一步去自行研究这些选项。 + +![Conatiner-Network-Portainer][15] + +输入所有各种网络参数后,单击“create network”按钮即可创建网络。 + +#### Container + +此选项将提供容器状态。此列表将提供有关活动的和未运行的容器状态的详细信息。此输出类似于 docker ps 命令选项。 + +![Containers-Status-Portainer][17] + +在该窗口中,通过选中复选框并选择上述按钮可以根据需要控制容器停止和启动。一个例子如下: + +例如,“CentOS”和“Ubuntu”容器都处于停止状态,现在可以通过选中复选框并点击“Start”按钮来启动它们。 + +![start_containers1][19] + +![start_containers2][21] + +**注意:** 因为这两个都是 Linux 容器镜像,所以不会被启动。Portainer 尝试启动,但稍后又停止。试试启动“Nginx”,你会看到它变成了 `running` 状态。 + +![start_containers3][23] + +#### Volume + +参见本文章第一部分。 + +### Portainer 中的设置选项 + +到目前为止,我们已经在“Local”部分看到了基于 portainer 的各种特性。现在跳到所选 Docker 容器图像的“Settings”部分。 + +在 Portainer 的网页中单击“Settings”选项时,可以使用以下的配置选项: + +#### Extensions + +这是一个简单的 Portainer CE 订阅程序。详细信息和用途可以从附加的窗口中看到。这主要用于维护相应版本的许可证和订阅。 + +![Extensions][25] + +#### Users + +此选项用于添加具有或不具有管理权限的“用户”。下面的示例提供了相同的示例。 + +在本例中输入你的想好的用户名比如“shashi”和你选择的密码,然后点击下面的“Create User”按钮。 + +![create_user_portainer][27] + +![create_user2_portainer][29] + +![Internal-user-Portainer][31] + +类似地,可以通过选中复选框并点击 “remove” 按钮来删除刚刚创建的用户“shashi”。 + +![user_remove_portainer][33] + +#### Endpoints + +此选项用于端点终端管理。终端可以添加和删除,如附加窗口中所示。 + +![Endpoint-Portainer-GUI][35] + +新终端“shashi”是使用如下所示的各种默认参数创建的, + +![Endpoint2-Portainer-GUI][37] + +类似地,可以通过单击复选框并单击移除按钮来移除此端点。 + +#### Registries + +此选项用于注册管理。由于 docker hub 有各种镜像的注册,因此此功能可用于类似的目的。 + +![Registry-Portainer-GUI][39] + +使用默认选项就可以创建“shashi-registry”。 + +![Registry2-Portainer-GUI][41] + +同样,如果不需要了,就可以移除它。 + +#### Settings + +此选项用于设置以下各种选项, + +* 设置快照间隔 +* 设置自定义徽标 +* 创建外部模板 +* 安全功能,如:为非管理员禁用和启用 bin 挂载,为非管理员禁用/启用权限,启用主机管理功能 + +下面的屏幕截图显示了出于演示目的启用和禁用的一些选项。一旦全部完成点击“保存设置”按钮保存所有这些选项。 + +![Portainer-GUI-Settings][43] + +现在点开“Authentication settings”就会弹出 LDAP、Internal 和 OAuth(extension)选项,如下所示: + +![Authentication-Portainer-GUI-Settings][45] + +根据我们想要的环境安全特性级别,选择相应的选项。 + +以上就是本文的内容,我希望这些介绍 portainer 的文章能帮助你更有效地管理和监视容器。请分享你的反馈和意见。 + +-------------------------------------------------------------------------------- + +via: https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/ + +作者:[Shashidhar Soppin][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linuxtechi.com/author/shashidhar/ +[b]: https://github.com/lujun9972 +[1]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker_status-1024x423.jpg +[2]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker_status.jpg +[3]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Events-1024x404.jpg +[4]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Events.jpg +[5]: https://www.linuxtechi.com/wp-content/uploads/2019/05/events_updated-1024x414.jpg +[6]: https://www.linuxtechi.com/wp-content/uploads/2019/05/events_updated.jpg +[7]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Host_names-1024x408.jpg +[8]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Host_names.jpg +[9]: https://www.linuxtechi.com/wp-content/uploads/2019/05/End_Point_Settings-1024x471.jpg +[10]: https://www.linuxtechi.com/wp-content/uploads/2019/05/End_Point_Settings.jpg +[11]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Images-1024x398.jpg +[12]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Images.jpg +[13]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Nginx_Image_creation-1024x439.jpg +[14]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Nginx_Image_creation.jpg +[15]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Network-1024x463.jpg +[16]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Network.jpg +[17]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Containers-1024x364.jpg +[18]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Containers.jpg +[19]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers1-1024x432.jpg +[20]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers1.jpg +[21]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers2-1024x307.jpg +[22]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers2.jpg +[23]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers3-1024x435.jpg +[24]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers3.jpg +[25]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Extensions-1024x421.jpg +[26]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Extensions.jpg +[27]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user-1024x350.jpg +[28]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user.jpg +[29]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user2-1024x372.jpg +[30]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user2.jpg +[31]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Internal-user-Portainer-1024x257.jpg +[32]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Internal-user-Portainer.jpg +[33]: https://www.linuxtechi.com/wp-content/uploads/2019/05/user_remove-1024x318.jpg +[34]: https://www.linuxtechi.com/wp-content/uploads/2019/05/user_remove.jpg +[35]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint-1024x349.jpg +[36]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint.jpg +[37]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint2-1024x379.jpg +[38]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint2.jpg +[39]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry-1024x420.jpg +[40]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry.jpg +[41]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry2-1024x409.jpg +[42]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry2.jpg +[43]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-GUI-Settings-1024x418.jpg +[44]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-GUI-Settings.jpg +[45]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Authentication-Portainer-GUI-Settings-1024x344.jpg +[46]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Authentication-Portainer-GUI-Settings.jpg diff --git a/published/202101/20190924 Integrate online documents editors, into a Python web app using ONLYOFFICE.md b/published/202101/20190924 Integrate online documents editors, into a Python web app using ONLYOFFICE.md new file mode 100644 index 0000000000..b1404ac687 --- /dev/null +++ b/published/202101/20190924 Integrate online documents editors, into a Python web app using ONLYOFFICE.md @@ -0,0 +1,391 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13037-1.html) +[#]: subject: (Integrate online documents editors, into a Python web app using ONLYOFFICE) +[#]: via: (https://opensourceforu.com/2019/09/integrate-online-documents-editors-into-a-python-web-app-using-onlyoffice/) +[#]: author: (Aashima Sharma https://opensourceforu.com/author/aashima-sharma/) + +利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中 +====== + +![][1] + +[ONLYOFFICE][3] 是根据 GNU AGPL v.3 许可证条款分发的开源协作办公套件。它包含三个用于文本文档、电子表格和演示文稿的编辑器,并具有以下功能: + + * 查看,编辑和协同编辑 `.docx`、`.xlsx`、`.pptx` 文件。OOXML 作为一种核心格式,可确保与 Microsoft Word、Excel 和 PowerPoint 文件的高度兼容性。 + * 通过内部转换为 OOXML,编辑其他流行格式(`.odt`、`.rtf`、`.txt`、`.html`、`.ods`、`.csv`、`.odp`)。 + * 熟悉的选项卡式界面。 + * 协作工具:两种协同编辑模式(快速和严谨),跟踪更改,评论和集成聊天。 + * 灵活的访问权限管理:完全访问权限、只读、审阅、表单填写和评论。 + * 使用 API 构建附加组件。 + * 250 种可用语言和象形字母表。 + +通过 API,开发人员可以将 ONLYOFFICE 编辑器集成到网站和利用程序设计语言编写的应用程序中,并能配置和管理编辑器。 + +要集成 ONLYOFFICE 编辑器,我们需要一个集成应用程序来连接编辑器(ONLYOFFICE 文档服务器)和服务。 要在你的界面中使用编辑器,因该授予 ONLYOFFICE 以下权限: + + * 添加并执行自定义代码。 + * 用于下载和保存文件的匿名访问权限。这意味着编辑器仅与服务器端的服务通信,而不包括客户端的任何用户授权数据(浏览器 cookies)。 + * 在用户界面添加新按钮(例如,“在 ONLYOFFICE 中打开”、“在 ONLYOFFICE 中编辑”)。 + * 开启一个新页面,ONLYOFFICE 可以在其中执行脚本以添加编辑器。 + * 能够指定文档服务器连接设置。 + +流行的协作解决方案的成功集成案例有很多,如 Nextcloud、ownCloud、Alfresco、Confluence 和 SharePoint,都是通过 ONLYOFFICE 提供的官方即用型连接器实现的。 + +实际的集成案例之一是 ONLYOFFICE 编辑器与以 C# 编写的开源协作平台的集成。该平台具有文档和项目管理、CRM、电子邮件聚合器、日历、用户数据库、博客、论坛、调查、Wiki 和即时通讯程序的功能。 + +将在线编辑器与 CRM 和项目模块集成,你可以: + + * 文档关联到 CRM 时机和容器、项目任务和讨论,甚至创建一个单独的文件夹,其中包含与项目相关的文档、电子表格和演示文稿。 + * 直接在 CRM 或项目模块中创建新的文档、工作表和演示文稿。 + * 打开和编辑关联的文档,或者下载和删除。 + * 将联系人从 CSV 文件批量导入到 CRM 中,并将客户数据库导出为 CSV 文件。 + +在“邮件”模块中,你可以关联存储在“文档模块”中的文件,或者将指向所需文档的链接插入到邮件正文中。 当 ONLYOFFICE 用户收到带有附件的文档的消息时,他们可以:下载附件、在浏览器中查看文件、打开文件进行编辑或将其保存到“文档模块”。 如上所述,如果格式不同于 OOXML ,则文件将自动转换为 `.docx`、`.xlsx`、`.pptx`,并且其副本也将以原始格式保存。 + +在本文中,你将看到 ONLYOFFICE 与最流行的编程语言之一的 Python 编写的文档管理系统的集成过程。 以下步骤将向你展示如何创建所有必要的部分,以使在 DMS(文档管理系统Document Management System)界面内的文档中可以进行协同工作成为可能:查看、编辑、协同编辑、保存文件和用户访问管理,并可以作为服务的示例集成到 Python 应用程序中。 + +### 1、前置需求 + +首先,创建集成过程的关键组件:[ONLYOFFICE 文档服务器][4] 和用 Python 编写的文件管理系统。 + +#### 1.1、ONLYOFFICE 文档服务器 + +要安装 ONLYOFFICE 文档服务器,你可以从多个安装选项中进行选择:编译 GitHub 上可用的源代码,使用 `.deb` 或 `.rpm` 软件包亦或 Docker 镜像。 + +我们推荐使用下面这条命令利用 Docker 映像安装文档服务器和所有必需的依赖。请注意,选择此方法,你需要安装最新的 Docker 版本。 + +``` +docker run -itd -p 80:80 onlyoffice/documentserver-de +``` + +#### 1.2、利用 Python 开发 DMS + +如果已经拥有一个,请检查它是否满足以下条件: + + * 包含需要打开以查看/编辑的保留文件 + * 允许下载文件 + +对于该应用程序,我们将使用 Bottle 框架。我们将使用以下命令将其安装在工作目录中: + +``` +pip install bottle +``` + +然后我们创建应用程序代码 `main.py` 和模板 `index.tpl`。 + +我们将以下代码添加到 `main.py` 文件中: + +``` +from bottle import route, run, template, get, static_file # connecting the framework and the necessary components +@route('/') # setting up routing for requests for / +def index(): + return template('index.tpl') # showing template in response to request + +run(host="localhost", port=8080) # running the application on port 8080 +``` + +一旦我们运行该应用程序,点击 就会在浏览器上呈现一个空白页面 。 +为了使文档服务器能够创建新文档,添加默认文件并在模板中生成其名称列表,我们应该创建一个文件夹 `files` 并将3种类型文件(`.docx`、`.xlsx` 和 `.pptx`)放入其中。 + +要读取这些文件的名称,我们使用 `listdir` 组件(模块): + +``` +from os import listdir +``` + +现在让我们为文件夹中的所有文件名创建一个变量: + +``` +sample_files = [f for f in listdir('files')] +``` + +要在模板中使用此变量,我们需要通过 `template` 方法传递它: + +``` +def index(): + return template('index.tpl', sample_files=sample_files) +``` + +这是模板中的这个变量: + +``` +% for file in sample_files: +
        + {{file}} +
        +% end +``` + +我们重新启动应用程序以查看页面上的文件名列表。 + +使这些文件可用于所有应用程序用户的方法如下: + +``` +@get("/files/") +def show_sample_files(filepath): + return static_file(filepath, root="files") +``` + +### 2、查看文档 + +所有组件准备就绪后,让我们添加函数以使编辑者可以利用应用接口操作。 + +第一个选项使用户可以打开和查看文档。连接模板中的文档编辑器 API : + +``` + +``` + +`editor_url` 是文档编辑器的链接接口。 + +打开每个文件以供查看的按钮: + +``` + +``` + +现在我们需要添加带有 `id` 的 `div` 标签,打开文档编辑器: + +``` +
        +``` + +要打开编辑器,必须调用调用一个函数: + +``` + +``` + +DocEditor 函数有两个参数:将在其中打开编辑器的元素 `id` 和带有编辑器设置的 `JSON`。 +在此示例中,使用了以下必需参数: + + * `documentType` 由其格式标识(`.docx`、`.xlsx`、`.pptx` 用于相应的文本、电子表格和演示文稿) + * `document.url` 是你要打开的文件链接。 + * `editorConfig.mode`。 + +我们还可以添加将在编辑器中显示的 `title`。 + +接下来,我们可以在 Python 应用程序中查看文档。 + +### 3、编辑文档 + +首先,添加 “Edit”(编辑)按钮: + +``` + +``` + +然后创建一个新功能,打开文件进行编辑。类似于查看功能。 + +现在创建 3 个函数: + +``` + +``` + +`destroyEditor` 被调用以关闭一个打开的编辑器。 + +你可能会注意到,`edit()` 函数中缺少 `editorConfig` 参数,因为默认情况下它的值是:`{"mode":"edit"}`。 + +现在,我们拥有了打开文档以在 Python 应用程序中进行协同编辑的所有功能。 + +### 4、如何在 Python 应用中利用 ONLYOFFICE 协同编辑文档 + +通过在编辑器中设置对同一文档使用相同的 `document.key` 来实现协同编辑。 如果没有此键值,则每次打开文件时,编辑器都会创建编辑会话。 + +为每个文档设置唯一键,以使用户连接到同一编辑会话时进行协同编辑。 密钥格式应为以下格式:`filename +"_key"`。下一步是将其添加到当前文档的所有配置中。 + +``` +document: { + url: "host_url" + '/' + filepath, + title: filename, + key: filename + '_key' +}, +``` + +### 5、如何在 Python 应用中利用 ONLYOFFICE 保存文档 + +每次我们更改并保存文件时,ONLYOFFICE 都会存储其所有版本。 让我们仔细看看它是如何工作的。 关闭编辑器后,文档服务器将构建要保存的文件版本并将请求发送到 `callbackUrl` 地址。 该请求包含 `document.key`和指向刚刚构建的文件的链接。 + +`document.key` 用于查找文件的旧版本并将其替换为新版本。 由于这里没有任何数据库,因此仅使用 `callbackUrl` 发送文件名。 + +在 `editorConfig.callbackUrl` 的设置中指定 `callbackUrl` 参数并将其添加到 `edit()` 方法中: + +``` + function edit(filename) { + const filepath = 'files/' + filename; + if (editor) { + editor.destroyEditor() + } + editor = new DocsAPI.DocEditor("editor", + { + documentType: get_file_type(filepath), + document: { + url: "host_url" + '/' + filepath, + title: filename, + key: filename + '_key' + } + , + editorConfig: { + mode: 'edit', + callbackUrl: "host_url" + '/callback' + '&filename=' + filename // add file name as a request parameter + } + }); + } +``` + +编写一种方法,在获取到 POST 请求发送到 `/callback` 地址后将保存文件: + +``` +@post("/callback") # processing post requests for /callback +def callback(): + if request.json['status'] == 2: + file = requests.get(request.json['url']).content + with open('files/' + request.query['filename'], 'wb') as f: + f.write(file) + return "{\"error\":0}" +​ +``` + +`# status 2` 是已生成的文件,当我们关闭编辑器时,新版本的文件将保存到存储器中。 + +### 6、管理用户 + +如果应用中有用户,并且你需要查看谁在编辑文档,请在编辑器的配置中输入其标识符(`id`和`name`)。 + +在界面中添加选择用户的功能: + +``` + +``` + +如果在标记 ` + + + + +``` + +要在浏览器中运行此文件,请双击文件或打开你喜欢的浏览器,点击菜单,然后选择**文件->打开文件**。(如果使用 Brackets 软件,也可以使用角落处的闪电图标在浏览器中打开文件)。 + +### 生成伪随机数 + +猜谜游戏的第一步是为玩家生成一个数字供玩家猜测。JavaScript 包含几个内置的全局对象,可帮助你编写代码。要生成随机数,请使用 `Math` 对象。 + +JavaScript中的 [Math][17] 具有处理和数学相关的属性和功能。你将使用两个数学函数来生成随机数,供你的玩家猜测。 + +[Math.random()][18],会将生成一个介于 0 和 1 之间的伪随机数。(`Math.random` 包含 0 但不包含 1。这意味着该函数可以生成 0 ,永远不会产生 1) + +对于此游戏,请将随机数设置在 1 到 100 之间以缩小玩家的选择范围。取刚刚生成的小数,然后乘以 100,以产生一个介于 0 到……甚至不是 100 之间的小数。至此,你将需要其他步骤来解决这个问题。 + +现在,你的数字仍然是小数,但你希望它是一个整数。为此,你可以使用属于 `Math` 对象的另一个函数 [Math.floor()][19]。`Math.floor()` 的目的是返回小于或等于你作为参数指定的数字的最大整数,这意味着它会四舍五入为最接近的整数: + +``` +Math.floor(Math.random() * 100) +``` + +这样你将得到 0 到 99 之间的整数,这不是你想要的范围。你可以在最后一步修复该问题,即在结果中加 1。瞧!现在,你有一个(有点)随机生成的数字,介于 1 到 100 之间: + +``` +Math.floor(Math.random() * 100) + 1 +``` + +### 变量 + +现在,你需要存储随机生成的数字,以便可以将其与玩家的猜测进行比较。为此,你可以将其存储到一个 **变量**。 + +JavaScript 具有不同类型的变量,你可以选择这些类型,具体取决于你要如何使用该变量。对于此游戏,请使用 `const` 和 `let`。 + + * `let` 用于指示变量在整个程序中可以改变。 + * `const` 用于指示变量不应该被修改。 + +`const` 和 `let` 还有很多要说的,但现在知道这些就足够了。 + +随机数在游戏中仅生成一次,因此你将使用 `const` 变量来保存该值。你想给变量起一个清楚地表明要存储什么值的名称,因此将其命名为 `randomNumber`: + +``` +const randomNumber +``` + +有关命名的注意事项:JavaScript 中的变量和函数名称以驼峰形式编写。如果只有一个单词,则全部以小写形式书写。如果有多个单词,则第一个单词均为小写,其他任何单词均以大写字母开头,且单词之间没有空格。 + +### 打印到控制台 + +通常,你不想向任何人显示随机数,但是开发人员可能想知道生成的数字以使用它来帮助调试代码。 使用 JavaScript,你可以使用另一个内置函数 [console.log()][20] 将数字输出到浏览器的控制台。 + +大多数浏览器都包含开发人员工具,你可以通过按键盘上的 `F12` 键来打开它们。从那里,你应该看到一个 **控制台** 标签。打印到控制台的所有信息都将显示在此处。由于到目前为止编写的代码将在浏览器加载后立即运行,因此,如果你查看控制台,你应该会看到刚刚生成的随机数! + +![Javascript game with console][21] + +### 函数 + +接下来,你需要一种方法来从数字输入字段中获得玩家的猜测,将其与你刚刚生成的随机数进行比较,并向玩家提供反馈,让他们知道他们是否正确猜到了。为此,编写一个函数。 **函数** 是执行一定任务的代码块。函数是可以重用的,这意味着如果你需要多次运行相同的代码,则可以调用函数,而不必重写执行任务所需的所有步骤。 + +根据你使用的 JavaScript 版本,有许多不同的方法来编写或声明函数。由于这是该语言的基础入门,因此请使用基本函数语法声明函数。 + +以关键字 `function` 开头,然后起一个函数名。好的做法是使用一个描述该函数的功能的名称。在这个例子中,你正在检查玩家的猜测的数,因此此函数的名字可以是 `checkGuess`。在函数名称之后,写上一组小括号,然后写上一组花括号。 你将在以下花括号之间编写函数的主体: + +``` +function checkGuess() {} +``` + +### 使用 DOM + +JavaScript 的目的之一是与网页上的 HTML 交互。它通过文档对象模型(DOM)进行此操作,DOM 是 JavaScript 用于访问和更改网页信息的对象。现在,你需要从 HTML 中获取数字输入字段中玩家的猜测。你可以使用分配给 HTML 元素的 `id` 属性(在这种情况下为 `guess`)来做到这一点: + +``` + +``` + +JavaScript 可以通过访问玩家输入到数字输入字段中的数来获取其值。你可以通过引用元素的 ID 并在末尾添加 `.value` 来实现。这次,使用 `let` 定义的变量来保存用户的猜测值: + +``` +let myGuess = guess.value +``` + +玩家在数字输入字段中输入的任何数字都将被分配给 `checkGuess` 函数中的 `myGuess` 变量。 + +### 条件语句 + +下一步是将玩家的猜测与游戏产生的随机数进行比较。你还想给玩家反馈,让他们知道他们的猜测是太高,太低还是正确。 + +你可以使用一系列条件语句来决定玩家将收到的反馈。**条件语句** 在运行代码块之前检查是否满足条件。如果不满足条件,则代码停止,继续检查下一个条件,或者继续执行其余代码,而无需执行条件块中的代码: + +``` +if (myGuess === randomNumber){ +  feedback.textContent = "You got it right!" +} +else if(myGuess > randomNumber) { +  feedback.textContent = "Your guess was " + myGuess + ". That's too high. Try Again!" +} +else if(myGuess < randomNumber) { +  feedback.textContent = "Your guess was " + myGuess + ". That's too low. Try Again!" +} +``` + +第一个条件块使用比较运算符 `===` 将玩家的猜测与游戏生成的随机数进行比较。比较运算符检查右侧的值,将其与左侧的值进行比较,如果匹配则返回布尔值 `true`,否则返回布尔值 `false`。 + +如果数字匹配(猜对了!),为了让玩家知道。通过将文本添加到具有 `id` 属性 `feedback` 的 `

        ` 标记中来操作 DOM。就像上面的 `guess.value` 一样,除了不是从 DOM 获取信息,而是更改其中的信息。`

        ` 元素没有像 `` 元素那样的值,而是具有文本,因此请使用 `.textContent` 访问元素并设置要显示的文本: + +``` +feedback.textContent = "You got it right!" +``` + +当然,玩家很有可能在第一次尝试时就猜错了,因此,如果 `myGuess` 和 `randomNumber` 不匹配,请给玩家一个线索,以帮助他们缩小猜测范围。如果第一个条件失败,则代码将跳过该 `if` 语句中的代码块,并检查下一个条件是否为 `true`。 这使你进入 `else if` 块: + +``` +else if(myGuess > randomNumber) { +  feedback.textContent = "Your guess was " + myGuess + ". That's too high. Try Again!" +} +``` + +如果你将其作为句子阅读,则可能是这样的:“如果玩家的猜测等于随机数,请让他们知道他们猜对了。否则,请检查玩家的猜测是否大于 `randomNumber`,如果是,则显示玩家的猜测并告诉他们太高了。” + +最后一种可能性是玩家的猜测低于随机数。 要检查这一点,再添加一个 `else if` 块: + +``` +else if(myGuess < randomNumber) { +  feedback.textContent = "Your guess was " + myGuess + ". That's too low. Try Again!" +} +``` + +### 用户事件和事件监听器 + +如果你看上面的代码,则会看到某些代码在页面加载时自动运行,但有些则不会。你想在玩游戏之前生成随机数,但是你不想在玩家将数字输入到数字输入字段并准备检查它之前检查其猜测。 + +生成随机数并将其打印到控制台的代码不在函数的范围内,因此它将在浏览器加载脚本时自动运行。 但是,要使函数内部的代码运行,你必须对其进行调用。 + +调用函数有几种方法。在此,你希望该函数在用户单击 “Check My Guess” 按钮时运行。单击按钮将创建一个用户事件,然后 JavaScript 可以 “监听” 这个事件,以便知道何时需要运行函数。 + +代码的最后一行将事件侦听器添加到按钮上,以在单击按钮时调用函数。当它“听到”该事件时,它将运行分配给事件侦听器的函数: + +``` +submitGuess.addEventListener('click', checkGuess) +``` + +就像访问 DOM 元素的其他实例一样,你可以使用按钮的 ID 告诉 JavaScript 与哪个元素进行交互。 然后,你可以使用内置的 `addEventListener` 函数来告诉 JavaScript 要监听的事件。 + +你已经看到了带有参数的函数,但花点时间看一下它是如何工作的。参数是函数执行其任务所需的信息。并非所有函数都需要参数,但是 `addEventListener` 函数需要两个参数。它采用的第一个参数是将为其监听的用户事件的名称。用户可以通过多种方式与 DOM 交互,例如键入、移动鼠标,键盘上的 `TAB` 键和粘贴文本。在这种情况下,你正在监听的用户事件是单击按钮,因此第一个参数将是 `click`。 + +`addEventListener`的第二个所需的信息是用户单击按钮时要运行的函数的名称。 这里我们需要 `checkGuess` 函数。 + +现在,当玩家按下 “Check My Guess” 按钮时,`checkGuess` 函数将获得他们在数字输入字段中输入的值,将其与随机数进行比较,并在浏览器中显示反馈,以使玩家知道他们猜的怎么样。 太棒了!你的游戏已准备就绪。 + +### 学习 JavaScript 以获取乐趣和收益 + +这一点点的平凡无奇的 JavaScript 只是这个庞大的生态系统所提供功能的一小部分。这是一种值得花时间投入学习的语言,我鼓励你继续挖掘并学习更多。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/learn-javascript + +作者:[Mandy Kendall][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mkendall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_javascript.jpg?itok=60evKmGl "Javascript code close-up with neon graphic overlay" +[2]: https://opensource.com/tags/javascript +[3]: https://opensource.com/article/20/11/reactjs-tutorial +[4]: https://opensource.com/article/18/9/open-source-javascript-chart-libraries +[5]: https://opensource.com/article/20/12/brackets +[6]: http://december.com/html/4/element/html.html +[7]: http://december.com/html/4/element/head.html +[8]: http://december.com/html/4/element/meta.html +[9]: http://december.com/html/4/element/title.html +[10]: http://december.com/html/4/element/body.html +[11]: http://december.com/html/4/element/h1.html +[12]: http://december.com/html/4/element/p.html +[13]: http://december.com/html/4/element/label.html +[14]: http://december.com/html/4/element/input.html +[15]: http://december.com/html/4/element/form.html +[16]: http://december.com/html/4/element/script.html +[17]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math +[18]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random +[19]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor +[20]: https://developer.mozilla.org/en-US/docs/Web/API/Console/log +[21]: https://opensource.com/sites/default/files/javascript-game-with-console.png "Javascript game with console" diff --git a/published/202102/20210121 How Nextcloud is the ultimate open source productivity suite.md b/published/202102/20210121 How Nextcloud is the ultimate open source productivity suite.md new file mode 100644 index 0000000000..397dfea81f --- /dev/null +++ b/published/202102/20210121 How Nextcloud is the ultimate open source productivity suite.md @@ -0,0 +1,70 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13077-1.html) +[#]: subject: (How Nextcloud is the ultimate open source productivity suite) +[#]: via: (https://opensource.com/article/21/1/nextcloud-productivity) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +Nextcloud 是如何成为终极开源生产力套件的 +====== + +> Nextcloud 可以取代你用于协作、组织和任务管理的许多在线应用。 + +![](https://img.linux.net.cn/data/attachment/album/202102/02/121553uhl3pjljjkhj0h8p.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十一天。 + +基于 Web 的服务几乎可以在任何地方访问你的数据,它们每小时可以支持数百万用户。不过对于我们中的一些人来说,由于各种原因,运行自己的服务比使用大公司的服务更可取。也许我们的工作是受监管的或有明确安全要求。也许我们有隐私方面的考虑,或者只是喜欢能够自己构建、运行和修复事物。不管是什么情况,[Nextcloud][2] 都可以提供你所需要的大部分服务,但是是在你自己的硬件上。 + +![NextCloud Dashboard displaying service options][3] + +*Nextcloud 控制面板(Kevin Sonney, [CC BY-SA 4.0][4])* + +大多数时候,当我们想到 Nextcloud 时,我们会想到文件共享和同步,类似于 Dropbox、OneDrive 和 Google Drive 等商业产品。然而,如今,它是一个完整的生产力套件,拥有电子邮件客户端、日历、任务和笔记本。 + +有几种方法可以安装和运行 Nextcloud。你可以把它安装到裸机服务器上、在 Docker 容器中运行,或者作为虚拟机运行。如果可以考虑,还有一些托管服务将为你运行 Nextcloud。最后,有适用于所有主流操作系统的应用,包括移动应用,以便随时访问。 + +![Nextcloud virtual machine][5] + +*Nextcloud 虚拟机(Kevin Sonney, [CC BY-SA 4.0][4])* + +默认情况下,Nextcloud 会安装文件共享和其他一些相关应用(或附加组件)。你可以在管理界面中找到“应用”页面,这里允许你安装单个附加组件和一些预定义的相关应用捆绑。对我而言,我选择了 “Groupware Bundle”,其中包括“邮件”、“日历”、“联系人”和 “Deck”。“Deck” 是一个轻量级的看板,用于处理任务。我也安装了“记事本”和“任务”应用。 + +Nextcloud “邮件” 是一个非常直白的 IMAP 邮件客户端。虽然 Nextcloud 没有将 IMAP 或 SMTP 服务器作为软件包的一部分,但你可以很容易地在操作系统中添加一个或使用远程服务。“日历”应用是相当标准的,也允许你订阅远程日历。有一个缺点是,远程日历(例如,来自大型云提供商)是只读的,所以你可以查看但不能修改它们。 + +![NextCoud App Interface][6] + +*Nextcloud 应用界面 (Kevin Sonney, [CC BY-SA 4.0][4])* + +“记事本” 是一个简单的文本记事本,允许你创建和更新简短的笔记、日记和相关的东西。“任务” 是一款待办事项应用,支持多个列表、任务优先级、完成百分比以及其他一些用户期待的标准功能。如果你安装了 “Deck”,它的任务卡也会被列出来。每个看板都会显示自己的列表,所以你可以使用 “Deck” 或 “任务” 来跟踪完成的内容。 + +“Deck” 本身就是一个看板应用,将任务以卡片的形式呈现在流程中。如果你喜欢看板流程,它是一个追踪进度的优秀应用。 + +![Taking notes][7] + +*做笔记 (Kevin Sonney, [CC BY-SA 4.0][4])* + +Nextcloud 中所有的应用都原生支持通过标准协议进行共享。与一些类似的解决方案不同,它的分享并不是为了完成功能列表中的一项而加上去的。分享是 Nextcloud 存在的主要原因之一,所以使用起来非常简单。你还可以将链接分享到社交媒体、通过电子邮件分享等。你可以用一个 Nextcloud 取代多个在线服务,它在任何地方都可以访问,以协作为先。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/nextcloud-productivity + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_dev_email_chat_video_work_wfm_desk_520.png?itok=6YtME4Hj (Working on a team, busy worklife) +[2]: https://nextcloud.com/ +[3]: https://opensource.com/sites/default/files/day11-image1_0.png +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/pictures/nextcloud-vm.png (Nextcloud virtual machine) +[6]: https://opensource.com/sites/default/files/pictures/nextcloud-app-interface.png (NextCoud App Interface) +[7]: https://opensource.com/sites/default/files/day11-image3.png (Taking notes in Nextcloud) diff --git a/published/202102/20210122 3 tips for automating your email filters.md b/published/202102/20210122 3 tips for automating your email filters.md new file mode 100644 index 0000000000..f3644bb0e5 --- /dev/null +++ b/published/202102/20210122 3 tips for automating your email filters.md @@ -0,0 +1,60 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13073-1.html) +[#]: subject: (3 tips for automating your email filters) +[#]: via: (https://opensource.com/article/21/1/email-filter) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +3 个自动化电子邮件过滤器的技巧 +====== + +> 通过这些简单的建议,减少你的电子邮件并让你的生活更轻松。 + +![](https://img.linux.net.cn/data/attachment/album/202102/01/103638ozdejmy6eycm6omx.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十二天。 + +如果有一件事是我喜欢的,那就是自动化。只要有机会,我就会把小任务进行自动化。早起打开鸡舍的门?我买了一扇门,可以在日出和日落时开门和关门。每天从早到晚实时监控鸡群?用 Node-RED 和 [OBS-Websockets][2] 稍微花点时间,就能搞定。 + +我们还有电子邮件。几天前,我写过关于处理邮件的文章,也写过关于标签和文件夹的文章。只要做一点前期的工作,你就可以在邮件进来的时候,你就可以自动摆脱掉大量管理邮件的开销。 + +![Author has 480 filters][3] + +*是的,我有很多过滤器。(Kevin Sonney, [CC BY-SA 4.0][4])* + +有两种主要方式来过滤你的电子邮件:在服务端或者客户端上。我更喜欢在服务端上做,因为我不断地在尝试新的和不同的电子邮件客户端。(不,真的,我光这个星期就已经使用了五个不同的客户端。我可能有问题。) + +无论哪种方式,我都喜欢用电子邮件过滤规则做几件事,以使我的电子邮件更容易浏览,并保持我的收件箱不混乱。 + + 1. 将不紧急的邮件移到“稍后阅读”文件夹中。对我而言,这包括来自社交网络、新闻简报和邮件列表的通知。 + 2. 按列表或主题给消息贴上标签。我属于几个组织,虽然它们经常会被放在“稍后阅读”文件夹中,但我会添加第二个或第三个标签,以说明该来源或项目的内容,以帮助搜索时找到相关的东西。 + 3. 不要把规则搞得太复杂。这个想法让我困难了一段时间。我想把邮件发送到某个文件夹的所有可能情况都加到一个规则里。如果有什么问题或需要添加或删除的东西,有一个大规则只是让它更难修复。 + +![Unsubscribe from email][5] + +*点击它,点击它就行!(Kevin Sonney, [CC BY-SA 4.0][4])* + +说了这么多,还有一件事我一直在做,它有助于减少我花在电子邮件上的时间:退订邮件。两年前我感兴趣的那个邮件列表已经不感兴趣了,所以就不订阅了。产品更新通讯是我去年停止使用的商品?退订!这一直在积极解放我。我每年都会试着评估几次列表中的邮件信息是否(仍然)有用。 + +过滤器和规则可以是非常强大的工具,让你的电子邮件保持集中,减少花在它们身上的时间。而点击取消订阅按钮是一种解放。试试就知道了! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/email-filter + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/innovation_lightbulb_gears_devops_ansible.png?itok=TSbmp3_M (gears and lightbulb to represent innovation) +[2]: https://opensource.com/article/20/6/obs-websockets-streaming +[3]: https://opensource.com/sites/default/files/day12-image1_0.png +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/day12-image2_0.png diff --git a/published/202102/20210125 Explore binaries using this full-featured Linux tool.md b/published/202102/20210125 Explore binaries using this full-featured Linux tool.md new file mode 100644 index 0000000000..ffa4c8554b --- /dev/null +++ b/published/202102/20210125 Explore binaries using this full-featured Linux tool.md @@ -0,0 +1,635 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13074-1.html) +[#]: subject: (Explore binaries using this full-featured Linux tool) +[#]: via: (https://opensource.com/article/21/1/linux-radare2) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) + +全功能的二进制文件分析工具 Radare2 指南 +====== + +> Radare2 是一个为二进制分析定制的开源工具。 + +![](https://img.linux.net.cn/data/attachment/album/202102/01/112611baw4gpqlch10ps1c.jpg) + +在《[Linux 上分析二进制文件的 10 种方法][2]》中,我解释了如何使用 Linux 上丰富的原生工具集来分析二进制文件。但如果你想进一步探索你的二进制文件,你需要一个为二进制分析定制的工具。如果你是二进制分析的新手,并且大多使用的是脚本语言,这篇文章《[GNU binutils 里的九种武器][3]》可以帮助你开始学习编译过程和什么是二进制。 + +### 为什么我需要另一个工具? + +如果现有的 Linux 原生工具也能做类似的事情,你自然会问为什么需要另一个工具。嗯,这和你用手机做闹钟、做笔记、做相机、听音乐、上网、偶尔打电话和接电话的原因是一样的。以前,使用单独的设备和工具处理这些功能 —— 比如拍照的实体相机,记笔记的小记事本,起床的床头闹钟等等。对用户来说,有一个设备来做多件(但相关的)事情是*方便的*。另外,杀手锏就是独立功能之间的*互操作性*。 + +同样,即使许多 Linux 工具都有特定的用途,但在一个工具中捆绑类似(和更好)的功能是非常有用的。这就是为什么我认为 [Radare2][4] 应该是你需要处理二进制文件时的首选工具。 + +根据其 [GitHub 简介][5],Radare2(也称为 r2)是一个“类 Unix 系统上的逆向工程框架和命令行工具集”。它名字中的 “2” 是因为这个版本从头开始重写的,使其更加模块化。 + +### 为什么选择 Radare2? + +有大量(非原生的)Linux 工具可用于二进制分析,为什么要选择 Radare2 呢?我的理由很简单。 + +首先,它是一个开源项目,有一个活跃而健康的社区。如果你正在寻找新颖的功能或提供着 bug 修复的工具,这很重要。 + +其次,Radare2 可以在命令行上使用,而且它有一个功能丰富的图形用户界面(GUI)环境,叫做 Cutter,适合那些对 GUI 比较熟悉的人。作为一个长期使用 Linux 的用户,我对习惯于在 shell 上输入。虽然熟悉 Radare2 的命令稍微有一点学习曲线,但我会把它比作 [学习 Vim][6]。你可以先学习基本的东西,一旦你掌握了它们,你就可以继续学习更高级的东西。很快,它就变成了肌肉记忆。 + +第三,Radare2 通过插件可以很好的支持外部工具。例如,最近开源的 [Ghidra][7] 二进制分析和逆向工具reversing tool很受欢迎,因为它的反编译器功能是逆向软件的关键要素。你可以直接从 Radare2 控制台安装 Ghidra 反编译器并使用,这很神奇,让你两全其美。 + +### 开始使用 Radare2 + +要安装 Radare2,只需克隆其存储库并运行 `user.sh` 脚本。如果你的系统上还没有一些预备软件包,你可能需要安装它们。一旦安装完成,运行 `r2 -v` 命令来查看 Radare2 是否被正确安装: + +``` +$ git clone https://github.com/radareorg/radare2.git +$ cd radare2 +$ ./sys/user.sh + +# version + +$ r2 -v +radare2 4.6.0-git 25266 @ linux-x86-64 git.4.4.0-930-g48047b317 +commit: 48047b3171e6ed0480a71a04c3693a0650d03543 build: 2020-11-17__09:31:03 +$ +``` + +#### 获取二进制测试样本 + +现在 `r2` 已经安装好了,你需要一个样本二进制程序来试用它。你可以使用任何系统二进制文件(`ls`、`bash` 等),但为了使本教程的内容简单,请编译以下 C 程序: + +``` +$ cat adder.c +``` + +``` +#include + +int adder(int num) { + return num + 1; +} + +int main() { + int res, num1 = 100; + res = adder(num1); + printf("Number now is : %d\n", res); + return 0; +} +``` + +``` +$ gcc adder.c -o adder +$ file adder +adder: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=9d4366f7160e1ffb46b14466e8e0d70f10de2240, not stripped +$ ./adder +Number now is : 101 +``` + +#### 加载二进制文件 + +要分析二进制文件,你必须在 Radare2 中加载它。通过提供文件名作为 `r2` 命令的一个命令行参数来加载它。你会进入一个独立的 Radare2 控制台,这与你的 shell 不同。要退出控制台,你可以输入 `Quit` 或 `Exit` 或按 `Ctrl+D`: + +``` +$ r2 ./adder + -- Learn pancake as if you were radare! +[0x004004b0]> quit +$ +``` + +#### 分析二进制 + +在你探索二进制之前,你必须让 `r2` 为你分析它。你可以通过在 `r2` 控制台中运行 `aaa` 命令来实现: + +``` +$ r2 ./adder + -- Sorry, radare2 has experienced an internal error. +[0x004004b0]> +[0x004004b0]> +[0x004004b0]> aaa +[x] Analyze all flags starting with sym. and entry0 (aa) +[x] Analyze function calls (aac) +[x] Analyze len bytes of instructions for references (aar) +[x] Check for vtables +[x] Type matching analysis for all functions (aaft) +[x] Propagate noreturn information +[x] Use -AA or aaaa to perform additional experimental analysis. +[0x004004b0]> +``` + +这意味着每次你选择一个二进制文件进行分析时,你必须在加载二进制文件后输入一个额外的命令 `aaa`。你可以绕过这一点,在命令后面跟上 `-A` 来调用 `r2`;这将告诉 `r2` 为你自动分析二进制: + +``` +$ r2 -A ./adder +[x] Analyze all flags starting with sym. and entry0 (aa) +[x] Analyze function calls (aac) +[x] Analyze len bytes of instructions for references (aar) +[x] Check for vtables +[x] Type matching analysis for all functions (aaft) +[x] Propagate noreturn information +[x] Use -AA or aaaa to perform additional experimental analysis. + -- Already up-to-date. +[0x004004b0]> +``` + +#### 获取一些关于二进制的基本信息 + +在开始分析一个二进制文件之前,你需要一些背景信息。在许多情况下,这可以是二进制文件的格式(ELF、PE 等)、二进制的架构(x86、AMD、ARM 等),以及二进制是 32 位还是 64 位。方便的 `r2` 的 `iI` 命令可以提供所需的信息: + +``` +[0x004004b0]> iI +arch x86 +baddr 0x400000 +binsz 14724 +bintype elf +bits 64 +canary false +class ELF64 +compiler GCC: (GNU) 8.3.1 20190507 (Red Hat 8.3.1-4) +crypto false +endian little +havecode true +intrp /lib64/ld-linux-x86-64.so.2 +laddr 0x0 +lang c +linenum true +lsyms true +machine AMD x86-64 architecture +maxopsz 16 +minopsz 1 +nx true +os linux +pcalign 0 +pic false +relocs true +relro partial +rpath NONE +sanitiz false +static false +stripped false +subsys linux +va true + +[0x004004b0]> +[0x004004b0]> +``` + +### 导入和导出 + +通常情况下,当你知道你要处理的是什么样的文件后,你就想知道二进制程序使用了什么样的标准库函数,或者了解程序的潜在功能。在本教程中的示例 C 程序中,唯一的库函数是 `printf`,用来打印信息。你可以通过运行 `ii` 命令看到这一点,它显示了该二进制所有导入的库: + +``` +[0x004004b0]> ii +[Imports] +nth vaddr bind type lib name +――――――――――――――――――――――――――――――――――――― +1 0x00000000 WEAK NOTYPE _ITM_deregisterTMCloneTable +2 0x004004a0 GLOBAL FUNC printf +3 0x00000000 GLOBAL FUNC __libc_start_main +4 0x00000000 WEAK NOTYPE __gmon_start__ +5 0x00000000 WEAK NOTYPE _ITM_registerTMCloneTable +``` + +该二进制也可以有自己的符号、函数或数据。这些函数通常显示在 `Exports` 下。这个测试的二进制导出了两个函数:`main` 和 `adder`。其余的函数是在编译阶段,当二进制文件被构建时添加的。加载器需要这些函数来加载二进制文件(现在不用太关心它们): + +``` +[0x004004b0]> +[0x004004b0]> iE +[Exports] + +nth paddr vaddr bind type size lib name +―――――――――――――――――――――――――――――――――――――――――――――――――――――― +82 0x00000650 0x00400650 GLOBAL FUNC 5 __libc_csu_fini +85 ---------- 0x00601024 GLOBAL NOTYPE 0 _edata +86 0x00000658 0x00400658 GLOBAL FUNC 0 _fini +89 0x00001020 0x00601020 GLOBAL NOTYPE 0 __data_start +90 0x00000596 0x00400596 GLOBAL FUNC 15 adder +92 0x00000670 0x00400670 GLOBAL OBJ 0 __dso_handle +93 0x00000668 0x00400668 GLOBAL OBJ 4 _IO_stdin_used +94 0x000005e0 0x004005e0 GLOBAL FUNC 101 __libc_csu_init +95 ---------- 0x00601028 GLOBAL NOTYPE 0 _end +96 0x000004e0 0x004004e0 GLOBAL FUNC 5 _dl_relocate_static_pie +97 0x000004b0 0x004004b0 GLOBAL FUNC 47 _start +98 ---------- 0x00601024 GLOBAL NOTYPE 0 __bss_start +99 0x000005a5 0x004005a5 GLOBAL FUNC 55 main +100 ---------- 0x00601028 GLOBAL OBJ 0 __TMC_END__ +102 0x00000468 0x00400468 GLOBAL FUNC 0 _init + +[0x004004b0]> +``` + +### 哈希信息 + +如何知道两个二进制文件是否相似?你不能只是打开一个二进制文件并查看里面的源代码。在大多数情况下,二进制文件的哈希值(md5sum、sha1、sha256)是用来唯一识别它的。你可以使用 `it` 命令找到二进制的哈希值: + +``` +[0x004004b0]> it +md5 7e6732f2b11dec4a0c7612852cede670 +sha1 d5fa848c4b53021f6570dd9b18d115595a2290ae +sha256 13dd5a492219dac1443a816ef5f91db8d149e8edbf26f24539c220861769e1c2 +[0x004004b0]> +``` + +### 函数 + +代码按函数分组;要列出二进制中存在的函数,请运行 `afl` 命令。下面的列表显示了 `main` 函数和 `adder` 函数。通常,以 `sym.imp` 开头的函数是从标准库(这里是 glibc)中导入的: + +``` +[0x004004b0]> afl +0x004004b0    1 46           entry0 +0x004004f0    4 41   -> 34   sym.deregister_tm_clones +0x00400520    4 57   -> 51   sym.register_tm_clones +0x00400560    3 33   -> 32   sym.__do_global_dtors_aux +0x00400590    1 6            entry.init0 +0x00400650    1 5            sym.__libc_csu_fini +0x00400658    1 13           sym._fini +0x00400596    1 15           sym.adder +0x004005e0    4 101          loc..annobin_elf_init.c +0x004004e0    1 5            loc..annobin_static_reloc.c +0x004005a5    1 55           main +0x004004a0    1 6            sym.imp.printf +0x00400468    3 27           sym._init +[0x004004b0]> +``` + +### 交叉引用 + +在 C 语言中,`main` 函数是一个程序开始执行的地方。理想情况下,其他函数都是从 `main` 函数调用的,在退出程序时,`main` 函数会向操作系统返回一个退出状态。这在源代码中是很明显的,然而,二进制程序呢?如何判断 `adder` 函数的调用位置呢? + +你可以使用 `axt` 命令,后面加上函数名,看看 `adder` 函数是在哪里调用的;如下图所示,它是从 `main` 函数中调用的。这就是所谓的交叉引用cross-referencing。但什么调用 `main` 函数本身呢?从下面的 `axt main` 可以看出,它是由 `entry0` 调用的(关于 `entry0` 的学习我就不说了,留待读者练习)。 + +``` +[0x004004b0]> axt sym.adder +main 0x4005b9 [CALL] call sym.adder +[0x004004b0]> +[0x004004b0]> axt main +entry0 0x4004d1 [DATA] mov rdi, main +[0x004004b0]> +``` + +### 寻找定位 + +在处理文本文件时,你经常通过引用行号和行或列号在文件内移动;在二进制文件中,你需要使用地址。这些是以 `0x` 开头的十六进制数字,后面跟着一个地址。要找到你在二进制中的位置,运行 `s` 命令。要移动到不同的位置,使用 `s` 命令,后面跟上地址。 + +函数名就像标签一样,内部用地址表示。如果函数名在二进制中(未剥离的),可以使用函数名后面的 `s` 命令跳转到一个特定的函数地址。同样,如果你想跳转到二进制的开始,输入 `s 0`: + +``` +[0x004004b0]> s +0x4004b0 +[0x004004b0]> +[0x004004b0]> s main +[0x004005a5]> +[0x004005a5]> s +0x4005a5 +[0x004005a5]> +[0x004005a5]> s sym.adder +[0x00400596]> +[0x00400596]> s +0x400596 +[0x00400596]> +[0x00400596]> s 0 +[0x00000000]> +[0x00000000]> s +0x0 +[0x00000000]> +``` + +### 十六进制视图 + +通常情况下,原始二进制没有意义。在十六进制模式下查看二进制及其等效的 ASCII 表示法会有帮助: + +``` +[0x004004b0]> s main +[0x004005a5]> +[0x004005a5]> px +- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF +0x004005a5  5548 89e5 4883 ec10 c745 fc64 0000 008b  UH..H....E.d.... +0x004005b5  45fc 89c7 e8d8 ffff ff89 45f8 8b45 f889  E.........E..E.. +0x004005c5  c6bf 7806 4000 b800 0000 00e8 cbfe ffff  ..x.@........... +0x004005d5  b800 0000 00c9 c30f 1f40 00f3 0f1e fa41  .........@.....A +0x004005e5  5749 89d7 4156 4989 f641 5541 89fd 4154  WI..AVI..AUA..AT +0x004005f5  4c8d 2504 0820 0055 488d 2d04 0820 0053  L.%.. .UH.-.. .S +0x00400605  4c29 e548 83ec 08e8 57fe ffff 48c1 fd03  L).H....W...H... +0x00400615  741f 31db 0f1f 8000 0000 004c 89fa 4c89  t.1........L..L. +0x00400625  f644 89ef 41ff 14dc 4883 c301 4839 dd75  .D..A...H...H9.u +0x00400635  ea48 83c4 085b 5d41 5c41 5d41 5e41 5fc3  .H...[]A\A]A^A_. +0x00400645  9066 2e0f 1f84 0000 0000 00f3 0f1e fac3  .f.............. +0x00400655  0000 00f3 0f1e fa48 83ec 0848 83c4 08c3  .......H...H.... +0x00400665  0000 0001 0002 0000 0000 0000 0000 0000  ................ +0x00400675  0000 004e 756d 6265 7220 6e6f 7720 6973  ...Number now is +0x00400685  2020 3a20 2564 0a00 0000 0001 1b03 3b44    : %d........;D +0x00400695  0000 0007 0000 0000 feff ff88 0000 0020  ............... +[0x004005a5]> +``` + +### 反汇编 + +如果你使用的是编译后的二进制文件,则无法查看源代码。编译器将源代码转译成 CPU 可以理解和执行的机器语言指令;其结果就是二进制或可执行文件。然而,你可以查看汇编指令(的助记词)来理解程序正在做什么。例如,如果你想查看 `main` 函数在做什么,你可以使用 `s main` 寻找 `main` 函数的地址,然后运行 `pdf` 命令来查看反汇编的指令。 + +要理解汇编指令,你需要参考体系结构手册(这里是 x86),它的应用二进制接口(ABI,或调用惯例),并对堆栈的工作原理有基本的了解: + +``` +[0x004004b0]> s main +[0x004005a5]> +[0x004005a5]> s +0x4005a5 +[0x004005a5]> +[0x004005a5]> pdf +            ; DATA XREF from entry0 @ 0x4004d1 +┌ 55: int main (int argc, char **argv, char **envp); +│           ; var int64_t var_8h @ rbp-0x8 +│           ; var int64_t var_4h @ rbp-0x4 +│           0x004005a5      55             push rbp +│           0x004005a6      4889e5         mov rbp, rsp +│           0x004005a9      4883ec10       sub rsp, 0x10 +│           0x004005ad      c745fc640000.  mov dword [var_4h], 0x64    ; 'd' ; 100 +│           0x004005b4      8b45fc         mov eax, dword [var_4h] +│           0x004005b7      89c7           mov edi, eax +│           0x004005b9      e8d8ffffff     call sym.adder +│           0x004005be      8945f8         mov dword [var_8h], eax +│           0x004005c1      8b45f8         mov eax, dword [var_8h] +│           0x004005c4      89c6           mov esi, eax +│           0x004005c6      bf78064000     mov edi, str.Number_now_is__:__d ; 0x400678 ; "Number now is  : %d\n" ; const char *format +│           0x004005cb      b800000000     mov eax, 0 +│           0x004005d0      e8cbfeffff     call sym.imp.printf         ; int printf(const char *format) +│           0x004005d5      b800000000     mov eax, 0 +│           0x004005da      c9             leave +└           0x004005db      c3             ret +[0x004005a5]> +``` + +这是 `adder` 函数的反汇编结果: + +``` +[0x004005a5]> s sym.adder +[0x00400596]> +[0x00400596]> s +0x400596 +[0x00400596]> +[0x00400596]> pdf +            ; CALL XREF from main @ 0x4005b9 +┌ 15: sym.adder (int64_t arg1); +│           ; var int64_t var_4h @ rbp-0x4 +│           ; arg int64_t arg1 @ rdi +│           0x00400596      55             push rbp +│           0x00400597      4889e5         mov rbp, rsp +│           0x0040059a      897dfc         mov dword [var_4h], edi     ; arg1 +│           0x0040059d      8b45fc         mov eax, dword [var_4h] +│           0x004005a0      83c001         add eax, 1 +│           0x004005a3      5d             pop rbp +└           0x004005a4      c3             ret +[0x00400596]> +``` + +### 字符串 + +查看二进制中存在哪些字符串可以作为二进制分析的起点。字符串是硬编码到二进制中的,通常会提供重要的提示,可以让你将重点转移到分析某些区域。在二进制中运行 `iz` 命令来列出所有的字符串。这个测试二进制中只有一个硬编码的字符串: + +``` +[0x004004b0]> iz +[Strings] +nth paddr      vaddr      len size section type  string +――――――――――――――――――――――――――――――――――――――――――――――――――――――― +0   0x00000678 0x00400678 20  21   .rodata ascii Number now is  : %d\n + +[0x004004b0]> +``` + +### 交叉引用字符串 + +和函数一样,你可以交叉引用字符串,看看它们是从哪里被打印出来的,并理解它们周围的代码: + +``` +[0x004004b0]> ps @ 0x400678 +Number now is  : %d + +[0x004004b0]> +[0x004004b0]> axt 0x400678 +main 0x4005c6 [DATA] mov edi, str.Number_now_is__:__d +[0x004004b0]> +``` + +### 可视模式 + +当你的代码很复杂,有多个函数被调用时,很容易迷失方向。如果能以图形或可视化的方式查看哪些函数被调用,根据某些条件采取了哪些路径等,会很有帮助。在移动到感兴趣的函数后,可以通过 `VV` 命令来探索 `r2` 的可视化模式。例如,对于 `adder` 函数: + +``` +[0x004004b0]> s sym.adder +[0x00400596]> +[0x00400596]> VV +``` + +![Radare2 Visual mode][8] + +*(Gaurav Kamathe, [CC BY-SA 4.0][9])* + +### 调试器 + +到目前为止,你一直在做的是静态分析 —— 你只是在看二进制文件中的东西,而没有运行它,有时你需要执行二进制文件,并在运行时分析内存中的各种信息。`r2` 的内部调试器允许你运行二进制文件、设置断点、分析变量的值、或者转储寄存器的内容。 + +用 `-d` 标志启动调试器,并在加载二进制时添加 `-A` 标志进行分析。你可以通过使用 `db ` 命令在不同的地方设置断点,比如函数或内存地址。要查看现有的断点,使用 `dbi` 命令。一旦你放置了断点,使用 `dc` 命令开始运行二进制文件。你可以使用 `dbt` 命令查看堆栈,它可以显示函数调用。最后,你可以使用 `drr` 命令转储寄存器的内容: + +``` +$ r2 -d -A ./adder +Process with PID 17453 started... += attach 17453 17453 +bin.baddr 0x00400000 +Using 0x400000 +asm.bits 64 +[x] Analyze all flags starting with sym. and entry0 (aa) +[x] Analyze function calls (aac) +[x] Analyze len bytes of instructions for references (aar) +[x] Check for vtables +[x] Type matching analysis for all functions (aaft) +[x] Propagate noreturn information +[x] Use -AA or aaaa to perform additional experimental analysis. + -- git checkout hamster +[0x7f77b0a28030]> +[0x7f77b0a28030]> db main +[0x7f77b0a28030]> +[0x7f77b0a28030]> db sym.adder +[0x7f77b0a28030]> +[0x7f77b0a28030]> dbi +0 0x004005a5 E:1 T:0 +1 0x00400596 E:1 T:0 +[0x7f77b0a28030]> +[0x7f77b0a28030]> afl | grep main +0x004005a5    1 55           main +[0x7f77b0a28030]> +[0x7f77b0a28030]> afl | grep sym.adder +0x00400596    1 15           sym.adder +[0x7f77b0a28030]> +[0x7f77b0a28030]> dc +hit breakpoint at: 0x4005a5 +[0x004005a5]> +[0x004005a5]> dbt +0  0x4005a5           sp: 0x0                 0    [main]  main sym.adder+15 +1  0x7f77b0687873     sp: 0x7ffe35ff6858      0    [??]  section..gnu.build.attributes-1345820597 +2  0x7f77b0a36e0a     sp: 0x7ffe35ff68e8      144  [??]  map.usr_lib64_ld_2.28.so.r_x+65034 +[0x004005a5]> dc +hit breakpoint at: 0x400596 +[0x00400596]> dbt +0  0x400596           sp: 0x0                 0    [sym.adder]  rip entry.init0+6 +1  0x4005be           sp: 0x7ffe35ff6838      0    [main]  main+25 +2  0x7f77b0687873     sp: 0x7ffe35ff6858      32   [??]  section..gnu.build.attributes-1345820597 +3  0x7f77b0a36e0a     sp: 0x7ffe35ff68e8      144  [??]  map.usr_lib64_ld_2.28.so.r_x+65034 +[0x00400596]> +[0x00400596]> +[0x00400596]> dr +rax = 0x00000064 +rbx = 0x00000000 +rcx = 0x7f77b0a21738 +rdx = 0x7ffe35ff6948 +r8 = 0x7f77b0a22da0 +r9 = 0x7f77b0a22da0 +r10 = 0x0000000f +r11 = 0x00000002 +r12 = 0x004004b0 +r13 = 0x7ffe35ff6930 +r14 = 0x00000000 +r15 = 0x00000000 +rsi = 0x7ffe35ff6938 +rdi = 0x00000064 +rsp = 0x7ffe35ff6838 +rbp = 0x7ffe35ff6850 +rip = 0x00400596 +rflags = 0x00000202 +orax = 0xffffffffffffffff +[0x00400596]> +``` + +### 反编译器 + +能够理解汇编是二进制分析的前提。汇编语言总是与二进制建立和预期运行的架构相关。一行源代码和汇编代码之间从来没有 1:1 的映射。通常,一行 C 源代码会产生多行汇编代码。所以,逐行读取汇编代码并不是最佳的选择。 + +这就是反编译器的作用。它们试图根据汇编指令重建可能的源代码。这与用于创建二进制的源代码绝不完全相同,它是基于汇编的源代码的近似表示。另外,要考虑到编译器进行的优化,它会生成不同的汇编代码以加快速度,减小二进制的大小等,会使反编译器的工作更加困难。另外,恶意软件作者经常故意混淆代码,让恶意软件的分析人员望而却步。 + +Radare2 通过插件提供反编译器。你可以安装任何 Radare2 支持的反编译器。使用 `r2pm -l` 命令可以查看当前插件。使用 `r2pm install` 命令来安装一个示例的反编译器 `r2dec`: + +``` +$ r2pm  -l +$ +$ r2pm install r2dec +Cloning into 'r2dec'... +remote: Enumerating objects: 100, done. +remote: Counting objects: 100% (100/100), done. +remote: Compressing objects: 100% (97/97), done. +remote: Total 100 (delta 18), reused 27 (delta 1), pack-reused 0 +Receiving objects: 100% (100/100), 1.01 MiB | 1.31 MiB/s, done. +Resolving deltas: 100% (18/18), done. +Install Done For r2dec +gmake: Entering directory '/root/.local/share/radare2/r2pm/git/r2dec/p' +[CC] duktape/duktape.o +[CC] duktape/duk_console.o +[CC] core_pdd.o +[CC] core_pdd.so +gmake: Leaving directory '/root/.local/share/radare2/r2pm/git/r2dec/p' +$ +$ r2pm  -l +r2dec +$ +``` + +### 反编译器视图 + +要反编译一个二进制文件,在 `r2` 中加载二进制文件并自动分析它。在本例中,使用 `s sym.adder` 命令移动到感兴趣的 `adder` 函数,然后使用 `pdda` 命令并排查看汇编和反编译后的源代码。阅读这个反编译后的源代码往往比逐行阅读汇编更容易: + +``` +$ r2 -A ./adder +[x] Analyze all flags starting with sym. and entry0 (aa) +[x] Analyze function calls (aac) +[x] Analyze len bytes of instructions for references (aar) +[x] Check for vtables +[x] Type matching analysis for all functions (aaft) +[x] Propagate noreturn information +[x] Use -AA or aaaa to perform additional experimental analysis. + -- What do you want to debug today? +[0x004004b0]> +[0x004004b0]> s sym.adder +[0x00400596]> +[0x00400596]> s +0x400596 +[0x00400596]> +[0x00400596]> pdda +    ; assembly                               | /* r2dec pseudo code output */ +                                             | /* ./adder @ 0x400596 */ +                                             | #include <stdint.h> +                                             |   +    ; (fcn) sym.adder ()                     | int32_t adder (int64_t arg1) { +                                             |     int64_t var_4h; +                                             |     rdi = arg1; +    0x00400596 push rbp                      |     +    0x00400597 mov rbp, rsp                  |     +    0x0040059a mov dword [rbp - 4], edi      |     *((rbp - 4)) = edi; +    0x0040059d mov eax, dword [rbp - 4]      |     eax = *((rbp - 4)); +    0x004005a0 add eax, 1                    |     eax++; +    0x004005a3 pop rbp                       |     +    0x004005a4 ret                           |     return eax; +                                             | } +[0x00400596]> +``` + +### 配置设置 + +随着你对 Radare2 的使用越来越熟悉,你会想改变它的配置,以适应你的工作方式。你可以使用 `e` 命令查看 `r2` 的默认配置。要设置一个特定的配置,在 `e` 命令后面添加 `config = value`: + +``` +[0x004005a5]> e | wc -l +593 +[0x004005a5]> e | grep syntax +asm.syntax = intel +[0x004005a5]> +[0x004005a5]> e asm.syntax = att +[0x004005a5]> +[0x004005a5]> e | grep syntax +asm.syntax = att +[0x004005a5]> +``` + +要使配置更改永久化,请将它们放在 `r2` 启动时读取的名为 `.radare2rc` 的启动文件中。这个文件通常在你的主目录下,如果没有,你可以创建一个。一些示例配置选项包括: + +``` +$ cat ~/.radare2rc +e asm.syntax = att +e scr.utf8 = true +eco solarized +e cmd.stack = true +e stack.size = 256 +$ +``` + +### 探索更多 + +你已经看到了足够多的 Radare2 功能,对这个工具有了一定的了解。因为 Radare2 遵循 Unix 哲学,即使你可以从它的主控台做各种事情,它也会在下面使用一套独立的二进制来完成它的任务。 + +探索下面列出的独立二进制文件,看看它们是如何工作的。例如,用 `iI` 命令在控制台看到的二进制信息也可以用 `rabin2 ` 命令找到: + +``` +$ cd bin/ +$ +$ ls +prefix  r2agent    r2pm  rabin2   radiff2  ragg2    rarun2   rasm2 +r2      r2-indent  r2r   radare2  rafind2  rahash2  rasign2  rax2 +$ +``` + +你觉得 Radare2 怎么样?请在评论中分享你的反馈。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/linux-radare2 + +作者:[Gaurav Kamathe][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/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/binary_code_computer_screen.png?itok=7IzHK1nn (Binary code on a computer screen) +[2]: https://linux.cn/article-12187-1.html +[3]: https://linux.cn/article-11441-1.html +[4]: https://rada.re/n/ +[5]: https://github.com/radareorg/radare2 +[6]: https://opensource.com/article/19/3/getting-started-vim +[7]: https://ghidra-sre.org/ +[8]: https://opensource.com/sites/default/files/uploads/radare2_visual-mode_0.png (Radare2 Visual mode) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202102/20210125 Use Joplin to find your notes faster.md b/published/202102/20210125 Use Joplin to find your notes faster.md new file mode 100644 index 0000000000..13e6be8bdf --- /dev/null +++ b/published/202102/20210125 Use Joplin to find your notes faster.md @@ -0,0 +1,63 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13080-1.html) +[#]: subject: (Use Joplin to find your notes faster) +[#]: via: (https://opensource.com/article/21/1/notes-joplin) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +使用 Joplin 更快地找到你的笔记 +====== + +> 在多个手写和数字平台上整理笔记是一个严峻的挑战。这里有一个小技巧,可以更好地组织你的笔记,并快速找到你需要的东西。 + +![](https://img.linux.net.cn/data/attachment/album/202102/03/120141dkiqil1vlqiz6wql.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十五天。 + +保持生产力也意味着(在某种程度上)要有足够的组织能力,以便找到笔记并在需要时参考它们。这不仅是对我自己的挑战,也是与我交谈的很多人的挑战。 + +多年来,我在应用中单独或使用数字笔记、纸质笔记、便签、数字便签、Word 文档、纯文本文件以及一堆我忘记的其他格式的组合。这不仅让寻找笔记变得困难,而且知道把它们放在哪里是一个更大的挑战。 + +![Stacks of paper notes on a desk][2] + +*一堆笔记 (Jessica Cherry, [CC BY-SA 4.0][3])* + +还有就是做笔记最重要的一点:如果你以后找不到它,笔记就没有任何价值。知道含有你所需信息的笔记存在于你保存笔记的*某处*,根本没有任何帮助。 + +我是如何为自己解决这个问题的呢?正如他们所说,这是一个过程,我希望这也是一个对其他人有效的过程。 + +我首先看了看自己所做的笔记种类。不同的主题需要用不同的方式保存吗?由于我为我的播客手写笔记,而几乎所有其他的东西都使用纯文本笔记,我需要两种不同的方式来维护它们。对于手写的笔记,我把它们都放在一个文件夹里,方便我参考。 + +![Man holding a binder full of notes][4] + +*三年多的笔记 (Kevin Sonney, [CC BY-SA 4.0][3])* + +为了保存我的数字笔记,我需要将它们全部集中到一个地方。这个工具需要能够从多种设备上访问,具有有用的搜索功能,并且能够导出或共享我的笔记。在尝试了很多很多不同的选项之后,我选择了 [Joplin][5]。Joplin 可以让我用 Markdown 写笔记,有一个相当不错的搜索功能,有适用于所有操作系统(包括手机)的应用,并支持几种不同的设备同步方式。另外,它还有文件夹*和*标签,因此我可以按照对我有意义的方式将笔记分组。 + +![Organized Joplin notes management page][6] + +*我的 Joplin* + +我花了一些时间才把所有的东西都放在我想要的地方,但最后,这真的是值得的。现在,我可以找到我所做的笔记,而不是让它们散落在我的办公室、不同的机器和各种服务中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/notes-joplin + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://opensource.com/sites/default/files/day15-image1.jpg +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/sites/default/files/day15-image2.png +[5]: https://joplinapp.org/ +[6]: https://opensource.com/sites/default/files/day15-image3.png diff --git a/published/202102/20210125 Why you need to drop ifconfig for ip.md b/published/202102/20210125 Why you need to drop ifconfig for ip.md new file mode 100644 index 0000000000..c4370c6f6d --- /dev/null +++ b/published/202102/20210125 Why you need to drop ifconfig for ip.md @@ -0,0 +1,201 @@ +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13089-1.html" +[#]: subject: "Why you need to drop ifconfig for ip" +[#]: via: "https://opensource.com/article/21/1/ifconfig-ip-linux" +[#]: author: "Rajan Bhardwaj https://opensource.com/users/rajabhar" + +放弃 ifconfig,拥抱 ip 命令 +====== + +> 开始使用现代方法配置 Linux 网络接口。 + +![](https://img.linux.net.cn/data/attachment/album/202102/05/233847lpg1lnz7kl2czgfj.jpg) + +在很长一段时间内,`ifconfig` 命令是配置网络接口的默认方法。它为 Linux 用户提供了很好的服务,但是网络很复杂,所以配置网络的命令必须健壮。`ip` 命令是现代系统中新的默认网络命令,在本文中,我将向你展示如何使用它。 + +`ip` 命令工作在 [OSI 网络栈][2] 的两个层上:第二层(数据链路层)和第三层(网络 或 IP)层。它做了之前 `net-tools` 包的所有工作。 + +### 安装 ip + +`ip` 命令包含在 `iproute2util` 包中,它可能已经在你的 Linux 发行版中安装了。如果没有,你可以从发行版的仓库中进行安装。 + +### ifconfig 和 ip 使用对比 + +`ip` 和 `ifconfig` 命令都可以用来配置网络接口,但它们做事方法不同。接下来,作为对比,我将用它们来执行一些常见的任务。 + +#### 查看网口和 IP 地址 + +如果你想查看主机的 IP 地址或网络接口信息,`ifconfig` (不带任何参数)命令提供了一个很好的总结。 + +``` +$ ifconfig + +eth0: flags=4099 mtu 1500 + ether bc:ee:7b:5e:7d:d8 txqueuelen 1000 (Ethernet) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 0 bytes 0 (0.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +lo: flags=73 mtu 65536 + inet 127.0.0.1 netmask 255.0.0.0 + inet6 ::1 prefixlen 128 scopeid 0x10 + loop txqueuelen 1000 (Local Loopback) + RX packets 41 bytes 5551 (5.4 KiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 41 bytes 5551 (5.4 KiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +wlan0: flags=4163 mtu 1500 + inet 10.1.1.6 netmask 255.255.255.224 broadcast 10.1.1.31 + inet6 fdb4:f58e:49f:4900:d46d:146b:b16:7212 prefixlen 64 scopeid 0x0 + inet6 fe80::8eb3:4bc0:7cbb:59e8 prefixlen 64 scopeid 0x20 + ether 08:71:90:81:1e:b5 txqueuelen 1000 (Ethernet) + RX packets 569459 bytes 779147444 (743.0 MiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 302882 bytes 38131213 (36.3 MiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 +``` + +新的 `ip` 命令提供了类似的结果,但命令是 `ip address show`,或者简写为 `ip a`: + +``` +$ ip a + +1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: eth0: mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 + link/ether bc:ee:7b:5e:7d:d8 brd ff:ff:ff:ff:ff:ff +3: wlan0: mtu 1500 qdisc noqueue state UP group default qlen 1000 + link/ether 08:71:90:81:1e:b5 brd ff:ff:ff:ff:ff:ff + inet 10.1.1.6/27 brd 10.1.1.31 scope global dynamic wlan0 + valid_lft 83490sec preferred_lft 83490sec + inet6 fdb4:f58e:49f:4900:d46d:146b:b16:7212/64 scope global noprefixroute dynamic + valid_lft 6909sec preferred_lft 3309sec + inet6 fe80::8eb3:4bc0:7cbb:59e8/64 scope link + valid_lft forever preferred_lft forever +``` + +#### 添加 IP 地址 + +使用 `ifconfig` 命令添加 IP 地址命令为: + +``` +$ ifconfig eth0 add 192.9.203.21 +``` + +`ip` 类似: + +``` +$ ip address add 192.9.203.21 dev eth0 +``` + +`ip` 中的子命令可以缩短,所以下面这个命令同样有效: + +``` +$ ip addr add 192.9.203.21 dev eth0 +``` + +你甚至可以更短些: + +``` +$ ip a add 192.9.203.21 dev eth0 +``` + +#### 移除一个 IP 地址 + +添加 IP 地址与删除 IP 地址正好相反。 + +使用 `ifconfig`,命令是: + +``` +$ ifconfig eth0 del 192.9.203.21 +``` + +`ip` 命令的语法是: + +``` +$ ip a del 192.9.203.21 dev eth0 +``` + +#### 启用或禁用组播 + +使用 `ifconfig` 接口来启用或禁用 [组播][3]multicast: + +``` +# ifconfig eth0 multicast +``` + +对于 `ip`,使用 `set` 子命令与设备(`dev`)以及一个布尔值和 `multicast` 选项: + +``` +# ip link set dev eth0 multicast on +``` + +#### 启用或禁用网络 + +每个系统管理员都熟悉“先关闭,然后打开”这个技巧来解决问题。对于网络接口来说,即打开或关闭网络。 + +`ifconfig` 命令使用 `up` 或 `down` 关键字来实现: + +``` +# ifconfig eth0 up +``` + +或者你可以使用一个专用命令: + +``` +# ifup eth0 +``` + +`ip` 命令使用 `set` 子命令将网络设置为 `up` 或 `down` 状态: + +``` +# ip link set eth0 up +``` + +#### 开启或关闭地址解析功能(ARP) + +使用 `ifconfig`,你可以通过声明它来启用: + +``` +# ifconfig eth0 arp +``` + +使用 `ip`,你可以将 `arp` 属性设置为 `on` 或 `off`: + +``` +# ip link set dev eth0 arp on +``` + +### ip 和 ipconfig 的优缺点 + +`ip` 命令比 `ifconfig` 更通用,技术上也更有效,因为它使用的是 `Netlink` 套接字,而不是 `ioctl` 系统调用。 + +`ip` 命令可能看起来比 `ifconfig` 更详细、更复杂,但这是它拥有更多功能的一个原因。一旦你开始使用它,你会了解它的内部逻辑(例如,使用 `set` 而不是看起来随意混合的声明或设置)。 + +最后,`ifconfig` 已经过时了(例如,它缺乏对网络命名空间的支持),而 `ip` 是为现代网络而生的。尝试并学习它,使用它,你会由衷高兴的! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/ifconfig-ip-linux + +作者:[Rajan Bhardwaj][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/rajabhar +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/gears_devops_learn_troubleshooting_lightbulb_tips_520.png?itok=HcN38NOk "Tips and gears turning" +[2]: https://en.wikipedia.org/wiki/OSI_model +[3]: https://en.wikipedia.org/wiki/Multicast diff --git a/published/202102/20210126 Use your Raspberry Pi as a productivity powerhouse.md b/published/202102/20210126 Use your Raspberry Pi as a productivity powerhouse.md new file mode 100644 index 0000000000..d7deca1036 --- /dev/null +++ b/published/202102/20210126 Use your Raspberry Pi as a productivity powerhouse.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13084-1.html) +[#]: subject: (Use your Raspberry Pi as a productivity powerhouse) +[#]: via: (https://opensource.com/article/21/1/raspberry-pi-productivity) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +将你的树莓派用作生产力源泉 +====== + +> 树莓派已经从主要为黑客和业余爱好者服务,成为了小型生产力工作站的可靠选择。 + +![](https://img.linux.net.cn/data/attachment/album/202102/04/103826pjbxb7j1m8ok6ezf.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十六天。 + +[树莓派][2]是一台相当棒的小电脑。它体积小,功能却出奇的强大,而且非常容易设置和使用。我曾将它们用于家庭自动化项目、面板和专用媒体播放器。但它也能成为生产力的动力源泉么? + +答案相当简单:是的。 + +![Geary and Calendar apps on the Raspberry Pi][3] + +*Geary 和 Calendar 应用 (Kevin Sonney, [CC BY-SA 4.0][4])* + +基本的 [Raspbian][5] 安装包括 [Claw Mail][6],这是一个轻量级的邮件客户端。它的用户界面有点过时了,而且非常的简陋。如果你是一个 [Mutt 用户][7],它可能会满足你的需求。 + +我更喜欢安装 [Geary][8],因为它也是轻量级的,而且有一个现代化的界面。另外,与 Claws 不同的是,Geary 默认支持富文本 (HTML) 邮件。我不喜欢富文本电子邮件,但它已经成为必要的,所以对它有良好的支持是至关重要的。 + +默认的 Raspbian 安装不包含日历,所以我添加了 [GNOME 日历][9] ,因为它可以与远程服务通信(因为我的几乎所有日历都在云提供商那里)。 + +![GTG and GNote open on Raspberry Pi][10] + +*GTG 和 GNote(Kevin Sonney, [CC BY-SA 4.0][4])* + +那笔记和待办事项清单呢?有很多选择,但我喜欢用 [GNote][11] 来做笔记,用 [Getting-Things-GNOME!][12] 来做待办事项。两者都相当轻量级,并且可以相互同步,也可以同步到其他服务。 + +你会注意到,我在这里使用了不少 GNOME 应用。为什么不直接安装完整的 GNOME 桌面呢?在内存为 4Gb(或 8Gb)的树莓派 4 上,GNOME 工作得很好。你需要采取一些额外的步骤来禁用 Raspbian 上的默认 wifi 设置,并用 Network Manager 来代替它,但这个在网上有很好的文档,而且真的很简单。 + +GNOME 中包含了 [Evolution][13],它将邮件、日历、笔记、待办事项和联系人管理整合到一个应用中。与 Geary 和 GNOME Calendar 相比,它有点重,但在树莓派 4 上却很稳定。这让我很惊讶,因为我习惯了 Evolution 有点消耗资源,但树莓派 4 却和我的品牌笔记本一样运行良好,而且资源充足。 + +![Evolution on Raspbian][14] + +*Raspbian 上的 Evolution (Kevin Sonney, [CC BY-SA 4.0][4])* + +树莓派在过去的几年里进步很快,已经从主要为黑客和业余爱好者服务,成为了小型生产力工作站的可靠选择。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/raspberry-pi-productivity + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/todo_checklist_team_metrics_report.png?itok=oB5uQbzf (Team checklist and to dos) +[2]: https://www.raspberrypi.org/ +[3]: https://opensource.com/sites/default/files/day16-image1.png +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://www.raspbian.org/ +[6]: https://www.claws-mail.org/ +[7]: http://www.mutt.org/ +[8]: https://wiki.gnome.org/Apps/Geary +[9]: https://wiki.gnome.org/Apps/Calendar +[10]: https://opensource.com/sites/default/files/day16-image2.png +[11]: https://wiki.gnome.org/Apps/Gnote +[12]: https://wiki.gnome.org/Apps/GTG +[13]: https://opensource.com/business/18/1/desktop-email-clients +[14]: https://opensource.com/sites/default/files/day16-image3.png diff --git a/published/202102/20210126 Write GIMP scripts to make image processing faster.md b/published/202102/20210126 Write GIMP scripts to make image processing faster.md new file mode 100644 index 0000000000..4caa8357ff --- /dev/null +++ b/published/202102/20210126 Write GIMP scripts to make image processing faster.md @@ -0,0 +1,234 @@ +[#]: collector: (lujun9972) +[#]: translator: (amwps290) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13093-1.html) +[#]: subject: (Write GIMP scripts to make image processing faster) +[#]: via: (https://opensource.com/article/21/1/gimp-scripting) +[#]: author: (Cristiano L. Fontana https://opensource.com/users/cristianofontana) + +编写 GIMP 脚本使图像处理更快 +====== + +> 通过向一批图像添加效果来学习 GIMP 的脚本语言 Script-Fu。 + +![](https://img.linux.net.cn/data/attachment/album/202102/06/231011c0xhvxitxjv899qv.jpg) + +前一段时间,我想给方程图片加一个黑板式的外观。我开始是使用 [GIMP][2] 来处理的,我对结果很满意。问题是我必须对图像执行几个操作,当我想再次使用此样式,不想对所有图像重复这些步骤。此外,我确信我会很快忘记这些步骤。 + +![Fourier transform equations][3] + +*傅立叶变换方程式(Cristiano Fontana,[CC BY-SA 4.0] [4])* + +GIMP 是一个很棒的开源图像编辑器。尽管我已经使用了多年,但从未研究过其批处理功能或 [Script-Fu][5] 菜单。这是探索它们的绝好机会。 + +### 什么是 Script-Fu? + +[Script-Fu][6] 是 GIMP 内置的脚本语言。是一种基于 [Scheme][7] 的编程语言。如果你从未使用过 Scheme,请尝试一下,因为它可能非常有用。我认为 Script-Fu 是一个很好的入门方法,因为它对图像处理具有立竿见影的效果,所以你可以很快感觉到自己的工作效率的提高。你也可以使用 [Python][8] 编写脚本,但是 Script-Fu 是默认选项。 + +为了帮助你熟悉 Scheme,GIMP 的文档提供了深入的 [教程][9]。Scheme 是一种类似于 [Lisp][10] 的语言,因此它的主要特征是使用 [前缀][11] 表示法和 [许多括号][12]。函数和运算符通过前缀应用到操作数列表中: + +``` +(函数名 操作数 操作数 ...) + +(+ 2 3) +↳ 返回 5 + +(list 1 2 3 5) +↳ 返回一个列表,包含 1、 2、 3 和 5 +``` + +我花了一些时间才找到完整的 GIMP 函数列表文档,但实际上很简单。在 **Help** 菜单中,有一个 **Procedure Browser**,其中包含所有可用的函数的丰富详尽文档。 + +![GIMP Procedure Browser][13] + +### 使用 GIMP 的批处理模式 + +你可以使用 `-b` 选项以批处理的方式启动 GIMP。`-b` 选项的参数可以是你想要运行的脚本,或者用一个 `-` 来让 GIMP 进入交互模式而不是命令行模式。正常情况下,当你启动 GIMP 的时候,它会启动图形界面,但是你可以使用 `-i` 选项来禁用它。 + +### 开始编写你的第一个脚本 + +创建一个名为 `chalk.scm` 的文件,并把它保存在 **Preferences** 窗口中 **Folders** 选项下的 **Script** 中指定的 `script` 文件夹下。就我而言,是在 `$HOME/.config/GIMP/2.10/scripts`。 + +在 `chalk.scm` 文件中,写入下面的内容: + +``` +(define (chalk filename grow-pixels spread-amount percentage) + (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filename filename))) + (drawable (car (gimp-image-get-active-layer image))) + (new-filename (string-append "modified_" filename))) + (gimp-image-select-color image CHANNEL-OP-REPLACE drawable '(0 0 0)) + (gimp-selection-grow image grow-pixels) + (gimp-context-set-foreground '(0 0 0)) + (gimp-edit-bucket-fill drawable BUCKET-FILL-FG LAYER-MODE-NORMAL 100 255 TRUE 0 0) + (gimp-selection-none image) + (plug-in-spread RUN-NONINTERACTIVE image drawable spread-amount spread-amount) + (gimp-drawable-invert drawable TRUE) + (plug-in-randomize-hurl RUN-NONINTERACTIVE image drawable percentage 1 TRUE 0) + (gimp-file-save RUN-NONINTERACTIVE image drawable new-filename new-filename) + (gimp-image-delete image))) +``` + +### 定义脚本变量 + +在脚本中, `(define (chalk filename grow-pixels spread-amound percentage) ...)` 函数定义了一个名叫 `chalk` 的新函数。它的函数参数是 `filename`、`grow-pixels`、`spread-amound` 和 `percentage`。在 `define` 中的所有内容都是 `chalk` 函数的主体。你可能已经注意到,那些名字比较长的变量中间都有一个破折号来分割。这是类 Lisp 语言的惯用风格。 + +`(let* ...)` 函数是一个特殊过程procedure,可以让你定义一些只有在这个函数体中才有效的临时变量。临时变量有 `image`、`drawable` 以及 `new-filename`。它使用 `gimp-file-load` 来载入图片,这会返回它所包含的图片的一个列表。并通过 `car` 函数来选取第一项。然后,它选择第一个活动层并将其引用存储在 `drawable` 变量中。最后,它定义了包含图像新文件名的字符串。 + +为了帮助你更好地了解该过程,我将对其进行分解。首先,启动带 GUI 的 GIMP,然后你可以通过依次点击 **Filters → Script-Fu → Console** 来打开 Script-Fu 控制台。 在这种情况下,不能使用 `let *`,因为变量必须是持久的。使用 `define` 函数定义 `image` 变量,并为其提供查找图像的正确路径: + +``` +(define image (car (gimp-file-load RUN-NONINTERACTIVE "Fourier.png" "Fourier.png"))) +``` + +似乎在 GUI 中什么也没有发生,但是图像已加载。 你需要通过以下方式来让图像显示: + +``` +(gimp-display-new image) +``` + +![GUI with the displayed image][14] + +现在,获取活动层并将其存储在 `drawable` 变量中: + +``` +(define drawable (car (gimp-image-get-active-layer image))) +``` + +最后,定义图像的新文件名: + +``` +(define new-filename "modified_Fourier.png") +``` + +运行命令后,你将在 Script-Fu 控制台中看到以下内容: + +![Script-Fu console][15] + +在对图像执行操作之前,需要定义将在脚本中作为函数参数的变量: + +``` +(define grow-pixels 2) +(define spread-amount 4) +(define percentage 3) +``` + +### 处理图片 + +现在,所有相关变量都已定义,你可以对图像进行操作了。 脚本的操作可以直接在控制台上执行。第一步是在活动层上选择黑色。颜色被写成一个由三个数字组成的列表,即 `(list 0 0 0)` 或者是 `'(0 0 0)`: + +``` +(gimp-image-select-color image CHANNEL-OP-REPLACE drawable '(0 0 0)) +``` + +![Image with the selected color][16] + +扩大选取两个像素: + +``` +(gimp-selection-grow image grow-pixels) +``` + +![Image with the selected color][17] + +将前景色设置为黑色,并用它填充选区: + +``` +(gimp-context-set-foreground '(0 0 0)) +(gimp-edit-bucket-fill drawable BUCKET-FILL-FG LAYER-MODE-NORMAL 100 255 TRUE 0 0) +``` + +![Image with the selection filled with black][18] + +删除选区: + +``` +(gimp-selection-none image) +``` + +![Image with no selection][19] + +随机移动像素: + +``` +(plug-in-spread RUN-NONINTERACTIVE image drawable spread-amount spread-amount) +``` + +![Image with pixels moved around][20] + +反转图像颜色: + +``` +(gimp-drawable-invert drawable TRUE) +``` + +![Image with pixels moved around][21] + +随机化像素: + +``` +(plug-in-randomize-hurl RUN-NONINTERACTIVE image drawable percentage 1 TRUE 0) +``` + +![Image with pixels moved around][22] + +将图像保存到新文件: + +``` +(gimp-file-save RUN-NONINTERACTIVE image drawable new-filename new-filename) +``` + +![Equations of the Fourier transform and its inverse][23] + +*傅立叶变换方程 (Cristiano Fontana, [CC BY-SA 4.0][4])* + +### 以批处理模式运行脚本 + +现在你知道了脚本的功能,可以在批处理模式下运行它: + +``` +gimp -i -b '(chalk "Fourier.png" 2 4 3)' -b '(gimp-quit 0)' +``` + +在运行 `chalk` 函数之后,它将使用 `-b` 选项调用第二个函数 `gimp-quit` 来告诉 GIMP 退出。 + +### 了解更多 + +本教程向你展示了如何开始使用 GIMP 的内置脚本功能,并介绍了 GIMP 的 Scheme 实现:Script-Fu。如果你想继续前进,建议你查看官方文档及其[入门教程][9]。如果你不熟悉 Scheme 或 Lisp,那么一开始的语法可能有点吓人,但我还是建议你尝试一下。这可能是一个不错的惊喜。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/gimp-scripting + +作者:[Cristiano L. Fontana][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cristianofontana +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/painting_computer_screen_art_design_creative.png?itok=LVAeQx3_ (Painting art on a computer screen) +[2]: https://www.gimp.org/ +[3]: https://opensource.com/sites/default/files/uploads/fourier.png (Fourier transform equations) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://docs.gimp.org/en/gimp-filters-script-fu.html +[6]: https://docs.gimp.org/en/gimp-concepts-script-fu.html +[7]: https://en.wikipedia.org/wiki/Scheme_(programming_language) +[8]: https://docs.gimp.org/en/gimp-filters-python-fu.html +[9]: https://docs.gimp.org/en/gimp-using-script-fu-tutorial.html +[10]: https://en.wikipedia.org/wiki/Lisp_%28programming_language%29 +[11]: https://en.wikipedia.org/wiki/Polish_notation +[12]: https://xkcd.com/297/ +[13]: https://opensource.com/sites/default/files/uploads/procedure_browser.png (GIMP Procedure Browser) +[14]: https://opensource.com/sites/default/files/uploads/gui01_image.png (GUI with the displayed image) +[15]: https://opensource.com/sites/default/files/uploads/console01_variables.png (Script-Fu console) +[16]: https://opensource.com/sites/default/files/uploads/gui02_selected.png (Image with the selected color) +[17]: https://opensource.com/sites/default/files/uploads/gui03_grow.png (Image with the selected color) +[18]: https://opensource.com/sites/default/files/uploads/gui04_fill.png (Image with the selection filled with black) +[19]: https://opensource.com/sites/default/files/uploads/gui05_no_selection.png (Image with no selection) +[20]: https://opensource.com/sites/default/files/uploads/gui06_spread.png (Image with pixels moved around) +[21]: https://opensource.com/sites/default/files/uploads/gui07_invert.png (Image with pixels moved around) +[22]: https://opensource.com/sites/default/files/uploads/gui08_hurl.png (Image with pixels moved around) +[23]: https://opensource.com/sites/default/files/uploads/modified_fourier.png (Equations of the Fourier transform and its inverse) diff --git a/published/202102/20210127 3 email mistakes and how to avoid them.md b/published/202102/20210127 3 email mistakes and how to avoid them.md new file mode 100644 index 0000000000..4e0b3c8cc9 --- /dev/null +++ b/published/202102/20210127 3 email mistakes and how to avoid them.md @@ -0,0 +1,77 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13086-1.html) +[#]: subject: (3 email mistakes and how to avoid them) +[#]: via: (https://opensource.com/article/21/1/email-mistakes) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +3 个电子邮件错误以及如何避免它们 +====== + +> 自动化是美好的,但也不总是那样。确保你的电子邮件自动回复和抄送配置正确,这样你就不会浪费大家的时间。 + +![](https://img.linux.net.cn/data/attachment/album/202102/05/090335a888nqn7pcolblzn.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十七天。 + +好了,我们已经谈到了一些我们应该对电子邮件做的事情:[不要再把它当作即时通讯工具][2]、[优先处理事情][3]、[努力达到收件箱 0 新邮件][4],以及[有效过滤][5]。但哪些事情是我们不应该做的呢? + +![Automated email reply][6] + +*你真幸运 (Kevin Sonney, [CC BY-SA 4.0][7])* + +### 1、请不要对所有事情自动回复 + +邮件列表中总有些人,他们去度假了,并设置了一个“我在度假”的自动回复信息。然而,他们没有正确地设置,所以它对列表上的每一封邮件都会回复“我在度假”,直到管理员将其屏蔽或取消订阅。 + +我们都感受到了这种痛苦,我承认过去至少有一次,我就是那个人。 + +从我的错误中吸取教训,并确保你的自动回复器或假期信息对它们将回复谁和多久回复一次有限制。 + +![An actual email with lots of CC'd recipients][8] + +*这是一封真实的电子邮件 (Kevin Sonney, [CC BY-SA 4.0][7])* + +### 2、请不要抄送给所有人 + +我们都至少做过一次。我们需要发送邮件的人员众多,因此我们只需抄送他们*所有人*。有时这是有必要的,但大多数时候,它并不是。当然,你邀请每个人在庭院吃生日蛋糕,或者你的表姐要结婚了,或者公司刚拿到一个大客户,这都是好事。如果你有邮件列表的话,请用邮件列表,如果没有的话,请给每个人密送。说真的,密送是你的朋友。 + +### 3、回复所有人不是你的朋友 + +![Reply options in Kmail][9] + +这一条与上一条是相辅相成的。我不知道有多少次看到有人向一个名单(或者是一个大群的人)发送信息,而这个信息本来是要发给一个人的。我见过这样发送的相对好的邮件,以及随之而来的纪律处分邮件。 + +认真地说,除非必须,不要使用“回复全部”按钮。即使是这样,也要确保你*真的*需要这样做。 + +有些电子邮件应用比其他应用管理得更好。Kmail,[KDE Kontact][10] 的电子邮件组件,在**回复**工具栏按钮的子菜单中,有几个不同的回复选项。你可以选择只回复给**发件人**字段中的任何实体(通常是一个人,但有时是一个邮件列表),或者回复给作者(在抄送或密送中去除每一个人),或者只回复给一个邮件列表,或者回复*所有人*(不要这样做)。看到明确列出的选项,的确可以帮助你了解谁会收到你要发送的邮件副本,这有时比你想象的更发人深省。我曾经发现,当我意识到一个评论并不一定会对一个复杂的讨论的最终目标有所帮助时,我就会把邮件的收件人改为只是作者,而不是整个列表。 + +(另外,如果你写的邮件可能会给你的 HR 或公司带来麻烦,请在点击发送之前多考虑下。—— + +希望你已经*不再*在电子邮件中这么做了。如果你认识的人是这样的呢?欢迎与他们分享。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/email-mistakes + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/article/21/1/email-rules +[3]: https://opensource.com/article/21/1/prioritize-tasks +[4]: https://opensource.com/article/21/1/inbox-zero +[5]: https://opensource.com/article/21/1/email-filter +[6]: https://opensource.com/sites/default/files/day17-image1.png +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/day17-image2.png +[9]: https://opensource.com/sites/default/files/kmail-replies.jpg (Reply options in Kmail) +[10]: https://opensource.com/article/21/1/kde-kontact diff --git a/published/202102/20210127 Why I use the D programming language for scripting.md b/published/202102/20210127 Why I use the D programming language for scripting.md new file mode 100644 index 0000000000..63618522ea --- /dev/null +++ b/published/202102/20210127 Why I use the D programming language for scripting.md @@ -0,0 +1,176 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13100-1.html) +[#]: subject: (Why I use the D programming language for scripting) +[#]: via: (https://opensource.com/article/21/1/d-scripting) +[#]: author: (Lawrence Aberba https://opensource.com/users/aberba) + +我为什么要用 D 语言写脚本? +====== + +> D 语言以系统编程语言而闻名,但它也是编写脚本的一个很好的选择。 + +![](https://img.linux.net.cn/data/attachment/album/202102/09/134351j4m3hrhll0h38plp.jpg) + +D 语言由于其静态类型和元编程能力,经常被宣传为系统编程语言。然而,它也是一种非常高效的脚本语言。 + +由于 Python 在自动化任务和快速实现原型想法方面的灵活性,它通常被选为脚本语言。这使得 Python 对系统管理员、[管理者][2]和一般的开发人员非常有吸引力,因为它可以自动完成他们可能需要手动完成的重复性任务。 + +我们自然也可以期待任何其他的脚本编写语言具有 Python 的这些特性和能力。以下是我认为 D 是一个不错的选择的两个原因。 + +### 1、D 很容易读和写 + +作为一种类似于 C 的语言,D 应该是大多数程序员所熟悉的。任何使用 JavaScript、Java、PHP 或 Python 的人对 D 语言都很容易上手。 + +如果你还没有安装 D,请[安装 D 编译器][3],这样你就可以[运行本文中的 D 代码][4]。你也可以使用[在线 D 编辑器][5]。 + +下面是一个 D 代码的例子,它从一个名为 `words.txt` 的文件中读取单词,并在命令行中打印出来: + +``` +open +source +is +cool +``` + +用 D 语言写脚本: + +``` +#!/usr/bin/env rdmd +// file print_words.d + +// import the D standard library +import std; + +void main(){ + // open the file + File("./words.txt") + + //iterate by line + .byLine + + // print each number + .each!writeln; +} +``` + +这段代码以 [释伴][6] 开头,它将使用 [rdmd][7] 来运行这段代码,`rdmd` 是 D 编译器自带的编译和运行代码的工具。假设你运行的是 Unix 或 Linux,在运行这个脚本之前,你必须使用` chmod` 命令使其可执行: + +``` +chmod u+x print_words.d +``` + +现在脚本是可执行的,你可以运行它: + +``` +./print_words.d +``` + +这将在你的命令行中打印以下内容: + +``` +open +source +is +cool +``` + +恭喜你,你写了第一个 D 语言脚本。你可以看到 D 是如何让你按顺序链式调用函数,这让阅读代码的感觉很自然,类似于你在头脑中思考问题的方式。这个[功能让 D 成为我最喜欢的编程语言][8]。 + +试着再写一个脚本:一个非营利组织的管理员有一个捐款的文本文件,每笔金额都是单独的一行。管理员想把前 10 笔捐款相加,然后打印出金额: + +``` +#!/usr/bin/env rdmd +// file sum_donations.d + +import std; + +void main() +{ + double total = 0; + + // open the file + File("monies.txt") + + // iterate by line + .byLine + + // pick first 10 lines + .take(10) + + // remove new line characters (\n) + .map!(strip) + + // convert each to double + .map!(to!double) + + // add element to total + .tee!((x) { total += x; }) + + // print each number + .each!writeln; + + // print total + writeln("total: ", total); +} +``` + +与 `each` 一起使用的 `!` 操作符是[模板参数][9]的语法。 + +### 2、D 是快速原型设计的好帮手 + +D 是灵活的,它可以快速地将代码敲打在一起,并使其发挥作用。它的标准库中包含了丰富的实用函数,用于执行常见的任务,如操作数据(JSON、CSV、文本等)。它还带有一套丰富的通用算法,用于迭代、搜索、比较和 mutate 数据。这些巧妙的算法通过定义通用的 [基于范围的接口][10] 而按照序列进行处理。 + +上面的脚本显示了 D 中的链式调用函数如何提供顺序处理和操作数据的要领。D 的另一个吸引人的地方是它不断增长的用于执行普通任务的第三方包的生态系统。一个例子是,使用 [Vibe.d][11] web 框架构建一个简单的 web 服务器很容易。下面是一个例子: + +``` +#!/usr/bin/env dub +/+ dub.sdl: +dependency "vibe-d" version="~>0.8.0" ++/ +void main() +{ + import vibe.d; + listenHTTP(":8080", (req, res) { + res.writeBody("Hello, World: " ~ req.path); + }); + runApplication(); +} +``` + +它使用官方的 D 软件包管理器 [Dub][12],从 [D 软件包仓库][13]中获取 vibe.d Web 框架。Dub 负责下载 Vibe.d 包,然后在本地主机 8080 端口上编译并启动一个 web 服务器。 + +### 尝试一下 D 语言 + +这些只是你可能想用 D 来写脚本的几个原因。 + +D 是一种非常适合开发的语言。你可以很容易从 D 下载页面安装,因此下载编译器,看看例子,并亲自体验 D 语言。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/d-scripting + +作者:[Lawrence Aberba][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/aberba +[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://opensource.com/article/20/3/automating-community-management-python +[3]: https://tour.dlang.org/tour/en/welcome/install-d-locally +[4]: https://tour.dlang.org/tour/en/welcome/run-d-program-locally +[5]: https://run.dlang.io/ +[6]: https://en.wikipedia.org/wiki/Shebang_(Unix) +[7]: https://dlang.org/rdmd.html +[8]: https://opensource.com/article/20/7/d-programming +[9]: http://ddili.org/ders/d.en/templates.html +[10]: http://ddili.org/ders/d.en/ranges.html +[11]: https://vibed.org +[12]: https://dub.pm/getting_started +[13]: https://code.dlang.org diff --git a/published/202102/20210128 4 tips for preventing notification fatigue.md b/published/202102/20210128 4 tips for preventing notification fatigue.md new file mode 100644 index 0000000000..843364bb91 --- /dev/null +++ b/published/202102/20210128 4 tips for preventing notification fatigue.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13094-1.html) +[#]: subject: (4 tips for preventing notification fatigue) +[#]: via: (https://opensource.com/article/21/1/alert-fatigue) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +防止通知疲劳的 4 个技巧 +====== + +> 不要让提醒淹没自己:设置重要的提醒,让其它提醒消失。你会感觉更好,工作效率更高。 + +![W】(https://img.linux.net.cn/data/attachment/album/202102/06/234924mo3okotjlv7lo3yo.jpg) + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十八天。 + +当我和人们谈论生产力时,我注意到一件事,那就是几乎每个人都是为了保持更清晰的头脑。我们不是把所有的约会都记在脑子里,而是把它们放在一个数字日历上,在事件发生前提醒我们。我们有数字或实体笔记,这样我们就不必记住某件事的每一个小细节。我们有待办事项清单,提醒我们去做该做的事情。 + +![Text box offering to send notifications][2] + +*NOPE(Kevin Sonney, [CC BY-SA 4.0][3])* + +如此多的应用、网站和服务想要提醒我们每一件小事,我们很容易就把它们全部调出来。而且,如果我们不这样做,我们将开始遭受**提醒疲劳**的困扰 —— 这时我们处于边缘的状态,只是等待下一个提醒,并生活在恐惧之中。 + +提醒疲劳在那些因工作而被随叫随到的人中非常常见。它也发生在那些 **FOMO** (错失恐惧症)的人身上,从而对每一个关键词、标签或在社交媒体上提到他们感兴趣的事情都会设置提醒。 + +此时,设置能引起我们的注意,但不会被忽略的提醒是件棘手的事情。不过,我确实有一些有用的提示,这样重要的提醒可能会在这个忙碌的世界中越过我们自己的心理过滤器。 + +![Alert for a task][4] + +*我可以忽略这个,对吧?(Kevin Sonney, [CC BY-SA 4.0][3])* + + 1. 弄清楚什么更适合你:视觉提醒或声音提醒。我使用视觉弹出和声音的组合,但这对我是有效的。有些人需要触觉提醒。比如手机或手表的震动。找到适合你的那一种。 + 2. 为重要的提醒指定独特的音调或视觉效果。我有一个朋友,他的工作页面的铃声最响亮、最讨厌。这旨在吸引他的注意力,让他看到提醒。我的显示器上有一盏灯,当我在待命时收到工作提醒时,它就会闪烁红灯,以及发送通知到我手机上。 + 3. 关掉那些实际上无关紧要的警报。社交网络、网站和应用都希望得到你的关注。它们不会在意你是否错过会议、约会迟到,或者熬夜到凌晨 4 点。关掉那些不重要的,让那些重要的可以被看到。 + 4. 每隔一段时间就改变一下。上个月有效的东西,下个月可能就不行了。我们会适应、习惯一些东西,然后我们会忽略。如果有些东西不奏效,就换个东西试试吧!它不会伤害你,即使无法解决问题,也许你也会学到一些新知识。 + +![Blue alert indicators light][5] + +*蓝色是没问题。红色是有问题。(Kevin Sonney, [CC BY-SA 4.0][3])* + +### 开源和选择 + +一个好的应用可以通知提供很多选择。我最喜欢的一个是 Android 的 Etar 日历应用。[Etar 可以从开源 F-droid 仓库中获得][6]。 + +Etar 和许多开源应用一样,为你提供了很多选项,尤其是通知设置。 + +![Etar][7] + +通过 Etar,你可以激活或停用弹出式通知,设置打盹时间、打盹延迟、是否提醒你已拒绝的事件等。结合有计划的日程安排策略,你可以通过控制数字助手对你需要做的事情进行提示的频率来改变你一天的进程。 + +提醒和警报真的很有用,只要我们收到重要的提醒并予以注意即可。这可能需要做一些实验,但最终,少一些噪音是好事,而且更容易注意到真正需要我们注意的提醒。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/alert-fatigue + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_dev_email_chat_video_work_wfm_desk_520.png?itok=6YtME4Hj (Working on a team, busy worklife) +[2]: https://opensource.com/sites/default/files/day18-image1.png +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/sites/default/files/day18-image2.png +[5]: https://opensource.com/sites/default/files/day18-image3.png +[6]: https://f-droid.org/en/packages/ws.xsoh.etar/ +[7]: https://opensource.com/sites/default/files/etar.jpg (Etar) diff --git a/published/202102/20210128 How to Run a Shell Script in Linux -Essentials Explained for Beginners.md b/published/202102/20210128 How to Run a Shell Script in Linux -Essentials Explained for Beginners.md new file mode 100644 index 0000000000..f2c5fd298c --- /dev/null +++ b/published/202102/20210128 How to Run a Shell Script in Linux -Essentials Explained for Beginners.md @@ -0,0 +1,168 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13106-1.html) +[#]: subject: (How to Run a Shell Script in Linux [Essentials Explained for Beginners]) +[#]: via: (https://itsfoss.com/run-shell-script-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +基础:如何在 Linux 中运行一个 Shell 脚本 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/10/235325tkv7h8dvlp4makkk.jpg) + +在 Linux 中有两种运行 shell 脚本的方法。你可以使用: + +``` +bash script.sh +``` + +或者,你可以像这样执行 shell 脚本: + +``` +./script.sh +``` + +这可能很简单,但没太多解释。不要担心,我将使用示例来进行必要的解释,以便你能理解为什么在运行一个 shell 脚本时要使用给定的特定语法格式。 + +我将使用这一行 shell 脚本来使需要解释的事情变地尽可能简单: + +``` +abhishek@itsfoss:~/Scripts$ cat hello.sh + +echo "Hello World!" +``` + +### 方法 1:通过将文件作为参数传递给 shell 以运行 shell 脚本 + +第一种方法涉及将脚本文件的名称作为参数传递给 shell 。 + +考虑到 bash 是默认 shell,你可以像这样运行一个脚本: + +``` +bash hello.sh +``` + +你知道这种方法的优点吗?**你的脚本不需要执行权限**。对于简单的任务非常方便快速。 + +![在 Linux 中运行一个 Shell 脚本][1] + +如果你还不熟悉,我建议你 [阅读我的 Linux 文件权限详细指南][2] 。 + +记住,将其作为参数传递的需要是一个 shell 脚本。一个 shell 脚本是由命令组成的。如果你使用一个普通的文本文件,它将会抱怨错误的命令。 + +![运行一个文本文件为脚本][3] + +在这种方法中,**你要明确地具体指定你想使用 bash 作为脚本的解释器** 。 + +shell 只是一个程序,并且 bash 只是 Shell 的一种实现。还有其它的 shell 程序,像 ksh 、[zsh][4] 等等。如果你安装有其它的 shell ,你也可以使用它们来代替 bash 。 + +例如,我已安装了 zsh ,并使用它来运行相同的脚本: + +![使用 Zsh 来执行 Shell 脚本][5] + +### 方法 2:通过具体指定 shell 脚本的路径来执行脚本 + +另外一种运行一个 shell 脚本的方法是通过提供它的路径。但是要这样做之前,你的文件必须是可执行的。否则,当你尝试执行脚本时,你将会得到 “权限被拒绝” 的错误。 + +因此,你首先需要确保你的脚本有可执行权限。你可以 [使用 chmod 命令][8] 来给予你自己脚本的这种权限,像这样: + +``` +chmod u+x script.sh +``` + +使你的脚本是可执行之后,你只需输入文件的名称及其绝对路径或相对路径。大多数情况下,你都在同一个目录中,因此你可以像这样使用它: + +``` +./script.sh +``` + +如果你与你的脚本不在同一个目录中,你可以具体指定脚本的绝对路径或相对路径: + +![在其它的目录中运行 Shell 脚本][9] + +在脚本前的这个 `./` 是非常重要的(当你与脚本在同一个目录中)。 + +![][10] + +为什么当你在同一个目录下,却不能使用脚本名称?这是因为你的 Linux 系统会在 `PATH` 环境变量中指定的几个目录中查找可执行的文件来运行。 + +这里是我的系统的 `PATH` 环境变量的值: + +``` +abhishek@itsfoss:~$ echo $PATH +/home/abhishek/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin +``` + +这意味着在下面目录中具有可执行权限的任意文件都可以在系统的任何位置运行: + + * `/home/abhishek/.local/bin` + * `/usr/local/sbin` + * `/usr/local/bin` + * `/usr/sbin` + * `/usr/bin` + * `/sbin` + * `/bin` + * `/usr/games` + * `/usr/local/games` + * `/snap/bin` + +Linux 命令(像 `ls`、`cat` 等)的二进制文件或可执行文件都位于这些目录中的其中一个。这就是为什么你可以在你系统的任何位置通过使用命令的名称来运作这些命令的原因。看看,`ls` 命令就是位于 `/usr/bin` 目录中。 + +![][11] + +当你使用脚本而不具体指定其绝对路径或相对路径时,系统将不能在 `PATH` 环境变量中找到提及的脚本。 + +> 为什么大多数 shell 脚本在其头部包含 #! /bin/bash ? +> +> 记得我提过 shell 只是一个程序,并且有 shell 程序的不同实现。 +> +> 当你使用 `#! /bin/bash` 时,你是具体指定 bash 作为解释器来运行脚本。如果你不这样做,并且以 `./script.sh` 的方式运行一个脚本,它通常会在你正在运行的 shell 中运行。 +> +> 有问题吗?可能会有。看看,大多数的 shell 语法是大多数种类的 shell 中通用的,但是有一些语法可能会有所不同。 +> +> 例如,在 bash 和 zsh 中数组的行为是不同的。在 zsh 中,数组索引是从 1 开始的,而不是从 0 开始。 +> +>![Bash Vs Zsh][12] +> +> 使用 `#! /bin/bash` 来标识该脚本是 bash 脚本,并且应该使用 bash 作为脚本的解释器来运行,而不受在系统上正在使用的 shell 的影响。如果你使用 zsh 的特殊语法,你可以通过在脚本的第一行添加 `#! /bin/zsh` 的方式来标识其是 zsh 脚本。 +> +> 在 `#!` 和 `/bin/bash` 之间的空格是没有影响的。你也可以使用 `#!/bin/bash` 。 + +### 它有帮助吗? + +我希望这篇文章能够增加你的 Linux 知识。如果你还有问题或建议,请留下评论。 + +专家用户可能依然会挑出我遗漏的东西。但这种初级题材的问题是,要找到信息的平衡点,避免细节过多或过少,并不容易。 + +如果你对学习 bash 脚本感兴趣,在我们专注于系统管理的网站 [Linux Handbook][14] 上,我们有一个 [完整的 Bash 初学者系列][13] 。如果你想要,你也可以 [购买带有附加练习的电子书][15] ,以支持 Linux Handbook。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/run-shell-script-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/run-a-shell-script-linux.png?resize=741%2C329&ssl=1 +[2]: https://linuxhandbook.com/linux-file-permissions/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/running-text-file-as-script.png?resize=741%2C329&ssl=1 +[4]: https://www.zsh.org +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/execute-shell-script-with-zsh.png?resize=741%2C253&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/run-multiple-commands-in-linux.png?fit=800%2C450&ssl=1 +[7]: https://itsfoss.com/run-multiple-commands-linux/ +[8]: https://linuxhandbook.com/chmod-command/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/running-shell-script-in-other-directory.png?resize=795%2C272&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/executing-shell-scripts-linux.png?resize=800%2C450&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/locating-command-linux.png?resize=795%2C272&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/bash-vs-zsh.png?resize=795%2C386&ssl=1 +[13]: https://linuxhandbook.com/tag/bash-beginner/ +[14]: https://linuxhandbook.com +[15]: https://www.buymeacoffee.com/linuxhandbook diff --git a/published/202102/20210129 Manage containers with Podman Compose.md b/published/202102/20210129 Manage containers with Podman Compose.md new file mode 100644 index 0000000000..d1d3ce6286 --- /dev/null +++ b/published/202102/20210129 Manage containers with Podman Compose.md @@ -0,0 +1,174 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13125-1.html) +[#]: subject: (Manage containers with Podman Compose) +[#]: via: (https://fedoramagazine.org/manage-containers-with-podman-compose/) +[#]: author: (Mehdi Haghgoo https://fedoramagazine.org/author/powergame/) + +用 Podman Compose 管理容器 +====== + +![][1] + +容器很棒,让你可以将你的应用连同其依赖项一起打包,并在任何地方运行。从 2013 年的 Docker 开始,容器已经让软件开发者的生活变得更加轻松。 + +Docker 的一个缺点是它有一个中央守护进程,它以 root 用户的身份运行,这对安全有影响。但这正是 Podman 的用武之地。Podman 是一个 [无守护进程容器引擎][2],用于开发、管理和在你的 Linux 系统上以 root 或无 root 模式运行 OCI 容器。 + +下面这些文章可以用来了解更多关于 Podman 的信息: + + * [使用 Podman 以非 root 用户身份运行 Linux 容器][11] + * [在 Fedora 上使用 Podman 的 Pod][3] + * [在 Fedora 中结合权能使用 Podman][4] + +如果你使用过 Docker,你很可能也知道 Docker Compose,它是一个用于编排多个可能相互依赖的容器的工具。要了解更多关于 Docker Compose 的信息,请看它的[文档][5]。 + +### 什么是 Podman Compose? + +[Podman Compose][6] 项目的目标是作为 Docker Compose 的替代品,而不需要对 docker-compose.yaml 文件进行任何修改。由于 Podman Compose 使用吊舱pod 工作,所以最好看下“吊舱”的最新定义。 + +> 一个“吊舱pod ”(如一群鲸鱼或豌豆荚)是由一个或多个[容器][7]组成的组,具有共享的存储/网络资源,以及如何运行容器的规范。 +> +> [Pods - Kubernetes 文档][8] + +(LCTT 译注:容器技术领域大量使用了航海比喻,pod 一词,意为“豆荚”,在航海领域指“吊舱” —— 均指盛装多个物品的容器。常不翻译,考虑前后文,可译做“吊舱”。) + +Podman Compose 的基本思想是,它选中 `docker-compose.yaml` 文件里面定义的服务,为每个服务创建一个容器。Docker Compose 和 Podman Compose 的一个主要区别是,Podman Compose 将整个项目的容器添加到一个单一的吊舱中,而且所有的容器共享同一个网络。如你在例子中看到的,在创建容器时使用 `--add-host` 标志,它甚至用和 Docker Compose 一样的方式命名容器。 + +### 安装 + +Podman Compose 的完整安装说明可以在[项目页面][6]上找到,它有几种方法。要安装最新的开发版本,使用以下命令: + +``` +pip3 install https://github.com/containers/podman-compose/archive/devel.tar.gz +``` + +确保你也安装了 [Podman][9],因为你也需要它。在 Fedora 上,使用下面的命令来安装Podman: + +``` +sudo dnf install podman +``` + +### 例子:用 Podman Compose 启动一个 WordPress 网站 + +想象一下,你的 `docker-compose.yaml` 文件在一个叫 `wpsite` 的文件夹里。一个典型的 WordPress 网站的 `docker-compose.yaml` (或 `docker-compose.yml`) 文件是这样的: + +``` +version: "3.8" +services: + web: + image: wordpress + restart: always + volumes: + - wordpress:/var/www/html + ports: + - 8080:80 + environment: + WORDPRESS_DB_HOST: db + WORDPRESS_DB_USER: magazine + WORDPRESS_DB_NAME: magazine + WORDPRESS_DB_PASSWORD: 1maGazine! + WORDPRESS_TABLE_PREFIX: cz + WORDPRESS_DEBUG: 0 + depends_on: + - db + networks: + - wpnet + db: + image: mariadb:10.5 + restart: always + ports: + - 6603:3306 + + volumes: + - wpdbvol:/var/lib/mysql + + environment: + MYSQL_DATABASE: magazine + MYSQL_USER: magazine + MYSQL_PASSWORD: 1maGazine! + MYSQL_ROOT_PASSWORD: 1maGazine! + networks: + - wpnet +volumes: + wordpress: {} + wpdbvol: {} + +networks: + wpnet: {} +``` + +如果你用过 Docker,你就会知道你可运行 `docker-compose up` 来启动这些服务。Docker Compose 会创建两个名为 `wpsite_web_1` 和 `wpsite_db_1` 的容器,并将它们连接到一个名为 `wpsite_wpnet` 的网络。 + +现在,看看当你在项目目录下运行 `podman-compose up` 时会发生什么。首先,一个以执行命令的目录命名的吊舱被创建。接下来,它寻找 YAML 文件中定义的任何名称的卷,如果它们不存在,就创建卷。然后,在 YAML 文件的 `services` 部分列出的每个服务都会创建一个容器,并添加到吊舱中。 + +容器的命名与 Docker Compose 类似。例如,为你的 web 服务创建一个名为 `wpsite_web_1` 的容器。Podman Compose 还为每个命名的容器添加了 `localhost` 别名。之后,容器仍然可以通过名字互相解析,尽管它们并不像 Docker 那样在一个桥接网络上。要做到这一点,使用选项 `-add-host`。例如,`-add-host web:localhost`。 + +请注意,`docker-compose.yaml` 包含了一个从主机 8080 端口到容器 80 端口的 Web 服务的端口转发。现在你应该可以通过浏览器访问新 WordPress 实例,地址为 `http://localhost:8080`。 + +![WordPress Dashboard][10] + +### 控制 pod 和容器 + +要查看正在运行的容器,使用 `podman ps`,它可以显示 web 和数据库容器以及吊舱中的基础设施容器。 + +``` +CONTAINER ID  IMAGE                               COMMAND               CREATED      STATUS          PORTS                                         NAMES +a364a8d7cec7  docker.io/library/wordpress:latest  apache2-foregroun...  2 hours ago  Up 2 hours ago  0.0.0.0:8080-&gt;80/tcp, 0.0.0.0:6603-&gt;3306/tcp  wpsite_web_1 +c447024aa104  docker.io/library/mariadb:10.5      mysqld                2 hours ago  Up 2 hours ago  0.0.0.0:8080-&gt;80/tcp, 0.0.0.0:6603-&gt;3306/tcp  wpsite_db_1 +12b1e3418e3e  k8s.gcr.io/pause:3.2 +``` + +你也可以验证 Podman 已经为这个项目创建了一个吊舱,以你执行命令的文件夹命名。 + +``` +POD ID        NAME             STATUS    CREATED      INFRA ID      # OF CONTAINERS +8a08a3a7773e  wpsite           Degraded  2 hours ago  12b1e3418e3e  3 +``` + +要停止容器,在另一个命令窗口中输入以下命令: + +``` +podman-compose down +``` + +你也可以通过停止和删除吊舱来实现。这实质上是停止并移除所有的容器,然后再删除包含的吊舱。所以,同样的事情也可以通过这些命令来实现: + +``` +podman pod stop podname +podman pod rm podname +``` + +请注意,这不会删除你在 `docker-compose.yaml` 中定义的卷。所以,你的 WordPress 网站的状态被保存下来了,你可以通过运行这个命令来恢复它。 + +``` +podman-compose up +``` + +总之,如果你是一个 Podman 粉丝,并且用 Podman 做容器工作,你可以使用 Podman Compose 来管理你的开发和生产中的容器。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/manage-containers-with-podman-compose/ + +作者:[Mehdi Haghgoo][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/powergame/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/01/podman-compose-1-816x345.jpg +[2]: https://podman.io +[3]: https://fedoramagazine.org/podman-pods-fedora-containers/ +[4]: https://linux.cn/article-12859-1.html +[5]: https://docs.docker.com/compose/ +[6]: https://github.com/containers/podman-compose +[7]: https://kubernetes.io/docs/concepts/containers/ +[8]: https://kubernetes.io/docs/concepts/workloads/pods/ +[9]: https://podman.io/getting-started/installation +[10]: https://fedoramagazine.org/wp-content/uploads/2021/01/Screenshot-from-2021-01-08-06-27-29-1024x767.png +[11]: https://linux.cn/article-10156-1.html \ No newline at end of file diff --git a/published/202102/20210131 3 wishes for open source productivity in 2021.md b/published/202102/20210131 3 wishes for open source productivity in 2021.md new file mode 100644 index 0000000000..4517bae151 --- /dev/null +++ b/published/202102/20210131 3 wishes for open source productivity in 2021.md @@ -0,0 +1,64 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13113-1.html) +[#]: subject: (3 wishes for open source productivity in 2021) +[#]: via: (https://opensource.com/article/21/1/productivity-wishlist) +[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) + +2021 年开源生产力的 3 个愿望 +====== + +> 2021年,开源世界可以拓展的有很多。这是我特别感兴趣的三个领域。 + +![Looking at a map for career journey][1] + +在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的最后一天。 + +我们已经到了又一个系列的结尾处。因此,让我们谈谈我希望在 2021 年看到的更多事情。 + +### 断网 + +![Large Lego set built by the author][2] + +*我在假期期间制作的(Kevin Sonney, [CC BY-SA 4.0][3])* + +对*许多、许多的*人来说,2020 年是非常困难的一年。疫情大流行、各种政治事件、24 小时的新闻轰炸等等,都对我们的精神健康造成了伤害。虽然我确实谈到了 [抽出时间进行自我护理][4],但我只是想断网:也就是关闭提醒、手机、平板等,暂时无视这个世界。我公司的一位经理实际上告诉我们,如果放假或休息一天,就把所有与工作有关的东西都关掉(除非我们在值班)。我最喜欢的“断网”活动之一就是听音乐和搭建大而复杂的乐高。 + +### 可访问性 + +尽管我谈论的许多技术都是任何人都可以做的,但是软件方面的可访问性都有一定难度。相对于自由软件运动之初,Linux 和开源世界在辅助技术方面已经有了长足发展。但是,仍然有太多的应用和系统不会考虑有些用户没有与设计者相同的能力。我一直在关注这一领域的发展,因为每个人都应该能够访问事物。 + +### 更多的一体化选择 + +![JPilot all in one organizer software interface][5] + +*JPilot(Kevin Sonney, [CC BY-SA 4.0][3])* + +在 FOSS 世界中,一体化的个人信息管理解决方案远没有商业软件世界中那么多。总体趋势是使用单独的应用,它们必须通过配置来相互通信或通过中介服务(如 CalDAV 服务器)。移动市场在很大程度上推动了这一趋势,但我仍然向往像 [JPilot][6] 这样无需额外插件或服务就能完成几乎所有我需要的事情的日子。 + +非常感谢大家阅读这个年度系列。如果你认为我错过了什么,或者明年需要注意什么,请在下方评论。 + +就像我在 [生产力炼金术][7] 上说的那样,尽最大努力保持生产力! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/productivity-wishlist + +作者:[Kevin Sonney][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/ksonney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/career_journey_road_gps_path_map_520.png?itok=PpL6jJgY (Looking at a map for career journey) +[2]: https://opensource.com/sites/default/files/day21-image1.png +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/article/21/1/self-care +[5]: https://opensource.com/sites/default/files/day21-image2.png +[6]: http://www.jpilot.org/ +[7]: https://productivityalchemy.com diff --git a/published/202102/20210201 Generate QR codes with this open source tool.md b/published/202102/20210201 Generate QR codes with this open source tool.md new file mode 100644 index 0000000000..bc554bf5cb --- /dev/null +++ b/published/202102/20210201 Generate QR codes with this open source tool.md @@ -0,0 +1,81 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13097-1.html) +[#]: subject: (Generate QR codes with this open source tool) +[#]: via: (https://opensource.com/article/21/2/zint-barcode-generator) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +Zint:用这个开源工具生成二维码 +====== + +> Zint 可以轻松生成 50 多种类型的自定义条码。 + +![](https://img.linux.net.cn/data/attachment/album/202102/07/231854y8ffstg0m6l2fcmz.jpg) + +二维码是一种很好的可以向人们提供信息的方式,且没有打印的麻烦和费用。大多数人的智能手机都支持二维码扫描,无论其操作系统是什么。 + +你可能想使用二维码的原因有很多。也许你是一名教师,希望通过补充材料来测试你的学生,以增强学习效果,或者是一家餐厅,需要在遵守社交距离准则的同时提供菜单。我经常行走于自然小径,那里贴有树木和其他植物的标签。用二维码来补充这些小标签是一种很好的方式,它可以提供关于公园展品的额外信息,而无需花费和维护标识牌。在这些和其他情况下,二维码是非常有用的。 + +在互联网上搜索一个简单的、开源的方法来创建二维码时,我发现了 [Zint][2]。Zint 是一个优秀的开源 (GPLv3.0) 生成条码的解决方案。根据该项目的 [GitHub 仓库][3]:“Zint 是一套可以方便地对任何一种公共领域条形码标准的数据进行编码的程序,并允许你将这种功能集成到你自己的程序中。” + +Zint 支持 50 多种类型的条形码,包括二维码(ISO 18004),你可以轻松地创建这些条形码,然后复制和粘贴到 word 文档、博客、维基和其他数字媒体中。人们可以用智能手机扫描这些二维码,快速链接到信息。 + +### 安装 Zint + +Zint 适用于 Linux、macOS 和 Windows。 + +你可以在基于 Ubuntu 的 Linux 发行版上使用 `apt` 安装 Zint 命令: + +``` +$ sudo apt install zint +``` + +我还想要一个图形用户界面(GUI),所以我安装了 Zint-QT: + +``` +$ sudo apt install zint-qt +``` + +请参考手册的[安装部分][4],了解 macOS 和 Windows 的说明。 + +### 用 Zint 生成二维码 + +安装好后,我启动了它,并创建了我的第一个二维码,这是一个指向 Opensource.com 的链接。 + +![Generating QR code with Zint][5] + +Zint 的 50 多个其他条码选项包括许多国家的邮政编码、DotCode、EAN、EAN-14 和通用产品代码 (UPC)。[项目文档][2]中包含了它可以渲染的所有代码的完整列表。 + +你可以将任何条形码复制为 BMP 或 SVG,或者将输出保存为你应用中所需要的任何尺寸的图像文件。这是我的 77x77 像素的二维码。 + +![QR code][7] + +该项目维护了一份出色的用户手册,其中包含了在[命令行][8]和 [GUI][9] 中使用 Zint 的说明。你甚至可以[在线][10]试用 Zint。对于功能请求或错误报告,请[访问网站][11]或[发送电子邮件][12]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/zint-barcode-generator + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: http://www.zint.org.uk/ +[3]: https://github.com/zint/zint +[4]: http://www.zint.org.uk/Manual.aspx?type=p&page=2 +[5]: https://opensource.com/sites/default/files/uploads/zintqrcode_generation.png (Generating QR code with Zint) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/zintqrcode_77px.png (QR code) +[8]: http://zint.org.uk/Manual.aspx?type=p&page=4 +[9]: http://zint.org.uk/Manual.aspx?type=p&page=3 +[10]: http://www.barcode-generator.org/ +[11]: https://lists.sourceforge.net/lists/listinfo/zint-barcode +[12]: mailto:zint-barcode@lists.sourceforge.net diff --git a/published/202102/20210202 Filmulator is a Simple, Open Source, Raw Image Editor for Linux Desktop.md b/published/202102/20210202 Filmulator is a Simple, Open Source, Raw Image Editor for Linux Desktop.md new file mode 100644 index 0000000000..12f6aa8801 --- /dev/null +++ b/published/202102/20210202 Filmulator is a Simple, Open Source, Raw Image Editor for Linux Desktop.md @@ -0,0 +1,86 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13119-1.html) +[#]: subject: (Filmulator is a Simple, Open Source, Raw Image Editor for Linux Desktop) +[#]: via: (https://itsfoss.com/filmulator/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Filmulator:一个简单的、开源的 Raw 图像编辑器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/15/100616o54wb5h4aqgmq4qe.jpg) + +> Filmulator 是一个开源的具有库管理功能的 raw 照片编辑应用,侧重于简单、易用和简化的工作流程。 + +### Filmulator:适用于 Linux(和 Windows)的 raw 图像编辑器 + +[Linux 中有一堆 raw 照片编辑器][1],[Filmulator][2] 就是其中之一。Filmulator 的目标是仅提供基本要素,从而使 raw 图像编辑变得简单。它还增加了库处理的功能,如果你正在为你的相机图像寻找一个不错的应用,这是一个加分项。 + +对于那些不知道 raw 的人来说,[raw 图像文件][3]是一个最低限度处理、未压缩的文件。换句话说,它是未经压缩的数字文件,并且只经过了最低限度的处理。专业摄影师更喜欢用 raw 文件拍摄照片,并自行处理。普通人从智能手机拍摄照片,它通常被压缩为 JPEG 格式或被过滤。 + +让我们来看看在 Filmulator 编辑器中会有什么功能。 + +### Filmulator 的功能 + +![Filmulator interface][4] + +Filmulator 宣称,它不是典型的“胶片效果滤镜” —— 这只是复制了胶片的外在特征。相反,Filmulator 从根本上解决了胶片的魅力所在:显影过程。 + +它模拟了胶片的显影过程:从胶片的“曝光”,到每个像素内“银晶”的生长,再到“显影剂”在相邻像素之间与储槽中大量显影剂的扩散。 + +Fimulator 开发者表示,这种模拟带来了以下好处: + + * 大的明亮区域变得更暗,压缩了输出动态范围。 + * 小的明亮区域使周围环境变暗,增强局部对比度。 + * 在明亮区域,饱和度得到增强,有助于保留蓝天、明亮肤色和日落的色彩。 + * 在极度饱和的区域,亮度会被减弱,有助于保留细节,例如花朵。 + +以下是经 Filmulator 处理后的 raw 图像的对比,以自然的方式增强色彩,而不会引起色彩剪切。 + +![原图][5] + +![处理后][10] + +### 在 Ubuntu/Linux 上安装 Filmulator + +Filmulator 有一个 AppImage 可用,这样你就可以在 Linux 上轻松使用它。使用 [AppImage 文件][6]真的很简单。下载后,使它可执行,然后双击运行。 + +- [下载 Filmulator for Linux][7] + +对 Windows 用户也有一个 Windows 版本。除此之外,你还可以随时前往[它的 GitHub 仓库][8]查看它的源代码。 + +有一份[小文档][9]来帮助你开始使用 Fimulator。 + +### 总结 + +Fimulator 的设计理念是为任何工作提供最好的工具,而且只有这一个工具。这意味着牺牲了灵活性,但获得了一个大大简化和精简的用户界面。 + +我连业余摄影师都不是,更别说是专业摄影师了。我没有单反或其他高端摄影设备。因此,我无法测试和分享我对 Filmulator 的实用性的经验。 + +如果你有更多处理 raw 图像的经验,请尝试下 Filmulator,并分享你的意见。有一个 AppImage 可以让你快速测试它,看看它是否适合你的需求。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/filmulator/ + +作者:[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/raw-image-tools-linux/ +[2]: https://filmulator.org/ +[3]: https://www.findingtheuniverse.com/what-is-raw-in-photography/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/Filmulate.jpg?resize=799%2C463&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/image-without-filmulator.jpeg?ssl=1 +[6]: https://itsfoss.com/use-appimage-linux/ +[7]: https://filmulator.org/download/ +[8]: https://github.com/CarVac/filmulator-gui +[9]: https://github.com/CarVac/filmulator-gui/wiki +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/image-with-filmulator.jpeg?ssl=1 \ No newline at end of file diff --git a/published/202102/20210203 Paru - A New AUR Helper and Pacman Wrapper Based on Yay.md b/published/202102/20210203 Paru - A New AUR Helper and Pacman Wrapper Based on Yay.md new file mode 100644 index 0000000000..c30c45aaab --- /dev/null +++ b/published/202102/20210203 Paru - A New AUR Helper and Pacman Wrapper Based on Yay.md @@ -0,0 +1,153 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13122-1.html) +[#]: subject: (Paru – A New AUR Helper and Pacman Wrapper Based on Yay) +[#]: via: (https://itsfoss.com/paru-aur-helper/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +Paru:基于 Yay 的新 AUR 助手 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/16/101301ldekk9kkpqlplke6.jpg) + +[用户选择 Arch Linux][1] 或 [基于 Arch 的 Linux 发行版][2]的主要原因之一就是 [Arch 用户仓库(AUR)][3]。 + +遗憾的是,[pacman][4],也就是 Arch 的包管理器,不能以类似官方仓库的方式访问 AUR。AUR 中的包是以 [PKGBUILD][5] 的形式存在的,需要手动过程来构建。 + +AUR 助手可以自动完成这个过程。毫无疑问,[yay][6] 是最受欢迎和备受青睐的 AUR 助手之一。 + +最近,`yay` 的两位开发者之一的 [Morganamilo][7][宣布][8]将退出 `yay` 的维护工作,以开始自己的 AUR 助手 [paru][9]。`paru` 是用 [Rust][10] 编写的,而 `yay` 是用 [Go][11] 编写的,它的设计是基于 yay 的。 + +请注意,`yay` 还没有结束支持,它仍然由 [Jguer][12] 积极维护。他还[评论][13]说,`paru` 可能适合那些寻找丰富功能的 AUR 助手的用户。因此我推荐大家尝试一下。 + +### 安装 Paru AUR 助手 + +要安装 `paru`,打开你的终端,逐一输入以下命令: + +``` +sudo pacman -S --needed base-devel +git clone https://aur.archlinux.org/paru.git +cd paru +makepkg -si +``` + +现在已经安装好了,让我们来看看如何使用它。 + +### 使用 Paru AUR 助手的基本命令 + +在我看来,这些都是 `paru` 最基本的命令。你可以在 [GitHub][9] 的官方仓库中探索更多。 + + * `paru <用户输入>`:搜索并安装“用户输入” + * `paru -`:`paru -Syu` 的别名 + * `paru -Sua`:仅升级 AUR 包。 + * `paru -Qua`:打印可用的 AUR 更新 + * `paru -Gc <用户输入>`:显示“用户输入”的 AUR 评论 + +### 充分使用 Paru AUR 助手 + +你可以在 GitHub 上访问 `paru` 的[更新日志][14]来查看完整的变更日志历史,或者你可以在[首次发布][15]中查看对 `yay` 的变化。 + +#### 在 Paru 中启用颜色 + +要在 `paru` 中启用颜色,你必须先在 `pacman` 中启用它。所有的[配置文件][16]都在 `/etc` 目录下。在此例中,我[使用 Nano 文本编辑器][17],但是,你可以选择使用任何[基于终端的文本编辑器][18]。 + +``` +sudo nano /etc/pacman.conf +``` + +打开 `pacman` 配置文件后,取消 `Color` 的注释,即可启用此功能。 + +![][19] + +#### 反转搜索顺序 + +根据你的搜索条件,最相关的包通常会显示在搜索结果的顶部。在 `paru` 中,你可以反转搜索顺序,使你的搜索更容易。 + +与前面的例子类似,打开 `paru` 配置文件: + +``` +sudo nano /etc/paru.conf +``` + +取消注释 `BottomUp` 项,然后保存文件。 + +![][20] + +如你所见,顺序是反转的,第一个包出现在了底部。 + +![][21] + +#### 编辑 PKGBUILD (对于高级用户) + +如果你是一个有经验的 Linux 用户,你可以通过 `paru` 编辑 AUR 包。要做到这一点,你需要在 `paru` 配置文件中启用该功能,并设置你所选择的文件管理器。 + +在此例中,我将使用配置文件中的默认值,即 vifm 文件管理器。如果你还没有使用过它,你可能需要安装它。 + +``` +sudo pacman -S vifm +sudo nano /etc/paru.conf +``` + +打开配置文件,如下所示取消注释。 + +![][22] + +让我们回到 [Google Calendar][23] 的 AUR 包,并尝试安装它。系统会提示你审查该软件包。输入 `Y` 并按下回车。 + +![][24] + +从文件管理器中选择 PKGBUILD,然后按下回车查看软件包。 + +![][25] + +你所做的任何改变都将是永久性的,下次升级软件包时,你的改变将与上游软件包合并。 + +![][26] + +### 总结 + +`paru` 是 [AUR 助手家族][27]的又一个有趣的新成员,前途光明。此时,我不建议更换 `yay`,因为它还在维护,但一定要试试 `paru`。你可以把它们两个都安装到你的系统中,然后得出自己的结论。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/paru-aur-helper/ + +作者:[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://itsfoss.com/why-arch-linux/ +[2]: https://itsfoss.com/arch-based-linux-distros/ +[3]: https://itsfoss.com/aur-arch-linux/ +[4]: https://itsfoss.com/pacman-command/ +[5]: https://wiki.archlinux.org/index.php/PKGBUILD +[6]: https://news.itsfoss.com/qt-6-released/ +[7]: https://github.com/Morganamilo +[8]: https://www.reddit.com/r/archlinux/comments/jjn1c1/paru_v100_and_stepping_away_from_yay/ +[9]: https://github.com/Morganamilo/paru +[10]: https://www.rust-lang.org/ +[11]: https://golang.org/ +[12]: https://github.com/Jguer +[13]: https://aur.archlinux.org/packages/yay/#pinned-788241 +[14]: https://github.com/Morganamilo/paru/releases +[15]: https://github.com/Morganamilo/paru/releases/tag/v1.0.0 +[16]: https://linuxhandbook.com/linux-directory-structure/#-etc-configuration-files +[17]: https://itsfoss.com/nano-editor-guide/ +[18]: https://itsfoss.com/command-line-text-editors-linux/ +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/pacman.conf-color.png?resize=800%2C480&ssl=1 +[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru.conf-bottomup.png?resize=800%2C480&ssl=1 +[21]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru.conf-bottomup-2.png?resize=800%2C480&ssl=1 +[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru.conf-vifm.png?resize=732%2C439&ssl=1 +[23]: https://aur.archlinux.org/packages/gcalcli/ +[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru-proceed-for-review.png?resize=800%2C480&ssl=1 +[25]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru-proceed-for-review-2.png?resize=800%2C480&ssl=1 +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/paru-proceed-for-review-3.png?resize=800%2C480&ssl=1 +[27]: https://itsfoss.com/best-aur-helpers/ +[28]: https://news.itsfoss.com/ \ No newline at end of file diff --git a/published/202102/20210204 A hands-on tutorial of SQLite3.md b/published/202102/20210204 A hands-on tutorial of SQLite3.md new file mode 100644 index 0000000000..057e0ce98e --- /dev/null +++ b/published/202102/20210204 A hands-on tutorial of SQLite3.md @@ -0,0 +1,255 @@ +[#]: collector: "lujun9972" +[#]: translator: "amwps290" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13117-1.html" +[#]: subject: "A hands-on tutorial of SQLite3" +[#]: via: "https://opensource.com/article/21/2/sqlite3-cheat-sheet" +[#]: author: "Klaatu https://opensource.com/users/klaatu" + +SQLite3 实践教程 +====== + +> 开始使用这个功能强大且通用的数据库吧。 + +![](https://img.linux.net.cn/data/attachment/album/202102/14/131146jsx2kvyobwxwswct.jpg) + +应用程序经常需要保存数据。无论你的用户是创建简单的文本文档、复杂的图形布局、游戏进度还是错综复杂的客户和订单号列表,软件通常都意味着生成数据。有很多方法可以存储数据以供重复使用。你可以将文本转储为 INI、[YAML][2]、XML 或 JSON 等配置格式,可以输出原始的二进制数据,也可以将数据存储在结构化数据库中。SQLite 是一个自包含的、轻量级数据库,可轻松创建、解析、查询、修改和传输数据。 + +- 下载 [SQLite3 备忘录][3] + +SQLite 专用于 [公共领域][4],[从技术上讲,这意味着它没有版权,因此不需要许可证][5]。如果你需要许可证,则可以 [购买所有权担保][6]。SQLite 非常常见,大约有 1 万亿个 SQLite 数据库正在使用中。在每个基于 Webkit 的 Web 浏览器,现代电视机,汽车多媒体系统以及无数其他软件应用程序中,Android 和 iOS 设备, macOS 和 Windows 10 计算机,大多数 Linux 系统上都包含多个这种数据库。 + +总而言之,它是用于存储和组织数据的一个可靠而简单的系统。 + +### 安装 + +你的系统上可能已经有 SQLite 库,但是你需要安装其命令行工具才能直接使用它。在 Linux上,你可能已经安装了这些工具。该工具提供的命令是 `sqlite3` (而不仅仅是 sqlite)。 + +如果没有在你的 Linux 或 BSD 上安装 SQLite,你则可以从软件仓库中或 ports 树中安装 SQLite,也可以从源代码或已编译的二进制文件进行[下载并安装][7]。 + +在 macOS 或 Windows 上,你可以从 [sqlite.org][7] 下载并安装 SQLite 工具。 + +### 使用 SQLite + +通过编程语言与数据库进行交互是很常见的。因此,像 Java、Python、Lua、PHP、Ruby、C++ 以及其他编程语言都提供了 SQLite 的接口(或“绑定”)。但是,在使用这些库之前,了解数据库引擎的实际情况以及为什么你对数据库的选择很重要是有帮助的。本文向你介绍 SQLite 和 `sqlite3` 命令,以便你熟悉该数据库如何处理数据的基础知识。 + +### 与 SQLite 交互 + +你可以使用 `sqlite3` 命令与 SQLite 进行交互。 该命令提供了一个交互式的 shell 程序,以便你可以查看和更新数据库。 + +``` +$ sqlite3 +SQLite version 3.34.0 2020-12-01 16:14:00 +Enter ".help" for usage hints. +Connected to a transient in-memory database. +Use ".open FILENAME" to reopen on a persistent database. +sqlite> +``` + +该命令将使你处于 SQLite 的子 shell 中,因此现在的提示符是 SQLite 的提示符。你以前使用的 Bash 命令在这里将不再适用。你必须使用 SQLite 命令。要查看 SQLite 命令列表,请输入 `.help`: + +``` +sqlite> .help +.archive ... Manage SQL archives +.auth ON|OFF SHOW authorizer callbacks +.backup ?DB? FILE Backup DB (DEFAULT "main") TO FILE +.bail ON|off Stop after hitting an error. DEFAULT OFF +.binary ON|off Turn BINARY output ON OR off. DEFAULT OFF +.cd DIRECTORY CHANGE the working directory TO DIRECTORY +[...] +``` + +这些命令中的其中一些是二进制的,而其他一些则需要唯一的参数(如文件名、路径等)。这些是 SQLite Shell 的管理命令,不是用于数据库查询。数据库以结构化查询语言(SQL)进行查询,许多 SQLite 查询与你从 [MySQL][8] 和 [MariaDB][9] 数据库中已经知道的查询相同。但是,数据类型和函数有所不同,因此,如果你熟悉另一个数据库,请特别注意细微的差异。 + +### 创建数据库 + +启动 SQLite 时,可以打开内存数据库,也可以选择要打开的数据库: + +``` +$ sqlite3 mydatabase.db +``` + +如果还没有数据库,则可以在 SQLite 提示符下创建一个数据库: + +``` +sqlite> .open mydatabase.db +``` + +现在,你的硬盘驱动器上有一个空文件,可以用作 SQLite 数据库。 文件扩展名 `.db` 是任意的。你也可以使用 `.sqlite` 或任何你想要的后缀。 + +### 创建一个表 + +数据库包含一些table,可以将其可视化为电子表格。有许多的行(在数据库中称为记录record)和列。行和列的交集称为字段field。 + +结构化查询语言(SQL)以其提供的内容而命名:一种以可预测且一致的语法查询数据库内容以接收有用的结果的方法。SQL 读起来很像普通的英语句子,即使有点机械化。当前,你的数据库是一个没有任何表的空数据库。 + +你可以使用 `CREATE` 来创建一个新表,你可以和 `IF NOT EXISTS` 结合使用。以便不会破坏现在已有的同名的表。 + +你无法在 SQLite 中创建一个没有任何字段的空表,因此在尝试 `CREATE` 语句之前,必须考虑预期表将存储的数据类型。在此示例中,我将使用以下列创建一个名为 `member` 的表: + + * 唯一标识符 + * 人名 + * 记录创建的时间和日期 + +#### 唯一标识符 + +最好用唯一的编号来引用记录,幸运的是,SQLite 认识到这一点,创建一个名叫 `rowid` 的列来为你自动实现这一点。 + +无需 SQL 语句即可创建此字段。 + +#### 数据类型 + +对于我的示例表中,我正在创建一个 `name` 列来保存 `TEXT` 类型的数据。为了防止在没有指定字段数据的情况下创建记录,可以添加 `NOT NULL` 指令。 + +用 `name TEXT NOT NULL` 语句来创建。 + +SQLite 中有五种数据类型(实际上是 _储存类别_): + + * `TEXT`:文本字符串 + * `INTEGER`:一个数字 + * `REAL`:一个浮点数(小数位数无限制) + * `BLOB`:二进制数据(例如,.jpeg 或 .webp 图像) + * `NULL`:空值 + +#### 日期和时间戳 + +SQLite 有一个方便的日期和时间戳功能。它本身不是数据类型,而是 SQLite 中的一个函数,它根据所需的格式生成字符串或整数。 在此示例中,我将其保留为默认值。 + +创建此字段的 SQL 语句是:`datestamp DATETIME DEFAULT CURRENT_TIMESTAMP`。 + +### 创建表的语句 + +在 SQLite 中创建此示例表的完整 SQL: + +``` +sqlite> CREATE TABLE +...> IF NOT EXISTS +...> member (name TEXT NOT NULL, +...> datestamp DATETIME DEFAULT CURRENT_TIMESTAMP); +``` + +在此代码示例中,我在语句的分句后按了回车键。以使其更易于阅读。除非以分号(`;`)终止,否则 SQLite 不会运行你的 SQL 语句。 + +你可以使用 SQLite 命令 `.tables` 验证表是否已创建: + +``` +sqlite> .tables +member +``` + +### 查看表中的所有列 + +你可以使用 `PRAGMA` 语句验证表包含哪些列和行: + +``` +sqlite> PRAGMA table_info(member); +0|name|TEXT|1||0 +1|datestamp|DATETIME|0|CURRENT_TIMESTAMP|0 +``` + +### 数据输入 + +你可以使用 `INSERT` 语句将一些示例数据填充到表中: + +``` +> INSERT INTO member (name) VALUES ('Alice'); +> INSERT INTO member (name) VALUES ('Bob'); +> INSERT INTO member (name) VALUES ('Carol'); +> INSERT INTO member (name) VALUES ('David'); +``` + +查看表中的数据: + +``` +> SELECT * FROM member; +Alice|2020-12-15 22:39:00 +Bob|2020-12-15 22:39:02 +Carol|2020-12-15 22:39:05 +David|2020-12-15 22:39:07 +``` + +#### 添加多行数据 + +现在创建第二个表: + +``` +> CREATE TABLE IF NOT EXISTS linux ( +...> distro TEXT NOT NULL); +``` + +填充一些示例数据,这一次使用小的 `VALUES` 快捷方式,因此你可以在一个命令中添加多行。关键字 `VALUES` 期望以括号形式列出列表,而用多个逗号分隔多个列表: + +``` +> INSERT INTO linux (distro) +...> VALUES ('Slackware'), ('RHEL'), +...> ('Fedora'),('Debian'); +``` + +### 修改表结构 + +你现在有两个表,但是到目前为止,两者之间没有任何关系。它们每个都包含独立的数据,但是可能你可能需要将第一个表的成员与第二个表中列出的特定项相关联。 + +为此,你可以为第一个表创建一个新列,该列对应于第二个表。由于两个表都设计有唯一标识符(这要归功于 SQLite 的自动创建),所以连接它们的最简单方法是将其中一个的 `rowid` 字段用作另一个的选择器。 + +在第一个表中创建一个新列,以存储第二个表中的值: + +``` +> ALTER TABLE member ADD os INT; +``` + +使用 `linux` 表中的唯一标识符作为 `member` 表中每一条记录中 `os` 字段的值。因为记录已经存在。因此你可以使用 `UPDATE` 语句而不是使用 `INSERT` 语句来更新数据。需要特别注意的是,你首先需要选中特定的一行来然后才能更新其中的某个字段。从句法上讲,这有点相反,更新首先发生,选择匹配最后发生: + +``` +> UPDATE member SET os=1 WHERE name='Alice'; +``` + +对 `member` 表中的其他行重复相同的过程。更新 `os` 字段,为了数据多样性,在四行记录上分配三种不同的发行版(其中一种加倍)。 + +### 联接表 + +现在,这两个表相互关联,你可以使用 SQL 显示关联的数据。数据库中有多种 _联接方式_,但是一旦掌握了基础知识,就可以尝试所有的联接形式。这是一个基本联接,用于将 `member` 表的 `os` 字段中的值与 linux 表的 `rowid` 字段相关联: + +``` +> SELECT * FROM member INNER JOIN linux ON member.os=linux.rowid; +Alice|2020-12-15 22:39:00|1|Slackware +Bob|2020-12-15 22:39:02|3|Fedora +Carol|2020-12-15 22:39:05|3|Fedora +David|2020-12-15 22:39:07|4|Debian +``` + +`os` 和 `rowid` 字段形成了关联。 + +在一个图形应用程序中,你可以想象 `os` 字段是一个下拉选项菜单,其中的值是 `linux` 表中 `distro` 字段中的数据。将相关的数据集通过唯一的字段相关联,可以确保数据的一致性和有效性,并且借助 SQL,你可以在以后动态地关联它们。 + +### 了解更多 + +SQLite 是一个非常有用的自包含的、可移植的开源数据库。学习以交互方式使用它是迈向针对 Web 应用程序进行管理或通过编程语言库使用它的重要的第一步。 + +如果你喜欢 SQLite,也可以尝试由同一位作者 Richard Hipp 博士的 [Fossil][10]。 + +在学习和使用 SQLite 时,有一些常用命令可能会有所帮助,所以请立即下载我们的 [SQLite3 备忘单][3]! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/sqlite3-cheat-sheet + +作者:[Klaatu][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/klaatu +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coverimage_cheat_sheet.png?itok=lYkNKieP "Cheat Sheet cover image" +[2]: https://www.redhat.com/sysadmin/yaml-beginners +[3]: https://opensource.com/downloads/sqlite-cheat-sheet +[4]: https://sqlite.org/copyright.html +[5]: https://directory.fsf.org/wiki/License:PublicDomain +[6]: https://www.sqlite.org/purchase/license? +[7]: https://www.sqlite.org/download.html +[8]: https://www.mysql.com/ +[9]: https://mariadb.org/ +[10]: https://opensource.com/article/20/11/fossil diff --git a/published/202102/20210207 Why the success of open source depends on empathy.md b/published/202102/20210207 Why the success of open source depends on empathy.md new file mode 100644 index 0000000000..6905d890a1 --- /dev/null +++ b/published/202102/20210207 Why the success of open source depends on empathy.md @@ -0,0 +1,58 @@ +[#]: collector: (lujun9972) +[#]: translator: (scvoet) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13120-1.html) +[#]: subject: (Why the success of open source depends on empathy) +[#]: via: (https://opensource.com/article/21/2/open-source-empathy) +[#]: author: (Bronagh Sorota https://opensource.com/users/bsorota) + +为何开源的成功取决于同理心? +====== + +> 随着对同理心认识的提高和传播同理心的激励,开源生产力将得到提升,协作者将会聚拢,可以充分激发开源软件开发的活力。 + +![](https://img.linux.net.cn/data/attachment/album/202102/15/110606rc48qf05904m9n7p.jpg) + +开源开发的协调创新精神和社区精神改变了世界。Jim Whitehurst 在[《开放式组织》][2]中解释说,开源的成功源于“将人们视为社区的一份子,从交易思维转变为基于承诺基础的思维方式”。 但是,开源开发模型的核心仍然存在障碍:它经常性地缺乏人类的同理心empathy。 + +同理心是理解或感受他人感受的能力。在开源社区中,面对面的人际互动和协作是很少的。任何经历过 GitHub 拉取请求Pull request议题Issue的开发者都曾收到过来自他们可能从未见过的人的评论,这些人往往身处地球的另一端,而他们的交流也可能同样遥远。现代开源开发就是建立在这种异步、事务性的沟通基础之上。因此,人们在社交媒体平台上所经历的同类型的网络欺凌和其他虐待行为,在开源社区中也不足为奇。 + +当然,并非所有开源交流都会事与愿违。许多人在工作中发展出了尊重并秉持着良好的行为标准。但是很多时候,人们的沟通也常常缺乏常识性的礼仪,他们将人们像机器而非人类一般对待。这种行为是激发开源创新模型全部潜力的障碍,因为它让许多潜在的贡献者望而却步,并扼杀了灵感。 + +### 恶意交流的历史 + +代码审查中存在的敌意言论对开源社区来说并不新鲜,它多年来一直被社区所容忍。开源教父莱纳斯·托瓦尔兹Linus Torvalds经常在代码不符合他的标准时[抨击][3] Linux 社区,并将贡献者赶走。埃隆大学计算机科学教授 Megan Squire 借助[机器学习][4]分析了托瓦尔兹的侮辱行为,发现它们在四年内的数量高达数千次。2018 年,莱纳斯因自己的不良行为而自我放逐,责成自己学习同理心,道歉并为 Linux 社区制定了行为准则。 + +2015 年,[Sage Sharp][5] 虽然在技术上受人尊重,但因其缺乏对个人的尊重,被辞去了 FOSS 女性外展计划中的 Linux 内核协调员一职。 + +PR 审核中存在的贬低性评论对开发者会造成深远的影响。它导致开发者在提交 PR 时产生畏惧感,让他们对预期中的反馈感到恐惧。这吞噬了开发者对自己能力的信心。它逼迫工程师每次都只能追求完美,从而减缓了开发速度,这与许多社区采用的敏捷方法论背道而驰。 + +### 如何缩小开源中的同理心差距? + +通常情况下,冒犯的评论常是无意间的,而通过一些指导,作者则可以学会如何在不带负面情绪的情况下表达意见。GitHub 不会监控议题和 PR 的评论是否有滥用内容,相反,它提供了一些工具,使得社区能够对其内容进行审查。仓库的所有者可以删除评论和锁定对话,所有贡献者可以报告滥用和阻止用户。 + +制定社区行为准则可为所有级别的贡献者提供一个安全且包容的环境,并且能让所有级别的贡献者参与并定义降低协作者之间冲突的过程。 + +我们能够克服开源中存在的同理心问题。面对面的辩论比文字更有利于产生共鸣,所以尽可能选择视频通话。以同理心的方式分享反馈,树立榜样。如果你目睹了一个尖锐的评论,请做一个指导者而非旁观者。如果你是受害者,请大声说出来。在面试候选人时,评估同理心能力,并将同理心能力与绩效评估和奖励挂钩。界定并执行社区行为准则,并管理好你的社区。 + +随着对同理心认识的提高和传播同理心的激励,开源生产力将得到提升,协作者将会聚拢,可以充分激发开源软件开发的活力。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/open-source-empathy + +作者:[Bronagh Sorota][a] +选题:[lujun9972][b] +译者:[scvoet](https://github.com/scvoet) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/bsorota +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/practicing-empathy.jpg?itok=-A7fj6NF (Practicing empathy) +[2]: https://www.redhat.com/en/explore/the-open-organization-book +[3]: https://arstechnica.com/information-technology/2013/07/linus-torvalds-defends-his-right-to-shame-linux-kernel-developers/ +[4]: http://flossdata.syr.edu/data/insults/hicssInsultsv2.pdf +[5]: https://en.wikipedia.org/wiki/Sage_Sharp diff --git a/published/202102/20210208 3 open source tools that make Linux the ideal workstation.md b/published/202102/20210208 3 open source tools that make Linux the ideal workstation.md new file mode 100644 index 0000000000..82a71b31f7 --- /dev/null +++ b/published/202102/20210208 3 open source tools that make Linux the ideal workstation.md @@ -0,0 +1,76 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13133-1.html) +[#]: subject: (3 open source tools that make Linux the ideal workstation) +[#]: via: (https://opensource.com/article/21/2/linux-workday) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +让 Linux 成为理想的工作站的 3 个开源工具 +====== + +> Linux 不但拥有你认为所需的一切,还有更多可以让你高效工作的工具。 + +![](https://img.linux.net.cn/data/attachment/album/202102/19/134935qhe252ifbvbpnzxk.jpg) + +在 2021 年,有更多让人们喜欢 Linux 的理由。在这个系列中,我将分享 21 种使用 Linux 的不同理由。今天,我将与你分享为什么 Linux 是你工作的最佳选择。 + +每个人都希望在工作期间提高工作效率。如果你的工作通常涉及到文档、演示文稿和电子表格的工作,那么你可能已经习惯了特定的例行工作。问题在于,这个*惯常的例行工作*通常是由一两个特定的应用程序决定的,无论是某个办公套件还是桌面操作系统。当然,习惯并不意味着它是理想的,但是它往往会毫无疑义地持续存在,甚至影响到企业的运作架构。 + +### 更聪明地工作 + +如今,许多办公应用程序都在云端运行,因此如果你愿意的话,你可以在 Linux 上使用相同的方式。然而,由于许多典型的知名办公应用程序并不符合 Linux 上的文化预期,因此你可能会发现自己受到启发,想去探索其他的选择。正如任何渴望走出“舒适区”的人所知道的那样,这种微妙的打破可能会出奇的有用。很多时候,你不知道自己效率低下,因为你实际上并没有尝试过以不同的方式做事。强迫自己去探索其他方式,你永远不知道会发现什么。你甚至不必完全知道要寻找的内容。 + +### LibreOffice + +Linux(或任何其他平台)上显而易见的开源办公主力之一是 [LibreOffice][2]。它具有多个组件,包括文字处理器、演示软件、电子表格、关系型数据库界面、矢量绘图等。它可以从其他流行的办公应用程序中导入许多文档格式,因此从其他工具过渡到 LibreOffice 通常很容易。 + +然而,LibreOffice 不仅仅是一个出色的办公套件。LibreOffice 支持宏,所以机智的用户可以自动完成重复性任务。它还具有终端命令的功能,因此你可以在不启动 LibreOffice 界面的情况下执行许多任务。 + +想象一下,比如要打开 21 个文档,导航到**文件**菜单,到**导出**或**打印**菜单项,并将文件导出为 PDF 或 EPUB。这至少需要 84 次以上的点击,可能要花费一个小时的时间。相比之下,打开一个文档文件夹,并转换所有文件为 PDF 或 EPUB,只需要执行一个迅速的命令或菜单操作。转换将在后台运行,而你可以处理其他事情。只需要四分之一的时间,可能更少。 + +``` +$ libreoffice --headless --convert-to epub *.docx +``` + +这是一个小改进,是由 Linux 工具集和你可以自定义环境和工作流程的便利性所潜在带来的鼓励。 + +### Abiword 和 Gnumeric + +有时,你并不需要一个大而全的办公套件。如果你喜欢简化你的办公室工作,那么使用一个轻量级和针对特定任务的应用程序可能更好。例如,我大部分时间都是用文本编辑器写文章,因为我知道在转换为 HTML 的过程中,所有的样式都会被丢弃。但有些时候,文字处理器是很有用的,无论是打开别人发给我的文档,还是因为我想用一种快速简单的方法来生成一些样式漂亮的文本。 + +[Abiword][3] 是一款简单的文字处理器,它基本支持流行的文档格式,并具备你所期望的文字处理器的所有基本功能。它并不意味着是一个完整的办公套件,这是它最大的特点。虽然没有太多的选择,但我们仍然处于信息过载的时代,这正是一个完整的办公套件或文字处理器有时会犯的错误。如果你想避免这种情况,那就用一些简单的东西来代替。 + +同样,[Gnumeric][4] 项目提供了一个简单的电子表格应用程序。Gnumeric 避免了任何严格意义上的电子表格所不需要的功能,所以你仍然可以获得强大的公式语法、大量的函数,以及样式和操作单元格的所有选项。我不怎么使用电子表格,所以我发现自己在极少数需要查看或处理分类账中的数据时,对 Gnumeric 相当满意。 + +### Pandoc + +通过专门的命令和文件处理程序,可以最小化。`pandoc` 命令专门用于文件转换。它就像 `libreoffice --headless` 命令一样,只是要处理的文档格式数量是它的十倍。你甚至可以用它来生成演示文稿! 如果你的工作之一是从一个文档中提取源文本,并以多种格式交付它,那么 Pandoc 是必要的,所以你应该[下载我们的攻略][5]看看。 + +广义上讲,Pandoc 代表的是一种完全不同的工作方式。它让你脱离了办公应用的束缚。它将你从试图将你的想法写成文字,并同时决定这些文字应该使用什么字体的工作中分离出来。在纯文本中工作,然后转换为各种交付格式,让你可以使用任何你想要的应用程序,无论是移动设备上的记事本,还是你碰巧坐在电脑前的简单文本编辑器,或者是云端的文本编辑器。 + +### 寻找替代品 + +Linux 有很多意想不到的替代品。你可以从你正在做的事情中退后一步,分析你的工作流程,评估你所需的结果,并调查那些声称可以完全你的需求的新应用程序来找到它们。 + +改变你所使用的工具、工作流程和日常工作可能会让你迷失方向,特别是当你不知道你要找的到底是什么的时候。但 Linux 的优势在于,你有机会重新评估你在多年的计算机使用过程中潜意识里形成的假设。如果你足够努力地寻找答案,你最终会意识到问题所在。通常,你最终会欣赏你学到的东西。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-workday + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop) +[2]: http://libreoffice.org +[3]: https://www.abisource.com +[4]: http://www.gnumeric.org +[5]: https://opensource.com/article/20/5/pandoc-cheat-sheet diff --git a/published/202102/20210208 Why choose Plausible for an open source alternative to Google Analytics.md b/published/202102/20210208 Why choose Plausible for an open source alternative to Google Analytics.md new file mode 100644 index 0000000000..ed909d31a1 --- /dev/null +++ b/published/202102/20210208 Why choose Plausible for an open source alternative to Google Analytics.md @@ -0,0 +1,80 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13135-1.html) +[#]: subject: (Why choose Plausible for an open source alternative to Google Analytics) +[#]: via: (https://opensource.com/article/21/2/plausible) +[#]: author: (Ben Rometsch https://opensource.com/users/flagsmith) + +为什么选择 Plausible 作为 Google Analytics 的开源替代品? +====== + +> Plausible 作为 Google Analytics 的可行、有效的替代方案正在引起用户的关注。 + +![](https://img.linux.net.cn/data/attachment/album/202102/19/233627sb7mvtt7hn93lvvr.jpg) + +替代 Google Analytics 似乎是一个巨大的挑战。实际上,你可以说这听起来似乎不合理(LCTT 译注:Plausible 意即“貌似合理”)。但这正是 [Plausible.io][2] 取得巨大成功的原因,自 2018 年以来已注册了数千名新用户。 + +Plausible 的联合创始人 Uku Taht 和 Marko Saric 最近出现在 [The Craft of Open Source][3] 播客上,谈论了这个项目以及他们是如何: + +* 创建了一个可行的替代 Google Analytics 的方案 +* 在不到两年的时间里获得了如此大的发展势头 +* 通过开源他们的项目实现其目标 + +请继续阅读他们与播客主持人和 Flagsmith 创始人 Ben Rometsch 的对话摘要。 + +### Plausible 是如何开始的 + +2018 年冬天,Uku 开始编写一个他认为急需的项目:一个可行的、有效的 Google Analytics 替代方案。因为他对 Google 产品的发展方向感到失望,而且所有其他数据解决方案似乎都把 Google 当作“数据处理中间人”。 + +Uku 的第一直觉是利用现有的数据库解决方案专注于分析方面的工作。马上,他就遇到了一些挑战。开始尝试使用了 PostgreSQL,这在技术上很幼稚,因为它很快就变得不堪重负,效率低下。因此,他的目标蜕变成了做一个分析产品,可以处理大量的数据点,而且性能不会有明显的下降。简而言之,Uku 成功了,Plausible 现在每月可以收取超过 8000 万条记录。 + +Plausible 的第一个版本于 2019 年夏天发布。2020 年 3 月,Marko 加入,负责项目的传播和营销方面的工作。从那时起,它它的受欢迎程度有了很大的增长。 + +### 为什么要开源? + +Uku 热衷于遵循“独立黑客”的软件开发路线:创建一个产品,把它投放出去,然后看看它如何成长。开源在这方面是有意义的,因为你可以迅速发展一个社区并获得人气。 + +但 Plausible 一开始并不是开源的。Uku 最初担心软件的敏感代码,比如计费代码,但他很快就发布了,因为这对没有 API 令牌的人来说是没有用的。 + +现在,Plausible 是在 [AGPL][4] 下完全开源的,他们选择了 AGPL 而不是 MIT 许可。Uku 解释说,在 MIT 许可下,任何人都可以不受限制地对代码做任何事情。在 AGPL 下,如果有人修改代码,他们必须将他们的修改开源,并将代码回馈给社区。这意味着,大公司不能拿着原始代码在此基础上进行构建,然后获得所有的回报。他们必须共享,使得竞争环境更加公平。例如,如果一家公司想插入他们的计费或登录系统,他们有法律义务发布代码。 + +在播客中,Uku 向我询问了关于 Flagsmith 的授权,目前 Flagsmith 的授权采用 BSD 三句版许可,该许可证是高度开放的,但我即将把一些功能移到更严格的许可后面。到目前为止,Flagsmith 社区已经理解了这一变化,因为他们意识到这将带来更多更好的功能。 + +### Plausible vs. Google Analytics + +Uku 说,在他看来,开源的精神是,代码应该是开放的,任何人都可以进行商业使用,并与社区共享,但你可以把一个闭源的 API 模块作为专有附加组件保留下来。这样一来,Plausible 和其他公司就可以通过创建和销售定制的 API 附加许可来满足不同的使用场景。 + +Marko 职位上是一名开发者,但从营销方面来说,他努力让这个项目在 Hacker News 和 Lobster 等网站上得到报道,并建立了 Twitter 帐户以帮助产生动力。这种宣传带来的热潮也意味着该项目在 GitHub 上起飞,从 500 颗星到 4300 颗星。随着流量的增长,Plausible 出现在 GitHub 的趋势列表中,这让其受欢迎程度像滚雪球一样。 + +Marko 还非常注重发布和推广博客文章。这一策略得到了回报,在最初的 6 个月里,有四五篇文章进入了病毒式传播,他利用这些峰值来放大营销信息,加速了增长。 + +Plausible 成长过程中最大的挑战是让人们从 Google Analytics 上转换过来。这个项目的主要目标是创建一个有用、高效、准确的网络分析产品。它还需要符合法规,并为企业和网站访问者提供高度的隐私。 + +Plausible 现在已经在 8000 多个网站上运行。通过与客户的交谈,Uku 估计其中约 90% 的客户运行过 Google Analytics。 + +Plausible 以标准的软件即服务 (SaaS) 订阅模式运行。为了让事情更公平,它按月页面浏览量收费,而不是按网站收费。对于季节性网站来说,这可能会有麻烦,比如说电子商务网站在节假日会激增,或者美国大选网站每四年激增一次。这些可能会导致月度订阅模式下的定价问题,但它通常对大多数网站很好。 + +### 查看播客 + +想要了解更多关于 Uku 和 Marko 如何以惊人的速度发展开源 Plausible 项目,并使其获得商业上的成功,请[收听播客][3],并查看[其他剧集][5],了解更多关于“开源软件社区的来龙去脉”。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/plausible + +作者:[Ben Rometsch][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/flagsmith +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/analytics-graphs-charts.png?itok=sersoqbV (Analytics: Charts and Graphs) +[2]: https://plausible.io/ +[3]: https://www.flagsmith.com/podcast/02-plausible +[4]: https://www.gnu.org/licenses/agpl-3.0.en.html +[5]: https://www.flagsmith.com/podcast \ No newline at end of file diff --git a/published/202102/20210209 Viper Browser- A Lightweight Qt5-based Web Browser With A Focus on Privacy and Minimalism.md b/published/202102/20210209 Viper Browser- A Lightweight Qt5-based Web Browser With A Focus on Privacy and Minimalism.md new file mode 100644 index 0000000000..78f9f8bc07 --- /dev/null +++ b/published/202102/20210209 Viper Browser- A Lightweight Qt5-based Web Browser With A Focus on Privacy and Minimalism.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13139-1.html) +[#]: subject: (Viper Browser: A Lightweight Qt5-based Web Browser With A Focus on Privacy and Minimalism) +[#]: via: (https://itsfoss.com/viper-browser/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Viper 浏览器:一款注重隐私和简约的轻量级 Qt5 浏览器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/21/110148d7r3hlurczc1ci73.jpg) + +> Viper 浏览器是一个基于 Qt 的浏览器,它提供了简单易用的用户体验,同时考虑到隐私问题。 + +虽然大多数流行的浏览器都运行在 Chromium 之上,但像 [Firefox][1]、[Beaker 浏览器][2]以及其他一些 [chrome 替代品][3]这样独特的替代品不应该停止存在。 + +尤其是考虑到谷歌最近可能想到从 Chromium 中剥离[谷歌浏览器特有的功能][4],并给出了滥用的借口。 + +在寻找更多的 Chrome 替代品时,我在 [Mastodon][6] 上看到了一个有趣的项目 “[Viper 浏览器][5]”。 + +### Viper 浏览器:一个基于 Qt5 的开源浏览器 + +**注意**:Viper 浏览器是一个只有几个贡献者的相当新的项目。它缺乏某些功能,我将在下文提及。 + +Viper 是一款有趣的 Web 浏览器,在利用 [QtWebEngine][8] 的同时,它专注于成为一个强大而又轻巧的选择。 + +QtWebEngine 借用了 Chromium 的代码,但它不包括连接到 Google 平台的二进制文件和服务。 + +我花了一些时间使用它并进行一些日常浏览活动,我必须说,我对它相当感兴趣。不仅仅是因为它是一个简单易用的东西(浏览器可以那么复杂),而且它还专注于增强你的隐私,为你提供添加不同的广告阻止选项以及一些有用的选项。 + +![][9] + +虽然我认为它并不是为所有人准备的,但还是值得一看的。在你继续尝试之前,让我简单介绍一下它的功能。 + +### Viper 浏览器的功能 + +![][10] + +我将列出一些你会发现有用的关键功能: + +* 管理 cookies 的能力 +* 多个预设选项以选择不同的广告屏蔽器网络。 +* 简单且易于使用 +* 隐私友好的默认搜索引擎 - [Startpage][11] (你可以更改) +* 能够添加用户脚本 +* 能够添加新的 user-agent +* 禁用 JavaScript 的选项 +* 能够阻止图像加载 + +除了这些亮点之外,你还可以轻松地调整隐私设置,以删除你的历史记录、清理已有 cookies,以及一些更多的选项。 + +![][12] + +### 在 Linux 上安装 Viper 浏览器 + +它只是在[发布页][13]提供了一个 AppImage 文件,你可以利用它在任何 Linux 发行版上进行测试。 + +如果你需要帮助,你也可以参考我们的[在 Linux 上使用 AppImage 文件][14]指南。如果你好奇,你可以在 [GitHub][5] 上探索更多关于它的内容。 + +- [Viper 浏览器][5] + +### 我对使用 Viper 浏览器的看法 + +我不认为这是一个可以立即取代你当前浏览器的东西,但如果你有兴趣测试尝试提供 Chrome 替代品的新项目,这肯定是其中之一。 + +当我试图登录我的谷歌账户时,它阻止了我,说它可能是一个不安全的浏览器或不支持的浏览器。因此,如果你依赖你的谷歌帐户,这是一个令人失望的消息。 + +但是,其他社交媒体平台也可以与 YouTube 一起正常运行(无需登录)。不支持 Netflix,但总体上浏览体验是相当快速和可用的。 + +你可以安装用户脚本,但 Chrome 扩展还不支持。当然,这要么是有意为之,要么是在开发过程中特别考虑到它是一款隐私友好型的网络浏览器。 + +### 总结 + +考虑到这是一个鲜为人知但对某些人来说很有趣的东西,你对我们有什么建议吗? 是一个值得关注的开源项目么? + +请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/viper-browser/ + +作者:[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.mozilla.org/en-US/firefox/new/ +[2]: https://itsfoss.com/beaker-browser-1-release/ +[3]: https://itsfoss.com/open-source-browsers-linux/ +[4]: https://www.bleepingcomputer.com/news/google/google-to-kill-chrome-sync-feature-in-third-party-browsers/ +[5]: https://github.com/LeFroid/Viper-Browser +[6]: https://mastodon.social/web/accounts/199851 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/viper-browser.png?resize=800%2C583&ssl=1 +[8]: https://wiki.qt.io/QtWebEngine +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/viper-browser-setup.jpg?resize=793%2C600&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/viper-preferences.jpg?resize=800%2C660&ssl=1 +[11]: https://www.startpage.com +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/viper-browser-tools.jpg?resize=800%2C262&ssl=1 +[13]: https://github.com/LeFroid/Viper-Browser/releases +[14]: https://itsfoss.com/use-appimage-linux/ diff --git a/published/202102/20210212 4 reasons to choose Linux for art and design.md b/published/202102/20210212 4 reasons to choose Linux for art and design.md new file mode 100644 index 0000000000..fbb040cf2e --- /dev/null +++ b/published/202102/20210212 4 reasons to choose Linux for art and design.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: (amorsu) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13157-1.html) +[#]: subject: (4 reasons to choose Linux for art and design) +[#]: via: (https://opensource.com/article/21/2/linux-art-design) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +选择 Linux 来做艺术设计的 4 个理由 +====== + +> 开源会强化你的创造力。因为它把你带出专有的思维定势,开阔你的视野,从而带来更多的可能性。让我们探索一些开源的创意项目。 + +![](https://img.linux.net.cn/data/attachment/album/202102/27/135654k1x4um187i1i7wm1.jpg) + +2021 年,人们比以前的任何时候都更有理由来爱上 Linux。在这个系列,我会分享 21 个选择 Linux 的原因。今天,让我来解释一下,为什么 Linux 是艺术设计的绝佳选择。 + +Linux 在服务器和云计算方面获得很多的赞誉。让不少人感到惊讶的是,Linux 刚好也有一系列的很棒的创意设计工具,并且这些工具在用户体验和质量方面可以媲美那些流行的创意设计工具。我第一次使用开源的设计工具时,并不是因为我没有其他工具可以选择。相反的,我是在接触了大量的这些领先的公司提供的专有设计工具后,才开始使用开源设计工具。我之所以最后选择开源设计工具是因为开源更有意义,而且我能获得更好的产出。这些都是一些笼统的说法,所以请允许我解释一下。 + +### 高可用性意味着高生产力 + +“生产力”这一次对于不同的人来说含义不一样。当我想到生产力,就是当你坐下来做事情,并能够完成你给自己设定的所有任务的时候,这时就很有成就感。但是当你总是被一些你无法掌控的事情打断,那你的生产力就下降了。 + +计算机看起来是不可预测的,诚然有很多事情会出错。电脑是由很多的硬件组成的,它们任何一个都有可能在任何时间出问题。软件会有 bug,也有修复这些 bug 的更新,而更新后又会带来新的 bug。如果你对电脑不了解,它可能就像一个定时炸弹,等着爆发。带着数字世界里的这么多的潜在问题,去接受一个当某些条件不满足(比如许可证,或者订阅费)就会不工作的软件,对我来说就显得很不理智。 + +![Inkscape 应用][2] + +开源的创意设计应用不需要订阅费,也不需要许可证。在你需要的时候,它们都能获取得到,并且通常都是跨平台的。这就意味着,当你坐在工作的电脑面前,你就能确定你能用到那些必需的软件。而如果某天你很忙碌,却发现你面前的电脑不工作了,解决办法就是找到一个能工作的,安装你的创意设计软件,然后开始工作。 + +例如,要找到一台无法运行 Inkscape 的电脑,比找到一台可以运行那些专有软件的电脑要难得多。这就叫做高可用。这是游戏规则的改变者。我从来不曾遇到因为软件用不了而不得不干等,浪费我数小时时间的事情。 + +### 开放访问更有利于多样性 + +我在设计行业工作的时候,我的很多同事都是通过自学的方式来学习艺术和技术方面的知识,这让我感到惊讶。有的通过使用那些最新的昂贵的“专业”软件来自学,但总有一大群人是通过使用自由和开源的软件来完善他们的数字化的职业技能。因为,对于孩子,或者没钱的大学生来说,这才是他们能负担的起,而且很容易就能获得的。 + +这是一种不同的高可用性,但这对我和许多其他用户来说很重要,如果不是因为开源,他们就不会从事创意行业。即使那些有提供付费订阅的开源项目,比如 Ardour,都能确保他的用户在不需要支付任何费用的时候也能使用软件。 + +![Ardour 界面][4] + +当你不限制别人用你的软件的时候,你其实拥有了更多的潜在用户。如果你这样做了,那么你就开放了一个接收多样的创意声音的窗口。艺术钟爱影响力,你可以借鉴的经验和想法越多就越好。这就是开源设计软件所带来的可能性。 + +### 文件格式支持更具包容性 + +我们都知道在几乎所有行业里面包容性的价值。在各种意义上,邀请更多的人到派对可以造就更壮观的场面。知道这一点,当看到有的项目或者创新公司只邀请某些人去合作,只接受某些文件格式,就让我感到很痛苦。这看起来很陈旧,就像某个远古时代的精英主义的遗迹,而这是即使在今天都在发生的真实问题。 + +令人惊讶和不幸的是,这不是因为技术上的限制。专有软件可以访问开源的文件格式,因为这些格式是开源的,而且可以自由地集成到各种应用里面。集成这些格式不需要任何回报。而相比之下,专有的文件格式被笼罩在秘密之中,只被限制于提供给几个愿意付钱的人使用。这很糟糕,而且常常,你无法在没有这些专有软件的情况下打开一些文件来获取你的数据。令人惊喜的是,开源的设计软件却是尽力的支持更多的专有文件格式。以下是一些 Inkscape 所支持的令人难以置信的列表样本: + +![可用的 Inkscape 文件格式][5] + +而这大部分都是在没有这些专有格式厂商的支持下开发出来的。 + +支持开放的文件格式可以更包容,对所有人都更好。 + +### 对新的创意没有限制 + +我之所以爱上开源的其中一个原因是,解决一个指定任务时,有彻底的多样性。当你在专有软件周围时,你所看到的世界是基于你所能够获取得到的东西。比如说,你过你打算处理一些照片,你通常会把你的意图局限在你所知道的可能性上面。你从你的架子上的 4 款或 10 款应用中,挑选出 3 款,因为它们是目前你唯一能够获取得到的选项。 + +在开源领域,你通常会有好几个“显而易见的”必备解决方案,但同时你还有一打的角逐者在边缘转悠,供你选择。这些选项有时只是半成品,或者它们超级专注于某项任务,又或者它们学起来有点挑战性,但最主要的是,它们是独特的,而且充满创新的。有时候,它们是被某些不按“套路”出牌的人所开发的,因此处理的方法和市场上现有的产品截然不同。其他时候,它们是被那些熟悉做事情的“正确”方式,但还是在尝试不同策略的人所开发的。这就像是一个充满可能性的巨大的动态的头脑风暴。 + +这种类型的日常创新能够引领出闪现的灵感、光辉时刻,或者影响广泛的通用性改进。比如说,著名的 GIMP 滤镜,(用于从图像中移除项目并自动替换背景)是如此的受欢迎以至于后来被专有图片编辑软件商拿去“借鉴”。这是成功的一步,但是对于一个艺术家而言,个人的影响才是最关键的。我常感叹于新的 Linux 用户的创意,而我只是在技术展会上展示给他们一个简单的音频,或者视频滤镜,或者绘图应用。没有任何的指导,或者应用场景,从简单的交互中喷发出来的关于新的工具的主意,是令人兴奋和充满启发的,通过实验中一些简单的工具,一个全新的艺术系列可以轻而易举的浮现出来。 + +只要在适当的工具集都有的情况下,有很多方式来更有效的工作。虽然私有软件通常也不会反对更聪明的工作习惯的点子,专注于实现自动化任务让用户可以更轻松的工作,对他们也没有直接的收益。Linux 和开源软件就是很大程度专为 [自动化和编排][6] 而建的,而不只是服务器。像 [ImageMagick][7] 和 [GIMP 脚本][8] 这样的工具改变了我的处理图片的方式,包括批量处理方面和纯粹实验方面。 + +你永远不知道你可以创造什么,如果你有一个你从来想象不到会存在的工具的话。 + +### Linux 艺术家 + +这里有 [使用开源的艺术家社区][9],从 [photography][10] 到 [makers][11] 到 [musicians][12],还有更多更多。如果你想要创新,试试 Linux 吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-art-design + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[amorsu](https://github.com/amorsu) +校对:[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/painting_computer_screen_art_design_creative.png?itok=LVAeQx3_ (Painting art on a computer screen) +[2]: https://opensource.com/sites/default/files/inkscape_0.jpg +[3]: https://community.ardour.org/subscribe +[4]: https://opensource.com/sites/default/files/ardour.jpg +[5]: https://opensource.com/sites/default/files/formats.jpg +[6]: https://opensource.com/article/20/11/orchestration-vs-automation +[7]: https://opensource.com/life/16/6/fun-and-semi-useless-toys-linux#imagemagick +[8]: https://opensource.com/article/21/1/gimp-scripting +[9]: https://librearts.org +[10]: https://pixls.us +[11]: https://www.redhat.com/en/blog/channel/red-hat-open-studio +[12]: https://linuxmusicians.com diff --git a/published/202102/20210215 A practical guide to JavaScript closures.md b/published/202102/20210215 A practical guide to JavaScript closures.md new file mode 100644 index 0000000000..cebf757a5a --- /dev/null +++ b/published/202102/20210215 A practical guide to JavaScript closures.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13140-1.html) +[#]: subject: (A practical guide to JavaScript closures) +[#]: via: (https://opensource.com/article/21/2/javascript-closures) +[#]: author: (Nimisha Mukherjee https://opensource.com/users/nimisha) + +JavaScript 闭包实践 +====== + +> 通过深入了解 JavaScript 的高级概念之一:闭包,更好地理解 JavaScript 代码的工作和执行方式。 + +![](https://img.linux.net.cn/data/attachment/album/202102/21/162941ogyb74z3ahfbfe35.jpg) + +在《[JavaScript 如此受欢迎的 4 个原因][2]》中,我提到了一些高级 JavaScript 概念。在本文中,我将深入探讨其中的一个概念:闭包closure。 + +根据 [Mozilla 开发者网络][3](MDN),“闭包是将一个函数和对其周围的状态(词法环境)的引用捆绑在一起(封闭)的组合。”简而言之,这意味着在一个函数内部的函数可以访问其外部(父)函数的变量。 + +为了更好地理解闭包,可以看看作用域及其执行上下文。 + +下面是一个简单的代码片段: + +``` +var hello = "Hello"; + +function sayHelloWorld() { + var world = "World"; +    function wish() { +        var year = "2021"; +        console.log(hello + " " + world + " "+ year); + } + wish(); +} +sayHelloWorld(); +``` + +下面是这段代码的执行上下文: + +![JS 代码的执行上下文][4] + +每次创建函数时(在函数创建阶段)都会创建闭包。每个闭包有三个作用域。 + + * 本地作用域(自己的作用域) + * 外部函数范围 + * 全局范围 + +我稍微修改一下上面的代码来演示一下闭包: + +``` +var hello = "Hello"; + +var sayHelloWorld = function() { + var world = "World"; +    function wish() { +        var year = "2021"; +        console.log(hello + " " + world + " "+ year); + } + return wish; +} +var callFunc = sayHelloWorld(); +callFunc(); +``` + +内部函数 `wish()` 在执行之前就从外部函数返回。这是因为 JavaScript 中的函数形成了**闭包**。 + + * 当 `sayHelloWorld` 运行时,`callFunc` 持有对函数 `wish` 的引用。 + * `wish` 保持对其周围(词法)环境的引用,其中存在变量 `world`。 + +### 私有变量和方法 + +本身,JavaScript 不支持创建私有变量和方法。闭包的一个常见和实用的用途是模拟私有变量和方法,并允许数据隐私。在闭包范围内定义的方法是有特权的。 + +这个代码片段捕捉了 JavaScript 中闭包的常用编写和使用方式: + +``` +var resourceRecord = function(myName, myAddress) { +  var resourceName = myName; +  var resourceAddress = myAddress; +  var accessRight = "HR"; +  return { +    changeName: function(updateName, privilege) { +      // only HR can change the name +      if (privilege === accessRight ) { +        resourceName = updateName; +        return true; +      } else { +        return false; +      } +    },   +    changeAddress: function(newAddress) { +      // any associate can change the address +      resourceAddress = newAddress;           +    },   +    showResourceDetail: function() { +      console.log ("Name:" + resourceName + " ; Address:" + resourceAddress); +    } +  } +} +// Create first record +var resourceRecord1 = resourceRecord("Perry","Office"); +// Create second record +var resourceRecord2 = resourceRecord("Emma","Office"); +// Change the address on the first record +resourceRecord1.changeAddress("Home"); +resourceRecord1.changeName("Perry Berry", "Associate"); // Output is false as only an HR can change the name +resourceRecord2.changeName("Emma Freeman", "HR"); // Output is true as HR changes the name +resourceRecord1.showResourceDetail(); // Output - Name:Perry ; Address:Home +resourceRecord2.showResourceDetail(); // Output - Name:Emma Freeman ; Address:Office +``` + +资源记录(`resourceRecord1` 和 `resourceRecord2`)相互独立。每个闭包通过自己的闭包引用不同版本的 `resourceName` 和 `resourceAddress` 变量。你也可以应用特定的规则来处理私有变量,我添加了一个谁可以修改 `resourceName` 的检查。 + +### 使用闭包 + +理解闭包是很重要的,因为它可以更深入地了解变量和函数之间的关系,以及 JavaScript 代码如何工作和执行。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/javascript-closures + +作者:[Nimisha Mukherjee][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/nimisha +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop-music-headphones.png?itok=EQZ2WKzy (Woman programming) +[2]: https://linux.cn/article-12830-1.html +[3]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures +[4]: https://opensource.com/sites/default/files/uploads/execution-context.png (Execution context for JS code) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202102/20210216 Meet Plots- A Mathematical Graph Plotting App for Linux Desktop.md b/published/202102/20210216 Meet Plots- A Mathematical Graph Plotting App for Linux Desktop.md new file mode 100644 index 0000000000..1232812fab --- /dev/null +++ b/published/202102/20210216 Meet Plots- A Mathematical Graph Plotting App for Linux Desktop.md @@ -0,0 +1,98 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13151-1.html) +[#]: subject: (Meet Plots: A Mathematical Graph Plotting App for Linux Desktop) +[#]: via: (https://itsfoss.com/plots-graph-app/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +认识 Plots:一款适用于 Linux 桌面的数学图形绘图应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/25/140338su2fju6016t5q2tz.jpg) + +Plots 是一款图形绘图应用,它可以轻松实现数学公式的可视化。你可以用它来绘制任意三角函数、双曲函数、指数函数和对数函数的和与积。 + +### 在 Linux 上使用 Plots 绘制数学图形 + +[Plots][1] 是一款简单的应用,它的灵感来自于像 [Desmos][2] 这样的 Web 图形绘图应用。它能让你绘制不同数学函数的图形,你可以交互式地输入这些函数,还可以自定义绘图的颜色。 + +Plots 是用 Python 编写的,它使用 [OpenGL][3] 来利用现代硬件。它使用 GTK 3,因此可以很好地与 GNOME 桌面集成。 + +![][4] + +使用 Plots 非常直白。要添加一个新的方程,点击加号。点击垃圾箱图标可以删除方程。还可以选择撤销和重做。你也可以放大和缩小。 + +![][5] + +你输入方程的文本框是友好的。菜单中有一个“帮助”选项可以访问文档。你可以在这里找到关于如何编写各种数学符号的有用提示。你也可以复制粘贴方程。 + +![][6] + +在深色模式下,侧栏公式区域变成了深色,但主绘图区域仍然是白色。我相信这也许是这样设计的。 + +你可以使用多个函数,并将它们全部绘制在一张图中: + +![][7] + +我发现它在尝试粘贴一些它无法理解的方程时崩溃了。如果你写了一些它不能理解的东西,或者与现有的方程冲突,所有图形都会消失,去掉不正确的方程就会恢复图形。 + +不幸的是,没有导出绘图或复制到剪贴板的选项。你可以随时 [在 Linux 中截图][8],并在你要添加图像的文档中使用它。 + +### 在 Linux 上安装 Plots + +Plots 为各种发行版提供了不同的安装方式。 + +Ubuntu 20.04 和 20.10 用户可以[使用 PPA][11]: + +``` +sudo add-apt-repository ppa:apandada1/plots +sudo apt update +sudo apt install plots +``` + +对于其他基于 Debian 的发行版,你可以使用 [这里][13] 的 [deb 文件安装][12]。 + +我没有在 AUR 软件包列表中找到它,但是作为 Arch Linux 用户,你可以使用 Flatpak 软件包或者使用 Python 安装它。 + +- [Plots Flatpak 软件包][14] + +如果你感兴趣,可以在它的 GitHub 仓库中查看源代码。如果你喜欢这款应用,请考虑在 GitHub 上给它 star。 + +- [GitHub 上的 Plots 源码][1] + +### 结论 + +Plots 主要用于帮助学生学习数学或相关科目,但它在很多其他场景下也能发挥作用。我知道不是每个人都需要,但肯定会对学术界和学校的人有帮助。 + +不过我倒是希望能有导出图片的功能。也许开发者可以在未来的版本中加入这个功能。 + +你知道有什么类似的绘图应用吗?Plots 与它们相比如何? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/plots-graph-app/ + +作者:[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://github.com/alexhuntley/Plots/ +[2]: https://www.desmos.com/ +[3]: https://www.opengl.org/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/fourier-graph-plots.png?resize=800%2C492&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/plots-app-linux-1.png?resize=800%2C518&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/plots-app-linux.png?resize=800%2C527&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/multiple-equations-plots.png?resize=800%2C492&ssl=1 +[8]: https://itsfoss.com/take-screenshot-linux/ +[10]: https://itsfoss.com/keenwrite/ +[11]: https://itsfoss.com/ppa-guide/ +[12]: https://itsfoss.com/install-deb-files-ubuntu/ +[13]: https://launchpad.net/~apandada1/+archive/ubuntu/plots/+packages +[14]: https://flathub.org/apps/details/com.github.alexhuntley.Plots diff --git a/published/202102/20210217 5 reasons to use Linux package managers.md b/published/202102/20210217 5 reasons to use Linux package managers.md new file mode 100644 index 0000000000..76842524a3 --- /dev/null +++ b/published/202102/20210217 5 reasons to use Linux package managers.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13160-1.html) +[#]: subject: (5 reasons to use Linux package managers) +[#]: via: (https://opensource.com/article/21/2/linux-package-management) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使用 Linux 软件包管理器的 5 个理由 +====== + +> 包管理器可以跟踪你安装的软件的所有组件,使得更新、重装和故障排除更加容易。 + +![](https://img.linux.net.cn/data/attachment/album/202102/28/123014kuhttz1kkkexwh9j.jpg) + +在 2021 年,人们喜欢 Linux 的理由比以往任何时候都多。在这个系列中,我将分享 21 个使用 Linux 的不同理由。今天,我将谈谈软件仓库。 + +在我使用 Linux 之前,我认为在计算机上安装的应用是理所当然的。我会根据需要安装应用,如果我最后没有使用它们,我就会把它们忘掉,让它们占用我的硬盘空间。终于有一天,我的硬盘空间会变得稀缺,我就会疯狂地删除应用,为更重要的数据腾出空间。但不可避免的是,应用只能释放出有限的空间,所以我将注意力转移到与这些应用一起安装的所有其他零碎内容上,无论是媒体内容还是配置文件和文档。这不是一个管理电脑的好方法。我知道这一点,但我并没有想过要有其他的选择,因为正如人们所说,你不知道自己不知道什么。 + +当我改用 Linux 时,我发现安装应用的方式有些不同。在 Linux 上,会建议你不要去网站上找应用的安装程序。取而代之的是,运行一个命令,应用就会被安装到系统上,并记录每个单独的文件、库、配置文件、文档和媒体资产。 + +### 什么是软件仓库? + +在 Linux 上安装应用的默认方法是从发行版软件仓库中安装。这可能听起来像应用商店,那是因为现代应用商店借鉴了很多软件仓库的概念。[Linux 也有应用商店][2],但软件仓库是独一无二的。你通过一个*包管理器*从软件仓库中获得一个应用,它使你的 Linux 系统能够记录和跟踪你所安装的每一个组件。 + +这里有五个原因可以让你确切地知道你的系统上有什么东西,可以说是非常有用。 + +#### 1、移除旧应用 + +当你的计算机知道应用安装的每一个文件时,卸载你不再需要的文件真的很容易。在 Linux 上,安装 [31 个不同的文本编辑器][3],然后卸载 30 个你不喜欢的文本编辑器是没有问题的。当你在 Linux 上卸载的时候,你就真的卸载了。 + +#### 2、按你的意思重新安装 + +不仅卸载要彻底,*重装*也很有意义。在许多平台上,如果一个应用出了问题,有时会建议你重新安装它。通常情况下,谁也说不清为什么要重装一个应用。不过,人们还是经常会隐隐约约地怀疑某个地方的文件已经损坏了(换句话说,数据写入错误),所以希望重装可以覆盖坏的文件以让软件重新工作。这是个不错的建议,但对于任何技术人员来说,不知道是什么地方出了问题都是令人沮丧的。更糟糕的是,如果不仔细跟踪,就不能保证所有的文件都会在重装过程中被刷新,因为通常没有办法知道与应用程序一起安装的所有文件在第一时间就删除了。有了软件包管理器,你可以强制彻底删除旧文件,以确保新文件的全新安装。同样重要的是,你可以研究每个文件并可能找出导致问题的文件,但这是开源和 Linux 的一个特点,而不是包管理。 + +#### 3、保持你应用的更新 + +不要听别人告诉你的 Linux 比其他操作系统“更安全”。计算机是由代码组成的,而我们人类每天都会以新的、有趣的方式找到利用这些代码的方法。因为 Linux 上的绝大多数应用都是开源的,所以许多漏洞都会以“常见漏洞和暴露Common Vulnerability and Exposures”(CVE)的形式公开。大量涌入的安全漏洞报告似乎是一件坏事,但这绝对是一个*知道*远比*不知道*好的案例。毕竟,没有人告诉你有问题,并不意味着没有问题。漏洞报告是好的。它们对每个人都有好处。而且,当开发人员修复安全漏洞时,对你而言,及时获得这些修复程序很重要,最好不用自己记着动手修复。 + +包管理器正是为了实现这一点而设计的。当应用收到更新时,无论是修补潜在的安全问题还是引入令人兴奋的新功能,你的包管理器应用都会提醒你可用的更新。 + +#### 4、保持轻便 + +假设你有应用 A 和应用 B,这两个应用都需要库 C。在某些操作系统上,通过得到 A 和 B,就会得到了两个 C 的副本。这显然是多余的,所以想象一下,每个应用都会发生几次。冗余的库很快就会增加,而且由于对一个给定的库没有单一的“正确”来源,所以几乎不可能确保你使用的是最新的甚至是一致的版本。 + +我承认我不会整天坐在这里琢磨软件库,但我确实记得我琢磨的日子,尽管我不知道这就是困扰我的原因。在我还没有改用 Linux 之前,我在处理工作用的媒体文件时遇到错误,或者在玩不同的游戏时出现故障,或者在阅读 PDF 时出现怪异的现象,等等,这些都不是什么稀奇的事情。当时我花了很多时间去调查这些错误。我仍然记得,我的系统上有两个主要的应用分别捆绑了相同(但有区别)的图形后端技术。当一个程序的输出导入到另一个程序时,这种不匹配会导致错误。它本来是可以工作的,但是由于同一个库文件集合的旧版本中的一个错误,一个应用的热修复程序并没有给另一个应用带来好处。 + +包管理器知道每个应用需要哪些后端(被称为*依赖关系*),并且避免重新安装已经在你系统上的软件。 + +#### 5、保持简单 + +作为一个 Linux 用户,我要感谢包管理器,因为它帮助我的生活变得简单。我不必考虑我安装的软件,我需要更新的东西,也不必考虑完成后是否真的将其卸载了。我毫不犹豫地试用软件。而当我在安装一台新电脑时,我运行 [一个简单的 Ansible 脚本][4] 来自动安装我所依赖的所有软件的最新版本。这很简单,很智能,也是一种独特的解放。 + +### 更好的包管理 + +Linux 从整体看待应用和操作系统。毕竟,开源是建立在其他开源工作基础上的,所以发行版维护者理解依赖*栈*的概念。Linux 上的包管理了解你的整个系统、系统上的库和支持文件以及你安装的应用。这些不同的部分协调工作,为你提供了一套高效、优化和强大的应用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-package-management + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_gift_giveaway_box_520x292.png?itok=w1YQhNH1 (Gift box opens with colors coming out) +[2]: http://flathub.org +[3]: https://opensource.com/article/21/1/text-editor-roundup +[4]: https://opensource.com/article/20/9/install-packages-ansible diff --git a/published/202102/20210217 Use this bootable USB drive on Linux to rescue Windows users.md b/published/202102/20210217 Use this bootable USB drive on Linux to rescue Windows users.md new file mode 100644 index 0000000000..73d93d1246 --- /dev/null +++ b/published/202102/20210217 Use this bootable USB drive on Linux to rescue Windows users.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13143-1.html) +[#]: subject: (Use this bootable USB drive on Linux to rescue Windows users) +[#]: via: (https://opensource.com/article/21/2/linux-woeusb) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +如何在 Linux 中创建 USB 启动盘来拯救 Windows 用户 +====== + +> WoeUSB 可以在 Linux 中制作 Windows 启动盘,并帮助你的朋友解锁他们罢工的机器。 + +![](https://img.linux.net.cn/data/attachment/album/202102/22/143829x0gm1gkmw1yb1zu8.jpg) + +人们经常要求我帮助他们恢复被锁死或损坏的 Windows 电脑。有时,我可以使用 Linux USB 启动盘来挂载 Windows 分区,然后从损坏的系统中传输和备份文件。 + +有的时候,客户丢失了他们的密码或以其他方式锁死了他们的登录账户凭证。解锁账户的一种方法是创建一个 Windows 启动盘来修复计算机。微软允许你从网站下载 Windows 的副本,并提供创建 USB 启动盘的工具。但要使用它们,你需要一台 Windows 电脑,这意味着,作为一个 Linux 用户,我需要其他方法来创建一个 DVD 或 USB 启动盘。我发现在 Linux 上创建 Windows USB 很困难。我的可靠工具,如 [Etcher.io][2]、[Popsicle][3](适用于 Pop!_OS)和 [UNetbootin][4],或者从命令行使用 `dd` 来创建可启动媒体,都不是很成功。 + +直到我发现了 [WoeUSB-ng][5],一个 [GPL 3.0][6] 许可的 Linux 工具,它可以为 Windows Vista、7、8 和 10 创建一个 USB 启动盘。这个开源软件有两个程序:一个命令行工具和一个图形用户界面 (GUI) 版本。 + +### 安装 WoeUSB-ng + +GitHub 仓库包含了在 Arch、Ubuntu、Fedora 或使用 pip3 [安装][7] WoeUSB-ng 的说明。 + +如果你是受支持的 Linux 发行版,你可以使用你的包管理器安装 WoeUSB-ng。或者,你可以使用 Python 的包管理器 [pip][8] 来安装应用程序。这在任何 Linux 发行版中都是通用的。这些方法在功能上没有区别,所以使用你熟悉的任何一种。 + +我运行的是 Pop!_OS,它是 Ubuntu 的衍生版本,但由于对 Python 很熟悉,我选择了 pip3 安装: + +``` +$ sudo pip3 install WoeUSB-ng +``` + +### 创建一个启动盘 + +你可以从命令行或 GUI 版本使用 WoeUSB-ng。 + +要从命令行创建一个启动盘,语法要求命令包含 Windows ISO 文件的路径和一个设备。(本例中是 `/dev/sdX`。使用 `lsblk` 命令来确定你的驱动器) + +``` +$ sudo woeusb --device Windows.iso /dev/sdX +``` + +你也可以启动该程序,以获得简单易用的界面。在 WoeUSB-ng 应用程序窗口中,找到 `Windows.iso` 文件并选择它。选择你的 USB 目标设备(你想变成 Windows 启动盘的驱动器)。这将会删除这个驱动器上的所有信息,所以要谨慎选择,然后仔细检查(再三检查)你的选择! + +当你确认正确选择目标驱动器后,点击 **Install** 按钮。 + +![WoeUSB-ng UI][9] + +创建该介质需要 5 到 10 分钟,这取决于你的 Linux 电脑的处理器、内存、USB 端口速度等。请耐心等待。 + +当这个过程完成并验证后,你将有可用的 Windows USB 启动盘,以帮助其他人修复 Windows 计算机。 + +### 帮助他人 + +开源就是为了帮助他人。很多时候,你可以通过使用基于 Linux 的[系统救援 CD][11] 来帮助 Windows 用户。但有时,唯一的帮助方式是直接从 Windows 中获取,而 WoeUSB-ng 是一个很好的开源工具,它可以让这成为可能。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-woeusb + +作者:[Don Watkins][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/don-watkins +[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://etcher.io/ +[3]: https://github.com/pop-os/popsicle +[4]: https://github.com/unetbootin/unetbootin +[5]: https://github.com/WoeUSB/WoeUSB-ng +[6]: https://github.com/WoeUSB/WoeUSB-ng/blob/master/COPYING +[7]: https://github.com/WoeUSB/WoeUSB-ng#installation +[8]: https://opensource.com/downloads/pip-cheat-sheet +[9]: https://opensource.com/sites/default/files/uploads/woeusb-ng-gui.png (WoeUSB-ng UI) +[10]: https://creativecommons.org/licenses/by-sa/4.0/ +[11]: https://www.system-rescue.org/ diff --git a/published/202102/20210218 5 must-have Linux media players.md b/published/202102/20210218 5 must-have Linux media players.md new file mode 100644 index 0000000000..1125465ae2 --- /dev/null +++ b/published/202102/20210218 5 must-have Linux media players.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13148-1.html) +[#]: subject: (5 must-have Linux media players) +[#]: via: (https://opensource.com/article/21/2/linux-media-players) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +5 款值得拥有的 Linux 媒体播放器 +====== + +> 无论是电影还是音乐,Linux 都能为你提供一些优秀的媒体播放器。 + +![](https://img.linux.net.cn/data/attachment/album/202102/24/101806k2g26zfcamiffhlb.jpg) + +在 2021 年,人们有更多的理由喜欢 Linux。在这个系列中,我将分享 21 个使用 Linux 的不同理由。媒体播放是我最喜欢使用 Linux 的理由之一。 + +你可能更喜欢黑胶唱片和卡带,或者录像带和激光影碟,但你很有可能还是在数字设备上播放你喜欢的大部分媒体。电脑上的媒体有一种无法比拟的便利性,这主要是因为我们大多数人一天中的大部分时间都在电脑附近。许多现代电脑用户并没有过多考虑有哪些应用可以用来听音乐和看电影,因为大多数操作系统都默认提供了媒体播放器,或者因为他们订阅了流媒体服务,因此并没有把媒体文件放在自己身边。但如果你的口味超出了通常的热门音乐和节目列表,或者你以媒体工作为乐趣或利润,那么你就会有你想要播放的本地文件。你可能还对现有用户界面有意见。在 Linux 上,*选择*是一种权利,因此你可以选择无数种播放媒体的方式。 + +以下是我在 Linux 上必备的五个媒体播放器。 + +### 1、mpv + +![mpv interface][2] + +一个现代、干净、简约的媒体播放器。得益于它的 Mplayer、[ffmpeg][3] 和 `libmpv` 后端,它可以播放你可能会扔给它的任何类型媒体。我说“扔给它”,是因为播放一个文件的最快捷、最简单的方法就是把文件拖到 mpv 窗口中。如果你拖动多个文件,mpv 会为你创建一个播放列表。 + +当你把鼠标放在上面时,它提供了直观的覆盖控件,但最好还是通过键盘操作界面。例如,`Alt+1` 会使 mpv 窗口变成全尺寸,而 `Alt+0` 会使其缩小到一半大小。你可以使用 `,` 和 `.` 键逐帧浏览视频,`[` 和 `]` 键调整播放速度,`/` 和 `*` 调整音量,`m` 静音等等。这些主控功能可以让你快速调整,一旦你学会了这些功能,你几乎可以在想到要调整播放的时候快速调整。无论是工作还是娱乐,mpv 都是我播放媒体的首选。 + +### 2、Kaffeine 和 Rhythmbox + +![Kaffeine interface][4] + +KDE Plasma 和 GNOME 桌面都提供了音乐应用([Kaffeine][5] 和 [Rhythmbox][]),可以作为你个人音乐库的前端。它们会让你为你的音乐文件提供一个标准的位置,然后扫描你的音乐收藏,这样你就可以根据专辑、艺术家等来浏览。这两款软件都很适合那些你无法完全决定你想听什么,而又想用一种简单的方式来浏览现有音乐的时候。 + +[Kaffeine][5] 其实不仅仅是一个音乐播放器。它可以播放视频文件、DVD、CD,甚至数字电视(假设你有输入信号)。我已经整整几天没有关闭 Kaffeine 了,因为不管我是想听音乐还是看电影,Kaffeine 都能让我轻松地开始播放。 + +### 3、Audacious + +![Audacious interface][6] + +[Audacious][7] 媒体播放器是一个轻量级的应用,它可以播放你的音乐文件(甚至是 MIDI 文件)或来自互联网的流媒体音乐。对我来说,它的主要吸引力在于它的模块化架构,它鼓励开发插件。这些插件可以播放几乎所有你能想到的音频媒体格式,用图形均衡器调整声音,应用效果,甚至可以重塑整个应用,改变其界面。 + +很难把 Audacious 仅仅看作是一个应用,因为它很容易让它变成你想要的应用。无论你是 Linux 上的 XMMS、Windows 上的 WinAmp,还是任何其他替代品,你大概都可以用 Audacious 来近似它们。Audacious 还提供了一个终端命令,`audtool`,所以你可以从命令行控制一个正在运行的 Audacious 实例,所以它甚至可以近似于一个终端媒体播放器! + +### 4、VLC + +![vlc interface][8] + +[VLC][9] 播放器可能是向用户介绍开源的应用之首。作为一款久经考验的多媒体播放器,VLC 可以播放音乐、视频、光盘。它还可以通过网络摄像头或麦克风进行流式传输和录制,从而使其成为捕获快速视频或语音消息的简便方法。像 mpv 一样,大多数情况下都可以通过按单个字母的键盘操作来控制它,但它也有一个有用的右键菜单。它可以将媒体从一种格式转换为另一种格式、创建播放列表、跟踪你的媒体库等。VLC 是最好的,大多数播放器甚至无法在功能上与之匹敌。无论你在什么平台上,它都是一款必备的应用。 + +### 5、Music player daemon + +![mpd with the ncmpc interface][10] + +[music player daemon(mpd)][11] 是一个特别有用的播放器,因为它在服务器上运行。这意味着你可以在 [树莓派][12] 上启动它,然后让它处于空闲状态,这样你就可以在任何时候播放一首曲子。mpd 的客户端有很多,但我用的是 [ncmpc][13]。有了 ncmpc 或像 [netjukebox][14] 这样的 Web 客户端,我可以从本地主机或远程机器上连接 mpd,选择一张专辑,然后从任何地方播放它。 + +### Linux 上的媒体播放 + +在 Linux 上播放媒体是很容易的,这要归功于它出色的编解码器支持和惊人的播放器选择。我只提到了我最喜欢的五个播放器,但还有更多的播放器供你探索。试试它们,找到最好的,然后坐下来放松一下。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-media-players + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LIFE_film.png?itok=aElrLLrw (An old-fashioned video camera) +[2]: https://opensource.com/sites/default/files/mpv_0.png +[3]: https://opensource.com/article/17/6/ffmpeg-convert-media-file-formats +[4]: https://opensource.com/sites/default/files/kaffeine.png +[5]: https://apps.kde.org/en/kaffeine +[6]: https://opensource.com/sites/default/files/audacious.png +[7]: https://audacious-media-player.org/ +[8]: https://opensource.com/sites/default/files/vlc_0.png +[9]: http://videolan.org +[10]: https://opensource.com/sites/default/files/mpd-ncmpc.png +[11]: https://www.musicpd.org/ +[12]: https://opensource.com/article/21/1/raspberry-pi-hifi +[13]: https://www.musicpd.org/clients/ncmpc/ +[14]: http://www.netjukebox.nl/ +[15]: https://wiki.gnome.org/Apps/Rhythmbox \ No newline at end of file diff --git a/published/202102/20210219 7 Ways to Customize Cinnamon Desktop in Linux -Beginner-s Guide.md b/published/202102/20210219 7 Ways to Customize Cinnamon Desktop in Linux -Beginner-s Guide.md new file mode 100644 index 0000000000..5fd5bdcd1a --- /dev/null +++ b/published/202102/20210219 7 Ways to Customize Cinnamon Desktop in Linux -Beginner-s Guide.md @@ -0,0 +1,132 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13145-1.html) +[#]: subject: (7 Ways to Customize Cinnamon Desktop in Linux [Beginner’s Guide]) +[#]: via: (https://itsfoss.com/customize-cinnamon-desktop/) +[#]: author: (Dimitrios https://itsfoss.com/author/dimitrios/) + +初级:在 Linux 中自定义 Cinnamon 桌面的 7 种方法 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/23/095703u8t88l0rpf4o4p5o.jpg) + +Linux Mint 是最好的 [适合初学者的 Linux 发行版][1] 之一。尤其是想 [转战 Linux][2] 的 Windows 用户,会发现它的 Cinnamon 桌面环境非常熟悉。 + +Cinnamon 给人一种传统的桌面体验,很多用户喜欢它的样子。这并不意味着你必须满足于它提供的东西。Cinnamon 提供了几种自定义桌面的方式。 + +在阅读了 [MATE][3] 和 [KDE 自定义][4] 指南后,很多读者要求为 Linux Mint Cinnamon 也提供类似的教程。因此,我创建了这个关于调整 Cinnamon 桌面的外观和感觉的基本指南。 + +### 7 种自定义 Cinnamon 桌面的不同方法 + +在本教程中,我使用的是 [Linux Mint Debian Edition][5](LMDE 4)。你可以在任何运行 Cinnamon 的 Linux 发行版上使用这篇文章的方法。如果你不确定,这里有 [如何检查你使用的桌面环境][6]。 + +当需要改变 Cinnamon 桌面外观时,我发现非常简单,因为只需点击两下即可。如下图所示,点击菜单图标,然后点击“设置”。 + +![][7] + +所有的外观设置都放在该窗口的顶部。在“系统设置”窗口上的一切都显得整齐划一。 + +![][8] + +#### 1、效果 + +效果选项简单,不言自明,一目了然。你可以开启或关闭桌面不同元素的特效,或者通过改变特效风格来改变窗口过渡。如果你想改变效果的速度,可以通过自定义标签来实现。 + +![][9] + +#### 2、字体选择 + +在这个部分,你可以区分整个系统中使用的字体大小和类型,通过字体设置,你可以对外观进行微调。 + +![][10] + +#### 3、主题和图标 + +我曾经做了几年的 Linux Mint 用户,一个原因是你不需要到处去改变你想要的东西。窗口管理器、图标和面板定制都在一个地方! + +你可以将面板改成深色或浅色,窗口边框也可以根据你要的而改变。默认的 Cinnamon 外观设置在我眼里是最好的,我甚至在测试 [Ubuntu Cinnamon Remix][11] 时也应用了一模一样的设置,不过是橙色的。 + +![][12] + +#### 4、Cinnamon 小程序 + +Cinnamon 小程序是所有包含在底部面板的元素,如日历或键盘布局切换器。在管理选项卡中,你可以添加/删除已经安装的小程序。 + +你一定要探索一下可以下载的小程序,如天气和 [CPU 温度][13]指示小程序是我额外选择的。 + +![][14] + +#### 5、Cinnamon Desklets + +Cinnamon Desklets 是可以直接放置在桌面上的应用。和其他所有的自定义选项一样,Desklets 可以从设置菜单中访问,各种各样的选择可以吸引任何人的兴趣。谷歌日历是一个方便的应用,可以直接在桌面上跟踪你的日程安排。 + +![][15] + +#### 6、桌面壁纸 + +要改变 Cinnamon 桌面的背景,只需在桌面上点击右键,选择“改变桌面背景”。它将打开一个简单易用的窗口,在左侧列出了可用的背景系统文件夹,右侧有每个文件夹内的图片预览。 + +![][16] + +你可以通过点击加号(`+`)并选择路径来添加自己的文件夹。在“设置”选项卡中,你可以选择你的背景是静态还是幻灯片,以及背景在屏幕上的位置。 + +![][17] + +#### 7、自定义桌面屏幕上的内容 + +背景并不是你唯一可以改变的桌面元素。如果你在桌面上点击右键,然后点击“自定义”,你可以找到更多的选项。 + +![][18] + +你可以改变图标的大小,将摆放方式从垂直改为水平,并改变它们在两个轴上的间距。如果你不喜欢你所做的,点击重置网格间距回到默认值。 + +![][19] + +此外,如果你点击“桌面设置”,将显示更多的选项。你可以禁用桌面上的图标,将它们放在主显示器或副显示器上,甚至两个都可以。如你所见,你可以选择一些图标出现在桌面上。 + +![][20] + +### 总结 + +Cinnamon 桌面是最好的选择之一,尤其是当你正在 [从 windows 切换到 Linux][21] 的时候,同时对一个简单而优雅的桌面追求者也是如此。 + +Cinnamon 桌面非常稳定,在我手上从来没有崩溃过,这也是在各种 Linux 发行版之间,我使用它这么久的主要原因之一。 + +我没有讲得太详细,但给了你足够的指导,让你自己去探索设置。欢迎反馈你对 Cinnamon 的定制。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/customize-cinnamon-desktop/ + +作者:[Dimitrios][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://itsfoss.com/best-linux-beginners/ +[2]: https://itsfoss.com/reasons-switch-linux-windows-xp/ +[3]: https://itsfoss.com/ubuntu-mate-customization/ +[4]: https://itsfoss.com/kde-customization/ +[5]: https://itsfoss.com/lmde-4-release/ +[6]: https://itsfoss.com/find-desktop-environment/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/6-Cinnamon-settings.png?resize=800%2C680&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/7-Cinnamon-Settings.png?resize=800%2C630&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/8-cinnamon-effects.png?resize=800%2C630&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/11-font-selection.png?resize=800%2C650&ssl=1 +[11]: https://itsfoss.com/ubuntu-cinnamon-remix-review/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/10-cinnamon-themes-and-icons.png?resize=800%2C630&ssl=1 +[13]: https://itsfoss.com/check-laptop-cpu-temperature-ubuntu/ +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/12-cinnamon-applets.png?resize=800%2C630&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/13-cinnamon-desklets.png?resize=800%2C630&ssl=1 +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/1.-Cinnamon-change-desktop-background.png?resize=800%2C400&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/2-Cinnamon-change-desktop-background.png?resize=800%2C630&ssl=1 +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/1.-desktop-additional-customization.png?resize=800%2C400&ssl=1 +[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/4-desktop-additional-customization.png?resize=800%2C480&ssl=1 +[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/5-desktop-additional-customization.png?resize=800%2C630&ssl=1 +[21]: https://itsfoss.com/guide-install-linux-mint-16-dual-boot-windows/ diff --git a/published/202102/20210219 Unlock your Chromebook-s hidden potential with Linux.md b/published/202102/20210219 Unlock your Chromebook-s hidden potential with Linux.md new file mode 100644 index 0000000000..7612fa716f --- /dev/null +++ b/published/202102/20210219 Unlock your Chromebook-s hidden potential with Linux.md @@ -0,0 +1,127 @@ +[#]: collector: (lujun9972) +[#]: translator: (max27149) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13149-1.html) +[#]: subject: (Unlock your Chromebook's hidden potential with Linux) +[#]: via: (https://opensource.com/article/21/2/chromebook-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +用 Linux 释放你 Chromebook 的隐藏潜能 +====== + +> Chromebook 是令人惊叹的工具,但通过解锁它内部的 Linux 系统,你可以让它变得更加不同凡响。 + +![](https://img.linux.net.cn/data/attachment/album/202102/24/114254qstdq1dhj288jh1z.jpg) + +Google Chromebook 运行在 Linux 系统之上,但通常它运行的 Linux 系统对普通用户而言,并不是十分容易就能访问得到。Linux 被用作基于开源的 [Chromium OS][2] 运行时环境的后端技术,然后 Google 将其转换为 Chrome OS。大多数用户体验到的界面是一个电脑桌面,可以用来运行 Chrome 浏览器及其应用程序。然而,在这一切的背后,有一个 Linux 系统等待被你发现。如果你知道怎么做,你可以在 Chromebook 上启用 Linux,把一台可能价格相对便宜、功能相对基础的电脑变成一个严谨的笔记本,获取数百个应用和你需要的所有能力,使它成为一个通用计算机。 + +### 什么是 Chromebook? + +Chromebook 是专为 Chrome OS 创造的笔记本电脑,它本身专为特定的笔记本电脑型号而设计。Chrome OS 不是像 Linux 或 Windows 这样的通用操作系统,而是与 Android 或 iOS 有更多的共同点。如果你决定购买 Chromebook,你会发现有许多不同制造商的型号,包括惠普、华硕和联想等等。有些是为学生而设计,而另一些是为家庭或商业用户而设计的。主要的区别通常分别集中在电池功率或处理能力上。 + +无论你决定买哪一款,Chromebook 都会运行 Chrome OS,并为你提供现代计算机所期望的基本功能。有连接到互联网的网络管理器、蓝牙、音量控制、文件管理器、桌面等等。 + +![Chrome OS desktop][3] + +*Chrome OS 桌面截图* + +不过,想从这个简单易用的操作系统中获得更多,你只需要激活 Linux。 + +### 启用 Chromebook 的开发者模式 + +如果我让你觉得启用 Linux 看似简单,那是因为它确实简单但又有欺骗性。之所以说有欺骗性,是因为在启用 Linux 之前,你*必须*备份数据。 + +这个过程虽然简单,但它确实会将你的计算机重置回出厂默认状态。你必须重新登录到你的笔记本电脑中,如果你有数据存储在 Google 云盘帐户上,你必须得把它重新同步回计算机中。启用 Linux 还需要为 Linux 预留硬盘空间,因此无论你的 Chromebook 硬盘容量是多少,都将减少一半或四分之一(自主选择)。 + +在 Chromebook 上接入 Linux 仍被 Google 视为测试版功能,因此你必须选择使用开发者模式。开发者模式的目的是允许软件开发者测试新功能,安装新版本的操作系统等等,但它可以为你解锁仍在开发中的特殊功能。 + +要启用开发者模式,请首先关闭你的 Chromebook。假定你已经备份了设备上的所有重要信息。 + +接下来,按下键盘上的 `ESC` 和 `⟳`,再按 **电源键** 启动 Chromebook。 + +![ESC and refresh buttons][4] + +*ESC 键和 ⟳ 键* + +当提示开始恢复时,按键盘上的 `Ctrl+D`。 + +恢复结束后,你的 Chromebook 已重置为出厂设置,且没有默认的使用限制。 + +### 开机启动进入开发者模式 + +在开发者模式下运行意味着每次启动 Chromebook 时,都会提醒你处于开发者模式。你可以按 `Ctrl+D` 跳过启动延迟。有些 Chromebook 会在几秒钟后发出蜂鸣声来提醒你处于开发者模式,使得 `Ctrl+D` 操作几乎是强制的。从理论上讲,这个操作很烦人,但在实践中,我不经常启动我的 Chromebook,因为我只是唤醒它,所以当我需要这样做的时候,`Ctrl+D` 只不过是整个启动过程中小小的一步。 + +启用开发者模式后的第一次启动时,你必须重新设置你的设备,就好像它是全新的一样。你只需要这样做一次(除非你在未来某个时刻停用开发者模式)。 + +### 启用 Chromebook 上的 Linux + +现在,你已经运行在开发者模式下,你可以激活 Chrome OS 中的 **Linux Beta** 功能。要做到这一点,请打开 **设置**,然后单击左侧列表中的 **Linux Beta**。 + +激活 **Linux Beta**,并为你的 Linux 系统和应用程序分配一些硬盘空间。在最糟糕的时候,Linux 是相当轻量级的,所以你真的不需要分配太多硬盘空间,但它显然取决于你打算用 Linux 来做多少事。4 GB 的空间对于 Linux 以及几百个终端命令还有二十多个图形应用程序是足够的。我的 Chromebook 有一个 64 GB 的存储卡,我给了 Linux 系统 30 GB,那是因为我在 Chromebook 上所做的大部分事情都是在 Linux 内完成的。 + +一旦你的 **Linux Beta** 环境准备就绪,你可以通过按键盘上的**搜索**按钮和输入 `terminal` 来启动终端。如果你还是 Linux 新手,你可能不知道当前进入的终端能用来安装什么。当然,这取决于你想用 Linux 来做什么。如果你对 Linux 编程感兴趣,那么你可能会从 Bash(它已经在终端中安装和运行了)和 Python 开始。如果你对 Linux 中的那些迷人的开源应用程序感兴趣,你可以试试 GIMP、MyPaint、LibreOffice 或 Inkscape 等等应用程序。 + +Chrome OS 的 **Linux Beta** 模式不包含图形化的软件安装程序,但 [应用程序可以从终端安装][5]。可以使用 `sudo apt install` 命令安装应用程序。 + + * `sudo` 命令可以允许你使用超级管理员权限来执行某些命令(即 Linux 中的 `root`)。 + * `apt` 命令是一个应用程序的安装工具。 + * `install` 是命令选项,即告诉 `apt` 命令要做什么。 + +你还必须把想要安装的软件包的名字和 `apt` 命令写在一起。以安装 LibreOffice 举例: + +``` +sudo apt install libreoffice +``` +当有提示是否继续时,输入 `y`(代表“确认”),然后按 **回车键**。 + +一旦应用程序安装完毕,你可以像在 Chrome OS 上启动任何应用程序一样启动它:只需要在应用程序启动器输入它的名字。 + +了解 Linux 应用程序的名字和它的包名需要花一些时间,但你也可以用 `apt search` 命令来搜索。例如,可以用以下的方法是找到关于照片的应用程序: + +``` +apt search photo +``` + +因为 Linux 中有很多的应用程序,所以你可以找一些感兴趣的东西,然后尝试一下! + +### 与 Linux 共享文件和设备 + + **Linux Beta** 环境运行在 [容器][7] 中,因此 Chrome OS 需要获得访问 Linux 文件的权限。要授予 Chrome OS 与你在 Linux 上创建的文件的交互权限,请右击要共享的文件夹并选择 **管理 Linux 共享**。 + +![Chrome OS Manage Linux sharing interface][8] + +*Chrome OS 的 Linux 管理共享界面* + +你可以通过 Chrome OS 的 **设置** 程序来管理共享设置以及其他设置。 + +![Chrome OS Settings menu][9] + +*Chrome OS 设置菜单* + +### 学习 Linux + +如果你肯花时间学习 Linux,你不仅能够解锁你 Chromebook 中隐藏的潜力,还能最终学到很多关于计算机的知识。Linux 是一个有价值的工具,一个非常有趣的玩具,一个通往比常规计算更令人兴奋的事物的大门。去了解它吧,你可能会惊讶于你自己和你 Chromebook 的无限潜能。 + +--- + +源自: https://opensource.com/article/21/2/chromebook-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[max27149](https://github.com/max27149) +校对:[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/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://www.chromium.org/chromium-os +[3]: https://opensource.com/sites/default/files/chromeos.png +[4]: https://opensource.com/sites/default/files/esc-refresh.png +[5]: https://opensource.com/article/18/1/how-install-apps-linux +[6]: https://opensource.com/tags/linux +[7]: https://opensource.com/resources/what-are-linux-containers +[8]: https://opensource.com/sites/default/files/chromeos-manage-linux-sharing.png +[9]: https://opensource.com/sites/default/files/chromeos-beta-linux.png diff --git a/published/202102/20210220 Starship- Open-Source Customizable Prompt for Any Shell.md b/published/202102/20210220 Starship- Open-Source Customizable Prompt for Any Shell.md new file mode 100644 index 0000000000..0f04781757 --- /dev/null +++ b/published/202102/20210220 Starship- Open-Source Customizable Prompt for Any Shell.md @@ -0,0 +1,180 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13152-1.html) +[#]: subject: (Starship: Open-Source Customizable Prompt for Any Shell) +[#]: via: (https://itsfoss.com/starship/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Starship:跨 shell 的可定制的提示符 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/25/142817taqq2ahab0t61zss.jpg) + +> 如果你很在意你的终端的外观的话,一个跨 shell 的提示符可以让你轻松地定制和配置 Linux 终端提示符。 + +虽然我已经介绍了一些帮助你 [自定义终端外观][1] 的技巧,但我也发现了一些有趣的跨 shell 提示符的建议。 + +### Starship:轻松地调整你的 Linux Shell 提示符 + +![][2] + +[Starship][3] 是一个用 [Rust][4] 编写的开源项目,它可以帮助你建立一个精简、快速、可定制的 shell 提示符。 + +无论你是使用 bash、fish、还是 Windows 上的 PowerShell,抑或其他 shell,你都可以利用Starship 来定制外观。 + +请注意,你必须了解它的 [官方文档][5] 才能对所有你喜欢的东西进行高级配置,但在这里,我将包括一个简单的示例配置,以有一个良好的开端,以及一些关于 Startship 的关键信息。 + +Startship 专注于为你提供一个精简的、快速的、有用的默认 shell 提示符。它甚至会记录并显示执行一个命令所需的时间。例如,这里有一张截图: + +![][6] + +不仅如此,根据自己的喜好定制提示符也相当简单。下面是一张官方 GIF,展示了它的操作: + +![][7] + +让我帮你设置一下。我是在 Ubuntu 上使用 bash shell 来测试的。你可以参考我提到的步骤,或者你可以看看 [官方安装说明][8],以获得在你的系统上安装它的更多选择。 + +### Starship 的亮点 + + * 跨平台 + * 跨 shell 支持 + * 能够添加自定义命令 + * 定制 git 体验 + * 定制使用特定编程语言时的体验 + * 轻松定制提示符的每一个方面,而不会对性能造成实质影响 + +### 在 Linux 上安装 Starship + +> 安装 Starship 需要下载一个 bash 脚本,然后用 root 权限运行该脚本。 +> +> 如果你不习惯这样做,你可以使用 snap。 +> +> ``` +> sudo snap install starship +> ``` + +**注意**:你需要安装 [Nerd 字体][9] 才能获得完整的体验。 + +要开始使用,请确保你安装了 [curl][10]。你可以通过键入如下命令来轻松安装它: + +``` +sudo apt install curl +``` + +完成后,输入以下内容安装 Starship: + +``` +curl -fsSL https://starship.rs/install.sh | bash +``` + +这应该会以 root 身份将 Starship 安装到 `usr/local/bin`。你可能会被提示输入密码。看起来如下: + +![][11] + +### 在 bash 中添加 Starship + +如截图所示,你会在终端本身得到设置的指令。在这里,我们需要在 `.bashrc` 用户文件的末尾添加以下一行: + +``` +eval "$(starship init bash)" +``` + +要想轻松添加,只需键入: + +``` +nano .bashrc +``` + +然后,通过向下滚动导航到文件的末尾,并在文件末尾添加如下图所示的行: + +![][12] + +完成后,只需重启终端或重启会话即可看到一个精简的提示符。对于你的 shell 来说,它可能看起来有点不同,但默认情况下应该是一样的。 + +![][13] + +设置好后,你就可以继续自定义和配置提示符了。让我给你看一个我做的配置示例: + +### 配置 Starship 提示符:基础 + +开始你只需要在 `.config` 目录下制作一个配置文件([TOML文件][14])。如果你已经有了这个目录,直接导航到该目录并创建配置文件。 + +下面是创建目录和配置文件时需要输入的内容: + +``` +mkdir -p ~/.config && touch ~/.config/starship.toml +``` + +请注意,这是一个隐藏目录。所以,当你试图使用文件管理器从主目录访问它时,请确保在继续之前 [启用查看隐藏文件][15]。 + +接下来如果你想探索一些你喜欢的东西,你应该参考配置文档。 + +举个例子,我配置了一个简单的自定义提示,看起来像这样: + +![][16] + +为了实现这个目标,我的配置文件是这样的: + +![][17] + +根据他们的官方文档,这是一个基本的自定义格式。但是,如果你不想要自定义格式,只是想用一种颜色或不同的符号来自定义默认的提示,那就会像这样: + +![][18] + +上述定制的配置文件是这样的: + +![][19] + +当然,这不是我能做出的最好看的提示符,但我希望你能理解其配置方式。 + +你可以通过包括图标或表情符来定制目录的外观,你可以调整变量、格式化字符串、显示 git 提交,或者根据使用特定编程语言而调整。 + +不仅如此,你还可以创建在你的 shell 中使用的自定义命令,让事情变得更简单或舒适。 + +你可以在他们的 [官方网站][3] 和它的 [GitHub 页面][20] 中探索更多的信息。 + +- [Starship.rs][3] + +### 结论 + +如果你只是想做一些小的调整,这文档可能会太复杂了。但是,即使如此,它也可以让你用很少的努力实现一个自定义的提示符或精简的提示符,你可以应用于任何普通的 shell 和你正在使用的系统。 + +总的来说,我不认为它非常有用,但有几个读者建议使用它,看来人们确实喜欢它。我很想看看你是如何 [自定义 Linux 终端][1] 以适应不同的使用方式。 + +欢迎在下面的评论中分享你的看法,如果你喜欢的话。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/starship/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/customize-linux-terminal/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-screenshot.png?resize=800%2C577&ssl=1 +[3]: https://starship.rs/ +[4]: https://www.rust-lang.org/ +[5]: https://starship.rs/config/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-time.jpg?resize=800%2C281&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-demo.gif?resize=800%2C501&ssl=1 +[8]: https://starship.rs/guide/#%F0%9F%9A%80-installation +[9]: https://www.nerdfonts.com +[10]: https://curl.se/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/install-starship.png?resize=800%2C534&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/startship-bashrc-file.png?resize=800%2C545&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-prompt.png?resize=800%2C552&ssl=1 +[14]: https://en.wikipedia.org/wiki/TOML +[15]: https://itsfoss.com/hide-folders-and-show-hidden-files-in-ubuntu-beginner-trick/ +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-custom.png?resize=800%2C289&ssl=1 +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-custom-config.png?resize=800%2C320&ssl=1 +[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-different-symbol.png?resize=800%2C224&ssl=1 +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/starship-symbol-change.jpg?resize=800%2C167&ssl=1 +[20]: https://github.com/starship/starship diff --git a/published/202102/20210221 Not Comfortable Using youtube-dl in Terminal- Use These GUI Apps.md b/published/202102/20210221 Not Comfortable Using youtube-dl in Terminal- Use These GUI Apps.md new file mode 100644 index 0000000000..e41e61a54c --- /dev/null +++ b/published/202102/20210221 Not Comfortable Using youtube-dl in Terminal- Use These GUI Apps.md @@ -0,0 +1,161 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13158-1.html) +[#]: subject: (Not Comfortable Using youtube-dl in Terminal? Use These GUI Apps) +[#]: via: (https://itsfoss.com/youtube-dl-gui-apps/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +不习惯在终端使用 youtube-dl?可以使用这些 GUI 应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202102/27/143909m29a8m8kgkzmmskc.jpg) + +如果你一直在关注我们,可能已经知道 [youtube-dl 项目曾被 GitHub 暂时下架][1] 以合规。但它现在已经恢复并完全可以访问,可以说它并不是一个非法的工具。 + +它是一个非常有用的命令行工具,可以让你 [从 YouTube][2] 和其他一些网站下载视频。使用 [youtube-dl][3] 并不复杂,但我明白使用命令来完成这种任务并不是每个人都喜欢的方式。 + +好在有一些应用为 `youtube-dl` 工具提供了 GUI 前端。 + +### 使用 youtube-dl GUI 应用的先决条件 + +在你尝试下面提到的一些选择之前,你可能需要在你的系统上安装 `youtube-dl` 和 [FFmpeg][4],才能够下载/选择不同的格式进行下载。 + +你可以按照我们的 [ffmpeg 使用完整指南][5] 进行设置,并探索更多关于它的内容。 + +要安装 [youtube-dl][6],你可以在 Linux 终端输入以下命令: + +``` +sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl +``` + +下载最新版本后,你只需要输入以下内容使其可执行就可使用: + +``` +sudo chmod a+rx /usr/local/bin/youtube-dl +``` + +如果你需要其他方法安装它,也可以按照[官方安装说明][7]进行安装。 + +### Youtube-dl GUI 应用 + +大多数 Linux 上的下载管理器也允许你从 YouTube 和其他网站下载视频。然而,youtube-dl GUI 应用可能有额外的选项,如只提取音频或下载特定分辨率和视频格式。 + +请注意,下面的列表没有特别的排名顺序。你可以根据你的要求选择。 + +#### 1、AllTube Download + +![][8] + +**主要特点:** + + * Web GUI + * 开源 + * 可以自托管 + +AllTube 是一个开源的 web GUI,你可以通过 来访问。 + +如果你选择使用这款软件,你不需要在系统上安装 youtube-dl 或 ffmpeg。它提供了一个简单的用户界面,你只需要粘贴视频的 URL,然后继续选择你喜欢的文件格式下载。你也可以选择将其部署在你的服务器上。 + +请注意,你不能使用这个工具提取视频的 MP3 文件,它只适用于视频。你可以通过他们的 [GitHub 页面][9]探索更多关于它的信息。 + +- [AllTube Download Web GUI][10] + +#### 2、youtube-dl GUI + +![][11] + +**主要特点:** + + * 跨平台 + * 显示预计下载大小 + * 有音频和视频下载选择 + +一个使用 electron 和 node.js 制作的有用的跨平台 GUI 应用。你可以很容易地下载音频和视频,以及选择各种可用的文件格式的选项。 + +如果你愿意的话,你还可以下载一个频道或播放列表的部分内容。特别是当你下载高质量的视频文件时,预计的下载大小绝对是非常方便的。 + +如上所述,它也适用于 Windows 和 MacOS。而且,你会在它的 [GitHub 发布][12]中得到一个适用于 Linux 的 AppImage 文件。 + +- [Youtube-dl GUI][13] + +#### 3、Videomass + +![][14] + +**主要特点:** + + * 跨平台 + * 转换音频/视频格式 + * 支持多个 URL + * 适用于也想使用 FFmpeg 的用户 + +如果你想从 YouTube 下载视频或音频,并将它们转换为你喜欢的格式,Videomass 可以是一个不错的选择。 + +要做到这点,你需要在你的系统上同时安装 youtube-dl 和 ffmpeg。你可以轻松的添加多个 URL 来下载,还可以根据自己的喜好设置输出目录。 + +![][15] + +你还可以获得一些高级设置来禁用 youtube-dl,改变文件首选项,以及随着你的探索,还有一些更方便的选项。 + +它为 Ubuntu 用户提供了一个 PPA,为任何其他 Linux 发行版提供了一个 AppImage 文件。在它的 [Github 页面][16]探索更多信息。 + +- [Videomass][17] + +#### 附送:Haruna Video Player + +![][18] + +**主要特点:** + + * 播放/流式传输 YouTube 视频 + +Haruna Video Player 原本是 [MPV][19] 的前端。虽然使用它不能下载 YouTube 视频,但可以通过 youtube-dl 观看/流式传输 YouTube 视频。 + +你可以在我们的[文章][20]中探索更多关于视频播放器的内容。 + +### 总结 + +尽管你可能会在 GitHub 和其他平台上找到更多的 youtube-dl GUI,但它们中的大多数都不能很好地运行,最终会显示出多个错误,或者不再积极开发。 + +[Tartube][21] 就是这样的一个选择,你可以尝试一下,但可能无法达到预期的效果。我用 Pop!_OS 和 Ubuntu MATE 20.04(全新安装)进行了测试。每次我尝试下载一些东西时,无论我怎么做都会失败(即使系统中安装了 youtube-dl 和 ffmpeg)。 + +所以,我个人最喜欢的似乎是 Web GUI([AllTube Download][9]),它不依赖于安装在你系统上的任何东西,也可以自托管。 + +如果我错过了你最喜欢的选择,请在评论中告诉我什么是最适合你的。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/youtube-dl-gui-apps/ + +作者:[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://itsfoss.com/youtube-dl-github-takedown/ +[2]: https://itsfoss.com/download-youtube-videos-ubuntu/ +[3]: https://itsfoss.com/download-youtube-linux/ +[4]: https://ffmpeg.org/ +[5]: https://itsfoss.com/ffmpeg/#install +[6]: https://youtube-dl.org/ +[7]: https://ytdl-org.github.io/youtube-dl/download.html +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/alltube-download.jpg?resize=772%2C593&ssl=1 +[9]: https://github.com/Rudloff/alltube +[10]: https://alltubedownload.net/ +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/youtube-dl-gui.jpg?resize=800%2C548&ssl=1 +[12]: https://github.com/jely2002/youtube-dl-gui/releases/tag/v1.8.7 +[13]: https://github.com/jely2002/youtube-dl-gui +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/videomass.jpg?resize=800%2C537&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/videomass-1.jpg?resize=800%2C542&ssl=1 +[16]: https://github.com/jeanslack/Videomass +[17]: https://jeanslack.github.io/Videomass/ +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/haruna-video-player-dark.jpg?resize=800%2C512&ssl=1 +[19]: https://mpv.io/ +[20]: https://itsfoss.com/haruna-video-player/ +[21]: https://github.com/axcore/tartube diff --git a/published/202103/20160921 lawyer The MIT License, Line by Line.md b/published/202103/20160921 lawyer The MIT License, Line by Line.md new file mode 100644 index 0000000000..8679330528 --- /dev/null +++ b/published/202103/20160921 lawyer The MIT License, Line by Line.md @@ -0,0 +1,296 @@ +[#]: collector: (lujun9972) +[#]: translator: (bestony) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13180-1.html) +[#]: subject: (lawyer The MIT License, Line by Line) +[#]: via: (https://writing.kemitchell.com/2016/09/21/MIT-License-Line-by-Line.html) +[#]: author: (Kyle E. Mitchell https://kemitchell.com/) + +逐行解读 MIT 许可证 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/06/224509d0zt70ctxtt7iibo.png) + +> 每个程序员都应该明白的 171 个字。 + +[MIT 许可证][1] 是世界上最流行的开源软件许可证。以下是它的逐行解读。 + +### 阅读许可证 + +如果你参与了开源软件,但还没有花时间从头到尾的阅读过这个许可证(它只有 171 个单词),你需要现在就去读一下。尤其是如果许可证不是你日常每天都会接触的,把任何看起来不对劲或不清楚的地方记下来,然后继续阅读。我会分段、按顺序、加入上下文和注释,把每一个词再重复一遍。但最重要的还是要有个整体概念。 + +> The MIT License (MIT) +> +> Copyright (c) \ \ +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> *The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.* + +(LCTT 译注:MIT 许可证并无官方的中文文本,我们也没找到任何可靠的、精确的非官方中文文本。在本文中,我们仅作为参考目的提供一份逐字逐行而没有经过润色的中文翻译文本,但该文本及对其的理解**不能**作为 MIT 许可证使用,我们也不为此中文翻译文本的使用承担任何责任,这份中文文本,我们贡献给公共领域。) + +> MIT 许可证(MIT) +> +> 版权 (c) <年份> <版权人> +> +> 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,以及再授权被配发了本软件的人如上的权利,须在下列条件下: +> +> 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。 +> +> 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,还是产生于、源于或有关于本软件以及本软件的使用或其它处置。 + +该许可证分为五段,按照逻辑划分如下: + + * **头部** + * **许可证名称**:“MIT 许可证” + * **版权说明**:“版权 (c) …” + * **许可证授予**:“特此授予 …” + * **授予范围**:“… 处置软件 …” + * **条件**:“… 须在 …” + * **归因和声明**:“上述 … 应包含在 …” + * **免责声明**:“本软件是‘如此’提供的 …” + * **责任限制**:“在任何情况下 …” + +接下来详细看看。 + +### 头部 + +#### 许可证名称 + +> The MIT License (MIT) + +> MIT 许可证(MIT) + +“MIT 许可证”不是一个单一的许可证,而是根据麻省理工学院Massachusetts Institute of Technology(MIT)为发行版本准备的语言衍生出来一系列许可证形式。多年来,无论是对于使用它的原始项目,还是作为其他项目的范本,它经历了许多变化。Fedora 项目一直保持着 [收藏 MIT 许可证的好奇心][2],以纯文本的方式记录了那些平淡的变化,如同泡在甲醛中的解剖标本一般,追溯了它的各种演变。 + +幸运的是,[开放源码倡议组织][3]Open Source Initiative(OSI) 和 [软件数据包交换][4]Software Package Data eXchange组织(SPDX)已经将一种通用的 MIT 式的许可证形式标准化为“MIT 许可证The MIT License”。OSI 反过来又采用了 SPDX 通用开源许可证的标准化 [字符串标志符][5],并将其中的 “MIT” 明确指向了标准化形式的“MIT 许可证”。如果你想为一个新项目使用 MIT 式的条款,请使用其 [标准化的形式][1]。 + +即使你在 `LICENSE` 文件中包含 “The MIT License” 或 “SPDX:MIT”,任何负责的审查者仍会将文本与标准格式进行比较,以确保安全。尽管自称为“MIT 许可证”的各种许可证形式只在细微的细节上有所不同,但所谓的“MIT 许可证”的松散性已经诱使了一些作者加入麻烦的“自定义”。典型的糟糕、不好的、非常坏的例子是 [JSON 许可证][6],一个 MIT 家族的许可证被加上了“本软件应用于善,而非恶”。这件事情可能是“非常克罗克福特”的(LCTT 译者注,Crockford 是 JSON 格式和 JSON.org 的作者)。这绝对是一件麻烦事,也许这个玩笑本来是开在律师身上的,但他们却笑得前仰后合。 + +这个故事的寓意是:“MIT 许可证”本身就是模棱两可的。大家可能很清楚你的意思,但你只需要把标准的 MIT 许可证文本复制到你的项目中,就可以节省每个人的时间。如果使用元数据(如包管理器中的元数据文件)来指定 “MIT 许可证”,请确保 `LICENSE` 文件和任何头部的注释都使用标准的许可证文本。所有的这些都可以 [自动化完成][7]。 + +#### 版权声明 + +> Copyright (c) + +> 版权 (c) <年份> <版权持有人> + +在 1976 年(美国)《版权法》颁布之前,美国的版权法规要求采取具体的行动,即所谓的“手续”来确保创意作品的版权。如果你不遵守这些手续,你起诉他人未经授权使用你的作品的权力就会受到限制,往往会完全丧失权力,其中一项手续就是“声明notice”。在你的作品上打上记号,以其他方式让市场知道你拥有版权。“©” 是一个标准符号,用于标记受版权保护的作品,以发出版权声明。ASCII 字符集没有 © 符号,但 `Copyright (c)` 可以表达同样的意思。 + +1976 年的《版权法》“落实”了国际《伯尔尼公约Berne Convention》的许多要求,取消了确保版权的手续。至少在美国,著作权人在起诉侵权之前,仍然需要对自己的版权作品进行登记,如果在侵权行为开始之前进行登记,可能会获得更高的赔偿。但在实践中,很多人在对某个人提起诉讼之前,都会先注册版权。你并不会因为没有在上面贴上声明、注册它、向国会图书馆寄送副本等而失去版权。 + +即使版权声明不像过去那样绝对必要,但它们仍然有很多用处。说明作品的创作年份和版权属于谁,可以让人知道作品的版权何时到期,从而使作品纳入公共领域。作者或作者们的身份也很有用。美国法律对个人作者和“公司”作者的版权条款的计算方式不同。特别是在商业用途中,公司在使用已知竞争对手的软件时,可能也要三思而行,即使许可条款给予了非常慷慨的许可。如果你希望别人看到你的作品并想从你这里获得许可,版权声明可以很好地起到归属作用。 + +至于“版权持有人copyright holder”。并非所有标准形式的许可证都有写明这一点的空间。最新的许可证形式,如 [Apache 2.0][8] 和 [GPL 3.0][9],发布的许可证文本是要逐字复制的,并在其他地方加上标题注释和单独文件,以表明谁拥有版权并提供许可证。这些办法巧妙地阻止了对“标准”文本的意外或故意的修改。这还使自动许可证识别更加可靠。 + +MIT 许可证是从为机构发布的代码而写的语言演变而来。对于机构发布的代码,只有一个明确的“版权持有人”,即发布代码的机构。其他机构抄袭了这些许可证,用他们自己的名字代替了 “MIT”,最终形成了我们现在拥有的通用形式。这一过程同样适用于该时代的其他简短的机构许可证,特别是加州大学伯克利分校的最初的 [四条款 BSD 许可证][10]four-clause BSD License 成为了现在使用的 [三条款][11] 和 [两条款][12] 变体,以及 MIT 许可证的变体互联网系统联盟Internet Systems Consortium的 [ISC 许可证][13]。 + +在每一种情况下,该机构都根据版权所有权规则将自己列为版权持有人,这些规则称为“[雇佣作品][14]”规则,这些规则赋予雇主和客户在其雇员和承包商代表其从事的某些工作中的版权所有权。这些规则通常不适用于自愿提交代码的分布式协作者。这给项目监管型基金会(如 Apache 基金会和 Eclipse 基金会)带来了一个问题,因为它们接受来自更多不同的贡献者的贡献。到目前为止,通常的基础方法是使用一个单一的许可证,它规定了一个版权持有者,如 [Apache 2.0][8] 和 [EPL 1.0][15],并由贡献者许可协议contributor license agreements [Apache CLA][16] 以及 [Eclipse CLA][17] 为后盾,以从贡献者中收集权利。在像 GPL 这样的左版copyleft许可证下,将版权所有权收集在一个地方就更加重要了,因为 GPL 依靠版权所有者来执行许可证条件,以促进软件自由的价值。 + +如今,大量没有机构或商业管理人的项目都在使用 MIT 风格的许可条款。SPDX 和 OSI 通过标准化不涉及特定实体或机构版权持有人的 MIT 和 ISC 之类的许可证形式,为这些用例提供了帮助。有了这些许可证形式,项目作者的普遍做法是在许可证的版权声明中尽早填上自己的名字...也许还会在这里或那里填上年份。至少根据美国的版权法,由此产生的版权声明并不能说明全部情况。 + +软件的原始所有者保留其工作的所有权。但是,尽管 MIT 风格的许可条款赋予了他人开发和更改软件的权利,创造了法律上所谓的“衍生作品”,但它们并没有赋予原始作者对他人的贡献的所有权。相反,每个贡献者在以现有代码为起点所做的任何作品都拥有版权,[即使是稍做了一点创意][18]。 + +这些项目大多数也对接受贡献者许可协议contributor license agreements(CLA)的想法嗤之以鼻,更不用说签署版权转让协议了。这既幼稚又可以理解。尽管一些较新的开源开发人员认为,在 GitHub 上发送拉取请求Pull Request,就会“自动”根据项目现有的许可证条款授权分发贡献,但美国法律不承认任何此类规则。强有力的版权保护是默认的,而不是宽松许可。 + +> 更新:GitHub 后来修改了全站的服务条款,包括试图至少在 GitHub.com 上改变这一默认值。我在 [另一篇文章][19] 中写了一些对这一发展的想法,并非所有想法都是积极的。 + +为了填补法律上有效的、有据可查的贡献权利授予与完全没有纸质痕迹之间的差距,一些项目采用了 [开发者原创证书][20]Developer Certificate of Origin,这是贡献者在 Git 提交中使用 `Signed-Off-By` 元数据标签暗示的标准声明。开发者原创证书是在臭名昭著的 SCO 诉讼之后为 Linux 内核开发而开发的,该诉讼称 Linux 的大部分代码源自 SCO 拥有的 Unix 源代码。作为创建显示 Linux 的每一行都来自贡献者的书面记录的一种方法,开发者原创证书的功能良好。尽管开发者原创证书不是许可证,但它确实提供了大量证据,证明提交代码的人希望项目分发其代码,并让其他人根据内核现有的许可证条款使用该代码。内核还维护着一个机器可读的 `CREDITS` 文件,其中列出了贡献者的名字、所属机构、贡献领域和其他元数据。我做了 [一些][21] [实验][22],把这种方法改编成适用于不使用内核开发流程的项目。 + +### 许可证授权 + +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), + +> 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人 + +MIT 许可证的实质是许可证(你猜对了)。一般来说,许可证是一个人或法律实体(“许可人licensor”)给予另一个人(“被许可人licensee”)做一些法律允许他们起诉的事情的许可。MIT 许可证是一种不起诉的承诺。 + +法律有时将许可证与给予许可证的承诺区分开来。如果有人违背了提供许可证的承诺,你可以起诉他们违背了承诺,但你最终可能得不到许可证。“特此Hereby”是律师们永远摆脱不了的一个矫揉造作、老生常谈的词。这里使用它来表明,许可证文本本身提供了许可证,而不仅仅是许可证的承诺。这是一个合法的 [即调函数表达式(IIFE)][23]。 + +尽管许多许可证都是授予特定的、指定的被许可人的,但 MIT 许可证是一个“公共许可证public license”。公共许可证授予所有人(整个公众)许可。这是开源许可中的三大理念之一。MIT 许可证通过“向任何获得……软件副本的人”授予许可证来体现这一思想。稍后我们将看到,获得此许可证还有一个条件,以确保其他人也可以了解他们的许可。 + +在美国式法律文件中,括号中带引号的首字母大写词汇是赋予术语特定含义的标准方式(“定义”)。当法庭看到文件中其他地方使用了一个已定义的大写术语时,法庭会可靠地回顾定义中的术语。 + +#### 授权范围 + +> to deal in the Software without restriction, + +> 不受限制地处置该软件的权利, + +从被许可人的角度来看,这是 MIT 许可证中最重要的七个字。主要的法律问题就是因侵犯版权而被起诉,和因侵犯专利而被起诉。无论是版权法还是专利法都没有将 “处置to deal in” 作为一个术语,它在法庭上没有特定的含义。因此,任何法庭在裁决许可人和被许可人之间的纠纷时,都会询问当事人对这一措辞的含义和理解。法庭将看到的是,该措辞有意宽泛和开放。它为被许可人提供了一个强有力的论据,反对许可人提出的任何主张 —— 即他们不允许被许可人使用该软件做那件特定的事情,即使在授予许可证时双方都没有明显想到。 + +> including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + +> 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,以及再授权被配发了本软件的人如上的权利, + +没有一篇法律是完美的、“意义上完全确定”、或明确无误的。小心那些假装不然的人。这是 MIT 许可证中最不完美的部分。主要有三个问题: + +首先,“包括不受限制地including without limitation”是一种法律反模式。它有多种衍生: + + * 包括,但不受限制including, without limitation + * 包括,但不限于前述的一般性including, without limiting the generality of the foregoing + * 包括,但不限于including, but not limited to + * 很多、很多毫无意义的变化 + +所有这些都有一个共同的目标,但都未能可靠地实现。从根本上说,使用它们的起草者也会尽量试探着去做。在 MIT 许可证中,这意味着引入“处置软件dealing in the Software”的具体例子 — “使用、复制、修改”等等,但不意味着被许可方的行为必须与给出的例子类似,才能算作“处置”。问题是,如果你最终需要法庭来审查和解释许可证的条款,法庭将把它的工作看作是找出这些语言的含义。如果法庭需要决定“处置deal in”的含义,它不能“无视”这些例子,即使你告诉它。我认为,“不受限制地处置本软件”本身对被许可人更好,也更短。 + +其次,作为“处置deal in”的例子的那些动词是一个大杂烩。有些在版权法或专利法下有特定的含义,有些稍微有或根本没有含义: + + * “使用use”出现在 [《美国法典》第 35 篇,第 271(a)节][24],这是专利法中专利权人可以起诉他人未经许可的行为的清单。 + * “复制copy”出现在 [《美国法典》第 17 篇,第 106 节][25],即版权法列出的版权所有人可以起诉他人未经许可的行为。 + * “修改modify”既不出现在版权法中,也不出现在专利法中。它可能最接近版权法下的“准备衍生作品prepare derivative works”,但也可能涉及改进或其他衍生发明。 + * 无论是在版权法还是专利法中,“合并merge”都没有出现。“合并merger”在版权方面有特定的含义,但这显然不是这里的意图。相反,法庭可能会根据其在行业中的含义来解读“合并”,如“合并代码”。 + * 无论是在版权法还是专利法中,都没有“发布publish”。由于“软件”是被发布的内容,根据《[版权法][25]》,它可能最接近于“分发distribute”。该法令还包括“公开”表演和展示作品的权利,但这些权利只适用于特定类型的受版权保护的作品,如戏剧、录音和电影。 + * “分发distribute”出现在《[版权法][25]》中。 + * “转授许可sublicense”是知识产权法中的一个总称。转授许可的权利是指把自己的许可证授予他人,有权进行你所许可的部分或全部活动。实际上,MIT 许可证的转授许可的权利在开源代码许可证中并不常见。通常的做法是 Heather Meeker 所说的“直接许可direct licensing”方式,在这种方法中,每个获得该软件及其许可证条款副本的人都直接从所有者那里获得授权。任何可能根据 MIT 许可证获得转授许可的人都可能会得到一份许可证副本,告诉他们其也有直接许可证。 + * “出售副本sell copies”是个混杂品。它接近于《[专利法][24]》中的“要约出售offer to sell”和“出售sell”,但指的是“副本coyies”,这是一种版权概念。在版权方面,它似乎接近于“分发distribute”,但《[版权法][25]》没有提到销售。 + * “允许被配发了本软件的人这样做permit persons to whom the Software is furnished to do so”似乎是多余的“转授许可”。这也是不必要的,因为获得副本的人也可以直接获得许可证。 + +最后,由于这种法律、行业、一般知识产权和一般使用条款的混杂,并不清楚 MIT 许可证是否包括专利许可。一般性语言“处置deal in”和一些例子动词,尤其是“使用”,指向了一个专利许可,尽管是一个非常不明确的许可。许可证来自于版权持有人,而版权持有人可能对软件中的发明拥有或不拥有专利权,以及大多数的例子动词和“软件the Software”本身的定义,都强烈地指向版权许可证。诸如 [Apache 2.0][8] 之类的较新的宽容开源许可分别具体地处理了版权、专利甚至商标问题。 + +#### 三个许可条件 + +> subject to the following conditions: + +> 须在下列条件下: + +总有一个陷阱!MIT 许可证有三个! + +如果你不遵守 MIT 许可证的条件,你就得不到许可证提供的许可。因此,如果不能履行条件,至少从理论上说,会让你面临一场诉讼,很可能是一场版权诉讼。 + +开源软件的第二个伟大思想是,利用软件对被许可人的价值来激励被许可人遵守条件,即使被许可人没有支付任何许可费用。最后一个伟大思想,在 MIT 许可证中没有,它构建了许可证条件:像 [GNU 通用公共许可证][9](GPL)这样的左版许可证,使用许可证条件来控制如何对修改后的版本进行许可和发布。 + +#### 声明条件 + +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +> 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。 + +如果你给别人一份软件的副本,你需要包括许可证文本和任何版权声明。这有几个关键目的: + + 1. 给别人一个声明,说明他们有权使用该公共许可证下的软件。这是直接授权模式的一个关键部分,在这种模式下,每个用户直接从版权持有人那里获得许可证。 + 2. 让人们知道谁是软件的幕后人物,这样他们就可以得到赞美、荣耀和冷冰冰的现金捐赠。 + 3. 确保保修免责声明和责任限制(在后面)伴随该软件。每个得到该副本的人也应该得到一份这些许可人保护的副本。 + +没有什么可以阻止你对提供一个副本、甚至是一个没有源代码的编译形式的副本而收费。但是当你这么做的时候,你不能假装 MIT 代码是你自己的专有代码,也不能在其他许可证下提供。接受的人要知道自己在“公共许可证”下的权利。 + +坦率地说,遵守这个条件正在崩溃。几乎所有的开源许可证都有这样的“归因attribution”条件。系统和装机软件的制作者往往明白,他们需要为自己的每一个发行版本编制一个声明文件或“许可证信息”屏,并附上库和组件的许可证文本副本。项目监管型基金会在教授这些做法方面起到了重要作用。但是整个 Web 开发者群体还没有取得这种经验。这不能用缺乏工具来解释,工具有很多,也不能用 npm 和其他资源库中的包的高度模块化来解释,它们统一了许可证信息的元数据格式。所有好的 JavaScript 压缩器都有保存许可证标题注释的命令行标志。其他工具可以从包树中串联 `LICENSE` 文件。这实在是没有借口。 + +#### 免责声明 + +> The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. + +> 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。 + +美国几乎每个州都颁布了一个版本的《统一商业法典Uniform Commercial Code》(UCC),这是一部规范商业交易的示范性法律。UCC 的第 2 条(加利福尼亚州的“第 2 部分”)规定了商品销售合同,包括了从二手汽车的购买到向制造厂运送大量工业化学品。 + +UCC 关于销售合同的某些规则是强制性的。这些规则始终适用,无论买卖双方是否喜欢。其他只是“默认”。除非买卖双方以书面形式选择不适用这些默认,否则 UCC 潜在视作他们希望在 UCC 文本中找到交易的基准规则。默认规则中包括隐含的“免责warranties”,或卖方对买方关于所售商品的质量和可用性的承诺。 + +关于诸如 MIT 许可证之类的公共许可证是合同(许可方和被许可方之间的可执行协议)还是仅仅是许可证(单向的,但可能有附加条件),这在理论上存在很大争议。关于软件是否被视为“商品”,从而触发 UCC 规则的争论较少。许可人之间没有就赔偿责任进行辩论:如果他们免费提供的软件出现故障、导致问题、无法正常工作或以其他方式引起麻烦,他们不想被起诉和被要求巨额赔偿。这与“默示保证implied warranty”的三个默认规则完全相反: + + 1. 据 [UCC 第 2-314 节][26],“适销性merchantability”的默示保证是一种承诺:“商品”(即软件)的质量至少为平均水平,并经过适当包装和标记,并适用于其常规用途。仅当提供该软件的人是该软件的“商人”时,此保证才适用,这意味着他们从事软件交易,并表现出对软件的熟练程度。 + 2. 据 [UCC 第 2-315 节][27],当卖方知道买方依靠他们提供用于特定目的的货物时,“适用于某一特定目的fitness for a particular purpose”的默示保证就会生效。商品实际上需要“适用”这一目的。 + 3. “非侵权noninfringement”的默示保证不是 UCC 的一部分,而是一般合同法的共同特征。如果事实证明买方收到的商品侵犯了他人的知识产权,则这种默示的承诺将保护买方。如果根据 MIT 许可证获得的软件实际上并不属于尝试许可该软件的许可人,或者属于他人拥有的专利,那就属于这种情况。 + +UCC 的 [第2-316(3)节][28] 要求,选择不适用或“排除”适销性和适用于某一特定目的的默示保证措辞必须醒目。“醒目”意味着书面化或格式化,以引起人们的注意,这与旨在从不小心的消费者身边溜走的细小字体相反。各州法律可以对不侵权的免责声明提出类似的引人注目的要求。 + +长期以来,律师们都有一种错觉,认为用“全大写”写任何东西都符合明显的要求。这是不正确的。法庭曾批评律师协会自以为是,而且大多数人都认为,全大写更多的是阻止阅读,而不是强制阅读。同样的,大多数开源许可证的形式都将其免责声明设置为全大写,部分原因是这是在纯文本的 `LICENSE` 文件中唯一明显的方式。我更喜欢使用星号或其他 ASCII 艺术,但那是很久很久以前的事了。 + +#### 责任限制 + +> In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the Software or the use or other dealings in the Software. + +> 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,还是产生于、源于或有关于本软件以及本软件的使用或其它处置。 + +MIT 许可证授予软件“免费”许可,但法律并不认为接受免费许可证的人在出错时放弃了起诉的权利,而许可人应该受到责备。“责任限制”,通常与“损害赔偿排除”条款搭配使用,其作用与许可证很像,是不起诉的承诺。但这些都是保护许可人免受被许可人起诉的保护措施。 + +一般来说,法庭对责任限制和损害赔偿排除条款的解读非常谨慎,因为这些条款可以将大量的风险从一方转移到另一方。为了保护社会的切身利益,让民众有办法纠正在法庭上所犯的错误,他们“严格地”用措辞限制责任,尽可能地对受其保护的一方进行解读。责任限制必须具体才能成立。特别是在“消费者”合同和其他放弃起诉权的人缺乏成熟度或讨价还价能力的情况下,法庭有时会拒绝尊重那些似乎被埋没在视线之外的措辞。部分是出于这个原因,部分是出于习惯,律师们往往也会给责任限制以全大写处理。 + +再往下看,“责任限制”部分是对被许可人可以起诉的金额上限。在开源许可证中,这个上限总是没有钱,0 元,“不承担责任”。相比之下,在商业许可证中,它通常是过去 12 个月内支付的许可证费用的倍数,尽管它通常是经过谈判的。 + +“排除”部分具体列出了各种法律主张,即请求赔偿的理由,许可人不能使用。像许多其他法律形式一样,MIT 许可证 提到了“违约of contract”行为(即违反合同)和“侵权of tort”行为。侵权规则是防止粗心或恶意伤害他人的一般规则。如果你在发短信时在路上撞倒了人,你就犯了侵权行为。如果你的公司销售的有问题的耳机会烧伤人们的耳朵,则说明贵公司已经侵权。如果合同没有明确排除侵权索赔,那么法庭有时会在合同中使用排除措辞以防止合同索赔。出于很好的考虑,MIT 许可证抛出“或其它”字样,只是为了截住奇怪的海事法或其它异国情调的法律主张。 + +“产生于、源于或有关于arising from, out of or in connection with”这句话是法律起草人固有的、焦虑的不安全感反复出现的症状。关键是,任何与软件有关的诉讼都被这些限制和排除范围所覆盖。万一某些事情可以“产生于arising from”,但不能“源于out of”或“有关于in connection with”,那就最好把这三者都写在里面,所以要把它们打包在一起。更不用说,任何被迫在这部分内容中斤斤计较的法庭将不得不为每个词提出不同的含义,前提是专业的起草者不会在一行中使用不同的词来表示同一件事。更不用说,在实践中,如果法庭对一开始就不利的限制感觉不好,那么他们会更愿意狭隘地解读范围触发器。但我离题了,同样的语言出现在数以百万计的合同中。 + +### 总结 + +所有这些诡辩都有点像在进教堂的路上吐口香糖。MIT 许可证是一个法律经典,且有效。它绝不是解决所有软件知识产权弊病的灵丹妙药,尤其是它比已经出现的软件专利灾难还要早几十年。但 MIT 风格的许可证发挥了令人钦佩的作用,实现了一个狭隘的目的,用最少的、谨慎的法律工具组合扭转了版权、销售和合同法等棘手的默认规则。在计算机技术的大背景下,它的寿命是惊人的。MIT 许可证已经超过、并将要超过绝大多数软件许可证。我们只能猜测,当它最终失去青睐时,它能提供多少年的忠实法律服务。对于那些无法提供自己的律师的人来说,这尤其慷慨。 + +我们已经看到,我们今天所知道的 MIT 许可证是如何成为一套具体的、标准化的条款,使机构特有的、杂乱无章的变化终于有了秩序。 + +我们已经看到了它对归因和版权声明的处理方法如何为学术、标准、商业和基金会机构的知识产权管理实践提供信息。 + +我们已经看到了 MIT 许可证是如何运行所有人免费试用软件的,但前提是要保护许可人不受担保和责任的影响。 + +我们已经看到,尽管有一些生硬的措辞和律师的矫揉造作,但一百七十一个小词可以完成大量的法律工作,为开源软件在知识产权和合同的密集丛林中开辟一条道路。 + +我非常感谢所有花时间阅读这篇相当长的文章的人,让我知道他们发现它很有用,并帮助改进它。一如既往,我欢迎你通过 [e-mail][29]、[Twitter][30] 和 [GitHub][31] 发表评论。 + +--- + +有很多人问,他们在哪里可以读到更多的东西,或者找到其他许可证,比如 GNU 通用公共许可证或 Apache 2.0 许可证。无论你的兴趣是什么,我都会向你推荐以下书籍: + + * Andrew M. St. Laurent 的 [Understanding Open Source & Free Software Licensing][32],来自 O’Reilly。 + > 我先说这本,因为虽然它有些过时,但它的方法也最接近上面使用的逐行方法。O'Reilly 已经把它[放在网上][33]。 + * Heather Meeker 的 [Open (Source) for Business][34] + > 在我看来,这是迄今为止关于 GNU 通用公共许可证和更广泛的左版的最佳著作。这本书涵盖了历史、许可证、它们的发展,以及兼容性和合规性。这本书是我给那些考虑或处理 GPL 的客户的书。 + * Larry Rosen 的 [Open Source Licensing][35],来自 Prentice Hall。 + > 一本很棒的入门书,也可以免费 [在线阅读][36]。对于从零开始的程序员来说,这是开源许可和相关法律的最好介绍。这本在一些具体细节上也有点过时了,但 Larry 的许可证分类法和对开源商业模式的简洁总结经得起时间的考验。 + +所有这些都对我作为一个开源许可律师的教育至关重要。它们的作者都是我的职业英雄。请读一读吧 — K.E.M + +我将此文章基于 [Creative Commons Attribution-ShareAlike 4.0 license][37] 授权 + +-------------------------------------------------------------------------------- + +via: https://writing.kemitchell.com/2016/09/21/MIT-License-Line-by-Line.html + +作者:[Kyle E. Mitchell][a] +选题:[lujun9972][b] +译者:[bestony](https://github.com/bestony) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://kemitchell.com/ +[b]: https://github.com/lujun9972 +[1]: http://spdx.org/licenses/MIT +[2]: https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT +[3]: https://opensource.org +[4]: https://spdx.org +[5]: http://spdx.org/licenses/ +[6]: https://spdx.org/licenses/JSON +[7]: https://www.npmjs.com/package/licensor +[8]: https://www.apache.org/licenses/LICENSE-2.0 +[9]: https://www.gnu.org/licenses/gpl-3.0.en.html +[10]: http://spdx.org/licenses/BSD-4-Clause +[11]: https://spdx.org/licenses/BSD-3-Clause +[12]: https://spdx.org/licenses/BSD-2-Clause +[13]: http://www.isc.org/downloads/software-support-policy/isc-license/ +[14]: http://worksmadeforhire.com/ +[15]: https://www.eclipse.org/legal/epl-v10.html +[16]: https://www.apache.org/licenses/#clas +[17]: https://wiki.eclipse.org/ECA +[18]: https://en.wikipedia.org/wiki/Feist_Publications,_Inc.,_v._Rural_Telephone_Service_Co. +[19]: https://writing.kemitchell.com/2017/02/16/Against-Legislating-the-Nonobvious.html +[20]: http://developercertificate.org/ +[21]: https://github.com/berneout/berneout-pledge +[22]: https://github.com/berneout/authors-certificate +[23]: https://en.wikipedia.org/wiki/Immediately-invoked_function_expression +[24]: https://www.govinfo.gov/app/details/USCODE-2017-title35/USCODE-2017-title35-partIII-chap28-sec271 +[25]: https://www.govinfo.gov/app/details/USCODE-2017-title17/USCODE-2017-title17-chap1-sec106 +[26]: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2314.&lawCode=COM +[27]: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2315.&lawCode=COM +[28]: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2316.&lawCode=COM +[29]: mailto:kyle@kemitchell.com +[30]: https://twitter.com/kemitchell +[31]: https://github.com/kemitchell/writing/tree/master/_posts/2016-09-21-MIT-License-Line-by-Line.md +[32]: https://lccn.loc.gov/2006281092 +[33]: http://www.oreilly.com/openbook/osfreesoft/book/ +[34]: https://www.amazon.com/dp/1511617772 +[35]: https://lccn.loc.gov/2004050558 +[36]: http://www.rosenlaw.com/oslbook.htm +[37]: https://creativecommons.org/licenses/by-sa/4.0/legalcode \ No newline at end of file diff --git a/published/202103/20190221 Testing Bash with BATS.md b/published/202103/20190221 Testing Bash with BATS.md new file mode 100644 index 0000000000..f41ea939b7 --- /dev/null +++ b/published/202103/20190221 Testing Bash with BATS.md @@ -0,0 +1,262 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13194-1.html) +[#]: subject: (Testing Bash with BATS) +[#]: via: (https://opensource.com/article/19/2/testing-bash-bats) +[#]: author: (Darin London https://opensource.com/users/dmlond) + +利用 BATS 测试 Bash 脚本和库 +====== + +> Bash 自动测试系统可以使 Bash 代码也通过 Java、Ruby 和 Python 开发人员所使用的同类测试过程。 + +![](https://img.linux.net.cn/data/attachment/album/202103/11/214705wcjm3vjpn9g69gl3.jpg) + +用 Java、Ruby 和 Python 等语言编写应用程序的软件开发人员拥有复杂的库,可以帮助他们随着时间的推移保持软件的完整性。他们可以创建测试,以在结构化环境中通过执行一系列动作来运行应用程序,以确保其软件所有的方面均按预期工作。 + +当这些测试在持续集成(CI)系统中自动进行时,它们的功能就更加强大了,每次推送到源代码库都会触发测试,并且在测试失败时会立即通知开发人员。这种快速反馈提高了开发人员对其应用程序功能完整性的信心。 + +Bash 自动测试系统Bash Automated Testing System([BATS][1])使编写 Bash 脚本和库的开发人员能够将 Java、Ruby、Python 和其他开发人员所使用的相同惯例应用于其 Bash 代码中。 + +### 安装 BATS + +BATS GitHub 页面包含了安装指令。有两个 BATS 辅助库提供更强大的断言或允许覆写 BATS 使用的 Test Anything Protocol([TAP][2])输出格式。这些库可以安装在一个标准位置,并被所有的脚本引用。更方便的做法是,将 BATS 及其辅助库的完整版本包含在 Git 仓库中,用于要测试的每组脚本或库。这可以通过 [git 子模块][3] 系统来完成。 + +以下命令会将 BATS 及其辅助库安装到 Git 知识库中的 `test` 目录中。 + +``` +git submodule init +git submodule add https://github.com/sstephenson/bats test/libs/bats +git submodule add https://github.com/ztombol/bats-assert test/libs/bats-assert +git submodule add https://github.com/ztombol/bats-support test/libs/bats-support +git add . +git commit -m 'installed bats' +``` + +要克隆 Git 仓库并同时安装其子模块,请在 `git clone` 时使用 +`--recurse-submodules` 标记。 + +每个 BATS 测试脚本必须由 `bats` 可执行文件执行。如果你将 BATS 安装到源代码仓库的 `test/libs` 目录中,则可以使用以下命令调用测试: + +``` +./test/libs/bats/bin/bats <测试脚本的路径> +``` + +或者,将以下内容添加到每个 BATS 测试脚本的开头: + +``` +#!/usr/bin/env ./test/libs/bats/bin/bats +load 'libs/bats-support/load' +load 'libs/bats-assert/load' +``` + +并且执行命令 `chmod +x <测试脚本的路径>`。 这将 a、使它们可与安装在 `./test/libs/bats` 中的 BATS 一同执行,并且 b、包含这些辅助库。BATS 测试脚本通常存储在 `test` 目录中,并以要测试的脚本命名,扩展名为 `.bats`。例如,一个测试 `bin/build` 的 BATS 脚本应称为 `test/build.bats`。 + +你还可以通过向 BATS 传递正则表达式来运行一整套 BATS 测试文件,例如 `./test/lib/bats/bin/bats test/*.bats`。 + +### 为 BATS 覆盖率而组织库和脚本 + +Bash 脚本和库必须以一种有效地方式将其内部工作原理暴露给 BATS 进行组织。通常,在调用或执行时库函数和运行诸多命令的 Shell 脚本不适合进行有效的 BATS 测试。 + +例如,[build.sh][4] 是许多人都会编写的典型脚本。本质上是一大堆代码。有些人甚至可能将这堆代码放入库中的函数中。但是,在 BATS 测试中运行一大堆代码,并在单独的测试用例中覆盖它可能遇到的所有故障类型是不可能的。测试这堆代码并有足够的覆盖率的唯一方法就是把它分解成许多小的、可重用的、最重要的是可独立测试的函数。 + +向库添加更多的函数很简单。额外的好处是其中一些函数本身可以变得出奇的有用。将库函数分解为许多较小的函数后,你可以在 BATS 测试中援引source这些库,并像测试任何其他命令一样运行这些函数。 + +Bash 脚本也必须分解为多个函数,执行脚本时,脚本的主要部分应调用这些函数。此外,还有一个非常有用的技巧,可以让你更容易地用 BATS 测试 Bash 脚本:将脚本主要部分中执行的所有代码都移到一个函数中,称为 `run_main`。然后,将以下内容添加到脚本的末尾: + +``` +if [[ "${BASH_SOURCE[0]}" == "${0}" ]] +then +  run_main +fi +``` + +这段额外的代码做了一些特别的事情。它使脚本在作为脚本执行时与使用援引source进入环境时的行为有所不同。通过援引并测试单个函数,这个技巧使得脚本的测试方式和库的测试方式变得一样。例如,[这是重构的 build.sh,以获得更好的 BATS 可测试性][5]。 + +### 编写和运行测试 + +如上所述,BATS 是一个 TAP 兼容的测试框架,其语法和输出对于使用过其他 TAP 兼容测试套件(例如 JUnit、RSpec 或 Jest)的用户来说将是熟悉的。它的测试被组织成单个测试脚本。测试脚本被组织成一个或多个描述性 `@test` 块中,它们描述了被测试应用程序的单元。每个 `@test` 块将运行一系列命令,这些命令准备测试环境、运行要测试的命令,并对被测试命令的退出和输出进行断言。许多断言函数是通过 `bats`、`bats-assert` 和 `bats-support` 库导入的,这些库在 BATS 测试脚本的开头加载到环境中。下面是一个典型的 BATS 测试块: + +``` +@test "requires CI_COMMIT_REF_SLUG environment variable" { +  unset CI_COMMIT_REF_SLUG +  assert_empty "${CI_COMMIT_REF_SLUG}" +  run some_command +  assert_failure +  assert_output --partial "CI_COMMIT_REF_SLUG" +} +``` + +如果 BATS 脚本包含 `setup`(安装)和/或 `teardown`(拆卸) 函数,则 BATS 将在每个测试块运行之前和之后自动执行它们。这样就可以创建环境变量、测试文件以及执行一个或所有测试所需的其他操作,然后在每次测试运行后将其拆卸。[Build.bats][6] 是对我们新格式化的 `build.sh` 脚本的完整 BATS 测试。(此测试中的 `mock_docker` 命令将在以下关于模拟/打标的部分中进行说明。) + +当测试脚本运行时,BATS 使用 `exec`(执行)来将每个 `@test` 块作为单独的子进程运行。这样就可以在一个 `@test` 中导出环境变量甚至函数,而不会影响其他 `@test` 或污染你当前的 Shell 会话。测试运行的输出是一种标准格式,可以被人理解,并且可以由 TAP 使用端以编程方式进行解析或操作。下面是 `CI_COMMIT_REF_SLUG` 测试块失败时的输出示例: + +``` + ✗ requires CI_COMMIT_REF_SLUG environment variable +   (from function `assert_output' in file test/libs/bats-assert/src/assert.bash, line 231, +    in test file test/ci_deploy.bats, line 26) +     `assert_output --partial "CI_COMMIT_REF_SLUG"' failed + +   -- output does not contain substring -- +   substring (1 lines): +     CI_COMMIT_REF_SLUG +   output (3 lines): +     ./bin/deploy.sh: join_string_by: command not found +     oc error +     Could not login +   -- + +   ** Did not delete , as test failed ** + +1 test, 1 failure +``` + +下面是成功测试的输出: + +``` +✓ requires CI_COMMIT_REF_SLUG environment variable +``` + +### 辅助库 + +像任何 Shell 脚本或库一样,BATS 测试脚本可以包括辅助库,以在测试之间共享通用代码或增强其性能。这些辅助库,例如 `bats-assert` 和 `bats-support` 甚至可以使用 BATS 进行测试。 + +库可以和 BATS 脚本放在同一个测试目录下,如果测试目录下的文件数量过多,也可以放在 `test/libs` 目录下。BATS 提供了 `load` 函数,该函数接受一个相对于要测试的脚本的 Bash 文件的路径(例如,在我们的示例中的 `test`),并援引该文件。文件必须以后缀 `.bash` 结尾,但是传递给 `load` 函数的文件路径不能包含后缀。`build.bats` 加载 `bats-assert` 和 `bats-support` 库、一个小型 [helpers.bash][7] 库以及 `docker_mock.bash` 库(如下所述),以下代码位于测试脚本的开头,解释器魔力行下方: + +``` +load 'libs/bats-support/load' +load 'libs/bats-assert/load' +load 'helpers' +load 'docker_mock' +``` + +### 打标测试输入和模拟外部调用 + +大多数 Bash 脚本和库运行时都会执行函数和/或可执行文件。通常,它们被编程为基于这些函数或可执行文件的输出状态或输出(`stdout`、`stderr`)以特定方式运行。为了正确地测试这些脚本,通常需要制作这些命令的伪版本,这些命令被设计成在特定测试过程中以特定方式运行,称为“打标stubbing”。可能还需要监视正在测试的程序,以确保其调用了特定命令,或者使用特定参数调用了特定命令,此过程称为“模拟mocking”。有关更多信息,请查看在 Ruby RSpec 中 [有关模拟和打标的讨论][8],它适用于任何测试系统。 + +Bash shell 提供了一些技巧,可以在你的 BATS 测试脚本中使用这些技巧进行模拟和打标。所有这些都需要使用带有 `-f` 标志的 Bash `export` 命令来导出一个覆盖了原始函数或可执行文件的函数。必须在测试程序执行之前完成此操作。下面是重写可执行命令 `cat` 的简单示例: + +``` +function cat() { echo "THIS WOULD CAT ${*}" } +export -f cat +``` + +此方法以相同的方式覆盖了函数。如果一个测试需要覆盖要测试的脚本或库中的函数,则在对函数进行打标或模拟之前,必须先声明已测试脚本或库,这一点很重要。否则,在声明脚本时,打标/模拟将被原函数替代。另外,在运行即将进行的测试命令之前确认打标/模拟。下面是`build.bats` 的示例,该示例模拟 `build.sh` 中描述的`raise` 函数,以确保登录函数会引发特定的错误消息: + +``` +@test ".login raises on oc error" { +  source ${profile_script} +  function raise() { echo "${1} raised"; } +  export -f raise +  run login +  assert_failure +  assert_output -p "Could not login raised" +} +``` + +一般情况下,没有必要在测试后复原打标/模拟的函数,因为 `export`(输出)仅在当前 `@test` 块的 `exec`(执行)期间影响当前子进程。但是,可以模拟/打标 BATS `assert` 函数在内部使用的命令(例如 `cat`、`sed` 等)是可能的。在运行这些断言命令之前,必须对这些模拟/打标函数进行 `unset`(复原),否则它们将无法正常工作。下面是 `build.bats` 中的一个示例,该示例模拟 `sed`,运行 `build_deployable` 函数并在运行任何断言之前复原 `sed`: + +``` +@test ".build_deployable prints information, runs docker build on a modified Dockerfile.production and publish_image when its not a dry_run" { +  local expected_dockerfile='Dockerfile.production' +  local application='application' +  local environment='environment' +  local expected_original_base_image="${application}" +  local expected_candidate_image="${application}-candidate:${environment}" +  local expected_deployable_image="${application}:${environment}" +  source ${profile_script} +  mock_docker build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t "${expected_deployable_image}" - +  function publish_image() { echo "publish_image ${*}"; } +  export -f publish_image +  function sed() { +    echo "sed ${*}" >&2; +    echo "FROM application-candidate:environment"; +  } +  export -f sed +  run build_deployable "${application}" "${environment}" +  assert_success +  unset sed +  assert_output --regexp "sed.*${expected_dockerfile}" +  assert_output -p "Building ${expected_original_base_image} deployable ${expected_deployable_image} FROM ${expected_candidate_image}" +  assert_output -p "FROM ${expected_candidate_image} piped" +  assert_output -p "build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t ${expected_deployable_image} -" +  assert_output -p "publish_image ${expected_deployable_image}" +} +``` + +有的时候相同的命令,例如 `foo`,将在被测试的同一函数中使用不同的参数多次调用。这些情况需要创建一组函数: + + * `mock_foo`:将期望的参数作为输入,并将其持久化到 TMP 文件中 + * `foo`:命令的模拟版本,该命令使用持久化的预期参数列表处理每个调用。必须使用 `export -f` 将其导出。 + * `cleanup_foo`:删除 TMP 文件,用于拆卸函数。这可以进行测试以确保在删除之前成功完成 `@test` 块。 + +由于此功能通常在不同的测试中重复使用,因此创建一个可以像其他库一样加载的辅助库会变得有意义。 + +[docker_mock.bash][9] 是一个很棒的例子。它被加载到 `build.bats` 中,并在任何测试调用 Docker 可执行文件的函数的测试块中使用。使用 `docker_mock` 典型的测试块如下所示: + +``` +@test ".publish_image fails if docker push fails" { +  setup_publish +  local expected_image="image" +  local expected_publishable_image="${CI_REGISTRY_IMAGE}/${expected_image}" +  source ${profile_script} +  mock_docker tag "${expected_image}" "${expected_publishable_image}" +  mock_docker push "${expected_publishable_image}" and_fail +  run publish_image "${expected_image}" +  assert_failure +  assert_output -p "tagging ${expected_image} as ${expected_publishable_image}" +  assert_output -p "tag ${expected_image} ${expected_publishable_image}" +  assert_output -p "pushing image to gitlab registry" +  assert_output -p "push ${expected_publishable_image}" +} +``` + +该测试建立了一个使用不同的参数两次调用 Docker 的预期。在对Docker 的第二次调用失败时,它会运行测试命令,然后测试退出状态和对 Docker 调用的预期。 + +一方面 BATS 利用 `mock_docker.bash` 引入 `${BATS_TMPDIR}` 环境变量,BATS 在测试开始的位置对其进行了设置,以允许测试和辅助程序在标准位置创建和销毁 TMP 文件。如果测试失败,`mock_docker.bash` 库不会删除其持久化的模拟文件,但会打印出其所在位置,以便可以查看和删除它。你可能需要定期从该目录中清除旧的模拟文件。 + +关于模拟/打标的一个注意事项:`build.bats` 测试有意识地违反了关于测试声明的规定:[不要模拟没有拥有的!][10] 该规定要求调用开发人员没有编写代码的测试命令,例如 `docker`、`cat`、`sed` 等,应封装在自己的库中,应在使用它们脚本的测试中对其进行模拟。然后应该在不模拟外部命令的情况下测试封装库。 + +这是一个很好的建议,而忽略它是有代价的。如果 Docker CLI API 发生变化,则测试脚本不会检测到此变化,从而导致错误内容直到经过测试的 `build.sh` 脚本在使用新版本 Docker 的生产环境中运行后才显示出来。测试开发人员必须确定要严格遵守此标准的程度,但是他们应该了解其所涉及的权衡。 + +### 总结 + +在任何软件开发项目中引入测试制度,都会在以下两方面产生权衡: a、增加开发和维护代码及测试所需的时间和组织,b、增加开发人员在对应用程序整个生命周期中完整性的信心。测试制度可能不适用于所有脚本和库。 + +通常,满足以下一个或多个条件的脚本和库才可以使用 BATS 测试: + + * 值得存储在源代码管理中 + * 用于关键流程中,并依靠它们长期稳定运行 + * 需要定期对其进行修改以添加/删除/修改其功能 + * 可以被其他人使用 + +一旦决定将测试规则应用于一个或多个 Bash 脚本或库,BATS 就提供其他软件开发环境中可用的全面测试功能。 + +致谢:感谢 [Darrin Mann][11] 向我引荐了 BATS 测试。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/2/testing-bash-bats + +作者:[Darin London][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dmlond +[b]: https://github.com/lujun9972 +[1]: https://github.com/sstephenson/bats +[2]: http://testanything.org/ +[3]: https://git-scm.com/book/en/v2/Git-Tools-Submodules +[4]: https://github.com/dmlond/how_to_bats/blob/preBats/build.sh +[5]: https://github.com/dmlond/how_to_bats/blob/master/bin/build.sh +[6]: https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +[7]: https://github.com/dmlond/how_to_bats/blob/master/test/helpers.bash +[8]: https://www.codewithjason.com/rspec-mocks-stubs-plain-english/ +[9]: https://github.com/dmlond/how_to_bats/blob/master/test/docker_mock.bash +[10]: https://github.com/testdouble/contributing-tests/wiki/Don't-mock-what-you-don't-own +[11]: https://github.com/dmann diff --git a/published/202103/20190730 Using Python to explore Google-s Natural Language API.md b/published/202103/20190730 Using Python to explore Google-s Natural Language API.md new file mode 100644 index 0000000000..5141eae275 --- /dev/null +++ b/published/202103/20190730 Using Python to explore Google-s Natural Language API.md @@ -0,0 +1,299 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13233-1.html) +[#]: subject: (Using Python to explore Google's Natural Language API) +[#]: via: (https://opensource.com/article/19/7/python-google-natural-language-api) +[#]: author: (JR Oakes https://opensource.com/users/jroakes) + +利用 Python 探究 Google 的自然语言 API +====== + +> Google API 可以凸显出有关 Google 如何对网站进行分类的线索,以及如何调整内容以改进搜索结果的方法。 + +![](https://img.linux.net.cn/data/attachment/album/202103/24/232018q66pz2uc5uuq1p03.jpg) + +作为一名技术性的搜索引擎优化人员,我一直在寻找以新颖的方式使用数据的方法,以更好地了解 Google 如何对网站进行排名。我最近研究了 Google 的 [自然语言 API][2] 能否更好地揭示 Google 是如何分类网站内容的。 + +尽管有 [开源 NLP 工具][3],但我想探索谷歌的工具,前提是它可能在其他产品中使用同样的技术,比如搜索。本文介绍了 Google 的自然语言 API,并探究了常见的自然语言处理(NLP)任务,以及如何使用它们来为网站内容创建提供信息。 + +### 了解数据类型 + +首先,了解 Google 自然语言 API 返回的数据类型非常重要。 + +#### 实体 + +实体Entities是可以与物理世界中的某些事物联系在一起的文本短语。命名实体识别Named Entity Recognition(NER)是 NLP 的难点,因为工具通常需要查看关键字的完整上下文才能理解其用法。例如,同形异义字homographs拼写相同,但是具有多种含义。句子中的 “lead” 是指一种金属:“铅”(名词),使某人移动:“牵领”(动词),还可能是剧本中的主要角色(也是名词)?Google 有 12 种不同类型的实体,还有第 13 个名为 “UNKNOWN”(未知)的统称类别。一些实体与维基百科的文章相关,这表明 [知识图谱][4] 对数据的影响。每个实体都会返回一个显著性分数,即其与所提供文本的整体相关性。 + +![实体][5] + +#### 情感 + +情感Sentiment,即对某事的看法或态度,是在文件和句子层面以及文件中发现的单个实体上进行衡量。情感的得分score范围从 -1.0(消极)到 1.0(积极)。幅度magnitude代表情感的非归一化non-normalized强度;它的范围是 0.0 到无穷大。 + +![情感][6] + +#### 语法 + +语法Syntax解析包含了大多数在较好的库中常见的 NLP 活动,例如 [词形演变][7]lemmatization[词性标记][8]part-of-speech tagging[依赖树解析][9]dependency-tree parsing。NLP 主要处理帮助机器理解文本和关键字之间的关系。语法解析是大多数语言处理或理解任务的基础部分。 + +![语法][10] + +#### 分类 + +分类Categories是将整个给定内容分配给特定行业或主题类别,其置信度confidence得分从 0.0 到 1.0。这些分类似乎与其他 Google 工具使用的受众群体和网站类别相同,如 AdWords。 + +![分类][11] + +### 提取数据 + +现在,我将提取一些示例数据进行处理。我使用 Google 的 [搜索控制台 API][12] 收集了一些搜索查询及其相应的网址。Google 搜索控制台是一个报告人们使用 Google Search 查找网站页面的术语的工具。这个 [开源的 Jupyter 笔记本][13] 可以让你提取有关网站的类似数据。在此示例中,我在 2019 年 1 月 1 日至 6 月 1 日期间生成的一个网站(我没有提及名字)上提取了 Google 搜索控制台数据,并将其限制为至少获得一次点击(而不只是曝光impressions)的查询。 + +该数据集包含 2969 个页面和在 Google Search 的结果中显示了该网站网页的 7144 条查询的信息。下表显示,绝大多数页面获得的点击很少,因为该网站侧重于所谓的长尾(越特殊通常就更长尾)而不是短尾(非常笼统,搜索量更大)搜索查询。 + +![所有页面的点击次数柱状图][14] + +为了减少数据集的大小并仅获得效果最好的页面,我将数据集限制为在此期间至少获得 20 次曝光的页面。这是精炼数据集的按页点击的柱状图,其中包括 723 个页面: + +![部分网页的点击次数柱状图][15] + +### 在 Python 中使用 Google 自然语言 API 库 + +要测试 API,在 Python 中创建一个利用 [google-cloud-language][16] 库的小脚本。以下代码基于 Python 3.5+。 + +首先,激活一个新的虚拟环境并安装库。用环境的唯一名称替换 `` 。 + +``` +virtualenv +source /bin/activate +pip install --upgrade google-cloud-language +pip install --upgrade requests +``` + +该脚本从 URL 提取 HTML,并将 HTML 提供给自然语言 API。返回一个包含 `sentiment`、 `entities` 和 `categories` 的字典,其中这些键的值都是列表。我使用 Jupyter 笔记本运行此代码,因为使用同一内核注释和重试代码更加容易。 + +``` +# Import needed libraries +import requests +import json + +from google.cloud import language +from google.oauth2 import service_account +from google.cloud.language import enums +from google.cloud.language import types + +# Build language API client (requires service account key) +client = language.LanguageServiceClient.from_service_account_json('services.json') + +# Define functions +def pull_googlenlp(client, url, invalid_types = ['OTHER'], **data): + + html = load_text_from_url(url, **data) + + if not html: + return None + + document = types.Document( + content=html, + type=language.enums.Document.Type.HTML ) + + features = {'extract_syntax': True, + 'extract_entities': True, + 'extract_document_sentiment': True, + 'extract_entity_sentiment': True, + 'classify_text': False + } + + response = client.annotate_text(document=document, features=features) + sentiment = response.document_sentiment + entities = response.entities + + response = client.classify_text(document) + categories = response.categories + + def get_type(type): + return client.enums.Entity.Type(entity.type).name + + result = {} + + result['sentiment'] = [] + result['entities'] = [] + result['categories'] = [] + + if sentiment: + result['sentiment'] = [{ 'magnitude': sentiment.magnitude, 'score':sentiment.score }] + + for entity in entities: + if get_type(entity.type) not in invalid_types: + result['entities'].append({'name': entity.name, 'type': get_type(entity.type), 'salience': entity.salience, 'wikipedia_url': entity.metadata.get('wikipedia_url', '-') }) + + for category in categories: + result['categories'].append({'name':category.name, 'confidence': category.confidence}) + + + return result + + +def load_text_from_url(url, **data): + + timeout = data.get('timeout', 20) + + results = [] + + try: + + print("Extracting text from: {}".format(url)) + response = requests.get(url, timeout=timeout) + + text = response.text + status = response.status_code + + if status == 200 and len(text) > 0: + return text + + return None + + + except Exception as e: + print('Problem with url: {0}.'.format(url)) + return None +``` + +要访问该 API,请按照 Google 的 [快速入门说明][17] 在 Google 云主控台中创建一个项目,启用该 API 并下载服务帐户密钥。之后,你应该拥有一个类似于以下内容的 JSON 文件: + +![services.json 文件][18] + +命名为 `services.json`,并上传到项目文件夹。 + +然后,你可以通过运行以下程序来提取任何 URL(例如 Opensource.com)的 API 数据: + +``` +url = "https://opensource.com/article/19/6/how-ssh-running-container" +pull_googlenlp(client,url) +``` + +如果设置正确,你将看到以下输出: + +![拉取 API 数据的输出][19] + +为了使入门更加容易,我创建了一个 [Jupyter 笔记本][20],你可以下载并使用它来测试提取网页的实体、类别和情感。我更喜欢使用 [JupyterLab][21],它是 Jupyter 笔记本的扩展,其中包括文件查看器和其他增强的用户体验功能。如果你不熟悉这些工具,我认为利用 [Anaconda][22] 是开始使用 Python 和 Jupyter 的最简单途径。它使安装和设置 Python 以及常用库变得非常容易,尤其是在 Windows 上。 + +### 处理数据 + +使用这些函数,可抓取给定页面的 HTML 并将其传递给自然语言 API,我可以对 723 个 URL 进行一些分析。首先,我将通过查看所有页面中返回的顶级分类的数量来查看与网站相关的分类。 + +#### 分类 + +![来自示例站点的分类数据][23] + +这似乎是该特定站点的关键主题的相当准确的代表。通过查看一个效果最好的页面进行排名的单个查询,我可以比较同一查询在 Google 搜索结果中的其他排名页面。 + + * URL 1 |顶级类别:/法律和政府/与法律相关的(0.5099999904632568)共 1 个类别。 + * 未返回任何类别。 + * URL 3 |顶级类别:/互联网与电信/移动与无线(0.6100000143051147)共 1 个类别。 + * URL 4 |顶级类别:/计算机与电子产品/软件(0.5799999833106995)共有 2 个类别。 + * URL 5 |顶级类别:/互联网与电信/移动与无线/移动应用程序和附件(0.75)共有 1 个类别。 + * 未返回任何类别。 + * URL 7 |顶级类别:/计算机与电子/软件/商业与生产力软件(0.7099999785423279)共 2 个类别。 + * URL 8 |顶级类别:/法律和政府/与法律相关的(0.8999999761581421)共 3 个类别。 + * URL 9 |顶级类别:/参考/一般参考/类型指南和模板(0.6399999856948853)共有 1 个类别。 + * 未返回任何类别。 + +上方括号中的数字表示 Google 对页面内容与该分类相关的置信度。对于相同分类,第八个结果比第一个结果具有更高的置信度,因此,这似乎不是定义排名相关性的灵丹妙药。此外,分类太宽泛导致无法满足特定搜索主题的需要。 + +通过排名查看平均置信度,这两个指标之间似乎没有相关性,至少对于此数据集而言如此: + +![平均置信度排名分布图][24] + +这两种方法对网站进行规模审查是有意义的,以确保内容类别易于理解,并且样板或销售内容不会使你的页面与你的主要专业知识领域无关。想一想,如果你出售工业用品,但是你的页面返回 “Marketing(销售)” 作为主要分类。似乎没有一个强烈的迹象表明,分类相关性与你的排名有什么关系,至少在页面级别如此。 + +#### 情感 + +我不会在情感上花很多时间。在所有从 API 返回情感的页面中,它们分为两个区间:0.1 和 0.2,这几乎是中立的情感。根据直方图,很容易看出情感没有太大价值。对于新闻或舆论网站而言,测量特定页面的情感到中位数排名之间的相关性将是一个更加有趣的指标。 + +![独特页面的情感柱状图][25] + +#### 实体 + +在我看来,实体是 API 中最有趣的部分。这是在所有页面中按显著性salience(或与页面的相关性)选择的顶级实体。请注意,对于相同的术语(销售清单),Google 会推断出不同的类型,可能是错误的。这是由于这些术语出现在内容中的不同上下文中引起的。 + +![示例网站的顶级实体][26] + +然后,我分别查看了每个实体类型,并一起查看了该实体的显著性与页面的最佳排名位置之间是否存在任何关联。对于每种类型,我匹配了与该类型匹配的顶级实体的显著性(与页面的整体相关性),按显著性排序(降序)。 + +有些实体类型在所有示例中返回的显著性为零,因此我从下面的图表中省略了这些结果。 + +![显著性与最佳排名位置的相关性][27] + +“Consumer Good(消费性商品)” 实体类型具有最高的正相关性,皮尔森相关度Pearson correlation为 0.15854,尽管由于较低编号的排名更好,所以 “Person” 实体的结果最好,相关度为 -0.15483。这是一个非常小的样本集,尤其是对于单个实体类型,我不能对数据做太多的判断。我没有发现任何具有强相关性的值,但是 “Person” 实体最有意义。网站通常都有关于其首席执行官和其他主要雇员的页面,这些页面很可能在这些查询的搜索结果方面做得好。 + +继续,当从整体上看站点,根据实体名称和实体类型,出现了以下主题。 + +![基于实体名称和实体类型的主题][28] + +我模糊了几个看起来过于具体的结果,以掩盖网站的身份。从主题上讲,名称信息是在你(或竞争对手)的网站上局部查看其核心主题的一种好方法。这样做仅基于示例网站的排名网址,而不是基于所有网站的可能网址(因为 Search Console 数据仅记录 Google 中展示的页面),但是结果会很有趣,尤其是当你使用像 [Ahrefs][29] 之类的工具提取一个网站的主要排名 URL,该工具会跟踪许多查询以及这些查询的 Google 搜索结果。 + +实体数据中另一个有趣的部分是标记为 “CONSUMER_GOOD” 的实体倾向于 “看起来” 像我在看到 “知识结果Knowledge Results”的结果,即页面右侧的 Google 搜索结果。 + +![Google 搜索结果][30] + +在我们的数据集中具有三个或三个以上关键字的 “Consumer Good(消费性商品)” 实体名称中,有 5.8% 的知识结果与 Google 对该实体命名的结果相同。这意味着,如果你在 Google 中搜索术语或短语,则右侧的框(例如,上面显示 Linux 的知识结果)将显示在搜索结果页面中。由于 Google 会 “挑选” 代表实体的示例网页,因此这是一个很好的机会,可以在搜索结果中识别出具有唯一特征的机会。同样有趣的是,5.8% 的在 Google 中显示这些知识结果名称中,没有一个实体的维基百科 URL 从自然语言 API 中返回。这很有趣,值得进行额外的分析。这将是非常有用的,特别是对于传统的全球排名跟踪工具(如 Ahrefs)数据库中没有的更深奥的主题。 + +如前所述,知识结果对于那些希望自己的内容在 Google 中被收录的网站所有者来说是非常重要的,因为它们在桌面搜索中加强高亮显示。假设,它们也很可能与 Google [Discover][31] 的知识库主题保持一致,这是一款适用于 Android 和 iOS 的产品,它试图根据用户感兴趣但没有明确搜索的主题为用户浮现内容。 + +### 总结 + +本文介绍了 Google 的自然语言 API,分享了一些代码,并研究了此 API 对网站所有者可能有用的方式。关键要点是: + + * 学习使用 Python 和 Jupyter 笔记本可以为你的数据收集任务打开到一个由令人难以置信的聪明和有才华的人建立的不可思议的 API 和开源项目(如 Pandas 和 NumPy)的世界。 + * Python 允许我为了一个特定目的快速提取和测试有关 API 值的假设。 + * 通过 Google 的分类 API 传递网站页面可能是一项很好的检查,以确保其内容分解成正确的主题分类。对于竞争对手的网站执行此操作还可以提供有关在何处进行调整或创建内容的指导。 + * 对于示例网站,Google 的情感评分似乎并不是一个有趣的指标,但是对于新闻或基于意见的网站,它可能是一个有趣的指标。 + * Google 发现的实体从整体上提供了更细化的网站的主题级别视图,并且像分类一样,在竞争性内容分析中使用将非常有趣。 + * 实体可以帮助定义机会,使你的内容可以与搜索结果或 Google Discover 结果中的 Google 知识块保持一致。我们将 5.8% 的结果设置为更长的(字计数)“Consumer Goods(消费商品)” 实体,显示这些结果,对于某些网站来说,可能有机会更好地优化这些实体的页面显著性分数,从而有更好的机会在 Google 搜索结果或 Google Discovers 建议中抓住这个重要作用的位置。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/7/python-google-natural-language-api + +作者:[JR Oakes][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jroakes +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/search_find_code_issue_bug_programming.png?itok=XPrh7fa0 (magnifying glass on computer screen) +[2]: https://cloud.google.com/natural-language/#natural-language-api-demo +[3]: https://opensource.com/article/19/3/natural-language-processing-tools +[4]: https://en.wikipedia.org/wiki/Knowledge_Graph +[5]: https://opensource.com/sites/default/files/uploads/entities.png (Entities) +[6]: https://opensource.com/sites/default/files/uploads/sentiment.png (Sentiment) +[7]: https://en.wikipedia.org/wiki/Lemmatisation +[8]: https://en.wikipedia.org/wiki/Part-of-speech_tagging +[9]: https://en.wikipedia.org/wiki/Parse_tree#Dependency-based_parse_trees +[10]: https://opensource.com/sites/default/files/uploads/syntax.png (Syntax) +[11]: https://opensource.com/sites/default/files/uploads/categories.png (Categories) +[12]: https://developers.google.com/webmaster-tools/ +[13]: https://github.com/MLTSEO/MLTS/blob/master/Demos.ipynb +[14]: https://opensource.com/sites/default/files/uploads/histogram_1.png (Histogram of clicks for all pages) +[15]: https://opensource.com/sites/default/files/uploads/histogram_2.png (Histogram of clicks for subset of pages) +[16]: https://pypi.org/project/google-cloud-language/ +[17]: https://cloud.google.com/natural-language/docs/quickstart +[18]: https://opensource.com/sites/default/files/uploads/json_file.png (services.json file) +[19]: https://opensource.com/sites/default/files/uploads/output.png (Output from pulling API data) +[20]: https://github.com/MLTSEO/MLTS/blob/master/Tutorials/Google_Language_API_Intro.ipynb +[21]: https://github.com/jupyterlab/jupyterlab +[22]: https://www.anaconda.com/distribution/ +[23]: https://opensource.com/sites/default/files/uploads/categories_2.png (Categories data from example site) +[24]: https://opensource.com/sites/default/files/uploads/plot.png (Plot of average confidence by ranking position ) +[25]: https://opensource.com/sites/default/files/uploads/histogram_3.png (Histogram of sentiment for unique pages) +[26]: https://opensource.com/sites/default/files/uploads/entities_2.png (Top entities for example site) +[27]: https://opensource.com/sites/default/files/uploads/salience_plots.png (Correlation between salience and best ranking position) +[28]: https://opensource.com/sites/default/files/uploads/themes.png (Themes based on entity name and entity type) +[29]: https://ahrefs.com/ +[30]: https://opensource.com/sites/default/files/uploads/googleresults.png (Google search results) +[31]: https://www.blog.google/products/search/introducing-google-discover/ diff --git a/published/202103/20200122 9 favorite open source tools for Node.js developers.md b/published/202103/20200122 9 favorite open source tools for Node.js developers.md new file mode 100644 index 0000000000..361c8a87d4 --- /dev/null +++ b/published/202103/20200122 9 favorite open source tools for Node.js developers.md @@ -0,0 +1,232 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13206-1.html) +[#]: subject: (9 favorite open source tools for Node.js developers) +[#]: via: (https://opensource.com/article/20/1/open-source-tools-nodejs) +[#]: author: (Hiren Dhadhuk https://opensource.com/users/hirendhadhuk) + +9 个 Node.js 开发人员最喜欢的开源工具 +====== + +> 在众多可用于简化 Node.js 开发的工具中,以下 9 种是最佳选择。 + +![](https://img.linux.net.cn/data/attachment/album/202103/15/233658i99wxvzin13o5319.png) + +我最近在 [StackOverflow][2] 上读到了一项调查,该调查称超过 49% 的开发人员在其项目中使用了 Node.js。这结果对我来说并不意外。 + +作为一个狂热的技术使用者,我可以肯定地说 Node.js 的引入引领了软件开发的新时代。现在,它是软件开发最受欢迎的技术之一,仅次于JavaScript。 + +### Node.js 是什么,为什么如此受欢迎? + +Node.js 是一个跨平台的开源运行环境,用于在浏览器之外执行 JavaScript 代码。它也是建立在 Chrome 的 JavaScript 运行时之上的首选运行时环境,主要用于构建快速、可扩展和高效的网络应用程序。 + +我记得当时我们要花费几个小时来协调前端和后端开发人员,他们分别编写不同脚本。当 Node.js 出现后,所有这些都改变了。我相信,促使开发人员采用这项技术是因为它的双向效率。 + +使用 Node.js,你可以让你的代码同时运行在客户端和服务器端,从而加快了整个开发过程。Node.js 弥合了前端和后端开发之间的差距,并使开发过程更加高效。 + +### Node.js 工具浪潮 + +对于 49% 的开发人员(包括我)来说,Node.js 处于在前端和后端开发的金字塔顶端。有大量的 [Node.js 用例][3] 帮助我和我的团队在截止日期之内交付复杂的项目。幸运的是,Node.js 的日益普及也产生了一系列开源项目和工具,以帮助开发人员使用该环境。 + +近来,对使用 Node.js 构建的项目的需求突然增加。有时,我发现管理这些项目,并同时保持交付高质量项目的步伐非常具有挑战性。因此,我决定使用为 Node.js 开发人员提供的许多开源工具中一些最高效的,使某些方面的开发自动化。 + +根据我在 Node.js 方面的丰富经验,我使用了许多的工具,这些工具对整个开发过程都非常有帮助:从简化编码过程,到监测再到内容管理。 + +为了帮助我的 Node.js 开发同道,我整理了这个列表,其中包括我最喜欢的 9 个简化 Node.js 开发的开源工具。 + +### Webpack + +[Webpack][4] 是一个容易使用的 JavaScript 模块捆绑程序module bundler,用于简化前端开发。它会检测具有依赖的模块,并将其转换为描述模块的静态素材asset。 + +可以通过软件包管理器 npm 或 Yarn 安装该工具。 + +利用 npm 命令安装如下: + +``` +npm install --save-dev webpack +``` + +利用 Yarn 命令安装如下: + +``` +yarn add webpack --dev +``` + +Webpack 可以创建在运行时异步加载的单个捆绑包或多个素材链。不必单独加载。使用 Webpack 工具可以快速高效地打包这些素材并提供服务,从而改善用户整体体验,并减少开发人员在管理加载时间方面的困难。 + +### Strapi + +[Strapi][5] 是一个开源的无界面headless内容管理系统(CMS)。无界面 CMS 是一种基础软件,可以管理内容而无需预先构建好的前端。它是一个使用 RESTful API 函数的只有后端的系统。 + +可以通过软件包管理器 Yarn 或 npx 安装 Strapi。 + +利用 Yarn 命令安装如下: + +``` +yarn create strapi-app my-project --quickstart +``` + +利用 npx 命令安装如下: + +``` +npx create-strapi-app my-project --quickstart +``` + +Strapi 的目标是在任何设备上以结构化的方式获取和交付内容。CMS 可以使你轻松管理应用程序的内容,并确保它们是动态的,可以在任何设备上访问。 + +它提供了许多功能,包括文件上传、内置的电子邮件系统、JSON Web Token(JWT)验证和自动生成文档。我发现它非常方便,因为它简化了整个 CMS,并为我提供了编辑、创建或删除所有类型内容的完全自主权。 + +另外,通过 Strapi 构建的内容结构非常灵活,因为你可以创建和重用内容组和可定制的 API。 + +### Broccoli + +[Broccoli][6] 是一个功能强大的构建工具,运行在 [ES6][7] 模块上。构建工具是一种软件,可让你将应用程序或网站中的所有各种素材(例如图像、CSS、JavaScript 等)组合成一种可分发的格式。Broccoli 将自己称为 “雄心勃勃的应用程序的素材管道”。 + +使用 Broccoli 你需要一个项目目录。有了项目目录后,可以使用以下命令通过 npm 安装 Broccoli: + +``` +npm install --save-dev broccoli +npm install --global broccoli-cli +``` + +你也可以使用 Yarn 进行安装。 + +当前版本的 Node.js 就是使用该工具的最佳版本,因为它提供了长期支持。它可以帮助你避免进行更新和重新安装过程中的麻烦。安装过程完成后,可以在 `Brocfile.js` 文件中包含构建规范。 + +在 Broccoli 中,抽象单位是“树”,该树将文件和子目录存储在特定子目录中。因此,在构建之前,你必须有一个具体的想法,你希望你的构建是什么样子的。 + +最好的是,Broccoli 带有用于开发的内置服务器,可让你将素材托管在本地 HTTP 服务器上。Broccoli 非常适合流线型重建,因为其简洁的架构和灵活的生态系统可提高重建和编译速度。Broccoli 可让你井井有条,以节省时间并在开发过程中最大限度地提高生产力。 + +### Danger + +[Danger][8] 是一个非常方便的开源工具,用于简化你的拉取请求pull request(PR)检查。正如 Danger 库描述所说,该工具可通过管理 PR 检查来帮助 “正规化” 你的代码审查系统。Danger 可以与你的 CI 集成在一起,帮助你加快审核过程。 + +将 Danger 与你的项目集成是一个简单的逐步过程:你只需要包括 Danger 模块,并为每个项目创建一个 Danger 文件。然而,创建一个 Danger 帐户(通过 GitHub 或 Bitbucket 很容易做到),并且为开源软件项目设置访问令牌更加方便。 + +可以通过 NPM 或 Yarn 安装 Danger。要使用 Yarn,请添加 `danger -D` 到 `package.JSON` 中。 + +将 Danger 添加到 CI 后,你可以: + + * 高亮显示重要的创建工件 + * 通过强制链接到 Trello 和 Jira 之类的工具来管理 sprint + * 强制生成更新日志 + * 使用描述性标签 + * 以及更多 + +例如,你可以设计一个定义团队文化并为代码审查和 PR 检查设定特定规则的系统。根据 Danger 提供的元数据及其广泛的插件生态系统,可以解决常见的议题issue。 + +### Snyk + +网络安全是开发人员的主要关注点。[Snyk][9] 是修复开源组件中漏洞的最著名工具之一。它最初是一个用于修复 Node.js 项目漏洞的项目,并且已经演变为可以检测并修复 Ruby、Java、Python 和 Scala 应用程序中的漏洞。Snyk 主要分四个阶段运行: + + * 查找漏洞依赖性 + * 修复特定漏洞 + * 通过 PR 检查预防安全风险 + * 持续监控应用程序 + +Snyk 可以集成在项目的任何阶段,包括编码、CI/CD 和报告。我发现这对于测试 Node.js 项目非常有帮助,可以测试或构建 npm 软件包时检查是否存在安全风险。你还可以在 GitHub 中为你的应用程序运行 PR 检查,以使你的项目更安全。Synx 还提供了一系列集成,可用于监控依赖关系并解决特定问题。 + +要在本地计算机上运行 Snyk,可以通过 NPM 安装它: + +``` +npm install -g snyk +``` + +### Migrat + +[Migrat][10] 是一款使用纯文本的数据迁移工具,非常易于使用。 它可在各种软件堆栈和进程中工作,从而使其更加实用。你可以使用简单的代码行安装 Migrat: + +``` +$ npm install -g migrat +``` + +Migrat 并不需要特别的数据库引擎。它支持多节点环境,因为迁移可以在一个全局节点上运行,也可以在每个服务器上运行一次。Migrat 之所以方便,是因为它便于向每个迁移传递上下文。 + +你可以定义每个迁移的用途(例如,数据库集、连接、日志接口等)。此外,为了避免随意迁移,即多个服务器在全局范围内进行迁移,Migrat 可以在进程运行时进行全局锁定,从而使其只能在全局范围内运行一次。它还附带了一系列用于 SQL 数据库、Slack、HipChat 和 Datadog 仪表盘的插件。你可以将实时迁移状况发送到这些平台中的任何一个。 + +### Clinic.js + +[Clinic.js][11] 是一个用于 Node.js 项目的开源监视工具。它结合了三种不同的工具 Doctor、Bubbleprof 和 Flame,帮助你监控、检测和解决 Node.js 的性能问题。 + +你可以通过运行以下命令从 npm 安装 Clinic.js: + +``` +$ npm install clinic +``` + +你可以根据要监视项目的某个方面以及要生成的报告,选择要使用的 Clinic.js 包含的三个工具中的一个: + + * Doctor 通过注入探针来提供详细的指标,并就项目的总体运行状况提供建议。 + * Bubbleprof 非常适合分析,并使用 `async_hooks` 生成指标。 + * Flame 非常适合发现代码中的热路径和瓶颈。 + +### PM2 + +监视是后端开发过程中最重要的方面之一。[PM2][12] 是一款 Node.js 的进程管理工具,可帮助开发人员监视项目的多个方面,例如日志、延迟和速度。该工具与 Linux、MacOS 和 Windows 兼容,并支持从 Node.js 8.X 开始的所有 Node.js 版本。 + +你可以使用以下命令通过 npm 安装 PM2: + +``` +$ npm install pm2 --g +``` + +如果尚未安装 Node.js,则可以使用以下命令安装: + +``` +wget -qO- https://getpm2.com/install.sh | bash +``` + +安装完成后,使用以下命令启动应用程序: + +``` +$ pm2 start app.js +``` + +关于 PM2 最好的地方是可以在集群模式下运行应用程序。可以同时为多个 CPU 内核生成一个进程。这样可以轻松增强应用程序性能并最大程度地提高可靠性。PM2 也非常适合更新工作,因为你可以使用 “热重载” 选项更新应用程序并以零停机时间重新加载应用程序。总体而言,它是为 Node.js 应用程序简化进程管理的好工具。 + +### Electrode + +[Electrode][13] 是 Walmart Labs 的一个开源应用程序平台。该平台可帮助你以结构化方式构建大规模通用的 React/Node.js 应用程序。 + +Electrode 应用程序生成器使你可以构建专注于代码的灵活内核,提供一些出色的模块以向应用程序添加复杂功能,并附带了广泛的工具来优化应用程序的 Node.js 包。 + +可以使用 npm 安装 Electrode。安装完成后,你可以使用 Ignite 启动应用程序,并深入研究 Electrode 应用程序生成器。 + +你可以使用 NPM 安装 Electrode: + +``` +npm install -g electrode-ignite xclap-cli +``` + +### 你最喜欢哪一个? + +这些只是不断增长的开源工具列表中的一小部分,在使用 Node.js 时,这些工具可以在不同阶段派上用场。你最喜欢使用哪些开源 Node.js 工具?请在评论中分享你的建议。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/1/open-source-tools-nodejs + +作者:[Hiren Dhadhuk][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hirendhadhuk +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_hardware_purple.png?itok=3NdVoYhl (Tools illustration) +[2]: https://insights.stackoverflow.com/survey/2019#technology-_-other-frameworks-libraries-and-tools +[3]: https://www.simform.com/nodejs-use-case/ +[4]: https://webpack.js.org/ +[5]: https://strapi.io/ +[6]: https://broccoli.build/ +[7]: https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-_ECMAScript_2015 +[8]: https://danger.systems/ +[9]: https://snyk.io/ +[10]: https://github.com/naturalatlas/migrat +[11]: https://clinicjs.org/ +[12]: https://pm2.keymetrics.io/ +[13]: https://www.electrode.io/ diff --git a/published/202103/20200127 Managing processes on Linux with kill and killall.md b/published/202103/20200127 Managing processes on Linux with kill and killall.md new file mode 100644 index 0000000000..1d5e76b80e --- /dev/null +++ b/published/202103/20200127 Managing processes on Linux with kill and killall.md @@ -0,0 +1,152 @@ +[#]: collector: "lujun9972" +[#]: translator: "wyxplus" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13215-1.html" +[#]: subject: "Managing processes on Linux with kill and killall" +[#]: via: "https://opensource.com/article/20/1/linux-kill-killall" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" + +在 Linux 上使用 kill 和 killall 命令来管理进程 +====== + +> 了解如何使用 ps、kill 和 killall 命令来终止进程并回收系统资源。 + +![](https://img.linux.net.cn/data/attachment/album/202103/18/230625q6g65gz6ugdk8ygr.jpg) + +在 Linux 中,每个程序和守护程序daemon都是一个“进程process”。 大多数进程代表一个正在运行的程序。而另外一些程序可以派生出其他进程,比如说它会侦听某些事件的发生,然后对其做出响应。并且每个进程都需要一定的内存和处理能力。你运行的进程越多,所需的内存和 CPU 使用周期就越多。在老式电脑(例如我使用了 7 年的笔记本电脑)或轻量级计算机(例如树莓派)上,如果你关注过后台运行的进程,就能充分利用你的系统。 + +你可以使用 `ps` 命令来查看正在运行的进程。你通常会使用 `ps` 命令的参数来显示出更多的输出信息。我喜欢使用 `-e` 参数来查看每个正在运行的进程,以及 `-f` 参数来获得每个进程的全部细节。以下是一些例子: + +``` +$ ps + PID TTY TIME CMD + 88000 pts/0 00:00:00 bash + 88052 pts/0 00:00:00 ps + 88053 pts/0 00:00:00 head +``` +``` +$ ps -e | head + PID TTY TIME CMD + 1 ? 00:00:50 systemd + 2 ? 00:00:00 kthreadd + 3 ? 00:00:00 rcu_gp + 4 ? 00:00:00 rcu_par_gp + 6 ? 00:00:02 kworker/0:0H-events_highpri + 9 ? 00:00:00 mm_percpu_wq + 10 ? 00:00:01 ksoftirqd/0 + 11 ? 00:00:12 rcu_sched + 12 ? 00:00:00 migration/0 +``` +``` +$ ps -ef | head +UID PID PPID C STIME TTY TIME CMD +root 1 0 0 13:51 ? 00:00:50 /usr/lib/systemd/systemd --switched-root --system --deserialize 36 +root 2 0 0 13:51 ? 00:00:00 [kthreadd] +root 3 2 0 13:51 ? 00:00:00 [rcu_gp] +root 4 2 0 13:51 ? 00:00:00 [rcu_par_gp] +root 6 2 0 13:51 ? 00:00:02 [kworker/0:0H-kblockd] +root 9 2 0 13:51 ? 00:00:00 [mm_percpu_wq] +root 10 2 0 13:51 ? 00:00:01 [ksoftirqd/0] +root 11 2 0 13:51 ? 00:00:12 [rcu_sched] +root 12 2 0 13:51 ? 00:00:00 [migration/0] +``` + +最后的例子显示最多的细节。在每一行,`UID`(用户 ID)显示了该进程的所有者。`PID`(进程 ID)代表每个进程的数字 ID,而 `PPID`(父进程 ID)表示其父进程的数字 ID。在任何 Unix 系统中,进程是从 1 开始编号,是内核启动后运行的第一个进程。在这里,`systemd` 是第一个进程,它催生了 `kthreadd`,而 `kthreadd` 还创建了其他进程,包括 `rcu_gp`、`rcu_par_gp` 等一系列进程。 + +### 使用 kill 命令来管理进程 + +系统会处理大多数后台进程,所以你不需要操心这些进程。你只需要关注那些你所运行的应用创建的进程。虽然许多应用一次只运行一个进程(如音乐播放器、终端模拟器或游戏等),但其他应用则可能创建后台进程。其中一些应用可能当你退出后还在后台运行,以便下次你使用的时候能快速启动。 + +当我运行 Chromium(作为谷歌 Chrome 浏览器所基于的开源项目)时,进程管理便成了问题。 Chromium 在我的笔记本电脑上运行非常吃力,并产生了许多额外的进程。现在我仅打开五个选项卡,就能看到这些 Chromium 进程: + +``` +$ ps -ef | fgrep chromium +jhall 66221 [...] /usr/lib64/chromium-browser/chromium-browser [...] +jhall 66230 [...] /usr/lib64/chromium-browser/chromium-browser [...] +[...] +jhall 66861 [...] /usr/lib64/chromium-browser/chromium-browser [...] +jhall 67329 65132 0 15:45 pts/0 00:00:00 grep -F chromium +``` + +我已经省略一些行,其中有 20 个 Chromium 进程和一个正在搜索 “chromium" 字符的 `grep` 进程。 + +``` +$ ps -ef | fgrep chromium | wc -l +21 +``` + +但是在我退出 Chromium 之后,这些进程仍旧运行。如何关闭它们并回收这些进程占用的内存和 CPU 呢? + +`kill` 命令能让你终止一个进程。在最简单的情况下,你告诉 `kill` 命令终止你想终止的进程的 PID。例如,要终止这些进程,我需要对 20 个 Chromium 进程 ID 都执行 `kill` 命令。一种方法是使用命令行获取 Chromium 的 PID,而另一种方法针对该列表运行 `kill`: + + +``` +$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}' +66221 +66230 +66239 +66257 +66262 +66283 +66284 +66285 +66324 +66337 +66360 +66370 +66386 +66402 +66503 +66539 +66595 +66734 +66848 +66861 +69702 + +$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}' > /tmp/pids +$ kill $(cat /tmp/pids) +``` + +最后两行是关键。第一个命令行为 Chromium 浏览器生成一个进程 ID 列表。第二个命令行针对该进程 ID 列表运行 `kill` 命令。 + +### 介绍 killall 命令 + +一次终止多个进程有个更简单方法,使用 `killall` 命令。你或许可以根据名称猜测出,`killall` 会终止所有与该名字匹配的进程。这意味着我们可以使用此命令来停止所有流氓 Chromium 进程。这很简单: + +``` +$ killall /usr/lib64/chromium-browser/chromium-browser +``` + +但是要小心使用 `killall`。该命令能够终止与你所给出名称相匹配的所有进程。这就是为什么我喜欢先使用 `ps -ef` 命令来检查我正在运行的进程,然后针对要停止的命令的准确路径运行 `killall`。 + +你也可以使用 `-i` 或 `--interactive` 参数,来让 `killkill` 在停止每个进程之前提示你。 + +`killall` 还支持使用 `-o` 或 `--older-than` 参数来查找比特定时间更早的进程。例如,如果你发现了一组已经运行了好几天的恶意进程,这将会很有帮助。又或是,你可以查找比特定时间更晚的进程,例如你最近启动的失控进程。使用 `-y` 或 `--young-than` 参数来查找这些进程。 + +### 其他管理进程的方式 + +进程管理是系统维护重要的一部分。在我作为 Unix 和 Linux 系统管理员的早期职业生涯中,杀死非法作业的能力是保持系统正常运行的关键。在如今,你可能不需要亲手在 Linux 上的终止流氓进程,但是知道 `kill` 和 `killall` 能够在最终出现问题时为你提供帮助。 + +你也能寻找其他方式来管理进程。在我这个案例中,我并不需要在我退出浏览器后,使用 `kill` 或 `killall` 来终止后台 Chromium 进程。在 Chromium 中有个简单设置就可以进行控制: + +![Chromium background processes setting][2] + +不过,始终关注系统上正在运行哪些进程,并且在需要的时候进行干预是一个明智之举。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/1/linux-kill-killall + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_penguin_green.png?itok=ENdVzW22 "Penguin with green background" +[2]: https://opensource.com/sites/default/files/uploads/chromium-settings-continue-running.png "Chromium background processes setting" diff --git a/published/202103/20200129 Ansible Playbooks Quick Start Guide with Examples.md b/published/202103/20200129 Ansible Playbooks Quick Start Guide with Examples.md new file mode 100644 index 0000000000..bf14ca23c7 --- /dev/null +++ b/published/202103/20200129 Ansible Playbooks Quick Start Guide with Examples.md @@ -0,0 +1,341 @@ +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13167-1.html" +[#]: subject: "Ansible Playbooks Quick Start Guide with Examples" +[#]: via: "https://www.2daygeek.com/ansible-playbooks-quick-start-guide-with-examples/" +[#]: author: "Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/" + +Ansible 剧本快速入门指南 +====== + +我们已经写了两篇关于 Ansible 的文章,这是第三篇。 + +如果你是 Ansible 新手,我建议你阅读下面这两篇文章,它会教你一些 Ansible 的基础以及它是什么。 + + * 第一篇: [Ansible 自动化工具安装、配置和快速入门指南][1] + * 第二篇: [Ansible 点对点命令快速入门指南示例][2] + +如果你已经阅读过了,那么在阅读本文时你才不会感到突兀。 + +### 什么是 Ansible 剧本? + +剧本playbook比点对点命令模式更强大,而且完全不同。 + +它使用了 `/usr/bin/ansible-playbook` 二进制文件,并且提供丰富的特性使得复杂的任务变得更容易。 + +如果你想经常运行一个任务,剧本是非常有用的。此外,如果你想在服务器组上执行多个任务,它也是非常有用的。 + +剧本是由 YAML 语言编写。YAML 代表一种标记语言,它比其它常见的数据格式(如 XML 或 JSON)更容易读写。 + +下面这张 Ansible 剧本流程图将告诉你它的详细结构。 + +![][3] + +### 理解 Ansible 剧本的术语 + + * 控制节点Control node:Ansible 安装的机器,它负责管理客户端节点。 + * 受控节点Managed node:控制节点管理的主机列表。 + * 剧本playbook:一个剧本文件包含一组自动化任务。 + * 主机清单Inventory:这个文件包含有关管理的服务器的信息。 + * 任务Task:每个剧本都有大量的任务。任务在指定机器上依次执行(一个主机或多个主机)。 + * 模块Module: 模块是一个代码单元,用于从客户端节点收集信息。 + * 角色Role:角色是根据已知文件结构自动加载一些变量文件、任务和处理程序的方法。 + * 动作Play:每个剧本含有大量的动作,一个动作从头到尾执行一个特定的自动化。 + * 处理程序Handler: 它可以帮助你减少在剧本中的重启任务。处理程序任务列表实际上与常规任务没有什么不同,更改由通知程序通知。如果处理程序没有收到任何通知,它将不起作用。 + +### 基本的剧本是怎样的? + +下面是一个剧本的模板: + +``` +--- [YAML 文件应该以三个破折号开头] +- name: [脚本描述] + hosts: group [添加主机或主机组] + become: true [如果你想以 root 身份运行任务,则标记它] + tasks: [你想在任务下执行什么动作] + - name: [输入模块选项] + module: [输入要执行的模块] + module_options-1: value [输入模块选项] + module_options-2: value + . + module_options-N: value +``` + +### 如何理解 Ansible 的输出 + +Ansible 剧本的输出有四种颜色,下面是具体含义: + + * **绿色**:`ok` 代表成功,关联的任务数据已经存在,并且已经根据需要进行了配置。 + * **黄色**:`changed` 指定的数据已经根据任务的需要更新或修改。 + * **红色**:`FAILED` 如果在执行任务时出现任何问题,它将返回一个失败消息,它可能是任何东西,你需要相应地修复它。 + * **白色**:表示有多个参数。 + +为此,创建一个剧本目录,将它们都放在同一个地方。 + +``` +$ sudo mkdir /etc/ansible/playbooks +``` + +### 剧本-1:在 RHEL 系统上安装 Apache Web 服务器 + +这个示例剧本允许你在指定的目标机器上安装 Apache Web 服务器: + +``` +$ sudo nano /etc/ansible/playbooks/apache.yml + +--- +- hosts: web + become: yes + name: "Install and Configure Apache Web server" + tasks: + - name: "Install Apache Web Server" + yum: + name: httpd + state: latest + - name: "Ensure Apache Web Server is Running" + service: + name: httpd + state: started +``` + +``` +$ ansible-playbook apache1.yml +``` + +![][3] + +### 如何理解 Ansible 中剧本的执行 + +使用以下命令来查看语法错误。如果没有发现错误,它只显示剧本文件名。如果它检测到任何错误,你将得到一个如下所示的错误,但内容可能根据你的输入文件而有所不同。 + +``` +$ ansible-playbook apache1.yml --syntax-check + +ERROR! Syntax Error while loading YAML. + found a tab character that violate indentation +The error appears to be in '/etc/ansible/playbooks/apache1.yml': line 10, column 1, but may +be elsewhere in the file depending on the exact syntax problem. +The offending line appears to be: + state: latest +^ here +There appears to be a tab character at the start of the line. + +YAML does not use tabs for formatting. Tabs should be replaced with spaces. +For example: + - name: update tooling + vars: + version: 1.2.3 +# ^--- there is a tab there. +Should be written as: + - name: update tooling + vars: + version: 1.2.3 +# ^--- all spaces here. +``` + +或者,你可以使用这个 URL [YAML Lint][4] 在线检查 Ansible 剧本内容。 + +执行以下命令进行“演练”。当你运行带有 `--check` 选项的剧本时,它不会对远程机器进行任何修改。相反,它会告诉你它将要做什么改变但不是真的执行。 + +``` +$ ansible-playbook apache.yml --check + +PLAY [Install and Configure Apache Webserver] ******************************************************************** + +TASK [Gathering Facts] ******************************************************************************************* +ok: [node2.2g.lab] +ok: [node1.2g.lab] + +TASK [Install Apache Web Server] ********************************************************************************* +changed: [node2.2g.lab] +changed: [node1.2g.lab] + +TASK [Ensure Apache Web Server is Running] *********************************************************************** +changed: [node1.2g.lab] +changed: [node2.2g.lab] + +PLAY RECAP ******************************************************************************************************* +node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +如果你想要知道 ansible 剧本实现的详细信息,使用 `-vv` 选项,它会展示如何收集这些信息。 + +``` +$ ansible-playbook apache.yml --check -vv + +ansible-playbook 2.9.2 + config file = /etc/ansible/ansible.cfg + configured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] + ansible python module location = /usr/lib/python3.8/site-packages/ansible + executable location = /usr/bin/ansible-playbook + python version = 3.8.1 (default, Jan 8 2020, 23:09:20) [GCC 9.2.0] +Using /etc/ansible/ansible.cfg as config file + +PLAYBOOK: apache.yml ***************************************************************************************************** +1 plays in apache.yml + +PLAY [Install and Configure Apache Webserver] **************************************************************************** + +TASK [Gathering Facts] *************************************************************************************************** +task path: /etc/ansible/playbooks/apache.yml:2 +ok: [node2.2g.lab] +ok: [node1.2g.lab] +META: ran handlers + +TASK [Install Apache Web Server] ***************************************************************************************** +task path: /etc/ansible/playbooks/apache.yml:6 +changed: [node2.2g.lab] => {"changed": true, "msg": "Check mode: No changes made, but would have if not in check mod +e", "rc": 0, "results": ["Installed: httpd"]} +changed: [node1.2g.lab] => {"changed": true, "changes": {"installed": ["httpd"], "updated": []}, "msg": "", "obsolet +es": {"urw-fonts": {"dist": "noarch", "repo": "@anaconda", "version": "2.4-16.el7"}}, "rc": 0, "results": []} + +TASK [Ensure Apache Web Server is Running] ******************************************************************************* +task path: /etc/ansible/playbooks/apache.yml:10 +changed: [node1.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"} +changed: [node2.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"} +META: ran handlers +META: ran handlers + +PLAY RECAP *************************************************************************************************************** +node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +### 剧本-2:在 Ubuntu 系统上安装 Apache Web 服务器 + +这个示例剧本允许你在指定的目标节点上安装 Apache Web 服务器。 + +``` +$ sudo nano /etc/ansible/playbooks/apache-ubuntu.yml + +--- +- hosts: web + become: yes + name: "Install and Configure Apache Web Server" + tasks: + - name: "Install Apache Web Server" + yum: + name: apache2 + state: latest + + - name: "Start the Apache Web Server" + service: + name: apaceh2 + state: started + + - name: "Enable mod_rewrite module" + apache2_module: + name: rewrite + state: present + + notify: + - start apache + + handlers: + - name: "Ensure Apache Web Server is Running" + service: + name: apache2 + state: restarted + enabled: yes +``` + +### 剧本-3:在 Red Hat 系统上安装软件包列表 + +这个示例剧本允许你在指定的目标节点上安装软件包。 + +**方法-1:** + +``` +$ sudo nano /etc/ansible/playbooks/packages-redhat.yml + +--- +- hosts: web + become: yes + name: "Install a List of Packages on Red Hat Based System" + tasks: + - name: "Installing a list of packages" + yum: + name: + - curl + - httpd + - nano + - htop +``` + +**方法-2:** + +``` +$ sudo nano /etc/ansible/playbooks/packages-redhat-1.yml + +--- +- hosts: web + become: yes + name: "Install a List of Packages on Red Hat Based System" + tasks: + - name: "Installing a list of packages" + yum: name={{ item }} state=latest + with_items: + - curl + - httpd + - nano + - htop +``` + +**方法-3:使用数组变量** + +``` +$ sudo nano /etc/ansible/playbooks/packages-redhat-2.yml + +--- +- hosts: web + become: yes + name: "Install a List of Packages on Red Hat Based System" + vars: + packages: [ 'curl', 'git', 'htop' ] + tasks: + - name: Install a list of packages + yum: name={{ item }} state=latest + with_items: "{{ packages }}" +``` + +### 剧本-4:在 Linux 系统上安装更新 + +这个示例剧本允许你在基于 Red Hat 或 Debian 的 Linux 系统上安装更新。 + +``` +$ sudo nano /etc/ansible/playbooks/security-update.yml + +--- +- hosts: web + become: yes + name: "Install Security Update" + tasks: + - name: "Installing Security Update on Red Hat Based System" + yum: name=* update_cache=yes security=yes state=latest + when: ansible_facts['distribution'] == "CentOS" + + - name: "Installing Security Update on Ubuntu Based System" + apt: upgrade=dist update_cache=yes + when: ansible_facts['distribution'] == "Ubuntu" +``` + +-------------------------------------------------------------------------------- + +via: https://www.2daygeek.com/ansible-playbooks-quick-start-guide-with-examples/ + +作者:[Magesh Maruthamuthu][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.2daygeek.com/author/magesh/ +[b]: https://github.com/lujun9972 +[1]: https://linux.cn/article-13142-1.html +[2]: https://linux.cn/article-13163-1.html +[3]: https://www.2daygeek.com/wp-content/uploads/2020/01/ansible-playbook-structure-flow-chart-explained.png +[4]: http://www.yamllint.com/ diff --git a/published/202103/20200219 Multicloud, security integration drive massive SD-WAN adoption.md b/published/202103/20200219 Multicloud, security integration drive massive SD-WAN adoption.md new file mode 100644 index 0000000000..42239ba15a --- /dev/null +++ b/published/202103/20200219 Multicloud, security integration drive massive SD-WAN adoption.md @@ -0,0 +1,74 @@ +[#]: collector: (lujun9972) +[#]: translator: (cooljelly) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13239-1.html) +[#]: subject: (Multicloud, security integration drive massive SD-WAN adoption) +[#]: via: (https://www.networkworld.com/article/3527194/multicloud-security-integration-drive-massive-sd-wan-adoption.html) +[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) + +多云融合和安全集成推动 SD-WAN 的大规模应用 +====== + +> 2022 年 SD-WAN 市场 40% 的同比增长主要来自于包括 Cisco、VMWare、Juniper 和 Arista 在内的网络供应商和包括 AWS、Microsoft Azure,Google Anthos 和 IBM RedHat 在内的服务提供商之间的紧密联系。 + +![](https://img.linux.net.cn/data/attachment/album/202103/27/095154f0625f3k8455800x.jpg) + +越来越多的云应用,以及越来越完善的网络安全性、可视化特性和可管理性,正以惊人的速度推动企业软件定义广域网software-defined WAN([SD-WAN][3])的部署。 + +IDC(LCTT 译注:International Data Corporation)公司的网络基础架构副总裁 Rohit Mehra 表示,根据 IDC 的研究,过去一年中,特别是软件和基础设施即服务(SaaS 和 IaaS)产品推动了 SD-WAN 的实施。 + +例如,IDC 表示,根据其最近的客户调查结果,有 95% 的客户将在两年内使用 [SD-WAN][7] 技术,而 42% 的客户已经部署了它。IDC 还表示,到 2022 年,SD-WAN 基础设施市场将达到 45 亿美元,此后每年将以每年 40% 的速度增长。 + +“SD-WAN 的增长是一个广泛的趋势,很大程度上是由企业希望优化远程站点的云连接性的需求推动的。” Mehra 说。 + +思科最近撰文称,多云网络的发展正在促使许多企业改组其网络,以更好地使用 SD-WAN 技术。SD-WAN 对于采用云服务的企业至关重要,它是园区网、分支机构、[物联网][8]、[数据中心][9] 和云之间的连接中间件。思科公司表示,根据调查,平均每个思科的企业客户有 30 个付费的 SaaS 应用程序,而他们实际使用的 SaaS 应用会更多——在某些情况下甚至超过 100 种。 + +这种趋势的部分原因是由网络供应商(例如 Cisco、VMware、Juniper、Arista 等)(LCTT 译注:这里的网络供应商指的是提供硬件或软件并可按需组网的厂商)与服务提供商(例如 Amazon AWS、Microsoft Azure、Google Anthos 和 IBM RedHat 等)建立的关系推动的。 + +去年 12 月,AWS 为其云产品发布了关键服务,其中包括诸如 [AWS Transit Gateway][10] 等新集成技术的关键服务,这标志着 SD-WAN 与多云场景关系的日益重要。使用 AWS Transit Gateway 技术,客户可以将 AWS 中的 VPC(虚拟私有云Virtual Private Cloud)和其自有网络均连接到相同的网关。Aruba、Aviatrix Cisco、Citrix Systems、Silver Peak 和 Versa 已经宣布支持该技术,这将简化和增强这些公司的 SD-WAN 产品与 AWS 云服务的集成服务的性能和表现。 + +Mehra 说,展望未来,对云应用的友好兼容和完善的性能监控等增值功能将是 SD-WAN 部署的关键部分。 + +随着 SD-WAN 与云的关系不断发展,SD-WAN 对集成安全功能的需求也在不断增长。 + +Mehra 说,SD-WAN 产品集成安全性的方式比以往单独打包的广域网安全软件或服务要好得多。SD-WAN 是一个更加敏捷的安全环境。SD-WAN 公认的主要组成部分包括安全功能,数据分析功能和广域网优化功能等,其中安全功能则是下一代 SD-WAN 解决方案的首要需求。 + +Mehra 说,企业将越来越少地关注仅解决某个具体问题的 SD-WAN 解决方案,而将青睐于能够解决更广泛的网络管理和安全需求的 SD-WAN 平台。他们将寻找可以与他们的 IT 基础设施(包括企业数据中心网络、企业园区局域网、[公有云][12] 资源等)集成更紧密的 SD-WAN 平台。他说,企业将寻求无缝融合的安全服务,并希望有其他各种功能的支持,例如可视化、数据分析和统一通信功能。 + +“随着客户不断将其基础设施与软件集成在一起,他们可以做更多的事情,例如根据其局域网和广域网上的用户、设备或应用程序的需求,实现一致的管理和安全策略,并最终获得更好的整体使用体验。” Mehra 说。 + +一个新兴趋势是 SD-WAN 产品包需要支持 [SD-branch][13] 技术。 Mehra 说,超过 70% 的 IDC 受调查客户希望在明年使用 SD-Branch。在最近几周,[Juniper][14] 和 [Aruba][15] 公司已经优化了 SD-branch 产品,这一趋势预计将在今年持续下去。 + +SD-Branch 技术建立在 SD-WAN 的概念和支持的基础上,但更专注于满足分支机构中局域网的组网和管理需求。展望未来,SD-Branch 如何与其他技术集成,例如数据分析、音视频、统一通信等,将成为该技术的主要驱动力。 + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3527194/multicloud-security-integration-drive-massive-sd-wan-adoption.html + +作者:[Michael Cooney][a] +选题:[lujun9972][b] +译者:[cooljelly](https://github.com/cooljelly) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Michael-Cooney/ +[b]: https://github.com/lujun9972 +[1]: https://images.idgesg.net/images/article/2018/07/branches_branching_trees_bare_black_and_white_by_gratisography_cc0_via_pexels_1200x800-100763250-large.jpg +[2]: https://creativecommons.org/publicdomain/zero/1.0/ +[3]: https://www.networkworld.com/article/3031279/sd-wan-what-it-is-and-why-you-ll-use-it-one-day.html +[4]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html +[5]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html +[6]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html +[7]: https://www.networkworld.com/article/3489938/what-s-hot-at-the-edge-for-2020-everything.html +[8]: https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html +[9]: https://www.networkworld.com/article/3223692/what-is-a-data-centerhow-its-changed-and-what-you-need-to-know.html +[10]: https://aws.amazon.com/transit-gateway/ +[11]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage) +[12]: https://www.networkworld.com/article/2159885/cloud-computing-gartner-5-things-a-private-cloud-is-not.html +[13]: https://www.networkworld.com/article/3250664/sd-branch-what-it-is-and-why-youll-need-it.html +[14]: https://www.networkworld.com/article/3487801/juniper-broadens-sd-branch-management-switch-options.html +[15]: https://www.networkworld.com/article/3513357/aruba-reinforces-sd-branch-with-security-management-upgrades.html +[16]: https://www.facebook.com/NetworkWorld/ +[17]: https://www.linkedin.com/company/network-world diff --git a/published/202103/20200410 Get started with Bash programming.md b/published/202103/20200410 Get started with Bash programming.md new file mode 100644 index 0000000000..84b9aeca70 --- /dev/null +++ b/published/202103/20200410 Get started with Bash programming.md @@ -0,0 +1,148 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13210-1.html) +[#]: subject: (Get started with Bash programming) +[#]: via: (https://opensource.com/article/20/4/bash-programming-guide) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +如何入门 Bash 编程 +====== + +> 了解如何在 Bash 中编写定制程序以自动执行重复性操作任务。 + +![](https://img.linux.net.cn/data/attachment/album/202103/17/110745ctcuzcnt0dv0toi7.jpg) + +Unix 最初的希望之一是,让计算机的日常用户能够微调其计算机,以适应其独特的工作风格。几十年来,人们对计算机定制的期望已经降低,许多用户认为他们的应用程序和网站的集合就是他们的 “定制环境”。原因之一是许多操作系统的组件未不开源,普通用户无法使用其源代码。 + +但是对于 Linux 用户而言,定制程序是可以实现的,因为整个系统都围绕着可通过终端使用的命令啦进行的。终端不仅是用于快速命令或深入排除故障的界面;也是一个脚本环境,可以通过为你处理日常任务来减少你的工作量。 + +### 如何学习编程 + +如果你以前从未进行过任何编程,可能面临考虑两个不同的挑战:一个是了解怎样编写代码,另一个是了解要编写什么代码。你可以学习 _语法_,但是如果你不知道 _语言_ 中有哪些可用的关键字,你将无法继续。在实践中,要同时开始学习这两个概念,是因为如果没有关键字的堆砌就无法学习语法,因此,最初你要使用基本命令和基本编程结构来编写简单的任务。一旦熟悉了基础知识,就可以探索更多编程语言的内容,从而使你的程序能够做越来越重要的事情。 + +在 [Bash][2] 中,你使用的大多数 _关键字_ 是 Linux 命令。 _语法_ 就是 Bash。如果你已经频繁地使用过了 Bash,则向 Bash 编程的过渡相对容易。但是,如果你不曾使用过 Bash,你会很高兴地了解到它是一种为清晰和简单而构建的简单语言。 + +### 交互设计 + +有时,学习编程时最难搞清楚的事情就是计算机可以为你做些什么。显然,如果一台计算机可以自己完成你要做的所有操作,那么你就不必再碰计算机了。但是现实是,人类很重要。找到你的计算机可以帮助你的事情的关键是注意到你一周内需要重复执行的任务。计算机特别擅长于重复的任务。 + +但是,为了能告知计算机为你做某事,你必须知道怎么做。这就是 Bash 擅长的领域:交互式编程。在终端中执行一个动作时,你也在学习如何编写脚本。 + +例如,我曾经负责将大量 PDF 书籍转换为低墨和友好打印的版本。一种方法是在 PDF 编辑器中打开 PDF,从数百张图像(页面背景和纹理都算作图像)中选择每张图像,删除它们,然后将其保存到新的 PDF中。仅仅是一本书,这样就需要半天时间。 + +我的第一个想法是学习如何编写 PDF 编辑器脚本,但是经过数天的研究,我找不到可以编写编辑 PDF 应用程序的脚本(除了非常丑陋的鼠标自动化技巧)。因此,我将注意力转向了从终端内找出完成任务的方法。这让我有了几个新发现,包括 GhostScript,它是 PostScript 的开源版本(PDF 基于的打印机语言)。通过使用 GhostScript 处理了几天的任务,我确认这是解决我的问题的方法。 + +编写基本的脚本来运行命令,只不过是复制我用来从 PDF 中删除图像的命令和选项,并将其粘贴到文本文件中而已。将这个文件作为脚本运行,大概也会产生同样的结果。 + +### 向 Bash 脚本传参数 + +在终端中运行命令与在 Shell 脚本中运行命令之间的区别在于前者是交互式的。在终端中,你可以随时进行调整。例如,如果我刚刚处理 `example_1.pdf` 并准备处理下一个文档,以适应我的命令,则只需要更改文件名即可。 + +Shell 脚本不是交互式的。实际上,Shell _脚本_ 存在的唯一原因是让你不必亲自参与。这就是为什么命令(以及运行它们的 Shell 脚本)会接受参数的原因。 + +在 Shell 脚本中,有一些预定义的可以反映脚本启动方式的变量。初始变量是 `$0`,它代表了启动脚本的命令。下一个变量是 `$1` ,它表示传递给 Shell 脚本的第一个 “参数”。例如,在命令 `echo hello` 中,命令 `echo` 为 `$0,`,关键字 `hello` 为 `$1`,而 `world` 是 `$2`。 + +在 Shell 中交互如下所示: + +``` +$ echo hello world +hello world +``` + +在非交互式 Shell 脚本中,你 _可以_ 以非常直观的方式执行相同的操作。将此文本输入文本文件并将其另存为 `hello.sh`: + +``` +echo hello world +``` + +执行这个脚本: + +``` +$ bash hello.sh +hello world +``` + +同样可以,但是并没有利用脚本可以接受输入这一优势。将 `hello.sh` 更改为: + +``` +echo $1 +``` + +用引号将两个参数组合在一起来运行脚本: + +``` +$ bash hello.sh "hello bash" +hello bash +``` + +对于我的 PDF 瘦身项目,我真的需要这种非交互性,因为每个 PDF 都花了几分钟来压缩。但是通过创建一个接受我的输入的脚本,我可以一次将几个 PDF 文件全部提交给脚本。该脚本按顺序处理了每个文件,这可能需要半小时或稍长一点时间,但是我可以用半小时来完成其他任务。 + +### 流程控制 + +创建 Bash 脚本是完全可以接受的,从本质上讲,这些脚本是你开始实现需要重复执行任务的准确过程的副本。但是,可以通过控制信息流的方式来使脚本更强大。管理脚本对数据响应的常用方法是: + + * `if`/`then` 选择结构语句 + * `for` 循环结构语句 + * `while` 循环结构语句 + * `case` 语句 + +计算机不是智能的,但是它们擅长比较和分析数据。如果你在脚本中构建一些数据分析,则脚本会变得更加智能。例如,基本的 `hello.sh` 脚本运行后不管有没有内容都会显示: + +``` +$ bash hello.sh foo +foo +$ bash hello.sh + +$ +``` + +如果在没有接收输入的情况下提供帮助消息,将会更加容易使用。如下是一个 `if`/`then` 语句,如果你以一种基本的方式使用 Bash,则你可能不知道 Bash 中存在这样的语句。但是编程的一部分是学习语言,通过一些研究,你将了解 `if/then` 语句: + +``` +if [ "$1" = "" ]; then +        echo "syntax: $0 WORD" +        echo "If you provide more than one word, enclose them in quotes." +else +        echo "$1" +fi +``` + +运行新版本的 `hello.sh` 输出如下: + +``` +$ bash hello.sh +syntax: hello.sh WORD +If you provide more than one word, enclose them in quotes. +$ bash hello.sh "hello world" +hello world +``` + +### 利用脚本工作 + +无论你是从 PDF 文件中查找要删除的图像,还是要管理混乱的下载文件夹,抑或要创建和提供 Kubernetes 镜像,学习编写 Bash 脚本都需要先使用 Bash,然后学习如何将这些脚本从仅仅是一个命令列表变成响应输入的东西。通常这是一个发现的过程:你一定会找到新的 Linux 命令来执行你从未想象过可以通过文本命令执行的任务,你会发现 Bash 的新功能,使你的脚本可以适应所有你希望它们运行的不同方式。 + +学习这些技巧的一种方法是阅读其他人的脚本。了解人们如何在其系统上自动化死板的命令。看看你熟悉的,并寻找那些陌生事物的更多信息。 + +另一种方法是下载我们的 [Bash 编程入门][3] 电子书。它向你介绍了特定于 Bash 的编程概念,并且通过学习的构造,你可以开始构建自己的命令。当然,它是免费的,并根据 [创作共用许可证][4] 进行下载和分发授权,所以今天就来获取它吧。 + +- [下载我们介绍用 Bash 编程的电子书!][3] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/bash-programming-guide + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt) +[2]: https://opensource.com/resources/what-bash +[3]: https://opensource.com/downloads/bash-programming-guide +[4]: https://opensource.com/article/20/1/what-creative-commons diff --git a/published/202103/20200415 How to automate your cryptocurrency trades with Python.md b/published/202103/20200415 How to automate your cryptocurrency trades with Python.md new file mode 100644 index 0000000000..f310476575 --- /dev/null +++ b/published/202103/20200415 How to automate your cryptocurrency trades with Python.md @@ -0,0 +1,414 @@ +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13242-1.html) +[#]: subject: (How to automate your cryptocurrency trades with Python) +[#]: via: (https://opensource.com/article/20/4/python-crypto-trading-bot) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) + + +如何使用 Python 来自动交易加密货币 +====== + +> 在本教程中,教你如何设置和使用 Pythonic 来编程。它是一个图形化编程工具,用户可以很容易地使用现成的函数模块创建 Python 程序。 + +![](https://img.linux.net.cn/data/attachment/album/202103/28/093858qu0bh3w2sd3rh20s.jpg) + +然而,不像纽约证券交易所这样的传统证券交易所一样,有一段固定的交易时间。对于加密货币而言,则是 7×24 小时交易,这使得任何人都无法独自盯着市场。 + +在以前,我经常思考与加密货币交易相关的问题: + +- 一夜之间发生了什么? +- 为什么没有日志记录? +- 为什么下单? +- 为什么不下单? + +通常的解决手段是使用加密交易机器人,当在你做其他事情时,例如睡觉、与家人在一起或享受空闲时光,代替你下单。虽然有很多商业解决方案可用,但是我选择开源的解决方案,因此我编写了加密交易机器人 [Pythonic][2]。 正如去年 [我写过的文章][3] 一样,“Pythonic 是一种图形化编程工具,它让用户可以轻松使用现成的函数模块来创建 Python 应用程序。” 最初它是作为加密货币机器人使用,并具有可扩展的日志记录引擎以及经过精心测试的可重用部件,例如调度器和计时器。 + +### 开始 + +本教程将教你如何开始使用 Pythonic 进行自动交易。我选择 [币安][6]Binance 交易所的 [波场][4]Tron[比特币][3]Bitcoin 交易对为例。我之所以选择这个加密货币对,是因为它们彼此之间的波动性大,而不是出于个人喜好。 + +机器人将根据 [指数移动平均][7]exponential moving averages (EMA)来做出决策。 + +![TRX/BTC 1-hour candle chart][8] + +*TRX/BTC 1 小时 K 线图* + +EMA 指标通常是一个加权的移动平均线,可以对近期价格数据赋予更多权重。尽管移动平均线可能只是一个简单的指标,但我对它很有经验。 + +上图中的紫色线显示了 EMA-25 指标(这表示要考虑最近的 25 个值)。 + +机器人监视当前的 EMA-25 值(t0)和前一个 EMA-25 值(t-1)之间的差距。如果差值超过某个值,则表示价格上涨,机器人将下达购买订单。如果差值低于某个值,则机器人将下达卖单。 + +差值将是做出交易决策的主要指标。在本教程中,它称为交易参数。 + +### 工具链 + +将在本教程使用如下工具: + +- 币安专业交易视图(已经有其他人做了数据可视化,所以不需要重复造轮子) +- Jupyter 笔记本:用于数据科学任务 +- Pythonic:作为整体框架 +- PythonicDaemon :作为终端运行(仅适用于控制台和 Linux) + +### 数据挖掘 + +为了使加密货币交易机器人尽可能做出正确的决定,以可靠的方式获取资产的美国线open-high-low-close chart([OHLC][9])数据是至关重要。你可以使用 Pythonic 的内置元素,还可以根据自己逻辑来对其进行扩展。 + +一般的工作流程: + +1. 与币安时间同步 +2. 下载 OHLC 数据 +3. 从文件中把 OHLC 数据加载到内存 +4. 比较数据集并扩展更新数据集 + +这个工作流程可能有点夸张,但是它能使得程序更加健壮,甚至在停机和断开连接时,也能平稳运行。 + +一开始,你需要 **币安 OHLC 查询**Binance OHLC Query 元素和一个 **基础操作**Basic Operation 元素来执行你的代码。 + +![Data-mining workflow][10] + +*数据挖掘工作流程* + +OHLC 查询设置为每隔一小时查询一次 **TRXBTC** 资产对(波场/比特币)。 + +![Configuration of the OHLC query element][11] + +*配置 OHLC 查询元素* + +其中输出的元素是 [Pandas DataFrame][12]。你可以在 **基础操作** 元素中使用 **输入**input 变量来访问 DataFrame。其中,将 Vim 设置为 **基础操作** 元素的默认代码编辑器。 + +![Basic Operation element set up to use Vim][13] + +*使用 Vim 编辑基础操作元素* + +具体代码如下: + +``` +import pickle, pathlib, os +import pandas as pd + +outout = None + +if isinstance(input, pd.DataFrame): + file_name = 'TRXBTC_1h.bin' + home_path = str(pathlib.Path.home()) + data_path = os.path.join(home_path, file_name) + + try: + df = pickle.load(open(data_path, 'rb')) + n_row_cnt = df.shape[0] + df = pd.concat([df,input], ignore_index=True).drop_duplicates(['close_time']) + df.reset_index(drop=True, inplace=True) + n_new_rows = df.shape[0] - n_row_cnt + log_txt = '{}: {} new rows written'.format(file_name, n_new_rows) + except: + log_txt = 'File error - writing new one: {}'.format(e) + df = input + + pickle.dump(df, open(data_path, "wb" )) + output = df +``` + +首先,检查输入是否为 DataFrame 元素。然后在用户的家目录(`~/`)中查找名为 `TRXBTC_1h.bin` 的文件。如果存在,则将其打开,执行新代码段(`try` 部分中的代码),并删除重复项。如果文件不存在,则触发异常并执行 `except` 部分中的代码,创建一个新文件。 + +只要启用了复选框 **日志输出**log output,你就可以使用命令行工具 `tail` 查看日志记录: + + +``` +$ tail -f ~/Pythonic_2020/Feb/log_2020_02_19.txt +``` + +出于开发目的,现在跳过与币安时间的同步和计划执行,这将在下面实现。 + +### 准备数据 + +下一步是在单独的 网格Grid 中处理评估逻辑。因此,你必须借助**返回元素**Return element 将 DataFrame 从网格 1 传递到网格 2 的第一个元素。 + +在网格 2 中,通过使 DataFrame 通过 **基础技术分析**Basic Technical Analysis 元素,将 DataFrame 扩展包含 EMA 值的一列。 + +![Technical analysis workflow in Grid 2][14] + +*在网格 2 中技术分析工作流程* + +配置技术分析元素以计算 25 个值的 EMA。 + +![Configuration of the technical analysis element][15] + +*配置技术分析元素* + +当你运行整个程序并开启 **技术分析**Technical Analysis 元素的调试输出时,你将发现 EMA-25 列的值似乎都相同。 + +![Missing decimal places in output][16] + +*输出中精度不够* + +这是因为调试输出中的 EMA-25 值仅包含六位小数,即使输出保留了 8 个字节完整精度的浮点值。 + +为了能进行进一步处理,请添加 **基础操作** 元素: + +![Workflow in Grid 2][17] + +*网格 2 中的工作流程* + +使用 **基础操作** 元素,将 DataFrame 与添加的 EMA-25 列一起转储,以便可以将其加载到 Jupyter 笔记本中; + +![Dump extended DataFrame to file][18] + +*将扩展后的 DataFrame 存储到文件中* + +### 评估策略 + +在 Juypter 笔记本中开发评估策略,让你可以更直接地访问代码。要加载 DataFrame,你需要使用如下代码: + +![Representation with all decimal places][19] + +*用全部小数位表示* + +你可以使用 [iloc][20] 和列名来访问最新的 EMA-25 值,并且会保留所有小数位。 + +你已经知道如何来获得最新的数据。上面示例的最后一行仅显示该值。为了能将该值拷贝到不同的变量中,你必须使用如下图所示的 `.at` 方法方能成功。 + +你也可以直接计算出你下一步所需的交易参数。 + +![Buy/sell decision][21] + +*买卖决策* + +### 确定交易参数 + +如上面代码所示,我选择 0.009 作为交易参数。但是我怎么知道 0.009 是决定交易的一个好参数呢? 实际上,这个参数确实很糟糕,因此,你可以直接计算出表现最佳的交易参数。 + +假设你将根据收盘价进行买卖。 + +![Validation function][22] + +*回测功能* + +在此示例中,`buy_factor` 和 `sell_factor` 是预先定义好的。因此,发散思维用直接计算出表现最佳的参数。 + +![Nested for loops for determining the buy and sell factor][23] + +*嵌套的 for 循环,用于确定购买和出售的参数* + +这要跑 81 个循环(9x9),在我的机器(Core i7 267QM)上花费了几分钟。 + +![System utilization while brute forcing][24] + +*在暴力运算时系统的利用率* + +在每个循环之后,它将 `buy_factor`、`sell_factor` 元组和生成的 `profit` 元组追加到 `trading_factors` 列表中。按利润降序对列表进行排序。 + +![Sort profit with related trading factors in descending order][25] + +*将利润与相关的交易参数按降序排序* + +当你打印出列表时,你会看到 0.002 是最好的参数。 + +![Sorted list of trading factors and profit][26] + +*交易要素和收益的有序列表* + +当我在 2020 年 3 月写下这篇文章时,价格的波动还不足以呈现出更理想的结果。我在 2 月份得到了更好的结果,但即使在那个时候,表现最好的交易参数也在 0.002 左右。 + +### 分割执行路径 + +现在开始新建一个网格以保持逻辑清晰。使用 **返回** 元素将带有 EMA-25 列的 DataFrame 从网格 2 传递到网格 3 的 0A 元素。 + +在网格 3 中,添加 **基础操作** 元素以执行评估逻辑。这是该元素中的代码: + +![Implemented evaluation logic][27] + +*实现评估策略* + +如果输出 `1` 表示你应该购买,如果输出 `2` 则表示你应该卖出。 输出 `0` 表示现在无需操作。使用 **分支**Branch 元素来控制执行路径。 + +![Branch element: Grid 3 Position 2A][28] + +*分支元素:网格 3,2A 位置* + +因为 `0` 和 `-1` 的处理流程一样,所以你需要在最右边添加一个分支元素来判断你是否应该卖出。 + +![Branch element: Grid 3 Position 3B][29] + +*分支元素:网格 3,3B 位置* + +网格 3 应该现在如下图所示: + +![Workflow on Grid 3][30] + +*网格 3 的工作流程* + +### 下单 + +由于无需在一个周期中购买两次,因此必须在周期之间保留一个持久变量,以指示你是否已经购买。 + +你可以利用 **栈**Stack 元素来实现。顾名思义,栈元素表示可以用任何 Python 数据类型来放入的基于文件的栈。 + +你需要定义栈仅包含一个布尔类型,该布尔类型决定是否购买了(`True`)或(`False`)。因此,你必须使用 `False` 来初始化栈。例如,你可以在网格 4 中简单地通过将 `False` 传递给栈来进行设置。 + +![Forward a False-variable to the subsequent Stack element][31] + +*将 False 变量传输到后续的栈元素中* + +在分支树后的栈实例可以进行如下配置: + +![Configuration of the Stack element][32] + +*设置栈元素* + +在栈元素设置中,将 对输入的操作Do this with input 设置成 Nothing。否则,布尔值将被 `1` 或 `0` 覆盖。 + +该设置确保仅将一个值保存于栈中(`True` 或 `False`),并且只能读取一个值(为了清楚起见)。 + +在栈元素之后,你需要另外一个 **分支** 元素来判断栈的值,然后再放置 币安订单Binance Order 元素。 + +![Evaluate the variable from the stack][33] + +*判断栈中的变量* + +将币安订单元素添加到分支元素的 `True` 路径。网格 3 上的工作流现在应如下所示: + +![Workflow on Grid 3][34] + +*网格 3 的工作流程* + +币安订单元素应如下配置: + +![Configuration of the Binance Order element][35] + +*编辑币安订单元素* + +你可以在币安网站上的帐户设置中生成 API 和密钥。 + +![Creating an API key in Binance][36] + +*在币安账户设置中创建一个 API 密钥* + +在本文中,每笔交易都是作为市价交易执行的,交易量为 10,000 TRX(2020 年 3 月约为 150 美元)(出于教学的目的,我通过使用市价下单来演示整个过程。因此,我建议至少使用限价下单。) + +如果未正确执行下单(例如,网络问题、资金不足或货币对不正确),则不会触发后续元素。因此,你可以假定如果触发了后续元素,则表示该订单已下达。 + +这是一个成功的 XMRBTC 卖单的输出示例: + +![Output of a successfully placed sell order][37] + +*成功卖单的输出* + +该行为使后续步骤更加简单:你可以始终假设只要成功输出,就表示订单成功。因此,你可以添加一个 **基础操作** 元素,该元素将简单地输出 **True** 并将此值放入栈中以表示是否下单。 + +如果出现错误的话,你可以在日志信息中查看具体细节(如果启用日志功能)。 + +![Logging output of Binance Order element][38] + +*币安订单元素中的输出日志信息* + +### 调度和同步 + +对于日程调度和同步,请在网格 1 中将整个工作流程置于 币安调度器Binance Scheduler 元素的前面。 + +![Binance Scheduler at Grid 1, Position 1A][39] + +*在网格 1,1A 位置的币安调度器* + +由于币安调度器元素只执行一次,因此请在网格 1 的末尾拆分执行路径,并通过将输出传递回币安调度器来强制让其重新同步。 + +![Grid 1: Split execution path][40] + +*网格 1:拆分执行路径* + +5A 元素指向 网格 2 的 1A 元素,并且 5B 元素指向网格 1 的 1A 元素(币安调度器)。 + +### 部署 + +你可以在本地计算机上全天候 7×24 小时运行整个程序,也可以将其完全托管在廉价的云系统上。例如,你可以使用 Linux/FreeBSD 云系统,每月约 5 美元,但通常不提供图形化界面。如果你想利用这些低成本的云,可以使用 PythonicDaemon,它能在终端中完全运行。 + +![PythonicDaemon console interface][41] + +*PythonicDaemon 控制台* + +PythonicDaemon 是基础程序的一部分。要使用它,请保存完整的工作流程,将其传输到远程运行的系统中(例如,通过安全拷贝协议Secure Copy SCP),然后把工作流程文件作为参数来启动 PythonicDaemon: + +``` +$ PythonicDaemon trading_bot_one +``` + +为了能在系统启动时自启 PythonicDaemon,可以将一个条目添加到 crontab 中: + +``` +# crontab -e +``` + +![Crontab on Ubuntu Server][42] + +*在 Ubuntu 服务器上的 Crontab* + +### 下一步 + +正如我在一开始时所说的,本教程只是自动交易的入门。对交易机器人进行编程大约需要 10% 的编程和 90% 的测试。当涉及到让你的机器人用金钱交易时,你肯定会对编写的代码再三思考。因此,我建议你编码时要尽可能简单和易于理解。 + +如果你想自己继续开发交易机器人,接下来所需要做的事: + +- 收益自动计算(希望你有正收益!) +- 计算你想买的价格 +- 比较你的预订单(例如,订单是否填写完整?) + +你可以从 [GitHub][2] 上获取完整代码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/python-crypto-trading-bot + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calculator_money_currency_financial_tool.jpg?itok=2QMa1y8c "scientific calculator" +[2]: https://github.com/hANSIc99/Pythonic +[3]: https://opensource.com/article/19/5/graphically-programming-pythonic +[4]: https://tron.network/ +[5]: https://bitcoin.org/en/ +[6]: https://www.binance.com/ +[7]: https://www.investopedia.com/terms/e/ema.asp +[8]: https://opensource.com/sites/default/files/uploads/1_ema-25.png "TRX/BTC 1-hour candle chart" +[9]: https://en.wikipedia.org/wiki/Open-high-low-close_chart +[10]: https://opensource.com/sites/default/files/uploads/2_data-mining-workflow.png "Data-mining workflow" +[11]: https://opensource.com/sites/default/files/uploads/3_ohlc-query.png "Configuration of the OHLC query element" +[12]: https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html#dataframe +[13]: https://opensource.com/sites/default/files/uploads/4_edit-basic-operation.png "Basic Operation element set up to use Vim" +[14]: https://opensource.com/sites/default/files/uploads/6_grid2-workflow.png "Technical analysis workflow in Grid 2" +[15]: https://opensource.com/sites/default/files/uploads/7_technical-analysis-config.png "Configuration of the technical analysis element" +[16]: https://opensource.com/sites/default/files/uploads/8_missing-decimals.png "Missing decimal places in output" +[17]: https://opensource.com/sites/default/files/uploads/9_basic-operation-element.png "Workflow in Grid 2" +[18]: https://opensource.com/sites/default/files/uploads/10_dump-extended-dataframe.png "Dump extended DataFrame to file" +[19]: https://opensource.com/sites/default/files/uploads/11_load-dataframe-decimals.png "Representation with all decimal places" +[20]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html +[21]: https://opensource.com/sites/default/files/uploads/12_trade-factor-decision.png "Buy/sell decision" +[22]: https://opensource.com/sites/default/files/uploads/13_validation-function.png "Validation function" +[23]: https://opensource.com/sites/default/files/uploads/14_brute-force-tf.png "Nested for loops for determining the buy and sell factor" +[24]: https://opensource.com/sites/default/files/uploads/15_system-utilization.png "System utilization while brute forcing" +[25]: https://opensource.com/sites/default/files/uploads/16_sort-profit.png "Sort profit with related trading factors in descending order" +[26]: https://opensource.com/sites/default/files/uploads/17_sorted-trading-factors.png "Sorted list of trading factors and profit" +[27]: https://opensource.com/sites/default/files/uploads/18_implemented-evaluation-logic.png "Implemented evaluation logic" +[28]: https://opensource.com/sites/default/files/uploads/19_output.png "Branch element: Grid 3 Position 2A" +[29]: https://opensource.com/sites/default/files/uploads/20_editbranch.png "Branch element: Grid 3 Position 3B" +[30]: https://opensource.com/sites/default/files/uploads/21_grid3-workflow.png "Workflow on Grid 3" +[31]: https://opensource.com/sites/default/files/uploads/22_pass-false-to-stack.png "Forward a False-variable to the subsequent Stack element" +[32]: https://opensource.com/sites/default/files/uploads/23_stack-config.png "Configuration of the Stack element" +[33]: https://opensource.com/sites/default/files/uploads/24_evaluate-stack-value.png "Evaluate the variable from the stack" +[34]: https://opensource.com/sites/default/files/uploads/25_grid3-workflow.png "Workflow on Grid 3" +[35]: https://opensource.com/sites/default/files/uploads/26_binance-order.png "Configuration of the Binance Order element" +[36]: https://opensource.com/sites/default/files/uploads/27_api-key-binance.png "Creating an API key in Binance" +[37]: https://opensource.com/sites/default/files/uploads/28_sell-order.png "Output of a successfully placed sell order" +[38]: https://opensource.com/sites/default/files/uploads/29_binance-order-output.png "Logging output of Binance Order element" +[39]: https://opensource.com/sites/default/files/uploads/30_binance-scheduler.png "Binance Scheduler at Grid 1, Position 1A" +[40]: https://opensource.com/sites/default/files/uploads/31_split-execution-path.png "Grid 1: Split execution path" +[41]: https://opensource.com/sites/default/files/uploads/32_pythonic-daemon.png "PythonicDaemon console interface" +[42]: https://opensource.com/sites/default/files/uploads/33_crontab.png "Crontab on Ubuntu Server" diff --git a/published/202103/20200702 6 best practices for managing Git repos.md b/published/202103/20200702 6 best practices for managing Git repos.md new file mode 100644 index 0000000000..81fb81347e --- /dev/null +++ b/published/202103/20200702 6 best practices for managing Git repos.md @@ -0,0 +1,136 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13200-1.html) +[#]: subject: (6 best practices for managing Git repos) +[#]: via: (https://opensource.com/article/20/7/git-repos-best-practices) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +6 个最佳的 Git 仓库管理实践 +====== + +> 抵制在 Git 中添加一些会增加管理难度的东西的冲动;这里有替代方法。 + +![](https://img.linux.net.cn/data/attachment/album/202103/13/225927c3mvm5x275vano5m.jpg) + +有权访问源代码使对安全性的分析以及应用程序的安全成为可能。但是,如果没有人真正看过代码,问题就不会被发现,即使人们主动地看代码,通常也要看很多东西。幸运的是,GitHub 拥有一个活跃的安全团队,最近,他们 [发现了已提交到多个 Git 仓库中的特洛伊木马病毒][2],甚至仓库的所有者也偷偷溜走了。尽管我们无法控制其他人如何管理自己的仓库,但我们可以从他们的错误中吸取教训。为此,本文回顾了将文件添加到自己的仓库中的一些最佳实践。 + +### 了解你的仓库 + +![Git 仓库终端][3] + +这对于安全的 Git 仓库来可以说是头号规则。作为项目维护者,无论是你自己创建的还是采用别人的,你的工作是了解自己仓库中的内容。你可能无法记住代码库中每一个文件,但是你需要了解你所管理的内容的基本组成部分。如果在几十个合并后出现一个游离的文件,你会很容易地发现它,因为你不知道它的用途,你需要检查它来刷新你的记忆。发生这种情况时,请查看该文件,并确保准确了解为什么它是必要的。 + +### 禁止二进制大文件 + +![终端中 Git 的二进制检查命令][4] + +Git 是为文本而生的,无论是用纯文本编写的 C 或 Python 还是 Java 文本,亦或是 JSON、YAML、XML、Markdown、HTML 或类似的文本。Git 对于二进制文件不是很理想。 + +两者之间的区别是: + +``` +$ cat hello.txt +This is plain text. +It's readable by humans and machines alike. +Git knows how to version this. + +$ git diff hello.txt +diff --git a/hello.txt b/hello.txt +index f227cc3..0d85b44 100644 +--- a/hello.txt ++++ b/hello.txt +@@ -1,2 +1,3 @@ + This is plain text. ++It's readable by humans and machines alike. + Git knows how to version this. +``` + +和 + +``` +$ git diff pixel.png +diff --git a/pixel.png b/pixel.png +index 563235a..7aab7bc 100644 +Binary files a/pixel.png and b/pixel.png differ + +$ cat pixel.png +�PNG +▒ +IHDR7n�$gAMA�� + �abKGD݊�tIME� + + -2R�� +IDA�c`�!�3%tEXtdate:create2020-06-11T11:45:04+12:00��r.%tEXtdate:modify2020-06-11T11:45:04+12:00��ʒIEND�B`� +``` + +二进制文件中的数据不能像纯文本一样被解析,因此,如果二进制文件发生任何更改,则必须重写整个内容。一个版本与另一个版本之间唯一的区别就是全部不同,这会快速增加仓库大小。 + +更糟糕的是,Git 仓库维护者无法合理地审计二进制数据。这违反了头号规则:应该对仓库的内容了如指掌。 + +除了常用的 [POSIX][5] 工具之外,你还可以使用 `git diff` 检测二进制文件。当你尝试使用 `--numstat` 选项来比较二进制文件时,Git 返回空结果: + +``` +$ git diff --numstat /dev/null pixel.png | tee +- - /dev/null => pixel.png +$ git diff --numstat /dev/null file.txt | tee +5788 0 /dev/null => list.txt +``` + +如果你正在考虑将二进制大文件(BLOB)提交到仓库,请停下来先思考一下。如果它是二进制文件,那它是由什么生成的。是否有充分的理由不在构建时生成它们,而是将它们提交到仓库?如果你认为提交二进制数据是有意义的,请确保在 `README` 文件或类似文件中指明二进制文件的位置、为什么是二进制文件的原因以及更新它们的协议是什么。必须谨慎对其更新,因为你每提交一个二进制大文件的变化,它的存储空间实际上都会加倍。 + +### 让第三方库留在第三方 + +第三方库也不例外。尽管它是开源的众多优点之一,你可以不受限制地重用和重新分发不是你编写的代码,但是有很多充分的理由不把第三方库存储在你自己的仓库中。首先,除非你自己检查了所有代码(以及将来的合并),否则你不能为第三方完全担保。其次,当你将第三方库复制到你的 Git 仓库中时,会将焦点从真正的上游源代码中分离出来。从技术上讲,对库有信心的人只对该库的主副本有把握,而不是对随机仓库的副本有把握。如果你需要锁定特定版本的库,请给开发者提供一个合理的项目所需的发布 URL,或者使用 [Git 子模块][6]。 + +### 抵制盲目的 git add + +![Git 手动添加命令终端中][7] + +如果你的项目已编译,请抵制住使用 `git add .` 的冲动(其中 `.` 是当前目录或特定文件夹的路径),因为这是一种添加任何新东西的简单方法。如果你不是手动编译项目,而是使用 IDE 为你管理项目,这一点尤其重要。用 IDE 管理项目时,跟踪添加到仓库中的内容会非常困难,因此仅添加你实际编写的内容非常重要,而不是添加项目文件夹中出现的任何新对象。 + +如果你使用了 `git add .`,请在推送之前检查暂存区里的内容。如果在运行 `make clean` 或等效命令后,执行 `git status` 时在项目文件夹中看到一个陌生的对象,请找出它的来源,以及为什么仍然在项目的目录中。这是一种罕见的构建工件,不会在编译期间重新生成,因此在提交前请三思。 + +### 使用 Git ignore + +![终端中的 `Git ignore` 命令][8] + +许多为程序员打造的便利也非常杂乱。任何项目的典型项目目录,无论是编程的,还是艺术的或其他的,到处都是隐藏的文件、元数据和遗留的工件。你可以尝试忽略这些对象,但是 `git status` 中的提示越多,你错过某件事的可能性就越大。 + +你可以通过维护一个良好的 `gitignore` 文件来为你过滤掉这种噪音。因为这是使用 Git 的用户的共同要求,所以有一些入门级的 `gitignore` 文件。[Github.com/github/gitignore][9] 提供了几个专门创建的 `gitignore` 文件,你可以下载这些文件并将其放置到自己的项目中,[Gitlab.com][10] 在几年前就将`gitignore` 模板集成到了仓库创建工作流程中。使用这些模板来帮助你为项目创建适合的 `gitignore` 策略并遵守它。 + +### 查看合并请求 + +![Git 合并请求][11] + +当你通过电子邮件收到一个合并/拉取请求或补丁文件时,不要只是为了确保它能正常工作而进行测试。你的工作是阅读进入代码库的新代码,并了解其是如何产生结果的。如果你不同意这个实现,或者更糟的是,你不理解这个实现,请向提交该实现的人发送消息,并要求其进行说明。质疑那些希望成为版本库永久成员的代码并不是一种社交失误,但如果你不知道你把什么合并到用户使用的代码中,那就是违反了你和用户之间的社交契约。 + +### Git 责任 + +社区致力于开源软件良好的安全性。不要鼓励你的仓库中不良的 Git 实践,也不要忽视你克隆的仓库中的安全威胁。Git 功能强大,但它仍然只是一个计算机程序,因此要以人为本,确保每个人的安全。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/git-repos-best-practices + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://securitylab.github.com/research/octopus-scanner-malware-open-source-supply-chain/ +[3]: https://opensource.com/sites/default/files/uploads/git_repo.png (Git repository ) +[4]: https://opensource.com/sites/default/files/uploads/git-binary-check.jpg (Git binary check) +[5]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[6]: https://git-scm.com/book/en/v2/Git-Tools-Submodules +[7]: https://opensource.com/sites/default/files/uploads/git-cola-manual-add.jpg (Git manual add) +[8]: https://opensource.com/sites/default/files/uploads/git-ignore.jpg (Git ignore) +[9]: https://github.com/github/gitignore +[10]: https://about.gitlab.com/releases/2016/05/22/gitlab-8-8-released +[11]: https://opensource.com/sites/default/files/uploads/git_merge_request.png (Git merge request) diff --git a/published/202103/20200915 Improve your time management with Jupyter.md b/published/202103/20200915 Improve your time management with Jupyter.md new file mode 100644 index 0000000000..3a1cd3d81d --- /dev/null +++ b/published/202103/20200915 Improve your time management with Jupyter.md @@ -0,0 +1,315 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13212-1.html) +[#]: subject: (Improve your time management with Jupyter) +[#]: via: (https://opensource.com/article/20/9/calendar-jupyter) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +使用 Jupyter 改善你的时间管理 +====== + +> 在 Jupyter 里使用 Python 来分析日历,以了解你是如何使用时间的。 + +![](https://img.linux.net.cn/data/attachment/album/202103/18/095530cxx6663ptypyzvmx.jpg) + +[Python][2] 在探索数据方面具有令人难以置信的可扩展性。利用 [Pandas][3] 或 [Dask][4],你可以将 [Jupyter][5] 扩展到大数据领域。但是小数据、个人资料、私人数据呢? + +JupyterLab 和 Jupyter Notebook 为我提供了一个绝佳的环境,可以让我审视我的笔记本电脑生活。 + +我的探索是基于以下事实:我使用的几乎每个服务都有一个 Web API。我使用了诸多此类服务:待办事项列表、时间跟踪器、习惯跟踪器等。还有一个几乎每个人都会使用到:_日历_。相同的思路也可以应用于其他服务,但是日历具有一个很酷的功能:几乎所有 Web 日历都支持的开放标准 —— CalDAV。 + +### 在 Jupyter 中使用 Python 解析日历 + +大多数日历提供了导出为 CalDAV 格式的方法。你可能需要某种身份验证才能访问这些私有数据。按照你的服务说明进行操作即可。如何获得凭据取决于你的服务,但是最终,你应该能够将这些凭据存储在文件中。我将我的凭据存储在根目录下的一个名为 `.caldav` 的文件中: + +``` +import os +with open(os.path.expanduser("~/.caldav")) as fpin: +    username, password = fpin.read().split() +``` + +切勿将用户名和密码直接放在 Jupyter Notebook 的笔记本中!它们可能会很容易因 `git push` 的错误而导致泄漏。 + +下一步是使用方便的 PyPI [caldav][6] 库。我找到了我的电子邮件服务的 CalDAV 服务器(你可能有所不同): + +``` +import caldav +client = caldav.DAVClient(url="https://caldav.fastmail.com/dav/", username=username, password=password) +``` + +CalDAV 有一个称为 `principal`(主键)的概念。它是什么并不重要,只要知道它是你用来访问日历的东西就行了: + +``` +principal = client.principal() +calendars = principal.calendars() +``` + +从字面上讲,日历就是关于时间的。访问事件之前,你需要确定一个时间范围。默认一星期就好: + +``` +from dateutil import tz +import datetime +now = datetime.datetime.now(tz.tzutc()) +since = now - datetime.timedelta(days=7) +``` + +大多数人使用的日历不止一个,并且希望所有事件都在一起出现。`itertools.chain.from_iterable` 方法使这一过程变得简单: + +``` +import itertools + +raw_events = list( +    itertools.chain.from_iterable( +        calendar.date_search(start=since, end=now, expand=True) +        for calendar in calendars +    ) +) +``` + +将所有事件读入内存很重要,以 API 原始的本地格式进行操作是重要的实践。这意味着在调整解析、分析和显示代码时,无需返回到 API 服务刷新数据。 + +但 “原始” 真的是原始,事件是以特定格式的字符串出现的: + +``` +print(raw_events[12].data) +``` + +``` +    BEGIN:VCALENDAR +    VERSION:2.0 +    PRODID:-//CyrusIMAP.org/Cyrus +     3.3.0-232-g4bdb081-fm-20200825.002-g4bdb081a//EN +    BEGIN:VEVENT +    DTEND:20200825T230000Z +    DTSTAMP:20200825T181915Z +    DTSTART:20200825T220000Z +    SUMMARY:Busy +    UID: +     1302728i-040000008200E00074C5B7101A82E00800000000D939773EA578D601000000000 +     000000010000000CD71CC3393651B419E9458134FE840F5 +    END:VEVENT +    END:VCALENDAR +``` + +幸运的是,PyPI 可以再次使用另一个辅助库 [vobject][7] 解围: + +``` +import io +import vobject + +def parse_event(raw_event): + data = raw_event.data + parsed = vobject.readOne(io.StringIO(data)) + contents = parsed.vevent.contents + return contents +``` + +``` +parse_event(raw_events[12]) +``` + +``` + {'dtend': [], + 'dtstamp': [], + 'dtstart': [], + 'summary': [], + 'uid': []} +``` + +好吧,至少好一点了。 + +仍有一些工作要做,将其转换为合理的 Python 对象。第一步是 _拥有_ 一个合理的 Python 对象。[attrs][8] 库提供了一个不错的开始: + +``` +import attr +from __future__ import annotations +@attr.s(auto_attribs=True, frozen=True) +class Event: +    start: datetime.datetime +    end: datetime.datetime +    timezone: Any +    summary: str +``` + +是时候编写转换代码了! + +第一个抽象从解析后的字典中获取值,不需要所有的装饰: + +``` +def get_piece(contents, name): + return contents[name][0].value +get_piece(_, "dtstart") + datetime.datetime(2020, 8, 25, 22, 0, tzinfo=tzutc()) +``` + +日历事件总有一个“开始”、有一个“结束”、有一个 “持续时间”。一些谨慎的解析逻辑可以将两者协调为同一个 Python 对象: + +``` +def from_calendar_event_and_timezone(event, timezone): +    contents = parse_event(event) +    start = get_piece(contents, "dtstart") +    summary = get_piece(contents, "summary") +    try: +        end = get_piece(contents, "dtend") +    except KeyError: +        end = start + get_piece(contents, "duration") +    return Event(start=start, end=end, summary=summary, timezone=timezone) +``` + +将事件放在 _本地_ 时区而不是 UTC 中很有用,因此使用本地时区: + +``` +my_timezone = tz.gettz() +from_calendar_event_and_timezone(raw_events[12], my_timezone) + Event(start=datetime.datetime(2020, 8, 25, 22, 0, tzinfo=tzutc()), end=datetime.datetime(2020, 8, 25, 23, 0, tzinfo=tzutc()), timezone=tzfile('/etc/localtime'), summary='Busy') +``` + +既然事件是真实的 Python 对象,那么它们实际上应该具有附加信息。幸运的是,可以将方法添加到类中。 + +但是要弄清楚哪个事件发生在哪一天不是很直接。你需要在 _本地_ 时区中选择一天: + +``` +def day(self): + offset = self.timezone.utcoffset(self.start) + fixed = self.start + offset + return fixed.date() +Event.day = property(day) +``` + +``` +print(_.day) + 2020-08-25 +``` + +事件在内部始终是以“开始”/“结束”的方式表示的,但是持续时间是有用的属性。持续时间也可以添加到现有类中: + +``` +def duration(self): + return self.end - self.start +Event.duration = property(duration) +``` + +``` +print(_.duration) + 1:00:00 +``` + +现在到了将所有事件转换为有用的 Python 对象了: + +``` +all_events = [from_calendar_event_and_timezone(raw_event, my_timezone) +              for raw_event in raw_events] +``` + +全天事件是一种特例,可能对分析生活没有多大用处。现在,你可以忽略它们: + +``` +# ignore all-day events +all_events = [event for event in all_events if not type(event.start) == datetime.date] +``` + +事件具有自然顺序 —— 知道哪个事件最先发生可能有助于分析: + +``` +all_events.sort(key=lambda ev: ev.start) +``` + +现在,事件已排序,可以将它们加载到每天: + +``` +import collections +events_by_day = collections.defaultdict(list) +for event in all_events: +    events_by_day[event.day].append(event) +``` + +有了这些,你就有了作为 Python 对象的带有日期、持续时间和序列的日历事件。 + +### 用 Python 报到你的生活 + +现在是时候编写报告代码了!带有适当的标题、列表、重要内容以粗体显示等等,有醒目的格式是很意义。 + +这就是一些 HTML 和 HTML 模板。我喜欢使用 [Chameleon][9]: + +``` +template_content = """ + +

        +

        Day

        +
          +
        • Thing
        • +
        +
        +""" +``` + +Chameleon 的一个很酷的功能是使用它的 `html` 方法渲染对象。我将以两种方式使用它: + + * 摘要将以粗体显示 + * 对于大多数活动,我都会删除摘要(因为这是我的个人信息) + +``` +def __html__(self): + offset = my_timezone.utcoffset(self.start) + fixed = self.start + offset + start_str = str(fixed).split("+")[0] + summary = self.summary + if summary != "Busy": + summary = "<REDACTED>" + return f"{summary[:30]} -- {start_str} ({self.duration})" +Event.__html__ = __html__ +``` + +为了简洁起见,将该报告切成每天的: + +``` +import chameleon +from IPython.display import HTML +template = chameleon.PageTemplate(template_content) +html = template(items=itertools.islice(events_by_day.items(), 3, 4)) +HTML(html) +``` + +渲染后,它将看起来像这样: + +**2020-08-25** + +- **\** -- 2020-08-25 08:30:00 (0:45:00) +- **\** -- 2020-08-25 10:00:00 (1:00:00) +- **\** -- 2020-08-25 11:30:00 (0:30:00) +- **\** -- 2020-08-25 13:00:00 (0:25:00) +- Busy -- 2020-08-25 15:00:00 (1:00:00) +- **\** -- 2020-08-25 15:00:00 (1:00:00) +- **\** -- 2020-08-25 19:00:00 (1:00:00) +- **\** -- 2020-08-25 19:00:12 (1:00:00) + +### Python 和 Jupyter 的无穷选择 + +通过解析、分析和报告各种 Web 服务所拥有的数据,这只是你可以做的事情的表面。 + +为什么不对你最喜欢的服务试试呢? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/calendar-jupyter + +作者:[Moshe Zadka][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/calendar.jpg?itok=jEKbhvDT (Calendar close up snapshot) +[2]: https://opensource.com/resources/python +[3]: https://pandas.pydata.org/ +[4]: https://dask.org/ +[5]: https://jupyter.org/ +[6]: https://pypi.org/project/caldav/ +[7]: https://pypi.org/project/vobject/ +[8]: https://opensource.com/article/19/5/python-attrs +[9]: https://chameleon.readthedocs.io/en/latest/ diff --git a/published/202103/20201014 Teach a virtual class with Moodle on Linux.md b/published/202103/20201014 Teach a virtual class with Moodle on Linux.md new file mode 100644 index 0000000000..b41b64f498 --- /dev/null +++ b/published/202103/20201014 Teach a virtual class with Moodle on Linux.md @@ -0,0 +1,181 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13190-1.htmlhttps://linux.cn/article-13190-1.html) +[#]: subject: (Teach a virtual class with Moodle on Linux) +[#]: via: (https://opensource.com/article/20/10/moodle) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +基于 Linux 的 Moodle 虚拟课堂教学 +====== + +> 基于 Linux 的 Moodle 学习管理系统进行远程教学。 + +![](https://img.linux.net.cn/data/attachment/album/202103/10/094113q0ggsbz0a0wb9eg4.jpg) + +这次大流行对远程教育的需求比以往任何时候都更大。使得像 [Moodle][2] 这样的学习管理系统learning management system(LMS)比以往任何时候都重要,因为越来越多的学校教育是借助虚拟现实技术的提供。 + +Moodle 是用 PHP 编写的免费 LMS,并以开源 [GNU 公共许可证][3](GPL)分发。它是由 [Martin Dougiamas][4] 开发的,自 2002 年发布以来一直在不断发展。Moodle 可用于混合学习、远程学习、翻转课堂flipped classroom和其他形式的在线学习。目前,全球有超过 [1.9 亿用户][5] 和 145,000 个注册的 Moodle 网站。 + +我曾作为 Moodle 管理员、教师和学生等角色使用过 Moodle,在本文中,我将向你展示如何设置并开始使用它。 + +### 在 Linux 系统上安装 Moodle + +Moodle 对 [系统要求][6] 适中,并且有大量文档可为你提供帮助。我最喜欢的安装方法是从 [Turnkey Linux][7] 下载并制作 ISO,然后在 VirtualBox 中安装 Moodle 网站。 + +首先,下载 [Moodle ISO][8] 保存到电脑中。 + +下一步,安装 VirtualBox 的 Linux 命令行如下: + +``` +$ sudo apt install virtualbox +``` + +或, + +``` +$ sudo dnf install virtualbox +``` + +当下载完成后,启动 VirtualBox 并在控制台中选择“新建New”按钮。 + +![创建一个新的 VirtualBox 虚拟机][9] + +选择使用的虚拟机的名称、操作系统(Linux)和 Linux 类型(例如 Debian 64 位)。 + +![命名 VirtualBox 虚拟机][11] + +下一步,配置虚拟机内存大小,使用默认值 1024 MB。接下来选择 “动态分配dynamically allocated”虚拟磁盘并在虚拟机中添加 `Moodle.iso` 镜像。 + +![添加 Moodle.iso 到虚拟机][12] + +将你的网络设置从 NAT 更改为 “桥接模式Bridged adapter”。然后启动虚拟机并安装 ISO 以创建 Moodle 虚拟机。在安装过程中,系统将提示为 root 帐户、MySQL 和Moodle 创建密码。Moodle 密码必须至少包含八个字符,至少一个大写字母和至少一个特殊字符。 + +重启虚拟机。安装完成后,请确保将 Moodle 应用配置内容记录在安全的地方。(安装后,可以根据需要删除 ISO 文件。) + +![Moodle 应用配置][13] + +重要提示,在互联网上的任何人还看不到你的 Moodle 实例。它仅存在于你的本地网络中:现在只有建筑物中与你连接到相同的路由器或 wifi 接入点的人可以访问你的站点。全世界的互联网无法连接到它,因为你位于防火墙(可能嵌入在路由器中,还可能嵌入在计算机中)的后面。有关网络配置的更多信息,请阅读 Seth Kenlon 关于 [打开端口和通过防火墙进行流量路由][14] 的文章。 + +### 开始使用 Moodle + +现在你可以登录到 Moodle 机器并熟悉该软件了。使用默认的用户名 `admin` 和创建 Moodle VM 时设置的密码登录 Moodle。 + +![Moodle 登录界面][15] + +首次登录后,你将看到初始的 Moodle 网站的主仪表盘。 + +![Moodle 管理员仪表盘][16] + +默认的应用名称是 “Turnkey Moodle”,但是可以很容易地对其进行更改以适合你的学校、课堂或其他需要和选择。要使你的 Moodle 网站个性化,请在用户界面左侧的菜单中,选择“站点首页Site home”。然后,点击屏幕右侧的 “设置Settings” 图标,然后选择 “编辑设置Edit settings”。 + +![Moodle 设置][17] + +你可以根据需要更改站点名称,并添加简短名称和站点描述。 + +![Moodle 网站名][18] + +确保滚动到底部并保存更改。现在,你的网站已定制好。 + +![Moodle 保存更改][19] + +默认类别为其他,这不会帮助人们识别你网站的目的。要添加类别,请返回主仪表盘,然后从左侧菜单中选择 “站点管理Site administration”。 在 “课程Courses”下,选择 “添加类别Add a category”并输入有关你的网站的详细信息。 + +![在 Moodle 中添加类别选项][20] + +要添加课程,请返回 “站点管理Site administration”,然后单击 “添加新课程Add a new course”。你将看到一系列选项,例如为课程命名、提供简短名称、设定类别以及设置课程的开始和结束日期。你还可以为课程形式设置选项,例如社交、每周式课程、主题,以及其外观、文件上传大小、完成情况跟踪等等。 + +![在 Moodle 中添加课程选项][21] + +### 添加和管理用户 + +现在,你已经设置了课程,你可以添加用户。有多种方法可以做到这一点。如果你是家庭教师,则手动输入是一个不错的开始。Moodle 支持基于电子邮件的注册、[LDAP][22]、[Shibboleth(口令或暗语)][23] 和许多其他方式等。校区和其他较大的机构可以用逗号分隔的文件上传用户。也可以批量添加密码,并在首次登录时强制更改密码。有关更多信息,一定要查阅 Moodle [文档][24]。 + +Moodle 是一个非常细化的、面向许可的环境。使用 Moodle 的菜单将策略和角色分配给用户并执行这些分配很容易。 + +Moodle 中有许多角色,每个角色都有特定的特权和许可。默认角色有管理员、课程创建者、教师、非编辑教师、学生、来宾和经过身份验证的用户,但你可以添加其他角色。 + +### 为课程添加内容 + +一旦搭建了 Moodle 网站并设置了课程,就可以向课程中添加内容。Moodle 拥有创建出色内容所需要的所有工具,并且它建立在强调 [社会建构主义][25] 观点的坚实教学法之上。 + +我创建了一个名为 “Code with [Mu][26]” 的示例课程。它在 “编程Programming” 类别和 “Python” 子类别中。 + +![Moodle 课程列表][27] + +我为课程选择了每周式课程,默认为四个星期。使用编辑工具,我隐藏了除课程第一周以外的所有内容。这样可以确保我的学生始终专注于材料。 + +作为教师或 Moodle 管理员,我可以通过单击 “添加活动或资源Add an activity or resource” 来将活动添加到每周的教学中。 + +![在 Moodle 中添加活动][28] + +我会看到一个弹出窗口,其中包含可以分配给我的学生的各种活动。 + +![Moodle 活动菜单][29] + +Moodle 的工具和活动使我可以轻松地创建学习材料,并以一个简短的测验来结束一周的学习。 + +![Moodle 活动清单][30] + +你可以使用 1600 多个插件来扩展 Moodle,包括新的活动、问题类型,与其他系统的集成等等。例如,[BigBlueButton][31] 插件支持幻灯片共享、白板、音频和视频聊天以及分组讨论。其他值得考虑的包括用于视频会议的 [Jitsi][32] 插件、[抄袭检查器][33] 和用于颁发徽章的 [开放徽章工厂][34]。 + +### 继续探索 Moodle + +Moodle 是一个功能强大的 LMS,我希望此介绍能引起你的兴趣,以了解更多信息。有很多出色的 [指南][35] 可以帮助你提高技能,如果想要查看 Moodle 的内容,可以在其 [演示站点][36] 上查看运行中的 Moodle;如果你想了解 Moodle 的底层结构或为开发做出 [贡献][38],也可以访问 [Moodle 的源代码][37]。如果你喜欢在旅途中工作,Moodle 也有一款出色的 [移动应用][39],适用于 iOS 和 Android。在 [Twitter][40]、[Facebook][41] 和 [LinkedIn][42] 上关注 Moodle,以了解最新消息。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/moodle + +作者:[Don Watkins][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_desk_home_laptop_browser.png?itok=Y3UVpY0l (Digital images of a computer desktop) +[2]: https://moodle.org/ +[3]: https://docs.moodle.org/19/en/GNU_General_Public_License +[4]: https://dougiamas.com/about/ +[5]: https://docs.moodle.org/39/en/History +[6]: https://docs.moodle.org/39/en/Installation_quick_guide#Basic_Requirements +[7]: https://www.turnkeylinux.org/ +[8]: https://www.turnkeylinux.org/download?file=turnkey-moodle-16.0-buster-amd64.iso +[9]: https://opensource.com/sites/default/files/uploads/virtualbox_new.png (Create a new VirtualBox) +[10]: https://creativecommons.org/licenses/by-sa/4.0/ +[11]: https://opensource.com/sites/default/files/uploads/virtualbox_namevm.png (Naming the VirtualBox VM) +[12]: https://opensource.com/sites/default/files/uploads/virtualbox_attach-iso.png (Attaching Moodle.iso to VM) +[13]: https://opensource.com/sites/default/files/uploads/moodle_appliance.png (Moodle appliance settings) +[14]: https://opensource.com/article/20/9/firewall +[15]: https://opensource.com/sites/default/files/uploads/moodle_login.png (Moodle login screen) +[16]: https://opensource.com/sites/default/files/uploads/moodle_dashboard.png (Moodle admin dashboard) +[17]: https://opensource.com/sites/default/files/uploads/moodle_settings.png (Moodle settings) +[18]: https://opensource.com/sites/default/files/uploads/moodle_name-site.png (Name Moodle site) +[19]: https://opensource.com/sites/default/files/uploads/moodle_saved.png (Moodle changes saved) +[20]: https://opensource.com/sites/default/files/uploads/moodle_addcategory.png (Add category option in Moodle) +[21]: https://opensource.com/sites/default/files/uploads/moodle_addcourse.png (Add course option in Moodle) +[22]: https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol +[23]: https://www.shibboleth.net/ +[24]: https://docs.moodle.org/39/en/Main_page +[25]: https://docs.moodle.org/39/en/Pedagogy#How_Moodle_tries_to_support_a_Social_Constructionist_view +[26]: https://opensource.com/article/20/9/teach-python-mu +[27]: https://opensource.com/sites/default/files/uploads/moodle_choosecourse.png (Moodle course list) +[28]: https://opensource.com/sites/default/files/uploads/moodle_addactivity_0.png (Add activity in Moodle) +[29]: https://opensource.com/sites/default/files/uploads/moodle_activitiesmenu.png (Moodle activities menu) +[30]: https://opensource.com/sites/default/files/uploads/moodle_activitieschecklist.png (Moodle activities checklist) +[31]: https://moodle.org/plugins/mod_bigbluebuttonbn +[32]: https://moodle.org/plugins/mod_jitsi +[33]: https://moodle.org/plugins/plagiarism_unicheck +[34]: https://moodle.org/plugins/local_obf +[35]: https://learn.moodle.org/ +[36]: https://school.moodledemo.net/ +[37]: https://git.in.moodle.com/moodle/moodle +[38]: https://git.in.moodle.com/moodle/moodle/-/blob/master/CONTRIBUTING.txt +[39]: https://download.moodle.org/mobile/ +[40]: https://twitter.com/moodle +[41]: https://www.facebook.com/moodle +[42]: https://www.linkedin.com/company/moodle/ diff --git a/published/202103/20201215 6 container concepts you need to understand.md b/published/202103/20201215 6 container concepts you need to understand.md new file mode 100644 index 0000000000..30d8ba7631 --- /dev/null +++ b/published/202103/20201215 6 container concepts you need to understand.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: (AmorSu) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13170-1.html) +[#]: subject: (6 container concepts you need to understand) +[#]: via: (https://opensource.com/article/20/12/containers-101) +[#]: author: (Mike Calizo https://opensource.com/users/mcalizo) + +6 个必知必会的关于容器的概念 +====== + +> 容器现在是无所不在,它们已经快速的改变了 IT 格局。关于容器你需要知道一些什么呢? + +![](https://img.linux.net.cn/data/attachment/album/202103/02/204713fgp7fasvm4ii2ire.jpg) + +因为容器给企业所带来的巨大的价值和大量的好处,它快速的改变了 IT 格局。几乎所有最新的业务创新,都有容器化贡献的一部分因素,甚至是主要因素。 + +在现代化应用架构中,能够快速的把变更交付到生产环境的能力,让你比你的竞争对手更胜一筹。容器通过使用微服务架构,帮助开发团队开发功能、更小的失败、更快的恢复,从而加快交付速度。容器化还让应用软件能够快速启动、按需自动扩展云资源。还有,[DevOps][2] 通过灵活性、移动性、和有效性让产品可以尽快进入市场,从而将容器化的所能带来的好处最大化。 + +在 DevOps 中,虽然速度、敏捷、灵活是容器化的主要保障,但安全则是一个重要的因素。这就导致了 DevSecOps 的出现。它从一开始,到贯穿容器化应用的整个生命周期,都始终将安全融合到应用的开发中。默认情况下,容器化大大地增强了安全性,因为它将应用和宿主机以及其他的容器化应用相互隔离开来。 + +### 什么是容器? + +容器是单体式应用程序所遗留的问题的解决方案。虽然单体式有它的优点,但是它阻碍了组织以敏捷的方式快速前进。而容器则让你能够将单体式分解成 [微服务][3]。 + +本质上来说,容器只是一些轻量化组件的应用集,比如软件依赖、库、配置文件等等,然后运行在一个隔离的环境之中,这个隔离的环境又是运行在传统操作系统之上的,或者为了可移植性和灵活性而运行在虚拟化环境之上。 + +![容器的架构][4] + +总而言之,容器通过利用像 cgroup、 [内核命名空间][6] 和 [SELinux][7] 这样的内核技术来实现隔离。容器跟宿主机共用一个内核,因此比虚拟机占用更少的资源。 + +### 容器的优势 + +这种架构所带来的敏捷性是虚拟机所不可能做到的。此外,在计算和内存资源方面,容器支持一种更灵活的模型,而且它支持突发资源模式,因此应用程序可以在需要的时候,在限定的范围内,使用更多的资源。用另一句话来说,容器提供的扩展性和灵活性,是你在虚拟机上运行的应用程序中所无法实现的。 + +容器让在公有云或者私有云上部署和分享应用变得非常容易。更重要的是,它所提供的连贯性,帮助运维和开发团队降低了在跨平台部署的过程中的复杂度。 + +容器还可以实现一套通用的构建组件,可以在开发的任何阶段拿来复用,从而可以重建出一样的环境供开发、测试、预备、生产使用,将“一次编写、到处执行”的概念加以扩展。 + +和虚拟化相比,容器使实现灵活性、连贯性和快速部署应用的能力变得更加简单 —— 这是 DevOps 的主要原则。 + +### Docker 因素 + +[Docker][8] 已经变成了容器的代名词。Docker 让容器技术发生彻底变革并得以推广普及,虽然早在 Docker 之前容器技术就已经存在。这些容器技术包括 AIX 工作负载分区、 Solaris 容器、以及 Linux 容器([LXC][9]),后者被用来 [在一台 Linux 宿主机上运行多个 Linux 环境][10]。 + +### Kubernetes 效应 + +Kubernetes 如今已被广泛认为是 [编排引擎][11] 中的领导者。在过去的几年里,[Kubernetes 的普及][12] 加上容器技术的应用日趋成熟,为运维、开发、以及安全团队可以拥抱日益变革的行业,创造了一个理想的环境。 + +Kubernetes 为容器的管理提供了完整全面的解决方案。它可以在一个集群中运行容器,从而实现类似自动扩展云资源这样的功能,这些云资源包括:自动的、分布式的事件驱动的应用需求。这就保证了“免费的”高可用性。(比如,开发和运维都不需要花太大的劲就可以实现) + +此外,在 OpenShift 和 类似 Kubernetes 这样的企业的帮助下,容器的应用变得更加的容易。 + +![Kubernetes 集群][13] + +### 容器会替代虚拟机吗? + +[KubeVirt][14] 和类似的 [开源][15] 项目很大程度上表明,容器将会取代虚拟机。KubeVirt 通过将虚拟机转化成容器,把虚拟机带入到容器化的工作流中,因此它们就可以利用容器化应用的优势。 + +现在,容器和虚拟机更多的是互补的关系,而不是相互竞争的。容器在虚拟机上面运行,因此增加可用性,特别是对于那些要求有持久性的应用。同时容器可以利用虚拟化技术的优势,让硬件的基础设施(如:内存和网络)的管理更加便捷。 + +### 那么 Windows 容器呢? + +微软和开源社区方面都对 Windows 容器的成功实现做了大量的推动。Kubernetes 操作器Operator 加速了 Windows 容器的应用进程。还有像 OpenShift 这样的产品现在可以启用 [Windows 工作节点][16] 来运行 Windows 容器。 + +Windows 的容器化创造出巨大的诱人的可能性。特别是对于使用混合环境的企业。在 Kubernetes 集群上运行你最关键的应用程序,是你成功实现混合云/多种云环境的目标迈出的一大步。 + +### 容器的未来 + +容器在 IT 行业日新月异的变革中扮演着重要的角色,因为企业在向着快速、敏捷的交付软件及解决方案的方向前进,以此来 [超越竞争对手][17]。 + +容器会继续存在下去。在不久的将来,其他的使用场景,比如边缘计算中的无服务器,将会浮现出来,并且更深地影响我们对从数字设备来回传输数据的速度的认知。唯一在这种变化中存活下来的方式,就是去应用它们。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/containers-101 + +作者:[Mike Calizo][a] +选题:[lujun9972][b] +译者:[AmorSu](https://github.com/amorsu) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mcalizo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes_containers_ship_lead.png?itok=9EUnSwci (Ships at sea on the web) +[2]: https://opensource.com/resources/devops +[3]: https://opensource.com/resources/what-are-microservices +[4]: https://opensource.com/sites/default/files/uploads/container_architecture.png (Container architecture) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/19/10/namespaces-and-containers-linux +[7]: https://opensource.com/article/20/11/selinux-containers +[8]: https://opensource.com/resources/what-docker +[9]: https://linuxcontainers.org/ +[10]: https://opensource.com/article/18/11/behind-scenes-linux-containers +[11]: https://opensource.com/article/20/11/orchestration-vs-automation +[12]: https://enterprisersproject.com/article/2020/6/kubernetes-statistics-2020 +[13]: https://opensource.com/sites/default/files/uploads/kubernetes_cluster.png (Kubernetes cluster) +[14]: https://kubevirt.io/ +[15]: https://opensource.com/resources/what-open-source +[16]: https://www.openshift.com/blog/announcing-the-community-windows-machine-config-operator-on-openshift-4.6 +[17]: https://www.imd.org/research-knowledge/articles/the-battle-for-digital-disruption-startups-vs-incumbents/ diff --git a/published/202103/20210113 Turn your Raspberry Pi into a HiFi music system.md b/published/202103/20210113 Turn your Raspberry Pi into a HiFi music system.md new file mode 100644 index 0000000000..4f25621cf2 --- /dev/null +++ b/published/202103/20210113 Turn your Raspberry Pi into a HiFi music system.md @@ -0,0 +1,83 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13209-1.html) +[#]: subject: (Turn your Raspberry Pi into a HiFi music system) +[#]: via: (https://opensource.com/article/21/1/raspberry-pi-hifi) +[#]: author: (Peter Czanik https://opensource.com/users/czanik) + +把你的树莓派变成一个 HiFi 音乐系统 +====== + +> 为你的朋友、家人、同事或其他任何拥有廉价发烧设备的人播放音乐。 + +![](https://img.linux.net.cn/data/attachment/album/202103/17/094819ad5vzy0kqwvlxeee.jpg) + +在过去的 10 年里,我大部分时间都是远程工作,但当我走进办公室时,我坐在一个充满内向的同伴的房间里,他们很容易被环境噪音和谈话所干扰。我们发现,听音乐可以抑制办公室的噪音,让声音不那么扰人,用愉快的音乐提供一个愉快的工作环境。 + +起初,我们的一位同事带来了一些老式的有源电脑音箱,把它们连接到他的桌面电脑上,然后问我们想听什么。它可以工作,但音质不是很好,而且只有当他在办公室的时候才可以使用。接下来,我们又买了一对 Altec Lansing 音箱。音质有所改善,但没有什么灵活性。 + +不久之后,我们得到了一台通用 ARM 单板计算机(SBC),这意味着任何人都可以通过 Web 界面控制播放列表和音箱。但一块普通的 ARM 开发板意味着我们不能使用流行的音乐设备软件。由于非标准的内核,更新操作系统是一件很痛苦的事情,而且 Web 界面也经常出现故障。 + +当团队壮大并搬进更大的房间后,我们开始梦想着有更好音箱和更容易处理软件和硬件组合的方法。 + +为了用一种相对便宜、灵活、音质好的方式解决我们的问题,我们用树莓派、音箱和开源软件开发了一个办公室 HiFi。 + +### HiFi 硬件 + +用一个专门的 PC 来播放背景音乐就有点过分了。它昂贵、嘈杂(除非是静音的,但那就更贵了),而且不环保。即使是最便宜的 ARM 板也能胜任这个工作,但从软件的角度来看,它们往往存在问题。树莓派还是比较便宜的,虽然不是标准的计算机,但在硬件和软件方面都有很好的支持。 + +接下来的问题是:用什么音箱。质量好的、有源的音箱很贵。无源音箱的成本较低,但需要一个功放,这需要为这套设备增加另一个盒子。它们还必须使用树莓派的音频输出;虽然可以工作,但并不是最好的,特别是当你已经在高质量的音箱和功放上投入资金的时候。 + +幸运的是,在数以千计的树莓派硬件扩展中,有内置数字模拟转换器(DAC)的功放。我们选择了 [HiFiBerry 的 Amp][2]。它在我们买来后不久就停产了(被采样率更好的 Amp+ 型号取代),但对于我们的目的来说,它已经足够好了。在开着空调的情况下,我想无论如何你也听不出 48kHz 或 192kHz 的 DAC 有什么不同。 + +音箱方面,我们选择了 [Audioengine P4][3],是在某店家清仓大甩卖的时候买的,价格超低。它很容易让我们的办公室房间充满了声音而不失真(并且还能传到我们的房间之外,有一些失真,隔壁的工程师往往不喜欢)。 + +### HiFi 软件 + +在我们旧的通用 ARM SBC 上我们需要维护一个 Ubuntu,使用一个固定的、古老的、在软件包仓库外的系统内核,这是有问题的。树莓派操作系统包括一个维护良好的内核包,使其成为一个稳定且易于更新的基础系统,但它仍然需要我们定期更新 Python 脚本来访问 Spotify 和 YouTube。对于我们的目的来说,这有点过于高维护。 + +幸运的是,使用树莓派作为基础意味着有许多现成的软件设备可用。 + +我们选择了 [Volumio][4],这是一个将树莓派变成音乐播放设备的开源项目。安装是一个简单的*一步步完成*的过程。安装和升级是完全无痛的,而不用辛辛苦苦地安装和维护一个操作系统,并定期调试破损的 Python 代码。配置 HiFiBerry 功放不需要编辑任何配置文件,你只需要从列表中选择即可。当然,习惯新的用户界面需要一定的时间,但稳定性和维护的便捷性让这个改变是值得的。 + +![Volumio interface][5] + +### 播放音乐并体验 + +虽然大流行期间我们都在家里办公,不过我把办公室的 HiFi 安装在我的家庭办公室里,这意味着我可以自由支配它的运行。一个不断变化的用户界面对于一个团队来说会很痛苦,但对于一个有研发背景的人来说,自己玩一个设备,变化是很有趣的。 + +我不是一个程序员,但我有很强的 Linux 和 Unix 系统管理背景。这意味着,虽然我觉得修复坏掉的 Python 代码很烦人,但 Volumio 对我来说却足够完美,足够无聊(这是一个很好的“问题”)。幸运的是,在树莓派上播放音乐还有很多其他的可能性。 + +作为一个终端狂人(我甚至从终端窗口启动 LibreOffice),我主要使用 Music on Console([MOC][6])来播放我的网络存储(NAS)中的音乐。我有几百张 CD,都转换成了 [FLAC][7] 文件。而且我还从 [BandCamp][8] 或 [Society of Sound][9] 等渠道购买了许多数字专辑。 + +另一个选择是 [音乐播放器守护进程(MPD)][10]。把它运行在树莓派上,我可以通过网络使用 Linux 和 Android 的众多客户端之一与我的音乐进行远程交互。 + +### 音乐不停歇 + +正如你所看到的,创建一个廉价的 HiFi 系统在软件和硬件方面几乎是无限可能的。我们的解决方案只是众多解决方案中的一个,我希望它能启发你建立适合你环境的东西。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/raspberry-pi-hifi + +作者:[Peter Czanik][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/czanik +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/hi-fi-stereo-vintage.png?itok=KYY3YQwE (HiFi vintage stereo) +[2]: https://www.hifiberry.com/products/amp/ +[3]: https://audioengineusa.com/shop/passivespeakers/p4-passive-speakers/ +[4]: https://volumio.org/ +[5]: https://opensource.com/sites/default/files/uploads/volumeio.png (Volumio interface) +[6]: https://en.wikipedia.org/wiki/Music_on_Console +[7]: https://xiph.org/flac/ +[8]: https://bandcamp.com/ +[9]: https://realworldrecords.com/news/society-of-sound-statement/ +[10]: https://www.musicpd.org/ diff --git a/published/202103/20210118 KDE Customization Guide- Here are 11 Ways You Can Change the Look and Feel of Your KDE-Powered Linux Desktop.md b/published/202103/20210118 KDE Customization Guide- Here are 11 Ways You Can Change the Look and Feel of Your KDE-Powered Linux Desktop.md new file mode 100644 index 0000000000..5f5ced02d5 --- /dev/null +++ b/published/202103/20210118 KDE Customization Guide- Here are 11 Ways You Can Change the Look and Feel of Your KDE-Powered Linux Desktop.md @@ -0,0 +1,171 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13172-1.html) +[#]: subject: (KDE Customization Guide: Here are 11 Ways You Can Change the Look and Feel of Your KDE-Powered Linux Desktop) +[#]: via: (https://itsfoss.com/kde-customization/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +KDE 桌面环境定制指南 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/03/234801udzaled8erltd78u.jpg) + +[KDE Plasma 桌面][1] 无疑是定制化的巅峰,因为你几乎可以改变任何你想要的东西。你甚至可以让它充当 [平铺窗口管理器][2]。 + +KDE Plasma 提供的定制化程度会让初学者感到困惑。用户会迷失在层层深入的选项之中。 + +为了解决这个问题,我将向你展示你应该注意的 KDE Plasma 定制的关键点。这里有 11 种方法可以改变你的 KDE 桌面的外观和感觉。 + +![][3] + +### 定制 KDE Plasma + +我在本教程中使用了 [KDE Neon][4],但你可以在任何使用 KDE Plasma 桌面的发行版中遵循这些方法。 + +#### 1、Plasma 桌面小工具 + +桌面小工具可以增加用户体验的便利性,因为你可以立即访问桌面上的重要项目。 + +现在学生和专业人士使用电脑的时候越来越多,其中一个有用的小部件是便签。 + +右键点击桌面,选择“添加小工具Add Widgets”。 + +![][5] + +选择你喜欢的小部件,然后简单地将其拖放到桌面上。 + +![][6] + +#### 2、桌面壁纸 + +不用说,更换壁纸可以改变桌面的外观。 + +![][7] + +在“壁纸Wallpaper”选项卡中,你可以改变的不仅仅是壁纸。从“布局Layout”下拉菜单中,你还可以选择桌面是否放置图标。 + +“文件夹视图Folder View”布局的命名来自于主目录中的传统桌面文件夹,你可以在那里访问你的桌面文件。因此,“文件夹视图Folder View”选项将保留桌面上的图标。 + +如果你选择“桌面Desktop”布局,它会使你的桌面图标保持自由而普通。当然,你仍然可以访问主目录下的桌面文件夹。 + +![][8] + +在“壁纸类型Wallpaper Type”中,你可以选择是否要壁纸,是静止的还是变化的,最后在“位置Positioning”中,选择它在屏幕上的样子。 + +#### 3、鼠标动作 + +每一个鼠标按键都可以配置为以下动作之一: + + * 切换窗口Switch Window + * 切换桌面Switch Desktop + * 粘贴Paste + * 标准菜单Standard Menu + * 应用程序启动器Application Launcher + * 切换活动区Switch Activity + +右键默认设置为标准菜单Standard Menu,也就是在桌面上点击右键时的菜单。点击旁边的设置图标可以更改动作。 + +![][9] + +#### 4、桌面内容的位置 + +只有在壁纸选项卡中选择“文件夹视图”时,该选项才可用。默认情况下,桌面上显示的内容是你在主目录下的“桌面Desktop”文件夹中的内容。这个位置选项卡让你可以选择不同的文件夹来改变桌面上的内容。 + +![][10] + +#### 5、桌面图标 + +在这里,你可以选择图标的排列方式(水平或垂直)、左右对齐、排序标准及其大小。如果这些还不够,你还可以探索其他的美学功能。 + +![][11] + +#### 6、桌面过滤器 + +让我们坦然面对自己吧! 相信每个用户最后都会在某些时候出现桌面凌乱的情况。如果你的桌面变得乱七八糟,找不到文件,你可以按名称或类型应用过滤器,找到你需要的文件。虽然,最好是养成一个良好的文件管理习惯! + +![][12] + +#### 7、应用仪表盘 + +如果你喜欢 GNOME 3 的应用程序启动器,那么你可以试试 KDE 应用程序仪表板。你所要做的就是右击菜单图标 > “显示替代品Show Alternatives”。 + +![][13] + +点击“应用仪表盘Application Dashboard”。 + +![][14] + +#### 8、窗口管理器主题 + +就像你在 [Xfce 自定义教程][15] 中看到的那样,你也可以在 KDE 中独立改变窗口管理器的主题。这样你就可以为面板选择一种主题,为窗口管理器选择另外一种主题。如果预装的主题不够用,你可以下载更多的主题。 + +不过受 [MX Linux][16] Xfce 版的启发,我还是忍不住选择了我最喜欢的 “Arc Dark”。 + +导航到“设置Settings” > “应用风格Application Style” > “窗口装饰Window decorations” > “主题Theme”。 + +![][17] + +#### 9、全局主题 + +如上所述,KDE Plasma 面板的外观和感觉可以从“设置Settings” > “全局主题Global theme”选项卡中进行配置。预装的主题数量并不多,但你可以下载一个适合自己口味的主题。不过默认的 “Breeze Dark” 是一款养眼的主题。 + +![][18] + +#### 10、系统图标 + +系统图标样式对桌面的外观有很大的影响。无论你选择哪一种,如果你的全局主题是深色的,你应该选择深色图标版本。唯一的区别在于图标文字对比度上,图标文字对比度应该与面板颜色反色,使其具有可读性。你可以在系统设置中轻松访问“图标Icons”标签。 + +![][19] + +#### 11、系统字体 + +系统字体并不是定制的重点,但如果你每天有一半的时间都在屏幕前,它可能是眼睛疲劳的因素之一。有阅读障碍的用户会喜欢 [OpenDyslexic][20] 字体。我个人选择的是 Ubuntu 字体,不仅我觉得美观,而且是在屏幕前度过一天的好字体。 + +当然,你也可以通过下载外部资源来 [在 Linux 系统上安装更多的字体][21]。 + +![][22] + +### 总结 + +KDE Plasma 是 Linux 社区最灵活和可定制的桌面之一。无论你是否是一个修理工,KDE Plasma 都是一个不断发展的桌面环境,具有惊人的现代功能。更好的是,它也可以在性能中等的系统配置上进行管理。 + +现在,我试图让本指南对初学者友好。当然,可以有更多的高级定制,比如那个 [窗口切换动画][23]。如果你知道一些别的技巧,为什么不在评论区与我们分享呢? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kde-customization/ + +作者:[Dimitrios Savvopoulos][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://kde.org/plasma-desktop/ +[2]: https://github.com/kwin-scripts/kwin-tiling +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/kde-neon-neofetch.png?resize=800%2C600&ssl=1 +[4]: https://itsfoss.com/kde-neon-review/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/16-kde-neon-add-widgets.png?resize=800%2C500&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/17-kde-neon-widgets.png?resize=800%2C768&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/1-kde-neon-configure-desktop.png?resize=800%2C500&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/2-kde-neon-wallpaper.png?resize=800%2C600&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/3-kde-neon-mouse-actions.png?resize=800%2C600&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/10-kde-neon-location.png?resize=800%2C650&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/4-kde-neon-desktop-icons.png?resize=798%2C635&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/11-kde-neon-desktop-icons-filter.png?resize=800%2C650&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/5-kde-neon-show-alternatives.png?resize=800%2C500&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/6-kde-neon-application-dashboard.png?resize=800%2C450&ssl=1 +[15]: https://itsfoss.com/customize-xfce/ +[16]: https://itsfoss.com/mx-linux-kde-edition/ +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/12-kde-neon-window-manager.png?resize=800%2C512&ssl=1 +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/15-kde-neon-global-theme.png?resize=800%2C524&ssl=1 +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/13-kde-neon-system-icons.png?resize=800%2C524&ssl=1 +[20]: https://www.opendyslexic.org/about +[21]: https://itsfoss.com/install-fonts-ubuntu/ +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/14-kde-neon-fonts.png?resize=800%2C524&ssl=1 +[23]: https://itsfoss.com/customize-task-switcher-kde/ diff --git a/published/202103/20210121 Convert your Windows install into a VM on Linux.md b/published/202103/20210121 Convert your Windows install into a VM on Linux.md new file mode 100644 index 0000000000..5262d6d8b6 --- /dev/null +++ b/published/202103/20210121 Convert your Windows install into a VM on Linux.md @@ -0,0 +1,244 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13240-1.html) +[#]: subject: (Convert your Windows install into a VM on Linux) +[#]: via: (https://opensource.com/article/21/1/virtualbox-windows-linux) +[#]: author: (David Both https://opensource.com/users/dboth) + +在 Linux 上将你的 Windows 系统转换为虚拟机 +====== + +> 下面是我如何配置 VirtualBox 虚拟机以在我的 Linux 工作站上使用物理的 Windows 操作系统。 + +![](https://img.linux.net.cn/data/attachment/album/202103/27/105053kyd66r1cpr1s2vz2.jpg) + +我经常使用 VirtualBox 来创建虚拟机来测试新版本的 Fedora、新的应用程序和很多管理工具,比如 Ansible。我甚至使用 VirtualBox 来测试创建一个 Windows 访客主机。 + +我从来没有在我的任何一台个人电脑上使用 Windows 作为我的主要操作系统,甚至也没在虚拟机中执行过一些用 Linux 无法完成的冷门任务。不过,我确实为一个需要使用 Windows 下的财务程序的组织做志愿者。这个程序运行在办公室经理的电脑上,使用的是预装的 Windows 10 Pro。 + +这个财务应用程序并不特别,[一个更好的 Linux 程序][2] 可以很容易地取代它,但我发现许多会计和财务主管极不愿意做出改变,所以我还没能说服我们组织中的人迁移。 + +这一系列的情况,加上最近的安全恐慌,使得我非常希望将运行 Windows 的主机转换为 Fedora,并在该主机上的虚拟机中运行 Windows 和会计程序。 + +重要的是要明白,我出于多种原因极度不喜欢 Windows。主要原因是,我不愿意为了在新的虚拟机上安装它而再花钱购买一个 Windows 许可证(Windows 10 Pro 大约需要 200 美元)。此外,Windows 10 在新系统上设置时或安装后需要足够的信息,如果微软的数据库被攻破,破解者就可以窃取一个人的身份。任何人都不应该为了注册软件而需要提供自己的姓名、电话号码和出生日期。 + +### 开始 + +这台实体电脑已经在主板上唯一可用的 m.2 插槽中安装了一个 240GB 的 NVMe m.2 的 SSD 存储设备。我决定在主机上安装一个新的 SATA SSD,并将现有的带有 Windows 的 SSD 作为 Windows 虚拟机的存储设备。金士顿在其网站上对各种 SSD 设备、外形尺寸和接口做了很好的概述。 + +这种方法意味着我不需要重新安装 Windows 或任何现有的应用软件。这也意味着,在这台电脑上工作的办公室经理将使用 Linux 进行所有正常的活动,如电子邮件、访问 Web、使用 LibreOffice 创建文档和电子表格。这种方法增加了主机的安全性。唯一会使用 Windows 虚拟机的时间是运行会计程序。 + +### 先备份 + +在做其他事情之前,我创建了整个 NVMe 存储设备的备份 ISO 镜像。我在 500GB 外置 USB 存储盘上创建了一个分区,在其上创建了一个 ext4 文件系统,然后将该分区挂载到 `/mnt`。我使用 `dd` 命令来创建镜像。 + +我在主机中安装了新的 500GB SATA SSD,并从临场live USB 上安装了 Fedora 32 Xfce 偏好版spin。在安装后的初次重启时,在 GRUB2 引导菜单上,Linux 和 Windows 操作系统都是可用的。此时,主机可以在 Linux 和 Windows 之间进行双启动。 + +### 在网上寻找帮助 + +现在我需要一些关于创建一个使用物理硬盘或 SSD 作为其存储设备的虚拟机的信息。我很快就在 VirtualBox 文档和互联网上发现了很多关于如何做到这一点的信息。虽然 VirtualBox 文档初步帮助了我,但它并不完整,遗漏了一些关键信息。我在互联网上找到的大多数其他信息也很不完整。 + +在我们的记者 Joshua Holm 的帮助下,我得以突破这些残缺的信息,并以一个可重复的流程来完成这项工作。 + +### 让它发挥作用 + +这个过程其实相当简单,虽然需要一个玄妙的技巧才能实现。当我准备好这一步的时候,Windows 和 Linux 操作系统已经到位了。 + +首先,我在 Linux 主机上安装了最新版本的 VirtualBox。VirtualBox 可以从许多发行版的软件仓库中安装,也可以直接从 Oracle VirtualBox 仓库中安装,或者从 VirtualBox 网站上下载所需的包文件并在本地安装。我选择下载 AMD64 版本,它实际上是一个安装程序而不是一个软件包。我使用这个版本来规避一个与这个特定项目无关的问题。 + +安装过程总是在 `/etc/group` 中创建一个 `vboxusers` 组。我把打算运行这个虚拟机的用户添加到 `/etc/group` 中的 `vboxusers` 和 `disk` 组。将相同的用户添加到 `disk` 组是很重要的,因为 VirtualBox 是以启动它的用户身份运行的,而且还需要直接访问 `/dev/sdx` 特殊设备文件才能在这种情况下工作。将用户添加到 `disk` 组可以提供这种级别的访问权限,否则他们就不会有这种权限。 + +然后,我创建了一个目录来存储虚拟机,并赋予它 `root.vboxusers` 的所有权和 `775` 的权限。我使用 `/vms` 用作该目录,但可以是任何你想要的目录。默认情况下,VirtualBox 会在创建虚拟机的用户的子目录中创建新的虚拟机。这将使多个用户之间无法共享对虚拟机的访问,从而不会产生巨大的安全漏洞。将虚拟机目录放置在一个可访问的位置,可以共享虚拟机。 + +我以非 root 用户的身份启动 VirtualBox 管理器。然后,我使用 VirtualBox 的“偏好Preferences => 一般General”菜单将“默认机器文件夹Default Machine Folder”设置为 `/vms` 目录。 + +我创建的虚拟机没有虚拟磁盘。“类型Type” 应该是 `Windows`,“版本Version”应该设置为 `Windows 10 64-bit`。为虚拟机设置一个合理的内存量,但只要虚拟机处于关闭状态,以后可以更改。在安装的“硬盘Hard disk”页面,我选择了 “不要添加虚拟硬盘Do not add a virtual hard disk”,点击“创建Create”。新的虚拟机出现在VirtualBox 管理器窗口中。这个过程也创建了 `/vms/Test1` 目录。 + +我使用“高级Advanced”菜单在一个页面上设置了所有的配置,如图 1 所示。“向导模式Guided Mode”可以获得相同的信息,但需要更多的点击,以通过一个窗口来进行每个配置项目。它确实提供了更多的帮助内容,但我并不需要。 + +![VirtualBox 对话框:创建新的虚拟机,但不添加硬盘][3] + +*图 1:创建一个新的虚拟机,但不要添加硬盘。* + +然后,我需要知道 Linux 给原始 Windows 硬盘分配了哪个设备。在终端会话中以 root 身份使用 `lshw` 命令来发现 Windows 磁盘的设备分配情况。在本例中,代表整个存储设备的设备是 `/dev/sdb`。 + +``` +# lshw -short -class disk,volume +H/W path           Device      Class          Description +========================================================= +/0/100/17/0        /dev/sda    disk           500GB CT500MX500SSD1 +/0/100/17/0/1                  volume         2047MiB Windows FAT volume +/0/100/17/0/2      /dev/sda2   volume         4GiB EXT4 volume +/0/100/17/0/3      /dev/sda3   volume         459GiB LVM Physical Volume +/0/100/17/1        /dev/cdrom  disk           DVD+-RW DU-8A5LH +/0/100/17/0.0.0    /dev/sdb    disk           256GB TOSHIBA KSG60ZMV +/0/100/17/0.0.0/1  /dev/sdb1   volume         649MiB Windows FAT volume +/0/100/17/0.0.0/2  /dev/sdb2   volume         127MiB reserved partition +/0/100/17/0.0.0/3  /dev/sdb3   volume         236GiB Windows NTFS volume +/0/100/17/0.0.0/4  /dev/sdb4   volume         989MiB Windows NTFS volume +[root@office1 etc]# +``` + +VirtualBox 不需要把虚拟存储设备放在 `/vms/Test1` 目录中,而是需要有一种方法来识别要从其启动的物理硬盘。这种识别是通过创建一个 `*.vmdk` 文件来实现的,该文件指向将作为虚拟机存储设备的原始物理磁盘。作为非 root 用户,我创建了一个 vmdk 文件,指向整个 Windows 设备 `/dev/sdb`。 + +``` +$ VBoxManage internalcommands createrawvmdk -filename /vms/Test1/Test1.vmdk -rawdisk /dev/sdb +RAW host disk access VMDK file /vms/Test1/Test1.vmdk created successfully. +``` + +然后,我使用 VirtualBox 管理器 “文件File => 虚拟介质管理器Virtual Media Manager” 对话框将 vmdk 磁盘添加到可用硬盘中。我点击了“添加Add”,文件管理对话框中显示了默认的 `/vms` 位置。我选择了 `Test1` 目录,然后选择了 `Test1.vmdk` 文件。然后我点击“打开Open”,`Test1.vmdk` 文件就显示在可用硬盘列表中。我选择了它,然后点击“关闭Close”。 + +下一步就是将这个 vmdk 磁盘添加到我们的虚拟机的存储设备中。在 “Test1 VM” 的设置菜单中,我选择了 “存储Storage”,并点击了添加硬盘的图标。这时打开了一个对话框,在一个名为“未连接Not attached”的列表中显示了 `Test1vmdk` 虚拟磁盘文件。我选择了这个文件,并点击了“选择Choose”按钮。这个设备现在显示在连接到 “Test1 VM” 的存储设备列表中。这个虚拟机上唯一的其他存储设备是一个空的 CD/DVD-ROM 驱动器。 + +我点击了“确定OK”,完成了将此设备添加到虚拟机中。 + +在新的虚拟机工作之前,还有一个项目需要配置。使用 VirtualBox 管理器设置对话框中的 “Test1 VM”,我导航到 “系统System => 主板Motherboard”页面,并在 “启用 EFIEnable EFI”的方框中打上勾。如果你不这样做,当你试图启动这个虚拟机时,VirtualBox 会产生一个错误,说明它无法找到一个可启动的介质。 + +现在,虚拟机从原始的 Windows 10 硬盘驱动器启动。然而,我无法登录,因为我在这个系统上没有一个常规账户,而且我也无法获得 Windows 管理员账户的密码。 + +### 解锁驱动器 + +不,本节并不是要破解硬盘的加密,而是要绕过众多 Windows 管理员账户之一的密码,而这些账户是不属于组织中某个人的。 + +尽管我可以启动 Windows 虚拟机,但我无法登录,因为我在该主机上没有账户,而向人们索要密码是一种可怕的安全漏洞。尽管如此,我还是需要登录这个虚拟机来安装 “VirtualBox Guest Additions”,它可以提供鼠标指针的无缝捕捉和释放,允许我将虚拟机调整到大于 1024x768 的大小,并在未来进行正常的维护。 + +这是一个完美的用例,Linux 的功能就是更改用户密码。尽管我是访问之前的管理员的账户来启动,但在这种情况下,他不再支持这个系统,我也无法辨别他的密码或他用来生成密码的模式。我就直接清除了上一个系统管理员的密码。 + +有一个非常不错的开源软件工具,专门用于这个任务。在 Linux 主机上,我安装了 `chntpw`,它的意思大概是:“更改 NT 的密码”。 + +``` +# dnf -y install chntpw +``` + +我关闭了虚拟机的电源,然后将 `/dev/sdb3` 分区挂载到 `/mnt` 上。我确定 `/dev/sdb3` 是正确的分区,因为它是我在之前执行 `lshw` 命令的输出中看到的第一个大的 NTFS 分区。一定不要在虚拟机运行时挂载该分区,那样会导致虚拟机存储设备上的数据严重损坏。请注意,在其他主机上分区可能有所不同。 + +导航到 `/mnt/Windows/System32/config` 目录。如果当前工作目录(PWD)不在这里,`chntpw` 实用程序就无法工作。请启动该程序。 + +``` +# chntpw -i SAM +chntpw version 1.00 140201, (c) Petter N Hagen +Hive name (from header): <\SystemRoot\System32\Config\SAM> +ROOT KEY at offset: 0x001020 * Subkey indexing type is: 686c +File size 131072 [20000] bytes, containing 11 pages (+ 1 headerpage) +Used for data: 367/44720 blocks/bytes, unused: 14/24560 blocks/bytes. + +<>========<> chntpw Main Interactive Menu <>========<> + +Loaded hives: + + 1 - Edit user data and passwords + 2 - List groups + - - - + 9 - Registry editor, now with full write support! + q - Quit (you will be asked if there is something to save) + + +What to do? [1] -> +``` + +`chntpw` 命令使用 TUI(文本用户界面),它提供了一套菜单选项。当选择其中一个主要菜单项时,通常会显示一个次要菜单。按照明确的菜单名称,我首先选择了菜单项 `1`。 + +``` +What to do? [1] -> 1 + +===== chntpw Edit User Info & Passwords ==== + +| RID -|---------- Username ------------| Admin? |- Lock? --| +| 01f4 | Administrator | ADMIN | dis/lock | +| 03eb | john | ADMIN | dis/lock | +| 01f7 | DefaultAccount | | dis/lock | +| 01f5 | Guest | | dis/lock | +| 01f8 | WDAGUtilityAccount | | dis/lock | + +Please enter user number (RID) or 0 to exit: [3e9] +``` + +接下来,我选择了我们的管理账户 `john`,在提示下输入 RID。这将显示用户的信息,并提供额外的菜单项来管理账户。 + +``` +Please enter user number (RID) or 0 to exit: [3e9] 03eb +================= USER EDIT ==================== + +RID : 1003 [03eb] +Username: john +fullname: +comment : +homedir : + +00000221 = Users (which has 4 members) +00000220 = Administrators (which has 5 members) + +Account bits: 0x0214 = +[ ] Disabled | [ ] Homedir req. | [ ] Passwd not req. | +[ ] Temp. duplicate | [X] Normal account | [ ] NMS account | +[ ] Domain trust ac | [ ] Wks trust act. | [ ] Srv trust act | +[X] Pwd don't expir | [ ] Auto lockout | [ ] (unknown 0x08) | +[ ] (unknown 0x10) | [ ] (unknown 0x20) | [ ] (unknown 0x40) | + +Failed login count: 0, while max tries is: 0 +Total login count: 47 + +- - - - User Edit Menu: + 1 - Clear (blank) user password + 2 - Unlock and enable user account [probably locked now] + 3 - Promote user (make user an administrator) + 4 - Add user to a group + 5 - Remove user from a group + q - Quit editing user, back to user select +Select: [q] > 2 +``` + +这时,我选择了菜单项 `2`,“解锁并启用用户账户Unlock and enable user account”,这样就可以删除密码,使我可以不用密码登录。顺便说一下 —— 这就是自动登录。然后我退出了该程序。在继续之前,一定要先卸载 `/mnt`。 + +我知道,我知道,但为什么不呢! 我已经绕过了这个硬盘和主机的安全问题,所以一点也不重要。这时,我确实登录了旧的管理账户,并为自己创建了一个新的账户,并设置了安全密码。然后,我以自己的身份登录,并删除了旧的管理账户,这样别人就无法使用了。 + +网上也有 Windows Administrator 账号的使用说明(上面列表中的 `01f4`)。如果它不是作为组织管理账户,我可以删除或更改该账户的密码。还要注意的是,这个过程也可以从目标主机上运行临场 USB 来执行。 + +### 重新激活 Windows + +因此,我现在让 Windows SSD 作为虚拟机在我的 Fedora 主机上运行了。然而,令人沮丧的是,在运行了几个小时后,Windows 显示了一条警告信息,表明我需要“激活 Windows”。 + +在看了许许多多的死胡同网页之后,我终于放弃了使用现有激活码重新激活的尝试,因为它似乎已经以某种方式被破坏了。最后,当我试图进入其中一个在线虚拟支持聊天会话时,虚拟的“获取帮助”应用程序显示我的 Windows 10 Pro 实例已经被激活。这怎么可能呢?它一直希望我激活它,然而当我尝试时,它说它已经被激活了。 + +### 或者不 + +当我在三天内花了好几个小时做研究和实验时,我决定回到原来的 SSD 启动到 Windows 中,以后再来处理这个问题。但后来 Windows —— 即使从原存储设备启动,也要求重新激活。 + +在微软支持网站上搜索也无济于事。在不得不与之前一样的自动支持大费周章之后,我拨打了提供的电话号码,却被自动响应系统告知,所有对 Windows 10 Pro 的支持都只能通过互联网提供。到现在,我已经晚了将近一天才让电脑运行起来并安装回办公室。 + +### 回到未来 + +我终于吸了一口气,购买了一份 Windows 10 Home,大约 120 美元,并创建了一个带有虚拟存储设备的虚拟机,将其安装在上面。 + +我将大量的文档和电子表格文件复制到办公室经理的主目录中。我重新安装了一个我们需要的 Windows 程序,并与办公室经理验证了它可以工作,数据都在那里。 + +### 总结 + +因此,我的目标达到了,实际上晚了一天,花了 120 美元,但使用了一种更标准的方法。我仍在对权限进行一些调整,并恢复 Thunderbird 通讯录;我有一些 CSV 备份,但 `*.mab` 文件在 Windows 驱动器上包含的信息很少。我甚至用 Linux 的 `find` 命令来定位原始存储设备上的所有。 + +我走了很多弯路,每次都要自己重新开始。我遇到了一些与这个项目没有直接关系的问题,但却影响了我的工作。这些问题包括一些有趣的事情,比如把 Windows 分区挂载到我的 Linux 机器的 `/mnt` 上,得到的信息是该分区已经被 Windows 不正确地关闭(是的,在我的 Linux 主机上),并且它已经修复了不一致的地方。即使是 Windows 通过其所谓的“恢复”模式多次重启后也做不到这一点。 + +也许你从 `chntpw` 工具的输出数据中发现了一些线索。出于安全考虑,我删掉了主机上显示的其他一些用户账号,但我从这些信息中看到,所有的用户都是管理员。不用说,我也改了。我仍然对我遇到的糟糕的管理方式感到惊讶,但我想我不应该这样。 + +最后,我被迫购买了一个许可证,但这个许可证至少比原来的要便宜一些。我知道的一点是,一旦我找到了所有必要的信息,Linux 这一块就能完美地工作。问题是处理 Windows 激活的问题。你们中的一些人可能已经成功地让 Windows 重新激活了。如果是这样,我还是想知道你们是怎么做到的,所以请把你们的经验添加到评论中。 + +这是我不喜欢 Windows,只在自己的系统上使用 Linux 的又一个原因。这也是我将组织中所有的计算机都转换为 Linux 的原因之一。只是需要时间和说服力。我们只剩下这一个会计程序了,我需要和财务主管一起找到一个适合她的程序。我明白这一点 —— 我喜欢自己的工具,我需要它们以一种最适合我的方式工作。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/virtualbox-windows-linux + +作者:[David Both][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/dboth +[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://opensource.com/article/20/7/godbledger +[3]: https://opensource.com/sites/default/files/virtualbox.png diff --git a/published/202103/20210204 5 Tweaks to Customize the Look of Your Linux Terminal.md b/published/202103/20210204 5 Tweaks to Customize the Look of Your Linux Terminal.md new file mode 100644 index 0000000000..6170252cc3 --- /dev/null +++ b/published/202103/20210204 5 Tweaks to Customize the Look of Your Linux Terminal.md @@ -0,0 +1,243 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13181-1.html) +[#]: subject: (5 Tweaks to Customize the Look of Your Linux Terminal) +[#]: via: (https://itsfoss.com/customize-linux-terminal/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +定制你的 Linux 终端外观的 5 项调整 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/06/232911eg4g65gp4g2ww24u.jpg) + +终端仿真器(或简称终端)是任何 Linux 发行版中不可或缺的一部分。 + +当你改变发行版的主题时,往往终端也会自动得到改造。但这并不意味着你不能进一步定制终端。 + +事实上,很多读者都问过我们,为什么我们截图或视频中的终端看起来那么酷,我们用的是什么字体等等。 + +为了回答这个经常被问到的问题,我将向你展示一些简单或复杂的调整来改变终端的外观。你可以在下图中对比一下视觉上的差异: + +![][1] + +### 自定义 Linux 终端 + +本教程利用 Pop!_OS 上的 GNOME 终端来定制和调整终端的外观。但是,大多数建议也应该适用于其他终端。 + +对于大多数元素,如颜色、透明度和字体,你可以利用 GUI 来调整它,而不需要输入任何特殊的命令。 + +打开你的终端。在右上角寻找汉堡菜单。在这里,点击 “偏好设置”,如下图所示: + +![][2] + +在这里你可以找到改变终端外观的所有设置。 + +#### 技巧 0:使用独立的终端配置文件进行定制 + +我建议你建立一个新的配置文件用于你的定制。为什么要这样做?因为这样一来,你的改变就不会影响到终端的主配置文件。假设你做了一些奇怪的改变,却想不起默认值?配置文件有助于分离你的定制。 + +如你所见,我有个单独的配置文件,用于截图和制作视频。 + +![终端配置文件][3] + +你可以轻松地更改终端配置文件,并使用新的配置文件打开一个新的终端窗口。 + +![更改终端配置文件][4] + +这就是我想首先提出的建议。现在,让我们看看这些调整。 + +#### 技巧 1:使用深色/浅色终端主题 + +你可以改变系统主题,终端主题也会随之改变。除此之外,如果你不想改变系统主题。你也可以切换终端的深色主题或浅色主题, + +一旦你进入“偏好设置”,你会注意到在“常规”选项中可以改变主题和其他设置。 + +![][5] + +#### 技巧 2:改变字体和大小 + +选择你要自定义的配置文件。现在你可以选择自定义文本外观、字体大小、字体样式、间距、光标形状,还可以切换终端铃声。 + +对于字体,你只能改成你系统上可用的字体。如果你想要不同的字体,请先在你的 Linux 系统上下载并安装字体。 + +还有一点! 要使用等宽字体,否则字体可能会重叠,文字可能无法清晰阅读。如果你想要一些建议,可以选择 [Share Tech Mono][6](开源)或 [Larabiefont][7](不开源)。 + +在“文本”选项卡下,选择“自定义字体”,然后更改字体及其大小(如果需要)。 + +![][8] + +#### 技巧 3:改变调色板和透明度 + +除了文字和间距,你还可以进入“颜色”选项,改变终端的文字和背景的颜色。你还可以调整透明度,让它看起来更酷。 + +正如你所注意到的那样,你可以从一组预先配置的选项中选择调色板,也可以自己调整。 + +![][9] + +如果你想和我一样启用透明,点击“使用透明背景”选项。 + +如果你想要和你的系统主题类似的颜色设置,你也可以选择使用系统主题的颜色。 + +![][10] + +#### 技巧 4:调整 bash 提示符变量 + +通常当你启动终端时,无需任何修改你就会看到你的用户名和主机名(你的发行版名称)作为 bash 提示符。 + +例如,在我的例子中,它会是 “ankushdas@pop-os:~$”。然而,我把 [主机名永久地改成了][11] “itsfoss”,所以现在看起来像这样: + +![][12] + +要改变主机名,你可以键入: + +``` +hostname 定制名称 +``` + +然而,这只适用于当前会话。因此,当你重新启动时,它将恢复到默认值。要永久地更改主机名,你需要输入: + +``` +sudo hostnamectl set-hostname 定制名称 +``` + +同样,你也可以改变你的用户名,但它需要一些额外的配置,包括杀死所有与活动用户名相关联的当前进程,所以我们会跳过用它来改变终端的外观/感觉。 + +#### 技巧 5:不推荐:改变 bash 提示符的字体和颜色(面向高级用户) + +然而,你可以使用命令调整 bash 提示符的字体和颜色。 + +你需要利用 `PS1` 环境变量来控制提示符的显示内容。你可以在 [手册页][14] 中了解更多关于它的信息。 + +例如,当你键入: + +``` +echo $PS1 +``` + +在我这里输出: + +``` +\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ +``` + +我们需要关注的是该输出的第一部分: + +``` +\[\e]0;\u@\h: \w\a\]$ +``` + +在这里,你需要知道以下几点: + + * `\e` 是一个特殊的字符,表示一个颜色序列的开始。 + * `\u` 表示用户名,后面可以跟着 `@` 符号。 + * `\h` 表示系统的主机名。 + * `\w` 表示基本目录。 + * `\a` 表示活动目录。 + * `$` 表示非 root 用户。 + +在你的情况下输出可能不一样,但变量是一样的,所以你需要根据你的输出来试验下面提到的命令。 + +在你这样做之前,请记住这些: + + * 文本格式代码:`0` 代表正常文本,`1` 代表粗体,`3` 代表斜体,`4` 代表下划线文本。 + * 背景色的颜色范围:`40` - `47`。 + * 文本颜色的颜色范围:`30` - `37`。 + +你只需要键入以下内容来改变颜色和字体: + +``` +PS1="\e[41;3;32m[\u@\h:\w\a\$]" +``` + +这是输入该命令后 bash 提示符的样子: + +![][15] + +如果你注意到这个命令,就像上面提到的,`\e` 可以帮助我们分配一个颜色序列。 + +在上面的命令中,我先分配了一个**背景色**,然后是**文字样式**,接着是**字体颜色**,然后是 `m`。这里,`m` 表示颜色序列的结束。 + +所以,你要做的就是,调整这部分: + +``` +41;3;32 +``` + +命令其余部分应该是不变的,你只需要分配不同的数字来改变背景色、文字样式和文字颜色。 + +要注意的是,这并没有特定的顺序,你可以先指定文字样式,再指定背景色,最后指定文字颜色,如 `3;41;32`,这里的命令就变成了: + +``` +PS1="\e[3;41;32m[\u@\h:\w\a\$]" +``` + +![][16] + +正如你所注意到的,无论顺序如何,颜色的定制都是一样的。所以,只要记住自定义的代码,并在你确定你想把它作为一个永久的变化之前,试试它。 + +上面我提到的命令会临时定制当前会话的 bash 提示符。如果你关闭了会话,你将失去这个自定义设置。 + +所以,要想把它变成一个永久的改变,你需要把它添加到 `.bashrc` 文件中(这是一个配置文件,每次加载会话时都会加载)。 + +![][17] + +简单键入如下命令来访问该文件: + +``` +nano ~/.bashrc +``` + +除非你明确知道你在做什么,否则不要改变任何东西。而且,为了可以恢复设置,你应该把 `PS1` 环境变量的备份(默认情况下复制粘贴其中的内容)保存到一个文本文件中。 + +所以,即使你需要默认的字体和颜色,你也可以再次编辑 `.bashrc` 文件并粘贴 `PS1` 环境变量。 + +#### 附赠技巧:根据你的墙纸改变终端的调色板 + +如果你想改变终端的背景和文字颜色,但又不知道该选哪种颜色,你可以使用一个基于 Python 的工具 Pywal,它可以 [根据你的壁纸][18] 或你提供的图片自动改变终端的颜色。 + +![][19] + +如果你有兴趣使用这个工具,我之前已经详细[介绍][18]过了。 + +### 总结 + +当然,使用 GUI 定制很容易,同时也可以更好地控制你可以改变的东西。但是,需要知道命令也是必要的,万一你开始 [使用 WSL][21] 或者使用 SSH 访问远程服务器,无论如何都可以定制你的体验。 + +你是如何定制 Linux 终端的?在评论中与我们分享你的秘方。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/customize-linux-terminal/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/default-terminal.jpg?resize=773%2C493&ssl=1 +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/linux-terminal-preferences.jpg?resize=800%2C350&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/terminal-profiles.jpg?resize=800%2C619&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/change-terminal-profile.jpg?resize=796%2C347&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/terminal-theme.jpg?resize=800%2C363&ssl=1 +[6]: https://fonts.google.com/specimen/Share+Tech+Mono +[7]: https://www.dafont.com/larabie-font.font +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/terminal-customization-1.jpg?resize=800%2C500&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/terminal-color-customization.jpg?resize=759%2C607&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/linux-terminal.jpg?resize=800%2C571&ssl=1 +[11]: https://itsfoss.com/change-hostname-ubuntu/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/itsfoss-hostname.jpg?resize=800%2C188&ssl=1 +[13]: https://itsfoss.com/cdn-cgi/l/email-protection +[14]: https://linux.die.net/man/1/bash +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/terminal-bash-prompt-customization.jpg?resize=800%2C190&ssl=1 +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/linux-terminal-customization-1s.jpg?resize=800%2C158&ssl=1 +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/bashrch-customization-terminal.png?resize=800%2C615&ssl=1 +[18]: https://itsfoss.com/pywal/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/wallpy-2.jpg?resize=800%2C442&ssl=1 +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/pywal-linux.jpg?fit=800%2C450&ssl=1 +[21]: https://itsfoss.com/install-bash-on-windows/ diff --git a/published/202103/20210204 Get started with distributed tracing using Grafana Tempo.md b/published/202103/20210204 Get started with distributed tracing using Grafana Tempo.md new file mode 100644 index 0000000000..5326ff3421 --- /dev/null +++ b/published/202103/20210204 Get started with distributed tracing using Grafana Tempo.md @@ -0,0 +1,103 @@ +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13229-1.html) +[#]: subject: (Get started with distributed tracing using Grafana Tempo) +[#]: via: (https://opensource.com/article/21/2/tempo-distributed-tracing) +[#]: author: (Annanay Agarwal https://opensource.com/users/annanayagarwal) + +使用 Grafana Tempo 进行分布式跟踪 +====== + +> Grafana Tempo 是一个新的开源、大容量分布式跟踪后端。 + +![](https://img.linux.net.cn/data/attachment/album/202103/23/221354lc1eiill7lln4lli.jpg) + +Grafana 的 [Tempo][2] 是出自 Grafana 实验室的一个简单易用、大规模的、分布式的跟踪后端。Tempo 集成了 [Grafana][3]、[Prometheus][4] 以及 [Loki][5],并且它只需要对象存储进行操作,因此成本低廉,操作简单。 + +我从一开始就参与了这个开源项目,所以我将介绍一些关于 Tempo 的基础知识,并说明为什么云原生社区会注意到它。 + +### 分布式跟踪 + +想要收集对应用程序请求的遥测数据是很常见的。但是在现在的服务器中,单个应用通常被分割为多个微服务,可能运行在几个不同的节点上。 + +分布式跟踪是一种获得关于应用的性能细粒度信息的方式,该应用程序可能由离散的服务组成。当请求到达一个应用时,它提供了该请求的生命周期的统一视图。Tempo 的分布式跟踪可以用于单体应用或微服务应用,它提供 [请求范围的信息][6],使其成为可观察性的第三个支柱(另外两个是度量和日志)。 + +接下来是一个分布式跟踪系统生成应用程序甘特图的示例。它使用 Jaeger [HotROD][7] 的演示应用生成跟踪,并把它们存到 Grafana 云托管的 Tempo 上。这个图展示了按照服务和功能划分的请求处理时间。 + +![Gantt chart from Grafana Tempo][8] + +### 减少索引的大小 + +在丰富且定义良好的数据模型中,跟踪包含大量信息。通常,跟踪后端有两种交互:使用元数据选择器(如服务名或者持续时间)筛选跟踪,以及筛选后的可视化跟踪。 + +为了加强搜索,大多数的开源分布式跟踪框架会对跟踪中的许多字段进行索引,包括服务名称、操作名称、标记和持续时间。这会导致索引很大,并迫使你使用 Elasticsearch 或者 [Cassandra][10] 这样的数据库。但是,这些很难管理,而且大规模运营成本很高,所以我在 Grafana 实验室的团队开始提出一个更好的解决方案。 + +在 Grafana 中,我们的待命调试工作流从使用指标报表开始(我们使用 [Cortex][11] 来存储我们应用中的指标,它是一个云原生基金会孵化的项目,用于扩展 Prometheus),深入研究这个问题,筛选有问题服务的日志(我们将日志存储在 Loki 中,它就像 Prometheus 一样,只不过 Loki 是存日志的),然后查看跟踪给定的请求。我们意识到,我们过滤时所需的所有索引信息都可以在 Cortex 和 Loki 中找到。但是,我们需要一个强大的集成,以通过这些工具实现跟踪的可发现性,并需要一个很赞的存储,以根据跟踪 ID 进行键值查找。 + +这就是 [Grafana Tempo][12] 项目的开始。通过专注于给定检索跟踪 ID 的跟踪,我们将 Tempo 设计为最小依赖性、大容量、低成本的分布式跟踪后端。 + +### 操作简单,性价比高 + +Tempo 使用对象存储后端,这是它唯一的依赖。它既可以被用于单一的二进制下,也可以用于微服务模式(请参考仓库中的 [例子][13],了解如何轻松上手)。使用对象存储还意味着你可以存储大量的应用程序的痕迹,而无需任何采样。这可以确保你永远不会丢弃那百万分之一的出错或具有较高延迟的请求的跟踪。 + +### 与开源工具的强大集成 + +[Grafana 7.3 包括了 Tempo 数据源][14],这意味着你可以在 Grafana UI 中可视化来自Tempo 的跟踪。而且,[Loki 2.0 的新查询特性][15] 使得 Tempo 中的跟踪更简单。为了与 Prometheus 集成,该团队正在添加对范例exemplar的支持,范例是可以添加到时间序列数据中的高基数元数据信息。度量存储后端不会对它们建立索引,但是你可以在 Grafana UI 中检索和显示度量值。尽管范例可以存储各种元数据,但是在这个用例中,存储跟踪 ID 是为了与 Tempo 紧密集成。 + +这个例子展示了使用带有请求延迟直方图的范例,其中每个范例数据点都链接到 Tempo 中的一个跟踪。 + +![Using exemplars in Tempo][16] + +### 元数据一致性 + +作为容器化应用程序运行的应用发出的遥测数据通常具有一些相关的元数据。这可以包括集群 ID、命名空间、吊舱 IP 等。这对于提供基于需求的信息是好的,但如果你能将元数据中包含的信息用于生产性的东西,那就更好了。 +  +例如,你可以使用 [Grafana 云代理将跟踪信息导入 Tempo 中][17],代理利用 Prometheus 服务发现机制轮询 Kubernetes API 以获取元数据信息,并且将这些标记添加到应用程序发出的跨域数据中。由于这些元数据也在 Loki 中也建立了索引,所以通过元数据转换为 Loki 标签选择器,可以很容易地从跟踪跳转到查看给定服务的日志。 + +下面是一个一致元数据的示例,它可用于Tempo跟踪中查看给定范围的日志。 + +![][18] + +### 云原生 + +Grafana Tempo 可以作为容器化应用,你可以在如 Kubernetes、Mesos 等编排引擎上运行它。根据获取/查询路径上的工作负载,各种服务可以水平伸缩。你还可以使用云原生的对象存储,如谷歌云存储、Amazon S3 或者 Tempo Azure 博客存储。更多的信息,请阅读 Tempo 文档中的 [架构部分][19]。 + +### 试一试 Tempo + +如果这对你和我们一样有用,可以 [克隆 Tempo 仓库][20]试一试。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/tempo-distributed-tracing + +作者:[Annanay Agarwal][a] +选题:[lujun9972][b] +译者:[RiaXu](https://github.com/ShuyRoy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/annanayagarwal +[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://grafana.com/oss/tempo/ +[3]: http://grafana.com/oss/grafana +[4]: https://prometheus.io/ +[5]: https://grafana.com/oss/loki/ +[6]: https://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html +[7]: https://github.com/jaegertracing/jaeger/tree/master/examples/hotrod +[8]: https://opensource.com/sites/default/files/uploads/tempo_gantt.png (Gantt chart from Grafana Tempo) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://opensource.com/article/19/8/how-set-apache-cassandra-cluster +[11]: https://cortexmetrics.io/ +[12]: http://github.com/grafana/tempo +[13]: https://grafana.com/docs/tempo/latest/getting-started/example-demo-app/ +[14]: https://grafana.com/blog/2020/10/29/grafana-7.3-released-support-for-the-grafana-tempo-tracing-system-new-color-palettes-live-updates-for-dashboard-viewers-and-more/ +[15]: https://grafana.com/blog/2020/11/09/trace-discovery-in-grafana-tempo-using-prometheus-exemplars-loki-2.0-queries-and-more/ +[16]: https://opensource.com/sites/default/files/uploads/tempo_exemplar.png (Using exemplars in Tempo) +[17]: https://grafana.com/blog/2020/11/17/tracing-with-the-grafana-cloud-agent-and-grafana-tempo/ +[18]: https://lh5.googleusercontent.com/vNqk-ygBOLjKJnCbTbf2P5iyU5Wjv2joR7W-oD7myaP73Mx0KArBI2CTrEDVi04GQHXAXecTUXdkMqKRq8icnXFJ7yWUEpaswB1AOU4wfUuADpRV8pttVtXvTpVVv8_OfnDINgfN +[19]: https://grafana.com/docs/tempo/latest/architecture/architecture/ +[20]: https://github.com/grafana/tempo diff --git a/published/202103/20210216 How to install Linux in 3 steps.md b/published/202103/20210216 How to install Linux in 3 steps.md new file mode 100644 index 0000000000..15f9d474fc --- /dev/null +++ b/published/202103/20210216 How to install Linux in 3 steps.md @@ -0,0 +1,144 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13164-1.html) +[#]: subject: (How to install Linux in 3 steps) +[#]: via: (https://opensource.com/article/21/2/linux-installation) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +安装 Linux,只需三步 +====== + +> 操作系统的安装看似神秘,但其实很简单。以下是成功安装 Linux 的步骤。 + +![](https://img.linux.net.cn/data/attachment/album/202103/01/084538it1188e8zeepgzyb.jpg) + +在 2021 年,有更多让人们喜欢 Linux 的理由。在这个系列中,我将分享 21 种使用 Linux 的不同理由。下面是如何安装 Linux。  + +安装一个操作系统(OS)总是令人生畏。对大多数人来说,这是一个难题。安装操作系统不能从操作系统内部进行,因为它要么没有被安装,要么即将被另一个操作系统取代,那么它是如何发生的呢?更糟糕的是,它通常会涉及到硬盘格式、安装位置、时区、用户名、密码等一系列你通常不会想到的混乱问题。Linux 发行版知道这一点,所以它们多年来一直在努力将你在操作系统安装程序中花费的时间减少到最低限度。 + +### 安装时发生了什么 + +无论你安装的是一个应用程序还是整个操作系统,*安装*的过程只是将文件从一种媒介复制到另一种媒介的一种花哨方式。不管是什么用户界面,还是用动画将安装过程伪装成多么高度专业化的东西,最终都是一回事:曾经存储在光盘或驱动器上的文件被复制到硬盘上的特定位置。 + +当安装的是一个应用程序时,放置这些文件的有效位置被高度限制在你的*文件系统*或你的操作系统知道它可以使用的硬盘驱动器的部分。这一点很重要,因为它可以将硬盘分割成不同的空间(苹果公司在本世纪初的 Bootcamp 中使用了这一技巧,允许用户将 macOS 和 Windows 安装到一个硬盘上,但作为单独的实体)。当你安装一个操作系统时,一些特殊的文件会被安装到硬盘上通常是禁区的地方。更重要的是,至少在默认情况下,你的硬盘上的所有现有数据都会被擦除,以便为新系统腾出空间,所以创建一个备份是*必要的*。 + +### 安装程序 + +从技术上讲,你实际上不需要用安装程序来安装应用程序甚至操作系统。不管你信不信,有些人通过挂载一块空白硬盘、编译代码并复制文件来手动安装 Linux。这是在一个名为 [Linux From Scratch(LFS)][2] 的项目的帮助下完成的。这个项目旨在帮助爱好者、学生和未来的操作系统设计者更多地了解计算机的工作原理以及每个组件执行的功能。这并不是安装 Linux 的推荐方法,但你会发现,在开源中,通常是这样的:*如果*有些事情可以做,那么就有人在做。而这也是一件好事,因为这些小众的兴趣往往会带来令人惊讶的有用的创新。 + +假设你不是想对 Linux 进行逆向工程,那么正常的安装方式是使用安装光盘或镜像。 + +### 3 个简单的步骤来安装 Linux + +当你从一个 Linux 安装 DVD 或 U 盘启动时,你会置身于一个最小化的操作环境中,这个环境是为了运行一个或多个有用的应用程序。安装程序是最主要的应用程序,但由于 Linux 是一个如此灵活的系统,你通常也可以运行标准的桌面应用程序,以在你决定安装它之前感受一下这个操作系统是什么样子的。 + +不同的 Linux 发行版有不同的安装程序界面。下面是两个例子。 + +Fedora Linux 有一个灵活的安装程序(称为 Anaconda),能够进行复杂的系统配置: + +![Fedora 上的 Anaconda 安装界面][3] + +*Fedora 上的 Anaconda 安装程序* + +Elementary OS 有一个简单的安装程序,主要是为了在个人电脑上安装而设计的: + +![Elementary OS 安装程序][4] + +*Elementary OS 安装程序* + +#### 1、获取安装程序 + +安装 Linux 的第一步是下载一个安装程序。你可以从你选择尝试的发行版中获得一个 Linux 安装镜像。 + + * [Fedora][5] 以率先更新软件而闻名。 + * [Linux Mint][6] 提供了安装缺失驱动程序的简易选项。 + * [Elementary][7] 提供了一个美丽的桌面体验和几个特殊的、定制的应用程序。 + +Linux 安装程序是 `.iso` 文件,是 DVD 介质的“蓝图”。如果你还在使用光学介质,你可以把 `.iso` 文件刻录到 DVD-R 上,或者你可以把它烧录到 U 盘上(确保它是一个空的 U 盘,因为当镜像被烧录到它上时,它的所有内容都会被删除)。要将镜像烧录到 U 盘上,你可以 [使用开源的 Etcher 应用程序][8]。 + +![Etcher 用于烧录 U 盘][9] + +*Etcher 应用程序可以烧录 U 盘。* + +现在你可以安装 Linux 了。 + +#### 2、引导顺序 + +要在电脑上安装操作系统,你必须引导到操作系统安装程序。这对于一台电脑来说并不是常见的行为,因为很少有人这样做。理论上,你只需要安装一次操作系统,然后你就会不断更新它。当你选择在电脑上安装不同的操作系统时,你就中断了这个正常的生命周期。这不是一件坏事。这是你的电脑,所以你有权力对它进行重新规划。然而,这与电脑的默认行为不同,它的默认行为是开机后立即启动到硬盘上找到的任何操作系统。 + +在安装 Linux 之前,你必须备份你在目标计算机上的任何数据,因为这些数据在安装时都会被清除。 + +假设你已经将数据保存到了一个外部硬盘上,然后你将它秘密地存放在安全的地方(而不是连接到你的电脑上),那么你就可以继续了。 + +首先,将装有 Linux 安装程序的 U 盘连接到电脑上。打开电脑电源,观察屏幕上是否有一些如何中断其默认启动序列的指示。这通常是像 `F2`、`F8`、`Esc` 甚至 `Del` 这样的键,但根据你的主板制造商不同而不同。如果你错过了这个时间窗口,只需等待默认操作系统加载,然后重新启动并再次尝试。 + +当你中断启动序列时,电脑会提示你引导指令。具体来说,嵌入主板的固件需要知道该到哪个驱动器寻找可以加载的操作系统。在这种情况下,你希望计算机从包含 Linux 镜像的 U 盘启动。如何提示你这些信息取决于主板制造商。有时,它会直接问你,并配有一个菜单: + +![引导设备菜单][10] + +*启动设备选择菜单* + +其他时候,你会被带入一个简陋的界面,你可以用来设置启动顺序。计算机通常默认设置为先查看内部硬盘。如果引导失败,它就会移动到 U 盘、网络驱动器或光驱。你需要告诉你的计算机先寻找一个 U 盘,这样它就会绕过自己的内部硬盘驱动器,而引导 U 盘上的 Linux 镜像。 + +![BIOS 选择屏幕][11] + +*BIOS 选择屏幕* + +起初,这可能会让人望而生畏,但一旦你熟悉了界面,这就是一个快速而简单的任务。一旦安装了Linux,你就不必这样做了,因为,在这之后,你会希望你的电脑再次从内部硬盘启动。这是一个很好的技巧,因为在 U 盘上使用 Linux 的关键原因,是在安装前测试计算机的 Linux 兼容性,以及无论涉及什么操作系统的一般性故障排除。 + +一旦你选择了你的 U 盘作为引导设备,保存你的设置,让电脑复位,然后启动到 Linux 镜像。 + +#### 3、安装 Linux + +一旦你启动进入 Linux 安装程序,就只需通过提示进行操作。 + +Fedora 安装程序 Anaconda 为你提供了一个“菜单”,上面有你在安装前可以自定义的所有事项。大多数设置为合理的默认值,可能不需要你的互动,但有些则用警示符号标记,表示不能安全地猜测出你的配置,因此需要设置。这些配置包括你想安装操作系统的硬盘位置,以及你想为账户使用的用户名。在你解决这些问题之前,你不能继续进行安装。 + +对于硬盘的位置,你必须知道你要擦除哪个硬盘,然后用你选择的 Linux 发行版重新写入。对于只有一个硬盘的笔记本来说,这可能是一个显而易见的选择。 + +![选择安装驱动器的屏幕][12] + +*选择要安装操作系统的硬盘(本例中只有一个硬盘)。* + +如果你的电脑里有不止一个硬盘,而你只想在其中一个硬盘上安装 Linux,或者你想把两个硬盘当作一个硬盘,那么你必须帮助安装程序了解你的目标。最简单的方法是只给 Linux 分配一个硬盘,让安装程序执行自动分区和格式化,但对于高级用户来说,还有很多其他的选择。 + +你的电脑必须至少有一个用户,所以要为自己创建一个用户账户。完成后,你可以最后点击 **Done** 按钮,安装 Linux。 + +![Anaconda 选项完成并准备安装][13] + +*Anaconda 选项已经完成,可以安装了* + +其他的安装程序可能会更简单,所以你看到的可能与本文中的图片不同。无论怎样,除了预装的操作系统之外,这个安装过程都是最简单的操作系统安装过程之一,所以不要让安装操作系统的想法吓到你。这是你的电脑。你可以、也应该安装一个你拥有所有权的操作系统。 + +### 拥有你的电脑 + +最终,Linux 成为了你的操作系统。它是一个由来自世界各地的人们开发的操作系统,其核心是一个:创造一种参与、共同拥有、合作管理的计算文化。如果你有兴趣更好地了解开源,那么就请你迈出一步,了解它的一个光辉典范 Linux,并安装它。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-installation + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) +[2]: http://www.linuxfromscratch.org +[3]: https://opensource.com/sites/default/files/anaconda-installer.png +[4]: https://opensource.com/sites/default/files/elementary-installer.png +[5]: http://getfedora.org +[6]: http://linuxmint.com +[7]: http://elementary.io +[8]: https://opensource.com/article/18/7/getting-started-etcherio +[9]: https://opensource.com/sites/default/files/etcher_0.png +[10]: https://opensource.com/sites/default/files/boot-menu.jpg +[11]: https://opensource.com/sites/default/files/bios_1.jpg +[12]: https://opensource.com/sites/default/files/install-harddrive-chooser.png +[13]: https://opensource.com/sites/default/files/anaconda-done.png diff --git a/published/202103/20210216 What does being -technical- mean.md b/published/202103/20210216 What does being -technical- mean.md new file mode 100644 index 0000000000..896988d23d --- /dev/null +++ b/published/202103/20210216 What does being -technical- mean.md @@ -0,0 +1,166 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13168-1.html) +[#]: subject: (What does being 'technical' mean?) +[#]: via: (https://opensource.com/article/21/2/what-technical) +[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) + +“技术”是什么意思? +====== + +> 用“技术”和“非技术”的标签对人们进行分类,会伤害个人和组织。本文作为本系列的第 1 篇,将阐述这个问题。 + +![](https://img.linux.net.cn/data/attachment/album/202103/02/003141oz1l1765c598t6u7.jpg) + +“技术technical”一词描述了许多项目和学科:**技术**淘汰赛、**技术性**犯规、攀岩比赛的**技术**课程和花样滑冰运动的**技术**得分。广受欢迎的烹饪节目 “_The Great British Bake-Off_” 包括一个“烘焙**技术**挑战”。任何参加过剧院演出的人都可能熟悉**技术**周,即戏剧或音乐剧首演前的一周。 + +如你所见,**技术**一词并不严格适用于软件工程和软件操作,所以当我们称一个人或一个角色为“技术”时,我们的意思是什么,为什么使用这个术语? + +在我 20 年的技术生涯中,这些问题引起了我的兴趣,所以我决定通过一系列的采访来探讨这个问题。我不是工程师,也不写代码,但这并不意味着我是**非技术型**的。但我经常被贴上这样的标签。我认为自己是**技术型**的,通过这个系列,我希望你会明白为什么。 + +我知道我不是孤独一个人。群众讨论是很重要的,因为如何定义和看待一个人或一个角色会影响他们做好工作的信心和能力。如果他们感到被压垮或不受尊重,就会降低他们的工作质量,挤压创新和新思想。你看,这一切都是循序渐进的,那么我们怎样才能改善这种状况呢? + +我首先采访了 7 个不同角色的人。 + +在本系列中,我将探讨“技术”一词背后的含义、技术的连续性、将人分类为技术型或非技术型的意外副作用,以及通常被认为是非技术性的技术角色。 + +### 定义技术和非技术 + +首先,我们需要做个名词解释。根据字典网,“技术/技术性的”是一个具有多重含义的形容词,包括: + + * 属于或与艺术、科学等学科有关的 + * 精通或熟悉某一特定的艺术或行业的实际操作 + * 技术要求高或困难(通常用于体育或艺术) + +而“非技术性”一词在科技公司中经常被用来描述非工程人员。但是“非技术性”的定义是“不涉及、不具有某个特定活动领域及其术语的特点,或不熟练”。 + +作为一个写作和谈论技术的人,我认为自己是技术型的。如果你不熟悉这个领域和术语,就不可能书写或谈论一个技术主题。有了这种理解,每个从事技术工作的人都是技术人员。 + +### 为什么要分配标签? + +那么,为什么划分技术与非技术?这在技术领域有什么意义呢?我们试图通过分配这些标签来实现什么?有没有一个好的理由?而我们有没有重新评估这些理由?让我们讨论一下。 + +当我听到人们谈论技术人员和非技术人员时,我不禁想起 Seuss 教授写的童话故事 《[The Sneetches][2]》。Sneetches 有没有星星被演化为一种渴望。Sneetches 们进入了一个无限循环,试图达到正确的状态。 + +标签可以起到一定的作用,但当它们迫使一个群体的等级被视为比另一个更好时,它们就会变得危险。想想你的组织或部门:销售、资源、营销、质控、工程等,哪一组的在重要性上高于或低于另一组? + +即使它不是直接说的或写在什么地方,也可能是被人们默认的。这些等级划分通常也存在于规章制度中。技术内容经理 Liz Harris 表示,“在技术写作界存在着一个技术含量的评级,你越是偏技术的文章,你得到的报酬就越高,而且往往在技术写作社区里你得到的关注就越多。” + +术语“技术”通常用于指一个人在某一主题上的深度或专业知识水平。销售人员也有可能会要求需要懂技术以更好的帮助客户。从事技术工作的人,他们是技术型的,但是也许更专业的技术人员才能胜任这个项目。因此,请求技术支援可能是含糊不清的表述。你需要一个对产品有深入了解的人吗?你需要一位了解基础设施堆栈的人员吗?还是需要一个能写下如何配置 API 的步骤的人? + +我们应该要把技术能力看作是一个连续体,而不是把人简单的看作技术型的或非技术型的。这是什么意思?开发人员关系主管 Mary thengwall 描述了她如何对特定角色所需的不同深度的技术知识进行分类。例如,项目可能需要一个开发人员、一个具有开发人员背景的人员,或一个精通技术的人员。就是那些被归类为精通技术的人也经常被贴上非技术的标签。 + +根据 Mary 的说法,如果“你能解释(一个技术性的)话题,你知道你的产品工作方式,你知道该说什么和不该说什么的基本知识,那么你就是技术高手。你不必有技术背景,但你需要知道高层次的技术信息,然后还要知道向谁提供更多信息。” + +### 标签带来的问题 + +当我们使用标签来具体说明我们需要完成一项工作时,它们可能会很有帮助,比如“开发人员”、“有开发人员背景”和“技术达人”。但是当我们使用标签的范围太广时,将人们分为两组中的一组可能会产生“弱于”和“优于”的感觉 + +当一个标签成为现实时,无论是有意还是无意,我们都必须审视自己,重新评估自己的措辞、标签和意图。 + +高级产品经理 Leon Stigter 提出了他的观点:“作为一个集体行业,我们正在构建更多的技术,让每个人都更容易参与。如果我们对每个人说:‘你不是技术型的’,或者说:‘你是技术型的’,然后把他们分成几个小组,那些被贴上非技术型标签的人可能永远不会去想:‘其实我自己就能完成这个项目’,实际上,我们需要所有这些人真正思考我们行业和社区的发展方向,我认为每一个人都应该有这个主观能动性。” + +#### 身份 + +如果我们把我们的身份贴在一个标签上,当我们认为这个标签不再适用时会发生什么?当 Adam Gordon Bell 从一个开发人员转变为一个管理人员时,他很纠结,因为他总是认为自己是技术人员,而作为一个管理人员,这些技术技能没有被使用。他觉得自己不再有价值了。编写代码并不能提供比帮助团队成员发展事业或确保项目按时交付更大的价值。所有角色都有价值,因为它们都是确保商品和服务的创建、执行和交付所必需的。 + +“我想我成为一名经理的原因是,我们有一支非常聪明的团队和很多非常有技能的人,但是我们并不总是能完成最出色的工作。所以技术不是限制因素,对吧?”Adam 说:“我想通常不是技术限制了团队的发挥”。 + +Leon Stigter 说,让人们一起合作并完成令人惊叹的工作的能力是一项很有价值的技能,不应低于技术角色的价值。 + +#### 自信 + +[冒充者综合症][3]Impostor syndrome 是指无法认识到自己的能力和知识,从而导致信心下降,以及完成工作和做好工作的能力下降。当你申请在会议上发言,向科技刊物提交文章,或申请工作时,冒充者综合症就会发作。冒充者综合症是一种微小的声音,它说: + + * “我技术不够胜任这个角色。” + * “我认识更多的技术人员,他们在演讲中会做得更好。” + * “我在市场部工作,所以我无法为这样的技术网站写文章。” + +当你把某人或你自己贴上非技术型标签的时候,这些声音就会变得更响亮。这很容易导致在会议上听不到新的声音或失去团队中的人才。 + +#### 刻板印象 + +当你认为某人是技术人员时,你会看到什么样的印象?他们穿什么?他们还有什么特点?他们是外向健谈,还是害羞安静? + +Shailvi Wakhlu 是一位高级数据总监,她的职业生涯始于软件工程师,并过渡到数据和分析领域。“当我是一名软件工程师的时候,很多人都认为我不太懂技术,因为我很健谈,很明显这就意味着你不懂技术。他们认为你不孤独的待在角落就是不懂技术。”她说。 + +我们对谁是技术型与非技术型的刻板印象会影响招聘决策或我们的社区是否具有包容性。你也可能冒犯别人,甚至是能够帮助你的人。几年前,我在某个展台工作,问别人我能不能帮他们。“我要找最专业的人帮忙”他回答说。然后他就出发去寻找他的问题的答案。几分钟后,摊位上的销售代表和那位先生走到我跟前说:“Dawn,你是回答这个人问题的最佳人选。” + +#### 污名化 + +随着时间的推移,我们夸大了“技术”技能的重要性,这导致了“非技术”的标签被贬义地使用。随着技术的蓬勃发展,编程人员的价值也随之增加,因为这种技能为市场带来了新产品和新的商业方式,并直接帮助了盈利。然而,现在我们看到人们故意将技术角色凌驾于非技术角色之上,阻碍了公司的发展和成功。 + +人际交往技能通常被称为非技术技能。然而,它们有着高度的技术性,比如提供如何完成一项任务的分步指导,或者确定最合适的词语来传达信息或观点。这些技能往往也是决定你能否在工作中取得成功的更重要因素。 + +通读“城市词典Urban Dictionary”上的文章和定义,难怪人们会觉得自己的标签有道理,而其他人会患上冒充者综合症,或者觉得自己失去了身份。在线搜索时,“城市词典”定义通常出现在搜索结果的顶部。这个网站大约 20 年前开始是一个定义俚语、文化表达和其他术语的众包词典,现在变成了一个充满敌意和负面定义的网站。 + +这里有几个例子:“城市词典”将非技术经理定义为“不知道他们管理的人应该做什么的人” + +提供如何与“非技术”人员交谈技巧的文章包括以下短语: + + * “如果我抗争,非技术人员究竟是如何应对的?” + * “在当今的职业专业人士中,开发人员和工程师拥有一些最令人印象深刻的技能,这些技能是由多年的技术培训和实际经验磨练而成的。” + +这些句子意味着非工程师是低人一等的,他们多年的训练和现实世界的经验在某种程度上没有那么令人印象深刻。对于这样的说辞,我可以举一个反例:Therese Eberhard,她的工作被许多人认为是非技术性的。她是个风景画家。她为电影和戏剧画道具和风景。她的工作是确保像甘道夫的手杖这样的道具看起来栩栩如生,而不是像塑料玩具。要想在这个角色上取得成功,需要有很多解决问题和实验化学反应的方法。Therese 在多年的实战经验中磨练了这些技能,对我来说,这相当令人印象深刻。 + +#### 守门人行为 + +使用标签会设置障碍,并导致守门人行为,这决定谁可以进入我们的组织,我们的团队,我们的社区。 + +据一位开源开发者 Eddie Jaoude 所说,“`技术’、`开发人员‘或`测试人员’的头衔在不应该出现的地方制造了障碍或权威。我们应该将重点放在谁能为团队或项目增加价值,而头衔是无关紧要的。” + +如果我们把每个人看作一个团队成员,他们应该以这样或那样的方式贡献价值,而不是看他们是否编写文档、测试用例或代码,那么我们将根据真正重要的东西来重视他们,并创建一个能完成惊人工作的团队。如果测试工程师想学习编写代码,或者程序员想学习如何在活动中与人交谈,为什么要设置障碍来阻止这种成长呢?拥抱团队成员学习、改变和向任何方向发展的渴望,为团队和公司的使命服务。 + +如果有人在某个角色上失败了,与其把他们说成“技术不够”,不如去看看问题到底是什么。你是否需要一个精通 JavaScript 的人,而这个人又是另一种编程语言的专家?并不是说他们不专业,是技能和知识不匹配。你需要合适的人来扮演合适的角色。如果你强迫一个精通业务分析和编写验收标准的人去编写自动化测试用例,他们就会失败。 + +### 如何取消标签 + +如果你已经准备好改变你对技术性和非技术性标签的看法,这里有帮助你改变的提示。 + +#### 寻找替代词 + +我问我采访过的每个人,我们可以用什么词来代替技术和非技术。没有人能回答!我认为这里的挑战是我们不能把它归结为一个词。要替换术语,你需要使用更多的词。正如我之前写的,我们需要做的是变得更加具体。 + +你说过或听到过多少次这样的话: + + * “我正在为这个项目寻找技术资源。” + * “那个候选人技术不够。” + * “我们的软件是为非技术用户设计的。” + +技术和非技术词语的这些用法是模糊的,不能表达它们的全部含义。更真实、更详细地了解你的需求那么你应该说: + + * “我想找一个对如何配置 Kubernetes 有深入了解的人。” + * “那个候选人对 Go 的了解不够深入。” + * “我们的软件是为销售和营销团队设计的。” + +#### 拥抱成长心态 + +知识和技能不是天生的。它们是经过数小时或数年的实践和经验形成的。认为“我只是技术不够”或“我不能学习如何做营销”反映了一种固定的心态。你可以向任何你想发展的方向学习技能。列一张清单,列出你认为哪些是技术技能,或非技术技能,但要具体(如上面的清单)。 + +#### 认可每个人的贡献 + +如果你在科技行业工作,你就是技术人员。在一个项目或公司的成功中,每个人都有自己的作用。与所有做出贡献的人分享荣誉,而不仅仅是少数人。认可提出新功能的产品经理,而不仅仅是开发新功能的工程师。认可一个作家,他的文章在你的公司迅速传播并产生了新的线索。认可在数据中发现新模式的数据分析师。 + +### 下一步 + +在本系列的下一篇文章中,我将探讨技术中经常被标记为“非技术”的非工程角色。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/what-technical + +作者:[Dawn Parzych][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dawnparzych +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/question-mark_chalkboard.jpg?itok=DaG4tje9 (question mark in chalk) +[2]: https://en.wikipedia.org/wiki/The_Sneetches_and_Other_Stories +[3]: https://opensource.com/business/15/9/tips-avoiding-impostor-syndrome +[4]: https://enterprisersproject.com/article/2019/8/why-soft-skills-core-to-IT diff --git a/published/202103/20210217 4 tech jobs for people who don-t code.md b/published/202103/20210217 4 tech jobs for people who don-t code.md new file mode 100644 index 0000000000..4252efa8a5 --- /dev/null +++ b/published/202103/20210217 4 tech jobs for people who don-t code.md @@ -0,0 +1,127 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13178-1.html) +[#]: subject: (4 tech jobs for people who don't code) +[#]: via: (https://opensource.com/article/21/2/non-engineering-jobs-tech) +[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) + +不懂代码的人也可以干的 4 种技术工作 +====== + +> 对于不是工程师的人来说也有很多技术工作可以做。本文作为本系列的第二篇,就具体阐述这些工作。 + +![](https://img.linux.net.cn/data/attachment/album/202103/06/094041jnrriww0g6ggjn0p.jpg) + +在 [本系列的第一篇文章][2] 中,我解释了技术行业如何将人员和角色划分为“技术”或“非技术”类别,以及与此相关的问题。科技行业使得那些对科技感兴趣但不懂编程的人很难找到适合自己的角色。 + +如果你对技术或开源感兴趣,但对编程不感兴趣,这也有一些工作适合你。科技公司的任何一个职位都可能需要一个精通科技但不一定会写代码的人。但是,你确实需要了解术语并理解产品。 + +我最近注意到,在诸如技术客户经理、技术产品经理、技术社区经理等职位头衔上增加了“技术”一词。这反映了几年前的趋势,即在头衔上加上“工程师”一词,以表示该职位的技术需要。过了一段时间,每个人的头衔中都有“工程师”这个词,这样的分类就失去了一些吸引力。 + +当我坐下来写这些文章时,Tim Banks 的这条推特出现在我的通知栏上: + +> 已经将职业生涯规划为技术行业的非开发人员(除了信息安全、数据科学/分析师、基础设施工程师等以外的人员)的女性,你希望知道的事情有哪些,有价值的资源有哪些,或者对希望做出类似改变的人有哪些建议? +> +> —— Tim Banks is a buttery biscuit (@elchefe) [December 15,2020][3] + +这遵循了我第一篇文章中的建议:Tim 并不是简单地询问“非技术角色”;他提供了更重要的详细描述。在 Twitter 这样的媒体上,每一个字符都很重要,这些额外的字符会产生不同的效果。这些是技术角色。如果为了节约笔墨,而简单的称呼他们为“非技术人员”,会改变你的原意,产生不好的影响。 + +以下是需要技术知识的非工程类角色的示例。 + +### 技术作者 + +[技术作者的工作][4] 是在两方或多方之间传递事实信息。传统上,技术作者提供有关如何使用技术产品的说明或文档。最近,我看到术语“技术作者”指的是写其他形式内容的人。科技公司希望一个人为他们的开发者读者写博客文章,而这种技巧不同于文案或内容营销。 + +**需要的技术技能:** + + * 写作 + * 特定技术或产品的用户知识或经验 + * 快速跟上新产品或新特性的速度的能力 + * 在各种环境中创作的技能 + +**适合人群:** + + * 可以清楚地提供分步说明 + * 享受合作 + * 对活跃的声音和音乐有热情 + * 喜欢描述事物和解释原理 + +### 产品经理 + +[产品经理][5] 负责领导产品战略。职责可能包括收集客户需求并确定其优先级,撰写业务案例,以及培训销售人员。产品经理跨职能工作,利用创造性和技术技能的结合,成功地推出产品。产品经理需要深厚的产品专业知识。 + +**所需技术技能:** + + * 掌握产品知识,并且会配置或运行演示模型 + * 与产品相关的技术生态系统知识 + * 分析和研究技能 + +**适合以下人群:** + + * 享受制定战略和规划下一步的工作 + * 在不同的人的需求中可以看到一条共同的线索 + * 能够清楚地表达业务需求和要求 + * 喜欢描述原因 + +### 数据分析师 + +数据分析师负责收集和解释数据,以帮助推动业务决策,如是否进入新市场、瞄准哪些客户或在何处投资。这个角色需要知道如何使用所有可用的潜在数据来做出决策。我们常常希望把事情简单化,而数据分析往往过于简单化。获取正确的信息并不像编写查询 `select all limit 10` 来获取前 10 行那么简单。你需要知道要加入哪些表。你需要知道如何分类。你需要知道是否需要在运行查询之前或之后以某种方式清理数据。 + +**所需技术技能:** + + * 了解 SQL、Python 和 R + * 能够看到和提取数据中的样本 + * 了解事物如何端到端运行 + * 批判性思维 + * 机器学习 + +**适合以下人群:** + + * 享受解决问题的乐趣 + * 渴望学习和提出问题 + +### 开发者关系 + +[开发者关系][6] 是一门相对较新的技术学科。它包括 [开发者代言人][7] developer advocate开发者传道者developer evangelist开发者营销developer marketing等角色。这些角色要求你与开发人员沟通,与他们建立关系,并帮助他们提高工作效率。你向公司倡导开发者的需求,并向开发者代表公司。开发者关系可以包括撰写文章、创建教程、录制播客、在会议上发言以及创建集成和演示。有人说你需要做过开发才能进入开发者关系。我没有走那条路,我知道很多人没有。 + +**所需技术技能:** + +这些将高度依赖于公司和具体角色。你需要部分技能(不是全部)取决于你自己。 + + * 了解与产品相关的技术概念 + * 写作 + * 教程和播客的视频和音频编辑 + * 说话 + +**适合以下人群:** + + * 有同情心,想要教导和授权他人 + * 可以为他人辩护 + * 你很有创意 + +### 无限的可能性 + +这并不是一个完整的清单,并没有列出技术领域中所有的非工程类角色,而是一些不喜欢每天编写代码的人可以尝试的工作。如果你对科技职业感兴趣,看看你的技能和什么角色最适合。可能性是无穷的。为了帮助你完成旅程,在本系列的最后一篇文章中,我将与这些角色的人分享一些建议。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/non-engineering-jobs-tech + +作者:[Dawn Parzych][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dawnparzych +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tips_map_guide_ebook_help_troubleshooting_lightbulb_520.png?itok=L0BQHgjr (Looking at a map) +[2]: https://linux.cn/article-13168-1.html +[3]: https://twitter.com/elchefe/status/1338933320147750915?ref_src=twsrc%5Etfw +[4]: https://opensource.com/article/17/5/technical-writing-job-interview-tips +[5]: https://opensource.com/article/20/2/product-management-open-source-company +[6]: https://www.marythengvall.com/blog/2019/5/22/what-is-developer-relations-and-why-should-you-care +[7]: https://opensource.com/article/20/10/open-source-developer-advocates diff --git a/published/202103/20210220 Run your favorite Windows applications on Linux.md b/published/202103/20210220 Run your favorite Windows applications on Linux.md new file mode 100644 index 0000000000..4ecc4a59e2 --- /dev/null +++ b/published/202103/20210220 Run your favorite Windows applications on Linux.md @@ -0,0 +1,98 @@ +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13184-1.html) +[#]: subject: (Run your favorite Windows applications on Linux) +[#]: via: (https://opensource.com/article/21/2/linux-wine) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +在 Linux 上运行你最喜欢的 Windows 应用程序 +====== + +> WINE 是一个开源项目,它可以协助很多 Windows 应用程序在 Linux 上运行,就好像它们是原生程序一样。 + +![](https://img.linux.net.cn/data/attachment/album/202103/07/231159kwsn2snlilwbs9ns.jpg) + +在 2021 年,有很多比以往更喜欢 Linux 的原因。在这系列中,我将分享使用 Linux 的 21 种原因。这里是如何使用 WINE 来实现从 Windows 到 Linux 的无缝切换。 + +你有只能在 Windows 上运行的应用程序吗?那一个应用程序阻碍你切换到 Linux 的唯一因素吗?如果是这样的话,你将会很高兴知道 WINE,这是一个开源项目,它几乎重新发明了关键的 Windows 库,使为 Windows 编译的应用程序可以在 Linux 上运行。 + +WINE 代表着“Wine Is Not an Emulator” ,它指的是驱动这项技术的代码。开源开发者从 1993 年就开始致力将应用程序的任何传入 Windows API 调用翻译为 [POSIX][2] 调用。 + +这是一个令人十分惊讶的编程壮举,尤其是考虑到这个项目是独立运行的,没有来自微软的帮助(至少可以这样说),但是也有局限性。一个应用程序偏离 Windows API 的 “内核” 越远,WINE 就越不能预期应用程序的请求。有一些供应商可以弥补这一点,尤其是 [Codeweavers][3] 和 [Valve Software][4]。在需要翻译应用程序的制作者和翻译的人们及公司之间没有协调配合,因此,比如说一个更新的软件作品和从 [WINE 总部][5] 获得完美适配状态之间可能会有一些时间上的滞后。 + +然而,如果你想在 Linux 上运行一个著名的 Windows 应用程序,WINE 可能已经为它准备好了可能性。 + +### 安装 WINE + +你可以从你的 Linux 发行版的软件包存储库中安装 WINE 。在 Fedora、CentOS Stream 或 RHEL 系统上: + +``` +$ sudo dnf install wine +``` + +在 Debian、Linux Mint、Elementary 及相似的系统上: + +``` +$ sudo apt install wine +``` + +WINE 不是一个你自己启动的应用程序。当启动一个 Windows 应用程序时,它是一个被调用的后端。你与 WINE 的第一次交互很可能就发生在你启动一个 Windows 应用程序的安装程序时。 + +### 安装一个应用程序 + +[TinyCAD][6] 是一个极好的用于设计电路的开源应用程序,但是它仅在 Windows 上可用。虽然它是一个小型的应用程序,但是它确实包含一些 .NET 组件,因此应该能对 WINE 进行一些压力测试。 + +首先,下载 TinyCAD 的安装程序。Windows 安装程序通常都是这样,它是一个 `.exe` 文件。在下载后,双击文件来启动它。 + +![WINE TinyCAD 安装向导][7] + +*TinyCAD 的 WINE 安装向导* + +像你在 Windows 上一样逐步完成安装程序。通常最好接受默认选项,尤其是与 WINE 有关的地方。WINE 环境基本上是独立的,隐藏在你的硬盘驱动器上的一个 `drive_c` 目录中,作为 Windows 应用程序使用的一个文件系统的仿真根目录。 + +![WINE TinyCAD 安装和目标驱动器][8] + +*WINE TinyCAD 目标驱动器* + +安装完成后,应用程序通常会为你提供启动机会。如果你正准备测试一下它的话,启动应用程序。 + +### 启动 Windows 应用程序 + +除了在安装后的第一次启动外,在正常情况下,你启动一个 WINE 应用程序的方式与你启动一个本地 Linux 应用程序相同。不管你使用应用程序菜单、活动屏幕或者只是在运行器中输入应用程序的名称,在 WINE 中运行的桌面 Windows 应用程序都会被视为在 Linux 上的本地应用程序。 + +![TinyCAD 使用 WINE 运行][9] + +*通过 WINE 的支持来运行 TinyCAD* + +### 当 WINE 失败时 + +我在 WINE 中的大多数应用程序,包括 TinyCAD ,都能如期运行。不过,也会有例外。在这些情况下,你可以等几个月来查看 WINE 开发者 (或者,如果是一款游戏,就等候 Valve Software)是否进行追加修补,或者你可以联系一个像 Codeweavers 这样的供应商来查看他们是否出售对你所需要的应用程序的服务支持。 + +### WINE 是种欺骗,但它用于正道 + +一些 Linux 用户觉得:如果你使用 WINE 的话,你就是在“欺骗” Linux。它可能会让人有这种感觉,但是 WINE 是一个开源项目,它使用户能够切换到 Linux ,并且仍然能够运行工作或爱好所需的应用程序。如果 WINE 解决了你的问题,让你使用 Linux,那就使用它,并拥抱 Linux 的灵活性。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-wine + +作者:[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/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://www.codeweavers.com/crossover +[4]: https://github.com/ValveSoftware/Proton +[5]: http://winehq.org +[6]: https://sourceforge.net/projects/tinycad/ +[7]: https://opensource.com/sites/default/files/wine-tinycad-install.jpg +[8]: https://opensource.com/sites/default/files/wine-tinycad-drive_0.jpg +[9]: https://opensource.com/sites/default/files/wine-tinycad-running.jpg diff --git a/published/202103/20210223 A guide to Python virtual environments with virtualenvwrapper.md b/published/202103/20210223 A guide to Python virtual environments with virtualenvwrapper.md new file mode 100644 index 0000000000..35b591cf1b --- /dev/null +++ b/published/202103/20210223 A guide to Python virtual environments with virtualenvwrapper.md @@ -0,0 +1,126 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13174-1.html) +[#]: subject: (A guide to Python virtual environments with virtualenvwrapper) +[#]: via: (https://opensource.com/article/21/2/python-virtualenvwrapper) +[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall) + +使用 virtualenvwrapper 构建 Python 虚拟环境 +====== + +> 虚拟环境是安全地使用不同版本的 Python 和软件包组合的关键。 + +![](https://img.linux.net.cn/data/attachment/album/202103/04/072251y8wkis7c40i8crkw.jpg) + +Python 对管理虚拟环境的支持,已经提供了一段时间了。Python 3.3 甚至增加了内置的 `venv` 模块,用于创建没有第三方库的环境。Python 程序员可以使用几种不同的工具来管理他们的环境,我使用的工具叫做 [virtualenvwrapper][2]。 + +虚拟环境是将你的 Python 项目及其依赖关系与你的系统安装的 Python 分离的一种方式。如果你使用的是基于 macOS 或 Linux 的操作系统,它很可能在安装中附带了一个 Python 版本,事实上,它很可能依赖于那个特定版本的 Python 才能正常运行。但这是你的计算机,你可能想用它来达到自己的目的。你可能需要安装另一个版本的 Python,而不是操作系统提供的版本。你可能还需要安装一些额外的库。尽管你可以升级你的系统 Python,但不推荐这样做。你也可以安装其他库,但你必须注意不要干扰系统所依赖的任何东西。 + +虚拟环境是创建隔离的关键,你需要安全地修改不同版本的 Python 和不同组合的包。它们还允许你为不同的项目安装同一库的不同版本,这解决了在相同环境满足所有项目需求这个不可能的问题。 + +为什么选择 `virtualenvwrapper` 而不是其他工具?简而言之: + + * 与 `venv` 需要在项目目录内或旁边有一个 `venv` 目录不同,`virtualenvwrapper` 将所有环境保存在一个地方:默认在 `~/.virtualenvs` 中。 + * 它提供了用于创建和激活环境的命令,而且激活环境不依赖于找到正确的 `activate` 脚本。它只需要(从任何地方)`workon projectname`而不需要 `source ~/Projects/flashylights-env/bin/activate`。  + +### 开始使用 + +首先,花点时间了解一下你的系统 Python 是如何配置的,以及 `pip` 工具是如何工作的。 + +以树莓派系统为例,该系统同时安装了 Python 2.7 和 3.7。它还提供了单独的 `pip` 实例,每个版本一个: + + * 命令 `python` 运行 Python 2.7,位于 `/usr/bin/python`。 + * 命令 `python3` 运行 Python 3.7,位于 `/usr/bin/python3`。 + * 命令 `pip` 安装 Python 2.7 的软件包,位于 `/usr/bin/pip`。 + * 命令 `pip3` 安装 Python 3.7 的包,位于 `/usr/bin/pip3`。 + +![Python commands on Raspberry Pi][3] + +在开始使用虚拟环境之前,验证一下使用 `python` 和 `pip` 命令的状态是很有用的。关于你的 `pip` 实例的更多信息可以通过运行 `pip debug` 或 `pip3 debug` 命令找到。 + +在我运行 Ubuntu Linux 的电脑上几乎是相同的信息(除了它是 Python 3.8)。在我的 Macbook 上也很相似,除了唯一的系统 Python 是 2.6,而我用 `brew` 安装 Python 3.8,所以它位于 `/usr/local/bin/python3`(和 `pip3` 一起)。 + +### 安装 virtualenvwrapper + +你需要使用系统 Python 3 的 `pip` 安装 `virtualenvwrapper`: + + +``` +sudo pip3 install virtualenvwrapper +``` + +下一步是配置你的 shell 来加载 `virtualenvwrapper` 命令。你可以通过编辑 shell 的 RC 文件(例如 `.bashrc`、`.bash_profile` 或 `.zshrc`)并添加以下几行: + +``` +export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 +export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv +source /usr/local/bin/virtualenvwrapper.sh +``` + +![bashrc][5] + +如果你的 Python 3 位于其他地方,请根据你的设置修改第一行。 + +关闭你的终端,然后重新打开它,这样才能生效。第一次打开终端时,你应该看到 `virtualenvwrapper` 的一些输出。这只会发生一次,因为一些目录是作为设置的一部分被创建的。 + +现在你应该可以输入 `mkvirtualenv --version` 命令来验证 `virtualenvwrapper` 是否已经安装。 + +### 创建一个新的虚拟环境 + +假设你正在进行一个名为 `flashylights` 的项目。要用这个名字创建一个虚拟环境,请运行该命令: + +``` +mkvirtualenv flashylights +``` + +环境已经创建并激活,所以你会看到 `(flashlylights)` 出现在你的提示前: + +![Flashylights prompt][6] + +现在环境被激活了,事情发生了变化。`python` 现在指向一个与你之前在系统中识别的 Python 实例完全不同的 Python 实例。它为你的环境创建了一个目录,并在其中放置了 Python 3 二进制文件、pip 命令等的副本。输入 `which python` 和 `which pip` 来查看它们的位置。 + +![Flashylights command][7] + +如果你现在运行一个 Python 程序,你可以用 `python` 代替 `python3` 来运行,你可以用 `pip` 代替 `pip3`。你使用 `pip`安装的任何包都将只安装在这个环境中,它们不会干扰你的其他项目、其他环境或系统安装。 + +要停用这个环境,运行 `deactivate` 命令。要重新启用它,运行 `workon flashylights`。 + +你可以用 `workon` 或使用 `lsvirtualenv` 列出所有可用的环境。你可以用 `rmvirtualenv flashylights` 删除一个环境。 + +在你的开发流程中添加虚拟环境是一件明智的事情。根据我的经验,它可以防止我在系统范围内安装我正在试验的库,这可能会导致问题。我发现 `virtualenvwrapper` 是最简单的可以让我进入流程的方法,并无忧无虑地管理我的项目环境,而不需要考虑太多,也不需要记住太多命令。 + +### 高级特性 + + * 你可以在你的系统上安装多个 Python 版本(例如,在 Ubuntu 上使用 [deadsnakes PPA][8]),并使用该版本创建一个虚拟环境,例如,`mkvirtualenv -p /usr/bin/python3.9 myproject`。 + * 可以在进入和离开目录时自动激活、停用。 + * 你可以使用 `postmkvirtualenv` 钩子在每次创建新环境时安装常用工具。 + +更多提示请参见[文档][9]。 + +_本文基于 Ben Nuttall 在 [Tooling Tuesday 上关于 virtualenvwrapper 的帖子][10],经许可后重用。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/python-virtualenvwrapper + +作者:[Ben Nuttall][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/bennuttall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_python.jpg?itok=G04cSvp_ (Python in a coffee cup.) +[2]: https://virtualenvwrapper.readthedocs.io/en/latest/index.html +[3]: https://opensource.com/sites/default/files/uploads/pi-python-cmds.png (Python commands on Raspberry Pi) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/bashrc.png (bashrc) +[6]: https://opensource.com/sites/default/files/uploads/flashylights-activated-prompt.png (Flashylights prompt) +[7]: https://opensource.com/sites/default/files/uploads/flashylights-activated-cmds.png (Flashylights command) +[8]: https://tooling.bennuttall.com/deadsnakes/ +[9]: https://virtualenvwrapper.readthedocs.io/en/latest/tips.html +[10]: https://tooling.bennuttall.com/virtualenvwrapper/ diff --git a/published/202103/20210224 Check Your Disk Usage Using ‘duf- Terminal Tool -Friendly Alternative to du and df commands.md b/published/202103/20210224 Check Your Disk Usage Using ‘duf- Terminal Tool -Friendly Alternative to du and df commands.md new file mode 100644 index 0000000000..4a72a2ac46 --- /dev/null +++ b/published/202103/20210224 Check Your Disk Usage Using ‘duf- Terminal Tool -Friendly Alternative to du and df commands.md @@ -0,0 +1,117 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13165-1.html) +[#]: subject: (Check Your Disk Usage Using ‘duf’ Terminal Tool [Friendly Alternative to du and df commands]) +[#]: via: (https://itsfoss.com/duf-disk-usage/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +使用 duf 终端工具检查你的磁盘使用情况 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/01/091533qkx95xomkzfmsdxo.jpg) + +> `duf` 是一个终端工具,旨在增强传统的 Linux 命令 `df` 和 `du`。它可以让你轻松地检查可用磁盘空间,对输出进行分类,并以用户友好的方式呈现。 + +### duf:一个用 Golang 编写的跨平台磁盘使用情况工具 + +![][1] + +在我知道这个工具之前,我更喜欢使用像 [Stacer][2] 这样的 GUI 程序或者预装的 GNOME 磁盘使用情况程序来 [检查可用的磁盘空间][3] 和系统的磁盘使用量。 + +不过,[duf][4] 似乎是一个有用的终端工具,可以检查磁盘使用情况和可用空间,它是用 [Golang][5] 编写的。Abhishek 建议我试一试它,但我对它很感兴趣,尤其是考虑到我目前正在学习 Golang,真是太巧了! + +无论你是终端大师还是只是一个对终端不适应的初学者,它都相当容易使用。当然,它比 [检查磁盘空间利用率命令 df][6] 更容易理解。 + +在你把它安装到你的系统上之前,让我重点介绍一下它的一些主要功能和用法。 + +### duf 的特点 + +![][7] + + * 提供所有挂载设备的概览且易于理解。 + * 能够指定目录/文件名并检查该挂载点的可用空间。 + * 更改/删除输出中的列。 + * 列出 [inode][8] 信息。 + * 输出排序。 + * 支持 JSON 输出。 + * 如果不能自动检测终端的主题,可以指定主题。 + +### 在 Linux 上安装和使用 duf + +你可以在 [AUR][9] 中找到一个 Arch Linux 的软件包。如果你使用的是 [Nix 包管理器][10],也可以找到一个包。 + +对于基于 Debian 的发行版和 RPM 包,你可以去它的 [GitHub 发布区][11] 中获取适合你系统的包。 + +它也适用于 Windows、Android、macOS 和 FreeBSD。 + +在我这里,我需要 [安装 DEB 包][12],然后就可以使用了。安装好后,使用起来很简单,你只要输入: + +``` +duf +``` + +这应该会给你提供所有本地设备、已挂载的任何云存储设备以及任何其他特殊设备(包括临时存储位置等)的详细信息。 + +如果你想一目了然地查看所有 `duf` 的可用命令,你可以输入: + +``` +duf --help +``` + +![][13] + +例如,如果你只想查看本地连接设备的详细信息,而不是其他的,你只需要输入: + +``` +duf --only local +``` + +另一个例子是根据大小按特定顺序对输出进行排序,下面是你需要输入的内容: + +``` +duf --sort size +``` + +输出应该是像这样的: + +![][14] + +你可以探索它的 [GitHub 页面][4],以获得更多关于额外命令和安装说明的信息。 + +- [下载 duf][4] + +### 结束语 + +我发现终端工具 `duf` 相当方便,可以在不需要使用 GUI 程序的情况下,随时查看可用磁盘空间或使用情况。 + +你知道有什么类似的工具吗?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/duf-disk-usage/ + +作者:[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/2021/02/duf-screenshot.jpg?resize=800%2C481&ssl=1 +[2]: https://itsfoss.com/optimize-ubuntu-stacer/ +[3]: https://itsfoss.com/check-free-disk-space-linux/ +[4]: https://github.com/muesli/duf +[5]: https://golang.org/ +[6]: https://linuxhandbook.com/df-command/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/duf-local.jpg?resize=800%2C195&ssl=1 +[8]: https://linuxhandbook.com/inode-linux/ +[9]: https://itsfoss.com/aur-arch-linux/ +[10]: https://github.com/NixOS/nixpkgs +[11]: https://github.com/muesli/duf/releases +[12]: https://itsfoss.com/install-deb-files-ubuntu/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/duf-commands.jpg?resize=800%2C443&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/duf-sort-example.jpg?resize=800%2C365&ssl=1 diff --git a/published/202103/20210224 Set your path in FreeDOS.md b/published/202103/20210224 Set your path in FreeDOS.md new file mode 100644 index 0000000000..00ab8c9daf --- /dev/null +++ b/published/202103/20210224 Set your path in FreeDOS.md @@ -0,0 +1,161 @@ +[#]: subject: (Set your path in FreeDOS) +[#]: via: (https://opensource.com/article/21/2/path-freedos) +[#]: author: (Kevin O'Brien https://opensource.com/users/ahuka) +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13218-1.html) + +在 FreeDOS 中设置你的路径 +====== + +> 学习 FreeDOS 路径的知识,如何设置它,并且如何使用它。 + +![查看职业生涯地图][1] + +你在开源 [FreeDOS][2] 操作系统中所做的一切工作都是通过命令行完成的。命令行以一个 _提示符_ 开始,这是计算机说法的方式,“我准备好了。请给我一些事情来做。”你可以配置你的提示符的外观,但是默认情况下,它是: + +``` +C:\> +``` + +从命令行中,你可以做两件事:运行一个内部命令或运行一个程序。外部命令是在你的 `FDOS` 目录中可找到的以单独文件形式存在的程序,以便运行程序包括运行外部命令。它也意味着你可以使用你的计算机运行应用程序软件来做一些东西。你也可以运行一个批处理文件,但是在这种情况下,你所做的全部工作就变成了运行批处理文件中所列出的一系列命令或程序。 + +### 可执行应用程序文件 + +FreeDOS 可以运行三种类型的应用程序文件: + + 1. **COM** 是一个用机器语言写的,且小于 64 KB 的文件。 + 2. **EXE** 也是一个用机器语言写的文件,但是它可以大于 64 KB 。此外,在 EXE 文件的开头部分有信息,用于告诉 DOS 系统该文件是什么类型的以及如何加载和运行。 + 3. **BAT** 是一个使用文本编辑器以 ASCII 文本格式编写的 _批处理文件_ ,其中包含以批处理模式执行的 FreeDOS 命令。这意味着每个命令都会按顺序执行到文件的结尾。 + +如果你所输入的一个文件名称不能被 FreeDOS 识别为一个内部命令或一个程序,你将收到一个错误消息 “Bad command or filename” 。如果你看到这个错误,它意味着会是下面三种情况中的其中一种: + + 1. 由于某些原因,你所给予的名称是错误的。你可能拼错了文件名称,或者你可能正在使用错误的命令名称。检查名称和拼写,并再次尝试。 + 2. 可能你正在尝试运行的程序并没有安装在计算机上。请确认它已经安装了。 + 3. 文件确实存在,但是 FreeDOS 不知道在哪里可以找到它。 + +在清单上的最后一项就是这篇文章的主题,它被称为路径。如果你已经习惯于使用 Linux 或 Unix ,你可能已经理解 [PATH 变量][3] 的概念。如果你是命令行的新手,那么路径是一个非常重要的足以让你舒适的东西。 + +### 路径 + +当你输入一个可执行应用程序文件的名称时,FreeDOS 必须能找到它。FreeDOS 会在一个具体指定的位置层次结构中查找文件: + + 1. 首先,它查找当前驱动器的活动目录(称为 _工作目录_)。如果你正在目录 `C:\FDOS` 中,接着,你输入名称 `FOOBAR.EXE`,FreeDOS 将在 `C:\FDOS` 中查找带有这个名称的文件。你甚至不需要输入完整的名称。如果你输入 `FOOBAR` ,FreeDOS 将查找任何带有这个名称的可执行文件,不管它是 `FOOBAR.EXE`,`FOOBAR.COM`,或 `FOOBAR.BAT`。只要 FreeDOS 能找到一个匹配该名称的文件,它就会运行该可执行文件。 + 2. 如果 FreeDOS 不能找到你所输入名称的文件,它将查询被称为 `PATH` 的一些东西。每当 DOS 不能在当前活动命令中找到文件时,会指示 DOS 检查这个列表中目录。 + +你可以随时使用 `path` 命令来查看你的计算机的路径。只需要在 FreeDOS 提示符中输入 `path` ,FreeDOS 就会返回你的路径设置: + +``` +C:\>path +PATH=C:\FDOS\BIN +``` + +第一行是提示符和命令,第二行是计算机返回的东西。你可以看到 DOS 第一个查看的位置就是位于 `C` 驱动器上的 `FDOS\BIN`。如果你想更改你的路径,你可以输入一个 `path` 命令以及你想使用的新路径: + +``` +C:\>path=C:\HOME\BIN;C:\FDOS\BIN +``` + +在这个示例中,我设置我的路径到我个人的 `BIN` 文件夹,我把它放在一个叫 `HOME` 的自定义目录中,然后再设置为 `FDOS/BIN`。现在,当你检查你的路径时: + +``` +C:\>path +PATH=C:\HOME\BIN;C:\FDOS\BIN +``` + +路径设置是按所列目录的顺序处理的。 + +你可能会注意到有一些字符是小写的,有一些字符是大写的。你使用哪一种都真的不重要。FreeDOS 是不区分大小写的,并且把所有的东西都作为大写字母对待。在内部,FreeDOS 使用的全是大写字母,这就是为什么你看到来自你命令的输出都是大写字母的原因。如果你以小写字母的形式输入命令和文件名称,在一个转换器将自动转换它们为大写字母后,它们将被执行。 + +输入一个新的路径来替换先前设置的路径。 + +### autoexec.bat 文件 + +你可能遇到的下一个问题的是 FreeDOS 默认使用的第一个路径来自何处。这与其它一些重要的设置一起定义在你的 `C` 驱动器的根目录下的 `AUTOEXEC.BAT` 文件中。这是一个批处理文件,它在你启动 FreeDOS 时会自动执行(由此得名)。你可以使用 FreeDOS 程序 `EDIT` 来编辑这个文件。为查看或编辑这个文件的内容,输入下面的命令: + +``` +C:\>edit autoexec.bat +``` + +这一行出现在顶部附近: + +``` +SET PATH=%dosdir%\BIN +``` + +这一行定义默认路径的值。 + +在你查看 `AUTOEXEC.BAT` 后,你可以通过依次按下面的按键来退出 EDIT 应用程序: + + 1. `Alt` + 2. `f` + 3. `x` + +你也可以使用键盘快捷键 `Alt+X`。 + +### 使用完整的路径 + +如果你在你的路径中忘记包含 `C:\FDOS\BIN` ,那么你将不能快速访问存储在这里的任何应用程序,因为 FreeDOS 不知道从哪里找到它们。例如,假设我设置我的路径到我个人应用程序集合: + +``` +C:\>path=C:\HOME\BIN +``` + +内置在命令行中应用程序仍然能正常工作: + +``` +C:\cd HOME +C:\HOME>dir +ARTICLES +BIN +CHEATSHEETS +GAMES +DND +``` + +不过,外部的命令将不能运行: + +``` +C:HOME\ARTICLES>BZIP2 -c example.txt +Bad command or filename - "BZIP2" +``` + +通过提供命令的一个 _完整路径_ ,你可以总是执行一个在你的系统上且不在你的路径中的命令: + +``` +C:HOME\ARTICLES>C:\FDOS\BIN\BZIP2 -c example.txt +C:HOME\ARTICLES>DIR +example.txb +``` + +你可以使用同样的方法从外部介质或其它目录执行应用程序。 + +### FreeDOS 路径 + +通常情况下,你很可能希望在路径中保留 `C:\PDOS\BIN` ,因为它包含所有使用 FreeDOS 分发的默认应用程序。 + +除非你更改 `AUTOEXEC.BAT` 中的路径,否则将在重新启动后恢复默认路径。 + +现在,你知道如何在 FreeDOS 中管理你的路径,你能够以最适合你的方式了执行命令和维护你的工作环境。 + +_致谢 [DOS 课程 5: 路径][4] (在 CC BY-SA 4.0 协议下发布) 为本文提供的一些信息。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/path-freedos + +作者:[Kevin O'Brien][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/ahuka +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/career_journey_road_gps_path_map_520.png?itok=PpL6jJgY (Looking at a map for career journey) +[2]: https://www.freedos.org/ +[3]: https://opensource.com/article/17/6/set-path-linux +[4]: https://www.ahuka.com/dos-lessons-for-self-study-purposes/dos-lesson-5-the-path/ diff --git a/published/202103/20210225 4 new open source licenses.md b/published/202103/20210225 4 new open source licenses.md new file mode 100644 index 0000000000..56cdc56402 --- /dev/null +++ b/published/202103/20210225 4 new open source licenses.md @@ -0,0 +1,59 @@ +[#]: subject: (4 new open source licenses) +[#]: via: (https://opensource.com/article/21/2/osi-licenses-cal-cern-ohl) +[#]: author: (Pam Chestek https://opensource.com/users/pchestek) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13224-1.html) + +四个新式开源许可证 +====== + +> 让我们来看看 OSI 最新批准的加密自治许可证和 CERN 开源硬件许可协议。 + +![](https://img.linux.net.cn/data/attachment/album/202103/21/221014mw8lhxox0kkjk04z.jpg) + +作为 [开源定义][2]Open Source Defintion(OSD)的管理者,[开源促进会][3]Open Source Initiative(OSI)20 年来一直在批准“开源”许可证。这些许可证是开源软件生态系统的基础,可确保每个人都可以使用、改进和共享软件。当一个许可证获批为“开源”时,是因为 OSI 认为该许可证可以促进相互的协作和共享,从而使得每个参与开源生态的人获益。 + +在过去的 20 年里,世界发生了翻天覆地的变化。现如今,软件以新的甚至是无法想象的方式在被使用。OSI 已经预料到,曾经被人们所熟知的开源许可证现已无法满足如今的要求。因此,许可证管理者已经加强了工作,为更广泛的用途提交了几个新的许可证。OSI 所面临的挑战是在评估这些新的许可证概念是否会继续推动共享和合作,是否被值得称为“开源”许可证,最终 OSI 批准了一些用于特殊领域的新式许可证。 + +### 四个新式许可证 + +第一个是 [加密自治许可证][4]Cryptographic Autonomy License(CAL)。该许可证是为分布式密码应用程序而设计的。此许可证所解决的问题是,现有的开源许可证无法保证开放性,因为如果没有义务也与其他对等体共享数据,那么一个对等体就有可能损害网络的运行。因此,除了是一个强有力的版权保护许可外,CAL 还包括向第三方提供独立使用和修改软件所需的权限和资料的义务,而不会让第三方有数据或功能的损失。 + +随着越来越多的人使用加密结构进行点对点共享,那么更多的开发人员发现自己需要诸如 CAL 之类的法律工具也就不足为奇了。 OSI 的两个邮件列表 License-Discuss 和 License-Review 上的社区,讨论了拟议的新开源许可证,并询问了有关此许可证的诸多问题。我们希望由此产生的许可证清晰易懂,并希望对其他开源从业者有所裨益。 + +接下来是,欧洲核研究组织(CERN)提交的 CERN 开放硬件许可证Open Hardware Licence(OHL)系列许可证以供审议。它包括三个许可证,其主要用于开放硬件,这是一个与开源软件相似的开源访问领域,但有其自身的挑战和细微差别。硬件和软件之间的界线现已变得相当模糊,因此应用单独的硬件和软件许可证变得越来越困难。欧洲核子研究组织(CERN)制定了一个可以确保硬件和软件自由的许可证。 + +OSI 可能在开始时就没考虑将开源硬件许可证添加到其开源许可证列表中,但是世界早已发生变革。因此,尽管 CERN 许可证中的措词涵盖了硬件术语,但它也符合 OSI 认可的所有开源软件许可证的条件。 + +CERN 开源硬件许可证包括一个 [宽松许可证][5]、一个 [弱互惠许可证][6] 和一个 [强互惠许可证][7]。最近,该许可证已被一个国际研究项目采用,该项目正在制造可用于 COVID-19 患者的简单、易于生产的呼吸机。 + +### 了解更多 + +CAL 和 CERN OHL 许可证是针对特殊用途的,并且 OSI 不建议把它们用于其它领域。但是 OSI 想知道这些许可证是否会按预期发展,从而有助于在较新的计算机领域中培育出健壮的开源生态。 + +可以从 OSI 获得关于 [许可证批准过程][8] 的更多信息。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/osi-licenses-cal-cern-ohl + +作者:[Pam Chestek][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/pchestek +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW_lawdotgov3.png?itok=e4eFKe0l "Law books in a library" +[2]: https://opensource.org/osd +[3]: https://opensource.org/ +[4]: https://opensource.org/licenses/CAL-1.0 +[5]: https://opensource.org/CERN-OHL-P +[6]: https://opensource.org/CERN-OHL-W +[7]: https://opensource.org/CERN-OHL-S +[8]: https://opensource.org/approval diff --git a/published/202103/20210226 3 Linux terminals you need to try.md b/published/202103/20210226 3 Linux terminals you need to try.md new file mode 100644 index 0000000000..8a70f27572 --- /dev/null +++ b/published/202103/20210226 3 Linux terminals you need to try.md @@ -0,0 +1,81 @@ +[#]: subject: (3 Linux terminals you need to try) +[#]: via: (https://opensource.com/article/21/2/linux-terminals) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13186-1.html) + +值得尝试的 3 个 Linux 终端 +====== + +> Linux 让你能够选择你喜欢的终端界面,而不是它强加的界面。 + +![](https://img.linux.net.cn/data/attachment/album/202103/09/054053zum6n77cpnnug0x1.jpg) + +在 2021 年,人们喜欢 Linux 的理由比以往任何时候都多。在这个系列中,我将分享 21 个使用 Linux 的不同理由。能够选择自己的终端是使用 Linux 的一个重要原因。 + +很多人认为一旦你用过一个终端界面,你就已经用过所有的终端了。但喜欢终端的用户都知道,它们之间有一些细微但重要的区别。本文将介绍我最喜欢的三种。 + +不过在深入研究它们之前,先要了解 shell 和终端terminal之间的区别。终端(技术上说是终端模拟器terminal emulator,因为终端曾经是物理硬件设备)是一个在桌面上的窗口中运行的应用。shell 是在终端窗口中对你可见的引擎。流行的 shell 有 [Bash][2]、[tcsh][3] 和 [zsh][4],它们都在终端中运行。 + +在现代 Linux 上几乎不用说,至少本文中所有的终端都有标签界面。 + +### Xfce 终端 + +![Xfce ][5] + +[轻量级 Xfce 桌面][7] 提供了一个轻量级的终端,很好地平衡了功能和简单性。它提供了对 shell 的访问(如预期的那样),并且它可以轻松访问几个重要的配置选项。你可以设置当你双击文本时哪些字符会断字、选择你的默认字符编码,并禁用终端窗口的 Alt 快捷方式,这样你最喜欢的 Bash 快捷方式就会传递到 shell。你还可以设置字体和新的颜色主题,或者从常用预设列表中加载颜色主题。它甚至在顶部有一个可选的工具栏,方便你访问你最喜欢的功能。 + +对我来说,Xfce 的亮点功能是可以非常容易地为你打开的每一个标签页改变背景颜色。当在服务器上运行远程 shell 时,这是非常有价值的。它让我知道自己在哪个标签页中,从而避免了我犯愚蠢的错误。 + +### rxvt-unicode + +![rxvt][8] + +[rxvt 终端][9] 是我最喜欢的轻量级控制台。它有许多老式 [xterm][10] 终端仿真器的功能,但它的扩展性更强。它的配置是在 `~/.Xdefaults` 中定义的,所以没有偏好面板或设置菜单,但这使得它很容易管理和备份你的设置。通过使用一些 Perl 库,rxvt 可以有标签,并且通过 xrdb,它可以访问字体和任何你能想到的颜色主题。你可以设置像 `URxvt.urlLancher: firefox` 这样的属性来设置当你打开 URL 时启动的网页浏览器,改变滚动条的外观,修改键盘快捷键等等。 + +最初的 rxvt 不支持 Unicode(因为当时 Unicode 还不存在),但 `rxvt-unicode`(有时也叫 `urxvt`)包提供了一个完全支持 Unicode 的补丁版本。 + +我在每台电脑上都有 rxvt,因为对我来说它是最好的通用终端。它不一定是所有用户的最佳终端(例如,它没有拖放界面)。不过,对于寻找快速和灵活终端的中高级用户来说,rxvt 是一个简单的选择。 + +### Konsole + +![Konsole][11] + +Konsole 是 KDE Plasma 桌面的终端,是我转到 Linux 后使用的第一个终端,所以它是我对所有其他终端的标准。它确实设定了一个很高的标准。Konsole 有所有通常的不错的功能(还有些其他的),比如简单的颜色主题加上配置文件支持、字体选择、编码、可分离标签、可重命名标签等等。但这在现代桌面上是可以预期的(至少,如果你的桌面运行的是 Plasma 的话)。 + +Konsole 比其他终端领先许多年(或者几个月)。它可以垂直或水平地分割窗口。你可以把输入复制到所有的标签页上(就像 [tmux][12] 一样)。你可以将其设置为监视自身是否静音或活动并配置通知。如果你在 Android 手机上使用 KDE Connect,这意味着当一个任务完成时,你可以在手机上收到通知。你可以将 Konsole 的输出保存到文本或 HTML 文件中,为打开的标签页添加书签,克隆标签页,调整搜索设置等等。 + +Konsole 是一个真正的高级用户终端,但它也非常适合新用户。你可以将文件拖放到 Konsole 中,将目录改为硬盘上的特定位置,也可以将路径粘贴进去,甚至可以将文件复制到 Konsole 的当前工作目录中。这让使用终端变得很简单,这也是所有用户都能理解的。 + +### 尝试一个终端 + +你的审美观念是黑暗的办公室和黑色背景下绿色文字的温暖光芒吗?还是喜欢阳光明媚的休息室和屏幕上舒缓的墨黑色字体?无论你对完美电脑设置的愿景是什么,如果你喜欢通过输入命令高效地与操作系统交流,那么 Linux 已经为你提供了一个接口。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-terminals + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/freedos.png?itok=aOBLy7Ky (4 different color terminal windows with code) +[2]: https://opensource.com/resources/what-bash +[3]: https://opensource.com/article/20/8/tcsh +[4]: https://opensource.com/article/19/9/getting-started-zsh +[5]: https://opensource.com/sites/default/files/uploads/terminal-xfce.jpg (Xfce ) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/article/19/12/xfce-linux-desktop +[8]: https://opensource.com/sites/default/files/uploads/terminal-rxvt.jpg (rxvt) +[9]: https://opensource.com/article/19/10/why-use-rxvt-terminal +[10]: https://opensource.com/article/20/7/xterm +[11]: https://opensource.com/sites/default/files/uploads/terminal-konsole.jpg (Konsole) +[12]: https://opensource.com/article/20/1/tmux-console diff --git a/published/202103/20210228 How to Install the Latest Erlang on Ubuntu Linux.md b/published/202103/20210228 How to Install the Latest Erlang on Ubuntu Linux.md new file mode 100644 index 0000000000..57d06c19bb --- /dev/null +++ b/published/202103/20210228 How to Install the Latest Erlang on Ubuntu Linux.md @@ -0,0 +1,120 @@ +[#]: subject: (How to Install the Latest Erlang on Ubuntu Linux) +[#]: via: (https://itsfoss.com/install-erlang-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13182-1.html) + +如何在 Ubuntu Linux 上安装最新的 Erlang +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/07/001753blfwcg2gc2c2lcgl.jpg) + +[Erlang][1] 是一种用于构建大规模可扩展实时系统的函数式编程语言。Erlang 最初是由 [爱立信][2] 创建的专有软件,后来被开源。 + +Erlang 在 [Ubuntu 的 Universe 仓库][3] 中可用。启用该仓库后,你可以使用下面的命令轻松安装它: + +``` +sudo apt install erlang +``` + +![][4] + +但是,*Ubuntu 仓库提供的 Erlang 版本可能不是最新的*。 + +如果你想要 Ubuntu 上最新的 Erlang 版本,你可以添加 [Erlang Solutions 提供的][5]仓库。它们为各种 Linux 发行版、Windows 和 macOS 提供了预编译的二进制文件。 + +如果你之前安装了一个名为 `erlang` 的包,那么它将会被升级到由添加的仓库提供的较新版本。 + +### 在 Ubuntu 上安装最新版本的 Erlang + +你需要[在 Linux 终端下载密钥文件][6]。你可以使用 `wget` 工具,所以请确保你已经安装了它: + +``` +sudo apt install wget +``` + +接下来,使用 `wget` 下载 Erlang Solution 仓库的 GPG 密钥,并将其添加到你的 apt 打包系统中。添加了密钥后,你的系统就会信任来自该仓库的包。 + +``` +wget -O- https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | sudo apt-key add - +``` + +现在,你应该在你的 APT `sources.list.d` 目录下为 Erlang 添加一个文件,这个文件将包含有关仓库的信息,APT 包管理器将使用它来获取包和未来的更新。 + +对于 Ubuntu 20.04(和 Ubuntu 20.10),使用以下命令: + +``` +echo "deb https://packages.erlang-solutions.com/ubuntu focal contrib" | sudo tee /etc/apt/sources.list.d/erlang-solution.list +``` + +我知道上面的命令提到了 Ubuntu 20.04 focal,但它也适用于 Ubuntu 20.10 groovy。 + +对于 **Ubuntu 18.04**,使用以下命令: + +``` +echo "deb https://packages.erlang-solutions.com/ubuntu bionic contrib" | sudo tee /etc/apt/sources.list.d/erlang-solution.list +``` + +你必须更新本地的包缓存,以通知它关于新添加的仓库的包。 + +``` +sudo apt update +``` + +你会注意到,它建议你进行一些升级。如果你列出了可用的升级,你会在那里找到 erlang 包。要更新现有的 erlang 版本或重新安装,使用这个命令: + +``` +sudo apt install erlang +``` + +安装好后,你可以测试一下。 + +![][7] + +要退出 Erlang shell,使用 `Ctrl+g`,然后输入 `q`,由于我从来没有用过 Erlang,所以我只好尝试了一些按键,然后发现了操作方法。 + +#### 删除 erlang + +要删除该程序,请使用以下命令: + +``` +sudo apt remove erlang +``` + +还会有一些依赖关系。你可以用下面的命令删除它们: + +``` +sudo apt autoremove +``` + +如果你愿意,你也可以删除添加的仓库文件。 + +``` +sudo rm /etc/apt/sources.list.d/erlang-solution.list +``` + +就是这样。享受在 Ubuntu Linux 上使用 Erlang 学习和编码的乐趣。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-erlang-ubuntu/ + +作者:[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://www.erlang.org/ +[2]: https://www.ericsson.com/en +[3]: https://itsfoss.com/ubuntu-repositories/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/install-erlang-ubuntu.png?resize=800%2C445&ssl=1 +[5]: https://www.erlang-solutions.com/downloads/ +[6]: https://itsfoss.com/download-files-from-linux-terminal/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/erlang-shell.png?resize=800%2C274&ssl=1 diff --git a/published/202103/20210301 4 open source tools for running a Linux server.md b/published/202103/20210301 4 open source tools for running a Linux server.md new file mode 100644 index 0000000000..9e19ca6352 --- /dev/null +++ b/published/202103/20210301 4 open source tools for running a Linux server.md @@ -0,0 +1,95 @@ +[#]: subject: (4 open source tools for running a Linux server) +[#]: via: (https://opensource.com/article/21/3/linux-server) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13192-1.html) + +4 个打造多媒体和共享服务器的开源工具 +====== + +> 通过 Linux,你可以将任何设备变成服务器,以共享数据、媒体文件,以及其他资源。 + +![](https://img.linux.net.cn/data/attachment/album/202103/10/200529sqfnhnh553xfixuw.jpg) + +在 2021 年,人们喜欢 Linux 的理由比以往任何时候都多。在这个系列中,我将分享 21 个使用 Linux 的不同理由。这里有四个开源工具,可以将任何设备变成 Linux 服务器。  + +有时,我会发现有关服务器概念的某种神秘色彩。许多人,如果他们在脑海中有一个形象的话,他们认为服务器一定是又大又重的机架式机器,由一个谨慎的系统管理员和一群神奇的修理工精心维护。另一些人则把服务器设想成虚无缥缈的云朵,以某种方式为互联网提供动力。 + +虽然这种敬畏对 IT 工作的安全性是有好处的,但事实上,在开源计算中,没有人认为服务器是或应该是专家的专属领域。文件和资源共享是开源不可或缺的,而开源让它变得比以往任何时候都更容易,正如这四个开源服务器项目所展示的那样。 + +### Samba + +[Samba 项目][2] 是 Linux 和 Unix 的 Windows 互操作程序套件。尽管它是大多数用户从未与之交互的底层代码,但它的重要性却不容小觑。从历史上看,早在微软争相消灭 Linux 和开源的时候,它就是最大最重要的目标。时代变了,微软已经与 Samba 团队会面以提供支持(至少目前是这样),在这一切中,该项目继续确保 Linux 和 Windows 计算机可以轻松地在同一网络上共存。换句话说,无论你使用什么平台,Samba 都可以让你可以轻松地在本地网络上共享文件。 + +在 [KDE Plasma][3] 桌面上,你可以右键点击自己的任何目录,选择**属性**。在**属性**对话框中,点击**共享**选项卡,并启用**与 Samba 共享(Microsoft Windows)**。 + +![Samba][4] + +就这样,你已经为本地网络上的用户打开了一个只读访问的目录。也就是说,当你在家的时候,你家同一个 WiFi 网络上的任何人都可以访问该文件夹,如果你在工作,工作场所网络上的任何人都可以访问该文件夹。当然,要访问它,其他用户需要知道在哪里可以找到它。通往计算机的路径可以用 [IP 地址][6] 表示,也可以根据你的网络配置,用主机名表示。 + +### Snapdrop + +如果通过 IP 地址和主机名来打开网络是令人困惑的,或者如果你不喜欢打开一个文件夹进行共享而忘记它是开放的,那么你可能更喜欢 [Snapdrop][7]。这是一个开源项目,你可以自己运行,也可以使用互联网上的演示实例通过 WebRTC 连接计算机。WebRTC 可以通过 Web 浏览器实现点对点的连接,也就是说同一网络上的两个用户可以通过 Snapdrop 找到对方,然后直接进行通信,而不需要通过外部服务器。 + +![Snapdrop][8] + +一旦两个或更多的客户端连接了同一个 Snapdrop 服务,用户就可以通过本地网络来回交换文件和聊天信息。传输的速度很快,而且你的数据也保持在本地。 + +### VLC + +流媒体服务比以往任何时候都更常见,但我在音乐和电影方面有非常规的口味,所以典型的服务似乎很少有我想要的东西。幸运的是,通过连接到媒体驱动器,我可以很容易地将自己的内容从我的电脑上传送到我的房子各个角落。例如,当我想在电脑显示器以外的屏幕上观看一部电影时,我可以在我的网络上串流电影文件,并通过任何可以接收 HTTP 的应用来播放它,无论该应用是在我的电视、游戏机还是手机上。 + +[VLC][9] 可以轻松设置流媒体。事实上,它是**媒体**菜单中的一个选项,或者你可以按下键盘 `Ctrl+S`。将一个文件或一组文件添加到你的流媒体队列中,然后点击 **Stream** 按钮。 + +![VLC][10] + +VLC 通过配置向导来帮助你决定流媒体数据时使用什么协议。我倾向于使用 HTTP,因为它通常在任何设备上可用。当 VLC 开始播放文件时,请进入播放文件计算机的 IP 或主机名以及给它分配的端口 (当使用 HTTP 时,默认是 8080), 然后坐下来享受。 + +### PulseAudio + +我最喜欢的现代 Linux 功能之一是 [PulseAudio][11]。Pulse 为 Linux 上的音频实现了惊人的灵活性,包括可自动发现的本地网络流媒体。这个功能对我来说的好处是,我可以在办公室的工作站上播放播客和技术会议视频,并通过手机串流音频。无论我走进厨房、休息室还是后院最远的地方,我都能获得完美的音频。此功能在 PulseAudio 之前很久就存在,但是 Pulse 使它像单击按钮一样容易。 + +需要进行一些设置。首先,你必须确保安装 PulseAudio 设置包(**paprefs**),以便在 PulseAudio 配置中启用网络音频。 + +![PulseAudio][12] + +在 **paprefs** 中,启用网络访问你的本地声音设备,可能不需要认证(假设你信任本地网络上的其他人),并启用你的计算机作为 **Multicast/RTP 发送者**。我通常只选择串流通过我的扬声器播放的任何音频,但你可以在 Pulse 输出选项卡中创建一个单独的音频设备,这样你就可以准确地选择串流的内容。你在这里有三个选项: + + * 串流任何在扬声器上播放的音频 + * 串流所有输出的声音 + * 只将音频直接串流到多播设备(按需)。 + +一旦启用,你的声音就会串流到网络中,并可被其他本地 Linux 设备接收。这是简单和动态的音频共享。 + +### 分享的不仅仅是代码 + +Linux 是共享的。它在服务器领域很有名,因为它很擅长*服务*。无论是提供音频流、视频流、文件,还是出色的用户体验,每一台 Linux 电脑都是一台出色的 Linux 服务器。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/linux-server + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rack_server_sysadmin_cloud_520.png?itok=fGmwhf8I (A rack of servers, blue background) +[2]: http://samba.org +[3]: https://opensource.com/article/19/12/linux-kde-plasma +[4]: https://opensource.com/sites/default/files/uploads/samba_0.jpg (Samba) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/18/5/how-find-ip-address-linux +[7]: https://github.com/RobinLinus/snapdrop +[8]: https://opensource.com/sites/default/files/uploads/snapdrop.jpg (Snapdrop) +[9]: https://www.videolan.org/index.html +[10]: https://opensource.com/sites/default/files/uploads/vlc-stream.jpg (VLC) +[11]: https://www.freedesktop.org/wiki/Software/PulseAudio/ +[12]: https://opensource.com/sites/default/files/uploads/pulse.jpg (PulseAudio) diff --git a/published/202103/20210302 Meet SysMonTask- A Windows Task Manager Lookalike for Linux.md b/published/202103/20210302 Meet SysMonTask- A Windows Task Manager Lookalike for Linux.md new file mode 100644 index 0000000000..f26fb208ae --- /dev/null +++ b/published/202103/20210302 Meet SysMonTask- A Windows Task Manager Lookalike for Linux.md @@ -0,0 +1,130 @@ +[#]: subject: (Meet SysMonTask: A Windows Task Manager Lookalike for Linux) +[#]: via: (https://itsfoss.com/sysmontask/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13189-1.html) + +SysMonTask:一个类似于 Windows 任务管理器的 Linux 系统监控器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/09/232304ljsr5jfgluffn4a4.jpg) + +得益于桌面环境,几乎所有的 [Linux 发行版都带有任务管理器应用程序][1]。除此之外,还有 [一些其他的 Linux 的系统监控应用程序][2],它们具有更多的功能。 + +但最近我遇到了一个为 Linux 创建的任务管理器,它看起来像……嗯……Windows 的任务管理器。 + +你自己看看就知道了。 + +![][3] + +就我个人而言,我不确定用户界面的相似性是否有意义,但开发者和其他一些 Linux 用户可能不同意我的观点。 + +### SysMonTask: 一个具有 Windows 任务管理器外观的系统监控器 + +![][4] + +开源软件 [SysMonTask][5] 将自己描述为“具有 Windows 任务管理器的紧凑性和实用性的 Linux 系统监控器,以实现更高的控制和监控”。 + +SysMonTask 以 Python 编写,拥有以下功能: + + * 系统监控图。 + * 显示 CPU、内存、磁盘、网络适配器、单个 Nvidia GPU 的统计数据。 + * 在最近的版本中增加了对挂载磁盘列表的支持。 + * 用户进程选项卡可以进行进程过滤,显示递归-CPU、递归-内存和列头的汇总值。 + * 当然,你可以在进程选项卡中杀死一个进程。 + * 还支持系统主题(深色和浅色)。 + +### 体验 SysMonTask + +SysMonTask 需要提升权限。当你启动它时,你会被要求提供你的管理员密码。我不喜欢一个任务管理器一直用 `sudo` 运行,但这只是我的喜好。 + +我玩了一下,探索它的功能。磁盘的使用量基本稳定不变,所以我把一个 10GB 的文件从外部 SSD 复制到笔记本的磁盘上几次。你可以看到文件传输时对应的峰值。 + +![][6] + +进程标签也很方便。它在列的顶部显示了累积的资源利用率。 + +杀死按钮被添加在底部,所以你要做的就是选择一个进程,然后点击“Killer” 按钮。它在 [杀死进程][7] 之前会询问你的确认。 + +![][8] + +### 在 Linux 发行版上安装 SysMonTask + +对于一个简单的应用程序,它需要下载 50 MB 的存档文件,并占用了大约 200 MB 的磁盘。我想这是因为 Python 的依赖性。 + +还有就是它读取的是 env。 + +在写这篇文章的时候,SysMonTask 可以通过 [PPA][9] 在基于 Ubuntu 的发行版上使用。 + +在基于 Ubuntu 的发行版上,打开一个终端,使用以下命令添加 PPA 仓库: + +``` +sudo add-apt-repository ppa:camel-neeraj/sysmontask +``` + +当然,你会被要求输入密码。在新版本中,仓库列表会自动更新。所以,你可以直接安装应用程序: + +``` +sudo apt install sysmontask +``` + +基于 Debian 的发行版也可以尝试从 deb 文件中安装它。它可以在发布页面找到。 + +对于其他发行版,没有现成的软件包。令我惊讶的是,它基本上是一个 Python 应用程序,所以可以为其他发行版添加一个 PIP 安装程序。也许开发者会在未来的版本中添加它。 + +由于它是开源软件,你可以随时得到源代码。 + +- [SysMonTask Deb 文件和源代码][10] + +安装完毕后,在菜单中寻找 SysMonTask,并从那里启动它。 + +#### 删除 SysMonTask + +如果你想删除它,使用以下命令: + +``` +sudo apt remove sysmontask +``` + +最好也 [删除 PPA][11]: + +``` +sudo add-apt-repository -r ppa:camel-neeraj/sysmontask +``` + +你也可以在这里 [使用 PPA 清除][12] 工具,这是一个处理 PPA 应用程序删除的方便工具。 + +### 你会尝试吗? + +对我来说,功能比外观更重要。SysMonTask 确实有额外的功能,监测磁盘性能和检查 GPU 统计数据,这是其他系统监视器通常不包括的东西。 + +如果你尝试并喜欢它,也许你会喜欢添加 `Ctrl+Alt+Del` 快捷键来启动 SysMonTask,以获得完整的感觉 :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/sysmontask/ + +作者:[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/task-manager-linux/ +[2]: https://itsfoss.com/linux-system-monitoring-tools/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/sysmontask-1.png?resize=800%2C559&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/SysMonTask-CPU.png?resize=800%2C537&ssl=1 +[5]: https://github.com/KrispyCamel4u/SysMonTask +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/sysmontask-disk-usage.png?resize=800%2C498&ssl=1 +[7]: https://itsfoss.com/how-to-find-the-process-id-of-a-program-and-kill-it-quick-tip/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/kill-process-sysmontask.png?resize=800%2C500&ssl=1 +[9]: https://itsfoss.com/ppa-guide/ +[10]: https://github.com/KrispyCamel4u/SysMonTask/releases +[11]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ +[12]: https://itsfoss.com/ppa-purge/ diff --git a/published/202103/20210303 Guake Terminal- A Customizable Linux Terminal for Power Users -Inspired by an FPS Game.md b/published/202103/20210303 Guake Terminal- A Customizable Linux Terminal for Power Users -Inspired by an FPS Game.md new file mode 100644 index 0000000000..14688c7cde --- /dev/null +++ b/published/202103/20210303 Guake Terminal- A Customizable Linux Terminal for Power Users -Inspired by an FPS Game.md @@ -0,0 +1,102 @@ +[#]: subject: (Guake Terminal: A Customizable Linux Terminal for Power Users [Inspired by an FPS Game]) +[#]: via: (https://itsfoss.com/guake-terminal/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13187-1.html) + +Guake 终端:一个灵感来自于 FPS 游戏的 Linux 终端 +====== + +> 使用 Guake 终端这个可自定义且强大的适合各种用户的工具快速访问你的终端。 + +### Guake 终端:GNOME 桌面中自上而下终端 + +![](https://img.linux.net.cn/data/attachment/album/202103/09/062119ba36tottztz4torn.jpg) + +[Guake][2] 是一款为 GNOME 桌面量身定做的终端模拟器,采用下拉式设计。 + +它最初的灵感来自于一款 FPS 游戏([Quake][3])中的终端。尽管它最初是作为一个快速和易于使用的终端而设计的,但它的功能远不止于此。 + +Guake 终端提供了大量的功能,以及可定制的选项。在这里,我将重点介绍终端的主要功能,以及如何将它安装到你的任何 Linux 发行版上。 + +### Guake 终端的特点 + +![][4] + + * 按下键盘快捷键(`F12`)以覆盖方式在任何地方启动终端 + * Guake 终端在后台运行,以便持久访问 + * 能够横向和纵向分割标签页 + * 从可用的 shell 中(如果有的话)更改默认的 shell + * 重新对齐 + * 从多种调色板中选择改变终端的外观 + * 能够使用 GUI 方式将终端内容保存到文件中 + * 需要时切换全屏 + * 你可以轻松地保存标签,或在需要时打开新的标签 + * 恢复标签的能力 + * 可选择配置和学习新的键盘快捷键,以快速访问终端和执行任务 + * 改变特定选项卡的颜色 + * 轻松重命名标签,快速访问你需要的内容 + * 快速打开功能,只需点击一下,就可直接在终端中用你最喜欢的编辑器打开文件 + * 能够在启动或显示 Guake 终端时添加自己的命令或脚本。 + * 支持多显示器 + +![][5] + +只是出于乐趣,你可以做很多事情。但是,我也相信,高级用户可以利用这些功能使他们的终端体验更轻松,更高效。 + +就我用它来测试一些东西和写这篇文章的时候,说实话,我觉得我是在召唤终端。所以,我绝对觉得它很酷! + +### 在 Linux 上安装 Guake + +![][6] + +在 Ubuntu、Fedora 和 Arch 的默认仓库中都有 Guake 终端。 + +你可以按照它的官方说明来了解你可以使用的命令,如果你使用的是基于 Ubuntu 的发行版,只需输入: + +``` +sudo apt install guake +``` + +请注意,使用这种方法可能无法获得最新版本。所以,如果你想获得最新的版本,你可以选择使用 [Linux Uprising][7] 的 PPA 来获得最新版本: + +``` +sudo add-apt-repository ppa:linuxuprising/guake +sudo apt update +sudo apt install guake +``` + +无论是哪种情况,你也可以使用 [Pypi][8] 或者参考[官方文档][9]或从 [GitHub 页面][10]获取源码。 + +- [Guake Terminal][10] + +你觉得 Guake 终端怎么样?你认为它是一个有用的终端仿真器吗?你知道有什么类似的软件吗? + +欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/guake-terminal/ + +作者:[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/2021/02/guake-terminal-1.png?resize=800%2C363&ssl=1 +[2]: http://guake-project.org/ +[3]: https://quake.bethesda.net/en +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/guake-terminal.jpg?resize=800%2C245&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/guake-preferences.jpg?resize=800%2C559&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/guake-terminal-2.png?resize=800%2C432&ssl=1 +[7]: https://www.linuxuprising.com/ +[8]: https://pypi.org/ +[9]: https://guake.readthedocs.io/en/latest/user/installing.html +[10]: https://github.com/Guake/guake diff --git a/published/202103/20210304 An Introduction to WebAssembly.md b/published/202103/20210304 An Introduction to WebAssembly.md new file mode 100644 index 0000000000..a949407612 --- /dev/null +++ b/published/202103/20210304 An Introduction to WebAssembly.md @@ -0,0 +1,84 @@ +[#]: subject: (An Introduction to WebAssembly) +[#]: via: (https://www.linux.com/news/an-introduction-to-webassembly/) +[#]: author: (Marco Fioretti https://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13197-1.html) + +WebAssembly 介绍 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/12/222938jww882da88oqzays.jpg) + +### 到底什么是 WebAssembly? + +[WebAssembly][1],也叫 Wasm,是一种为 Web 优化的代码格式和 API(应用编程接口),它可以大大提高网站的性能和能力。WebAssembly 的 1.0 版本于 2017 年发布,并于 2019 年成为 W3C 官方标准。 + +该标准得到了所有主流浏览器供应商的积极支持,原因显而易见:官方列出的 [“浏览器内部”用例][2] 中提到了,其中包括视频编辑、3D 游戏、虚拟和增强现实、p2p 服务和科学模拟。除了让浏览器的功能比JavaScript 强大得多,该标准甚至可以延长网站的寿命:例如,正是 WebAssembly 为 [互联网档案馆的 Flash 动画和游戏][3] 提供了持续的支持。 + +不过,WebAssembly 并不只用于浏览器,目前它还被用于移动和基于边缘环境的 Cloudflare Workers 等产品中。 + +### WebAssembly 如何工作? + +.wasm 格式的文件包含低级二进制指令(字节码),可由使用通用栈的虚拟机以“接近 CPU 原生速度”执行。这些代码被打包成模块(可以被浏览器直接执行的对象),每个模块可以被一个网页多次实例化。模块内部定义的函数被列在一个专用数组中,或称为Table,相应的数据被包含在另一个结构中,称为 缓存数组arraybuffer。开发者可以通过 Javascript `WebAssembly.memory()` 的调用,为 .wasm 代码显式分配内存。 + +.wasm 格式也有纯文本版本,它可以大大简化学习和调试。然而,WebAssembly 并不是真的要供人直接使用。从技术上讲,.wasm 只是一个与浏览器兼容的**编译目标**:一种用高级编程语言编写的软件编译器可以自动翻译的代码格式。 + +这种选择正是使开发人员能够使用数十亿人熟悉的语言(C/C++、Python、Go、Rust 等)直接为用户界面进行编程的方式,但以前浏览器无法对其进行有效利用。更妙的是,至少在理论上程序员可以利用它们,无需直接查看 WebAssembly 代码,也无需担心物理 CPU 实际运行他们的代码(因为目标是一个**虚拟**机)。 + +### 但是我们已经有了 JavaScript,我们真的需要 WebAssembly 吗? + +是的,有几个原因。首先,作为二进制指令,.wasm 文件比同等功能的 JavaScript 文件小得多,下载速度也快得多。最重要的是,Javascript 文件必须在浏览器将其转换为其内部虚拟机可用的字节码之前进行完全解析和验证。 + +而 .wasm 文件则可以一次性验证和编译,从而使“流式编译”成为可能:浏览器在开始**下载它们**的那一刻就可以开始编译和执行它们,就像串流电影一样。 + +这就是说,并不是所有可以想到的 WebAssembly 应用都肯定会比由专业程序员手动优化的等效 JavaScript 应用更快或更小。例如,如果一些 .wasm 需要包含 JavaScript 不需要的库,这种情况可能会发生。 + +### WebAssembly 是否会让 JavaScript 过时? + +一句话:不会。暂时不会,至少在浏览器内不会。WebAssembly 模块仍然需要 JavaScript,因为在设计上它们不能访问文档对象模型 (DOM)—— [主要用于修改网页的 API][4]。此外,.wasm 代码不能进行系统调用或读取浏览器的内存。WebAssembly 只能在沙箱中运行,一般来说,它能与外界的交互甚至比 JavaScript 更少,而且只能通过 JavaScript 接口进行。 + +因此,至少在不久的将来 .wasm 模块将只是通过 JavaScript 提供那些如果用 JavaScript 语言编写会消耗更多带宽、内存或 CPU 时间的部分。 + +### Web 浏览器如何运行 WebAssembly? + +一般来说,浏览器至少需要两块来处理动态应用:运行应用代码的虚拟机(VM),以及可以同时修改浏览器行为和网页显示的 API。 + +现代浏览器内部的虚拟机通过以下方式同时支持 JavaScript 和 WebAssembly: + + 1. 浏览器下载一个用 HTML 标记语言编写的网页,然后进行渲染 + 2. 如果该 HTML 调用 JavaScript 代码,浏览器的虚拟机就会执行该代码。但是... + 3. 如果 JavaScript 代码中包含了 WebAssembly 模块的实例,那么就按照上面的描述获取该实例,然后根据需要通过 JavaScript 的 WebAssembly API 来使用该实例 + 4. 当 WebAssembly 代码产生的东西将修改 DOM(即“宿主”网页)的结构,JavaScript 代码就会接收到,并继续进行实际的修改。 + +### 我如何才能创建可用的 WebAssembly 代码? + +越来越多的编程语言社区支持直接编译到 Wasm,我们建议从 webassembly.org 的 [入门指南][5] 开始,这取决于你使用什么语言。请注意,并不是所有的编程语言都有相同水平的 Wasm 支持,因此你的工作量可能会有所不同。  + +我们计划在未来几个月内发布一系列文章,提供更多关于 WebAssembly 的信息。要自己开始使用它,你可以报名参加 Linux 基金会的免费 [WebAssembly 介绍][6]在线培训课程。 + +这篇[WebAssembly 介绍][7]首次发布在 [Linux Foundation – Training][8]。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/an-introduction-to-webassembly/ + +作者:[Dan 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://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/ +[b]: https://github.com/lujun9972 +[1]: https://webassembly.org/ +[2]: https://webassembly.org/docs/use-cases/ +[3]: https://blog.archive.org/2020/11/19/flash-animations-live-forever-at-the-internet-archive/ +[4]: https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction +[5]: https://webassembly.org/getting-started/developers-guide/ +[6]: https://training.linuxfoundation.org/training/introduction-to-webassembly-lfd133/ +[7]: https://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/ +[8]: https://training.linuxfoundation.org/ diff --git a/published/202103/20210304 Learn to debug code with the GNU Debugger.md b/published/202103/20210304 Learn to debug code with the GNU Debugger.md new file mode 100644 index 0000000000..0aa5d13cda --- /dev/null +++ b/published/202103/20210304 Learn to debug code with the GNU Debugger.md @@ -0,0 +1,301 @@ +[#]: subject: (Learn to debug code with the GNU Debugger) +[#]: via: (https://opensource.com/article/21/3/debug-code-gdb) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13203-1.html) + +学习使用 GDB 调试代码 +====== + +> 使用 GNU 调试器来解决你的代码问题。 + +![](https://img.linux.net.cn/data/attachment/album/202103/14/210547k3q5lek8j9qspkks.jpg) + +GNU 调试器常以它的命令 `gdb` 称呼它,它是一个交互式的控制台,可以帮助你浏览源代码、分析执行的内容,其本质上是对错误的应用程序中出现的问题进行逆向工程。 + +故障排除的麻烦在于它很复杂。[GNU 调试器][2] 并不是一个特别复杂的应用程序,但如果你不知道从哪里开始,甚至不知道何时和为何你可能需要求助于 GDB 来进行故障排除,那么它可能会让人不知所措。如果你一直使用 `print`、`echo` 或 [printf 语句][3]来调试你的代码,当你开始思考是不是还有更强大的东西时,那么本教程就是为你准备的。 + +### 有错误的代码 + +要开始使用 GDB,你需要一些代码。这里有一个用 C++ 写的示例应用程序(如果你一般不使用 C++ 编写程序也没关系,在所有语言中原理都是一样的),其来源于 [猜谜游戏系列][4] 中的一个例子。 + +``` +#include +#include //srand +#include //printf + +using namespace std; + +int main () { + +srand (time(NULL)); +int alpha = rand() % 8; +cout << "Hello world." << endl; +int beta = 2; + +printf("alpha is set to is %s\n", alpha); +printf("kiwi is set to is %s\n", beta); + + return 0; +} // main +``` + +这个代码示例中有一个 bug,但它确实可以编译(至少在 GCC 5 的时候)。如果你熟悉 C++,你可能已经看到了,但这是一个简单的问题,可以帮助新的 GDB 用户了解调试过程。编译并运行它就可以看到错误: + +``` +$ g++ -o buggy example.cpp +$ ./buggy +Hello world. +Segmentation fault +``` + +### 排除段故障 + +从这个输出中,你可以推测变量 `alpha` 的设置是正确的,因为否则的话,你就不会看到它*后面*的那行代码执行。当然,这并不总是正确的,但这是一个很好的工作理论,如果你使用 `printf` 作为日志和调试器,基本上也会得出同样的结论。从这里,你可以假设 bug 在于成功打印的那一行之后的*某行*。然而,不清楚错误是在下一行还是在几行之后。 + +GNU 调试器是一个交互式的故障排除工具,所以你可以使用 `gdb` 命令来运行错误的代码。为了得到更好的结果,你应该从包含有*调试符号*的源代码中重新编译你的错误应用程序。首先,看看 GDB 在不重新编译的情况下能提供哪些信息: + +``` +$ gdb ./buggy +Reading symbols from ./buggy...done. +(gdb) start +Temporary breakpoint 1 at 0x400a44 +Starting program: /home/seth/demo/buggy + +Temporary breakpoint 1, 0x0000000000400a44 in main () +(gdb) +``` + +当你以一个二进制可执行文件作为参数启动 GDB 时,GDB 会加载该应用程序,然后等待你的指令。因为这是你第一次在这个可执行文件上运行 GDB,所以尝试重复这个错误是有意义的,希望 GDB 能够提供进一步的见解。很直观,GDB 用来启动它所加载的应用程序的命令就是 `start`。默认情况下,GDB 内置了一个*断点*,所以当它遇到你的应用程序的 `main` 函数时,它会暂停执行。要让 GDB 继续执行,使用命令 `continue`: + +``` +(gdb) continue +Continuing. +Hello world. + +Program received signal SIGSEGV, Segmentation fault. +0x00007ffff71c0c0b in vfprintf () from /lib64/libc.so.6 +(gdb) +``` + +毫不意外:应用程序在打印 “Hello world” 后不久就崩溃了,但 GDB 可以提供崩溃发生时正在发生的函数调用。这有可能就足够你找到导致崩溃的 bug,但为了更好地了解 GDB 的功能和一般的调试过程,想象一下,如果问题还没有变得清晰,你想更深入地挖掘这段代码发生了什么。 + +### 用调试符号编译代码 + +要充分利用 GDB,你需要将调试符号编译到你的可执行文件中。你可以用 GCC 中的 `-g` 选项来生成这个符号: + +``` +$ g++ -g -o debuggy example.cpp +$ ./debuggy +Hello world. +Segmentation fault +``` + +将调试符号编译到可执行文件中的结果是得到一个大得多的文件,所以通常不会分发它们,以增加便利性。然而,如果你正在调试开源代码,那么用调试符号重新编译测试是有意义的: + +``` +$ ls -l *buggy* *cpp +-rw-r--r--    310 Feb 19 08:30 debug.cpp +-rwxr-xr-x  11624 Feb 19 10:27 buggy* +-rwxr-xr-x  22952 Feb 19 10:53 debuggy* +``` + +### 用 GDB 调试 + +加载新的可执行文件(本例中为 `debuggy`)以启动 GDB: + +``` +$ gdb ./debuggy +Reading symbols from ./debuggy...done. +(gdb) start +Temporary breakpoint 1 at 0x400a44 +Starting program: /home/seth/demo/debuggy + +Temporary breakpoint 1, 0x0000000000400a44 in main () +(gdb) +``` + +如前所述,使用 `start` 命令进行: + +``` +(gdb) start +Temporary breakpoint 1 at 0x400a48: file debug.cpp, line 9. +Starting program: /home/sek/demo/debuggy + +Temporary breakpoint 1, main () at debug.cpp:9 +9       srand (time(NULL)); +(gdb) +``` + +这一次,自动的 `main` 断点可以指明 GDB 暂停的行号和该行包含的代码。你可以用 `continue` 恢复正常操作,但你已经知道应用程序在完成之前就会崩溃,因此,你可以使用 `next` 关键字逐行步进检查你的代码: + +``` +(gdb) next +10 int alpha = rand() % 8; +(gdb) next +11 cout << "Hello world." << endl; +(gdb) next +Hello world. +12 int beta = 2; +(gdb) next +14 printf("alpha is set to is %s\n", alpha); +(gdb) next + +Program received signal SIGSEGV, Segmentation fault. +0x00007ffff71c0c0b in vfprintf () from /lib64/libc.so.6 +(gdb) +``` + +从这个过程可以确认,崩溃不是发生在设置 `beta` 变量的时候,而是执行 `printf` 行的时候。这个 bug 在本文中已经暴露了好几次(破坏者:向 `printf` 提供了错误的数据类型),但暂时假设解决方案仍然不明确,需要进一步调查。 + +### 设置断点 + +一旦你的代码被加载到 GDB 中,你就可以向 GDB 询问到目前为止代码所产生的数据。要尝试数据自省,通过再次发出 `start` 命令来重新启动你的应用程序,然后进行到第 11 行。一个快速到达 11 行的简单方法是设置一个寻找特定行号的断点: + +``` +(gdb) start +The program being debugged has been started already. +Start it from the beginning? (y or n) y +Temporary breakpoint 2 at 0x400a48: file debug.cpp, line 9. +Starting program: /home/sek/demo/debuggy + +Temporary breakpoint 2, main () at debug.cpp:9 +9       srand (time(NULL)); +(gdb) break 11 +Breakpoint 3 at 0x400a74: file debug.cpp, line 11. +``` + +建立断点后,用 `continue` 继续执行: + +``` +(gdb) continue +Continuing. + +Breakpoint 3, main () at debug.cpp:11 +11 cout << "Hello world." << endl; +(gdb) +``` + +现在暂停在第 11 行,就在 `alpha` 变量被设置之后,以及 `beta` 被设置之前。 + +### 用 GDB 进行变量自省 + +要查看一个变量的值,使用 `print` 命令。在这个示例代码中,`alpha` 的值是随机的,所以你的实际结果可能与我的不同: + +``` +(gdb) print alpha +$1 = 3 +(gdb) +``` + +当然,你无法看到一个尚未建立的变量的值: + +``` +(gdb) print beta +$2 = 0 +``` + + +### 使用流程控制 + +要继续进行,你可以步进代码行来到达将 `beta` 设置为一个值的位置: + +``` +(gdb) next +Hello world. +12  int beta = 2; +(gdb) next +14  printf("alpha is set to is %s\n", alpha); +(gdb) print beta +$3 = 2 +``` + +另外,你也可以设置一个观察点,它就像断点一样,是一种控制 GDB 执行代码流程的方法。在这种情况下,你知道 `beta` 变量应该设置为 `2`,所以你可以设置一个观察点,当 `beta` 的值发生变化时提醒你: + +``` +(gdb) watch beta > 0 +Hardware watchpoint 5: beta > 0 +(gdb) continue +Continuing. + +Breakpoint 3, main () at debug.cpp:11 +11 cout << "Hello world." << endl; +(gdb) continue +Continuing. +Hello world. + +Hardware watchpoint 5: beta > 0 + +Old value = false +New value = true +main () at debug.cpp:14 +14 printf("alpha is set to is %s\n", alpha); +(gdb) +``` + +你可以用 `next` 手动步进完成代码的执行,或者你可以用断点、观察点和捕捉点来控制代码的执行。 + +### 用 GDB 分析数据 + +你可以以不同格式查看数据。例如,以八进制值查看 `beta` 的值: + +``` +(gdb) print /o beta +$4 = 02 +``` + +要查看其在内存中的地址: + +``` +(gdb) print /o &beta +$5 = 0x2 +``` + +你也可以看到一个变量的数据类型: + +``` +(gdb) whatis beta +type = int +``` + +### 用 GDB 解决错误 + +这种自省不仅能让你更好地了解什么代码正在执行,还能让你了解它是如何执行的。在这个例子中,对变量运行的 `whatis` 命令给了你一个线索,即你的 `alpha` 和 `beta` 变量是整数,这可能会唤起你对 `printf` 语法的记忆,使你意识到在你的 `printf` 语句中,你必须使用 `%d` 来代替 `%s`。做了这个改变,就可以让应用程序按预期运行,没有更明显的错误存在。 + +当代码编译后发现有 bug 存在时,特别令人沮丧,但最棘手的 bug 就是这样,如果它们很容易被发现,那它们就不是 bug 了。使用 GDB 是猎取并消除它们的一种方法。 + +### 下载我们的速查表 + +生活的真相就是这样,即使是最基本的编程,代码也会有 bug。并不是所有的错误都会导致应用程序无法运行(甚至无法编译),也不是所有的错误都是由错误的代码引起的。有时,bug 是基于一个特别有创意的用户所做的意外的选择组合而间歇性发生的。有时,程序员从他们自己的代码中使用的库中继承了 bug。无论原因是什么,bug 基本上无处不在,程序员的工作就是发现并消除它们。 + +GNU 调试器是一个寻找 bug 的有用工具。你可以用它做的事情比我在本文中演示的要多得多。你可以通过 GNU Info 阅读器来了解它的许多功能: + +``` +$ info gdb +``` + +无论你是刚开始学习 GDB 还是专业人员的,提醒一下你有哪些命令是可用的,以及这些命令的语法是什么,都是很有帮助的。 + +- [下载 GDB 速查表][5] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/debug-code-gdb + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mistake_bug_fix_find_error.png?itok=PZaz3dga (magnifying glass on computer screen, finding a bug in the code) +[2]: https://www.gnu.org/software/gdb/ +[3]: https://opensource.com/article/20/8/printf +[4]: https://linux.cn/article-12985-1.html +[5]: https://opensource.com/downloads/gnu-debugger-cheat-sheet diff --git a/published/202103/20210304 You Can Now Install Official Evernote Client on Ubuntu and Debian-based Linux Distributions.md b/published/202103/20210304 You Can Now Install Official Evernote Client on Ubuntu and Debian-based Linux Distributions.md new file mode 100644 index 0000000000..c6eb182519 --- /dev/null +++ b/published/202103/20210304 You Can Now Install Official Evernote Client on Ubuntu and Debian-based Linux Distributions.md @@ -0,0 +1,104 @@ +[#]: subject: (You Can Now Install Official Evernote Client on Ubuntu and Debian-based Linux Distributions) +[#]: via: (https://itsfoss.com/install-evernote-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13195-1.html) + +在 Linux 上安装官方 Evernote 客户端 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/12/064741kvenjiev6qvia4ia.jpg) + +[Evernote][1] 是一款流行的笔记应用。它在推出时是一个革命性的产品。从那时起,已经有好几个这样的应用,可以将网络剪报、笔记等保存为笔记本格式。 + +多年来,Evernote 一直没有在 Linux 上使用的桌面客户端。前段时间 Evernote 承诺推出 Linux 应用,其测试版终于可以在基于 Ubuntu 的发行版上使用了。 + +> 非 FOSS 警报! +> +> Evernote Linux 客户端不是开源的。之所以在这里介绍它,是因为该应用是在 Linux 上提供的,我们也会不定期地介绍 Linux 用户常用的非 FOSS 应用。这对普通桌面 Linux 用户有帮助。 + +### 在 Ubuntu 和基于 Debian 的 Linux 发行版上安装 Evernote + +进入这个 Evernote 的[网站页面][2]。 + +向下滚动一点,接受“早期测试计划”的条款和条件。你会看到一个“立即安装”的按钮出现在屏幕上。点击它来下载 DEB 文件。 + +![][3] + +要 [从 DEB 文件安装应用][4],请双击它。它应该会打开软件中心,并给你选择安装它。 + +![][5] + +安装完成后,在系统菜单中搜索 Evernote 并启动它。 + +![][6] + +当你第一次启动应用时,你需要登录到你的 Evernote 账户。 + +![][7] + +第一次运行会带你进入“主页面”,在这里你可以整理你的笔记本,以便更快速地访问。 + +![][8] + +你现在可以享受在 Linux 上使用 Evernote 了。 + +### 体验 Evernote 的 Linux 测试版客户端 + +由于软件处于测试版,因此这里或那里会有些问题。 + +如上图所示,Evernote Linux 客户端检测到 [Ubuntu 中的深色模式][9] 并自动切换到深色主题。然而,当我把系统主题改为浅色或标准主题时,它并没有立即改变应用主题。这些变化是在我重启 Evernote 应用后才生效的。 + +另一个问题是关于关闭应用。如果你点击 “X” 按钮关闭 Evernote,程序会进入后台而不是退出。 + +有一个似乎可以启动最小化的 Evernote 的应用指示器,就像 [Linux 上的 Skype][10]。不幸的是,事实并非如此。它打开了便笺,让你快速输入笔记。 + +这为你提供了另一个 [Linux 上的笔记应用][11],但它也带来了一个问题。这里没有退出 Evernote 的选项。它只用于打开快速记事应用。 + +![][12] + +那么,如何退出 Evernote 应用呢?为此,再次打开 Evernote 应用。如果它在后台运行,在菜单中搜索它,并启动它,就像你重新打开它一样。 + +当 Evernote 应用在前台运行时,点击 “文件->退出” 来退出 Evernote。 + +![][13] + +这一点开发者应该在未来的版本中寻求改进。 + +我也不能说测试版的程序将来会如何更新。它没有添加任何仓库。我只是希望程序本身能够通知用户有新的版本,这样用户就可以下载新的 DEB 文件。 + +我并没有订阅 Evernote Premium,但我仍然可以在没有网络连接的情况下访问保存的网络文章和笔记。很奇怪,对吧? + +总的来说,我很高兴看到 Evernote 终于努力把这个应用带到了 Linux 上。现在,你不必再尝试第三方应用来在 Linux 上使用 Evernote 了,至少在 Ubuntu 和基于 Debian 的发行版上是这样。当然,你可以使用 [Evernote 替代品][14],比如 [Joplin][15],它们都是开源的。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-evernote-ubuntu/ + +作者:[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://evernote.com/ +[2]: https://evernote.com/intl/en/b1433t1422 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-early-access-linux.png?resize=799%2C495&ssl=1 +[4]: https://itsfoss.com/install-deb-files-ubuntu/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/install-evernote-linux.png?resize=800%2C539&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-ubuntu.jpg?resize=800%2C230&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-running-ubuntu.png?resize=800%2C505&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-on-ubuntu.png?resize=800%2C537&ssl=1 +[9]: https://itsfoss.com/dark-mode-ubuntu/ +[10]: https://itsfoss.com/install-skype-ubuntu-1404/ +[11]: https://itsfoss.com/note-taking-apps-linux/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/evernote-app-indicator.png?resize=800%2C480&ssl=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/quit-evernote-linux.png?resize=799%2C448&ssl=1 +[14]: https://itsfoss.com/5-evernote-alternatives-linux/ +[15]: https://itsfoss.com/joplin/ diff --git a/published/202103/20210305 5 surprising things you can do with LibreOffice from the command line.md b/published/202103/20210305 5 surprising things you can do with LibreOffice from the command line.md new file mode 100644 index 0000000000..35a3f2fc9f --- /dev/null +++ b/published/202103/20210305 5 surprising things you can do with LibreOffice from the command line.md @@ -0,0 +1,171 @@ +[#]: subject: (5 surprising things you can do with LibreOffice from the command line) +[#]: via: (https://opensource.com/article/21/3/libreoffice-command-line) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13219-1.html) + +5 个用命令行操作 LibreOffice 的技巧 +====== + +> 直接在命令行中对文件进行转换、打印、保护等操作。 + +![](https://img.linux.net.cn/data/attachment/album/202103/20/110200xjkkijnjixbyi4ui.jpg) + +LibreOffice 拥有所有你想要的办公软件套件的生产力功能,使其成为微软 Office 或谷歌套件的流行的开源替代品。LibreOffice 的能力之一是可以从命令行操作。例如,Seth Kenlon 最近解释了如何使用 LibreOffice 用全局 [命令行选项将多个文件][2] 从 DOCX 转换为 EPUB。他的文章启发我分享一些其他 LibreOffice 命令行技巧和窍门。 + +在查看 LibreOffice 命令的一些隐藏功能之前,你需要了解如何使用应用选项。并不是所有的应用都接受选项(除了像 `--help` 选项这样的基本选项,它在大多数 Linux 应用中都可以使用)。 + +``` +$ libreoffice --help +``` + +这将返回 LibreOffice 接受的其他选项的描述。有些应用没有太多选项,但 LibreOffice 好几页有用的选项,所以有很多东西可以玩。 + +就是说,你可以在终端上使用 LibreOffice 进行以下五项有用的操作,来让使软件更加有用。 + +### 1、自定义你的启动选项 + +你可以修改你启动 LibreOffice 的方式。例如,如果你想只打开 LibreOffice 的文字处理器组件: + +``` +$ libreoffice --writer  # 启动文字处理器 +``` + +你可以类似地打开它的其他组件: + + +``` +$ libreoffice --calc  # 启动一个空的电子表格 +$ libreoffice --draw  # 启动一个空的绘图文档 +$ libreoffice --web   # 启动一个空的 HTML 文档 +``` + +你也可以从命令行访问特定的帮助文件: + +``` +$ libreoffice --helpwriter +``` + +![LibreOffice Writer help][3] + +或者如果你需要电子表格应用方面的帮助: + +``` +$ libreoffice --helpcalc +``` + +你可以在不显示启动屏幕的情况下启动 LibreOffice: + +``` +$ libreoffice --writer --nologo +``` + +你甚至可以在你完成当前窗口的工作时,让它在后台最小化启动: + +``` +$ libreoffice --writer --minimized +``` + +### 2、以只读模式打开一个文件 + +你可以使用 `--view` 以只读模式打开文件,以防止意外地对重要文件进行修改和保存: + +``` +$ libreoffice --view example.odt +``` + +### 3、打开一个模板文档 + +你是否曾经创建过用作信头或发票表格的文档?LibreOffice 具有丰富的内置模板系统,但是你可以使用 `-n` 选项将任何文档作为模板: + +``` +$ libreoffice --writer -n example.odt +``` + +你的文档将在 LibreOffice 中打开,你可以对其进行修改,但保存时不会覆盖原始文件。 + +### 4、转换文档 + +当你需要做一个小任务,比如将一个文件转换为新的格式时,应用启动的时间可能与完成任务的时间一样长。解决办法是 `--headless` 选项,它可以在不启动图形用户界面的情况下执行 LibreOffice 进程。 + +例如,在 LibreOffic 中,将一个文档转换为 EPUB 是一个非常简单的任务,但使用 `libreoffice` 命令就更容易: + +``` +$ libreoffice --headless --convert-to epub example.odt +``` + +使用通配符意味着你可以一次转换几十个文档: + +``` +$ libreoffice --headless --convert-to epub *.odt +``` + +你可以将文件转换为多种格式,包括 PDF、HTML、DOC、DOCX、EPUB、纯文本等。 + +### 5、从终端打印 + +你可以从命令行打印 LibreOffice 文档,而无需打开应用: + +``` +$ libreoffice --headless -p example.odt +``` + +这个选项不需要打开 LibreOffice 就可以使用默认打印机打印,它只是将文档发送到你的打印机。 + +要打印一个目录中的所有文件: + +``` +$ libreoffice -p *.odt +``` + +(我不止一次执行了这个命令,然后用完了纸,所以在你开始之前,确保你的打印机里有足够的纸张。) + +你也可以把文件输出成 PDF。通常这和使用 `--convert-to-pdf` 选项没有什么区别,但是很容易记住: + + +``` +$ libreoffice --print-to-file example.odt --headless +``` + +### 额外技巧:Flatpak 和命令选项 + +如果你是使用 [Flatpak][5] 安装的 LibreOffice,所有这些命令选项都可以使用,但你必须通过 Flatpak 传递。下面是一个例子: + +``` +$ flatpak run org.libreoffice.LibreOffice --writer +``` + +它比本地安装要麻烦得多,所以你可能会受到启发 [写一个 Bash 别名][6] 来使它更容易直接与 LibreOffice 交互。 + +### 令人惊讶的终端选项 + +通过查阅手册页面,了解如何从命令行扩展 LibreOffice 的功能: + +``` +$ man libreoffice +``` + +你是否知道 LibreOffice 具有如此丰富的命令行选项? 你是否发现了其他人似乎都不了解的其他选项? 请在评论中分享它们! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/libreoffice-command-line + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/shortcut_command_function_editing_key.png?itok=a0sEc5vo (hot keys for shortcuts or features on computer keyboard) +[2]: https://opensource.com/article/21/2/linux-workday +[3]: https://opensource.com/sites/default/files/uploads/libreoffice-help.png (LibreOffice Writer help) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://www.libreoffice.org/download/flatpak/ +[6]: https://opensource.com/article/19/7/bash-aliases diff --git a/published/202103/20210307 Track your family calendar with a Raspberry Pi and a low-power display.md b/published/202103/20210307 Track your family calendar with a Raspberry Pi and a low-power display.md new file mode 100644 index 0000000000..165ca68e13 --- /dev/null +++ b/published/202103/20210307 Track your family calendar with a Raspberry Pi and a low-power display.md @@ -0,0 +1,81 @@ +[#]: subject: (Track your family calendar with a Raspberry Pi and a low-power display) +[#]: via: (https://opensource.com/article/21/3/family-calendar-raspberry-pi) +[#]: author: (Javier Pena https://opensource.com/users/jpena) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13222-1.html) + +利用树莓派和低功耗显示器来跟踪你的家庭日程表 +====== + +> 通过利用开源工具和电子墨水屏,让每个人都清楚家庭的日程安排。 + +![](https://img.linux.net.cn/data/attachment/album/202103/21/091512dkbgb3vzgjrz2935.jpg) + +有些家庭的日程安排很复杂:孩子们有上学活动和放学后的活动,你想要记住的重要事情,每个人都有多个约会等等。虽然你可以使用手机和应用程序来关注所有事情,但在家中放置一个大型低功耗显示器以显示家人的日程不是更好吗?电子墨水日程表刚好满足! + +![E Ink calendar][2] + +### 硬件 + +这个项目是作为假日项目开始,因此我试着尽可能多的旧物利用。其中包括一台已经闲置了太长时间树莓派 2。由于我没有电子墨水屏,因此我需要购买一个。幸运的是,我找到了一家供应商,该供应商为支持树莓派的屏幕提供了 [开源驱动程序和示例][4],该屏幕使用 [GPIO][5] 端口连接。 + +我的家人还想在不同的日程表之间切换,因此需要某种形式的输入。我没有添加 USB 键盘,而是选择了一种更简单的解决方案,并购买了一个类似于在 [这篇文章][6] 中所描述 1x4 大小的键盘。这使我可以将键盘连接到树莓派中的某些 GPIO 端口。 + +最后,我需要一个相框来容纳整个设置。虽然背面看起来有些凌乱,但它能完成工作。 + +![Calendar internals][7] + +### 软件 + +我从 [一个类似的项目][8] 中获得了灵感,并开始为我的项目编写 Python 代码。我需要从两个地方获取数据: + + * 天气信息:从 [OpenWeather API][9] 获取 + * 时间信息:我打算使用 [CalDav 标准][10] 连接到一个在我家服务器上运行的日程表 + +由于必须等待一些零件的送达,因此我使用了模块化的方法来进行输入和显示,这样我可以在没有硬件的情况下调试大多数代码。日程表应用程序需要驱动程序,于是我编写了一个 [Pygame][11] 驱动程序以便能在台式机上运行它。 + +编写代码最好的部分是能够重用现有的开源项目,所以访问不同的 API 很容易。我可以专注于设计用户界面,其中包括每个人的周历和每个人的日历,以及允许使用小键盘来选择日程。并且我花时间又添加了一些额外的功能,例如特殊日子的自定义屏幕保护程序。 + +![E Ink calendar screensaver][12] + +最后的集成步骤将确保我的日程表应用程序将在启动时运行,并且能够容错。我使用了一个基本的 [树莓派系统][13] 镜像,并将该应用程序配置到 systemd 服务,以便它可以在出现故障和系统重新启动依旧运行。 + +做完所有工作,我把代码上传到了 [GitHub][14]。因此,如果你要创建类似的日历,可以随时查看并重构它! + +### 结论 + +日程表已成为我们厨房中的日常工具。它可以帮助我们记住我们的日常活动,甚至我们的孩子在上学前,都可以使用它来查看日程的安排。 + +对我而言,这个项目让我感受到开源的力量。如果没有开源的驱动程序、库以及开放 API,我们依旧还在用纸和笔来安排日程。很疯狂,不是吗? + +需要确保你的日程不冲突吗?学习如何使用这些免费的开源项目来做到这点。 + +------ +via: https://opensource.com/article/21/3/family-calendar-raspberry-pi + +作者:[Javier Pena][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jpena +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calendar-coffee.jpg?itok=9idm1917 "Calendar with coffee and breakfast" +[2]: https://opensource.com/sites/default/files/uploads/calendar.jpg "E Ink calendar" +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://github.com/waveshare/e-Paper +[5]: https://opensource.com/article/19/3/gpio-pins-raspberry-pi +[6]: https://www.instructables.com/1x4-Membrane-Keypad-w-Arduino/ +[7]: https://opensource.com/sites/default/files/uploads/calendar_internals.jpg "Calendar internals" +[8]: https://github.com/zli117/EInk-Calendar +[9]: https://openweathermap.org +[10]: https://en.wikipedia.org/wiki/CalDAV +[11]: https://github.com/pygame/pygame +[12]: https://opensource.com/sites/default/files/uploads/calendar_screensaver.jpg "E Ink calendar screensaver" +[13]: https://www.raspberrypi.org/software/ +[14]: https://github.com/javierpena/eink-calendar diff --git a/published/202103/20210308 How to use Poetry to manage your Python projects on Fedora.md b/published/202103/20210308 How to use Poetry to manage your Python projects on Fedora.md new file mode 100644 index 0000000000..6692e699d1 --- /dev/null +++ b/published/202103/20210308 How to use Poetry to manage your Python projects on Fedora.md @@ -0,0 +1,200 @@ +[#]: subject: (How to use Poetry to manage your Python projects on Fedora) +[#]: via: (https://fedoramagazine.org/how-to-use-poetry-to-manage-your-python-projects-on-fedora/) +[#]: author: (Kader Miyanyedi https://fedoramagazine.org/author/moonkat/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13202-1.html) + +如何在 Fedora 上使用 Poetry 来管理你的 Python 项目? +====== + +![Python & Poetry on Fedora][1] + +Python 开发人员经常创建一个新的虚拟环境来分离项目依赖,然后用 `pip`、`pipenv` 等工具来管理它们。Poetry 是一个简化 Python 中依赖管理和打包的工具。这篇文章将向你展示如何在 Fedora 上使用 Poetry 来管理你的 Python 项目。 + +与其他工具不同,Poetry 只使用一个配置文件来进行依赖管理、打包和发布。这消除了对不同文件的需求,如 `Pipfile`、`MANIFEST.in`、`setup.py` 等。这也比使用多个工具更快。 + +下面详细介绍一下开始使用 Poetry 时使用的命令。 + +### 在 Fedora 上安装 Poetry + +如果你已经使用 Fedora 32 或以上版本,你可以使用这个命令直接从命令行安装 Poetry: + +``` +$ sudo dnf install poetry +``` + +编者注:在 Fedora Silverblue 或 CoreOs上,Python 3.9.2 是核心提交的一部分,你可以用下面的命令安装 Poetry: + +``` +rpm-ostree install poetry +``` + +### 初始化一个项目 + +使用 `new` 命令创建一个新项目: + +``` +$ poetry new poetry-project +``` + +用 Poetry 创建的项目结构是这样的: + +``` +├── poetry_project +│ └── init.py +├── pyproject.toml +├── README.rst +└── tests + ├── init.py + └── test_poetry_project.py +``` + +Poetry 使用 `pyproject.toml` 来管理项目的依赖。最初,这个文件看起来类似于这样: + +``` +[tool.poetry] +name = "poetry-project" +version = "0.1.0" +description = "" +authors = ["Kadermiyanyedi "] + +[tool.poetry.dependencies] +python = "^3.9" + +[tool.poetry.dev-dependencies] +pytest = "^5.2" + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" +``` + +这个文件包含 4 个部分: + + * 第一部分包含描述项目的信息,如项目名称、项目版本等。 + * 第二部分包含项目的依赖。这些依赖是构建项目所必需的。 + * 第三部分包含开发依赖。 + * 第四部分描述的是符合 [PEP 517][2] 的构建系统。 + +如果你已经有一个项目,或者创建了自己的项目文件夹,并且你想使用 Poetry,请在你的项目中运行 `init` 命令。 + +``` +$ poetry init +``` + +在这个命令之后,你会看到一个交互式的 shell 来配置你的项目。 + +### 创建一个虚拟环境 + +如果你想创建一个虚拟环境或激活一个现有的虚拟环境,请使用以下命令: + +``` +$ poetry shell +``` + +Poetry 默认在 `/home/username/.cache/pypoetry` 项目中创建虚拟环境。你可以通过编辑 Poetry 配置来更改默认路径。使用下面的命令查看配置列表: + +``` +$ poetry config --list + +cache-dir = "/home/username/.cache/pypoetry" +virtualenvs.create = true +virtualenvs.in-project = true +virtualenvs.path = "{cache-dir}/virtualenvs" +``` + +修改 `virtualenvs.in-project` 配置变量,在项目目录下创建一个虚拟环境。Poetry 命令是: + +``` +$ poetry config virtualenv.in-project true +``` + +### 添加依赖 + +使用 `poetry add` 命令为项目安装一个依赖: + +``` +$ poetry add django +``` + +你可以使用带有 `--dev` 选项的 `add` 命令来识别任何只用于开发环境的依赖: + +``` +$ poetry add black --dev +``` + +`add` 命令会创建一个 `poetry.lock` 文件,用来跟踪软件包的版本。如果 `poetry.lock` 文件不存在,那么会安装 `pyproject.toml` 中所有依赖项的最新版本。如果 `poetry.lock` 存在,Poetry 会使用文件中列出的确切版本,以确保每个使用这个项目的人的软件包版本是一致的。 + +使用 `poetry install` 命令来安装当前项目中的所有依赖: + +``` +$ poetry install +``` + +通过使用 `--no-dev` 选项防止安装开发依赖: + +``` +$ poetry install --no-dev +``` + +### 列出软件包 + +`show` 命令会列出所有可用的软件包。`--tree` 选项将以树状列出软件包: + +``` +$ poetry show --tree + +django 3.1.7 A high-level Python Web framework that encourages rapid development and clean, pragmatic design. +├── asgiref >=3.2.10,<4 +├── pytz * +└── sqlparse >=0.2.2 +``` + +包含软件包名称,以列出特定软件包的详细信息: + +``` +$ poetry show requests + +name : requests +version : 2.25.1 +description : Python HTTP for Humans. + +dependencies + - certifi >=2017.4.17 + - chardet >=3.0.2,<5 + - idna >=2.5,<3 + - urllib3 >=1.21.1,<1.27 +``` + +最后,如果你想知道软件包的最新版本,你可以通过 `--latest` 选项: + +``` +$ poetry show --latest + +idna 2.10 3.1 Internationalized Domain Names in Applications +asgiref 3.3.1 3.3.1 ASGI specs, helper code, and adapters +``` + +### 更多信息 + +Poetry 的更多详情可在[文档][3]中获取。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/how-to-use-poetry-to-manage-your-python-projects-on-fedora/ + +作者:[Kader Miyanyedi][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/moonkat/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/03/Poetry_Python-816x345.jpg +[2]: https://www.python.org/dev/peps/pep-0517/ +[3]: https://python-poetry.org/docs/ diff --git a/published/202103/20210309 Learn Python dictionary values with Jupyter.md b/published/202103/20210309 Learn Python dictionary values with Jupyter.md new file mode 100644 index 0000000000..2087eb3da6 --- /dev/null +++ b/published/202103/20210309 Learn Python dictionary values with Jupyter.md @@ -0,0 +1,150 @@ +[#]: subject: (Learn Python dictionary values with Jupyter) +[#]: via: (https://opensource.com/article/21/3/dictionary-values-python) +[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeo) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13236-1.html) + +用 Jupyter 学习 Python 字典 +====== + +> 字典数据结构可以帮助你快速访问信息。 + +![](https://img.linux.net.cn/data/attachment/album/202103/26/094720i58u5qxx3l4qsssx.jpg) + +字典是 Python 编程语言使用的数据结构。一个 Python 字典由多个键值对组成;每个键值对将键映射到其关联的值上。 + +例如你是一名老师,想把学生姓名与成绩对应起来。你可以使用 Python 字典,将学生姓名映射到他们关联的成绩上。此时,键值对中键是姓名,值是对应的成绩。 + +如果你想知道某个学生的考试成绩,你可以从字典中访问。这种快捷查询方式可以为你节省解析整个列表找到学生成绩的时间。 + +本文介绍了如何通过键访问对应的字典值。学习前,请确保你已经安装了 [Anaconda 包管理器][2]和 [Jupyter 笔记本][3]。 + +### 1、在 Jupyter 中打开一个新的笔记本 + +首先在 Web 浏览器中打开并运行 Jupyter。然后, + + 1. 转到左上角的 “File”。 + 2. 选择 “New Notebook”,点击 “Python 3”。 + +![新建 Jupyter 笔记本][4] + +开始时,新建的笔记本是无标题的,你可以将其重命名为任何名称。我为我的笔记本取名为 “OpenSource.com Data Dictionary Tutorial”。 + +笔记本中标有行号的位置就是你写代码的区域,也是你输入的位置。 + +在 macOS 上,可以同时按 `Shift + Return` 键得到输出。在创建新的代码区域前,请确保完成上述动作;否则,你写的任何附加代码可能无法运行。 + +### 2、新建一个键值对 + +在字典中输入你希望访问的键与值。输入前,你需要在字典上下文中定义它们的含义: + +``` +empty_dictionary = {} +grades = { +    "Kelsey": 87, +    "Finley": 92 +} + +one_line = {a: 1, b: 2} +``` + +![定义字典键值对的代码][6] + +这段代码让字典将特定键与其各自的值关联起来。字典按名称存储数据,从而可以更快地查询。 + +### 3、通过键访问字典值 + +现在你想查询指定的字典值;在上述例子中,字典值指特定学生的成绩。首先,点击 “Insert” 后选择 “Insert Cell Below”。 + +![在 Jupyter 插入新建单元格][7] + +在新单元格中,定义字典中的键与值。 + +然后,告诉字典打印该值的键,找到需要的值。例如,查询名为 Kelsey 的学生的成绩: + +``` +# 访问字典中的数据 +grades = { +    "Kelsey": 87, +    "Finley": 92 +} + +print(grades["Kelsey"]) +87 +``` + +![查询特定值的代码][8] + +当你查询 Kelsey 的成绩(也就是你想要查询的值)时,如果你用的是 macOS,只需要同时按 `Shift+Return` 键。 + +你会在单元格下方看到 Kelsey 的成绩。 + +### 4、更新已有的键 + +当把一位学生的错误成绩添加到字典时,你会怎么办?可以通过更新字典、存储新值来修正这类错误。 + +首先,选择你想更新的那个键。在上述例子中,假设你错误地输入了 Finley 的成绩,那么 Finley 就是你需要更新的键。 + +为了更新 Finley 的成绩,你需要在下方插入新的单元格,然后创建一个新的键值对。同时按 `Shift+Return` 键打印字典全部信息: + +``` +grades["Finley"] = 90 +print(grades) + +{'Kelsey': 87; "Finley": 90} +``` + +![更新键的代码][9] + +单元格下方输出带有 Finley 更新成绩的字典。 + +### 5、添加新键 + +假设你得到一位新学生的考试成绩。你可以用新键值对将那名学生的姓名与成绩补充到字典中。 + +插入新的单元格,以键值对形式添加新学生的姓名与成绩。当你完成这些后,同时按 `Shift+Return` 键打印字典全部信息: + +``` +grades["Alex"] = 88 +print(grades) + +{'Kelsey': 87, 'Finley': 90, 'Alex': 88} +``` + +![添加新键][10] + +所有的键值对输出在单元格下方。 + +### 使用字典 + +请记住,键与值可以是任意数据类型,但它们很少是[扩展数据类型][11]non-primitive types。此外,字典不能以指定的顺序存储、组织里面的数据。如果你想要数据有序,最好使用 Python 列表,而非字典。 + +如果你考虑使用字典,首先要确认你的数据结构是否是合适的,例如像电话簿的结构。如果不是,列表、元组、树或者其他数据结构可能是更好的选择。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/dictionary-values-python + +作者:[Lauren Maffeo][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/lmaffeo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://docs.anaconda.com/anaconda/ +[3]: https://opensource.com/article/18/3/getting-started-jupyter-notebooks +[4]: https://opensource.com/sites/default/files/uploads/new-jupyter-notebook.png (Create Jupyter notebook) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/define-keys-values.png (Code for defining key-value pairs in the dictionary) +[7]: https://opensource.com/sites/default/files/uploads/jupyter_insertcell.png (Inserting a new cell in Jupyter) +[8]: https://opensource.com/sites/default/files/uploads/lookforvalue.png (Code to look for a specific value) +[9]: https://opensource.com/sites/default/files/uploads/jupyter_updatekey.png (Code for updating a key) +[10]: https://opensource.com/sites/default/files/uploads/jupyter_addnewkey.png (Add a new key) +[11]: https://www.datacamp.com/community/tutorials/data-structures-python diff --git a/published/202103/20210309 Use gImageReader to Extract Text From Images and PDFs on Linux.md b/published/202103/20210309 Use gImageReader to Extract Text From Images and PDFs on Linux.md new file mode 100644 index 0000000000..af9f99d71a --- /dev/null +++ b/published/202103/20210309 Use gImageReader to Extract Text From Images and PDFs on Linux.md @@ -0,0 +1,101 @@ +[#]: subject: (Use gImageReader to Extract Text From Images and PDFs on Linux) +[#]: via: (https://itsfoss.com/gimagereader-ocr/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13205-1.html) + +在 Linux 上使用 gImageReader 从图像和 PDF 中提取文本 +====== + +> gImageReader 是一个 GUI 工具,用于在 Linux 中利用 Tesseract OCR 引擎从图像和 PDF 文件中提取文本。 + +[gImageReader][1] 是 [Tesseract 开源 OCR 引擎][2]的一个前端。Tesseract 最初是由 HP 公司开发的,然后在 2006 年开源。 + +基本上,OCR(光学字符识别)引擎可以让你从图片或文件(PDF)中扫描文本。默认情况下,它可以检测几种语言,还支持通过 Unicode 字符扫描。 + +然而,Tesseract 本身是一个没有任何 GUI 的命令行工具。因此,gImageReader 就来解决这点,它可以让任何用户使用它从图像和文件中提取文本。 + +让我重点介绍一些有关它的内容,同时说下我在测试期间的使用经验。 + +### gImageReader:一个跨平台的 Tesseract OCR 前端 + +![][3] + +为了简化事情,gImageReader 在从 PDF 文件或包含任何类型文本的图像中提取文本时非常方便。 + +无论你是需要它来进行拼写检查还是翻译,它都应该对特定的用户群体有用。 + +以列表总结下功能,这里是你可以用它做的事情: + + * 从磁盘、扫描设备、剪贴板和截图中添加 PDF 文档和图像 + * 能够旋转图像 + * 常用的图像控制,用于调整亮度、对比度和分辨率。 + * 直接通过应用扫描图像 + * 能够一次性处理多个图像或文件 + * 手动或自动识别区域定义 + * 识别纯文本或 [hOCR][4] 文档 + * 编辑器显示识别的文本 + * 可对对提取的文本进行拼写检查 + * 从 hOCR 文件转换/导出为 PDF 文件 + * 将提取的文本导出为 .txt 文件 + * 跨平台(Windows) + +### 在 Linux 上安装 gImageReader + +**注意**:你需要安装 Tesseract 语言包,才能从软件管理器中的图像/文件中进行检测。 + +![][5] + +你可以在一些 Linux 发行版如 Fedora 和 Debian 的默认仓库中找到 gImageReader。 + +对于 Ubuntu,你需要添加一个 PPA,然后安装它。要做到这点,下面是你需要在终端中输入的内容: + +``` +sudo add-apt-repository ppa:sandromani/gimagereader +sudo apt update +sudo apt install gimagereader +``` + +你也可以从 openSUSE 的构建服务中找到它,Arch Linux 用户可在 [AUR][6] 中找到。 + +所有的仓库和包的链接都可以在他们的 [GitHub 页面][1]中找到。 + +### gImageReader 使用经验 + +当你需要从图像中提取文本时,gImageReader 是一个相当有用的工具。当你尝试从 PDF 文件中提取文本时,它的效果非常好。 + +对于从智能手机拍摄的图片中提取,检测很接近,但有点不准确。也许当你进行扫描时,从文件中识别字符可能会更好。 + +所以,你需要亲自尝试一下,看看它是否对你而言工作良好。我在 Linux Mint 20.1(基于 Ubuntu 20.04)上试过。 + +我只遇到了一个从设置中管理语言的问题,我没有得到一个快速的解决方案。如果你遇到此问题,那么可能需要对其进行故障排除,并进一步了解如何解决该问题。 + +![][7] + +除此之外,它工作良好。 + +试试吧,让我知道它是如何为你服务的!如果你知道类似的东西(和更好的),请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gimagereader-ocr/ + +作者:[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://github.com/manisandro/gImageReader +[2]: https://tesseract-ocr.github.io/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gImageReader.png?resize=800%2C456&ssl=1 +[4]: https://en.wikipedia.org/wiki/HOCR +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/tesseract-language-pack.jpg?resize=800%2C620&ssl=1 +[6]: https://itsfoss.com/aur-arch-linux/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gImageReader-1.jpg?resize=800%2C460&ssl=1 diff --git a/published/202103/20210310 How to Update openSUSE Linux System.md b/published/202103/20210310 How to Update openSUSE Linux System.md new file mode 100644 index 0000000000..9ff041647e --- /dev/null +++ b/published/202103/20210310 How to Update openSUSE Linux System.md @@ -0,0 +1,107 @@ +[#]: subject: (How to Update openSUSE Linux System) +[#]: via: (https://itsfoss.com/update-opensuse/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13199-1.html) + +如何更新 openSUSE Linux 系统 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/13/110932nsq33tjit9933h2k.jpg) + +就我记忆所及,我一直是 Ubuntu 的用户。我曾经转向过其他发行版,但最终还是一次次回到 Ubuntu。但最近,我开始使用 openSUSE 来尝试一些非 Debian 的东西。 + +随着我对 [openSUSE][1] 的不断探索,我不断发现 SUSE 中略有不同的东西,并打算在教程中介绍它们。 + +第一篇我写的是更新 openSUSE 系统。有两种方法可以做到: + + * 使用终端(适用于 openSUSE 桌面和服务器) + * 使用图形工具(适用于 openSUSE 桌面) + +### 通过命令行更新 openSUSE + +更新 openSUSE 的最简单方法是使用 `zypper` 命令。它提供了补丁和更新管理的全部功能。它可以解决文件冲突和依赖性问题。更新也包括 Linux 内核。 + +如果你正在使用 openSUSE Leap,请使用这个命令: + +``` +sudo zypper update +``` + +你也可以用 `up` 代替 `update`,但我觉得 `update` 更容易记住。 + +如果你正在使用 openSUSE Tumbleweed,请使用 `dist-upgrade` 或者 `dup`(简称)。Tumbleweed 是[滚动发行版][2],因此建议使用 `dist-upgrade` 选项。 + +``` +sudo zypper dist-upgrade +``` + +它将显示要升级、删除或安装的软件包列表。 + +![][3] + +如果你的系统需要重启,你会得到通知。 + +如果你只是想刷新仓库(像 `sudo apt update` 一样),你可以使用这个命令: + +``` +sudo zypper refresh +``` + +如果你想列出可用的更新,也可以这样做: + +``` +sudo zypper list-updates +``` + +### 以图形方式更新 openSUSE + +如果你使用 openSUSE 作为桌面,你可以选择使用 GUI 工具来安装更新。这个工具可能会根据 [你使用的桌面环境][4] 而改变。 + +例如,KDE 有自己的软件中心,叫做 “Discover”。你可以用它来搜索和安装新的应用。你也可以用它来安装系统更新。 + +![][5] + +事实上,KDE 会在通知区通知你可用的系统更新。你必须打开 Discover,因为点击通知不会自动进入 Discover。 + +![][6] + +如果你觉得这很烦人,你可以使用这些命令禁用它: + +``` +sudo zypper remove plasma5-pk-updates +sudo zypper addlock plasma5-pk-updates +``` + +不过我不推荐。最好是获取可用的更新通知。 + +还有一个 YAST 软件管理 [GUI 工具][7],你可以用它来对软件包管理进行更精细的控制。 + +![][8] + +就是这些了。这是一篇简短的文章。在下一篇 SUSE 教程中,我将通过实例向大家展示一些常用的 `zypper` 命令。敬请期待。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/update-opensuse/ + +作者:[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://www.opensuse.org/ +[2]: https://itsfoss.com/rolling-release/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/update-opensuse-with-zypper.png?resize=800%2C406&ssl=1 +[4]: https://itsfoss.com/find-desktop-environment/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/opensuse-update-gui.png?resize=800%2C500&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/update-notification-opensuse.png?resize=800%2C259&ssl=1 +[7]: https://itsfoss.com/gui-cli-tui/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/yast-software-management-suse.png?resize=800%2C448&ssl=1 diff --git a/published/202103/20210310 Understanding file names and directories in FreeDOS.md b/published/202103/20210310 Understanding file names and directories in FreeDOS.md new file mode 100644 index 0000000000..41fa649a93 --- /dev/null +++ b/published/202103/20210310 Understanding file names and directories in FreeDOS.md @@ -0,0 +1,110 @@ +[#]: subject: (Understanding file names and directories in FreeDOS) +[#]: via: (https://opensource.com/article/21/3/files-freedos) +[#]: author: (Kevin O'Brien https://opensource.com/users/ahuka) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13208-1.html) + +了解 FreeDOS 中的文件名和目录 +====== + +> 了解如何在 FreeDOS 中创建,编辑和命名文件。 + +![](https://img.linux.net.cn/data/attachment/album/202103/16/094544qanrpbnlmltilump.jpg) + +开源操作系统 [FreeDOS][2] 是一个久经考验的项目,可帮助用户玩复古游戏、更新固件、运行过时但受欢迎的应用以及研究操作系统设计。FreeDOS 提供了有关个人计算历史的见解(因为它实现了 80 年代初的事实上的操作系统),但是它是在现代环境中进行的。在本文中,我将使用 FreeDOS 来解释文件名和扩展名是如何发展的。 + +### 了解文件名和 ASCII 文本 + +FreeDOS 文件名遵循所谓的 *8.3 惯例*。这意味着所有的 FreeDOS 文件名都有两个部分,分别包含最多八个和三个字符。第一部分通常被称为*文件名*(这可能会让人有点困惑,因为文件名和文件扩展名的组合也被称为文件名)。这一部分可以有一个到八个字符。之后是*扩展名*,可以有零到三个字符。这两部分之间用一个点隔开。 + +文件名可以使用任何字母或数字。键盘上的许多其他字符也是允许的,但不是所有的字符。这是因为许多其他字符在 FreeDOS 中被指定了特殊用途。一些可以出现在 FreeDOS 文件名中的字符有: + + +``` +~ ! @ # $ % ^ & ( ) _ - { } ` +``` + +扩展 [ASCII][3] 字符集中也有一些字符可以使用,例如 `�`。 + +在 FreeDOS 中具有特殊意义的字符,因此不能用于文件名中,包括: + +``` +* / + | \ = ? [ ] ; : " . < > , +``` + +另外,你不能在 FreeDOS 文件名中使用空格。FreeDOS 控制台[使用空格将命令的与选项和参数分隔][4]。 + +FreeDOS 是*不区分大小写*的,所以不管你是使用大写字母还是小写字母都无所谓。所有的字母都会被转换为大写字母,所以无论你做什么,你的文件最终都会在名称中使用大写字母。 + +#### 文件扩展名 + +FreeDOS 中的文件不需要有扩展名,但文件扩展名确实有一些用途。某些文件扩展名在 FreeDOS 中有内置的含义,例如: + + * **EXE**:可执行文件 + * **COM**:命令文件 + * **SYS**:系统文件 + * **BAT**:批处理文件 + +特定的软件程序使用其他扩展名,或者你可以在创建文件时使用它们。这些扩展名没有绝对的文件关联,因此如果你使用 FreeDOS 的文字处理器,你的文件使用什么扩展名并不重要。如果你愿意,你可以发挥创意,将扩展名作为你的文件系统的一部分。例如,你可以用 `*.JAN`、`*.FEB`、`*.MAR`、`*.APR` 等等来命名你的备忘录。 + +### 编辑文件 + +FreeDOS 自带的 Edit 应用可以快速方便地进行文本编辑。它是一个简单的编辑器,沿屏幕顶部有一个菜单栏,可以方便地访问所有常用的功能(如复制、粘贴、保存等)。 + +![Editing in FreeDOS][5] + +正如你所期望的那样,还有很多其他的文本编辑器可以使用,包括小巧但用途广泛的 [e3 编辑器][7]。你可以在 GitLab 上找到各种各样的 [FreeDOS 应用][8] 。 + +### 创建文件 + +你可以在 FreeDOS 中使用 `touch` 命令创建空文件。这个简单的工具可以更新文件的修改时间或创建一个新文件。 + +``` +C:\>touch foo.txt +C:\>dir +FOO TXT 0 01-12-2021 10:00a +``` + +你也可以直接从 FreeDOS 控制台创建文件,而不需要使用 Edit 文本编辑器。首先,使用 `copy` 命令将控制台中的输入(简称 `con`)复制到一个新的文件对象中。用 `Ctrl+Z` 终止输入,然后按**回车**键: + +``` +C:\>copy con test.txt +con => test.txt +This is a test file. +^Z +``` + +`Ctrl+Z` 字符在控制台中显示为 `^Z`。它并没有被复制到文件中,而是作为文件结束(EOF)的分隔符。换句话说,它告诉 FreeDOS 何时停止复制。这是一个很好的技巧,可以用来做快速的笔记或开始一个简单的文档,以便以后工作。 + +### 文件和 FreeDOS + +FreeDOS 是开源的、免费的且 [易于安装][9]。探究 FreeDOS 如何处理文件,可以帮助你了解多年来计算的发展,不管你平时使用的是什么操作系统。启动 FreeDOS,开始探索现代复古计算吧! + +_本文中的部分信息曾发表在 [DOS 课程 7:DOS 文件名;ASCII][10] 中(CC BY-SA 4.0)。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/files-freedos + +作者:[Kevin O'Brien][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/ahuka +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_paper_folder.png?itok=eIJWac15 (Files in a folder) +[2]: https://www.freedos.org/ +[3]: tmp.2sISc4Tp3G#ASCII +[4]: https://opensource.com/article/21/2/set-your-path-freedos +[5]: https://opensource.com/sites/default/files/uploads/freedos_2_files-edit.jpg (Editing in FreeDOS) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/article/20/12/e3-linux +[8]: https://gitlab.com/FDOS/ +[9]: https://opensource.com/article/18/4/gentle-introduction-freedos +[10]: https://www.ahuka.com/dos-lessons-for-self-study-purposes/dos-lesson-7-dos-filenames-ascii/ diff --git a/published/202103/20210311 Linux Mint Cinnamon vs MATE vs Xfce- Which One Should You Use.md b/published/202103/20210311 Linux Mint Cinnamon vs MATE vs Xfce- Which One Should You Use.md new file mode 100644 index 0000000000..001e18125d --- /dev/null +++ b/published/202103/20210311 Linux Mint Cinnamon vs MATE vs Xfce- Which One Should You Use.md @@ -0,0 +1,175 @@ +[#]: subject: (Linux Mint Cinnamon vs MATE vs Xfce: Which One Should You Use?) +[#]: via: (https://itsfoss.com/linux-mint-cinnamon-mate-xfce/) +[#]: author: (Dimitrios https://itsfoss.com/author/dimitrios/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13213-1.html) + +Cinnamon vs MATE vs Xfce:你应该选择那一个 Linux Mint 口味? +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/18/111916ljidnfwwsxec1fqf.jpg) + +Linux Mint 无疑是 [最适合初学者的 Linux 发行版之一][1]。尤其是对于刚刚迈向 Linux 世界的 Windows 用户来说,更是如此。 + +2006 年以来(也就是 Linux Mint 首次发布的那一年),他们开发了一系列的提高用户的体验的 [工具][2]。此外,Linux Mint 是基于 Ubuntu 的,所以你有一个可以寻求帮助的庞大的用户社区。 + +我不打算讨论 Linux Mint 有多好。如果你已经下定决心 [安装Linux Mint][3],你可能会对它网站上的 [下载部分][4] 感到有些困惑。 + +它给了你三个选择:Cinnamon、MATE 和 Xfce。不知道该如何选择吗?我将在本文中帮你解决这个问题。 + +![][5] + +如果你是个 Linux 的绝对新手,对上面的东西一无所知,我建议你了解一下 [什么是 Linux 桌面环境][6]。如果你能再多花点时间,请阅读这篇关于 [什么是 Linux,以及为什么有这么多看起来相似的 Linux 操作系统][7] 的优秀解释。 + +有了这些信息,你就可以了解各种 Linux Mint 版本之间的区别了。如果你不知道该选择哪一个,通过这篇文章,我将帮助你做出一个有意识的选择。 + +### 你应该选择哪个 Linux Mint 版本? + +![][8] + +简单来说,可供选择的有以下几种: + + * **Cinnamon 桌面**:具有现代感的传统桌面。 + * **MATE 桌面**:类似 GNOME 2 时代的传统外观桌面。 + * **Xfce 桌面**:一个流行的轻量级桌面环境。 + +我们来逐一看看 Mint 的各个变种。 + +#### Linux Mint Cinnamon 版 + +Cinnamon 桌面是由 Linux Mint 团队开发的,显然它是 Linux Mint 的主力版本。 + +早在近十年前,当 GNOME 桌面选择了非常规的 GNOME 3 用户界面时,人们就开始了 Cinnamon 的开发,通过复刻 GNOME 2 的一些组件来保持桌面的传统外观。 + +很多 Linux 用户喜欢 Cinnamon,就是因为它有像 Windows 7 一样的界面。 + +![Linux Mint Cinnamon desktop][9] + +##### 性能和相应能力 + +Cinnamon 桌面的性能比过去的版本有所提高,但如果没有固态硬盘,你会觉得有点迟钝。上一次我使用 Cinnamon 桌面是在 4.4.8 版,开机后的内存消耗在 750MB 左右。现在的 4.8.6 版有了很大的改进,开机后减少了 100MB 内存消耗。 + +为了获得最佳的用户体验,应该考虑双核 CPU,最低 4GB 内存。 + +![Linux Mint 20 Cinnamon idle system stats][10] + +##### 优势 + + * 从 Windows 无缝切换 + * 赏心悦目 + * 高度 [可定制][11] + +##### 劣势 + + * 如果你的系统只有 2GB 内存,可能还是不够理想 + +**附加建议**:如果你喜欢 Debian 而不是 Ubuntu,你可以选择 [Linux Mint Debian 版][12](LMDE)。LMDE 和带有 Cinnamon 桌面的 Debian 主要区别在于 LMDE 向其仓库提供最新的桌面环境。 + +#### Linux Mint Mate 版 + +[MATE 桌面环境][13] 也有类似的故事,它的目的是维护和支持 GNOME 2 的代码库和应用程序。它的外观和感觉与 GNOME 2 非常相似。 + +在我看来,到目前为止,MATE 桌面的最佳实现是 [Ubuntu MATE][14]。在 Linux Mint 中,你会得到一个定制版的 MATE 桌面,它符合 Cinnamon 美学,而不是传统的 GNOME 2 设定。 + +![Screenshot of Linux Mint MATE desktop][15] + +##### 性能和响应能力 + +MATE 桌面以轻薄著称,这一点毋庸置疑。与 Cinnamon 桌面相比,其 CPU 的使用率始终保持在较低的水平,换言之,在笔记本电脑上会有更好的电池续航时间。 + +虽然感觉没有 Xfce 那么敏捷(在我看来),但不至于影响用户体验。内存消耗在 500MB 以下起步,这对于功能丰富的桌面环境来说是令人印象深刻的。 + +![Linux Mint 20 MATE idle system stats][16] + +##### 优势 + + * 不影响 [功能][17] 的轻量级桌面 + * 足够的 [定制化][18] 可能性 + +##### 劣势 + + * 传统的外观可能会给你一种过时的感觉 + +#### Linux Mint Xfce 版 + +Xfce 项目始于 1996 年,受到了 UNIX 的 [通用桌面环境(CDE)][19] 的启发。Xfce 是 “[XForms][20] Common Environment” 的缩写,但由于它不再使用 XForms 工具箱,所以名字拼写为 “Xfce”。 + +它的目标是快速、轻量级和易于使用。Xfce 是许多流行的 Linux 发行版的主要桌面,如 [Manjaro][21] 和 [MX Linux][22]。 + +Linux Mint 提供了一个精致的 Xfce 桌面,但即使是黑暗主题也无法与 Cinnamon 桌面的美感相比。 + +![Linux Mint 20 Xfce desktop][23] + +##### 性能和响应能力 + +Xfce 是 Linux Mint 提供的最精简的桌面环境。通过点击开始菜单、设置控制面板或探索底部面板,你会发现这是一个简单而又灵活的桌面环境。 + +尽管我觉得极简主义是一个积极的属性,但 Xfce 并不是一个养眼的产品,反而留下的是比较传统的味道。但对于一些用户来说,经典的桌面环境才是他们的首选。 + +在第一次开机时,内存的使用情况与 MATE 桌面类似,但并不尽如人意。如果你的电脑没有配备 SSD,Xfce 桌面环境可以让你的系统复活。 + +![Linux Mint 20 Xfce idle system stats][24] + +##### 优势 + + * 使用简单 + * 非常轻巧,适合老式硬件 + * 坚如磐石的稳定 + +##### 劣势 + + * 过时的外观 + * 与 Cinnamon 相比,可能没有那么多的定制化服务 + +### 总结 + +由于这三款桌面环境都是基于 GTK 工具包的,所以选择哪个纯属个人喜好。它们都很节约系统资源,对于 4GB 内存的适度系统来说,表现良好。Xfce 和 MATE 可以更低一些,支持低至 2GB 内存的系统。 + +Linux Mint 并不是唯一提供多种选择的发行版。Manjaro、Fedora和 [Ubuntu 等发行版也有各种口味][25] 可供选择。 + +如果你还是无法下定决心,我建议先选择默认的 Cinnamon 版,并尝试 [在虚拟机中使用 Linux Mint][26]。看看你是否喜欢这个外观和感觉。如果不喜欢,你可以用同样的方式测试其他变体。如果你决定了这个版本,你可以继续 [在你的主系统上安装它][3]。 + +希望我的这篇文章能够帮助到你。如果你对这个话题还有疑问或建议,请在下方留言。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-mint-cinnamon-mate-xfce/ + +作者:[Dimitrios][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-linux-beginners/ +[2]: https://linuxmint-developer-guide.readthedocs.io/en/latest/mint-tools.html# +[3]: https://itsfoss.com/install-linux-mint/ +[4]: https://linuxmint.com/download.php +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/linux-mint-version-options.png?resize=789%2C277&ssl=1 +[6]: https://itsfoss.com/what-is-desktop-environment/ +[7]: https://itsfoss.com/what-is-linux/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/Linux-Mint-variants.jpg?resize=800%2C450&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/linux-mint-20.1-cinnamon.jpg?resize=800%2C500&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/Linux-Mint-20-Cinnamon-ram-usage.png?resize=800%2C600&ssl=1 +[11]: https://itsfoss.com/customize-cinnamon-desktop/ +[12]: https://itsfoss.com/lmde-4-release/ +[13]: https://mate-desktop.org/ +[14]: https://itsfoss.com/ubuntu-mate-20-04-review/ +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/linux-mint-mate.jpg?resize=800%2C500&ssl=1 +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/Linux-Mint-20-MATE-ram-usage.png?resize=800%2C600&ssl=1 +[17]: https://mate-desktop.org/blog/2020-02-10-mate-1-24-released/ +[18]: https://itsfoss.com/ubuntu-mate-customization/ +[19]: https://en.wikipedia.org/wiki/Common_Desktop_Environment +[20]: https://en.wikipedia.org/wiki/XForms_(toolkit) +[21]: https://itsfoss.com/manjaro-linux-review/ +[22]: https://itsfoss.com/mx-linux-19/ +[23]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/linux-mint-xfce.jpg?resize=800%2C500&ssl=1 +[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/Linux-Mint-20-Xfce-ram-usage.png?resize=800%2C600&ssl=1 +[25]: https://itsfoss.com/which-ubuntu-install/ +[26]: https://itsfoss.com/install-linux-mint-in-virtualbox/ diff --git a/published/202103/20210311 Set up network parental controls on a Raspberry Pi.md b/published/202103/20210311 Set up network parental controls on a Raspberry Pi.md new file mode 100644 index 0000000000..79b2b0aa0a --- /dev/null +++ b/published/202103/20210311 Set up network parental controls on a Raspberry Pi.md @@ -0,0 +1,84 @@ +[#]: subject: (Set up network parental controls on a Raspberry Pi) +[#]: via: (https://opensource.com/article/21/3/raspberry-pi-parental-control) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13216-1.html) + +在树莓派上设置家庭网络的家长控制 +====== + +> 用最少的时间和金钱投入,就能保证孩子上网安全。 + +![Family learning and reading together at night in a room][1] + +家长们一直在寻找保护孩子们上网的方法,从防止恶意软件、横幅广告、弹出窗口、活动跟踪脚本和其他问题,到防止他们在应该做功课的时候玩游戏和看 YouTube。许多企业使用工具来规范员工的网络安全和活动,但问题是如何在家里实现这一点? + +简短的答案是一台小巧、廉价的树莓派电脑,它可以让你为孩子和你在家的工作设置家长控制parental controls。本文将引导你了解使用树莓派构建自己的启用了家长控制功能的家庭网络有多么容易。 + +### 安装硬件和软件 + +对于这个项目,你需要一个树莓派和一个家庭网络路由器。如果你在线购物网站花上 5 分钟浏览,就可以发现很多选择。[树莓派 4][2] 和 [TP-Link 路由器][3] 是初学者的好选择。 + +有了网络设备和树莓派后,你需要在 Linux 容器或者受支持的操作系统中安装 [Pi-hole][4]。有几种 [安装方法][5],但一个简单的方法是在你的树莓派上执行以下命令: + +``` +curl -sSL https://install.pi-hole.net | bash +``` + +### 配置 Pi-hole 作为你的 DNS 服务器 + +接下来,你需要在路由器和 Pi-hole 中配置 DHCP 设置: + + 1. 禁用路由器中的 DHCP 服务器设置 + 2. 在 Pi-hole 中启用 DHCP 服务器 + +每台设备都不一样,所以我没有办法告诉你具体需要点击什么来调整设置。一般来说,你可以通过浏览器访问你家的路由器。你的路由器的地址有时会印在路由器的底部,它以 192.168 或 10 开头。 + +在浏览器中,打开你的路由器的地址,并用你的凭证登录。它通常是简单的 `admin` 和一个数字密码(有时这个密码也打印在路由器上)。如果你不知道登录名,请打电话给你的供应商并询问详情。 + +在图形界面中,寻找你的局域网内关于 DHCP 的部分,并停用 DHCP 服务器。 你的路由器界面几乎肯定会与我的不同,但这是一个我设置的例子。取消勾选 **DHCP 服务器**: + +![Disable DHCP][6] + +接下来,你必须在 Pi-hole 上激活 DHCP 服务器。如果你不这样做,除非你手动分配 IP 地址,否则你的设备将无法上网! + +### 让你的网络适合家庭 + +设置完成了。现在,你的网络设备(如手机、平板电脑、笔记本电脑等)将自动找到树莓派上的 DHCP 服务器。然后,每个设备将被分配一个动态 IP 地址来访问互联网。 + +注意:如果你的路由器设备支持设置 DNS 服务器,你也可以在路由器中配置 DNS 客户端。客户端将把 Pi-hole 作为你的 DNS 服务器。 + +要设置你的孩子可以访问哪些网站和活动的规则,打开浏览器进入 Pi-hole 管理页面,`http://pi.hole/admin/`。在仪表板上,点击“Whitelist”来添加你的孩子可以访问的网页。你也可以将不允许孩子访问的网站(如游戏、成人、广告、购物等)添加到“Blocklist”。 + +![Pi-hole admin dashboard][8] + +### 接下来是什么? + +现在,你已经在树莓派上设置了家长控制,你可以让你的孩子更安全地上网,同时让他们访问经批准的娱乐选项。这也可以通过减少你的家庭串流来降低你的家庭网络使用量。更多高级使用方法,请访问 Pi-hole 的[文档][9]和[博客][10]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/raspberry-pi-parental-control + +作者:[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/family_learning_kids_night_reading.png?itok=6K7sJVb1 (Family learning and reading together at night in a room) +[2]: https://www.raspberrypi.org/products/ +[3]: https://www.amazon.com/s?k=tp-link+router&crid=3QRLN3XRWHFTC&sprefix=TP-Link%2Caps%2C186&ref=nb_sb_ss_ts-doa-p_3_7 +[4]: https://pi-hole.net/ +[5]: https://github.com/pi-hole/pi-hole/#one-step-automated-install +[6]: https://opensource.com/sites/default/files/uploads/disabledhcp.jpg (Disable DHCP) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/uploads/blocklist.png (Pi-hole admin dashboard) +[9]: https://docs.pi-hole.net/ +[10]: https://pi-hole.net/blog/#page-content diff --git a/published/202103/20210312 Visualize multi-threaded Python programs with an open source tool.md b/published/202103/20210312 Visualize multi-threaded Python programs with an open source tool.md new file mode 100644 index 0000000000..2a389f5245 --- /dev/null +++ b/published/202103/20210312 Visualize multi-threaded Python programs with an open source tool.md @@ -0,0 +1,256 @@ +[#]: subject: (Visualize multi-threaded Python programs with an open source tool) +[#]: via: (https://opensource.com/article/21/3/python-viztracer) +[#]: author: (Tian Gao https://opensource.com/users/gaogaotiantian) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13253-1.html) + +用一个开源工具实现多线程 Python 程序的可视化 +====== + +> VizTracer 可以跟踪并发的 Python 程序,以帮助记录、调试和剖析。 + +![](https://img.linux.net.cn/data/attachment/album/202103/30/230404xi9pox38ookk8xe2.jpg) + +并发是现代编程中必不可少的一部分,因为我们有多个核心,有许多需要协作的任务。然而,当并发程序不按顺序运行时,就很难理解它们。对于工程师来说,在这些程序中发现 bug 和性能问题不像在单线程、单任务程序中那么容易。 + +在 Python 中,你有多种并发的选择。最常见的可能是用 `threading` 模块的多线程,用`subprocess` 和 `multiprocessing` 模块的多进程,以及最近用 `asyncio` 模块提供的 `async` 语法。在 [VizTracer][2] 之前,缺乏分析使用了这些技术程序的工具。 + +VizTracer 是一个追踪和可视化 Python 程序的工具,对日志、调试和剖析很有帮助。尽管它对单线程、单任务程序很好用,但它在并发程序中的实用性是它的独特之处。 + +### 尝试一个简单的任务 + +从一个简单的练习任务开始:计算出一个数组中的整数是否是质数并返回一个布尔数组。下面是一个简单的解决方案: + +``` +def is_prime(n): + for i in range(2, n): + if n % i == 0: + return False + return True + +def get_prime_arr(arr): + return [is_prime(elem) for elem in arr] +``` + +试着用 VizTracer 以单线程方式正常运行它: + +``` +if __name__ == "__main__": + num_arr = [random.randint(100, 10000) for _ in range(6000)] + get_prime_arr(num_arr) +``` + +``` +viztracer my_program.py +``` + +![Running code in a single thread][3] + +调用堆栈报告显示,耗时约 140ms,大部分时间花在 `get_prime_arr` 上。 + +![call-stack report][5] + +这只是在数组中的元素上一遍又一遍地执行 `is_prime` 函数。 + +这是你所期望的,而且它并不有趣(如果你了解 VizTracer 的话)。 + +### 试试多线程程序 + +试着用多线程程序来做: + +``` +if __name__ == "__main__": +    num_arr = [random.randint(100, 10000) for i in range(2000)] +    thread1 = Thread(target=get_prime_arr, args=(num_arr,)) +    thread2 = Thread(target=get_prime_arr, args=(num_arr,)) +    thread3 = Thread(target=get_prime_arr, args=(num_arr,)) + +    thread1.start() +    thread2.start() +    thread3.start() + +    thread1.join() +    thread2.join() +    thread3.join() +``` + +为了配合单线程程序的工作负载,这就为三个线程使用了一个 2000 元素的数组,模拟了三个线程共享任务的情况。 + +![Multi-thread program][6] + +如果你熟悉 Python 的全局解释器锁(GIL),就会想到,它不会再快了。由于开销太大,花了 140ms 多一点的时间。不过,你可以观察到多线程的并发性: + +![Concurrency of multiple threads][7] + +当一个线程在工作(执行多个 `is_prime` 函数)时,另一个线程被冻结了(一个 `is_prime` 函数);后来,它们进行了切换。这是由于 GIL 的原因,这也是 Python 没有真正的多线程的原因。它可以实现并发,但不能实现并行。 + +### 用多进程试试 + +要想实现并行,办法就是 `multiprocessing` 库。下面是另一个使用 `multiprocessing` 的版本: + +``` +if __name__ == "__main__": +    num_arr = [random.randint(100, 10000) for _ in range(2000)] +    +    p1 = Process(target=get_prime_arr, args=(num_arr,)) +    p2 = Process(target=get_prime_arr, args=(num_arr,)) +    p3 = Process(target=get_prime_arr, args=(num_arr,)) + +    p1.start() +    p2.start() +    p3.start() + +    p1.join() +    p2.join() +    p3.join() +``` + +要使用 VizTracer 运行它,你需要一个额外的参数: + +``` +viztracer --log_multiprocess my_program.py +``` + +![Running with extra argument][8] + +整个程序在 50ms 多一点的时间内完成,实际任务在 50ms 之前完成。程序的速度大概提高了三倍。 + +为了和多线程版本进行比较,这里是多进程版本: + +![Multi-process version][9] + +在没有 GIL 的情况下,多个进程可以实现并行,也就是多个 `is_prime` 函数可以并行执行。 + +不过,Python 的多线程也不是一无是处。例如,对于计算密集型和 I/O 密集型程序,你可以用睡眠来伪造一个 I/O 绑定的任务: + +``` +def io_task(): +    time.sleep(0.01) +``` + +在单线程、单任务程序中试试: + +``` +if __name__ == "__main__": +    for _ in range(3): +        io_task() +``` + +![I/O-bound single-thread, single-task program][10] + +整个程序用了 30ms 左右,没什么特别的。 + +现在使用多线程: + +``` +if __name__ == "__main__": +    thread1 = Thread(target=io_task) +    thread2 = Thread(target=io_task) +    thread3 = Thread(target=io_task) + +    thread1.start() +    thread2.start() +    thread3.start() + +    thread1.join() +    thread2.join() +    thread3.join() +``` + +![I/O-bound multi-thread program][11] + +程序耗时 10ms,很明显三个线程是并发工作的,这提高了整体性能。 + +### 用 asyncio 试试 + +Python 正在尝试引入另一个有趣的功能,叫做异步编程。你可以制作一个异步版的任务: + +``` +import asyncio + +async def io_task(): +    await asyncio.sleep(0.01) + +async def main(): +    t1 = asyncio.create_task(io_task()) +    t2 = asyncio.create_task(io_task()) +    t3 = asyncio.create_task(io_task()) + +    await t1 +    await t2 +    await t3 + +if __name__ == "__main__": +    asyncio.run(main()) +``` + +由于 `asyncio` 从字面上看是一个带有任务的单线程调度器,你可以直接在它上使用 VizTracer: + +![VizTracer with asyncio][12] + +依然花了 10ms,但显示的大部分函数都是底层结构,这可能不是用户感兴趣的。为了解决这个问题,可以使用 `--log_async` 来分离真正的任务: + +``` +viztracer --log_async my_program.py +``` + +![Using --log_async to separate tasks][13] + +现在,用户任务更加清晰了。在大部分时间里,没有任务在运行(因为它唯一做的事情就是睡觉)。有趣的部分是这里: + +![Graph of task creation and execution][14] + +这显示了任务的创建和执行时间。Task-1 是 `main()` 协程,创建了其他任务。Task-2、Task-3、Task-4 执行 `io_task` 和 `sleep` 然后等待唤醒。如图所示,因为是单线程程序,所以任务之间没有重叠,VizTracer 这样可视化是为了让它更容易理解。 + +为了让它更有趣,可以在任务中添加一个 `time.sleep` 的调用来阻止异步循环: + +``` +async def io_task(): +    time.sleep(0.01) +    await asyncio.sleep(0.01) +``` + +![time.sleep call][15] + +程序耗时更长(40ms),任务填补了异步调度器中的空白。 + +这个功能对于诊断异步程序的行为和性能问题非常有帮助。 + +### 看看 VizTracer 发生了什么? + +通过 VizTracer,你可以在时间轴上查看程序的进展情况,而不是从复杂的日志中想象。这有助于你更好地理解你的并发程序。 + +VizTracer 是开源的,在 Apache 2.0 许可证下发布,支持所有常见的操作系统(Linux、macOS 和 Windows)。你可以在 [VizTracer 的 GitHub 仓库][16]中了解更多关于它的功能和访问它的源代码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/python-viztracer + +作者:[Tian Gao][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/gaogaotiantian +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/colorful_sound_wave.png?itok=jlUJG0bM (Colorful sound wave graph) +[2]: https://readthedocs.org/projects/viztracer/ +[3]: https://opensource.com/sites/default/files/uploads/viztracer_singlethreadtask.png (Running code in a single thread) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/viztracer_callstackreport.png (call-stack report) +[6]: https://opensource.com/sites/default/files/uploads/viztracer_multithread.png (Multi-thread program) +[7]: https://opensource.com/sites/default/files/uploads/viztracer_concurrency.png (Concurrency of multiple threads) +[8]: https://opensource.com/sites/default/files/uploads/viztracer_multithreadrun.png (Running with extra argument) +[9]: https://opensource.com/sites/default/files/uploads/viztracer_comparewithmultiprocess.png (Multi-process version) +[10]: https://opensource.com/sites/default/files/uploads/io-bound_singlethread.png (I/O-bound single-thread, single-task program) +[11]: https://opensource.com/sites/default/files/uploads/io-bound_multithread.png (I/O-bound multi-thread program) +[12]: https://opensource.com/sites/default/files/uploads/viztracer_asyncio.png (VizTracer with asyncio) +[13]: https://opensource.com/sites/default/files/uploads/log_async.png (Using --log_async to separate tasks) +[14]: https://opensource.com/sites/default/files/uploads/taskcreation.png (Graph of task creation and execution) +[15]: https://opensource.com/sites/default/files/uploads/time.sleep_call.png (time.sleep call) +[16]: https://github.com/gaogaotiantian/viztracer diff --git a/published/202103/20210315 6 things to know about using WebAssembly on Firefox.md b/published/202103/20210315 6 things to know about using WebAssembly on Firefox.md new file mode 100644 index 0000000000..86b133d783 --- /dev/null +++ b/published/202103/20210315 6 things to know about using WebAssembly on Firefox.md @@ -0,0 +1,94 @@ +[#]: subject: (6 things to know about using WebAssembly on Firefox) +[#]: via: (https://opensource.com/article/21/3/webassembly-firefox) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13230-1.html) + +在 Firefox 上使用 WebAssembly 要了解的 6 件事 +====== + +> 了解在 Firefox 上运行 WebAssembly 的机会和局限性。 + +![](https://img.linux.net.cn/data/attachment/album/202103/23/223901pi6tcg7ybsyxos7x.jpg) + +WebAssembly 是一种可移植的执行格式,由于它能够以近乎原生的速度在浏览器中执行应用而引起了人们的极大兴趣。WebAssembly 本质上有一些特殊的属性和局限性。但是,通过将其与其他技术结合,将出现全新的可能性,尤其是与浏览器中的游戏有关的可能性。 + +本文介绍了在 Firefox 上运行 WebAssembly 的概念、可能性和局限性。 + +### 沙盒 + +WebAssembly 有 [严格的安全策略][2]。 WebAssembly 中的程序或功能单元称为*模块*。每个模块实例都运行在自己的隔离内存空间中。因此,即使同一个网页加载了多个模块,它们也无法访问另一个模块的虚拟地址空间。设计上,WebAssembly 还考虑了内存安全性和控制流完整性,这使得(几乎)确定性的执行成为可能。 + +### Web API + +通过 JavaScript [Web API][3] 可以访问多种输入和输出设备。根据这个 [提案][4],将来可以不用绕道到 JavaScript 来访问 Web API。C++ 程序员可以在 [Emscripten.org][5] 上找到有关访问 Web API 的信息。Rust 程序员可以使用 [rustwasm.github.io][7] 中写的 [wasm-bindgen][6] 库。 + +### 文件输入/输出 + +因为 WebAssembly 是在沙盒环境中执行的,所以当它在浏览器中执行时,它无法访问主机的文件系统。但是,Emscripten 提供了虚拟文件系统形式的解决方案。 + +Emscripten 使在编译时将文件预加载到内存文件系统成为可能。然后可以像在普通文件系统上一样从 WebAssembly 应用中读取这些文件。这个 [教程][8] 提供了更多信息。 + +### 持久化数据 + +如果你需要在客户端存储持久化数据,那么必须通过 JavaScript Web API 来完成。请参考 Mozilla 开发者网络(MDN)关于 [浏览器存储限制和过期标准][9] 的文档,了解不同方法的详细信息。 + +### 内存管理 + +WebAssembly 模块作为 [堆栈机][10] 在线性内存上运行。这意味着堆内存分配等概念是没有的。然而,如果你在 C++ 中使用 `new` 或者在 Rust 中使用 `Box::new`,你会期望它会进行堆内存分配。将堆内存分配请求转换成 WebAssembly 的方式在很大程度上依赖于工具链。你可以在 Frank Rehberger 关于 [WebAssembly 和动态内存][11] 的文章中找到关于不同工具链如何处理堆内存分配的详细分析。 + +### 游戏! + +与 [WebGL][12] 结合使用时,WebAssembly 的执行速度很高,因此可以在浏览器中运行原生游戏。大型专有游戏引擎 [Unity][13] 和[虚幻 4][14] 展示了 WebGL 可以实现的功能。也有使用 WebAssembly 和 WebGL 接口的开源游戏引擎。这里有些例子: + + * 自 2011 年 11 月起,[id Tech 4][15] 引擎(更常称之为 Doom 3 引擎)可在 [GitHub][16] 上以 GPL 许可的形式获得。此外,还有一个 [Doom 3 的 WebAssembly 移植版][17]。 + * Urho3D 引擎提供了一些 [令人印象深刻的例子][18],它们可以在浏览器中运行。 + * 如果你喜欢复古游戏,可以试试这个 [Game Boy 模拟器][19]。 + * [Godot 引擎也能生成 WebAssembly][20]。我找不到演示,但 [Godot 编辑器][21] 已经被移植到 WebAssembly 上。 + +### 有关 WebAssembly 的更多信息 + +WebAssembly 是一项很有前途的技术,我相信我们将来会越来越多地看到它。除了在浏览器中执行之外,WebAssembly 还可以用作可移植的执行格式。[Wasmer][22] 容器主机使你可以在各种平台上执行 WebAssembly 代码。 + +如果你需要更多的演示、示例和教程,请看一下这个 [WebAssembly 主题集合][23]。Mozilla 的 [游戏和示例合集][24] 并非全是 WebAssembly,但仍然值得一看。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/webassembly-firefox + +作者:[Stephan Avenwedde][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/hansic99 +[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://webassembly.org/docs/security/ +[3]: https://developer.mozilla.org/en-US/docs/Web/API +[4]: https://github.com/WebAssembly/gc/blob/master/README.md +[5]: https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html +[6]: https://github.com/rustwasm/wasm-bindgen +[7]: https://rustwasm.github.io/wasm-bindgen/ +[8]: https://emscripten.org/docs/api_reference/Filesystem-API.html +[9]: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Browser_storage_limits_and_eviction_criteria +[10]: https://en.wikipedia.org/wiki/Stack_machine +[11]: https://frehberg.wordpress.com/webassembly-and-dynamic-memory/ +[12]: https://en.wikipedia.org/wiki/WebGL +[13]: https://beta.unity3d.com/jonas/AngryBots/ +[14]: https://www.youtube.com/watch?v=TwuIRcpeUWE +[15]: https://en.wikipedia.org/wiki/Id_Tech_4 +[16]: https://github.com/id-Software/DOOM-3 +[17]: https://wasm.continuation-labs.com/d3demo/ +[18]: https://urho3d.github.io/samples/ +[19]: https://vaporboy.net/ +[20]: https://docs.godotengine.org/en/stable/development/compiling/compiling_for_web.html +[21]: https://godotengine.org/editor/latest/godot.tools.html +[22]: https://github.com/wasmerio/wasmer +[23]: https://github.com/mbasso/awesome-wasm +[24]: https://developer.mozilla.org/en-US/docs/Games/Examples diff --git a/published/202103/20210315 Learn how file input and output works in C.md b/published/202103/20210315 Learn how file input and output works in C.md new file mode 100644 index 0000000000..39915a214f --- /dev/null +++ b/published/202103/20210315 Learn how file input and output works in C.md @@ -0,0 +1,274 @@ +[#]: subject: (Learn how file input and output works in C) +[#]: via: (https://opensource.com/article/21/3/file-io-c) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13252-1.html) + +学习如何用 C 语言来进行文件输入输出操作 +====== + +> 理解 I/O 有助于提升你的效率。 + +![](https://img.linux.net.cn/data/attachment/album/202103/30/222717gyuegz88ryu8ry7i.jpg) + +如果你打算学习 C 语言的输入、输出,可以从 `stdio.h` 包含文件开始。正如你从其名字中猜到的,该文件定义了所有的标准(“std”)的输入和输出(“io”)函数。 + +大多数人学习的第一个 `stdio.h` 的函数是打印格式化输出的 `printf` 函数。或者是用来打印一个字符串的 `puts` 函数。这些函数非常有用,可以将信息打印给用户,但是如果你想做更多的事情,则需要了解其他函数。 + +你可以通过编写一个常见 Linux 命令的副本来了解其中一些功能和方法。`cp` 命令主要用于复制文件。如果你查看 `cp` 的帮助手册,可以看到 `cp` 命令支持非常多的参数和选项。但最简单的功能,就是复制文件: + +``` +cp infile outfile +``` + +你只需使用一些读写文件的基本函数,就可以用 C 语言来自己实现 `cp` 命令。 + +### 一次读写一个字符 + +你可以使用 `fgetc` 和 `fputc` 函数轻松地进行输入输出。这些函数一次只读写一个字符。该用法被定义在 `stdio.h`,并且这也很浅显易懂:`fgetc` 是从文件中读取一个字符,`fputc` 是将一个字符保存到文件中。 + +``` +int fgetc(FILE *stream); +int fputc(int c, FILE *stream); +``` + +编写 `cp` 命令需要访问文件。在 C 语言中,你使用 `fopen` 函数打开一个文件,该函数需要两个参数:文件名和打开文件的模式。模式通常是从文件读取(`r`)或向文件写入(`w`)。打开文件的方式也有其他选项,但是对于本教程而言,仅关注于读写操作。 + +因此,将一个文件复制到另一个文件就变成了打开源文件和目标文件,接着,不断从第一个文件读取字符,然后将该字符写入第二个文件。`fgetc` 函数返回从输入文件中读取的单个字符,或者当文件完成后返回文件结束标记(`EOF`)。一旦读取到 `EOF`,你就完成了复制操作,就可以关闭两个文件。该代码如下所示: + +``` + do { + ch = fgetc(infile); + if (ch != EOF) { + fputc(ch, outfile); + } + } while (ch != EOF); +``` + +你可以使用此循环编写自己的 `cp` 程序,以使用 `fgetc` 和 `fputc` 函数一次读写一个字符。`cp.c` 源代码如下所示: + +``` +#include + +int +main(int argc, char **argv) +{ + FILE *infile; + FILE *outfile; + int ch; + + /* parse the command line */ + + /* usage: cp infile outfile */ + + if (argc != 3) { + fprintf(stderr, "Incorrect usage\n"); + fprintf(stderr, "Usage: cp infile outfile\n"); + return 1; + } + + /* open the input file */ + + infile = fopen(argv[1], "r"); + if (infile == NULL) { + fprintf(stderr, "Cannot open file for reading: %s\n", argv[1]); + return 2; + } + + /* open the output file */ + + outfile = fopen(argv[2], "w"); + if (outfile == NULL) { + fprintf(stderr, "Cannot open file for writing: %s\n", argv[2]); + fclose(infile); + return 3; + } + + /* copy one file to the other */ + + /* use fgetc and fputc */ + + do { + ch = fgetc(infile); + if (ch != EOF) { + fputc(ch, outfile); + } + } while (ch != EOF); + + /* done */ + + fclose(infile); + fclose(outfile); + + return 0; +} +``` + +你可以使用 `gcc` 来将 `cp.c` 文件编译成一个可执行文件: + +``` +$ gcc -Wall -o cp cp.c +``` + +`-o cp` 选项告诉编译器将编译后的程序保存到 `cp` 文件中。`-Wall` 选项告诉编译器提示所有可能的警告,如果你没有看到任何警告,则表示一切正常。 + +### 读写数据块 + +通过每次读写一个字符来实现自己的 `cp` 命令可以完成这项工作,但这并不是很快。在复制“日常”文件(例如文档和文本文件)时,你可能不会注意到,但是在复制大型文件或通过网络复制文件时,你才会注意到差异。每次处理一个字符需要大量的开销。 + +实现此 `cp` 命令的一种更好的方法是,读取一块的输入数据到内存中(称为缓存),然后将该数据集合写入到第二个文件。这样做的速度要快得多,因为程序可以一次读取更多的数据,这就就减少了从文件中“读取”的次数。 + +你可以使用 `fread` 函数将文件读入一个变量中。这个函数有几个参数:将数据读入的数组或内存缓冲区的指针(`ptr`),要读取的最小对象的大小(`size`),要读取对象的个数(`nmemb`),以及要读取的文件(`stream`): + +``` +size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); +``` + +不同的选项为更高级的文件输入和输出(例如,读取和写入具有特定数据结构的文件)提供了很大的灵活性。但是,在从一个文件读取数据并将数据写入另一个文件的简单情况下,可以使用一个由字符数组组成的缓冲区。 + +你可以使用 `fwrite` 函数将缓冲区中的数据写入到另一个文件。这使用了与 `fread` 函数有相似的一组选项:要从中读取数据的数组或内存缓冲区的指针,要读取的最小对象的大小,要读取对象的个数以及要写入的文件。 + +``` +size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); +``` + +如果程序将文件读入缓冲区,然后将该缓冲区写入另一个文件,则数组(`ptr`)可以是固定大小的数组。例如,你可以使用长度为 200 个字符的字符数组作为缓冲区。 + +在该假设下,你需要更改 `cp` 程序中的循环,以将数据从文件读取到缓冲区中,然后将该缓冲区写入另一个文件中: + +``` + while (!feof(infile)) { + buffer_length = fread(buffer, sizeof(char), 200, infile); + fwrite(buffer, sizeof(char), buffer_length, outfile); + } +``` + +这是更新后的 `cp` 程序的完整源代码,该程序现在使用缓冲区读取和写入数据: + +``` +#include + +int +main(int argc, char **argv) +{ + FILE *infile; + FILE *outfile; + char buffer[200]; + size_t buffer_length; + + /* parse the command line */ + + /* usage: cp infile outfile */ + + if (argc != 3) { + fprintf(stderr, "Incorrect usage\n"); + fprintf(stderr, "Usage: cp infile outfile\n"); + return 1; + } + + /* open the input file */ + + infile = fopen(argv[1], "r"); + if (infile == NULL) { + fprintf(stderr, "Cannot open file for reading: %s\n", argv[1]); + return 2; + } + + /* open the output file */ + + outfile = fopen(argv[2], "w"); + if (outfile == NULL) { + fprintf(stderr, "Cannot open file for writing: %s\n", argv[2]); + fclose(infile); + return 3; + } + + /* copy one file to the other */ + + /* use fread and fwrite */ + + while (!feof(infile)) { + buffer_length = fread(buffer, sizeof(char), 200, infile); + fwrite(buffer, sizeof(char), buffer_length, outfile); + } + + /* done */ + + fclose(infile); + fclose(outfile); + + return 0; +} +``` + +由于你想将此程序与其他程序进行比较,因此请将此源代码另存为 `cp2.c`。你可以使用 `gcc` 编译程序: + +``` +$ gcc -Wall -o cp2 cp2.c +``` + +和之前一样,`-o cp2` 选项告诉编译器将编译后的程序保存到 `cp2` 程序文件中。`-Wall` 选项告诉编译器打开所有警告。如果你没有看到任何警告,则表示一切正常。 + +### 是的,这真的更快了 + +使用缓冲区读取和写入数据是实现此版本 `cp` 程序更好的方法。由于它可以一次将文件的多个数据读取到内存中,因此该程序不需要频繁读取数据。在小文件中,你可能没有注意到使用这两种方案的区别,但是如果你需要复制大文件,或者在较慢的介质(例如通过网络连接)上复制数据时,会发现明显的差距。 + +我使用 Linux `time` 命令进行了比较。此命令可以运行另一个程序,然后告诉你该程序花费了多长时间。对于我的测试,我希望了解所花费时间的差距,因此我复制了系统上的 628 MB CD-ROM 镜像文件。 + +我首先使用标准的 Linux 的 `cp` 命令复制了映像文件,以查看所需多长时间。一开始通过运行 Linux 的 `cp` 命令,同时我还避免使用 Linux 内置的文件缓存系统,使其不会给程序带来误导性能提升的可能性。使用 Linux `cp` 进行的测试,总计花费不到一秒钟的时间: + +``` +$ time cp FD13LIVE.iso tmpfile + +real 0m0.040s +user 0m0.001s +sys 0m0.003s +``` + +运行我自己实现的 `cp` 命令版本,复制同一文件要花费更长的时间。每次读写一个字符则花了将近五秒钟来复制文件: + +``` +$ time ./cp FD13LIVE.iso tmpfile + +real 0m4.823s +user 0m4.100s +sys 0m0.571s +``` + +从输入读取数据到缓冲区,然后将该缓冲区写入输出文件则要快得多。使用此方法复制文件花不到一秒钟: + +``` +$ time ./cp2 FD13LIVE.iso tmpfile + +real 0m0.944s +user 0m0.224s +sys 0m0.608s +``` + +我演示的 `cp` 程序使用了 200 个字符大小的缓冲区。我确信如果一次将更多文件数据读入内存,该程序将运行得更快。但是,通过这种比较,即使只有 200 个字符的缓冲区,你也已经看到了性能上的巨大差异。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/file-io-c + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/file_system.jpg?itok=pzCrX1Kc "4 manilla folders, yellow, green, purple, blue" +[2]: http://www.opengroup.org/onlinepubs/009695399/functions/fgetc.html +[3]: http://www.opengroup.org/onlinepubs/009695399/functions/fputc.html +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html +[5]: http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html +[6]: http://www.opengroup.org/onlinepubs/009695399/functions/fclose.html +[7]: http://www.opengroup.org/onlinepubs/009695399/functions/feof.html +[8]: http://www.opengroup.org/onlinepubs/009695399/functions/fread.html +[9]: http://www.opengroup.org/onlinepubs/009695399/functions/fwrite.html diff --git a/published/202103/20210316 How to write -Hello World- in WebAssembly.md b/published/202103/20210316 How to write -Hello World- in WebAssembly.md new file mode 100644 index 0000000000..b2e423aeb9 --- /dev/null +++ b/published/202103/20210316 How to write -Hello World- in WebAssembly.md @@ -0,0 +1,155 @@ +[#]: subject: (How to write 'Hello World' in WebAssembly) +[#]: via: (https://opensource.com/article/21/3/hello-world-webassembly) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13250-1.html) + +如何在 WebAssembly 中写 “Hello World”? +====== +> 通过这个分步教程,开始用人类可读的文本编写 WebAssembly。 + +![](https://img.linux.net.cn/data/attachment/album/202103/30/095907r6ecev48dw0l9w44.jpg) + +WebAssembly 是一种字节码格式,[几乎所有的浏览器][2] 都可以将它编译成其宿主操作系统的机器代码。除了 JavaScript 和 WebGL 之外,WebAssembly 还满足了将应用移植到浏览器中以实现平台独立的需求。作为 C++ 和 Rust 的编译目标,WebAssembly 使 Web 浏览器能够以接近原生的速度执行代码。 + +当谈论 WebAssembly 应用时,你必须区分三种状态: + + 1. **源码(如 C++ 或 Rust):** 你有一个用兼容语言编写的应用,你想把它在浏览器中执行。 + 2. **WebAssembly 字节码:** 你选择 WebAssembly 字节码作为编译目标。最后,你得到一个 `.wasm` 文件。 + 3. **机器码(opcode):** 浏览器加载 `.wasm` 文件,并将其编译成主机系统的相应机器码。 + +WebAssembly 还有一种文本格式,用人类可读的文本表示二进制格式。为了简单起见,我将其称为 **WASM-text**。WASM-text 可以比作高级汇编语言。当然,你不会基于 WASM-text 来编写一个完整的应用,但了解它的底层工作原理是很好的(特别是对于调试和性能优化)。 + +本文将指导你在 WASM-text 中创建经典的 “Hello World” 程序。 + +### 创建 .wat 文件 + +WASM-text 文件通常以 `.wat` 结尾。第一步创建一个名为 `helloworld.wat` 的空文本文件,用你最喜欢的文本编辑器打开它,然后粘贴进去: + +``` +(module +    ;; 从 JavaScript 命名空间导入 +    (import  "console"  "log" (func  $log (param  i32  i32))) ;; 导入 log 函数 +    (import  "js"  "mem" (memory  1)) ;; 导入 1 页 内存(64kb) +    +    ;; 我们的模块的数据段 +    (data (i32.const 0) "Hello World from WebAssembly!") +    +    ;; 函数声明:导出 helloWorld(),无参数 +    (func (export  "helloWorld") +        i32.const 0  ;; 传递偏移 0 到 log +        i32.const 29  ;; 传递长度 29 到 log(示例文本的字符串长度) +        call  $log +        ) +) +``` + +WASM-text 格式是基于 S 表达式的。为了实现交互,JavaScript 函数用 `import` 语句导入,WebAssembly 函数用 `export` 语句导出。在这个例子中,从 `console` 模块中导入 `log` 函数,它需要两个类型为 `i32` 的参数作为输入,以及一页内存(64KB)来存储字符串。 + +字符串将被写入偏移量 为 `0` 的数据段。数据段是你的内存的叠加投影overlay,内存是在 JavaScript 部分分配的。 + +函数用关键字 `func` 标记。当进入函数时,栈是空的。在调用另一个函数之前,函数参数会被压入栈中(这里是偏移量和长度)(见 `call $log`)。当一个函数返回一个 `f32` 类型时(例如),当离开函数时,一个 `f32` 变量必须保留在栈中(但在本例中不是这样)。 + +### 创建 .wasm 文件 + +WASM-text 和 WebAssembly 字节码是 1:1 对应的,这意味着你可以将 WASM-text 转换成字节码(反之亦然)。你已经有了 WASM-text,现在将创建字节码。 + +转换可以通过 [WebAssembly Binary Toolkit][3](WABT)来完成。从该链接克隆仓库,并按照安装说明进行安装。 + +建立工具链后,打开控制台并输入以下内容,将 WASM-text 转换为字节码: + +``` +wat2wasm helloworld.wat -o helloworld.wasm +``` + +你也可以用以下方法将字节码转换为 WASM-text: + +``` +wasm2wat helloworld.wasm -o helloworld_reverse.wat +``` + +一个从 `.wasm` 文件创建的 `.wat` 文件不包括任何函数或参数名称。默认情况下,WebAssembly 用它们的索引来识别函数和参数。 + +### 编译 .wasm 文件 + +目前,WebAssembly 只与 JavaScript 共存,所以你必须编写一个简短的脚本来加载和编译 `.wasm` 文件并进行函数调用。你还需要在 WebAssembly 模块中定义你要导入的函数。 + +创建一个空的文本文件,并将其命名为 `helloworld.html`,然后打开你喜欢的文本编辑器并粘贴进去: + +``` + + + + + Simple template + + + + + +``` + +`WebAssembly.Memory(...)` 方法返回一个大小为 64KB 的内存页。函数 `consoleLogString` 根据长度和偏移量从该内存页读取一个字符串。这两个对象作为 `importObject` 的一部分传递给你的 WebAssembly 模块。 + +在你运行这个例子之前,你可能必须允许 Firefox 从这个目录中访问文件,在地址栏输入 `about:config`,并将 `privacy.file_unique_origin` 设置为 `true`: + +![Firefox setting][4] + +> **注意:** 这样做会使你容易受到 [CVE-2019-11730][6] 安全问题的影响。 + +现在,在 Firefox 中打开 `helloworld.html`,按下 `Ctrl+K` 打开开发者控制台。 + +![Debugger output][7] + +### 了解更多 + +这个 Hello World 的例子只是 MDN 的 [了解 WebAssembly 文本格式][8] 文档中的教程之一。如果你想了解更多关于 WebAssembly 的知识以及它的工作原理,可以看看这些文档。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/hello-world-webassembly + +作者:[Stephan Avenwedde][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/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/helloworld_bread_lead.jpeg?itok=1r8Uu7gk (Hello World inked on bread) +[2]: https://developer.mozilla.org/en-US/docs/WebAssembly#browser_compatibility +[3]: https://github.com/webassembly/wabt +[4]: https://opensource.com/sites/default/files/uploads/firefox_setting.png (Firefox setting) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://www.mozilla.org/en-US/security/advisories/mfsa2019-21/#CVE-2019-11730 +[7]: https://opensource.com/sites/default/files/uploads/debugger_output.png (Debugger output) +[8]: https://developer.mozilla.org/en-US/docs/WebAssembly/Understanding_the_text_format diff --git a/published/202103/20210316 Kooha is a Nascent Screen Recorder for GNOME With Wayland Support.md b/published/202103/20210316 Kooha is a Nascent Screen Recorder for GNOME With Wayland Support.md new file mode 100644 index 0000000000..20cd761dd8 --- /dev/null +++ b/published/202103/20210316 Kooha is a Nascent Screen Recorder for GNOME With Wayland Support.md @@ -0,0 +1,106 @@ +[#]: subject: (Kooha is a Nascent Screen Recorder for GNOME With Wayland Support) +[#]: via: (https://itsfoss.com/kooha-screen-recorder/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13227-1.html) + +Kooha:一款支持 Wayland 的新生 GNOME 屏幕录像机 +====== + +Linux 中没有一个 [像样的支持 Wayland 显示服务器的屏幕录制软件][1]。 + +如果你使用 Wayland 的话,[GNOME 内置的屏幕录像机][1] 可能是少有的(也是唯一的)支持的软件。但是那个屏幕录像机没有可视界面和你所期望的标准屏幕录像软件的功能。 + +值得庆幸的是,有一个新的应用正在开发中,它提供了比 GNOME 屏幕录像机更多一点的功能,并且在 Wayland 上也能正常工作。 + +### 遇见 Kooha:一个新的 GNOME 桌面屏幕录像机 + +![][2] + +[Kooha][3] 是一个处于开发初期阶段的应用,它可以在 GNOME 中使用,是用 GTK 和 PyGObject 构建的。事实上,它利用了与 GNOME 内置屏幕录像机相同的后端。 + +以下是 Kooha 的功能: + + * 录制整个屏幕或选定区域 + * 在 Wayland 和 Xorg 显示服务器上均可使用 + * 在视频里用麦克风记录音频 + * 包含或忽略鼠标指针的选项 + * 可以在开始录制前增加 5 秒或 10 秒的延迟 + * 支持 WebM 和 MKV 格式的录制 + * 允许更改默认保存位置 + * 支持一些键盘快捷键 + +### 我的 Kooha 体验 + +![][4] + +它的开发者 Dave Patrick 联系了我,由于我急需一款好用的屏幕录像机,所以我马上就去试用了。 + +目前,[Kooha 只能通过 Flatpak 安装][5]。我安装了 Flatpak,当我试着使用时,它什么都没有记录。我和 Dave 进行了快速的邮件讨论,他告诉我这是由于 [Ubuntu 20.10 中 GNOME 屏幕录像机的 bug][6]。 + +你可以想象我对支持 Wayland 的屏幕录像机的绝望,我 [将我的 Ubuntu 升级到 21.04 测试版][7]。 + +在 21.04 中,可以屏幕录像,但仍然无法录制麦克风的音频。 + +我注意到了另外几件无法按照我的喜好顺利进行的事情。 + +例如,在录制时,计时器在屏幕上仍然可见,并且包含在录像中。我不会希望在视频教程中出现这种情况。我想你也不会喜欢看到这些吧。 + +![][8] + +另外就是关于多显示器的支持。没有专门选择某一个屏幕的选项。我连接了两个外部显示器,默认情况下,它录制所有三个显示器。可以使用设置捕捉区域,但精确拖动屏幕区域是一项耗时的任务。 + +它也没有 [Kazam][9] 或其他传统屏幕录像机中有的设置帧率或者编码的选项。 + +### 在 Linux 上安装 Kooha(如果你使用 GNOME) + +请确保在你的 Linux 发行版上启用 Flatpak 支持。目前它只适用于 GNOME,所以请检查你使用的桌面环境。 + +使用此命令将 Flathub 添加到你的 Flatpak 仓库列表中: + +``` +flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo +``` + +然后用这个命令来安装: + +``` +flatpak install flathub io.github.seadve.Kooha +``` + +你可以通过菜单或使用这个命令来运行它: + +``` +flatpak run io.github.seadve.Kooha +``` + +### 总结 + +Kooha 并不完美,但考虑到 Wayland 领域的巨大空白,我希望开发者努力修复这些问题并增加更多的功能。考虑到 [Ubuntu 21.04 将默认切换到 Wayland][10],以及其他一些流行的发行版如 Fedora 和 openSUSE 已经默认使用 Wayland,这一点很重要。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kooha-screen-recorder/ + +作者:[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/gnome-screen-recorder/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/kooha-screen-recorder.png?resize=800%2C450&ssl=1 +[3]: https://github.com/SeaDve/Kooha +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/kooha.png?resize=797%2C364&ssl=1 +[5]: https://flathub.org/apps/details/io.github.seadve.Kooha +[6]: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1901391 +[7]: https://itsfoss.com/upgrade-ubuntu-beta/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/kooha-recording.jpg?resize=800%2C636&ssl=1 +[9]: https://itsfoss.com/kazam-screen-recorder/ +[10]: https://news.itsfoss.com/ubuntu-21-04-wayland/ diff --git a/published/202103/20210317 Use gdu for a Faster Disk Usage Checking in Linux Terminal.md b/published/202103/20210317 Use gdu for a Faster Disk Usage Checking in Linux Terminal.md new file mode 100644 index 0000000000..81b216a7ab --- /dev/null +++ b/published/202103/20210317 Use gdu for a Faster Disk Usage Checking in Linux Terminal.md @@ -0,0 +1,105 @@ +[#]: subject: (Use gdu for a Faster Disk Usage Checking in Linux Terminal) +[#]: via: (https://itsfoss.com/gdu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13234-1.html) + +使用 gdu 进行更快的磁盘使用情况检查 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/24/233818dkfvi4fviiysn8o9.jpg) + +在 Linux 终端中有两种常用的 [检查磁盘使用情况的方法][1]:`du` 命令和 `df` 命令。[du 命令更多的是用来检查目录的使用空间][2],`df` 命令则是提供文件系统级别的磁盘使用情况。 + +还有更友好的 [用 GNOME “磁盘” 等图形工具在 Linux 中查看磁盘使用情况的方法][3]。如果局限于终端,你可以使用像 [ncdu][5] 这样的 [TUI][4] 工具,以一种图形化的方式获取磁盘使用信息。 + +### gdu: 在 Linux 终端中检查磁盘使用情况 + +[gdu][6] 就是这样一个用 Go 编写的工具(因此是 gdu 中的 “g”)。gdu 开发者的 [基准测试][7] 表明,它的磁盘使用情况检查速度相当快,特别是在 SSD 上。事实上,gdu 主要是针对 SSD 的,尽管它也可以在 HDD 上工作。 + +如果你在使用 `gdu` 命令时没有使用任何选项,它就会显示你当前所在目录的磁盘使用情况。 + +![][8] + +由于它具有文本用户界面(TUI),你可以使用箭头浏览目录和磁盘。你也可以按文件名或大小对结果进行排序。 + +你可以用它做到: + + * 向上箭头或 `k` 键将光标向上移动 + * 向下箭头或 `j` 键将光标向下移动 + * 回车选择目录/设备 + * 左箭头或 `h` 键转到上级目录 + * 使用 `d` 键删除所选文件或目录 + * 使用 `n` 键按名称排序 + * 使用 `s` 键按大小排序 + * 使用 `c` 键按项目排序 + +你会注意到一些条目前的一些符号。这些符号有特定的意义。 + +![][9] + + * `!` 表示读取目录时发生错误。 + * `.` 表示在读取子目录时发生错误,大小可能不正确。 + * `@` 表示文件是一个符号链接或套接字。 + * `H` 表示文件已经被计数(硬链接)。 + * `e` 表示目录为空。 + +要查看所有挂载磁盘的磁盘利用率和可用空间,使用选项 `d`: + +``` +gdu -d +``` + +它在一屏中显示所有的细节: + +![][10] + +看起来是个方便的工具,对吧?让我们看看如何在你的 Linux 系统上安装它。 + +### 在 Linux 上安装 gdu + +gdu 是通过 [AUR][11] 提供给 Arch 和 Manjaro 用户的。我想,作为一个 Arch 用户,你应该知道如何使用 AUR。 + +它包含在即将到来的 Ubuntu 21.04 的 universe 仓库中,但有可能你现在还没有使用它。这种情况下,你可以使用 Snap 安装它,这可能看起来有很多条 `snap` 命令: + +``` +snap install gdu-disk-usage-analyzer +snap connect gdu-disk-usage-analyzer:mount-observe :mount-observe +snap connect gdu-disk-usage-analyzer:system-backup :system-backup +snap alias gdu-disk-usage-analyzer.gdu gdu +``` + +你也可以在其发布页面找到源代码: + +- [下载 gdu 的源代码][12] + +我更习惯于使用 `du` 和 `df` 命令,但我觉得一些 Linux 用户可能会喜欢 gdu。你是其中之一吗? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gdu/ + +作者:[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://linuxhandbook.com/df-command/ +[2]: https://linuxhandbook.com/find-directory-size-du-command/ +[3]: https://itsfoss.com/check-free-disk-space-linux/ +[4]: https://itsfoss.com/gui-cli-tui/ +[5]: https://dev.yorhel.nl/ncdu +[6]: https://github.com/dundee/gdu +[7]: https://github.com/dundee/gdu#benchmarks +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gdu-disk-utilization.png?resize=800%2C471&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/gdu-entry-symbols.png?resize=800%2C302&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/gdu-disk-utilization-for-all-drives.png?resize=800%2C471&ssl=1 +[11]: https://itsfoss.com/aur-arch-linux/ +[12]: https://github.com/dundee/gdu/releases diff --git a/published/202103/20210318 Practice using the Linux grep command.md b/published/202103/20210318 Practice using the Linux grep command.md new file mode 100644 index 0000000000..5fc2936d2e --- /dev/null +++ b/published/202103/20210318 Practice using the Linux grep command.md @@ -0,0 +1,193 @@ +[#]: subject: "Practice using the Linux grep command" +[#]: via: "https://opensource.com/article/21/3/grep-cheat-sheet" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13247-1.html" + +练习使用 Linux 的 grep 命令 +====== + +> 来学习下搜索文件中内容的基本操作,然后下载我们的备忘录作为 grep 和正则表达式的快速参考指南。 + +![](https://img.linux.net.cn/data/attachment/album/202103/29/093323yn6ilqvg6z6iizcf.jpg) + +`grep`(全局正则表达式打印Global Regular Expression Print)是由 Ken Thompson 早在 1974 年开发的基本 Unix 命令之一。在计算领域,它无处不在,通常被用作为动词(“搜索一个文件中的内容”)。如果你的谈话对象有极客精神,那么它也能在真实生活场景中使用。(例如,“我会 `grep` 我的内存条来回想起那些信息。”)简而言之,`grep` 是一种用特定的字符模式来搜索文件中内容的方式。如果你感觉这听起来像是文字处理器或文本编辑器的现代 Find 功能,那么你就已经在计算行业感受到了 `grep` 的影响。 + +`grep` 绝不是被现代技术抛弃的远古命令,它的强大体现在两个方面: + + * `grep` 可以在终端操作数据流,因此你可以把它嵌入到复杂的处理中。你不仅可以在一个文本文件中*查找*文字,还可以提取文字后把它发给另一个命令。 + * `grep` 使用正则表达式来提供灵活的搜索能力。 + +虽然需要一些练习,但学习 `grep` 命令还是很容易的。本文会介绍一些我认为 `grep` 最有用的功能。 + +- 下载我们免费的 [grep 备忘录][2] + +### 安装 grep + +Linux 默认安装了 `grep`。 + +MacOS 默认安装了 BSD 版的 `grep`。BSD 版的 `grep` 跟 GNU 版有一点不一样,因此如果你想完全参照本文,那么请使用 [Homebrew][3] 或 [MacPorts][4] 安装 GNU 版的 `grep`。 + +### 基础的 grep + +所有版本的 `grep` 基础语法都一样。入参是匹配模式和你需要搜索的文件。它会把匹配到的每一行输出到你的终端。 + +``` +$ grep gnu gpl-3.0.txt + along with this program. If not, see . +. +. +``` + +`grep` 命令默认大小写敏感,因此 “gnu”、“GNU”、“Gnu” 是三个不同的值。你可以使用 `--ignore-case` 选项来忽略大小写。 + +``` +$ grep --ignore-case gnu gpl-3.0.txt + GNU GENERAL PUBLIC LICENSE + The GNU General Public License is a free, copyleft license for +the GNU General Public License is intended to guarantee your freedom to +GNU General Public License for most of our software; it applies also to +[...16 more results...] +. +. +``` + +你也可以通过 `--invert-match` 选项来输出所有没有匹配到的行: + +``` +$ grep --invert-match \ +--ignore-case gnu gpl-3.0.txt + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. +[...648 lines...] +Public License instead of this License. But first, please read +``` + +### 管道 + +能搜索文件中的文本内容是很有用的,但是 [POSIX][8] 的真正强大之处是可以通过“管道”来连接多条命令。我发现我使用 `grep` 最好的方式是把它与其他工具如 `cut`、`tr` 或 [curl][9] 联合使用。 + +假如现在有一个文件,文件中每一行是我想要下载的技术论文。我可以打开文件手动点击每一个链接,然后点击火狐浏览器的选项把每一个文件保存到我的硬盘,但是需要点击多次且耗费很长时间。而我还可以搜索文件中的链接,用 `--only-matching` 选项*只*打印出匹配到的字符串。 + +``` +$ grep --only-matching http\:\/\/.*pdf example.html +http://example.com/linux_whitepaper.pdf +http://example.com/bsd_whitepaper.pdf +http://example.com/important_security_topic.pdf +``` + +输出是一系列的 URL,每行一个。而这与 Bash 处理数据的方式完美契合,因此我不再把 URL 打印到终端,而是把它们通过管道传给 `curl`: + +``` +$ grep --only-matching http\:\/\/.*pdf \ +example.html | curl --remote-name +``` + +这条命令可以下载每一个文件,然后以各自的远程文件名命名保存在我的硬盘上。 + +这个例子中我的搜索模式可能很晦涩。那是因为它用的是正则表达式,一种在大量文本中进行模糊搜索时非常有用的”通配符“语言。 + +### 正则表达式 + +没有人会觉得正则表达式regular expression(简称 “regex”)很简单。然而,我发现它的名声往往比它应得的要差。诚然,很多人在使用正则表达式时“过于炫耀聪明”,直到它变得难以阅读,大而全,以至于复杂得换行才好理解,但是你不必过度使用正则。这里简单介绍一下我使用正则表达式的方式。 + +首先,创建一个名为 `example.txt` 的文件,输入以下内容: + +``` +Albania +Algeria +Canada +0 +1 +3 +11 +``` + +最基础的元素是不起眼的 `.` 字符。它表示一个字符。 + +``` +$ grep Can.da example.txt +Canada +``` + +模式 `Can.da` 能成功匹配到 `Canada` 是因为 `.` 字符表示任意*一个*字符。 + +可以使用下面这些符号来使 `.` 通配符表示多个字符: + + * `?` 匹配前面的模式零次或一次 + * `*` 匹配前面的模式零次或多次 + * `+` 匹配前面的模式一次或多次 + * `{4}` 匹配前面的模式 4 次(或是你在括号中写的其他次数) + +了解了这些知识后,你可以用你认为有意思的所有模式来在 `example.txt` 中做练习。可能有些会成功,有些不会成功。重要的是你要去分析结果,这样你才会知道原因。 + +例如,下面的命令匹配不到任何国家: + +``` +$ grep A.a example.txt +``` + +因为 `.` 字符只能匹配一个字符,除非你增加匹配次数。使用 `*` 字符,告诉 `grep` 匹配一个字符零次或者必要的任意多次直到单词末尾。因为你知道你要处理的内容,因此在本例中*零次*是没有必要的。在这个列表中一定没有单个字母的国家。因此,你可以用 `+` 来匹配一个字符至少一次且任意多次直到单词末尾: + +``` +$ grep A.+a example.txt +Albania +Algeria +``` + +你可以使用方括号来提供一系列的字母: + +``` +$ grep [A,C].+a example.txt +Albania +Algeria +Canada +``` + +也可以用来匹配数字。结果可能会震惊你: + +``` +$ grep [1-9] example.txt +1 +3 +11 +``` + +看到 11 出现在搜索数字 1 到 9 的结果中,你惊讶吗? + +如果把 13 加到搜索列表中,会出现什么结果呢? + +这些数字之所以会被匹配到,是因为它们包含 1,而 1 在要匹配的数字中。 + +你可以发现,正则表达式有时会令人费解,但是通过体验和练习,你可以熟练掌握它,用它来提高你搜索数据的能力。 + +### 下载备忘录 + +`grep` 命令还有很多文章中没有列出的选项。有用来更好地展示匹配结果、列出文件、列出匹配到的行号、通过打印匹配到的行周围的内容来显示上下文的选项,等等。如果你在学习 `grep`,或者你经常使用它并且通过查阅它的`帮助`页面来查看选项,那么你可以下载我们的备忘录。这个备忘录使用短选项(例如,使用 `-v`,而不是 `--invert-matching`)来帮助你更好地熟悉 `grep`。它还有一部分正则表达式可以帮你记住用途最广的正则表达式代码。 [现在就下载 grep 备忘录!][2] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/grep-cheat-sheet + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[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/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC "Hand putting a Linux file folder into a drawer" +[2]: https://opensource.com/downloads/grep-cheat-sheet +[3]: https://opensource.com/article/20/6/homebrew-mac +[4]: https://opensource.com/article/20/11/macports +[5]: http://www.gnu.org/licenses/\> +[6]: http://www.gnu.org/philosophy/why-not-lgpl.html\> +[7]: http://fsf.org/\> +[8]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[9]: https://opensource.com/downloads/curl-command-cheat-sheet diff --git a/published/202103/20210319 4 cool new projects to try in Copr for March 2021.md b/published/202103/20210319 4 cool new projects to try in Copr for March 2021.md new file mode 100644 index 0000000000..90754cca83 --- /dev/null +++ b/published/202103/20210319 4 cool new projects to try in Copr for March 2021.md @@ -0,0 +1,143 @@ +[#]: subject: (4 cool new projects to try in Copr for March 2021) +[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-march-2021/) +[#]: author: (Jakub Kadlčík https://fedoramagazine.org/author/frostyx/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13243-1.html) + +COPR 仓库中 4 个很酷的新项目(2021.03) +====== + +![][1] + +> COPR 是个人软件仓库 [集合][2],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。 + +本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 [COPR 用户文档][3]。 + +### Ytfzf + +[Ytfzf][5] 是一个简单的命令行工具,用于搜索和观看 YouTube 视频。它提供了围绕模糊查找程序 [fzf][6] 构建的快速直观的界面。它使用 [youtube-dl][7] 来下载选定的视频,并打开外部视频播放器来观看。由于这种方式,`ytfzf` 比使用浏览器观看 YouTube 资源占用要少得多。它支持缩略图(通过 [ueberzug][8])、历史记录保存、多个视频排队或下载它们以供以后使用、频道订阅以及其他方便的功能。多亏了像 [dmenu][9] 或 [rofi][10] 这样的工具,它甚至可以在终端之外使用。 + +![][11] + +#### 安装说明 + +目前[仓库][13]为 Fedora 33 和 34 提供 Ytfzf。要安装它,请使用以下命令: + +``` +sudo dnf copr enable bhoman/ytfzf +sudo dnf install ytfzf +``` + +### Gemini 客户端 + +你有没有想过,如果万维网走的是一条完全不同的路线,不采用 CSS 和客户端脚本,你的互联网浏览体验会如何?[Gemini][15] 是 HTTPS 协议的现代替代品,尽管它并不打算取代 HTTPS 协议。[stenstorp/gemini][16] COPR 项目提供了各种客户端来浏览 Gemini _网站_,有 [Castor][17]、[Dragonstone][18]、[Kristall][19] 和 [Lagrange][20]。 + +[Gemini][21] 站点提供了一些使用该协议的主机列表。以下显示了使用 Castor 访问这个站点的情况: + +![][22] + +#### 安装说明 + +该 [仓库][16] 目前为 Fedora 32、33、34 和 Fedora Rawhide 提供 Gemini 客户端。EPEL 7 和 8,以及 CentOS Stream 也可使用。要安装浏览器,请从这里显示的安装命令中选择: + +``` +sudo dnf copr enable stenstorp/gemini + +sudo dnf install castor +sudo dnf install dragonstone +sudo dnf install kristall +sudo dnf install lagrange +``` + +### Ly + +[Ly][25] 是一个 Linux 和 BSD 的轻量级登录管理器。它有一个类似于 ncurses 的基于文本的用户界面。理论上,它应该支持所有的 X 桌面环境和窗口管理器(其中很多都 [经过测试][26])。Ly 还提供了基本的 Wayland 支持(Sway 也工作良好)。在配置的某个地方,有一个复活节彩蛋选项,可以在背景中启用著名的 [PSX DOOM fire][27] 动画,就其本身而言,值得一试。 + +![][28] + +#### 安装说明 + +该 [仓库][30] 目前为 Fedora 32、33 和 Fedora Rawhide 提供 Ly。要安装它,请使用以下命令: + +``` +sudo dnf copr enable dhalucario/ly +sudo dnf install ly +``` + +在将 Ly 设置为系统登录界面之前,请在终端中运行 `ly` 命令以确保其正常工作。然后关闭当前的登录管理器,启用 Ly。 + +``` +sudo systemctl disable gdm +sudo systemctl enable ly +``` + +最后,重启计算机,使其更改生效。 + +### AWS CLI v2 + +[AWS CLI v2][32] 带来基于社区反馈进行的稳健而有条理的演变,而不是对原有客户端的大规模重新设计。它引入了配置凭证的新机制,现在允许用户从 AWS 控制台中生成的 `.csv` 文件导入凭证。它还提供了对 AWS SSO 的支持。其他主要改进是服务端自动补全,以及交互式参数生成。一个新功能是交互式向导,它提供了更高层次的抽象,并结合多个 AWS API 调用来创建、更新或删除 AWS 资源。 + +![][33] + +#### 安装说明 + +该 [仓库][35] 目前为 Fedora Linux 32、33、34 和 Fedora Rawhide 提供 AWS CLI v2。要安装它,请使用以下命令: + +``` +sudo dnf copr enable spot/aws-cli-2 +sudo dnf install aws-cli-2 +``` + +自然地,访问 AWS 账户凭证是必要的。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-march-2021/ + +作者:[Jakub Kadlčík][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/frostyx/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/10/4-copr-945x400-1-816x345.jpg +[2]: https://copr.fedorainfracloud.org/ +[3]: https://docs.pagure.org/copr.copr/user_documentation.html +[4]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#droidcam +[5]: https://github.com/pystardust/ytfzf +[6]: https://github.com/junegunn/fzf +[7]: http://ytdl-org.github.io/youtube-dl/ +[8]: https://github.com/seebye/ueberzug +[9]: https://tools.suckless.org/dmenu/ +[10]: https://github.com/davatorium/rofi +[11]: https://fedoramagazine.org/wp-content/uploads/2021/03/ytfzf.png +[12]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#installation-instructions +[13]: https://copr.fedorainfracloud.org/coprs/bhoman/ytfzf/ +[14]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#gemini-clients +[15]: https://gemini.circumlunar.space/ +[16]: https://copr.fedorainfracloud.org/coprs/stenstorp/gemini/ +[17]: https://git.sr.ht/~julienxx/castor +[18]: https://gitlab.com/baschdel/dragonstone +[19]: https://kristall.random-projects.net/ +[20]: https://github.com/skyjake/lagrange +[21]: https://gemini.circumlunar.space/servers/ +[22]: https://fedoramagazine.org/wp-content/uploads/2021/03/gemini.png +[23]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#installation-instructions-1 +[24]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#ly +[25]: https://github.com/nullgemm/ly +[26]: https://github.com/nullgemm/ly#support +[27]: https://fabiensanglard.net/doom_fire_psx/index.html +[28]: https://fedoramagazine.org/wp-content/uploads/2021/03/ly.png +[29]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#installation-instructions-2 +[30]: https://copr.fedorainfracloud.org/coprs/dhalucario/ly/ +[31]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#aws-cli-v2 +[32]: https://aws.amazon.com/blogs/developer/aws-cli-v2-is-now-generally-available/ +[33]: https://fedoramagazine.org/wp-content/uploads/2021/03/aws-cli-2.png +[34]: https://github.com/FrostyX/fedora-magazine/blob/main/2021-march.md#installation-instructions-3 +[35]: https://copr.fedorainfracloud.org/coprs/spot/aws-cli-2/ diff --git a/published/202103/20210319 Top 10 Terminal Emulators for Linux (With Extra Features or Amazing Looks).md b/published/202103/20210319 Top 10 Terminal Emulators for Linux (With Extra Features or Amazing Looks).md new file mode 100644 index 0000000000..eaeeccfab7 --- /dev/null +++ b/published/202103/20210319 Top 10 Terminal Emulators for Linux (With Extra Features or Amazing Looks).md @@ -0,0 +1,308 @@ +[#]: subject: (Top 10 Terminal Emulators for Linux \(With Extra Features or Amazing Looks\)) +[#]: via: (https://itsfoss.com/linux-terminal-emulators/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13221-1.html) + +10 个常见的 Linux 终端仿真器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202103/21/073043q4j4o6hr33b595j4.jpg) + +默认情况下,所有的 Linux 发行版都已经预装了“终端terminal”应用程序或“终端仿真器terminal emulator”(这才是正确的技术术语)。当然,根据桌面环境的不同,它的外观和感觉会有所不同。 + +Linux 的特点是,你可以不用局限于你的发行版所提供的东西,你可以用你所选择的替代应用程序。终端也不例外。有几个提供了独特功能的终端仿真器令人印象深刻,可以获得更好的用户体验或更好的外观。 + +在这里,我将整理一个有趣的终端应用程序的列表,你可以在你的 Linux 发行版上尝试它们。 + +### 值得赞叹的 Linux 终端仿真器 + +此列表没有特别的排名顺序,我会先列出一些有趣的,然后是一些最流行的终端仿真器。此外,我还强调了每个提到的终端仿真器的主要功能,你可以选择你喜欢的终端仿真器。 + +#### 1、Terminator + +![][1] + +主要亮点: + +* 可以在一个窗口中使用多个 GNOME 终端 + +[Terminator][2] 是一款非常流行的终端仿真器,目前仍在维护中(从 Launchpad 移到了 GitHub)。 + +它基本上是在一个窗口中为你提供了多个 GNOME 终端。在它的帮助下,你可以轻松地对终端窗口进行分组和重组。你可能会觉得这像是在使用平铺窗口管理器,不过有一些限制。 + +##### 如何安装 Terminator? + +对于基于 Ubuntu 的发行版,你只需在终端输入以下命令: + +``` +sudo apt install terminator +``` + +你应该可以在大多数 Linux 发行版的默认仓库中找到它。但是,如果你需要安装帮助,请访问它的 [GitHub 页面][3]。 + +#### 2、Guake 终端 + +![][4] + +主要亮点: + + * 专为在 GNOME 上快速访问终端而设计 + * 工作速度快,不需要大量的系统资源 + * 访问的快捷键 + +[Guake][6] 终端最初的灵感来自于一款 FPS 游戏 Quake。与其他一些终端仿真器不同的是,它的工作方式是覆盖在其他的活动窗口上。 + +你所要做的就是使用快捷键(`F12`)召唤该仿真器,它就会从顶部出现。你可以自定义该仿真器的宽度或位置,但大多数用户使用默认设置就可以了。 + +它不仅仅是一个方便的终端仿真器,还提供了大量的功能,比如能够恢复标签、拥有多个标签、对每个标签进行颜色编码等等。你可以查看我关于 [Guake 的单独文章][5] 来了解更多。 + +##### 如何安装 Guake 终端? + +Guake 在大多数 Linux 发行版的默认仓库中都可以找到,你可以参考它的 [官方安装说明][7]。 + +如果你使用的是基于 Debian 的发行版,只需输入以下命令: + +``` +sudo apt install guake +``` + +#### 3、Tilix 终端 + +![][8] + +主要亮点: + + * 平铺功能 + * 支持拖放 + * 下拉式 Quake 模式 + +[Tilix][10] 终端提供了与 Guake 类似的下拉式体验 —— 但它允许你在平铺模式下拥有多个终端窗口。 + +如果你的 Linux 发行版中默认没有平铺窗口,而且你有一个大屏幕,那么这个功能就特别有用,你可以在多个终端窗口上工作,而不需要在不同的工作空间之间切换。 + +如果你想了解更多关于它的信息,我们之前已经 [单独介绍][9] 过了。 + +##### 如何安装 Tilix? + +Tilix 在大多数发行版的默认仓库中都有。如果你使用的是基于 Ubuntu 的发行版,只需输入: + +``` +sudo apt install tilix +``` + +#### 4、Hyper + +![][13] + +主要亮点: + + * 基于 HTML/CSS/JS 的终端 + * 基于 Electron + * 跨平台 + * 丰富的配置选项 + +[Hyper][15] 是另一个有趣的终端仿真器,它建立在 Web 技术之上。它并没有提供独特的用户体验,但看起来很不一样,并提供了大量的自定义选项。 + +它还支持安装主题和插件来轻松定制终端的外观。你可以在他们的 [GitHub 页面][14] 中探索更多关于它的内容。 + +##### 如何安装 Hyper? + +Hyper 在默认的资源库中是不可用的。然而,你可以通过他们的 [官方网站][16] 找到 .deb 和 .rpm 包来安装。 + +如果你是新手,请阅读文章以获得 [使用 deb 文件][17] 和 [使用 rpm 文件][18] 的帮助。 + +#### 5、Tilda + +![][19] + +主要亮点: + + * 下拉式终端 + * 搜索栏整合 + +[Tilda][20] 是另一款基于 GTK 的下拉式终端仿真器。与其他一些不同的是,它提供了一个你可以切换的集成搜索栏,还可以让你自定义很多东西。 + +你还可以设置热键来快速访问或执行某个动作。从功能上来说,它是相当令人印象深刻的。然而,在视觉上,我不喜欢覆盖的行为,而且它也不支持拖放。不过你可以试一试。 + +##### 如何安装 Tilda? + +对于基于 Ubuntu 的发行版,你可以简单地键入: + +``` +sudo apt install tilda +``` + +你可以参考它的 [GitHub 页面][20],以了解其他发行版的安装说明。 + +#### 6、eDEX-UI + +![][21] + +主要亮点: + + * 科幻感的外观 + * 跨平台 + * 自定义主题选项 + * 支持多个终端标签 + +如果你不是特别想找一款可以帮助你更快的完成工作的终端仿真器,那么 [eDEX-UI][23] 绝对是你应该尝试的。 + +对于科幻迷和只想让自己的终端看起来独特的用户来说,这绝对是一款漂亮的终端仿真器。如果你不知道,它的灵感很大程度上来自于电影《创:战纪》。 + +不仅仅是设计或界面,总的来说,它为你提供了独特的用户体验,你会喜欢的。它还可以让你 [自定义终端][12]。如果你打算尝试的话,它确实需要大量的系统资源。 + +你不妨看看我们 [专门介绍 eDEX-UI][22] 的文章,了解更多关于它的信息和安装步骤。 + +##### 如何安装 eDEX-UI? + +你可以在一些包含 [AUR][24] 的仓库中找到它。无论是哪种情况,你都可以从它的 [GitHub 发布部分][25] 中抓取一个适用于你的 Linux 发行版的软件包(或 AppImage 文件)。 + +#### 7、Cool Retro Terminal + +![][26] + +主要亮点: + + * 复古主题 + * 动画/效果调整 + +[Cool Retro Terminal][27] 是一款独特的终端仿真器,它为你提供了一个复古的阴极射线管显示器的外观。 + +如果你正在寻找一些额外功能的终端仿真器,这可能会让你失望。然而,令人印象深刻的是,它在资源上相当轻盈,并允许你自定义颜色、效果和字体。 + +##### 如何安装 Cool Retro Terminal? + +你可以在其 [GitHub 页面][27] 中找到所有主流 Linux 发行版的安装说明。对于基于 Ubuntu 的发行版,你可以在终端中输入以下内容: + +``` +sudo apt install cool-retro-term +``` + +#### 8、Alacritty + +![][28] + +主要亮点: + + * 跨平台 + * 选项丰富,重点是整合。 + +[Alacritty][29] 是一款有趣的开源跨平台终端仿真器。尽管它被认为是处于“测试”阶段的东西,但它仍然可以工作。 + +它的目标是为你提供广泛的配置选项,同时考虑到性能。例如,使用键盘点击 URL、将文本复制到剪贴板、使用 “Vi” 模式进行搜索等功能可能会吸引你去尝试。 + +你可以探索它的 [GitHub 页面][29] 了解更多信息。 + +##### 如何安装 Alacritty? + +官方 GitHub 页面上说可以使用包管理器安装 Alacritty,但我在 Linux Mint 20.1 的默认仓库或 [synaptic 包管理器][30] 中找不到它。 + +如果你想尝试的话,可以按照 [安装说明][31] 来手动设置。 + +#### 9、Konsole + +![][32] + +主要亮点: + + * KDE 的终端 + * 轻巧且可定制 + +如果你不是新手,这个可能不用介绍了。[Konsole][33] 是 KDE 桌面环境的默认终端仿真器。 + +不仅如此,它还集成了很多 KDE 应用。即使你使用的是其他的桌面环境,你也可以试试 Konsole。它是一个轻量级的终端仿真器,拥有众多的功能。 + +你可以拥有多个标签和多个分组窗口。以及改变终端仿真器的外观和感觉的大量的自定义选项。 + +##### 如何安装 Konsole? + +对于基于 Ubuntu 的发行版和大多数其他发行版,你可以使用默认的版本库来安装它。对于基于 Debian 的发行版,你只需要在终端中输入以下内容: + +``` +sudo apt install konsole +``` + +#### 10、GNOME 终端 + +![][34] + +主要亮点: + + * GNOME 的终端 + * 简单但可定制 + +如果你使用的是任何基于 Ubuntu 的 GNOME 发行版,它已经是天生的了,它可能不像 Konsole 那样可以自定义,但它可以让你轻松地配置终端的大部分重要方面。它可能不像 Konsole 那样可以自定义(取决于你在做什么),但它可以让你轻松配置终端的大部分重要方面。 + +总的来说,它提供了良好的用户体验和易于使用的界面,并提供了必要的功能。 + +如果你好奇的话,我还有一篇 [自定义你的 GNOME 终端][12] 的教程。 + +##### 如何安装 GNOME 终端? + +如果你没有使用 GNOME 桌面,但又想尝试一下,你可以通过默认的软件仓库轻松安装它。 + +对于基于 Debian 的发行版,以下是你需要在终端中输入的内容: + +``` +sudo apt install gnome-terminal +``` + +### 总结 + +有好几个终端仿真器。如果你正在寻找不同的用户体验,你可以尝试任何你喜欢的东西。然而,如果你的目标是一个稳定的和富有成效的体验,你需要测试一下,然后才能依靠它们。 + +对于大多数用户来说,默认的终端仿真器应该足够好用了。但是,如果你正在寻找快速访问(Quake 模式)、平铺功能或在一个终端中的多个窗口,请试试上述选择。 + +你最喜欢的 Linux 终端仿真器是什么?我有没有错过列出你最喜欢的?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-terminal-emulators/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/terminator-terminal.jpg?resize=800%2C436&ssl=1 +[2]: https://gnome-terminator.org +[3]: https://github.com/gnome-terminator/terminator +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/guake-terminal-2.png?resize=800%2C432&ssl=1 +[5]: https://itsfoss.com/guake-terminal/ +[6]: https://github.com/Guake/guake +[7]: https://guake.readthedocs.io/en/latest/user/installing.html#system-wide-installation +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/tilix-screenshot.png?resize=800%2C460&ssl=1 +[9]: https://itsfoss.com/tilix-terminal-emulator/ +[10]: https://gnunn1.github.io/tilix-web/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/linux-terminal-customization.jpg?fit=800%2C450&ssl=1 +[12]: https://itsfoss.com/customize-linux-terminal/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/hyper-screenshot.png?resize=800%2C527&ssl=1 +[14]: https://github.com/vercel/hyper +[15]: https://hyper.is/ +[16]: https://hyper.is/#installation +[17]: https://itsfoss.com/install-deb-files-ubuntu/ +[18]: https://itsfoss.com/install-rpm-files-fedora/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/tilda-terminal.jpg?resize=800%2C427&ssl=1 +[20]: https://github.com/lanoxx/tilda +[21]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/edex-ui-screenshot.png?resize=800%2C450&ssl=1 +[22]: https://itsfoss.com/edex-ui-sci-fi-terminal/ +[23]: https://github.com/GitSquared/edex-ui +[24]: https://itsfoss.com/aur-arch-linux/ +[25]: https://github.com/GitSquared/edex-ui/releases +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2015/10/cool-retro-term-1.jpg?resize=799%2C450&ssl=1 +[27]: https://github.com/Swordfish90/cool-retro-term +[28]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/alacritty-screenshot.png?resize=800%2C496&ssl=1 +[29]: https://github.com/alacritty/alacritty +[30]: https://itsfoss.com/synaptic-package-manager/ +[31]: https://github.com/alacritty/alacritty/blob/master/INSTALL.md#debianubuntu +[32]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/konsole-screenshot.png?resize=800%2C512&ssl=1 +[33]: https://konsole.kde.org/ +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/default-terminal.jpg?resize=773%2C493&ssl=1 diff --git a/published/202103/20210322 5 everyday sysadmin tasks to automate with Ansible.md b/published/202103/20210322 5 everyday sysadmin tasks to automate with Ansible.md new file mode 100644 index 0000000000..6f12202b57 --- /dev/null +++ b/published/202103/20210322 5 everyday sysadmin tasks to automate with Ansible.md @@ -0,0 +1,300 @@ +[#]: subject: (5 everyday sysadmin tasks to automate with Ansible) +[#]: via: (https://opensource.com/article/21/3/ansible-sysadmin) +[#]: author: (Mike Calizo https://opensource.com/users/mcalizo) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13256-1.html) + +用 Ansible 自动化系统管理员的 5 个日常任务 +====== + +> 通过使用 Ansible 自动执行可重复的日常任务,提高工作效率并避免错误。 + +![](https://img.linux.net.cn/data/attachment/album/202103/31/233904oo7q68eo2njfmf8o.jpg) + +如果你讨厌执行重复性的任务,那么我有一个提议给你,去学习 [Ansible][2]! + +Ansible 是一个工具,它可以帮助你更轻松、更快速地完成日常任务,这样你就可以更有效地利用时间,比如学习重要的新技术。对于系统管理员来说,它是一个很好的工具,因为它可以帮助你实现标准化,并在日常活动中进行协作,包括: + + 1. 安装、配置和调配服务器和应用程序; + 2. 定期更新和升级系统; + 3. 监测、减轻和排除问题。 + +通常,许多这些基本的日常任务都需要手动步骤,而根据个人的技能的不同,可能会造成不一致并导致配置发生漂移。这在小规模的实施中可能是可以接受的,因为你管理一台服务器,并且知道自己在做什么。但当你管理数百或数千台服务器时会发生什么? + +如果不小心,这些手动的、可重复的任务可能会因为人为的错误而造成延误和问题,而这些错误可能会影响你及你的组织的声誉。 + +这就是自动化的价值所在。而 [Ansible][3] 是自动化这些可重复的日常任务的完美工具。 + +自动化的一些原因是: + + 1. 你想要一个一致和稳定的环境。 + 2. 你想要促进标准化。 + 3. 你希望减少停机时间,减少严重事故案例,以便可以享受生活。 + 4. 你想喝杯啤酒,而不是排除故障问题! + +本文提供了一些系统管理员可以使用 Ansible 自动化的日常任务的例子。我把本文中的剧本和角色放到了 GitHub 上的 [系统管理员任务仓库][4] 中,以方便你使用它们。 + +这些剧本的结构是这样的(我的注释前面有 `==>`)。 + +``` +[root@homebase 6_sysadmin_tasks]# tree -L 2 +. +├── ansible.cfg ==> 负责控制 Ansible 行为的配置文件 +├── ansible.log +├── inventory +│ ├── group_vars +│ ├── hosts ==> 包含我的目标服务器列表的清单文件 +│ └── host_vars +├── LICENSE +├── playbooks ==> 包含我们将在本文中使用的剧本的目录 +│ ├── c_logs.yml +│ ├── c_stats.yml +│ ├── c_uptime.yml +│ ├── inventory +│ ├── r_cron.yml +│ ├── r_install.yml +│ └── r_script.yml +├── README.md +├── roles ==> 包含我们将在本文中使用的角色的目录 +│ ├── check_logs +│ ├── check_stats +│ ├── check_uptime +│ ├── install_cron +│ ├── install_tool +│ └── run_scr +└── templates ==> 包含 jinja 模板的目录 + ├── cron_output.txt.j2 + ├── sar.txt.j2 + └── scr_output.txt.j2 +``` + +清单类似这样的: + +``` +[root@homebase 6_sysadmin_tasks]# cat inventory/hosts +[rhel8] +master ansible_ssh_host=192.168.1.12 +workernode1 ansible_ssh_host=192.168.1.15 + +[rhel8:vars] +ansible_user=ansible ==> 请用你的 ansible 用户名更新它 +``` + +这里有五个你可以用 Ansible 自动完成的日常系统管理任务。 + +### 1、检查服务器的正常运行时间 + +你需要确保你的服务器一直处于正常运行状态。机构会拥有企业监控工具来监控服务器和应用程序的正常运行时间,但自动监控工具时常会出现故障,你需要登录进去验证一台服务器的状态。手动验证每台服务器的正常运行时间需要花费大量的时间。你的服务器越多,你需要花费的时间就越长。但如果有了自动化,这种验证可以在几分钟内完成。 + +使用 [check_uptime][5] 角色和 `c_uptime.yml` 剧本: + +``` +[root@homebase 6_sysadmin_tasks]# ansible-playbook -i inventory/hosts playbooks/c_uptime.yml -k +SSH password: +PLAY [Check Uptime for Servers] **************************************************************************************************************************************** +TASK [check_uptime : Capture timestamp] ************************************************************************************************* +. +截断... +. +PLAY RECAP ************************************************************************************************************************************************************* +master : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +[root@homebase 6_sysadmin_tasks]# +``` + +剧本的输出是这样的: + +``` +[root@homebase 6_sysadmin_tasks]# cat /var/tmp/uptime-master-20210221004417.txt +----------------------------------------------------- + Uptime for master +----------------------------------------------------- + 00:44:17 up 44 min, 2 users, load average: 0.01, 0.09, 0.09 +----------------------------------------------------- +[root@homebase 6_sysadmin_tasks]# cat /var/tmp/uptime-workernode1-20210221184525.txt +----------------------------------------------------- + Uptime for workernode1 +----------------------------------------------------- + 18:45:26 up 44 min, 2 users, load average: 0.01, 0.01, 0.00 +----------------------------------------------------- +``` + +使用 Ansible,你可以用较少的努力以人类可读的格式获得多个服务器的状态,[Jinja 模板][6] 允许你根据自己的需要调整输出。通过更多的自动化,你可以按计划运行,并通过电子邮件发送输出,以达到报告的目的。 + +### 2、配置额外的 cron 作业 + +你需要根据基础设施和应用需求定期更新服务器的计划作业。这似乎是一项微不足道的工作,但必须正确且持续地完成。想象一下,如果你对数百台生产服务器进行手动操作,这需要花费多少时间。如果做错了,就会影响生产应用程序,如果计划的作业重叠,就会导致应用程序停机或影响服务器性能。 + +使用 [install_cron][7] 角色和 `r_cron.yml` 剧本: + +``` +[root@homebase 6_sysadmin_tasks]# ansible-playbook -i inventory/hosts playbooks/r_cron.yml -k +SSH password: +PLAY [Install additional cron jobs for root] *************************************************************************************************************************** +. +截断... +. +PLAY RECAP ************************************************************************************************************************************************************* +master : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +验证剧本的结果: + +``` +[root@homebase 6_sysadmin_tasks]# ansible -i inventory/hosts all -m shell -a "crontab -l" -k +SSH password: +master | CHANGED | rc=0 >> +1 2 3 4 5 /usr/bin/ls /tmp +#Ansible: Iotop Monitoring +0 5,2 * * * /usr/sbin/iotop -b -n 1 >> /var/tmp/iotop.log 2>> /var/tmp/iotop.err +workernode1 | CHANGED | rc=0 >> +1 2 3 4 5 /usr/bin/ls /tmp +#Ansible: Iotop Monitoring +0 5,2 * * * /usr/sbin/iotop -b -n 1 >> /var/tmp/iotop.log 2>> /var/tmp/iotop.err +``` + +使用 Ansible,你可以以快速和一致的方式更新所有服务器上的 crontab 条目。你还可以使用一个简单的点对点 Ansible 命令来报告更新后的 crontab 的状态,以验证最近应用的变化。 + +### 3、收集服务器统计和 sars + +在常规的故障排除过程中,为了诊断服务器性能或应用程序问题,你需要收集系统活动报告system activity reports(sars)和服务器统计。在大多数情况下,服务器日志包含非常重要的信息,开发人员或运维团队需要这些信息来帮助解决影响整个环境的具体问题。 + +安全团队在进行调查时非常特别,大多数时候,他们希望查看多个服务器的日志。你需要找到一种简单的方法来收集这些文档。如果你能把收集任务委托给他们就更好了。 + +通过 [check_stats][8] 角色和 `c_stats.yml` 剧本来完成这个任务: + +``` +$ ansible-playbook -i inventory/hosts playbooks/c_stats.yml + +PLAY [Check Stats/sar for Servers] *********************************************************************************************************************************** + +TASK [check_stats : Get current date time] *************************************************************************************************************************** +changed: [master] +changed: [workernode1] +. +截断... +. +PLAY RECAP *********************************************************************************************************************************************************** +master : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +输出看起来像这样: + +``` +$ cat /tmp/sar-workernode1-20210221214056.txt +----------------------------------------------------- + sar output for workernode1 +----------------------------------------------------- +Linux 4.18.0-193.el8.x86_64 (node1) 21/02/21 _x86_64_ (2 CPU) +21:39:30 LINUX RESTART (2 CPU) +----------------------------------------------------- +``` + +### 4、收集服务器日志 + +除了收集服务器统计和 sars 信息,你还需要不时地收集日志,尤其是当你需要帮助调查问题时。 + +通过 [check_logs][9] 角色和 `r_cron.yml` 剧本来实现: + +``` +$ ansible-playbook -i inventory/hosts playbooks/c_logs.yml -k +SSH password: + +PLAY [Check Logs for Servers] **************************************************************************************************************************************** +. +截断... +. +TASK [check_logs : Capture Timestamp] ******************************************************************************************************************************** +changed: [master] +changed: [workernode1] +PLAY RECAP *********************************************************************************************************************************************************** +master : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +为了确认输出,打开转储位置生成的文件。日志应该是这样的: + +``` +$ cat /tmp/logs-workernode1-20210221214758.txt | more +----------------------------------------------------- + Logs gathered: /var/log/messages for workernode1 +----------------------------------------------------- + +Feb 21 18:00:27 node1 kernel: Command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-193.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel +-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet +Feb 21 18:00:27 node1 kernel: Disabled fast string operations +Feb 21 18:00:27 node1 kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' +Feb 21 18:00:27 node1 kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' +Feb 21 18:00:27 node1 kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' +Feb 21 18:00:27 node1 kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256 +Feb 21 18:00:27 node1 kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'compacted' format. +``` + +### 5、安装或删除软件包和软件 + +你需要能够持续快速地在系统上安装和更新软件和软件包。缩短安装或更新软件包和软件所需的时间,可以避免服务器和应用程序不必要的停机时间。 + +通过 [install_tool][10] 角色和 `r_install.yml` 剧本来实现这一点: + +``` +$ ansible-playbook -i inventory/hosts playbooks/r_install.yml -k +SSH password: +PLAY [Install additional tools/packages] *********************************************************************************** + +TASK [install_tool : Install specified tools in the role vars] ************************************************************* +ok: [master] => (item=iotop) +ok: [workernode1] => (item=iotop) +ok: [workernode1] => (item=traceroute) +ok: [master] => (item=traceroute) + +PLAY RECAP ***************************************************************************************************************** +master : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +workernode1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +``` + +这个例子安装了在 vars 文件中定义的两个特定包和版本。使用 Ansible 自动化,你可以比手动安装更快地安装多个软件包或软件。你也可以使用 vars 文件来定义你要安装的软件包的版本。 + +``` +$ cat roles/install_tool/vars/main.yml +--- +# vars file for install_tool +ins_action: absent +package_list: +  - iotop-0.6-16.el8.noarch +  - traceroute +``` + +### 拥抱自动化 + +要成为一名有效率的系统管理员,你需要接受自动化来鼓励团队内部的标准化和协作。Ansible 使你能够在更少的时间内做更多的事情,这样你就可以将时间花在更令人兴奋的项目上,而不是做重复的任务,如管理你的事件和问题管理流程。 + +有了更多的空闲时间,你可以学习更多的知识,让自己可以迎接下一个职业机会的到来。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/ansible-sysadmin + +作者:[Mike Calizo][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/mcalizo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/gears_devops_learn_troubleshooting_lightbulb_tips_520.png?itok=HcN38NOk (Tips and gears turning) +[2]: https://www.ansible.com/ +[3]: https://opensource.com/tags/ansible +[4]: https://github.com/mikecali/6_sysadmin_tasks +[5]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/check_uptime +[6]: https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html +[7]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/install_cron +[8]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/check_stats +[9]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/check_logs +[10]: https://github.com/mikecali/6_sysadmin_tasks/tree/main/roles/install_tool diff --git a/published/202103/20210322 Why I use exa instead of ls on Linux.md b/published/202103/20210322 Why I use exa instead of ls on Linux.md new file mode 100644 index 0000000000..1015284fcc --- /dev/null +++ b/published/202103/20210322 Why I use exa instead of ls on Linux.md @@ -0,0 +1,100 @@ +[#]: subject: (Why I use exa instead of ls on Linux) +[#]: via: (https://opensource.com/article/21/3/replace-ls-exa) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13237-1.html) + +为什么我在 Linux 上使用 exa 而不是 ls? +====== + +> exa 是一个 Linux ls 命令的现代替代品。 + +![](https://img.linux.net.cn/data/attachment/album/202103/26/101726h008fn6tttn4g6gt.jpg) + +我们生活在一个繁忙的世界里,当我们需要查找文件和数据时,使用 `ls` 命令可以节省时间和精力。但如果不经过大量调整,默认的 `ls` 输出并不十分舒心。当有一个 exa 替代方案时,为什么要花时间眯着眼睛看黑白文字呢? + +[exa][2] 是一个常规 `ls` 命令的现代替代品,它让生活变得更轻松。这个工具是用 [Rust][3] 编写的,该语言以并行性和安全性而闻名。 + +### 安装 exa + +要安装 `exa`,请运行: + +``` +$ dnf install exa +``` + +### 探索 exa 的功能 + +`exa` 改进了 `ls` 文件列表,它提供了更多的功能和更好的默认值。它使用颜色来区分文件类型和元数据。它能识别符号链接、扩展属性和 Git。而且它体积小、速度快,只有一个二进制文件。 + +#### 跟踪文件 + +你可以使用 `exa` 来跟踪某个 Git 仓库中新增的文件。 + +![Tracking Git files with exa][4] + +#### 树形结构 + +这是 `exa` 的基本树形结构。`--level` 的值决定了列表的深度,这里设置为 2。如果你想列出更多的子目录和文件,请增加 `--level` 的值。 + +![exa's default tree structure][6] + +这个树包含了每个文件的很多元数据。 + +![Metadata in exa's tree structure][7] + +#### 配色方案 + +默认情况下,`exa` 根据 [内置的配色方案][8] 来标识不同的文件类型。它不仅对文件和目录进行颜色编码,还对 `Cargo.toml`、`CMakeLists.txt`、`Gruntfile.coffee`、`Gruntfile.js`、`Makefile` 等多种文件类型进行颜色编码。 + +#### 扩展文件属性 + +当你使用 `exa` 探索 xattrs(扩展的文件属性)时,`--extended` 会显示所有的 xattrs。 + +![xattrs in exa][9] + +#### 符号链接 + +`exa` 能识别符号链接,也能指出实际的文件。 + +![symlinks in exa][10] + +#### 递归 + +当你想递归当前目录下所有目录的列表时,`exa` 能进行递归。 + +![recurse in exa][11] + +### 总结 + +我相信 `exa 是最简单、最容易适应的工具之一。它帮助我跟踪了很多 Git 和 Maven 文件。它的颜色编码让我更容易在多个子目录中进行搜索,它还能帮助我了解当前的 xattrs。 + +你是否已经用 `exa` 替换了 `ls`?请在评论中分享你的反馈。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/replace-ls-exa + +作者:[Sudeshna Sur][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/sudeshna-sur +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) +[2]: https://the.exa.website/docs +[3]: https://opensource.com/tags/rust +[4]: https://opensource.com/sites/default/files/uploads/exa_trackingfiles.png (Tracking Git files with exa) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/exa_treestructure.png (exa's default tree structure) +[7]: https://opensource.com/sites/default/files/uploads/exa_metadata.png (Metadata in exa's tree structure) +[8]: https://the.exa.website/features/colours +[9]: https://opensource.com/sites/default/files/uploads/exa_xattrs.png (xattrs in exa) +[10]: https://opensource.com/sites/default/files/uploads/exa_symlinks.png (symlinks in exa) +[11]: https://opensource.com/sites/default/files/uploads/exa_recurse.png (recurse in exa) diff --git a/published/202103/20210323 3 new Java tools to try in 2021.md b/published/202103/20210323 3 new Java tools to try in 2021.md new file mode 100644 index 0000000000..9dc03f05b4 --- /dev/null +++ b/published/202103/20210323 3 new Java tools to try in 2021.md @@ -0,0 +1,75 @@ +[#]: subject: (3 new Java tools to try in 2021) +[#]: via: (https://opensource.com/article/21/3/enterprise-java-tools) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13249-1.html) + +2021 年要尝试的 3 个新的 Java 工具 +====== + +> 通过这三个工具和框架,为你的企业级 Java 应用和你的职业生涯提供助力。 + +![](https://img.linux.net.cn/data/attachment/album/202103/29/212649w9j5e05b0ppi9bew.jpg) + +尽管在 Kubernetes 上广泛使用 [Python][2]、[Go][3] 和 [Node.js][4] 实现 [人工智能][5] 和机器学习应用以及 [无服务函数][6],但 Java 技术仍然在开发企业应用中发挥着关键作用。根据 [开发者经济学][7] 的数据,在 2020 年第三季度,全球有 800 万名企业 Java 开发者。 + +虽然这门语言已经存在了超过 25 年,但 Java 世界中总是有新的趋势、工具和框架,可以为你的应用和你的职业生涯赋能。 + +绝大多数 Java 框架都是为具有动态行为的长时间运行的进程而设计的,这些动态行为用于运行可变的应用服务器,例如物理服务器和虚拟机。自从 Kubernetes 容器在 2014 年发布以来,情况已经发生了变化。在 Kubernetes 上使用 Java 应用的最大问题是通过减少内存占用、加快启动和响应时间以及减少文件大小来优化应用性能。 + +### 3 个值得考虑的新 Java 框架和工具 + +Java 开发人员也一直在寻找更简便的方法,将闪亮的新开源工具和项目集成到他们的 Java 应用和日常工作中。这极大地提高了开发效率,并激励更多的企业和个人开发者继续使用 Java 栈。 + +当试图满足上述企业 Java 生态系统的期望时,这三个新的 Java 框架和工具值得你关注。 + +#### 1、Quarkus + +[Quarkus][8] 旨在以惊人的快速启动时间、超低的常驻内存集(RSS)和高密度内存利用率,在 Kubernetes 等容器编排平台中开发云原生的微服务和无服务。根据 JRebel 的 [第九届全球 Java 开发者生产力年度报告][9],Java 开发者对 Quarkus 的使用率从不到 1% 上升到 6%,[Micronaut][10] 和 [Vert.x][11] 均从去年的 1% 左右分别增长到 4% 和 2%。 + +#### 2、Eclipse JKube + +[Eclipse JKube][12] 使 Java 开发者能够使用 [Docker][13]、[Jib][14] 或 [Source-To-Image][15] 构建策略,基于云原生 Java 应用构建容器镜像。它还能在编译时生成 Kubernetes 和 OpenShift 清单,并改善开发人员对调试、观察和日志工具的体验。 + +#### 3、MicroProfile + +[MicroProfile][16] 解决了与优化企业 Java 的微服务架构有关的最大问题,而无需采用新的框架或重构整个应用。此外,MicroProfile [规范][17](即 Health、Open Tracing、Open API、Fault Tolerance、Metrics、Config)继续与 [Jakarta EE][18] 的实现保持一致。 + +### 总结 + +很难说哪个 Java 框架或工具是企业 Java 开发人员实现的最佳选择。只要 Java 栈还有改进的空间,并能加速企业业务的发展,我们就可以期待新的框架、工具和平台的出现,比如上面的三个。花点时间看看它们是否能在 2021 年改善你的企业 Java 应用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/enterprise-java-tools + +作者:[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/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer) +[2]: https://opensource.com/resources/python +[3]: https://opensource.com/article/18/11/learning-golang +[4]: https://opensource.com/article/18/7/node-js-interactive-cli +[5]: https://opensource.com/article/18/12/how-get-started-ai +[6]: https://opensource.com/article/19/4/enabling-serverless-kubernetes +[7]: https://developereconomics.com/ +[8]: https://quarkus.io/ +[9]: https://www.jrebel.com/resources/java-developer-productivity-report-2021 +[10]: https://micronaut.io/ +[11]: https://vertx.io/ +[12]: https://www.eclipse.org/jkube/ +[13]: https://opensource.com/resources/what-docker +[14]: https://github.com/GoogleContainerTools/jib +[15]: https://www.openshift.com/blog/create-s2i-builder-image +[16]: https://opensource.com/article/18/1/eclipse-microprofile +[17]: https://microprofile.io/ +[18]: https://opensource.com/article/18/5/jakarta-ee diff --git a/published/202103/20210323 Affordable high-temperature 3D printers at home.md b/published/202103/20210323 Affordable high-temperature 3D printers at home.md new file mode 100644 index 0000000000..fa2b49ee63 --- /dev/null +++ b/published/202103/20210323 Affordable high-temperature 3D printers at home.md @@ -0,0 +1,73 @@ +[#]: subject: (Affordable high-temperature 3D printers at home) +[#]: via: (https://opensource.com/article/21/3/desktop-3d-printer) +[#]: author: (Joshua Pearce https://opensource.com/users/jmpearce) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13255-1.html) + +在家就能用得起的高温 3D 打印机 +====== + +> 有多实惠?低于 1000 美元。 + +![High-temperature 3D-printed mask][1] + +3D 打印机从 20 世纪 80 年代就已经出现了,但是由于 [RepRap][2] 项目的出现,它们直到获得开源才受到人们的关注。RepRap 意即自我复制快速原型机self-replicating rapid prototyper,它是一种基本上可以自己打印的 3D 打印机。它的开源计划[2004 年][3] 发布之后,导致 3D 打印机的成本从几十万美金降到了几百美金。 + +这些开源的桌面工具一直局限于 ABS 等低性能、低温热塑性塑料(如乐高积木)。市场上有几款高温打印机,但其高昂的成本(几万到几十万美元)使大多数人无法获得。直到最近,它们才参与了很多竞争,因为它们被一项专利 (US6722872B1) 锁定,该专利于 2021 年 2 月 27 日[到期][4]。 + +随着这个路障的消除,我们即将看到高温、低成本、熔融纤维 3D 打印机的爆发。 + +价格低到什么程度?低于 1000 美元如何。 + +在疫情最严重的时候,我的团队赶紧发布了一个 [开源高温 3D 打印机][5] 的设计,用于制造可高温消毒的个人防护装备(PPE)。该项目的想法是让人们能够 [用高温材料打印 PPE][6](如口罩),并将它放入家用烤箱进行消毒。我们称我们的设备为 Cerberus,它具有以下特点: + + 1. 可达到 200℃ 的加热床 + 2. 可达到 500℃ 的热源 + 3. 带有 1kW 加热器核心的隔离式加热室。 + 4. 主电源(交流电源)电压室和床身加热,以便快速启动。 + +你可以用现成的零件来构建这个项目,其中一些零件你可以打印,价格不到 1000 美元。它可以成功打印聚醚酮酮 (PEKK) 和聚醚酰亚胺(PEI,以商品名 Ultem 出售)。这两种材料都比现在低成本打印机能打印的任何材料强得多。 + +![PPE printer][7] + +这款高温 3D 打印机的设计是有三个头,但我们发布的时候只有一个头。Cerberus 是以希腊神话中的三头冥界看门狗命名的。通常情况下,我们不会发布只有一个头的打印机,但疫情改变了我们的优先级。[开源社区团结起来][9],帮助解决早期的供应不足,许多桌面 3D 打印机都在产出有用的产品,以帮助保护人们免受 COVID 的侵害。 + +那另外两个头呢? + +其他两个头是为了高温熔融颗粒制造(例如,这个开源的 [3D打印机][10] 的高温版本)并铺设金属线(像在 [这个设计][11] 中),以建立一个开源的热交换器。Cerberus 打印机的其他功能可能是一个自动喷嘴清洁器和在高温下打印连续纤维的方法。另外,你还可以在转台上安装任何你喜欢的东西来制造高端产品。 + +把一个盒子放在 3D 打印机周围,而把电子元件留在外面的 [专利][12] 到期,为高温家用 3D 打印机铺平了道路,这将使这些设备以合理的成本从单纯的玩具变为工业工具。 + +已经有公司在 RepRap 传统的基础上,将这些低成本系统推向市场(例如,1250 美元的 [Creality3D CR-5 Pro][13] 3D 打印机可以达到 300℃)。Creality 销售最受欢迎的桌面 3D 打印机,并开源了部分设计。 + +然而,要打印超高端工程聚合物,这些打印机需要达到 350℃ 以上。开源计划已经可以帮助桌面 3D 打印机制造商开始与垄断公司竞争,这些公司由于躲在专利背后,已经阻碍了 3D 打印 20 年。期待低成本、高温桌面 3D 打印机的竞争将真正升温! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/desktop-3d-printer + +作者:[Joshua Pearce][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/jmpearce +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/3d_printer_mask.jpg?itok=5ePZghTW (High-temperature 3D-printed mask) +[2]: https://reprap.org/wiki/RepRap +[3]: https://reprap.org/wiki/Wealth_Without_Money +[4]: https://3dprintingindustry.com/news/stratasys-heated-build-chamber-for-3d-printer-patent-us6722872b1-set-to-expire-this-week-185012/ +[5]: https://doi.org/10.1016/j.ohx.2020.e00130 +[6]: https://www.appropedia.org/Open_Source_High-Temperature_Reprap_for_3-D_Printing_Heat-Sterilizable_PPE_and_Other_Applications +[7]: https://opensource.com/sites/default/files/uploads/ppe-hight3dp.png (PPE printer) +[8]: https://www.gnu.org/licenses/fdl-1.3.html +[9]: https://opensource.com/article/20/3/volunteer-covid19 +[10]: https://www.liebertpub.com/doi/10.1089/3dp.2019.0195 +[11]: https://www.appropedia.org/Open_Source_Multi-Head_3D_Printer_for_Polymer-Metal_Composite_Component_Manufacturing +[12]: https://www.academia.edu/17609790/A_Novel_Approach_to_Obviousness_An_Algorithm_for_Identifying_Prior_Art_Concerning_3-D_Printing_Materials +[13]: https://creality3d.shop/collections/cr-series/products/cr-5-pro-h-3d-printer diff --git a/published/20210325 Identify Linux performance bottlenecks using open source tools.md b/published/20210325 Identify Linux performance bottlenecks using open source tools.md new file mode 100644 index 0000000000..55b95a5034 --- /dev/null +++ b/published/20210325 Identify Linux performance bottlenecks using open source tools.md @@ -0,0 +1,265 @@ +[#]: subject: (Identify Linux performance bottlenecks using open source tools) +[#]: via: (https://opensource.com/article/21/3/linux-performance-bottlenecks) +[#]: author: (Howard Fosdick https://opensource.com/users/howtech) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13462-1.html) + +使用开源工具识别 Linux 的性能瓶颈 +====== + +> 不久前,识别硬件瓶颈还需要深厚的专业知识。今天的开源 GUI 性能监视器使它变得相当简单。 + +![](https://img.linux.net.cn/data/attachment/album/202106/07/000141z5shv5nzxeln5y5c.jpg) + +计算机是一个集成的系统,它的性能取决于最慢的硬件组件。如果一个组件的能力比其他组件差,性能落后而不能跟上,它就会拖累你的整个系统。这就是一个 _性能瓶颈_。消除一个严重的瓶颈可以使你的系统飞起来。 + +本文解释了如何识别 Linux 系统中的硬件瓶颈。这些技术同时适用于个人的电脑和服务器。我强调的是个人电脑 —— 我不会涉及局域网管理或数据库系统等领域的服务器特定的瓶颈。这些通常涉及专门的工具。 + +我也不会多谈解决方案。这对本文来说是个太大的话题。相反,我将写一篇关于性能调整的后续文章。 + +我将只使用开源的图形用户界面(GUI)工具来完成这项工作。大多数关于 Linux 瓶颈的文章都相当复杂。它们使用专门的命令,并深入研究神秘的细节。 + +开源提供的 GUI 工具使得识别许多瓶颈变得简单。我的目标是给你一个快速、简单的方法,你可以在任何地方使用。 + +### 从哪里开始 + +一台计算机由六个关键的硬件资源组成。 + + * 处理器 + * 内存 + * 存储器 + * USB 端口 + * 互联网连接 + * 图形处理器 + +如果任何一个资源表现不佳,就会产生一个性能瓶颈。为了识别瓶颈,你必须监测这六种资源。 + +开源提供了大量的工具来完成这项工作。我会使用 [GNOME 系统监视器][2]。它的输出很容易理解,而且你可以在大多数软件库中找到它。 + +启动它并点击“资源”标签。你可以马上发现许多性能问题。 + +![系统监控-资源面板][3] + +*图 1. 系统监控器发现问题。(Howard Fosdick, [CC BY-SA 4.0][4])* + +在“资源”面板上显示三个部分:CPU 历史、内存和交换历史,以及网络历史。一眼就能看出你的处理器是否不堪负荷了,还是你的电脑没有内存了,抑或你的网络带宽被用光了。 + +我将在下面探讨这些问题。现在,当你的电脑速度变慢时,首先检查系统监视器。它可以立即为你提供最常见的性能问题的线索。 + +现在让我们来探讨一下如何识别特定方面的瓶颈。 + +### 如何识别处理器的瓶颈 + +要发现瓶颈,你必须首先知道你有什么硬件。开源为这个目的提供了几个工具。我喜欢 [HardInfo][5],因为它的屏幕显示很容易阅读,而且广泛流行。 + +启动 HardInfo。它的“计算机->摘要”面板可以识别你的 CPU 并告诉你它的核心数、线程数和速度。它还能识别你的主板和其他计算机部件。 + +![HardInfo Summary Panel][6] + +*图 2. HardInfo 显示了硬件细节。(Howard Fosdick, [CC BY-SA 4.0][4])* + +HardInfo 显示,这台计算机有一个物理 CPU 芯片。该芯片包含两个处理器(或称为核心)。每个核心支持两个线程(或称为逻辑处理器)。这就是总共四个逻辑处理器 —— 正是图 1 中系统监控器的 CPU 历史部分所显示的。 + +当处理器不能在其时间内对请求做出反应时,就会出现 _处理器瓶颈_,说明它们已经很忙了。 + +当系统监控器显示逻辑处理器的利用率持续在 80% 或 90% 以上时,你就可以确定这一点。这里有一个例子,四个逻辑处理器中有三个被淹没在 100% 的利用率中。这是一个瓶颈,因为它没有留下多少 CPU 用于其他工作。 + +![系统监视器的处理器瓶颈][7] + +*图 3. 一个处理器的瓶颈。(Howard Fosdick, [CC BY-SA 4.0][4])* + +#### 哪个程序导致了这个问题? + +你需要找出是哪个程序在消耗所有的 CPU。点击系统监视器的“进程”标签。然后点击“CPU 百分比”标头,根据它们消耗的 CPU 的多少对进程进行排序。你将看到哪些应用程序正在扼杀你的系统。 + +![系统监控进程面板][8] + +*图 4. 识别违规的进程。(Howard Fosdick, [CC BY-SA 4.0][4])* + +前三个进程各消耗了 _总 CPU 资源的 24%_。由于有四个逻辑处理器,这意味着每个进程消耗了一整个处理器。这就像图 3 所示。 + +在“进程”面板上,一个名为“analytical_AI”的程序被确定为罪魁祸首。你可以在面板上右键单击它,以查看其资源消耗的更多细节,包括内存使用、它所打开的文件、其输入/输出细节,等等。 + +如果你的登录会话有管理员权限,你可以管理这个进程。你可以改变它的优先级,并停止、继续、结束或杀死它。因此,你可以在这里立即解决你的瓶颈问题。 + +![系统监视器管理一个进程][9] + +*图 5. 右键点击一个进程来管理它。(Howard Fosdick, [CC BY-SA 4.0][4])* + +如何解决处理瓶颈问题?除了实时管理违规的进程外,你也可以防止瓶颈的发生。例如,你可以用另一个应用程序来代替违规进程,绕过它,改变你使用该应用程序的行为,将该应用程序安排在非工作时间,解决潜在的内存问题,对该应用程序或你的系统软件进行性能调整,或升级你的硬件。这里涉及的内容太多,所以我将在下一篇文章中探讨这些方式。 + +#### 常见的处理器瓶颈 + +在用系统监控器监控你的 CPU 时,你会遇到几种常见的瓶颈问题。 + +有时一个逻辑处理器出现瓶颈,而其他所有的处理器都处于低利用率。这意味着你有一个应用程序,它的代码不够智能,无法利用一个以上的逻辑处理器,而且它已经把正在使用的那个处理器耗尽了。这个应用程序完成的时间将比使用更多的处理器要长。但另一方面,至少它能让你的其他处理器腾出手来做别的工作,而不会接管你的电脑。 + +你也可能看到一个逻辑处理器永远停留在 100% 的利用率。要么它非常忙,要么是一个进程被挂起了。判断它是否被挂起的方法是,是看该进程是否从不进行任何磁盘活动(正如系统监视器“进程”面板所显示的那样)。 + +最后,你可能会注意到,当你所有的处理器都陷入瓶颈时,你的内存也被完全利用了。内存不足的情况有时会导致处理器瓶颈。在这种情况下,你要解决的是根本的内存问题,而不是体现出症状的 CPU 问题。 + +### 如何识别内存瓶颈 + +鉴于现代 PC 中有大量的内存,内存瓶颈比以前要少得多。然而,如果你运行内存密集型程序,特别是当你的计算机没有很多的随机存取内存(RAM)时,你仍然可能遇到这些问题。 + +Linux [使用内存][10] 既用于程序,也用于缓存磁盘数据。后者加快了磁盘数据的访问速度。Linux 可以在它需要的任何时候回收这些内存供程序使用。 + +系统监视器的“资源”面板显示了你的总内存和它被使用的程度。在“进程”面板上,你可以看到单个进程的内存使用情况。 + +下面是系统监控器“资源”面板中跟踪总内存使用的部分。 + +![系统监控器的内存瓶颈][11] + +*图 6. 一个内存瓶颈。(Howard Fosdick, [CC BY-SA 4.0][4])* + +在“内存”的右边,你会注意到 [交换空间][12]。这是 Linux 在内存不足时使用的磁盘空间。它将内存写入磁盘以继续操作,有效地将交换空间作为你的内存的一个较慢的扩展。 + +你要注意的两个内存性能问题是: + +1. 内存被大量使用,而且你看到交换空间的活动频繁或不断增加。 +2. 内存和交换空间都被大量使用。 + +情况一意味着更慢的性能,因为交换空间总是比内存更慢。你是否认为这是一个性能问题,取决于许多因素(例如,你的交换空间有多活跃、它的速度、你的预期,等等)。我的看法是,对于现代个人电脑来说,交换空间任何超过象征性的使用都是不可接受的。 + +情况二是指内存和交换空间都被大量使用。这是一个 _内存瓶颈_。计算机变得反应迟钝。它甚至可能陷入一种“咆哮”的状态,在这种状态下,除了内存管理之外,它几乎不能完成其他任务。 + +上面的图 6 显示了一台只有 2GB 内存的旧电脑。当内存使用量超过 80% 时,系统开始向交换空间写入,响应速度下降了。这张截图显示了内存使用量超过了 90%,而且这台电脑已经无法使用。 + +解决内存问题的最终答案是要么少用内存,要么多买内存。我将在后续文章中讨论解决方案。 + +### 如何识别存储瓶颈 + +如今的存储有固态和机械硬盘等多个品种。设备接口包括 PCIe、SATA、雷电和 USB。无论有哪种类型的存储,你都要使用相同的程序来识别磁盘瓶颈。 + +从系统监视器开始。它的“进程”面板显示各个进程的输入/输出率。因此,你可以快速识别哪些进程做了最多的磁盘 I/O。 + +但该工具并不显示每个磁盘的总数据传输率。你需要查看特定磁盘上的总负载,以确定该磁盘是否是一个存储瓶颈。 + +要做到这一点,使用 [atop][13] 命令。它在大多数 Linux 软件库中都有。 + +只要在命令行提示符下输入 `atop` 即可。下面的输出显示,设备 `sdb` 达到 `busy 101%`。很明显,它已经达到了性能极限,限制了你的系统完成工作的速度。 + +![atop 磁盘瓶颈][14] + +*图 7. atop 命令识别了一个磁盘瓶颈。(Howard Fosdick, [CC BY-SA 4.0][4])* + +注意到其中一个 CPU 有 85% 的时间在等待磁盘完成它的工作(`cpu001 w 85%`)。这是典型的存储设备成为瓶颈的情况。事实上,许多人首先看 CPU 的 I/O 等待时间来发现存储瓶颈。 + +因此,要想轻松识别存储瓶颈,请使用 `atop` 命令。然后使用系统监视器上的“进程”面板来识别导致瓶颈的各个进程。 + +### 如何识别 USB 端口的瓶颈 + +有些人整天都在使用他们的 USB 端口。然而,他们从不检查这些端口是否被最佳地使用。无论你是插入外部磁盘、U 盘,还是其他东西,你都要确认你是否从 USB 连接的设备中获得了最大性能。 + +这个图表显示了原因。潜在的 USB 数据传输率差异 _很大_。 + +![USB 标准][15] + +*图 8. USB 速度变化很大。(Howard Fosdick,根据 [Tripplite][16] 和 [Wikipedia][17] 提供的数字,[CC BY-SA 4.0][4])* + +HardInfo 的“USB 设备”标签显示了你的计算机支持的 USB 标准。大多数计算机提供不止一种速度。你怎么知道一个特定端口的速度呢?供应商对它们进行颜色编码,如图表中所示。或者你可以在你的计算机的文档中查找。 + +要看到你得到的实际速度,可以使用开源的 [GNOME 磁盘][18] 程序进行测试。只要启动 GNOME 磁盘,选择它的“磁盘基准”功能,然后运行一个基准测试。这将告诉你在一个端口插入特定设备时,你将得到的最大实际速度。 + +你可能会得到不同的端口传输速度,这取决于你将哪个设备插入它。数据速率取决于端口和设备的特定组合。 + +例如,一个可以以 3.1 速度运行的设备如果使用 2.0 端口就会以 2.0 的速度运行。(而且它不会告诉你它是以较慢的速度运行的!)相反,如果你把一个 USB 2.0 设备插入 3.1 端口,它能工作,但速度是 2.0 的速度。所以要获得快速的 USB,你必须确保端口和设备都支持它。GNOME 磁盘为你提供了验证这一点的方法。 + +要确定 USB 的处理瓶颈,使用你对固态和硬盘所做的同样程序。运行 `atop` 命令来发现 USB 存储瓶颈。然后,使用系统监视器来获取违规进程的详细信息。 + +### 如何识别互联网带宽瓶颈 + +系统监控器的“资源”面板会实时告诉你互联网连接速度(见图 1)。 + +有 [很好的 Python 工具][19] 可以测试你的最大网速,但你也可以在 [Speedtest][20]、[Fast.com][21] 和 [Speakeasy][22] 等网站进行测试。为了获得最佳结果,关闭所有东西,只运行 _速度测试_;关闭你的虚拟私有网络;在一天中的不同时间运行测试;并比较几个测试网站的结果。 + +然后将你的结果与你的供应商声称的下载和上传速度进行比较。这样,你就可以确认你得到的是你所付费的速度。 + +如果你有一个单独的路由器,在有和没有它的情况下进行测试。这可以告诉你,你的路由器是否是一个瓶颈。如果你使用 WiFi,在有 WiFi 和没有 WiFi 的情况下进行测试(通过将你的笔记本电脑直接与调制解调器连接)。我经常看到人们抱怨他们的互联网供应商,而实际上他们只是有一个 WiFi 瓶颈,可以自己解决。 + +如果某些程序正在消耗你的整个互联网连接,你想知道是哪一个。通过使用 `nethogs` 命令找到它。它在大多数软件库中都有。 + +有一天,我的系统监视器突然显示我的互联网访问量激增。我只是在命令行中输入了 `nethogs`,它立即确定带宽消耗者是 Clamav 防病毒更新。 + +![Nethogs][23] + +*图 9. Nethogs 识别带宽用户。(Howard Fosdick, [CC BY-SA 4.0][4])* + +### 如何识别图形处理瓶颈 + +如果你把显示器插在台式电脑后面的主板上,你就在使用 _板载显卡_。如果你把它插在后面的卡上,你就有一个专门的图形子系统。大多数人称它为 _视频卡_ 或 _显卡_。对于台式电脑来说,附加显卡通常比主板上的显卡更强大、更昂贵。笔记本电脑总是使用板载显卡。 + +HardInfo 的“PCI 设备”面板告诉你关于你的图形处理单元(GPU)。它还显示你的专用视频内存的数量(寻找标有“可预取”的内存)。 + +![视频芯片组信息][24] + +*图 10. HardInfo提供图形处理信息。(Howard Fosdick, [CC BY-SA 4.0][4])* + +CPU 和 GPU [非常密切地][25] 一起工作。简而言之,CPU 为 GPU 准备渲染的帧,然后 GPU 渲染这些帧。 + +当你的 CPU 在等待 100% 繁忙的 GPU 时,就会出现 _GPU 瓶颈_。 + +为了确定这一点,你需要监控 CPU 和 GPU 的利用率。像 [Conky][26] 和 [Glances][27] 这样的开源监控器,如果它们的扩展插件支持你的图形芯片组,就可以做到这一点。 + +看一下 Conky 的这个例子。你可以看到,这个系统有很多可用的 CPU。GPU 只有 25% 的使用率。想象一下,如果这个 GPU 的数量接近 100%。那么你就会知道 CPU 在等待 GPU,你就会有一个 GPU 的瓶颈。 + +![Conky CPU 和 GPU 监控][28] + +*图 11. Conky 显示 CPU 和 GPU 的利用率。 (图片来源:[AskUbuntu论坛][29])* + +在某些系统上,你需要一个供应商专属的工具来监控你的 GPU。它们可以从 GitHub 上下载,并在 [GPU 监控和诊断命令行工具][30] 这篇文章中有所描述。 + +### 总结 + +计算机由一系列集成的硬件资源组成。如果它们中的任何一个在工作量上远远落后于其他资源,就会产生性能瓶颈。这可能会拖累你的整个系统。你需要能够识别和纠正瓶颈,以实现最佳性能。 + +不久前,识别瓶颈需要深厚的专业知识。今天的开源 GUI 性能监控器使它变得相当简单。 + +在我的下一篇文章中,我将讨论改善你的 Linux 电脑性能的具体方法。同时,请在评论中分享你自己的经验。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/linux-performance-bottlenecks + +作者:[Howard Fosdick][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/howtech +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_lightning.png?itok=wRzjWIlm (Lightning in a bottle) +[2]: https://wiki.gnome.org/Apps/SystemMonitor +[3]: https://opensource.com/sites/default/files/uploads/1_system_monitor_resources_panel.jpg (System Monitor - Resources Panel ) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://itsfoss.com/hardinfo/ +[6]: https://opensource.com/sites/default/files/uploads/2_hardinfo_summary_panel.jpg (HardInfo Summary Panel) +[7]: https://opensource.com/sites/default/files/uploads/3_system_monitor_100_processor_utilization.jpg (System Monitor processor bottleneck) +[8]: https://opensource.com/sites/default/files/uploads/4_system_monitor_processes_panel.jpg (System Monitor Processes panel) +[9]: https://opensource.com/sites/default/files/uploads/5_system_monitor_manage_a_process.jpg (System Monitor managing a process) +[10]: https://www.networkworld.com/article/3394603/when-to-be-concerned-about-memory-levels-on-linux.html +[11]: https://opensource.com/sites/default/files/uploads/6_system_monitor_out_of_memory.jpg (System Monitor memory bottleneck) +[12]: https://opensource.com/article/18/9/swap-space-linux-systems +[13]: https://opensource.com/life/16/2/open-source-tools-system-monitoring +[14]: https://opensource.com/sites/default/files/uploads/7_atop_storage_bottleneck.jpg (atop disk bottleneck) +[15]: https://opensource.com/sites/default/files/uploads/8_usb_standards_speeds.jpg (USB standards) +[16]: https://www.samsung.com/us/computing/memory-storage/solid-state-drives/ +[17]: https://en.wikipedia.org/wiki/USB +[18]: https://wiki.gnome.org/Apps/Disks +[19]: https://opensource.com/article/20/1/internet-speed-tests +[20]: https://www.speedtest.net/ +[21]: https://fast.com/ +[22]: https://www.speakeasy.net/speedtest/ +[23]: https://opensource.com/sites/default/files/uploads/9_nethogs_bandwidth_consumers.jpg (Nethogs) +[24]: https://opensource.com/sites/default/files/uploads/10_hardinfo_video_card_information.jpg (Video Chipset Information) +[25]: https://www.wepc.com/tips/cpu-gpu-bottleneck/ +[26]: https://itsfoss.com/conky-gui-ubuntu-1304/ +[27]: https://opensource.com/article/19/11/monitoring-linux-glances +[28]: https://opensource.com/sites/default/files/uploads/11_conky_cpu_and_gup_monitoring.jpg (Conky CPU and GPU monitoring) +[29]: https://askubuntu.com/questions/387594/how-to-measure-gpu-usage +[30]: https://www.cyberciti.biz/open-source/command-line-hacks/linux-gpu-monitoring-and-diagnostic-commands/ diff --git a/published/202104/20190319 How to set up a homelab from hardware to firewall.md b/published/202104/20190319 How to set up a homelab from hardware to firewall.md new file mode 100644 index 0000000000..54c24e7a14 --- /dev/null +++ b/published/202104/20190319 How to set up a homelab from hardware to firewall.md @@ -0,0 +1,107 @@ +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13262-1.html) +[#]: subject: (How to set up a homelab from hardware to firewall) +[#]: via: (https://opensource.com/article/19/3/home-lab) +[#]: author: (Michael Zamot https://opensource.com/users/mzamot) + +如何从硬件到防火墙建立一个家庭实验室 +====== + +> 了解一下用于构建自己的家庭实验室的硬件和软件方案。 + +![](https://img.linux.net.cn/data/attachment/album/202104/02/215222t2fiqpt17gfpkkii.jpg) + +你有想过创建一个家庭实验室吗?或许你想尝试不同的技术,构建开发环境、亦或是建立自己的私有云。拥有一个家庭实验室的理由很多,本教程旨在使入门变得更容易。 + +规划家庭实验室时,需要考虑三方面:硬件、软件和维护。我们将在这里查看前两方面,并在以后的文章中讲述如何节省维护计算机实验室的时间。 + +### 硬件 + +在考虑硬件需求时,首先要考虑如何使用实验室以及你的预算、噪声、空间和电力使用情况。 + +如果购买新硬件过于昂贵,请搜索当地的大学、广告以及诸如 eBay 或 Craigslist 之类的网站,能获取二手服务器的地方。它们通常很便宜,并且服务器级的硬件可以使用很多年。你将需要三类硬件:虚拟化服务器、存储设备和路由器/防火墙。 + +#### 虚拟化服务器 + +一个虚拟化服务器允许你去运行多个共享物理机资源的虚拟机,同时最大化利用和隔离资源。如果你弄坏了一台虚拟机,无需重建整个服务器,只需虚拟一个好了。如果你想进行测试或尝试某些操作而不损坏整个系统,仅需要新建一个虚拟机来运行即可。 + +在虚拟服务器中,需考虑两个最重要的因素是 CPU 的核心数及其运行速度以及内存容量。如果没有足够的资源够全部虚拟机共享,那么它们将被过度分配并试着获取其他虚拟机的 CPU 的周期和内存。 + +因此,考虑一个多核 CPU 的平台。你要确保 CPU 支持虚拟化指令(因特尔的 VT-x 指令集和 AMD 的 AMD-V 指令集)。能够处理虚拟化的优质的消费级处理器有因特尔的 i5 或 i7 和 AMD 的 Ryzen 处理器。如果你考虑服务器级的硬件,那么因特尔的志强系列和 AMD 的 EPYC 都是不错的选择。内存可能很昂贵,尤其是最近的 DDR4 内存。当我们估计所需多少内存时,请为主机操作系统的内存至少分配 2 GB 的空间。 + +如果你担心电费或噪声,则诸如因特尔 NUC 设备之类的解决方案虽然外形小巧、功耗低、噪音低,但是却以牺牲可扩展性为代价。 + +#### NAS + +如果希望装有硬盘驱动器的计算机存储你的所有个人数据,电影,图片等,并为虚拟化服务器提供存储,则需要网络附加存储Network-attached storage(NAS)。 + +在大多数情况下,你不太可能需要一颗强力的 CPU。实际上,许多商业 NAS 的解决方案使用低功耗的 ARM CPU。支持多个 SATA 硬盘的主板是必须的。如果你的主板没有足够的端口,请使用主机总线适配器host bus adapter(HBA)SAS 控制器添加额外的端口。 + +网络性能对于 NAS 来说是至关重要的,因此最好选择千兆gigabit网络(或更快网络)。 + +内存需求根据你的文件系统而有所不同。ZFS 是 NAS 上最受欢迎的文件系统之一,你需要更多内存才能使用诸如缓存或重复数据删除之类的功能。纠错码Error-correcting code(ECC)的内存是防止数据损坏的最佳选择(但在购买前请确保你的主板支持)。最后但同样重要的,不要忘记使用不间断电源uninterruptible power supply(UPS),因为断电可能会使得数据出错。 + +#### 防火墙和路由器 + +你是否曾意识到,廉价的路由器/防火墙通常是保护你的家庭网络不受外部环境影响的主要部分?这些路由器很少及时收到安全更新(如果有的话)。现在害怕了吗?好吧,[确实][2]! + +通常,你不需要一颗强大的 CPU 或是大量内存来构建你自己的路由器/防火墙,除非你需要高吞吐率或是执行 CPU 密集型任务,像是虚拟私有网络服务器或是流量过滤。在这种情况下,你将需要一个支持 AES-NI 的多核 CPU。 + +你可能想要至少 2 个千兆或更快的以太网卡Ethernet network interface cards(NIC),这不是必需的,但我推荐使用一个管理型交换机来连接你自己的装配的路由器,以创建 VLAN 来进一步隔离和保护你的网络。 + +![Home computer lab PfSense][4] + +### 软件 + +在选择完你的虚拟化服务器、NAS 和防火墙/路由器后,下一步是探索不同的操作系统和软件,以最大程度地发挥其作用。尽管你可以使用 CentOS、Debian或 Ubuntu 之类的常规 Linux 发行版,但是与以下软件相比,它们通常花费更多的时间进行配置和管理。 + +#### 虚拟化软件 + +[KVM][5](基于内核的虚拟机Kernel-based Virtual Machine)使你可以将 Linux 变成虚拟机监控程序,以便可以在同一台机器中运行多个虚拟机。最好的是,KVM 作为 Linux 的一部分,它是许多企业和家庭用户的首选。如果你愿意,可以安装 [libvirt][6] 和 [virt-manager][7] 来管理你的虚拟化平台。 + +[Proxmox VE][8] 是一个强大的企业级解决方案,并且是一个完全开源的虚拟化和容器平台。它基于 Debian,使用 KVM 作为其虚拟机管理程序,并使用 LXC 作为容器。Proxmox 提供了强大的网页界面、API,并且可以扩展到许多群集节点,这很有用,因为你永远不知道何时实验室容量不足。 + +[oVirt][9](RHV)是另一种使用 KVM 作为虚拟机管理程序的企业级解决方案。不要因为它是企业级的,就意味着你不能在家中使用它。oVirt 提供了强大的网页界面和 API,并且可以处理数百个节点(如果你运行那么多服务器,我可不想成为你的邻居!)。oVirt 用于家庭实验室的潜在问题是它需要一套最低限度的节点:你将需要一个外部存储(例如 NAS)和至少两个其他虚拟化节点(你可以只在一个节点上运行,但你会遇到环境维护方面的问题)。 + +#### 网络附加存储软件 + +[FreeNAS][10] 是最受欢迎的开源 NAS 发行版,它基于稳定的 FreeBSD 操作系统。它最强大的功能之一是支持 ZFS 文件系统,该文件系统提供了数据完整性检查、快照、复制和多个级别的冗余(镜像、条带化镜像和条带化)。最重要的是,所有功能都通过功能强大且易于使用的网页界面进行管理。在安装 FreeNAS 之前,请检查硬件是否支持,因为它不如基于 Linux 的发行版那么广泛。 + +另一个流行的替代方法是基于 Linux 的 [OpenMediaVault][11]。它的主要功能之一是模块化,带有可扩展和添加特性的插件。它包括的功能包括基于网页管理界面,CIFS、SFTP、NFS、iSCSI 等协议,以及卷管理,包括软件 RAID、资源配额,访问控制列表access control lists(ACL)和共享管理。由于它是基于 Linux 的,因此其具有广泛的硬件支持。 + +#### 防火墙/路由器软件 + +[pfSense][12] 是基于 FreeBSD 的开源企业级路由器和防火墙发行版。它可以直接安装在服务器上,甚至可以安装在虚拟机中(以管理虚拟或物理网络并节省空间)。它有许多功能,可以使用软件包进行扩展。尽管它也有命令行访问权限,但也可以完全使用网页界面对其进行管理。它具有你所希望路由器和防火墙提供的所有功能,例如 DHCP 和 DNS,以及更高级的功能,例如入侵检测(IDS)和入侵防御(IPS)系统。你可以侦听多个不同接口或使用 VLAN 的网络,并且只需鼠标点击几下即可创建安全的 VPN 服务器。pfSense 使用 pf,这是一种有状态的数据包筛选器,它是为 OpenBSD 操作系统开发的,使用类似 IPFilter 的语法。许多公司和组织都有使用 pfSense。 + +* * * + +考虑到所有的信息,是时候动手开始建立你的实验室了。在之后的文章中,我将介绍运行家庭实验室的第三方面:自动化进行部署和维护。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/3/home-lab + +作者:[Michael Zamot (Red Hat)][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mzamot +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb +[2]: https://opensource.com/article/18/5/how-insecure-your-router +[3]: /file/427426 +[4]: https://opensource.com/sites/default/files/uploads/pfsense2.png (Home computer lab PfSense) +[5]: https://www.linux-kvm.org/page/Main_Page +[6]: https://libvirt.org/ +[7]: https://virt-manager.org/ +[8]: https://www.proxmox.com/en/proxmox-ve +[9]: https://ovirt.org/ +[10]: https://freenas.org/ +[11]: https://www.openmediavault.org/ +[12]: https://www.pfsense.org/ diff --git a/published/202104/20200106 Open Source Supply Chain- A Matter of Trust.md b/published/202104/20200106 Open Source Supply Chain- A Matter of Trust.md new file mode 100644 index 0000000000..60aa20fb4c --- /dev/null +++ b/published/202104/20200106 Open Source Supply Chain- A Matter of Trust.md @@ -0,0 +1,69 @@ +[#]: collector: (lujun9972) +[#]: translator: (Kevin3599) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13321-1.html) +[#]: subject: (Open Source Supply Chain: A Matter of Trust) +[#]: via: (https://www.linux.com/articles/open-source-supply-chain-a-matter-of-trust/) +[#]: author: (Swapnil Bhartiya https://www.linux.com/author/swapnil/) + +开源供应链:一个有关信任的问题 +====== + +[![][1]][2] + +共同作者:Curtis Franklin, Jr + +开源软件通常被认为比专有软件更安全、更有保障,因为如果用户愿意,他们可以从源代码编译软件。他们知道在他们环境中运行的代码的来源。在他们的环境中运行的代码每个部分都可以被审查,也可以追溯每段代码的开发者。 + +然而,用户和提供者们正在逐渐远离完全控制软件所带来的复杂性,而在转而追求软件的便捷和易用。 + +VMware 副总裁兼首席开源官 Dirk Hohndel 说:“当我看到在一个有关网络安全和隐私的讲座中,演讲者运行 `docker run` 命令来安装和运行一些从互联网上下载的随机二进制文件时,我经常会大吃一惊。这两件事似乎有点相左。” + +软件供应链,即将应用程序从编码、打包、分发到最终用户的过程是相当复杂的。如果其中有一环出现错误,可能会导致软件存在潜在的风险,特别是对于开源软件。一个恶意行为者可以访问后端,并在用户不知情或不受控的情况下向其插入任何可能的恶意代码。 + +这样的问题不单单存在于云原生领域,在现代应用开发中很常见,这包括 JavaScript、NPM、PyPI、RubyGems 等等。甚至连 Mac 上的 Homebrew 过去也是通过源代码提供,由用户自己编译。 + +“如今,你只需要下载二进制文件并安装它,并期望其源代码并没有被恶意修改过。”Hohndel 说,“作为一个行业,我们需要更加关注我们的开源代码供应。这对我来说是非常重要的事,我正努力让更多的人意识到其重要性。” + +然而,这不仅仅是一个二进制与源代码的关系。只运行一个二进制文件,而不必从源代码构建所有东西有着巨大的优势。当软件开发需求发生转变时候,这种运行方式允许开发人员在过程中更加灵活和响应更快。通过重用一些二进制文件,他们可以在新的开发和部署中快速地循环。 + +Hohndel 说:“如果有办法向这些软件添加签名,并建立一个‘即时’验证机制,让用户知道他们可以信任此软件,那就更好了。” + +Linux 发行版解决了这个问题,因为发行版充当了看门人的角色,负责检查进入受支持的软件存储库的软件包的完整性。 + +“像通过 Debian 等发行版提供的软件包都使用了密钥签名。要确保它确实是发行版中应包含的软件,需要进行大量工作。开发者们通过这种方式解决了开源供应链问题。”Hohndel 说。 + +但是,即使在 Linux 发行版上,人们也希望简化事情,并以正确性和安全性换取速度。现在,诸如 AppImage、Snap 和 Flatpack 之类的项目已经采用了二进制方式,从而将开源供应链信任问题带入了 Linux 发行版。这和 Docker 容器的问题如出一辙。 + +“理想的解决方案是为开源社区找到一种设计信任系统的方法,该系统可以确保如果二进制文件是用受信任网络中的密钥签名的,那么它就可以被信任,并允许我们可靠地返回源头并进行审核,” Hohndel 建议。 + +但是,所有这些额外的步骤都会产生成本,大多数项目开发者要么不愿意,或无力承担。一些项目正在尝试寻找解决该问题的方法。例如,NPM 已开始鼓励提交软件包的用户正确认证和保护其账户安全,以提高平台的可信度。 + +### 开源社区善于解决问题 + +Hohndel 致力于解决开源供应链问题,并正试图让更多开发者意识到其重要性。去年,VMware 收购了 Bitnami,这为管理由 VMware 所签名的开源软件提供了一个良机。 + +“我们正在与各种上游开源社区进行交流,以提高对此的认识。我们还在讨论技术解决方案,这些方案将使这些社区更容易解决潜在的开源供应链问题。” Hohndel 说。 + +开源社区历来致力于确保软件质量,这其中也包括安全性和隐私性。不过,Hohndel 说:“我最担心的是,在对下一个新事物感到兴奋时,我们经常忽略了需要的基础工程原则。” + +最终,Hohndel 认为答案将来自开源社区本身。 “开源是一种工程方法论,是一种社会实验。开源就是人们之间相互信任、相互合作、跨国界和公司之间以及竞争对手之间的合作,以我们以前从未有过的方式。”他解释说。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/articles/open-source-supply-chain-a-matter-of-trust/ + +作者:[Swapnil Bhartiya][a] +选题:[lujun9972][b] +译者:[Kevin3599](https://github.com/kevin3599) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/swapnil/ +[b]: https://github.com/lujun9972 +[1]: https://www.linux.com/wp-content/uploads/2020/01/hand-1137978_1920-1068x801.jpg (hand-1137978_1920) +[2]: https://www.linux.com/wp-content/uploads/2020/01/hand-1137978_1920.jpg +[3]: https://www.swapnilbhartiya.com/open-source-leaders-dirk-hohndel-brings-open-source-to-vmware/ +[4]: https://techcrunch.com/2019/05/15/vmware-acquires-bitnami-to-deliver-packaged-applications-anywhere/ diff --git a/published/202104/20200423 4 open source chat applications you should use right now.md b/published/202104/20200423 4 open source chat applications you should use right now.md new file mode 100644 index 0000000000..5c445b9586 --- /dev/null +++ b/published/202104/20200423 4 open source chat applications you should use right now.md @@ -0,0 +1,138 @@ +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13271-1.html) +[#]: subject: (4 open source chat applications you should use right now) +[#]: via: (https://opensource.com/article/20/4/open-source-chat) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) + +值得现在就去尝试的四款开源聊天应用软件 +====== + +> 现在,远程协作已作为一项必不可少的能力,让开源实时聊天成为你工具箱中必不可少的一部分吧。 + +![](https://img.linux.net.cn/data/attachment/album/202104/06/103454xundd858446u08r0.jpg) + +清晨起床后,我们通常要做的第一件事是检查手机,看看是否有同事和朋友发来的重要信息。无论这是否是一个好习惯,但这种行为早已成为我们日常生活的一部分。 + +> 人是理性动物。他可以为任何他想相信的事情想出一个理由。 +> – 阿纳托尔·法朗士 + +无论理由是否合理,我们每天都在使用的一系列的通讯工具,例如电子邮件、电话、网络会议工具或社交网络。甚至在 COVID-19 之前,居家办公就已经使这些通信工具成为我们生活中的重要部分。随着疫情出现,居家办公成为新常态,我们交流方式的方方面面正面临着前所未有的改变,这让这些工具变得不可或缺。 + +### 为什么需要聊天? + +作为全球团队的一部分进行远程工作时,我们必须要有一个相互协作的环境。聊天应用软件在帮助我们保持相互联系中起着至关重要的作用。与电子邮件相比,聊天应用软件可提供与全球各地的同事快速、实时的通信。 + +选择一款聊天应用软件需要考虑很多因素。为了帮助你选择最适合你的应用软件,在本文中,我将探讨四款开源聊天应用软件,和一个当你需要与同事“面对面”时的开源视频通信工具,然后概述在高效的通讯应用软件中,你应当考虑的一些功能。 + +### 四款开源聊天软件 + +#### Rocket.Chat + +![Rocket.Chat][2] + +[Rocket.Chat][3] 是一个综合性的通讯平台,其将频道分为公开房间(任何人都可以加入)和私有房间(仅受邀请)。你还可以直接将消息发送给已登录的人员。其能共享文档、链接、照片、视频和动态图GIF,以及进行视频通话,并可以在平台中发送语音信息。 + +Rocket.Chat 是自由开源软件,但是其独特之处在于其可自托管的聊天系统。你可以将其下载到你的服务器上,无论它是本地服务器或是在公有云上的虚拟专用服务器。 + +Rocket.Chat 是完全免费,其 [源码][4] 可在 Github 获得。许多开源项目都使用 Rocket.Chat 作为他们官方交流平台。该软件在持续不断的发展且不断更新和改进新功能。 + +我最喜欢 Rocket.Chat 的地方是其能够根据用户需求来进行自定义操作,并且它使用机器学习在用户通讯间进行自动的、实时消息翻译。你也可以下载适用于你移动设备的 Rocket.Chat,以便能随时随地使用。 + +#### IRC + +![IRC on WeeChat 0.3.5][5] + +IRC([互联网中继聊天][6]Internet Relay Chat)是一款实时、基于文本格式的通信软件。尽管其是最古老的电子通讯形式之一,但在许多知名的软件项目中仍受欢迎。 + +IRC 频道是单独的聊天室。它可以让你在一个开放的频道中与多人进行聊天或与某人私下一对一聊天。如果频道名称以 `#` 开头,则可以假定它是官方的聊天室,而以 `##` 开头的聊天室通常是非官方的聊天室。 + +[上手 IRC][7] 很容易。你的 IRC 昵称可以让人们找到你,因此它必须是唯一的。但是,你可以完全自主地选择 IRC 客户端。如果你需要比标准 IRC 客户端更多功能的应用程序,则可以使用 [Riot.im][8] 连接到 IRC。 + +考虑到它悠久的历史,你为什么还要继续使用 IRC?出于一个原因是,其仍是我们所依赖的许多自由及开源项目的家园。如果你想参于开源软件开发和社区,可以选择用 IRC。 + +#### Zulip + +![Zulip][9] + +[Zulip][10] 是十分流行的群聊应用程序,它遵循基于话题线索的模式。在 Zulip 中,你可以订阅stream,就像在 IRC 频道或 Rocket.Chat 中一样。但是,每个 Zulip 流都会拥有一个唯一的话题topic,该话题可帮助你以后查找对话,因此其更有条理。 + +与其他平台一样,它支持表情符号、内嵌图片、视频和推特预览。它还支持 LaTeX 来分享数学公式或方程式、支持 Markdown 和语法高亮来分享代码。 + +Zulip 是跨平台的,并提供 API 用于编写你自己的程序。我特别喜欢 Zulip 的一点是它与 GitHub 的集成整合功能:如果我正在处理某个议题issue,则可以使用 Zulip 的标记回链某个拉取请求pull request ID。 + +Zulip 是开源的(你可以在 GitHub 上访问其 [源码][11])并且免费使用,但它有提供预置支持、[LDAP][12] 集成和更多存储类型的付费产品。 + +#### Let's Chat + +![Let's Chat][13] + +[Let's Chat][14] 是一个面向小型团队的自托管的聊天解决方案。它使用 Node.js 和 MongoDB 编写运行,只需鼠标点击几下即可将其部署到本地服务器或云服务器。它是自由开源软件,可以在 GitHub 上查看其 [源码][15]。 + +Let's Chat 与其他开源聊天工具的不同之处在于其企业功能:它支持 LDAP 和 [Kerberos][16] 身份验证。它还具有新用户想要的所有功能:你可以在历史记录中搜索过往消息,并使用 @username 之类的标签来标记人员。 + +我喜欢 Let's Chat 的地方是它拥有私人的受密码保护的聊天室、发送图片、支持 GIPHY 和代码粘贴。它不断更新,不断增加新功能。 + +### 附加:开源视频聊天软件 Jitsi + +![Jitsi][17] + +有时,文字聊天还不够,你还可能需要与某人面谈。在这种情况下,如果不能选择面对面开会交流,那么视频聊天是最好的选择。[Jitsi][18] 是一个完全开源的、支持多平台且兼容 WebRTC 的视频会议工具。 + +Jitsi 从 Jitsi Desktop 开始,已经发展成为许多 [项目][19],包括 Jitsi Meet、Jitsi Videobridge、jibri 和 libjitsi,并且每个项目都在 GitHub 上开放了 [源码][20]。 + +Jitsi 是安全且可扩展的,并支持诸如联播simulcast带宽预估bandwidth estimation之类的高级视频路由的概念,还包括音频、录制、屏幕共享和拨入功能等经典功能。你可以来为你的视频聊天室设置密码以保护其不受干扰,并且它还支持通过 YouTube 进行直播。你还可以搭建自己的 Jitsi 服务器,并将其托管在本地或虚拟专用服务器virtual private server(例如 Digital Ocean Droplet)上。 + +我最喜欢 Jitsi 的是它是免费且低门槛的。任何人都可以通过访问 [meet.jit.si][21] 来立即召开会议,并且用户无需注册或安装即可轻松参加会议。(但是,注册的话能拥有日程安排功能。)这种入门级低门槛的视频会议服务让 Jitsi 迅速普及。 + +### 选择一个聊天应用软件的建议 + +各种各样的开源聊天应用软件可能让你很难抉择。以下是一些选择一款聊天应用软件的一般准则。 + + * 最好具有交互式的界面和简单的导航工具。 + * 最好寻找一种功能强大且能让人们以各种方式使用它的工具。 + * 如果与你所使用的工具有进行集成整合的话,可以重点考虑。一些工具与 GitHub 或 GitLab 以及某些应用程序具有良好的无缝衔接,这将是一个非常有用的功能。 + * 有能托管到云主机的工具将十分方便。 + * 应考虑到聊天服务的安全性。在私人服务器上托管服务的能力对许多组织和个人来说是必要的。 + * 最好选择那些具有丰富的隐私设置,并拥有私人聊天室和公共聊天室的通讯工具。 + +由于人们比以往任何时候都更加依赖在线服务,因此拥有备用的通讯平台是明智之举。例如,如果一个项目正在使用 Rocket.Chat,则必要之时,它还应具有跳转到 IRC 的能力。由于这些软件在不断更新,你可能会发现自己已经连接到多个渠道,因此集成整合其他应用将变得非常有价值。 + +在各种可用的开源聊天服务中,你喜欢和使用哪些?这些工具又是如何帮助你进行远程办公?请在评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/open-source-chat + +作者:[Sudeshna Sur][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/sudeshna-sur +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_communication_team.png?itok=CYfZ_gE7 (Chat bubbles) +[2]: https://opensource.com/sites/default/files/uploads/rocketchat.png (Rocket.Chat) +[3]: https://rocket.chat/ +[4]: https://github.com/RocketChat/Rocket.Chat +[5]: https://opensource.com/sites/default/files/uploads/irc.png (IRC on WeeChat 0.3.5) +[6]: https://en.wikipedia.org/wiki/Internet_Relay_Chat +[7]: https://opensource.com/article/16/6/getting-started-irc +[8]: https://opensource.com/article/17/5/introducing-riot-IRC +[9]: https://opensource.com/sites/default/files/uploads/zulip.png (Zulip) +[10]: https://zulipchat.com/ +[11]: https://github.com/zulip/zulip +[12]: https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol +[13]: https://opensource.com/sites/default/files/uploads/lets-chat.png (Let's Chat) +[14]: https://sdelements.github.io/lets-chat/ +[15]: https://github.com/sdelements/lets-chat +[16]: https://en.wikipedia.org/wiki/Kerberos_(protocol) +[17]: https://opensource.com/sites/default/files/uploads/jitsi_0_0.jpg (Jitsi) +[18]: https://jitsi.org/ +[19]: https://jitsi.org/projects/ +[20]: https://github.com/jitsi +[21]: http://meet.jit.si diff --git a/published/202104/20200617 How to handle dynamic and static libraries in Linux.md b/published/202104/20200617 How to handle dynamic and static libraries in Linux.md new file mode 100644 index 0000000000..d74b9a4b50 --- /dev/null +++ b/published/202104/20200617 How to handle dynamic and static libraries in Linux.md @@ -0,0 +1,271 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13318-1.html) +[#]: subject: (How to handle dynamic and static libraries in Linux) +[#]: via: (https://opensource.com/article/20/6/linux-libraries) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) + +怎样在 Linux 中使用动态和静态库 +====== + +> 了解 Linux 如何使用库,包括静态库和动态库的差别,有助于你解决依赖问题。 + +![](https://img.linux.net.cn/data/attachment/album/202104/21/184822euzoqsiwxxpiqqrr.jpg) + +Linux 从某种意义上来说就是一堆相互依赖的静态和动态库。对于 Linux 系统新手来说,库的整个处理过程简直是个迷。但对有经验的人来说,被构建进操作系统的大量共享代码对于编写新应用来说却是个优点。 + +为了让你熟悉这个话题,我准备了一个小巧的 [应用例子][2] 来展示在普通的 Linux 发行版(在其他操作系统上未验证)上是经常是如何处理库的。为了用这个例子来跟上这个需要动手的教程,请打开命令行输入: + +``` +$ git clone https://github.com/hANSIc99/library_sample +$ cd library_sample/ +$ make +cc -c main.c -Wall -Werror +cc -c libmy_static_a.c -o libmy_static_a.o -Wall -Werror +cc -c libmy_static_b.c -o libmy_static_b.o -Wall -Werror +ar -rsv libmy_static.a libmy_static_a.o libmy_static_b.o +ar: creating libmy_static.a +a - libmy_static_a.o +a - libmy_static_b.o +cc -c -fPIC libmy_shared.c -o libmy_shared.o +cc -shared -o libmy_shared.so libmy_shared.o +$ make clean +rm *.o +``` + +当执行完这些命令,这些文件应当被添加进目录下(执行 `ls` 来查看): + +``` +my_app +libmy_static.a +libmy_shared.so +``` + +### 关于静态链接 + +当你的应用链接了一个静态库,这个库的代码就变成了可执行文件的一部分。这个动作只在链接过程中执行一次,这些静态库通常以 `.a` 扩展符结尾。 + +静态库是多个目标object文件的归档archive([ar][3])。这些目标文件通常是 ELF 格式的。ELF 是 [可执行可链接格式][4]Executable and Linkable Format 的简写,它与多个操作系统兼容。 + +`file` 命令的输出可以告诉你静态库 `libmy_static.a` 是 `ar` 格式的归档文件类型。 + +``` +$ file libmy_static.a +libmy_static.a: current ar archive +``` + +使用 `ar -t`,你可以看到归档文件的内部。它展示了两个目标文件: + +``` +$ ar -t libmy_static.a +libmy_static_a.o +libmy_static_b.o +``` + +你可以用 `ax -x ` 命令来提取归档文件的文件。被提出的都是 ELF 格式的目标文件: + +``` +$ ar -x libmy_static.a +$ file libmy_static_a.o +libmy_static_a.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped +``` + +### 关于动态链接 + +动态链接指的是使用共享库。共享库通常以 `.so` 的扩展名结尾(“共享对象shared object” 的简写)。 + +共享库是 Linux 系统中依赖管理的最常用方法。这些共享库在应用启动前被载入内存,当多个应用都需要同一个库时,这个库在系统中只会被加载一次。这个特性减少了应用的内存占用。 + +另外一个值得注意的地方是,当一个共享库的 bug 被修复后,所有引用了这个库的应用都会受益。但这也意味着,如果一个 bug 还没被发现,那所有相关的应用都会遭受这个 bug 影响(如果这个应用使用了受影响的部分)。 + +当一个应用需要某个特定版本的库,但是链接器linker只知道某个不兼容版本的位置,对于初学者来说这个问题非常棘手。在这个场景下,你必须帮助链接器找到正确版本的路径。 + +尽管这不是一个每天都会遇到的问题,但是理解动态链接的原理总是有助于你修复类似的问题。 + +幸运的是,动态链接的机制其实非常简洁明了。 + +为了检查一个应用在启动时需要哪些库,你可以使用 `ldd` 命令,它会打印出给定文件所需的动态库: + +``` +$ ldd my_app +        linux-vdso.so.1 (0x00007ffd1299c000) +        libmy_shared.so => not found +        libc.so.6 => /lib64/libc.so.6 (0x00007f56b869b000) +        /lib64/ld-linux-x86-64.so.2 (0x00007f56b8881000) +``` + +可以注意到 `libmy_shared.so` 库是代码仓库的一部分,但是没有被找到。这是因为负责在应用启动之前将所有依赖加载进内存的动态链接器没有在它搜索的标准路径下找到这个库。 + +对新手来说,与常用库(例如 `bizp2`)版本不兼容相关的问题往往十分令人困惑。一种方法是把该仓库的路径加入到环境变量 `LD_LIBRARY_PATH` 中来告诉链接器去哪里找到正确的版本。在本例中,正确的版本就在这个目录下,所以你可以导出它至环境变量: + +``` +$ LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH +$ export LD_LIBRARY_PATH +``` + +现在动态链接器知道去哪找库了,应用也可以执行了。你可以再次执行 `ldd` 去调用动态链接器,它会检查应用的依赖然后加载进内存。内存地址会在对象路径后展示: + +``` +$ ldd my_app +        linux-vdso.so.1 (0x00007ffd385f7000) +        libmy_shared.so => /home/stephan/library_sample/libmy_shared.so (0x00007f3fad401000) +        libc.so.6 => /lib64/libc.so.6 (0x00007f3fad21d000) +        /lib64/ld-linux-x86-64.so.2 (0x00007f3fad408000) +``` + +想知道哪个链接器被调用了,你可以用 `file` 命令: + +``` +$ file my_app +my_app: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=26c677b771122b4c99f0fd9ee001e6c743550fa6, for GNU/Linux 3.2.0, not stripped +``` + +链接器 `/lib64/ld-linux-x86–64.so.2` 是一个指向 `ld-2.30.so` 的软链接,它也是我的 Linux 发行版的默认链接器: + +``` +$ file /lib64/ld-linux-x86-64.so.2 +/lib64/ld-linux-x86-64.so.2: symbolic link to ld-2.31.so +``` + +回头看看 `ldd` 命令的输出,你还可以看到(在 `libmy_shared.so` 边上)每个依赖都以一个数字结尾(例如 `/lib64/libc.so.6`)。共享对象的常见命名格式为: + +``` +libXYZ.so.. +``` + +在我的系统中,`libc.so.6` 也是指向同一目录下的共享对象 `libc-2.31.so` 的软链接。 + +``` +$ file /lib64/libc.so.6 +/lib64/libc.so.6: symbolic link to libc-2.31.so +``` + +如果你正在面对一个应用因为加载库的版本不对导致无法启动的问题,有很大可能你可以通过检查整理这些软链接或者确定正确的搜索路径(查看下方“动态加载器:ld.so”一节)来解决这个问题。 + +更为详细的信息请查看 [ldd 手册页][5]。 + +#### 动态加载 + +动态加载的意思是一个库(例如一个 `.so` 文件)在程序的运行时被加载。这是使用某种特定的编程方法实现的。 + +当一个应用使用可以在运行时改变的插件时,就会使用动态加载。 + +查看 [dlopen 手册页][6] 获取更多信息。 + +#### 动态加载器:ld.so + +在 Linux 系统中,你几乎总是正在跟共享库打交道,所以必须有个机制来检测一个应用的依赖并将其加载进内存中。 + +`ld.so` 按以下顺序在这些地方寻找共享对象: + + 1. 应用的绝对路径或相对路径下(用 GCC 编译器的 `-rpath` 选项硬编码的) + 2. 环境变量 `LD_LIBRARY_PATH` + 3. `/etc/ld.so.cache` 文件 + +需要记住的是,将一个库加到系统库归档 `/usr/lib64` 中需要管理员权限。你可以手动拷贝 `libmy_shared.so` 至库归档中来让应用可以运行,而避免设置 `LD_LIBRARY_PATH`。 + +``` +unset LD_LIBRARY_PATH +sudo cp libmy_shared.so /usr/lib64/ +``` + +当你运行 `ldd` 时,你现在可以看到归档库的路径被展示出来: + +``` +$ ldd my_app +        linux-vdso.so.1 (0x00007ffe82fab000) +        libmy_shared.so => /lib64/libmy_shared.so (0x00007f0a963e0000) +        libc.so.6 => /lib64/libc.so.6 (0x00007f0a96216000) +        /lib64/ld-linux-x86-64.so.2 (0x00007f0a96401000) +``` + +### 在编译时定制共享库 + +如果你想你的应用使用你的共享库,你可以在编译时指定一个绝对或相对路径。 + +编辑 `makefile`(第 10 行)然后通过 `make -B` 来重新编译程序。然后 `ldd` 输出显示 `libmy_shared.so` 和它的绝对路径一起被列出来了。 + +把这个: + +``` +CFLAGS =-Wall -Werror -Wl,-rpath,$(shell pwd) +``` + +改成这个(记得修改用户名): + +``` +CFLAGS =/home/stephan/library_sample/libmy_shared.so +``` + +然后重新编译: + +``` +$ make +``` + +确认下它正在使用你设定的绝对路径,你可以在输出的第二行看到: + +``` +$ ldd my_app +    linux-vdso.so.1 (0x00007ffe143ed000) +        libmy_shared.so => /lib64/libmy_shared.so (0x00007fe50926d000) +        /home/stephan/library_sample/libmy_shared.so (0x00007fe509268000) +        libc.so.6 => /lib64/libc.so.6 (0x00007fe50909e000) +        /lib64/ld-linux-x86-64.so.2 (0x00007fe50928e000) +``` + +这是个不错的例子,但是如果你在编写给其他人用的库,它是怎样工作的呢?新库的路径可以通过写入 `/etc/ld.so.conf` 或是在 `/etc/ld.so.conf.d/` 目录下创建一个包含路径的 `.conf` 文件来注册至系统。之后,你必须执行 `ldconfig` 命令来覆写 `ld.so.cache` 文件。这一步有时候在你装了携带特殊的共享库的程序来说是不可省略的。 + +查看 [ld.so 的手册页][7] 获取更多详细信息。 + +### 怎样处理多种架构 + +通常来说,32 位和 64 位版本的应用有不同的库。下面列表展示了不同 Linux 发行版库的标准路径: + +**红帽家族** + + * 32 位:`/usr/lib` + * 64 位:`/usr/lib64` + +**Debian 家族** + + * 32 位:`/usr/lib/i386-linux-gnu` + * 64 位:`/usr/lib/x86_64-linux-gnu` + +**Arch Linux 家族** + + * 32 位:`/usr/lib32` + * 64 位:`/usr/lib64` + +[FreeBSD][8](技术上来说不算 Linux 发行版) + + * 32 位:`/usr/lib32` + * 64 位:`/usr/lib` + +知道去哪找这些关键库可以让库链接失效的问题成为历史。 + +虽然刚开始会有点困惑,但是理解 Linux 库的依赖管理是一种对操作系统掌控感的表现。在其他应用程序中运行这些步骤,以熟悉常见的库,然后继续学习怎样解决任何你可能遇到的库的挑战。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/linux-libraries + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer) +[2]: https://github.com/hANSIc99/library_sample +[3]: https://en.wikipedia.org/wiki/Ar_%28Unix%29 +[4]: https://linuxhint.com/understanding_elf_file_format/ +[5]: https://www.man7.org/linux/man-pages/man1/ldd.1.html +[6]: https://www.man7.org/linux/man-pages/man3/dlopen.3.html +[7]: https://www.man7.org/linux/man-pages/man8/ld.so.8.html +[8]: https://opensource.com/article/20/5/furybsd-linux diff --git a/published/202104/20200707 Use systemd timers instead of cronjobs.md b/published/202104/20200707 Use systemd timers instead of cronjobs.md new file mode 100644 index 0000000000..81e4553369 --- /dev/null +++ b/published/202104/20200707 Use systemd timers instead of cronjobs.md @@ -0,0 +1,529 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13307-1.html) +[#]: subject: (Use systemd timers instead of cronjobs) +[#]: via: (https://opensource.com/article/20/7/systemd-timers) +[#]: author: (David Both https://opensource.com/users/dboth) + +使用 systemd 定时器代替 cron 作业 +====== + +> 定时器提供了比 cron 作业更为细粒度的事件控制。 + +![](https://img.linux.net.cn/data/attachment/album/202104/18/104406dgszkj3eeibkea55.jpg) + +我正在致力于将我的 [cron][2] 作业迁移到 systemd 定时器上。我已经使用定时器多年了,但通常来说,我的学识只足以支撑我当前的工作。但在我研究 [systemd 系列][3] 的过程中,我发现 systemd 定时器有一些非常有意思的能力。 + +与 cron 作业类似,systemd 定时器可以在特定的时间间隔触发事件(shell 脚本和程序),例如每天一次或在一个月中的特定某一天(或许只有在周一生效),或在从上午 8 点到下午 6 点的工作时间内每隔 15 分钟一次。定时器也可以做到 cron 作业无法做到的一些事情。举个例子,定时器可以在特定事件发生后的一段时间后触发一段脚本或者程序去执行,例如开机、启动、上个任务完成,甚至于定时器调用的上个服务单元的完成的时刻。 + +### 操作系统维护的计时器 + +当在一个新系统上安装 Fedora 或者是任意一个基于 systemd 的发行版时,作为系统维护过程的一部分,它会在 Linux 宿主机的后台中创建多个定时器。这些定时器会触发事件来执行必要的日常维护任务,比如更新系统数据库、清理临时目录、轮换日志文件,以及更多其他事件。 + +作为示例,我会查看一些我的主要工作站上的定时器,通过执行 `systemctl status *timer` 命令来展示主机上的所有定时器。星号的作用与文件通配相同,所以这个命令会列出所有的 systemd 定时器单元。 + +``` +[root@testvm1 ~]# systemctl status *timer +● mlocate-updatedb.timer - Updates mlocate database every day + Loaded: loaded (/usr/lib/systemd/system/mlocate-updatedb.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left + Triggers: ● mlocate-updatedb.service + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Updates mlocate database every day. + +● logrotate.timer - Daily rotation of log files + Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left + Triggers: ● logrotate.service + Docs: man:logrotate(8) + man:logrotate.conf(5) + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily rotation of log files. + +● sysstat-summary.timer - Generate summary of yesterday's process accounting + Loaded: loaded (/usr/lib/systemd/system/sysstat-summary.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Fri 2020-06-05 00:07:00 EDT; 15h left + Triggers: ● sysstat-summary.service + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Generate summary of yesterday's process accounting. + +● fstrim.timer - Discard unused blocks once a week + Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Mon 2020-06-08 00:00:00 EDT; 3 days left + Triggers: ● fstrim.service + Docs: man:fstrim + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Discard unused blocks once a week. + +● sysstat-collect.timer - Run system activity accounting tool every 10 minutes + Loaded: loaded (/usr/lib/systemd/system/sysstat-collect.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Thu 2020-06-04 08:50:00 EDT; 41s left + Triggers: ● sysstat-collect.service + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Run system activity accounting tool every 10 minutes. + +● dnf-makecache.timer - dnf makecache --timer + Loaded: loaded (/usr/lib/systemd/system/dnf-makecache.timer; enabled; vendor preset: enabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Thu 2020-06-04 08:51:00 EDT; 1min 41s left + Triggers: ● dnf-makecache.service + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started dnf makecache –timer. + +● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories + Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled) + Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago + Trigger: Fri 2020-06-05 08:19:00 EDT; 23h left + Triggers: ● systemd-tmpfiles-clean.service + Docs: man:tmpfiles.d(5) + man:systemd-tmpfiles(8) + +Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily Cleanup of Temporary Directories. +``` + +每个定时器至少有六行相关信息: + + * 定时器的第一行有定时器名字和定时器目的的简短介绍 + * 第二行展示了定时器的状态,是否已加载,定时器单元文件的完整路径以及预设信息。 + * 第三行指明了其活动状态,包括该定时器激活的日期和时间。 + * 第四行包括了该定时器下次被触发的日期和时间和距离触发的大概时间。 + * 第五行展示了被定时器触发的事件或服务名称。 + * 部分(不是全部)systemd 单元文件有相关文档的指引。我虚拟机上输出中有三个定时器有文档指引。这是一个很好(但非必要)的信息。 + * 最后一行是计时器最近触发的服务实例的日志条目。 + +你也许有一些不一样的定时器,取决于你的主机。 + +### 创建一个定时器 + +尽管我们可以解构一个或多个现有的计时器来了解其工作原理,但让我们创建我们自己的 [服务单元][4] 和一个定时器去触发它。为了保持简单,我们将使用一个相当简单的例子。当我们完成这个实验之后,就能更容易理解其他定时器的工作原理以及发现它们正在做什么。 + +首先,创建一个运行基础东西的简单的服务,例如 `free` 命令。举个例子,你可能想定时监控空余内存。在 `/etc/systemd/system` 目录下创建如下的 `myMonitor.server` 单元文件。它不需要是可执行文件: + +``` +# This service unit is for testing timer units +# By David Both +# Licensed under GPL V2 +# + +[Unit] +Description=Logs system statistics to the systemd journal +Wants=myMonitor.timer + +[Service] +Type=oneshot +ExecStart=/usr/bin/free + +[Install] +WantedBy=multi-user.target +``` + +这大概是你能创建的最简单的服务单元了。现在我们查看一下服务状态同时测试一下服务单元确保它和我们预期一样可用。 + + +``` +[root@testvm1 system]# systemctl status myMonitor.service +● myMonitor.service - Logs system statistics to the systemd journal + Loaded: loaded (/etc/systemd/system/myMonitor.service; disabled; vendor preset: disabled) + Active: inactive (dead) +[root@testvm1 system]# systemctl start myMonitor.service +[root@testvm1 system]# +``` + +输出在哪里呢?默认情况下,systemd 服务单元执行程序的标准输出(`STDOUT`)会被发送到系统日志中,它保留了记录供现在或者之后(直到某个时间点)查看。(在本系列的后续文章中,我将介绍系统日志的记录和保留策略)。专门查看你的服务单元的日志,而且只针对今天。`-S` 选项,即 `--since` 的缩写,允许你指定 `journalctl` 工具搜索条目的时间段。这并不代表你不关心过往结果 —— 在这个案例中,不会有过往记录 —— 如果你的机器以及运行了很长时间且堆积了大量的日志,它可以缩短搜索时间。 + +``` +[root@testvm1 system]# journalctl -S today -u myMonitor.service +-- Logs begin at Mon 2020-06-08 07:47:20 EDT, end at Thu 2020-06-11 09:40:47 EDT. -- +Jun 11 09:12:09 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 11 09:12:09 testvm1.both.org free[377966]: total used free shared buff/cache available +Jun 11 09:12:09 testvm1.both.org free[377966]: Mem: 12635740 522868 11032860 8016 1080012 11821508 +Jun 11 09:12:09 testvm1.both.org free[377966]: Swap: 8388604 0 8388604 +Jun 11 09:12:09 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +[root@testvm1 system]# +``` + +由服务触发的任务可以是单个程序、一组程序或者是一个脚本语言写的脚本。通过在 `myMonitor.service` 单元文件里的 `[Service]` 块末尾中添加如下行可以为服务添加另一个任务: + +``` +ExecStart=/usr/bin/lsblk +``` + +再次启动服务,查看日志检查结果,结果应该看上去像这样。你应该在日志中看到两条命令的结果输出: + +``` +Jun 11 15:42:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 11 15:42:18 testvm1.both.org free[379961]: total used free shared buff/cache available +Jun 11 15:42:18 testvm1.both.org free[379961]: Mem: 12635740 531788 11019540 8024 1084412 11812272 +Jun 11 15:42:18 testvm1.both.org free[379961]: Swap: 8388604 0 8388604 +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sda 8:0 0 120G 0 disk +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─sda1 8:1 0 4G 0 part /boot +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: └─sda2 8:2 0 116G 0 part +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-root 253:0 0 5G 0 lvm / +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP] +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-usr 253:2 0 30G 0 lvm /usr +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-var 253:4 0 20G 0 lvm /var +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: └─VG01-home 253:5 0 10G 0 lvm /home +Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sr0 11:0 1 1024M 0 rom +Jun 11 15:42:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +Jun 11 15:42:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal. +``` + +现在你知道了你的服务可以按预期工作了,在 `/etc/systemd/system` 目录下创建 `myMonitor.timer` 定时器单元文件,添加如下代码: + +``` +# This timer unit is for testing +# By David Both +# Licensed under GPL V2 +# + +[Unit] +Description=Logs some system statistics to the systemd journal +Requires=myMonitor.service + +[Timer] +Unit=myMonitor.service +OnCalendar=*-*-* *:*:00 + +[Install] +WantedBy=timers.target +``` + +在 `myMonitor.timer` 文件中的 `OnCalendar` 时间格式,`*-*-* *:*:00`,应该会每分钟触发一次定时器去执行 `myMonitor.service` 单元。我会在文章的后面进一步探索 `OnCalendar` 设置。 + +到目前为止,在服务被计时器触发运行时观察与之有关的日志记录。你也可以跟踪计时器,跟踪服务可以让你接近实时的看到结果。执行 `journalctl` 时带上 `-f` 选项: + +``` +[root@testvm1 system]# journalctl -S today -f -u myMonitor.service +-- Logs begin at Mon 2020-06-08 07:47:20 EDT. -- +``` + +执行但是不启用该定时器,看看它运行一段时间后发生了什么: + +``` +[root@testvm1 ~]# systemctl start myMonitor.service +[root@testvm1 ~]# +``` + +一条结果立即就显示出来了,下一条大概在一分钟后出来。观察几分钟日志,看看你有没有跟我发现同样的事情: + +``` +[root@testvm1 system]# journalctl -S today -f -u myMonitor.service +-- Logs begin at Mon 2020-06-08 07:47:20 EDT. -- +Jun 13 08:39:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 13 08:39:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +Jun 13 08:39:19 testvm1.both.org free[630566]: total used free shared buff/cache available +Jun 13 08:39:19 testvm1.both.org free[630566]: Mem: 12635740 556604 10965516 8036 1113620 11785628 +Jun 13 08:39:19 testvm1.both.org free[630566]: Swap: 8388604 0 8388604 +Jun 13 08:39:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal. +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sda 8:0 0 120G 0 disk +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─sda1 8:1 0 4G 0 part /boot +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: └─sda2 8:2 0 116G 0 part +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-root 253:0 0 5G 0 lvm / +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP] +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-usr 253:2 0 30G 0 lvm /usr +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-var 253:4 0 20G 0 lvm /var +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: └─VG01-home 253:5 0 10G 0 lvm /home +Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sr0 11:0 1 1024M 0 rom +Jun 13 08:40:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 13 08:40:46 testvm1.both.org free[630572]: total used free shared buff/cache available +Jun 13 08:40:46 testvm1.both.org free[630572]: Mem: 12635740 555228 10966836 8036 1113676 11786996 +Jun 13 08:40:46 testvm1.both.org free[630572]: Swap: 8388604 0 8388604 +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sda 8:0 0 120G 0 disk +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─sda1 8:1 0 4G 0 part /boot +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: └─sda2 8:2 0 116G 0 part +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-root 253:0 0 5G 0 lvm / +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP] +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-usr 253:2 0 30G 0 lvm /usr +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-var 253:4 0 20G 0 lvm /var +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: └─VG01-home 253:5 0 10G 0 lvm /home +Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sr0 11:0 1 1024M 0 rom +Jun 13 08:40:46 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +Jun 13 08:40:46 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal. +Jun 13 08:41:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal... +Jun 13 08:41:46 testvm1.both.org free[630580]: total used free shared buff/cache available +Jun 13 08:41:46 testvm1.both.org free[630580]: Mem: 12635740 553488 10968564 8036 1113688 11788744 +Jun 13 08:41:46 testvm1.both.org free[630580]: Swap: 8388604 0 8388604 +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sda 8:0 0 120G 0 disk +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─sda1 8:1 0 4G 0 part /boot +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: └─sda2 8:2 0 116G 0 part +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-root 253:0 0 5G 0 lvm / +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP] +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-usr 253:2 0 30G 0 lvm /usr +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-var 253:4 0 20G 0 lvm /var +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: └─VG01-home 253:5 0 10G 0 lvm /home +Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sr0 11:0 1 1024M 0 rom +Jun 13 08:41:47 testvm1.both.org systemd[1]: myMonitor.service: Succeeded. +Jun 13 08:41:47 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal. +``` + +别忘了检查下计时器和服务的状态。 + +你在日志里大概至少注意到两件事。第一,你不需要特地做什么来让 `myMonitor.service` 单元中 `ExecStart` 触发器产生的 `STDOUT` 存储到日志里。这都是用 systemd 来运行服务的一部分功能。然而,它确实意味着你需要小心对待服务单元里面执行的脚本和它们能产生多少 `STDOUT`。 + +第二,定时器并不是精确在每分钟的 :00 秒执行的,甚至每次执行的时间间隔都不是刚好一分钟。这是特意的设计,但是有必要的话可以改变这种行为(如果只是它挑战了你的系统管理员的敏感神经)。 + +这样设计的初衷是为了防止多个服务在完全相同的时刻被触发。举个例子,你可以用例如 Weekly,Daily 等时间格式。这些快捷写法都被定义为在某一天的 00:00:00 执行。当多个定时器都这样定义的话,有很大可能它们会同时执行。 + +systemd 定时器被故意设计成在规定时间附近随机波动的时间点触发,以避免同一时间触发。它们在一个时间窗口内半随机触发,时间窗口开始于预设的触发时间,结束于预设时间后一分钟。根据 `systemd.timer` 的手册页,这个触发时间相对于其他已经定义的定时器单元保持在稳定的位置。你可以在日志条目中看到,定时器在启动后立即触发,然后在每分钟后的 46 或 47 秒触发。 + +大部分情况下,这种概率抖动的定时器是没事的。当调度类似执行备份的任务,只需要它们在下班时间运行,这样是没问题的。系统管理员可以选择确定的开始时间来确保不和其他任务冲突,例如 01:05:00 这样典型的 cron 作业时间,但是有很大范围的时间值可以满足这一点。在开始时间上的一个分钟级别的随机往往是无关紧要的。 + +然而,对某些任务来说,精确的触发时间是个硬性要求。对于这类任务,你可以向单元文件的 `Timer` 块中添加如下声明来指定更高的触发时间跨度精确度(精确到微秒以内): + +``` +AccuracySec=1us +``` + +时间跨度可用于指定所需的精度,以及定义重复事件或一次性事件的时间跨度。它能识别以下单位: + + * `usec`、`us`、`µs` + * `msec`、`ms` + * `seconds`、`second`、`sec`、`s` + * `minutes`、`minute`、`min`、`m` + * `hours`、`hour`、`hr`、`h` + * `days`、`day`、`d` + * `weeks`、`week`、`w` + * `months`、`month`、`M`(定义为 30.44 天) + * `years`、`year`、`y`(定义为 365.25 天) + +所有 `/usr/lib/systemd/system` 中的定时器都指定了一个更宽松的时间精度,因为精准时间没那么重要。看看这些系统创建的定时器的时间格式: + +``` +[root@testvm1 system]# grep Accur /usr/lib/systemd/system/*timer +/usr/lib/systemd/system/fstrim.timer:AccuracySec=1h +/usr/lib/systemd/system/logrotate.timer:AccuracySec=1h +/usr/lib/systemd/system/logwatch.timer:AccuracySec=12h +/usr/lib/systemd/system/mlocate-updatedb.timer:AccuracySec=24h +/usr/lib/systemd/system/raid-check.timer:AccuracySec=24h +/usr/lib/systemd/system/unbound-anchor.timer:AccuracySec=24h +[root@testvm1 system]# +``` + +看下 `/usr/lib/systemd/system` 目录下部分定时器单元文件的完整内容,看看它们是如何构建的。 + +在本实验中不必让这个定时器在启动时激活,但下面这个命令可以设置开机自启: + +``` +[root@testvm1 system]# systemctl enable myMonitor.timer +``` + +你创建的单元文件不需要是可执行的。你同样不需要启用服务,因为它是被定时器触发的。如果你需要的话,你仍然可以在命令行里手动触发该服务单元。尝试一下,然后观察日志。 + +关于定时器精度、事件时间规格和触发事件的详细信息,请参见 systemd.timer 和 systemd.time 的手册页。 + +### 定时器类型 + +systemd 定时器还有一些在 cron 中找不到的功能,cron 只在确定的、重复的、具体的日期和时间触发。systemd 定时器可以被配置成根据其他 systemd 单元状态发生改变时触发。举个例子,定时器可以配置成在系统开机、启动后,或是某个确定的服务单元激活之后的一段时间被触发。这些被称为单调计时器。“单调”指的是一个持续增长的计数器或序列。这些定时器不是持久的,因为它们在每次启动后都会重置。 + +表格 1 列出了一些单调定时器以及每个定时器的简短定义,同时有 `OnCalendar` 定时器,这些不是单调的,它们被用于指定未来有可能重复的某个确定时间。这个信息来自于 `systemd.timer` 的手册页,有一些不重要的修改。 + +定时器 | 单调性 | 定义 +---|---|--- +`OnActiveSec=` | X | 定义了一个与定时器被激活的那一刻相关的定时器。 +`OnBootSec=` | X | 定义了一个与机器启动时间相关的计时器。 +`OnStartupSec=` | X | 定义了一个与服务管理器首次启动相关的计时器。对于系统定时器来说,这个定时器与 `OnBootSec=` 类似,因为系统服务管理器在机器启动后很短的时间后就会启动。当以在每个用户服务管理器中运行的单元进行配置时,它尤其有用,因为用户的服务管理器通常在首次登录后启动,而不是机器启动后。 +`OnUnitActiveSec=` | X | 定义了一个与将要激活的定时器上次激活时间相关的定时器。 +`OnUnitInactiveSec=` | X | 定义了一个与将要激活的定时器上次停用时间相关的定时器。 +`OnCalendar=` | | 定义了一个有日期事件表达式语法的实时(即时钟)定时器。查看 `systemd.time(7)` 的手册页获取更多与日历事件表达式相关的语法信息。除此以外,它的语义和 `OnActiveSec=` 类似。 + +_Table 1: systemd 定时器定义_ + +单调计时器可使用同样的简写名作为它们的时间跨度,即我们之前提到的 `AccuracySec` 表达式,但是 systemd 将这些名字统一转换成了秒。举个例子,比如你想规定某个定时器在系统启动后五天触发一次事件;它可能看起来像 `OnBootSec=5d`。如果机器启动于 `2020-06-15 09:45:27`,这个定时器会在 `2020-06-20 09:45:27` 或在这之后的一分钟内触发。 + +### 日历事件格式 + +日历事件格式是定时器在所需的重复时间触发的关键。我们开始看下一些 `OnCalendar` 设置一起使用的格式。 + +与 crontab 中的格式相比,systemd 及其计时器使用的时间和日历格式风格不同。它比 crontab 更为灵活,而且可以使用类似 `at` 命令的方式允许模糊的日期和时间。它还应该足够熟悉使其易于理解。 + +systemd 定时器使用 `OnCalendar=` 的基础格式是 `DOW YYYY-MM-DD HH:MM:SS`。DOW(星期几)是选填的,其他字段可以用一个星号(`*`)来匹配此位置的任意值。所有的日历时间格式会被转换成标准格式。如果时间没有指定,它会被设置为 `00:00:00`。如果日期没有指定但是时间指定了,那么下次匹配的时间可能是今天或者明天,取决于当前的时间。月份和星期可以使用名称或数字。每个单元都可以使用逗号分隔的列表。单元范围可以在开始值和结束值之间用 `..` 指定。 + +指定日期有一些有趣的选项,波浪号(`~`)可以指定月份的最后一天或者最后一天之前的某几天。`/` 可以用来指定星期几作为修饰符。 + +这里有几个在 `OnCalendar` 表达式中使用的典型时间格式例子。 + +日期事件格式 | 描述 +---|--- +`DOW YYYY-MM-DD HH:MM:SS` | +`*-*-* 00:15:30` | 每年每月每天的 0 点 15 分 30 秒 +`Weekly` | 每个周一的 00:00:00 +`Mon *-*-* 00:00:00` | 同上 +`Mon` | 同上 +`Wed 2020-*-*` | 2020 年每个周三的 00:00:00 +`Mon..Fri 2021-*-*` | 2021 年的每个工作日(周一到周五)的 00:00:00 +`2022-6,7,8-1,15 01:15:00` | 2022 年 6、7、8 月的 1 到 15 号的 01:15:00 +`Mon *-05~03` | 每年五月份的下个周一同时也是月末的倒数第三天 +`Mon..Fri *-08~04` | 任何年份 8 月末的倒数第四天,同时也须是工作日 +`*-05~03/2` | 五月末的倒数第三天,然后 2 天后再来一次。每年重复一次。注意这个表达式使用了波浪号(`~`)。 +`*-05-03/2` | 五月的第三天,然后每两天重复一次直到 5 月底。注意这个表达式使用了破折号(`-`)。 + +_Table 2: `OnCalendar` 事件时间格式例子_ + + +### 测试日历格式 + +systemd 提供了一个绝佳的工具用于检测和测试定时器中日历时间事件的格式。`systemd-analyze calendar` 工具解析一个时间事件格式,提供标准格式和其他有趣的信息,例如下次“经过”(即匹配)的日期和时间,以及距离下次触发之前大概时间。 + +首先,看看未来没有时间的日(注意 `Next elapse` 和 `UTC` 的时间会根据你当地时区改变): + +``` +[student@studentvm1 ~]$ systemd-analyze calendar 2030-06-17 +  Original form: 2030-06-17                 +Normalized form: 2030-06-17 00:00:00         +    Next elapse: Mon 2030-06-17 00:00:00 EDT +       (in UTC): Mon 2030-06-17 04:00:00 UTC +       From now: 10 years 0 months left     +[root@testvm1 system]# +``` + +现在添加一个时间,在这个例子中,日期和时间是当作无关的部分分开解析的: + +``` +[root@testvm1 system]# systemd-analyze calendar 2030-06-17 15:21:16 +  Original form: 2030-06-17                 +Normalized form: 2030-06-17 00:00:00         +    Next elapse: Mon 2030-06-17 00:00:00 EDT +       (in UTC): Mon 2030-06-17 04:00:00 UTC +       From now: 10 years 0 months left     + +  Original form: 15:21:16                   +Normalized form: *-*-* 15:21:16             +    Next elapse: Mon 2020-06-15 15:21:16 EDT +       (in UTC): Mon 2020-06-15 19:21:16 UTC +       From now: 3h 55min left               +[root@testvm1 system]# +``` + +为了把日期和时间当作一个单元来分析,可以把它们包在引号里。你在定时器单元里 `OnCalendar=` 时间格式中使用的时候记得把引号去掉,否则会报错: + +``` +[root@testvm1 system]# systemd-analyze calendar "2030-06-17 15:21:16" +Normalized form: 2030-06-17 15:21:16         +    Next elapse: Mon 2030-06-17 15:21:16 EDT +       (in UTC): Mon 2030-06-17 19:21:16 UTC +       From now: 10 years 0 months left     +[root@testvm1 system]# +``` + +现在我们测试下 Table2 里的例子。我尤其喜欢最后一个: + +``` +[root@testvm1 system]# systemd-analyze calendar "2022-6,7,8-1,15 01:15:00" +  Original form: 2022-6,7,8-1,15 01:15:00 +Normalized form: 2022-06,07,08-01,15 01:15:00 +    Next elapse: Wed 2022-06-01 01:15:00 EDT +       (in UTC): Wed 2022-06-01 05:15:00 UTC +       From now: 1 years 11 months left +[root@testvm1 system]# +``` + +让我们看一个例子,这个例子里我们列出了时间表达式的五个经过时间。 + +``` +[root@testvm1 ~]# systemd-analyze calendar --iterations=5 "Mon *-05~3" +  Original form: Mon *-05~3                 +Normalized form: Mon *-05~03 00:00:00       +    Next elapse: Mon 2023-05-29 00:00:00 EDT +       (in UTC): Mon 2023-05-29 04:00:00 UTC +       From now: 2 years 11 months left     +       Iter. #2: Mon 2028-05-29 00:00:00 EDT +       (in UTC): Mon 2028-05-29 04:00:00 UTC +       From now: 7 years 11 months left     +       Iter. #3: Mon 2034-05-29 00:00:00 EDT +       (in UTC): Mon 2034-05-29 04:00:00 UTC +       From now: 13 years 11 months left     +       Iter. #4: Mon 2045-05-29 00:00:00 EDT +       (in UTC): Mon 2045-05-29 04:00:00 UTC +       From now: 24 years 11 months left     +       Iter. #5: Mon 2051-05-29 00:00:00 EDT +       (in UTC): Mon 2051-05-29 04:00:00 UTC +       From now: 30 years 11 months left     +[root@testvm1 ~]# +``` + +这些应该为你提供了足够的信息去开始测试你的 `OnCalendar` 时间格式。`systemd-analyze` 工具可用于其他有趣的分析,我会在这个系列的下一篇文章来探索这些。 + +### 总结 + +systemd 定时器可以用于执行和 cron 工具相同的任务,但是通过按照日历和单调时间格式去触发事件的方法提供了更多的灵活性。 + +虽然你为此次实验创建的服务单元通常是由定时器调用的,你也可以随时使用 `systemctl start myMonitor.service` 命令去触发它。可以在一个定时器中编写多个维护任务的脚本;它们可以是 Bash 脚本或者其他 Linux 程序。你可以通过触发定时器来运行所有的脚本来运行服务,也可以按照需要执行单独的脚本。 + +我会在下篇文章中更加深入的探索 systemd 时间格式的用处。 + +我还没有看到任何迹象表明 cron 和 at 将被废弃。我希望这种情况不会发生,因为至少 `at` 在执行一次性调度任务的时候要比 systemd 定时器容易的多。 + +### 参考资料 + +网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息。 + + * Fedora 项目有一篇切实好用的 [systemd 入门][5],它囊括了几乎所有你需要知道的关于如何使用 systemd 配置、管理和维护 Fedora 计算机的信息。 + * Fedora 项目也有一个不错的 [备忘录][6],交叉引用了过去 SystemV 命令和 systemd 命令做对比。 + * 关于 systemd 的技术细节和创建这个项目的原因,请查看 [Freedesktop.org][7] 上的 [systemd 描述][8]。 + * [Linux.com][9] 的“更多 systemd 的乐趣”栏目提供了更多高级的 systemd [信息和技巧][10]。 + +此外,还有一系列深度的技术文章,是由 systemd 的设计者和主要实现者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间,但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章: + + * [Rethinking PID 1][11] + * [systemd for Administrators,Part I][12] + * [systemd for Administrators,Part II][13] + * [systemd for Administrators,Part III][14] + * [systemd for Administrators,Part IV][15] + * [systemd for Administrators,Part V][16] + * [systemd for Administrators,Part VI][17] + * [systemd for Administrators,Part VII][18] + * [systemd for Administrators,Part VIII][19] + * [systemd for Administrators,Part IX][20] + * [systemd for Administrators,Part X][21] + * [systemd for Administrators,Part XI][22] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/systemd-timers + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist) +[2]: https://opensource.com/article/17/11/how-use-cron-linux +[3]: https://opensource.com/users/dboth +[4]: https://opensource.com/article/20/5/manage-startup-systemd +[5]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[6]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[7]: http://Freedesktop.org +[8]: http://www.freedesktop.org/wiki/Software/systemd +[9]: http://Linux.com +[10]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[11]: http://0pointer.de/blog/projects/systemd.html +[12]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[13]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[14]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[15]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[16]: http://0pointer.de/blog/projects/three-levels-of-off.html +[17]: http://0pointer.de/blog/projects/changing-roots +[18]: http://0pointer.de/blog/projects/blame-game.html +[19]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[20]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[21]: http://0pointer.de/blog/projects/instances.html +[22]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202104/20201106 11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer.md b/published/202104/20201106 11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer.md new file mode 100644 index 0000000000..6ab0eb1e6f --- /dev/null +++ b/published/202104/20201106 11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer.md @@ -0,0 +1,317 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13326-1.html) +[#]: subject: (11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer) +[#]: via: (https://itsfoss.com/32-bit-linux-distributions/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +14 种可以在古老的 32 位计算机上使用的 Linux 发行版 +====== + +如果你一直关注最新的 [Linux 发行版][1],那么你一定已经注意到,[大多数流行的 Linux 发行版][2] 已经终止了 32 位支持。Arch Linux、Ubuntu、Fedora,每一个都已经放弃了对这种较旧架构的支持。 + +但是,如果你拥有仍然需要再利用的老式硬件,或者想将其用于某些用途,该怎么办?不用担心,你的 32 位系统还有一些选择。 + +在本文中,我试图汇编一些最好的 Linux 发行版,这些发行版将在未来几年继续支持 32 位平台。 + +### 仍提供 32 位支持的最佳 Linux 发行版 + +![][3] + +此列表与 [我们之前的支持旧笔记本电脑的 Linux 发行版列表][4] 略有不同。即使是 64 位计算机,如果是在 2010 年之前发布的,那么也可以认为它们是旧的。这就是为什么其中列出的一些建议包括现在仅支持 64 位版本的发行版的原因。 + +根据我的知识和认知,此处提供的信息是正确的,但是如果你发现有误,请在评论部分让我知道。 + +在继续之前,我认为你知道 [如何检查你拥有的是否是 32 位或 64 位计算机][5]。 + +#### 1、Debian + +![图片来源: mrneilypops / Deviantart][6] + +对于 32 位系统,[Debian][11] 是一个绝佳的选择,因为他们的最新的稳定版本仍然支持它。在撰写本文时,最新的稳定发行版 **Debian 10 “buster”** 提供了 32 位版本,并一直支持到 2024 年。 + +如果你是 Debian 的新手,值得一提的是,你可以在 [官方 Wiki][7] 上获得有关其所有内容的可靠文档。因此,上手应该不是问题。 + +你可以浏览 [可用的安装程序][8] 进行安装。但是,在开始之前,除了 [安装手册][10] 外,我建议你参考 [安装 Debian 之前要记住的事情][9] 列表。 + +最低系统要求: + +- 512 MB 内存 +- 10 GB 磁盘空间 +- 1 GHz 处理器(奔腾 4 或同等水平) + +#### 2、Slax + +![][12] + +如果你只是想快速启动设备以进行一些临时工作,[Slax][13] 是一个令人印象深刻的选择。 + +它基于 Debian,但它通过 USB 设备或 DVD 运行旨在成为一种便携且快速的选项。你可以从他们的网站免费下载 32 位 ISO 文件,或购买预装有 Slax 的可擦写 DVD 或加密的闪存盘。 + +当然,这并不是要取代传统的桌面操作系统。但是,是的,你确实获得了以 Debian 为基础的 32 位支持。 + +最低系统要求: + +- 内存:128MB(离线使用)/ 512MB(用于网页浏览器使用) +- CPU: i686 或更新版本 + +#### 3、AntiX + +![图片来源: Opensourcefeed][14] + +[AntiX][15] 是另一个令人印象深刻的基于 Debian 的发行版。AntiX 是众所周知的无 systemd 发行版,该发行版侧重于性能,是一个轻量级的系统。 + +它完全适合于所有老式的 32 位系统。它只需要低至 256 MB 内存和 2.7 GB 存储空间。不仅易于安装,而且用户体验也是针对新手和有经验的用户的。 + +你应该可以得到基于 Debian 的最新稳定分支的最新版本。 + +最低系统要求: + +- 内存:256 MB 的内存 +- CPU:奔腾 3 系统 +- 磁盘空间:5GB 的驱动器空间 + +#### 4、openSUSE + +![][16] + +[openSUSE][18] 是一个独立的 Linux 发行版,也支持 32 位系统。实际上最新的常规版本(Leap)不提供 32 位镜像,但滚动发行版本(Tumbleweed)确实提供了 32 位镜像。 + +如果你是新手,那将是完全不同的体验。但是,我建议你仔细阅读 [为什么要使用 openSUSE 的原因][17]。 + +它主要面向开发人员和系统管理员,但也可以将其用作普通桌面用户。值得注意的是,openSUSE 不意味在老式硬件上运行,因此必须确保至少有 2 GB 内存、40+ GB 存储空间和双核处理器。 + +最低系统要求: +- 奔腾 4 1.6 GHz 或更高的处理器 +- 1GB 物理内存 +- 5 GB 硬盘 + +#### 5、Emmabuntüs + +![][19] + +[Emmanbuntus][20] 是一个有趣的发行版,旨在通过 32 位支持来延长硬件的使用寿命,以减少原材料的浪费。作为一个团体,他们还参与向学校提供计算机和数字技术的工作。 + +它提供了两个不同的版本,一个基于 Ubuntu,另一个基于 Debian。如果你需要更长久的 32 位支持,则可能要使用 Debian 版本。它可能不是最好的选择,但是它具有许多预配置的软件来简化 Linux 学习体验,并提供 32 位支持,如果你希望在此过程中支持他们的事业,那么这是一个相当不错的选择。 + +最低系统要求: + +- 512MB 内存 +- 硬盘驱动器:2GB +- 奔腾处理器或同等配置 + +#### 6、NixOS + +![Nixos KDE Edition \(图片来源: Distrowatch\)][21] + +[NixOS][23] 是另一个支持 32 位系统的独立 Linux 发行版。它着重于提供一个可靠的系统,其中程序包彼此隔离。 + +这可能不是直接面向普通用户,但它是一个 KDE 支持的可用发行版,具有独特的软件包管理方式。你可以从其官方网站上了解有关其 [功能][22] 的更多信息。 + +最低系统要求: + +- 内存:768 MB +- 8GB 磁盘空间 +- 奔腾 4 或同等水平 + +#### 7、Gentoo Linux + +![][24] + +如果你是经验丰富的 Linux 用户,并且正在寻找 32 位 Linux 发行版,那么 [Gentoo Linux][26] 应该是一个不错的选择。 + +如果需要,你可以使用 Gentoo Linux 的软件包管理器轻松配置、编译和安装内核。不仅限于众所周知的可配置性,你还可以在较旧的硬件上运行而不会出现任何问题。 + +即使你不是经验丰富的用户,也想尝试一下,只需阅读 [安装说明][25],就可以大胆尝试了。 + +最低系统要求: + +- 256MB 内存 +- 奔腾 4 或 AMD 的同类产品 +- 2.5 GB 磁盘空间 + +#### 8、Devuan + +![][27] + +[Devuan][30] 是另一种无 systemd 的发行版。从技术上讲,它是 Debian 的一个分支,只是没有 systemd ,并鼓励 [初始化系统自由][29]。 + +对于普通用户来说,它可能不是一个非常流行的 Linux 发行版,但是如果你想要一个无 systemd 的发行版和 32 位支持,Devuan 应该是一个不错的选择。 + +最低系统要求: + +- 内存:1GB +- CPU:奔腾 1.0GHz + +#### 9、Void Linux + +![][31] + +[Void Linux][33] 是由志愿者独立开发的有趣发行版。它旨在成为一个通用的操作系统,同时提供稳定的滚动发布周期。它以 runit 作为初始化系统替代 systemd,并为你提供了多个 [桌面环境][32] 选择。 + +它具有非常令人印象深刻的最低需求规格,只需 96 MB 的内存配以奔腾 4 或等同的芯片。试试看吧! + +最低系统要求: + +- 96MB 内存 +- 奔腾 4 或相当的 AMD 处理器 + +#### 10、Q4OS + +![][34] + +[Q4OS][37] 是另一个基于 Debian 的发行版,致力于提供极简和快速的桌面用户体验。它也恰好是我们的 [最佳轻量级 Linux 发行版][4] 列表中的一个。它的 32 位版本具有 [Trinity 桌面][35],你可以在 64 位版本上找到 KDE Plasma 支持。 + +与 Void Linux 类似,Q4OS 可以运行在至低 128 MB 的内存和 300 MHz 的 CPU 上,需要 3 GB 的存储空间。对于任何老式硬件来说,它应该绰绰有余。因此,我想说,你绝对应该尝试一下! + +要了解更多信息,你还可以查看 [我们对 Q4OS 的点评][36]。 + +Q4OS 的最低要求: + +- 内存:128MB(Trinity 桌面)/ 1GB(Plasma 桌面) +- CPU:300 MHz(Trinity 桌面)/ 1 GHz(Plasma 桌面) +- 存储空间:5GB(Trinity 桌面)/3GB(Plasma 桌面) + +#### 11、MX Linux + +![][38] + +如果有一个稍微不错的配置(不完全是老式的,而是旧的),对于 32 位系统,我个人推荐 [MX Linux][39]。它也恰好是适合各种类型用户的 [最佳 Linux 发行版][2] 之一。 + +通常,MX Linux 是基于 Debian 的出色的轻量级和可定制的发行版。你可以选择 KDE、XFce 或 Fluxbox(这是他们自己为旧硬件设计的桌面环境)。你可以在他们的官方网站上找到更多关于它的信息,并尝试一下。 + +最低系统要求: + +- 1GB 内存(建议使用 2GB,以便舒适地使用) +- 15GB 的磁盘空间(建议 20GB) + + +#### 12、Linux Mint Debian Edtion + +![][44] + +[基于 Debian 的 Linux Mint][45]?为什么不可以呢? + +你可以得到同样的 Cinnamon 桌面体验,只是不基于 Ubuntu。它和基于 Ubuntu 的 Linux Mint 一样容易使用,一样可靠。 + +不仅仅是基于 Debian,你还可以得到对 64 位和 32 位系统的支持。如果你不想在 32 位系统上使用一个你从未听说过的 Linux 发行版,这应该是一个不错的选择。 + +最低系统要求: + +- 1GB 内存(建议使用 2GB,以便舒适地使用) +- 15GB 的磁盘空间(建议 20GB) + +#### 13、Sparky Linux + +![][46] + +[Sparky Linux][47] 是 [为初学者定制的最好的轻量级 Linux 发行版][4] 之一。它很容易定制,而且资源占用很少。 + +它可以根据你的要求提供不同的版本,但它确实支持 32 位版本。考虑到你想为你的旧电脑买点东西,我建议你看看它的 MinimalGUI 版本,除非你真的需要像 Xfce 或 LXQt 这样成熟的桌面环境。 + +最低系统要求: + +- 内存:512 MB +- CPU:奔腾 4,或 AMD Athlon +- 磁盘空间:2GB(命令行版),10GB(家庭版),20GB(游戏版) + +#### 14、Mageia + +![][48] + +作为 [Mandriva Linux][49] 的分支,[Mageia Linux][50] 是一个由社区推动的 Linux 发行版,支持 32 位系统。 + +通常情况下,你会注意到每年都有一个重大版本。他们的目的是贡献他们的工作,以提供一个自由的操作系统,这也是潜在的安全。对于 32 位系统来说,它可能不是一个流行的选择,但它支持很多桌面环境(如 KDE Plasma、GNOME),如果你需要,你只需要从它的软件库中安装它。 + +你应该可以从他们的官方网站上得到下载桌面环境特定镜像的选项。 + +最低系统要求: + +- 512MB 内存(推荐 2GB) +- 最小安装需 5GB 存储空间(常规安装 20GB) +- CPU:奔腾4,或 AMD Athlon + +### 荣誉提名:Funtoo & Puppy Linux + +[Funtoo][40] 是基于 Gentoo 的由社区开发的 Linux 发行版。它着重于为你提供 Gentoo Linux 的最佳性能以及一些额外的软件包,以使用户获得完整的体验。有趣的是,该开发实际上是由 Gentoo Linux 的创建者 Daniel Robbins 领导的。 + +[Puppy Linux][51] 是一个很小的 Linux 发行版,除了基本的工具,几乎没有捆绑的软件应用。如果其他选择都不行,而你又想要最轻量级的发行版,Puppy Linux 可能是一个选择。 + +当然,如果你不熟悉 Linux,这两个可能都不能提供最好的体验。但是,它们确实支持 32 位系统,并且可以在许多较旧的 Intel/AMD 芯片组上很好地工作。可以在它们的官方网站上探索更多的信息。 + +### 总结 + +我将列表重点放在基于 Debian 的发行版和一些独立发行版上。但是,如果你不介意长期支持条款,而只想获得一个支持 32 位的镜像,也可以尝试使用任何基于 Ubuntu 18.04 的发行版(或任何官方版本)。 + +在撰写本文时,它们只剩下几个月的软件支持。因此,我避免将其作为主要选项提及。但是,如果你喜欢基于 Ubuntu 18.04 的发行版或其它任何版本,可以选择 [LXLE][41]、[Linux Lite][42]、[Zorin Lite 15][43] 及其他官方版本。 + +即使大多数基于 Ubuntu 的现代桌面操作系统都放弃了对 32 位的支持。你仍然有很多选项可以选择。 + +在 32 位系统中更喜欢哪一个?在下面的评论中让我知道你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/32-bit-linux-distributions/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/what-is-linux-distribution/ +[2]: https://itsfoss.com/best-linux-distributions/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/32-bit-linux.png?resize=800%2C450&ssl=1 +[4]: https://itsfoss.com/lightweight-linux-beginners/ +[5]: https://itsfoss.com/32-bit-64-bit-ubuntu/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/debian-screenshot.png?resize=800%2C450&ssl=1 +[7]: https://wiki.debian.org/FrontPage +[8]: https://www.debian.org/releases/buster/debian-installer/ +[9]: https://itsfoss.com/before-installing-debian/ +[10]: https://www.debian.org/releases/buster/installmanual +[11]: https://www.debian.org/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/slax-screenshot.jpg?resize=800%2C600&ssl=1 +[13]: https://www.slax.org +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/antiX-19-1.jpg?resize=800%2C500&ssl=1 +[15]: https://antixlinux.com +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/01/opensuse-15-1.png?resize=800%2C500&ssl=1 +[17]: https://itsfoss.com/why-use-opensuse/ +[18]: https://www.opensuse.org/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/Emmabuntus-xfce.png?resize=800%2C500&ssl=1 +[20]: https://emmabuntus.org/ +[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/nixos-kde.jpg?resize=800%2C500&ssl=1 +[22]: https://nixos.org/features.html +[23]: https://nixos.org/ +[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/gentoo-linux.png?resize=800%2C450&ssl=1 +[25]: https://www.gentoo.org/get-started/ +[26]: https://www.gentoo.org +[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/devuan-beowulf.jpg?resize=800%2C600&ssl=1 +[28]: https://itsfoss.com/devuan-3-release/ +[29]: https://www.devuan.org/os/init-freedom +[30]: https://www.devuan.org +[31]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/void-linux.jpg?resize=800%2C450&ssl=1 +[32]: https://itsfoss.com/best-linux-desktop-environments/ +[33]: https://voidlinux.org/ +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os8Debonaire.jpg?resize=800%2C500&ssl=1 +[35]: https://en.wikipedia.org/wiki/Trinity_Desktop_Environment +[36]: https://itsfoss.com/q4os-linux-review/ +[37]: https://q4os.org/index.html +[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/mx-linux-19-2-kde.jpg?resize=800%2C452&ssl=1 +[39]: https://mxlinux.org/ +[40]: https://www.funtoo.org/Welcome +[41]: https://www.lxle.net/ +[42]: https://www.linuxliteos.com +[43]: https://zorinos.com/download/15/lite/32/ +[44]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/cinnamon-debian-edition.jpg?w=800&ssl=1 +[45]: https://www.linuxmint.com/download_lmde.php +[46]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/sparky-linux.jpg?w=800&ssl=1 +[47]: https://sparkylinux.org/download/stable/ +[48]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/mageia.jpg?w=800&ssl=1 +[49]: https://en.wikipedia.org/wiki/Mandriva_Linux +[50]: https://www.mageia.org/en/ +[51]: http://puppylinux.com/ \ No newline at end of file diff --git a/published/202104/20201109 Getting started with Stratis encryption.md b/published/202104/20201109 Getting started with Stratis encryption.md new file mode 100644 index 0000000000..6708bdaea5 --- /dev/null +++ b/published/202104/20201109 Getting started with Stratis encryption.md @@ -0,0 +1,201 @@ +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13311-1.html) +[#]: subject: (Getting started with Stratis encryption) +[#]: via: (https://fedoramagazine.org/getting-started-with-stratis-encryption/) +[#]: author: (briansmith https://fedoramagazine.org/author/briansmith/) + +Stratis 加密入门 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/19/094919orzaxwl5axiqqfiu.jpg) + +Stratis 在其 [官方网站][2] 上被描述为“_易于使用的 Linux 本地存储管理_”。请看这个 [短视频][3],快速演示基础知识。该视频是在 Red Hat Enterprise Linux 8 系统上录制的。视频中显示的概念也适用于 Fedora 中的 Stratis。 + +Stratis 2.1 版本引入了对加密的支持。继续阅读以了解如何在 Stratis 中开始加密。 + +### 先决条件 + +加密需要 Stratis 2.1 或更高版本。这篇文章中的例子使用的是 Fedora 33 的预发布版本。Stratis 2.1 将用在 Fedora 33 的最终版本中。 + +你还需要至少一个可用的块设备来创建一个加密池。下面的例子是在 KVM 虚拟机上完成的,虚拟磁盘驱动器为 5GB(`/dev/vdb`)。 + +### 在内核密钥环中创建一个密钥 + +Linux 内核密钥环keyring用于存储加密密钥。关于内核密钥环的更多信息,请参考 `keyrings` 手册页(`man keyrings`)。   + +使用 `stratis key set` 命令在内核钥匙圈中设置密钥。你必须指定从哪里读取密钥。要从标准输入中读取密钥,使用 `-capture-key` 选项。要从文件中读取密钥,使用 `-keyfile-path ` 选项。最后一个参数是一个密钥描述。它将稍后你创建加密的 Stratis 池时使用。 + +例如,要创建一个描述为 `pool1key` 的密钥,并从标准输入中读取密钥,可以输入: + +``` +# stratis key set --capture-key pool1key +Enter desired key data followed by the return key: +``` + +该命令提示我们输入密钥数据/密码,然后密钥就创建在内核密钥环中了。 + +要验证密钥是否已被创建,运行 `stratis key list`: + +``` +# stratis key list +Key Description +pool1key +``` + +这将验证是否创建了 `pool1key`。请注意,这些密钥不是持久的。如果主机重启,在访问加密的 Stratis 池之前,需要再次提供密钥(此过程将在后面介绍)。 + +如果你有多个加密池,它们可以有一个单独的密钥,也可以共享同一个密钥。 + +也可以使用以下 `keyctl` 命令查看密钥: + +``` +# keyctl get_persistent @s +318044983 +# keyctl show +Session Keyring + 701701270 --alswrv 0 0 keyring: _ses + 649111286 --alswrv 0 65534 \_ keyring: _uid.0 + 318044983 ---lswrv 0 65534 \_ keyring: _persistent.0 +1051260141 --alswrv 0 0 \_ user: stratis-1-key-pool1key +``` + +### 创建加密的 Stratis 池 + +现在已经为 Stratis 创建了一个密钥,下一步是创建加密的 Stratis 池。加密池只能在创建池时进行。目前不可能对现有的池进行加密。 + +使用 `stratis pool create` 命令创建一个池。添加 `-key-desc` 和你在上一步提供的密钥描述(`pool1key`)。这将向 Stratis 发出信号,池应该使用提供的密钥进行加密。下面的例子是在 `/dev/vdb` 上创建 Stratis 池,并将其命名为 `pool1`。确保在你的系统中指定一个空的/可用的设备。 + +``` +# stratis pool create --key-desc pool1key pool1 /dev/vdb +``` + +你可以使用 `stratis pool list` 命令验证该池是否已经创建: + +``` +# stratis pool list +Name Total Physical Properties +pool1 4.98 GiB / 37.63 MiB / 4.95 GiB ~Ca, Cr +``` + +在上面显示的示例输出中,`~Ca` 表示禁用了缓存(`~` 否定了该属性)。`Cr` 表示启用了加密。请注意,缓存和加密是相互排斥的。这两个功能不能同时启用。 + +接下来,创建一个文件系统。下面的例子演示了创建一个名为 `filesystem1` 的文件系统,将其挂载在 `/filesystem1` 挂载点上,并在新文件系统中创建一个测试文件: + +``` +# stratis filesystem create pool1 filesystem1 +# mkdir /filesystem1 +# mount /stratis/pool1/filesystem1 /filesystem1 +# cd /filesystem1 +# echo "this is a test file" > testfile +``` + +### 重启后访问加密池 + +当重新启动时,你会发现 Stratis 不再显示你的加密池或它的块设备: + +``` +# stratis pool list +Name Total Physical Properties +``` + +``` +# stratis blockdev list +Pool Name Device Node Physical Size Tier +``` + +要访问加密池,首先要用之前使用的相同的密钥描述和密钥数据/口令重新创建密钥: + +``` +# stratis key set --capture-key pool1key +Enter desired key data followed by the return key: +``` + +接下来,运行 `stratis pool unlock` 命令,并验证现在可以看到池和它的块设备: + +``` +# stratis pool unlock +# stratis pool list +Name Total Physical Properties +pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr +# stratis blockdev list +Pool Name Device Node Physical Size Tier +pool1 /dev/dm-2 4.98 GiB Data +``` + +接下来,挂载文件系统并验证是否可以访问之前创建的测试文件: + +``` +# mount /stratis/pool1/filesystem1 /filesystem1/ +# cat /filesystem1/testfile +this is a test file +``` + +### 使用 systemd 单元文件在启动时自动解锁 Stratis 池 + +可以在启动时自动解锁 Stratis 池,无需手动干预。但是,必须有一个包含密钥的文件。在某些环境下,将密钥存储在文件中可能会有安全问题。 + +下图所示的 systemd 单元文件提供了一个简单的方法来在启动时解锁 Stratis 池并挂载文件系统。欢迎提供更好的/替代方法的反馈。你可以在文章末尾的评论区提供建议。 + +首先用下面的命令创建你的密钥文件。确保用之前输入的相同的密钥数据/密码来代替`passphrase`。 + +``` +# echo -n passphrase > /root/pool1key +``` + +确保该文件只能由 root 读取: + +``` +# chmod 400 /root/pool1key +# chown root:root /root/pool1key +``` + +在 `/etc/systemd/system/stratis-filesystem1.service` 创建包含以下内容的 systemd 单元文件: + +``` +[Unit] +Description = stratis mount pool1 filesystem1 file system +After = stratisd.service + +[Service] +ExecStartPre=sleep 2 +ExecStartPre=stratis key set --keyfile-path /root/pool1key pool1key +ExecStartPre=stratis pool unlock +ExecStartPre=sleep 3 +ExecStart=mount /stratis/pool1/filesystem1 /filesystem1 +RemainAfterExit=yes + +[Install] +WantedBy = multi-user.target +``` + +接下来,启用服务,使其在启动时运行: + +``` +# systemctl enable stratis-filesystem1.service +``` + +现在重新启动并验证 Stratis 池是否已自动解锁,其文件系统是否已挂载。 + +### 结语 + +在今天的环境中,加密是很多人和组织的必修课。本篇文章演示了如何在 Stratis 2.1 中启用加密功能。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/getting-started-with-stratis-encryption/ + +作者:[briansmith][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/briansmith/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/stratis-encryption-2-816x345.jpg +[2]: https://stratis-storage.github.io/ +[3]: https://www.youtube.com/watch?v=CJu3kmY-f5o diff --git a/published/202104/20201204 9 Open Source Forum Software That You Can Deploy on Your Linux Servers.md b/published/202104/20201204 9 Open Source Forum Software That You Can Deploy on Your Linux Servers.md new file mode 100644 index 0000000000..74d7263544 --- /dev/null +++ b/published/202104/20201204 9 Open Source Forum Software That You Can Deploy on Your Linux Servers.md @@ -0,0 +1,213 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13329-1.html) +[#]: subject: (9 Open Source Forum Software That You Can Deploy on Your Linux Servers) +[#]: via: (https://itsfoss.com/open-source-forum-software/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +11 个可以部署在 Linux 服务器上的开源论坛软件 +====== + +> 是否想要建立社区论坛或客户支持门户站点?以下是一些可以在服务器上部署的最佳开源论坛软件。 + +就像我们的论坛一样,重要的是建立一个让志趣相投的人可以讨论,互动和寻求支持的平台。 + +论坛为用户(或客户)提供了一个空间,让他们可以接触到在互联网上大多数情况下不容易找到的东西。 + +如果你是一家企业,则可以聘请开发人员团队并按照自己的方式建立自己的论坛,但这会增加大量预算。 + +幸运的是,有几个令人印象深刻的开源论坛软件,你只需要将其部署在你的服务器上就万事大吉了!在此过程中,你将节省很多钱,但仍能获得所需的东西。 + +在这里,我列出了可以在 Linux 服务器上安装的最佳开源论坛软件列表。 + +### 建立社区门户的最佳开源论坛软件 + +![][2] + +如果你尚未建立过网站,则在部署论坛之前,可能需要看一下 [某些开源网站创建工具][3]。 + +**注意:** 此列表没有特定的排名顺序。 + +#### 1、Discourse(现代、流行) + +![][4] + +[Discourse][7] 是人们用来部署配置讨论平台的最流行的现代论坛软件。实际上,[It's FOSS 社区][1] 论坛使用了 Discourse 平台。 + +它提供了我所知道的大多数基本功能,包括电子邮件通知、审核工具、样式自定义选项,Slack/WordPress 等第三方集成等等。 + +它的自托管是完全免费的,你也可以在 [GitHub][5] 上找到该项目。如果你要减少将其部署在自托管服务器上的麻烦,可以选择 [Discourse 提供的托管服务][6](肯定会很昂贵)。 + +#### 2、Talkyard(受 Discourse 和 StackOverflow 启发) + +![][8] + +[Talkyard][10] 是完全免费使用的,是一个开源项目。它看起来很像 Discourse,但是如果你深入了解一下,还是有区别的。 + +你可以在这里获得 StackOverflow 的大多数关键功能,以及在论坛平台上期望得到的所有基本功能。它可能不是一个流行的论坛解决方案,但是如果你想要类似于 Discourse 的功能以及一些有趣的功能,那么值得尝试一下。 + +你可以在他们的 [GitHub 页面][9] 中进一步了解它。 + +#### 3、Forem (一种独特的社区平台,正在测试中) + +![](https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/dev-community-forem.png?w=800&ssl=1) + +你可能以前没有听说过 [Forem](https://www.forem.com/),但它支持了 [dev.to](https://dev.to/)(这是一个越来越受欢迎的开发者社区网站)。 + +它仍然处于测试阶段,所以你或许不会选择在生产服务器上实验。但是,你可以通过在他们的官方网站上填写一个表格并与他们取得联系,让他们为你托管。 + +尽管没有官方的功能列表来强调所有的东西,但如果我们以 [dev.to](https://dev.to/) 为例,你会得到许多基本的特性和功能,如社区列表、商店、帖子格式化等。你可以在他们的 [公告帖子](https://dev.to/devteam/for-empowering-community-2k6h) 中阅读更多关于它提供的内容,并在 [GitHub](https://github.com/forem/forem) 上探索该项目。 + +#### 4、NodeBB(现代化、功能齐全) + +![][11] + +[NodeBB][14] 是一个基于 [Node.js][12] 的开源论坛软件。它的目标是简单、优雅和快速。首先,它面向有托管计划的组织和企业。但是,你也可以选择自己托管它。 + +你还可以获得实时本地分析功能,以及聊天和通知支持。它还提供一个 API,可以将其与你的现有产品集成。它还支持审核工具和打击垃圾邮件的工具。 + +你可以获得一些开箱即用的第三方集成支持,例如 WordPress、Mailchimp 等。 + +请在他们的 [GitHub 页面][13] 或官方网站上可以进一步了解它。 + +#### 5、Vanilla 论坛(面向企业) + +![][15] + +[Vanilla 论坛][17] 主要是一款以企业为中心的论坛软件,它的基本功能是为你的平台打造品牌,为客户提供问答,还可以对帖子进行投票。 + +用户体验具有现代的外观,并且已被像 EA、Adobe 和其他一些大公司使用。 + +当然,如果你想尝试基于云的 Vanilla 论坛(由专业团队管理)以及对某些高级功能的访问权,可以随时申请演示。无论哪种情况,你都可以选择社区版,该社区版可以免费使用大多数最新功能,但需要自己托管和管理。 + +你可以在他们的官方网站和 [GitHub 页面][16] 上进一步了解它。 + +#### 6、bbPress (来自 WordPress) + +![][20] + +[bbPress][22] 是一个可靠的论坛软件,由 WordPress 的创建者建立。旨在提供一个简单而迅速的论坛体验。 + +用户界面看起来很老旧,但易于使用,它提供了你通常在论坛软件中需要的基本功能。审核工具很好用,易于设置。你可以使用现有的插件扩展功能,并从几个可用的主题中进行选择以调整论坛的外观。 + +如果你只想要一个没有花哨功能的简单论坛平台,bbPress 应该是完美的。你也可以查看他们的 [GitHub 页面][21] 了解更多信息。 + +#### 7、phpBB(经典论坛软件) + +![][23] + +如果你想要传统的论坛设计,只想要基本功能,则 [phpBB][25] 软件是一个不错的选择。当然,你可能无法获得最佳的用户体验或功能,但是作为按传统设计的论坛平台,它是实用的并且非常有效。 + +尤其是,对于习惯使用传统方式的用户而言,这将是一种简单而有效的解决方案。 + +不仅仅是简单,而且在一般的托管供应商那里,它的设置也是非常容易的。在任何共享主机平台上,你都能获得一键式安装功能,因此也不需要太多的技术知识来进行设置。 + +你可以在他们的官方网站或 [GitHub 页面][24] 上找到更多有关它的信息。 + +#### 8、Simple Machines 论坛(另一个经典) + +![][26] + +与 phpBB 类似,[Simple Machines 论坛][27] 是另一种基本(或简单)的论坛。很大程度上你可能无法自定义外观(至少不容易),但是默认外观是干净整洁的,提供了良好的用户体验。 + +就个人而言,相比 php BB 我更喜欢它,但是你可以前往他们的 [官方网站][27] 进行进一步的探索。同样,你可以使用一键安装方法在任何共享托管服务上轻松安装 Simple Machines 论坛。 + +#### 9、FluxBB(古典) + +![][28] + +[FluxBB][30] 是另一个简单、轻量级的开源论坛。与其他的相比,它可能维护的不是非常积极,但是如果你只想部署一个只有很少几个用户的基本论坛,则可以轻松尝试一下。 + +你可以在他们的官方网站和 [GitHub 页面][29] 上找到更多有关它的信息。 + +#### 10、MyBB(不太流行,但值得看看) + +![][31] + +[MyBB][33] 是一款独特的开源论坛软件,它提供多种样式,并包含你需要的基本功能。 + +从插件支持和审核工具开始,你将获得管理大型社区所需的一切。它还支持类似于 Discourse 和同类论坛软件面向个人用户的私人消息传递。 + +它可能不是一个流行的选项,但是它可以满足大多数用例,并且完全免费。你可以在 [GitHub][32] 上得到支持和探索这个项目。 + +#### 11、Flarum(测试版) + +![][34] + +如果你想要更简单和独特的论坛,请看一下 [Flarum][37]。它是一款轻量级的论坛软件,旨在以移动为先,同时提供快速的体验。 + +它支持某些第三方集成,也可以使用扩展来扩展功能。就我个人而言,它看起来很漂亮。我没有机会尝试它,你可以看一下它的 [文档][35],可以肯定它具有论坛所需的所有必要功能的特征。 + +值得注意的是 Flarum 是相当新的,因此仍处于测试阶段。你可能需要先将其部署在测试服务器上测试后,再应用到生产环境。请查看其 [GitHub 页面][36] 了解更多详细信息。 + +#### 补充:Lemmy(更像是 Reddit 的替代品,但也是一个不错的选择) + +![](https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/lemmy-forum.png?w=800&ssl=1) + +一个用 [Rust](https://www.rust-lang.org/) 构建的 Reddit 的联盟式论坛的替代品。它的用户界面很简单,有些人可能觉得它不够直观,无法获得有吸引力的论坛体验。 + +其联盟网络仍在构建中,但如果你想要一个类似 Reddit 的社区平台,你可以很容易地将它部署在你的 Linux 服务器上,并制定好管理规则、版主,然后就可以开始了。它支持跨版发帖(参见 Reddit),以及其他基本功能,如标签、投票、用户头像等。 + +你可以通过其 [官方文档](https://lemmy.ml/docs/about.html) 和 [GitHub 页面](https://github.com/LemmyNet/lemmy) 探索更多信息。 + +### 总结 + +大多数开源论坛软件都为基本用例提供了几乎相同的功能。如果你正在寻找特定的功能,则可能需要浏览其文档。 + +就个人而言,我推荐 Discourse。它很流行,外观现代,拥有大量的用户基础。 + +你认为最好的开源论坛软件是什么?我是否错过了你的偏爱?在下面的评论中让我知道。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/open-source-forum-software/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.community/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/open-source-forum-software.png?resize=800%2C450&ssl=1 +[3]: https://itsfoss.com/open-source-cms/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/itsfoss-community-discourse.jpg?resize=800%2C561&ssl=1 +[5]: https://github.com/discourse/discourse +[6]: https://discourse.org/buy +[7]: https://www.discourse.org/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/talkyard-forum.jpg?resize=800%2C598&ssl=1 +[9]: https://github.com/debiki/talkyard +[10]: https://www.talkyard.io/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/nodebb.jpg?resize=800%2C369&ssl=1 +[12]: https://nodejs.org/en/ +[13]: https://github.com/NodeBB/NodeBB +[14]: https://nodebb.org/ +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/vanilla-forums.png?resize=800%2C433&ssl=1 +[16]: https://github.com/Vanilla +[17]: https://vanillaforums.com/en/ +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/open-source-eCommerce.png?fit=800%2C450&ssl=1 +[19]: https://itsfoss.com/open-source-ecommerce/ +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/bbpress.jpg?resize=800%2C552&ssl=1 +[21]: https://github.com/bbpress +[22]: https://bbpress.org/ +[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/phpBB.png?resize=798%2C600&ssl=1 +[24]: https://github.com/phpbb/phpbb +[25]: https://www.phpbb.com/ +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/simplemachines.jpg?resize=800%2C343&ssl=1 +[27]: https://www.simplemachines.org/ +[28]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/FluxBB.jpg?resize=800%2C542&ssl=1 +[29]: https://github.com/fluxbb/fluxbb/ +[30]: https://fluxbb.org/ +[31]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/mybb-example.png?resize=800%2C461&ssl=1 +[32]: https://github.com/mybb/mybb +[33]: https://mybb.com/ +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/flarum-screenshot.png?resize=800%2C503&ssl=1 +[35]: https://docs.flarum.org/ +[36]: https://github.com/flarum +[37]: https://flarum.org/ +[38]: https://highoncloud.com/ diff --git a/published/202104/20201209 Program a simple game with Elixir.md b/published/202104/20201209 Program a simple game with Elixir.md new file mode 100644 index 0000000000..4d7f6e6211 --- /dev/null +++ b/published/202104/20201209 Program a simple game with Elixir.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13292-1.html) +[#]: subject: (Program a simple game with Elixir) +[#]: via: (https://opensource.com/article/20/12/elixir) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +使用 Elixir 语言编写一个小游戏 +====== + +> 通过编写“猜数字”游戏来学习 Elixir 编程语言,并将它与一个你熟知的语言做对比。 + +![](https://img.linux.net.cn/data/attachment/album/202104/12/223351t68886wmza1m9jnt.jpg) + +为了更好的学习一门新的编程语言,最好的方法是去关注主流语言的一些共有特征: + + * 变量 + * 表达式 + * 语句 + +这些概念是大多数编程语言的基础。因为这些相似性,只要你通晓了一门编程语言,你可以通过对比差异来熟知另一门编程语言。 + +另外一个学习新编程语言的好方法是开始编写一个简单标准的程序。它可以让你集中精力在语言上而非程序的逻辑本身。在这个系列的文章中,我们使用“猜数字”程序来实现,在这个程序中,计算机会选择一个介于 1 到 100 之间的数字,并要求你来猜测它。程序会循环执行,直到你正确猜出该数字为止。 + +“猜数字”这个程序使用了编程语言的以下概念: + + * 变量 + * 输入 + * 输出 + * 条件判断 + * 循环 + +这是一个学习新编程语言的绝佳实践。 + +### 猜数字的 Elixir 实现 + +[Elixir][2] 是一门被设计用于构建稳定可维护应用的动态类型的函数式编程语言。它与 [Erlang][3] 运行于同一虚拟机之上,吸纳了 Erlang 的众多长处的同时拥有更加简单的语法。 + +你可以编写一个 Elixir 版本的“猜数字”游戏来体验这门语言。 + +这是我的实现方法: + +``` +defmodule Guess do + def guess() do + random = Enum.random(1..100) + IO.puts "Guess a number between 1 and 100" + Guess.guess_loop(random) + end + def guess_loop(num) do + data = IO.read(:stdio, :line) + {guess, _rest} = Integer.parse(data) + cond do + guess < num -> + IO.puts "Too low!" + guess_loop(num) + guess > num -> + IO.puts "Too high!" + guess_loop(num) + true -> + IO.puts "That's right!" + end + end +end + +Guess.guess() +``` + +Elixir 通过列出变量的名称后面跟一个 `=` 号来为了给变量分配一个值。举个例子,表达式 `random = 0` 给 `random` 变量分配一个数值 0。 + +代码以定义一个模块开始。在 Elixir 语言中,只有模块可以包含命名函数。 + +紧随其后的这行代码定义了入口函数 `guess()`,这个函数: + + * 调用 `Enum.random()` 函数来获取一个随机整数 + * 打印游戏提示 + * 调用循环执行的函数 + +剩余的游戏逻辑实现在 `guess_loop()` 函数中。 + +`guess_loop()` 函数利用 [尾递归][4] 来实现循环。Elixir 中有好几种实现循环的方法,尾递归是比较常用的一种方式。`guess_loop()` 函数做的最后一件事就是调用自身。 + +`guess_loop()` 函数的第一行读取用户输入。下一行调用 `parse()` 函数将输入转换成一个整数。 + +`cond` 表达式是 Elixir 版本的多重分支表达式。与其他语言中的 `if/elif` 或者 `if/elsif` 表达式不同,Elixir 对于的首个分支或者最后一个没有分支并没有区别对待。 + +这个 `cond` 表达式有三路分支:猜测的结果可以比随机数大、小或者相等。前两个选项先输出不等式的方向然后递归调用 `guess_loop()`,循环返回至函数开始。最后一个选项输出 `That's right`,然后这个函数就完成了。 + +### 输出例子 + +现在你已经编写了你的 Elixir 代码,你可以运行它来玩“猜数字”的游戏。每次你执行这个程序,Elixir 会选择一个不同的随机数,你可以一直猜下去直到你找到正确的答案: + +``` +$ elixir guess.exs +Guess a number between 1 and 100 +50 +Too high +30 +Too high +20 +Too high +10 +Too low +15 +Too high +13 +Too low +14 +That's right! +``` + +“猜数字”游戏是一个学习一门新编程语言的绝佳入门程序,因为它用了非常直接的方法实践了常用的几个编程概念。通过用不同语言实现这个简单的小游戏,你可以实践各个语言的核心概念并且比较它们的细节。 + +你是否有你最喜爱的编程语言?你将怎样用它来编写“猜数字”这个游戏?关注这个系列的文章来看看其他你可能感兴趣的语言实现。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/12/elixir + +作者:[Moshe Zadka][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[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/dice_tabletop_board_gaming_game.jpg?itok=y93eW7HN (A die with rainbow color background) +[2]: https://elixir-lang.org/ +[3]: https://www.erlang.org/ +[4]: https://en.wikipedia.org/wiki/Tail_call diff --git a/published/202104/20210203 Improve your productivity with this Linux automation tool.md b/published/202104/20210203 Improve your productivity with this Linux automation tool.md new file mode 100644 index 0000000000..6ef7efff89 --- /dev/null +++ b/published/202104/20210203 Improve your productivity with this Linux automation tool.md @@ -0,0 +1,177 @@ +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13347-1.html) +[#]: subject: (Improve your productivity with this Linux automation tool) +[#]: via: (https://opensource.com/article/21/2/linux-autokey) +[#]: author: (Matt Bargenquast https://opensource.com/users/mbargenquast) + +使用 Linux 自动化工具提高生产率 +====== + +> 用 AutoKey 配置你的键盘,纠正常见的错别字,输入常用的短语等等。 + +![](https://img.linux.net.cn/data/attachment/album/202104/30/111130s7ffji6cmb7rkcfx.jpg) + +[AutoKey][2] 是一个开源的 Linux 桌面自动化工具,一旦它成为你工作流程的一部分,你就会想,如何没有它,那该怎么办。它可以成为一种提高生产率的变革性工具,或者仅仅是减少与打字有关的身体压力的一种方式。 + +本文将研究如何安装和开始使用 AutoKey ,介绍一些可以立即在工作流程中使用的简单方法,并探讨 AutoKey 高级用户可能会感兴趣的一些高级功能。 + +### 安装并设置 AutoKey + +AutoKey 在许多 Linux 发行版中都是现成的软件包。该项目的 [安装指南][3] 包含许多平台的说明,也包括了从源代码进行构建的指导。本文使用 Fedora 作为操作平台。 + +AutoKey 有两个变体:为像 GNOME 等基于 [GTK][4] 环境而设计的 autokey-gtk 和基于 [QT][5] 的 autokey-qt。 + +你可以从命令行安装任一变体: + +``` +sudo dnf install autokey-gtk +``` + +安装完成后,使用 `autokey-gtk`(或 `autokey-qt`)运行它。 + +### 探究界面 + +在将 AutoKey 设置为在后台运行并自动执行操作之前,你首先需要对其进行配置。调出用户界面(UI)配置: + +``` +autokey-gtk -c +``` + +AutoKey 提供了一些预设配置的示例。你可能希望在熟悉 UI 时将他们留作备用,但是可以根据需要删除它们。 + +![AutoKey 用户界面][6] + +左侧窗格包含一个文件夹式的短语和脚本的层次结构。“短语Phrases” 代表要让 AutoKey 输入的文本。“脚本Scripts” 是动态的、程序化的等效项,可以使用 Python 编写,并且获得与键盘击键发送到活动窗口基本相同的结果。 + +右侧窗格构建和配置短语和脚本。 + +对配置满意后,你可能希望在登录时自动运行 AutoKey,这样就不必每次都启动它。你可以通过在 “首选项Preferences”菜单(“编辑 -> 首选项Edit -> Preferences””)中勾选 “登录时自动启动 AutoKeyAutomatically start AutoKey at login”进行配置。 + +![登录时自动启动 AutoKey][8] + +### 使用 AutoKey 纠正常见的打字排版错误 + +修复常见的打字排版错误对于 AutoKey 来说是一个容易解决的问题。例如,我始终键入 “gerp” 来代替 “grep”。这里是如何配置 AutoKey 为你解决这些类型问题。 + +创建一个新的子文件夹,可以在其中将所有“打字排版错误校正”配置分组。在左侧窗格中选择 “My Phrases” ,然后选择 “文件 -> 新建 -> 子文件夹File -> New -> Subfolder”。将子文件夹命名为 “Typos”。 + +在 “文件 -> 新建 -> 短语File -> New -> Phrase” 中创建一个新短语。并将其称为 “grep”。 + +通过高亮选择短语 “grep”,然后在 输入短语内容Enter phrase contents部分(替换默认的 “Enter phrase contents” 文本)中输入 “grep” ,配置 AutoKey 插入正确的关键词。 + +接下来,通过定义缩写来设置 AutoKey 如何触发此短语。点击用户界面底部紧邻 “缩写Abbreviations” 的 “设置Set”按钮。 + +在弹出的对话框中,单击 “添加Add” 按钮,然后将 “gerp” 添加为新的缩写。勾选 “删除键入的缩写Remove typed abbreviation”;此选项让 AutoKey 将任何键入 “gerp” 一词的替换为 “grep”。请不要勾选“在键入单词的一部分时触发Trigger when typed as part of a word”,这样,如果你键入包含 “grep”的单词(例如 “fingerprint”),就不会尝试将其转换为 “fingreprint”。仅当将 “grep” 作为独立的单词键入时,此功能才有效。 + +![在 AutoKey 中设置缩写][9] + +### 限制对特定应用程序的更正 + +你可能希望仅在某些应用程序(例如终端窗口)中打字排版错误时才应用校正。你可以通过设置 窗口过滤器Window Filter进行配置。单击 “设置Set” 按钮来定义。 + +设置窗口过滤器Window Filter的最简单方法是让 AutoKey 为你检测窗口类型: + + 1. 启动一个新的终端窗口。 + 2. 返回 AutoKey,单击 “检测窗口属性Detect Window Properties”按钮。 + 3. 单击终端窗口。 + +这将自动填充窗口过滤器,可能的窗口类值为 `gnome-terminal-server.Gnome-terminal`。这足够了,因此单击 “OK”。 + +![AutoKey 窗口过滤器][10] + +### 保存并测试 + +对新配置满意后,请确保将其保存。 单击 “文件File” ,然后选择 “保存Save” 以使更改生效。 + +现在进行重要的测试!在你的终端窗口中,键入 “gerp” 紧跟一个空格,它将自动更正为 “grep”。要验证窗口过滤器是否正在运行,请尝试在浏览器 URL 栏或其他应用程序中键入单词 “gerp”。它并没有变化。 + +你可能会认为,使用 [shell 别名][11] 可以轻松解决此问题,我完全赞成!与别名不同,只要是面向命令行,无论你使用什么应用程序,AutoKey 都可以按规则纠正错误。 + +例如,我在浏览器,集成开发环境和终端中输入的另一个常见打字错误 “openshfit” 替代为 “openshift”。别名不能完全解决此问题,而 AutoKey 可以在任何情况下纠正它。 + +### 键入常用短语 + +你可以通过许多其他方法来调用 AutoKey 的短语来帮助你。例如,作为从事 OpenShift 的站点可靠性工程师(SRE),我经常在命令行上输入 Kubernetes 命名空间名称: + +``` +oc get pods -n openshift-managed-upgrade-operator +``` + +这些名称空间是静态的,因此它们是键入特定命令时 AutoKey 可以为我插入的理想短语。 + +为此,我创建了一个名为 “Namespaces” 的短语子文件夹,并为我经常键入的每个命名空间添加了一个短语条目。 + +### 分配热键 + +接下来,也是最关键的一点,我为子文件夹分配了一个 “热键hotkey”。每当我按下该热键时,它都会打开一个菜单,我可以在其中选择(要么使用 “方向键”+回车键要么使用数字)要插入的短语。这减少了我仅需几次击键就可以输入这些命令的击键次数。 + +“My Phrases” 文件夹中 AutoKey 的预配置示例使用 `Ctrl+F7` 热键进行配置。如果你将示例保留在 AutoKey 的默认配置中,请尝试一下。你应该在此处看到所有可用短语的菜单。使用数字或箭头键选择所需的项目。 + +### 高级自动键入 + +AutoKey 的 [脚本引擎][12] 允许用户运行可以通过相同的缩写和热键系统调用的 Python 脚本。这些脚本可以通过支持的 API 的函数来完成诸如切换窗口、发送按键或执行鼠标单击之类的操作。 + +AutoKey 用户非常欢迎这项功能,发布了自定义脚本供其他用户采用。例如,[NumpadIME 脚本][13] 将数字键盘转换为旧的手机样式的文本输入方法,[Emojis-AutoKey][14] 可以通过将诸如: `:smile:` 之类的短语转换为它们等价的表情符号来轻松插入。 + +这是我设置的一个小脚本,该脚本进入 Tmux 的复制模式,以将前一行中的第一个单词复制到粘贴缓冲区中: + +``` +from time import sleep + +# 发送 Tmux 命令前缀(b 更改为 s) +keyboard.send_keys("+s") +# Enter copy mode +keyboard.send_key("[") +sleep(0.01) +# Move cursor up one line +keyboard.send_keys("k") +sleep(0.01) +# Move cursor to start of line +keyboard.send_keys("0") +sleep(0.01) +# Start mark +keyboard.send_keys(" ") +sleep(0.01) +# Move cursor to end of word +keyboard.send_keys("e") +sleep(0.01) +# Add to copy buffer +keyboard.send_keys("+m") +``` + +之所以有 `sleep` 函数,是因为 Tmux 有时无法跟上 AutoKey 发送击键的速度,并且它们对整体执行时间的影响可忽略不计。 + +### 使用 AutoKey 自动化 + +我希望你喜欢这篇使用 AutoKey 进行键盘自动化的探索,它为你提供了有关如何改善工作流程的一些好主意。如果你在使用 AutoKey 时有什么有用的或新颖的方法,一定要在下面的评论中分享。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-autokey + +作者:[Matt Bargenquast][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mbargenquast +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://github.com/autokey/autokey +[3]: https://github.com/autokey/autokey/wiki/Installing +[4]: https://www.gtk.org/ +[5]: https://www.qt.io/ +[6]: https://opensource.com/sites/default/files/uploads/autokey-defaults.png (AutoKey UI) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/uploads/startautokey.png (Automatically start AutoKey at login) +[9]: https://opensource.com/sites/default/files/uploads/autokey-set_abbreviation.png (Set abbreviation in AutoKey) +[10]: https://opensource.com/sites/default/files/uploads/autokey-window_filter.png (AutoKey Window Filter) +[11]: https://opensource.com/article/19/7/bash-aliases +[12]: https://autokey.github.io/index.html +[13]: https://github.com/luziferius/autokey_scripts +[14]: https://github.com/AlienKevin/Emojis-AutoKey diff --git a/published/202104/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md b/published/202104/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..19bf109db5 --- /dev/null +++ b/published/202104/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md @@ -0,0 +1,103 @@ +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13337-1.html) +[#]: subject: (How to Add Fingerprint Login in Ubuntu and Other Linux Distributions) +[#]: via: (https://itsfoss.com/fingerprint-login-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +如何在 Ubuntu 中添加指纹登录 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/26/191530msmenm3ges3kgyet.jpg) + +现在很多高端笔记本都配备了指纹识别器。Windows 和 macOS 支持指纹登录已经有一段时间了。在桌面 Linux 中,对指纹登录的支持更多需要极客的调整,但 [GNOME][1] 和 [KDE][2] 已经开始通过系统设置来支持它。 + +这意味着在新的 Linux 发行版上,你可以轻松使用指纹识别。在这里我将在 Ubuntu 中启用指纹登录,但你也可以在其他运行 GNOME 3.38 的发行版上使用这些步骤。 + +> **前提条件** +> +> 当然,这是显而易见的。你的电脑必须有一个指纹识别器。 +> +> 这个方法适用于任何运行 GNOME 3.38 或更高版本的 Linux 发行版。如果你不确定,你可以[检查你使用的桌面环境版本][3]。 +> +> KDE 5.21 也有一个指纹管理器。当然,截图看起来会有所不同。 + +### 在 Ubuntu 和其他 Linux 发行版中添加指纹登录功能 + +进入 “设置”,然后点击左边栏的 “用户”。你应该可以看到系统中所有的用户账号。你会看到几个选项,包括 “指纹登录”。 + +点击启用这里的指纹登录选项。 + +![Enable fingerprint login in Ubuntu][4] + +它将立即要求你扫描一个新的指纹。当你点击 “+” 号来添加指纹时,它会提供一些预定义的选项,这样你就可以很容易地识别出它是哪根手指或拇指。 + +当然,你可以点击右手食指但扫描左手拇指,不过我看不出你有什么好的理由要这么做。 + +![Adding fingerprint][5] + +在添加指纹时,请按照指示旋转你的手指或拇指。 + +![Rotate your finger][6] + +系统登记了整个手指后,就会给你一个绿色的信号,表示已经添加了指纹。 + +![Fingerprint successfully added][7] + +如果你想马上测试一下,在 Ubuntu 中按 `Super+L` 快捷键锁定屏幕,然后使用指纹进行登录。 + +![Login With Fingerprint in Ubuntu][8] + +#### 在 Ubuntu 上使用指纹登录的经验 + +指纹登录顾名思义就是使用你的指纹来登录系统。就是这样。当要求对需要 `sudo` 访问的程序进行认证时,你不能使用手指。它不能代替你的密码。 + +还有一件事。指纹登录可以让你登录,但当系统要求输入 `sudo` 密码时,你不能用手指。Ubuntu 中的 [钥匙环][9] 也仍然是锁定的。 + +另一件烦人的事情是因为 GNOME 的 GDM 登录界面。当你登录时,你必须先点击你的账户才能进入密码界面。你在这可以使用手指。如果能省去先点击用户帐户 ID 的麻烦就更好了。 + +我还注意到,指纹识别没有 Windows 中那么流畅和快速。不过,它可以使用。 + +如果你对 Linux 上的指纹登录有些失望,你可以禁用它。让我在下一节告诉你步骤。 + +### 禁用指纹登录 + +禁用指纹登录和最初启用指纹登录差不多。 + +进入 “设置→用户”,然后点击指纹登录选项。它会显示一个有添加更多指纹或删除现有指纹的页面。你需要删除现有的指纹。 + +![Disable Fingerprint Login][10] + +指纹登录确实有一些好处,特别是对于我这种懒人来说。我不用每次锁屏时输入密码,我也对这种有限的使用感到满意。 + +用 [PAM][11] 启用指纹解锁 `sudo` 应该不是完全不可能。我记得我 [在 Ubuntu 中设置脸部解锁][12]时,也可以用于 `sudo`。看看以后的版本是否会增加这个功能吧。 + +你有带指纹识别器的笔记本吗?你是否经常使用它,或者它只是你不关心的东西之一? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/fingerprint-login-ubuntu/ + +作者:[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://www.gnome.org/ +[2]: https://kde.org/ +[3]: https://itsfoss.com/find-desktop-environment/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/enable-fingerprint-ubuntu.png?resize=800%2C607&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/adding-fingerprint-login-ubuntu.png?resize=800%2C496&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/adding-fingerprint-ubuntu-linux.png?resize=800%2C603&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/fingerprint-added-ubuntu.png?resize=797%2C510&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/02/login-with-fingerprint-ubuntu.jpg?resize=800%2C320&ssl=1 +[9]: https://itsfoss.com/ubuntu-keyring/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/disable-fingerprint-login.png?resize=798%2C524&ssl=1 +[11]: https://tldp.org/HOWTO/User-Authentication-HOWTO/x115.html +[12]: https://itsfoss.com/face-unlock-ubuntu/ diff --git a/published/202104/20210222 5 benefits of choosing Linux.md b/published/202104/20210222 5 benefits of choosing Linux.md new file mode 100644 index 0000000000..df05f65e43 --- /dev/null +++ b/published/202104/20210222 5 benefits of choosing Linux.md @@ -0,0 +1,68 @@ +[#]: collector: (lujun9972) +[#]: translator: (max27149) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13284-1.html) +[#]: subject: (5 benefits of choosing Linux) +[#]: via: (https://opensource.com/article/21/2/linux-choice) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +选择 Linux 的五大好处 +====== + +> Linux 的一大优点是多样化选择,选择激发了用户之间自由分享想法和解决方案。Linux 将如何激发你为这个社区做出贡献呢? + +![](https://img.linux.net.cn/data/attachment/album/202104/10/131305ei6yyuyujui9fkkr.jpg) + +到了 2021 年,人​​们比以往任何时候都更有理由喜欢 Linux。在本系列中,我将分享 21 个使用 Linux 的理由。本文讨论选择 Linux 带来的好处。 + +_选择_ 是 Linux 中被误解最深的特性之一。这种误解从可被选择的 Linux 发行版数量就开始了。Distrowatch.org 报告了数百种可用的和活跃的 Linux 发行版。当然,在这些发行版当中,许多都是业余爱好项目或者针对某些晦涩需求的特别版。因为是开源的,所以实际上,任何人都可以“重新设计”或“重新混搭”现有的 Linux 发行版,赋予一个新名称,提供一个新的默认墙纸,然后称其为自己的作品。尽管这些修改似乎微不足道,但我认为这显示了 Linux 的一些特别之处。 + +### 灵感 + +Linux 似乎一直在启迪着人们,从了解它的那一刻起,到创造出自己的版本。 + +有数十家公司花费数百万美元来从他们自己的产品中获取灵感。商业技术广告试着强硬地说服你,只要你购买某种产品,你就会与所关心的人建立更多的联系,更具创造力、更加充满活力。这些广告用 4k 视频拍摄,焦点柔和,并在欢快振奋的音乐节奏下播放,试图说服人们不仅购买而且还要支持和宣传该公司的产品。 + +当然,Linux 基本没有营销预算,因为 Linux 是个形形色色的大集合,*没有固定实体*。然而,当人们发现它的存在时候,他们似乎就被启发着去构建属于自己的版本。 + +灵感的数量很难量化,但是它显然很有价值,要不然那些公司不会花钱来尝试创造灵感。 + +### 革新 + +灵感,无论给它标价有多难,它都因它的生产创造而有价值。许多 Linux 用户受启发来为各种奇怪问题定制解决方案。我们解决的大多数问题,对于其他大部分人而言,似乎微不足道:也许你使用 [Seeed 微控制器][2] 来监控番茄植株土壤的水分含量;或者你使用脚本来搜索 Python 软件包的索引,因为你总是会忘记每天导入的库的名称;或者设置了自动清理下载文件夹,因为将文件图标拖进回收站这个活儿干太多了。不管你在使用 Linux 的过程中,为自己解决过什么问题,都是这个平台包含的特性之一,你被这个正在运行中的开放的技术所启发,使其更好地服务于你自己。 + +### 开放策略 + +诚然,不论是灵感,还是创新,都不能算 Linux 独有的属性。其他平台也确实让我们激发灵感,我们也以或大或小的方式进行创新。运算能力已在很大程度上拉平了操作系统的竞争领域,你在一个操作系统上可以完成的任何事,在另一个操作系统上或许都能找到对应的方法来完成。 + +但是,许多用户发现,Linux 操作系统保留了坚定的开放策略,当你尝试可能无人想到过的尝试时,Linux 不会阻挡你。这种情况不会也不可能发生在专有的操作系统上,因为无法进入系统层级的某些区域,因为它们本身就是被设计为不开放源码的。有各种独断的封锁。当你完全按照操作系统的期望进行操作时,你不会碰到那些看不见的墙,但是当你心里想着要做一些只对你有意义的事情的时候,你的系统环境可能变得无从适应。 + +### 小小的选择,大大的意义 + +并非所有创新都是大的或重要的,但总的来说,它们带来的变化并不小。如今,数百万用户的那些疯狂想法在 Linux 的各个部分中愈发显现。它们存在于 KDE 或 GNOME 桌面的工作方式中,存在于 [31 种不同的文本编辑器][3] 中 —— 每一种都有人喜爱,存在于不计其数的浏览器插件和多媒体应用程序中,存在于文件系统和扩展属性中,以及数以百万行计的 Linux 内核代码中。而且,如果上述功能中的哪怕仅其中一项,能让你每天额外节省下一小时时间,陪家人、朋友或用在自己的业余爱好上,那么按照定义,套用一句老话就是,“改变生活”。 + +### 在社区中交流 + +开源的重要组成部分之一是共享工作。共享代码是开源软件中显而易见的、普遍流行的事务,但我认为,分享,可不仅仅是在 Gitlab 做一次提交那么简单。当人们彼此分享着自己的奇思妙想,除了获得有用的代码贡献作为回报外,再无其他动机,我们都认为这是一种馈赠。这与你花钱从某公司购买软件时的感觉非常不同,甚至与得到某公司对外分享他们自己生产的开源代码时的感觉也有很大不同。开源的实质是,由全人类创造,服务于全人类。当知识和灵感可以被自由地分享时,人与人之间就建立了连接,这是市场营销活动无法复制的东西,我认为我们都认同这一点。 + +### 选择 + +Linux 并不是唯一拥有很多选择的平台。无论使用哪种操作系统,你都可以找到针对同一问题的多种解决方案,尤其是在深入研究开源软件的时候。但是,Linux 明显的选择水准指示了推动 Linux 前进的因素:诚邀协作。在 Linux 上,有些创造会很快消失,有些会在你家用电脑中保留数年 —— 即便只是执行一些不起眼的自动化任务,然而有一些则非常成功,以至于被其他系统平台借鉴并变得司空见惯。没关系,无论你在 Linux 上创作出什么,都请毫不犹豫地把它加入千奇百怪的选择之中,你永远都不知道它可能会激发到谁的灵感。 + +--- + +via: https://opensource.com/article/21/2/linux-choice + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[max27149](https://github.com/max27149) +校对:[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/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer) +[2]: https://opensource.com/article/19/12/seeeduino-nano-review +[3]: https://opensource.com/article/21/1/text-editor-roundup diff --git a/published/202104/20210225 How to use the Linux anacron command.md b/published/202104/20210225 How to use the Linux anacron command.md new file mode 100644 index 0000000000..ea7e31d4fe --- /dev/null +++ b/published/202104/20210225 How to use the Linux anacron command.md @@ -0,0 +1,160 @@ +[#]: subject: (How to use the Linux anacron command) +[#]: via: (https://opensource.com/article/21/2/linux-automation) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13270-1.html) + +如何使用 Linux anacron 命令 +====== + +> 与其手动执行重复性的任务,不如让 Linux 为你做。 + +![](https://img.linux.net.cn/data/attachment/album/202104/06/084133bphrxxeolhoyqr0o.jpg) + +在 2021 年,人们有更多的理由喜欢 Linux。在这个系列中,我将分享使用 Linux 的 21 个不同理由。自动化是使用 Linux 的最佳理由之一。 + +我最喜欢 Linux 的一个原因是它愿意为我做工作。我不想执行重复性的任务,这些任务会占用我的时间,或者容易出错,或者我可能会忘记,我安排 Linux 为我做这些工作。 + +### 为自动化做准备 + +“自动化”这个词既让人望而生畏,又让人心动。我发现用模块化的方式来处理它是有帮助的。 + +#### 1、你想实现什么? + +首先,要知道你想产生什么结果。你是要给图片加水印吗?从杂乱的目录中删除文件?执行重要数据的备份?为自己明确定义任务,这样你就知道自己的目标是什么。如果有什么任务是你发现自己每天都在做的,甚至一天一次以上,那么它可能是自动化的候选者。 + +#### 2、学习你需要的应用 + +将大的任务分解成小的组件,并学习如何手动但以可重复和可预测的方式产生每个结果。在 Linux 上可以做的很多事情都可以用脚本来完成,但重要的是要认识到你当前的局限性。学习如何自动调整几张图片的大小,以便可以方便地通过电子邮件发送,与使用机器学习为你的每周通讯生成精心制作的艺术品之间有天壤之别。有的事你可以在一个下午学会,而另一件事可能要花上几年时间。然而,我们都必须从某个地方开始,所以只要从小做起,并时刻注意改进的方法。 + +#### 3、自动化 + +在 Linux 上使用一个自动化工具来定期实现它。这就是本文介绍的步骤! + +要想自动化一些东西,你需要一个脚本来自动化一个任务。在测试时,最好保持简单,所以本文自动化的任务是在 `/tmp` 目录下创建一个名为 `hello` 的文件。 + +``` +#!/bin/sh + +touch /tmp/hello +``` + +将这个简单的脚本复制并粘贴到一个文本文件中,并将其命名为 `example`。 + +### Cron + +每个安装好的 Linux 系统都会有的内置自动化解决方案就是 cron 系统。Linux 用户往往把 cron 笼统地称为你用来安排任务的方法(通常称为 “cron 作业”),但有多个应用程序可以提供 cron 的功能。最通用的是 [cronie][2];它的优点是,它不会像历史上为系统管理员设计的 cron 应用程序那样,假设你的计算机总是开着。 + +验证你的 Linux 发行版提供的是哪个 cron 系统。如果不是 cronie,你可以从发行版的软件仓库中安装 cronie。如果你的发行版没有 cronie 的软件包,你可以使用旧的 anacron 软件包来代替。`anacron` 命令是包含在 cronie 中的,所以不管你是如何获得它的,你都要确保在你的系统上有 `anacron` 命令,然后再继续。anacron 可能需要管理员 root 权限,这取决于你的设置。 + +``` +$ which anacron +/usr/sbin/anacron +``` + +anacron 的工作是确保你的自动化作业定期执行。为了做到这一点,anacron 会检查找出最后一次运行作业的时间,然后检查你告诉它运行作业的频率。 + +假设你将 anacron 设置为每五天运行一次脚本。每次你打开电脑或从睡眠中唤醒电脑时,anacron都会扫描其日志以确定是否需要运行作业。如果一个作业在五天或更久之前运行,那么 anacron 就会运行该作业。 + +### Cron 作业 + +许多 Linux 系统都捆绑了一些维护工作,让 cron 来执行。我喜欢把我的工作与系统工作分开,所以我在我的主目录中创建了一个目录。具体来说,有一个叫做 `~/.local` 的隐藏文件夹(“local” 的意思是它是为你的用户账户定制的,而不是为你的“全局”计算机系统定制的),所以我创建了子目录 `etc/cron.daily` 来作为 cron 在我的系统上的家目录。你还必须创建一个 spool 目录来跟踪上次运行作业的时间。 + +``` +$ mkdir -p ~/.local/etc/cron.daily ~/.var/spool/anacron +``` + +你可以把任何你想定期运行的脚本放到 `~/.local/etc/cron.daily` 目录中。现在把 `example` 脚本复制到目录中,然后 [用 chmod 命令使其可执行][3]。 + +``` +$ cp example ~/.local/etc/cron.daily +# chmod +x ~/.local/etc/cron.daily/example +``` + +接下来,设置 anacron 来运行位于 `~/.local/etc/cron.daily` 目录下的任何脚本。 + +### anacron + +默认情况下,cron 系统的大部分内容都被认为是系统管理员的领域,因为它通常用于重要的底层任务,如轮换日志文件和更新证书。本文演示的配置是为普通用户设置个人自动化任务而设计的。 + +要配置 anacron 来运行你的 cron 作业,请在 `/.local/etc/anacrontab` 创建一个配置文件: + +``` +SHELL=/bin/sh +PATH=/sbin:/bin:/usr/sbin:/usr/bin +1  0  cron.mine    run-parts /home/tux/.local/etc/cron.daily/ +``` + +这个文件告诉 anacron 每到新的一天(也就是每日),延迟 0 分钟后,就运行(`run-parts`)所有在 `~/.local/etc/cron.daily` 中找到的可执行脚本。有时,会使用几分钟的延迟,这样你的计算机就不会在你登录后就被所有可能的任务冲击。不过这个设置适合测试。 + +`cron.mine` 值是进程的一个任意名称。我称它为 `cron.mine`,但你也可以称它为 `cron.personal` 或 `penguin` 或任何你想要的名字。 + +验证你的 `anacrontab` 文件的语法: + +``` +$ anacron -T -t ~/.local/etc/anacrontab \ + -S /home/tux/.var/spool/anacron +``` + +沉默意味着成功。 + +### 在 .profile 中添加 anacron + +最后,你必须确保 anacron 以你的本地配置运行。因为你是以普通用户而不是 root 用户的身份运行 anacron,所以你必须将它引导到你的本地配置:告诉 anacron 要做什么的 `anacrontab` 文件,以及帮助 anacron 跟踪每一个作业最后一次执行是多少天的 spool 目录: + +``` +anacron -fn -t /home/tux/.local/etc/anacrontab \ + -S /home/tux/.var/spool/anacron +``` + +`-fn` 选项告诉 anacron *忽略* 时间戳,这意味着你强迫它无论如何都要运行你的 cron 作业。这完全是为了测试的目的。 + +### 测试你的 cron 作业 + +现在一切都设置好了,你可以测试作业了。从技术上讲,你可以在不重启的情况下进行测试,但重启是最有意义的,因为这就是设计用来处理中断和不规则的登录会话的。花点时间重启电脑、登录,然后寻找测试文件: + +``` +$ ls /tmp/hello +/tmp/hello +``` + +假设文件存在,那么你的示例脚本已经成功执行。现在你可以从 `~/.profile` 中删除测试选项,留下这个作为你的最终配置。 + +``` +anacron -t /home/tux/.local/etc/anacrontab \ + -S /home/tux/.var/spool/anacron +``` + +### 使用 anacron + +你已经配置好了你的个人自动化基础设施,所以你可以把任何你想让你的计算机替你管理的脚本放到 `~/.local/etc/cron.daily` 目录下,它就会按计划运行。 + +这取决于你希望作业运行的频率。示例脚本是每天执行一次。很明显,这取决于你的计算机在任何一天是否开机和醒着。如果你在周五使用电脑,但把它设置在周末,脚本就不会在周六和周日运行。然而,在周一,脚本会执行,因为 anacron 会知道至少有一天已经过去了。你可以在 `~/.local/etc` 中添加每周、每两周、甚至每月的目录,以安排各种各样的间隔。 + +要添加一个新的时间间隔: + + 1. 在 `~/.local/etc` 中添加一个目录(例如 `cron.weekly`)。 + 2. 在 `~/.local/etc/anacrontab` 中添加一行,以便在新目录下运行脚本。对于每周一次的间隔,其配置如下。`7 0 cron.mine run-parts /home/tux/.local/etc/cron.weekly/`(`0` 的值可以选择一些分钟数,以适当地延迟脚本的启动)。 + 3. 把你的脚本放在 `cron.weekly` 目录下。 + +欢迎来到自动化的生活方式。它不会让人感觉到,但你将会变得更有效率。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-automation + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt) +[2]: https://github.com/cronie-crond/cronie +[3]: https://opensource.com/article/19/8/linux-chmod-command diff --git a/published/202104/20210303 5 signs you might be a Rust programmer.md b/published/202104/20210303 5 signs you might be a Rust programmer.md new file mode 100644 index 0000000000..a2e2de6079 --- /dev/null +++ b/published/202104/20210303 5 signs you might be a Rust programmer.md @@ -0,0 +1,73 @@ +[#]: subject: (5 signs you might be a Rust programmer) +[#]: via: (https://opensource.com/article/21/3/rust-programmer) +[#]: author: (Mike Bursell https://opensource.com/users/mikecamel) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13280-1.html) + +你可能是 Rust 程序员的五个迹象 +====== + +> 在我学习 Rust 的过程中,我注意到了 Rust 一族的一些常见行为。 + +![](https://img.linux.net.cn/data/attachment/album/202104/08/233233asbjasbfuiuosiha.jpg) + +我是最近才 [皈依 Rust][2] 的,我大约在是 2020 年 4 月底开始学习的。但是,像许多皈依者一样,我还是一个热情的布道者。说实话,我也不是一个很好的 Rust 人,因为我的编码风格不是很好,我写的也不是特别符合 Rust 习惯。我猜想这一方面是因为我在写大量代码之前还没有没有真正学完 Rust(其中一些代码又困扰了我),另一方面是因为我并不是那么优秀的程序员。 + +但我喜欢 Rust,你也应该喜欢吧。它很友好,比 C 或 C++ 更友好;它为低级系统任务做好了准备,这比 Python 做的更好;而且结构良好,这要超过 Perl;而且,最重要的是,从设计层面开始,它就是完全开源的,这要比 Java 那些语言好得多。 + +尽管我缺乏专业知识,但我注意到了一些我认为是许多 Rust 爱好者和程序员的共同点。如果你对以下五个迹象点头(其中第一个迹象是由最近的一些令人兴奋的新闻引发的),那么你也可能是一个 Rust 程序员。 + +### 1、“基金会”一词会使你兴奋 + +对于 Rust 程序员来说,“基金会”一词将不再与艾萨克·阿西莫夫Isaac Asimov关联在一起,而是与新成立的 [Rust 基金会][3] 关联。微软、华为、谷歌、AWS 和Mozilla 为该基金会提供了董事(大概也提供了大部分初始资金),该基金会将负责该语言的各个方面,“预示着 Rust 成为企业生产级技术的到来”,[根据临时执行董事][4] Ashley Williams 说。(顺便说一句,很高兴看到一位女士领导这样一项重大的行业计划。) + +该基金会似乎致力于维护 Rust 的理念,并确保每个人都有参与的机会。在许多方面,Rust 都是开源项目的典型示例。并不是说它是完美的(无论是语言还是社区),而是因为似乎有足够的爱好者致力于维护高参与度、低门槛的社区方式,我认为这是许多开源项目的核心。我强烈欢迎此举,我认为这只会帮助促进 Rust 在未来数年和数月内的采用和成熟。 + +### 2、你会因为新闻源中提到 Rust 游戏而感到沮丧 + +还有一款和电脑有关的东西,也叫做“Rust”,它是一款“只限多玩家生存类的电子游戏”。它比 Rust 这个语言更新一些(2013 年宣布,2018 年发布),但我曾经在搜索 Rust 相关的内容时,犯了一个错误,用这个名字搜索了游戏。互联网络就是这样的,这意味着我的新闻源现在被这个另类的 Rust 野兽感染了,我现在会从它的影迷和公关人员那里随机得到一些更新消息。这是个低调的烦恼,但我很确定在 Rust(语言)社区中并不是就我一个人这样。我强烈建议,如果你确实想了解更多关于这个计算世界的后起之秀的信息,你可以使用一个提高隐私(我拒绝说 "保护隐私")的 [开源浏览器][5] 来进行研究。 + +### 3、“不安全”这个词会让你感到恐惧。 + +Rust(语言,再次强调)在帮助你做**正确的事情**™方面做得非常好,当然,在内存安全方面,这是 C 和 C++ 内部的主要关注点(不是因为不可能做到,而是因为真的很难持续正确)。Dave Herman 在 2016 年写了一篇文章《[Safety is Rust's fireflower][6]》,讲述了为什么安全是 Rust 语言的一个积极属性。安全性(内存、类型安全)可能并不赏心悦目,但随着你写的 Rust 越多,你就会习惯并感激它,尤其是当你参与任何系统编程时,这也是 Rust 经常擅长的地方。 + +现在,Rust 并不能阻止你做**错误的事情**™,但它确实通过让你使用 `unsafe` 关键字,让你在希望超出安全边界的时候做出一个明智的决定。这不仅对你有好处,因为它(希望)会让你非常、非常仔细地思考你在任何使用它的代码块中放入了什么;它对任何阅读你的代码的人也有好处,这是一个触发词,它能让任何不太清醒的 Rust 人至少可以稍微打起精神,在椅子上坐直,然后想:“嗯,这里发生了什么?我需要特别注意。”如果幸运的话,读你代码的人也许能想到重写它的方法,使它利用到 Rust 的安全特性,或者至少减少提交和发布的不安全代码的数量。 + +### 4、你想知道为什么没有 `?;`、`{:?}` 、`::<>` 这样的表情符号 + +人们喜欢(或讨厌)涡轮鱼(`::<>`),但在 Rust 代码中你经常还会看到其他的语义结构。特别是 `{:?}` (用于字符串格式化)和 `?;`(`?` 是向调用栈传播错误的一种方式,`;` 则是行/块的结束符,所以你经常会看到它们在一起)。它们在 Rust 代码中很常见,你只需边走边学,边走边解析,而且它们也很有用,我有时会想,为什么它们没有被纳入到正常对话中,至少可以作为表情符号。可能还有其他的。你有什么建议? + +### 5、Clippy 是你的朋友(而不是一个动画回形针) + +微软的动画回形针 Clippy 可能是 Office 用户很快就觉得讨厌的“功能”,并成为许多 [模因][7] 的起点。另一方面,`cargo clippy` 是那些 [很棒的 Cargo 命令][8] 之一,应该成为每个 Rust 程序员工具箱的一部分。Clippy 是一个语言整洁器Linter,它可以帮助改进你的代码,使它更干净、更整洁、更易读、更惯用,让你与同事或其他人分享 Rust 代码时,不会感到尴尬。Cargo 可以说是让 “Clippy” 这个名字恢复了声誉,虽然我不会选择给我的孩子起这个名字,但现在每当我在网络上遇到这个词的时候,我不会再有一种不安的感觉。 + +* * * + +这篇文章最初发表在 [Alice, Eve, and Bob] [9]上,经作者许可转载。 + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/rust-programmer + +作者:[Mike Bursell][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/mikecamel +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/EDU_OSDC_IntroOS_520x292_FINAL.png?itok=woiZamgj (name tag that says hello my name is open source) +[2]: https://opensource.com/article/20/6/why-rust +[3]: https://foundation.rust-lang.org/ +[4]: https://foundation.rust-lang.org/posts/2021-02-08-hello-world/ +[5]: https://opensource.com/article/19/7/open-source-browsers +[6]: https://www.thefeedbackloop.xyz/safety-is-rusts-fireflower/ +[7]: https://knowyourmeme.com/memes/clippy +[8]: https://opensource.com/article/20/11/commands-rusts-cargo +[9]: https://aliceevebob.com/2021/02/09/5-signs-that-you-may-be-a-rust-programmer/ diff --git a/published/202104/20210308 Cast your Android device with a Raspberry Pi.md b/published/202104/20210308 Cast your Android device with a Raspberry Pi.md new file mode 100644 index 0000000000..b41dd7f427 --- /dev/null +++ b/published/202104/20210308 Cast your Android device with a Raspberry Pi.md @@ -0,0 +1,141 @@ +[#]: subject: (Cast your Android device with a Raspberry Pi) +[#]: via: (https://opensource.com/article/21/3/android-raspberry-pi) +[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13314-1.html) + +将你的安卓手机屏幕投射到 Linux +====== + +> 使用 Scrcpy 可以把你的手机屏幕变成一个“应用”,与在树莓派或任何其他基于 Linux 的设备上的应用一起运行。 + +![](https://img.linux.net.cn/data/attachment/album/202104/20/162346alpbh85xz26xcb5h.jpg) + +要远离我们日常使用的电子产品是很难的。在熙熙攘攘的现代生活中,我想确保我不会错过手机屏幕上弹出的来自朋友和家人的重要信息。我也很忙,不希望迷失在令人分心的事情中,但是拿起手机并且回复信息往往会使我分心。 + +更糟糕的是,有很多的设备。幸运地是,大多数的设备(从功能强大的笔记本电脑到甚至不起眼的树莓派)都可以运行 Linux。因为它们运行的是 Linux,所以我为一种设置找到的解决方案几乎都适用于其他设备。 + +### 普遍适用 + +我想要一种无论我使用什么屏幕,都能统一我生活中不同来源的数据的方法。 + +我决定通过把手机屏幕复制到电脑上来解决这个问题。本质上,我把手机变成了一个“应用”,可以和我所有的其他程序运行在一起。这有助于我将注意力集中在桌面上,防止我走神,并使我更容易回复紧急通知。 + +听起来有吸引力吗?你也可以这样做。 + +### 设置 Scrcpy + +[Scrcpy][2] 俗称屏幕复制(Screen Copy),是一个开源的屏幕镜像工具,它可以在 Linux、Windows 或者 macOS 上显示和控制安卓设备。安卓设备和计算机之间的通信主要是通过 USB 连接和安卓调试桥Android Debug Bridge(ADB)。它使用 TCP/IP,且不需要 root 权限访问。 + +Scrcpy 的设置和配置非常简单。如果你正在运行 Fedora,你可以从 COPR 仓库安装它: + +``` +$ sudo dnf copr enable zeno/scrcpy +$ sudo dnf install scrcpy -y +``` + +在 Debian 或者 Ubuntu 上: + +``` +$ sudo apt install scrcpy +``` + +你也可以自己编译 Scrcpy。即使是在树莓派上,按照 [Scrcpy 的 GitHub 主页][3] 上的说明来构建也不需要很长时间。 + +### 设置手机 + +Scrcpy 安装好后,你必须启用 USB 调试并授权每个设备(你的树莓派、笔记本电脑或者工作站)为受信任的控制器。 + +打开安卓上的“设置”应用程序。如果“开发者选项”没有被激活,按照安卓的 [说明来解锁它][4]。 + +接下来,启用“USB 调试”。 + +![Enable USB Debugging option][5] + +然后通过 USB 将手机连接到你的树莓派或者笔记本电脑(或者你正在使用的任何设备),如果可以选择的话,将模式设置为 [PTP][7]。如果你的手机不能使用 PTP,将你的手机设置为用于传输文件的模式(而不是,作为一个叠接tethering或者 MIDI 设备)。 + +你的手机可能会提示你授权你的电脑,这是通过它的 RSA 指纹进行识别的。你只需要在你第一次连接的时候操作即可,在之后你的手机会识别并信任你的计算机。 + +使用 `lsusb` 命令确认设置: + +``` +$ lsusb +Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +Bus 011 Device 004: ID 046d:c21d Logitech, Inc. F310 Gamepad +Bus 005 Device 005: ID 0951:1666 Kingston Technology DataTraveler G4 +Bus 005 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub +Bus 004 Device 001: ID 18d1:4ee6 Google Inc. Nexus/Pixel Device (PTP + debug) +Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub +Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +``` + +然后执行 `scrcpy` 以默认设置运行。 + +![Scrcpy running on a Raspberry Pi][8] + +性能和响应能力取决于你使用什么设备来控制你的手机。在树莓派派上,一些动画可能会变慢,甚至有时候会响应滞后。Scrcpy 提供了一个简单的解决办法:降低 Scrcpy 显示图像的位速率和分辨率使得你的计算机能够容易显示动画。使用以下命令来实现: + +``` +$ scrcpy --bit-rate 1M --max-size 800 +``` + +尝试不同的值来找到一个适合你的值。为了使键入更方便,在选定一个命令之后,可以考虑 [创建自己的 Bash 别名][9]。 + +### 剪断连线 + +Scrcpy 开始运行后,你甚至可以通过 WiFi 连接你的手机和计算机。Scrcpy 安装过程也会安装 `adb`,它是一个与安卓设备通信的命令。Scrcpy 也可以使用这个命令与你的设备通信,`adb` 可以通过 TCP/IP 连接。 + +![Scrcpy running on a computer][10] + +要尝试的话,请确保你的手机通过 WiFi 连在与你的计算机所使用的相同的无线网络上。依然不要断开你的手机与 USB 的连接! + +接下来,通过手机中的“设置”,选择“关于手机”来获取你手机的 IP 地址。查看“状态”选项来获得你的地址。它通常是 192.168 或者 10 开头。 + +或者,你也可以使用 `adb` 来获得你手机的IP地址: + +``` +$ adb shell ip route | awk '{print $9}' + +To connect to your device over WiFi, you must enable TCP/IP connections. This, you must do through the adb command: +$ adb tcpip 5555 +Now you can disconnect your mobile from USB. +Whenever you want to connect over WiFi, first connect to the mobile with the command adb connect. For instance, assuming my mobile's IP address is 10.1.1.22, the command is: +$ adb connect 10.1.1.22:5555 +``` + +连接好之后,你就可以像往常一样运行 Scrcpy 了。 + +### 远程控制 + +Scrcpy 很容易使用。你可以在终端或者 [一个图形界面应用][11] 中尝试它。 + +你是否在使用其它的屏幕镜像工具?如果有的话,请在评论中告诉我们吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/android-raspberry-pi + +作者:[Sudeshna Sur][a] +选题:[lujun9972][b] +译者:[ShuyRoy](https://github.com/ShuyRoy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/sudeshna-sur +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/idea_innovation_mobile_phone.png?itok=RqVtvxkd (A person looking at a phone) +[2]: https://github.com/Genymobile/scrcpy +[3]: https://github.com/Genymobile/scrcpy/blob/master/BUILD.md +[4]: https://developer.android.com/studio/debug/dev-options +[5]: https://opensource.com/sites/default/files/uploads/usb-debugging.jpg (Enable USB Debugging option) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://en.wikipedia.org/wiki/Picture_Transfer_Protocol +[8]: https://opensource.com/sites/default/files/uploads/scrcpy-pi.jpg (Scrcpy running on a Raspberry Pi) +[9]: https://opensource.com/article/19/7/bash-aliases +[10]: https://opensource.com/sites/default/files/uploads/ssur-desktop.png (Scrcpy running on a computer) +[11]: https://opensource.com/article/19/9/mirror-android-screen-guiscrcpy diff --git a/published/202104/20210317 My favorite open source project management tools.md b/published/202104/20210317 My favorite open source project management tools.md new file mode 100644 index 0000000000..e52c2a9a92 --- /dev/null +++ b/published/202104/20210317 My favorite open source project management tools.md @@ -0,0 +1,167 @@ +[#]: subject: (My favorite open source project management tools) +[#]: via: (https://opensource.com/article/21/3/open-source-project-management) +[#]: author: (Frank Bergmann https://opensource.com/users/fraber) +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13344-1.html) + +我最喜欢的开源项目管理工具 +====== + +> 如果你要管理大型复杂的项目,请尝试利用开源选择替换 MS-Project。 + +![](https://img.linux.net.cn/data/attachment/album/202104/29/145942py6qcc3lz1dyt1s6.jpg) + +诸如建造卫星、开发机器人或推出新产品之类的项目都是昂贵的,涉及不同的提供商,并且包含必须跟踪的硬依赖性。 + +大型项目领域中的项目管理方法非常简单(至少在理论上如此)。你可以创建项目计划并将其拆分为较小的部分,直到你可以合理地将成本、持续时间、资源和依赖性分配给各种活动。一旦项目计划获得负责人的批准,你就可以使用它来跟踪项目的执行情况。在时间轴上绘制项目的所有活动将产生一个称为[甘特图][2]Gantt chart的条形图。 + +甘特图一直被用于 [瀑布项目方法][3],也可以用于敏捷方法。例如,大型项目可能将甘特图用于 Scrum 冲刺,而忽略其他像用户需求这样的细节,从而嵌入敏捷阶段。其他大型项目可能包括多个产品版本(例如,最低可行产品 [MVP]、第二版本、第三版本等)。在这种情况下,上层结构是一种敏捷方法,而每个阶段都计划为甘特图,以处理预算和复杂的依赖关系。 + +### 项目管理工具 + +不夸张地说,有数百种现成的工具使用甘特图管理大型项目,而 MS-Project 可能是最受欢迎的工具。它是微软办公软件家族的一部分,可支持到成千上万的活动,并且有大量的功能,支持几乎所有可以想象到的管理项目进度的方式。对于 MS-Project,有时候你并不知道什么更昂贵:是软件许可证还是该工具的培训课程。 + +另一个缺点是 MS-Project 是一个独立的桌面应用程序,只有一个人可以更新进度表。如果要多个用户进行协作,则需要购买微软 Project 服务器、Web 版的 Project 或 Planner 的许可证。 + +幸运的是,专有工具还有开源的替代品,包括本文中提及的应用程序。所有这些都是开源的,并且包括基于资源和依赖项的分层活动调度的甘特图。ProjectLibre、GanttProject 和 TaskJuggler 都针对单个项目经理的桌面应用程序。ProjeQtOr 和 Redmine 是用于项目团队的 Web 应用程序,而 ]project-open[ 是用于管理整个组织的 Web 应用程序。 + +我根据一个单用户计划和对一个大型项目的跟踪评估了这些工具。我的评估标准包括甘特图编辑器功能、Windows/Linux/macOS 上的可用性、可扩展性、导入/导出和报告。(背景披露:我是 ]project-open[ 的创始人,我在多个开源社区中活跃了很多年。此列表包括我们的产品,因此我的观点可能有偏见,但我尝试着眼于每个产品的最佳功能。) + +### Redmine 4.1.0 + +![Redmine][4] + +[Redmine][6] 是一个基于 Web 的专注于敏捷方法论的项目管理工具。 + +其标准安装包括一个甘特图时间轴视图,但缺少诸如调度、拖放、缩进(缩排和凸排)以及资源分配之类的基本功能。你必须单独编辑任务属性才能更改任务树的结构。 + +Redmine 具有甘特图编辑器插件,但是它们要么已经过时(例如 [Plus Gantt][7]),要么是专有的(例如 [ANKO 甘特图][8])。如果你知道其他开源的甘特图编辑器插件,请在评论中分享它们。 + +Redmine 用 Ruby on Rails 框架编写,可用于 Windows、Linux 和 macOS。其核心部分采用 GPLv2 许可证。 + + * **适合于:** 使用敏捷方法的 IT 团队。 + * **独特卖点:** 这是 OpenProject 和 EasyRedmine 的原始“上游”父项目。 + +### ]project-open[ 5.1 + +![\]project-open\[][9] + +[\]project-open\[][10] 是一个基于 Web 的项目管理系统,从整个组织的角度看类似于企业资源计划enterprise resource planning(ERP)系统。它还可以管理项目档案、预算、发票、销售、人力资源和其他功能领域。有一些不同的变体,如用于管理项目公司的专业服务自动化professional services automation(PSA)、用于管理企业战略项目的项目管理办公室project management office(PMO)和用于管理部门项目的企业项目管理enterprise project management(EPM)。 + +]project-open[ 甘特图编辑器包括按等级划分的任务、依赖关系和基于计划工作和分配资源的调度。它不支持资源日历和非人力资源。]project-open[ 系统非常复杂,其 GUI 可能需要刷新。 + +]project-open[ 是用 TCL 和 JavaScript 编写的,可用于 Windows 和 Linux。 ]project-open[ 核心采用 GPLv2 许可证,并具有适用于大公司的专有扩展。 + + * **适合于:** 需要大量财务项目报告的大中型项目组织。 + * **独特卖点:** ]project-open[ 是一个综合系统,可以运行整个项目公司或部门。 + +### ProjectLibre 1.9.3 + +![ProjectLibre][11] + +在开源世界中,[ProjectLibre][12] 可能是最接近 MS-Project 的产品。它是一个桌面应用程序,支持所有重要的项目计划功能,包括资源日历、基线和成本管理。它还允许你使用 MS-Project 的文件格式导入和导出计划。 + +ProjectLibre 非常适合计划和执行中小型项目。然而,它缺少 MS-Project 中的一些高级功能,并且它的 GUI 并不是最漂亮的。 + +ProjectLibre 用 Java 编写,可用于 Windows、Linux 和macOS,并在开源的通用公共署名许可证Common Public Attribution License(CPAL)下授权。ProjectLibre 团队目前正在开发一个名为 ProjectLibre Cloud 的 Web 产品,并采用专有许可证。 + + * **适合于:** 负责中小型项目的个人项目管理者,或者作为没有完整的 MS-Project 许可证的项目成员的查看器。 + * **独特卖点:** 这是最接近 MS-Project 的开源软件。 + +### GanttProject 2.8.11 + +![GanttProject][13] + +[GanttProject][14] 与 ProjectLibre 类似,它是一个桌面甘特图编辑器,但功能集更为有限。它不支持基线,也不支持非人力资源,并且报告功能比较有限。 + +GanttProject 是一个用 Java 编写的桌面应用程序,可在 GPLv3 许可下用于 Windows、Linux 和 macOS。 + + * **适合于:** 简单的甘特图或学习基于甘特图的项目管理技术。 + * **独特卖点:** 它支持流程评估和审阅技术program evaluation and review technique([PERT][15])图表,并使用 WebDAV 的协作。 + +### TaskJuggler 3.7.1 + +![TaskJuggler][16] + +[TaskJuggler][17] 用于在大型组织中安排多个并行项目,重点是自动解决资源分配冲突(即资源均衡)。 + +它不是交互式的甘特图编辑器,而是一个命令行工具,其工作方式类似于一个编译器:它从文本文件中读取任务列表,并生成一系列报告,这些报告根据分配的资源、依赖项、优先级和许多其他参数为每个任务提供最佳的开始和结束时间。它支持多个项目、基线、资源日历、班次和时区,并且被设计为可扩展到具有许多项目和资源的企业场景。 + +使用特定语法编写 TaskJuggler 输入文件可能超出了普通项目经理的能力。但是,你可以使用 ]project-open[ 作为 TaskJuggler 的图形前端来生成输入,包括缺勤、任务进度和记录的工作时间。当以这种方式使用时,TaskJuggler 就成为了功能强大的假设情景规划器。 + +TaskJuggler 用 Ruby 编写,并且在 GPLv2 许可证下可用于 Windows、Linux 和 macOS。 + + * **适合于:** 由真正的技术极客管理的中大型部门。 + * **独特卖点:** 它在自动资源均衡方面表现出色。 + +### ProjeQtOr 9.0.4 + +![ProjeQtOr][18] + +[ProjeQtOr][19] 是适用于 IT 项目的、基于 Web 的项目管理应用程序。除了项目、工单和活动外,它还支持风险、预算、可交付成果和财务文件,以将项目管理的许多方面集成到单个系统中。 + +ProjeQtOr 提供了一个甘特图编辑器,与 ProjectLibre 功能类似,包括按等级划分的任务、依赖关系以及基于计划工作和分配资源。但是,它不支持取值的就地编辑(例如,任务名称、估计时间等);用户必须在甘特图视图下方的输入表单中更改取值,然后保存。 + +ProjeQtOr 用 PHP 编写,并且在 Affero GPL3 许可下可用于 Windows、Linux 和 macOS。 + + * **适合于:** 跟踪项目列表的 IT 部门。 + * **独特卖点:** 让你为存储每个项目的大量信息,将所有信息保存在一个地方。 + +### 其他工具 + +对于特定的用例,以下系统可能是有效的选择,但由于各种原因,它们被排除在主列表之外。 + +![LIbrePlan][20] + + * [LibrePlan][21] 是一个基于 Web 的项目管理应用程序,专注于甘特图。由于其功能集,它本来会在上面的列表中会占主导地位,但是没有可用于最新 Linux 版本(CentOS 7 或 8)的安装。作者说,更新的说明将很快推出。 + * [dotProject][22] 是一个用 PHP 编写的基于 Web 的项目管理系统,可在 GPLv2.x 许可证下使用。它包含一个甘特图时间轴报告,但是没有编辑它的选项,并且依赖项还不起作用(它们“仅部分起作用”)。 + * [Leantime][23] 是一个基于 Web 的项目管理系统,具有漂亮的用 PHP 编写的 GUI,并且可以在 GPLv2 许可证下使用。它包括一个里程碑的甘特时间线,但没有依赖性。 + * [Orangescrum][24] 是基于 Web 的项目管理工具。甘特图图可以作为付费附件或付费订阅使用。 + * [Talaia/OpenPPM][25] 是一个基于 Web 的项目组合管理系统。但是,版本 4.6.1 仍显示“即将推出:交互式甘特图”。 + * [Odoo][26] 和 [OpenProject][27] 都将某些重要功能限制在付费企业版中。 + +在这篇评论中,目的是包括所有带有甘特图编辑器和依赖调度的开源项目管理系统。如果我错过了一个项目或误导了什么,请在评论中让我知道。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/open-source-project-management + +作者:[Frank Bergmann][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/fraber +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kanban_trello_organize_teams_520.png?itok=ObNjCpxt (Kanban-style organization action) +[2]: https://en.wikipedia.org/wiki/Gantt_chart +[3]: https://opensource.com/article/20/3/agiles-vs-waterfall +[4]: https://opensource.com/sites/default/files/uploads/redmine.png (Redmine) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://www.redmine.org/ +[7]: https://redmine.org/plugins/plus_gantt +[8]: https://www.redmine.org/plugins/anko_gantt_chart +[9]: https://opensource.com/sites/default/files/uploads/project-open.png (]project-open[) +[10]: https://www.project-open.com +[11]: https://opensource.com/sites/default/files/uploads/projectlibre.png (ProjectLibre) +[12]: http://www.projectlibre.org +[13]: https://opensource.com/sites/default/files/uploads/ganttproject.png (GanttProject) +[14]: https://www.ganttproject.biz +[15]: https://en.wikipedia.org/wiki/Program_evaluation_and_review_technique +[16]: https://opensource.com/sites/default/files/uploads/taskjuggler.png (TaskJuggler) +[17]: https://taskjuggler.org/ +[18]: https://opensource.com/sites/default/files/uploads/projeqtor.png (ProjeQtOr) +[19]: https://www.projeqtor.org +[20]: https://opensource.com/sites/default/files/uploads/libreplan.png (LIbrePlan) +[21]: https://www.libreplan.dev/ +[22]: https://dotproject.net/ +[23]: https://leantime.io +[24]: https://orangescrum.org/ +[25]: http://en.talaia-openppm.com/ +[26]: https://odoo.com +[27]: http://openproject.org diff --git a/published/202104/20210318 Reverse Engineering a Docker Image.md b/published/202104/20210318 Reverse Engineering a Docker Image.md new file mode 100644 index 0000000000..0afe15981d --- /dev/null +++ b/published/202104/20210318 Reverse Engineering a Docker Image.md @@ -0,0 +1,287 @@ +[#]: subject: (Reverse Engineering a Docker Image) +[#]: via: (https://theartofmachinery.com/2021/03/18/reverse_engineering_a_docker_image.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13258-1.html) + +一次 Docker 镜像的逆向工程 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/01/215523oajrgjo77irb7nun.jpg) + +这要从一次咨询的失误说起:政府组织 A 让政府组织 B 开发一个 Web 应用程序。政府机构 B 把部分工作外包给某个人。后来,项目的托管和维护被外包给一家私人公司 C。C 公司发现,之前外包的人(已经离开很久了)构建了一个自定义的 Docker 镜像,并将其成为系统构建的依赖项,但这个人没有提交原始的 Dockerfile。C 公司有合同义务管理这个 Docker 镜像,可是他们他们没有源代码。C 公司偶尔叫我进去做各种工作,所以处理一些关于这个神秘 Docker 镜像的事情就成了我的工作。 + +幸运的是,Docker 镜像的格式比想象的透明多了。虽然还需要做一些侦查工作,但只要解剖一个镜像文件,就能发现很多东西。例如,这里有一个 [Prettier 代码格式化][1] 的镜像可供快速浏览。 + +首先,让 Docker 守护进程daemon拉取镜像,然后将镜像提取到文件中: + +``` +docker pull tmknom/prettier:2.0.5 +docker save tmknom/prettier:2.0.5 > prettier.tar +``` + +是的,该文件只是一个典型 tarball 格式的归档文件: + +``` +$ tar xvf prettier.tar +6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/ +6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/VERSION +6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/json +6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tar +88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json +a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/ +a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/VERSION +a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/json +a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tar +d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/ +d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/VERSION +d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/json +d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/layer.tar +manifest.json +repositories +``` + +如你所见,Docker 在命名时经常使用哈希hash。我们看看 `manifest.json`。它是以难以阅读的压缩 JSON 写的,不过 [JSON 瑞士军刀 jq][2] 可以很好地打印 JSON: + +``` +$ jq . manifest.json +[ + { + "Config": "88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json", + "RepoTags": [ + "tmknom/prettier:2.0.5" + ], + "Layers": [ + "a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tar", + "d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/layer.tar", + "6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tar" + ] + } +] +``` + +请注意,这三个Layer对应三个以哈希命名的目录。我们以后再看。现在,让我们看看 `Config` 键指向的 JSON 文件。它有点长,所以我只在这里转储第一部分: + +``` +$ jq . 88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json | head -n 20 +{ + "architecture": "amd64", + "config": { + "Hostname": "", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "Cmd": [ + "--help" + ], + "ArgsEscaped": true, + "Image": "sha256:93e72874b338c1e0734025e1d8ebe259d4f16265dc2840f88c4c754e1c01ba0a", +``` + +最重要的是 `history` 列表,它列出了镜像中的每一层。Docker 镜像由这些层堆叠而成。Dockerfile 中几乎每条命令都会变成一个层,描述该命令对镜像所做的更改。如果你执行 `RUN script.sh` 命令创建了 `really_big_file`,然后用 `RUN rm really_big_file` 命令删除文件,Docker 镜像实际生成两层:一个包含 `really_big_file`,一个包含 `.wh.really_big_file` 记录来删除它。整个镜像文件大小不变。这就是为什么你会经常看到像 `RUN script.sh && rm really_big_file` 这样的 Dockerfile 命令链接在一起——它保障所有更改都合并到一层中。 + +以下是该 Docker 镜像中记录的所有层。注意,大多数层不改变文件系统镜像,并且 `empty_layer` 标记为 `true`。以下只有三个层是非空的,与我们之前描述的相符。 + +``` +$ jq .history 88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json +[ + { + "created": "2020-04-24T01:05:03.608058404Z", + "created_by": "/bin/sh -c #(nop) ADD file:b91adb67b670d3a6ff9463e48b7def903ed516be66fc4282d22c53e41512be49 in / " + }, + { + "created": "2020-04-24T01:05:03.92860976Z", + "created_by": "/bin/sh -c #(nop) CMD [\"/bin/sh\"]", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:06.617130538Z", + "created_by": "/bin/sh -c #(nop) ARG BUILD_DATE", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:07.020521808Z", + "created_by": "/bin/sh -c #(nop) ARG VCS_REF", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:07.36915054Z", + "created_by": "/bin/sh -c #(nop) ARG VERSION", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:07.708820086Z", + "created_by": "/bin/sh -c #(nop) ARG REPO_NAME", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:08.06429638Z", + "created_by": "/bin/sh -c #(nop) LABEL org.label-schema.vendor=tmknom org.label-schema.name=tmknom/prettier org.label-schema.description=Prettier is an opinionated code formatter. org.label-schema.build-date=2020-04-29T06:34:01Z org +.label-schema.version=2.0.5 org.label-schema.vcs-ref=35d2587 org.label-schema.vcs-url=https://github.com/tmknom/prettier org.label-schema.usage=https://github.com/tmknom/prettier/blob/master/README.md#usage org.label-schema.docker.cmd=do +cker run --rm -v $PWD:/work tmknom/prettier --parser=markdown --write '**/*.md' org.label-schema.schema-version=1.0", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:08.511269907Z", + "created_by": "/bin/sh -c #(nop) ARG NODEJS_VERSION=12.15.0-r1", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:08.775876657Z", + "created_by": "/bin/sh -c #(nop) ARG PRETTIER_VERSION", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:26.399622951Z", + "created_by": "|6 BUILD_DATE=2020-04-29T06:34:01Z NODEJS_VERSION=12.15.0-r1 PRETTIER_VERSION=2.0.5 REPO_NAME=tmknom/prettier VCS_REF=35d2587 VERSION=2.0.5 /bin/sh -c set -x && apk add --no-cache nodejs=${NODEJS_VERSION} nodejs-np +m=${NODEJS_VERSION} && npm install -g prettier@${PRETTIER_VERSION} && npm cache clean --force && apk del nodejs-npm" + }, + { + "created": "2020-04-29T06:34:26.764034848Z", + "created_by": "/bin/sh -c #(nop) WORKDIR /work" + }, + { + "created": "2020-04-29T06:34:27.092671047Z", + "created_by": "/bin/sh -c #(nop) ENTRYPOINT [\"/usr/bin/prettier\"]", + "empty_layer": true + }, + { + "created": "2020-04-29T06:34:27.406606712Z", + "created_by": "/bin/sh -c #(nop) CMD [\"--help\"]", + "empty_layer": true + } +] +``` + +太棒了!所有的命令都在 `created_by` 字段中,我们几乎可以用这些命令重建 Dockerfile。但不是完全可以。最上面的 `ADD` 命令实际上没有给我们需要添加的文件。`COPY` 命令也没有全部信息。我们还失去了 `FROM` 语句,因为它们扩展成了从基础 Docker 镜像继承的所有层。 + +我们可以通过查看时间戳timestamp,按 Dockerfile 对层进行分组。大多数层的时间戳相差不到一分钟,代表每一层构建所需的时间。但是前两层是 `2020-04-24`,其余的是 `2020-04-29`。这是因为前两层来自一个基础 Docker 镜像。理想情况下,我们可以找出一个 `FROM` 命令来获得这个镜像,这样我们就有了一个可维护的 Dockerfile。 + +`manifest.json` 展示第一个非空层是 `a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tar`。让我们看看它: + +``` +$ cd a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/ +$ tar tf layer.tf | head +bin/ +bin/arch +bin/ash +bin/base64 +bin/bbconfig +bin/busybox +bin/cat +bin/chgrp +bin/chmod +bin/chown +``` + +看起来它可能是一个操作系统operating system基础镜像,这也是你期望从典型 Dockerfile 中看到的。Tarball 中有 488 个条目,如果你浏览一下,就会发现一些有趣的条目: + +``` +... +dev/ +etc/ +etc/alpine-release +etc/apk/ +etc/apk/arch +etc/apk/keys/ +etc/apk/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub +etc/apk/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub +etc/apk/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub +etc/apk/protected_paths.d/ +etc/apk/repositories +etc/apk/world +etc/conf.d/ +... +``` + +果不其然,这是一个 [Alpine][3] 镜像,如果你注意到其他层使用 `apk` 命令安装软件包,你可能已经猜到了。让我们解压 tarball 看看: + +``` +$ mkdir files +$ cd files +$ tar xf ../layer.tar +$ ls +bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var +$ cat etc/alpine-release +3.11.6 +``` + +如果你拉取、解压 `alpine:3.11.6`,你会发现里面有一个非空层,`layer.tar` 与 Prettier 镜像基础层中的 `layer.tar` 是一样的。 + +出于兴趣,另外两个非空层是什么?第二层是包含 Prettier 安装包的主层。它有 528 个条目,包含 Prettier、一堆依赖项和证书更新: + +``` +... +usr/lib/libuv.so.1 +usr/lib/libuv.so.1.0.0 +usr/lib/node_modules/ +usr/lib/node_modules/prettier/ +usr/lib/node_modules/prettier/LICENSE +usr/lib/node_modules/prettier/README.md +usr/lib/node_modules/prettier/bin-prettier.js +usr/lib/node_modules/prettier/doc.js +usr/lib/node_modules/prettier/index.js +usr/lib/node_modules/prettier/package.json +usr/lib/node_modules/prettier/parser-angular.js +usr/lib/node_modules/prettier/parser-babel.js +usr/lib/node_modules/prettier/parser-flow.js +usr/lib/node_modules/prettier/parser-glimmer.js +usr/lib/node_modules/prettier/parser-graphql.js +usr/lib/node_modules/prettier/parser-html.js +usr/lib/node_modules/prettier/parser-markdown.js +usr/lib/node_modules/prettier/parser-postcss.js +usr/lib/node_modules/prettier/parser-typescript.js +usr/lib/node_modules/prettier/parser-yaml.js +usr/lib/node_modules/prettier/standalone.js +usr/lib/node_modules/prettier/third-party.js +usr/local/ +usr/local/share/ +usr/local/share/ca-certificates/ +usr/sbin/ +usr/sbin/update-ca-certificates +usr/share/ +usr/share/ca-certificates/ +usr/share/ca-certificates/mozilla/ +usr/share/ca-certificates/mozilla/ACCVRAIZ1.crt +usr/share/ca-certificates/mozilla/AC_RAIZ_FNMT-RCM.crt +usr/share/ca-certificates/mozilla/Actalis_Authentication_Root_CA.crt +... +``` + +第三层由 `WORKDIR /work` 命令创建,它只包含一个条目: + +``` +$ tar tf 6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tar +work/ +``` + +[原始 Dockerfile 在 Prettier 的 git 仓库中][4]。 + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2021/03/18/reverse_engineering_a_docker_image.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://github.com/tmknom/prettier +[2]: https://stedolan.github.io/jq/ +[3]: https://www.alpinelinux.org/ +[4]: https://github.com/tmknom/prettier/blob/35d2587ec052e880d73f73547f1ffc2b11e29597/Dockerfile diff --git a/published/202104/20210324 Read and write files with Bash.md b/published/202104/20210324 Read and write files with Bash.md new file mode 100644 index 0000000000..d4e0e2b79e --- /dev/null +++ b/published/202104/20210324 Read and write files with Bash.md @@ -0,0 +1,192 @@ +[#]: subject: (Read and write files with Bash) +[#]: via: (https://opensource.com/article/21/3/input-output-bash) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13259-1.html) + +用 Bash 读写文件 +====== + +> 学习 Bash 读取和写入数据的不同方式,以及何时使用每种方法。 + +![](https://img.linux.net.cn/data/attachment/album/202104/01/223653bc334ac33e5e4pwe.jpg) + +当你使用 Bash 编写脚本时,有时你需要从一个文件中读取数据或向一个文件写入数据。有时文件可能包含配置选项,而另一些时候这个文件是你的用户用你的应用创建的数据。每种语言处理这个任务的方式都有些不同,本文将演示如何使用 Bash 和其他 [POSIX][2] shell 处理数据文件。 + +### 安装 Bash + +如果你在使用 Linux,你可能已经有了 Bash。如果没有,你可以在你的软件仓库里找到它。 + +在 macOS 上,你可以使用默认终端,Bash 或 [Zsh][3],这取决于你运行的 macOS 版本。 + +在 Windows 上,有几种方法可以体验 Bash,包括微软官方支持的 [Windows Subsystem for Linux][4](WSL)。 + +安装 Bash 后,打开你最喜欢的文本编辑器并准备开始。 + +### 使用 Bash 读取文件 + +除了是 [shell][5] 之外,Bash 还是一种脚本语言。有几种方法可以从 Bash 中读取数据。你可以创建一种数据流并解析输出, 或者你可以将数据加载到内存中。这两种方法都是有效的获取信息的方法,但每种方法都有相当具体的用例。 + +#### 在 Bash 中援引文件 + +当你在 Bash 中 “援引source” 一个文件时,你会让 Bash 读取文件的内容,期望它包含有效的数据,Bash 可以将这些数据放入它建立的数据模型中。你不会想要从旧文件中援引数据,但你可以使用这种方法来读取配置文件和函数。 + +(LCTT 译注:在 Bash 中,可以通过 `source` 或 `.` 命令来将一个文件读入,这个行为称为 “sourcing”,英文原意为“一次性(试)采购”、“寻找供应商”、“获得”等,考虑到 Bash 的语境和发音,我建议可以翻译为“援引”,或有不当,供大家讨论参考 —— wxy) + +例如,创建一个名为 `example.sh` 的文件,并输入以下内容: + +``` +#!/bin/sh + +greet opensource.com + +echo "The meaning of life is $var" +``` + +运行这段代码,看见失败了: + +``` +$ bash ./example.sh +./example.sh: line 3: greet: command not found +The meaning of life is +``` + +Bash 没有一个叫 `greet` 的命令,所以无法执行那一行,也没有一个叫 `var` 的变量记录,所以文件没有意义。为了解决这个问题,建立一个名为 `include.sh` 的文件: + +``` +greet() { +    echo "Hello ${1}" +} + +var=42 +``` + +修改你的 `example.sh` 脚本,加入一个 `source` 命令: + +``` +#!/bin/sh + +source include.sh + +greet opensource.com + +echo "The meaning of life is $var" +``` + +运行脚本,可以看到工作了: + +``` +$ bash ./example.sh +Hello opensource.com +The meaning of life is 42 +``` + +`greet` 命令被带入你的 shell 环境,因为它被定义在 `include.sh` 文件中,它甚至可以识别参数(本例中的 `opensource.com`)。变量 `var` 也被设置和导入。 + +#### 在 Bash 中解析文件 + +另一种让数据“进入” Bash 的方法是将其解析为数据流。有很多方法可以做到这一点. 你可以使用 `grep` 或 `cat` 或任何可以获取数据并管道输出到标准输出的命令。另外,你可以使用 Bash 内置的东西:重定向。重定向本身并不是很有用,所以在这个例子中,我也使用内置的 `echo` 命令来打印重定向的结果: + +``` +#!/bin/sh + +echo $( < include.sh ) +``` + +将其保存为 `stream.sh` 并运行它来查看结果: + +``` +$ bash ./stream.sh +greet() { echo "Hello ${1}" } var=42 +$ +``` + +对于 `include.sh` 文件中的每一行,Bash 都会将该行打印(或 `echo`)到你的终端。先用管道把它传送到一个合适的解析器是用 Bash 读取数据的常用方法。例如, 假设 `include.sh` 是一个配置文件, 它的键和值对用一个等号(`=`)分开. 你可以用 `awk` 甚至 `cut` 来获取值: + +``` +#!/bin/sh + +myVar=`grep var include.sh | cut -d'=' -f2` + +echo $myVar +``` + +试着运行这个脚本: + +``` +$ bash ./stream.sh +42 +``` + +### 用 Bash 将数据写入文件 + +无论你是要存储用户用你的应用创建的数据,还是仅仅是关于用户在应用中做了什么的元数据(例如,游戏保存或最近播放的歌曲),都有很多很好的理由来存储数据供以后使用。在 Bash 中,你可以使用常见的 shell 重定向将数据保存到文件中。 + +例如, 要创建一个包含输出的新文件, 使用一个重定向符号: + +``` +#!/bin/sh + +TZ=UTC +date > date.txt +``` + +运行脚本几次: + +``` +$ bash ./date.sh +$ cat date.txt +Tue Feb 23 22:25:06 UTC 2021 +$ bash ./date.sh +$ cat date.txt +Tue Feb 23 22:25:12 UTC 2021 +``` + +要追加数据,使用两个重定向符号: + +``` +#!/bin/sh + +TZ=UTC +date >> date.txt +``` + +运行脚本几次: + +``` +$ bash ./date.sh +$ bash ./date.sh +$ bash ./date.sh +$ cat date.txt +Tue Feb 23 22:25:12 UTC 2021 +Tue Feb 23 22:25:17 UTC 2021 +Tue Feb 23 22:25:19 UTC 2021 +Tue Feb 23 22:25:22 UTC 2021 +``` + +### Bash 轻松编程 + +Bash 的优势在于简单易学,因为只需要一些基本的概念,你就可以构建复杂的程序。完整的文档请参考 GNU.org 上的 [优秀的 Bash 文档][6]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/input-output-bash + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://opensource.com/article/19/9/getting-started-zsh +[4]: https://opensource.com/article/19/7/ways-get-started-linux#wsl +[5]: https://www.redhat.com/sysadmin/terminals-shells-consoles +[6]: http://gnu.org/software/bash diff --git a/published/202104/20210325 Plausible- Privacy-Focused Google Analytics Alternative.md b/published/202104/20210325 Plausible- Privacy-Focused Google Analytics Alternative.md new file mode 100644 index 0000000000..7b97f5144e --- /dev/null +++ b/published/202104/20210325 Plausible- Privacy-Focused Google Analytics Alternative.md @@ -0,0 +1,94 @@ +[#]: subject: (Plausible: Privacy-Focused Google Analytics Alternative) +[#]: via: (https://itsfoss.com/plausible/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13283-1.html) + +Plausible:注重隐私的 Google Analytics 替代方案 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/10/110720jc8hckngaqr6wch1.jpg) + +[Plausible][1]是一款简单的、对隐私友好的分析工具。它可以帮助你分析独立访客数量、页面浏览量、跳出率和访问时间。 + +如果你有一个网站,你可能会理解这些术语。作为一个网站所有者,它可以帮助你了解你的网站是否随着时间的推移获得更多的访问者,流量来自哪里,如果你对这些事情有一定的了解,你可以努力改进你的网站,以获得更多的访问量。 + +说到网站分析,统治这个领域的一个服务就是谷歌的免费工具 Google Analytics。就像 Google 是事实上的搜索引擎一样,Google Analytics 是事实上的分析工具。但你不必再忍受它,尤其是当你无法信任大科技公司使用你和你的网站访问者的数据的时候。 + +Plausible 让你摆脱 Google Analytics 的束缚,我将在本文中讨论这个开源项目。 + +请注意,如果你从来没有管理过网站或对分析感兴趣,文章中的一些技术术语可能对你来说是陌生的。 + +### Plausible 是隐私友好的网站分析工具 + +Plausible 使用的分析脚本是非常轻量级的,大小不到 1KB。 + +其重点在于保护隐私,因此你可以在不影响访客隐私的情况下获得有价值且可操作的统计数据。Plausible 是为数不多的不需要 cookie 横幅或 GDP 同意的分析工具之一,因为它在隐私方面已经符合 [GDPR 标准][2]。这是超级酷的。 + +在功能上,它没有 Google Analytics 那样的粒度和细节。Plausible 靠的是简单。它显示的是你过去 30 天的流量统计图。你也可以切换到实时视图。 + +![][3] + +你还可以看到你的流量来自哪里,以及你网站上的哪些页面访问量最大。来源也可以显示 UTM 活动。 + +![][4] + +你还可以选择启用 GeoIP 来了解网站访问者的地理位置。你还可以检查有多少访问者使用桌面或移动设备访问你的网站。还有一个操作系统的选项,正如你所看到的,[Linux Handbook][5] 有 48% 的访问者来自 Windows 设备。很奇怪,对吧? + +![][6] + +显然,提供的数据与 Google Analytics 的数据相差甚远,但这是有意为之。Plausible 意图是为你提供简单的模式。 + +### 使用 Plausible:选择付费托管或在你的服务器上自行托管 + +使用 Plausible 有两种方式:注册他们的官方托管服务。你必须为这项服务付费,这最终会帮助 Plausible 项目的发展。它们有 30 天的试用期,甚至不需要你这边提供任何支付信息。 + +定价从每月 1 万页浏览量 6 美元开始。价格会随着页面浏览量的增加而增加。你可以在 Plausible 网站上计算价格。 + +- [Plausible 价格][7] + +你可以试用 30 天,看看你是否愿意向 Plausible 开发者支付服务费用,并拥有你的数据。 + +如果你觉得定价不合理,你可以利用 Plausible 是开源的优势,自己部署。如果你有兴趣,请阅读我们的 [使用 Docker 自助托管 Plausible 实例的深度指南][8]。 + +我们自行托管 Plausible。我们的 Plausible 实例添加了我们的三个网站。 + +![Plausble dashboard for It’s FOSS websites][9] + +如果你维护一个开源项目的网站,并且想使用 Plausible,你可以通过我们的 [High on Cloud 项目][10] 联系我们。通过 High on Cloud,我们帮助小企业在其服务器上托管和使用开源软件。 + +### 总结 + +如果你不是超级痴迷于数据,只是想快速了解网站的表现,Plausible 是一个不错的选择。我喜欢它,因为它是轻量级的,而且遵守隐私。这也是我在 Linux Handbook,我们 [教授 Linux 服务器相关的门户网站][11] 上使用它的主要原因。 + +总的来说,我对 Plausible 相当满意,并向其他网站所有者推荐它。 + +你也经营或管理一个网站吗?你是用什么工具来做分析,还是根本不关心这个? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/plausible/ + +作者:[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://plausible.io/ +[2]: https://gdpr.eu/compliance/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/plausible-graph-lhb.png?resize=800%2C395&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/plausible-stats-lhb-2.png?resize=800%2C333&ssl=1 +[5]: https://linuxhandbook.com/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/plausible-geo-ip-stats.png?resize=800%2C331&ssl=1 +[7]: https://plausible.io/#pricing +[8]: https://linuxhandbook.com/plausible-deployment-guide/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/plausible-analytics-for-itsfoss.png?resize=800%2C231&ssl=1 +[10]: https://highoncloud.com/ +[11]: https://linuxhandbook.com/about/#ethical-web-portal diff --git a/published/202104/20210326 How to read and write files in C.md b/published/202104/20210326 How to read and write files in C.md new file mode 100644 index 0000000000..721eda3db0 --- /dev/null +++ b/published/202104/20210326 How to read and write files in C.md @@ -0,0 +1,140 @@ +[#]: subject: (How to read and write files in C++) +[#]: via: (https://opensource.com/article/21/3/ccc-input-output) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13263-1.html) + +如何用 C++ 读写文件 +====== + +> 如果你知道如何在 C++ 中使用输入输出(I/O)流,那么(原则上)你便能够处理任何类型的输入输出设备。 + +![](https://img.linux.net.cn/data/attachment/album/202104/02/224507a2fq6ofotf4ff4rf.jpg) + +在 C++ 中,对文件的读写可以通过使用输入输出流与流运算符 `>>` 和 `<<` 来进行。当读写文件的时候,这些运算符被应用于代表硬盘驱动器上文件类的实例上。这种基于流的方法有个巨大的优势:从 C++ 的角度,无论你要读取或写入的内容是文件、数据库、控制台,亦或是你通过网络连接的另外一台电脑,这都无关紧要。因此,知道如何使用流运算符来写入文件能够被转用到其他领域。 + +### 输入输出流类 + +C++ 标准库提供了 [ios_base][2] 类。该类作为所有 I/O 流的基类,例如 [basic_ofstream][3] 和 [basic_ifstream][4]。本例将使用读/写字符的专用类型 `ifstream` 和 `ofstream`。 + +- `ofstream`:输出文件流,并且其能通过插入运算符 `<<` 来实现。 +- `ifstream`:输入文件流,并且其能通过提取运算符 `>>` 来实现。 + +该两种类型都是在头文件 `` 中所定义。 + +从 `ios_base` 继承的类在写入时可被视为数据接收器,在从其读取时可被视为数据源,与数据本身完全分离。这种面向对象的方法使 [关注点分离][5]separation of concerns[依赖注入][6]dependency injection 等概念易于实现。 + +### 一个简单的例子 + +本例程是非常简单:实例化了一个 `ofstream` 来写入,和实例化一个 `ifstream` 来读取。 + +``` +#include // cout, cin, cerr etc... +#include // ifstream, ofstream +#include + + +int main() +{ + std::string sFilename = "MyFile.txt"; + + /****************************************** + * * + * WRITING * + * * + ******************************************/ + + std::ofstream fileSink(sFilename); // Creates an output file stream + + if (!fileSink) { + std::cerr << "Canot open " << sFilename << std::endl; + exit(-1); + } + + /* std::endl will automatically append the correct EOL */ + fileSink << "Hello Open Source World!" << std::endl; + + + /****************************************** + * * + * READING * + * * + ******************************************/ + + std::ifstream fileSource(sFilename); // Creates an input file stream + + if (!fileSource) { + std::cerr << "Canot open " << sFilename << std::endl; + exit(-1); + } + else { + // Intermediate buffer + std::string buffer; + + // By default, the >> operator reads word by workd (till whitespace) + while (fileSource >> buffer) + { + std::cout << buffer << std::endl; + } + } + + exit(0); +} +``` + +该代码可以在 [GitHub][7] 上查看。当你编译并且执行它时,你应该能获得以下输出: + +![Console screenshot][8] + +这是个简化的、适合初学者的例子。如果你想去使用该代码在你自己的应用中,请注意以下几点: + + * 文件流在程序结束的时候自动关闭。如果你想继续执行,那么应该通过调用 `close()` 方法手动关闭。 + * 这些文件流类继承自 [basic_ios][10](在多个层次上),并且重载了 `!` 运算符。这使你可以进行简单的检查是否可以访问该流。在 [cppreference.com][11] 上,你可以找到该检查何时会(或不会)成功的概述,并且可以进一步实现错误处理。 + * 默认情况下,`ifstream` 停在空白处并跳过它。要逐行读取直到到达 [EOF][13] ,请使用 `getline(...)` 方法。 + * 为了读写二进制文件,请将 `std::ios::binary` 标志传递给构造函数:这样可以防止 [EOL][13] 字符附加到每一行。 + +### 从系统角度进行写入 + +写入文件时,数据将写入系统的内存写入缓冲区中。当系统收到系统调用 [sync][14] 时,此缓冲区的内容将被写入硬盘。这也是你在不告知系统的情况下,不要卸下 U 盘的原因。通常,守护进程会定期调用 `sync`。为了安全起见,也可以手动调用 `sync()`: + + +``` +#include // needs to be included + +sync(); +``` + +### 总结 + +在 C++ 中读写文件并不那么复杂。更何况,如果你知道如何处理输入输出流,(原则上)那么你也知道如何处理任何类型的输入输出设备。对于各种输入输出设备的库能让你更容易地使用流运算符。这就是为什么知道输入输出流的流程会对你有所助益的原因。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/ccc-input-output + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY "Computer screen with files or windows open" +[2]: https://en.cppreference.com/w/cpp/io/ios_base +[3]: https://en.cppreference.com/w/cpp/io/basic_ofstream +[4]: https://en.cppreference.com/w/cpp/io/basic_ifstream +[5]: https://en.wikipedia.org/wiki/Separation_of_concerns +[6]: https://en.wikipedia.org/wiki/Dependency_injection +[7]: https://github.com/hANSIc99/cpp_input_output +[8]: https://opensource.com/sites/default/files/uploads/c_console_screenshot.png "Console screenshot" +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://en.cppreference.com/w/cpp/io/basic_ios +[11]: https://en.cppreference.com/w/cpp/io/basic_ios/operator! +[12]: https://en.wikipedia.org/wiki/End-of-file +[13]: https://en.wikipedia.org/wiki/Newline +[14]: https://en.wikipedia.org/wiki/Sync_%28Unix%29 diff --git a/published/202104/20210326 Why you should care about service mesh.md b/published/202104/20210326 Why you should care about service mesh.md new file mode 100644 index 0000000000..9e387a2342 --- /dev/null +++ b/published/202104/20210326 Why you should care about service mesh.md @@ -0,0 +1,67 @@ +[#]: subject: (Why you should care about service mesh) +[#]: via: (https://opensource.com/article/21/3/service-mesh) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13261-1.html) + +为什么需要关心服务网格 +====== + +> 在微服务环境中,服务网格为开发和运营提供了好处。 + +![](https://img.linux.net.cn/data/attachment/album/202104/02/201409os5r13omp5p5bssb.jpg) + +很多开发者不知道为什么要关心[服务网格][2]Service Mesh。这是我在开发者见面会、会议和实践研讨会上关于云原生架构的微服务开发的演讲中经常被问到的问题。我的回答总是一样的:“只要你想简化你的微服务架构,它就应该运行在 Kubernetes 上。” + +关于简化,你可能也想知道,为什么分布式微服务必须设计得如此复杂才能在 Kubernetes 集群上运行。正如本文所解释的那样,许多开发人员通过服务网格解决了微服务架构的复杂性,并通过在生产中采用服务网格获得了额外的好处。 + +### 什么是服务网格? + +服务网格是一个专门的基础设施层,用于提供一个透明的、独立于代码的 (polyglot) 方式,以消除应用代码中的非功能性微服务能力。 + +![Before and After Service Mesh][3] + +### 为什么服务网格对开发者很重要 + +当开发人员将微服务部署到云时,无论业务功能如何,他们都必须解决非功能性微服务功能,以避免级联故障。这些功能通常可以体现在服务发现、日志、监控、韧性resiliency、认证、弹性elasticity和跟踪等方面。开发人员必须花费更多的时间将它们添加到每个微服务中,而不是开发实际的业务逻辑,这使得微服务变得沉重而复杂。 + +随着企业加速向云计算转移,服务网格 可以提高开发人员的生产力。Kubernetes 加服务网格平台不需要让服务负责处理这些复杂的问题,也不需要在每个服务中添加更多的代码来处理云原生的问题,而是负责向运行在该平台上的任何应用(现有的或新的,用任何编程语言或框架)提供这些服务。那么微服务就可以轻量级,专注于其业务逻辑,而不是云原生的复杂性。 + +### 为什么服务网格对运维很重要 + +这并没有回答为什么运维团队需要关心在 Kubernetes 上运行云原生微服务的服务网格。因为运维团队必须确保在 Kubernetes 环境上的大型混合云和多云上部署新的云原生应用的强大安全性、合规性和可观察性。 + +服务网格由一个用于管理代理路由流量的控制平面和一个用于注入边车Sidecar的数据平面组成。边车允许运维团队做一些比如添加第三方安全工具和追踪所有服务通信中的流量,以避免安全漏洞或合规问题。服务网格还可以通过在图形面板上可视化地跟踪指标来提高观察能力。 + +### 如何开始使用服务网格 + +对于开发者和运维人员,以及从应用开发到平台运维来说,服务网格可以更有效地管理云原生功能。 + +你可能想知道从哪里开始采用服务网格来配合你的微服务应用和架构。幸运的是,有许多开源的服务网格项目。许多云服务提供商也在他们的 Kubernetes 平台中提供 服务网格。 + +![CNCF Service Mesh Landscape][5] + +你可以在 [CNCF Service Mesh Landscape][6] 页面中找到最受欢迎的服务网格项目和服务的链接。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/service-mesh + +作者:[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/data_analytics_cloud.png?itok=eE4uIoaB (Net catching 1s and 0s or data in the clouds) +[2]: https://www.redhat.com/en/topics/microservices/what-is-a-service-mesh +[3]: https://opensource.com/sites/default/files/uploads/vm-vs-service-mesh.png (Before and After Service Mesh) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/service-mesh-providers.png (CNCF Service Mesh Landscape) +[6]: https://landscape.cncf.io/card-mode?category=service-mesh&grouping=category diff --git a/published/202104/20210329 Manipulate data in files with Lua.md b/published/202104/20210329 Manipulate data in files with Lua.md new file mode 100644 index 0000000000..eb0bf8808b --- /dev/null +++ b/published/202104/20210329 Manipulate data in files with Lua.md @@ -0,0 +1,95 @@ +[#]: subject: (Manipulate data in files with Lua) +[#]: via: (https://opensource.com/article/21/3/lua-files) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13268-1.html) + +用 Lua 操作文件中的数据 +====== + +> 了解 Lua 如何处理数据的读写。 + +![](https://img.linux.net.cn/data/attachment/album/202104/05/102424yczwucc3xcuyzkgw.jpg) + +有些数据是临时的,存储在 RAM 中,只有在应用运行时才有意义。但有些数据是要持久的,存储在硬盘上供以后使用。当你编程时,无论是简单的脚本还是复杂的工具套件,通常都需要读取和写入文件。有时文件可能包含配置选项,而另一些时候这个文件是你的用户用你的应用创建的数据。每种语言都会以不同的方式处理这项任务,本文将演示如何使用 Lua 处理文件数据。 + +### 安装 Lua + +如果你使用的是 Linux,你可以从你的发行版软件库中安装 Lua。在 macOS 上,你可以从 [MacPorts][2] 或 [Homebrew][3] 安装 Lua。在 Windows 上,你可以从 [Chocolatey][4] 安装 Lua。 + +安装 Lua 后,打开你最喜欢的文本编辑器并准备开始。 + +### 用 Lua 读取文件 + +Lua 使用 `io` 库进行数据输入和输出。下面的例子创建了一个名为 `ingest` 的函数来从文件中读取数据,然后用 `:read` 函数进行解析。在 Lua 中打开一个文件时,有几种模式可以启用。因为我只需要从这个文件中读取数据,所以我使用 `r`(代表“读”)模式: + +``` +function ingest(file) +   local f = io.open(file, "r") +   local lines = f:read("*all") +   f:close() +   return(lines) +end + +myfile=ingest("example.txt") +print(myfile) +``` + +在这段代码中,注意到变量 `myfile` 是为了触发 `ingest` 函数而创建的,因此,它接收该函数返回的任何内容。`ingest` 函数返回文件的行数(从一个称为 `lines` 的变量中0。当最后一步打印 `myfile` 变量的内容时,文件的行数就会出现在终端中。 + +如果文件 `example.txt` 中包含了配置选项,那么我会写一些额外的代码来解析这些数据,可能会使用另一个 Lua 库,这取决于配置是以 INI 文件还是 YAML 文件或其他格式存储。如果数据是 SVG 图形,我会写额外的代码来解析 XML,可能会使用 Lua 的 SVG 库。换句话说,你的代码读取的数据一旦加载到内存中,就可以进行操作,但是它们都需要加载 `io` 库。 + +### 用 Lua 将数据写入文件 + +无论你是要存储用户用你的应用创建的数据,还是仅仅是关于用户在应用中做了什么的元数据(例如,游戏保存或最近播放的歌曲),都有很多很好的理由来存储数据供以后使用。在 Lua 中,这是通过 `io` 库实现的,打开一个文件,将数据写入其中,然后关闭文件: + +``` +function exgest(file) +   local f = io.open(file, "a") +   io.output(f) +   io.write("hello world\n") +   io.close(f) +end + +exgest("example.txt") +``` + +为了从文件中读取数据,我以 `r` 模式打开文件,但这次我使用 `a` (用于”追加“)将数据写到文件的末尾。因为我是将纯文本写入文件,所以我添加了自己的换行符(`/n`)。通常情况下,你并不是将原始文本写入文件,你可能会使用一个额外的库来代替写入一个特定的格式。例如,你可能会使用 INI 或 YAML 库来帮助编写配置文件,使用 XML 库来编写 XML,等等。 + +### 文件模式 + +在 Lua 中打开文件时,有一些保护措施和参数来定义如何处理文件。默认值是 `r`,允许你只读数据: + + * `r` 只读 + * `w` 如果文件不存在,覆盖或创建一个新文件。 + * `r+` 读取和覆盖。 + * `a` 追加数据到文件中,或在文件不存在的情况下创建一个新文件。 + * `a+` 读取数据,将数据追加到文件中,或文件不存在的话,创建一个新文件。 + +还有一些其他的(例如,`b` 代表二进制格式),但这些是最常见的。关于完整的文档,请参考 [Lua.org/manual][5] 上的优秀 Lua 文档。 + +### Lua 和文件 + +和其他编程语言一样,Lua 有大量的库支持来访问文件系统来读写数据。因为 Lua 有一个一致且简单语法,所以很容易对任何格式的文件数据进行复杂的处理。试着在你的下一个软件项目中使用 Lua,或者作为 C 或 C++ 项目的 API。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/lua-files + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data) +[2]: https://opensource.com/article/20/11/macports +[3]: https://opensource.com/article/20/6/homebrew-mac +[4]: https://opensource.com/article/20/3/chocolatey +[5]: http://lua.org/manual diff --git a/published/202104/20210329 Why I love using the IPython shell and Jupyter notebooks.md b/published/202104/20210329 Why I love using the IPython shell and Jupyter notebooks.md new file mode 100644 index 0000000000..269735322f --- /dev/null +++ b/published/202104/20210329 Why I love using the IPython shell and Jupyter notebooks.md @@ -0,0 +1,157 @@ +[#]: subject: (Why I love using the IPython shell and Jupyter notebooks) +[#]: via: (https://opensource.com/article/21/3/ipython-shell-jupyter-notebooks) +[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13277-1.html) + +为什么我喜欢使用 IPython shell 和 Jupyter 笔记本 +====== + +> Jupyter 笔记本将 IPython shell 提升到一个新的高度。 + +![](https://img.linux.net.cn/data/attachment/album/202104/08/125206uvglkoqzukhfk3uv.jpg) + +Jupyter 项目最初是以 IPython 和 IPython 笔记本的形式出现的。它最初是一个专门针对 Python 的交互式 shell 和笔记本环境,后来扩展为不分语言的环境,支持 Julia、Python 和 R 以及其他任何语言。 + +![Jupyter][2] + +IPython 是一个 Python shell,类似于你在命令行输入 `python` 或者 `python3` 时看到的,但它更聪明、更有用。如果你曾经在 Python shell 中输入过多行命令,并且想重复它,你就会理解每次都要一行一行地滚动浏览历史记录的挫败感。有了 IPython,你可以一次滚动浏览整个块,同时还可以逐行浏览和编辑这些块的部分内容。 + +![iPython][4] + +它具有自动补全,并提供上下文感知的建议: + +![iPython offers suggestions][5] + +它默认会整理输出: + +![iPython pretty prints][6] + +它甚至允许你运行 shell 命令: + +![IPython shell commands][7] + +它还提供了一些有用的功能,比如将 `?` 添加到对象中,作为运行 `help()` 的快捷方式,而不会破坏你的流程: + +![IPython help][8] + +如果你使用的是虚拟环境(参见我关于 [virtualenvwrapper][9] 的帖子),可以在环境中用 `pip` 安装: + +``` +pip install ipython +``` + +要在全系统范围内安装,你可以在 Debian、Ubuntu 或树莓派上使用 `apt`: + +``` +sudo apt install ipython3 +``` + +或使用 `pip`: + +``` +sudo pip3 install ipython +``` + +### Jupyter 笔记本 + +Jupyter 笔记本将 IPython shell 提升到了一个新的高度。首先,它们是基于浏览器的,而不是基于终端的。要开始使用,请安装 `jupyter`。 + +如果你使用的是虚拟环境,请在环境中使用 `pip` 进行安装: + +``` +pip install jupyter +``` + +要在全系统范围内安装,你可以在 Debian、Ubuntu 或树莓派上使用 `apt`: + +``` +sudo apt install jupyter-notebook +``` + +或使用 `pip`: + +``` +sudo pip3 install jupyter +``` + +启动笔记本: + +``` +jupyter notebook +``` + +这将在你的浏览器中打开: + +![Jupyter Notebook][10] + +你可以使用 “New” 下拉菜单创建一个新的 Python 3 笔记本: + +![Python 3 in Jupyter Notebook][11] + +现在你可以在 `In[ ]` 字段中编写和执行命令。使用 `Enter` 在代码块中换行,使用 `Shift+Enter` 来执行: + +![Executing commands in Jupyter][12] + +你可以编辑和重新运行代码块,你可以重新排序、删除,复制/粘贴,等等。你可以以任何顺序运行代码块,但是要注意的是,任何创建的变量的作用域都将根据执行的时间而不是它们在笔记本中出现的顺序。你可以在 “Kernel” 菜单中重启并清除输出或重启并运行所有的代码块。 + +使用 `print` 函数每次都会输出。但是如果你有一条没有分配的语句,或者最后一条语句没有分配,那么它总是会输出: + +![Jupyter output][13] + +你甚至可以把 `In` 和 `Out` 作为可索引对象: + +![Jupyter output][14] + +所有的 IPython 功能都可以使用,而且通常也会表现得更漂亮一些: + +![Jupyter supports IPython features][15] + +你甚至可以使用 [Matplotlib][16] 进行内联绘图: + +![Graphing in Jupyter Notebook][17] + +最后,你可以保存你的笔记本,并将其包含在 Git 仓库中,如果你将其推送到 GitHub,它们将作为已完成的笔记本被渲染:输出、图形和所有一切(如 [本例][18]): + +![Saving Notebook to GitHub][19] + +* * * + +本文原载于 Ben Nuttall 的 [Tooling Tuesday 博客][20],经许可后重用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/ipython-shell-jupyter-notebooks + +作者:[Ben Nuttall][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/bennuttall +[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://opensource.com/sites/default/files/uploads/jupyterpreview.png (Jupyter) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/sites/default/files/uploads/ipython-loop.png (iPython) +[5]: https://opensource.com/sites/default/files/uploads/ipython-suggest.png (iPython offers suggestions) +[6]: https://opensource.com/sites/default/files/uploads/ipython-pprint.png (iPython pretty prints) +[7]: https://opensource.com/sites/default/files/uploads/ipython-ls.png (IPython shell commands) +[8]: https://opensource.com/sites/default/files/uploads/ipython-help.png (IPython help) +[9]: https://opensource.com/article/21/2/python-virtualenvwrapper +[10]: https://opensource.com/sites/default/files/uploads/jupyter-notebook-1.png (Jupyter Notebook) +[11]: https://opensource.com/sites/default/files/uploads/jupyter-python-notebook.png (Python 3 in Jupyter Notebook) +[12]: https://opensource.com/sites/default/files/uploads/jupyter-loop.png (Executing commands in Jupyter) +[13]: https://opensource.com/sites/default/files/uploads/jupyter-cells.png (Jupyter output) +[14]: https://opensource.com/sites/default/files/uploads/jupyter-cells-2.png (Jupyter output) +[15]: https://opensource.com/sites/default/files/uploads/jupyter-help.png (Jupyter supports IPython features) +[16]: https://matplotlib.org/ +[17]: https://opensource.com/sites/default/files/uploads/jupyter-graph.png (Graphing in Jupyter Notebook) +[18]: https://github.com/piwheels/stats/blob/master/2020.ipynb +[19]: https://opensource.com/sites/default/files/uploads/savenotebooks.png (Saving Notebook to GitHub) +[20]: https://tooling.bennuttall.com/the-ipython-shell-and-jupyter-notebooks/ diff --git a/published/202104/20210330 NewsFlash- A Modern Open-Source Feed Reader With Feedly Support.md b/published/202104/20210330 NewsFlash- A Modern Open-Source Feed Reader With Feedly Support.md new file mode 100644 index 0000000000..11f3c7231c --- /dev/null +++ b/published/202104/20210330 NewsFlash- A Modern Open-Source Feed Reader With Feedly Support.md @@ -0,0 +1,98 @@ +[#]: subject: (NewsFlash: A Modern Open-Source Feed Reader With Feedly Support) +[#]: via: (https://itsfoss.com/newsflash-feedreader/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13264-1.html) + +NewsFlash: 一款支持 Feedly 的现代开源 Feed 阅读器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/03/001037r2udx6u6xqu5sqzu.jpg) + +有些人可能认为 RSS 阅读器已经不再,但它们仍然坚持在这里,特别是当你不想让大科技算法来决定你应该阅读什么的时候。Feed 阅读器可以帮你自助选择阅读来源。 + +我最近遇到一个很棒的 RSS 阅读器 NewsFlash。它支持通过基于网页的 Feed 阅读器增加 feed,例如 [Feedly][1] 和 NewsBlur。这是一个很大的安慰,因为如果你已经使用这种服务,就不必人工导入 feed,这节省了你的工作。 + +NewsFlash 恰好是 [FeedReadeer][2] 的精神继承者,原来的 FeedReader 开发人员也参与其中。 + +如果你正在找适用的 RSS 阅读器,我们整理了 [Linux Feed 阅读器][3] 列表供您参考。 + +### NewsFlash: 一款补充网页 RSS 阅读器账户的 Feed 阅读器 + +![][4] + +请注意,NewsFlash 并不只是针对基于网页的 RSS feed 账户量身定做的,你也可以选择使用本地 RSS feed,而不必在多设备间同步。 + +不过,如果你在用是任何一款支持的基于网页的 feed 阅读器,那么 NewsFlash 特别有用。 + +这里,我将重点介绍 NewsFlash 提供的一些功能。 + +### NewsFlash 功能 + +![][5] + + * 支持桌面通知 + * 快速搜索、过滤 + * 支持标签 + * 便捷、可重定义的键盘快捷键 + * 本地 feed + * OPML 文件导入/导出 + * 无需注册即可在 Feedly 库中轻松找到不同 RSS Feed + * 支持自定义字体 + * 支持多主题(包括深色主题) + * 启动/禁止缩略图 + * 细粒度调整定期同步间隔时间 + * 支持基于网页的 Feed 账户,例如 Feedly、Fever、NewsBlur、feedbin、Miniflux + +除上述功能外,当你调整窗口大小时,还可以打开阅读器视图,这是一个细腻的补充功能。 + +![newsflash 截图1][6] + +账户重新设置也很容易,这将删除所有本地数据。是的,你可以手动清除缓存并设置到期时间,并为你关注的所有 feed 设置一个用户数据存在本地的到期时间。 + +### 在 Linux 上安装 NewsFlash + +你无法找到适用于各种 Linux 发行版的官方软件包,只有 [Flatpak][8]。 + +对于 Arch 用户,可以从 [AUR][9] 下载。 + +幸运的是,[Flatpak][10] 软件包可以让你轻松在 Linux 发行版上安装 NewsFlash。具体请参阅我们的 [Flatpak 指南][11]。 + +你可以参考 NewsFlash 的 [GitLab 页面][12] 去解决大部分问题。 + +### 结束语 + +我现在用 NewsFlash 作为桌面本地解决方案,不用基于网页的服务。你可以通过直接导出 OPML 文件在移动 feed 应用上得到相同的 feed。这已经被我验证过了。 + +用户界面易于使用,也提供了数一数二的新版 UX。虽然这个 RSS 阅读器看似简单,但提供了你可以找到的所有重要功能。 + +你怎么看 NewsFlash?你喜欢用其他类似产品吗?欢迎在评论区中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/newsflash-feedreader/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[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://feedly.com/ +[2]: https://jangernert.github.io/FeedReader/ +[3]: https://itsfoss.com/feed-reader-apps-linux/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/newsflash.jpg?resize=945%2C648&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/newsflash-screenshot.jpg?resize=800%2C533&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/newsflash-screenshot-1.jpg?resize=800%2C532&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/04/best-feed-reader-apps-linux.jpg?fit=800%2C450&ssl=1 +[8]: https://flathub.org/apps/details/com.gitlab.newsflash +[9]: https://itsfoss.com/aur-arch-linux/ +[10]: https://itsfoss.com/what-is-flatpak/ +[11]: https://itsfoss.com/flatpak-guide/ +[12]: https://gitlab.com/news-flash/news_flash_gtk diff --git a/published/202104/20210331 3 reasons I use the Git cherry-pick command.md b/published/202104/20210331 3 reasons I use the Git cherry-pick command.md new file mode 100644 index 0000000000..5f87ecc61e --- /dev/null +++ b/published/202104/20210331 3 reasons I use the Git cherry-pick command.md @@ -0,0 +1,181 @@ +[#]: subject: (3 reasons I use the Git cherry-pick command) +[#]: via: (https://opensource.com/article/21/3/git-cherry-pick) +[#]: author: (Manaswini Das https://opensource.com/users/manaswinidas) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13305-1.html) + +我使用 Git cherry-pick 命令的 3 个理由 +====== + +> “遴选”可以解决 Git 仓库中的很多问题。以下是用 `git cherry-pick` 修复错误的三种方法。 + +![](https://img.linux.net.cn/data/attachment/album/202104/17/174429qw1im6if6mf6zi9i.jpg) + +在版本控制系统中摸索前进是一件很棘手的事情。对于一个新手来说,这可能是非常难以应付的,但熟悉版本控制系统(如 Git)的术语和基础知识是开始为开源贡献的第一步。 + +熟悉 Git 也能帮助你在开源之路上走出困境。Git 功能强大,让你感觉自己在掌控之中 —— 没有哪一种方法会让你无法恢复到工作版本。 + +这里有一个例子可以帮助你理解“遴选cherry-pick”的重要性。假设你已经在一个分支上做了好几个提交,但你意识到这是个错误的分支!你现在该怎么办?你现在要做什么?要么在正确的分支上重复所有的变更,然后重新提交,要么把这个分支合并到正确的分支上。等一下,前者太过繁琐,而你可能不想做后者。那么,还有没有办法呢?有的,Git 已经为你准备好了。这就是“遴选”的作用。顾名思义,你可以用它从一个分支中手工遴选一个提交,然后转移到另一个分支。 + +使用遴选的原因有很多。以下是其中的三个原因。 + +### 避免重复性工作 + +如果你可以直接将相同的提交复制到另一个分支,就没有必要在不同的分支中重做相同的变更。请注意,遴选出来的提交会在另一个分支中创建带有新哈希的新提交,所以如果你看到不同的提交哈希,请不要感到困惑。 + +如果您想知道什么是提交的哈希,以及它是如何生成的,这里有一个说明可以帮助你。提交哈希是用 [SHA-1][2] 算法生成的字符串。SHA-1 算法接收一个输入,然后输出一个唯一的 40 个字符的哈希值。如果你使用的是 [POSIX][3] 系统,请尝试在您的终端上运行这个命令: + +``` +$ echo -n "commit" | openssl sha1 +``` + +这将输出一个唯一的 40 个字符的哈希值 `4015b57a143aec5156fd1444a017a32137a3fd0f`。这个哈希代表了字符串 `commit`。 + +Git 在提交时生成的 SHA-1 哈希值不仅仅代表一个字符串。它代表的是: + +``` +sha1( +    meta data +        commit message +        committer +        commit date +        author +        authoring date +    Hash of the entire tree object +) +``` + +这就解释了为什么你对代码所做的任何细微改动都会得到一个独特的提交哈希值。哪怕是一个微小的改动都会被发现。这是因为 Git 具有完整性。 + +### 撤销/恢复丢失的更改 + +当你想恢复到工作版本时,遴选就很方便。当多个开发人员在同一个代码库上工作时,很可能会丢失更改,最新的版本会被转移到一个陈旧的或非工作版本上。这时,遴选提交到工作版本就可以成为救星。 + +#### 它是如何工作的? + +假设有两个分支:`feature1` 和 `feature2`,你想把 `feature1` 中的提交应用到 `feature2`。 + +在 `feature1` 分支上,运行 `git log` 命令,复制你想遴选的提交哈希值。你可以看到一系列类似于下面代码示例的提交。`commit` 后面的字母数字代码就是你需要复制的提交哈希。为了方便起见,您可以选择复制前六个字符(本例中为 `966cf3`)。 + +``` +commit 966cf3d08b09a2da3f2f58c0818baa37184c9778 (HEAD -> master) +Author: manaswinidas +Date: Mon Mar 8 09:20:21 2021 +1300 + + add instructions +``` + +然后切换到 `feature2` 分支,在刚刚从日志中得到的哈希值上运行 `git cherry-pick`: + +``` +$ git checkout feature2 +$ git cherry-pick 966cf3. +``` + +如果该分支不存在,使用 `git checkout -b feature2` 来创建它。 + +这里有一个问题。你可能会遇到下面这种情况: + +``` +$ git cherry-pick 966cf3 +On branch feature2 +You are currently cherry-picking commit 966cf3d. + +nothing to commit, working tree clean +The previous cherry-pick is now empty, possibly due to conflict resolution. +If you wish to commit it anyway, use: + +   git commit --allow-empty + +Otherwise, please use 'git reset' +``` + +不要惊慌。只要按照建议运行 `git commit --allow-empty`: + +``` +$ git commit --allow-empty +[feature2 afb6fcb] add instructions +Date: Mon Mar 8 09:20:21 2021 +1300 +``` + +这将打开你的默认编辑器,允许你编辑提交信息。如果你没有什么要补充的,可以保存现有的信息。 + +就这样,你完成了你的第一次遴选。如上所述,如果你在分支 `feature2` 上运行 `git log`,你会看到一个不同的提交哈希。下面是一个例子: + +``` +commit afb6fcb87083c8f41089cad58deb97a5380cb2c2 (HEAD -> feature2) +Author: manaswinidas <[me@example.com][4]> +Date:   Mon Mar 8 09:20:21 2021 +1300 +   add instructions +``` + +不要对不同的提交哈希感到困惑。这只是区分 `feature1` 和 `feature2` 的提交。 + +### 遴选多个提交 + +但如果你想遴选多个提交的内容呢?你可以使用: + +``` +git cherry-pick ... +``` + +请注意,你不必使用整个提交的哈希值,你可以使用前五到六个字符。 + +同样,这也是很繁琐的。如果你想遴选的提交是一系列的连续提交呢?这种方法太费劲了。别担心,有一个更简单的方法。 + +假设你有两个分支: + + * `feature1` 包括你想复制的提交(从更早的 `commitA` 到 `commitB`)。 + * `feature2` 是你想把提交从 `feature1` 转移到的分支。 + +然后: + + 1. 输入 `git checkout `。 + 2. 获取 `commitA` 和 `commitB` 的哈希值。 + 3. 输入 `git checkout `。 + 4. 输入 `git cherry-pick ^..` (请注意,这包括 `commitA` 和 `commitB`)。 + 5. 如果遇到合并冲突,[像往常一样解决][5],然后输入 `git cherry-pick --continue` 恢复遴选过程。 + +### 重要的遴选选项 + +以下是 [Git 文档][6] 中的一些有用的选项,你可以在 `cherry-pick` 命令中使用。 + + * `-e`、`--edit`:用这个选项,`git cherry-pick` 可以让你在提交前编辑提交信息。 + * `-s`、`--signoff`:在提交信息的结尾添加 `Signed-off by` 行。更多信息请参见 `git-commit(1)` 中的 signoff 选项。 + * `-S[]`、`--pgg-sign[=]`:这些是 GPG 签名的提交。`keyid` 参数是可选的,默认为提交者身份;如果指定了,则必须嵌在选项中,不加空格。 + * `--ff`:如果当前 HEAD 与遴选的提交的父级提交相同,则会对该提交进行快进操作。 + +下面是除了 `--continue` 外的一些其他的后继操作子命令: + + * `--quit`:你可以忘记当前正在进行的操作。这可以用来清除遴选或撤销失败后的后继操作状态。 + * `--abort`:取消操作并返回到操作序列前状态。 + +下面是一些关于遴选的例子: + + * `git cherry-pick master`:应用 `master` 分支顶端的提交所引入的变更,并创建一个包含该变更的新提交。 + * `git cherry-pick master~4 master~2':应用 `master` 指向的第五个和第三个最新提交所带来的变化,并根据这些变化创建两个新的提交。 + +感到不知所措?你不需要记住所有的命令。你可以随时在你的终端输入 `git cherry-pick --help` 查看更多选项或帮助。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/git-cherry-pick + +作者:[Manaswini Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/manaswinidas +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/pictures/cherry-picking-recipe-baking-cooking.jpg?itok=XVwse6hw (Measuring and baking a cherry pie recipe) +[2]: https://en.wikipedia.org/wiki/SHA-1 +[3]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[4]: mailto:me@example.com +[5]: https://opensource.com/article/20/4/git-merge-conflict +[6]: https://git-scm.com/docs/git-cherry-pick diff --git a/published/202104/20210331 Use this open source tool to monitor variables in Python.md b/published/202104/20210331 Use this open source tool to monitor variables in Python.md new file mode 100644 index 0000000000..6349b1fe3c --- /dev/null +++ b/published/202104/20210331 Use this open source tool to monitor variables in Python.md @@ -0,0 +1,169 @@ +[#]: subject: (Use this open source tool to monitor variables in Python) +[#]: via: (https://opensource.com/article/21/4/monitor-debug-python) +[#]: author: (Tian Gao https://opensource.com/users/gaogaotiantian) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13279-1.html) + +使用这个开源工具来监控 Python 中的变量 +====== + +> Watchpoints 是一个简单但功能强大的工具,可以帮助你在调试 Python 时监控变量。 + +![](https://img.linux.net.cn/data/attachment/album/202104/08/231614imw8zqfncz5qwwow.jpg) + +在调试代码时,你经常面临着要弄清楚一个变量何时发生变化。如果没有任何高级工具,那么可以选择使用打印语句在期望它们更改时输出变量。然而,这是一种非常低效的方法,因为变量可能在很多地方发生变化,并且不断地将其打印到终端上会产生很大的干扰,而将它们打印到日志文件中则变得很麻烦。 + +这是一个常见的问题,但现在有一个简单而强大的工具可以帮助你监控变量:[watchpoints][2]。 + +[“监视点”的概念在 C 和 C++ 调试器中很常见][3],用于监控内存,但在 Python 中缺乏相应的工具。`watchpoints` 填补了这个空白。 + +### 安装 + +要使用它,你必须先用 `pip` 安装它: + +``` +$ python3 -m pip install watchpoints +``` + +### 在Python中使用 watchpoints + +对于任何一个你想监控的变量,使用 `watch` 函数对其进行监控。 + +``` +from watchpoints import watch + +a = 0 +watch(a) +a = 1 +``` + +当变量发生变化时,它的值就会被打印到**标准输出**: + +``` +====== Watchpoints Triggered ====== + +Call Stack (most recent call last): + (my_script.py:5): +> a = 1 +a: +0 +-> +1 +``` + +信息包括: + + * 变量被改变的行。 + * 调用栈。 + * 变量的先前值/当前值。 + +它不仅适用于变量本身,也适用于对象的变化: + +``` +from watchpoints import watch + +a = [] +watch(a) +a = {} # 触发 +a["a"] = 2 # 触发 +``` + +当变量 `a` 被重新分配时,回调会被触发,同时当分配给 `a` 的对象发生变化时也会被触发。 + +更有趣的是,监控不受作用域的限制。你可以在任何地方观察变量/对象,而且无论程序在执行什么函数,回调都会被触发。 + +``` +from watchpoints import watch + +def func(var): +    var["a"] = 1 + +a = {} +watch(a) +func(a) +``` + +例如,这段代码打印出: + +``` +====== Watchpoints Triggered ====== + +Call Stack (most recent call last): + + (my_script.py:8): +> func(a) + func (my_script.py:4): +> var["a"] = 1 +a: +{} +-> +{'a': 1} +``` + +`watch` 函数不仅可以监视一个变量,它也可以监视一个字典或列表的属性和元素。 + +``` +from watchpoints import watch + +class MyObj: +    def __init__(self): +        self.a = 0 + +obj = MyObj() +d = {"a": 0} +watch(obj.a, d["a"]) # 是的,你可以这样做 +obj.a = 1 # 触发 +d["a"] = 1 # 触发 +``` + +这可以帮助你缩小到一些你感兴趣的特定对象。 + +如果你对输出格式不满意,你可以自定义它。只需定义你自己的回调函数: + +``` +watch(a, callback=my_callback) + +# 或者全局设置 + +watch.config(callback=my_callback) +``` + +当触发时,你甚至可以使用 `pdb`: + +``` +watch.config(pdb=True) +``` + +这与 `breakpoint()` 的行为类似,会给你带来类似调试器的体验。 + +如果你不想在每个文件中都导入这个函数,你可以通过 `install` 函数使其成为全局: + +``` +watch.install() # 或 watch.install("func_name") ,然后以 func_name() 方式使用 +``` + +我个人认为,`watchpoints` 最酷的地方就是使用直观。你对一些数据感兴趣吗?只要“观察”它,你就会知道你的变量何时发生变化。 + +### 尝试 watchpoints + +我在 [GitHub][2] 上开发维护了 `watchpoints`,并在 Apache 2.0 许可下发布了它。安装并使用它,当然也欢迎大家做出贡献。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/monitor-debug-python + +作者:[Tian Gao][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/gaogaotiantian +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/look-binoculars-sight-see-review.png?itok=NOw2cm39 (Looking back with binoculars) +[2]: https://github.com/gaogaotiantian/watchpoints +[3]: https://opensource.com/article/21/3/debug-code-gdb diff --git a/published/202104/20210401 Find what changed in a Git commit.md b/published/202104/20210401 Find what changed in a Git commit.md new file mode 100644 index 0000000000..47202013ef --- /dev/null +++ b/published/202104/20210401 Find what changed in a Git commit.md @@ -0,0 +1,134 @@ +[#]: subject: (Find what changed in a Git commit) +[#]: via: (https://opensource.com/article/21/4/git-whatchanged) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13286-1.html) + +查看 Git 提交中发生了什么变化 +====== + +> Git 提供了几种方式可以帮你快速查看提交中哪些文件被改变。 + +![](https://img.linux.net.cn/data/attachment/album/202104/11/093421yuololouo66woulu.jpg) + +如果你每天使用 Git,应该会提交不少改动。如果你每天和其他人在一个项目中使用 Git,假设 _每个人_ 每天的提交都是安全的,你会意识到 Git 日志会变得多么混乱,似乎永恒地滚动着变化,却没有任何迹象表明修改了什么。 + +那么,你该怎样查看指定提交中文件发生哪些变化?这比你想的容易。 + +### 查看提交中文件发生的变化 + +要想知道指定提交中哪些文件发生变化,可以使用 `git log --raw` 命令。这是发现一个提交影响了哪些文件的最快速、最方便的方法。`git log` 命令一般都没有被充分利用,主要是因为它有太多的格式化选项,许多用户在面对很多选择以及在一些情况下不明所以的文档时,会望而却步。 + +然而,Git 的日志机制非常灵活,`--raw` 选项提供了当前分支中的提交日志,以及更改的文件列表。 + +以下是标准的 `git log` 输出: + +``` +$ git log +commit fbbbe083aed75b24f2c77b1825ecab10def0953c (HEAD -> dev, origin/dev) +Author: tux +Date: Sun Nov 5 21:40:37 2020 +1300 + + exit immediately from failed download + +commit 094f9948cd995acfc331a6965032ea0d38e01f03 (origin/master, master) +Author: Tux +Date: Fri Aug 5 02:05:19 2020 +1200 + + export makeopts from etc/example.conf + +commit 76b7b46dc53ec13316abb49cc7b37914215acd47 +Author: Tux +Date: Sun Jul 31 21:45:24 2020 +1200 + + fix typo in help message +``` + +即使作者在提交消息中指定了哪些文件发生变化,日志也相当简洁。 + +以下是 `git log --raw` 输出: + +``` +$ git log --raw +commit fbbbe083aed75b24f2c77b1825ecab10def0953c (HEAD -> dev, origin/dev) +Author: tux +Date: Sun Nov 5 21:40:37 2020 +1300 + + exit immediately from failed download + +:100755 100755 cbcf1f3 4cac92f M src/example.lua + +commit 094f9948cd995acfc331a6965032ea0d38e01f03 (origin/master, master) +Author: Tux +Date: Fri Aug 5 02:05:19 2020 +1200 + + export makeopts from etc/example.conf + +:100755 100755 4c815c0 cbcf1f3 M src/example.lua +:100755 100755 71653e1 8f5d5a6 M src/example.spec +:100644 100644 9d21a6f e33caba R100 etc/example.conf etc/example.conf-default + +commit 76b7b46dc53ec13316abb49cc7b37914215acd47 +Author: Tux +Date: Sun Jul 31 21:45:24 2020 +1200 + + fix typo in help message + +:100755 100755 e253aaf 4c815c0 M src/example.lua +``` + +这会准确告诉你哪个文件被添加到提交中,哪些文件发生改变(`A` 是添加,`M` 是修改,`R` 是重命名,`D` 是删除)。 + +### Git whatchanged + +`git whatchanged` 命令是一个遗留命令,它的前身是日志功能。文档说用户不应该用该命令替代 `git log --raw`,并且暗示它实质上已经被废弃了。不过,我还是觉得它是一个很有用的捷径,可以得到同样的输出结果(尽管合并提交的内容不包括在内),如果它被删除的话,我打算为它创建一个别名。如果你只想查看已更改的文件,不想在日志中看到合并提交,可以尝试 `git whatchanged` 作为简单的助记符。 + +### 查看变化 + +你不仅可以看到哪些文件发生更改,还可以使用 `git log` 显示文件中发生了哪些变化。你的 Git 日志可以生成一个内联差异,用 `--patch` 选项可以逐行显示每个文件的所有更改: + +``` +commit 62a2daf8411eccbec0af69e4736a0fcf0a469ab1 (HEAD -> master) +Author: Tux +Date: Wed Mar 10 06:46:58 2021 +1300 + + commit + +diff --git a/hello.txt b/hello.txt +index 65a56c3..36a0a7d 100644 +--- a/hello.txt ++++ b/hello.txt +@@ -1,2 +1,2 @@ + Hello +-world ++opensource.com +``` + +在这个例子中,“world” 这行字从 `hello.txt` 中删掉,“opensource.com” 这行字则添加进去。 + +如果你需要在其他地方手动进行相同的修改,这些补丁patch可以与常见的 Unix 命令一起使用,例如 [diff 与 patch][4]。补丁也是一个好方法,可以总结指定提交中引入新信息的重要部分内容。当你在冲刺阶段引入一个 bug 时,你会发现这里的内容就是非常有价值的概述。为了更快地找到错误的原因,你可以忽略文件中没有更改的部分,只检查新代码。 + +### 用简单命令得到复杂的结果 + +你不必理解引用、分支和提交哈希,就可以查看提交中更改了哪些文件。你的 Git 日志旨在向你报告 Git 的活动,如果你想以特定方式格式化它或者提取特定的信息,通常需要费力地浏览许多文档来组合出正确的命令。幸运的是,关于 Git 历史记录最常用的请求之一只需要一两个选项:`--raw` 与 `--patch`。如果你不记得 `--raw`,就想想“Git,什么改变了?”,然后输入 `git whatchanged`。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/git-whatchanged + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_development_programming.png?itok=4OM29-82 (Code going into a computer.) +[2]: mailto:tux@example.com +[3]: mailto:Tux@example.com +[4]: https://opensource.com/article/18/8/diffs-patches diff --git a/published/202104/20210401 Wrong Time Displayed in Windows-Linux Dual Boot Setup- Here-s How to Fix it.md b/published/202104/20210401 Wrong Time Displayed in Windows-Linux Dual Boot Setup- Here-s How to Fix it.md new file mode 100644 index 0000000000..625e7d9362 --- /dev/null +++ b/published/202104/20210401 Wrong Time Displayed in Windows-Linux Dual Boot Setup- Here-s How to Fix it.md @@ -0,0 +1,104 @@ +[#]: subject: (Wrong Time Displayed in Windows-Linux Dual Boot Setup? Here’s How to Fix it) +[#]: via: (https://itsfoss.com/wrong-time-dual-boot/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13276-1.html) + +如何解决 Windows-Linux 双启动设置中显示时间错误的问题 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/08/102102xaup3iofozn2uvbf.jpg) + +如果你 [双启动 Windows 和 Ubuntu][1] 或任何其他 Linux 发行版,你可能会注意到两个操作系统之间的时间差异。 + +当你 [使用 Linux][2] 时,它会显示正确的时间。但当你进入 Windows 时,它显示的时间是错误的。有时,情况正好相反,Linux 显示的是错误的时间,而 Windows 的时间是正确的。 + +特别奇怪的是,因为你已连接到互联网,并且已将日期和时间设置为自动使用。 + +别担心!你并不是唯一一个遇到这种问题的人。你可以在 Linux 终端上使用以下命令来解决这个问题: + +``` +timedatectl set-local-rtc 1 +``` + +同样,不要担心。我会解释为什么你在双启动设置中会遇到时间差。我会向你展示上面的命令是如何修复 Windows 双启动后的时间错误问题的。 + +### 为什么 Windows 和 Linux 在双启动时显示不同的时间? + +一台电脑有两个主要时钟:系统时钟和硬件时钟。 + +硬件时钟也叫 RTC([实时时钟][3])或 CMOS/BIOS 时钟。这个时钟在操作系统之外,在电脑的主板上。即使在你的系统关机后,它也会继续运行。 + +系统时钟是你在操作系统内看到的。 + +当计算机开机时,硬件时钟被读取并用于设置系统时钟。之后,系统时钟被用于跟踪时间。如果你的操作系统对系统时钟做了任何改变,比如改变时区等,它就会尝试将这些信息同步到硬件时钟上。 + +默认情况下,Linux 认为硬件时钟中存储的时间是 UTC,而不是本地时间。另一方面,Windows 认为硬件时钟上存储的时间是本地时间。这就是问题的开始。 + +让我用例子来解释一下。 + +你看我在加尔各答 UTC+5:30 时区。安装后,当我把 [Ubuntu 中的时区][4] 设置为加尔各答时区时,Ubuntu 会把这个时间信息同步到硬件时钟上,但会有 5:30 的偏移,因为对于 Linux 来说它必须是 UTC。 + +假设加尔各答时区的当前时间是 15:00,这意味着 UTC 时间是 09:30。 + +现在当我关闭系统并启动到 Windows 时,硬件时钟有 UTC 时间(本例中为 09:30)。但是 Windows 认为硬件时钟已经存储了本地时间。因此,它改变了系统时钟(应该显示为 15:00),而使用 UTC 时间(09:30)作为本地时间。因此,Windows 显示时间为 09:30,这比实际时间(我们的例子中为 15:00)早了 5:30。 + +![][5] + +同样,如果我在 Windows 中通过自动时区和时间按钮来设置正确的时间,你知道会发生什么吗?现在它将在系统上显示正确的时间(15:00),并将此信息(注意图片中的“同步你的时钟”选项)同步到硬件时钟。 + +如果你启动到 Linux,它会从硬件时钟读取时间,而硬件时钟是当地时间(15:00),但由于 Linux 认为它是 UTC 时间,所以它在系统时钟上增加了 5:30 的偏移。现在 Linux 显示的时间是 20:30,比实际时间超出晚了 5:30。 + +现在你了解了双启动中时差问题的根本原因,是时候看看如何解决这个问题了。 + +### 修复 Windows 在 Linux 双启动设置中显示错误时间的问题 + +有两种方法可以处理这个问题: + + * 让 Windows 将硬件时钟作为 UTC 时间 + * 让 Linux 将硬件时钟作为本地时间 + +在 Linux 中进行修改是比较容易的,因此我推荐使用第二种方法。 + +现在 Ubuntu 和大多数其他 Linux 发行版都使用 systemd,因此你可以使用 `timedatectl` 命令来更改设置。 + +你要做的是告诉你的 Linux 系统将硬件时钟(RTC)作为本地时间。你可以通过 `set-local-rtc` (为 RTC 设置本地时间)选项来实现: + +``` +timedatectl set-local-rtc 1 +``` + +如下图所示,RTC 现在使用本地时间。 + +![][6] + +现在如果你启动 Windows,它把硬件时钟当作本地时间,而这个时间实际上是正确的。当你在 Linux 中启动时,你的 Linux 系统知道硬件时钟使用的是本地时间,而不是 UTC。因此,它不会尝试添加这个时间的偏移。 + +这就解决了 Linux 和 Windows 双启动时的时差问题。 + +你会看到一个关于 RTC 不使用本地时间的警告。对于桌面设置,它不应该引起任何问题。至少,我想不出有什么问题。 + +希望我把事情给你讲清楚了。如果你还有问题,请在下面留言。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/wrong-time-dual-boot/ + +作者:[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/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/ +[2]: https://itsfoss.com/why-use-linux/ +[3]: https://www.computerhope.com/jargon/r/rtc.htm +[4]: https://itsfoss.com/change-timezone-ubuntu/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/set-time-windows.jpg?resize=800%2C491&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/set-local-time-for-rtc-ubuntu.png?resize=800%2C490&ssl=1 diff --git a/published/202104/20210402 A practical guide to using the git stash command.md b/published/202104/20210402 A practical guide to using the git stash command.md new file mode 100644 index 0000000000..51917981dd --- /dev/null +++ b/published/202104/20210402 A practical guide to using the git stash command.md @@ -0,0 +1,223 @@ +[#]: subject: (A practical guide to using the git stash command) +[#]: via: (https://opensource.com/article/21/4/git-stash) +[#]: author: (Ramakrishna Pattnaik https://opensource.com/users/rkpattnaik780) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13293-1.html) + +git stash 命令实用指南 +====== + +> 学习如何使用 `git stash` 命令,以及何时应该使用它。 + +![](https://img.linux.net.cn/data/attachment/album/202104/12/232830chuyr6lkzevrfuzr.jpg) + +版本控制是软件开发人员日常生活中不可分割的一部分。很难想象有哪个团队在开发软件时不使用版本控制工具。同样也很难想象有哪个开发者没有使用过(或没有听说过)Git。在 2018 年 Stackoverflow 开发者调查中,74298 名参与者中有 87.2% 的人 [使用 Git][2] 进行版本控制。 + +Linus Torvalds 在 2005 年创建了 Git 用于开发 Linux 内核。本文将介绍 `git stash` 命令,并探讨一些有用的暂存变更的选项。本文假定你对 [Git 概念][3] 有基本的了解,并对工作树、暂存区和相关命令有良好的理解。 + +### 为什么 git stash 很重要? + +首先要明白为什么在 Git 中暂存变更很重要。假设 Git 没有暂存变更的命令。当你正在一个有两个分支(A 和 B)的仓库上工作时,这两个分支已经分叉了一段时间,并且有不同的头。当你正在处理 A 分支的一些文件时,你的团队要求你修复 B 分支的一个错误。你迅速将你的修改保存到 A 分支(但没有提交),并尝试用 `git checkout B` 来签出 B 分支。Git 会立即中止了这个操作,并抛出错误:“你对以下文件的本地修改会被该签出覆盖……请在切换分支之前提交你的修改或将它们暂存起来。” + +在这种情况下,有几种方法可以启用分支切换: + + * 在分支 A 中创建一个提交,提交并推送你的修改,以修复 B 中的错误,然后再次签出 A,并运行 `git reset HEAD^` 来恢复你的修改。 + * 手动保留不被 Git 跟踪的文件中的改动。 + +第二种方法是个馊主意。第一种方法虽然看起来很传统,但却不太灵活,因为保存未完成工作的修改会被当作一个检查点,而不是一个仍在进行中的补丁。这正是设计 `git stash` 的场景。 + +`git stash` 将未提交的改动保存在本地,让你可以进行修改、切换分支以及其他 Git 操作。然后,当你需要的时候,你可以重新应用这些存储的改动。暂存是本地范围的,不会被 `git push` 推送到远程。 + +### 如何使用 git stash + +下面是使用 `git stash` 时要遵循的顺序: + + 1. 将修改保存到分支 A。 + 2. 运行 `git stash`。 + 3. 签出分支 B。 + 4. 修正 B 分支的错误。 + 5. 提交并(可选)推送到远程。 + 6. 查看分支 A + 7. 运行 `git stash pop` 来取回你的暂存的改动。 + +`git stash` 将你对工作目录的修改存储在本地(在你的项目的 `.git` 目录内,准确的说是 `/.git/refs/stash`),并允许你在需要时检索这些修改。当你需要在不同的上下文之间切换时,它很方便。它允许你保存以后可能需要的更改,是让你的工作目录干净同时保持更改完整的最快方法。 + +### 如何创建一个暂存 + +暂存你的变化的最简单的命令是 `git stash`: + +``` +$ git stash +Saved working directory and index state WIP on master; d7435644 Feat: configure graphql endpoint +``` + +默认情况下,`git stash` 存储(或称之为“暂存”)未提交的更改(已暂存和未暂存的文件),并忽略未跟踪和忽略的文件。通常情况下,你不需要暂存未跟踪和忽略的文件,但有时它们可能会干扰你在代码库中要做的其他事情。 + +你可以使用附加选项让 `git stash` 来处理未跟踪和忽略的文件: + + * `git stash -u` 或 `git stash --includ-untracked` 储存未追踪的文件。 + * `git stash -a` 或 `git stash --all` 储存未跟踪的文件和忽略的文件。 + +要存储特定的文件,你可以使用 `git stash -p` 或 `git stash -patch` 命令: + +``` +$ git stash --patch +diff --git a/.gitignore b/.gitignore +index 32174593..8d81be6e 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -3,6 +3,7 @@ + # dependencies + node_modules/ + /.pnp ++f,fmfm + .pnp.js + + # testing +(1/1) Stash this hunk [y,n,q,a,d,e,?]? +``` + +### 列出你的暂存 + +你可以用 `git stash list` 命令查看你的暂存。暂存是后进先出(LIFO)方式保存的: + +``` +$ git stash list +stash@{0}: WIP on master: d7435644 Feat: configure graphql endpoint +``` + +默认情况下,暂存会显示在你创建它的分支和提交的顶部,被标记为 `WIP`。然而,当你有多个暂存时,这种有限的信息量并没有帮助,因为很难记住或单独检查它们的内容。要为暂存添加描述,可以使用命令 `git stash save `: + +``` +$ git stash save "remove semi-colon from schema" +Saved working directory and index state On master: remove semi-colon from schema + +$ git stash list +stash@{0}: On master: remove semi-colon from schema +stash@{1}: WIP on master: d7435644 Feat: configure graphql endpoint +``` + +### 检索暂存起来的变化 + +你可以用 `git stash apply` 和 `git stash pop` 这两个命令来重新应用暂存的变更。这两个命令都会重新应用最新的暂存(即 `stash@{0}`)中的改动。`apply` 会重新应用变更;而 `pop` 则会将暂存的变更重新应用到工作副本中,并从暂存中删除。如果你不需要再次重新应用被暂存的更改,则首选 `pop`。 + +你可以通过传递标识符作为最后一个参数来选择你想要弹出或应用的储藏: + +``` +$ git stash pop stash@{1} +``` + +或 + +``` +$ git stash apply stash@{1} +``` + +### 清理暂存 + +删除不再需要的暂存是好的习惯。你必须用以下命令手动完成: + + * `git stash clear` 通过删除所有的暂存库来清空该列表。 + * `git stash drop ` 从暂存列表中删除一个特定的暂存。 + +### 检查暂存的差异 + +命令 `git stash show ` 允许你查看一个暂存的差异: + +``` +$ git stash show stash@{1} +console/console-init/ui/.graphqlrc.yml        |   4 +- +console/console-init/ui/generated-frontend.ts | 742 +++++++++--------- +console/console-init/ui/package.json          |   2 +- +``` + +要获得更详细的差异,需要传递 `--patch` 或 `-p` 标志: + +``` +$ git stash show stash@{0} --patch +diff --git a/console/console-init/ui/package.json b/console/console-init/ui/package.json +index 755912b97..5b5af1bd6 100644 +--- a/console/console-init/ui/package.json ++++ b/console/console-init/ui/package.json +@@ -1,5 +1,5 @@ + { +- "name": "my-usepatternfly", ++ "name": "my-usepatternfly-2", +  "version": "0.1.0", +  "private": true, +  "proxy": "http://localhost:4000" +diff --git a/console/console-init/ui/src/AppNavHeader.tsx b/console/console-init/ui/src/AppNavHeader.tsx +index a4764d2f3..da72b7e2b 100644 +--- a/console/console-init/ui/src/AppNavHeader.tsx ++++ b/console/console-init/ui/src/AppNavHeader.tsx +@@ -9,8 +9,8 @@ import { css } from "@patternfly/react-styles"; + +interface IAppNavHeaderProps extends PageHeaderProps { +- toolbar?: React.ReactNode; +- avatar?: React.ReactNode; ++ toolbar?: React.ReactNode; ++ avatar?: React.ReactNode; +} + +export class AppNavHeader extends React.Component<IAppNavHeaderProps>{ +  render() +``` + +### 签出到新的分支 + +你可能会遇到这样的情况:一个分支和你的暂存中的变更有分歧,当你试图重新应用暂存时,会造成冲突。一个简单的解决方法是使用 `git stash branch ` 命令,它将根据创建暂存时的提交创建一个新分支,并将暂存中的修改弹出: + +``` +$ git stash branch test_2 stash@{0} +Switched to a new branch 'test_2' +On branch test_2 +Changes not staged for commit: +(use "git add ..." to update what will be committed) +(use "git restore ..." to discard changes in working directory) +modified: .graphqlrc.yml +modified: generated-frontend.ts +modified: package.json +no changes added to commit (use "git add" and/or "git commit -a") +Dropped stash@{0} (fe4bf8f79175b8fbd3df3c4558249834ecb75cd1) +``` + +### 在不打扰暂存参考日志的情况下进行暂存 + +在极少数情况下,你可能需要创建一个暂存,同时保持暂存参考日志(`reflog`)的完整性。这些情况可能出现在你需要一个脚本作为一个实现细节来暂存的时候。这可以通过 `git stash create` 命令来实现;它创建了一个暂存条目,并返回它的对象名,而不将其推送到暂存参考日志中: + +``` +$ git stash create "sample stash" +63a711cd3c7f8047662007490723e26ae9d4acf9 +``` + +有时,你可能会决定将通过 `git stash create` 创建的暂存条目推送到暂存参考日志: + +``` +$ git stash store -m "sample stash testing.." "63a711cd3c7f8047662007490723e26ae9d4acf9" +$ git stash list +stash @{0}: sample stash testing.. +``` + +### 结论 + +我希望你觉得这篇文章很有用,并学到了新的东西。如果我遗漏了任何有用的使用暂存的选项,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/git-stash + +作者:[Ramakrishna Pattnaik][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/rkpattnaik780 +[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://insights.stackoverflow.com/survey/2018#work-_-version-control +[3]: https://opensource.com/downloads/cheat-sheet-git diff --git a/published/202104/20210403 What problems do people solve with strace.md b/published/202104/20210403 What problems do people solve with strace.md new file mode 100644 index 0000000000..3160de5910 --- /dev/null +++ b/published/202104/20210403 What problems do people solve with strace.md @@ -0,0 +1,136 @@ +[#]: subject: (What problems do people solve with strace?) +[#]: via: (https://jvns.ca/blog/2021/04/03/what-problems-do-people-solve-with-strace/) +[#]: author: (Julia Evans https://jvns.ca/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13267-1.html) + +strace 可以解决什么问题? +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/05/094825y66126r56z361rz1.jpg) + +昨天我 [在 Twitter 上询问大家用 strace 解决了什么问题?][1],和往常一样,大家真的是给出了自己的答案! 我收到了大约 200 个答案,然后花了很多时间手动将它们归为 9 类。 + +这些解决的问题都是关于寻找程序依赖的文件、找出程序卡住或慢的原因、或者找出程序失败的原因。这些总体上与我自己使用 `strace` 的内容相吻合,但也有一些我没有想到的东西! + +我不打算在这篇文章里解释什么是 `strace`,但我有一本 [关于它的免费杂志][2] 和 [一个讲座][3] 以及 [很多博文][4]。 + +### 问题 1:配置文件在哪里? + +最受欢迎的问题是“这个程序有一个配置文件,但我不知道它在哪里”。这可能也是我最常使用 `strace` 解决的问题,因为这是个很简单的问题。 + +这很好,因为一个程序有一百万种方法来记录它的配置文件在哪里(在手册页、网站上、`--help`等),但只有一种方法可以让它真正打开它(用系统调用!)。 + +### 问题 2:这个程序还依赖什么文件? + +你也可以使用 `strace` 来查找程序依赖的其他类型的文件,比如: + + * 动态链接库(“为什么我的程序加载了这个错误版本的 `.so` 文件?"),比如 [我在 2014 年调试的这个 ruby 问题][5] + * 它在哪里寻找它的 Ruby gem(Ruby 出现了几次这种情况!) + * SSL 根证书 + * 游戏的存档文件 + * 一个闭源程序的数据文件 + * [哪些 node_modules 文件没有被使用][6] + +### 问题 3:为什么这个程序会挂掉? + +你有一个程序,它只是坐在那里什么都不做,这是怎么回事?这个问题特别容易回答,因为很多时候你只需要运行 `strace -p PID`,看看当前运行的是什么系统调用。你甚至不需要看几百行的输出。 + +答案通常是“正在等待某种 I/O”。“为什么会卡住”的一些可能的答案(虽然还有很多!): + + * 它一直在轮询 `select()` + * 正在 `wait()` 等待一个子进程完成 + * 它在向某个没有响应的东西发出网络请求 + * 正在进行 `write()`,但由于缓冲区已满而被阻止。 + * 它在 stdin 上做 `read()`,等待输入。 + +有人还举了一个很好的例子,用 `strace` 调试一个卡住的 `df` 命令:“用 `strace df -h` 你可以找到卡住的挂载,然后卸载它”。 + +### 问题 4:这个程序卡住了吗? + +这是上一个问题的变种:有时一个程序运行的时间比你预期的要长,你只是想知道它是否卡住了,或者它是否还在继续进行。 + +只要程序在运行过程中进行系统调用,用 `strace` 就可以超简单地回答这个问题:只需 `strace` 它,看看它是否在进行新的系统调用! + +### 问题 5:为什么这个程序很慢? + +你可以使用 `strace` 作为一种粗略的剖析工具:`strace -t` 会显示每次系统调用的时间戳,这样你就可以寻找大的漏洞,找到罪魁祸首。 + +以下是 Twitter 上 9 个人使用 `strace` 调试“为什么这个程序很慢?”的小故事。 + + * 早在 2000 年,我帮助支持的一个基于 Java 的网站在适度的负载下奄奄一息:页面加载缓慢,甚至完全加载不出来。我们对 J2EE 应用服务器进行了测试,发现它每次只读取一个类文件。开发人员没有使用 BufferedReader,这是典型的 Java 错误。 + * 优化应用程序的启动时间……运行 `strace` 可以让人大开眼界,因为有大量不必要的文件系统交互在进行(例如,在同一个配置文件上反复打开/读取/关闭;在一个缓慢的 NFS 挂载上加载大量的字体文件,等等)。 + * 问自己为什么在 PHP 中从会话文件中读取(通常是小于 100 字节)非常慢。结果发现一些 `flock` 系统调用花了大约 60 秒。 + * 一个程序表现得异常缓慢。使用 `strace` 找出它在每次请求时,通过从 `/dev/random` 读取数据并耗尽熵来重新初始化其内部伪随机数发生器。 + * 我记得最近一件事是连接到一个任务处理程序,看到它有多少网络调用(这是意想不到的)。 + * `strace` 显示它打开/读取同一个配置文件数千次。 + * 服务器随机使用 100% 的 CPU 时间,实际流量很低。原来是碰到打开文件数限制,接受一个套接字时,得到 EMFILE 错误而没有报告,然后一直重试。 + * 一个工作流运行超慢,但是没有日志,结果它做一个 POST 请求花了 30 秒而超时,然后重试了 5 次……结果后台服务不堪重负,但是也没有可视性。 + * 使用 `strace` 注意到 `gethostbyname()` 需要很长时间才能返回(你不能直接看到 `gethostbyname`,但你可以看到 `strace` 中的 DNS 数据包) + +### 问题 6:隐藏的权限错误 + +有时候程序因为一个神秘的原因而失败,但问题只是有一些它没有权限打开的文件。在理想的世界里,程序会报告这些错误(“Error opening file /dev/whatever: permission denied”),当然这个世界并不完美,所以 `strace` 真的可以帮助解决这个问题! + +这其实是我最近使用 `strace` 做的事情。我使用了一台 AxiDraw 绘图仪,当我试图启动它时,它打印出了一个难以理解的错误信息。我 `strace` 它,结果发现我的用户没有权限打开 USB 设备。 + +### 问题 7:正在使用什么命令行参数? + +有时候,一个脚本正在运行另一个程序,你想知道它传递的是什么命令行标志! + +几个来自 Twitter 的例子。 + + * 找出实际上是用来编译代码的编译器标志 + * 由于命令行太长,命令失败了 + +### 问题 8:为什么这个网络连接失败? + +基本上,这里的目标是找到网络连接的域名 / IP 地址。你可以通过 DNS 请求来查找域名,或者通过 `connect` 系统调用来查找 IP。 + +一般来说,当 `tcpdump` 因为某些原因不能使用或者只是因为比较熟悉 `strace` 时,就经常会使用 `strace` 调试网络问题。 + +### 问题 9:为什么这个程序以一种方式运行时成功,以另一种方式运行时失败? + +例如: + + * 同样的二进制程序在一台机器上可以运行,在另一台机器上却失败了 + * 可以运行,但被 systemd 单元文件生成时失败 + * 可以运行,但以 `su - user /some/script` 的方式运行时失败 + * 可以运行,作为 cron 作业运行时失败 + +能够比较两种情况下的 `strace` 输出是非常有用的。虽然我在调试“以我的用户身份工作,而在同一台计算机上以不同方式运行时却失败了”时,第一步是“看看我的环境变量”。 + +### 我在做什么:慢慢地建立一些挑战 + +我之所以会想到这个问题,是因为我一直在慢慢地进行一些挑战,以帮助人们练习使用 `strace` 和其他命令行工具。我的想法是,给你一个问题,一个终端,你可以自由地以任何方式解决它。 + +所以我的目标是用它来建立一些你可以用 `strace` 解决的练习题,这些练习题反映了人们在现实生活中实际使用它解决的问题。 + +### 就是这样! + +可能还有更多的问题可以用 `strace` 解决,我在这里还没有讲到,我很乐意听到我错过了什么! + +我真的很喜欢看到很多相同的用法一次又一次地出现:至少有 20 个不同的人回答说他们使用 `strace` 来查找配置文件。而且和以往一样,我觉得这样一个简单的工具(“跟踪系统调用!”)可以用来解决这么多不同类型的问题,真的很令人高兴。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/04/03/what-problems-do-people-solve-with-strace/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://twitter.com/b0rk/status/1378014888405168132 +[2]: https://wizardzines.com/zines/strace +[3]: https://www.youtube.com/watch?v=4pEHfGKB-OE +[4]: https://jvns.ca/categories/strace +[5]: https://jvns.ca/blog/2014/03/10/debugging-shared-library-problems-with-strace/ +[6]: https://indexandmain.com/post/shrink-node-modules-with-refining diff --git a/published/202104/20210404 Converting Multiple Markdown Files into HTML or Other Formats in Linux.md b/published/202104/20210404 Converting Multiple Markdown Files into HTML or Other Formats in Linux.md new file mode 100644 index 0000000000..fea402d238 --- /dev/null +++ b/published/202104/20210404 Converting Multiple Markdown Files into HTML or Other Formats in Linux.md @@ -0,0 +1,146 @@ +[#]: subject: "Converting Multiple Markdown Files into HTML or Other Formats in Linux" +[#]: via: "https://itsfoss.com/convert-markdown-files/" +[#]: author: "Bill Dyer https://itsfoss.com/author/bill/" +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13274-1.html" + +在 Linux 中把多个 Markdown 文件转换成 HTML 或其他格式 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/07/095441bztj6cz68j89568u.jpg) + +很多时候我与 Markdown 打交道的方式是,先写完一个文件,然后把它转换成 HTML 或其他格式。也有些时候,需要创建一些新的文件。当我要写多个 Markdown 文件时,通常要把他们全部写完之后才转换它们。 + +我用 `pandoc` 来转换文件,它可以一次性地转换所有 Markdown 文件。 + +Markdown 格式的文件可以转换成 .html 文件,有时候我需要把它转换成其他格式,如 epub,这个时候 [pandoc][1] 就派上了用场。我更喜欢用命令行,因此本文我会首先介绍它,然而你还可以使用 [VSCodium][2] 在非命令行下完成转换。后面我也会介绍它。 + +### 使用 pandoc 把多个 Markdown 文件转换成其他格式(命令行方式) + +你可以在 Ubuntu 及其他 Debian 系发行版本终端输入下面的命令来快速开始: + +``` +sudo apt-get install pandoc +``` + +本例中,在名为 `md_test` 目录下我有四个 Markdown 文件需要转换。 + +``` +[email protected]:~/Documents/md_test$ ls -l *.md +-rw-r--r-- 1 bdyer bdyer 3374 Apr 7 2020 file01.md +-rw-r--r-- 1 bdyer bdyer 782 Apr 2 05:23 file02.md +-rw-r--r-- 1 bdyer bdyer 9257 Apr 2 05:21 file03.md +-rw-r--r-- 1 bdyer bdyer 9442 Apr 2 05:21 file04.md +[email protected]:~/Documents/md_test$ +``` + +现在还没有 HTML 文件。现在我要对这些文件使用 `pandoc`。我会运行一行命令来实现: + + * 调用 `pandoc` + * 读取 .md 文件并导出为 .html + +下面是我要运行的命令: + +``` +for i in *.md ; do echo "$i" && pandoc -s $i -o $i.html ; done +``` + +如果你不太理解上面的命令中的 `;`,可以参考 [在 Linux 中一次执行多个命令][3]。 + +我执行命令后,运行结果如下: + +``` +[email protected]:~/Documents/md_test$ for i in *.md ; do echo "$i" && pandoc -s $i -o $i.html ; done +file01.md +file02.md +file03.md +file04.md +[email protected]:~/Documents/md_test$ +``` + +让我再使用一次 `ls` 命令来看看是否已经生成了 HTML 文件: + +``` +[email protected]:~/Documents/md_test$ ls -l *.html +-rw-r--r-- 1 bdyer bdyer 4291 Apr 2 06:08 file01.md.html +-rw-r--r-- 1 bdyer bdyer 1781 Apr 2 06:08 file02.md.html +-rw-r--r-- 1 bdyer bdyer 10272 Apr 2 06:08 file03.md.html +-rw-r--r-- 1 bdyer bdyer 10502 Apr 2 06:08 file04.md.html +[email protected]:~/Documents/md_test$ +``` + +转换很成功,现在你已经有了四个 HTML 文件,它们可以用在 Web 服务器上。 + +pandoc 功能相当多,你可以通过指定输出文件的扩展名来把 Markdown 文件转换成其他支持的格式。不难理解它为什么会被认为是[最好的写作开源工具][4]。 + +### 使用 VSCodium 把 Markdown 文件转换成 HTML(GUI 方式) + +就像我们前面说的那样,我通常使用命令行,但是对于批量转换,我不会使用命令行,你也不必。VSCode 或 [VSCodium][7] 可以完成批量操作。你只需要安装一个 Markdown-All-in-One 扩展,就可以在一次运行中转换多个 Markdown 文件。 + +有两种方式安装这个扩展: + + * VSCodium 的终端 + * VSCodium 的插件管理器 + +通过 VSCodium 的终端安装该扩展: + + 1. 点击菜单栏的 `终端`。会打开终端面板 + 2. 输入,或[复制下面的命令并粘贴到终端][8]: + +``` +codium --install-extension yzhang.markdown-all-in-one +``` + +**注意**:如果你使用的 VSCode 而不是 VSCodium,那么请把上面命令中的 `codium` 替换为 `code` + +![][9] + +第二种安装方式是通过 VSCodium 的插件/扩展管理器: + + 1. 点击 VSCodium 窗口左侧的块区域。会出现一个扩展列表,列表最上面有一个搜索框。 + 2. 在搜索框中输入 “Markdown All in One”。在列表最上面会出现该扩展。点击 “安装” 按钮来安装它。如果你已经安装过,在安装按钮的位置会出现一个齿轮图标。 + +![][10] + +安装完成后,你可以打开含有需要转换的 Markdown 文件的文件夹。 + +点击 VSCodium 窗口左侧的纸张图标。你可以选择文件夹。打开文件夹后,你需要打开至少一个文件。你也可以打开多个文件,但是最少打开一个。 + +当打开文件后,按下 `CTRL+SHIFT+P` 唤起命令面板。然后,在出现的搜索框中输入 `Markdown`。当你输入时,会出现一列 Markdown 相关的命令。其中有一个是 `Markdown All in One: Print documents to HTML` 命令。点击它: + +![][11] + +你需要选择一个文件夹来存放这些文件。它会自动创建一个 `out` 目录,转换后的 HTML 文件会存放在 `out` 目录下。从下面的图中可以看到,Markdown 文档被转换成了 HTML 文件。在这里,你可以打开、查看、编辑这些 HTML 文件。 + +![][12] + +在等待转换 Markdown 文件时,你可以更多地集中精力在写作上。当你准备好时,你就可以把它们转换成 HTML —— 你可以通过两种方式转换它们。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/convert-markdown-files/ + +作者:[Bill Dyer][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/bill/ +[b]: https://github.com/lujun9972 +[1]: https://pandoc.org/ +[2]: https://vscodium.com/ +[3]: https://itsfoss.com/run-multiple-commands-linux/ +[4]: https://itsfoss.com/open-source-tools-writers/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2016/10/Best-Markdown-Editors-for-Linux.jpg?fit=800%2C450&ssl=1 +[6]: https://itsfoss.com/best-markdown-editors-linux/ +[7]: https://itsfoss.com/vscodium/ +[8]: https://itsfoss.com/copy-paste-linux-terminal/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/vscodium_terminal.jpg?resize=800%2C564&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/vscodium_extension_select.jpg?resize=800%2C564&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/vscodium_markdown_function_options.jpg?resize=800%2C564&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/vscodium_html_filelist_shown.jpg?resize=800%2C564&ssl=1 diff --git a/published/202104/20210405 7 Git tips for managing your home directory.md b/published/202104/20210405 7 Git tips for managing your home directory.md new file mode 100644 index 0000000000..67d8a3ceea --- /dev/null +++ b/published/202104/20210405 7 Git tips for managing your home directory.md @@ -0,0 +1,135 @@ +[#]: subject: (7 Git tips for managing your home directory) +[#]: via: (https://opensource.com/article/21/4/git-home) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (stevenzdg988) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13313-1.html) + +7个管理家目录的 Git 技巧 +====== + +> 这是我怎样设置 Git 来管理我的家目录的方法。 + +![](https://img.linux.net.cn/data/attachment/album/202104/20/095224mtq14szo7opfofq7.jpg) + +我有好几台电脑。一台笔记本电脑用于工作,一台工作站放在家里,一台树莓派(或四台),一台 [Pocket CHIP][2],一台 [运行各种不同的 Linux 的 Chromebook][3],等等。我曾经在每台计算机上或多或少地按照相同的步骤设置我的用户环境,也经常告诉自己让每台计算机都略有不同。例如,我在工作中比在家里更经常使用 [Bash 别名][4],并且我在家里使用的辅助脚本可能对工作没有用。 + +这些年来,我对各种设备的期望开始相融,我会忘记我在家用计算机上建立的功能没有移植到我的工作计算机上,诸如此类。我需要一种标准化我的自定义工具包的方法。使我感到意外的答案是 Git。 + +Git 是版本跟踪软件。它以既可以用在非常大的开源项目也可以用在极小的开源项目而闻名,甚至最大的专有软件公司也在用它。但是它是为源代码设计的,而不是用在一个装满音乐和视频文件、游戏、照片等的家目录。我听说过有人使用 Git 管理其家目录,但我认为这是程序员们进行的一项附带实验,而不是像我这样的现实生活中的用户。 + +用 Git 管理我的家目录是一个不断发展的过程。随着时间的推移我一直在学习和适应。如果你决定使用 Git 管理家目录,则可能需要记住以下几点。 + +### 1、文本和二进制位置 + +![家目录][5] + +当由 Git 管理时,除了配置文件之外,你的家目录对于所有内容而言都是“无人之地”。这意味着当你打开主目录时,除了可预见的目录的列表之外,你什么都看不到。不应有任何杂乱无章的照片或 LibreOffice 文档,也不应有 “我就在这里放一分钟” 的临时文件。 + +原因很简单:使用 Git 管理家目录时,家目录中所有 _未_ 提交的内容都会变成噪音。每次执行 `git status` 时,你都必须翻过去之前 Git 未跟踪的任何文件,因此将这些文件保存在子目录(添加到 `.gitignore` 文件中)至关重要。 + +许多 Linux 发行版提供了一组默认目录: + + * `Documents` + * `Downloads` + * `Music` + * `Photos` + * `Templates` + * `Videos` + +如果需要,你可以创建更多。例如,我把创作的音乐(`Music`)和购买来聆听的音乐(`Albums`)区分开来。同样,我的电影(`Cinema`)目录包含了其他人的电影,而视频(`Videos`)目录包含我需要编辑的视频文件。换句话说,我的默认目录结构比大多数 Linux 发行版提供的默认设置更详细,但是我认为这样做有好处。如果没有适合你的目录结构,你更会将其存放在家目录中,因为没有更好的存放位置,因此请提前考虑并规划好适合你的工作目录。你以后总是可以添加更多,但是最好先开始擅长的。 + +### 2、、设置最优的 `.gitignore` + +清理家目录后,你可以像往常一样将其作为 Git 存储库实例化: + +``` +$ cd +$ git init . +``` + +你的 Git 仓库中还没有任何内容,你的家目录中的所有内容均未被跟踪。你的第一项工作是筛选未跟踪文件的列表,并确定要保持未跟踪状态的文件。要查看未跟踪的文件: + +``` +$ git status +  .AndroidStudio3.2/ +  .FBReader/ +  .ICEauthority +  .Xauthority +  .Xdefaults +  .android/ +  .arduino15/ +  .ash_history +[...] +``` + +根据你使用家目录的时间长短,此列表可能很长。简单的是你在上一步中确定的目录。通过将它们添加到名为 `.gitignore` 的隐藏文件中,你告诉 Git 停止将它们列为未跟踪文件,并且永远不对其进行跟踪: + +``` +$ \ls -lg | grep ^d | awk '{print $8}' >> ~/.gitignore +``` + +完成后,浏览 `git status` 所示的其余未跟踪文件,并确定是否有其他文件需要排除。这个过程帮助我发现了几个陈旧的配置文件和目录,这些文件和目录最终被我全部丢弃了,而且还发现了一些特定于一台计算机的文件和目录。我在这里非常严格,因为许多配置文件在自动生成时会表现得更好。例如,我从不提交我的 KDE 配置文件,因为许多文件包含了诸如最新文档之类的信息以及其他机器上不存在的其他元素。 + +我会跟踪我的个性化配置文件、脚本和实用程序、配置文件和 Bash 配置,以及速查表和我经常引用的其他文本片段。如果有软件主要负责维护的文件,则将其忽略。当对一个文件不确定时,我将其忽略。你以后总是可以取消忽略它(通过从 `.gitignore` 文件中删除它)。 + +### 3、了解你的数据 + +我使用的是 KDE,因此我使用开源扫描程序 [Filelight][7] 来了解我的数据概况。Filelight 为你提供了一个图表,可让你查看每个目录的大小。你可以浏览每个目录以查看占用了空间的内容,然后回溯调查其他地方。这是一个令人着迷的系统视图,它使你可以以全新的方式看待你的文件。 + +![Filelight][8] + +使用 Filelight 或类似的实用程序查找不需要提交的意外数据缓存。例如,KDE 文件索引器(Baloo)生成了大量特定于其主机的数据,我绝对不希望将其传输到另一台计算机。 + +### 4、不要忽略你的 `.gitignore` 文件 + +在某些项目中,我告诉 Git 忽略我的 `.gitignore` 文件,因为有时我要忽略的内容特定于我的工作目录,并且我不认为同一项目中的其他开发人员需要我告诉他们 `.gitignore` 文件应该是什么样子。因为我的家目录仅供我使用,所以我 _不_ 会忽略我的家目录的 `.gitignore` 文件。我将其与其他重要文件一起提交,因此它已在我的所有系统中被继承。当然,从家目录的角度来看,我所有的系统都是相同的:它们具有一组相同的默认文件夹和许多相同的隐藏配置文件。 + +### 5、不要担心二进制文件 + +我对我的系统进行了数周的严格测试,确信将二进制文件提交到 Git 绝对不是明智之举。我试过 GPG 加密的密码文件、试过 LibreOffice 文档、JPEG、PNG 等等。我甚至有一个脚本,可以在将 LibreOffice 文件添加到 Git 之前先解压缩,提取其中的 XML,以便仅提交 XML,然后重新构建 LibreOffice 文件,以便可以在 LibreOffice 中继续工作。我的理论是,提交 XML 会比使用 ZIP 文件(LibreOffice 文档实际上就是一个 ZIP 文件)会让 Git 存储库更小一些。 + +令我惊讶的是,我发现偶尔提交一些二进制文件并没有大幅增加我的 Git 存储库的大小。我使用 Git 已经很长时间了,我知道如果我要提交几千兆的二进制数据,我的存储库将会受到影响,但是偶尔提交几个二进制文件也不是不惜一切代价要避免的紧急情况。 + +有了这种信心,我将字体 OTF 和 TTF 文件添加到我的标准主存储库,以及 GDM 的 `.face` 文件以及其他偶尔小型二进制 Blob 文件。不要想太多,不要浪费时间去避免它。只需提交即可。 + +### 6、使用私有存储库 + +即使托管方提供了私人帐户,也不要将你的主目录提交到公共 Git 存储库。如果你像我一样,拥有 SSH 密钥、GPG 密钥链和 GPG 加密的文件,这些文件不应该出现在任何人的服务器上,而应该出现在我自己的服务器上。 + +我在树莓派上 [运行本地 Git 服务器][9](这比你想象的要容易),因此我可以在家里时随时更新任何一台计算机。我是一名远程工作者,所以通常情况下就足够了,但是我也可以在旅行时通过 [虚拟私人网络][10] 访问我的计算机。 + +### 7、要记得推送 + +Git 的特点是,只有当你告诉它要推送改动时,它才会把改动推送到你的服务器上。如果你是 Git 的老用户,则此过程可能对你很自然。对于可能习惯于 Nextcloud 或 Syncthing 自动同步的新用户,这可能需要一些时间来适应。 + +### Git 家目录 + +使用 Git 管理我的常用文件,不仅使我在不同设备上的生活更加便利。我知道我拥有所有配置和实用程序脚本的完整历史记录,这会鼓励我尝试新的想法,因为如果结果变得 _很糟糕_,则很容易回滚我的更改。Git 曾将我从在 `.bashrc` 文件中一个欠考虑的 `umask` 设置中解救出来、从深夜对包管理脚本的拙劣添加中解救出来、从当时看似很酷的 [rxvt][11] 配色方案的修改中解救出来,也许还有其他一些错误。在家目录中尝试 Git 吧,因为这些提交会让家目录融合在一起。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/git-home + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[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/house_home_colors_live_building.jpg?itok=HLpsIfIL (Houses in a row) +[2]: https://opensource.com/article/17/2/pocketchip-or-pi +[3]: https://opensource.com/article/21/2/chromebook-linux +[4]: https://opensource.com/article/17/5/introduction-alias-command-line-tool +[5]: https://opensource.com/sites/default/files/uploads/home-git.jpg (home directory) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://utils.kde.org/projects/filelight +[8]: https://opensource.com/sites/default/files/uploads/filelight.jpg (Filelight) +[9]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6 +[10]: https://www.redhat.com/sysadmin/run-your-own-vpn-libreswan +[11]: https://opensource.com/article/19/10/why-use-rxvt-terminal diff --git a/published/202104/20210406 Experiment on your code freely with Git worktree.md b/published/202104/20210406 Experiment on your code freely with Git worktree.md new file mode 100644 index 0000000000..b684e0e46f --- /dev/null +++ b/published/202104/20210406 Experiment on your code freely with Git worktree.md @@ -0,0 +1,135 @@ +[#]: subject: (Experiment on your code freely with Git worktree) +[#]: via: (https://opensource.com/article/21/4/git-worktree) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13301-1.html) + +使用 Git 工作树对你的代码进行自由实验 +====== + +> 获得自由尝试的权利,同时在你的实验出错时可以安全地拥有一个新的、链接的克隆存储库。 + +![](https://img.linux.net.cn/data/attachment/album/202104/16/085512x3auafu5uaymk52u.jpg) + +Git 的设计部分是为了进行实验。如果你知道你的工作会被安全地跟踪,并且在出现严重错误时有安全状态存在,你就不会害怕尝试新的想法。不过,创新的部分代价是,你很可能会在这个过程中弄得一团糟。文件会被重新命名、移动、删除、更改、切割成碎片;新的文件被引入;你不打算跟踪的临时文件会在你的工作目录中占据一席之地等等。 + +简而言之,你的工作空间变成了纸牌屋,在“快好了!”和“哦,不,我做了什么?”之间岌岌可危地平衡着。那么,当你需要把仓库恢复到下午的一个已知状态,以便完成一些真正的工作时,该怎么办?我立刻想到了 `git branch` 和 [git stash][2] 这两个经典命令,但这两个命令都不是用来处理未被跟踪的文件的,而且文件路径的改变和其他重大的转变也会让人困惑,它们只能把工作暂存(`stash`)起来以备后用。解决这个需求的答案是 Git 工作树。 + +### 什么是 Git 工作树 + +Git 工作树worktree是 Git 仓库的一个链接副本,允许你同时签出多个分支。工作树与主工作副本的路径是分开的,它可以处于不同的状态和不同的分支上。在 Git 中新建工作树的好处是,你可以在不干扰当前工作环境的情况下,做出与当前任务无关的修改、提交修改,然后在以后合并。 + +直接从 `git-worktree` 手册中找到了一个典型的例子:当你正在为一个项目做一个令人兴奋的新功能时,你的项目经理告诉你有一个紧急的修复工作。问题是你的工作仓库(你的“工作树”)处于混乱状态,因为你正在开发一个重要的新功能。你不想在当前的冲刺中“偷偷地”进行修复,而且你也不愿意把变更暂存起来,为修复创建一个新的分支。相反,你决定创建一个新的工作树,这样你就可以在那里进行修复: + +``` +$ git branch | tee +* dev +trunk +$ git worktree add -b hotfix ~/code/hotfix trunk +Preparing ../hotfix (identifier hotfix) +HEAD is now at 62a2daf commit +``` + +在你的 `code` 目录中,你现在有一个新的目录叫做 `hotfix`,它是一个与你的主项目仓库相连的 Git 工作树,它的 `HEAD` 停在叫做 `trunk` 的分支上。现在你可以把这个工作树当作你的主工作区来对待。你可以把目录切换到它里面,进行紧急修复、提交、并最终删除这个工作树: + +``` +$ cd ~/code/hotfix +$ sed -i 's/teh/the/' hello.txt +$ git commit --all --message 'urgent hot fix' +``` + +一旦你完成了你的紧急工作,你就可以回到你之前的任务。你可以控制你的热修复何时被集成到主项目中。例如,你可以直接将变更从其工作树推送到项目的远程存储库中: + +``` +$ git push origin HEAD +$ cd ~/code/myproject +``` + +或者你可以将工作树存档为 TAR 或 ZIP 文件: + +``` +$ cd ~/code/myproject +$ git archive --format tar --output hotfix.tar master +``` + +或者你可以从单独的工作树中获取本地的变化: + +``` +$ git worktree list +/home/seth/code/myproject  15fca84 [dev] +/home/seth/code/hotfix     09e585d [master] +``` + +从那里,你可以使用任何最适合你和你的团队的策略合并你的变化。 + +### 列出活动工作树 + +你可以使用 `git worktree list` 命令获得工作树的列表,并查看每个工作树签出的分支: + +``` +$ git worktree list +/home/seth/code/myproject  15fca84 [dev] +/home/seth/code/hotfix     09e585d [master] +``` + +你可以在任何一个工作树中使用这个功能。工作树始终是连接的(除非你手动移动它们,破坏 Git 定位工作树的能力,从而切断连接)。 + +### 移动工作树 + +Git 会跟踪项目 `.git` 目录下工作树的位置和状态: + +``` +$ cat ~/code/myproject/.git/worktrees/hotfix/gitdir +/home/seth/code/hotfix/.git +``` + +如果你需要重定位一个工作树,必须使用 `git worktree move`;否则,当 Git 试图更新工作树的状态时,就会失败: + +``` +$ mkdir ~/Temp +$ git worktree move hotfix ~/Temp +$ git worktree list +/home/seth/code/myproject  15fca84 [dev] +/home/seth/Temp/hotfix     09e585d [master] +``` + +### 移除工作树 + +当你完成你的工作时,你可以用 `remove` 子命令删除它: + +``` +$ git worktree remove hotfix +$ git worktree list +/home/seth/code/myproject  15fca84 [dev] +``` + +为了确保你的 `.git` 目录是干净的,在删除工作树后使用 `prune` 子命令: + +``` +$ git worktree remove prune +``` + +### 何时使用工作树 + +与许多选项一样,无论是标签还是书签还是自动备份,都要靠你来跟踪你产生的数据,否则可能会变得不堪重负。不要经常使用工作树,要不你最终会有 20 份存储库的副本,每份副本的状态都略有不同。我发现最好是创建一个工作树,做需要它的任务,提交工作,然后删除树。保持简单和专注。 + +重要的是,工作树为你管理 Git 存储库的方式提供了更好的灵活性。在需要的时候使用它们,再也不用为了检查另一个分支上的内容而争先恐后地保存工作状态了。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/git-worktree + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers) +[2]: https://linux.cn/article-13293-1.html diff --git a/published/202104/20210406 Teach anyone how to code with Hedy.md b/published/202104/20210406 Teach anyone how to code with Hedy.md new file mode 100644 index 0000000000..68b0c45815 --- /dev/null +++ b/published/202104/20210406 Teach anyone how to code with Hedy.md @@ -0,0 +1,80 @@ +[#]: subject: (Teach anyone how to code with Hedy) +[#]: via: (https://opensource.com/article/21/4/hedy-teach-code) +[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13290-1.html) + +用 Hedy 教人编程 +====== + +> Hedy 是一种专门为教人编程而设计的新型编程语言。 + +![](https://img.linux.net.cn/data/attachment/album/202104/12/111814w62da2sannsd2q76.jpg) + +学习编程既要学习编程逻辑,又要学习特定编程语言的语法。我在大学上第一堂编程课的时候,教的语言是 C++。第一个代码例子是基本的 “Hello World” 程序,就像下面的例子。 + +``` +#include + +int main() { + std::cout << "Hello World!"; + return 0; +} +``` + +老师直到几节课后才会解释大部分的代码。我们的期望是,我们只需输入代码,并最终了解为什么需要这些东西以及它们如何工作。 + +C++(以及其他类似的语言)的复杂语法是为什么 Python 经常被建议作为一种更容易的编程教学语言。下面是 Python 中的同一个例子: + +``` +print("Hello World!") +``` + +虽然 Python 中的 “Hello World” 基础例子要简单得多,但它仍然有复杂而精确的语法规则。`print` 函数需要在字符串周围加括号和引号。这对于没有编程经验的人来说,还是会感到困惑。Python 比 C++ 少了 “我以后再解释” 的语法问题,但还是有一些。 + +[Hedy][2] 是一种专门为编码教学而设计的新语言,它通过在语言中将复杂性分成多个关卡来解决语法复杂性的问题。Hedy 没有马上提供语言的全部功能,而是采取循序渐进的方式,随着学生在 Hedy 的学习的通关,慢慢变得更加复杂。随着关卡的进展,该语言获得了新的功能,最终变得更像 Python。目前有七个关卡,但更多的关卡正在计划中。 + +在第 1 关,Hedy 程序除了打印(`print`)一条语句(不需要引号或括号),提出(`ask`)一个问题,并回传(`echo`)一个答案外,不能做任何事情。第 1 关没有变量,没有循环,结构极精简。回传的工作原理几乎和变量一样,但只针对用户的最后一个输入。这可以让学生对基本概念感到舒适,而不必一下子学习所有的东西。 + +这是一个第 1 关的 Hedy “Hello World” 程序: + +``` +print Hello World +``` + +第 2 关引入了变量,但由于 `print` 函数没有使用引号,可能会出现一些有趣的结果。如果用来存储一个人的名字的变量是 `name`,那么就不可能打印输出 `Your name is [name]`,因为 `name` 的第一次使用(本意是字符串)和第二次使用(是变量)都被解释为变量。如果将 `name` 设置为(`is`) `John Doe`,那么 `print Your name is name.` 的输出就会是 `Your John Doe is John Doe`。虽然这听起来很奇怪,但这是一个引入变量概念的好方法,这恰好是第 3 关中增加的一个功能。 + +第 3 关要求在字符串周围加引号,这使得变量的功能就像在 Python 中一样。现在可以输出与变量相结合的字符串,做出复杂的语句,而不用担心变量名和字符串中的单词之间的冲突。这个级别取消了 “回传”(`echo`)函数,这看起来确实是一个可能会让一些学习者感到沮丧的东西。他们应该使用变量,这是更好的代码,但如果一个 `ask`/`echo` 代码块变成无效语法,可能会让人感到困惑。 + +第 4 关增加了基本的 `if`/`else` 功能。学生可以从简单的问/答代码转向复杂的交互。例如,一个问“你最喜欢的颜色是什么?”的提示可以根据用户输入的内容接受不同的回复。如果他们输入绿色,回答可以是“绿色!这也是我最喜欢的颜色。”如果他们输入其他的东西,回复可以是不同的。`if`/`else` 块是一个基本的编程概念,Hedy 引入了这个概念,而不必担心复杂的语法或过于精确的格式。 + +第 5 关有一个 `repeat` 函数,在现有的功能上增加了一个基本的循环。这个循环只能多次重复同一个命令,所以它没有 Python 中的循环那么强大,但它让学生习惯了重复命令的一般概念。这是多介绍了一个编程概念,而不会用无谓的复杂来拖累。学生们可以先掌握概念的基础知识,然后再继续学习同一事物的更强大、更复杂的版本。 + +在第 6 关,Hedy 现在可以进行基本的数学计算。加法、减法、乘法和除法都支持,但更高级的数学功能不支持。不能使用指数、模数或其他任何 Python 和其他语言能处理的东西。目前,Hedy 还没有更高关卡的产品增加更复杂的数学功能。 + +第 7 关引入了 Python 风格的缩进,这意味着 `repeat` 可以处理多行代码。学生在这之前都是逐行处理代码,但现在他们可以处理代码块。这个 Hedy 关卡与非教学型编程语言能做的事情相比还是有很大的差距,但它可以教会学生很多东西。 + +开始学习 Hedy 最简单的方法是访问 Hedy 网站上的 [课程][3],目前有荷兰语、英语、法语、德语、葡萄牙语和西班牙语。这样一来,任何有网页浏览器的人都可以进入学习过程。也可以从 [GitHub][4] 下载 Hedy,并从命令行运行解释器,或者运行 Hedy 网站的本地副本及其交互式课程。基于网页的版本更容易使用,但网页版本和命令行版本都支持运行针对不同复杂程度的 Hedy 程序。 + +Hedy 永远不会与 Python、C++ 或其他语言竞争,成为现实世界项目编码的首选语言,但它是编码教学的绝佳方式。作为学习过程的一部分,学生编写的程序是真实的,甚至可能是复杂的。Hedy 可以促进学生的学习和创造力,而不会让学生在学习过程中过早地被过多的信息所迷惑。就像数学课一样,在进入微积分之前很久要从学习计数、相加等开始(这个过程需要数年时间),编程也不必一开始就对编程语言的语法问题“我稍后再解释”、精确地遵循这些语法问题,才能产生哪怕是最基本的语言程序。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/hedy-teach-code + +作者:[Joshua Allen Holm][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/holmja +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/5538035618_4e19c9787c_o.png?itok=naiD1z1S (Teacher or learner?) +[2]: https://www.hedycode.com/ +[3]: https://www.hedycode.com/hedy?lang=en +[4]: https://github.com/felienne/hedy diff --git a/published/202104/20210407 Show CPU Details Beautifully in Linux Terminal With CPUFetch.md b/published/202104/20210407 Show CPU Details Beautifully in Linux Terminal With CPUFetch.md new file mode 100644 index 0000000000..e366481a6f --- /dev/null +++ b/published/202104/20210407 Show CPU Details Beautifully in Linux Terminal With CPUFetch.md @@ -0,0 +1,107 @@ +[#]: subject: (Show CPU Details Beautifully in Linux Terminal With CPUFetch) +[#]: via: (https://itsfoss.com/cpufetch/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13289-1.html) + +使用 CPUFetch 在 Linux 终端中漂亮地显示 CPU 细节 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/12/093818iie270mi8am6ttk7.jpg) + +Linux 上有 [检查 CPU 信息的方法][1]。最常见的可能是 `lscpu` 命令,它可以提供大量的系统上所有 CPU 核心的信息。 + +![lscpu command output][2] + +你可以在那里找到 CPU 信息,而无需安装任何额外的包。当然这是可行的。然而,我最近偶然发现了一个新的工具,它以一种漂亮的方式显示 Linux 中的 CPU 细节。 + +处理器制造商的 ASCII 艺术使它看起来很酷。 + +![][3] + +这看起来很美,不是吗?这类似于 [Neoftech 或者 Screenfetch,在 Linux 中用漂亮的 ASCII 艺术来展示系统信息][4]。与这些工具类似,如果你要展示你的桌面截图,可以使用 CPUFetch。 + +该工具可以输出处理器制造商的 ASCII 艺术,它的名称、微架构、频率、核心、线程、峰值性能、缓存大小、[高级向量扩展][5] 等等。 + +除了它提供的一些主题外,你还可以使用自定义颜色。当你在整理桌面,并希望对 Linux 环境中的所有元素进行颜色匹配时,这给了你更多的自由度。 + +### 在 Linux 上安装 CPUFetch + +不幸的是,CPUFetch 是一个相当新的软件,而且它并不包含在你的发行版的软件库中,甚至没有提供现成的 DEB/RPM 二进制文件、PPA、Snap 或 Flatpak 包。 + +Arch Linux 用户可以在 [AUR][7] 中 [找到][6] 它,但对于其他人来说,唯一的出路是 [从源代码构建][8]。 + +不要担心。安装以及删除并不是那么复杂。让我来告诉你步骤。 + +我使用的是 Ubuntu,你会 [需要先在 Ubuntu 上安装 Git][9]。一些发行版会预装 Git,如果没有,请使用你的发行版的包管理器来安装。 + +现在,把 Git 仓库克隆到你想要的地方。家目录也可以。 + +``` +git clone https://github.com/Dr-Noob/cpufetch +``` + +切换到你刚才克隆的目录: + +``` +cd cpufetch +``` + +你会在这里看到一个 Makefile 文件。用它来编译代码。 + +``` +make +``` + +![CPUFetch Installation][10] + +现在你会看到一个新的可执行文件,名为 `cpufetch`。你运行这个可执行文件来显示终端的 CPU 信息。 + +``` +./cpufetch +``` + +这是我系统的显示。AMD 的徽标用 ASCII 码看起来更酷,你不觉得吗? + +![][11] + +如何删除 CPUFetch?这很简单。当你编译代码时,它只产生了一个文件,而且也和其他代码在同一个目录下。 + +所以,要想从系统中删除 CPUFetch,只需删除它的整个文件夹即可。你知道 [在 Linux 终端中删除一个目录][12] 的方法吧?从 `cpufetch` 目录中出来,然后使用 `rm` 命令。 + +``` +rm -rf cpufetch +``` + +这很简单,值得庆幸的是,因为从源代码中删除安装的软件有时真的很棘手。 + +说回 CPUFetch。我想这是一个实用工具,适合那些喜欢在各种 Linux 群里炫耀自己桌面截图的人。既然发行版有了 Neofetch,CPU 有了 CPUFetch,不知道能不能也来个 Nvidia ASCII 艺术的 GPUfetch? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/cpufetch/ + +作者:[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://linuxhandbook.com/check-cpu-info-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/lscpu-command-output.png?resize=800%2C415&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/cpufetch-1.png?resize=800%2C307&ssl=1 +[4]: https://itsfoss.com/display-linux-logo-in-ascii/ +[5]: https://software.intel.com/content/www/us/en/develop/articles/introduction-to-intel-advanced-vector-extensions.html +[6]: https://aur.archlinux.org/packages/cpufetch-git +[7]: https://itsfoss.com/aur-arch-linux/ +[8]: https://itsfoss.com/install-software-from-source-code/ +[9]: https://itsfoss.com/install-git-ubuntu/ +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/cpufetch-installation.png?resize=800%2C410&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/cpufetch-for-itsfoss.png?resize=800%2C335&ssl=1 +[12]: https://linuxhandbook.com/remove-files-directories/ diff --git a/published/202104/20210407 Using network bound disk encryption with Stratis.md b/published/202104/20210407 Using network bound disk encryption with Stratis.md new file mode 100644 index 0000000000..4c1440fd56 --- /dev/null +++ b/published/202104/20210407 Using network bound disk encryption with Stratis.md @@ -0,0 +1,284 @@ +[#]: subject: (Using network bound disk encryption with Stratis) +[#]: via: (https://fedoramagazine.org/network-bound-disk-encryption-with-stratis/) +[#]: author: (briansmith https://fedoramagazine.org/author/briansmith/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13340-1.html) + +使用 Stratis 的网络绑定磁盘加密 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/27/221704gyzyvyroyyrybany.jpg) + +在一个有许多加密磁盘的环境中,解锁所有的磁盘是一项困难的任务。网络绑定磁盘加密Network bound disk encryption(NBDE)有助于自动解锁 Stratis 卷的过程。这是在大型环境中的一个关键要求。Stratis 2.1 版本增加了对加密的支持,这在《[Stratis 加密入门][4]》一文中介绍过。Stratis 2.3 版本最近在使用加密的 Stratis 池时引入了对网络绑定磁盘加密(NBDE)的支持,这是本文的主题。 + +[Stratis 网站][5] 将 Stratis 描述为一个“_易于使用的 Linux 本地存储管理_”。短视频《[使用 Stratis 管理存储][6]》对基础知识进行了快速演示。该视频是在 Red Hat Enterprise Linux 8 系统上录制的,然而,视频中显示的概念也适用于 Fedora Linux 中的 Stratis。 + +### 先决条件 + +本文假设你熟悉 Stratis,也熟悉 Stratis 池加密。如果你不熟悉这些主题,请参考这篇 [文章][4] 和前面提到的 [Stratis 概述视频][6]。 + +NBDE 需要 Stratis 2.3 或更高版本。本文中的例子使用的是 Fedora Linux 34 的预发布版本。Fedora Linux 34 的最终版本将包含 Stratis 2.3。 + +### 网络绑定磁盘加密(NBDE)概述 + +加密存储的主要挑战之一是有一个安全的方法在系统重启后再次解锁存储。在大型环境中,手动输入加密口令并不能很好地扩展。NBDE 解决了这一问题,允许以自动方式解锁加密存储。 + +在更高层次上,NBDE 需要环境中的 Tang 服务器。客户端系统(使用 Clevis Pin)只要能与 Tang 服务器建立网络连接,就可以自动解密存储。如果网络没有连接到 Tang 服务器,则必须手动解密存储。 + +这背后的想法是,Tang 服务器只能在内部网络上使用,因此,如果加密设备丢失或被盗,它将不再能够访问内部网络连接到 Tang 服务器,因此不会被自动解密。 + +关于 Tang 和 Clevis 的更多信息,请参见手册页(`man tang`、`man clevis`)、[Tang 的 GitHub 页面][7] 和 [Clevis 的 GitHub 页面][8]。 + +### 设置 Tang 服务器 + +本例使用另一个 Fedora Linux 系统作为 Tang 服务器,主机名为 `tang-server`。首先安装 `tang` 包。 + +``` +dnf install tang +``` + +然后用 `systemctl` 启用并启动 `tangd.socket`。 + +``` +systemctl enable tangd.socket --now +``` + +Tang 使用的是 TCP 80 端口,所以你也需要在防火墙中打开该端口。 + +``` +firewall-cmd --add-port=80/tcp --permanent +firewall-cmd --add-port=80/tcp +``` + +最后,运行 `tang-show-keys` 来显示输出签名密钥指纹。你以后会需要这个。 + +``` +# tang-show-keys +l3fZGUCmnvKQF_OA6VZF9jf8z2s +``` + +### 创建加密的 Stratis 池 + +上一篇关于 Stratis 加密的文章详细介绍了如何设置加密的 Stratis 池,所以本文不会深入介绍。 + +第一步是捕获一个将用于解密 Stratis 池的密钥。即使使用 NBDE,也需要设置这个,因为在 NBDE 服务器无法到达的情况下,可以用它来手动解锁池。使用以下命令捕获 `pool1` 密钥。 + +``` +# stratis key set --capture-key pool1key +Enter key data followed by the return key: +``` + +然后我将使用 `/dev/vdb` 设备创建一个加密的 Stratis 池(使用刚才创建的 `pool1key`),命名为 `pool1`。 + +``` +# stratis pool create --key-desc pool1key pool1 /dev/vdb。 +``` + +接下来,在这个 Stratis 池中创建一个名为 `filesystem1` 的文件系统,创建一个挂载点,挂载文件系统,并在其中创建一个测试文件: + +``` +# stratis filesystem create pool1 filesystem1 +# mkdir /filesystem1 +# mount /dev/stratis/pool1/filesystem1 /filesystem1 +# cd /filesystem1 +# echo "this is a test file" > testfile +``` + +### 将 Stratis 池绑定到 Tang 服务器上 + +此时,我们已经创建了加密的 Stratis 池,并在池中创建了一个文件系统。下一步是将你的 Stratis 池绑定到刚刚设置的 Tang 服务器上。使用 `stratis pool bind nbde` 命令进行。 + +当你进行 Tang 绑定时,需要向该命令传递几个参数: + + * 池名(在本例中,`pool1`) + * 钥匙描述符名称(本例中为 `pool1key`) + * Tang 服务器名称(在本例中,`http://tang-server`) + +记得之前在 Tang 服务器上,运行了 `tang-show-keys`,显示 Tang 输出的签名密钥指纹是 `l3fZGUCmnvKQF_OA6VZF9jf8z2s`。除了前面的参数外,还需要用参数 `-thumbprint l3fZGUCmnvKQF_OA6VZF9jf8z2s` 传递这个指纹,或者用 `-trust-url` 参数跳过对指纹的验证。 + +使用 `-thumbprint` 参数更安全。例如: + +``` +# stratis pool bind nbde pool1 pool1key http://tang-server --thumbprint l3fZGUCmnvKQF_OA6VZF9jf8z2s +``` + +### 用 NBDE 解锁 Stratis 池 + +接下来重启主机,并验证你可以用 NBDE 解锁 Stratis 池,而不需要使用密钥口令。重启主机后,该池不再可用: + +``` +# stratis pool list +Name Total Physical Properties +``` + +要使用 NBDE 解锁池,请运行以下命令: + +``` +# stratis pool unlock clevis +``` + +注意,你不需要使用密钥口令。这个命令可以在系统启动时自动运行。 + +此时,Stratis 池已经可以使用了: + +``` +# stratis pool list +Name Total Physical Properties +pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr +``` + +你可以挂载文件系统,访问之前创建的文件: + +``` +# mount /dev/stratis/pool1/filesystem1 /filesystem1/ +# cat /filesystem1/testfile +this is a test file +``` + +### 轮换 Tang 服务器密钥 + +最好定期轮换 Tang 服务器密钥,并更新 Stratis 客户服务器以使用新的 Tang 密钥。 + +要生成新的 Tang 密钥,首先登录到 Tang 服务器,查看 `/var/db/tang` 目录的当前状态。然后,运行 `tang-show-keys` 命令: + +``` +# ls -al /var/db/tang +total 8 +drwx------. 1 tang tang 124 Mar 15 15:51 . +drwxr-xr-x. 1 root root 16 Mar 15 15:48 .. +-rw-r--r--. 1 tang tang 361 Mar 15 15:51 hbjJEDXy8G8wynMPqiq8F47nJwo.jwk +-rw-r--r--. 1 tang tang 367 Mar 15 15:51 l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk +# tang-show-keys +l3fZGUCmnvKQF_OA6VZF9jf8z2s +``` + +要生成新的密钥,运行 `tangd-keygen` 并将其指向 `/var/db/tang` 目录: + +``` +# /usr/libexec/tangd-keygen /var/db/tang +``` + +如果你再看看 `/var/db/tang` 目录,你会看到两个新文件: + +``` +# ls -al /var/db/tang +total 16 +drwx------. 1 tang tang 248 Mar 22 10:41 . +drwxr-xr-x. 1 root root 16 Mar 15 15:48 .. +-rw-r--r--. 1 tang tang 361 Mar 15 15:51 hbjJEDXy8G8wynMPqiq8F47nJwo.jwk +-rw-r--r--. 1 root root 354 Mar 22 10:41 iyG5HcF01zaPjaGY6L_3WaslJ_E.jwk +-rw-r--r--. 1 root root 349 Mar 22 10:41 jHxerkqARY1Ww_H_8YjQVZ5OHao.jwk +-rw-r--r--. 1 tang tang 367 Mar 15 15:51 l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk +``` + +如果你运行 `tang-show-keys`,就会显示出 Tang 所公布的密钥: + +``` +# tang-show-keys +l3fZGUCmnvKQF_OA6VZF9jf8z2s +iyG5HcF01zaPjaGY6L_3WaslJ_E +``` + +你可以通过将两个原始文件改名为以句号开头的隐藏文件,来防止旧的密钥(以 `l3fZ` 开头)被公布。通过这种方法,旧的密钥将不再被公布,但是它仍然可以被任何没有更新为使用新密钥的现有客户端使用。一旦所有的客户端都更新使用了新密钥,这些旧密钥文件就可以删除了。 + +``` +# cd /var/db/tang +# mv hbjJEDXy8G8wynMPqiq8F47nJwo.jwk .hbjJEDXy8G8wynMPqiq8F47nJwo.jwk +# mv l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk .l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk +``` + +此时,如果再运行 `tang-show-keys`,Tang 只公布新钥匙: + +``` +# tang-show-keys +iyG5HcF01zaPjaGY6L_3WaslJ_E +``` + +下一步,切换到你的 Stratis 系统并更新它以使用新的 Tang 密钥。当文件系统在线时, Stratis 支持这样做。 + +首先,解除对池的绑定: + +``` +# stratis pool unbind pool1 +``` + +接下来,用创建加密池时使用的原始口令设置密钥: + +``` +# stratis key set --capture-key pool1key +Enter key data followed by the return key: +``` + +最后,用更新后的密钥指纹将 Stratis 池绑定到 Tang 服务器上: + +``` +# stratis pool bind nbde pool1 pool1key http://tang-server --thumbprint iyG5HcF01zaPjaGY6L_3WaslJ_E +``` + +Stratis 系统现在配置为使用更新的 Tang 密钥。一旦使用旧的 Tang 密钥的任何其他客户系统被更新,在 Tang 服务器上的 `/var/db/tang` 目录中被重命名为隐藏文件的两个原始密钥文件就可以被备份和删除了。 + +### 如果 Tang 服务器不可用怎么办? + +接下来,关闭 Tang 服务器,模拟它不可用,然后重启 Stratis 系统。 + +重启后,Stratis 池又不可用了: + +``` +# stratis pool list +Name Total Physical Properties +``` + +如果你试图用 NBDE 解锁,会因为 Tang 服务器不可用而失败: + +``` +# stratis pool unlock clevis +Execution failed: +An iterative command generated one or more errors: The operation 'unlock' on a resource of type pool failed. The following errors occurred: +Partial action "unlock" failed for pool with UUID 4d62f840f2bb4ec9ab53a44b49da3f48: Cryptsetup error: Failed with error: Error: Command failed: cmd: "clevis" "luks" "unlock" "-d" "/dev/vdb" "-n" "stratis-1-private-42142fedcb4c47cea2e2b873c08fcf63-crypt", exit reason: 1 stdout: stderr: /dev/vdb could not be opened. +``` + +此时,在 Tang 服务器无法到达的情况下,解锁池的唯一选择就是使用原密钥口令: + +``` +# stratis key set --capture-key pool1key +Enter key data followed by the return key: +``` + +然后你可以使用钥匙解锁池: + +``` +# stratis pool unlock keyring +``` + +接下来,验证池是否成功解锁: + +``` +# stratis pool list +Name Total Physical Properties +pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr +``` + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/network-bound-disk-encryption-with-stratis/ + +作者:[briansmith][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/briansmith/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/03/stratis-nbde-816x345.jpg +[2]: https://unsplash.com/@imattsmart?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/lock?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://linux.cn/article-13311-1.html +[5]: https://stratis-storage.github.io/ +[6]: https://www.youtube.com/watch?v=CJu3kmY-f5o +[7]: https://github.com/latchset/tang +[8]: https://github.com/latchset/clevis diff --git a/published/202104/20210407 What is Git cherry-picking.md b/published/202104/20210407 What is Git cherry-picking.md new file mode 100644 index 0000000000..ba25e9572c --- /dev/null +++ b/published/202104/20210407 What is Git cherry-picking.md @@ -0,0 +1,187 @@ +[#]: subject: (What is Git cherry-picking?) +[#]: via: (https://opensource.com/article/21/4/cherry-picking-git) +[#]: author: (Rajeev Bera https://opensource.com/users/acompiler) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13295-1.html) + +什么是 Git 遴选(cherry-pick)? +====== + +> 了解 `git cherry-pick` 命令是什么,为什么用以及如何使用。 + +![](https://img.linux.net.cn/data/attachment/album/202104/14/131735o63v3ow6y2wc281o.jpg) + +当你和一群程序员一起工作时,无论项目大小,处理多个 Git 分支之间的变更都会变得很困难。有时,你不想将整个 Git 分支合并到另一个分支,而是想选择并移动几个特定的提交。这个过程被称为 “遴选cherry-pick”。 + +本文将介绍“遴选”是什么、为何使用以及如何使用。 + +那么让我们开始吧。 + +### 什么是遴选? + +使用遴选(`cherry-pick`)命令,Git 可以让你将任何分支中的个别提交合并到你当前的 [Git HEAD][2] 分支中。 + +当执行 `git merge` 或者 `git rebase` 时,一个分支的所有提交都会被合并。`cherry-pick` 命令允许你选择单个提交进行整合。 + +### 遴选的好处 + +下面的情况可能会让你更容易理解遴选功能。 + +想象一下,你正在为即将到来的每周冲刺实现新功能。当你的代码准备好了,你会把它推送到远程分支,准备进行测试。 + +然而,客户并不是对所有修改都满意,要求你只呈现某些修改。因为客户还没有批准下次发布的所有修改,所以 `git rebase` 不会有预期的结果。为什么会这样?因为 `git rebase` 或者 `git merge` 会把上一个冲刺的每一个调整都纳入其中。 + +遴选就是答案!因为它只关注在提交中添加的变更,所以遴选只会带入批准的变更,而不添加其他的提交。 + +还有其他几个原因可以使用遴选: + + * 这对于 bug 修复是必不可少的,因为 bug 是出现在开发分支中对应的提交的。 + * 你可以通过使用 `git cherry-pick` 来避免不必要的工作,而不用使用其他选项例如 `git diff` 来应用特定变更。 + * 如果因为不同 Git 分支的版本不兼容而无法将整个分支联合起来,那么它是一个很有用的工具。 + +### 使用 cherry-pick 命令 + +在 `cherry-pick` 命令的最简单形式中,你只需使用 [SHA][3] 标识符来表示你想整合到当前 HEAD 分支的提交。 + +要获得提交的哈希值,可以使用 `git log` 命令: + +``` +$ git log --oneline +``` + +当你知道了提交的哈希值后,你就可以使用 `cherry-pick` 命令。 + +语法是: + +``` +$ git cherry-pick +``` + +例如: + +``` +$ git cherry-pick 65be1e5 +``` + +这将会把指定的修改合并到当前已签出的分支上。 + +如果你想做进一步的修改,也可以让 Git 将提交的变更内容添加到你的工作副本中。 + +语法是: + +``` +$ git cherry-pick --no-commit +``` + +例如: + +``` +$ git cherry-pick 65be1e5 --no-commit +``` + +如果你想同时选择多个提交,请将它们的提交哈希值用空格隔开: + +``` +$ git cherry-pick hash1 hash3 +``` + +当遴选提交时,你不能使用 `git pull` 命令,因为它能获取一个仓库的提交**并**自动合并到另一个仓库。`cherry-pick` 是一个专门不这么做的工具;另一方面,你可以使用 `git fetch`,它可以获取提交,但不应用它们。毫无疑问,`git pull` 很方便,但它不精确。 + +### 自己尝试 + +要尝试这个过程,启动终端并生成一个示例项目: + +``` +$ mkdir fruit.git +$ cd fruit.git +$ git init . +``` + +创建一些数据并提交: + +``` +$ echo "Kiwifruit" > fruit.txt +$ git add fruit.txt +$ git commit -m 'First commit' +``` + +现在,通过创建一个项目的复刻来代表一个远程开发者: + +``` +$ mkdir ~/fruit.fork +$ cd !$ +$ echo "Strawberry" >> fruit.txt +$ git add fruit.txt +$ git commit -m 'Added a fruit" +``` + +这是一个有效的提交。现在,创建一个不好的提交,代表你不想合并到你的项目中的东西: + +``` +$ echo "Rhubarb" >> fruit.txt +$ git add fruit.txt +$ git commit -m 'Added a vegetable that tastes like a fruit" +``` + +返回你的仓库,从你的假想的开发者那里获取提交的内容: + +``` +$ cd ~/fruit.git +$ git remote add dev ~/fruit.fork +$ git fetch dev +remote: Counting objects: 6, done. +remote: Compressing objects: 100% (2/2), done. +remote: Total 6 (delta 0), reused 0 (delta 0) +Unpacking objects: 100% (6/6), done... +``` + +``` +$ git log –oneline dev/master +e858ab2 Added a vegetable that tastes like a fruit +0664292 Added a fruit +b56e0f8 First commit +``` + +你已经从你想象中的开发者那里获取了提交的内容,但你还没有将它们合并到你的版本库中。你想接受第二个提交,但不想接受第三个提交,所以使用 `cherry-pick`。 + +``` +$ git cherry-pick 0664292 +``` + +第二次提交现在在你的仓库里了: + +``` +$ cat fruit.txt +Kiwifruit +Strawberry +``` + +将你的更改推送到远程服务器上,这就完成了! + +### 避免使用遴选的原因 + +在开发者社区中,通常不鼓励所以遴选。主要原因是它会造成重复提交,而你也失去了跟踪你的提交历史的能力。 + +如果你不按顺序地遴选了大量的提交,这些提交会被记录在你的分支中,这可能会在 Git 分支中导致不理想的结果。 + +遴选是一个强大的命令,如果没有正确理解可能发生的情况,它可能会导致问题。不过,当你搞砸了,提交到错误的分支时,它可能会救你一命(至少是你当天的工作)。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/cherry-picking-git + +作者:[Rajeev Bera][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/acompiler +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/pictures/cherry-picking-recipe-baking-cooking.jpg?itok=XVwse6hw (Measuring and baking a cherry pie recipe) +[2]: https://acompiler.com/git-head/ +[3]: https://en.wikipedia.org/wiki/Secure_Hash_Algorithms diff --git a/published/202104/20210407 Why I love using bspwm for my Linux window manager.md b/published/202104/20210407 Why I love using bspwm for my Linux window manager.md new file mode 100644 index 0000000000..8050039891 --- /dev/null +++ b/published/202104/20210407 Why I love using bspwm for my Linux window manager.md @@ -0,0 +1,107 @@ +[#]: subject: (Why I love using bspwm for my Linux window manager) +[#]: via: (https://opensource.com/article/21/4/bspwm-linux) +[#]: author: (Stephen Adams https://opensource.com/users/stevehnh) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13308-1.html) + +为什么我喜欢用 bspwm 来做我的 Linux 窗口管理器 +====== + +> 在 Fedora Linux 上安装、配置并开始使用 bspwm 窗口管理器。 + +![](https://img.linux.net.cn/data/attachment/album/202104/18/114637hxvqp4hfvbbhihb4.jpg) + +有些人喜欢重新布置家具。还有的人喜欢尝试新鞋或定期重新装修他们的卧室。我呢,则是尝试 Linux 桌面。 + +在对网上看到的一些不可思议的桌面环境流口水之后,我对一个窗口管理器特别好奇:[bspwm][2]。 + +![bspwm desktop][3] + +我喜欢 [i3][5] 窗口管理器已经有一段时间了,我很喜欢它的布局方式和上手的便捷性。但 bspwm 的某些特性吸引了我。有几个原因让我决定尝试一下: + + * 它_只是_一个窗口管理器(WM)。 + * 它由几个易于配置的脚本管理。 + * 它默认支持窗口之间的间隙。 + +可能是最需要指出的第一个原因是它只是一个窗口管理器。和 i3 一样,默认情况下没有任何图形化的那些花哨东西。你当然可以随心所欲地定制它,但_你_需要付出努力来使它看起来像你想要的。这也是它吸引我的部分原因。 + +虽然它可以在许多发行版上使用,但在我这个例子中使用的是 Fedora Linux。 + +### 安装 bspwm + +bspwm 在大多数常见的发行版中都有打包,所以你可以用系统的包管理器安装它。下面这个命令还会安装 [sxkhd][6],这是一个 X 窗口系统的守护程序,它“通过执行命令对输入事件做出反应”;还有 [dmenu][7],这是一个通用的 X 窗口菜单: + +``` +dnf install bspwm sxkhd dmenu +``` + +因为 bspwm 只是一个窗口管理器,所以没有任何内置的快捷键或键盘命令。这也是它与 i3 等软件的不同之处。所以,在你第一次启动窗口管理器之前,请先配置一下 `sxkhd`: + +``` +systemctl start sxkhd +systemctl enable sxkhd +``` + +这样就可以在登录时启用 `sxkhd`,但你还需要一些基本功能的配置: + +``` +curl https://raw.githubusercontent.com/baskerville/bspwm/master/examples/sxhkdrc --output ~/.config/sxkhd/sxkhdrc +``` + +在你深入了解之前,不妨先看看这个文件,因为有些脚本调用的命令可能在你的系统中并不存在。一个很好的例子是调用 `urxvt` 的 `super + Return` 快捷键。把它改成你喜欢的终端,尤其是当你没有安装 `urxvt` 的时候: + +``` +# +# wm independent hotkeys +# +    +# terminal emulator +super + Return +        urxvt +    +# program launcher +super + @space +        dmenu_run +``` + +如果你使用的是 GDM、LightDM 或其他显示管理器(DM),只要在登录前选择 `bspwm` 即可。 + +### 配置 bspwm + +当你登录后,你会看到屏幕上什么都没有。这不是你感觉到的空虚感。而是无限可能性!你现在可以开始摆弄桌面环境的所有部分了。你现在可以开始摆弄这些年你认为理所当然的桌面环境的所有部分了。从头开始构建并不容易,但一旦你掌握了诀窍,就会非常有收获。 + +任何窗口管理器最困难的是掌握快捷键。你开始会很慢,但在很短的时间内,你就可以只使用键盘在系统中到处操作,在你的朋友和家人面前看起来像一个终极黑客。 + +你可以通过编辑 `~/.config/bspwm/bspwmrc`,在启动时添加应用,设置桌面和显示器,并为你的窗口应该如何表现设置规则,随心所欲地定制系统。有一些默认设置的例子可以让你开始使用。键盘快捷键都是由 `sxkhdrc` 文件管理的。 + +还有更多的开源项目可以安装,让你的电脑看起来更漂亮,比如用于桌面背景的 [Feh][8]、状态栏的 [Polybar][9]、应用启动器的 [Rofi][10],还有 [Compton][11] 可以给你提供阴影和透明度,可以让你的电脑看起来焕然一新。 + +玩得愉快! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/bspwm-linux + +作者:[Stephen Adams][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/stevehnh +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/windows_building_sky_scale.jpg?itok=mH6CAX29 (Tall building with windows) +[2]: https://github.com/baskerville/bspwm +[3]: https://opensource.com/sites/default/files/uploads/bspwm-desktop.png (bspwm desktop) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://i3wm.org/ +[6]: https://github.com/baskerville/sxhkd +[7]: https://linux.die.net/man/1/dmenu +[8]: https://github.com/derf/feh +[9]: https://github.com/polybar/polybar +[10]: https://github.com/davatorium/rofi +[11]: https://github.com/chjj/compton diff --git a/published/202104/20210409 4 ways open source gives you a competitive edge.md b/published/202104/20210409 4 ways open source gives you a competitive edge.md new file mode 100644 index 0000000000..4a9603b1ba --- /dev/null +++ b/published/202104/20210409 4 ways open source gives you a competitive edge.md @@ -0,0 +1,84 @@ +[#]: subject: (4 ways open source gives you a competitive edge) +[#]: via: (https://opensource.com/article/21/4/open-source-competitive-advantage) +[#]: author: (Jason Blais https://opensource.com/users/jasonblais) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13299-1.html) + +开源为你带来竞争优势的 4 种方式 +====== + +> 使用开源技术可以帮助组织获得更好的业务结果。 + +![](https://img.linux.net.cn/data/attachment/album/202104/15/085345a2aani3axxj7wcis.jpg) + +构建技术栈是每个组织的主要决策。选择合适的工具将让团队获得成功,选择错误的解决方案或平台会对生产率和利润率产生毁灭性影响。为了在当今快节奏的世界中脱颖而出,组织必须明智地选择数字解决方案,好的数字解决方案可以提升团队行动力与运营敏捷性。 + +这就是为什么越来越多的组织都采用开源解决方案的原因,这些组织来自各行各业,规模有大有小。根据 [麦肯锡][2] 最近的报告,高绩效组织的最大区别是采用不同的开源方案。 + +采用开源技术可以帮助组织提高竞争优势、获得更好业务成果的原因有以下四点。 + +### 1、可拓展性和灵活性 + +可以说,技术世界发展很快。例如,在 2014 年之前,Kubernetes 并不存在,但今天,它却令人印象深刻,无处不在。根据 CNCF [2020 云原生调查][3],91% 的团队正在以某种形式使用 Kubernetes。 + +组织投资开源的一个主要原因是因为开源赋予组织行动敏捷性,组织可以迅速地将新技术集成到技术栈中。这与传统方法不同,在传统方法中,团队需要几个季度甚至几年来审查、实施、采用软件,这导致团队不可能实现火速转变。 + +开源解决方案完整地提供源代码,团队可以轻松将软件与他们每天使用的工具连接起来。 + +简而言之,开源让开发团队能够为手头的东西构建完美的工具,而不是被迫改变工作方式来适应不灵活的专有工具。 + +### 2、安全性和高可信的协作 + +在数据泄露备受瞩目的时代,组织需要高度安全的工具来保护敏感数据的安全。 + +专有解决方案中的漏洞不易被发现,被发现时为时已晚。不幸的是,使用这些平台的团队无法看到源代码,本质上是他们将安全性外包给特定供应商,并希望得到最好的结果。 + +采用开源的另一个主要原因是开源工具使组织能够自己把控安全。例如,开源项目——尤其是拥有大型开源社区的项目——往往会收到更负责任的漏洞披露,因为每个人在使用过程中都可以彻底检查源代码。 + +由于源代码是免费提供的,因此披露通常伴随着修复缺陷的详细建议解决方案。这些方案使得开发团队能够快速解决问题,不断增强软件。 + +在远程办公时代,对于分布式团队来说,在知道敏感数据受到保护的情况下进行协作比以往任何时候都更重要。开源解决方案允许组织审核安全性、完全掌控自己数据,因此开源方案可以促进远程环境下高可信协作方式的成长。 + +### 3、不受供应商限制 + +根据 [最近的一项研究][4],68% 的 CIO 担心受供应商限制。当你受限于一项技术中,你会被迫接受别人的结论,而不是自己做结论。 + +当组织更换供应商时,专有解决方案通常会 [给你带走数据带来挑战][5]。另一方面,开源工具提供了组织需要的自由度和灵活性,以避免受供应商限制,开源工具可以让组织把数据带去任意地方。 + +### 4、顶尖人才和社区 + +随着越来越多的公司 [接受远程办公][6],人才争夺战变得愈发激烈。 + +在软件开发领域,获得顶尖人才始于赋予工程师先进工具,让工程师在工作中充分发挥潜力。开发人员 [越来越喜欢开源解决方案][7] 而不是专有解决方案,组织应该强烈考虑用开源替代商业解决方案,以吸引市场上最好的开发人员。 + +除了雇佣、留住顶尖人才更容易,公司能够通过开源平台利用贡献者社区,得到解决问题的建议,从平台中得到最大收益。此外,社区成员还可以 [直接为开源项目做贡献][8]。 + +### 开源带来自由 + +开源软件在企业团队中越来越受到欢迎——[这是有原因的][8]。它帮助团队灵活地构建完美的工作工具,同时使团队可以维护高度安全的环境。同时,开源允许团队掌控未来方向,而不是局限于供应商的路线图。开源还帮助公司接触才华横溢的工程师和开源社区成员。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/open-source-competitive-advantage + +作者:[Jason Blais][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[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/openwires_fromRHT_520_0612LL.png?itok=PqZi55Ab (Open ethernet cords.) +[2]: https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/developer-velocity-how-software-excellence-fuels-business-performance# +[3]: https://www.cncf.io/blog/2020/11/17/cloud-native-survey-2020-containers-in-production-jump-300-from-our-first-survey/ +[4]: https://solutionsreview.com/cloud-platforms/flexera-68-percent-of-cios-worry-about-vendor-lock-in-with-public-cloud/ +[5]: https://www.computerworld.com/article/3428679/mattermost-makes-case-for-open-source-as-team-messaging-market-booms.html +[6]: https://mattermost.com/blog/tips-for-working-remotely/ +[7]: https://opensource.com/article/20/6/open-source-developers-survey +[8]: https://mattermost.com/blog/100-most-popular-mattermost-features-invented-and-contributed-by-our-amazing-open-source-community/ +[9]: https://mattermost.com/open-source-advantage/ diff --git a/published/202104/20210410 5 signs you-re a groff programmer.md b/published/202104/20210410 5 signs you-re a groff programmer.md new file mode 100644 index 0000000000..53e41c98fd --- /dev/null +++ b/published/202104/20210410 5 signs you-re a groff programmer.md @@ -0,0 +1,80 @@ +[#]: subject: (5 signs you're a groff programmer) +[#]: via: (https://opensource.com/article/21/4/groff-programmer) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (liweitianux) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13316-1.html) + +groff 程序员的 5 个标志 +====== + +> 学习一款老派的文本处理软件 groff,就像是学习骑自行车。 + +![](https://img.linux.net.cn/data/attachment/album/202104/20/221218y34lew4gewqw2xg2.jpg) + +我第一次发现 Unix 系统是在 20 世纪 90 年代早期,当时我还在大学读本科。我太喜欢这个系统了,所以我将家里电脑上的 MS-DOS 也换成了 Linux 系统。 + +在 90 年代早期至中期,Linux 所缺失的一个东西是字处理软件word processor。作为其他桌面操作系统的标准办公程序,字处理软件能让你轻松地编辑文本。我经常在 DOS 上使用字处理软件来撰写课程论文。直到 90 年代末,我都没能找到一款 Linux 原生的字处理软件。直到那时,文字处理是我在第一台电脑上保留双启动的少有的原因之一,那样我可以偶尔切换到 DOS 系统写论文。 + +后来,我发现 Linux 提供了一款文字处理软件:GNU troff,它一般称为 [groff][2],是经典的文本处理系统 troff 的一个现代实现。troff 是 “排版工快印typesetter roff” 的简称,是 nroff 系统的改进版本,而 nroff 又是最初的 roff 系统的新实现。roff 表示快速印出run off,比如“快速印出”一份文档。 + +利用文本处理系统,你在纯文本编辑器里编辑内容,通过macro或其他处理命令来添加格式。然后将文件输入文本处理系统,比如 groff,来生成适合打印的格式化输出。另一个知名的文本处理系统是 LaTeX,但是 groff 已经满足我的需求,而且足够简单。 + +经过一点实践,我发现在 Linux 上使用 groff 来撰写课程论文与使用字处理软件一样容易。尽管我现在不再使用 groff 来写文档了,我依然记得它的那些宏和命令。如果你也是这样并且在那么多年之前学会了使用 groff 写作,你可能会认出这 5 个 groff 程序员的标志。 + +### 1、你有一个喜欢的宏集 + +输入由宏点缀的纯文本,你便能在 groff 里对文档进行格式化。groff 里的宏是行首为单个句点(`.`)的短命令。例如:如果你想在输出里插入几行,宏命令 `.sp 2` 会添加两个空行。groff 还具有其他一些基本的宏,支持各种各样的格式化。 + +为了能让作者更容易地格式化文档,groff 还提供了不同的 宏集macro set,即一组能够让你以自己的方式格式化文档的宏的集合。我学会的第一个宏集是 `-me` 宏集。这个宏集的名称其实是 `e`,你在处理文件时使用 `-me` 选项来指定这个 `e` 宏集。 + +groff 还包含其他宏集。例如,`-man` 宏集以前是用于格式化 Unix 系统内置的 手册页manual page 的标准宏集,`-ms` 宏集经常用于格式化其他一些技术文档。如果你学会了使用 groff 写作,你可能有一个喜欢的宏集。 + +### 2、你想专注于内容而非格式 + +使用 groff 写作的一个很好的特点是,你能专注于你的 _内容_,而不用太担心它看起来会怎么样。对于技术作者而言这是一个很实用的特点。对专业作家来说,groff 是一个很好的、“不会分心”的写作环境。至少,使用 groff `-T` 选项所支持的任何格式来交付内容时你不用担心,这包括 PDF、PostScript、HTML、以及纯文本。不过,你无法直接从 groff 生成 LibreOffice ODT 文件或者 Word DOC 文件。 + +一旦你使用 groff 写作变得有信心之后,宏便开始 _消失_。用于格式化的宏变成了背景的一部分,而你纯粹地专注于眼前的文本内容。我已经使用 groff 写了足够多内容,以至于我甚至不再看见那些宏。也许,这就像写代码,而你的大脑随意换档,于是你就像计算机一样思考,看到的代码就是一组指令。对我而言,使用 groff 写作就像那样:我仅仅看到文本,而我的大脑将宏自动地翻译成格式。 + +### 3、你喜欢怀旧复古的感觉 + +当然,使用一个更典型的字处理软件来写你的文档可能更 _简单_,比如 LibreOffice Writer、甚至 Google Docs 或 Microsoft Word。而且对于某些种类的文档,桌面型字处理软件才是正确的选择。但是,如果你想要这种怀旧复古的感觉,使用 groff 写作很难被打败。 + +我承认,我的大部分写作是用 LibreOffice Writer 完成的,它的表现很出色。但是当我渴望以一种怀旧复古的方式去做时,我会打开编辑器用 groff 来写文档。 + +### 4、你希望能到处使用它 + +groff 及其同类软件在几乎所有的 Unix 系统上都是标准软件包。此外,groff 宏不会随系统而变化。比如,`-me` 宏集在不同系统上都应该相同。因此,一旦你在一个系统上学会使用宏,你能在下一个系统上同样地使用它们。 + +另外,因为 groff 文档就是纯文本文档,所以你能使用任何你喜欢的编辑器来编辑文档。我喜欢使用 GNU Emacs 来编辑我的 groff 文档,但是你可能使用 GNOME Gedit、Vim、其他你 [最喜欢的文本编辑器][3]。大部分编辑器会支持这样一种模式,其中 groff 宏会以不同的颜色高亮显示,帮助你在处理文件之前便能发现错误。 + +### 5、你使用 -me 写了这篇文章 + +当我决定要写这篇文章时,我认为最佳的方式便是直接使用 groff。我想要演示 groff 在编写文档方面是多么的灵活。所以,虽然你正在网上读这篇文章,但是它最初是用 groff 写的。 + +我希望这激发了你学习如何使用 groff 撰写文档的兴趣。如果你想学习 `-me` 宏集里更高级的函数,参考 Eric Allman 的《Writing papers with groff using -me》,你应该能在系统的 groff 文档找到这本书,文件名为 `meintro.me`。这是一份很好的参考资料,还解释了使用 `-me` 宏集格式化论文的其他方式。 + +我还提供了这篇文章的原始草稿,其中使用了 `-me` 宏集。下载这个文件并保存为 `five-signs-groff.me`,然后运行 groff 处理来查看它。`-T` 选项设置输出类型,比如 `-Tps` 用于生成 PostScript 输出,`-Thtml` 用于生成 HTML 文件。比如: + +``` +groff -me -Thtml five-signs-groff.me > five-signs-groff.html +``` + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/groff-programmer + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[liweitianux](https://github.com/liweitianux) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/doc-dish-lead.png?itok=h3fCkVmU (Typewriter in the grass) +[2]: https://en.wikipedia.org/wiki/Groff_(software) +[3]: https://opensource.com/article/21/2/open-source-text-editors diff --git a/published/202104/20210410 How to Install Steam on Fedora -Beginner-s Tip.md b/published/202104/20210410 How to Install Steam on Fedora -Beginner-s Tip.md new file mode 100644 index 0000000000..9aa71925fa --- /dev/null +++ b/published/202104/20210410 How to Install Steam on Fedora -Beginner-s Tip.md @@ -0,0 +1,119 @@ +[#]: subject: (How to Install Steam on Fedora [Beginner’s Tip]) +[#]: via: (https://itsfoss.com/install-steam-fedora/) +[#]: author: (John Paul https://itsfoss.com/author/john/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13302-1.html) + +如何在 Fedora 上安装 Steam +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/16/090703cg4t5npnseskhxhv.jpg) + +Steam 对 Linux 游戏玩家来说是最好的东西了。由于 Steam,你可以在 Linux 上玩成百上千的游戏。 + +如果你还不知道,Steam 是最流行的 PC 游戏平台。2013 年,它开始可以在 Linux 使用。[Steam 最新的 Proton 项目][1] 允许你在 Linux 上玩为 Windows 平台创建的游戏。这让 Linux 游戏库增强了许多倍。 + +![][2] + +Steam 提供了一个桌面客户端,你可以用它从 Steam 商店下载或购买游戏,然后安装并玩它。 + +过去我们曾讨论过 [在 Ubuntu 上安装 Steam][3]。在这个初学者教程中,我将向你展示在 Fedora Linux 上安装 Steam 的步骤。 + +### 在 Fedora 上安装 Steam + +要在 Fedora 上使用 Steam,你必须使用 RMPFusion 软件库。[RPMFusion][4] 是一套第三方软件库,其中包含了 Fedora 选择不与它们的操作系统一起发布的软件。它们提供自由(开源)和非自由(闭源)的软件库。由于 Steam 在非自由软件库中,你将只安装那一个。 + +我将同时介绍终端和图形安装方法。 + +#### 方法 1:通过终端安装 Steam + +这是最简单的方法,因为它需要的步骤最少。只需输入以下命令即可启用仓库: + +``` +sudo dnf install https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm +``` + +你会被要求输入密码。然后你会被要求验证是否要安装这些仓库。你同意后,仓库安装就会完成。 + +要安装 Steam,只需输入以下命令: + +``` +sudo dnf install steam +``` + +![Install Steam via command line][5] + +输入密码后按 `Y` 接受。安装完毕后,打开 Steam,玩一些游戏。 + +#### 方法 2:通过 GUI 安装 Steam + +你可以从软件中心 [启用 Fedora 上的第三方仓库][6]。打开软件中心并点击菜单。 + +![][7] + +在 “软件仓库” 窗口中,你会看到顶部有一个 “第三方软件仓库”。点击 “安装” 按钮。当提示你输入密码时,就完成了。 + +![][8] + +安装了 Steam 的 RPM Fusion 仓库后,更新你系统的软件缓存(如果需要),并在软件中心搜索 Steam。 + +![Steam in GNOME Software Center][9] + +安装完成后,打开 GNOME 软件中心,搜索 Steam。找到 Steam 页面后,点击安装。当被问及密码时,输入你的密码就可以了。 + +安装完 Steam 后,启动应用,输入你的 Steam 帐户详情或注册它,然后享受你的游戏。 + +### 将 Steam 作为 Flatpak 使用 + +Steam 也可以作为 Flatpak 使用。Fedora 上默认安装 Flatpak。在使用该方法安装 Steam 之前,我们必须安装 Flathub 仓库。 + +![Install Flathub][10] + +首先,在浏览器中打开 [Flatpak 网站][11]。现在,点击标有 “Flathub repository file” 的蓝色按钮。浏览器会询问你是否要在 GNOME 软件中心打开该文件。点击确定。在 GNOME 软件中心打开后,点击安装按钮。系统会提示你输入密码。 + +如果你在尝试安装 Flathub 仓库时出现错误,请在终端运行以下命令: + +``` +flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo +``` + +安装好 Flathub 仓库后,你需要做的就是在 GNOME 软件中心搜索 Steam。找到后,安装它,你就可以开始玩了。 + +![Fedora Repo Select][12] + +Flathub 版本的 Steam 也有几个附加组件可以安装。其中包括一个 DOS 兼容工具和几个 [Vulkan][13] 和 Proton 工具。 + +![][14] + +我想这应该可以帮助你在 Fedora 上使用 Steam。享受你的游戏 :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-steam-fedora/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/steam-play-proton/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2017/05/Steam-Store.jpg?resize=800%2C382&ssl=1 +[3]: https://itsfoss.com/install-steam-ubuntu-linux/ +[4]: https://rpmfusion.org/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/install-steam-fedora.png?resize=800%2C588&ssl=1 +[6]: https://itsfoss.com/fedora-third-party-repos/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/software-meni.png?resize=800%2C672&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-third-party-repo-gui.png?resize=746%2C800&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gnome-store-steam.jpg?resize=800%2C434&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/flatpak-install-button.jpg?resize=800%2C434&ssl=1 +[11]: https://www.flatpak.org/setup/Fedora/ +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/fedora-repo-select.jpg?resize=800%2C434&ssl=1 +[13]: https://developer.nvidia.com/vulkan +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/steam-flatpak-addons.jpg?resize=800%2C434&ssl=1 diff --git a/published/202104/20210411 GNOME-s Very Own -GNOME OS- is Not a Linux Distro for Everyone -Review.md b/published/202104/20210411 GNOME-s Very Own -GNOME OS- is Not a Linux Distro for Everyone -Review.md new file mode 100644 index 0000000000..0e251d8829 --- /dev/null +++ b/published/202104/20210411 GNOME-s Very Own -GNOME OS- is Not a Linux Distro for Everyone -Review.md @@ -0,0 +1,135 @@ +[#]: subject: (GNOME’s Very Own “GNOME OS” is Not a Linux Distro for Everyone [Review]) +[#]: via: (https://itsfoss.com/gnome-os/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13287-1.html) + +GNOME OS:一个并不是适合所有人的 Linux 发行版 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/11/103205t34lcaa3t0a3xjjw.jpg) + +每当 GNOME 的一个重要版本到来时,总是很想尽快试用它。但是,要想第一时间进行测试,主要还是得依靠 [Fedora Rawhide][1] 开发分支。 + +然而,开发分支并不总是让人放心的,所以,用来尝试最新的 GNOME 并不是最方便的解决方案。这里,我所说的测试,并不仅仅是指用户的测试,同时也能够用于开发者对设计变更进行测试。 + +所以,最近来了个大救星 GNOME OS,让测试的过程变得轻松起来。但是,它到底是什么,怎么安装呢?让我们一起来看看吧。 + +### 什么是 GNOME OS? + +GNOME OS 并不是一个独立完整的 Linux 发行版。事实上,它根本不基于任何东西。它是一个不完整的参考系统,只是为了让 GNOME 桌面工作。它仅仅是一个可启动的虚拟机镜像,在 GNOME 进入任何发行版的仓库之前,为调试和测试功能而量身定做的。 + +在 GNOME 的博客中,有一篇提到了它: + +> GNOME OS 旨在通过提供一个用于开发、设计和用户测试的工作系统,来更好地促进 GNOME 的开发。 + +如果你好奇的话,你可以看看 GNOME 星球上的一篇 [博客文章][2] 来了解关于 GNOME OS 的更多信息。 + +### 如果它不是一个成熟的 Linux 发行版,那么它是用来干什么的? + +![][3] + +值得注意的是,每一次新的提交都可以创建一个新的 GNOME OS 镜像,所以它应该会使测试过程变得高效,并帮助你在开发周期的早期测试并发现问题。 + +不要忘了,设计者不再需要自己构建软件来测试 GNOME Shell 或任何其他核心模块。这为他们节省了时间和整个 GNOME 开发周期。 + +当然,不仅限于开发者和技术测试人员,它还可以让记者们拿到最新的和最棒的东西,来报道 GNOME 下一个版本或它是如何成型的。 + +媒体和 GNOME 团队也得到了一个很好的机会,借助于 GNOME OS,他们可以准备视频、图片两种形式的视觉资料来宣传此次发布。 + +### 如何安装 GNOME OS? + +要轻松安装 GNOME OS,你需要先安装 GNOME Boxes 应用程序。 + +#### 安装 GNOME Boxes + +Boxes 是一款简单的虚拟化软件,它不提供任何高级选项,但可以让你轻松安装操作系统镜像来快速测试。它是专门针对桌面终端用户的,所以使用起来也很方便。 + +要在任何 Linux 发行版上安装它,你可以利用 [Flathub][5] 的 [Flatpak][4] 包。如果你不知道 Flatpak,你可能需要阅读我们的《[在 Linux 中安装和使用 Flatpak][6]》指南。 + +你也可以在任何基于 Ubuntu 的发行版上直接在终端上输入以下内容进行安装: + +``` +sudo apt install gnome-boxes +``` + +一旦你安装了 Boxes,从这里安装 GNOME OS 就相当容易了。 + +#### 安装 GNOME OS + +安装好 Boxes 后,你需要启动程序。接下来,点击窗口左上角的 “+” 标志,然后点击 “操作系统下载”,如下图所示。 + +![][7] + +这个选项可以让你直接下载镜像文件,然后就可以继续安装它。 + +你所需要做的就是搜索 “GNOME”,然后你应该会找到可用的每夜构建版。这可以确保你正在尝试最新和最优秀的 GNOME 开发版本。 + +另外,你也可以前往 [GNOME OS 每夜构建网站][8] 下载系统镜像,然后在 Boxes 应用中选择 “运行系统镜像文件” 选择该 ISO,如上图截图所示,继续安装。 + +![][9] + +考虑到你没有单独下载镜像。当你点击后,应该会开始下载,并且会出现一个进度条。 + +![][10] + +完成后,如果需要,它会要求你自定义配置,让你创建虚拟机,如下图所示。 + +![][11] + +你可以根据你可用的系统资源来定制资源分配,但应该可以使用默认设置。 + +点击 “创建”,就会直接开始 GNOME OS 的安装。 + +![][12] + +选择“使用现有的版本”,然后继续。接下来,你必须选择磁盘(保持原样),然后同意擦除你所有的文件和应用程序(它不会删除本地计算机上的任何东西)。 + +![][13] + +现在,它将简单地重新格式化并安装它。然后就完成了。它会提示你重启,重启后,你会发现 GNOME OS 已经安装好了。 + +它会像其他 Linux 发行版一样简单地启动,并要求你设置一些东西,包括用户名和密码。然后,你就可以开始探索了。 + +如果你想知道它的样子,它基本上就是最新的 GNOME 桌面环境。在 GNOME 40 正式发布之前,我用 GNOME OS 做了一个 GNOME 40 的概述视频。 + +### 结束语 + +GNOME OS 绝对是对开发者、设计师和媒体有用的东西。它可以让你轻松地测试最新的 GNOME 开发版本,而无需投入大量的时间。 + +我可以很快地测试 [GNOME 40][14],就是因为这个。当然,你要记住,这并不是一个可以在物理设备上安装的完整功能的操作系统。他们有计划让它可以在物理机器上运行,但就目前而言,它只是为虚拟机量身定做的,尤其是使用 GNOME Boxes。 + +GNOME Boxes 并没有提供任何高级选项,所以设置和使用它变得相当容易。如果体验太慢的话,你可能要调整一下资源,但在我的情况下,总体来说是一个不错的体验。 + +你试过 GNOME OS 了吗?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gnome-os/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://fedoraproject.org/wiki/Releases/Rawhide +[2]: https://blogs.gnome.org/alatiera/2020/10/07/what-is-gnome-os/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/GNOME-OS-distro-review.png?resize=800%2C450&ssl=1 +[4]: https://itsfoss.com/what-is-flatpak/ +[5]: https://flathub.org/apps/details/org.gnome.Boxes +[6]: https://itsfoss.com/flatpak-guide/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-os-search.jpg?resize=800%2C729&ssl=1 +[8]: https://os.gnome.org/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-os-boxes.jpg?resize=800%2C694&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-os-download.jpg?resize=798%2C360&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-boxes-vm-setup.png?resize=800%2C301&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-nightly-install.jpg?resize=800%2C636&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/gnome-os-installation.jpg?resize=800%2C619&ssl=1 +[14]: https://news.itsfoss.com/gnome-40-release/ diff --git a/published/202104/20210412 6 open source tools and tips to securing a Linux server for beginners.md b/published/202104/20210412 6 open source tools and tips to securing a Linux server for beginners.md new file mode 100644 index 0000000000..ebc367d9ff --- /dev/null +++ b/published/202104/20210412 6 open source tools and tips to securing a Linux server for beginners.md @@ -0,0 +1,191 @@ +[#]: subject: (6 open source tools and tips to securing a Linux server for beginners) +[#]: via: (https://opensource.com/article/21/4/securing-linux-servers) +[#]: author: (Sahana Sreeram https://opensource.com/users/sahanasreeram01gmailcom) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13298-1.html) + +6 个提升 Linux 服务器安全的开源工具和技巧 +====== + +> 使用开源工具来保护你的 Linux 环境不被入侵。 + +![](https://img.linux.net.cn/data/attachment/album/202104/15/082334ltqtgg40tu7l80rd.jpg) + +如今我们的许多个人和专业数据都可以在网上获得,因此无论是专业人士还是普通互联网用户,学习安全和隐私的基本知识是非常重要的。作为一名学生,我通过学校的 CyberPatriot 活动获得了这方面的经验,在那里我有机会与行业专家交流,了解网络漏洞和建立系统安全的基本步骤。 + +本文基于我作为初学者迄今所学的知识,详细介绍了六个简单的步骤,以提高个人使用的 Linux 环境的安全性。在我的整个旅程中,我利用开源工具来加速我的学习过程,并熟悉了与提升 Linux 服务器安全有关的更高层次的概念。 + +我使用我最熟悉的 Ubuntu 18.04 版本测试了这些步骤,但这些步骤也适用于其他 Linux 发行版。 + +### 1、运行更新 + +开发者们不断地寻找方法,通过修补已知的漏洞,使服务器更加稳定、快速、安全。定期运行更新是一个好习惯,可以最大限度地提高安全性。运行它们: + +``` +sudo apt-get update && apt-get upgrade +``` + +### 2、启用防火墙保护 + +[启用防火墙][2] 可以更容易地控制服务器上的进站和出站流量。在 Linux 上有许多防火墙应用程序可以使用,包括 [firewall-cmd][3] 和 简单防火墙Uncomplicated Firewall([UFW][4])。我使用 UFW,所以我的例子是专门针对它的,但这些原则适用于你选择的任何防火墙。 + +安装 UFW: + +``` +sudo apt-get install ufw +``` + +如果你想进一步保护你的服务器,你可以拒绝传入和传出的连接。请注意,这将切断你的服务器与世界的联系,所以一旦你封锁了所有的流量,你必须指定哪些出站连接是允许从你的系统中发出的: + +``` +sudo ufw default deny incoming +sudo ufw default allow outgoing +``` + +你也可以编写规则来允许你个人使用所需要的传入连接: + +``` +ufw allow +``` + +例如,允许 SSH 连接: + +``` +ufw allow ssh +``` + +最后,启用你的防火墙: + +``` +sudo ufw enable +``` + +### 3、加强密码保护 + +实施强有力的密码政策是保持服务器安全、防止网络攻击和数据泄露的一个重要方面。密码策略的一些最佳实践包括强制要求最小长度和指定密码年龄。我使用 libpam-cracklib 软件包来完成这些任务。 + +安装 libpam-cracklib 软件包: + +``` +sudo apt-get install libpam-cracklib +``` + +强制要求密码的长度: + + * 打开 `/etc/pam.d/common-password` 文件。 + * 将 `minlen=12` 行改为你需要的任意字符数,从而改变所有密码的最小字符长度要求。 + +为防止密码重复使用: + + * 在同一个文件(`/etc/pam.d/common-password`)中,添加 `remember=x` 行。 + * 例如,如果你想防止用户重复使用他们最后 5 个密码中的一个,使用 `remember=5`。 + +要强制要求密码年龄: + + * 在 `/etc/login.defs` 文件中找到以下几行,并用你喜欢的时间(天数)替换。例如: + +``` +PASS_MIN_AGE: 3 +PASS_MAX_AGE: 90 +PASS_WARN_AGE: 14 +``` + +强制要求字符规格: + + * 在密码中强制要求字符规格的四个参数是 `lcredit`(小写)、`ucredit`(大写)、`dcredit`(数字)和 `ocredit`(其他字符)。 + * 在同一个文件(`/etc/pam.d/common-password`)中,找到包含 `pam_cracklib.so` 的行。 + * 在该行末尾添加以下内容:`lcredit=-a ucredit=-b dcredit=-c ocredit=-d`。 + * 例如,下面这行要求密码必须至少包含一个每种字符。你可以根据你喜欢的密码安全级别来改变数字。`lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1`。 + +### 4、停用容易被利用的非必要服务。 + +停用不必要的服务是一种最好的做法。这样可以减少开放的端口,以便被利用。 + +安装 systemd 软件包: + +``` +sudo apt-get install systemd +``` + +查看哪些服务正在运行: + +``` +systemctl list-units +``` + +[识别][5] 哪些服务可能会导致你的系统出现潜在的漏洞。对于每个服务可以: + + * 停止当前正在运行的服务:`systemctl stop `。 + * 禁止服务在系统启动时启动:`systemctl disable `。 + * 运行这些命令后,检查服务的状态:`systemctl status `。 + +### 5、检查监听端口 + +开放的端口可能会带来安全风险,所以检查服务器上的监听端口很重要。我使用 [netstat][6] 命令来显示所有的网络连接: + +``` +netstat -tulpn +``` + +查看 “address” 列,确定 [端口号][7]。一旦你找到了开放的端口,检查它们是否都是必要的。如果不是,[调整你正在运行的服务][8],或者调整你的防火墙设置。 + +### 6、扫描恶意软件 + +杀毒扫描软件可以有用的防止病毒进入你的系统。使用它们是一种简单的方法,可以让你的服务器免受恶意软件的侵害。我首选的工具是开源软件 [ClamAV][9]。 + +安装 ClamAV: + +``` +sudo apt-get install clamav +``` + +更新病毒签名: + +``` +sudo freshclam +``` + +扫描所有文件,并打印出被感染的文件,发现一个就会响铃: + +``` +sudo clamscan -r --bell -i / +``` + +你可以而且应该设置为自动扫描,这样你就不必记住或花时间手动进行扫描。对于这样简单的自动化,你可以使用 [systemd 定时器][10] 或者你的 [喜欢的 cron][11] 来做到。 + +### 保证你的服务器安全 + +我们不能把保护服务器安全的责任只交给一个人或一个组织。随着威胁环境的不断迅速扩大,我们每个人都应该意识到服务器安全的重要性,并采用一些简单、有效的安全最佳实践。 + +这些只是你提升 Linux 服务器的安全可以采取的众多步骤中的一部分。当然,预防只是解决方案的一部分。这些策略应该与严格监控拒绝服务攻击、用 [Lynis][12] 做系统分析以及创建频繁的备份相结合。 + +你使用哪些开源工具来保证服务器的安全?在评论中告诉我们它们的情况。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/securing-linux-servers + +作者:[Sahana Sreeram][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/sahanasreeram01gmailcom +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_linux11x_cc.png?itok=XMDOouJR (People work on a computer server with devices) +[2]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd +[3]: https://opensource.com/article/20/2/firewall-cheat-sheet +[4]: https://wiki.ubuntu.com/UncomplicatedFirewall +[5]: http://www.yorku.ca/infosec/Administrators/UNIX_disable.html +[6]: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/netstat +[7]: https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers +[8]: https://opensource.com/article/20/5/systemd-units +[9]: https://www.clamav.net/ +[10]: https://opensource.com/article/20/7/systemd-timers +[11]: https://opensource.com/article/21/2/linux-automation +[12]: https://opensource.com/article/20/5/linux-security-lynis diff --git a/published/202104/20210412 Encrypt your files with this open source software.md b/published/202104/20210412 Encrypt your files with this open source software.md new file mode 100644 index 0000000000..bf2e9d9fd2 --- /dev/null +++ b/published/202104/20210412 Encrypt your files with this open source software.md @@ -0,0 +1,87 @@ +[#]: subject: (Encrypt your files with this open source software) +[#]: via: (https://opensource.com/article/21/4/open-source-encryption) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13304-1.html) + +用开源的 VeraCrypt 加密你的文件 +====== + +> VeraCrypt 提供跨平台的开源文件加密功能。 + +![](https://img.linux.net.cn/data/attachment/album/202104/17/110244p1g4tbpnw00tqwq3.jpg) + +许多年前,有一个名为 [TrueCrypt][2] 的加密软件。它的源码是可以得到的,尽管没有任何人声称曾对它进行过审计或贡献过。它的作者是(至今仍是)匿名的。不过,它是跨平台的,易于使用,而且真的非常有用。 + +TrueCrypt 允许你创建一个加密的文件“保险库”,在那里你可以存储任何类型的敏感信息(文本、音频、视频、图像、PDF 等)。只要你有正确的口令,TrueCrypt 就可以解密保险库,并在任何运行 TrueCrypt 的电脑上提供读写权限。这是一项有用的技术,它基本上提供了一个虚拟的、可移动的、完全加密的驱动器(除了文件以外),你可以在其中安全地存储你的数据。 + +TrueCrypt 最终关闭了,但一个名为 VeraCrypt 的替代项目迅速兴起,填补了这一空白。[VeraCrypt][3] 基于 TrueCrypt 7.1a,比原来的版本有许多改进(包括标准加密卷和引导卷的算法的重大变化)。在 VeraCrypt 1.12 及以后的版本中,你可以使用自定义迭代来提高加密安全性。更好的是,VeraCrypt 可以加载旧的 TrueCrypt 卷,所以如果你是 TrueCrypt 用户,可以很容易地将它们转移到 VeraCrypt 上。 + +### 安装 VeraCrypt + +你可以从 [VeraCrypt 下载页面][4] 下载相应的安装文件,之后在所有主流平台上安装 VeraCrypt。 + +另外,你也可以自己从源码构建它。在 Linux 上,它需要 wxGTK3、makeself 和通常的开发栈(Binutils、GCC 等)。 + +当你安装后,从你的应用菜单中启动 VeraCrypt。 + +### 创建一个 VeraCrypt 卷 + +如果你刚接触 VeraCrypt,你必须先创建一个 VeraCrypt 加密卷(否则,你没有任何东西可以解密)。在 VeraCrypt 窗口中,点击左侧的 “Create Volume” 按钮。 + +![Creating a volume with VeraCrypt][5] + +在出现的 VeraCrypt 的卷创建向导窗口中,选择要创建一个加密文件容器还是要加密整个驱动器或分区。向导将为你的数据创建一个保险库,所以请按照提示进行操作。 + +在本文中,我创建了一个文件容器。VeraCrypt 容器和其他文件很像:它保存在硬盘、外置硬盘、云存储或其他任何你能想到的存储数据的地方。与其他文件一样,它可以被移动、复制和删除。与大多数其他文件不同的是,它可以_容纳_更多的文件,这就是为什么我认为它是一个“保险库”,而 VeraCrypt 开发者将其称为“容器”。它的开发者将 VeraCrypt 文件称为“容器”,是因为它可以包含其他数据对象;它与 LXC、Kubernetes 和其他现代 IT 机制所流行的容器技术无关。 + +#### 选择一个文件系统 + +在创建卷的过程中,你会被要求选择一个文件系统来决定你放在保险库中的文件的存储方式。微软 FAT 格式是过时的、非日志型,并且限制了卷和文件的大小,但它是所有平台都能读写的一种格式。如果你打算让你的 VeraCrypt 保险库跨平台,FAT 是你最好的选择。 + +除此之外,NTFS 适用于 Windows 和 Linux。开源的 EXT 系列适用于 Linux。 + +### 挂载 VeraCrypt 加密卷 + +当你创建了 VeraCrypt 卷,你就可以在 VeraCrypt 窗口中加载它。要挂载一个加密库,点击右侧的 “Select File” 按钮。选择你的加密文件,选择 VeraCrypt 窗口上半部分的一个编号栏,然后点击位于 VeraCrypt 窗口左下角的 “Mount” 按钮。 + +你挂载的卷在 VeraCrypt 窗口的可用卷列表中,你可以通过文件管理器访问该卷,就像访问一个外部驱动器一样。例如,在 KDE 上,我打开 [Dolphin][7],进入 `/media/veracrypt1`,然后我就可以把文件复制到我的保险库里。 + +只要你的设备上有 VeraCrypt,你就可以随时访问你的保险库。在你手动在 VeraCrypt 中挂载之前,文件都是加密的,在那里,文件会保持解密,直到你再次关闭卷。 + +### 关闭 VeraCrypt 卷 + +为了保证你的数据安全,当你不需要打开 VeraCrypt 卷时,关闭它是很重要的。这样可以保证数据的安全,不被人窥视,且不被人趁机犯罪。 + +![Mounting a VeraCrypt volume][8] + +关闭 VeraCrypt 容器和打开容器一样简单。在 VeraCrypt 窗口中选择列出的卷,然后点击 “Dismount”。你就不能访问保险库中的文件了,其他人也不会再有访问权。 + +### VeraCrypt 轻松实现跨平台加密 + +有很多方法可以保证你的数据安全,VeraCrypt 试图为你提供方便,而无论你需要在什么平台上使用这些数据。如果你想体验简单、开源的文件加密,请尝试 VeraCrypt。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/open-source-encryption + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-password.jpg?itok=KJMdkKum (Lock) +[2]: https://en.wikipedia.org/wiki/TrueCrypt +[3]: https://www.veracrypt.fr/en/Home.html +[4]: https://www.veracrypt.fr/en/Downloads.html +[5]: https://opensource.com/sites/default/files/uploads/veracrypt-create.jpg (Creating a volume with VeraCrypt) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://en.wikipedia.org/wiki/Dolphin_%28file_manager%29 +[8]: https://opensource.com/sites/default/files/uploads/veracrypt-volume.jpg (Mounting a VeraCrypt volume) diff --git a/published/202104/20210413 Create an encrypted file vault on Linux.md b/published/202104/20210413 Create an encrypted file vault on Linux.md new file mode 100644 index 0000000000..94dde76530 --- /dev/null +++ b/published/202104/20210413 Create an encrypted file vault on Linux.md @@ -0,0 +1,113 @@ +[#]: subject: (Create an encrypted file vault on Linux) +[#]: via: (https://opensource.com/article/21/4/linux-encryption) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13296-1.html) + +在 Linux 上创建一个加密文件保险库 +====== + +> 使用 Linux 统一密钥设置(LUKS)为物理驱动器或云存储上的敏感文件创建一个加密保险库。 + +![](https://img.linux.net.cn/data/attachment/album/202104/14/151220l5zkkxiukgzix54k.jpg) + +最近,我演示了如何在 Linux 上使用统一密钥设置Linux Unified Key Setup([LUKS][3])和 `cryptsetup` 命令 [实现全盘加密][2]。虽然加密整个硬盘在很多情况下是有用的,但也有一些原因让你不想对整个硬盘进行加密。例如,你可能需要让一个硬盘在多个平台上工作,其中一些平台可能没有集成 [LUKS][3]。此外,现在是 21 世纪,由于云的存在,你可能不会使用物理硬盘来处理所有的数据。 + +几年前,有一个名为 [TrueCrypt][4] 的系统,允许用户创建加密的文件保险库,可以通过 TrueCrypt 解密来提供读/写访问。这是一项有用的技术,基本上提供了一个虚拟的便携式、完全加密的驱动器,你可以在那里存储重要数据。TrueCrypt 项目关闭了,但它可以作为一个有趣的模型。 + +幸运的是,LUKS 是一个灵活的系统,你可以使用它和 `cryptsetup` 在一个独立的文件中创建一个加密保险库,你可以将其保存在物理驱动器或云存储中。 + +下面就来介绍一下怎么做。 + +### 1、建立一个空文件 + +首先,你必须创建一个预定大小的空文件。就像是一种保险库或保险箱,你可以在其中存储其他文件。你使用的命令是 `util-linux` 软件包中的 `fallocate`: + +``` +$ fallocate --length 512M vaultfile.img +``` + +这个例子创建了一个 512MB 的文件,但你可以把你的文件做成任何你想要的大小。 + +### 2、创建一个 LUKS 卷 + +接下来,在空文件中创建一个 LUKS 卷: + +``` +$ cryptsetup --verify-passphrase \ + luksFormat vaultfile.img +``` + +### 3、打开 LUKS 卷 + +要想创建一个可以存储文件的文件系统,必须先打开 LUKS 卷,并将其挂载到电脑上: + +``` +$ sudo cryptsetup open \ + --type luks vaultfile.img myvault +$ ls /dev/mapper +myvault +``` + +### 4、建立一个文件系统 + +在你打开的保险库中建立一个文件系统: + +``` +$ sudo mkfs.ext4 -L myvault /dev/mapper/myvault +``` + +如果你现在不需要它做什么,你可以关闭它: + +``` +$ sudo cryptsetup close myvault +``` + +### 5、开始使用你的加密保险库 + +现在一切都设置好了,你可以在任何需要存储或访问私人数据的时候使用你的加密文件库。要访问你的保险库,必须将其挂载为一个可用的文件系统: + +``` +$ sudo cryptsetup open \ + --type luks vaultfile.img myvault +$ ls /dev/mapper +myvault +$ sudo mkdir /myvault +$ sudo mount /dev/mapper/myvault /myvault +``` + +这个例子用 `cryptsetup` 打开保险库,然后把保险库从 `/dev/mapper` 下挂载到一个叫 `/myvault` 的新目录。和 Linux 上的任何卷一样,你可以把 LUKS 卷挂载到任何你想挂载的地方,所以除了 `/myvault`,你可以用 `/mnt` 或 `~/myvault` 或任何你喜欢的位置。 + +当它被挂载后,你的 LUKS 卷就会被解密。你可以像读取和写入文件一样读取和写入它,就像它是一个物理驱动器一样。 + +当使用完你的加密保险库时,请卸载并关闭它: + +``` +$ sudo umount /myvault +$ sudo cryptsetup close myvault +``` + +### 加密的文件保险库 + +你用 LUKS 加密的镜像文件和其他文件一样,都是可移动的,因此你可以将你的保险库存储在硬盘、外置硬盘,甚至是互联网上。只要你可以使用 LUKS,就可以解密、挂载和使用它来保证你的数据安全。轻松加密,提高数据安全性,不妨一试。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-encryption + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life_bank_vault_secure_safe.png?itok=YoW93h7C (Secure safe) +[2]: https://opensource.com/article/21/3/encryption-luks +[3]: https://gitlab.com/cryptsetup/cryptsetup/blob/master/README.md +[4]: https://en.wikipedia.org/wiki/TrueCrypt diff --git a/published/202104/20210413 Create and Edit EPUB Files on Linux With Sigil.md b/published/202104/20210413 Create and Edit EPUB Files on Linux With Sigil.md new file mode 100644 index 0000000000..9a1a3e0397 --- /dev/null +++ b/published/202104/20210413 Create and Edit EPUB Files on Linux With Sigil.md @@ -0,0 +1,101 @@ +[#]: subject: (Create and Edit EPUB Files on Linux With Sigil) +[#]: via: (https://itsfoss.com/sigile-epub-editor/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13325-1.html) + +用 Sigil 在 Linux 上创建和编辑 EPUB 文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/23/184455qn6u6oozmf6gmnec.jpg) + +Sigil 是一个开源的 Linux、Windows 和 MacOS 上的 EPUB 编辑器。你可以使用 Sigil 创建一个新的 EPUB 格式的电子书,或编辑现有的 EPUB 电子书(以 `.epub` 扩展结尾的文件)。 + +如果你感到好奇,EPUB 是一个标准的电子书格式,并被几个数字出版集团认可。它被许多设备和电子阅读器支持,除了亚马逊的 Kindle。 + +### Sigil 让你创建或编辑 EPUB 文件 + +[Sigil][1] 是一个允许你编辑 EPUB 文件的开源软件。当然,你可以从头开始创建一个新的 EPUB 文件。 + +![][2] + +很多人在 [创建或编辑电子书时非常相信 Calibre][3]。它确实是一个完整的工具,它有很多的功能,支持的格式不只是 EPUB 格式。然而,Calibre 有时可能需要过多的资源。 + +Sigil 只专注于 EPUB 书籍,它有以下功能: + + * 支持 EPUB 2 和 EPUB 3(有一定的限制) + * 提供代码视图预览 + * 编辑 EPUB 语法 + * 带有多级标题的目录生成器 + * 编辑元数据 + * 拼写检查 + * 支持正则查找和替换 + * 支持导入 EPUB、HTML 文件、图像和样式表 + * 额外插件 + * 多语言支持的接口 + * 支持 Linux、Windows 和 MacOS + +Sigil 不是你可以直接输入新书章节的 [所见即所得][4] 类型的编辑器。由于 EPUB 依赖于 XML,因此它专注于代码。可以将其视为用于 EPUB 文件的 [类似于 VS Code 的代码编辑器][5]。出于这个原因,你应该使用一些其他 [开源写作工具][6],以 epub 格式导出你的文件(如果可能的话),然后在 Sigil 中编辑它。 + +![][7] + +Sigil 有一个 [Wiki][8] 来提供一些安装和使用 Sigil 的文档。 + +### 在 Linux 上安装 Sigil + +Sigil 是一款跨平台应用,支持 Windows 和 macOS 以及 Linux。它是一个流行的软件,有超过十年的历史。这就是为什么你应该会在你的 Linux 发行版仓库中找到它。只要在你的发行版的软件中心应用中寻找它就可以了。 + +![Sigil in Ubuntu Software Center][9] + +你可能需要事先启用 universe 仓库。你也可以在 Ubuntu发行版中使用 `apt` 命令: + +``` +sudo apt install sigil +``` + +Sigil 有很多对 Python 库和模块的依赖,因此它下载和安装了大量的包。 + +![][10] + +我不会列出 Fedora、SUSE、Arch 和其他发行版的命令。你可能已经知道如何使用你的发行版的软件包管理器,对吧? + +你的发行版提供的版本不一定是最新的。如果你想要 Sigil 的最新版本,你可以查看它的 GitHub 仓库。 + +- [Sigil 的 GitHub 仓库][11] + +### 并不适合所有人,当然也不适合用于阅读 ePUB 电子书 + +我不建议使用 Sigil 阅读电子书。Linux 上有 [其他专门的应用来阅读 .epub 文件][12]。 + +如果你是一个必须处理 EPUB 书籍的作家,或者如果你在数字化旧书,并在各种格式间转换,Sigil 可能是值得一试。 + +我还没有大量使用 过 Sigil,所以我不提供对它的评论。我让你去探索它,并在这里与我们分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/sigile-epub-editor/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://sigil-ebook.com/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/open-epub-sigil.png?resize=800%2C621&ssl=1 +[3]: https://itsfoss.com/create-ebook-calibre-linux/ +[4]: https://www.computerhope.com/jargon/w/wysiwyg.htm +[5]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[6]: https://itsfoss.com/open-source-tools-writers/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/sigil-epub-editor-800x621.png?resize=800%2C621&ssl=1 +[8]: https://github.com/Sigil-Ebook/Sigil/wiki +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/sigil-software-center-ubuntu.png?resize=800%2C424&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/installing-sigil-ubuntu.png?resize=800%2C547&ssl=1 +[11]: https://github.com/Sigil-Ebook/Sigil +[12]: https://itsfoss.com/open-epub-books-ubuntu-linux/ diff --git a/published/202104/20210414 Make your data boss-friendly with this open source tool.md b/published/202104/20210414 Make your data boss-friendly with this open source tool.md new file mode 100644 index 0000000000..5104978e55 --- /dev/null +++ b/published/202104/20210414 Make your data boss-friendly with this open source tool.md @@ -0,0 +1,108 @@ +[#]: subject: (Make your data boss-friendly with this open source tool) +[#]: via: (https://opensource.com/article/21/4/visualize-data-eda) +[#]: author: (Juanjo Ortilles https://opensource.com/users/jortilles) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13310-1.html) + +用这个开源工具让你的数据对老板友好起来 +====== + +> 企业数据分析旨在将数据可视化带给日常商务用户。 + +![](https://img.linux.net.cn/data/attachment/album/202104/19/092617elri0ff4r6lr06rr.jpg) + +企业数据分析Enterprise Data Analytics([EDA][2]) 是一个网页应用,它可以通过一个简单、清晰的界面来获取信息。 + +在巴塞罗那开源分析公司 [Jortilles][3] 工作几年后,我们意识到,现代世界强制性地收集数据,但普通人没有简单的方法来查看或解释这些数据。有一些强大的开源工具可用于此目的,但它们非常复杂。我们找不到一个工具设计成能让没有什么技术能力的普通人轻松使用。 + +我们之所以开发 EDA,是因为我们认为获取信息是现代组织的要求和义务,并希望为每个人提供获取信息的机会。 + +![EDA interface][4] + +### 可视化你的数据 + +EDA 使用人们已经理解的商业术语提供了一个数据模型。你可以选择你想要的信息,并可以以你想要的方式查看它。它的目标是对用户友好,同时又功能强大。 + +EDA 通过元数据模型将数据库中的信息可视化和丰富化。它可以从 BigQuery、Postgres、[MariaDB、MySQL][6] 和其他一些数据库中读取数据。这就把技术性的数据库模型转化为熟悉的商业概念。 + +它还设计为加快信息传播的速度,因为它可以利用已经存储在数据库中的数据。EDA 可以发现数据库的拓扑结构,并提出业务模型。如果你设计了一个好的数据库模型,你就有了一个好的业务模型。EDA 还可以连接到生产服务器,提供实时分析。 + +这种数据和数据模型的结合意味着你和你组织中的任何人都可以分析其数据。然而,为了保护数据,你可以定义数据安全,可以精确到行,以授予正当的人访问正当的数据。 + +EDA 的一些功能包括: + + * 自动生成数据模型 + * 一致的数据模型,防止出现不一致的查询 + * 高级用户的 SQL 模式 + * 数据可视化: + * 标准图表(如柱状图、饼状图、线状图、树状图) + * 地图整合(如 geoJSON shapefile、纬度、经度) + * 电子邮件提醒,可通过关键绩效指标 (KPI) 来定义 + * 私人和公共信息控制,以启用私人和公共仪表板,你可以通过链接分享它。 + * 数据缓存和程序刷新。 + +### 如何使用 EDA + +用 EDA 实现数据可视化的第一步是创建数据模型。 + +#### 创建数据模型 + +首先,在左侧菜单中选择 “New Datasource”。 + +接下来,选择你的数据存储的数据库系统(如 Postgres、MariaDB、MySQL、Vertica、SqlServer、Oracle、Big Query),并提供连接参数。 + +EDA 将自动为你生成数据模型。它读取表和列,并为它们定义名称以及表之间的关系。你还可以通过添加虚拟视图或 geoJSON 图来丰富你的数据模型。 + +#### 制作仪表板 + +现在你已经准备好制作第一个仪表板了。在 EDA 界面的主页面上,你应该会看到一个 “New dashboard” 按钮。点击它,命名你的仪表板,并选择你创建的数据模型。新的仪表板将出现一个面板供你配置。 + +要配置面板,请单击右上角的 “Configuration” 按钮,并选择你要做的事情。在 “Edit query” 中,选择你要显示的数据。这将出现一个新的窗口,你的数据模型由实体和实体的属性表示。选择你要查看的实体和你要使用的属性。例如,对于名为 “Customers” 的实体,你可能会显示 “Customer Name”,对于 “Sales” 实体,你可能希望显示 “Total Sales”。 + +接下来,运行一个查询,并选择你想要的可视化。 + +![EDA interface][7] + +你可以添加任意数量的面板、过滤器和文本字段,所有这些都有说明。当你保存仪表板后,你可以查看它,与同事分享,甚至发布到互联网上。 + +### 获取 EDA + +最快的方法是用 [公开演示][8] 来查看 EDA。但如果你想自己试一试,可以用 Docker 获取最新的 EDA 版本: + +``` +$ docker run -p 80:80 jortilles / eda: latest +``` + +我们还有一个 SaaS 选项,适用于任何想要使用 EDA 而无需进行安装、配置和持续更新的用户。你可以在我们的网站上查看 [云选项][9]。 + +如果你想看看它的实际运行情况,你可以在 YouTube 上观看一些 [演示][10]。 + +EDA 正在持续开发中,你可以在 GitHub 上找到它的 [源代码][11]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/visualize-data-eda + +作者:[Juanjo Ortilles][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/jortilles +[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://eda.jortilles.com/en/jortilles-english/ +[3]: https://www.jortilles.com/ +[4]: https://opensource.com/sites/default/files/uploads/eda-display.jpeg (EDA interface) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/20/10/mariadb-mysql-cheat-sheet +[7]: https://opensource.com/sites/default/files/uploads/eda-chart.jpeg (EDA interface) +[8]: https://demoeda.jortilles.com/ +[9]: https://eda.jortilles.com +[10]: https://youtu.be/cBAAJbohHXQ +[11]: https://github.com/jortilles/EDA diff --git a/published/202104/20210419 4 steps to customizing your Mac terminal theme with open source tools.md b/published/202104/20210419 4 steps to customizing your Mac terminal theme with open source tools.md new file mode 100644 index 0000000000..19237b5d7c --- /dev/null +++ b/published/202104/20210419 4 steps to customizing your Mac terminal theme with open source tools.md @@ -0,0 +1,88 @@ +[#]: subject: (4 steps to customizing your Mac terminal theme with open source tools) +[#]: via: (https://opensource.com/article/21/4/zsh-mac) +[#]: author: (Bryant Son https://opensource.com/users/brson) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13323-1.html) + +用开源工具定制 Mac 终端主题的 4 个步骤 +====== + +> 用开源工具让你的终端窗口在 Mac 上漂亮起来。 + +![](https://img.linux.net.cn/data/attachment/album/202104/22/234534t3t7ntpvdde3v892.jpg) + +你是否曾经厌倦了在你的 macOS 电脑上看到同样老式的终端窗口?如果是这样,使用开源的 Oh My Zsh 框架和 Powerlevel10k 主题为你的视图添加一些点缀。 + +这个基本的逐步教程将让你开始定制你的 macOS 终端。如果你是一个 Linux 用户,请查看 Seth Kenlon 的指南 [为 Zsh 添加主题和插件][2] 以获得深入指导。 + +### 步骤 1:安装 Oh My Zsh + +[Oh My Zsh][3] 是一个开源的、社区驱动的框架,用于管理你的 Z shell (Zsh) 配置。 + +![Oh My Zsh][4] + +Oh My Zsh 是在 MIT 许可下发布的。使用以下命令安装: + +``` +$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" +``` + +### 步骤 2:安装 Powerlevel10k 字体 + +![Powerlevel10k][6] + +Powerlevel10k 是一个 MIT 许可的 Zsh 主题。在安装 Powerlevel10k 之前,你需要为你的终端安装自定义字体。 + +到 [Powerlevel10 GitHub][7] 页面,在 `README` 中 搜索 “fonts”。安装自定义字体的步骤会根据你的操作系统而有所不同。这只需要简单地点击-下载-安装的系列操作。 + +![Powerlevel10k fonts][8] + +### 步骤 3:安装 Powerlevel10k 主题 + +接下来,运行以下命令安装 Powerlevel10k: + +``` +git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k +``` + +完成后,用文本编辑器,比如 [Vim][9],打开 `~/.zshrc` 配置文件,设置行 `ZSH_THEME="powerlevel10k/powerlevel10k`,然后保存文件。 + +### 步骤 4:完成 Powerlevel10 的设置 + +打开一个新的终端,你应该看到 Powerlevel10k 配置向导。如果没有,运行 `p10k configure` 来调出配置向导。如果你在步骤 2 中安装了自定义字体,那么图标和符号应该正确显示。将默认字体更改为 `MeslowLG NF`。 + +![Powerlevel10k configuration][10] + +当你完成配置后,你应该会看到一个漂亮的终端。 + +![Oh My Zsh/Powerlevel10k theme][11] + +就是这些了!你应该可以享受你美丽的新终端了。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/zsh-mac + +作者:[Bryant Son][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/brson +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/freedos.png?itok=aOBLy7Ky (4 different color terminal windows with code) +[2]: https://opensource.com/article/19/9/adding-plugins-zsh +[3]: https://ohmyz.sh/ +[4]: https://opensource.com/sites/default/files/uploads/1_ohmyzsh.jpg (Oh My Zsh) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/2_powerlevel10k.jpg (Powerlevel10k) +[7]: https://github.com/romkatv/powerlevel10k +[8]: https://opensource.com/sites/default/files/uploads/3_downloadfonts.jpg (Powerlevel10k fonts) +[9]: https://opensource.com/resources/what-vim +[10]: https://opensource.com/sites/default/files/uploads/4_p10kconfiguration.jpg (Powerlevel10k configuration) +[11]: https://opensource.com/sites/default/files/uploads/5_finalresult.jpg (Oh My Zsh/Powerlevel10k theme) diff --git a/published/202104/20210419 Something bugging you in Fedora Linux- Let-s get it fixed.md b/published/202104/20210419 Something bugging you in Fedora Linux- Let-s get it fixed.md new file mode 100644 index 0000000000..c379370092 --- /dev/null +++ b/published/202104/20210419 Something bugging you in Fedora Linux- Let-s get it fixed.md @@ -0,0 +1,70 @@ +[#]: subject: (Something bugging you in Fedora Linux? Let’s get it fixed!) +[#]: via: (https://fedoramagazine.org/something-bugging-you-in-fedora-linux-lets-get-it-fixed/) +[#]: author: (Matthew Miller https://fedoramagazine.org/author/mattdm/) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13333-1.html) + +Fedora Linux 中有 Bug 吗?一起来修复它! +====== + +![][1] + +软件有 bug。任何复杂系统都无法保证每个部分都能按计划工作。Fedora Linux 是一个 _非常_ 复杂的系统,包含几千个包,这些包由全球无数个独立的上游项目创建。每周还有数百个更新。因此,问题是不可避免的。本文介绍了 bug 修复过程以及如何确定 bug 优先级。 + +### 发布开发过程 + +作为一个 Linux 发行项目,我们希望为用户提供完善的、一切正常的体验。我们的发布起始于 “Rawhide”。我们在 Rawhide 中集成了所有更新的自由及开源软件的新版本。我们一直在不断改进正在进行的测试和持续集成Continuous Integration过程,为了让即使是 Rawhide 也能被冒险者安全使用。可是,从本质来讲,Rawhide 始终有点粗糙。 + +每年两次,我们把这个粗糙的操作系统先后分支到测试版本、最终版本。当我们这么做时,我们齐心协力地寻找问题。我们在测试日Test Days检查特定的区域和功能。制作“候选版本Candidate builds”,并根据我们的 [发布验证测试计划][2] 进行检测。然后我们进入冻结状态freeze state,只有批准的更改可以并入候选版本。这就把候选版本从持续的开发隔离开来,持续的开发不断并入 Rawhide 中。所以,不会引入新的问题。 + +在发布过程中许多 bug 被粉碎去除,这些 bug 有大有小。当一切按计划进行时,我们为所有用户提供了按计划发布的崭新的 Fedora Linux 版本。(在过去几年里,我们已经可靠地重复这一动作——感谢每一个为之努力工作的人!)如果确实有问题,我们可以将其标记为发布阻碍release blocker。这就意味着我们要等到修复后才能发布。发布阻碍通常代表重大问题,该表达一定会引发对 bug 的关注。 + +有时,我们遇到的一些问题是持续存在的。可能一些问题已经持续了一两个版本,或者我们还没有达成共识的解决方案。有些问题确实困扰着许多用户,但个别问题并没有达到阻碍发布的程度。我们可以将这些东西标记为阻碍blocker。但这会像锤子一样砸下来。阻碍可能导致最终粉碎该 bug,但也可能导致破坏了周围。如果进度落后,所有其它的 bug 修复、改进以及人们一直在努力的功能,都不能到达用户手中。 + +### 按优先顺序排列 bug 流程 + +所以,我们有另一种方法来解决烦人的 bug。[按优先顺序排列 bug 流程][3],与其他方式不同,可以标出导致大量用户不满意的问题。这里没有锤子,更像是聚光灯。与发布阻碍不同,按优先顺序排列 bug 流程没有一套严格定义的标准。每个 bug 都是根据影响范围和严重性来评估的。 + +一个由感兴趣的贡献者组成的团队帮助策划一个简短列表,上面罗列着需要注意的问题。然后,我们的工作是将问题匹配到能够解决它们的人。这有助于减轻发布过程中的压力,因为它没有给问题指定任何特定的截止时间。理想情况下,我们能在进入测试阶段之前就发现并解决问题。我们尽量保持列表简短,不会超过几个,这样才会真正有重点。这种做法有助于团队和个人解决问题,因为他们知道我们尊重他们捉襟见肘的时间与精力。 + +通过这个过程,Fedora 解决了几十个严重而恼人的问题,包括从键盘输入故障到 SELinux 错误,再到数千兆字节大小的旧包更新会逐渐填满你的磁盘。但是我们可以做得更多——我们实际上收到的提案没有达到我们的处理能力上限。因此,如果你知道有什么事情导致了长期挫折或影响了很多人,至今没有达成解决方案,请遵循 [按优先顺序排列 bug 流程][3],提交给我们。 + +### 你可以帮助我们 + +邀请所有 Fedora 贡献者参与按优化顺序排列 bug 的流程。评估会议每两周在 IRC 上举办一次。欢迎任何人加入并帮助我们评估提名的 bug。会议时间和地点参见 [日历][4]。Fedora 项目经理在会议开始的前一天将议程发送到 [triage][5] 和 [devel][6] 邮件列表。 + +### 欢迎报告 bug + +当你发现 bug 时,无论大小,我们很感激你能报告 bug。在很多情况下,解决 bug 最好的方式是交给创建该软件的项目。例如,假设渲染数据相机照片的 Darktable 摄影软件出了问题,最好把它带给 Darktable 摄影软件的开发人员。再举个例子,假设 GNOME 或 KDE 桌面环境或组成部分软件出了问题,将这些问题交给这些项目中通常会得到最好的结果。 + +然而, 如果这是一个特定的 Fedora 问题,比如我们的软件构建或配置或者它的集成方式的问题,请毫不犹豫地 [向我们提交 bug][7]。当你知道有一个问题是我们还没有解决的,也要提交给我们。 + +我知道这很复杂……最好有一个一站式的地方来处理所有 bug。但是请记住,Fedora 打包者大部分是志愿者,他们负责获取上游软件并将其配置到我们系统中。他们并不总是对他们正在使用的软件的代码有深入研究的专家。有疑问的时候,你可以随时提交一个 [Fedora bug][7]。Fedora 中负责相应软件包的人可以通过他们与上游软件项目的联系提供帮助。 + +请记住,当你发现一个已通过诊断但尚未得到良好修复的 bug 时,当你看到影响很多人的问题时,或者当有一个长期存在的问题没有得到关注时,请将其提名为高优先级 bug。我们会看以看能做些什么。 + +_附言:标题中的著名图片当然是来自哈佛大学马克 2 号计算机的日志,这里曾是格蕾丝·赫柏少将工作的地方。但是与这个故事的普遍看法相背,这并不是 “bug” 一词第一次用于表示系统问题——它在工程中已经很常见了,这就是为什么发现一个字面上的 “bug” 作为问题的原因是很有趣的。 #nowyouknow #jokeexplainer_ + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/something-bugging-you-in-fedora-linux-lets-get-it-fixed/ + +作者:[Matthew Miller][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/mattdm/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/bugging_you-816x345.jpg +[2]: https://fedoraproject.org/wiki/QA:Release_validation_test_plan +[3]: https://docs.fedoraproject.org/en-US/program_management/prioritized_bugs/ +[4]: https://calendar.fedoraproject.org/base/ +[5]: https://lists.fedoraproject.org/archives/list/triage%40lists.fedoraproject.org/ +[6]: https://lists.fedoraproject.org/archives/list/devel%40lists.fedoraproject.org/ +[7]: https://docs.fedoraproject.org/en-US/quick-docs/howto-file-a-bug/ diff --git a/published/202104/20210420 Blanket- Ambient Noise App With Variety of Sounds to Stay Focused.md b/published/202104/20210420 Blanket- Ambient Noise App With Variety of Sounds to Stay Focused.md new file mode 100644 index 0000000000..5c9c76d025 --- /dev/null +++ b/published/202104/20210420 Blanket- Ambient Noise App With Variety of Sounds to Stay Focused.md @@ -0,0 +1,80 @@ +[#]: subject: (Blanket: Ambient Noise App With Variety of Sounds to Stay Focused) +[#]: via: (https://itsfoss.com/blanket-ambient-noise-app/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13343-1.html) + +Blanket:拥有各种环境噪音的应用,帮助保持注意力集中 +====== + +> 一个开源的环境噪音播放器,提供各种声音,帮助你集中注意力或入睡。 + +![](https://img.linux.net.cn/data/attachment/album/202104/29/094813oxcitipetajxjiex.jpg) + +随着你周围活动的增加,要保持冷静和专注往往是很困难的。 + +有时,音乐会有所帮助,但在某些情况下也会分散注意力。但是,环境噪音如何?这总是让人听起来很舒心。谁不想在餐厅里听到鸟叫声、雨滴声和人群的交谈声?好吧,可能不是最后一个,但听自然的声音可以帮助放松和集中注意力。这间接地提高了你的工作效率。 + +最近,我发现了一个专门的播放器,其中包含了不同的声音,可以帮助任何人集中注意力。 + +### 使用 Blanket 播放不同的环境声音 + +Blanket 是一个令人印象深刻的环境噪音播放器,它具有不同的声音,可以帮助你入睡或只是通过帮助你忘记周围的干扰来重获注意力。 + +它包括自然界的声音,像雨声、海浪声、鸟鸣声、风暴声、风声、水流声、夏夜声。 + +![][1] + +此外,如果你是一个通勤者或在轻微繁忙的环境中感到舒适的人,你可以找到火车、船、城市、咖啡馆或壁炉的声音。 + +如果你喜欢白噪声或粉红噪声,它结合了人类能听到的所有声音频率,这里也可以找到。 + +它还可以让你在每次开机时自动启动,如果你喜欢这样的话。 + +![][2] + +### 在 Linux 上安装 Blanket + +安装 Blanket 的最好方法是来自 [Flathub][3]。考虑到你已经启用了 [Flatpak][4],你只需在终端键入以下命令就可以安装它: + +``` +flatpak install flathub com.rafaelmardojai.Blanket +``` + +如果你是 Flatpak 的新手,你可能想通过我们的 [Flatpak 指南][5]了解。 + +如果你不喜欢使用 Flatpak,你可以使用该项目中的贡献者维护的 PPA 来安装它。对于 Arch Linux 用户,你可以在 [AUR][6] 中找到它,以方便安装。 + +此外,你还可以找到 Fedora 和 openSUSE 的软件包。要探索所有现成的软件包,你可以前往其 [GitHub 页面][7]。 + +### 结束语 + +对于一个简单的环境噪音播放器来说,用户体验是相当好的。我有一副 HyperX Alpha S 耳机,我必须要说,声音的质量很好。 + +换句话说,它听起来很舒缓,如果你想体验环境声音来集中注意力,摆脱焦虑或只是睡着,我建议你试试。 + +你试过它了吗?欢迎在下面分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/blanket-ambient-noise-app/ + +作者:[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/2021/04/blanket-screenshot.png?resize=614%2C726&ssl=1 +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/blanket-autostart-1.png?resize=514%2C214&ssl=1 +[3]: https://flathub.org/apps/details/com.rafaelmardojai.Blanket +[4]: https://itsfoss.com/what-is-flatpak/ +[5]: https://itsfoss.com/flatpak-guide/ +[6]: https://itsfoss.com/aur-arch-linux/ +[7]: https://github.com/rafaelmardojai/blanket diff --git a/published/202104/20210420 The Guided Installer in Arch is a Step in the Right Direction.md b/published/202104/20210420 The Guided Installer in Arch is a Step in the Right Direction.md new file mode 100644 index 0000000000..3a6cc82345 --- /dev/null +++ b/published/202104/20210420 The Guided Installer in Arch is a Step in the Right Direction.md @@ -0,0 +1,78 @@ +[#]: subject: (The Guided Installer in Arch is a Step in the Right Direction) +[#]: via: (https://news.itsfoss.com/arch-new-guided-installer/) +[#]: author: (Jacob Crume https://news.itsfoss.com/author/jacob/) +[#]: collector: (lujun9972) +[#]: translator: (Kevin3599) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13328-1.html) + +Arch Linux 中的引导式安装程序是迈向正确的一步 +====== + +> 在 Arch ISO 中加入一个可选的引导式安装程序,对新手和高级用户都有好处。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/arch-linux-opinion.png?w=1200&ssl=1) + +20 年来,Arch Linux 为用户提供了一个完全定制、独特的系统。这些年来,它以牺牲用户友好性为代价,赢得了在定制方面独有的声誉。 + +作为滚动发行版本,Arch Linux 不提供任何固定发行版本,而是每月更新一次。但是,如果你在最近几周下载了 Arch Linux,那么你很可能已经注意到了一个新的附加功能:archinstall。它使 Arch Linux 更加易于安装。 + +![][3] + +今天,我将探讨 archinstall 的发布对未来的 Arch Linux 项目和发行版意味着什么。 + +### Arch Linux 新的发展方向? + +![][4] + +尽管很多人对此感到惊讶,但默认情况下包含官方安装程序实际上是非常明智的举动。这意味着 Arch Linux 的发展方向发生变化,即在保留使其知名的定制性同时更加侧重用户的易用性。 + +在该安装程序的 GitHub 页面上有这样的描述: + +> “引导性安装程序会给用户提供一个友好的逐步安装方式,但是关键在于这个安装程序是个选项,它是可选的,绝不会强迫用户使用其进行安装。” + +这意味着新的安装程序不会影响高级用户,同时也使得其可以向更广泛的受众开放,在这一改动所带来的许多优点之中,一个显著的优点即是:更广泛的用户。 + +更多的用户意味着对项目的更多支持,不管其是通过网络捐赠或参与 Arch Linux 的开发,随着这些项目贡献的增加,不管是新用户还是有经验的用户的使用体验都会得到提升。 + +### 这必然要发生 + +回顾过去,我们可以看到安装介质增加了许多对新用户有所帮助的功能。这些示例包括 pacstrap(一个安装基本系统的工具)和 reflector(查找最佳 pacman 镜像的工具)。 + +另外,多年来,用户一直在追求使用脚本安装的方法,新安装程序允许了用户使用安装脚本。它能够使用 Python 编写脚本,这使得管理员的部署更加容易,成为一个非常有吸引力的选择。 + +### 更多可定制性(以某种方式?) + +尽管这看上去可能有些反直觉,但是这个安装程序实际上能够增进 Arch Linux 的可定制性。当前,Arch Linux 定制性的最大瓶颈是用户的技术水平,而这一问题能够通过 archinstall 解决。 + +有了新的安装程序,用户不需要掌握创建完美开发环境的技巧,安装程序可以帮助用户完成这些工作,这提供了广泛的自定义选项,是普通用户难以实现的。 + +### 总结 + +有了这一新功能,Arch Linux 似乎正在向着“用户友好”这一软件设计哲学靠近,新安装程序为新手和高级用户提供了广泛的好处。其中包括更广泛的定制性和更大的用户社区。 + +总而言之,这个新变动对整个 Arch Linux 社区都会产生积极的影响。 + +你对这个 Arch Linux 安装程序怎么看?是否已经尝试过它了呢? + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/arch-new-guided-installer/ + +作者:[Jacob Crume][a] +选题:[lujun9972][b] +译者:[Kevin3599](https://github.com/Kevin3599) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/rolling-release/ +[2]: https://news.itsfoss.com/arch-linux-easy-install/ +[3]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/arch-install-tool.png?resize=780%2C411&ssl=1 +[4]: https://i0.wp.com/github.com/archlinux/archinstall/raw/master/docs/logo.png?resize=371%2C371&ssl=1 +[5]: https://man.archlinux.org/man/pacstrap.8 +[6]: https://wiki.archlinux.org/index.php/Reflector + diff --git a/published/202104/20210421 How to Delete Partitions in Linux -Beginner-s Guide.md b/published/202104/20210421 How to Delete Partitions in Linux -Beginner-s Guide.md new file mode 100644 index 0000000000..e04bca1d9d --- /dev/null +++ b/published/202104/20210421 How to Delete Partitions in Linux -Beginner-s Guide.md @@ -0,0 +1,131 @@ +[#]: subject: (How to Delete Partitions in Linux [Beginner’s Guide]) +[#]: via: (https://itsfoss.com/delete-partition-linux/) +[#]: author: (Chris Patrick Carias Stas https://itsfoss.com/author/chris/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13346-1.html) + +如何在 Linux 中删除分区 +====== + +![](https://img.linux.net.cn/data/attachment/album/202104/30/095353uhtbhm2fqx44aqfo.jpg) + +管理分区是一件严肃的事情,尤其是当你不得不删除它们时。我发现自己经常这样做,特别是在使用 U 盘作为实时磁盘和 Linux 安装程序之后,因为它们创建了几个我以后不需要的分区。 + +在本教程中,我将告诉你如何使用命令行和 GUI 工具在 Linux 中删除分区。 + +> 警告! +> +> 删除了分区,就会失去你的数据。无论何时,当你在操作分区时,一定要备份你的数据。一个轻微的打字错误或手滑都可能是昂贵的。不要说我们没有警告你! + +### 使用 GParted 删除磁盘分区 (GUI 方法) + +作为一个桌面 Linux 用户,你可能会对基于 GUI 的工具感到更舒服,也许更安全。 + +有 [几个让你在 Linux 上管理分区的工具][3]。根据你的发行版,你的系统上已经安装了一个甚至多个这样的工具。 + +在本教程中,我将使用 [GParted][4]。它是一个流行的开源工具,使用起来非常简单和直观。 + +第一步是 [安装 GParted][5],如果它还没有在你的系统中。你应该能够在你的发行版的软件中心找到它。 + +![][6] + +或者,你也可以使用你的发行版的软件包管理器来安装它。在基于 Debian 和 Ubuntu 的 Linux 发行版中,你可以 [使用 apt install 命令][7]: + +``` +sudo apt install gparted +``` + +安装完毕后,让我们打开 **GParted**。由于你正在处理磁盘分区,你需要有 root 权限。它将要求进行认证,打开后,你应该看到一个类似这样的窗口: + +![][8] + +在右上角,你可以选择磁盘,在下面选择你想删除的分区。 + +接下来,从分区菜单中选择 “删除” 选项: + +![][9] + +这个过程是没有完整完成的,直到你重写分区表。这是一项安全措施,它让你在确认之前可以选择审查更改。 + +要完成它,只需点击位于工具栏中的 “应用所有操作” 按钮,然后在要求确认时点击 “应用”。 + +![][10] + +点击 “应用” 后,你会看到一个进度条和一个结果消息说所有的操作都成功了。你可以关闭该信息和主窗口,并认为你的分区已从磁盘中完全删除。 + +现在你已经知道了 GUI 的方法,让我们继续使用命令行。 + +### 使用 fdisk 命令删除分区(CLI 方法) + +几乎每个 Linux 发行版都默认带有 [fdisk][11],我们今天就来使用这个工具。你需要知道的第一件事是,你想删除的分区被分配到哪个设备上了。为此,在终端输入以下内容: + +``` +sudo fdisk --list +``` + +这将打印出我们系统中所有的驱动器和分区,以及分配的设备。你 [需要有 root 权限][12],以便让它发挥作用。 + +在本例中,我将使用一个包含两个分区的 USB 驱动器,如下图所示: + +![][13] + +系统中分配的设备是 `/sdb`,它有两个分区:`sdb1` 和 `sdb2`。现在你已经确定了哪个设备包含这些分区,你可以通过使用 `fdisk` 和设备的路径开始操作: + +``` +sudo fdisk /dev/sdb +``` + +这将在命令模式下启动 `fdisk`。你可以随时按 `m` 来查看选项列表。 + +接下来,输入 `p`,然后按回车查看分区信息,并确认你正在使用正确的设备。如果使用了错误的设备,你可以使用 `q` 命令退出 `fdisk` 并重新开始。 + +现在输入 `d` 来删除一个分区,它将立即询问分区编号,这与 “Device” 列中列出的编号相对应,在这个例子中是 1 和 2(在下面的截图中可以看到),但是可以也会根据当前的分区表而有所不同。 + +![][14] + +让我们通过输入 `2` 并按下回车来删除第二个分区。你应该看到一条信息:**“Partition 2 has been deleted”**,但实际上,它还没有被删除。`fdisk` 还需要一个步骤来重写分区表并应用这些变化。你看,这就是完全网。 + +你需要输入 `w`,然后按回车来使这些改变成为永久性的。没有再要求确认。 + +在这之后,你应该看到下面这样的反馈: + +![][15] + +现在,使用 `sudo fdisk --list /dev/sdb` 查看该设备的当前分区表,你可以看到第二个分区已经完全消失。你已经完成了使用终端和 `fdisk` 命令来删除你的分区。成功了! + +#### 总结 + +这样,这个关于如何使用终端和 GUI 工具在 Linux 中删除分区的教程就结束了。记住,要始终保持安全,在操作分区之前备份你的文件,并仔细检查你是否使用了正确的设备。删除一个分区将删除其中的所有内容,而几乎没有 [恢复][16] 的机会。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/delete-partition-linux/ + +作者:[Chris Patrick Carias Stas][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/chris/ +[b]: https://github.com/lujun9972 +[1]: tmp.Q615QYIwTl#gparted +[2]: tmp.Q615QYIwTl#fdisk +[3]: https://itsfoss.com/partition-managers-linux/ +[4]: https://gparted.org/index.php +[5]: https://itsfoss.com/gparted/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/gparted-ubuntu-software-center.png?resize=800%2C348&ssl=1 +[7]: https://itsfoss.com/apt-command-guide/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-004.png?resize=800%2C542&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-005.png?resize=800%2C540&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-006.png?resize=800%2C543&ssl=1 +[11]: https://man7.org/linux/man-pages/man8/fdisk.8.html +[12]: https://itsfoss.com/root-user-ubuntu/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-001.png?resize=800%2C255&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-002.png?resize=800%2C362&ssl=1 +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/removing-partitions-linux-003.png?resize=800%2C153&ssl=1 +[16]: https://itsfoss.com/recover-deleted-files-linux/ diff --git a/published/202104/20210421 Optimize your Python code with C.md b/published/202104/20210421 Optimize your Python code with C.md new file mode 100644 index 0000000000..0384f49be6 --- /dev/null +++ b/published/202104/20210421 Optimize your Python code with C.md @@ -0,0 +1,196 @@ +[#]: subject: (Optimize your Python code with C) +[#]: via: (https://opensource.com/article/21/4/cython) +[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13338-1.html) + +使用 C 优化你的 Python 代码 +====== + +> Cython 创建的 C 模块可以加速 Python 代码的执行,这对使用效率不高的解释型语言编写的复杂应用是很重要的。 + +![](https://img.linux.net.cn/data/attachment/album/202104/26/230709qz64z4af3t9b9jab.jpg) + +Cython 是 Python 编程语言的编译器,旨在优化性能并形成一个扩展的 Cython 编程语言。作为 Python 的扩展,[Cython][2] 也是 Python 语言的超集,它支持调用 C 函数和在变量和类属性上声明 C 类型。这使得包装外部 C 库、将 C 嵌入现有应用程序或者为 Python 编写像 Python 一样简单的 C 语言扩展语法变得容易。 + +Cython 一般用于创建 C 模块来加速 Python 代码的执行。这在使用解释型语言编写的效率不高的复杂应用中非常重要。 + +### 安装 Cython + +你可以在 Linux、BSD、Windows 或 macOS 上安装 Cython 来使用 Python: + +``` +$ python -m pip install Cython +``` + +安装好后,就可以使用它了。 + +### 将 Python 转换成 C + +使用 Cython 的一个好的方式是从一个简单的 “hello world” 开始。这虽然不是展示 Cython 优点的最好方式,但是它展示了使用 Cython 时发生的情况。 + +首先,创建一个简单的 Python 脚本,文件命名为 `hello.pyx`(`.pyx` 扩展名并不神奇,从技术上它可以是任何东西,但它是 Cython 的默认扩展名): + +``` +print("hello world") +``` + +接下来,创建一个 Python 设置脚本。一个像 Python 的 makefile 一样的 `setup.py`,Cython 可以使用它来处理你的 Python 代码: + +``` +from setuptools import setup +from Cython.Build import cythonize + +setup( +    ext_modules = cythonize("hello.pyx") +) +``` + +最后,使用 Cython 将你的 Python 脚本转换为 C 代码: + +``` +$ python setup.py build_ext --inplace +``` + +你可以在你的工程目录中看到结果。Cython 的 `cythonize` 模块将 `hello.pyx` 转换成一个 `hello.c` 文件和一个 `.so` 库。这些 C 代码有 2648 行,所以它比一个一行的 `hello.pyx` 源码的文本要多很多。`.so` 库也比它的源码大 2000 倍(即 54000 字节和 20 字节相比)。然后,Python 需要运行单个 Python 脚本,所以有很多代码支持这个只有一行的 `hello.pyx` 文件。 + +要使用 Python 的 “hello world” 脚本的 C 代码版本,请打开一个 Python 提示符并导入你创建的新 `hello` 模块: + + +``` +>>> import hello +hello world +``` + +### 将 C 代码集成到 Python 中 + +测试计算能力的一个很好的通用测试是计算质数。质数是一个比 1 大的正数,且它只有被 1 或它自己除后才会产生正整数。虽然理论很简单,但是随着数的变大,计算需求也会增加。在纯 Python 中,可以用 10 行以内的代码完成质数的计算。 + +``` +import sys + +number = int(sys.argv[1]) +if not number <= 1: + for i in range(2, number): + if (number % i) == 0: + print("Not prime") + break +else: + print("Integer must be greater than 1") +``` + +这个脚本在成功的时候是不会提醒的,如果这个数不是质数,则返回一条信息: + +``` +$ ./prime.py 3 +$ ./prime.py 4 +Not prime. +``` + +将这些转换为 Cython 需要一些工作,一部分是为了使代码适合用作库,另一部分是为了提高性能。 + +#### 脚本和库 + +许多用户将 Python 当作一种脚本语言来学习:你告诉 Python 想让它执行的步骤,然后它来做。随着你对 Python(以及一般的开源编程)的了解越多,你可以了解到许多强大的代码都存在于其他应用程序可以利用的库中。你的代码越 _不具有针对性_,程序员(包括你)就越可能将其重用于其他的应用程序。将计算和工作流解耦可能需要更多的工作,但最终这通常是值得的。 + +在这个简单的质数计算的例子中,将其转换成 Cython,首先是一个设置脚本: + +``` +from setuptools import setup +from Cython.Build import cythonize + +setup( +    ext_modules = cythonize("prime.py") +) +``` + +将你的脚本转换成 C: + +``` +$ python setup.py build_ext --inplace +``` + +到目前为止,一切似乎都工作的很好,但是当你试图导入并使用新模块时,你会看到一个错误: + +``` +>>> import prime +Traceback (most recent call last): + File "", line 1, in + File "prime.py", line 2, in init prime + number = sys.argv[1] +IndexError: list index out of range +``` + +这个问题是 Python 脚本希望从一个终端运行,其中参数(在这个例子中是要测试是否为质数的整数)是一样的。你需要修改你的脚本,使它可以作为一个库来使用。 + +#### 写一个库 + +库不使用系统参数,而是接受其他代码的参数。对于用户输入,与其使用 `sys.argv`,不如将你的代码封装成一个函数来接收一个叫 `number`(或者 `num`,或者任何你喜欢的变量名)的参数: + +``` +def calculate(number): + if not number <= 1: + for i in range(2, number): + if (number % i) == 0: + print("Not prime") + break + else: + print("Integer must be greater than 1") +``` + +这确实使你的脚本有些难以测试,因为当你在 Python 中运行代码时,`calculate` 函数永远不会被执行。但是,Python 编程人员已经为这个问题设计了一个通用、还算直观的解决方案。当 Python 解释器执行一个 Python 脚本时,有一个叫 `__name__` 的特殊变量,这个变量被设置为 `__main__`,但是当它被作为模块导入的时候,`__name__` 被设置为模块的名字。利用这点,你可以写一个既是 Python 模块又是有效 Python 脚本的库: + +``` +import sys + +def calculate(number): + if not number <= 1: + for i in range(2, number): + if (number % i) == 0: + print("Not prime") + break + else: + print("Integer must be greater than 1") + +if __name__ == "__main__": + number = sys.argv[1] + calculate( int(number) ) +``` + +现在你可以用一个命令来运行代码了: + +``` +$ python ./prime.py 4 +Not a prime +``` + +你可以将它转换为 Cython 来用作一个模块: + +``` +>>> import prime +>>> prime.calculate(4) +Not prime +``` + +### C Python + +用 Cython 将纯 Python 的代码转换为 C 代码是有用的。这篇文章描述了如何做,然而,Cython 还有功能可以帮助你在转换之前优化你的代码,分析你的代码来找到 Cython 什么时候与 C 进行交互,以及更多。如果你正在用 Python,但是你希望用 C 代码改进你的代码,或者进一步理解库是如何提供比脚本更好的扩展性的,或者你只是好奇 Python 和 C 是如何协作的,那么就开始使用 Cython 吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/cython + +作者:[Alan Smithee][a] +选题:[lujun9972][b] +译者:[ShuyRoy](https://github.com/ShuyRoy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alansmithee +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://cython.org/ diff --git a/published/202104/20210422 Restore an old MacBook with Linux.md b/published/202104/20210422 Restore an old MacBook with Linux.md new file mode 100644 index 0000000000..6e28e972f5 --- /dev/null +++ b/published/202104/20210422 Restore an old MacBook with Linux.md @@ -0,0 +1,94 @@ +[#]: subject: (Restore an old MacBook with Linux) +[#]: via: (https://opensource.com/article/21/4/restore-macbook-linux) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13341-1.html) + +用 Linux 翻新旧的 MacBook +====== + +> 不要把你又旧又慢的 MacBook 扔进垃圾桶。用 Linux Mint 延长它的寿命。 + +![](https://img.linux.net.cn/data/attachment/album/202104/27/225241mdbp59t67699r9de.jpg) + +去年,我写了篇关于如何用 Linux 赋予[旧 MacBook 的新生命][2]的文章,在例子中提到了 Elementary OS。最近,我用回那台 2015 年左右的 MacBook Air,发现遗失了我的登录密码。我下载了最新的 Elementary OS 5.1.7 Hera,但无法让实时启动识别我的 Broadcom 4360 无线芯片组。 + +最近,我一直在使用 [Linux Mint][3] 来翻新旧的笔记本电脑,我想在这台 MacBook Air 上试一下。我下载了 Linux Mint 20.1 ISO,并在我的 Linux 台式电脑上使用 [Popsicle][4] 创建了一个 USB 启动器。 + +![Popsicle ISO burner][5] + +接下来,我将 Thunderbolt 以太网适配器连接到 MacBook,并插入 USB 启动器。我打开系统电源,按下 MacBook 上的 Option 键,指示它从 USB 驱动器启动系统。 + +Linux Mint 在实时启动模式下启动没问题,但操作系统没有识别出无线连接。 + +### 我的无线网络在哪里? + +这是因为为苹果设备制造 WiFi 卡的公司 Broadcom 没有发布开源驱动程序。这与英特尔、Atheros 和许多其他芯片制造商形成鲜明对比,但它是苹果公司使用的芯片组,所以这是 MacBook 上的一个常见问题。 + +我通过我的 Thunderbolt 适配器有线连接到以太网,因此我 _是_ 在线的。通过之前的研究,我知道要让无线适配器在这台 MacBook 上工作,我需要在 Bash 终端执行三条独立的命令。然而,在安装过程中,我了解到 Linux Mint 有一个很好的内置驱动管理器,它提供了一个简单的图形用户界面来协助安装软件。 + +![Linux Mint Driver Manager][7] + +该操作完成后,我重启了安装了 Linux Mint 20.1 的新近翻新的 MacBook Air。Broadcom 无线适配器工作正常,使我能够轻松地连接到我的无线网络。 + +### 手动安装无线 + +你可以从终端完成同样的任务。首先,清除 Broadcom 内核源码的残余。 + +``` +$ sudo apt-get purge bcmwl-kernel-source +``` + +然后添加一个固件安装程序: + +``` +$ sudo apt install firmware-b43-installer +``` + +最后,为系统安装新固件: + +``` +$ sudo apt install linux-firmware +``` + +### 将 Linux 作为你的 Mac 使用 + +我安装了 [Phoronix 测试套件][8] 以获得 MacBook Air 的系统信息。 + +![MacBook Phoronix Test Suite output][9] + +系统工作良好。对内核 5.4.0-64-generic 的最新更新显示,无线连接仍然存在,并且我与家庭网络之间的连接为 866Mbps。Broadcom 的 FaceTime 摄像头不能工作,但其他东西都能正常工作。 + +我非常喜欢这台 MacBook 上的 [Linux Mint Cinnamon 20.1][10] 桌面。 + +![Linux Mint Cinnamon][11] + +如果你有一台因 macOS 更新而变得缓慢且无法使用的旧 MacBook,我建议你试一下 Linux Mint。我对这个发行版印象非常深刻,尤其是它在我的 MacBook Air 上的工作情况。它无疑延长了这个强大的小笔记本电脑的寿命。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/restore-macbook-linux + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/write-hand_0.jpg?itok=Uw5RJD03 (Writing Hand) +[2]: https://opensource.com/article/20/2/macbook-linux-elementary +[3]: https://linuxmint.com/ +[4]: https://github.com/pop-os/popsicle +[5]: https://opensource.com/sites/default/files/uploads/popsicle.png (Popsicle ISO burner) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/mint_drivermanager.png (Linux Mint Driver Manager) +[8]: https://www.phoronix-test-suite.com/ +[9]: https://opensource.com/sites/default/files/uploads/macbook_specs.png (MacBook Phoronix Test Suite output) +[10]: https://www.linuxmint.com/edition.php?id=284 +[11]: https://opensource.com/sites/default/files/uploads/mintcinnamon.png (Linux Mint Cinnamon) diff --git a/published/20210427 Upgrade your Linux PC hardware-using open source tools.md b/published/20210427 Upgrade your Linux PC hardware-using open source tools.md new file mode 100644 index 0000000000..7ddd890346 --- /dev/null +++ b/published/20210427 Upgrade your Linux PC hardware-using open source tools.md @@ -0,0 +1,251 @@ +[#]: subject: (Upgrade your Linux PC hardware using open source tools) +[#]: via: (https://opensource.com/article/21/4/upgrade-linux-hardware) +[#]: author: (Howard Fosdick https://opensource.com/users/howtech) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13472-1.html) + +使用开源工具升级你的 Linux PC 硬件 +====== + +> 升级你的电脑硬件来提升性能,以获得最大的回报。 + +![](https://img.linux.net.cn/data/attachment/album/202106/09/204443k8dz09dddhd7xu65.jpg) + +在我的文章《[使用开源工具识别 Linux 性能瓶颈][2]》中,我解释了一些使用开源的图形用户界面(GUI)工具监测 Linux 性能的简单方法。我的重点是识别 _性能瓶颈_,即硬件资源达到极限并阻碍你的 PC 性能的情况。 + +你会如何解决性能瓶颈问题呢?你可以调整应用程序或系统软件。或者你可以运行更高效的应用程序。你甚至可以改变你使用电脑的行为,例如,将后台程序安排在非工作时间。 + +你也可以通过硬件升级来提高电脑的性能。本文重点介绍可以给你带来最大回报的升级。 + +开源工具是关键。GUI 工具可以帮助你监控你的系统,预测哪些硬件改进会有效。否则,你可能买了硬件后发现它并没有提高性能。在升级之后,这些工具也有助于验证升级是否产生了你预期的好处。 + +这篇文章概述了一种简单的 PC 硬件升级的方法,其“秘诀”是开源的 GUI 工具。 + +### 如何升级内存 + +几年前,升级内存是不用多想的。增加内存几乎总是能提高性能。 + +今天,情况不再是这样了。个人电脑配备了更多的内存,而且 Linux 能非常有效地使用它。如果你购买了系统用不完的内存,就浪费了钱。 + +因此,你要花一些时间来监测你的电脑,看看内存升级是否会有助于提升它的性能。例如,在你进行典型的一天工作时观察内存的使用情况。而且一定要检查在内存密集型工作负载中发生了什么。 + +各种各样的开源工具可以帮助你进行这种监测,不过我用的是 [GNOME 系统监视器][3]。它在大多数 Linux 软件库中都有。 + +当你启动系统监视器时,它的“资源”面板会显示这样的输出: + +![用 GNOME 系统监控器监控内存][4] + +*图 1. 用 GNOME 系统监视器监控内存 (Howard Fosdick, [CC BY-SA 4.0][5])* + +屏幕中间显示了内存的使用情况。[交换空间][6] 是 Linux 在内存不足时使用的磁盘空间。Linux 通过使用交换空间作为内存的一个较慢的扩展来有效地增加内存。 + +由于交换空间比内存慢,如果内存交换活动变得显著,增加内存将改善你的计算机的性能。你会得到多大的改善取决于交换活动的数量和交换空间所在的设备的速度。 + +如果使用了大量的交换空间,你通过增加内存会得到比只使用了少量交换空间更多的性能改善。 + +如果交换空间位于慢速的机械硬盘上,你会发现增加内存比将交换空间放在最快的固态硬盘上改善更多。 + +下面是一个关于何时增加内存的例子。这台电脑在内存利用率达到 80% 后显示交换活动在增加。当内存利用率超过 90% 时,它就变得失去反应了。 + +![系统监控 - 内存不足的情况][7] + +*图 2. 内存升级会有帮助(Howard Fosdick, [CC BY-SA 4.0][5])* + +#### 如何进行内存升级 + +在升级之前,你需要确定你有多少个内存插槽,有多少个是空的,它们需要什么样的内存条,以及你的主板所允许的最大内存。 + +你可以阅读你的计算机的文档来获得这些答案。或者,你可以直接输入这些 Linux 命令行: + +问题 | 命令 +---|--- +已安装的内存条有什么特点? | `sudo lshw -short -C memory` +这台计算机允许的最大内存是多少? | `sudo dmidecode -t memory | grep -i max` +有多少个内存插槽是空的?(没有输出意味着没有可用的) | `sudo lshw -short -C memory | grep -i empty` + +与所有的硬件升级一样,事先拔掉计算机的电源插头。在你接触硬件之前,将自己接地 —— 即使是最微小的电涌也会损坏电路。将内存条完全插入主板的插槽中。 + +升级后,启动系统监视器。运行之前使你的内存超载的相同程序。 + +系统监控器应该显示出你扩充的内存,而且你应该发现性能更好了。 + +### 如何升级存储 + +我们正处在一个存储快速改进的时代。即使是只用了几年的计算机也可以从磁盘升级中受益。但首先,你要确保升级对你的计算机和工作负载是有意义的。 + +首先,要找出你有什么磁盘。许多开源工具会告诉你。[Hardinfo][8] 或 [GNOME 磁盘][9] 是不错的选择,因为它们都是广泛可用的,而且它们的输出很容易理解。这些应用程序会告诉你磁盘的品牌、型号和其他细节。 + +接下来,通过基准测试来确定你的磁盘性能。GNOME 磁盘让这一切变得简单。只要启动该工具并点击它的“磁盘基准测试”选项。这会给出你磁盘的读写率和平均磁盘访问时间。 + +![GNOME 磁盘基准测试][10] + +*图 3. GNOME 磁盘基准输出(Howard Fosdick, [CC BY-SA 4.0][5])* + +有了这些信息,你可以在 [PassMark Software][11] 和 [UserBenchmark][12] 等基准测试网站上将你的磁盘与其他人进行比较。这些网站提供性能统计、速度排名,甚至价格和性能数字。你可以了解到你的磁盘与可能的替代品相比的情况。 + +下面是你可以在 UserBenchmark 找到的一些详细磁盘信息的例子。 + +![UserBenchmark 的磁盘比较][13] + +*图 4. 在 [UserBenchmark][14] 进行的磁盘比较* + +#### 监测磁盘利用率 + +就像你对内存所做的那样,实时监控你的磁盘,看看更换磁盘是否会提高性能。[atop 命令行][15] 会告诉你一个磁盘的繁忙程度。 + +在它下面的输出中,你可以看到设备 `sdb` 是 `busy 101%`。其中一个处理器有 85% 的时间在等待该磁盘进行工作(`cpu001 w 85%`)。 + +![atop 命令显示磁盘利用率][16] + +*图 5. atop 命令显示磁盘利用率(Howard Fosdick, [CC BY-SA 4.0][5])* + +很明显,你可以用一个更快的磁盘来提高性能。 + +你也会想知道是哪个程序使用了磁盘。只要启动系统监视器并点击其“进程”标签。 + +现在你知道了你的磁盘有多忙,以及哪些程序在使用它,所以你可以做出一个有根据的判断,是否值得花钱买一个更快的磁盘。 + +#### 购买磁盘 + +购买新的内置磁盘时,你会遇到三种主流技术: + + * 机械硬盘(HDD) + * SATA 接口的固态硬盘(SSD) + * PCIe 接口的 NVMe 固态磁盘(NVMe SSD) + +它们的速度差异是什么?你会在网上看到各种不同的数字。这里有一个典型的例子。 + +![相对磁盘速度][17] + +*图 6. 内部磁盘技术的相对速度([Unihost][18])* + + * **红色柱形图:** 机械硬盘提供最便宜的大容量存储。但就性能而言,它们是迄今为止最慢的。 + * **绿色柱形图:** 固态硬盘比机械硬盘快。但如果固态硬盘使用 SATA 接口,就会限制其性能。这是因为 SATA 接口是十多年前为机械硬盘设计的。 + * **蓝色柱形图:** 最快的内置磁盘技术是新的 [PCIe 接口的 NVMe 固态盘][19]。这些可以比 SATA 连接的固态硬盘大约快 5 倍,比机械硬盘快 20 倍。 + +对于外置 SSD,你会发现 [最新的雷电接口和 USB 接口][20] 是最快的。 + +#### 如何安装一个内置磁盘 + +在购买任何磁盘之前,请确认你的计算机支持必要的物理接口。 + +例如,许多 NVMe 固态硬盘使用流行的新 M.2(2280)外形尺寸。这需要一个量身定做的主板插槽、一个 PCIe 适配器卡,或一个外部 USB 适配器。你的选择可能会影响你的新磁盘的性能。 + +在安装新磁盘之前,一定要备份你的数据和操作系统。然后把它们复制到新磁盘上。像 Clonezilla、Mondo Rescue 或 GParted 这样的开源 [工具][21] 可以完成这项工作。或者你可以使用 Linux 命令行,如 `dd` 或 `cp`。 + +请确保在最有影响的情况下使用你的快速新磁盘。把它用作启动盘、存储操作系统和应用程序、交换空间,以及最常处理的数据。 + +升级之后,运行 GNOME 磁盘来测试你的新磁盘。这可以帮助你验证你是否得到了预期的性能提升。你可以用 `atop` 命令来验证实时运行。 + +### 如何升级 USB 端口 + +与磁盘存储一样,USB 的性能在过去几年中也有了长足的进步。许多只用了几年的计算机只需增加一个廉价的 USB 端口卡就能获得很大的性能提升。 + +这种升级是否值得,取决于你使用端口的频率。很少使用它们,如果它们很慢也没有关系。经常使用它们,升级可能真的会影响你的工作。 + +下面是不同端口标准的最大 USB 数据速率的巨大差异。  + +![USB 速度][22] + +*图 7. USB 速度差别很大(Howard Fosdick,[CC BY-SA 4.0][5],基于 [Tripplite][23] 和 [维基][24] 的数据* + +要查看你得到的实际 USB 速度,请启动 GNOME 磁盘。GNOME 磁盘可以对 USB 连接的设备进行基准测试,就像对内部磁盘一样。选择其“磁盘基准测试”选项。 + +你插入的设备和 USB 端口共同决定了你将得到的速度。如果端口和设备不匹配,你将体验到两者中较慢的速度。 + +例如,将一个支持 USB 3.1 速度的设备连接到一个 2.0 端口,你将得到 2.0 的数据速率。你的系统不会告诉你这一点,除非你用 GNOME 磁盘这样的工具来检查)。反之,将 2.0 设备连接到 3.1 端口,你也会得到 2.0 的速度。因此,为了获得最好的结果,总是要匹配你的端口和设备的速度。 + +要实时监控 USB 连接的设备,请使用 `atop` 命令和系统监控器,就像你监控内部磁盘一样。这可以帮助你看到是否碰到了当前设置的限制,并可以通过升级而受益。 + +升级你的端口很容易。只要购买一个适合你的空闲的 PCIe 插槽的 USB 卡。 + +USB 3.0 卡的价格只有 25 美元左右。较新、较贵的卡提供 USB 3.1 和 3.2 端口。几乎所有的 USB 卡都是即插即用的,所以 Linux 会自动识别它们。但在购买前一定要核实。 + +请确保在升级后运行 GNOME 磁盘以验证新的速度。 + +### 如何升级你的互联网连接 + +升级你的互联网带宽很容易。只要给你的 ISP 写一张支票即可。 + +问题是,应该升级吗? + +系统监控器显示了你的带宽使用情况(见图 1)。如果你经常遇到你从 ISP 购买的带宽限额,你会从购买更高的限额中受益。 + +但首先,要确认你是否有一个可以自己解决的问题。我见过很多案例,有人认为他们需要从 ISP 那里购买更多的带宽,而实际上他们只是有一个可以自己解决的连接问题。 + +首先在 [Speedtest][25] 或 [Fast.com][26] 等网站测试你的最大网速。为了获得准确的结果,关闭所有程序,只运行速度测试;关闭你的虚拟私有网络;在一天中的不同时间运行测试;并比较几个测试网站的结果。如果你使用 WiFi,在有 WiFi 和没有 WiFi 的情况下进行测试(将你的笔记本电脑直接与调制解调器连接)。 + +如果你有一个单独的路由器,在有它和没有它的情况下进行测试。这将告诉你路由器是否是瓶颈。有时,只是重新定位你家里的路由器或更新其固件就能提高连接速度。 + +这些测试将验证你是否得到了你从 ISP 购买的带宽速度。它们也会暴露出任何你可以自己解决的本地 WiFi 或路由器问题。 + +只有在你做了这些测试之后,你才应该得出结论,你需要购买更多的网络带宽。 + +### 你应该升级你的 CPU 还是 GPU? + +升级你的 CPU(中央处理单元)或 GPU(图形处理单元)呢? + +笔记本电脑用户通常不能升级这两个单元,因为它们被焊接在主板上。 + +大多数台式机主板支持一系列的 CPU,并且是可以升级的 —— 假设你还没有使用该系列中最顶级的处理器。 + +使用系统监视器观察你的 CPU,并确定升级是否有帮助。它的“资源”面板将显示你的 CPU 负载。如果你的所有逻辑处理器始终保持在 80% 或 90% 以上,你可以从更多的 CPU 功率中受益。 + +这是一个升级 CPU 的有趣项目。只要小心谨慎,任何人都可以做到这一点。 + +不幸的是,这几乎没有成本效益。大多数卖家对单个 CPU 芯片收取溢价,比他们卖给你的新系统要高。因此,对许多人来说,升级 CPU 并不具有经济意义。 + +如果你将显示器直接插入台式机的主板,你可能会通过升级图形处理器而受益。只需添加一块显卡。 + +诀窍是在新显卡和你的 CPU 之间实现平衡的工作负荷。这个 [在线工具][27] 能准确识别哪些显卡能与你的 CPU 最好地配合。[这篇文章][28] 详细解释了如何去升级你的图形处理。 + +### 在升级前收集数据 + +个人电脑用户有时会根据直觉来升级他们的 Linux 硬件。一个更好的方法是先监控性能并收集一些数据。开源的 GUI 工具使之变得简单。它们有助于预测硬件升级是否值得你花时间和金钱。然后,在你升级之后,你可以用它们来验证你的改变是否达到了预期效果。 + +这些是最常见的硬件升级。只要稍加努力并使用正确的开源工具,任何 Linux 用户都可以经济有效地升级一台 PC。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/upgrade-linux-hardware + +作者:[Howard Fosdick][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/howtech +[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://linux.cn/article-13462-1.html +[3]: https://vitux.com/how-to-install-and-use-task-manager-system-monitor-in-ubuntu/ +[4]: https://opensource.com/sites/default/files/uploads/system_monitor_-_resources_panel_0.jpg (Monitoring memory with GNOME System Monitor) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/18/9/swap-space-linux-systems +[7]: https://opensource.com/sites/default/files/uploads/system_monitor_-_out_of_memory_0.jpg (System Monitor - Out Of Memory Condition) +[8]: https://itsfoss.com/hardinfo/ +[9]: https://en.wikipedia.org/wiki/GNOME_Disks +[10]: https://opensource.com/sites/default/files/uploads/gnome_disks_-_benchmark_0.jpg (GNOME Disks benchmark) +[11]: https://www.harddrivebenchmark.net/ +[12]: https://www.userbenchmark.com/ +[13]: https://opensource.com/sites/default/files/uploads/userbenchmark_disk_comparisons_0.jpg (Disk comparisons at UserBenchmark) +[14]: https://ssd.userbenchmark.com/ +[15]: https://opensource.com/life/16/2/open-source-tools-system-monitoring +[16]: https://opensource.com/sites/default/files/uploads/atop_-_storage_bottleneck_0.jpg (atop command shows disk utilization) +[17]: https://opensource.com/sites/default/files/uploads/hdd_vs_ssd_vs_nvme_speeds_0.jpg (Relative disk speeds) +[18]: https://unihost.com/help/nvme-vs-ssd-vs-hdd-overview-and-comparison/ +[19]: https://www.trentonsystems.com/blog/pcie-gen4-vs-gen3-slots-speeds +[20]: https://www.howtogeek.com/449991/thunderbolt-3-vs.-usb-c-whats-the-difference/ +[21]: https://www.linuxlinks.com/diskcloning/ +[22]: https://opensource.com/sites/default/files/uploads/usb_standards_-_speeds_0.jpg (USB speeds) +[23]: https://www.tripplite.com/products/usb-connectivity-types-standards +[24]: https://en.wikipedia.org/wiki/USB +[25]: https://www.speedtest.net/ +[26]: https://fast.com/ +[27]: https://www.gpucheck.com/gpu-benchmark-comparison +[28]: https://helpdeskgeek.com/how-to/see-how-much-your-cpu-bottlenecks-your-gpu-before-you-buy-it/ diff --git a/published/202105/20200316 OpenStreetMap- A Community-Driven Google Maps Alternative.md b/published/202105/20200316 OpenStreetMap- A Community-Driven Google Maps Alternative.md new file mode 100644 index 0000000000..c2f2d0dc45 --- /dev/null +++ b/published/202105/20200316 OpenStreetMap- A Community-Driven Google Maps Alternative.md @@ -0,0 +1,91 @@ +[#]: collector: "lujun9972" +[#]: translator: "rakino" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13399-1.html" +[#]: subject: "OpenStreetMap: A Community-Driven Google Maps Alternative" +[#]: via: "https://itsfoss.com/openstreetmap/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" + +OpenStreetMap:社区驱动的谷歌地图替代品 +====== + +> 作为谷歌地图的潜在替代品,OpenStreetMap 是一个由社区驱动的地图项目,在本文中我们将了解更多关于这个开源项目的信息。 + +[OpenStreetMap][1](OSM)是一个可自由编辑的世界地图,任何人都可以对 OpenStreetMap 贡献、编辑和修改,以对其进行改进。 + +![][2] + +查看地图并不需要帐号,但如果你想要编辑或增加地图信息,就得先注册一个帐号了。 + +尽管 OpenStreetMap 以 [开放数据库许可证][3] 授权,可以自由使用,但也有所限制 —— 你不能使用地图 API 在 OpenStreetMap 之上建立另一个服务来达到商业目的。 + +因此,你可以下载地图数据来使用,以及在标示版权信息的前提下自己托管这些数据。可以在 OpenStreetMap 的官方网站上了解更多关于其 [API 使用政策][4] 和 [版权][5] 的信息。 + +在这篇文章中,我们将简单看看 OpenStreetMap 是如何工作的,以及什么样的项目使用 OpenStreetMaps 作为其地图数据的来源。 + +### OpenStreetMap:概述 + +![][6] + +OpenStreetMap 是很好的谷歌地图替代品,虽然你无法得到和谷歌地图一样的信息水平,但对于基本的导航和旅行来说,OpenStreetMap 已经足够了。 + +就像其他地图一样,你能够在地图的多个图层间切换,了解自己的位置,并轻松地查找地点。 + +你可能找不到关于附近企业、商店和餐馆的所有最新信息。但对于基本的导航来说,OpenStreetMap 已经足够了。 + +通常可以通过网页浏览器在桌面和手机上访问 [OpenStreetMap 的网站][7] 来使用 OpenStreetMap,它还没有一个官方的安卓/iOS 应用程序。 + +然而,也有各种各样的应用程序在其核心中使用了 OpenStreetMap。因此,如果你想在智能手机上使用 OpenStreetMap,你可以看看一些流行的谷歌地图开源替代: + + * [OsmAnd][8] + * [MAPS.ME][9] + +**MAPS.ME** 和 **OsmAnd** 是两个适用于安卓和 iOS 的开源应用程序,它们利用 OpenStreetMap 的数据提供丰富的用户体验,并在应用中添加了一堆有用的信息和功能。 + +如果你愿意,也可以选择其他专有选项,比如 [Magic Earth][10]。 + +无论是哪种情况,你都可以在 OpenStreetMap 的官方维基页面上看一下适用于 [安卓][11] 和 [iOS][12] 的大量应用程序列表。 + +### 在 Linux 上使用 OpenStreetMap + +![][13] + +在 Linux 上使用 OpenStreetMap 最简单的方法就是在网页浏览器中使用它。如果你使用 GNOME 桌面环境,可以安装 GNOME 地图,它是建立在 OpenStreetMap 之上的。 + +还有几个软件(大多已经过时了)在 Linux 上使用 OpenStreetMap 来达到特定目的,你可以在 OpenStreetMap 的 [官方维基列表][14] 中查看可用软件包的列表。 + +### 总结 + +对于最终用户来说,OpenStreetMap 可能不是最好的导航源,但是它的开源模式允许它被自由使用,这意味着可以用 OpenStreetMap 来构建许多服务。例如,[ÖPNVKarte][15] 使用 OpenStreetMap 在一张统一的地图上显示全世界的公共交通设施,这样你就不必再浏览各个运营商的网站了。 + +你对 OpenStreetMap 有什么看法?你能用它作为谷歌地图的替代品吗?欢迎在下面的评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/openstreetmap/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[rakino](https://github.com/rakino) +校对:[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.openstreetmap.org/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/openstreetmap.jpg?ssl=1 +[3]: https://opendatacommons.org/licenses/odbl/ +[4]: https://operations.osmfoundation.org/policies/api/ +[5]: https://www.openstreetmap.org/copyright +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/open-street-map-2.jpg?ssl=1 +[7]: https://www.openstreetmap.org +[8]: https://play.google.com/store/apps/details?id=net.osmand +[9]: https://play.google.com/store/apps/details?id=com.mapswithme.maps.pro +[10]: https://www.magicearth.com/ +[11]: https://wiki.openstreetmap.org/wiki/Android#OpenStreetMap_applications +[12]: https://wiki.openstreetmap.org/wiki/Apple_iOS +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/open-street-map-1.jpg?ssl=1 +[14]: https://wiki.openstreetmap.org/wiki/Linux +[15]: http://xn--pnvkarte-m4a.de/ \ No newline at end of file diff --git a/published/202105/20200527 Manage startup using systemd.md b/published/202105/20200527 Manage startup using systemd.md new file mode 100644 index 0000000000..e5a5d31013 --- /dev/null +++ b/published/202105/20200527 Manage startup using systemd.md @@ -0,0 +1,545 @@ +[#]: collector: (lujun9972) +[#]: translator: (tt67wq) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13402-1.html) +[#]: subject: (Manage startup using systemd) +[#]: via: (https://opensource.com/article/20/5/manage-startup-systemd) +[#]: author: (David Both https://opensource.com/users/dboth) + +使用 systemd 来管理启动项 +====== + +> 了解 systemd 是怎样决定服务启动顺序,即使它本质上是个并行系统。 + +![](https://img.linux.net.cn/data/attachment/album/202105/18/105928u3r3593k3z38ly5k.jpg) + +最近在设置 Linux 系统时,我想知道如何确保服务和其他单元的依赖关系在这些依赖于它们的服务和单元启动之前就已经启动并运行了。我需要更多 systemd 如何管理启动程序的相关知识,特别是在本质上是一个并行的系统中如何是决定服务启动顺序的。 + +你可能知道 SystemV(systemd 的前身,我在这个系列的 [第一篇文章][2] 中解释过)通过 Sxx 前缀命名启动脚本来决定启动顺序,xx 是一个 00-99 的数字。然后 SystemV 利用文件名来排序,然后按照所需的运行级别执行队列中每个启动脚本。 + +但是 systemd 使用单元文件来定义子程序,单元文件可由系统管理员创建或编辑,这些文件不仅可以用于初始化时也可以用于常规操作。在这个系列的 [第三篇文章][3] 中,我解释了如何创建一个挂载单元文件。在第五篇文章中,我解释了如何创建一种不同的单元文件 —— 在启动时执行一个程序的服务单元文件。你也可以修改单元文件中某些配置,然后通过 systemd 日志去查看你的修改在启动序列中的位置。 + +### 准备工作 + +先确认你已经在 `/etc/default/grub` 文件中的 `GRUB_CMDLINE_LINUX=` 这行移除了 `rhgb` 和 `quiet`,如同我在这个系列的 [第二篇文章][4] 中展示的那样。这让你能够查看 Linux 启动信息流,你在这篇文章中部分实验中需要用到。 + +### 程序 + +在本教程中,你会创建一个简单的程序让你能够在主控台和后续的 systemd 日志中查看启动时的信息。 + +创建一个 shell 程序 `/usr/local/bin/hello.sh` 然后添加下述内容。你要确保执行结果在启动时是可见的,可以轻松的在 systemd 日志中找到它。你会使用一版携带一些方格的 “Hello world” 程序,这样它会非常显眼。为了确保这个文件是可执行的,且为了安全起见,它需要 root 的用户和组所有权和 [700 权限][5]。 + + +``` +#!/usr/bin/bash +# Simple program to use for testing startup configurations +# with systemd. +# By David Both +# Licensed under GPL V2 +# +echo "###############################" +echo "######### Hello World! ########" +echo "###############################" +``` + +在命令行中执行这个程序来检查它能否正常运行。 + +``` +[root@testvm1 ~]# hello.sh +############################### +######### Hello World! ######## +############################### +[root@testvm1 ~]# +``` + +这个程序可以用任意脚本或编译语言实现。`hello.sh` 程序可以被放在 [Linux 文件系统层级结构][6](FHS)上的任意位置。我把它放在 `/usr/local/bin` 目录下,这样它可以直接在命令行中执行而不必在打命令的时候前面带上路径。我发现我创建的很多 shell 程序需要从命令行和其他工具(如 systemd)运行。 + +### 服务单元文件 + +创建服务单元文件 `/etc/systemd/system/hello.service`,写入下述内容。这个文件不一定是要可执行的,但是为了安全起见,它需要 root 的用户和组所有权和 [644][7] 或 [640][8] 权限。 + +``` +# Simple service unit file to use for testing +# startup configurations with systemd. +# By David Both +# Licensed under GPL V2 +# + +[Unit] +Description=My hello shell script + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/hello.sh + +[Install] +WantedBy=multi-user.target +``` + +通过查看服务状态来确认服务单元文件能如期运行。如有任何语法问题,这里会显示错误。 + +``` +[root@testvm1 ~]# systemctl status hello.service +● hello.service - My hello shell script +     Loaded: loaded (/etc/systemd/system/hello.service; disabled; vendor preset: disabled) +     Active: inactive (dead) +[root@testvm1 ~]# +``` + +你可以运行这类 “oneshot”(单发)类型的服务多次而不会有问题。此类服务适用于服务单元文件启动的程序是主进程,必须在 systemd 启动任何依赖进程之前完成的服务。 + +共有 7 种服务类型,你可以在 [systemd.service(5)][9] 的手册页上找到每一种(以及服务单元文件的其他部分)的详细解释。(你也可以在文章末尾的 [资料][10] 中找到更多信息。) + +出于好奇,我想看看错误是什么样子的。所以我从 `Type=oneshot` 这行删了字母 “o”,现在它看起来是这样 `Type=neshot`,现在再次执行命令: + +``` +[root@testvm1 ~]# systemctl status hello.service +● hello.service - My hello shell script +     Loaded: loaded (/etc/systemd/system/hello.service; disabled; vendor preset: disabled) +     Active: inactive (dead) + +May 06 08:50:09 testvm1.both.org systemd[1]: /etc/systemd/system/hello.service:12: Failed to parse service type, ignoring: neshot +[root@testvm1 ~]# +``` + +执行结果明确地告诉我错误在哪,这样解决错误变得十分容易。 + +需要注意的是即使在你将 `hello.service` 文件保存为它原来的形式之后,错误依然存在。虽然重启机器能消除这个错误,但你不必这么做,所以我去找了一个清理这类持久性错误的方法。我曾遇到有些错误需要 `systemctl daemon-reload` 命令来重置错误状态,但是在这个例子里不起作用。可以用这个命令修复的错误似乎总是有一个这样的声明,所以你知道要运行它。 + +然而,每次修改或新建一个单元文件之后执行 `systemctl daemon-reload` 确实是值得推荐的做法。它提醒 systemd 有修改发生,而且它可以防止某些与管理服务或单元相关的问题。所以继续去执行这条命令吧。 + +在修改完服务单元文件中的拼写错误后,一个简单的 `systemctl restart hello.service` 命令就可以清除错误。实验一下,通过添加一些其他的错误至 `hello.service` 文件来看看会得到怎样的结果。 + +### 启动服务 + +现在你已经准备好启动这个新服务,通过检查状态来查看结果。尽管你可能之前已经重启过,你仍然可以启动或重启这个单发服务任意次,因为它只运行一次就退出了。 + +继续启动这个服务(如下所示),然后检查状态。你的结果可能和我的有区别,取决于你做了多少试错实验。 + +``` +[root@testvm1 ~]# systemctl start hello.service +[root@testvm1 ~]# systemctl status hello.service +● hello.service - My hello shell script +     Loaded: loaded (/etc/systemd/system/hello.service; disabled; vendor preset: disabled) +     Active: inactive (dead) + +May 10 10:37:49 testvm1.both.org hello.sh[842]: ######### Hello World! ######## +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script. +[root@testvm1 ~]# +``` + +从状态检查命令的输出中我们可以看到,systemd 日志表明 `hello.sh` 启动然后服务结束了。你也可以看到脚本的输出。该输出是根据服务的最近调用的日志记录生成的,试试看多启动几次这个服务,然后再看状态命令的输出就能理解我所说的。 + +你也应该直接查看日志内容,有很多种方法可以实现。一种办法是指定记录类型标识符,在这个例子中就是 shell 脚本的名字。它会展示前几次重启和当前会话的日志记录。如你所见,我已经为这篇文章做了挺长一段时间的研究测试了。 + +``` +[root@testvm1 ~]# journalctl -t hello.sh +<剪去> +-- Reboot -- +May 08 15:55:47 testvm1.both.org hello.sh[840]: ############################### +May 08 15:55:47 testvm1.both.org hello.sh[840]: ######### Hello World! ######## +May 08 15:55:47 testvm1.both.org hello.sh[840]: ############################### +-- Reboot -- +May 08 16:01:51 testvm1.both.org hello.sh[840]: ############################### +May 08 16:01:51 testvm1.both.org hello.sh[840]: ######### Hello World! ######## +May 08 16:01:51 testvm1.both.org hello.sh[840]: ############################### +-- Reboot -- +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:37:49 testvm1.both.org hello.sh[842]: ######### Hello World! ######## +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +[root@testvm1 ~]# +``` + +为了定位 `hello.service` 单元的 systemd 记录,你可以在 systemd 中搜索。你可以使用 `G+Enter` 来翻页到日志记录 +记录的末尾,然后用回滚来找到你感兴趣的日志。使用 `-b` 选项仅展示最近启动的记录。 + +``` +[root@testvm1 ~]# journalctl -b -t systemd +<剪去> +May 10 10:37:49 testvm1.both.org systemd[1]: Starting SYSV: Late init script for live image.... +May 10 10:37:49 testvm1.both.org systemd[1]: Started SYSV: Late init script for live image.. +May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:37:50 testvm1.both.org systemd[1]: Starting D-Bus System Message Bus... +May 10 10:37:50 testvm1.both.org systemd[1]: Started D-Bus System Message Bus. +``` + +我拷贝了一些其他的日志记录,让你对你可能找到的东西有所了解。这条命令喷出了所有属于 systemd 的日志内容 —— 当我写这篇时是 109183 行。这是一个需要整理的大量数据。你可以使用页面的搜索功能,通常是 `less` 或者你可以使用内置的 `grep` 特性。`-g`( 或 `--grep=`)选项可以使用兼容 Perl 的正则表达式。 +``` +[root@testvm1 ~]# journalctl -b -t systemd -g "hello" +[root@testvm1 ~]# journalctl -b -t systemd -g "hello" +-- Logs begin at Tue 2020-05-05 18:11:49 EDT, end at Sun 2020-05-10 11:01:01 EDT. -- +May 10 10:37:49 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script. +[root@testvm1 ~]# +``` + +你可以使用标准的 GNU `grep` 命令,但是这不会展示日志首行的元数据。 + +如果你只想看包含你的 `hello` 服务的日志记录,你可以指定时间来缩小范围。举个例子,我将在我的测试虚拟机上以 `10:54:00` 为开始时间,这是上述的日志记录开始的分钟数。注意 `--since=` 的选项必须加引号,这个选项也可以写成 `-S "某个时间"`。 + +日期和时间可能在你的机器上有所不同,所以确保使用能匹配你日志中的时间的时间戳。 + +``` +[root@testvm1 ~]# journalctl --since="2020-05-10 10:54:00" +May 10 10:54:35 testvm1.both.org audit: BPF prog-id=54 op=LOAD +May 10 10:54:35 testvm1.both.org audit: BPF prog-id=55 op=LOAD +May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:54:45 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd"' +May 10 10:54:45 testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/"' +May 10 10:56:00 testvm1.both.org NetworkManager[840]: [1589122560.0633] dhcp4 (enp0s3): error -113 dispatching events +May 10 10:56:00 testvm1.both.org NetworkManager[840]:  [1589122560.0634] dhcp4 (enp0s3): state changed bound -> fail +<剪去> +``` + +`since` 选项跳过了指定时间点的所有记录,但在此时间点之后仍有大量你不需要的记录。你也可以使用 `until` 选项来裁剪掉你感兴趣的时间之后的记录。我想要事件发生时附近的一分钟,其他的都不用: + +``` +[root@testvm1 ~]# journalctl --since="2020-05-10 10:54:35" --until="2020-05-10 10:55:00" +-- Logs begin at Tue 2020-05-05 18:11:49 EDT, end at Sun 2020-05-10 11:04:59 EDT. -- +May 10 10:54:35 testvm1.both.org systemd[1]: Reloading. +May 10 10:54:35 testvm1.both.org audit: BPF prog-id=27 op=UNLOAD +May 10 10:54:35 testvm1.both.org audit: BPF prog-id=26 op=UNLOAD +<剪去> +ay 10 10:54:35 testvm1.both.org audit: BPF prog-id=55 op=LOAD +May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:54:45 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd> +May 10 10:54:45 testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/> +lines 1-46/46 (END) +``` + +如果在这个时间段中仍然有大量的活动的话,你可以使用这些选项组合来进一步缩小结果数据流: + +``` +[root@testvm1 ~]# journalctl --since="2020-05-10 10:54:35" --until="2020-05-10 10:55:00" -t "hello.sh" +-- Logs begin at Tue 2020-05-05 18:11:49 EDT, end at Sun 2020-05-10 11:10:41 EDT. -- +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ######## +May 10 10:54:45 testvm1.both.org hello.sh[1380]: ############################### +[root@testvm1 ~]# +``` + +你的结果应该与我的相似。你可以从这一系列的实验中看出,这个服务运行的很正常。 + +### 重启 —— 还是走到这一步 + +到目前为止,你还没有重启过安装了服务的机器。所以现在重启吧,因为毕竟这个教程是关于启动阶段程序运行的情况。首先,你需要在启动序列中启用这个服务。 + +``` +[root@testvm1 ~]# systemctl enable hello.service +Created symlink /etc/systemd/system/multi-user.target.wants/hello.service → /etc/systemd/system/hello.service. +[root@testvm1 ~]# +``` + +注意到这个软链接是被创建在 `/etc/systemd/system/multi-user.target.wants` 目录下的。这是因为服务单元文件指定了服务是被 `multi-user.target` 所“需要”的。 + +重启机器,确保能在启动阶段观察数据流,这样你能看到 “Hello world” 信息。等等……你看见了么?嗯,我看见了。尽管它很快被刷过去了,但是我确实看到 systemd 的信息显示它启动了 `hello.service` 服务。 + +看看上次系统启动后的日志。你可以使用页面搜索工具 `less` 来找到 “Hello” 或 “hello”。我裁剪了很多数据,但是留下了附近的日志记录,这样你就能感受到和你服务有关的日志记录在本地是什么样子的: + +``` +[root@testvm1 ~]# journalctl -b +<剪去> +May 10 10:37:49 testvm1.both.org systemd[1]: Listening on SSSD Kerberos Cache Manager responder socket. +May 10 10:37:49 testvm1.both.org systemd[1]: Reached target Sockets. +May 10 10:37:49 testvm1.both.org systemd[1]: Reached target Basic System. +May 10 10:37:49 testvm1.both.org systemd[1]: Starting Modem Manager... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting Network Manager... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting Avahi mDNS/DNS-SD Stack... +May 10 10:37:49 testvm1.both.org systemd[1]: Condition check resulted in Secure Boot DBX (blacklist) updater being skipped. +May 10 10:37:49 testvm1.both.org systemd[1]: Starting My hello shell script... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting IPv4 firewall with iptables... +May 10 10:37:49 testvm1.both.org systemd[1]: Started irqbalance daemon. +May 10 10:37:49 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=irqbalance comm="systemd" exe="/usr/lib/sy>"' +May 10 10:37:49 testvm1.both.org systemd[1]: Starting LSB: Init script for live image.... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting Hardware Monitoring Sensors... +<剪去> +May 10 10:37:49 testvm1.both.org systemd[1]: Starting NTP client/server... +May 10 10:37:49 testvm1.both.org systemd[1]: Starting SYSV: Late init script for live image.... +May 10 10:37:49 testvm1.both.org systemd[1]: Started SYSV: Late init script for live image.. +May 10 10:37:49 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=livesys-late comm="systemd" exe="/usr/lib/>"' +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:37:49 testvm1.both.org hello.sh[842]: ######### Hello World! ######## +May 10 10:37:49 testvm1.both.org hello.sh[842]: ############################### +May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded. +May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script. +May 10 10:37:49 testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd>"' +May 10 10:37:49 testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/> +May 10 10:37:50 testvm1.both.org audit: BPF prog-id=28 op=LOAD +<剪去> +``` + +你可以看到 systemd 启动了 `hello.service` 单元,它执行了 `hello.sh` 脚本并将输出记录在日志中。如果你能在启动阶段抓到它,你也应该能看见,systemd 信息表明了它正在启动这个脚本,另外一条信息表明了服务成功。通过观察上面数据流中第一条 systemd 消息,你会发现 systemd 在到达基本的系统目标后很快就启动了你的服务。 + +但是我想看见信息在启动阶段也被打印出来。有一种方法可以做到:在 `hello.service` 文件的 `[Service]` 段中加入下述行: + +``` +StandardOutput=journal+console +``` + +现在 `hello.service` 文件看起来像这样: + +``` +# Simple service unit file to use for testing +# startup configurations with systemd. +# By David Both +# Licensed under GPL V2 +# + +[Unit] +Description=My hello shell script + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/hello.sh +StandardOutput=journal+console + +[Install] +WantedBy=multi-user.target +``` + +加上这一行后,重启系统,并在启动过程中观察显示屏上滚动的数据流。你应该在它的小方框中看到信息。在启动序列完成后,你可以查看最近的启动日志,然后定位到你新服务的日志记录。 + +### 修改次序 + +现在你的服务已经可用了,你可以看看它在启动序列中哪个位置启动的,尝试下修改它。需要牢记的是 systemd 倾向于在每个主要目标(`basic.target`、`multi-user.target` 和 `graphical.**target`)中并行启动尽可能多的服务和其他的单元类型。你应该刚刚看过最近一次开机的日志记录,它应该和上面我的日志看上去类似。 + +注意,systemd 在它到达到基本系统目标(`basic.target`)后不久就启动了你的测试服务。这正是你在在服务单元文件的 `WantedBy` 行中指定的,所以它是对的。在你做出修改之前,列出 `/etc/systemd/system/multi-user.target.wants` 目录下的内容,你会看到一个指向服务单元文件的软链接。服务单元文件的 `[Install]` 段指定了哪一个目标会启动这个服务,执行 `systemctl enable hello.service` 命令会在适当的 `targets.wants` 路径下创建软链接。 + +``` +hello.service -> /etc/systemd/system/hello.service +``` + +某些服务需要在 `basic.target` 阶段启动,其他则没这个必要,除非系统正在启动 `graphical.target`。这个实验中的服务不会在 `basic.target` 期间启动 —— 假设你直到 `graphical.target` 阶段才需要它启动。那么修改 `WantedBy` 这一行: + +``` +WantedBy=graphical.target +``` + +一定要先禁用 `hello.service` 再重新启用它,这样可以删除旧链接并且在 `graphical.targets.wants` 目录下创建一个新的链接。我注意到如果我在修改服务需要的目标之前忘记禁用该服务,我可以运行 `systemctl disable` 命令,链接将从两个 `targets.wants` 目录中删除。之后我只需要重新启用这个服务然后重启电脑。 + +启动 `graphical.target` 下的服务有个需要注意的地方,如果电脑启动到 `multi-user.target` 阶段,这个服务不会自动启动。如果这个服务需要 GUI 桌面接口,这或许是你想要的,但是它同样可能不是你想要的。 + +用 `-o short-monotonic` 选项来查看 `graphical.target` 和 `multi-user.target` 的日志,展示内核启动几秒后的日志,精度为微秒级别: + +``` +[root@testvm1 ~]# journalctl -b -o short-monotonic +``` + +`multi-user.target` 的部分日志: + +``` +[   17.264730] testvm1.both.org systemd[1]: Starting My hello shell script... +[   17.265561] testvm1.both.org systemd[1]: Starting IPv4 firewall with iptables... +<剪去> +[   19.478468] testvm1.both.org systemd[1]: Starting LSB: Init script for live image.... +[   19.507359] testvm1.both.org iptables.init[844]: iptables: Applying firewall rules: [  OK  ] +[   19.507835] testvm1.both.org hello.sh[843]: ############################### +[   19.507835] testvm1.both.org hello.sh[843]: ######### Hello World! ######## +[   19.507835] testvm1.both.org hello.sh[843]: ############################### +<剪去> +[   21.482481] testvm1.both.org systemd[1]: hello.service: Succeeded. +[   21.482550] testvm1.both.org smartd[856]: Opened configuration file /etc/smartmontools/smartd.conf +[   21.482605] testvm1.both.org systemd[1]: Finished My hello shell script. +``` + +还有部分 `graphical.target` 的日志: + +``` +[   19.436815] testvm1.both.org systemd[1]: Starting My hello shell script... +[   19.437070] testvm1.both.org systemd[1]: Starting IPv4 firewall with iptables... +<剪去> +[   19.612614] testvm1.both.org hello.sh[841]: ############################### +[   19.612614] testvm1.both.org hello.sh[841]: ######### Hello World! ######## +[   19.612614] testvm1.both.org hello.sh[841]: ############################### +[   19.629455] testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' +[   19.629569] testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' +[   19.629682] testvm1.both.org systemd[1]: hello.service: Succeeded. +[   19.629782] testvm1.both.org systemd[1]: Finished My hello shell script. +``` + +尽管单元文件的 `WantedBy` 部分包含了 `graphical.target`,`hello.service` 单元在启动后大约 19.5 或 19.6 秒后运行。但是 `hello.service` 在 `multi-user.target` 中开始于 17.24 秒,在 `graphical target` 中开始于 19.43 秒。 + +这意味着什么呢?看看 `/etc/systemd/system/default.target` 这个链接。文件内容显示 systemd 先启动了默认目标 `graphical.target`,然后 `graphical.target` 触发了 `multi-user.target`。 + +``` +[root@testvm1 system]# cat default.target +#  SPDX-License-Identifier: LGPL-2.1+ +# +#  This file is part of systemd. +# +#  systemd is free software; you can redistribute it and/or modify it +#  under the terms of the GNU Lesser General Public License as published by +#  the Free Software Foundation; either version 2.1 of the License, or +#  (at your option) any later version. + +[Unit] +Description=Graphical Interface +Documentation=man:systemd.special(7) +Requires=multi-user.target +Wants=display-manager.service +Conflicts=rescue.service rescue.target +After=multi-user.target rescue.service rescue.target display-manager.service +AllowIsolate=yes +[root@testvm1 system]# +``` + +不管是用 `graphical.target` 还是 `multi-user.target` 启动服务,`hello.service` 单元都在启动后的 19.5 或 19.6 秒后启动。基于这个事实和日志结果(特别是使用单调输出的日志),你就知道这些目标是在并行启动。再看看日志中另外一件事: + + +``` +[   28.397330] testvm1.both.org systemd[1]: Reached target Multi-User System. +[   28.397431] testvm1.both.org systemd[1]: Reached target Graphical Interface. +``` + +两个目标几乎是同时完成的。这是和理论一致的,因为 `graphical.target` 触发了 `multi-user.target`,在 `multi-user.target` 到达(即完成)之前它是不会完成的。但是 `hello.service` 比这个完成的早的多。 + +这一切表明,这两个目标几乎是并行启动的。如果你查看日志,你会发现各种目标和来自这类主要目标的服务大多是平行启动的。很明显,`multi-user.target` 没有必要在 `graphical.target` 启动前完成。所以,简单的使用这些主要目标来并不能很好地排序启动序列,尽管它在保证单元只在它们被 `graphical.target` 需要时启动这方面很有用。 + +在继续之前,把 `hello.service` 单元文件回滚至 `WantedBy=multi-user.target`(如果还没做的话)。 + +### 确保一个服务在网络运行后启动 + +一个常见的启动问题是保证一个单元在网络启动运行后再启动。Freedesktop.org 的文章《[在网络启动后运行服务][11]》中提到,目前没有一个真正的关于网络何时算作“启动”的共识。然而,这篇文章提供了三个选项,满足完全可用网络需求的是 `network-online.target`。需要注意的是 `network.target` 是在关机阶段使用的而不是启动阶段,所以它对你做有序启动方面没什么帮助。 + +在做出任何改变之前,一定要检查下日志,确认 `hello.service` 单元在网络可用之前可以正确启动。你可以在日志中查找 `network-online.target` 来确认。 + +你的服务并不真的需要网络服务,但是你可以把它当作是需要网络的。 + +因为设置 `WantedBy=graphical.target` 并不能保证服务会在网络启动可用后启动,所以你需要其他的方法来做到这一点。幸运的是,有个简单的方法可以做到。将下面两行代码加入 `hello.service` 单元文件的 `[Unit]` 段: + +``` +After=network-online.target                                                                             +Wants=network-online.target +``` + +两个字段都需要才能生效。重启机器,在日志中找到服务的记录: + +``` +[   26.083121] testvm1.both.org NetworkManager[842]:  [1589227764.0293] device (enp0s3): Activation: successful, device activated. +[   26.083349] testvm1.both.org NetworkManager[842]:  [1589227764.0301] manager: NetworkManager state is now CONNECTED_GLOBAL +[   26.085818] testvm1.both.org NetworkManager[842]:  [1589227764.0331] manager: startup complete +[   26.089911] testvm1.both.org systemd[1]: Finished Network Manager Wait Online. +[   26.090254] testvm1.both.org systemd[1]: Reached target Network is Online. +[   26.090399] testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=NetworkManager-wait-online comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? termina>"' +[   26.091991] testvm1.both.org systemd[1]: Starting My hello shell script... +[   26.095864] testvm1.both.org sssd[be[implicit_files]][1007]: Starting up +[   26.290539] testvm1.both.org systemd[1]: Condition check resulted in Login and scanning of iSCSI devices being skipped. +[   26.291075] testvm1.both.org systemd[1]: Reached target Remote File Systems (Pre). +[   26.291154] testvm1.both.org systemd[1]: Reached target Remote File Systems. +[   26.292671] testvm1.both.org systemd[1]: Starting Notify NFS peers of a restart... +[   26.294897] testvm1.both.org systemd[1]: iscsi.service: Unit cannot be reloaded because it is inactive. +[   26.304682] testvm1.both.org hello.sh[1010]: ############################### +[   26.304682] testvm1.both.org hello.sh[1010]: ######### Hello World! ######## +[   26.304682] testvm1.both.org hello.sh[1010]: ############################### +[   26.306569] testvm1.both.org audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' +[   26.306669] testvm1.both.org audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=hello comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' +[   26.306772] testvm1.both.org systemd[1]: hello.service: Succeeded. +[   26.306862] testvm1.both.org systemd[1]: Finished My hello shell script. +[   26.584966] testvm1.both.org sm-notify[1011]: Version 2.4.3 starting +``` + +这样证实了 `hello.service` 单元会在 `network-online.target` 之后启动。这正是你想要的。你可能也看见了 “Hello World” 消息在启动阶段出现。还需要注意的是,在启动时记录出现的时间戳比之前要晚了大约 6 秒。 + +### 定义启动序列的最好方法 + +本文章详细地探讨了 Linux 启动时 systemd 和单元文件以及日志的细节,并且发现了当错误被引入单元文件时候会发生什么。作为系统管理员,我发现这类实验有助于我理解程序或者服务出故障时的行为,并且在安全环境中有意破坏是一种学习的好方法。 + +文章中实验结果证明,仅将服务单元添加至 `multi-user.target` 或者 `graphical.target` 并不能确定它在启动序列中的位置。它仅仅决定了一个单元是否作为图形环境一部分启动。事实上,启动目标 `multi-user.target` 和 `graphical.target` 和所有它们的 `Wants` 以及 `Required` 几乎是并行启动的。确保单元在特定位置启动的最好方法是确定它所依赖的单元,并将新单元配置成 `Want` 和 `After` 它的依赖。 + + +### 资源 + +网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息。 + +Fedora 项目有一篇切实好用的 systemd 入门,它囊括了几乎所有你需要知道的关于如何使用 systemd 配置、管理和维护 Fedora 计算机的信息。 + +Fedora 项目也有一个不错的 备忘录,交叉引用了过去 SystemV 命令和 systemd 命令做对比。 + +关于 systemd 的技术细节和创建这个项目的原因,请查看 Freedesktop.org 上的 systemd 描述。 + +Linux.com 的“更多 systemd 的乐趣”栏目提供了更多高级的 systemd 信息和技巧。 + +此外,还有一系列深度的技术文章,是由 systemd 的设计者和主要开发者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间,但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章: + + * [Rethinking PID 1][18] + * [systemd for Administrators,Part I][19] + * [systemd for Administrators,Part II][20] + * [systemd for Administrators,Part III][21] + * [systemd for Administrators,Part IV][22] + * [systemd for Administrators,Part V][23] + * [systemd for Administrators,Part VI][24] + * [systemd for Administrators,Part VII][25] + * [systemd for Administrators,Part VIII][26] + * [systemd for Administrators,Part IX][27] + * [systemd for Administrators,Part X][28] + * [systemd for Administrators,Part XI][29] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/manage-startup-systemd + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[tt67wq](https://github.com/tt67wq) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_penguin_green.png?itok=ENdVzW22 (Penguin with green background) +[2]: https://linux.cn/article-12214-1.html +[3]: https://opensource.com/article/20/5/systemd-units +[4]: https://opensource.com/article/20/5/systemd-startup +[5]: https://chmodcommand.com/chmod-700/ +[6]: https://opensource.com/life/16/10/introduction-linux-filesystems +[7]: https://chmodcommand.com/chmod-644/ +[8]: https://chmodcommand.com/chmod-640/ +[9]: http://man7.org/linux/man-pages/man5/systemd.service.5.html +[10]: tmp.bYMHU00BHs#resources +[11]: https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ +[12]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[13]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[14]: http://Freedesktop.org +[15]: http://www.freedesktop.org/wiki/Software/systemd +[16]: http://Linux.com +[17]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[18]: http://0pointer.de/blog/projects/systemd.html +[19]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[20]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[21]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[22]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[23]: http://0pointer.de/blog/projects/three-levels-of-off.html +[24]: http://0pointer.de/blog/projects/changing-roots +[25]: http://0pointer.de/blog/projects/blame-game.html +[26]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[27]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[28]: http://0pointer.de/blog/projects/instances.html +[29]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202105/20201103 Create a list in a Flutter mobile app.md b/published/202105/20201103 Create a list in a Flutter mobile app.md new file mode 100644 index 0000000000..a27893ee35 --- /dev/null +++ b/published/202105/20201103 Create a list in a Flutter mobile app.md @@ -0,0 +1,346 @@ +[#]: collector: (lujun9972) +[#]: translator: (ywxgod) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13446-1.html) +[#]: subject: (Create a list in a Flutter mobile app) +[#]: via: (https://opensource.com/article/20/11/flutter-lists-mobile-app) +[#]: author: (Vitaly Kuprenko https://opensource.com/users/kooper) + +在 Flutter 移动应用程序中创建一个列表 +====== + +> 了解如何创建 Flutter 应用的界面以及如何在它们之间进行数据传递。 + +![](https://img.linux.net.cn/data/attachment/album/202105/31/201442luk1u6vqz3h3k8jn.jpg) + +Flutter 是一个流行的开源工具包,它可用于构建跨平台的应用。在文章《[用 Flutter 创建移动应用][2]》中,我已经向大家展示了如何在 Linux 中安装 [Flutter][3] 并创建你的第一个应用。而这篇文章,我将向你展示如何在你的应用中添加一个列表,点击每一个列表项可以打开一个新的界面。这是移动应用的一种常见设计方法,你可能以前见过的,下面有一个截图,能帮助你对它有一个更直观的了解: + +![测试 Flutter 应用][4] + +Flutter 使用 [Dart][6] 语言。在下面的一些代码片段中,你会看到以斜杠开头的语句。两个斜杠(`//`)是指代码注释,用于解释某些代码片段。三个斜杠(`///`)则表示的是 Dart 的文档注释,用于解释 Dart 类和类的属性,以及其他的一些有用的信息。 + +### 查看Flutter应用的主要部分 + +Flutter 应用的典型入口点是 `main()` 函数,我们通常可以在文件 `lib/main.dart` 中找到它: + +``` +void main() { + runApp(MyApp()); +} +``` + +应用启动时,`main()` 会被调用,然后执行 `MyApp()`。 `MyApp` 是一个无状态微件(`StatelessWidget`),它包含了`MaterialApp()` 微件中所有必要的应用设置(应用的主题、要打开的初始页面等): + +``` +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { +   return MaterialApp( +     title: 'Flutter Demo', +     theme: ThemeData( +       primarySwatch: Colors.blue, +       visualDensity: VisualDensity.adaptivePlatformDensity, +     ), +     home: MyHomePage(title: 'Flutter Demo Home Page'), +   ); + } +} +``` + +生成的 `MyHomePage()` 是应用的初始页面,是一个有状态的微件,它包含包含可以传递给微件构造函数参数的变量(从上面的代码看,我们传了一个 `title` 变量给初始页面的构造函数): + +``` +class MyHomePage extends StatefulWidget { + MyHomePage({Key key, this.title}) : super(key: key); + + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} +``` + +有状态微件(`StatefulWidget`)表示这个微件可以拥有自己的状态:`_MyHomePageState`。调用 `_MyHomePageState` 中的 `setState()` 方法,可以重新构建用户界面: + +``` +class _MyHomePageState extends State { + int _counter = 0; // Number of taps on + button. + + void _incrementCounter() { // Increase number of taps and update UI by calling setState(). + setState(() { + _counter++; + }); + } + ... +} +``` + +不管是有状态的,还是无状态的微件,它们都有一个 `build()` 方法,该方法负责微件的 UI 外观。 + +``` +@override +Widget build(BuildContext context) { + return Scaffold( // Page widget. + appBar: AppBar( // Page app bar with title and back button if user can return to previous screen. + title: Text(widget.title), // Text to display page title. + ), + body: Center( // Widget to center child widget. + child: Column( // Display children widgets in column. + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( // Static text. + 'You have pushed the button this many times:', + ), + Text( // Text with our taps number. + '$_counter', // $ sign allows us to use variables inside a string. + style: Theme.of(context).textTheme.headline4,// Style of the text, “Theme.of(context)” takes our context and allows us to access our global app theme. + ), + ], + ), + ), + // Floating action button to increment _counter number. + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: Icon(Icons.add), + ), + ); +} +``` + +### 修改你的应用 + +一个好的做法是,把 `main()` 方法和其他页面的代码分开放到不同的文件中。要想将它们分开,你需要右击 `lib` 目录,然后选择 “New > Dart File” 来创建一个 .dart 文件: + +![创建一个新的 Dart 文件][10] + +将新建的文件命名为 `items_list_page`。 + +切换回到 `main.dart` 文件,将 `MyHomePage` 和 `_MyHomePageState` 中的代码,剪切并粘贴到我们新建的文件。然后将光标放到 `StatefulWidget` 上(下面红色的下划线处), 按 `Alt+Enter` 后出现下拉列表,然后选择 `package:flutter/material.dart`: + +![导入 Flutter 包][11] + +经过上面的操作我们将 `flutter/material.dart` 包添加到了 `main.dart` 文件中,这样我们就可以使用 Flutter 提供的默认的 material 主题微件。 + +然后, 在类名 `MyHomePage` 右击,“Refactor > Rename...”将其重命名为 `ItemsListPage`: + +![重命名 StatefulWidget 类][12] + +Flutter 识别到你重命名了 `StatefulWidget` 类,它会自动将它的 `State` 类也跟着重命名: + +![State 类被自动重命名][13] + +回到 `main.dart` 文件,将文件名 `MyHomePage` 改为 `ItemsListPage`。 一旦你开始输入, 你的 Flutter 集成开发环境(可能是 IntelliJ IDEA 社区版、Android Studio 和 VS Code 或 [VSCodium][14]),会给出自动代码补完的建议。 + +![IDE 建议自动补完的代码][15] + +按回车键即可完成输入,缺失的导入语句会被自动添加到文件的顶部。 + +![添加缺失的导入语句][16] + +到此,你已经完成了初始设置。现在你需要在 `lib` 目录创建一个新的 .dart 文件,命名为 `item_model`。(注意,类命是大写驼峰命名,一般的文件名是下划线分割的命名。)然后粘贴下面的代码到新的文件中: + +``` +/// Class that stores list item info: +/// [id] - unique identifier, number. +/// [icon] - icon to display in UI. +/// [title] - text title of the item. +/// [description] - text description of the item. +class ItemModel { + // class constructor + ItemModel(this.id, this.icon, this.title, this.description); + + // class fields + final int id; + final IconData icon; + final String title; + final String description; +} +``` + +回到 `items_list_page.dart` 文件,将已有的 `_ItemsListPageState` 代码替换为下面的代码: + +``` +class _ItemsListPageState extends State { + +// Hard-coded list of [ItemModel] to be displayed on our page. + final List _items = [ + ItemModel(0, Icons.account_balance, 'Balance', 'Some info'), + ItemModel(1, Icons.account_balance_wallet, 'Balance wallet', 'Some info'), + ItemModel(2, Icons.alarm, 'Alarm', 'Some info'), + ItemModel(3, Icons.my_location, 'My location', 'Some info'), + ItemModel(4, Icons.laptop, 'Laptop', 'Some info'), + ItemModel(5, Icons.backup, 'Backup', 'Some info'), + ItemModel(6, Icons.settings, 'Settings', 'Some info'), + ItemModel(7, Icons.call, 'Call', 'Some info'), + ItemModel(8, Icons.restore, 'Restore', 'Some info'), + ItemModel(9, Icons.camera_alt, 'Camera', 'Some info'), + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: ListView.builder( // Widget which creates [ItemWidget] in scrollable list. + itemCount: _items.length, // Number of widget to be created. + itemBuilder: (context, itemIndex) => // Builder function for every item with index. + ItemWidget(_items[itemIndex], () { + _onItemTap(context, itemIndex); + }), + )); + } + + // Method which uses BuildContext to push (open) new MaterialPageRoute (representation of the screen in Flutter navigation model) with ItemDetailsPage (StateFullWidget with UI for page) in builder. + _onItemTap(BuildContext context, int itemIndex) { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => ItemDetailsPage(_items[itemIndex]))); + } +} + + +// StatelessWidget with UI for our ItemModel-s in ListView. +class ItemWidget extends StatelessWidget { + const ItemWidget(this.model, this.onItemTap, {Key key}) : super(key: key); + + final ItemModel model; + final Function onItemTap; + + @override + Widget build(BuildContext context) { + return InkWell( // Enables taps for child and add ripple effect when child widget is long pressed. + onTap: onItemTap, + child: ListTile( // Useful standard widget for displaying something in ListView. + leading: Icon(model.icon), + title: Text(model.title), + ), + ); + } +} +``` + +为了提高代码的可读性,可以考虑将 `ItemWidget` 作为一个单独的文件放到 `lib` 目录中。 + +现在唯一缺少的是 `ItemDetailsPage` 类。在 `lib` 目录中我们创建一个新文件并命名为 `item_details_page`。然后将下面的代码拷贝进去: + +``` +import 'package:flutter/material.dart'; + +import 'item_model.dart'; + +/// Widget for displaying detailed info of [ItemModel] +class ItemDetailsPage extends StatefulWidget { + final ItemModel model; + + const ItemDetailsPage(this.model, {Key key}) : super(key: key); + + @override + _ItemDetailsPageState createState() => _ItemDetailsPageState(); +} + +class _ItemDetailsPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.model.title), + ), + body: Center( + child: Column( + children: [ + const SizedBox(height: 16), + Icon( + widget.model.icon, + size: 100, + ), + const SizedBox(height: 16), + Text( + 'Item description: ${widget.model.description}', + style: TextStyle(fontSize: 18), + ) + ], + ), + ), + ); + } +} +``` + +上面的代码几乎没什么新东西,不过要注意的是 `_ItemDetailsPageState` 里使用了 `widget.item.title` 这样的语句,它让我们可以从有状态类中引用到其对应的微件(`StatefulWidget`)。 + +### 添加一些动画 + +现在让我们来添加一些基础的动画: + + 1. 找到 `ItemWidget` 代码块(或者文件) + 2. 将光标放到 `build()` 方法中的 `Icon()` 微件上 + 3. 按 `Alt+Enter`,然后选择“Wrap with widget...” + +![查看微件选项][18] + +输入 `Hero`,然后从建议的下拉列表中选择 `Hero((Key key, @required this, tag, this.create))`: + +![查找 Hero 微件][19] + +下一步, 给 Hero 微件添加 `tag` 属性 `tag: model.id`: + +![在 Hero 微件上添加 tag 属性为 model.id][20] + +最后我们在 `item_details_page.dart` 文件中做相同的修改: + +![修改item_details_page.dart文件][21] + +前面的步骤,其实我们是用 `Hero()` 微件对 `Icon()` 微件进行了封装。还记得吗?前面我们定义 `ItemModel` 类时,定义了一个 `id field`,但没有在任何地方使用到。因为 Hero 微件会为其每个子微件添加一个唯一的标签。当 Hero 检测到不同页面(`MaterialPageRoute`)中存在相同标签的 Hero 时,它会自动在这些不同的页面中应用过渡动画。 + +可以在安卓模拟器或物理设备上运行我们的应用来测试这个动画。当你打开或者关闭列表项的详情页时,你会看到一个漂亮的图标动画: + +![测试 Flutter 应用][4] + +### 收尾 + +这篇教程,让你学到了: + + * 一些符合标准的,且能用于自动创建应用的组件。 + * 如何添加多个页面以及在页面间传递数据。 + * 如何给多个页面添加简单的动画。 + +如果你想了解更多,查看 Flutter 的 [文档][22](有一些视频和样例项目的链接,还有一些创建 Flutter 应用的“秘方”)与 [源码][23],源码的开源许可证是 BSD 3。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/flutter-lists-mobile-app + +作者:[Vitaly Kuprenko][a] +选题:[lujun9972][b] +译者:[ywxgod](https://github.com/ywxgod) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/kooper +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team-phone-collaboration-mobile-device.png?itok=v3EjbRK6 (Mobile devices and collaboration leads to staring at our phones) +[2]: https://linux.cn/article-12693-1.html +[3]: https://flutter.dev/ +[4]: https://opensource.com/sites/default/files/uploads/flutter_test.gif (Testing the Flutter app) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://dart.dev/ +[7]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+key +[8]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[9]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+icon +[10]: https://opensource.com/sites/default/files/uploads/flutter_new-dart-file_0.png (Create a new Dart file) +[11]: https://opensource.com/sites/default/files/uploads/flutter_import-package.png (Importing Flutter package) +[12]: https://opensource.com/sites/default/files/uploads/flutter_rename-class.png (Renaming StatefulWidget class) +[13]: https://opensource.com/sites/default/files/uploads/flutter_stateclassrenamed.png (State class renamed automatically) +[14]: https://opensource.com/article/20/6/open-source-alternatives-vs-code +[15]: https://opensource.com/sites/default/files/uploads/flutter_autocomplete.png (IDE suggests autocompleting code) +[16]: https://opensource.com/sites/default/files/uploads/flutter_import-input.png (Adding missing import ) +[17]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+listview +[18]: https://opensource.com/sites/default/files/uploads/flutter_wrapwithwidget.png (Wrap with widget option) +[19]: https://opensource.com/sites/default/files/uploads/flutter_hero.png (Finding the Hero widget) +[20]: https://opensource.com/sites/default/files/uploads/flutter_hero-tag.png (Adding the tag property model.id to the Hero widget) +[21]: https://opensource.com/sites/default/files/uploads/flutter_details-tag.png (Changing item_details_page.dart file) +[22]: https://flutter.dev/docs +[23]: https://github.com/flutter diff --git a/published/202105/20201117 Getting started with btrfs for Linux.md b/published/202105/20201117 Getting started with btrfs for Linux.md new file mode 100644 index 0000000000..a47f573e08 --- /dev/null +++ b/published/202105/20201117 Getting started with btrfs for Linux.md @@ -0,0 +1,232 @@ +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13440-1.html) +[#]: subject: (Getting started with btrfs for Linux) +[#]: via: (https://opensource.com/article/20/11/btrfs-linux) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) + +Btrfs 文件系统入门 +====== + +> B-tree 文件系统(Btrfs)融合了文件系统和卷管理器。它为 Linux 操作系统提供了高级文件系统应当拥有的诸多不错的功能特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/30/070203wkxsufbx1zlccyl9.jpg) + +好几年前 Btrfs 就已经可以在 Linux 中使用了,所以你可能已经熟悉它了。如果没有,你可能对它尚有疑虑,尤其是如果你使用的是 Fedora 工作站 (Btrfs 现在是它的默认文件系统)。本文旨在帮助你熟悉它及其高级功能,例如 [写时复制][2] 和 [校验和][3]。 + +Btrfs 是 “B-Tree Filesystem” 的缩写,实际上是文件系统和卷管理器的结合体。它通常被视为对 ZFS 的回应,ZFS 早在 2005 年就被引入 Sun 微系统的 Solaris 操作系统中,现在基本上被一个名为 OpenZFS 的开源实现所取代。Ubuntu 和 FreeBSD 常常使用 OpenZFS。其他具有类似特性的示例有红帽的 Stratis 和 Linux 逻辑卷管理器Logical Volume Manager(LVM)。 + +### 安装 + +为了尝试 Btrfs,我下载了 Fedora 33 工作站 [ISO 文件][4] 并将其安装到一个新的虚拟机(VM)中。安装过程与以前的版本没有变化。我没有自定义任何设置,包括驱动器分区和格式化,以保持本教程的准确“开箱即用”设置。当虚拟机启动并运行后,我安装并运行了 GNOME 分区编辑器([GParted][5]),以获得一个良好的、工厂级的驱动器布局视图。 + +![GParted's view of Btrfs on Fedora 33 Workstation using GParted][6] + +从安装这一点来说,与你以前所习惯的情况没什么不同;事实上,你可以正常使用该系统,甚至可能没有注意到文件系统是 Btrfs。然而,拥有这个新的默认文件系统使你能够利用几个很酷的特性。 + +### 检查 Btrfs 文件系统 + +我暂时没有找到特定于 Btrfs 的图形工具,尽管它的一些功能已经被合并到现有的磁盘管理工具中。 + +在命令行中,你可以更仔细地查看 Btrfs 格式: + +``` +# btrfs filesystem show +Label: 'fedora_localhost-live'  uuid: f2bb02f9-5c41-4c91-8eae-827a801ee58a +        Total devices 1 FS bytes used 6.36GiB +        devid    1 size 10.41GiB used 8.02GiB path /dev/vda3 +``` + +### 修改 Btrfs 标签 + +我首先注意到的是安装程序设置的文件系统标签:`fedora_localhost-live`。这是不准确的,因为它现在是一个已安装的系统,不再是 [livecd][8]。所以我使用 `btrfs filesystem label` 命令对其进行了更改。 + +修改 Btrfs 标签非常的简单: + +``` +# btrfs filesystem label / +fedora_localhost-live +# btrfs filesystem label / fedora33workstation +# btrfs filesystem label / +fedora33workstation +``` + +### 管理 Btrfs 子卷 + +子卷看起来像是可以由 Btrfs 管理的标准目录。我的新 Fedora 33 工作站上有几个子卷: + +``` +# btrfs subvolume list / +ID 256 gen 2458 top level 5 path home +ID 258 gen 2461 top level 5 path root +ID 265 gen 1593 top level 258 path var/lib/machines +``` + +使用 `btrfs subvolume Create` 命令创建新的子卷,或使用 `btrfs subvolume delete` 删除子卷: + +``` +# btrfs subvolume create /opt/foo +Create subvolume '/opt/foo' +# btrfs subvolume list / +ID 256 gen 2884 top level 5 path home +ID 258 gen 2888 top level 5 path root +ID 265 gen 1593 top level 258 path var/lib/machines +ID 276 gen 2888 top level 258 path opt/foo +# btrfs subvolume delete /opt/foo +Delete subvolume (no-commit): '/opt/foo' +``` + +子卷允许设置配额、拍摄快照以及复制到其他位置和其他主机等操作。那么系统管理员如何利用这些功能?用户主目录又是如何操作的呢? + +#### 添加用户 + +就像从前一样,添加一个新的用户帐户会创建一个主目录供该帐户使用: + +``` +# useradd student1 +# getent passwd student1 +student1:x:1006:1006::/home/student1:/bin/bash +# ls -l /home +drwx------. 1 student1 student1 80 Oct 29 00:21 student1 +``` + +传统上,用户的主目录是 `/home` 的子目录。所有权和操作权是为所有者量身定制的,但是特殊功能来没有管理它们。而企业服务器环境是另外一种情况。通常,目录是为特定的应用程序及其用户保留的。你可以利用 Btrfs 来管理和应用对这些目录的约束。 + +为了将 Btrfs 子卷作为用户主页,在 `useradd` 命令中有一个新选项:`--Btrfs-subvolume-home`。尽管手册页尚未更新(截至本文撰写之时),但你可以通过运行 `useradd --help` 来查看该选项。通过在添加新用户时传递此选项,将创建一个新的 Btrfs 子卷。它的功能与创建常规目录时的 `-d` 选项类似: + +``` +# useradd --btrfs-subvolume-home student2 +Create subvolume '/home/student2' +``` + +使用 `getent passwd student2` 验证用户,它将显示为正常。但是,运行 `btrfs subvolume` 命令列出子卷,你将看到一些有趣的内容:新用户的主目录! + +``` +# btrfs subvolume list / +ID 256 gen 2458 top level 5 path home +ID 258 gen 2461 top level 5 path root +ID 265 gen 1593 top level 258 path var/lib/machines +ID 272 gen 2459 top level 256 path home/student2 +``` + +探索企业服务器环境的第二个场景。假设你需要在 `/opt` 中安装一个 [WildFly][9] 服务器并部署一个 Java web 应用程序。通常,你的第一步是创建一个 `wildfly` 用户。使用新的 `--btrfs-subvolume-home` 选项和 `-b` 选项来指定 `/opt` 作为基本目录: + +``` +# useradd -b /opt --btrfs-subvolume-home wildfly +Create subvolume '/opt/wildfly' +``` + +于是,`wildfly` 用户可以使用了,并且主目录设置在了 `/opt/wildfly`。 + +#### 删除用户 + +删除用户时,有时需要同时删除该用户的文件和主目录。`userdel` 命令有 `-r` 选项,它可以同时删除 Btrfs 子卷: + +``` +# userdel -r student2 +Delete subvolume (commit): '/home/student2' +``` + +#### 设置磁盘使用配额 + +在我的一节计算机科学课上,一个学生运行了一个失控的 C 程序,然后写进了磁盘,将我们院的 Unix 系统上整个 `/home` 目录都填满了!在管理员终止失控进程并清除一些空间之前,服务器将无法使用。上述情况也是如此;那个 Wildfly 企业应用程序将为其用户提供越来越多的日志文件和内容存储。如何防止服务器因磁盘已满而死机?设置磁盘使用限制是个好主意。幸运的是,Btrfs 通过设置配额的方式支持这一点。 + +配置配额需要几个步骤。第一步是在 Btrfs 文件系统上启用配额: + +``` +# btrfs quota enable / +``` + +确保你知道每个子卷的配额组(qgroup)ID 号,该编号由 `btrfs subvolume list` 命令显示。每个子卷都需要基于 ID 号码来关联配额组。这可以通过 `btrfs qgroup create` 单独完成,但是,btrfs 维基提供了以下命令来加快为文件系统上的子卷创建配额组: + +``` +> btrfs subvolume list \ | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup destroy 0/{} \ +``` + +在新安装的 Fedora 33 工作站系统中,你在根文件系统路径上操作,`/`。用根路径替换 `\`: + +``` +# btrfs subvolume list / | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} / +``` + +然后运行 `btrfs quota rescan`,查看新的配额组: + +``` +# btrfs quota rescan / +quota rescan started +# btrfs qgroup show / +qgroupid         rfer         excl +--------         ----         ---- +0/5          16.00KiB     16.00KiB +0/256       272.04MiB    272.04MiB +0/258         6.08GiB      6.08GiB +0/265        16.00KiB     16.00KiB +0/271        16.00KiB     16.00KiB +0/273        16.00KiB     16.00KiB +``` + +于是现在,你可以将配额分配给其中一个配额组,然后将配额应用于其关联的子卷。因此,如果要将 `student3` 的主目录使用限制为 1 GB,请使用 `btrfs qgroup limit` 命令: + +``` +# btrfs qgroup limit 1G /home/student3 +``` + +查看特定子卷的配额: + +``` +# btrfs qgroup show -reF /home/student3 +qgroupid         rfer         excl     max_rfer     max_excl +--------         ----         ----     --------     -------- +0/271        16.00KiB     16.00KiB      1.00GiB         none +``` + +稍有不同的选项参数将显示所有配额组和设置的所有配额: + +``` +# btrfs qgroup show -re / +qgroupid         rfer         excl     max_rfer     max_excl +--------         ----         ----     --------     -------- +0/5          16.00KiB     16.00KiB         none         none +0/256       272.04MiB    272.04MiB         none         none +0/258         6.08GiB      6.08GiB         none         none +0/265        16.00KiB     16.00KiB         none         none +0/271        16.00KiB     16.00KiB      1.00GiB         none +0/273        16.00KiB     16.00KiB         none         none +``` + +### 其他特性 + +这些例子提供了 Btrfs 特性的一些思考。运行 `btrfs --help` 查看命令的完整列表。还有许多其他值得注意的功能;例如,快照和发送/接收是两个值得学习的功能。 + +### 总结讨论 + +Btrfs 为向 Linux 提供高级文件系统特性集贡献了很多特性。这不是第一次;我知道 ZFS 在大约 15 年前引入了这种类型的文件系统,但是 Btrfs 是完全开源的,不受专利的限制。 + +如果你想探索这个文件系统,我建议从虚拟机或备用系统开始。 + +我想能够出现一些图形化的管理工具,为那些喜欢用图形工具的系统管理员提供便利。幸运的是,Btrfs 具有强大的开发活动,Fedora 33 项目决定将其设置为工作站上的默认值就证明了这一点。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/btrfs-linux + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_organize_letter.png?itok=GTtiiabr (Filing cabinet for organization) +[2]: https://en.wikipedia.org/wiki/Copy-on-write +[3]: https://en.wikipedia.org/wiki/Checksum +[4]: https://getfedora.org/en/workstation/download/ +[5]: https://gparted.org/ +[6]: https://opensource.com/sites/default/files/uploads/gparted_btrfs.png (GParted's view of Btrfs on Fedora 33 Workstation using GParted) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://en.wikipedia.org/wiki/Live_CD +[9]: https://www.wildfly.org/ diff --git a/published/202105/20201123 6 predictions for JavaScript build tools.md b/published/202105/20201123 6 predictions for JavaScript build tools.md new file mode 100644 index 0000000000..fcb3f0f83e --- /dev/null +++ b/published/202105/20201123 6 predictions for JavaScript build tools.md @@ -0,0 +1,145 @@ +[#]: collector: (lujun9972) +[#]: translator: (ywxgod) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13423-1.html) +[#]: subject: (6 predictions for JavaScript build tools) +[#]: via: (https://opensource.com/article/20/11/javascript-build-tools) +[#]: author: (Shedrack Akintayo https://opensource.com/users/shedrack-akintayo) + +对 JavaScript 构建工具的 6 个预测 +====== + +> JavaScript 前端工具的生态系统充满着变数和竞争,且只有最好的工具才会存活下来。 + +![](https://img.linux.net.cn/data/attachment/album/202105/25/112116d5z1lrywl6k25mur.jpg) + +生产中使用的代码与开发中的有所不同. 在生产中,我们需要构建一些能运行得够快、能管理各种依赖关系、能自动执行任务、能加载外部模块等功能的包。而那些将开发中的代码转为生产代码的 [JavaScript][2] 工具我们就称之为 _构建工具。_ + +我们可以通过各个构建步骤以及其重要性来解释前端代码需要被“构建”的原因。 + +### 前端代码构建步骤 + +前端代码的构建涉及下面的四个步骤: + +#### 1、转译 + +通过转译Transpiling,开发者可以使用到语言最新、最热门的更新和扩展,并保持浏览器的兼容性等。下面是使用 [Babel][3] 的一个例子: + +``` +// 数组映射中的箭头函数语法 +const double = [1, 2, 3].map((num) => num * 2); +// 转译后 +const double = [1, 2, 3].map(function(num) { + return num * 2; +}); +``` + +#### 2、分包 + +分包Bundling是处理所有 `import` 与`require` 语句的过程;找到相匹配的 JavaScript 代码片段、包和库;将它们添加到适当的域中;然后将它们打包到一个大的 JavaScript 文件中。常用的分包器包括 Browserify、Webpack 与 Parcel。 + +#### 3、压缩 + +压缩Minifing是通过删除空白和代码注释来减少最终的文件大小。在压缩过程中,我们还可以更进一步添加代码混淆步骤,混淆会更改变量名和方法名,使代码变得晦涩难懂,因此一旦代码交付到客户端,它就不是那么容易能让人读懂。下面是一个使用 Grunt 的例子: + +``` +// 压缩前 +const double = [1, 2, 3].map(function(num) { +  return num * 2; +}); +// 压缩后 +const double=[1,2,3].map(function(num){return num*2;}); +``` + +#### 4、打包 + +完成上面的所有步骤之后, 我们需要将这些具有兼容性、且经过分包、压缩/混淆过的文件放置到某个地方。打包Packaging正是这样一个过程,它将上述步骤所产生的结果放置到开发者指定的某个位置上,这通常是通过打包器完成的。 + +### 前端构建工具 + +前端工具及构建工具可以分为以下几类: + + * 包管理: NPM、Yarn + * 转译器: Babel 等 + * 打包器: Webpack、Parcel、Browserify + * 压缩混淆: UglifyJS、Packer、Minify 等 + +JavaScript 生态系统中有各种各样的构建工具可以使用,包括下面的这些: + +#### Grunt 和 Bower + +[Grunt][4] 是作为命令行工具引入的,它仅提供一个脚本来指定和配置相关构建任务。[Bower][5] 作为包管理器,提供了一种客户端包的管理方法而紧追其后。这两者,再加上 NPM,它们经常在一起使用,它们看上去似乎可以满足大多数的自动化需求,但 Grunt 的问题在于它无法提供给开发者配置更复杂任务的自由,而 Bower 使开发者管理的程序包是平常的两倍,因为它将前端包、后台包分开了(例如,Bower 组件与 Node 模块)。 + +**Grunt 与 Bower 的未来:** Grunt 与 Bower 正在退出 JavaScript 工具生态,但是还有一些替代品。 + +#### Gulp 和 Browserify + +[Gulp][6] 是在 Grunt 发布一年半之后才发布的。但 Gulp 却让大家感到很自然、舒服。用 JavaScript 来写构建脚本与用 JSON 来写相比更自由。你可以在 Gulp 的构建脚本中编写函数、即时创建变量、在任何地方使用条件语句 —— 但就这些,并不能说让我们的感觉变得特别自然和舒适,只能说这只是其中的一个可能的原因。[Browserify][7] 和 Gulp 可以配合使用,Browserify 允许 NPM 包(用于后端 Node 服务器)被直接带入到前端,就这一点已经直接让 Bower 废了。而正是这种用一个包管理器来处理前后端包的方式让人感到更自然和更好。 + +**Gulp 的未来:** Gulp 可能会被改进,以便匹配当前流行的构建工具,但这完全取决于创造者的意愿。Gulp 仍在使用中,只是不再像以前那么流行了。 + +#### Webpack 和 NPM/Yarn 脚本 + +[Webpack][8] 是现代前端开发工具中最热门的宠儿,它是一个开源的 JavaScript 模块打包器。Webpack 主要是为处理 JavaScript 而创造的,但如果包含相应的加载器,它也可以转换 HTML、CSS 和图片等前端资源。通过 Webpack,你也可以像 Gulp 一样编写构建脚本,并通过 [NPM/Yarn][9] 来执行它们。 + +**Webpack 的未来:** Webpack 是目前 JavaScript 工具生态系统中最热门的工具,最近几乎所有的 JavaScript 库都在使用 React 和 Webpack。Webpack 目前处于第四个版本,不会很快消失。(LCTT 译注:Webpack 目前已经发布了第五个版本了,且还在火热更新中) + +#### Parcel + +[Parcel][10] 是一个 Web 应用打包器,于 2018 年推出,因其开发者体验而与众不同。Parcel 能利用处理器多核功能提供极快的打包性能,且还零配置。但 Parcel 还是一个新星,对于一些大型应用,其采用率并不高。相比之下,开发人员更喜欢使用 Webpack,因为 Webpack 有更广泛的支持和可定制性。 + +**Parcel 的未来:** Parcel 非常容易使用,如果你统计打包和构建时间,它会比 Webpack 更快,而且它还提供了更好的开发者体验。Parcel 没有被大量采用的原因可能是它仍然比较新。在前端构建工具的生态系统中,Parcel 的前景会非常光明,它将会存在一段时间。 + +#### Rollup + +[Rollup][11] 是 JavaScript 的一个模块分包器,它可将一小段代码编译为更大更复杂的库或应用。Rollup 一般建议用来构建 JavaScript 库,特别是那种导入和依赖的第三方库较少的那种库。 + +**Rollup 的未来:** Rollup 很酷,且正在被迅速采用。它有很多强大的功能,将在很长一段时间内作为前端工具生态系统的一个组成部分而存在。 + +### 了解更多 + +JavaScript 前端工具的生态系统充满着变数和竞争,且只有最好的工具才能存活下来。在不久的将来,我们的构建工具将具有更少(或没有)的配置,更方便的定制化,更好的扩展性的和更好的构建速度。 + +该用什么样的构建工具用于你的前端项目,你需要根据具体的项目需求来做出决定。至于选择什么样的工具,才是最合适自己的,大多数时候,需要我们自己作出取舍。 + +更多信息, 请看: + + * [JavaScript tooling: The evolution and future of JS/frontend build tools][12] + * [Tools and modern workflow for frontend developers][13] + * [Modern frontend: The tools and build process explained][14] + * [Best build tools in frontend development][15] + +* * * + +_这篇文章最初发表在 [Shedrack Akintayo 的博客][16] 上,经许可后重新发表。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/javascript-build-tools + +作者:[Shedrack Akintayo][a] +选题:[lujun9972][b] +译者:[ywxgod](https://github.com/ywxgod) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/shedrack-akintayo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/find-file-linux-code_magnifying_glass_zero.png?itok=E2HoPDg0 (Magnifying glass on code) +[2]: https://www.javascript.com/ +[3]: https://babeljs.io/ +[4]: https://gruntjs.com/ +[5]: https://bower.io/ +[6]: https://gulpjs.com/ +[7]: http://browserify.org/ +[8]: https://webpack.js.org/ +[9]: https://github.com/yarnpkg/yarn +[10]: https://parceljs.org/ +[11]: https://rollupjs.org/guide/en/ +[12]: https://qmo.io/blog/javascript-tooling-the-evolution-and-future-of-js-front-end-build-tools/ +[13]: https://blog.logrocket.com/tools-and-modern-workflow-for-front-end-developers-505c7227e917/ +[14]: https://medium.com/@trevorpoppen/modern-front-end-the-tools-and-build-process-explained-36641b5c1a53 +[15]: https://www.developerdrive.com/best-build-tools-frontend-development/ +[16]: https://www.sheddy.xyz/posts/javascript-build-tools-past-and-beyond diff --git a/published/202105/20210104 Network address translation part 1 - packet tracing.md b/published/202105/20210104 Network address translation part 1 - packet tracing.md new file mode 100644 index 0000000000..b1b8c31243 --- /dev/null +++ b/published/202105/20210104 Network address translation part 1 - packet tracing.md @@ -0,0 +1,226 @@ +[#]: collector: (lujun9972) +[#]: translator: (cooljelly) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13364-1.html) +[#]: subject: (Network address translation part 1 – packet tracing) +[#]: via: (https://fedoramagazine.org/network-address-translation-part-1-packet-tracing/) +[#]: author: (Florian Westphal https://fedoramagazine.org/author/strlen/) + +网络地址转换(NAT)之报文跟踪 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/06/112410xhdkvvdajis3jhlj.jpg) + +这是有关网络地址转换network address translation(NAT)的系列文章中的第一篇。这一部分将展示如何使用 iptables/nftables 报文跟踪功能来定位 NAT 相关的连接问题。 + +### 引言 + +网络地址转换(NAT)是一种将容器或虚拟机暴露在互联网中的一种方式。传入的连接请求将其目标地址改写为另一个地址,随后被路由到容器或虚拟机。相同的技术也可用于负载均衡,即传入的连接被分散到不同的服务器上去。 + +当网络地址转换没有按预期工作时,连接请求将失败,会暴露错误的服务,连接最终出现在错误的容器中,或者请求超时,等等。调试此类问题的一种方法是检查传入请求是否与预期或已配置的转换相匹配。 + +### 连接跟踪 + +NAT 不仅仅是修改 IP 地址或端口号。例如,在将地址 X 映射到 Y 时,无需添加新规则来执行反向转换。一个被称为 “conntrack” 的 netfilter 系统可以识别已有连接的回复报文。每个连接都在 conntrack 系统中有自己的 NAT 状态。反向转换是自动完成的。 + +### 规则匹配跟踪 + +nftables 工具(以及在较小的程度上,iptables)允许针对某个报文检查其处理方式以及该报文匹配规则集合中的哪条规则。为了使用这项特殊的功能,可在合适的位置插入“跟踪规则”。这些规则会选择被跟踪的报文。假设一个来自 IP 地址 C 的主机正在访问一个 IP 地址是 S 以及端口是 P 的服务。我们想知道报文匹配了哪条 NAT 转换规则,系统检查了哪些规则,以及报文是否在哪里被丢弃了。 + +由于我们要处理的是传入连接,所以我们将规则添加到 prerouting 钩子上。prerouting 意味着内核尚未决定将报文发往何处。修改目标地址通常会使报文被系统转发,而不是由主机自身处理。 + +### 初始配置 + +``` +# nft 'add table inet trace_debug' +# nft 'add chain inet trace_debug trace_pre { type filter hook prerouting priority -200000; }' +# nft "insert rule inet trace_debug trace_pre ip saddr $C ip daddr $S tcp dport $P tcp flags syn limit rate 1/second meta nftrace set 1" +``` + +第一条规则添加了一张新的规则表,这使得将来删除和调试规则可以更轻松。一句 `nft delete table inet trace_debug` 命令就可以删除调试期间临时加入表中的所有规则和链。 + +第二条规则在系统进行路由选择之前(`prerouting` 钩子)创建了一个基本钩子,并将其优先级设置为负数,以保证它在连接跟踪流程和 NAT 规则匹配之前被执行。 + +然而,唯一最重要的部分是第三条规则的最后一段:`meta nftrace set 1`。这条规则会使系统记录所有匹配这条规则的报文所关联的事件。为了尽可能高效地查看跟踪信息(提高信噪比),考虑对跟踪的事件增加一个速率限制,以保证其数量处于可管理的范围。一个好的选择是限制每秒钟最多一个报文或一分钟最多一个报文。上述案例记录了所有来自终端 `$C` 且去往终端 `$S` 的端口 `$P` 的所有 SYN 报文和 SYN/ACK 报文。限制速率的配置语句可以防范事件过多导致的洪泛风险。事实上,大多数情况下只记录一个报文就足够了。 + +对于 iptables 用户来讲,配置流程是类似的。等价的配置规则类似于: + +``` +# iptables -t raw -I PREROUTING -s $C -d $S -p tcp --tcp-flags SYN SYN  --dport $P  -m limit --limit 1/s -j TRACE +``` + +### 获取跟踪事件 + +原生 nft 工具的用户可以直接运行 `nft` 进入 nft 跟踪模式: + +``` +# nft monitor trace +``` + +这条命令会将收到的报文以及所有匹配该报文的规则打印出来(用 `CTRL-C` 来停止输出): + +``` +trace id f0f627 ip raw prerouting  packet: iif "veth0" ether saddr .. +``` + +我们将在下一章详细分析该结果。如果你用的是 iptables,首先通过 `iptables –version` 命令检查一下已安装的版本。例如: + +``` + +# iptables --version +iptables v1.8.5 (legacy) +``` + +`(legacy)` 意味着被跟踪的事件会被记录到内核的环形缓冲区中。你可以用 `dmesg` 或 `journalctl` 命令来查看这些事件。这些调试输出缺少一些信息,但和新工具提供的输出从概念上来讲很类似。你将需要首先查看规则被记录下来的行号,并与活跃的 iptables 规则集合手动关联。如果输出显示 `(nf_tables)`,你可以使用 `xtables-monitor` 工具: + +``` +# xtables-monitor --trace +``` + +如果上述命令仅显示版本号,你仍然需要查看 `dmesg`/`journalctl` 的输出。`xtables-monitor` 工具和 `nft` 监控跟踪工具使用相同的内核接口。它们之间唯一的不同点就是,`xtables-monitor` 工具会用 `iptables` 的语法打印事件,且如果你同时使用了 `iptables-nft` 和 `nft`,它将不能打印那些使用了 maps/sets 或其他只有 nftables 才支持的功能的规则。 + +### 示例 + +我们假设需要调试一个到虚拟机/容器的端口不通的问题。`ssh -p 1222 10.1.2.3` 命令应该可以远程连接那台服务器上的某个容器,但连接请求超时了。 + +你拥有运行那台容器的主机的登录权限。现在登录该机器并增加一条跟踪规则。可通过前述案例查看如何增加一个临时的调试规则表。跟踪规则类似于这样: + +``` +nft "insert rule inet trace_debug trace_pre ip daddr 10.1.2.3 tcp dport 1222 tcp flags syn limit rate 6/minute meta nftrace set 1" +``` + +在添加完上述规则后,运行 `nft monitor trace`,在跟踪模式下启动 nft,然后重试刚才失败的 `ssh` 命令。如果规则集较大,会出现大量的输出。不用担心这些输出,下一节我们会做逐行分析。 + +``` +trace id 9c01f8 inet trace_debug trace_pre packet: iif "enp0" ether saddr .. ip saddr 10.2.1.2 ip daddr 10.1.2.3 ip protocol tcp tcp dport 1222 tcp flags == syn +trace id 9c01f8 inet trace_debug trace_pre rule ip daddr 10.2.1.2 tcp dport 1222 tcp flags syn limit rate 6/minute meta nftrace set 1 (verdict continue) +trace id 9c01f8 inet trace_debug trace_pre verdict continue +trace id 9c01f8 inet trace_debug trace_pre policy accept +trace id 9c01f8 inet nat prerouting packet: iif "enp0" ether saddr .. ip saddr 10.2.1.2 ip daddr 10.1.2.3 ip protocol tcp  tcp dport 1222 tcp flags == syn +trace id 9c01f8 inet nat prerouting rule ip daddr 10.1.2.3  tcp dport 1222 dnat ip to 192.168.70.10:22 (verdict accept) +trace id 9c01f8 inet filter forward packet: iif "enp0" oif "veth21" ether saddr .. ip daddr 192.168.70.10 .. tcp dport 22 tcp flags == syn tcp window 29200 +trace id 9c01f8 inet filter forward rule ct status dnat jump allowed_dnats (verdict jump allowed_dnats) +trace id 9c01f8 inet filter allowed_dnats rule drop (verdict drop) +trace id 20a4ef inet trace_debug trace_pre packet: iif "enp0" ether saddr .. ip saddr 10.2.1.2 ip daddr 10.1.2.3 ip protocol tcp tcp dport 1222 tcp flags == syn +``` + +### 对跟踪结果作逐行分析 + +输出结果的第一行是触发后续输出的报文编号。这一行的语法与 nft 规则语法相同,同时还包括了接收报文的首部字段信息。你也可以在这一行找到接收报文的接口名称(此处为 `enp0`)、报文的源和目的 MAC 地址、报文的源 IP 地址(可能很重要 - 报告问题的人可能选择了一个错误的或非预期的主机),以及 TCP 的源和目的端口。同时你也可以在这一行的开头看到一个“跟踪编号”。该编号标识了匹配跟踪规则的特定报文。第二行包括了该报文匹配的第一条跟踪规则: + +``` +trace id 9c01f8 inet trace_debug trace_pre rule ip daddr 10.2.1.2 tcp dport 1222 tcp flags syn limit rate 6/minute meta nftrace set 1 (verdict continue) +``` + +这就是刚添加的跟踪规则。这里显示的第一条规则总是激活报文跟踪的规则。如果在这之前还有其他规则,它们将不会在这里显示。如果没有任何跟踪输出结果,说明没有抵达这条跟踪规则,或者没有匹配成功。下面的两行表明没有后续的匹配规则,且 `trace_pre` 钩子允许报文继续传输(判定为接受)。 + +下一条匹配规则是: + +``` +trace id 9c01f8 inet nat prerouting rule ip daddr 10.1.2.3  tcp dport 1222 dnat ip to 192.168.70.10:22 (verdict accept) +``` + +这条 DNAT 规则设置了一个到其他地址和端口的映射。规则中的参数 `192.168.70.10` 是需要收包的虚拟机的地址,目前为止没有问题。如果它不是正确的虚拟机地址,说明地址输入错误,或者匹配了错误的 NAT 规则。 + +### IP 转发 + +通过下面的输出我们可以看到,IP 路由引擎告诉 IP 协议栈,该报文需要被转发到另一个主机: + +``` +trace id 9c01f8 inet filter forward packet: iif "enp0" oif "veth21" ether saddr .. ip daddr 192.168.70.10 .. tcp dport 22 tcp flags == syn tcp window 29200 +``` + +这是接收到的报文的另一种呈现形式,但和之前相比有一些有趣的不同。现在的结果有了一个输出接口集合。这在之前不存在的,因为之前的规则是在路由决策之前(`prerouting` 钩子)。跟踪编号和之前一样,因此仍然是相同的报文,但目标地址和端口已经被修改。假设现在还有匹配 `tcp dport 1222` 的规则,它们将不会对现阶段的报文产生任何影响了。 + +如果该行不包含输出接口(`oif`),说明路由决策将报文路由到了本机。对路由过程的调试属于另外一个主题,本文不再涉及。 + +``` +trace id 9c01f8 inet filter forward rule ct status dnat jump allowed_dnats (verdict jump allowed_dnats) +``` + +这条输出表明,报文匹配到了一个跳转到 `allowed_dnats` 链的规则。下一行则说明了连接失败的根本原因: + +``` +trace id 9c01f8 inet filter allowed_dnats rule drop (verdict drop) +``` + +这条规则无条件地将报文丢弃,因此后续没有关于该报文的日志输出。下一行则是另一个报文的输出结果了: + +``` +trace id 20a4ef inet trace_debug trace_pre packet: iif "enp0" ether saddr .. ip saddr 10.2.1.2 ip daddr 10.1.2.3 ip protocol tcp tcp dport 1222 tcp flags == syn +``` + +跟踪编号已经和之前不一样,然后报文的内容却和之前是一样的。这是一个重传尝试:第一个报文被丢弃了,因此 TCP 尝试了重传。可以忽略掉剩余的输出结果了,因为它并没有提供新的信息。现在是时候检查那条链了。 + +### 规则集合分析 + +上一节我们发现报文在 inet filter 表中的一个名叫 `allowed_dnats` 的链中被丢弃。现在我们来查看它: + +``` +# nft list chain inet filter allowed_dnats +table inet filter { + chain allowed_dnats { +  meta nfproto ipv4 ip daddr . tcp dport @allow_in accept +  drop +   } +} +``` + +接受 `@allow_in` 集的数据包的规则没有显示在跟踪日志中。我们通过列出元素的方式,再次检查上述报文的目标地址是否在 `@allow_in` 集中: + +``` +# nft "get element inet filter allow_in { 192.168.70.10 . 22 }" +Error: Could not process rule: No such file or directory +``` + +不出所料,地址-服务对并没有出现在集合中。我们将其添加到集合中。 + +``` +# nft "add element inet filter allow_in { 192.168.70.10 . 22 }" +``` + +现在运行查询命令,它将返回新添加的元素。 + +``` +# nft "get element inet filter allow_in { 192.168.70.10 . 22 }" +table inet filter { + set allow_in { + type ipv4_addr . inet_service + elements = { 192.168.70.10 . 22 } + } +} +``` + +`ssh` 命令现在应该可以工作,且跟踪结果可以反映出该变化: + +``` +trace id 497abf58 inet filter forward rule ct status dnat jump allowed_dnats (verdict jump allowed_dnats) + +trace id 497abf58 inet filter allowed_dnats rule meta nfproto ipv4 ip daddr . tcp dport @allow_in accept (verdict accept) + +trace id 497abf58 ip postrouting packet: iif "enp0" oif "veth21" ether .. trace id 497abf58 ip postrouting policy accept +``` + +这表明报文通过了转发路径中的最后一个钩子 - `postrouting`。 + +如果现在仍然无法连接,问题可能处在报文流程的后续阶段,有可能并不在 nftables 的规则集合范围之内。 + +### 总结 + +本文介绍了如何通过 nftables 的跟踪机制检查丢包或其他类型的连接问题。本系列的下一篇文章将展示如何检查连接跟踪系统和可能与连接跟踪流相关的 NAT 信息。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/network-address-translation-part-1-packet-tracing/ + +作者:[Florian Westphal][a] +选题:[lujun9972][b] +译者:[cooljelly](https://github.com/cooljelly) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/strlen/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/12/network-address-translation-part-1-816x346.png diff --git a/published/202105/20210114 Cross-compiling made easy with Golang.md b/published/202105/20210114 Cross-compiling made easy with Golang.md new file mode 100644 index 0000000000..72a662d890 --- /dev/null +++ b/published/202105/20210114 Cross-compiling made easy with Golang.md @@ -0,0 +1,217 @@ +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13385-1.html" +[#]: subject: "Cross-compiling made easy with Golang" +[#]: via: "https://opensource.com/article/21/1/go-cross-compiling" +[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe" + +使用 Golang 的交叉编译 +====== + +> 走出舒适区,我了解了 Go 的交叉编译功能。 + +![](https://img.linux.net.cn/data/attachment/album/202105/13/092632nrg2z17i8vea4cf8.jpg) + +在 Linux 上测试软件时,我使用各种架构的服务器,例如 Intel、AMD、Arm 等。当我 [分配了一台满足我的测试需求的 Linux 机器][2],我仍然需要执行许多步骤: + + 1. 下载并安装必备软件 + 2. 验证构建服务器上是否有新的测试软件包 + 3. 获取并设置依赖软件包所需的 yum 仓库 + 4. 下载并安装新的测试软件包(基于步骤 2) + 5. 获取并设置必需的 SSL 证书 + 6. 设置测试环境,获取所需的 Git 仓库,更改配置,重新启动守护进程等 + 7. 做其他需要做的事情 + +### 用脚本自动化 + +这些步骤非常常规,以至于有必要对其进行自动化并将脚本保存到中央位置(例如文件服务器),在需要时可以在此处下载脚本。为此,我编写了 100-120 行的 Bash shell 脚本,它为我完成了所有配置(包括错误检查)。这个脚本通过以下方式简化了我的工作流程: + + 1. 配置新的 Linux 系统(支持测试的架构) + 2. 登录系统并从中央位置下载自动化 shell 脚本 + 3. 运行它来配置系统 + 4. 开始测试 + +### 学习 Go 语言 + +我想学习 [Go 语言][3] 有一段时间了,将我心爱的 Shell 脚本转换为 Go 程序似乎是一个很好的项目,可以帮助我入门。它的语法看起来很简单,在尝试了一些测试程序后,我开始着手提高自己的知识并熟悉 Go 标准库。 + +我花了一个星期的时间在笔记本电脑上编写 Go 程序。我经常在我的 x86 服务器上测试程序,清除错误并使程序健壮起来,一切都很顺利。 + +直到完全转换到 Go 程序前,我继续依赖自己的 shell 脚本。然后,我将二进制文件推送到中央文件服务器上,以便每次配置新服务器时,我要做的就是获取二进制文件,将可执行标志打开,然后运行二进制文件。我对早期的结果很满意: + +``` +$ wget http://file.example.com//bins/prepnode +$ chmod +x ./prepnode +$ ./prepnode +``` + +### 然后,出现了一个问题 + +第二周,我从资源池中分配了一台新的服务器,像往常一样,我下载了二进制文件,设置了可执行标志,然后运行二进制文件。但这次它出错了,是一个奇怪的错误: + +``` +$ ./prepnode +bash: ./prepnode: cannot execute binary file: Exec format error +$ +``` + +起初,我以为可能没有成功设置可执行标志。但是,它已按预期设置: + +``` +$ ls -l prepnode +-rwxr-xr-x. 1 root root 2640529 Dec 16 05:43 prepnode +``` + +发生了什么事?我没有对源代码进行任何更改,编译没有引发任何错误或警告,而且上次运行时效果很好,因此我仔细查看了错误消息 `format error`。 + +我检查了二进制文件的格式,一切看起来都没问题: + +``` +$ file prepnode +prepnode: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped +``` + +我迅速运行了以下命令,识别所配置的测试服务器的架构以及二进制试图运行的平台。它是 Arm64 架构,但是我编译的二进制文件(在我的 x86 笔记本电脑上)生成的是 x86-64 格式的二进制文件: + +``` +$ uname -m +aarch64 +``` + +### 脚本编写人员的编译第一课 + +在那之前,我从未考虑过这种情况(尽管我知道这一点)。我主要研究脚本语言(通常是 Python)以及 Shell 脚本。在任何架构的大多数 Linux 服务器上都可以使用 Bash Shell 和 Python 解释器。总之,之前一切都很顺利。 + +但是,现在我正在处理 Go 这种编译语言,它生成可执行的二进制文件。编译后的二进制文件由特定架构的 [指令码][4] 或汇编指令组成,这就是为什么我收到格式错误的原因。由于 Arm64 CPU(运行二进制文件的地方)无法解释二进制文件的 x86-64 指令,因此它抛出错误。以前,shell 和 Python 解释器为我处理了底层指令码或特定架构的指令。 + +### Go 的交叉编译 + +我检查了 Golang 的文档,发现要生成 Arm64 二进制文件,我要做的就是在运行 `go build` 命令编译 Go 程序之前设置两个环境变量。 + +`GOOS` 指的是操作系统,例如 Linux、Windows、BSD 等,而 `GOARCH` 指的是要在哪种架构上构建程序。 + +``` +$ env GOOS=linux GOARCH=arm64 go build -o prepnode_arm64 +``` + +构建程序后,我重新运行 `file` 命令,这一次它显示的是 ARM AArch64,而不是之前显示的 x86。因此,我在我的笔记本上能为不同的架构构建二进制文件。 + +``` +$ file prepnode_arm64 +prepnode_arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, not stripped +``` + +我将二进制文件从笔记本电脑复制到 ARM 服务器上。现在运行二进制文件(将可执行标志打开)不会产生任何错误: + +``` +$ ./prepnode_arm64  -h +Usage of ./prepnode_arm64: +  -c    Clean existing installation +  -n    Do not start test run (default true) +  -s    Use stage environment, default is qa +  -v    Enable verbose output +``` + +### 其他架构呢? + +x86 和 Arm 是我测试软件所支持的 5 种架构中的两种,我担心 Go 可能不会支持其它架构,但事实并非如此。你可以查看 Go 支持的架构: + +``` +$ go tool dist list +``` + +Go 支持多种平台和操作系统,包括: + + * AIX + * Android + * Darwin + * Dragonfly + * FreeBSD + * Illumos + * JavaScript + * Linux + * NetBSD + * OpenBSD + * Plan 9 + * Solaris + * Windows + +要查找其支持的特定 Linux 架构,运行: + +``` +$ go tool dist list | grep linux +``` + +如下面的输出所示,Go 支持我使用的所有体系结构。尽管 x86_64 不在列表中,但 AMD64 兼容 x86-64,所以你可以生成 AMD64 二进制文件,它可以在 x86 架构上正常运行: + +``` +$ go tool dist list | grep linux +linux/386 +linux/amd64 +linux/arm +linux/arm64 +linux/mips +linux/mips64 +linux/mips64le +linux/mipsle +linux/ppc64 +linux/ppc64le +linux/riscv64 +linux/s390x +``` + +### 处理所有架构 + +为我测试的所有体系结构生成二进制文件,就像从我的 x86 笔记本电脑编写一个微小的 shell 脚本一样简单: + +``` +#!/usr/bin/bash +archs=(amd64 arm64 ppc64le ppc64 s390x) + +for arch in ${archs[@]} +do + env GOOS=linux GOARCH=${arch} go build -o prepnode_${arch} +done + +``` + +``` +$ file prepnode_* +prepnode_amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=y03MzCXoZERH-0EwAAYI/p909FDnk7xEUo2LdHIyo/V2ABa7X_rLkPNHaFqUQ6/5p_q8MZiR2WYkA5CzJiF, not stripped +prepnode_arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, Go BuildID=q-H-CCtLv__jVOcdcOpA/CywRwDz9LN2Wk_fWeJHt/K4-3P5tU2mzlWJa0noGN/SEev9TJFyvHdKZnPaZgb, not stripped +prepnode_ppc64: ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), statically linked, Go BuildID=DMWfc1QwOGIq2hxEzL_u/UE-9CIvkIMeNC_ocW4ry/r-7NcMATXatoXJQz3yUO/xzfiDIBuUxbuiyaw5Goq, not stripped +prepnode_ppc64le: ELF 64-bit LSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), statically linked, Go BuildID=C6qCjxwO9s63FJKDrv3f/xCJa4E6LPVpEZqmbF6B4/Mu6T_OR-dx-vLavn1Gyq/AWR1pK1cLz9YzLSFt5eU, not stripped +prepnode_s390x: ELF 64-bit MSB executable, IBM S/390, version 1 (SYSV), statically linked, Go BuildID=faC_HDe1_iVq2XhpPD3d/7TIv0rulE4RZybgJVmPz/o_SZW_0iS0EkJJZHANxx/zuZgo79Je7zAs3v6Lxuz, not stripped +``` + +现在,每当配置一台新机器时,我就运行以下 `wget` 命令下载特定体系结构的二进制文件,将可执行标志打开,然后运行: + +``` +$ wget http://file.domain.com//bins/prepnode_ +$ chmod +x ./prepnode_ +$ ./prepnode_ +``` + +### 为什么? + +你可能想知道,为什么我没有坚持使用 shell 脚本或将程序移植到 Python 而不是编译语言上来避免这些麻烦。所以有舍有得,那样的话我不会了解 Go 的交叉编译功能,以及程序在 CPU 上执行时的底层工作原理。在计算机中,总要考虑取舍,但绝不要让它们阻碍你的学习。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/go-cross-compiling + +作者:[Gaurav Kamathe][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gkamathe +[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]: https://opensource.com/article/20/12/linux-server +[3]: https://golang.org/ +[4]: https://en.wikipedia.org/wiki/Opcode \ No newline at end of file diff --git a/published/202105/20210204 A guide to understanding Linux software libraries in C.md b/published/202105/20210204 A guide to understanding Linux software libraries in C.md new file mode 100644 index 0000000000..66d2e89b71 --- /dev/null +++ b/published/202105/20210204 A guide to understanding Linux software libraries in C.md @@ -0,0 +1,481 @@ +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13413-1.html) +[#]: subject: (A guide to understanding Linux software libraries in C) +[#]: via: (https://opensource.com/article/21/2/linux-software-libraries) +[#]: author: (Marty Kalin https://opensource.com/users/mkalindepauledu) + +用 C 语言理解 Linux 软件库 +====== + +> 软件库是重复使用代码的一种简单而合理的方式。 + +![](https://img.linux.net.cn/data/attachment/album/202105/22/165307u0n970uivji7kiim.jpg) + +软件库是一种是一直以来长期存在的、简单合理的复用代码的方式。这篇文章解释了如何从头开始构建库并使得其可用。尽管这两个示例库都以 Linux 为例,但创建、发布和使用这些库的步骤也可以应用于其它类 Unix 系统。 + +这些示例库使用 C 语言编写,非常适合该任务。Linux 内核大部分由 C 语言和少量汇编语言编写(Windows 和 Linux 的表亲如 macOS 也是如此)。用于输入/输出、网络、字符串处理、数学、安全、数据编码等的标准系统库等主要由 C 语言编写。所以使用 C 语言编写库就是使用 Linux 的原生语言来编写。除此之外,C 语言的性能也在一众高级语言中鹤立鸡群。 + +还有两个来访问这些库的示例客户程序client(一个使用 C,另一个使用 Python)。毫无疑问可以使用 C 语言客户程序来访问 C 语言编写的库,但是 Python 客户程序示例说明了一个由 C 语言编写的库也可以服务于其他编程语言。 + +### 静态库和动态库对比 + +Linux 系统存在两种类型库: + + * **静态库(也被称为归档库)**:在编译过程中的链接阶段,静态库会被编译进程序(例如 C 或 Rust)中。每个客户程序都有属于自己的一份库的拷贝。静态库有一个显而易见的缺点 —— 当库需要进行一定改动时(例如修复一个 bug),静态库必须重新链接一次。接下来要介绍的动态库避免了这一缺点。 + * **动态库(也被称为共享库)**:动态库首先会在程序编译中的链接阶段被标记,但是客户程序和库代码在运行之前仍然没有联系,且库代码不会进入到客户程序中。系统的动态加载器会把一个共享库和正在运行的客户程序进行连接,无论该客户程序是由静态编译语言(如 C)编写,还是由动态解释语言(如 Python)编写。因此,动态库不需要麻烦客户程序便可以进行更新。最后,多个客户程序可以共享同一个动态库的单一副本。 + +通常来说,动态库优于静态库,尽管其复杂性较高而性能较低。下面是两种类型的库如何创建和发布: + + 1. 库的源代码会被编译成一个或多个目标模块,目标模块是二进制文件,可以被包含在库中并且链接到可执行的二进制中。 + 2. 目标模块会会被打包成一个文件。对于静态库,标准的文件拓展名是 `.a` 意为“归档archive”;对于动态库,标准的文件拓展名是 `.so` 意为“共享目标shared object”。对于这两个相同功能的示例库,分别发布为 `libprimes.a` (静态库)和 `libshprimes.so` (动态库)。两种库的文件名都使用前缀 `lib` 进行标识。 + 3. 库文件被复制到标准目录下,使得客户程序可以轻松地访问到库。无论是静态库还是动态库,典型的位置是 `/usr/lib` 或者 `/usr/local/lib`,当然其他位置也是可以的。 + +构建和发布每种库的具体步骤会在下面详细介绍。首先我将介绍两种库里涉及到的 C 函数。 + +### 示例库函数 + +这两个示例库都是由五个相同的 C 函数构建而成的,其中四个函数可供客户程序使用。第五个函数是其他四个函数的一个工具函数,它显示了 C 语言怎么隐藏信息。每个函数的源代码都很短,可以将这些函数放在单个源文件中,尽管也可以放在多个源文件中(如四个公布的函数都有一个文件)。 + +这些库函数是基本的处理函数,以多种方式来处理质数。所有的函数接收无符号(即非负)整数值作为参数: + +- `is_prime` 函数测试其单个参数是否为质数。 +- `are_coprimes` 函数检查了其两个参数的最大公约数greatest common divisor(gcd)是否为 1,即是否为互质数。 +- `prime_factors`:函数列出其参数的质因数。 +- `glodbach`:函数接收一个大于等于 4 的偶数,列出其可以分解为两个质数的和。它也许存在多个符合条件的数对。该函数是以 18 世纪数学家 [克里斯蒂安·哥德巴赫][2]Christian Goldbach 命名的,他的猜想是任意一个大于 2 的偶数可以分解为两个质数之和,这依旧是数论里最古老的未被解决的问题。 + +工具函数 `gcd` 留在已部署的库文件中,但是在没有包含这个函数的文件无法访问此函数。因此,一个使用库的客户程序无法调用 `gcd` 函数。仔细观察 C 函数可以明白这一点。 + +### 更多关于 C 函数的内容 + +每个在 C 语言中的函数都有一个存储类,它决定了函数的范围。对于函数,有两种选择。 + +- 函数默认的存储类是 `extern`,它给了函数一个全局域。一个客户程序可以调用在示例库中用 `extern` 修饰的任意函数。下面是一个带有显式 `extern` 声明的 `are_coprimes` 函数定义: + + ``` + extern unsigned are_coprimes(unsigned n1, unsigned n2) { + ... + } + ``` +- 存储类 `static` 将一个函数的的范围限制到函数被定义的文件中。在示例库中,工具函数 `gcd` 是静态的(`static`): + + ``` + static unsigned gcd(unsigned n1, unsigned n2) { + ... + } + ``` + +只有在 `primes.c` 文件中的函数可以调用 `gcd`,而只有 `are_coprimes` 函数会调用它。当静态库和动态库被构建和发布后,其他的程序可以调用外部的(`extern`)函数,如 `are_coprimes` ,但是不可以调用静态(`static`)函数 `gcd`。静态(`static`)存储类通过将函数范围限制在其他库函数内,进而实现了对库的客户程序隐藏 `gcd` 函数。 + +在 `primes.c` 文件中除了 `gcd` 函数外,其他函数并没有指明存储类,默认将会设置为外部的(`extern`)。然而,在库中显式注明 `extern` 更加常见。 + +C 语言区分了函数的定义definition声明declaration,这对库来说很重要。接下来让我们开始了解定义。C 语言仅允许命名函数不允许匿名函数,并且每个函数需要定义以下内容: + +- 一个唯一的名字。一个程序不允许存在两个同名的函数。 +- 一个可以为空的参数列表。参数需要指明类型。 +- 一个返回值类型(例如:`int` 代表 32 位有符号整数),当没有返回值时设置为空类型(`void`)。 +- 用一对花括号包围起来的函数主体部分。在一个特制的示例中,函数主体部分可以为空。 + +程序中的每个函数必须要被定义一次。 + +下面是库函数 `are_coprimes` 的完整定义: + +``` +extern unsigned are_coprimes(unsigned n1, unsigned n2) { /* 定义 */ + return 1 == gcd(n1, n2); /* 最大公约数是否为 1? */ +} +``` + +函数返回一个布尔值(`0` 代表假,`1` 代表真),取决于两个整数参数值的最大公约数是否为 1。工具函数 `gcd` 计算两个整数参数 `n1` 和 `n2` 的最大公约数。 + +函数声明不同于定义,其不需要主体部分: + +``` +extern unsigned are_coprimes(unsigned n1, unsigned n2); /* 声明 */ +``` + +声明在参数列表后用一个分号代表结束,它没有被花括号包围起来的主体部分。程序中的函数可以被多次声明。 + +为什么需要声明?在 C 语言中,一个被调用的函数必须对其调用者可见。有多种方式可以提供这样的可见性,具体依赖于编译器如何实现。一个必然可行的方式就是当它们二者位于同一个文件中时,将被调用的函数定义在在它的调用者之前。 + +``` +void f() {...} /* f 定义在其被调用前 */ +void g() { f(); } /* ok */ +``` + +当函数 `f` 被在调用前声明,此时函数 `f` 的定义可以移动到函数 `g` 的下方。 + +``` +void f(); /* 声明使得函数 f 对调用者可见 */ +void g() { f(); } /* ok */ +void f() {...} /* 相较于前一种方式,此方式显得更简洁 */ +``` + +但是当如果一个被调用的函数和调用它的函数不在同一个文件中时呢?因为前文提到一个函数在一个程序中需要被定义一次,那么如何使得让一个文件中被定义的函数在另一个文件中可见? + +这个问题会影响库,无论是静态库还是动态库。例如在这两个质数库中函数被定义在源文件 `primes.c` 中,每个库中都有该函数的二进制副本,但是这些定义的函数必须要对使用库的 C 程序可见,该 C 程序有其自身的源文件。 + +函数声明可以帮助提供跨文件的可见性。对于上述的“质数”例子,它有一个名为 `primes.h` 的头文件,其声明了四个函数使得它们对使用库的 C 程序可见。 + +``` +/** 头文件 primes.h:函数声明 **/ +extern unsigned is_prime(unsigned); +extern void prime_factors(unsigned); +extern unsigned are_coprimes(unsigned, unsigned); +extern void goldbach(unsigned); +``` + +这些声明通过为每个函数指定其调用语法来作为接口。 + +为了客户程序的便利性,头文件 `primes.h` 应该存储在 C 编译器查找路径下的目录中。典型的位置有 `/usr/include` 和 `/usr/local/include`。一个 C 语言客户程序应使用 `#include` 包含这个头文件,并尽可能将这条语句其程序源代码的首部(头文件将会被导入另一个源文件的“头”部)。C 语言头文件可以被导入其他语言(如 Rust 语言)中的 `bindgen`,使其它语言的客户程序可以访问 C 语言的库。 + +总之,一个库函数只可以被定义一次,但可以在任何需要它的地方进行声明,任一使用 C 语言库的程序都需要该声明。头文件可以包含函数声明,但不能包含函数定义。如果头文件包含了函数定义,那么该文件可能会在一个 C 语言程序中被多次包含,从而破坏了一个函数在 C 语言程序中必须被精确定义一次的规则。 + +### 库的源代码 + +下面是两个库的源代码。这部分代码、头文件、以及两个示例客户程序都可以在 [我的网页][3] 上找到。 + +``` +#include +#include + +extern unsigned is_prime(unsigned n) { + if (n <= 3) return n > 1; /* 2 和 3 是质数 */ + if (0 == (n % 2) || 0 == (n % 3)) return 0; /* 2 和 3 的倍数不会是质数 */ + + /* 检查 n 是否是其他 < n 的值的倍数 */ + unsigned i; + for (i = 5; (i * i) <= n; i += 6) + if (0 == (n % i) || 0 == (n % (i + 2))) return 0; /* 不是质数 */ + + return 1; /* 一个不是 2 和 3 的质数 */ +} + +extern void prime_factors(unsigned n) { + /* 在数字 n 的质因数分解中列出所有 2 */ + while (0 == (n % 2)) { + printf("%i ", 2); + n /= 2; + } + + /* 数字 2 已经处理完成,下面处理奇数 */ + unsigned i; + for (i = 3; i <= sqrt(n); i += 2) { + while (0 == (n % i)) { + printf("%i ", i); + n /= i; + } + } + + /* 还有其他质因数?*/ + if (n > 2) printf("%i", n); +} + +/* 工具函数:计算最大公约数 */ +static unsigned gcd(unsigned n1, unsigned n2) { + while (n1 != 0) { + unsigned n3 = n1; + n1 = n2 % n1; + n2 = n3; + } + return n2; +} + +extern unsigned are_coprimes(unsigned n1, unsigned n2) { + return 1 == gcd(n1, n2); +} + +extern void goldbach(unsigned n) { + /* 输入错误 */ + if ((n <= 2) || ((n & 0x01) > 0)) { + printf("Number must be > 2 and even: %i is not.\n", n); + return; + } + + /* 两个简单的例子:4 和 6 */ + if ((4 == n) || (6 == n)) { + printf("%i = %i + %i\n", n, n / 2, n / 2); + return; + } + + /* 当 n > 8 时,存在多种可能性 */ + unsigned i; + for (i = 3; i < (n / 2); i++) { + if (is_prime(i) && is_prime(n - i)) { + printf("%i = %i + %i\n", n, i, n - i); + /* 如果只需要一对,那么用 break 语句替换这句 */ + } + } +} +``` + +*库函数* + +这些函数可以被库利用。两个库可以从相同的源代码中获得,同时头文件 `primes.h` 是两个库的 C 语言接口。 + +### 构建库 + +静态库和动态库在构建和发布的步骤上有一些细节的不同。静态库需要三个步骤,而动态库需要增加两个步骤即一共五个步骤。额外的步骤表明了动态库的动态方法具有更多的灵活性。让我们先从静态库开始。 + +库的源文件 `primes.c` 被编译成一个目标模块。下面是命令,百分号 `%` 代表系统提示符,两个井字符 `#` 是我的注释。 + +``` +% gcc -c primes.c ## 步骤1(静态) +``` + +这一步生成目标模块是二进制文件 `primes.o`。`-c` 标志意味着只编译。 + +下一步是使用 Linux 的 `ar` 命令将目标对象归档。 + +``` +% ar -cvq libprimes.a primes.o ## 步骤2(静态) +``` + +`-cvq` 三个标识分别是“创建”、“详细的”、“快速添加”(以防新文件没有添加到归档中)的简称。回忆一下,前文提到过前缀 `lib` 是必须的,而库名是任意的。当然,库的文件名必须是唯一的,以避免冲突。 + +归档已经准备好要被发布: + +``` +% sudo cp libprimes.a /usr/local/lib ## 步骤3(静态) +``` + +现在静态库对接下来的客户程序是可见的,示例在后面。(包含 `sudo` 可以确保有访问权限将文件复制进 `/usr/local/lib` 目录中) + +动态库还需要一个或多个对象模块进行打包: + +``` +% gcc primes.c -c -fpic ## 步骤1(动态) +``` + +增加的选项 `-fpic` 指示编译器生成与位置无关的代码,这意味着不需要将该二进制模块加载到一个固定的内存位置。在一个拥有多个动态库的系统中这种灵活性是至关重要的。生成的对象模块会略大于静态库生成的对象模块。 + +下面是从对象模块创建单个库文件的命令: + +``` +% gcc -shared -Wl,-soname,libshprimes.so -o libshprimes.so.1 primes.o ## 步骤2(动态) +``` + +选项 `-shared` 表明了该库是一个共享的(动态的)而不是静态的。`-Wl` 选项引入了一系列编译器选项,第一个便是设置动态库的 `-soname`,这是必须设置的。`soname` 首先指定了库的逻辑名字(`libshprimes.so`),接下来的 `-o` 选项指明了库的物理文件名字(`libshprimes.so.1`)。这样做的目的是为了保持逻辑名不变的同时允许物理名随着新版本而发生变化。在本例中,在物理文件名 `libshprimes.so.1` 中最后的 1 代表是第一个库的版本。尽管逻辑文件名和物理文件名可以是相同的,但是最佳做法是将它们命名为不同的名字。一个客户程序将会通过逻辑名(本例中为 `libshprimes.so`)来访问库,稍后我会进一步解释。 + +接下来的一步是通过复制共享库到合适的目录下使得客户程序容易访问,例如 `/usr/local/lib` 目录: + +``` +% sudo cp libshprimes.so.1 /usr/local/lib ## 步骤3(动态) +``` + +现在在共享库的逻辑名(`libshprimes.so`)和它的物理文件名(`/usr/local/lib/libshprimes.so.1`)之间设置一个符号链接。最简单的方式是将 `/usr/local/lib` 作为工作目录,在该目录下输入命令: + +``` +% sudo ln --symbolic libshprimes.so.1 libshprimes.so ## 步骤4(动态) +``` + +逻辑名 `libshprimes.so` 不应该改变,但是符号链接的目标(`libshrimes.so.1`)可以根据需要进行更新,新的库实现可以是修复了 bug,提高性能等。 + +最后一步(一个预防措施)是调用 `ldconfig` 工具来配置系统的动态加载器。这个配置保证了加载器能够找到新发布的库。 + +``` +% sudo ldconfig ## 步骤5(动态) +``` + +到现在,动态库已为包括下面的两个在内的示例客户程序准备就绪了。 + +### 一个使用库的 C 程序 + +这个示例 C 程序是一个测试程序,它的源代码以两条 `#include` 指令开始: + +``` +#include /* 标准输入/输出函数 */ +#include /* 我的库函数 */ +``` + +文件名两边的尖括号表示可以在编译器的搜索路径中找到这些头文件(对于 `primes.h` 文件来说在 `/usr/local/inlcude` 目录下)。如果不包含 `#include`,编译器会抱怨缺少 `is_prime` 和 `prime_factors` 等函数的声明,它们在两个库中都有发布。顺便提一句,测试程序的源代码不需要更改即可测试两个库中的每一个库。 + +相比之下,库的源文件(`primes.c`)使用 `#include` 指令打开以下头文件: + +``` +#include +#include +``` + +`math.h` 头文件是必须的,因为库函数 `prime_factors` 会调用数学函数 `sqrt`,其在标准库 `libm.so` 中。 + +作为参考,这是测试库程序的源代码: + +``` +#include +#include + +int main() { + /* 是质数 */ + printf("\nis_prime\n"); + unsigned i, count = 0, n = 1000; + for (i = 1; i <= n; i++) { + if (is_prime(i)) { + count++; + if (1 == (i % 100)) printf("Sample prime ending in 1: %i\n", i); + } + } + printf("%i primes in range of 1 to a thousand.\n", count); + + /* prime_factors */ + printf("\nprime_factors\n"); + printf("prime factors of 12: "); + prime_factors(12); + printf("\n"); + + printf("prime factors of 13: "); + prime_factors(13); + printf("\n"); + + printf("prime factors of 876,512,779: "); + prime_factors(876512779); + printf("\n"); + + /* 是合数 */ + printf("\nare_coprime\n"); + printf("Are %i and %i coprime? %s\n", + 21, 22, are_coprimes(21, 22) ? "yes" : "no"); + printf("Are %i and %i coprime? %s\n", + 21, 24, are_coprimes(21, 24) ? "yes" : "no"); + + /* 哥德巴赫 */ + printf("\ngoldbach\n"); + goldbach(11); /* error */ + goldbach(4); /* small one */ + goldbach(6); /* another */ + for (i = 100; i <= 150; i += 2) goldbach(i); + + return 0; +} +``` + +*测试程序* + +在编译 `tester.c` 文件到可执行文件时,难处理的部分时链接选项的顺序。回想前文中提到两个示例库都是用 `lib` 作为前缀开始,并且每一个都有一个常规的拓展后缀:`.a` 代表静态库 `libprimes.a`,`.so` 代表动态库 `libshprimes.so`。在链接规范中,前缀 `lib` 和拓展名被忽略了。链接标志以 `-l` (小写 L)开始,并且一条编译命令可能包含多个链接标志。下面是一个完整的测试程序的编译指令,使用动态库作为示例: + +``` +% gcc -o tester tester.c -lshprimes -lm +``` + +第一个链接标志指定了库 `libshprimes.so`,第二个链接标志指定了标准数学库 `libm.so`。 + +链接器是懒惰的,这意味着链接标志的顺序是需要考虑的。例如,调整上述实例中的链接顺序将会产生一个编译时错误: + +``` +% gcc -o tester tester.c -lm -lshprimes ## 危险! +``` + +链接 `libm.so` 库的标志先出现,但是这个库中没有函数被测试程序显式调用;因此,链接器不会链接到 `math.so` 库。调用 `sqrt` 库函数仅发生在 `libshprimes.so` 库中包含的 `prime_factors` 函数。编译测试程序返回的错误是: + +``` +primes.c: undefined reference to 'sqrt' +``` + +因此,链接标志的顺序应该是通知链接器需要 `sqrt` 函数: + +``` +% gcc -o tester tester.c -lshprimes -lm ## 首先链接 -lshprimes +``` + +链接器在 `libshprimes.so` 库中发现了对库函数 `sqrt` 的调用,所以接下来对数学库 `libm.so`做了合适的链接。链接还有一个更复杂的选项,它支持链接的标志顺序。然而在本例中,最简单的方式就是恰当地排列链接标志。 + +下面是运行测试程序的部分输出结果: + +``` +is_prime +Sample prime ending in 1: 101 +Sample prime ending in 1: 401 +... +168 primes in range of 1 to a thousand. + +prime_factors +prime factors of 12: 2 2 3 +prime factors of 13: 13 +prime factors of 876,512,779: 211 4154089 + +are_coprime +Are 21 and 22 coprime? yes +Are 21 and 24 coprime? no + +goldbach +Number must be > 2 and even: 11 is not. +4 = 2 + 2 +6 = 3 + 3 +... +32 = 3 + 29 +32 = 13 + 19 +... +100 = 3 + 97 +100 = 11 + 89 +... +``` + +对于 `goldbach` 函数,即使一个相当小的偶数值(例如 18)也许存在多个一对质数之和的组合(在这种情况下,5+13 和 7+11)。因此这种多个质数对是使得尝试证明哥德巴赫猜想变得复杂的因素之一。 + +### 封装使用库的 Python 程序 + +与 C 不同,Python 不是一个静态编译语言,这意味着 Python 客户示例程序必须访问动态版本而非静态版本的 `primes` 库。为了能这样做,Python 中有众多的支持外部语言接口foreign function interface(FFI)的模块(标准的或第三方的),它们允许用一种语言编写的程序来调用另一种语言编写的函数。Python 中的 `ctypes` 是一个标准的、相对简单的允许 Python 代码调用 C 函数的 FFI。 + +任何 FFI 都面临挑战,因为对接的语言不大可能会具有完全相同的数据类型。例如:`primes` 库使用 C 语言类型 `unsigned int`,而 Python 并不具有这种类型;因此 `ctypes` FFI 将 C 语言中的 `unsigned int` 类型映射为 Python 中的 `int` 类型。在 `primes` 库中发布的四个 `extern` C 函数中,有两个在具有显式 `ctypes` 配置的 Python 中会表现得更好。 + +C 函数 `prime_factors` 和 `goldbach` 返回 `void` 而不是返回一个具体类型,但是 `ctypes` 默认会将 C 语言中的 `void` 替换为 Python 语言中的 `int`。当从 Python 代码中调用时,这两个 C 函数会从栈中返回一个随机整数值(因此,该值无任何意义)。然而,可以对 `ctypes` 进行配置,让这些函数返回 `None` (Python 中为 `null` 类型)。下面是对 `prime_factors` 函数的配置: + +``` +primes.prime_factors.restype = None +``` + +可以用类似的语句处理 `goldbach` 函数。 + +下面的交互示例(在 Python3 中)展示了在 Python 客户程序和 `primes` 库之间的接口是简单明了的。 + +``` +>>> from ctypes import cdll + +>>> primes = cdll.LoadLibrary("libshprimes.so") ## 逻辑名 + +>>> primes.is_prime(13) +1 +>>> primes.is_prime(12) +0 + +>>> primes.are_coprimes(8, 24) +0 +>>> primes.are_coprimes(8, 25) +1 + +>>> primes.prime_factors.restype = None +>>> primes.goldbach.restype = None + +>>> primes.prime_factors(72) +2 2 2 3 3 + +>>> primes.goldbach(32) +32 = 3 + 29 +32 = 13 + 19 +``` + +在 `primes` 库中的函数只使用一个简单数据类型:`unsigned int`。如果这个 C 语言库使用复杂的类型如结构体,如果库函数传递和返回指向结构体的指针,那么比 `ctypes` 更强大的 FFI 更适合作为一个在 Python 语言和 C 语言之间的平滑接口。尽管如此,`ctypes` 示例展示了一个 Python 客户程序可以使用 C 语言编写的库。值得注意的是,用作科学计算的流行的 `Numpy` 库是用 C 语言编写的,然后在高级 Python API 中公开。 + +简单的 `primes` 库和高级的 `Numpy` 库强调了 C 语言仍然是编程语言中的通用语言。几乎每一个语言都可以与 C 语言交互,同时通过 C 语言也可以和任何其他语言交互。Python 很容易和 C 语言交互,作为另外一个例子,当 [Panama 项目](https://openjdk.java.net/projects/panama) 成为 Java Native Interface(JNI)一个替代品后,Java 语言和 C 语言交互也会变的很容易。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/2/linux-software-libraries + +作者:[Marty Kalin][a] +选题:[lujun9972][b] +译者:[萌新阿岩](https://github.com/mengxinayan) +校对:[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_003499_01_linux31x_cc.png?itok=Pvim4U-B (5 pengiuns floating on iceburg) +[2]: https://en.wikipedia.org/wiki/Christian_Goldbach +[3]: https://condor.depaul.edu/mkalin +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[5]: http://www.opengroup.org/onlinepubs/009695399/functions/sqrt.html +[6]: https://openjdk.java.net/projects/panama diff --git a/published/202105/20210212 Network address translation part 2 - the conntrack tool.md b/published/202105/20210212 Network address translation part 2 - the conntrack tool.md new file mode 100644 index 0000000000..6a779f4a74 --- /dev/null +++ b/published/202105/20210212 Network address translation part 2 - the conntrack tool.md @@ -0,0 +1,133 @@ +[#]: collector: (lujun9972) +[#]: translator: (cooljelly) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13373-1.html) +[#]: subject: (Network address translation part 2 – the conntrack tool) +[#]: via: (https://fedoramagazine.org/network-address-translation-part-2-the-conntrack-tool/) +[#]: author: (Florian Westphal https://fedoramagazine.org/author/strlen/) + +网络地址转换(NAT)之连接跟踪工具 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/09/120958wwocez99o2nofw8s.jpg) + +这是有关网络地址转换network address translation(NAT)的系列文章中的第二篇。之前的第一篇文章介绍了 [如何使用 iptables/nftables 的报文跟踪功能][2] 来定位 NAT 相关的连接问题。作为第二部分,本文介绍 `conntrack` 命令,它允许你查看和修改被跟踪的连接。 + +### 引言 + +通过 iptables 或 nftables 配置的 NAT 建立在 netfilters 连接跟踪子系统之上。`conntrack` 命令作为 “conntrack-tools” 软件包的一部分,用于查看和更改连接状态表。 + +### 连接跟踪状态表 + +连接跟踪子系统会跟踪它看到的所有报文流。运行 `sudo conntrack -L` 可查看其内容: + +``` +tcp 6 43184 ESTABLISHED src=192.168.2.5 dst=10.25.39.80 sport=5646 dport=443 src=10.25.39.80 dst=192.168.2.5 sport=443 dport=5646 [ASSURED] mark=0 use=1 +tcp 6 26 SYN_SENT src=192.168.2.5 dst=192.168.2.10 sport=35684 dport=443 [UNREPLIED] src=192.168.2.10 dst=192.168.2.5 sport=443 dport=35684 mark=0 use=1 +udp 17 29 src=192.168.8.1 dst=239.255.255.250 sport=48169 dport=1900 [UNREPLIED] src=239.255.255.250 dst=192.168.8.1 sport=1900 dport=48169 mark=0 use=1 +``` + +上述显示结果中,每行表示一个连接跟踪项。你可能会注意到,每行相同的地址和端口号会出现两次,而且第二次出现的源地址/端口对和目标地址/端口对会与第一次正好相反!这是因为每个连接跟踪项会先后两次被插入连接状态表。第一个四元组(源地址、目标地址、源端口、目标端口)记录的是原始方向的连接信息,即发送者发送报文的方向。而第二个四元组则记录的是连接跟踪子系统期望收到的对端回复报文的连接信息。这解决了两个问题: + + 1. 如果报文匹配到一个 NAT 规则,例如 IP 地址伪装,相应的映射信息会记录在链接跟踪项的回复方向部分,并自动应用于同一条流的所有后续报文。 + 2. 即使一条流经过了地址或端口的转换,也可以成功在连接状态表中查找到回复报文的四元组信息。 + +原始方向的(第一个显示的)四元组信息永远不会改变:它就是发送者发送的连接信息。NAT 操作只会修改回复方向(第二个)四元组,因为这是接受者看到的连接信息。修改第一个四元组没有意义:netfilter 无法控制发起者的连接状态,它只能在收到/转发报文时对其施加影响。当一个报文未映射到现有连接表项时,连接跟踪可以为其新建一个表项。对于 UDP 报文,该操作会自动进行。对于 TCP 报文,连接跟踪可以配置为只有 TCP 报文设置了 [SYN 标志位][3] 才新建表项。默认情况下,连接跟踪会允许从流的中间报文开始创建,这是为了避免对启用连接跟踪之前就存在的流处理出现问题。 + +### 连接跟踪状态表和 NAT + +如上一节所述,回复方向的四元组包含 NAT 信息。你可以通过命令过滤输出经过源地址 NAT 或目标地址 NAT 的连接跟踪项。通过这种方式可以看到一个指定的流经过了哪种类型的 NAT 转换。例如,运行 `sudo conntrack -L -p tcp –src-nat` 可显示经过源 NAT 的连接跟踪项,输出结果类似于以下内容: + +``` +tcp 6 114 TIME_WAIT src=10.0.0.10 dst=10.8.2.12 sport=5536 dport=80 src=10.8.2.12 dst=192.168.1.2 sport=80 dport=5536 [ASSURED] +``` + +这个连接跟踪项表示一条从 10.0.0.10:5536 到 10.8.2.12:80 的连接。与前面示例不同的是,回复方向的四元组不是原始方向四元组的简单翻转:源地址已修改。目标主机(10.8.2.12)将回复数据包发送到 192.168.1.2,而不是 10.0.0.10。每当 10.0.0.10 发送新的报文时,具有此连接跟踪项的路由器会将源地址替换为 192.168.1.2。当 10.8.2.12 发送回复报文时,该路由器将目的地址修改回 10.0.0.10。上述源 NAT 行为源自一条 [NFT 伪装][4] 规则: + +``` +inet nat postrouting meta oifname "veth0" masquerade +``` + +其他类型的 NAT 规则,例如目标地址 DNAT 规则或重定向规则,其连接跟踪项也会以类似的方式显示,回复方向四元组的远端地址或端口与原始方向四元组的远端地址或端口不同。 + +### 连接跟踪扩展 + +连接跟踪的记帐功能和时间戳功能是两个有用的扩展功能。运行 `sudo sysctl net.netfilter.nf_conntrack_acct=1` 可以在运行 `sudo conntrack -L` 时显示每个流经过的字节数和报文数。运行 `sudo sysctl net.netfilter.nf_conntrack_timestamp=1` 为每个连接记录一个开始时间戳,之后每次运行 `sudo conntrack -L` 时都可以显示这个流从开始经过了多少秒。在上述命令中增加 `–output ktimestamp` 选项也可以看到流开始的绝对时间。 + +### 插入和更改连接跟踪项 + +你可以手动为状态表添加连接跟踪项,例如: + +``` +sudo conntrack -I -s 192.168.7.10 -d 10.1.1.1 --protonum 17 --timeout 120 --sport 12345 --dport 80 +``` + +这项命令通常被 conntrackd 用于状态复制,即将主防火墙的连接跟踪项复制到备用防火墙系统。于是当切换发生的时候,备用系统可以接管已经建立的连接且不会造成中断。连接跟踪还可以存储报文的带外元数据,例如连接跟踪标记和连接跟踪标签。可以用更新选项(`-U`)来修改它们: + +``` +sudo conntrack -U -m 42 -p tcp +``` + +这条命令将所有的 TCP 流的连接跟踪标记修改为 42。 + +### 删除连接跟踪项 + +在某些情况下,你可能想从状态表中删除条目。例如,对 NAT 规则的修改不会影响表中已存在流的经过报文。因此对 UDP 长连接(例如像 VXLAN 这样的隧道协议),删除表项可能很有意义,这样新的 NAT 转换规则才能生效。可以通过 `sudo conntrack -D` 命令附带可选的地址和端口列表选项,来删除相应的表项,如下例所示: + +``` +sudo conntrack -D -p udp --src 10.0.12.4 --dst 10.0.0.1 --sport 1234 --dport 53 +``` + +### 连接跟踪错误计数 + +`conntrack` 也可以输出统计数字: + +``` +# sudo conntrack -S +cpu=0 found=0 invalid=130 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=10 +cpu=1 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=0 +cpu=2 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=1 +cpu=3 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=0 +``` + +大多数计数器将为 0。`Found` 和 `insert` 数将始终为 0,它们只是为了后向兼容。其他错误计数包括: + + * `invalid`:报文既不匹配已有连接跟踪项,也未创建新连接。 + * `insert_failed`:报文新建了一个连接,但插入状态表时失败。这在 NAT 引擎在伪装时恰好选择了重复的源地址和端口时可能出现。 + * `drop`:报文新建了一个连接,但是没有可用的内存为其分配新的状态条目。 + * `early_drop`:连接跟踪表已满。为了接受新的连接,已有的未看到双向报文的连接被丢弃。 + * `error`:icmp(v6) 收到与已知连接不匹配的 icmp 错误数据包。 + * `search_restart`:查找过程由于另一个 CPU 的插入或删除操作而中断。 + * `clash_resolve`:多个 CPU 试图插入相同的连接跟踪条目。 + +除非经常发生,这些错误条件通常无害。一些错误可以通过针对预期工作负载调整连接跟踪子系统的参数来降低其发生概率,典型的配置包括 `net.netfilter.nf_conntrack_buckets` 和 `net.netfilter.nf_conntrack_max` 参数。可在 [nf_conntrack-sysctl 文档][5] 中查阅相应配置参数的完整列表。 + +当报文状态是 `invalid` 时,请使用 `sudo sysctl net.netfilter.nf_conntrack_log_invalid=255` 来获取更多信息。例如,当连接跟踪遇到一个所有 TCP 标志位均为 0 的报文时,将记录以下内容: + +``` +nf_ct_proto_6: invalid tcp flag combination SRC=10.0.2.1 DST=10.0.96.7 LEN=1040 TOS=0x00 PREC=0x00 TTL=255 ID=0 PROTO=TCP SPT=5723 DPT=443 SEQ=1 ACK=0 +``` + +### 总结 + +本文介绍了如何检查连接跟踪表和存储在跟踪流中的 NAT 信息。本系列的下一部分将延伸讨论连接跟踪工具和连接跟踪事件框架。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/network-address-translation-part-2-the-conntrack-tool/ + +作者:[Florian Westphal][a] +选题:[lujun9972][b] +译者:[cooljelly](https://github.com/cooljelly) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/strlen/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/02/network-address-translation-part-2-816x345.jpg +[2]: https://linux.cn/article-13364-1.html +[3]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure +[4]: https://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT)#Masquerading +[5]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/networking/nf_conntrack-sysctl.rst diff --git a/published/202105/20210218 Not an engineer- Find out where you belong.md b/published/202105/20210218 Not an engineer- Find out where you belong.md new file mode 100644 index 0000000000..a043bab7fc --- /dev/null +++ b/published/202105/20210218 Not an engineer- Find out where you belong.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: (max27149) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13445-1.html) +[#]: subject: (Not an engineer? Find out where you belong) +[#]: via: (https://opensource.com/article/21/2/advice-non-technical) +[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) + +不是程序员?那就找到自己的定位 +=== + +> 无论你是已经工作了几十年的还是刚开始从业的非工程型技术人,此建议都可以帮助你确定你的位置归属。 + +![](https://img.linux.net.cn/data/attachment/album/202105/31/192647jl354n1jezx1ea1c.jpg) + +在 [本系列第一篇文章][2] 中 ,我解释了将人员和角色分为“技术”或“非技术”类别的问题。在 [第二篇文章][3] 中,我为不写代码的人分享了一些技术岗位角色。这一次,我将把这次探索总结为——“技术或非技术意味着什么”,并提供一些能够在职业发展上帮到你的建议。 + +无论你是已经从事技术工作数十年,或是刚刚起步,还是正在寻求职业变更,请考虑本文中来自非技术人员但在技术角色方面取得成功的人士的建议。 + +> “不要把你的工作和身份捆绑起来 —— 把它们分开。” +> +> —— Adam Gordon Bell,Earthly Technologies 开发者关系部 + +转换角色,并不意味着你的技能会消失且你不再具有价值。如果你担任了新角色,则需要专注于该角色的关键技能。培养技能是需要时间的。花点时间,找出新职位的重要技能。 + +如果你管理工程师们,请鼓励他们提升技术技能的同时发展非工程技能,这些技能往往能比编程能力和技术技能对职业发展和成功产生更显著的变化。 + +### 做你自己 + +> “不要让其他人定义你是技术人员还是非技术人员。什么是技术人员,什么不是技术人员,以及这是否重要,是人们必须自己搞清楚的事情。” +> +> —— Adam Gordon Bell + +> “永远不要用‘我不是技术人员’为开头进行对话。因为很可能让对方产生‘这点我需要提醒你’的想法,这在面试的时候可从来不会留下好印象,而且还有可能会让人觉得你对自己技能缺乏信心。” +> +> —— Mary Thengvall,Camunda 开发者关系总监 + +避免刻板成见;不是所有的工程师都喜欢《星球大战》或《星际迷航》。不是所有工程师都穿连帽卫衣。工程师也可以和别人交流。 + +> “单单就你的行为举止,旁人就有很多关于技术或非技术方面的看法。在办公室工作的时候,我会穿裙子,因为只有这样我才能舒服一点。” +> +> —— Shailvi Wakhlu,Strava 高级数据总监 + +### 了解你的价值 + +正如我在第一篇文章中讨论的那样,被打上“非技术”的标签会导致 [冒充者综合症][4]。承认自己的价值,不要在自己身上贴上“非技术”标签,因为它会限制你的收入潜力和职业发展。 + +> “人们之所以把我重新包装成其他东西,是因为他们认为我和工程师的刻板印象不一样。我很高兴我没有听这些人的话,因为他们本质上是在告诉我,在我拥有的技能之外,去找一份低薪的工作。” +> +> —— Shailvi Wakhlu + +> “年轻的或者女性技术人,特别是刚接触技术的女性,更容易患上冒名综合症,认为自己技术不够好。比如,‘哦,我只会前端。’,什​​么叫你*只会*前端?前端也很难的好吧。” +> +> —— Liz Harris + +### 寻找那些可以提升价值并帮到人们的地方 + +你不需要创建 PR 就可以参与开源。 + +> “当有人想为开源项目做点贡献时,我总是对他说,‘不要想着,得是一个提交才行、得提一个 PR 才可以。’这就好像,‘不行。怎么才能为那个项目贡献点价值呢?’ 如果你没时间提交 PR,那你是不是提个议题并把要点写下来?” +> +> —— Eddie Jaoude,Jaoude Studios 开源程序员 + +### 思维的多样性有助于事业成功 + +看看所有角色和人员的价值和贡献。不要根据头衔将人归到同能力的一组。 + +> “要认识到,所有人(包括自己在内),在任何时候,以及事情全貌的重要性。创造力这个事儿不应该由自我驱动。要知道,对于你所做的事情,你可以做的更好,也可以做的更糟。不要害怕寻求帮助,知道到我们在一起。” +> +> —— Therese Eberhard,电影/广告和视频场景画师 + +> “在我参加过的黑客马拉松中,我们都是技术人员,组建了一支四五个硬核程序员组成的强大团队,但我们输了。我不骗你,我们输了。在新冠疫情之前,我赢了前六次的黑客马拉松,而且当时团队中一半的人属于其他领域的专家。在我们赢过的比赛中,大多数人会认为团队一半人是非技术的,尽管我不喜欢这个术语,因为这像是给团队/项目贴金。我们之所以获胜,是因为我们对所构建的东西有很多不同的看法。” +> +> —— Eddie Jaoude + +> “我们越能摆脱‘技术/非技术’、‘开发人员/非开发人员’的标签,并理解到一个连续统一的整体存在,我们就越能全力以赴地雇用到合适的人来做这项工作,只要不被你需要‘技术团队’的假设所困扰。” +> +> —— Mary Thengvall + +我们的社区和团队越多样化,它们的包容性就越大。 + +> “老实说,无论是从社区角度还是从产品角度,我认为,总的来说,最重要的事情都是,我们应该确保我们建立的是一个包容性的社区,这不仅是为了我们的产品,也不仅是为了我们正在使用的技术,还为了整个人类社会,我想……我敢打赌,如果我们做到了这一点,那么作为人类,我们就比过去更进步了。” +> +> —— Leon Stigter,Lightbend 高级产品经理 + +如果你以非程序员的技术身份工作,你会给那些认为自己“非技术”的人(或被他人认为是“非技术”的人)提供什么建议? 在评论中分享你的见解。 + +--- + +via: https://opensource.com/article/21/2/advice-non-technical + +作者:[Dawn Parzych][a] +选题:[lujun9972][b] +译者:[max27149](https://github.com/max27149) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dawnparzych +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/career_journey_road_gps_path_map_520.png?itok=PpL6jJgY (Looking at a map for career journey) +[2]: https://linux.cn/article-13168-1.html +[3]: https://linux.cn/article-13178-1.html +[4]: https://opensource.com/business/15/9/tips-avoiding-impostor-syndrome + diff --git a/published/202105/20210325 How to use the Linux sed command.md b/published/202105/20210325 How to use the Linux sed command.md new file mode 100644 index 0000000000..fa8818a8e2 --- /dev/null +++ b/published/202105/20210325 How to use the Linux sed command.md @@ -0,0 +1,184 @@ +[#]: subject: "How to use the Linux sed command" +[#]: via: "https://opensource.com/article/21/3/sed-cheat-sheet" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13417-1.html" + +使用 sed 命令进行复制、剪切和粘贴 +====== + +> 了解 sed 的基本用法,然后下载我们的备忘单,方便快速地参考 Linux 流编辑器。 + +![](https://img.linux.net.cn/data/attachment/album/202105/23/181625abgrg4dsbw4y4fue.jpg) + +很少有 Unix 命令像 `sed`、[grep][2] 和 [awk][3] 一样出名,它们经常组合在一起,可能是因为它们具有奇怪的名称和强大的文本解析能力。它们还在一些语法和逻辑上有相似之处。虽然它们都能用于文本解析,但都有其特殊性。本文研究 `sed` 命令,它是一个 流编辑器stream editor。 + +我之前写过关于 [sed][4] 以及它的远亲 [ed][5] 的文章。要熟悉 `sed`,对 `ed` 有一点了解是有帮助的,因为这有助于你熟悉缓冲区的概念。本文假定你熟悉 `sed` 的基本知识,这意味着你至少已经运行过经典的 `s/foo/bar` 风格的查找和替换命令。 + +- 下载我们的免费 [sed 备忘录][6] + +### 安装 sed + +如果你使用的是 Linux、BSD 或 macOS,那么它们已经安装了 GNU 的或 BSD 的 sed。这些是原始 `sed` 命令的独特重新实现。虽然它们很相似,但也有一些细微的差别。本文已经在 Linux 和 NetBSD 版本上进行了测试,所以你可以使用你的计算机上找到的任何 sed,但是对于 BSD sed,你必须使用短选项(例如 `-n` 而不是 `--quiet`)。 + +GNU sed 通常被认为是功能最丰富的 sed,因此无论你是否运行 Linux,你可能都想要尝试一下。如果在 Ports 树中找不到 GNU sed(在非 Linux 系统上通常称为 gsed),你可以从 GNU 网站 [下载源代码][7]。 安装 GNU sed 的好处是,你可以使用它的额外功能,但是如果需要可移植性,还可以限制它以遵守 sed 的 [POSIX][8] 规范。 + +MacOS 用户可以在 [MacPorts][9] 或 [Homebrew][10] 上找到 GNU sed。 + +在 Windows 上,你可以通过 [Chocolatey][12] 来 [安装 GNU sed][11]。 + +### 了解模式空间和保留空间 + +sed 一次只能处理一行。因为它没有可视化模式,所以会创建一个 模式空间pattern space,这是一个内存空间,其中包含来自输入流的当前行(删除了尾部的任何换行符)。填充模式空间后,sed 将执行你的指令。当命令执行完时,sed 将模式空间中的内容打印到输出流,默认是 **标准输出**,但是可以将输出重定向到文件,甚至使用 `--in-place=.bak` 选项重定向到同一文件。 + +然后,循环从下一个输入行再次开始。 + +为了在遍历文件时提供一点灵活性,sed 还提供了保留空间hold space(有时也称为 保留缓冲区hold buffer),即 sed 内存中为临时数据存储保留的空间。你可以将保留空间当作剪贴板,实际上,这正是本文所演示的内容:如何使用 sed 复制/剪切和粘贴。 + +首先,创建一个示例文本文件,其内容如下: + +``` +Line one +Line three +Line two +``` + +### 复制数据到保留空间 + +要将内容放置在 sed 的保留空间,使用 `h` 或 `H` 命令。小写的 `h` 告诉 sed 覆盖保留空间中的当前内容,而大写的 `H` 告诉 sed 将数据追加到保留空间中已经存在的内容之后。 + +单独使用,什么都看不到: + +``` +$ sed --quiet -e '/three/ h' example.txt +$ +``` + +`--quiet`(缩写为 `-n`)选项禁止显示所有输出,但 sed 执行了我的搜索需求。在这种情况下,sed 选择包含字符串 `three` 的任何行,并将其复制到保留空间。我没有告诉 sed 打印任何东西,所以没有输出。 + +### 从保留空间复制数据 + +要了解保留空间,你可以从保留空间复制内容,然后使用 `g` 命令将其放入模式空间,观察会发生什么: + +``` +$ sed -n -e '/three/h' -e 'g;p' example.txt + +Line three +Line three +``` + +第一个空白行是因为当 sed 第一次复制内容到模式空间时,保留空间为空。 + +接下来的两行包含 `Line three` 是因为这是从第二行开始的保留空间。 + +该命令使用两个唯一的脚本(`-e`)纯粹是为了帮助提高可读性和组织性。将步骤划分为单独的脚本可能会很有用,但是从技术上讲,以下命令与一个脚本语句一样有效: + +``` +$ sed -n -e '/three/h ; g ; p' example.txt + +Line three +Line three +``` + +### 将数据追加到模式空间 + +`G` 命令会将一个换行符和保留空间的内容添加到模式空间。 + +``` +$ sed -n -e '/three/h' -e 'G;p' example.txt +Line one + +Line three +Line three +Line two +Line three +``` + +此输出的前两行同时包含模式空间(`Line one`)的内容和空的保留空间。接下来的两行与搜索文本(`three`)匹配,因此它既包含模式空间又包含保留空间。第三行的保留空间没有变化,因此在模式空间(`Line two`)的末尾是保留空间(仍然是 `Line three`)。 + +### 用 sed 剪切和粘贴 + +现在你知道了如何将字符串从模式空间转到保留空间并再次返回,你可以设计一个 sed 脚本来复制、删除,然后在文档中粘贴一行。例如,将示例文件的 `Line three` 挪至第三行,sed 可以解决这个问题: + +``` +$ sed -n -e '/three/ h' -e '/three/ d' \ +-e '/two/ G;p' example.txt +Line one +Line two +Line three +``` + + * 第一个脚本找到包含字符串 `three` 的行,并将其从模式空间复制到保留空间,替换当前保留空间中的任何内容。 + * 第二个脚本删除包含字符串 `three` 的任何行。这样就完成了与文字处理器或文本编辑器中的 _剪切_ 动作等效的功能。 + * 最后一个脚本找到包含字符串 `two` 的行,并将保留空间的内容_追加_到模式空间,然后打印模式空间。 + +任务完成。 + +### 使用 sed 编写脚本 + +再说一次,使用单独的脚本语句纯粹是为了视觉和心理上的简单。剪切和粘贴命令作为一个脚本同样有效: + +``` +$ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt +Line one +Line two +Line three +``` + +它甚至可以写在一个专门的脚本文件中: + +``` +#!/usr/bin/sed -nf + +/three/h +/three/d +/two/ G +p +``` + +要运行该脚本,将其加入可执行权限,然后用示例文件尝试: + +``` +$ chmod +x myscript.sed +$ ./myscript.sed example.txt +Line one +Line two +Line three +``` + +当然,你需要解析的文本越可预测,则使用 sed 解决问题越容易。发明 sed 操作(例如复制和粘贴)的“配方”通常是不切实际的,因为触发操作的条件可能因文件而异。但是,你对 sed 命令的使用越熟练,就越容易根据需要解析的输入来设计复杂的动作。 + +重要的事情是识别不同的操作,了解 sed 何时移至下一行,并预测模式和保留空间包含的内容。 + +### 下载备忘单 + +sed 很复杂。虽然它只有十几个命令,但它灵活的语法和原生功能意味着它充满了无限的潜力。为了充分利用 sed,我曾经参考过一些巧妙的单行命令,但是直到我开始发明(有时是重新发明)自己的解决方案时,我才觉得自己真正开始学习 sed 了 。如果你正在寻找命令提示和语法方面的有用技巧,[下载我们的 sed 备忘单][6],然后开始一劳永逸地学习 sed! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/sed-cheat-sheet + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_penguin_green.png?itok=ENdVzW22 "Penguin with green background" +[2]: https://opensource.com/article/21/3/grep-cheat-sheet +[3]: https://opensource.com/article/20/9/awk-ebook +[4]: https://opensource.com/article/20/12/sed +[5]: https://opensource.com/article/20/12/gnu-ed +[6]: https://opensource.com/downloads/sed-cheat-sheet +[7]: http://www.gnu.org/software/sed/ +[8]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[9]: https://opensource.com/article/20/11/macports +[10]: https://opensource.com/article/20/6/homebrew-mac +[11]: https://chocolatey.org/packages/sed +[12]: https://opensource.com/article/20/3/chocolatey \ No newline at end of file diff --git a/published/202105/20210330 Access Python package index JSON APIs with requests.md b/published/202105/20210330 Access Python package index JSON APIs with requests.md new file mode 100644 index 0000000000..437bd5c3ea --- /dev/null +++ b/published/202105/20210330 Access Python package index JSON APIs with requests.md @@ -0,0 +1,208 @@ +[#]: subject: "Access Python package index JSON APIs with requests" +[#]: via: "https://opensource.com/article/21/3/python-package-index-json-apis-requests" +[#]: author: "Ben Nuttall https://opensource.com/users/bennuttall" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13356-1.html" + +使用 requests 访问 Python 包索引(PyPI)的 JSON API +====== + +> PyPI 的 JSON API 是一种机器可直接使用的数据源,你可以访问和你浏览网站时相同类型的数据。 + +![](https://img.linux.net.cn/data/attachment/album/202105/03/111943du0lgbjj6br6sruu.jpg) + +PyPI(Python 软件包索引)提供了有关其软件包信息的 JSON API。本质上,它是机器可以直接使用的数据源,与你在网站上直接访问是一样的的。例如,作为人类,我可以在浏览器中打开 [Numpy][2] 项目页面,点击左侧相关链接,查看有哪些版本,哪些文件可用以及发行日期和支持的 Python 版本等内容: + +![NumPy project page][3] + +但是,如果我想编写一个程序来访问此数据,则可以使用 JSON API,而不必在这些页面上抓取和解析 HTML。 + +顺便说一句:在旧的 PyPI 网站上,还托管在 `pypi.python.org` 时,NumPy 的项目页面位于 `pypi.python.org/pypi/numpy`,访问其 JSON API 也很简单,只需要在最后面添加一个 `/json` ,即 `https://pypi.org/pypi/numpy/json`。现在,PyPI 网站托管在 `pypi.org`,NumPy 的项目页面是 `pypi.org/project/numpy`。新站点不会有单独的 JSON API URL,但它仍像以前一样工作。因此,你不必在 URL 后添加 `/json`,只要记住 URL 就够了。 + +你可以在浏览器中打开 NumPy 的 JSON API URL,Firefox 很好地渲染了数据: + +![JSON rendered in Firefox][5] + +你可以查看 `info`,`release` 和 `urls` 其中的内容。或者,你可以将其加载到 Python Shell 中,以下是几行入门教程: + +``` +import requests +url = "https://pypi.org/pypi/numpy/json" +r = requests.get(url) +data = r.json() +``` + +获得数据后(调用 `.json()` 提供了该数据的 [字典][6]),你可以对其进行查看: + +![Inspecting data][7] + +查看 `release` 中的键: + +![Inspecting keys in releases][8] + +这表明 `release` 是一个以版本号为键的字典。选择一个并查看以下内容: + +![Inspecting version][9] + +每个版本都包含一个列表,`release` 包含 24 项。但是每个项目是什么?由于它是一个列表,因此你可以索引第一项并进行查看: + +![Indexing an item][10] + +这是一个字典,其中包含有关特定文件的详细信息。因此,列表中的 24 个项目中的每一个都与此特定版本号关联的文件相关,即在 列出的 24 个文件。 + +你可以编写一个脚本在可用数据中查找内容。例如,以下的循环查找带有 sdist(源代码包)的版本,它们指定了 `requires_python` 属性并进行打印: + +``` +for version, files in data['releases'].items(): +    for f in files: +        if f.get('packagetype') == 'sdist' and f.get('requires_python'): +            print(version, f['requires_python']) +``` + +![sdist files with requires_python attribute][11] + +### piwheels + +去年,我在 piwheels 网站上[实现了类似的 API][12]。[piwheels.org][13] 是一个 Python 软件包索引,为树莓派架构提供了 wheel(预编译的二进制软件包)。它本质上是 PyPI 软件包的镜像,但带有 Arm wheel,而不是软件包维护者上传到 PyPI 的文件。 + +由于 piwheels 模仿了 PyPI 的 URL 结构,因此你可以将项目页面 URL 的 `pypi.org` 部分更改为 `piwheels.org`。它将向你显示类似的项目页面,其中详细说明了构建的版本和可用的文件。由于我喜欢旧站点允许你在 URL 末尾添加 `/json` 的方式,所以我也支持这种方式。NumPy 在 PyPI 上的项目页面为 [pypi.org/project/numpy][14],在 piwheels 上,它是 [piwheels.org/project/numpy][15],而 JSON API 是 [piwheels.org/project/numpy/json][16] 页面。 + +没有必要重复 PyPI API 的内容,所以我们提供了 piwheels 上可用内容的信息,包括所有已知发行版的列表,一些基本信息以及我们拥有的文件列表: + +![JSON files available in piwheels][17] + +与之前的 PyPI 例子类似,你可以创建一个脚本来分析 API 内容。例如,对于每个 NumPy 版本,其中有多少 piwheels 文件: + +``` +import requests + +url = "https://www.piwheels.org/project/numpy/json" +package = requests.get(url).json() + +for version, info in package['releases'].items(): +    if info['files']: +        print('{}: {} files'.format(version, len(info['files']))) +    else: +        print('{}: No files'.format(version)) +``` + +此外,每个文件都包含一些元数据: + +![Metadata in JSON files in piwheels][18] + +方便的是 `apt_dependencies` 字段,它列出了使用该库所需的 Apt 软件包。本例中的 NumPy 文件,或者通过 `pip` 安装 Numpy,你还需要使用 Debian 的 `apt` 包管理器安装 `libatlas3-base` 和 `libgfortran`。 + +以下是一个示例脚本,显示了程序包的 Apt 依赖关系: + + +``` +import requests + +def get_install(package, abi): +    url = 'https://piwheels.org/project/{}/json'.format(package) +    r = requests.get(url) +    data = r.json() +    for version, release in sorted(data['releases'].items(), reverse=True): +        for filename, file in release['files'].items(): +            if abi in filename: +                deps = ' '.join(file['apt_dependencies']) +                print("sudo apt install {}".format(deps)) +                print("sudo pip3 install {}=={}".format(package, version)) +                return + +get_install('opencv-python', 'cp37m') +get_install('opencv-python', 'cp35m') +get_install('opencv-python-headless', 'cp37m') +get_install('opencv-python-headless', 'cp35m') +``` + +我们还为软件包列表提供了一个通用的 API 入口,其中包括每个软件包的下载统计: + +```python +import requests + +url = "https://www.piwheels.org/packages.json" +packages = requests.get(url).json() +packages = { +    pkg: (d_month, d_all) +    for pkg, d_month, d_all, *_ in packages +} + +package = 'numpy' +d_month, d_all = packages[package] + +print(package, "has had", d_month, "downloads in the last month") +print(package, "has had", d_all, "downloads in total") +``` + +### pip search + +`pip search` 因为其 XMLRPC 接口过载而被禁用,因此人们一直在寻找替代方法。你可以使用 piwheels 的 JSON API 来搜索软件包名称,因为软件包的集合是相同的: + +``` +#!/usr/bin/python3 +import sys + +import requests + +PIWHEELS_URL = 'https://www.piwheels.org/packages.json' + +r = requests.get(PIWHEELS_URL) +packages = {p[0] for p in r.json()} + +def search(term): +    for pkg in packages: +        if term in pkg: +            yield pkg + +if __name__ == '__main__': +    if len(sys.argv) == 2: +        results = search(sys.argv[1].lower()) +        for res in results: +            print(res) +    else: +        print("Usage: pip_search TERM") +``` + +有关更多信息,参考 piwheels 的 [JSON API 文档][19]. + +* * * + +_本文最初发表在 Ben Nuttall 的 [Tooling Tuesday 博客上][20],经许可转载使用。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/3/python-package-index-json-apis-requests + +作者:[Ben Nuttall][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/bennuttall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_programming_question.png?itok=cOeJW-8r "Python programming language logo with question marks" +[2]: https://pypi.org/project/numpy/ +[3]: https://opensource.com/sites/default/files/uploads/numpy-project-page.png "NumPy project page" +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/pypi-json-firefox.png "JSON rendered in Firefox" +[6]: https://docs.python.org/3/tutorial/datastructures.html#dictionaries +[7]: https://opensource.com/sites/default/files/uploads/pypi-json-notebook.png "Inspecting data" +[8]: https://opensource.com/sites/default/files/uploads/pypi-json-releases.png "Inspecting keys in releases" +[9]: https://opensource.com/sites/default/files/uploads/pypi-json-inspect.png "Inspecting version" +[10]: https://opensource.com/sites/default/files/uploads/pypi-json-release.png "Indexing an item" +[11]: https://opensource.com/sites/default/files/uploads/pypi-json-requires-python.png "sdist files with requires_python attribute " +[12]: https://blog.piwheels.org/requires-python-support-new-project-page-layout-and-a-new-json-api/ +[13]: https://www.piwheels.org/ +[14]: https://pypi.org/project/numpy +[15]: https://www.piwheels.org/project/numpy +[16]: https://www.piwheels.org/project/numpy/json +[17]: https://opensource.com/sites/default/files/uploads/piwheels-json.png "JSON files available in piwheels" +[18]: https://opensource.com/sites/default/files/uploads/piwheels-json-numpy.png "Metadata in JSON files in piwheels" +[19]: https://www.piwheels.org/json.html +[20]: https://tooling.bennuttall.com/accessing-python-package-index-json-apis-with-requests/ diff --git a/published/202105/20210331 A tool to spy on your DNS queries- dnspeep.md b/published/202105/20210331 A tool to spy on your DNS queries- dnspeep.md new file mode 100644 index 0000000000..c194b860c8 --- /dev/null +++ b/published/202105/20210331 A tool to spy on your DNS queries- dnspeep.md @@ -0,0 +1,154 @@ +[#]: subject: (A tool to spy on your DNS queries: dnspeep) +[#]: via: (https://jvns.ca/blog/2021/03/31/dnspeep-tool/) +[#]: author: (Julia Evans https://jvns.ca/) +[#]: collector: (lujun9972) +[#]: translator: (wyxplus) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13353-1.html) + +dnspeep:监控 DNS 查询的工具 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/02/191521i4ycjm7veln426vy.jpg) + +在过去的几天中,我编写了一个叫作 [dnspeep][1] 的小工具,它能让你看到你电脑中正进行的 DNS 查询,并且还能看得到其响应。它现在只有 [250 行 Rust 代码][2]。 + +我会讨论如何去尝试它、能做什么、为什么我要编写它,以及当我在开发时所遇到的问题。 + +### 如何尝试 + +我构建了一些二进制文件,因此你可以快速尝试一下。 + +对于 Linux(x86): + +``` +wget https://github.com/jvns/dnspeep/releases/download/v0.1.0/dnspeep-linux.tar.gz +tar -xf dnspeep-linux.tar.gz +sudo ./dnspeep +``` + +对于 Mac: + +``` +wget https://github.com/jvns/dnspeep/releases/download/v0.1.0/dnspeep-macos.tar.gz +tar -xf dnspeep-macos.tar.gz +sudo ./dnspeep +``` + +它需要以超级用户root身份运行,因为它需要访问计算机正在发送的所有 DNS 数据包。 这与 `tcpdump` 需要以超级身份运行的原因相同:它使用 `libpcap`,这与 tcpdump 使用的库相同。 + +如果你不想在超级用户下运行下载的二进制文件,你也能在 查看源码并且自行编译。 + +### 输出结果是什么样的 + +以下是输出结果。每行都是一次 DNS 查询和响应: + +``` +$ sudo dnspeep +query name server IP response +A firefox.com 192.168.1.1 A: 44.235.246.155, A: 44.236.72.93, A: 44.236.48.31 +AAAA firefox.com 192.168.1.1 NOERROR +A bolt.dropbox.com 192.168.1.1 CNAME: bolt.v.dropbox.com, A: 162.125.19.131 +``` + +这些查询是来自于我在浏览器中访问的 `neopets.com`,而 `bolt.dropbox.com` 查询是因为我正在运行 Dropbox 代理,并且我猜它不时会在后台运行,因为其需要同步。 + +### 为什么我要开发又一个 DNS 工具? + +之所以这样做,是因为我认为当你不太了解 DNS 时,DNS 似乎真的很神秘! + +你的浏览器(和你电脑上的其他软件)一直在进行 DNS 查询,我认为当你能真正看到请求和响应时,似乎会有更多的“真实感”。 + +我写这个也把它当做一个调试工具。我想“这是 DNS 的问题?”的时候,往往很难回答。我得到的印象是,当尝试检查问题是否由 DNS 引起时,人们经常使用试错法或猜测,而不是仅仅查看计算机所获得的 DNS 响应。 + +### 你可以看到哪些软件在“秘密”使用互联网 + +我喜欢该工具的一方面是,它让我可以感知到我电脑上有哪些程序正使用互联网!例如,我发现在我电脑上,某些软件出于某些理由不断地向 `ping.manjaro.org` 发送请求,可能是为了检查我是否已经连上互联网了。 + +实际上,我的一个朋友用这个工具发现,他的电脑上安装了一些以前工作时的企业监控软件,但他忘记了卸载,因此你甚至可能发现一些你想要删除的东西。 + +### 如果你不习惯的话, tcpdump 会令人感到困惑 + +当我试图向人们展示他们的计算机正在进行的 DNS 查询时,我的第一感是想“好吧,使用 tcpdump”!而 `tcpdump` 确实可以解析 DNS 数据包! + +例如,下方是一次对 `incoming.telemetry.mozilla.org.` 的 DNS 查询结果: + +``` +11:36:38.973512 wlp3s0 Out IP 192.168.1.181.42281 > 192.168.1.1.53: 56271+ A? incoming.telemetry.mozilla.org. (48) +11:36:38.996060 wlp3s0 In IP 192.168.1.1.53 > 192.168.1.181.42281: 56271 3/0/0 CNAME telemetry-incoming.r53-2.services.mozilla.com., CNAME prod.data-ingestion.prod.dataops.mozgcp.net., A 35.244.247.133 (180) +``` + +绝对可以学着去阅读理解一下,例如,让我们分解一下查询: + +`192.168.1.181.42281 > 192.168.1.1.53: 56271+ A? incoming.telemetry.mozilla.org. (48)` + + * `A?` 意味着这是一次 A 类型的 DNS **查询** + * `incoming.telemetry.mozilla.org.` 是被查询的名称 + * `56271` 是 DNS 查询的 ID + * `192.168.1.181.42281` 是源 IP/端口 + * `192.168.1.1.53` 是目的 IP/端口 + * `(48)` 是 DNS 报文长度 + +在响应报文中,我们可以这样分解: + +`56271 3/0/0 CNAME telemetry-incoming.r53-2.services.mozilla.com., CNAME prod.data-ingestion.prod.dataops.mozgcp.net., A 35.244.247.133 (180)` + + * `3/0/0` 是在响应报文中的记录数:3 个回答,0 个权威记录,0 个附加记录。我认为 tcpdump 甚至只打印出回答响应报文。 + * `CNAME telemetry-incoming.r53-2.services.mozilla.com`、`CNAME prod.data-ingestion.prod.dataops.mozgcp.net.` 和 `A 35.244.247.133` 是三个响应记录。 + * `56271` 是响应报文 ID,和查询报文的 ID 相对应。这就是你如何知道它是对前一行请求的响应。 + +我认为,这种格式最难处理的是(作为一个只想查看一些 DNS 流量的人),你必须手动匹配请求和响应,而且它们并不总是相邻的行。这就是计算机擅长的事情! + +因此,我决定编写一个小程序(`dnspeep`)来进行匹配,并排除一些我认为多余的信息。 + +### 我在编写时所遇到的问题 + +在撰写本文时,我遇到了一些问题: + + * 我必须给 `pcap` 包打上补丁,使其能在 Mac 操作系统上和 Tokio 配合工作([这个更改][3])。这是其中的一个 bug,花了很多时间才搞清楚,用了 1 行代码才解决 :) + * 不同的 Linux 发行版似乎有不同的 `libpcap.so` 版本。所以我不能轻易地分发一个动态链接 libpcap 的二进制文件(你可以 [在这里][4] 看到其他人也有同样的问题)。因此,我决定在 Linux 上将 libpcap 静态编译到这个工具中。但我仍然不太了解如何在 Rust 中正确做到这一点作,但我通过将 `libpcap.a` 文件复制到 `target/release/deps` 目录下,然后直接运行 `cargo build`,使其得以工作。 + * 我使用的 `dns_parser` carte 并不支持所有 DNS 查询类型,只支持最常见的。我可能需要更换一个不同的工具包来解析 DNS 数据包,但目前为止还没有找到合适的。 + * 因为 `pcap` 接口只提供原始字节(包括以太网帧),所以我需要 [编写代码来计算从开头剥离多少字节才能获得数据包的 IP 报头][5]。我很肯定我还遗漏了一些情形。 + +我对于给它取名也有过一段艰难的时光,因为已经有许多 DNS 工具了(dnsspy!dnssnoop!dnssniff!dnswatch!)我基本上只是查了下有关“监听”的每个同义词,然后选择了一个看起来很有趣并且还没有被其他 DNS 工具所占用的名称。 + +该程序没有做的一件事就是告诉你哪个进程进行了 DNS 查询,我发现有一个名为 [dnssnoop][6] 的工具可以做到这一点。它使用 eBPF,看上去很酷,但我还没有尝试过。 + +### 可能会有许多 bug + +我只在 Linux 和 Mac 上简单测试了一下,并且我已知至少有一个 bug(不支持足够多的 DNS 查询类型),所以请在遇到问题时告知我! + +尽管这个 bug 没什么危害,因为这 libpcap 接口是只读的。所以可能发生的最糟糕的事情是它得到一些它无法解析的输入,最后打印出错误或是崩溃。 + +### 编写小型教育工具很有趣 + +最近,我对编写小型教育的 DNS 工具十分感兴趣。 + +到目前为止我所编写的工具: + + * (一种进行 DNS 查询的简单方法) + * (向你显示在进行 DNS 查询时内部发生的情况) + * 本工具(`dnspeep`) + +以前我尽力阐述已有的工具(如 `dig` 或 `tcpdump`)而不是编写自己的工具,但是经常我发现这些工具的输出结果让人费解,所以我非常关注以更加友好的方式来看这些相同的信息,以便每个人都能明白他们电脑正在进行的 DNS 查询,而不仅仅是依赖 tcmdump。 + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/03/31/dnspeep-tool/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[wyxplus](https://github.com/wyxplus) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://github.com/jvns/dnspeep +[2]: https://github.com/jvns/dnspeep/blob/f5780dc822df5151f83703f05c767dad830bd3b2/src/main.rs +[3]: https://github.com/ebfull/pcap/pull/168 +[4]: https://github.com/google/gopacket/issues/734 +[5]: https://github.com/jvns/dnspeep/blob/f5780dc822df5151f83703f05c767dad830bd3b2/src/main.rs#L136 +[6]: https://github.com/lilydjwg/dnssnoop diff --git a/published/202105/20210412 Scheduling tasks with cron.md b/published/202105/20210412 Scheduling tasks with cron.md new file mode 100644 index 0000000000..c14e44cd5f --- /dev/null +++ b/published/202105/20210412 Scheduling tasks with cron.md @@ -0,0 +1,202 @@ +[#]: subject: "Scheduling tasks with cron" +[#]: via: "https://fedoramagazine.org/scheduling-tasks-with-cron/" +[#]: author: "Darshna Das https://fedoramagazine.org/author/climoiselle/" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13383-1.html" + +使用 cron 调度任务 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/12/120220f7wwchadgwmsg1dw.jpg) + +cron 是一个调度守护进程,它以指定的时间间隔执行任务,这些任务称为 corn 作业,主要用于自动执行系统维护或管理任务。例如,你可以设置一个 cron 作业来自动执行重复的任务,比如备份数据库或数据,使用最新的安全补丁更新系统,检查磁盘空间使用情况,发送电子邮件等等。 cron 作业可以按分钟、小时、日、月、星期或它们的任意组合运行。 + +### cron 的一些优点 + +以下是使用 cron 作业的一些优点: + + * 你可以更好地控制作业的运行时间。例如,你可以精确到分钟、小时、天等。 + * 它消除了为循环任务逻辑而去写代码的需要,当你不再需要执行任务时,可以直接关闭它。 + * 作业在不执行时不会占用内存,因此你可以节省内存分配。 + * 如果一个作业执行失败并由于某种原因退出,它将在适当的时间再次运行。 + +### 安装 cron 守护进程 + +幸运的是,Fedora Linux 预先配置了运行重要的系统任务来保持系统更新,有几个实用程序可以运行任务例如 cron、`anacron`、`at` 和 `batch` 。本文只关注 cron 实用程序的安装。cron 和 cronie 包一起安装,cronie 包也提供 `cron` 服务。 + +要确定软件包是否已经存在,使用 `rpm` 命令: + +``` +$ rpm -q cronie + Cronie-1.5.2-4.el8.x86_64 +``` + +如果安装了 cronie ,它将返回 cronie 包的全名。如果你的系统中没有安装,则会显示未安装。 + +使用以下命令安装: + +``` +$ dnf install cronie +``` + +### 运行 cron 守护进程 + +cron 作业由 crond 服务来执行,它会读取配置文件中的信息。在将作业添加到配置文件之前,必须启动 crond 服务,或者安装它。什么是 crond 呢?crond 是 cron 守护程序的简称。要确定 crond 服务是否正在运行,输入以下命令: + +``` +$ systemctl status crond.service +● crond.service - Command Scheduler + Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor pre> + Active: active (running) since Sat 2021-03-20 14:12:35 PDT; 1 day 21h ago + Main PID: 1110 (crond) +``` + +如果你没有看到类似的内容 `Active: active (running) since…`,你需要启动 crond 守护进程。要在当前会话中运行 crond 服务,输入以下命令: + +``` +$ systemctl run crond.service +``` + +将其配置为开机自启动,输入以下命令: + +``` +$ systemctl enable crond.service +``` + +如果出于某种原因,你希望停止 crond 服务,按以下方式使用 `stop` 命令: + +``` +$ systemctl stop crond.service +``` + +要重新启动它,只需使用 `restart` 命令: + +``` +$ systemctl restart crond.service +``` + +### 定义一个 cron 作业 + +#### cron 配置 + +以下是一个 cron 作业的配置细节示例。它定义了一个简单的 cron 作业,将 `git` master 分支的最新更改拉取到克隆的仓库中: + +``` +*/59 * * * * username cd /home/username/project/design && git pull origin master +``` + +主要有两部分: + + * 第一部分是 `*/59 * * * *`。这表明计时器设置为第 59 分钟执行一次。(LCTT 译注:原文此处有误。) + * 该行的其余部分是命令,因为它将从命令行运行。 + 在此示例中,命令本身包含三个部分: + * 作业将以用户 `username` 的身份运行 + * 它将切换到目录 `/home/username/project/design` + * 运行 `git` 命令拉取 master 分支中的最新更改 + +#### 时间语法 + +如上所述,时间信息是 cron 作业字符串的第一部分,如上所属。它决定了 cron 作业运行的频率和时间。它按以下顺序包括 5 个部分: + + * 分钟 + * 小时 + * 一个月中的某天 + * 月份 + * 一周中的某天 + +下面是一种更图形化的方式来解释语法: + +``` + .--------------- 分钟 (0 - 59) + | .------------- 小时 (0 - 23) + | | .---------- 一月中的某天 (1 - 31) + | | | .------- 月份 (1 - 12) 或 jan、feb、mar、apr … + | | | | .---- 一周中的某天 (0-6) (周日=0 或 7) + | | | | | 或 sun、mon、tue、wed、thr、fri、sat + | | | | | + * * * * * user-name command-to-be-executed +``` + +#### 星号的使用 + +星号(`*`)可以用来替代数字,表示该位置的所有可能值。例如,分钟位置上的星号会使它每分钟运行一次。以下示例可能有助于更好地理解语法。 + +这个 cron 作业将每分钟运行一次: + +``` +* * * * [command] +``` + +斜杠表示分钟的间隔数。下面的示例将每小时运行 12 次,即每 5 分钟运行一次: + +``` +*/5 * * * * [command] +``` + +下一个示例将每月的第二天午夜(例如 1 月 2 日凌晨 12:00,2 月 2 日凌晨 12:00 等等): + +``` +0 0 2 * * [command] +``` + +(LCTT 译注:关于 cron 时间格式,还有更多格式符号,此处没有展开) + +#### 使用 crontab 创建一个 cron 作业 + +cron 作业会在后台运行,它会不断检查 `/etc/crontab` 文件和 `/etc/cron.*/` 以及 `/var/spool/cron/` 目录。每个用户在 `/var/spool/cron/` 中都有一个唯一的 crontab 文件。 + +不应该直接编辑这些 cron 文件。`crontab` 命令是用于创建、编辑、安装、卸载和列出 cron 作业的方法。 + +更酷的是,在创建新文件或编辑现有文件后,你无需重新启动 cron。 + +``` +$ crontab -e +``` + +这将打开你现有的 crontab 文件,或者创建一个。调用 `crontab -e` 时,默认情况下会使用 `vi` 编辑器。注意:要使用 Nano 编辑 crontab 文件,可以设置 `EDITOR=nano` 环境变量。 + +使用 `-l` 选项列出所有 cron 作业。如果需要,使用 `-u` 选项指定一个用户。 + +``` +$ crontab -l +$ crontab -u username -l +``` + +使用以下命令删除所有 cron 作业: + +``` +$ crontab -r +``` + +要删除特定用户的作业,你必须以 root 用户身份运行以下命令: + +``` +$ crontab -r -u username +``` + +感谢你的阅读。cron 作业看起来可能只是系统管理员的工具,但它实际上与许多 Web 应用程序和用户任务有关。 + +### 参考 + +Fedora Linux 文档的 [自动化任务][4] + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/scheduling-tasks-with-cron/ + +作者:[Darshna Das][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/climoiselle/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/03/schedule_with_cron-816x345.jpg +[2]: https://unsplash.com/@yomex4life?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/clock?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://docs.fedoraproject.org/en-US/Fedora/12/html/Deployment_Guide/ch-autotasks.html \ No newline at end of file diff --git a/published/202105/20210412 Send your scans to a Linux machine over your network.md b/published/202105/20210412 Send your scans to a Linux machine over your network.md new file mode 100644 index 0000000000..f4169f4076 --- /dev/null +++ b/published/202105/20210412 Send your scans to a Linux machine over your network.md @@ -0,0 +1,193 @@ +[#]: subject: (Send your scans to a Linux machine over your network) +[#]: via: (https://opensource.com/article/21/4/linux-scan-samba) +[#]: author: (Marc Skinner https://opensource.com/users/marc-skinner) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13395-1.html) + +通过网络将你的扫描结果发送到 Linux 机器上 +====== + +> 设置一个 Samba 共享,使扫描仪可以容易地被网络上的一台 Linux 计算机访问。 + +![](https://img.linux.net.cn/data/attachment/album/202105/16/111724ft11r181pc1bu21p.jpg) + +自由软件运动 [因为一台设计不良的打印机][2] 而开始。几十年后,打印机和扫描仪制造商继续重新发明轮子,无视既定的通用协议。因此,每隔一段时间,你就会偶然发现一台打印机或扫描仪似乎无法与你的操作系统配合使用。 + +最近,我在一台佳能三合一扫描仪(佳能 Maxify MB2720)上遇到了这种情况。我用开源方案解决这个扫描仪的问题。具体来说,我设置了一个 Samba 共享,使扫描仪在我的网络上可用。 + +[Samba 项目][3] 是一个用于 Linux/Unix 与 Windows 互操作的套件。尽管它是大多数用户从未与之交互的低级代码,但该软件使得在你的本地网络上共享文件变得很容易,而不管使用的是什么平台。 + +我使用的是 Fedora,所以这些说明应该适用于任何基于 RPM 的 Linux 发行版。对于其他发行版,可能需要做一些小的修改。下面是我的做法。 + +### 获取佳能工具 + +从佳能的网站上下载所需的用于 Windows 的 “佳能快速实用工具箱Canon Quick Utility Toolbox”。该软件是必需的,因为它是配置打印机目标文件夹位置和凭证的唯一方法。完成后,你就不需要再使用该工具了,除非你想做出改变。 + +在配置打印机之前,你必须在你的 Linux 电脑或服务器上设置一个 Samba 共享。用以下命令安装 Samba: + +``` +$ sudo dnf -y install samba +``` + +创建 `/etc/smb.conf` 文件,内容如下: + +``` +[global] +        workgroup = WORKGROUP +        netbios name = MYSERVER +        security = user +        #CORE needed for CANON PRINTER SCAN FOLDER +        min protocol = CORE +        #NTML AUTHV1 needed for CANON PRINTER SCAN FOLDER +        ntlm auth = yes +        passdb backend = tdbsam + +        printing = cups +        printcap name = cups +        load printers = no +        cups options = raw + +        hosts allow = 127. 192.168.33. +        max smbd processes = 1000 + +[homes] +        comment = Home Directories +        valid users = %S, %D%w%S +        browseable = No +        writable = yes +        read only = No +        inherit acls = Yes + +[SCANS] +        comment = MB2720 SCANS +        path = /mnt/SCANS +        public = yes +        writable = yes +        browseable = yes +        printable = no +        force user = tux +        create mask = 770 +``` + +在接近结尾的 `force user` 这行中,将用户名从 `tux` 改为你自己的用户名。 + +不幸的是,佳能打印机不能与高于 CORE 或 NTML v2 认证的服务器信息块([SMB][4])协议一起工作。由于这个原因,Samba 共享必须配置最古老的 SMB 协议和 NTML 认证版本。这无论如何都不理想,而且有安全问题,所以我创建了一个单独的 Samba 服务器,专门用于扫描仪。我的另一台共享所有家庭网络文件的 Samba 服务器仍然使用 SMB 3 和 NTML v2 认证版本。 + +启动 Samba 服务端服务,并启用它: + +``` +$ sudo systemctl start smb +$ sudo systemctl enable smb +``` + +### 创建一个 Samba 用户 + +创建你的 Samba 用户并为其设置密码: + +``` +$ sudo smbpasswd -a tux +``` + +在提示符下输入你的密码。 + +假设你想在 Linux 系统上挂载你的 Samba 扫描仪,你需要做几个步骤。 + +创建一个 Samba 客户端凭证文件。我的看起来像这样: + +``` +$ sudo cat /root/smb-credentials.txt +username=tux +password=mySTRONGpassword +``` + +改变权限,使其不能被其他人阅读: + +``` +$ sudo chmod 640 /root/smb-credentials.txt +``` + +创建一个挂载点并将其添加到 `/etc/fstab` 中: + +``` +$ sudo mkdir /mnt/MB2720-SCANS +``` + +在你的 `/etc/fstab` 中添加以下这行: + +``` +//192.168.33.50/SCANS  /mnt/MB2720-SCANS  cifs vers=3.0,credentials=/root/smb-credentials.txt,gid=1000,uid=1000,_netdev    0 0 +``` + +这将使用 [CIFS][5] 将 Samba 共享扫描挂载到新的挂载点,强制采用 SMBv3,并使用存储在 `/root/smb-credetials.txt` 中的用户名和密码。它还传递用户的组标识符(GID)和用户标识符(UID),让你拥有 Linux 挂载的全部所有权。`_netdev` 选项是必需的,以便在网络正常后(例如重启后)挂载该挂载点,因为该挂载点需要网络来访问。 + +### 配置佳能软件 + +现在你已经创建了 Samba 共享,在服务器上进行了配置,并将该共享配置到 Linux 客户端上,你需要启动“佳能快速实用工具箱”来配置打印机。因为佳能没有为 Linux 发布工具箱,所以这一步需要 Windows。你可以尝试 [在 WINE 上运行它][6],但如果失败了,你就必须向别人借一台 Windows 电脑,或者在 [GNOME Boxes][8] 或 [VirtualBox][9] 中运行一个 [Windows 开发者虚拟机][7]。 + +打开打印机,然后启动佳能快速实用工具箱。它应该能找到你的打印机。如果不能看到你的打印机,你必须先将打印机配置为 LAN 或无线网络。 + +在工具箱中,点击“目标文件夹设置Destination Folder Settings”。 + +![Canon Quick Utility Toolbox][10] + +输入打印机管理密码。我的默认密码是 “canon”。 + +单击“添加Add”按钮。 + +![Add destination folder][12] + +在表格中填写“显示名Displayed Name”、“目标位置共享文件夹名称Shared Folder Name in Destination”,以及你的 Samba “域名/用户名Domain Name/User Name”和“密码Password”。 + +我把 “PIN 码PIN Code”留空,但如果你想要求每次从打印机扫描时都要输入 PIN 码,你可以设置一个。这在办公室里很有用,每个用户都有自己的 Samba 共享和 PIN 码来保护他们的扫描。 + +点击“连接测试Connection Test”来验证表格数据。 + +点击 “OK” 按钮。 + +点击 “注册到打印机Register to Printer”,将你的配置保存到打印机上。 + +![Register to Printer ][13] + +一切都设置好了。点击“退出Exit”。你现在已经完成了 Windows 的操作,可能还有工具箱,除非你需要改变什么。 + +### 开始扫描 + +你现在可以从打印机扫描,并从其 LCD 菜单中选择你的“目标文件夹”。扫描结果将直接保存到 Samba 共享中,你可以从你的 Linux 电脑上访问该共享。 + +为方便起见,用以下命令在你的 Linux 桌面或家目录上创建一个符号链接: + +``` +$ sudo ln -sd /mnt/MB2720-SCANS /home/tux/Desktop/MB2720-SCANS +``` + +这就是全部内容了! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-scan-samba + +作者:[Marc Skinner][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/marc-skinner +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_paper_folder.png?itok=eIJWac15 (Files in a folder) +[2]: https://opensource.com/article/18/2/pivotal-moments-history-open-source +[3]: http://samba.org/ +[4]: https://en.wikipedia.org/wiki/Server_Message_Block +[5]: https://searchstorage.techtarget.com/definition/Common-Internet-File-System-CIFS +[6]: https://opensource.com/article/21/2/linux-wine +[7]: https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/ +[8]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization +[9]: https://www.virtualbox.org/ +[10]: https://opensource.com/sites/default/files/uploads/canontoolbox.png (Canon Quick Utility Toolbox) +[11]: https://creativecommons.org/licenses/by-sa/4.0/ +[12]: https://opensource.com/sites/default/files/add_destination_folder.png (Add destination folder) +[13]: https://opensource.com/sites/default/files/uploads/canonregistertoprinter.png (Register to Printer ) diff --git a/published/202105/20210414 4 tips for context switching in Git.md b/published/202105/20210414 4 tips for context switching in Git.md new file mode 100644 index 0000000000..a557074975 --- /dev/null +++ b/published/202105/20210414 4 tips for context switching in Git.md @@ -0,0 +1,178 @@ +[#]: subject: (4 tips for context switching in Git) +[#]: via: (https://opensource.com/article/21/4/context-switching-git) +[#]: author: (Olaf Alders https://opensource.com/users/oalders) +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13422-1.html) + +Git 中上下文切换的 4 种方式 +====== + +> 比较 Git 中四种切换分支的方法的优缺点。 + +![](https://img.linux.net.cn/data/attachment/album/202105/25/091803a6ww3r7yo32oxdzx.jpg) + +所有大量使用 Git 的人都会用到某种形式的上下文切换。有时这只会给你的工作流程增加少量的开销,但有时,这可能是一段痛苦的经历。 + +让我们用以下这个例子来讨论一些常见的上下文切换策略的优缺点: + +> 假设你在一个名为 `feature-X` 的分支中工作。你刚刚发现你需要解决一个无关的问题。这不能在 `feature-X` 分支中完成。你需要在一个新的分支 `feature-Y` 中完成这项工作。 + +### 方案 1:暂存 + 分支 + +解决此问题最常见的工作流程可能如下所示: + + 1. 停止分支 `feature-X` 上的工作 + 2. `git stash` + 3. `git checkout -b feature-Y origin/main` + 4. 一顿鼓捣,解决 `feature-Y` 的问题 + 5. `git checkout feature-X` 或 `git switch -` + 6. `git stash pop` + 7. 继续在 `feature-X` 中工作 + +**优点:** 这种方法的优点在于,对于简单的更改,这是一个相当简单的工作流程。它可以很好地工作,特别是对于小型仓库。 + +**缺点:** 使用此工作流程时,一次只能有一个工作区。另外,根据你的仓库的状态,使用暂存是一个麻烦的环节。 + +### 方案 2:WIP 提交 + 分支 + +这个解决方案和前一个非常相似,但是它使用 WIP(正在进行的工作Work in Progress)提交而不是暂存。当你准备好切换回来,而不是弹出暂存时,`git reset HEAD~1` 会展开 WIP 提交,你可以自由地继续,就像之前的方案一样,但不会触及暂存。 + + 1. 停止分支 `feature-X` 上的工作 + 2. `git add -u`(仅仅添加修改和删除的文件) + 3. `git commit -m "WIP"` + 4. `git checkout -b feature-Y origin/master` + 5. 一顿鼓捣,解决 `feature-Y` 的问题 + 6. `git checkout feature-X` 或 `git switch -` + 7. `git reset HEAD~1` + +**优点:** 对于简单的更改,这是一个简单的工作流,也适合于小型仓库。你不需要使用暂存。 + +**缺点:** 任何时候都只能有一个工作区。此外,如果你或你的代码审阅者不够谨慎,WIP 提交可能会合并到最终产品。 + +使用此工作流时,你**永远**不要想着将 `--hard` 添加到 `git reset`。如果你不小心这样做了,你应该能够使用 `git reflog` 恢复提交,但是你最好完全避免这种情况发生,否则你会听到心碎的声音。 + +### 方案 3:克隆一个新仓库 + +在这个解决方案中,不是创建新的分支,而是为每个新的功能分支创建存储库的新克隆。 + +**优点:** 你可以同时在多个工作区中工作。你不需要 `git stash` 或者是 WIP 提交。 + +**缺点:** 需要考虑仓库的大小,因为这可能会占用大量磁盘空间(浅层克隆可以帮助解决这种情况,但它们可能并不总是很合适。)此外,你的仓库克隆将互不可知。因为他们不能互相追踪,所以你必须手动追踪你的克隆的源仓库。如果需要 git 钩子,则需要为每个新克隆设置它们。 + +### 方案 4:git 工作树 + +要使用此解决方案,你可能需要了解 `git add worktree`。如果你不熟悉 Git 中的工作树,请不要难过。许多人多年来都对这个概念一无所知。 + +#### 什么是工作树? + +将工作树视为仓库中属于项目的文件。本质上,这是一种工作区。你可能没有意识到你已经在使用工作树了。开始使用 Git 时,你将自动获得第一个工作树。 + +``` +$ mkdir /tmp/foo && cd /tmp/foo +$ git init +$ git worktree list +/tmp  0000000 [master] +``` + +你可以在以上代码看到,甚至在第一次提交前你就有了一个工作树。接下来去尝试再添加一个工作树到你的项目中吧。 + +#### 添加一个工作树 + +想要添加一个新的工作树你需要提供: + + 1. 硬盘上的一个位置 + 2. 一个分支名 + 3. 添加哪些分支 + +``` +$ git clone https://github.com/oalders/http-browserdetect.git +$ cd http-browserdetect/ +$ git worktree list +/Users/olaf/http-browserdetect 90772ae [master] + +$ git worktree add ~/trees/oalders/feature-X -b oalders/feature-X origin/master +$ git worktree add ~/trees/oalders/feature-Y -b oalders/feature-Y e9df3c555e96b3f1 + +$ git worktree list +/Users/olaf/http-browserdetect 90772ae [master] +/Users/olaf/trees/oalders/feature-X 90772ae [oalders/feature-X] +/Users/olaf/trees/oalders/feature-Y e9df3c5 [oalders/feature-Y] +``` + +与大多数其他 Git 命令一样,你需要在仓库路径下使用此命令。一旦创建了工作树,就有了隔离的工作环境。Git 仓库会跟踪工作树在磁盘上的位置。如果 Git 钩子已经在父仓库中设置好了,那么它们也可以在工作树中使用。 + +请注意到,每个工作树只使用父仓库磁盘空间的一小部分。在这种情况下,工作树需要只大约三分之一的原始磁盘空间。这这非常适合进行扩展。如果你的仓库达到了千兆字节的级别,你就会真正体会到工作树对硬盘空间的节省。 + +``` +$ du -sh /Users/olaf/http-browserdetect +2.9M + +$ du -sh /Users/olaf/trees/oalders/feature-X +1.0M +``` + +**优点:** 你可以同时在多个工作区中工作。你不需要使用暂存。Git 会跟踪所有的工作树。你不需要设置 Git 钩子。这也比 `git clone` 更快,并且可以节省网络流量,因为你可以在飞行模式下执行此操作。你还可以更高效地使用磁盘空间,而无需借助于浅层克隆。 + +**缺点:** 这是个需要你额外学习和记忆的新东西,但是如果你能养成使用这个功能的习惯,它会给你丰厚的回报。 + +#### 额外的小技巧 + +有很多方式可以清除工作树,最受欢迎的方式是使用 Git 来移除工作树: + +``` +git worktree remove /Users/olaf/trees/oalders/feature-X +``` + +如果你喜欢 RM 大法,你也可以用 `rm -rf` 来删除工作树。 + +``` +rm -rf /Users/olaf/trees/oalders/feature-X +``` + +但是,如果执行此操作,则可能需要使用 `git worktree prune` 清理所有剩余的文件。或者你现在可以跳过清理,这将在将来的某个时候通过 `git gc` 自行完成。 + +#### 注意事项 + +如果你准备尝试 `git worktree`,请记住以下几点: + +* 删除工作树并不会删除该分支。 +* 可以在工作树中切换分支。 +* 你不能在多个工作树中同时签出同一个分支。 +* 像其他命令一样,`git worktree` 需要从仓库内运行。 +* 你可以同时拥有许多工作树。 +* 要从同一个本地仓库签出创建工作树,否则它们将互不可知。 + +#### git rev-parse + +最后一点注意:在使用 `git worktree` 时,仓库根所在的位置可能取决于上下文。幸运的是,`git rev parse` 可以让你区分这两者。 + +* 要查找父仓库的根目录,请执行以下操作: + ``` + git rev-parse --git-common-dir + ``` +* 要查找你当前所在仓库的根目录,请执行: + ``` + git rev-parse --show-toplevel + ``` + +### 根据你的需要选择最好的方法 + +就像很多事情一样,TIMTOWDI(条条大道通罗马there's more than one way to do it)。重要的是你要找到一个适合你需要的工作流程。你的需求可能因手头的问题而异。也许你偶尔会发现自己将 `git worktree` 作为版本控制工具箱中的一个方便工具。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/context-switching-git + +作者:[Olaf Alders][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/oalders +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) diff --git a/published/202105/20210416 Metro Exodus is Finally Here on Steam for Linux.md b/published/202105/20210416 Metro Exodus is Finally Here on Steam for Linux.md new file mode 100644 index 0000000000..6a70a602d6 --- /dev/null +++ b/published/202105/20210416 Metro Exodus is Finally Here on Steam for Linux.md @@ -0,0 +1,61 @@ +[#]: subject: (Metro Exodus is Finally Here on Steam for Linux) +[#]: via: (https://news.itsfoss.com/metro-exodus-steam/) +[#]: author: (Asesh Basu https://news.itsfoss.com/author/asesh/) +[#]: collector: (lujun9972) +[#]: translator: (alim0x) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13370-1.html) + +《地铁:离去》终于来到了 Steam for Linux +====== + +> 在其他平台上推出后,《地铁:离去》正式登陆 Linux/GNU 平台。准备好体验最好的射击游戏之一了吗? + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/metro-exodus-linux.png?w=1200&ssl=1) + +《地铁:离去Metro Exodus》是一款长久以来深受粉丝喜爱的游戏,现在终于来到了 Linux 平台。在超过两年的漫长等待之后,Linux 用户终于可以上手《地铁》三部曲的第三部作品。虽然先前已经有一些非官方移植的版本,但这个版本是 4A Games 发布的官方版本。 + +《地铁:离去》是一款第一人称射击游戏,拥有华丽的光线跟踪画面,故事背景设置在横跨俄罗斯广阔土地的荒野之上。这条精彩的故事线横跨了从春、夏、秋到核冬天的整整一年。游戏结合了快节奏的战斗和隐身以及探索和生存,可以轻而易举地成为 Linux 中最具沉浸感的游戏之一。 + +### 我的 PC 可以运行它吗? + +作为一款图形计算密集型游戏,你得有像样的硬件来运行以获得不错的帧率。这款游戏重度依赖光线追踪来让画面看起来更棒。 + +运行游戏的最低要求需要 **Intel Core i5 4400**、**8 GB** 内存,以及最低 **NVIDIA GTX670** 或 **AMD Radeon R9 380** 的显卡。推荐配置是 **Intel Core i7 4770K** 搭配 **GTX1070** 或 **RX 5500XT**。 + +这是开发者提及的官方配置清单: + +![][1] + +《地铁:离去》是付费游戏,你需要花费 39.99 美元来获取这个最新最棒的版本。 + +如果你在游玩的时候遇到持续崩溃的情况,检查一下你的显卡驱动以及 Linux 内核版本。有人反馈了一些相关的问题,但不是普遍性的问题。 + +### 从哪获取游戏? + +Linux 版本的游戏可以从 [Steam][2] for Linux 获取。如果你已经购买了游戏,它会自动出现在你的 Steam for Linux 游戏库内。 + +- [Metro Exodus (Steam)][2] + +如果你还没有安装 Steam,你可以参考我们的教程:[在 Ubuntu 上安装 Steam][3] 和 [在 Fedora 上安装 Steam][4]。 + +你的 Steam 游戏库中已经有《地铁:离去》了吗?准备购买一份吗?可以在评论区写下你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/metro-exodus-steam/ + +作者:[Asesh Basu][a] +选题:[lujun9972][b] +译者:[alim0x](https://github.com/alim0x) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/asesh/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/METRO-EXODUS-LINUX-System-Requirements.jpg?w=1454&ssl=1 +[2]: https://store.steampowered.com/app/412020/Metro_Exodus/ +[3]: https://itsfoss.com/install-steam-ubuntu-linux/ +[4]: https://itsfoss.com/install-steam-fedora/ diff --git a/published/202105/20210416 Play a fun math game with Linux commands.md b/published/202105/20210416 Play a fun math game with Linux commands.md new file mode 100644 index 0000000000..64cdaf210d --- /dev/null +++ b/published/202105/20210416 Play a fun math game with Linux commands.md @@ -0,0 +1,199 @@ +[#]: subject: (Play a fun math game with Linux commands) +[#]: via: (https://opensource.com/article/21/4/math-game-linux-commands) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13358-1.html) + +用 Linux 命令玩一个有趣的数学游戏 +====== + +> 在家玩流行的英国游戏节目 “Countdown” 中的数字游戏。 + +![](https://img.linux.net.cn/data/attachment/album/202105/03/221459uchb0f8xcxfrhc86.jpg) + +像许多人一样,我在大流行期间看了不少新的电视节目。我最近发现了一个英国的游戏节目,叫做 [Countdown][2],参赛者在其中玩两种游戏:一种是 _单词_ 游戏,他们试图从杂乱的字母中找出最长的单词;另一种是 _数字_ 游戏,他们从随机选择的数字中计算出一个目标数字。因为我喜欢数学,我发现自己被数字游戏所吸引。 + +数字游戏可以为你的下一个家庭游戏之夜增添乐趣,所以我想分享我自己的一个游戏变体。你以一组随机数字开始,分为 1 到 10 的“小”数字和 15、20、25,以此类推,直到 100 的“大”数字。你从大数字和小数字中挑选六个数字的任何组合。 + +接下来,你生成一个 200 到 999 之间的随机“目标”数字。然后用你的六个数字进行简单的算术运算,尝试用每个“小”和“大”数字计算出目标数字,但使用不能超过一次。如果你能准确地计算出目标数字,你就能得到最高分,如果距离目标数字 10 以内就得到较低的分数。 + +例如,如果你的随机数是 75、100、2、3、4 和 1,而你的目标数是 505,你可以说 `2+3=5`,`5×100=500`,`4+1=5`,以及 `5+500=505`。或者更直接地:`(2+3)×100 + 4 + 1 = 505`。 + +### 在命令行中随机化列表 + +我发现在家里玩这个游戏的最好方法是从 1 到 10 的池子里抽出四个“小”数字,从 15 到 100 的 5 的倍数中抽出两个“大”数字。你可以使用 Linux 命令行来为你创建这些随机数。 + +让我们从“小”数字开始。我希望这些数字在 1 到 10 的范围内。你可以使用 Linux 的 `seq` 命令生成一个数字序列。你可以用几种不同的方式运行 `seq`,但最简单的形式是提供序列的起始和结束数字。要生成一个从 1 到 10 的列表,你可以运行这个命令: + +``` +$ seq 1 10 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +``` + +为了随机化这个列表,你可以使用 Linux 的 `shuf`(“shuffle”,打乱)命令。`shuf` 将随机化你给它的东西的顺序,通常是一个文件。例如,如果你把 `seq` 命令的输出发送到 `shuf` 命令,你会收到一个 1 到 10 之间的随机数字列表: + +``` +$ seq 1 10 | shuf +3 +6 +8 +10 +7 +4 +5 +2 +1 +9 +``` + +要从 1 到 10 的列表中只选择四个随机数,你可以将输出发送到 `head` 命令,它将打印出输入的前几行。使用 `-4` 选项来指定 `head` 只打印前四行: + +``` +$ seq 1 10 | shuf | head -4 +6 +1 +8 +4 +``` + +注意,这个列表与前面的例子不同,因为 `shuf` 每次都会生成一个随机顺序。 + +现在你可以采取下一步措施来生成“大”数字的随机列表。第一步是生成一个可能的数字列表,从 15 开始,以 5 为单位递增,直到达到 100。你可以用 Linux 的 `seq` 命令生成这个列表。为了使每个数字以 5 为单位递增,在 `seq` 命令中插入另一个选项来表示 _步进_: + +``` +$ seq 15 5 100 +15 +20 +25 +30 +35 +40 +45 +50 +55 +60 +65 +70 +75 +80 +85 +90 +95 +100 +``` + +就像以前一样,你可以随机化这个列表,选择两个“大”数字: + +``` +$ seq 15 5 100 | shuf | head -2 +75 +40 +``` + +### 用 Bash 生成一个随机数 + +我想你可以用类似的方法从 200 到 999 的范围内选择游戏的目标数字。但是生成单个随机数的最简单的方案是直接在 Bash 中使用 `RANDOM` 变量。当你引用这个内置变量时,Bash 会生成一个大的随机数。要把它放到 200 到 999 的范围内,你需要先把随机数放到 0 到 799 的范围内,然后加上 200。 + +要把随机数放到从 0 开始的特定范围内,你可以使用**模数**算术运算符。模数计算的是两个数字相除后的 _余数_。如果我用 801 除以 800,结果是 1,余数是 1(模数是 1)。800 除以 800 的结果是 1,余数是 0(模数是 0)。而用 799 除以 800 的结果是 0,余数是 799(模数是 799)。 + +Bash 通过 `$(())` 结构支持算术展开。在双括号之间,Bash 将对你提供的数值进行算术运算。要计算 801 除以 800 的模数,然后加上 200,你可以输入: + +``` +$ echo $(( 801 % 800 + 200 )) +201 +``` + +通过这个操作,你可以计算出一个 200 到 999 之间的随机目标数: + +``` +$ echo $(( RANDOM % 800 + 200 )) +673 +``` + +你可能想知道为什么我在 Bash 语句中使用 `RANDOM` 而不是 `$RANDOM`。在算术扩展中, Bash 会自动扩展双括号内的任何变量. 你不需要在 `$RANDOM` 变量上的 `$` 来引用该变量的值, 因为 Bash 会帮你做这件事。 + +### 玩数字游戏 + +让我们把所有这些放在一起,玩玩数字游戏。产生两个随机的“大”数字, 四个随机的“小”数值,以及目标值: + +``` +$ seq 15 5 100 | shuf | head -2 +75 +100 +$ seq 1 10 | shuf | head -4 +4 +3 +10 +2 +$ echo $(( RANDOM % 800 + 200 )) +868 +``` + +我的数字是 **75**、**100**、**4**、**3**、**10** 和 **2**,而我的目标数字是 **868**。 + +如果我用每个“小”和“大”数字做这些算术运算,并不超过一次,我就能接近目标数字了: + +``` +10×75 = 750 +750+100 = 850 + +然后: + +4×3 = 12 +850+12 = 862 +862+2 = 864 +``` + +只相差 4 了,不错!但我发现这样可以用每个随机数不超过一次来计算出准确的数字: + +``` +4×2 = 8 +8×100 = 800 + +然后: + +75-10+3 = 68 +800+68 = 868 +``` + +或者我可以做 _这些_ 计算来准确地得到目标数字。这只用了六个随机数中的五个: + +``` +4×3 = 12 +75+12 = 87 + +然后: + +87×10 = 870 +870-2 = 868 +``` + +试一试 _Countdown_ 数字游戏,并在评论中告诉我们你做得如何。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/math-game-linux-commands + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/edu_math_formulas.png?itok=B59mYTG3 (Math formulas in green writing) +[2]: https://en.wikipedia.org/wiki/Countdown_%28game_show%29 diff --git a/published/202105/20210417 How to Download Ubuntu via Torrent -Absolute Beginner-s Tip.md b/published/202105/20210417 How to Download Ubuntu via Torrent -Absolute Beginner-s Tip.md new file mode 100644 index 0000000000..d4228a0c9d --- /dev/null +++ b/published/202105/20210417 How to Download Ubuntu via Torrent -Absolute Beginner-s Tip.md @@ -0,0 +1,81 @@ +[#]: subject: (How to Download Ubuntu via Torrent [Absolute Beginner’s Tip]) +[#]: via: (https://itsfoss.com/download-ubuntu-via-torrent/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13386-1.html) + +初级:如何通过 Torrent 下载 Ubuntu +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/13/094313jdukww0zkli78hpg.jpg) + +下载 Ubuntu 是非常直接简单的。你可以去它的 [官方网站][1],点击 [桌面下载部分][2],选择合适的 Ubuntu 版本并点击下载按钮。 + +![][3] + +Ubuntu 是以一个超过 2.5GB 大小的单一镜像形式提供的。直接下载对于拥有高速网络连接的人来说效果很好。 + +然而,如果你的网络连接很慢或不稳定,你将很难下载这样一个大文件。在这个过程中,下载可能会中断几次,或者可能需要几个小时。 + +![Direct download may take several hours for slow internet connections][4] + +### 通过 Torrent 下载 Ubuntu + +如果你也困扰于受限数据或网络连接过慢,使用下载管理器或 torrent 将是一个更好的选择。我不打算在这个快速教程中讨论什么是 torrent。你只需要知道,通过 torrent,你可以在多个会话内下载一个大文件。 + +好的是,Ubuntu 实际上提供了通过 torrent 的下载。不好的是,它隐藏在网站上,如果你不熟悉它,很难猜到在哪。 + +如果你想通过 torrent 下载 Ubuntu,请到你所选择的 Ubuntu 版本中寻找**其他下载方式**。 + +![][5] + +点击这个“**alternative downloads and torrents**” 链接,它将打开一个新的网页。**在这个页面向下滚动**,看到 BitTorrent 部分。你会看到下载所有可用版本的 torrent 文件的选项。如果你要在你的个人电脑或笔记本电脑上使用 Ubuntu,你应该选择桌面版本。 + +![][6] + +阅读 [这篇文章以获得一些关于你应该使用哪个 Ubuntu 版本的指导][7]。考虑到你要使用这个发行版,了解 [Ubuntu LTS 和非 LTS 版本会有所帮助][8]。 + +#### 你是如何使用下载的 torrent 文件来获取 Ubuntu 的? + +我推测你知道如何使用 torrent。如果没有,让我为你快速总结一下。 + +你已经下载了一个几 KB 大小的 .torrent 文件。你需要下载并安装一个 Torrent 应用,比如 uTorrent 或 Deluge 或 BitTorrent。 + +我建议在 Windows 上使用 [uTorrent][9]。如果你使用的是某个 Linux 发行版,你应该已经有一个 [像 Transmission 这样的 torrent 客户端][10]。如果没有,你可以从你的发行版的软件管理器中安装它。 + +当你安装了 Torrent 应用,运行它。现在拖放你从 Ubuntu 网站下载的 .torrent 文件。你也可以使用菜单中的打开选项。 + +当 torrent 文件被添加到 Torrent 应用中,它就开始下载该文件。如果你关闭了系统,下载就会暂停。再次启动 Torrent 应用,下载就会从同一个地方恢复。 + +当下载 100% 完成后,你可以用它来 [全新安装 Ubuntu][11] 或 [与 Windows 双启动][12]。 + +享受 Ubuntu :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/download-ubuntu-via-torrent/ + +作者:[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://ubuntu.com +[2]: https://ubuntu.com/download/desktop +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/download-ubuntu.png?resize=800%2C325&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/slow-direct-download-ubuntu.png?resize=800%2C365&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/ubuntu-torrent-download.png?resize=800%2C505&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/ubuntu-torrent-download-option.png?resize=800%2C338&ssl=1 +[7]: https://itsfoss.com/which-ubuntu-install/ +[8]: https://itsfoss.com/long-term-support-lts/ +[9]: https://www.utorrent.com/ +[10]: https://itsfoss.com/best-torrent-ubuntu/ +[11]: https://itsfoss.com/install-ubuntu/ +[12]: https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/ diff --git a/published/202105/20210419 21 reasons why I think everyone should try Linux.md b/published/202105/20210419 21 reasons why I think everyone should try Linux.md new file mode 100644 index 0000000000..d21535f086 --- /dev/null +++ b/published/202105/20210419 21 reasons why I think everyone should try Linux.md @@ -0,0 +1,167 @@ +[#]: subject: (21 reasons why I think everyone should try Linux) +[#]: via: (https://opensource.com/article/21/4/linux-reasons) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13404-1.html) + +每个人都应该尝试 Linux 的 21 个理由 +====== + +> 游戏、交易、预算、艺术、编程等等,这些都只是任何人都可以使用 Linux 的众多方式中的一种。 + +![](https://img.linux.net.cn/data/attachment/album/202105/19/111929by99711lq1iuz7y1.jpg) + +当我在度假时,我经常会去一家或者多家的二手书店。我经常能够找到我想读的一本好书,而且我总是以 “我在度假;我应该用这本书来犒劳自己” 来为不可避免的购买行为辩护。这很有效,我用这种方式获得了一些我最喜欢的书。但是,买一本好书在生活中很常见,这个理由经不起推敲。事实上,我不需要为买一本好书来找理由。事情都是这样的,我可以在任何时候做我想做的事。但不知何故,有一个理由似乎确实能让这个过程更有趣。 + +在我的日常生活中,我会收到很多关于 Linux 的问题。有时候我会不自觉地滔滔不绝地讲述开源软件的历史,或者共享资源的知识和利益。有时候,我会设法提到一些我喜欢的 Linux 上的特性,然后对这些好处进行逆向工程以便它们可以在其它的操作系统上享用。这些讨论经常是有趣且有益的,但只有一个问题:这些讨论都没有回答大家真正要问的问题。 + +当一个人问你关于 Linux 的问题时,他们经常希望你能够给他们一些使用 Linux 的理由。当然,也有例外。从来没有听过“Linux”的人们可能会问一些字面定义。但是当你的朋友或者同事吐露出他们对当前的操作系统有些不满意的时候,解释一下你为什么喜欢 Linux 可能更好,而不是告诉他们为什么 Linux 是一个比专有系统更好的选择。换句话说,你不需要销售演示,你需要的是度假照片(如果你是个书虫的话,也可以是度假时买的一本书)。 + +为了达到这个目的,下面是我喜欢 Linux 的 21 个原因,分别在 21 个不同的场合讲给 21 个不同的人。 + +### 游戏 + +![Gaming on Linux][2] + +说到玩电脑,最明显的活动之一就是玩游戏,说到玩游戏,我很喜欢。我很高兴花一个晚上玩一个 8 位的益智游戏或者 epic 工作室的一个 AAA 级游戏。其它时候,我还会沉浸在棋盘游戏或者角色扮演游戏(RPG)中。 + +这些我都是 [在 Linux 系统的电脑上做的][4]。 + +### 办公 + +![LibreOffice][5] + +一种方法并不适合所有人。这对帽子和办公室工作来说都是如此。看到同事们被困在一个不适合他们的单一工作流程中,我感到很痛苦,我喜欢 Linux 鼓励用户找到他们喜欢的工具。我曾使用过的应用大到套件(例如 LibreOffice 和 OpenOffice),小到轻量级文字处理器(如 Abiword),再到最小的文本编辑器(利用 Pandoc 进行转换)。 + +不管我周围的用户被限制在什么范围内,我都可以 [自由地使用可以在我的电脑上工作的最好的工具][6],并且以我希望的方式工作。 + +### 选择 + +![Linux login screen][7] + +开源最有价值的特性之一是用户在使用这些软件的时候是可以信任它的。这种信任来自于好友网络,他们可以阅读他们所使用的应用程序和操作系统的源代码。也就是说,即使你不知道源代码的好坏,你也可以在 [开源社区][8] 中结交一些知道的朋友。这些都是 Linux 用户在探索他们运行的发行版时建立的重要联系。如果你不信任构建和维护的发行版的社区,你可以去找其它的发行版。我们都是这样做的,这是有许多发行版可供选择的优势之一。 + +[Linux 提供了可选择的特性][9]。一个强大的社区,充满了真实的人际关系,结合 Linux 提供的选择自由,所有这些都让用户对他们运行的软件有信心。因为我读过一些源码,也因为我信任哪些维护我没读过的代码的人,[所以我信任 Linux][10]。 + +### 预算 + +![Skrooge][11] + +做预算并不有趣,但是很重要。我很早就认识到,在业余时间做一些不起眼的工作,就像我学会了一种 _免费_ 的操作系统(Linux!)一样。预算不是为了追踪你的钱,而是为了追踪你的习惯。这意味着无论你是靠薪水生活,还是正在计划退休,你都应该 [保持预算][12]。 + +如果你在美国,你甚至可以 [用 Linux 来交税][13]。 + +### 艺术 + +![MyPaint][14] + +不管你是画画还是做像素艺术、[编辑视频][15] 还是随性记录,你都可以在 Linux 上创建出色的内容。我所见过的一些最优秀的艺术作品都是使用一些非“行业标准”的工具随意创作出来的,并且你可能会惊讶于你所看到的许多内容都是基于同样的方式创造出来的。Linux 是一个不会被宣扬的引擎,但它是具有强大功能的引擎,驱动着独立艺术家和大型制作人。 + +尝试使用 Linux 来 [创作一些艺术作品][16]。 + +### 编程 + +![NetBeans][17] + +听着,用 Linux 来编程几乎是定论。仅次于服务器管理,开源和 Linux 是一个明显的组合。这其中有 [许多原因][18],但我这里给出了一个有趣的原因。我在发明新东西时遇到了很多障碍,所以我最不希望的就是操作系统或者软件工具开发包(SDK)成为失败的原因。在 Linux 上,我可以访问一切,字面意义上的一切。 + +### 封包 + +![Packaging GNOME software][19] + +当他们在谈编程的时候,没有人谈封包。作为一个开发者,你必须将你的代码提供给您的用户,否则你将没有任何用户。Linux 使得开发人员可以轻松地 [发布应用程序][20],用户也可以轻松地 [安装这些应用程序][21]。 + +令很多人感到惊讶的是 [Linux 可以像运行本地程序一样运行许多 Windows 应用程序][22]。你不应该期望一个 Windows 应用可以在 Linux 上执行。不过,许多主要的通用应用要么已经在 Linux 上原生存在,要么可以通过名为 Wine 的兼容层运行。 + + +### 技术 + +![Data center][23] + +如果你正在找一份 IT 工作,Linux 是很好的第一步。作为一个曾经为了更快地渲染视频而误入 Linux 的前艺术系学生,我说的是经验之谈。 + +尖端技术发生在 Linux 上。Linux 驱动着大部分的互联网、世界上最快的超级计算机以及云本身。现在,Linux 驱动着 [边缘计算][26],将云数据中心的能力与分散的节点相结合,以实现快速响应。 + +不过,你不需要从最顶层开始。你可以学习在笔记本电脑或者台式机上[自动][27]完成任务,并通过一个 [好的终端][28] 远程控制系统。 + +Linux 对你的新想法是开放的,并且 [可以进行定制][29]。 + +### 分享文件 + +![Beach with cloudy sky][30] + +无论你是一个新手系统管理员,还是仅仅是要将一个将文件分发给室友,Linux 都可以使 [文件共享变得轻而易举][31]。 + +### 多媒体 + +![Waterfall][32] + +在所有关于编程和服务器的讨论中,人们有时把 Linux 想象成一个充满绿色的 1 和 0 的黑屏。对于我们这些使用它的人来说,Linux 也能 [播放你所有的媒体][33],这并不令人惊讶。 + +### 易于安装 + +![CentOS installation][34] + +以前从来没有安装过操作系统吗?Linux 非常简单。一步一步来,Linux 安装程序会手把手带你完成操作系统的安装,让你在一个小时内感觉到自己是个电脑专家。 + +[来安装 Linux 吧][35]! + +### 试一试 Linux + +![Porteus][36] + +如果你还没有准备好安装 Linux,你可以 _试一试_ Linux。不知道如何开始?它没有你想象的那么吓人。这里给了一些你 [一开始需要考虑的事情][37]。然后选择下载一个发行版,并想出你自己使用 Linux 的 21 个理由。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-reasons + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[ShuyRoy](https://github.com/ShuyRoy) +校对:[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_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://opensource.com/sites/default/files/uploads/game_0ad-egyptianpyramids.jpg (Gaming on Linux) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/article/21/2/linux-gaming +[5]: https://opensource.com/sites/default/files/uploads/office_libreoffice.jpg (LibreOffice) +[6]: https://linux.cn/article-13133-1.html +[7]: https://opensource.com/sites/default/files/uploads/trust_sddm.jpg (Linux login screen) +[8]: https://opensource.com/article/21/2/linux-community +[9]: https://linux.cn/article-13284-1.html +[10]: https://opensource.com/article/21/2/open-source-security +[11]: https://opensource.com/sites/default/files/uploads/skrooge_1.jpg (Skrooge) +[12]: https://opensource.com/article/21/2/linux-skrooge +[13]: https://opensource.com/article/21/2/linux-tax-software +[14]: https://opensource.com/sites/default/files/uploads/art_mypaint.jpg (MyPaint) +[15]: https://opensource.com/article/21/2/linux-python-video +[16]: https://linux.cn/article-13157-1.html +[17]: https://opensource.com/sites/default/files/uploads/programming_java-netbeans.jpg (NetBeans) +[18]: https://opensource.com/article/21/2/linux-programming +[19]: https://opensource.com/sites/default/files/uploads/packaging_gnome-software.png (Packaging GNOME software) +[20]: https://opensource.com/article/21/2/linux-packaging +[21]: https://linux.cn/article-13160-1.html +[22]: https://opensource.com/article/21/2/linux-wine +[23]: https://opensource.com/sites/default/files/uploads/edge_taylorvick-unsplash.jpg (Data center) +[24]: https://unsplash.com/@tvick +[25]: https://unsplash.com/license +[26]: https://opensource.com/article/21/2/linux-edge-computing +[27]: https://opensource.com/article/21/2/linux-automation +[28]: https://linux.cn/article-13186-1.html +[29]: https://opensource.com/article/21/2/linux-technology +[30]: https://opensource.com/sites/default/files/uploads/cloud_beach-sethkenlon.jpg (Beach with cloudy sky) +[31]: https://linux.cn/article-13192-1.html +[32]: https://opensource.com/sites/default/files/uploads/media_waterfall.jpg (Waterfall) +[33]: https://opensource.com/article/21/2/linux-media-players +[34]: https://opensource.com/sites/default/files/uploads/install_centos8.jpg (CentOS installation) +[35]: https://linux.cn/article-13164-1.html +[36]: https://opensource.com/sites/default/files/uploads/porteus_0.jpg (Porteus) +[37]: https://opensource.com/article/21/2/try-linux diff --git a/published/202105/20210420 5 ways to protect your documents with open source software.md b/published/202105/20210420 5 ways to protect your documents with open source software.md new file mode 100644 index 0000000000..ec773ff7b5 --- /dev/null +++ b/published/202105/20210420 5 ways to protect your documents with open source software.md @@ -0,0 +1,145 @@ +[#]: subject: (5 ways to protect your documents with open source software) +[#]: via: (https://opensource.com/article/21/4/secure-documents-open-source) +[#]: author: (Ksenia Fedoruk https://opensource.com/users/ksenia-fedoruk) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13428-1.html) + +用开源软件保护你的文件的 5 种方法 +====== + +> 控制你自己的数据,使未经授权的用户无法访问它。 + +![](https://img.linux.net.cn/data/attachment/album/202105/27/000829h3fcdd9b6p9v9xx9.jpg) + +用户完全有权利关心他们数据的安全和保障。当你在计算机上创建数据时,希望对其进行独家控制是合理的。 + +有许多方法保护你的文件。在文件系统层面,你可以 [加密你的硬盘][2] 或 [只是加密一个文件][3]。不过,一个好的办公套件为你提供了更多的选择,我收集了五种我用开源软件保护文件的方法。 + +### 5 种保护你的文件的方法 + +#### 1、将文件保存在安全的云存储服务中 + +自托管一个开源的内容管理系统(CMS)平台可以让你完全控制你的数据。你的所有数据都留在你的服务器上,你可以控制谁可以访问它。 + +**选项:** [Nextcloud][4]、[ownCloud][5]、[Pydio][6] 和 [Seafile][7] + +所有这些都提供了存储、同步和共享文件和文件夹、管理内容、文件版本等功能。它们可以很容易地取代 Dropbox、Google Drive 和其他专有的云存储,不用将你的数据放在你不拥有、不维护、不管理的服务器上。 + +上面列出的开源的自托管方式符合 GDPR 和其他保护用户数据的国际法规。它们提供备份和数据恢复选项、审计和监控工具、权限管理和数据加密。 + +![Pydio 审计控制][8] + +*Pydio 细胞中的审计控制。(来源:[Pydio.com][9])* + +#### 2、启用静态、传输和端到端的加密功能 + +我们经常笼统地谈论数据加密,但在加密文件时有几个方面需要考虑: + + * 通过**静态加密**(或磁盘加密),你可以保护存储在你的基础设施内或硬盘上的数据。 + * 在使用 HTTPS 等协议时,**传输加密**会保护流量形式的数据。它可以保护你的数据在从一个地方移动到另一个地方时不被拦截和转换。当你把文件上传到你的云端时,这很重要。 + * **端到端加密**(E2EE)通过在一端加密,在另一端解密来保护数据。除非有解密密钥,否则任何第三方都无法读取你的文件,即使他们干扰了这个过程并获得了这个文件的权限。 + +**选项:** CryptPad、ownCloud、ONLYOFFICE 工作区、Nextcloud 和 Seafile + +ownCloud、ONLYOFFICE 工作区、Nextcloud 和 Seafile 支持所有三层的加密。但它们在实现端到端加密的方式上有所不同。 + + * 在 ownCloud 中,有一个 E2EE 插件,允许你对文件夹共享进行加密。 + * 在 Nextcloud 中,桌面客户端有一个文件夹级别的选项。 + * Seafile 通过创建加密库来提供客户端的 E2EE。 + * [ONLYOFFICE 工作区][10] 不仅允许你在存储和共享文件时对其进行加密,而且还允许你在“私人房间”中实时安全地共同编辑文件。加密数据是自动生成和传输的,并且是自己加密的 —— 你不需要保留或记住任何密码。 + * 正如其名称所示,[CryptPad][11] 是完全私有的。所有的内容都是由你的浏览器进行加密和解密的。这意味着文件、聊天记录和文件在你登录的会话之外是无法阅读的。即使是服务管理员也无法得到你的信息。 + +![加密的 CryptPad 存储][12] + +*加密的 CryptPad 存储。(来源:[Cryptpad.fr][13])* + +#### 3、使用数字签名 + +数字签名可以让你验证你是文件内容的原作者,并且没有对其进行过修改。 + +**选项:** LibreOffice Writer、ONLYOFFICE 桌面编辑器、OpenESignForms 和 SignServer + +[LibreOffice][14] 和 [ONLYOFFICE][15] 套件提供了一个对文件数字签名的集成工具。你可以添加一个在文档文本中可见的签名行,并允许你向其他用户请求签名。 + +一旦你应用了数字签名,任何人都不能编辑该文件。如果有人修改文档,签名就会失效,这样你就会知道内容被修改了。 + +在 ONLYOFFICE 中,你可以在 LibreOffice 中签名 OOXML 文件(例如,DOCX、XLSX、PPTX)作为 ODF 和 PDF。如果你试图在 LibreOffice 中签名一个 OOXML 文件,该签名将被标记为“只有部分文件被签署”。 + +![ONLYOFFICE 中的数字签名][16] + +*ONLYOFFICE 中的数字签名。 (来源:[ONLYOFFICE帮助中心][17])* + +[SignServer][18] 和 [Open eSignForms][19] 是免费的电子签名服务,如果你不需要在编辑器中直接签名文件,你可以使用它们。这两个工具都可以让你处理文档,SignServer 还可以让你签名包括 Java 在内的代码,并应用时间戳。 + +#### 4、添加水印 + +水印可避免你的内容在未经授权的情况下被重新分发,并保护你的文件可能包含的任何机密信息。 + +**选项:**Nextcloud 中的 Collabora Online 或 ONLYOFFICE Docs + +当与 Nextcloud 集成时,[ONLYOFFICE Docs][20] 和 [Collabora][21] 允许你在文件、电子表格和演示文稿中嵌入水印。要激活水印功能,必须以管理员身份登录你的 Nextcloud 实例,并在解决方案的设置页面上进入**安全视图设置**。 + +你可以使用占位符将默认的水印替换成你自己的文本。在打开文件时,水印将针对每个用户单独显示。你也可以定义组来区分将看到水印的用户,并选择必须显示水印的共享类型。 + +![水印][22] + +*水印 (Ksenia Fedoruk, [CC BY-SA 4.0][23])* + +你也可以在 LibreOffice 和 ONLYOFFICE 桌面应用程序中的文档中插入水印。然而,在这种情况下,它只是一个放置在主文本层下的文本或图像,任何人都可以轻易地删除它。 + +#### 5、用密码保护文件 + +密码保护允许你安全地存储和交换本地文件。如果有人访问你的桌面或通过电子邮件或其他方法得到受保护的文件,他们不知道密码就无法打开它。 + +**选项:** Apache OpenOffice、LibreOffice 和 ONLYOFFICE 桌面编辑器 + +所有这三种解决方案都提供了为你的敏感文件设置密码的能力。 + +如果一个受保护的文档对你很重要,强烈建议你使用密码管理器保存密码或记住它,因为 LibreOffice、ONLYOFFICE 和 [OpenOffice][24] 不提供密码恢复选项。因此,如果你忘记或丢失了密码,就没有办法恢复或重置密码并打开文件。 + +### 你的数据属于你 + +使用这些方法中的一种或多种来保护你的文件,以保持更安全的在线活动。现在是 21 世纪,计算机太先进了,不能冒险把你的数据交给你无法控制的服务。使用开源,掌握你的数字生活的所有权。 + +你最喜欢的安全使用文档的工具是什么?请在评论中分享它们。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/secure-documents-open-source + +作者:[Ksenia Fedoruk][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/ksenia-fedoruk +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/documents_papers_file_storage_work.png?itok=YlXpAqAJ (Filing papers and documents) +[2]: https://opensource.com/article/21/3/encryption-luks +[3]: https://opensource.com/article/21/3/luks-truecrypt +[4]: https://nextcloud.com/ +[5]: https://owncloud.com/ +[6]: https://pydio.com/ +[7]: https://www.seafile.com/en/home/ +[8]: https://opensource.com/sites/default/files/uploads/pydiocells.png (Pydio audit control) +[9]: http://pydio.com +[10]: https://www.onlyoffice.com/workspace.aspx +[11]: https://cryptpad.fr/ +[12]: https://opensource.com/sites/default/files/uploads/cryptdrive.png (Encrypted CryptPad storage) +[13]: http://cryptpad.fr +[14]: https://www.libreoffice.org/ +[15]: https://www.onlyoffice.com/desktop.aspx +[16]: https://opensource.com/sites/default/files/uploads/onlyoffice_digitalsig.png (Digital signature in ONLYOFFICE) +[17]: http://helpcenter.onlyoffice.com +[18]: https://www.signserver.org/ +[19]: https://github.com/OpenESignForms +[20]: https://www.onlyoffice.com/office-for-nextcloud.aspx +[21]: https://www.collaboraoffice.com/ +[22]: https://opensource.com/sites/default/files/uploads/onlyoffice_watermark.png (Watermark) +[23]: https://creativecommons.org/licenses/by-sa/4.0/ +[24]: https://www.openoffice.org/ diff --git a/published/202105/20210420 A beginner-s guide to network management.md b/published/202105/20210420 A beginner-s guide to network management.md new file mode 100644 index 0000000000..7d5e004bbf --- /dev/null +++ b/published/202105/20210420 A beginner-s guide to network management.md @@ -0,0 +1,203 @@ +[#]: subject: "A beginner's guide to network management" +[#]: via: "https://opensource.com/article/21/4/network-management" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "ddl-hust" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13374-1.html" + +网络管理初学者指南 +====== + +> 了解网络是如何工作的,以及使用开源工具进行网络性能调优的一些窍门。 + +![](https://img.linux.net.cn/data/attachment/album/202105/09/164127umsevtfspssppmsp.jpg) + +大多数人每一天至少会接触到两种类型的网络。当你打开计算机或者移动设备,设备连接到本地 WiFi,本地 WiFi 然后连接到所谓“互联网”的互联网络。 + +但是网络实际上是如何工作的?你的设备如何能够找到互联网、共享打印机或文件共享?这些东西如何知道响应你的设备?系统管理员用什么措施来优化网络的性能? + +开源思想在网络技术领域根深蒂固,因此任何想更多了解网络的人,可以免费获得网络相关的资源。本文介绍了使用开源技术的网络管理相关的基础知识。 + +### 网络是什么? + +计算机网络是由两台或者多台计算机组成的、互相通信的集合。为了使得网络能够工作,网络上一台计算机必须能够找到其他计算机,且通信必须能够从一台计算机到达另外一台。为了解决这一需求,开发和定义了两种不同的通信协议:TCP 和 IP。 + +#### 用于传输的 TCP 协议 + +为了使得计算机之间能够通信,它们之间必须有一种传输信息的手段。人说话产生的声音是通过声波来传递的,计算机是通过以太网电缆、无线电波或微波传输的数字信号进行通信的。这方面的规范被正式定义为 [TCP 协议][2]。 + +#### 用于寻址的 IP 协议 + +计算机必须有一些识别手段才能相互寻址。当人类相互称呼时,我们使用名字和代名词。当计算机相互寻址时,它们使用 IP 地址,如 `192.168.0.1`,IP 地址可以被映射到名称上,如“Laptop”、“Desktop”、“Tux” 或 “Penguin”。这方面的规范被定义为 [IP 协议][3]。 + +### 最小配置设置 + +最简单的网络是一个两台计算机的网络,使用称为“交叉电缆”的特殊布线方式的以太网电缆。交叉电缆将来自一台计算机的信号连接并传输到另一台计算机上的适当受体。还有一些交叉适配器可以将标准的以太网转换为交叉电缆。 + +![Crossover cable][4] + +由于在这两台计算机之间没有路由器,所有的网络管理都必须在每台机器上手动完成,因此这是一个很好的网络基础知识的入门练习。 + +用一根交叉电缆,你可以把两台计算机连接在一起。因为这两台计算机是直接连接的,没有网络控制器提供指导,所以这两台计算机都不用做什么创建网络或加入网络的事情。通常情况下,这项任务会由交换机和 DHCP 服务器或路由器来提示,但在这个简单的网络设置中,这一切都由你负责。 + +要创建一个网络,你必须先为每台计算机分配一个 IP 地址,为自行分配而保留的地址从 169.254 开始,这是一个约定俗成的方式,提醒你本 IP 段是一个闭环系统。 + +#### 找寻网络接口 + +首先,你必须知道你正在使用什么网络接口。以太网端口通常用 “eth” 加上一个从 0 开始的数字来指定,但有些设备用不同的术语来表示接口。你可以用 `ip` 命令来查询计算机上的接口: + +``` +$ ip address show +1: lo: mtu 65536 ... + link/loopback 00:00:00:00:00:00 brd ... + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +2: eth0: ... + link/ether dc:a6:32:be:a3:e1 brd ... +3: wlan0: ... + link/ether dc:a6:32:be:a3:e2 brd ... +``` + +在这个例子中,`eth0` 是正确的接口名称。然而,在某些情况下,你会看到 `en0` 或 `enp0s1` 或类似的东西,所以在使用设备名称之前,一定要先检查它。 + +#### 分配 IP 地址 + +通常情况下,IP 地址是从路由器获得的,路由器在网络上广播提供地址。当一台计算机连接到一个网络时,它请求一个地址。路由器通过介质访问控制(MAC)地址识别设备(注意这个 MAC 与苹果 Mac 电脑无关),并被分配 IP 地址。这就是计算机在网络上找到彼此的方式。 + +在本文的简单网络中,没有路由器来分配 IP 地址及注册设备,因此我们需要手动分配 IP 地址,使用 `ip` 命令来给计算机分配 IP 地址: + +``` +$ sudo ip address add 169.254.0.1 dev eth0 +``` + +给另外一台计算机分配 IP 地址,将 IP 地址增 1: + +``` +$ sudo ip address add 169.254.0.2 dev eth0 +``` + +现在计算机有了交叉电缆作为通信介质,有了独一无二的 IP 地址用来识别身份。但是这个网络还缺少一个重要成分:计算机不知道自己是网络的一部分。 + +#### 设置路由 + +路由器另外的一个功能是设置从一个地方到另一个地方的网络路径,称作路由表,路由表可以简单的看作网络的城市地图。 + +虽然现在我们还没有设置路由表,但是我们可以通过 `route` 命令来查看路由表: + +``` +$ route +Kernel IP routing table +Destination | Gateway | Genmask | Flags|Metric|Ref | Use | Iface +$ +``` + +同样,你可以通过 `ip` 命令来查看路由表: + +``` +$ ip route +$ +``` + +通过 `ip` 命令添加一条路由信息: + +``` +$ sudo ip route \ + add 169.254.0.0/24 \ + dev eth0 \ + proto static +``` + +这条命令为 `eth0` 接口添加一个地址范围(从 `169.254.0.0` 开始到 `169.254.0.255` 结束)的路由。它将路由协议设置为“静态”,表示作为管理员的你创建了这个路由,作为对该范围内的任何动态路由进行覆盖。 + +通过 `route` 命令来查询路由表: + +``` +$ route +Kernel IP routing table +Destination | Gateway | Genmask       | ... | Iface +link-local  | 0.0.0.0 | 255.255.255.0 | ... | eth0 +``` + +或者使用`ip`命令从不同角度来查询路由表: + +``` +$ ip route +169.254.0.0/24 dev eth0 proto static scope link +``` + +#### 探测相邻网络 + +现在,你的网络有了传输方式、寻址方法以及网络路由。你可以联系到你的计算机以外的主机。向另一台计算机发送的最简单的信息是一个 “呯”,这也是产生该信息的命令的名称(`ping`)。 + +``` +$ ping -c1 169.254.0.2 +64 bytes from 169.254.0.2: icmp_seq=1 ttl=64 time=0.233 ms + +--- 169.254.0.2 ping statistics --- +1 packets transmitted, 1 received, 0% packet loss, time 0ms +rtt min/avg/max/mdev = 0.244/0.244/0.244/0.000 ms +``` + +你可以通过下面的命令看到与你交互的邻居: + +``` +$ ip neighbour +169.254.0.2 dev eth0 lladdr e8:6a:64:ac:ef:7c STALE +``` + +### 通过交换机扩展你的网络 + +只需要双节点的网络并不多。为了解决这个问题,人们开发了特殊的硬件,称为网络“交换机”。网络交换机允许你将几条以太网电缆连接到它上面,它将消息不加区分地从发送消息的计算机分发到交换机上所有监听的计算机。除了拥有与预期接收者相匹配的 IP 地址的计算机外,其他所有计算机都会忽略该信息。这使得网络变得相对嘈杂,但这是物理上,将一组计算机连接在一起的简单方法。 + +在大多数现代家庭网络中,用于物理电缆的物理交换机并不实用。所以 WiFi 接入点代替了物理交换机。WiFi 接入点的功能与交换机相同:它允许许多计算机连接到它并在它们之间传递信息。 + +接入互联网不仅仅是一种期望,它通常是家庭网络存在的原因。没有接入互联网的交换机或 WiFi 接入点不是很有用,但要将你的网络连接到另一个网络,你需要一个路由器。 + +#### 添加路由器 + +实际上,本地网络连接了许多设备,并且越来越多的设备具备联网能力,使得网络的规模呈数量级级别增长。 + +手动配置网络是不切实际的,因此这些任务分配给网络中特定的节点来处理,网络中每台计算机运行一个后台守护进程,以填充从网络上的权威服务器收到的网络设置。家庭网络中,这些工作通常被整合到一个小型嵌入式设备中,通常由你的互联网服务提供商(ISP)提供,称为**路由器**(人们有时错误地将其称为调制解调器)。在一个大型网络中,每项工作通常被分配到一个单独的专用服务器上,以确保专用服务器能够专注于自己的工作以及保证工作弹性。这些任务包括: + +- DHCP 服务器,为加入网络的设备分配和跟踪 IP 地址 +- DNS 服务器将诸如域名 [redhat.com][7] 转换成 IP 地址 `209.132.183.105` +- [防火墙][8] 保护你的网络免受不需要的传入流量或被禁止的传出流量 +- 路由器有效传输网络流量,作为其他网络(如互联网)的网关,并进行网络地址转换(NAT) + +你现在的网络上可能有一个路由器,它可能管理着所有这些任务,甚至可能更多。感谢像 VyOS 这样的项目,现在你可以运行 [自己的开源路由器][9]。对于这样一个项目,你应该使用一台专门的计算机,至少有两个网络接口控制器(NIC):一个连接到你的 ISP,另一个连接到交换机,或者更有可能是一个 WiFi 接入点。 + +### 扩大你的知识规模 + +无论你的网络上有多少设备,或你的网络连接到多少其他网络,其原则仍然与你的双节点网络相同。你需要一种传输方式,一种寻址方案,以及如何路由到网络的知识。 + +### 网络知识速查表 + +了解网络是如何运作的,对管理网络至关重要。除非你了解你的测试结果,否则你无法排除问题,除非你知道哪些命令能够与你的网络设备交互,否则你无法运行测试。对于重要的网络命令的基本用法以及你可以用它们提取什么样的信息,[请下载我们最新的网络速查表][10]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/network-management + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[ddl-hust](https://github.com/ddl-hust) +校对:[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/gears_devops_learn_troubleshooting_lightbulb_tips_520.png?itok=HcN38NOk "Tips and gears turning" +[2]: https://tools.ietf.org/html/rfc793 +[3]: https://tools.ietf.org/html/rfc791 +[4]: https://opensource.com/sites/default/files/uploads/crossover.jpg "Crossover cable" +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/article/17/4/build-your-own-name-server +[7]: http://redhat.com +[8]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd +[9]: https://opensource.com/article/20/1/open-source-networking +[10]: https://opensource.com/downloads/cheat-sheet-networking \ No newline at end of file diff --git a/published/202105/20210420 Application observability with Apache Kafka and SigNoz.md b/published/202105/20210420 Application observability with Apache Kafka and SigNoz.md new file mode 100644 index 0000000000..e61e766e37 --- /dev/null +++ b/published/202105/20210420 Application observability with Apache Kafka and SigNoz.md @@ -0,0 +1,135 @@ +[#]: subject: (Application observability with Apache Kafka and SigNoz) +[#]: via: (https://opensource.com/article/21/4/observability-apache-kafka-signoz) +[#]: author: (Nitish Tiwari https://opensource.com/users/tiwarinitish86) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13352-1.html) + +使用 Apache Kafka 和 SigNoz 实现应用可观测性 +====== + +> SigNoz 帮助开发者使用最小的精力快速实现他们的可观测性目标。 + +![](https://img.linux.net.cn/data/attachment/album/202105/01/231703oy5ln5nnqkuhxt1t.jpg) + +SigNoz 是一个开源的应用可观察性平台。SigNoz 是用 React 和 Go 编写的,它从头到尾都是为了让开发者能够以最小的精力尽快实现他们的可观察性目标。 + +本文将详细介绍该软件,包括架构、基于 Kubernetes 的部署以及一些常见的 SigNoz 用途。 + +### SigNoz 架构 + +SigNoz 将几个组件捆绑在一起,创建了一个可扩展的、耦合松散的系统,很容易上手使用。其中一些最重要的组件有: + + * OpenTelemetry Collector + * Apache Kafka + * Apache Druid + +[OpenTelemetry Collector][2] 是跟踪或度量数据收集引擎。这使得 SigNoz 能够以行业标准格式获取数据,包括 Jaeger、Zipkin 和 OpenConsensus。之后,收集的数据被转发到 Apache Kafka。 + +SigNoz 使用 Kafka 和流处理器来实时获取大量的可观测数据。然后,这些数据被传递到 Apache Druid,它擅长于存储这些数据,用于短期和长期的 SQL 分析。 + +当数据被扁平化并存储在 Druid 中,SigNoz 的查询服务可以查询并将数据传递给 SigNoz React 前端。然后,前端为用户创建漂亮的图表,使可观察性数据可视化。 + +![SigNoz architecture][3] + +### 安装 SigNoz + +SigNoz 的组件包括 Apache Kafka 和 Druid。这些组件是松散耦合的,并协同工作,以确保终端用户的无缝体验。鉴于这些组件,最好将 SigNoz 作为 Kubernetes 或 Docker Compose(用于本地测试)上的微服务组合来运行。 + +这个例子使用基于 Kubernetes Helm Chart 的部署在 Kubernetes 上安装 SigNoz。作为先决条件,你需要一个 Kubernetes 集群。如果你没有可用的 Kubernetes 集群,你可以使用 [MiniKube][5] 或 [Kind][6] 等工具,在你的本地机器上创建一个测试集群。注意,这台机器至少要有 4GB 的可用空间才能工作。 + +当你有了可用的集群,并配置了 kubectl 来与集群通信,运行: + +``` +$ git clone https://github.com/SigNoz/signoz.git && cd signoz +$ helm dependency update deploy/kubernetes/platform +$ kubectl create ns platform +$ helm -n platform install signoz deploy/kubernetes/platform +$ kubectl -n platform apply -Rf deploy/kubernetes/jobs +$ kubectl -n platform apply -f deploy/kubernetes/otel-collector +``` + +这将在集群上安装 SigNoz 和相关容器。要访问用户界面 (UI),运行 `kubectl port-forward` 命令。例如: + +``` +$ kubectl -n platform port-forward svc/signoz-frontend 3000:3000 +``` + +现在你应该能够使用本地浏览器访问你的 SigNoz 仪表板,地址为 `http://localhost:3000`。 + +现在你的可观察性平台已经建立起来了,你需要一个能产生可观察性数据的应用来进行可视化和追踪。对于这个例子,你可以使用 [HotROD][7],一个由 Jaegar 团队开发的示例应用。 + +要安装它,请运行: + +``` +$ kubectl create ns sample-application +$ kubectl -n sample-application apply -Rf sample-apps/hotrod/ +``` + +### 探索功能 + +现在你应该有一个已经安装合适仪表的应用,并可在演示设置中运行。看看 SigNoz 仪表盘上的指标和跟踪数据。当你登录到仪表盘的主页时,你会看到一个所有已配置的应用列表,这些应用正在向 SigNoz 发送仪表数据。 + +![SigNoz dashboard][8] + +#### 指标 + +当你点击一个特定的应用时,你会登录到该应用的主页上。指标页面显示最近 15 分钟的信息(这个数字是可配置的),如应用的延迟、平均吞吐量、错误率和应用目前访问最高的接口。这让你对应用的状态有一个大概了解。任何错误、延迟或负载的峰值都可以立即看到。 + +![Metrics in SigNoz][9] + +#### 追踪 + +追踪页面按时间顺序列出了每个请求的高层细节。当你发现一个感兴趣的请求(例如,比预期时间长的东西),你可以点击追踪,查看该请求中发生的每个行为的单独时间跨度。下探模式提供了对每个请求的彻底检查。 + +![Tracing in SigNoz][10] + +![Tracing in SigNoz][11] + +#### 用量资源管理器 + +大多数指标和跟踪数据都非常有用,但只在一定时期内有用。随着时间的推移,数据在大多数情况下不再有用。这意味着为数据计划一个适当的保留时间是很重要的。否则,你将为存储支付更多的费用。用量资源管理器提供了每小时、每一天和每一周获取数据的概况。 + +![SigNoz Usage Explorer][12] + +### 添加仪表 + +到目前为止,你一直在看 HotROD 应用的指标和追踪。理想情况下,你会希望对你的应用进行检测,以便它向 SigNoz 发送可观察数据。参考 SigNoz 网站上的[仪表概览][13]。 + +SigNoz 支持一个与供应商无关的仪表库,OpenTelemetry,作为配置仪表的主要方式。OpenTelemetry 提供了各种语言的仪表库,支持自动和手动仪表。 + +### 了解更多 + +SigNoz 帮助开发者快速开始度量和跟踪应用。要了解更多,你可以查阅 [文档][14],加入[社区][15],并访问 [GitHub][16] 上的源代码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/observability-apache-kafka-signoz + +作者:[Nitish Tiwari][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/tiwarinitish86 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek (Ship captain sailing the Kubernetes seas) +[2]: https://github.com/open-telemetry/opentelemetry-collector +[3]: https://opensource.com/sites/default/files/uploads/signoz_architecture.png (SigNoz architecture) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://minikube.sigs.k8s.io/docs/start/ +[6]: https://kind.sigs.k8s.io/docs/user/quick-start/ +[7]: https://github.com/jaegertracing/jaeger/tree/master/examples/hotrod +[8]: https://opensource.com/sites/default/files/uploads/signoz_dashboard.png (SigNoz dashboard) +[9]: https://opensource.com/sites/default/files/uploads/signoz_applicationmetrics.png (Metrics in SigNoz) +[10]: https://opensource.com/sites/default/files/uploads/signoz_tracing.png (Tracing in SigNoz) +[11]: https://opensource.com/sites/default/files/uploads/signoz_tracing2.png (Tracing in SigNoz) +[12]: https://opensource.com/sites/default/files/uploads/signoz_usageexplorer.png (SigNoz Usage Explorer) +[13]: https://signoz.io/docs/instrumentation/overview/ +[14]: https://signoz.io/docs/ +[15]: https://github.com/SigNoz/signoz#community +[16]: https://github.com/SigNoz/signoz diff --git a/published/202105/20210421 Build smaller containers.md b/published/202105/20210421 Build smaller containers.md new file mode 100644 index 0000000000..5d54b9d024 --- /dev/null +++ b/published/202105/20210421 Build smaller containers.md @@ -0,0 +1,345 @@ +[#]: subject: (Build smaller containers) +[#]: via: (https://fedoramagazine.org/build-smaller-containers/) +[#]: author: (Daniel Schier https://fedoramagazine.org/author/danielwtd/) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13382-1.html) + +如何构建更小的容器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/12/112108han4e111a6v16act.jpg) + +使用容器工作是很多用户和开发者的日常任务。容器开发者经常需要频繁地(重新)构建容器镜像。如果你开发容器,你有想过减小镜像的大小吗?较小的镜像有一些好处。在下载的时候所需要的带宽更少,而且在云环境中运行的时候也可以节省开销。而且在 Fedora [CoreOS][4]、[IoT][5] 以及[Silverblue][6] 上使用较小的容器镜像可以提升整体系统性能,因为这些操作系统严重依赖于容器工作流。这篇文章将会提供一些减小容器镜像大小的技巧。 + +### 工具 + +以下例子所用到的主机操作系统是 Fedora Linux 33。例子使用 [Podman][7] 3.1.0 和[Buildah][8] 1.2.0。Podman 和 Buildah 已经预装在大多数 Fedora Linux 变种中。如果你没有安装 Podman 和 Buildah,可以用下边的命令安装: + +``` +$ sudo dnf install -y podman buildah +``` + +### 任务 + +从一个基础的例子开始。构建一个满足以下需求的 web 容器: + + * 容器必须基于 Fedora Linux + * 使用 Apache httpd web 服务器 + * 包含一个定制的网站 + * 容器应该比较小 + +下边的步骤也适用于比较复杂的镜像。 + +### 设置 + +首先,创建一个工程目录。这个目录将会包含你的网站和容器文件: + +``` +$ mkdir smallerContainer +$ cd smallerContainer +$ mkdir files +$ touch files/index.html +``` + +制作一个简单的登录页面。对于这个演示,你可以将下面的 HTML 复制到 `index.html` 文件中。 + +``` + + + + + Container Page + + + +
        +

        Container Page

        +
        +
        +

        Fedora

        + +

        Podman

        + +

        Buildah

        + +

        Skopeo

        + +

        CRI-O

        + +
        + + + +``` + +此时你可以选择在浏览器中测试上面的 `index.html` 文件: + +``` +$ firefox files/index.html +``` + +最后,创建一个容器文件。这个文件可以命名为 `Dockerfile` 或者 `Containerfile`: + +``` +$ touch Containerfile +``` + +现在你应该有了一个工程目录,并且该目录中的文件系统布局如下: + +``` +smallerContainer/ +|- files/ +| |- index.html +| +|- Containerfile +``` + +### 构建 + +现在构建镜像。下边的每个阶段都会添加一层改进来帮助减小镜像的大小。你最终会得到一系列镜像,但只有一个 `Containerfile`。 + +#### 阶段 0:一个基本的容器镜像 + +你的新镜像将会非常简单,它只包含强制性步骤。在 `Containerfile` 中添加以下内容: + +``` +# 使用 Fedora 33 作为基镜像 +FROM registry.fedoraproject.org/fedora:33 + +# 安装 httpd +RUN dnf install -y httpd + +# 复制这个网站 +COPY files/* /var/www/html/ + +# 设置端口为 80/tcp +EXPOSE 80 + +# 启动 httpd +CMD ["httpd", "-DFOREGROUND"] +``` + +在上边的文件中有一些注释来解释每一行内容都是在做什么。更详细的步骤: + + 1. 在 `FROM registry.fedoraproject.org/fedora:33` 的基础上创建一个构建容器 + 2. 运行命令: `dnf install -y httpd` + 3. 将与 `Containerfile` 有关的文件拷贝到容器中 + 4. 设置 `EXPOSE 80` 来说明哪个端口是可以自动设置的 + 5. 设置一个 `CMD` 指令来说明如果从这个镜像创建一个容器应该运行什么 + +运行下边的命令从工程目录创建一个新的镜像: + +``` +$ podman image build -f Containerfile -t localhost/web-base +``` + +使用一下命令来查看你的镜像的属性。注意你的镜像的大小(467 MB)。 + +``` +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-base latest ac8c5ed73bb5 5 minutes ago 467 MB +registry.fedoraproject.org/fedora 33 9f2a56037643 3 months ago 182 MB +``` + +以上这个例子中展示的镜像在现在占用了467 MB的空间。剩下的阶段将会显著地减小镜像的大小。但是首先要验证镜像是否能够按照预期工作。 + +输入以下命令来启动容器: + +``` +$ podman container run -d --name web-base -P localhost/web-base +``` + +输入以下命令可以列出你的容器: + +``` +$ podman container ls +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +d24063487f9f localhost/web-base httpd -DFOREGROUN... 2 seconds ago Up 3 seconds ago 0.0.0.0:46191->80/tcp web-base +``` + +以上展示的容器正在运行,它正在监听的端口是 `46191` 。从运行在主机操作系统上的 web 浏览器转到 `localhost:46191` 应该呈现你的 web 页面: + +``` +$ firefox localhost:46191 +``` + +#### 阶段 1:清除缓存并将残余的内容从容器中删除 + +为了优化容器镜像的大小,第一步应该总是执行“清理”。这将保证安装和打包所残余的内容都被删掉。这个过程到底需要什么取决于你的容器。对于以上的例子,只需要编辑 `Containerfile` 让它包含以下几行。 + +``` +[...] +# Install httpd +RUN dnf install -y httpd && \ + dnf clean all -y +[...] +``` + +构建修改后的 `Containerfile` 来显著地减小镜像(这个例子中是 237 MB)。 + +``` +$ podman image build -f Containerfile -t localhost/web-clean +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-clean latest f0f62aece028 6 seconds ago 237 MB +``` + +#### 阶段 2:删除文档和不需要的依赖包 + +许多包在安装时会被建议拉下来,包含一些弱依赖和文档。这些在容器中通常是不需要的,可以删除。 `dnf` 命令有选项可以表明它不需要包含弱依赖或文档。 + +再次编辑 `Containerfile` ,并在 `dnf install` 行中添加删除文档和弱依赖的选项: + +``` +[...] +# Install httpd +RUN dnf install -y httpd --nodocs --setopt install_weak_deps=False && \ + dnf clean all -y +[...] +``` + +构建经过以上修改后的 `Containerfile` 可以得到一个更小的镜像(231 MB)。 + +``` +$ podman image build -f Containerfile -t localhost/web-docs +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-docs latest 8a76820cec2f 8 seconds ago 231 MB +``` + +#### 阶段 3:使用更小的容器基镜像 + +前面的阶段结合起来,使得示例镜像的大小减少了一半。但是仍然还有一些途径来进一步减小镜像的大小。这个基镜像 `registry.fedoraproject.org/fedora:33` 是通用的。它提供了一组软件包,许多人希望这些软件包预先安装在他们的 Fedora Linux 容器中。但是,通用的 Fedora Linux 基镜像中提供的包通常必须要的更多。Fedora 项目也为那些希望只从基本包开始,然后只添加所需内容来实现较小总镜像大小的用户提供了一个 `fedora-minimal` 镜像。 + +使用 `podman image search` 来查找 `fedora-minimal` 镜像,如下所示: + +``` +$ podman image search fedora-minimal +INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED +fedoraproject.org registry.fedoraproject.org/fedora-minimal 0 +``` + +`fedora-minimal` 基镜像不包含 [DNF][9],而是倾向于使用不需要 Python 的较小的 [microDNF][10]。当 `registry.fedoraproject.org/fedora:33` 被 `registry.fedoraproject.org/fedora-minimal:33` 替换后,需要用 `microdnf` 命令来替换 `dnf`。 + +``` +# 使用 Fedora minimal 33 作为基镜像 +FROM registry.fedoraproject.org/fedora-minimal:33 + +# 安装 httpd +RUN microdnf install -y httpd --nodocs --setopt install_weak_deps=0 && \ + microdnf clean all -y +[...] +``` +使用 `fedora-minimal` 重新构建后的镜像大小如下所示 (169 MB): + +``` +$ podman image build -f Containerfile -t localhost/web-docs +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-minimal latest e1603bbb1097 7 minutes ago 169 MB +``` + +最开始的镜像大小是 **467 MB**。结合以上每个阶段所提到的方法,进行重新构建之后可以得到最终大小为 **169 MB** 的镜像。最终的 _总_ 镜像大小比最开始的 _基_ 镜像小了 182 MB! + +### 从零开始构建容器 + +前边的内容使用一个容器文件和 Podman 来构建一个新的镜像。还有最后一个方法要展示——使用 Buildah 来从头构建一个容器。Podman 使用与 Buildah 相同的库来构建容器。但是 Buildah 被认为是一个纯构建工具。Podman 被设计来是为了代替 Docker 的。 + +使用 Buildah 从头构建的容器是空的——它里边什么都 _没有_ 。所有的东西都需要安装或者从容器外复制。幸运地是,使用 Buildah 相当简单。下边是一个从头开始构建镜像的小的 Bash 脚本。除了运行这个脚本,你也可以在终端逐条地运行脚本中的命令,来更好的理解每一步都是做什么的。 + +``` +#!/usr/bin/env bash +set -o errexit + +# 创建一个容器 +CONTAINER=$(buildah from scratch) + +# 挂载容器文件系统 +MOUNTPOINT=$(buildah mount $CONTAINER) + +# 安装一个基本的文件系统和最小的包以及 nginx +dnf install -y --installroot $MOUNTPOINT --releasever 33 glibc-minimal-langpack httpd --nodocs --setopt install_weak_deps=False + +dnf clean all -y --installroot $MOUNTPOINT --releasever 33 + +# 清除 +buildah unmount $CONTAINER + +# 复制网站 +buildah copy $CONTAINER 'files/*' '/var/www/html/' + +# 设置端口为 80/tcp +buildah config --port 80 $CONTAINER + +# 启动 httpd +buildah config --cmd "httpd -DFOREGROUND" $CONTAINER + +# 将容器保存为一个镜像 +buildah commit --squash $CONTAINER web-scratch +``` + +或者,可以通过将上面的脚本传递给 Buildah 来构建镜像。注意不需要 root 权限。 + +``` +$ buildah unshare bash web-scratch.sh +$ podman image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +localhost/web-scratch latest acca45fc9118 9 seconds ago 155 MB +``` + +最后的镜像只有 **155 MB**!而且 [攻击面][11] 也减少了。甚至在最后的镜像中都没有安装 DNF(或者 microDNF)。 + +### 结论 + +构建一个比较小的容器镜像有许多优点。减少所需要的带宽、磁盘占用以及攻击面,都会得到更好的镜像。只用很少的更改来减小镜像的大小很简单。许多更改都可以在不改变结果镜像的功能下完成。 + +只保存所需的二进制文件和配置文件来构建非常小的镜像也是可能的。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/build-smaller-containers/ + +作者:[Daniel Schier][a] +选题:[lujun9972][b] +译者:[ShuyRoy](https://github.com/Shuyroy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/danielwtd/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/podman-smaller-1-816x345.jpg +[2]: https://unsplash.com/@errbodysaycheese?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/otter?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://fedoramagazine.org/getting-started-with-fedora-coreos/ +[5]: https://getfedora.org/en/iot/ +[6]: https://fedoramagazine.org/what-is-silverblue/ +[7]: https://podman.io/ +[8]: https://buildah.io/ +[9]: https://github.com/rpm-software-management/dnf +[10]: https://github.com/rpm-software-management/microdnf +[11]: https://en.wikipedia.org/wiki/Attack_surface diff --git a/published/202105/20210422 Running Linux Apps In Windows Is Now A Reality.md b/published/202105/20210422 Running Linux Apps In Windows Is Now A Reality.md new file mode 100644 index 0000000000..b28e1eb194 --- /dev/null +++ b/published/202105/20210422 Running Linux Apps In Windows Is Now A Reality.md @@ -0,0 +1,117 @@ +[#]: subject: (Running Linux Apps In Windows Is Now A Reality) +[#]: via: (https://news.itsfoss.com/linux-gui-apps-wsl/) +[#]: author: (Jacob Crume https://news.itsfoss.com/author/jacob/) +[#]: collector: (lujun9972) +[#]: translator: (Kevin3599) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13376-1.html) + +在 Windows 中运行基于 Linux 的应用程序已经成为现实 +====== + +> 微软宣布对其 WSL 进行重大改进,使你能够轻松地运行 Linux 图形化应用程序。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/linux-apps-windows.png?w=1200&ssl=1) + +当微软在 2016 年发布 “Windows subsystem for Linux”(也就是 WSL)的时候显然有夸大宣传的嫌疑,当时人们梦想着无需重启就可以同时运行基于 Windows 和 Linux 的应用程序,令人可惜的是,WSL 只能运行 Linux 终端程序。 + +去年,微软再次尝试去颠覆 Windows 的应用生态,这一次,他们替换了老旧的模拟核心,转而使用了真正的 Linux 核心,这一变化使你可以 [在 Windows 中运行 Linux 应用程序][2]。 + +### WSL 图形化应用的初步预览 + +![https://youtu.be/f8_nvJzuaSU](https://img.linux.net.cn//static/video/Introducing%20Linux%20GUI%20apps%20running%20on%20Windows%20using%20the%20Windows%20Subsystem%20for%20Linux%20%28WSL%29-f8_nvJzuaSU.mp4) + +从技术上讲,用户最初确实在 WSL 上获得了对 Linux 图形化应用程序的支持,但仅限于使用第三方 X 服务器时。这通常是不稳定的、缓慢、难以设置,并且使人们有隐私方面的顾虑。 + +结果是小部分 Linux 爱好者(碰巧运行 Windows),他们具有设置 X 服务器的能力。但是,这些爱好者对没有硬件加速支持感到失望。 + +所以,较为明智的方法是在 WSL 上只运行基于命令行的程序。 + +**但是现在这个问题得到了改善**。现在,微软 [正式支持][4] 了 Linux 图形化应用程序,我们很快就能够享受硬件加速了, + +### 面向大众的 Linux 图形化应用程序:WSLg + +![图片来源:Microsoft Devblogs][5] + +随着微软发布新的 WSL,有了一系列巨大的改进,它们包括: + + * GPU 硬件加速 + * 开箱即用的音频和麦克风支持 + * 自动启用 X 服务器和 Pulse 音频服务 + +有趣的是,开发者们给这个功能起了一个有趣的外号 “WSLg”。 + +这些功能将使在 WSL 上运行 Linux 应用程序几乎与运行原生应用程序一样容易,同时无需占用过多性能资源。 + +因此,你可以尝试运行 [自己喜欢的 IDE][6]、特定于 Linux 的测试用例以及诸如 [CAD][7] 之类的各种软件。 + +#### Linux 应用的 GPU 硬件加速 + +![图片鸣谢:Microsoft Devblogs][8] + +以前在 Windows 上运行图形化 Linux 程序的最大问题之一是它们无法使用硬件加速。当用户尝试移动窗口和执行任何需要对 GPU 性能有要求的任务时候,它常常陷入缓慢卡顿的局面。 + +根据微软发布的公告: + +> “作为此次更新的一部分,我们也启用了对 3D 图形的 GPU 加速支持,多亏了 Mesa 21.0 中完成的工作,所有的复杂 3D 渲染的应用程序都可以利用 OpenGL 在 Windows 10 上使用 GPU 为这些应用程序提供硬件加速。” + +这是一个相当实用的改进,这对用户在 WSL 下运行需求强大 GPU 性能的应用程序提供了莫大帮助。 + +#### 开箱即用的音频和麦克风支持! + +如果想要良好的并行 Windows 和 Linux 程序,好的音频支持是必不可少的,随着新的 WSL 发布,音频得到开箱即用的支持,这都要归功于随着 X 服务器一同启动的 Pulse 音频服务。 + +微软解释说: + +> “WSL 上的 Linux 图形化应用程序还将包括开箱即用的音频和麦克风支持。这一令人兴奋的改进将使你的应用程序可以播放音频提示并调用麦克风,适合构建、测试或使用电影播放器、电信应用程序等。” + +如果我们希望 Linux 变得更加普及,这是一项关键功能。这也将允许 Windows 应用的开发人员更好地将其应用移植到 Linux。 + +#### 自动启动所有必需的服务器 + +![图片鸣谢:Microsoft Devblogs][9] + +以前,你必须先手动启动 [PulseAudio][10] 和 [X 服务器][11],然后才能运行应用程序。现在,微软已经实现了一项服务,可以检查 Linux 应用程序是否正在运行,然后自动启动所需的服务器。 + +这使得用户更容易在 Windows 上运行 Linux 应用程序。 + +微软声称这些改动会显著提升用户体验。 + +> “借助此功能,我们将启动一个配套的系统分发包,其中包含 Wayland、X 服务器、Pulse 音频服务以及使 Linux 图形化应用程序与 Windows 通信所需的所有功能。使用完图形化应用程序并终止 WSL 发行版后,系统分发包也会自动结束其会话。” + +这些组件的结合使 Linux 图形化应用程序与常规 Windows 程序并行运行更为简单。 + +### 总结 + +有了这些新功能,微软似乎正在竭尽全力使 Linux 应用程序在 Windows 上运行。随着越来越多的用户在 Windows 上运行 Linux 应用程序,我们可能会看到更多的用户转向 Linux。特别是因为他们习惯的应用程序能够运行。 + +如果这种做法取得了成功(并且微软几年后仍未将其雪藏),它将结束 5 年来对将 Linux 应用引入 Windows 的探索。如果你想了解更多信息,可以查看 [发行公告][12]。 + +你对在 Windows 上运行 Linux 图形化应用程序怎么看?请在下面留下你的评论。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/linux-gui-apps-wsl/ + +作者:[Jacob Crume][a] +选题:[lujun9972][b] +译者:[Kevin3599](https://github.com/Kevin3599) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://docs.microsoft.com/en-us/windows/wsl/ +[2]: https://itsfoss.com/run-linux-apps-windows-wsl/ +[3]: https://i0.wp.com/i.ytimg.com/vi/f8_nvJzuaSU/hqdefault.jpg?w=780&ssl=1 +[4]: https://devblogs.microsoft.com/commandline/the-initial-preview-of-gui-app-support-is-now-available-for-the-windows-subsystem-for-linux-2/ +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/gedit-wsl-gui.png?w=800&ssl=1 +[6]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[7]: https://itsfoss.com/cad-software-linux/ +[8]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/gpu-acceleration-wsl.png?w=800&ssl=1 +[9]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/wslg-architecture.png?w=800&ssl=1 +[10]: https://www.freedesktop.org/wiki/Software/PulseAudio/ +[11]: https://x.org/wiki/ +[12]: https://blogs.windows.com/windows-insider/2021/04/21/announcing-windows-10-insider-preview-build-21364/ diff --git a/published/202105/20210423 What-s New in Ubuntu MATE 21.04.md b/published/202105/20210423 What-s New in Ubuntu MATE 21.04.md new file mode 100644 index 0000000000..870b8c13fc --- /dev/null +++ b/published/202105/20210423 What-s New in Ubuntu MATE 21.04.md @@ -0,0 +1,107 @@ +[#]: subject: (What’s New in Ubuntu MATE 21.04) +[#]: via: (https://news.itsfoss.com/ubuntu-mate-21-04-release/) +[#]: author: (Asesh Basu https://news.itsfoss.com/author/asesh/) +[#]: collector: (lujun9972) +[#]: translator: (Kevin3599) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13349-1.html) + +Ubuntu MATE 21.04 更新,多项新功能来袭 +====== + +> 与 Yaru 团队合作,Ubuntu MATE 带来了一个主题大修、一系列有趣的功能和性能改进。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/ubuntu-21-04-mate-release.png?w=1200&ssl=1) + +自从 18.10 发行版以来,Yaru 一直都是 Ubuntu 的默认用户桌面,今年,Yaru 团队与Canonical Design 和 Ubuntu 桌面团队携手合作,为 Ubuntu MATE 21.04 创建了新的外观界面。 + +### Ubuntu MATE 21.04 有什么新变化? + +以下就是 Ubuntu MATE 21.04 此次发布中的关键变化: + +#### MATE 桌面 + +此次更新的 MATE 桌面相比以往并没有较大改动,此次只是修复了错误 BUG 同时更新了语言翻译,Debian 中的 MATE 软件包已经更新,用户可以下载所有的 BUG 修复和更新。 + +#### Avatana 指示器 + +![][1] + +这是一个控制面板指示器(也称为系统托盘)的动作、布局和行为的系统。现在,你可以从控制中心更改 Ayatana 指示器的设置。 + +添加了一个新的打印机标识,并删除了 RedShift 以保持稳定。 + +#### Yaru MATE 主题 + +Yaru MATE 现在是 Yaru 主题的派生产品。Yaru MATE 将提供浅色和深色主题,浅色作为默认主题。来确保更好的应用程序兼容性。 + +从现在开始,用户可以使用 GTK 2.x、3.x、4.x 浅色和深色主题,也可以使用 Suru 图标以及一些新的图标。 + +LibreOffice 在 MATE 上会有新的默认桌面图标,字体对比度也得到了改善。你会发现阅读小字体文本或远距离阅读更加容易。 + +如果在系统层面选择了深色模式,网站将维持深色。要让网站和系统的其它部分一起使用深色主题,只需启用 Yaru MATE 深色主题即可。 + +现在,Macro、Metacity 和 Compiz 的管理器主题使用了矢量图标。这意味着,如果你的屏幕较大,图标不会看起来像是像素画,又是一个小细节! + +#### Yaru MATE Snap 包 + +尽管你现在无法安装 MATE 主题,但是不要着急,它很快就可以了。gtk-theme-yaru-mate 和 icon-theme-yaru-mate Snap 包是预安装的,可以在需要将主题连接到兼容的 Snap 软件包时使用。 + +根据官方发布的公告,Snapd 很快就会自动将你的主题连接到兼容的 Snap 包: + +> Snapd 很快就能自动安装与你当前活动主题相匹配的主题的 snap 包。我们创建的 snap 包已经准备好在该功能可用时与之整合。 + +#### Mutiny 布局的新变化 + +![应用了深色主题的 Mutiny 布局][2] + +Mutiny 布局模仿了 Unity 的桌面布局。删除了 MATE 软件坞小应用,并且对 Mutiny 布局进行了优化以使用 Plank。Plank 会被系统自动应用主题。这是通过 Mate Tweak 切换到 Mutiny 布局完成的。Plank 的深色和浅色 Yaru 主题都包含在内。 + +其他调整和更新使得 Mutiny 在不改变整体风格的前提下具备了更高的可靠性 + +#### 主要应用升级 + + * Firefox 87(火狐浏览器) + * LibreOffice 7.1.2.2(办公软件) + * Evolution 3.40(邮件) + * Celluloid 0.20(视频播放器) + +#### 其他更改 + + * Linux 命令的忠实用户会喜欢在 Ubuntu MATE 中默认安装的 `neofetch`、`htop` 和 `inxi` 之类的命令。 + * 树莓派的 21.04 版本很快将会发布。 + * Ubuntu MATE 上没有离线升级选项。 + * 针对侧边和底部软件坞引入了新的 Plank 主题,使其与 Yaru MATE 的配色方案相匹配。 + * Yaru MATE 的窗口管理器为侧边平铺的窗口应用了简洁的边缘风格。 + * Ubuntu MATE 欢迎窗口有多种色彩可供选择。 + * Yaru MATE 主题和图标主题的快照包已在 Snap Store 中发布。 + * 为 Ubuntu MATE 20.04 LTS 的用户发布了 Yaru MATE PPA。 + +### 下载 Ubuntu MATE 21.04 + +你可以从官网上下载镜像: + +- [Ubuntu MATE 21.04][3] + +如果你对此感兴趣,[请查看发行说明][4]。 + +你对尝试新的 Yaru MATE 感到兴奋吗?你觉得怎么样?请在下面的评论中告诉我们。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/ubuntu-mate-21-04-release/ + +作者:[Asesh Basu][a] +选题:[lujun9972][b] +译者:[Kevin3599](https://github.com/Kevin3599) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/asesh/ +[b]: https://github.com/lujun9972 +[1]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/yaru-mate-mutiny-dark.jpg?resize=1568%2C882&ssl=1 +[2]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/yaru-mate-mutiny-dark.jpg?resize=1568%2C882&ssl=1 +[3]: https://ubuntu-mate.org/download/ +[4]: https://discourse.ubuntu.com/t/hirsute-hippo-release-notes/19221 \ No newline at end of file diff --git a/published/202105/20210424 Making computers more accessible and sustainable with Linux.md b/published/202105/20210424 Making computers more accessible and sustainable with Linux.md new file mode 100644 index 0000000000..b405dcb76d --- /dev/null +++ b/published/202105/20210424 Making computers more accessible and sustainable with Linux.md @@ -0,0 +1,74 @@ +[#]: subject: (Making computers more accessible and sustainable with Linux) +[#]: via: (https://opensource.com/article/21/4/linux-free-geek) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13362-1.html) + +用 Linux 使计算机更容易使用和可持续 +====== + +> Free Geek 是一个非营利组织,通过向有需要的人和团体提供 Linux 电脑,帮助减少数字鸿沟。 + +![](https://img.linux.net.cn/data/attachment/album/202105/05/135048extplppp7miznpdp.jpg) + +有很多理由选择 Linux 作为你的桌面操作系统。在 [为什么每个人都应该选择 Linux][2] 中,Seth Kenlon 强调了许多选择 Linux 的最佳理由,并为人们提供了许多开始使用该操作系统的方法。 + +这也让我想到了我通常向人们介绍 Linux 的方式。这场大流行增加了人们上网购物、远程教育以及与家人和朋友 [通过视频会议][3] 联系的需求。 + +我和很多有固定收入的退休人员一起工作,他们并不特别精通技术。对于这些人中的大多数人来说,购买电脑是一项充满担忧的大投资。我的一些朋友和客户对在大流行期间去零售店感到不舒服,而且他们完全不熟悉如何买电脑,无论是台式机还是笔记本电脑,即使在非大流行时期。他们来找我,询问在哪里买,要注意些什么。 + +我总是想看到他们得到一台 Linux 电脑。他们中的许多人买不起名牌供应商出售的 Linux 设备。直到最近,我一直在为他们购买翻新的设备,然后用 Linux 改装它们。 + +但是,当我发现 [Free Geek][4] 时,这一切都改变了,这是一个位于俄勒冈州波特兰的非营利组织,它的使命是“可持续地重复使用技术,实现数字访问,并提供教育,以创建一个使人们能够实现其潜力的社区。” + +Free Geek 有一个 eBay 商店,我在那里以可承受的价格购买了几台翻新的笔记本电脑。他们的电脑都安装了 [Linux Mint][5]。 事实上,电脑可以立即使用,这使得向 [新用户介绍 Linux][6] 很容易,并帮助他们快速体验操作系统的力量。 + +### 让电脑继续使用,远离垃圾填埋场 + +Oso Martin 在 2000 年地球日发起了 Free Geek。该组织为其志愿者提供课程和工作计划,对他们进行翻新和重建捐赠电脑的培训。志愿者们在服务 24 小时后还会收到一台捐赠的电脑。 + +这些电脑在波特兰的 Free Geek 实体店和 [网上][7] 出售。该组织还通过其项目 [Plug Into Portland][8]、[Gift a Geekbox][9] 以及[组织][10]和[社区资助][11]向有需要的人和实体提供电脑。 + +该组织表示,它已经“从垃圾填埋场翻新了 200 多万件物品,向非营利组织、学校、社区变革组织和个人提供了 75000 多件技术设备,并从 Free Geek 学习者那里提供了 5000 多课时”。 + +### 参与其中 + +自成立以来,Free Geek 已经从 3 名员工发展到近 50 名员工,并得到了世界各地的认可。它是波特兰市的 [数字包容网络][12] 的成员。 + +你可以在 [Twitter][13]、[Facebook][14]、[LinkedIn][15]、[YouTube][16] 和 [Instagram][17] 上与 Free Geek 联系。你也可以订阅它的[通讯][18]。从 Free Geek 的 [商店][19] 购买物品,可以直接支持其工作,减少数字鸿沟。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-free-geek + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://opensource.com/article/21/2/try-linux +[3]: https://opensource.com/article/20/8/linux-laptop-video-conferencing +[4]: https://www.freegeek.org/ +[5]: https://opensource.com/article/21/4/restore-macbook-linux +[6]: https://opensource.com/article/18/12/help-non-techies +[7]: https://www.ebay.com/str/freegeekbasicsstore +[8]: https://www.freegeek.org/our-programs/plug-portland +[9]: https://www.freegeek.org/our-programs/gift-geekbox +[10]: https://www.freegeek.org/our-programs-grants/organizational-hardware-grants +[11]: https://www.freegeek.org/our-programs-grants/community-hardware-grants +[12]: https://www.portlandoregon.gov/oct/73860 +[13]: https://twitter.com/freegeekpdx +[14]: https://www.facebook.com/freegeekmothership +[15]: https://www.linkedin.com/company/free-geek/ +[16]: https://www.youtube.com/user/FreeGeekMothership +[17]: https://www.instagram.com/freegeekmothership/ +[18]: https://app.e2ma.net/app2/audience/signup/1766417/1738557/?v=a +[19]: https://www.freegeek.org/shop diff --git a/published/202105/20210425 Play retro video games on Linux with this open source project.md b/published/202105/20210425 Play retro video games on Linux with this open source project.md new file mode 100644 index 0000000000..4117da3f5c --- /dev/null +++ b/published/202105/20210425 Play retro video games on Linux with this open source project.md @@ -0,0 +1,119 @@ +[#]: subject: (Play retro video games on Linux with this open source project) +[#]: via: (https://opensource.com/article/21/4/scummvm-retro-gaming) +[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13433-1.html) + +用这个开源项目在 Linux 上玩复古视频游戏 +====== + +> ScummVM 是在现代硬件上玩老式视频游戏的最直接的方法之一。 + +![](https://img.linux.net.cn/data/attachment/album/202105/28/061555r14mbzb1g1n545rr.jpg) + +玩冒险游戏一直是我使用计算机经验的一个重要部分。从最早的基于文本的冒险游戏到 2D 像素艺术、全动态视频和 3D 游戏,冒险游戏类型为我提供了很多美好的回忆。 + +有时我想重温那些老游戏,但它们很多都是在 Linux 出现之前发布的,那么我如何去重玩这些游戏呢?我使用 [ScummVM][2],说实话,这是我最喜欢的开源项目之一。 + +### 什么是 ScummVM + +![ScummVM][3] + +ScummVM 是一个设计用来在现代硬件上玩老式冒险游戏的程序。ScummVM 最初是为了运行使用卢卡斯艺术LucasArt疯狂豪宅脚本创作工具Script Creation Utility for Maniac Mansion(SCUMM)开发的游戏,现在支持许多不同的游戏引擎。它可以支持几乎所有经典的雪乐山娱乐Sierra On-Line和卢卡斯艺术的冒险游戏,以及其他发行商的大量冒险游戏。ScummVM 并不支持所有的冒险游戏(目前),但它可以用来玩数百种冒险游戏。ScummVM 可用于多个平台,包括 Windows、macOS、Linux、Android、iOS 和一些游戏机。 + +### 为什么使用 ScummVM + +有很多方法可以在现代硬件上玩老游戏,但它们往往比使用 ScummVM 更复杂。[DOSBox][5] 可以用来玩 DOS 游戏,但它需要调整设置,使其以正确的速度进行游戏。Windows 游戏可以用 [WINE][6] 来玩,但这需要游戏及其安装程序都与 WINE 兼容。 + +即使游戏可以在 WINE 下运行,一些游戏仍然不能在现代硬件上很好地运行,因为硬件的速度太快了。这方面的一个例子是《国王密使 6King's Quest VI》中的一个谜题,它涉及将点燃的鞭炮带到某个地方。在现代硬件上,鞭炮爆炸的速度太快了,这使得在角色不死很多次的情况下不可能到达正确的位置。 + +ScummVM 消除了其他玩复古冒险游戏的方法中存在的许多问题。如果是 ScummVM 支持的游戏,那么它的配置和玩都很简单。在大多数情况下,将游戏文件从原始游戏光盘复制到一个目录,并在 ScummVM 中添加该目录,就可以玩该游戏了。对于多张光盘上的游戏,可能需要重命名一些文件以避免文件名冲突。需要哪些数据文件的说明以及任何重命名的说明都记录在 [每个支持的游戏][7] 的 ScummVM 维基页面上。 + +ScummVM 的一个奇妙之处在于,每一个新版本都会增加对更多游戏的支持。ScummVM 2.2.0 增加了对十几种互动小说解释器的支持,这意味着 ScummVM 现在可以玩数百种基于文本的冒险游戏。ScummVM 的开发分支应该很快就会变成 2.3.0 版本,它整合了 [ResidualVM][8] 对 3D 冒险游戏的支持,所以现在 ScummVM 可以用来玩《冥界狂想曲Grim Fandango》、《神秘岛 3:放逐者Myst III: Exile
        》和《最长的旅程The Longest Journey》。其开发分支最近还增加了对使用 [Adventure Game Studio][9] 创建的游戏的支持,这为 ScummVM 增加了成百上千的游戏。 + +### 如何安装 ScummVM + +如果你想从你的 Linux 发行版的仓库中安装 ScummVM,过程非常简单。你只需要运行一个命令。然而,你的发行版可能会提供一个旧版本的 ScummVM,它不像最新版本那样支持许多游戏,所以要记住这一点。 + +在 Debian/Ubuntu 上安装 ScummVM: + +``` +sudo apt install scummvm +``` + +在 Fedora 上安装 ScummVM: + +``` +sudo dnf install scummvm +``` + +#### 使用 Flatpak 或 Snap 安装 ScummVM + +ScummVM 也可以以 Flatpak 和 Snap 的形式提供。如果你使用这些方式之一,你可以使用以下命令来安装相关的版本,它应该总是 ScummVM 的最新版本。 + +``` +flatpak install flathub org.scummvm.ScummVM +``` + +或 + +``` +snap install scummvm +``` + +#### 编译 ScummVM 的开发分支 + +如果你想尝试 ScummVM 尚未稳定的开发分支中的最新和主要的功能,你可以通过编译 ScummVM 的源代码来实现。请注意,开发分支是不断变化的,所以事情可能不总是正确的。如果你仍有兴趣尝试开发分支,请按照下面的说明进行。 + +首先,你需要为你的发行版准备必要的开发工具和库,这些工具和库在 ScummVM 维基上的 [编译 ScummVM/GCC][10] 页面列出。 + +一旦你安装了先决条件,运行以下命令: + +``` +git clone +cd scummvm +./configure +make +sudo make install +``` + +### 向 ScummVM 添加游戏 + +将游戏添加到 ScummVM 是你在游戏前需要做的最后一件事。如果你的收藏集中没有任何支持的冒险游戏,你可以从 [ScummVM 游戏][11] 页面下载 11 个精彩的游戏。你还可以从 [GOG.com][12] 购买许多 ScummVM 支持的游戏。如果你从 GOG.com 购买了游戏,并需要从 GOG 下载中提取游戏文件,你可以使用 [innoextract][13] 工具。 + +大多数游戏需要放在自己的目录中(唯一的例外是由单个数据文件组成的游戏),所以最好先创建一个目录来存储你的 ScummVM 游戏。你可以使用命令行或图形化文件管理器来完成这个工作。在哪里存储游戏并不重要(除了 ScummVM Flatpak,它是一个沙盒,要求游戏存储在 `~/Documents` 目录中)。创建这个目录后,将每个游戏的数据文件放在各自的子目录中。 + +一旦文件被复制到你想要的地方,运行 ScummVM,并通过点击“Add Game…”将游戏添加到收藏集中,在打开的文件选择器对话框中选择适当的目录,并点击“Choose”。如果 ScummVM 正确检测到游戏,它将打开其设置选项。如果你想的话,你可以从各个标签中选择高级配置选项(也可以在以后通过使用“Edit Game…”按钮进行更改),或者你可以直接点击“OK”,以默认选项添加游戏。如果没有检测到游戏,请查看 ScummVM 维基上的 [支持的游戏][14] 页面,以了解特定游戏的数据文件可能需要的特殊说明的细节。 + +现在唯一要做的就是在 ScummVM 的游戏列表中选择游戏,点击“Start”,享受重温旧爱或首次体验经典冒险游戏的乐趣。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/scummvm-retro-gaming + +作者:[Joshua Allen Holm][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/holmja +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open_gaming_games_roundup_news.png?itok=KM0ViL0f (Gaming artifacts with joystick, GameBoy, paddle) +[2]: https://www.scummvm.org/ +[3]: https://opensource.com/sites/default/files/uploads/scummvm.png (ScummVM) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://www.dosbox.com/ +[6]: https://www.winehq.org/ +[7]: https://wiki.scummvm.org/index.php?title=Category:Supported_Games +[8]: https://www.residualvm.org/ +[9]: https://www.adventuregamestudio.co.uk/ +[10]: https://wiki.scummvm.org/index.php/Compiling_ScummVM/GCC +[11]: https://www.scummvm.org/games/ +[12]: https://www.gog.com/ +[13]: https://constexpr.org/innoextract/ +[14]: https://wiki.scummvm.org/index.php/Category:Supported_Games diff --git a/published/202105/20210426 3 beloved USB drive Linux distros.md b/published/202105/20210426 3 beloved USB drive Linux distros.md new file mode 100644 index 0000000000..505b90a5e2 --- /dev/null +++ b/published/202105/20210426 3 beloved USB drive Linux distros.md @@ -0,0 +1,87 @@ +[#]: subject: (3 beloved USB drive Linux distros) +[#]: via: (https://opensource.com/article/21/4/usb-drive-linux-distro) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13355-1.html) + +爱了!3 个受欢迎的 U 盘 Linux 发行版 +====== + +> 开源技术人员对此深有体会。 + +![](https://img.linux.net.cn/data/attachment/album/202105/03/104610np5piwaavaa5qu2u.jpg) + +Linux 用户几乎都会记得他们第一次发现无需实际安装,就可以用 Linux 引导计算机并在上面运行。当然,许多用户都知道可以引导计算机进入操作系统安装程序,但是 Linux 不同:它根本就不需要安装!你的计算机甚至不需要有一个硬盘。你可以通过一个 U 盘运行 Linux 几个月甚至几 _年_。 + +自然,有几种不同的 “临场live” Linux 发行版可供选择。我们向我们的作者们询问了他们的最爱,他们的回答如下。 + +### 1、Puppy Linux + +“作为一名前 **Puppy Linux** 开发者,我对此的看法自然有些偏见,但 Puppy 最初吸引我的地方是: + + * 它专注于第三世界国家容易获得的低端和老旧硬件。这为买不起最新的现代系统的贫困地区开放了计算能力 + * 它能够在内存中运行,可以利用该能力提供一些有趣的安全优势 + * 它在一个单一的 SFS 文件中处理用户文件和会话,使得备份、恢复或移动你现有的桌面/应用/文件到另一个安装中只需一个拷贝命令” + +—— [JT Pennington][2] + +“对我来说,一直就是 **Puppy Linux**。它启动迅速,支持旧硬件。它的 GUI 很容易就可以说服别人第一次尝试 Linux。” —— [Sachin Patil][3] + +“Puppy 是真正能在任何机器上运行的临场发行版。我有一台废弃的 microATX 塔式电脑,它的光驱坏了,也没有硬盘(为了数据安全,它已经被拆掉了),而且几乎没有多少内存。我把 Puppy 插入它的 SD 卡插槽,运行了好几年。” —— [Seth Kenlon][4] + +“我在使用 U 盘上的 Linux 发行版没有太多经验,但我把票投给 **Puppy Linux**。它很轻巧,非常适用于旧机器。”  —— [Sergey Zarubin][5] + +### 2、Fedora 和 Red Hat + +“我最喜欢的 USB 发行版其实是 **Fedora Live USB**。它有浏览器、磁盘工具和终端仿真器,所以我可以用它来拯救机器上的数据,或者我可以浏览网页或在需要时用 ssh 进入其他机器做一些工作。所有这些都不需要在 U 盘或在使用中的机器上存储任何数据,不会在受到入侵时被泄露。” —— [Steve Morris][6] + +“我曾经用过 Puppy 和 DSL。如今,我有两个 U 盘:**RHEL7** 和 **RHEL8**。 这两个都被配置为完整的工作环境,能够在 UEFI 和 BIOS 上启动。当我有问题要解决而又面对随机的硬件时,在现实生活中这就是时间的救星。” —— [Steven Ellis][7] + +### 3、Porteus + +“不久前,我安装了 Porteus 系统每个版本的虚拟机。很有趣,所以有机会我会再试试它们。每当提到微型发行版的话题时,我总是想起我记得的第一个使用的发行版:**tomsrtbt**。它总是安装适合放在软盘上来设计。我不知道它现在有多大用处,但我想我应该把它也算上。”  —— [Alan Formy-Duval][8] + +“作为一个 Slackware 的长期用户,我很欣赏 **Porteus** 提供的 Slack 的最新版本和灵活的环境。你可以用运行在内存中的 Porteus 进行引导,这样就不需要把 U 盘连接到你的电脑上,或者你可以从驱动器上运行,这样你就可以保留你的修改。打包应用很容易,而且 Slacker 社区有很多现有的软件包。这是我唯一需要的实时发行版。” —— [Seth Kenlon][4] + +### 其它:Knoppix + +“我已经有一段时间没有使用过 **Knoppix** 了,但我曾一度经常使用它来拯救那些被恶意软件破坏的 Windows 电脑。它最初于 2000 年 9 月发布,此后一直在持续开发。它最初是由 Linux 顾问 Klaus Knopper 开发并以他的名字命名的,被设计为临场 CD。我们用它来拯救由于恶意软件和病毒而变得无法访问的 Windows 系统上的用户文件。” —— [Don Watkins][9] + +“Knoppix 对临场 Linux 影响很大,但它也是对盲人用户使用最方便的发行版之一。它的 [ADRIANE 界面][10] 被设计成可以在没有视觉显示器的情况下使用,并且可以处理任何用户可能需要从计算机上获得的所有最常见的任务。” —— [Seth Kenlon][11] + +### 选择你的临场 Linux + +有很多没有提到的,比如 [Slax][12](一个基于 Debian 的实时发行版)、[Tiny Core][13]、[Slitaz][14]、[Kali][15](一个以安全为重点的实用程序发行版)、[E-live][16],等等。如果你有一个空闲的 U 盘,请把 Linux 放在上面,在任何时候都可以在任何电脑上使用 Linux! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/usb-drive-linux-distro + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) +[2]: https://opensource.com/users/jtpennington +[3]: https://opensource.com/users/psachin +[4]: http://opensource.com/users/seth +[5]: https://opensource.com/users/sergey-zarubin +[6]: https://opensource.com/users/smorris12 +[7]: https://opensource.com/users/steven-ellis +[8]: https://opensource.com/users/alanfdoss +[9]: https://opensource.com/users/don-watkins +[10]: https://opensource.com/life/16/7/knoppix-adriane-interface +[11]: https://opensource.com/article/21/4/opensource.com/users/seth +[12]: http://slax.org +[13]: http://www.tinycorelinux.net/ +[14]: http://www.slitaz.org/en/ +[15]: http://kali.org +[16]: https://www.elivecd.org/ diff --git a/published/202105/20210427 An Open-Source App to Control All Your RGB Lighting Settings.md b/published/202105/20210427 An Open-Source App to Control All Your RGB Lighting Settings.md new file mode 100644 index 0000000000..b9a5ec566e --- /dev/null +++ b/published/202105/20210427 An Open-Source App to Control All Your RGB Lighting Settings.md @@ -0,0 +1,92 @@ +[#]: subject: (An Open-Source App to Control All Your RGB Lighting Settings) +[#]: via: (https://itsfoss.com/openrgb/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13377-1.html) + +OpenRGB:一个控制所有 RGB 灯光设置的开源应用 +====== + +> OpenRGB 是一个有用的开源工具,可以一个工具管理所有的 RGB 灯光。让我们来了解一下它。 + +![](https://img.linux.net.cn/data/attachment/album/202105/10/113851zqod756ft373tz36.jpg) + +无论是你的键盘、鼠标、CPU 风扇、AIO,还是其他连接的外围设备或组件,Linux 都没有官方软件支持来控制 RGB 灯光。 + +而 OpenRGB 似乎是一个适用于 Linux 的多合一 RGB 灯光控制工具。 + +### OpenRGB:多合一的 RGB 灯光控制中心 + +![][1] + +是的,你可能会找到不同的工具来调整设置,如 **Piper** 专门 [在 Linux 上配置游戏鼠标][2]。但是,如果你有各种组件或外设,要把它们都设置成你喜欢的 RGB 颜色,那将是一件很麻烦的事情。 + +OpenRGB 是一个令人印象深刻的工具,它不仅专注于 Linux,也可用于 Windows 和 MacOS。 + +它不仅仅是一个将所有 RGB 灯光设置放在一个工具下的想法,而是旨在摆脱所有需要安装来调整灯光设置的臃肿软件。 + +即使你使用的是 Windows 系统的机器,你可能也知道像 Razer Synapse 这样的软件工具是占用资源的,并伴随着它们的问题。因此,OpenRGB 不仅仅局限于 Linux 用户,还适用于每一个希望调整 RGB 设置的用户。 + +它支持大量设备,但你不应该期待对所有设备的支持。 + +### OpenRGB 的特点 + +![][3] + +它在提供简单的用户体验的同时,赋予了你许多有用的功能。其中的一些特点是: + + * 轻便的用户界面 + * 跨平台支持 + * 能够使用插件扩展功能 + * 设置颜色和效果 + * 能够保存和加载配置文件 + * 查看设备信息 + * 连接 OpenRGB 的多个实例,在多台电脑上同步灯光 + +![][4] + +除了上述所有的特点外,你还可以很好地控制照明区域、色彩模式、颜色等。 + +### 在 Linux 中安装 OpenRGB + +你可以在其官方网站上找到 AppImage 文件和 DEB 包。对于 Arch Linux 用户,你也可以在 [AUR][5] 中找到它。 + +如需更多帮助,你可以参考我们的 [AppImage 指南][6]和[安装 DEB 文件的方法][7]来设置。 + +官方网站应该也可以让你下载其他平台的软件包。但是,如果你想探索更多关于它的信息或自己编译它,请前往它的 [GitLab 页面][8]。 + +- [OpenRGB][9] + +### 总结 + +尽管我没有很多支持 RGB 的设备/组件,但我可以成功地调整我的罗技 G502 鼠标。 + +如果你想摆脱多个应用,用一个轻量级的界面来管理你所有的 RGB 灯光,我肯定会推荐你试一试。 + +你已经试过它了吗?欢迎在评论中分享你对它的看法! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/openrgb/ + +作者:[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/2021/04/openrgb.jpg?resize=800%2C406&ssl=1 +[2]: https://itsfoss.com/piper-configure-gaming-mouse-linux/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/openrgb-supported-devices.jpg?resize=800%2C404&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/openrgb-logi.jpg?resize=800%2C398&ssl=1 +[5]: https://itsfoss.com/aur-arch-linux/ +[6]: https://itsfoss.com/use-appimage-linux/ +[7]: https://itsfoss.com/install-deb-files-ubuntu/ +[8]: https://gitlab.com/CalcProgrammer1/OpenRGB +[9]: https://openrgb.org/ diff --git a/published/202105/20210427 Fedora Linux 34 is officially here.md b/published/202105/20210427 Fedora Linux 34 is officially here.md new file mode 100644 index 0000000000..ac0df71962 --- /dev/null +++ b/published/202105/20210427 Fedora Linux 34 is officially here.md @@ -0,0 +1,75 @@ +[#]: subject: (Fedora Linux 34 is officially here!) +[#]: via: (https://fedoramagazine.org/announcing-fedora-34/) +[#]: author: (Matthew Miller https://fedoramagazine.org/author/mattdm/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13365-1.html) + +Fedora Linux 34 各版本介绍 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/06/121307el07t08iiw01j7q8.jpg) + +今天(4/27),我很高兴地与大家分享成千上万的 Fedora 项目贡献者的辛勤工作成果:我们的最新版本,Fedora Linux 34 来了!我知道你们中的很多人一直在等待。我在社交媒体和论坛上看到的“它出来了吗?”的期待比我记忆中的任何一个版本都多。所以,如果你想的话,不要再等了,[现在升级][2] 或者去 [获取 Fedora][3] 下载一个安装镜像。或者,如果你想先了解更多,请继续阅读。  + +你可能注意到的第一件事是我们漂亮的新标志。这个新标志是由 Fedora 设计团队根据广大社区的意见开发的,它在保持 Fedoraness 的同时解决了我们旧标志的很多技术问题。请继续关注以新设计为特色的 Fedora 宣传品。 + +### 适合各种使用场景的 Fedora Linux + +Fedora Editions 面向桌面、服务器、云环境和物联网等各种特定场景。 + +Fedora Workstation 专注于台式机,尤其是面向那些希望获得“正常使用”的 Linux 操作系统体验的软件开发者。这个版本的带来了 [GNOME 40][4],这是专注、无干扰计算的下一步。无论你使用触控板、键盘还是鼠标,GNOME 40 都带来了导航方面的改进。应用网格和设置已经被重新设计,以使交互更加直观。你可以从 3 月份的 [Fedora Magazine][5] 文章中阅读更多的变化和原因。 + +Fedora CoreOS 是一个新兴的 Fedora 版本。它是一个自动更新的最小化操作系统,用于安全和大规模地运行容器化工作负载。它提供了几个更新流,跟随它之后大约每两周自动更新一次,当前,next 流基于 Fedora Linux 34,随后是 testing 流和 stable 流。你可以从 [下载页面][6] 中找到关于跟随 next 流的已发布工件的信息,以及在 [Fedora CoreOS 文档][7] 中找到如何使用这些工件的信息。 + +Fedora IoT 为物联网生态系统和边缘计算场景提供了一个强大的基础。在这个版本中,我们改善了对流行的 ARM 设备的支持,如 Pine64、RockPro64 和 Jetson Xavier NX。一些 i.MX8 片上系统设备,如 96boards Thor96 和 Solid Run HummingBoard-M 的硬件支持也有所改善。此外,Fedora IoT 34 改进了对用于自动系统恢复的硬件看门狗的支持。 + +当然,我们不仅仅提供 Editions。[Fedora Spins][8] 和 [Labs][9] 针对不同的受众和使用情况,例如 [Fedora Jam][10],它允许你释放你内心的音乐家,以及像新的 Fedora i3 Spin 这样的桌面环境,它提供了一个平铺的窗口管理器。还有,别忘了我们的备用架构。[ARM AArch64 Power 和 S390x][11]。 + +### 一般性改进 + +无论你使用的是 Fedora 的哪个变种,你都会得到开源世界所能提供的最新成果。秉承我们的 “[First][12]” 原则,我们已经更新了关键的编程语言和系统库包,包括 Ruby 3.0 和 Golang 1.16。在 Fedora KDE Plasma 中,我们已经从 X11 切换到 Wayland 作为默认。 + +在 Fedora Linux 33 中 BTRFS 作为桌面变体中的默认文件系统引入之后,我们又引入了 [BTRFS 文件系统的透明压缩][13]。 + +我们很高兴你能试用这个新发布版本!现在就去 下载它。或者如果你已经在运行 Fedora Linux,请按照 [简易升级说明][2]。关于 Fedora Linux 34 的新功能的更多信息,请看 [发行说明][14]。 + +### 万一出现问题…… + +如果你遇到了问题,请查看 [Fedora 34 常见问题页面][15],如果你有问题,请访问我们的 Ask Fedora 用户支持平台。 + +### 谢谢各位 + +感谢在这个发布周期中为 Fedora 项目做出贡献的成千上万的人,特别是那些在大流行期间为使这个版本按时发布而付出额外努力的人。Fedora 是一个社区,很高兴看到我们如此互相支持! + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/announcing-fedora-34/ + +作者:[Matthew Miller][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/mattdm/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/f34-final-816x345.jpg +[2]: https://docs.fedoraproject.org/en-US/quick-docs/upgrading/ +[3]: https://getfedora.org +[4]: https://forty.gnome.org/ +[5]: https://fedoramagazine.org/fedora-34-feature-focus-updated-activities-overview/ +[6]: https://getfedora.org/en/coreos +[7]: https://docs.fedoraproject.org/en-US/fedora-coreos/ +[8]: https://spins.fedoraproject.org/ +[9]: https://labs.fedoraproject.org/ +[10]: https://labs.fedoraproject.org/en/jam/ +[11]: https://alt.fedoraproject.org/alt/ +[12]: https://docs.fedoraproject.org/en-US/project/#_first +[13]: https://fedoramagazine.org/fedora-workstation-34-feature-focus-btrfs-transparent-compression/ +[14]: https://docs.fedoraproject.org/en-US/fedora/f34/release-notes/ +[15]: https://fedoraproject.org/wiki/Common_F34_bugs +[16]: https://hopin.com/events/fedora-linux-34-release-party diff --git a/published/202105/20210427 Perform Linux memory forensics with this open source tool.md b/published/202105/20210427 Perform Linux memory forensics with this open source tool.md new file mode 100644 index 0000000000..85fd06058b --- /dev/null +++ b/published/202105/20210427 Perform Linux memory forensics with this open source tool.md @@ -0,0 +1,485 @@ +[#]: subject: (Perform Linux memory forensics with this open source tool) +[#]: via: (https://opensource.com/article/21/4/linux-memory-forensics) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) +[#]: collector: (lujun9972) +[#]: translator: (ShuyRoy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13425-1.html) + +使用开源工具进行 Linux 内存取证 +====== + +> 利用 Volatility 找出应用程序、网络连接、内核模块、文件等方面的情况。 + +![](https://img.linux.net.cn/data/attachment/album/202105/26/111959fzkhzf7q3qwmhh7z.jpg) + +计算机的操作系统和应用使用主内存(RAM)来执行不同的任务。这种易失性内存包含大量关于运行应用、网络连接、内核模块、打开的文件以及几乎所有其他的内容信息,但这些信息每次计算机重启的时候都会被清除。 + +内存取证Memory forensics是一种从内存中找到和抽取这些有价值的信息的方式。[Volatility][2] 是一种使用插件来处理这类信息的开源工具。但是,存在一个问题:在你处理这些信息前,必须将物理内存转储到一个文件中,而 Volatility 没有这种能力。 + +因此,这篇文章分为两部分: + + * 第一部分是处理获取物理内存并将其转储到一个文件中。 + * 第二部分使用 Volatility 从这个内存转储中读取并处理这些信息。 + +我在本教程中使用了以下测试系统,不过它可以在任何 Linux 发行版上工作: + +``` +$ cat /etc/redhat-release +Red Hat Enterprise Linux release 8.3 (Ootpa) +$ +$ uname -r +4.18.0-240.el8.x86_64 +$ +``` + +> **注意事项:** 部分 1 涉及到编译和加载一个内核模块。不要担心:它并不像听起来那么困难。 +> +> 一些指南: +> +> * 按照以下的步骤。 +> * 不要在生产系统或你的主要计算机上尝试任何这些步骤。 +> * 始终使用测试的虚拟机(VM)来尝试,直到你熟悉使用这些工具并理解它们的工作原理为止。 + +### 安装需要的包 + +在开始之前安装必要的工具。如果你经常使用基于 Debian 的发行版,可以使用 `apt-get` 命令。这些包大多数提供了需要的内核信息和工具来编译代码: + +``` +$ yum install kernel-headers kernel-devel gcc elfutils-libelf-devel make git libdwarf-tools python2-devel.x86_64-y +``` + +### 部分 1:使用 LiME 获取内存并将其转储到一个文件中 + +在开始分析内存之前,你需要一个内存转储供你使用。在实际的取证活动中,这可能来自一个被破坏或者被入侵的系统。这些信息通常会被收集和存储来分析入侵是如何发生的及其影响。由于你可能没有可用的内存转储,你可以获取你的测试 VM 的内存转储,并使用它来执行内存取证。 + +Linux 内存提取器Linux Memory Extractor([LiME][3])是一个在 Linux 系统上获取内存很常用的工具。使用以下命令获得 LiME: + +``` +$ git clone https://github.com/504ensicsLabs/LiME.git +$ +$ cd LiME/src/ +$ +$ ls +deflate.c  disk.c  hash.c  lime.h  main.c  Makefile  Makefile.sample  tcp.c +$ +``` + +#### 构建 LiME 内核模块 + +在 `src` 文件夹下运行 `make` 命令。这会创建一个以 .ko 为扩展名的内核模块。理想情况下,在 `make` 结束时,`lime.ko` 文件会使用格式 `lime-.ko` 被重命名。 + +``` +$ make +make -C /lib/modules/4.18.0-240.el8.x86_64/build M="/root/LiME/src" modules +make[1]: Entering directory '/usr/src/kernels/4.18.0-240.el8.x86_64' + +<< 删节 >> + +make[1]: Leaving directory '/usr/src/kernels/4.18.0-240.el8.x86_64' +strip --strip-unneeded lime.ko +mv lime.ko lime-4.18.0-240.el8.x86_64.ko +$ +$ +$ ls -l lime-4.18.0-240.el8.x86_64.ko +-rw-r--r--. 1 root root 25696 Apr 17 14:45 lime-4.18.0-240.el8.x86_64.ko +$ +$ file lime-4.18.0-240.el8.x86_64.ko +lime-4.18.0-240.el8.x86_64.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=1d0b5cf932389000d960a7e6b57c428b8e46c9cf, not stripped +$ +``` + +#### 加载LiME 内核模块 + +现在是时候加载内核模块来获取系统内存了。`insmod` 命令会帮助加载内核模块;模块一旦被加载,会在你的系统上读取主内存(RAM)并且将内存的内容转储到命令行所提供的 `path` 目录下的文件中。另一个重要的参数是 `format`;保持 `lime` 的格式,如下所示。在插入内核模块之后,使用 `lsmod` 命令验证它是否真的被加载。 + +``` +$ lsmod  | grep lime +$ +$ insmod ./lime-4.18.0-240.el8.x86_64.ko "path=../RHEL8.3_64bit.mem format=lime" +$ +$ lsmod  | grep lime +lime                   16384  0 +$ +``` + +你应该看到给 `path` 命令的文件已经创建好了,而且文件大小与你系统的物理内存(RAM)大小相同(并不奇怪)。一旦你有了内存转储,你就可以使用 `rmmod` 命令删除该内核模块: + +``` +$ +$ ls -l ~/LiME/RHEL8.3_64bit.mem +-r--r--r--. 1 root root 4294544480 Apr 17 14:47 /root/LiME/RHEL8.3_64bit.mem +$ +$ du -sh ~/LiME/RHEL8.3_64bit.mem +4.0G    /root/LiME/RHEL8.3_64bit.mem +$ +$ free -m +              total        used        free      shared  buff/cache   available +Mem:           3736         220         366           8        3149        3259 +Swap:          4059           8        4051 +$ +$ rmmod lime +$ +$ lsmod  | grep lime +$ +``` + +#### 内存转储中是什么? + +这个内存转储文件只是原始数据,就像使用 `file` 命令可以看到的一样。你不可能通过手动去理解它;是的,在这里边有一些 ASCII 字符,但是你无法用编辑器打开这个文件并把它读出来。`hexdump` 的输出显示,最初的几个字节是 `EmiL`;这是因为你的请求格式在上面的命令行中是 `lime`: + +``` +$ file ~/LiME/RHEL8.3_64bit.mem +/root/LiME/RHEL8.3_64bit.mem: data +$ + +$ hexdump -C ~/LiME/RHEL8.3_64bit.mem | head +00000000  45 4d 69 4c 01 00 00 00  00 10 00 00 00 00 00 00  |EMiL............| +00000010  ff fb 09 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| +00000020  b8 fe 4c cd 21 44 00 32  20 00 00 2a 2a 2a 2a 2a  |..L.!D.2 ..*****| +00000030  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************| +00000040  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 20 00 20  |************* . | +00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| +* +00000080  00 00 00 00 00 00 00 00  00 00 00 00 70 78 65 6c  |............pxel| +00000090  69 6e 75 78 2e 30 00 00  00 00 00 00 00 00 00 00  |inux.0..........| +000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| +$ +``` + +### 部分 2:获得 Volatility 并使用它来分析你的内存转储 + +现在你有了要分析的示例内存转储,使用下面的命令获取 Volatility 软件。Volatility 已经用 Python 3 重写了,但是本教程使用的是用 Python 2 写的原始的 Volatility 包。如果你想用 Volatility 3 进行实验,可以从合适的 Git 仓库下载它,并在以下命令中使用 Python 3 而不是 Python 2: + +``` +$ git clone https://github.com/volatilityfoundation/volatility.git +$ +$ cd volatility/ +$ +$ ls +AUTHORS.txt    contrib      LEGAL.txt    Makefile     PKG-INFO     pyinstaller.spec  resources  tools       vol.py +CHANGELOG.txt  CREDITS.txt  LICENSE.txt  MANIFEST.in  pyinstaller  README.txt        setup.py   volatility +$ +``` + +Volatility 使用两个 Python 库来实现某些功能,所以使用以下命令来安装它们。否则,在你运行 Volatility 工具时,你可能看到一些导入错误;你可以忽略它们,除非你正在运行的插件需要这些库;这种情况下,工具将会报错: + +``` +$ pip2 install pycrypto +$ pip2 install distorm3 +``` + +#### 列出 Volatility 的 Linux 配置文件 + +你将要运行的第一个 Volatility 命令列出了可用的 Linux 配置文件,运行 Volatility 命令的主要入口点是 `vol.py` 脚本。使用 Python 2 解释器调用它并提供 `--info` 选项。为了缩小输出,查找以 Linux 开头的字符串。正如你所看到的,并没有很多 Linux 配置文件被列出: + +``` +$ python2 vol.py --info  | grep ^Linux +Volatility Foundation Volatility Framework 2.6.1 +LinuxAMD64PagedMemory          - Linux-specific AMD 64-bit address space. +$ +``` + +#### 构建你自己的 Linux 配置文件 + +Linux 发行版是多种多样的,并且是为不同架构而构建的。这就是为什么配置文件是必要的 —— Volatility 在提取信息前必须知道内存转储是从哪个系统和架构获得的。有一些 Volatility 命令可以找到这些信息;但是这个方法很费时。为了加快速度,可以使用以下命令构建一个自定义的 Linux 配置文件: + +移动到 Volatility 仓库的 `tools/linux`目录下,运行 `make` 命令: + +``` +$ cd tools/linux/ +$ +$ pwd +/root/volatility/tools/linux +$ +$ ls +kcore  Makefile  Makefile.enterprise  module.c +$ +$ make +make -C //lib/modules/4.18.0-240.el8.x86_64/build CONFIG_DEBUG_INFO=y M="/root/volatility/tools/linux" modules +make[1]: Entering directory '/usr/src/kernels/4.18.0-240.el8.x86_64' +<< 删节 >> +make[1]: Leaving directory '/usr/src/kernels/4.18.0-240.el8.x86_64' +$ +``` + +你应该看到一个新的 `module.dwarf` 文件。你也需要 `/boot` 目录下的 `System.map` 文件,因为它包含了所有与当前运行的内核相关的符号: + +``` +$ ls +kcore  Makefile  Makefile.enterprise  module.c  module.dwarf +$ +$ ls -l module.dwarf +-rw-r--r--. 1 root root 3987904 Apr 17 15:17 module.dwarf +$ +$ ls -l /boot/System.map-4.18.0-240.el8.x86_64 +-rw-------. 1 root root 4032815 Sep 23  2020 /boot/System.map-4.18.0-240.el8.x86_64 +$ +$ +``` + +要创建一个自定义配置文件,移动回到 Volatility 目录并且运行下面的命令。第一个参数提供了一个自定义 .zip 文件,文件名是你自己命名的。我经常使用操作系统和内核版本来命名。下一个参数是前边创建的 `module.dwarf` 文件,最后一个参数是 `/boot` 目录下的 `System.map` 文件: + +``` +$ +$ cd volatility/ +$ +$ zip volatility/plugins/overlays/linux/Redhat8.3_4.18.0-240.zip tools/linux/module.dwarf /boot/System.map-4.18.0-240.el8.x86_64 +  adding: tools/linux/module.dwarf (deflated 91%) +  adding: boot/System.map-4.18.0-240.el8.x86_64 (deflated 79%) +$ +``` + +现在自定义配置文件就准备好了,所以在前边给出的位置检查一下 .zip 文件是否被创建好。如果你想知道 Volatility 是否检测到这个自定义配置文件,再一次运行 `--info` 命令。现在,你应该可以在下边的列出的内容中看到新的配置文件: + +``` +$ +$ ls -l volatility/plugins/overlays/linux/Redhat8.3_4.18.0-240.zip +-rw-r--r--. 1 root root 1190360 Apr 17 15:20 volatility/plugins/overlays/linux/Redhat8.3_4.18.0-240.zip +$ +$ +$ python2 vol.py --info  | grep Redhat +Volatility Foundation Volatility Framework 2.6.1 +LinuxRedhat8_3_4_18_0-240x64 - A Profile for Linux Redhat8.3_4.18.0-240 x64 +$ +$ +``` + +#### 开始使用 Volatility + +现在你已经准备好去做一些真正的内存取证了。记住,Volatility 是由自定义的插件组成的,你可以针对内存转储来获得信息。命令的通用格式是: + +``` +python2 vol.py -f --profile= +``` + +有了这些信息,运行 `linux_banner` 插件来看看你是否可从内存转储中识别正确的发行版信息: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_banner --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +Linux version 4.18.0-240.el8.x86_64 ([mockbuild@vm09.test.com][4]) (gcc version 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)) #1 SMP Wed Sep 23 05:13:10 EDT 2020 +$ +``` + +#### 找到 Linux 插件 + +到现在都很顺利,所以现在你可能对如何找到所有 Linux 插件的名字比较好奇。有一个简单的技巧:运行 `--info` 命令并抓取 `linux_` 字符串。有各种各样的插件可用于不同的用途。这里列出一部分: + +``` +$ python2 vol.py --info  | grep linux_ +Volatility Foundation Volatility Framework 2.6.1 +linux_apihooks             - Checks for userland apihooks +linux_arp                  - Print the ARP table +linux_aslr_shift           - Automatically detect the Linux ASLR shift + +<< 删节 >> + +linux_banner               - Prints the Linux banner information +linux_vma_cache            - Gather VMAs from the vm_area_struct cache +linux_volshell             - Shell in the memory image +linux_yarascan             - A shell in the Linux memory image +$ +``` + +使用 `linux_psaux` 插件检查内存转储时系统上正在运行哪些进程。注意列表中的最后一个命令:它是你在转储之前运行的 `insmod` 命令。 + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_psaux --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +Pid    Uid    Gid    Arguments                                                       +1      0      0      /usr/lib/systemd/systemd --switched-root --system --deserialize 18 +2      0      0      [kthreadd]                                                       +3      0      0      [rcu_gp]                                                         +4      0      0      [rcu_par_gp]                                                     +861    0      0      /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P           +869    0      0      /usr/bin/rhsmcertd                                               +875    0      0      /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --logger=files +878    0      0      /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files       + +<< 删节 >> + +11064  89     89     qmgr -l -t unix -u                                               +227148 0      0      [kworker/0:0]                                                   +227298 0      0      -bash                                                           +227374 0      0      [kworker/u2:1]                                                   +227375 0      0      [kworker/0:2]                                                   +227884 0      0      [kworker/0:3]                                                   +228573 0      0      insmod ./lime-4.18.0-240.el8.x86_64.ko path=../RHEL8.3_64bit.mem format=lime +228576 0      0                                                                       +$ +``` + +想要知道系统的网络状态吗?运行 `linux_netstat` 插件来找到在内存转储期间网络连接的状态: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_netstat --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +UNIX 18113              systemd/1     /run/systemd/private +UNIX 11411              systemd/1     /run/systemd/notify +UNIX 11413              systemd/1     /run/systemd/cgroups-agent +UNIX 11415              systemd/1     +UNIX 11416              systemd/1     + +<< 删节 >> +$ +``` + +接下来,使用 `linux_mount` 插件来看在内存转储期间哪些文件系统被挂载: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_mount --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +tmpfs                     /sys/fs/cgroup                      tmpfs        ro,nosuid,nodev,noexec                   +cgroup                    /sys/fs/cgroup/pids                 cgroup       rw,relatime,nosuid,nodev,noexec         +systemd-1                 /proc/sys/fs/binfmt_misc            autofs       rw,relatime                             +sunrpc                    /var/lib/nfs/rpc_pipefs             rpc_pipefs   rw,relatime                             +/dev/mapper/rhel_kvm--03--guest11-root /                                   xfs          rw,relatime                 +tmpfs                     /dev/shm                            tmpfs        rw,nosuid,nodev                         +selinuxfs                 /sys/fs/selinux                     selinuxfs    rw,relatime +                                                       +<< 删节 >> + +cgroup                    /sys/fs/cgroup/net_cls,net_prio     cgroup       rw,relatime,nosuid,nodev,noexec         +cgroup                    /sys/fs/cgroup/cpu,cpuacct          cgroup       rw,relatime,nosuid,nodev,noexec         +bpf                       /sys/fs/bpf                         bpf          rw,relatime,nosuid,nodev,noexec         +cgroup                    /sys/fs/cgroup/memory               cgroup       ro,relatime,nosuid,nodev,noexec         +cgroup                    /sys/fs/cgroup/cpuset               cgroup       rw,relatime,nosuid,nodev,noexec         +mqueue                    /dev/mqueue                         mqueue       rw,relatime                             +$ +``` + +好奇哪些内核模块被加载了吗?Volatility 也为这个提供了一个插件 `linux_lsmod`: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_lsmod --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +ffffffffc0535040 lime 20480 +ffffffffc0530540 binfmt_misc 20480 +ffffffffc05e8040 sunrpc 479232 +<< 删节 >> +ffffffffc04f9540 nfit 65536 +ffffffffc0266280 dm_mirror 28672 +ffffffffc025e040 dm_region_hash 20480 +ffffffffc0258180 dm_log 20480 +ffffffffc024bbc0 dm_mod 151552 +$ +``` + +想知道哪些文件被哪些进程打开了吗?使用 `linux_bash` 插件可以列出这些信息: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_bash --profile=LinuxRedhat8_3_4_18_0-240x64 -v +Volatility Foundation Volatility Framework 2.6.1 +Pid      Name                 Command Time                   Command +-------- -------------------- ------------------------------ ------- +  227221 bash                 2021-04-17 18:38:24 UTC+0000   lsmod +  227221 bash                 2021-04-17 18:38:24 UTC+0000   rm -f .log +  227221 bash                 2021-04-17 18:38:24 UTC+0000   ls -l /etc/zzz +  227221 bash                 2021-04-17 18:38:24 UTC+0000   cat ~/.vimrc +  227221 bash                 2021-04-17 18:38:24 UTC+0000   ls +  227221 bash                 2021-04-17 18:38:24 UTC+0000   cat /proc/817/cwd +  227221 bash                 2021-04-17 18:38:24 UTC+0000   ls -l /proc/817/cwd +  227221 bash                 2021-04-17 18:38:24 UTC+0000   ls /proc/817/ +<< 删节 >> +  227298 bash                 2021-04-17 18:40:30 UTC+0000   gcc prt.c +  227298 bash                 2021-04-17 18:40:30 UTC+0000   ls +  227298 bash                 2021-04-17 18:40:30 UTC+0000   ./a.out +  227298 bash                 2021-04-17 18:40:30 UTC+0000   vim prt.c +  227298 bash                 2021-04-17 18:40:30 UTC+0000   gcc prt.c +  227298 bash                 2021-04-17 18:40:30 UTC+0000   ./a.out +  227298 bash                 2021-04-17 18:40:30 UTC+0000   ls +$ +``` + +想知道哪些文件被哪些进程打开了吗?使用 `linux_lsof` 插件可以列出这些信息: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_lsof --profile=LinuxRedhat8_3_4_18_0-240x64 +Volatility Foundation Volatility Framework 2.6.1 +Offset             Name                           Pid      FD       Path +------------------ ------------------------------ -------- -------- ---- +0xffff9c83fb1e9f40 rsyslogd                          71194        0 /dev/null +0xffff9c83fb1e9f40 rsyslogd                          71194        1 /dev/null +0xffff9c83fb1e9f40 rsyslogd                          71194        2 /dev/null +0xffff9c83fb1e9f40 rsyslogd                          71194        3 /dev/urandom +0xffff9c83fb1e9f40 rsyslogd                          71194        4 socket:[83565] +0xffff9c83fb1e9f40 rsyslogd                          71194        5 /var/log/messages +0xffff9c83fb1e9f40 rsyslogd                          71194        6 anon_inode:[9063] +0xffff9c83fb1e9f40 rsyslogd                          71194        7 /var/log/secure + +<< 删节 >> + +0xffff9c8365761f40 insmod                           228573        0 /dev/pts/0 +0xffff9c8365761f40 insmod                           228573        1 /dev/pts/0 +0xffff9c8365761f40 insmod                           228573        2 /dev/pts/0 +0xffff9c8365761f40 insmod                           228573        3 /root/LiME/src/lime-4.18.0-240.el8.x86_64.ko +$ +``` + +#### 访问 Linux 插件脚本位置 + +通过读取内存转储和处理这些信息,你可以获得更多的信息。如果你会 Python,并且好奇这些信息是如何被处理的,可以到存储所有插件的目录,选择一个你感兴趣的,并看看 Volatility 是如何获得这些信息的: + +``` +$ ls volatility/plugins/linux/ +apihooks.py              common.py            kernel_opened_files.py   malfind.py          psaux.py +apihooks.pyc             common.pyc           kernel_opened_files.pyc  malfind.pyc         psaux.pyc +arp.py                   cpuinfo.py           keyboard_notifiers.py    mount_cache.py      psenv.py +arp.pyc                  cpuinfo.pyc          keyboard_notifiers.pyc   mount_cache.pyc     psenv.pyc +aslr_shift.py            dentry_cache.py      ld_env.py                mount.py            pslist_cache.py +aslr_shift.pyc           dentry_cache.pyc     ld_env.pyc               mount.pyc           pslist_cache.pyc +<< 删节 >> +check_syscall_arm.py     __init__.py          lsmod.py                 proc_maps.py        tty_check.py +check_syscall_arm.pyc    __init__.pyc         lsmod.pyc                proc_maps.pyc       tty_check.pyc +check_syscall.py         iomem.py             lsof.py                  proc_maps_rb.py     vma_cache.py +check_syscall.pyc        iomem.pyc            lsof.pyc                 proc_maps_rb.pyc    vma_cache.pyc +$ +$ +``` + +我喜欢 Volatility 的理由是他提供了许多安全插件。这些信息很难手动获取: + +``` +linux_hidden_modules       - Carves memory to find hidden kernel modules +linux_malfind              - Looks for suspicious process mappings +linux_truecrypt_passphrase - Recovers cached Truecrypt passphrases +``` + +Volatility 也允许你在内存转储中打开一个 shell,所以你可以运行 shell 命令来代替上面所有命令,并获得相同的信息: + +``` +$ python2 vol.py -f ~/LiME/RHEL8.3_64bit.mem linux_volshell --profile=LinuxRedhat8_3_4_18_0-240x64 -v +Volatility Foundation Volatility Framework 2.6.1 +Current context: process systemd, pid=1 DTB=0x1042dc000 +Welcome to volshell! Current memory image is: +file:///root/LiME/RHEL8.3_64bit.mem +To get help, type 'hh()' +>>> +>>> sc() +Current context: process systemd, pid=1 DTB=0x1042dc000 +>>> +``` + +### 接下来的步骤 + +内存转储是了解 Linux 内部情况的好方法。试一试 Volatility 的所有插件,并详细研究它们的输出。然后思考这些信息如何能够帮助你识别入侵或安全问题。深入了解这些插件的工作原理,甚至尝试改进它们。如果你没有找到你想做的事情的插件,那就写一个并提交给 Volatility,这样其他人也可以使用它。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/linux-memory-forensics + +作者:[Gaurav Kamathe][a] +选题:[lujun9972][b] +译者:[RiaXu](https://github.com/ShuyRoy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_computer_solve_fix_tool.png?itok=okq8joti (Brain on a computer screen) +[2]: https://github.com/volatilityfoundation/volatility +[3]: https://github.com/504ensicsLabs/LiME +[4]: mailto:mockbuild@vm09.test.com diff --git a/published/202105/20210427 What-s new in Fedora Workstation 34.md b/published/202105/20210427 What-s new in Fedora Workstation 34.md new file mode 100644 index 0000000000..88369c6f6a --- /dev/null +++ b/published/202105/20210427 What-s new in Fedora Workstation 34.md @@ -0,0 +1,106 @@ +[#]: subject: (What’s new in Fedora Workstation 34) +[#]: via: (https://fedoramagazine.org/whats-new-fedora-34-workstation/) +[#]: author: (Christian Fredrik Schaller https://fedoramagazine.org/author/uraeus/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13359-1.html) + +Fedora Workstation 34 中的新变化 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/03/233735glmkkimcz8ilmcmr.jpg) + +Fedora Workstation 34 是我们领先的操作系统的最新版本,这次你将获得重大改进。最重要的是,你可以从 [官方网站][2] 下载它。我听到你在问,有什么新的东西?好吧,让我们来介绍一下。 + +### GNOME 40 + +[GNOME 40][3] 是对 GNOME 桌面的一次重大更新,Fedora 社区成员在其设计和实现过程中发挥了关键作用,因此你可以确信 Fedora 用户的需求被考虑在内。 + +当你登录到 GNOME 40 桌面时,首先注意到的就是你现在会被直接带到一个重新设计的概览屏幕。你会注意到仪表盘已经移到了屏幕的底部。GNOME 40 的另一个主要变化是虚拟工作空间现在是水平摆放的,这使 GNOME 与其他大多数桌面更加一致,因此应该使新用户更容易适应 GNOME 和 Fedora。 + +我们还做了一些工作来改善桌面中的手势支持,用三根手指水平滑动来切换工作空间,用三根手指垂直滑动来调出概览。 + +![][4] + +更新后的概览设计带来了一系列其他改进,包括: + + * 仪表盘现在将收藏的和未收藏的运行中的应用程序分开。这使得可以清楚了解哪些应用已经被收藏,哪些未收藏。 + * 窗口缩略图得到了改进,现在每个窗口上都有一个应用程序图标,以帮助识别。 + * 当工作区被设置为在所有显示器上显示时,工作区切换器现在会显示在所有显示器上,而不仅仅是主显示器。 + * 应用启动器的拖放功能得到了改进,可以更轻松地自定义应用程序网格的排列方式。 + +GNOME 40 中的变化经历了大量的用户测试,到目前为止反应非常正面,所以我们很高兴能将它们介绍给 Fedora 社区。更多信息请见 [forty.gnome.org][3] 或 [GNOME 40 发行说明][5]。 + +### 应用程序的改进 + +GNOME “天气”为这个版本进行了重新设计,具有两个视图,一个是未来 48 小时的小时预报,另一个是未来 10 天的每日预报。 + +新版本现在显示了更多的信息,并且更适合移动设备,因为它支持更窄的尺寸。 + +![][6] + +其他被改进的应用程序包括“文件”、“地图”、“软件”和“设置”。更多细节请参见 [GNOME 40 发行说明][5]。 + +### PipeWire + +PipeWire 是新的音频和视频服务器,由 Wim Taymans 创建,他也共同创建了 GStreamer 多媒体框架。到目前为止,它只被用于视频捕获,但在 Fedora Workstation 34 中,我们也开始将其用于音频,取代 PulseAudio。 + +PipeWire 旨在与 PulseAudio 和 Jack 兼容,因此应用程序通常应该像以前一样可以工作。我们还与 Firefox 和 Chrome 合作,确保它们能与 PipeWire 很好地配合。OBS Studio 也即将支持 PipeWire,所以如果你是一个播客,我们已经帮你搞定了这些。 + +PipeWire 在专业音频界获得了非常积极的回应。谨慎地说,从一开始就可能有一些专业音频应用不能完全工作,但我们会源源不断收到测试报告和补丁,我们将在 Fedora Workstation 34 的生命周期内使用这些报告和补丁来延续专业音频 PipeWire 的体验。 + +### 改进的 Wayland 支持 + +我们预计将在 Fedora Workstation 34 的生命周期内解决在专有的 NVIDIA 驱动之上运行 Wayland 的支持。已经支持在 NVIDIA 驱动上运行纯 Wayland 客户端。然而,当前还缺少对许多应用程序使用的 Xwayland 兼容层的支持。这就是为什么当你安装 NVIDIA 驱动时,Fedora 仍然默认为 X.Org。 + +我们正在 [与 NVIDIA 上游合作][7],以确保 Xwayland 能在 Fedora 中使用 NVIDIA 硬件加速。 + +### QtGNOME 平台和 Adwaita-Qt + +Jan Grulich 继续他在 QtGNOME 平台和 Adawaita-qt 主题上的出色工作,确保 Qt 应用程序与 Fedora 工作站的良好整合。多年来,我们在 Fedora 中使用的 Adwaita 主题已经发生了演变,但随着 QtGNOME 平台和 Adwaita-Qt 在 Fedora 34 中的更新,Qt 应用程序将更接近于 Fedora Workstation 34 中当前的 GTK 风格。 + +作为这项工作的一部分,Fedora Media Writer 的外观和风格也得到了改进。 + +![][8] + +### Toolbox + +Toolbox 是我们用于创建与主机系统隔离的开发环境的出色工具,它在 Fedora 34 上有了很多改进。例如,我们在改进 Toolbox 的 CI 系统集成方面做了大量的工作,以避免在我们的环境中出现故障时导致 Toolbox 停止工作。 + +我们在 Toolbox 的 RHEL 集成方面投入了大量的工作,这意味着你可以很容易地在 Fedora 系统上建立一个容器化的 RHEL 环境,从而方便地为 RHEL 服务器和云实例做开发。现在在 Fedora 上创建一个 RHEL 环境就像运行:`toolbox create -distro rhel -release 8.4` 一样简单。  + +这给你提供了一个最新桌面的优势:支持最新硬件,同时能够以一种完全原生的方式进行针对 RHEL 的开发。 + +![][9] + +### Btrfs + +自 Fedora 33 以来,Fedora Workstation 一直使用 Btrfs 作为其默认文件系统。Btrfs 是一个现代文件系统,由许多公司和项目开发。Workstation 采用 Btrfs 是通过 Facebook 和 Fedora 社区之间的奇妙合作实现的。根据到目前为止的用户反馈,人们觉得与旧的 ext4 文件系统相比,Btrfs 提供了更快捷、更灵敏的体验。 + +在 Fedora 34 中,新安装的 Workstation 系统现在默认使用 Btrfs 透明压缩。与未压缩的 Btrfs 相比,这可以节省 20-40% 的大量磁盘空间。它也增加了 SSD 和其他闪存介质的寿命。 + + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/whats-new-fedora-34-workstation/ + +作者:[Christian Fredrik Schaller][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/uraeus/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/f34-workstation-816x345.jpg +[2]: https://getfedora.org/workstation +[3]: https://forty.gnome.org/ +[4]: https://lh3.googleusercontent.com/xDklMWAGBWvRGRp2kby-XKr6b0Jvan8Obmn11sfmkKnsnXizKePYV9aWdEgyxmJetcvwMifYRUm6TcPRCH9szZfZOE9pCpv2bkjQhnq2II05Yu6o_DjEBmqTlRUGvvUyMN_VRtq8zkk2J7GUmA +[5]: https://help.gnome.org/misc/release-notes/40.0/ +[6]: https://lh6.googleusercontent.com/pQ3IIAvJDYrdfXoTUnrOcCQBjtpXqd_5Rmbo4xwxIj2qMCXt7ZxJEQ12OoV7yUSF8zpVR0VFXkMP0M8UK1nLbU7jhgQPJAHPayzjAscQmTtqqGsohyzth6-xFDjUXogmeFmcP-yR9GWXfXv-yw +[7]: https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/587 +[8]: https://lh6.googleusercontent.com/PDXxFS7SBFGI-3jRtR-TmqupvJRxy_CbWTfjB4sc1CKyO1myXkqfpg4jGHQJRK2e1vUh1KD_jyBsy8TURwCIkgAJcETCOlSPFBabqB5yDeWj3cvygOOQVe3X0tLFjuOz3e-ZX6owNZJSqIEHOQ +[9]: https://lh6.googleusercontent.com/dVRCL14LGE9WpmdiH3nI97OW2C1TkiZqREvBlHClNKdVcYvR1nZpZgWfup_GP5SN17iQtSJf59FxX2GYqoajXbdXLRfOwAREn7gVJ1fa_bspmcTZ81zkUQC4tNUx3f7D7uD7Peeg2Zc9Kldpww diff --git a/published/202105/20210429 Encrypting and decrypting files with OpenSSL.md b/published/202105/20210429 Encrypting and decrypting files with OpenSSL.md new file mode 100644 index 0000000000..a3cbe64aec --- /dev/null +++ b/published/202105/20210429 Encrypting and decrypting files with OpenSSL.md @@ -0,0 +1,440 @@ +[#]: subject: "Encrypting and decrypting files with OpenSSL" +[#]: via: "https://opensource.com/article/21/4/encryption-decryption-openssl" +[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe" +[#]: collector: "lujun9972" +[#]: translator: "MjSeven" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13368-1.html" + +使用 OpenSSL 加密和解密文件 +====== + +> OpenSSL 是一个实用工具,它可以确保其他人员无法打开你的敏感和机密消息。 + +![](https://img.linux.net.cn/data/attachment/album/202105/07/163825a9yh74h9yh4h77y2.jpg) + +加密是对消息进行编码的一种方法,这样可以保护消息的内容免遭他人窥视。一般有两种类型: + + 1. 密钥加密或对称加密 + 2. 公钥加密或非对称加密 + +密钥加密secret-key encryption使用相同的密钥进行加密和解密,而公钥加密public-key encryption使用不同的密钥进行加密和解密。每种方法各有利弊。密钥加密速度更快,而公钥加密更安全,因为它解决了安全共享密钥的问题,将它们结合在一起可以最大限度地利用每种类型的优势。 + +### 公钥加密 + +公钥加密使用两组密钥,称为密钥对。一个是公钥,可以与你想要秘密通信的任何人自由共享。另一个是私钥,应该是一个秘密,永远不会共享。 + +公钥用于加密。如果某人想与你交流敏感信息,你可以将你的公钥发送给他们,他们可以使用公钥加密消息或文件,然后再将其发送给你。私钥用于解密。解密发件人加密的消息的唯一方法是使用私钥。因此,它们被称为“密钥对”,它们是相互关联的。 + +### 如何使用 OpenSSL 加密文件 + +[OpenSSL][2] 是一个了不起的工具,可以执行各种任务,例如加密文件。本文使用安装了 OpenSSL 的 Fedora 计算机。如果你的机器上没有,则可以使用软件包管理器进行安装: + +``` +alice $ cat /etc/fedora-release +Fedora release 33 (Thirty Three) +alice $ +alice $ openssl version +OpenSSL 1.1.1i FIPS  8 Dec 2020 +alice $ +``` + +要探索文件加密和解密,假如有两个用户 Alice 和 Bob,他们想通过使用 OpenSSL 交换加密文件来相互通信。 + +#### 步骤 1:生成密钥对 + +在加密文件之前,你需要生成密钥对。你还需要一个密码短语passphrase,每当你使用 OpenSSL 时都必须使用该密码短语,因此务必记住它。 + +Alice 使用以下命令生成她的一组密钥对: + +``` +alice $ openssl genrsa -aes128 -out alice_private.pem 1024 +``` + +此命令使用 OpenSSL 的 [genrsa][3] 命令生成一个 1024 位的公钥/私钥对。这是可以的,因为 RSA 算法是不对称的。它还使用了 aes128 对称密钥算法来加密 Alice 生成的私钥。 + +输入命令后,OpenSSL 会提示 Alice 输入密码,每次使用密钥时,她都必须输入该密码: + +``` +alice $ openssl genrsa -aes128 -out alice_private.pem 1024 +Generating RSA private key, 1024 bit long modulus (2 primes) +..........+++++ +..................................+++++ +e is 65537 (0x010001) +Enter pass phrase for alice_private.pem: +Verifying - Enter pass phrase for alice_private.pem: +alice $ +alice $ +alice $ ls -l alice_private.pem +-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem +alice $ +alice $ file alice_private.pem +alice_private.pem: PEM RSA private key +alice $ +``` + +Bob 使用相同的步骤来创建他的密钥对: + +``` +bob $ openssl genrsa -aes128 -out bob_private.pem 1024 +Generating RSA private key, 1024 bit long modulus (2 primes) +..................+++++ +............................+++++ +e is 65537 (0x010001) +Enter pass phrase for bob_private.pem: +Verifying - Enter pass phrase for bob_private.pem: +bob $ +bob $ ls -l bob_private.pem +-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem +bob $ +bob $ file bob_private.pem +bob_private.pem: PEM RSA private key +bob $ +``` + +如果你对密钥文件感到好奇,可以打开命令生成的 .pem 文件,但是你会看到屏幕上的一堆文本: + + +``` +alice $ head alice_private.pem +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,E26FAC1F143A30632203F09C259200B9 + +pdKj8Gm5eeAOF0RHzBx8l1tjmA1HSSvy0RF42bOeb7sEVZtJ6pMnrJ26ouwTQnkL +JJjUVPPHoKZ7j4QpwzbPGrz/hVeMXVT/y33ZEEA+3nrobwisLKz+Q+C9TVJU3m7M +/veiBO9xHMGV01YBNeic7MqXBkhIrNZW6pPRfrbjsBMBGSsL8nwJbb3wvHhzPkeM +e+wtt9S5PWhcnGMj3T+2mtFfW6HWpd8Kdp60z7Nh5mhA9+5aDWREfJhJYzl1zfcv +Bmxjf2wZ3sFJNty+sQVajYfk6UXMyJIuWgAjnqjw6c3vxQi0KE3NUNZYO93GQgEF +pyAnN9uGUTBCDYeTwdw8TEzkyaL08FkzLfFbS2N9BDksA3rpI1cxpxRVFr9+jDBz +alice $ +``` + +要查看密钥的详细信息,可以使用以下 OpenSSL 命令打开 .pem 文件并显示内容。你可能想知道在哪里可以找到另一个配对的密钥,因为这是单个文件。你观察的很细致,获取公钥的方法如下: + +``` +alice $ openssl rsa -in alice_private.pem -noout -text +Enter pass phrase for alice_private.pem: +RSA Private-Key: (1024 bit, 2 primes) +modulus: + 00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99: + 47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc: + c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47: + 81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f: + 65:d3:36:1d:c1:7d:8b:7d:0f:79:de:80:fc:d2:c0: + e4:27:fc:e9:66:2d:e2:7e:fc:e6:73:d1:c9:28:6b: + 6a:8a:e8:96:9d:65:a0:8a:46:e0:b8:1f:b0:48:d4: + db:d4:a3:7f:0d:53:36:9a:7d:2e:e7:d8:f2:16:d3: + ff:1b:12:af:53:22:c0:41:51 +publicExponent: 65537 (0x10001) + +<< 截断 >> + +exponent2: + 6e:aa:8c:6e:37:d0:57:37:13:c0:08:7e:75:43:96: + 33:01:99:25:24:75:9c:0b:45:3c:a2:39:44:69:84: + a4:64:48:f4:5c:bc:40:40:bf:84:b8:f8:0f:1d:7b: + 96:7e:16:00:eb:49:da:6b:20:65:fc:a9:20:d9:98: + 76:ca:59:e1 +coefficient: + 68:9e:2e:fa:a3:a4:72:1d:2b:60:61:11:b1:8b:30: + 6e:7e:2d:f9:79:79:f2:27:ab:a0:a0:b6:45:08:df: + 12:f7:a4:3b:d9:df:c5:6e:c7:e8:81:29:07:cd:7e: + 47:99:5d:33:8c:b7:fb:3b:a9:bb:52:c0:47:7a:1c: + e3:64:90:26 +alice $ +``` + +#### 步骤 2:提取公钥 + +注意,公钥是你可以与他人自由共享的密钥,而你必须将私钥保密。因此,Alice 必须提取她的公钥,并将其保存到文件中: + +``` +alice $ openssl rsa -in alice_private.pem -pubout > alice_public.pem +Enter pass phrase for alice_private.pem: +writing RSA key +alice $ +alice $ ls -l *.pem +-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem +-rw-rw-r--. 1 alice alice 272 Mar 22 17:47 alice_public.pem +alice $ +``` + +你可以使用与之前相同的方式查看公钥详细信息,但是这次,输入公钥 .pem 文件: + +``` +alice $ +alice $ openssl rsa -in alice_public.pem -pubin -text -noout +RSA Public-Key: (1024 bit) +Modulus: +    00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99: +    47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc: +    c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47: +    81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f: +$ +``` + +Bob 可以按照相同的过程来提取他的公钥并将其保存到文件中: + +``` +bob $ openssl rsa -in bob_private.pem -pubout > bob_public.pem +Enter pass phrase for bob_private.pem: +writing RSA key +bob $ +bob $ ls -l *.pem +-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem +-rw-r--r--. 1 bob bob 272 Mar 22 13:51 bob_public.pem +bob $ +``` + +#### 步骤 3:交换公钥 + +这些公钥在 Alice 和 Bob 彼此交换之前没有太大用处。有几种共享公钥的方法,例如使用 `scp` 命令将密钥复制到彼此的工作站。 + +将 Alice 的公钥发送到 Bob 的工作站: + +``` +alice $ scp alice_public.pem bob@bob-machine-or-ip:/path/ +``` + +将 Bob 的公钥发送到 Alice 的工作站: + +``` +bob $ scp bob_public.pem alice@alice-machine-or-ip:/path/ +``` + +现在,Alice 有了 Bob 的公钥,反之亦然: + +``` +alice $ ls -l bob_public.pem +-rw-r--r--. 1 alice alice 272 Mar 22 17:51 bob_public.pem +alice $ +``` + +``` +bob $ ls -l alice_public.pem +-rw-r--r--. 1 bob bob 272 Mar 22 13:54 alice_public.pem +bob $ +``` + +#### 步骤 4:使用公钥交换加密的消息 + +假设 Alice 需要与 Bob 秘密交流。她将秘密信息写入文件中,并将其保存到 `top_secret.txt` 中。由于这是一个普通文件,因此任何人都可以打开它并查看其内容,这里并没有太多保护: + + +``` +alice $ +alice $ echo "vim or emacs ?" > top_secret.txt +alice $ +alice $ cat top_secret.txt +vim or emacs ? +alice $ +``` + +要加密此秘密消息,Alice 需要使用 `openssls -encrypt` 命令。她需要为该工具提供三个输入: + + 1. 秘密消息文件的名称 + 2. Bob 的公钥(文件) + 3. 加密后新文件的名称 + +``` +alice $ openssl rsautl -encrypt -inkey bob_public.pem -pubin -in top_secret.txt -out top_secret.enc +alice $ +alice $ ls -l top_secret.* +-rw-rw-r--. 1 alice alice 128 Mar 22 17:54 top_secret.enc +-rw-rw-r--. 1 alice alice  15 Mar 22 17:53 top_secret.txt +alice $ +alice $ +``` + +加密后,原始文件仍然是可见的,而新创建的加密文件在屏幕上看起来像乱码。这样,你可以确定秘密消息已被加密: + +``` +alice $ cat top_secret.txt +vim or emacs ? +alice $ +alice $ cat top_secret.enc +�s��uM)M&>��N��}dmCy92#1X�q󺕦��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��alice $ +alice $ +alice $ +alice $ hexdump -C ./top_secret.enc +00000000 9e 73 12 8f e3 75 4d 29 4d 26 3e bf 80 4e a0 c5 |.s...uM)M&>..N..| +00000010 7d 64 6d 43 79 39 32 23 31 58 ce 71 f3 ba 95 a6 |}dmCy92#1X.q....| +00000020 c0 c0 76 17 fb f7 bf 4d ce fc 40 e6 f4 45 7f db |..v....M..@..E..| +00000030 7e ae c0 31 f8 6b 10 06 7e 26 50 55 b5 05 56 68 |~..1.k..~&PU..Vh| +00000040 48 4c eb 40 5e 50 fe 19 ea 28 a8 b8 7a 13 69 d7 |HL.@^P...(..z.i.| +00000050 4d b0 34 70 d8 65 d5 07 95 67 2b 52 ea 31 aa d4 |M.4p.e...g+R.1..| +00000060 80 b3 a8 ec a1 73 ed a7 f9 17 c3 13 d4 fa c1 71 |.....s.........q| +00000070 5f 38 b9 6c 07 72 81 a6 fe af 43 a6 49 2d c4 ee |_8.l.r....C.I-..| +00000080 +alice $ +alice $ file top_secret.enc +top_secret.enc: data +alice $ +``` + +删除秘密消息的原始文件是安全的,这样确保任何痕迹都没有: + +``` +alice $ rm -f top_secret.txt +``` + +现在,Alice 需要再次使用 `scp` 命令将此加密文件通过网络发送给 Bob 的工作站。注意,即使文件被截获,其内容也会是加密的,因此内容不会被泄露: + +``` +alice $  scp top_secret.enc bob@bob-machine-or-ip:/path/ +``` + +如果 Bob 使用常规方法尝试打开并查看加密的消息,他将无法看懂该消息: + +``` +bob $ ls -l top_secret.enc +-rw-r--r--. 1 bob bob 128 Mar 22 13:59 top_secret.enc +bob $ +bob $ cat top_secret.enc +�s��uM)M&>��N��}dmCy92#1X�q󺕦��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��bob $ +bob $ +bob $ hexdump -C top_secret.enc +00000000 9e 73 12 8f e3 75 4d 29 4d 26 3e bf 80 4e a0 c5 |.s...uM)M&>..N..| +00000010 7d 64 6d 43 79 39 32 23 31 58 ce 71 f3 ba 95 a6 |}dmCy92#1X.q....| +00000020 c0 c0 76 17 fb f7 bf 4d ce fc 40 e6 f4 45 7f db |..v....M..@..E..| +00000030 7e ae c0 31 f8 6b 10 06 7e 26 50 55 b5 05 56 68 |~..1.k..~&PU..Vh| +00000040 48 4c eb 40 5e 50 fe 19 ea 28 a8 b8 7a 13 69 d7 |HL.@^P...(..z.i.| +00000050 4d b0 34 70 d8 65 d5 07 95 67 2b 52 ea 31 aa d4 |M.4p.e...g+R.1..| +00000060 80 b3 a8 ec a1 73 ed a7 f9 17 c3 13 d4 fa c1 71 |.....s.........q| +00000070 5f 38 b9 6c 07 72 81 a6 fe af 43 a6 49 2d c4 ee |_8.l.r....C.I-..| +00000080 +bob $ +``` + +#### 步骤 5:使用私钥解密文件 + +Bob 需要使用 OpenSSL 来解密消息,但是这次使用的是 `-decrypt` 命令行参数。他需要向工具程序提供以下信息: + + 1. 加密的文件(从 Alice 那里得到) + 2. Bob 的私钥(用于解密,因为文件是用 Bob 的公钥加密的) + 3. 通过重定向保存解密输出的文件名 + +``` +bob $ openssl rsautl -decrypt -inkey bob_private.pem -in top_secret.enc > top_secret.txt +Enter pass phrase for bob_private.pem: +bob $ +``` + +现在,Bob 可以阅读 Alice 发送给他的秘密消息: + +``` +bob $ ls -l top_secret.txt +-rw-r--r--. 1 bob bob 15 Mar 22 14:02 top_secret.txt +bob $ +bob $ cat top_secret.txt +vim or emacs ? +bob $ +``` + +Bob 需要回复 Alice,因此他将秘密回复写在一个文件中: + +``` +bob $ echo "nano for life" > reply_secret.txt +bob $ +bob $ cat reply_secret.txt +nano for life +bob $ +``` + +#### 步骤 6:使用其他密钥重复该过程 + +为了发送消息,Bob 采用和 Alice 相同的步骤,但是由于该消息是发送给 Alice 的,因此他需要使用 Alice 的公钥来加密文件: + +``` +bob $ openssl rsautl -encrypt -inkey alice_public.pem -pubin -in reply_secret.txt -out reply_secret.enc +bob $ +bob $ ls -l reply_secret.enc +-rw-r--r--. 1 bob bob 128 Mar 22 14:03 reply_secret.enc +bob $ +bob $ cat reply_secret.enc +�F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a + �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:bob $ +bob $ +bob $ hexdump -C ./reply_secret.enc +00000000 92 46 dd 87 04 bc a7 2e 34 22 01 66 1a 13 31 db |.F......4".f..1.| +00000010 c4 5c b4 8e 7b 6f d4 b0 24 d2 4d 92 9b 49 7b 35 |.\..{o..$.M..I{5| +00000020 da 7c ee 5c bb 6c cd 82 f1 1b 92 65 f1 8d f2 59 |.|.\.l.....e...Y| +00000030 82 56 81 80 7b 89 07 7c 21 24 63 5e 61 0c ae 2a |.V..{..|!$c^a..*| +00000040 d4 aa 5c 76 51 8d cf a0 39 04 c1 d7 dc f0 ad 99 |..\vQ...9.......| +00000050 27 ed 8e de d9 ae 02 73 50 e0 dd 27 13 ae 8e 5a |'......sP..'...Z| +00000060 12 e4 9a 31 57 b3 03 6e dd e1 16 7f 6b c0 b3 8b |...1W..n....k...| +00000070 4a cf 30 b8 49 3b 50 38 e0 9f 84 f6 83 da 26 3a |J.0.I;P8......&:| +00000080 +bob $ +bob $ # remove clear text secret message file +bob $ rm -f reply_secret.txt +``` + +Bob 通过 `scp` 将加密的文件发送至 Alice 的工作站: + +``` +$ scp reply_secret.enc alice@alice-machine-or-ip:/path/ +``` + +如果 Alice 尝试使用常规工具去阅读加密的文本,她将无法理解加密的文本: + +``` +alice $ +alice $ ls -l reply_secret.enc +-rw-r--r--. 1 alice alice 128 Mar 22 18:01 reply_secret.enc +alice $ +alice $ cat reply_secret.enc +�F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a + �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:alice $ +alice $ +alice $ +alice $ hexdump -C ./reply_secret.enc +00000000 92 46 dd 87 04 bc a7 2e 34 22 01 66 1a 13 31 db |.F......4".f..1.| +00000010 c4 5c b4 8e 7b 6f d4 b0 24 d2 4d 92 9b 49 7b 35 |.\..{o..$.M..I{5| +00000020 da 7c ee 5c bb 6c cd 82 f1 1b 92 65 f1 8d f2 59 |.|.\.l.....e...Y| +00000030 82 56 81 80 7b 89 07 7c 21 24 63 5e 61 0c ae 2a |.V..{..|!$c^a..*| +00000040 d4 aa 5c 76 51 8d cf a0 39 04 c1 d7 dc f0 ad 99 |..\vQ...9.......| +00000050 27 ed 8e de d9 ae 02 73 50 e0 dd 27 13 ae 8e 5a |'......sP..'...Z| +00000060 12 e4 9a 31 57 b3 03 6e dd e1 16 7f 6b c0 b3 8b |...1W..n....k...| +00000070 4a cf 30 b8 49 3b 50 38 e0 9f 84 f6 83 da 26 3a |J.0.I;P8......&:| +00000080 +alice $ +``` + +所以,她使用 OpenSSL 解密消息,只不过这次她提供了自己的私钥并将输出保存到文件中: + +``` +alice $ openssl rsautl -decrypt -inkey alice_private.pem -in reply_secret.enc > reply_secret.txt +Enter pass phrase for alice_private.pem: +alice $ +alice $ ls -l reply_secret.txt +-rw-rw-r--. 1 alice alice 14 Mar 22 18:02 reply_secret.txt +alice $ +alice $ cat reply_secret.txt +nano for life +alice $ +``` + +### 了解 OpenSSL 的更多信息 + +OpenSSL 在加密界是真正的瑞士军刀。除了加密文件外,它还可以执行许多任务,你可以通过访问 OpenSSL [文档页面][4]来找到使用它的所有方式,包括手册的链接、 《OpenSSL Cookbook》、常见问题解答等。要了解更多信息,尝试使用其自带的各种加密算法,看看它是如何工作的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/encryption-decryption-openssl + +作者:[Gaurav Kamathe][a] +选题:[lujun9972][b] +译者:[MjSeven](https://github.com/MjSeven) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gkamathe +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003601_05_mech_osyearbook2016_security_cc.png?itok=3V07Lpko "A secure lock." +[2]: https://www.openssl.org/ +[3]: https://www.openssl.org/docs/man1.0.2/man1/genrsa.html +[4]: https://www.openssl.org/docs/ \ No newline at end of file diff --git a/published/202105/20210429 Experiencing the -e- OS- The Open Source De-Googled Android Version.md b/published/202105/20210429 Experiencing the -e- OS- The Open Source De-Googled Android Version.md new file mode 100644 index 0000000000..6a957af93e --- /dev/null +++ b/published/202105/20210429 Experiencing the -e- OS- The Open Source De-Googled Android Version.md @@ -0,0 +1,132 @@ +[#]: subject: (Experiencing the /e/ OS: The Open Source De-Googled Android Version) +[#]: via: (https://itsfoss.com/e-os-review/) +[#]: author: (Dimitrios https://itsfoss.com/author/dimitrios/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13442-1.html) + +体验 /e/ OS:开源的去谷歌化的安卓 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/30/222621vsgf8q1et5oyysgs.jpg) + +/e/ 安卓操作系统是一个以隐私为导向的去谷歌化的移动操作系统,是 Lineage OS 的复刻,由 Mandrake Linux(现在的 [Mandriva Linux][2])的创建者 [Gaël Duval][1] 于 2018 年中期创立。 + +尽管安卓在 2007 年成为了一个开源项目,但当安卓得到普及时,谷歌使用专有软件取代了一些操作系统元素。/e/ 基金会用 [MicroG][3] 取代了其中的专有的应用程序和服务,这是一个开源的替代框架,可以最大限度地减少跟踪和设备活动。 + +我们收到的 [Fairphone 3][4] 预装了 /e/ OS,这是一个来自 /e/ 基金会的 [以道德的方式创造的智能手机][5]。我使用了一个月这个设备,然后把它返还给了他们,我将分享我对这个隐私设备的体验。我忘了截图,所以我将分享来自官方网站的通用图片。 + +### 在道德的 Fairphone 设备上体验 /e/ 移动操作系统 + +在我进一步说明之前,让我澄清一下,Fairphone 3 并不是使用 /e/ 的唯一选择。如果你要从他们那里购买设备,/e/ 基金会会给你 [一些智能手机的选择][6]。 + +你不需要购买设备来使用 /e/ OS。按照 /e/ 基金会的说法,你可以 [在 100 多个支持的设备上使用它][7]。 + +尽管我很喜欢使用 Fairphone 3,而且我的个人信仰与 Fairphone 的宣言一致,但我不会把注意力放在设备上,而只是放在 /e/ OS 上。 + +#### 有评级隐私的应用程序 + +![][8] + +我把 Fairphone 3 作为我的日常使用设备用了几天时间,以比较与我的“普通”安卓手机在现实中的使用情况。 + +首先,我想看看我使用的所有应用程序是否都可以在 /e/ 基金会创建的“[应用商店][9]”上找到。/e/ 应用商店包含有隐私评级的应用程序。 + +![/e/ OS 应用商店有应用程序的隐私评级][10] + +我可以找到许多应用程序,包括来自谷歌的应用程序。这意味着,如果有人真的想使用一些谷歌的服务,它仍然可以作为一个选项来下载。尽管与其他安卓设备不同,没有强行将谷歌服务塞进你的嘴里。 + +虽然有很多应用程序,但我无法找到我在英国使用的手机银行应用程序。我不得不承认,手机银行应用程序可以在一定程度上促进便利。作为替代方案,我不得不在需要时进入电脑使用网上银行平台。 + +从可用性的角度来看,/e/ OS 可以取代我的“标准”安卓操作系统,但会有一些小插曲,比如银行应用程序。 + +#### 如果不是谷歌的,那是什么? + +想知道 /e/ OS 使用哪些基本的应用程序,而不是谷歌的那些?这里有一个快速列表: + + * [魔法地球][11] —— 逐向道路导航 + * 浏览器 —— Chromium 的一个非谷歌复刻版本 + * 邮件 —— [K9-mail][12] 的一个复刻 + * 短信 —— QKSMS 的一个复刻 + * 照相机 —— OpenCamera 的一个复刻 + * 天气 —— GoodWeather 的一个复刻 + * OpenTasks —— 任务组织者 + * 日历:[Etar calendar][13] 的一个复刻 + +#### Bliss Launcher 和整体设计 + +![][14] + +/e/ OS 的默认启动程序被称为 “Bliss Launcher”,其目的是为了获得有吸引力的外观和感觉。对我来说,这个设计感觉与 iOS 相似。 + +通过向左滑动面板,你可以访问 /e/ 选择的一些有用的小工具。 + +![][15] + + * 搜索:快速搜索预装的应用程序或搜索 Web + * APP 建议:前 4 个最常用的应用程序将出现在这个小部件上 + * 天气:天气小部件显示的是当地的天气。它不会自动检测位置,需要进行配置。 + * 编辑:如果你想在屏幕上有更多的小部件,你可以通过点击“编辑”按钮添加它们。 + +总而言之,用户界面是干净整洁的简单明了,增强了愉快的用户体验。 * 天气。天气小部件显示的是当地的天气。它不会自动检测位置,需要进行配置。 + * 编辑:如果你想在屏幕上有更多的小部件,你可以通过点击编辑按钮添加它们。 + +总而言之,用户界面干净整洁、简单明了,增强了愉快的用户体验。 + +#### 去谷歌化和面向隐私的操作系统 + +如前所述,/e/ 操作系统是一个去谷歌化的操作系统,它基于 [Lineage OS][16] 的开源核心。所有的谷歌应用程序已经被删除,谷歌服务已经被 MicroG 框架所取代。/e/ OS 仍然与所有的安卓应用兼容。 + +主要的隐私功能: + + * 谷歌搜索引擎已被 DuckDuckGo 等替代品取代 + * 谷歌服务已被 microG 框架所取代 + * 使用替代的默认应用程序,而不是谷歌应用程序 + * 取消了对谷歌服务器的连接检查 + * NTP 服务器已被替换为标准的 NTP 服务:pool.ntp.org + * DNS 默认服务器由 9.9.9.9 取代,可以根据用户的选择进行编辑 + * 地理定位是在 GPS 的基础上使用 Mozilla 定位服务 + +> 隐私声明 +> +> 请注意,使用由 /e/ 基金会提供的智能手机并不自动意味着无论你做什么都能保证你的隐私。分享你的个人信息的社交媒体应用程序应在你的意识下使用。 + +### 结论 + +我成为安卓用户已经超过十年了。/e/ OS 给我带来了积极的惊喜。关注隐私的用户可以发现这个解决方案非常吸引人,而且根据所选择的应用程序和设置,可以再次感觉到使用智能手机的安全。 + +如果你是一个有隐私意识的技术专家,并且能够自己找到解决问题的方法,我向你推荐它。对于那些习惯于谷歌主流服务的人来说,/e/ 生态系统可能会让他们不知所措。 + +你使用过 /e/ OS 吗?你的使用经验如何?你怎么看这些关注隐私的项目? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/e-os-review/ + +作者:[Dimitrios][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/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Ga%C3%ABl_Duval +[2]: https://en.wikipedia.org/wiki/Mandriva_Linux +[3]: https://en.wikipedia.org/wiki/MicroG +[4]: https://esolutions.shop/shop/e-os-fairphone-3-fr/ +[5]: https://www.fairphone.com/en/story/?ref=header +[6]: https://esolutions.shop/shop/ +[7]: https://doc.e.foundation/devices/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/e-ecosystem.png?resize=768%2C510&ssl=1 +[9]: https://e.foundation/e-os-available-applications/ +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/e-os-apps-privacy-ratings.png?resize=300%2C539&ssl=1 +[11]: https://www.magicearth.com/ +[12]: https://k9mail.app/ +[13]: https://github.com/Etar-Group/Etar-Calendar +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/fairphone.jpg?resize=600%2C367&ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/e-bliss-launcher.jpg?resize=300%2C533&ssl=1 +[16]: https://lineageos.org/ diff --git a/published/202105/20210429 Linux tips for using GNU Screen.md b/published/202105/20210429 Linux tips for using GNU Screen.md new file mode 100644 index 0000000000..969c31dcfb --- /dev/null +++ b/published/202105/20210429 Linux tips for using GNU Screen.md @@ -0,0 +1,96 @@ +[#]: subject: (Linux tips for using GNU Screen) +[#]: via: (https://opensource.com/article/21/4/gnu-screen-cheat-sheet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (ddl-hust) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13387-1.html) + +使用 GNU Screen 的小技巧 +====== + +> 学习基本的 GNU Screen 终端复用技术,然后下载我们的终端命令备忘录,以便你能够熟悉常用的快捷方式。 + +![](https://img.linux.net.cn/data/attachment/album/202105/13/105050halpppp0pop96ap7.jpg) + +对于一般用户而言,命令行终端窗口可能是令人困惑和神秘的。但随着你对 Linux 终端的进一步了解,你很快就会意识到它的高效和强大。不过,也不需要很长时间,你就会想让终端变得更加高效,除了将更多的终端放到你的终端,还有什么高好的方法能够提升你的终端效率呢? + +### 终端复用 + +终端的许多优点之一是它是一个集中控制的界面。它是一个能让你访问数百个应用程序的窗口,而你与每一个应用程序进行交互所需要的只是一个键盘。但是,现代计算机几乎总是有多余的处理能力,而且现代计算机专家喜欢多任务处理,导致一个窗口处理数百个应用程序的能力是相当有限的。 + +解决这一问题的常见答案是终端复用:即将虚拟终端叠放在一起,然后在它们之间移动的能力。通过终端复用器,你保持了集中控制,但是当你进行多任务时,你能够进行终端切换。更好的是,你能够在终端中拆分屏幕,使得在同一时间显示多个屏幕窗口。 + +### 选择合适的复用器 + +一些终端提供类似的功能,有标签式界面和分割式视图,但也有细微的差别。首先,这些终端的功能依赖于图形化的桌面环境。其次,许多图形化的终端功能需要鼠标交互或使用不方便的键盘快捷键。终端复用器的功能在文本控制台上和在图形桌面上一样好用,而且键位绑定是针对常见的终端序列设计的,很方便。 + +现有两种流行的复用器:[tmux][2] 和 [GNU Screen][3]。尽管你与它们互动的方式略有不同,但它们做同样的事情,而且大多具有相同的功能。这篇文章是 GNU Screen 的入门指南。关于 tmux 的相关介绍,请阅读 Kevin Sonney 的 [tmux 介绍][4]。 + +### 使用 GNU Screen + +GNU Screen 的基本用法很简单,通过 `screen` 命令启动,你将进入 Screen 会话的第 0 个窗口。在你决定需要一个新的终端提示符前,你可能很难注意到有什么变化。 + +当一个终端窗口被某项活动占用(比如,你启动了文本编辑器 [Vim][5] 或 [Jove][6] 或者你在处理音视频,或运行批处理任务),你可以新建一个窗口。要打开一个新的窗口,按 `Ctrl+A`,释放,然后按 `c`。这将在你现有窗口的基础上创建一个新的窗口。 + +你会知道当前你是在一个新的窗口中,因为你的终端除了默认的提示符外,似乎没有任何东西。当然,你的另一个终端仍然存在,它只是躲在新窗口的后面。要遍历打开的窗口,按 `Ctrl+A`,释放,然后按 `n`(表示下一个)或按 `p`(表示上一个)。在只打开两个窗口的情况下, `n` 和 `p` 的功能是一样的,但你可以随时打开更多的窗口(`Ctrl+A`,然后 `c` ),并在它们之间切换。 + +### 分屏 + +GNU Screen 的默认行为更像移动设备的屏幕,而不是桌面:你一次只能看到一个窗口。如果你因为喜欢多任务而使用 GNU Screen ,那么只关注一个窗口可能看起来是一种退步。幸运的是,GNU Screen 可以让你把终端分成窗口中的窗口。 + +要创建一个水平分割窗口,按 `Ctrl+A`,然后按 `s` 。这将把一个窗口置于另一个窗口之上,就像窗格一样。然而,在你告诉它要显示什么之前,分割的空间是没有用途的。因此,在创建一个分割窗后,你可以用 `Ctrl+A` ,然后用 `Tab` 移动到分割窗中。一旦进入,使用 `Ctrl+A` 然后 `n` 浏览所有可用的窗口,直到你想显示的内容出现在分割窗格中。 + +你也可以按 `Ctrl+A` 然后按 `|` (这是一个管道字符,在大多数键盘上通过按下 `shift` 键加上 `\`)创建垂直分割窗口。 + +### 自定义 GNU Screen + + GNU Screen 使用基于 `Ctrl+A` 的快捷键。根据你的习惯,这可能会让你感觉非常自然,也可能非常不方便,因为你可能会用 `Ctrl+A` 来移动到一行的开头。无论怎样,GNU Screen 允许通过 `.screenrc` 配置文件进行各种定制。你可以用这个来改变触发键的绑定(称为 “转义” 键绑定)。 + +``` +escape ^jJ +``` + +你还可以添加一个状态行,以帮助你在 Screen 会话中保持自己不迷失。 + +``` +# status bar, with current window highlighted +hardstatus alwayslastline +hardstatus string '%{= kG}[%{G}%H%? %1`%?%{g}][%= %{= kw}%-w%{+b yk} %n*%t%?(%u)%? %{-}%+w %=%{g}][%{B}%m/%d %{W}%C%A%{g}]' + +# enable 256 colors +attrcolor b ".I" +termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm' +defbce on +``` + +在有多个窗口打开的会话中,有一个时刻提醒哪些窗口具有焦点活动,哪些窗口有后台活动的提醒器特别有用。它类似一种终端的任务管理器。 + +### 下载备忘单 + +当你学习 GNU Screen 的使用方法时,需要记住很多新的键盘命令。有些命令你马上就能记住,但那些你不常使用的命令可能就很难记住了。你可以按 `Ctrl+A` 然后再按 `?` 来访问 GNU Screen 的帮助界面,但如果你更喜欢一些可以打印出来并放在键盘边的东西,请 [下载我们的 GNU Screen 备忘单][7]。 + +学习 GNU Screen 是提高你使用你最喜欢的 [终端模拟器][8] 的效率和敏捷性的一个好方法。请试一试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/gnu-screen-cheat-sheet + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[ddl-hust](https://github.com/ddl-hust) +校对:[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/terminal_command_linux_desktop_code.jpg?itok=p5sQ6ODE (Terminal command prompt on orange background) +[2]: https://github.com/tmux/tmux/wiki +[3]: https://www.gnu.org/software/screen/ +[4]: https://opensource.com/article/20/1/tmux-console +[5]: https://opensource.com/tags/vim +[6]: https://opensource.com/article/17/1/jove-lightweight-alternative-vim +[7]: https://opensource.com/downloads/gnu-screen-cheat-sheet +[8]: https://opensource.com/article/21/2/linux-terminals diff --git a/published/202105/20210430 Access an alternate internet with OpenNIC.md b/published/202105/20210430 Access an alternate internet with OpenNIC.md new file mode 100644 index 0000000000..5381d44ab5 --- /dev/null +++ b/published/202105/20210430 Access an alternate internet with OpenNIC.md @@ -0,0 +1,139 @@ +[#]: subject: (Access an alternate internet with OpenNIC) +[#]: via: (https://opensource.com/article/21/4/opennic-internet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13393-1.html) + +用 OpenNIC 访问另一个互联网 +====== + +> 在超级信息高速公路上绕行。 + +![](https://img.linux.net.cn/data/attachment/album/202105/15/181625le76l758lel653b5.jpg) + +用传奇的 DNS 黑客 Dan Kaminsky 的话说,“事实证明,互联网对全球社会而言意义重大”。为了使互联网发挥作用,计算机必须能够在最复杂的网络万维网(WWW)中找到彼此。这是几十年前给政府工作人员和学术界 IT 人员提出的问题,而今天我们使用的正是他们的解决方案。然而,他们实际上并不是在寻求建立 互联网the Internet,他们是在为 互联网络(实际上是 级联网catenets,即“级联的网络concatenated networks
        ”,但这个术语最终不再流行)定义规范,它是一个互连的网络interconnected networks的通用术语。 + +根据这些规范,网络使用数字组合,作为每台在线计算机的一种家地址,并为每个网站分配一个人性化但高度结构化的“主机名”(如 `example.com`)。由于用户主要是通过网站 _名称_ 与互联网互动,可以说互联网的运作只是因为我们都同意一个标准化的命名方案。如果有足够多的人决定使用不同的命名方案,互联网的工作方式 _可能_ 会有所不同。一群用户可以形成一个平行的互联网,它使用相同的物理基础设施(电缆、卫星和其他传输方式,将数据从一个地方传送到另一个地方),但使用不同的方法将主机名与编号地址联系起来。 + +事实上,这已经存在了,这篇文章展示了你如何访问它。 + +### 了解名称服务器 + +术语“互联网internet”实际上是 互联interconnected网络networks 这两个术语的组合,因为这正是它的本质。就像一个城市里的邻里、一个国家里的城市、或一个大陆里的国家,或一个星球里的大陆一样,互联网通过将数据从一个家庭或办公室网络传输到数据中心和服务器房或其他家庭或办公室网络而跨越了全球。这是一项艰巨的任务,但它并非没有先例。毕竟,电话公司很久以前就把世界连接起来了,在那之前,电报和邮政服务也是这样做的。 + +在电话或邮件系统中,有一份名单,无论是正式的还是非正式的,都将人名与实际地址联系起来。它过去以电话簿的形式传递到家里,该电话簿是社区内每个电话所有者的目录。邮局的运作方式不同:他们通常依靠寄信人知道预定收信人的姓名和地址,但邮政编码和城市名称被用来把信送到正确的邮局。无论哪种方式,都需要有一个标准的组织方案。 + +对于计算机来说,[IP 协议][2] 描述了必须如何设置互联网上的地址格式。域名服务器 [(DNS) 协议][3] 描述了如何将人性化名称分配给 IP 以及从 IP 解析。无论你使用的是 IPv4 还是 IPv6,其想法都是一样的:当一个节点(可能是一台计算机或通往另一个网络的网关)加入一个网络时,它被分配一个 IP 地址。 + +如果你愿意,你可以在 [ICANN][4](一个帮助协调互联网上的网站名称的非营利组织)注册一个域名,并将该名称指向该 IP。没有要求你“拥有”该 IP 地址。任何人都可以将任何域名指向任何 IP 地址。唯一的限制是,一次只能有一个人拥有一个特定的域名,而且域名必须遵循公认的 DNS 命名方案。 + +域名及其相关 IP 地址的记录被输入到 DNS 中。当你在浏览器中导航到一个网站时,它会迅速查询 DNS 网络,以找到与你所输入(或从搜索引擎点击)的任何 URL 相关的 IP 地址。 + +### 一个不同的 DNS + +为了避免在谁拥有哪个域名的问题上发生争论,大多数域名注册商对域名注册收取一定的费用。该费用通常是象征性的,有时甚至是 0 美元(例如,`freenom.com` 提供免费的 `.tk`、`.ml`、`.gq` 和 `.cf` 域名,先到先得)。 + +在很长一段时间里,只有几个“顶级”域名,包括 `.org`、`.edu` 和 `.com`。现在有很多,包括 `.club`、`.biz`、`.name`、`.international` 等等。本质上它们就是字母组合,但是,有很多潜在的顶级域名是无效的,如 `.null`。如果你试图导航到一个以 `.null` 结尾的网站,那么你不会成功。它不能注册,也不是域名服务器的有效条目,而且它根本就不存在。 + +[OpenNIC项目][5] 已经建立了一个备用的 DNS 网络,将域名解析为 IP 地址,但它包括目前互联网不使用的名字。可用的顶级域名包括: + + * .geek + * .indy + * .bbs + * .gopher + * .o + * .libre + * .oss + * .dyn + * .null + +你可以在这些(以及更多的)顶级域名中注册一个域名,并在 OpenNIC 的 DNS 系统上注册,使它们映射到你选择的 IP 地址。 + +换句话说,一个网站可能存在于 OpenNIC 网络中,但对于不使用 OpenNIC 名称服务器的人来说,仍然无法访问。这绝不是一种安全措施,甚至不是一种混淆手段。这只是一种有意识的选择,在 _超级信息高速公路上绕行_ 。 + +### 如何使用 OpenNIC 的 DNS 服务器 + +要访问 OpenNIC 网站,你必须配置你的计算机使用 OpenNIC 的 DNS 服务器。幸运的是,这并不是一个非此即彼的选择。通过使用一个 OpenNIC 的 DNS 服务器,你可以同时访问 OpenNIC 和标准网络。 + +要配置你的 Linux 电脑使用 OpenNIC 的 DNS 服务器,你可以使用 [nmcli][6] 命令,这是 Network Manager 的一个终端界面。在开始配置之前,请访问 [opennic.org][5],寻找离你最近的 OpenNIC DNS 服务器。与标准 DNS 和 [边缘计算][7] 一样,服务器在地理上离你越近,你的浏览器查询时的延迟就越少。 + +下面是如何使用 OpenNIC: + +1、首先,获得一个连接列表: + +``` +$ sudo nmcli connection +NAME                TYPE             DEVICE +Wired connection 1  802-3-ethernet   eth0 +MyPersonalWifi      802-11-wireless  wlan0 +ovpn-phx2-tcp       vpn              -- +``` + +你的连接肯定与这个例子不同,但要关注第一栏。这提供了你的连接的可读名称。在这个例子中,我将配置我的以太网连接,但这个过程对无线连接是一样的。 + +2、现在你知道了需要修改的连接的名称,使用 `nmcli` 更新其 `ipv4.dns` 属性: + +``` +$ sudo nmcli con modify "Wired connection 1" ipv4.dns "134.195.4.2" +``` + +在这个例子中,`134.195.4.2` 是离我最近的服务器。 + +3、防止 Network Manager 使用你路由器设置的内容自动更新 `/etc/resolv.conf`: + +``` +$ sudo nmcli con modify "Wired connection 1" ipv4.ignore-auto-dns yes +``` + +4、将你的网络连接关闭,然后再次启动,以实例化新的设置: + +``` +$ sudo nmcli con down "Wired connection 1" +$ sudo nmcli con up "Wired connection 1" +``` + +完成了。你现在正在使用 OpenNIC 的 DNS 服务器。 + +#### 路由器上的 DNS + +你可以通过对你的路由器做这样的修改,将你的整个网络设置为使用 OpenNIC。你将不必配置你的计算机的连接,因为路由器将自动提供正确的 DNS 服务器。我无法演示这个,因为路由器的接口因制造商而异。此外,一些互联网服务提供商 (ISP) 不允许你修改名称服务器的设置,所以这并不总是一种选择。 + +### 测试 OpenNIC + +为了探索你所解锁的“其他”互联网,尝试在你的浏览器中导航到 `grep.geek`。如果你输入 `http://grep.geek`,那么你的浏览器就会带你到 OpenNIC 的搜索引擎。如果你只输入 `grep.geek`,那么你的浏览器会干扰你,把你带到你的默认搜索引擎(如 [Searx][8] 或 [YaCy][9]),并在窗口的顶部提供一个导航到你首先请求的页面。 + +![OpenNIC][10] + +不管怎么说,你最终还是来到了 `grep.geek`,现在可以在网上搜索 OpenNIC 的版本了。 + +### 广阔天地 + +互联网旨在成为一个探索、发现和平等访问的地方。OpenNIC 利用现有的基础设施和技术帮助确保这些东西。它是一个可选择的互联网替代方案。如果这些想法吸引了你,那就试一试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/4/opennic-internet + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=RPkPPtDe (An intersection of pipes.) +[2]: https://tools.ietf.org/html/rfc791 +[3]: https://tools.ietf.org/html/rfc1035 +[4]: https://www.icann.org/resources/pages/register-domain-name-2017-06-20-en +[5]: http://opennic.org +[6]: https://opensource.com/article/20/7/nmcli +[7]: https://opensource.com/article/17/9/what-edge-computing +[8]: http://searx.me +[9]: https://opensource.com/article/20/2/open-source-search-engine +[10]: https://opensource.com/sites/default/files/uploads/did-you-mean.jpg (OpenNIC) +[11]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/published/202105/20210501 Chrome Browser Keeps Detecting Network Change in Linux- Here-s How to Fix it.md b/published/202105/20210501 Chrome Browser Keeps Detecting Network Change in Linux- Here-s How to Fix it.md new file mode 100644 index 0000000000..d111cd3755 --- /dev/null +++ b/published/202105/20210501 Chrome Browser Keeps Detecting Network Change in Linux- Here-s How to Fix it.md @@ -0,0 +1,96 @@ +[#]: subject: "Chrome Browser Keeps Detecting Network Change in Linux? Here’s How to Fix it" +[#]: via: "https://itsfoss.com/network-change-detected/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "HuengchI" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13389-1.html" + +Linux 下 Chrome 浏览器一直报“检测到网络变化”,修复方法来了 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/14/140644y6xx6e8100wzxrr5.jpg) + +过去几天,我在 Ubuntu Linux系统上遇到了一个奇怪的问题。我用的是 Firefox 浏览器和 [Brave 浏览器][1]。Brave 浏览器一直报“network change detection”错误,几乎每次刷新都报错,但是在 Firefox 浏览器中一切正常。 + +![][2] + +这个问题严重到了几乎不能使用浏览器的地步。我不能用 [Feedly][3] 来从我最喜欢的网站浏览信息流,每一个搜索结果都要多次刷新,网站也需要多次刷新。 + +作为替代,我尝试 [在 Ubuntu 上安装 Chrome 浏览器][4]。但是问题依然存在。我还 [在 Linux 上安装了微软 Edge][5],但是问题依旧。基本上,任何 Chromium 内核的浏览器都会持续报“ERR_NETWORK_CHANGED”错误。 + +幸运地是,我找到了一个方法来修复这个问题。我将会把解决步骤分享给你,如果你也遇到了同样的问题,这将能够帮到你。 + +### 解决基于 Chromium 内核的浏览器频繁报“network change detection”错的问题 + +对我而言,关闭网络设置中的 IPv6 是一个有效的诀窍。虽然现在我还不确定是什么导致了这个故障,但是 IPv6 会在很多系统中导致错误并不是什么鲜为人知的事。如果你的系统,路由器和其他设备用了 IPv6 而不是古老却好用的 IPv4,那么你就可能遭遇和我相同的网络连接故障。 + +幸亏,[关闭 Ubuntu 的 IPv6][6] 并不算难。有好几种方法都能够达到目的,我将会分享一个大概是最容易的方法。这个方法就是用 GRUB 来关闭 IPv6。 + +> 新手注意! +> +> 如果你不习惯于用命令行和终端,请额外注意这些步骤。仔细的阅读这些操作说明。 + +#### 第 1 步:打开 GRUB 配置文件以编辑 + +打开终端。用下面的命令来在 Nano 编辑器中打开 GRUB 配置文件。这里你需要输入你的账户密码。 + +``` +sudo nano /etc/default/grub +``` + +我希望你懂得一点 [使用 Nano 编辑器][7] 的方法。使用方向键移动光标,找到以`GRUB_CMDLINE_LINUX` 开头的这行。把它的值修改成这样: + +``` +GRUB_CMDLINE_LINUX="ipv6.disable=1" +``` + +注意引号和空格。不要动其他行。 + +![][8] + +使用 `Ctrl+x` 快捷键保存更改。按 `Y` 或者回车确认。 + +#### 第 2 步:更新 GRUB + +你已经修改了 GRUB 引导器的配置,但是在你更新 GRUB 之前这些更改都不会生效。使用下面的命令来更新: + +``` +sudo update-grub +``` + +![][9] + +现在当你重启系统之后,IPv6 将会被关闭了。你不应该再遇到网络中断的故障了。 + +你可能会想为什么我没提从网络设置中关掉 IPv6。这是因为目前 Ubuntu 用了 [Netplan][10] 来管理网络配置,似乎在网络设置中做出的更改并没有被完全应用到 Netplan 中。我试过虽然在网络设置中关掉了 IPv6,但是这个问题并没有被解决,直到我用了上述命令行的方法。 + +即使过了这么多年,IPv6 的支持还是没有成熟,并且持续引发了很多故障。比如关闭 IPv6 有时候能 [提高 Linux 下的 Wi-Fi 速度][11]。够扯吧? + +不管怎样,我希望上述小方法也能够帮助你解决系统中的“network change detection”故障。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/network-change-detected/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[HuengchI](https://github.com/HuengchI) +校对:[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/brave-web-browser/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/network-change-detected.png?resize=800%2C418&ssl=1 +[3]: https://feedly.com/ +[4]: https://itsfoss.com/install-chrome-ubuntu/ +[5]: https://itsfoss.com/microsoft-edge-linux/ +[6]: https://itsfoss.com/disable-ipv6-ubuntu-linux/ +[7]: https://itsfoss.com/nano-editor-guide/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/disabling-ipv6-via-grub.png?resize=800%2C453&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/updating-grub-ubuntu.png?resize=800%2C434&ssl=1 +[10]: https://netplan.io/ +[11]: https://itsfoss.com/speed-up-slow-wifi-connection-ubuntu/ diff --git a/published/202105/20210502 Fedora Vs Red Hat- Which Linux Distro Should You Use and Why.md b/published/202105/20210502 Fedora Vs Red Hat- Which Linux Distro Should You Use and Why.md new file mode 100644 index 0000000000..c721782052 --- /dev/null +++ b/published/202105/20210502 Fedora Vs Red Hat- Which Linux Distro Should You Use and Why.md @@ -0,0 +1,183 @@ +[#]: subject: (Fedora Vs Red Hat: Which Linux Distro Should You Use and Why?) +[#]: via: (https://itsfoss.com/fedora-vs-red-hat/) +[#]: author: (Sarvottam Kumar https://itsfoss.com/author/sarvottam/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13372-1.html) + +Fedora 和红帽 Linux:你应该使用哪个,为什么? +====== + +Fedora 和红帽 Linux。这两个 Linux 发行版都属于同一个组织,都使用 RPM 包管理器,都提供桌面版和服务器版。这两个 Linux 发行版对操作系统世界都有较大的影响。 + +这就是为什么在这两个类似的发行版之间比较容易混淆的原因。在这篇文章中,我将讨论红帽 Linux 和 Fedora 的相似之处和区别。 + +如果你想在两者之间做出选择,或者只是想了解来自同一组织的两个发行版的概念,这将对你有所帮助。 + +### Fedora 和红帽 Linux 的区别 + +![][1] + +我们先来谈谈这两个发行版的区别。 + +#### 社区版与企业版 + +早在 1995 年,红帽 Linux 就有了它的第一个正式版本,它是作为盒装产品出售的。它也被称为红帽商业 LinuxRed Hat Commercial Linux。 + +后来在 2003 年,红帽把红帽 Linux 变成了完全以企业客户为中心的红帽企业 LinuxRed Hat Enterprise Linux(RHEL)。从那时起,红帽 Linux 就是一个企业版的 Linux 发行版。 + +它的意思是,你必须订阅并付费才能使用红帽 Linux,因为它不是作为一个免费的操作系统。甚至所有的软件、错误修复和安全支持都只对那些拥有红帽订阅的人开放。 + +当红帽 Linux 变成 RHEL 时,它也导致了 Fedora 项目的成立,该项目负责 Fedora Linux的开发。 + +与红帽不同,Fedora 是一个社区版的 Linux 发行版,每个人都可以免费使用,包括错误修复和其他服务。 + +尽管红帽公司赞助了 Fedora 项目,但 Fedora Linux 主要由一个独立的开源社区维护。 + +#### 免费与付费 + +好吧,你会发现大多数的 Linux 发行版都可以免费下载。Fedora Linux 也是这样一个发行版,它的桌面版、服务器版、所有其他版本和 Spin 版都是免费 [可下载][2] 的。 + +还有一些 Linux 发行版,你必须付费购买。红帽企业 Linux 就是这样一个流行的基于 Linux 的操作系统,它是需要付费的。 + +除了价格为 99 美元的 RHEL [开发者版本][3],你必须支付超过 100 美元才能购买 [其他 RHEL 版本][4],用于服务器、虚拟数据中心和台式机。 + +然而,如果你碰巧是一个个人开发者,而不是一个组织或团队,你可以加入 [红帽开发者计划][5]。根据该计划,你可以在 12 个月内免费获得红帽企业 Linux 包括其他产品的使用权。 + +#### 上游还是下游 + +Fedora 是 RHEL 的上游,RHEL 是 Fedora 的下游。这意味着当 Fedora 的新版本发布时,红帽公司会利用 Fedora 的源代码,在其下一个版本中加入所需的功能。 + +当然,红帽公司也会在合并到自己的 RHEL 代码库之前测试这些拉来的代码。 + +换句话说,Fedora Linux 作为红帽公司的一个试验场,首先检查功能,然后将其纳入 RHEL 系统中。 + +#### 发布周期 + +为了给操作系统的所有组件提供定期更新,RHEL 和 Fedora 都遵循一个标准的定点发布模式。 + +Fedora 大约每六个月发布一个新版本(主要在四月和十月),并提供长达 13 个月的维护支持。 + +红帽 Linux 每年发布一个特定系列的新的定点版本,大约 5 年后发布一个主要版本。红帽 Linux 的每个主要版本都要经过四个生命周期阶段,从 5 年的支持到使用附加订阅的 10 年的延长寿命阶段。 + +#### 尝鲜 Linux 发行版 + +当涉及到创新和新技术时,Fedora 比 RHEL 更积极。即使 Fedora 不遵循 [滚动发布模式][6],它也是以早期提供尝鲜技术而闻名的发行版。 + +这是因为 Fedora 定期将软件包更新到最新版本,以便在每六个月后提供一个最新的操作系统。 + +如果你知道,[GNOME 40][7] 是 GNOME 桌面环境的最新版本,上个月才发布。而 Fedora 的最新稳定版 [版本 34][8] 确实包含了它,而 RHEL 的最新稳定版 8.3 仍然带有 GNOME 3.32。 + +#### 文件系统 + +在选择操作系统时,你是否把系统中数据的组织和检索放在了很重要的位置?如果是的话,在决定选择 Red Hat 和 Fedora 之前,你应该了解一下 XFS 和 Btrfs 文件系统。 + +那是在 2014 年,RHEL 7.0 用 XFS 取代 Ext4 作为其默认文件系统。从那时起,红帽在每个版本中都默认有一个 XFS 64 位日志文件系统。 + +虽然 Fedora 是红帽 Linux 的上游,但 Fedora 继续使用 Ext4,直到去年 [Fedora 33][9] 引入 [Btrfs 作为默认文件系统][10]。 + +有趣的是,红帽在最初发布的 RHEL 6 中包含了 Btrfs 作为“技术预览”。后来,红帽放弃了使用 Btrfs 的计划,因此在 2019 年从 RHEL 8 和后来发布的主要版本中完全 [删除][11] 了它。 + +#### 可用的变体 + +与 Fedora 相比,红帽 Linux 的版本数量非常有限。它主要适用于台式机、服务器、学术界、开发者、虚拟服务器和 IBM Power LE。 + +而 Fedora 除了桌面、服务器和物联网的官方版本外,还提供不可变的桌面 Silverblue 和专注于容器的 Fedora CoreOS。 + +不仅如此,Fedora 也有特定目的的定制变体,称为 [Fedora Labs][12]。每个 ISO 都为专业人士、神经科学、设计师、游戏玩家、音乐家、学生和科学家打包了一套软件。 + +想要 Fedora 中不同的桌面环境吗?你也可以查看官方的 [Fedora Spins][13],它预先配置了几种桌面环境,如 KDE、Xfce、LXQT、LXDE、Cinnamon 和 i3 平铺窗口管理器。 + +![Fedora Cinnamon Spin][14] + +此外,如果你想在新软件登陆稳定版 Fedora 之前就得到它,Fedora Rawhide 是另一个基于滚动发布模式的版本。 + +### Fedora 和红帽 Linux 的相似之处 + +除了不同之处,Fedora 和红帽 Linux 也有几个共同点。 + +#### 母公司 + +红帽公司是支持 Fedora 项目和 RHEL 的共同公司,在开发和财务方面都有支持。 + +即使红帽公司在财务上赞助 Fedora 项目,Fedora 也有自己的理事会,在没有红帽公司干预的情况下监督其发展。 + +#### 开源产品 + +在你认为红帽 Linux 要收钱,那么它怎么能成为一个开源产品之前,我建议阅读我们的 [文章][15],它分析了关于 FOSS 和开源的一切。 + +作为一个开源软件,并不意味着你可以免费得到它,有时它可能要花钱。红帽公司是一个已经在开源中建立了业务的开源公司。 + +Fedora 和红帽 Linux 都是开源的操作系统。所有的 Fedora 软件包都可以在 [这里][16] 得到源代码和在 [这里][2] 得到已经打包好的软件。 + +然而,就红帽 Linux 而言,源代码也 [免费提供][17] 给任何人。但与 Fedora 不同的是,你需要为使用可运行的代码付费,要么你可以自由地自行构建。 + +你支付给红帽的订阅费实际上是用于系统维护和技术支持。 + +#### 桌面环境和初始系统 + +Fedora 和红帽 Linux 的旗舰桌面版采用了 GNOME 图形界面。所以,如果你已经熟悉了 GNOME,从任何一个发行版开始都不会有太大的问题。 + +![GNOME 桌面][18] + +你是少数讨厌 SystemD 初始化系统的人吗?如果是这样,那么 Fedora 和红帽 Linux 都不适合你,因为它们都默认支持并使用 SystemD。 + +总之,如果你想用 Runit 或 OpenRC 等其他初始化系统代替它,也不是不可能,但我认为这不是一个好主意。 + +#### 基于 RPM 的发行版 + +如果你已经精通使用 YUM、RPM 或 DNF 命令行工具来处理 RPM 软件包,赞一个!你可以在这两个基于 RPM 的发行版中选一个。 + +默认情况下,红帽 Linux 使用 RPM(红帽包管理器Red Hat Package Manager)来安装、更新、删除和管理 RPM 软件包。 + +Fedora 在 2015 年的 Fedora 21 之前使用 YUM(黄狗更新器修改版Yellowdog Updater Modified)。从 Fedora 22 开始,它现在使用 DNF(时髦版 YumDandified Yum)代替 YUM 作为默认的 [软件包管理器][19]。 + +### Fedora 或红帽 Linux:你应该选择哪一个? + +坦率地说,这真的取决于你是谁以及你为什么要使用它。如果你是一个初学者、开发者,或者是一个想用它来提高生产力或学习 Linux 的普通用户,Fedora 可以是一个不错的选择。 + +它可以帮助你轻松地设置系统,进行实验,节省资金,还可以成为 Fedora 项目的一员。让我提醒你,Linux 的创造者 [Linus Torvalds][20] 在他的主要工作站上使用 Fedora Linux。 + +然而,这绝对不意味着你也应该使用 Fedora。如果你碰巧是一个企业,考虑到 Fedora 的支持生命周期在一年内就会结束,你可能会重新考虑选择它。 + +而且,如果你不喜欢每个新版本的快速变化,你可能不喜欢尝鲜的 Fedora 来满足你的服务器和业务需求。 + +使用企业版红帽,你可以得到高稳定性、安全性和红帽专家工程师为你的大型企业提供的支持品质。 + +那么,你是愿意每年升级你的服务器并获得免费的社区支持,还是购买订阅以获得超过 5 年的生命周期和专家技术支持?决定权在你。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/fedora-vs-red-hat/ + +作者:[Sarvottam Kumar][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/sarvottam/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-vs-red-hat.jpg?resize=800%2C450&ssl=1 +[2]: https://getfedora.org/ +[3]: https://www.redhat.com/en/store/red-hat-enterprise-linux-developer-suite +[4]: https://www.redhat.com/en/store/linux-platforms +[5]: https://developers.redhat.com/register/ +[6]: https://itsfoss.com/rolling-release/ +[7]: https://news.itsfoss.com/gnome-40-release/ +[8]: https://news.itsfoss.com/fedora-34-release/ +[9]: https://itsfoss.com/fedora-33/ +[10]: https://itsfoss.com/btrfs-default-fedora/ +[11]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/considerations_in_adopting_rhel_8/file-systems-and-storage_considerations-in-adopting-rhel-8#btrfs-has-been-removed_file-systems-and-storage +[12]: https://labs.fedoraproject.org/ +[13]: https://spins.fedoraproject.org/ +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/Fedora-Cinnamon-Spin.jpg?resize=800%2C450&ssl=1 +[15]: https://itsfoss.com/what-is-foss/ +[16]: https://src.fedoraproject.org/ +[17]: http://ftp.redhat.com/pub/redhat/linux/enterprise/ +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/GNOME-desktop.jpg?resize=800%2C450&ssl=1 +[19]: https://itsfoss.com/package-manager/ +[20]: https://itsfoss.com/linus-torvalds-facts/ diff --git a/published/202105/20210503 Configure WireGuard VPNs with NetworkManager.md b/published/202105/20210503 Configure WireGuard VPNs with NetworkManager.md new file mode 100644 index 0000000000..2c46177c34 --- /dev/null +++ b/published/202105/20210503 Configure WireGuard VPNs with NetworkManager.md @@ -0,0 +1,238 @@ +[#]: subject: (Configure WireGuard VPNs with NetworkManager) +[#]: via: (https://fedoramagazine.org/configure-wireguard-vpns-with-networkmanager/) +[#]: author: (Maurizio Garcia https://fedoramagazine.org/author/malgnuz/) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13379-1.html) + +用 NetworkManager 配置 WireGuard 虚拟私有网络 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/10/235609bmbzbr4bikupbjjr.jpg) + +虚拟私有网络Virtual Private Networks应用广泛。如今有各种方案可供使用,用户可通过这些方案访问任意类型的资源,同时保持其机密性与隐私性。 + +最近,WireGuard 因为其简单性、速度与安全性成为最广泛使用的虚拟私有网络协议之一。WireGuard 最早应用于 Linux 内核,但目前可以用在其他平台,例如 iOS、Android 等。 + +WireGuard 使用 UDP 作为其传输协议,并在 Critokey Routing(CKR)的基础上建立对等节点之间的通信。每个对等节点(无论是服务器或客户端)都有一对密钥key(公钥与私钥),公钥与许可 IP 间建立通信连接。有关 WireGuard 更多信息请访问其 [主页][4]。 + +本文描述了如何在两个对等节点(PeerA 与 PeerB)间设置 WireGuard。两个节点均运行 Fedora Linux 系统,使用 NetworkManager 进行持久性配置。 + +### WireGuard 设置与网络配置 + +在 PeerA 与 PeerB 之间建立持久性虚拟私有网络连接只需三步: + + 1. 安装所需软件包。 + 2. 生成密钥对key pair。 + 3. 配置 WireGuard 接口。 + +### 安装 + +在两个对等节点(PeerA 与 PeerB)上安装 `wireguard-tools` 软件包: + +``` +$ sudo -i +# dnf -y install wireguard-tools +``` + +这个包可以从 Fedora Linux 更新库中找到。它在 `/etc/wireguard/` 中创建一个配置目录。在这里你将创建密钥和接口配置文件。 + +### 生成密钥对 + +现在,使用 `wg` 工具在每个节点上生成公钥与私钥: + +``` +# cd /etc/wireguard +# wg genkey | tee privatekey | wg pubkey > publickey +``` + +### 在 PeerA 上配置 WireGuard 接口 + +WireGuard 接口命名规则为 `wg0`、`wg1` 等等。完成下述步骤为 WireGuard 接口创建配置: + + * PeerA 节点上配置想要的 IP 地址与掩码。 + * 该节点监听的 UDP 端口。 + * PeerA 的私钥。 + +``` +# cat << EOF > /etc/wireguard/wg0.conf +[Interface] +Address = 172.16.1.254/24 +SaveConfig = true +ListenPort = 60001 +PrivateKey = mAoO2RxlqRvCZZoHhUDiW3+zAazcZoELrYbgl+TpPEc= + +[Peer] +PublicKey = IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw= +AllowedIPs = 172.16.1.2/32 +EOF +``` + +允许 UDP 流量通过节点监听的端口: + +``` +# firewall-cmd --add-port=60001/udp --permanent --zone=public +# firewall-cmd --reload +success +``` + +最后,将接口配置文件导入 NetworkManager。这样,WireGuard 接口在重启后将持续存在。 + +``` +# nmcli con import type wireguard file /etc/wireguard/wg0.conf +Connection 'wg0' (21d939af-9e55-4df2-bacf-a13a4a488377) successfully added. +``` + +验证 `wg0`的状态: + +``` +# wg +interface: wg0 + public key: FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8= + private key: (hidden) + listening port: 60001 + +peer: IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw= + allowed ips: 172.16.1.2/32 + +# nmcli -p device show wg0 + +=============================================================================== + Device details (wg0) +=============================================================================== +GENERAL.DEVICE: wg0 +------------------------------------------------------------------------------- +GENERAL.TYPE: wireguard +------------------------------------------------------------------------------- +GENERAL.HWADDR: (unknown) +------------------------------------------------------------------------------- +GENERAL.MTU: 1420 +------------------------------------------------------------------------------- +GENERAL.STATE: 100 (connected) +------------------------------------------------------------------------------- +GENERAL.CONNECTION: wg0 +------------------------------------------------------------------------------- +GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveC> +------------------------------------------------------------------------------- +IP4.ADDRESS[1]: 172.16.1.254/24 +IP4.GATEWAY: -- +IP4.ROUTE[1]: dst = 172.16.1.0/24, nh = 0.0.0.0, mt => +------------------------------------------------------------------------------- +IP6.GATEWAY: -- +------------------------------------------------------------------------------- +``` + +上述输出显示接口 `wg0` 已连接。现在,它可以和虚拟私有网络 IP 地址为 172.16.1.2 的对等节点通信。 + +### 在 PeerB 上配置 WireGuard 接口 + +现在可以在第二个对等节点上创建 `wg0` 接口的配置文件了。确保你已经完成以下步骤: + + * PeerB 节点上设置 IP 地址与掩码。 + * PeerB 的私钥。 + * PeerA 的公钥。 + * PeerA 的 IP 地址或主机名、监听 WireGuard 流量的 UDP 端口。 + +``` +# cat << EOF > /etc/wireguard/wg0.conf +[Interface] +Address = 172.16.1.2 +SaveConfig = true +PrivateKey = UBiF85o7937fBK84c2qLFQwEr6eDhLSJsb5SAq1lF3c= + +[Peer] +PublicKey = FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8= +AllowedIPs = 172.16.1.254/32 +Endpoint = peera.example.com:60001 +EOF +``` + +最后一步是将接口配置文件导入 NetworkManager。如上所述,这一步是重启后保持 WireGuard 接口持续存在的关键。 + +``` +# nmcli con import type wireguard file /etc/wireguard/wg0.conf +Connection 'wg0' (39bdaba7-8d91-4334-bc8f-85fa978777d8) successfully added. +``` + +验证 `wg0` 的状态: + +``` +# wg +interface: wg0 + public key: IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw= + private key: (hidden) + listening port: 47749 + +peer: FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8= + endpoint: 192.168.124.230:60001 + allowed ips: 172.16.1.254/32 + +# nmcli -p device show wg0 + +=============================================================================== + Device details (wg0) +=============================================================================== +GENERAL.DEVICE: wg0 +------------------------------------------------------------------------------- +GENERAL.TYPE: wireguard +------------------------------------------------------------------------------- +GENERAL.HWADDR: (unknown) +------------------------------------------------------------------------------- +GENERAL.MTU: 1420 +------------------------------------------------------------------------------- +GENERAL.STATE: 100 (connected) +------------------------------------------------------------------------------- +GENERAL.CONNECTION: wg0 +------------------------------------------------------------------------------- +GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveC> +------------------------------------------------------------------------------- +IP4.ADDRESS[1]: 172.16.1.2/32 +IP4.GATEWAY: -- +------------------------------------------------------------------------------- +IP6.GATEWAY: -- +------------------------------------------------------------------------------- +``` + +上述输出显示接口 `wg0` 已连接。现在,它可以和虚拟私有网络 IP 地址为 172.16.1.254 的对等节点通信。 + +### 验证节点间通信 + +完成上述步骤后,两个对等节点可以通过虚拟私有网络连接相互通信,以下是 ICMP 测试结果: + +``` +[root@peerb ~]# ping 172.16.1.254 -c 4 +PING 172.16.1.254 (172.16.1.254) 56(84) bytes of data. +64 bytes from 172.16.1.254: icmp_seq=1 ttl=64 time=0.566 ms +64 bytes from 172.16.1.254: icmp_seq=2 ttl=64 time=1.33 ms +64 bytes from 172.16.1.254: icmp_seq=3 ttl=64 time=1.67 ms +64 bytes from 172.16.1.254: icmp_seq=4 ttl=64 time=1.47 ms +``` + +在这种情况下,如果你在 PeerA 端口 60001 上捕获 UDP 通信,则将看到依赖 WireGuard 协议的通信过程和加密的数据: + +![捕获依赖 WireGuard 协议的节点间 UDP 流量][5] + +## 总结 + +虚拟私有网络很常见。在用于部署虚拟私有网络的各种协议和工具中,WireGuard 是一种简单、轻巧和安全的选择。它可以在对等节点之间基于 CryptoKey 路由建立安全的点对点连接,过程非常简单。此外,NetworkManager 支持 WireGuard 接口,允许重启后进行持久配置。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/configure-wireguard-vpns-with-networkmanager/ + +作者:[Maurizio Garcia][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/malgnuz/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/05/wireguard-nm-816x345.jpg +[2]: https://youtu.be/0eiXMGfZc60?t=633 +[3]: https://www.youtube.com/c/HighTreason610/featured +[4]: https://www.wireguard.com/ +[5]: https://fedoramagazine.org/wp-content/uploads/2021/04/capture-1024x601.png diff --git a/published/202105/20210504 5 ways the Star Wars universe embraces open source.md b/published/202105/20210504 5 ways the Star Wars universe embraces open source.md new file mode 100644 index 0000000000..100fff6490 --- /dev/null +++ b/published/202105/20210504 5 ways the Star Wars universe embraces open source.md @@ -0,0 +1,102 @@ +[#]: subject: (5 ways the Star Wars universe embraces open source) +[#]: via: (https://opensource.com/article/21/5/open-source-star-wars) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13367-1.html) + +《星球大战》的世界拥抱开源的 5 种方式 +====== + +> 与《星球大战》一起成长的过程中,我学到了很多关于开源的知识。 + +![](https://img.linux.net.cn/data/attachment/album/202105/07/160338h1l01l8077wwd1j1.jpg) + +让我们先说清楚一件事:在现实生活中,《星球大战Star Wars》特许经营权没有任何开放性(尽管其所有者确实发布了 [一些开源代码][2])。《星球大战》是一个严格控制的资产,没有任何东西是在自由文化许可证下出版的。抛开任何关于 [文化形象应该成为伴随它们成长的人们的财产][3] 的争论,本文邀请你走进《星球大战》的世界,想象你是很久以前的一个电脑用户,在一个遥远的星系里…… + +### 机器人 + +> “但我还要去托西站Tosche Station弄些电力转换器呢。” +> —— 卢克•天行者 + +在乔治•卢卡斯George Lucas拍摄他的第一部《星球大战》电影之前,他导演了一部名为《美国涂鸦American Graffiti》的电影,这是一部以上世纪 60 年代为背景的成长电影。这部电影的部分背景是改装车hot-rod和街头赛车文化,一群机械修理工在车库里花了好几个小时,无休止地改装他们的汽车。今天仍然可以这样做,但大多数汽车爱好者会告诉你,“经典”汽车改装起来容易得多,因为它们主要使用机械部件而不是技术部件,而且它们以一种可预测的方式使用普通部件。 + +我一直把卢克和他的朋友们看作是对同样怀旧的科幻小说诠释。当然,花哨的新战斗堡垒是高科技,可以摧毁整个星球,但当 [防爆门不能正确打开][4] 或监禁层的垃圾压实机开始压扁人时,你会怎么做?如果你没有一个备用的 R2 机器人与主机对接,你就没辙了。卢克对修理和维护“机器人”的热情以及他在修理蒸发器和 X 翼飞机方面的天赋从第一部电影中就可以看出。 + +看到塔图因星球对待技术的态度,我不禁相信,大多数常用设备都是大众的技术。卢克并没有为 C-3PO 或 R2-D2 签订最终用户许可协议。当他让 C-3PO 在热油浴中放松时,或者当楚巴卡在兰多的云城重新组装他时,并没有使他的保修失效。同样,汉•索罗和楚巴卡从来没有把千年隼带到经销商那里去购买经批准的零件。 + +我无法证明这都是开源技术。鉴于电影中大量的终端用户维修和定制,我相信在星战世界中,技术是开放的,[用户是有拥有和维修的常识的][5]。 + +### 加密和隐写术 + +> “帮助我,欧比旺•克诺比。你是我唯一的希望。” +> —— 莱亚公主 + +诚然,《星球大战》世界中的数字身份认证很难理解,但如果有一点是明确的,加密和隐写术对叛军的成功至关重要。而当你身处叛军时,你就不能依靠公司的标准,怀疑它们是由你正在斗争的邪恶帝国批准的。当 R2-D2 隐瞒莱娅公主绝望的求救时,它的记忆库中没有任何后门,而叛军在潜入敌方领土时努力获得认证凭证(这是一个旧的口令,但它通过检查了)。 + +加密不仅仅是一个技术问题。它是一种通信形式,在历史上有这样的例子。当政府试图取缔加密时,就是在努力取缔社区。我想这也是“叛乱”本应抵制的一部分。 + +### 光剑 + +> “我看到你已经打造了新的光剑,你的技能现在已经完成了。” +> —— 达斯•维德 + +在《帝国反击战》中,天行者卢克失去了他标志性的蓝色光剑,同时他的手也被邪恶霸主达斯•维德砍断。在下一部电影《绝地归来》中,卢克展示了他自己打造的绿色光剑 —— 每一个粉丝都为之着迷。 + +虽然没有明确说明绝地武士的激光剑的技术规格是开源的,但有一定的暗指。例如,没有迹象表明卢克在制造他的武器之前必须从拥有版权的公司获得设计许可。他没有与一家高科技工厂签订合同来生产他的剑。 + +他自己打造了它,作为一种成年仪式。也许制造如此强大的武器的方法是绝地武士团所守护的秘密;再者,也许这只是描述开源的另一种方式。我所知道的所有编码知识都是从值得信赖的导师、某些互联网 UP 主、精心撰写的博客文章和技术讲座中学到的。 + +严密保护的秘密?还是对任何寻求知识的人开放的信息? + +根据我在原三部曲中看到的绝地武士秩序,我选择相信后者。 + +### 伊沃克文化 + +> “Yub nub!” +> —— 伊沃克人 + +恩多的伊沃克人与帝国其他地区的文化形成了鲜明的对比。他们热衷于集体生活、分享饮食和故事到深夜。他们自己制作武器、陷阱和安全防火墙,还有他们自己的树顶村庄。作为象征意义上的弱者,他们不可能摆脱帝国的占领。他们通过咨询礼仪机器人做了研究,汇集了他们的资源,并在关键时刻发挥了作用。当陌生人进入他们的家时,他们并没有拒绝他们。相反,他们帮助他们(在确定他们毕竟不是食物之后)。当他们面对令人恐惧的技术时,他们就参与其中并从中学习。 + +伊沃克人是《星球大战》世界中开放文化和开源的庆典。他们是我们应该努力的社区:分享信息、分享知识、接受陌生人和进步的技术,以及维护捍卫正义的决心。 + +### 原力 + +> “原力将与你同在,永远。” +> —— 欧比旺•克诺比 + +在最初的电影中,甚至在新生的衍生宇宙中(最初的衍生宇宙小说,也是我个人的最爱,是《心灵之眼的碎片》,其中卢克从一个叫哈拉的女人那里学到了更多关于原力的知识),原力只是:一种任何人都可以学习使用的力量。它不是一种与生俱来的天赋,而是一门需要掌握的强大学科。 + +![衍生宇宙的最开始][6] + +相比之下,邪恶的西斯人对他们的知识是保护性的,只邀请少数人加入他们的行列。他们可能认为自己有一个群体,但这正是看似随意的排他性的模式。 + +我不知道对开源和开放文化还有什么更好的比喻。永远存在被认为是排他的危险,因为爱好者似乎总是在“人群中”。但现实是,每个人都可以加入这些邀请,而且任何人都可以回到源头(字面意思是源代码或资产)。 + +### 愿源与你同在 + +作为一个社区,我们的任务是要问,我们如何能让人明白,无论我们拥有什么知识,都不是为了成为特权信息,而是一种任何人都可以学习使用的力量,以改善他们的世界。 + +套用欧比旺•克诺比的不朽名言:“使用源”。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/open-source-star-wars + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tobias-cornille-light-sabres-unsplash.jpg?itok=rYwXA2CX (Man with lasers in night sky) +[2]: https://disney.github.io/ +[3]: https://opensource.com/article/18/1/creative-commons-real-world +[4]: https://www.hollywoodreporter.com/heat-vision/star-wars-40th-anniversary-head-banging-stormtrooper-explains-classic-blunder-1003769 +[5]: https://www.eff.org/issues/right-to-repair +[6]: https://opensource.com/sites/default/files/20210501_100930.jpg (The very beginning of the expanded universe) diff --git a/published/202105/20210504 Keep multiple Linux distros on a USB with this open source tool.md b/published/202105/20210504 Keep multiple Linux distros on a USB with this open source tool.md new file mode 100644 index 0000000000..dc17b8fd95 --- /dev/null +++ b/published/202105/20210504 Keep multiple Linux distros on a USB with this open source tool.md @@ -0,0 +1,92 @@ +[#]: subject: (Keep multiple Linux distros on a USB with this open source tool) +[#]: via: (https://opensource.com/article/21/5/linux-ventoy) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13361-1.html) + +神器:在一个 U 盘上放入多个 Linux 发行版 +====== + +> 用 Ventoy 创建多启动 U 盘,你将永远不会缺少自己喜欢的 Linux 发行版。 + +![](https://img.linux.net.cn/data/attachment/album/202105/05/131432p5q7hh5cm7a8ffsd.jpg) + +给朋友和邻居一个可启动 U 盘,里面包含你最喜欢的 Linux 发行版,是向 Linux 新手介绍我们都喜欢的 Linux 体验的好方法。仍然有许多人从未听说过 Linux,把你喜欢的发行版放在一个可启动的 U 盘上是让他们进入 Linux 世界的好办法。 + +几年前,我在给一群中学生教授计算机入门课。我们使用旧笔记本电脑,我向学生们介绍了 Fedora、Ubuntu 和 Pop!_OS。下课后,我给每个学生一份他们喜欢的发行版的副本,让他们带回家安装在自己选择的电脑上。他们渴望在家里尝试他们的新技能。 + +### 把多个发行版放在一个驱动器上 + +最近,一个朋友向我介绍了 Ventoy,它(根据其 [GitHub 仓库][2])是 “一个开源工具,可以为 ISO/WIM/IMG/VHD(x)/EFI 文件创建可启动的 USB 驱动器”。与其为每个我想分享的 Linux 发行版创建单独的驱动器,我可以在一个 U 盘上放入我喜欢的 _所有_ Linux 发行版! + +![USB 空间][3] + +正如你所能想到的那样,U 盘的大小决定了你能在上面容纳多少个发行版。在一个 16GB 的 U 盘上,我放置了 Elementary 5.1、Linux Mint Cinnamon 5.1 和 Linux Mint XFCE 5.1......但仍然有 9.9GB 的空间。 + +### 获取 Ventoy + +Ventoy 是开源的,采用 [GPLv3][5] 许可证,可用于 Windows 和 Linux。有很好的文档介绍了如何在 Windows 上下载和安装 Ventoy。Linux 的安装是通过命令行进行的,所以如果你不熟悉这个过程,可能会有点混乱。然而,其实很容易。 + +首先,[下载 Ventoy][6]。我把存档文件下载到我的桌面上。 + +接下来,使用 `tar` 命令解压 `ventoy-x.y.z-linux.tar.gz` 档案(但要用你下载的版本号替换 `x.y.z`)(为了保持简单,我在命令中使用 `*` 字符作为任意通配符): + +``` +$ tar -xvf ventoy*z +``` + +这个命令将所有必要的文件提取到我桌面上一个名为 `ventoy-x.y.z` 的文件夹中。 + +你也可以使用你的 Linux 发行版的存档管理器来完成同样的任务。下载和提取完成后,你就可以把 Ventoy 安装到你的 U 盘上了。 + +### 在 U 盘上安装 Ventoy 和 Linux + +把你的 U 盘插入你的电脑。改变目录进入 Ventoy 的文件夹,并寻找一个名为 `Ventoy2Disk.sh` 的 shell 脚本。你需要确定你的 U 盘的正确挂载点,以便这个脚本能够正常工作。你可以通过在命令行上发出 `mount` 命令或者使用 [GNOME 磁盘][7] 来找到它,后者提供了一个图形界面。后者显示我的 U 盘被挂载在 `/dev/sda`。在你的电脑上,这个位置可能是 `/dev/sdb` 或 `/dev/sdc` 或类似的位置。 + +![GNOME 磁盘中的 USB 挂载点][8] + +下一步是执行 Ventoy shell 脚本。因为它被设计成不加选择地复制数据到一个驱动器上,我使用了一个假的位置(`/dev/sdX`)来防止你复制/粘贴错误,所以用你想覆盖的实际驱动器的字母替换后面的 `X`。 + +**让我重申**:这个 shell 脚本的目的是把数据复制到一个驱动器上, _破坏该驱动器上的所有数据。_ 如果该驱动器上有你关心的数据,在尝试这个方法之前,先把它备份! 如果你不确定你的驱动器的位置,在你继续进行之前,请验证它,直到你完全确定为止。 + +一旦你确定了你的驱动器的位置,就运行这个脚本: + +``` +$ sudo sh Ventoy2Disk.sh -i /dev/sdX +``` + +这样就可以格式化它并将 Ventoy 安装到你的 U 盘上。现在你可以复制和粘贴所有适合放在 U 盘上的 Linux 发行版文件。如果你在电脑上用新创建的 U 盘引导,你会看到一个菜单,上面有你复制到 U 盘上的发行版。 + +![Ventoy 中的 Linux 发行版][9] + +### 构建一个便携式的动力源 + +Ventoy 是你在钥匙串上携带多启动 U 盘的关键(钥匙),这样你就永远不会缺少你所依赖的发行版。你可以拥有一个全功能的桌面、一个轻量级的发行版、一个纯控制台的维护工具,以及其他你想要的东西。 + +我从来没有在没有 Linux 发行版的情况下离开家,你也不应该。拿上 Ventoy、一个 U 盘,和一串 ISO。你不会后悔的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/linux-ventoy + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/markus-winkler-usb-unsplash.jpg?itok=5ZXDp0V4 (USB drive) +[2]: https://github.com/ventoy/Ventoy +[3]: https://opensource.com/sites/default/files/uploads/ventoy1.png (USB space) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://www.ventoy.net/en/doc_license.html +[6]: https://github.com/ventoy/Ventoy/releases +[7]: https://wiki.gnome.org/Apps/Disks +[8]: https://opensource.com/sites/default/files/uploads/usb-mountpoint.png (USB mount point in GNOME Disks) +[9]: https://opensource.com/sites/default/files/uploads/ventoy_distros.jpg (Linux distros in Ventoy) diff --git a/published/202105/20210505 Drop telnet for OpenSSL.md b/published/202105/20210505 Drop telnet for OpenSSL.md new file mode 100644 index 0000000000..5258c011e0 --- /dev/null +++ b/published/202105/20210505 Drop telnet for OpenSSL.md @@ -0,0 +1,187 @@ +[#]: subject: (Drop telnet for OpenSSL) +[#]: via: (https://opensource.com/article/21/5/drop-telnet-openssl) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13381-1.html) + +用 OpenSSL 替代 telnet +====== + +> Telnet 缺乏加密,这使得 OpenSSL 成为连接远程系统的更安全的选择。 + +![](https://img.linux.net.cn/data/attachment/album/202105/11/115934cggzmq8rm8suaqlq.png) + +[telnet][2] 命令是最受欢迎的网络故障排除工具之一,从系统管理员到网络爱好者都可以使用。在网络计算的早期,`telnet` 被用来连接到一个远程系统。你可以用 `telnet` 访问一个远程系统的端口,登录并在该主机上运行命令。 + +由于 `telnet` 缺乏加密功能,它在很大程度上已经被 OpenSSL 取代了这项工作。然而,作为一种智能的 `ping`,`telnet` 的作用仍然存在(甚至在某些情况下至今仍然存在)。虽然 `ping` 命令是一个探测主机响应的好方法,但这是它能做的 _全部_。另一方面,`telnet` 不仅可以确认一个活动端口,而且还可以与该端口的服务进行交互。即便如此,由于大多数现代网络服务都是加密的,`telnet` 的作用可能要小得多,这取决于你想实现什么。 + +### OpenSSL s_client + +对于大多数曾经需要 `telnet` 的任务,我现在使用 OpenSSL 的 `s_client` 命令。(我在一些任务中使用 [curl][3],但那些情况下我可能无论如何也不会使用 `telnet`)。大多数人都知道 [OpenSSL][4] 是一个加密的库和框架,但不是所有人都意识到它也是一个命令。`openssl` 命令的 `s_client` 组件实现了一个通用的 SSL 或 TLS 客户端,帮助你使用 SSL 或 TLS 连接到远程主机。它是用来测试的,至少在内部使用与该库相同的功能。 + +### 安装 OpenSSL + +OpenSSL 可能已经安装在你的 Linux 系统上了。如果没有,你可以用你的发行版的软件包管理器安装它: + +``` +$ sudo dnf install openssl +``` + +在 Debian 或类似的系统上: + +``` +$ sudo apt install openssl +``` + +安装后,验证它的响应是否符合预期: + +``` +$ openssl version +OpenSSL x.y.z FIPS +``` + +### 验证端口访问 + +最基本的 `telnet` 用法是一个看起来像这样的任务: + +``` +$ telnet mail.example.com 25 +Trying 98.76.54.32... +Connected to example.com. +Escape character is '^]'. +``` + +在此示例中,这将与正在端口 25(可能是邮件服务器)监听的任意服务打开一个交互式会话。只要你获得访问权限,就可以与该服务进行通信。 + +如果端口 25 无法访问,连接就会被拒绝。 + +OpenSSL 也是类似的,尽管通常较少互动。要验证对一个端口的访问: + +``` +$ openssl s_client -connect example.com:80 +CONNECTED(00000003) +140306897352512:error:1408F10B:SSL [...] + +no peer certificate available + +No client certificate CA names sent + +SSL handshake has read 5 bytes and written 309 bytes +Verification: OK + +New, (NONE), Cipher is (NONE) +Secure Renegotiation IS NOT supported +Compression: NONE +Expansion: NONE +No ALPN negotiated +Early data was not sent +Verify return code: 0 (ok) +``` + +但是,这仅是目标性 `ping`。从输出中可以看出,没有交换 SSL 证书,所以连接立即终止。为了充分利用 `openssl s_client`,你必须连接加密的端口。 + +### 交互式 OpenSSL + +Web 浏览器和 Web 服务器进行交互,可以使指向 80 端口的流量实际上被转发到 443,这是保留给加密 HTTP 流量的端口。知道了这一点,你就可以用 `openssl` 命令连接到加密的端口,并与在其上运行的任何网络服务进行交互。 + +首先,使用 SSL 连接到一个端口。使用 `-showcerts` 选项会使 SSL 证书打印到你的终端上,一开始的输出要比 telnet 要冗长得多: + +``` +$ openssl s_client -connect example.com:443 -showcerts +[...] +    0080 - 52 cd bd 95 3d 8a 1e 2d-3f 84 a0 e3 7a c0 8d 87   R...=..-?...z... +    0090 - 62 d0 ae d5 95 8d 82 11-01 bc 97 97 cd 8a 30 c1   b.............0. +    00a0 - 54 78 5c ad 62 5b 77 b9-a6 35 97 67 65 f5 9b 22   Tx\\.b[w..5.ge.." +    00b0 - 18 8a 6a 94 a4 d9 7e 2f-f5 33 e8 8a b7 82 bd 94   ..j...~/.3...... + +    Start Time: 1619661100 +    Timeout   : 7200 (sec) +    Verify return code: 0 (ok) +    Extended master secret: no +    Max Early Data: 0 +- +read R BLOCK +``` + +你被留在一个交互式会话中。最终,这个会话将关闭,但如果你及时行动,你可以向服务器发送 HTTP 信号: + +``` +[...] +GET / HTTP/1.1 +HOST: example.com +``` + +按**回车键**两次,你会收到 `example.com/index.html` 的数据: + +``` +[...] + +
        +

        Example Domain

        +

        This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

        +

        More information...

        +
        + + +``` + +#### Email 服务器 + +你也可以使用 OpenSSL 的 `s_client` 来测试一个加密的 Email 服务器。要做到这点,你必须把你的测试用户的用户名和密码用 Base64 编码。 + +这里有一个简单的方法来做到: + +``` +$ perl -MMIME::Base64 -e 'print encode_base64("username");' +$ perl -MMIME::Base64 -e 'print encode_base64("password");' +``` + +当你记录了这些值,你就可以通过 SSL 连接到邮件服务器,它通常在 587 端口: + +``` +$ openssl s_client -starttls smtp \ +-connect email.example.com:587 +> ehlo example.com +> auth login +##paste your user base64 string here## +##paste your password base64 string here## + +> mail from: noreply@example.com +> rcpt to: admin@example.com +> data +> Subject: Test 001 +This is a test email. +. +> quit +``` + +检查你的邮件(在这个示例代码中,是 `admin@example.com`),查看来自 `noreply@example.com` 的测试邮件。 + +### OpenSSL 还是 Telnet? + +`telnet` 仍然有用途,但它已经不是以前那种不可缺少的工具了。该命令在许多发行版上被归入 “遗留” 网络软件包,而且还没有 `telnet-ng` 之类的明显的继任者,管理员有时会对它被排除在默认安装之外感到疑惑。答案是,它不再是必不可少的,它的作用越来越小,这 _很好_。网络安全很重要,所以要适应与加密接口互动的工具,这样你就不必在排除故障时禁用你的保护措施。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/drop-telnet-openssl + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-password.jpg?itok=KJMdkKum (Lock) +[2]: https://www.redhat.com/sysadmin/telnet-netcat-troubleshooting +[3]: https://opensource.com/downloads/curl-command-cheat-sheet +[4]: https://www.openssl.org/ +[5]: https://www.iana.org/domains/example"\>More +[6]: mailto:noreply@example.com +[7]: mailto:admin@example.com diff --git a/published/202105/20210506 Learn essential Kubernetes commands with a new cheat sheet.md b/published/202105/20210506 Learn essential Kubernetes commands with a new cheat sheet.md new file mode 100644 index 0000000000..f7a6a9f8a9 --- /dev/null +++ b/published/202105/20210506 Learn essential Kubernetes commands with a new cheat sheet.md @@ -0,0 +1,131 @@ +[#]: subject: (Learn essential Kubernetes commands with a new cheat sheet) +[#]: via: (https://opensource.com/article/21/5/kubernetes-cheat-sheet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13390-1.html) + +速查表:学习 Kubernetes 的基本命令 +====== + +> 开始探索 kubectl、容器、吊舱等,接着下载我们的免费的速查表,这样你就可以随时掌握关键的命令了。 + +![](https://img.linux.net.cn/data/attachment/album/202105/14/144523ynjr88nm4oaa7nzn.jpg) + +云计算主要是在 Kubernetes 上运行,Kubernetes 主要是在 Linux 上运行,而 Linux 在有熟练的系统管理员控制时运行得最好。无论你认为自己是云计算架构师还是只是一个保守的系统管理员,现代互联网都需要了解如何在容器中创建应用和服务,按需扩展,按需扩展以及如何明智地进行监视和管理。 + +进入勇敢的容器世界的第一步是学习 Kubernetes 和它的基本命令:`kubectl`。 + +### 安装 kubectl + +`kubectl` 命令允许你在 Kubernetes 集群上运行命令。你使用 `kubectl` 来部署应用、查看日志、检查和管理集群资源,并在出现问题时进行故障排除。`kubectl`(以及整个 Kubernetes)的典型“问题”是,要对集群运行命令,你首先需要一个集群。然而,有一些简单的解决方案。 + +首先,你可以创建自己的 Kubernetes 集群,只需买三块树莓派板和相关外围设备(主要是电源)。当你获得了硬件,阅读 Chris Collins 的 [使用树莓派构建 Kubernetes 集群][2],你就会拥有自己的安装有 `kubectl` 的集群。 + +另一种获得集群的方法是使用 [Minikube][3],这是一个 Kubernetes 的实践环境。在所有建立和运行集群的方法中,这是最简单的。 + +还有更多的选择;例如,你可以参加一个关于 Kubernetes 的课程,以获得一个运行集群的实验室,或者你可以在云上购买时间。只要你有一个 Kubernetes 环境来练习,如何获得集群并不重要。 + +当你你能访问一个集群,你就可以开始探索 `kubectl` 命令。 + +### 了解吊舱和容器 + +容器是一个轻量级的、部分的 Linux 系统,专门用于运行一个应用或服务。容器受到 [内核命名空间][4] 的限制,这使它能够访问其主机(运行容器的计算机)上的重要系统组件,同时防止它向其主机发送数据。容器以容器镜像(或简称 _镜像_)的形式保存,并由称为 `Containerfile` 或 `Dockerfile` 的文本文件定义。 + +吊舱Pod是容器的正式集合,也是管理员扩展、监控和维护任何数量的容器的一种简单方法。 + +这些一起就像 Kubernetes 的“应用程序”。创建或获取容器镜像是你在云上运行服务的方式。 + +### 运行一个吊舱 + +容器镜像的两个可靠的仓库是 Docker Hub 和 Quay。你可以在仓库中搜索可用的镜像列表。通常有由项目提供的大型项目的官方镜像,也有专门的、定制的或特殊项目的社区镜像。最简单和最小的镜像之一是 [BusyBox][5] 容器,它提供了一个最小的 shell 环境和一些常用命令。 + +无论你是从仓库中拉取镜像,还是自己编写镜像定义并从 Git 仓库中拉取到集群中,其工作流程都是一样的。当你想在 Kubernetes 中启动一个吊舱时: + + 1. 在 [Docker Hub][6] 或 [Quay][7] 上找到一个你想使用的镜像 + 2. 拉取镜像 + 3. 创建一个吊舱 + 4. 部署吊舱 + +以 BusyBox 容器为例子,你可以用一条命令完成最后三个步骤: + +``` +$ kubectl create deployment my-busybox --image=busybox +``` + +等待 `kubectl` 完成这个过程,最后你就有了一个正在运行的 BusyBox 实例。这个吊舱并没有暴露给其他人。它只是在后台安静地在你的集群上运行。 + +要看你的集群上有哪些吊舱在运行: + +``` +$ kubectl get pods --all-namespaces +``` + +你也可以获得关于吊舱部署的信息: + +``` +$ kubectl describe deployment my-busybox +``` + +### 与吊舱互动 + +容器通常包含使其自动化的配置文件。例如,将 Nginx httpd 服务器作为容器安装,应该不需要你的互动。你开始运行容器,它就会工作。对于你添加到吊舱中的第一个容器和之后的每个容器都是如此。 + +Kubernetes 模型的优点之一是,你可以根据需要扩展你的服务。如果你的网络服务被意外的流量淹没,你可以在你的云中启动一个相同的容器(使用 `scale` 或 `autoscale` 子命令),使你的服务处理传入请求的能力增加一倍。 + +即便如此,有时还是很高兴看到一些证明吊舱正在按预期运行的证据,或者能够对似乎无法正常运行的某些问题进行故障排除。为此,你可以在一个容器中运行任意的命令: + +``` +$ kubectl exec my-busybox -- echo "hello cloud" +``` + +另外,你可以在你的容器中打开一个 shell,用管道将你的标准输入输入到其中,并将其输出到终端的标准输出: + +``` +$ kubectl exec --stdin --tty my-busybox -- /bin/sh +``` + +### 暴露服务 + +默认情况下,吊舱在创建时不会暴露给外界,这样你就有时间在上线前进行测试和验证。假设你想把 Nginx Web 服务器作为一个吊舱安装和部署在你的集群上,并使其可以访问。与任何服务一样,你必须将你的吊舱指向服务器上的一个端口。`kubectl` 子命令 `expose` 可以为你做到这点: + +``` +$ kubectl create deployment \ + my-nginx --image=nginx +$ kubectl expose deployment \ + my-nginx --type=LoadBalancer --port=8080 +``` + +只要你的集群可以从互联网上访问,你就可以通过打开浏览器并导航到你的公共 IP 地址来测试你的新 Web 服务器的可访问性。 + +### 不仅仅是吊舱 + +Kubernetes 提供了很多东西,而不仅仅是存储普通服务的镜像。除了作为一个 [容器编排][8] 系统,它还是一个云开发的平台。你可以编写和部署应用,管理和监控性能和流量,实施智能负载平衡策略等。 + +Kubernetes 是一个强大的系统,它已经迅速成为各种云的基础,最主要的是 [开放混合云][9]。今天就开始学习 Kubernetes 吧。随着你对 Kubernetes 的进一步了解,你会需要一些关于其主要概念和一般语法的快速提醒,所以 [下载我们的 Kubernetes 速查表][10] 并将它放在身边。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/kubernetes-cheat-sheet + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image) +[2]: https://opensource.com/article/20/6/kubernetes-raspberry-pi +[3]: https://opensource.com/article/18/10/getting-started-minikube +[4]: https://opensource.com/article/19/10/namespaces-and-containers-linux +[5]: https://www.busybox.net/ +[6]: http://hub.docker.com +[7]: http://quay.io +[8]: https://opensource.com/article/20/11/orchestration-vs-automation +[9]: https://opensource.com/article/20/10/keep-cloud-open +[10]: https://opensource.com/downloads/kubernetes-cheat-sheet diff --git a/published/202105/20210510 Make Jenkins logs pretty.md b/published/202105/20210510 Make Jenkins logs pretty.md new file mode 100644 index 0000000000..82859c31e2 --- /dev/null +++ b/published/202105/20210510 Make Jenkins logs pretty.md @@ -0,0 +1,176 @@ +[#]: subject: (Make Jenkins logs pretty) +[#]: via: (https://opensource.com/article/21/5/jenkins-logs) +[#]: author: (Evan "Hippy" Slatis https://opensource.com/users/hippyod) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13392-1.html) + +如何使 Jenkins 日志更可读 +====== + +> Jenkins 的默认日志难以阅读,但日志本不必如此。 + +![](https://img.linux.net.cn/data/attachment/album/202105/15/093017vd34foo00wpy2yot.jpg) + +Jenkins 是一个自由开源的自动化服务器,用于构建、测试和部署代码。它是持续集成Continuous Integration(CI)、持续交付Continuous Delivery(CD)的基础,可以为开发人员每天节约几小时,并保护他们免受失败的代码上线的影响。一旦代码失效或开发人员需要查看测试输出时,[Jenkins][2] 提供了日志文件以供检查。 + +默认的 Jenkins 管道Pipeline日志可能难以阅读。这篇关于 Jenkins 日志的基础知识的总结文章提供了一些技巧(和代码),说明了如何提升它们的可读性。 + +### 你获得什么 + +Jenkins 管道分为 [几个阶段][3]。Jenkins 自动记录每个阶段的开始,记录内容如下: + +``` +[Pipeline] // stage +[Pipeline] stage (hide) +[Pipeline] { (Apply all openshift resources) +[Pipeline] dir +``` + +上文显示的内容没有太大区分度,重要的内容(如阶段的开始)未突出显示。在多达数百行的管道日志中,要找到一个阶段的起始和另外一个阶段的终止位置可能会很艰巨。当随意浏览日志寻找一个特定的阶段的时候,这种艰巨尤其明显。 + +Jenkins 管道是由 [Groovy][4] 和 Shell 脚本混合编写的。在 Groovy 代码中,日志记录很少。很多时候,日志是由命令中的不起眼的文本组成,没有详细信息。在 Shell 脚本中,打开了调试模式(`set -x`),所以每条命令都会被完全具现化realized(变量被解除引用并打印出数值)并详细记录,输出也是如此。 + +鉴于日志可能有很多内容,通读日志获取相关信息可能很繁琐。由于在管道中被处理,并跟着一个 Shell 脚本的 Groovy 日志可读性差,它们很多时候缺少上下文: + +``` +[Pipeline] dir +Running in /home/jenkins/agent/workspace/devop-master/devops-server-pipeline/my-repo-dir/src +[Pipeline] { (hide) +[Pipeline] findFiles +[Pipeline] findFiles +[Pipeline] readYaml +[Pipeline] } +``` + +我可以知道我正在使用的目录,并且知道我正在使用 Jenkins 的步骤搜索文件、读取 YAML 文件。但是我在寻找什么?我找到并读取的内容是什么? + +### 能做什么? + +我很高兴你这么问,因为这里有一些简单的做法和一些小的代码片段可以提供帮助。首先,代码如下: + +``` +def echoBanner(def ... msgs) { + echo createBanner(msgs) +} + +def errorBanner(def ... msgs) { + error(createBanner(msgs)) +} + +def createBanner(def ... msgs) { + return """ + =========================================== + + ${msgFlatten(null, msgs).join("\n ")} + + =========================================== + """ +} + +// flatten function hack included in case Jenkins security +// is set to preclude calling Groovy flatten() static method +// NOTE: works well on all nested collections except a Map +def msgFlatten(def list, def msgs) { + list = list ?: [] + if (!(msgs instanceof String) && !(msgs instanceof GString)) { + msgs.each { msg -> + list = msgFlatten(list, msg) + } + } + else { + list += msgs + } + + return list +} +``` + +将这段代码添加到每个管道的末尾,也可以 [加载一个 Groovy 文件][5] 或者使其成为 [Jenkins 共享库][6] 的一部分,这样更有效。 + +在每个阶段起始处(或者在阶段中的特定位置),只需调用 `echoBanner`: + +``` +echoBanner("MY STAGE", ["DOING SOMETHING 1", "DOING SOMETHING 2"]) +``` + +你的 Jenkins 日志会展示如下: + +``` +    =========================================== + +    MY STAGE +    DOING SOMETHING 1 +    DOING SOMETHING 2 + +    =========================================== +``` + +这个横幅很容易从日志中分辨出来。当正确使用它们时,它们还有助于界定管道流,并且可以很好的将日志分解开来进行阅读。 + +我已经在某些地方专业地使用这些代码一些时间了。在帮助管道日志更易读和流程更易理解方面,反馈是非常积极的。 + +上述的 `errorBanner` 方法以相同的方式工作,但是它会立即使脚本失效。这有助于突显失败的位置与原因。 + +### 最佳实践 + + 1. 在你的 Groovy 代码中大量使用 `echo` Jenkins 步骤来通知用户你在做什么。这些也可以帮助记录你的代码。 + 2. 使用空的日志语句(Groovy 中空的 echo 步骤、`echo ''` 或 Shell 中的 `echo`)来分割输出,提高可读性。你可能在你的代码中为同样的目的使用空行。 + 3. 避免在脚本中使用 `set +x` 的陷阱,因为它隐藏了日志记录已执行的 Shell 语句。它并没有清理你的日志,而是使你的管道成为一个黑盒子,隐藏了管道正在做的行为以及出现的任何错误。确保管道功能尽可能透明。 + 4. 如果你的管道创建了中间工件Intermediate Artifacts,开发人员和 DevOps 人员可以使用这些工件来帮助调试问题,那么也要记录它的内容。是的,它会加长日志,但这只是文本。在某些时候,这会是有用的信息,而(利用得当的)日志不就是关于发生了什么和为什么发生的大量信息吗? + +### Kubernetes 机密信息:无法完全透明的地方 + +有些事情你不希望出现在日志里暴露出来。如果你在使用 Kubernetes 并引用保存在 Kubernetes 机密信息Secrets中的数据,那么你绝对不希望在日志中公开该数据,因为这些数据只是被混淆了,而没有被加密。 + +假如你想获取一些保存在机密信息中的数据,然后将其注入模板化 JSON 文件中。(机密信息和 JSON 模板的完整内容与此例无关。)按照最佳实践,你希望保持透明并记录你的操作,但你不想公开机密信息数据。 + +将脚本模式从调试(`set -x`)更改为命令记录(`set -v`)。在脚本敏感部分的结尾,将 Shell 重置为调试模式: + +``` +sh """ +   # change script mode from debugging to command logging +   set +x -v + +   # capture data from secret in shell variable +   MY_SECRET=\$(kubectl get secret my-secret --no-headers -o 'custom-column=:.data.my-secret-data') + +   # replace template placeholder inline +   sed s/%TEMPLATE_PARAM%/${MY_SECRET_DATA}/ my-template-file.json + +   # do something with modified template-file.json... + +   # reset the shell to debugging mode +   set -x +v +""" +``` + +这将输出此行到日志: + +``` +sed s/%TEMPLATE_PARAM%/${MY_SECRET_DATA}/ my-template-file.json +``` + +与 Shell 调试模式中不同,这不会具现化 Shell 变量 `MY_SECRET_DATA`。显然,如果管道中在这一点出现问题,而你试图找出问题出在哪里,那么这不如调试模式有用。但这是在保持管道执行对开发人员和 DevOps 透明的同时,也保持你的秘密的最佳平衡。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/jenkins-logs + +作者:[Evan "Hippy" Slatis][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hippyod +[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]: https://www.jenkins.io/ +[3]: https://www.jenkins.io/doc/book/pipeline/syntax/#stage +[4]: https://opensource.com/article/20/12/groovy +[5]: https://www.jenkins.io/doc/pipeline/steps/workflow-cps/#load-evaluate-a-groovy-source-file-into-the-pipeline-script +[6]: https://www.jenkins.io/doc/book/pipeline/shared-libraries/ diff --git a/published/202105/20210511 SonoBus- An Open Source Peer-to-Peer Audio Streaming App with Cross-Platform Support.md b/published/202105/20210511 SonoBus- An Open Source Peer-to-Peer Audio Streaming App with Cross-Platform Support.md new file mode 100644 index 0000000000..7616cb6433 --- /dev/null +++ b/published/202105/20210511 SonoBus- An Open Source Peer-to-Peer Audio Streaming App with Cross-Platform Support.md @@ -0,0 +1,104 @@ +[#]: subject: (SonoBus: An Open Source Peer-to-Peer Audio Streaming App with Cross-Platform Support) +[#]: via: (https://itsfoss.com/sonobus/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13405-1.html) + +SonoBus:支持跨平台的开源点对点音频流应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/19/122610n5qgu4443jf4nf4k.jpg) + +> 一个有趣的开源点对点音频流应用,它提供了一个简单的用户界面和强大的功能。 + +### SonoBus: 跨平台音频流应用 + +如今,音频流服务在听音乐时非常受欢迎。然而,本地音乐集仍然是一种有用的方式,这不需要一直连接到互联网。 + +尽管流媒体音乐服务很方便,但你并不真正拥有这些音乐。因此,如果出现许可问题,该平台可能会删除你最喜欢的音乐,而你对此无能为力。 + +而有了本地音乐音乐集,你就不会遇到这个问题了。但是,你如何通过设备网络串流你本地的音乐,或者与一个小组分享? + +![][1] + +SonoBus 可以成为解决这个问题的办法。不仅仅限于音乐,还包括任何音频,如与一群朋友远程练习音乐或合作制作音乐,为什么不呢? + +让我们来看看它提供了什么。 + +### SonoBus 的功能 + +![][2] + +SonoBus 使用起来比较简单,但提供的功能可能会让人震惊。因此,在继续使用之前,你可能想先知道它能让你做什么: + + * 能够连接到多个用户 + * 创建一个有可选密码的小组 + * 分享来自你的麦克风的音频输入 + * 分享来自文件的音频流 + * 支持单声道/立体声 + * 组内播放 + * 录制所有人的音频 + * 能够使个别用户或所有人都静音 + * 可以通过互联网或本地网络连接 + * 支持节拍器,用于协作制作音乐或远程练习课程 + * 支持高质量的音频,最高可达 256Kbps + * 输入混音器 + * 支持声相 + * 支持有用的效果器(噪声门、压缩器和均衡器) + * 可在 JACK 和 ALSA 下工作 + * 跨平台支持(Windows、macOS、Android、iOS 和 Linux) + +虽然我试图提到所有的基本功能,但你可以在效果器的帮助下得到非常多的控制,来调整音量、质量、延迟,以及音频效果。 + +![][3] + +它最好的一点是**跨平台支持**,这使它成为任何用户群的有趣选择,而无论你出于什么原因要串流音频。 + +### 在 Linux 中安装 SonoBus + +无论你使用什么 Linux 发行版,你都可以轻松地安装 [Snap 包][4]或 [Flatpak 包][5]。如果你不想使用它们,你可以手动添加官方仓库来安装: + +``` +echo "deb http://pkg.sonobus.net/apt stable main" | sudo tee /etc/apt/sources.list.d/sonobus.list + +sudo wget -O /etc/apt/trusted.gpg.d/sonobus.gpg https://pkg.sonobus.net/apt/keyring.gpg + +sudo apt update && sudo apt install sonobus +``` + +你也可以通过其官方网站为你喜欢的平台下载它。 + +- [SonoBus][6] + +### 总结 + +SonoBus 是一个令人印象深刻的音频流应用,有很多潜在的用途,但它也有一些问题,可能不是每个人的完美解决方案。 + +例如,我注意到桌面应用占用大量的系统资源,所以这对较旧的系统来说可能是个问题。 + +另外,Play Store 上的安卓应用仍处于早期访问阶段(测试版)。在我的快速测试中,它工作符合预期,但我已经很久没有使用它了。因此,当依靠它进行跨平台会话时,可能会出现预期的小问题。 + +在任何情况下,它都适用于每种用例的大量功能。如果你还没有使用过,请试一试。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/sonobus/ + +作者:[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/2021/05/sonobus-screenshot.png?resize=800%2C605&ssl=1 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/sonus-screenshot-1.png?resize=800%2C619&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/sonobus-official.png?resize=800%2C545&ssl=1 +[4]: https://snapcraft.io/sonobus +[5]: https://flathub.org/apps/details/net.sonobus.SonoBus +[6]: https://sonobus.net/ diff --git a/published/202105/20210512 3 features that debuted in Python 3.0 you should use now.md b/published/202105/20210512 3 features that debuted in Python 3.0 you should use now.md new file mode 100644 index 0000000000..4134f0dbc3 --- /dev/null +++ b/published/202105/20210512 3 features that debuted in Python 3.0 you should use now.md @@ -0,0 +1,191 @@ +[#]: subject: (3 features that debuted in Python 3.0 you should use now) +[#]: via: (https://opensource.com/article/21/5/python-30-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13407-1.html) + +3 个值得使用的首次亮相在 Python 3.0 中的特性 +====== + +> 探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/20/103117me72dllr6lebk1fv.jpg) + +这是 Python 3.x 首发特性系列文章的第一篇。Python 3.0 于 2008 年首次发布,尽管它已经发布了一段时间,但它引入的许多特性都没有被充分利用,而且相当酷。这里有三个你应该知道的。 + +### 仅限关键字参数 + +Python 3.0 首次引入了**仅限关键字参数**参数的概念。在这之前,不可能指定一个只通过关键字传递某些参数的 API。这在有许多参数,其中一些参数可能是可选的函数中很有用。 + +请看一个特意设计的例子: + +``` +def show_arguments(base, extended=None, improved=None, augmented=None): + print("base is", base) + if extended is not None: + print("extended is", extended) + if improved is not None: + print("improved is", improved) + if augmented is not None: + print("augmented is", augmented) +``` + +当阅读调用该函数的代码时,有时很难理解发生了什么: + +``` +show_arguments("hello", "extra") + + base is hello + extended is extra + +show_arguments("hello", None, "extra") + + base is hello + improved is extra +``` + +虽然可以用关键字参数来调用这个函数,但这明显不是最好的方法。相反,你可以将这些参数标记为仅限关键字: + +``` +def show_arguments(base, *, extended=None, improved=None, augmented=None): + print("base is", base) + if extended is not None: + print("extended is", extended) + if improved is not None: + print("improved is", improved) + if augmented is not None: + print("augmented is", augmented) +``` + +现在,你不能用位置参数传入额外的参数: + +``` +show_arguments("hello", "extra") + --------------------------------------------------------------------------- + + TypeError Traceback (most recent call last) + + in + ----> 1 show_arguments("hello", "extra") + + + TypeError: show_arguments() takes 1 positional argument but 2 were given +``` + +对该函数的有效调用更容易预测: + +``` +show_arguments("hello", improved="extra") + base is hello + improved is extra +``` + +### nonlocal + +有时,函数式编程的人根据编写累加器的难易程度来判断一种语言。累加器是一个函数,当它被调用时,返回目前为止发给它的所有参数的总和。 + +在 3.0 之前,Python 的标准答案是: + +``` +class _Accumulator: + def __init__(self): + self._so_far = 0 + def __call__(self, arg): + self._so_far += arg + return self._so_far + +def make_accumulator(): + return _Accumulator() +``` + +虽然我承认有些啰嗦,但这确实有效: + +``` +acc = make_accumulator() +print("1", acc(1)) +print("5", acc(5)) +print("3", acc(3)) +``` + +这样做的输出结果将是: + +``` +1 1 +5 6 +3 9 +``` + +在 Python 3.x 中,`nonlocal` 关键字可以用少得多的代码实现同样的行为。 + + +``` +def make_accumulator(): + so_far = 0 + def accumulate(arg): + nonlocal so_far + so_far += arg + return so_far + return accumulate +``` + +虽然累加器是人为的例子,但使用 `nonlocal` 关键字使内部函数拥有具有状态的的能力是一个强大的工具。 + +### 扩展析构 + +想象一下,你有一个 CSV 文件,每一行由几个元素组成: + + * 第一个元素是年份 + * 第二个元素是月 + * 其他元素是该月发表的全部文章数,每天一个条目 + +请注意,最后一个元素是 _文章总数_,而不是 _每天发表的文章_。例如,一行的开头可以是: + +``` +2021,1,5,8,10 +``` + +这意味着在 2021 年 1 月,第一天发表了 5 篇文章。第二天,又发表了三篇文章,使总数达到 8 篇。第三天,又发表了两篇文章。 + +一个月可以有 28 天、30 天或 31 天。提取月份、日期和文章总数有多难? + +在 3.0 之前的 Python 版本中,你可能会这样写: + +``` +year, month, total = row[0], row[1], row[-1] +``` + +这是正确的,但它掩盖了格式。使用**扩展析构**,同样可以这样表达: + +``` +year, month, *rest, total = row +``` + +这意味着如果该格式改为前缀了一个描述,你可以把代码改成: + +``` +_, year, month, *rest, total = row +``` + +而不需要在每个索引中添加 `1`。 + +### 接下来是什么? + +Python 3.0 和它的后期版本已经推出了 12 年多,但是它的一些功能还没有被充分利用。在本系列的下一篇文章中,我将会写另外三个。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-30-features + +作者:[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/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) \ No newline at end of file diff --git a/published/202105/20210512 4 Linux terminal multiplexers to try.md b/published/202105/20210512 4 Linux terminal multiplexers to try.md new file mode 100644 index 0000000000..107077cb74 --- /dev/null +++ b/published/202105/20210512 4 Linux terminal multiplexers to try.md @@ -0,0 +1,143 @@ +[#]: subject: (4 Linux terminal multiplexers to try) +[#]: via: (https://opensource.com/article/21/5/linux-terminal-multiplexer) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13420-1.html) + +4 款值得一试的 Linux 终端多路复用器 +====== + +> 比较 tmux、GNU Screen、Konsole 和 Terminator,看看哪个最适合你。 + +![](https://img.linux.net.cn/data/attachment/album/202105/24/205044ez55fdw99alhhgn8.jpg) + +Linux 用户通常需要大量的虚拟视觉空间。一个终端窗口是永远不够的,所以终端有了标签。一个桌面太受限制了,所以有了虚拟桌面。当然,应用程序窗口可以堆叠,但当它们堆叠起来时,又有多大的好处呢?哎呀,即使是后台文本控制台也有 `F1` 到 `F7`,可以在任务之间来回翻转。 + +有了这么多的多任务处理方式,有人发明了终端 *多路复用器* 的概念就不奇怪了。诚然,这是一个令人困惑的术语。在传统的电子学中,“多路复用器multiplexer”是一个接收多个输入信号并将选定的信号转发到单一输出的部件。终端多路复用器的作用正好相反。它从一个输入(人类在键盘上向一个终端窗口打字)接收指令,并将该输入转发给任意数量的输出(例如,一组服务器)。 + +然后,“多路复用器”一词在美国也是一个流行的术语,指的是有许多屏幕的电影院(与“影城cineplex”一词一个意思)。在某种程度上,这很好地描述了终端复用器的作用。它可以在一个框内提供许多屏幕。 + +不管这个词是什么意思,任何尝试过它的人都有自己的喜好的某一种多路复用器。因此,我决定考察一些流行的终端多路复用器,看看每一个都怎么样。就我的评估标准而言,最低限度,我需要每个多路复用器能够分割*和*堆叠终端窗口。 + +### tmux + +![tmux][2] + +据我所知,是从 tmux 开始使用“多路复用器”这个术语的。它工作的很出色。 + +它作为一个守护程序运行,这样即使你关闭了正在查看的终端模拟器,你的终端会话仍然处于活动状态。它将你的终端屏幕分割成多个面板,这样你就可以在每个面板上打开独特的终端提示符。 + +推而广之,这意味着你也可以远程连接到任何数量的系统,并在你的终端中打开它们。利用 tmux 的能力,将输入镜像(或者以电子学术语说是“反向多路复用”)到其他打开的窗格,就能从一个中央命令窗格同时控制几台计算机。 + +tmux 在 GNU Screen 还只能水平分割的时候就有了垂直分割能力,这吸引了追求最大灵活性的粉丝。而灵活性正是用户在 tmux 中得到的。它可以分割、堆叠、选择和提供服务;几乎没有什么是它做不到的。 + +#### 📦 软件包大小 + +从软件包中安装 tmux 大约需要 700K,这还不算它所依赖的十几个共享库。 + +#### 🎛️ 控制键 + +tmux 的默认触发键是 `Ctrl+B`,尽管很容易在其配置文件中重新定义。 + +#### ⌨️ 黑客因子 + +即使你只是在学习如何使用终端,你也一定会觉得使用 tmux 的人很像黑客。它看起来很复杂,但一旦你了解了正确的键绑定,就很容易使用。它为你提供了很多有用的技巧,让你玩的飞起,而且它是一种快速构建 HUD(抬头显示器)的超简单方法,可以把你需要的所有信息摆在你面前。 + +### GNU Screen + +![GNU Screen][4] + +像 tmux 一样,GNU Screen 也运行一个守护程序,所以即使你关闭了用来启动它的终端,你的 shell 仍然可用。你可以从不同的计算机上连接并共享屏幕。它可以将你的终端屏幕分割成水平或垂直的窗格。 + +与 tmux 不同的是,GNU Screen 可以通过串行连接进行连接(`screen 9600 /dev/ttyUSB0` 就可以了),通过按键绑定可以方便地发出 `XON` 和 `XOFF` 信号。 + +与 SSH 会话相比,在串行连接中需要多路复用器的情况可能并不常见,所以大多数用户并不了解 Screen 这个真正特殊的功能。不过,GNU Screen 是一个很棒的多路复用器,有很多有用的选项。而如果你真的需要同时向多个服务器发送信号,还有专门的工具,比如 ClusterSSH 和 [Ansible][5]。 + +#### 📦 软件包大小 + +从软件包中安装 GNU Screen 大约需要 970K,这还不算它所依赖的十几个共享库。 + +#### 🎛️ 控制键 + +GNU Screen 的默认触发键是 `Ctrl+A`,这对于熟悉 Bash 快捷键的人来说可能特别烦人。幸运的是,你可以在配置文件中轻松地重新定义这个触发键。 + +#### ⌨️ 黑客因子 + +当使用 Screen 通过串行连接到你的路由器或你的原型电路板时,你会成为你所有硬件黑客朋友羡慕的对象。 + +### Konsole + +![Konsole][6] + +对于没有标榜自己是多路复用器的 Konsole 来说,令人惊讶的是它也是其中一个。它可以使用 Qt 窗格和标签进行必要的窗口分割和堆叠,但它也可以通过“编辑(将输入复制到)”菜单中的一个选项将输入从一个窗格传到另一个(或全部)。 + +然而,它所最明显缺乏的功能是作为一个守护程序运行以进行远程重新连接的能力。与 tmux 和 GNU Screen 不同,你不能远程连接到运行 Konsole 的机器并加入会话。对于一些管理员来说,这可能不是一个问题。许多管理员用 [VNC][7] 连接到机器的次数比用 [SSH][8] 还要多,所以“重新加入”一个会话就像在 VNC 客户端上点击 Konsole 窗口一样简单。 + +使用 Konsole 作为多路复用器是 KDE 极客们的大招。Konsole 是我使用的第一个 Linux 终端(直到今天,我有时也会按 `Ctrl+N` 来切换新标签),所以有能力使用这个熟悉的终端作为多路复用器是一个很大的便利。这绝不是必要的,因为无论如何 tmux 和 Screen 都可以在 Konsole 里面运行,但是通过让 Konsole 处理窗格,我就不必调整肌肉记忆。这种微妙的功能包容正是 [KDE 的伟大之处][9]。 + +#### 📦 软件包大小 + +Konsole 本身大约是 11KB,但它依赖于 105 个 KDE 和 Qt 库,所以实际上,它至少有 50MB。 + +#### 🎛️ 控制键 + +大多数重要的 Konsole 快捷键以 `Shift+Ctrl` 开始,分割屏幕、打开新标签、复制输入到其他窗格等都是如此。这是 KDE 里的主控台,所以如果你对 Plasma 桌面很熟悉,会感觉快捷键很熟悉。 + +#### ⌨️ 黑客因子 + +使用 Konsole 作为你的多路复用器让你有资格称自己为 KDE 高级用户。 + +### Terminator + +![Terminator][10] + +对于 GNOME 用户来说,Terminator 多路复用器是为他们原本极简的 GNOME 终端增加功能的一个简单方法。除了必要的多路复用功能外,Terminator 还可以向所有打开的窗格广播输入,但和 Konsole 一样,它不会在后台运行以便你可以通过 SSH 重新连接到它。话说回来,由于 GNOME 和 Wayland 让 VNC 变得如此简单,你有可能会觉得没有必要通过 SSH 来恢复终端会话。 + +如果你愿意,Terminator 可以完全由鼠标驱动。Konsole 通过其主菜单也有同样的能力。有了 Terminator,你可以在 Shell 的任何地方点击右键,弹出相关选项,以水平或垂直分割窗口,将窗格分组作为广播目标,广播输入,关闭窗格,等等。你还可以为所有这些动作配置键盘快捷键,所以在许多方面,你可以形成自己的体验。 + +我认为自己主要是一个 KDE 用户,所以当我说 Terminator 感觉像一个 KDE 应用时,我其实是一种极大的赞美。Terminator 是一个令人惊讶的可配置的和灵活的应用程序。在许多方面,它体现了开源的力量,把简陋的 GNOME 终端变成了一个强大的多路复用器。 + +#### 📦 软件包大小 + +Terminator 的安装容量为 2.2MB,其中大部分是 Python 模块。但它依赖于 GTK3 和 GNOME,所以如果你没有运行完整的 GNOME 桌面,可以预料你需要一个更大的安装来拉入这些依赖。 + +#### 🎛️ 控制键 + +Terminator 的默认控制键没有什么一致性。你可以用 `Alt` 键来执行一些命令,用 `Ctrl` 来执行其他命令,还可以用 `Shift+Ctrl`、`Ctrl+Alt`、`Shift+Super` 等等,还有鼠标。话说回来,这是我试过的最可配置的多路复用器之一,所以只要有想法,稍加努力,你就能设计出适合你的模式。 + +#### ⌨️ 黑客因子 + +当你使用 Terminator 时,你会觉得自己是最现代、最务实的黑客。由于它的各种极客选项,它是多路复用的最佳选择,而且由于它非常灵活,无论你的手是在键盘上,还是键盘和鼠标并用,你都可以同样轻松地使用它。 + +### 我全要 + +还有更多的多路复用器和一些具有类似多路复用能力的应用。你不必非要找到*一个*完全按照你想要的方式完成你需要的所有工作的多路复用器。你可以使用不止一个。事实上,你甚至可以同时使用多个,因为 tmux 和 Screen 实际上是 shell,而 Konsole 和 Terminator 是显示 shell 的终端。对唾手可得的工具感到舒适,而且它们能帮助你管理你的工作空间,使你能有效地工作,才是最重要的。 + +去尝试一下多路复用器,或者在你喜欢的应用程序中发现类似多路复用器的功能。它可能会改变你看待计算的方式。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/linux-terminal-multiplexer + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/freedos.png?itok=aOBLy7Ky (4 different color terminal windows with code) +[2]: https://opensource.com/sites/default/files/uploads/multiplex-tmux.png (tmux) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/sites/default/files/uploads/multiplex-screen.png (GNU Screen) +[5]: https://opensource.com/article/19/2/quickstart-guide-ansible +[6]: https://opensource.com/sites/default/files/uploads/multiplex-konsole.png (Konsole) +[7]: https://en.wikipedia.org/wiki/Virtual_Network_Computing +[8]: https://en.wikipedia.org/wiki/Secure_Shell_Protocol +[9]: https://opensource.com/article/19/12/linux-kde-plasma +[10]: https://opensource.com/sites/default/files/uploads/multiplex-terminator.png (Terminator) diff --git a/published/202105/20210512 Test Your Typing Speed in Linux Terminal With Ttyper.md b/published/202105/20210512 Test Your Typing Speed in Linux Terminal With Ttyper.md new file mode 100644 index 0000000000..54e0c22dca --- /dev/null +++ b/published/202105/20210512 Test Your Typing Speed in Linux Terminal With Ttyper.md @@ -0,0 +1,140 @@ +[#]: subject: (Test Your Typing Speed in Linux Terminal With Ttyper) +[#]: via: (https://itsfoss.com/ttyper/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13401-1.html) + +用 Ttyper 测试你在 Linux 终端的打字速度 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/18/092309xnzs2qgey3ss8cmq.jpg) + +有几种方法可以测试和提高你的打字速度。你可以使用在线工具,在桌面上安装专门的应用,或者在 Linux 终端测试。 + +Linux 终端?是的。从 [浏览互联网][1] 到 [玩游戏][2],你可以在强大的 Linux 终端中做 [许多有趣的事情][3]。测试你的打字速度就是其中之一。 + +### Ttyper:基于终端的打字测试工具 + +[Ttyper][4] 是一个用 [Rust][5] 编写的工具,允许你练习打字。 + +它给出了一些最常见的英语单词的随机选择。打出的正确单词用绿色突出显示,错误的用红色突出显示,而且这是实时发生的。你可以按退格键纠正单词,但这将导致分数下降。 + +![][6] + +当你打完所有显示的单词后,你会得到你的打字速度(每分钟字数)、准确率和正确按键数的结果。如果你没有心情打完全部,你可以使用 `Ctrl+C` 退出 Ttyper。 + +![][7] + +你可以在这个由开发者录制的 GIF 中看到 Ttyper 的操作。 + +![][8] + +默认情况下,你有 50 个单词可以练习,但你可以用命令选项来扩大。你还可以使用一个自定义的文本文件,用它的内容来练习打字。 + +命令 | 内容 +---|--- +`ttyper` | 200 个最常见的英语单词中的 50 个 +`ttyper -w 100` | 200 个最常见的英语单词中的 100 个 +`ttyper -w 100 -l english1000` | 1000 个最常见的英语单词中的 100 个 +`ttyper text.txt` | 内容来自用空格分隔的 `test.txt` + +Ttyper 也专注于开发者。它支持几种编程语言,如果你是一个程序员,你可以用它来测试和改进你在编码时的打字速度。 + +![][9] + +截至目前,支持 C、Csharp、Go、HTML、Java、JavaScript、Python、Ruby 和 Rust 语言。 + +你可以通过以下方式改变语言: + +``` +ttyper -l html +``` + +顺便说一下,“Ttyper” 中的双 “T” 不是一个打字错误。它是故意的,因为TTY(**T**ele**TY**pewriter)代表 [终端模拟器][10],表明它是一个终端工具。 + +### 在 Linux 上安装 Ttyper + +Ttyper 是用 Rust 构建的,你可以把它安装在任何支持 Rust 编程语言及其 [Cargo 软件包管理器][13]的 Linux 发行版上。 + +Cargo 相当于 Python 中的 PIP。它有一个[中央仓库][14],你可以用 Cargo 轻松地下载和安装 Rust 包和它的依赖项。 + +我将添加在基于 Ubuntu 的 Linux 发行版上安装 Cargo 的说明。你应该可以用你的[发行版的包管理器][15]来安装它。 + +请确保你在 Ubuntu 上启用了 universe 仓库。你可以用这个命令来安装 Cargo: + +``` +sudo apt install cargo +``` + +它将安装 Cargo 包管理器和 Rust 语言的 `rustc` 包。 + +当你的系统安装了 Cargo,就可以用这个命令来安装 Ttyper: + +``` +cargo install ttyper +``` + +这将在你的主目录下的 `.cargo/bin` 目录中添加一个可执行 Rust 文件。它将在软件包安装输出的最后显示。 + +![][16] + +你可以切换到这个目录: + +``` +cd ~/.cargo/bin +``` + +并运行 `ttyper` 可执行文件: + +``` +./ttyper +``` + +当然,这不是很方便。这就是为什么你应该 [把这个目录添加到 PATH 变量中][17]。如果你熟悉 Linux 的命令行,你可以很容易做到这一点。 + +不幸的是,我不能在这里给你确切的命令,因为你需要提供这个目录的绝对路径,而这个路径名称会根据你的用户名而不同。例如,对我来说,它是 `/home/abhishek/.cargo/bin`。这个绝对路径对你来说会有所不同。 + +我建议阅读 [绝对路径和相对路径][18] 以了解更多关于这个问题的信息。 + +你可以通过删除二进制文件来卸载 Ttyper,或者用 Cargo 命令来卸载: + +``` +cargo uninstall ttyper +``` + +如果你喜欢这个灵巧的终端工具,[在 GitHub 上给它加星][4] 以感谢开发者的努力。 + +正如我在本文开头提到的,你可以在终端做很多很酷的事情。如果你想给你的同事一个惊喜,也许你可以试试 [完全在 Linux 终端中制作幻灯片][12]。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ttyper/ + +作者:[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/terminal-web-browsers/ +[2]: https://itsfoss.com/best-command-line-games-linux/ +[3]: https://itsfoss.com/funny-linux-commands/ +[4]: https://github.com/max-niederman/ttyper +[5]: https://www.rust-lang.org/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/ttyper-typing-speed-test-linux.png?resize=800%2C441&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/ttyper-typing-test-result.png?resize=800%2C547&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/ttyper.gif?resize=800%2C498&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/ttyper-typing-test-html.png?resize=800%2C441&ssl=1 +[10]: https://itsfoss.com/linux-terminal-emulators/ +[13]: https://doc.rust-lang.org/cargo/index.html +[14]: https://crates.io/ +[15]: https://itsfoss.com/package-manager/ +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-ttyper-linux.png?resize=800%2C399&ssl=1 +[17]: https://itsfoss.com/add-directory-to-path-linux/ +[18]: https://linuxhandbook.com/absolute-vs-relative-path/ diff --git a/published/202105/20210512 Using Ansible to configure Podman containers.md b/published/202105/20210512 Using Ansible to configure Podman containers.md new file mode 100644 index 0000000000..97d71793f7 --- /dev/null +++ b/published/202105/20210512 Using Ansible to configure Podman containers.md @@ -0,0 +1,235 @@ +[#]: subject: (Using Ansible to configure Podman containers) +[#]: via: (https://fedoramagazine.org/using-ansible-to-configure-podman-containers/) +[#]: author: (mahesh1b https://fedoramagazine.org/author/mahesh1b/) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13396-1.html) + +使用 Ansible 配置 Podman 容器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/16/121225oyf5q2sn4fyyeu6z.jpg) + +在复杂的 IT 基础设施中,有许多重复性任务。成功运行这些任务并不容易。运行失败大多数是人为错误引发。在 Ansible 帮助下,你可以通过远程主机来执行所有任务,这些远程主机按照行动手册playbook执行,行动手册可以根据需要重复使用多次。在本文中,你将学习如何在 Fedora Linux 上安装、配置 Ansible,以及如何使用它来管理、配置 Podman 容器。 + +### Ansible + +[Ansible][4] 是一个由红帽赞助的开源基础设施自动化工具。它可以处理大型基础设施带来的所有问题,例如安装和更新软件包、备份、确保特定服务持续运行等等。你用 YAML 写的行动手册来做这些事。Ansible 行动手册可以反复使用,使系统管理员的工作不那么复杂。行动手册减少了重复任务,并且可以轻松修改。但是我们有很多像 Ansible 一样的自动化工具,为什么要用它呢?与其他一些配置管理工具不同,Ansible 是无代理的:你不必在受管节点上安装任何东西。 + +### Podman + +[Podman][6] 是一个开源的容器引擎,用于开发、管理和运行容器镜像。但什么是容器呢?每当你创建任何新应用程序并将其部署在物理服务器、云服务器或虚拟机上时,你面临的最常见问题是可移植性和兼容性。这就是容器出现的原因。容器在操作系统级别上进行虚拟化,因此它们只包含所需的库和应用程序服务。容器的好处包括: + + * 便携性 + * 隔离性 + * 扩展性 + * 轻量级 + * 快速启动 + * 更小的磁盘和内存需求 + +简而言之:当你为任何应用程序构建容器镜像时,所有必需的依赖项都被打包到容器中。你现在可以在任何主机操作系统上运行该容器,没有任何可移植性和兼容性问题。 + +Podman 的关键亮点在于它没有守护程序,因此不需要 root 权限来运行容器。你可以借助 Dockerfile 构建容器镜像,或者从 Docker Hub、[fedoraproject.org][7] 或 [Quay][8] 上拉取镜像。 + +### 为什么用 Ansible 配置 Podman? + +Ansible 提供了一种轻松多次运行重复任务的方法。它还为云提供商(如 AWS、GCP 和 Azure)、容器管理工具(如 Docker 和 Podman)与数据库管理提供了大量模块。Ansible 还有一个社区([Ansible Galaxy][10]),在这里你可以找到大量 Ansible 角色Roles,它们由来自世界各地的贡献者创建。因为这些,Ansible 成为了 DevOps 工程师和系统管理员手中的好工具。 + +借助 DevOps,应用程序的开发步伐很快。开发的应用不局限于任意操作系统,这点至关重要。这就是 Podman 出现的地方。 + +### 安装 Ansible + +首先,安装 Ansible: + +``` +$ sudo dnf install ansible -y +``` + +### 配置 Ansible + +Ansible 需要在受管节点上运行 ssh,所以首先生成一个密钥对Key Pair。 + +``` +$ ssh-keygen +``` + +生成密钥后,将密钥复制到受管节点。 + +输入 `yes`,然后输入受管节点的密码。现在可以远程访问受管主机。 + +为了能够访问受管节点,你需要将所有主机名或 IP 地址存储在清单文件中。默认情况下,这是在 `~/etc/ansible/hosts`。 + +这是库存inventory文件的样子。方括号用于将组分配给某些特定的节点。 + +``` +[group1] +green.example.com +blue.example.com +[group2] +192.168.100.11 +192.168.100.10 +``` + +检查所有受管节点是否可以到达。 + +``` +$ ansible all -m ping +``` + +你可以看到如下输出: + +``` +[mahesh@fedora new] $ ansible all -m ping +fedora.example.com I SUCCESS { + "ansibe_facts": { + "discovered_interpreter_python": "/usr/bin/python" + }, + "changed": false, + "ping": "pong" +} +[mahesh@fedora new] $ +``` + +现在创建你的第一个行动手册playbook,它将在受管节点上安装 Podman。首先用 .yml 拓展名创建一个任意名称的文件。 + +``` +$ vim name_of_playbook.yml +``` + +行动手册应该如下所示。第一个字段是行动手册的名称。主机字段(`hosts`)用于提及清单中提到的主机名或组名。`become: yes` 表示升级权限,以及任务(`tasks`)包含所要执行的任务,这里的名称(`name`)指定任务(`tasks`)名称,`yum` 是安装软件包的模块,下面在名称字段(`name`)指定软件包名称,在状态字段(`state`)指定安装或删除软件包。 + +``` +--- + - name: First playbook +   hosts: fedora.example.com +   become: yes +   tasks: +    - name: Installing podman. +       yum: +         name: podman +         state: present +``` + +检查文件中是否有语法错误: + +``` +$ ansible-playbook filename --syntax-check +``` + +现在运行行动手册: + +``` +$ ansible-playbook filename +``` + +你可以看到如下输出: + +``` +[mahesh@fedora new] $ ansible-playbook podman_installation.yml +PLAY [First playbook] ************************************************************************************************* + +TASK [Gathering Facts] ************************************************************************************************* +0k: [fedora.example.com] + +TASK [Installing podman] ************************************************************************************************ +changed: [fedora.example.com] + +PLAY RECAP ************************************************************************************************* +fedora.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +[mahesh@fedora new] $ +``` + +现在创建一个新的行动手册,从 Docker Hub 中拉取一个镜像。你将使用 `podman_image` 模块从 Docker Hub 中提取版本号为 2-alpine 的 httpd 镜像。 + +``` +--- + - name: Playbook for podman. + hosts: fedora.example.com + tasks: + - name: Pull httpd:2-alpine image from dockerhub. + podman_image: + name: docker.io/httpd + tag: 2-alpine +``` + +现在检查已拉取的镜像: + +``` +[mahesh@fedora new] $ podman images +REPOSITORY TAG IMAGE ID CREATED SIZE +docker.io/library/httpd 2-alpine fa848876521a 11 days ago 57 MB + +[mahesh@fedora new] $ +``` + +创建一个新的行动手册来运行 httpd 镜像。更多信息请查看 [podman_container][11] 模块文档。 + +``` +--- + - name: Playbook for podman. + hosts: fedora.example.com + tasks: + - name: Running httpd image. + containers.podman.podman_container: + name: my-first-container + image: docker.io/httpd:2-alpine + state: started +``` + +检查容器运行状态。 + +``` +[mahesh@fedora new] $ podman ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +45d966eOe207 docker.io/library/httpd:2-alpine httpd-foreground 13 seconds ago Up 13 seconds ago my-first-container + +[mahesh@fedora new] $ +``` + +现在停止已运行的容器,改变状态,由 `started` 变为 `absent`。 + +``` +- name: Stopping httpd container. + containers.podman.podman_container: + name: my-first-container + image: docker.io/httpd:2-alpine + state: absent +``` + +当你执行 `podman ps` 命令时,你看不到任何运行的容器。 + +``` +[mahesh@fedora new] $ podman ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + +[mahesh@fedora new] $ +``` + +`podman_container` 可以做很多事情,例如重新创建容器、重新启动容器、检查容器是否正在运行等等。有关执行这些操作的信息,请参考 [文档][11]。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/using-ansible-to-configure-podman-containers/ + +作者:[mahesh1b][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/mahesh1b/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/04/ansible-podman-1-816x345.jpg +[2]: https://unsplash.com/@vnevremeni?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/container?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://www.ansible.com/ +[5]: https://fedoramagazine.org/tag/ansible/ +[6]: https://podman.io/ +[7]: https://registry.fedoraproject.org/ +[8]: https://www.projectquay.io/ +[9]: https://fedoramagazine.org/tag/podman/ +[10]: https://galaxy.ansible.com/ +[11]: https://docs.ansible.com/ansible/latest/collections/containers/podman/podman_container_module.html diff --git a/published/202105/20210513 3 features released in Python 3.1 you should use in 2021.md b/published/202105/20210513 3 features released in Python 3.1 you should use in 2021.md new file mode 100644 index 0000000000..87a5508583 --- /dev/null +++ b/published/202105/20210513 3 features released in Python 3.1 you should use in 2021.md @@ -0,0 +1,87 @@ +[#]: subject: (3 features released in Python 3.1 you should use in 2021) +[#]: via: (https://opensource.com/article/21/5/python-31-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13432-1.html) + +3 个值得使用的在 Python 3.1 中发布的特性 +====== + +> 探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/27/225101wkeoeqd7bb8ckr8d.jpg) + +这是 Python 3.x 首发特性系列文章的第二篇。Python 3.1 于 2009 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有被充分利用,而且相当酷。下面是其中的三个。 + +### 千位数格式化 + +在格式化大数时,通常是每三位数放置逗号,使数字更易读(例如,1,048,576 比 1048576 更容易读)。从 Python 3.1 开始,可以在使用字符串格式化函数时直接完成: + +``` +"2 to the 20th power is {:,d}".format(2**20) +``` + +``` +'2 to the 20th power is 1,048,576' +``` + +`,d` 格式符表示数字必须用逗号格式化。 + +### Counter 类 + +`collections.Counter` 类是标准库模块 `collections` 的一部分,是 Python 中的一个秘密超级武器。它经常在 Python 的面试题的简单解答中首次遇到,但它的价值并不限于此。 + +例如,在 [Humpty Dumpty 的歌][2] 的前八行中找出五个最常见的字母: + +``` +hd_song = """ +In winter, when the fields are white, +I sing this song for your delight. + +In Spring, when woods are getting green, +I'll try and tell you what I mean. + +In Summer, when the days are long, +Perhaps you'll understand the song. + +In Autumn, when the leaves are brown, +Take pen and ink, and write it down. +""" +``` + +``` +import collections + +collections.Counter(hd_song.lower().replace(' ', '')).most_common(5) +``` + +``` +[('e', 29), ('n', 27), ('i', 18), ('t', 18), ('r', 15)] +``` + +### 执行软件包 + +Python 允许使用 `-m` 标志来从命令行执行模块。甚至一些标准库模块在被执行时也会做一些有用的事情;例如,`python -m cgi` 是一个 CGI 脚本,用来调试网络服务器的 CGI 配置。 + +然而,直到 Python 3.1,都不可能像这样执行 _软件包_。从 Python 3.1 开始,`python -m package` 将执行软件包中的 `__main__` 模块。这是一个放调试脚本或命令的好地方,这些脚本主要是用工具执行的,不需要很短。 + +Python 3.0 在 11 年前就已经发布了,但是在这个版本中首次出现的一些功能是很酷的,而且没有得到充分利用。如果你还没使用,那么将它们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-31-features + +作者:[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/python_programming_question.png?itok=cOeJW-8r (Python programming language logo with question marks) +[2]: http://www2.open.ac.uk/openlearn/poetryprescription/humpty-dumptys-recitation.html diff --git a/published/202105/20210513 5 reasons to host your container registry with Pulp.md b/published/202105/20210513 5 reasons to host your container registry with Pulp.md new file mode 100644 index 0000000000..47f0158018 --- /dev/null +++ b/published/202105/20210513 5 reasons to host your container registry with Pulp.md @@ -0,0 +1,84 @@ +[#]: subject: (5 reasons to host your container registry with Pulp) +[#]: via: (https://opensource.com/article/21/5/container-management-pulp) +[#]: author: (Melanie Corr https://opensource.com/users/melanie-corr) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13410-1.html) + +用 Pulp 托管你的容器注册中心的 5 个理由 +====== + +> 有很多令人信服的理由来用 Pulp 来托管你自己的容器注册中心。下面是其中的一些。 + +![](https://img.linux.net.cn/data/attachment/album/202105/21/091220vpckb2yywo2eq12y.jpg) + +Linux 容器极大地简化了软件发布。将一个应用程序与它运行所需的一切打包的能力有助于提高环境的稳定性和可重复性。 + +虽然有许多公共注册中心可以上传、管理和分发容器镜像,但有许多令人信服的论据支持托管自己的容器注册中心。让我们来看看为什么自我托管是有意义的,以及 [Pulp][2],一个自由开源项目,如何帮助你在企业内部环境中管理和分发容器。 + +### 为什么要托管你自己的容器注册中心 + +你可以考虑托管自己的容器注册中心,原因有很多: + + * **体积**:一些容器镜像是相当大的。如果你有多个团队下载同一个镜像,这可能需要大量的时间,并给你的网络和预算带来压力。 + * **带宽**:如果你在一个带宽有限的地区工作,或在一个出于安全原因限制访问互联网的组织中工作,你需要一个可靠的方法来管理你工作的容器。 + * **金钱**:服务条款可以改变。外部容器注册中心能引入或增加速率限制阈值,这可能会对你的操作造成极大的限制。 + * **稳定性**:托管在外部资源上的容器镜像可能会因为一些原因消失几天。小到你所依赖的更新容器镜像,可能会导致你想要避免的重大更改。 + * **隐私**:你可能也想开发和分发容器,但你不想在公共的第三方注册中心托管。 + +### 使用 Pulp 进行自我托管 + +使用 Pulp,你可以避免这些问题并完全控制你的容器。 + +#### 1、避免速率限制 + +在 Pulp 中创建容器镜像的本地缓存,可以让你组织中的每个人都能拉取到 Pulp 上托管的容器镜像,而不是从外部注册中心拉取。这意味着你可以避免速率限制,只有当你需要新的东西时才从外部注册中心进行同步。当你确实需要从外部注册中心同步容器时,Pulp 首先检查内容是否已经存在,然后再从远程注册中心启动同步。如果你受到注册中心的速率限制,你就只镜像你需要的内容,然后用 Pulp 在整个组织中分发它。 + +#### 2、整理你的容器 + +使用 Pulp,你可以创建一个仓库,然后从任何与 Docker Registry HTTP API V2 兼容的注册中心镜像和同步容器。这包括 Docker、Google Container registry、Quay.io 等,也包括另一个 Pulp 服务器。对于你结合来自不同注册中心的镜像容器的方式,没有任何限制或约束。你可以自由地混合来自不同来源的容器。这允许你整理一套公共和私人容器,以满足你的确切要求。 + +#### 3、无风险的实验 + +在 Pulp 中,每当你对仓库进行修改时,就会创建一个新的不可变的版本。你可以创建多个版本的仓库,例如,development、test、stage 和 production,并在它们之间推送容器。你可以自由地将容器镜像的最新更新从外部注册中心同步到 Pulp,然后让最新的变化在开发或其他环境中可用。你可以对你认为必要的仓库进行任何修改,并促进容器内容被测试团队或其他环境使用。如果出了问题,你可以回滚到早期版本。 + +#### 4、只同步你需要的内容 + +如果你想使用 Pulp 来创建一个容器子集的本地缓存,而不是一个完整的容器注册中心,你可以从一个远程源过滤选择容器。使用 Pulp,有多种内容同步选项,以便你只存储你需要的内容,或配置你的部署,按需缓存内容。 + +#### 5、在断线和空气隔离的环境中工作 + +如果你在一个断线或受限制的环境中工作,你可以从一个连接的 Pulp 实例中同步更新到你断连的 Pulp。目前,有计划为 Pulp 实现一个原生的空气隔离功能,以促进完全断线的工作流程。同时,作为一种变通方法,你可以使用 [Skopeo][3] 等工具来下载你需要的容器镜像,然后将它们推送到你断线的 Pulp 容器注册中心。 + +#### 还有更多! + +通过 Pulp,你还可以从容器文件中构建容器,将私有容器推送到仓库,并在整个组织中分发这些容器。我们将在未来的文章中对这个工作流程进行介绍。 + +### 如何开始 + +如果你对自我托管你的容器注册中心感兴趣,你现在就可以 [安装 Pulp][4]。随着 Pulp Ansible 安装程序的加入,安装过程已经被大量自动化和简化了。 + +Pulp 有一个基于插件的架构。当你安装 Pulp 时,选择容器插件和其他任何你想管理的内容插件类型。如果你想测试一下 Pulp,你今天就可以评估 Pulp 的容器化版本。 + +如果你有任何问题或意见,请随时在 Freenode IRC 的 #pulp 频道与我们联系,我们也很乐意在我们的邮件列表 [pulp-list@redhat.com][5] 中接受问题。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/container-management-pulp + +作者:[Melanie Corr][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/melanie-corr +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_2015-2-osdc-lead.png?itok=kAfHrBoy (Containers for shipping overseas) +[2]: https://pulpproject.org/ +[3]: https://github.com/containers/skopeo +[4]: https://pulpproject.org/installation-introduction/ +[5]: mailto:pulp-list@redhat.com diff --git a/published/202105/20210514 3 Python 3.2 features that are still relevant today.md b/published/202105/20210514 3 Python 3.2 features that are still relevant today.md new file mode 100644 index 0000000000..1d986bb788 --- /dev/null +++ b/published/202105/20210514 3 Python 3.2 features that are still relevant today.md @@ -0,0 +1,188 @@ +[#]: subject: (3 Python 3.2 features that are still relevant today) +[#]: via: (https://opensource.com/article/21/5/python-32) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13435-1.html) + +3 个到今天仍然有用的 Python 3.2 特性 +====== + +> 探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/28/202023pz86mg88r18o6e22.jpg) + +这是Python 3.x 首发特性系列文章中的第三篇。其中一些 Python 版本已经推出了一段时间。例如,Python 3.2 是在 2011 年首次发布的,但其中引入的一些很酷、很有用的特性仍然没有被使用。下面是其中的三个。 + +### argparse 子命令 + +`argparse` 模块首次出现在 Python 3.2 中。有许多用于命令行解析的第三方模块。但是内置的 `argparse` 模块比许多人认为的要强大。 + +要记录所有的 `argparse` 的特性,那需要专门写系列文章。下面是一个例子,说明如何用 `argparse` 做子命令。 + +想象一下,一个命令有两个子命令:`negate`,需要一个参数,`multiply`,需要两个参数: + +``` +$ computebot negate 5 +-5 +$ computebot multiply 2 3 +6 +``` + +``` +import argparse + +parser = argparse.ArgumentParser() +subparsers = parser.add_subparsers() +``` + +`add_subparsers()` 方法创建一个对象,你可以向其添加子命令。唯一需要记住的技巧是,你需要添加通过 `set_defaults()` 调用的子命令: + +``` +negate = subparsers.add_parser("negate") +negate.set_defaults(subcommand="negate") +negate.add_argument("number", type=float) +``` + +``` +multiply = subparsers.add_parser("multiply") +multiply.set_defaults(subcommand="multiply") +multiply.add_argument("number1", type=float) +multiply.add_argument("number2", type=float) +``` + +我最喜欢的一个 `argparse` 功能是,因为它把解析和运行分开,测试解析逻辑特别令人愉快。 + +``` +parser.parse_args(["negate", "5"]) +``` + +``` + Namespace(number=5.0, subcommand='negate') +``` + +``` +parser.parse_args(["multiply", "2", "3"]) +``` + +``` + Namespace(number1=2.0, number2=3.0, subcommand='multiply') +``` + +### contextlib.contextmanager + +上下文是 Python 中一个强大的工具。虽然很多人 _使用_ 它们,但编写一个新的上下文常常看起来像一门黑暗艺术。有了 `contextmanager` 装饰器,你所需要的只是一个一次性的生成器。 + +编写一个打印出做某事所需时间的上下文,就像这样简单: + +``` +import contextlib, timeit + +@contextlib.contextmanager +def timer(): + before = timeit.default_timer() + try: + yield + finally: + after = timeit.default_timer() + print("took", after - before) +``` +你可以这样使用: + + +``` +import time + +with timer(): + time.sleep(10.5) +``` + +``` + took 10.511025413870811` +``` + +### functools.lru_cache + +有时,在内存中缓存一个函数的结果是有意义的。例如,想象一下经典的问题:“有多少种方法可以用 25 美分、1 美分、2 美分和 3 美分可以来换取 1 美元?” + +这个问题的代码可以说是非常简单: + +``` +def change_for_a_dollar(): + def change_for(amount, coins): + if amount == 0: + return 1 + if amount < 0 or len(coins) == 0: + return 0 + some_coin = next(iter(coins)) + return ( + change_for(amount, coins - set([some_coin])) + + + change_for(amount - some_coin, coins) + ) + return change_for(100, frozenset([25, 10, 5, 1])) +``` + +在我的电脑上,这需要 13ms 左右: + +``` +with timer(): + change_for_a_dollar() +``` + +``` + took 0.013737603090703487` +``` + +事实证明,当你计算有多少种方法可以做一些事情,比如用 50 美分找钱,你会重复使用相同的硬币。你可以使用 `lru_cache` 来避免重复计算。 + +``` +import functools + +def change_for_a_dollar(): + @functools.lru_cache + def change_for(amount, coins): + if amount == 0: + return 1 + if amount < 0 or len(coins) == 0: + return 0 + some_coin = next(iter(coins)) + return ( + change_for(amount, coins - set([some_coin])) + + + change_for(amount - some_coin, coins) + ) + return change_for(100, frozenset([25, 10, 5, 1])) +``` + +``` +with timer(): + change_for_a_dollar() +``` + +``` + took 0.004180959425866604` +``` + +一行的代价是三倍的改进。不错。 + +### 欢迎来到 2011 年 + +尽管 Python 3.2 是在 10 年前发布的,但它的许多特性仍然很酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-32 + +作者:[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-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating) \ No newline at end of file diff --git a/published/202105/20210514 Drop Autotools for CMake.md b/published/202105/20210514 Drop Autotools for CMake.md new file mode 100644 index 0000000000..992ec57659 --- /dev/null +++ b/published/202105/20210514 Drop Autotools for CMake.md @@ -0,0 +1,288 @@ +[#]: subject: "Drop Autotools for CMake" +[#]: via: "https://opensource.com/article/21/5/cmake" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "amwps290" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13419-1.html" + +抛弃 Autotools 向 CMake 迈进吧 +====== + +> CMake 是一个跨平台的编译、测试和打包软件,即使你以前从来没有使用过构建系统,也可以轻松上手。 + +![](https://img.linux.net.cn/data/attachment/album/202105/24/183520grnp3821rmmpg1ug.jpg) + +在我以前的文章 [Autotools 入门][2] 一文中,我说明了如何使用 Autotools 来管理和打包代码。这是一个强大且通用的平台,可轻松集成到许多打包系统中,包括 RPM、APT、[pkgsrc][3] 等等。它的语法和结构可能会令人困惑,但幸运的是,我们还有其他选择,开源的 [CMake][4] 就是其中一个。 + +CMake 是一个用于构建、测试和打包软件的跨平台套件。它使用简单而清晰的语法,因此即使你以前从未使用过构建系统,也很容易开始使用。 + +### 安装 CMake + +CMake 可能已经安装在你的 Linux 系统上。如果没有,你可以使用发行版的程序包管理器进行安装: + +``` +$ sudo dnf install cmake +``` + +在 Debian 或者其他相似的系统上: + +``` +$ sudo apt install cmake +``` + +在 Mac 上,你可以使用 [MacPorts][5] 或者 [Homebrew][6] 来安装: + +``` +$ sudo port install cmake +``` + +在 Windows 上,你可以使用 [Chocolatey][7] 或者直接从 [CMake 网站][8] 下载二进制来安装。 + +### 使用 CMake + +对于想要从源代码构建软件的开发人员或用户来说,CMake 是一种快速简便的编译和安装方法。 CMake 分阶段工作: + +1. 首先,在 `cmake` 步骤中,CMake 扫描计算机查看一些默认设置。默认设置包括库的位置以及在系统上安装软件的位置。 +2. 接下来,使用系统上的 `make` 命令(在 Linux 上是 GUN Make,在 [NetBSD][9] 上是 NetBSD Make)来编译程序。这个过程通常是将人类可读的源代码转换成机器语言。 +3. 最后,在 `make install` 一步中,那些编译过的文件将被拷贝到(在 `cmake` 步骤中扫描出来的)计算机上合适的位置。 + +这看起来很简单,当你使用 CMake 时就是这样。 + +### CMake 的可移植性 + +CMake 在设计时就考虑了可移植性。虽然它不能使你的项目在所有 POSIX 平台上都能正常工作(这取决于作为开发者的你),但它可以确保将标记为要安装的文件安装到已知平台上最合适的位置。而且由于有了 CMake 之类的工具,对于高级用户而言,根据其系统需求自定义和覆盖任何不合适的选项都很容易。 + +使用 CMake,你只需要知道将哪些文件安装到哪个常规位置即可。它会照顾其他一切。不再需要自定义安装脚本,它们有可能在任何未经测试的操作系统上失败。 + +### 打包 + +像 Autotools 一样,CMake 也得到了很好的打包支持。无论它们是打包成 RPM 还是 DEB 或 TGZ(或其他任何东西),将带有 CMake 的项目交给打包者,他们的工作既简单又直接。打包工具支持 CMake,因此可能不需要进行任何修补或者调整。在许多情况下,可以自动将 CMake 项目整合到工作流中。 + +### 如何使用 CMake + +要在项目中使用 CMake,只需在项目目录中创建 `CMakeLists.txt` 文件。首先,声明最低要求的 CMake 版本以及项目名称和版本。CMake 会努力在尽可能长时间内保持兼容性,但是随着你使用的时间越长,并且关注它最新的开发动态,你就会知道哪些特性是你所依赖的。 + +``` +cmake_minimum_required(VERSION 3.10) + +project(Hello VERSION 1.0) +``` + +如你可能已经看到的那样,CMake 的语法是一个带有括号和参数的命令。大写的 `VERSION` 字符串不是任意的,也不只是格式。它们是 `project` 命令中的有效参数。 + +在继续之前,先写一个简单的 C 或者 C++ 的 `hello world` 程序。为了简单,我就写了六行 C 代码,并把它保存在 `hello.c` 中(为了匹配我在 `CMakeLists.txt` 中可执行文件的名字)。 + +``` +#include + +int main() { +   printf("Hello open source\n"); +   return 0; +} +``` + +不过,不要搞错了,CMake 不仅适用于 C 和 C++。它可以处理任意文件,并且有许多可用的命令,因此它可以帮助你维护许多不同形式的项目。 + +CMake 网站中记录了所有有效的内置命令及其可用参数,因此无论你要做什么,都可以轻松发现所需的功能。不过,这是一个简单的示例,因此,你需要的下一个命令是必不可少的 —— 你必须为 CMake 定义要构建的代码: + +``` +add_executable(Hello hello.c) +``` + +这个命令指定了你编译后的二进制文件的名字为 `Hello`。因此,它与你在终端中执行带有 `-o Hello` 的 `gcc` 命令是一样的。 + +在一些比较复杂的项目中,你可能还需要使用库文件,你可以使用 `add library` 命令来链接库文件。 + +在你设置了你想要构建和标记为安装的文件之后,你必须要告诉 CMake 一旦用户安装了程序,最终的应用程序应该在哪个位置。 + +在这个简单的例子里,你仅需要做的一件事就是在你的 `CMakeLists.txt` 文件里添加 `install` 命令。`install` 命令接受几个参数。但是在这个例子中,你仅需要使用 `TARGET` 命令来指定你要安装文件的名字。 + +``` +install(TARGETS Hello) +``` + +### 向 CMake 工程添加一些文件 + +一个软件项目向用户交付的往往不仅仅只有代码,还有一些其他的文件数据,例如手册或者是信息页、示例项目,或者是配置文件。你可以使用与包含编译文件时类似的工作流程,将任意数据包含在 CMake 项目中:在 `CMakelists.txt` 文件中使用 `file` 命令,然后说明一下这些文件要安装在哪里。 + +例如,你可以在这个项目中包含一个 `assets` 目录,你可以使用 `file` 命令,后面跟上 `COPY` 和 `DESTINATION` 参数来告诉 CMake 将这些额外的文件复制到你的分发包中。 + +``` +file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") +``` + +这个 `${CMAKE_CURRENT_BINARY_DIR}` 变量是一个特殊的 CMake 内置变量,表示 CMake 正在处理的目录。换句话说,你的任何文件都会被复制到编译目录(在你运行 `cmake` 命令后,这个过程会更加清晰,到时候回过头来看一下)。 + +因为这些额外的数据文件有些杂乱不堪(如果你不信的话,可以看一下 `/usr/share` 这个目录)。对于你自己的项目创建一个子文件夹对谁都有好处。最好也带上版本名字。你可以通过在 `CMAKE_CURRENT_BINARY_DIR` 中指定一个新的目录,使用你选择的项目名称,后面跟一个为你的项目命名的特殊变量和你在项目声明中为它设置的 `VERSION`。 + +``` +file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}") +``` + +### 定义安装位置 + +你已经定义你要编译的文件,因此现在你要告诉 CMake 你的程序要安装在哪个位置。比如你的主程序,这个要程使用 `install` 命令: + +``` +install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}" TYPE DATA) +``` + +这里有一些新的参数。`DIRECTORY` 参数指定了数据文件是一个目录,而不是一个文件(`FILE`)或者脚本(`SCRIPT`)。你使用的参数和复制一些额外文件到编译目录时是一样。另外,在 `install` 命令中 `TYPE` 或者 `DESTINATION` 必须要指定其一。`TYPE` 参数指定了通用的文件类型,这些文件通常将会被放到合适的位置。在 Linux 系统上,`TYPE DATA` 一般是 `/usr/local/share` 或者 `/usr/share`,除非用户定义了其他的位置。 + +这是诸如 CMake 之类的良好构建系统的强大功能之一。你不必担心文件的确切位置,因为你知道用户可以更改 CMake 的首选默认设置,并且 CMake 将构建代码以使其正常工作。 + +### 运行 CMake + +CMake 有多种方式来让你执行命令,你可以在终端或者在一个可交互的程序上执行命令,或者你也可以使用它的图形界面(GUI)。我比较偏向于使用终端命令,但是我也喜欢使用一些其他的方式(相比与在 `Makefile` 中查找那些晦涩的变量然后去修改它们更胜一筹)。 + +对于编译过开源 C++ 项目的任何人,都熟悉的第一步是创建一个 `build` 目录,进入到该目录,然后运行 `cmake ..` 命令。 我是一个懒惰的打字员,所以我将构建目录命名为 `b`,但是你可以使用最合适的方式: + +``` +$ mkdir b +$ cd b +$ cmake .. +-- The C compiler identification is GNU 11.1.1 +-- The CXX compiler identification is GNU 11.1.1 +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /usr/bin/cc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /usr/bin/c++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Configuring done +-- Generating done +-- Build files have been written to: /var/home/seth/demo-hello/b +$ +``` + +这或多或少相当于经典的 `./configure; make; make install` 中的 `./configure`。看一下你的构建目录,CMake 已经帮你生成了几个新的文件,来让你的项目更完整。这里生成了 CMake 的数据文件、一个常规的 `Makefile` 文件(这是一个免费提供的 247 行的文件,但对于越复杂的项目,行数要多得多),还有一个包含这个示例程序的任意非编译数据的 `Hello-1.0` 目录。 + +``` +$ ls +CMakeCache.txt +CMakeFiles +Makefile +Hello-1.0 +cmake_install.cmake +``` + +接下来,你可以进行构建。你可以使用 CMake 的 `--build` 选项来做这件事,使用当前的构建目录作为源目录。 + +``` +$ cmake --build . +Scanning dependencies of target Hello +[ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o +[100%] Linking C executable Hello +[100%] Built target Hello +``` + +或者你可以运行 `make` 命令。这将读取由 CMake 生成的 `Makefile` 文件。在这个例子中,`make` 默认的行为就是由源程序 `hello.c` 生成目标文件。 + +``` +$ make +Scanning dependencies of target Hello +[ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o +[100%] Linking C executable Hello +[100%] Built target Hello +$ +``` + +如你所料,`Hello` 二进制可执行文件现在存在于当前的构建目录中。因为它是一个简单的自包含应用程序,所以你可以运行它进行测试: + +``` +$ ./Hello +Hello open source +$ +``` + +最后,你可以用 `--install` 选项进行安装。因为我不希望我的简单的 “hello world” 应用程序真的被安装到我的系统上,我设置了 `--prefix` 选项,将 CMake 的目标从根目录(`/`)重定向到 `/tmp` 的一个子目录。 + +``` +$ cmake --install . --prefix /tmp/hello/ +-- Install configuration: "" +-- Installing: /tmp/dist-hello/usr/local/bin/Hello +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0 +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0 +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1 +``` + +另外,你也可以运行 `make install` 来调用 `Makefile` 的安装动作。同样,为了避免在我的系统上安装一个演示程序,我在这个例子中设置了 `DESTDIR` 变量,将安装目标重定向到 `/tmp` 的一个子目录: + +``` +$ mkdir /tmp/dist-hello +$ make install DESTDIR=/tmp/dist-hello +[100%] Built target Hello +Install the project... +-- Install configuration: "" +-- Installing: /tmp/dist-hello/usr/local/bin/Hello +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0 +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0 +-- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1 +``` + +看一下输出的内容,来确定它具体的安装位置,这个程序已经安装好了。 + +### 快速自定义 + +CMake 的安装前缀(由 `CMAKE_INSTALL_PREFIX` 变量指定)默认是在 `/usr/local` 这个位置,但是所有的 CMake 变量都可以在你运行 `cmake` 命令的时候,加一个 `-D` 选项来改变它。 + +``` +$ cmake -DCMAKE_INSTALL_PREFIX=/usr .. +$ make install DESTDIR=/tmp/dist-hello +$ make install DESTDIR=/tmp/dist-hello +[100%] Built target Hello +Install the project... +-- Install configuration: "" +-- Installing: /tmp/dist-hello/usr/bin/Hello +-- Installing: /tmp/dist-hello/usr/share/Hello-1.0 +-- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file0 +-- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file1 +``` + +所有由 CMake 使用的变量都可以通过这种方式来修改。 + +### 交互式的 CMake + +CMake 的交互模式是一种用于配置安装环境的友好而有用的方法。要让用户知道该项目使用的所有可能的 CMake 变量是一件工作量很大的事,因此 CMake 交互式界面是他们无需查看 `Makefile` 和 `CMakeLists` 即可发现自定义选项的简便方法。 + +为了调用这个交互式的 CMake,使用 `ccmake` 命令,在这个简单的项目里没有太多的东西。但是对于像 [Rosegarden][11] 这样的大型项目,这将非常有用。 + +![Rosegarden][12] + +### CMake 的更多知识 + +还有很多很多的 CMake 知识需要去了解。作为一个开发者,我非常喜欢它简洁的语法、详尽的文档、可扩展性以及便捷性。作为一个用户我非常喜欢 CMake 友好且实用的错误提示信息还有它的用户界面,如果你的项目还未开始使用构建系统,请了解一下 CMake 吧。你以及以后尝试打包你应用程序的任何人都不会后悔。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/cmake + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[amwps290](https://github.com/amwps290) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/build_structure_tech_program_code_construction.png?itok=nVsiLuag "Someone wearing a hardhat and carrying code " +[2]: https://opensource.com/article/19/7/introduction-gnu-autotools +[3]: https://opensource.com/article/19/11/pkgsrc-netbsd-linux +[4]: http://cmake.org +[5]: https://opensource.com/article/20/11/macports +[6]: https://opensource.com/article/20/6/homebrew-linux +[7]: https://opensource.com/article/20/3/chocolatey +[8]: https://cmake.org/download +[9]: https://opensource.com/article/19/3/netbsd-raspberry-pi +[10]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[11]: https://opensource.com/article/18/3/make-sweet-music-digital-audio-workstation-rosegarden +[12]: https://opensource.com/sites/default/files/uploads/rosegarden-ccmake.jpg "Rosegarden" +[13]: https://creativecommons.org/licenses/by-sa/4.0/ +[14]: https://cmake.org/cmake/help/latest/ diff --git a/published/202105/20210515 What Python 3.3 did to improve exception handling in your code.md b/published/202105/20210515 What Python 3.3 did to improve exception handling in your code.md new file mode 100644 index 0000000000..0e22667170 --- /dev/null +++ b/published/202105/20210515 What Python 3.3 did to improve exception handling in your code.md @@ -0,0 +1,191 @@ +[#]: subject: (What Python 3.3 did to improve exception handling in your code) +[#]: via: (https://opensource.com/article/21/5/python-33) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13439-1.html) + +Python 3.3 为改进代码中的异常处理所做的工作 +====== + +> 探索异常处理和其他未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/29/221357mxpj2kitltdez6zj.jpg) + +这是 Python 3.x 首发特性系列文章的第四篇。Python 3.3 于 2012 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有得到充分利用,而且相当酷。下面是其中的三个。 + +### yield from + +`yield` 关键字使 Python 更加强大。可以预见的是,人们都开始使用它来创建整个迭代器的生态系统。[itertools][2] 模块和 [more-itertools][3] PyPI 包就是其中两个例子。 + +有时,一个新的生成器会想要使用一个现有的生成器。作为一个简单的(尽管有点故意设计)的例子,设想你想枚举所有的自然数对。 + +一种方法是按照“自然数对的和,自然数对的第一项”的顺序生成所有的自然数对。用 `yield from` 来实现这个方法是很自然的。 + +`yield from ` 关键字是以下的简称: + +``` +for item in x: +    yield item +``` + +``` +import itertools + +def pairs(): + for n in itertools.count(): + yield from ((i, n-i) for i in range(n+1)) +``` + +``` +list(itertools.islice(pairs(), 6)) +``` + +``` + [(0, 0), (0, 1), (1, 0), (0, 2), (1, 1), (2, 0)] +``` + +### 隐式命名空间包 + +假设有一个叫 Parasol 的虚构公司,它制造了一堆东西。它的大部分内部软件都是用 Python 编写的。虽然 Parasol 已经开源了它的一些代码,但其中一些代码对于开源来说过于专有或专业。 + +该公司使用内部 [DevPI][4] 服务器来管理内部软件包。对于 Parasol 的每个 Python 程序员来说,在 PyPI 上找一个未使用的名字是没有意义的,所以所有的内部包都被称为 `parasol..`。遵守最佳实践,开发人员希望包的名字能反映出这个命名系统。 + +这一点很重要!如果 `parasol.accounting.numeric_tricks` 包安装了一个名为 `numeric_tricks` 的顶层模块,这意味着依赖这个包的人将无法使用名为 `numeric_tricks` 的 PyPI 包,不管它写的有多好。 + +然而,这给开发者留下了一个两难的选择:哪个包拥有 `parasol/__init__.py` 文件?从 Python 3.3 开始,最好的解决办法是把 `parasol`,可能还有 `parasol.accounting`,变成没有 `__init__.py` 文件的 [命名空间包][5]。 + +### 抑制异常的上下文 + +有时,在从异常中恢复的过程中出现的异常是一个问题,有上下文来跟踪它是很有用的。然而,有时却不是这样:异常已经被处理了,而新的情况是一个不同的错误状况。 + +例如,想象一下,在字典中查找一个键失败后,如果不能分析它,则希望失败并返回 `ValueError()`。 + +``` +import time + +def expensive_analysis(data): +    time.sleep(10) +    if data[0:1] == ">": +        return data[1:] +    return None +``` + +这个函数需要很长的时间,所以当你使用它时,想要对结果进行缓存: + +``` +cache = {} + +def last_letter_analyzed(data): +    try: +        analyzed = cache[data] +    except KeyError: +        analyzed = expensive_analysis(data) +        if analyzed is None: +            raise ValueError("invalid data", data) +        cached[data] = analyzed +    return analyzed[-1] +``` + +不幸的是,当出现缓存没有命中时,回溯看起来很难看: + +``` +last_letter_analyzed("stuff") +``` + +``` + --------------------------------------------------------------------------- + + KeyError Traceback (most recent call last) + + in last_letter_analyzed(data) + 4 try: + ----> 5 analyzed = cache[data] + 6 except KeyError: + + + KeyError: 'stuff' +``` + +在处理上述异常的过程中,发生了另一个异常: + +``` + ValueError Traceback (most recent call last) + + in + ----> 1 last_letter_analyzed("stuff") + + + in last_letter_analyzed(data) + 7 analyzed = expensive_analysis(data) + 8 if analyzed is None: + ----> 9 raise ValueError("invalid data", data) + 10 cached[data] = analyzed + 11 return analyzed[-1] + + + ValueError: ('invalid data', 'stuff') +``` + +如果你使用 `raise ... from None`,你可以得到更多可读的回溯: + +``` +def last_letter_analyzed(data): + try: + analyzed = cache[data] + except KeyError: + analyzed = expensive_analysis(data) + if analyzed is None: + raise ValueError("invalid data", data) from None + cached[data] = analyzed + return analyzed[-1] +``` + +``` +last_letter_analyzed("stuff") +``` + +``` + --------------------------------------------------------------------------- + + ValueError Traceback (most recent call last) + + in + ----> 1 last_letter_analyzed("stuff") + + + in last_letter_analyzed(data) + 5 analyzed = expensive_analysis(data) + 6 if analyzed is None: + ----> 7 raise ValueError("invalid data", data) from None + 8 cached[data] = analyzed + 9 return analyzed[-1] + + + ValueError: ('invalid data', 'stuff') +``` + +### 欢迎来到 2012 年 + +尽管 Python 3.3 在十年前就已经发布了,但它的许多功能仍然很酷,而且没有得到充分利用。如果你还没有,就把它们添加到你的工具箱中吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-33 + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://docs.python.org/3/library/itertools.html +[3]: https://more-itertools.readthedocs.io/en/stable/ +[4]: https://opensource.com/article/18/7/setting-devpi +[5]: https://www.python.org/dev/peps/pep-0420/ diff --git a/published/202105/20210516 How to install a Desktop Environment (GUI) on Ubuntu Server.md b/published/202105/20210516 How to install a Desktop Environment (GUI) on Ubuntu Server.md new file mode 100644 index 0000000000..a03a8f6d54 --- /dev/null +++ b/published/202105/20210516 How to install a Desktop Environment (GUI) on Ubuntu Server.md @@ -0,0 +1,263 @@ +[#]: subject: "How to install a Desktop Environment (GUI) on Ubuntu Server" +[#]: via: "https://itsfoss.com/install-gui-ubuntu-server/" +[#]: author: "Chris Patrick Carias Stas https://itsfoss.com/author/chris/" +[#]: collector: "lujun9972" +[#]: translator: "lxbwolf" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13408-1.html" + +如何在 Ubuntu 服务器上安装桌面环境(GUI) +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/20/110026zm3mmam0iztaaczz.jpg) + +你想在你的 Ubuntu 服务器上安装 GUI 吗?大部分情况下你是可以安装的,在本教程中我会详细介绍安装的步骤。 + +在正式开始之前,我来告诉你为什么服务器版的 Ubuntu 不带 GUI,以及在什么情况下你可以在服务器上安装 GUI。 + +### 为什么 Ubuntu 服务器没有 GUI? + +你对比过 Ubuntu 的桌面版和服务器版会发现,两者的主要区别是服务器版缺少 GUI(比如 [桌面环境][1])。Ubuntu 服务器基本上就是桌面版去掉图形模块后的降级版本。 + +这是刻意为之的。Linux 服务器需要占用系统资源来运行服务。图形化桌面环境会消耗大量的系统资源,因此服务器操作系统默认不包含桌面环境。 + +你可以在只有 512 MB RAM 的机器上使用 Ubuntu 服务器,但是 Ubuntu 桌面需要至少 2 GB 的 RAM 才能提供正常的功能。在服务器运行桌面环境被认为是浪费资源。 + +作为一个服务器使用者(或系统管理员),你应该通过命令行来使用和管理你的系统。为了达到这个水平,你需要掌握丰富的 Linux 命令相关的知识。 + +![Typically, you have to manage a server from the command line][2] + +### 你是否真正需要在你的服务器上安装 GUI? + +有些用户可能不太习惯在终端下使用命令行来完成工作。毕竟大部分用户是有条件通过图形界面操作计算机的。 + +你可能会在你的服务器上安装桌面环境并使用图形界面。大部分人不会这么干,但这是可行的。 + +但是这只有在你可以直接操作服务器时才行得通。假设你是在物理机器上运行它,比如服务器、台式机或笔记本电脑,抑或类似树莓派的设备。如果你可以直接操作宿主机系统,那么你还可以在运行在虚拟机上的服务器上安装。 + +如果你是通过 [云服务器提供商如 Linode、DigitalOcean 或 AWS][3] 部署的服务器,那么安装 GUI 就行不通了。如果你想通过图形界面来管理你的远程服务器,你可以使用 Webmin 或 [Cockpit][4] 等工具。你可以在 Web 浏览器中通过这些工具使用和管理你的服务器。相比于成熟的桌面环境,它能大大降低资源消耗。 + +![Tools like Cockpit allow managing Linux servers graphically][5] + +### 如何在 Ubuntu 服务器上安装 GUI? + +当你了解了基础知识后,我们一起来看看在 Ubuntu 服务器上安装桌面环境的步骤。 + +你需要做以下准备: + + * 已经配置好 Ubuntu 服务器,且 RAM 至少 2 GB + * 管理员权限(你需要用 `sudo` 执行命令) + * 网络连接正常(你需要下载和安装新包) + +我是在虚拟机上安装的 Ubuntu 服务器,并且我可以直接操作宿主机器。我使用同样的方法[在树莓派上安装了 Ubuntu 服务器][6]。 + +> 注意! +> +> 如果你是出于学习和调研等实验性的目的,那么你可以进行这些操作。请不要在生产环境的服务器上添加 GUI。后续删除 GUI 时可能会导致依赖问题,有些情况会破坏系统。 + +#### 准备系统 + +首先,因为你将要做一些系统级的修改,因此先进行更新和升级以确保我们系统的包是最新的: + +``` +sudo apt update && sudo apt upgrade +``` + +#### 安装桌面环境 + +更新结束后,你就可以安装桌面环境了。 + +有两种方法: + + * 使用 [apt][7] 来安装包 + * 使用一个名为 [tasksel][8] 的 Debian 工具,这个工具可以通过一条龙处理(任务)方式来安装多个包 + +任何一种方法都可以用完整包的方式来安装完整的桌面环境,就跟你从头安装桌面版本一样。我的意思是你可以得到跟桌面版本一样的所有的默认应用程序和工具。 + +如果你想使用 `tasksel`,需要先用下面的命令安装它: + +``` +sudo apt install tasksel +``` + +执行结束后,你就可以用 `tasksel` 来安装桌面环境(也叫 DE)了。 + +你可能知道有 [很多可用的桌面环境][9]。你可以选择自己喜欢的一个。有些桌面环境对系统资源占用得多(像 GNOME),有些占用得少(像 Xfce、MATE 等等)。 + +你可以自己决定使用哪个 DE。我会安装 [GNOME 桌面][10],因为它是 Ubuntu 默认的桌面。之后我也会介绍其他桌面的安装。 + +如果你使用的是 `tasksel`,执行下面这条命令: + +``` +sudo tasksel install ubuntu-desktop +``` + +如果你使用 `apt`,执行下面这条命令: + +``` +sudo apt install ubuntu-desktop +``` + +这个过程可能会持续几分钟到一个小时,执行速度取决于你的网速和硬件。 + +我想提醒下,上面两个命令执行后都会安装完整的 GNOME 桌面环境。在本文中我两个命令都会执行,两个命令的结果是一样的。 + +#### 安装和配置显示管理器 + +安装完成后,你需要一个名为 [显示管理器][11] 或“登录管理器”的组件。这个工具的功能是在管理用户对话和鉴权时启动 [显示服务器][12] 并加载桌面。 + +GNOME 桌面默认使用 GDM3 作为显示管理器,但从资源角度考虑它有点重。你可以使用更轻量级和资源友好的管理器。这里我们使用一个平台无关的显示管理器 [lightdm][13]。使用 `apt` 安装它: + +``` +sudo apt install lightdm +``` + +安装 lightdm 时系统会让我们选择默认的显示管理器,因为即使你可以安装多个管理器,也只能运行一个。 + +![Use the arrow key to select an option and then use the tab key to select and press enter][14] + +选择列表中的 “lightdm” 并点击 “\”。这应该用不了几分钟。完成后你可以用下面的命令启动显示管理器并加载 GUI: + +``` +sudo service lightdm start +``` + +你可以使用下面的命令来检查当前的显示管理器: + +``` +cat /etc/X11/default-display-manager +``` + +运行后得到的结果类似这样: + +![Checking the default Display Manager][15] + +如果一切顺利,你现在会来到欢迎界面。 + +![Greetings screen of GNOME Desktop with LightDM on an Ubuntu server][16] + +输入你的凭证,你的桌面就运行起来了。 + +![GNOME Desktop fully loaded on Ubutnu server][17] + +如果你想关闭 GUI,那么打开一个终端并输入: + +``` +sudo service lightdm stop +``` + +#### 安装其他的桌面环境(可选) + +前面我说过我们可以选择不同的桌面。我们一起来看看一些其他的选项: + +##### MATE + +[MATE][18] 是基于 GNOME2 源码的轻量级桌面,它完全开源,是一个不错的选项。 + +用下面的命令来安装 MATE: + +``` +sudo tasksel install ubuntu-mate-core +``` + +或 + +``` +sudo apt install ubuntu-mate-core +``` + +##### Lubuntu / LXDE/LXQT + +如果你的系统资源有限或者电脑很旧,那么我推荐另一个轻量级的 [Lubuntu][19]。使用下面的命令安装它: + +``` +sudo tasksel install lubuntu-core +``` + +或 + +``` +sudo apt install lubuntu-core +``` + +##### Xubuntu / Xfce + +[Xubuntu][20] 是基于 [Xfce][21] 的 Ubuntu 衍生版,轻量、简单、稳定但可高度定制。如果你想使用它,执行下面的命令: + +``` +sudo tasksel install xubuntu-core +``` + +或 + +``` +sudo apt install xubuntu-core +``` + +还有一些桌面没有列出来,像 [KDE][22],[Cinnamon][23] 和 [Budgie][24],不代表它们不好,它们也都是非常卓越的,你可以自己尝试安装它们。 + +### 如何从 Ubuntu 服务器上删除 GUI? + +如果你觉得桌面环境占用了太多的计算资源,你可以把之前安装的包删除掉。 + +请注意在某些情况下删除 GUI 可能会带来依赖问题,因此请备份好重要数据或创建一个系统快照。 + +- [如何从 Ubuntu 上删除包][25] + +``` +sudo apt remove ubuntu-desktop +sudo apt remove lightdm +sudo apt autoremove +sudo service lightdm stop +``` + +现在重启你的系统。你应该回到了正常的命令行登录。 + +### 结语 + +在大多数场景下是可以安装桌面 GUI 的。如果你不适应命令行,那么请使用类似 [YunoHost][26] 的发行版的服务器,YunoHost 基于 Debian 系统,你可以通过 GUI 来管理服务器。 + +上面说了,如果你是从头安装系统,那么我建议你使用桌面版本以避免后续的步骤。 + +如果你有任何问题,请在评论区留言。你会在服务器上使用 GUI 吗?参照本文后你遇到了什么问题吗? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-gui-ubuntu-server/ + +作者:[Chris Patrick Carias Stas][a] +选题:[lujun9972][b] +译者:[lxbwolf](https://github.com/lxbwolf) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/chris/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/what-is-desktop-environment/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/system-restart-required.png?resize=800%2C469&ssl=1 +[3]: https://linuxhandbook.com/free-linux-cloud-servers/ +[4]: https://linuxhandbook.com/cockpit/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/cockpit-2-2.png?resize=800%2C450&ssl=1 +[6]: https://itsfoss.com/install-ubuntu-server-raspberry-pi/ +[7]: https://itsfoss.com/apt-command-guide/ +[8]: https://manpages.ubuntu.com/manpages/bionic/man8/tasksel.8.html +[9]: https://itsfoss.com/best-linux-desktop-environments/ +[10]: https://www.gnome.org/ +[11]: https://itsfoss.com/display-manager/ +[12]: https://itsfoss.com/display-server/ +[13]: https://wiki.debian.org/LightDM +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-select-dm.png?resize=799%2C354&ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-default.png?resize=800%2C68&ssl=1 +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-gnome-desktop-greet.png?resize=798%2C600&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-gnome-desktop.png?resize=792%2C597&ssl=1 +[18]: https://mate-desktop.org/ +[19]: https://lubuntu.net/ +[20]: https://xubuntu.org/ +[21]: https://www.xfce.org/ +[22]: https://itsfoss.com/install-kde-on-ubuntu/ +[23]: https://itsfoss.com/install-cinnamon-on-ubuntu/ +[24]: https://itsfoss.com/install-budgie-ubuntu/ +[25]: https://itsfoss.com/uninstall-programs-ubuntu/ +[26]: https://yunohost.org/ \ No newline at end of file diff --git a/published/202105/20210516 Looking back at what Python 3.4 did for enum.md b/published/202105/20210516 Looking back at what Python 3.4 did for enum.md new file mode 100644 index 0000000000..3c83459607 --- /dev/null +++ b/published/202105/20210516 Looking back at what Python 3.4 did for enum.md @@ -0,0 +1,204 @@ +[#]: subject: (Looking back at what Python 3.4 did for enum) +[#]: via: (https://opensource.com/article/21/5/python-34-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13443-1.html) + +回顾一下 Python 3.4 中的枚举 +====== + +> 另外探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202105/30/230947j19r2772m12tccrh.jpg) + +这是 Python 3.x 首发特性系列文章的第五篇。Python 3.4 在 2014 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有被充分利用,而且相当酷。下面是其中的三个。 + +### 枚举 + +我最喜欢的逻辑谜题之一是自我描述的 [史上最难的逻辑谜题][2]。在其中,它谈到了三个“神”,他们被称为 A、B 和 C,他们的身份是真、假和随机,按一定顺序排列。你可以问他们问题,但他们只用神的语言回答,其中 “da” 和 “ja” 表示 “是” 和 “不是”,但你不知道哪个是哪个。 + +如果你决定使用 Python 来解决这个问题,你将如何表示神的名字和身份以及神的语言中的词语?传统的答案是使用字符串。然而,字符串的拼写错误可能会带来灾难性的后果。 + +如果在解题的关键部分,你用字符串 “jaa” 而不是 “ja” 进行比较,你就会得到一个错误的答案。虽然谜题没有说明风险是什么,但这可能是最好的避免方式。 + +`enum` 模块让你能够以一种可调试但安全的方式来定义这些东西: + +``` +import enum + +@enum.unique +class Name(enum.Enum): + A = enum.auto() + B = enum.auto() + C = enum.auto() + +@enum.unique +class Identity(enum.Enum): + RANDOM = enum.auto() + TRUE = enum.auto() + FALSE = enum.auto() + + +@enum.unique +class Language(enum.Enum): + ja = enum.auto() + da = enum.auto() +``` + +枚举的一个好处是,在调试日志或异常中,枚举的呈现方式是有帮助的: + +``` +name = Name.A +identity = Identity.RANDOM +answer = Language.da +print("I suspect", name, "is", identity, "because they answered", answer) +``` + +``` + I suspect Name.A is Identity.RANDOM because they answered Language.da +``` + +### functools.singledispatch + +在开发游戏的“基础设施”层时,你想通用地处理各种游戏对象,但仍然允许这些对象自定义动作。为了使这个例子更容易解释,假设这是一个基于文本的游戏。当你使用一个对象时,大多数情况下,它只会打印 `You are using `。但是使用一把特殊的剑可能需要随机滚动,否则会失败。 + +当你获得一个物品时,它通常会被添加到库存中。然而,一块特别重的石头会砸碎一个随机物品。如果发生这种情况,库存中会失去该物体。 + +处理这个问题的一个方法是在物品上设置 `use` 和 `acquire` 方法。随着游戏复杂性的增加,这些方法会越来越多,使游戏对象变得难以编写。 + +相反,`functools.singledispatch` 允许你以安全和尊重命名空间的方式追溯性地添加方法。 + +你可以定义没有行为的类: + +``` +class Torch: + name="torch" + +class Sword: + name="sword" + +class Rock: + name="rock" +``` + +``` +import functools + +@functools.singledispatch +def use(x): + print("You use", x.name) + +@functools.singledispatch +def acquire(x, inventory): + inventory.add(x) +``` + +对于火炬来说,这些通用的实现已经足够了: + +``` +inventory = set() + +def deploy(thing): + acquire(thing, inventory) + use(thing) + print("You have", [item.name for item in inventory]) + +deploy(Torch()) +``` + +``` + You use torch + You have ['torch'] +``` + +然而,剑和石头需要一些专门的功能: + +``` +import random + +@use.register(Sword) +def use_sword(sword): + print("You try to use", sword.name) + if random.random() < 0.9: + print("You succeed") + else: + print("You fail") + +deploy(sword) +``` + +``` + You try to use sword + You succeed + You have ['sword', 'torch'] +``` + +``` +import random + +@acquire.register(Rock) +def acquire_rock(rock, inventory): + to_remove = random.choice(list(inventory)) + inventory.remove(to_remove) + inventory.add(rock) + +deploy(Rock()) +``` + +``` + You use rock + You have ['sword', 'rock'] +``` + +岩石可能压碎了火炬,但你的代码更容易阅读。 + +### pathlib + +从一开始,Python 中文件路径的接口就是“智能字符串操作”。现在,通过 `pathlib`,Python 有了一种面向对象的方法来操作路径。 + +``` +import pathlib +``` + +``` +gitconfig = pathlib.Path.home() / ".gitconfig" +text = gitconfig.read_text().splitlines() +``` + +诚然,用 `/` 作为操作符来生成路径名有点俗气,但在实践中却不错。像 `.read_text()` 这样的方法允许你从小文件中获取文本,而不需要手动打开和关闭文件句柄。 + +这使你可以集中精力处理重要的事情: + +``` +for line in text: + if not line.strip().startswith("name"): + continue + print(line.split("=")[1]) +``` + +``` + Moshe Zadka +``` + +### 欢迎来到 2014 年 + +Python 3.4 大约在七年前就发布了,但是在这个版本中首次出现的一些功能非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-34-features + +作者:[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/math_money_financial_calculator_colors.jpg?itok=_yEVTST1 (old school calculator) +[2]: https://en.wikipedia.org/wiki/The_Hardest_Logic_Puzzle_Ever diff --git a/published/202105/20210519 1Password for Linux Is Officially Here With Brand New Features.md b/published/202105/20210519 1Password for Linux Is Officially Here With Brand New Features.md new file mode 100644 index 0000000000..f56c1c4ea5 --- /dev/null +++ b/published/202105/20210519 1Password for Linux Is Officially Here With Brand New Features.md @@ -0,0 +1,80 @@ +[#]: subject: (1Password for Linux Is Officially Here With Brand New Features) +[#]: via: (https://news.itsfoss.com/1password-linux-released/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13416-1.html) + +全新 1Password for Linux 正式推出 +====== + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/1password-linux-feat.png?w=1200&ssl=1) + +1Password 是一个相当不错的密码管理器(尽管不是开源的),在开源社区也有很好的口碑。他们甚至 [为从事开源项目的用户提供免费的团队成员资格][1]。 + +它的 Linux 桌面客户端已经处于测试阶段,但现在它已经准备好进入黄金时间。 + +他们已经正式 [宣布][2] 推出 1Password Linux 版,具有完整的桌面体验,可以与你的网络浏览器集成。 + +它还亮相了一些很快会进入 Android、iOS、Mac 和 Windows **的新功能**。 + +在这里,我要安利一下,Linux 上的 1Password 值得期待。 + +### 1Password Linux 桌面客户端 + +虽然它可以作为浏览器扩展而无需考虑平台,但桌面客户端的出现使体验更好。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/1pass-account-dark.png?w=1280&ssl=1) + +桌面客户端内置了基于 GTK 主题的**黑暗模式支持**。它还能与 **GNOME、KDE 和你选择的任何其他窗口管理器**很好地整合。 + +看起来他们也在更多的细节上花费了心思,因此桌面客户端也支持**系统托盘图标**,即使你关闭了它也能保持活跃。 + +你可以用它直接在你的默认浏览器上自动填入密码。不过,虽然它提到了 **X11 剪贴板集成和支持**,但没有提到 Wayland。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/1pass-screenshot.png?w=1280&ssl=1) + +它还包括了对 GNOME 钥匙环和 KDE 钱包的支持、内核钥匙环的集成、与系统锁定和闲置服务的集成。 + +除了这些,1Password for Linux 还首次推出了新的功能,这些功能将很快用于其他平台。 + + * 安全文件附件 + * 项目归档和删除功能,以便更好地组织文件 + * Watchtower 仪表板,检查和评估你的密码安全状况 + * 新的共享细节,查看谁可以访问什么 + * 快速查找和智能搜索建议 + * 翻新的外观和感觉 + +如果你想了解该版本以及他们对开源和 Linux 社区的计划,请浏览 [官方公告][2]。 + +### 在 Linux 中安装 1Password + +其官方称,该桌面客户端支持几个 Linux 发行版,包括 Ubuntu、 Debian、 Arch Linux、 Fedora、 CentOS 和 RHEL。你可以得到用来安装的 **.deb** 和 **.rpm** 软件包,或者使用软件包管理器找到它们。 + +- [下载 1Password for Linux][4] + +它也有一个可用的 [snap 包][5],你可以参考我们的 [在 Linux 中使用 snap][6] 的指南。 + +关于安装的更多信息,你也可以参考 [官方说明][7]。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/1password-linux-released/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/1password-free-subscriptions/ +[2]: https://blog.1password.com/welcoming-linux-to-the-1password-family/ +[4]: https://1password.com/downloads/linux/ +[5]: https://snapcraft.io/1password +[6]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/ +[7]: https://support.1password.com/install-linux/ diff --git a/published/202105/20210519 What is serverless with Java.md b/published/202105/20210519 What is serverless with Java.md new file mode 100644 index 0000000000..48b28c8514 --- /dev/null +++ b/published/202105/20210519 What is serverless with Java.md @@ -0,0 +1,80 @@ +[#]: subject: (What is serverless with Java?) +[#]: via: (https://opensource.com/article/21/5/what-serverless-java) +[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) +[#]: collector: (lujun9972) +[#]: translator: (DCOLIVERSUN) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13429-1.html) + +什么是 Java 的无服务器化? +====== + +> Java 仍是开发企业应用程序最流行的语言之一。那么,为什么无服务器serverless开发人员对它望而却步? + +![](https://img.linux.net.cn/data/attachment/album/202105/27/090038pd7ff7x0yohh38nd.jpg) + +几十年来,企业已经在各类平台上开发了关键业务应用程序,包括物理服务器、虚拟机和云环境。这些应用程序在各行各业都有一个共同点,那就是无论需求如何,它们都需要持续可用(24x7x365),保证稳定性、可靠性和性能。因此,即使实际资源利用率低于 50%,每个企业都必须付出高额成本维护基础架构(如 CPU、内存、磁盘、网络等)。 + +无服务器架构是为了帮助解决这些问题而产生的。无服务器允许开发人员按需构建和运行应用程序,保证高可用性,不必在多云和混合云环境中管理服务器。在幕后,无服务器拓扑中仍有很多服务器,但它们是从应用程序开发中抽象出来的。相反,云提供商使用无服务器进行资源管理,例如配置、维护、联网和扩展服务器实例。 + +由于其高效性,无服务器开发模式现在是一些企业的需求,这些企业希望按需启动服务,而不是一直运行服务。 + +许多新建的开源项目用来在 [Kubernetes][2] 集群上通过 Linux 容器包来管理无服务器应用程序。CNCF 的《[交互式无服务器全景][3]》 是一份关于开源项目、工具、框架和公共云平台的指南,帮助 DevOps 团队处理无服务器应用程序。 + +![CNCF Serverless Landscape][4] + +开发人员可以编写代码,然后将其快速部署到各种无服务器环境中。然后,无服务器应用程序响应需求,并根据需要自动伸缩扩展。 + +你可能想知道什么编程语言和运行环境最适合无服务器应用程序开发,以便与上图中的技术集成。这个问题不只一个答案,但是让我们退一步来讨论在企业生产环境中开发业务应用程序最流行的应用程序运行环境:Java。 + +据 [Developer Economics][6] 称,截至 2020 年第三季度,仍有 800 多万家企业开发人员在使用 Java 来实现其业务需求。然而,根据 2020 年的一项调查,Java(占比 6%)显然不是有前瞻意识的开发人员的首选,他们使用当前云服务做开发。 + +![NewRelic data on serverless runtimes and languages][8] + +*来自 NewRelic 无服务器基准报告的数据(Daniel Oh, [CC BY-SA 4.0][9])* + +资源使用、响应时间和延迟在无服务器开发中至关重要。公有云提供商提供的无服务器产品通常是按需计量的,只有在无服务器应用程序启动时,才会通过事件驱动的执行模式收费。因此,当无服务器应用程序闲置或缩减为零时,企业无需支付任何费用。 + +### 带有容器的 Java 状态 + +在这种背景下,你可能会问:“_既然现有业务应用程序很可能是在 Java 技术上开发的,那么开发人员为什么不尝试使用 Java 栈进行无服务器应用程序开发呢?_” + +隐藏的真相是:很难在新的不可变更的基础设施(例如 Kubernetes 这样的容器平台)中优化 Java 应用程序。 + +![Differences in memory resource usage][10] + +该图描述了 Java 进程与竞争的语言、框架(如 [Node.js][11] 和 [Go][12])之间内存资源使用的差异。Java HotSpot 占用资源最大,其中包括每个Java 虚拟机Java Virtual Machine(JVM)实例分配的堆内存。中间显示了 Node.js 每个进程要比 Java 小得多。最后,Go 是一种流行的云服务编程语言,因为它的内存消耗最低。 + +如你所见,当你在这张图从左到右走,你会看到更密的节点。这就是开发人员在云、容器和 Kubernetes 上编写无服务器应用程序时回避 Java(包括 [Spring Boot][13],一种顽固的微服务 Java 框架)的原因。 + +### 下一步是什么? + +企业可以通过实现无服务器应用程序获得明显的好处,但是资源密度问题导致他们避免使用 Java 堆栈在 Kubernetes 上开发无服务器应用程序开发。但是选择其他语言会给全球数百万 Java 开发人员带来学习负担。因此,在本系列的下一篇文章中,我将指导你如何开始使用 Java 无服务器函数,而不是使用其他语言。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/what-serverless-java + +作者:[Daniel Oh][a] +选题:[lujun9972][b] +译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN) +校对:[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/java-coffee-mug.jpg?itok=Bj6rQo8r (Coffee beans and a cup of coffee) +[2]: https://opensource.com/article/19/6/reasons-kubernetes +[3]: https://landscape.cncf.io/serverless?zoom=150 +[4]: https://opensource.com/sites/default/files/uploads/cncf-serverless-landscape.png (CNCF Serverless Landscape) +[5]: https://github.com/cncf/landscape/blob/master/LICENSE +[6]: https://developereconomics.com/ +[7]: https://newrelic.com/resources/ebooks/serverless-benchmark-report-aws-lambda-2020 +[8]: https://opensource.com/sites/default/files/uploads/newrelic_serverlessbenchmarkreport.png (NewRelic data on serverless runtimes and languages) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://opensource.com/sites/default/files/uploads/java-containers.png (Differences in memory resource usage) +[11]: https://nodejs.org/ +[12]: https://golang.org/ +[13]: https://spring.io/projects/spring-boot diff --git a/published/202105/20210520 Remap your Caps Lock key on Linux.md b/published/202105/20210520 Remap your Caps Lock key on Linux.md new file mode 100644 index 0000000000..2695eb3d9d --- /dev/null +++ b/published/202105/20210520 Remap your Caps Lock key on Linux.md @@ -0,0 +1,136 @@ +[#]: subject: (Remap your Caps Lock key on Linux) +[#]: via: (https://opensource.com/article/21/5/remap-caps-lock-key-linux) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13414-1.html) + +在 Linux 上重新映射你的大写锁定键 +====== + +> 通过在 GNOME 3 和 Wayland 上重新映射你的键盘,提高你的打字和导航速度,避免重复性压力伤害。 + +![](https://img.linux.net.cn/data/attachment/album/202105/22/174755hs0dbmm4idl5rbrr.jpg) + +对我来说,有许多改变生活的 Linux 时刻,但大多数都在成为现状后淡忘了。有一个 Linux 教给我的键盘小技巧,每次我使用它的时候(也许每天有 1000 次),我都会想起这件事,那就是把大写锁定键转换为 `Ctrl` 键。 + +我从不使用大写锁定键,但我整天使用 `Ctrl` 键进行复制、粘贴、在 [Emacs][2] 内导航,以及 [调用 Bash][3]、[GNU Screen][4] 或 [tmux][5] 等操作。大写锁定键在我的键盘上占据了宝贵的空间,而将实际上有用的 `Ctrl` 键挤到了难以触及的底部角落。 + +![手指放在键盘上][6] + +*这看起来就痛苦* + +重新映射 `Ctrl` 提高了我的打字和导航速度,并可能使我免受重复性压力伤害。 + +### 消失的控制 + +系好安全带,这是个过山车式的历史课。 + +对于像我这样的大写锁定键交换者来说,不幸的是,当 GNOME 3 问世时,它几乎删除了改变 `Ctrl` 键位置的功能。 + +幸运的是,优秀的 GNOME Tweaks 应用程序带回了这些 “失踪” 的控制面板。 + +不幸的是,[GNOME 40][8] 没有 GNOME Tweaks 应用程序(还没有?) + +另外,不幸的是,过去在 X11 上可以工作的老的 `xmodmap` 技巧在新的 [Wayland 显示服务器][9] 上没有用。 + +有一小段时间(最多一个下午),我觉得对于那些讨厌大写锁定键的人来说人生都灰暗了。然后我想起我是一个开源的用户,总有一种方法可以解决诸如被忽略的 GUI 控制面板之类的简单问题。 + +### dconf + +GNOME 桌面使用 dconf,这是一个存储重要配置选项的数据库。它是 GSettings 的后端,GSettings 是 GNOME 系统应用程序需要发现系统偏好时的接口。你可以使用 `gsetting` 命令查询 dconf 数据库,也可以使用 `dconf` 命令直接设置 dconf 的键值。 + +### GSettings + +dconf 数据库不一定是你可能称为可发现的数据库。它是一个不起眼的数据库,你通常不需要去考虑它,它包含了许多通常无需直接交互的数据。然而,如果你想更好地了解 GNOME 所要管理的所有偏好选项,那么浏览它是很有趣的。 + +你可以用 `list-schemas` 子命令列出所有 dconf 的模式。在浏览了数百个模式之后,你可以使用 [grep][10] 将你的注意力缩小到一些看起来特别相关的东西上,比如 `org.gnome.desktop`。 + +``` +$ gsettings list-schemas | grep ^org.gnome.desktop +[...] +org.gnome.desktop.background +org.gnome.desktop.privacy +org.gnome.desktop.remote-desktop.vnc +org.gnome.desktop.interface +org.gnome.desktop.default-applications.terminal +org.gnome.desktop.session +org.gnome.desktop.thumbnailers +org.gnome.desktop.app-folders +org.gnome.desktop.notifications +org.gnome.desktop.sound +org.gnome.desktop.lockdown +org.gnome.desktop.default-applications.office +``` + +无论是通过手动搜索还是通过 [阅读 GSetting 文档][11],你可能会注意到 `org.gnome.desktop.input-sources` 模式,它有助于定义键盘布局。从设计上来说,GSetting 模式包含了键和值。 + +### 用 dconf 重新映射大写字母锁 + +`xkb-options` 键包含了可选的键盘覆写。要设置这个键值,请使用`dconf`,将上面模式中的点(`.`)转换为斜线(`/`),因为 dconf 数据库需要使用 `/`。 + +``` +$ dconf write /org/gnome/desktop/input-sources/xkb-options "['caps:ctrl_modifier']" +``` + +我把 `caps` 设置为 `ctrl_modifier`,因为我使用 `Ctrl` 修饰键的次数多于其他修饰键,但 Vim 用户可能喜欢把它设置为 `escape`。 + +### 查看你的设置 + +这个改变会立即生效,并在重启后仍然生效。这是你在 GNOME 中定义的首选项,在你改变它之前一直有效。 + +你可以通过 `gsettings` 查看 dconf 中的新值。首先,查看可用的键: + +``` +$ gsettings list-keys \ + org.gnome.desktop.input-sources +xkb-options +mru-sources +show-all-sources +current +per-window +sources +``` + +然后用 `xkb-options` 键名查看设置: + +``` +$ gsettings get \ + org.gnome.desktop.input-sources \ + xkb-options +['caps:ctrl_modifier'] +``` + +### 选项丰富 + +我在我的 GNOME 3.4 系统上使用这个小技巧来设置大写锁定键以及 [Compose][12] 键(`compose:ralt`)。虽然我相信正在开发中的 GUI 控件可以控制这些选项,但我也不得不承认,能以编程方式设置这些选项的能力是我的荣幸。作为以前没有可靠方法来调整桌面设置的系统的管理员,能够用命令修改我的首选项使得设置新桌面变得快速而容易。 + +GSettings 提供了很多有用的选项,而且文档也很详尽。如果你有想要改变的东西,可以看看有什么可用的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/remap-caps-lock-key-linux + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/emoji-keyboard.jpg?itok=JplrSZ9c (Emoji keyboard) +[2]: https://opensource.com/article/20/12/emacs +[3]: https://opensource.com/article/18/5/bash-tricks#key +[4]: https://opensource.com/article/17/3/introduction-gnu-screen +[5]: https://opensource.com/article/19/6/tmux-terminal-joy +[6]: https://opensource.com/sites/default/files/uploads/bendy-fingers.jpg (Fingers on a keyboard) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://discourse.gnome.org/t/new-gnome-versioning-scheme/4235 +[9]: https://wayland.freedesktop.org +[10]: https://opensource.com/downloads/grep-cheat-sheet +[11]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/using_the_desktop_environment_in_rhel_8/configuring-gnome-at-low-level_using-the-desktop-environment-in-rhel-8 +[12]: https://opensource.com/article/17/5/7-cool-kde-tweaks-will-improve-your-life diff --git a/published/202105/20210521 Joining Fedora Linux to an enterprise domain.md b/published/202105/20210521 Joining Fedora Linux to an enterprise domain.md new file mode 100644 index 0000000000..25ad7ac46b --- /dev/null +++ b/published/202105/20210521 Joining Fedora Linux to an enterprise domain.md @@ -0,0 +1,101 @@ +[#]: subject: (Joining Fedora Linux to an enterprise domain) +[#]: via: (https://fedoramagazine.org/join-fedora-linux-enterprise-domain/) +[#]: author: (ogutierrez https://fedoramagazine.org/author/ogutierrez/) +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13426-1.html) + +将 Fedora Linux 系统添加到企业域中 +====== + +![](https://img.linux.net.cn/data/attachment/album/202105/26/120149o01pzllgw119w66l.jpg) + +在企业互联网场景中,一般情况下最广泛使用的基于 Linux 的操作系统是 Red Hat Enterprise Linux(RHEL),它主要用于服务器,但也可以用作工作站。Fedora linux 其实也是工作站系统的一个很好的选择,它提供了许多在企业环境中工作的特性,使管理成为一项简单的任务。 + +当你的工作网络中有许多机器时,你需要一种以集中方式管理用户和机器的方法。[FreeIPA][4] 和 [活动目录][5]Active Directory 就是用于这个任务的技术。它们允许系统管理员使用网络中所有实体的目录来管理大量的机器。 + +### Fedora 中的活动目录 + +活动目录在公司环境中非常常见。Fedora 和 RHEL 通过使用 SSSD ( 系统安全服务守护进程 System Security Services Daemon)与 FreeIPA 或活动目录等服务很好地集成。SSSD 是一种访问远程目录和身份验证机制的系统服务。使用此软件的计算机能够使用远程凭据进行身份验证,并访问该目录网络中可用的其他服务。 + +要加入域网络,你需要域管理员的权限才能添加计算机。可以通过在域凭据上设置特殊权限或代表你对该计算机进行预配置。Fedora Linux 有一个在安装时配置机器的选项,叫做企业登录Enterprise Login。如果你的计算机网络自动配置为企业域网络,那么你可以直接使用域凭据登录。 + +![][6] + +如果你的配置不是自动的,或者你已经安装了 Fedora Linux,你可以通过以下几个配置步骤加入一个活动目录域: + + 1. 设置此计算机的 DNS。要连接到目录服务,首先需要能够解析目录域名。如果你的网络使用 DHCP 设置正确的 DNS,则可以跳过此步骤。 + 2. 更改你的计算机名称,以反映它将是新域的一部分。编辑文件 `/etc/hostname`,并将机器名更改为 `machinename.my_domain`。 + 3. 通过执行以下命令加入域:`sudo realm join my_domain -v`( 用域名称替换 `my_domain`)。 + +运行此命令后,系统将请求允许加入该域中新计算机的用户的凭据。如果进程中没有错误,则机器将成为域的一部分。 + +![][7] + +现在,此计算机已成为你的域的一部分,你可以: + + * 使用域用户名登录到计算机 + * 获取 kerberos 票据以访问域网络中的不同服务 + * 访问其他服务,具体取决于域的配置方式 + +### 使用 Fleet Commander 管理 Fedora Linux + +现在这台计算机已经是你的域的一部分了,你可以使用活动目录的域管理员工具来管理它。由于你的计算机没有运行 Windows,因此你只能进行身份验证以及访问网络和目录服务。无法在此计算机上设置与桌面相关的配置。 + +幸运的是,Fedora 有个工具叫 [Fleet Commander][8]。 + +#### 创建配置 + +Fleet Commander 是一个管理工具,允许你为网络中的所有 Fedora Linux 机器设置桌面配置文件。 + +这意味着,你可以简单地为 GNOME 桌面、Firefox、Chrome、LibreOffice 和其他支持的软件设置任何配置,然后在登录到选定的用户/组/计算机时以细粒度的方式应用该配置。 + +![][9] + +要使用这个工具首先安装 `fleet-commander-admin` 软件包: + +``` +sudo dnf install fleet-commander-admin +``` + +然后,用浏览器访问 [http://localhost:9090][10] 来登录。在左边的菜单中,点击 “Fleet Commander”。 + +Fleet Commander 有一个工具,可以使用“实时会话”机制直观地设置配置概要文件。它运行一个虚拟机,作为基本机器的模板。你需要手动进行所需的配置更改。然后检查所有配置更改,选择要添加到配置文件中的更改,然后部署它。 + +#### 管理客户端 + +在每个 Fedora Linux 或 RHEL 机器中,你都需要安装 Fleet Commander 客户端服务。此服务在用户登录时激活。它在域中搜索应用于当前用户/计算机的配置文件,并应用这个配置。 + +安装 `fleet-commander-client`: + +``` +sudo dnf install fleet-commander-client +``` + +软件将自动检测机器是否是域的一部分。当用户登录时,它将使用应用于该用户的配置文件来设置会话。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/join-fedora-linux-enterprise-domain/ + +作者:[ogutierrez][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/ogutierrez/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/05/enterprise-816x345.jpg +[2]: https://unsplash.com/@genefoto?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/fleet?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://www.freeipa.org/page/Main_Page +[5]: https://en.wikipedia.org/wiki/Active_Directory +[6]: https://lh5.googleusercontent.com/aIRYn2TDgaaUrErzBV_KPVgpm94OrVgySlwqlI3VsotslWKN5UnLQ0VYjESSFB12aZWf_UnbmOOwa_rcxvRoI-MB6gFaw8p-RgBP9Lswnb2YV3iIlQ8YeXgpwJC_-B5tPrFTfUe_ +[7]: https://lh6.googleusercontent.com/DVvr7cHuZxvgqhAHk9v7jAYSER7VSP1G7CJ1xHx1kT5ZS-v1yt3rKMmwk9JhsLnYGfwAjOPPpSC2BGTpZtAdKrnx7XLUWgOZBhFFwB6SL7vR_q_2N1c_OGYp7YmNLRk7oRW8IEVB +[8]: https://fleet-commander.org/ +[9]: https://lh6.googleusercontent.com/ATeNp5niX37MW7ARiMVSkqe9Vr5Fv4IN6eUW5xf1UPO0AMO1DxXLypw0CbqTNOfzLJYDM18ggc7Mrh3LZK8Foh80K1WjSW9LHQD081BbJg0owQJj_ZQdICLr0tGILmBRco-xbq92 +[10]: http://localhost:9090/ diff --git a/published/202105/20210527 Port operating systems to new chip architectures.md b/published/202105/20210527 Port operating systems to new chip architectures.md new file mode 100644 index 0000000000..5de254f018 --- /dev/null +++ b/published/202105/20210527 Port operating systems to new chip architectures.md @@ -0,0 +1,115 @@ +[#]: subject: (Port operating systems to new chip architectures) +[#]: via: (https://opensource.com/article/21/5/port-chip-architectures) +[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13436-1.html) + +将操作系统移植到新的芯片架构的经验 +====== + +> 在将嵌入式系统操作系统移植到不同的芯片架构时,RT-Thread 的维护者们从中学到了什么。 + +![](https://img.linux.net.cn/data/attachment/album/202105/28/221925tuv6j9lsg6xovog2.jpg) + +曾经有人问我,为什么计算机被称为“计算机”,它们做的事情可远不止计算数字。一台现代的个人电脑可以浏览互联网、播放音频和视频、为视频游戏和电影生成漂亮的图形、模拟和预测复杂的天气模式和流行病风险、将建筑和工程蓝图变为现实等等。 + +计算机之所以能做到这些,是因为所有这些问题都可以归结为数字方程,而计算机的 CPU —— 其中央处理单元 —— 实际上不过是一个简单的计算器。 + +为了让 CPU 向硬盘驱动器发送信号以写入数据,或向显示器发送信号以显示图像,它必须接收指令。这些指令是以 “代码” 的形式出现的,这是一种简明的说法,即必须有人写一个 _程序_ ,与CPU “说” 同样的语言。CPU 理解的是 _机器语言_,这是一个大多数人都无法理解的比特阵列,大多数人都不可能手动写出来。相反,我们使用像 C、C++、Java、Python 等编程语言。这些语言被解析并编译成机器语言,然后交付给 CPU。 + +如果你试图用一种它不理解的语言来指示 CPU,它不知道该怎么做。你可以通过尝试用 [x86_64 RHEL][3] 镜像启动 [树莓派][2] 来体验这种误传尝试的尴尬结果。如果它能工作就好了,但是不能。 + +### 将一个操作系统移植到一个新的架构上 + +[RT-Thread 项目][4] 为嵌入式系统程序员提供了一个开源的操作系统(OS)。嵌入式领域是非常多样化的,有很多物联网(IoT)、定制工业和业余设备。RT-Thread 的目标是使嵌入式编程对每个人来说都很容易,无论你使用什么设备。有时,这意味着要将一个操作系统移植到一个新的架构上,不管是用于相同架构但指令集略有不同的的芯片,还是用于全新的架构。 + +一开始处理这个问题可能会有点吓人 —— 你可能不知道从哪里开始或如何开始。这篇文章收集了 RT-Thread 维护者在将 [RTOS][5] 移植到新的芯片架构时学到的经验。 + +### 你在开始之前需要知道什么 + +这里是一个看似难以逾越的过程的高屋建瓴的观点。这对你的项目来说可能有所不同,但从概念上来说,这是相对普遍的,即使一些具体的细节是不同的: + + 1. 准备好一个 C 语言的执行环境 + 2. 确认可以通过串行端口发送和接收字符 + 3. 确认上下文切换代码可以工作 + 4. 获取支持的硬件定时器 + 5. 确认中断程序可以通过串口接收和解析数据 + +### 执行模式 + +对于大多数先进的体系结构,操作系统和用户应用程序运行在不同的权限级别上。这可以防止有功能故障的代码影响操作系统的集成和安全。例如,在 ARMv7-A 架构中,操作系统通常在系统模式下运行,而在 ARMv8-A 中,操作系统可以在 EL2 或 EL3 权限级别上运行。 + +通常情况下,芯片在通电时以最高权限级别执行启动代码。但在此之后,操作系统会将特权级别切换到其目标模式。 + +#### 1、执行 C 代码 + +这一步的关键动作是将 [块起始符号][6]block starting symbol(.bss)部分设置为零,并设置堆栈指针。 + +在 C 语言的实现中,未初始化的全局变量和静态变量通常存储在 .bss 部分,它不占用存储设备的任何空间。当程序被加载时,相应的空间被分配到内存中,并被初始化为零。当操作系统启动时,它必须自己做这项工作。 + +另一方面,操作系统必须初始化堆栈空间并设置堆栈指针。由于 C 语言程序在进入和退出函数时在堆栈上保存和恢复局部变量,所以在调用任何 C 函数之前必须设置堆栈指针。RT-Thread 必须为每个新创建的线程做这个步骤。 + +#### 2、至少使用一个串行驱动器 + +RT-Thread 通过串口输出信息和日志,这也有助于在移植过程中对代码进行调试。在这个阶段,通过串口 _接收_ 数据是不必要的。当我们第一次在串口上看到我们友好的、熟悉的 RT-Thread 的标志时,我们就知道我们走对了路! + +#### 3、确认上下文切换逻辑 + +一个任务的上下文是它的整个执行环境,它包含通用寄存器、程序计数器、堆栈帧的位置等等。当一个新的线程被创建时,RT-Thread 必须手动分配和设置它的上下文,这样调度器就可以切换到新的线程,就像它对其他线程一样。 + +有三件事需要注意: + + * 首先,当 RT-Thread 启动时,默认情况下中断是禁用的。当任务调度器第一次被启用时,它们就会被启用;这个过程是在上下文切换期间用汇编语言实现的。 + * 第二,当一个线程退出时,下一个调度将开始,这时拥有的资源会被空闲的线程回收。 + * 第三,数据被推入堆栈的顺序必须与从堆栈中弹出数据的顺序一致。 + +一般来说,你希望正常进入主函数和 msh 控制台。然而,在这个阶段无法实现输入控制,因为串行输入中断还没有实现。当串行中断实现后,就可以进行 msh 输入了。 + +#### 4、设置定时器 + +RT-Thread 需要一个定时器来定期产生中断;它被用来计算自系统启动以来所经过的“滴答”。计数器的编号用于提供软件中断功能,并指示内核何时开始调度一个任务。 + +设置时间片的值可能是一件棘手的事情。它通常是 10ms 到 1ms。如果你在一个慢速的 CPU 上选择一个小的时间片,大部分时间就会花在任务切换上 —— 不利于完成其他事情。 + +#### 5、确认串口工作正常 + +在这一步,我们通过串口与 RT-Thread msh 进行交互。我们发送命令,按回车键,然后看着 msh 执行命令并显示结果。 + +这个过程通常不难实现。不过,有一点要提醒大家。在某些平台上,在处理完串口中断后,别忘了清除中断标志。 + +一旦串口工作正常,移植过程基本上就完成了。 + +### 实践 + +为了将你的项目移植到不同的芯片架构上,你需要非常清楚地了解你所针对的芯片的架构。熟悉你的项目中最关键的部分的底层代码。通过对照芯片的手册结合大量的实际工作经验,你会了解芯片的特权模式、寄存器和编译方法。 + +如果你没有需要移植到新芯片的项目,请加入我们;RT-Thread 项目总是需要帮助将 RTOS 移植到新的芯片上!作为一个开源项目,RT-Thread 正在改变开源嵌入式编程的面貌。请在 [RT-Thread 俱乐部][7]介绍你自己并寻求帮助! + +* * * + +本文基于 DEV 社区上的 [如何将操作系统移植到不同的芯片架构上?][8],并经许可转载。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/port-chip-architectures + +作者:[Alan Smithee][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/alansmithee +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BIZ_darwincloud_520x292_0311LL.png?itok=74DLgd8Q (diagram of planning a cloud) +[2]: https://opensource.com/resources/raspberry-pi +[3]: https://www.redhat.com/en/store/red-hat-enterprise-linux-developer-suite +[4]: https://opensource.com/article/20/6/open-source-rtos +[5]: https://www.rt-thread.io/ +[6]: https://en.wikipedia.org/wiki/.bss +[7]: https://club.rt-thread.io/ +[8]: https://dev.to/abby06/how-to-port-operating-system-to-different-chip-architecture-3od9 diff --git a/published/20210517 Convenient matrices and other improvements Python 3.5 brought us.md b/published/20210517 Convenient matrices and other improvements Python 3.5 brought us.md new file mode 100644 index 0000000000..10ee2c88b7 --- /dev/null +++ b/published/20210517 Convenient matrices and other improvements Python 3.5 brought us.md @@ -0,0 +1,165 @@ +[#]: subject: (Convenient matrices and other improvements Python 3.5 brought us) +[#]: via: (https://opensource.com/article/21/5/python-35-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13448-1.html) + +Python 3.5 带给我们的方便的矩阵以及其他改进 +====== + +> 探索一些未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/01/201953lua9t9f3vvwqbqet.jpg) + +这是 Python 3.x 首发特性系列文章的第六篇。Python 3.5 在 2015 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有被充分利用,而且相当酷。下面是其中的三个。 + +### @ 操作符 + +`@` 操作符在 Python 中是独一无二的,因为在标准库中没有任何对象可以实现它!它是为了在有矩阵的数学包中使用而添加的。 + +矩阵有两个乘法的概念。元素积是用 `*` 运算符完成的。但是矩阵组合(也被认为是乘法)需要自己的符号。它是用 `@` 完成的。 + +例如,将一个“八转”矩阵(将轴旋转 45 度)与自身合成,就会产生一个四转矩阵。 + +``` +import numpy + +hrt2 = 2**0.5 / 2 +eighth_turn = numpy.array([ + [hrt2, hrt2], + [-hrt2, hrt2] +]) +eighth_turn @ eighth_turn +``` + +``` + array([[ 4.26642159e-17, 1.00000000e+00], + [-1.00000000e+00, -4.26642159e-17]]) +``` + +浮点数是不精确的,这比较难以看出。从结果中减去四转矩阵,将其平方相加,然后取其平方根,这样就比较容易检查。 + +这是新运算符的一个优点:特别是在复杂的公式中,代码看起来更像基础数学: + +``` +almost_zero = ((eighth_turn @ eighth_turn) - numpy.array([[0, 1], [-1, 0]]))**2 +round(numpy.sum(almost_zero) ** 0.5, 10) +``` + +``` + 0.0 +``` + +### 参数中的多个关键词字典 + +Python 3.5 使得调用具有多个关键字-参数字典的函数成为可能。这意味着多个默认值的源可以与更清晰的代码”互操作“。 + +例如,这里有个可笑的关键字参数的函数: + +``` +def show_status( + *, + the_good=None, + the_bad=None, + the_ugly=None, + fistful=None, + dollars=None, + more=None +): + if the_good: + print("Good", the_good) + if the_bad: + print("Bad", the_bad) + if the_ugly: + print("Ugly", the_ugly) + if fistful: + print("Fist", fistful) + if dollars: + print("Dollars", dollars) + if more: + print("More", more) +``` + +当你在应用中调用这个函数时,有些参数是硬编码的: + +``` +defaults = dict( + the_good="You dig", + the_bad="I have to have respect", + the_ugly="Shoot, don't talk", +) +``` + +从配置文件中读取更多参数: + +``` +import json + +others = json.loads(""" +{ +"fistful": "Get three coffins ready", +"dollars": "Remember me?", +"more": "It's a small world" +} +""") +``` + +你可以从两个源一起调用这个函数,而不必构建一个中间字典: + +``` +show_status(**defaults, **others) +``` + +``` + Good You dig + Bad I have to have respect + Ugly Shoot, don't talk + Fist Get three coffins ready + Dollars Remember me? + More It's a small world +``` + +### os.scandir + +`os.scandir` 函数是一种新的方法来遍历目录内容。它返回一个生成器,产生关于每个对象的丰富数据。例如,这里有一种打印目录清单的方法,在目录的末尾跟着 `/`: + +``` +for entry in os.scandir(".git"): + print(entry.name + ("/" if entry.is_dir() else "")) +``` + +``` + refs/ + HEAD + logs/ + index + branches/ + config + objects/ + description + COMMIT_EDITMSG + info/ + hooks/ +``` + +### 欢迎来到 2015 年 + +Python 3.5 在六年前就已经发布了,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-35-features + +作者:[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/markus-spiske-iar-matrix-unsplash.jpg?itok=78u_4veR (Hacker code matrix) \ No newline at end of file diff --git a/published/20210518 4 essential characteristics of successful APIs.md b/published/20210518 4 essential characteristics of successful APIs.md new file mode 100644 index 0000000000..63d514f348 --- /dev/null +++ b/published/20210518 4 essential characteristics of successful APIs.md @@ -0,0 +1,206 @@ +[#]: subject: (4 essential characteristics of successful APIs) +[#]: via: (https://opensource.com/article/21/5/successful-apis) +[#]: author: (Tom Wilson https://opensource.com/users/tomwillson4014) +[#]: collector: (lujun9972) +[#]: translator: (ywxgod) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13483-1.html) + +完善的 API 的 4 个基本特征 +====== + +> 创建一个 API(应用程序接口),我们所要做的远远不止是让它能“正常工作”。 + +![](https://img.linux.net.cn/data/attachment/album/202106/14/155547zs3mffismifqqi59.jpg) + +如果你正在构建基于 C/S 模型的应用程序,那么你需要一个应用程序接口(API)。API 就是一种非常清晰而又明确的定义,它是一个进程process与另一个进程之间明确定义的边界。Web 应用中我们常见的边界定义就是 REST/JSON API。 + +虽然很多开发者可能主要关注在如何让 API 正常工作(或功能正常),但却还有一些“非功能性”的要求也是需要他们注意的。所有的 API *必须具备* 的 4 个非功能性的要求是: + + * 安全 + * 文档 + * 验证 + * 测试 + +### 安全 + +在软件开发中,安全是最基本的要求。对于 API 开发者来说,API 的安全性主要包含以下 4 个方面: + + 1. HTTPS/SSL 证书 + 2. 跨域资源共享 + 3. 身份认证与 JSON Web 令牌 + 4. 授权与作用域 + +#### 1、HTTPS/SSL 证书 + +Web 应用的黄金标准是使用 SSL 证书的 HTTPS 协议。[Let's Encrypt][2] 可以帮你达到这一目的。Let's Encrypt 来自于非营利性的互联网安全研究小组(ISRG),它是一个免费的、自动化的、开放的证书颁发机构。 + +Let's Encrypt 的软件会为你的域(LCTT 译注:包含域名、IP 等信息)生成中央授权证书。而正是这些证书确保了从你的 API 到客户端的数据载荷是点对点加密的。 + +Let's Encrypt 支持证书管理的多种部署方案。我们可以通过查看 [文档][3] 来找出最适合自己需要的方案。 + +#### 2、跨域资源共享 + +跨域资源共享Cross-origin resource sharing(CORS)是一个针对浏览器的安全策略预检。如果你的 API 服务器与发出请求的客户端不在同一个域中,那么你就要处理 CORS。例如,如果你的服务器运行在 `api.domain-a.com` 并且接到一个来自 `domain-b.com` 的客户端的请求,那么 CORS 就会(让浏览器)发送一个 HTTP 预检请求,以便查看你的 API 服务是否会接受来自此客户域的客户端请求。 + +[来自 MDN 的定义][4]: + +> “跨域资源共享(CORS)是一种基于 HTTP 头的机制,这种机制允许服务器标记除自身源外的其他任何来源(域、方案或端口)。而对于这些被服务器标识的源,浏览器应该允许我们从它们加载资源。” + +![CORS 原理][5] + +*([MDN文档][4], [CC-BY-SA 2.5][6])* + +另外,有很多用于 [Node.js][7] 的辅助库来 [帮助 API 开发者处理 CORS][8]。 + +#### 3、身份认证与 JSON Web 令牌 + +有多种方法可以验证你的 API 中的认证用户,但最好的方法之一是使用 JSON Web 令牌(JWT),而这些令牌使用各种知名的加密库进行签名。 + +当客户端登录时,身份管理服务会向客户端提供一个 JWT。然后,客户端可以使用这个令牌向 API 发出请求,API 收到请求后,从服务器读取公钥或私密信息来验证这个令牌。 + +有一些现有的库,可以帮助我们对令牌进行验证,包括 [jsonwebtoken][9]。关于 JWT 的更多信息,以及各种语言中对其的支持库,请查看 [JWT.io][10]。  + +``` +import jwt from 'jsonwebtoken' + +export default function (req, res, next) { + // req.headers.authorization Bearer token + const token = extractToken(req) + jwt.verify(token, SECRET, { algorithms: ['HS256'] }, (err, decoded) => { + if (err) { next(err) } + req.session = decoded + next() + }) +} +``` + +#### 4、授权与作用域 + +认证(或身份验证)很重要,但授权同样很重要。也就是说,经过验证的客户端是否有权限让服务器执行某个请求呢?这就是作用域的价值所在。当身份管理服务器对客户端进行身份认证,且创建 JWT 令牌时,身份管理服务会给当前客户提供一个作用域,这个作用域将会决定当前经过验证的客户的 API 请求能否被服务器执行。这样也就免去了服务器对访问控制列表的一些不必要的查询。 + +作用域是一个文本块(通常以空格分隔),用于描述一个 API 端点的访问能力。一般来说,作用域被分为资源与动作。这种模式对 REST/JSON API 很有效,因为它们有相似的 `RESOURCE:ACTION` 结构。(例如,`ARTICLE:WRITE` 或 `ARTICLE:READ`,其中 `ARTICLE` 是资源,`READ` 和 `WRITE` 是动作)。 + +作用域的划分让我们的 API 能够专注于功能的实现,而不是去考虑各种角色和用户。身份访问管理服务可以将不同的角色和用户分配不同的权限范围,然后再将这些不同的作用域提供给不同的 JWT 验证中的客户。 + +#### 总结 + +当我们开发和部署 API 时,安全应该一直是最重要的要求之一。虽然安全性是一个比较宽泛的话题,但如果能解决上面四个方面的问题,这对于你的 API 来说,在生产环境中将会表现得更好。 + +### 文档 + +_有什么能比没有文档更糟糕?过期的文档。_ + +开发者对文档真的是又爱又恨。尽管如此,文档仍然是 API 定义是否完善的一个关键部分。开发者需要从文档中知道如何使用这些 API,且你创建的文档对于开发者如何更好地使用 API 也有着非常巨大的作用。 + +创建 API 文档,我们需要关注下面三个方面: + + 1. 开发者入门文档(自述文件/基本介绍) + 2. 技术参考(规范/说明书) + 3. 使用方法(入门和其他指南) + +#### 1、入门文档 + +在构建 API 服务的时候,你需要明确一些事情,比如:这个 API 是做什么的?如何建立开发者环境?如何测试该服务?如何提交问题?如何部署它? + +通常我们可以通过自述(`README`)文件来回答上面的这些问题,自述文件一般放在你的代码库中,用于为开发者提供使用你项目的最基本的起点和说明。 + +自述文件应该包含: + + * API 的描述 + * 技术参考与指南的链接 + * 如何以开发者的身份设置你的项目 + * 如何测试这个项目 + * 如何部署这个项目 + * 依赖管理 + * 代码贡献指南 + * 行为准则 + * 许可证 + * 致谢 + +你的自述文件应该简明扼要;你不必解释每一个方面,但要提供足够的信息,以便开发者在熟悉你的项目后可以进一步深入研究。 + +#### 2、技术参考 + +在 REST/JSON API 中, 每一个具体的端点endpoint都对应一个特定的功能,都需要一个具体的说明文档,这非常重要。文档中会定义 API 的描述,输入和可能的输出,并为各种客户端提供使用示例。 + +[OpenAPI][13] 是一个创建 REST/JSON 文档的标准, 它可以指导你完成编写 API 文档所需的各种细节。OpenAPI 还可以为你的 API 生成演示文档。 + +#### 3、使用方法 + +对于 API 的用户来说,仅仅只有技术说明是不够的。他们还需要知道如何在一些特定的情况和场景下来使用这些 API,而大多数的潜在用户可能希望通过你的 API 来解决他们所遇到的问题。 + +向用户介绍 API 的一个好的方法是利用一个“开始”页面。“开始”页面可以通过一个简单的用例引导用户,让他们迅速了解你的 API 能给他们能带来的益处。 + +#### 总结 + +对于任何完善的 API,文档都是一个很关键的组成部分。当你在创建文档时,你需要关注 API 文档中的如何入门、技术参考以及如何快速开始等三个方面,这样你的 API 才算是一个完善的 API。 + +### 验证 + +API 开发过程中经常被忽视的一个点就是验证。它是一个验证来自外部来源的输入的过程。这些来源可以是客户端发送过来的 JSON 数据,或者是你请求别人的服务收到的响应数据。我们不仅仅要检查这些数据的类型,还要确保这些数据确实是我们要的数据,这样可以消除很多潜在的问题。了解你的边界以及你能控制的和不能控制的东西,对于 API 的数据验证来说是一个很重要的方面。 + +最好的策略是在进入数据逻辑处理之前,在你能控制的边界的边缘处进行数据的验证。当客户端向你的 API 发送数据时,你需要对该数据做出任何处理之前应用你的验证,比如:确保 Email 是真实的邮件地址、日期数据有正确的格式、字符串符合长度要求。 + +这种简单的检查可以为你的应用增加安全性和一致性。还有,当你从某个服务接收数据时,比如数据库或缓存,你需要重新验证这些数据,以确保返回的结果符合你的数据检查。 + +你可以自己手写这些校验逻辑,当然也可以用像 [Lodash][14] 或 [Ramda][15] 这样的函数库,它们对于一些小的数据对象非常有用。像 [Joi][16]、[Yup][17] 或 [Zod][18] 这样的验证库效果会更好,因为它们包含了一些常见的验证方法,可以节省你的时间和精力。除此,它们还能创建一个可读性强的模式。如果你需要看看与语言无关的东西,请看 [JSON Schema][19]。 + +#### 总结 + +数据验证虽然并不显眼和突出(LCTT 译注:跟 API 的功能实现以及其他几个方面比),但它可以帮你节省大量的时间。如果不做验证,这些时间将可能被用于故障排除和编写数据迁移脚本。真的不要相信你的客户端会发送干净的数据给你,也不要让验证不通过的数据渗入到你的业务逻辑或持久数据存储中去。花点时间验证你的 API 收到的数据和请求到的响应数据,虽然在前期你可能会感到一些挫折和不适,但这总比你在后期花大量时间去做各种数据收紧管制、故障排除等要容易得多。 + +### 测试 + +测试是软件开发中的最佳实践,它应该是最主要的非功能性的要求。对于包括 API 在内的任何项目,确定测试策略都是一个挑战,因为你自始至终都要掌握各种约束,以便相应的来制定你的测试策略。 + +集成测试Integration testing是测试 API 的最有效的方法之一。在集成测试模式中,开发团队会创建一个测试集用来覆盖应用流程中的某些部分,从一个点到另一个点。一个好的集成测试流程包括测试 API 的入口点以及模拟请求到服务端的响应。搞定这两点,你就覆盖了整个逻辑,包括从 API 请求的开始到模拟服务器的响应,并返回数据给 API。 + +虽然使用的是模拟,但这种方法让能我们专注于代码逻辑层,而不需要去依赖后端服务和展示逻辑来进行测试。没有依赖的测试会更加可靠、更容易实现自动化,且更容易被接入持续集成管道流。 + +集成测试的实施中,我会用 [Tape][20]、[Test-server][21] 和 [Fetch-mock][22]。这些库让我们能够从 API 的请求到数据的响应进行隔离测试,使用 Fetch-mock 还可以将出站请求捕获到持久层。 + +#### 总结 + +虽然其他的各种测试和类型检查对 API 也都有很好的益处,但集成测试在流程效率、构建和管理时间方面却有着更大的优势。使用 Fetch-mock 这样的工具,可以在服务边界提供一个干净的模拟场景。 + +### 专注于基础 + +不管是设计和构建应用程序还是 API,都要确保包含上面的四个基本要素。它们并不是我们唯一需要考虑的非功能性需求,其他的还包括应用监控、日志和 API 管理等。即便如此,安全、文档、验证和测试这四个基本点,对于构建任何使用场景下的完善 API 都是至关重要的关注点。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/successful-apis + +作者:[Tom Wilson][a] +选题:[lujun9972][b] +译者:[ywxgod](https://github.com/ywxgod) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/tomwillson4014 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tips_map_guide_ebook_help_troubleshooting_lightbulb_520.png?itok=L0BQHgjr (Looking at a map) +[2]: https://letsencrypt.org/ +[3]: https://letsencrypt.org/docs/ +[4]: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS +[5]: https://opensource.com/sites/default/files/uploads/cors_principle_1.png (CORS principles) +[6]: https://creativecommons.org/licenses/by-sa/2.5/ +[7]: https://nodejs.org +[8]: https://www.npmjs.com/search?q=CORS +[9]: https://github.com/auth0/node-jsonwebtoken +[10]: https://jwt.io +[11]: https://opensource.com/sites/default/files/uploads/jwt-verify-example.png (JWT verification example) +[12]: https://blog.hyper63.com/content/images/2021/03/jwt-verify-example.png +[13]: https://spec.openapis.org/oas/v3.1.0 +[14]: https://lodash.com +[15]: https://ramdajs.com/ +[16]: https://joi.dev/ +[17]: https://github.com/jquense/yup +[18]: https://github.com/colinhacks/zod/tree/v3 +[19]: https://json-schema.org/ +[20]: https://github.com/substack/tape +[21]: https://github.com/twilson63/test-server +[22]: http://www.wheresrhys.co.uk/fetch-mock/ diff --git a/published/20210518 Are you using this magic method for filesystems from Python 3.6.md b/published/20210518 Are you using this magic method for filesystems from Python 3.6.md new file mode 100644 index 0000000000..1f8cef3c27 --- /dev/null +++ b/published/20210518 Are you using this magic method for filesystems from Python 3.6.md @@ -0,0 +1,131 @@ +[#]: subject: (Are you using this magic method for filesystems from Python 3.6?) +[#]: via: (https://opensource.com/article/21/5/python-36-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13454-1.html) + +你使用过 Python 3.6 中针对文件系统的这个神奇方法吗? +====== + +> 探索 os.fspath 和其他两个未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/03/164403a6m2c989hh963lm6.jpg) + +这是 Python 3.x 首发特性系列文章中的第七篇。Python 3.6 首次发布于 2016 年,尽管它已经发布了一段时间,但它引入的许多特性都没有得到充分利用,而且相当酷。下面是其中的三个。 + +### 分隔数字常数 + +快回答哪个更大,`10000000` 还是 `200000`?你在看代码时能正确回答吗?根据当地的习惯,在写作中,你会用 10,000,000 或 10.000.000 来表示第一个数字。问题是,Python 使用逗号和句号是用于其他地方。 + +幸运的是,从 Python 3.6 开始,你可以使用下划线来分隔数字。这在代码中和使用字符串的 `int()` 转换器时都可以使用: + +``` +import math +math.log(10_000_000) / math.log(10) +``` + +``` + 7.0 +``` + +``` +math.log(int("10_000_000")) / math.log(10) +``` + +``` + 7.0 +``` + +### Tau 是对的 + +45 度角用弧度表示是多少?一个正确的答案是 `π/4`,但这有点难记。记住 45 度角是一个八分之一的转角要容易得多。正如 [Tau Manifesto][2] 所解释的,`2π`,称为 `Τ`,是一个更自然的常数。 + +在 Python 3.6 及以后的版本中,你的数学代码可以使用更直观的常数: + +``` +print("Tan of an eighth turn should be 1, got", round(math.tan(math.tau/8), 2)) +print("Cos of an sixth turn should be 1/2, got", round(math.cos(math.tau/6), 2)) +print("Sin of a quarter turn should be 1, go", round(math.sin(math.tau/4), 2)) +``` + +``` + Tan of an eighth turn should be 1, got 1.0 + Cos of an sixth turn should be 1/2, got 0.5 + Sin of a quarter turn should be 1, go 1.0 +``` + +### os.fspath + +从 Python 3.6 开始,有一个神奇的方法表示“转换为文件系统路径”。当给定一个 `str` 或 `bytes` 时,它返回输入。 + +对于所有类型的对象,它寻找 `__fspath__` 方法并调用它。这允许传递的对象是“带有元数据的文件名”。 + +像 `open()` 或 `stat` 这样的普通函数仍然能够使用它们,只要 `__fspath__` 返回正确的东西。 + +例如,这里有一个函数将一些数据写入一个文件,然后检查其大小。它还将文件名记录到标准输出,以便追踪: + +``` +def write_and_test(filename): +    print("writing into", filename) +    with open(filename, "w") as fpout: +        fpout.write("hello") +    print("size of", filename, "is", os.path.getsize(filename)) +``` + +你可以用你期望的方式来调用它,用一个字符串作为文件名: + +``` +write_and_test("plain.txt") +``` + +``` +    writing into plain.txt +    size of plain.txt is 5 +``` + +然而,可以定义一个新的类,为文件名的字符串表示法添加信息。这样可以使日志记录更加详细,而不改变原来的功能: + +``` +class DocumentedFileName: +    def __init__(self, fname, why): +        self.fname = fname +        self.why = why +    def __fspath__(self): +        return self.fname +    def __repr__(self): +        return f"DocumentedFileName(fname={self.fname!r}, why={self.why!r})" +``` + +用 `DocumentedFileName` 实例作为输入运行该函数,允许 `open` 和 `os.getsize` 函数继续工作,同时增强日志: + +``` +write_and_test(DocumentedFileName("documented.txt", "because it's fun")) +``` + +``` +    writing into DocumentedFileName(fname='documented.txt', why="because it's fun") +    size of DocumentedFileName(fname='documented.txt', why="because it's fun") is 5 +``` + +### 欢迎来到 2016 年 + +Python 3.6 是在五年前发布的,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-36-features + +作者:[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/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://tauday.com/tau-manifesto diff --git a/published/20210519 Slice infinite generators with this Python 3.7 feature.md b/published/20210519 Slice infinite generators with this Python 3.7 feature.md new file mode 100644 index 0000000000..82480a7e1c --- /dev/null +++ b/published/20210519 Slice infinite generators with this Python 3.7 feature.md @@ -0,0 +1,137 @@ +[#]: subject: (Slice infinite generators with this Python 3.7 feature) +[#]: via: (https://opensource.com/article/21/5/python-37-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13459-1.html) + +用这个 Python 3.7 的特性来切片无限生成器 +====== + +> 了解更多关于这个和其他两个未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/05/230956bgcjacwcyujlndez.jpg) + +这是关于 Python 3.x 首发特性系列文章的第八篇。[Python 3.7][2] 于 2018 年首次发布,尽管它已经发布了几年,但它引入的许多特性都未被充分利用,而且相当酷。下面是其中的三个。 + +### 注解推迟评估 + +在 Python 3.7 中,只要激活了正确的 `__future__` 标志,注解在运行时就不会被评估: + +``` +from __future__ import annotations + +def another_brick(wall: List[Brick], brick: Brick) -> Education: + pass +``` + +``` +another_brick.__annotations__ +``` + +``` + {'wall': 'List[Brick]', 'brick': 'Brick', 'return': 'Education'} +``` + +它使递归类型(指向自己的类)和其他有趣的事情成为了可能。然而,这意味着如果你想做自己的类型分析,你需要明确地使用 `ast`。 + +``` +import ast +raw_type = another_brick.__annotations__['wall'] +[parsed_type] = ast.parse(raw_type).body +``` + +``` +subscript = parsed_type.value +f"{subscript.value.id}[{subscript.slice.id}]" +``` + +``` +    'List[Brick]' +``` + +### itertools.islice 支持 __index__ + +Python 中的序列切片长期以来一直接受各种 _类 int 对象_(具有 `__index__()` 的对象)作为有效的切片部分。然而,直到 Python 3.7,`itertools.islice`,即核心 Python 中对无限生成器进行切片的唯一方法,才获得了这种支持。 + +例如,现在可以用 `numpy.short` 大小的整数来切片无限生成器: + +``` +import numpy +short_1 = numpy.short(1) +short_3 = numpy.short(3) +short_1, type(short_1) +``` + +``` +    (1, numpy.int16) +``` + +``` +import itertools +list(itertools.islice(itertools.count(), short_1, short_3)) +``` + +``` +    [1, 2] +``` + +### functools.singledispatch() 注解注册 + +如果你认为 [singledispatch][3] 已经很酷了,你错了。现在可以根据注解来注册了: + +``` +import attr +import math +from functools import singledispatch + +@attr.s(auto_attribs=True, frozen=True) +class Circle: +    radius: float +        +@attr.s(auto_attribs=True, frozen=True) +class Square: +    side: float + +@singledispatch +def get_area(shape): +    raise NotImplementedError("cannot calculate area for unknown shape", +                              shape) + +@get_area.register +def _get_area_square(shape: Square): +    return shape.side ** 2 + +@get_area.register +def _get_area_circle(shape: Circle): +    return math.pi * (shape.radius ** 2) + +get_area(Circle(1)), get_area(Square(1)) +``` + +``` +    (3.141592653589793, 1) +``` + +### 欢迎来到 2017 年 + +Python 3.7 大约是四年前发布的,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将它们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-37-features + +作者:[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/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://opensource.com/downloads/cheat-sheet-python-37-beginners +[3]: https://opensource.com/article/19/5/python-singledispatch diff --git a/published/20210520 Make your API better with this positional trick from Python 3.8.md b/published/20210520 Make your API better with this positional trick from Python 3.8.md new file mode 100644 index 0000000000..3cc383ade7 --- /dev/null +++ b/published/20210520 Make your API better with this positional trick from Python 3.8.md @@ -0,0 +1,126 @@ +[#]: subject: (Make your API better with this positional trick from Python 3.8) +[#]: via: (https://opensource.com/article/21/5/python-38-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13466-1.html) + +用 Python 3.8 中的这个位置技巧让你的 API 变得更好 +====== + +> 探索只接受位置参数和其他两个未被充分利用但仍然有用的 Python 特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/07/164929k51eccocxkx4xf11.jpg) + +这是 Python 3.x 首发特性系列文章的第九篇。Python 3.8 于 2019 年首次发布,两年后,它的许多很酷的新特性仍然没有被使用。下面是其中的三个。 + +### importlib.metadata + +[入口点][2] 在 Python 包中被用来做各种事情。大多数人熟悉的是 [console_scripts][3] 入口点,不过 Python 中的许多插件系统都使用它们。 + +在 Python 3.8 之前,从 Python 中读取入口点的最好方法是使用 `pkg_resources`,这是一个有点笨重的模块,它是 `setuptools` 的一部分。 + +新的 `importlib.metadata` 是一个内置模块,它允许访问同样的东西: + +``` +from importlib import metadata as importlib_metadata + +distribution = importlib_metadata.distribution("numpy") +distribution.entry_points +``` + +``` +    [EntryPoint(name='f2py', value='numpy.f2py.f2py2e:main', group='console_scripts'), +     EntryPoint(name='f2py3', value='numpy.f2py.f2py2e:main', group='console_scripts'), +     EntryPoint(name='f2py3.9', value='numpy.f2py.f2py2e:main', group='console_scripts')] +``` + +入口点并不是 `importlib.metadata` 允许访问的唯一东西。可以调试、报告,或者(在极端情况下)触发兼容模式,你也可以在运行时检查依赖的版本! + + +``` +f"{distribution.metadata['name']}=={distribution.version}"`[/code] [code]`    'numpy==1.20.1' +``` + +### 只接受位置参数 + +强制关键字的参数在传达 API 作者的意图方面取得巨大成功之后,另一个空白被填补了:只接受位置参数。 + +特别是对于那些允许使用任意关键字的函数(例如,生成数据结构),这意味着对允许的参数名称的限制更少: + +``` +def some_func(prefix, /, **kwargs): +    print(prefix, kwargs) +``` + +``` +some_func("a_prefix", prefix="prefix keyword value") +``` + +``` +   a_prefix {'prefix': 'prefix keyword value'}` +``` + +注意,令人困惑的是,_变量_ `prefix` 的值与 `kwargs["prefix"]` 的值不同。就像在很多地方一样,要注意小心使用这个功能。 + +### 自我调试表达式 + +50 多年来,`print()` 语句(及其在其他语言中的对应语句)一直是快速调试输出的最爱。 + +但是我们在打印语句方面取得了很大的进展,比如: + +``` +special_number = 5 +print("special_number = %s" % special_number) +``` + +``` +    special_number = 5 +``` + +然而,自我记录的 f-strings 使它更容易明确: + + +``` +print(f"{special_number=}") +``` + +``` +    special_number=5` +``` + +在 f-string 插值部分的末尾添加一个 `=`,可以保留字面部分,同时添加数值。 + +当更复杂的表达式在该部分内时,这就更有用了: + +``` +values = {} +print(f"{values.get('something', 'default')=}") +``` + +``` +    values.get('something', 'default')='default' +``` + +### 欢迎来到 2019 年 + +Python 3.8 大约在两年前发布,它的一些新特性非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-38-features + +作者:[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/OSDC_women_computing_5.png?itok=YHpNs_ss (Women in computing and open source v5) +[2]: https://packaging.python.org/specifications/entry-points/ +[3]: https://python-packaging.readthedocs.io/en/latest/command-line-scripts.html diff --git a/published/20210521 How Python 3.9 fixed decorators and improved dictionaries.md b/published/20210521 How Python 3.9 fixed decorators and improved dictionaries.md new file mode 100644 index 0000000000..6f4a929d87 --- /dev/null +++ b/published/20210521 How Python 3.9 fixed decorators and improved dictionaries.md @@ -0,0 +1,129 @@ +[#]: subject: (How Python 3.9 fixed decorators and improved dictionaries) +[#]: via: (https://opensource.com/article/21/5/python-39-features) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13477-1.html) + +Python 3.9 如何修复装饰器并改进字典 +====== + +> 探索最近版本的 Python 的一些有用的特性。 + +![](https://img.linux.net.cn/data/attachment/album/202106/12/115315xrnd4evse8uzpi8i.jpg) + +这是 Python 3.x 首发特性系列文章中的第十篇,其中一些版本已经发布了一段时间。Python 3.9 在 2020 年首次发布,具有很酷的新特性,但仍未被充分利用。下面是其中的三个。 + +### 添加字典 + +假设你有一个 `defaults` 字典,而你想更新它的参数。在 Python 3.9 之前,最好的办法是复制 `defaults` 字典,然后使用 `.update()` 方法。 + +Python 3.9 为字典引入了联合运算符: + +``` +defaults = dict(who="someone", where="somewhere") +params = dict(where="our town", when="today") +defaults | params +``` + +``` + {'who': 'someone', 'where': 'our town', 'when': 'today'} +``` + +注意,顺序很重要。在这种情况下,正如预期,来自 `params` 的 `where` 值覆盖了默认值。 + +### 删除前缀 + +如果你用 Python 做临时的文本解析或清理,你会写出这样的代码: + +``` +def process_pricing_line(line): + if line.startswith("pricing:"): + return line[len("pricing:"):] + return line +process_pricing_line("pricing:20") +``` + +``` + '20' +``` + +这样的代码很容易出错。例如,如果字符串被错误地复制到下一行,价格就会变成 `0` 而不是 `20`,而且会悄悄地发生。 + +从 Python 3.9 开始,字符串有了一个 `.lstrip()` 方法: + +``` +"pricing:20".lstrip("pricing:") +``` + +``` + '20' +``` + +### 任意的装饰器表达式 + +以前,关于装饰器中允许哪些表达式的规则没有得到充分的说明,而且很难理解。例如:虽然 + +``` +@item.thing +def foo(): + pass +``` + +是有效的,而且: + +``` +@item.thing() +def foo(): + pass +``` + +是有效的,相似地: + +``` +@item().thing +def foo(): + pass +``` + +产生一个语法错误。 + +从 Python 3.9 开始,任何表达式作为装饰器都是有效的: + +``` +from unittest import mock + +item = mock.MagicMock() + +@item().thing +def foo(): + pass +print(item.return_value.thing.call_args[0][0]) +``` + +``` + +``` + +虽然在装饰器中保持简单的表达式仍然是一个好主意,但现在是人类的决定,而不是 Python 分析器的选择。 + +### 欢迎来到 2020 年 + +Python 3.9 大约在一年前发布,但在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将它们添加到你的工具箱中。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/python-39-features + +作者:[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/coffee_python.jpg?itok=G04cSvp_ (Python in a coffee cup.) \ No newline at end of file diff --git a/published/20210524 How to Install and Use XRDP on Ubuntu for Remote Desktop Connection.md b/published/20210524 How to Install and Use XRDP on Ubuntu for Remote Desktop Connection.md new file mode 100644 index 0000000000..ccd33e8e01 --- /dev/null +++ b/published/20210524 How to Install and Use XRDP on Ubuntu for Remote Desktop Connection.md @@ -0,0 +1,180 @@ +[#]: subject: (How to Install and Use XRDP on Ubuntu for Remote Desktop Connection) +[#]: via: (https://itsfoss.com/xrdp-ubuntu/) +[#]: author: (Hunter Wittenborn https://itsfoss.com/author/hunter/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13463-1.html) + +如何在 Ubuntu 上安装和使用 XRDP 进行远程桌面连接 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/07/093752qs3feworsvyoflvl.jpg) + +> 这是一份初学者指南,展示了在基于 Ubuntu 的 Linux 发行版上设置 XRDP 所需要遵循的步骤。有了它,你就可以从不同的电脑上访问你的 Ubuntu 系统,并以图形方式使用它。 + +微软的 [远程桌面协议][1](RDP) 是一个允许从一台计算机到另一台计算机进行图形化远程桌面连接的协议。RDP 的工作原理是让一台主机运行软件,允许其他几台计算机连接到它。 + +[XRDP][2] 是 RDP 的一个开源实现,不需要运行任何专有程序。XRDP 不仅试图遵循 RDP,而且还与常规的 RDP 客户端兼容,如 [Remmina][3] 和 [GNOME Boxes][4]。 + +下面是 XRDP 连接屏幕的样子。 + +![][5] + +### 使用 XRDP 需要注意的事项 + +虽然 XRDP 对于机器的远程访问非常好用,但重要的是要知道 XRDP **不** 适合什么。 + +#### 如果你需要一个安全的连接,请不要使用 XRDP + +通过 XRDP 建立的连接可以被攻击者查看和修改,因此应避免任何敏感信息。这一点可以通过使用 SSH 连接或证书来缓解,但这两者都需要更复杂的设置,这里就不一一介绍了。 + +#### XRDP 在默认情况下不能很好地应用主题 + +在我的测试中,XRDP 默认似乎从未应用过 [Ubuntu][6] 主题。在文章的结尾处有关于解决这个问题的说明。 + +#### 如果你只想/需要一个 CLI 环境,就不要使用 XRDP + +XRDP 是为在 GUI 环境中使用而设计和制造的。如果你打算在 CLI 环境中使用它,比如在服务器上,你应该看看其他工具,比如 SSH。 + +### 在 Ubuntu 上安装和使用 XRDP + +下面是这个远程连接设置正常工作所需的设置: + +* 一个安装了 XRDP 服务器的 Linux 系统。这是一个将被远程访问的系统。 +* 远程系统应该和你的系统在同一个网络上,或者它应该有一个 [公共 IP 地址][15]。 +* 远程 Linux 系统的用户名和密码。 +* 安装有 RDP 客户端的另一个系统(无论是 Linux、macOS 还是 Windows)。 + +![][8] + +#### 第 1 步:在远程计算机上安装 XRDP + +安装 XRDP 只需几个步骤,而且是相当直接的操作。 + +> 备注:在访问任何地方之前,请注意,这里说的 “远程机器” 是其他人连接到的机器。 + +XRDP 包含在大多数发行版的软件库中。在 Ubuntu 上,你可以在 universe 库中找到它。 + +你可以用下面的命令来安装它: + +``` +sudo apt install xrdp +``` + +#### 第 2 步:连接到远程机器 + +好消息是,XRDP 开箱就能使用! + +要连接到你安装了 XRDP 的机器上,你首先需要在本地机器上安装一个 RDP 客户端。 + +我将使用 GNOME Boxes,它可以通过以下方式安装: + +``` +sudo apt install gnome-boxes +``` + +GNOME Boxes 更多的是以虚拟机使用而闻名,但它也支持其他各种协议,包括 XRDP。 + +如果由于某种原因你不想使用 Boxes,你也可以使用一个叫做 Remmina 的客户端。 + +``` +sudo apt install remmina +``` + +不过,请注意,在本教程的其余部分,我将使用 Boxes。 + +首先,启动 GNOME Boxes,并点击 “+” 号,选择 “连接到远程计算机…”。 + +![][10] + +接下来,输入你要连接的机器的 IP 地址,前缀为 `rdp://`,然后按下图连接: + +> **不确定你的 IP 地址是什么?** +> +> 你可以用 `ip address` 命令找到你的 IP 地址。你需要寻找一个看起来像分成四组的数字的东西: +> ``` +> abhishek@its-foss:~$ ip address +> 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 +> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 +> inet 127.0.0.1/8 scope host lo +> valid_lft forever preferred_lft forever +> 2: wlp0s20f3: mtu 1500 qdisc noqueue state UP group default qlen 1000 +> link/ether dc:46:b9:fb:7a:c5 brd ff:ff:ff:ff:ff:ff +> inet 192.168.0.107/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp0s20f3 +> valid_lft 6183sec preferred_lft 6183sec +> ``` + +避免任何名为 `127.0.0.1` 的 IP 地址,因为那个地址指向你运行命令的机器。输出中应该有更多的 IP 地址,如上图所示。 + +![][11] + +然后,你应该会看到一个登录页面。将“会话”设置为 “Xorg”,只需输入你的用户名和密码,然后点击 “OK”。 + +![][5] + +之后,你应该看到远程主机的桌面: + +![][12] + +至此,一切都会像机器在你面前时一样表现。 + +### 故障排除:修复 XRDP 连接的主题问题 + +在我对 Ubuntu 20.04 的测试中,默认的 Yaru 主题似乎在连接时没有应用。这可以通过一些努力来解决。 + +首先,在远程计算机上运行这个命令: + +``` +sudo apt install gnome-tweaks gnome-shell-extensions dconf-editor -y +``` + +接下来,打开 “扩展” 应用,并打开如下开关: + +![][13] + +接下来,关闭你的远程桌面会话并重新登录。现在,打开 Tweaks,按照下面的截图配置: + +![][14] + +最后,打开 dconf 编辑器,并进入 `/org/gnome/shell/extensions/dash-toock/`。设置如下所示的值: + +* `custom-theme-shrink`:`On` +* `dock-fixed`:`On` +* `transparency-mode`:`FIXED` + +### 总结 + +至此,一切都准备好了,可以做你需要做的事了。 + +如果有什么地方做得不太对,或者你有什么问题或意见,请在下面留言。我会尽力帮助你的。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/xrdp-ubuntu/ + +作者:[Hunter Wittenborn][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/hunter/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Remote_Desktop_Protocol +[2]: https://en.wikipedia.org/wiki/Xrdp +[3]: https://remmina.org/ +[4]: https://wiki.gnome.org/Apps/Boxes +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_connected_login.png?resize=716%2C582&ssl=1 +[6]: https://ubuntu.com/ +[7]: https://itsfoss.com/install-gui-ubuntu-server/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp-ubuntu.png?resize=800%2C450&ssl=1 +[9]: https://itsfoss.com/check-ip-address-ubuntu/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_gnome-boxes_connect-begin.png?resize=744%2C580&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_gnome-boxes_rdp-connect.png?resize=757%2C514&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_connected_homescreen.png?resize=711%2C595&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_extensions.png?resize=800%2C557&ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/xrdp_tweaks.png?resize=800%2C550&ssl=1 +[15]: https://itsfoss.com/check-ip-address-ubuntu/ \ No newline at end of file diff --git a/published/20210526 Make Command Not Found- Here-s How to Fix it.md b/published/20210526 Make Command Not Found- Here-s How to Fix it.md new file mode 100644 index 0000000000..2840dc18ad --- /dev/null +++ b/published/20210526 Make Command Not Found- Here-s How to Fix it.md @@ -0,0 +1,82 @@ +[#]: subject: (Make Command Not Found? Here’s How to Fix it) +[#]: via: (https://itsfoss.com/make-command-not-found-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13451-1.html) + +Make 命令未找到?这是修复它的方法 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/02/203049l51rbr5v55kivg11.jpg) + +有一天,我试图在一个新的 Ubuntu 系统上编译一个程序,当我试图使用 `make` 命令时,它向我抛出一个错误: + +``` +The program 'make' is currently not installed. You can install it by typing: +sudo apt install make +``` + +这表明 `make` 命令还没有安装。你可以用这些命令在 Ubuntu 上逐步安装 `make`: + +``` +sudo apt update +sudo apt install make +``` + +第一个命令是更新本地的软件包缓存。如果是一个新安装的 Ubuntu 系统,这是很有必要的。有了刷新的软件包缓存,你的系统就会知道应该从哪个仓库下载 `make` 包。 + +并验证 `make` 是否已经正确安装: + +``` +make --version +``` + +![Checking make version][1] + +### 在 Ubuntu 上安装 make 的更好方法 + +安装 `make` 命令的一个更好的方法是使用 `build-essential` 包。这个包包含 `make`、`gcc`、`g++` 和其他一些编译器和开发工具。 + +``` +sudo apt install build-essential +``` + +![Installing Build Essential package][2] + +安装了这个 `build-essential` 包后,你就可以[在 Linux 中轻松地运行 C/C++ 程序][3]。 + +### 如果 make 已经安装了,但它没有工作怎么办? + +在一些罕见的情况下,可能会发生 `make` 已经安装了,但却无法工作的情况。 + +其原因是 `make` 命令不在 `$PATH` 变量中。你可以用这个命令重新安装 `make`: + +``` +sudo apt install --reinstall make +``` + +如果这不起作用,你可以尝试 [手动添加二进制文件到你的 PATH 中][4],但这应该不需要手动。 + +我希望这个快速提示能帮助你。仍然有问题或对相关主题有疑问?请随时在评论区留言。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/make-command-not-found-ubuntu/ + +作者:[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://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/check-make-version-linux.png?resize=800%2C293&ssl=1 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/install-build-essentials-800x410.png?resize=800%2C410&ssl=1 +[3]: https://itsfoss.com/c-plus-plus-ubuntu/ +[4]: https://itsfoss.com/add-directory-to-path-linux/ +[5]: https://itsfoss.community/ diff --git a/published/20210528 What you need to know about Quarkus in 2021.md b/published/20210528 What you need to know about Quarkus in 2021.md new file mode 100644 index 0000000000..1f3d85a35e --- /dev/null +++ b/published/20210528 What you need to know about Quarkus in 2021.md @@ -0,0 +1,67 @@ +[#]: subject: (What you need to know about Quarkus in 2021) +[#]: via: (https://opensource.com/article/21/5/quarkus) +[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13456-1.html) + +在 2021 年你需要知道 Quarkus 些什么? +====== + +> Quarkus 受益于 20 多年的 Java 开发历史,使开发应用变得更快、更容易。 + +![](https://img.linux.net.cn/data/attachment/album/202106/04/221812ja1b5btxpgwapsap.jpg) + +在云上发布服务部分是为了通过简单可靠的方式为用户和开发者提供对这些服务的便捷访问。与在线应用对接的最流行的方法之一是通过应用编程接口(API),这是一个花哨的术语,意味着你允许用户通过代码与你的应用进行互动。 + +API 的概念很重要,因为它可以帮助其他人在你的应用基础上进行开发。假设你设计了一个网站,当用户点击一个按钮时返回一个随机数字。通常情况下,这需要用户打开你的网站并点击一个按钮。网站可能是有用的,但只是在一定程度上。如果你包含一个 API,用户可以直接向你的服务器发送一个信号,要求一个随机数,或者他们可以自己编程,“调用”你的服务器来获取一个数字,而不需要点击或手动交互。开发者可以使用你的随机数作为游戏的数值,或作为密码生成器的一部分,或其他任何开发者需要随机数的地方(总是有的)。一个好的 API 可以解锁你的应用,让其他人使用你的代码结果,本质上,将你在网络上的工作转变为一个软件库。 + +### 什么是 Quarkus? + +[Quarkus][2] 是一个原生 Kubernetes Java 栈,为无服务器应用交付而设计。与有 20 年历史的 Java 相比,[Quarkus][3] 相对年轻,但受益于这 20 年的发展,用该项目的话说,是 “超音速的亚原子 Java”。可能没有人知道这句话的确切含义,但你肯定可以通过一下午使用 Quarkus 来感受到它对你的开发生活的意义。 + +Quarkus 让你用一个有用的 API 开发应用,几乎不需要配置,也不用担心启动一个复杂的环境。你不需要学习关于云计算或边缘计算的所有知识,就可以学习并擅长使用 Quarkus。了解 Quarkus 可以使你的开发更快,它可以帮助你为现代计算机网络制作灵活的应用。 + +下面是我们最近的一些涉及 Quarkus 的文章。 + +### 开始使用 Quarkus + +在 Saumya Singh 的《[如何创建你的第一个 Quarkus 应用][4]》中,你可以了解 Quarkus 和无服务器交付的好处,并在大约 10 分钟内创建了一个简单的演示应用。事实上,_10_ 分钟以内更准确,因为在 Maven 和 Quarkus 之间,几乎没有你想象中的那么多设置。它几乎感觉不到像 Java 一样的坏处,而感觉像 Java 一样好。 + +### 边缘开发 + +Linux 是创建物联网 (IoT) [边缘应用][5] 的一个流行平台。这有很多原因,包括安全性、编程语言和开发模型的广泛选择以及协议支持。不出所料,Quarkus 对物联网的处理非常好。Quarkus 的内存效率高,启动快,并且有快速的运行时,所以它不仅是物联网的可行解决方案,而且是理想的解决方案。你可以通过 Daniel Oh 的《[在 Linux 上使用开源的边缘开发入门][6]》来开始使用 Quarkus 和物联网。 + +### Quarkus 和 VS Code + +当你处理代码时,一个集成开发环境(IDE)会有很大的不同。微软的开源 [VS Code][7](或无品牌标志的 [VSCodium][8])是一个伪装成 IDE 的流行文本编辑器(或者说是伪装成文本编辑器的 IDE?),它有很多扩展,可以使它成为几乎任何编程语言的专门环境。如果你正在使用或考虑使用 VS Code,那么请阅读 Daniel Oh 的《[Quarkus in VS Code][9]》使用指南,了解一些关于 Maven、Quarkus 和 VS Code 如何协同工作的专业技巧。 + +### 获得 Quarkus + +使用 Quarkus 开发,可以像 Python 一样简单地设置环境,但它为你提供了强大的 Java 语言及其众多的库。它是进入云计算、[Knative][10] 和边缘计算的一个重要入口。获取 Quarkus 并开始编码。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/5/quarkus + +作者:[Alan Smithee][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/alansmithee +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud_tools_hardware.png?itok=PGjJenqT (Tools in a cloud) +[2]: https://quarkus.io +[3]: https://developers.redhat.com/blog/2019/03/07/quarkus-next-generation-kubernetes-native-java-framework/ +[4]: https://opensource.com/article/21/4/quarkus-tutorial +[5]: https://opensource.com/article/17/9/what-edge-computing +[6]: https://opensource.com/article/21/5/edge-quarkus-linux +[7]: https://github.com/microsoft/vscode +[8]: https://opensource.com/article/20/6/open-source-alternatives-vs-code +[9]: https://opensource.com/article/20/4/java-quarkus-vs-code +[10]: https://www.openshift.com/learn/topics/quarkus \ No newline at end of file diff --git a/published/20210601 Nyxt Browser is a Keyboard-oriented Web Browser Inspired by Emacs and Vim.md b/published/20210601 Nyxt Browser is a Keyboard-oriented Web Browser Inspired by Emacs and Vim.md new file mode 100644 index 0000000000..41208fd921 --- /dev/null +++ b/published/20210601 Nyxt Browser is a Keyboard-oriented Web Browser Inspired by Emacs and Vim.md @@ -0,0 +1,104 @@ +[#]: subject: (Nyxt Browser is a Keyboard-oriented Web Browser Inspired by Emacs and Vim) +[#]: via: (https://itsfoss.com/nyxt-browser/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13449-1.html) + +Nyxt 浏览器:一个受 Emacs 和 Vim 启发的面向键盘的网页浏览器 +====== + +你可以得到很多适用于 Linux 的开源网页浏览器,不只是基于 Chrome 的浏览器,而且还有 [其它的替代品][1]。 + +它们大多数都侧重于提供漂亮的用户体验,并同时兼顾隐私功能。 + +然而,Nyxt 浏览器可能不是为最好的用户体验而建立的,而是为资深用户喜欢的某些东西而打造的。 + +### Nyxt 浏览器:专注于键盘快捷键和命令的开源浏览器 + +![][2] + +[Nyxt][3] 是一个面向键盘的开源网页浏览器,可在 Linux 和 macOS 上使用。 + +当然,不是每个资深用户都会去使用键盘快捷键,但这旨在满足那些喜欢通过键盘导航的用户的需求。 + +它的灵感来自于 Vim 和 Emacs 中的键盘快捷键的工作方式 —— 所以如果你对这些编辑器很熟悉,那么你也会对这些快捷键感到熟悉。 + +与主流的网页浏览器不同,你不必在多个设置和菜单中导航,只需一个快速快捷键或一个命令,你就会获得所有你需要访问的功能。 + +如果你想知道的话,它不特定于某种网页引擎,它目前支持 WebEngine 和 WebKit。 + +因此,如果你是一个喜欢使用键盘导航的人,它可以节省时间并改善你的浏览体验。 + +它提供了相当多的有用功能,我将在下面指出。 + +### Nyxt 浏览器的特点 + +![][4] + +你会发现这里提供了许多非常规的功能。在探索这里提到的每一个关键亮点之前,你可能想先浏览一下官方文档(按 `F1` 找到它),你可以在欢迎屏幕中可以找到链接。 + + * 无损的树形的历史记录(跟踪你的浏览历史的确切层次,并轻松回忆你导航到的内容) + * 剪贴板历史,帮助你快速找到你之前复制的内容 + * 开始输入命令的键盘快捷方式(`CTRL+Space`) + * 使用键盘快捷键在冗长的文件中导航,可以跳到一个特定的标题 + * 缓冲区替代了标签,它将每个标签的行为和设置相互隔离 + * 通过将多个标签映射到一个共同的元素来一同关闭 + * 无鼠标导航 + * 使用搜索快速找到一个缓冲区,而不是在许多标签中寻找它 + * 能够根据你的工作流程运行简短的脚本 + * 可定制的自动填写功能,你也可以在表单中自动填写当前日期 + * 内置的广告拦截器 + +除了上面提到的功能外,你还可以切换**黑暗模式**、**HTTPS 模式**,以及在命令菜单中有大量的选项。 + +此外,它是完全可定制和可编程的。因此,你可以选择为自己量身定做。 + +### 在 Linux 中安装 Nyxt 浏览器 + +![][7] + +对于基于 Ubuntu 的发行版,你可以从 [官方下载页面][8] 找到一个 deb 包。 + +如果你还不会,你可能想读一下 [安装 deb 文件的方法][9]。 + +它也为 Arch Linux 用户提供了 [AUR][10],并为 Alpine Linux、Nix 和 Guix 提供了包。 + +如果你需要编译它,你也可以在 [GitHub 页面][11] 中找到源代码。 + +- [下载 Nyxt 浏览器][8] + +### 总结 + +虽然 Nyxt 浏览器可能不是最友好的浏览体验,但对于能够充分利用键盘快捷键和命令的用户来说,它肯定是一个特殊的选择。 + +如果你想要一个无鼠标的导航体验,这是一个值得尝试的浏览器。我建议你尝试一下 —— 但如果你一般不使用键盘快捷键来导航,这对你来说将是一个复杂的体验。 + +你尝试过 Nyxt 浏览器吗?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/nyxt-browser/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/open-source-browsers-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/nyxt-browser-screenshot.png?resize=1079%2C823&ssl=1 +[3]: https://nyxt.atlas.engineer/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/nyxt-browser.png?resize=1057%2C812&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/linux-terminal-based-browsers.png?fit=800%2C450&ssl=1 +[6]: https://itsfoss.com/terminal-web-browsers/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/nyxt-browser-settings.png?resize=800%2C617&ssl=1 +[8]: https://nyxt.atlas.engineer/download +[9]: https://itsfoss.com/install-deb-files-ubuntu/ +[10]: https://itsfoss.com/aur-arch-linux/ +[11]: https://github.com/atlas-engineer/nyxt diff --git a/published/20210602 Convert Images to ASCII Art in Linux Terminal With This Nifty Little Tool.md b/published/20210602 Convert Images to ASCII Art in Linux Terminal With This Nifty Little Tool.md new file mode 100644 index 0000000000..e4f3b70567 --- /dev/null +++ b/published/20210602 Convert Images to ASCII Art in Linux Terminal With This Nifty Little Tool.md @@ -0,0 +1,115 @@ +[#]: subject: (Convert Images to ASCII Art in Linux Terminal With This Nifty Little Tool) +[#]: via: (https://itsfoss.com/ascii-image-converter/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13461-1.html) + +在 Linux 终端将图像转换成 ASCII 艺术 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/06/210732m5oo91ao9ws33757.png) + +想在 Linux 终端中做一些有趣的事情吗?把一张普通的图片转换成 ASCII 艺术怎么样? + +你知道 [什么是 ASCII][1] 么?它是一个标准,在 8 位码中的 256 个空位上分配字母、数字和其他字符。ASCII 艺术是一个由可打印的 ASCII 字符组成的图形。基本上,它是由一堆字母、数字和特殊字符组成的。 + +你可能见过有人 [以 ASCII 格式显示他们发行版的标志][2],像这样: + +![][3] + +这很酷,对吗?把一张普通的图片转换成 ASCII 艺术怎么样?这就是在这篇文章中要探讨的问题。 + +### Ascii Image Converter + +顾名思义,[Ascii Image Converter][4] 是一个将图片转换为 ASCII 艺术的工具。它是一个用 Go 语言编写的基于命令行的工具,它打印出提供给它的图片的ASCII版本。 + +你可能认不出我,但下面的图片中的 ASCII 版就是我。那是我的 8 位头像。 + +![][5] + +该工具支持以下格式的输入图像: + +* JPEG/JPG +* PNG +* BMP +* WEBP +* TIFF/TIF + +让我们看看如何安装和使用它。 + +### 在 Linux 上安装 Ascii Image Converter + +这个有趣的工具也可以在 Windows 上使用,但我不打算这么做。在本教程中,让我们坚持使用 Linux。 + +如果你的发行版中启用了 [Snap][6],你可以用下面的命令轻松地安装它的 snap 包: + +``` +sudo snap install ascii-image-converter +``` + +你也可以从它的发布页面下载 Linux 的可执行文件,并把可执行文件放在 `/usr/local/bin/` 目录下。这样,你就能像普通的 Linux 命令一样运行它。如果你想知道为什么会这样,请了解一下 [Linux 目录层次结构][7]。 + +### 使用 Ascii Image Converter + +使用很简单。安装后,你只需要提供你想转换的图像的路径。 + +``` +ascii-image-converter path_to_image +``` + +你也可以提供图片的 URL,直接从网上把图片转换成 ASCII。 + +这是我的个人资料照片转换成 ASCII 格式。我把我的原始照片放在这里供大家参考。 + +![][8] + +你也可以转换成彩色的 ASCII。 + +``` +ascii-image-converter -C path_to_image +``` + +![][9] + +你可以通过提供它们的路径将多个图像转换为 ASCII。它将在终端显示器上一个接一个地打印 ASCII 版本。 + +也有一个选项可以保存生成的 ASCII 艺术。在旧版本中,它只会被保存为文本文件,而不是图像。开发者 Zoraiz Hassan 发布了一个新版本,现在该工具默认将生成的 ASCII 图像保存为 PNG 格式。 + +``` +ascii-image-converter path_to_image -s . +``` + +还有一些可用的选项,比如给输出一个特定的尺寸,使用更多的 ASCII 字符,或者使用你自己的字符集来打印 ASCII 艺术。你可以在 [项目的仓库][4] 上阅读相关内容。 + +### 喜欢它吗? + +你喜欢更多的 ASCII 相关的东西吗?那么 [在 Linux 上玩 ASCII 游戏][10] 怎么样?是的,你完全可以这么做。 + +如果你喜欢在终端做实验,你可能会喜欢这个工具。虽然我不知道 ASCII 转换后的图像能有什么好的实际用途。有什么想法吗? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ascii-image-converter/ + +作者:[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://www.computerhope.com/jargon/a/ascii.htm +[2]: https://itsfoss.com/display-linux-logo-in-ascii/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-mate-focal-neofetch.png?resize=800%2C543&ssl=1 +[4]: https://github.com/TheZoraiz/ascii-image-converter +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/abhishek-prakash-in-ascii.png?resize=800%2C445&ssl=1 +[6]: https://itsfoss.com/enable-snap-support-linux-mint/ +[7]: https://linuxhandbook.com/linux-directory-structure/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/abhishek-prakash-ascii-converted.png?resize=800%2C437&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/abhishek-colored-ascii.png?resize=800%2C429&ssl=1 +[10]: https://itsfoss.com/best-ascii-games/ diff --git a/published/20210602 openSUSE Leap 15.3 Release Finally Closes the Gap With SUSE Linux Enterprise.md b/published/20210602 openSUSE Leap 15.3 Release Finally Closes the Gap With SUSE Linux Enterprise.md new file mode 100644 index 0000000000..001bc83dbd --- /dev/null +++ b/published/20210602 openSUSE Leap 15.3 Release Finally Closes the Gap With SUSE Linux Enterprise.md @@ -0,0 +1,78 @@ +[#]: subject: (openSUSE Leap 15.3 Release Finally Closes the Gap With SUSE Linux Enterprise) +[#]: via: (https://news.itsfoss.com/opensuse-leap-15-3-release/) +[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (Chao-zhi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13469-1.html) + +openSUSE Leap 15.3 版本缩小了与 SUSE Linux 企业版的差距 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/08/184921thd7vc8qvxbhzt53.jpg) + +> 随着 openSUSE 15.3 的发布,与 SUSE Linux 企业版的差距终于缩小了。对于开发团队来说,这应该是一个令人兴奋的用于测试的更新。 + +去年,在 [openSUSE Leap 15.2 发行版][1] 中他们希望通过使用与企业版相同二进制软件包来构建 openSUSE Leap,从而缩小 openSUSE Leap 与 SUSE Linux 企业版之间的差距。 + +这样一来的话,如果有人在使用 openSUSE 测试后切换到 SUSE Linux 企业版,部署的迁移过程都将大大简化。此外,openSUSE Leap 将是开发团队进行测试的一个轻松选择。 + +随着 openSUSE Leap 15.3 的发布,这个构想成为了现实。本文我将重点介绍这次发布的主要变化。 + +### openSUSE Leap 15.3: 最新变化 + +最重要的变化是,它使用与 SUSE Linux 企业版相同的二进制软件包构建。 + +并且,[发布公告][2] 中提到了这一巨大变化的好处: + +> 此版本对于迁移项目和用户验收测试非常有益,使用 openSUSE leap 15.3 进行运行调优和测试工作负载的大型开发团队将会获得最大的好处,因为这些工作负载可以轻松提升并转移到 SUSE Linux 企业版 15 SP3 上进行长期维护。 + +除了这个巨大的变化,还有其他几个重要的变化使它成为一个令人激动的版本。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/Leap_15.3_xfce.png?w=1529&ssl=1) + +对于 Xfce 4.16 桌面,有一些视觉变化,包括新的图标和调色板。设置管理器还增加了一个视觉刷新功能,提供了更清晰的外观。 + +如果有需要,KDE Plasma 5.18 也可以作为 LTS 选项与此版本一起提供。而且,GNOME 3.34 在某些应用程序的外观和感觉上有一些细微的变化。虽然 Cinnamon 没有大的变化,但是你会发现它有了一个新的模式。 + +在这个版本中,你将发现 gnu health 3.8 添加了一些新特性供你探索。 + +DNF 包管理器有一个更新计划,但是当前没有释放出来,你可以通过后续的维护更新获得它。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/Leap_15.3_xfce4-terminal.png?w=1529&ssl=1) + +IBM Z 和 LinuxONE(s390x)是 Leap 15.3 中新支持的两种架构。 + +所包含的容器技术仍然保持不变,但是它们在本版本中收到了安全更新。当然,你需要去找 Linode 等托管解决方案提供的最新云镜像。 + +几个应用程序升级包括 Ononishare 2.2、Chromium 89 等。你可以在 [官方特性列表][4] 中找到更多详细信息。 + +### 下载 openSUSE Leap 15.3 + +需要注意的是,从今天起,Leap 15.2 将有六个月的寿命(EOL)。 + +在尝试升级到 Leap 15.3 之前,你必须确保运行的是 Leap 15.2。你可以在他们的 [官方发行说明][5] 中找到有关升级过程的更多信息。 + +从下面的按钮链接的官方下载页面获取最新的 ISO。 + +- [下载 openSUSE Leap 15.3][6] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/opensuse-leap-15-3-release/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[Chao-zhi](https://github.com/Chao-zhi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/opensuse-leap-15-2-release/ +[2]: https://news.opensuse.org/2021/06/02/opensuse-leap-bridges-path-to-enterprise/ +[4]: https://en.opensuse.org/Features_15.3 +[5]: https://en.opensuse.org/Release_announcement_15.3 +[6]: https://get.opensuse.org/leap/ diff --git a/published/20210603 How to Install Code Blocks IDE on Ubuntu Linux.md b/published/20210603 How to Install Code Blocks IDE on Ubuntu Linux.md new file mode 100644 index 0000000000..443aaf018c --- /dev/null +++ b/published/20210603 How to Install Code Blocks IDE on Ubuntu Linux.md @@ -0,0 +1,105 @@ +[#]: subject: (How to Install Code Blocks IDE on Ubuntu Linux) +[#]: via: (https://itsfoss.com/install-code-blocks-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) +[#]: collector: (lujun9972) +[#]: translator: (geekpi) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13484-1.html) + +如何在 Ubuntu Linux 上安装 Code Blocks IDE +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/14/164807ov99wdi2m7pmgz2j.jpg) + +Code Blocks 是一个用 C++ 编写的开源 IDE,非常适合 C、C++ 和 Fortran 开发。它是跨平台的,可以在 Linux、macOS 和 Windows 上运行。 + +Code Blocks 是轻量级和快速的。它支持工作区、多目标项目、工作区内的项目间依赖关系。 + +你可以得到语法高亮、代码折叠、标签式界面、类浏览器、智能缩进等功能。你还可以通过插件扩展 IDE 的功能。 + +在本教程中,你将学习如何在基于 Ubuntu 的 Linux 发行版上安装 Code Blocks。 + +> 注意 +> +> Code Blocks 也可以在 Ubuntu 软件中心找到。然而,从 Ubuntu 21.04 开始,从 Ubuntu 软件中心以图形方式安装 Code Blocks 会安装一个 codeblocks-common 软件包,而不是图形化 IDE。因而你不能看到安装在你系统上的 Code Blocks 以运行。由于这个原因,我建议采取终端的方式在 Ubuntu 上安装 Code Blocks。 + +### 在基于 Ubuntu 的 Linux 发行版上安装 Code Blocks + +[Code Blocks IDE][1] 在所有 Ubuntu 版本的 universe 库中都有。虽然它通常是默认启用的,但先[启用 universe 仓库][2]也无妨: + +``` +sudo add-apt-repository universe +``` + +更新软件包缓存,这样系统就能知道新添加的仓库中的额外软件包的可用性: + +``` +sudo apt update +``` + +最后,你可以使用 `apt install` 命令在基于 Ubuntu 的发行版上安装 Code Blocks: + +``` +sudo apt install codeblocks +``` + +![][3] + +建议你也安装额外的插件,以便从 Code Blocks IDE 中获得更多。你可以使用 `codeblocks-contrib` 包来安装它们: + +``` +sudo apt install codeblocks-contrib +``` + +### 如何使用 Code Blocks + +在系统菜单中搜索 “Code Blocks”。这是在 Ubuntu 默认的 GNOME 版本中的样子: + +![][4] + +当你第一次启动 Code Blocks 时,它会寻找你系统中所有可用的编译器,并将其添加到路径中,这样你就不用自己去配置它了。 + +在我的例子中,我的 Ubuntu 系统上已经安装了 gcc,Code Blocks 很好地识别了它。 + +![][5] + +Code Blocks 的用户界面绝对不够现代,但请记住,这个 IDE 是轻量级的,它几乎消耗不到 50MB 的内存。 + +如果你曾经使用过像 Eclipse 这样的其他 IDE,你就不会觉得使用 Code Block 有什么困难。你可以写你的代码并把它们组织在项目中。 + +构建、运行并构建和运行按钮一起放在顶部。 + +![][6] + +当你运行代码时,它会打开一个新的终端窗口来显示输出。 + +![][7] + +这就是你需要的关于 Code Blocks 的最少信息。剩下的留给你,你可以通过浏览它的 [维基][8] 和[用户手册][9] 来进一步探索它。 + +拥有一个 IDE 可以使 [在 Linux 上运行 C 或 C++ 程序][10] 更容易。Eclipse 是一个很好的 IDE,但它比 Code Blocks 要消耗更多的系统资源。当然,最后,重要的是你的选择。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-code-blocks-ubuntu/ + +作者:[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://www.codeblocks.org/ +[2]: https://itsfoss.com/ubuntu-repositories/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/install-code-blocks-ubuntu.png?resize=800%2C445&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/code-blocks-ubuntu.jpg?resize=800%2C231&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/code-blocks-ide-first-run.png?resize=800%2C529&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/code-blocks-ide.png?resize=800%2C543&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/code-blocks-code-run-terminal.png?resize=504%2C371&ssl=1 +[8]: https://wiki.codeblocks.org/index.php/Main_Page +[9]: https://www.codeblocks.org/user-manual/ +[10]: https://itsfoss.com/c-plus-plus-ubuntu/ diff --git a/published/20210605 15 Useful Visual Studio Code Keyboard Shortcuts to Increase Productivity.md b/published/20210605 15 Useful Visual Studio Code Keyboard Shortcuts to Increase Productivity.md new file mode 100644 index 0000000000..f2d1c5cdf8 --- /dev/null +++ b/published/20210605 15 Useful Visual Studio Code Keyboard Shortcuts to Increase Productivity.md @@ -0,0 +1,240 @@ +[#]: subject: (15 Useful Visual Studio Code Keyboard Shortcuts to Increase Productivity) +[#]: via: (https://itsfoss.com/vs-code-shortcuts/) +[#]: author: (Sarvottam Kumar https://itsfoss.com/author/sarvottam/) +[#]: collector: (lujun9972) +[#]: translator: (ywxgod) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13481-1.html) + +15 个提高工作效率的 VS Code 键盘快捷键 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/13/123502pqfi45mgpf8847yf.jpg) + +毫无疑问,微软的 [VS Code是最好的开源代码编辑器之一][1]。它与传说中的 Vim 不同,VS Code 不需要你是一个快捷键大师(LCTT 译注:以下都指键盘快捷键),开发者们对它大部分的功能都及其熟悉,且推崇备至。 + +但这并不意味着你不能成为快捷键大师,或者说你在 VS Code 中不应该使用快捷键。 + +在敲代码的时候,你可能需要用鼠标去执行其他的动作,比如在 VS Code 编辑器中切换终端,而此时你的代码流程会被打断,这是不是很讨厌?如果是的,那么你应该立即熟记下面这些 VS Code 有用的快捷键。 + +它不仅能帮助你摆脱鼠标,还能使你的生产力和工作效率得到提高。 + +那么,让我们来了解一下如何通过使用快捷键快速进行代码导航来进行快速编码。 + +### 有用的 VS Code 快捷键 + +免责声明。下面的这些快捷键是我在 VS Code 的使用中发现的较为有用的,你可以根据你的需要来发现更多有用的快捷键。 + +下面我还给出了 MacOS 用户的键盘快捷键。 + +#### 1、显示所有命令 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + P` 或 `F1` | `SHIFT + ⌘ + P` 或 `F1` + +我们从最有用的快捷键开始,这个快捷键能打开命令面板(列表),它提供了对 VS Code 所有功能的访问。 + +![命令面板][2] + +这是一个非常重要的 VS Code 快捷键,因为即使你忘记了或不想记起其他任何快捷键,但你记得这个,那么你仍然可以使用命令面板进行各种操作,如创建新文件、打开设置、改变主题,还可以查看所有快捷键。 + +#### 2、垂直和水平拆分 VS Code 编辑器 + +Windows/Linux | macOS +---|--- +`CTRL + \` | `⌘ + \` + +为了提高效率,但你又没有安装多个显示器,那么你可以通过水平或垂直分割 VS Code 的编辑器来一次查看多个文件的代码。 + +![分割 VS Code 编辑区][3] + +要在多个编辑区间切换焦点,你可以使用数字键或箭头键。 + +Windows/Linux | macOS +---|--- +`CTRL + 1`/`2`/`3` | `⌘ + 1`/`2`/`3` +`CTRL + K` `CTRL + ←`/`→` | `⌘ + K` `⌘ + ←`/`→` + +#### 3、切换集成终端 + +Windows/Linux | macOS +---|--- +CTRL + \` | ⌘ + \` + +VS Code 中的集成终端是一个非常方便的功能,它可以让你在不切换窗口的情况下快速执行任务。要在编辑器中显示/隐藏终端,下面的快捷键会非常方便。 + +![集成终端][4] + +但是,如果你跟我一样觉得 CTRL + \` 在键盘的角落位置而比较难按到,你可以打开命令面板执行`View: Toggle Terminal` 命令来切换终端。 + +![使用命令面板切换终端][5] + +#### 4、转到文件 + +Windows/Linux | macOS +---|--- +`CTRL + P` | `⌘ + P` + +随着项目的壮大,查找文件可能会变得困难。因此,我建议,即使你使用鼠标,这个命令也能为你节省很多搜索和导航到版本库中的文件的时间。 + +![转到文件][6] + +#### 5、转到行 + +Windows/Linux | macOS +---|--- +`CTRL + G` | `^ + G` + +当你找到文件,你可能需要去到文件中指定的行增加或编辑代码,而如果这个文件包含了数千行代码,那么滚动代码将会浪费你大量的时间。而 `CTRL + G` 或 `^ + G` 快捷键能让你快速的去掉指定的行。 + +![转到行][7] + +另外,你也可以使用上面的转到文件的快捷键,在输入框中输入冒号 `:` 加行号,结果就跟转到行是一样的。 + +#### 6、在整个项目中搜索 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + F` | `⌘ + SHIFT + F` + +很可能你需要在整个项目中搜索一个文本、变量或函数,在这种情况下,上面的命令就非常方便,它会在侧边栏显示一个搜索输入框。 + +![在项目中搜索][8] + +我们还可以在搜索的时候添加一些过滤器,比如使用 `ALT+C` 来启用大写匹配,`ALT+W` 用于匹配整个单词,`ALT+R` 用于启用正则表达式。 + +#### 7、禅模式 + +Windows/Linux | macOS +---|--- +`CTRL + K Z` | `⌘ + K Z` + +想要在不受干扰的环境中工作以保持更专注? 你可以试试禅模式(先按下 `CTRL + K`,再按下 `Z`),它会隐藏所有 UI(状态栏、活动栏、面板和侧边栏)并仅在全屏上显示编辑器。 + +![禅模式][9] + +要启用禅模式,你可以使用上面的快捷键或者打开命令面板执行 `View: Toggle Zen Mode`,要退出禅模式,你可以按两次 `Esc` 键。 + +#### 8、将选择添加到下一次匹配中 + +Windows/Linux | macOS +---|--- +`CTRL + D` | `⌘ + D` + +这条命令能让你选择所选文本的下一个出现的地方,从而进行编辑。如果下一个匹配出现的位置与第一个相离较远,那这将会很方便处理。 + +![查找下一个匹配][10] + +#### 9、切换行注释 + +Windows/Linux | macOS +---|--- +`CTRL + /` | `⌘ + /` + +将光标移到行的开头,然后添加双斜杠进行注释,这种麻烦的操作我们可以用上面的快捷键来代替了。 + +![注释代码][11] + +甚至,如果你想注释多行代码,你可以先通过 `SHIFT+UP`/`Down` 快捷键来选中多行,然后按 `CTRL+/` 快捷键进行注释。 + +#### 10、转到文件的开头或结尾 + +Windows/Linux | macOS +---|--- +`CTRL + HOME`/`END` | `⌘ + ↑`/`↓` + +如果你迷失在文件的中间位置,该命令可以让你快速达到文件的起点或终点。 + +#### 11、代码折叠或打开 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + [`/`]` | `⌥ + ⌘ + [`/`]` + +这也是最有用的快捷键之一,它可以帮助你折叠/取消折叠一个区域的代码。通过这种方式,你可以隐藏不必要的代码,每次只查看所需的部分代码,以便更加专注和快速编码。 + +![折叠一块代码][12] + +#### 12、窥视执行 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + F12` | `⌘ + SHIFT + F12` + +这个快捷键最有可能的作用是帮助你进行代码分析,或修复 bug 时了解函数和变量的运行情况。 + +![窥视执行][13] + +#### 13、删除当前行 + +Windows/Linux | macOS +---|--- +`CTRL + SHIFT + K` | `SHIFT + ⌘ + K` + +这是一条可以快速执行,选中当前行并按删除/退格键,这两个任务的简单命令。 + +#### 14、查找与替换 + +Windows/Linux | macOS +---|--- +`CTRL + F` | `⌘ + F` +`CTRL + H` | `⌥ + ⌘ + F` + +用一个新的文本替换文件中所有出现的该文本的最好方法是什么?如果你手动一个一个的通过滚动代码来处理,且如果需要替换的地方又很多,那么你可能会花费大量的时间。 + +![查找与替换][14] + +而使用查找和替换功能我们能在几秒内完成相同的任务。你可以用两个快捷键来打开它,其中一个实际上是打开用于查找文本的输入框,另一个用于输入新的文本。 + +#### 15、VS Code 的全部键盘快捷键 + +Windows/Linux | macOS +---|--- +`CTRL + K CTRL + S` | `⌘ + K ⌘ + S` + +最后,如果你还在为记住上述所有的快捷键而苦恼,你大可不必。因为你可以使用上面的快捷键查看编辑器所有可用的命令。 + +![快捷键][15] + +你还可以根据自己的喜好编辑命令的绑定键。 + +### 想要为 VS Code 添加更多快捷键? + +如果你想对 VS Code 的快捷键有完整的了解,你可以查看 VS Code 的 [文档][16]。 + +或者,如果你想在纸上将所有快捷键打印出来慢慢看,下面这些是各个系统对应的快捷键速查表: [Linux][17]、[macOS][18] 和 [Windows][19]。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/vs-code-shortcuts/ + +作者:[Sarvottam Kumar][a] +选题:[lujun9972][b] +译者:[ywxgod](https://github.com/ywxgod) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/sarvottam/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/Command-Palette.jpg?resize=800%2C418&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Split-VS-Code.png?resize=800%2C405&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/Integrated-Terminal.png?resize=800%2C221&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Toggle-Terminal-Using-Command-Palette.png?resize=686%2C118&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Go-to-file.jpg?resize=800%2C388&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/Go-to-line.jpg?resize=800%2C99&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/Search-project.jpg?resize=381%2C450&ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/Zen-Mode.png?resize=800%2C450&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Next-find-match.jpg?resize=800%2C313&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/Comment-out-code.jpg?resize=800%2C313&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/Collapse-a-region-of-code.jpg?resize=800%2C287&ssl=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Peek-Implementation.png?resize=800%2C339&ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/Find-and-replace.png?resize=800%2C223&ssl=1 +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/Keyboard-Shortcuts.png?resize=800%2C406&ssl=1 +[16]: https://code.visualstudio.com/docs/getstarted/keybindings +[17]: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf +[18]: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf +[19]: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf diff --git a/published/20210611 RTFM- How to Read (and Understand) the Fantastic Man Pages in Linux.md b/published/20210611 RTFM- How to Read (and Understand) the Fantastic Man Pages in Linux.md new file mode 100644 index 0000000000..aa785206b5 --- /dev/null +++ b/published/20210611 RTFM- How to Read (and Understand) the Fantastic Man Pages in Linux.md @@ -0,0 +1,349 @@ +[#]: subject: (RTFM! How to Read \(and Understand\) the Fantastic Man Pages in Linux) +[#]: via: (https://itsfoss.com/linux-man-page-guide/) +[#]: author: (Bill Dyer https://itsfoss.com/author/bill/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13478-1.html) + +RTFM!如何阅读(和理解)Linux 中神奇的手册页 +====== + +![](https://img.linux.net.cn/data/attachment/album/202106/12/161749re6iiuhzn9ni2in4.jpg) + +手册页man pages,即参考手册页reference manual pages的简称,是你进入 Linux 的钥匙。你想知道的一切都在那里,包罗万象。这套文档永远不会赢得普利策奖,但这套文档是相当准确和完整的。手册页是主要信源,其权威性是众所周知的。 + +虽然它们是源头,但阅读起来并不是最令人愉快的。有一次,在很久以前的哲学课上,有人告诉我,阅读 [亚里士多德][1] 是最无聊的阅读。我不同意:说到枯燥的阅读,亚里士多德远远地排在第二位,仅次于手册页。 + +乍一看,这些页面可能看起来并不完整,但是,不管你信不信,手册页并不是为了隐藏信息 —— 只是因为信息量太大,这些页面必须要有结构,而且信息是以尽可能简短的形式给出的。这些解释相当简略,需要一些时间来适应,但一旦你掌握了使用它们的技巧,你就会发现它们实际上是多么有用。 + +### Linux 中的手册页入门 + +这些页面是通过一个叫做 `man` 的工具查看的,使用它的命令相当简单。在最简单的情况下,要使用 `man`,你要在命令行上输入 `man`,后面加一个空格和你想查询的命令,比如 `ls` 或 `cp`,像这样: + +``` +man ls +``` + +`man` 会打开 `ls` 命令的手册页。 + +![][2] + +你可以用方向键上下移动,按 `q` 退出查看手册页。通常情况下,手册页是用 `less` 打开的,所以 `less` 命令的键盘快捷键在 `man` 中也可以使用。 + +例如,你可以用 `/search_term` 来搜索一个特定的文本,等等。 + +有一个关于手册页的介绍,这是一篇值得阅读介绍。它非常详细地说明了手册页是如何布局和组织的。 + +要看这个页面,请打开一个终端,然后输入: + +``` +man man +``` + +![man page of man][3] + +### 节 + +在你开始更深入地研究手册页之前,知道手册页有一个固定的页面布局和一个归档方案会有帮助。这可能会让新手感到困惑,因为我可以说:“看手册页中关于 `ls` 的 NAME section”,我也可以说:“看第 5 section中的 `passwd` 的手册页。” + +我把 “section” 这个词用斜体字表示,是为了显示混淆的来源。这个词,“节” 被用于两种不同的方式,但并不总是向新人解释其中的区别。 + +我不确定为什么会出现这种混淆,但我在培训新用户和初级系统管理员时看到过几次这种混淆。我认为这可能是隧道视野,专注于一件事会使一个人忘记另一件事。一叶障目,不见泰山。 + +对于那些已经知道其中的区别的人,你可以跳过这一小节。这一部分是针对那些刚接触到手册页的人。 + +这就是区别: + +#### 对于手册页 + +单独的手册页是用来显示信息块的。例如,每个手册页都有一个“NAME”节,显示命令的名称和简短的描述。还会有另一个信息块,称为“SYNOPSIS”,显示该命令是如何使用的,以此类推。 + +![][4] + +每个手册页都会有这些,以及其他的标题。这些在各个手册页上的节,或者说标题,有助于保持事情的一致性和信息的分工。 + +#### 对于手册 + +使用“节”,如 “查看第 5 节中的 `passwd` 的手册页”,是指整个手册的内容。当我们只看一页时,很容易忽略这一点,但是 `passwd` 手册页是同一本手册的一部分,该手册还有 `ls`、`rm`、`date`、`cal` 等的手册页。 + +整个 Linux 手册是巨大的;它有成千上万的手册页。其中一些手册页有专门的信息。有些手册页有程序员需要的信息,有些手册页有网络方面的独特信息,还有一些是系统管理员会感兴趣的。 + +这些手册页根据其独特的目的被分组。想想看,把整个手册分成几个章节 —— 每章有一个特定的主题。有 9 个左右的章节(非常大的章节)。碰巧的是,这些章节被称为“节”。 + +总结一下: + + * 手册中单页(我们称之为“手册页”)的节是由标题定义的信息块。 + * 这个大的手册(所有页面的集合)中的章节,刚好被称为“节”。 + +现在你知道区别了,希望本文的其余部分会更容易理解。 + +### 手册页的节 + +你将会看到不同的手册页,所以让我们先研究一下各个页面的布局。 + +手册页被分成几个标题,它们可能因提供者不同而不同,但会有相似之处。一般的分类如下: + + * `NAME`(名称) + * `SYNOPSIS`(概要) + * `DESCRIPTION`(描述) + * `EXAMPLES`(例子) + * `DIAGNOSTICS`(诊断) + * `FILES`(文件) + * `LIMITS`(限制) + * `PORTABILITY`(可移植性) + * `SEE ALSO`(另见) + * `HISTORY`(历史) + *  WARNING`(警告)或 `BUGS`(错误) + * `NOTES`(注意事项) + +`NAME` - 在这个标题下是命令的名称和命令的简要描述。 + +`SYNOPSIS` - 显示该命令的使用方法。例如,这里是 `cal` 命令的概要: + +``` +cal [Month] [Year] +``` + +概要以命令的名称开始,后面是选项列表。概要采用命令行的一般形式;它显示了你可以输入的内容和参数的顺序。方括号中的参数(`[]`)是可选的;你可以不输入这些参数,命令仍然可以正常工作。不在括号内的项目必须使用。 + +请注意,方括号只是为了便于阅读。当你输入命令时,不应该输入它们。 + +`DESCRIPTION` - 描述该命令或工具的作用以及如何使用它。这一节通常以对概要的解释开始,并说明如果你省略任何一个可选参数会发生什么。对于长的或复杂的命令,这一节可能会被细分。 + +`EXAMPLES ` - 一些手册页提供了如何使用命令或工具的例子。如果有这一节,手册页会尝试给出一些简单的使用例子,以及更复杂的例子来说明如何完成复杂的任务。 + +`DIAGNOSTICS` - 本节列出了由命令或工具返回的状态或错误信息。通常不显示不言自明的错误和状态信息。通常会列出可能难以理解的信息。 + +`FILES` - 本节包含了 UNIX 用来运行这个特定命令的补充文件的列表。这里,“补充文件”是指没有在命令行中指定的文件。例如,如果你在看 `passwd` 命令的手册,你可能会发现 `/etc/passwd` 列在这一节中,因为 UNIX 是在这里存储密码信息。 + +`LIMITS` - 本节描述了一个工具的限制。操作系统和硬件的限制通常不会被列出,因为它们不在工具的控制范围内。 + +`PORTABILITY` - 列出其他可以使用该工具的系统,以及该工具的其他版本可能有什么不同。 + +`SEE ALSO` - 列出包含相关信息的相关手册页。 + +`HISTORY` - 提供命令的简要历史,如它第一次出现的时间。 + +`WARNING` - 如果有这个部分,它包含了对用户的重要建议。 + +`NOTES` - 不像警告那样严重,但也是重要的信息。 + +同样,并不是所有的手册都使用上面列出的确切标题,但它们足够接近,可以遵循。 + +### 手册的节 + +整个 Linux 手册集合的手册页传统上被划分为有编号的节: + + **第 1 节**:Shell 命令和应用程序 + **第 2 节**:基本内核服务 - 系统调用和错误代码 + **第 3 节**:为程序员提供的库信息 + **第 4 节**:网络服务 - 如果安装了 TCP/IP 或 NFS 设备驱动和网络协议 + **第 5 节**:文件格式 - 例如:显示 `tar` 存档的样子 + **第 6 节**:游戏 + **第 7 节**:杂项文件和文档 + **第 8 节**:系统管理和维护命令 + **第 9 节**:不知名的内核规格和接口 + +将手册页分成这些组,可以使搜索更有效率。在我工作的地方,我有时会做一些编程工作,所以我花了一点时间看第 3 节的手册页。我也做一些网络方面的工作,所以我也知道要涉足网络部分。作为几个实验性机器的系统管理员,我在第 8 节花了很多时间。 + +将手册网归入特定的节(章节),使搜索信息更加容易 —— 无论是对需要搜索的人,还是对进行搜索的机器。 + +你可以通过名称旁边的数字来判断哪个手册页属于哪个部分。例如,如果你正在看 `ls` 的手册页,而页面的最上面写着。 `LS(1)`,那么你正在浏览第 1 节中的 `ls` 页面,该节包含关于 shell 命令和应用程序的页面。 + +下面是另一个例子。如果你在看 `passwd` 的手册页,页面的顶部显示: `PASSWD(1)`,说明你正在阅读第 1 节中描述 `passwd` 命令如何更改用户账户密码的手册页。如果你看到 `PASSWD(5)`,那么你正在阅读关于密码文件和它是如何组成的的手册页。 + +![][5] + +`passwd` 恰好是两个不同的东西:一个是命令的名称,一个是文件的名称。同样,第 1 节描述了命令,而第 5 节涉及文件格式。 + +括号中的数字是重要的线索 —— 这个数字告诉你正在阅读的页面来自哪一节。 + +### 搜索一个特定的节 + +基本命令: + +``` +man -a name +``` + +将在每一节中搜索由 `name` 标识的手册页,按数字顺序逐一显示。要把搜索限制在一个特定的部分,请在 `man` 命令中使用一个参数,像这样: + +``` +man 1 name +``` + +这个命令将只在手册页的第 1 节中搜索 `name`。使用我们前面的 `passwd` 例子,这意味着我们可以保持搜索的针对性。如果我想阅读 `passwd` 命令的手册页,我可以在终端输入以下内容: + +``` +man 1 passwd +``` + +`man` 工具将只在第 1 节中搜索 `passwd` 并显示它。它不会在任何其他节中寻找 `passwd`。 + +这个命令的另一种方法是输入: `man passwd.1`。 + +### 使用 man -k 来搜索包含某个关键词的所有手册页 + +如果你想获得包含某个关键词的手册页的列表,`man` 命令中的 `-k` 选项(通常称为标志或开关)可以派上用场。例如,如果你想看一个关于 `ftp` 的手册列表,你可以通过输入以下内容得到这个列表: + +``` +man -k ftp +``` + +在接下来的列表中,你可以选择一个特定的手册页来阅读: + +![man k example][6] + +在某些系统上,在 `man -k` 工作之前,系统管理员需要运行一个叫做 `catman` 的工具。 + +### 使用 whatis 和 whereis 命令来了解手册的各个节 + +有两个有趣的工具可以帮助你搜索信息:`whatis`和 `whereis`。 + +#### whatis + +有的时候,我们完全可以得到我们需要的信息。我们需要的信息有很大的机会是可以找到的 —— 找到它可能是一个小问题。 + +例如,如果我想看关于 `passwd` 文件的手册页,我在终端上输入: + +``` +man passwd +``` + +我就会看到关于 `passwd` 命令所有信息的手册页,但没有关于 `passwd` 文件的内容。我知道 `passwd` 是一个命令,也有一个 `passwd` 文件,但有时,我可能会忘记这一点。这时我才意识到,文件结构在手册页中的不同节,所以我输入了: + +``` +man 4 passwd +``` + +我得到这样的答复: + +``` +No manual entry for passwd in section 4 +See 'man 7 undocumented' for help when manual pages are not available. +``` + +又是一次健忘的失误。文件结构在 System V UNIX 页面的第 4 节中。几年前,当我建立文件时,我经常使用 `man 4 ...`;这仍然是我的一个习惯。那么它在 Linux 手册中的什么地方呢? + +现在是时候调用 `whatis` 来纠正我了。为了做到这一点,我在我的终端中输入以下内容: + +``` +whatis passwd +``` + +然后我看到以下内容: + +``` +passwd (1) - change user password +passwd (1ssl) - compute password hashes +passwd (5) - the password file +``` + +啊!`passwd` 文件的页面在第 5 节。现在没问题了,可以访问我想要的信息了: + +``` +man 5 passwd +``` + +然后我被带到了有我需要的信息的手册页。 + +`whatis` 是一个方便的工具,可以用简短的一句话告诉你一个命令的作用。想象一下,你想知道 `cal` 是做什么的,而不想查看手册页。只要在命令提示符下键入以下内容。 + +``` +whatis cal +``` + +你会看到这样的回应: + +``` +cal (1) - displays a calendar and the date of Easter +``` + +现在你知道了 `whatis` 命令,我可以告诉你一个秘密 —— 有一个 `man` 命令的等价物。为了得到这个,我们使用 `-f` 开关:`man -f ...`。 + +试试吧。在终端提示下输入 `whatis cal`。执行后就输入:`man -f cal`。两个命令的输出将是相同的: + +![whatis cal and man f cal outputs are the same][7] + +#### whereis + +`whereis` 命令的名字就说明了这一点 —— 它告诉你一个程序在文件系统中的位置。它也会告诉你手册页的存放位置。再以 `cal` 为例,我在提示符下输入以下内容: + +``` +whereis cal +``` + +我将看到这个: + +![whereis cal output][8] + +仔细看一下这个回答。答案只在一行里,但它告诉我两件事: + +- `/usr/bin/cal` 是 `cal` 程序所在的地方,以及 +- `/usr/share/man/man1/cal.1.gz` 是手册页所在的地方(我也知道手册页是被压缩的,但不用担心 —— `man` 命令知道如何即时解压)。 + +`whereis` 依赖于 `PATH` 环境变量;它只能告诉你文件在哪里,如果它们在你的 `PATH` 环境变量中。 + +你可能想知道是否有一个与 `whereis` 相当的 `man` 命令。没有一个命令可以告诉你可执行文件的位置,但有一个开关可以告诉你手册页的位置。在这个例子中使用 `date` 命令,如果我们输入: + +``` +whereis date +``` + +在终端提示符下,我们会看到: + +![whereis date output][9] + +我们看到 `date` 程序在 `/usr/bin/` 目录下,其手册页的名称和位置是:`/usr/share/man/man1/date.1.gz`。 + +我们可以让 `man` 像 `whereis` 一样行事,最接近的方法是使用 `-w` 开关。我们不会得到程序的位置,但我们至少可以得到手册页的位置,像这样: + +``` +man -w date +``` + +我们将看到这样的返回: + +![][10] + +你知道了 `whatis` 和 `whereis`,以及让 `man` 命令做同样(或接近)事情的方法。我展示了这两种方法,有几个不同的原因。 + +多年来,我使用 `whatis` 和 `whereis`,因为它们在我的培训手册中。直到最近我才了解到 `man -f ...` 和 `man -w ...`。我确信我看了几百次 `man` 的手册页,但我从未注意到 `-f` 和 `-w` 开关。我总是在看手册页的其他东西(例如:`man -k ...`)。我只专注于我需要找到的东西,而忽略了其他的东西。一旦我找到了我需要的信息,我就会离开这个页面,去完成工作,而不去注意这个命令所提供的其他一些宝贝。 + +这没关系,因为这部分就是手册页的作用:帮助你完成工作。 + +直到最近我向别人展示如何使用手册页时,我才花时间去阅读 —— “看看还有什么可能” —— 我们才真正注意到关于 `man` 命令的 `-f` 和 `-w` 标记可以做什么的信息。 + +不管你使用 Linux 多久了,或者多么有经验,总有一些新东西需要学习。 + +手册页会告诉你在完成某项任务时可能需要知道的东西 —— 但它们也有很多内容 —— 足以让你看起来像个魔术师,但前提是你要花时间去读。 + +### 结论 + +如果你花一些时间和精力在手册页上,你将会取得胜利。你对手册页的熟练程度,将在你掌握 Linux 的过程中发挥巨大作用。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-man-page-guide/ + +作者:[Bill Dyer][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/bill/ +[b]: https://github.com/lujun9972 +[1]: https://www.britannica.com/biography/Aristotle +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/man-page-example-800x527.png?resize=800%2C527&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/man_man.png?resize=800%2C455&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/man-page-example-1.png?resize=800%2C527&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/man-page-passwd-command.png?resize=1026%2C676&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/man-k_example.png?resize=800%2C200&ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/whatis_cal_man-f_cal.png?resize=800%2C135&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/whereis_cal.png?resize=800%2C100&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/whereis_date.png?resize=800%2C100&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/man-w_date-1.png?resize=800%2C100&ssl=1 diff --git a/scripts/check/collect.sh b/scripts/check/collect.sh index 3f8e0f0388..fdfb32bc01 100644 --- a/scripts/check/collect.sh +++ b/scripts/check/collect.sh @@ -11,11 +11,11 @@ set -e echo "[收集] 计算 PR 分支与目标分支的分叉点……" -TARGET_BRANCH="${TRAVIS_BRANCH:-master}" +TARGET_BRANCH="${GITHUB_BASE_REF:-master}" echo "[收集] 目标分支设定为:${TARGET_BRANCH}" MERGE_BASE='HEAD^' -[ "$TRAVIS_PULL_REQUEST" != 'false' ] \ +[ "$PULL_REQUEST_ID" != 'false' ] \ && MERGE_BASE="$(git merge-base "$TARGET_BRANCH" HEAD)" echo "[收集] 找到分叉节点:${MERGE_BASE}" diff --git a/sources/news/20200416 State of software engineering, JavaScript is the future, and more industry trends.md b/sources/news/20200416 State of software engineering, JavaScript is the future, and more industry trends.md deleted file mode 100644 index 201d0242e8..0000000000 --- a/sources/news/20200416 State of software engineering, JavaScript is the future, and more industry trends.md +++ /dev/null @@ -1,53 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (State of software engineering, JavaScript is the future, and more industry trends) -[#]: via: (https://opensource.com/article/20/4/state-software-engineering-javascript-and-more-industry-trends) -[#]: author: (Tim Hildred https://opensource.com/users/thildred) - -State of software engineering, JavaScript is the future, and more industry trends -====== -A weekly look at open source community and industry trends. -![Person standing in front of a giant computer screen with numbers, data][1] - -As part of my role as a senior product marketing manager at an enterprise software company with an open source development model, I publish a regular update about open source community, market, and industry trends for product marketers, managers, and other influencers. Here are five of my and their favorite articles from that update. - -## [State of Software Engineering in 2020][2] - -> Software is moving fast, and it is fusing into all other areas of industry. As it is a growing field, learning to program and improving your skills in software engineering can have get you great returns in the future. Moreover, identifying the fastest growing areas of software and investing your time into them can get you to even better places. Keep learning and try to find opportunities that you can capitalize on or products that can serve a niche in a growing field of software. When that niche becomes mainstream, you can end up with a successful product in your hands, which can become your future success. If it fails, it will be an immense experience on the path to becoming a product person. - -**The impact**: Learn COBOL, see the world! - -## [Why JavaScript is the programming language of the future][3] - -> JavaScript has one of the most mature – if not THE most mature – ecosystems a programming language could ever have. The community for JavaScript is vast, and the entry barrier is extremely low. - -**The impact**: The only knowledge I have of the veracity of this statement comes from the JavaScript people I follow on Twitter. If you can indeed extrapolate from them, then JavaScript has a pretty good shot. - -## [Why Linux containers are a CIO's best friend][4] - -> "A big take-away for CIOs is that fit enterprises increasingly view IT as a point of leverage for the business. Having a clear and consistent overall business strategy ranks as one of the most distinctive traits of fit enterprises," said Gartner VP and Distinguished Analyst Andy Roswell-Jones, in Gartner's report on the survey. "In such organizations, digital technology will drive that strategy." - -**The impact**: Point of leverage meaning that if the IT an organization is selected in reference to and in support of that organization's overall strategy there will be an outsized lift on execution against that strategy. The corollary is that without a clear and consistent business strategy no technology can save your enterprise. - -_I hope you enjoyed this list and come back next week for more open source community, market, and industry trends._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/state-software-engineering-javascript-and-more-industry-trends - -作者:[Tim Hildred][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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://quanticdev.com/articles/software-engineering-in-2020/ -[3]: https://www.freecodecamp.org/news/future-of-javascript/ -[4]: https://www.ciodive.com/news/linux-containers-kubernetes/575506/ diff --git a/sources/news/20210610 Vivaldi 4.0 Looks Like an All-in-One Browser for Linux.md b/sources/news/20210610 Vivaldi 4.0 Looks Like an All-in-One Browser for Linux.md new file mode 100644 index 0000000000..50d653af38 --- /dev/null +++ b/sources/news/20210610 Vivaldi 4.0 Looks Like an All-in-One Browser for Linux.md @@ -0,0 +1,115 @@ +[#]: subject: (Vivaldi 4.0 Looks Like an All-in-One Browser for Linux) +[#]: via: (https://news.itsfoss.com/vivaldi-4-0-release/) +[#]: author: (Omar Maarof https://news.itsfoss.com/author/omar/) +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) + +Vivaldi 4.0 Looks Like an All-in-One Browser for Linux +====== + +Vivaldi 4.0 is the latest version that introduces new functionalities for multitaskers and users who rely on web browsers for everything. + +It is worth noting that only the UI layer of Vivaldi is closed-source, more than 93% of its source code is open-source. Even though it is not completely FOSS, many users use it because of its anti-tracking policy, appealing interface, and active Linux support. + +In case you did not know, recently [Vivaldi made significant performance improvements][1] taking Linux (Ubuntu) into account for testing. So, it looks like they keep Linux users in mind, which is a good thing. + +If you thought [Firefox 89][2] release was exciting, Vivaldi is particularly interesting for its new additions. + +### Vivaldi 4.0: What’s New? + +The latest major release focuses to prove itself as a better alternative to popular web browsers like Google Chrome, and Microsoft Edge. + +#### Vivaldi Translate + +![][3] + +Powered by [Lingvanex][4], Vivaldi Translate delivers a concise translation for your text, removing the need to install a plugin or using a separate translator tool and providing a secure translation too. + +Have you ever had to access a website in a language you do not understand? If yes, then you know how painful it is to copy-paste the text into a translator to understand what the page is saying. + +But now that you have an integrated tool with Vivaldi that facilitates your browsing experience without compromising your privacy. You can access the translation feature using the icon in the address bar whenever you load a website with a different language. + +#### Vivaldi Mail (Beta) + +![][5] + +Using a browser is a good way of exchanging information, including emails. When you have multiple emails for different purposes, it can get quickly overwhelming managing them. + +Mail makes it easier by assembling your diverse emails into a single place in the web browser. Due to its support for IMAP and POP3, you can integrate most email providers. + +So, you do not have to install a 3rd party webmail client to keep things convenient to access. + +#### Vivaldi Feed Reader (Beta) + +![][6] + +RSS is the go-to online reading for many users. + +While we have [RSS readers for Linux][7] already. You can access Vivaldi Feed Reader right from Mail; thus, allowing you to filter feeds and apply certain properties on them. + +You can add articles, YouTube videos, podcasts, and more to the feed. When you load up a site for anything, a feed icon comes up in the right-side of the address bar. All you have to do is click on it to add things to your feed, it is that easy. + +#### Vivaldi Calendar (Beta) + +Vivaldi Calendar does all that you expect from a full-fledged calendar app without the trade-off of your privacy. And this is an extremely useful addition to Vivaldi. + +Accessing what you plan without launching a separate service or app and having the ability to quickly access it in your browser should save a lot of time. + +#### Other Changes + +While Vivaldi offers a lot of features, it also makes it easy to choose the experience you want right after you launch the browser + +There are three layouts you can select: + +![][3] + + * **Essentials**: Only Ad blocker and translations available. + * **Classic**: Everything in essentials, plus side panels and status bar. + * **Fully Loaded:** All the features offered ready for access in your layout including the Calendar, Mail, and Feed Reader. + + + +For more information on how it all works and details of the latest release, you may want to go through the [announcement post][8]. + +### Summing Up + +Vivaldi is a cross-platform web browser that does not neglect Linux users. With the latest Vivaldi 4.0 release, the browser offers an exciting experience with an arsenal of features that major web browsers do not offer. + +You can download the latest update from the official website (DEB/RPM files available). You can also choose to manually add the repositories for your distribution using the [official instructions][9]. + +[Download Vivaldi 4.0][10] + +_What do you think about using Vivaldi on Linux after this major upgrade?_ + +#### Big Tech Websites Get Millions in Revenue, It's FOSS Got You! + +If you like what we do here at It's FOSS, please consider making a donation to support our independent publication. Your support will help us keep publishing content focusing on desktop Linux and open source software. + +I'm not interested + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/vivaldi-4-0-release/ + +作者:[Omar Maarof][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://news.itsfoss.com/author/omar/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/vivaldi-browser-3-7-release/ +[2]: https://news.itsfoss.com/firefox-89-release/ +[3]: data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjQzOSIgd2lkdGg9Ijc4MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjEiLz4= +[4]: https://lingvanex.com +[5]: data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjUwNCIgd2lkdGg9Ijc4MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjEiLz4= +[6]: data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjEzMiIgd2lkdGg9Ijc4MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjEiLz4= +[7]: https://itsfoss.com/feed-reader-apps-linux/ +[8]: https://vivaldi.com/blog/vivaldi-4-0/ +[9]: https://help.vivaldi.com/desktop/install-update/manual-setup-vivaldi-linux-repositories/ +[10]: https://vivaldi.com/download/ diff --git a/sources/talk/20160921 lawyer The MIT License, Line by Line.md b/sources/talk/20160921 lawyer The MIT License, Line by Line.md deleted file mode 100644 index 78abc6b9f1..0000000000 --- a/sources/talk/20160921 lawyer The MIT License, Line by Line.md +++ /dev/null @@ -1,296 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (lawyer The MIT License, Line by Line) -[#]: via: (https://writing.kemitchell.com/2016/09/21/MIT-License-Line-by-Line.html) -[#]: author: (Kyle E. Mitchell https://kemitchell.com/) - -lawyer The MIT License, Line by Line -====== - -### The MIT License, Line by Line - -[The MIT License][1] is the most popular open-source software license. Here’s one read of it, line by line. - -#### Read the License - -If you’re involved in open-source software and haven’t taken the time to read the license from top to bottom—it’s only 171 words—you need to do so now. Especially if licenses aren’t your day-to-day. Make a mental note of anything that seems off or unclear, and keep trucking. I’ll repeat every word again, in chunks and in order, with context and commentary. But it’s important to have the whole in mind. - -> The MIT License (MIT) -> -> Copyright (c) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software. - -The license is arranged in five paragraphs, but breaks down logically like this: - - * **Header** - * **License Title** : “The MIT License” - * **Copyright Notice** : “Copyright (c) …” - * **License Grant** : “Permission is hereby granted …” - * **Grant Scope** : “… to deal in the Software …” - * **Conditions** : “… subject to …” - * **Attribution and Notice** : “The above … shall be included …” - * **Warranty Disclaimer** : “The software is provided ‘as is’ …” - * **Limitation of Liability** : “In no event …” - - - -Here we go: - -#### Header - -##### License Title - -> The MIT License (MIT) - -“The MIT License” is a not a single license, but a family of license forms derived from language prepared for releases from the Massachusetts Institute of Technology. It has seen a lot of changes over the years, both for the original projects that used it, and also as a model for other projects. The Fedora Project maintains a [kind of cabinet of MIT license curiosities][2], with insipid variations preserved in plain text like anatomical specimens in formaldehyde, tracing a wayward kind of evolution. - -Fortunately, the [Open Source Initiative][3] and [Software Package Data eXchange][4] groups have standardized a generic MIT-style license form as “The MIT License”. OSI in turn has adopted SPDX’ standardized [string identifiers][5] for common open-source licenses, with `MIT` pointing unambiguously to the standardized form “MIT License”. If you want MIT-style terms for a new project, use [the standardized form][1]. - -Even if you include “The MIT License” or “SPDX:MIT” in a `LICENSE` file, any responsible reviewer will still run a comparison of the text against the standard form, just to be sure. While various license forms calling themselves “MIT License” vary only in minor details, the looseness of what counts as an “MIT License” has tempted some authors into adding bothersome “customizations”. The canonical horrible, no good, very bad example of this is [the JSON license][6], an MIT-family license plus “The Software shall be used for Good, not Evil.”. This kind of thing might be “very Crockford”. It is definitely a pain in the ass. Maybe the joke was supposed to be on the lawyers. But they laughed all the way to the bank. - -Moral of the story: “MIT License” alone is ambiguous. Folks probably have a good idea what you mean by it, but you’re only going to save everyone—yourself included—time by copying the text of the standard MIT License form into your project. If you use metadata, like the `license` property in package manager metadata files, to designate the `MIT` license, make sure your `LICENSE` file and any header comments use the standard form text. All of this can be [automated][7]. - -##### Copyright Notice - -> Copyright (c) - -Until the 1976 Copyright Act, United States copyright law required specific actions, called “formalities”, to secure copyright in creative works. If you didn’t follow those formalities, your rights to sue others for unauthorized use of your work were limited, often completely lost. One of those formalities was “notice”: Putting marks on your work and otherwise making it known to the market that you were claiming copyright. The © is a standard symbol for marking copyrighted works, to give notice of copyright. The ASCII character set doesn’t have the © symbol, but `Copyright (c)` gets the same point across. - -The 1976 Copyright Act, which “implemented” many requirements of the international Berne Convention, eliminated formalities for securing copyright. At least in the United States, copyright holders still need to register their copyrighted works before suing for infringement, with potentially higher damages if they register before infringement begins. In practice, however, many register copyright right before bringing suit against someone in particular. You don’t lose your copyright just by failing to put notices on it, registering, sending a copy to the Library of Congress, and so on. - -Even if copyright notices aren’t as absolutely necessary as they used to be, they are still plenty useful. Stating the year a work was authored and who the copyright belonged to give some sense of when copyright in the work might expire, bringing the work into the public domain. The identity of the author or authors is also useful: United States law calculates copyright terms differently for individual and “corporate” authors. Especially in business use, it may also behoove a company to think twice about using software from a known competitor, even if the license terms give very generous permission. If you’re hoping others will see your work and want to license it from you, copyright notices serve nicely for attribution. - -As for “copyright holder”: Not all standard form licenses have a space to write this out. More recent license forms, like [Apache 2.0][8] and [GPL 3.0][9], publish `LICENSE` texts that are meant to be copied verbatim, with header comments and separate files elsewhere to indicate who owns copyright and is giving the license. Those approaches neatly discourage changes to the “standard” texts, accidental or intentional. They also make automated license identification more reliable. - -The MIT License descends from language written for releases of code by institutions. For institutional releases, there was just one clear “copyright holder”, the institution releasing the code. Other institutions cribbed these licenses, replacing “MIT” with their own names, leading eventually to the generic forms we have now. This process repeated for other short-form institutional licenses of the era, notably the [original four-clause BSD License][10] for the University of California, Berkeley, now used in [three-clause][11] and [two-clause][12] variants, as well as [The ISC License][13] for the Internet Systems Consortium, an MIT variant. - -In each case, the institution listed itself as the copyright holder in reliance on rules of copyright ownership, called “[works made for hire][14]” rules, that give employers and clients ownership of copyright in some work their employees and contractors do on their behalf. These rules don’t usually apply to distributed collaborators submitting code voluntarily. This poses a problem for project-steward foundations, like the Apache Foundation and Eclipse Foundation, that accept contributions from a more diverse group of contributors. The usual foundation approach thus far has been to use a house license that states a single copyright holder—[Apache 2.0][8] and [EPL 1.0][15]—backed up by contributor license agreements—[Apache CLAs][16] and [Eclipse CLAs][17]—to collect rights from contributors. Collecting copyright ownership in one place is even more important under “copyleft” licenses like the GPL, which rely on copyright owners to enforce license conditions to promote software-freedom values. - -These days, loads of projects without any kind of institutional or business steward use MIT-style license terms. SPDX and OSI have helped these use cases by standardizing forms of licenses like MIT and ISC that don’t refer to a specific entity or institutional copyright holder. Armed with those forms, the prevailing practice of project authors is to fill their own name in the copyright notice of the form very early on … and maybe bump the year here and there. At least under United States copyright law, the resulting copyright notice doesn’t give a full picture. - -The original owner of a piece of software retains ownership of their work. But while MIT-style license terms give others rights to build on and change the software, creating what the law calls “derivative works”, they don’t give the original author ownership of copyright in others’ contributions. Rather, each contributor has copyright in any [even marginally creative][18] work they make using the existing code as a starting point. - -Most of these projects also balk at the idea of taking contributor license agreements, to say nothing of signed copyright assignments. That’s both naive and understandable. Despite the assumption of some newer open-source developers that sending a pull request on GitHub “automatically” licenses the contribution for distribution on the terms of the project’s existing license, United States law doesn’t recognize any such rule. Strong copyright protection, not permissive licensing, is the default. - -Update: GitHub later changed its site-wide terms of service to include an attempt to flip this default, at least on GitHub.com. I’ve written up some thoughts on that development, not all of them positive, in [another post][19]. - -To fill the gap between legally effective, well-documented grants of rights in contributions and no paper trail at all, some projects have adopted the [Developer Certificate of Origin][20], a standard statement contributors allude to using `Signed-Off-By` metadata tags in their Git commits. The Developer Certificate of Origin was developed for Linux kernel development in the wake of the infamous SCO lawsuits, which alleged that chunks of Linux’ code derived from SCO-owned Unix source. As a means of creating a paper trail showing that each line of Linux came from a contributor, the Developer Certificate of Origin functions nicely. While the Developer Certificate of Origin isn’t a license, it does provide lots of good evidence that those submitting code expected the project to distribute their code, and for others to use it under the kernel’s existing license terms. The kernel also maintains a machine-readable `CREDITS` file listing contributors with name, affiliation, contribution area, and other metadata. I’ve done [some][21] [experiments][22] adapting that approach for projects that don’t use the kernel’s development flow. - -#### License Grant - -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), - -The meat of The MIT License is, you guessed it, a license. In general terms, a license is permission that one person or legal entity—the “licensor”—gives another—the “licensee”—to do something the law would otherwise let them sue for. The MIT License is a promise not to sue. - -The law sometimes distinguishes licenses from promises to give licenses. If someone breaks a promise to give a license, you may be able to sue them for breaking their promise, but you may not end up with a license. “Hereby” is one of those hokey, archaic-sounding words lawyers just can’t get rid of. It’s used here to show that the license text itself gives the license, and not just a promise of a license. It’s a legal [IIFE][23]. - -While many licenses give permission to a specific, named licensee, The MIT License is a “public license”. Public licenses give everybody—the public at large—permission. This is one of the three great ideas in open-source licensing. The MIT License captures this idea by giving a license “to any person obtaining a copy of … the Software”. As we’ll see later, there is also a condition to receiving this license that ensures others will learn about their permission, too. - -The parenthetical with a capitalized term in quotation marks (a “Definition”), is the standard way to give terms specific meanings in American-style legal documents. Courts will reliably look back to the terms of the definition when they see a defined, capitalized term used elsewhere in the document. - -##### Grant Scope - -> to deal in the Software without restriction, - -From the licensee’s point of view, these are the seven most important words in The MIT License. The key legal concerns are getting sued for copyright infringement and getting sued for patent infringement. Neither copyright law nor patent law uses “to deal in” as a term of art; it has no specific meaning in court. As a result, any court deciding a dispute between a licensor and a licensee would ask what the parties meant and understood by this language. What the court will see is that the language is intentionally broad and open-ended. It gives licensees a strong argument against any claim by a licensor that they didn’t give permission for the licensee to do that specific thing with the software, even if the thought clearly didn’t occur to either side when the license was given. - -> including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, - -No piece of legal writing is perfect, “fully settled in meaning”, or unmistakably clear. Beware anyone who pretends otherwise. This is the least perfect part of The MIT License. There are three main issues: - -First, “including without limitation” is a legal antipattern. It crops up in any number of flavors: - - * “including, without limitation” - * “including, without limiting the generality of the foregoing” - * “including, but not limited to” - * many, many pointless variations - - - -All of these share a common purpose, and they all fail to achieve it reliably. Fundamentally, drafters who use them try to have their cake and eat it, too. In The MIT License, that means introducing specific examples of “dealing in the Software”—“use, copy, modify” and so on—without implying that licensee action has to be something like the examples given to count as “dealing in”. The trouble is that, if you end up needing a court to review and interpret the terms of a license, the court will see its job as finding out what those fighting meant by the language. If the court needs to decide what “deal in” means, it cannot “unsee” the examples, even if you tell it to. I’d argue that “deal in the Software without restriction” alone would be better for licensees. Also shorter. - -Second, the verbs given as examples of “deal in” are a hodgepodge. Some have specific meanings under copyright or patent law, others almost do or just plain don’t: - - * use appears in [United States Code title 35, section 271(a)][24], the patent law’s list of what patent owners can sue others for doing without permission. - - * copy appears in [United States Code title 17, section 106][25], the copyright law’s list of what copyright owners can sue others for doing without permission. - - * modify doesn’t appear in either copyright or patent statute. It is probably closest to “prepare derivative works” under the copyright statute, but may also implicate improving or otherwise derivative inventions. - - * merge doesn’t appear in either copyright or patent statute. “Merger” has a specific meaning in copyright, but that’s clearly not what’s intended here. Rather, a court would probably read “merge” according to its meaning in industry, as in “to merge code”. - - * publish doesn’t appear in either copyright or patent statute. Since “the Software” is what’s being published, it probably hews closest to “distribute” under the [copyright statute][25]. That statute also covers rights to perform and display works “publicly”, but those rights apply only to specific kinds of copyrighted work, like plays, sound recordings, and motion pictures. - - * distribute appears in the [copyright statute][25]. - - * sublicense is a general term of intellectual property law. The right to sublicense means the right to give others licenses of their own, to do some or all of what you have permission to do. The MIT License’s right to sublicense is actually somewhat unusual in open-source licenses generally. The norm is what Heather Meeker calls a “direct licensing” approach, where everyone who gets a copy of the software and its license terms gets a license direct from the owner. Anyone who might get a sublicense under the MIT License will probably end up with a copy of the license telling them they have a direct license, too. - - * sell copies of is a mongrel. It is close to “offer to sell” and “sell” in the [patent statute][24], but refers to “copies”, a copyright concept. On the copyright side, it seems close to “distribute”, but the [copyright statute][25] makes no mention of sales. - - * permit persons to whom the Software is furnished to do so seems redundant of “sublicense”. It’s also unnecessary to the extent folks who get copies also get a direct license. - - - - -Lastly, as a result of this mishmash of legal, industry, general-intellectual-property, and general-use terms, it isn’t clear whether The MIT License includes a patent license. The general language “deal in” and some of the example verbs, especially “use”, point toward a patent license, albeit a very unclear one. The fact that the license comes from the copyright holder, who may or may not have patent rights in inventions in the software, as well as most of the example verbs and the definition of “the Software” itself, all point strongly toward a copyright license. More recent permissive open-source licenses, like [Apache 2.0][8], address copyright, patent, and even trademark separately and specifically. - -##### Three License Conditions - -> subject to the following conditions: - -There’s always a catch! MIT has three! - -If you don’t follow The MIT License’s conditions, you don’t get the permission the license offers. So failing to do what the conditions say at least theoretically leaves you open to a lawsuit, probably a copyright lawsuit. - -Using the value of the software to the licensee to motivate compliance with conditions, even though the licensee paid nothing for the license, is the second great idea of open-source licensing. The last, not found in The MIT License, builds off license conditions: “Copyleft” licenses like the [GNU General Public License][9] use license conditions to control how those making changes can license and distribute their changed versions. - -##### Notice Condition - -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -If you give someone a copy of the software, you need to include the license text and any copyright notice. This serves a few critical purposes: - - 1. Gives others notice that they have permission for the software under the public license. This is a key part of the direct-licensing model, where each user gets a license direct from the copyright holder. - - 2. Makes known who’s behind the software, so they can be showered in praises, glory, and cold, hard cash donations. - - 3. Ensures the warranty disclaimer and limitation of liability (coming up next) follow the software around. Everyone who gets a copy should get a copy of those licensor protections, too. - - - - -There’s nothing to stop you charging for providing a copy, or even a copy in compiled form, without source code. But when you do, you can’t pretend that the MIT code is your own proprietary code, or provided under some other license. Those receiving get to know their rights under the “public license”. - -Frankly, compliance with this condition is breaking down. Nearly every open-source license has such an “attribution” condition. Makers of system and installed software often understand they’ll need to compile a notices file or “license information” screen, with copies of license texts for libraries and components, for each release of their own. The project-steward foundations have been instrumental in teaching those practices. But web developers, as a whole, haven’t got the memo. It can’t be explained away by a lack of tooling—there is plenty—or the highly modular nature of packages from npm and other repositories—which uniformly standardize metadata formats for license information. All the good JavaScript minifiers have command-line flags for preserving license header comments. Other tools will concatenate `LICENSE` files from package trees. There’s really no excuse. - -##### Warranty Disclaimer - -> The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. - -Nearly every state in the United States has enacted a version of the Uniform Commercial Code, a model statute of laws governing commercial transactions. Article 2 of the UCC—“Division 2” in California—governs contracts for sales of goods, from used automobiles bought off the lot to large shipments of industrial chemicals to manufacturing plants. - -Some of the UCC’s rules about sales contracts are mandatory. These rules always apply, whether those buying and selling like them or not. Others are just “defaults”. Unless buyers and sellers opt out in writing, the UCC implies that they want the baseline rule found in the UCC’s text for their deal. Among the default rules are implied “warranties”, or promises by sellers to buyers about the quality and usability of the goods being sold. - -There is a big theoretical debate about whether public licenses like The MIT License are contracts—enforceable agreements between licensors and licensees—or just licenses, which go one way, but may come with strings attached, their conditions. There is less debate about whether software counts as “goods”, triggering the UCC’s rules. There is no debate among licensors on liability: They don’t want to get sued for lots of money if the software they give away for free breaks, causes problems, doesn’t work, or otherwise causes trouble. That’s exactly the opposite of what three default rules for “implied warranties” do: - - 1. The implied warranty of “merchantability” under [UCC section 2-314][26] is a promise that “the goods”—the Software—are of at least average quality, properly packaged and labeled, and fit for the ordinary purposes they are intended to serve. This warranty applies only if the one giving the software is a “merchant” with respect to the software, meaning they deal in software and hold themselves out as skilled in software. - - 2. The implied warranty of “fitness for a particular purpose” under [UCC section 2-315][27] kicks in when the seller knows the buyer is relying on them to provide goods for a particular purpose. The goods need to actually be “fit” for that purpose. - - 3. The implied warranty of “noninfringement” is not part of the UCC, but is a common feature of general contract law. This implied promise protects the buyer if it turns out the goods they received infringe somebody else’s intellectual property rights. That would be the case if the software under The MIT License didn’t actually belong to the one trying to license it, or if it fell under a patent owned by someone else. - - - - -[Section 2-316(3)][28] of the UCC requires language opting out of, or “excluding”, implied warranties of merchantability and fitness for a particular purpose to be conspicuous. “Conspicuous” in turn means written or formatted to call attention to itself, the opposite of microscopic fine print meant to slip past unwary consumers. State law may impose a similar attention-grabbing requirement for disclaimers of noninfringement. - -Lawyers have long suffered under the delusion that writing anything in `ALL-CAPS` meets the conspicuous requirement. That isn’t true. Courts have criticized the Bar for pretending as much, and most everyone agrees all-caps does more to discourage reading than compel it. All the same, most open-source-license forms set their warranty disclaimers in all-caps, in part because that’s the only obvious way to make it stand out in plain-text `LICENSE` files. I’d prefer to use asterisks or other ASCII art, but that ship sailed long, long ago. - -##### Limitation of Liability - -> In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the Software or the use or other dealings in the Software. - -The MIT License gives permission for software “free of charge”, but the law does not assume that folks receiving licenses free of charge give up their rights to sue when things go wrong and the licensor is to blame. “Limitations of liability”, often paired with “damages exclusions”, work a lot like licenses, as promises not to sue. But these are protections for the licensor against lawsuits by licensees. - -In general, courts read limitations of liability and damages exclusions warily, since they can shift an incredible amount of risk from one side to another. To protect the community’s vital interest in giving folks a way to redress wrongs done in court, they “strictly construe” language limiting liability, reading it against the one protected by it where possible. Limitations of liability have to be specific to stand up. Especially in “consumer” contracts and other situations where those giving up the right to sue lack sophistication or bargaining power, courts have sometimes refused to honor language that seemed buried out of sight. Partly for that reason, partly by sheer force of habit, lawyers tend to give limits of liability the all-caps treatment, too. - -Drilling down a bit, the “limitation of liability” part is a cap on the amount of money a licensee can sue for. In open-source licenses, that limit is always no money at all, $0, “not liable”. By contrast, in commercial licenses, it’s often a multiple of license fees paid in the last 12-month period, though it’s often negotiated. - -The “exclusion” part lists, specifically, kinds of legal claims—reasons to sue for damages—the licensor cannot use. Like many, many legal forms, The MIT License mentions actions “of contract”—for breaching a contract—and “of tort”. Tort rules are general rules against carelessly or maliciously harming others. If you run someone down on the road while texting, you have committed a tort. If your company sells faulty headphones that burn peoples’ ears off, your company has committed a tort. If a contract doesn’t specifically exclude tort claims, courts sometimes read exclusion language in a contract to prevent only contract claims. For good measure, The MIT License throws in “or otherwise”, just to catch the odd admiralty law or other, exotic kind of legal claim. - -The phrase “arising from, out of or in connection with” is a recurring tick symptomatic of the legal draftsman’s inherent, anxious insecurity. The point is that any lawsuit having anything to do with the software is covered by the limitation and exclusions. On the off chance something can “arise from”, but not “out of”, or “in connection with”, it feels better to have all three in the form, so pack ‘em in. Never mind that any court forced to split hairs in this part of the form will have to come up with different meanings for each, on the assumption that a professional drafter wouldn’t use different words in a row to mean the same thing. Never mind that in practice, where courts don’t feel good about a limitation that’s disfavored to begin with, they’ll be more than ready to read the scope trigger narrowly. But I digress. The same language appears in literally millions of contracts. - -#### Overall - -All these quibbles are a bit like spitting out gum on the way into church. The MIT License is a legal classic. The MIT License works. It is by no means a panacea for all software IP ills, in particular the software patent scourge, which it predates by decades. But MIT-style licenses have served admirably, fulfilling a narrow purpose—reversing troublesome default rules of copyright, sales, and contract law—with a minimal combination of discreet legal tools. In the greater context of computing, its longevity is astounding. The MIT License has outlasted and will outlast the vast majority of software licensed under it. We can only guess how many decades of faithful legal service it will have given when it finally loses favor. It’s been especially generous to those who couldn’t have afforded their own lawyer. - -We’ve seen how the The MIT License we know today is a specific, standardized set of terms, bringing order at long last to a chaos of institution-specific, haphazard variations. - -We’ve seen how its approach to attribution and copyright notice informed intellectual property management practices for academic, standards, commercial, and foundation institutions. - -We’ve seen how The MIT Licenses grants permission for software to all, for free, subject to conditions that protect licensors from warranties and liability. - -We’ve seen that despite some crusty verbiage and lawyerly affectation, one hundred and seventy one little words can get a hell of a lot of legal work done, clearing a path for open-source software through a dense underbrush of intellectual property and contract. - -I’m so grateful for all who’ve taken the time to read this rather long post, to let me know they found it useful, and to help improve it. As always, I welcome your comments via [e-mail][29], [Twitter][30], and [GitHub][31]. - -A number of folks have asked where they can read more, or find run-downs of other licenses, like the GNU General Public License or the Apache 2.0 license. No matter what your particular continuing interest may be, I heartily recommend the following books: - - * Andrew M. St. Laurent’s [Understanding Open Source & Free Software Licensing][32], from O’Reilly. - -I start with this one because, while it’s somewhat dated, its approach is also closest to the line-by-line approach used above. O’Reilly has made it [available online][33]. - - * Heather Meeker’s [Open (Source) for Business][34] - -In my opinion, by far the best writing on the GNU General Public License and copyleft more generally. This book covers the history, the licenses, their development, as well as compatibility and compliance. It’s the book I lend to clients considering or dealing with the GPL. - - * Larry Rosen’s [Open Source Licensing][35], from Prentice Hall. - -A great first book, also available for free [online][36]. This is the best introduction to open-source licensing and related law for programmers starting from scratch. This one is also a bit dated in some specific details, but Larry’s taxonomy of licenses and succinct summary of open-source business models stand the test of time. - - - - -All of these were crucial to my own education as an open-source licensing lawyer. Their authors are professional heroes of mine. Have a read! — K.E.M - -I license this article under a [Creative Commons Attribution-ShareAlike 4.0 license][37]. - - --------------------------------------------------------------------------------- - -via: https://writing.kemitchell.com/2016/09/21/MIT-License-Line-by-Line.html - -作者:[Kyle E. Mitchell][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://kemitchell.com/ -[b]: https://github.com/lujun9972 -[1]: http://spdx.org/licenses/MIT -[2]: https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT -[3]: https://opensource.org -[4]: https://spdx.org -[5]: http://spdx.org/licenses/ -[6]: https://spdx.org/licenses/JSON -[7]: https://www.npmjs.com/package/licensor -[8]: https://www.apache.org/licenses/LICENSE-2.0 -[9]: https://www.gnu.org/licenses/gpl-3.0.en.html -[10]: http://spdx.org/licenses/BSD-4-Clause -[11]: https://spdx.org/licenses/BSD-3-Clause -[12]: https://spdx.org/licenses/BSD-2-Clause -[13]: http://www.isc.org/downloads/software-support-policy/isc-license/ -[14]: http://worksmadeforhire.com/ -[15]: https://www.eclipse.org/legal/epl-v10.html -[16]: https://www.apache.org/licenses/#clas -[17]: https://wiki.eclipse.org/ECA -[18]: https://en.wikipedia.org/wiki/Feist_Publications,_Inc.,_v._Rural_Telephone_Service_Co. -[19]: https://writing.kemitchell.com/2017/02/16/Against-Legislating-the-Nonobvious.html -[20]: http://developercertificate.org/ -[21]: https://github.com/berneout/berneout-pledge -[22]: https://github.com/berneout/authors-certificate -[23]: https://en.wikipedia.org/wiki/Immediately-invoked_function_expression -[24]: https://www.govinfo.gov/app/details/USCODE-2017-title35/USCODE-2017-title35-partIII-chap28-sec271 -[25]: https://www.govinfo.gov/app/details/USCODE-2017-title17/USCODE-2017-title17-chap1-sec106 -[26]: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2314.&lawCode=COM -[27]: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2315.&lawCode=COM -[28]: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2316.&lawCode=COM -[29]: mailto:kyle@kemitchell.com -[30]: https://twitter.com/kemitchell -[31]: https://github.com/kemitchell/writing/tree/master/_posts/2016-09-21-MIT-License-Line-by-Line.md -[32]: https://lccn.loc.gov/2006281092 -[33]: http://www.oreilly.com/openbook/osfreesoft/book/ -[34]: https://www.amazon.com/dp/1511617772 -[35]: https://lccn.loc.gov/2004050558 -[36]: http://www.rosenlaw.com/oslbook.htm -[37]: https://creativecommons.org/licenses/by-sa/4.0/legalcode diff --git a/sources/talk/20170928 The Lineage of Man.md b/sources/talk/20170928 The Lineage of Man.md index de2cc7515e..b51d67f4f9 100644 --- a/sources/talk/20170928 The Lineage of Man.md +++ b/sources/talk/20170928 The Lineage of Man.md @@ -92,7 +92,7 @@ via: https://twobithistory.org/2017/09/28/the-lineage-of-man.html 作者:[Two-Bit History][a] 选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) +译者:[bestony](https://github.com/bestony) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/sources/talk/20181009 GCC- Optimizing Linux, the Internet, and Everything.md b/sources/talk/20181009 GCC- Optimizing Linux, the Internet, and Everything.md deleted file mode 100644 index a0f6acbc39..0000000000 --- a/sources/talk/20181009 GCC- Optimizing Linux, the Internet, and Everything.md +++ /dev/null @@ -1,81 +0,0 @@ -GCC: Optimizing Linux, the Internet, and Everything -====== - -![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/gcc-paper.jpg?itok=QFNUZWsV) - -Software is useless if computers can't run it. Even the most talented developer is at the mercy of the compiler when it comes to run-time performance - if you don’t have a reliable compiler toolchain you can’t build anything serious. The GNU Compiler Collection (GCC) provides a robust, mature and high performance partner to help you get the most out of your software. With decades of development by thousands of people GCC is one of the most respected compilers in the world. If you are building applications and not using GCC, you are missing out on the best possible solution. - -GCC is the “de facto-standard open source compiler today” [1] according to LLVM.org and the foundation used to build complete systems - from the kernel upwards. GCC supports over 60 hardware platforms, including ARM, Intel, AMD, IBM POWER, SPARC, HP PA-RISC, and IBM Z, as well as a variety of operating environments, including GNU, Linux, Windows, macOS, FreeBSD, NetBSD, OpenBSD, DragonFly BSD, Solaris, AIX, HP-UX, and RTEMS. It offers highly compliant C/C++ compilers and support for popular C libraries, such as GNU C Library (glibc), Newlib, musl, and the C libraries included with various BSD operating systems, as well as front-ends for Fortran, Ada, and GO languages. GCC also functions as a cross compiler, creating executable code for a platform other than the one on which the compiler is running. GCC is the core component of the tightly integrated GNU toolchain, produced by the GNU Project, that includes glibc, Binutils, and the GNU Debugger (GDB). - -"My all-time favorite GNU tool is GCC, the GNU Compiler Collection. At a time when developer tools were expensive, GCC was the second GNU tool and the one that enabled a community to write and build all the others. This tool single-handedly changed the industry and led to the creation of the free software movement, since a good, free compiler is a prerequisite to a community creating software." —Dave Neary, Open Source and Standards team at Red Hat. [2] - -### Optimizing Linux - -As the default compiler for the Linux kernel source, GCC delivers trusted, stable performance along with the additional extensions needed to correctly build the kernel. GCC is a standard component of popular Linux distributions, such as Arch Linux, CentOS, Debian, Fedora, openSUSE, and Ubuntu, where it routinely compiles supporting system components. This includes the default libraries used by Linux (such as libc, libm, libintl, libssh, libssl, libcrypto, libexpat, libpthread, and ncurses) which depend on GCC to provide correctness and performance and are used by applications and system utilities to access Linux kernel features. Many of the application packages included with a distribution are also built with GCC, such as Python, Perl, Ruby, nginx, Apache HTTP Server, OpenStack, Docker, and OpenShift. This combination of kernel, libraries, and application software translates into a large volume of code built with GCC for each Linux distribution. For the openSUSE distribution nearly 100% of native code is built by GCC, including 6,135 source packages producing 5,705 shared libraries and 38,927 executables. This amounts to about 24,540 source packages compiled weekly. [3] - -The base version of GCC included in Linux distributions is used to create the kernel and libraries that define the system Application Binary Interface (ABI). User space developers have the option of downloading the latest stable version of GCC to gain access to advanced features, performance optimizations, and improvements in usability. Linux distributions offer installation instructions or prebuilt toolchains for deploying the latest version of GCC along with other GNU tools that help to enhance developer productivity and improve deployment time. - -### Optimizing the Internet - -GCC is one of the most widely adopted core compilers for embedded systems, enabling the development of software for the growing world of IoT devices. GCC offers a number of extensions that make it well suited for embedded systems software development, including fine-grained control using compiler built-ins, #pragmas, inline assembly, and application-focussed command-line options. GCC supports a broad base of embedded architectures, including ARM, AMCC, AVR, Blackfin, MIPS, RISC-V, Renesas Electronics V850, and NXP and Freescale Power-based processors, producing efficient, high quality code. The cross-compilation capability offered by GCC is critical to this community, and prebuilt cross-compilation toolchains [4] are a major requirement. For example, the GNU ARM Embedded toolchains are integrated and validated packages featuring the Arm Embedded GCC compiler, libraries, and other tools necessary for bare-metal software development. These toolchains are available for cross-compilation on Windows, Linux and macOS host operating systems and target the popular ARM Cortex-R and Cortex-M processors, which have shipped in tens of billions of internet capable devices. [5] - -GCC empowers Cloud Computing, providing a reliable development platform for software that needs to directly manages computing resources, like database and web serving engines and backup and security software. GCC is fully compliant with C++11 and C++14 and offers experimental support for C++17 and C++2a [6], creating performant object code with a solid debugging information. Some examples of applications that utilize GCC include: MySQL Database Management System, which requires GCC for Linux [7]; the Apache HTTP Server, which recommends using GCC [8]; and Bacula, an enterprise ready network backup tool which require GCC. [9] - -### Optimizing Everything - -For the research and development of the scientific codes used in High Performance Computing (HPC), GCC offers mature C, C++, and Fortran front ends as well as support for OpenMP and OpenACC APIs for directive-based parallel programming. Because GCC offers portability across computing environments, it enables code to be more easily targeted and tested across a variety of new and legacy client and server platforms. GCC offers full support for OpenMP 4.0 for C, C++ and Fortran compilers and full support for OpenMP 4.5 for C and C++ compilers. For OpenACC, GCC supports most of the 2.5 specification and performance optimizations and is the only non-commercial, nonacademic compiler to provide [OpenACC][1] support. - -Code performance is an important parameter to this community and GCC offers a solid performance base. A Nov. 2017 paper published by Colfax Research evaluates C++ compilers for the speed of compiled code parallelized with OpenMP 4.x directives and for the speed of compilation time. Figure 1 plots the relative performance of the computational kernels when compiled by the different compilers and run with a single thread. The performance values are normalized so that the performance of G++ is equal to 1.0. - -![performance][3] - -Figure 1. Relative performance of each kernel as compiled by the different compilers. (single-threaded, higher is better). - -[Used with permission][4] - -The paper summarizes “the GNU compiler also does very well in our tests. G++ produces the second fastest code in three out of six cases and is amongst the fastest compiler in terms of compile time.” [10] - -### Who Is Using GCC? - -In The State of Developer Ecosystem Survey in 2018 by JetBrains, out of 6,000 developers who took the survey GCC is regularly used by 66% of C++ programmers and 73% of C programmers. [11] Here is a quick summary of the benefits of GCC that make it so popular with the developer community. - - * For developers required to write code for a variety of new and legacy computing platforms and operating environments, GCC delivers support for the broadest range of hardware and operating environments. Compilers offered by hardware vendors focus mainly on support for their products and other open source compilers are much more limited in the hardware and operating systems supported. [12] - - * There is a wide variety of GCC-based prebuilt toolchains, which has particular appeal to embedded systems developers. This includes the GNU ARM Embedded toolchains and 138 pre-compiled cross compiler toolchains available on the Bootlin web site. [13] While other open source compilers, such as Clang/LLVM, can replace GCC in existing cross compiling toolchains, these would need to be completely rebuilt by the developer. [14] - - * GCC delivers to application developers trusted, stable performance from a mature compiler platform. The GCC 8/9 vs. LLVM Clang 6/7 Compiler Benchmarks On AMD EPYC article provides results of 49 benchmarks ran across the four tested compilers at three optimization levels. Coming in first 34% of the time was GCC 8.2 RC1 using "-O3 -march=native" level, while at the same optimization level LLVM Clang 6.0 came in second with wins 20% of the time. [15] - - * GCC delivers improved diagnostics for compile time debugging [16] and accurate and useful information for runtime debugging. GCC is tightly integrated with GDB, a mature and feature complete tool which offers ‘non-stop’ debugging that can stop a single thread at a breakpoint. - - * GCC is a well supported platform with an active, committed community that supports the current and two previous releases. With releases schedule yearly this provides two years of support for a version. - - - - -### GCC: Continuing to Optimize Linux, the Internet, and Everything - -GCC continues to move forward as a world-class compiler. The most current version of GCC is 8.2, which was released in July 2018 and added hardware support for upcoming Intel CPUs, more ARM CPUs and improved performance for AMD’s ZEN CPU. Initial C17 support has been added along with initial work towards C++2A. Diagnostics have continued to be enhanced including better emitted diagnostics, with improved locations, location ranges, and fix-it hints, particularly in the C++ front end. A blog written by David Malcolm of Red Hat in March 2018 provides an overview of usability improvements in GCC 8. [17] - -New hardware platforms continue to rely on the GCC toolchain for software development, such as RISC-V, a free and open ISA that is of interest to machine learning, Artificial Intelligence (AI), and IoT market segments. GCC continues to be a critical component in the continuing development of Linux systems. The Clear Linux Project for Intel Architecture, an emerging distribution built for cloud, client, and IoT use cases, provides a good example of how GCC compiler technology is being used and improved to boost the performance and security of a Linux-based system. GCC is also being used for application development for Microsoft's Azure Sphere, a Linux-based operating system for IoT applications that initially supports the ARM based MediaTek MT3620 processor. In terms of developing the next generation of programmers, GCC is also a core component of the Windows toolchain for Raspberry PI, the low-cost embedded board running Debian-based GNU/Linux that is used to promote the teaching of basic computer science in schools and developing countries. - -GCC was first released on March 22, 1987 by Richard Stallman, the founder of the GNU Project and was considered a significant breakthrough since it was the first portable ANSI C optimizing compiler released as free software. GCC is maintained by a community of programmers from all over the world under the direction of a steering committee that ensures broad, representative oversight of the project. GCC’s community approach is one of its strengths, resulting in a large and diverse community of developers and users that contribute to and provide support for the project. According to Open Hub, GCC “is one of the largest open-source teams in the world, and is in the top 2% of all project teams on Open Hub.” [18] - -There has been a lot of discussion about the licensing of GCC, most of which confuses rather than enlightens. GCC is distributed under the GNU General Public License version 3 or later with the Runtime Library Exception. This is a copyleft license, which means that derivative work can only be distributed under the same license terms. GPLv3 is intended to protect GCC from being made proprietary and requires that changes to GCC code are made available freely and openly. To the ‘end user’ the compiler is just the same as any other; using GCC makes no difference to any licensing choices you might make for your own code. [19] - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/2018/10/gcc-optimizing-linux-internet-and-everything - -作者:[Margaret Lewis][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linux.com/users/margaret-lewis -[b]: https://github.com/lujun9972 -[1]: https://www.openacc.org/tools -[2]: /files/images/gccjpg-0 -[3]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/gcc_0.jpg?itok=HbGnRqWX "performance" -[4]: https://www.linux.com/licenses/category/used-permission diff --git a/sources/talk/20190105 Why Sorting is O(N log N).md b/sources/talk/20190105 Why Sorting is O(N log N).md deleted file mode 100644 index 34a1d3bf97..0000000000 --- a/sources/talk/20190105 Why Sorting is O(N log N).md +++ /dev/null @@ -1,115 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why Sorting is O(N log N)) -[#]: via: (https://theartofmachinery.com/2019/01/05/sorting_is_nlogn.html) -[#]: author: (Simon Arneaud https://theartofmachinery.com) - -Why Sorting is O(N log N) -====== - -Any decent algorithms textbook will explain how fast sorting algorithms like quicksort and heapsort are, but it doesn’t take crazy maths to prove that they’re as asymptotically fast as you can possibly get. - -### A pedantic note about notation - -Most computer scientists use big-O notation to mean “asymptotically equal, up to a constant scaling factor”, which isn’t quite what it means to other mathematicians. Sorry, I’ll use big-O like in CS textbooks, but at least I won’t mix it with other mathematical notation. - -## Comparison-based sorting - -Let’s look at the special case of algorithms that compare values two at a time (like quicksort and heapsort, and most other popular algorithms). The ideas can be extended to all sorting algorithms later. - -### A simple counting argument for the worst case - -Suppose you have an array of four elements, all different, in random order. Can you sort it by comparing just one pair of elements? Obviously not, but here’s one good reason that proves you can’t: By definition, to sort the array, you need to how to rearrange the elements to put them in order. In other words, you need to know which permutation is needed. How many possible permutations are there? The first element could be moved to one of four places, the second one could go to one of the remaining three, the third element has two options, and the last element has to take the one remaining place. So there are (4 \times 3 \times 2 \times 1 = 4! = 24) possible permutations to choose from, but there are only two possible results from comparing two different things: “BIGGER” and “SMALLER”. If you made a list of all the possible permutations, you might decide that “BIGGER” means you need permutation #8 and “SMALLER” means you need permutation #24, but there’s no way you could know when you need the other 22 permutations. - -With two comparisons, you have (2 \times 2 = 4) possible outputs, which still isn’t enough. You can’t sort every possible shuffled array unless you do at least five comparisons ((2^{5} = 32)). If (W(N)) is the worst-case number of comparisons needed to sort (N) different elements using some algorithm, we can say - -[2^{W(N)} \geq N!] - -Taking a logarithm base 2, - -[W(N) \geq \log_{2}{N!}] - -Asymptotically, (N!) grows like (N^{N}) (see also [Stirling’s formula][1]), so - -[W(N) \succeq \log N^{N} = N\log N] - -And that’s an (O(N\log N)) limit on the worst case just from counting outputs. - -### Average case from information theory - -We can get a stronger result if we extend that counting argument with a little information theory. Here’s how we could use a sorting algorithm as a code for transmitting information: - - 1. I think of a number — say, 15 - 2. I look up permutation #15 from the list of permutations of four elements - 3. I run the sorting algorithm on this permutation and record all the “BIGGER” and “SMALLER” comparison results - 4. I transmit the comparison results to you in binary code - 5. You re-enact my sorting algorithm run, step by step, referring to my list of comparison results as needed - 6. Now that you know how I rearranged my array to make it sorted, you can reverse the permutation to figure out my original array - 7. You look up my original array in the permutation list to figure out I transmitted the number 15 - - - -Okay, it’s a bit strange, but it could be done. That means that sorting algorithms are bound by the same laws as normal encoding schemes, including the theorem proving there’s no universal data compressor. I transmitted one bit per comparison the algorithm does, so, on average, the number of comparisons must be at least the number of bits needed to represent my data, according to information theory. More technically, [the average number of comparisons must be at least the Shannon entropy of my input data, measured in bits][2]. Entropy is a mathematical measure of the information content, or unpredictability, of something. - -If I have an array of (N) elements that could be in any possible order without bias, then entropy is maximised and is (\log_{2}{N!}) bits. That proves that (O(N\log N)) is an optimal average for a comparison-based sort with arbitrary input. - -That’s the theory, but how do real sorting algorithms compare? Below is a plot of the average number of comparisons needed to sort an array. I’ve compared the theoretical optimum against naïve quicksort and the [Ford-Johnson merge-insertion sort][3], which was designed to minimise comparisons (though it’s rarely faster than quicksort overall because there’s more to life than minimising comparisons). Since it was developed in 1959, merge-insertion sort has been tweaked to squeeze a few more comparisons out, but the plot shows it’s already almost optimal. - -![Plot of average number of comparisons needed to sort randomly shuffled arrays of length up to 100. Bottom line is theoretical optimum. Within about 1% is merge-insertion sort. Naïve quicksort is within about 25% of optimum.][4] - -It’s nice when a little theory gives such a tight practical result. - -### Summary so far - -Here’s what’s been proven so far: - - 1. If the array could start in any order, at least (O(N\log N)) comparisons are needed in the worst case - 2. The average number of comparisons must be at least the entropy of the array, which is (O(N\log N)) for random input - - - -Note that #2 allows comparison-based sorting algorithms to be faster than (O(N\log N)) if the input is low entropy (in other words, more predictable). Merge sort is close to (O(N)) if the input contains many sorted subarrays. Insertion sort is close to (O(N)) if the input is an array that was sorted before being perturbed a bit. None of them beat (O(N\log N)) in the worst case unless some array orderings are impossible as inputs. - -## General sorting algorithms - -Comparison-based sorts are an interesting special case in practice, but there’s nothing theoretically special about [`CMP`][5] as opposed to any other instruction on a computer. Both arguments above can be generalised to any sorting algorithm if you note a couple of things: - - 1. Most computer instructions have more than two possible outputs, but still have a limited number - 2. The limited number of outputs means that one instruction can only process a limited amount of entropy - - - -That gives us the same (O(N\log N)) lower bound on the number of instructions. Any physically realisable computer can only process a limited number of instructions at a time, so that’s an (O(N\log N)) lower bound on the time required, as well. - -### But what about “faster” algorithms? - -The most useful practical implication of the general (O(N\log N)) bound is that if you hear about any asymptotically faster algorithm, you know it must be “cheating” somehow. There must be some catch that means it isn’t a general purpose sorting algorithm that scales to arbitrarily large arrays. It might still be a useful algorithm, but it’s a good idea to read the fine print closely. - -A well-known example is radix sort. It’s often called an (O(N)) sorting algorithm, but the catch is that it only works if all the numbers fit into (k) bits, and it’s really (O({kN})). - -What does that mean in practice? Suppose you have an 8-bit machine. You can represent (2^{8} = 256) different numbers in 8 bits, so if you have an array of thousands of numbers, you’re going to have duplicates. That might be okay for some applications, but for others you need to upgrade to at least 16 bits, which can represent (2^{16} = 65,536) numbers distinctly. 32 bits will support (2^{32} = 4,294,967,296) different numbers. As the size of the array goes up, the number of bits needed will tend to go up, too. To represent (N) different numbers distinctly, you’ll need (k \geq \log_{2}N). So, unless you’re okay with lots of duplicates in your array, (O({kN})) is effectively (O(N\log N)). - -The need for (O(N\log N)) of input data in the general case actually proves the overall result by itself. That argument isn’t so interesting in practice because we rarely need to sort billions of integers on a 32-bit machine, and [if anyone’s hit the limits of a 64-bit machine, they haven’t told the rest of us][6]. - --------------------------------------------------------------------------------- - -via: https://theartofmachinery.com/2019/01/05/sorting_is_nlogn.html - -作者:[Simon Arneaud][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://theartofmachinery.com -[b]: https://github.com/lujun9972 -[1]: http://hyperphysics.phy-astr.gsu.edu/hbase/Math/stirling.html -[2]: https://en.wikipedia.org/wiki/Shannon%27s_source_coding_theorem -[3]: https://en.wikipedia.org/wiki/Merge-insertion_sort -[4]: /images/sorting_is_nlogn/sorting_algorithms_num_comparisons.svg -[5]: https://c9x.me/x86/html/file_module_x86_id_35.html -[6]: https://sortbenchmark.org/ diff --git a/sources/talk/20190111 What metrics matter- A guide for open source projects.md b/sources/talk/20190111 What metrics matter- A guide for open source projects.md deleted file mode 100644 index 1438450a99..0000000000 --- a/sources/talk/20190111 What metrics matter- A guide for open source projects.md +++ /dev/null @@ -1,95 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What metrics matter: A guide for open source projects) -[#]: via: (https://opensource.com/article/19/1/metrics-guide-open-source-projects) -[#]: author: (Gordon Haff https://opensource.com/users/ghaff) - -What metrics matter: A guide for open source projects -====== -5 principles for deciding what to measure. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI-) - -"Without data, you're just a person with an opinion." - -Those are the words of W. Edwards Deming, the champion of statistical process control, who was credited as one of the inspirations for what became known as the Japanese post-war economic miracle of 1950 to 1960. Ironically, Japanese manufacturers like Toyota were far more receptive to Deming’s ideas than General Motors and Ford were. - -Community management is certainly an art. It’s about mentoring. It’s about having difficult conversations with people who are hurting the community. It’s about negotiation and compromise. It’s about interacting with other communities. It’s about making connections. In the words of Red Hat’s Diane Mueller, it’s about "nurturing conversations." - -However, it’s also about metrics and data. - -Some have much in common with software development projects more broadly. Others are more specific to the management of the community itself. I think of deciding what to measure and how as adhering to five principles. - -### 1. Recognize that behaviors aren't independent of the measurements you choose to highlight. - -In 2008, Daniel Ariely published Predictably Irrational, one of a number of books written around that time that introduced behavioral psychology and behavioral economics to the general public. One memorable quote from that book is the following: “Human beings adjust behavior based on the metrics they’re held against. Anything you measure will impel a person to optimize his score on that metric. What you measure is what you’ll get. Period.” - -This shouldn’t be surprising. It’s a finding that’s been repeatedly confirmed by research. It should also be familiar to just about anyone with business experience. It’s certainly not news to anyone in sales management, for example. Base sales reps’ (or their managers’) bonuses solely on revenue, and they’ll try to discount whatever it takes to maximize revenue, even if it puts margin in the toilet. Conversely, want the sales force to push a new product line—which will probably take extra effort—but skip the spiffs? Probably not happening. - -And lest you think I’m unfairly picking on sales, this behavior is pervasive, all the way up to the CEO, as Ariely describes in a 2010 Harvard Business Review article: “CEOs care about stock value because that’s how we measure them. If we want to change what they care about, we should change what we measure.” - -Developers and other community members are not immune. - -### 2. You need to choose relevant metrics. - -There’s a lot of folk wisdom floating around about what’s relevant and important that’s not necessarily true. My colleague [Dave Neary offers an example from baseball][1]: “In the late '90s, the key measurements that were used to measure batter skill were RBI (runs batted in) and batting average (how often a player got on base with a hit, divided by the number of at-bats). The Oakland A’s were the first major league team to recruit based on a different measurement of player performance: on-base percentage. This measures how often they get to first base, regardless of how it happens.” - -Indeed, the whole revolution of sabermetrics in baseball and elsewhere, which was popularized in Michael Lewis’ Moneyball, often gets talked about in terms of introducing data in a field that historically was more about gut feel and personal experience. But it was also about taking a game that had actually always been fairly numbers-obsessed and coming up with new metrics based on mostly existing data to better measure player value. (The data revolution going on in sports today is more about collecting much more data through video and other means than was previously available.) - -### 3. Quantity may not lead to quality. - -As a corollary, collecting lots of tangential but easy-to-capture data isn’t better than just selecting a few measurements you’ve determined are genuinely useful. In a world where online behavior can be tracked with great granularity and displayed in colorful dashboards, it’s tempting to be distracted by sheer data volume, even when it doesn’t deliver any great insight into community health and trajectory. - -This may seem like an obvious point: Why measure something that isn’t relevant? In practice, metrics often get chosen because they’re easy to measure, not because they’re particularly useful. They tend to be more about inputs than outputs: The number of developers. The number of forum posts. The number of commits. Collectively, measures like this often get called vanity metrics. They’re ubiquitous, but most people involved with community management don’t think much of them. - -Number of downloads may be the worst of the bunch. It’s true that, at some level, they’re an indication of interest in a project. That’s something. But it’s sufficiently distant from actively using the project, much less engaging with the project deeply, that it’s hard to view downloads as a very useful number. - -Is there any harm in these vanity metrics? Yes, to the degree that you start thinking that they’re something to base action on. Probably more seriously, stakeholders like company management or industry observers can come to see them as meaningful indicators of project health. - -### 4. Understand what measurements really mean and how they relate to each other. - -Neary makes this point to caution against myopia. “In one project I worked on,” he says, ”some people were concerned about a recent spike in the number of bug reports coming in because it seemed like the project must have serious quality issues to resolve. However, when we looked at the numbers, it turned out that many of the bugs were coming in because a large company had recently started using the project. The increase in bug reports was actually a proxy for a big influx of new users, which was a good thing.” - -In practice, you often have to measure through proxies. This isn’t an inherent problem, but the further you get between what you want to measure and what you’re actually measuring, the harder it is to connect the dots. It’s fine to track progress in closing bugs, writing code, and adding new features. However, those don’t necessarily correlate with how happy users are or whether the project is doing a good job of working towards its long-term objectives, whatever those may be. - -### 5. Different measurements serve different purposes. - -Some measurements may be non-obvious but useful for tracking the success of a project and community relative to internal goals. Others may be better suited for a press release or other external consumption. For example, as a community manager, you may really care about the number of meetups, mentoring sessions, and virtual briefings your community has held over the past three months. But it’s the number of contributions and contributors that are more likely to grab the headlines. You probably care about those too. But maybe not as much, depending upon your current priorities. - -Still, other measurements may relate to the goals of any sponsoring organizations. The measurements most relevant for projects tied to commercial products are likely to be different from pure community efforts. - -Because communities differ and goals differ, it’s not possible to simply compile a metrics checklist, but here are some ideas to think about: - -Consider qualitative metrics in addition to quantitative ones. Conducting surveys and other studies can be time-consuming, especially if they’re rigorous enough to yield better-than-anecdotal data. It also requires rigor to construct studies so that they can be used to track changes over time. In other words, it’s a lot easier to measure quantitative contributor activity than it is to suss out if the community members are happier about their participation today than they were a year ago. However, given the importance of culture to the health of a community, measuring it in a systematic way can be a worthwhile exercise. - -Breadth of community, including how many are unaffiliated with commercial entities, is important for many projects. The greater the breadth, the greater the potential leverage of the open source development process. It can also be instructive to see how companies and individuals are contributing. Projects can be explicitly designed to better accommodate casual contributors. - -Are new contributors able to have an impact, or are they ignored? How long does it take for code contributions to get committed? How long does it take for a reported bug to be fixed or otherwise responded to? If they asked a question in a forum, did anyone answer them? In other words, are you letting contributors contribute? - -Advancement within the project is also an important metric. [Mikeal Rogers of the Node.js community][2] explains: “The shift that we made was to create a support system and an education system to take a user and turn them into a contributor, first at a very low level, and educate them to bring them into the committer pool and eventually into the maintainer pool. The end result of this is that we have a wide range of skill sets. Rather than trying to attract phenomenal developers, we’re creating new phenomenal developers.” - -Whatever metrics you choose, don’t forget why you made them metrics in the first place. I find a helpful question to ask is: “What am I going to do with this number?” If the answer is to just put it in a report or in a press release, that’s not a great answer. Metrics should be measurements that tell you either that you’re on the right path or that you need to take specific actions to course-correct. - -For this reason, Stormy Peters, who handles community leads at Red Hat, [argues for keeping it simple][3]. She writes, “It’s much better to have one or two key metrics than to worry about all the possible metrics. You can capture all the possible metrics, but as a project, you should focus on moving one. It’s also better to have a simple metric that correlates directly to something in the real world than a metric that is a complicated formula or ration between multiple things. As project members make decisions, you want them to be able to intuitively feel whether or not it will affect the project’s key metric in the right direction.” - -The article is adapted from [How Open Source Ate Software][4] by Gordon Haff (Apress 2018). - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/1/metrics-guide-open-source-projects - -作者:[Gordon Haff][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/ghaff -[b]: https://github.com/lujun9972 -[1]: https://community.redhat.com/blog/2014/07/when-metrics-go-wrong/ -[2]: https://opensource.com/article/17/3/nodejs-community-casual-contributors -[3]: https://medium.com/open-source-communities/3-important-things-to-consider-when-measuring-your-success-50e21ad82858 -[4]: https://www.apress.com/us/book/9781484238936 diff --git a/sources/talk/20190115 What happens when a veteran teacher goes to an open source conference.md b/sources/talk/20190115 What happens when a veteran teacher goes to an open source conference.md deleted file mode 100644 index e16505c36c..0000000000 --- a/sources/talk/20190115 What happens when a veteran teacher goes to an open source conference.md +++ /dev/null @@ -1,68 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What happens when a veteran teacher goes to an open source conference) -[#]: via: (https://opensource.com/open-organization/19/1/educator-at-open-source-conference) -[#]: author: (Ben Owens https://opensource.com/users/engineerteacher) - -What happens when a veteran teacher goes to an open source conference -====== -Sometimes feeling like a fish out of water is precisely what educators need. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesgen_rh_032x_0.png?itok=cApG9aB4) - -"Change is going to be continual, and today is the slowest day society will ever move."—[Tony Fadell][1] - -If ever there was an experience that brought the above quotation home for me, it was my experience at the [All Things Open conference][2] in Raleigh, NC last October. Thousands of people from all over the world attended the conference, and many (if not most), worked as open source coders and developers. As one of the relatively few educators in attendance, I saw and heard things that were completely foreign to me—terms like as Istio, Stack Overflow, Ubuntu, Sidecar, HyperLedger, and Kubernetes tossed around for days. - -I felt like a fish out of water. But in the end, that was the perfect dose of reality I needed to truly understand how open principles can reshape our approach to education. - -### Not-so-strange attractors - -All Things Open attracted me to Raleigh for two reasons, both of which have to do with how our schools must do a better job of creating environments that truly prepare students for a rapidly changing world. - -The first is my belief that schools should embrace the ideals of the [open source way][3]. The second is that educators have to periodically force themselves out of their relatively isolated worlds of "doing school" in order to get a glimpse of what the world is actually doing. - -When I was an engineer for 20 years, I developed a deep sense of the power of an open exchange of ideas, of collaboration, and of the need for rapid prototyping of innovations. Although we didn't call these ideas "open source" at the time, my colleagues and I constantly worked together to identify and solve problems using tools such as [Design Thinking][4] so that our businesses remained competitive and met market demands. When I became a science and math teacher at a small [public school][5] in rural Appalachia, my goal was to adapt these ideas to my classrooms and to the school at large as a way to blur the lines between a traditional school environment and what routinely happens in the "real world." - -Through several years of hard work and many iterations, my fellow teachers and I were eventually able to develop a comprehensive, school-wide project-based learning model, where students worked in collaborative teams on projects that [made real connections][6] between required curriculum and community-based applications. Doing so gave these students the ability to develop skills they can use for a lifetime, rather than just on the next test—skills such as problem solving, critical thinking, oral and written communication, perseverance through setbacks, and adapting to changing conditions, as well as how to have routine conversations with adult mentors form the community. Only after reading [The Open Organization][7] did I realize that what we had been doing essentially embodied what Jim Whitehurst had described. In our case, of course, we applied open principles to an educational context (that model, called Open Way Learning, is the subject of a [book][8] published in December). - -I felt like a fish out of water. But in the end, that was the perfect dose of reality I needed to truly understand how open principles can reshape our approach to education. - -As good as this model is in terms of pushing students into a relevant, engaging, and often unpredictable learning environments, it can only go so far if we, as educators who facilitate this type of project-based learning, do not constantly stay abreast of changing technologies and their respective lexicon. Even this unconventional but proven approach will still leave students ill-prepared for a global, innovation economy if we aren't constantly pushing ourselves into areas outside our own comfort zones. My experience at the All Things Open conference was a perfect example. While humbling, it also forced me to confront what I didn't know so that I can learn from it to help the work I do with other teachers and schools. - -### A critical decision - -I made this point to others when I shared a picture of the All Things Open job board with dozens of colleagues all over the country. I shared it with the caption: "What did you do in your school today to prepare your students for this reality tomorrow?" The honest answer from many was, unfortunately, "not much." That has to change. - -![](https://opensource.com/sites/default/files/images/open-org/owens_1.jpg) -![](https://opensource.com/sites/default/files/images/open-org/owens_2.jpg) -(Images courtesy of Ben Owens, CC BY-SA) - -People in organizations everywhere have to make a critical decision: either embrace the rapid pace of change that is a fact of life in our world or face the hard reality of irrelevance. Our systems in education are at this same crossroads—even ones who think of themselves as being innovative. It involves admitting to students, "I don't know, but I'm willing to learn." That's the kind of teaching and learning experience our students deserve. - -It can happen, but it will take pioneering educators who are willing to move away from comfortable, back-of-the-book answers to help students as they work on difficult and messy challenges. You may very well be a veritable fish out of water. - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/1/educator-at-open-source-conference - -作者:[Ben Owens][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/engineerteacher -[b]: https://github.com/lujun9972 -[1]: https://en.wikipedia.org/wiki/Tony_Fadell -[2]: https://allthingsopen.org/ -[3]: https://opensource.com/open-source-way -[4]: https://dschool.stanford.edu/resources-collections/a-virtual-crash-course-in-design-thinking -[5]: https://www.tricountyearlycollege.org/ -[6]: https://www.bie.org/about/what_pbl -[7]: https://www.redhat.com/en/explore/the-open-organization-book -[8]: https://www.amazon.com/Open-Up-Education-Learning-Transform/dp/1475842007/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr= diff --git a/sources/talk/20190131 4 confusing open source license scenarios and how to navigate them.md b/sources/talk/20190131 4 confusing open source license scenarios and how to navigate them.md deleted file mode 100644 index fd93cdd9a6..0000000000 --- a/sources/talk/20190131 4 confusing open source license scenarios and how to navigate them.md +++ /dev/null @@ -1,59 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (4 confusing open source license scenarios and how to navigate them) -[#]: via: (https://opensource.com/article/19/1/open-source-license-scenarios) -[#]: author: (P.Kevin Nelson https://opensource.com/users/pkn4645) - -4 confusing open source license scenarios and how to navigate them -====== - -Before you begin using a piece of software, make sure you fully understand the terms of its license. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW_openisopen.png?itok=FjmDxIaL) - -As an attorney running an open source program office for a Fortune 500 corporation, I am often asked to look into a product or component where there seems to be confusion as to the licensing model. Under what terms can the code be used, and what obligations run with such use? This often happens when the code or the associated project community does not clearly indicate availability under a [commonly accepted open source license][1]. The confusion is understandable as copyright owners often evolve their products and services in different directions in response to market demands. Here are some of the scenarios I commonly discover and how you can approach each situation. - -### Multiple licenses - -The product is truly open source with an [Open Source Initiative][2] (OSI) open source-approved license, but has changed licensing models at least once if not multiple times throughout its lifespan. This scenario is fairly easy to address; the user simply has to decide if the latest version with its attendant features and bug fixes is worth the conditions to be compliant with the current license. If so, great. If not, then the user can move back in time to a version released under a more palatable license and start from that fork, understanding that there may not be an active community for support and continued development. - -### Old open source - -This is a variation on the multiple licenses model with the twist that current licensing is proprietary only. You have to use an older version to take advantage of open source terms and conditions. Most often, the product was released under a valid open source license up to a certain point in its development, but then the copyright holder chose to evolve the code in a proprietary fashion and offer new releases only under proprietary commercial licensing terms. So, if you want the newest capabilities, you have to purchase a proprietary license, and you most likely will not get a copy of the underlying source code. Most often the open source community that grew up around the original code line falls away once the members understand there will be no further commitment from the copyright holder to the open source branch. While this scenario is understandable from the copyright holder's perspective, it can be seen as "burning a bridge" to the open source community. It would be very difficult to again leverage the benefits of the open source contribution models once a project owner follows this path. - -### Open core - -By far the most common discovery is that a product has both an open source-licensed "community edition" and a proprietary-licensed commercial offering, commonly referred to as open core. This is often encouraging to potential consumers, as it gives them a "try before you buy" option or even a chance to influence both versions of the product by becoming an active member of the community. I usually encourage clients to begin with the community version, get involved, and see what they can achieve. Then, if the product becomes a crucial part of their business plan, they have the option to upgrade to the proprietary level at any time. - -### Freemium - -The component is not open source at all, but instead it is released under some version of the "freemium" model. A version with restricted or time-limited functionality can be downloaded with no immediate purchase required. However, since the source code is usually not provided and its accompanying license does not allow perpetual use, the creation of derivative works, nor further distribution, it is definitely not open source. In this scenario, it is usually best to pass unless you are prepared to purchase a proprietary license and accept all attendant terms and conditions of use. Users are often the most disappointed in this outcome as it has somewhat of a deceptive feel. - -### OSI compliant - -Of course, the happy path I haven't mentioned is to discover the project has a single, clear, OSI-compliant license. In those situations, open source software is as easy as downloading and going forward within appropriate use. - -Each of the more complex scenarios described above can present problems to potential development projects, but consultation with skilled procurement or intellectual property professionals with regard to licensing lineage can reveal excellent opportunities. - -An earlier version of this article was published on [OSS Law][3] and is republished with the author's permission. - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/1/open-source-license-scenarios - -作者:[P.Kevin Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/pkn4645 -[b]: https://github.com/lujun9972 -[1]: https://opensource.org/licenses -[2]: https://opensource.org/licenses/category -[3]: http://www.pknlaw.com/2017/06/i-thought-that-was-open-source.html diff --git a/sources/talk/20190131 OOP Before OOP with Simula.md b/sources/talk/20190131 OOP Before OOP with Simula.md deleted file mode 100644 index cae9d9bd3a..0000000000 --- a/sources/talk/20190131 OOP Before OOP with Simula.md +++ /dev/null @@ -1,203 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (OOP Before OOP with Simula) -[#]: via: (https://twobithistory.org/2019/01/31/simula.html) -[#]: author: (Sinclair Target https://twobithistory.org) - -OOP Before OOP with Simula -====== - -Imagine that you are sitting on the grassy bank of a river. Ahead of you, the water flows past swiftly. The afternoon sun has put you in an idle, philosophical mood, and you begin to wonder whether the river in front of you really exists at all. Sure, large volumes of water are going by only a few feet away. But what is this thing that you are calling a “river”? After all, the water you see is here and then gone, to be replaced only by more and different water. It doesn’t seem like the word “river” refers to any fixed thing in front of you at all. - -In 2009, Rich Hickey, the creator of Clojure, gave [an excellent talk][1] about why this philosophical quandary poses a problem for the object-oriented programming paradigm. He argues that we think of an object in a computer program the same way we think of a river—we imagine that the object has a fixed identity, even though many or all of the object’s properties will change over time. Doing this is a mistake, because we have no way of distinguishing between an object instance in one state and the same object instance in another state. We have no explicit notion of time in our programs. We just breezily use the same name everywhere and hope that the object is in the state we expect it to be in when we reference it. Inevitably, we write bugs. - -The solution, Hickey concludes, is that we ought to model the world not as a collection of mutable objects but a collection of processes acting on immutable data. We should think of each object as a “river” of causally related states. In sum, you should use a functional language like Clojure. - -![][2] -The author, on a hike, pondering the ontological commitments -of object-oriented programming. - -Since Hickey gave his talk in 2009, interest in functional programming languages has grown, and functional programming idioms have found their way into the most popular object-oriented languages. Even so, most programmers continue to instantiate objects and mutate them in place every day. And they have been doing it for so long that it is hard to imagine that programming could ever look different. - -I wanted to write an article about Simula and imagined that it would mostly be about when and how object-oriented constructs we are familiar with today were added to the language. But I think the more interesting story is about how Simula was originally so unlike modern object-oriented programming languages. This shouldn’t be a surprise, because the object-oriented paradigm we know now did not spring into existence fully formed. There were two major versions of Simula: Simula I and Simula 67. Simula 67 brought the world classes, class hierarchies, and virtual methods. But Simula I was a first draft that experimented with other ideas about how data and procedures could be bundled together. The Simula I model is not a functional model like the one Hickey proposes, but it does focus on processes that unfold over time rather than objects with hidden state that interact with each other. Had Simula 67 stuck with more of Simula I’s ideas, the object-oriented paradigm we know today might have looked very different indeed—and that contingency should teach us to be wary of assuming that the current paradigm will dominate forever. - -### Simula 0 Through 67 - -Simula was created by two Norwegians, Kristen Nygaard and Ole-Johan Dahl. - -In the late 1950s, Nygaard was employed by the Norwegian Defense Research Establishment (NDRE), a research institute affiliated with the Norwegian military. While there, he developed Monte Carlo simulations used for nuclear reactor design and operations research. These simulations were at first done by hand and then eventually programmed and run on a Ferranti Mercury. Nygaard soon found that he wanted a higher-level way to describe these simulations to a computer. - -The kind of simulation that Nygaard commonly developed is known as a “discrete event model.” The simulation captures how a sequence of events change the state of a system over time—but the important property here is that the simulation can jump from one event to the next, since the events are discrete and nothing changes in the system between events. This kind of modeling, according to a paper that Nygaard and Dahl presented about Simula in 1966, was increasingly being used to analyze “nerve networks, communication systems, traffic flow, production systems, administrative systems, social systems, etc.” So Nygaard thought that other people might want a higher-level way to describe these simulations too. He began looking for someone that could help him implement what he called his “Simulation Language” or “Monte Carlo Compiler.” - -Dahl, who had also been employed by NDRE, where he had worked on language design, came aboard at this point to play Wozniak to Nygaard’s Jobs. Over the next year or so, Nygaard and Dahl worked to develop what has been called “Simula 0.” This early version of the language was going to be merely a modest extension to ALGOL 60, and the plan was to implement it as a preprocessor. The language was then much less abstract than what came later. The primary language constructs were “stations” and “customers.” These could be used to model certain discrete event networks; Nygaard and Dahl give an example simulating airport departures. But Nygaard and Dahl eventually came up with a more general language construct that could represent both “stations” and “customers” and also model a wider range of simulations. This was the first of two major generalizations that took Simula from being an application-specific ALGOL package to a general-purpose programming language. - -In Simula I, there were no “stations” or “customers,” but these could be recreated using “processes.” A process was a bundle of data attributes associated with a single action known as the process’ operating rule. You might think of a process as an object with only a single method, called something like `run()`. This analogy is imperfect though, because each process’ operating rule could be suspended or resumed at any time—the operating rules were a kind of coroutine. A Simula I program would model a system as a set of processes that conceptually all ran in parallel. Only one process could actually be “current” at any time, but once a process suspended itself the next queued process would automatically take over. As the simulation ran, behind the scenes, Simula would keep a timeline of “event notices” that tracked when each process should be resumed. In order to resume a suspended process, Simula needed to keep track of multiple call stacks. This meant that Simula could no longer be an ALGOL preprocessor, because ALGOL had only once call stack. Nygaard and Dahl were committed to writing their own compiler. - -In their paper introducing this system, Nygaard and Dahl illustrate its use by implementing a simulation of a factory with a limited number of machines that can serve orders. The process here is the order, which starts by looking for an available machine, suspends itself to wait for one if none are available, and then runs to completion once a free machine is found. There is a definition of the order process that is then used to instantiate several different order instances, but no methods are ever called on these instances. The main part of the program just creates the processes and sets them running. - -The first Simula I compiler was finished in 1965. The language grew popular at the Norwegian Computer Center, where Nygaard and Dahl had gone to work after leaving NDRE. Implementations of Simula I were made available to UNIVAC users and to Burroughs B5500 users. Nygaard and Dahl did a consulting deal with a Swedish company called ASEA that involved using Simula to run job shop simulations. But Nygaard and Dahl soon realized that Simula could be used to write programs that had nothing to do with simulation at all. - -Stein Krogdahl, a professor at the University of Oslo that has written about the history of Simula, claims that “the spark that really made the development of a new general-purpose language take off” was [a paper called “Record Handling”][3] by the British computer scientist C.A.R. Hoare. If you read Hoare’s paper now, this is easy to believe. I’m surprised that you don’t hear Hoare’s name more often when people talk about the history of object-oriented languages. Consider this excerpt from his paper: - -> The proposal envisages the existence inside the computer during the execution of the program, of an arbitrary number of records, each of which represents some object which is of past, present or future interest to the programmer. The program keeps dynamic control of the number of records in existence, and can create new records or destroy existing ones in accordance with the requirements of the task in hand. - -> Each record in the computer must belong to one of a limited number of disjoint record classes; the programmer may declare as many record classes as he requires, and he associates with each class an identifier to name it. A record class name may be thought of as a common generic term like “cow,” “table,” or “house” and the records which belong to these classes represent the individual cows, tables, and houses. - -Hoare does not mention subclasses in this particular paper, but Dahl credits him with introducing Nygaard and himself to the concept. Nygaard and Dahl had noticed that processes in Simula I often had common elements. Using a superclass to implement those common elements would be convenient. This also raised the possibility that the “process” idea itself could be implemented as a superclass, meaning that not every class had to be a process with a single operating rule. This then was the second great generalization that would make Simula 67 a truly general-purpose programming language. It was such a shift of focus that Nygaard and Dahl briefly considered changing the name of the language so that people would know it was not just for simulations. But “Simula” was too much of an established name for them to risk it. - -In 1967, Nygaard and Dahl signed a contract with Control Data to implement this new version of Simula, to be known as Simula 67. A conference was held in June, where people from Control Data, the University of Oslo, and the Norwegian Computing Center met with Nygaard and Dahl to establish a specification for this new language. This conference eventually led to a document called the [“Simula 67 Common Base Language,”][4] which defined the language going forward. - -Several different vendors would make Simula 67 compilers. The Association of Simula Users (ASU) was founded and began holding annual conferences. Simula 67 soon had users in more than 23 different countries. - -### 21st Century Simula - -Simula is remembered now because of its influence on the languages that have supplanted it. You would be hard-pressed to find anyone still using Simula to write application programs. But that doesn’t mean that Simula is an entirely dead language. You can still compile and run Simula programs on your computer today, thanks to [GNU cim][5]. - -The cim compiler implements the Simula standard as it was after a revision in 1986. But this is mostly the Simula 67 version of the language. You can write classes, subclass, and virtual methods just as you would have with Simula 67. So you could create a small object-oriented program that looks a lot like something you could easily write in Python or Ruby: - -``` -! dogs.sim ; -Begin - Class Dog; - ! The cim compiler requires virtual procedures to be fully specified ; - Virtual: Procedure bark Is Procedure bark;; - Begin - Procedure bark; - Begin - OutText("Woof!"); - OutImage; ! Outputs a newline ; - End; - End; - - Dog Class Chihuahua; ! Chihuahua is "prefixed" by Dog ; - Begin - Procedure bark; - Begin - OutText("Yap yap yap yap yap yap"); - OutImage; - End; - End; - - Ref (Dog) d; - d :- new Chihuahua; ! :- is the reference assignment operator ; - d.bark; -End; -``` - -You would compile and run it as follows: - -``` -$ cim dogs.sim -Compiling dogs.sim: -gcc -g -O2 -c dogs.c -gcc -g -O2 -o dogs dogs.o -L/usr/local/lib -lcim -$ ./dogs -Yap yap yap yap yap yap -``` - -(You might notice that cim compiles Simula to C, then hands off to a C compiler.) - -This was what object-oriented programming looked like in 1967, and I hope you agree that aside from syntactic differences this is also what object-oriented programming looks like in 2019. So you can see why Simula is considered a historically important language. - -But I’m more interested in showing you the process model that was central to Simula I. That process model is still available in Simula 67, but only when you use the `Process` class and a special `Simulation` block. - -In order to show you how processes work, I’ve decided to simulate the following scenario. Imagine that there is a village full of villagers next to a river. The river has lots of fish, but between them the villagers only have one fishing rod. The villagers, who have voracious appetites, get hungry every 60 minutes or so. When they get hungry, they have to use the fishing rod to catch a fish. If a villager cannot use the fishing rod because another villager is waiting for it, then the villager queues up to use the fishing rod. If a villager has to wait more than five minutes to catch a fish, then the villager loses health. If a villager loses too much health, then that villager has starved to death. - -This is a somewhat strange example and I’m not sure why this is what first came to mind. But there you go. We will represent our villagers as Simula processes and see what happens over a day’s worth of simulated time in a village with four villagers. - -The full program is [available here as a Gist][6]. - -The last lines of my output look like the following. Here we are seeing what happens in the last few hours of the day: - -``` -1299.45: John is hungry and requests the fishing rod. -1299.45: John is now fishing. -1311.39: John has caught a fish. -1328.96: Betty is hungry and requests the fishing rod. -1328.96: Betty is now fishing. -1331.25: Jane is hungry and requests the fishing rod. -1340.44: Betty has caught a fish. -1340.44: Jane went hungry waiting for the rod. -1340.44: Jane starved to death waiting for the rod. -1369.21: John is hungry and requests the fishing rod. -1369.21: John is now fishing. -1379.33: John has caught a fish. -1409.59: Betty is hungry and requests the fishing rod. -1409.59: Betty is now fishing. -1419.98: Betty has caught a fish. -1427.53: John is hungry and requests the fishing rod. -1427.53: John is now fishing. -1437.52: John has caught a fish. -``` - -Poor Jane starved to death. But she lasted longer than Sam, who didn’t even make it to 7am. Betty and John sure have it good now that only two of them need the fishing rod. - -What I want you to see here is that the main, top-level part of the program does nothing but create the four villager processes and get them going. The processes manipulate the fishing rod object in the same way that we would manipulate an object today. But the main part of the program does not call any methods or modify and properties on the processes. The processes have internal state, but this internal state only gets modified by the process itself. - -There are still fields that get mutated in place here, so this style of programming does not directly address the problems that pure functional programming would solve. But as Krogdahl observes, “this mechanism invites the programmer of a simulation to model the underlying system as a set of processes, each describing some natural sequence of events in that system.” Rather than thinking primarily in terms of nouns or actors—objects that do things to other objects—here we are thinking of ongoing processes. The benefit is that we can hand overall control of our program off to Simula’s event notice system, which Krogdahl calls a “time manager.” So even though we are still mutating processes in place, no process makes any assumptions about the state of another process. Each process interacts with other processes only indirectly. - -It’s not obvious how this pattern could be used to build, say, a compiler or an HTTP server. (On the other hand, if you’ve ever programmed games in the Unity game engine, this should look familiar.) I also admit that even though we have a “time manager” now, this may not have been exactly what Hickey meant when he said that we need an explicit notion of time in our programs. (I think he’d want something like the superscript notation [that Ada Lovelace used][7] to distinguish between the different values a variable assumes through time.) All the same, I think it’s really interesting that right there at the beginning of object-oriented programming we can find a style of programming that is not all like the object-oriented programming we are used to. We might take it for granted that object-oriented programming simply works one way—that a program is just a long list of the things that certain objects do to other objects in the exact order that they do them. Simula I’s process system shows that there are other approaches. Functional languages are probably a better thought-out alternative, but Simula I reminds us that the very notion of alternatives to modern object-oriented programming should come as no surprise. - -If you enjoyed this post, more like it come out every four weeks! Follow [@TwoBitHistory][8] on Twitter or subscribe to the [RSS feed][9] to make sure you know when a new post is out. - -Previously on TwoBitHistory… - -> Hey everyone! I sadly haven't had time to do any new writing but I've just put up an updated version of my history of RSS. This version incorporates interviews I've since done with some of the key people behind RSS like Ramanathan Guha and Dan Libby. -> -> — TwoBitHistory (@TwoBitHistory) [December 18, 2018][10] - - - --------------------------------------------------------------------------------- - -1. Jan Rune Holmevik, “The History of Simula,” accessed January 31, 2019, http://campus.hesge.ch/daehne/2004-2005/langages/simula.htm. ↩ - -2. Ole-Johan Dahl and Kristen Nygaard, “SIMULA—An ALGOL-Based Simulation Langauge,” Communications of the ACM 9, no. 9 (September 1966): 671, accessed January 31, 2019, http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.95.384&rep=rep1&type=pdf. ↩ - -3. Stein Krogdahl, “The Birth of Simula,” 2, accessed January 31, 2019, http://heim.ifi.uio.no/~steinkr/papers/HiNC1-webversion-simula.pdf. ↩ - -4. ibid. ↩ - -5. Ole-Johan Dahl and Kristen Nygaard, “The Development of the Simula Languages,” ACM SIGPLAN Notices 13, no. 8 (August 1978): 248, accessed January 31, 2019, https://hannemyr.com/cache/knojd_acm78.pdf. ↩ - -6. Dahl and Nygaard (1966), 676. ↩ - -7. Dahl and Nygaard (1978), 257. ↩ - -8. Krogdahl, 3. ↩ - -9. Ole-Johan Dahl, “The Birth of Object-Orientation: The Simula Languages,” 3, accessed January 31, 2019, http://www.olejohandahl.info/old/birth-of-oo.pdf. ↩ - -10. Dahl and Nygaard (1978), 265. ↩ - -11. Holmevik. ↩ - -12. Krogdahl, 4. ↩ - - --------------------------------------------------------------------------------- - -via: https://twobithistory.org/2019/01/31/simula.html - -作者:[Sinclair Target][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://twobithistory.org -[b]: https://github.com/lujun9972 -[1]: https://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey -[2]: /images/river.jpg -[3]: https://archive.computerhistory.org/resources/text/algol/ACM_Algol_bulletin/1061032/p39-hoare.pdf -[4]: http://web.eah-jena.de/~kleine/history/languages/Simula-CommonBaseLanguage.pdf -[5]: https://www.gnu.org/software/cim/ -[6]: https://gist.github.com/sinclairtarget/6364cd521010d28ee24dd41ab3d61a96 -[7]: https://twobithistory.org/2018/08/18/ada-lovelace-note-g.html -[8]: https://twitter.com/TwoBitHistory -[9]: https://twobithistory.org/feed.xml -[10]: https://twitter.com/TwoBitHistory/status/1075075139543449600?ref_src=twsrc%5Etfw diff --git a/sources/talk/20190204 Config management is dead- Long live Config Management Camp.md b/sources/talk/20190204 Config management is dead- Long live Config Management Camp.md deleted file mode 100644 index 679ac9033b..0000000000 --- a/sources/talk/20190204 Config management is dead- Long live Config Management Camp.md +++ /dev/null @@ -1,118 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Config management is dead: Long live Config Management Camp) -[#]: via: (https://opensource.com/article/19/2/configuration-management-camp) -[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg) - -Config management is dead: Long live Config Management Camp -====== - -CfgMgmtCamp '19 co-organizers share their take on ops, DevOps, observability, and the rise of YoloOps and YAML engineers. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cicd_continuous_delivery_deployment_gears.png?itok=kVlhiEkc) - -Everyone goes to [FOSDEM][1] in Brussels to learn from its massive collection of talk tracks, colloquially known as developer rooms, that run the gauntlet of curiosities, covering programming languages like Rust, Go, and Python, to special topics ranging from community, to legal, to privacy. After two days of nonstop activity, many FOSDEM attendees move on to Ghent, Belgium, to join hundreds for Configuration Management Camp ([CfgMgmtCamp][2]). - -Kris Buytaert and Toshaan Bharvani run the popular post-FOSDEM show centered around infrastructure management, featuring hackerspaces, training, workshops, and keynotes. It's a deeply technical exploration of the who, what, and how of building resilient infrastructure. It started in 2013 as a PuppetCamp but expanded to include more communities and tools in 2014. - -I spoke with Kris and Toshaan, who both have a healthy sense of humor, about CfgMgmtCamp's past, present, and future. Our interview has been edited for length and clarity. - -**Matthew: Your opening[keynote][3] is called "CfgMgmtCamp is dead." Is config management dead? Will it live on, or will something take its place?** - -**Kris:** We've noticed people are jumping on the hype of containers, trying to solve the same problems in a different way. But they are still managing config, only in different ways and with other tools. Over the past couple of years, we've evolved from a conference with a focus on infrastructure-as-code tooling, such as Puppet, Chef, CFEngine, Ansible, Juju, and Salt, to a more open source infrastructure automation conference in general. So, config management is definitely not dead. Infrastructure-as-code is also not dead, but it all is evolving. - -**Toshaan:** We see people changing tools, jumping on hype, and communities changing; however, the basic ideas and concepts remain the same. - -**Matthew: It's great to see[observability as the topic][4] of one of your keynotes. Why should those who care about configuration management also care about monitoring and observability?** - -**Kris:** While the name of the conference hasn't changed, the tools have evolved and we have expanded our horizon. Ten years ago, [Devopsdays][5] was just #devopsdays, but it evolved to focus on culture—the C of [CAMS][6] in the DevOps' core principles of Culture, Automation, Measurement, and Sharing. - -![](https://opensource.com/sites/default/files/uploads/cams.png) - -[Monitorama][7] filled the gap on monitoring and metrics (tackling the M in CAMS). Config Management Camp is about open source Automation, the A. Since they are all open source conferences, they fulfill the Sharing part, completing the CAMS concept. - -Observability sits on the line between Automation and Measurement. To go one step further, in some of my talks about open source monitoring, I describe the evolution of monitoring tools from #monitoringsucks to #monitoringlove; for lots of people (including me), the love for monitoring returned because we tied it to automation. We started to provision a service and automatically adapted the monitoring of that service to its state. Gone were the days where the monitoring tool was out of sync with reality. - -Looking at it from the other side, when you have an infrastructure or application so complex that you need observability in it, you'd better not be deploying manually; you will need some form of automation at that level of complexity. So, observability and infrastructure automation are tied together. - -**Toshaan:** Yes, while in the past we focused on configuration management, we will be looking to expand that into all types of infrastructure management. Last year, we played with this idea, and we were able to have a lot of cross-tool presentations. This year, we've taken this a step further by having more differentiated content. - -**Matthew: Some of my virtualization and Linux admin friends push back, saying observability is a developer's responsibility. How would you respond without just saying "DevOps?"** - -**Kris:** What you describe is what I call "Ooops Devs." This is a trend where the people who run the platform don't really care what they run; as long as port 80 is listening and the node pings, they are happy. It's equally bad as "Dev Ooops." "Ooops Devs" is where the devs rant about the ops folks because they are slow, not agile, and not responsive. But, to me, your job as an ops person or as a Linux admin is to keep a service running, and the only way to do that is to take on that task is as a team—with your colleagues who have different roles and insights, people who write code, people who design, etc. It is a shared responsibility. And hiding behind "that is someone else's responsibility," doesn't smell like collaboration going on. - -**Toshaan:** Even in the dark ages of silos, I believe a true sysadmin should have cared about observability, monitoring, and automation. I believe that the DevOps movement has made this much more widespread, and that it has become easier to get this information and expose it. On the other hand, I believe that pure operators or sysadmins have learned to be team players (or, they may have died out). I like the analogy of an army unit composed of different specialty soldiers who work together to complete a mission; we have engineers who work to deliver products or services. - -**Matthew: In a[Devopsdays Zurich talk][8], Kris offered an opinion that Americans build software for acquisition and Europeans build for resilience. In that light, what are the best skills for someone who wants to build meaningful infrastructure?** - -**Toshaan:** I believe still some people don't understand the complexity of code sprawl, and they believe that some new hype will solve this magically. - -**Kris:** This year, we invited [Steve Traugott][9], co-author of the 1998 USENIX paper "[Bootstrapping an Infrastructure][10]" that helped kickstart our community. So many people never read [Infrastructures.org][11], never experienced the pain of building images and image sprawl, and don't understand the evolution we went through that led us to build things the way we build them from source code. - -People should study topics such as idempotence, resilience, reproducibility, and surviving the tenth floor test. (As explained in "Bootstrapping an Infrastructure": "The test we used when designing infrastructures was 'Can I grab a random machine and throw it out the tenth-floor window without adversely impacting users for more than 10 minutes?' If the answer to this was 'yes,' then we knew we were doing things right.") But only after they understand the service they are building—the service is the absolute priority—can they begin working on things like: how can we run this, how can we make sure it keeps running, how can it fail and how can we prevent that, and if it disappears, how can we spin it up again fast, unnoticed by the end user. - -**Toshaan:** 100% uptime. - -**Kris:** The challenge we have is that lots of people don't have that experience yet. We've seen the rise of [YoloOps][12]—just spin it up once, fire, and forget—which results in security problems, stability problems, data loss, etc., and they often grasp onto the solutions in YoloOps, the easy way to do something quickly and move on. But understanding how things will eventually fail takes time, it's called experience. - -**Toshaan:** Well, when I was a student and manned the CentOS stand at FOSDEM, I remember a guy coming up to the stand and complaining that he couldn't do consulting because of the "fire once and forgot" policy of CentOS, and that it just worked too well. I like to call this ZombieOps, but YoloOps works also. - -**Matthew: I see you're leading the second year of YamlCamp as well. Why does a markup language need its own camp?** - -**Kris:** [YamlCamp][13] is a parody, it's a joke. Last year, Bob Walker ([@rjw1][14]) gave a talk titled "Are we all YAML engineers now?" that led to more jokes. We've had a discussion for years about rebranding CfgMgmtCamp; the problem is that people know our name, we have a large enough audience to keep going, and changing the name would mean effort spent on logos, website, DNS, etc. We won't change the name, but we joked that we could rebrand to YamlCamp, because for some weird reason, a lot of the talks are about YAML. :) - -**Matthew: Do you think systems engineers should list YAML as a skill or a language on their CV? Should companies be hiring YAML engineers, or do you have "Long live all YAML engineers" on the website in jest?** - -**Toshaan:** Well, the real question is whether people are willing to call themselves YAML engineers proudly, because we already have enough DevOps engineers. - -**Matthew: What FOSS software helps you manage the event?** - -**Toshaan:** I re-did the website in Hugo CMS because we were spending too much time maintaining the website manually. I chose Hugo, because I was learning Golang, and because it has been successfully used for other conferences and my own website. I also wanted a static website and iCalendar output, so we could use calendar tooling such as Giggity to have a good scheduling tool. - -The website now builds quite nicely, and while I still have some ideas on improvements, maintenance is now much easier. - -For the call for proposals (CFP), we now use [OpenCFP][15]. We want to optimize the submission, voting, selection, and extraction to be as automated as possible, while being easy and comfortable for potential speakers, reviewers, and ourselves to use. OpenCFP seems to be the tool that works; while we still have some feature requirements, I believe that, once we have some time to contribute back to OpenCFP, we'll have a fully functional and easy tool to run CFPs with. - -Last, we switched from EventBrite to Pretix because I wanted to be GDPR compliant and have the ability to run our questions, vouchers, and extra features. Pretix allows us to control registration of attendees, speakers, sponsors, and organizers and have a single overview of all the people coming to the event. - -### Wrapping up - -The beauty of Configuration Management Camp to me is that it continues to evolve with its audience. Configuration management is certainly at the heart of the work, but it's in service to resilient infrastructure. Keep your eyes open for the talk recordings to learn from the [line up of incredible speakers][16], and thank you to the team for running this (free) show! - -You can follow Kris [@KrisBuytaert][17] and Toshaan [@toshywoshy][18]. You can also see Kris' past articles [on his blog][19]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/configuration-management-camp - -作者:[Matthew Broberg][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mbbroberg -[b]: https://github.com/lujun9972 -[1]: https://fosdem.org/2019/ -[2]: https://cfgmgmtcamp.eu/ -[3]: https://cfgmgmtcamp.eu/schedule/monday/intro00/ -[4]: https://cfgmgmtcamp.eu/schedule/monday/keynote0/ -[5]: https://www.devopsdays.org/ -[6]: http://devopsdictionary.com/wiki/CAMS -[7]: http://monitorama.com/ -[8]: https://vimeo.com/272519813 -[9]: https://cfgmgmtcamp.eu/schedule/tuesday/keynote1/ -[10]: http://www.infrastructures.org/papers/bootstrap/bootstrap.html -[11]: http://www.infrastructures.org/ -[12]: https://gist.githubusercontent.com/mariozig/5025613/raw/yolo -[13]: https://twitter.com/yamlcamp -[14]: https://twitter.com/rjw1 -[15]: https://github.com/opencfp/opencfp -[16]: https://cfgmgmtcamp.eu/speaker/ -[17]: https://twitter.com/KrisBuytaert -[18]: https://twitter.com/toshywoshy -[19]: https://krisbuytaert.be/index.shtml diff --git a/sources/talk/20190206 4 steps to becoming an awesome agile developer.md b/sources/talk/20190206 4 steps to becoming an awesome agile developer.md deleted file mode 100644 index bad4025aef..0000000000 --- a/sources/talk/20190206 4 steps to becoming an awesome agile developer.md +++ /dev/null @@ -1,82 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (4 steps to becoming an awesome agile developer) -[#]: via: (https://opensource.com/article/19/2/steps-agile-developer) -[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) - -4 steps to becoming an awesome agile developer -====== -There's no magical way to do it, but these practices will put you well on your way to embracing agile in application development, testing, and debugging. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_lead-steps-measure.png?itok=DG7rFZPk) - -Enterprises are rushing into their DevOps journey through [agile][1] software development with cloud-native technologies such as [Linux containers][2], [Kubernetes][3], and [serverless][4]. Continuous integration helps enterprise developers reduce bugs, unexpected errors, and improve the quality of their code deployed in production. - -However, this doesn't mean all developers in DevOps automatically embrace agile for their daily work in application development, testing, and debugging. There is no magical way to do it, but the following four practical steps and best practices will put you well on your way to becoming an awesome agile developer. - -### Start with design thinking agile practices - -There are many opportunities to learn about using agile software development practices in your DevOps initiatives. Agile practices inspire people with new ideas and experiences for improving their daily work in application development with team collaboration. More importantly, those practices will help you discover the answers to questions such as: Why am I doing this? What kind of problems am I trying to solve? How do I measure the outcomes? - -A [domain-driven design][5] approach will help you start discovery sooner and easier. For example, the [Start At The End][6] practice helps you redesign your application and explore potential business outcomes—such as, what would happen if your application fails in production? You might also be interested in [Event Storming][7] for interactive and rapid discovery or [Impact Mapping][8] for graphical and strategic design as part of domain-driven design practices. - -### Use a predictive approach first - -In agile software development projects, enterprise developers are mainly focused on adapting to rapidly changing app development environments such as reactive runtimes, cloud-native frameworks, Linux container packaging, and the Kubernetes platform. They believe this is the best way to become an agile developer in their organization. However, this type of adaptive approach typically makes it harder for developers to understand and report what they will do in the next sprint. Developers might know the ultimate goal and, at best, the app features for a release about four months from the current sprint. - -In contrast, the predictive approach places more emphasis on analyzing known risks and planning future sprints in detail. For example, predictive developers can accurately report the functions and tasks planned for the entire development process. But it's not a magical way to make your agile projects succeed all the time because the predictive team depends totally on effective early-stage analysis. If the analysis does not work very well, it may be difficult for the project to change direction once it gets started. - -To mitigate this risk, I recommend that senior agile developers increase the predictive capabilities with a plan-driven method, and junior agile developers start with the adaptive methods for value-driven development. - -### Continuously improve code quality - -Don't hesitate to engage in [continuous integration][9] (CI) practices for improving your application before deploying code into production. To adopt modern application frameworks, such as cloud-native architecture, Linux container packaging, and hybrid cloud workloads, you have to learn about automated tools to address complex CI procedures. - -[Jenkins][10] is the standard CI tool for many organizations; it allows developers to build and test applications in many projects in an automated fashion. Its most important function is detecting unexpected errors during CI to prevent them from happening in production. This should increase business outcomes through better customer satisfaction. - -Automated CI enables agile developers to not only improve the quality of their code but their also application development agility through learning and using open source tools and patterns such as [behavior-driven development][11], [test-driven development][12], [automated unit testing][13], [pair programming][14], [code review][15], and [design pattern][16]. - -### Never stop exploring communities - -Never settle, even if you already have a great reputation as an agile developer. You have to continuously take on bigger challenges to make great software in an agile way. - -By participating in the very active and growing open source community, you will not only improve your skills as an agile developer, but your actions can also inspire other developers who want to learn agile practices. - -How do you get involved in specific communities? It depends on your interests and what you want to learn. It might mean presenting specific topics at conferences or local meetups, writing technical blog posts, publishing practical guidebooks, committing code, or creating pull requests to open source projects' Git repositories. It's worth exploring open source communities for agile software development, as I've found it is a great way to share your expertise, knowledge, and practices with other brilliant developers and, along the way, help each other. - -### Get started - -These practical steps can give you a shorter path to becoming an awesome agile developer. Then you can lead junior developers in your team and organization to become more flexible, valuable, and predictive using agile principles. - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/steps-agile-developer - -作者:[Daniel Oh][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/article/18/10/what-agile -[2]: https://opensource.com/resources/what-are-linux-containers -[3]: https://opensource.com/resources/what-is-kubernetes -[4]: https://opensource.com/article/18/11/open-source-serverless-platforms -[5]: https://en.wikipedia.org/wiki/Domain-driven_design -[6]: https://openpracticelibrary.com/practice/start-at-the-end/ -[7]: https://openpracticelibrary.com/practice/event-storming/ -[8]: https://openpracticelibrary.com/practice/impact-mapping/ -[9]: https://en.wikipedia.org/wiki/Continuous_integration -[10]: https://jenkins.io/ -[11]: https://en.wikipedia.org/wiki/Behavior-driven_development -[12]: https://en.wikipedia.org/wiki/Test-driven_development -[13]: https://en.wikipedia.org/wiki/Unit_testing -[14]: https://en.wikipedia.org/wiki/Pair_programming -[15]: https://en.wikipedia.org/wiki/Code_review -[16]: https://en.wikipedia.org/wiki/Design_pattern diff --git a/sources/talk/20190206 What blockchain and open source communities have in common.md b/sources/talk/20190206 What blockchain and open source communities have in common.md deleted file mode 100644 index bc4f9464d0..0000000000 --- a/sources/talk/20190206 What blockchain and open source communities have in common.md +++ /dev/null @@ -1,64 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What blockchain and open source communities have in common) -[#]: via: (https://opensource.com/article/19/2/blockchain-open-source-communities) -[#]: author: (Gordon Haff https://opensource.com/users/ghaff) - -What blockchain and open source communities have in common -====== -Blockchain initiatives can look to open source governance for lessons on establishing trust. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/diversity_flowers_chain.jpg?itok=ns01UPOp) - -One of the characteristics of blockchains that gets a lot of attention is how they enable distributed trust. The topic of trust is a surprisingly complicated one. In fact, there's now an [entire book][1] devoted to the topic by Kevin Werbach. - -But here's what it means in a nutshell. Organizations that wish to work together, but do not fully trust one another, can establish a permissioned blockchain and invite business partners to record their transactions on a shared distributed ledger. Permissioned blockchains can trace assets when transactions are added to the blockchain. A permissioned blockchain implies a degree of trust (again, trust is complicated) among members of a consortium, but no single entity controls the storage and validation of transactions. - -The basic model is that a group of financial institutions or participants in a logistics system can jointly set up a permissioned blockchain that will validate and immutably record transactions. There's no dependence on a single entity, whether it's one of the direct participants or a third-party intermediary who set up the blockchain, to safeguard the integrity of the system. The blockchain itself does so through a variety of cryptographic mechanisms. - -Here's the rub though. It requires that competitors work together cooperatively—a relationship often called [coopetition][2]. The term dates back to the early 20th century, but it grew into widespread use when former Novell CEO Ray Noorda started using the term to describe the company's business strategy in the 1990s. Novell was then planning to get into the internet portal business, which required it to seek partnerships with some of the search engine providers and other companies it would also be competing against. In 1996, coopetition became the subject of a bestselling [book][3]. - -Coopetition can be especially difficult when a blockchain network initiative appears to be driven by a dominant company. And it's hard for the dominant company not to exert outsize influence over the initiative, just as a natural consequence of how big it is. For example, the IBM-Maersk joint venture has [struggled to sign up rival shipping companies][4], in part because Maersk is the world's largest carrier by capacity, a position that makes rivals wary. - -We see this same dynamic in open source communities. The original creators of a project need to not only let go; they need to put governance structures in place that give competing companies confidence that there's a level playing field. - -For example, Sarah Novotny, now head of open source strategy at Google Cloud Platform, [told me in a 2017 interview][5] about the [Kubernetes][6] project that it isn't always easy to give up control, even when people buy into doing what is best for a project. - -> Google turned Kubernetes over to the Cloud Native Computing Foundation (CNCF), which sits under the Linux Foundation umbrella. As [CNCF executive director Dan Kohn puts it][7]: "One of the things they realized very early on is that a project with a neutral home is always going to achieve a higher level of collaboration. They really wanted to find a home for it where a number of different companies could participate." -> -> Defaulting to public may not be either natural or comfortable. "Early on, my first six, eight, or 12 weeks at Google, I think half my electrons in email were spent on: 'Why is this discussion not happening on a public mailing list? Is there a reason that this is specific to GKE [Google Container Engine]? No, there's not a reason,'" said Novotny. - -To be sure, some grumble that open source foundations have become too common and that many are too dominated by paying corporate members. Simon Phipps, currently the president of the Open Source Initiative, gave a talk at OSCON way back in 2015 titled ["Enough Foundations Already!"][8] in which he argued that "before we start another open source foundation, let's agree that what we need protected is software freedom and not corporate politics." - -Nonetheless, while not appropriate for every project, foundations with business, legal, and technical governance are increasingly the model for open source projects that require extensive cooperation among competing companies. A [2017 analysis of GitHub data by the Linux Foundation][9] found a number of different governance models in use by the highest-velocity open source projects. Unsurprisingly, quite a few remained under the control of the company that created or acquired them. However, about a third were under the auspices of a foundation. - -Is there a lesson here for blockchain? Quite possibly. Open source projects can be sponsored by a company while still putting systems and governance in place that are welcoming to outside contributors. However, there's a great deal of history to suggest that doing so is hard because it's hard not to exert control and leverage when you can. Furthermore, even if you make a successful case for being truly open to equal participation to outsiders today, it will be hard to allay suspicions that you might not be as welcoming tomorrow. - -To the degree that we can equate blockchain consortiums with open source communities, this suggests that business blockchain initiatives should look to open source governance for lessons. Dominant players in the ecosystem need to forgo control, and they need to have conversations with partners and potential partners about what types of structures would make participating easier. - -Many blockchain infrastructure software projects are already under foundations such as Hyperledger. But perhaps some specific production deployments of blockchain aimed at specific industries and ecosystems will benefit from formal governance structures as well. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/blockchain-open-source-communities - -作者:[Gordon Haff][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/ghaff -[b]: https://github.com/lujun9972 -[1]: https://mitpress.mit.edu/books/blockchain-and-new-architecture-trust -[2]: https://en.wikipedia.org/wiki/Coopetition -[3]: https://en.wikipedia.org/wiki/Co-opetition_(book) -[4]: https://www.theregister.co.uk/2018/10/30/ibm_struggles_to_sign_up_shipping_carriers_to_blockchain_supply_chain_platform_reports/ -[5]: https://opensource.com/article/17/4/podcast-kubernetes-sarah-novotny -[6]: https://kubernetes.io/ -[7]: http://bitmason.blogspot.com/2017/02/podcast-cloud-native-computing.html -[8]: https://www.oreilly.com/ideas/enough-foundations-already -[9]: https://www.linuxfoundation.org/blog/2017/08/successful-open-source-projects-common/ diff --git a/sources/talk/20190214 Top 5 podcasts for Linux news and tips.md b/sources/talk/20190214 Top 5 podcasts for Linux news and tips.md deleted file mode 100644 index fb827bb39b..0000000000 --- a/sources/talk/20190214 Top 5 podcasts for Linux news and tips.md +++ /dev/null @@ -1,80 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Top 5 podcasts for Linux news and tips) -[#]: via: (https://opensource.com/article/19/2/top-linux-podcasts) -[#]: author: (Stephen Bancroft https://opensource.com/users/stevereaver) - -Top 5 podcasts for Linux news and tips -====== -A tried and tested podcast listener, shares his favorite Linux podcasts over the years, plus a couple of bonus picks. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux-penguin-penguins.png?itok=5hlVDue7) - -Like many Linux enthusiasts, I listen to a lot of podcasts. I find my daily commute is the best time to get some time to myself and catch up on the latest tech news. Over the years, I have subscribed and unsubscribed to more show feeds than I care to think about and have distilled them down to the best of the best. - -Here are my top five Linux podcasts I think you should be listening to in 2019, plus a couple of bonus picks. - - 5. [**Late Night Linux**][1]—This podcast, hosted by Joe, [Félim][2], [Graham][3], and [Will][4] from the UK, is rough, ready, and pulls no punches. [Joe Ressington][5] is always ready to tell it how it is, and Félim is always quick with his opinions. It's presented in a casual conversation format—but not one to have one with the kids around, especially with subjects they are all passionate about! - - - 4. [**Ask Noah Show**][6]—This show was forked from the Linux Action Show after it ended. Hosted by [Noah Chelliah][7], it's presented in a radio talkback style and takes live calls from listeners—it's syndicated from a local radio station in Grand Forks, North Dakota. The podcast isn't purely about Linux, but Noah takes on technical challenges and solves them with Linux and answers listeners' questions about how to achieve good technical solutions using Linux. - - - 3. [**The Ubuntu Podcast**][8]—If you want the latest about Ubuntu, you can't go past this show. In another podcast with a UK twist, hosts [Alan Pope][9] (Popey), [Mark Johnson][10], and [Martin Wimpress][11] (Wimpy) present a funny and insightful view of the open source community with news directly from Ubuntu. - - - 2. [**Linux Action News**][12]—The title says it all: it's a news show for Linux. This show was spawned from the popular Linux Action Show and is broadcast by the [Jupiter Broadcasting Network][13], which has many other tech-related podcasts. Hosts Chris Fisher and [Joe Ressington][5] present the show in a more formal "evening news" style, which runs around 30 minutes long. If you want to get a quick weekly update on Linux and Linux-related news, this is the show for you. - - - 1. [**Linux Unplugged**][14]—Finally, coming in at the number one spot is the granddaddy of them all, Linux Unplugged. This show gets to the core of what being in the Linux community is all about. Presented as a casual panel-style discussion by [Chris Fisher][15] and [Wes Payne][16], the podcast includes an interactive voice chatroom where listeners can connect and be heard live on the show as it broadcasts. - - - -Well, there you have it, my current shortlist of Linux podcasts. It's likely to change in the near future, but for now, I am enjoying every minute these guys put together. - -### Bonus podcasts - -Here are two bonus podcasts you might want to check out. - -**[Choose Linux][17]** is a brand-new podcast that is tantalizing because of its hosts: Joe Ressington of Linux Action News, who is a long-time Linux veteran, and [Jason Evangelho][18], a Forbes writer who recently shot to fame in the open source community with his articles showcasing his introduction to Linux and open source. Living vicariously through Jason's introduction to Linux has been and will continue to be fun. - -[**Command Line Heroes**][19] is a podcast produced by Red Hat. It has a very high production standard and has a slightly different format to the shows I have previously mentioned, anchored by a single presenter, developer, and [CodeNewbie][20] founder [Saron Yitbarek][21], who presents the latest innovations in open source. Now in its second season and released fortnightly, I highly recommend that you start from the first episode of this podcast. It starts with a great intro to the O/S wars of the '90s and sets the foundations for the start of Linux. - -Do you have a favorite Linux podcast that isn't on this list? Please share it in the comments. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/top-linux-podcasts - -作者:[Stephen Bancroft][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/stevereaver -[b]: https://github.com/lujun9972 -[1]: https://latenightlinux.com/ -[2]: https://twitter.com/felimwhiteley -[3]: https://twitter.com/degville -[4]: https://twitter.com/8none1 -[5]: https://twitter.com/JoeRessington -[6]: http://www.asknoahshow.com/ -[7]: https://twitter.com/kernellinux?lang=en -[8]: http://ubuntupodcast.org/ -[9]: https://twitter.com/popey -[10]: https://twitter.com/marxjohnson -[11]: https://twitter.com/m_wimpress -[12]: https://linuxactionnews.com/ -[13]: https://www.jupiterbroadcasting.com/ -[14]: https://linuxunplugged.com/ -[15]: https://twitter.com/ChrisLAS -[16]: https://twitter.com/wespayne -[17]: https://chooselinux.show -[18]: https://twitter.com/killyourfm -[19]: https://www.redhat.com/en/command-line-heroes -[20]: https://www.codenewbie.org/ -[21]: https://twitter.com/saronyitbarek diff --git a/sources/talk/20190219 How Linux testing has changed and what matters today.md b/sources/talk/20190219 How Linux testing has changed and what matters today.md deleted file mode 100644 index ad26d6dbec..0000000000 --- a/sources/talk/20190219 How Linux testing has changed and what matters today.md +++ /dev/null @@ -1,99 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How Linux testing has changed and what matters today) -[#]: via: (https://opensource.com/article/19/2/phoronix-michael-larabel) -[#]: author: (Don Watkins https://opensource.com/users/don-watkins) - -How Linux testing has changed and what matters today -====== -Michael Larabel, the founder of Phoronix, shares his insights on the evolution of Linux and open hardware. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mistake_bug_fix_find_error.png?itok=PZaz3dga) - -If you've ever wondered how your Linux computer stacks up against other Linux, Windows, and MacOS machines or searched for reviews of Linux-compatible hardware, you're probably familiar with [Phoronix][1]. Along with its website, which attracts more than 250 million visitors a year to its Linux reviews and news, the company also offers the [Phoronix Test Suite][2], an open source hardware benchmarking tool, and [OpenBenchmarking.org][3], where test result data is stored. - -According to [Michael Larabel][4], who started Phoronix in 2004, the site "is frequently cited as being the leading source for those interested in computer hardware and Linux. It offers insights regarding the development of the Linux kernel, product reviews, interviews, and news regarding free and open source software." - -I recently had the opportunity to interview Michael about Phoronix and his work. - -The questions and answers have been edited for length and clarity. - -**Don Watkins:** What inspired you to start Phoronix? - -**Michael Larabel:** When I started [Phoronix.com][5] in June 2004, it was still challenging to get a mouse or other USB peripherals working on the popular distributions of the time, like Mandrake, Yoper, MEPIS, and others. So, I set out to work on reviewing different hardware components and their compatibility with Linux. Over time, that shifted more from "does the basic device work?" to how well they perform and what features are supported or unsupported under Linux. - -It's been interesting to see the evolution and the importance of Linux on hardware rise. Linux was very common to LAMP/web servers, but Linux has also become synonymous with high-performance computing (HPC), Android smartphones, cloud software, autonomous vehicles, edge computing, digital signage, and related areas. While Linux hasn't quite dominated the desktop, it's doing great practically everywhere else. - -I also developed the Phoronix Test Suite, with its initial 1.0 public release in 2008, to increase the viability of testing on Linux, engage with more hardware and software vendors on best practices for testing, and just get more test cases running on Linux. At the time, there weren't any really shiny benchmarks on Linux like there were on Windows. - -**DW:** Who are your website's readers? - -**ML:** Phoronix's audience is as diverse as the content. Initially, it was quite desktop/gamer/enthusiast oriented, but as Linux's dominance has grown in HPC, cloud, embedded, etc., my testing has expanded in those areas and thus so has the readership. Readers tend to be interested in open source/Linux ecosystem advancements, performance, and a slight bent towards graphics processor and hardware driver interests. - -**DW:** How important is testing in the Linux world and how has it changed from when you started? - -**ML:** Testing has changed radically since 2004. Back then, many open source projects weren't carrying out any continuous integration (CI) or testing for regressions—both functional issues and performance problems. The hardware vendors supporting Linux were mostly trying to get things working and maintained while being less concerned about performance or scratching away at catching up to Mac, Solaris, and Windows. With time, we've seen the desktop reach close parity with (or exceed, depending upon your views) alternative operating systems. Most PC hardware now works out-of-the-box on Linux, most open source projects engage in some form of CI or testing, and more time and resources are afforded to advancing Linux performance. With high-frequency trading and cloud platforms relying on Linux, performance has become of utmost importance. - -Most of my testing at Phoronix.com is focused on benchmarking processors, graphics cards, storage devices, and other areas of interest to gamers and enthusiasts, but also interesting server platforms. Readers are also quite interested in testing of software components like the Linux kernel, code compilers, and filesystems. But in terms of the Phoronix Test Suite, its scope is rather limitless, with a framework in which new tests can be easily added and automated. There are currently more than 1,000 different profiles/suites, and new ones are routinely added—from machine learning tests to traditional benchmarks. - -**DW:** How important is open source hardware? Where do you see it going? - -**ML:** Open hardware is of increasing importance, especially in light of all the security vulnerabilities and disclosures in recent years. Facebook's work on the [Open Compute Project][6] can be commended, as can Google leveraging [Coreboot][7] in its Chromebook devices, and [Raptor Computing Systems][8]' successful, high-performance, open source POWER9 desktops/workstations/servers. [Intel][9] potentially open sourcing its firmware support package this year is also incredibly tantalizing and will hopefully spur more efforts in this space. - -Outside of that, open source hardware has had a really tough time cracking the consumer space due to the sheer amount of capital necessary and the complexities of designing a modern chip, etc., not to mention competing with the established hardware vendors' marketing budgets and other resources. So, while I would love for 100% open source hardware to dominate—or even compete in features and performance with proprietary hardware—in most segments, that is sadly unlikely to happen, especially with open hardware generally being much more expensive due to economies of scale. - -Software efforts like [OpenBMC][10], Coreboot/[Libreboot][11], and [LinuxBoot][12] are opening up hardware much more. Those efforts at liberating hardware have proven successful and will hopefully continue to be endorsed by more organizations. - -As for [OSHWA][13], I certainly applaud their efforts and the enthusiasm they bring to open source hardware. Certainly, for niche and smaller-scale devices, open source hardware can be a great fit. It will certainly be interesting to see what comes about with OSHWA and some of its partners like Lulzbot, Adafruit, and System76. - -**DW:** Can people install Phoronix Test Suite on their own computers? - -ML: The Phoronix Test Suite benchmarking software is open source under the GPL and can be downloaded from [Phoronix-Test-Suite.com][2] and [GitHub][14]. The benchmarking software works on not only Linux systems but also MacOS, Solaris, BSD, and Windows 10/Windows Server. The Phoronix Test Suite works on x86/x86_64, ARM/AArch64, POWER, RISC-V, and other architectures. - -**DW:** How does [OpenBenchmarking.org][15] work with the Phoronix Test Suite? - -**ML:** OpenBenchmarking.org is, in essence, the "cloud" component to the Phoronix Test Suite. It stores test profiles/test suites in a package manager-like fashion, allows users to upload their own benchmarking results, and offers related functionality around our benchmarking software. - -OpenBenchmarking.org is seamlessly integrated into the Phoronix Test Suite, but from the web interface, it is also where anyone can see the public benchmark results, inspect the open source test profiles to understand their methodology, research hardware and software data, and use similar functionality. - -Another component developed as part of the Phoronix Test Suite is [Phoromatic][16], which effectively allows anyone to deploy their own OpenBenchmarking-like environment within their own private intranet/LAN. This allows organizations to archive their benchmark results locally (and privately), orchestrate benchmarks automatically against groups of systems, manage the benchmark systems, and develop new test cases. - -**DW:** How can people stay up to date on Phoronix? - -**ML:** You can follow [me][17], [Phoronix][18], [Phoronix Test Suite][19], and [OpenBenchMarking.org][20] on Twitter. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/phoronix-michael-larabel - -作者:[Don Watkins][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/don-watkins -[b]: https://github.com/lujun9972 -[1]: https://www.phoronix.com/ -[2]: https://www.phoronix-test-suite.com/ -[3]: https://openbenchmarking.org/ -[4]: https://www.michaellarabel.com/ -[5]: http://Phoronix.com -[6]: https://www.opencompute.org/ -[7]: https://www.coreboot.org/ -[8]: https://www.raptorcs.com/ -[9]: https://www.phoronix.com/scan.php?page=news_item&px=Intel-Open-Source-FSP-Likely -[10]: https://en.wikipedia.org/wiki/OpenBMC -[11]: https://libreboot.org/ -[12]: https://linuxboot.org/ -[13]: https://www.oshwa.org/ -[14]: https://github.com/phoronix-test-suite/ -[15]: http://OpenBenchmarking.org -[16]: http://www.phoronix-test-suite.com/index.php?k=phoromatic -[17]: https://twitter.com/michaellarabel -[18]: https://twitter.com/phoronix -[19]: https://twitter.com/Phoromatic -[20]: https://twitter.com/OpenBenchmark diff --git a/sources/talk/20190219 How our non-profit works openly to make education accessible.md b/sources/talk/20190219 How our non-profit works openly to make education accessible.md deleted file mode 100644 index eee670610c..0000000000 --- a/sources/talk/20190219 How our non-profit works openly to make education accessible.md +++ /dev/null @@ -1,136 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How our non-profit works openly to make education accessible) -[#]: via: (https://opensource.com/open-organization/19/2/building-curriculahub) -[#]: author: (Tanner Johnson https://opensource.com/users/johnsontanner3) - -How our non-profit works openly to make education accessible -====== -To build an open access education hub, our team practiced the same open methods we teach our students. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_Education_2_OpenAccess_1040x584_12268077_0614MM.png?itok=xb96iaHe) - -I'm lucky to work with a team of impressive students at Duke University who are leaders in their classrooms and beyond. As members of [CSbyUs][1], a non-profit and student-run organization based at Duke, we connect university students to middle school students, mostly from [title I schools][2] across North Carolina's Research Triangle Park. Our mission is to fuel future change agents from under-resourced learning environments by fostering critical technology skills for thriving in the digital age. - -The CSbyUs Tech R&D team (TRD for short) recently set an ambitious goal to build and deploy a powerful web application over the course of one fall semester. Our team of six knew we had to do something about our workflow to ship a product by winter break. In our middle school classrooms, we teach our learners to use agile methodologies and design thinking to create mobile applications. On the TRD team, we realized we needed to practice what we preach in those classrooms to ship a quality product by semester's end. - -This is the story of how and why we utilized the principles we teach our students in order to deploy technology that will scale our mission and make our teaching resources open and accessible. - -### Setting the scene - -For the past two years, CSbyUs has operated "on the ground," connecting Duke undergraduates to Durham middle schools via after-school programming. After teaching and evaluating several iterations of our unique, student-centered mobile app development curriculum, we saw promising results. Our middle schoolers were creating functional mobile apps, connecting to their mentors, and leaving the class more confident in their computer science skills. Naturally, we wondered how to expand our programming. - -We knew we should take our own advice and lean into web-based technologies to share our work, but we weren't immediately sure what problem we needed to solve. Ultimately, we decided to create a web app that serves as a centralized hub for open source and open access digital education curricula. "CurriculaHub" (name inspired by GitHub) would be the defining pillar of CSbyUs's new website, where educators could share and adapt resources. - -But the vision and implementation didn't happen overnight. - -Given our sense of urgency and the potential of "CurriculaHub," we wanted to start this project with a well defined plan. The stakes were (and are) high, so planning, albeit occasionally tedious, was critical to our success. Like the curriculum we teach, we scaffolded our workflow process with design thinking and agile methodology, two critical 21st century frameworks we often fail to practice in higher ed. - -What follows is a step-wise explanation of our design thinking process, starting from inspiration and ending in a shipped prototype. - -``` -This is the story of how and why we utilized the principles we teach our students in order to deploy technology that will scale our mission and make our teaching resources open and accessible. -``` - -### Our Process - -#### **Step 1: Pre-Work** - -In order to understand the why to our what, you have to know who our team is. - -The members of this team are busy. All of us contribute to CSbyUs beyond our TRD-related responsibilities. As an organization with lofty goals beyond creating a web-based platform, we have to reconcile our "on the ground" commitments (i.e., curriculum curation, research and evaluation, mentorship training and practice, presentations at conferences, etc.) with our "in the cloud" technological goals. - -In addition to balancing time across our organization, we have to be flexible in the ways we communicate. As a remote member of the team, I'm writing this post from Spain, but the rest of our team is based in North Carolina, adding collaboration challenges. - -Before diving into development (or even problem identification), we knew we had to set some clear expectations for how we'd operate as a team. We took a note from our curriculum team's book and started with some [rules of engagement][3]. This is actually [a well-documented approach][4] to setting up a team's [social contract][5] used by teams across the tech space. During a summer internship at IBM, I remember pre-project meetings where my manager and team spent more than an hour clarifying principles of interaction. Whenever we faced uncertainty in our team operations, we'd pull out the rules of engagement and clear things up almost immediately. (An aside: I've found this strategy to be wildly effective not only in my teams, but in all relationships). - -Considering the remote nature of our team, one of our favorite tools is Slack. We use it for almost everything. We can't have sticky-note brainstorms, so we create Slack brainstorm threads. In fact, that's exactly what we did to generate our rules of engagement. One [open source principle we take to heart is transparency][6]; Slack allows us to archive and openly share our thought processes and decision-making steps with the rest of our team. - -#### **Step 2: Empathy Research** - -We're all here for unique reasons, but we find a common intersection: the desire to broaden equity in access to quality digital era education. - -Each member of our team has been lucky enough to study at Duke. We know how it feels to have limitless opportunities and the support of talented peers and renowned professors. But we're mindful that this isn't normal. Across the country and beyond, these opportunities are few and far between. Where they do exist, they're confined within the guarded walls of higher institutes of learning or come with a lofty price tag. - -While our team members' common desire to broaden access is clear, we work hard to root our decisions in research. So our team begins each semester [reviewing][7] [research][8] that justifies our existence. TRD works with CRD (curriculum research and development) and TT (teaching team), our two other CSbyUs sub-teams, to discuss current trends in digital education access, their systemic roots, and novel approaches to broaden access and make materials relevant to learners. We not only perform research collaboratively at the beginning of the semester but also implement weekly stand-up research meetings with the sub-teams. During these, CRD often presents new findings we've gleaned from interviewing current teachers and digging into the current state of access in our local community. They are our constant source of data-driven, empathy-fueling research. - -Through this type of empathy-based research, we have found that educators interested in student-centered teaching and digital era education lack a centralized space for proven and adaptable curricula and lesson plans. The bureaucracy and rigid structures that shape classroom learning in the United States makes reshaping curricula around the personal needs of students daunting and seemingly impossible. As students, educators, and technologists, we wondered how we might unleash the creativity and agency of others by sharing our own resources and creating an online ecosystem of support. - -#### **Step 3: Defining the Problem** - -We wanted to avoid [scope creep][9] caused by a poorly defined mission and vision (something that happens too often in some organizations). We needed structures to define our goals and maintain clarity in scope. Before imagining our application features, we knew we'd have to start with defining our north star. We would generate a clear problem statement to which we could refer throughout development. - -Before imagining our application features, we knew we'd have to start with defining our north star. - -This is common practice for us. Before committing to new programming, new partnerships, or new changes, the CSbyUs team always refers back to our mission and vision and asks, "Does this make sense?" (in fact, we post our mission and vision to the top of every meeting minutes document). If it fits and we have capacity to pursue it, we go for it. And if we don't, then we don't. In the case of a "no," we are always sure to document what and why because, as engineers know, [detailed logs are almost always a good decision][10]. TRD gleaned that big-picture wisdom and implemented a group-defined problem statement to guide our sub-team mission and future development decisions. - -To formulate a single, succinct problem statement, we each began by posting our own takes on the problem. Then, during one of our weekly [30-minute-no-more-no-less stand-up meetings][11], we identified commonalities and differences, ultimately [merging all our ideas into one][12]. Boiled down, we identified that there exist massive barriers for educators, parents, and students to share, modify, and discuss open source and accessible curricula. And of course, our mission would be to break down those barriers with user-centered technology. This "north star" lives as a highly visible document in our Google Drive, which has influenced our feature prioritization and future directions. - -#### **Step 4: Ideating a Solution** - -With our problem defined and our rules of engagement established, we were ready to imagine a solution. - -We believe that effective structures can ensure meritocracy and community. Sometimes, certain personalities dominate team decision-making and leave little space for collaborative input. To avoid that pitfall and maximize our equality of voice, we tend to use "offline" individual brainstorms and merge collective ideas online. It's the same process we used to create our rules of engagement and problem statement. In the case of ideating a solution, we started with "offline" brainstorms of three [S.M.A.R.T. goals][13]. Those goals would be ones we could achieve as a software development team (specifically because the CRD and TT teams offer different skill sets) and address our problem statement. Finally, we wrote these goals in a meeting minutes document, clustering common goals and ultimately identifying themes that describe our application features. In the end, we identified three: support, feedback, and open source curricula. - -From here, we divided ourselves into sub-teams, repeating the goal-setting process with those teams—but in a way that was specific to our features. And if it's not obvious by now, we realized a web-based platform would be the most optimal and scalable solution for supporting students, educators, and parents by providing a hub for sharing and adapting proven curricula. - -To work efficiently, we needed to be adaptive, reinforcing structures that worked and eliminating those that didn't. For example, we put a lot of effort in crafting meeting agendas. We strive to include only those subjects we must discuss in-person and table everything else for offline discussions on Slack or individually organized calls. We practice this in real time, too. During our regular meetings on Google Hangouts, if someone brings up a topic that isn't highly relevant or urgent, the current stand-up lead (a role that rotates weekly) "parking lots" it until the end of the meeting. If we have space at the end, we pull from the parking lot, and if not, we reserve that discussion for a Slack thread. - -This prioritization structure has led to massive gains in meeting efficiency and a focus on progress updates, shared technical hurdle discussions, collective decision-making, and assigning actionable tasks (the next-steps a person has committed to taking, documented with their name attached for everyone to view). - -#### **Step 5: Prototyping** - -This is where the fun starts. - -Our team was only able to unite new people with highly varied experience through the power of open principles and methodologies. - -Given our requirements—like an interactive user experience, the ability to collaborate on blogs and curricula, and the ability to receive feedback from our users—we began identifying the best technologies. Ultimately, we decided to build our web app with a ReactJS frontend and a Ruby on Rails backend. We chose these due to the extensive documentation and active community for both, and the well-maintained libraries that bridge the relationship between the two (e.g., react-on-rails). Since we chose Rails for our backend, it was obvious from the start that we'd work within a Model-View-Controller framework. - -Most of us didn't have previous experience with web development, neither on the frontend nor the backend. So, getting up and running with either technology independently presented a steep learning curve, and gluing the two together only steepened it. To centralize our work, we use an open-access GitHub repository. Given our relatively novice experience in web development, our success hinged on extremely efficient and open collaborations. - -And to explain that, we need to revisit the idea of structures. Some of ours include peer code reviews—where we can exchange best-practices and reusable solutions, maintaining up-to-date tech and user documentation so we can look back and understand design decisions—and (my personal favorite) our questions bot on Slack, which gently reminds us to post and answer questions in a separate Slack #questions channel. - -We've also dabbled with other strategies, like instructional videos for generating basic React components and rendering them in Rails Views. I tried this and in my first video, [I covered a basic introduction to our repository structure][14] and best practices for generating React components. While this proved useful, our team has since realized the wealth of online resources that document various implementations of these technologies robustly. Also, we simply haven't had enough time (but we might revisit them in the future—stay tuned). - -We're also excited about our cloud-based implementation. We use Heroku to host our application and manage data storage. In next iterations, we plan to both expand upon our current features and configure a continuous iteration/continuous development pipeline using services like Jenkins integrated with GitHub. - -#### **Step 6: Testing** - -Since we've [just deployed][1], we are now in a testing stage. Our goals are to collect user feedback across our feature domains and our application experience as a whole, especially as they interact with our specific audiences. Given our original constraints (namely, time and people power), this iteration is the first of many to come. For example, future iterations will allow for individual users to register accounts and post external curricula directly on our site without going through the extra steps of email. We want to scale and maximize our efficiency, and that's part of the recipe we'll deploy in future iterations. As for user testing: We collect user feedback via our contact form, via informal testing within our team, and via structured focus groups. [We welcome your constructive feedback and collaboration][15]. - -Our team was only able to unite new people with highly varied experience through the power of open principles and methodologies. Luckily enough, each one I described in this post is adaptable to virtually every team. - -Regardless of whether you work—on a software development team, in a classroom, or, heck, [even in your family][16]—principles like transparency and community are almost always the best foundation for a successful organization. - - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/2/building-curriculahub - -作者:[Tanner Johnson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/johnsontanner3 -[b]: https://github.com/lujun9972 -[1]: http://csbyus.org -[2]: https://www2.ed.gov/programs/titleiparta/index.html -[3]: https://docs.google.com/document/d/1tqV6B6Uk-QB7Psj1rX9tfCyW3E64_v6xDlhRZ-L2rq0/edit -[4]: https://www.atlassian.com/team-playbook/plays/rules-of-engagement -[5]: https://openpracticelibrary.com/practice/social-contract/ -[6]: https://opensource.com/open-organization/resources/open-org-definition -[7]: https://services.google.com/fh/files/misc/images-of-computer-science-report.pdf -[8]: https://drive.google.com/file/d/1_iK0ZRAXVwGX9owtjUUjNz3_2kbyYZ79/view?usp=sharing -[9]: https://www.pmi.org/learning/library/top-five-causes-scope-creep-6675 -[10]: https://www.codeproject.com/Articles/42354/The-Art-of-Logging#what -[11]: https://opensource.com/open-organization/16/2/6-steps-running-perfect-30-minute-meeting -[12]: https://docs.google.com/document/d/1wdPRvFhMKPCrwOG2CGp7kP4rKOXrJKI77CgjMfaaXnk/edit?usp=sharing -[13]: https://www.projectmanager.com/blog/how-to-create-smart-goals -[14]: https://www.youtube.com/watch?v=52kvV0plW1E -[15]: http://csbyus.org/ -[16]: https://opensource.com/open-organization/15/11/what-our-families-teach-us-about-organizational-life diff --git a/sources/talk/20190220 Do Linux distributions still matter with containers.md b/sources/talk/20190220 Do Linux distributions still matter with containers.md deleted file mode 100644 index c1c7886d0d..0000000000 --- a/sources/talk/20190220 Do Linux distributions still matter with containers.md +++ /dev/null @@ -1,87 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Do Linux distributions still matter with containers?) -[#]: via: (https://opensource.com/article/19/2/linux-distributions-still-matter-containers) -[#]: author: (Scott McCarty https://opensource.com/users/fatherlinux) - -Do Linux distributions still matter with containers? -====== -There are two major trends in container builds: using a base image and building from scratch. Each has engineering tradeoffs. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cube_innovation_process_block_container.png?itok=vkPYmSRQ) - -Some people say Linux distributions no longer matter with containers. Alternative approaches, like distroless and scratch containers, seem to be all the rage. It appears we are considering and making technology decisions based more on fashion sense and immediate emotional gratification than thinking through the secondary effects of our choices. We should be asking questions like: How will these choices affect maintenance six months down the road? What are the engineering tradeoffs? How does this paradigm shift affect our build systems at scale? - -It's frustrating to watch. If we forget that engineering is a zero-sum game with measurable tradeoffs—advantages and disadvantages, with costs and benefits of different approaches— we do ourselves a disservice, we do our employers a disservice, and we do our colleagues who will eventually maintain our code a disservice. Finally, we do all of the maintainers ([hail the maintainers!][1]) a disservice by not appreciating the work they do. - -### Understanding the problem - -To understand the problem, we have to investigate why we started using Linux distributions in the first place. I would group the reasons into two major buckets: kernels and other packages. Compiling kernels is actually fairly easy. Slackware and Gentoo (I still have a soft spot in my heart) taught us that. - -On the other hand, the tremendous amount of development and runtime software that needs to be packaged for a usable Linux system can be daunting. Furthermore, the only way you can ensure that millions of permutations of packages can be installed and work together is by using the old paradigm: compile it and ship it together as a thing (i.e., a Linux distribution). So, why do Linux distributions compile kernels and all the packages together? Simple: to make sure things work together. - -First, let's talk about kernels. The kernel is special. Booting a Linux system without a compiled kernel is a bit of a challenge. It's the core of a Linux operating system, and it's the first thing we rely on when a system boots. Kernels have a lot of different configuration options when they're being compiled that can have a tremendous effect on how hardware and software run on one. A secondary problem in this bucket is that system software, like compilers, C libraries, and interpreters, must be tuned for the options you built into the kernel. Gentoo taught us this in a visceral way, which turned everyone into a miniature distribution maintainer. - -Embarrassingly (because I have worked with containers for the last five years), I must admit that I have compiled kernels quite recently. I had to get nested KVM working on RHEL 7 so that I could run [OpenShift on OpenStack][2] virtual machines, in a KVM virtual machine on my laptop, as well as [our Container Development Kit (CDK][3]). #justsayin Suffice to say, I fired RHEL7 up on a brand new 4.X kernel at the time. Like any good sysadmin, I was a little worried that I missed some important configuration options and patches. And, of course, I had missed some things. Sleep mode stopped working right, my docking station stopped working right, and there were numerous other small, random errors. But it did work well enough for a live demo of OpenShift on OpenStack, in a single KVM virtual machine on my laptop. Come on, that's kinda' fun, right? But I digress… - -Now, let's talk about all the other packages. While the kernel and associated system software can be tricky to compile, the much, much bigger problem from a workload perspective is compiling thousands and thousands of packages to give us a useable Linux system. Each package requires subject matter expertise. Some pieces of software require running only three commands: **./configure** , **make** , and **make install**. Others require a lot of subject matter expertise ranging from adding users and configuring specific defaults in **etc** to running post-install scripts and adding systemd unit files. The set of skills necessary for the thousands of different pieces of software you might use is daunting for any single person. But, if you want a usable system with the ability to try new software whenever you want, you have to learn how to compile and install the new software before you can even begin to learn to use it. That's Linux without a Linux distribution. That's the engineering problem you are agreeing to when you forgo a Linux distribution. - -The point is that you have to build everything together to ensure it works together with any sane level of reliability, and it takes a ton of knowledge to build a usable cohort of packages. This is more knowledge than any single developer or sysadmin is ever going to reasonably learn and retain. Every problem I described applies to your [container host][4] (kernel and system software) and [container image][5] (system software and all other packages)—notice the overlap; there are compilers, C libraries, interpreters, and JVMs in the container image, too. - -### The solution - -You already know this, but Linux distributions are the solution. Stop reading and send your nearest package maintainer (again, hail the maintainers!) an e-card (wait, did I just give my age away?). Seriously though, these people do a ton of work, and it's really underappreciated. Kubernetes, Istio, Prometheus, and Knative: I am looking at you. Your time is coming too, when you will be in maintenance mode, overused, and underappreciated. I will be writing this same article again, probably about Kubernetes, in about seven to 10 years. - -### First principles with container builds - -There are tradeoffs to building from scratch and building from base images. - -#### Building from base images - -Building from base images has the advantage that most build operations are nothing more than a package install or update. It relies on a ton of work done by package maintainers in a Linux distribution. It also has the advantage that a patching event six months—or even 10 years—from now (with RHEL) is an operations/systems administrator event (yum update), not a developer event (that requires picking through code to figure out why some function argument no longer works). - -Let's double-click on that a bit. Application code relies on a lot of libraries ranging from JSON munging libraries to object-relational mappers. Unlike the Linux kernel and Glibc, these types of libraries change with very little regard to breaking API compatibility. That means that three years from now your patching event likely becomes a code-changing event, not a yum update event. Got it, let that sink in. Developers, you are getting paged at 2 AM if the security team can't find a firewall hack to block the exploit. - -Building from a base image is not perfect; there are disadvantages, like the size of all the dependencies that get dragged in. This will almost always make your container images larger than building from scratch. Another disadvantage is you will not always have access to the latest upstream code. This can be frustrating for developers, especially when you just want to get something out the door, but not as frustrating as being paged to look at a library you haven't thought about in three years that the upstream maintainers have been changing the whole time. - -If you are a web developer and rolling your eyes at me, I have one word for you: DevOps. That means you are carrying a pager, my friend. - -#### Building from scratch - -Scratch builds have the advantage of being really small. When you don't rely on a Linux distribution in the container, you have a lot of control, which means you can customize everything for your needs. This is a best-of-breed model, and it's valid in certain use cases. Another advantage is you have access to the latest packages. You don't have to wait for a Linux distro to update anything. You are in control, so you choose when to spend the engineering work to incorporate new software. - -Remember, there is a cost to controlling everything. Often, updating to new libraries with new features drags in unwanted API changes, which means fixing incompatibilities in code (in other words, [shaving yaks][6]). Shaving yaks at 2 AM when the application doesn't work is not fun. Luckily, with containers, you can roll back and shave the yaks the next business day, but it will still eat into your time for delivering new value to the business, new features to your applications. Welcome to the life of a sysadmin. - -OK, that said, there are times that building from scratch makes sense. I will completely concede that statically compiled Golang programs and C programs are two decent candidates for scratch/distroless builds. With these types of programs, every container build is a compile event. You still have to worry about API breakage three years from now, but if you are a Golang shop, you should have the skillset to fix things over time. - -### Conclusion - -Basically, Linux distributions do a ton of work to save you time—on a regular Linux system or with containers. The knowledge that maintainers have is tremendous and leveraged so much without really being appreciated. The adoption of containers has made the problem even worse because it's even further abstracted. - -With container hosts, a Linux distribution offers you access to a wide hardware ecosystem, ranging from tiny ARM systems, to giant 128 CPU x86 boxes, to cloud-provider VMs. They offer working container engines and container runtimes out of the box, so you can just fire up your containers and let somebody else worry about making things work. - -For container images, Linux distributions offer you easy access to a ton of software for your projects. Even when you build from scratch, you will likely look at how a package maintainer built and shipped things—a good artist is a good thief—so, don't undervalue this work. - -So, thank you to all of the maintainers in Fedora, RHEL (Frantisek, you are my hero), Debian, Gentoo, and every other Linux distribution. I appreciate the work you do, even though I am a "container guy." - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/linux-distributions-still-matter-containers - -作者:[Scott McCarty][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/fatherlinux -[b]: https://github.com/lujun9972 -[1]: https://aeon.co/essays/innovation-is-overvalued-maintenance-often-matters-more -[2]: https://blog.openshift.com/openshift-on-openstack-delivering-applications-better-together/ -[3]: https://developers.redhat.com/blog/2018/02/13/red-hat-cdk-nested-kvm/ -[4]: https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.8tyd9p17othl -[5]: https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.dqlu6589ootw -[6]: https://en.wiktionary.org/wiki/yak_shaving diff --git a/sources/talk/20190222 Developer happiness- What you need to know.md b/sources/talk/20190222 Developer happiness- What you need to know.md deleted file mode 100644 index 8ef7772193..0000000000 --- a/sources/talk/20190222 Developer happiness- What you need to know.md +++ /dev/null @@ -1,79 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: 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) - -Developer happiness: What you need to know -====== -Developers need the tools and the freedom to code quickly, without getting bogged down by compliance and security. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_happy_sad_developer_programming.png?itok=72nkfSQ_) - -A person needs the right tools for the job. There's nothing as frustrating as getting halfway through a car repair, for instance, only to discover you don't have the specialized tool you need to complete the job. The same concept applies to developers: you need the tools to do what you are best at, without disrupting your workflow with compliance and security needs, so you can produce code faster. - -Over half—51%, to be specific—of developers spend only one to four hours each day programming, according to ActiveState's recent [Developer Survey 2018: Open Source Runtime Pains][1]. In other words, the majority of developers spend less than half of their time coding. According to the survey, 50% of developers say security is one of their biggest concerns, but 67% of developers choose not to add a new language when coding because of the difficulties related to corporate policies. - -The result is developers have to devote time to non-coding activities like retrofitting software for security and compliance criteria checked after software and languages have been built. And they won't choose the best tool or language for the job because of corporate policies. Their satisfaction goes down and risk goes up. - -So, developers aren't able to devote time to high-value work. This creates additional business risk because their time-to-market is slowed, and the organization increases tech debt by not empowering developers to decide on "the best" tech, unencumbered by corporate policy drag. - -### Baking in security and compliance workflows - -How can we solve this issue? One way is to integrate security and compliance workflows into the software development process in four easy steps: - -#### 1\. Gather your forces - -Get support from everyone involved. This is an often-forgotten but critical first step. Make sure to consider a wide range of stakeholders, including: - - * DevOps - * Developers - * InfoSec - * Legal/compliance - * IT security - - - -Stakeholders want to understand the business benefits, so make a solid case for eliminating the security and compliance checkpoints after software builds. You can consider any (or all) of the following in building your business case: time savings, opportunity cost, and developer productivity. By integrating security and compliance workflows into the development process, you also avoid retrofitting of languages. - -#### 2\. Find trustworthy sources - -Next, choose the trusted sources that can be used, along with their license and security requirements. Consider including information such as: - - * Restrictions on usage based on environment or application type and version controls per language - * Which open source components are allowable, e.g., specific packages - * Which licenses can be used in which types of environments (e.g., research vs. production) - * The definition of security levels, acceptable vulnerability risk levels, what risk levels trigger an action, what that action would be, and who would be responsible for its implementation - - - -#### 3\. Incorporate security and compliance from day one - -The upshot of incorporating security and compliance workflows is that it ultimately bakes security and compliance into the first line of code. It eliminates the drag of corporate policy because you're coding to spec versus having to fix things after the fact. But to do this, consider mechanisms for automatically scanning code as it's being built, along with using agentless monitoring of your runtime code. You're freeing up your time, and you'll also be able to programmatically enforce policies to ensure compliance across your entire organization. - -New vulnerabilities arise, and new patches and versions become available. Consequently, security and compliance need to be considered when deploying code into production and also when running code. You need to know what, if any, code is at risk and where that code is running. So, the process for deploying and running code should include monitoring, reporting, and updating code in production. - -By integrating security and compliance into your software development process from the start, you can also benefit by tracking where your code is running once deployed and be alerted of new threats as they arise. You will be able to track when your applications were vulnerable and respond with automatic enforcement of your software policies. - -If your software development process has security and compliance workflows baked in, you will improve your productivity. And you'll be able to measure value through increased time spent coding; gains in security and stability; and cost- and time-savings in maintenance and discovery of security and compliance threats. - -### Happiness through integration - -If you don't develop and update software, your organization can't go forward. Developers are a linchpin in the success of your company, which means they need the tools and the freedom to code quickly. You can't let compliance and security needs—though they are critical—bog you down. Developers clearly worry about security, so the happy medium is to "shift left" and integrate security and compliance workflows from the start. You'll get more done, get it right the first time, and spend far less time retrofitting code. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/developer-happiness - -作者:[Bart Copeland][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/ diff --git a/sources/talk/20190225 Teaching scientists how to share code.md b/sources/talk/20190225 Teaching scientists how to share code.md deleted file mode 100644 index 074da27476..0000000000 --- a/sources/talk/20190225 Teaching scientists how to share code.md +++ /dev/null @@ -1,72 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Teaching scientists how to share code) -[#]: via: (https://opensource.com/article/19/2/open-science-git) -[#]: author: (Jon Tennant https://opensource.com/users/jon-tennant) - -Teaching scientists how to share code -====== -This course teaches them how to set up a GitHub project, index their project in Zenodo, and integrate Git into an RStudio workflow. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolserieshe_rh_051x_0.png?itok=gIzbmxuI) - -Would it surprise you to learn that most of the world's scholarly research is not owned by the people who funded it or who created it? Rather it's owned by private corporations and locked up in proprietary systems, leading to [problems][1] around sharing, reuse, and reproducibility. - -The open science movement is challenging this system, aiming to give researchers control, ownership, and freedom over their work. The [Open Science MOOC][2] (massively open online community) is a mission-driven project launched in 2018 to kick-start an open scientific revolution and foster more partnerships between open source software and open science. - -The Open Science MOOC is a peer-to-peer community of practice, based around sharing knowledge and ideas, learning new skills, and using these things to develop as individuals so research communities can grow as part of a wider cultural shift towards openness. - -### The curriculum - -The Open Science MOOC is divided into 10 core modules, from the principles of open science to becoming an open science advocate. - -The first module, [Open Research Software and Open Source][3], was released in late 2018. It includes three main tasks, all designed to help make research workflows more efficient and more open for collaboration: - -#### 1\. Setting up your first GitHub project - -GitHub is a powerful project management tool, both for coders and non-coders. This task teaches how to create a community around the platform, select an appropriate license, and write good documentation (including README files, contributing guidelines, and codes of conduct) to foster open collaboration and a welcoming community. - -#### 2\. Indexing your project in Zenodo - -[Zenodo][4] is an open science platform that seamlessly integrates with GitHub to help make projects more permanent, reusable, and citable. This task explains how webhooks between Zenodo and GitHub allow new versions of projects to become permanently archived as they progress. This is critical for helping researchers get a [DOI][5] for their work so they can receive full credit for all aspects of a project. As citations are still a primary form of "academic capital," this is essential for researchers. - -#### 3\. Integrating Git into an RStudio workflow - -This task is about giving research a mega-boost through greater collaborative efficiency and reproducibility. Git enables version control in all forms of text-based content, including data analysis and writing papers. Each time you save your work during the development process, Git saves time-stamped copies. This saves the hassle of trying to "roll back" projects if you delete a file or text by mistake, and eliminates horrific file-naming conventions. (For example, does FINAL_Revised_2.2_supervisor_edits_ver1.7_scream.txt look familiar?) Getting Git to interface with RStudio is the painful part, but this task goes through it, step by step, to ease the stress. - -The third task also gives students the ability to interact directly with the MOOC by submitting pull requests to demonstrate their skills. This also adds their name to an online list of open source champions (aka "open sourcerers"). - -The MOOC's inherently interactive style is much more valuable than listening to someone talk at you, either on or off screen, like with many traditional online courses or educational programs. Each task is backed up by expert-gathered knowledge, so students get a rigorous, dual-learning experience. - -### Empowering researchers - -The Open Science MOOC strives to be as open as possible—this means we walk the walk and talk the talk. We are built upon a solid values-based foundation of freedom and equitable access to research. We see this route towards widespread adoption of best scientific practices as an essential part of the research process. - -Everything we produce is openly developed and openly licensed for maximum engagement, sharing, and reuse. An open source workflow underpins our development. All of this happens openly around channels such as [Slack][6] and [GitHub][7] and helps to make the community much more coherent. - -If we can instill the value of open source into modern research, this would empower current and future generations of researchers to think more about fundamental freedoms around knowledge production. We think that is something worth working towards as a community. - -The Open Science MOOC combines the best elements of the open education, open science, and open source worlds. If you're ready to join, [sign up for the full course][3], which is, of course, free. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/open-science-git - -作者:[Jon Tennant][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jon-tennant -[b]: https://github.com/lujun9972 -[1]: https://www.theguardian.com/science/political-science/2018/jun/29/elsevier-are-corrupting-open-science-in-europe -[2]: https://opensciencemooc.eu/ -[3]: https://eliademy.com/catalog/oer/module-5-open-research-software-and-open-source.html -[4]: https://zenodo.org/ -[5]: https://en.wikipedia.org/wiki/Digital_object_identifier -[6]: https://osmooc.herokuapp.com/ -[7]: https://open-science-mooc-invite.herokuapp.com/ diff --git a/sources/talk/20190226 Reducing security risks with centralized logging.md b/sources/talk/20190226 Reducing security risks with centralized logging.md deleted file mode 100644 index 60bbd7a80b..0000000000 --- a/sources/talk/20190226 Reducing security risks with centralized logging.md +++ /dev/null @@ -1,82 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Reducing security risks with centralized logging) -[#]: via: (https://opensource.com/article/19/2/reducing-security-risks-centralized-logging) -[#]: author: (Hannah Suarez https://opensource.com/users/hcs) - -Reducing security risks with centralized logging -====== -Centralizing logs and structuring log data for processing can mitigate risks related to insufficient logging. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_privacy_lock.png?itok=ZWjrpFzx) - -Logging and log analysis are essential to securing infrastructure, particularly when we consider common vulnerabilities. This article, based on my lightning talk [Let's use centralized log collection to make incident response teams happy][1] at FOSDEM'19, aims to raise awareness about the security concerns around insufficient logging, offer a way to avoid the risk, and advocate for more secure practices _(disclaimer: I work for NXLog)._ - -### Why log collection and why centralized logging? - -Logging is, to be specific, an append-only sequence of records written to disk. In practice, logs help you investigate an infrastructure issue as you try to find a cause for misbehavior. A challenge comes up when you have heterogeneous systems with their own standards and formats, and you want to be able to handle and process these in a dependable way. This often comes at the cost of metadata. Centralized logging solutions require commonality, and that commonality often removes the rich metadata many open source logging tools provide. - -### The security risk of insufficient logging and monitoring - -The Open Web Application Security Project ([OWASP][2]) is a nonprofit organization that contributes to the industry with incredible projects (including many [tools][3] focusing on software security). The organization regularly reports on the riskiest security challenges for application developers and maintainers. In its most recent report on the [top 10 most critical web application security risks][4], OWASP added Insufficient Logging and Monitoring to its list. OWASP warns of risks due to insufficient logging, detection, monitoring, and active response in the following types of scenarios. - - * Important auditable events, such as logins, failed logins, and high-value transactions are not logged. - * Warnings and errors generate none, inadequate, or unclear log messages. - * Logs are only being stored locally. - * The application is unable to detect, escalate, or alert for active attacks in real time or near real time. - - - -These instances can be mitigated by centralizing logs (i.e., not storing logs locally) and structuring log data for processing (i.e., in alerting dashboards and security suites). - -For example, imagine a DNS query leads to a malicious site named **hacked.badsite.net**. With DNS monitoring, administrators monitor and proactively analyze DNS queries and responses. The efficiency of DNS monitoring relies on both sufficient logging and log collection in order to catch potential issues as well as structuring the resulting DNS log for further processing: - -``` -2019-01-29 -Time (GMT)      Source                  Destination             Protocol-Info -12:42:42.112898 SOURCE_IP               xxx.xx.xx.x             DNS     Standard query 0x1de7  A hacked.badsite.net -``` - -You can try this yourself and run through other examples and snippets with the [NXLog Community Edition][5] _(disclaimer again: I work for NXLog)._ - -### Important aside: unstructured vs. structured data - -It's important to take a moment and consider the log data format. For example, let's consider this log message: - -``` -debug1: Failed password for invalid user amy from SOURCE_IP port SOURCE_PORT ssh2 -``` - -This log contains a predefined structure, such as a metadata keyword before the colon ( **debug1** ). However, the rest of the log field is an unstructured string ( **Failed password for invalid user amy from SOURCE_IP port SOURCE_PORT ssh2** ). So, while the message is easily available in a human-readable format, it is not a format a computer can easily parse. - -Unstructured event data poses limitations including difficulty of parsing, searching, and analyzing the logs. The important metadata is too often set in an unstructured data field in the form of a freeform string like the example above. Logging administrators will come across this problem at some point as they attempt to standardize/normalize log data and centralize their log sources. - -### Where to go next - -Alongside centralizing and structuring your logs, make sure you're collecting the right log data—Sysmon, PowerShell, Windows EventLog, DNS debug, NetFlow, ETW, kernel monitoring, file integrity monitoring, database logs, external cloud logs, and so on. Also have the right tools and processes in place to collect, aggregate, and help make sense of the data. - -Hopefully, this gives you a starting point to centralize log collection across diverse sources; send them to outside sources like dashboards, monitoring software, analytics software, specialized software like security information and event management (SEIM) suites; and more. - -What does your centralized logging strategy look like? Share your thoughts in the comments. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/reducing-security-risks-centralized-logging - -作者:[Hannah Suarez][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/hcs -[b]: https://github.com/lujun9972 -[1]: https://fosdem.org/2019/schedule/event/lets_use_centralized_log_collection_to_make_incident_response_teams_happy/ -[2]: https://www.owasp.org/index.php/Main_Page -[3]: https://github.com/OWASP -[4]: https://www.owasp.org/index.php/Top_10-2017_Top_10 -[5]: https://nxlog.co/products/nxlog-community-edition/download diff --git a/sources/talk/20190301 What-s happening in the OpenStack community.md b/sources/talk/20190301 What-s happening in the OpenStack community.md deleted file mode 100644 index 28e3bf2fd3..0000000000 --- a/sources/talk/20190301 What-s happening in the OpenStack community.md +++ /dev/null @@ -1,73 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What's happening in the OpenStack community?) -[#]: via: (https://opensource.com/article/19/3/whats-happening-openstack) -[#]: author: (Jonathan Bryce https://opensource.com/users/jonathan-bryce) - -What's happening in the OpenStack community? -====== - -In many ways, 2018 was a transformative year for the OpenStack Foundation. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/travel-mountain-cloud.png?itok=ZKsJD_vb) - -Since 2010, the OpenStack community has been building open source software to run cloud computing infrastructure. Initially, the focus was public and private clouds, but open infrastructure has been pulled into many new important use cases like telecoms, 5G, and manufacturing IoT. - -As OpenStack software matured and grew in scope to support new technologies like bare metal provisioning and container infrastructure, the community widened its thinking to embrace users who deploy and run the software in addition to the developers who build the software. Questions like, "What problems are users trying to solve?" "Which technologies are users trying to integrate?" and "What are the gaps?" began to drive the community's thinking and decision making. - -In response to those questions, the OSF reorganized its approach and created a new "open infrastructure" framework focused on use cases, including edge, container infrastructure, CI/CD, and private and hybrid cloud. And, for the first time, the OSF is hosting open source projects outside of the OpenStack project. - -Following are three highlights from the [OSF 2018 Annual Report][1]; I encourage you to read the entire report for more detailed information about what's new. - -### Pilot projects - -On the heels of launching [Kata Containers][2] in December 2017, the OSF launched three pilot projects in 2018—[Zuul][3], [StarlingX][4], and [Airship][5]—that help further our goals of taking our technology into additional relevant markets. Each project follows the tenets we consider key to the success of true open source, [the Four Opens][6]: open design, open collaboration, open development, and open source. While these efforts are still new, they have been extremely valuable in helping us learn how we should expand the scope of the OSF, as well as showing others the kind of approach we will take. - -While the OpenStack project remained at the core of the team's focus, pilot projects are helping expand usage of open infrastructure across markets and already benefiting the OpenStack community. This has attracted dozens of new developers to the open infrastructure community, which will ultimately benefit the OpenStack community and users. - -There is direct benefit from these contributors working upstream in OpenStack, such as through StarlingX, as well as indirect benefit from the relationships we've built with the Kubernetes community through the Kata Containers project. Airship is similarly bridging the gaps between the Kubernetes and OpenStack ecosystems. This shows users how the technologies work together. A rise in contributions to Zuul has provided the engine for OpenStack CI and keeps our development running smoothly. - -### Containers collaboration - -In addition to investing in new pilot projects, we continued efforts to work with key adjacent projects in 2018, and we made particularly good progress with Kubernetes. OSF staffer Chris Hoge helps lead the cloud provider special interest group, where he has helped standardize how Kubernetes deployments expect to run on top of various infrastructure. This has clarified OpenStack's place in the Kubernetes ecosystem and led to valuable integration points, like having OpenStack as part of the Kubernetes release testing process. - -Additionally, OpenStack Magnum was certified as a Kubernetes installer by the CNCF. Through the Kata Containers community, we have deepened these relationships into additional areas within the container ecosystem resulting in a number of companies getting involved for the first time. - -### Evolving events - -We knew heading into 2018 that the environment around our events was changing and we needed to respond. During the year, we held two successful project team gatherings (PTGs) in Dublin and Denver, reaching capacity for both events while also including new projects and OpenStack operators. We held OpenStack Summits in Vancouver and Berlin, both experiencing increases in attendance and project diversity since Sydney in 2017, with each Summit including more than 30 open source projects. Recognizing this broader audience and the OSF's evolving strategy, the OpenStack Summit was renamed the [Open Infrastructure Summit][7], beginning with the Denver event coming up in April. - -In 2018, we boosted investment in China, onboarding a China Community Manager based in Shanghai and hosting a strategy day in Beijing with 30+ attendees from Gold and Platinum Members in China. This effort will continue in 2019 as we host our first Summit in China: the [Open Infrastructure Summit Shanghai][8] in November. - -We also worked with the community in 2018 to define a new model for events to maximize participation while saving on travel and expenses for the individuals and companies who are increasingly stretched across multiple open source communities. We arrived at a plan that we will implement and iterate on in 2019 where we will collocate PTGs as standalone events adjacent to our Open Infrastructure Summits. - -### Looking ahead - -We've seen impressive progress, but the biggest accomplishment might be in establishing a framework for the future of the foundation itself. In 2018, we advanced the open infrastructure mission by establishing OSF as an effective place to collaborate for CI/CD, container infrastructure, and edge computing, in addition to the traditional public and private cloud use cases. The open infrastructure approach opened a lot of doors in 2018, from the initial release of software from each pilot project, to live 5G demos, to engagement with hyperscale public cloud providers. - -Ultimately, our value comes from the effectiveness of our communities and the software they produce. As 2019 unfolds, our community is excited to apply learnings from 2018 to the benefit of developers, users, and the commercial ecosystem across all our projects. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/whats-happening-openstack - -作者:[Jonathan Bryce][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jonathan-bryce -[b]: https://github.com/lujun9972 -[1]: https://www.openstack.org/foundation/2018-openstack-foundation-annual-report -[2]: https://katacontainers.io/ -[3]: https://zuul-ci.org/ -[4]: https://www.starlingx.io/ -[5]: https://www.airshipit.org/ -[6]: https://www.openstack.org/four-opens/ -[7]: https://www.openstack.org/summit/denver-2019/ -[8]: https://www.openstack.org/summit/shanghai-2019 diff --git a/sources/talk/20190306 How to pack an IT travel kit.md b/sources/talk/20190306 How to pack an IT travel kit.md deleted file mode 100644 index b05ee460b7..0000000000 --- a/sources/talk/20190306 How to pack an IT travel kit.md +++ /dev/null @@ -1,100 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to pack an IT travel kit) -[#]: via: (https://opensource.com/article/19/3/it-toolkit-remote) -[#]: author: (Peter Cheer https://opensource.com/users/petercheer) - -How to pack an IT travel kit -====== -Before you travel, make sure you're ready for challenges in hardware, infrastructure, and software. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_sysadmin_cloud.png?itok=sUciG0Cn) - -I've had several opportunities to do IT work in less-developed and remote areas, where internet coverage and technology access aren't at the high level we have in our first-world cities. Many people heading off to undeveloped areas ask me for advice on preparing for the local technology landscape. Since conditions vary greatly around this big world, it's impossible to give specific advice for most areas, but I do have some general suggestions based on my experience that may help you. - -Also, before you leave home, do as much research as you can about the general IT and telecom environment where you are traveling so you're a little better prepared for what you may encounter there. - -### Planning for the local hardware and infrastructure - - * Even in many cities, internet connections tend to be expensive, slow, and not reliable for large downloads. Don't forget that internet coverage, speeds, and cost in cities are unlikely to be matched in more remote areas. - - - * The electricity supply may be unreliable with inconsistent voltage. If you are taking your computer, bring some surge protection—although in my experience, the electricity voltage is more likely to drop than to spike. - - - * It is always useful to have a small selection of hand tools, such as screwdrivers and needle-nose pliers, for repairing computer hardware. A lack of spare parts can limit opportunities for much beyond basic troubleshooting, although stripping usable components from dead computers can be worthwhile. - - - -### Planning for the software you'll find - - * You can assume that most of the computer systems you'll find will be some incarnation of Microsoft Windows. You can expect that many will not be officially licensed, not be getting updates nor security patches, and are infected by multiple viruses and other malware. - - - * You can also expect that most application software will be proprietary and much of it will be unlicensed and lag behind the latest release versions. These conditions are depressing for open source enthusiasts, but this is the world as it is, rather than the world we would like it to be. - - - * It is wise to view any Windows system you do not control as potentially infected with viruses and malware. It's good practice to reserve a USB thumb drive for files you'll use with these Windows systems; this means that if (or more likely when) that thumb drive becomes infected, you can just reformat it at no cost. - - - * Bring copies of free antivirus software such as [AVG][1] and [Avast][2], including recent virus definition files for them, as well as virus removal and repair tools such as [Sophos][3] and [Hirens Boot CD][4]. - - - * Trying to keep software current on machines that have no or infrequent access to the internet is a challenge. This is particularly true with web browsers, which tend to go through rapid release cycles. My preferred web browser is Mozilla Firefox and having a copy of the latest release is useful. - - - * Bring repair discs for a selection of recent Microsoft operating systems, and make sure that includes service packs for Windows and Microsoft Office. - - - -### Planning for the software you'll bring - -There's no better way to convey the advantages of open source software than by showing it to people. Here are some recommendations along that line. - - * When gathering software to take with you, make sure you get the full offline installation option. Often, the most prominently displayed download links on websites are stubs that require internet access to download the components. They won't work if you're in an area with poor (or no) internet service. - - - * Also, make sure to get the 32-bit and 64-bit versions of the software. While 32-bit machines are becoming less common, you may encounter them and it's best to be prepared. - - - * Having a [bootable version of Linux][5] is vital for two reasons. First, it can be used to rescue data from a seriously damaged Windows machine. Second, it's an easy way to show off Linux without installing it on someone's machine. [Linux Mint][6] is my favorite distro for this purpose, because the graphical interface (GUI) is similar enough to Windows to appear non-threatening and it includes a good range of application software. - - - * Bring the widest selection of open source applications you can—you can't count on being able to download something from the internet. - - - * When possible, bring your open source software library as portable applications that will run without installing them. One of the many ways to mess up those Windows machines is to install and uninstall a lot of software, and using portable apps gets around this problem. Many open source applications, including Libre Office, GIMP, Blender, and Inkscape, have portable app versions for Windows. - - - * It's smart to bring a supply of blank disks so you can give away copies of your open source software stash on media that is a bit more secure than a USB thumb drive. - - - * Don't forget to bring programs and resources related to projects you will be working on. (For example, most of my overseas work involves tuition, mentoring, and skills transfer, so I usually add a selection of open source software tools for creating learning resources.) - - - -### Your turn - -There are many variables and surprises when doing IT work in undeveloped areas. If you have suggestions—for programs I've missed or tips that I didn't cover—please share them in the comments. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/it-toolkit-remote - -作者:[Peter Cheer][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/petercheer -[b]: https://github.com/lujun9972 -[1]: https://www.avg.com/en-gb/free-antivirus-download -[2]: https://www.avast.com/en-gb/free-antivirus-download -[3]: https://www.sophos.com/en-us/products/free-tools/virus-removal-tool.aspx -[4]: https://www.hiren.info/ -[5]: https://opensource.com/article/18/7/getting-started-etcherio -[6]: https://linuxmint.com/ diff --git a/sources/talk/20190307 Small Scale Scrum vs. Large Scale Scrum.md b/sources/talk/20190307 Small Scale Scrum vs. Large Scale Scrum.md deleted file mode 100644 index 7da83306a5..0000000000 --- a/sources/talk/20190307 Small Scale Scrum vs. Large Scale Scrum.md +++ /dev/null @@ -1,106 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Small Scale Scrum vs. Large Scale Scrum) -[#]: via: (https://opensource.com/article/19/3/small-scale-scrum-vs-large-scale-scrum) -[#]: author: (Agnieszka Gancarczyk https://opensource.com/users/agagancarczyk) - -Small Scale Scrum vs. Large Scale Scrum -====== -We surveyed individual members of small and large scrum teams. Here are some key findings. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_crowdvsopen.png?itok=AFjno_8v) - -Following the publication of the [Small Scale Scrum framework][1], we wanted to collect feedback on how teams in our target demographic (consultants, open source developers, and students) work and what they value. With this first opportunity to inspect, adapt, and help shape the next stage of Small Scale Scrum, we decided to create a survey to capture some data points and begin to validate some of our assumptions and hypotheses. - -**[[Download the Introduction to Small Scale Scrum guide]][2]** - -Our reasons for using the survey were multifold, but chief among them were the global distribution of teams, the small local data sample available in our office, access to customers, and the industry’s utilization of surveys (e.g., the [Stack Overflow Developer Survey 2018][3], [HackerRank 2018 Developer Skills Report][4], and [GitLab 2018 Global Developer Report][5]). - -The scrum’s iterative process was used to facilitate the creation of the survey shown below: - -![](https://opensource.com/sites/default/files/uploads/survey_process.png) - -[The survey][6], which we invite you to complete, consisted of 59 questions and was distributed at a local college ([Waterford Institute of Technology][7]) and to Red Hat's consultancy and engineering teams. Our initial data was gathered from the responses of 54 individuals spread across small and large scrum teams, who were asked about their experiences with agile within their teams. - -Here are the main results and initial findings of the survey: - - * A full 96% of survey participants practice a form of agile, work in distributed teams, think scrum principles help them reduce development complexity, and believe agile contributes to the success of their projects. - - * Only 8% of survey participants belong to small (one- to three-person) teams, and 10 out of 51 describe their typical project as short-lived (three months or less). - - * The majority of survey participants were software engineers, but quality engineers (QE), project managers (PM), product owners (PO), and scrum masters were also represented. - - * Scrum master, PO, and team member are typical roles in projects. - - * Nearly half of survey respondents work on, or are assigned to, more than one project at the same time. - - * Almost half of projects are customer/value-generating vs. improvement/not directly value-generating or unclassified. - - * Almost half of survey participants said that their work is clarified sometimes or most of the time and estimated before development with extensions available sometimes or most of the time. They said asking for clarification of work items is the team’s responsibility. - - * Almost half of survey respondents said they write tests for their code, and they adhere to best coding practices, document their code, and get their code reviewed before merging. - - * Almost all survey participants introduce bugs to the codebase, which are prioritized by them, the team, PM, PO, team lead, or the scrum master. - - * Participants ask for help and mentoring when a task is complex. They also take on additional roles on their projects when needed, including business analyst, PM, QE, and architect, and they sometimes find changing roles difficult. - - * When changing roles on a daily basis, individuals feel they lose one to two hours on average, but they still complete their work on time most of the time. - - * Most survey participants use scrum (65%), followed by hybrid (18%) and Kanban (12%). This is consistent with results of [VersionOne’s State of Agile Report][8]. - - * The daily standup, sprint, sprint planning and estimating, backlog grooming, and sprint retrospective are among the top scrum ceremonies and principles followed, and team members do preparation work before meetings. - - * The majority of sprints (62%) are three weeks long, followed by two-week sprints (26%), one-week sprints (6%), and four-week sprints (4%). Two percent of participants are not using sprints due to strict release and update timings, with all activities organized and planned around those dates. - - * Teams use [planning poker][9] to estimate (storypoint) user stories. User stories contain acceptance criteria. - - * Teams create and use a [Definition of Done][10] mainly in respect to features and determining completion of user stories. - - * The majority of teams don’t have or use a [Definition of Ready][11] to ensure that user stories are actionable, testable, and clear. - - * Unit, integration, functional, automated, performance/load, and acceptance tests are commonly used. - - * Overall collaboration between team members is considered high, and team members use various communication channels. - - * The majority of survey participants spend more than four hours weekly in meetings, including face-to-face meetings, web conferences, and email communication. - - * The majority of customers are considered large, and half of them understand and follow scrum principles. - - * Customers respect “no deadlines” most of the time and sometimes help create user stories and participate in sprint planning, sprint review and demonstration, sprint retrospective, and backlog review and refinement. - - * Only 27% of survey participants know their customers have a high level of satisfaction with the adoption of agile, while the majority (58%) don’t know this information at all. - - - - -These survey results will inform the next stage of our data-gathering exercise. We will apply Small Scale Scrum to real-world projects, and the guidance obtained from the survey will help us gather key data points as we move toward version 2.0 of Small Scale Scrum. If you want to help, take our [survey][6]. If you have a project to which you'd like to apply Small Scale Scrum, please get in touch. - -[Download the Introduction to Small Scale Scrum guide][2] - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/small-scale-scrum-vs-large-scale-scrum - -作者:[Agnieszka Gancarczyk][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/agagancarczyk -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/article/19/2/small-scale-scrum-framework -[2]: https://opensource.com/downloads/small-scale-scrum -[3]: https://insights.stackoverflow.com/survey/2018/ -[4]: https://research.hackerrank.com/developer-skills/2018/ -[5]: https://about.gitlab.com/developer-survey/2018/ -[6]: https://docs.google.com/forms/d/e/1FAIpQLScAXf52KMEiEzS68OOIsjLtwZJto_XT7A3b9aB0RhasnE_dEw/viewform?c=0&w=1 -[7]: https://www.wit.ie/ -[8]: https://explore.versionone.com/state-of-agile/versionone-12th-annual-state-of-agile-report -[9]: https://en.wikipedia.org/wiki/Planning_poker -[10]: https://www.scruminc.com/definition-of-done/ -[11]: https://www.scruminc.com/definition-of-ready/ diff --git a/sources/talk/20190312 When the web grew up- A browser story.md b/sources/talk/20190312 When the web grew up- A browser story.md deleted file mode 100644 index 6a168939ad..0000000000 --- a/sources/talk/20190312 When the web grew up- A browser story.md +++ /dev/null @@ -1,65 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (When the web grew up: A browser story) -[#]: via: (https://opensource.com/article/19/3/when-web-grew) -[#]: author: (Mike Bursell https://opensource.com/users/mikecamel) - -When the web grew up: A browser story -====== -A personal story of when the internet came of age. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_Internet_Sign.png?itok=5MFGKs14) - -Recently, I [shared how][1] upon leaving university in 1994 with a degree in English literature and theology, I somehow managed to land a job running a web server in a world where people didn't really know what a web server was yet. And by "in a world," I don't just mean within the organisation in which I worked, but the world in general. The web was new—really new—and people were still trying to get their heads around it. - -That's not to suggest that the place where I was working—an academic publisher—particularly "got it" either. This was a world in which a large percentage of the people visiting their website were still running 28k8 modems. I remember my excitement in getting a 33k6 modem. At least we were past the days of asymmetric upload/download speeds,1 where 1200/300 seemed like an eminently sensible bandwidth description. This meant that the high-design, high-colour, high-resolution documents created by the print people (with whom I shared a floor) were completely impossible on the web. I wouldn't allow anything bigger than a 40k GIF on the front page of the website, and that was pushing it for many of our visitors. Anything larger than 60k or so would be explicitly linked as a standalone image from a thumbnail on the referring page. - -To say that the marketing department didn't like this was an understatement. Even worse was the question of layout. "Browsers decide how to lay out documents," I explained, time after time, "you can use headers or paragraphs, but how documents appear on the page isn't defined by the document, but by the renderer!" They wanted control. They wanted different coloured backgrounds. After a while, they got that. I went to what I believe was the first W3C meeting at which the idea of Cascading Style Sheets (CSS) was discussed. And argued vehemently against them. The suggestion that document writers should control layout was anathema.2 It took some while for CSS to be adopted, and in the meantime, those who cared about such issues adopted the security trainwreck that was Portable Document Format (PDF). - -How documents were rendered wasn't the only issue. Being a publisher of actual physical books, the whole point of having a web presence, as far as the marketing department was concerned, was to allow customers—or potential customers—to know not only what a book was about, but also how much it was going to cost them to buy. This, however, presented a problem. You see, the internet—in which I include the rapidly growing World Wide Web—was an open, free-for-all libertarian sort of place where nobody was interested in money; in fact, where talk of money was to be shunned and avoided. - -I took the mainstream "Netizen" view that there was no place for pricing information online. My boss—and, indeed, pretty much everybody else in the organisation—took a contrary view. They felt that customers should be able to see how much books would cost them. They also felt that my bank manager would like to see how much money was coming into my bank account on a monthly basis, which might be significantly reduced if I didn't come round to their view. - -Luckily, by the time I'd climbed down from my high horse and got over myself a bit—probably only a few weeks after I'd started digging my heels in—the web had changed, and there were other people putting pricing information up about their products. These newcomers were generally looked down upon by the old schoolers who'd been running web servers since the early days,3 but it was clear which way the wind was blowing. This didn't mean that the battle was won for our website, however. As an academic publisher, we shared an academic IP name ("ac.uk") with the University. The University was less than convinced that publishing pricing information was appropriate until some senior folks at the publisher pointed out that Princeton University Press was doing it, and wouldn't we look a bit silly if…? - -The fun didn't stop there, either. A few months into my tenure as webmaster ("webmaster@…"), we started to see a worrying trend, as did lots of other websites. Certain visitors were single-handedly bringing our webserver to its knees. These visitors were running a new web browser: Netscape. Netscape was badly behaved. Netscape was multi-threaded. - -Why was this an issue? Well, before Netscape, all web browsers had been single-threaded. They would open one connection at a time, so even if you had, say five GIFs on a page,4 they would request the HTML base file, parse that, then download the first GIF, complete that, then the second, complete that, and so on. In fact, they often did the GIFs in the wrong order, which made for very odd page loading, but still, that was the general idea. The rude people at Netscape decided that they could open multiple connections to the webserver at a time to request all the GIFs at the same time, for example! And why was this a problem? Well, the problem was that most webservers were single-threaded. They weren't designed to have multiple connections open at any one time. Certainly, the HTTP server that we ran (MacHTTP) was single-threaded. Even though we had paid for it (it was originally shareware), the version we had couldn't cope with multiple requests at a time. - -The debate raged across the internet. Who did these Netscape people think they were, changing how the world worked? How it was supposed to work? The world settled into different camps, and as with all technical arguments, heated words were exchanged on both sides. The problem was that not only was Netscape multi-threaded, it was also just better than the alternatives. Lots of web server code maintainers, MacHTTP author Chuck Shotton among them, sat down and did some serious coding to produce multi-threaded beta versions of their existing code. Everyone moved almost immediately to the beta versions, they got stable, and in the end, single-threaded browsers either adapted and became multi-threaded themselves, or just went the way of all outmoded products and died a quiet death.6 - -This, for me, is when the web really grew up. It wasn't prices on webpages nor designers being able to define what you'd see on a page,8 but rather when browsers became easier to use and when the network effect of thousands of viewers moving to many millions tipped the balance in favour of the consumer, not the producer. There were more steps in my journey—which I'll save for another time—but from around this point, my employers started looking at our monthly, then weekly, then daily logs, and realising that this was actually going to be something big and that they'd better start paying some real attention. - -1\. How did they come back, again? - -2\. It may not surprise you to discover that I'm still happiest at the command line. - -3\. About six months before. - -4\. Reckless, true, but it was beginning to happen.5 - -5\. Oh, and no—it was GIFs or BMP. JPEG was still a bright idea that hadn't yet taken off. - -6\. It's never actually quiet: there are always a few diehard enthusiasts who insist that their preferred solution is technically superior and bemoan the fact that the rest of the internet has gone to the devil.7 - -7\. I'm not one to talk: I still use Lynx from time to time. - -8\. Creating major and ongoing problems for those with different accessibility needs, I would point out. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/when-web-grew - -作者:[Mike Bursell][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mikecamel -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/article/18/11/how-web-was-won diff --git a/sources/talk/20190313 Why is no one signing their emails.md b/sources/talk/20190313 Why is no one signing their emails.md deleted file mode 100644 index b2b862951a..0000000000 --- a/sources/talk/20190313 Why is no one signing their emails.md +++ /dev/null @@ -1,104 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why is no one signing their emails?) -[#]: via: (https://arp242.net/weblog/signing-emails.html) -[#]: author: (Martin Tournoij https://arp242.net/) - -Why is no one signing their emails? -====== - - -I received this email a while ago: - -> Queensland University of Technology sent you an Amazon.com Gift Card! -> -> You’ve received an Amazon.com gift card! You’ll need the claim code below to place your order. -> -> Happy shopping! - -Queensland University of Technology? Why would they send me anything? Where is that even? Australia right? That’s the other side of the world! Looks like spam! - -It did look pretty good for spam, so I took a second look. And a very close third look, and then I decided it wasn’t spam. - -I was still confused why they sent me this. A week later I remembered: half a year prior I had done an interview regarding my participation on Stack Overflow for someone’s paper; she was studying somewhere in Australia – presumably the university of Queensland. No one had ever mentioned anything about a reward or Amazon gift card so I wasn’t expecting it. It’s a nice bonus though. - -Here’s the thing: I’ve spent several years professionally developing email systems; I administered email servers; I read all the relevant RFCs. While there are certainly people who are more knowledgable, I know more about email than the vast majority of the population. And I still had to take a careful look to verify the email wasn’t a phishing attempt. - -And I’m not even a target; I’m just this guy, you know? [Ask John Podesta what it is to be targeted][1]: - -> SecureWorks concluded Fancy Bear had sent Podesta an email on March 19, 2016, that had the appearance of a Google security alert, but actually contained a misleading link—a strategy known as spear-phishing. [..] The email was initially sent to the IT department as it was suspected of being a fake but was described as “legitimate” in an e-mail sent by a department employee, who later said he meant to write “illegitimate”. - -Yikes! If I was even remotely high-profile I’d be crazy paranoid about all emails I get. - -It seems to me that there is a fairly easy solution to verify the author of an email: sign it with a digital signature; PGP is probably the best existing solution right now. I don’t even care about encryption here, just signing to prevent phishing. - -PGP has a well-deserved reputation for being hard, but that’s only for certain scenarios. A lot of the problems/difficulties stem from trying to accommodate the “random person A emails random person B” use case, but this isn’t really what I care about here. “Large company with millions of users sends thousands of emails daily” is a very different use case. - -Much of the key exchange/web-of-trust dilemma can be bypassed by shipping email clients with keys for large organisations (PayPal, Google, etc.) baked in, like browsers do with some certificates. Even just publishing your key on your website (or, if you’re a bank, in local branches etc.) is already a lot better than not signing anything at all. Right now there seems to be a catch-22 scenario: clients don’t implement better support as very few people are using PGP, while very few companies bother signing their emails with PGP because so few people can benefit from it. - -On the end-user side, things are also not very hard; we’re just conceded with validating signatures, nothing more. For this purpose PGP isn’t hard. It’s like verifying your Linux distro’s package system: all of them sign their packages (usually with PGP) and they get verified on installation, but as an end-user I never see it unless something goes wrong. - -There are many aspects of PGP that are hard to set up and manage, but verifying signatures isn’t one of them. The user-visible part of this is very limited. Remember, no one is expected to sign their own emails: just verify that the signature is correct (which the software will do). Conceptually, it’s not that different from verifying a handwritten signature. - -DKIM and SPF already exist and are useful, but limited. All both do is verify that an email which claims to be from `amazon.com` is really from `amazon.com`. If I send an email from `mail.amazon-account-security.com` or `amazonn.com` then it just verifies that it was sent from that domain, not that it was sent from the organisation Amazon. - -What I am proposing is subtly different. In my (utopian) future every serious organisation will sign their email with PGP (just like every serious organisation uses https). Then every time I get an email which claims to be from Amazon I can see it’s either not signed, or not signed by a key I know. If adoption is broad enough we can start showing warnings such as “this email wasn’t signed, do you want to trust it?” and “this signature isn’t recognized, yikes!” - -There’s also S/MIME, which has better client support and which works more or less the same as HTTPS: you get a certificate from the Certificate Authority Mafia, sign your email with it, and presto. The downside of this is that anyone can sign their emails with a valid key, which isn’t necessarily telling you much (just because haxx0r.ru has a certificate doesn’t mean it’s trustworthy). - -Is it perfect? No. I understand stuff like key exchange is hard and that baking in keys isn’t perfect. Is it better? Hell yes. Would probably have avoided Podesta and the entire Democratic Party a lot of trouble. Here’s a “[sophisticated new phishing campaign][2]” targeted at PayPal users. How “sophisticated”? Well, by not having glaring stupid spelling errors, duplicating the PayPal layout in emails, duplicating the PayPal login screen, a few forms, and getting an SSL certificate. Truly, the pinnacle of Computer Science. - -Okay sure, they spent some effort on it; but any nincompoop can do it; if this passes for “sophisticated phishing” where “it’s easy to see how users could be fooled” then the bar is pretty low. - -I can’t recall receiving a single email from any organisation that is signed (much less encrypted). Banks, financial services, utilities, immigration services, governments, tax services, voting registration, Facebook, Twitter, a zillion websites … all happily sent me emails hoping I wouldn’t consider them spam and hoping I wouldn’t confuse a phishing email for one of theirs. - -Interesting experiment: send invoices for, say, a utility bill for a local provider. Just copy the layout from the last utility bill you received. I’ll bet you’ll make more money than freelancing on UpWork if you do it right. - -I’ve been intending to write this post for years, but never quite did because “surely not everyone is stupid?” I’m not a crypto expert, so perhaps I’m missing something here, but I wouldn’t know what. Let me know if I am. - -In the meanwhile PayPal is attempting to solve the problem by publishing [articles which advise you to check for spelling errors][3]. Okay, it’s good advice, but do we really want this to be the barrier between an attacker and your money? Or Russian hacking groups and your emails? Anyone can sign any email with any key, but “unknown signature” warnings strike me as a lot better UX than “carefully look for spelling errors or misleading domain names”. - -The way forward is to make it straight-forward to implement signing in apps and then just do it as a developer, whether asked or not; just as you set up https whether you’re asked or not. I’ll write a follow-up with more technical details later, assuming no one pokes holes in this article :-) - -#### Response to some feedback - -Some response to some feedback that I couldn’t be bothered to integrate in the article’s prose: - - * “You can’t trust webmail with crypto!” -If you use webmail then you’re already trusting the email provider with everything. What’s so bad with trusting them to verify a signature, too? - -We’re not communicating state secrets over encrypted email here; we’re just verifying the signature on “PayPal sent you a message, click here to view it”-kind of emails. - - * “Isn’t this ignoring the massive problem that is key management?” -Yes, it’s hard problem; but that doesn’t mean it can’t be done. I already mentioned some possible solutions in the article. - - - - -**Footnotes** - - 1. We could make something better; PGP contians a lot of cruft. But for now PGP is “good enough”. - - - - - --------------------------------------------------------------------------------- - -via: https://arp242.net/weblog/signing-emails.html - -作者:[Martin Tournoij][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://arp242.net/ -[b]: https://github.com/lujun9972 -[1]: https://en.wikipedia.org/wiki/Podesta_emails#Data_theft -[2]: https://www.eset.com/us/about/newsroom/corporate-blog/paypal-users-targeted-in-sophisticated-new-phishing-campaign/ -[3]: https://www.paypal.com/cs/smarthelp/article/how-to-spot-fake,-spoof,-or-phishing-emails-faq2340 diff --git a/sources/talk/20190314 Why feedback, not metrics, is critical to DevOps.md b/sources/talk/20190314 Why feedback, not metrics, is critical to DevOps.md deleted file mode 100644 index b2a79226ed..0000000000 --- a/sources/talk/20190314 Why feedback, not metrics, is critical to DevOps.md +++ /dev/null @@ -1,84 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why feedback, not metrics, is critical to DevOps) -[#]: via: (https://opensource.com/article/19/3/devops-feedback-not-metrics) -[#]: author: (Ranjith Varakantam (Red Hat) https://opensource.com/users/ranjith) - -Why feedback, not metrics, is critical to DevOps -====== - -Metrics can tell you some things, but not the most important things about how your products and teams are doing. - -![CICD with gears][1] - -Most managers and agile coaches depend on metrics over feedback from their teams, users, and even customers. In fact, quite a few use feedback and metrics synonymously, where they present feedback from teams or customers as a bunch of numbers or a graphical representation of those numbers. This is not only unfortunate, but it can be misleading as it presents only part of the story and not the entire truth. - -When it comes to two critical factors—how we manage or guide our teams and how we operate and influence the product that our teams are developing—few exceptional leaders and teams get it right. For one thing, it has become very easy to get your hands on data and metrics. Furthermore, it's still hard to get real feedback from teams and users. It requires significant investments and energy, and unless everyone understands the critical need for it, getting and giving feedback tends to be a low priority and keeps getting pushed to the back burner. - -### How to manage and guide teams - -With the acceptance of agile, a lot of teams have put a ridiculously high value on metrics, such as velocity, burndown charts, cumulative flow diagram (CFD), etc., instead of the value delivered by the team in each iteration or deployment. The focus is on the delivery or output produced without a clear understanding of how this relates to personal performance or implications for the project, product, or service. - -A few managers and agile coaches even abuse the true spirit of agile by misusing metrics to chastise or even penalize their teams. Instead of creating an environment of empowerment, they are slipping back into the command-and-control method where metrics are used to bully teams into submission. - -In our group, the best managers have weekly one-on-one meetings with every team member. These meetings not only give them a real pulse on team morale but also a profound understanding of the project and the decisions being made to move it forward. This weekly feedback loop also helps the team members communicate technical, functional, and even personal issues better. As a result, the team is much more cohesive in understanding the overall project needs and able to make decisions promptly. - -These leaders also skip levels—reaching out to team members two or three levels below them—and have frequent conversations with other group members who interact with their teams on a regular basis. These actions give the managers a holistic picture, which they couldn't get if they relied on feedback from one manager or lead, and help them identify any blind spots the leads and managers may have. - -These one-on-one meetings effectively transform a manager into a coach who has a close understanding of every team member. Like a good coach, these managers both give and receive feedback from the team members regarding the product, decision-making transparency, places where the team feels management is lagging, and areas that are being ignored. This empowers the teams by giving them a voice, not once in a while in an annual meeting or an annual survey, but every week. This is the level where DevOps teams should be in order to deliver their commitments successfully. - -This demands significant investments of time and energy, but the results more than justify it. The alternative is to rely on metrics and annual reviews and surveys, which has failed miserably. Unless we begin valuing feedback over metrics, we will keep seeing the metrics we want to see but failed projects and miserable team morale. - -### Influencing projects and product development - -We see similar behavior on the project or product side, with too few conversations with the users and developers and too much focus on metrics. Let's take the example of a piece of software that was released to the community or market, and the primary success metric is the number of downloads or installs. This can be deceiving for several reasons: - - 1. This product was packaged into another piece of software that users installed; even though the users are not even aware of your product's existence or purpose, it is still counted as a win and something the user needs. - - 2. The marketing team spent a huge budget promoting the product—and even offered an incentive to developers to download it. The _incentive_ drives the downloads, not user need or desire, but the metric is still considered a measure of success. - - 3. Software updates are counted as downloads, even when they are involuntary updates pushed rather than initiated by the user. This keeps bumping up the number, even though the user might have used it once, a year ago, for a specific task. - - - - -In these cases, the user automatically becomes a metric that's used to report how well the product is doing, just based on the fact it was downloaded and it's accepting updates, regardless of whether the user likes or uses the software. Instead, we should be focusing on actual usage of the product and the feedback these users have to offer us, rather than stopping short at the download numbers. - -The same holds true for SaaS products—instead of counting the number of signups, we should look at how often users use the product or service. Signups by themselves have little meaning, especially to the DevOps team where the focus is on getting constant feedback and striving for continuous improvements. - -### Gathering feedback - -So, why do we rely on metrics so much? My guess is they are easy to collect, and the marketing team is more interested in getting the product into the users' hands than evaluating how it is fairing. Unless the engineering team invests quite a bit of time in collecting feedback with tracing, which captures how often the program is executed and which components are used most often, it can be difficult to collect feedback. - -A big advantage of working in an open source community is that we first release the piece of software into a community where we can get feedback. Most open source enthusiasts take the time to log issues and bugs based on their experience with the product. If we can supplement this data with tracing, the team has an accurate record of how the product is used. - -Open as many channels of communication as possible–chat, email, Twitter, etc.—and allow users to choose their feedback channel. - -A few DevOps teams have integrated blue-green deployments, A/B testing, and canary releases to shorten the feedback loop. Setting up these frameworks it is not a trivial matter and calls for a huge upfront investment and constant updates to make them seamlessly work. But once everything is set up and data begins to flow, the team can act upon real feedback based on real user interactions with every new bit of software released. - -Most agile practitioners and lean movement activists push for a build-deploy-measure-learn cycle, and for this to happen, we need to collect feedback in addition to metrics. It might seem expensive and time consuming in the short term, but in the long run, it is a foolproof way of learning. - -### Proof that feedback pays off - -Whether it pertains to people or projects, it pays to rely on first-hand feedback rather than metrics, which are seldom interpreted in impartial ways. We have ample proof of this in other industries, where companies such as Zappos and the Virgin Group have done wonders for their business simply by listening to their customers. There is no reason we cannot follow suit, especially those of us working in open source communities. - -Feedback is the only effective way we can uncover our blind spots. Metrics are not of much help in this regard, as we can't find out what's wrong when we are dealing with unknowns. Blind spots can create serious gaps between reality and what we think we know. Feedback not only encourages continuous improvement, whether it's on a personal or a product level, but the simple act of listening and acting on it increases trust and loyalty. - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/devops-feedback-not-metrics - -作者:[Ranjith Varakantam (Red Hat)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/ranjith -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cicd_continuous_delivery_deployment_gears.png?itok=kVlhiEkc (CICD with gears) diff --git a/sources/talk/20190319 6 steps to stop ethical debt in AI product development.md b/sources/talk/20190319 6 steps to stop ethical debt in AI product development.md deleted file mode 100644 index 9bfe810a15..0000000000 --- a/sources/talk/20190319 6 steps to stop ethical debt in AI product development.md +++ /dev/null @@ -1,148 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (6 steps to stop ethical debt in AI product development) -[#]: via: (https://opensource.com/article/19/3/ethical-debt-ai-product-development) -[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeo) - -6 steps to stop ethical debt in AI product development -====== - -Machine bias in artificial intelligence is a known and unavoidable problem—but it is not unmanageable. - -![old school calculator][1] - -It's official: artificial intelligence (AI) isn't the unbiased genius we want it to be. - -Alphabet (Google's parent company) used its latest annual report [to warn][2] that ethical concerns about its products might hurt future revenue. Entrepreneur Joy Buolamwini established the [Safe Face Pledge][3] to prevent abuse of facial analysis technology. - -And years after St. George's Hospital Medical School in London was found to have used AI that inadvertently [screened out qualified female candidates][4], Amazon scrapped a recruiting tool last fall after machine learning (ML) specialists found it [doing the same thing][5]. - -We've learned the hard way that technologies built with AI are biased like people. Left unchecked, the datasets used to train such products can pose [life-or-death consequences][6] for their end users. - -For example, imagine a self-driving car that can't recognize commands from people with certain accents. If the dataset used to train the technology powering that car isn't exposed to enough voice variations and inflections, it risks not recognizing all its users as fully human. - -Here's the good news: Machine bias in AI is unavoidable—but it is _not_ unmanageable. Just like product and development teams work to reduce technical debt, you can [reduce the risk of ethical debt][7] as well. - -Here are six steps that your technical team can start taking today: - -### 1\. Document your priorities upfront - -Reducing ethical debt within your product will require you to answer two key questions in the product specification phase: - - * Which methods of fairness will you use? - * How will you prioritize them? - - - -If your team is building a product based on ML, it's not enough to reactively fix bugs or pull products from shelves. Instead, answer these questions [in your tech spec][8] so that they're included from the start of your product lifecycle. - -### 2\. Train your data under fairness constraints - -This step is tough because when you try to control or eliminate both direct and indirect bias, you'll find yourself in a Catch-22. - -If you train exclusively on non-sensitive attributes, you eliminate direct discrimination but introduce or reinforce indirect bias. - -However, if you train separate classifiers for each sensitive feature, you reintroduce direct discrimination. - -Another challenge is that detection can occur only after you've trained your model. When this occurs, the only recourse is to scrap the model and retrain it from scratch. - -To reduce these risks, don't just measure average strengths of acceptance and rejection across sensitive groups. Instead, use limits to determine what is or isn't included in the model you're training. When you do this, discrimination tests are expressed as restrictions and limitations on the learning process. - -### 3\. Monitor your datasets throughout the product lifecycle - -Developers build training sets based on data they hope the model will encounter. But many don't monitor the data their creations receive from the real world. - -ML products are unique in that they're continuously taking in data. New data allows the algorithms powering these products to keep refining their results. - -But such products often encounter data in deployment that differs from what they were trained on in production. It's also not uncommon for the algorithm to be updated without the model itself being revalidated. - -This risk will decrease if you appoint someone to monitor the source, history, and context of the data in your algorithm. This person should conduct continuous audits to find unacceptable behavior. - -Bias should be reduced as much as possible while maintaining an acceptable level of accuracy, as defined in the product specification. If unacceptable biases or behaviors are detected, the model should be rolled back to an earlier state prior to the first time you saw bias. - -### 4\. Use tagged training data - -We live in a world with trillions of images and videos at our fingertips, but most neural networks can't use this data for one reason: Most of it isn't tagged. - -Tagging refers to which classes are present in an image and their locations. When you tag an image, you share which classes are present and where they're located. - -This sounds simple—until you realize how much work it would take to draw shapes around every single person in a photo of a crowd or a box around every single person on a highway. - -Even if you succeeded, you might rush your tagging and draw your shapes sloppily, leading to a poorly trained neural network. - -The good news is that more products are coming to market so they can decrease the time and cost of tagging. - -As one example, [Brain Builder][9] is a data annotation product from Neurala that uses open source frameworks like TensorFlow and Caffe. Its goal is to help users [manage and annotate their training data][10]. It also aims to bring diverse class examples to datasets—another key step in data training. - -### 5\. Use diverse class examples - -Training data needs positive and negative examples of classes. If you want specific classes of objects, you need negative examples as well. This (hopefully) mimics the data that the algorithm will encounter in the wild. - -Consider the example of “homes” within a dataset. If the algorithm contains only images of homes in North America, it won't know to recognize homes in Japan, Morocco, or other international locations. Its concept of a “home” is thus limited. - -Neurala warns, "Most AI applications require thousands of images to be tagged, and since data tagging cost is proportional to the time spent tagging, this step alone often costs tens to hundreds of thousands of dollars per project." - -Luckily, 2018 saw a strong increase in the number of open source AI datasets. Synced has a helpful [roundup of 10 datasets][11]—from multi-label images to semantic parsing—that were open sourced last year. If you're looking for datasets by industry, GitHub [has a longer list][12]. - -### 6\. Focus on the subject, not the context - -Tech leaders in monitoring ML datasets should aim to understand how the algorithm classifies data. That's because AI sometimes focuses on irrelevant attributes that are shared by several targets in the training set. - -Let's start by looking at the biased training set below. Wolves were tagged standing in snow, but the model wasn't shown images of dogs. So, when dogs were introduced, the model started tagging them as wolves because both animals were standing in snow. In this case, the AI put too much emphasis on the context (a snowy backdrop). - -![Wolves in snow][13] - -Source: [Gartner][14] (full research available for clients) - -By contrast, here is a training set from Brain Builder that is focused on the subject dogs. When monitoring your own training set, make sure the AI is giving more weight to the subject of each image. If you saw an image classifier state that one of the dogs below is a wolf, you would need to know which aspects of the input led to this misclassification. This is a sign to check your training set and confirm that the data is accurate. - -![Dogs training set][15] - -Source: [Brain Builder][16] - -Reducing ethical debt isn't just the “right thing to do”—it also reduces _technical_ debt. Since programmatic bias is so tough to detect, working to reduce it, from the start of your lifecycle, will save you the need to retrain models from scratch. - -This isn't an easy or perfect job; tech teams will have to make tradeoffs between fairness and accuracy. But this is the essence of product management: compromises based on what's best for the product and its end users. - -Strategy is the soul of all strong products. If your team includes measures of fairness and algorithmic priorities from the start, you'll sail ahead of your competition. - -* * * - -_Lauren Maffeo will present_ [_Erase Unconscious Bias From Your AI Datasets_][17] _at[DrupalCon][18] in Seattle, April 8-12, 2019._ - -* * * - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/ethical-debt-ai-product-development - -作者:[Lauren Maffeo][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/lmaffeo -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/math_money_financial_calculator_colors.jpg?itok=_yEVTST1 (old school calculator) -[2]: https://www.yahoo.com/news/google-warns-rise-ai-may-181710642.html?soc_src=mail&soc_trk=ma -[3]: https://www.safefacepledge.org/ -[4]: https://futurism.com/ai-bias-black-box -[5]: https://uk.reuters.com/article/us-amazon-com-jobs-automation-insight/amazon-scraps-secret-ai-recruiting-tool-that-showed-bias-against-women-idUKKCN1MK08G -[6]: https://opensource.com/article/18/10/open-source-classifiers-ai-algorithms -[7]: https://thenewstack.io/tech-ethics-new-years-resolution-dont-build-software-you-will-regret/ -[8]: https://eng.lyft.com/awesome-tech-specs-86eea8e45bb9 -[9]: https://www.neurala.com/tech -[10]: https://www.roboticsbusinessreview.com/ai/brain-builder-neurala-video-annotation/ -[11]: https://medium.com/syncedreview/2018-in-review-10-open-sourced-ai-datasets-696b3b49801f -[12]: https://github.com/awesomedata/awesome-public-datasets -[13]: https://opensource.com/sites/default/files/uploads/wolves_in_snow.png (Wolves in snow) -[14]: https://www.gartner.com/doc/3889586/control-bias-eliminate-blind-spots -[15]: https://opensource.com/sites/default/files/uploads/ai_ml_canine_recognition.png (Dogs training set) -[16]: https://www.neurala.com/ -[17]: https://events.drupal.org/seattle2019/sessions/erase-unconscious-bias-your-ai-datasets -[18]: https://events.drupal.org/seattle2019 diff --git a/sources/talk/20190319 Hello World Marketing (or, How I Find Good, Boring Software).md b/sources/talk/20190319 Hello World Marketing (or, How I Find Good, Boring Software).md deleted file mode 100644 index 02f7e3fcac..0000000000 --- a/sources/talk/20190319 Hello World Marketing (or, How I Find Good, Boring Software).md +++ /dev/null @@ -1,100 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Hello World Marketing (or, How I Find Good, Boring Software)) -[#]: via: (https://theartofmachinery.com/2019/03/19/hello_world_marketing.html) -[#]: author: (Simon Arneaud https://theartofmachinery.com) - -Hello World Marketing (or, How I Find Good, Boring Software) -====== - -Back in 2001 Joel Spolsky wrote his classic essay [“Good Software Takes Ten Years. Get Used To it”][1]. Nothing much has changed since then: software is still taking around a decade of development to get good, and the industry is still getting used to that fact. Unfortunately, the industry has investors who want to see hockey stick growth rates on software that’s a year old or less. The result is an antipattern I like to call “Hello World Marketing”. Once you start to notice it, you see it everywhere, and it’s a huge red flag when choosing software tools. - - -Of course, by “Hello World”, I’m referring to the programmer’s traditional first program: the one that just displays the message “Hello World”. The aim isn’t to make a useful program; it’s to make a minimal starting point. - -Hello World Marketing is about doing the same thing, but pretending that it’s useful. You’re supposed to be distracted into admiring how neatly a tool solves trivial problems, and forget about features you’ll need in real applications. HWM emphasises what can be done in the first five minutes, and downplays what you might need after several months. HWMed software is optimised for looking good in demos, and sounding exciting in blog posts and presentations. - -For a good example, see Nemil Dalal’s [great series of articles about the early marketing for MongoDB][2]. Notice the heavy use of hackathons, and that a lot of the marketing was about how “SQL looks like COBOL”. Now, I can criticise SQL, too, but if `SELECT` and `WHERE` are serious problems for an application, there are already hundreds of solutions like [SQLAlchemy][3] and [LINQ][4] — solutions that don’t compromise on more advanced features of traditional databases. On the other hand, if you were wondering about those advanced features, you could read vomity-worthy, hand-wavey pieces like “[Living in the post-transactional database future][5]”. - -### How I Find Good, Boring Software - -Obviously, one way to avoid HWM is to stick to software that’s much more than ten years old, and has a good reputation. But sometimes that’s not possible because the tools for a problem only came out during the last decade. Also, sometimes newer tools really do bring new benefits. - -However, it’s much harder to rely on reputation for newer software because “good reputation” often just means “popular”, which often just means “current fad”. Thankfully, there’s a simple and effective trick to avoid being dazzled by hype: just look elsewhere. Instead of looking at the marketing for the core features, look at the things that are usually forgotten. Here are the kinds of things I look at: - -#### Backups and Disaster Recovery - -Backup support is both super important and regularly an afterthought. - -The minimum viable product is full data dump/import functionality, but longer term it’s nice to have things like incremental backups. Some vendors will try to tell you to just copy the data files from disk, but this isn’t guaranteed to give you a consistent snapshot if the software is running live. - -There’s no point backing up data if you can’t restore it, and restoration is the difficult part. Yet many people never test the restoration (until they actually need it). About five years ago I was working with a team that had started using a new, cutting-edge, big-data database. The database looked pretty good, but I suggested we do an end-to-end test of the backup support. We loaded a cluster with one of the multi-terabyte datasets we had, did a backup, wiped the data in the cluster and then tried to restore it. Turns out we were the first people to actually try to restore a dataset of that size — the backup “worked”, but the restoration caused the cluster to crash and burn. We filed a bug report with the original database developers and they fixed it. - -Backup processes that work on small test datasets but fail on large production datasets is a recurring theme. I always recommend testing on production-sized datasets, and testing again as production data grows. - -For batch jobs, a related concept is restartability. If you’re copying large amounts of data from one place to another, and the job gets interrupted in the middle, what happens? Can you keep going from the middle? Alternatively, can you safely retry by starting from the beginning? - -#### Configuration - -A lot of HWMed software can only be configured using a GUI or web UI because that’s what’s obvious and looks good in demos and docs. For one thing, this usually means there’s no good way to back up or restore the configuration. So if a team of people use a shared instance over a year or so, forget about trying to restore it if (or when) it breaks. It’s also much more work to keep multiple deployments consistent (e.g., for dev, testing and prod environments) using separate GUIs. In practice, it just doesn’t happen. - -I prefer a well-commented config file for software I deploy, if nothing else because it can be checked into source control, and I know I can reproduce the deployment using nothing but what’s checked into source control. If something is configured using a UI, I look for a config export/import function. Even then, that feature is often an afterthought, and often imcomplete, so it’s worth testing if it’s possible to deploy the software without ever needing to manually tweak something in the UI. - -There seems to be a recent trend for software to be configured using a REST API instead. Honestly, this is the worst of both config files and GUI-based config, and most of the time people end up using [hacky ways to put the config into a file instead][6]. - -#### Upgrades - -Life would be much easier if everything were static; software upgrade support makes everything more complicated. It’s also not usually shown in demos, so the first upgrade often ends the honeymoon with shiny, new software. - -For HA distributed systems, you’ll need support for graceful shutdown and a certain amount of forward _and_ backwards compatibility (because you’ll have multiple versions running during upgrades). It’s a common mistake to forget about downgrade support. - -Distributed systems are simpler when components have independent replicas that don’t communicate with each other. Anything with clustering (or, worse, consensus algorithms) is often extra tricky to upgrade, and worth testing. - -Things that support horizontal scaling don’t necessarily support rescaling without downtime. This is especially true whenever sharding is involved because live resharding isn’t trivial. - -Here’s a story from a certain popular container app platform. Demos showed how easy it was to launch an app on the platform, and then showed how easy it was to scale it to multiple replicas. What they didn’t show was the upgrade process: When you pushed a new version of your app, the first thing the platform did was _shut down all running instances of it_. Then it would upload the code to a build server and start building it — meaning downtime for however long the build took, plus the time needed to roll out the new version (if it worked). This problem has been fixed in newer releases of the platform. - -#### Security - -Even if software has no built-in access control, all-or-nothing access control is easy to implement (e.g., using a reverse proxy with HTTP basic auth). The harder problem is fine-grained access control. Sometimes you don’t care, but in some environments it makes a big difference to what features you can even use. - -Some immature software has a quick-and-dirty implementation of user-based access control, typically with a GUI for user management. For everything except the core business tool, this isn’t very useful. For human users, every project I’ve worked on has either been with a small team that just shared a single username/password, or with a large team that wanted integration with OpenID Connect, or LDAP, or whatever centralised single-sign-on (SSO) system was used by the organisation. No one wants to manually manage credentials for every tool, every time someone joins or leaves. Similarly, credentials for applications or other non-human users are better generated using an automatable approach — like a config file or API. - -Immature implementations of access control are often missing anything like user groups, but managing permissions at the user level is a time waster. Some SSO integrations only integrate users, not groups, which is a “so close yet so far” when it comes to avoiding permissions busywork. - -#### Others - -I talked about ignoring the hype, but there’s one good signal you can get from the marketing: whether the software is branded as “enterprise” software. Enterprise software is normally bought by someone other than the end user, so it’s usually pleasant to buy but horrible to use. The only exceptions I know of are enterprise versions of normal consumer software, and enterprise software that the buyer will also have to use. Be warned: even if a company sells enterprise software alongside consumer software, there’s no guarantee that they’re just different versions of the same product. Often they’ll be developed by separate teams with different priorities. - -A lot of the stuff in this post can be checked just by skimming through the documentation. If a tool stores data, but the documentation doesn’t mention backups, there probably isn’t any backup suppport. Even if there is and it’s just not documented, that’s not exactly a good sign either. So, sure, documentation quality is worth evaluating by itself. On the other hand, sometimes the documentation is better than the product, so I never trust a tool until I’ve actually tried it out. - -When I first saw Python, I knew that it was a terrible programming language because of the way it used whitespace indentation. Yeah, that was stupid. Later on I learned that 1) the syntax wasn’t a big deal, especially when I’m already indenting C-like languages in the same way, and 2) a lot of practical problems can be solved just by gluing libraries together with a few dozen lines of Python, and that was really useful. We often have strong opinions about syntax that are just prejudice. Syntax can matter, but it’s less important than how the tool integrates with the rest of the system. - -### Weighing Pros and Cons - -You never need to do deep analysis to detect the most overhyped products. Just check a few of these things and they’ll fail spectacularly. - -Even with software that looks solid, I still like to do more tests before entrusting a serious project with it. That’s not because I’m looking for excuses to nitpick and use my favourite tool instead. New tools often really do bring new benefits. But it’s much better to understand the pros and cons of new software, and to use it because the pros outweigh the cons, not because of how slick the Hello World demo is. - --------------------------------------------------------------------------------- - -via: https://theartofmachinery.com/2019/03/19/hello_world_marketing.html - -作者:[Simon Arneaud][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://theartofmachinery.com -[b]: https://github.com/lujun9972 -[1]: https://www.joelonsoftware.com/2001/07/21/good-software-takes-ten-years-get-used-to-it/ -[2]: https://www.nemil.com/mongo/ -[3]: https://www.sqlalchemy.org/ -[4]: https://msdn.microsoft.com/en-us/library/bb308959.aspx -[5]: https://www.mongodb.com/post/36151042528/post-transactional-future -[6]: /2017/07/15/use_terraform_with_vault.html diff --git a/sources/talk/20190320 Managing changes in open source projects.md b/sources/talk/20190320 Managing changes in open source projects.md deleted file mode 100644 index efcd5257b5..0000000000 --- a/sources/talk/20190320 Managing changes in open source projects.md +++ /dev/null @@ -1,97 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Managing changes in open source projects) -[#]: via: (https://opensource.com/article/19/3/managing-changes-open-source-projects) -[#]: author: (Ben Cotton (Red Hat, Community Moderator) https://opensource.com/users/bcotton) - -Managing changes in open source projects -====== - -Here's how to create a visible change process to support the community around an open source project. - -![scrabble letters: "time for change"][1] - -Why bother having a process for proposing changes to your open source project? Why not just let people do what they're doing and merge the features when they're ready? Well, you can certainly do that if you're the only person on the project. Or maybe if it's just you and a few friends. - -But if the project is large, you might need to coordinate how some of the changes land. Or, at the very least, let people know a change is coming so they can adjust if it affects the parts they work on. A visible change process is also helpful to the community. It allows them to give feedback that can improve your idea. And if nothing else, it lets people know what's coming so that they can get excited, and maybe get you a little bit of coverage on Opensource.com or the like. Basically, it's "here's what I'm going to do" instead of "here's what I did," and it might save you some headaches as you scramble to QA right before your release. - -So let's say I've convinced you that having a change process is a good idea. How do you build one? - -**[Watch my talk on this topic]** - - -### Right-size your change process - -Before we start talking about what a change process looks like, I want to make it very clear that this is not a one-size-fits-all situation. The smaller your project is—mainly in the number of contributors—the less process you'll probably need. As [Richard Hackman says][2], the number of communication channels in a team goes up exponentially with the number of people on the team. In community-driven projects, this becomes even more complicated as people come and go, and even your long-time contributors might not be checking in every day. So the change process consolidates those communication channels into a single area where people can quickly check to see if they care and then get back to whatever it is they do. - -At one end of the scale, there's the command-line Twitter client I maintain. The change process there is, "I pick something I want to work on, probably make a Git branch for it but I might forget that, merge it, and tag a release when I'm out of stuff that I can/want to do." At the other end is Fedora. Fedora isn't really a single project; it's a program of related projects that mostly move in the same direction. More than 200 people a week touch Fedora in a technical sense: spec file maintenance, build submission, etc. This doesn't even include the untold number of people who are working on the upstreams. And these upstreams all have their own release schedules and their own processes for how features land and when. Nobody can keep up with everything on their own, so the change process brings important changes to light. - -### Decide who needs to review changes - -One of the first things you need to consider when putting together a change process for your community is: "who needs to review changes?" This isn't necessarily approving the changes; we'll come to that shortly. But are there people who should take a look early in the process? Maybe your release engineering or infrastructure teams need to review them to make sure they don't require changes to build infrastructure. Maybe you have a legal review process to make sure licenses are in order. Or maybe you just have a change wrangler who looks to make sure all the required information is included. Or you may choose to do none of these and have change proposals go directly to the community. - -But this brings up the next step. Do you want full community feedback or only a select group to provide feedback? My preference, and what we do in Fedora, is to publish changes to the community before they're approved. But the structure of your community may fit a model where some approval body signs off on the change before it is sent to the community as an announcement. - -### Determine who approves changes - -Even if you lack any sort of organizational structure, someone ends up approving changes. This should reflect the norms and values of your community. The simplest form of approval is the person who proposed the change implements it. Easy peasy! In loosely organized communities, that might work. Fully democratic communities might put it to a community-wide vote. If a certain number or proportion of members votes in favor, the change is approved. Other communities may give that power to an individual or group. They could be responsible for the entire project or certain subsections. - -In Fedora, change approval is the role of the Fedora Engineering Steering Committee (FESCo). This is a nine-person body elected by community members. This gives the community the ability to remove members who are not acting in the best interests of the project but also enables relatively quick decisions without large overhead. - -In much of this article, I am simply presenting information, but I'm going to take a moment to be opinionated. For any project with a significant contributor base, a model where a small body makes approval decisions is the right approach. A pure democracy can be pretty messy. People who may have no familiarity with the technical ramifications of a change will be able to cast a binding vote. And that process is subject to "brigading," where someone brings along a large group of otherwise-uninterested people to support their position. Think about what it might look like if someone proposed changing the default text editor. Would the decision process be rational? - -### Plan how to enforce changes - -The other advantage of having a defined approval body is it can mediate conflicts between changes. What happens if two proposed changes conflict? Or if a change turns out to have a negative impact? Someone needs to have the authority to say "this isn't going in after all" or make sure conflicting changes are brought into agreement. Your QA team and processes will be a part of this, and maybe they're the ones who will make the final call. - -It's relatively straightforward to come up with a plan if a change doesn't work as expected or is incomplete by the deadline. If you require a contingency plan as part of the change process, then you implement that plan. The harder part is: what happens if someone makes a change that doesn't go through your change process? Here's a secret your friendly project manager doesn't want you to know: you can't force people to go through your process, particularly in community projects. - -So if something sneaks in and you don't discover it until you have a release candidate, you have a couple of options: you can let it in, or you can get someone to forcibly remove it. In either case, you'll have someone who is very unhappy. Either the person who made the change, because you kicked their work out, or the people who had to deal with the breakage it caused. (If it snuck in without anyone noticing, then it's probably not that big of a deal.) - -The answer, in either case, is going to be social pressure to follow the process. Processes are sometimes painful to follow, but a well-designed and well-maintained process will give more benefit than it costs. In this case, the benefit may be identifying breakages sooner or giving other developers a chance to take advantage of new features that are offered. And it can help prevent slips in the release schedule or hero effort from your QA team. - -### Implement your change process - -So we've thought about the life of a change proposal in your project. Throw in some deadlines that make sense for your release cadence, and you can now come up with the policy—but how do you implement it? - -First, you'll want to identify the required information for a change proposal. At a minimum, I'd suggest the following. You may have more requirements depending on the specifics of what your community is making and how it operates. - - * Name and summary - * Benefit to the project - * Scope - * Owner - * Test plan - * Dependencies and impacts - * Contingency plan - - - -You'll also want one or several change wranglers. These aren't gatekeepers so much as shepherds. They may not have the ability to approve or reject change proposals, but they are responsible for moving the proposals through the process. They check the proposal for completeness, submit it to the appropriate bodies, make appropriate announcements, etc. You can have people wrangle their own changes, but this can be a specialized task and will generally benefit from a dedicated person who does this regularly, instead of making community members do it less frequently. - -And you'll need some tooling to manage these changes. This could be a wiki page, a kanban board, a ticket tracker, something else, or a combination of these. But basically, you want to be able to track their state and provide some easy reporting on the status of changes. This makes it easier to know what is complete, what is at risk, and what needs to be deferred to a later release. You can use whatever works best for you, but in general, you'll want to minimize copy-and-pasting and maximize scriptability. - -### Remember to iterate - -Your change process may seem perfect. Then people will start using it. You'll discover edge cases you didn't consider. You'll find that the community hates a certain part of it. Decisions that were once valid will become invalid over time as technology and society change. In Fedora, our Features process revealed itself to be ambiguous and burdensome, so it was refined into the [Changes][3] process we use today. Even though the Changes process is much better than its predecessor, we still adjust it here and there to make sure it's best meeting the needs of the community. - -When designing your process, make sure it fits the size and values of your community. Consider who gets a voice and who gets a vote in approving changes. Come up with a plan for how you'll handle incomplete changes and other exceptions. Decide who will guide the changes through the process and how they'll be tracked. And once you design your change policy, write it down in a place that's easy for your community to find so that they can follow it. But most of all, remember that the process is here to serve the community; the community is not here to serve the process. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/managing-changes-open-source-projects - -作者:[Ben Cotton (Red Hat, Community Moderator)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/bcotton -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/change_words_scrabble_letters.jpg?itok=mbRFmPJ1 (scrabble letters: "time for change") -[2]: https://hbr.org/2009/05/why-teams-dont-work -[3]: https://fedoraproject.org/wiki/Changes/Policy diff --git a/sources/talk/20190323 How to transition into a Developer Relations career.md b/sources/talk/20190323 How to transition into a Developer Relations career.md deleted file mode 100644 index 40de0edf21..0000000000 --- a/sources/talk/20190323 How to transition into a Developer Relations career.md +++ /dev/null @@ -1,74 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to transition into a Developer Relations career) -[#]: via: (https://opensource.com/article/19/3/developer-relations-career) -[#]: author: (Mary Thengvall https://opensource.com/users/marygrace-0) - -How to transition into a Developer Relations career -====== - -Combine your love for open source software with your love for the community in a way that allows you to invest your time in both. - -![][1] - -Let's say you've found an open source project you really love and you want to do more than just contribute. Or you love coding, but you don't want to spend the rest of your life interacting more with your computer than you do with people. How do you combine your love for open source software with your love for the community in a way that allows you to invest your time in both? - -### Developer Relations: A symbiotic relationship - -Enter community management, or as it's more commonly called in the tech industry, Developer Relations (DevRel for short). The goal of DevRel is, at its core, to empower developers. From writing content and creating documentation to supporting local meetups and bubbling up developer feedback internally, everything that a Developer Relations professional does on a day-to-day basis is for the benefit of the community. That's not to say that it doesn't benefit the company as well! After all, as Developer Relations professionals understand, if the community succeeds, so will the company. It's the best kind of symbiotic relationship! - -These hybrid roles have been around since shortly after the open source and free software movements started, but the Developer Relations industry—and the Developer Advocate role, in particular—have exploded over the past few years. So what is Developer Relations exactly? Let's start by defining "community" so that we're all on the same page: - -> **Community:** A group of people who not only share common principles, but also develop and share practices that help individuals in the group thrive. - -This could be a group of people who have gathered around an open source project, a particular topic such as email, or who are all in a similar job function—the DevOps community, for instance. - -As I mentioned, the role of a DevRel team is to empower the community by building up, encouraging, and amplifying the voice of the community members. While this will look slightly different at every company, depending on its goals, priorities, and direction, there are a few themes that are consistent throughout the industry. - - 1. **Listen:** Before making any plans or goals, take the time to listen. - * _Listen to your company stakeholders:_ What do they expect of your team? What do they think you should be responsible for? What metrics are they accustomed to? And what business needs do they care most about? - * _Listen to your customer community:_ What are customers' biggest pain points with your product? Where do they struggle with onboarding? Where does the documentation fail them? - * _Listen to your product's technical audience:_ What problems are they trying to solve? What could be done to make their work life easier? Where do they get their content? What technological advances are they most excited about? - - - 2. **Gather information** -Based on these answers, you can start making your plan. Find the overlapping areas where you can make your product a better fit for the larger technical audience and also make it easier for your customers to use. Figure out what content you can provide that not only answers your community's questions but also solves problems for your company's stakeholders. Learn about the areas where your co-workers struggle and see where your strengths can supplement those needs. - - - 3. **Make connections** -Above all, community managers are responsible for making connections within the community as well as between community members and coworkers. These connections, or "DevRel qualified leads," are what ultimately shows the business value of a community manager's work. By making connections between community members Marie and Bob, who are both interested in the latest developments in Python, or between Marie and your coworker Phil, who's responsible for developer-focused content on your website, you're making your community a valuable source of information for everyone around you. - - - -By getting to know your technical community, you become an expert on what customer needs your product can meet. With great power comes great responsibility. As the expert, you are now responsible for advocating internally for those needs, and you have the potential to make a big difference for your community. - -### Getting started - -So now what? If you're still with me, congratulations! You might just be a good fit for a Community Manager or Developer Advocate role. I'd encourage you to take community work for a test drive and see if you like the pace and the work. There's a lot of context switching and moving around between tasks, which can be a bit of an adjustment for some folks. - -Volunteer to write a blog post for your marketing team (or for [Opensource.com][2]) or help out at an upcoming conference. Apply to speak at a local meetup or offer to advise on a few technical support cases. Get to know your community members on a deeper level. - -Above all, Community Managers are 100% driven by a passion for building technical communities and bringing people together. If that resonates with you, it may be time for a career change! - -I love talking to professionals that help others grow through community and Developer Relations practices. Don't hesitate to [reach out to me][3] if you have any questions or send me a [DM on Twitter][4]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/developer-relations-career - -作者:[Mary Thengvall][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/marygrace-0 -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/resume_career_document_general.png?itok=JEaFL2XI -[2]: https://opensource.com/how-submit-article -[3]: https://www.marythengvall.com/about -[4]: http://twitter.com/mary_grace diff --git a/sources/talk/20190328 Continuous response- The essential process we-re ignoring in DevOps.md b/sources/talk/20190328 Continuous response- The essential process we-re ignoring in DevOps.md deleted file mode 100644 index f0f0190742..0000000000 --- a/sources/talk/20190328 Continuous response- The essential process we-re ignoring in DevOps.md +++ /dev/null @@ -1,115 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Continuous response: The essential process we're ignoring in DevOps) -[#]: via: (https://opensource.com/article/19/3/continuous-response-devops) -[#]: author: (Randy Bias https://opensource.com/users/randybias) - -Continuous response: The essential process we're ignoring in DevOps -====== -You probably practice CI and CD, but if you aren't thinking about -continuous response, you aren't really doing DevOps. -![CICD with gears][1] - -Continuous response (CR) is an overlooked link in the DevOps process chain. The two other major links—[continuous integration (CI) and continuous delivery (CD)][2]—are well understood, but CR is not. Yet, CR is the essential element of follow-through required to make customers happy and fulfill the promise of greater speed and agility. At the heart of the DevOps movement is the need for greater velocity and agility to bring businesses into our new digital age. CR plays a pivotal role in enabling this. - -### Defining CR - -We need a crisp definition of CR to move forward with breaking it down. To put it into context, let's revisit the definitions of continuous integration (CI) and continuous delivery (CD). Here are Gartner's definitions when I wrote this them down in 2017: - -> [Continuous integration][3] is the practice of integrating, building, testing, and delivering functional software on a scheduled, repeatable, and automated basis. -> -> Continuous delivery is a software engineering approach where teams keep producing valuable software in short cycles while ensuring that the software can be reliably released at any time. - -I propose the following definition for CR: - -> Continuous response is a practice where developers and operators instrument, measure, observe, and manage their deployed software looking for changes in performance, resiliency, end-user behavior, and security posture and take corrective actions as necessary. - -We can argue about whether these definitions are 100% correct. They are good enough for our purposes, which is framing the definition of CR in rough context so we can understand it is really just the last link in the chain of a holistic cycle. - -![The holistic DevOps cycle][4] - -What is this multi-colored ring, you ask? It's the famous [OODA Loop][5]. Before continuing, let's touch on what the OODA Loop is and why it's relevant to DevOps. We'll keep it brief though, as there is already a long history between the OODA Loop and DevOps. - -#### A brief aside: The OODA Loop - -At the heart of core DevOps thinking is using the OODA Loop to create a proactive process for evolving and responding to changing environments. A quick [web search][6] makes it easy to learn the long history between the OODA Loop and DevOps, but if you want the deep dive, I highly recommend [The Tao of Boyd: How to Master the OODA Loop][7]. - -Here is the "evolved OODA Loop" presented by John Boyd: - -![OODA Loop][8] - -The most important thing to understand about the OODA Loop is that it's a cognitive process for adapting to and handling changing circumstances. - -The second most important thing to understand about the OODA Loop is, since it is a thought process that is meant to evolve, it depends on driving feedback back into the earlier parts of the cycle as you iterate. - -As you can see in the diagram above, CI, CD, and CR are all their own isolated OODA Loops within the overall DevOps OODA Loop. The key here is that each OODA Loop is an evolving thought process for how test, release, and success are measured. Simply put, those who can execute on the OODA Loop fastest will win. - -Put differently, DevOps wants to drive speed (executing the OODA Loop faster) combined with agility (taking feedback and using it to constantly adjust the OODA Loop). This is why CR is a vital piece of the DevOps process. We must drive production feedback into the DevOps maturation process. The DevOps notion of Culture, Automation, Measurement, and Sharing ([CAMS][9]) partially but inadequately captures this, whereas CR provides a much cleaner continuation of CI/CD in my mind. - -### Breaking CR down - -CR has more depth and breadth than CI or CD. This is natural, given that what we're categorizing is the post-deployment process by which our software is taking a variety of actions from autonomic responses to analytics of customer experience. I think, when it's broken down, there are three key buckets that CR components fall into. Each of these three areas forms a complete OODA Loop; however, the level of automation throughout the OODA Loop varies significantly. - -The following table will help clarify the three areas of CR: - -CR Type | Purpose | Examples ----|---|--- -Real-time | Autonomics for availability and resiliency | Auto-scaling, auto-healing, developer-in-the-loop automated responses to real-time failures, automated root-cause analysis -Analytic | Feature/fix pipeline | A/B testing, service response times, customer interaction models -Predictive | History-based planning | Capacity planning, hardware failure prediction models, cost-basis analysis - -_Real-time CR_ is probably the best understood of the three. This kind of CR is where our software has been instrumented for known issues and can take an immediate, automated response (autonomics). Examples of known issues include responding to high or low demand (e.g., elastic auto-scaling), responding to expected infrastructure resource failures (e.g., auto-healing), and responding to expected distributed application failures (e.g., circuit breaker pattern). In the future, we will see machine learning (ML) and similar technologies applied to automated root-cause analysis and event correlation, which will then provide a path towards "no ops" or "zero ops" operational models. - -_Analytic CR_ is still the most manual of the CR processes. This kind of CR is focused primarily on observing end-user experience and providing feedback to the product development cycle to add features or fix existing functionality. Examples of this include traditional A/B website testing, measuring page-load times or service-response times, post-mortems of service failures, and so on. - -_Predictive CR_ , due to the resurgence of AI and ML, is one of the innovation areas in CR. It uses historical data to predict future needs. ML techniques are allowing this area to become more fully automated. Examples include automated and predictive capacity planning (primarily for the infrastructure layer), automated cost-basis analysis of service delivery, and real-time reallocation of infrastructure resources to resolve capacity and hardware failure issues before they impact the end-user experience. - -### Diving deeper on CR - -CR, like CI or CD, is a DevOps process supported by a set of underlying tools. CI and CD are not Jenkins, unit tests, or automated deployments alone. They are a process flow. Similarly, CR is a process flow that begins with the delivery of new code via CD, which open source tools like [Spinnaker][10] give us. CR is not monitoring, machine learning, or auto-scaling, but a diverse set of processes that occur after code deployment, supported by a variety of tools. CR is also different in two specific ways. - -First, it is different because, by its nature, it is broader. The general software development lifecycle (SDLC) process means that most [CI/CD processes][11] are similar. However, code running in production differs from app to app or service to service. This means that CR differs as well. - -Second, CR is different because it is nascent. Like CI and CD before it, the process and tools existed before they had a name. Over time, CI/CD became more normalized and easier to scope. CR is new, hence there is lots of room to discuss what's in or out. I welcome your comments in this regard and hope you will run with these ideas. - -### CR: Closing the loop on DevOps - -DevOps arose because of the need for greater service delivery velocity and agility. Essentially, DevOps is an extension of agile software development practices to an operational mindset. It's a direct response to the flexibility and automation possibilities that cloud computing affords. However, much of the thinking on DevOps to date has focused on deploying the code to production and ends there. But our jobs don't end there. As professionals, we must also make certain our code is behaving as expected, we are learning as it runs in production, and we are taking that learning back into the product development process. - -This is where CR lives and breathes. DevOps without CR is the same as saying there is no OODA Loop around the DevOps process itself. It's like saying that operators' and developers' jobs end with the code being deployed. We all know this isn't true. Customer experience is the ultimate measurement of our success. Can people use the software or service without hiccups or undue friction? If not, we need to fix it. CR is the final link in the DevOps chain that enables delivering the truest customer experience. - -If you aren't thinking about continuous response, you aren't doing DevOps. Share your thoughts on CR, and tell me what you think about the concept and the definition. - -* * * - -_This article is based on[The Essential DevOps Process We're Ignoring: Continuous Response][12], which originally appeared on the Cloudscaling blog under a [CC BY 4.0][13] license and is republished with permission._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/continuous-response-devops - -作者:[Randy Bias][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/randybias -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cicd_continuous_delivery_deployment_gears.png?itok=kVlhiEkc (CICD with gears) -[2]: https://opensource.com/article/18/8/what-cicd -[3]: https://www.gartner.com/doc/3187420/guidance-framework-continuous-integration-continuous -[4]: https://opensource.com/sites/default/files/uploads/holistic-devops-cycle-smaller.jpeg (The holistic DevOps cycle) -[5]: https://en.wikipedia.org/wiki/OODA_loop -[6]: https://www.google.com/search?q=site%3Ablog.b3k.us+ooda+loop&rlz=1C5CHFA_enUS730US730&oq=site%3Ablog.b3k.us+ooda+loop&aqs=chrome..69i57j69i58.8660j0j4&sourceid=chrome&ie=UTF-8#q=devops+ooda+loop&* -[7]: http://www.artofmanliness.com/2014/09/15/ooda-loop/ -[8]: https://opensource.com/sites/default/files/uploads/ooda-loop-2-1.jpg (OODA Loop) -[9]: https://itrevolution.com/devops-culture-part-1/ -[10]: https://www.spinnaker.io -[11]: https://opensource.com/article/18/12/cicd-tools-sysadmins -[12]: http://cloudscaling.com/blog/devops/the-essential-devops-process-were-ignoring-continuous-response/ -[13]: https://creativecommons.org/licenses/by/4.0/ diff --git a/sources/talk/20190328 Why do organizations have open secrets.md b/sources/talk/20190328 Why do organizations have open secrets.md deleted file mode 100644 index 8a4c8c0017..0000000000 --- a/sources/talk/20190328 Why do organizations have open secrets.md +++ /dev/null @@ -1,77 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why do organizations have open secrets?) -[#]: via: (https://opensource.com/open-organization/19/3/open-secrets-bystander-effect) -[#]: author: (Laura Hilliger https://opensource.com/users/laurahilliger/users/maryjo) - -Why do organizations have open secrets? -====== -Everyone sees something, but no one says anything—that's the bystander -effect. And it's damaging your organizational culture. -![][1] - -[The five characteristics of an open organization][2] must work together to ensure healthy and happy communities inside our organizations. Even the most transparent teams, departments, and organizations require equal doses of additional open principles—like inclusivity and collaboration—to avoid dysfunction. - -The "open secrets" phenomenon illustrates the limitations of transparency when unaccompanied by additional open values. [A recent article in Harvard Business Review][3] explored the way certain organizational issues—widely apparent but seemingly impossible to solve—lead to discomfort in the workforce. Authors Insiya Hussain and Subra Tangirala performed a number of studies, and found that the more people in an organization who knew about a particular "secret," be it a software bug or a personnel issue, the less likely any one person would be to report the issue or otherwise _do_ something about it. - -Hussain and Tangirala explain that so-called "open secrets" are the result of a [bystander effect][4], which comes into play when people think, "Well, if _everyone_ knows, surely _I_ don't need to be the one to point it out." The authors mention several causes of this behavior, but let's take a closer look at why open secrets might be circulating in your organization—with an eye on what an open leader might do to [create a safe space for whistleblowing][5]. - -### 1\. Fear - -People don't want to complain about a known problem only to have their complaint be the one that initiates the quality assurance, integrity, or redress process. What if new information emerges that makes their report irrelevant? What if they are simply _wrong_? - -At the root of all bystander behavior is fear—fear of repercussions, fear of losing reputation or face, or fear that the very thing you've stood up against turns out to be a non-issue for everyone else. Going on record as "the one who reported" carries with it a reputational risk that is very intimidating. - -The first step to ensuring that your colleagues report malicious behavior, code, or _whatever_ needs reporting is to create a fear-free workplace. We're inundated with the idea that making a mistake is bad or wrong. We're taught that we have to "protect" our reputations. However, the qualities of a good and moral character are _always_ subjective. - -_Tip for leaders_ : Reward courage and strength every time you see it, regardless of whether you deem it "necessary." For example, if in a meeting where everyone except one person agrees on something, spend time on that person's concerns. Be patient and kind in helping that person change their mind, and be open minded about that person being able to change yours. Brains work in different ways; never forget that one person might have a perspective that changes the lay of the land. - -### 2\. Policies - -Usually, complaint procedures and policies are designed to ensure fairness towards all parties involved in the complaint. Discouraging false reporting and ensuring such fairness in situations like these is certainly a good idea. But policies might actually deter people from standing up—because a victim might be discouraged from reporting an experience if the formal policy for reporting doesn't make them feel protected. Standing up to someone in a position of power and saying "Your behavior is horrid, and I'm not going to take it" isn't easy for anyone, but it's particularly difficult for marginalized groups. - -The "open secrets" phenomenon illustrates the limitations of transparency when unaccompanied by additional open values. - -To ensure fairness to all parties, we need to adjust for victims. As part of making the decision to file a report, a victim will be dealing with a variety of internal fears. They'll wonder what might happen to their self-worth if they're put in a situation where they have to talk to someone about their experience. They'll wonder if they'll be treated differently if they're the one who stands up, and how that will affect their future working environments and relationships. Especially in a situation involving an open secret, asking a victim to be strong is asking them to have to trust that numerous other people will back them up. This fear shouldn't be part of their workplace experience; it's just not fair. - -Remember that if one feels responsible for a problem (e.g., "Crap, that's _my code_ that's bringing down the whole server!"), then that person might feel fear at pointing out the mistake. _The important thing is dealing with the situation, not finding someone to blame._ Policies that make people feel personally protected—no matter what the situation—are absolutely integral to ensuring the organization deals with open secrets. - -_Tip for leaders_ : Make sure your team's or organization's policy regarding complaints makes anonymous reporting possible. Asking a victim to "go on record" puts them in the position of having to defend their perspective. If they feel they're the victim of harassment, they're feeling as if they are harassed _and_ being asked to defend their experience. This means they're doing double the work of the perpetrator, who only has to defend themselves. - -### 3\. Marginalization - -Women, LGBTQ people, racial minorities, people with physical disabilities, people who are neuro-atypical, and other marginalized groups often find themselves in positions that them feel routinely dismissed, disempowered, disrespected—and generally dissed. These feelings are valid (and shouldn't be too surprising to anyone who has spent some time looking at issues of diversity and inclusion). Our emotional safety matters, and we tend to be quite protective of it—even if it means letting open secrets go unaddressed. - -Marginalized groups have enough worries weighing on them, even when they're _not_ running the risk of damaging their relationships with others at work. Being seen and respected in both an organization and society more broadly is difficult enough _without_ drawing potentially negative attention. - -Policies that make people feel personally protected—no matter what the situation—are absolutely integral to ensuring the organization deals with open secrets. - -Luckily, in recent years attitudes towards marginalized groups have become visible, and we as a society have begun to talk about our experiences as "outliers." We've also come to realize that marginalized groups aren't actually "outliers" at all; we can thank the colorful, beautiful internet for that. - -_Tip for leaders_ : Diversity and inclusion plays a role in dispelling open secrets. Make sure your diversity and inclusion practices and policies truly encourage a diverse workplace. - -### Model the behavior - -The best way to create a safe workplace and give people the ability to call attention to pervasive problems found within it is to _model the behaviors that you want other people to display_. Dysfunction occurs in cultures that don't pay attention to and value the principles upon which they are built. In order to discourage bystander behavior, transparent, inclusive, adaptable and collaborative communities must create policies that support calling attention to open secrets and then empathetically dealing with whatever the issue may be. - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/3/open-secrets-bystander-effect - -作者:[Laura Hilliger][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/laurahilliger/users/maryjo -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_secret_ingredient_520x292.png?itok=QbKzJq-N -[2]: https://opensource.com/open-organization/resources/open-org-definition -[3]: https://hbr.org/2019/01/why-open-secrets-exist-in-organizations -[4]: https://www.psychologytoday.com/us/basics/bystander-effect -[5]: https://opensource.com/open-organization/19/2/open-leaders-whistleblowers diff --git a/sources/talk/20190329 9 open source tools for building a fault-tolerant system.md b/sources/talk/20190329 9 open source tools for building a fault-tolerant system.md deleted file mode 100644 index 78282fb853..0000000000 --- a/sources/talk/20190329 9 open source tools for building a fault-tolerant system.md +++ /dev/null @@ -1,139 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: 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 (Red Hat, Community Moderator) https://opensource.com/users/brson) - -9 open source tools for building a fault-tolerant system -====== - -Maximize uptime and minimize problems with these open source tools. - -![magnifying glass on computer screen, finding a bug in the code][1] - -I've always been interested in web development and software architecture because I like to see the broader picture of a working system. Whether you are building a mobile app or a web application, it has to be connected to the internet to exchange data among different modules, which means you need a web service. - -If you use a cloud system as your application's backend, you can take advantage of greater computing power, as the backend service will scale horizontally and vertically and orchestrate different services. But whether or not you use a cloud backend, it's important to build a _fault-tolerant system_ —one that is resilient, stable, fast, and safe. - -To understand fault-tolerant systems, let's use Facebook, Amazon, Google, and Netflix as examples. Millions and billions of users access these platforms simultaneously while transmitting enormous amounts of data via peer-to-peer and user-to-server networks, and you can be sure there are also malicious users with bad intentions, like hacking or denial-of-service (DoS) attacks. Even so, these platforms can operate 24 hours a day and 365 days a year without downtime. - -Although machine learning and smart algorithms are the backbones of these systems, the fact that they achieve consistent service without a single minute of downtime is praiseworthy. Their expensive hardware and gigantic datacenters certainly matter, but the elegant software designs supporting the services are equally important. And the fault-tolerant system is one of the principles to build such an elegant system. - -### Two behaviors that cause problems in production - -Here's another way to think of a fault-tolerant system. When you run your application service locally, everything seems to be fine. Great! But when you promote your service to the production environment, all hell breaks loose. In a situation like this, a fault-tolerant system helps by addressing two problems: Fail-stop behavior and Byzantine behavior. - -#### Fail-stop behavior - -Fail-stop behavior is when a running system suddenly halts or a few parts of the system fail. Server downtime and database inaccessibility fall under this category. For example, in the diagram below, Service 1 can't communicate with Service 2 because Service 2 is inaccessible: - -![Fail-stop behavior due to Service 2 downtime][2] - -But the problem can also occur if there is a network problem between the services, like this: - -![Fail-stop behavior due to network failure][3] - -#### Byzantine behavior - -Byzantine behavior is when the system continuously runs but doesn't produce the expected behavior (e.g., wrong data or an invalid value). - -Byzantine failure can happen if Service 2 has corrupted data or values, even though the service looks to be operating just fine, like in this example: - -![Byzantine failure due to corrupted service][4] - -Or, there can be a malicious middleman intercepting between the services and injecting unwanted data: - -![Byzantine failure due to malicious middleman][5] - -Neither fail-stop nor Byzantine behavior is a desired situation, so we need ways to prevent or fix them. That's where fault-tolerant systems come into play. Following are eight open source tools that can help you address these problems. - -### Tools for building a fault-tolerant system - -Although building a truly practical fault-tolerant system touches upon in-depth _distributed computing theory_ and complex computer science principles, there are many software tools—many of them, like the following, open source—to alleviate undesirable results by building a fault-tolerant system. - -#### Circuit-breaker pattern: Hystrix and Resilience4j - -The [circuit-breaker pattern][6] is a technique that helps to return a prepared dummy response or a simple response when a service fails: - -![Circuit breaker pattern][7] - -Netflix's open source **[Hystrix][8]** is the most popular implementation of the circuit-breaker pattern. - -Many companies where I've worked previously are leveraging this wonderful tool. Surprisingly, Netflix announced that it will no longer update Hystrix. (Yeah, I know.) Instead, Netflix recommends using an alternative solution like [**Resilence4j**][9], which supports Java 8 and functional programming, or an alternative practice like [Adaptive Concurrency Limit][10]. - -#### Load balancing: Nginx and HaProxy - -Load balancing is one of the most fundamental concepts in a distributed system and must be present to have a production-quality environment. To understand load balancers, we first need to understand the concept of _redundancy_. Every production-quality web service has multiple servers that provide redundancy to take over and maintain services when servers go down. - -![Load balancer][11] - -Think about modern airplanes: their dual engines provide redundancy that allows them to land safely even if an engine catches fire. (It also helps that most commercial airplanes have state-of-art, automated systems.) But, having multiple engines (or servers) means that there must be some kind of scheduling mechanism to effectively route the system when something fails. - -A load balancer is a device or software that optimizes heavy traffic transactions by balancing multiple server nodes. For instance, when thousands of requests come in, the load balancer acts as the middle layer to route and evenly distribute traffic across different servers. If a server goes down, the load balancer forwards requests to the other servers that are running well. - -There are many load balancers available, but the two best-known ones are Nginx and HaProxy. - -[**Nginx**][12] is more than a load balancer. It is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server. Companies like Groupon, Capital One, Adobe, and NASA use it. - -[**HaProxy**][13] is also popular, as it is a free, very fast and reliable solution offering high availability, load balancing, and proxying for TCP and HTTP-based applications. Many large internet companies, including GitHub, Reddit, Twitter, and Stack Overflow, use HaProxy. Oh and yes, Red Hat Enterprise Linux also supports HaProxy configuration. - -#### Actor model: Akka - -The [actor model][14] is a concurrency design pattern that delegates responsibility when an _actor_ , which is a primitive unit of computation, receives a message. An actor can create even more actors and delegate the message to them. - -[**Akka**][15] is one of the most well-known tools for the actor model implementation. The framework supports Java and Scala, which are both based on JVM. - -#### Asynchronous, non-blocking I/O using messaging queue: Kafka and RabbitMQ - -Multi-threaded development has been popular in the past, but this practice has been discouraged and replaced with asynchronous, non-blocking I/O patterns. For Java, this is explicitly stated in its [Enterprise Java Bean (EJB) specifications][16]: - -> "An enterprise bean must not use thread synchronization primitives to synchronize execution of multiple instances. -> -> "The enterprise bean must not attempt to manage threads. The enterprise bean must not attempt to start, stop, suspend, or resume a thread, or to change a thread's priority or name. The enterprise bean must not attempt to manage thread groups." - -Now, there are other practices like stream APIs and actor models. But messaging queues like [**Kafka**][17] and [**RabbitMQ**][18] offer the out-of-box support for asynchronous and non-blocking IO features, and they are powerful open source tools that can be replacements for threads by handling concurrent processes. - -#### Other options: Eureka and Chaos Monkey - -Other useful tools for fault-tolerant systems include monitoring tools, such as Netflix's **[Eureka][19]** , and stress-testing tools, like **[Chaos Monkey][20]**. They aim to discover potential issues earlier by testing in lower environments, like integration (INT), quality assurance (QA), and user acceptance testing (UAT), to prevent potential problems before moving to the production environment. - -* * * - -What open source tools are you using for building a fault-tolerant system? Please share your favorites in the comments. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/tools-fault-tolerant-system - -作者:[Bryant Son (Red Hat, Community Moderator)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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 diff --git a/sources/talk/20190401 How Kubeflow is evolving without ksonnet.md b/sources/talk/20190401 How Kubeflow is evolving without ksonnet.md deleted file mode 100644 index bad5611f3d..0000000000 --- a/sources/talk/20190401 How Kubeflow is evolving without ksonnet.md +++ /dev/null @@ -1,62 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How Kubeflow is evolving without ksonnet) -[#]: via: (https://opensource.com/article/19/4/kubeflow-evolution) -[#]: author: (Jonathan Gershater (Red Hat) https://opensource.com/users/jgershat/users/jgershat) - -How Kubeflow is evolving without ksonnet -====== -There are big differences in how open source communities handle change compared to closed source vendors. -![Chat bubbles][1] - -Many software projects depend on modules that are run as separate open source projects. When one of those modules loses support (as is inevitable), the community around the main project must determine how to proceed. - -This situation is happening right now in the [Kubeflow][2] community. Kubeflow is an evolving open source platform for developing, orchestrating, deploying, and running scalable and portable machine learning workloads on [Kubernetes][3]. Recently, the primary supporter of the Kubeflow component [ksonnet][4] announced that it would [no longer support][5] the software. - -When a piece of software loses support, the decision-making process (and the outcome) differs greatly depending on whether the software is open source or closed source. - -### A cellphone analogy - -To illustrate the differences in how an open source community and a closed source/single software vendor proceed when a component loses support, let's use an example from hardware design. - -Suppose you buy cellphone Model A and it stops working. When you try to get it repaired, you discover the manufacturer is out of business and no longer offering support. Since the cellphone's design is proprietary and closed, no other manufacturers can support it. - -Now, suppose you buy cellphone Model B, it stops working, and its manufacturer is also out of business and no longer offering support. However, Model B's design is open, and another company is in business manufacturing, repairing and upgrading Model B cellphones. - -This illustrates one difference between software written using closed and open source principles. If the vendor of a closed source software solution goes out of business, support disappears with the vendor, unless the vendor sells the software's design and intellectual property. But, if the vendor of an open source solution goes out of business, there is no intellectual property to sell. By the principles of open source, the source code is available for anyone to use and modify, under license, so another vendor can continue to maintain the software. - -### How Kubeflow is evolving without ksonnet - -The ramification of ksonnet's backers' decision to cease development illustrates Kubeflow's open and collaborative design process. Kubeflow's designers have several options, such as replacing ksonnet, adopting and developing ksonnet, etc. Because Kubeflow is an open source project, all options are discussed in the open on the Kubeflow mailing list. Some of the community's suggestions include: - -> * Should we look at projects that are CNCF/Apache projects e.g. [helm][6] -> * I would opt for back to the basics. KISS. How about plain old jsonnet + kubectl + makefile/scripts ? Thats how e.g. the coreos [prometheus operator][7] does it. It would also lower the entry barrier (no new tooling) and let vendors of k8s (gke, openshift, etc) easily build on top of that. -> * I vote for using a simple, _programmatic_ context, be it manual jsonnet + kubectl, or simple Python scripts + Python K8s client, or any tool be can build on top of these. -> - - -The members of the mailing list are discussing and debating alternatives to ksonnet and will arrive at a decision to continue development. What I love about the open source way of adapting is that it's done communally. Unlike closed source software, which is often designed by one vendor, the organizations that are members of an open source project can collaboratively steer the project in the direction they best see fit. As Kubeflow evolves, it will benefit from an open, collaborative decision-making framework. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/kubeflow-evolution - -作者:[Jonathan Gershater (Red Hat)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jgershat/users/jgershat -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_communication_team.png?itok=CYfZ_gE7 (Chat bubbles) -[2]: https://www.kubeflow.org/ -[3]: https://github.com/kubernetes -[4]: https://ksonnet.io/ -[5]: https://blogs.vmware.com/cloudnative/2019/02/05/welcoming-heptio-open-source-projects-to-vmware/ -[6]: https://landscape.cncf.io -[7]: https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus diff --git a/sources/talk/20190402 Making computer science curricula as adaptable as our code.md b/sources/talk/20190402 Making computer science curricula as adaptable as our code.md deleted file mode 100644 index 150034a20b..0000000000 --- a/sources/talk/20190402 Making computer science curricula as adaptable as our code.md +++ /dev/null @@ -1,72 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Making computer science curricula as adaptable as our code) -[#]: via: (https://opensource.com/open-organization/19/4/adaptable-curricula-computer-science) -[#]: author: (Amarachi Achonu https://opensource.com/users/amarach1/users/johnsontanner3) - -Making computer science curricula as adaptable as our code -====== -No two computer science students are alike—so teachers need curricula -that are open and adaptable. -![][1] - -Educators in elementary computer science face a lack of adaptable curricula. Calls for more modifiable, non-rigid curricula are therefore enticing—assuming that such curricula could benefit teachers by increasing their ability to mold resources for individual classrooms and, ultimately, produce better teaching experiences and learning outcomes. - -Our team at [CSbyUs][2] noticed this scarcity, and we've created an open source web platform to facilitate more flexible, adaptable, and tested curricula for computer science educators. The mission of the CSbyUs team has always been utilizing open source technology to improve pedagogy in computer science, which includes increasing support for teachers. Therefore, this project primarily seeks to use open source principles—and the benefits inherent in them—to expand the possibilities of modern curriculum-making and support teachers by increasing access to more adaptable curricula. - -### Rigid, monotonous, mundane - -Why is the lack of adaptable curricula a problem for computer science education? Rigid curricula dominates most classrooms today, primarily through monotonous and routinely distributed lesson plans. Many of these plans are developed without the capacity for dynamic use and application to different classroom atmospheres. In contrast, an _adaptable_ curriculum is one that would _account_ for dynamic and changing classroom environments. - -An adaptable curriculum means freedom and more options for educators. This is especially important in elementary-level classrooms, where instructors are introducing students to computer science for the first time, and in classrooms with higher populations of groups typically underrepresented in the field of computer science. Here especially, it's advantageous for instructors to have access to curricula that explicitly consider diverse classroom landscapes and grants the freedom necessary to adapt to specific student populations. - -### Making it adaptable - -This kind of adaptability is certainly at work at CSbyUs. Hayley Barton—a member of both the organization's curriculum-making team and its teaching team, and a senior at Duke University majoring in Economics and minoring in Computer Science and Spanish—recently demonstrated the benefits of adaptable curricula during an engagement in the field. Reflecting on her teaching experiences, Barton describes a major reason why curriculum adaptation is necessary in computer science classrooms. "We are seeing the range of students that we work with," she says, "and trying to make the curriculum something that can be tailored to different students." - -An adaptable curriculum means freedom and more options for educators. - -A more adaptable curriculum is necessary for truly challenging students, Barton continues. - -The need for change became most evident to Barton when working students to make their own preliminary apps. Barton collaborated with students who appeared to be at different levels of focus and attention. On the one hand, a group of more advanced students took well to the style of a demonstrative curriculum and remained attentive and engaged to the task. On the other hand, another group of students seemed to have more trouble focusing in the classroom or even being motivated to engage with topics of computer science skills. Witnessing this difference among students, it became important that curriculum would need to be adaptable in multiple ways to be able to engage more students at their level. - -"We want to challenge every student without making it too challenging for any individual student," Barton says. "Thinking about those things definitely feeds into how I'm thinking about the curriculum in terms of making it accessible for all the students." - -As a curriculum-maker, she subsequently uses experiences like this to make changes to the original curriculum. - -"If those other students have one-on-one time themselves, they could be doing even more amazing things with their apps," says Barton. - -Taking this advice, Barton would potentially incorporate into the curriculum more emphasis on cultivating students' sense of ownership in computer science, since this is important to their focus and productivity. For this, students may be afforded that sense of one-on-one time. The result will affect the next round of teachers who use the curriculum. - -For these changes to be effective, the onus is on teachers to notice the dynamics of the classroom. In the future, curriculum adaptation may depend on paying particular attention to and identifying these subtle differences of style of curriculum. Identifying and commenting about these subtleties allows the possibility of applying a different strategy, and these are the changes that are applied to the curriculum. - -Curriculum adaptation should be iterative, as it involves learning from experience, returning to the drawing board, making changes, and finally, utilizing the curriculum again. - -"We've gone through a lot of stages of development," Barton says. "The goal is to have this kind of back and forth, where the curriculum is something that's been tested, where we've used our feedback, and also used other research that we've done, to make it something that's actually impactful." - -Hayley's "back and forth" process is an iterative process of curriculum-making. Between utilizing curricula and modifying curricula, instructors like Hayley can take a once-rigid curriculum and mold it to any degree that the user sees fit—again and again. This iterative process depends on tests performed first in the classroom, and it depends on the teacher's rationale and reflection on how curricula uniquely pans out for them. - -Adaptability of curriculum is the most important principle on which the CSbyUs platform is built. Much like Hayley's process of curriculum-making, curriculum adaptation should be _iterative_ , as it involves learning from experience, returning to the drawing board, making changes, and finally, utilizing the curriculum again. Once launched, the CSbyUS website will document this iterative process. - -The open-focused pedagogy behind the CSByUs platform, then, brings to life the flexibility inherent in the process of curriculum adaptation. First, it invites and collects the valuable first-hand perspectives of real educators working with real curricula to produce real learning. Next, it capitalizes on an iterative processes of development—one familiar to open source programmers—to enable modifications to curriculum (and the documentation of those modifications). Finally, it transforms the way teachers encounter curricula by helping them make selections from different versions of both modified curriculum and "the original." Our platform's open source strategy is crucial to cultivating a hub of flexible curricula for educators. - -Open source practices can be a key difference in making rigid curricula more moldable for educators. Furthermore, since this approach effectively melds open source technologies with open-focused pedagogy, open pedagogy can potentially provide flexibility for educators teaching various curriculum across disciplines. - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/4/adaptable-curricula-computer-science - -作者:[Amarachi Achonu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/amarach1/users/johnsontanner3 -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolserieshe_rh_051x_0.png?itok=gIzbmxuI -[2]: https://csbyus.herokuapp.com/ diff --git a/sources/talk/20190405 D as a C Replacement.md b/sources/talk/20190405 D as a C Replacement.md deleted file mode 100644 index 36b60bb278..0000000000 --- a/sources/talk/20190405 D as a C Replacement.md +++ /dev/null @@ -1,247 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (D as a C Replacement) -[#]: via: (https://theartofmachinery.com/2019/04/05/d_as_c_replacement.html) -[#]: author: (Simon Arneaud https://theartofmachinery.com) - -D as a C Replacement -====== - -Sircmpwn (the main developer behind the [Sway Wayland compositor][1]) recently wrote a blog post about how he thinks [Rust is not a good C replacement][2]. I don’t know if he’d like the [D programming language][3] either, but it’s become a C replacement for me. - -### My C to D Story - -My story is like a lot of systems programmers’ stories. At one time, C was my go-to language for most programming. One day I realised that most of my C programs kept reimplementing things from C++: dynamic arrays, better strings, polymorphic classes, etc. So I tried using C++ instead, and at first I loved it. RAII and classes and generics made programming fun again. Even better was the promise that if I read all these books on C++, and learned to master things like template metaprogramming, I’d become an almighty god of systems programming and my code would be amazing. But learning more eventually had the opposite effect: (in hindsight) my code actually got worse, and I fell out of love. I remember reading Scott Meyer’s Effective C++ and realising it was really more about _ineffective_ C++ — and that most of my C++ code until then was broken. Let’s face it: C might be fiddly to use, but it has a kind of elegance, and “elegant” is rarely a word you hear when C++ is involved. - -Apparently, a lot of ex-C C++ programmers end up going back to C. In my case, I discovered D. It’s also not perfect, but I use it because it feels to me a lot more like the `C += 1` that C++ was meant to be. Here’s an example that’s very superficial, but I think is representative. Take this simple C program: - -``` -#include - -int main() -{ - printf("1 + 1 = %d!\n", 1 + 1); - return 0; -} -``` - -Here’s a version using the C++ standard library: - -``` -#include - -int main() -{ - std::cout << "1 + 1 = " << 1 + 1 << "!" << std::endl; - return 0; -} -``` - -Here’s an idiomatic D version: - -``` -import std.stdio; - -void main() -{ - writef("1 + 1 = %d!\n", 1 + 1); -} -``` - -As I said, it’s a superficial example, but I think it shows a general difference in philosophy between C++ and D. (If I wanted to make the difference even clearer, I’d use an example that needed `iomanip` in C++.) - -Update: Unlike in C, [D’s format strings can work with custom types][4]. Stefan Rohe has also pointed out that [D supports compile-time checking of format strings][5] using its metaprogramming features — unlike C which does it through built-in compiler special casing that can’t be used with custom code. - -This [article about C++ member function pointers][6] happens to also be a good explanation of the origins of D. It’s a good read if you’re a programming language nerd like me, but here’s my TL;DR for everyone else: C++ member function pointers are supposed to feel like a low-level feature (like normal function pointers are), but the complexity and diversity of implementations means they’re really high level. The complexity of the implementations is because of the subtleties of the rules about what you can do with them. The author explains the implementations from several C++ compilers, including what’s “easily [his] favorite implementation”: the elegantly simple Digital Mars C++ implementation. (“Why doesn’t everyone else do it this way?”) The DMC compiler was written by Walter Bright, who invented D. - -D has classes and templates and other core features of C++, but designed by someone who has spent a heck of a lot of time thinking about the C++ spec and how things could be simpler. Walter once said that his experiences implementing C++ templates made him consider not including them in D at all, until he realised they didn’t need to be so complex. - -Here’s a quick tour of D from the point of view of incrementally improving C. - -### `-betterC` - -D compilers support a `-betterC` switch that disables [the D runtime][7] and all high-level features that depend on it. The example C code above can be translated directly into betterC: - -``` -import core.stdc.stdio; - -extern(C): - -int main() -{ - printf("1 + 1 = %d!\n", 1 + 1); - return 0; -} - -$ dmd -betterC example.d -$ ./example -1 + 1 = 2! -``` - -The resulting binary looks a lot like the equivalent C binary. In fact, if you rewrote a C library in betterC, it could still link to code that had been compiled against the C version, and work without changes. Walter Bright wrote a good article walking through all [the changes needed to convert a real C program to betterC][8]. - -You don’t actually need the `-betterC` switch just to write C-like code in D. It’s only needed in special cases where you simply can’t have the D runtime. But let me point out some of my favourite D features that still work with `-betterC`. - -#### `static assert()` - -This allows verifying some assumption at compile time. - -``` -static assert(kNumInducers < 16); -``` - -Systems code often makes assumptions about alignment or structure size or other things. With `static assert`, it’s possible to not only document these assumptions, but trigger a compilation error if someone breaks them by adding a struct member or something. - -#### Slices - -Typical C code is full of pointer/length pairs, and it’s a common bug for them to go out of sync. Slices are a simple and super-useful abstraction for a range of memory defined by a pointer and length. Instead of code like this: - -``` -buffer_p += offset; -buffer_len -= offset; // Got to update both -``` - -You can use this much-less-bug-prone alternative: - -``` -buffer = buffer[offset..$]; -``` - -A slice is nothing but a pointer/length pair with first-class syntactic support. - -Update: [Walter Bright has written more about pointer/length pair problem in C][9]. - -#### Compile Time Function Evaluation (CTFE) - -[Many functions can be evaluated at compile time.][10] - -``` -long factorial(int n) pure -{ - assert (n >= 0 && n <= 20); - long ret = 1; - foreach (j; 2..n+1) ret *= j; - return ret; -} - -// Statically allocated array -// Size is calculated at compile time -Permutation[factorial(kNumThings)] permutation_table; -``` - -#### `scope` Guards - -Code in one part of a function is often coupled to cleanup code in a later part. Failing to match this code up correctly is another common source of bugs (especially when multiple control flow paths are involved). D’s scope guards make it simple to get this stuff right: - -``` -p = malloc(128); -// free() will be called when the current scope exits -scope (exit) free(p); -// Put whatever if statements, or loops, or early returns you like here -``` - -You can even have multiple scope guards in a scope, or have nested scopes. The cleanup routines will be called when needed, in the right order. - -D also supports RAII using struct destructors. - -#### `const` and `immutable` - -It’s a popular myth that `const` in C and C++ is useful for compiler optimisations. Walter Bright has complained that every time he thought of a new `const`-based optimisation for C++, he eventually discovered it didn’t work in real code. So he made some changes to `const` semantics for D, and added `immutable`. You can read more in the [D `const` FAQ][11]. - -#### `pure` - -Functional purity can be enforced. I’ve written about [some of the benefits of the `pure` keyword before][12]. - -#### `@safe` - -SafeD is a subset of D that forbids risky language features like pointer typecasts and inline assembly. Code marked `@safe` is enforced by the compiler to not use these features, so that risky code can be limited to the small percentage of the application that needs it. You can [read more about SafeD in this article][13]. - -#### Metaprogramming - -Like I hinted earlier, metaprogramming has got a bad reputation among some C++ programmers. But [D has the advantage of making metaprogramming less interesting][14], so D programmers tend to just do it when it’s useful, and not as a fun puzzle. - -D has great support for [compile-time reflection][15]. In most cases, compile-time reflection can solve the same problems as run-time reflection, but with compile-time guarantees. Compile-time reflection can also be used to implement run-time reflection where it’s truly needed. - -Need the names of an enumerated type as an array? - -``` -enum State -{ - stopped, - starting, - running, - stopping, -} - -string[] state_names = [__traits(allMembers, State)]; -``` - -Thanks to D’s metaprogramming, the standard library has many nice, type-safe tools, like this [compile-time checked bit flag enum][16]. - -I’ve written more about [using metaprogramming in `-betterC` code][17]. - -#### No Preprocessor - -Okay, this a non-feature as a feature, but D has no equivalent to C’s preprocessor. All its sane use-cases are replaced with native language features, like [manifest constants][18] and [templates][19]. That includes proper [modules][20] support, which means D can break free of the limitations of that old `#include` hack. - -### Normal D - -C-like D code can be written and compiled as normal D code without the `-betterC` switch. The difference is that normal D code is linked to the D runtime, which supports higher-level features, the most obvious ones being garbage collection and object-oriented classes. Some people have confused the D runtime with something like the Java virtual machine, so I once wrote [an article explaining exactly what it is][7] (spoiler: it’s like the C and C++ runtimes, but with more features). - -Even with the runtime, compiled D is not much different from compiled C++. Sometimes I like to write throwaway code to, say, experiment with a new Linux system call or something. I used to think the best language for that is plain old C, but now I always use D. - -D doesn’t natively support `#include`ing C code, but for nice APIs that don’t have a lot of preprocessor craziness (like most of Linux) I usually just write [ad-hoc bindings][21]. Many popular C libraries have maintained D bindings, which can be found in the [Dub registry][22], or in [the Derelict project][23], or in the newer [BindBC project][24]. There are also tools for automated bindings, including the awesome [dpp tool][25] that brings `#include` support directly to D code. - -Update: This post has got a lot of attention from people who’ve never heard of D before. If you’re interested in learning D, I recommend - - * [The DLang Tour][26] for a quick dive into the language - * [Ali Çehreli’s Programming in D book][27] if you prefer something in-depth - * [The D forum Learn group][28] or [IRC channel][29] to get answers to your questions - - - --------------------------------------------------------------------------------- - -via: https://theartofmachinery.com/2019/04/05/d_as_c_replacement.html - -作者:[Simon Arneaud][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://theartofmachinery.com -[b]: https://github.com/lujun9972 -[1]: https://swaywm.org/ -[2]: https://drewdevault.com/2019/03/25/Rust-is-not-a-good-C-replacement.html -[3]: https://dlang.org -[4]: https://wiki.dlang.org/Defining_custom_print_format_specifiers -[5]: https://dlang.org/phobos/std_format.html#format -[6]: https://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible -[7]: /2017/06/04/what_is_the_d_runtime.html -[8]: https://dlang.org/blog/2018/06/11/dasbetterc-converting-make-c-to-d/ -[9]: https://www.digitalmars.com/articles/b44.html -[10]: https://dlang.org/spec/function.html#interpretation -[11]: https://dlang.org/articles/const-faq.html -[12]: /2016/03/28/dirtying_pure_functions_can_be_useful.html -[13]: https://dlang.org/blog/2016/09/28/how-to-write-trusted-code-in-d/ -[14]: https://epi.github.io/2017/03/18/less_fun.html -[15]: https://dlang.org/spec/traits.html -[16]: https://dlang.org/phobos/std_typecons.html#BitFlags -[17]: /2018/08/13/inheritance_and_polymorphism_2.html -[18]: https://dlang.org/spec/enum.html#manifest_constants -[19]: https://tour.dlang.org/tour/en/basics/templates -[20]: https://ddili.org/ders/d.en/modules.html -[21]: https://wiki.dlang.org/Bind_D_to_C -[22]: https://code.dlang.org/ -[23]: https://github.com/DerelictOrg -[24]: https://github.com/BindBC -[25]: https://github.com/atilaneves/dpp -[26]: https://tour.dlang.org/ -[27]: https://ddili.org/ders/d.en/index.html -[28]: https://forum.dlang.org/group/learn -[29]: irc://irc.freenode.net/d diff --git a/sources/talk/20190410 Anti-lasers could give us perfect antennas, greater data capacity.md b/sources/talk/20190410 Anti-lasers could give us perfect antennas, greater data capacity.md deleted file mode 100644 index 2d2f4d5c05..0000000000 --- a/sources/talk/20190410 Anti-lasers could give us perfect antennas, greater data capacity.md +++ /dev/null @@ -1,69 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Anti-lasers could give us perfect antennas, greater data capacity) -[#]: via: (https://www.networkworld.com/article/3386879/anti-lasers-could-give-us-perfect-antennas-greater-data-capacity.html#tk.rss_all) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Anti-lasers could give us perfect antennas, greater data capacity -====== -Anti-lasers get close to providing a 100% efficient signal channel for data, say engineers. -![Guirong Hao / Valery Brozhinsky / Getty Images][1] - -Playing laser light backwards could adjust data transmission signals so that they perfectly match receiving antennas. The fine-tuning of signals like this, not achieved with such detail before, could create more capacity for ever-increasing data demand. - -"Imagine, for example, that you could adjust a cell phone signal exactly the right way, so that it is perfectly absorbed by the antenna in your phone," says Stefan Rotter of the Institute for Theoretical Physics of Technische Universität Wien (TU Wien) in a [press release][2]. - -Rotter is talking about “Random Anti-Laser,” a project he has been a part of. The idea behind it is that if one could time-reverse a laser, then the laser (right now considered the best light source ever built) becomes the best available light absorber. Perfect absorption of a signal wave would mean that all of the data-carrying energy is absorbed by the receiving device, thus it becomes 100% efficient. - -**[ Related:[What is 5G wireless? How it will change networking as we know it?][3] ]** - -“The easiest way to think about this process is in terms of a movie showing a conventional laser sending out laser light, which is played backwards,” the TU Wein article says. The anti-laser is the exact opposite of the laser — instead of sending specific colors perfectly when energy is applied, it receives specific colors perfectly. - -Perfect absorption of a signal wave would mean that all of the data-carrying energy is absorbed by the receiving device, thus it becomes 100% efficient. - -Counter-intuitively, it’s the random scattering of light in all directions that’s behind the engineering. However, the Vienna, Austria, university group performs precise calculations on those scattering, splitting signals. That lets the researchers harness the light. - -### How the anti-laser technology works - -The microwave-based, experimental device the researchers have built in the lab to prove the idea doesn’t just potentially apply to cell phones; wireless internet of things (IoT) devices would also get more data throughput. How it works: The device consists of an antenna-containing chamber encompassed by cylinders, all arranged haphazardly, the researchers explain. The cylinders distribute an elaborate, arbitrary wave pattern “similar to [throwing] stones in a puddle of water, at which water waves are deflected.” - -Measurements then take place to identify exactly how the signals return. The team involved, which also includes collaborators from the University of Nice, France, then “characterize the random structure and calculate the wave front that is completely swallowed by the central antenna at the right absorption strength.” Ninety-nine point eight percent is absorbed, making it remarkably and virtually perfect. Data throughput, range, and other variables thus improve. - -**[[Take this mobile device management course from PluralSight and learn how to secure devices in your company without degrading the user experience.][4] ]** - -Achieving perfect antennas has been pretty much only theoretically possible for engineers to date. Reflected energy (RF back into the transmitter from antenna inefficiencies) has always been an issue in general. Reflections from surfaces, too, have been always been a problem. - -“Think about a mobile phone signal that is reflected several times before it reaches your cell phone,” Rotter says. It’s not easy to get the tuning right — as the antennas’ physical locations move, reflected surfaces become different. - -### Scattering lasers - -Scattering, similar to that used in this project, is becoming more important in communications overall. “Waves that are being scattered in a complex way are really all around us,” the group says. - -An example is random-lasers (which the group’s anti-laser is based on) that unlike traditional lasers, do not use reflective surfaces but trap scattered light and then “emit a very complicated, system-specific laser field when supplied with energy.” The anti-random-laser developed by Rotter and his group simply reverses that in time: - -“Instead of a light source that emits a specific wave depending on its random inner structure, it is also possible to build the perfect absorber.” The anti-random-laser. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3386879/anti-lasers-could-give-us-perfect-antennas-greater-data-capacity.html#tk.rss_all - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/03/data_cubes_transformation_conversion_by_guirong_hao_gettyimages-1062387214_plus_abstract_binary_by_valerybrozhinsky_gettyimages-865457032_3x2_2400x1600-100790211-large.jpg -[2]: https://www.tuwien.ac.at/en/news/news_detail/article/126574/ -[3]: https://www.networkworld.com/article/3203489/lan-wan/what-is-5g-wireless-networking-benefits-standards-availability-versus-lte.html -[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190415 Nyansa-s Voyance expands to the IoT.md b/sources/talk/20190415 Nyansa-s Voyance expands to the IoT.md deleted file mode 100644 index e893c86d53..0000000000 --- a/sources/talk/20190415 Nyansa-s Voyance expands to the IoT.md +++ /dev/null @@ -1,75 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Nyansa’s Voyance expands to the IoT) -[#]: via: (https://www.networkworld.com/article/3388301/nyansa-s-voyance-expands-to-the-iot.html#tk.rss_all) -[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) - -Nyansa’s Voyance expands to the IoT -====== - -![Brandon Mowinkel \(CC0\)][1] - -Nyansa announced today that their flagship Voyance product can now apply its AI-based secret sauce to [IoT][2] devices, over and above the networking equipment and IT endpoints it could already manage. - -Voyance – a network management product that leverages AI to automate the discovery of devices on the network and identify unusual behavior – has been around for two years now, and Nyansa says that it’s being used to observe a total of 25 million client devices operating across roughly 200 customer networks. - -**More on IoT:** - - * [Most powerful Internet of Things companies][3] - * [10 Hot IoT startups to watch][4] - * [The 6 ways to make money in IoT][5] - * [][6] [Blockchain, service-centric networking key to IoT success][7] - * [Getting grounded in IoT networking and security][8] - * [Building IoT-ready networks must become a priority][9] - * [What is the Industrial IoT? [And why the stakes are so high]][10] - - - -It’s a software-only product (available either via public SaaS or private cloud) that works by scanning a customer’s network and identifying every device attached to it, then establishing a behavioral baseline that will let it flag suspicious actions (e.g., sending a lot more data than other devices of its kind, connecting to unusual servers) and even perform automated root-cause analysis of network issues. - -The process doesn’t happen instantaneously, particularly the creation of the baseline, but it’s designed to be minimally invasive to existing network management frameworks and easy to implement. - -Nyansa said that the medical field has been one of the key targets for the newly IoT-enabled iteration of Voyance, and one early customer – Baptist Health, a Florida-based healthcare company that runs four hospitals and several other clinics and practices – said that Voyance IoT has offered a new level of visibility into the business’ complex array of connected diagnostic and treatment machines. - -“In the past we didn’t have the ability to identify security concerns in this way, related to rogue devices on the enterprise network, and now we’re able to do that,” said CISO Thad Phillips. - -While spiraling network complexity isn’t an issue confined to the IoT, there’s a strong argument that the number and variety of devices connected to an IoT-enabled network represent a new challenge to network management, particularly in light of the fact that many such devices aren’t particularly secure. - -“They’re not manufactured by networking vendors or security vendors, so for a performance standpoint, they have a lot of quirks … and on the security side, that’s sort of a big problem there as well,” said Anand Srinivas, Nyansa’s co-founder and CTO. - -Enabling the Voyance platform to identify and manage IoT devices along with traditional endpoints seems to be mostly a matter of adding new device signatures to the system, but Enterprise Management Associates research director Shamus McGillicuddy said that, while the system’s designed for automation and ease of use, AIOps products like Voyance do need to be managed to make sure that they’re functioning correctly. - -“Anything based on machine learning is going to take a while to make sure it understands your environment and you might have to retrain it,” he said. “There’s always going to be more and more things connecting to IP networks, and it’s just going to be a question of building up a database.” - -Voyance IoT is available now. Pricing starts at $16,000 per year, and goes up with the number of total devices managed. (Current Voyance users can manage up to 100 IoT devices at no additional cost.) - -Join the Network World communities on [Facebook][11] and [LinkedIn][12] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3388301/nyansa-s-voyance-expands-to-the-iot.html#tk.rss_all - -作者:[Jon Gold][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Jon-Gold/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/geometric_architecture_ceiling_structure_lines_connections_networks_perspective_by_brandon_mowinkel_cc0_via_unsplash_2400x1600-100788530-large.jpg -[2]: https://www.networkworld.com/article/3207535/what-is-iot-how-the-internet-of-things-works.html -[3]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[4]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[5]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[6]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[7]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[8]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[9]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[10]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[11]: https://www.facebook.com/NetworkWorld/ -[12]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190416 Two tools to help visualize and simplify your data-driven operations.md b/sources/talk/20190416 Two tools to help visualize and simplify your data-driven operations.md deleted file mode 100644 index 8a44c56ca7..0000000000 --- a/sources/talk/20190416 Two tools to help visualize and simplify your data-driven operations.md +++ /dev/null @@ -1,59 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Two tools to help visualize and simplify your data-driven operations) -[#]: via: (https://www.networkworld.com/article/3389756/two-tools-to-help-visualize-and-simplify-your-data-driven-operations.html#tk.rss_all) -[#]: author: (Kent McNeil, Vice President of Software, Ciena Blue Planet ) - -Two tools to help visualize and simplify your data-driven operations -====== -Amidst the rising complexity of networks, and influx of data, service providers are striving to keep operational complexity under control. Blue Planet’s Kent McNeil explains how they can turn this challenge into a huge opportunity, and in fact reduce operational effort by exploiting state-of-the-art graph database visualization and delta-based federation technologies. -![danleap][1] - -**Build the picture: Visualize your data** - -The Internet of Things (IoT), 5G, smart technology, virtual reality – all these applications guarantee one thing for communications service providers (CSPs): more data. As networks become increasingly overwhelmed by mounds of data, CSPs are on the hunt for ways to make the most of the intelligence collected and are looking for ways to monetize their services, provide more customizable offerings, and enhance their network performance. - -Customer analytics has gone some way towards fulfilling this need for greater insights, but with the rise in the volume and variety of consumer and IoT applications, the influx of data will increase at a phenomenal rate. The data includes not only customer-related data, but also device and network data, adding complexity to the picture. CSPs must harness this information to understand the relationships between any two things, to understand the connections within their data and to ultimately, leverage it for a better customer experience. - -**See the upward graphical trend with graph databases** - -Traditional relational databases certainly have their use, but graph databases offer a novel perspective. The visual representation between the component parts enables CSPs to understand and analyze the characteristics, as well as to act in a timely manner when confronted with any discrepancies. - -Graph databases can help CSPs tackle this new challenge, ensuring the data is not just stored, but also processed and analyzed. It enables complex network questions to be asked and answered, ensuring that CSPs are not sidelined as “dumb pipes” in the IoT movement. - -The use of graph databases has started to become more mainstream, as businesses see the benefits. IBM conducted a generic industry study, entitled “The State of Graph Databases Worldwide”, which found that people are moving to graph databases for speed, performance enhancement of applications, and streamlined operations. Ways in which businesses are using, or are planning to use, graph technology is highest for network and IT operations, followed by master data management. Performance is a key factor for CSPs, as is personalization, which enables support for more tailored service offerings. - -Another advantage of graph databases for CSPs is that of unravelling the complexity of network inventory in a clear, visualized picture – this capability gives CSPs a competitive advantage as speed and performance become increasingly paramount. This need for speed and reliability will increase tenfold as IoT continues its impressive global ramp-up. Operational complexity also grows as the influx of generated data produced by IoT will further challenge the scalability of existing operational environments. Graph databases can help CSPs tackle this new challenge, ensuring the data is not just stored, but also processed and analyzed. It enables complex network questions to be asked and answered, ensuring that CSPs are not sidelined as “dumb pipes” in the IoT movement. - -**Change the tide of data with delta-based federation** - -New data, updated data, corrected data, deleted data – all needs to be managed, in line with regulations, and instantaneously. But this capability does not exist in the reality of many CSP’s Operational Support Systems (OSS). Many still battle with updating data and relying on full uploads of network inventory in order to perform key service fulfillment and assurance tasks. This method is time-intensive and risky due to potential conflicts and inaccuracies. With data being accessed from a variety of systems, CSPs must have a way to effectively hone in on only what is required. - -Integrating network data into one simplified system limits the impact on the legacy OSS systems. This allows each OSS to continue its specific role, yet to feed data into a single interface, hence enabling teams to see the complete picture and gain efficiencies while launching new services or pinpointing and resolving service and network issues. - -A delta-based federation model ensures that an accurate picture is presented, and only essential changes are conducted reliably and quickly. This simplified method filters the delta changes, reducing the time involved in updating, and minimizing the system load and risks. A validation process takes place to catch any errors or issues with the data, so CSPs can apply checks and retain control over modifications. Integrating network data into one simplified system limits the impact on the legacy OSS systems. This allows each OSS to continue its specific role, yet to feed data into a single interface, hence enabling teams to see the complete picture and gain efficiencies while launching new services or pinpointing and resolving service and network issues. - -**Ride the wave** - -25 billion connected things are predicted by Gartner on a global scale by 2021 and CSPs are already struggling with the current levels of data, which Gartner estimates at 14.2 billion in 2019. Over the last decade, CSPs have faced significant rises in the levels of data consumed as demand for new services and higher bandwidth applications has taken off. This data wave is set to continue and CSPs have two important tools at their disposal helping them ride the wave. Firstly, CSPs have specialist, legacy OSS already in place which they can leverage as a basis for integrating data and implementing optimized systems. Secondly, they can utilize new technologies in database inventory management: graph databases and delta-based federation. The advantages of effectively integrating network data, visualizing it, and creating a clear map of the inter-connections, enable CSPs to make critical decisions more quickly and accurately, resulting in most optimized and informed service operations. - -[Watch this video to learn more about Blue Planet][2] - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3389756/two-tools-to-help-visualize-and-simplify-your-data-driven-operations.html#tk.rss_all - -作者:[Kent McNeil, Vice President of Software, Ciena Blue Planet][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/istock-165721901-100793858-large.jpg -[2]: https://www.blueplanet.com/resources/IT-plus-network-now-a-powerhouse-combination.html?utm_campaign=X1058319&utm_source=NWW&utm_term=BPVideo&utm_medium=sponsoredpost4 diff --git a/sources/talk/20190416 What SDN is and where it-s going.md b/sources/talk/20190416 What SDN is and where it-s going.md deleted file mode 100644 index 381c227b65..0000000000 --- a/sources/talk/20190416 What SDN is and where it-s going.md +++ /dev/null @@ -1,146 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What SDN is and where it’s going) -[#]: via: (https://www.networkworld.com/article/3209131/what-sdn-is-and-where-its-going.html#tk.rss_all) -[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) - -What SDN is and where it’s going -====== -Software-defined networking (SDN) established a foothold in cloud computing, intent-based networking, and network security, with Cisco, VMware, Juniper and others leading the charge. -![seedkin / Getty Images][1] - -Hardware reigned supreme in the networking world until the emergence of software-defined networking (SDN), a category of technologies that separate the network control plane from the forwarding plane to enable more automated provisioning and policy-based management of network resources. - -SDN's origins can be traced to a research collaboration between Stanford University and the University of California at Berkeley that ultimately yielded the [OpenFlow][2] protocol in the 2008 timeframe. - -**[Learn more about the[difference between SDN and NFV][3]. Get regularly scheduled insights by [signing up for Network World newsletters][4]]** - -OpenFlow is only one of the first SDN canons, but it's a key component because it started the networking software revolution. OpenFlow defined a programmable network protocol that could help manage and direct traffic among routers and switches no matter which vendor made the underlying router or switch. - -In the years since its inception, SDN has evolved into a reputable networking technology offered by key vendors including Cisco, VMware, Juniper, Pluribus and Big Switch. The Open Networking Foundation develops myriad open-source SDN technologies as well. - -"Datacenter SDN no longer attracts breathless hype and fevered expectations, but the market is growing healthily, and its prospects remain robust," wrote Brad Casemore, IDC research vice president, data center networks, in a recent report, [_Worldwide Datacenter Software-Defined Networking Forecast, 2018–2022_][5]*. "*Datacenter modernization, driven by the relentless pursuit of digital transformation and characterized by the adoption of cloudlike infrastructure, will help to maintain growth, as will opportunities to extend datacenter SDN overlays and fabrics to multicloud application environments." - -SDN will be increasingly perceived as a form of established, conventional networking, Casemore said. - -IDC estimates that the worldwide data center SDN market will be worth more than $12 billion in 2022, recording a CAGR of 18.5% during the 2017–2022 period. The market generated revenue of nearly $5.15 billion in 2017, up more than 32.2% from 2016. - -In 2017, the physical network represented the largest segment of the worldwide datacenter SDN market, accounting for revenue of nearly $2.2 billion, or about 42% of the overall total revenue. In 2022, however, the physical network is expected to claim about $3.65 billion in revenue, slightly less than the $3.68 billion attributable to network virtualization overlays/SDN controller software but more than the $3.18 billion for SDN applications. - -“We're now at a point where SDN is better understood, where its use cases and value propositions are familiar to most datacenter network buyers and where a growing number of enterprises are finding that SDN offerings offer practical benefits,” Casemore said. “With SDN growth and the shift toward software-based network automation, the network is regaining lost ground and moving into better alignment with a wave of new application workloads that are driving meaningful business outcomes.” - -### **What is SDN? ** - -The idea of programmability is the basis for the most precise definition of what SDN is: technology that separates the control plane management of network devices from the underlying data plane that forwards network traffic. - -IDC broadens that definition of SDN by stating: “Datacenter SDN architectures feature software-defined overlays or controllers that are abstracted from the underlying network hardware, offering intent-or policy-based management of the network as a whole. This results in a datacenter network that is better aligned with the needs of application workloads through automated (thereby faster) provisioning, programmatic network management, pervasive application-oriented visibility, and where needed, direct integration with cloud orchestration platforms.” - -The driving ideas behind the development of SDN are myriad. For example, it promises to reduce the complexity of statically defined networks; make automating network functions much easier; and allow for simpler provisioning and management of networked resources, everywhere from the data center to the campus or wide area network. - -Separating the control and data planes is the most common way to think of what SDN is, but it is much more than that, said Mike Capuano, chief marketing officer for [Pluribus][6]. - -“At its heart SDN has a centralized or distributed intelligent entity that has an entire view of the network, that can make routing and switching decisions based on that view,” Capuano said. “Typically, network routers and switches only know about their neighboring network gear. But with a properly configured SDN environment, that central entity can control everything, from easily changing policies to simplifying configuration and automation across the enterprise.” - -### How does SDN support edge computing, IoT and remote access? - -A variety of networking trends have played into the central idea of SDN. Distributing computing power to remote sites, moving data center functions to the [edge][7], adopting cloud computing, and supporting [Internet of Things][8] environments – each of these efforts can be made easier and more cost efficient via a properly configured SDN environment. - -Typically in an SDN environment, customers can see all of their devices and TCP flows, which means they can slice up the network from the data or management plane to support a variety of applications and configurations, Capuano said. So users can more easily segment an IoT application from the production world if they want, for example. - -Some SDN controllers have the smarts to see that the network is getting congested and, in response, pump up bandwidth or processing to make sure remote and edge components don’t suffer latency. - -SDN technologies also help in distributed locations that have few IT personnel on site, such as an enterprise branch office or service provider central office, said Michael Bushong, vice president of enterprise and cloud marketing at Juniper Networks. - -“Naturally these places require remote and centralized delivery of connectivity, visibility and security. SDN solutions that centralize and abstract control and automate workflows across many places in the network, and their devices, improve operational reliability, speed and experience,” Bushong said. - -### **How does SDN support intent-based networking?** - -Intent-based networking ([IBN][9]) has a variety of components, but basically is about giving network administrators the ability to define what they want the network to do, and having an automated network management platform create the desired state and enforce policies to ensure what the business wants happens. - -“If a key tenet of SDN is abstracted control over a fleet of infrastructure, then the provisioning paradigm and dynamic control to regulate infrastructure state is necessarily higher level,” Bushong said. “Policy is closer to declarative intent, moving away from the minutia of individual device details and imperative and reactive commands.” - -IDC says that intent-based networking “represents an evolution of SDN to achieve even greater degrees of operational simplicity, automated intelligence, and closed-loop functionality.” - -For that reason, IBN represents a notable milestone on the journey toward autonomous infrastructure that includes a self-driving network, which will function much like the self-driving car, producing desired outcomes based on what network operators and their organizations wish to accomplish, Casemore stated. - -“While the self-driving car has been designed to deliver passengers safely to their destination with minimal human intervention, the self-driving network, as part of autonomous datacenter infrastructure, eventually will achieve similar outcomes in areas such as network provisioning, management, and troubleshooting — delivering applications and data, dynamically creating and altering network paths, and providing security enforcement with minimal need for operator intervention,” Casemore stated. - -While IBN technologies are relatively young, Gartner says by 2020, more than 1,000 large enterprises will use intent-based networking systems in production, up from less than 15 in the second quarter of 2018. - -### **How does SDN help customers with security?** - -SDN enables a variety of security benefits. A customer can split up a network connection between an end user and the data center and have different security settings for the various types of network traffic. A network could have one public-facing, low security network that does not touch any sensitive information. Another segment could have much more fine-grained remote access control with software-based [firewall][10] and encryption policies on it, which allow sensitive data to traverse over it. - -“For example, if a customer has an IoT group it doesn’t feel is all that mature with regards to security, via the SDN controller you can segment that group off away from the critical high-value corporate traffic,” Capuano stated. “SDN users can roll out security policies across the network from the data center to the edge and if you do all of this on top of white boxes, deployments can be 30 – 60 percent cheaper than traditional gear.” - -The ability to look at a set of workloads and see if they match a given security policy is a key benefit of SDN, especially as data is distributed, said Thomas Scheibe, vice president of product management for Cisco’s Nexus and ACI product lines. - -"The ability to deploy a whitelist security model like we do with ACI [Application Centric Infrastructure] that lets only specific entities access explicit resources across your network fabric is another key security element SDN enables," Scheibe said. - -A growing number of SDN platforms now support [microsegmentation][11], according to Casemore. - -“In fact, micro-segmentation has developed as a notable use case for SDN. As SDN platforms are extended to support multicloud environments, they will be used to mitigate the inherent complexity of establishing and maintaining consistent network and security policies across hybrid IT landscapes,” Casemore said. - -### **What is SDN’s role in cloud computing?** - -SDN’s role in the move toward [private cloud][12] and [hybrid cloud][13] adoption seems a natural. In fact, big SDN players such as Cisco, Juniper and VMware have all made moves to tie together enterprise data center and cloud worlds. - -Cisco's ACI Anywhere package would, for example, let policies configured through Cisco's SDN APIC (Application Policy Infrastructure Controller) use native APIs offered by a public-cloud provider to orchestrate changes within both the private and public cloud environments, Cisco said. - -“As organizations look to scale their hybrid cloud environments, it will be critical to leverage solutions that help improve productivity and processes,” said [Bob Laliberte][14], a senior analyst with Enterprise Strategy Group, in a recent [Network World article][15]. “The ability to leverage the same solution, like Cisco’s ACI, in your own private-cloud environment as well as across multiple public clouds will enable organizations to successfully scale their cloud environments.” - -Growth of public and private clouds and enterprises' embrace of distributed multicloud application environments will have an ongoing and significant impact on data center SDN, representing both a challenge and an opportunity for vendors, said IDC’s Casemore. - -“Agility is a key attribute of digital transformation, and enterprises will adopt architectures, infrastructures, and technologies that provide for agile deployment, provisioning, and ongoing operational management. In a datacenter networking context, the imperative of digital transformation drives adoption of extensive network automation, including SDN,” Casemore said. - -### Where does SD-WAN fit in? - -The software-defined wide area network ([SD-WAN][16]) is a natural application of SDN that extends the technology over a WAN. While the SDN architecture is typically the underpinning in a data center or campus, SD-WAN takes it a step further. - -At its most basic, SD-WAN lets companies aggregate a variety of network connections – including MPLS, 4G LTE and DSL – into a branch or network edge location and have a software management platform that can turn up new sites, prioritize traffic and set security policies. - -SD-WAN's driving principle is to simplify the way big companies turn up new links to branch offices, better manage the way those links are utilized – for data, voice or video – and potentially save money in the process. - -[SD-WAN][17] lets networks route traffic based on centrally managed roles and rules, no matter what the entry and exit points of the traffic are, and with full security. For example, if a user in a branch office is working in Office365, SD-WAN can route their traffic directly to the closest cloud data center for that app, improving network responsiveness for the user and lowering bandwidth costs for the business. - -"SD-WAN has been a promised technology for years, but in 2019 it will be a major driver in how networks are built and re-built," Anand Oswal, senior vice president of engineering in Cisco’s Enterprise Networking Business, said a Network World [article][18] earlier this year. - -It's a profoundly hot market with tons of players including [Cisco][19], VMware, Silver Peak, Riverbed, Aryaka, Fortinet, Nokia and Versa. - -IDC says the SD-WAN infrastructure market will hit $4.5 billion by 2022, growing at a more than 40% yearly clip between now and then. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3209131/what-sdn-is-and-where-its-going.html#tk.rss_all - -作者:[Michael Cooney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Michael-Cooney/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/what-is-sdn_2_where-is-it-going_arrows_fork-in-the-road-100793314-large.jpg -[2]: https://www.networkworld.com/article/2202144/data-center-faq-what-is-openflow-and-why-is-it-needed.html -[3]: https://www.networkworld.com/article/3206709/lan-wan/what-s-the-difference-between-sdn-and-nfv.html -[4]: https://www.networkworld.com/newsletters/signup.html -[5]: https://www.idc.com/getdoc.jsp?containerId=US43862418 -[6]: https://www.networkworld.com/article/3192318/pluribus-recharges-expands-software-defined-network-platform.html -[7]: https://www.networkworld.com/article/3224893/what-is-edge-computing-and-how-it-s-changing-the-network.html -[8]: https://www.networkworld.com/article/3207535/what-is-iot-how-the-internet-of-things-works.html -[9]: https://www.networkworld.com/article/3202699/what-is-intent-based-networking.html -[10]: https://www.networkworld.com/article/3230457/what-is-a-firewall-perimeter-stateful-inspection-next-generation.html -[11]: https://www.networkworld.com/article/3247672/what-is-microsegmentation-how-getting-granular-improves-network-security.html -[12]: https://www.networkworld.com/article/2159885/cloud-computing-gartner-5-things-a-private-cloud-is-not.html -[13]: https://www.networkworld.com/article/3233132/what-is-hybrid-cloud-computing.html -[14]: https://www.linkedin.com/in/boblaliberte90/ -[15]: https://www.networkworld.com/article/3336075/cisco-serves-up-flexible-data-center-options.html -[16]: https://www.networkworld.com/article/3031279/sd-wan-what-it-is-and-why-you-ll-use-it-one-day.html -[17]: https://www.networkworld.com/article/3031279/sd-wan/sd-wan-what-it-is-and-why-you-ll-use-it-one-day.html -[18]: https://www.networkworld.com/article/3332027/cisco-touts-5-technologies-that-will-change-networking-in-2019.html -[19]: https://www.networkworld.com/article/3322937/what-will-be-hot-for-cisco-in-2019.html diff --git a/sources/talk/20190417 Clearing up confusion between edge and cloud.md b/sources/talk/20190417 Clearing up confusion between edge and cloud.md deleted file mode 100644 index 722051e8a7..0000000000 --- a/sources/talk/20190417 Clearing up confusion between edge and cloud.md +++ /dev/null @@ -1,69 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Clearing up confusion between edge and cloud) -[#]: via: (https://www.networkworld.com/article/3389364/clearing-up-confusion-between-edge-and-cloud.html#tk.rss_all) -[#]: author: (Anne Taylor https://www.networkworld.com/author/Anne-Taylor/) - -Clearing up confusion between edge and cloud -====== -The benefits of edge computing are not just hype; however, that doesn’t mean you should throw cloud computing initiatives to the wind. -![iStock][1] - -Edge computing and cloud computing are sometimes discussed as if they’re mutually exclusive approaches to network infrastructure. While they may function in different ways, utilizing one does not preclude the use of the other. - -Indeed, [Futurum Research][2] found that, among companies that have deployed edge projects, only 15% intend to separate these efforts from their cloud computing initiatives — largely for security or compartmentalization reasons. - -So then, what’s the difference, and how do edge and cloud work together? - -**Location, location, location** - -Moving data and processing to the cloud, as opposed to on-premises data centers, has enabled the business to move faster, more efficiently, less expensively — and in many cases, more securely. - -Yet cloud computing is not without challenges, particularly: - - * Users will abandon a graphics-heavy website if it doesn’t load quickly. So, imagine the lag for compute-heavy processing associated artificial intelligence or machine learning functions. - - * The strength of network connectivity is crucial for large data sets. As enterprises increasingly generate data, particularly with the adoption of Internet of Things (IoT), traditional cloud connections will be insufficient. - - - - -To make up for the lack of speed and connectivity with cloud, processing for mission-critical applications will need to occur closer to the data source. Maybe that’s a robot on the factory floor, digital signage at a retail store, or an MRI machine in a hospital. That’s edge computing, which reduces the distance the data must travel and thereby boosts the performance and reliability of applications and services. - -**One doesn’t supersede the other** - -That said, the benefits gained by edge computing don’t negate the need for cloud. In many cases, IT will now become a decision-maker in terms of best usage for each. For example, edge might make sense for devices running processing-power-hungry apps such as IoT, artificial intelligence, and machine learning. And cloud will work for apps where time isn’t necessarily of the essence, like inventory or big-data projects. - -> “By being able to triage the types of data processing on the edge versus that heading to the cloud, we can keep both systems running smoothly – keeping our customers and employees safe and happy,” [writes Daniel Newman][3], principal analyst for Futurum Research. - -And in reality, edge will require cloud. “To enable digital transformation, you have to build out the edge computing side and connect it with the cloud,” [Tony Antoun][4], senior vice president of edge and digital at GE Digital, told _Automation World_. “It’s a journey from the edge to the cloud and back, and the cycle keeps continuing. You need both to enrich and boost the business and take advantage of different points within this virtual lifecycle.” - -**Ensuring resiliency of cloud and edge** - -Both edge and cloud computing require careful consideration to the underlying processing power. Connectivity and availability, no matter the application, are always critical measures. - -But especially for the edge, it will be important to have a resilient architecture. Companies should focus on ensuring security, redundancy, connectivity, and remote management capabilities. - -Discover how your edge and cloud computing environments can coexist at [APC.com][5]. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3389364/clearing-up-confusion-between-edge-and-cloud.html#tk.rss_all - -作者:[Anne Taylor][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Anne-Taylor/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/istock-612507606-100793995-large.jpg -[2]: https://futurumresearch.com/edge-computing-from-edge-to-enterprise/ -[3]: https://futurumresearch.com/edge-computing-data-centers/ -[4]: https://www.automationworld.com/article/technologies/cloud-computing/its-not-edge-vs-cloud-its-both -[5]: https://www.apc.com/us/en/solutions/business-solutions/edge-computing.jsp diff --git a/sources/talk/20190417 Startup MemVerge combines DRAM and Optane into massive memory pool.md b/sources/talk/20190417 Startup MemVerge combines DRAM and Optane into massive memory pool.md deleted file mode 100644 index 71ddf70826..0000000000 --- a/sources/talk/20190417 Startup MemVerge combines DRAM and Optane into massive memory pool.md +++ /dev/null @@ -1,58 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Startup MemVerge combines DRAM and Optane into massive memory pool) -[#]: via: (https://www.networkworld.com/article/3389358/startup-memverge-combines-dram-and-optane-into-massive-memory-pool.html#tk.rss_all) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Startup MemVerge combines DRAM and Optane into massive memory pool -====== -MemVerge bridges two technologies that are already a bridge. -![monsitj / Getty Images][1] - -A startup called MemVerge has announced software to combine regular DRAM with Intel’s Optane DIMM persistent memory into a single clustered storage pool and without requiring any changes to applications. - -MemVerge has been working with Intel in developing this new hardware platform for close to two years. It offers what it calls a Memory-Converged Infrastructure (MCI) to allow existing apps to use Optane DC persistent memory. It's architected to integrate seamlessly with existing applications. - -**[ Read also:[Mass data fragmentation requires a storage rethink][2] ]** - -Optane memory is designed to sit between high-speed memory and [solid-state drives][3] (SSDs) and acts as a cache for the SSD, since it has speed comparable to DRAM but SSD persistence. With Intel’s new Xeon Scalable processors, this can make up to 4.5TB of memory available to a processor. - -Optane runs in one of two modes: Memory Mode and App Direct Mode. In Memory Mode, the Optane memory functions like regular memory and is not persistent. In App Direct Mode, it functions as the SSD cache but apps don’t natively support it. They need to be tweaked to function properly in Optane memory. - -As it was explained to me, apps aren’t designed for persistent storage because the data is already in memory on powerup rather than having to load it from storage. So, the app has to know memory doesn’t go away and that it does not need to shuffle data back and forth between storage and memory. Therefore, apps natively don’t work in persistent memory. - -### Why didn't Intel think of this? - -All of which really begs a question I can’t get answered, at least not immediately: Why didn’t Intel think of this when it created Optane in the first place? - -MemVerge has what it calls Distributed Memory Objects (DMO) hypervisor technology to provide a logical convergence layer to run data-intensive workloads at memory speed with guaranteed data consistency across multiple systems. This allows Optane memory to process and derive insights from the enormous amounts of data in real time. - -That’s because MemVerge’s technology makes random access as fast as sequential access. Normally, random access is slower than sequential because of all the jumping around with random access vs. reading one sequential file. But MemVerge can handle many small files as fast as it handles one large file. - -MemVerge itself is actually software, with a single API for both DRAM and Optane. It’s also available via a hyperconverged server appliance that comes with 2 Cascade Lake processors, up to 512 GB DRAM, 6TB of Optane memory, and 360TB of NVMe physical storage capacity. - -However, all of this is still vapor. MemVerge doesn’t expect to ship a beta product until at least June. - -Join the Network World communities on [Facebook][4] and [LinkedIn][5] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3389358/startup-memverge-combines-dram-and-optane-into-massive-memory-pool.html#tk.rss_all - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/big_data_center_server_racks_storage_binary_analytics_by_monsitj_gettyimages-951389152_3x2-100787358-large.jpg -[2]: https://www.networkworld.com/article/3323580/mass-data-fragmentation-requires-a-storage-rethink.html -[3]: https://www.networkworld.com/article/3326058/what-is-an-ssd.html -[4]: https://www.facebook.com/NetworkWorld/ -[5]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190417 Want to the know future of IoT- Ask the developers.md b/sources/talk/20190417 Want to the know future of IoT- Ask the developers.md deleted file mode 100644 index 4f96f34b2b..0000000000 --- a/sources/talk/20190417 Want to the know future of IoT- Ask the developers.md +++ /dev/null @@ -1,119 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Want to the know future of IoT? Ask the developers!) -[#]: via: (https://www.networkworld.com/article/3389877/want-to-the-know-future-of-iot-ask-the-developers.html#tk.rss_all) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -Want to the know future of IoT? Ask the developers! -====== -A new survey of IoT developers reveals that connectivity, performance, and standards are growing areas of concern as IoT projects hit production. -![Avgust01 / Getty Images][1] - -It may be a cliché that software developers rule the world, but if you want to know the future of an important technology, it pays to look at what the developers are doing. With that in mind, there are some real, on-the-ground insights for the entire internet of things (IoT) community to be gained in a new [survey of more than 1,700 IoT developers][2] (pdf) conducted by the [Eclipse Foundation][3]. - -### IoT connectivity concerns - -Perhaps not surprisingly, security topped the list of concerns, easily outpacing other IoT worries. But that's where things begin to get interesting. More than a fifth (21%) of IoT developers cited connectivity as a challenge, followed by data collection and analysis (19%), performance (18%), privacy (18%), and standards (16%). - -Connectivity rose to second place after being the number three IoT concern for developers last year. Worries over security and data collection and analysis, meanwhile, actually declined slightly year over year. (Concerns over performance, privacy, and standards also increased significantly from last year.) - -**[ Learn more:[Download a PDF bundle of five essential articles about IoT in the enterprise][4] ]** - -“If you look at the list of developers’ top concerns with IoT in the survey,” said [Mike Milinkovich][5], executive director of the Eclipse Foundation via email, “I think connectivity, performance, and standards stand out — those are speaking to the fact that the IoT projects are getting real, that they’re getting out of sandboxes and into production.” - -“With connectivity in IoT,” Milinkovich continued, “everything seems straightforward until you have a sensor in a corner somewhere — narrowband or broadband — and physical constraints make it hard to connect." - -He also cited a proliferation of incompatible technologies that is driving developer concerns over connectivity. - -![][6] - -### IoT standards and interoperability - -Milinkovich also addressed one of [my personal IoT bugaboos: interoperability][7]. “Standards is a proxy for interoperability” among products from different vendors, he explained, which is an “elusive goal” in industrial IoT (IIoT). - -**[[Learn Java from beginning concepts to advanced design patterns in this comprehensive 12-part course!][8] ]** - -“IIoT is about breaking down the proprietary silos and re-tooling the infrastructure that’s been in our factories and logistics for many years using OSS standards and implementations — standard sets of protocols as opposed to vendor-specific protocols,” he said. - -That becomes a big issue when you’re deploying applications in the field and different manufacturers are using different protocols or non-standard extensions to existing protocols and the machines can’t talk to each other. - -**[ Also read:[Interoperability is the key to IoT success][7] ]** - -“This ties back to the requirement of not just having open standards, but more robust implementations of those standards in open source stacks,” Milinkovich said. “To keep maturing, the market needs not just standards, but out-of-the-box interoperability between devices.” - -“Performance is another production-grade concern,” he said. “When you’re in development, you think you know the bottlenecks, but then you discover the real-world issues when you push to production.” - -### Cloudy developments for IoT - -The survey also revealed that in some ways, IoT is very much aligned with the larger technology community. For example, IoT use of public and hybrid cloud architectures continues to grow. Amazon Web Services (AWS) (34%), Microsoft Azure (23%), and Google Cloud Platform (20%) are the leading IoT cloud providers, just as they are throughout the industry. If anything, AWS’ lead may be smaller in the IoT space than it is in other areas, though reliable cloud-provider market share figures are notoriously hard to come by. - -But Milinkovich sees industrial IoT as “a massive opportunity for hybrid cloud” because many industrial IoT users are very concerned about minimizing latency with their factory data, what he calls “their gold.” He sees factories moving towards hybrid cloud environments, leveraging “modern infrastructure technology like Kubernetes, and building around open protocols like HTTP and MQTT while getting rid of the older proprietary protocols.” - -### How IoT development is different - -In some ways, the IoT development world doesn’t seem much different than wider software development. For example, the top IoT programming languages mirror [the popularity of those languages][9] over all, with C and Java ruling the roost. (C led the way on constrained devices, while Java was the top choice for gateway and edge nodes, as well as the IoT cloud.) - -![][10] - -But Milinkovich noted that when developing for embedded or constrained devices, the programmer’s interface to a device could be through any number of esoteric hardware connectors. - -“You’re doing development using emulators and simulators, and it’s an inherently different and more complex interaction between your dev environment and the target for your application,” he said. “Sometimes hardware and software are developed in tandem, which makes it even more complicated.” - -For example, he explained, building an IoT solution may bring in web developers working on front ends using JavaScript and Angular, while backend cloud developers control cloud infrastructure and embedded developers focus on building software to run on constrained devices. - -No wonder IoT developers have so many things to worry about. - -**More about IoT:** - - * [What is the IoT? How the internet of things works][11] - * [What is edge computing and how it’s changing the network][12] - * [Most powerful Internet of Things companies][13] - * [10 Hot IoT startups to watch][14] - * [The 6 ways to make money in IoT][15] - * [What is digital twin technology? [and why it matters]][16] - * [Blockchain, service-centric networking key to IoT success][17] - * [Getting grounded in IoT networking and security][4] - * [Building IoT-ready networks must become a priority][18] - * [What is the Industrial IoT? [And why the stakes are so high]][19] - - - -Join the Network World communities on [Facebook][20] and [LinkedIn][21] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3389877/want-to-the-know-future-of-iot-ask-the-developers.html#tk.rss_all - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/iot_internet_of_things_mobile_connections_by_avgust01_gettyimages-1055659210_2400x1600-100788447-large.jpg -[2]: https://drive.google.com/file/d/17WEobD5Etfw5JnoKC1g4IME_XCtPNGGc/view -[3]: https://www.eclipse.org/ -[4]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[5]: https://blogs.eclipse.org/post/mike-milinkovich/measuring-industrial-iot%E2%80%99s-evolution -[6]: https://images.idgesg.net/images/article/2019/04/top-developer-concerns-2019-eclipse-foundation-100793974-large.jpg -[7]: https://www.networkworld.com/article/3204529/interoperability-is-the-key-to-iot-success.html -[8]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fjava -[9]: https://blog.newrelic.com/technology/popular-programming-languages-2018/ -[10]: https://images.idgesg.net/images/article/2019/04/top-iot-programming-languages-eclipse-foundation-100793973-large.jpg -[11]: https://www.networkworld.com/article/3207535/internet-of-things/what-is-the-iot-how-the-internet-of-things-works.html -[12]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[13]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[14]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[15]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[16]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[17]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[18]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[19]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[20]: https://www.facebook.com/NetworkWorld/ -[21]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190418 -Fiber-in-air- 5G network research gets funding.md b/sources/talk/20190418 -Fiber-in-air- 5G network research gets funding.md deleted file mode 100644 index 4a82248cde..0000000000 --- a/sources/talk/20190418 -Fiber-in-air- 5G network research gets funding.md +++ /dev/null @@ -1,64 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: ('Fiber-in-air' 5G network research gets funding) -[#]: via: (https://www.networkworld.com/article/3389881/extreme-5g-network-research-gets-funding.html#tk.rss_all) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -'Fiber-in-air' 5G network research gets funding -====== -A consortium of tech companies and universities plan to aggressively investigate the exploitation of D-Band to develop a new variant of 5G infrastructure. -![Peshkova / Getty Images][1] - -Wireless transmission at data rates of around 45gbps could one day be commonplace, some engineers say. “Fiber-in-air” is how the latest variant of 5G infrastructure is being described. To get there, a Britain-funded consortium of chip makers, universities, and others intend to aggressively investigate the exploitation of D-Band. That part of the radio spectrum is at 151-174.8 GHz in millimeter wavelengths (mm-wave) and hasn’t been used before. - -The researchers intend to do it by riffing on a now roughly 70-year-old gun-like electron-sending device that can trace its roots back through the annals of radio history: The Traveling Wave Tube, or TWT, an electron gun-magnet-combo that was used in the development of television and still brings space images back to Earth. - -**[ Also read:[The time of 5G is almost here][2] ]** - -D-Band, the spectrum the researchers want to use, has the advantage that it’s wide, so theoretically it should be good for fast, copious data rates. The problem with it though, and the reason it hasn’t thus far been used, is that it’s subject to monkey-wrenching from atmospheric conditions such as rain, explains IQE, a semiconductor wafer and materials producer involved in the project, in a [press release][3]. The team says attenuation is fixable, though. Their solution is the now-aging TWTs. - -The group, which includes BT, Filtronic, Glasgow University, Intel, Nokia Bell Labs, Optocap, and Teledyne e2v, has secured funding of the equivalent of $1.12 million USD from the U.K.’s [Engineering and Physical Sciences Research Council (EPSRC)][4]. That’s the principal public funding body for engineering science research there. - -### Tapping the power of TWTs - -The DLINK system, as the team calls it, will use a high-power vacuum TWT with a special, newly developed tunneling diode and a modulator. Two bands of 10 GHz, each will deliver the throughput, [explains Lancaster University on its website][5]. The tubes are, in fact, special amplifiers that produce 10 Watts. That’s 10 times what an equivalent solid-state solution would likely produce at the same spot in the band, they say. Energy is basically sent from the electron beam to an electric field generated by the input signal. - -Despite TWTs being around for eons, “no D-band TWTs are available in the market.” The development of one is key to these fiber-in-air speeds, the researchers say. - -They will include “unprecedented data rate and transmission distance,” IQE writes. - -The TWT device, although used extensively in space wireless communications since its invention in the 1950s, is overlooked as a significant contributor to global communications systems, say a group of French researchers working separately from this project, who recently argue that TWTs should be given more recognition. - -TWT’s are “the unsung heroes of space exploration,” the Aix-Marseille Université researchers say in [an article on publisher Springer’s website][6]. Springer is promoting the group's 2019-published [paper][7] in the European Physical Journal H in which they delve into the history of the simple electron gun and magnet device. - -“Its role in the history of wireless communications and in the space conquest is significant, but largely ignored,” they write in their paper. - -They will be pleased to hear it maybe isn’t going away anytime soon. - -Join the Network World communities on [Facebook][8] and [LinkedIn][9] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3389881/extreme-5g-network-research-gets-funding.html#tk.rss_all - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/abstract_data_coding_matrix_structure_network_connections_by_peshkova_gettyimages-897683944_2400x1600-100788487-large.jpg -[2]: https://www.networkworld.com/article/3354477/mobile-world-congress-the-time-of-5g-is-almost-here.html -[3]: https://www.iqep.com/media/2019/03/iqe-partners-in-key-wireless-communications-project-for-5g-infrastructure-(1)/ -[4]: https://epsrc.ukri.org/ -[5]: http://wp.lancs.ac.uk/dlink/ -[6]: https://www.springer.com/gp/about-springer/media/research-news/all-english-research-news/traveling-wave-tubes--the-unsung-heroes-of-space-exploration/16578434 -[7]: https://link.springer.com/article/10.1140%2Fepjh%2Fe2018-90023-1 -[8]: https://www.facebook.com/NetworkWorld/ -[9]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190423 Open architecture and open source - The new wave for SD-WAN.md b/sources/talk/20190423 Open architecture and open source - The new wave for SD-WAN.md deleted file mode 100644 index 8be9e14ada..0000000000 --- a/sources/talk/20190423 Open architecture and open source - The new wave for SD-WAN.md +++ /dev/null @@ -1,186 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Open architecture and open source – The new wave for SD-WAN?) -[#]: via: (https://www.networkworld.com/article/3390151/open-architecture-and-open-source-the-new-wave-for-sd-wan.html#tk.rss_all) -[#]: author: (Matt Conran https://www.networkworld.com/author/Matt-Conran/) - -Open architecture and open source – The new wave for SD-WAN? -====== -As networking continues to evolve, you certainly don't want to break out a forklift every time new technologies are introduced. Open architecture would allow you to replace the components of a system, and give you more flexibility to control your own networking destiny. -![opensource.com \(CC BY-SA 2.0\)][1] - -I recently shared my thoughts about the [role of open source in networking][2]. I discussed two significant technological changes that we have witnessed. I call them waves, and these waves will redefine how we think about networking and security. - -The first wave signifies that networking is moving to the software so that it can run on commodity off-the-shelf hardware. The second wave is the use of open source technologies, thereby removing the barriers to entry for new product innovation and rapid market access. This is especially supported in the SD-WAN market rush. - -Seemingly, we are beginning to see less investment in hardware unless there is a specific segment that needs to be resolved. But generally, software-based platforms are preferred as they bring many advantages. It is evident that there has been a technology shift. We have moved networking from hardware to software and this shift has positive effects for users, enterprises and service providers. - -**[ Don’t miss[customer reviews of top remote access tools][3] and see [the most powerful IoT companies][4] . | Get daily insights by [signing up for Network World newsletters][5]. ]** - -### Performance (hardware vs software) - -There has always been a misconception that the hardware-based platforms are faster due to the hardware acceleration that exists in the network interface controller (NIC). However, this is a mistaken belief. Nowadays, software platforms can reach similar performance levels as compared to hardware-based platforms. - -Initially, people viewed hardware as a performance-based vehicle but today this does not hold true anymore. Even the bigger vendors are switching to software-based platforms. We are beginning to see this almost everywhere in networking. - -### SD-WAN and open source - -SD-WAN really took off quite rapidly due to the availability of open source. It enabled the vendors to leverage all the available open source components and then create their solution on top. By and large, SD-WAN vendors used the open source as the foundation of their solution and then added additional proprietary code over the baseline. - -However, even when using various open source components, there is still a lot of work left for these vendors to make it to a complete SD-WAN solution, even for reaching a baseline of centrally managed routers with flexible network architecture control, not to talk about complete feature set of SD-WAN. - -The result of the work done by these vendors is still closed products so the fact they are using open source components in their products is merely a time-to-market advantage but not a big benefit to the end users (enterprises) or service providers launching hosted services with these products. They are still limited in flexibility and vendor diversity is only achieved through a multi-vendor strategy which in practice means launching multiple silo services each based on a different SD-WAN vendor without real selection of the technologies that make each of the SD-WAN services they launch. - -I recently came across a company called [Flexiwan][6], their goal is to fundamentally change this limitation of SD-WAN by offering a full open source solution that, as they say, “includes integration points in the core of the system that allow for 3rd party logic to be integrated in an efficient way.” They call this an open architecture, which, in practical terms, means a service provider or enterprise can integrate his own application logic into the core of the SD-WAN router…or select best of breed sub-technologies or applications instead of having these dictated by the vendor himself. I believe there is the possibility of another wave of SD-WAN with a fully open source and open architecture to SD-WAN. - -This type of architecture brings many benefits to users, enterprises and service providers, especially when compared to the typical lock-in of bigger vendors, such as Cisco and VMware. - -With an open source open architecture, it’s easier to control the versions and extend more flexibility by using the software offered by different providers. It offers the ability to switch providers, not to mention being easier to install and upgrade the versions. - -### SD-WAN, open source and open architecture - -An SD-WAN solution that is an open source with open architecture provides a modular and decomposed type of SD-WAN. This enables the selection of elements to provide a solution. - -For example, enterprises and service providers can select the best-of-breed technologies from independent vendors, such as deep packet inspection (DPI), security, wide area network (WAN) optimization, session border controller (SBC), VoIP and other traffic specific optimization logic. - -Some SD-WAN vendors define an open architecture in such a way that they just have a set of APIs, for example, northbound APIs, to enable one to build management or do service chaining. This is one approach to an open architecture but in fact, it’s pretty limited since it does not bring the full benefits that an open architecture should offer. - -### Open source and the fear of hacking - -However, when I think about an open source and open architecture for SD-WAN, the first thing that comes to mind is bad actors. What about the code? If it’s an open source, the bad actor can find vulnerabilities, right? - -The community is a powerful force and will fix any vulnerability. Also with open source, the vendor, who is the one responsible for the open source component will fix the vulnerability much faster than a closed solution, where you are unaware of the vulnerability until a fix is released. - -### The SD-WAN evolution - -Before we go any further, let’s examine the history of SD-WAN and its origins, how we used to connect from the wide area network (WAN) to other branches via private or public links. - -SD-WAN offers the ability to connect your organization to a WAN. This could be connecting to the Internet or other branches, to optimally deliver applications with a good user-experience. Essentially, SD-WAN allows the organizations to design the architecture of their network dynamically by means of software. - -### In the beginning, there was IPSec - -It started with IPSec. Around two decades back, in 1995, the popular design was that of mesh architecture. As a result, we had a lot of point-to-point connections. Firstly, mesh architectures with IPSec VPNs are tiresome to manage as there is a potential for 100s of virtual private network (VPN) configurations. - -Authentically, IPSec started with two fundamental goals. The first was the tunneling protocol that would allow organizations to connect the users or other networks to their private network. This enabled the enterprises to connect to networks that they did not have a direct route to. - -The second goal of IPSec was to encrypt packets at the network layer and therefore securing the data in motion. Let’s face it: at that time, IPSec was terrible for complicated multi-site interconnectivity and high availability designs. If left to its defaults, IPSec is best suited for static designs. - -This was the reason why we had to step in the next era where additional functionality was added to IPSec. For example, IPSec had issues in supporting routing protocols using multicast. To overcome this, IPSec over generic routing encapsulation (GRE) was introduced. - -### The next era of SD-WAN - -During the journey to 2008, one could argue that the next era of WAN connectivity was when additional features were added to IPSec. At this time IPSec became known as a “Swiss army knife.” It could do many things but not anything really well. - -Back then, you could create multiple links, but it failed to select the traffic over these links other than by using simple routing. You needed to add a routing protocol. For advanced agile architectures, IPSec had to be incorporated with other higher-level protocols. - -Features were then added based on measuring the quality. Link quality features were added to analyze any delay, drops and to select alternative links for your applications. We began to add tunnels, multi-links and to select the traffic based on the priority, not just based on the routing. - -The most common way to the tunnel was to have IPSec over GRE. You have the GRE tunnel that enables you to send any protocol end-to-end by using IPSec for the encryption. All this functionality was added to achieve and create dynamic tunnels over IPSec and to optimize the IPSec tunnels. - -This was a move in the right direction, but it was still complex. It was not centrally managed and was error-prone with complex configurations that were unable to manage large deployments. IPSec had far too many limitations, so in the mid-2000s early SD-WAN vendors started cropping up. Some of these vendors enabled the enterprises to aggregate many separate digital subscriber lines (DSL) links into one faster logical link. At the same time, others added time stamps and/or sequence numbers to packets to improve the network performance and security when running over best effort (internet) links. - -International WAN connectivity was a popular focus since the cost delta between the Internet and private multiprotocol label switching (MPLS) was 10x+ different. Primarily, enterprises wanted the network performance and security of MPLS without having to pay a premium for it. - -Most of these solutions sat in-front or behind a traditional router from companies like Cisco. Evidently, just like WAN Optimization vendors, these were additional boxes/solutions that enterprises added to their networks. - -### The next era of SD-WAN, circa 2012 - -It was somewhere in 2012 that we started to see the big rush to the SD-WAN market. Vendors such as Velocloud, Viptela and a lot of the other big players in the SD-WAN market kicked off with the objective of claiming some of the early SD-WAN success and going after the edge router market with a full feature router replacement and management simplicity. - -Open source networking software and other open source components for managing the traffic enabled these early SD-WAN vendors to lay a foundation where a lot of the code base was open source. They would then “glue” it together and add their own additional features. - -Around this time, Intel was driving data plane development kit (DPDK) and advanced encryption standard (AES) instruction set, which enabled that software to run on commodity hardware. The SD-WAN solutions were delivered as closed solutions where each solution used its own set of features. The features and technologies chosen for each vendor were different and not compatible with each other. - -### The recent era of SD-WAN, circa 2017 - -A tipping point in 2017 was the gold rush for SD-WAN deployments. Everyone wanted to have SD-WAN as fast as possible. - -The SD-WAN market has taken off, as seen by 50 vendors with competing, proprietary solutions and market growth curves with a CAGR of 100%. There is a trend of big vendors like Cisco, Vmware and Oracle acquiring startups to compete in this new market. - -As a result, Cisco, which is the traditional enterprise market leader in WAN routing solutions felt threatened since its IWAN solution, which had been around since 2008, was too complex (a 900-page configuration and operations manual). Besides, its simple solution based on the Meraki acquisition was not feature-rich enough for the large enterprises. - -With their acquisition of Viptela, Cisco currently has a 13% of the market share, and for the first time in decades, it is not the market leader. The large cloud vendors, such as Google and Facebook are utilizing their own technology for routing within their very large private networks. - -At some point between 2012 and 2017, we witnessed the service providers adopting SD-WAN. This introduced the onset and movement of managed SD-WAN services. As a result, the service providers wanted to have SD-WAN on the menu for their customers. But there were many limitations in the SD-WAN market, as it was offered as a closed-box solution, giving the service providers limited control. - -At this point surfaced an expectation of change, as service providers and enterprises looked for more control. Customers can get better functionality from a multi-vendor approach than from a single vendor. - -### Don’t forget DIY SD-WAN - -Up to 60% of service providers and enterprises within the USA are now looking at DIY SD-WAN. A DIY SD-WAN solution is not where the many pieces of open source are taken and caste into something. The utmost focus is on the solution that can be self-managed but buy from a vendor. - -Today, the majority of the market is looking for managed solutions and the upper section that has the expertise wants to be equipped with more control options. - -### SD-WAN vendors attempting everything - -There is a trend that some vendors try to do everything with SD-WAN. As a result, whether you are an enterprise or a service provider, you are locked into a solution that is dictated by the SD-WAN vendor. - -The SD-WAN vendors have made the supplier choice or developed what they think is relevant. Evidently, some vendors are using stacks and software development kits (SDKs) that they purchased, for example, for deep packet inspection (DPI). - -Ultimately, you are locked into a specific solution that the vendor has chosen for you. If you are a service provider, you might disapprove of this limitation and if you are an enterprise with specific expertise, you might want to zoom in for more control. - -### All-in-one security vendors - -Many SD-WAN vendors promote themselves as security companies. But would you prefer to buy a security solution from an SD-WAN vendor or from an experienced vendor, such as Checkpoint? - -Both: enterprise and service providers want to have a choice, but with an integrated black box security solution, you don't have a choice. The more you integrate and throw into the same box, the stronger the vendor lock-in is and the weaker the flexibility. - -Essentially, with this approach, you are going for the lowest common denominator instead of the highest. Ideally, the technology of the services that you deploy on your network requires expertise. One vendor cannot be an expert in everything. - -An open architecture lies in a place for experts in different areas to join together and add their own specialist functionality. - -### Encrypted traffic - -As a matter of fact, what is not encrypted today will be encrypted tomorrow. The vendor of the application can perform intelligent things that the SD-WAN vendor cannot because they control both sides. Hence, if you can put something inside the SD-WAN edge device, they can make smart decisions even if the traffic is encrypted. - -But in the case of traditional SD-WANs, there needs to be a corporation with a content provider. However, with an open architecture, you can integrate anything, and nothing prevents the integration. A lot of traffic is encrypted and it's harder to manage encrypted traffic. However, an open architecture would allow the content providers to manage the traffic more effectively. - -### 2019 and beyond: what is an open architecture? - -Cloud providers and enterprises have discovered that 90% of the user experience and security problems arise due to the network: between where the cloud provider resides and where the end-user consumes the application. - -Therefore, both cloud providers and large enterprise with digital strategies are focusing on building their solutions based on open source stacks. Having a viable open source SD-WAN solution is the next step in the SD-WAN evolution, where it moves to involve the community in the solution. This is similar to what happens with containers and tools. - -Now, since we’re in 2019, are we going to witness a new era of SD-WAN? Are we moving to the open architecture with an open source SD-WAN solution? An open architecture should be the core of the SD-WAN infrastructure, where additional technologies are integrated inside the SD-WAN solution and not only complementary VNFs. There is an interface and native APIs that allow you to integrate logic into the router. This way, the router will be able to intercept and act according to the traffic. - -So, if I’m a service provider and have my own application, I would want to write logic that would be able to communicate with my application. Without an open architecture, the service providers can’t really offer differentiation and change the way SD-WAN makes decisions and interacts with the traffic of their applications. - -There is a list of various technologies that you need to be an expert in to be able to integrate. And each one of these technologies can be a company, for example, DPI, VoIP optimization, and network monitoring to name a few. An open architecture will allow you to pick and choose these various elements as per your requirements. - -Networking is going through a lot of changes and it will continue to evolve with the passage of time. As a result, you wouldn’t want something that forces you to break out a forklift each time new technologies are introduced. Primarily, open architecture allows you to replace the components of the system and add code or elements that handle specific traffic and applications. - -### Open source - -Open source gives you more flexibility to control your own destiny. It offers the ability to select your own services that you want to be applied to your system. It provides security in the sense that if something happens to the vendor or there is a vulnerability in the system, you know that you are backed by the community that can fix such misadventures. - -From the perspective of the business model, it makes a more flexible and cost-effective system. Besides, with open source, the total cost of ownership will also be lower. - -**This article is published as part of the IDG Contributor Network.[Want to Join?][7]** - -Join the Network World communities on [Facebook][8] and [LinkedIn][9] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3390151/open-architecture-and-open-source-the-new-wave-for-sd-wan.html#tk.rss_all - -作者:[Matt Conran][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Matt-Conran/ -[b]: https://github.com/lujun9972 -[1]: https://images.techhive.com/images/article/2017/03/6554314981_7f95641814_o-100714680-large.jpg -[2]: https://www.networkworld.com/article/3338143/the-role-of-open-source-in-networking.html -[3]: https://www.networkworld.com/article/3262145/lan-wan/customer-reviews-top-remote-access-tools.html#nww-fsb -[4]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html#nww-fsb -[5]: https://www.networkworld.com/newsletters/signup.html#nww-fsb -[6]: https://flexiwan.com/sd-wan-open-source/ -[7]: /contributor-network/signup.html -[8]: https://www.facebook.com/NetworkWorld/ -[9]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190424 How data storage will shift to blockchain.md b/sources/talk/20190424 How data storage will shift to blockchain.md deleted file mode 100644 index b31653e0f7..0000000000 --- a/sources/talk/20190424 How data storage will shift to blockchain.md +++ /dev/null @@ -1,70 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How data storage will shift to blockchain) -[#]: via: (https://www.networkworld.com/article/3390722/how-data-storage-will-shift-to-blockchain.html#tk.rss_all) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -How data storage will shift to blockchain -====== -Move over cloud and traditional in-house enterprise data center storage, distributed storage based on blockchain may be arriving imminently. -![Cybrain / Getty Images][1] - -If you thought cloud storage was digging in its heels to become the go-to method for storing data, and at the same time grabbing share from own-server, in-house storage, you may be interested to hear that some think both are on the way out. Instead organizations will use blockchain-based storage. - -Decentralized blockchain-based file storage will be more secure, will make it harder to lose data, and will be cheaper than anything seen before, say organizations actively promoting the slant on encrypted, distributed technology. - -**[ Read also:[Why blockchain (might be) coming to an IoT implementation near you][2] ]** - -### Storing transactional data in a blockchain - -China company [FileStorm][3], which describes itself in marketing materials as the first [Interplanetary File Storage][4] (IPFS) platform on blockchain, says the key to making it all work is to only store the transactional data in blockchain. The actual data files, such as large video files, are distributed in IPFS. - -IPFS is a distributed, peer-to-peer file storage protocol. File parts come from multiple computers all at the same time, supposedly making the storage hardy. FileStorm adds blockchain on top of it for a form of transactional indexing. - -“Blockchain is designed to store transactions forever, and the data can never be altered, thus a trustworthy system is created,” says Raymond Fu, founder of FileStorm and chief product officer of MOAC, the underlying blockchain system used, in a video on the FileStorm website. - -“The blocks are used to store only small transactional data,” he says. You can’t store the large files on it. Those are distributed. Decentralized data storage platforms are needed for added decentralized blockchain, he says. - -YottaChain, another blockchain storage start-up project is coming at the whole thing from a slightly different angle. It claims its non-IPFS system is more secure partly because it performs deduplication after encryption. - -“Data is 10,000 times more secure than [traditional] centralized storage,” it says on its [website][5]. Deduplication eliminates duplicated or redundant data. - -### Disrupting data storage - -“Blockchain will disrupt data storage,” [says BlockApps separately][6]. The blockchain backend platform provider says advantages to this new generation of storage include that decentralizing data provides more security and privacy. That's due in part because it's harder to hack than traditional centralized storage. That the files are spread piecemeal among nodes, conceivably all over the world, makes it impossible for even the participating node to view the contents of the complete file, it says. - -Sharding, which is the term for the breaking apart and node-spreading of the actual data, is secured through keys. Markets can award token coins for mining, and coins can be spent to gain storage. Excess storage can even be sold. And cryptocurrencies have been started to “incentivize usage and to create a market for buying and selling decentralized storage,” BlockApps explains. - -The final parts of this new storage mix are that lost files are minimized because data can be duplicated simply — the data sets, for example, can be stored multiple times for error correction — and costs are reduced due to efficiencies. - -Square Tech (Shenzhen) Co., which makes blockchain file storage nodes, says in its marketing materials that it intends to build service centers globally to monitor its nodes in real time. Interestingly, another area the company has gotten involved in is the internet of things (IoT), and [it says][7] it wants “to unite the technical resources, capital, and human resources of the IoT industry and blockchain.” Perhaps we end up with a form of the internet of storage things? - -“The entire cloud computing industry will be disrupted by blockchain technology in just a few short years,” says BlockApps. Dropbox and Amazon “may even become overpriced and obsolete if they do not find ways to integrate with the advances.” - -Join the Network World communities on [Facebook][8] and [LinkedIn][9] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3390722/how-data-storage-will-shift-to-blockchain.html#tk.rss_all - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/chains_binary_data_blockchain_security_by_cybrain_gettyimages-926677890_2400x1600-100788435-large.jpg -[2]: https://www.networkworld.com/article/3386881/why-blockchain-might-be-coming-to-an-iot-implementation-near-you.html -[3]: http://filestorm.net/ -[4]: https://ipfs.io/ -[5]: https://www.yottachain.io/ -[6]: https://blockapps.net/blockchain-disrupt-data-storage/ -[7]: http://www.sikuaikeji.com/ -[8]: https://www.facebook.com/NetworkWorld/ -[9]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190424 No, drone delivery still isn-t ready for prime time.md b/sources/talk/20190424 No, drone delivery still isn-t ready for prime time.md deleted file mode 100644 index c948f458ce..0000000000 --- a/sources/talk/20190424 No, drone delivery still isn-t ready for prime time.md +++ /dev/null @@ -1,91 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (No, drone delivery still isn’t ready for prime time) -[#]: via: (https://www.networkworld.com/article/3390677/drone-delivery-not-ready-for-prime-time.html#tk.rss_all) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -No, drone delivery still isn’t ready for prime time -====== -Despite incremental progress and limited regulatory approval in the U.S. and Australia, drone delivery still isn’t a viable option in the vast majority of use cases. -![Sorry imKirk \(CC0\)][1] - -April has a been a big month for drone delivery. First, [Alphabet’s Wing Aviation drones got approval from Australia’s Civil Aviation Safety Authority (CASA)][2], for public deliveries in the country, and this week [Wing earned Air Carrier Certification from the U.S. Federal Aviation Administration][3]. These two regulatory wins got lot of people got very excited. Finally, the conventional wisdom exulted, drone delivery is actually becoming a reality. - -Not so fast. - -### Drone delivery still in pilot/testing mode - -Despite some small-scale successes and the first signs of regulatory acceptance, drone delivery remains firmly in the carefully controlled pilot/test phase (and yes, I know drones don’t carry pilots). - -**[ Also read:[Coffee drone delivery: Ideas this bad could kill the internet of things][4] ]** - -For example, despite getting FAA approval to begin commercial deliveries, Wing is still working up beginning delivery trials to test the technology and gather information in Virginia later this year. - -But what about that public approval from CASA for deliveries outside Canberra? That’s [a real business][5] now, right? - -Well, yes and no. - -On the “yes” side, the Aussie approval reportedly came after 18 months of tests, 70,000 flights, and more than 3,000 actual deliveries of products from local coffee shops and pharmacies. So, at least some people somewhere in the world are actually getting stuff dropped at their doors by drones. - -In the “no” column, however, goes the fact that the approval covers only about 100 suburban homes, though more are planned to be added “in the coming weeks and months.” More importantly, the approval includes strict limits on when and where the drones can go. No crossing main roads, no nighttime deliveries, and prohibitions to stay away from people. And drone-eligible customers need a safety briefing! - -### Safety briefings required for customers - -That still sounds like a small-scale test, not a full-scale commercial roll-out. And while I think drone-safety classes are probably a good idea – and the testing period apparently passed without any injuries – even the perceived _need_ for them is not be a great advertisement for rapid expansion of drone deliveries. - -Ironically, though, a bigger issue than protecting people from the drones, perhaps, is protecting the drones from people. Instructions to stay 2 to 5 meters away from folks will help, but as I’ve previously addressed, these things are already seen as attractive nuisances and vandalism targets. Further raising the stakes, many local residents were said to be annoyed at the noise created by the drones. Now imagine those contraptions buzzing right by you all loaded down with steaming hot coffee or delicious ice cream. - -And even with all those caveats, no one is talking about the key factors in making drone deliveries a viable business: How much will those deliveries cost and who will pay? For a while, the desire to explore the opportunity will drive investment, but that won’t last forever. If drone deliveries aren’t cost effective for businesses, they won’t spread very far. - -From the customer perspective, most drone delivery tests are not yet charging for the service. If and when they start carrying fees as well as purchases, the novelty factor will likely entice many shoppers to pony up to get their items airlifted directly to their homes. But that also won’t last. Drone delivery will have to demonstrate that it’s better — faster, cheaper, or more reliable — than the existing alternatives to find its niche. - -### Drone deliveries are fast, commercial roll-out will be slow - -Long term, I have no doubt that drone delivery will eventually become an accepted part of the transportation infrastructure. I don’t necessarily buy into Wing’s prediction of an AU $40 million drone delivery market in Australia coming to pass anytime soon, but real commercial operations seem inevitable. - -It’s just going to be more limited than many proponents claim, and it’s likely to take a lot longer than expected to become mainstream. For example, despite ongoing testing, [Amazon has already missed Jeff Bezos’ 2018 deadline to begin commercial drone deliveries][6], and we haven’t heard much about [Walmart’s drone delivery plans][7] lately. And while tests by a number of companies continue in locations ranging from Iceland and Finland to the U.K. and the U.S. have created a lot of interest, they have not yet translated into widespread availability. - -Apart from the issue of how much consumers really want their stuff delivered by an armada of drones (a [2016 U.S. Post Office study][8] found that 44% of respondents liked the idea, while 34% didn’t — and 37% worried that drone deliveries might not be safe), a lot has to happen before that vision becomes reality. - -At a minimum, successful implementations of full-scale commercial drone delivery will require better planning, better-thought-out business cases, more rugged and efficient drone technology, and significant advances in flight control and autonomous flight. Like drone deliveries themselves, all that stuff is coming; it just hasn’t arrived yet. - -**More about drones and the internet of things:** - - * [Drone defense -- powered by IoT -- is now a thing][9] - * [Ideas this bad could kill the Internet of Things][4] - * [10 reasons Amazon's drone delivery plan still won't fly][10] - * [Amazon’s successful drone delivery test doesn’t really prove anything][11] - - - -Join the Network World communities on [Facebook][12] and [LinkedIn][13] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3390677/drone-delivery-not-ready-for-prime-time.html#tk.rss_all - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/07/drone_mountains_by_sorry_imkirk_cc0_via_unsplash_1200x800-100763763-large.jpg -[2]: https://medium.com/wing-aviation/wing-launches-commercial-air-delivery-service-in-canberra-5da134312474 -[3]: https://medium.com/wing-aviation/wing-becomes-first-certified-air-carrier-for-drones-in-the-us-43401883f20b -[4]: https://www.networkworld.com/article/3301277/ideas-this-bad-could-kill-the-internet-of-things.html -[5]: https://wing.com/australia/canberra -[6]: https://www.businessinsider.com/jeff-bezos-predicted-amazon-would-be-making-drone-deliveries-by-2018-2018-12?r=US&IR=T -[7]: https://www.networkworld.com/article/2999828/walmart-delivery-drone-plans.html -[8]: https://www.uspsoig.gov/sites/default/files/document-library-files/2016/RARC_WP-17-001.pdf -[9]: https://www.networkworld.com/article/3309413/drone-defense-powered-by-iot-is-now-a-thing.html -[10]: https://www.networkworld.com/article/2900317/10-reasons-amazons-drone-delivery-plan-still-wont-fly.html -[11]: https://www.networkworld.com/article/3185478/amazons-successful-drone-delivery-test-doesnt-really-prove-anything.html -[12]: https://www.facebook.com/NetworkWorld/ -[13]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190426 Profiling D-s Garbage Collection with Bpftrace.md b/sources/talk/20190426 Profiling D-s Garbage Collection with Bpftrace.md deleted file mode 100644 index ce0a408ae6..0000000000 --- a/sources/talk/20190426 Profiling D-s Garbage Collection with Bpftrace.md +++ /dev/null @@ -1,412 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Profiling D's Garbage Collection with Bpftrace) -[#]: via: (https://theartofmachinery.com/2019/04/26/bpftrace_d_gc.html) -[#]: author: (Simon Arneaud https://theartofmachinery.com) - -Profiling D's Garbage Collection with Bpftrace -====== - -Recently I’ve been playing around with using [`bpftrace`][1] to trace and profile D’s garbage collector. Here are some examples of the cool stuff that’s possible. - -### What is `bpftrace`? - -It’s a high-level debugging tool based on Linux’s eBPF. “eBPF” stands for “extended Berkely packet filter”, but that’s just a historical name and doesn’t mean much today. It’s really a virtual machine (like the [JVM][2]) that sits inside the Linux kernel and runs code in a special eBPF instruction set similar to normal machine code. Users are expected to write short programs in high-level languages (including C and others) that get compiled to eBPF and loaded into the kernel on the fly to do interesting things. - -As you might guess, eBPF is powerful for instrumenting a running kernel, but it also supports instrumenting user-space programs. - -### What you need - -First you need a Linux kernel. Sorry BSD, Mac OS and Windows users. (But some of you can use [DTrace][3].) - -Also, not just any Linux kernel will work. This stuff is relatively new, so you’ll need a modern kernel with BPF-related features enabled. You might need to use the newest (or even testing) version of a distro. Here’s how to check if your kernel meets the requirements: - -``` -$ uname -r -4.19.27-gentoo-r1sub -$ # 4.9+ recommended by bpftrace -$ zgrep CONFIG_UPROBES /proc/config.gz -CONFIG_UPROBES=y -$ # Also need -$ # CONFIG_BPF=y -$ # CONFIG_BPF_SYSCALL=y -$ # CONFIG_BPF_JIT=y -$ # CONFIG_HAVE_EBPF_JIT=y -$ # CONFIG_BPF_EVENTS=y -``` - -Of course, [you also need to install the `bpftrace` tool itself][4]. - -### `bpftrace` D “Hello World” - -Here’s a quick test you can do to make sure you’ve got everything working. First, let’s make a Hello World D binary: - -``` -$ pwd -/tmp/ -$ cat hello.d -import std.stdio; - -void main() -{ - writeln("Hello World"); -} -$ dmd hello.d -$ ./hello -Hello World -$ -``` - -Now let’s `bpftrace` it. `bpftrace` uses a high-level language that’s obviously inspired by AWK. I’ll explain enough to understand the post, but you can also check out the [`bpftrace` reference guide][5] and [one-liner tutorial][6]. The minimum you need to know is that a bpftrace program is a list of `event:name /filter predicate/ { program(); code(); }` blocks that define code snippets to be run on events. - -This time I’m only using Linux uprobes, which trigger on functions in user-space programs. The syntax is `uprobe:/path/to/binary:functionName`. One gotcha is that D “[mangles][7]” (encodes) function names before inserting them into the binary. If we want to trigger on the D code’s `main()` function, we need to use the mangled name: `_Dmain`. (By the way, `nm program | grep ' _D.*functionName'` is one quick trick for finding mangled names.) - -Run this `bpftrace` invocation in a terminal as root user: - -``` -# bpftrace -e 'uprobe:/tmp/hello:_Dmain { printf("D Hello World run with process ID %d\n", pid); }' -Attaching 1 probe... -``` - -While this is running, it’ll print a message every time the D Hello World program is executed by any user in any terminal. Press `Ctrl+C` to quit. - -All `bpftrace` code can be run directly from the command line like in the example above. But to make things easier to read from now on, I’ll make neatly formatted scripts. - -### Tracing some real code - -I’m using [D-Scanner][8], the D code analyser, as an example of a simple but non-trivial D workload. One nice thing about `bpftrace` and uprobes is that no modification of the program is needed. I’m just using a normal build of the `dscanner` tool, and using the [D runtime source code][9] as a codebase to analyse. - -Before using `bpftrace`, let’s try using [the profiling that’s built into the D GC implementation itself][10]: - -``` -$ dscanner --DRT-gcopt=profile:1 --etags -... - Number of collections: 85 - Total GC prep time: 0 milliseconds - Total mark time: 17 milliseconds - Total sweep time: 6 milliseconds - Total page recovery time: 3 milliseconds - Max Pause Time: 1 milliseconds - Grand total GC time: 28 milliseconds -GC summary: 35 MB, 85 GC 28 ms, Pauses 17 ms < 1 ms -``` - -(If you can make a custom build, you can also use [the D runtime GC API to get stats][11].) - -There’s one more gotcha when using `bpftrace` on `dscanner` to trace GC functions: the binary file we specify for the uprobe needs to be the binary file that actually contains the GC functions. That could be the D binary itself, or it could be a shared D runtime library. Try running `ldd /path/to/d_program` to list any linked shared libraries, and if the output contains `druntime`, use that full path when specifying uprobes. My `dscanner` binary doesn’t link to a shared D runtime, so I just use the full path to `dscanner`. (Running `which dscanner` gives `/usr/local/bin/dscanner` for me.) - -Anyway, all the GC functions live in a `gc` module, so their mangled names start with `_D2gc`. Here’s a `bpftrace` invocation that tallies GC function calls. For convenience, it also includes a uretprobe to automatically exit when `main()` returns. The output is sorted to make it a little easier to read. - -``` -# cat dumpgcfuncs.bt -uprobe:/usr/local/bin/dscanner:_D2gc* -{ - @[probe] = count(); -} - -uretprobe:/usr/local/bin/dscanner:_Dmain -{ - exit(); -} -# bpftrace dumpgcfuncs.bt | sort - -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC10freeNoSyncMFNbNiPvZv]: 31 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC10initializeFKCQCd11gcinterface2GCZv]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC11queryNoSyncMFNbPvZS4core6memory8BlkInfo_]: 44041 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC11removeRangeMFNbNiPvZv]: 2 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC12extendNoSyncMFNbPvmmxC8TypeInfoZm]: 251946 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC14collectNoStackMFNbZv]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC18fullCollectNoStackMFNbZv]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC4freeMFNbNiPvZv]: 31 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC5queryMFNbPvZS4core6memory8BlkInfo_]: 47704 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC6__ctorMFZCQBzQBzQBxQCiQBn]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC6callocMFNbmkxC8TypeInfoZPv]: 80 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC6extendMFNbPvmmxC8TypeInfoZm]: 251946 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC6mallocMFNbmkxC8TypeInfoZPv]: 12423 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_]: 948995 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC7getAttrMFNbPvZ2goFNbPSQClQClQCjQCu3GcxQBbZk]: 5615 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC7getAttrMFNbPvZk]: 5615 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC8addRangeMFNbNiPvmxC8TypeInfoZv]: 2 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs10freeNoSyncMFNbNiPvZvS_DQDsQDsQDqQEb8freeTimelS_DQErQErQEpQFa8numFreeslTQCdZQEbMFNbNiKQCrZv]: 31 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs11queryNoSyncMFNbPvZS4core6memory8BlkInfo_S_DQEmQEmQEkQEv9otherTimelS_DQFmQFmQFkQFv9numOtherslTQDaZQExMFNbKQDmZQDn]: 44041 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs12extendNoSyncMFNbPvmmxC8TypeInfoZmS_DQEfQEfQEdQEo10extendTimelS_DQFhQFhQFfQFq10numExtendslTQCwTmTmTxQDaZQFdMFNbKQDrKmKmKxQDvZm]: 251946 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs12mallocNoSyncMFNbmkKmxC8TypeInfoZPvS_DQEgQEgQEeQEp10mallocTimelS_DQFiQFiQFgQFr10numMallocslTmTkTmTxQCzZQFcMFNbKmKkKmKxQDsZQDl]: 961498 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs18fullCollectNoStackMFNbZ2goFNbPSQEaQEaQDyQEj3GcxZmTQvZQDfMFNbKQBgZm]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs7getAttrMFNbPvZ2goFNbPSQDqQDqQDoQDz3GcxQBbZkS_DQEoQEoQEmQEx9otherTimelS_DQFoQFoQFmQFx9numOtherslTQCyTQDlZQFdMFNbKQDoKQEbZk]: 5615 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw15LargeObjectPool10allocPagesMFNbmZm]: 5597 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw15LargeObjectPool13updateOffsetsMFNbmZv]: 10745 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw15LargeObjectPool7getInfoMFNbPvZS4core6memory8BlkInfo_]: 3844 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw15SmallObjectPool7getInfoMFNbPvZS4core6memory8BlkInfo_]: 40197 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw15SmallObjectPool9allocPageMFNbhZPSQChQChQCfQCq4List]: 15022 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx10smallAllocMFNbhKmkZ8tryAllocMFNbZb]: 955967 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx10smallAllocMFNbhKmkZPv]: 955912 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx11ToScanStack4growMFNbZv]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx11fullcollectMFNbbZm]: 85 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx11removeRangeMFNbNiPvZv]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx23updateCollectThresholdsMFNbZv]: 84 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx4markMFNbNlPvQcZv]: 253 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx5sweepMFNbZm]: 84 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx7markAllMFNbbZ14__foreachbody3MFNbKSQCm11gcinterface5RangeZi]: 85 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx7markAllMFNbbZv]: 85 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx7newPoolMFNbmbZPSQBtQBtQBrQCc4Pool]: 6 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx7recoverMFNbZm]: 84 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx8addRangeMFNbNiPvQcxC8TypeInfoZv]: 2 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx8bigAllocMFNbmKmkxC8TypeInfoZ15tryAllocNewPoolMFNbZb]: 5 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx8bigAllocMFNbmKmkxC8TypeInfoZ8tryAllocMFNbZb]: 5616 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx8bigAllocMFNbmKmkxC8TypeInfoZPv]: 5586 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx8isMarkedMFNbNlPvZi]: 635 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx9allocPageMFNbhZPSQBuQBuQBsQCd4List]: 15024 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw4Pool10initializeMFNbmbZv]: 6 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw4Pool12freePageBitsMFNbmKxG4mZv]: 16439 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl5protoQo7ProtoGC4termMFZv]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl5protoQo7ProtoGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl5protoQo7ProtoGC8addRangeMFNbNiPvmxC8TypeInfoZv]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc4impl6manualQp8ManualGC10initializeFKCQBp11gcinterface2GCZv]: 1 -@[uprobe:/usr/local/bin/dscanner:_D2gc9pooltable__T9PoolTableTSQBc4impl12conservativeQBy4PoolZQBr6insertMFNbNiPQBxZb]: 6 -@[uprobe:/usr/local/bin/dscanner:_D2gc9pooltable__T9PoolTableTSQBc4impl12conservativeQBy4PoolZQBr8findPoolMFNaNbNiPvZPQCe]: 302268 -@[uprobe:/usr/local/bin/dscanner:_D2gc9pooltable__T9PoolTableTSQBc4impl12conservativeQBy4PoolZQBr8minimizeMFNaNbNjZAPQCd]: 30 -Attaching 231 probes... -``` - -All these functions are in [`src/gc/`][12], and most of the interesting ones here are in [`src/gc/impl/conservative/`][13]. There are 85 calls to `_D2gc4impl12conservativeQw3Gcx11fullcollectMFNbbZm`, which [`ddemangle`][14] translates to `nothrow ulong gc.impl.conservative.gc.Gcx.fullcollect(bool)`. That matches up with the report from `--DRT-gcopt=profile:1`. - -The heart of the `bpftrace` program is `@[probe] = count();`. `@` prefixes a global variable, in this case a variable with an empty name (allowed by `bpftrace`). We’re using the variable as a map (like an associative array in D), and indexing it with `probe`, a built-in variable containing the name of the uprobe that was triggered. The tally is kept using the magic `count()` function. - -### Garbage collection timings - -How about something more interesting, like generating a profile of collection timings? This time, to get more data, I won’t make `bpftrace` exit as soon as the `dscanner` exits. I’ll keep it running and run `dscanner` 100 times before quitting `bpftrace` with `Ctrl+C`: - -``` -# cat gcprofile.bt -uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx11fullcollectMFNbbZm -{ - @t = nsecs; -} - -uretprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw3Gcx11fullcollectMFNbbZm / @t / -{ - @gc_times = hist(nsecs - @t); -} -# bpftrace gcprofile.bt -Attaching 2 probes... -^C - -@gc_times: -[64K, 128K) 138 |@ | -[128K, 256K) 1367 |@@@@@@@@@@ | -[256K, 512K) 6687 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -[512K, 1M) 7 | | -[1M, 2M) 301 |@@ | -``` - -Et voila! A log-scale histogram of the `nsecs` timestamp difference between entering and exiting `fullcollect()`. The times are in nanoseconds, so we see that most collections are taking less than half a millisecond, but we have tail cases that take 1-2ms. - -### Function arguments - -`bpftrace` provides `arg0`, `arg1`, `arg2`, etc. built-in variables for accessing the arguments to a traced function. There are a couple of complications with using them with D code, however. - -The first is that (at the binary level) `dmd` makes `extern(D)` functions (i.e., normal D functions) take arguments in the reverse order of `extern(C)` functions (that `bpftrace` is expecting). Suppose you have a simple three-argument function. If it’s using the C calling convention, `bpftrace` will recognise the first argument as `arg0`. If it’s using the D calling convention, however, it’ll be picked up as `arg2`. - -``` -extern(C) void cfunc(int arg0, int arg1, int arg2) -{ - // ... -} - -// (extern(D) is the default) -extern(D) void dfunc(int arg2, int arg1, int arg0) -{ - // ... -} -``` - -If you look at [the D ABI spec][15], you’ll notice that (just like in C++) there can be a couple of hidden arguments if the function is more complex. If `dfunc` above returned a large struct, there can be an extra hidden argument for implementing [copy elision][16], which means the first argument would actually be `arg3`, and `arg0` would be the hidden argument. If `dfunc` were also a member function, it would have a hidden `this` argument, which would bump up the first argument to `arg4`. - -To get the hang of this, you might need to experiment with tracing function calls with known arguments. - -### Allocation sizes - -Let’s get a histogram of the memory allocation request sizes. Looking at the list of GC functions traced earlier, and comparing it with the GC source code, it looks like we need to trace these functions and grab the `size` argument: - -``` -class ConservativeGC : GC -{ - // ... - void *malloc(size_t size, uint bits, const TypeInfo ti) nothrow; - void *calloc(size_t size, uint bits, const TypeInfo ti) nothrow; - BlkInfo qalloc( size_t size, uint bits, const TypeInfo ti) nothrow; - // ... -} -``` - -As class member functions, they have a hidden `this` argument as well. The last one, `qalloc()`, returns a struct, so it also has a hidden argument for copy elision. So `size` is `arg3` for the first two functions, and `arg4` for `qalloc()`. Time to run a trace: - -``` -# cat allocsizeprofile.bt -uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC6mallocMFNbmkxC8TypeInfoZPv, -uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC6callocMFNbmkxC8TypeInfoZPv -{ - @ = hist(arg3); -} - -uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_ -{ - @ = hist(arg4); -} - -uretprobe:/usr/local/bin/dscanner:_Dmain -{ - exit(); -} -# bpftrace allocsizeprofile.bt -Attaching 4 probes... -@: -[2, 4) 2489 | | -[4, 8) 9324 |@ | -[8, 16) 46527 |@@@@@ | -[16, 32) 206324 |@@@@@@@@@@@@@@@@@@@@@@@ | -[32, 64) 448020 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -[64, 128) 147053 |@@@@@@@@@@@@@@@@@ | -[128, 256) 88072 |@@@@@@@@@@ | -[256, 512) 2519 | | -[512, 1K) 1830 | | -[1K, 2K) 3749 | | -[2K, 4K) 1668 | | -[4K, 8K) 256 | | -[8K, 16K) 2533 | | -[16K, 32K) 312 | | -[32K, 64K) 239 | | -[64K, 128K) 209 | | -[128K, 256K) 164 | | -[256K, 512K) 124 | | -[512K, 1M) 48 | | -[1M, 2M) 30 | | -[2M, 4M) 7 | | -[4M, 8M) 1 | | -[8M, 16M) 2 | | -``` - -So, we have a lot of small allocations, with a very long tail of larger allocations. Remember, size is on a log scale, so that long tail represents a very skewed distribution. - -### Small allocation hotspots - -Now for something more complex. Suppose we’re profiling our code and looking for low-hanging fruit for reducing the number of memory allocations. Code that makes a lot of small allocations tends to be a good candidate for this kind of refactoring. `bpftrace` lets us grab stack traces, which can be used to see what part of the main program caused an allocation. - -As of writing, there’s one little complication because of a limitation of `bpftrace`’s stack trace handling: it can only show meaningful function symbol names (as opposed to raw memory addresses) if `bpftrace` quits while the target program is still running. There’s [an open bug report for improving this behaviour][17], but in the meantime I just made sure `dscanner` took a long time, and that I shut down `bpftrace` first. - -Here’s how to grab the top three stack traces that lead to small (<16B) memory allocations with `qalloc()`: - -``` -# cat smallallocs.bt -uprobe:/usr/local/bin/dscanner:_D2gc4impl12conservativeQw14ConservativeGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_ -{ - if (arg4 < 16) - { - @[ustack] = count(); - } -} - -END -{ - print(@, 3); - clear(@); -} -# bpftrace smallallocs.bt -Attaching 2 probes... -^C@[ - _D2gc4impl12conservativeQw14ConservativeGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_+0 - _D2rt8lifetime12__arrayAllocFNaNbmxC8TypeInfoxQlZS4core6memory8BlkInfo_+236 - _d_arraysetlengthT+248 - _D8dscanner8analysis25label_var_same_name_check17LabelVarNameCheck9pushScopeMFZv+29 - _D8dscanner8analysis25label_var_same_name_check17LabelVarNameCheck9__mixin175visitMFxC6dparse3ast6ModuleZv+21 - _D8dscanner8analysis3run7analyzeFAyaxC6dparse3ast6ModulexSQCeQBy6config20StaticAnalysisConfigKS7dsymbol11modulecache11ModuleCacheAxS3std12experimental5lexer__T14TokenStructureThVQFpa305_0a20202020737472696e6720636f6d6d656e743b0a20202020737472696e6720747261696c696e67436f6d6d656e743b0a0a20202020696e74206f70436d702873697a655f7420692920636f6e73742070757265206e6f7468726f77204073616665207b0a202020202020202069662028696e646578203c2069292072657475726e202d313b0a202020202020202069662028696e646578203e2069292072657475726e20313b0a202020202020202072657475726e20303b0a202020207d0a0a20202020696e74206f70436d702872656620636f6e737420747970656f66287468697329206f746865722920636f6e73742070757265206e6f7468726f77204073616665207b0a202020202020202072657475726e206f70436d70286f746865722e696e646578293b0a202020207d0aZQYobZCQZv9container6rbtree__T12RedBlackTreeTSQBGiQBGd4base7MessageVQBFza62_20612e6c696e65203c20622e6c696e65207c7c2028612e6c696e65203d3d20622e6c696e6520262620612e636f6c756d6e203c20622e636f6c756d6e2920Vbi1ZQGt+11343 - _D8dscanner8analysis3run7analyzeFAAyaxSQBlQBf6config20StaticAnalysisConfigQBoKS6dparse5lexer11StringCacheKS7dsymbol11modulecache11ModuleCachebZb+337 - _Dmain+3618 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv+40 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ7tryExecMFMDFZvZv+32 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZv+139 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ7tryExecMFMDFZvZv+32 - _d_run_main+463 - main+16 - __libc_start_main+235 - 0x41fd89415541f689 -]: 450 -@[ - _D2gc4impl12conservativeQw14ConservativeGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_+0 - _D2rt8lifetime12__arrayAllocFNaNbmxC8TypeInfoxQlZS4core6memory8BlkInfo_+236 - _d_arrayappendcTX+1944 - _D8dscanner8analysis10unmodified16UnmodifiedFinder9pushScopeMFZv+61 - _D8dscanner8analysis10unmodified16UnmodifiedFinder5visitMFxC6dparse3ast6ModuleZv+21 - _D8dscanner8analysis3run7analyzeFAyaxC6dparse3ast6ModulexSQCeQBy6config20StaticAnalysisConfigKS7dsymbol11modulecache11ModuleCacheAxS3std12experimental5lexer__T14TokenStructureThVQFpa305_0a20202020737472696e6720636f6d6d656e743b0a20202020737472696e6720747261696c696e67436f6d6d656e743b0a0a20202020696e74206f70436d702873697a655f7420692920636f6e73742070757265206e6f7468726f77204073616665207b0a202020202020202069662028696e646578203c2069292072657475726e202d313b0a202020202020202069662028696e646578203e2069292072657475726e20313b0a202020202020202072657475726e20303b0a202020207d0a0a20202020696e74206f70436d702872656620636f6e737420747970656f66287468697329206f746865722920636f6e73742070757265206e6f7468726f77204073616665207b0a202020202020202072657475726e206f70436d70286f746865722e696e646578293b0a202020207d0aZQYobZCQZv9container6rbtree__T12RedBlackTreeTSQBGiQBGd4base7MessageVQBFza62_20612e6c696e65203c20622e6c696e65207c7c2028612e6c696e65203d3d20622e6c696e6520262620612e636f6c756d6e203c20622e636f6c756d6e2920Vbi1ZQGt+11343 - _D8dscanner8analysis3run7analyzeFAAyaxSQBlQBf6config20StaticAnalysisConfigQBoKS6dparse5lexer11StringCacheKS7dsymbol11modulecache11ModuleCachebZb+337 - _Dmain+3618 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv+40 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ7tryExecMFMDFZvZv+32 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZv+139 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ7tryExecMFMDFZvZv+32 - _d_run_main+463 - main+16 - __libc_start_main+235 - 0x41fd89415541f689 -]: 450 -@[ - _D2gc4impl12conservativeQw14ConservativeGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_+0 - _D2rt8lifetime12__arrayAllocFNaNbmxC8TypeInfoxQlZS4core6memory8BlkInfo_+236 - _d_arrayappendcTX+1944 - _D8dscanner8analysis3run7analyzeFAyaxC6dparse3ast6ModulexSQCeQBy6config20StaticAnalysisConfigKS7dsymbol11modulecache11ModuleCacheAxS3std12experimental5lexer__T14TokenStructureThVQFpa305_0a20202020737472696e6720636f6d6d656e743b0a20202020737472696e6720747261696c696e67436f6d6d656e743b0a0a20202020696e74206f70436d702873697a655f7420692920636f6e73742070757265206e6f7468726f77204073616665207b0a202020202020202069662028696e646578203c2069292072657475726e202d313b0a202020202020202069662028696e646578203e2069292072657475726e20313b0a202020202020202072657475726e20303b0a202020207d0a0a20202020696e74206f70436d702872656620636f6e737420747970656f66287468697329206f746865722920636f6e73742070757265206e6f7468726f77204073616665207b0a202020202020202072657475726e206f70436d70286f746865722e696e646578293b0a202020207d0aZQYobZCQZv9container6rbtree__T12RedBlackTreeTSQBGiQBGd4base7MessageVQBFza62_20612e6c696e65203c20622e6c696e65207c7c2028612e6c696e65203d3d20622e6c696e6520262620612e636f6c756d6e203c20622e636f6c756d6e2920Vbi1ZQGt+680 - _D8dscanner8analysis3run7analyzeFAAyaxSQBlQBf6config20StaticAnalysisConfigQBoKS6dparse5lexer11StringCacheKS7dsymbol11modulecache11ModuleCachebZb+337 - _Dmain+3618 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv+40 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ7tryExecMFMDFZvZv+32 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZv+139 - _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ7tryExecMFMDFZvZv+32 - _d_run_main+463 - main+16 - __libc_start_main+235 - 0x41fd89415541f689 -]: 450 -``` - -It looks like a lot of the small allocations are due to a red-black tree in `ModuleCache`. - -### What’s next? - -I think these examples already show that `bpftrace` is a pretty powerful tool. There’s a lot more that can done, and I highly recommended reading [Brendan Gregg’s eBPF tutorials][18]. - -I used uprobes to trace arbitrary functions in the D runtime. The pro of this is the freedom to do anything, but the cons are that I had to refer to the D runtime source code and manually deal with the D ABI. There’s also no guarantee that a script I write today will work with future versions of the runtime. Linux also supports making well-defined tracepoints in user code using a feature called [USDT][19]. That should let D code export stable tracepoints that can be used without worrying about the D ABI. I might do more experiments in future. - --------------------------------------------------------------------------------- - -via: https://theartofmachinery.com/2019/04/26/bpftrace_d_gc.html - -作者:[Simon Arneaud][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://theartofmachinery.com -[b]: https://github.com/lujun9972 -[1]: https://github.com/iovisor/bpftrace -[2]: https://en.wikipedia.org/wiki/Java_virtual_machine -[3]: http://dtrace.org/blogs/about/ -[4]: https://github.com/iovisor/bpftrace/blob/master/INSTALL.md -[5]: https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md -[6]: https://github.com/iovisor/bpftrace/blob/master/docs/tutorial_one_liners.md -[7]: https://dlang.org/spec/abi.html#name_mangling -[8]: https://github.com/dlang-community/D-Scanner -[9]: https://github.com/dlang/druntime/ -[10]: https://dlang.org/spec/garbage.html#gc_config -[11]: https://dlang.org/phobos/core_memory.html#.GC.stats -[12]: https://github.com/dlang/druntime/tree/v2.081.1/src/gc -[13]: https://github.com/dlang/druntime/tree/v2.081.1/src/gc/impl/conservative -[14]: https://github.com/dlang/tools -[15]: https://dlang.org/spec/abi.html#parameters -[16]: https://en.wikipedia.org/wiki/Copy_elision -[17]: https://github.com/iovisor/bpftrace/issues/246 -[18]: http://www.brendangregg.com/blog/2019-01-01/learn-ebpf-tracing.html -[19]: https://lwn.net/Articles/753601/ diff --git a/sources/talk/20190430 Measuring the edge- Finding success with edge deployments.md b/sources/talk/20190430 Measuring the edge- Finding success with edge deployments.md deleted file mode 100644 index abc1d7dd0c..0000000000 --- a/sources/talk/20190430 Measuring the edge- Finding success with edge deployments.md +++ /dev/null @@ -1,73 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Measuring the edge: Finding success with edge deployments) -[#]: via: (https://www.networkworld.com/article/3391570/measuring-the-edge-finding-success-with-edge-deployments.html#tk.rss_all) -[#]: author: (Anne Taylor https://www.networkworld.com/author/Anne-Taylor/) - -Measuring the edge: Finding success with edge deployments -====== -To make the most of edge computing investments, it’s important to first understand objectives and expectations. -![iStock][1] - -Edge computing deployments are well underway as companies seek to better process the wealth of data being generated, for example, by Internet of Things (IoT) devices. - -So, what are the results? Plus, how can you ensure success with your own edge projects? - -**Measurements of success** - -The [use cases for edge computing deployments][2] vary widely, as do the business drivers and, ultimately, the benefits. - -Whether they’re seeking improved network or application performance, real-time data analytics, a better customer experience, or other efficiencies, enterprises are accomplishing their goals. Based on two surveys — one by [_Automation World_][3] and another by [Futurum Research][4] — respondents have reported: - - * Decreased network downtime - * Increased productivity - * Increased profitability/reduced costs - * Improved business processes - - - -Basically, success metrics can be bucketed into two categories: direct value propositions and cost reductions. In the former, companies are seeking results that measure revenue generation — such as improved digital experiences with customers and users. In the latter, metrics that prove the value of digitizing processes — like speed, quality, and efficacy — will demonstrate success with edge deployments. - -**Goalposts for success with edge** - -Edge computing deployments are underway. But before diving in, understand what’s driving these projects. - -According to the Futurum Research, 29% of respondents are currently investing in edge infrastructure, and 62% expect to adopt within the year. For these companies, the driving force has been the business, which expects operational efficiencies from these investments. Beyond that, there’s an expectation down the road to better align with IoT strategy. - -That being the case, it’s worth considering your business case before diving into edge. Ask: Are you seeking innovation and revenue generation amid digital transformation efforts? Or is your company looking for a low-risk, “test the waters” type of investment in edge? - -Next up, what type of edge project makes sense for your environment? Edge data centers fall into three categories: local devices for a specific purpose (e.g., an appliance for security systems or a gateway for cloud-to-premises storage); small local data centers (typically one to 10 racks for storage and processing); and regional data centers (10+ racks for large office spaces). - -Then, think about these best practices before talking with vendors: - - * Management: Especially for unmanned edge data centers, remote management is critical. You’ll need predictive alerts and a service contract that enables IT to be just as resilient as a regular data center. - * Security:Much of today’s conversation has been around data security. That starts with physical protection. Too many data breaches — including theft and employee error — are caused by physical access to IT assets. - * Standardization: There is no need to reinvent the wheel when it comes to edge data center deployments. Using standard components makes it easier for the internal IT team to deploy, manage, and maintain. - - - -Finally, consider the ecosystem. The end-to-end nature of edge requires not just technology integration, but also that all third parties work well together. A good ecosystem connects customers, partners, and vendors. - -Get further information to kickstart your edge computing environment at [APC.com][5]. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3391570/measuring-the-edge-finding-success-with-edge-deployments.html#tk.rss_all - -作者:[Anne Taylor][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Anne-Taylor/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/istock-912928582-100795093-large.jpg -[2]: https://www.networkworld.com/article/3391016/edge-computing-is-in-most-industries-future.html -[3]: https://www.automationworld.com/article/technologies/cloud-computing/its-not-edge-vs-cloud-its-both -[4]: https://futurumresearch.com/edge-computing-from-edge-to-enterprise/ -[5]: https://www.apc.com/us/en/solutions/business-solutions/edge-computing.jsp diff --git a/sources/talk/20190501 Yet another killer cloud quarter puts pressure on data centers.md b/sources/talk/20190501 Yet another killer cloud quarter puts pressure on data centers.md deleted file mode 100644 index d65fe448b4..0000000000 --- a/sources/talk/20190501 Yet another killer cloud quarter puts pressure on data centers.md +++ /dev/null @@ -1,92 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Yet another killer cloud quarter puts pressure on data centers) -[#]: via: (https://www.networkworld.com/article/3391465/another-strong-cloud-computing-quarter-puts-pressure-on-data-centers.html#tk.rss_all) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -Yet another killer cloud quarter puts pressure on data centers -====== -Continued strong growth from Amazon Web Services, Microsoft Azure, and Google Cloud Platform signals even more enterprises are moving to the cloud. -![Getty Images][1] - -You’d almost think I’d get tired of [writing this story over and over and over][2]… but the ongoing growth of cloud computing is too big a trend to ignore. - -Critically, the impressive growth numbers of the three leading cloud infrastructure providers—Amazon Web Services (AWS), Microsoft Azure, and Google Cloud Platform—doesn’t occur in a vacuum. It’s not just about new workloads being run in the cloud; it’s also about more and more enterprises moving existing workloads to the cloud from on-premises data centers. - -**[ Also read:[Is the cloud already killing the enterprise data center?][3] ]** - -To put these trends in perspective, let’s take a look at the results for all three vendors. - -### AWS keeps on trucking - -AWS remains by far the dominant player in the cloud infrastructure market, with a massive [$7.7 billion in quarterly sales][4] (an annual run rate of a whopping $30.8 billion). Even more remarkable, somehow AWS continues to grow revenue by almost 42% year over year. Oh, and that kind of growth is not just unique _this_ quarter; the unit has topped 40% revenue growth _every_ quarter since the beginning of 2017. (To be fair, the first quarter of 2018 saw an amazing 49% revenue growth.) - -And unlike many fast-growing tech companies, that incredible expansion isn’t being fueled by equally impressive losses. AWS earned a healthy $2.2 billion operating profit in the quarter, up 59% from the same period last year. One reason? [The company told analysts][5] it made big data center investments in 2016 and 2017, so it hasn’t had to do so more recently (it expects to boost spending on data centers later this year). The company [reportedly][6] described AWS revenue growth as “lumpy,” but it seems to me that the numbers merely vary between huge and even bigger. - -### Microsoft Azure grows even faster than AWS - -Sure, 41% growth is good, but [Microsoft’s quarterly Azure revenue][7] almost doubled that, jumping 73% year over year (fairly consistent with the previous—also stellar—quarter), helping the company exceed estimates for both sales and revenue and sparking a brief shining moment of a $1 billion valuation for the company. Microsoft doesn’t break out Azure’s sales and revenue, but [the commercial cloud business, which includes Azure as well as other cloud businesses, grew 41% in the quarter to $9.6 billion][8]. - -It’s impossible to tell exactly how big Azure is, but it appears to be growing faster than AWS, though off a much smaller base. While some analysts reportedly say Azure is growing faster than AWS was at a similar stage in its development, that may not bear much significance because the addressable cloud market is now far larger than it used be. - -According to [the New York Times][9], like AWS, Microsoft is also now reaping the benefits of heavy investments in new data centers around the world. And the Times credits Microsoft with “particular success” in [hybrid cloud installations][10], helping ease concerns among some slow-to-change enterprise about full-scale cloud adoption. - -**[ Also read:[Why hybrid cloud will turn out to be a transition strategy][11] ]** - -### Can Google Cloud Platform keep up? - -Even as the [overall quarterly numbers for Alphabet][12]—Google’s parent company—didn’t meet analysts’ revenue expectations (which sent the stock tumbling), Google Cloud Platform seems to have continued its strong growth. Alphabet doesn’t break out its cloud unit, but sales in Alphabet’s “Other Revenue” category—which includes cloud computing along with hardware—jumped 25% compared to the same period last year, hitting $5.4 billion. - -More telling, perhaps, Alphabet Chief Financial Officer Ruth Porat [reportedly][13] told analysts that "Google Cloud Platform remains one of the fastest growing businesses in Alphabet." [Porat also mentioned][14] that hiring in the cloud unit was so aggressive that it drove a 20% jump in Alphabet’s operating expenses! - -### Companies keep going cloud - -But the raw numbers tell only part of the story. All that growth means existing customers are spending more, but also that ever-increasing numbers of enterprises are abandoning their hassle and expense of running their data centers in favor of buying what they need from the cloud. - -**[ Also read:[Large enterprises abandon data centers for the cloud][15] ]** - -The New York Times quotes Amy Hood, Microsoft’s chief financial officer, explaining that, “You don’t really get revenue growth unless you have a usage growth, so this is customers deploying and using Azure.” And the Times notes that Microsoft has signed big deals with companies such as [Walgreens Boots Alliance][16] that combined Azure with other Microsoft cloud-based services. - -This growth is true in existing markets, and also includes new markets. For example, AWS just opened new regions in [Indonesia][17] and [Hong Kong][18]. - -**[ Now read:[After virtualization and cloud, what's left on premises?][19] ]** - -Join the Network World communities on [Facebook][20] and [LinkedIn][21] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3391465/another-strong-cloud-computing-quarter-puts-pressure-on-data-centers.html#tk.rss_all - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/cloud_comput_connect_blue-100787048-large.jpg -[2]: https://www.networkworld.com/article/3292935/cloud-computing-just-had-another-kick-ass-quarter.html -[3]: https://www.networkworld.com/article/3268384/is-the-cloud-already-killing-the-enterprise-data-center.html -[4]: https://www.latimes.com/business/la-fi-amazon-earnings-cloud-computing-aws-20190425-story.html -[5]: https://www.businessinsider.com/amazon-q1-2019-earnings-aws-advertising-retail-prime-2019-4 -[6]: https://www.computerweekly.com/news/252462310/Amazon-cautions-against-reading-too-much-into-slowdown-in-AWS-revenue-growth-rate -[7]: https://www.microsoft.com/en-us/Investor/earnings/FY-2019-Q3/press-release-webcast -[8]: https://www.cnbc.com/2019/04/24/microsoft-q3-2019-earnings.html -[9]: https://www.nytimes.com/2019/04/24/technology/microsoft-earnings.html -[10]: https://www.networkworld.com/article/3268448/what-is-hybrid-cloud-really-and-whats-the-best-strategy.html -[11]: https://www.networkworld.com/article/3238466/why-hybrid-cloud-will-turn-out-to-be-a-transition-strategy.html -[12]: https://abc.xyz/investor/static/pdf/2019Q1_alphabet_earnings_release.pdf?cache=8ac2b86 -[13]: https://www.forbes.com/sites/jilliandonfro/2019/04/29/google-alphabet-q1-earnings-2019/#52f5c8c733be -[14]: https://www.youtube.com/watch?v=31_KHdse_0Y -[15]: https://www.networkworld.com/article/3240587/large-enterprises-abandon-data-centers-for-the-cloud.html -[16]: https://www.walgreensbootsalliance.com -[17]: https://www.businesswire.com/news/home/20190403005931/en/AWS-Open-New-Region-Indonesia -[18]: https://www.apnews.com/Business%20Wire/57eaf4cb603e46e6b05b634d9751699b -[19]: https://https//www.networkworld.com/article/3232626/virtualization/extreme-virtualization-impact-on-enterprises.html -[20]: https://www.facebook.com/NetworkWorld/ -[21]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190502 Revolutionary data compression technique could slash compute costs.md b/sources/talk/20190502 Revolutionary data compression technique could slash compute costs.md deleted file mode 100644 index 00316946f6..0000000000 --- a/sources/talk/20190502 Revolutionary data compression technique could slash compute costs.md +++ /dev/null @@ -1,65 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Revolutionary data compression technique could slash compute costs) -[#]: via: (https://www.networkworld.com/article/3392716/revolutionary-data-compression-technique-could-slash-compute-costs.html#tk.rss_all) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Revolutionary data compression technique could slash compute costs -====== -A new form of data compression, called Zippads, will create faster computer programs that could drastically lower the costs of computing. -![Kevin Stanchfield \(CC BY 2.0\)][1] - -There’s a major problem with today’s money-saving memory compression used for storing more data in less space. The issue is that computers store and run memory in predetermined blocks, yet many modern programs function and play out in variable chunks. - -The way it’s currently done is actually, highly inefficient. That’s because the compressed programs, which use objects rather than evenly configured slabs of data, don’t match the space used to store and run them, explain scientists working on a revolutionary new compression system called Zippads. - -The answer, they say—and something that if it works would drastically reduce those inefficiencies, speed things up, and importantly, reduce compute costs—is to compress the varied objects and not the cache lines, as is the case now. Cache lines are fixed-size blocks of memory that are transferred to memory cache. - -**[ Read also:[How to deal with backup when you switch to hyperconverged infrastructure][2] ]** - -“Objects, not cache lines, are the natural unit of compression,” writes Po-An Tsai and Daniel Sanchez in their MIT Computer Science and Artificial Intelligence Laboratory (CSAIL) [paper][3] (pdf). - -They say object-based programs — of the kind used now everyday, such as Python — should be compressed based on their programmed object size, not on some fixed value created by traditional or even state-of-the art cached methods. - -The alternative, too, isn’t to recklessly abandon object-oriented programming just because it’s inefficient at using compression. One must adapt compression to that now common object-using code. - -The scientists claim their new system can increase the compression ratio 1.63 times and improve performance by 17%. It’s the “first compressed memory hierarchy designed for object-based applications,” they say. - -### The benefits of compression - -Compression is a favored technique for making computers more efficient. The main advantage over simply adding more memory is that costs are lowered significantly—you don’t need to add increasing physical main memory hardware because you’re cramming more data into existing. - -However, to date, hardware memory compression has been best suited to more old-school large blocks of data, not the “random, fine-grained memory accesses,” the team explains. It’s not great at accessing small pieces of data, such as words, for example. - -### How the Zippads compression system works - -In Zippads, as the new system is called, stored object hierarchical levels (called “pads”) are located on-chip and are directly accessed. The different levels (pads) have changing speed grades, with newly referenced objects being placed in the fastest pad. As a pad fills up, it begins the process of evicting older, not-so-active objects and ultimately recycles the unused code that is taking up desirable fast space and isn’t being used. Cleverly, at the fast level, the code parts aren’t even compressed, but as they prove their non-usefulness they get kicked down to compressed, slow-to-access, lower-importance pads—and are brought back up as necessary. - -Zippads would “see computers that can run much faster or can run many more apps at the same speeds,” an[ MIT News][4] article says. “Each application consumes less memory, it runs faster, so a device can support more applications within its allotted memory.” Bandwidth is freed up, in other words. - -“All computer systems would benefit from this,” Sanchez, a professor of computer science and electrical engineering, says in the article. “Programs become faster because they stop being bottlenecked by memory bandwidth.” - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3392716/revolutionary-data-compression-technique-could-slash-compute-costs.html#tk.rss_all - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/memory-100787327-large.jpg -[2]: https://www.networkworld.com/article/3389396/how-to-deal-with-backup-when-you-switch-to-hyperconverged-infrastructure.html -[3]: http://people.csail.mit.edu/poantsai/papers/2019.zippads.asplos.pdf -[4]: http://news.mit.edu/2019/hardware-data-compression-0416 -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190507 SD-WAN is Critical for IoT.md b/sources/talk/20190507 SD-WAN is Critical for IoT.md deleted file mode 100644 index a5867d5afd..0000000000 --- a/sources/talk/20190507 SD-WAN is Critical for IoT.md +++ /dev/null @@ -1,74 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (SD-WAN is Critical for IoT) -[#]: via: (https://www.networkworld.com/article/3393445/sd-wan-is-critical-for-iot.html#tk.rss_all) -[#]: author: (Rami Rammaha https://www.networkworld.com/author/Rami-Rammaha/) - -SD-WAN is Critical for IoT -====== - -![istock][1] - -The Internet of Things (IoT) is everywhere and its use is growing fast. IoT is used by local governments to build smart cities. It’s used to build smart businesses. And, consumers are benefitting as it’s built into smart homes and smart cars. Industry analyst first estimates that over 20 billion IoT devices will be connected by 2020. That’s a 2.5x increase from the more than 8 billion connected devices in 2017*. - -Manufacturing companies have the highest IoT spend to date of industries while the health care market is experiencing the highest IoT growth. By 2020, 50 percent of IoT spending will be driven by manufacturing, transportation and logistics, and utilities. - -IoT growth is being fueled by the promise of analytical data insights that will ultimately yield greater efficiencies and enhanced customer satisfaction. The top use cases driving IoT growth are self-optimizing production, predictive maintenance and automated inventory management. - -From a high-level view, the IoT architecture includes sensors that collect and transmit data (i.e. temperature, speed, humidity, video feed, pressure, IR, proximity, etc.) from “things” like cars, trucks, machines, etc. that are connected over the internet. Data collected is then analyzed, translating raw data into actionable information. Businesses can then act on this information. And at more advanced levels, machine learning and AI algorithms learn and adapt to this information and automatically respond at a system level. - -IDC estimates that by 2025, over 75 billion IoT devices* will be connected. By that time, nearly a quarter of the world’s projected 163 zettabytes* (163 trillion gigabytes) of data will have been created in real-time, and the vast majority of that data will have been created by IoT devices. This massive amount of data will drive an exponential increase in traffic on the network infrastructure requiring massive scalability. Also, this increasing amount of data will require tremendous processing power to mine it and transform it into actionable intelligence. In parallel, security risks will continue to increase as there will be many more potential entry points onto the network. Lastly, management of the overall infrastructure will require better orchestration of policies as well as the means to streamline on-going operations. - -### **How does SD-WAN enable IoT business initiatives?** - -There are three key elements that an [SD-WAN][2] platform must include: - - 1. **Visibility** : Real-time visibility into the network is key. It takes the guesswork out of rapid problem resolution, enabling organizations to run more efficiently by accelerating troubleshooting and applying preventive measures. Furthermore, a CIO is able to pull metrics and see bandwidth consumed by any IoT application. - 2. **Security** : IoT traffic must be isolated from other application traffic. IT must prevent – or at least reduce – the possible attack surface that may be exposed to IoT device traffic. Also, the network must continue delivering other application traffic in the event of a melt down on a WAN link caused by a DDoS attack. - 3. **Agility** : With the increased number of connected devices, applications and users, a comprehensive, intelligent and centralized orchestration approach that continuously adapts to deliver the best experience to the business and users is critical to success. - - - -### Key Silver Peak EdgeConnect SD-WAN capabilities for IoT - -1\. Silver Peak has an [embedded real-time visibility engine][3] allowing IT to gain complete observability into the performance attributes of the network and applications in real-time. The [EdgeConnect][4] SD-WAN appliances deployed in branch offices send information to the centralized [Unity Orchestrator™][5]. Orchestrator collects the data and presents it in a comprehensive management dashboard via customizable widgets. These widgets provide a wealth of operational data including a health heatmap for every SD-WAN appliance deployed, flow counts, active tunnels, logical topologies, top talkers, alarms, bandwidth consumed by each application and location, latency and jitter and much more. Furthermore, the platform maintains weeks’ worth of data with context allowing IT to playback and see what has transpired at a specific time and location, similar to a DVR. - -![Click to read Solution Brief][6] - -2\. The second set of key capabilities center around security and end-to-end zone-based segmentation. An IoT traffic zone may be created on the LAN or branch side. IoT traffic is then mapped all the way across the WAN to the data center or cloud where the data will be processed. Zone-based segmentation is accomplished in a simplified and automated way within the Orchestrator GUI. In cases where further traffic inspection is required, IT can simply service chain to another security service. There are several key benefits realized by this approach. IT can easily and quickly apply segmentation policies; segmentation mitigates the attack surface; and IT can save on additional security investments. - -![***Click to read Solution Brief ***][7] - -3\. EdgeConnect employs machine learning at the global level where with internet sensors and third-party sensors feed into the cloud portal software. The software tracks the geolocation of all IP addresses and IP reputation, distributing signals down to the Unity Orchestrator running in each individual customer’s enterprise. In turn, it is speaking to the edge devices sitting in the branch offices. There, distributed learning is done by looking at the first packet, making an inference based on the first packet what the application is. So, if seeing that 100 times now, every time packets come from that particular IP address and turns out to be an IoT, we can make an inference that IP belongs to IoT application. In parallel, we’re using a mix of traditional techniques to validate the identification of the application. All this combined other multi-level intelligence enables simple and automated policy orchestration across a large number of devices and applications. - -![***Click to read Solution Brief ***][8] - -SD-WAN plays a foundational role as businesses continue to embrace IoT, but choosing the right SD-WAN platform is even more critical to ensuring businesses are ultimately able to fully optimize their operations. - -* Source: [IDC][9] - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3393445/sd-wan-is-critical-for-iot.html#tk.rss_all - -作者:[Rami Rammaha][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Rami-Rammaha/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/istock-1019172426-100795551-large.jpg -[2]: https://www.silver-peak.com/sd-wan/sd-wan-explained -[3]: https://www.silver-peak.com/resource-center/simplify-sd-wan-operations-greater-visibility -[4]: https://www.silver-peak.com/products/unity-edge-connect -[5]: https://www.silver-peak.com/products/unity-orchestrator -[6]: https://images.idgesg.net/images/article/2019/05/1_simplify-100795554-large.jpg -[7]: https://images.idgesg.net/images/article/2019/05/2_centralize-100795555-large.jpg -[8]: https://images.idgesg.net/images/article/2019/05/3_increase-100795558-large.jpg -[9]: https://www.information-age.com/data-forecast-grow-10-fold-2025-123465538/ diff --git a/sources/talk/20190507 Some IT pros say they have too much data.md b/sources/talk/20190507 Some IT pros say they have too much data.md deleted file mode 100644 index a645ae52e9..0000000000 --- a/sources/talk/20190507 Some IT pros say they have too much data.md +++ /dev/null @@ -1,66 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Some IT pros say they have too much data) -[#]: via: (https://www.networkworld.com/article/3393205/some-it-pros-say-they-have-too-much-data.html#tk.rss_all) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Some IT pros say they have too much data -====== -IT professionals have too many data sources to count, and they spend a huge amount of time wrestling that data into usable condition, a survey from Ivanti finds. -![Getty Images][1] - -A new survey has found that a growing number of IT professionals have too many data sources to even count, and they are spending more and more time just wrestling that data into usable condition. - -Ivanti, an IT asset management firm, [surveyed 400 IT professionals on their data situation][2] and found IT faces numerous challenges when it comes to siloes, data, and implementation. The key takeaway is data overload is starting to overwhelm IT managers and data lakes are turning into data oceans. - -**[ Read also:[Understanding mass data fragmentation][3] | Get daily insights [Sign up for Network World newsletters][4] ]** - -Among the findings from Ivanti's survey: - - * Fifteen percent of IT professionals say they have too many data sources to count, and 37% of professionals said they have about 11-25 different sources for data. - * More than half of IT professionals (51%) report they have to work with their data for days, weeks or more before it's actionable. - * Only 10% of respondents said the data they receive is actionable within minutes. - * One in three respondents said they have the resources to act on their data, but more than half (52%) said they only sometimes have the resources. - - - -“It’s clear from the results of this survey that IT professionals are in need of a more unified approach when working across organizational departments and resulting silos,” said Duane Newman, vice president of product management at Ivanti, in a statement. - -### The problem with siloed data - -The survey found siloed data represents a number of problems and challenges. Three key priorities suffer the most: automation (46%), user productivity and troubleshooting (42%), and customer experience (41%). The survey also found onboarding/offboarding suffers the least (20%) due to siloes, so apparently HR and IT are getting things right. - -In terms of what they want from real-time insight, about 70% of IT professionals said their security status was the top priority over other issues. Respondents were least interested in real-time insights around warranty data. - -### Data lake method a recipe for disaster - -I’ve been immersed in this subject for other publications for some time now. Too many companies are hoovering up data for the sake of collecting it with little clue as to what they will do with it later. One thing you have to say about data warehouses, the schema on write at least forces you to think about what you are collecting and how you might use it because you have to store it away in a usable form. - -The new data lake method is schema on read, meaning you filter/clean it when you read it into an application, and that’s just a recipe for disaster. If you are looking at data collected a month or a year ago, do you even know what it all is? Now you have to apply schema to data and may not even remember collecting it. - -Too many people think more data is good when it isn’t. You just drown in it. When you reach a point of having too many data sources to count, you’ve gone too far and are not going to get insight. You’re going to get overwhelmed. Collect data you know you can use. Otherwise you are wasting petabytes of disk space. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3393205/some-it-pros-say-they-have-too-much-data.html#tk.rss_all - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/03/database_data-center_futuristic-technology-100752012-large.jpg -[2]: https://www.ivanti.com/blog/survey-it-professionals-data-sources -[3]: https://www.networkworld.com/article/3262145/lan-wan/customer-reviews-top-remote-access-tools.html#nww-fsb -[4]: https://www.networkworld.com/newsletters/signup.html#nww-fsb -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190509 When it comes to uptime, not all cloud providers are created equal.md b/sources/talk/20190509 When it comes to uptime, not all cloud providers are created equal.md deleted file mode 100644 index 8f9db8a94b..0000000000 --- a/sources/talk/20190509 When it comes to uptime, not all cloud providers are created equal.md +++ /dev/null @@ -1,83 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (When it comes to uptime, not all cloud providers are created equal) -[#]: via: (https://www.networkworld.com/article/3394341/when-it-comes-to-uptime-not-all-cloud-providers-are-created-equal.html#tk.rss_all) -[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/) - -When it comes to uptime, not all cloud providers are created equal -====== -Cloud uptime is critical today, but vendor-provided data can be confusing. Here's an analysis of how AWS, Google Cloud and Microsoft Azure compare. -![Getty Images][1] - -The cloud is not just important; it's mission-critical for many companies. More and more IT and business leaders I talk to look at public cloud as a core component of their digital transformation strategies — using it as part of their hybrid cloud or public cloud implementation. - -That raises the bar on cloud reliability, as a cloud outage means important services are not available to the business. If this is a business-critical service, the company may not be able to operate while that key service is offline. - -Because of the growing importance of the cloud, it’s critical that buyers have visibility into the reliability number for the cloud providers. The challenge is the cloud providers don't disclose the disruptions in a consistent manner. In fact, some are confusing to the point where it’s difficult to glean any kind of meaningful conclusion. - -**[ RELATED:[What IT pros need to know about Azure Stack][2] and [Which cloud performs better, AWS, Azure or Google?][3] | Get regularly scheduled insights: [Sign up for Network World newsletters][4] ]** - -### Reported cloud outage times don't always reflect actual downtime - -Microsoft Azure and Google Cloud Platform (GCP) both typically provide information on date and time, but only high-level data on the services affected and sparse information on regional impact. The problem with that is it’s difficult to get a sense of overall reliability. For instance, if Azure reports a one-hour outage that impacts five services in three regions, the website might show just a single hour. In actuality, that’s 15 hours of total downtime. - -Between Azure, GCP and Amazon Web Services (AWS), [Azure is the most obscure][5], as it provides the least amount of detail. [GCP does a better job of providing detail][6] at the service level but tends to be obscure with regional information. Sometimes it’s very clear as to what services are unavailable, and other times it’s not. - -[AWS has the most granular reporting][7], as it shows every service in every region. If an incident occurs that impacts three services, all three of those services would light up red. If those were unavailable for one hour, AWS would record three hours of downtime. - -Another inconsistency between the cloud providers is the amount of historical downtime data that is available. At one time, all three of the cloud vendors provided a one-year view into outages. GCP and AWS still do this, but Azure moved to only a [90-day view][5] sometime over the past year. - -### Azure has significantly higher downtime than GCP and AWS - -The next obvious question is who has the most downtime? To answer that, I worked with a third-party firm that has continually collected downtime information directly from the vendor websites. I have personally reviewed the information and can validate its accuracy. Based on the vendors own reported numbers, from the beginning of 2018 through May 3, 2019, AWS leads the pack with only 338 hours of downtime, followed by GCP closely at 361. Microsoft Azure has a whopping total of 1,934 hours of self-reported downtime. - -![][8] - -A few points on these numbers. First, this is an aggregation of the self-reported data from the vendors' websites, which isn’t the “true” number, as regional information or service granularity is sometimes obscured. If a service is unavailable for an hour and it’s reported for an hour on the website but it spanned five regions, correctly five hours should have been used. But for this calculation, we used only one hour because that is what was self-reported. - -Because of this, the numbers are most favorable to Microsoft because they provide the least amount of regional information. The numbers are least favorable to AWS because they provide the most granularity. Also, I believe AWS has the most services in most regions, so they have more opportunities for an outage. - -We had considered normalizing the data, but that would require a significant amount of work to destruct the downtime on a per service per region basis. I may choose to do that in the future, but for now, the vendor-reported view is a good indicator of relative performance. - -Another important point is that only infrastructure as a service (IaaS) services were used to calculate downtime. If Google Street View or Bing Maps went down, most businesses would not care, so it would have been unfair to roll those number in. - -### SLAs do not correlate to reliability - -Given the importance of cloud services today, I would like to see every cloud provider post a 12-month running total of downtime somewhere on their website so customers can do an “apples to apples” comparison. This obviously isn’t the only factor used in determining which cloud provider to use, but it is one of the more critical ones. - -Also, buyers should be aware that there is a big difference between service-level agreements (SLAs) and downtime. A cloud operator can promise anything they want, even provide a 100% SLA, but that just means they need to reimburse the business when a service isn’t available. Most IT leaders I have talked to say the few bucks they get back when a service is out is a mere fraction of what the outage actually cost them. - -### Measure twice and cut once to minimize business disruption - -If you’re reading this and you’re researching cloud services, it’s important to not just make the easy decision of buying for convenience. Many companies look at Azure because Microsoft gives away Azure credits as part of the Enterprise Agreement (EA). I’ve interviewed several companies that took the path of least resistance, but they wound up disappointed with availability and then switched to AWS or GCP later, which can have a disruptive effect. - -I’m certainly not saying to not buy Microsoft Azure, but it is important to do your homework to understand the historical performance of the services you’re considering in the regions you need them. The information on the vendor websites may not tell the full picture, so it’s important to do the necessary due diligence to ensure you understand what you’re buying before you buy it. - -Join the Network World communities on [Facebook][9] and [LinkedIn][10] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3394341/when-it-comes-to-uptime-not-all-cloud-providers-are-created-equal.html#tk.rss_all - -作者:[Zeus Kerravala][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Zeus-Kerravala/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/cloud_comput_connect_blue-100787048-large.jpg -[2]: https://www.networkworld.com/article/3208029/azure-stack-microsoft-s-private-cloud-platform-and-what-it-pros-need-to-know-about-it -[3]: https://www.networkworld.com/article/3319776/the-network-matters-for-public-cloud-performance.html -[4]: https://www.networkworld.com/newsletters/signup.html -[5]: https://azure.microsoft.com/en-us/status/history/ -[6]: https://status.cloud.google.com/incident/appengine/19008 -[7]: https://status.aws.amazon.com/ -[8]: https://images.idgesg.net/images/article/2019/05/public-cloud-downtime-100795948-large.jpg -[9]: https://www.facebook.com/NetworkWorld/ -[10]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190513 Top auto makers rely on cloud providers for IoT.md b/sources/talk/20190513 Top auto makers rely on cloud providers for IoT.md deleted file mode 100644 index 5adf5f65a7..0000000000 --- a/sources/talk/20190513 Top auto makers rely on cloud providers for IoT.md +++ /dev/null @@ -1,53 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Top auto makers rely on cloud providers for IoT) -[#]: via: (https://www.networkworld.com/article/3395137/top-auto-makers-rely-on-cloud-providers-for-iot.html) -[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) - -Top auto makers rely on cloud providers for IoT -====== - -For the companies looking to implement the biggest and most complex [IoT][1] setups in the world, the idea of pairing up with [AWS][2], [Google Cloud][3] or [Azure][4] seems to be one whose time has come. Within the last two months, BMW and Volkswagen have both announced large-scale deals with Microsoft and Amazon, respectively, to help operate their extensive network of operational technology. - -According to Alfonso Velosa, vice president and analyst at Gartner, part of the impetus behind those two deals is that the automotive sector fits in very well with the architecture of the public cloud. Public clouds are great at collecting and processing data from a diverse array of different sources, whether they’re in-vehicle sensors, dealerships, mechanics, production lines or anything else. - -**[ RELATED:[What hybrid cloud means in practice][5]. | Get regularly scheduled insights by [signing up for Network World newsletters][6]. ]** - -“What they’re trying to do is create a broader ecosystem. They think they can leverage the capabilities from these folks,” Velosa said. - -### Cloud providers as IoT partners - -The idea is automated analytics for service and reliability data, manufacturing and a host of other operational functions. And while the full realization of that type of service is still very much a work in progress, it has clear-cut advantages for big companies – a skilled partner handling tricky implementation work, built-in capability for sophisticated analytics and security, and, of course, the ability to scale up in a big way. - -Hence, the structure of the biggest public clouds has upside for many large-scale IoT deployments, not just the ones taking place in the auto industry. The cloud giants have vast infrastructures, with multiple points of presence all over the world. - -To continue reading this article register now - -[Get Free Access][7] - -[Learn More][8] Existing Users [Sign In][7] - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3395137/top-auto-makers-rely-on-cloud-providers-for-iot.html - -作者:[Jon Gold][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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://www.networkworld.com/article/3207535/what-is-iot-how-the-internet-of-things-works.html -[2]: https://www.networkworld.com/article/3324043/aws-does-hybrid-cloud-with-on-prem-hardware-vmware-help.html -[3]: https://www.networkworld.com/article/3388218/cisco-google-reenergize-multicloudhybrid-cloud-joint-development.html -[4]: https://www.networkworld.com/article/3385078/microsoft-introduces-azure-stack-for-hci.html -[5]: https://www.networkworld.com/article/3249495/what-hybrid-cloud-mean-practice -[6]: https://www.networkworld.com/newsletters/signup.html -[7]: javascript:// -[8]: /learn-about-insider/ diff --git a/sources/talk/20190514 Mobility and SD-WAN, Part 1- SD-WAN with 4G LTE is a Reality.md b/sources/talk/20190514 Mobility and SD-WAN, Part 1- SD-WAN with 4G LTE is a Reality.md deleted file mode 100644 index 1ecd68fa41..0000000000 --- a/sources/talk/20190514 Mobility and SD-WAN, Part 1- SD-WAN with 4G LTE is a Reality.md +++ /dev/null @@ -1,64 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Mobility and SD-WAN, Part 1: SD-WAN with 4G LTE is a Reality) -[#]: via: (https://www.networkworld.com/article/3394866/mobility-and-sd-wan-part-1-sd-wan-with-4g-lte-is-a-reality.html) -[#]: author: (Francisca Segovia ) - -Mobility and SD-WAN, Part 1: SD-WAN with 4G LTE is a Reality -====== - -![istock][1] - -Without a doubt, 5G — the fifth generation of mobile wireless technology — is the hottest topic in wireless circles today. You can’t throw a stone without hitting 5G news. While telecommunications providers are in a heated competition to roll out 5G, it’s important to reflect on current 4G LTE (Long Term Evolution) business solutions as a preview of what we have learned and what’s possible. - -This is part one of a two-part blog series that will explore the [SD-WAN][2] journey through the evolution of these wireless technologies. - -### **Mobile SD-WAN is a reality** - -4G LTE commercialization continues to expand. According to [the GSM (Groupe Spéciale Mobile) Association][3], 710 operators have rolled out 4G LTE in 217 countries, reaching 83 percent of the world’s population. The evolution of 4G is transforming the mobile industry and is setting the stage for the advent of 5G. - -Mobile connectivity is increasingly integrated with SD-WAN, along with MPLS and broadband WAN services today. 4G LTE represents a very attractive transport alternative, as a backup or even an active member of the WAN transport mix to connect users to critical business applications. And in some cases, 4G LTE might be the only choice in locations where fixed lines aren’t available or reachable. Furthermore, an SD-WAN can optimize 4G LTE connectivity and bring new levels of performance and availability to mobile-based business use cases by selecting the best path available across several 4G LTE connections. - -### **Increasing application performance and availability with 4G LTE** - -Silver Peak has partnered with [BEC Technologies][4] to create a joint solution that enables customers to incorporate one or more low-cost 4G LTE services into any [Unity EdgeConnect™][5] SD-WAN edge platform deployment. All the capabilities of the EdgeConnect platform are supported across LTE links including packet-based link bonding, dynamic path control, path conditioning along with the optional [Unity Boost™ WAN Optimization][6] performance pack. This ensures always-consistent, always-available application performance even in the event of an outage or degraded service. - -EdgeConnect also incorporates sophisticated NAT traversal technology that eliminates the requirement for provisioning the LTE service with extra-cost static IP addresses. The Silver Peak [Unity Orchestrator™][7] management software enables the prioritization of LTE bandwidth usage based on branch and application requirements – active-active or backup-only. This solution is ideal in retail point-of-sale and other deployment use cases where always-available WAN connectivity is critical for the business. - -### **Automated SD-WAN enables innovative services** - -An example of an innovative mobile SD-WAN service is [swyMed’s DOT Telemedicine Backpack][8] powered by the EdgeConnect [Ultra Small][9] hardware platform. This integrated telemedicine solution enables first responders to connect to doctors and communicate patient vital statistics and real-time video anywhere, any time, greatly improving and expediting care for emergency patients. Using a lifesaving backpack provisioned with two LTE services from different carriers, EdgeConnect continuously monitors the underlying 4G LTE services for packet loss, latency and jitter. In the case of transport failure or brownout, EdgeConnect automatically initiates a sub-second failover so that voice, video and data connections continue without interruption over the remaining active 4G service. By bonding the two LTE links together with the EdgeConnect SD-WAN, swyMed can achieve an aggregate signal quality in excess of 90 percent, bringing mobile telemedicine to areas that would have been impossible in the past due to poor signal strength. - -To learn more about SD-WAN and the unique advantages that SD-WAN provides to enterprises across all industries, visit the [SD-WAN Explained][2] page on our website. - -### **Prepare for the 5G future** - -In summary, the adoption of 4G LTE is a reality. Service providers are taking advantage of the distinct benefits of SD-WAN to offer managed SD-WAN services that leverage 4G LTE. - -As the race for the 5G gains momentum, service providers are sure to look for ways to drive new revenue streams to capitalize on their initial investments. Stay tuned for part 2 of this 2-blog series where I will discuss how SD-WAN is one of the technologies that can help service providers to transition from 4G to 5G and enable the monetization of a new wave of managed 5G services. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3394866/mobility-and-sd-wan-part-1-sd-wan-with-4g-lte-is-a-reality.html - -作者:[Francisca Segovia][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/istock-952414660-100796279-large.jpg -[2]: https://www.silver-peak.com/sd-wan/sd-wan-explained -[3]: https://www.gsma.com/futurenetworks/resources/all-ip-statistics/ -[4]: https://www.silver-peak.com/resource-center/edgeconnect-4glte-solution-bec-technologies -[5]: https://www.silver-peak.com/products/unity-edge-connect -[6]: https://www.silver-peak.com/products/unity-boost -[7]: https://www.silver-peak.com/products/unity-orchestrator -[8]: https://www.silver-peak.com/resource-center/mobile-telemedicine-helps-save-lives-streaming-real-time-clinical-data-and-patient -[9]: https://www.silver-peak.com/resource-center/edgeconnect-us-ec-us-specification-sheet diff --git a/sources/talk/20190515 Extreme addresses networked-IoT security.md b/sources/talk/20190515 Extreme addresses networked-IoT security.md deleted file mode 100644 index 1ad756eded..0000000000 --- a/sources/talk/20190515 Extreme addresses networked-IoT security.md +++ /dev/null @@ -1,71 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Extreme addresses networked-IoT security) -[#]: via: (https://www.networkworld.com/article/3395539/extreme-addresses-networked-iot-security.html) -[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) - -Extreme addresses networked-IoT security -====== -The ExtremeAI security app features machine learning that can understand typical behavior of IoT devices and alert when it finds anomalies. -![Getty Images][1] - -[Extreme Networks][2] has taken the wraps off a new security application it says will use machine learning and artificial intelligence to help customers effectively monitor, detect and automatically remediate security issues with networked IoT devices. - -The application – ExtremeAI security—features machine-learning technology that can understand typical behavior of IoT devices and automatically trigger alerts when endpoints act in unusual or unexpected ways, Extreme said. - -**More about edge networking** - - * [How edge networking and IoT will reshape data centers][3] - * [Edge computing best practices][4] - * [How edge computing can help secure the IoT][5] - - - -Extreme said that the ExtremeAI Security application can tie into all leading threat intelligence feeds, and had close integration with its existing [Extreme Workflow Composer][6] to enable automatic threat mitigation and remediation. - -The application integrates the company’s ExtremeAnalytics application which lets customers view threats by severity, category, high-risk endpoints and geography. An automated ticketing feature integrates with variety of popular IT tools such as Slack, Jira, and ServiceNow, and the application interoperates with many popular security tools, including existing network taps, the vendor stated. - -There has been an explosion of new endpoints ranging from million-dollar smart MRI machines to five-dollar sensors, which creates a complex and difficult job for network and security administrators, said Abby Strong, vice president of product marketing for Extreme. “We need smarter, secure and more self-healing networks especially where IT cybersecurity resources are stretched to the limit.” - -Extreme is trying to address an issue that is important to enterprise-networking customers: how to get actionable, usable insights as close to real-time as possible, said Rohit Mehra, Vice President of Network Infrastructure at IDC. “Extreme is melding automation, analytics and security that can look at network traffic patterns and allow the system to take action when needed.” - -The ExtremeAI application, which will be available in October, is but one layer of IoT security Extreme offers. Already on the market, its [Defender for IoT][7] package, which includes a Defender application and adapter, lets customers monitor, set policies and isolate IoT devices across an enterprise. - -**[[Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][8] ]** - -The Extreme AI and Defender packages are now part of what the company calls Extreme Elements, which is a menu of its new and existing Smart OmniEdge, Automated Campus and Agile Data Center software, hardware and services that customers can order to build a manageable, secure system. - -Aside from the applications, the Elements include Extreme Management Center, the company’s network management software; the company’s x86-based intelligent appliances, including the ExtremeCloud Appliance; and [ExtremeSwitching X465 premium][9], a stackable multi-rate gigabit Ethernet switch. - -The switch and applications are just the beginning of a very busy time for Extreme. In its [3Q earnings cal][10]l this month company CEO Ed Meyercord noted Extreme was in the “early stages of refreshing 70 percent of our products” and seven different products will become generally available this quarter – a record for Extreme, he said. - -Join the Network World communities on [Facebook][11] and [LinkedIn][12] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3395539/extreme-addresses-networked-iot-security.html - -作者:[Michael Cooney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Michael-Cooney/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/iot_security_tablet_conference_digital-100787102-large.jpg -[2]: https://www.networkworld.com/article/3289508/extreme-facing-challenges-girds-for-future-networking-battles.html -[3]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html -[4]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html -[5]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html -[6]: https://www.extremenetworks.com/product/workflow-composer/ -[7]: https://www.extremenetworks.com/product/extreme-defender-for-iot/ -[8]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr -[9]: https://community.extremenetworks.com/extremeswitching-exos-223284/extremexos-30-2-and-smart-omniedge-premium-x465-switches-are-now-available-7823377 -[10]: https://seekingalpha.com/news/3457137-extreme-networks-minus-15-percent-quarterly-miss-light-guidance -[11]: https://www.facebook.com/NetworkWorld/ -[12]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190516 Will 5G be the first carbon-neutral network.md b/sources/talk/20190516 Will 5G be the first carbon-neutral network.md deleted file mode 100644 index decacfac5d..0000000000 --- a/sources/talk/20190516 Will 5G be the first carbon-neutral network.md +++ /dev/null @@ -1,88 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Will 5G be the first carbon-neutral network?) -[#]: via: (https://www.networkworld.com/article/3395465/will-5g-be-the-first-carbon-neutral-network.html) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Will 5G be the first carbon-neutral network? -====== -Increased energy consumption in new wireless networks could become ecologically unsustainable. Engineers think they have solutions that apply to 5G, but all is not certain. -![Dushesina/Getty Images][1] - -If wireless networks transfer 1,000 times more data, does that mean they will use 1,000 times more energy? It probably would with the old 4G LTE wireless technologies— LTE doesn’t have much of a sleep-standby. But with 5G, we might have a more energy-efficient option. - -More customers want Earth-friendly options, and engineers are now working on how to achieve it — meaning 5G might introduce the first zero-carbon networks. It’s not all certain, though. - -**[ Related:[What is 5G wireless? And how it will change networking as we know it][2] ]** - -“When the 4G technology for wireless communication was developed, not many people thought about how much energy is consumed in transmitting bits of information,” says Emil Björnson, associate professor of communication systems at Linkoping University, [in an article on the school’s website][3]. - -Standby was never built into 4G, Björnson explains. Reasons include overbuilding — the architects wanted to ensure connections didn’t fail, so they just kept the power up. The downside to that redundancy was that almost the same amount of energy is used whether the system is transmitting data or not. - -“We now know that this is not necessary,” Björnson says. 5G networks don’t use much power during periods of low traffic, and that reduces power consumption. - -Björnson says he knows how to make future-networks — those 5G networks that one day may become the enterprise broadband replacement — super efficient even when there is heavy use. Massive-MIMO (multiple-in, multiple-out) antennas are the answer, he says. That’s hundreds of connected antennas taking advantage of multipath. - -I’ve written before about some of Björnson's Massive-MIMO ideas. He thinks [Massive-MIMO will remove all capacity ceilings from wireless networks][4]. However, he now adds calculations to his research that he claims prove that the Massive-MIMO antenna technology will also reduce power use. He and his group are actively promoting their academic theories in a paper ([pdf][5]). - -**[[Take this mobile device management course from PluralSight and learn how to secure devices in your company without degrading the user experience.][6] ]** - -### Nokia's plan to reduce wireless networks' CO2 emissions - -Björnson's isn’t the only 5G-aimed eco-concept out there. Nokia points out that it isn't just radios transmitting that use electricity. Cooling is actually the main electricity hog, says the telcommunications company, which is one of the world’s principal manufacturers of mobile network equipment. - -Nokia says the global energy cost of Radio Access Networks (RANs) in 2016 (the last year numbers were available), which includes base transceiver stations (BTSs) needed by mobile networks, was around $80 billion. That figure increases with more users coming on stream, something that’s probable. Of the BTS’s electricity use, about 90% “converts to waste heat,” [Harry Kuosa, a marketing executive, writes on Nokia’s blog][7]. And base station sites account for about 80% of a mobile network’s entire energy use, Nokia expands on its website. - -“A thousand-times more traffic that creates a thousand-times higher energy costs is unsustainable,” Nokia says in its [ebook][8] on the subject, “Turning the zero carbon vision into business opportunity,” and it’s why Nokia plans liquid-cooled 5G base stations among other things, including chip improvements. It says the liquid-cooling can reduce CO2 emissions by up to 80%. - -### Will those ideas work? - -Not all agree power consumption can be reduced when implementing 5G, though. Gabriel Brown of Heavy Reading, quotes [in a tweet][9] a China Mobile executive as saying that 5G BTSs will use three times as much power as 4G LTE ones because the higher frequencies used in 5G mean one needs more BTS units to provide the same geographic coverage: For physics reasons, higher frequencies equals shorter range. - -If, as is projected, 5G develops into the new enterprise broadband for the internet of things (IoT), along with associated private networks covering everything else, then these eco- and cost-important questions are going to be salient — and they need answers quickly. 5G will soon be here, and [Gartner estimates that 60% of organizations will adopt it][10]. - -**More about 5G networks:** - - * [How enterprises can prep for 5G networks][11] - * [5G vs 4G: How speed, latency and apps support differ][12] - * [Private 5G networks are coming][13] - * [5G and 6G wireless have security issues][14] - * [How millimeter-wave wireless could help support 5G and IoT][15] - - - -Join the Network World communities on [Facebook][16] and [LinkedIn][17] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3395465/will-5g-be-the-first-carbon-neutral-network.html - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/01/4g-versus-5g_horizon_sunrise-100784230-large.jpg -[2]: https://www.networkworld.com/article/3203489/lan-wan/what-is-5g-wireless-networking-benefits-standards-availability-versus-lte.html -[3]: https://liu.se/en/news-item/okningen-av-mobildata-kraver-energieffektivare-nat -[4]: https://www.networkworld.com/article/3262991/future-wireless-networks-will-have-no-capacity-limits.html -[5]: https://arxiv.org/pdf/1812.01688.pdf -[6]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture -[7]: https://www.nokia.com/blog/nokia-has-ambitious-plans-reduce-network-power-consumption/ -[8]: https://pages.nokia.com/2364.Zero.Emissions.ebook.html?did=d000000001af&utm_campaign=5g_in_action_&utm_source=twitter&utm_medium=organic&utm_term=0dbf430c-1c94-47d7-8961-edc4f0ba3270 -[9]: https://twitter.com/Gabeuk/status/1099709788676636672?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1099709788676636672&ref_url=https%3A%2F%2Fwww.lightreading.com%2Fmobile%2F5g%2Fpower-consumption-5g-basestations-are-hungry-hungry-hippos%2Fd%2Fd-id%2F749979 -[10]: https://www.gartner.com/en/newsroom/press-releases/2018-12-18-gartner-survey-reveals-two-thirds-of-organizations-in -[11]: https://www.networkworld.com/article/3306720/mobile-wireless/how-enterprises-can-prep-for-5g.html -[12]: https://www.networkworld.com/article/3330603/mobile-wireless/5g-versus-4g-how-speed-latency-and-application-support-differ.html -[13]: https://www.networkworld.com/article/3319176/mobile-wireless/private-5g-networks-are-coming.html -[14]: https://www.networkworld.com/article/3315626/network-security/5g-and-6g-wireless-technologies-have-security-issues.html -[15]: https://www.networkworld.com/article/3291323/mobile-wireless/millimeter-wave-wireless-could-help-support-5g-and-iot.html -[16]: https://www.facebook.com/NetworkWorld/ -[17]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190517 The modern data center and the rise in open-source IP routing suites.md b/sources/talk/20190517 The modern data center and the rise in open-source IP routing suites.md deleted file mode 100644 index 02063687a0..0000000000 --- a/sources/talk/20190517 The modern data center and the rise in open-source IP routing suites.md +++ /dev/null @@ -1,140 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The modern data center and the rise in open-source IP routing suites) -[#]: via: (https://www.networkworld.com/article/3396136/the-modern-data-center-and-the-rise-in-open-source-ip-routing-suites.html) -[#]: author: (Matt Conran https://www.networkworld.com/author/Matt-Conran/) - -The modern data center and the rise in open-source IP routing suites -====== -Open source enables passionate people to come together and fabricate work of phenomenal quality. This is in contrast to a single vendor doing everything. -![fdecomite \(CC BY 2.0\)][1] - -As the cloud service providers and search engines started with the structuring process of their business, they quickly ran into the problems of managing the networking equipment. Ultimately, after a few rounds of getting the network vendors to understand their problems, these hyperscale network operators revolted. - -Primarily, what the operators were looking for was a level of control in managing their network which the network vendors couldn’t offer. The revolution burned the path that introduced open networking, and network disaggregation to the work of networking. Let us first learn about disaggregation followed by open networking. - -### Disaggregation - -The concept of network disaggregation involves breaking-up of the vertical networking landscape into individual pieces, where each piece can be used in the best way possible. The hardware can be separated from the software, along with open or closed IP routing suites. This enables the network operators to use the best of breed for the hardware, software and the applications. - -**[ Now see[7 free network tools you must have][2]. ]** - -Networking has always been built as an appliance and not as a platform. The mindset is that the network vendor builds an appliance and as a specialized appliance, they will completely control what you can and cannot do on that box. In plain words, they will not enable anything that is not theirs. As a result, they act as gatekeepers and not gate-enablers. - -Network disaggregation empowers the network operators with the ability to lay hands on the features they need when they need them. However, this is impossible in case of non-disaggregated hardware. - -### Disaggregation leads to using best-of-breed - -In the traditional vertically integrated networking market, you’re forced to live with the software because you like the hardware, or vice-versa. But network disaggregation drives different people to develop things that matter to them. This allows multiple groups of people to connect, with each one focused on doing what he or she does the best. Switching silicon manufacturers can provide the best merchant silicon. Routing suites can be provided by those who are the best at that. And the OS vendors can provide the glue that enables all of these to work well together. - -With disaggregation, people are driven to do what they are good at. One company does the hardware, whereas another does the software and other company does the IP routing suites. Hence, today the networking world looks like more of the server world. - -### Open source - -Within this rise of the modern data center, there is another element that is driving network disaggregation; the notion of open source. Open source is “denoting software for which the original source code is made freely available, it may be redistributed and modified.” It enables passionate people to come together and fabricate work of phenomenal quality. This is in contrast to a single vendor doing everything. - -As a matter of fact, the networking world has always been very vendor driven. However, the advent of open source gives the opportunity to like-minded people rather than the vendor controlling the features. This eliminates the element of vendor lock-in, thereby enabling interesting work. Open source allows more than one company to be involved. - -### Open source in the data center - -The traditional enterprise and data center networks were primarily designed by bridging and Spanning Tree Protocol (STP). However, the modern data center is driven by IP routing and the CLOS topology. As a result, you need a strong IP routing suite. - -That was the point where the need for an open-source routing suite surfaced, the suite that can help drive the modern data center. The primary open-source routing suites are [FRRouting (FRR)][3], BIRD, GoBGP and ExaBGP. - -Open-source IP routing protocol suites are slowly but steadily gaining acceptance and are used in data centers of various sizes. Why? It is because they allow a community of developers and users to work on finding solutions to common problems. Open-source IP routing protocol suites equip them to develop the specific features that they need. It also helps the network operators to create simple designs that make sense to them, as opposed to having everything controlled by the vendor. They also enable routing suites to run on compute nodes. Kubernetes among others uses this model of running a routing protocol on a compute node. - -Today many startups are using FRR. Out of all of the IP routing suites, FRR is preferred in the data center as the primary open-source IP routing protocol suite. Some traditional network vendors have even demonstrated the use of FRR on their networking gear. - -There are lots of new features currently being developed for FRR, not just by the developers but also by the network operators. - -### Use cases for open-source routing suites - -When it comes to use-cases, where do IP routing protocol suites sit? First and foremost, if you want to do any type of routing in the disaggregated network world, you need an IP routing suite. - -Some operators are using FRR at the edge of the network as well, thereby receiving full BGP feeds. Many solutions which use Intel’s DPDK for packet forwarding use FRR as the control plane, receiving full BGP feeds. In addition, there are other vendors using FRR as the core IP routing suite for a full leaf and spine data center architecture. You can even get a version of FRR on pfSense which is a free and open source firewall. - -We need to keep in mind that reference implementations are important. Open source allows you to test at scale. But vendors don’t allow you to do that. However, with FRR, we have the ability to spin up virtual machines (VMs) or even containers by using software like Vagrant to test your network. Some vendors do offer software versions, but they are not fully feature-compatible. - -Also, with open source you do not need to wait. This empowers you with flexibility and speed which drives the modern data center. - -### Deep dive on FRRouting (FRR) - -FRR is a Linux foundation project. In a technical Linux sense, FRR is a group of daemons that work together, providing a complete routing suite that includes BGP, IS-IS, LDP, OSPF, BFD, PIM, and RIP. - -Each one of these daemons communicate with the common routing information base (RIB) daemon called Zebra in order to interface with the OS and to resolve conflicts between the multiple routing protocols providing the same information. Interfacing with the OS is used to receive the link up/down events, to add and delete routes etc. - -### FRRouting (FRR) components: Zebra - -Zebra is the RIB of the routing systems. It knows everything about the state of the system relevant to routing and is able to pass and disseminate this information to all the interested parties. - -The RIB in FRR acts just like a traditional RIB. When a route wins, it goes into the Linux kernel data plane where the forwarding occurs. All of the routing protocols run as separate processes and each of them have their source code in FRR. - -For example, when BGP starts up, it needs to know, for instance, what kind of virtual routing and forwarding (VRF) and IP interfaces are available. Zebra collects and passes this information back to the interested daemons. It passes all the relevant information about state of the machine. - -Furthermore, you can also register information with Zebra. For example, if a particular route changes, the daemon can be informed. This can also be used for reverse path forwarding (RPF). FRR doesn't need to do a pull when changes happen on the network. - -There are a myriad of ways through which you can control Linux and the state. Sometimes you have to use options like the Netlink bus and sometimes you may need to read the state in proc file system of Linux. The goal of Zebra is to gather all this data for the upper level protocols. - -### FRR supports remote data planes - -FRR also has the ability to manage the remote data planes. So, what does this mean? Typically, the data forwarding plane and the routing protocols run on the same box. Another model, adopted by Openflow and SDN for example, is one in which the data forwarding plane can be on one box while FRR runs on a different box on behalf of the first box and pushes the computed routing state on the first box. In other words, the data plane and the control plane run on different boxes. - -If you examine the traditional world, it’s like having one large chassis with different line cards with the ability to install routes in those different line cards. FRR operates with the same model which has one control plane and the capability to offer 3 boxes, if needed. It does this via the forwarding plane manager. - -### Forwarding plane manager - -Zebra can either install routes directly into the data plane of the box it is running on or use a forwarding plane manager to install routes on a remote box. When it installs a route, the forwarding plane manager abstracts the data which displays the route and the next hops. It then pushes the data to a remote system where the remote machine processes it and programs the ASIC appropriately. - -After the data is abstracted, you can use whatever protocol you want in order to push the data to the remote machine. You can even include the data in an email. - -### What is holding people back from open source? - -Since last 30 years the networking world meant that you need to go to a vendor to solve a problem. But now with open-source routing suites, such as, FRR, there is a major drift in the mindset as to how you approach troubleshooting. - -This causes the fear of not being able to use it properly because with open source you are the one who has to fix it. This at first can be scary and daunting. But it doesn’t necessarily have to be. Also, to switch to FRR on a traditional network gear, you need the vendor to enable it, but they may be reluctant as they are on competing platforms which can be another road blocker. - -### The future of FRR - -If we examine FRR from the use case perspective of the data center, FRR is feature-complete. Anyone building an IP based data center FRR has everything available. The latest 7.0 release of FRR adds Yang/NetConf, BGP Enhancements and OpenFabric. - -FRR is not just about providing features, boosting the performance or being the same as or better than the traditional network vendor’s software, it is also about simplifying the process for the end user. - -Since the modern data center is focused on automation and ease of use, FRR has made such progress that the vendors have not caught up with. FRR is very automation friendly. For example, FRR takes BGP and makes it automation-friendly without having to change the protocol. It supports BGP unnumbered that is unmatched by any other vendor suite. This is where the vendors are trying to catch up. - -Also, while troubleshooting, FRR shows peer’s and host’s names and not just the IP addresses. This allows you to understand without having spent much time. However, vendors show the peer’s IP addresses which can be daunting when you need to troubleshoot. - -FRR provides the features that you need to run an efficient network and data center. It makes easier to configure and manage the IP routing suite. Vendors just add keep adding features over features whether they are significant or not. Then you need to travel the certification paths that teach you how to twiddle 20 million nobs. How many of those networks are robust and stable? - -FRR is about supporting features that matter and not every imaginable feature. FRR is an open source project that brings like-minded people together, good work that is offered isn’t turned away. As a case in point, FRR has an open source implementation of EIGRP. - -The problem surfaces when you see a bunch of things, you think you need them. But in reality, you should try to keep the network as simple as possible. FRR is laser-focused on the ease of use and simplifying the use rather than implementing features that are mostly not needed to drive the modern data center. - -For more information and to contribute, why not join the [FRR][4] [mailing list group][4]. - -**This article is published as part of the IDG Contributor Network.[Want to Join?][5]** - -Join the Network World communities on [Facebook][6] and [LinkedIn][7] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3396136/the-modern-data-center-and-the-rise-in-open-source-ip-routing-suites.html - -作者:[Matt Conran][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Matt-Conran/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/12/modular_humanoid_polyhedra_connections_structure_building_networking_by_fdecomite_cc_by_2-0_via_flickr_1200x800-100782334-large.jpg -[2]: https://www.networkworld.com/article/2825879/7-free-open-source-network-monitoring-tools.html -[3]: https://frrouting.org/community/7.0-launch.html -[4]: https://frrouting.org/#participate -[5]: /contributor-network/signup.html -[6]: https://www.facebook.com/NetworkWorld/ -[7]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190521 Enterprise IoT- Companies want solutions in these 4 areas.md b/sources/talk/20190521 Enterprise IoT- Companies want solutions in these 4 areas.md deleted file mode 100644 index 9df4495f05..0000000000 --- a/sources/talk/20190521 Enterprise IoT- Companies want solutions in these 4 areas.md +++ /dev/null @@ -1,119 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Enterprise IoT: Companies want solutions in these 4 areas) -[#]: via: (https://www.networkworld.com/article/3396128/the-state-of-enterprise-iot-companies-want-solutions-for-these-4-areas.html) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -Enterprise IoT: Companies want solutions in these 4 areas -====== -Based on customer pain points, PwC identified four areas companies are seeking enterprise solutions for, including energy use and sustainability. -![Jackie Niam / Getty Images][1] - -Internet of things (IoT) vendors and pundits like to crow about the billions and billions of connected devices that make the IoT so ubiquitous and powerful. But how much of that installed base is really relevant to the enterprise? - -To find out, I traded emails with Rob Mesirow, principal at [PwC’s Connected Solutions][2], the firm’s new one-stop-shop of IoT solutions, who suggests that consumer adoption may not paint a true picture of the enterprise opportunities. If you remove the health trackers and the smart thermostats from the market, he suggested, there are very few connected devices left. - -So, I wondered, what is actually happening on the enterprise side of IoT? What kinds of devices are we talking about, and in what kinds of numbers? - -**[ Read also:[Forget 'smart homes,' the new goal is 'autonomous buildings'][3] ]** - -“When people talk about the IoT,” Mesirow told me, “they usually focus on [consumer devices, which far outnumber business devices][4]. Yet [connected buildings currently represent only 12% of global IoT projects][5],” he noted, “and that’s without including wearables and smart home projects.” (Mesirow is talking about buildings that “use various IoT devices, including occupancy sensors that determine when people are present in a room in order to keep lighting and temperature controls at optimal levels, lowering energy costs and aiding sustainability goals. Sensors can also detect water and gas leaks and aid in predictive maintenance for HVAC systems.”) - -### 4 key enterprise IoT opportunities - -More specifically, based on customer pain points, PwC’s Connected Solutions is focusing on a few key opportunities, which Mesirow laid out in a [blog post][6] earlier this year. (Not surprisingly, the opportunities seem tied to [the group’s products][7].) - -“A lot of these solutions came directly from our customers’ request,” he noted. “We pre-qualify our solutions with customers before we build them.” - -Let’s take a look at the top four areas, along with a quick reality check on how important they are and whether the technology is ready for prime time. - -#### **1\. Energy use and sustainability** - -The IoT makes it possible to manage buildings and spaces more efficiently, with savings of 25% or more. Occupancy sensors can tell whether anyone is actually in a room, adjusting lighting and temperature to saving money and conserve energy. - -Connected buildings can also help determine when meeting spaces are available, which can boost occupancy at large businesses and universities by 40% while cutting infrastructure and maintenance costs. Other sensors, meanwhile, can detect water and gas leaks and aid in predictive maintenance for HVAC systems. - -**Reality check:** Obviously, much of this technology is not new, but there’s a real opportunity to make it work better by integrating disparate systems and adding better analytics to the data to make planning more effective. - -#### **2. Asset tracking - -** - -“Businesses can also use the IoT to track their assets,“ Mesirow told me, “which can range from trucks to hotel luggage carts to medical equipment. It can even assist with monitoring trash by alerting appropriate people when dumpsters need to be emptied.” - -Asset trackers can instantly identify the location of all kinds of equipment (saving employee time and productivity), and they can reduce the number of lost, stolen, and misplaced devices and machines as well as provide complete visibility into the location of your assets. - -Such trackers can also save employees from wasting time hunting down the devices and machines they need. For example, PwC noted that during an average hospital shift, more than one-third of nurses spend at least an hour looking for equipment such as blood pressure monitors and insulin pumps. Just as important, location tracking often improves asset optimization, reduced inventory needs, and improved customer experience. - -**Reality check:** Asset tracking offers clear value. The real question is whether a given use case is cost effective or not, as well as how the data gathered will actually be used. Too often, companies spend a lot of money and effort tracking their assets, but don’t do much with the information. - -#### **3\. Security and compliance** - -Connected solutions can create better working environments, Mesirow said. “In a hotel, for example, these smart devices can ensure that air and water quality is up to standards, provide automated pest traps, monitor dumpsters and recycling bins, detect trespassers, determine when someone needs assistance, or discover activity in an unauthorized area. Monitoring the water quality of hotel swimming pools can lower chemical and filtering costs,” he said. - -Mesirow cited an innovative use case where, in response to workers’ complaints about harassment, hotel operators—in conjunction with the [American Hotel and Lodging Association][8]—are giving their employees portable devices that alert security staff when workers request assistance. - -**Reality check:** This seems useful, but the ROI might be difficult to calculate. - -#### **4\. Customer experience** - -According to PwC, “Sensors, facial recognition, analytics, dashboards, and notifications can elevate and even transform the customer experience. … Using connected solutions, you can identify and reward your best customers by offering perks, reduced wait times, and/or shorter lines.” - -Those kinds of personalized customer experiences can potentially boost customer loyalty and increase revenue, Mesirow said, adding that the technology can also make staff deployments more efficient and “enhance safety by identifying trespassers and criminals who are tampering with company property.” - -**Reality check:** Creating a great customer experience is critical for businesses today, and this kind of personalized targeting promises to make it more efficient and effective. However, it has to be done in a way that makes customers comfortable and not creeped out. Privacy concerns are very real, especially when it comes to working with facial recognition and other kinds of surveillance technology. For example, [San Francisco recently banned city agencies from using facial recognition][9], and others may follow. - -**More on IoT:** - - * [What is the IoT? How the internet of things works][10] - * [What is edge computing and how it’s changing the network][11] - * [Most powerful Internet of Things companies][12] - * [10 Hot IoT startups to watch][13] - * [The 6 ways to make money in IoT][14] - * [What is digital twin technology? [and why it matters]][15] - * [Blockchain, service-centric networking key to IoT success][16] - * [Getting grounded in IoT networking and security][17] - * [Building IoT-ready networks must become a priority][18] - * [What is the Industrial IoT? [And why the stakes are so high]][19] - - - -Join the Network World communities on [Facebook][20] and [LinkedIn][21] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3396128/the-state-of-enterprise-iot-companies-want-solutions-for-these-4-areas.html - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/iot_internet_of_things_by_jackie_niam_gettyimages-996958260_2400x1600-100788446-large.jpg -[2]: https://digital.pwc.com/content/pwc-digital/en/products/connected-solutions.html#get-connected -[3]: https://www.networkworld.com/article/3309420/forget-smart-homes-the-new-goal-is-autonomous-buildings.html -[4]: https://www.statista.com/statistics/370350/internet-of-things-installed-base-by-category/) -[5]: https://iot-analytics.com/top-10-iot-segments-2018-real-iot-projects/ -[6]: https://www.digitalpulse.pwc.com.au/five-unexpected-ways-internet-of-things/ -[7]: https://digital.pwc.com/content/pwc-digital/en/products/connected-solutions.html -[8]: https://www.ahla.com/ -[9]: https://www.nytimes.com/2019/05/14/us/facial-recognition-ban-san-francisco.html -[10]: https://www.networkworld.com/article/3207535/internet-of-things/what-is-the-iot-how-the-internet-of-things-works.html -[11]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[12]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[13]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[14]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[15]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[16]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[17]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[18]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[19]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[20]: https://www.facebook.com/NetworkWorld/ -[21]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190522 Experts- Enterprise IoT enters the mass-adoption phase.md b/sources/talk/20190522 Experts- Enterprise IoT enters the mass-adoption phase.md deleted file mode 100644 index 86d7bf0efe..0000000000 --- a/sources/talk/20190522 Experts- Enterprise IoT enters the mass-adoption phase.md +++ /dev/null @@ -1,78 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Experts: Enterprise IoT enters the mass-adoption phase) -[#]: via: (https://www.networkworld.com/article/3397317/experts-enterprise-iot-enters-the-mass-adoption-phase.html) -[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) - -Experts: Enterprise IoT enters the mass-adoption phase -====== -Dropping hardware prices, 5G boost business internet-of-things deployments; technical complexity encourages partnerships. -![Avgust01 / Getty Images][1] - -[IoT][2] in general has taken off quickly over the past few years, but experts at the recent IoT World highlighted that the enterprise part of the market has been particularly robust of late – it’s not just an explosion of connected home gadgets anymore. - -Donna Moore, chairwoman of the LoRa Alliance, an industry group that works to develop and scale low-power WAN technology for mass usage, said on a panel that she’s never seen growth this fast in the sector. “I’d say we’re now in the early mass adopters [stage],” she said. - -**More on IoT:** - - * [Most powerful Internet of Things companies][3] - * [10 Hot IoT startups to watch][4] - * [The 6 ways to make money in IoT][5] - * [What is digital twin technology? [and why it matters]][6] - * [Blockchain, service-centric networking key to IoT success][7] - * [Getting grounded in IoT networking and security][8] - * [Building IoT-ready networks must become a priority][9] - * [What is the Industrial IoT? [And why the stakes are so high]][10] - - - -The technology itself has pushed adoption to these heights, said Graham Trickey, head of IoT for the GSMA, a trade organization for mobile network operators. Along with price drops for wireless connectivity modules, the array of upcoming technologies nestling under the umbrella label of [5G][11] could simplify the process of connecting devices to [edge-computing][12] hardware – and the edge to the cloud or [data center][13]. - -“Mobile operators are not just providers of connectivity now, they’re farther up the stack,” he said. Technologies like narrow-band IoT and support for highly demanding applications like telehealth are all set to be part of the final 5G spec. - -### Partnerships needed to deal with IoT complexity** - -** - -That’s not to imply that there aren’t still huge tasks facing both companies trying to implement their own IoT frameworks and the creators of the technology underpinning them. For one thing, IoT tech requires a huge array of different sets of specialized knowledge. - -“That means partnerships, because you need an expert in your [vertical] area to know what you’re looking for, you need an expert in communications, and you might need a systems integrator,” said Trickey. - -Phil Beecher, the president and CEO of the Wi-SUN Alliance (the acronym stands for Smart Ubiquitous Networks, and the group is heavily focused on IoT for the utility sector), concurred with that, arguing that broad ecosystems of different technologies and different partners would be needed. “There’s no one technology that’s going to solve all these problems, no matter how much some parties might push it,” he said. - -One of the central problems – [IoT security][14] – is particularly dear to Beecher’s heart, given the consequences of successful hacks of the electrical grid or other utilities. More than one panelist praised the passage of the EU’s General Data Protection Regulation, saying that it offered concrete guidelines for entities developing IoT tech – a crucial consideration for some companies that may not have a lot of in-house expertise in that area. - -Join the Network World communities on [Facebook][15] and [LinkedIn][16] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3397317/experts-enterprise-iot-enters-the-mass-adoption-phase.html - -作者:[Jon Gold][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Jon-Gold/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/iot_internet_of_things_mobile_connections_by_avgust01_gettyimages-1055659210_2400x1600-100788447-large.jpg -[2]: https://www.networkworld.com/article/3207535/what-is-iot-how-the-internet-of-things-works.html -[3]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[4]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[5]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[6]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[7]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[8]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[9]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[10]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[11]: https://www.networkworld.com/article/3203489/what-is-5g-how-is-it-better-than-4g.html -[12]: https://www.networkworld.com/article/3224893/what-is-edge-computing-and-how-it-s-changing-the-network.html?nsdr=true -[13]: https://www.networkworld.com/article/3223692/what-is-a-data-centerhow-its-changed-and-what-you-need-to-know.html -[14]: https://www.networkworld.com/article/3269736/getting-grounded-in-iot-networking-and-security.html -[15]: https://www.facebook.com/NetworkWorld/ -[16]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190522 The Traffic Jam Whopper project may be the coolest-dumbest IoT idea ever.md b/sources/talk/20190522 The Traffic Jam Whopper project may be the coolest-dumbest IoT idea ever.md deleted file mode 100644 index be8a4833cc..0000000000 --- a/sources/talk/20190522 The Traffic Jam Whopper project may be the coolest-dumbest IoT idea ever.md +++ /dev/null @@ -1,97 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The Traffic Jam Whopper project may be the coolest/dumbest IoT idea ever) -[#]: via: (https://www.networkworld.com/article/3396188/the-traffic-jam-whopper-project-may-be-the-coolestdumbest-iot-idea-ever.html) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -The Traffic Jam Whopper project may be the coolest/dumbest IoT idea ever -====== -Burger King uses real-time IoT data to deliver burgers to drivers stuck in traffic — and it seems to be working. -![Mike Mozart \(CC BY 2.0\)][1] - -People love to eat in their cars. That’s why we invented the drive-in and the drive-thru. - -But despite a fast-food outlet on the corner of every major intersection, it turns out we were only scratching the surface of this idea. Burger King is taking this concept to the next logical step with its new IoT-powered Traffic Jam Whopper project. - -I have to admit, when I first heard about this, I thought it was a joke, but apparently the [Traffic Jam Whopper project is totally real][2] and has already passed a month-long test in Mexico City. While the company hasn’t specified a timeline, it plans to roll out the Traffic Jam Whopper project in Los Angeles (where else?) and other traffic-plagued megacities such as São Paulo and Shanghai. - -**[ Also read:[Is IoT in the enterprise about making money or saving money?][3] | Get regularly scheduled insights: [Sign up for Network World newsletters][4] ]** - -### How Burger King's Traffic Jam Whopper project works - -According to [Nations Restaurant News][5], this is how Burger King's Traffic Jam Whopper project works: - -The project uses real-time data to target hungry drivers along congested roads and highways for food delivery by couriers on motorcycles. - -The system leverages push notifications to the Burger King app and personalized messaging on digital billboards positioned along busy roads close to a Burger King restaurant. - -[According to the We Believers agency][6] that put it all together, “By leveraging traffic and drivers’ real-time data [location and speed], we adjusted our billboards’ location and content, displaying information about the remaining time in traffic to order, and personalized updates about deliveries in progress.” The menu is limited to Whopper Combos to speed preparation (though the company plans to offer a wider menu as it works out the kinks). - -**[[Become a Microsoft Office 365 administrator in record time with this quick start course from PluralSight.][7] ]** - -The company said orders in Mexico City were delivered in an average of 15 minutes. Fortunately (or unfortunately, depending on how you look at it) many traffic jams hold drivers captive for far longer than that. - -Once the order is ready, the motorcyclist uses Google maps and GPS technology embedded into the app to locate the car that made the order. The delivery person then weaves through traffic to hand over the Whopper. (Lane-splitting is legal in California, but I have no idea if there are other potential safety or law-enforcement issues involved here. For drivers ordering burgers, at least, the Burger King app supports voice ordering. I also don’t know what happens if traffic somehow clears up before the burger arrives.) - -Here’s a video of the pilot program in Mexico City: - -#### **New technology = > new opportunities** - -Even more amazing, this is not _just_ a publicity stunt. NRN quotes Bruno Cardinali, head of marketing for Burger King Latin America and Caribbean, claiming the project boosted sales during rush hour, when app orders are normally slow: - -“Thanks to The Traffic Jam Whopper campaign, we’ve increased deliveries by 63% in selected locations across the month of April, adding a significant amount of orders per restaurant per day, just during rush hours." - -If nothing else, this project shows that creative thinking really can leverage IoT technology into new businesses. In this case, it’s turning notoriously bad traffic—pretty much required for this process to work—from a problem into an opportunity to generate additional sales during slow periods. - -**More on IoT:** - - * [What is the IoT? How the internet of things works][8] - * [What is edge computing and how it’s changing the network][9] - * [Most powerful Internet of Things companies][10] - * [10 Hot IoT startups to watch][11] - * [The 6 ways to make money in IoT][12] - * [What is digital twin technology? [and why it matters]][13] - * [Blockchain, service-centric networking key to IoT success][14] - * [Getting grounded in IoT networking and security][15] - * [Building IoT-ready networks must become a priority][16] - * [What is the Industrial IoT? [And why the stakes are so high]][17] - - - -Join the Network World communities on [Facebook][18] and [LinkedIn][19] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3396188/the-traffic-jam-whopper-project-may-be-the-coolestdumbest-iot-idea-ever.html - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/burger-king-gift-card-100797164-large.jpg -[2]: https://abc7news.com/food/burger-king-to-deliver-to-drivers-stuck-in-traffic/5299073/ -[3]: https://www.networkworld.com/article/3343917/the-big-picture-is-iot-in-the-enterprise-about-making-money-or-saving-money.html -[4]: https://www.networkworld.com/newsletters/signup.html -[5]: https://www.nrn.com/technology/tech-tracker-burger-king-deliver-la-motorists-stuck-traffic?cid= -[6]: https://www.youtube.com/watch?v=LXNgEZV7lNg -[7]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fadministering-office-365-quick-start -[8]: https://www.networkworld.com/article/3207535/internet-of-things/what-is-the-iot-how-the-internet-of-things-works.html -[9]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[10]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[11]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[12]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[13]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[14]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[15]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[16]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[17]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[18]: https://www.facebook.com/NetworkWorld/ -[19]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190523 Benchmarks of forthcoming Epyc 2 processor leaked.md b/sources/talk/20190523 Benchmarks of forthcoming Epyc 2 processor leaked.md deleted file mode 100644 index 61ae9e656b..0000000000 --- a/sources/talk/20190523 Benchmarks of forthcoming Epyc 2 processor leaked.md +++ /dev/null @@ -1,55 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Benchmarks of forthcoming Epyc 2 processor leaked) -[#]: via: (https://www.networkworld.com/article/3397081/benchmarks-of-forthcoming-epyc-2-processor-leaked.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Benchmarks of forthcoming Epyc 2 processor leaked -====== -Benchmarks of AMD's second-generation Epyc server briefly found their way online and show the chip is larger but a little slower than the Epyc 7601 on the market now. -![Gordon Mah Ung][1] - -Benchmarks of engineering samples of AMD's second-generation Epyc server, code-named “Rome,” briefly found their way online and show a very beefy chip running a little slower than its predecessor. - -Rome is based on the Zen 2 architecture, believed to be more of an incremental improvement over the prior generation than a major leap. It’s already known that Rome would feature a 64-core, 128-thread design, but that was about all of the details. - -**[ Also read:[Who's developing quantum computers][2] ]** - -The details came courtesy of SiSoftware's Sandra PC analysis and benchmarking tool. It’s very popular and has been used by hobbyists and benchmarkers alike for more than 20 years. New benchmarks are uploaded to the Sandra database all the time, and what I suspect happened is someone running a Rome sample ran the benchmark, not realizing the results would be uploaded to the Sandra database. - -The benchmarks were from two different servers, a Dell PowerEdge R7515 and a Super Micro Super Server. The Dell product number is not on the market, so this would indicate a future server with Rome processors. The entry has since been deleted, but several sites, including the hobbyist site Tom’s Hardware Guide, managed to [take a screenshot][3]. - -According to the entry, the chip is a mid-range processor with a base clock speed of 1.4GHz, jumping up to 2.2GHz in turbo mode, with 16MB of Level 2 cache and 256MB of Level 3 cache, the latter of which is crazy. The first-generation Epyc had just 32MB of L3 cache. - -That’s a little slower than the Epyc 7601 on the market now, but when you double the number of cores in the same space, something’s gotta give, and in this case, it’s electricity. The thermal envelope was not revealed by the benchmark. Previous Epyc processors ranged from 120 watts to 180 watts. - -Sandra ranked the processor at #3 for arithmetic and #5 for multimedia processing, which makes me wonder what on Earth beat the Rome chip. Interestingly, the servers were running Windows 10, not Windows Server 2019. - -**[[Get certified as an Apple Technical Coordinator with this seven-part online course from PluralSight.][4] ]** - -Rome is expected to be officially launched at the massive Computex trade show in Taiwan on May 27 and will begin shipping in the third quarter of the year. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3397081/benchmarks-of-forthcoming-epyc-2-processor-leaked.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/11/rome_2-100779395-large.jpg -[2]: https://www.networkworld.com/article/3275385/who-s-developing-quantum-computers.html -[3]: https://www.tomshardware.co.uk/amd-epyc-rome-processor-data-center,news-60265.html -[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fapple-certified-technical-trainer-10-11 -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190523 Edge-based caching and blockchain-nodes speed up data transmission.md b/sources/talk/20190523 Edge-based caching and blockchain-nodes speed up data transmission.md deleted file mode 100644 index 54ddf76db3..0000000000 --- a/sources/talk/20190523 Edge-based caching and blockchain-nodes speed up data transmission.md +++ /dev/null @@ -1,74 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Edge-based caching and blockchain-nodes speed up data transmission) -[#]: via: (https://www.networkworld.com/article/3397105/edge-based-caching-and-blockchain-nodes-speed-up-data-transmission.html) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Edge-based caching and blockchain-nodes speed up data transmission -====== -Using a combination of edge-based data caches and blockchain-like distributed networks, Bluzelle claims it can significantly speed up the delivery of data across the globe. -![OlgaSalt / /getty][1] - -The combination of a blockchain-like distributed network, along with the ability to locate data at the edge will massively speed up future networks, such as those used by the internet of things (IoT), claims Bluzelle in announcing what is says is the first decentralized data delivery network (DDN). - -Distributed DDNs will be like content delivery networks (CDNs) that now cache content around the world to speed up the web, but in this case, it will be for data, the Singapore-based company explains. Distributed key-value (blockchain) networks and edge computing built into Bluzelle's system will provide significantly faster delivery than existing caching, the company claims in a press release announcing its product. - -“The future of data delivery can only ever be de-centrally distributed,” says Pavel Bains, CEO and co-founder of Bluzelle. It’s because the world requires instant access to data that’s being created at the edge, he argues. - -“But delivery is hampered by existing technology,” he says. - -**[ Also read:[What is edge computing?][2] and [How edge networking and IoT will reshape data centers][3]. ]** - -Bluzelle says decentralized caching is the logical next step to generalized data caching, used for reducing latency. “Decentralized caching expands the theory of caching,” the company writes in a [report][4] (Dropbox pdf) on its [website][5]. It says the cache must be expanded from simply being located at one unique location. - -“Using a combination of distributed networks, the edge and the cloud, [it’s] thereby increasing the transactional throughput of data,” the company says. - -This kind of thing is particularly important in consumer gaming now, where split-second responses from players around the world make or break a game experience, but it will likely be crucial for the IoT, higher-definition media, artificial intelligence, and virtual reality as they gain more of a role in digitization—including at critical enterprise applications. - -“Currently applications are limited to data caching technologies that require complex configuration and management of 10-plus-year-old technology constrained to a few data centers,” Bains says. “These were not designed to handle the ever-increasing volumes of data.” - -Bains says one of the key selling points of Bluzelle's network is that developers should be able to implement and run networks without having to also physically expand the networks manually. - -“Software developers don’t want to react to where their customers come from. Our architecture is designed to always have the data right where the customer is. This provides a superior consumer experience,” he says. - -Data caches are around now, but Bluzelle claims its system, written in C++ and available on Linux and Docker containers, among other platforms, is faster than others. It further says that if its system and a more traditional cache would connect to the same MySQL database in Virginia, say, their users will get the data three to 16 times faster than a traditional “non-edge-caching” network. Write updates to all Bluzelle nodes around the world takes 875 milliseconds (ms), it says. - -The company has been concentrating its efforts on gaming, and with a test setup in Virginia, it says it was able to deliver data 33 times faster—at 22ms to Singapore—than a normal, cloud-based data cache. That traditional cache (located near the database) took 727ms in the Bluzelle-published test. In a test to Ireland, it claims 16ms over 223ms using a traditional cache. - -An algorithm is partly the reason for the gains, the company explains. It “allows the nodes to make decisions and take actions without the need for masternodes,” the company says. Masternodes are the server-like parts of blockchain systems. - -**More about edge networking** - - * [How edge networking and IoT will reshape data centers][3] - * [Edge computing best practices][6] - * [How edge computing can help secure the IoT][7] - - - -Join the Network World communities on [Facebook][8] and [LinkedIn][9] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3397105/edge-based-caching-and-blockchain-nodes-speed-up-data-transmission.html - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/blockchain_crypotocurrency_bitcoin-by-olgasalt-getty-100787949-large.jpg -[2]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[3]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html -[4]: https://www.dropbox.com/sh/go5bnhdproy1sk5/AAC5MDoafopFS7lXUnmiLAEFa?dl=0&preview=Bluzelle+Report+-+The+Decentralized+Internet+Is+Here.pdf -[5]: https://bluzelle.com/ -[6]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html -[7]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html -[8]: https://www.facebook.com/NetworkWorld/ -[9]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190523 Online performance benchmarks all companies should try to achieve.md b/sources/talk/20190523 Online performance benchmarks all companies should try to achieve.md deleted file mode 100644 index 829fb127f8..0000000000 --- a/sources/talk/20190523 Online performance benchmarks all companies should try to achieve.md +++ /dev/null @@ -1,80 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Online performance benchmarks all companies should try to achieve) -[#]: via: (https://www.networkworld.com/article/3397322/online-performance-benchmarks-all-companies-should-try-to-achieve.html) -[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/) - -Online performance benchmarks all companies should try to achieve -====== -With digital performance more important than ever, companies must ensure their online performance meets customers’ needs. A new ThousandEyes report can help them determine that. -![Thinkstock][1] - -There's no doubt about it: We have entered the experience economy, and digital performance is more important than ever. - -Customer experience is the top brand differentiator, topping price and every other factor. And businesses that provide a poor digital experience will find customers will actively seek a competitor. In fact, recent ZK Research found that in 2018, about two-thirds of millennials changed loyalties to a brand because of a bad experience. (Note: I am an employee of ZK Research.) - -To help companies determine if their online performance is leading, lacking, or on par with some of the top companies, ThousandEyes this week released its [2019 Digital Experience Performance Benchmark Report][2]. This document provides a comparative analysis of web, infrastructure, and network performance from the top 20 U.S. digital retail, travel, and media websites. Although this is a small sampling of companies, those three industries are the most competitive when it comes to using their digital platforms for competitive advantage. The aggregated data from this report can be used as an industry-agnostic performance benchmark that all companies should strive to meet. - -**[ Read also:[IoT providers need to take responsibility for performance][3] ]** - -The methodology of the study was for ThousandEyes to use its own platform to provide an independent view of performance. It uses active monitoring and a global network of monitoring agents to measure application and network layer performance for websites, applications, and services. The company collected data from 36 major cities scattered across the U.S. Six of the locations (Ashburn, Chicago, Dallas, Los Angeles, San Jose, and Seattle) also included vantage points connected to six major broadband ISPs (AT&T, CenturyLink, Charter, Comcast, Cox, and Verizon). This acts as a good proxy for what a user would experience. - -The test involved page load tests against the websites of the major companies in retail, media, and travel and looked at several factors, including DNS response time, round-trip latency, network time (one-way latency), HTTP response time, and page load. The averages and median times can be seen in the table below. Those can be considered the average benchmarks that all companies should try to attain. - -![][4] - -### Choice of content delivery network matters by location - -ThousandEyes' report also looked at how the various services that companies use impacts web performance. For example, the study measured the performance of the content delivery network (CDN) providers in the 36 markets. It found that in Albuquerque, Akamai and Fastly had the most latency, whereas Edgecast had the least. It also found that in Boston, all of the CDN providers were close. Companies can use this type of data to help them select a CDN. Without it, decision makers are essentially guessing and hoping. - -### CDN performance is impacted by ISP - -Another useful set of data was cross-referencing CDN performance by ISP, which lead to some fascinating information. With Comcast, Akamai, Cloudfront, Google and Incapula all had high amounts of latency. Only Edgecast and Fastly offered average latency. On the other hand, all of the CDNs worked great with CenturyLink. This tells a buyer, "If my customer base is largely in Comcast’s footprint, I should look at Edgecast or Fastly or my customers will be impacted." - -### DNS and latency directly impact page load times - -The ThousandEyes study also confirmed some points that many people believe as true but until now had no quantifiable evidence to support it. For example, it's widely accepted that DNS response time and network latency to the CDN edge correlate to web performance; the data in the report now supports that belief. ThousandEyes did some regression analysis and fancy math and found that in general, companies that were in the top quartile of HTTP performance had above-average DNS response time and network performance. There were a few exceptions, but in most cases, this is true. - -Based on all the data, the below are the benchmarks for the three infrastructure metrics gathered and is what businesses, even ones outside the three verticals studied, should hope to achieve to support a high-quality digital experience. - - * DNS response time 25 ms - * Round trip network latency 15 ms - * HTTP response time 250 ms - - - -### Operations teams need to focus on digital performance - -Benchmarking certainly provides value, but the report also offers some recommendations on how operations teams can use the data to improve digital performance. Those include: - - * **Measure site from distributed user vantage points**. There is no single point that will provide a view of digital performance everywhere. Instead, measure from a range of ISPs in different regions and take a multi-layered approach to visibility (application, network and routing). - * **Use internet performance information as a baseline**. Compare your organization's data to the baselines, and if you’re not meeting it in some markets, focus on improvement there. - * **Compare performance to industry peers**. In highly competitive industries, it’s important to understand how you rank versus the competition. Don’t be satisfied with hitting the benchmarks if your key competitors exceed them. - * **Build a strong performance stack.** The data shows that solid DNS and HTTP response times and low latency are correlated to solid page load times. Focus on optimizing those factors and consider them foundational to digital performance. - - - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3397322/online-performance-benchmarks-all-companies-should-try-to-achieve.html - -作者:[Zeus Kerravala][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Zeus-Kerravala/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2017/07/racing_speed_runners_internet-speed-100728363-large.jpg -[2]: https://www.thousandeyes.com/research/digital-experience -[3]: https://www.networkworld.com/article/3340318/iot-providers-need-to-take-responsibility-for-performance.html -[4]: https://images.idgesg.net/images/article/2019/05/thousandeyes-100797290-large.jpg -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190523 Study- Most enterprise IoT transactions are unencrypted.md b/sources/talk/20190523 Study- Most enterprise IoT transactions are unencrypted.md deleted file mode 100644 index 51098dad33..0000000000 --- a/sources/talk/20190523 Study- Most enterprise IoT transactions are unencrypted.md +++ /dev/null @@ -1,93 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Study: Most enterprise IoT transactions are unencrypted) -[#]: via: (https://www.networkworld.com/article/3396647/study-most-enterprise-iot-transactions-are-unencrypted.html) -[#]: author: (Tim Greene https://www.networkworld.com/author/Tim-Greene/) - -Study: Most enterprise IoT transactions are unencrypted -====== -A Zscaler report finds 91.5% of IoT communications within enterprises are in plaintext and so susceptible to interference. -![HYWARDS / Getty Images][1] - -Of the millions of enterprise-[IoT][2] transactions examined in a recent study, the vast majority were sent without benefit of encryption, leaving the data vulnerable to theft and tampering. - -The research by cloud-based security provider Zscaler found that about 91.5 percent of transactions by internet of things devices took place over plaintext, while 8.5 percent were encrypted with [SSL][3]. That means if attackers could intercept the unencrypted traffic, they’d be able to read it and possibly alter it, then deliver it as if it had not been changed. - -**[ For more on IoT security, see[our corporate guide to addressing IoT security concerns][4]. | Get regularly scheduled insights by [signing up for Network World newsletters][5]. ]** - -Researchers looked through one month’s worth of enterprise traffic traversing Zscaler’s cloud seeking the digital footprints of IoT devices. It found and analyzed 56 million IoT-device transactions over that time, and identified the type of devices, protocols they used, the servers they communicated with, how often communication went in and out and general IoT traffic patterns. - -The team tried to find out which devices generate the most traffic and the threats they face. It discovered that 1,015 organizations had at least one IoT device. The most common devices were set-top boxes (52 percent), then smart TVs (17 percent), wearables (8 percent), data-collection terminals (8 percent), printers (7 percent), IP cameras and phones (5 percent) and medical devices (1 percent). - -While they represented only 8 percent of the devices, data-collection terminals generated 80 percent of the traffic. - -The breakdown is that 18 percent of the IoT devices use SSL to communicate all the time, and of the remaining 82 percent, half used it part of the time and half never used it. -The study also found cases of plaintext HTTP being used to authenticate devices and to update software and firmware, as well as use of outdated crypto libraries and weak default credentials. - -While IoT devices are common in enterprises, “many of the devices are employee owned, and this is just one of the reasons they are a security concern,” the report says. Without strict policies and enforcement, these devices represent potential vulnerabilities. - -**[[Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][6] ]** - -Another reason employee-owned IoT devices are a concern is that many businesses don’t consider them a threat because no data is stored on them. But if the data they gather is transmitted insecurely, it is at risk. - -### 5 tips to protect enterprise IoT - -Zscaler recommends these security precautions: - - * Change default credentials to something more secure. As employees bring in devices, encourage them to use strong passwords and to keep their firmware current. - * Isolate IoT devices on networks and restrict inbound and outbound network traffic. - * Restrict access to IoT devices from external networks and block unnecessary ports from external access. - * Apply regular security and firmware updates to IoT devices, and secure network traffic. - * Deploy tools to gain visibility of shadow-IoT devices already inside the network so they can be protected. - - - -**More on IoT:** - - * [What is edge computing and how it’s changing the network][7] - * [Most powerful Internet of Things companies][8] - * [10 Hot IoT startups to watch][9] - * [The 6 ways to make money in IoT][10] - * [What is digital twin technology? [and why it matters]][11] - * [Blockchain, service-centric networking key to IoT success][12] - * [Getting grounded in IoT networking and security][13] - * [Building IoT-ready networks must become a priority][14] - * [What is the Industrial IoT? [And why the stakes are so high]][15] - - - -Join the Network World communities on [Facebook][16] and [LinkedIn][17] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3396647/study-most-enterprise-iot-transactions-are-unencrypted.html - -作者:[Tim Greene][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Tim-Greene/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/network_security_network_traffic_scanning_by_hywards_gettyimages-673891964_2400x1600-100796830-large.jpg -[2]: https://www.networkworld.com/article/3207535/what-is-iot-how-the-internet-of-things-works.html -[3]: https://www.networkworld.com/article/3045953/5-things-you-need-to-know-about-ssl.html -[4]: https://www.networkworld.com/article/3269165/internet-of-things/a-corporate-guide-to-addressing-iot-security-concerns.html -[5]: https://www.networkworld.com/newsletters/signup.html -[6]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr -[7]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[8]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[9]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[10]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[11]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[12]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[13]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[14]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[15]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[16]: https://www.facebook.com/NetworkWorld/ -[17]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190528 Analysing D Code with KLEE.md b/sources/talk/20190528 Analysing D Code with KLEE.md deleted file mode 100644 index c93f6e2b8d..0000000000 --- a/sources/talk/20190528 Analysing D Code with KLEE.md +++ /dev/null @@ -1,680 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Analysing D Code with KLEE) -[#]: via: (https://theartofmachinery.com/2019/05/28/d_and_klee.html) -[#]: author: (Simon Arneaud https://theartofmachinery.com) - -Analysing D Code with KLEE -====== - -[KLEE][1] is symbolic execution engine that can rigorously verify or find bugs in software. It’s designed for C and C++, but it’s just an interpreter for LLVM bitcode combined with theorem prover backends, so it can work with bitcode generated by `ldc2`. One catch is that it needs a compatible bitcode port of the D runtime to run normal D code. I’m still interested in getting KLEE to work with normal D code, but for now I’ve done some experiments with `-betterC` D. - -### How KLEE works - -What makes KLEE special is its support for two kinds of variables: concrete and symbolic. Concrete variables are just like the normal variables in normal code: they have a deterministic value at any given point in the program. On the other hand, symbolic variables contain a bundle of logical constraints instead of values. Take this code: - -``` -int x = klee_int("x"); -klee_assume(x >= 0); -if (x > 42) -{ - doA(x); -} -else -{ - doB(x); - assert (3 * x != 21); -} -``` - -`klee_int("x")` creates a symbolic integer that will be called “`x`” in output reports. Initially it has no contraints and can imply any value that a 32b signed integer can have. `klee_assume(x >= 0)` tells KLEE to add `x >= 0` as a constraint, so now we’re only analysing the code for non-negative 32b signed integers. On hitting the `if`, KLEE checks if both branches are possible. Sure enough, `x > 42` can be true or false even with the constraint `x >= 0`, so KLEE has to _fork_. We now have two processes being interpreted on the VM: one executing `doA()` while `x` holds the constraints `x >= 0, x > 42`, and another executing `doB()` while `x` holds the contraints `x >= 0, x <= 42`. The second process will hit the `assert` statement, and KLEE will try to prove or disprove `3 * x != 21` using the assumptions `x >= 0, x <= 42` — in this case it will disprove it and report a bug with `x = 7` as a crashing example. - -### First steps - -Here’s a toy example just to get things working. Suppose we have a function that makes an assumption for a performance optimisation. Thankfully the assumption is made explicit with `assert` and is documented with a comment. Is the assumption valid? - -``` -int foo(int x) -{ - // 17 is a prime number, so let's use it as a sentinel value for an awesome optimisation - assert (x * x != 17); - // ... - return x; -} -``` - -Here’s a KLEE test rig. The KLEE function declarations and the `main()` entry point need to have `extern(C)` linkage, but anything else can be normal D code as long as it compiles under `-betterC`: - -``` -extern(C): - -int klee_int(const(char*) name); - -int main() -{ - int x = klee_int("x"); - foo(x); - return 0; -} -``` - -It turns out there’s just one (frustrating) complication with running `-betterC` D under KLEE. In D, `assert` is handled specially by the compiler. By default, it throws an `Error`, but for compatibility with KLEE, I’m using the `-checkaction=C` flag. In C, `assert` is usually a macro that translates to code that calls some backend implementation. That implementation isn’t standardised, so of course various C libraries work differently. `ldc2` actually has built-in logic for implementing `-checkaction=C` correctly depending on the C library used. - -KLEE uses a port of [uClibc][2], which translates `assert()` to a four-parameter `__assert()` function, which conflicts with the three-parameter `__assert()` function in other implementations. `ldc2` uses LLVM’s (target) `Triple` type for choosing an `assert()` implementation configuration, but that doesn’t recognise uClibc. As a hacky workaround, I’m telling `ldc2` to compile for Musl, which “tricks” it into using an `__assert_fail()` implementation that KLEE happens to support as well. I’ve opened [an issue report][3]. - -Anyway, if we put all that code above into a file, we can compile it to KLEE-ready bitcode like this: - -``` -ldc2 -g -checkaction=C -mtriple=x86_64-linux-musl -output-bc -betterC -c first.d -``` - -`-g` is optional, but adds debug information that can be useful for later analysis. The KLEE developers recommend disabling compiler optimisations and letting KLEE do its own optimisations instead. - -Now to run KLEE: - -``` -$ klee first.bc -KLEE: output directory is "/tmp/klee-out-1" -KLEE: Using Z3 solver backend -warning: Linking two modules of different target triples: klee_int.bc' is 'x86_64-pc-linux-gnu' whereas 'first.bc' is 'x86_64--linux-musl' - -KLEE: ERROR: first.d:4: ASSERTION FAIL: x * x != 17 -KLEE: NOTE: now ignoring this error at this location - -KLEE: done: total instructions = 35 -KLEE: done: completed paths = 2 -KLEE: done: generated tests = 2 -``` - -Straight away, KLEE has found two execution paths through the program: a happy path, and a path that fails the assertion. Let’s see the results: - -``` -$ ls klee-last/ -assembly.ll -info -messages.txt -run.istats -run.stats -run.stats-journal -test000001.assert.err -test000001.kquery -test000001.ktest -test000002.ktest -warnings.txt -``` - -Here’s the example that triggers the happy path: - -``` -$ ktest-tool klee-last/test000002.ktest -ktest file : 'klee-last/test000002.ktest' -args : ['first.bc'] -num objects: 1 -object 0: name: 'x' -object 0: size: 4 -object 0: data: b'\x00\x00\x00\x00' -object 0: hex : 0x00000000 -object 0: int : 0 -object 0: uint: 0 -object 0: text: .... -``` - -Here’s the example that causes an assertion error: - -``` -$ cat klee-last/test000001.assert.err -Error: ASSERTION FAIL: x * x != 17 -File: first.d -Line: 4 -assembly.ll line: 32 -Stack: - #000000032 in _D5first3fooFiZi () at first.d:4 - #100000055 in main (=1, =94262044506880) at first.d:16 -$ ktest-tool klee-last/test000001.ktest -ktest file : 'klee-last/test000001.ktest' -args : ['first.bc'] -num objects: 1 -object 0: name: 'x' -object 0: size: 4 -object 0: data: b'\xe9&\xd33' -object 0: hex : 0xe926d333 -object 0: int : 869476073 -object 0: uint: 869476073 -object 0: text: .&.3 -``` - -So, KLEE has deduced that when `x` is 869476073, `x * x` does a 32b overflow to 17 and breaks the code. - -It’s overkill for this simple example, but `run.istats` can be opened with [KCachegrind][4] to view things like call graphs and source code coverage. (Unfortunately, coverage stats can be misleading because correct code won’t ever hit boundary check code inserted by the compiler.) - -### MurmurHash preimage - -Here’s a slightly more useful example. D currently uses 32b MurmurHash3 as its standard non-cryptographic hash function. What if we want to find strings that hash to a given special value? In general, we can solve problems like this by asserting that something doesn’t exist (i.e., a string that hashes to a given value) and then challenging the theorem prover to prove us wrong with a counterexample. - -Unfortunately, we can’t just use `hashOf()` directly without the runtime, but we can copy [the hash code from the runtime source][5] into its own module, and then import it into a test rig like this: - -``` -import dhash; - -extern(C): - -void klee_make_symbolic(void* addr, size_t nbytes, const(char*) name); -int klee_assume(ulong condition); - -int main() -{ - // Create a buffer for 8-letter strings and let KLEE manage it symbolically - char[8] s; - klee_make_symbolic(s.ptr, s.sizeof, "s"); - - // Constrain the string to be letters from a to z for convenience - foreach (j; 0..s.length) - { - klee_assume(s[j] > 'a' && s[j] <= 'z'); - } - - assert (dHash(cast(ubyte[])s) != 0xdeadbeef); - return 0; -} -``` - -Here’s how to compile and run it. Because we’re not checking correctness, we can use `-boundscheck=off` for a slight performance boost. It’s also worth enabling KLEE’s optimiser. - -``` -$ ldc2 -g -boundscheck=off -checkaction=C -mtriple=x86_64-linux-musl -output-bc -betterC -c dhash.d dhash_klee.d -$ llvm-link -o dhash_test.bc dhash.bc dhash_klee.bc -$ klee -optimize dhash_test.bc -``` - -It takes just over 4s: - -``` -$ klee-stats klee-last/ -------------------------------------------------------------------------- -| Path | Instrs| Time(s)| ICov(%)| BCov(%)| ICount| TSolver(%)| -------------------------------------------------------------------------- -|klee-last/| 168| 4.37| 87.50| 50.00| 160| 99.95| -------------------------------------------------------------------------- -``` - -And it actually works: - -``` -$ ktest-tool klee-last/test000001.ktest -ktest file : 'klee-last/test000001.ktest' -args : ['dhash_test.bc'] -num objects: 1 -object 0: name: 's' -object 0: size: 8 -object 0: data: b'psgmdxvq' -object 0: hex : 0x7073676d64787671 -object 0: int : 8175854546265273200 -object 0: uint: 8175854546265273200 -object 0: text: psgmdxvq -$ rdmd --eval 'writef("%x\n", hashOf("psgmdxvq"));' -deadbeef -``` - -For comparison, here’s a simple brute force version in plain D: - -``` -import std.stdio; - -void main() -{ - char[8] buffer; - - bool find(size_t idx) - { - if (idx == buffer.length) - { - auto hash = hashOf(buffer[]); - if (hash == 0xdeadbeef) - { - writeln(buffer[]); - return true; - } - return false; - } - - foreach (char c; 'a'..'z') - { - buffer[idx] = c; - auto is_found = find(idx + 1); - if (is_found) return true; - } - - return false; - } - - find(0); -} -``` - -This takes ~17s: - -``` -$ ldc2 -O3 -boundscheck=off hash_brute.d -$ time ./hash_brute -aexkaydh - -real 0m17.398s -user 0m17.397s -sys 0m0.001s -$ rdmd --eval 'writef("%x\n", hashOf("aexkaydh"));' -deadbeef -``` - -The constraint solver implementation is simpler to write, but is still faster because it can automatically do smarter things than calculating hashes of strings from scratch every iteration. - -### Binary search - -Now for an example of testing and debugging. Here’s an implementation of [binary search][6]: - -``` -bool bsearch(const(int)[] haystack, int needle) -{ - while (haystack.length) - { - auto mid_idx = haystack.length / 2; - if (haystack[mid_idx] == needle) return true; - if (haystack[mid_idx] < needle) - { - haystack = haystack[mid_idx..$]; - } - else - { - haystack = haystack[0..mid_idx]; - } - } - return false; -} -``` - -Does it work? Here’s a test rig: - -``` -extern(C): - -void klee_make_symbolic(void* addr, size_t nbytes, const(char*) name); -int klee_range(int begin, int end, const(char*) name); -int klee_assume(ulong condition); - -int main() -{ - // Making an array arr and an x to find in it. - // This time we'll also parameterise the array length. - // We have to apply klee_make_symbolic() to the whole buffer because of limitations in KLEE. - int[8] arr_buffer; - klee_make_symbolic(arr_buffer.ptr, arr_buffer.sizeof, "a"); - int len = klee_range(0, arr_buffer.length+1, "len"); - auto arr = arr_buffer[0..len]; - // Keeping the values in [0, 32) makes the output easier to read. - // (The binary-friendly limit 32 is slightly more efficient than 30.) - int x = klee_range(0, 32, "x"); - foreach (j; 0..arr.length) - { - klee_assume(arr[j] >= 0); - klee_assume(arr[j] < 32); - } - - // Make the array sorted. - // We don't have to actually sort the array. - // We can just tell KLEE to constrain it to be sorted. - foreach (j; 1..arr.length) - { - klee_assume(arr[j - 1] <= arr[j]); - } - - // Test against simple linear search - bool has_x = false; - foreach (a; arr[]) - { - has_x |= a == x; - } - - assert (bsearch(arr, x) == has_x); - - return 0; -} -``` - -When run in KLEE, it keeps running for a long, long time. How do we know it’s doing anything? By default KLEE writes stats every 1s, so we can watch the live progress in another terminal: - -``` -$ watch klee-stats --print-more klee-last/ -Every 2.0s: klee-stats --print-more klee-last/ - ---------------------------------------------------------------------------------------------------------------------- -| Path | Instrs| Time(s)| ICov(%)| BCov(%)| ICount| TSolver(%)| States| maxStates| Mem(MB)| maxMem(MB)| ---------------------------------------------------------------------------------------------------------------------- -|klee-last/| 5834| 637.27| 79.07| 68.75| 172| 100.00| 22| 22| 24.51| 24| ---------------------------------------------------------------------------------------------------------------------- -``` - -`bsearch()` should be pretty fast, so we should see KLEE discovering new states rapidly. But instead it seems to be stuck. [At least one fork of KLEE has heuristics for detecting infinite loops][7], but plain KLEE doesn’t. There are timeout and batching options for making KLEE work better with code that might have infinite loops, but let’s just take another look at the code. In particular, the loop condition: - -``` -while (haystack.length) -{ - // ... -} -``` - -Binary search is supposed to reduce the search space by about half each iteration. `haystack.length` is an unsigned integer, so the loop must terminate as long as it goes down every iteration. Let’s rewrite the code slightly so we can verify if that’s true: - -``` -bool bsearch(const(int)[] haystack, int needle) -{ - while (haystack.length) - { - auto mid_idx = haystack.length / 2; - if (haystack[mid_idx] == needle) return true; - const(int)[] next_haystack; - if (haystack[mid_idx] < needle) - { - next_haystack = haystack[mid_idx..$]; - } - else - { - next_haystack = haystack[0..mid_idx]; - } - // This lets us verify that the search terminates - assert (next_haystack.length < haystack.length); - haystack = next_haystack; - } - return false; -} -``` - -Now KLEE can find the bug! - -``` -$ klee -optimize bsearch.bc -KLEE: output directory is "/tmp/klee-out-2" -KLEE: Using Z3 solver backend -warning: Linking two modules of different target triples: klee_range.bc' is 'x86_64-pc-linux-gnu' whereas 'bsearch.bc' is 'x86_64--linux-musl' - -warning: Linking two modules of different target triples: memset.bc' is 'x86_64-pc-linux-gnu' whereas 'bsearch.bc' is 'x86_64--linux-musl' - -KLEE: ERROR: bsearch.d:18: ASSERTION FAIL: next_haystack.length < haystack.length -KLEE: NOTE: now ignoring this error at this location - -KLEE: done: total instructions = 2281 -KLEE: done: completed paths = 42 -KLEE: done: generated tests = 31 -``` - -Using the failing example as input and stepping through the code, it’s easy to find the problem: - -``` -/// ... -if (haystack[mid_idx] < needle) -{ - // If mid_idx == 0, next_haystack is the same as haystack - // Nothing changes, so the loop keeps repeating - next_haystack = haystack[mid_idx..$]; -} -/// ... -``` - -Thinking about it, the `if` statement already excludes `haystack[mid_idx]` from being `needle`, so there’s no reason to include it in `next_haystack`. Here’s the fix: - -``` -// The +1 matters -next_haystack = haystack[mid_idx+1..$]; -``` - -But is the code correct now? Terminating isn’t enough; it needs to get the right answer, of course. - -``` -$ klee -optimize bsearch.bc -KLEE: output directory is "/tmp/kee-out-3" -KLEE: Using Z3 solver backend -warning: Linking two modules of different target triples: klee_range.bc' is 'x86_64-pc-linux-gnu' whereas 'bsearch.bc' is 'x86_64--linux-musl' - -warning: Linking two modules of different target triples: memset.bc' is 'x86_64-pc-linux-gnu' whereas 'bsearch.bc' is 'x86_64--linux-musl' - -KLEE: done: total instructions = 3152 -KLEE: done: completed paths = 81 -KLEE: done: generated tests = 81 -``` - -In just under 7s, KLEE has verified every possible execution path reachable with arrays of length from 0 to 8. Note, that’s not just coverage of individual code lines, but coverage of full pathways through the code. KLEE hasn’t ruled out stack corruption or integer overflows with large arrays, but I’m pretty confident the code is correct now. - -KLEE has generated test cases that trigger each path, which we can keep and use as a faster-than-7s regression test suite. Trouble is, the output from KLEE loses all type information and isn’t in a convenient format: - -``` -$ ktest-tool klee-last/test000042.ktest -ktest file : 'klee-last/test000042.ktest' -args : ['bsearch.bc'] -num objects: 3 -object 0: name: 'a' -object 0: size: 32 -object 0: data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' -object 0: hex : 0x0000000000000000000000000000000001000000100000000000000000000000 -object 0: text: ................................ -object 1: name: 'x' -object 1: size: 4 -object 1: data: b'\x01\x00\x00\x00' -object 1: hex : 0x01000000 -object 1: int : 1 -object 1: uint: 1 -object 1: text: .... -object 2: name: 'len' -object 2: size: 4 -object 2: data: b'\x06\x00\x00\x00' -object 2: hex : 0x06000000 -object 2: int : 6 -object 2: uint: 6 -object 2: text: .... -``` - -But we can write our own pretty-printing code and put it at the end of the test rig: - -``` -char[256] buffer; -char* output = buffer.ptr; -output += sprintf(output, "TestCase(["); -foreach (a; arr[]) -{ - output += sprintf(output, "%d, ", klee_get_value_i32(a)); -} -sprintf(output, "], %d, %s),\n", klee_get_value_i32(x), klee_get_value_i32(has_x) ? "true".ptr : "false".ptr); -fputs(buffer.ptr, stdout); -``` - -Ugh, that would be just one format call with D’s `%(` array formatting specs. The output needs to be buffered up and printed all at once to stop output from different parallel executions getting mixed up. `klee_get_value_i32()` is needed to get a concrete example from a symbolic variable (remember that a symbolic variable is just a bundle of constraints). - -``` -$ klee -optimize bsearch.bc > tests.d -... -$ # Sure enough, 81 test cases -$ wc -l tests.d -81 tests.d -$ # Look at the first 10 -$ head tests.d -TestCase([], 0, false), -TestCase([0, ], 0, true), -TestCase([16, ], 1, false), -TestCase([0, ], 1, false), -TestCase([0, 0, ], 0, true), -TestCase([0, 0, ], 1, false), -TestCase([1, 16, ], 1, true), -TestCase([0, 0, 0, ], 0, true), -TestCase([16, 16, ], 1, false), -TestCase([1, 16, ], 3, false), -``` - -Nice! An autogenerated regression test suite that’s better than anything I would write by hand. This is my favourite use case for KLEE. - -### Change counting - -One last example: - -In Australia, coins come in 5c, 10c, 20c, 50c, $1 (100c) and $2 (200c) denominations. So you can make 70c using 14 5c coins, or using a 50c coin and a 20c coin. Obviously, fewer coins is usually more convenient. There’s a simple [greedy algorithm][8] to make a small pile of coins that adds up to a given value: just keep adding the biggest coin you can to the pile until you’ve reached the target value. It turns out this trick is optimal — at least for Australian coins. Is it always optimal for any set of coin denominations? - -The hard thing about testing optimality is that you don’t know what the correct optimal values are without a known-good algorithm. Without a constraints solver, I’d compare the output of the greedy algorithm with some obviously correct brute force optimiser, run over all possible cases within some small-enough limit. But with KLEE, we can use a different approach: comparing the greedy solution to a non-deterministic solution. - -The greedy algorithm takes the list of coin denominations and the target value as input, so (like in the previous examples) we make those symbolic. Then we make another symbolic array that represents an assignment of coin counts to each coin denomination. We don’t specify anything about how to generate this assignment, but we constrain it to be a valid assignment that adds up to the target value. It’s [non-deterministic][9]. Then we just assert that the total number of coins in the non-deterministic assignment is at least the number of coins needed by the greedy algorithm, which would be true if the greedy algorithm were universally optimal. Finally we ask KLEE to prove the program correct or incorrect. - -Here’s the code: - -``` -// Greedily break value into coins of values in denominations -// denominations must be in strictly decreasing order -int greedy(const(int[]) denominations, int value, int[] coins_used_output) -{ - int num_coins = 0; - foreach (j; 0..denominations.length) - { - int num_to_use = value / denominations[j]; - coins_used_output[j] = num_to_use; - num_coins += num_to_use; - value = value % denominations[j]; - } - return num_coins; -} - -extern(C): - -void klee_make_symbolic(void* addr, size_t nbytes, const(char*) name); -int klee_int(const(char*) name); -int klee_assume(ulong condition); -int klee_get_value_i32(int expr); - -int main(int argc, char** argv) -{ - enum kNumDenominations = 6; - int[kNumDenominations] denominations, coins_used; - klee_make_symbolic(denominations.ptr, denominations.sizeof, "denominations"); - - // We're testing the algorithm itself, not implementation issues like integer overflow - // Keep values small - foreach (d; denominations) - { - klee_assume(d >= 1); - klee_assume(d <= 1024); - } - // Make the smallest denomination 1 so that all values can be represented - // This is just for simplicity so we can focus on optimality - klee_assume(denominations[$-1] == 1); - - // Greedy algorithm expects values in descending order - foreach (j; 1..denominations.length) - { - klee_assume(denominations[j-1] > denominations[j]); - } - - // What we're going to represent - auto value = klee_int("value"); - - auto num_coins = greedy(denominations[], value, coins_used[]); - - // The non-deterministic assignment - int[kNumDenominations] nd_coins_used; - klee_make_symbolic(nd_coins_used.ptr, nd_coins_used.sizeof, "nd_coins_used"); - - int nd_num_coins = 0, nd_value = 0; - foreach (j; 0..kNumDenominations) - { - klee_assume(nd_coins_used[j] >= 0); - klee_assume(nd_coins_used[j] <= 1024); - nd_num_coins += nd_coins_used[j]; - nd_value += nd_coins_used[j] * denominations[j]; - } - - // Making the assignment valid is 100% up to KLEE - klee_assume(nd_value == value); - - // If we find a counterexample, dump it and fail - if (nd_num_coins < num_coins) - { - import core.stdc.stdio; - - puts("Counterexample found."); - - puts("Denominations:"); - foreach (ref d; denominations) - { - printf("%d ", klee_get_value_i32(d)); - } - printf("\nValue: %d\n", klee_get_value_i32(value)); - - void printAssignment(const ref int[kNumDenominations] coins) - { - foreach (j; 0..kNumDenominations) - { - printf("%d * %dc\n", klee_get_value_i32(coins[j]), klee_get_value_i32(denominations[j])); - } - } - - printf("Greedy \"optimum\": %d\n", klee_get_value_i32(num_coins)); - printAssignment(coins_used); - - printf("Better assignment for %d total coins:\n", klee_get_value_i32(nd_num_coins)); - printAssignment(nd_coins_used); - assert (false); - } - - return 0; -} -``` - -And here’s the counterexample it found after 14s: - -``` -Counterexample found. -Denominations: -129 12 10 3 2 1 -Value: 80 -Greedy "optimum": 9 -0 * 129c -6 * 12c -0 * 10c -2 * 3c -1 * 2c -0 * 1c -Better assignment for 8 total coins: -0 * 129c -0 * 12c -8 * 10c -0 * 3c -0 * 2c -0 * 1c -``` - -Note that this isn’t proven to be the new optimum; it’s just a witness that the greedy algorithm isn’t always optimal. There’s a well-known [dynamic programming][10] [solution][11] that always works. - -### What’s next? - -As I said, I’m interesting in getting this to work with full D code. I’m also interested in using [one of the floating point forks of KLEE][12] on some D because floating point is much harder to test thoroughly than integer and string code. - --------------------------------------------------------------------------------- - -via: https://theartofmachinery.com/2019/05/28/d_and_klee.html - -作者:[Simon Arneaud][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://theartofmachinery.com -[b]: https://github.com/lujun9972 -[1]: https://klee.github.io/ -[2]: https://www.uclibc.org/ -[3]: https://github.com/ldc-developers/ldc/issues/3078 -[4]: https://kcachegrind.github.io/html/Home.html -[5]: https://github.com/dlang/druntime/blob/4ad638f61a9b4a98d8ed6eb9f9429c0ef6afc8e3/src/core/internal/hash.d#L670 -[6]: https://www.calhoun.io/lets-learn-algorithms-an-intro-to-binary-search/ -[7]: https://github.com/COMSYS/SymbolicLivenessAnalysis -[8]: https://en.wikipedia.org/wiki/Greedy_algorithm -[9]: http://people.clarkson.edu/~alexis/PCMI/Notes/lectureB03.pdf -[10]: https://www.algorithmist.com/index.php/Dynamic_Programming -[11]: https://www.topcoder.com/community/competitive-programming/tutorials/dynamic-programming-from-novice-to-advanced/ -[12]: https://github.com/srg-imperial/klee-float diff --git a/sources/talk/20190528 Managed WAN and the cloud-native SD-WAN.md b/sources/talk/20190528 Managed WAN and the cloud-native SD-WAN.md deleted file mode 100644 index 026b5d8e81..0000000000 --- a/sources/talk/20190528 Managed WAN and the cloud-native SD-WAN.md +++ /dev/null @@ -1,121 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Managed WAN and the cloud-native SD-WAN) -[#]: via: (https://www.networkworld.com/article/3398476/managed-wan-and-the-cloud-native-sd-wan.html) -[#]: author: (Matt Conran https://www.networkworld.com/author/Matt-Conran/) - -Managed WAN and the cloud-native SD-WAN -====== -The motivation for WAN transformation is clear, today organizations require: improved internet access and last mile connectivity, additional bandwidth and a reduction in the WAN costs. -![Gerd Altmann \(CC0\)][1] - -In recent years, a significant number of organizations have transformed their wide area network (WAN). Many of these organizations have some kind of cloud-presence across on-premise data centers and remote site locations. - -The vast majority of organizations that I have consulted with have over 10 locations. And it is common to have headquarters in both the US and Europe, along with remote site locations spanning North America, Europe, and Asia. - -A WAN transformation project requires this diversity to be taken into consideration when choosing the best SD-WAN vendor to satisfy both; networking and security requirements. Fundamentally, SD-WAN is not just about physical connectivity, there are many more related aspects. - -**[ Related:[MPLS explained – What you need to know about multi-protocol label switching][2]** - -### Motivations for transforming the WAN - -The motivation for WAN transformation is clear: Today organizations prefer improved internet access and last mile connectivity, additional bandwidth along with a reduction in the WAN costs. Replacing Multiprotocol Label Switching (MPLS) with SD-WAN has of course been the main driver for the SD-WAN evolution, but it is only a single piece of the jigsaw puzzle. - -Many SD-WAN vendors are quickly brought to their knees when they try to address security and gain direct internet access from remote site locations. The problem is how to ensure optimized cloud access that is secure, has improved visibility and predictable performance without the high costs associated with MPLS? SD-WAN is not just about connecting locations. Primarily, it needs to combine many other important network and security elements into one seamless worldwide experience. - -According to a recent report from [Cato Networks][3] into enterprise IT managers, a staggering 85% will confront use cases in 2019 that are poorly addressed or outright ignored by SD-WAN. Examples includes providing secure, Internet access from any location (50%) and improving visibility into and control over mobile access to cloud applications, such as Office 365 (46%). - -### Issues with traditional SD-WAN vendors - -First and foremost, SD-WAN unable to address the security challenges that arise during the WAN transformation. Such security challenges include protection against malware, ransomware and implementing the necessary security policies. Besides, there is a lack of visibility that is required to police the mobile users and remote site locations accessing resources in the public cloud. - -To combat this, organizations have to purchase additional equipment. There has always been and will always be a high cost associated with buying such security appliances. Furthermore, the additional tools that are needed to protect the remote site locations increase the network complexity and reduce visibility. Let’s us not forget that the variety of physical appliances require talented engineers for design, deployment and maintenance. - -There will often be a single network-cowboy. This means the network and security configuration along with the design essentials are stored in the mind of the engineer, not in a central database from where the knowledge can be accessed if the engineer leaves his or her employment. - -The physical appliance approach to SD-WAN makes it hard, if not impossible, to accommodate for the future. If the current SD-WAN vendors continue to focus just on connecting the devices with the physical appliances, they will have limited ability to accommodate for example, with the future of network IoT devices. With these factors in mind what are the available options to overcome the SD-WAN shortcomings? - -One can opt for a do it yourself (DIY) solution, or a managed service, which can fall into the category of telcos, with the improvements of either co-managed or self-managed service categories. - -### Option 1: The DIY solution - -Firstly DIY, from the experience of trying to stitch together a global network, this is not only costly but also complex and is a very constrained approach to the network transformation. We started with physical appliances decades ago and it was sufficient to an extent. The reason it worked was that it suited the requirements of the time, but our environment has changed since then. Hence, we need to accommodate these changes with the current requirements. - -Even back in those days, we always had a breachable perimeter. The perimeter-approach to networking and security never really worked and it was just a matter of time before the bad actor would penetrate the guarded walls. - -Securing a global network involves more than just firewalling the devices. A solid security perimeter requires URL filtering, anti-malware and IPS to secure the internet traffic. If you try to deploy all these functions in a single device, such as, unified threat management (UTM), you will hit scaling problems. As a result, you will be left with appliance sprawl. - -Back in my early days as an engineer, I recall stitching together a global network with a mixture of security and network appliances from a variety of vendors. It was me and just two others who used to get the job done on time and for a production network, our uptime levels were superior to most. - -However, it involved too many late nights, daily flights to our PoPs and of course the major changes required a forklift. A lot of work had to be done at that time, which made me want to push some or most of the work to a 3rd party. - -### Option 2: The managed service solution - -Today, there is a growing need for the managed service approach to SD-WAN. Notably, it simplifies the network design, deployment and maintenance activities while offloading the complexity, in line with what most CIOs are talking about today. - -Managed service provides a number of benefits, such as the elimination of backhauling to centralized cloud connectors or VPN concentrators. Evidently, backhauling is never favored for a network architect. More than often it will result in increased latency, congested links, internet chokepoints, and last-mile outages. - -Managed service can also authenticate mobile users at the local communication hub and not at a centralized point which would increase the latency. So what options are available when considering a managed service? - -### Telcos: An average service level - -Let’s be honest, telcos have a mixed track record and enterprises rely on them with caution. Essentially, you are building a network with 3rd party appliances and services that put the technical expertise outside of the organization. - -Secondly, the telco must orchestrate, monitor and manage numerous technical domains which are likely to introduce further complexity. As a result, troubleshooting requires close coordination with the suppliers which will have an impact on the customer experience. - -### Time equals money - -To resolve a query could easily take two or three attempts. It’s rare that you will get to the right person straight away. This eventually increases the time to resolve problems. Even for a minor feature change, you have to open tickets. Hence, with telcos, it increases the time required to solve a problem. - -In addition, it takes time to make major network changes such as opening new locations, which could take up to 45 days. In the same report mentioned above, 71% of the respondents are frustrated with the telco customer-service-time to resolve the problems, 73% indicated that deploying new locations requires at least 15 days and 47% claimed that “high bandwidth costs” is the biggest frustration while working with telcos. - -When it comes to lead times for projects, an engineer does not care. Does a project manager care if you have an optimum network design? No, many don’t, most just care about the timeframes. During my career, now spanning 18 years, I have never seen comments from any of my contacts saying “you must adhere to your project manager’s timelines”. - -However, out of the experience, the project managers have their ways and lead times do become a big part of your daily job. So as an engineer, 45-day lead time will certainly hit your brand hard, especially if you are an external consultant. - -There is also a problem with bandwidth costs. Telcos need to charge due to their complexity. There is always going to be a series of problems when working with them. Let’s face it, they offer an average service level. - -### Co-management and self-service management - -What is needed is a service that equips with the visibility and control of DIY to managed services. This, ultimately, opens the door to co-management and self-service management. - -Co-management allows both the telco and enterprise to make changes to the WAN. Then we have the self-service management of WAN that allows the enterprises to have sole access over the aspect of their network. - -However, these are just sticking plasters covering up the flaws. We need a managed service that not only connects locations but also synthesizes the site connectivity, along with security, mobile access, and cloud access. - -### Introducing the cloud-native approach to SD-WAN - -There should be a new style of managed services that combines the best of both worlds. It should offer the uptime, predictability and reach of the best telcos along with the cost structure and versatility of cloud providers. All such requirements can be met by what is known as the cloud-native carrier. - -Therefore, we should be looking for a platform that can connect and secure all the users and resources at scale, no matter where they are positioned. Eventually, such a platform will limit the costs and increase the velocity and agility. - -This is what a cloud-native carrier can offer you. You could say it’s a new kind of managed service, which is what enterprises are now looking for. A cloud-native carrier service brings the best of cloud services to the world of networking. This new style of managed service brings to SD-WAN the global reach, self-service, and agility of the cloud with the ability to easily migrate from MPLS. - -In summary, a cloud-native carrier service will improve global connectivity to on-premises and cloud applications, enable secure branch to internet access, and both securely and optimally integrate cloud datacenters. - -**This article is published as part of the IDG Contributor Network.[Want to Join?][4]** - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3398476/managed-wan-and-the-cloud-native-sd-wan.html - -作者:[Matt Conran][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Matt-Conran/ -[b]: https://github.com/lujun9972 -[1]: https://images.techhive.com/images/article/2017/03/network-wan-100713693-large.jpg -[2]: https://www.networkworld.com/article/2297171/sd-wan/network-security-mpls-explained.html -[3]: https://www.catonetworks.com/news/digital-transformation-survey -[4]: /contributor-network/signup.html -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190528 Moving to the Cloud- SD-WAN Matters.md b/sources/talk/20190528 Moving to the Cloud- SD-WAN Matters.md deleted file mode 100644 index 8f6f46b6f2..0000000000 --- a/sources/talk/20190528 Moving to the Cloud- SD-WAN Matters.md +++ /dev/null @@ -1,69 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Moving to the Cloud? SD-WAN Matters!) -[#]: via: (https://www.networkworld.com/article/3397921/moving-to-the-cloud-sd-wan-matters.html) -[#]: author: (Rami Rammaha https://www.networkworld.com/author/Rami-Rammaha/) - -Moving to the Cloud? SD-WAN Matters! -====== - -![istock][1] - -This is the first in a two-part blog series that will explore how enterprises can realize the full transformation promise of the cloud by shifting to a business first networking model powered by a business-driven [SD-WAN][2]. The focus for this installment will be on automating secure IPsec connectivity and intelligently steering traffic to cloud providers. - -Over the past several years we’ve seen a major shift in data center strategies where enterprise IT organizations are shifting applications and workloads to cloud, whether private or public. More and more, enterprises are leveraging software as-a-service (SaaS) applications and infrastructure as-a-service (IaaS) cloud services from leading providers like [Amazon AWS][3], [Google Cloud][4], [Microsoft Azure][5] and [Oracle Cloud Infrastructure][6]. This represents a dramatic shift in enterprise data traffic patterns as fewer and fewer applications are hosted within the walls of the traditional corporate data center. - -There are several drivers for the shift to IaaS cloud services and SaaS apps, but business agility tops the list for most enterprises. The traditional IT model for provisioning and deprovisioning applications is rigid and inflexible and is no longer able to keep pace with changing business needs. - -According to [LogicMonitor’s Cloud Vision 2020][7] study, more than 80 percent of enterprise workloads will run in the cloud by 2020 with more than 40 percent running on public cloud platforms. This major shift in the application consumption model is having a huge [impact on organizations and infrastructure][8]. A recent article entitled “[How Amazon Web Services is luring banks to the cloud][9],” published by CNBC, reported that some companies already have completely migrated all of their applications and IT workloads to public cloud infrastructures. An interesting fact is that while many enterprises must comply with stringent regulatory compliance mandates such as PCI-DSS or HIPAA, they still have made the move to the cloud. This tells us two things – the maturity of using public cloud services and the trust these organizations have in using them is at an all-time high. Again, it is all about speed and agility – without compromising performance, security and reliability. - -### **Is there a direct correlation between moving to the cloud and adopting SD-WAN?** - -As the cloud enables businesses to move faster, an SD-WAN architecture where top-down business intent is the driver is critical to ensuring success, especially when branch offices are geographically distributed across the globe. Traditional router-centric WAN architectures were never designed to support today’s cloud consumption model for applications in the most efficient way. With a conventional router-centric WAN approach, access to applications residing in the cloud means traversing unnecessary hops, resulting in wasted bandwidth, additional cost, added latency and potentially higher packet loss. In addition, under the existing, traditional WAN model where management tends to be rigid, complex network changes can be lengthy, whether setting up new branches or troubleshooting performance issues. This leads to inefficiencies and a costly operational model. Therefore, enterprises greatly benefit from taking a business-first WAN approach toward achieving greater agility in addition to realizing substantial CAPEX and OPEX savings. - -A business-driven SD-WAN platform is purpose-built to tackle the challenges inherent to the traditional router-centric model and more aptly support today’s cloud consumption model. This means application policies are defined based on business intent, connecting users securely and directly to applications where ever they reside without unnecessary extra hops or security compromises. For example, if the application is hosted in the cloud and is trusted, a business-driven SD-WAN can automatically connect users to it without backhauling traffic to a POP or HQ data center. Now, in general this traffic is usually going across an internet link which, on its own, may not be secure. However, the right SD-WAN platform will have a unified stateful firewall built-in for local internet breakout allowing only branch-initiated sessions to enter the branch and providing the ability to service chain traffic to a cloud-based security service if necessary, before forwarding it to its final destination. If the application is moved and becomes hosted by another provider or perhaps back to a company’s own data center, traffic must be intelligently redirected, wherever the application is being hosted. Without automation and embedded machine learning, dynamic and intelligent traffic steering is impossible. - -### **A closer look at how the Silver Peak EdgeConnect™ SD-WAN edge platform addresses these challenges: ** - -**Automate traffic steering and connectivity to cloud providers** - -An [EdgeConnect][10] virtual instance is easily spun up in any of the [leading cloud providers][11] through their respective marketplaces. For an SD-WAN to intelligently steer traffic to its destination, it requires insights into both HTTP and HTTPS traffic; it must be able to identify apps on the first packet received in order to steer traffic to the right destination in accordance with business intent. This is critical capability because once a TCP connection is NAT’d with a public IP address, it cannot be switched thus it can’t be re-routed once a connection is established. So, the ability of EdgeConnect to identify, classify and automatically steer traffic based on the first packet – and not the second or tenth packet – to the correct destination will assure application SLAs, minimize wasting expensive bandwidth and deliver the highest quality of experience. - -Another critical capability is automatic performance optimization. Irrespective of which link the traffic ends up traversing based on business intent and the unique requirements of the application, EdgeConnect automatically optimizes application performance without human intervention by correcting for out of order packets using Packet Order Correction (POC) or even under high latency conditions that can be related to distance or other issues. This is done using adaptive Forward Error Correction (FEC) and tunnel bonding where a virtual tunnel is created, resulting in a single logical overlay that traffic can be dynamically moved between the different paths as conditions change with each underlay WAN service. In this [lightboard video][12], Dinesh Fernando, a technical marketing engineer at Silver Peak, explains how EdgeConnect automates tunnel creation between sites and cloud providers, how it simplifies data transfers between multi-clouds, and how it improves application performance. - -If your business is global and increasingly dependent on the cloud, the business-driven EdgeConnect SD-WAN edge platform enables seamless multi-cloud connectivity, turning the network into a business accelerant. EdgeConnect delivers: - - 1. A consistent deployment from the branch to the cloud, extending the reach of the SD-WAN into virtual private cloud environments - 2. Multi-cloud flexibility, making it easier to initiate and distribute resources across multiple cloud providers - 3. Investment protection by confidently migrating on premise IT resources to any combination of the leading public cloud platforms, knowing their cloud-hosted instances will be fully supported by EdgeConnect - - - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3397921/moving-to-the-cloud-sd-wan-matters.html - -作者:[Rami Rammaha][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Rami-Rammaha/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/istock-899678028-100797709-large.jpg -[2]: https://www.silver-peak.com/sd-wan/sd-wan-explained -[3]: https://www.silver-peak.com/company/tech-partners/cloud/aws -[4]: https://www.silver-peak.com/company/tech-partners/cloud/google-cloud -[5]: https://www.silver-peak.com/company/tech-partners/cloud/microsoft-azure -[6]: https://www.silver-peak.com/company/tech-partners/cloud/oracle-cloud -[7]: https://www.logicmonitor.com/resource/the-future-of-the-cloud-a-cloud-influencers-survey/?utm_medium=pr&utm_source=businesswire&utm_campaign=cloudsurvey -[8]: http://www.networkworld.com/article/3152024/lan-wan/in-the-age-of-digital-transformation-why-sd-wan-plays-a-key-role-in-the-transition.html -[9]: http://www.cnbc.com/2016/11/30/how-amazon-web-services-is-luring-banks-to-the-cloud.html?__source=yahoo%257cfinance%257cheadline%257cheadline%257cstory&par=yahoo&doc=104135637 -[10]: https://www.silver-peak.com/products/unity-edge-connect -[11]: https://www.silver-peak.com/company/tech-partners?strategic_partner_type=69 -[12]: https://www.silver-peak.com/resource-center/automate-connectivity-to-cloud-networking-with-sd-wan diff --git a/sources/talk/20190529 Satellite-based internet possible by year-end, says SpaceX.md b/sources/talk/20190529 Satellite-based internet possible by year-end, says SpaceX.md deleted file mode 100644 index 383fac66ca..0000000000 --- a/sources/talk/20190529 Satellite-based internet possible by year-end, says SpaceX.md +++ /dev/null @@ -1,63 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Satellite-based internet possible by year-end, says SpaceX) -[#]: via: (https://www.networkworld.com/article/3398940/space-internet-maybe-end-of-year-says-spacex.html) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Satellite-based internet possible by year-end, says SpaceX -====== -Amazon, Tesla-associated SpaceX and OneWeb are emerging as just some of the potential suppliers of a new kind of data-friendly satellite internet service that could bring broadband IoT connectivity to most places on Earth. -![Getty Images][1] - -With SpaceX’s successful launch of an initial array of broadband-internet-carrying satellites last week, and Amazon’s surprising posting of numerous satellite engineering-related job openings on its [job board][2] this month, one might well be asking if the next-generation internet space race is finally getting going. (I first wrote about [OneWeb’s satellite internet plans][3] it was concocting with Airbus four years ago.) - -This new batch of satellite-driven internet systems, if they work and are eventually switched on, could provide broadband to most places, including previously internet-barren locations, such as rural areas. That would be good for high-bandwidth, low-latency remote-internet of things (IoT) and increasingly important edge-server connections for verticals like oil and gas and maritime. [Data could even end up getting stored in compliance-friendly outer space, too][4]. Leaky ground-based connections, also, perhaps a thing of the past. - -Of the principal new internet suppliers, SpaceX has gotten farthest along. That’s in part because it has commercial impetus. It needed to create payload for its numerous rocket projects. The Tesla electric-car-associated company (the two firms share materials science) has not only launched its first tranche of 60 satellites for its own internet constellation, called Starlink, but also successfully launched numerous batches (making up the full constellation of 75 satellites) for Iridium’s replacement, an upgraded constellation called Iridium NEXT. - -[The time of 5G is almost here][5] - -Potential competitor OneWeb launched its first six Airbus-built satellites in February. [It has plans for 900 more][6]. SpaceX has been approved for 4,365 more by the FCC, and Project Kuiper, as Amazon’s space internet project is known, wants to place 3,236 satellites in orbit, according to International Telecommunication Union filings [discovered by _GeekWire_][7] earlier this year. [Startup LeoSat, which I wrote about last year, aims to build an internet backbone constellation][8]. Facebook, too, is exploring [space-delivered internet][9]. - -### Why the move to space? - -Laser technical progress, where data is sent in open, free space, rather than via a restrictive, land-based cable or via traditional radio paths, is partly behind this space-internet rush. “Bits travel faster in free space than in glass-fiber cable,” LeoSat explained last year. Additionally, improving microprocessor tech is also part of the mix. - -One important difference from existing older-generation satellite constellations is that this new generation of internet satellites will be located in low Earth orbit (LEO). Initial Starlink satellites will be placed at about 350 miles above Earth, with later launches deployed at 710 miles. - -There’s an advantage to that. Traditional satellites in geostationary orbit, or GSO, have been deployed about 22,000 miles up. That extra distance versus LEO introduces latency and is one reason earlier generations of Internet satellites are plagued by slow round-trip times. Latency didn’t matter when GSO was introduced in 1964, and commercial satellites, traditionally, have been pitched as one-way video links, such as are used by sporting events for broadcast, and not for data. - -And when will we get to experience these new ISPs? “Starlink is targeted to offer service in the Northern U.S. and Canadian latitudes after six launches,” [SpaceX says on its website][10]. Each launch would deliver about 60 satellites. “SpaceX is targeting two to six launches by the end of this year.” - -Global penetration of the “populated world” could be obtained after 24 launches, it thinks. - -Join the Network World communities on [Facebook][11] and [LinkedIn][12] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3398940/space-internet-maybe-end-of-year-says-spacex.html - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/10/network_iot_world-map_us_globe_nodes_global-100777483-large.jpg -[2]: https://www.amazon.jobs/en/teams/projectkuiper -[3]: https://www.itworld.com/article/2938652/space-based-internet-starts-to-get-serious.html -[4]: https://www.networkworld.com/article/3200242/data-should-be-stored-data-in-space-firm-says.html -[5]: https://www.networkworld.com/article/3354477/mobile-world-congress-the-time-of-5g-is-almost-here.html -[6]: https://www.airbus.com/space/telecommunications-satellites/oneweb-satellites-connection-for-people-all-over-the-globe.html -[7]: https://www.geekwire.com/2019/amazon-lists-scores-jobs-bellevue-project-kuiper-broadband-satellite-operation/ -[8]: https://www.networkworld.com/article/3328645/space-data-backbone-gets-us-approval.html -[9]: https://www.networkworld.com/article/3338081/light-based-computers-to-be-5000-times-faster.html -[10]: https://www.starlink.com/ -[11]: https://www.facebook.com/NetworkWorld/ -[12]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190529 Survey finds SD-WANs are hot, but satisfaction with telcos is not.md b/sources/talk/20190529 Survey finds SD-WANs are hot, but satisfaction with telcos is not.md deleted file mode 100644 index 9b65a6c8dd..0000000000 --- a/sources/talk/20190529 Survey finds SD-WANs are hot, but satisfaction with telcos is not.md +++ /dev/null @@ -1,69 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Survey finds SD-WANs are hot, but satisfaction with telcos is not) -[#]: via: (https://www.networkworld.com/article/3398478/survey-finds-sd-wans-are-hot-but-satisfaction-with-telcos-is-not.html) -[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/) - -Survey finds SD-WANs are hot, but satisfaction with telcos is not -====== -A recent survey of over 400 IT executives by Cato Networks found that legacy telcos might be on the outside looking in for SD-WANs. -![istock][1] - -This week SD-WAN vendor Cato Networks announced the results of its [Telcos and the Future of the WAN in 2019 survey][2]. The study was a mix of companies of all sizes, with 42% being enterprise-class (over 2,500 employees). More than 70% had a network with more than 10 locations, and almost a quarter (24%) had over 100 sites. All of the respondents have a cloud presence, and almost 80% have at least two data centers. The survey had good geographic diversity, with 57% of respondents coming from the U.S. and 24% from Europe. - -Highlights of the survey include the following key findings: - -## **SD-WANs are hot but not a panacea to all networking challenges** - -The survey found that 44% of respondents have already deployed or will deploy an SD-WAN within the next 12 months. This number is up sharply from 25% when Cato ran the survey a year ago. Another 33% are considering SD-WAN but have no immediate plans to deploy. The primary drivers for the evolution of the WAN are improved internet access (46%), increased bandwidth (39%), improved last-mile availability (38%) and reduced WAN costs (37%). It’s good to see cost savings drop to fourth in motivation, since there is so much more to SD-WAN. - -[The time of 5G is almost here][3] - -It’s interesting that the majority of respondents believe SD-WAN alone can’t address all challenges facing the WAN. A whopping 85% stated they would be confronting issues not addressed by SD-WAN alone. This includes secure, local internet breakout, improved visibility, and control over mobile access to cloud apps. This indicates that customers are looking for SD-WAN to be the foundation of the WAN but understand that other technologies need to be deployed as well. - -## **Telco dissatisfaction is high** - -The traditional telco has been a point of frustration for network professionals for years, and the survey spelled that out loud and clear. Prior to being an analyst, I held a number of corporate IT positions and found telcos to be the single most frustrating group of companies to deal with. The problem was, there was no choice. If you need MPLS services, you need a telco. The same can’t be said for SD-WANs, though; businesses have more choices. - -Respondents to the survey ranked telco service as “average.” It’s been well documented that we are now in the customer-experience era and “good enough” service is no longer good enough. Regarding pricing, 54% gave telcos a failing grade. Although price isn’t everything, this will certainly open the door to competitive SD-WAN vendors. Respondents gave the highest marks for overall experience to SaaS providers, followed by cloud computing suppliers. Global telcos scored the lowest of all vendor types. - -A look deeper explains the frustration level. The network is now mission-critical for companies, but 48% stated they are able to reach the support personnel with the right expertise to solve a problem only on a second attempt. No retailer, airline, hotel or other type of company could survive this, but telco customers had no other options for years. - -**[[Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][4] ]** - -Another interesting set of data points is the speed at which telcos address customer needs. Digital businesses compete on speed, but telco process is the antithesis of fast. Moves, adds and changes take at least one business day for half of the respondents. Also, 70% indicated that opening a new location takes 15 days, and 38% stated it requires 45 days or more. - -## **Security is now part of SD-WAN** - -The use of broadband, cloud access and other trends raise the bar on security for SD-WAN, and the survey confirmed that respondents are skeptical that SD-WANs could address these issues. Seventy percent believe SD-WANs can’t address malware/ransomware, and 49% don’t think SD-WAN helps with enforcing company policies on mobile users. Because of this, network professionals are forced to buy additional security tools from other vendors, but that can drive up complexity. SD-WAN vendors that have intrinsic security capabilities can use that as a point of differentiation. - -## **Managed services are critical to the growth of SD-WANs** - -The survey found that 75% of respondents are using some kind of managed service provider, versus only 25% using an appliance vendor. This latter number was 32% last year. I’m not surprised by this shift and expect it to continue. Legacy WANs were inefficient but straightforward to deploy. D-WANs are highly agile and more cost-effective, but complexity has gone through the roof. Network engineers need to factor in cloud connectivity, distributed security, application performance, broadband connectivity and other issues. Managed services can help businesses enjoy the benefits of SD-WAN while masking the complexity. - -Despite the desire to use an MSP, respondents don’t want to give up total control. Eighty percent stated they preferred self-service or co-managed models. This further explains the shift away from telcos, since they typically work with fully managed models. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3398478/survey-finds-sd-wans-are-hot-but-satisfaction-with-telcos-is-not.html - -作者:[Zeus Kerravala][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Zeus-Kerravala/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/02/istock-465661573-100750447-large.jpg -[2]: https://www.catonetworks.com/news/digital-transformation-survey/ -[3]: https://www.networkworld.com/article/3354477/mobile-world-congress-the-time-of-5g-is-almost-here.html -[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190601 True Hyperconvergence at Scale- HPE Simplivity With Composable Fabric.md b/sources/talk/20190601 True Hyperconvergence at Scale- HPE Simplivity With Composable Fabric.md deleted file mode 100644 index 97eb611ef8..0000000000 --- a/sources/talk/20190601 True Hyperconvergence at Scale- HPE Simplivity With Composable Fabric.md +++ /dev/null @@ -1,28 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (True Hyperconvergence at Scale: HPE Simplivity With Composable Fabric) -[#]: via: (https://www.networkworld.com/article/3399619/true-hyperconvergence-at-scale-hpe-simplivity-with-composable-fabric.html) -[#]: author: (HPE https://www.networkworld.com/author/Michael-Cooney/) - -True Hyperconvergence at Scale: HPE Simplivity With Composable Fabric -====== - -Many hyperconverged solutions only focus on software-defined storage. However, many networking functions and technologies can be consolidated for simplicity and scale in the data center. This video describes how HPE SimpliVity with Composable Fabric gives organizations the power to run any virtual machine anywhere, anytime. Read more about HPE SimpliVity [here][1]. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3399619/true-hyperconvergence-at-scale-hpe-simplivity-with-composable-fabric.html - -作者:[HPE][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Michael-Cooney/ -[b]: https://github.com/lujun9972 -[1]: https://hpe.com/info/simplivity diff --git a/sources/talk/20190602 IoT Roundup- New research on IoT security, Microsoft leans into IoT.md b/sources/talk/20190602 IoT Roundup- New research on IoT security, Microsoft leans into IoT.md deleted file mode 100644 index 6d955c6485..0000000000 --- a/sources/talk/20190602 IoT Roundup- New research on IoT security, Microsoft leans into IoT.md +++ /dev/null @@ -1,71 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (IoT Roundup: New research on IoT security, Microsoft leans into IoT) -[#]: via: (https://www.networkworld.com/article/3398607/iot-roundup-new-research-on-iot-security-microsoft-leans-into-iot.html) -[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) - -IoT Roundup: New research on IoT security, Microsoft leans into IoT -====== -Verizon sets up widely available narrow-band IoT service, while most Americans think IoT manufacturers should ensure their products protect personal information. -As with any technology whose use is expanding at such speed, it can be tough to track exactly what’s going on in the [IoT][1] world – everything from basic usage numbers to customer attitudes to more in-depth slices of the market is constantly changing. Fortunately, the month of May brought several new pieces of research to light, which should help provide at least a partial outline of what’s really happening in IoT. - -### Internet of things polls - -Not all of the news is good. An IPSOS Mori poll performed on behalf of the Internet Society and Consumers International (respectively, an umbrella organization for open development and Internet use and a broad-based consumer advocacy group) found that, despite the skyrocketing numbers of smart devices in circulation around the world, more than half of users in large parts of the western world don’t trust those devices to safeguard their privacy. - -**More on IoT:** - - * [What is the IoT? How the internet of things works][2] - * [What is edge computing and how it’s changing the network][3] - * [Most powerful Internet of Things companies][4] - * [10 Hot IoT startups to watch][5] - * [The 6 ways to make money in IoT][6] - * [What is digital twin technology? [and why it matters]][7] - * [Blockchain, service-centric networking key to IoT success][8] - * [Getting grounded in IoT networking and security][9] - * [Building IoT-ready networks must become a priority][10] - * [What is the Industrial IoT? [And why the stakes are so high]][11] - - - -While almost 70 percent of respondents owned connected devices, 55 percent said they didn’t feel their personal information was adequately protected by manufacturers. A further 28 percent said they had avoided using connected devices – smart home, fitness tracking and similar consumer gadgetry – primarily because they were concerned over privacy issues, and a whopping 85 percent of Americans agreed with the argument that manufacturers had a responsibility to produce devices that protected personal information. - -Those concerns are understandable, according to data from the Ponemon Institute, a tech-research organization. Its survey of corporate risk and security personnel, released in early May, found that there have been few concerted efforts to limit exposure to IoT-based security threats, and that those threats are sharply on the rise when compared to past years, with the percentage of organizations that had experienced a data breach related to unsecured IoT devices rising from 15 percent in fiscal 2017 to 26 percent in fiscal 2019. - -Beyond a lack of organizational wherewithal to address those threats, part of the problem in some verticals is technical. Security vendor Forescout said earlier this month that its research showed 40 percent of all healthcare IT environments had more than 20 different operating systems, and more than 30 percent had more than 100 – hardly an ideal situation for smooth patching and updating. - -To continue reading this article register now - -[Get Free Access][12] - -[Learn More][13] Existing Users [Sign In][12] - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3398607/iot-roundup-new-research-on-iot-security-microsoft-leans-into-iot.html - -作者:[Jon Gold][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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://www.networkworld.com/article/3207535/what-is-iot-how-the-internet-of-things-works.html -[2]: https://www.networkworld.com/article/3207535/internet-of-things/what-is-the-iot-how-the-internet-of-things-works.html -[3]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[4]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[5]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[6]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[7]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[8]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[9]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[10]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[11]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[12]: javascript:// -[13]: /learn-about-insider/ diff --git a/sources/talk/20190603 It-s time for the IoT to -optimize for trust.md b/sources/talk/20190603 It-s time for the IoT to -optimize for trust.md deleted file mode 100644 index cc5aa9db7c..0000000000 --- a/sources/talk/20190603 It-s time for the IoT to -optimize for trust.md +++ /dev/null @@ -1,102 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (It’s time for the IoT to 'optimize for trust') -[#]: via: (https://www.networkworld.com/article/3399817/its-time-for-the-iot-to-optimize-for-trust.html) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -It’s time for the IoT to 'optimize for trust' -====== -If we can't trust the internet of things (IoT) to gather accurate data and use it appropriately, IoT adoption and innovation are likely to suffer. -![Bose][1] - -One of the strengths of internet of things (IoT) technology is that it can do so many things well. From smart toothbrushes to predictive maintenance on jetliners, the IoT has more use cases than you can count. The result is that various IoT uses cases require optimization for particular characteristics, from cost to speed to long life, as well as myriad others. - -But in a recent post, "[How the internet of things will change advertising][2]" (which you should definitely read), the always-insightful Stacy Higginbotham tossed in a line that I can’t stop thinking about: “It's crucial that the IoT optimizes for trust." - -**[ Read also: Network World's[corporate guide to addressing IoT security][3] ]** - -### Trust is the IoT's most important attribute - -Higginbotham was talking about optimizing for trust as opposed to clicks, but really, trust is more important than just about any other value in the IoT. It’s more important than bandwidth usage, more important than power usage, more important than cost, more important than reliability, and even more important than security and privacy (though they are obviously related). In fact, trust is the critical factor in almost every aspect of the IoT. - -Don’t believe me? Let’s take a quick look at some recent developments in the field: - -For one thing, IoT devices often don’t take good care of the data they collect from you. Over 90% of data transactions on IoT devices are not fully encrypted, according to a new [study from security company Zscaler][4]. The [problem][5], apparently, is that many companies have large numbers of consumer-grade IoT devices on their networks. In addition, many IoT devices are attached to the companies’ general networks, and if that network is breached, the IoT devices and data may also be compromised. - -In some cases, ownership of IoT data can raise surprisingly serious trust concerns. According to [Kaiser Health News][6], smartphone sleep apps, as well as smart beds and smart mattress pads, gather amazingly personal information: “It knows when you go to sleep. It knows when you toss and turn. It may even be able to tell when you’re having sex.” And while companies such as Sleep Number say they don’t share the data they gather, their written privacy policies clearly state that they _can_. - -### **Lack of trust may lead to new laws** - -In California, meanwhile, "lawmakers are pushing for new privacy rules affecting smart speakers” such as the Amazon Echo. According to the _[LA Times][7]_ , the idea is “to ensure that the devices don’t record private conversations without permission,” requiring a specific opt-in process. Why is this an issue? Because consumers—and their elected representatives—don’t trust that Amazon, or any IoT vendor, will do the right thing with the data it collects from the IoT devices it sells—perhaps because it turns out that thousands of [Amazon employees have been listening in on what Alexa users are][8] saying to their Echo devices. - -The trust issues get even trickier when you consider that Amazon reportedly considered letting Alexa listen to users even without a wake word like “Alexa” or “computer,” and is reportedly working on [wearable devices designed to read human emotions][9] from listening to your voice. - -“The trust has been breached,” said California Assemblyman Jordan Cunningham (R-Templeton) to the _LA Times_. - -As critics of the bill ([AB 1395][10]) point out, the restrictions matter because voice assistants require this data to improve their ability to correctly understand and respond to requests. - -### **Some first steps toward increasing trust** - -Perhaps recognizing that the IoT needs to be optimized for trust so that we are comfortable letting it do its job, Amazon recently introduced a new Alexa voice command: “[Delete what I said today][11].” - -Moves like that, while welcome, will likely not be enough. - -For example, a [new United Nations report][12] suggests that “voice assistants reinforce harmful gender stereotypes” when using female-sounding voices and names like Alexa and Siri. Put simply, “Siri’s ‘female’ obsequiousness—and the servility expressed by so many other digital assistants projected as young women—provides a powerful illustration of gender biases coded into technology products, pervasive in the technology sector and apparent in digital skills education.” I'm not sure IoT vendors are eager—or equipped—to tackle issues like that. - -**More on IoT:** - - * [What is the IoT? How the internet of things works][13] - * [What is edge computing and how it’s changing the network][14] - * [Most powerful Internet of Things companies][15] - * [10 Hot IoT startups to watch][16] - * [The 6 ways to make money in IoT][17] - * [What is digital twin technology? [and why it matters]][18] - * [Blockchain, service-centric networking key to IoT success][19] - * [Getting grounded in IoT networking and security][20] - * [Building IoT-ready networks must become a priority][21] - * [What is the Industrial IoT? [And why the stakes are so high]][22] - - - -Join the Network World communities on [Facebook][23] and [LinkedIn][24] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3399817/its-time-for-the-iot-to-optimize-for-trust.html - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/09/bose-sleepbuds-2-100771579-large.jpg -[2]: https://mailchi.mp/iotpodcast/stacey-on-iot-how-iot-changes-advertising?e=6bf9beb394 -[3]: https://www.networkworld.com/article/3269165/internet-of-things/a-corporate-guide-to-addressing-iot-security-concerns.html -[4]: https://www.zscaler.com/blogs/research/iot-traffic-enterprise-rising-so-are-threats -[5]: https://www.csoonline.com/article/3397044/over-90-of-data-transactions-on-iot-devices-are-unencrypted.html -[6]: https://khn.org/news/a-wake-up-call-on-data-collecting-smart-beds-and-sleep-apps/ -[7]: https://www.latimes.com/politics/la-pol-ca-alexa-google-home-privacy-rules-california-20190528-story.html -[8]: https://www.usatoday.com/story/tech/2019/04/11/amazon-employees-listening-alexa-customers/3434732002/ -[9]: https://www.bloomberg.com/news/articles/2019-05-23/amazon-is-working-on-a-wearable-device-that-reads-human-emotions -[10]: https://leginfo.legislature.ca.gov/faces/billTextClient.xhtml?bill_id=201920200AB1395 -[11]: https://venturebeat.com/2019/05/29/amazon-launches-alexa-delete-what-i-said-today-voice-command/ -[12]: https://unesdoc.unesco.org/ark:/48223/pf0000367416.page=1 -[13]: https://www.networkworld.com/article/3207535/internet-of-things/what-is-the-iot-how-the-internet-of-things-works.html -[14]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[15]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[16]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[17]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[18]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[19]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[20]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[21]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[22]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[23]: https://www.facebook.com/NetworkWorld/ -[24]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190604 Data center workloads become more complex despite promises to the contrary.md b/sources/talk/20190604 Data center workloads become more complex despite promises to the contrary.md deleted file mode 100644 index 31d127e77d..0000000000 --- a/sources/talk/20190604 Data center workloads become more complex despite promises to the contrary.md +++ /dev/null @@ -1,64 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Data center workloads become more complex despite promises to the contrary) -[#]: via: (https://www.networkworld.com/article/3400086/data-center-workloads-become-more-complex-despite-promises-to-the-contrary.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Data center workloads become more complex despite promises to the contrary -====== -The data center is shouldering a greater burden than ever, despite promises of ease and the cloud. -![gorodenkoff / Getty Images][1] - -Data centers are becoming more complex and still run the majority of workloads despite the promises of simplicity of deployment through automation and hyperconverged infrastructure (HCI), not to mention how the cloud was supposed to take over workloads. - -That’s the finding of the Uptime Institute's latest [annual global data center survey][2] (registration required). The majority of IT loads still run on enterprise data centers even in the face of cloud adoption, putting pressure on administrators to have to manage workloads across the hybrid infrastructure. - -**[ Learn[how server disaggregation can boost data center efficiency][3] | Get regularly scheduled insights: [Sign up for Network World newsletters][4] ]** - -With workloads like artificial intelligence (AI) and machine language coming to the forefront, that means facilities face greater power and cooling challenges, since AI is extremely processor-intensive. That puts strain on data center administrators and power and cooling vendors alike to keep up with the growth in demand. - -On top of it all, everyone is struggling to get enough staff with the right skills. - -### Outages, staffing problems, lack of public cloud visibility among top concerns - -Among the key findings of Uptime's report: - - * The large, privately owned enterprise data center facility still forms the bedrock of corporate IT and is expected to be running half of all workloads in 2021. - * The staffing problem affecting most of the data center sector has only worsened. Sixty-one percent of respondents said they had difficulty retaining or recruiting staff, up from 55% a year earlier. - * Outages continue to cause significant problems for operators. Just over a third (34%) of all respondents had an outage or severe IT service degradation in the past year, while half (50%) had an outage or severe IT service degradation in the past three years. - * Ten percent of all respondents said their most recent significant outage cost more than $1 million. - * A lack of visibility, transparency, and accountability of public cloud services is a major concern for enterprises that have mission-critical applications. A fifth of operators surveyed said they would be more likely to put workloads in a public cloud if there were more visibility. Half of those using public cloud for mission-critical applications also said they do not have adequate visibility. - * Improvements in data center facility energy efficiency have flattened out and even deteriorated slightly in the past two years. The average PUE for 2019 is 1.67. - * Rack power density is rising after a long period of flat or minor increases, causing many to rethink cooling strategies. - * Power loss was the single biggest cause of outages, accounting for one-third of outages. Sixty percent of respondents said their data center’s outage could have been prevented with better management/processes or configuration. - - - -Traditionally data centers are improving their reliability through "rigorous attention to power, infrastructure, connectivity and on-site IT replication," the Uptime report says. The solution, though, is pricy. Data center operators are getting distributed resiliency through active-active data centers where at least two active data centers replicate data to each other. Uptime found up to 40% of those surveyed were using this method. - -The Uptime survey was conducted in March and April of this year, surveying 1,100 end users in more than 50 countries and dividing them into two groups: the IT managers, owners, and operators of data centers and the suppliers, designers, and consultants that service the industry. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3400086/data-center-workloads-become-more-complex-despite-promises-to-the-contrary.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/cso_cloud_computing_backups_it_engineer_data_center_server_racks_connections_by_gorodenkoff_gettyimages-943065400_3x2_2400x1600-100796535-large.jpg -[2]: https://uptimeinstitute.com/2019-data-center-industry-survey-results -[3]: https://www.networkworld.com/article/3266624/how-server-disaggregation-could-make-cloud-datacenters-more-efficient.html -[4]: https://www.networkworld.com/newsletters/signup.html -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190604 Moving to the Cloud- SD-WAN Matters- Part 2.md b/sources/talk/20190604 Moving to the Cloud- SD-WAN Matters- Part 2.md deleted file mode 100644 index 2f68bd6f59..0000000000 --- a/sources/talk/20190604 Moving to the Cloud- SD-WAN Matters- Part 2.md +++ /dev/null @@ -1,66 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Moving to the Cloud? SD-WAN Matters! Part 2) -[#]: via: (https://www.networkworld.com/article/3398488/moving-to-the-cloud-sd-wan-matters-part-2.html) -[#]: author: (Rami Rammaha https://www.networkworld.com/author/Rami-Rammaha/) - -Moving to the Cloud? SD-WAN Matters! Part 2 -====== - -![istock][1] - -This is the second installment of the blog series exploring how enterprises can realize the full transformation promise of the cloud by shifting to a business first networking model powered by a business-driven [SD-WAN][2]. The first installment explored automating secure IPsec connectivity and intelligently steering traffic to cloud providers. We also framed the direct correlation between moving to the cloud and adopting an SD-WAN. In this blog, we will expand upon several additional challenges that can be addressed with a business-driven SD-WAN when embracing the cloud: - -### Simplifying and automating security zone-based segmentation - -Securing cloud-first branches requires a robust multi-level approach that addresses following considerations: - - * Restricting outside traffic coming into the branch to sessions exclusively initiated by internal users with a built-in stateful firewall, avoiding appliance sprawl and lowering operational costs; this is referred to as the app whitelist model - * Encrypting communications between end points within the SD-WAN fabric and between branch locations and public cloud instances - * Service chaining traffic to a cloud-hosted security service like [Zscaler][3] for Layer 7 inspection and analytics for internet-bound traffic - * Segmenting traffic spanning the branch, WAN and data center/cloud - * Centralizing policy orchestration and automation of zone-based firewall, VLAN and WAN overlays - - - -A traditional device-centric WAN approach for security segmentation requires the time-consuming manual configuration of routers and/or firewalls on a device-by-device and site-by-site basis. This is not only complex and cumbersome, but it simply can’t scale to 100s or 1000s of sites. Anusha Vaidyanathan, director of product management at Silver Peak, explains how to automate end-to-end zone-based segmentation, emphasizing the advantages of a business-driven approach in this [lightboard video][4]. - -### Delivering the Highest Quality of Experience to IT teams - -The goal for enterprise IT is enabling business agility and increasing operational efficiency. The traditional router-centric WAN approach doesn’t provide the best quality of experience for IT as management and on-going network operations are manual and time consuming, device-centric, cumbersome, error-prone and inefficient. - -A business-driven SD-WAN such as the Silver Peak [Unity EdgeConnect™][5] unified SD-WAN edge platform centralizes the orchestration of business-driven policies. EdgeConnect automation, machine learning and open APIs easily integrate with third-party management tools and real-time visibility tools to deliver the highest quality of experience for IT, enabling them to reclaim nights and weekends. Manav Mishra, vice president of product management at Silver Peak, explains the latest Silver Peak innovations in this [lightboard video][6]. - -As enterprises become increasingly dependent on the cloud and embrace a multi-cloud strategy, they must address a number of new challenges: - - * A centralized approach to securely embracing the cloud and the internet - * How to extend the on-premise data center to a public cloud and migrating workloads between private and public cloud, taking application portability into account - * Deliver consistent high application performance and availability to hosted applications whether they reside in the data center, private or public clouds or are delivered as SaaS services - * A proactive way to quickly resolve complex issues that span the data center and cloud as well as multiple WAN transport services by harnessing the power of advanced visibility and analytics tools - - - -The business-driven EdgeConnect SD-WAN edge platform enables enterprise IT organizations to easily and consistently embrace the public cloud. Unified security and performance capabilities with automation deliver the highest quality of experience for both users and IT while lowering overall WAN expenditures. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3398488/moving-to-the-cloud-sd-wan-matters-part-2.html - -作者:[Rami Rammaha][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Rami-Rammaha/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/istock-909772962-100797711-large.jpg -[2]: https://www.silver-peak.com/sd-wan/sd-wan-explained -[3]: https://www.silver-peak.com/company/tech-partners/zscaler -[4]: https://www.silver-peak.com/resource-center/how-to-create-sd-wan-security-zones-in-edgeconnect -[5]: https://www.silver-peak.com/products/unity-edge-connect -[6]: https://www.silver-peak.com/resource-center/how-to-optimize-quality-of-experience-for-it-using-sd-wan diff --git a/sources/talk/20190604 Why Emacs.md b/sources/talk/20190604 Why Emacs.md deleted file mode 100644 index 0d9b12ba1a..0000000000 --- a/sources/talk/20190604 Why Emacs.md +++ /dev/null @@ -1,94 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why Emacs) -[#]: via: (https://saurabhkukade.github.io/Why-Emacs/) -[#]: author: (Saurabh Kukade http://saurabhkukade.github.io/) - -Why Emacs -====== -![Image of Emacs][1] - -> “Emacs outshines all other editing software in approximately the same way that the noonday sun does the stars. It is not just bigger and brighter; it simply makes everything else vanish.” - -> -Neal Stephenson, “In the Beginning was the Command Line” - -### Introduction - -This is my first blog post about Emacs. I want to discuss step by step customization of Emacs for beginner. If you’re new to Emacs then you are in the right place, if you’re already familiar with Emacs then that is even better, I assure you that we will get to know many new things in here. - -Before getting into how to customize Emacs and what are the exciting features of Emacs I want to write about “why Emacs”. - -### Why Emacs? - -This was first question crossed my mind when one wise man asked me to try Emacs instead of VIM. Well, I am not writing this article to discuss a battle between two editors VIM and Emacs. That is a another story for another day. But Why Emacs? Well here are some things that justifies that Emacs is powerful and highly customizable. - -### 41 Years! - -Initial release year of Emacs is 1976 that means Emacs is standing and adapting changes from last 41 years. - -41 years of time for a software is huge and that makes Emacs is one of the best Software Engineering product. - -### Lisp (Emacs Lisp) - -If you are lisp programmer (lisper) then I don’t need to explain you. But for those who don’t know Lisp and its dialects like Scheme, Clojure then Lisp (and all dialects of Lips) is powerful programming language and it stands different from other languages because of its unique property of “Homoiconicity”. - -As Emacs is implemented in C and Emacs Lisp (Emacs Lisp is a dialect of the Lisp programming language) it makes Emacs what is because, - - * The simple syntax of Lisp, together with the powerful editing features made possible by that simple syntax, add up to a more convenient programming system than is practical with other languages. Lisp and extensible editors are made for each other. - - * The simplicity of Lisp syntax makes intelligent editing operations easier to implement, while the complexity of other languages discourages their users from implementing similar operations for them. - - - - -### Highly Customizable - -To any programmer, tools gives power and convenience for reading, writing and managing a code. - -Hence, if a tool is programmatic-ally customizable then that makes it even more powerful. - -Emacs has above property and in fact is itself one of best tool known for its flexibility and easy customization. Emacs provides basic commands and key configuration for editing a text. This commands and key-configuration are editable and extensible. - -Beside basic configuration, Emacs is not biased towards any specific language for customization. One can customize Emacs for any programming language or extend easily existing customization. - -Emacs provides the consistent environment for multiple programming languages, email, organizer (via org-mode), a shell/interpreter, note taking, and document writing. - -For customizing you don’t need to learn Emacs-lisp from scratch. You can use existing packages available and that’s it. Installing and managing packages in Emacs is easy, Emacs has in-built package manager for it. - -Customization is very portable, one just need to place a file or directory containing personal customization file(s) in the right place and it’s done for getting personal customization to new place. ## Huge platform Support - -Emacs supports Lisp, Ruby, Python, PHP, Java, Erlang, JavaScript, C, C++, Prolog, Tcl, AWK, PostScript, Clojure, Scala, Perl, Haskell, Elixir all of these languages and more like mysql, pgsql etc. Because of the powerful Lisp core, Emacs is easy to extend to add support for new languages if need to. - -Also one can use the built-in IRC client ERC along with BitlBee to connect to your favorite chat services, or use the Jabber package to hop on any XMPP service. - -### Org-mode - -No matter if you are programmer or not. Org mode is for everyone. Org mode lets you to plan projects and organize schedule. It can be also use for publish notes and documents to different formats, like LaTeX->pdf, html, and markdown. - -In fact, Org-mode is so awesome enough that many non-Emacs users started learn Emacs. - -### Final note - -There are number of reason to argue that Emacs is cool and awesome to use. But I just wanted you to give glimpse of why to try Emacs. In the upcoming post I will be writing step by step information to customize Emacs from scratch to awesome IDE. - -Thank you! - -Please don’t forget to comment your thoughts and suggestions below. - --------------------------------------------------------------------------------- - -via: https://saurabhkukade.github.io/Why-Emacs/ - -作者:[Saurabh Kukade][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: http://saurabhkukade.github.io/ -[b]: https://github.com/lujun9972 -[1]: https://saurabhkukade.github.io/img/emacs.jpeg diff --git a/sources/talk/20190606 Cloud adoption drives the evolution of application delivery controllers.md b/sources/talk/20190606 Cloud adoption drives the evolution of application delivery controllers.md deleted file mode 100644 index d7b22353c4..0000000000 --- a/sources/talk/20190606 Cloud adoption drives the evolution of application delivery controllers.md +++ /dev/null @@ -1,67 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Cloud adoption drives the evolution of application delivery controllers) -[#]: via: (https://www.networkworld.com/article/3400897/cloud-adoption-drives-the-evolution-of-application-delivery-controllers.html) -[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/) - -Cloud adoption drives the evolution of application delivery controllers -====== -Application delivery controllers (ADCs) are on the precipice of shifting from traditional hardware appliances to software form factors. -![Aramyan / Getty Images / Microsoft][1] - -Migrating to a cloud computing model will obviously have an impact on the infrastructure that’s deployed. This shift has already been seen in the areas of servers, storage, and networking, as those technologies have evolved to a “software-defined” model. And it appears that application delivery controllers (ADCs) are on the precipice of a similar shift. - -In fact, a new ZK Research [study about cloud computing adoption and the impact on ADCs][2] found that, when looking at the deployment model, hardware appliances are the most widely deployed — with 55% having fully deployed or are currently testing and only 15% currently researching hardware. (Note: I am an employee of ZK Research.) - -Juxtapose this with containerized ADCs where only 34% have deployed or are testing but 24% are currently researching and it shows that software in containers will outpace hardware for growth. Not surprisingly, software on bare metal and in virtual machines showed similar although lower, “researching” numbers that support the thesis that the market is undergoing a shift from hardware to software. - -**[ Read also:[How to make hybrid cloud work][3] ]** - -The study, conducted in collaboration with Kemp Technologies, surveyed 203 respondents from the U.K. and U.S. The demographic split was done to understand regional differences. An equal number of mid and large size enterprises were looked at, with 44% being from over 5,000 employees and the other 56% from companies that have 300 to 5,000 people. - -### Incumbency helps but isn’t a fait accompli for future ADC purchases - -The primary tenet of my research has always been that incumbents are threatened when markets transition, and this is something I wanted to investigate in the study. The survey asked whether buyers would consider an alternative as they evolve their applications from legacy (mode 1) to cloud-native (mode 2). The results offer a bit of good news and bad news for the incumbent providers. Only 8% said they would definitely select a new vendor, but 35% said they would not change. That means the other 57% will look at alternatives. This is sensible, as the requirements for cloud ADCs are different than ones that support traditional applications. - -### IT pros want better automation capabilities - -This begs the question as to what features ADC buyers want for a cloud environment versus traditional ones. The survey asked specifically what features would be most appealing in future purchases, and the top response was automation, followed by central management, application analytics, on-demand scaling (which is a form of automation), and visibility. - -The desire to automate was a positive sign for the evolution of buyer mindset. Just a few years ago, the mere mention of automation would have sent IT pros into a panic. The reality is that IT can’t operate effectively without automation, and technology professionals are starting to understand that. - -The reason automation is needed is that manual changes are holding businesses back. The survey asked how the speed of ADC changes impacts the speed at which applications are rolled out, and a whopping 60% said it creates significant or minor delays. In an era of DevOps and continuous innovation, multiple minor delays create a drag on the business and can cause it to fall behind is more agile competitors. - -![][4] - -### ADC upgrades and service provisioning benefit most from automation - -The survey also drilled down on specific ADC tasks to see where automation would have the most impact. Respondents were asked how long certain tasks took, answering in minutes, days, weeks, or months. Shockingly, there wasn’t a single task where the majority said it could be done in minutes. The closest was adding DNS entries for new virtual IP addresses (VIPs) where 46% said they could do that in minutes. - -Upgrading, provisioning new load balancers, and provisioning new VIPs took the longest. Looking ahead, this foreshadows big problems. As the data center gets more disaggregated and distributed, IT will deploy more software-based ADCs in more places. Taking days or weeks or month to perform these functions will cause the organization to fall behind. - -The study clearly shows changes are in the air for the ADC market. For IT pros, I strongly recommend that as the environment shifts to the cloud, it’s prudent to evaluate new vendors. By all means, see what your incumbent vendor has, but look at least at two others that offer software-based solutions. Also, there should be a focus on automating as much as possible, so the primary evaluation criteria for ADCs should be how easy it is to implement automation. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3400897/cloud-adoption-drives-the-evolution-of-application-delivery-controllers.html - -作者:[Zeus Kerravala][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Zeus-Kerravala/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/cw_microsoft_sharepoint_vs_onedrive_clouds_and_hands_by_aramyan_gettyimages-909772962_2400x1600-100796932-large.jpg -[2]: https://kemptechnologies.com/research-papers/adc-market-research-study-zeus-kerravala/?utm_source=zkresearch&utm_medium=referral&utm_campaign=zkresearch&utm_term=zkresearch&utm_content=zkresearch -[3]: https://www.networkworld.com/article/3119362/hybrid-cloud/how-to-make-hybrid-cloud-work.html#tk.nww-fsb -[4]: https://images.idgesg.net/images/article/2019/06/adc-survey-zk-research-100798593-large.jpg -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190606 For enterprise storage, persistent memory is here to stay.md b/sources/talk/20190606 For enterprise storage, persistent memory is here to stay.md deleted file mode 100644 index 3da91bb311..0000000000 --- a/sources/talk/20190606 For enterprise storage, persistent memory is here to stay.md +++ /dev/null @@ -1,118 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (For enterprise storage, persistent memory is here to stay) -[#]: via: (https://www.networkworld.com/article/3398988/for-enterprise-storage-persistent-memory-is-here-to-stay.html) -[#]: author: (John Edwards ) - -For enterprise storage, persistent memory is here to stay -====== -Persistent memory – also known as storage class memory – has tantalized data center operators for many years. A new technology promises the key to success. -![Thinkstock][1] - -It's hard to remember a time when semiconductor vendors haven't promised a fast, cost-effective and reliable persistent memory technology to anxious [data center][2] operators. Now, after many years of waiting and disappointment, technology may have finally caught up with the hype to make persistent memory a practical proposition. - -High-capacity persistent memory, also known as storage class memory ([SCM][3]), is fast and directly addressable like dynamic random-access memory (DRAM), yet is able to retain stored data even after its power has been switched off—intentionally or unintentionally. The technology can be used in data centers to replace cheaper, yet far slower traditional persistent storage components, such as [hard disk drives][4] (HDD) and [solid-state drives][5] (SSD). - -**Learn more about enterprise storage** - - * [Why NVMe over Fabric matters][6] - * [What is hyperconvergence?][7] - * [How NVMe is changing enterprise storage][8] - * [Making the right hyperconvergence choice: HCI hardware or software?][9] - - - -Persistent memory can also be used to replace DRAM itself in some situations without imposing a significant speed penalty. In this role, persistent memory can deliver crucial operational benefits, such as lightning-fast database-server restarts during maintenance, power emergencies and other expected and unanticipated reboot situations. - -Many different types of strategic operational applications and databases, particularly those that require low-latency, high durability and strong data consistency, can benefit from persistent memory. The technology also has the potential to accelerate virtual machine (VM) storage and deliver higher performance to multi-node, distributed-cloud applications. - -In a sense, persistent memory marks a rebirth of core memory. "Computers in the ‘50s to ‘70s used magnetic core memory, which was direct access, non-volatile memory," says Doug Wong, a senior member of [Toshiba Memory America's][10] technical staff. "Magnetic core memory was displaced by SRAM and DRAM, which are both volatile semiconductor memories." - -One of the first persistent memory devices to come to market is [Intel’s Optane DC][11]. Other vendors that have released persistent memory products or are planning to do so include [Samsung][12], Toshiba America Memory and [SK Hynix][13]. - -### Persistent memory: performance + reliability - -With persistent memory, data centers have a unique opportunity to gain faster performance and lower latency without enduring massive technology disruption. "It's faster than regular solid-state NAND flash-type storage, but you're also getting the benefit that it’s persistent," says Greg Schulz, a senior advisory analyst at vendor-independent storage advisory firm [StorageIO.][14] "It's the best of both worlds." - -Yet persistent memory offers adopters much more than speedy, reliable storage. In an ideal IT world, all of the data associated with an application would reside within DRAM to achieve maximum performance. "This is currently not practical due to limited DRAM and the fact that DRAM is volatile—data is lost when power fails," observes Scott Nelson, senior vice president and general manager of Toshiba Memory America's memory business unit. - -Persistent memory transports compatible applications to an "always on" status, providing continuous access to large datasets through increased system memory capacity, says Kristie Mann, [Intel's][15] director of marketing for data center memory and storage. She notes that Optane DC can supply data centers with up to three-times more system memory capacity (as much as 36TBs), system restarts in seconds versus minutes, 36% more virtual machines per node, and up to 8-times better performance on [Apache Spark][16], a widely used open-source distributed general-purpose cluster-computing framework. - -System memory currently represents 60% of total platform costs, Mann says. She observes that Optane DC persistent memory provides significant customer value by delivering 1.2x performance/dollar on key customer workloads. "This value will dramatically change memory/storage economics and accelerate the data-centric era," she predicts. - -### Where will persistent memory infiltrate enterprise storage? - -Persistent memory is likely to first enter the IT mainstream with minimal fanfare, serving as a high-performance caching layer for high performance SSDs. "This could be adopted relatively-quickly," Nelson observes. Yet this intermediary role promises to be merely a stepping-stone to increasingly crucial applications. - -Over the next few years, persistent technology will impact data centers serving enterprises across an array of sectors. "Anywhere time is money," Schulz says. "It could be financial services, but it could also be consumer-facing or sales-facing operations." - -Persistent memory supercharges anything data-related that requires extreme speed at extreme scale, observes Andrew Gooding, vice president of engineering at [Aerospike][17], which delivered the first commercially available open database optimized for use with Intel Optane DC. - -Machine learning is just one of many applications that stand to benefit from persistent memory. Gooding notes that ad tech firms, which rely on machine learning to understand consumers' reactions to online advertising campaigns, should find their work made much easier and more effective by persistent memory. "They’re collecting information as users within an ad campaign browse the web," he says. "If they can read and write all that data quickly, they can then apply machine-learning algorithms and tailor specific ads for users in real time." - -Meanwhile, as automakers become increasingly reliant on data insights, persistent memory promises to help them crunch numbers and refine sophisticated new technologies at breakneck speeds. "In the auto industry, manufacturers face massive data challenges in autonomous vehicles, where 20 exabytes of data needs to be processed in real time, and they're using self-training machine-learning algorithms to help with that," Gooding explains. "There are so many fields where huge amounts of data need to be processed quickly with machine-learning techniques—fraud detection, astronomy... the list goes on." - -Intel, like other persistent memory vendors, expects cloud service providers to be eager adopters, targeting various types of in-memory database services. Google, for example, is applying persistent memory to big data workloads on non-relational databases from vendors such as Aerospike and [Redis Labs][18], Mann says. - -High-performance computing (HPC) is yet another area where persistent memory promises to make a tremendous impact. [CERN][19], the European Organization for Nuclear Research, is using Intel's Optane DC to significantly reduce wait times for scientific computing. "The efficiency of their algorithms depends on ... persistent memory, and CERN considers it a major breakthrough that is necessary to the work they are doing," Mann observes. - -### How to prepare storage infrastructure for persistent memory - -Before jumping onto the persistent memory bandwagon, organizations need to carefully scrutinize their IT infrastructure to determine the precise locations of any existing data bottlenecks. This task will be primary application-dependent, Wong notes. "If there is significant performance degradation due to delays associated with access to data stored in non-volatile storage—SSD or HDD—then an SCM tier will improve performance," he explains. Yet some applications will probably not benefit from persistent memory, such as compute-bound applications where CPU performance is the bottleneck. - -Developers may need to reevaluate fundamental parts of their storage and application architectures, Gooding says. "They will need to know how to program with persistent memory," he notes. "How, for example, to make sure writes are flushed to the actual persistent memory device when necessary, as opposed to just sitting in the CPU cache." - -To leverage all of persistent memory's potential benefits, significant changes may also be required in how code is designed. When moving applications from DRAM and flash to persistent memory, developers will need to consider, for instance, what happens when a program crashes and restarts. "Right now, if they write code that leaks memory, that leaked memory is recovered on restart," Gooding explains. With persistent memory, that isn't necessarily the case. "Developers need to make sure the code is designed to reconstruct a consistent state when a program restarts," he notes. "You may not realize how much your designs rely on the traditional combination of fast volatile DRAM and block storage, so it can be tricky to change your code designs for something completely new like persistent memory." - -Older versions of operating systems may also need to be updated to accommodate the new technology, although newer OSes are gradually becoming persistent memory aware, Schulz says. "In other words, if they detect that persistent memory is available, then they know how to utilize that either as a cache, or some other memory." - -Hypervisors, such as [Hyper-V][20] and [VMware][21], now know how to leverage persistent memory to support productivity, performance and rapid restarts. By utilizing persistent memory along with the latest versions of VMware, a whole system can see an uplift in speed and also maximize the number of VMs to fit on a single host, says Ian McClarty, CEO and president of data center operator [PhoenixNAP Global IT Services][22]. "This is a great use case for companies who want to own less hardware or service providers who want to maximize hardware to virtual machine deployments." - -Many key enterprise applications, particularly databases, are also becoming persistent memory aware. SQL Server and [SAP’s][23] flagship [HANA][24] database management platform have both embraced persistent memory. "The SAP HANA platform is commonly used across multiple industries to process data and transactions, and then run advanced analytics ... to deliver real-time insights," Mann observes. - -In terms of timing, enterprises and IT organizations should begin persistent memory planning immediately, Schulz recommends. "You should be talking with your vendors and understanding their roadmap, their plans, for not only supporting this technology, but also in what mode: as storage, as memory." - -Join the Network World communities on [Facebook][25] and [LinkedIn][26] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3398988/for-enterprise-storage-persistent-memory-is-here-to-stay.html - -作者:[John Edwards][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2017/08/file_folder_storage_sharing_thinkstock_477492571_3x2-100732889-large.jpg -[2]: https://www.networkworld.com/article/3353637/the-data-center-is-being-reimagined-not-disappearing.html -[3]: https://www.networkworld.com/article/3026720/the-next-generation-of-storage-disruption-storage-class-memory.html -[4]: https://www.networkworld.com/article/2159948/hard-disk-drives-vs--solid-state-drives--are-ssds-finally-worth-the-money-.html -[5]: https://www.networkworld.com/article/3326058/what-is-an-ssd.html -[6]: https://www.networkworld.com/article/3273583/why-nvme-over-fabric-matters.html -[7]: https://www.networkworld.com/article/3207567/what-is-hyperconvergence -[8]: https://www.networkworld.com/article/3280991/what-is-nvme-and-how-is-it-changing-enterprise-storage.html -[9]: https://www.networkworld.com/article/3318683/making-the-right-hyperconvergence-choice-hci-hardware-or-software -[10]: https://business.toshiba-memory.com/en-us/top.html -[11]: https://www.intel.com/content/www/us/en/architecture-and-technology/optane-dc-persistent-memory.html -[12]: https://www.samsung.com/semiconductor/ -[13]: https://www.skhynix.com/eng/index.jsp -[14]: https://storageio.com/ -[15]: https://www.intel.com/content/www/us/en/homepage.html -[16]: https://spark.apache.org/ -[17]: https://www.aerospike.com/ -[18]: https://redislabs.com/ -[19]: https://home.cern/ -[20]: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/about/ -[21]: https://www.vmware.com/ -[22]: https://phoenixnap.com/ -[23]: https://www.sap.com/index.html -[24]: https://www.sap.com/products/hana.html -[25]: https://www.facebook.com/NetworkWorld/ -[26]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190606 Self-learning sensor chips won-t need networks.md b/sources/talk/20190606 Self-learning sensor chips won-t need networks.md deleted file mode 100644 index c5abec5426..0000000000 --- a/sources/talk/20190606 Self-learning sensor chips won-t need networks.md +++ /dev/null @@ -1,82 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Self-learning sensor chips won’t need networks) -[#]: via: (https://www.networkworld.com/article/3400659/self-learning-sensor-chips-wont-need-networks.html) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Self-learning sensor chips won’t need networks -====== -Scientists working on new, machine-learning networks aim to embed everything needed for artificial intelligence (AI) onto a processor, eliminating the need to transfer data to the cloud or computers. -![Jiraroj Praditcharoenkul / Getty Images][1] - -Tiny, intelligent microelectronics should be used to perform as much sensor processing as possible on-chip rather than wasting resources by sending often un-needed, duplicated raw data to the cloud or computers. So say scientists behind new, machine-learning networks that aim to embed everything needed for artificial intelligence (AI) onto a processor. - -“This opens the door for many new applications, starting from real-time evaluation of sensor data,” says [Fraunhofer Institute for Microelectronic Circuits and Systems][2] on its website. No delays sending unnecessary data onwards, along with speedy processing, means theoretically there is zero latency. - -Plus, on-microprocessor, self-learning means the embedded, or sensor, devices can self-calibrate. They can even be “completely reconfigured to perform a totally different task afterwards,” the institute says. “An embedded system with different tasks is possible.” - -**[ Also read:[What is edge computing?][3] and [How edge networking and IoT will reshape data centers][4] ]** - -Much internet of things (IoT) data sent through networks is redundant and wastes resources: a temperature reading taken every 10 minutes, say, when the ambient temperature hasn’t changed, is one example. In fact, one only needs to know when the temperature has changed, and maybe then only when thresholds have been met. - -### Neural network-on-sensor chip - -The commercial German research organization says it’s developing a specific RISC-V microprocessor with a special hardware accelerator designed for a [brain-copying, artificial neural network (ANN) it has developed][5]. The architecture could ultimately be suitable for the condition-monitoring or predictive sensors of the kind we will likely see more of in the industrial internet of things (IIoT). - -Key to Fraunhofer IMS’s [Artificial Intelligence for Embedded Systems (AIfES)][6] is that the self-learning takes place at chip level rather than in the cloud or on a computer, and that it is independent of “connectivity towards a cloud or a powerful and resource-hungry processing entity.” But it still offers a “full AI mechanism, like independent learning,” - -It’s “decentralized AI,” says Fraunhofer IMS. "It’s not focused towards big-data processing.” - -Indeed, with these kinds of systems, no connection is actually required for the raw data, just for the post-analytical results, if indeed needed. Swarming can even replace that. Swarming lets sensors talk to one another, sharing relevant information without even getting a host network involved. - -“It is possible to build a network from small and adaptive systems that share tasks among themselves,” Fraunhofer IMS says. - -Other benefits in decentralized neural networks include that they can be more secure than the cloud. Because all processing takes place on the microprocessor, “no sensitive data needs to be transferred,” Fraunhofer IMS explains. - -### Other edge computing research - -The Fraunhofer researchers aren’t the only academics who believe entire networks become redundant with neuristor, brain-like AI chips. Binghamton University and Georgia Tech are working together on similar edge-oriented tech. - -“The idea is we want to have these chips that can do all the functioning in the chip, rather than messages back and forth with some sort of large server,” Binghamton said on its website when [I wrote about the university's work last year][7]. - -One of the advantages of no major communications linking: Not only don't you have to worry about internet resilience, but also that energy is saved creating the link. Energy efficiency is an ambition in the sensor world — replacing batteries is time consuming, expensive, and sometimes, in the case of remote locations, extremely difficult. - -Memory or storage for swaths of raw data awaiting transfer to be processed at a data center, or similar, doesn’t have to be provided either — it’s been processed at the source, so it can be discarded. - -**More about edge networking:** - - * [How edge networking and IoT will reshape data centers][4] - * [Edge computing best practices][8] - * [How edge computing can help secure the IoT][9] - - - -Join the Network World communities on [Facebook][10] and [LinkedIn][11] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3400659/self-learning-sensor-chips-wont-need-networks.html - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/industry_4-0_industrial_iot_smart_factory_automation_by_jiraroj_praditcharoenkul_gettyimages-902668940_2400x1600-100788458-large.jpg -[2]: https://www.ims.fraunhofer.de/en.html -[3]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[4]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html -[5]: https://www.ims.fraunhofer.de/en/Business_Units_and_Core_Competencies/Electronic_Assistance_Systems/News/AIfES-Artificial_Intelligence_for_Embedded_Systems.html -[6]: https://www.ims.fraunhofer.de/en/Business_Units_and_Core_Competencies/Electronic_Assistance_Systems/technologies/Artificial-Intelligence-for-Embedded-Systems-AIfES.html -[7]: https://www.networkworld.com/article/3326557/edge-chips-could-render-some-networks-useless.html -[8]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html -[9]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html -[10]: https://www.facebook.com/NetworkWorld/ -[11]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190606 What to do when yesterday-s technology won-t meet today-s support needs.md b/sources/talk/20190606 What to do when yesterday-s technology won-t meet today-s support needs.md deleted file mode 100644 index 622537f2f9..0000000000 --- a/sources/talk/20190606 What to do when yesterday-s technology won-t meet today-s support needs.md +++ /dev/null @@ -1,53 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What to do when yesterday’s technology won’t meet today’s support needs) -[#]: via: (https://www.networkworld.com/article/3399875/what-to-do-when-yesterday-s-technology-won-t-meet-today-s-support-needs.html) -[#]: author: (Anand Rajaram ) - -What to do when yesterday’s technology won’t meet today’s support needs -====== - -![iStock][1] - -You probably already know that end user technology is exploding and are feeling the effects of it in your support organization every day. Remember when IT sanctioned and standardized every hardware and software instance in the workplace? Those days are long gone. Today, it’s the driving force of productivity that dictates what will or won’t be used – and that can be hard on a support organization. - -Whatever users need to do their jobs better, faster, more efficiently is what you are seeing come into the workplace. So naturally, that’s what comes into your service desk too. Support organizations see all kinds of [devices, applications, systems, and equipment][2], and it’s adding a great deal of complexity and demand to keep up with. In fact, four of the top five factors causing support ticket volumes to rise are attributed to new and current technology. - -To keep up with the steady [rise of tickets][3] and stay out in front of this surge, support organizations need to take a good, hard look at the processes and technologies they use. Yesterday’s methods won’t cut it. The landscape is simply changing too fast. Supporting today’s users and getting them back to work fast requires an expanding set of skills and tools. - -So where do you start with a new technology project? Just because a technology is new or hyped doesn’t mean it’s right for your organization. It’s important to understand your project goals and the experience you really want to create and match your technology choices to those goals. But don’t go it alone. Talk to your teams. Get intimately familiar with how your support organization works today. Understand your customers’ needs at a deep level. And bring the right people to the table to cover: - - * Business problem analysis: What existing business issue are stakeholders unhappy with? - * The impact of that problem: How does that issue justify making a change? - * Process automation analysis: What area(s) can technology help automate? - * Other solutions: Have you considered any other options besides technology? - - - -With these questions answered, you’re ready to entertain your technology options. Put together your “must-haves” in a requirements document and reach out to potential suppliers. During the initial information-gathering stage, assess if the supplier understands your goals and how their technology helps you meet them. To narrow the field, compare solutions side by side against your goals. Select the top two or three for more in-depth product demos before moving into product evaluations. By the time you’re ready for implementation, you have empirical, practical knowledge of how the solution will perform against your business goals. - -The key takeaway is this: Technology for technology’s sake is just technology. But technology that drives business value is a solution. If you want a solution that drives results for your organization and your customers, it’s worth following a strategic selection process to match your goals with the best technology for the job. - -For more insight, check out the [LogMeIn Rescue][4] and HDI webinar “[Technology and the Service Desk: Expanding Mission, Expanding Skills”][5]. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3399875/what-to-do-when-yesterday-s-technology-won-t-meet-today-s-support-needs.html - -作者:[Anand Rajaram][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/06/istock-1019006240-100798168-large.jpg -[2]: https://www.logmeinrescue.com/resources/datasheets/infographic-mobile-support-are-your-employees-getting-what-they-need?utm_source=idg%20media&utm_medium=display&utm_campaign=native&sfdc= -[3]: https://www.logmeinrescue.com/resources/analyst-reports/the-importance-of-remote-support-in-a-shift-left-world?utm_source=idg%20media&utm_medium=display&utm_campaign=native&sfdc= -[4]: https://www.logmeinrescue.com/?utm_source=idg%20media&utm_medium=display&utm_campaign=native&sfdc= -[5]: https://www.brighttalk.com/webcast/8855/312289?utm_source=LogMeIn7&utm_medium=brighttalk&utm_campaign=312289 diff --git a/sources/talk/20190611 6 ways to make enterprise IoT cost effective.md b/sources/talk/20190611 6 ways to make enterprise IoT cost effective.md deleted file mode 100644 index 492262c617..0000000000 --- a/sources/talk/20190611 6 ways to make enterprise IoT cost effective.md +++ /dev/null @@ -1,89 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (6 ways to make enterprise IoT cost effective) -[#]: via: (https://www.networkworld.com/article/3401082/6-ways-to-make-enterprise-iot-cost-effective.html) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -6 ways to make enterprise IoT cost effective -====== -Rob Mesirow, a principal at PwC’s Connected Solutions unit, offers tips for successfully implementing internet of things (IoT) projects without breaking the bank. -![DavidLeshem / Getty][1] - -There’s little question that the internet of things (IoT) holds enormous potential for the enterprise, in everything from asset tracking to compliance. - -But enterprise uses of IoT technology are still evolving, and it’s not yet entirely clear which use cases and practices currently make economic and business sense. So, I was thrilled to trade emails recently with [Rob Mesirow][2], a principal at [PwC’s Connected Solutions][3] unit, about how to make enterprise IoT implementations as cost effective as possible. - -“The IoT isn’t just about technology (hardware, sensors, software, networks, communications, the cloud, analytics, APIs),” Mesirow said, “though tech is obviously essential. It also includes ensuring cybersecurity, managing data governance, upskilling the workforce and creating a receptive workplace culture, building trust in the IoT, developing interoperability, and creating business partnerships and ecosystems—all part of a foundation that’s vital to a successful IoT implementation.” - -**[ Also read:[Enterprise IoT: Companies want solutions in these 4 areas][4] ]** - -Yes, that sounds complicated—and a lot of work for a still-hard-to-quantify return. Fortunately, though, Mesirow offered up some tips on how companies can make their IoT implementations as cost effective as possible. - -### 1\. Don’t wait for better technology - -Mesirow advised against waiting to implement IoT projects until you can deploy emerging technology such as [5G networks][5]. That makes sense, as long as your implementation doesn’t specifically require capabilities available only in the new technology. - -### 2\. Start with the basics, and scale up as needed - -“Companies need to start with the basics—building one app/task at a time—instead of jumping ahead with enterprise-wide implementations and ecosystems,” Mesirow said. - -“There’s no need to start an IoT initiative by tackling a huge, expensive ecosystem. Instead, begin with one manageable use case, and build up and out from there. The IoT can inexpensively automate many everyday tasks to increase effectiveness, employee productivity, and revenue.” - -After you pick the low-hanging fruit, it’s time to become more ambitious. - -“After getting a few successful pilots established, businesses can then scale up as needed, building on the established foundation of business processes, people experience, and technology," Mesirow said, - -### 3\. Make dumb things smart - -Of course, identifying the ripest low-hanging fruit isn’t always easy. - -“Companies need to focus on making dumb things smart, deploying infrastructure that’s not going to break the bank, and providing enterprise customers the opportunity to experience what data intelligence can do for their business,” Mesirow said. “Once they do that, things will take off.” - -### 4\. Leverage lower-cost networks - -“One key to building an IoT inexpensively is to use low-power, low-cost networks (Low-Power Wide-Area Networks (LPWAN)) to provide IoT services, which reduces costs significantly,” Mesirow said. - -Naturally, he mentioned that PwC has three separate platforms with some 80 products that hang off those platforms, which he said cost “a fraction of traditional IoT offerings, with security and privacy built in.” - -Despite the product pitch, though, Mesirow is right to call out the efficiencies involved in using low-cost, low-power networks instead of more expensive existing cellular. - -### 5\. Balance security vs. cost - -Companies need to plan their IoT network with costs vs. security in mind, Mesirow said. “Open-source networks will be less expensive, but there may be security concerns,” he said. - -That’s true, of course, but there may be security concerns in _any_ network, not just open-source solutions. Still, Mesirow’s overall point remains valid: Enterprises need to carefully consider all the trade-offs they’re making in their IoT efforts. - -### 6\. Account for _all_ the value IoT provides - -Finally, Mesirow pointed out that “much of the cost-effectiveness comes from the _value_ the IoT provides,” and its important to consider the return, not just the investment. - -“For example,” Mesirow said, the IoT “increases productivity by enabling the remote monitoring and control of business operations. It saves on energy costs by automatically turning off lights and HVAC when spaces are vacant, and predictive maintenance alerts lead to fewer machine repairs. And geolocation can lead to personalized marketing to customer smartphones, which can increase sales to nearby stores.” - -**[ Now read this:[5 reasons the IoT needs its own networks][6] ]** - -Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3401082/6-ways-to-make-enterprise-iot-cost-effective.html - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/money_financial_salary_growth_currency_by-davidleshem-100787975-large.jpg -[2]: https://twitter.com/robmesirow -[3]: https://digital.pwc.com/content/pwc-digital/en/products/connected-solutions.html -[4]: https://www.networkworld.com/article/3396128/the-state-of-enterprise-iot-companies-want-solutions-for-these-4-areas.html -[5]: https://www.networkworld.com/article/3203489/what-is-5g-how-is-it-better-than-4g.html -[6]: https://www.networkworld.com/article/3284506/5-reasons-the-iot-needs-its-own-networks.html -[7]: https://www.facebook.com/NetworkWorld/ -[8]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190611 The carbon footprints of IT shops that train AI models are huge.md b/sources/talk/20190611 The carbon footprints of IT shops that train AI models are huge.md deleted file mode 100644 index b440b8d65b..0000000000 --- a/sources/talk/20190611 The carbon footprints of IT shops that train AI models are huge.md +++ /dev/null @@ -1,68 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The carbon footprints of IT shops that train AI models are huge) -[#]: via: (https://www.networkworld.com/article/3401919/the-carbon-footprints-of-it-shops-that-train-ai-models-are-huge.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -The carbon footprints of IT shops that train AI models are huge -====== -Artificial intelligence (AI) model training can generate five times more carbon dioxide than a car does in a lifetime, researchers at the University of Massachusetts, Amherst find. -![ipopba / Getty Images][1] - -A new research paper from the University of Massachusetts, Amherst looked at the carbon dioxide (CO2) generated over the course of training several common large artificial intelligence (AI) models and found that the process can generate nearly five times the amount as an average American car over its lifetime plus the process of making the car itself. - -The [paper][2] specifically examined the model training process for natural-language processing (NLP), which is how AI handles natural language interactions. The study found that during the training process, more than 626,000 pounds of carbon dioxide is generated. - -This is significant, since AI training is one IT process that has remained firmly on-premises and not moved to the cloud. Very expensive equipment is needed, as is large volumes of data, so the cloud isn’t right work for most AI training, and the report notes this. Plus, IT shops want to keep that kind of IP in house. So, if you are experimenting with AI, that power bill is going to go up. - -**[ Read also:[How to plan a software-defined data-center network][3] ]** - -While the report used carbon dioxide as a measure, that’s still the product of electricity generation. Training involves the use of the most powerful processors, typically Nvidia GPUs, and they are not known for being low-power draws. And as the paper notes, “model training also incurs a substantial cost to the environment due to the energy required to power this hardware for weeks or months at a time.” - -Training is the most processor-intensive portion of AI. It can take days, weeks, or even months to “learn” what the model needs to know. That means power-hungry Nvidia GPUs running at full utilization for the entire time. In this case, how to handle and process natural language questions rather than broken sentences of keywords like your typical Google search. - -The report said training one model with a neural architecture generated 626,155 pounds of CO2. By contrast, one passenger flying round trip between New York and San Francisco would generate 1,984 pounds of CO2, an average American would generate 11,023 pounds in one year, and a car would generate 126,000 pounds over the course of its lifetime. - -### How the researchers calculated the CO2 amounts - -The researchers used four models in the NLP field that have been responsible for the biggest leaps in performance. They are Transformer, ELMo, BERT, and GPT-2. They trained all of the models on a single Nvidia Titan X GPU, with the exception of ELMo which was trained on three Nvidia GTX 1080 Ti GPUs. Each model was trained for a maximum of one day. - -**[[Learn Java from beginning concepts to advanced design patterns in this comprehensive 12-part course!][4] ]** - -They then used the number of training hours listed in the model’s original papers to calculate the total energy consumed over the complete training process. That number was converted into pounds of carbon dioxide equivalent based on the average energy mix in the U.S. - -The big takeaway is that computational costs start out relatively inexpensive, but they mushroom when additional tuning steps were used to increase the model’s final accuracy. A tuning process known as neural architecture search ([NAS][5]) is the worst offender because it does so much processing. NAS is an algorithm that searches for the best neural network architecture. It is seriously advanced AI and requires the most processing time and power. - -The researchers suggest it would be beneficial to directly compare different models to perform a cost-benefit (accuracy) analysis. - -“To address this, when proposing a model that is meant to be re-trained for downstream use, such as re-training on a new domain or fine-tuning on a new task, authors should report training time and computational resources required, as well as model sensitivity to hyperparameters. This will enable direct comparison across models, allowing subsequent consumers of these models to accurately assess whether the required computational resources,” the authors wrote. - -They also say researchers who are cost-constrained should pool resources and avoid the cloud, as cloud compute time is more expensive. In an example, it said a GPU server with eight Nvidia 1080 Ti GPUs and supporting hardware is available for approximately $20,000. To develop the sample models used in their study, that hardware would cost $145,000, plus electricity to run the models, about half the estimated cost to use on-demand cloud GPUs. - -“Unlike money spent on cloud compute, however, that invested in centralized resources would continue to pay off as resources are shared across many projects. A government-funded academic compute cloud would provide equitable access to all researchers,” they wrote. - -Join the Network World communities on [Facebook][6] and [LinkedIn][7] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3401919/the-carbon-footprints-of-it-shops-that-train-ai-models-are-huge.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/ai-vendor-relationship-management_artificial-intelligence_hand-on-virtual-screen-100795246-large.jpg -[2]: https://arxiv.org/abs/1906.02243 -[3]: https://www.networkworld.com/article/3284352/data-center/how-to-plan-a-software-defined-data-center-network.html -[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fjava -[5]: https://www.oreilly.com/ideas/what-is-neural-architecture-search -[6]: https://www.facebook.com/NetworkWorld/ -[7]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190612 IoT security vs. privacy- Which is a bigger issue.md b/sources/talk/20190612 IoT security vs. privacy- Which is a bigger issue.md deleted file mode 100644 index 2f06f6afc1..0000000000 --- a/sources/talk/20190612 IoT security vs. privacy- Which is a bigger issue.md +++ /dev/null @@ -1,95 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (IoT security vs. privacy: Which is a bigger issue?) -[#]: via: (https://www.networkworld.com/article/3401522/iot-security-vs-privacy-which-is-a-bigger-issue.html) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -IoT security vs. privacy: Which is a bigger issue? -====== -When it comes to the internet of things (IoT), security has long been a key concern. But privacy issues could be an even bigger threat. -![Ring][1] - -If you follow the news surrounding the internet of things (IoT), you know that security issues have long been a key concern for IoT consumers, enterprises, and vendors. Those issues are very real, but I’m becoming increasingly convinced that related but fundamentally different _privacy_ vulnerabilities may well be an even bigger threat to the success of the IoT. - -In June alone, we’ve seen a flood of IoT privacy issues inundate the news cycle, and observers are increasingly sounding the alarm that IoT users should be paying attention to what happens to the data collected by IoT devices. - -**[ Also read:[It’s time for the IoT to 'optimize for trust'][2] and [A corporate guide to addressing IoT security][2] ]** - -Predictably, most of the teeth-gnashing has come on the consumer side, but that doesn’t mean enterprises users are immune to the issue. One the one hand, just like consumers, companies are vulnerable to their proprietary information being improperly shared and misused. More immediately, companies may face backlash from their own customers if they are seen as not properly guarding the data they collect via the IoT. Too often, in fact, enterprises shoot themselves in the foot on privacy issues, with practices that range from tone-deaf to exploitative to downright illegal—leading almost [two-thirds (63%) of consumers to describe IoT data collection as “creepy,”][3] while more than half (53%) “distrust connected devices to protect their privacy and handle information in a responsible manner.” - -### Ring becoming the poster child for IoT privacy issues - -As a case in point, let’s look at the case of [Ring, the IoT doorbell company now owned by Amazon][4]. Ring is [reportedly working with police departments to build a video surveillance network in residential neighborhoods][5]. Police in more than 50 cities and towns across the country are apparently offering free or discounted Ring doorbells, and sometimes requiring the recipients to share footage for use in investigations. (While [Ring touts the security benefits][6] of working with law enforcement, it has asked police departments to end the practice of _requiring_ users to hand over footage, as it appears to violate the devices’ terms of service.) - -Many privacy advocates are troubled by this degree of cooperation between police and Ring, but that’s only part of the problem. Last year, for example, [Ring workers in Ukraine reportedly watched customer feeds][7]. Amazingly, though, even that only scratches the surface of the privacy flaps surrounding Ring. - -### Guilty by video? - -According to [Motherboard][8], “Ring is using video captured by its doorbell cameras in Facebook advertisements that ask users to identify and call the cops on a woman whom local police say is a suspected thief.” While the police are apparently appreciative of the “additional eyes that may see this woman and recognize her,” the ad calls the woman a thief even though she has not been charged with a crime, much less convicted! - -Ring may be today’s poster child for IoT privacy issues, but IoT privacy complaints are widespread. In many cases, it comes down to what IoT users—or others nearby—are getting in return for giving up their privacy. According to the [Guardian][9], for example, Google’s Sidewalk Labs smart city project is little more than “surveillance capitalism.” And while car owners may get a discount on auto insurance in return for sharing their driving data, that relationship is hardly set in stone. It may not be long before drivers have to give up their data just to get insurance at all. - -**[[Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][10] ]** - -And as the recent [data breach at the U.S. Customs and Border Protection][11] once again demonstrates, private data is “[a genie without a bottle][12].” No matter what legal or technical protections are put in place, the data may always be revealed or used in unforeseen ways. Heck, when you put it all together, it’s enough to make you wonder [whether doorbells really need to be smart][13] at all? - -**Read more about IoT:** - - * [Google’s biggest, craziest ‘moonshot’ yet][14] - * [What is the IoT? How the internet of things works][15] - * [What is edge computing and how it’s changing the network][16] - * [Most powerful internet of things companies][17] - * [10 Hot IoT startups to watch][18] - * [The 6 ways to make money in IoT][19] - * [What is digital twin technology? [and why it matters]][20] - * [Blockchain, service-centric networking key to IoT success][21] - * [Getting grounded in IoT networking and security][22] - * [Building IoT-ready networks must become a priority][23] - * [What is the Industrial IoT? [And why the stakes are so high]][24] - - - -Join the Network World communities on [Facebook][25] and [LinkedIn][26] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3401522/iot-security-vs-privacy-which-is-a-bigger-issue.html - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/ringvideodoorbellpro-100794084-large.jpg -[2]: https://www.networkworld.com/article/3269165/internet-of-things/a-corporate-guide-to-addressing-iot-security-concerns.html -[3]: https://www.cpomagazine.com/data-privacy/consumers-still-concerned-about-iot-security-and-privacy-issues/ -[4]: https://www.cnbc.com/2018/02/27/amazon-buys-ring-a-former-shark-tank-reject.html -[5]: https://www.cnet.com/features/amazons-helping-police-build-a-surveillance-network-with-ring-doorbells/ -[6]: https://blog.ring.com/2019/02/14/how-rings-neighbors-creates-safer-more-connected-communities/ -[7]: https://www.theinformation.com/go/b7668a689a -[8]: https://www.vice.com/en_us/article/pajm5z/amazon-home-surveillance-company-ring-law-enforcement-advertisements -[9]: https://www.theguardian.com/cities/2019/jun/06/toronto-smart-city-google-project-privacy-concerns -[10]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr -[11]: https://www.washingtonpost.com/technology/2019/06/10/us-customs-border-protection-says-photos-travelers-into-out-country-were-recently-taken-data-breach/?utm_term=.0f3a38aa40ca -[12]: https://smartbear.com/blog/test-and-monitor/data-scientists-are-sexy-and-7-more-surprises-from/ -[13]: https://slate.com/tag/should-this-thing-be-smart -[14]: https://www.networkworld.com/article/3058036/google-s-biggest-craziest-moonshot-yet.html -[15]: https://www.networkworld.com/article/3207535/internet-of-things/what-is-the-iot-how-the-internet-of-things-works.html -[16]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[17]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[18]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[19]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[20]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[21]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[22]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[23]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[24]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[25]: https://www.facebook.com/NetworkWorld/ -[26]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190612 Software Defined Perimeter (SDP)- Creating a new network perimeter.md b/sources/talk/20190612 Software Defined Perimeter (SDP)- Creating a new network perimeter.md deleted file mode 100644 index 88a540e875..0000000000 --- a/sources/talk/20190612 Software Defined Perimeter (SDP)- Creating a new network perimeter.md +++ /dev/null @@ -1,121 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Software Defined Perimeter (SDP): Creating a new network perimeter) -[#]: via: (https://www.networkworld.com/article/3402258/software-defined-perimeter-sdp-creating-a-new-network-perimeter.html) -[#]: author: (Matt Conran https://www.networkworld.com/author/Matt-Conran/) - -Software Defined Perimeter (SDP): Creating a new network perimeter -====== -Considering the way networks work today and the change in traffic patterns; both internal and to the cloud, this limits the effect of the fixed perimeter. -![monsitj / Getty Images][1] - -Networks were initially designed to create internal segments that were separated from the external world by using a fixed perimeter. The internal network was deemed trustworthy, whereas the external was considered hostile. However, this is still the foundation for most networking professionals even though a lot has changed since the inception of the design. - -More often than not the fixed perimeter consists of a number of network and security appliances, thereby creating a service chained stack, resulting in appliance sprawl. Typically, the appliances that a user may need to pass to get to the internal LAN may vary. But generally, the stack would consist of global load balancers, external firewall, DDoS appliance, VPN concentrator, internal firewall and eventually LAN segments. - -The perimeter approach based its design on visibility and accessibility. If an entity external to the network can’t see an internal resource, then access cannot be gained. As a result, external entities were blocked from coming in, yet internal entities were permitted to passage out. However, it worked only to a certain degree. Realistically, the fixed network perimeter will always be breachable; it's just a matter of time. Someone with enough skill will eventually get through. - -**[ Related:[MPLS explained – What you need to know about multi-protocol label switching][2]** - -### Environmental changes – the cloud and mobile workforce - -Considering the way networks work today and the change in traffic patterns; both internal and to the cloud, this limits the effect of the fixed perimeter. Nowadays, we have a very fluid network perimeter with many points of entry. - -Imagine a castle with a portcullis that was used to gain access. To gain entry into the portcullis was easy as we just needed to pass one guard. There was only one way in and one way out. But today, in this digital world, we have so many small doors and ways to enter, all of which need to be individually protected. - -This boils down to the introduction of cloud-based application services and changing the location of the perimeter. Therefore, the existing networking equipment used for the perimeter is topologically ill-located. Nowadays, everything that is important is outside the perimeter, such as, remote access workers, SaaS, IaaS and PaaS-based applications. - -Users require access to the resources in various cloud services regardless of where the resources are located, resulting in complex-to-control multi-cloud environments. Objectively, the users do not and should not care where the applications are located. They just require access to the application. Also, the increased use of mobile workforce that demands anytime and anywhere access from a variety of devices has challenged the enterprises to support this dynamic workforce. - -There is also an increasing number of devices, such as, BYOD, on-site contractors, and partners that will continue to grow internal to the network. This ultimately leads to a world of over-connected networks. - -### Over-connected networks - -Over-connected networks result in complex configurations of network appliances. This results in large and complex policies without any context. - -They provide a level of coarse-grained access to a variety of services where the IP address does not correspond to the actual user. Traditional appliances that use static configurations to limit the incoming and outgoing traffic are commonly based on information in the IP packet and the port number. - -Essentially, there is no notion of policy and explanation of why a given source IP address is on the list. This approach fails to take into consideration any notion of trust and dynamically adjust access in relation to the device, users and application request events. - -### Problems with IP addresses - -Back in the early 1990s, RFC 1597 declared three IP ranges reserved for private use: 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. If an end host was configured with one of these addresses, it was considered more secure. However, this assumption of trust was shattered with the passage of time and it still haunts us today. - -Network Address Translation (NAT) also changed things to a great extent. NAT allowed internal trusted hosts to communicate directly with the external untrusted hosts. However, since Transmission Control Protocol (TCP) is bidirectional, it allows the data to be injected by the external hosts while connecting back to the internal hosts. - -Also, there is no contextual information regarding the IP addresses as the sole purpose revolved around connectivity. If you have the IP address of someone, you can connect to them. The authentication was handled higher up in the stack. - -Not only do user’s IP addresses change regularly, but there’s also not a one-to-one correspondence between the users and IP addresses. Anyone can communicate from any IP address they please and also insert themselves between you and the trusted resource. - -Have you ever heard of the 20-year old computer that responds to an internet control message protocol (ICMP) request, yet no one knows where it is? But this would not exist on a zero trust network as the network is dark until the administrator turns the lights on with a whitelist policy rule set. This is contrary to the legacy black policy rule set. You can find more information on zero trust in my course: [Zero Trust Networking: The Big Picture][3]. - -Therefore, we can’t just rely on the IP addresses and expect them to do much more other than connect. As a result, we have to move away from the IP addresses and network location as the proxy for access trust. The network location can longer be the driver of network access levels. It is not fully equipped to decide the trust of a device, user or application. - -### Visibility – a major gap - -When we analyze networking and its flaws, visibility is a major gap in today’s hybrid environments. By and large, enterprise networks are complex beasts. More than often networking pros do not have accurate data or insights into who or what is accessing the network resource. - -I.T does not have the visibility in place to detect, for example, insecure devices, unauthorized users and potentially harmful connections that could propagate malware or perform data exfiltration. - -Also, once you know how network elements connect, how do you ensure that they don’t reconnect through a broader definition of connectivity? For this, you need contextual visibility. You need full visibility into the network to see who, what, when, and how they are connecting with the device. - -### What’s the workaround? - -A new approach is needed that enables the application owners to protect the infrastructure located in a public or private cloud and on-premise data center. This new network architecture is known as [software-defined perimeter][4] (SDP). Back in 2013, Cloud Security Alliance (CSA) launched the SDP initiative, a project designed to develop the architecture for creating more robust networks. - -The principles behind SDPs are not entirely new. Organizations within the DoD and Intelligence Communities (IC) have implemented a similar network architecture that is based on authentication and authorization prior to network access. - -Typically, every internal resource is hidden behind an appliance. And a user must authenticate before visibility of the authorized services is made available and access is granted. - -### Applying the zero trust framework - -SDP is an extension to [zero trust][5] which removes the implicit trust from the network. The concept of SDP started with Google’s BeyondCorp, which is the general direction that the industry is heading to right now. - -Google’s BeyondCorp puts forward the idea that the corporate network does not have any meaning. The trust regarding accessing an application is set by a static network perimeter containing a central appliance. This appliance permits the inbound and outbound access based on a very coarse policy. - -However, access to the application should be based on other parameters such as who the user is, the judgment of the security stance of the device, followed by some continuous assessment of the session. Rationally, only then should access be permitted. - -Let’s face it, the assumption that internal traffic can be trusted is flawed and zero trust assumes that all hosts internal to the network are internet facing, thereby hostile. - -### What is software-defined perimeter (SDP)? - -The SDP aims to deploy perimeter functionality for dynamically provisioned perimeters meant for clouds, hybrid environments, and on-premise data center infrastructures. There is often a dynamic tunnel that automatically gets created during the session. That is a one-to-one mapping between the requesting entity and the trusted resource. The important point to note here is that perimeters are formed not solely to obey a fixed location already design by the network team. - -SDP relies on two major pillars and these are the authentication and authorization stages. SDPs require endpoints to authenticate and be authorized first before obtaining network access to the protected entities. Then, encrypted connections are created in real-time between the requesting systems and application infrastructure. - -Authenticating and authorizing the users and their devices before even allowing a single packet to reach the target service, enforces what's known as least privilege at the network layer. Essentially, the concept of least privilege is for an entity to be granted only the minimum privileges that it needs to get its work done. Within a zero trust network, privilege is more dynamic than it would be in traditional networks since it uses many different attributes of activity to determine the trust score. - -### The dark network - -Connectivity is based on a need-to-know model. Under this model, no DNS information, internal IP addresses or visible ports of internal network infrastructure are transmitted. This is the reason why SDP assets are considered as “dark”. As a result, SDP isolates any concerns about the network and application. The applications and users are considered abstract, be it on-premise or in the cloud, which becomes irrelevant to the assigned policy. - -Access is granted directly between the users and their devices to the application and resource, regardless of the underlying network infrastructure. There simply is no concept of inside and outside of the network. This ultimately removes the network location point as a position of advantage and also eliminates the excessive implicit trust that IP addresses offer. - -**This article is published as part of the IDG Contributor Network.[Want to Join?][6]** - -Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3402258/software-defined-perimeter-sdp-creating-a-new-network-perimeter.html - -作者:[Matt Conran][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Matt-Conran/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/03/sdn_software-defined-network_architecture-100791938-large.jpg -[2]: https://www.networkworld.com/article/2297171/sd-wan/network-security-mpls-explained.html -[3]: http://pluralsight.com/courses/zero-trust-networking-big-picture -[4]: https://network-insight.net/2018/09/software-defined-perimeter-zero-trust/ -[5]: https://network-insight.net/2018/10/zero-trust-networking-ztn-want-ghosted/ -[6]: /contributor-network/signup.html -[7]: https://www.facebook.com/NetworkWorld/ -[8]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190612 When to use 5G, when to use Wi-Fi 6.md b/sources/talk/20190612 When to use 5G, when to use Wi-Fi 6.md deleted file mode 100644 index a2271052c9..0000000000 --- a/sources/talk/20190612 When to use 5G, when to use Wi-Fi 6.md +++ /dev/null @@ -1,83 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (When to use 5G, when to use Wi-Fi 6) -[#]: via: (https://www.networkworld.com/article/3402316/when-to-use-5g-when-to-use-wi-fi-6.html) -[#]: author: (Lee Doyle ) - -When to use 5G, when to use Wi-Fi 6 -====== -5G is a cellular service, and Wi-Fi 6 is a short-range wireless access technology, and each has attributes that make them useful in specific enterprise roles. -![Thinkstock][1] - -We have seen hype about whether [5G][2] cellular or [Wi-Fi 6][3] will win in the enterprise, but the reality is that the two are largely complementary with an overlap for some use cases, which will make for an interesting competitive environment through the early 2020s. - -### The potential for 5G in enterprises - -The promise of 5G for enterprise users is higher speed connectivity with lower latency. Cellular technology uses licensed spectrum which largely eliminates potential interference that may occur with unlicensed Wi-Fi spectrum. Like current 4G LTE technologies, 5G can be supplied by cellular wireless carriers or built as a private network . - -The architecture for 5G requires many more radio access points and can suffer from poor or no connectivity indoors. So, the typical organization needs to assess its [current 4G and potential 5G service][4] for its PCs, routers and other devices. Deploying indoor microcells, repeaters and distributed antennas can help solve indoor 5G service issues. As with 4G, the best enterprise 5G use case is for truly mobile connectivity such as public safety vehicles and in non-carpeted environments like mining, oil and gas extraction, transportation, farming and some manufacturing. - -In addition to broad mobility, 5G offers advantages in terms of authentication while roaming and speed of deployment as might be needed to provide WAN connectivity to a pop-up office or retail site. 5G will have the capacity to offload traffic in cases of data congestion such as live video. As 5G standards mature, the technology will improve its options for low-power IoT connectivity. - -5G will gradually roll out over the next four to five years starting in large cities and specific geographies; 4G technology will remain prevalent for a number of years. Enterprise users will need new devices, dongles and routers to connect to 5G services. For example, Apple iPhones are not expected to support 5G until 2020, and IoT devices will need specific cellular compatibility to connect to 5G. - -Doyle Research expects the 1Gbps and higher bandwidth promised by 5G will have a significant impact on the SD-WAN market. 4G LTE already enables cellular services to become a primary WAN link. 5G is likely to be cost competitive or cheaper than many wired WAN options such as MPLS or the internet. 5G gives enterprise WAN managers more options to provide increased bandwidth to their branch sites and remote users – potentially displacing MPLS over time. - -### The potential for Wi-Fi 6 in enterprises - -Wi-Fi is nearly ubiquitous for connecting mobile laptops, tablets and other devices to enterprise networks. Wi-Fi 6 (802.11ax) is the latest version of Wi-Fi and brings the promise of increased speed, low latency, improved aggregate bandwidth and advanced traffic management. While it has some similarities with 5G (both are based on orthogonal frequency division multiple access), Wi-Fi 6 is less prone to interference, requires less power (which prolongs device battery life) and has improved spectral efficiency. - -**[[Take this mobile device management course from PluralSight and learn how to secure devices in your company without degrading the user experience.][5] ]** - -As is typical for Wi-Fi, early [vendor-specific versions of Wi-Fi 6][6] are currently available from many manufacturers. The Wi-Fi alliance plans for certification of Wi-Fi 6-standard gear in 2020. Most enterprises will upgrade to Wi-Fi 6 along standard access-point life cycles of three years or so unless they have specific performance/latency requirements that prompt an upgrade sooner. - -Wi-Fi access points continue to be subject to interference, and it can be challenging to design and site APs to provide appropriate coverage. Enterprise LAN managers will continue to need vendor-supplied tools and partners to configure optimal Wi-Fi coverage for their organizations. Wi-Fi 6 solutions must be integrated with wired campus infrastructure. Wi-Fi suppliers need to do a better job at providing unified network management across wireless and wired solutions in the enterprise. - -### Need for wired backhaul - -For both technologies, wireless is combined with wired-network infrastructure to deliver high-speed communications end-to-end. In the enterprise, Wi-Fi is typically paired with wired Ethernet switches for campus and larger branches. Some devices are connected via cable to the switch, others via Wi-Fi – and laptops may use both methods. Wi-Fi access points are connected via Ethernet inside the enterprise and to the WAN or internet by fiber connections. - -The architecture for 5G makes extensive use of fiber optics to connect the distributed radio access network back to the core of the 5G network. Fiber is typically required to provide the high bandwidth needed to connect 5G endpoints to SaaS-based applications, and to provide live video and high-speed internet access. Private 5G networks will also have to meet high-speed wired-connectivity requirements. - -### Handoff issues - -Enterprise IT managers need to be concerned with handoff challenges as phones switch between 5G and Wi-Fi 6. These issues can affect performance and user satisfaction. Several groups are working towards standards to promote better interoperability between Wi-Fi 6 and 5G. As the architectures of Wi-Fi 6 align with 5G, the experience of moving between cellular and Wi-Fi networks should become more seamless. - -### 5G vs Wi-Fi 6 depends on locations, applications and devices - -Wi-Fi 6 and 5G are competitive with each other for specific situations in the enterprise environment that depend on location, application and device type. IT managers should carefully evaluate their current and emerging connectivity requirements. Wi-Fi will continue to dominate indoor environments and cellular wins for broad outdoor coverage. - -Some of the overlap cases occur in stadiums, hospitality and other large event spaces with many users competing for bandwidth. Government applications, including aspect of smart cities, can be applicable to both Wi-Fi and cellular. Health care facilities have many distributed medical devices and users that need connectivity. Large distributed manufacturing environments share similar characteristics. The emerging IoT deployments are perhaps the most interesting “competitive” environment with many overlapping use cases. - -### Recommendations for IT Leaders - -While the wireless technologies enabling them are converging, Wi-Fi 6 and 5G are fundamentally distinct networks – both of which have their role in enterprise connectivity. Enterprise IT leaders should focus on how Wi-Fi and cellular can complement each other, with Wi-Fi continuing as the in-building technology to connect PCs and laptops, offload phone and tablet data, and for some IoT connectivity. - -4G LTE moving to 5G will remain the truly mobile technology for phone and tablet connectivity, an option (via dongle) for PC connections, and increasingly popular for connecting some IoT devices. 5G WAN links will increasingly become standard as a backup for improved SD-WAN reliability and as primary links for remote offices. - -Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3402316/when-to-use-5g-when-to-use-wi-fi-6.html - -作者:[Lee Doyle][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2017/07/wi-fi_wireless_communication_network_abstract_thinkstock_610127984_1200x800-100730107-large.jpg -[2]: https://www.networkworld.com/article/3203489/what-is-5g-how-is-it-better-than-4g.html -[3]: https://www.networkworld.com/article/3215907/why-80211ax-is-the-next-big-thing-in-wi-fi.html -[4]: https://www.networkworld.com/article/3330603/5g-versus-4g-how-speed-latency-and-application-support-differ.html -[5]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture -[6]: https://www.networkworld.com/article/3309439/80211ax-preview-access-points-and-routers-that-support-the-wi-fi-6-protocol-on-tap.html -[7]: https://www.facebook.com/NetworkWorld/ -[8]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190613 Data centers should sell spare UPS capacity to the grid.md b/sources/talk/20190613 Data centers should sell spare UPS capacity to the grid.md deleted file mode 100644 index 69b4356661..0000000000 --- a/sources/talk/20190613 Data centers should sell spare UPS capacity to the grid.md +++ /dev/null @@ -1,59 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Data centers should sell spare UPS capacity to the grid) -[#]: via: (https://www.networkworld.com/article/3402039/data-centers-should-sell-spare-ups-capacity-to-the-grid.html) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Data centers should sell spare UPS capacity to the grid -====== -Distributed Energy is gaining traction, providing an opportunity for data centers to sell excess power in data center UPS batteries to the grid. -![Getty Images][1] - -The energy storage capacity in uninterruptable power supply (UPS) batteries, languishing often dormant in data centers, could provide new revenue streams for those data centers, says Eaton, a major electrical power management company. - -Excess, grid-generated power, created during times of low demand, should be stored on the now-proliferating lithium-backup power systems strewn worldwide in data centers, Eaton says. Then, using an algorithm tied to grid-demand, electricity should be withdrawn as necessary for grid use. It would then be slid back onto the backup batteries when not needed. - -**[ Read also:[How server disaggregation can boost data center efficiency][2] | Get regularly scheduled insights: [Sign up for Network World newsletters][3] ]** - -The concept is called Distributed Energy and has been gaining traction in part because electrical generation is changing—emerging green power, such as wind and solar, being used now at the grid-level have considerations that differ from the now-retiring, fossil-fuel power generation. You can generate solar only in daylight, yet much demand takes place on dark evenings, for example. - -Coal, gas, and oil deliveries have always been, to a great extent, pre-planned, just-in-time, and used for electrical generation in real time. Nowadays, though, fluctuations between supply, storage, and demand are kicking in. Electricity storage on the grid is required. - -Eaton says that by piggy-backing on existing power banks, electricity distribution could be evened out better. The utilities would deliver power more efficiently, despite the peaks and troughs in demand—with the data center UPS, in effect, acting like a quasi-grid-power storage battery bank, or virtual power plant. - -The objective of this UPS use case, called EnergyAware, is to regulate frequency in the grid. That’s related to the tolerances needed to make the grid work—the cycles per second, or hertz, inherent in electrical current can’t deviate too much. Abnormalities happen if there’s a suddent spike in demand but no power on hand to supply the surge. - -### How the Distributed Energy concept works - -The distributed energy resource (DER), which can be added to any existing lithium-ion battery bank, in any building, allows for the consumption of energy, or the distribution of it, based on a Frequency Regulation grid-demand algorithm. It charges or discharges the backup battery, connected to the grid, thus balancing the grid frequency. - -Often, not much power will need to be removed, just “micro-bursts of energy,” explains Sean James, director of Energy Research at Microsoft, in an Eaton-published promotional video. Microsoft Innovation Center in Virginia has been working with Eaton on the project. Those bursts are enough to get the frequency tolerances back on track, but the UPS still functions as designed. - -Eaton says data centers should start participating in energy markets. That could mean bidding, as a producer of power, to those who need to buy it—the electricity market, also known as the grid. Data centers could conceivably even switch on generators to operate the data halls if the price for its battery-stored power was particularly lucrative at certain times. - -“A data center in the future wouldn’t just be a huge load on the grid,” James says. “In the future, you don’t have a data center or a power plant. It’s something in the middle. A data plant,” he says on the Eaton [website][4]. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3402039/data-centers-should-sell-spare-ups-capacity-to-the-grid.html - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/10/business_continuity_server-100777720-large.jpg -[2]: https://www.networkworld.com/article/3266624/how-server-disaggregation-could-make-cloud-datacenters-more-efficient.html -[3]: https://www.networkworld.com/newsletters/signup.html -[4]: https://www.eaton.com/us/en-us/products/backup-power-ups-surge-it-power-distribution/backup-power-ups/dual-purpose-ups-technology.html -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190617 5 transferable higher-education skills.md b/sources/talk/20190617 5 transferable higher-education skills.md deleted file mode 100644 index db0f584aaf..0000000000 --- a/sources/talk/20190617 5 transferable higher-education skills.md +++ /dev/null @@ -1,64 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (5 transferable higher-education skills) -[#]: via: (https://opensource.com/article/19/6/5-transferable-higher-education-skills) -[#]: author: (Stephon Brown https://opensource.com/users/stephb) - -5 transferable higher-education skills -====== -If you're moving from the Ivory Tower to the Matrix, you already have -the foundation for success in the developer role. -![Two hands holding a resume with computer, clock, and desk chair ][1] - -My transition from a higher-education professional into the tech realm was comparable to moving from a pond into an ocean. There was so much to learn, and after learning, there was still so much more to learn! - -Rather than going down the rabbit hole and being overwhelmed by what I did not know, in the last two to three months, I have been able to take comfort in the realization that I was not entirely out of my element as a developer. The skills I acquired during my six years as a university professional gave me the foundation to be successful in the developer role. - -These skills are transferable in any direction you plan to go within or outside tech, and it's valuable to reflect on how they apply to your new position. - -### 1\. Composition and documentation - -Higher education is replete with opportunities to develop skills related to composition and communication. In most cases, clear writing and communication are mandatory requirements for university administrative and teaching positions. Although you may not yet be well-versed in deep technical concepts, learning documentation and writing your progress may be two of the strongest skills you bring as a former higher education administrator. All of those "In response to…" emails will finally come in handy when describing the inner workings of a class or leaving succinct comments for other developers to follow what you have implemented. - -### 2\. Problem-solving and critical thinking - -Whether you've been an adviser who sits with students and painstakingly develops class schedules for graduation or a finance buff who balances government funds, you will not leave critical thinking behind as you transition into a developer role. Although your critical thinking may have seemed specialized for your work, the skill of turning problems into opportunities is not lost when contributing to code. The experience gained while spending long days and nights revising recruitment strategies will be necessary when composing algorithms and creative ways of delivering data. Continue to foster a passion for solving problems, and you will not have any trouble becoming an efficient and skillful developer. - -### 3\. Communication - -Though it may seem to overlap with writing (above), communication spans verbal and written disciplines. When you're interacting with clients and leadership, you may have a leg up over your peers because of your higher-education experience. Being approachable and understanding how to manage interactions are skills that some software practitioners may not have fostered to an impactful level. Although you will experience days of staring at a screen and banging your head against the keyboard, you can rest well in knowing you can describe technical concepts and interact with a wide range of audiences, from clients to peers. - -### 4\. Leadership - -Sitting on that panel; planning that event; leading that workshop. All of those experiences provide you with the grounding to plan and lead smaller projects as a new developer. Leadership is not limited to heading up large and small teams; its essence lies in taking initiative. This can be volunteering to do research on a new feature or do more extensive unit tests for your code. However you use it, your foundation as an educator will allow you to go further in technology development and maintenance. - -### 5\. Research - -You can Google with the best of them. Being able to clearly truncate your query into the idea you are searching for is characteristic of a higher-education professional. Most administrator or educator jobs focus on solving problems in a defined process for qualitative, quantitative, or mixed results; therefore, cultivating your scientific mind is valuable when providing software solutions. Your research skills also open opportunities for branching into data science and machine learning. - -### Bonus: Collaboration - -Being able to reach across various offices and fields for event planning and program implementation fit well within team collaboration—both within your new team and across development teams. This may leak into the project management realm, but being able to plan and divide work between teams and establish accountability will allow you as a new developer to understand the software development lifecycle process a little more intimately because of your past related experience. - -### Summary - -As a developer jumping head-first into technology after years of walking students through the process of navigating higher education, [imposter syndrome][2] has been a constant fear since moving into technology. However, I have been able to take heart in knowing my experience as an educator and an administrator has not gone in vain. If you are like me, be encouraged in knowing that these transferable skills, some of which fall into the soft-skills and other categories, will continue to benefit you as a developer and a professional. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/5-transferable-higher-education-skills - -作者:[Stephon Brown][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/stephb -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/resume_career_document_general.png?itok=JEaFL2XI (Two hands holding a resume with computer, clock, and desk chair ) -[2]: https://en.wikipedia.org/wiki/Impostor_syndrome diff --git a/sources/talk/20190618 17 predictions about 5G networks and devices.md b/sources/talk/20190618 17 predictions about 5G networks and devices.md deleted file mode 100644 index d8833f9887..0000000000 --- a/sources/talk/20190618 17 predictions about 5G networks and devices.md +++ /dev/null @@ -1,82 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (17 predictions about 5G networks and devices) -[#]: via: (https://www.networkworld.com/article/3403358/17-predictions-about-5g-networks-and-devices.html) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -17 predictions about 5G networks and devices -====== -Not surprisingly, the new Ericsson Mobility Report is bullish on the potential of 5G technology. Here’s a quick look at the most important numbers. -![Vertigo3D / Getty Images][1] - -_“As market after market switches on 5G, we are at a truly momentous point in time. No previous generation of mobile technology has had the potential to drive economic growth to the extent that 5G promises. It goes beyond connecting people to fully realizing the Internet of Things (IoT) and the Fourth Industrial Revolution.”_ —The opening paragraph of the [June 2019 Ericsson Mobility Report][2] - -Almost every significant technology advancement now goes through what [Gartner calls the “hype cycle.”][3] These days, Everyone expects new technologies to be met with gushing optimism and dreamy visions of how it’s going to change the world in the blink of an eye. After a while, we all come to expect the vendors and the press to go overboard with excitement, at least until reality and disappointment set in when things don’t pan out exactly as expected. - -**[ Also read:[The time of 5G is almost here][4] ]** - -Even with all that in mind, though, Ericsson’s whole-hearted embrace of 5G in its Internet Mobility Report is impressive. The optimism is backed up by lots of numbers, but they can be hard to tease out of the 36-document. So, let’s recap some of the most important top-line predictions (with my comments at the end). - -### Worldwide 5G growth projections - - 1. “More than 10 million 5G subscriptions are projected worldwide by the end of 2019.” - 2. “[We] now expect there to be 1.9 billion 5G subscriptions for enhanced mobile broadband by the end of 2024. This will account for over 20 percent of all mobile subscriptions at that time. The peak of LTE subscriptions is projected for 2022, at around 5.3 billion subscriptions, with the number declining slowly thereafter.” - 3. “In 2024, 5G networks will carry 35 percent of mobile data traffic globally.” - 4. “5G can cover up to 65 percent of the world’s population in 2024.” - 5. ”NB-IoT and Cat-M technologies will account for close to 45 percent of cellular IoT connections in 2024.” - 6. “By the end of 2024, nearly 35 percent of cellular IoT connections will be Broadband IoT, with 4G connecting the majority.” But 5G connections will support more advanced use cases. - 7. “Despite challenging 5G timelines, device suppliers are expected to be ready with different band and architecture support in a range of devices during 2019.” - 8. “Spectrum sharing … chipsets are currently in development and are anticipated to be in 5G commercial devices in late 2019." - 9. “[VoLTE][5] is the foundation for enabling voice and communication services on 5G devices. Subscriptions are expected to reach 2.1 billion by the end of 2019. … The number of VoLTE subscriptions is projected to reach 5.9 billion by the end of 2024, accounting for more than 85 percent of combined LTE and 5G subscriptions.” - - - -![][6] - -### Regional 5G projections - - 1. “In North America, … service providers have already launched commercial 5G services, both for fixed wireless access and mobile. … By the end of 2024, we anticipate close to 270 million 5G subscriptions in the region, accounting for more than 60 percent of mobile subscriptions.” - 2. “In Western Europe … The momentum for 5G in the region was highlighted by the first commercial launch in April. By the end of 2024, 5G is expected to account for around 40 percent of mobile subscriptions. - 3. In Central and Eastern Europe, … The first 5G subscriptions are expected in 2019, and will make up 15 percent of subscriptions in 2024.” - 4. “In North East Asia, … the region’s 5G subscription penetration is projected to reach 47 percent [by the end of 2024]. - 5. “[In India,] 5G subscriptions are expected to become available in 2022 and will represent 6 percent of mobile subscriptions at the end of 2024.” - 6. “In the Middle East and North Africa, we anticipate commercial 5G deployments with leading communications service providers during 2019, and significant volumes in 2021. … Around 60 million 5G subscriptions are forecast for the end of 2024, representing 3 percent of total mobile subscriptions.” - 7. “Initial 5G commercial devices are expected in the [South East Asia and Oceania] region during the first half of 2019. By the end of 2024, it is anticipated that almost 12 percent of subscriptions in the region will be for 5G.]” - 8. “In Latin America … the first 5G deployments will be possible in the 3.5GHz band during 2019. Argentina, Brazil, Chile, Colombia, and Mexico are anticipated to be the first countries in the region to deploy 5G, with increased subscription uptake forecast from 2020. By the end of 2024, 5G is set to make up 7 percent of mobile subscriptions.” - - - -### Is 5G really so inevitable? - -Considered individually, these predictions all seem perfectly reasonable. Heck, 10 million 5G subscriptions is only a drop in the global bucket. And rumors are already flying that Apple’s next round of iPhones will include 5G capability. Also, 2024 is still five years in the future, so why wouldn’t the faster connections drive impressive traffic stats? Similarly, North America and North East Asia will experience the fastest 5G penetration. - -But when you look at them all together, these numbers project a sense of 5G inevitability that could well be premature. It will take a _lot_ of spending, by a lot of different parties—carriers, chip makers, equipment vendors, phone manufacturers, and consumers—to make this kind of growth a reality. - -I’m not saying 5G won’t take over the world. I’m just saying that when so many things have to happen in a relatively short time, there are a lot of opportunities for the train to jump the tracks. Don’t be surprised if it takes longer than expected for 5G to turn into the worldwide default standard Ericsson—and everyone else—seems to think it will inevitably become. - -Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3403358/17-predictions-about-5g-networks-and-devices.html - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/5g_wireless_technology_network_connections_by_credit-vertigo3d_gettyimages-1043302218_3x2-100787550-large.jpg -[2]: https://www.ericsson.com/assets/local/mobility-report/documents/2019/ericsson-mobility-report-june-2019.pdf -[3]: https://www.gartner.com/en/research/methodologies/gartner-hype-cycle -[4]: https://www.networkworld.com/article/3354477/mobile-world-congress-the-time-of-5g-is-almost-here.html -[5]: https://www.gsma.com/futurenetworks/technology/volte/ -[6]: https://images.idgesg.net/images/article/2019/06/ericsson-mobility-report-june-2019-graph-100799481-large.jpg -[7]: https://www.facebook.com/NetworkWorld/ -[8]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190618 Why your workplace arguments aren-t as effective as you-d like.md b/sources/talk/20190618 Why your workplace arguments aren-t as effective as you-d like.md deleted file mode 100644 index 54a0cca26f..0000000000 --- a/sources/talk/20190618 Why your workplace arguments aren-t as effective as you-d like.md +++ /dev/null @@ -1,144 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why your workplace arguments aren't as effective as you'd like) -[#]: via: (https://opensource.com/open-organization/19/6/barriers-productive-arguments) -[#]: author: (Ron McFarland https://opensource.com/users/ron-mcfarland/users/ron-mcfarland) - -Why your workplace arguments aren't as effective as you'd like -====== -Open organizations rely on open conversations. These common barriers to -productive argument often get in the way. -![Arrows pointing different directions][1] - -Transparent, frank, and often contentious arguments are part of life in an open organization. But how can we be sure those conversations are _productive_ —not _destructive_? - -This is the second installment of a two-part series on how to argue and actually achieve something. In the [first article][2], I mentioned what arguments are (and are not), according to author Sinnott-Armstrong in his book _Think Again: How to Reason and Argue._ I also offered some suggestions for making arguments as productive as possible. - -In this article, I'll examine three barriers to productive arguments that Sinnott-Armstrong elaborates in his book: incivility, polarization, and language issues. Finally, I'll explain his suggestions for addressing those barriers. - -### Incivility - -"Incivility" has become a social concern in recent years. Consider this: As a tactic in arguments, incivility _can_ have an effect in certain situations—and that's why it's a common strategy. Sinnott-Armstrong notes that incivility: - - * **Attracts attention:** Incivility draws people's attention in one direction, sometimes to misdirect attention from or outright obscure other issues. It redirects people's attention to shocking statements. Incivility, exaggeration, and extremism can increase the size of an audience. - - * **Energizes:** Sinnott-Armstrong writes that seeing someone being uncivil on a topic of interest can generate energy from a state of powerlessness. - - * **Stimulates memory:** Forgetting shocking statements is difficult; they stick in our memory more easily than statements that are less surprising to us. - - * **Excites the powerless:** The groups most likely to believe and invest in someone being uncivil are those that feel they're powerless and being treated unfairly. - - - - -Unfortunately, incivility as a tactic in arguments has its costs. One such cost is polarization. - -### Polarization - -Sinnott-Armstrong writes about five forms of polarization: - - * **Distance:** If two people's or groups' views are far apart according to some relevant scale, have significant disagreements and little common ground, then they're polarized. - - * **Differences:** If two people or groups have fewer values and beliefs _in common_ than they _don't have in common_ , then they're polarized. - - * **Antagonism:** Groups are more polarized the more they feel hatred, disdain, fear, or other negative emotions toward other people or groups. - - * **Incivility:** Groups tend to be more polarized when they talk more negatively about people of the other groups. - - * **Rigidity:** Groups tend to be more polarized when they treat their values as indisputable and will not compromise. - - * **Gridlock:** Groups tend to be more polarized when they're unable to cooperate and work together toward common goals. - - - - -And I'll add one more form of polarization to Sinnott-Armstrong's list: - - * **Non-disclosure:** Groups tend to be more polarized when one or both of the groups refuses to share valid, verifiable information—or when they distract each other with useless or irrelevant information. One of the ways people polarize is by not talking to each other and withhold information. Similarly, they talk on subjects that distract us from the issue at hand. Some issues are difficult to talk about, but by doing so solutions can be explored. - - - -### Language issues - -Identifying discussion-stoppers like these can help you avoid shutting down a discussion that would otherwise achieve beneficial outcomes. - -Language issues can be argument-stoppers Sinnott-Armstrong says. In particular, he outlines some of the following language-related barriers to productive argument. - - * **Guarding:** Using words like "all" can make a statement unbelievable; words like "sometimes" can make a statement too vague. - - * **Assuring:** Simply stating "trust me, I know what I'm talking about," without offering evidence that this is the case, can impede arguments. - - * **Evaluating:** Offering an evaluation of something—like saying "It is good"―without any supporting reasoning. - - * **Discounting:** This involves anticipating what the another person will say and attempting to weaken it as much as possible by framing an argument in a negative way. (Contrast these two sentences, for example: "Ramona is smart but boring" and "Ramona is boring but smart." The difference is subtle, but you'd probably want to spend less time with Ramona if you heard the first statement about her than if you heard the second.) - - - - -Identifying discussion-stoppers like these can help you avoid shutting down a discussion that would otherwise achieve beneficial outcomes. In addition, Sinnott-Armstrong specifically draws readers' attention to two other language problems that can kill productive debates: vagueness and ambiguity. - - * **Vagueness:** This occurs when a word or sentence is not precise enough and having many ways to interpret its true meaning and intent, which leads to confusion. Consider the sentence "It is big." "It" must be defined if it's not already obvious to everyone in the conversation. And a word like "big" must be clarified through comparison to something that everyone has agreed upon. - - * **Ambiguity:** This occurs when a sentence could have two distinct meanings. For example: "Police killed man with axe." Who was holding the axe, the man or the police? "My neighbor had a friend for dinner." Did your neighbor invite a friend to share a meal—or did she eat her friend? - - - - -### Overcoming barriers - -To help readers avoid these common roadblocks to productive arguments, Sinnott-Armstrong recommends a simple, four-step process for evaluating another person's argument. - - 1. **Observation:** First, observe a stated opinion and its related evidence to determine the precise nature of the claim. This might require you to ask some questions for clarification (you'll remember I employed this technique when arguing with my belligerent uncle, which I described [in the first article of this series][2]). - - 2. **Hypothesis:** Develop some hypothesis about the argument. In this case, the hypothesis should be an inference based on generally acceptable standards (for more on the structure of arguments themselves, also see [the first part of this series][2]). - - 3. **Comparison:** Compare that hypothesis with others and evaluate which is more accurate. More important issues will require you to conduct more comparisons. In other cases, premises are so obvious that no further explanation is required. - - 4. **Conclusion:** From the comparison analysis, reach a conclusion about whether your hypothesis about a competing argument is correct. - - - - -In many cases, the question is not whether a particular claim is _correct_ or _incorrect_ , but whether it is _believable._ So Sinnott-Armstrong also offers a four-step "believability test" for evaluating claims of this type. - - 1. **Expertise:** Does the person presenting the argument have authority in an appropriate field? Being a specialist is one field doesn't necessarily make that person an expert in another. - - 2. **Motive:** Would self-interest or other personal motives compel a person to withhold information or make false statements? To confirm one's statements, it might be wise to seek a totally separate, independent authority for confirmation. - - 3. **Sources:** Are the sources the person offers as evidence of a claim recognized experts? Do those sources have the expertise on the specific issue addressed? - - 4. **Agreement:** Is there agreement among many experts within the same specialty? - - - - -### Let's argue - -If you really want to strengthen your ability to argue, find someone that totally disagrees with you but wants to learn and understand your beliefs. - -When I was a university student, I would usually sit toward the front of the classroom. When I didn't understand something, I would start asking questions for clarification. Everyone else in the class would just sit silently, saying nothing. After class, however, other students would come up to me and thank me for asking those questions—because everyone else in the room was confused, too. - -Clarification is a powerful act—not just in the classroom, but during arguments anywhere. Building an organizational culture in which people feel empowered to ask for clarification is critical for productive arguments (I've [given presentations on this topic][3] before). If members have the courage to clarify premises, and they can do so in an environment where others don't think they're being belligerent, then this might be the key to a successful and productive argument. - -If you really want to strengthen your ability to argue, find someone that totally disagrees with you but wants to learn and understand your beliefs. Then, practice some of Sinnott-Armstrong's suggestions. Arguing productively will enhance [transparency, inclusivity, and collaboration][4] in your organization—leading to a more open culture. - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/6/barriers-productive-arguments - -作者:[Ron McFarland][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/ron-mcfarland/users/ron-mcfarland -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/directions-arrows.png?itok=EE3lFewZ (Arrows pointing different directions) -[2]: https://opensource.com/open-organization/19/5/productive-arguments -[3]: https://www.slideshare.net/RonMcFarland1/argue-successfully-achieve-something -[4]: https://opensource.com/open-organization/resources/open-org-definition diff --git a/sources/talk/20190619 With Tableau, SaaS king Salesforce becomes a hybrid cloud company.md b/sources/talk/20190619 With Tableau, SaaS king Salesforce becomes a hybrid cloud company.md deleted file mode 100644 index d0d1d24cb6..0000000000 --- a/sources/talk/20190619 With Tableau, SaaS king Salesforce becomes a hybrid cloud company.md +++ /dev/null @@ -1,67 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (With Tableau, SaaS king Salesforce becomes a hybrid cloud company) -[#]: via: (https://www.networkworld.com/article/3403442/with-tableau-saas-king-salesforce-becomes-a-hybrid-cloud-company.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -With Tableau, SaaS king Salesforce becomes a hybrid cloud company -====== -Once dismissive of software, Salesforce acknowledges the inevitability of the hybrid cloud. -![Martyn Williams/IDGNS][1] - -I remember a time when people at Salesforce events would hand out pins that read “Software” inside a red circle with a slash through it. The High Priest of SaaS (a.k.a. CEO Marc Benioff) was so adamant against installed, on-premises software that his keynotes were always comical. - -Now, Salesforce is prepared to [spend $15.7 billion to acquire Tableau Software][2], the leader in on-premises data analytics. - -On the hell-freezes-over scale, this is up there with Microsoft embracing Linux or Apple PR people returning a phone call. Well, we know at least one of those has happened. - -**[ Also read:[Hybrid Cloud: The time for adoption is upon us][3] | Stay in the know: [Subscribe and get daily newsletter updates][4] ]** - -So, why would a company that is so steeped in the cloud, so anti-on-premises software, make such a massive purchase? - -Partly it is because Benioff and company are finally coming to the same conclusion as most everyone else: The hybrid cloud, a mix of on-premises systems and public cloud, is the wave of the future, and pure cloud plays are in the minority. - -The reality is that data is hybrid and does not sit in a single location, and Salesforce is finally acknowledging this, said Tim Crawford, president of Avoa, a strategic CIO advisory firm. - -“I see the acquisition of Tableau by Salesforce as less about getting into the on-prem game as it is a reality of the world we live in. Salesforce needed a solid analytics tool that went well beyond their existing capability. Tableau was that tool,” he said. - -**[[Become a Microsoft Office 365 administrator in record time with this quick start course from PluralSight.][5] ]** - -Salesforce also understands that they need a better understanding of customers and those data insights that drive customer decisions. That data is both on-prem and in the cloud, Crawford noted. It is in Salesforce, other solutions, and the myriad of Excel spreadsheets spread across employee systems. Tableau crosses the hybrid boundaries and brings a straightforward way to visualize data. - -Salesforce had analytics features as part of its SaaS platform, but it was geared around their own platform, whereas everyone uses Tableau and Tableau supports all manner of analytics. - -“There’s a huge overlap between Tableau customers and Salesforce customers,” Crawford said. “The data is everywhere in the enterprise, not just in Salesforce. Salesforce does a great job with its own data, but Tableau does great with data in a lot of places because it’s not tied to one platform. So, it opens up where the data comes from and the insights you get from the data.” - -Crawford said that once the deal is done and Tableau is under some deeper pockets, the organization may be able to innovate faster or do things they were unable to do prior. That hardly indicates Tableau was struggling, though. It pulled in [$1.16 billion in revenue][6] in 2018. - -Crawford also expects Salesforce to push Tableau to open up new possibilities for customer insights by unlocking customer data inside and outside of Salesforce. One challenge for the two companies is to maintain that neutrality so that they don’t lose the ability to use Tableau for non-customer centric activities. - -“It’s a beautiful way to visualize large sets of data that have nothing to do with customer centricity,” he said. - -Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3403442/with-tableau-saas-king-salesforce-becomes-a-hybrid-cloud-company.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.techhive.com/images/article/2015/09/150914-salesforce-dreamforce-2-100614575-large.jpg -[2]: https://www.cio.com/article/3402026/how-salesforces-tableau-acquisition-will-impact-it.html -[3]: http://www.networkworld.com/article/2172875/cloud-computing/hybrid-cloud--the-year-of-adoption-is-upon-us.html -[4]: https://www.networkworld.com/newsletters/signup.html -[5]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fadministering-office-365-quick-start -[6]: https://www.geekwire.com/2019/tableau-hits-841m-annual-recurring-revenue-41-transition-subscription-model-continues/ -[7]: https://www.facebook.com/NetworkWorld/ -[8]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190620 Carrier services help expand healthcare, with 5G in the offing.md b/sources/talk/20190620 Carrier services help expand healthcare, with 5G in the offing.md deleted file mode 100644 index 072b172fda..0000000000 --- a/sources/talk/20190620 Carrier services help expand healthcare, with 5G in the offing.md +++ /dev/null @@ -1,85 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Carrier services help expand healthcare, with 5G in the offing) -[#]: via: (https://www.networkworld.com/article/3403366/carrier-services-help-expand-healthcare-with-5g-in-the-offing.html) -[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) - -Carrier services help expand healthcare, with 5G in the offing -====== -Many telehealth initiatives tap into wireless networking supplied by service providers that may start offering services such as Citizen's Band and 5G to support remote medical care. -![Thinkstock][1] - -There are connectivity options aplenty for most types of [IoT][2] deployment, but the idea of simply handing the networking part of the equation off to a national licensed wireless carrier could be the best one for certain kinds of deployments in the medical field. - -Telehealth systems, for example, are still a relatively new facet of modern medicine, but they’re already among the most important applications that use carrier networks to deliver care. One such system is operated by the University of Mississippi Medical Center, for the treatment and education of diabetes patients. - -**[More on wireless:[The time of 5G is almost here][3]]** - -**[ Now read[20 hot jobs ambitious IT pros should shoot for][4]. ]** - -Greg Hall is the director of IT at UMMC’s center for telehealth. He said that the remote patient monitoring system is relatively simple by design – diabetes patients receive a tablet computer that they can use to input and track their blood sugar levels, alert clinicians to symptoms like nerve pain or foot sores, and even videoconference with their doctors directly. The tablet connects via Verizon, AT&T or CSpire – depending on who’s got the best coverage in a given area – back to UMMC’s servers. - -According to Hall, there are multiple advantages to using carrier connectivity instead of unlicensed (i.e. purpose-built [Wi-Fi][5] or other technology) to connect patients – some of whom live in remote parts of the state – to their caregivers. - -“We weren’t expecting everyone who uses the service to have Wi-Fi,” he said, “and they can take their tablet with them if they’re traveling.” - -The system serves about 250 patients in Mississippi, up from roughly 175 in the 2015 pilot program that got the effort off the ground. Nor is it strictly limited to diabetes care – Hall said that it’s already been extended to patients suffering from chronic obstructive pulmonary disease, asthma and even used for prenatal care, with further expansion in the offing. - -“The goal of our program isn’t just the monitoring piece, but also the education piece, teaching a person to live with their [condition] and thrive,” he said. - -It hasn’t all been smooth sailing. One issue was caused by the natural foliage of the area, as dense areas of pine trees can cause transmission problems, thanks to their needles being a particularly troublesome length and interfering with 2.5GHz wireless signals. But Hall said that the team has been able to install signal boosters or repeaters to overcome that obstacle. - -Neurologist Dr. Allen Gee’s practice in Wyoming attempts to address a similar issue – far-flung patients with medical needs that might not be addressed by the sparse local-care options. From his main office in Cody, he said, he can cover half the state via telepresence, using a purpose-built system that is based on cellular-data connectivity from TCT, Spectrum and AT&T, as well as remote audiovisual equipment and a link to electronic health records stored in distant locations. That allows him to receive patient data, audio/visual information and even imaging diagnostics remotely. Some specialists in the state are able to fly to those remote locations, others are not. - -While Gee’s preference is to meet with patients in person, that’s just not always possible, he said. - -“Medical specialists don’t get paid for windshield time,” he noted. “Being able to transfer information from an EHR facilitates the process of learning about the patient.” - -### 5G is coming** - -** - -According to Alan Stewart-Brown, vice president at infrastructure management vendor Opengear, there’s a lot to like about current carrier networks for medical use – particularly wide coverage and a lack of interference – but there are bigger things to come. - -“We have customers that have equipment in ambulances for instance, where they’re livestreaming patients’ vital signs to consoles that doctors can monitor,” he said. “They’re using carrier 4G for that right now and it works well enough, but there are limitations, namely latency, which you don’t get on [5G][6].” - -Beyond the simple fact of increased throughput and lower latency, widespread 5G deployments could open a wide array of new possibilities for medical technology, mostly involving real-time, very-high-definition video streaming. These include medical VR, remote surgery and the like. - -“The process you use to do things like real-time video – right now on a 4G network, that may or may not have a delay,” said Stewart-Brown. “Once you can get rid of the delay, the possibilities are endless as to what you can use the technology for.” - -### Citizens band - -Ron Malenfant, chief architect for service provider IoT at Cisco, agreed that the future of 5G for medical IoT is bright, but said that the actual applications of the technology have to be carefully thought out. - -“The use cases need to be worked on,” he said. “The innovative [companies] are starting to say ‘OK, what does 5G mean to me’ and starting to plan use cases.” - -One area that the carriers themselves have been eyeing recently is the CBRS band of radio frequencies, which sits around 3.5GHz. It’s what’s referred to as “lightly licensed” spectrum, in that parts of it are used for things like CB radio and other parts are the domain of the U.S. armed forces, and it could be used to build private networks for institutional users like hospitals, instead of deploying small but expensive 4G cells. The idea is that the institutions would be able to lease those frequencies for their specific area from the carrier directly for private LTE/CBRS networks, and, eventually 5G, Malenfant said. - -There’s also the issue, of course, that there are still a huge amount of unknowns around 5G, which isn’t expected to supplant LTE in the U.S. for at least another year or so. The medical field’s stiff regulatory requirements could also prove a stumbling block for the adoption of newer wireless technology. - -Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3403366/carrier-services-help-expand-healthcare-with-5g-in-the-offing.html - -作者:[Jon Gold][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/2018/07/stethoscope_mobile_healthcare_ipad_tablet_doctor_patient-100765655-large.jpg -[2]: https://www.networkworld.com/article/3207535/what-is-iot-how-the-internet-of-things-works.html -[3]: https://www.networkworld.com/article/3354477/mobile-world-congress-the-time-of-5g-is-almost-here.html -[4]: https://www.networkworld.com/article/3276025/careers/20-hot-jobs-ambitious-it-pros-should-shoot-for.html -[5]: https://www.networkworld.com/article/3238664/80211-wi-fi-standards-and-speeds-explained.html -[6]: https://www.networkworld.com/article/3203489/what-is-5g-how-is-it-better-than-4g.html -[7]: https://www.facebook.com/NetworkWorld/ -[8]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190620 Cracks appear in Intel-s grip on supercomputing.md b/sources/talk/20190620 Cracks appear in Intel-s grip on supercomputing.md deleted file mode 100644 index 5ff550d3fc..0000000000 --- a/sources/talk/20190620 Cracks appear in Intel-s grip on supercomputing.md +++ /dev/null @@ -1,63 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Cracks appear in Intel’s grip on supercomputing) -[#]: via: (https://www.networkworld.com/article/3403443/cracks-appear-in-intels-grip-on-supercomputing.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Cracks appear in Intel’s grip on supercomputing -====== -New competitors threaten to take Intel’s dominance in the high-performance computing (HPC) world, and we’re not even talking about AMD (yet). -![Randy Wong/LLNL][1] - -It’s June, so it’s that time again for the twice-yearly Top 500 supercomputer list, where bragging rights are established or, in most cases, reaffirmed. The list constantly shifts as new trends appear, and one of them might be a break in Intel’s dominance. - -[Supercomputers in the top 10 list][2] include a lot of IBM Power-based systems, and almost all run Nvidia GPUs. But there’s more going on than that. - -For starters, an ARM supercomputer has shown up, at #156. [Astra][3] at Sandia National Laboratories is an HPE system running Cavium (now Marvell) ThunderX2 processors. It debuted on the list at #204 last November, but thanks to upgrades, it has moved up the list. It won’t be the last ARM server to show up, either. - -**[ Also see:[10 of the world's fastest supercomputers][2] | Get daily insights: [Sign up for Network World newsletters][4] ]** - -Second is the appearance of four Nvidia DGX servers, with the [DGX SuperPOD][5] ranking the highest at #22. [DGX systems][6] are basically compact GPU boxes with a Xeon just to boot the thing. The GPUs do all the heavy lifting. - -AMD hasn’t shown up yet with the Epyc processors, but it will, given Cray is building them for the government. - -This signals a breaking up of the hold Intel has had on the high-performance computing (HPC) market for a long time, said Ashish Nadkarni, group vice president in IDC's worldwide infrastructure practice. “The Intel hold has already been broken up by all the accelerators in the supercomputing space. The more accelerators they use, the less need they have for Xeons. They can go with other processors that do justice to those accelerators,” he told me. - -With so much work in HPC and artificial intelligence (AI) being done by GPUs, the x86 processor becomes just a boot processor in a way. I wasn’t kidding about the DGX box. It’s got one Xeon and eight Tesla GPUs. And the Xeon is an E5, a midrange part. - -**[[Get certified as an Apple Technical Coordinator with this seven-part online course from PluralSight.][7] ]** - -“They don’t need high-end Xeons in servers any more, although there’s a lot of supercomputers that just use CPUs. The fact is there are so many options now,” said Nadkarni. One example of an all-CPU system is [Frontera][8], a Dell-based system at the Texas Advanced Computing Center in Austin. - -The top two computers, Sierra and Summit, both run IBM Power9 RISC processors, as well as Nvidia GPUs. All told, Nvidia is in 125 of the 500 supercomputers, including five of the top 10, the fastest computer in the world, the fastest in Europe (Piz Daint) and the fastest in Japan (ABCI). - -Lenovo was the top hardware provider, beating out Dell, HPE, and IBM combined. That’s because of its large presence in its native China. Nadkari said Lenovo, which acquired the IBM x86 server business in 2014, has benefitted from the IBM installed base, which has continued wanting the same tech from Lenovo under new ownership. - -Join the Network World communities on [Facebook][9] and [LinkedIn][10] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3403443/cracks-appear-in-intels-grip-on-supercomputing.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/10/sierra875x500-100778404-large.jpg -[2]: https://www.networkworld.com/article/3236875/embargo-10-of-the-worlds-fastest-supercomputers.html -[3]: https://www.top500.org/system/179565 -[4]: https://www.networkworld.com/newsletters/signup.html -[5]: https://www.top500.org/system/179691 -[6]: https://www.networkworld.com/article/3196088/nvidias-new-volta-based-dgx-1-supercomputer-puts-400-servers-in-a-box.html -[7]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fapple-certified-technical-trainer-10-11 -[8]: https://www.networkworld.com/article/3236875/embargo-10-of-the-worlds-fastest-supercomputers.html#slide7 -[9]: https://www.facebook.com/NetworkWorld/ -[10]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190620 Several deals solidify the hybrid cloud-s status as the cloud of choice.md b/sources/talk/20190620 Several deals solidify the hybrid cloud-s status as the cloud of choice.md deleted file mode 100644 index ade07dcb10..0000000000 --- a/sources/talk/20190620 Several deals solidify the hybrid cloud-s status as the cloud of choice.md +++ /dev/null @@ -1,77 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Several deals solidify the hybrid cloud’s status as the cloud of choice) -[#]: via: (https://www.networkworld.com/article/3403354/several-deals-solidify-the-hybrid-clouds-status-as-the-cloud-of-choice.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Several deals solidify the hybrid cloud’s status as the cloud of choice -====== -On-premises and cloud connections are being built by all the top vendors to bridge legacy and modern systems, creating hybrid cloud environments. -![Getty Images][1] - -The hybrid cloud market is expected to grow from $38.27 billion in 2017 to $97.64 billion by 2023, at a Compound Annual Growth Rate (CAGR) of 17.0% during the forecast period, according to Markets and Markets. - -The research firm said the hybrid cloud is rapidly becoming a leading cloud solution, as it provides various benefits, such as cost, efficiency, agility, mobility, and elasticity. One of the many reasons is the need for interoperability standards between cloud services and existing systems. - -Unless you are a startup company and can be born in the cloud, you have legacy data systems that need to be bridged, which is where the hybrid cloud comes in. - -So, in very short order we’ve seen a bunch of new alliances involving the old and new guard, reiterating that the need for hybrid solutions remains strong. - -**[ Read also:[What hybrid cloud means in practice][2] | Get regularly scheduled insights: [Sign up for Network World newsletters][3] ]** - -### HPE/Google - -In April, the Hewlett Packard Enterprise (HPE) and Google announced a deal where HPE introduced a variety of server solutions for Google Cloud’s Anthos, along with a consumption-based model for the validated HPE on-premises infrastructure that is integrated with Anthos. - -Following up with that, the two just announced a strategic partnership to create a hybrid cloud for containers by combining HPE’s on-premises infrastructure, Cloud Data Services, and GreenLake consumption model with Anthos. This allows for: - - * Bi-directional data mobility for data mobility and consistent data services between on-premises and cloud - * Application workload mobility to move containerized app workloads across on-premises and multi-cloud environments - * Multi-cloud flexibility, offering the choice of HPE Cloud Volumes and Anthos for what works best for the workload - * Unified hybrid management through Anthos, so customers can get a unified and consistent view of their applications and workloads regardless of where they reside - * Charged as a service via HPE GreenLake - - - -### IBM/Cisco - -This is a furthering of an already existing partnership between IBM and Cisco designed to deliver a common and secure developer experience across on-premises and public cloud environments for building modern applications. - -[Cisco said it will support IBM Cloud Private][4], an on-premises container application development platform, on Cisco HyperFlex and HyperFlex Edge hyperconverged infrastructure. This includes support for IBM Cloud Pak for Applications. IBM Cloud Paks deliver enterprise-ready containerized software solutions and developer tools for building apps and then easily moving to any cloud—public or private. - -This architecture delivers a common and secure Kubernetes experience across on-premises (including edge) and public cloud environments. IBM’s Multicloud Manager covers monitoring and management of clusters and container-based applications running from on-premises to the edge, while Cisco’s Virtual Application Centric Infrastructure (ACI) will allow customers to extend their network fabric from on-premises to the IBM Cloud. - -### IBM/Equinix - -Equinix expanded its collaboration with IBM Cloud to bring private and scalable connectivity to global enterprises via Equinix Cloud Exchange Fabric (ECX Fabric). This provides private connectivity to IBM Cloud, including Direct Link Exchange, Direct Link Dedicated and Direct Link Dedicated Hosting, that is secure and scalable. - -ECX Fabric is an on-demand, SDN-enabled interconnection service that allows any business to connect between its own distributed infrastructure and any other company’s distributed infrastructure, including cloud providers. Direct Link provides IBM customers with a connection between their network and IBM Cloud. So ECX Fabric provides IBM customers with a secured and scalable network connection to the IBM Cloud service. - -At the same time, ECX Fabric provides secure connections to other cloud providers, and most customers prefer a multi-vendor approach to avoid vendor lock-in. - -“Each of the partnerships focus on two things: 1) supporting a hybrid-cloud platform for their existing customers by reducing the friction to leveraging each solution and 2) leveraging the unique strength that each company brings. Each of the solutions are unique and would be unlikely to compete directly with other partnerships,” said Tim Crawford, president of Avoa, an IT consultancy. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3403354/several-deals-solidify-the-hybrid-clouds-status-as-the-cloud-of-choice.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/cloud_hand_plus_sign_private-100787051-large.jpg -[2]: https://www.networkworld.com/article/3249495/what-hybrid-cloud-mean-practice -[3]: https://www.networkworld.com/newsletters/signup.html -[4]: https://www.networkworld.com/article/3403363/cisco-connects-with-ibm-in-to-simplify-hybrid-cloud-deployment.html -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190626 Where are all the IoT experts going to come from.md b/sources/talk/20190626 Where are all the IoT experts going to come from.md deleted file mode 100644 index 22a303d2f6..0000000000 --- a/sources/talk/20190626 Where are all the IoT experts going to come from.md +++ /dev/null @@ -1,78 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Where are all the IoT experts going to come from?) -[#]: via: (https://www.networkworld.com/article/3404489/where-are-all-the-iot-experts-going-to-come-from.html) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -Where are all the IoT experts going to come from? -====== -The fast growth of the internet of things (IoT) is creating a need to train cross-functional experts who can combine traditional networking and infrastructure expertise with database and reporting skills. -![Kevin \(CC0\)][1] - -If the internet of things (IoT) is going to fulfill its enormous promise, it’s going to need legions of smart, skilled, _trained_ workers to make everything happen. And right now, it’s not entirely clear where those people are going to come from. - -That’s why I was interested in trading emails with Keith Flynn, senior director of product management, R&D at asset-optimization software company [AspenTech][2], who says that when dealing with the slew of new technologies that fall under the IoT umbrella, you need people who can understand how to configure the technology and interpret the data. Flynn sees a growing need for existing educational institutions to house IoT-specific programs, as well as an opportunity for new IoT-focused private colleges, offering a well -ounded curriculum - -“In the future,” Flynn told me, “IoT projects will differ tremendously from the general data management and automation projects of today. … The future requires a more holistic set of skills and cross-trading capabilities so that we’re all speaking the same language.” - -**[ Also read:  [20 hot jobs ambitious IT pros should shoot for][3] ]** - -With the IoT growing 30% a year, Flynn added, rather than a few specific skills, “everything from traditional deployment skills, like networking and infrastructure, to database and reporting skills and, frankly, even basic data science, need to be understood together and used together.” - -### Calling all IoT consultants - -“The first big opportunity for IoT-educated people is in the consulting field,” Flynn predicted. “As consulting companies adapt or die to the industry trends … having IoT-trained people on staff will help position them for IoT projects and make a claim in the new line of business: IoT consulting.” - -The problem is especially acute for startups and smaller companies. “The bigger the organization, the more likely they have a means to hire different people across different lines of skillsets,” Flynn said. “But for smaller organizations and smaller IoT projects, you need someone who can do both.” - -Both? Or _everything?_ The IoT “requires a combination of all knowledge and skillsets,” Flynn said, noting that “many of the skills aren’t new, they’ve just never been grouped together or taught together before.” - -**[ [Looking to upgrade your career in tech? This comprehensive online course teaches you how.][4] ]** - -### The IoT expert of the future - -True IoT expertise starts with foundational instrumentation and electrical skills, Flynn said, which can help workers implement new wireless transmitters and boost technology for better battery life and power consumption. - -“IT skills, like networking, IP addressing, subnet masks, cellular and satellite are also pivotal IoT needs,” Flynn said. He also sees a need for database management skills and cloud management and security expertise, “especially as things like [advanced process control] APC and sending sensor data directly to databases and data lakes become the norm.” - -### Where will IoT experts come from? - -Flynn said standardized formal education courses would be the best way to make sure that graduates or certificate holders have the right set of skills. He even laid out a sample curriculum: “Start in chronological order with the basics like [Electrical & Instrumentation] E&I and measurement. Then teach networking, and then database administration and cloud courses should follow that. This degree could even be looped into an existing engineering course, and it would probably take two years … to complete the IoT component.” - -While corporate training could also play role, “that’s easier said than done,” Flynn warned. “Those trainings will need to be organization-specific efforts and pushes.” - -Of course, there are already [plenty of online IoT training courses and certificate programs][5]. But, ultimately, the responsibility lies with the workers themselves. - -“Upskilling is incredibly important in this world as tech continues to transform industries,” Flynn said. “If that upskilling push doesn’t come from your employer, then online courses and certifications would be an excellent way to do that for yourself. We just need those courses to be created. ... I could even see organizations partnering with higher-education institutions that offer these courses to give their employees better access to it. Of course, the challenge with an IoT program is that it will need to constantly evolve to keep up with new advancements in tech.” - -**[ For more on IoT, see [tips for securing IoT on your network][6], our list of [the most powerful internet of things companies][7] and learn about the [industrial internet of things][8]. | Get regularly scheduled insights by [signing up for Network World newsletters][9]. ]** - -Join the Network World communities on [Facebook][10] and [LinkedIn][11] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3404489/where-are-all-the-iot-experts-going-to-come-from.html - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/07/programmer_certification-skills_code_devops_glasses_student_by-kevin-unsplash-100764315-large.jpg -[2]: https://www.aspentech.com/ -[3]: https://www.networkworld.com/article/3276025/careers/20-hot-jobs-ambitious-it-pros-should-shoot-for.html -[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fupgrading-your-technology-career -[5]: https://www.google.com/search?client=firefox-b-1-d&q=iot+training -[6]: https://www.networkworld.com/article/3254185/internet-of-things/tips-for-securing-iot-on-your-network.html#nww-fsb -[7]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html#nww-fsb -[8]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html#nww-fsb -[9]: https://www.networkworld.com/newsletters/signup.html#nww-fsb -[10]: https://www.facebook.com/NetworkWorld/ -[11]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190630 Data Still Dominates.md b/sources/talk/20190630 Data Still Dominates.md deleted file mode 100644 index e9a86acf68..0000000000 --- a/sources/talk/20190630 Data Still Dominates.md +++ /dev/null @@ -1,100 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Data Still Dominates) -[#]: via: (https://theartofmachinery.com/2019/06/30/data_still_dominates.html) -[#]: author: (Simon Arneaud https://theartofmachinery.com) - -Data Still Dominates -====== - -Here’s [a quote from Linus Torvalds in 2006][1]: - -> I’m a huge proponent of designing your code around the data, rather than the other way around, and I think it’s one of the reasons git has been fairly successful… I will, in fact, claim that the difference between a bad programmer and a good one is whether he considers his code or his data structures more important. Bad programmers worry about the code. Good programmers worry about data structures and their relationships. - -Which sounds a lot like [Eric Raymond’s “Rule of Representation” from 2003][2]: - -> Fold knowledge into data, so program logic can be stupid and robust. - -Which was just his summary of ideas like [this one from Rob Pike in 1989][3]: - -> Data dominates. If you’ve chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming. - -Which cites [Fred Brooks from 1975][4]: - -> ### Representation is the Essence of Programming -> -> Beyond craftmanship lies invention, and it is here that lean, spare, fast programs are born. Almost always these are the result of strategic breakthrough rather than tactical cleverness. Sometimes the strategic breakthrough will be a new algorithm, such as the Cooley-Tukey Fast Fourier Transform or the substitution of an n log n sort for an n2 set of comparisons. -> -> Much more often, strategic breakthrough will come from redoing the representation of the data or tables. This is where the heart of your program lies. Show me your flowcharts and conceal your tables, and I shall be continued to be mystified. Show me your tables, and I won’t usually need your flowcharts; they’ll be obvious. - -So, smart people have been saying this again and again for nearly half a century: focus on the data first. But sometimes it feels like the most famous piece of smart programming advice that everyone forgets. - -Let me give some real examples. - -### The Highly Scalable System that Couldn’t - -This system was designed from the start to handle CPU-intensive loads with incredible scalability. Nothing was synchronous. Everything was done with callbacks, task queues and worker pools. - -But there were two problems: The first was that the “CPU-intensive load” turned out not to be that CPU-intensive after all — a single task took a few milliseconds at worst. So most of the architecture was doing more harm than good. The second problem was that although it sounded like a highly scalable distributed system, it wasn’t one — it only ran on one machine. Why? Because all communication between asynchronous components was done using files on the local filesystem, which was now the bottleneck for any scaling. The original design didn’t say much about data at all, except to advocate local files in the name of “simplicity”. Most of the document was about all the extra architecture that was “obviously” needed to handle the “CPU-intensiveness” of the load. - -### The Service-Oriented Architecture that was Still Data-Oriented - -This system followed a microservices design, made up of single-purpose apps with REST-style APIs. One component was a database that stored documents (basically responses to standard forms, and other electronic paperwork). Naturally it exposed an API for basic storage and retrieval, but pretty quickly there was a need for more complex search functionality. The designers felt that adding this search functionality to the existing document API would have gone against the principles of microservices design. They could talk about “search” as being a different kind of service from “get/put”, so their architecture shouldn’t couple them together. Besides, the tool they were planning to use for search indexing was separate from the database itself, so creating a new service made sense for implementation, too. - -In the end, a search API was created containing a search index that was essentially a duplicate of the data in the main database. This data was being updated dynamically, so any component that mutated document data through the main database API had to also update the search API. It’s impossible to do this with REST APIs without race conditions, so the two sets of data kept going out of sync every now and then, anyway. - -Despite what the architecture diagram promised, the two APIs were tightly coupled through their data dependencies. Later on it was recognised that the search index should be an implementation detail of a unified document service, and this made the system much more maintainable. “Do one thing” works at the data level, not the verb level. - -### The Fantastically Modular and Configurable Ball of Mud - -This system was a kind of automated deployment pipeline. The original designers wanted to make a tool that was flexible enough to solve deployment problems across the company. It was written as a set of pluggable components, with a configuration file system that not only configured the components, but acted as a [DSL][5] for programming how the components fitted into the pipeline. - -Fast forward a few years and it’s turned into “that program”. There was a long list of known bugs that no one was ever fixing. No one wanted to touch the code out of fear of breaking things. No one used any of the flexibility of the DSL. Everyone who used the program copy-pasted the same known-working configuration that everyone else used. - -What had gone wrong? Although the original design document used words like “modular”, “decoupled”, “extensible” and “configurable” a lot, it never said anything about data. So, data dependencies between components ended up being handled in an ad-hoc way using a globally shared blob of JSON. Over time, components made more and more undocumented assumptions about what was in or not in the JSON blob. Sure, the DSL allowed rearranging components into any order, but most configurations didn’t work. - -### Lessons - -I chose these three examples because they’re easy to explain, not to pick on others. I once tried to build a website, and failed trying to instead build some cringe-worthy XML database that didn’t even solve the data problems I had. Then there’s the project that turned into a broken mockery of half the functionality of `make`, again because I didn’t think about what I really needed. I wrote a post before based on a time I wrote [a castle-in-the-sky OOP class hierarchy that should have been encoded in data instead][6]. - -Update: - -Apparently many people still thought I wrote this to make fun of others. People who’ve actually worked with me will know I’m much more interested in the things I’m fixing than in blaming the people who did most of the work building them, but, okay, here’s what I think of the engineers involved. - -Honestly, the first example obviously happened because the designer was more interested in bringing a science project to work than in solving the problem at hand. Most of us have done that (mea culpa), but it’s really annoying to our colleagues who’ll probably have to help maintain them when we’re bored of them. If this sounds like you, please don’t get offended; please just stop. (I’d still rather work on the single-node distributed system than anything built around my “XML database”.) - -There’s nothing personal in the second example. Sometimes it feels like everyone is talking about how wonderful it is to split up services, but no one is talking about exactly when not to. People are learning the hard way all the time. - -The third example was actually from some of the smartest people I’ve ever had the chance to work with. - -(End update.) - -“Does this talk about the problems created by data?” turns out to be a pretty useful litmus test for good systems design. It’s also pretty handy for detecting false expert advice. The hard, messy systems design problems are data problems, so false experts love to ignore them. They’ll show you a wonderfully beautiful architecture, but without talking about what kind of data it’s appropriate for, and (crucially) what kind of data it isn’t. - -For example, a false expert might tell you that you should use a pub/sub system because pub/sub systems are loosely coupled, and loosely coupled components are more maintainable. That sounds nice and results in pretty diagrams, but it’s backwards thinking. Pub/sub doesn’t _make_ your components loosely coupled; pub/sub _is_ loosely coupled, which may or may not match your data needs. - -On the flip side, a well-designed data-oriented architecture goes a long way. Functional programming, service meshes, RPCs, design patterns, event loops, whatever, all have their merits, but personally I’ve seen tools like [boring old databases][7] be responsible for a lot more successfully shipped software. - --------------------------------------------------------------------------------- - -via: https://theartofmachinery.com/2019/06/30/data_still_dominates.html - -作者:[Simon Arneaud][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://theartofmachinery.com -[b]: https://github.com/lujun9972 -[1]: https://lwn.net/Articles/193245/ -[2]: http://www.catb.org/~esr/writings/taoup/html/ch01s06.html -[3]: http://doc.cat-v.org/bell_labs/pikestyle -[4]: https://archive.org/stream/mythicalmanmonth00fred/mythicalmanmonth00fred_djvu.txt -[5]: https://martinfowler.com/books/dsl.html -[6]: https://theartofmachinery.com/2016/06/21/code_vs_data.html -[7]: https://theartofmachinery.com/2017/10/28/rdbs_considered_useful.html diff --git a/sources/talk/20190702 SD-WAN Buyers Should Think Application Performance as well as Resiliency.md b/sources/talk/20190702 SD-WAN Buyers Should Think Application Performance as well as Resiliency.md deleted file mode 100644 index 3bddd4cdc3..0000000000 --- a/sources/talk/20190702 SD-WAN Buyers Should Think Application Performance as well as Resiliency.md +++ /dev/null @@ -1,49 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (SD-WAN Buyers Should Think Application Performance as well as Resiliency) -[#]: via: (https://www.networkworld.com/article/3406456/sd-wan-buyers-should-think-application-performance-as-well-as-resiliency.html) -[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/) - -SD-WAN Buyers Should Think Application Performance as well as Resiliency -====== - -![istock][1] - -As an industry analyst, not since the days of WAN Optimization have I seen a technology gain as much interest as I am seeing with [SD-WANs][2] today. Although full deployments are still limited, nearly every network manager, and often many IT leaders I talk to, are interested in it. The reason for this is two-fold – the WAN has grown in importance for cloud-first enterprises and is badly in need of an overhaul. This hasn’t gone unnoticed by the vendor community as there has been an explosion of companies bringing a broad range of SD-WAN offerings to market. The great news for buyers is that there is no shortage of choices. The bad news is there are too many choices and making the right decision difficult. - -One area of differentiation for SD-WAN vendors is how they handle application performance.  I think of the SD-WAN market as being split into two categories – basic and advanced SD-WANs.  A good analogy is to think of the virtualization market.  There are many vendors that offer hypervisors – in fact there are a number of free ones.  So why do companies pay a premium for VMware? It’s because VMware offers many advanced features and capabilities that make its solution do more than just virtualize servers. - -Similarly, basic SD-WAN solutions do a great job of helping to lower costs and to increase application resiliency through path selection capabilities but do nothing to improve application performance. One myth that needs busting is that all SD-WANs make your applications perform better. That’s simply not true as application availability and performance are two different things. It’s possible to have great performance and poor availability or high availability with lackluster performance.  - -Consider the case where a business runs a hybrid WAN and voice and video traffic is sent over the MPLS connection and broadband is used for other traffic. If the MPLS link becomes congested, but doesn’t go down, most SD-WAN solutions will continue to send video and voice over it, which obviously degrades the performance. If multiple broadband connections are used, the chances of congestion related issues are even more likely.  - -This is an important point for IT professionals to understand. The business justification for SD-WAN was initially built around saving money but if application performance suffers, the entire return on investment (ROI) for the project might as well be tossed out the window.  For many companies, the network is the business, so a poor performing network means equally poor performing applications which results lost productivity, lower revenues and possibly brand damage from customer experience issues.  - -I’ve talked to many organizations that had digital initiatives fail because the network wasn’t transformed. For example, a luxury retailer implemented a tablet program for in store personnel to be able to show merchandise to customers. High end retail is almost wholly impulse purchases so the more inventory that can be shown to a customer, the larger the resulting sales. The WAN that was in place was causing the mobile application to perform poorly causing the digital initiative to have a negative effect. Instead of driving sales, the mobile initiative was chasing customers from the store.  The idea was right but the poor performing WAN caused the project to fail. - -SD-WAN decision makers need to look to suppliers that have specific technologies integrated into it that can act when congestion occurs.  A great example of this is the Silver Peak [Unity EdgeConnect™][3] SD-WAN edge platform with [path conditioning][4], [traffic shaping][5] and sub-second link failover. This ensures the best possible quality for all critical applications, even when an underlying link experiences congestion or an outage, even for [voice and video over broadband][6]. This is a foundational component of advanced SD-WAN providers as they offer the same resiliency and cost benefits as a basic SD-WAN but also ensure application performance remains high.  - -The SD-WAN era is here, and organizations should be aggressive with deployments as it will transform the WAN and make it a digital transformation enabler. Decision makers should choose their provider carefully and ensure the vendor also improves application performance.  Without it, the digital initiatives will likely fail and negate any ROI the company was hoping to realize. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3406456/sd-wan-buyers-should-think-application-performance-as-well-as-resiliency.html - -作者:[Zeus Kerravala][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Zeus-Kerravala/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/07/istock-157647179-100800860-large.jpg -[2]: https://www.silver-peak.com/sd-wan/sd-wan-explained -[3]: https://www.silver-peak.com/products/unity-edge-connect -[4]: https://www.silver-peak.com/products/unity-edge-connect/path-conditioning -[5]: https://www.silver-peak.com/products-solutions/unity/traffic-shaping -[6]: https://www.silver-peak.com/sd-wan/voice-video-over-broadband diff --git a/sources/talk/20190703 An eco-friendly internet of disposable things is coming.md b/sources/talk/20190703 An eco-friendly internet of disposable things is coming.md deleted file mode 100644 index 8d1e827aa8..0000000000 --- a/sources/talk/20190703 An eco-friendly internet of disposable things is coming.md +++ /dev/null @@ -1,92 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (An eco-friendly internet of disposable things is coming) -[#]: via: (https://www.networkworld.com/article/3406462/an-eco-friendly-internet-of-disposable-things-is-coming.html) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -An eco-friendly internet of disposable things is coming -====== -Researchers are creating a non-hazardous, bacteria-powered miniature battery that can be implanted into shipping labels and packaging to monitor temperature and track packages in real time. -![Thinkstock][1] - -Get ready for a future of disposable of internet of things (IoT) devices, one that will mean everything is connected to networks. It will be particularly useful in logistics, being used in single-use plastics in retail packaging and throw-away shippers’ carboard boxes. - -How it will happen? The answer is when non-hazardous, disposable bio-batteries make it possible. And that moment might be approaching. Researchers say they’re closer to commercializing a bacteria-powered miniature battery that they say will propel the IoDT. - -**[ Learn more: [Download a PDF bundle of five essential articles about IoT in the enterprise][2] ]** - -The “internet of disposable things is a new paradigm for the rapid evolution of wireless sensor networks,” says Seokheun Choi, an associate professor at Binghamton University, [in an article on the school’s website][3]. - -“Current IoDTs are mostly powered by expensive and environmentally hazardous batteries,” he says. Those costs can be significant in any kind of large-scale deployment, he says. And furthermore, with exponential growth, the environmental concerns would escalate rapidly. - -The miniaturized battery that Choi’s team has come up with is uniquely charged through power created by bacteria. It doesn’t have metals and acids in it. And it’s designed specifically to provide energy to sensors and radios in single-use IoT devices. Those could be the kinds of sensors ideal for supply-chain logistics where the container is ultimately going to end up in a landfill, creating a hazard. - -Another use case is real-time analysis of packaged food, with sensors monitoring temperature and location, preventing spoilage and providing safer food handling. For example, a farm product could be tracked for on-time delivery, as well as have its temperature measured, all within the packaging, as it moves from packaging facility to consumer. In the event of a food-borne illness outbreak, say, one can quickly find out where the product originated—which apparently is hard to do now. - -Other use cases could be battery-impregnated shipping labels that send real-time data to the internet. Importantly, in both use cases, packaging can be discarded without added environmental concerns. - -### How the bacteria-powered batteries work - -A slow release of nutrients provide the energy to the bacteria-powered batteries, which the researchers say can last up to eight days. “Slow and continuous reactions” convert the microbial nutrients into “long standing power,” they say in [their paper's abstract][4]. - -“Our biobattery is low-cost, disposable, and environmentally-friendly,” Choi says. - -Origami, the Japanese paper-folding skill used to create objects, was an inspiration for a similar microbial-based battery project the group wrote about last year in a paper. This one is liquid-based and not as long lasting. A bacteria-containing liquid was absorbed along the porous creases in folded paper, creating the paper-delivered power source, perhaps to be used in a shipping label. - -“Low-cost microbial fuel cells (MFCs) can be done efficiently by using a paper substrate and origami techniques,” [the group wrote then][5]. - -Scientists, too, envisage electronics now printed on circuit boards (PCBs) and can be toxic on disposal being printed entirely on eco-friendly paper. Product cycles, such as those found now in mobile devices and likely in future IoT devices, are continually getting tighter—thus PCBs are increasingly being disposed. Solutions are needed, experts say. - -Put the battery in the paper, too, is the argument here. And while you’re at it, get the biodegradation of the used-up biobattery to help break-down the organic-matter paper. - -Ultimately, Choi believes that the power-creating bacteria could even be introduced naturally by the environment—right now it’s added on by the scientists. - -**More on IoT:** - - * [What is the IoT? How the internet of things works][6] - * [What is edge computing and how it’s changing the network][7] - * [Most powerful Internet of Things companies][8] - * [10 Hot IoT startups to watch][9] - * [The 6 ways to make money in IoT][10] - * [What is digital twin technology? [and why it matters]][11] - * [Blockchain, service-centric networking key to IoT success][12] - * [Getting grounded in IoT networking and security][2] - * [Building IoT-ready networks must become a priority][13] - * [What is the Industrial IoT? [And why the stakes are so high]][14] - - - -Join the Network World communities on [Facebook][15] and [LinkedIn][16] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3406462/an-eco-friendly-internet-of-disposable-things-is-coming.html - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.techhive.com/images/article/2017/04/green-data-center-intro-100719502-large.jpg -[2]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[3]: https://www.binghamton.edu/news/story/1867/everything-will-connect-to-the-internet-someday-and-this-biobattery-could-h -[4]: https://www.sciencedirect.com/science/article/abs/pii/S0378775319305580 -[5]: https://www.sciencedirect.com/science/article/pii/S0960148117311606 -[6]: https://www.networkworld.com/article/3207535/internet-of-things/what-is-the-iot-how-the-internet-of-things-works.html -[7]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[8]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[9]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[10]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[11]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[12]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[13]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[14]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[15]: https://www.facebook.com/NetworkWorld/ -[16]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190705 Lessons in Vendor Lock-in- Google and Huawei.md b/sources/talk/20190705 Lessons in Vendor Lock-in- Google and Huawei.md deleted file mode 100644 index fe92b389a9..0000000000 --- a/sources/talk/20190705 Lessons in Vendor Lock-in- Google and Huawei.md +++ /dev/null @@ -1,58 +0,0 @@ -[#]: collector: "lujun9972" -[#]: translator: " " -[#]: reviewer: " " -[#]: publisher: " " -[#]: url: " " -[#]: subject: "Lessons in Vendor Lock-in: Google and Huawei" -[#]: via: "https://www.linuxjournal.com/content/lessons-vendor-lock-google-and-huawei" -[#]: author: "Kyle Rankin https://www.linuxjournal.com/users/kyle-rankin" - -Lessons in Vendor Lock-in: Google and Huawei -====== -![](https://www.linuxjournal.com/sites/default/files/styles/850x500/public/nodeimage/story/bigstock-Us--China-Trade-War-Boxing-F-252887971_1.jpg?itok=oZBwXDrP) - -What happens when you're locked in to a vendor that's too big to fail, but is on the opposite end of a trade war? - -The story of Google no longer giving Huawei access to Android updates is still developing, so by the time you read this, the situation may have changed. At the moment, Google has granted Huawei a 90-day window whereby it will have access to Android OS updates, the Google Play store and other Google-owned Android assets. After that point, due to trade negotiations between the US and China, Huawei no longer will have that access. - -Whether or not this new policy between Google and Huawei is still in place when this article is published, this article isn't about trade policy or politics. Instead, I'm going to examine this as a new lesson in vendor lock-in that I don't think many have considered before: what happens when the vendor you rely on is forced by its government to stop you from being a customer? - -### Too Big to Fail - -Vendor lock-in isn't new, but until the last decade or so, it generally was thought of by engineers as a bad thing. Companies would take advantage the fact that you used one of their products that was legitimately good to use the rest of their products that may or may not be as good as those from their competitors. People felt the pain of being stuck with inferior products and rebelled. - -These days, a lot of engineers have entered the industry in a world where the new giants of lock-in are still growing and have only flexed their lock-in powers a bit. Many engineers shrug off worries about choosing a solution that requires you to use only products from one vendor, in particular if that vendor is a large enough company. There is an assumption that those companies are too big ever to fail, so why would it matter that you rely on them (as many companies in the cloud do) for every aspect of their technology stack? - -Many people who justify lock-in with companies who are too big to fail point to all of the even more important companies who use that vendor who would have even bigger problems should that vendor have a major bug, outage or go out of business. It would take so much effort to use cross-platform technologies, the thinking goes, when the risk of going all-in with a single vendor seems so small. - -Huawei also probably figured (rightly) that Google and Android were too big to fail. Why worry about the risks of being beholden to a single vendor for your OS when that vendor was used by other large companies and would have even bigger problems if the vendor went away? - -### The Power of Updates - -Google held a particularly interesting and subtle bit of lock-in power over Huawei (and any phone manufacturer who uses Android)—the power of software updates. This form of lock-in isn't new. Microsoft famously used the fact that software updates in Microsoft Office cost money (naturally, as it was selling that software) along with the fact that new versions of Office had this tendency to break backward compatibility with older document formats to encourage everyone to upgrade. The common scenario was that the upper-level folks in the office would get brand-new, cutting-edge computers with the latest version of Office on them. They would start saving new documents and sharing them, and everyone else wouldn't be able to open them. It ended up being easier to upgrade everyone's version of Office than to have the bosses remember to save new documents in old formats every time. - -The main difference with Android is that updates are critical not because of compatibility, but for security. Without OS updates, your phone ultimately will become vulnerable to exploits that attackers continue to find in your software. The Android OS that ships on phones is proprietary and therefore requires permission from Google to get those updates. - -Many people still don't think of the Android OS as proprietary software. Although people talk about the FOSS underpinnings in Android, only people who go to the extra effort of getting a pure-FOSS version of Android, like LineageOS, on their phones actually experience it. The version of Android most people tend to use has a bit of FOSS in the center, surrounded by proprietary Google Apps code. - -It's this Google Apps code that gives Google the kind of powerful leverage over a company like Huawei. With traditional Android releases, Google controls access to OS updates including security updates. All of this software is signed with Google's signing keys. This system is built with security in mind—attackers can't easily build their own OS update to install on your phone—but it also has a convenient side effect of giving Google control over the updates. - -What's more, the Google Apps suite isn't just a convenient way to load Gmail or Google Docs, it also includes the tight integration with your Google account and the Google Play store. Without those hooks, you don't have access to the giant library of applications that everyone expects to use on their phones. As anyone with a LineageOS phone that uses F-Droid can attest, while a large number of applications are available in the F-Droid market, you can't expect to see those same apps as on Google Play. Although you can side-load some Google Play apps, many applications, such as Google Maps, behave differently without a Google account. Note that this control isn't unique to Google. Apple uses similar code-signing features with similar restrictions on its own phones and app updates. - -### Conclusion - -Without access to these OS updates, Huawei now will have to decide whether to create its own LineageOS-style Android fork or a whole new phone OS of its own. In either case, it will have to abandon the Google Play Store ecosystem and use F-Droid-style app repositories, or if it goes 100% alone, it will need to create a completely new app ecosystem. If its engineers planned for this situation, then they likely are working on this plan right now; otherwise, they are all presumably scrambling to address an event that "should never happen". Here's hoping that if you find yourself in a similar case of vendor lock-in with an overseas company that's too big to fail, you never get caught in the middle of a trade war. - --------------------------------------------------------------------------------- - -via: https://www.linuxjournal.com/content/lessons-vendor-lock-google-and-huawei - -作者:[Kyle Rankin][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxjournal.com/users/kyle-rankin -[b]: https://github.com/lujun9972 diff --git a/sources/talk/20190708 Colocation facilities buck the cloud-data-center trend.md b/sources/talk/20190708 Colocation facilities buck the cloud-data-center trend.md deleted file mode 100644 index add6ef0093..0000000000 --- a/sources/talk/20190708 Colocation facilities buck the cloud-data-center trend.md +++ /dev/null @@ -1,96 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Colocation facilities buck the cloud-data-center trend) -[#]: via: (https://www.networkworld.com/article/3407756/colocation-facilities-buck-the-cloud-data-center-trend.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Colocation facilities buck the cloud-data-center trend -====== -Lower prices and latency plus easy access to multiple cloud providers make colocation facilities an attractive option compared to building on-site data centers. -![gorodenkoff / Getty Images][1] - -[Data center][2] workloads are moving but not only to the cloud. Increasingly, they are shifting to colocation facilities as an alternative to privately owned data centers. - -### What is colocation? - -A colocation facility or colo is a data center in which a business can rent space for servers and other computing hardware that they purchase but that the colo provider manages. - -[Read about IPv6 and cloud-access security brokers][3] - -The colo company provides the building, cooling, power, bandwidth and physical security. Space is leased by the rack, cabinet, cage or room. Many colos started out as managed services and continue  to offer those specialized services. - -Some prominent providers include Equinix, Digital Reality Trust, CenturyLink, and NTT Communications, and there are several Chinese providers that only serve the China market. Unlike the data centers of cloud vendors like Amazon and Microsoft, these colo facilities are generally in large metropolitan areas. - -“Colos have been around a long time, but their initial use case was Web servers,” said Rick Villars, vice president of data centers and cloud research at IDC. “What’s changed now is the ratio of what’s customer-facing is much greater than in 2000, [with the]  expansion of companies needing to have more assets that are network-facing.” - -### Advantages of colos: Cost, cloud interconnect - -Homegrown data centers are often sized correctly, with either too much capacity or too little, said Jim Poole, vice president of business development at Equinix. “Customers come to us all the time and say, ‘Would you buy my data center? Because I only use 25 percent of it,’” he said. - -Poole said the average capital expenditure for a stand-alone enterprise data center that is not a part of the corporate campus is $9 million. Companies are increasingly realizing that it makes sense to buy the racks of hardware but place it in someone else’s secure facility that handles the power and cooling. “It’s the same argument for doing cloud computing but at the physical-infrastructure level,” he said. - -Mike Satter, vice president for OceanTech, a data-center-decommissioning service provider, says enterprises should absolutely outsource data-center construction or go the colo route. Just as there are contractors who specialize in building houses, there are experts who specialize in data-center design, he said. - -He added that with many data-center closures there is subsequent consolidation. “For every decommissioning we do, that same company is adding to another environment somewhere else. With the new hardware out there now, the servers can do the same work in 20 racks as they did in 80 racks five years ago. That means a reduced footprint and energy cost,” he said. - -Often these closures mean moving to a colo. OceanTech recently decommissioned a private data center for a major media outlet he declined to identify that involved shutting down a data center in New Jersey that held 70 racks of gear. The firm was going to move its apps to the cloud but ended up expanding to a colo facility in New York City. - -### Cloud isn't cheaper than private data centers - -Satter said he’s had conversations with companies that planned to go to the cloud but changed their minds when they saw what it would cost if they later decided to move workloads out. Cloud providers can “kill you with guidelines and costs” because your data is in their infrastructure, and they can set fees that make it expensive to move it to another provider, he said. “The cloud not a money saver.” - -That can drive decisions to keep data in-house or in a colo in order to keep tighter possession of their data. “Early on, when people weren’t hip to the game for how much it cost to move to the cloud, you had decision makers with influence say the cloud sounded good. Now they are realizing it costs a lot more dollars to do that vs. doing something on-prem, on your own,” said Satter. - -Guy Churchward, CEO of Datera, developer of software designed storage platforms for enterprises, has noticed a new trend among CIOs making a cloud vs. private decision for apps based on the lifespan of the app. - -“Organizations don’t know how much resource they need to throw at a task. The cloud makes more sense for [short-term apps],” he said. For applications that will be used for five years or more, it makes more sense to place them in company-controlled facilities, he said. That's because with three-to-five-year hardware-refresh cycles, the hardware lasts the entire lifespan of the app, and the hardware and app can be retired at the same time. - -Another force driving the decision of private data center vs. the cloud is machine learning. Churchward said that’s because machine learning is often done using large amounts of highly sensitive data, so customers wanted data kept securely in house. They also wanted a low-latency loop between their ML apps and the data lake from which they draw. - -### Colos connect to mulitple cloud providers - -Another allure of colocation providers is that they can act as a pipeline between enterprises and multiple cloud providers. So rather than directly connecting to AWS, Azure, etc., businesses can connect to a colo, and that colo acts like a giant switch, connecting them to cloud providers through dedicated, high-speed networks. - -Villars notes the typical corporate data center is either inside corporate HQ or someplace remote, like South Dakota where land was cheap. But the trade-off is that network connectivity to remote locations is often slower and more expensive. - -That’s where a data-center colo providers with a large footprints come in, since they have points of presence in major cities. No one would fault a New York City-based firm for putting its data center in upstate New York or even further away. But when Equinix, DTR, and others all have data centers right in New York City, customers might get faster and sometimes cheaper connections plus lower latency. - -Steve Cretney, vice president and CIO for food distributor Colony Brands, is in the midst of migrating the company to the cloud and moving everything he can from his data center to AWS. Rather than connect directly to AWS, Colony’s Wisconsin headquarters is connected to an Equinix data center in Chicago. - -Going with Equinix provides more and cheaper bandwidth to the cloud than buying direct connectivity on his own. “I effectively moved my data center into Chicago. Now I can compete with a better price on data communication and networks,” he said. - -Cretney estimates that by moving Colony’s networking from a smaller, local provider to Chicago, the company is seeing an annual cost savings of 50 percent for network connectivity that includes telecommunications. - -Also, Colony wants to adopt a mult-cloud-provider strategy to avoid vendor lock-in, and he gets that by using Equinix as his network connection. As the company eventually uses Microsoft Azure and Google Cloud and other providers, Equinex can provide flexible and economic interconnections, he said. - -### **Colos reduce the need for enterprise data-center real estate** - -In 2014, 80 percent of data-centers were owned by enterprises, while colos and the early cloud accounted for 20 percent, said Villars. Today that’s a 50-50 split, and by 2022-2023, IDC projects service providers will own 70 percent of the large-data-center space. - -For the past five years, the amount of new data-center construction by enterprises has been falling steadily at  5 to 10 percent per year, said Villars. “They are not building new ones because they are coming to the realization that being an expert at data-center construction is not something a company has.” - -Enterprises across many sectors are looking at their data-center environment and leveraging things like virtual machines and SSD, thereby compressing the size of their data centers and getting more work done within smaller physical footprints. “So at some point they ask if they are spending appropriately for this space. That’s when they look at colo,” said Villars. - -Join the Network World communities on [Facebook][4] and [LinkedIn][5] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3407756/colocation-facilities-buck-the-cloud-data-center-trend.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/05/cso_cloud_computing_backups_it_engineer_data_center_server_racks_connections_by_gorodenkoff_gettyimages-943065400_3x2_2400x1600-100796535-large.jpg -[2]: https://www.networkworld.com/article/3223692/what-is-a-data-centerhow-its-changed-and-what-you-need-to-know.html -[3]: https://www.networkworld.com/article/3391380/does-your-cloud-access-security-broker-support-ipv6-it-should.html -[4]: https://www.facebook.com/NetworkWorld/ -[5]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190709 Improving IT Operations - Key to Business Success in Digital Transformation.md b/sources/talk/20190709 Improving IT Operations - Key to Business Success in Digital Transformation.md deleted file mode 100644 index 5ce4f7edfe..0000000000 --- a/sources/talk/20190709 Improving IT Operations - Key to Business Success in Digital Transformation.md +++ /dev/null @@ -1,79 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Improving IT Operations – Key to Business Success in Digital Transformation) -[#]: via: (https://www.networkworld.com/article/3407698/improving-it-operations-key-to-business-success-in-digital-transformation.html) -[#]: author: (Rami Rammaha https://www.networkworld.com/author/Rami-Rammaha/) - -Improving IT Operations – Key to Business Success in Digital Transformation -====== - -![Artem Peretiatko][1] - -Forty seven percent of CEOs say they are being “challenged” by their board of directors to show progress in shifting toward a digital business model according to the [Gartner 2018 CIO][2] Agenda Industry Insights Report. By improving IT operations, organizations can progress and even accelerate their digital transformation initiatives efficiently and successfully. The biggest barrier to success is that IT currently spends around 78 percent of their budget and 80 percent of their time just maintaining IT operations, leaving little time and resource left for innovation according to ZK Research[*][3]. - -### **Do you cut the operations budget or invest more in transforming operations? ** - -The Cisco IT Operations Readiness Index 2018 predicted a dramatic change in IT operations as CIOs embrace analytics and automation. The study reported that 88 percent of respondents identify investing in IT operations as key to driving preemptive practices and enhancing customer experience. - -### What does this have to do with the wide area network? - -According to the IT Operations Readiness Index, 73 percent of respondents will collect WAN operational or performance data and 70 percent will analyze WAN data and leverage the results to further automate network operations. However, security is the most data-driven infrastructure today compared to other IT infrastructure functions (i.e. IoT, IP telephony, network infrastructure, data center infrastructure, WAN connectivity, etc.). The big questions are: - - * How do you collect operations data and what data should you collect? - * How do you analyze it? - * How do you then automate IT operations based on the results? - - - -By no means, is this a simple task. IT departments use a combination of data collected internally and by outside vendors to aggregate information used to transform operations and make better business decisions. - -In a recent [survey][4] by Frost & Sullivan, 94 percent of respondents indicated they will deploy a Software-defined Wide Area Network ([SD-WAN][5]) in the next 24 months. SD-WAN addresses the gap that router-centric WAN architectures were not designed to fill. A business-driven SD-WAN, designed from the ground up to support a cloud-first business model, provides significantly more network and application performance visibility, significantly assisting enterprises to realize the transformational promise of a digital business model. In fact, Gartner indicates that 90 percent of WAN edge decisions will be based on SD-WAN by 2023. - -### How an SD-WAN can improve IT operations leading to successful digital transformation - -All SD-WAN solutions are not created alike. One of the key components that organizations need to consider and evaluate is having complete observability across the network and applications through a single pane of glass. Without visibility, IT risks running inefficient operations that will stifle digital transformation initiatives. This real-time visibility must provide: - - * Operational metrics enabling IT/CIO’s to shift from a reactive toward a predictive practice - * A centralized dashboard that allows IT to monitor, in real-time, all aspects of network operations – a dashboard that has flexible knobs to adjust and collect metrics from all WAN edge appliances to accelerate problem resolution - - - -The Silver Peak Unity [EdgeConnect™][6] SD-WAN edge platform provides granular visibility into network and application performance. The EdgeConnect platform ensures the highest quality of experience for both end users and IT. End users enjoy always-consistent, always-available application performance including the highest quality of voice and video, even over broadband. Utilizing the [Unity Orchestrator™][7] comprehensive management dashboard as shown below, IT gains complete observability into the performance attributes of the network and applications in real-time. Customizable widgets provide a wealth of operational data including a health heatmap for every SD-WAN appliance deployed, flow counts, active tunnels, logical topologies, top talkers, alarms, bandwidth consumed by each application and location, application latency and jitter and much more. Furthermore, the platform maintains a week’s worth of data with context allowing IT to playback and see what has transpired at a specific time and location, analogous to a DVR. - -By providing complete observability of the entire WAN, IT spends less time troubleshooting network and application bottlenecks and fielding support/help desk calls day and night, and more time focused on strategic business initiatives. - -![][8] - -This solution brief, “[Simplify SD-WAN Operations with Greater Visibility][9]”, provides additional detail on the capabilities offered in the business-driven EdgeConnect SD-WAN edge platform that enables businesses to accelerate their shift toward a digital business model. - -![][10] - -* ZK Research quote from [Cisco IT Operations Readiness Index 2018][11] - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3407698/improving-it-operations-key-to-business-success-in-digital-transformation.html - -作者:[Rami Rammaha][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Rami-Rammaha/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/07/istock-1096811078_1200x800-100801264-large.jpg -[2]: https://www.gartner.com/smarterwithgartner/is-digital-a-priority-for-your-industry/ -[3]: https://blog.silver-peak.com/improving-it-operations-key-to-business-success-in-digital-transformation#footnote -[4]: https://www.silver-peak.com/sd-wan-edge-survey -[5]: https://www.silver-peak.com/sd-wan -[6]: https://www.silver-peak.com/products/unity-edge-connect -[7]: https://www.silver-peak.com/products/unity-orchestrator -[8]: https://images.idgesg.net/images/article/2019/07/silver-peak-unity-edgeconnect-sdwan-100801265-large.jpg -[9]: https://www.silver-peak.com/resource-center/simplify-sd-wan-operations-greater-visibility -[10]: https://images.idgesg.net/images/article/2019/07/simplify-sd-wan-operations-with-greater-visibility-100801266-large.jpg -[11]: https://s3-us-west-1.amazonaws.com/connectedfutures-prod/wp-content/uploads/2018/11/CF_transforming_IT_operations_report_3-2.pdf diff --git a/sources/talk/20190709 Linux a key player in the edge computing revolution.md b/sources/talk/20190709 Linux a key player in the edge computing revolution.md deleted file mode 100644 index df1dba9344..0000000000 --- a/sources/talk/20190709 Linux a key player in the edge computing revolution.md +++ /dev/null @@ -1,112 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Linux a key player in the edge computing revolution) -[#]: via: (https://www.networkworld.com/article/3407702/linux-a-key-player-in-the-edge-computing-revolution.html) -[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) - -Linux a key player in the edge computing revolution -====== -Edge computing is augmenting the role that Linux plays in our day-to-day lives. A conversation with Jaromir Coufal from Red Hat helps to define what the edge has become. -![Dominic Smith \(CC BY 2.0\)][1] - -In the past few years, [edge computing][2] has been revolutionizing how some very familiar services are provided to individuals like you and me, as well as how services are managed within major industries. Try to get your arms around what edge computing is today, and you might just discover that your arms aren’t nearly as long or as flexible as you’d imagined. And Linux is playing a major role in this ever-expanding edge. - -One reason why edge computing defies easy definition is that it takes many different forms. As Jaromir Coufal, principal product manager at Red Hat, recently pointed out to me, there is no single edge. Instead, there are lots of edges – depending on what compute features are needed. He suggests that we can think of the edge as something of a continuum of capabilities with the problem being resolved determining where along that particular continuum any edge solution will rest. - -**[ Also read: [What is edge computing?][3] and [How edge networking and IoT will reshape data centers][4] ]** - -Some forms of edge computing include consumer electronics that are used and installed in millions of homes, others that serve tens of thousands of small businesses with operating their facilities, and still others that tie large companies to their remote sites. Key to this elusive definition is the idea that edge computing always involves distributing the workload in such a way that the bulk of the computing work is done remotely from the central core of the business and close to the business problem being addressed. - -Done properly, edge computing can provide services that are both faster and more reliable. Applications running on the edge can be more resilient and run considerably faster because their required data resources are local. In addition, data can be processed or analyzed locally, often requiring only periodic transfer of results to central sites. - -While physical security might be lower at the edge, edge devices often implement security features that allow them to detect 1) manipulation of the device, 2) malicious software, and 3) a physical breach and wipe data. - -### Benefits of edge computing - -Some of the benefits of edge computing include: - - * A quick response to intrusion detection, including the ability for a remote device to detach or self-destruct - * The ability to instantly stop communication when needed - * Constrained functionality and fewer generic entry points - * Rugged and reliable problem resistance - * Making the overall computing system harder to attack because computing is distributed - * Less data-in-transit exposure - - - -Some examples of edge computing devices include those that provide: - - * Video surveillance – watching for activity, reporting only if seen - * Controlling autonomous vehicles - * Production monitoring and control - - - -### Edge computing success story: Chick-fil-A - -One impressive example of highly successful edge computing caught me by surprise. It turns out Chick-fil-A uses edge computing devices to help manage its food preparation services. At Chick-fil-A, edge devices: - - 1. Analyze a fryer’s cleaning and cooking - 2. Aggregate data as a failsafe in case internet connectivity is lost - 3. Help with decision-making about cooking – how much and how long to cook - 4. Enhance business operations - 5. Help automate the complex food cooking and holding decisions so that even newbies get things right - 6. Function even when the connection with the central site is down - - - -As Coufal pointed out, Chick-fil-A runs [Kubernetes][5] at the edge in every one of its restaurants. Their key motivators are low-latency, scale of operations, and continuous business. And it seems to be working extremely well. - -[Chick-fil-A’s hypothesis][6] captures it all: By making smarter kitchen equipment, we can collect more data. By applying data to our restaurant, we can build more intelligent systems. By building more intelligent systems, we can better scale our business. - -### Are you edge-ready? - -There’s no quick answer as to whether your organization is “edge ready.” Many factors determine what kind of services can be deployed on the edge and whether and when those services need to communicate with more central devices. Some of these include: - - * Whether your workload can be functionally distributed - * If it’s OK for devices to have infrequent contact with the central services - * If devices can work properly when cut off from their connection back to central services - * Whether the devices can be secured (e.g., trusted not to provide an entry point) - - - -Implementing an edge computing network will likely take a long time from initial planning to implementation. Still, this kind of technology is taking hold and offers some strong advantages. While edge computing initially took hold 15 or more years ago, the last few years have seen renewed interest thanks to tech advances that have enabled new uses. - -Coufal noted that it's been 15 or more years since edge computing concepts and technologies were first introduced, but renewed interest has come about due to tech advances enabling new uses that require this technology. - -**More about edge computing:** - - * [How edge networking and IoT will reshape data centers][4] - * [Edge computing best practices][7] - * [How edge computing can help secure the IoT][8] - - - -Join the Network World communities on [Facebook][9] and [LinkedIn][10] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3407702/linux-a-key-player-in-the-edge-computing-revolution.html - -作者:[Sandra Henry-Stocker][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/07/telecom-100801330-large.jpg -[2]: https://www.networkworld.com/article/3224893/what-is-edge-computing-and-how-it-s-changing-the-network.html -[3]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[4]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html -[5]: https://www.infoworld.com/article/3268073/what-is-kubernetes-container-orchestration-explained.html -[6]: https://medium.com/@cfatechblog/edge-computing-at-chick-fil-a-7d67242675e2 -[7]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html -[8]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html -[9]: https://www.facebook.com/NetworkWorld/ -[10]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190711 Smarter IoT concepts reveal creaking networks.md b/sources/talk/20190711 Smarter IoT concepts reveal creaking networks.md deleted file mode 100644 index 86150bc580..0000000000 --- a/sources/talk/20190711 Smarter IoT concepts reveal creaking networks.md +++ /dev/null @@ -1,79 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Smarter IoT concepts reveal creaking networks) -[#]: via: (https://www.networkworld.com/article/3407852/smarter-iot-concepts-reveal-creaking-networks.html) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Smarter IoT concepts reveal creaking networks -====== -Today’s networks don’t meet the needs of emergent internet of things systems. IoT systems need their own modern infrastructure, researchers at the University of Magdeburg say. -![Thinkstock][1] - -The internet of things (IoT) needs its own infrastructure ecosystem — one that doesn't use external clouds at all, researchers at the University of Magdeburg say. - -The computer scientists recently obtained funding from the German government to study how to build a future-generation of revolutionary, emergent IoT systems. They say networks must be fault tolerant, secure, and traverse disparate protocols, which they aren't now. - -**[ Read also: [What is edge computing?][2] and [How edge networking and IoT will reshape data centers][3] ]** - -The researchers say a smarter, unique, and organic infrastructure needs to be developed for the IoT and that simply adapting the IoT to traditional networks won't work. They say services must self-organize and function autonomously and that people must accept the fact that we are using the internet in ways never originally intended.  - -"The internet, as we know it, is based on network architectures of the 70s and 80s, when it was designed for completely different applications,” the researchers say in their [media release][4]. The internet has centralized security, which causes choke points, and and an inherent lack of dynamic controls, which translates to inflexibility in access rights — all of which make it difficult to adapt the IoT to it. - -Device, data, and process management must be integrated into IoT systems, say the group behind the project, called [DoRIoT][5] (Dynamische Laufzeitumgebung für Organisch (dis-)Aggregierende IoT-Prozesse), translated as Dynamic Runtime Environment for Organic dis-Aggregating IoT Processes. - -“In order to close this gap, concepts [will be] developed in the project that transparently realize the access to the data,” says Professor Sebastian Zug of the University of Freiberg, a partner in DoRIoT. “For the application, it should make no difference whether the specific information requirement is answered by a server or an IoT node.” - -### Extreme edge computing - -In other words, servers and nodes, conceptually, should merge. One could argue it’s a form of extreme [edge computing][6], which is when processing and data storage is taken out of traditional, centralized data center environments and placed close to where the resources are required. It reduces latency, among other advantages. - -DoRIoT may take edge computing one step further. Detecting failures ahead of time and seamless migration of devices are wants, too — services can’t fail just because a new kind of device is introduced. - -“The systems [will] benefit from each other, for example, they can share computing power, data and so on,” says Mesut Güneş of Magdeburg’s [Faculty of Computer Science Institute for Intelligent Cooperating Systems][7]. - -“The result is an enormous data pool,” the researchers explain. “Which, in turn, makes it possible to make much more precise statements, for example when predicting climate models, observing traffic flows, or managing large factories in Industry 4.0.” - -[Industry 4.0][8] refers to smart factories that have connected machines autonomously self-managing their own supply chain, production output, and logistics without human intervention. - -Managing risks better than the current internet is one of DoRIoT's goals. The idea is to “guarantee full sovereignty over proprietary data.” To get there, though, one has to eliminate dependency on the cloud and access to data via third parties, they say. - -“This allows companies to be independent of the server infrastructures of external service providers such as Google, Microsoft or Amazon, which are subject to constant changes and even may not be accessible,” they say. - -**More about edge networking** - - * [How edge networking and IoT will reshape data centers][3] - * [Edge computing best practices][9] - * [How edge computing can help secure the IoT][10] - - - -Join the Network World communities on [Facebook][11] and [LinkedIn][12] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3407852/smarter-iot-concepts-reveal-creaking-networks.html - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/02/industry_4-0_industrial_iot_internet_of_things_network_thinkstock_613880008-100749946-large.jpg -[2]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[3]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html -[4]: http://www.ovgu.de/en/University/In+Profile/Key+Profile+Areas/Research/Secure+data+protection+in+the+new+internet+of+things.html -[5]: http://www.doriot.net/ -[6]: https://www.networkworld.com/article/3224893/what-is-edge-computing-and-how-it-s-changing-the-network.html -[7]: http://iks.cs.ovgu.de/iks/en/ICS.html -[8]: https://www.networkworld.com/article/3199671/what-is-industry-4-0.html -[9]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html -[10]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html -[11]: https://www.facebook.com/NetworkWorld/ -[12]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190716 Server hardware makers shift production out of China.md b/sources/talk/20190716 Server hardware makers shift production out of China.md deleted file mode 100644 index be29283977..0000000000 --- a/sources/talk/20190716 Server hardware makers shift production out of China.md +++ /dev/null @@ -1,73 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Server hardware makers shift production out of China) -[#]: via: (https://www.networkworld.com/article/3409784/server-hardware-makers-shift-production-out-of-china.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Server hardware makers shift production out of China -====== -Tariffs on Chinese products and unstable U.S./China relations cause server makers to speed up their move out of China. -![Etereuti \(CC0\)][1] - -The supply chain of vendors that build servers and network communication devices is accelerating its shift of production out of China to Taiwan and North America, along with other nations not subject to the trade war between the U.S. and China. - -Last May, the Trump Administration levied tariffs on a number of imported Chinese goods, computer components among them. The tariffs ranged from 10-25%. Consumers were hit hardest, since they are more price sensitive than IT buyers. PC World said the [average laptop price could rise by $120][2] just for the tariffs. - -But since the tariff was based on the value of the product, that means server hardware prices could skyrocket, since servers cost much more than PCs. - -**[ Read also: [HPE’s CEO lays out his technology vision][3] ]** - -### Companies that are moving production out of China - -The Taiwanese tech publication DigiTimes reported (article now locked behind a paywall) that Mitac Computing Technology, a server ODM, reactivated an old production line at Hsinchu Science Park (HSP) in Taiwan at the end of 2018 and restarted another for motherboard SMT process in March 2019. The company plans to establish one more SMT production line prior to the end of 2019. - -It went on to say Mitac plans to produce all of its high-end U.S.-bound servers in Taiwan and is looking to move 30% of its overall server production lines back to Taiwan in the next three years. - -Wiwynn, a cloud computing server subsidiary of Wistron, is primarily assembling its U.S.-bound servers in Mexico and has also recently established a production site in southern Taiwan per clients' requests. - -Taiwan-based server chassis and assembly player AIC recently expanded the number of its factories in Taiwan to four and has been aggressively forming cooperation with its partners to expand its capacity. Many Taiwan-based component suppliers are also expanding their capacity in Taiwan. - -**[ [Get certified as an Apple Technical Coordinator with this seven-part online course from PluralSight.][4] ]** - -Several ODMs, such as Inventec, Wiwynn, Wistron, and Foxconn, all have plants in Mexico, while Quanta Computer has production lines in the U.S. Wiwynn also plans to open manufacturing facilities in eastern U.S. - -“This is not something that just happened overnight, it’s a process that started a few years ago. The tariffs just accelerated the desire of ODMs to do it,” said Ashish Nadkarni, group vice president for infrastructure systems, platforms and technologies at IDC. “Since [President] Trump has come into office there has been saber rattling about China and a trade war. There has also been a focus on margins.” - -He added that component makers are definitely moving out of China to other parts of Asia, like Korea, the Philippines, and Vietnam. - -### HPE, Dell and Lenovo should remain unaffected - -The big three branded server makers are all largely immunized against the tariffs. HP Enterprise, Dell, and Lenovo all have U.S.-based assemblies and their contract manufacturers are in Taiwan, said Nadkarni. So, their costs should remain unaffected by tariffs. - -The tariffs are not affecting sales as much as revenue for hyperscale whitebox vendors is being stressed. Hyperscale companies such as Amazon Web Services (AWS), Microsoft, Google, etc. have contracts with vendors such as Inspur and Super Micro, and if prices fluctuate, that’s not their problem. The hardware vendor is expected to deliver at the agreed cost. - -So margins, already paper thin, can’t be passed on to the customer, unlike the aforementioned laptop example. - -“It’s not the end customers who are affected by it, it’s the vendors who are affected by it. Certain things they can pass on, like component prices. But if the build value goes up, that’s not the customers problem, that’s the vendor’s problem,” said Nadkarni. - -So while it may cost you more to buy a laptop as this trade fracas goes on, it shouldn’t cost more to buy a server. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3409784/server-hardware-makers-shift-production-out-of-china.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/07/asia_china_flag_grunge-stars_pixabay_etereuti-100763424-large.jpg -[2]: https://www.pcworld.com/article/3403405/trump-tariffs-on-chinese-goods-could-cost-you-120-more-for-notebook-pcs-say-dell-hp-and-cta.html -[3]: https://www.networkworld.com/article/3394879/hpe-s-ceo-lays-out-his-technology-vision.html -[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fapple-certified-technical-trainer-10-11 -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190717 How edge computing is driving a new era of CDN.md b/sources/talk/20190717 How edge computing is driving a new era of CDN.md deleted file mode 100644 index 643d3aa713..0000000000 --- a/sources/talk/20190717 How edge computing is driving a new era of CDN.md +++ /dev/null @@ -1,107 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How edge computing is driving a new era of CDN) -[#]: via: (https://www.networkworld.com/article/3409027/how-edge-computing-is-driving-a-new-era-of-cdn.html) -[#]: author: (Matt Conran https://www.networkworld.com/author/Matt-Conran/) - -How edge computing is driving a new era of CDN -====== -A CDN is an edge application and an edge application is a superset of what your CDN is doing. -![geralt \(CC0\)][1] - -We are living in a hyperconnected world where anything can now be pushed to the cloud. The idea of having content located in one place, which could be useful from the management’s perspective, is now redundant. Today, the users and data are omnipresent. - -The customer’s expectations have up-surged because of this evolution. There is now an increased expectation of high-quality service and a decrease in customer’s patience. In the past, one could patiently wait 10 hours to download the content. But this is certainly not the scenario at the present time. Nowadays we have high expectations and high-performance requirements but on the other hand, there are concerns as well. The internet is a weird place, with unpredictable asymmetric patterns, buffer bloat and a list of other [performance-related problems][2] that I wrote about on Network Insight. _[Disclaimer: the author is employed by Network Insight.]_ - -Also, the internet is growing at an accelerated rate. By the year 2020, the internet is expected to reach 1.5 Gigabyte of traffic per day per person. In the coming times, the world of the Internet of Things (IoT) driven by objects will far supersede these data figures as well. For example, a connected airplane will generate around 5 Terabytes of data per day. This spiraling level of volume requires a new approach to data management and forces us to re-think how we delivery applications. - -[RELATED: How Notre Dame is going all in with Amazon’s cloud][3] - -Why? Because all this information cannot be processed by a single cloud or an on-premise location. Latency will always be a problem. For example, in virtual reality (VR) anything over 7 milliseconds will cause motion sickness. When decisions are required to be taken in real-time, you cannot send data to the cloud. You can, however, make use of edge computing and a multi-CDN design. - -### Introducing edge computing and multi-CDN - -The rate of cloud adoption, all-things-video, IoT and edge computing are bringing life back to CDNs and multi-CDN designs. Typically, a multi-CDN is an implementation pattern that includes more than one CDN vendor. The traffic direction is performed by using different metrics, whereby traffic can either be load balanced or failed across the different vendors. - -Edge computing moves actions as close as possible to the source. It is the point where the physical world interacts with the digital world. Logically, the decentralized approach of edge computing will not take over the centralized approach. They will be complementary to each other, so that the application can run at its peak level, depending on its position in the network. - -For example, in IoT, saving battery life is crucial. Let’s assume an IoT device can conduct the transaction in 10ms round trip time (RTT), instead of 100ms RTT. As a result, it can use 10 times less battery. - -### The internet, a performance bottleneck - -The internet is designed on the principle that everyone can talk to everyone, thereby providing universal connectivity whether required or not. There has been a number of design changes with network address translation (NAT) being the biggest. However, essentially the role of the internet has remained the same in terms of connectivity, regardless of location. - -With this type of connectivity model, distance is an important determinant for the application’s performance. Users on the other side of the planet will suffer regardless of buffer sizes or other device optimizations. Long RTT is experienced as packets go back and forth before the actual data transmission. Although caching and traffic redirection is being used but limited success has been achieved so far. - -### The principles of application delivery - -When transmission control protocol (TCP) starts, it thinks it is back in the late 1970s. It assumes that all services are on a local area network (LAN) and there is no packet loss. It then starts to work backward from there. Back when it was designed, we didn't have real-time traffic, such as voice and video that is latency and jitter sensitive. - -Ideally, TCP was designed for the ease of use and reliability, not to boost the performance. You actually need to optimize the TCP stack. And this is why CDNs are very good at performing such tasks. For example, if a connection is received from a mobile phone, a CDN will start with the assumption that there is going to be high jitter and packet loss. This allows them to size the TCP window correctly that accurately match network conditions. - -How do you magnify the performance, what options do you have? In a generic sense, many look to lowering the latency. However, with applications, such as video streaming, latency does not tell you if the video is going to buffer. One can only assume that lower latency will lead to less buffering. In such a scenario, measurement-based on throughput is a far better performance metric since will tell you how fast an object will load. - -We have also to consider the page load times. At the network level, it's the time to first byte (TTFB) and ping. However, these mechanisms don’t tell you much about the user experience as everything fits into one packet. Using ping will not inform you about the bandwidth problems. - -And if a web page goes slower by 25% once packet loss exceeds 5% and you are measuring time to the first byte which is the 4th packet - what exactly can you learn? TTFB is comparable to an internet control message protocol (ICMP) request just one layer up the stack. It's good if something is broken but not if there is underperformance issue. - -When you examine the history of TTFB measuring, you will find that it was deployed due to the lack of Real User Monitoring (RUM) measurements. Previously TTFB was as good in approximating how fast something was going to load, but we don't have to approximate anymore as we can measure it with RUM. RUM is measurements from the end-users. An example could be the metrics generated from a webpage that is being served to an actual user. - -Conclusively, TTFB, ping and page load times are not sophisticated measurements. We should prefer RUM time measurements as much as we can. This provides a more accurate picture of the user experience. This is something which has become critical over the last decade. - -Now we are living in a world of RUM which lets us build our network based on what matters to the business users. All CDNs should aim for RUM measurements. For this, they may need to integrate with traffic management systems that intelligently measure on what the end-user really sees. - -### The need for multi-CDN - -Primarily, the reasons one would opt for a multi-CDN environment are availability and performance. No single CDN can be the fastest to everyone and everywhere in the world. It is impossible due to the internet's connectivity model. However, combining the best of two or even more CDN providers will increase the performance. - -A multi-CDN will give a faster performance and higher availability than what can be achieved with a single CDN. A good design is what runs two availability zones. A better design is what runs two availability zones with a single CDN provider. However, superior design is what runs two availability zones in a multi-CDN environment. - -### Edge applications will be the new norm - -It’s not that long ago that there was a transition from the heavy physical monolithic architecture to the agile cloud. But all that really happened was the transition from the physical appliance to a virtual cloud-based appliance. Maybe now is the time that we should ask, is this the future that we really want? - -One of the main issues in introducing edge applications is the mindset. It is challenging to convince yourself or your peers that the infrastructure you have spent all your time working on and investing in is not the best way forward for your business.  - -Although the cloud has created a big buzz, just because you migrate to the cloud does not mean that your applications will run faster. In fact, all you are really doing is abstracting the physical pieces of the architecture and paying someone else to manage it. The cloud has, however, opened the door for the edge application conversation. We have already taken the first step to the cloud and now it's time to make the second move. - -Basically, when you think about edge applications: its simplicity is a programmable CDN. A CDN is an edge application and an edge application is a superset of what your CDN is doing. Edge applications denote cloud computing at the edge. It is a paradigm to distribute the application closer to the source for lower latency, additional resilience, and simplified infrastructure, where you still have control and privacy. - -From an architectural point of view, an edge application provides more resilience than deploying centralized applications. In today's world of high expectations, resilience is a necessity for the continuity of business. Edge applications allow you to collapse the infrastructure into an architecture that is cheaper, simpler and more attentive to the application. The less in the expanse of infrastructure, the more time you can focus on what really matters to your business - the customer. - -### An example of an edge architecture - -An example of edge architecture is within each PoP, every application has its own isolated JavaScript (JS) environment. JavaScript is great for security isolation and the performance guarantees scale. The JavaScript is a dedicated isolated instance that executes the code at the edge. - -Most likely, each JavaScript has its own virtual machine (VM). The sole operation that the VM is performing is the JavaScript runtime engine and the only thing it is running is the customer's code. One could use Google V8 open-source high-performance JavaScript and WebAssembly engine. - -Let’s face it, if you continue building more PoPs, you will hit the law of diminishing returns. When it comes to application such as mobile, you really are maxed out when throwing PoPs to form a solution. So we need to find another solution. - -In the coming times, we are going to witness a trend where most applications will become global, which means edge applications. It certainly makes little sense to place all the application in one location when your users are everywhere else. - -**This article is published as part of the IDG Contributor Network. [Want to Join?][4]** - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3409027/how-edge-computing-is-driving-a-new-era-of-cdn.html - -作者:[Matt Conran][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Matt-Conran/ -[b]: https://github.com/lujun9972 -[1]: https://images.techhive.com/images/article/2017/02/network-traffic-100707086-large.jpg -[2]: https://network-insight.net/2016/12/buffers-packet-drops/ -[3]: https://www.networkworld.com/article/3014599/cloud-computing/how-notre-dame-is-going-all-in-with-amazon-s-cloud.html#tk.nww-fsb -[4]: https://www.networkworld.com/contributor-network/signup.html -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190717 Public internet should be all software-defined.md b/sources/talk/20190717 Public internet should be all software-defined.md deleted file mode 100644 index 3b834bea66..0000000000 --- a/sources/talk/20190717 Public internet should be all software-defined.md +++ /dev/null @@ -1,73 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Public internet should be all software-defined) -[#]: via: (https://www.networkworld.com/article/3409783/public-internet-should-be-all-software-defined.html) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Public internet should be all software-defined -====== -Having a programmable public internet will correct inefficiencies in the current system, engineers at NOIA say. -![Thinkstock][1] - -The public internet should migrate to a programmable backbone-as-a-service architecture, says a team of network engineers behind NOIA, a startup promising to revolutionize global traffic. They say the internet will be more efficient if internet protocols and routing technologies are re-worked and then combined with a traffic-trading blockchain. - -It’s “impossible to use internet for modern applications,” the company says on its website. “Almost all global internet companies struggle to ensure uptime and reliable user experience.” - -That’s because modern techniques aren’t being introduced fully, NOIA says. The engineers say algorithms should be implemented to route traffic and that segment routing technology should be adopted. Plus, blockchain should be instigated to trade internet transit capacity. A “programmable internet solves the web’s inefficiencies,” a representative from NOIA told me. - -**[ Read also: [What is IPv6, and why aren’t we there yet?][2] ]** - -### Deprecate the public internet - -NOIA has started introducing a caching, distributed content delivery application to improve website loading times, but it wants to ultimately deprecate the existing internet completely. - -The company currently has 353 active cache nodes around the world, with a total 27 terabytes of storage for that caching system—NOIA clients contribute spare bandwidth and storage. It’s also testing a network backbone using four providers with European and American locations that it says will be the [development environment for its envisaged software-defined and radical internet replacement][3]. - -### The problem with today's internet - -The “internet is a mesh of tangled up cables,” [NOIA says][4]. “Thousands of physically connected networks” are involved. Any configuration alterations in any of the jumble of networks causes issues with the protocols, it explains. The company is referring to Border Gateway Protocol (BGP), which lets routers discover paths to IP addresses through the disparate network. Because BGP only forwards to a neighboring router, it doesn’t manage the entire route. That introduces “severe variability” or unreliability. - -“It is impossible to guarantee service reliability without using overlay networks. Low-latency, performance-critical applications, and games cannot operate on public Internet,” the company says. - -### How a software-defined internet works - -NOIA's idea is to use [IPv6][5], the latest internet protocol. IPv6 features an expanded packet size and allows custom headers. The company then adds segment routing to create Segment Routing over IPv6 (SRv6). That SRv6 combo adds routing information to each data packet sent—a packet-level programmable network, in other words. - -Segment routing, roughly, is an updated internet protocol that lets routers comprehend routing information in packet headers and then perform the routing. Cisco has been using it, too. - -NOIA’s network then adds the SRv6 amalgamation to distributed ledger technology (blockchain) in order to let ISPs and data centers buy and sell the routes—buyers can choose their routes in the exchange, too. - -In addition to trade, blockchain introduces security. It's worth noting that routings aren’t the only internet technologies that could be disrupted due to blockchain. In April I wrote about [organizations that propose moving data storage transactions over to distributed ledgers][6]. They say that will be more secure than anything seen before. [Ethernet’s lack of inherent security could be corrected by smart contract, trackable verifiable transactions][7], say some. And, of course, supply chain, the automotive vertical, and the selling of sensor data overall may emerge as [use-contenders for secure, blockchain in the internet of things][8]. - -In NOIA’s case, with SRv6 blended with distributed ledgers, the encrypted ledger holds the IP addresses, but it is architecturally decentralized—no one controls it. That’s one element of added security, along with the aforementioned trading, provided by the ledger. - -That trading could handle the question of who’s paying for all this. However, NOIA says current internet hardware will be able to understand the segment routings, so no new equipment investments are needed. - -Join the Network World communities on [Facebook][9] and [LinkedIn][10] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3409783/public-internet-should-be-all-software-defined.html - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/05/dns_browser_http_web_internet_thinkstock-100758191-large.jpg -[2]: https://www.networkworld.com/article/3254575/lan-wan/what-is-ipv6-and-why-aren-t-we-there-yet.html -[3]: https://medium.com/noia/development-update-06-20-07-04-2879f9fce3cb -[4]: https://noia.network/ -[5]: https://www.networkworld.com/article/3254575/what-is-ipv6-and-why-aren-t-we-there-yet.html -[6]: https://www.networkworld.com/article/3390722/how-data-storage-will-shift-to-blockchain.html -[7]: https://www.networkworld.com/article/3356496/how-blockchain-will-manage-networks.html -[8]: https://www.networkworld.com/article/3330937/how-blockchain-will-transform-the-iot.html -[9]: https://www.facebook.com/NetworkWorld/ -[10]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190718 Worst DNS attacks and how to mitigate them.md b/sources/talk/20190718 Worst DNS attacks and how to mitigate them.md deleted file mode 100644 index b490eeeea1..0000000000 --- a/sources/talk/20190718 Worst DNS attacks and how to mitigate them.md +++ /dev/null @@ -1,151 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Worst DNS attacks and how to mitigate them) -[#]: via: (https://www.networkworld.com/article/3409719/worst-dns-attacks-and-how-to-mitigate-them.html) -[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) - -Worst DNS attacks and how to mitigate them -====== -DNS threats, including DNS hijacking, tunneling, phishing, cache poisoning and DDoS attacks, are all on the rise. -![Max Bender \(CC0\)][1] - -The Domain Name System remains under constant attack, and there seems to be no end in sight as threats grow increasingly sophisticated. - -DNS, known as the internet’s phonebook, is part of the global internet infrastructure that translates between familiar names and the numbers computers need to access a website or send an email. While DNS has long been the target of assailants looking to steal all manner of corporate and private information, the threats in the [past year][2] or so indicate a worsening of the situation. - -**More about DNS:** - - * [DNS in the cloud: Why and why not][3] - * [DNS over HTTPS seeks to make internet use more private][4] - * [How to protect your infrastructure from DNS cache poisoning][5] - * [ICANN housecleaning revokes old DNS security key][6] - - - -IDC reports that 82% of companies worldwide have faced a DNS attack over the past year. The research firm recently published its fifth annual [Global DNS Threat Report][7], which is based on a survey IDC conducted on behalf of DNS security vendor EfficientIP of 904 organizations across the world during the first half of 2019. - -According to IDC's research, the average costs associated with a DNS attack rose by 49% compared to a year earlier. In the U.S., the average cost of a DNS attack tops out at more than $1.27 million. Almost half of respondents (48%) report losing more than $500,000 to a DNS attack, and nearly 10% say they lost more than $5 million on each breach. In addition, the majority of U.S. organizations say that it took more than one day to resolve a DNS attack. - -“Worryingly, both in-house and cloud applications were damaged, with growth of over 100% for in-house application downtime, making it now the most prevalent damage suffered,” IDC wrote. "DNS attacks are moving away from pure brute-force to more sophisticated attacks acting from the internal network. This will force organizations to use intelligent mitigation tools to cope with insider threats." - -### Sea Turtle DNS hijacking campaign - -An ongoing DNS hijacking campaign known as Sea Turtle is one example of what's occuring in today's DNS threat landscape. - -This month, [Cisco Talos][8] security researchers said the people behind the Sea Turtle campaign have been busy [revamping their attacks][9] with new infrastructure and going after new victims. - -**[ [Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][10] ]** - -In April, Talos released a [report detailing][11] Sea Turtle and calling it the “first known case of a domain name registry organization that was compromised for cyber espionage operations.” Talos says the ongoing DNS threat campaign is a state-sponsored attack that abuses DNS to harvest credentials to gain access to sensitive networks and systems in a way that victims are unable to detect, which displays unique knowledge on how to manipulate DNS. - -By obtaining control of victims’ DNS, the attackers can change or falsify any data on the Internet and illicitly modify DNS name records to point users to actor-controlled servers; users visiting those sites would never know, Talos reports.  - -The hackers behind Sea Turtle appear to have regrouped after the April report from Talos and are redoubling their efforts with new infrastructure – a move Talos researchers find to be unusual: “While many actors will slow down once they are discovered, this group appears to be unusually brazen, and will be unlikely to be deterred going forward,” Talos [wrote][9] in July. - -“Additionally, we discovered a new DNS hijacking technique that we assess with moderate confidence is connected to the actors behind Sea Turtle. This new technique is similar in that the threat actors compromise the name server records and respond to DNS requests with falsified A records,” Talos stated.  - -“This new technique has only been observed in a few highly targeted operations. We also identified a new wave of victims, including a country code top-level domain (ccTLD) registry, which manages the DNS records for every domain [that] uses that particular country code; that access was used to then compromise additional government entities. Unfortunately, unless there are significant changes made to better secure DNS, these sorts of attacks are going to remain prevalent,” Talos wrote. - -### DNSpionage attack upgrades its tools - -Another newer threat to DNS comes in the form of an attack campaign called [DNSpionage][12].  - -DNSpionage initially used two malicious websites containing job postings to compromise targets via crafted Microsoft Office documents with embedded macros. The malware supported HTTP and DNS communication with the attackers. And the attackers are continuing to develop new assault techniques. - -“The threat actor's ongoing development of DNSpionage malware shows that the attacker continues to find new ways to avoid detection. DNS tunneling is a popular method of exfiltration for some actors, and recent examples of DNSpionage show that we must ensure DNS is monitored as closely as an organization's normal proxy or weblogs,” [Talos wrote][13]. “DNS is essentially the phonebook of the internet, and when it is tampered with, it becomes difficult for anyone to discern whether what they are seeing online is legitimate.” - -The DNSpionage campaign targeted various businesses in the Middle East as well as United Arab Emirates government domains. - -“One of the biggest problems with DNS attacks or the lack of protection from them is complacency,” said Craig Williams, director of Talos outreach. Companies think DNS is stable and that they don’t need to worry about it. “But what we are seeing with attacks like DNSpionage and Sea Turtle are kind of the opposite, because attackers have figured out how to use it to their advantage – how to use it to do damage to credentials in a way, in the case of Sea Turtle, that the victim never even knows it happened. And that’s a real potential problem.” - -If you know, for example, your name server has been compromised, then you can force everyone to change their passwords. But if instead they go after the registrar and the registrar points to the bad guy’s name, you never knew it happened because nothing of yours was touched – that’s why these new threats are so nefarious, Williams said. - -“Once attackers start using it publicly, successfully, other bad guys are going to look at it and say, ‘Hey, why don't I use that to harvest a bunch of credentials from the sites I am interested in,’” Williams said. - -### **The DNS IoT risk** - -Another developing risk would be the proliferation of IoT devices.  The Internet Corporation for Assigned Names and Numbers (ICANN) recently wrote a [paper on the risk that IoT brings to DNS][14].  - -“The IoT is a risk to the DNS because various measurement studies suggest that IoT devices could stress the DNS infrastructure in ways that we have not seen before,” ICANN stated.   “For example, a software update for a popular IP-enabled IoT device that causes the device to use the DNS more frequently (e.g., regularly lookup random domain names to check for network availability) could stress the DNS in individual networks when millions of devices automatically install the update at the same time.” - -While this is a programming error from the perspective of individual devices, it could result in a significant attack vector from the perspective of DNS infrastructure operators. Incidents like this have already occurred on a small scale, but they may occur more frequently in the future due to the growth of heterogeneous IoT devices from manufacturers that equip their IoT devices with controllers that use the DNS, ICANN stated. - -ICANN also suggested that IoT botnets will represent an increased threat to DNS operators. “Larger DDoS attacks, partly because IoT bots are more difficult to eradicate. Current botnet sizes are on the order of hundreds of thousands. The most well-known example is the Mirai botnet, which involved 400K (steady-state) to 600K (peak) infected IoT devices.  The Hajime botnet hovers around 400K infected IoT devices, but has not launched any DDoS attacks yet. With the growth of the IoT, these attacks may grow to involve millions of bots and as a result larger DDoS attacks. - -### **DNS security warnings grow** - -The UK's [National Cyber Security Centre (NCSC)][15] issued a warning this month about ongoing DNS attacks, particularly focusing on DNS hijacking. It cited a number of risks associated with the uptick in DNS hijacking including: - -**Creating malicious DNS records.** A malicious DNS record could be used, for example, to create a phishing website that is present within an organization’s familiar domain. This may be used to phish employees or customers. - -**Obtaining SSL certificates.** Domain-validated SSL certificates are issued based on the creation of DNS records; thus an attacker may obtain valid SSL certificates for a domain name, which could be used to create a phishing website intended to look like an authentic website, for example. - -**Transparent proxying.** One serious risk employed recently involves transparently proxying traffic to intercept data. The attacker modifies an organization’s configured domain zone entries (such as “A” or “CNAME” records) to point traffic to their own IP address, which is infrastructure they manage. - -“An organization may lose total control of their domain and often the attackers will change the domain ownership details making it harder to recover,” the NCSC wrote. - -These new threats, as well as other dangers, led the U.S. government to issue a warning earlier this year about DNS attacks on federal agencies.  - -The Department of Homeland Security’s Cybersecurity and Infrastructure Security Agency (CISA) told all federal agencies to bolt down their DNS in the face of a series of global hacking campaigns. - -CISA said in its [Emergency Directive][16] that it was tracking a series of incidents targeting DNS infrastructure. CISA wrote that it “is aware of multiple executive branch agency domains that were impacted by the tampering campaign and has notified the agencies that maintain them.” - -CISA says that attackers have managed to intercept and redirect web and mail traffic and could target other networked services. The agency said the attacks start with compromising user credentials of an account that can make changes to DNS records.  Then the attacker alters DNS records, like Address, Mail Exchanger, or Name Server records, replacing the legitimate address of the services with an address the attacker controls. - -These actions let the attacker direct user traffic to their own infrastructure for manipulation or inspection before passing it on to the legitimate service, should they choose. This creates a risk that persists beyond the period of traffic redirection, CISA stated.  - -“Because the attacker can set DNS record values, they can also obtain valid encryption certificates for an organization’s domain names. This allows the redirected traffic to be decrypted, exposing any user-submitted data. Since the certificate is valid for the domain, end users receive no error warnings,” CISA stated. - -### **Get on the DNSSEC bandwagon** - -“Enterprises that are potential targets – in particular those that capture or expose user and enterprise data through their applications – should heed this advisory by the NSCS and should pressure their DNS and registrar vendors to make DNSSEC and other domain security best practices easy to implement and standardized,” said Kris Beevers, co-founder and CEO of DNS security vendor [NS1][17]. “They can easily implement DNSSEC signing and other domain security best practices with technologies in the market today. At the very least, they should work with their vendors and security teams to audit their implementations.” - -DNSSEC was in the news earlier this year when in response to increased DNS attacks, ICANN called for an intensified community effort to install stronger DNS security technology.  - -Specifically, ICANN wants full deployment of the Domain Name System Security Extensions ([DNSSEC][18]) across all unsecured domain names. DNSSEC adds a layer of security on top of DNS. Full deployment of DNSSEC ensures end users are connecting to the actual web site or other service corresponding to a particular domain name, ICANN said. “Although this will not solve all the security problems of the Internet, it does protect a critical piece of it – the directory lookup – complementing other technologies such as SSL (https:) that protect the ‘conversation’, and provide a platform for yet-to-be-developed security improvements,” ICANN stated. - -DNSSEC technologies have been around since about 2010 but are not widely deployed, with less than 20% of the world’s DNS registrars having deployed it, according to the regional internet address registry for the Asia-Pacific region ([APNIC][19]). - -DNSSEC adoption has been lagging because it was viewed as optional and can require a tradeoff between security and functionality, said NS1's Beevers. - -### **Traditional DNS threats** - -While DNS hijacking may be the front line attack method, other more traditional threats still exist.  - -The IDC/EfficientIP study found most popular DNS threats have changed compared with last year. Phishing (47%) is now more popular than last year’s favorite, DNS-based malware (39%), followed by DDoS attacks (30%), false positive triggering (26%), and lock-up domain attacks (26%). - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3409719/worst-dns-attacks-and-how-to-mitigate-them.html - -作者:[Michael Cooney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Michael-Cooney/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/08/anonymous_faceless_hooded_mand_in_scary_halloween_mask_finger_to_lips_danger_threat_stealth_attack_hacker_hush_silence_warning_by_max_bender_cc0_via_unsplash_1200x800-100766358-large.jpg -[2]: https://www.fireeye.com/blog/threat-research/2019/01/global-dns-hijacking-campaign-dns-record-manipulation-at-scale.html -[3]: https://www.networkworld.com/article/3273891/hybrid-cloud/dns-in-the-cloud-why-and-why-not.html -[4]: https://www.networkworld.com/article/3322023/internet/dns-over-https-seeks-to-make-internet-use-more-private.html -[5]: https://www.networkworld.com/article/3298160/internet/how-to-protect-your-infrastructure-from-dns-cache-poisoning.html -[6]: https://www.networkworld.com/article/3331606/security/icann-housecleaning-revokes-old-dns-security-key.html -[7]: https://www.efficientip.com/resources/idc-dns-threat-report-2019/ -[8]: https://www.talosintelligence.com/ -[9]: https://blog.talosintelligence.com/2019/07/sea-turtle-keeps-on-swimming.html -[10]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr -[11]: https://blog.talosintelligence.com/2019/04/seaturtle.html -[12]: https://www.networkworld.com/article/3390666/cisco-dnspionage-attack-adds-new-tools-morphs-tactics.html -[13]: https://blog.talosintelligence.com/2019/04/dnspionage-brings-out-karkoff.html -[14]: https://www.icann.org/en/system/files/files/sac-105-en.pdf -[15]: https://www.ncsc.gov.uk/news/ongoing-dns-hijacking-and-mitigation-advice -[16]: https://cyber.dhs.gov/ed/19-01/ -[17]: https://ns1.com/ -[18]: https://www.icann.org/resources/pages/dnssec-qaa-2014-01-29-en -[19]: https://www.apnic.net/ diff --git a/sources/talk/20190724 Data centers may soon recycle heat into electricity.md b/sources/talk/20190724 Data centers may soon recycle heat into electricity.md deleted file mode 100644 index 92298e1a01..0000000000 --- a/sources/talk/20190724 Data centers may soon recycle heat into electricity.md +++ /dev/null @@ -1,67 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Data centers may soon recycle heat into electricity) -[#]: via: (https://www.networkworld.com/article/3410578/data-centers-may-soon-recycle-heat-into-electricity.html) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Data centers may soon recycle heat into electricity -====== -Rice University researchers are developing a system that converts waste heat into light and then that light into electricity, which could help data centers reduce computing costs. -![Gordon Mah Ung / IDG][1] - -Waste heat is the scurge of computing. In fact, much of the cost of powering a computer is from creating unwanted heat. That’s because the inefficiencies in electronic circuits, caused by resistance in the materials, generates that heat. The processors, without computing anything, are essentially converting expensively produced electrical energy into waste energy. - -It’s a fundamental problem, and one that hasn’t been going away. But what if you could convert the unwanted heat back into electricity—recycle the heat back into its original energy form? The data center heat, instead of simply disgorging into the atmosphere to be gotten rid of with dubious eco-effects, could actually run more machines. Plus, your cooling costs would be taken care of—there’s nothing to cool because you’ve already grabbed the hot air. - -**[ Read also: [How server disaggregation can boost data center efficiency][2] | Get regularly scheduled insights: [Sign up for Network World newsletters][3] ]** - -Scientists at Rice Univeristy are trying to make that a reality by developing heat scavenging and conversion solutions. - -Currently, the most efficient way to convert heat into electricity is through the use of traditional turbines. - -Turbines “can give you nearly 50% conversion efficiency,” says Chloe Doiron, a graduate student at Rice University and co-lead on the project, in a [news article][4] on the school’s website. Turbines convert the kinetic energy of moving fluids, like steam or combustion gases, into mechanical energy. The moving steam then shifts blades mounted on a shaft, which turns a generator, thus creating the power. - -Not a bad solution. The problem, though, is “those systems are not easy to implement,” the researchers explain. The issue is that turbines are full of moving parts, and they’re big, noisy, and messy. - -### Thermal emitter better than turbines for converting heat to energy - -A better option would be a solid-state, thermal device that could absorb heat at the source and simply convert it, perhaps straight into attached batteries. - -The researchers say a thermal emitter could absorb heat, jam it into tight, easy-to-capture bandwidth and then emit it as light. Cunningly, they would then simply turn the light into electricity, as we see all the time now in solar systems. - -“Thermal photons are just photons emitted from a hot body,” says Rice University professor Junichiro Kono in the article. “If you look at something hot with an infrared camera, you see it glow. The camera is capturing these thermally excited photons.” Indeed, all heated surfaces, to some extent, send out light as thermal radiation. - -The Rice team wants to use a film of aligned carbon nanotubes to do the job. The test system will be structured as an actual solar panel. That’s because solar panels, too, lose energy through heat, so are a good environment in which to work. The concept applies to other inefficient technologies, too. “Anything else that loses energy through heat [would become] far more efficient,” the researchers say. - -Around 20% of industrial energy consumption is unwanted heat, Doiron says. That's a lot of wasted energy. - -### Other heat conversion solutions - -Other heat scavenging devices are making inroads, too. Now-commercially available thermoelectric technology can convert a temperature difference into power, also with no moving parts. They function by exposing a specially made material to heat. [Electrons flow when one part is cold and one is hot][5]. And the University of Utah is working on [silicon for chips that generates electricity][6] as one of two wafers heat up. - -Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3410578/data-centers-may-soon-recycle-heat-into-electricity.html - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/07/flir_20190711t191326-100801627-large.jpg -[2]: https://www.networkworld.com/article/3266624/how-server-disaggregation-could-make-cloud-datacenters-more-efficient.html -[3]: https://www.networkworld.com/newsletters/signup.html -[4]: https://news.rice.edu/2019/07/12/rice-device-channels-heat-into-light/ -[5]: https://www.networkworld.com/article/2861438/how-to-convert-waste-data-center-heat-into-electricity.html -[6]: https://unews.utah.edu/beat-the-heat/ -[7]: https://www.facebook.com/NetworkWorld/ -[8]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190724 Reports- As the IoT grows, so do its threats to DNS.md b/sources/talk/20190724 Reports- As the IoT grows, so do its threats to DNS.md deleted file mode 100644 index d9647304b9..0000000000 --- a/sources/talk/20190724 Reports- As the IoT grows, so do its threats to DNS.md +++ /dev/null @@ -1,78 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Reports: As the IoT grows, so do its threats to DNS) -[#]: via: (https://www.networkworld.com/article/3411437/reports-as-the-iot-grows-so-do-its-threats-to-dns.html) -[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) - -Reports: As the IoT grows, so do its threats to DNS -====== -ICANN and IBM's security researchers separately spell out how the growth of the internet of things will increase opportunities for malicious actors to attack the Domain Name System with hyperscale botnets and worm their malware into the cloud. -The internet of things is shaping up to be a more significant threat to the Domain Name System through larger IoT botnets, unintentional adverse effects of IoT-software updates and the continuing development of bot-herding software. - -The Internet Corporation for Assigned Names and Numbers (ICANN) and IBM’s X-Force security researchers have recently issued reports outlining the interplay between DNS and IoT that includes warnings about the pressure IoT botnets will put on the availability of DNS systems. - -**More about DNS:** - - * [DNS in the cloud: Why and why not][1] - * [DNS over HTTPS seeks to make internet use more private][2] - * [How to protect your infrastructure from DNS cache poisoning][3] - * [ICANN housecleaning revokes old DNS security key][4] - - - -ICANN’s Security and Stability Advisory Committee (SSAC) wrote in a [report][5] that “a significant number of IoT devices will likely be IP enabled and will use the DNS to locate the remote services they require to perform their functions. As a result, the DNS will continue to play the same crucial role for the IoT that it has for traditional applications that enable human users to interact with services and content,” ICANN stated. “The  role of  the  DNS  might  become  even  more  crucial  from  a  security  and  stability perspective with IoT devices interacting with people’s physical environment.” - -IoT represents both an opportunity and a risk to the DNS, ICANN stated. “It is an opportunity because the DNS provides functions and data that can help make the IoT more secure, stable, and transparent, which is critical given the IoT's interaction with the physical world. It is a risk because various measurement studies suggest that IoT devices may stress the DNS, for instance, because of complex DDoS attacks carried out by botnets that grow to hundreds of thousands or in the future millions of infected IoT devices within hours,” ICANN stated. - -Unintentional DDoS attacks - -One risk is that the IoT could place new burdens on the DNS. “For example, a software update for a popular IP-enabled IoT device that causes the device to use the DNS more frequently (e.g., regularly lookup random domain names to check for network availability) could stress the DNS in individual networks when millions of devices automatically install the update at the same time,” ICANN stated. - -While this is a programming error from the perspective of individual devices, it could result in a significant attack vector from the perspective of DNS infrastructure operators. Incidents like this have already occurred on a small scale, but they may occur more frequently in the future due to the growth of heterogeneous IoT devices from manufacturers that equip their IoT devices with controllers that use the DNS, ICANN stated. - -Massively larger botnets, threat to clouds - -The report also suggested that the scale of IoT botnets could grow from hundreds of thousands of devices to millions. The best known IoT botnet is Mirai, responsible for DDoS attacks involving 400,000 to 600,000 devices. The Hajime botnet hovers around 400K infected IoT devices but has not launched any DDoS attacks yet. But as the IoT grows, so will the botnets and as a result larger DDoS attacks. - -Cloud-connected IoT devices could endanger cloud resources. “IoT devices connected to cloud architecture could allow Mirai adversaries to gain access to cloud servers. They could infect a server with additional malware dropped by Mirai or expose all IoT devices connected to the server to further compromise,” wrote Charles DeBeck,  a senior cyber threat intelligence strategic analyst with [IBM X-Force Incident Response][6] in a recent report.  - - “As organizations increasingly adopt cloud architecture to scale efficiency and productivity, disruption to a cloud environment could be catastrophic.” - -For enterprises that are rapidly adopting both IoT technology and cloud architecture, insufficient security controls could expose the organization to elevated risk, calling for the security committee to conduct an up-to-date risk assessment, DeBeck stated. - -Attackers continue malware development - -“Since this activity is highly automated, there remains a strong possibility of large-scale infection of IoT devices in the future,” DeBeck stated. “Additionally, threat actors are continuing to expand their targets to include new types of IoT devices and may start looking at industrial IoT devices or connected wearables to increase their footprint and profits.” - -Botnet bad guys are also developing new Mirai variants and IoT botnet malware outside of the Mirai family to target IoT devices, DeBeck stated. - -To continue reading this article register now - -[Get Free Access][7] - -[Learn More][8]   Existing Users [Sign In][7] - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3411437/reports-as-the-iot-grows-so-do-its-threats-to-dns.html - -作者:[Michael Cooney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Michael-Cooney/ -[b]: https://github.com/lujun9972 -[1]: https://www.networkworld.com/article/3273891/hybrid-cloud/dns-in-the-cloud-why-and-why-not.html -[2]: https://www.networkworld.com/article/3322023/internet/dns-over-https-seeks-to-make-internet-use-more-private.html -[3]: https://www.networkworld.com/article/3298160/internet/how-to-protect-your-infrastructure-from-dns-cache-poisoning.html -[4]: https://www.networkworld.com/article/3331606/security/icann-housecleaning-revokes-old-dns-security-key.html -[5]: https://www.icann.org/en/system/files/files/sac-105-en.pdf -[6]: https://securityintelligence.com/posts/i-cant-believe-mirais-tracking-the-infamous-iot-malware-2/?cm_mmc=OSocial_Twitter-_-Security_Security+Brand+and+Outcomes-_-WW_WW-_-SI+TW+blog&cm_mmca1=000034XK&cm_mmca2=10009814&linkId=70790642 -[7]: javascript:// -[8]: https://www.networkworld.com/learn-about-insider/ diff --git a/sources/talk/20190724 When it comes to the IoT, Wi-Fi has the best security.md b/sources/talk/20190724 When it comes to the IoT, Wi-Fi has the best security.md deleted file mode 100644 index 2b5014dfa8..0000000000 --- a/sources/talk/20190724 When it comes to the IoT, Wi-Fi has the best security.md +++ /dev/null @@ -1,88 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (When it comes to the IoT, Wi-Fi has the best security) -[#]: via: (https://www.networkworld.com/article/3410563/when-it-comes-to-the-iot-wi-fi-has-the-best-security.html) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -When it comes to the IoT, Wi-Fi has the best security -====== -It’s easy to dismiss good ol’ Wi-Fi’s role in internet of things networking. But Wi-Fi has more security advantages than other IoT networking choices. -![Ralph Gaithe / Soifer / Getty Images][1] - -When it comes to connecting internet of things (IoT) devices, there is a wide variety of networks to choose from, each with its own set of capabilities, advantages and disadvantages, and ideal use cases. Good ol’ Wi-Fi is often seen as a default networking choice, available in many places, but of limited range and not particularly suited for IoT implementations. - -According to [Aerohive Networks][2], however, Wi-Fi is “evolving to help IT address security complexities and challenges associated with IoT devices.” Aerohive sells cloud-managed networking solutions and was [acquired recently by software-defined networking company Extreme Networks for some $272 million][3]. And Aerohive's director of product marketing, Mathew Edwards, told me via email that Wi-Fi brings a number of security advantages compared to other IoT networking choices. - -It’s not a trivial problem. According to Gartner, in just the last three years, [approximately one in five organizations have been subject to an IoT-based attack][4]. And as more and more IoT devices come on line, the attack surface continues to grow quickly. - -**[ Also read: [Extreme targets cloud services, SD-WAN, Wi-Fi 6 with $210M Aerohive grab][3] and [Smart cities offer window into the evolution of enterprise IoT technology][5] ]** - -### What makes Wi-Fi more secure for IoT? - -What exactly are Wi-Fi’s IoT security benefits? Some of it is simply 20 years of technological maturity, Edwards said. - -“Extending beyond the physical boundaries of organizations, Wi-Fi has always had to be on the front foot when it comes to securely onboarding and monitoring a range of corporate, guest, and BYOD devices, and is now prepared with the next round of connectivity complexities with IoT,” he said. - -Specifically, Edwards said, “Wi-Fi has evolved … to increase the visibility, security, and troubleshooting of edge devices by combining edge security with centralized cloud intelligence.” - -Just as important, though, new Wi-Fi capabilities from a variety of vendors are designed to help identify and isolate IoT devices to integrate them into the wider network while limiting the potential risks. The goal is to incorporate IoT device awareness and protection mechanisms to prevent breaches and attacks through vulnerable headless devices. Edwards cited Aerohive’s work to “securely onboard IoT devices with its PPSK (private pre-shared key) technology, an authentication and encryption method providing 802.1X-equivalent role-based access, without the equivalent management complexities.” - -**[ [Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][6] ]** - -### The IoT is already here—and so is Wi-Fi - -Unfortunately, enterprise IoT security is not always a carefully planned and monitored operation. - -“Much like BYOD,” Edwards said, “many organizations are dealing with IoT without them even knowing it.” On the plus side, even as “IoT devices have infiltrated many networks , ... administrators are already leveraging some of the tools to protect against IoT threats without them even realizing it.” - -He noted that customers who have already deployed PPSK to secure guest and BYOD networks can easily extend those capabilities to cover IoT devices such as “smart TVs, projectors, printers, security systems, sensors and more.” - -In addition, Edwards said, “vendors have introduced methods to assign performance and security limits through context-based profiling, which is easily extended to IoT devices once the vendor can utilize signatures to identify an IoT device.” - -Once an IoT device is identified and tagged, Wi-Fi networks can assign it to a particular VLAN, set minimum and maximum data rates, data limits, application access, firewall rules, and other protections. That way, Edwards said, “if the device is lost, stolen, or launches a DDoS attack, the Wi-Fi network can kick it off, restrict it, or quarantine it.” - -### Wi-Fi still isn’t for every IoT deployment - -All that hardly turns Wi-Fi into the perfect IoT network. Relatively high costs and limited range mean it won’t find a place in many large-scale IoT implementations. But Edwards says Wi-Fi’s mature identification and control systems can help enterprises incorporate new IoT-based systems and sensors into their networks with more confidence. - -**More about 802.11ax (Wi-Fi 6)** - - * [Why 802.11ax is the next big thing in wireless][7] - * [FAQ: 802.11ax Wi-Fi][8] - * [Wi-Fi 6 (802.11ax) is coming to a router near you][9] - * [Wi-Fi 6 with OFDMA opens a world of new wireless possibilities][10] - * [802.11ax preview: Access points and routers that support Wi-Fi 6 are on tap][11] - - - -Join the Network World communities on [Facebook][12] and [LinkedIn][13] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3410563/when-it-comes-to-the-iot-wi-fi-has-the-best-security.html - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/03/hack-your-own-wi-fi_neon-wi-fi_keyboard_hacker-100791531-large.jpg -[2]: http://www.aerohive.com/ -[3]: https://www.networkworld.com/article/3405440/extreme-targets-cloud-services-sd-wan-wifi-6-with-210m-aerohive-grab.html -[4]: https://www.gartner.com/en/newsroom/press-releases/2018-03-21-gartner-says-worldwide-iot-security-spending-will-reach-1-point-5-billion-in-2018. -[5]: https://www.networkworld.com/article/3409787/smart-cities-offer-window-into-the-evolution-of-enterprise-iot-technology.html -[6]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr -[7]: https://www.networkworld.com/article/3215907/mobile-wireless/why-80211ax-is-the-next-big-thing-in-wi-fi.html -[8]: https://%20https//www.networkworld.com/article/3048196/mobile-wireless/faq-802-11ax-wi-fi.html -[9]: https://www.networkworld.com/article/3311921/mobile-wireless/wi-fi-6-is-coming-to-a-router-near-you.html -[10]: https://www.networkworld.com/article/3332018/wi-fi/wi-fi-6-with-ofdma-opens-a-world-of-new-wireless-possibilities.html -[11]: https://www.networkworld.com/article/3309439/mobile-wireless/80211ax-preview-access-points-and-routers-that-support-the-wi-fi-6-protocol-on-tap.html -[12]: https://www.facebook.com/NetworkWorld/ -[13]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190725 IoT-s role in expanding drone use.md b/sources/talk/20190725 IoT-s role in expanding drone use.md deleted file mode 100644 index a9281dcf40..0000000000 --- a/sources/talk/20190725 IoT-s role in expanding drone use.md +++ /dev/null @@ -1,61 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (IoT’s role in expanding drone use) -[#]: via: (https://www.networkworld.com/article/3410564/iots-role-in-expanding-drone-use.html) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -IoT’s role in expanding drone use -====== -Collision avoidance technology that uses internet of things (IoT) connectivity, AI, machine learning, and computer vision could be the key to expanding drone applications. -![Thinkstock][1] - -As faithful readers of [TechWatch][2] (love you, Mom) may know, the rollout of many companies’ ambitious drone delivery services has not gone as quickly as promised. Despite recent signs of progress in Australia and the United States—not to mention [clever ideas for burger deliveries to cars stuck in traffic][3]—drone delivery remains a long way from becoming a viable option in the vast majority of use cases. And the problem affects many areas of drone usage, not just the heavily hyped drone delivery applications. - -According to [Grace McKenzie][4], director of operations and controller at [Iris Automation][5], one key restriction to economically viable drone deliveries is that the “skies are not safe enough for many drone use cases.” - -Speaking at a recent [SF New Tech “Internet of Everything” event in San Francisco][6], McKenzie said fear of collisions with manned aircraft is the big reason why the Federal Aviation Association (FAA) and international regulators typically prohibit drones from flying beyond the line of the sight of the remote pilot. Obviously, she added, that restriction greatly constrains where and how drones can make deliveries and is working to keep the market from growing test and pilot programs into full-scale commercial adoption. - -**[ Read also: [No, drone delivery still isn’t ready for prime time][7] | Get regularly scheduled insights: [Sign up for Network World newsletters][8] ]** - -### Detect and avoid technology is critical - -Iris Automation, not surprisingly, is in the business of creating workable collision avoidance systems for drones in an attempt to solve this issue. Variously called “detect and avoid” or “sense and avoid” technologies, these automated solutions are required for “beyond visual line of sight” (BVLOS) drone operations. There are multiple issues in play. - -As explained on Iris’ website, “Drone pilots are skilled aviators, but even they struggle to see and avoid obstacles and aircraft when operating drones at extended range [and] no pilot on board means low situational awareness. This risk is huge, and the potential conflicts can be extremely dangerous.” - -As “a software company with a hardware problem,” McKenzie said, Iris’ systems use artificial intelligence (AI), machine learning, computer vision, and IoT connectivity to identify and focus on the “small group of pixels that could be a risk.” Working together, those technologies are creating an “exponential curve” in detect-and-avoid technology improvements, she added. The result? Drones that “see better than a human pilot,” she claimed. - -### Bigger market and new use cases for drones - -It’s hardly an academic issue. “Not being able to show adequate mitigation of operational risk means regulators are forced to limit drone uses and applications to closed environments,” the company says. - -Solving this problem would open up a wide range of industrial and commercial applications for drones. Far beyond delivering burritos, McKenzie said that with confidence in drone “sense and avoid” capabilities, drones could be used for all kinds of aerial data gathering, from inspecting hydro-electric dams, power lines, and railways to surveying crops to fighting forest fires and conducting search-and-rescue operations. - -Join the Network World communities on [Facebook][9] and [LinkedIn][10] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3410564/iots-role-in-expanding-drone-use.html - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/01/drone_delivery_package_future-100745961-large.jpg -[2]: https://www.networkworld.com/blog/techwatch/ -[3]: https://www.networkworld.com/article/3396188/the-traffic-jam-whopper-project-may-be-the-coolestdumbest-iot-idea-ever.html -[4]: https://www.linkedin.com/in/withgracetoo/ -[5]: https://www.irisonboard.com/ -[6]: https://sfnewtech.com/event/iot/ -[7]: https://www.networkworld.com/article/3390677/drone-delivery-not-ready-for-prime-time.html -[8]: https://www.networkworld.com/newsletters/signup.html -[9]: https://www.facebook.com/NetworkWorld/ -[10]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190725 Report- Smart-city IoT isn-t smart enough yet.md b/sources/talk/20190725 Report- Smart-city IoT isn-t smart enough yet.md deleted file mode 100644 index da6d4ee57a..0000000000 --- a/sources/talk/20190725 Report- Smart-city IoT isn-t smart enough yet.md +++ /dev/null @@ -1,73 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Report: Smart-city IoT isn’t smart enough yet) -[#]: via: (https://www.networkworld.com/article/3411561/report-smart-city-iot-isnt-smart-enough-yet.html) -[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) - -Report: Smart-city IoT isn’t smart enough yet -====== -A report from Forrester Research details vulnerabilities affecting smart-city internet of things (IoT) infrastructure and offers some methods of mitigation. -![Aleksandr Durnov / Getty Images][1] - -Security arrangements for smart-city IoT technology around the world are in an alarming state of disrepair, according to a report from Forrester Research that argues serious changes are needed in order to avoid widespread compromises. - -Much of what’s wrong has to do with a lack of understanding on the part of the people in charge of those systems and a failure to follow well-known security best practices, like centralized management, network visibility and limiting attack-surfaces. - -**More on IoT:** - - * [What is the IoT? How the internet of things works][2] - * [What is edge computing and how it’s changing the network][3] - * [Most powerful Internet of Things companies][4] - * [10 Hot IoT startups to watch][5] - * [The 6 ways to make money in IoT][6] - * [What is digital twin technology? [and why it matters]][7] - * [Blockchain, service-centric networking key to IoT success][8] - * [Getting grounded in IoT networking and security][9] - * [Building IoT-ready networks must become a priority][10] - * [What is the Industrial IoT? [And why the stakes are so high]][11] - - - -Those all pose stiff challenges, according to “Making Smart Cities Safe And Secure,” the Forrester report by Merritt Maxim and Salvatore Schiano. The attack surface for a smart city is, by default, enormous, given the volume of Internet-connected hardware involved. Some device, somewhere, is likely to be vulnerable, and with the devices geographically spread out it’s difficult to secure all types of access to them. - -Worse still, some legacy systems can be downright impossible to manage and update in a safe way. Older technology often contains no provision for live updates, and its vulnerabilities can be severe, according to the report. Physical access to some types of devices also remains a serious challenge. The report gives the example of wastewater treatment plants in remote locations in Australia, which were sabotaged by a contractor who accessed the SCADA systems directly. - -In addition to the risk of compromised control systems, the generalized insecurity of smart city IoT makes the vast amounts of data that it generates highly suspect. Improperly configured devices could collect more information than they’re supposed to, including personally identifiable information, which could violate privacy regulations. Also, the data collected is analyzed to glean useful information about such things as parking patterns, water flow and electricity use, and inaccurate or compromised information can badly undercut the value of smart city technology to a given user. - -“Security teams are just gaining maturity in the IT environment with the necessity for data inventory, classification, and flow mapping, together with thorough risk and privacy impact assessments, to drive appropriate protection,” the report says. “In OT environments, they’re even further behind.” - -Yet, despite the fact that IoT planning and implementation doubled between 2017 and 2018, according to Forrester’s data, comparatively little work has been done on the security front. The report lists 13 cyberattacks on smart-city technology between 2014 and 2019 that had serious consequences, including widespread electricity outages, ransomware infections on hospital computers and emergency-service interruptions. - -Still, there are ways forward, according to Forrester. Careful log monitoring can keep administrators abreast of what’s normal and what’s suspicious on their networks. Asset mapping and centralizing control-plane functionality should make it much more difficult for bad actors to insert malicious devices into a smart-city network or take control of less-secure items. And intelligent alerting – the kind that provides contextual information, differentiating between “this system just got rained on and has poor connectivity” and “someone is tampering with this system” – should help cities be more responsive to security threats when they arise. - -Join the Network World communities on [Facebook][12] and [LinkedIn][13] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3411561/report-smart-city-iot-isnt-smart-enough-yet.html - -作者:[Jon Gold][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Jon-Gold/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/smart_city_smart_cities_iot_internet_of_things_by_aleksandr_durnov_gettyimages-971455374_2400x1600-100788363-large.jpg -[2]: https://www.networkworld.com/article/3207535/internet-of-things/what-is-the-iot-how-the-internet-of-things-works.html -[3]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html -[4]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html -[5]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html -[6]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html -[7]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html -[8]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html -[9]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html -[10]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html -[11]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html -[12]: https://www.facebook.com/NetworkWorld/ -[13]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190725 Storage management a weak area for most enterprises.md b/sources/talk/20190725 Storage management a weak area for most enterprises.md deleted file mode 100644 index 859c1caa32..0000000000 --- a/sources/talk/20190725 Storage management a weak area for most enterprises.md +++ /dev/null @@ -1,82 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Storage management a weak area for most enterprises) -[#]: via: (https://www.networkworld.com/article/3411400/storage-management-a-weak-area-for-most-enterprises.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Storage management a weak area for most enterprises -====== -Survey finds companies are adopting technology for such things as AI, machine learning, edge computing and IoT, but still use legacy storage that can't handle those workloads. -![Miakievy / Getty Images][1] - -Stop me if you’ve heard this before: Companies are racing to a new technological paradigm but are using yesterday’s tech to do it. - -I know. Shocking. - -A survey of more than 300 storage professionals by storage vendor NGD Systems found only 11% of the companies they talked to would give themselves an “A” grade for their compute and storage capabilities. - -Why? The chief reason given is that while enterprises are rapidly deploying technologies for edge networks, real-time analytics, machine learning, and internet of things (IoT) projects, they are still using legacy storage solutions that are not designed for such data-intensive workloads. More than half — 54% — said their processing of edge applications is a bottleneck, and they want faster and more intelligent storage solutions. - -**[ Read also: [What is NVMe, and how is it changing enterprise storage][2] ]** - -### NVMe SSD use increases, but doesn't solve all needs - -It’s not all bad news. The study, entitled ["The State of Storage and Edge Computing"][3] and conducted by Dimensional Research, found 60% of storage professionals are using NVMe SSDs to speed up the processing of large data sets being generated at the edge. - -However, this has not solved their needs. As artificial intelligence (AI) and other data-intensive deployments increase, data needs to be moved over increasingly longer distances, which causes network bottlenecks and delays analytic results. And edge computing systems tend to have a smaller footprint than a traditional data center, so they are performance constrained. - -The solution is to process the data where it is ingested, in this case, the edge device. Separate the wheat from the chafe and only send relevant data upstream to a data center to be processed. This is called computational storage, processing data where it is stored rather than moving it around. - -According to the survey, 89% of respondents said they expect real value from computational storage. Conveniently, NGD is a vendor of computational storage systems. So, yes, this is a self-serving finding. This happens a lot. That doesn’t mean they don’t have a valid point, though. Processing the data where it lies is the point of edge computing. - -Among the survey’s findings: - - * 55% use edge computing - * 71% use edge computing for real-time analytics - * 61% said the cost of traditional storage solutions continues to plague their applications - * 57% said faster access to storage would improve their compute abilities - - - -The study also found that [NVMe][2] is being adopted very quickly but is being hampered by price. - - * 86% expect storage’s future to rely on NVMe SSDs - * 60% use NVMe SSDs in their work environments - * 63% said NVMe SSDs helped with superior storage speed - * 67% reported budget and cost as issues preventing the use of NVMe SSDs - - - -That last finding is why so many enterprises are hampered in their work. For whatever reason they are using old storage systems rather than new NVMe systems, and it hurts them. - -### GPUs won't improve workload performance - -One interesting finding: 70% of respondents said they are using GPUs to help improve workload performance, but NGD said those are no good. - -“We were not surprised to find that while more than half of respondents are actively using edge computing, more than 70% are using legacy GPUs, which will not reduce the network bandwidth, power and footprint necessary to analyze mass data-sets in real time,” said Nader Salessi, CEO and founder of NGD Systems, in a statement. - -That’s because GPUs lend themselves well to repetitive tasks and parallel processing jobs, while computational storage is very much a serial processing job, with the task constantly changing. So while some processing jobs will benefit from a GPU, a good number will not and the GPU is essentially wasted. - -Join the Network World communities on [Facebook][4] and [LinkedIn][5] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3411400/storage-management-a-weak-area-for-most-enterprises.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/edge_computing_by_miakievy_gettyimages-957694592_2400x1600-100788315-large.jpg -[2]: https://www.networkworld.com/article/3280991/what-is-nvme-and-how-is-it-changing-enterprise-storage.html -[3]: https://ngd.dnastaging.net/brief/NGD_Systems_Storage_Edge_Computing_Survey_Report -[4]: https://www.facebook.com/NetworkWorld/ -[5]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190726 NVMe over Fabrics enterprise storage spec enters final review process.md b/sources/talk/20190726 NVMe over Fabrics enterprise storage spec enters final review process.md deleted file mode 100644 index f14dcd7d67..0000000000 --- a/sources/talk/20190726 NVMe over Fabrics enterprise storage spec enters final review process.md +++ /dev/null @@ -1,71 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (NVMe over Fabrics enterprise storage spec enters final review process) -[#]: via: (https://www.networkworld.com/article/3411958/nvme-over-fabrics-enterprise-storage-spec-enters-final-review-process.html) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -NVMe over Fabrics enterprise storage spec enters final review process -====== -The NVMe over Fabric (NVMe-oF) architecture is closer to becoming a formal specification. It's expected improve storage network fabric communications and network performance. -![Gremlin / Getty Images][1] - -NVM Express Inc., the developer of the [NVMe][2] spec for enterprise SSDs, announced that its NVMe-oF architecture has entered a final 45-day review, an important step toward release of a formal specification for enterprise SSD makers. - -NVMe-oF stands for [NVMe over Fabrics][3], a mechanism to transfer data between a host computer and a target SSD or system over a network, such as Ethernet, Fibre Channel (FC), or InfiniBand. NVM Express first released the 1.0 spec of NVMe-oF in 2016, so this is long overdue. - -**[ Read also: [NVMe over Fabrics creates data-center storage disruption][3] ]** - -NVMe has become an important advance in enterprise storage because it allows for intra-network data sharing. Before, when PCI Express-based SSDs first started being used in servers, they could not easily share data with another physical server. The SSD was basically for the machine it was in, and moving data around was difficult. - -With NVMe over Fabrics, it’s possible for one machine to directly reach out to another for data and have it transmitted over a variety of high-speed fabrics rather than just Ethernet. - -### How NVMe-oF 1.1 improves storage network fabric communication - -The NVMe-oF 1.1 architecture is designed to improve storage network fabric communications in several ways: - - * Adds TCP transport supports NVMe-oF on current data center TCP/IP network infrastructure. - * Asynchronous discovery events inform hosts of addition or removal of target ports in a fabric-independent manner. - * Fabric I/O Queue Disconnect enables finer-grain I/O resource management. - * End-to-end (command to response) flow control improves concurrency. - - - -### New enterprise features for NVMe 1.4 - -The organization also announced the release of the NVMe 1.4 base specification with new “enterprise features” described as a further maturation of the protocol. The specification provides important benefits, such as improved quality of service (QoS), faster performance, improvements for high-availability deployments, and scalability optimizations for data centers. - -Among the new features: - - * Rebuild Assist simplifies data recovery and migration scenarios. - * Persistent Event Log enables robust drive history for issue triage and debug at scale. - * NVM Sets and IO Determinism allow for better performance, isolation, and QoS. - * Multipathing enhancements or Asymmetric Namespace Access (ANA) enable optimal and redundant paths to namespaces for high availability and full multi-controller scalability. - * Host Memory Buffer feature reduces latency and SSD design complexity, benefiting client SSDs. - - - -The upgraded NVMe 1.4 base specification and the pending over-fabric spec will be demonstrated at the Flash Memory Summit August 6-8, 2019 in Santa Clara, California. - -Join the Network World communities on [Facebook][4] and [LinkedIn][5] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3411958/nvme-over-fabrics-enterprise-storage-spec-enters-final-review-process.html - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/big_data_storage_businessman_walks_through_futuristic_data_center_by_gremlin_gettyimages-1098116540_2400x1600-100788347-large.jpg -[2]: https://www.networkworld.com/article/3280991/what-is-nvme-and-how-is-it-changing-enterprise-storage.html -[3]: https://www.networkworld.com/article/3394296/nvme-over-fabrics-creates-data-center-storage-disruption.html -[4]: https://www.facebook.com/NetworkWorld/ -[5]: https://www.linkedin.com/company/network-world diff --git a/sources/talk/20190729 Do you prefer a live demo to be perfect or broken.md b/sources/talk/20190729 Do you prefer a live demo to be perfect or broken.md deleted file mode 100644 index b4b76aadd6..0000000000 --- a/sources/talk/20190729 Do you prefer a live demo to be perfect or broken.md +++ /dev/null @@ -1,82 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Do you prefer a live demo to be perfect or broken?) -[#]: via: (https://opensource.com/article/19/7/live-demo-perfect-or-broken) -[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeohttps://opensource.com/users/don-watkinshttps://opensource.com/users/jamesf) - -Do you prefer a live demo to be perfect or broken? -====== -Do you learn more from flawless demos or ones the presenter de-bugs in -real-time? Let us know by answering our poll. -![video editing dashboard][1] - -At [DevFest DC][2] in June, [Sara Robinson][3], developer advocate at Google Cloud, gave the most seamless live demo I've ever witnessed. - -Sara live-coded a machine model from scratch using TensorFlow and Keras. Then she trained the model live, deployed it to Google's Cloud AI platform, and used the deployed model to make predictions. - -With the exception of perhaps one small hiccup, the whole thing went smoothly, and I learned a lot as an audience member. - -At that evening's reception, I congratulated Sara on the live demo's success and told her I've never seen a live demo go so well. It turns out that this subject was already on her mind; Sara asked this question on Twitter less than two hours before her live demo: - -> Do you prefer watching a live demo where everything works perfectly or one that breaks and the presenter has to de-bug? -> -> — Sara Robinson (@SRobTweets) [June 14, 2019][4] - -Contrary to my preference for flawless demos, two-thirds of Sara's followers prefer to watch de-bugging. The replies to her poll were equally enlightening: - -> I prefer ones that break once or twice, just so you know it's real. "Break" can be something small like a typo or skipping a step. -> -> — Seth Vargo (@sethvargo) [June 14, 2019][5] - -> Broken demos which are fixed in real time seem to get a better reaction from the audience. This was our experience with the All-Demo Super Session at NEXT SF. Audible gasps followed by applause from the audience when the broken demo was fixed in real-time 🤓 -> -> — Jamie Kinney (@jamiekinney) [June 14, 2019][6] - -This made me reconsider my preference for perfection. When I attend live demos at events, I'm looking for tools that I'm unfamiliar with. I want to learn the basics of those tools, then see real-world applications. I don't expect magic, but I do want to see how the tools intend to work so I can gain and retain some knowledge. - -I've gone to several live demos that break. In my experience, this has caught most presenters off-guard; they seemed unfamiliar with the bugs at hand and, in one case, the error derailed the rest of the presentation. In short, it was like this: - -> Hmm, at least when the live demo fails you know it's not a video 😁 -> But I don't like when the presenter start to struggle, when everything becomes silent, it becomes so awkward (especially when I'm the one presenting) -> -> — Sylvain Nouts Ⓥ (@SylvainNouts) [June 14, 2019][7] - -Reading the replies to Sara's thread made me wonder what I'm really after when attending live demos. Is "perfection" what I seek? Or is it presenters who are more skilled at de-bugging in real-time? Upon reflection, I suspect that it's the latter. - -After all, "perfect" code is a lofty (if impossible) concept. Mistakes will happen, and I don't expect them not to. But I _do_ expect conference presenters to know their tools well enough that when things go sideways during live demos, they won't get so flustered that they can't keep going. - -Overall, this reply to Sara resonates with me the most. I attend live demos as a new coder with the goal to learn, and those that veer too far off-course aren't as effective for me: - -> I don’t necessarily prefer a broken demo, but I do think they show a more realistic view. -> That said, when you are newer to coding if the error takes things too far off the rails it can make it challenging to understand the original concept. -> -> — April Bowler (@A_Bowler2) [June 14, 2019][8] - -I don't expect everyone to attend live demos with the same goals and perspective as me. That's why we want to learn what the open source community thinks. - -_Do you prefer for live demos to be perfect? Or do you gain more from watching presenters de-bug in real-time? Do you attend live demos primarily to learn or for other reasons? Let us know by taking our poll or leaving a comment below._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/7/live-demo-perfect-or-broken - -作者:[Lauren Maffeo][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/lmaffeohttps://opensource.com/users/don-watkinshttps://opensource.com/users/jamesf -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/video_editing_folder_music_wave_play.png?itok=-J9rs-My (video editing dashboard) -[2]: https://www.devfestdc.org/ -[3]: https://twitter.com/SRobTweets -[4]: https://twitter.com/SRobTweets/status/1139619990687162368?ref_src=twsrc%5Etfw -[5]: https://twitter.com/sethvargo/status/1139620990546145281?ref_src=twsrc%5Etfw -[6]: https://twitter.com/jamiekinney/status/1139636109585989632?ref_src=twsrc%5Etfw -[7]: https://twitter.com/SylvainNouts/status/1139637154731237376?ref_src=twsrc%5Etfw -[8]: https://twitter.com/A_Bowler2/status/1139648492953976832?ref_src=twsrc%5Etfw diff --git a/sources/talk/20190729 I Used The Web For A Day On A 50 MB Budget - Smashing Magazine.md b/sources/talk/20190729 I Used The Web For A Day On A 50 MB Budget - Smashing Magazine.md deleted file mode 100644 index b0a7f4a7e0..0000000000 --- a/sources/talk/20190729 I Used The Web For A Day On A 50 MB Budget - Smashing Magazine.md +++ /dev/null @@ -1,538 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (I Used The Web For A Day On A 50 MB Budget — Smashing Magazine) -[#]: via: (https://www.smashingmagazine.com/2019/07/web-on-50mb-budget/) -[#]: author: (Chris Ashton https://www.smashingmagazine.com/author/chrisbashton) - -I Used The Web For A Day On A 50 MB Budget -====== - -Data can be prohibitively expensive, especially in developing countries. Chris Ashton puts himself in the shoes of someone on a tight data budget and offers practical tips for reducing our websites’ data footprint. - -This article is part of a series in which I attempt to use the web under various constraints, representing a given demographic of user. I hope to raise the profile of difficulties faced by real people, which are avoidable if we design and develop in a way that is sympathetic to their needs. - -Last time, I [navigated the web for a day using Internet Explorer 8][7]. This time, I browsed the web for a day on a 50 MB budget. - -### Why 50 MB? - -Many of us are lucky enough to be on mobile plans which allow several gigabytes of data transfer per month. Failing that, we are usually able to connect to home or public WiFi networks that are on fast broadband connections and have effectively unlimited data. - -But there are parts of the world where mobile data is prohibitively expensive, and where there is little or no broadband infrastructure. - -> People often buy data packages of just tens of megabytes at a time, making a gigabyte a relatively large and therefore expensive amount of data to buy. -> — Dan Howdle, consumer telecoms analyst at Cable.co.uk - -Just how expensive are we talking? - -#### The Cost Of Mobile Data - -A 2018 [study by cable.co.uk][8] found that Zimbabwe was the most expensive country in the world for mobile data, where 1 GB cost an average of $75.20, ranging from $12.50 to $138.46. The enormous range in price is due to smaller amounts of data being very expensive, getting proportionally cheaper the bigger the data plan you commit to. You can read the [study methodology][9] for more information. - -Zimbabwe is by no means a one-off. Equatorial Guinea, Saint Helena and the Falkland Islands are next in line, with 1 GB of data costing $65.83, $55.47 and $47.39 respectively. These countries generally have a combination of poor technical infrastructure and low adoption, meaning data is both costly to deliver and doesn’t have the economy of scale to drive costs down. - -Data is expensive in parts of Europe too. A gigabyte of data in Greece will set you back $32.71; in Switzerland, $20.22. For comparison, the same amount of data costs $6.66 in the UK, or $12.37 in the USA. On the other end of the scale, India is the cheapest place in the world for data, at an average cost of $0.26. Kyrgyzstan, Kazakhstan and Ukraine follow at $0.27, $0.49 and $0.51 per GB respectively. - -The speed of mobile networks, too, varies considerably between countries. Perhaps surprisingly, [users experience faster speeds over a mobile network than WiFi][10] in at least 30 countries worldwide, including Australia and France. South Korea has the [fastest mobile download speed][11], averaging 52.4 Mbps, but Iraq has the slowest, averaging 1.6 Mbps download and 0.7 Mbps upload. The USA ranks 40th in the world for mobile download speeds, at around 34 Mbps, and is [at risk of falling further behind][12] as the world moves towards 5G. - -As for mobile network connection type, 84.7% of user connections in the UK are on 4G, compared to 93% in the USA, and 97.5% in South Korea. This compares with less than 50% in Uzbekistan and less than 60% in Algeria, Ecuador, Nepal and Iraq. - -#### The Cost Of Broadband Data - -Meanwhile, a [study of the cost of broadband in 2018][13] shows that a broadband connection in Niger costs $263 ‘per megabit per month’. This metric is a little difficult to comprehend, so here’s an example: if the average cost of broadband packages in a country is $22, and the average download speed offered by the packages is 10 Mbps, then the cost ‘per megabit per month’ would be $2.20. - -It’s an interesting metric, and one that acknowledges that broadband speed is as important a factor as the data cap. A cost of $263 suggests a combination of extremely slow and extremely expensive broadband. For reference, the metric is $1.19 in the UK and $1.26 in the USA. - -What’s perhaps easier to comprehend is the average cost of a broadband package. Note that this study was looking for the cheapest broadband packages on offer, ignoring whether or not these packages had a data cap, so provides a useful ballpark figure rather than the cost of data per se. - -On package cost alone, Mauritania has the most expensive broadband in the world, at an average of $768.16 (a range of $307.26 to $1,368.72). This enormous cost includes building physical lines to the property, since few already exist in Mauritania. At 0.7 Mbps, Mauritania also has one of the slowest broadband networks in the world. - -[Taiwan has the fastest broadband in the world][14], at a mean speed of 85 Mbps. Yemen has the slowest, at 0.38 Mbps. But even countries with good established broadband infrastructure have so-called ‘not-spots’. The United Kingdom is ranked 34th out of 207 countries for broadband speed, but in July 2019 there was [still a school in the UK without broadband][15]. - -The average cost of a broadband package in the UK is $39.58, and in the USA is $67.69. The cheapest average in the world is Ukraine’s, at just $5, although the cheapest broadband deal of them all was found in Kyrgystan ($1.27 — against the country average of $108.22). - -Zimbabwe was the most costly country for mobile data, and the statistics aren’t much better for its broadband, with an average cost of $128.71 and a ‘per megabit per month’ cost of $6.89. - -#### Absolute Cost vs Cost In Real Terms - -All of the costs outlined so far are the absolute costs in USD, based on the exchange rates at the time of the study. These costs have [not been accounted for cost of living][16], meaning that for many countries the cost is actually far higher in real terms. - -I’m going to limit my browsing today to 50 MB, which in Zimbabwe would cost around $3.67 on a mobile data tariff. That may not sound like much, but teachers in Zimbabwe were striking this year because their [salaries had fallen to just $2.50 a day][17]. - -For comparison, $3.67 is around half the [$7.25 minimum wage in the USA][18]. As a Zimbabwean, I’d have to work for around a day and a half to earn the money to buy this 50MB data, compared to just half an hour in the USA. It’s not easy to compare cost of living between countries, but on wages alone the $3.67 cost of 50 MB of data in Zimbabwe would feel like $52 to an American on minimum wage. - -### Setting Up The Experiment - -I launched Chrome and opened the dev tools, where I throttled the network to a slow 3G connection. I wanted to simulate a slow connection like those experienced by users in Uzbekistan, to see what kind of experience websites would give me. I also throttled my CPU to simulate being on a lower end device. - -[![][19]][20]I opted to throttle my network to Slow 3G and my CPU to 6x slowdown. ([Large preview][20]) - -I installed [ModHeader][21] and set the [‘Save-Data’ header][22] to let websites know I want to minimise my data usage. This is also the header set by Chrome for Android’s ‘Lite mode’, which I’ll cover in more detail later. - -I downloaded [TripMode][23]; an application for Mac which gives you control over which apps on your Mac can access the internet. Any other application’s internet access is automatically blocked. - -You can enable/disable individual apps from connecting to the internet with TripMode. I enabled Chrome. ([Large preview][24]) - -How far do I predict my 50 MB budget will take me? With the [average weight of a web page being almost 1.7 MB][25], that suggests I’ve got around 29 pages in my budget, although probably a few more than that if I’m able to stay on the same sites and leverage browser caching. - -Throughout the experiment I will suggest performance tips to speed up the [first contentful paint][26] and perceived loading time of the page. Some of these tips may not affect the amount of data transferred directly, but do generally involve deferring the download of less important resources, which on slow connections may mean the resources are never downloaded and data is saved. - -### The Experiment - -Without any further ado, I loaded google.com, using 402 KB of my budget and spending $0.03 (around 1% of my Zimbabwe budget). - -[![402 KB transferred, 1.1 MB resources, 24 requests][27]][28]402 KB transferred, 1.1 MB resources, 24 requests. ([Large preview][28]) - -All in all, not a bad page size, but I wondered where those 24 network requests were coming from and whether or not the page could be made any lighter. - -#### Google Homepage — DOM - -[![][29]][30]Chrome devtools screenshot of the DOM, where I’ve expanded one inline `style` tag. ([Large preview][30]) - -Looking at the page markup, there are no external stylesheets — all of the CSS is inline. - -##### Performance Tip #1: Inline Critical CSS - -This is good for performance as it saves the browser having to make an additional network request in order to fetch an external stylesheet, so the styles can be parsed and applied immediately for the first contentful paint. There’s a trade-off to be made here, as external stylesheets can be cached but inline ones cannot (unless you [get clever with JavaScript][31]). - -The general advice is for your [critical styles][32] (anything [above-the-fold][33]) to be inline, and for the rest of your styling to be external and loaded asynchronously. Asynchronous loading of CSS can be achieved in [one remarkably clever line of HTML][34]: - -``` - -``` - -The devtools show a prettified version of the DOM. If you want to see what was actually downloaded to the browser, switch to the Sources tab and find the document. - -[![A wall of minified code.][35]][36]Switching to Sources and finding the index shows the ‘raw’ HTML that was delivered to the browser. What a mess! ([Large preview][36]) - -You can see there is a LOT of inline JavaScript here. It’s worth noting that it has been uglified rather than merely minified. - -##### Performance Tip #2: Minify And Uglify Your Assets - -Minification removes unnecessary spaces and characters, but uglification actually ‘mangles’ the code to be shorter. The tell-tale sign is that the code contains short, machine-generated variable names rather than untouched source code. This is good as it means the script is smaller and quicker to download. - -Even so, inline scripts look to be roughly 120 KB of the 210 KB page resource (about half the 60 KB gzipped size). In addition, there are five external JavaScript files amounting to 291 KB of the 402 KB downloaded: - -[![Network tab of DevTools showing the external javascript files][37]][38]Five external JavaScript files in the Network tab of the devtools. ([Large preview][38]) - -This means that JavaScript accounts for about 80 percent of the overall page weight. - -This isn’t useless JavaScript; Google has to have some in order to display suggestions as you type. But I suspect a lot of it is tracking code and advertising setup. - -For comparison, I disabled JavaScript and reloaded the page: - -[![DevTools showing only 5 network requests][39]][40]The disabled JS version of Google search was only 102 KB and had just 5 network requests. ([Large preview][40]) - -The JS-disabled version of Google search is just 102 KB, as opposed to 402 KB. Although Google can’t provide autosuggestions under these conditions, the site is still functional, and I’ve just cut my data usage down to a quarter of what it was. If I really did have to limit my data usage in the long term, one of the first things I’d do is disable JavaScript. [It’s not as bad as it sounds][41]. - -##### Performance Tip #3: Less Is More - -Inlining, uglifying and minifying assets is all well and good, but the best performance comes from not sending down the assets in the first place. - - * Before adding any new features, do you have a [performance budget][42] in place? - * Before adding JavaScript to your site, can your feature be accomplished using plain HTML? (For example, [HTML5 form validation][43]). - * Before pulling a large JavaScript or CSS library into your application, use something like [bundlephobia.com][44] to measure how big it is. Is the convenience worth the weight? Can you accomplish the same thing using vanilla code at a much smaller data size? - - - -#### Analysing The Resource Info - -There’s a lot to unpack here, so let’s get cracking. I’ve only got 50 MB to play with, so I’m going to milk every bit of this page load. Settle in for a short Chrome Devtools tutorial. - -402 KB transferred, but 1.1 MB of resources: what does that actually mean? - -It means 402 KB of content was actually downloaded, but in its compressed form (using a compression algorithm such as [gzip or brotli][45]). The browser then had to do some work to unpack it into something meaningful. The total size of the unpacked data is 1.1 MB. - -This unpacking isn’t free — [there are a few milliseconds of overhead in decompressing the resources][46]. But that’s a negligible overhead compared to sending 1.1MB down the wire. - -##### Performance Tip #4: Compress Text-based Assets - -As a general rule, always compress your assets, using something like gzip. But don’t use compression on your images and other binary files — you should optimize these in advance at source. Compression could actually end up [making them bigger][47]. - -And, if you can, [avoid compressing files that are 1500 bytes or smaller][47]. The smallest TCP packet size is 1500 bytes, so by compressing to, say, 800 bytes, you save nothing, as it’s still transmitted in the same byte packet. Again, the cost is negligible, but wastes some compression CPU time on the server and decompression CPU time on the client. - -Now back to the Network tab in Chrome: let’s dig into those priorities. Notice that resources have priority “Highest” to “Lowest” — these are the browser’s best guess as to what are the more important resources to download. The higher the priority, the sooner the browser will try to download the asset. - -##### Performance Tip #5: Give Resource Hints To The Browser - -The browser will guess at what the highest priority assets are, but you can [provide a resource hint][48] using the `` tag, instructing the browser to download the asset as soon as possible. It’s a good idea to preload fonts, logos and anything else that appears above the fold. - -Let’s talk about caching. I’m going to hold ALT and right-click to change my column headers to unlock some more juicy information. We’re going to check out Cache-Control. - -There are lots of interesting fields tucked away behind ALT. ([Large preview][49]) - -Cache-Control denotes whether or not a resource can be cached, how long it can be cached for, and what rules it should follow around [revalidating][50]. Setting proper cache values is crucial to keeping the data cost of repeat visits down. - -##### Performance Tip #6: Set cache-control Headers On All Cacheable Assets - -Note that the cache-control value begins with a directive of `public` or `private`, followed by an expiration value (e.g. `max-age=31536000`). What does the directive mean, and why the oddly specific `max-age` value? - -[![Screenshot of Google network tab with cache-control column visible][51]][52]A mixture of max-age values and public/private. ([Large preview][52]) - -The value `31536000` is the number of seconds there are in a year, and is the theoretical maximum value allowed by the cache-control specification. It is common to see this value applied to all static assets and effectively means “this resource isn’t going to change”. In practice, [no browser is going to cache for an entire year][53], but it will cache the asset for as long as makes sense. - -To explain the public/private directive, we must explain the two main caches that exist off the server. First, there is the traditional browser cache, where the resource is stored on the user’s machine (the ‘client’). And then there is the CDN cache, which sits between the client and the server; resources are cached at the CDN level to prevent the CDN from requesting the resource from the origin server over and over again. - -A `Cache-Control` directive of `public` allows the resource to be cached in both the client and the CDN. A value of `private` means only the client can cache it; the CDN is not supposed to. This latter value is typically used for pages or assets that exist behind authentication, where it is fine to be cached on the client but we wouldn’t want to leak private information by caching it in the CDN and delivering it to other users. - -[![Screenshot of Google logo cache-control setting: private, max-age=31536000][54]][55]A mixture of max-age values and public/private. ([Large preview][55]) - -One thing that got my attention was that the Google logo has a cache control of “private”. Other images on the page do have a public cache, and I don’t know why the logo would be treated any differently. If you have any ideas, let me know in the comments! - -I refreshed the page and most of the resources were served from cache, apart from the page itself, which as you’ve seen already is `private, max-age=0`, meaning it cannot be cached. This is normal for dynamic web pages where it is important that the user always gets the very latest page when they refresh. - -It was at this point I accidentally clicked on an ‘Explanation’ URL in the devtools, which took me to the [network analysis reference][56], costing me about 5 MB of my budget. Oops. - -### Google Dev Docs - -4.2 MB of this new 5 MB page was down to images; specifically SVGs. The weightiest of these was 186 KB, which isn’t particularly big — there were just so many of them, and they all downloaded at once. - -This is a loooong page. All the images downloaded on page load. ([Large preview][57]) - -That 5 MB page load was 10% of my budget for today. So far I’ve used 5.5 MB, including the no-JavaScript reload of the Google homepage, and spent $0.40. I didn’t even mean to open this page. - -What would have been a better user experience here? - -##### Performance Tip #7: Lazy-load Your Images - -Ordinarily, if I accidentally clicked on a link, I would hit the back button in my browser. I’d have received no benefit whatsoever from downloading those images — what a waste of 4.2 MB! - -Apart from video, where you generally know what you’re getting yourself into, images are by far the biggest culprit to data usage on the web. A [study of the world’s top 500 websites][58] found that images take up to 53% of the average page weight. “This means they have a big impact on page-loading times and subsequently overall performance”. - -Instead of downloading all of the images on page load, it is good practice to lazy-load the images so that only users who are engaged with the page pay the cost of downloading them. Users who choose not to scroll below the fold therefore don’t waste any unnecessary bandwidth downloading images they’ll never see. - -There’s a great [css-tricks.com guide to rolling out lazy-loading for images][59] which offers a good balance between those on good connections, those on poor connections, and those with JavaScript disabled. - -If this page had implemented lazy loading as per the guide above, each of the 38 SVGs would have been represented by a 1 KB placeholder image by default, and only loaded into view on scroll. - -##### Performance Tip #8: Use The Right Format For Your Images - -I thought that Google had missed a trick by not using [WebP][60], which is an image format that is 26% smaller in size compared to PNGs (with no loss in quality) and 25-34% smaller in size compared to JPEGs (and of a comparable quality). I thought I’d have a go at converting SVG to WebP. - -Converting to WebP did bring one of the SVGs down from 186 KB to just 65 KB, but actually, looking at the images side by side, the WebP came out grainy: - -[![Comparison of the two images][61]][62]The SVG (left) is noticeably crisper than the WebP (right). ([Large preview][62]) - -I then tried converting one of the PNGs to WebP, which is supposed to be lossless and should come out smaller. However, the WebP output was *heavier* (127 KB, from 109 KB)! - -[![Comparison of the two images][63]][64]The PNG (left) is a similar quality to the WebP (right) but is smaller at 109 KB compared to 127 KB. ([Large preview][64]) - -This surprised me. WebP isn’t necessarily the silver bullet we think it is, and even Google have neglected to use it on this page. - -So my advice would be: where possible, experiment with different image formats on a per-image basis. The format that keeps the best quality for the smallest size may not be the one you expect. - -Now back to the DOM. I came across this: - -Notice the `async` keyword on the Google analytics script? - -[![Screenshot of performance analysis output of devtools][65]][66]Google analytics has ‘low’ priority. ([Large preview][66]) - -Despite being one of the first things in the head of the document, this was given a low priority, as we’ve explicitly opted out of being a blocking request by using the `async` keyword. - -A blocking request is one that stops the rendering of the page. A ` - - - -``` - -This HTML file must be server for every URL and JavaScript will take care of rendering the correct page. - -So lets go the the `main.go` for a moment and in the `main()` function add the following route: - -``` -router.Handle("GET", "/...", http.FileServer(SPAFileSystem{http.Dir("static")})) - -type SPAFileSystem struct { - fs http.FileSystem -} - -func (spa SPAFileSystem) Open(name string) (http.File, error) { - f, err := spa.fs.Open(name) - if err != nil { - return spa.fs.Open("index.html") - } - return f, nil -} -``` - -We use a custom file system so instead of returning `404 Not Found` for unknown URLs, it serves the `index.html`. - -### Router - -In the `index.html` we loaded two files: `styles.css` and `main.js`. I leave styling to your taste. - -Lets move to `main.js`. Create a `static/main.js` file with the following content: - -``` -import { guard } from './auth.js' -import Router from './router.js' - -let currentPage -const disconnect = new CustomEvent('disconnect') -const router = new Router() - -router.handle('/', guard(view('home'), view('access'))) -router.handle('/callback', view('callback')) -router.handle(/^\/conversations\/([^\/]+)$/, guard(view('conversation'), view('access'))) -router.handle(/^\//, view('not-found')) - -router.install(async result => { - document.body.innerHTML = '' - if (currentPage instanceof Node) { - currentPage.dispatchEvent(disconnect) - } - currentPage = await result - if (currentPage instanceof Node) { - document.body.appendChild(currentPage) - } -}) - -function view(pageName) { - return (...args) => import(`/pages/${pageName}-page.js`) - .then(m => m.default(...args)) -} -``` - -If you are follower of this blog, you already know how this works. That router is the one showed [here][7]. Just download it from [@nicolasparada/router][8] and save it to `static/router.js`. - -We registered four routes. At the root `/` we show the home or access page whether the user is authenticated. At `/callback` we show the callback page. On `/conversations/{conversationID}` we show the conversation or access page whether the user is authenticated and for every other URL, we show a not found page. - -We tell the router to render the result to the document body and dispatch a `disconnect` event to each page before leaving. - -We have each page in a different file and we import them with the new dynamic `import()`. - -### Auth - -`guard()` is a function that given two functions, executes the first one if the user is authenticated, or the sencond one if not. It comes from `auth.js` so lets create a `static/auth.js` file with the following content: - -``` -export function isAuthenticated() { - const token = localStorage.getItem('token') - const expiresAtItem = localStorage.getItem('expires_at') - if (token === null || expiresAtItem === null) { - return false - } - - const expiresAt = new Date(expiresAtItem) - if (isNaN(expiresAt.valueOf()) || expiresAt <= new Date()) { - return false - } - - return true -} - -export function guard(fn1, fn2) { - return (...args) => isAuthenticated() - ? fn1(...args) - : fn2(...args) -} - -export function getAuthUser() { - if (!isAuthenticated()) { - return null - } - - const authUser = localStorage.getItem('auth_user') - if (authUser === null) { - return null - } - - try { - return JSON.parse(authUser) - } catch (_) { - return null - } -} -``` - -`isAuthenticated()` checks for `token` and `expires_at` from localStorage to tell if the user is authenticated. `getAuthUser()` gets the authenticated user from localStorage. - -When we login, we’ll save all the data to localStorage so it will make sense. - -### Access Page - -![access page screenshot][9] - -Lets start with the access page. Create a file `static/pages/access-page.js` with the following content: - -``` -const template = document.createElement('template') -template.innerHTML = ` -

        Messenger

        - Access with GitHub -` - -export default function accessPage() { - return template.content -} -``` - -Because the router intercepts all the link clicks to do its navigation, we must prevent the event propagation for this link in particular. - -Clicking on that link will redirect us to the backend, then to GitHub, then to the backend and then to the frontend again; to the callback page. - -### Callback Page - -Create the file `static/pages/callback-page.js` with the following content: - -``` -import http from '../http.js' -import { navigate } from '../router.js' - -export default async function callbackPage() { - const url = new URL(location.toString()) - const token = url.searchParams.get('token') - const expiresAt = url.searchParams.get('expires_at') - - try { - if (token === null || expiresAt === null) { - throw new Error('Invalid URL') - } - - const authUser = await getAuthUser(token) - - localStorage.setItem('auth_user', JSON.stringify(authUser)) - localStorage.setItem('token', token) - localStorage.setItem('expires_at', expiresAt) - } catch (err) { - alert(err.message) - } finally { - navigate('/', true) - } -} - -function getAuthUser(token) { - return http.get('/api/auth_user', { authorization: `Bearer ${token}` }) -} -``` - -The callback page doesn’t render anything. It’s an async function that does a GET request to `/api/auth_user` using the token from the URL query string and saves all the data to localStorage. Then it redirects to `/`. - -### HTTP - -There is an HTTP module. Create a `static/http.js` file with the following content: - -``` -import { isAuthenticated } from './auth.js' - -async function handleResponse(res) { - const body = await res.clone().json().catch(() => res.text()) - - if (res.status === 401) { - localStorage.removeItem('auth_user') - localStorage.removeItem('token') - localStorage.removeItem('expires_at') - } - - if (!res.ok) { - const message = typeof body === 'object' && body !== null && 'message' in body - ? body.message - : typeof body === 'string' && body !== '' - ? body - : res.statusText - throw Object.assign(new Error(message), { - url: res.url, - statusCode: res.status, - statusText: res.statusText, - headers: res.headers, - body, - }) - } - - return body -} - -function getAuthHeader() { - return isAuthenticated() - ? { authorization: `Bearer ${localStorage.getItem('token')}` } - : {} -} - -export default { - get(url, headers) { - return fetch(url, { - headers: Object.assign(getAuthHeader(), headers), - }).then(handleResponse) - }, - - post(url, body, headers) { - const init = { - method: 'POST', - headers: getAuthHeader(), - } - if (typeof body === 'object' && body !== null) { - init.body = JSON.stringify(body) - init.headers['content-type'] = 'application/json; charset=utf-8' - } - Object.assign(init.headers, headers) - return fetch(url, init).then(handleResponse) - }, - - subscribe(url, callback) { - const urlWithToken = new URL(url, location.origin) - if (isAuthenticated()) { - urlWithToken.searchParams.set('token', localStorage.getItem('token')) - } - const eventSource = new EventSource(urlWithToken.toString()) - eventSource.onmessage = ev => { - let data - try { - data = JSON.parse(ev.data) - } catch (err) { - console.error('could not parse message data as JSON:', err) - return - } - callback(data) - } - const unsubscribe = () => { - eventSource.close() - } - return unsubscribe - }, -} -``` - -This module is a wrapper around the [fetch][10] and [EventSource][11] APIs. The most important part is that it adds the JSON web token to the requests. - -### Home Page - -![home page screenshot][12] - -So, when the user login, the home page will be shown. Create a `static/pages/home-page.js` file with the following content: - -``` -import { getAuthUser } from '../auth.js' -import { avatar } from '../shared.js' - -export default function homePage() { - const authUser = getAuthUser() - const template = document.createElement('template') - template.innerHTML = ` -
        -
        - ${avatar(authUser)} - ${authUser.username} -
        - -
        - - - ` - const page = template.content - page.getElementById('logout-button').onclick = onLogoutClick - return page -} - -function onLogoutClick() { - localStorage.clear() - location.reload() -} -``` - -For this post, this is the only content we render on the home page. We show the current authenticated user and a logout button. - -When the user clicks to logout, we clear all inside localStorage and do a reload of the page. - -### Avatar - -That `avatar()` function is to show the user’s avatar. Because it’s used in more than one place, I moved it to a `shared.js` file. Create the file `static/shared.js` with the following content: - -``` -export function avatar(user) { - return user.avatarUrl === null - ? `
        ` - : `${user.username}'s avatar` -} -``` - -We use a small figure with the user’s initial in case the avatar URL is null. - -You can show the initial with a little of CSS using the `attr()` function. - -``` -.avatar[data-initial]::after { - content: attr(data-initial); -} -``` - -### Development Login - -![access page with login form screenshot][13] - -In the previous post we coded a login for development. Lets add a form for that in the access page. Go to `static/pages/access-page.js` and modify it a little. - -``` -import http from '../http.js' - -const template = document.createElement('template') -template.innerHTML = ` -

        Messenger

        -
        - - -
        - Access with GitHub -` - -export default function accessPage() { - const page = template.content.cloneNode(true) - page.getElementById('login-form').onsubmit = onLoginSubmit - return page -} - -async function onLoginSubmit(ev) { - ev.preventDefault() - - const form = ev.currentTarget - const input = form.querySelector('input') - const submitButton = form.querySelector('button') - - input.disabled = true - submitButton.disabled = true - - try { - const payload = await login(input.value) - input.value = '' - - localStorage.setItem('auth_user', JSON.stringify(payload.authUser)) - localStorage.setItem('token', payload.token) - localStorage.setItem('expires_at', payload.expiresAt) - - location.reload() - } catch (err) { - alert(err.message) - setTimeout(() => { - input.focus() - }, 0) - } finally { - input.disabled = false - submitButton.disabled = false - } -} - -function login(username) { - return http.post('/api/login', { username }) -} -``` - -I added a login form. When the user submits the form. It does a POST requets to `/api/login` with the username. Saves all the data to localStorage and reloads the page. - -Remember to remove this form once you are done with the frontend. - -* * * - -That’s all for this post. In the next one, we’ll continue with the home page to add a form to start conversations and display a list with the latest ones. - -[Souce Code][14] - --------------------------------------------------------------------------------- - -via: https://nicolasparada.netlify.com/posts/go-messenger-access-page/ - -作者:[Nicolás Parada][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://nicolasparada.netlify.com/ -[b]: https://github.com/lujun9972 -[1]: https://nicolasparada.netlify.com/posts/go-messenger-schema/ -[2]: https://nicolasparada.netlify.com/posts/go-messenger-oauth/ -[3]: https://nicolasparada.netlify.com/posts/go-messenger-conversations/ -[4]: https://nicolasparada.netlify.com/posts/go-messenger-messages/ -[5]: https://nicolasparada.netlify.com/posts/go-messenger-realtime-messages/ -[6]: https://nicolasparada.netlify.com/posts/go-messenger-dev-login/ -[7]: https://nicolasparada.netlify.com/posts/js-router/ -[8]: https://unpkg.com/@nicolasparada/router -[9]: https://nicolasparada.netlify.com/img/go-messenger-access-page/access-page.png -[10]: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API -[11]: https://developer.mozilla.org/en-US/docs/Web/API/EventSource -[12]: https://nicolasparada.netlify.com/img/go-messenger-access-page/home-page.png -[13]: https://nicolasparada.netlify.com/img/go-messenger-access-page/access-page-v2.png -[14]: https://github.com/nicolasparada/go-messenger-demo diff --git a/sources/tech/20180719 Building a Messenger App- Home Page.md b/sources/tech/20180719 Building a Messenger App- Home Page.md deleted file mode 100644 index ddec2c180f..0000000000 --- a/sources/tech/20180719 Building a Messenger App- Home Page.md +++ /dev/null @@ -1,255 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Building a Messenger App: Home Page) -[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-home-page/) -[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) - -Building a Messenger App: Home Page -====== - -This post is the 8th on a series: - - * [Part 1: Schema][1] - * [Part 2: OAuth][2] - * [Part 3: Conversations][3] - * [Part 4: Messages][4] - * [Part 5: Realtime Messages][5] - * [Part 6: Development Login][6] - * [Part 7: Access Page][7] - - - -Continuing the frontend, let’s finish the home page in this post. We’ll add a form to start conversations and a list with the latest ones. - -### Conversation Form - -![conversation form screenshot][8] - -In the `static/pages/home-page.js` file add some markup in the HTML view. - -``` -
        - -
        -``` - -Add that form just below the section in which we displayed the auth user and logout button. - -``` -page.getElementById('conversation-form').onsubmit = onConversationSubmit -``` - -Now we can listen to the “submit” event to create the conversation. - -``` -import http from '../http.js' -import { navigate } from '../router.js' - -async function onConversationSubmit(ev) { - ev.preventDefault() - - const form = ev.currentTarget - const input = form.querySelector('input') - - input.disabled = true - - try { - const conversation = await createConversation(input.value) - input.value = '' - navigate('/conversations/' + conversation.id) - } catch (err) { - if (err.statusCode === 422) { - input.setCustomValidity(err.body.errors.username) - } else { - alert(err.message) - } - setTimeout(() => { - input.focus() - }, 0) - } finally { - input.disabled = false - } -} - -function createConversation(username) { - return http.post('/api/conversations', { username }) -} -``` - -On submit we do a POST request to `/api/conversations` with the username and redirect to the conversation page (for the next post). - -### Conversation List - -![conversation list screenshot][9] - -In the same file, we are going to make the `homePage()` function async to load the conversations first. - -``` -export default async function homePage() { - const conversations = await getConversations().catch(err => { - console.error(err) - return [] - }) - /*...*/ -} - -function getConversations() { - return http.get('/api/conversations') -} -``` - -Then, add a list in the markup to render conversations there. - -``` -
          -``` - -Add it just below the current markup. - -``` -const conversationsOList = page.getElementById('conversations') -for (const conversation of conversations) { - conversationsOList.appendChild(renderConversation(conversation)) -} -``` - -So we can append each conversation to the list. - -``` -import { avatar, escapeHTML } from '../shared.js' - -function renderConversation(conversation) { - const messageContent = escapeHTML(conversation.lastMessage.content) - const messageDate = new Date(conversation.lastMessage.createdAt).toLocaleString() - - const li = document.createElement('li') - li.dataset['id'] = conversation.id - if (conversation.hasUnreadMessages) { - li.classList.add('has-unread-messages') - } - li.innerHTML = ` - -
          - ${avatar(conversation.otherParticipant)} - ${conversation.otherParticipant.username} -
          -
          -

          ${messageContent}

          - -
          -
          - ` - return li -} -``` - -Each conversation item contains a link to the conversation page and displays the other participant info and a preview of the last message. Also, you can use `.hasUnreadMessages` to add a class to the item and do some styling with CSS. Maybe a bolder font or accent the color. - -Note that we’re escaping the message content. That function comes from `static/shared.js`: - -``` -export function escapeHTML(str) { - return str - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, ''') -} -``` - -That prevents displaying as HTML the message the user wrote. If the user happens to write something like: - -``` - -``` - -It would be very annoying because that script will be executed 😅 -So yeah, always remember to escape content from untrusted sources. - -### Messages Subscription - -Last but not least, I want to subscribe to the message stream here. - -``` -const unsubscribe = subscribeToMessages(onMessageArrive) -page.addEventListener('disconnect', unsubscribe) -``` - -Add that line in the `homePage()` function. - -``` -function subscribeToMessages(cb) { - return http.subscribe('/api/messages', cb) -} -``` - -The `subscribe()` function returns a function that once called it closes the underlying connection. That’s why I passed it to the “disconnect” event; so when the user leaves the page, the event stream will be closed. - -``` -async function onMessageArrive(message) { - const conversationLI = document.querySelector(`li[data-id="${message.conversationID}"]`) - if (conversationLI !== null) { - conversationLI.classList.add('has-unread-messages') - conversationLI.querySelector('a > div > p').textContent = message.content - conversationLI.querySelector('a > div > time').textContent = new Date(message.createdAt).toLocaleString() - return - } - - let conversation - try { - conversation = await getConversation(message.conversationID) - conversation.lastMessage = message - } catch (err) { - console.error(err) - return - } - - const conversationsOList = document.getElementById('conversations') - if (conversationsOList === null) { - return - } - - conversationsOList.insertAdjacentElement('afterbegin', renderConversation(conversation)) -} - -function getConversation(id) { - return http.get('/api/conversations/' + id) -} -``` - -Every time a new message arrives, we go and query for the conversation item in the DOM. If found, we add the `has-unread-messages` class to the item, and update the view. If not found, it means the message is from a new conversation created just now. We go and do a GET request to `/api/conversations/{conversationID}` to get the conversation in which the message was created and prepend it to the conversation list. - -* * * - -That covers the home page 😊 -On the next post we’ll code the conversation page. - -[Souce Code][10] - --------------------------------------------------------------------------------- - -via: https://nicolasparada.netlify.com/posts/go-messenger-home-page/ - -作者:[Nicolás Parada][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://nicolasparada.netlify.com/ -[b]: https://github.com/lujun9972 -[1]: https://nicolasparada.netlify.com/posts/go-messenger-schema/ -[2]: https://nicolasparada.netlify.com/posts/go-messenger-oauth/ -[3]: https://nicolasparada.netlify.com/posts/go-messenger-conversations/ -[4]: https://nicolasparada.netlify.com/posts/go-messenger-messages/ -[5]: https://nicolasparada.netlify.com/posts/go-messenger-realtime-messages/ -[6]: https://nicolasparada.netlify.com/posts/go-messenger-dev-login/ -[7]: https://nicolasparada.netlify.com/posts/go-messenger-access-page/ -[8]: https://nicolasparada.netlify.com/img/go-messenger-home-page/conversation-form.png -[9]: https://nicolasparada.netlify.com/img/go-messenger-home-page/conversation-list.png -[10]: https://github.com/nicolasparada/go-messenger-demo diff --git a/sources/tech/20180720 Building a Messenger App- Conversation Page.md b/sources/tech/20180720 Building a Messenger App- Conversation Page.md deleted file mode 100644 index c721b48161..0000000000 --- a/sources/tech/20180720 Building a Messenger App- Conversation Page.md +++ /dev/null @@ -1,269 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Building a Messenger App: Conversation Page) -[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-conversation-page/) -[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/) - -Building a Messenger App: Conversation Page -====== - -This post is the 9th and last in a series: - - * [Part 1: Schema][1] - * [Part 2: OAuth][2] - * [Part 3: Conversations][3] - * [Part 4: Messages][4] - * [Part 5: Realtime Messages][5] - * [Part 6: Development Login][6] - * [Part 7: Access Page][7] - * [Part 8: Home Page][8] - - - -In this post we’ll code the conversation page. This page is the chat between the two users. At the top we’ll show info about the other participant, below, a list of the latest messages and a message form at the bottom. - -### Chat heading - -![chat heading screenshot][9] - -Let’s start by creating the file `static/pages/conversation-page.js` with the following content: - -``` -import http from '../http.js' -import { navigate } from '../router.js' -import { avatar, escapeHTML } from '../shared.js' - -export default async function conversationPage(conversationID) { - let conversation - try { - conversation = await getConversation(conversationID) - } catch (err) { - alert(err.message) - navigate('/', true) - return - } - - const template = document.createElement('template') - template.innerHTML = ` -
          - ← Back - ${avatar(conversation.otherParticipant)} - ${conversation.otherParticipant.username} -
          - - - ` - const page = template.content - return page -} - -function getConversation(id) { - return http.get('/api/conversations/' + id) -} -``` - -This page receives the conversation ID the router extracted from the URL. - -First it does a GET request to `/api/conversations/{conversationID}` to get info about the conversation. In case of error, we show it and redirect back to `/`. Then we render info about the other participant. - -### Conversation List - -![chat heading screenshot][10] - -We’ll fetch the latest messages too to display them. - -``` -let conversation, messages -try { - [conversation, messages] = await Promise.all([ - getConversation(conversationID), - getMessages(conversationID), - ]) -} -``` - -Update the `conversationPage()` function to fetch the messages too. We use `Promise.all()` to do both request at the same time. - -``` -function getMessages(conversationID) { - return http.get(`/api/conversations/${conversationID}/messages`) -} -``` - -A GET request to `/api/conversations/{conversationID}/messages` gets the latest messages of the conversation. - -``` -
            -``` - -Now, add that list to the markup. - -``` -const messagesOList = page.getElementById('messages') -for (const message of messages.reverse()) { - messagesOList.appendChild(renderMessage(message)) -} -``` - -So we can append messages to the list. We show them in reverse order. - -``` -function renderMessage(message) { - const messageContent = escapeHTML(message.content) - const messageDate = new Date(message.createdAt).toLocaleString() - - const li = document.createElement('li') - if (message.mine) { - li.classList.add('owned') - } - li.innerHTML = ` -

            ${messageContent}

            - - ` - return li -} -``` - -Each message item displays the message content itself with its timestamp. Using `.mine` we can append a different class to the item so maybe you can show the message to the right. - -### Message Form - -![chat heading screenshot][11] - -``` -
            - - -
            -``` - -Add that form to the current markup. - -``` -page.getElementById('message-form').onsubmit = messageSubmitter(conversationID) -``` - -Attach an event listener to the “submit” event. - -``` -function messageSubmitter(conversationID) { - return async ev => { - ev.preventDefault() - - const form = ev.currentTarget - const input = form.querySelector('input') - const submitButton = form.querySelector('button') - - input.disabled = true - submitButton.disabled = true - - try { - const message = await createMessage(input.value, conversationID) - input.value = '' - const messagesOList = document.getElementById('messages') - if (messagesOList === null) { - return - } - - messagesOList.appendChild(renderMessage(message)) - } catch (err) { - if (err.statusCode === 422) { - input.setCustomValidity(err.body.errors.content) - } else { - alert(err.message) - } - } finally { - input.disabled = false - submitButton.disabled = false - - setTimeout(() => { - input.focus() - }, 0) - } - } -} - -function createMessage(content, conversationID) { - return http.post(`/api/conversations/${conversationID}/messages`, { content }) -} -``` - -We make use of [partial application][12] to have the conversation ID in the “submit” event handler. It takes the message content from the input and does a POST request to `/api/conversations/{conversationID}/messages` with it. Then prepends the newly created message to the list. - -### Messages Subscription - -To make it realtime we’ll subscribe to the message stream in this page also. - -``` -page.addEventListener('disconnect', subscribeToMessages(messageArriver(conversationID))) -``` - -Add that line in the `conversationPage()` function. - -``` -function subscribeToMessages(cb) { - return http.subscribe('/api/messages', cb) -} - -function messageArriver(conversationID) { - return message => { - if (message.conversationID !== conversationID) { - return - } - - const messagesOList = document.getElementById('messages') - if (messagesOList === null) { - return - - } - messagesOList.appendChild(renderMessage(message)) - readMessages(message.conversationID) - } -} - -function readMessages(conversationID) { - return http.post(`/api/conversations/${conversationID}/read_messages`) -} -``` - -We also make use of partial application to have the conversation ID here. -When a new message arrives, first we check if it’s from this conversation. If it is, we go a prepend a message item to the list and do a POST request to `/api/conversations/{conversationID}/read_messages` to updated the last time the participant read messages. - -* * * - -That concludes this series. The messenger app is now functional. - -~~I’ll add pagination on the conversation and message list, also user searching before sharing the source code. I’ll updated once it’s ready along with a hosted demo 👨‍💻~~ - -[Souce Code][13] • [Demo][14] - --------------------------------------------------------------------------------- - -via: https://nicolasparada.netlify.com/posts/go-messenger-conversation-page/ - -作者:[Nicolás Parada][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://nicolasparada.netlify.com/ -[b]: https://github.com/lujun9972 -[1]: https://nicolasparada.netlify.com/posts/go-messenger-schema/ -[2]: https://nicolasparada.netlify.com/posts/go-messenger-oauth/ -[3]: https://nicolasparada.netlify.com/posts/go-messenger-conversations/ -[4]: https://nicolasparada.netlify.com/posts/go-messenger-messages/ -[5]: https://nicolasparada.netlify.com/posts/go-messenger-realtime-messages/ -[6]: https://nicolasparada.netlify.com/posts/go-messenger-dev-login/ -[7]: https://nicolasparada.netlify.com/posts/go-messenger-access-page/ -[8]: https://nicolasparada.netlify.com/posts/go-messenger-home-page/ -[9]: https://nicolasparada.netlify.com/img/go-messenger-conversation-page/heading.png -[10]: https://nicolasparada.netlify.com/img/go-messenger-conversation-page/list.png -[11]: https://nicolasparada.netlify.com/img/go-messenger-conversation-page/form.png -[12]: https://en.wikipedia.org/wiki/Partial_application -[13]: https://github.com/nicolasparada/go-messenger-demo -[14]: https://go-messenger-demo.herokuapp.com/ diff --git a/sources/tech/20180727 How to analyze your system with perf and Python.md b/sources/tech/20180727 How to analyze your system with perf and Python.md deleted file mode 100644 index c1be98cc0e..0000000000 --- a/sources/tech/20180727 How to analyze your system with perf and Python.md +++ /dev/null @@ -1,1479 +0,0 @@ -How to analyze your system with perf and Python -====== - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI-) - -Modern computers are ever increasing in performance and capacity. This matters little if that increasing capacity is not well utilized. Following is a description of the motivation and work behind "curt," a new tool for Linux systems for measuring and breaking down system utilization by process, by task, and by CPU using the `perf` command's Python scripting capabilities. - -I had the privilege of presenting this topic at [Texas Linux Fest 2018][1], and here I've gone a bit deeper into the details, included links to further information, and expanded the scope of my talk. - -### System utilization - -In discussing computation, let's begin with some assertions: - - 1. Every computational system is equally fast at doing nothing. - 2. Computational systems were created to do things. - 3. A computational system is better at doing things when it is doing something than when it is doing nothing. - - - -Modern computational systems have many streams of execution: - - * Often, very large systems are created by literally wiring together smaller systems. At IBM, these smaller systems are sometimes called CECs (short for Central Electronics Complexes and pronounced "keks"). - * There are multiple sockets for processor modules in each system. - * There are sometimes multiple chips per socket (in the form of dual-chip modules—DCMs—or multi-chip modules—MCMs). - * There are multiple cores per chip. - * There are multiple threads per core. - - - -In sum, there are potentially thousands of execution threads across a single computational system. - -Ideally, all these execution streams are 100% busy doing useful work. One measure of **utilization** for an individual execution stream (CPU thread) is the percentage of time that thread has tasks scheduled and running. (Note that I didn't say "doing useful work." Creating a tool that measures useful work is left as an exercise for the reader.) By extension, **system utilization** is the overall percentage of time that all execution streams of a system have tasks scheduled and running. Similarly, utilization can be defined with respect to an individual task. **Task utilization** is the percentage of the lifetime of the task that was spent actively running on any CPU thread. By extension, **process utilization** is the collective utilization of its tasks. - -### Utilization measurement tools - -There are tools that measure system utilization: `uptime`, `vmstat`, `mpstat`, `nmon`, etc. There are tools that measure individual process utilization: `time`. There are not many tools that measure system-wide per-process and per-task utilization. One such command is `curt` on AIX. According to [IBM's Knowledge Center][2]: "The `curt` command takes an AIX trace file as input and produces a number of statistics related to processor (CPU) utilization and process/thread/pthread activity." - -The AIX `curt` command reports system-wide, per-processor, per-process, and per-task statistics for application processing (user time), system calls (system time), hypervisor calls, kernel threads, interrupts, and idle time. - -This seems like a good model for a similar command for a Linux system. - -### Utilization data - -Before starting to create any tools for utilization analysis, it is important to know what data is required. Since utilization is directly related to whether a task is actively running or not, related scheduling events are required: When is the task made to run, and when is it paused? Tracking on which CPU the task runs is important, so migration events are required for implicit migrations. There are also certain system calls that force explicit migrations. Creation and deletion of tasks are obviously important. Since we want to understand user time, system time, hypervisor time, and interrupt time, events that show the transitions between those task states are required. - -The Linux kernel contains "tracepoints" for all those events. It is possible to enable tracing for those events directly in the kernel's `debugfs` filesystem, usually mounted at `/sys/kernel/debug`, in the `tracing` directory (`/sys/kernel/debug/tracing`). - -An easier way to record tracing data is with the Linux `perf` command. - -### The perf command - -`perf` is a very powerful userspace command for tracing or counting both hardware and software events. - -Software events are predefined in the kernel, can be predefined in userspace code, and can be dynamically created (as "probes") in kernel or userspace code. - -`perf` can do much more than just trace and count, though. - -#### perf stat - -The `stat` subcommand of `perf` will run a command, count some events commonly found interesting, and produce a simple report: -``` -Performance counter stats for './load 100000': -  -      90537.006424      task-clock:u (msec)       #    1.000 CPUs utilized           -                 0      context-switches:u        #    0.000 K/sec                   -                 0      cpu-migrations:u          #    0.000 K/sec                   -               915      page-faults:u             #    0.010 K/sec                   -   386,836,206,133      cycles:u                  #    4.273 GHz                      (66.67%) -     3,488,523,420      stalled-cycles-frontend:u #    0.90% frontend cycles idle     (50.00%) -   287,222,191,827      stalled-cycles-backend:u  #   74.25% backend cycles idle      (50.00%) -   291,102,378,513      instructions:u            #    0.75  insn per cycle         -                                                  #    0.99  stalled cycles per insn  (66.67%) -    43,730,320,236      branches:u                #  483.010 M/sec                    (50.00%) -       822,030,340      branch-misses:u           #    1.88% of all branches          (50.00%) -  -      90.539972837 seconds time elapsed -``` - -#### perf record, perf report, and perf annotate - -For much more interesting analysis, the `perf` command can also be used to record events and information associated with the task state at the time the event occurred: -``` -$ perf record ./some-command -[ perf record: Woken up 55 times to write data ] -[ perf record: Captured and wrote 13.973 MB perf.data (366158 samples) ] -$ perf report --stdio --show-nr-samples --percent-limit 4 -# Samples: 366K of event 'cycles:u' -# Event count (approx.): 388851358382 -# -# Overhead       Samples  Command  Shared Object      Symbol                                           -# ........  ............  .......  .................  ................................................ -# -    62.31%        228162  load     load               [.] main -    19.29%         70607  load     load               [.] sum_add -    18.33%         67117  load     load               [.] sum_sub -``` - -This example shows a program that spends about 60% of its running time in the function `main` and about 20% each in subfunctions `sum_sub` and `sum_add`. Note that the default event used by `perf record` is "cycles." Later examples will show how to use `perf record` with other events. - -`perf report` can further report runtime statistics by source code line (if the compilation was performed with the `-g` flag to produce debug information): -``` -$ perf report --stdio --show-nr-samples --percent-limit 4 --sort=srcline -# Samples: 366K of event 'cycles:u' -# Event count (approx.): 388851358382 -# -# Overhead       Samples  Source:Line                         -# ........  ............  ................................... -# -    19.40%         71031  load.c:58 -    16.16%         59168  load.c:18 -    15.11%         55319  load.c:14 -    13.30%         48690  load.c:66 -    13.23%         48434  load.c:70 -     4.58%         16767  load.c:62 -     4.01%         14677  load.c:56 -``` - -Further, `perf annotate` can show statistics for each instruction of the program: -``` -$ perf annotate --stdio -Percent |      Source code & Disassembly of load for cycles:u (70607 samples) ------------------------------------------------------------------------------- -         :      0000000010000774 : -         :      int sum_add(int sum, int value) { -   12.60 :        10000774:   std     r31,-8(r1) -    0.02 :        10000778:   stdu    r1,-64(r1) -    0.00 :        1000077c:   mr      r31,r1 -   41.90 :        10000780:   mr      r10,r3 -    0.00 :        10000784:   mr      r9,r4 -    0.05 :        10000788:   stw     r10,32(r31) -   23.78 :        1000078c:   stw     r9,36(r31) -         :              return (sum + value); -    0.76 :        10000790:   lwz     r10,32(r31) -    0.00 :        10000794:   lwz     r9,36(r31) -   14.75 :        10000798:   add     r9,r10,r9 -    0.00 :        1000079c:   extsw   r9,r9 -         :      } -    6.09 :        100007a0:   mr      r3,r9 -    0.02 :        100007a4:   addi    r1,r31,64 -    0.03 :        100007a8:   ld      r31,-8(r1) -    0.00 :        100007ac:   blr -``` - -(Note: this code is not optimized.) - -#### perf top - -Similar to the `top` command, which displays (at a regular update interval) the processes using the most CPU time, `perf top` will display the functions using the most CPU time among all processes on the system, a nice leap in granularity. - -![](https://opensource.com/sites/default/files/uploads/perf-top.gif) - -#### perf list - -The examples thus far have used the default event, run cycles. There are hundreds and perhaps thousands of events of different types. `perf list` will show them all. Following are just a few examples: -``` -$ perf list -  instructions                                       [Hardware event] -  context-switches OR cs                             [Software event] -  L1-icache-loads                                    [Hardware cache event] -  mem_access OR cpu/mem_access/                      [Kernel PMU event] -cache: -  pm_data_from_l2                                   -       [The processor's data cache was reloaded from local core's L2 due to a demand load] -floating point: -  pm_fxu_busy                                       -       [fxu0 busy and fxu1 busy] -frontend: -  pm_br_mpred_cmpl                                   -       [Number of Branch Mispredicts] -memory: -  pm_data_from_dmem                                 -       [The processor's data cache was reloaded from another chip's memory on the same Node or Group (Distant) due to a demand load] -  pm_data_from_lmem                                 -       [The processor's data cache was reloaded from the local chip's Memory due to a demand load] -  rNNN                                               [Raw hardware event descriptor] -  raw_syscalls:sys_enter                             [Tracepoint event] -  syscalls:sys_enter_chmod                           [Tracepoint event] -  sdt_libpthread:pthread_create                      [SDT event] -``` - -Events labeled as `Hardware event`, `Hardware cache event`, `Kernel PMU event`, and most (if not all) of the events under the categories like `cache`, `floating point`, `frontend`, and `memory` are hardware events counted by the hardware and triggered each time a certain count is reached. Once triggered, an entry is made into the kernel trace buffer with the current state of the associated task. `Raw hardware event` codes are alphanumeric encodings of the hardware events. These are mostly needed when the hardware is newer than the kernel and the user needs to enable events that are new for that hardware. Users will rarely, if ever, need to use raw event codes. - -Events labeled `Tracepoint event` are embedded in the kernel. These are triggered when that section of code is executed by the kernel. There are "syscalls" events for every system call supported by the kernel. `raw_syscalls` events are triggered for every system call. Since there is a limit to the number of events being actively traced, the `raw_syscalls` events may be more practical when a large number of system calls need to be traced. - -Events labeled `SDT event` are for software-defined tracepoints (SDTs). These can be embedded in application or library code and enabled as needed. When enabled, they behave just like other events: When that section of code is executed (by any task being traced on the system), an entry is made in the kernel trace buffer with the current state of the associated task. This is a very powerful capability that can prove very useful. - -#### perf buildid-cache and perf probe - -Enabling SDTs is easy. First, make the SDTs for a certain library known to `perf`: -``` -$ perf buildid-cache -v --add /lib/powerpc64le-linux-gnu/libpthread.so.0 -$ perf list | grep libpthread -[…] -  sdt_libpthread:pthread_create                      [SDT event] -[…] -``` - -Then, turn SDT definitions into available tracepoints: -``` -$ /usr/bin/sudo perf probe sdt_libpthread:pthread_create -Added new event: -  sdt_libpthread:pthread_create (on %pthread_create in /lib/powerpc64le-linux-gnu/libpthread-2.27.so) -You can now use it in all perf tools, such as: -    perf record -e sdt_libpthread:pthread_create -aR sleep 1 -$ perf record -a -e sdt_libpthread:pthread_create ./test -[ perf record: Woken up 1 times to write data ] -[ perf record: Captured and wrote 0.199 MB perf.data (9 samples) ] -``` - -Note that any location in an application or library can be made into a tracepoint. To find functions in an application that can be made into tracepoints, use `perf probe` with `–funcs`: -``` -$ perf probe –x ./load --funcs -[…] -main -sum_add -sum_sub -``` - -To enable the function `main` of the `./load` application as a tracepoint: -``` -/usr/bin/sudo perf probe –x ./load main -Added new event: -  probe_load:main      (on main in /home/pc/projects/load-2.1pc/load) -You can now use it in all perf tools, such as: -    perf record –e probe_load:main –aR sleep 1 -$ perf list | grep load:main -  probe_load:main                                     [Tracepoint event] -$ perf record –e probe_load:main ./load -[ perf record: Woken up 1 times to write data ] -[ perf record: Captured and wrote 0.024 MB perf.data (1 samples) ] -``` - -#### perf script - -Continuing the previous example, `perf script` can be used to walk through the `perf.data` file and output the contents of each record: -``` -$ perf script -            Load 16356 [004] 80526.760310: probe_load:main: (4006a2) -``` - -### Processing perf trace data - -The preceding discussion and examples show that `perf` can collect the data required for system utilization analysis. However, how can that data be processed to produce the desired results? - -#### perf eBPF - -A relatively new and emerging technology with `perf` is called [eBPF][3]. BPF is an acronym for Berkeley Packet Filter, and it is a C-like language originally for, not surprisingly, network packet filtering in the kernel. eBPF is an acronym for extended BPF, a similar, but more robust C-like language based on BPF. - -Recent versions of `perf` can be used to incorporate compiled eBPF code into the kernel to securely and intelligently handle events for any number of purposes, with some limitations. - -The capability is very powerful and quite useful for real-time, continuous updates of event-related data and statistics. - -However, as this capability is emerging, support is mixed on current releases of Linux distributions. It's a bit complicated (or, put differently, I have not figured it out yet). It's also only for online use; there is no offline capability. For these reasons, I won't cover it further here. - -#### perf data file - -`perf record` produces a `perf.data` file. The file is a structured binary file, is not particularly well documented, has no programming interface for access, and is unclear on what compatibility guarantees exist. For these reasons, I chose not to directly use the `perf.data` file. - -#### perf script - -One of the last examples above showed how `perf script` is used for walking through the `perf.data` file and emitting basic information about each record there. This is an appropriate model for what would be needed to process the file and track the state changes and compute the statistics required for system utilization analysis. - -`perf script` has several modes of operation, including several higher-level scripts that come with `perf` that produce statistics based on the trace data in a `perf.data` file. -``` -$ perf script -l -List of available trace scripts: -  rw-by-pid                            system-wide r/w activity -  rwtop [interval]                     system-wide r/w top -  wakeup-latency                       system-wide min/max/avg wakeup latency -  failed-syscalls [comm]               system-wide failed syscalls -  rw-by-file                    r/w activity for a program, by file -  failed-syscalls-by-pid [comm]        system-wide failed syscalls, by pid -  intel-pt-events                      print Intel PT Power Events and PTWRITE -  syscall-counts-by-pid [comm]         system-wide syscall counts, by pid -  export-to-sqlite [database name] [columns] [calls] export perf data to a sqlite3 database -  futex-contention                     futext contention measurement -  sctop [comm] [interval]              syscall top -  event_analyzing_sample               analyze all perf samples -  net_dropmonitor                      display a table of dropped frames -  compaction-times [-h] [-u] [-p|-pv] [-t | [-m] [-fs] [-ms]] [pid|pid-range|comm-regex] display time taken by mm compaction -  export-to-postgresql [database name] [columns] [calls] export perf data to a postgresql database -  stackcollapse                        produce callgraphs in short form for scripting use -  netdev-times [tx] [rx] [dev=] [debug] display a process of packet and processing time -  syscall-counts [comm]                system-wide syscall counts -  sched-migration                      sched migration overview -$ perf script failed-syscalls-by-pid /bin/ls -  -syscall errors: -  -comm [pid]                           count -------------------------------  ---------- -  -ls [18683] -  syscall: access           -    err = ENOENT                         1 -  syscall: statfs           -    err = ENOENT                         1 -  syscall: ioctl           -    err = ENOTTY                         3 -``` - -What do these scripts look like? Let's find out. -``` -$ locate failed-syscalls-by-pid -/usr/libexec/perf-core/scripts/python/failed-syscalls-by-pid.py -[…] -$ rpm –qf /usr/libexec/perf-core/scripts/python/failed-syscalls-by-pid.py -perf-4.14.0-46.el7a.x86_64 -$ $ ls /usr/libexec/perf-core/scripts -perl  python -$ perf script -s lang -  -Scripting language extensions (used in perf script -s [spec:]script.[spec]): -  -  Perl                                       [Perl] -  pl                                         [Perl] -  Python                                     [Python] -  py                                         [Python] -``` - -So, these scripts come with `perf`, and both Python and Perl are supported languages. - -Note that for the entirety of this content, I will refer exclusively to Python. - -#### perf scripts - -How do these scripts do what they do? Here are important extracts from `/usr/libexec/perf-core/scripts/python/failed-syscalls-by-pid.py`: -``` -def raw_syscalls__sys_exit(event_name, context, common_cpu, -        common_secs, common_nsecs, common_pid, common_comm, -        common_callchain, id, ret): -[…] -        if ret < 0: -[…] -                        syscalls[common_comm][common_pid][id][ret] += 1 -``` - -The function `raw_syscalls__sys_exit` has parameters for all the data for the associated event. The rest of the function only increments a counter associated with the command, process ID, and system call. The rest of the code doesn't do that much. Most of the complexity is in the function signature for the event-handling routine. - -Fortunately, `perf` makes it easy to figure out the proper signatures for various tracepoint event-handling functions. - -#### perf script –gen-script - -For the `raw_syscalls` events, we can generate a trace containing just those events: -``` -$ perf list | grep raw_syscalls -  raw_syscalls:sys_enter                             [Tracepoint event] -  raw_syscalls:sys_exit                              [Tracepoint event] -$ perf record -e 'raw_syscalls:*' /bin/ls >/dev/null -[ perf record: Woken up 1 times to write data ] -[ perf record: Captured and wrote 0.025 MB perf.data (176 samples) ] -``` - -We can then have `perf` generate a script that contains sample implementations of event-handling functions for the events in the `perf.data` file: -``` -$ perf script --gen-script python -generated Python script: perf-script.py -``` - -What do we find in the script? -``` -def raw_syscalls__sys_exit(event_name, context, common_cpu, -        common_secs, common_nsecs, common_pid, common_comm, -        common_callchain, id, ret): -[…] -def raw_syscalls__sys_enter(event_name, context, common_cpu, -        common_secs, common_nsecs, common_pid, common_comm, -        common_callchain, id, args): -``` - -Both event-handling functions are specified with their signatures. Nice! - -Note that this script works with `perf script –s`: -``` -$ perf script -s ./perf-script.py -in trace_begin -raw_syscalls__sys_exit     7 94571.445908134    21117 ls                    id=0, ret=0 -raw_syscalls__sys_enter     7 94571.445942946    21117 ls                    id=45, args=���?bc���?� -[…] -``` - -Now we have a template on which to base writing a Python script to parse the events of interest for reporting system utilization. - -### perf scripting - -The Python scripts generated by `perf script –gen-script` are not directly executable. They must be invoked by `perf`: -``` -$ perf script –s ./perf-script.py -``` - -What's really going on here? - - 1. First, `perf` starts. The `script` subcommand's `-s` option indicates that an external script will be used. - - 2. `perf` establishes a Python runtime environment. - - 3. `perf` loads the specified script. - - 4. `perf` runs the script. The script can perform normal initialization and even handle command line arguments, although passing the arguments is slightly awkward, requiring a `--` separator between the arguments for `perf` and for the script: - ``` - $ perf script -s ./perf-script.py -- --script-arg1 [...] - - ``` - - 5. `perf` processes each record of the trace file, calling the appropriate event-handling function in the script. Those event-handling functions can do whatever they need to do. - - - - -### Utilization - -It appears that `perf` scripting has sufficient capabilities for a workable solution. What sort of information is required to generate the statistics for system utilization? - - * Task creation (`fork`, `pthread_create`) - * Task termination (`exit`) - * Task replacement (`exec`) - * Task migration, explicit or implicit, and current CPU - * Task scheduling - * System calls - * Hypervisor calls - * Interrupts - - - -It can be helpful to understand what portion of time a task spends in various system calls, handling interrupts, or making explicit calls out to the hypervisor. Each of these categories of time can be considered a "state" for the task, and the methods of transitioning from one state to another need to be tracked: - -![](https://opensource.com/sites/default/files/uploads/task-state-diagram.png) - -The most important point of the diagram is that there are events for each state transition. - - * Task creation: `clone` system call - * Task termination: `sched:sched_process_exit` - * Task replacement: `sched:sched_process_exec` - * Task migration: `sched_setaffinity` system call (explicit), `sched:sched_migrate_task` (implicit) - * Task scheduling: `sched:sched_switch` - * System calls: `raw_syscalls:sys_enter`, `raw_syscalls:sys_exit` - * Hypervisor calls: (POWER-specific) `powerpc:hcall_entry`, `powerpc:hcall_exit` - * Interrupts: `irq:irq_handler_entry`, `irq:irq_handler_exit` - - - -### The curt command for Linux - -`perf` provides a suitable infrastructure with which to capture the necessary data for system utilization. There are a sufficient set of events available for tracing in the Linux kernel. The Python scripting capabilities permit a powerful and flexible means of processing the trace data. It's time to write the tool. - -#### High-level design - -In processing each event, the relevant state of the affected tasks must be updated: - - * New task? Create and initialize data structures to track the task's state - * Command - * Process ID - * Task ID - * Migration count (0) - * Current CPU - * New CPU for this task? Create and initialize data structures for CPU-specific data - * User time (0) - * System time (0) - * Hypervisor time (0) - * Interrupt time (0) - * Idle time (0) - * New transaction for this task? Create and initialize data structures for transaction-specific data - * Elapsed time (0) - * Count (0) - * Minimum (maxint), maximum (0) - * Existing task? - * Accumulate time for the previous state - * Transaction ending? Accumulate time for the transaction, adjust minimum, maximum values - * Set new state - * Save current time (time current state entered) - * Migration? Increment migration count - - - -#### High-level example - -For a `raw_syscalls:sys_enter` event: - - * If this task has not been seen before, allocate and initialize a new task data structure - * If the CPU is new for this task, allocate and initialize a new CPU data structure - * If this system call is new for this task, allocate and initialize a new call data structure - * In the task data structure: - * Accumulate the time since the last state change in a bucket for the current state ("user") - * Set the new state ("system") - * Save the current timestamp as the start of this time period for the new state - - - -#### Edge cases - -##### sys_exit as a task's first event - -If the first event in the trace for a task is `raw_syscalls:sys_exit`: - - * There is no matching `raw_syscalls:sys_enter` with which to determine the start time of this system call. - * The accumulated time since the start of the trace was all spent in the system call and needs to be added to the overall elapsed time spent in all calls to this system call. - * The elapsed time of this system call is unknown. - * It would be inaccurate to account for this elapsed time in the average, minimum, or maximum statistics for this system call. - - - -In this case, the tool creates a separate bucket called "pending" for time spent in the system call that cannot be accounted for in the average, minimum, or maximum. - -A "pending" bucket is required for all transactional events (system calls, hypervisor calls, and interrupts). - -##### sys_enter as a task's last event - -Similarly, If the last event in the trace for a task is `raw_syscalls:sys_enter`: - - * There is no matching `raw_syscalls:sys_exit` with which to determine the end time of this system call. - * The accumulated time from the start of the system call to the end of the trace was all spent in the system call and needs to be added to the overall elapsed time spent in all calls to this system call. - * The elapsed time of this system call is unknown. - * It would be inaccurate to account for this elapsed time in the average, minimum, or maximum statistics for this system call. - - - -This elapsed time is also accumulated in the "pending" bucket. - -A "pending" bucket is required for all transactional events (system calls, hypervisor calls, and interrupts). - -Since this condition can only be discovered at the end of the trace, a final "wrap-up" step is required in the tool where the statistics for all known tasks are completed based on their final states. - -##### Indeterminable state - -It is possible that a very busy task (or a short trace) will never see an event for a task from which the task's state can be determined. For example, if only `sched:sched_switch` or `sched:sched_task_migrate` events are seen for a task, it is impossible to determine that task's state. However, the task is known to exist and to be running. - -Since the actual state cannot be determined, the runtime for the task is accumulated in a separate bucket, arbitrarily called "busy-unknown." For completeness, this time is also displayed in the final report. - -##### Invisible tasks - -For very, very busy tasks (or a short trace), it is possible that a task was actively running during the entire time the trace was being collected, but no events for that task appear in the trace. It was never migrated, paused, or forced to wait. - -Such tasks cannot be known to exist by the tool and will not appear in the report. - -#### curt.py Python classes - -##### Task - - * One per task - * Holds all task-specific data (command, process ID, state, CPU, list of CPU data structures [see below], migration count, lists of per-call data structures [see below]) - * Maintains task state - - - -##### Call - - * One per unique transaction, per task (for example, one for the "open" system call, one for the "close" system call, one for IRQ 27, etc.) - * Holds call-specific data (e.g., start timestamp, count, elapsed time, minimum, maximum) - * Allocated as needed (lazy allocation) - * Stored within a task in a Python dictionary indexed by the unique identifier of the call (e.g., system call code, IRQ number, etc.) - - - -##### CPU - - * One per CPU on which this task has been observed to be running - * Holds per-CPU task data (e.g., user time, system time, hypervisor call time, interrupt time) - * Allocated as needed (lazy allocation) - * Stored within a task in a Python dictionary indexed by the CPU number - - - -#### curt.py event processing example - -As previously discussed, `perf script` will iterate over all events in the trace and call the appropriate event-handling function for each event. - -A first attempt at an event-handling function for `sys_exit`, given the high-level example above, might be: -``` -tasks = {} - -def raw_syscalls__sys_enter(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, id, args): - - # convert the multiple timestamp values into a single value - timestamp = nsecs(common_secs, common_nsecs) - - # find this task's data structure - try: - task = tasks[common_pid] - except: - # new task! - task = Task() - # save the command string - task.comm = common_comm - # save the new task in the global list (dictionary) of tasks - tasks[common_pid] = task - - if common_cpu not in task.cpus: - # new CPU! - task.cpu = common_cpu - task.cpus[common_cpu] = CPU() - - # compute time spent in the previous state ('user') - delta = timestamp – task.timestamp - # accumulate 'user' time for this task/CPU - task.cpus[task.cpu].user += delta - if id not in task.syscalls: - # new system call for this task! - task.syscalls[id] = Call() - - # change task's state - task.mode = 'sys' - - # save the timestamp for the last event (this one) for this task - task.timestamp = timestamp - -def raw_syscalls__sys_exit(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, id, ret): - - # convert the multiple timestamp values into a single value - timestamp = nsecs(common_secs, common_nsecs) - - # get the task data structure - task = tasks[common_pid] - - # compute elapsed time for this system call - delta = task.timestamp - timestamp - - # accumulate time for this task/system call - task.syscalls[id].elapsed += delta - # increment the tally for this task/system call - task.syscalls[id].count += 1 - # adjust statistics - if delta < task.syscalls[id].min: - task.syscalls[id].min = delta - if delta > task.syscalls[id].max: - task.syscalls[id].max = delta - - # accumulate time for this task's state on this CPU - task.cpus[common_cpu].system += delta - - # change task's state - task.mode = 'user' - - # save the timestamp for the last event (this one) for this task - task.timestamp = timestamp -``` - -### Handling the edge cases - -Following are some of the edge cases that are possible and must be handled. - -#### Sys_exit as first event - -As a system-wide trace can be started at an arbitrary time, it is certainly possible that the first event for a task is `raw_syscalls:sys_exit`. This requires adding the same code for new task discovery from the event-handling function for `raw_syscalls:sys_enter` to the handler for `raw_syscalls:sys_exit`. This: -``` -  # get the task data structure -  task = tasks[common_pid] -``` - -becomes this: -``` -  # find this task's data structure -  try: -    task = tasks[common_pid] -  except: -    # new task! -    task = Task() -    # save the command string -    task.comm = common_comm -    # save the new task in the global list (dictionary) of tasks -    tasks[common_pid] = task -``` - -Another issue is that it is impossible to properly accumulate the data for this system call since there is no timestamp for the start of the system call. The time from the start of the trace until this event has been spent by this task in the system call. It would be inaccurate to ignore this time. It would also be inaccurate to incorporate this time such that it is used to compute the average, minimum, or maximum. The only reasonable option is to accumulate this separately, calling it "pending" system time. To accurately compute this time, the timestamp of the first event of the trace must be known. Since any event could be the first event in the trace, every event must conditionally save its timestamp if it is the first event. A global variable is required: -``` -start_timestamp = 0 - -``` - -And every event-handling function must conditionally save its timestamp: -``` -  # convert the multiple timestamp values into a single value -  timestamp = nsecs(common_secs, common_nsecs) - -  If start_timestamp = 0: -    start_timestamp = timestamp -``` - -So, the event-handling function for `raw_syscalls:sys_exit` becomes: -``` -def raw_syscalls__sys_exit(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, id, ret): - -  # convert the multiple timestamp values into a single value -  timestamp = nsecs(common_secs, common_nsecs) - -  If start_timestamp = 0: -    start_timestamp = timestamp - -  # find this task's data structure -  try: -    task = tasks[common_pid] - -    # compute elapsed time for this system call -    delta =  task.timestamp - timestamp - -    # accumulate time for this task/system call -    task.syscalls[id].elapsed += delta -    # increment the tally for this task/system call -    task.syscalls[id].count += 1 -    # adjust statistics -    if delta < task.syscalls[id].min: -      task.syscalls[id].min = delta -    if delta > task.syscalls[id].max: -      task.syscalls[id].max = delta - -  except: -    # new task! -    task = Task() -    # save the command string -    task.comm = common_comm -    # save the new task in the global list (dictionary) of tasks -    tasks[common_pid] = task - -    # compute elapsed time for this system call -    delta =  start_timestamp - timestamp - -    # accumulate time for this task/system call -    task.syscalls[id].pending += delta - -  # accumulate time for this task's state on this CPU -  task.cpus[common_cpu].system += delta - -  # change task's state -  task.mode = 'user' - -  # save the timestamp for the last event (this one) for this task -  task.timestamp = timestamp -``` -### Sys_enter as last event - -A similar issue to having `sys_exit` as the first event for a task is when `sys_enter` is the last event seen for a task. The time spent in the system call must be accumulated for completeness but can't accurately impact the average, minimum, nor maximum. This time will also be accumulated in for a separate "pending" state. - -To accurately determine the elapsed time of the pending system call, from `sys_entry` to the end of the trace period, the timestamp of the final event in the trace file is required. Unfortunately, there is no way to know which event is the last event until that event has already been processed. So, all events must save their respective timestamps in a global variable. - -It may be that many tasks are in the state where the last event seen for them was `sys_enter`. Thus, after the last event is processed, a final "wrap up" step is required to complete the statistics for those tasks. Fortunately, there is a `trace_end` function which is called by `perf` after the final event has been processed. - -Last, we need to save the `id` of the system call in every `sys_enter`. -``` -curr_timestamp = 0 - -def raw_syscalls__sys_enter(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, id, args): - -  # convert the multiple timestamp values into a single value -  curr_timestamp = nsecs(common_secs, common_nsecs) -[…] -  task.syscall = id -[…] - -def trace_end(): -        for tid in tasks.keys(): -                task = tasks[tid] -                # if this task ended while executing a system call -                if task.mode == 'sys': -                        # compute the time from the entry to the system call to the end of the trace period -                        delta = curr_timestamp - task.timestamp -                        # accumulate the elapsed time for this system call -                        task.syscalls[task.syscall].pending += delta -                        # accumulate the system time for this task/CPU -                        task.cpus[task.cpu].sys += delta -``` - -### Migrations - -A task migration is when a task running on one CPU is moved to another CPU. This can happen by either: - - 1. Explicit request (e.g., a call to `sched_setaffinity`), or - 2. Implicitly by the kernel (e.g., load balancing or vacating a CPU being taken offline) - - - -When detected: - - * The migration count for the task should be incremented - * The statistics for the previous CPU should be updated - * A new CPU data structure may need to be updated and initialized if the CPU is new for the task - * The task's current CPU is set to the new CPU - - - -For accurate statistics, task migrations must be detected as soon as possible. The first case, explicit request, happens within a system call and can be detected in the `sys_exit` event for that system call. The second case has its own event, `sched:sched_migrate_task`, so it will need a new event-handling function. -``` -def raw_syscalls__sys_exit(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, id, ret): - -  # convert the multiple timestamp values into a single value -  timestamp = nsecs(common_secs, common_nsecs) - -  If start_timestamp = 0: -    start_timestamp = timestamp - -  # find this task's data structure -  try: -    task = tasks[common_pid] - -    # compute elapsed time for this system call -    delta =  task.timestamp - timestamp - -    # accumulate time for this task/system call -    task.syscalls[id].elapsed += delta -    # increment the tally for this task/system call -    task.syscalls[id].count += 1 -    # adjust statistics -    if delta < task.syscalls[id].min: -      task.syscalls[id].min = delta -    if delta > task.syscalls[id].max: -      task.syscalls[id].max = delta - -  except: -    # new task! -    task = Task() -    # save the command string -    task.comm = common_comm -    # save the new task in the global list (dictionary) of tasks -    tasks[common_pid] = task - -    task.cpu = common_cpu - -    # compute elapsed time for this system call -    delta =  start_timestamp - timestamp - -    # accumulate time for this task/system call -    task.syscalls[id].pending += delta - -  If common_cpu != task.cpu: -    task.migrations += 1 -    # divide the time spent in this syscall in half... -    delta /= 2 -    # and give have to the previous CPU, below, and half to the new CPU, later -    task.cpus[task.cpu].system += delta - -  # accumulate time for this task's state on this CPU -  task.cpus[common_cpu].system += delta - -  # change task's state -  task.mode = 'user' - -  # save the timestamp for the last event (this one) for this task -  task.timestamp = timestamp - -def sched__sched_migrate_task(event_name, context, common_cpu, -        common_secs, common_nsecs, common_pid, common_comm, -        common_callchain, comm, pid, prio, orig_cpu, -        dest_cpu, perf_sample_dict): - -  If start_timestamp = 0: -    start_timestamp = timestamp - -  # find this task's data structure -  try: -    task = tasks[common_pid] -  except: -    # new task! -    task = Task() -    # save the command string -    task.comm = common_comm -    # save the new task in the global list (dictionary) of tasks -    tasks[common_pid] = task - -    task.cpu = common_cpu - -    If common_cpu not in task.cpus: -      task.cpus[common_cpu] = CPU() - -    task.migrations += 1 -``` - -### Task creation - -To accurately collect statistics for a task, it is essential to know when the task is created. Tasks can be created with `fork()`, which creates a new process, or `pthread_create()`, which creates a new task within the same process. Fortunately, both are manifested by a `clone` system call and made evident by a `sched:sched_process_fork` event. The lifetime of the task starts at the `sched_process_fork` event. The edge case that arises is that the first likely events for the new task are: - - 1. `sched_switch` when the new task starts running. The new task should be considered idle at creation until this event occurs - 2. `sys_exit` for the `clone` system call. The initial state of the new task needs to be based on the state of the task that creates it, including being within the `clone` system call. - - - -One edge case that must be handled is if the creating task (parent) is not yet known, it must be created and initialized, and the presumption is that it has been actively running since the start of the trace. -``` -def sched__sched_process_fork(event_name, context, common_cpu, -        common_secs, common_nsecs, common_pid, common_comm, -        common_callchain, parent_comm, parent_pid, child_comm, child_pid): -  global start_timestamp, curr_timestamp -  curr_timestamp = self.timestamp -  if (start_timestamp == 0): -    start_timestamp = curr_timestamp -  # find this task's data structure -  try: -    task = tasks[common_pid] -  except: -    # new task! -    task = Task() -    # save the command string -    task.comm = common_comm -    # save the new task in the global list (dictionary) of tasks -    tasks[common_pid] = task -  try: -    parent = tasks[self.parent_tid] -  except: -    # need to create parent task here! -    parent = Task(start_timestamp, self.command, 'sys', self.pid) -    parent.sched_stat = True # ? -    parent.cpu = self.cpu -    parent.cpus[parent.cpu] = CPU() -    tasks[self.parent_tid] = parent -  -    task.resume_mode = parent.mode -    task.syscall = parent.syscall -    task.syscalls[task.syscall] = Call() -    task.syscalls[task.syscall].timestamp = self.timestamp -``` - -### Task exit - -Similarly, for complete and accurate task statistics, it is essential to know when a task has terminated. There's an event for that: `sched:sched_process_exit`. This one is pretty easy to handle, in that the effort is just to close out the statistics and set the mode appropriately, so any end-of-trace processing will not think the task is still active: -``` -def sched__sched_process_exit_old(event_name, context, common_cpu, -        common_secs, common_nsecs, common_pid, common_comm, -        common_callchain, comm, pid, prio): -  global start_timestamp, curr_timestamp -  curr_timestamp = self.timestamp -  if (start_timestamp == 0): -    start_timestamp = curr_timestamp - -  # find this task's data structure -  try: -    task = tasks[common_pid] -  except: -    # new task! -    task = Task() -    # save the command string -    task.comm = common_comm -    task.timestamp = curr_timestamp -    # save the new task in the global list (dictionary) of tasks -    tasks[common_pid] = task - -  delta = timestamp – task.timestamp -  task.sys += delta -  task.mode = 'exit' -``` - -### Output - -What follows is an example of the report displayed by `curt`, slightly reformatted to fit on a narrower page width and with the idle-time classification data (which makes the output very wide) removed, and for brevity. Seen are two processes, 1497 and 2857. Process 1497 has two tasks, 1497 and 1523. Each task has a per-CPU summary and system-wide ("ALL" CPUs) summary. Each task's data is followed by the system call data for that task (if any), hypervisor call data (if any), and interrupt data (if any). After each process's respective tasks is a per-process summary. Process 2857 has a task 2857-0 that is the previous task image before an exec() system call replaced the process image. After all processes is a system-wide summary. -``` -1497: --- [  task] command     cpu      user       sys       irq        hv      busy      idle |  util% moves -   [  1497] X             2  0.076354  0.019563  0.000000  0.000000  0.000000 15.818719 |   0.6% -   [  1497] X           ALL  0.076354  0.019563  0.000000  0.000000  0.000000 15.818719 |   0.6%     0 -  -  -- ( ID)name             count   elapsed      pending      average      minimum      maximum -     (  0)read                 2  0.004699     0.000000     0.002350     0.002130     0.002569 -     (232)epoll_wait           1  9.968375     5.865208     9.968375     9.968375     9.968375 -  --- [  task] command     cpu      user       sys       irq        hv      busy      idle |  util% moves -   [  1523] InputThread   1  0.052598  0.037073  0.000000  0.000000  0.000000 15.824965 |   0.6% -   [  1523] InputThread ALL  0.052598  0.037073  0.000000  0.000000  0.000000 15.824965 |   0.6%     0 -  -  -- ( ID)name             count   elapsed      pending      average      minimum      maximum -     (  0)read                14  0.011773     0.000000     0.000841     0.000509     0.002185 -     (  1)write                2  0.010763     0.000000     0.005381     0.004974     0.005789 -     (232)epoll_wait           1  9.966649     5.872853     9.966649     9.966649     9.966649 -  --- [  task] command     cpu      user       sys       irq        hv      busy      idle |  util% moves -   [   ALL]             ALL  0.128952  0.056636  0.000000  0.000000  0.000000 31.643684 |   0.6%     0 -  -2857: --- [  task] command     cpu      user       sys       irq        hv      busy      idle |  util% moves -   [  2857] execs.sh      1  0.257617  0.249685  0.000000  0.000000  0.000000  0.266200 |  65.6% -   [  2857] execs.sh      2  0.000000  0.023951  0.000000  0.000000  0.000000  0.005728 |  80.7% -   [  2857] execs.sh      5  0.313509  0.062271  0.000000  0.000000  0.000000  0.344279 |  52.2% -   [  2857] execs.sh      6  0.136623  0.128883  0.000000  0.000000  0.000000  0.533263 |  33.2% -   [  2857] execs.sh      7  0.527347  0.194014  0.000000  0.000000  0.000000  0.990625 |  42.1% -   [  2857] execs.sh    ALL  1.235096  0.658804  0.000000  0.000000  0.000000  2.140095 |  46.9%     4 -  -  -- ( ID)name             count   elapsed      pending      average      minimum      maximum -     (  9)mmap                15  0.059388     0.000000     0.003959     0.001704     0.017919 -     ( 14)rt_sigprocmask      12  0.006391     0.000000     0.000533     0.000431     0.000711 -     (  2)open                 9  2.253509     0.000000     0.250390     0.008589     0.511953 -     (  3)close                9  0.017771     0.000000     0.001975     0.000681     0.005245 -     (  5)fstat                9  0.007911     0.000000     0.000879     0.000683     0.001182 -     ( 10)mprotect             8  0.052198     0.000000     0.006525     0.003913     0.018073 -     ( 13)rt_sigaction         8  0.004281     0.000000     0.000535     0.000458     0.000751 -     (  0)read                 7  0.197772     0.000000     0.028253     0.000790     0.191028 -     ( 12)brk                  5  0.003766     0.000000     0.000753     0.000425     0.001618 -     (  8)lseek                3  0.001766     0.000000     0.000589     0.000469     0.000818 -  --- [  task] command     cpu      user       sys       irq        hv      busy      idle |  util% moves -   [2857-0] perf          6  0.053925  0.191898  0.000000  0.000000  0.000000  0.827263 |  22.9% -   [2857-0] perf          7  0.000000  0.656423  0.000000  0.000000  0.000000  0.484107 |  57.6% -   [2857-0] perf        ALL  0.053925  0.848321  0.000000  0.000000  0.000000  1.311370 |  40.8%     1 -  -  -- ( ID)name             count   elapsed      pending      average      minimum      maximum -     (  0)read                 0  0.000000     0.167845           --           --           -- -     ( 59)execve               0  0.000000     0.000000           --           --           -- -  -ALL: --- [  task] command     cpu      user       sys       irq        hv      busy      idle |  util% moves -   [   ALL]             ALL 10.790803 29.633170  0.160165  0.000000  0.137747 54.449823 |   7.4%    50 -  -  -- ( ID)name             count   elapsed      pending      average      minimum      maximum -     (  1)write             2896  1.623985     0.000000     0.004014     0.002364     0.041399 -     (102)getuid            2081  3.523861     0.000000     0.001693     0.000488     0.025157 -     (142)sched_setparam     691  7.222906    32.012841     0.024925     0.002024     0.662975 -     ( 13)rt_sigaction       383  0.235087     0.000000     0.000614     0.000434     0.014402 -     (  8)lseek              281  0.169157     0.000000     0.000602     0.000452     0.013404 -     (  0)read               133  2.782795     0.167845     0.020923     0.000509     1.864439 -     (  7)poll                96  8.583354   131.889895     0.193577     0.000626     4.596280 -     (  4)stat                93  7.036355     1.058719     0.183187     0.000981     3.661659 -     ( 47)recvmsg             85  0.146644     0.000000     0.001725     0.000646     0.019067 -     (  3)close               79  0.171046     0.000000     0.002165     0.000428     0.020659 -     (  9)mmap                78  0.311233     0.000000     0.003990     0.001613     0.017919 -     (186)gettid              74  0.067315     0.000000     0.000910     0.000403     0.014075 -     (  2)open                71  3.081589     0.213059     0.184248     0.001921     0.937946 -     (202)futex               62  5.145112   164.286154     0.405566     0.000597    11.587437 -  -  -- ( ID)name             count   elapsed      pending      average      minimum      maximum -     ( 12)i8042               10  0.160165     0.000000     0.016016     0.010920     0.032805 -  -Total Trace Time: 15.914636 ms -``` - -### Hurdles and issues - -Following are some of the issues encountered in the development of `curt`. - -#### Out-of-order events - -One of the more challenging issues is the discovery that events in a `perf.data` file can be out of time order. For a program trying to monitor state transitions carefully, this is a serious issue. For example, a trace could include the following sequence of events, displayed as they appear in the trace file: -``` -time 0000:  sys_enter syscall1 -time 0007:  sys_enter syscall2 -time 0006:  sys_exit syscall1 -time 0009:  sys_exit syscall2 -``` - -Just blindly processing these events in the order they are presented to their respective event-handling functions (in the wrong time order) will result in incorrect statistics (or worse). - -The most user-friendly ways to handle out-of-order events include: - - * Prevent traces from having out-of-order events in the first place by changing the way `perf record` works - * Providing a means to reorder events in a trace file, perhaps by enhancing `perf inject` - * Modifying how `perf script` works to present the events to the event-handling functions in time order - - - -But user-friendly is not the same as straightforward, nor easy. Also, none of the above are in the user's control. - -I chose to implement a queue for incoming events that would be sufficiently deep to allow for proper reordering of all events. This required a significant redesign of the code, including implementation of classes for each event, and moving the event processing for each event type into a method in that event's class. - -In the redesigned code, the actual event handlers' only job is to save the relevant data from the event into an instance of the event class, queue it, then process the top (oldest in time) event from the queue: -``` -def raw_syscalls__sys_enter(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, id, args): -         event = Event_sys_enter(nsecs(common_secs,common_nsecs), common_cpu, common_pid, common_comm, id) -        process_event(event) -``` - -The simple reorderable queuing mechanism is in a common function: -``` -events = [] -n_events = 0 -def process_event(event): -        global events,n_events,curr_timestamp -        i = n_events -        while i > 0 and events[i-1].timestamp > event.timestamp: -                i = i-1 -        events.insert(i,event) -        if n_events < params.window: -                n_events = n_events+1 -        else: -                event = events[0] -                # need to delete from events list now, -                # because event.process() could reenter here -                del events[0] -                if event.timestamp < curr_timestamp: -                        sys.stderr.write("Error: OUT OF ORDER events detected.\n  Try increasing the size of the look-ahead window with --window=\n") -                event.process() -``` - -Note that the size of the queue is configurable, primarily for performance and to limit memory consumption. The function will report when that queue size is insufficient to eliminate out-of-order events. It is worth considering whether to consider this case a catastrophic failure and elect to terminate the program. - -Implementing a class for each event type led to some consideration for refactoring, such that common code could coalesce into a base class: -``` -class Event (object): -  -        def __init__(self): -                self.timestamp = 0 -                self.cpu = 0 -                self.tid = 0 -                self.command = 'unknown' -                self.mode = 'unknown' -                self.pid = 0 -  -        def process(self): -                global start_timestamp -  -                try: -                        task = tasks[self.tid] -                        if task.pid == 'unknown': -                                tasks[self.tid].pid = self.pid -                except: -                        task = Task(start_timestamp, self.command, self.mode, self.pid) -                        tasks[self.tid] = task -  -                if self.cpu not in task.cpus: -                        task.cpus[self.cpu] = CPU() -                        if task.cpu == 'unknown': -                                task.cpu = self.cpu -  -                if self.cpu != task.cpu: -                        task.cpu = self.cpu -                        task.migrations += 1 -  -                return task -``` - -Then a class for each event type would be similarly constructed: -``` -class Event_sys_enter ( Event ): -  -        def __init__(self, timestamp, cpu, tid, comm, id, pid): -                self.timestamp = timestamp -                self.cpu = cpu -                self.tid = tid -                self.command = comm -                self.id = id -                self.pid = pid -                self.mode = 'busy-unknown' -                -        def process(self): -                global start_timestamp, curr_timestamp -                curr_timestamp = self.timestamp -                if (start_timestamp == 0): -                        start_timestamp = curr_timestamp -  -                task = super(Event_sys_enter, self).process() -  -                if task.mode == 'busy-unknown': -                        task.mode = 'user' -                        for cpu in task.cpus: -                                task.cpus[cpu].user = task.cpus[cpu].busy_unknown -                                task.cpus[cpu].busy_unknown = 0 -  -                task.syscall = self.id -                if self.id not in task.syscalls: -                        task.syscalls[self.id] = Call() -  -                task.syscalls[self.id].timestamp = curr_timestamp -                task.change_mode(curr_timestamp, 'sys') -``` - -Further refactoring is evident above, as well, moving the common code that updates relevant statistics based on a task's state change and the state change itself into a `change_mode` method of the `Task` class. - -### Start-of-trace timestamp - -As mentioned above, for scripts that depend on elapsed time, there should be an easier way to get the first timestamp in the trace other than forcing every event-handling function to conditionally save its timestamp as the start-of-trace timestamp. - -### Awkward invocation - -The syntax for invoking a `perf` Python script, including script parameters, is slightly awkward: -``` -$ perf script –s ./curt.py -- --window=80 -``` - -Also, it's awkward that `perf` Python scripts are not themselves executable. - -The `curt.py` script was made directly executable and will invoke `perf`, which will in turn invoke the script. Implementation is a bit confusing but it's easy to use: -``` -$ ./curt.py --window=80 -``` - -This script must detect when it has been directly invoked. The Python environment established by `perf` is a virtual module from which the `perf` Python scripts import: -``` -try: -        from perf_trace_context import * -``` - -If this import fails, the script was directly invoked. In this case, the script will `exec perf`, specifying itself as the script to run, and passing along any command line parameters: -``` -except: -        if len(params.file_or_command) == 0: -                params.file_or_command = [ "perf.data" ] -        sys.argv = ['perf', 'script', '-i' ] + params.file_or_command + [ '-s', sys.argv[0] ] -        sys.argv.append('--') -        sys.argv += ['--window', str(params.window)] -        if params.debug: -                sys.argv.append('--debug') -        sys.argv += ['--api', str(params.api)] -        if params.debug: -                print sys.argv -        os.execvp("perf", sys.argv) -        sys.exit(1) -``` - -In this way, the script can not only be run directly, it can still be run by using the `perf script` command. - -#### Simultaneous event registration required - -An artifact of the way `perf` enables events can lead to unexpected trace data. For example, specifying: -``` -$ perf record –a –e raw_syscalls:sys_enter –e raw_syscalls:sys_exit ./command -``` - -Will result in a trace file that begins with the following series of events for a single task (the `perf` command itself): -``` -sys_enter -sys_enter -sys_enter -… - -``` - -This happens because `perf` will register the `sys_enter` event for every CPU on the system (because of the `-a` argument), then it will register the `sys_exit` event for every CPU. In the latter case, since the `sys_enter` event has already been enabled for each CPU, that event shows up in the trace; but since the `sys_exit` has not been enabled on each CPU until after the call returns, the `sys_exit` call does not show up in the trace. The reverse issue happens at the end of the trace file, with a series of `sys_exit` events in the trace because the `sys_enter` event has already been disabled. - -The solution to this issue is to group the events, which is not well documented: -``` -$ perf record –e '{raw_syscalls:sys_enter,raw_syscalls:sys_exit}' ./command -``` - -With this syntax, the `sys_enter` and `sys_exit` events are enabled simultaneously. - -#### Awkward recording step - -There are a lot of different events required for computation of the full set of statistics for tasks. This leads to a very long, complicated command for recording: -``` -$ perf record -e '{raw_syscalls:*,sched:sched_switch,sched:sched_migrate_task,sched:sched_process_exec,sched:sched_process_fork,sched:sched_process_exit,sched:sched_stat_runtime,sched:sched_stat_wait,sched:sched_stat_sleep,sched:sched_stat_blocked,sched:sched_stat_iowait,powerpc:hcall_entry,powerpc:hcall_exit}' -a *command --args* - -``` - -The solution to this issue is to enable the script to perform the record step itself, by itself invoking `perf`. A further enhancement is to proceed after the recording is complete and report the statistics from that recording: -``` -if params.record: -        # [ed. Omitting here the list of events for brevity] -        eventlist = '{' + eventlist + '}' # group the events -        command = ['perf', 'record', '--quiet', '--all-cpus', -                '--event', eventlist ] + params.file_or_command -        if params.debug: -                print command -        subprocess.call(command) -``` - -The command syntax required to record and report becomes: -``` -$ ./curt.py --record ./command -``` - -### Process IDs and perf API change - -Process IDs are treated a bit cavalierly by `perf` scripting. Note well above that one of the common parameters for the generated event-handling functions is named `common_pid`. This is not the process ID, but the task ID. In fact, on many current Linux-based distributions, there is no way to determine a task's process ID from within a `perf` Python script. This presents a serious problem for a script that wants to compute statistics for a process. - -Fortunately, in Linux kernel v4.14, an additional parameter was provided to each of the event-handling functions—`perf_sample_dict`—a dictionary from which the process ID could be extracted: (`perf_sample_dict['sample']['pid']`). - -Unfortunately, current Linux distributions may not have that version of the Linux kernel. If the script is written to expect that extra parameter, the script will fail and report an error: -``` -TypeError: irq__irq_handler_exit_new() takes exactly 11 arguments (10 given) -``` - -Ideally, a means to automatically discover if the additional parameter is passed would be available to permit a script to easily run with both the old and new APIs and to take advantage of the new API if it is available. Unfortunately, such a means is not readily apparent. - -Since there is clearly value in using the new API to determine process-wide statistics, `curt` provides a command line option to use the new API. `curt` then takes advantage of Python's lazy function binding to adjust, at run-time, which API to use: -``` -if params.api == 1: -        dummy_dict = {} -        dummy_dict['sample'] = {} -        dummy_dict['sample']['pid'] = 'unknown' -        raw_syscalls__sys_enter = raw_syscalls__sys_enter_old -        […] -else: -        raw_syscalls__sys_enter = raw_syscalls__sys_enter_new -        […] -``` - -This requires two functions for each event: -``` -def raw_syscalls__sys_enter_new(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, id, args, perf_sample_dict): -  -        event = Event_sys_enter(nsecs(common_secs,common_nsecs), common_cpu, common_pid, common_comm, id, perf_sample_dict['sample']['pid']) -        process_event(event) -  -def raw_syscalls__sys_enter_old(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, id, args): -        global dummy_dict -        raw_syscalls__sys_enter_new(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, id, args, dummy_dict) -``` - -Note that the event-handling function for the older API will make use of the function for the newer API, passing a statically defined dictionary containing just enough data such that accessing it as `perf_sample_dict['sample']['pid']` will work (resulting in `'unknown'`). - -#### Events reported on other CPUs - -Not all events that refer to a task are reported from a CPU on which the task is running. This could result in an artificially high migration count and other incorrect statistics. For these types of events (`sched_stat`), the event CPU is ignored. - -#### Explicit migrations (no sched_migrate event) - -While there is conveniently an event for when the kernel decides to migrate a task from one CPU to another, there is no event for when the task requests a migration on its own. These are effected by system calls (`sched_setaffinity`), so the `sys_exit` event handler must compare the event CPU to the task's CPU, and if different, presume a migration has occurred. (This is described above, but repeated here in the "issues" section for completeness.) - -#### Mapping system call IDs to names is architecture-specific - -System calls are identified in events only as unique numeric identifiers. These identifiers are not readily interpreted by humans in the report. These numeric identifiers are not readily mapped to their mnemonics because they are architecture-specific, and new system calls can be added in newer kernels. Fortunately, `perf` provides a means to map system call numeric identifiers to system call names. A simple example follows: -``` -from Util import syscall_name -def raw_syscalls__sys_enter(event_name, context, common_cpu, -        common_secs, common_nsecs, common_pid, common_comm, -        common_callchain, id, args, perf_sample_dict): -                print "%s id=%d" % (syscall_name(id), id) -``` - -Unfortunately, using syscall_name introduces a dependency on the `audit` python bindings. This dependency is being removed in upstream versions of perf. - -#### Mapping hypervisor call IDs to names is non-existent - -Similar to system calls, hypervisor calls are also identified only with numeric identifiers. For IBM's POWER hypervisor, they are statically defined. Unfortunately, `perf` does not provide a means to map hypervisor call identifiers to mnemonics. `curt` includes a (hardcoded) function to do just that: -``` -hcall_to_name = { -        '0x4':'H_REMOVE', -        '0x8':'H_ENTER',       -        '0xc':'H_READ',       -        '0x10':'H_CLEAR_MOD', -[…] -} -  -def hcall_name(opcode): -        try: -                return hcall_to_name[hex(opcode)] -        except: -                return str(opcode) -``` - -### Command strings as bytearrays - -`perf` stores command names and string arguments in Python bytearrays. Unfortunately, printing bytearrays in Python prints every character in the bytearray—even if the string is null-terminated. For example: -``` -$ perf record –a –e 'sched:sched_switch' sleep 3 -$ perf script –g Python -generated Python script: perf-script.py -$ perf script -s ./perf-script.py -in trace_begin -sched__sched_switch      3 664597.912692243    21223 perf                  prev_comm=perf^@-terminal-^@, prev_pid=21223, prev_prio=120, prev_state=, next_comm=migration/3^@^@^@^@^@, next_pid=23, next_prio=0 -[…] -``` - -One solution is to truncate the length of these bytearrays based on null termination, as needed before printing: -``` -def null(ba): -        null = ba.find('\x00') -        if null >= 0: -                ba = ba[0:null] -        return ba - -def sched__sched_switch(event_name, context, common_cpu, -        common_secs, common_nsecs, common_pid, common_comm, -        common_callchain, prev_comm, prev_pid, prev_prio, prev_state, -        next_comm, next_pid, next_prio, perf_sample_dict): - -                print "prev_comm=%s, prev_pid=%d, prev_prio=%d, " \ -                "prev_state=%s, next_comm=%s, next_pid=%d, " \ -                "next_prio=%d" % \ -                (null(prev_comm), prev_pid, prev_prio, -                flag_str("sched__sched_switch", "prev_state", prev_state), -                null(next_comm), next_pid, next_prio) -``` - -Which nicely cleans up the output: -``` -sched__sched_switch      3 664597.912692243    21223 perf                  prev_comm=perf, prev_pid=21223, prev_prio=120, prev_state=, next_comm=migration/3, next_pid=23, next_prio=0 -``` - -### Dynamic mappings, like IRQ number to name - -Dissimilar to system calls and hypervisor calls, interrupt numbers (IRQs) are dynamically assigned by the kernel on demand, so there can't be a static table mapping an IRQ number to a name. Fortunately, `perf` passes the name to the event's `irq_handler_entry` routine. This allows a script to create a dictionary that maps the IRQ number to a name: -``` -irq_to_name = {} -def irq__irq_handler_entry_new(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, irq, name, perf_sample_dict): -        irq_to_name[irq] = name -        event = Event_irq_handler_entry(nsecs(common_secs,common_nsecs), common_cpu, common_pid, common_comm, irq, name, getpid(perf_sample_dict)) -        process_event(event) -``` - -Somewhat oddly, `perf` does not pass the name to the `irq_handler_exit` routine. So, it is possible that a trace may only see an `irq_handler_exit` for an IRQ and must be able to tolerate that. Here, instead of mapping the IRQ to a name, the IRQ number is returned as a string instead: -``` -def irq_name(irq): -        if irq in irq_to_name: -                return irq_to_name[irq] -        return str(irq) -``` -#### Task 0 -Task 0 shows up everywhere. It's not a real task. It's a substitute for the "idle" state. It's the task ID given to the `sched_switch` event handler when the CPU is going to (or coming from) the "idle" state. It's often the task that is "interrupted" by interrupts. Tracking the statistics for task 0 as if it were a real task would not make sense. Currently, `curt` ignores task 0. However, this loses some information, like some time spent in interrupt processing. `curt` should, but currently doesn't, track interesting (non-idle) time for task 0. - -#### Spurious sched_migrate_task events (same CPU) - -Rarely, a `sched_migrate_task` event occurs in which the source and target CPUs are the same. In other words, the task is not migrated. To avoid artificially inflated migration counts, this case must be explicitly ignored: -``` -class Event_sched_migrate_task (Event): -        def process(self): -[…] -                if self.cpu == self.dest_cpu: -                        return -``` - -#### exec - -The semantics of the `exec` system call are that the image of the current process is replaced by a completely new process image without changing the process ID. This is awkward for tracking the statistics of a process (really, a task) based on the process (task) ID. The change is significant enough that the statistics for each task should be accumulated separately, so the current task's statistics need to be closed out and a new set of statistics should be initialized. The challenge is that both the old and new tasks have the same process (task) ID. `curt` addresses this by tagging the task's task ID with a numeric suffix: -``` -class Event_sched_process_exec (Event): -  def process(self): -    global start_timestamp, curr_timestamp -    curr_timestamp = self.timestamp -    if (start_timestamp == 0): -      start_timestamp = curr_timestamp -  -    task = super(Event_sched_process_exec, self).process() -  -    new_task = Task(self.timestamp, self.command, task.mode, self.pid) -    new_task.sched_stat = True -    new_task.syscall = task.syscall -    new_task.syscalls[task.syscall] = Call() -    new_task.syscalls[task.syscall].timestamp = self.timestamp -  -    task.change_mode(curr_timestamp, 'exit') -  -    suffix=0 -    while True: -      old_tid = str(self.tid)+"-"+str(suffix) -      if old_tid in tasks: -        suffix += 1 -      else: -        break -  -    tasks[old_tid] = tasks[self.tid] -  -    del tasks[self.tid] -  -    tasks[self.tid] = new_task -``` - -This will clearly separate the statistics for the different process images. In the example below, the `perf` command (task "9614-0") `exec`'d `exec.sh` (task "9614-1"), which in turn `exec`'d itself (task "9614"): -``` --- [  task] command   cpu      user       sys       irq        hv      busy      idle |  util% moves -    [  9614] execs.sh    4  1.328238  0.485604  0.000000  0.000000  0.000000  2.273230 |  44.4% -    [  9614] execs.sh    7  0.000000  0.201266  0.000000  0.000000  0.000000  0.003466 |  98.3% -    [  9614] execs.sh  ALL  1.328238  0.686870  0.000000  0.000000  0.000000  2.276696 |  47.0%     1 - --- [  task] command   cpu      user       sys       irq        hv      busy      idle |  util% moves -    [9614-0] perf        3  0.000000  0.408588  0.000000  0.000000  0.000000  2.298722 |  15.1% -    [9614-0] perf        4  0.059079  0.028269  0.000000  0.000000  0.000000  0.611355 |  12.5% -    [9614-0] perf        5  0.000000  0.067626  0.000000  0.000000  0.000000  0.004702 |  93.5% -    [9614-0] perf      ALL  0.059079  0.504483  0.000000  0.000000  0.000000  2.914779 |  16.2%     2 -  --- [  task] command   cpu      user       sys       irq        hv      busy      idle |  util% moves -    [9614-1] execs.sh    3  1.207972  0.987433  0.000000  0.000000  0.000000  2.435908 |  47.4% -    [9614-1] execs.sh    4  0.000000  0.341152  0.000000  0.000000  0.000000  0.004147 |  98.8% -    [9614-1] execs.sh  ALL  1.207972  1.328585  0.000000  0.000000  0.000000  2.440055 |  51.0%     1 -``` - -#### Distribution support - -Surprisingly, there is currently no support for `perf`'s Python bindings in Ubuntu. [Follow the saga][4] for more detail. - -#### Limit on number of traced events - -As `curt` gets more sophisticated, it is likely that more and more events may be required to be included in the trace file. `perf` currently requires one file descriptor per event per CPU. This becomes a problem when the maximum number of open file descriptors is not a large multiple of the number of CPUs on the system. On systems with large numbers of CPUs, this quickly becomes a problem. For example, the default maximum number of open file descriptors is often 1,024. An IBM POWER8 system with four sockets may have 12 cores per socket and eight threads (CPUs) per core. Such a system has 4 * 12 * 8 = 392 CPUs. In that case, `perf` could trace only about two events! A workaround is to (significantly) increase the maximum number of open file descriptors (`ulimit –n` if the system administrator has configured the hard limits high enough; or the administrator can set the limits higher in `/etc/security/limits.conf` for `nofile`). - -### Summary - -I hope this article shows the power of `perf`—and specifically the utility and flexibility of the Python scripting enabled with `perf`—to perform sophisticated processing of kernel trace data. Also, it shows some of the issues and edge cases that can be encountered when the boundaries of such technologies are tested. - -Please feel free to download and make use of the `curt` tool described here, report problems, suggest improvements, or contribute code of your own on the [`curt` GitHub page][5]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/18/7/fun-perf-and-python - -作者:[Paul Clarke][a] -选题:[lujun9972](https://github.com/lujun9972) -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/thinkopenly -[1]:https://2018.texaslinuxfest.org/ -[2]:https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/com.ibm.aix.cmds1/curt.htm -[3]:https://opensource.com/article/17/9/intro-ebpf -[4]:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1707875 -[5]:https://github.com/open-power-sdk/curt diff --git a/sources/tech/20180730 50 Best Ubuntu Apps You Should Be Using Right Now.md b/sources/tech/20180730 50 Best Ubuntu Apps You Should Be Using Right Now.md deleted file mode 100644 index d305b716d6..0000000000 --- a/sources/tech/20180730 50 Best Ubuntu Apps You Should Be Using Right Now.md +++ /dev/null @@ -1,499 +0,0 @@ -50 Best Ubuntu Apps You Should Be Using Right Now -====== -**Brief: A comprehensive list of best Ubuntu apps for all kind of users. These software will help you in getting a better experience with your Linux desktop.** - -I have written about [things to do after installing Ubuntu][1] several times in the past. Each time I suggest installing the essential applications in Ubuntu. - -But the question arises, what are the essential Ubuntu applications? There is no set answer here. It depends on your need and the kind of work you do on your Ubuntu desktop. - -Still, I have been asked to suggest some good Ubuntu apps by a number of readers. This is the reason I have created this comprehensive list of Ubuntu applications you can use regularly. - -The list has been divided into respective categories for ease of reading and ease of comprehension. - -### Best Ubuntu apps for a better Ubuntu experience - -![Best Ubuntu Apps][2] - -Of course, you don’t have to use all of these applications. Just go through this list of essential Ubuntu software, read the description and then install the ones you need or are inclined to use. Just keep this page bookmarked for future reference or simply search on Google with term ‘best ubuntu apps itsfoss’. - -The best Ubuntu application list is intended for average Ubuntu user. Therefore not all the applications here are open source. I have also marked the slightly complicated applications that might not be suitable for a beginner. The list should be valid for Ubuntu 16.04,18.04 and other versions. - -Unless exclusively mentioned, the software listed here are available in Ubuntu Software Center. - -If you don’t find any application in the software center or if it is missing installation instruction, let me know and I’ll add the installation procedure. - -Enough talk! Let’s see what are the best apps for Ubuntu. - -#### Web Browser - -Ubuntu comes with Firefox as the default web browser. Since the Quantum release, Firefox has improved drastically. Personally, I always use more than one web browser for the sake of distinguishing between different type of works. - -##### Google Chrome - -![Google Chrome Logo][3] - -Google Chrome is the most used web browser on the internet for a reason. With your Google account, it allows you seamless syncing across devices. Plenty of extensions and apps further enhance its capabilities. You can [download Chrome in Ubuntu from its website][4]. - -##### Brave - -![brave browser][5] - -Google Chrome might be the most used web browser but it’s a privacy invader. An [alternative browser][6] is [Brave][7] that blocks ads and tracking scripts by default. This provides you with a faster and secure web browsing experience. - -#### Music applications - -![best music apps ubuntu][8] - -Ubuntu has Rhythmbox as the default music player which is not at all a bad choice for the default music player. However, you can definitely install a better music player. - -##### Sayonara - -[Sayonara][9] is a small, lightweight music player with a nice dark user interface. It comes with all the essential features you would expect in a standard music player. It integrates well with the Ubuntu desktop environment and doesn’t eat up your RAM. - -##### Audacity - -[Audacity][10] is more of an audio editor than an audio player. You can record and edit audio with this free and open source tool. It is available for Linux, Windows and macOS. You can install it from the Software Center. - -##### MusicBrainz Picard - -[Picard][11] is not a music player, it is a music tagger. If you have tons of local music files, Picard allows you to automatically update the music files with correct tracks, album, artist info and album cover art. - -#### Streaming Music Applications - -![Streaming Music app Ubuntu][12] - -In this age of the internet, music listening habit has surely changed. People these days rely more on streaming music players rather than storing hundreds of local music files. Let’s see some apps you can use for streaming music. - -##### Spotify - -[Spotify][13] is the king of streaming music. And the good thing is that it has a native Linux app. The [Spotify app on Ubuntu][14] integrates well with the media key and sound menu along with the desktop notification. Do note that Spotify may or may not be available in your country. - -##### Nuvola music player - -[Nuvola][15] is not a streaming music service like Spotify. It is a desktop music player that allows you to use several streaming music services in one application. You can use Spotify, Deezer, Google Play Music, Amazon Cloud Player and many more such services. - -#### Video Players - -![Video players for Linux][16] - -Ubuntu has the default GNOME video player (previously known as Totem) which is okay but it doesn’t support various media codecs. There are certainly other video players better than the GNOME video player. - -##### VLC - -The free and open source software [VLC][17] is the king of video players. It supports almost all possible media codecs. It also allows you to increase the volume up to 200%. It can also resume playing from the last known position. There are so many [VLC tricks][18] you can use to get the most of it. - -##### MPV - -[MPV][19] is a video player that deserves more attention. A sleek minimalist GUI and plenty of features, MPV has everything you would expect from a good video player. You can even use it in the command line. If you are not happy with VLC, you should surely give MPV a try. - -#### Cloud Storage Service - -Local backups are fine but cloud storage gives an additional degree of freedom. You don’t have to carry a USB key with you all the time or worry about a hard disk crash with cloud services. - -##### Dropbox - -![Dropbox logo][20] - -[Dropbox][21] is one of the most popular Cloud service providers. You get 2GB of free storage with the option to get more by referring others. Dropbox provides a native Linux client and you can download it from its website. It creates a local folder on your system that is synced with the cloud servers. - -##### pCloud - -![pCloud icon][22] - -[pCloud][23] is another good cloud storage service for Linux. It also has a native Linux client that you can download from its website. You get up to 20GB of free storage and if you need more, the pricing is better than Dropbox. pCloud is based in Switzerland, a country renowned for strict data privacy laws. - -#### Image Editors - -I am sure that you would need a photo editor at some point in time. Here are some of the best Ubuntu apps for editing images. - -##### GIMP - -![gimp icon][24] - -[GIMP][25] is a free and open source image editor available for Linux, Windows and macOS. It’s the best alternative for Adobe Photoshop in Linux. You can use it for all kind of image editing. There are plenty of resources available on the internet to help you with Gimp. - -##### Inkscape - -![inkscape icon][26] - -[Inkscape][27] is also a free and open source image editor specifically focusing on vector graphics. You can design vector arts and logo on it. You can compare it to Adobe Illustrator. Like Gimp, Inkscape too has plenty of tutorials available online. - -#### Paint applications - -Painting applications are not the same as image editors though their functionalities overlap at times. Here are some paint apps you can use in Ubuntu. -![Painting apps for Ubuntu Linux][28] - -##### Krita - -[Krita][29] is a free and open source digital painting application. You can create digital art, comics and animation with it. It’s a professional grade software and is even used as the primary software in art schools. - -##### Pinta - -[Pinta][30] might not be as feature rich as Krita but that’s deliberate. You can think of Pinta as Microsoft Paint for Linux. You can draw, paint, add text and do other such small tasks you do in a paint application. - -#### Photography applications - -Amateur photographer or a professional? You have plenty of [photography tools][31] at your disposal. Here are some recommended applications. - -##### digiKam - -![digikam][32] - -With open source software [digiKam][33], you can handle your high-end camera images in a professional manner. digiKam provides all the tools required for viewing, managing, editing, enhancing, organizing, tagging and sharing photographs. - -##### Darktable - -![Darktable icon][34] - -[darktable][35] is an open source photography workflow application with a special focus on raw image development. This is the best alternative you can get for Adobe Lightroom. It is also available for Windows and macOS. - -#### Video editors - -![Video editors Ubuntu][36] - -There is no dearth of [video editors for Linux][37] but I won’t go in detail here. Take a look at some of the feature-rich yet relatively simple to use video editors for Ubuntu. - -##### Kdenlive - -[Kdenlive][38] is the best all-purpose video editor for Linux. It has enough features that compare it to iMovie or Movie Maker. - -##### Shotcut - -[Shotcut][39] is another good choice for a video editor. It is an open source software with all the features you can expect in a standard video editor. - -#### Image and video converter - -If you need to [convert the file format][40] of your images and videos, here are some of my recommendations. - -##### Xnconvert - -![xnconvert logo][41] - -[Xnconvert][42] is an excellent batch image conversion tool. You can bulk resize images, convert the file type and rename them. - -##### Handbrake - -![Handbrake Logo][43] - -[HandBrake][44] is an easy to use open source tool for converting videos from a number of formats to a few modern, popular formats. - -#### Screenshot and screen recording tools - -![Screenshot and recorders Ubuntu][45] - -Here are the best Ubuntu apps for taking screenshots and recording your screen. - -##### Shutter - -[Shutter][46] is my go-to tool for taking screenshots. You can also do some quick editing to those screenshots such as adding arrows, text or resizing the images. The screenshots you see on It’s FOSS have been edited with Shutter. Definitely one of the best apps for Ubuntu. - -##### Kazam - -[Kazam][47] is my favorite [screen recorder for Linux][48]. It’s a tiny tool that allows you to record the entire window, an application window or a selected area. You can also use shortcuts to pause or resume recording. The tutorials on [It’s FOSS YouTube channel][49] have been recorded with Kazam. - -#### Office suites - -I cannot imagine that you could use a computer without a document editor. And why restrict yourself to just one document editor? Go for a complete office suite. - -##### LibreOffice - -![LibreOffice logo][50] - -[LibreOffice][51] comes preinstalled on Ubuntu and it is undoubtedly the [best open source office software][52]. It’s a complete package comprising of a document editor, spreadsheet tool, presentation software, maths tool and a graphics tool. You can even edit some PDF files with LibreOffice. - -##### WPS Office - -![WPS Office logo][53] - -[WPS Office][54] has gained popularity for being a Microsoft Office clone. It has an interface identical to Microsoft Office and it claims to be more compatible with MS Office. If you are looking for something similar to the Microsoft Office, WPS Office is a good choice. - -#### Downloading tools - -![Downloading software Ubuntu][55] - -If you often download videos or other big files from the internet, these tools will help you. - -##### youtube-dl - -This is one of the rare Ubuntu application on the list that is command line based. If you want to download videos from YouTube, DailyMotion or other video websites, youtube-dl is an excellent choice. It provides plenty of [advanced option for video downloading][56]. - -##### uGet - -[uGet][57] is a feature rich [download manager for Linux][58]. It allows you to pause and resume your downloads, schedule your downloads, monitor clipboard for downloadable content. A perfect tool if you have a slow, inconsistent internet or daily data limit. - -#### Code Editors - -![Coding apps for Ubuntu][59] - -If you are into programming, the default Gedit text editor might not be sufficient for your coding needs. Here are some of the better code editors for you. - -##### Atom - -[Atom][60] is a free and [open source code editor][61] from GitHub. Even before it was launched its first stable version, it became a hot favorite among coders for its UI, features and vast range of plugins. - -##### Visual Studio Code - -[VS Code][62] is an open source code editor from Microsoft. Don’t worry about Microsoft, VS Code is an awesome editor for web development. It also supports a number of other programming languages. - -#### PDF and eBooks related applications - -![eBook Management tools in Ubuntu][63] - -In this digital age, you cannot only rely on the real paper books especially when there are plenty of free eBooks available. Here are some Ubuntu apps for managing PDFs and eBooks. - -##### Calibre - -If you are a bibliophile and collect eBooks, you should use [Calibre][64]. It is an eBook manager with all the necessary software for [creating eBooks][65], converting eBook formats and managing an eBook library. - -##### Okular - -Okular is mostly a PDF viewer with options for editing PDF files. You can do some basic [PDF editing on Linux][66] with Okular such as adding pop-ups notes, inline notes, freehand line drawing, highlighter, stamp etc. - -#### Messaging applications - -![Messaging apps for Ubuntu][67] - -I believe you use at least one [messaging app on Linux][68]. Here are my recommendations. - -##### Skype - -[Skype][69] is the most popular video chatting application. It is also used by many companies and businesses for interviews and meetings. This makes Skype one of the must-have applications for Ubuntu. - -##### Rambox - -[Rambox][70] is not a messaging application on its own. But it allows you to use Skype, Viber, Facebook Messanger, WhatsApp, Slack and a number of other messaging applications from a single application window. - -#### Notes and To-do List applications - -Need a to-do list app or simple an app for taking notes? Have a look at these: - -##### Simplenote - -![Simplenote logo][71] - -[Simplenote][72] is a free and open source note taking application from WordPress creators [Automattic][73]. It is available for Windows, Linux, macOS, iOS and Android. Your notes are synced to a cloud server and you can access them on any device. You can download the DEB file from its website. - -##### Remember The Milk - -![Remember The Milk logo][74] - -[Remember The Milk][75] is a popular to-do list application. It is available for Windows, Linux, macOS, iOS and Android. Your to-do list is accessible on all the devices you own. You can also access it from a web browser. It also has an official native application for Linux that you can download from its website. - -#### Password protection and encryption - -![Encryption software Ubuntu][76] - -If there are other people regularly using your computer perhaps you would like to add an extra layer of security by password protecting files and folders. - -##### EncryptPad - -[EncryptPad][77] is an open source text editor that allows you to lock your files with a password. You can choose the type of encryption. There is also a command line version of this tool. - -##### Gnome Encfs Manager - -Gnome Encfs Manager allows you to [lock folders with a password in Linux][78]. You can keep whatever files you want in a secret folder and then lock it with a password. - -#### Gaming - -![Gaming on Ubuntu][79] - -[Gaming on Linux][80] is a lot better than what it used to be a few years ago. You can enjoy plenty of games on Linux without going back to Windows. - -##### Steam - -[Steam][81] is a digital distribution platform that allows you to purchase (if required) games. Steam has over 1500 [games for Linux][82]. You can download the Steam client from the Software Center. - -##### PlayOnLinux - -[PlayOnLinux][83] allows you to run Windows games on Linux over WINE compatibility layer. Don’t expect too much out of it because not every game will run flawlessly with PlayOnLinux. - -#### Package Managers [Intermediate to advanced users] - -![Package Management tools Ubuntu][84] - -Ubuntu Software Center is more than enough for an average Ubuntu user’s software needs but you can have more control on it using these applications. - -##### Gdebi - -Gedbi is a tiny packagae manager that you can use for installing DEB files. It is faster than the Software Center and it also handles dependency issues. - -##### Synaptic - -Synaptic was the default GUI package manager for most Linux distributions a decade ago. It still is in some Linux distributions. This powerful package manager is particularly helpful in [finding installed applications and removing them][85]. - -#### Backup and Recovery tools - -![Backup and data recovery tools for Ubuntu][86] - -Backup and recovery tools are must-have software for any system. Let’s see what softwares you must have on Ubuntu. - -##### Timeshift - -Timeshift is a tool that allows you to [take a snapshot of your system][87]. This allows you to restore your system to a previous state in case of an unfortunate incident when your system configuration is messed up. Note that it’s not the best tool for your personal data backup though. For that, you can use Ubuntu’s default Deja Dup (also known as Backups) tool. - -##### TestDisk [Intermediate Users] - -This is another command line tool on this list of best Ubuntu application. [TestDisk][88] allows you to [recover data on Linux][89]. If you accidentally deleted files, there are still chances that you can get it back using TestDisk. - -#### System Tweaking and Management Tools - -![System Maintenance apps Ubuntu][90] - -##### GNOME/Unity Tweak Tool - -These Tweak tools are a must for every Ubuntu user. They allow you to access some advanced system settings. Best of all, you can [change themes in Ubuntu][91] using these tweak tools. - -##### UFW Firewall - -[UFW][92] stands for Uncomplicated Firewall and rightly so. UFW has predefined firewall settings for Home, Work and Public networks. - -##### Stacer - -If you want to free up space on Ubuntu, try Stacer. This graphical tool allows you to [optimize your Ubuntu system][93] by removing unnecessary files and completely uninstalling software. Download Stacer from [its website][94]. - -#### Other Utilities - -![Utilities Ubuntu][95] - -In the end, I’ll list some of my other favorite Ubuntu apps that I could not put into a certain category. - -##### Neofetch - -One more command line tool! Neofetch displays your system information such as [Ubuntu version][96], desktop environment, theme, icons, RAM etc info along with [ASCII logo of the distribution][97]. Use this command for installing Neofetch. -``` -sudo apt install neofetch - -``` - -##### Etcher - -Ubuntu has a live USB creator tool installed already but Etcher is a better application for this task. It is also available for Windows and macOS. You can download it [from its website][98]. - -##### gscan2pdf - -I use this tiny tool for the sole purpose of [converting images into PDF][99]. You can use it for combining multiple images into one PDF file as well. - -##### Audio Recorder - -Another tiny yet essential Ubuntu application for [recording audio on Ubuntu][100]. You can use it to record sound from system microphone, from music player or from any other source. - -### Your suggestions for essential Ubuntu applications? - -I would like to conclude my list of best Ubuntu apps here. I know that you might not need or use all of them but I am certain that you would like most of the software listed here. - -Did you find some useful applications that you didn’t know about before? If you would have to suggest your favorite Ubuntu application, which one would it be? - -In the end, if you find this article useful, please share it on social media, Reddit, Hacker News or other community or forums you visit regularly. This way you help us grow :) - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/best-ubuntu-apps/ - -作者:[Abhishek Prakash][a] -选题:[lujun9972](https://github.com/lujun9972) -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/abhishek/ -[1]:https://itsfoss.com/things-to-do-after-installing-ubuntu-18-04/ -[2]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/best-ubuntu-apps-featured.jpeg -[3]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/google-chrome.jpeg -[4]:https://www.google.com/chrome/ -[5]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/brave-browser-icon.jpeg -[6]:https://itsfoss.com/open-source-browsers-linux/ -[7]:https://brave.com/ -[8]:https://4bds6hergc-flywheel.netdna-ssl.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://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/streaming-music-apps-ubuntu.jpeg -[13]:https://www.spotify.com// -[14]:https://itsfoss.com/install-spotify-ubuntu-1404/ -[15]:https://tiliado.eu/nuvolaplayer/ -[16]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/Video-Players-linux.jpg -[17]:https://www.videolan.org/index.html -[18]:https://itsfoss.com/vlc-pro-tricks-linux/ -[19]:https://mpv.io/ -[20]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/dropbox-icon.jpeg -[21]:https://www.dropbox.com/ -[22]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/pcloud-icon.jpeg -[23]:https://itsfoss.com/recommends/pcloud/ -[24]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/gimp-icon.jpeg -[25]:https://www.gimp.org/ -[26]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/inkscape-icon.jpeg -[27]:https://inkscape.org/en/ -[28]:https://4bds6hergc-flywheel.netdna-ssl.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://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/digikam-icon.jpeg -[33]:https://www.digikam.org/ -[34]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/darktable-icon.jpeg -[35]:https://www.darktable.org/ -[36]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/video-editing-apps-ubuntu.jpeg -[37]:https://itsfoss.com/best-video-editing-software-linux/ -[38]:https://kdenlive.org/en/ -[39]:https://shotcut.org/ -[40]:https://itsfoss.com/format-factory-alternative-linux/ -[41]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/xnconvert-logo.jpeg -[42]:https://www.xnview.com/en/xnconvert/ -[43]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/handbrake-logo.jpeg -[44]:https://handbrake.fr/ -[45]:https://4bds6hergc-flywheel.netdna-ssl.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://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/libre-office-logo.jpeg -[51]:https://www.libreoffice.org/download/download/ -[52]:https://itsfoss.com/best-free-open-source-alternatives-microsoft-office/ -[53]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/wps-office-logo.jpeg -[54]:http://wps-community.org/ -[55]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/download-apps-ubuntu.jpeg -[56]:https://itsfoss.com/download-youtube-linux/ -[57]:http://ugetdm.com/ -[58]:https://itsfoss.com/4-best-download-managers-for-linux/ -[59]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/coding-apps-ubuntu.jpeg -[60]:https://atom.io/ -[61]:https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ -[62]:https://itsfoss.com/install-visual-studio-code-ubuntu/ -[63]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/pdf-management-apps-ubuntu.jpeg -[64]:https://calibre-ebook.com/ -[65]:https://itsfoss.com/create-ebook-calibre-linux/ -[66]:https://itsfoss.com/pdf-editors-linux/ -[67]:https://4bds6hergc-flywheel.netdna-ssl.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://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/simplenote-logo.jpeg -[72]:http://simplenote.com/ -[73]:https://automattic.com/ -[74]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/remember-the-milk-logo.jpeg -[75]:https://itsfoss.com/remember-the-milk-linux/ -[76]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/encryption-apps-ubuntu.jpeg -[77]:https://itsfoss.com/encryptpad-encrypted-text-editor-linux/ -[78]:https://itsfoss.com/password-protect-folder-linux/ -[79]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/gaming-ubuntu.jpeg -[80]:https://itsfoss.com/linux-gaming-guide/ -[81]:https://store.steampowered.com/ -[82]:https://itsfoss.com/free-linux-games/ -[83]:https://www.playonlinux.com/en/ -[84]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/package-management-apps-ubuntu.jpeg -[85]:https://itsfoss.com/how-to-add-remove-programs-in-ubuntu/ -[86]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/07/backup-recovery-tools-ubuntu.jpeg -[87]:https://itsfoss.com/backup-restore-linux-timeshift/ -[88]:https://www.cgsecurity.org/wiki/TestDisk -[89]:https://itsfoss.com/recover-deleted-files-linux/ -[90]:https://4bds6hergc-flywheel.netdna-ssl.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://4bds6hergc-flywheel.netdna-ssl.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/ diff --git a/sources/tech/20181114 How to use systemd-nspawn for Linux system recovery.md b/sources/tech/20181114 How to use systemd-nspawn for Linux system recovery.md deleted file mode 100644 index 3355436cc3..0000000000 --- a/sources/tech/20181114 How to use systemd-nspawn for Linux system recovery.md +++ /dev/null @@ -1,148 +0,0 @@ -How to use systemd-nspawn for Linux system recovery -====== -Tap into systemd's ability to launch containers to repair a damaged system's root filesystem. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mistake_bug_fix_find_error.png?itok=PZaz3dga) - -For as long as GNU/Linux systems have existed, system administrators have needed to recover from root filesystem corruption, accidental configuration changes, or other situations that kept the system from booting into a "normal" state. - -Linux distributions typically offer one or more menu options at boot time (for example, in the GRUB menu) that can be used for rescuing a broken system; typically they boot the system into a single-user mode with most system services disabled. In the worst case, the user could modify the kernel command line in the bootloader to use the standard shell as the init (PID 1) process. This method is the most complex and fraught with complications, which can lead to frustration and lost time when a system needs rescuing. - -Most importantly, these methods all assume that the damaged system has a physical console of some sort, but this is no longer a given in the age of cloud computing. Without a physical console, there are few (if any) options to influence the boot process this way. Even physical machines may be small, embedded devices that don't offer an easy-to-use console, and finding the proper serial port cables and adapters and setting up a serial terminal emulator, all to use a serial console port while dealing with an emergency, is often complicated. - -When another system (of the same architecture and generally similar configuration) is available, a common technique to simplify the repair process is to extract the storage device(s) from the damaged system and connect them to the working system as secondary devices. With physical systems, this is usually straightforward, but most cloud computing platforms can also support this since they allow the root storage volume of the damaged instance to be mounted on another instance. - -Once the root filesystem is attached to another system, addressing filesystem corruption is straightforward using **fsck** and other tools. Addressing configuration mistakes, broken packages, or other issues can be more complex since they require mounting the filesystem and locating and changing the correct configuration files or databases. - -### Using systemd - -Before **[**systemd**][1]** , editing configuration files with a text editor was a practical way to correct a configuration. Locating the necessary files and understanding their contents may be a separate challenge, which is beyond the scope of this article. - -When the GNU/Linux system uses **systemd** though, many configuration changes are best made using the tools it provides—enabling and disabling services, for example, requires the creation or removal of symbolic links in various locations. The **systemctl** tool is used to make these changes, but using it requires a **systemd** instance to be running and listening (on D-Bus) for requests. When the root filesystem is mounted as an additional filesystem on another machine, the running **systemd** instance can't be used to make these changes. - -Manually launching the target system's **systemd** is not practical either, since it is designed to be the PID 1 process on a system and manage all other processes, which would conflict with the already-running instance on the system used for the repairs. - -Thankfully, **systemd** has the ability to launch containers, fully encapsulated GNU/Linux systems with their own PID 1 and environment that utilize various namespace features offered by the Linux kernel. Unlike tools like Docker and Rocket, **systemd** doen't require a container image to launch a container; it can launch one rooted at any point in the existing filesystem. This is done using the **systemd-nspawn** tool, which will create the necessary system namespaces and launch the initial process in the container, then provide a console in the container. In contrast to **chroot** , which only changes the apparent root of the filesystem, this type of container will have a separate filesystem namespace, suitable filesystems mounted on **/dev** , **/run** , and **/proc** , and a separate process namespace and IPC namespaces. Consult the **systemd-nspawn** [man page][2] to learn more about its capabilities. - -### An example to show how it works - -In this example, the storage device containing the damaged system's root filesystem has been attached to a running system, where it appears as **/dev/vdc**. The device name will vary based on the number of existing storage devices, the type of device, and the method used to connect it to the system. The root filesystem could use the entire storage device or be in a partition within the device; since the most common (simple) configuration places the root filesystem in the device's first partition, this example will use **/dev/vdc1.** Make sure to replace the device name in the commands below with your system's correct device name. - -The damaged root filesystem may also be more complex than a single filesystem on a device; it may be a volume in an LVM volume set or on a set of devices combined into a software RAID device. In these cases, the necessary steps to compose and activate the logical device holding the filesystem must be performed before it will be available for mounting. Again, those steps are beyond the scope of this article. - -#### Prerequisites - -First, ensure the **systemd-nspawn** tool is installed—most GNU/Linux distributions don't install it by default. It's provided by the **systemd-container** package on most distributions, so use your distribution's package manager to install that package. The instructions in this example were tested using Debian 9 but should work similarly on any modern GNU/Linux distribution. - -Using the commands below will almost certainly require root permissions, so you'll either need to log in as root, use **sudo** to obtain a shell with root permissions, or prefix each of the commands with **sudo**. - -#### Verify and mount the fileystem - -First, use **fsck** to verify the target filesystem's structures and content: - -``` -$ fsck /dev/vdc1 -``` - -If it finds any problems with the filesystem, answer the questions appropriately to correct them. If the filesystem is sufficiently damaged, it may not be repairable, in which case you'll have to find other ways to extract its contents. - -Now, create a temporary directory and mount the target filesystem onto that directory: - -``` -$ mkdir /tmp/target-rescue -$ mount /dev/vdc1 /tmp/target-rescue -``` - -With the filesystem mounted, launch a container with that filesystem as its root filesystem: - -``` -$ systemd-nspawn --directory /tmp/target-rescue --boot -- --unit rescue.target -``` - -The command-line arguments for launching the container are: - - * **\--directory /tmp/target-rescue** provides the path of the container's root filesystem. - * **\--boot** searches for a suitable init program in the container's root filesystem and launches it, passing parameters from the command line to it. In this example, the target system also uses **systemd** as its PID 1 process, so the remaining parameters are intended for it. If the target system you are repairing uses any other tool as its PID 1 process, you'll need to adjust the parameters accordingly. - * **\--** separates parameters for **systemd-nspawn** from those intended for the container's PID 1 process. - * **\--unit rescue.target** tells **systemd** in the container the name of the target it should try to reach during the boot process. In order to simplify the rescue operations in the target system, boot it into "rescue" mode rather than into its normal multi-user mode. - - - -If all goes well, you should see output that looks similar to this: - -``` -Spawning container target-rescue on /tmp/target-rescue. -Press ^] three times within 1s to kill container. -systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN) -Detected virtualization systemd-nspawn. -Detected architecture arm. - -Welcome to Debian GNU/Linux 9 (Stretch)! - -Set hostname to . -Failed to install release agent, ignoring: No such file or directory -[  OK  ] Reached target Swap. -[  OK  ] Listening on Journal Socket (/dev/log). -[  OK  ] Started Dispatch Password Requests to Console Directory Watch. -[  OK  ] Reached target Encrypted Volumes. -[  OK  ] Created slice System Slice. -         Mounting POSIX Message Queue File System... -[  OK  ] Listening on Journal Socket. -         Starting Set the console keyboard layout... -         Starting Restore / save the current clock... -         Starting Journal Service... -         Starting Remount Root and Kernel File Systems... -[  OK  ] Mounted POSIX Message Queue File System. -[  OK  ] Started Journal Service. -[  OK  ] Started Remount Root and Kernel File Systems. -         Starting Flush Journal to Persistent Storage... -[  OK  ] Started Restore / save the current clock. -[  OK  ] Started Flush Journal to Persistent Storage. -[  OK  ] Started Set the console keyboard layout. -[  OK  ] Reached target Local File Systems (Pre). -[  OK  ] Reached target Local File Systems. -         Starting Create Volatile Files and Directories... -[  OK  ] Started Create Volatile Files and Directories. -[  OK  ] Reached target System Time Synchronized. -         Starting Update UTMP about System Boot/Shutdown... -[  OK  ] Started Update UTMP about System Boot/Shutdown. -[  OK  ] Reached target System Initialization. -[  OK  ] Started Rescue Shell. -[  OK  ] Reached target Rescue Mode. -         Starting Update UTMP about System Runlevel Changes... -[  OK  ] Started Update UTMP about System Runlevel Changes. -You are in rescue mode. After logging in, type "journalctl -xb" to view -system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to -boot into default mode. -Give root password for maintenance -(or press Control-D to continue): -``` - -In this output, you can see **systemd** launching as the init process in the container and detecting that it is being run inside a container so it can adjust its behavior appropriately. Various unit files are started to bring the container to a usable state, then the target system's root password is requested. You can enter the root password here if you want a shell prompt with root permissions, or you can press **Ctrl+D** to allow the startup process to continue, which will display a normal console login prompt. - -When you have completed the necessary changes to the target system, press **Ctrl+]** three times in rapid succession; this will terminate the container and return you to your original shell. From there, you can clean up by unmounting the target system's filesystem and removing the temporary directory: - -``` -$ umount /tmp/target-rescue -$ rmdir /tmp/target-rescue -``` - -That's it! You can now remove the target system's storage device(s) and return them to the target system. - -The idea to use **systemd-nspawn** this way, especially the **\--boot parameter** , came from [a question][3] posted on StackExchange. Thanks to Shibumi and kirbyfan64sos for providing useful answers to this question! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/18/11/systemd-nspawn-system-recovery - -作者:[Kevin P.Fleming][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/kpfleming -[b]: https://github.com/lujun9972 -[1]: https://www.freedesktop.org/wiki/Software/systemd/ -[2]: https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html -[3]: https://unix.stackexchange.com/questions/457819/running-systemd-utilities-like-systemctl-under-an-nspawn diff --git a/sources/tech/20190102 Using Yarn on Ubuntu and Other Linux Distributions.md b/sources/tech/20190102 Using Yarn on Ubuntu and Other Linux Distributions.md deleted file mode 100644 index 71555454f5..0000000000 --- a/sources/tech/20190102 Using Yarn on Ubuntu and Other Linux Distributions.md +++ /dev/null @@ -1,265 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Using Yarn on Ubuntu and Other Linux Distributions) -[#]: via: (https://itsfoss.com/install-yarn-ubuntu) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -Using Yarn on Ubuntu and Other Linux Distributions -====== - -**This quick tutorial shows you the official way of installing Yarn package manager on Ubuntu and Debian Linux. You’ll also learn some basic Yarn commands and the steps to remove Yarn completely.** - -[Yarn][1] is an open source JavaScript package manager developed by Facebook. It is an alternative or should I say improvement to the popular npm package manager. [Facebook developers’ team][2] created Yarn to overcome the shortcomings of [npm][3]. Facebook claims that Yarn is faster, reliable and more secure than npm. - -Like npm, Yarn provides you a way to automate the process of installing, updating, configuring, and removing packages retrieved from a global registry. - -The advantage of Yarn is that it is faster as it caches every package it downloads so it doesn’t need to download it again. It also parallelizes operations to maximize resource utilization. Yarn also uses [checksums to verify the integrity][4] of every installed package before its code is executed. Yarn also guarantees that an install that worked on one system will work exactly the same way on any other system. - -If you are [using nodejs on Ubuntu][5], probably you already have npm installed on your system. In that case, you can use npm to install Yarn globally in the following manner: - -``` -sudo npm install yarn -g -``` - -However, I would recommend using the official way to install Yarn on Ubuntu/Debian. - -### Installing Yarn on Ubuntu and Debian [The Official Way] - -![Yarn JS][6] - -The instructions mentioned here should be applicable to all versions of Ubuntu such as Ubuntu 18.04, 16.04 etc. The same set of instructions are also valid for Debian and other Debian based distributions. - -Since the tutorial uses Curl to add the GPG key of Yarn project, it would be a good idea to verify whether you have Curl installed already or not. - -``` -sudo apt install curl -``` - -The above command will install Curl if it wasn’t installed already. Now that you have curl, you can use it to add the GPG key of Yarn project in the following fashion: - -``` -curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - -``` - -After that, add the repository to your sources list so that you can easily upgrade the Yarn package in future with the rest of the system updates: - -``` -sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list' -``` - -You are set to go now. [Update Ubuntu][7] or Debian system to refresh the list of available packages and then install yarn: - -``` -sudo apt update -sudo apt install yarn -``` - -This will install Yarn along with nodejs. Once the process completes, verify that Yarn has been installed successfully. You can do that by checking the Yarn version. - -``` -yarn --version -``` - -For me, it showed an output like this: - -``` -yarn --version -1.12.3 -``` - -This means that I have Yarn version 1.12.3 installed on my system. - -### Using Yarn - -I presume that you have some basic understandings of JavaScript programming and how dependencies work. I am not going to go in details here. I’ll show you some of the basic Yarn commands that will help you getting started with it. - -#### Creating a new project with Yarn - -Like npm, Yarn also works with a package.json file. This is where you add your dependencies. All the packages of the dependencies are cached in the node_modules directory in the root directory of your project. - -In the root directory of your project, run the following command to generate a fresh package.json file: - -It will ask you a number of questions. You can skip the questions r go with the defaults by pressing enter. - -``` -yarn init -yarn init v1.12.3 -question name (test_yarn): test_yarn_proect -question version (1.0.0): 0.1 -question description: Test Yarn -question entry point (index.js): -question repository url: -question author: abhishek -question license (MIT): -question private: -success Saved package.json -Done in 82.42s. -``` - -With this, you get a package.json file of this sort: - -``` -{ - "name": "test_yarn_proect", - "version": "0.1", - "description": "Test Yarn", - "main": "index.js", - "author": "abhishek", - "license": "MIT" -} -``` - -Now that you have the package.json, you can either manually edit it to add or remove package dependencies or use Yarn commands (preferred). - -#### Adding dependencies with Yarn - -You can add a dependency on a certain package in the following fashion: - -``` -yarn add -``` - -For example, if you want to use [Lodash][8] in your project, you can add it using Yarn like this: - -``` -yarn add lodash -yarn add v1.12.3 -info No lockfile found. -[1/4] Resolving packages… -[2/4] Fetching packages… -[3/4] Linking dependencies… -[4/4] Building fresh packages… -success Saved lockfile. -success Saved 1 new dependency. -info Direct dependencies -└─ [email protected] -info All dependencies -└─ [email protected] -Done in 2.67s. -``` - -And you can see that this dependency has been added automatically in the package.json file: - -``` -{ - "name": "test_yarn_proect", - "version": "0.1", - "description": "Test Yarn", - "main": "index.js", - "author": "abhishek", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.11" - } -} -``` - -By default, Yarn will add the latest version of a package in the dependency. If you want to use a specific version, you may specify it while adding. - -As always, you can also update the package.json file manually. - -#### Upgrading dependencies with Yarn - -You can upgrade a particular dependency to its latest version with the following command: - -``` -yarn upgrade -``` - -It will see if the package in question has a newer version and will update it accordingly. - -You can also change the version of an already added dependency in the following manner: - -You can also upgrade all the dependencies of your project to their latest version with one single command: - -``` -yarn upgrade -``` - -It will check the versions of all the dependencies and will update them if there are any newer versions. - -#### Removing dependencies with Yarn - -You can remove a package from the dependencies of your project in this way: - -``` -yarn remove -``` - -#### Install all project dependencies - -If you made any changes to the project.json file, you should run either - -``` -yarn -``` - -or - -``` -yarn install -``` - -to install all the dependencies at once. - -### How to remove Yarn from Ubuntu or Debian - -I’ll complete this tutorial by mentioning the steps to remove Yarn from your system if you used the above steps to install it. If you ever realized that you don’t need Yarn anymore, you will be able to remove it. - -Use the following command to remove Yarn and its dependencies. - -``` -sudo apt purge yarn -``` - -You should also remove the Yarn repository from the repository list: - -``` -sudo rm /etc/apt/sources.list.d/yarn.list -``` - -The optional next step is to remove the GPG key you had added to the trusted keys. But for that, you need to know the key. You can get that using the apt-key command: - -Warning: apt-key output should not be parsed (stdout is not a terminal) pub rsa4096 2016-10-05 [SC] 72EC F46A 56B4 AD39 C907 BBB7 1646 B01B 86E5 0310 uid [ unknown] Yarn Packaging - -Warning: apt-key output should not be parsed (stdout is not a terminal) pub rsa4096 2016-10-05 [SC] 72EC F46A 56B4 AD39 C907 BBB7 1646 B01B 86E5 0310 uid [ unknown] Yarn Packaging yarn@dan.cx sub rsa4096 2016-10-05 [E] sub rsa4096 2019-01-02 [S] [expires: 2020-02-02] - -The key here is the last 8 characters of the GPG key’s fingerprint in the line starting with pub. - -So, in my case, the key is 86E50310 and I’ll remove it using this command: - -``` -sudo apt-key del 86E50310 -``` - -You’ll see an OK in the output and the GPG key of Yarn package will be removed from the list of GPG keys your system trusts. - -I hope this tutorial helped you to install Yarn on Ubuntu, Debian, Linux Mint, elementary OS etc. I provided some basic Yarn commands to get you started along with complete steps to remove Yarn from your system. - -I hope you liked this tutorial and if you have any questions or suggestions, please feel free to leave a comment below. - - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/install-yarn-ubuntu - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/abhishek/ -[b]: https://github.com/lujun9972 -[1]: https://yarnpkg.com/lang/en/ -[2]: https://code.fb.com/ -[3]: https://www.npmjs.com/ -[4]: https://itsfoss.com/checksum-tools-guide-linux/ -[5]: https://itsfoss.com/install-nodejs-ubuntu/ -[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/yarn-js-ubuntu-debian.jpeg?resize=800%2C450&ssl=1 -[7]: https://itsfoss.com/update-ubuntu/ -[8]: https://lodash.com/ diff --git a/sources/tech/20190104 Search, Study And Practice Linux Commands On The Fly.md b/sources/tech/20190104 Search, Study And Practice Linux Commands On The Fly.md deleted file mode 100644 index fa92d3450a..0000000000 --- a/sources/tech/20190104 Search, Study And Practice Linux Commands On The Fly.md +++ /dev/null @@ -1,223 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Search, Study And Practice Linux Commands On The Fly!) -[#]: via: (https://www.ostechnix.com/search-study-and-practice-linux-commands-on-the-fly/) -[#]: author: (SK https://www.ostechnix.com/author/sk/) - -Search, Study And Practice Linux Commands On The Fly! -====== - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/tldr-720x340.png) - -The title may look like sketchy and click bait. Allow me to explain what I am about to explain in this tutorial. Let us say you want to download an archive file, extract it and move the file from one location to another from command line. As per the above scenario, we may need at least three Linux commands, one for downloading the file, one for extracting the downloaded file and one for moving the file. If you’re intermediate or advanced Linux user, you could do this easily with an one-liner command or a script in few seconds/minutes. But, if you are a noob who don’t know much about Linux commands, you might need little help. - -Of course, a quick google search may yield many results. Or, you could use [**man pages**][1]. But some man pages are really long, comprehensive and lack in useful example. You might need to scroll down for quite a long time when you’re looking for a particular information on the specific flags/options. Thankfully, there are some [**good alternatives to man pages**][2], which are focused on mostly practical commands. One such good alternative is **TLDR pages**. Using TLDR pages, we can quickly and easily learn a Linux command with practical examples. To access the TLDR pages, we require a TLDR client. There are many clients available. Today, we are going to learn about one such client named **“Tldr++”**. - -Tldr++ is a fast and interactive tldr client written with **Go** programming language. Unlike the other Tldr clients, it is fully interactive. That means, you can pick a command, read all examples , and immediately run any command without having to retype or copy/paste each command in the Terminal. Still don’t get it? No problem. Read on to learn and practice Linux commands on the fly. - -### Install Tldr++ - -Installing Tldr++ is very simple. Download tldr++ latest version from the [**releases page**][3]. Extract it and move the tldr++ binary to your $PATH. - -``` -$ wget https://github.com/isacikgoz/tldr/releases/download/v0.5.0/tldr_0.5.0_linux_amd64.tar.gz - -$ tar xzf tldr_0.5.0_linux_amd64.tar.gz - -$ sudo mv tldr /usr/local/bin - -$ sudo chmod +x /usr/local/bin/tldr -``` - -Now, run ‘tldr’ binary to populate the tldr pages in your local system. - -``` -$ tldr -``` - -Sample output: - -``` -Enumerating objects: 6, done. -Counting objects: 100% (6/6), done. -Compressing objects: 100% (6/6), done. -Total 18157 (delta 0), reused 3 (delta 0), pack-reused 18151 -Successfully cloned into: /home/sk/.local/share/tldr -``` - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/tldr-2.png) - -Tldr++ is available in AUR. If you’re on Arch Linux, you can install it using any AUR helper, for example [**YaY**][4]. Make sure you have removed any existing tldr client from your system and run the following command to install tldr++. - -``` -$ yay -S tldr++ -``` - -Alternatively, you can build from source as described below. Since Tldr++ is written using Go language, make sure you have installed it on your Linux box. If it isn’t installed yet, refer the following guide. - -+ [How To Install Go Language In Linux](https://www.ostechnix.com/install-go-language-linux/) - -After installing Go, run the following command to install Tldr++. - -``` -$ go get -u github.com/isacikgoz/tldr -``` - -This command will download the contents of tldr repository in a folder named **‘go’** in the current working directory. - -Now run the ‘tldr’ binary to populate all tldr pages in your local system using command: - -``` -$ go/bin/tldr -``` - -Sample output: - -![][6] - -Finally, copy the tldr binary to your PATH. - -``` -$ sudo mv tldr /usr/local/bin -``` - -It is time to see some examples. - -### Tldr++ Usage - -Type ‘tldr’ command without any options to display all command examples in alphabetical order. - -![][7] - -Use the **UP/DOWN arrows** to navigate through the commands, type any letters to search or type a command name to view the examples of that respective command. Press **?** for more and **Ctrl+c** to return/exit. - -To display the example commands of a specific command, for example **apt** , simply do: - -``` -$ tldr apt -``` - -![][8] - -Choose any example command from the list and hit ENTER. You will see a *** symbol** before the selected command. For example, I choose the first command i.e ‘sudo apt update’. Now, it will ask you whether to continue or not. If the command is correct, just type ‘y’ to continue and type your sudo password to run the selected command. - -![][9] - -See? You don’t need to copy/paste or type the actual command in the Terminal. Just choose it from the list and run on the fly! - -There are hundreds of Linux command examples are available in Tldr pages. You can choose one or two commands per day and learn them thoroughly. And keep this practice everyday to learn as much as you can. - -### Learn And Practice Linux Commands On The Fly Using Tldr++ - -Now think of the scenario that I mentioned in the first paragraph. You want to download a file, extract it and move it to different location and make it executable. Let us see how to do it interactively using Tldr++ client. - -**Step 1 – Download a file from Internet** - -To download a file from command line, we mostly use **‘curl’** or **‘wget’** commands. Let me use ‘wget’ to download the file. To open tldr page of wget command, just run: - -``` -$ tldr wget -``` - -Here is the examples of wget command. - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/wget-tldr.png) - -You can use **UP/DOWN** arrows to go through the list of commands. Once you choose the command of your choice, press ENTER. Here I chose the first command. - -Now, enter the path of the file to download. - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/tldr-3.png) - -You will then be asked to confirm if it is the correct command or not. If the command is correct, simply type ‘yes’ or ‘y’ to start downloading the file. - -![][10] - -We have downloaded the file. Let us go ahead and extract this file. - -**Step 2 – Extract downloaded archive** - -We downloaded the **tar.gz** file. So I am going to open the ‘tar’ tldr page. - -``` -$ tldr tar -``` - -You will see the list of example commands. Go through the examples and find which command is suitable to extract tar.gz(gzipped archive) file and hit ENTER key. In our case, it is the third command. - -![][11] - -Now, you will be prompted to enter the path of the tar.gz file. Just type the path and hit ENTER key. Tldr++ supports smart file suggestions. That means it will suggest the file name automatically as you type. Just press TAB key for auto-completion. - -![][12] - -If you downloaded the file to some other location, just type the full path, for example **/home/sk/Downloads/tldr_0.5.0_linux_amd64.tar.gz.** - -Once you enter the path of the file to extract, press ENTER and then, type ‘y’ to confirm. - -![][13] - -**Step 3 – Move file from one location to another** - -We extracted the archive. Now we need to move the file to another location. To move the files from one location to another, we use ‘mv’ command. So, let me open the tldr page for mv command. - -``` -$ tldr mv -``` - -Choose the correct command to move the files from one location to another. In our case, the first command will work, so let me choose it. - -![][14] - -Type the path of the file that you want to move and enter the destination path and hit ENTER key. - -![][15] - -**Note:** Type **y!** or **yes!** to run command with **sudo** privileges. - -As you see in the above screenshot, I moved the file named **‘tldr’** to **‘/usr/local/bin/’** location. - -For more details, refer the project’s GitHub page given at the end. - - -### Conclusion - -Don’t get me wrong. **Man pages are great!** There is no doubt about it. But, as I already said, many man pages are comprehensive and doesn’t have useful examples. There is no way I could memorize all lengthy commands with tricky flags. Some times I spent much time on man pages and remained clueless. The Tldr pages helped me to find what I need within few minutes. Also, we use some commands once in a while and then we forget them completely. Tldr pages on the other hand actually helps when it comes to using commands we rarely use. Tldr++ client makes this task much easier with smart user interaction. Give it a go and let us know what you think about this tool in the comment section below. - -And, that’s all. More good stuffs to come. Stay tuned! - -Good luck! - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/search-study-and-practice-linux-commands-on-the-fly/ - -作者:[SK][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/learn-use-man-pages-efficiently/ -[2]: https://www.ostechnix.com/3-good-alternatives-man-pages-every-linux-user-know/ -[3]: https://github.com/isacikgoz/tldr/releases -[4]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ -[5]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[6]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-1.png -[7]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-11.png -[8]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-12.png -[9]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-13.png -[10]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-4.png -[11]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-6.png -[12]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-7.png -[13]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-8.png -[14]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-9.png -[15]: http://www.ostechnix.com/wp-content/uploads/2019/01/tldr-10.png diff --git a/sources/tech/20190105 Setting up an email server, part 1- The Forwarder.md b/sources/tech/20190105 Setting up an email server, part 1- The Forwarder.md deleted file mode 100644 index c6c520e339..0000000000 --- a/sources/tech/20190105 Setting up an email server, part 1- The Forwarder.md +++ /dev/null @@ -1,224 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Setting up an email server, part 1: The Forwarder) -[#]: via: (https://blog.jak-linux.org/2019/01/05/setting-up-an-email-server-part1/) -[#]: author: (Julian Andres Klode https://blog.jak-linux.org/) - -Setting up an email server, part 1: The Forwarder -====== - -This week, I’ve been working on rolling out mail services on my server. I started working on a mail server setup at the end of November, while the server was not yet in use, but only for about two days, and then let it rest. - -As my old shared hosting account expired on January 1, I had to move mail forwarding duties over to the new server. Yes forwarding - I do plan to move hosting the actual email too, but at the moment it’s “just” forwarding to gmail. - -### The Software - -As you might know from the web server story, my server runs on Ubuntu 18.04. I set up a mail server on this system using - - * [Postfix][1] for SMTP duties (warning, they oddly do not have an https page) - * [rspamd][2] for spam filtering, and signing DKIM / ARC - * [bind9][3] for DNS resolving - * [postsrsd][4] for SRS - - - -You might wonder why bind9 is in there. It turns out that DNS blacklists used by spam filters block the caching DNS servers you usually use, so you have to use your own recursive DNS server. Ubuntu offers you the choice between bind9 and dnsmasq in main, and it seems like bind9 is more appropriate here than dnsmasq. - -### Setting up postfix - -Most of the postfix configuration is fairly standard. So, let’s skip TLS configuration and outbound SMTP setups (this is email, and while they support TLS, it’s all optional, so let’s not bother that much here). - -The most important part is restrictions in `main.cf`. - -First of all, relay restrictions prevent us from relaying emails to weird domains: - -``` -# Relay Restrictions -smtpd_relay_restrictions = reject_non_fqdn_recipient reject_unknown_recipient_domain permit_mynetworks permit_sasl_authenticated defer_unauth_destination -``` - -We also only accept mails from hosts that know their own full qualified name: - -``` -# Helo restrictions (hosts not having a proper fqdn) -smtpd_helo_required = yes -smtpd_helo_restrictions = permit_mynetworks reject_invalid_helo_hostname reject_non_fqdn_helo_hostname reject_unknown_helo_hostname -``` - -We also don’t like clients (other servers) that send data too early, or have an unknown hostname: - -``` -smtpd_data_restrictions = reject_unauth_pipelining -smtpd_client_restrictions = permit_mynetworks reject_unknown_client_hostname -``` - -I also set up a custom apparmor profile that’s pretty lose, I plan to migrate to the one in the apparmor git eventually but it needs more testing and some cleanup. - -### Sender rewriting scheme - -For SRS using postsrsd, we define the `SRS_DOMAIN` in `/etc/default/postsrsd` and then configure postfix to talk to it: - -``` -# Handle SRS for forwarding -recipient_canonical_maps = tcp:localhost:10002 -recipient_canonical_classes= envelope_recipient,header_recipient - -sender_canonical_maps = tcp:localhost:10001 -sender_canonical_classes = envelope_sender -``` - -This has a minor issue that it also rewrites the `Return-Path` when it delivers emails locally, but as I am only forwarding, I’m worrying about that later. - -### rspamd basics - -rspamd is a great spam filtering system. It uses a small core written in C and a bunch of Lua plugins, such as: - - * IP score, which keeps track of how good a specific server was in the past - * Replies, which can check whether an email is a reply to another one - * DNS blacklisting - * DKIM and ARC validation and signing - * DMARC validation - * SPF validation - - - -It also has a nice web UI: - -![rspamd web ui status][5] - -rspamd web ui status - -![rspamd web ui investigating a spam message][6] - -rspamd web ui investigating a spam message - -Setting up rspamd is quite easy. You basically just drop a bunch of configuration overrides into `/etc/rspamd/local.d` and you’re done. Heck, it mostly works out of the box. There’s a fancy `rspamadm configwizard` too. - -What you do want for rspamd is a redis server. redis is needed in [many places][7], such as rate limiting, greylisting, dmarc, reply tracking, ip scoring, neural networks. - -I made a few changes to the defaults: - - * I enabled subject rewriting instead of adding headers, so spam mail subjects get `[SPAM]` prepended, in `local.d/actions.conf`: - -``` - reject = 15; -rewrite_subject = 6; -add_header = 6; -greylist = 4; -subject = "[SPAM] %s"; -``` - - * I set `autolearn = true;` in `local.d/classifier-bayes.conf` to make it learn that an email that has a score of at least 15 (those that are rejected) is spam, and emails with negative scores are ham. - - * I set `extended_spam_headers = true;` in `local.d/milter_headers.conf` to get a report from rspamd in the header seeing the score and how the score came to be. - - - - -### ARC setup - -[ARC][8] is the ‘Authenticated Received Chain’ and is currently a DMARC working group work item. It allows forwarders / mailing lists to authenticate their forwarding of the emails and the checks they have performed. - -rspamd is capable of validating and signing emails with ARC, but I’m not sure how much influence ARC has on gmail at the moment, for example. - -There are three parts to setting up ARC: - - 1. Generate a DKIM key pair (use `rspamadm dkim_keygen`) - 2. Setup rspamd to sign incoming emails using the private key - 3. Add a DKIM `TXT` record for the public key. `rspamadm` helpfully tells you how it looks like. - - - -For step two, what we need to do is configure `local.d/arc.conf`. You can basically use the example configuration from the [rspamd page][9], the key point for signing incoming email is to specifiy `sign_incoming = true;` and `use_domain_sign_inbound = "recipient";` (FWIW, none of these options are documented, they are fairly new, and nobody updated the documentation for them). - -My configuration looks like this at the moment: - -``` -# If false, messages with empty envelope from are not signed -allow_envfrom_empty = true; -# If true, envelope/header domain mismatch is ignored -allow_hdrfrom_mismatch = true; -# If true, multiple from headers are allowed (but only first is used) -allow_hdrfrom_multiple = false; -# If true, username does not need to contain matching domain -allow_username_mismatch = false; -# If false, messages from authenticated users are not selected for signing -auth_only = true; -# Default path to key, can include '$domain' and '$selector' variables -path = "${DBDIR}/arc/$domain.$selector.key"; -# Default selector to use -selector = "arc"; -# If false, messages from local networks are not selected for signing -sign_local = true; -# -sign_inbound = true; -# Symbol to add when message is signed -symbol_signed = "ARC_SIGNED"; -# Whether to fallback to global config -try_fallback = true; -# Domain to use for ARC signing: can be "header" or "envelope" -use_domain = "header"; -use_domain_sign_inbound = "recipient"; -# Whether to normalise domains to eSLD -use_esld = true; -# Whether to get keys from Redis -use_redis = false; -# Hash for ARC keys in Redis -key_prefix = "ARC_KEYS"; -``` - -This would also sign any outgoing email, but I’m not sure that’s necessary - my understanding is that we only care about ARC when forwarding/receiving incoming emails, not when sending them (at least that’s what gmail does). - -### Other Issues - -There are few other things to keep in mind when running your own mail server. I probably don’t know them all yet, but here we go: - - * You must have a fully qualified hostname resolving to a public IP address - - * Your public IP address must resolve back to the fully qualified host name - - * Again, you should run a recursive DNS resolver so your DNS blacklists work (thanks waldi for pointing that out) - - * Setup an SPF record. Mine looks like this: - -`jak-linux.org. 3600 IN TXT "v=spf1 +mx ~all"` - -this states that all my mail servers may send email, but others probably should not (a softfail). Not having an SPF record can punish you; for example, rspamd gives missing SPF and DKIM a score of 1. - - * All of that software is sandboxed using AppArmor. Makes you question its security a bit less! - - - - -### Source code, outlook - -As always, you can find the Ansible roles on [GitHub][10]. Feel free to point out bugs! 😉 - -In the next installment of this series, we will be looking at setting up Dovecot, and configuring DKIM. We probably also want to figure out how to run notmuch on the server, keep messages in matching maildirs, and have my laptop synchronize the maildir and notmuch state with the server. Ugh, sounds like a lot of work. - --------------------------------------------------------------------------------- - -via: https://blog.jak-linux.org/2019/01/05/setting-up-an-email-server-part1/ - -作者:[Julian Andres Klode][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://blog.jak-linux.org/ -[b]: https://github.com/lujun9972 -[1]: http://www.postfix.org/ -[2]: https://rspamd.com/ -[3]: https://www.isc.org/downloads/bind/ -[4]: https://github.com/roehling/postsrsd -[5]: https://blog.jak-linux.org/2019/01/05/setting-up-an-email-server-part1/rspamd-status.png -[6]: https://blog.jak-linux.org/2019/01/05/setting-up-an-email-server-part1/rspamd-spam.png -[7]: https://rspamd.com/doc/configuration/redis.html -[8]: http://arc-spec.org/ -[9]: https://rspamd.com/doc/modules/arc.html -[10]: https://github.com/julian-klode/ansible.jak-linux.org diff --git a/sources/tech/20190107 DriveSync - Easy Way to Sync Files Between Local And Google Drive from Linux CLI.md b/sources/tech/20190107 DriveSync - Easy Way to Sync Files Between Local And Google Drive from Linux CLI.md deleted file mode 100644 index 6552cc3905..0000000000 --- a/sources/tech/20190107 DriveSync - Easy Way to Sync Files Between Local And Google Drive from Linux CLI.md +++ /dev/null @@ -1,239 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (DriveSync – Easy Way to Sync Files Between Local And Google Drive from Linux CLI) -[#]: via: (https://www.2daygeek.com/drivesync-google-drive-sync-client-for-linux/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -DriveSync – Easy Way to Sync Files Between Local And Google Drive from Linux CLI -====== - -Google Drive is an one of the best cloud storage compared with other cloud storage. - -It’s one of the application which is used by millions of users in daily basics. - -It allow users to access the application anywhere irrespective of devices. - -We can upload, download & share documents, photo, files, docs, spreadsheet, etc to anyone with securely. - -We had already written few articles in 2daygeek website about google drive mapping with Linux. - -If you would like to check those, navigate to the following link. - -GNOME desktop offers easy way to **[Integrate Google Drive Using Gnome Nautilus File Manager in Linux][1]** without headache. - -Also, you can give a try with **[Google Drive Ocamlfuse Client][2]**. - -### What’s DriveSync? - -[DriveSync][3] is a command line utility that synchronizes your files between local system and Google Drive via command line. - -Downloads new remote files, uploads new local files to your Drive and deletes or updates files both locally and on Drive if they have changed in one place. - -Allows blacklisting or whitelisting of files and folders that should not / should be synced. - -It was written in Ruby scripting language so, make sure your system should have ruby installed. If it’s not installed then install it as a prerequisites for DriveSync. - -### DriveSync Features - - * Downloads new remote files - * Uploads new local files - * Delete or Update files in both locally and Drive - * Allow blacklist to disable sync for files and folders - * Automate the sync using cronjob - * Allow us to set file upload/download size (Defautl 512MB) - * Allow us to modify Timeout threshold - - - -### How to Install Ruby Scripting Language in Linux? - -Ruby is an interpreted scripting language for quick and easy object-oriented programming. It has many features to process text files and to do system management tasks (like in Perl). It is simple, straight-forward, and extensible. - -It’s available in all the Linux distribution official repository. Hence we can easily install it with help of distribution official **[Package Manager][4]**. - -For **`Fedora`** system, use **[DNF Command][5]** to install Ruby. - -``` -$ sudo dnf install ruby rubygem-bundler -``` - -For **`Debian/Ubuntu`** systems, use **[APT-GET Command][6]** or **[APT Command][7]** to install Ruby. - -``` -$ sudo apt install ruby ruby-bundler -``` - -For **`Arch Linux`** based systems, use **[Pacman Command][8]** to install Ruby. - -``` -$ sudo pacman -S ruby ruby-bundler -``` - -For **`RHEL/CentOS`** systems, use **[YUM Command][9]** to install Ruby. - -``` -$ sudo yum install ruby ruby-bundler -``` - -For **`openSUSE Leap`** system, use **[Zypper Command][10]** to install Ruby. - -``` -$ sudo zypper install ruby ruby-bundler -``` - -### How to Install DriveSync in Linux? - -DriveSync installation also easy to do it. Follow the below procedure to get it done. - -``` -$ git clone https://github.com/MStadlmeier/drivesync.git -$ cd drivesync/ -$ bundle install -``` - -### How to Set Up DriveSync in Linux? - -As of now, we had successfully installed DriveSync and still we need to perform few steps to use this. - -Run the following command to set up this and Sync the files. - -``` -$ ruby drivesync.rb -``` - -When you ran the above command you will be getting the below url. -![][12] - -Navigate to the given URL in your preferred Web Browser and follow the instruction. It will open a google sign-in page in default web browser. Enter your credentials then hit Sign in button. -![][13] - -Input your password. -![][14] - -Hit **`Allow`** button to allow DriveSync to access your Google Drive. -![][15] - -Finally, it will give you an authorization code. -![][16] - -Just copy and past it on the terminal and hit **`Enter`** button to start the sync. -![][17] - -Yes, it’s syncing the files from Google Drive to my local folder. - -``` -$ ruby drivesync.rb -Warning: Could not find config file at /home/daygeek/.drivesync/config.yml . Creating default config... -Open the following URL in the browser and enter the resulting code after authorization -https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com&include_granted_scopes=true&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/drive -4/ygAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -Local folder is 1437 files behind and 0 files ahead of remote -Starting sync at 2019-01-06 19:48:49 +0530 -Downloading file 2018-07-31-17-48-54-635_1533039534635_XXXPM0534X_ITRV.zip ... -Downloading file 5459XXXXXXXXXX25_11-03-2018.PDF ... -Downloading file 2g-image-design/new-design-28-Mar-2018/new-base-format-icon-theme.svg ... -Downloading file 2g-image-design/new-design-28-Mar-2018/2g-banner-format.svg ... -Downloading file 2g-image-design/new-design-28-Mar-2018/new-base-format.svg ... -Downloading file documents/Magesh_Resume_Updated_26_Mar_2018.doc ... -Downloading file documents/Magesh_Resume_updated-new.doc ... -Downloading file documents/Aadhaar-Thanu.PNG ... -Downloading file documents/Aadhaar-Magesh.PNG ... -Downloading file documents/Copy of PP-docs.pdf ... -Downloading file EAadhaar_2189821080299520170807121602_25082017123052_172991.pdf ... -Downloading file Tanisha/VID_20170223_113925.mp4 ... -Downloading file Tanisha/VID_20170224_073234.mp4 ... -Downloading file Tanisha/VID_20170304_170457.mp4 ... -Downloading file Tanisha/IMG_20170225_203243.jpg ... -Downloading file Tanisha/IMG_20170226_123949.jpg ... -Downloading file Tanisha/IMG_20170226_123953.jpg ... -Downloading file Tanisha/IMG_20170304_184227.jpg ... -. -. -. -Sync complete. -``` - -It will create the **`drive`** folder under **`/home/user/Documents/`** and sync all the files in it. -![][18] - -DriveSync configuration files are located in the following location **`/home/user/.drivesync/`** if you had installed it on your **home** directory. - -``` -$ ls -lh ~/.drivesync/ -total 176K --rw-r--r-- 1 daygeek daygeek 1.9K Jan 6 19:42 config.yml --rw-r--r-- 1 daygeek daygeek 170K Jan 6 21:31 manifest -``` - -You can make your changes by modifying the **`config.yml`** file. - -### How to Verify Whether Sync is Working Fine or Not? - -To test this, we are going to create a new folder called **`2g-docs-2019`**. Also, adding an image file in it. Once it’s done, run the **`drivesync.rb`** command again. - -``` -$ ruby drivesync.rb -Local folder is 0 files behind and 1 files ahead of remote -Starting sync at 2019-01-06 21:59:32 +0530 -Uploading file 2g-docs-2019/Asciinema - Record And Share Your Terminal Activity On The Web.png ... -``` - -Yes, it has been synced to Google Drive. The same has been verified through Web Browser. -![][19] - -Create the below **CronJob** to enable an auto sync. The following “CronJob” will be running an every mins. - -``` -$ vi crontab -*/1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated ruby ~/drivesync/drivesync.rb -``` - -I have added one more file to test this. Yes, it got success. - -``` -Jan 07 09:36:01 daygeek-Y700 crond[590]: (daygeek) RELOAD (/var/spool/cron/daygeek) -Jan 07 09:36:01 daygeek-Y700 crond[20942]: pam_unix(crond:session): session opened for user daygeek by (uid=0) -Jan 07 09:36:01 daygeek-Y700 CROND[20943]: (daygeek) CMD (ruby ~/drivesync/drivesync.rb) -Jan 07 09:36:29 daygeek-Y700 CROND[20942]: (daygeek) CMDOUT (Local folder is 0 files behind and 1 files ahead of remote) -Jan 07 09:36:29 daygeek-Y700 CROND[20942]: (daygeek) CMDOUT (Starting sync at 2019-01-07 09:36:26 +0530) -Jan 07 09:36:29 daygeek-Y700 CROND[20942]: (daygeek) CMDOUT (Uploading file 2g-docs-2019/Check CPU And HDD Temperature In Linux.png ...) -Jan 07 09:36:29 daygeek-Y700 CROND[20942]: (daygeek) CMDOUT () -Jan 07 09:36:29 daygeek-Y700 CROND[20942]: (daygeek) CMDOUT (Sync complete.) -Jan 07 09:36:29 daygeek-Y700 CROND[20942]: pam_unix(crond:session): session closed for user daygeek -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/drivesync-google-drive-sync-client-for-linux/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/mount-access-setup-google-drive-in-linux/ -[2]: https://www.2daygeek.com/mount-access-google-drive-on-linux-with-google-drive-ocamlfuse-client/ -[3]: https://github.com/MStadlmeier/drivesync -[4]: https://www.2daygeek.com/category/package-management/ -[5]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/ -[6]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/ -[7]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/ -[8]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/ -[9]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/ -[10]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/ -[11]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[12]: https://www.2daygeek.com/wp-content/uploads/2019/01/drivesync-easy-way-to-sync-files-between-local-and-google-drive-from-linux-cli-1.jpg -[13]: https://www.2daygeek.com/wp-content/uploads/2019/01/drivesync-easy-way-to-sync-files-between-local-and-google-drive-from-linux-cli-2.png -[14]: https://www.2daygeek.com/wp-content/uploads/2019/01/drivesync-easy-way-to-sync-files-between-local-and-google-drive-from-linux-cli-3.png -[15]: https://www.2daygeek.com/wp-content/uploads/2019/01/drivesync-easy-way-to-sync-files-between-local-and-google-drive-from-linux-cli-4.png -[16]: https://www.2daygeek.com/wp-content/uploads/2019/01/drivesync-easy-way-to-sync-files-between-local-and-google-drive-from-linux-cli-5.png -[17]: https://www.2daygeek.com/wp-content/uploads/2019/01/drivesync-easy-way-to-sync-files-between-local-and-google-drive-from-linux-cli-6.jpg -[18]: https://www.2daygeek.com/wp-content/uploads/2019/01/drivesync-easy-way-to-sync-files-between-local-and-google-drive-from-linux-cli-7.jpg -[19]: https://www.2daygeek.com/wp-content/uploads/2019/01/drivesync-easy-way-to-sync-files-between-local-and-google-drive-from-linux-cli-8.png diff --git a/sources/tech/20190107 How to manage your media with Kodi.md b/sources/tech/20190107 How to manage your media with Kodi.md deleted file mode 100644 index cea446c5b0..0000000000 --- a/sources/tech/20190107 How to manage your media with Kodi.md +++ /dev/null @@ -1,303 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to manage your media with Kodi) -[#]: via: (https://opensource.com/article/19/1/manage-your-media-kodi) -[#]: author: (Steve Ovens https://opensource.com/users/stratusss) - -How to manage your media with Kodi -====== - -![](Get control over your home media content with Kodi media player software.) - -If you, like me, like to own your own data, chances are you also like to purchase movies and TV shows on Blu-Ray or DVD discs. And you may also like to make [ISOs][1] of the videos to keep exact digital copies, as I do. - -For a little while, it might be manageable to have a bunch of files stored in some sort of directory structure. However, as your collection grows, you may want features like resuming from a specific spot; keeping track of where you left off watching a video (i.e., its watched status); storing episode or movie summaries and movie trailers; buying media in multiple languages; or just having a sane way to play all those ISOs you ripped. - -This is where Kodi comes in. - -### What is Kodi? - -Modern [Kodi][2] is the successor to Xbox Media Player, which was discontinued way back in 2003. In June 2004, Xbox Media Center (XBMC) was born. For over three years, XBMC remained on the Xbox. Then in 2007, work began in earnest to port the media player over to Linux. - -![](https://opensource.com/sites/default/files/uploads/00_xbmc_500x300.png) - -Aside from some uninteresting technical history, things remained fairly stable, and XBMC grew in prominence. By 2014, XBMC had a thriving community, and its core functionality grew to include playing games, streaming content from the web, and connecting to mobile devices. This, combined with legal issues involving Xbox in the name, lead the team behind XBMC to rename it Kodi. Kodi is now branded as an "entertainment hub that brings all your digital media together into a beautiful and user-friendly package." - -Today, Kodi has an extensible interface that has allowed the open source community to build new functionality using plugins. Note that, as with all open source software, Kodi's developers are not responsible for the ecosystem's plugins. - -### How do I start? - -For Ubuntu-based distributions, Kodi is just a few short commands away: - -``` -sudo apt install software-properties-common -sudo add-apt-repository ppa:team-xbmc/ppa -sudo apt update -sudo apt install kodi -``` - -In Arch Linux, you can install the latest version from the community repo: - -``` -sudo pacman -S kodi -``` - -Packages were maintained for Fedora 26 by RPM Fusion (referenced in the [Kodi documentation][3]). I tried it on Fedora 29, and it was quite unstable. I'm sure that this will improve over time, but my experience is that Fedora 29 is not the ideal platform for Kodi. - -### OK, it's installed… now what? - -Before we proceed, note that I am making two assumptions about your media content: - - 1. You have your own local, legally attained content. - 2. You have already transferred this content from your DVDs, Blu-Rays, or another digital distribution source to your local directory or network. - - - -Kodi uses a scraping service to pull down TV and movie metadata. For Kodi to match things appropriately, I recommend adopting a directory and file-naming structure similar to this: - -``` -Utopia -├── Utopia.S01.dvd_rip.x264 -│   ├── Utopia.S01E01.dvd_rip.x264.mkv -│   ├── Utopia.S01E02.dvd_rip.x264.mkv -│   ├── Utopia.S01E03.dvd_rip.x264.mkv -│   ├── Utopia.S01E04.dvd_rip.x264.mkv -│   ├── Utopia.S01E05.dvd_rip.x264.mkv -│   ├── Utopia.S01E06.dvd_rip.x264.mkv -└── Utopia.S02.dvd_rip.x264 -    ├── Utopia.S02E01.dvd_rip.x264.mkv -    ├── Utopia.S02E02.dvd_rip.x264.mkv -    ├── Utopia.S02E03.dvd_rip.x264.mkv -    ├── Utopia.S02E04.dvd_rip.x264.mkv -    ├── Utopia.S02E05.dvd_rip.x264.mkv -    └── Utopia.S02E06.dvd_rip.x264.mkv -``` - -I put the source (my DVD) and the codec (x264) in the title, but these are optional. For a TV series, you can include the episode title in the filename if you like. The important part is **SxxExx** , which stands for Season and Episode. This is how Kodi (and by extension the scrapers) can identify your media. - -Assuming you have organized your media like this, let's do some basic Kodi configuration. - -### Add video sources - -Adding video sources is a simple, six-step process: - - 1. Enter the files section - 2. Select **Files** - 3. Click **Add source** - 4. Browse to your source - 5. Define the video content type - 6. Refresh the metadata - - - -If you're impatient, feel free to navigate these steps on your own. But if you want details, keep reading. - -When you first launch Kodi, you'll see the home screen below. Click **Enter files section**. It doesn't matter whether you do this under Movies (as shown here) or TV shows. - -![](https://opensource.com/sites/default/files/uploads/01_fresh_kodi_main_screen.png) - -Next, select the **Videos** folder, click **Files** , and choose **Add videos**. - -![](https://opensource.com/sites/default/files/uploads/02_videos_folder.png) - -![](https://opensource.com/sites/default/files/uploads/03_add_videos.png) - -Either click on **None** and start typing the path to your files or click **Browse** and use the file navigation. - -![](https://opensource.com/sites/default/files/uploads/04_browse_video_source.png) - -![](https://opensource.com/sites/default/files/uploads/05_add_video_source_name.png) - -As you can see in this screenshot, I added my local **Videos** directory. You can set some default options through **Browse** , such as specifying your home folder and any drives you have mounted—maybe on a network file system (NFS), universal plug and play (UPnP) device, Windows Network ([SMB/CIFS][4]), or [zeroconf][5]. I won't cover most of these, as they are outside the scope of this article, but we will use NFS later for one of Kodi's advanced features. - -After you select your path and click OK, identify the type of content you're working with. - -![](https://opensource.com/sites/default/files/uploads/06_define_video_content.png) - -Next, Kodi prompts you to refresh the metadata for the content in the selected directory. This is how Kodi knows what videos you have and their synopsis, cast information, thumbnails, fan art, etc. Select **Yes** , and you can watch the video-scanning progress in the top right-hand corner. - -![](https://opensource.com/sites/default/files/uploads/07_refresh.png) - -![](https://opensource.com/sites/default/files/uploads/08_active_scan_in_progress.png) - -When the scan completes, you'll see lots of useful information, such as video overviews and season and episode descriptions for TV shows. - -![](https://opensource.com/sites/default/files/uploads/09_screen_after_scan.png) - -![](https://opensource.com/sites/default/files/uploads/10_show_description.png) - -You can use the same process for other types of content, such as music or music videos. - -### Increase functionality with add-ons - -One of the most interesting things about open source projects is that the community often extends them well beyond their initial scope. Kodi has a very robust add-on infrastructure. Most of them are produced by Kodi fans who want to extend its default functionality, and sometimes companies (such as the [Plex][6] content streaming service) release official plugins. Be very careful about adding plugins from untrusted sources. Just because you find an add-on on the internet does not mean it is safe! - -**Be warned:** Add-ons are not supported by Kodi's core team! - -Having said that, there are many useful add-ons that are worth your consideration. In my house, we use Kodi for local playback and Plex when we want to access our content outside the house—with one exception. One of our rooms has a poor WiFi signal. I rip my Blu-Rays to very large MKV files (usually 20–40GB each), and the WiFi (and therefore Kodi) can't handle the files without stuttering. Although you can (and we have) dug into some of the advanced buffering options, even those tweaks have proved insufficient with very large files. Since we already have a Plex server that can transcode content, we solved our problem with a Kodi add-on. - -To show how to install an add-on, I'll use Plex as an example. First, click on **Add-ons** in the side panel and select **Enter add-on browser**. Either use the search function or scroll down until you find Plex. - -![](https://opensource.com/sites/default/files/uploads/11_addons.png) - -Select the Plex add-on and click the **Install** button in the lower right-hand corner. - -![](https://opensource.com/sites/default/files/uploads/13_install_plex_addon.png) - -Once the download completes, you can access Plex on the main Kodi screen under **Add-ons**. - -![](https://opensource.com/sites/default/files/uploads/14_addons_finished_installing.png) - -There are several ways to configure an add-on. Some add-ons, such as NHL TV, are configured via a menu accessed by right-clicking the add-on and selecting Configure. Others, such as Plex, display a configuration walk-through when they launch. If an add-on doesn't seem to be configured when you first launch it, try right-clicking its menu and see if a settings option is available there. - -### Coordinating metadata across Kodi devices - -In our house, we have multiple machines that run Kodi. By default, Kodi tracks metadata, such as a video's watched status and show information, locally. Therefore, content updates on one machine won't appear on any other machine—unless you configure all your Kodi devices to store metadata inside an SQL database (which is a feature Kodi supports). This technique is not particularly difficult, but it is more advanced. If you're willing to put in the effort, here's how to do it. - -#### Before you begin - -There are a few things you need to know before configuring shared status for Kodi. - - 1. All content must be on a network share ([Samba][7], NFS, etc.). - 2. All content must be mounted via the network protocol, even if the disks are local to the machine. That means that no matter where the content is physically located, each client must be configured to use a network fileshare source. - 3. You need to be running an SQL-style database. Kodi's official guide walks through MySQL, but I chose MariaDB. - 4. All clients need to have the database port open (port 3306 in the case of MySQL/MariaDB) or the firewalls disabled. - 5. All clients must be running the same version of Kodi - - - -#### Install and configure the database - -If you're running Ubuntu, you can install MariaDB with the following commands: - -``` -sudo apt update -sudo apt install mariadb-server -y -``` - -I am running MariaDB on an Arch Linux machine. The [Arch Wiki][8] documents the initial setup process well, but I'll summarize it here. - -To install, issue the following command: - -``` -sudo pacman -S mariadb -``` - -Most distributions of MariaDB will have the same setup commands. I recommend that you understand what the commands do, but you can safely take the defaults if you're in a home environment. - -``` -sudo systemctl start mariadb -sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql -sudo mysql_secure_installation -``` - -Next, edit the MariaDB config file. This file is different depending on your distribution. On Ubuntu, you want to edit **/etc/mysql/mariadb.conf.d/50-server.cnf**. On Arch, the file is either **/etc/my.cnf** or **/etc/mysql/my.cnf**. Locate the line that says **bind-address = 127.0.0.1** and change it to your desired Ethernet port's IP address or to **bind-address = 0.0.0.0** if you want it to listen on all interfaces. - -Restart the service so the change will take effect: - -``` -sudo systemctl restart mariadb -``` - -#### Configure Kodi and MariaDB/MySQL - -To enable Kodi to write to the database, one of two things needs to happen: You can create the database yourself, or you can let Kodi do it for you. In this case, since the only database on this system is for Kodi, I'll create a user with the rights to create any databases that Kodi requires. Do NOT do this if the machine runs more than one database. - -``` -mysql -u root -p -CREATE USER 'kodi' IDENTIFIED BY 'kodi'; -GRANT ALL ON core.md Dict.md lctt2014.md lctt2016.md lctt2018.md README.md TO 'kodi'; -flush privileges; -\q -``` - -This grants the user all rights—essentially enabling it to act as a root user. For my purposes, this is fine. - -Next, on each Kodi device where you want to share metadata, create the following file: **/home/ /.kodi/userdata/advancedsettings.xml**. This file can contain a lot of very advanced, tweakable settings. My devices have these settings: - -``` - -    -        mysql -        mysql-arch.example.com -        3306 -        kodi -        kodi -    -    -        true -        true -    -    -        -        1 -        322122547 -        20 -    - -``` - -The **< cache>** section—which sets how much of a file Kodi will buffer over the network— is optional in this scenario. See the [Kodi wiki][9] for a full breakdown of this file and its options. - -Once the configuration is complete, it's a good idea to close and reopen Kodi to make sure the settings are applied. - -The final step is configuring all the Kodi clients to use the same network share for all their content. Only one client needs to scrap/refresh the metadata if everything is created successfully. When data is collected, you should see that Kodi creates a new database on your SQL server: - -``` -[kodi@kodi-mysql ~]$ mysql -u root -p -Enter password: -Welcome to the MariaDB monitor.  Commands end with ; or \g. -Your MariaDB connection id is 180 -Server version: 10.1.37-MariaDB MariaDB Server - -Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. - -Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. - -MariaDB [(none)]> show databases; -+--------------------+ -| Database           | -+--------------------+ -| MyVideos107        | -| information_schema | -| mysql              | -| performance_schema | -+--------------------+ -4 rows in set (0.00 sec) -``` - -### Wrapping up - -This article walked through how to get up and running with the basic functionality of Kodi. You should be able to add content and pull down metadata to make browsing your media more convenient. - -You also know how to search for, install, and potentially configure add-ons for additional features. Be extra careful when downloading add-ons, as they are provided by the community at large and not the core developers. It's best to use add-ons only from organizations or companies you trust. - -And you know a bit about sharing metadata across multiple devices. You've been introduced to **advancedsettings.xml** ; hopefully it has piqued your interest. Kodi has a lot of dials and knobs to turn, and you can squeeze a lot of performance and functionality out of the platform with enough experimentation. - -Are you interested in doing more tweaking? What are some of your favorite add-ons or settings? Do you want to know how to change the user interface? What are some of your favorite skins? Let me know in the comments! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/1/manage-your-media-kodi - -作者:[Steve Ovens][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/stratusss -[b]: https://github.com/lujun9972 -[1]: https://en.wikipedia.org/wiki/ISO_image -[2]: https://kodi.tv/ -[3]: https://kodi.wiki/view/HOW-TO:Install_Kodi_for_Linux#Fedora -[4]: https://en.wikipedia.org/wiki/Server_Message_Block -[5]: https://en.wikipedia.org/wiki/Zero-configuration_networking -[6]: https://www.plex.tv -[7]: https://www.samba.org/ -[8]: https://wiki.archlinux.org/index.php/MySQL -[9]: https://kodi.wiki/view/Advancedsettings.xml diff --git a/sources/tech/20190107 Testing isn-t everything.md b/sources/tech/20190107 Testing isn-t everything.md deleted file mode 100644 index b2a2daaaac..0000000000 --- a/sources/tech/20190107 Testing isn-t everything.md +++ /dev/null @@ -1,135 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Testing isn't everything) -[#]: via: (https://arp242.net/weblog/testing.html) -[#]: author: (Martin Tournoij https://arp242.net/) - -Testing isn't everything -====== - -This is adopted from a discussion about [Want to write good unit tests in go? Don’t panic… or should you?][1] While this mainly talks about Go a lot of the points also apply to other languages. - -Some of the most difficult code I’ve worked with is code that is “easily testable”. Code that abstracts everything to the point where you have no idea what’s going on, just so that it can add a “unit test” to what would otherwise be a very straightforward function. DHH called this [Test-induced design damage][2]. - -Testing is just one tool to make sure that your program works, out of several. Another very important tool is writing code in such a way that it is easy to understand and reason about (“simplicity”). - -Books that advocate extensive testing – such as Robert C. Martin’s Clean Code – were written, in part, as a response to ever more complex programs, where you read 1,000 lines of code but still had no idea what’s going on. I recently had to port a simple Java “emoji replacer” (😂 ➙ 😂) to Go. To ensure compatibility I looked up the im­ple­men­ta­tion. It was a whole bunch of classes, factories, and whatnot which all just resulted in calling a regexp on a string. 🤷 - -In dynamic languages like Ruby and Python tests are important for a different reason, as something like this will “work” just fine: - -``` -if condition: - print('w00t') -else: - nonexistent_function() -``` - -Except of course if that `else` branch is entered. It’s easy to typo stuff, or mix stuff up. - -In Go, both of these problems are less of a concern. It has a good static type system, and the focus is on simple straightforward code that is easy to comprehend. Even for a number of dynamic languages there are optional typing systems (function annotations in Python, TypeScript for JavaScript). - -Sometimes you can do a straightforward implementation that doesn’t sacrifice anything for testability; great! But sometimes you have to strike a balance. For some code, not adding a unit test is fine. - -Intensive focus on “unit tests” can be incredibly damaging to a code base. Some codebases have a gazillion unit tests, which makes any change excessively time-consuming as you’re fixing up a whole bunch of tests for even trivial changes. Often times a lot of these tests are just duplicates; adding tests to every layer of a simple CRUD HTTP endpoint is a common example. In many apps it’s fine to just rely on a single integration test. - -Stuff like SQL mocks is another great example. It makes code more complex, harder to change, all so we can say we added a “unit test” to `select * from foo where x=?`. The worst part is, it doesn’t even test anything other than verifying you didn’t typo an SQL query. As soon as the test starts doing anything useful, such as verifying that it actually returns the correct rows from the database, the Unit Test purists will start complaining that it’s not a True Unit Test™ and that You’re Doing It Wrong™. -For most queries, the integration tests and/or manual tests are fine, and extensive SQL mocks are entirely superfluous at best, and harmful at worst. - -There are exceptions, of course; if you’ve got a lot of `if cond { q += "more sql" }` then adding SQL mocks to verify the correctness of that logic might be a good idea. Even in those cases a “non-unit unit test” (e.g. one that just accesses the database) is still a viable option. Integration tests are also still an option. A lot of applications don’t have those kind of complex queries anyway. - -One important reason for the focus on unit tests is to ensure test code runs fast. This was a response to massive test harnesses that take a day to run. This, again, is not really a problem in Go. All integration tests I’ve written run in a reasonable amount of time (several seconds at most, usually faster). The test cache introduced in Go 1.10 makes it even less of a concern. - -Last year a coworker refactored our ETag-based caching library. The old code was very straightforward and easy to understand, and while I’m not claiming it was guaranteed bug-free, it did work very well for a long time. - -It should have been written with some tests in place, but it wasn’t (I didn’t write the original version). Note that the code was not completely untested, as we did have integration tests. - -The refactored version is much more complex. Aside from the two weeks lost on refactoring a working piece of code to … another working piece of code (topic for another post), I’m not so convinced it’s actually that much better. I consider myself a reasonably accomplished and experienced programmer, with a reasonable knowledge and experience in Go. I think that in general, based on feedback from peers and performance reviews, I am at least a programmer of “average” skill level, if not more. - -If an average programmer has trouble comprehending what is in essence a handful of simple functions because there are so many layers of abstractions, then something has gone wrong. The refactor traded one tool to verify correctness (simplicity) with another (testing). Simplicity is hardly a guarantee to ensure correctness, but neither are unit tests. Ideally, we should do both. - -Postscript: the refactor introduced a bug and removed a feature that was useful, but is now harder to add, not in the least because the code is much more complex. - -All units working correctly gives exactly zero guarantees that the program is working correctly. A lot of logic errors won’t be caught because the logic consists of several units working together. So you need integration tests, and if the integration tests duplicate half of your unit tests, then why bother with those unit tests? - -Test Driven Development (TDD) is also just one tool. It works well for some problems; not so much for others. In particular, I think that “forced to write code in tiny units” can be terribly harmful in some cases. Some code is just a serial script which says “do this, and then that, and then this”. Splitting that up in a whole bunch of “tiny units” can greatly reduce how easy the code is to understand, and thus harder to verify that it is correct. - -I’ve had to fix some Ruby code where everything was in tiny units – there is a strong culture of TDD in the Ruby community – and even though the units were easy to understand I found it incredibly hard to understand the application logic. If everything is split in “tiny units” then understanding how everything fits together to create an actual program that does something useful will be much harder. - -You see the same friction in the old microkernel vs. monolithic kernel debate, or the more recent microservices vs. monolithic app one. In principle splitting everything up in small parts sounds like a great idea, but in practice it turns out that making all the small parts work together is a very hard problem. A hybrid approach seems to work best for kernels and app design, balancing the ad­van­tages and downsides of both approaches. I think the same applies to code. - -To be clear, I am not against unit tests or TDD and claiming we should all gung-go cowboy code our way through life 🤠. I write unit tests and practice TDD, when it makes sense. My point is that unit tests and TDD are not the solution to every single last problem and should applied indiscriminately. This is why I use words such as “some” and “often” so frequently. - -This brings me to the topic of testing frameworks. I have never understood what problem libraries such as [goblin][3] are solving. How is this: - -``` -Expect(err).To(nil) -Expect(out).To(test.wantOut) -``` - -An improvement over this? - -``` -if err != nil { - t.Fatal(err) -} - -if out != tt.want { - t.Errorf("out: %q\nwant: %q", out, tt.want) -} -``` - -What’s wrong with `if` and `==`? Why do we need to abstract it? Note that with table-driven tests you’re only typing these checks once, so you’re saving just a few lines here. - -[Ginkgo][4] is even worse. It turns a very simple, straightforward, and understandable piece of code and doesn’t just abstract `if`, it also chops up the execution in several different functions (`BeforeEach()` and `DescribeTable()`). - -This is known as Behaviour-driven development (BDD). I am not entirely sure what to think of BDD. I am skeptical, but I’ve never properly used it in a large project so I’m hesitant to just dismiss it. Note that I said “properly”: most projects don’t really use BDD, they just use a library with a BDD syntax and shoehorn their testing code in to that. That’s ad-hoc BDD, or faux-BDD. - -Whatever merits BDD may have, they are not present simply because your testing code vaguely resembles BDD-style syntax. This on its own demonstrates that BDD is perhaps not a great idea for many projects. - -I think there are real problems with these BDD(-ish) test tools, as they obfuscate what you’re actually doing. No matter what, testing remains a matter of getting the output of a function and checking if that matches what you expected. No testing methodology is going to change that fundamental. The more layers you add on top of that, the harder it will be to debug. - -When determining if something is “easy” then my prime concern is not how easy something is to write, but how easy something is to debug when things fail. I will gladly spend a bit more effort writing things if that makes things a lot easier to debug. - -All code – including testing code – can fail in confusing, surprising, and unexpected ways (a “bug”), and then you’re expected to debug that code. The more complex the code, the harder it is to debug. - -You should expect all code – including testing code – to go through several debugging cycles. Note that with debugging cycle I don’t mean “there is a bug in the code you need to fix”, but rather “I need to look at this code to fix the bug”. - -In general, I already find testing code harder to debug than regular code, as the “code surface” tends to be larger. You have the testing code and the actual implementation code to think of. That’s a lot more than just thinking of the implementation code. - -Adding these abstractions means you will now also have to think about that, too! This might be okay if the abstractions would reduce the scope of what you have to think about, which is a common reason to add abstractions in regular code, but it doesn’t. It just adds more things to think about. - -So these are exactly the wrong kind of abstractions: they wrap and obfuscate, rather than separate concerns and reduce the scope. - -If you’re interested in soliciting contributions from other people in open source projects then making your tests understandable is a very important concern (it’s also important in business context, but a bit less so, as you’ve got actual time to train people). - -Seeing PRs with “here’s the code, it works, but I couldn’t figure out the tests, plz halp!” is not uncommon; and I’m fairly sure that at least a few people never even bothered to submit PRs just because they got stuck on the tests. I know I have. - -There is one open source project that I contributed to, and would like to contribute more to, but don’t because it’s just too hard to write and run tests. Every change is “write working code in 15 minutes, spend 45 minutes dealing with tests”. It’s … no fun at all. - -Writing good software is hard. I’ve got some ideas on how to do it, but don’t have a comprehensive view. I’m not sure if anyone really does. I do know that “always add unit tests” and “always practice TDD” isn’t the answer, in spite of them being useful concepts. To give an analogy: most people would agree that a free market is a good idea, but at the same time even most libertarians would agree it’s not the complete solution to every single problem (well, [some do][5], but those ideas are … rather misguided). - -You can mail me at [martin@arp242.net][6] or [create a GitHub issue][7] for feedback, questions, etc. - --------------------------------------------------------------------------------- - -via: https://arp242.net/weblog/testing.html - -作者:[Martin Tournoij][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://arp242.net/ -[b]: https://github.com/lujun9972 -[1]: https://medium.com/@jens.neuse/want-to-write-good-unit-tests-in-go-dont-panic-or-should-you-ba3eb5bf4f51 -[2]: http://david.heinemeierhansson.com/2014/test-induced-design-damage.html -[3]: https://github.com/franela/goblin -[4]: https://github.com/onsi/ginkgo -[5]: https://en.wikipedia.org/wiki/Murray_Rothbard#Children's_rights_and_parental_obligations -[6]: mailto:martin@arp242.net -[7]: https://github.com/Carpetsmoker/arp242.net/issues/new diff --git a/sources/tech/20190108 Avoid package names like base, util, or common.md b/sources/tech/20190108 Avoid package names like base, util, or common.md deleted file mode 100644 index b2c70b0b2e..0000000000 --- a/sources/tech/20190108 Avoid package names like base, util, or common.md +++ /dev/null @@ -1,57 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Avoid package names like base, util, or common) -[#]: via: (https://dave.cheney.net/2019/01/08/avoid-package-names-like-base-util-or-common) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -Avoid package names like base, util, or common -====== - -Writing a good Go package starts with its name. Think of your package’s name as an elevator pitch, you have to describe what it does using just one word. - -A common cause of poor package names are _utility packages_. These are packages where helpers and utility code congeal. These packages contain an assortment of unrelated functions, as such their utility is hard to describe in terms of what the package _provides_. This often leads to a package’s name being derived from what the package _contains_ —utilities. - -Package names like `utils` or `helpers` are commonly found in projects which have developed deep package hierarchies and want to share helper functions without introducing import loops. Extracting utility functions to new package breaks the import loop, but as the package stems from a design problem in the project, its name doesn’t reflect its purpose, only its function in breaking the import cycle. - -> [A little] duplication is far cheaper than the wrong abstraction. - -— [Sandy Metz][1] - -My recommendation to improve the name of `utils` or `helpers` packages is to analyse where they are imported and move the relevant functions into the calling package. Even if this results in some code duplication this is preferable to introducing an import dependency between two packages. In the case where utility functions are used in many places, prefer multiple packages, each focused on a single aspect with a correspondingly descriptive name. - -Packages with names like `base` or `common` are often found when functionality common to two or more related facilities, for example common types between a client and server or a server and its mock, has been refactored into a separate package. Instead the solution is to reduce the number of packages by combining client, server, and common code into a single package named after the facility the package provides. - -For example, the `net/http` package does not have `client` and `server` packages, instead it has `client.go` and `server.go` files, each holding their respective types. `transport.go` holds for the common message transport code used by both HTTP clients and servers. - -Name your packages after what they _provide_ , not what they _contain_. - -### Related posts: - - 1. [Simple profiling package moved, updated][2] - 2. [The package level logger anti pattern][3] - 3. [How to include C code in your Go package][4] - 4. [Why I think Go package management is important][5] - - - --------------------------------------------------------------------------------- - -via: https://dave.cheney.net/2019/01/08/avoid-package-names-like-base-util-or-common - -作者:[Dave Cheney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://dave.cheney.net/author/davecheney -[b]: https://github.com/lujun9972 -[1]: https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction -[2]: https://dave.cheney.net/2014/10/22/simple-profiling-package-moved-updated (Simple profiling package moved, updated) -[3]: https://dave.cheney.net/2017/01/23/the-package-level-logger-anti-pattern (The package level logger anti pattern) -[4]: https://dave.cheney.net/2013/09/07/how-to-include-c-code-in-your-go-package (How to include C code in your Go package) -[5]: https://dave.cheney.net/2013/10/10/why-i-think-go-package-management-is-important (Why I think Go package management is important) diff --git a/sources/tech/20190109 Automating deployment strategies with Ansible.md b/sources/tech/20190109 Automating deployment strategies with Ansible.md deleted file mode 100644 index 175244e760..0000000000 --- a/sources/tech/20190109 Automating deployment strategies with Ansible.md +++ /dev/null @@ -1,152 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Automating deployment strategies with Ansible) -[#]: via: (https://opensource.com/article/19/1/automating-deployment-strategies-ansible) -[#]: author: (Jario da Silva Junior https://opensource.com/users/jairojunior) - -Automating deployment strategies with Ansible -====== -Use automation to eliminate time sinkholes due to repetitive tasks and unplanned work. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/innovation_lightbulb_gears_devops_ansible.png?itok=TSbmp3_M) - -When you examine your technology stack from the bottom layer to the top—hardware, operating system (OS), middleware, and application—with their respective configurations, it's clear that changes are far more frequent as you go up in the stack. Your hardware will hardly change, your OS has a long lifecycle, and your middleware will keep up with the application's needs, but even if your release cycle is long (weeks or months), your applications will be the most volatile. - -![](https://opensource.com/sites/default/files/uploads/osdc-deployment-strategies.png) - -In [The Practice of System and Network Administration][1], the authors categorize the biggest "time sinkholes" in IT as manual/non-standard provisioning of OSes and application deployments. These time sinkholes will consume you with repetitive tasks or unplanned work. - -How so? Let's say you provision a new server without Network Time Protocol (NTP) properly configured, and a small percentage of your requests—in a cluster of dozens of servers—start to behave strangely because an application uses some sort of scheduler that relies on correct time. When you look at it like this, it is an easy problem to fix, but how long it would it take your team figure it out? Incidents or unplanned work consume a lot of your time and, even worse, your greatest talents. Should you really be wasting time investigating production systems like this? Wouldn't it be better to set this server aside and automatically provision a new one from scratch? - -What about manual deployment? Imagine 20 binaries deployed across a farm or nodes with their respective configuration files? How error-prone is this? Inevitably, it will eventually end up in unplanned work. - -The [State of DevOps Report 2018][2] introduces the stages of DevOps adoption, and it's no surprise that Stage 0 includes deployment automation and reuse of deployment patterns, while Stage 1 and 2 focus on standardization of your infrastructure stack to reduce inconsistencies across your environment. - -Note that, more than once, I have seen an ops team using this "standardization" as an excuse to limit a development team's ability to deliver, forcing them to use a hammer on something that is definitely not a nail. Don't do it; the price is extremely high. - -The lesson to be learned here is that lack of automation not only increases your lead time but also the rate of problems in your process and the amount of unplanned work you face. If you've read [The Phoenix Project][3], you know this is the root of all evil in any value stream, and if you don't get rid of it, it will eventually kill your business. - -When trying to fill the biggest time sinkholes, why not start with automating operating system installation? We could, but the results would take longer to appear since new virtual machines are not created as frequently as applications are deployed. In other words, this may not free up the time we need to power our initiative, so it could die prematurely. - -Still not convinced? Smaller and more frequent releases are also extremely positive from the development side. Let's explain a little further… - -### Deploy ≠ Release - -The first thing to understand is that, although they're used interchangeably, deployment and release do **NOT** mean the same thing. Release refers to providing the user a new version, while deployment is the technical process of deploying the new version. Let's focus on the technical process of deployment. - -### Tasks, groups, and Ansible - -We need to understand the deployment process from the beginning to the end, including everything in the middle—the tasks, which servers are involved in the process, and which steps are executed—to avoid falling into the pitfalls described by Mattias Geniar in [Automating the unknown][4]. - -#### Tasks - -The steps commonly executed in a regular deployment process include: - - * Deploy application(s)/database(s) or database(s) change(s) - * Stop/start services and monitoring - * Add/remove the server from our load balancers - * Verify application state—is it ready to serve requests? - * Manual approval—is it necessary? - - - -For some people, automating the deployment process but leaving a manual approval step is like riding a bike with training wheels. As someone once told me: "It's better to ride with training wheels than not ride at all." - -What if a tool doesn't include an API or a command-line interface (CLI) to enable task automation? Well, maybe it's time to think about changing tools. There are many open source application servers, databases, monitoring systems, and load balancers that are easily automated—thanks in large part to the [Unix way][5]. When adopting a new technology, eliminate options that are not automated and use your creativity to support your legacy technologies. For example, I've seen people versioning network appliance configuration files and updating them using FTP. - -And guess what? It's a wonderful time to adopt open source tools. The recent [Accelerate: State of DevOps][6] report found that open source technologies are in predominant use in high-performance organizations. The logic is pretty simple: open source projects function in a "Darwinist" model, where those that do not adapt and evolve will die for lack of a user base or contributions. Feedback is paramount to software evolution. - -#### Groups - -To identify groups of servers to target for automation, think about the most tasks you want to automate, such as those that: - - * Deploy application(s)/database(s) or database change(s) - * Stop/start services and monitoring - * Add/remove server(s) from load balancer(s) - * Verify application state—is it ready to serve requests? - - - -#### The playbook - -A high-level deployment process could be: - - 1. Stop monitoring (to avoid false-positives) - 2. Remove server from the load balancer (to prevent the user from receiving an error code) - 3. Stop the service (to enable a graceful shutdown) - 4. Deploy the new version of the application - 5. Wait for the application to be ready to receive new requests - 6. Execute steps 3, 2, and 1. - 7. Do the same for the next N servers. - - - -Having documentation of your process is nice, but having an executable documenting your deployment is better! Here's what steps 1–5 would look like in Ansible for a fully open source stack: - -``` -- name: Disable alerts -  nagios: -    action: disable_alerts -    host: "{{ inventory_hostname }}" -    services: webserver -  delegate_to: "{{ item }}" -  loop: "{{ groups.monitoring }}" - -- name: Disable servers in the LB -  haproxy: -    host: "{{ inventory_hostname }}" -    state: disabled -    backend: app -  delegate_to: "{{ item }}" -  loop: " {{ groups.lbserver }}" - -- name: Stop the service -  service: name=httpd state=stopped - -- name: Deploy a new version -  unarchive: src=app.tar.gz dest=/var/www/app - -- name: Verify application state -  uri: -    url: "http://{{ inventory_hostname }}/app/healthz" -    status_code: 200 -  retries: 5 -``` - -### Why Ansible? - -There are other alternatives for application deployment, but the things that make Ansible an excellent choice include: - - * Multi-tier orchestration (i.e., **delegate_to** ) allowing you to orderly target different groups of servers: monitoring, load balancer, application server, database, etc. - * Rolling upgrade (i.e., serial) to control how changes are made (e.g., 1 by 1, N by N, X% at a time, etc.) - * Error control, **max_fail_percentage** and **any_errors_fatal** , is my process all-in or will it tolerate fails? - * A vast library of modules for: - * Monitoring (e.g., Nagios, Zabbix, etc.) - * Load balancers (e.g., HAProxy, F5, Netscaler, Cisco, etc.) - * Services (e.g., service, command, file) - * Deployment (e.g., copy, unarchive) - * Programmatic verifications (e.g., command, Uniform Resource Identifier) - - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/1/automating-deployment-strategies-ansible - -作者:[Jario da Silva Junior][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jairojunior -[b]: https://github.com/lujun9972 -[1]: https://www.amazon.com/Practice-System-Network-Administration-Enterprise/dp/0321919165/ref=dp_ob_title_bk -[2]: https://puppet.com/resources/whitepaper/state-of-devops-report -[3]: https://www.amazon.com/Phoenix-Project-DevOps-Helping-Business/dp/0988262592 -[4]: https://ma.ttias.be/automating-unknown/ -[5]: https://en.wikipedia.org/wiki/Unix_philosophy -[6]: https://cloudplatformonline.com/2018-state-of-devops.html diff --git a/sources/tech/20190111 Build a retro gaming console with RetroPie.md b/sources/tech/20190111 Build a retro gaming console with RetroPie.md deleted file mode 100644 index eedac575c9..0000000000 --- a/sources/tech/20190111 Build a retro gaming console with RetroPie.md +++ /dev/null @@ -1,82 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Build a retro gaming console with RetroPie) -[#]: via: (https://opensource.com/article/19/1/retropie) -[#]: author: (Jay LaCroix https://opensource.com/users/jlacroix) - -Build a retro gaming console with RetroPie -====== -Play your favorite classic Nintendo, Sega, and Sony console games on Linux. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open_gaming_games_roundup_news.png?itok=KM0ViL0f) - -The most common question I get on [my YouTube channel][1] and in person is what my favorite Linux distribution is. If I limit the answer to what I run on my desktops and laptops, my answer will typically be some form of an Ubuntu-based Linux distro. My honest answer to this question may surprise many. My favorite Linux distribution is actually [RetroPie][2]. - -As passionate as I am about Linux and open source software, I'm equally passionate about classic gaming, specifically video games produced in the '90s and earlier. I spend most of my surplus income on older games, and I now have a collection of close to a thousand games for over 20 gaming consoles. In my spare time, I raid flea markets, yard sales, estate sales, and eBay buying games for various consoles, including almost every iteration made by Nintendo, Sega, and Sony. There's something about classic games that I adore, a charm that seems lost in games released nowadays. - -Unfortunately, collecting retro games has its fair share of challenges. Cartridges with memory for save files will lose their charge over time, requiring the battery to be replaced. While it's not hard to replace save batteries (if you know how), it's still time-consuming. Games on CD-ROMs are subject to disc rot, which means that even if you take good care of them, they'll still lose data over time and become unplayable. Also, sometimes it's difficult to find replacement parts for some consoles. This wouldn't be so much of an issue if the majority of classic games were available digitally, but the vast majority are never re-released on a digital platform. - -### Gaming on RetroPie - -RetroPie is a great project and an asset to retro gaming enthusiasts like me. RetroPie is a Raspbian-based distribution designed for use on the Raspberry Pi (though it is possible to get it working on other platforms, such as a PC). RetroPie boots into a graphical interface that is completely controllable via a gamepad or joystick and allows you to easily manage digital copies (ROMs) of your favorite games. You can scrape information from the internet to organize your collection better and manage lists of favorite games, and the entire interface is very user-friendly and efficient. From the interface, you can launch directly into a game, then exit the game by pressing a combination of buttons on your gamepad. You rarely need a keyboard, unless you have to enter your WiFi password or manually edit configuration files. - -I use RetroPie to host a digital copy of every physical game I own in my collection. When I purchase a game from a local store or eBay, I also download the ROM. As a collector, this is very convenient. If I don't have a particular physical console within arms reach, I can boot up RetroPie and enjoy a game quickly without having to connect cables or clean cartridge contacts. There's still something to be said about playing a game on the original hardware, but if I'm pressed for time, RetroPie is very convenient. I also don't have to worry about dead save batteries, dirty cartridge contacts, disc rot, or any of the other issues collectors like me have to regularly deal with. I simply play the game. - -Also, RetroPie allows me to be very clever and utilize my technical know-how to achieve additional functionality that's not normally available. For example, I have three RetroPies set up, each of them synchronizing their files between each other by leveraging [Syncthing][3], a popular open source file synchronization tool. The synchronization happens automatically, and it means I can start a game on one television and continue in the same place on another unit since the save files are included in the synchronization. To take it a step further, I also back up my save and configuration files to [Backblaze B2][4], so I'm protected if an SD card becomes defective. - -### Setting up RetroPie - -Setting up RetroPie is very easy, and if you've ever set up a Raspberry Pi Linux distribution before (such as Raspbian) the process is essentially the same—you simply download the IMG file and flash it to your SD card by utilizing another tool, such as [Etcher][5], and insert it into your RetroPie. Then plug in an AC adapter and gamepad and hook it up to your television via HDMI. Optionally, you can buy a case to protect your RetroPie from outside elements and add visual appeal. Here is a listing of things you'll need to get started: - - * Raspberry Pi board (Model 3B+ or higher recommended) - * SD card (16GB or larger recommended) - * A USB gamepad - * UL-listed micro USB power adapter, at least 2.5 amp - - - -If you choose to add the optional Raspberry Pi case, I recommend the Super NES and Super Famicom themed cases from [RetroFlag][6]. Not only do these cases look cool, but they also have fully functioning power and reset buttons. This means you can configure the reset and power buttons to directly trigger the operating system's halt process, rather than abruptly terminating power. This definitely makes for a more professional experience, but it does require the installation of a special script. The instructions are on [RetroFlag's GitHub page][7]. Be wary: there are many cases available on Amazon and eBay of varying quality. Some of them are cheap knock-offs of RetroFlag cases, and others are just a lower quality overall. In fact, even cases by RetroFlag vary in quality—I had some power-distribution issues with the NES-themed case that made for an unstable experience. If in doubt, I've found that RetroFlag's Super NES and Super Famicom themed cases work very well. - -### Adding games - -When you boot RetroPie for the first time, it will resize the filesystem to ensure you have full access to the available space on your SD card and allow you to set up your gamepad. I can't give you links for game ROMs, so I'll leave that part up to you to figure out. When you've found them, simply add them to the RetroPie SD card in the designated folder, which would be located under **/home/pi/RetroPie/roms/ **. You can use your favorite tool for transferring the ROMs to the Pi, such as [SCP][8] in a terminal, [WinSCP][9], [Samba][10], etc. Once you've added the games, you can rescan them by pressing start and choosing the option to restart EmulationStation. When it restarts, it should automatically add menu entries for the ROMs you've added. That's basically all there is to it. - -(The rescan updates EmulationStation’s game inventory. If you don’t do that, it won’t list any newly added games you copy over.) - -Regarding the games' performance, your mileage will vary depending on which consoles you're emulating. For example, I've noticed that Sega Dreamcast games barely run at all, and most Nintendo 64 games will run sluggishly with a bad framerate. Many PlayStation Portable (PSP) games also perform inconsistently. However, all of the 8-bit and 16-bit consoles emulate seemingly perfectly—I haven't run into a single 8-bit or 16-bit game that doesn't run well. Surprisingly, games designed for the original PlayStation run great for me, which is a great feat considering the lower-performance potential of the Raspberry Pi. - -Overall, RetroPie's performance is great, but the Raspberry Pi is not as powerful as a gaming PC, so adjust your expectations accordingly. - -### Conclusion - -RetroPie is a fantastic open source project dedicated to preserving classic games and an asset to game collectors everywhere. Having a digital copy of my physical game collection is extremely convenient. If I were to tell my childhood self that one day I could have an entire game collection on one device, I probably wouldn't believe it. But RetroPie has become a staple in my household and provides hours of fun and enjoyment. - -If you want to see the parts I mentioned as well as a quick installation overview, I have [a video][11] on [my YouTube channel][12] that goes over the process and shows off some gameplay at the end. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/1/retropie - -作者:[Jay LaCroix][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jlacroix -[b]: https://github.com/lujun9972 -[1]: https://www.youtube.com/channel/UCxQKHvKbmSzGMvUrVtJYnUA -[2]: https://retropie.org.uk/ -[3]: https://syncthing.net/ -[4]: https://www.backblaze.com/b2/cloud-storage.html -[5]: https://www.balena.io/etcher/ -[6]: https://www.amazon.com/shop/learnlinux.tv?listId=1N9V89LEH5S8K -[7]: https://github.com/RetroFlag/retroflag-picase -[8]: https://en.wikipedia.org/wiki/Secure_copy -[9]: https://winscp.net/eng/index.php -[10]: https://www.samba.org/ -[11]: https://www.youtube.com/watch?v=D8V-KaQzsWM -[12]: http://www.youtube.com/c/LearnLinuxtv diff --git a/sources/tech/20190115 Linux Desktop Setup - HookRace Blog.md b/sources/tech/20190115 Linux Desktop Setup - HookRace Blog.md deleted file mode 100644 index 29d5f63d2a..0000000000 --- a/sources/tech/20190115 Linux Desktop Setup - HookRace Blog.md +++ /dev/null @@ -1,514 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Linux Desktop Setup · HookRace Blog) -[#]: via: (https://hookrace.net/blog/linux-desktop-setup/) -[#]: author: (Dennis Felsing http://felsin9.de/nnis/) - -Linux Desktop Setup -====== - - -My software setup has been surprisingly constant over the last decade, after a few years of experimentation since I initially switched to Linux in 2006. It might be interesting to look back in another 10 years and see what changed. A quick overview of what’s running as I’m writing this post: - -[![htop overview][1]][2] - -### Motivation - -My software priorities are, in no specific order: - - * Programs should run on my local system so that I’m in control of them, this excludes cloud solutions. - * Programs should run in the terminal, so that they can be used consistently from anywhere, including weak computers or a phone. - * Keyboard focused is nearly automatic by using terminal software. I prefer to use the mouse where it makes sense only, reaching for the mouse all the time during typing feels like a waste of time. Occasionally it took me an hour to notice that the mouse wasn’t even plugged in. - * Ideally use fast and efficient software, I don’t like hearing the fan and feeling the room heat up. I can also keep running older hardware for much longer, my 10 year old Thinkpad x200s is still fine for all the software I use. - * Be composable. I don’t want to do every step manually, instead automate more when it makes sense. This naturally favors the shell. - - - -### Operating Systems - -I had a hard start with Linux 12 years ago by removing Windows, armed with just the [Gentoo Linux][3] installation CD and a printed manual to get a functioning Linux system. It took me a few days of compiling and tinkering, but in the end I felt like I had learnt a lot. - -I haven’t looked back to Windows since then, but I switched to [Arch Linux][4] on my laptop after having the fan fail from the constant compilation stress. Later I also switched all my other computers and private servers to Arch Linux. As a rolling release distribution you get package upgrades all the time, but the most important breakages are nicely reported in the [Arch Linux News][5]. - -One annoyance though is that Arch Linux removes the old kernel modules once you upgrade it. I usually notice that once I try plugging in a USB flash drive and the kernel fails to load the relevant module. Instead you’re supposed to reboot after each kernel upgrade. There are a few [hacks][6] around to get around the problem, but I haven’t been bothered enough to actually use them. - -Similar problems happen with other programs, commonly Firefox, cron or Samba requiring a restart after an upgrade, but annoyingly not warning you that that’s the case. [SUSE][7], which I use at work, nicely warns about such cases. - -For the [DDNet][8] production servers I prefer [Debian][9] over Arch Linux, so that I have a lower chance of breakage on each upgrade. For my firewall and router I used [OpenBSD][10] for its clean system, documentation and great [pf firewall][11], but right now I don’t have a need for a separate router anymore. - -### Window Manager - -Since I started out with Gentoo I quickly noticed the huge compile time of KDE, which made it a no-go for me. I looked around for more minimal solutions, and used [Openbox][12] and [Fluxbox][13] initially. At some point I jumped on the tiling window manager train in order to be more keyboard-focused and picked up [dwm][14] and [awesome][15] close to their initial releases. - -In the end I settled on [xmonad][16] thanks to its flexibility, extendability and being written and configured in pure [Haskell][17], a great functional programming language. One example of this is that at home I run a single 40” 4K screen, but often split it up into four virtual screens, each displaying a workspace on which my windows are automatically arranged. Of course xmonad has a [module][18] for that. - -[dzen][19] and [conky][20] function as a simple enough status bar for me. My entire conky config looks like this: - -``` -out_to_console yes -update_interval 1 -total_run_times 0 - -TEXT -${downspeed eth0} ${upspeed eth0} | $cpu% ${loadavg 1} ${loadavg 2} ${loadavg 3} $mem/$memmax | ${time %F %T} -``` - -And gets piped straight into dzen2 with `conky | dzen2 -fn '-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*' -bg '#000000' -fg '#ffffff' -p -e '' -x 1000 -w 920 -xs 1 -ta r`. - -One important feature for me is to make the terminal emit a beep sound once a job is done. This is done simply by adding a `\a` character to the `PR_TITLEBAR` variable in zsh, which is shown whenever a job is done. Of course I disable the actual beep sound by blacklisting the `pcspkr` kernel module with `echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf`. Instead the sound gets turned into an urgency by urxvt’s `URxvt.urgentOnBell: true` setting. Then xmonad has an urgency hook to capture this and I can automatically focus the currently urgent window with a key combination. In dzen I get the urgent windowspaces displayed with a nice and bright `#ff0000`. - -The final result in all its glory on my Laptop: - -[![Laptop screenshot][21]][22] - -I hear that [i3][23] has become quite popular in the last years, but it requires more manual window alignment instead of specifying automated methods to do it. - -I realize that there are also terminal multiplexers like [tmux][24], but I still require a few graphical applications, so in the end I never used them productively. - -### Terminal Persistency - -In order to keep terminals alive I use [dtach][25], which is just the detach feature of screen. In order to make every terminal on my computer detachable I wrote a [small wrapper script][26]. This means that even if I had to restart my X server I could keep all my terminals running just fine, both local and remote. - -### Shell & Programming - -Instead of [bash][27] I use [zsh][28] as my shell for its huge number of features. - -As a terminal emulator I found [urxvt][29] to be simple enough, support Unicode and 256 colors and has great performance. Another great feature is being able to run the urxvt client and daemon separately, so that even a large number of terminals barely takes up any memory (except for the scrollback buffer). - -There is only one font that looks absolutely clean and perfect to me: [Terminus][30]. Since i’s a bitmap font everything is pixel perfect and renders extremely fast and at low CPU usage. In order to switch fonts on-demand in each terminal with `CTRL-WIN-[1-7]` my ~/.Xdefaults contains: - -``` -URxvt.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-* -dzen2.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-* - -URxvt.keysym.C-M-1: command:\033]50;-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*\007 -URxvt.keysym.C-M-2: command:\033]50;-xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*\007 -URxvt.keysym.C-M-3: command:\033]50;-xos4-terminus-medium-r-normal-*-18-*-*-*-*-*-*-*\007 -URxvt.keysym.C-M-4: command:\033]50;-xos4-terminus-medium-r-normal-*-22-*-*-*-*-*-*-*\007 -URxvt.keysym.C-M-5: command:\033]50;-xos4-terminus-medium-r-normal-*-24-*-*-*-*-*-*-*\007 -URxvt.keysym.C-M-6: command:\033]50;-xos4-terminus-medium-r-normal-*-28-*-*-*-*-*-*-*\007 -URxvt.keysym.C-M-7: command:\033]50;-xos4-terminus-medium-r-normal-*-32-*-*-*-*-*-*-*\007 - -URxvt.keysym.C-M-n: command:\033]10;#ffffff\007\033]11;#000000\007\033]12;#ffffff\007\033]706;#00ffff\007\033]707;#ffff00\007 -URxvt.keysym.C-M-b: command:\033]10;#000000\007\033]11;#ffffff\007\033]12;#000000\007\033]706;#0000ff\007\033]707;#ff0000\007 -``` - -For programming and writing I use [Vim][31] with syntax highlighting and [ctags][32] for indexing, as well as a few terminal windows with grep, sed and the other usual suspects for search and manipulation. This is probably not at the same level of comfort as an IDE, but allows me more automation. - -One problem with Vim is that you get so used to its key mappings that you’ll want to use them everywhere. - -[Python][33] and [Nim][34] do well as scripting languages where the shell is not powerful enough. - -### System Monitoring - -[htop][35] (look at the background of that site, it’s a live view of the server that’s hosting it) works great for getting a quick overview of what the software is currently doing. [lm_sensors][36] allows monitoring the hardware temperatures, fans and voltages. [powertop][37] is a great little tool by Intel to find power savings. [ncdu][38] lets you analyze disk usage interactively. - -[nmap][39], iptraf-ng, [tcpdump][40] and [Wireshark][41] are essential tools for analyzing network problems. - -There are of course many more great tools. - -### Mails & Synchronization - -On my home server I have a [fetchmail][42] daemon running for each email acccount that I have. Fetchmail just retrieves the incoming emails and invokes [procmail][43]: - -``` -#!/bin/sh -for i in /home/deen/.fetchmail/*; do - FETCHMAILHOME=$i /usr/bin/fetchmail -m 'procmail -d %T' -d 60 -done -``` - -The configuration is as simple as it could be and waits for the server to inform us of fresh emails: - -``` -poll imap.1und1.de protocol imap timeout 120 user "dennis@felsin9.de" password "XXX" folders INBOX keep ssl idle -``` - -My `.procmailrc` config contains a few rules to backup all mails and sort them into the correct directories, for example based on the mailing list id or from field in the mail header: - -``` -MAILDIR=/home/deen/shared/Maildir -LOGFILE=$HOME/.procmaillog -LOGABSTRACT=no -VERBOSE=off -FORMAIL=/usr/bin/formail -NL=" -" - -:0wc -* ! ? test -d /media/mailarchive/`date +%Y` -| mkdir -p /media/mailarchive/`date +%Y` - -# Make backups of all mail received in format YYYY/YYYY-MM -:0c -/media/mailarchive/`date +%Y`/`date +%Y-%m` - -:0 -* ^From: .*(.*@.*.kit.edu|.*@.*.uka.de|.*@.*.uni-karlsruhe.de) -$MAILDIR/.uni/ - -:0 -* ^list-Id:.*lists.kit.edu -$MAILDIR/.uni-ml/ - -[...] -``` - -To send emails I use [msmtp][44], which is also great to configure: - -``` -account default -host smtp.1und1.de -tls on -tls_trust_file /etc/ssl/certs/ca-certificates.crt -auth on -from dennis@felsin9.de -user dennis@felsin9.de -password XXX - -[...] -``` - -But so far the emails are still on the server. My documents are all stored in a directory that I synchronize between all computers using [Unison][45]. Think of Unison as a bidirectional interactive [rsync][46]. My emails are part of this documents directory and thus they end up on my desktop computers. - -This also means that while the emails reach my server immediately, I only fetch them on deman instead of getting instant notifications when an email comes in. - -From there I read the mails with [mutt][47], using the sidebar plugin to display my mail directories. The `/etc/mailcap` file is essential to display non-plaintext mails containing HTML, Word or PDF: - -``` -text/html;w3m -I %{charset} -T text/html; copiousoutput -application/msword; antiword %s; copiousoutput -application/pdf; pdftotext -layout /dev/stdin -; copiousoutput -``` - -### News & Communication - -[Newsboat][48] is a nice little RSS/Atom feed reader in the terminal. I have it running on the server in a `tach` session with about 150 feeds. Filtering feeds locally is also possible, for example: - -``` -ignore-article "https://forum.ddnet.tw/feed.php" "title =~ \"Map Testing •\" or title =~ \"Old maps •\" or title =~ \"Map Bugs •\" or title =~ \"Archive •\" or title =~ \"Waiting for mapper •\" or title =~ \"Other mods •\" or title =~ \"Fixes •\"" -``` - -I use [Irssi][49] the same way for communication via IRC. - -### Calendar - -[remind][50] is a calendar that can be used from the command line. Setting new reminders is done by editing the `rem` files: - -``` -# One time events -REM 2019-01-20 +90 Flight to China %b - -# Recurring Holidays -REM 1 May +90 Holiday "Tag der Arbeit" %b -REM [trigger(easterdate(year(today()))-2)] +90 Holiday "Karfreitag" %b - -# Time Change -REM Nov Sunday 1 --7 +90 Time Change (03:00 -> 02:00) %b -REM Apr Sunday 1 --7 +90 Time Change (02:00 -> 03:00) %b - -# Birthdays -FSET birthday(x) "'s " + ord(year(trigdate())-x) + " birthday is %b" -REM 16 Apr +90 MSG Andreas[birthday(1994)] - -# Sun -SET $LatDeg 49 -SET $LatMin 19 -SET $LatSec 49 -SET $LongDeg -8 -SET $LongMin -40 -SET $LongSec -24 - -MSG Sun from [sunrise(trigdate())] to [sunset(trigdate())] -[...] -``` - -Unfortunately there is no Chinese Lunar calendar function in remind yet, so Chinese holidays can’t be calculated easily. - -I use two aliases for remind: - -``` -rem -m -b1 -q -g -``` - -to see a list of the next events in chronological order and - -``` -rem -m -b1 -q -cuc12 -w$(($(tput cols)+1)) | sed -e "s/\f//g" | less -``` - -to show a calendar fitting just the width of my terminal: - -![remcal][51] - -### Dictionary - -[rdictcc][52] is a little known dictionary tool that uses the excellent dictionary files from [dict.cc][53] and turns them into a local database: - -``` -$ rdictcc rasch -====================[ A => B ]==================== -rasch: - - apace - - brisk [speedy] - - cursory - - in a timely manner - - quick - - quickly - - rapid - - rapidly - - sharpish [Br.] [coll.] - - speedily - - speedy - - swift - - swiftly -rasch [gehen]: - - smartly [quickly] -Rasch {n} [Zittergras-Segge]: - - Alpine grass [Carex brizoides] - - quaking grass sedge [Carex brizoides] -Rasch {m} [regional] [Putzrasch]: - - scouring pad -====================[ B => A ]==================== -Rasch model: - - Rasch-Modell {n} -``` - -### Writing and Reading - -I have a simple todo file containing my tasks, that is basically always sitting open in a Vim session. For work I also use the todo file as a “done” file so that I can later check what tasks I finished on each day. - -For writing documents, letters and presentations I use [LaTeX][54] for its superior typesetting. A simple letter in German format can be set like this for example: - -``` -\documentclass[paper = a4, fromalign = right]{scrlttr2} -\usepackage{german} -\usepackage{eurosym} -\usepackage[utf8]{inputenc} -\setlength{\parskip}{6pt} -\setlength{\parindent}{0pt} - -\setkomavar{fromname}{Dennis Felsing} -\setkomavar{fromaddress}{Meine Str. 1\\69181 Leimen} -\setkomavar{subject}{Titel} - -\setkomavar*{enclseparator}{Anlagen} - -\makeatletter -\@setplength{refvpos}{89mm} -\makeatother - -\begin{document} -\begin{letter} {Herr Soundso\\Deine Str. 2\\69121 Heidelberg} -\opening{Sehr geehrter Herr Soundso,} - -Sie haben bei mir seit dem Bla Bla Bla. - -Ich fordere Sie hiermit zu Bla Bla Bla auf. - -\closing{Mit freundlichen Grüßen} - -\end{letter} -\end{document} -``` - -Further example documents and presentations can be found over at [my private site][55]. - -To read PDFs [Zathura][56] is fast, has Vim-like controls and even supports two different PDF backends: Poppler and MuPDF. [Evince][57] on the other hand is more full-featured for the cases where I encounter documents that Zathura doesn’t like. - -### Graphical Editing - -[GIMP][58] and [Inkscape][59] are easy choices for photo editing and interactive vector graphics respectively. - -In some cases [Imagemagick][60] is good enough though and can be used straight from the command line and thus automated to edit images. Similarly [Graphviz][61] and [TikZ][62] can be used to draw graphs and other diagrams. - -### Web Browsing - -As a web browser I’ve always used [Firefox][63] for its extensibility and low resource usage compared to Chrome. - -Unfortunately the [Pentadactyl][64] extension development stopped after Firefox switched to Chrome-style extensions entirely, so I don’t have satisfying Vim-like controls in my browser anymore. - -### Media Players - -[mpv][65] with hardware decoding allows watching videos at 5% CPU load using the `vo=gpu` and `hwdec=vaapi` config settings. `audio-channels=2` in mpv seems to give me clearer downmixing to my stereo speakers / headphones than what PulseAudio does by default. A great little feature is exiting with `Shift-Q` instead of just `Q` to save the playback location. When watching with someone with another native tongue you can use `--secondary-sid=` to show two subtitles at once, the primary at the bottom, the secondary at the top of the screen - -My wirelss mouse can easily be made into a remote control with mpv with a small `~/.config/mpv/input.conf`: - -``` -MOUSE_BTN5 run "mixer" "pcm" "-2" -MOUSE_BTN6 run "mixer" "pcm" "+2" -MOUSE_BTN1 cycle sub-visibility -MOUSE_BTN7 add chapter -1 -MOUSE_BTN8 add chapter 1 -``` - -[youtube-dl][66] works great for watching videos hosted online, best quality can be achieved with `-f bestvideo+bestaudio/best --all-subs --embed-subs`. - -As a music player [MOC][67] hasn’t been actively developed for a while, but it’s still a simple player that plays every format conceivable, including the strangest Chiptune formats. In the AUR there is a [patch][68] adding PulseAudio support as well. Even with the CPU clocked down to 800 MHz MOC barely uses 1-2% of a single CPU core. - -![moc][69] - -My music collection sits on my home server so that I can access it from anywhere. It is mounted using [SSHFS][70] and automount in the `/etc/fstab/`: - -``` -root@server:/media/media /mnt/media fuse.sshfs noauto,x-systemd.automount,idmap=user,IdentityFile=/root/.ssh/id_rsa,allow_other,reconnect 0 0 -``` - -### Cross-Platform Building - -Linux is great to build packages for any major operating system except Linux itself! In the beginning I used [QEMU][71] to with an old Debian, Windows and Mac OS X VM to build for these platforms. - -Nowadays I switched to using chroot for the old Debian distribution (for maximum Linux compatibility), [MinGW][72] to cross-compile for Windows and [OSXCross][73] to cross-compile for Mac OS X. - -The script used to [build DDNet][74] as well as the [instructions for updating library builds][75] are based on this. - -### Backups - -As usual, we nearly forgot about backups. Even if this is the last chapter, it should not be an afterthought. - -I wrote [rrb][76] (reverse rsync backup) 10 years ago to wrap rsync so that I only need to give the backup server root SSH rights to the computers that it is backing up. Surprisingly rrb needed 0 changes in the last 10 years, even though I kept using it the entire time. - -The backups are stored straight on the filesystem. Incremental backups are implemented using hard links (`--link-dest`). A simple [config][77] defines how long backups are kept, which defaults to: - -``` -KEEP_RULES=( \ - 7 7 \ # One backup a day for the last 7 days - 31 8 \ # 8 more backups for the last month - 365 11 \ # 11 more backups for the last year -1825 4 \ # 4 more backups for the last 5 years -) -``` - -Since some of my computers don’t have a static IP / DNS entry and I still want to back them up using rrb I use a reverse SSH tunnel (as a systemd service) for them: - -``` -[Unit] -Description=Reverse SSH Tunnel -After=network.target - -[Service] -ExecStart=/usr/bin/ssh -N -R 27276:localhost:22 -o "ExitOnForwardFailure yes" server -KillMode=process -Restart=always - -[Install] -WantedBy=multi-user.target -``` - -Now the server can reach the client through `ssh -p 27276 localhost` while the tunnel is running to perform the backup, or in `.ssh/config` format: - -``` -Host cr-remote - HostName localhost - Port 27276 -``` - -While talking about SSH hacks, sometimes a server is not easily reachable thanks to some bad routing. In that case you can route the SSH connection through another server to get better routing, in this case going through the USA to reach my Chinese server which had not been reliably reachable from Germany for a few weeks: - -``` -Host chn.ddnet.tw - ProxyCommand ssh -q usa.ddnet.tw nc -q0 chn.ddnet.tw 22 - Port 22 -``` - -### Final Remarks - -Thanks for reading my random collection of tools. I probably forgot many programs that I use so naturally every day that I don’t even think about them anymore. Let’s see how stable my software setup stays in the next years. If you have any questions, feel free to get in touch with me at [dennis@felsin9.de][78]. - -Comments on [Hacker News][79]. - --------------------------------------------------------------------------------- - -via: https://hookrace.net/blog/linux-desktop-setup/ - -作者:[Dennis Felsing][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: http://felsin9.de/nnis/ -[b]: https://github.com/lujun9972 -[1]: https://hookrace.net/public/linux-desktop/htop_small.png -[2]: https://hookrace.net/public/linux-desktop/htop.png -[3]: https://gentoo.org/ -[4]: https://www.archlinux.org/ -[5]: https://www.archlinux.org/news/ -[6]: https://www.reddit.com/r/archlinux/comments/4zrsc3/keep_your_system_fully_functional_after_a_kernel/ -[7]: https://www.suse.com/ -[8]: https://ddnet.tw/ -[9]: https://www.debian.org/ -[10]: https://www.openbsd.org/ -[11]: https://www.openbsd.org/faq/pf/ -[12]: http://openbox.org/wiki/Main_Page -[13]: http://fluxbox.org/ -[14]: https://dwm.suckless.org/ -[15]: https://awesomewm.org/ -[16]: https://xmonad.org/ -[17]: https://www.haskell.org/ -[18]: http://hackage.haskell.org/package/xmonad-contrib-0.15/docs/XMonad-Layout-LayoutScreens.html -[19]: http://robm.github.io/dzen/ -[20]: https://github.com/brndnmtthws/conky -[21]: https://hookrace.net/public/linux-desktop/laptop_small.png -[22]: https://hookrace.net/public/linux-desktop/laptop.png -[23]: https://i3wm.org/ -[24]: https://github.com/tmux/tmux/wiki -[25]: http://dtach.sourceforge.net/ -[26]: https://github.com/def-/tach/blob/master/tach -[27]: https://www.gnu.org/software/bash/ -[28]: http://www.zsh.org/ -[29]: http://software.schmorp.de/pkg/rxvt-unicode.html -[30]: http://terminus-font.sourceforge.net/ -[31]: https://www.vim.org/ -[32]: http://ctags.sourceforge.net/ -[33]: https://www.python.org/ -[34]: https://nim-lang.org/ -[35]: https://hisham.hm/htop/ -[36]: http://lm-sensors.org/ -[37]: https://01.org/powertop/ -[38]: https://dev.yorhel.nl/ncdu -[39]: https://nmap.org/ -[40]: https://www.tcpdump.org/ -[41]: https://www.wireshark.org/ -[42]: http://www.fetchmail.info/ -[43]: http://www.procmail.org/ -[44]: https://marlam.de/msmtp/ -[45]: https://www.cis.upenn.edu/~bcpierce/unison/ -[46]: https://rsync.samba.org/ -[47]: http://www.mutt.org/ -[48]: https://newsboat.org/ -[49]: https://irssi.org/ -[50]: https://www.roaringpenguin.com/products/remind -[51]: https://hookrace.net/public/linux-desktop/remcal.png -[52]: https://github.com/tsdh/rdictcc -[53]: https://www.dict.cc/ -[54]: https://www.latex-project.org/ -[55]: http://felsin9.de/nnis/research/ -[56]: https://pwmt.org/projects/zathura/ -[57]: https://wiki.gnome.org/Apps/Evince -[58]: https://www.gimp.org/ -[59]: https://inkscape.org/ -[60]: https://imagemagick.org/Usage/ -[61]: https://www.graphviz.org/ -[62]: https://sourceforge.net/projects/pgf/ -[63]: https://www.mozilla.org/en-US/firefox/new/ -[64]: https://github.com/5digits/dactyl -[65]: https://mpv.io/ -[66]: https://rg3.github.io/youtube-dl/ -[67]: http://moc.daper.net/ -[68]: https://aur.archlinux.org/packages/moc-pulse/ -[69]: https://hookrace.net/public/linux-desktop/moc.png -[70]: https://github.com/libfuse/sshfs -[71]: https://www.qemu.org/ -[72]: http://www.mingw.org/ -[73]: https://github.com/tpoechtrager/osxcross -[74]: https://github.com/ddnet/ddnet-scripts/blob/master/ddnet-release.sh -[75]: https://github.com/ddnet/ddnet-scripts/blob/master/ddnet-lib-update.sh -[76]: https://github.com/def-/rrb/blob/master/rrb -[77]: https://github.com/def-/rrb/blob/master/config.example -[78]: mailto:dennis@felsin9.de -[79]: https://news.ycombinator.com/item?id=18979731 diff --git a/sources/tech/20190116 GameHub - An Unified Library To Put All Games Under One Roof.md b/sources/tech/20190116 GameHub - An Unified Library To Put All Games Under One Roof.md deleted file mode 100644 index bdaae74b43..0000000000 --- a/sources/tech/20190116 GameHub - An Unified Library To Put All Games Under One Roof.md +++ /dev/null @@ -1,139 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (GameHub – An Unified Library To Put All Games Under One Roof) -[#]: via: (https://www.ostechnix.com/gamehub-an-unified-library-to-put-all-games-under-one-roof/) -[#]: author: (SK https://www.ostechnix.com/author/sk/) - -GameHub – An Unified Library To Put All Games Under One Roof -====== - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/gamehub-720x340.png) - -**GameHub** is an unified gaming library that allows you to view, install, run and remove games on GNU/Linux operating system. It supports both native and non-native games from various sources including Steam, GOG, Humble Bundle, and Humble Trove etc. The non-native games are supported by [Wine][1], Proton, [DOSBox][2], ScummVM and RetroArch. It also allows you to add custom emulators and download bonus content and DLCs for GOG games. Simply put, Gamehub is a frontend for Steam/GoG/Humblebundle/Retroarch. It can use steam technologies like Proton to run windows gog games. GameHub is free, open source gaming platform written in **Vala** using **GTK+3**. If you’re looking for a way to manage all games under one roof, GameHub might be a good choice. - -### Installing GameHub - -The author of GameHub has designed it specifically for elementary OS. So, you can install it on Debian, Ubuntu, elementary OS and other Ubuntu-derivatives using GameHub PPA. - -``` -$ sudo apt install --no-install-recommends software-properties-common -$ sudo add-apt-repository ppa:tkashkin/gamehub -$ sudo apt update -$ sudo apt install com.github.tkashkin.gamehub -``` - -GameHub is available in [**AUR**][3], so just install it on Arch Linux and its variants using any AUR helpers, for example [**YaY**][4]. - -``` -$ yay -S gamehub-git -``` - -It is also available as **AppImage** and **Flatpak** packages in [**releases page**][5]. - -If you prefer AppImage package, do the following: - -``` -$ wget https://github.com/tkashkin/GameHub/releases/download/0.12.1-91-dev/GameHub-bionic-0.12.1-91-dev-cd55bb5-x86_64.AppImage -O gamehub -``` - -Make it executable: - -``` -$ chmod +x gamehub -``` - -And, run GameHub using command: - -``` -$ ./gamehub -``` - -If you want to use Flatpak installer, run the following commands one by one. - -``` -$ git clone https://github.com/tkashkin/GameHub.git -$ cd GameHub -$ scripts/build.sh build_flatpak -``` - -### Put All Games Under One Roof - -Launch GameHub from menu or application launcher. At first launch, you will see the following welcome screen. - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/gamehub1.png) - -As you can see in the above screenshot, you need to login to the given sources namely Steam, GoG or Humble Bundle. If you don’t have Steam client on your Linux system, you need to install it first to access your steam account. For GoG and Humble bundle sources, click on the icon to log in to the respective source. - -Once you logged in to your account(s), all games from the all sources can be visible on GameHub dashboard. - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/gamehub2.png) - -You will see list of logged-in sources on the top left corner. To view the games from each source, just click on the respective icon. - -You can also switch between list view or grid view, sort the games by applying the filters and search games from the list in GameHub dashboard. - -#### Installing a game - -Click on the game of your choice from the list and click Install button. If the game is non-native, GameHub will automatically choose the compatibility layer (E.g Wine) that suits to run the game and install the selected game. As you see in the below screenshot, Indiana Jones game is not available for Linux platform. - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/gamehub3-1.png) - -If it is a native game (i.e supports Linux), simply press the Install button. - -![][7] - -If you don’t want to install the game, just hit the **Download** button to save it in your games directory. It is also possible to add locally installed games to GameHub using the **Import** option. - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/gamehub5.png) - -#### GameHub Settings - -GameHub Settings window can be launched by clicking on the four straight lines on top right corner. - -From Settings section, we can enable, disable and set various settings such as, - - * Switch between light/dark themes. - * Use Symbolic icons instead of colored icons for games. - * Switch to compact list. - * Enable/disable merging games from different sources. - * Enable/disable compatibility layers. - * Set games collection directory. The default directory for storing the collection is **$HOME/Games/_Collection**. - * Set games directories for each source. - * Add/remove emulators, - * And many. - - - -For more details, refer the project links given at the end of this guide. - -**Related read:** - -And, that’s all for now. Hope this helps. I will be soon here with another guide. Until then, stay tuned with OSTechNix. - -Cheers! - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/gamehub-an-unified-library-to-put-all-games-under-one-roof/ - -作者:[SK][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/run-windows-games-softwares-ubuntu-16-04/ -[2]: https://www.ostechnix.com/how-to-run-ms-dos-games-and-programs-in-linux/ -[3]: https://aur.archlinux.org/packages/gamehub-git/ -[4]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ -[5]: https://github.com/tkashkin/GameHub/releases -[6]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[7]: http://www.ostechnix.com/wp-content/uploads/2019/01/gamehub4.png diff --git a/sources/tech/20190117 Pyvoc - A Command line Dictionary And Vocabulary Building Tool.md b/sources/tech/20190117 Pyvoc - A Command line Dictionary And Vocabulary Building Tool.md deleted file mode 100644 index b0aa45d618..0000000000 --- a/sources/tech/20190117 Pyvoc - A Command line Dictionary And Vocabulary Building Tool.md +++ /dev/null @@ -1,239 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Pyvoc – A Command line Dictionary And Vocabulary Building Tool) -[#]: via: (https://www.ostechnix.com/pyvoc-a-command-line-dictionary-and-vocabulary-building-tool/) -[#]: author: (SK https://www.ostechnix.com/author/sk/) - -Pyvoc – A Command line Dictionary And Vocabulary Building Tool -====== - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/pyvoc-720x340.jpg) - -Howdy! I have a good news for non-native English speakers. Now, you can improve your English vocabulary and find the meaning of English words, right from your Terminal. Say hello to **Pyvoc** , a cross-platform, open source, command line dictionary and vocabulary building tool written in **Python** programming language. Using this tool, you can brush up some English words meanings, test or improve your vocabulary skill or simply use it as a CLI dictionary on Unix-like operating systems. - -### Installing Pyvoc - -Since Pyvoc is written using Python language, you can install it using [**Pip3**][1] package manager. - -``` -$ pip3 install pyvoc -``` - -Once installed, run the following command to automatically create necessary configuration files in your $HOME directory. - -``` -$ pyvoc word -``` - -Sample output: - -``` -|Creating necessary config files -/getting api keys. please handle with care! -| - -word -Noun: single meaningful element of speech or writing -example: I don't like the word ‘unofficial’ - -Verb: express something spoken or written -example: he words his request in a particularly ironic way - -Interjection: used to express agreement or affirmation -example: Word, that's a good record, man -``` - -Done! Let us go ahead and brush the English skills. - -### Use Pyvoc as a command line Dictionary tool - -Pyvoc fetches the word meaning from **Oxford Dictionary API**. - -Let us say, you want to find the meaning of a word **‘digression’**. To do so, run: - -``` -$ pyvoc digression -``` - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/pyvoc1.png) - -See? Pyvoc not only displays the meaning of word **‘digression’** , but also an example sentence which shows how to use that word in practical. - -Let us see an another example. - -``` -$ pyvoc subterfuge -| - -subterfuge -Noun: deceit used in order to achieve one's goal -example: he had to use subterfuge and bluff on many occasions -``` - -It also shows the word classes as well. As you already know, English has four major **word classes** : - - 1. Nouns, - - 2. Verbs, - - 3. Adjectives, - - 4. Adverbs. - - - - -Take a look at the following example. - -``` -$ pyvoc welcome - / - -welcome -Noun: instance or manner of greeting someone -example: you will receive a warm welcome - -Interjection: used to greet someone in polite or friendly way -example: welcome to the Wildlife Park - -Verb: greet someone arriving in polite or friendly way -example: hotels should welcome guests in their own language - -Adjective: gladly received -example: I'm pleased to see you, lad—you're welcome -``` - -As you see in the above output, the word ‘welcome’ can be used as a verb, noun, adjective and interjection. Pyvoc has given example for each class. - -If you misspell a word, it will inform you to check the spelling of the given word. - -``` -$ pyvoc wlecome -\ -No definition found. Please check the spelling!! -``` - -Useful, isn’t it? - -### Create vocabulary groups - -A vocabulary group is nothing but a collection words added by the user. You can later revise or take quiz from these groups. 100 groups of 60 words are **reserved** for the user. - -To add a word (E.g **sporadic** ) to a group, just run: - -``` -$ pyvoc sporadic -a -- - -sporadic -Adjective: occurring at irregular intervals or only in few places -example: sporadic fighting broke out - - -writing to vocabulary group... -word added to group number 51 -``` - -As you can see, I didn’t provide any group number and pyvoc displayed the meaning of given word and automatically added that word to group number **51**. If you don’t provide the group number, Pyvoc will **incrementally add words** to groups **51-100**. - -Pyvoc also allows you to specify a group number if you want to. You can specify a group from 1-50 using **-g** option. For example, I am going to add a word to Vocabulary group 20 using the following command. - -``` -$ pyvoc discrete -a -g 20 - / - -discrete -Adjective: individually separate and distinct -example: speech sounds are produced as a continuous sound signal rather - than discrete units - -creating group Number 20... -writing to vocabulary group... -word added to group number 20 -``` - -See? The above command displays the meaning of ‘discrete’ word and adds it to the vocabulary group 20. If the group doesn’t exists, Pyvoc will create it and add the word. - -By default, Pyvoc includes three predefined vocabulary groups (101, 102, and 103). These custom groups has 800 words of each. All words in these groups are taken from **GRE** and **SAT** preparation websites. - -To view the user-generated groups, simply run: - -``` -$ pyvoc word -l - - - -word -Noun: single meaningful element of speech or writing -example: I don't like the word ‘unofficial’ - -Verb: express something spoken or written -example: he words his request in a particularly ironic way - -Interjection: used to express agreement or affirmation -example: Word, that's a good record, man - - -USER GROUPS -Group no. No. of words -20 1 - -DEFAULT GROUP -Group no. No. of words -51 1 -``` -``` - -``` - -As you see, I have created one group (20) including the default group (51). - -### Test and improve English vocabulary - -As I already said, you can use the Vocabulary groups to revise or take quiz from them. - -For instance, to revise the group no. **101** , use **-r** option like below. - -``` -$ pyvoc 101 -r -``` - -You can now revise the meaning of all words in the Vocabulary group 101 in random order. Just hit ENTER to go through next questions. Once done, hit **CTRL+C** to exit. - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/pyvoc2-1.png) - -Also, you take quiz from the existing groups to brush up your vocabulary. To do so, use **-q** option like below. - -``` -$ pyvoc 103 -q 50 -``` - -This command allows you to take quiz of 50 questions from vocabulary group 103. Choose the correct answer from the list by entering the appropriate number. You will get 1 point for every correct answer. The more you score the more your vocabulary skill will be. - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/pyvoc3.png) - -Pyvoc is in the early-development stage. I hope the developer will improve it and add more features in the days to come. - -As a non-native English speaker, I personally find it useful to test and learn new word meanings in my free time. If you’re a heavy command line user and wanted to quickly check the meaning of a word, Pyvoc is the right tool. You can also test your English Vocabulary at your free time to memorize and improve your English language skill. Give it a try. You won’t be disappointed. - -And, that’s all for now. Hope this was useful. More good stuffs to come. Stay tuned! - -Cheers! - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/pyvoc-a-command-line-dictionary-and-vocabulary-building-tool/ - -作者:[SK][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/manage-python-packages-using-pip/ diff --git a/sources/tech/20190121 How to Resize OpenStack Instance (Virtual Machine) from Command line.md b/sources/tech/20190121 How to Resize OpenStack Instance (Virtual Machine) from Command line.md deleted file mode 100644 index e235cabdbf..0000000000 --- a/sources/tech/20190121 How to Resize OpenStack Instance (Virtual Machine) from Command line.md +++ /dev/null @@ -1,149 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Resize OpenStack Instance (Virtual Machine) from Command line) -[#]: via: (https://www.linuxtechi.com/resize-openstack-instance-command-line/) -[#]: author: (Pradeep Kumar http://www.linuxtechi.com/author/pradeep/) - -How to Resize OpenStack Instance (Virtual Machine) from Command line -====== - -Being a Cloud administrator, resizing or changing resources of an instance or virtual machine is one of the most common tasks. - -![](https://www.linuxtechi.com/wp-content/uploads/2019/01/Resize-openstack-instance.jpg) - -In Openstack environment, there are some scenarios where cloud user has spin a vm using some flavor( like m1.smalll) where root partition disk size is 20 GB, but at some point of time user wants to extends the root partition size to 40 GB. So resizing of vm’s root partition can be accomplished by using the resize option in nova command. During the resize, we need to specify the new flavor that will include disk size as 40 GB. - -**Note:** Once you extend the instance resources like RAM, CPU and disk using resize option in openstack then you can’t reduce it. - -**Read More on** : [**How to Create and Delete Virtual Machine(VM) from Command line in OpenStack**][1] - -In this tutorial I will demonstrate how to resize an openstack instance from command line. Let’s assume I have an existing instance named “ **test_resize_vm** ” and it’s associated flavor is “m1.small” and root partition disk size is 20 GB. - -Execute the below command from controller node to check on which compute host our vm “test_resize_vm” is provisioned and its flavor details - -``` -:~# openstack server show test_resize_vm | grep -E "flavor|hypervisor" -| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute-57    | -| flavor                               | m1.small (2)  | -:~# -``` - -Login to VM as well and check the root partition size, - -``` -[[email protected] ~]# df -Th -Filesystem     Type      Size  Used Avail Use% Mounted on -/dev/vda1      xfs        20G  885M   20G   5% / -devtmpfs       devtmpfs  900M     0  900M   0% /dev -tmpfs          tmpfs     920M     0  920M   0% /dev/shm -tmpfs          tmpfs     920M  8.4M  912M   1% /run -tmpfs          tmpfs     920M     0  920M   0% /sys/fs/cgroup -tmpfs          tmpfs     184M     0  184M   0% /run/user/1000 -[[email protected] ~]# echo "test file for resize operation" > demofile -[[email protected] ~]# cat demofile -test file for resize operation -[[email protected] ~]# -``` - -Get the available flavor list using below command, - -``` -:~# openstack flavor list -+--------------------------------------|-----------------|-------|------|-----------|-------|-----------+ -| ID                                   | Name            |   RAM | Disk | Ephemeral | VCPUs | Is Public | -+--------------------------------------|-----------------|-------|------|-----------|-------|-----------+ -| 2                                    | m1.small        |  2048 |   20 |         0 |     1 | True      | -| 3                                    | m1.medium       |  4096 |   40 |         0 |     2 | True      | -| 4                                    | m1.large        |  8192 |   80 |         0 |     4 | True      | -| 5                                    | m1.xlarge       | 16384 |  160 |         0 |     8 | True      | -+--------------------------------------|-----------------|-------|------|-----------|-------|-----------+ -``` - -So we will be using the flavor “m1.medium” for resize operation, Run the beneath nova command to resize “test_resize_vm”, - -Syntax: # nova resize {VM_Name} {flavor_id} —poll - -``` -:~# nova resize test_resize_vm 3 --poll -Server resizing... 100% complete -Finished -:~# -``` - -Now confirm the resize operation using “ **openstack server –confirm”** command, - -``` -~# openstack server list | grep -i test_resize_vm -| 1d56f37f-94bd-4eef-9ff7-3dccb4682ce0 | test_resize_vm | VERIFY_RESIZE |private-net=10.20.10.51                                  | -:~# -``` - -As we can see in the above command output the current status of the vm is “ **verify_resize** “, execute below command to confirm resize, - -``` -~# openstack server resize --confirm 1d56f37f-94bd-4eef-9ff7-3dccb4682ce0 -~# -``` - -After the resize confirmation, status of VM will become active, now re-verify hypervisor and flavor details for the vm - -``` -:~# openstack server show test_resize_vm | grep -E "flavor|hypervisor" -| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute-58   | -| flavor                               | m1.medium (3)| -``` - -Login to your VM now and verify the root partition size - -``` -[[email protected] ~]# df -Th -Filesystem     Type      Size  Used Avail Use% Mounted on -/dev/vda1      xfs        40G  887M   40G   3% / -devtmpfs       devtmpfs  1.9G     0  1.9G   0% /dev -tmpfs          tmpfs     1.9G     0  1.9G   0% /dev/shm -tmpfs          tmpfs     1.9G  8.4M  1.9G   1% /run -tmpfs          tmpfs     1.9G     0  1.9G   0% /sys/fs/cgroup -tmpfs          tmpfs     380M     0  380M   0% /run/user/1000 -[[email protected] ~]# cat demofile -test file for resize operation -[[email protected] ~]# -``` - -This confirm that VM root partition has been resized successfully. - -**Note:** Due to some reason if resize operation was not successful and you want to revert the vm back to previous state, then run the following command, - -``` -# openstack server resize --revert {instance_uuid} -``` - -If have noticed “ **openstack server show** ” commands output, VM is migrated from compute-57 to compute-58 after resize. This is the default behavior of “nova resize” command ( i.e nova resize command will migrate the instance to another compute & then resize it based on the flavor details) - -In case if you have only one compute node then nova resize will not work, but we can make it work by changing the below parameter in nova.conf file on compute node, - -Login to compute node, verify the parameter value - -If “ **allow_resize_to_same_host** ” is set as False then change it to True and restart the nova compute service. - -**Read More on** [**OpenStack Deployment using Devstack on CentOS 7 / RHEL 7 System**][2] - -That’s all from this tutorial, in case it helps you technically then please do share your feedback and comments. - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/resize-openstack-instance-command-line/ - -作者:[Pradeep Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: http://www.linuxtechi.com/author/pradeep/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/create-delete-virtual-machine-command-line-openstack/ -[2]: https://www.linuxtechi.com/openstack-deployment-devstack-centos-7-rhel-7/ diff --git a/sources/tech/20190123 Dockter- A container image builder for researchers.md b/sources/tech/20190123 Dockter- A container image builder for researchers.md deleted file mode 100644 index 359d0c1d1e..0000000000 --- a/sources/tech/20190123 Dockter- A container image builder for researchers.md +++ /dev/null @@ -1,121 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Dockter: A container image builder for researchers) -[#]: via: (https://opensource.com/article/19/1/dockter-image-builder-researchers) -[#]: author: (Nokome Bentley https://opensource.com/users/nokome) - -Dockter: A container image builder for researchers -====== -Dockter supports the specific requirements of researchers doing data analysis, including those using R. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/building_skyscaper_organization.jpg?itok=Ir5epxm8) - -Dependency hell is ubiquitous in the world of software for research, and this affects research transparency and reproducibility. Containerization is one solution to this problem, but it creates new challenges for researchers. Docker is gaining popularity in the research community—but using it efficiently requires solid Dockerfile writing skills. - -As a part of the [Stencila][1] project, which is a platform for creating, collaborating on, and sharing data-driven content, we are developing [Dockter][2], an open source tool that makes it easier for researchers to create Docker images for their projects. Dockter scans a research project's source code, generates a Dockerfile, and builds a Docker image. It has a range of features that allow flexibility and can help researchers learn more about working with Docker. - -Dockter also generates a JSON file with information about the software environment (based on [CodeMeta][3] and [Schema.org][4]) to enable further processing and interoperability with other tools. - -Several other projects create Docker images from source code and/or requirements files, including: [alibaba/derrick][5], [jupyter/repo2docker][6], [Gueils/whales][7], [o2r-project/containerit][8]; [openshift/source-to-image][9], and [ViDA-NYU/reprozip][10]. Dockter is similar to repo2docker, containerit, and ReproZip in that it is aimed at researchers doing data analysis (and supports R), whereas most other tools are aimed at software developers (and don't support R). - -Dockter differs from these projects principally in that it: - - * Performs static code analysis for multiple languages to determine package requirements - * Uses package databases to determine package system dependencies and generate linked metadata (containerit does this for R) - * Installs language package dependencies quicker (which can be useful during research projects where dependencies often change) - * By default but optionally, installs Stencila packages so that Stencila client interfaces can execute code in the container - - - -### Dockter's features - -Following are some of the ways researchers can use Dockter. - -#### Generating Docker images from code - -Dockter scans a research project folder and builds a Docker image for it. If the folder already has a Dockerfile, Dockter will build the image from that. If not, Dockter will scan the source code files in the folder and generate one. Dockter currently handles R, Python, and Node.js source code. The .dockerfile (with the dot at the beginning) it generates is fully editable so users can take over from Dockter and carry on with editing the file as they see fit. - -If the folder contains an R package [DESCRIPTION][11] file, Dockter will install the R packages listed under Imports into the image. If the folder does not contain a DESCRIPTION file, Dockter will scan all the R files in the folder for package import or usage statements and create a .DESCRIPTION file. - -If the folder contains a [requirements.txt][12] file for Python, Dockter will copy it into the Docker image and use [pip][13] to install the specified packages. If the folder does not contain either of those files, Dockter will scan all the folder's .py files for import statements and create a .requirements.txt file. - -If the folder contains a [package.json][14] file, Dockter will copy it into the Docker image and use npm to install the specified packages. If the folder does not contain a package.json file, Dockter will scan all the folder's .js files for require calls and create a .package.json file. - -#### Capturing system requirements automatically - -One of the headaches researchers face when hand-writing Dockerfiles is figuring out which system dependencies their project needs. Often this involves a lot of trial and error. Dockter automatically checks if any dependencies (or dependencies of dependencies, or dependencies of…) require system packages and installs those into the image. No more trial and error cycles of build, fail, add dependency, repeat… - -#### Reinstalling language packages faster - -If you have ever built a Docker image, you know it can be frustrating waiting for all your project's dependencies to reinstall when you add or remove just one. - -This happens because of Docker's layered filesystem: When you update a requirements file, Docker throws away all the subsequent layers—including the one where you previously installed your dependencies. That means all the packages have to be reinstalled. - -Dockter takes a different approach. It leaves the installation of language packages to the language package managers: Python's pip, Node.js's npm, and R's install.packages. These package managers are good at the job they were designed for: checking which packages need to be updated and updating only them. The result is much faster rebuilds, especially for R packages, which often involve compilation. - -Dockter does this by looking for a special **# dockter** comment in a Dockerfile. Instead of throwing away layers, it executes all instructions after this comment in the same layer—thereby reusing packages that were previously installed. - -#### Generating structured metadata for a project - -Dockter uses [JSON-LD][15] as its internal data structure. When it parses a project's source code, it generates a JSON-LD tree using vocabularies from schema.org and CodeMeta. - -Dockter also fetches metadata on a project's dependencies, which could be used to generate a complete software citation for the project. - -### Easy to pick up, easy to throw away - -Dockter is designed to make it easier to get started creating Docker images for your project. But it's also designed to not get in your way or restrict you from using bare Docker. You can easily and individually override any of the steps Dockter takes to build an image. - - * **Code analysis:** To stop Dockter from doing code analysis and specify your project's package dependencies, just remove the leading **.** (dot) from the .DESCRIPTION, .requirements.txt, or .package.json files. - - * **Dockerfile generation:** Dockter aims to generate readable Dockerfiles that conform to best practices. They include comments on what each section does and are a good way to start learning how to write your own Dockerfiles. To stop Dockter from generating a .Dockerfile and start editing it yourself, just rename it Dockerfile (without the leading dot). - - - - -### Install Dockter - -[Dockter is available][16] as pre-compiled, standalone command line tool or as a Node.js package. Click [here][17] for a demo. - -We welcome and encourage all [contributions][18]! - -A longer version of this article is available on the project's [GitHub page][19]. - -Aleksandra Pawlik will present [Building reproducible computing environments: a workshop for non-experts][20] at [linux.conf.au][21], January 21-25 in Christchurch, New Zealand. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/1/dockter-image-builder-researchers - -作者:[Nokome Bentley][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/nokome -[b]: https://github.com/lujun9972 -[1]: https://stenci.la/ -[2]: https://stencila.github.io/dockter/ -[3]: https://codemeta.github.io/index.html -[4]: http://Schema.org -[5]: https://github.com/alibaba/derrick -[6]: https://github.com/jupyter/repo2docker -[7]: https://github.com/Gueils/whales -[8]: https://github.com/o2r-project/containerit -[9]: https://github.com/openshift/source-to-image -[10]: https://github.com/ViDA-NYU/reprozip -[11]: http://r-pkgs.had.co.nz/description.html -[12]: https://pip.readthedocs.io/en/1.1/requirements.html -[13]: https://pypi.org/project/pip/ -[14]: https://docs.npmjs.com/files/package.json -[15]: https://json-ld.org/ -[16]: https://github.com/stencila/dockter/releases/ -[17]: https://asciinema.org/a/pOHpxUqIVkGdA1dqu7bENyxZk?size=medium&cols=120&autoplay=1 -[18]: https://github.com/stencila/dockter/blob/master/CONTRIBUTING.md -[19]: https://github.com/stencila/dockter -[20]: https://2019.linux.conf.au/schedule/presentation/185/ -[21]: https://linux.conf.au/ diff --git a/sources/tech/20190123 GStreamer WebRTC- A flexible solution to web-based media.md b/sources/tech/20190123 GStreamer WebRTC- A flexible solution to web-based media.md deleted file mode 100644 index bb7e129ff3..0000000000 --- a/sources/tech/20190123 GStreamer WebRTC- A flexible solution to web-based media.md +++ /dev/null @@ -1,108 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (GStreamer WebRTC: A flexible solution to web-based media) -[#]: via: (https://opensource.com/article/19/1/gstreamer) -[#]: author: (Nirbheek Chauhan https://opensource.com/users/nirbheek) - -GStreamer WebRTC: A flexible solution to web-based media -====== -GStreamer's WebRTC implementation eliminates some of the shortcomings of using WebRTC in native apps, server applications, and IoT devices. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=RPkPPtDe) - -Currently, [WebRTC.org][1] is the most popular and feature-rich WebRTC implementation. It is used in Chrome and Firefox and works well for browsers, but the Native API and implementation have several shortcomings that make it a less-than-ideal choice for uses outside of browsers, including native apps, server applications, and internet of things (IoT) devices. - -Last year, our company ([Centricular][2]) made an independent implementation of a Native WebRTC API available in GStreamer 1.14. This implementation is much easier to use and more flexible than the WebRTC.org Native API, is transparently compatible with WebRTC.org, has been tested with all browsers, and is already in production use. - -### What are GStreamer and WebRTC? - -[GStreamer][3] is an open source, cross-platform multimedia framework and one of the easiest and most flexible ways to implement any application that needs to play, record, or transform media-like data across a diverse scale of devices and products, including embedded (IoT, in-vehicle infotainment, phones, TVs, etc.), desktop (video/music players, video recording, non-linear editing, video conferencing, [VoIP][4] clients, browsers, etc.), servers (encode/transcode farms, video/voice conferencing servers, etc.), and [more][5]. - -The main feature that makes GStreamer the go-to multimedia framework for many people is its pipeline-based model, which solves one of the hardest problems in API design: catering to applications of varying complexity; from the simplest one-liners and quick solutions to those that need several hundreds of thousands of lines of code to implement their full feature set. If you want to learn how to use GStreamer, [Jan Schmidt's tutorial][6] from [LCA 2018][7] is a good place to start. - -[WebRTC][8] is a set of draft specifications that build upon existing [RTP][9], [RTCP][10], [SDP][11], [DTLS][12], [ICE][13], and other real-time communication (RTC) specifications and define an API for making them accessible using browser JavaScript (JS) APIs. - -People have been doing real-time communication over [IP][14] for [decades][15] with the protocols WebRTC builds upon. WebRTC's real innovation was creating a bridge between native applications and web apps by defining a standard yet flexible API that browsers can expose to untrusted JavaScript code. - -These specifications are [constantly being improved][16], which, combined with the ubiquitous nature of browsers, means WebRTC is fast becoming the standard choice for video conferencing on all platforms and for most applications. - -### **Everything is great, let's build amazing apps!** - -Not so fast, there's more to the story! For web apps, the [PeerConnection API][17] is [everywhere][18]. There are some browser-specific quirks, and the API keeps changing, but the [WebRTC JS adapter][19] handles most of that. Overall, the web app experience is mostly 👍. - -Unfortunately, for native code or applications that need more flexibility than a sandboxed JavaScript app can achieve, there haven't been a lot of great options. - -[Libwebrtc][20] (Google's implementation), [Janus][21], [Kurento][22], and [OpenWebRTC][23] have traditionally been the main contenders, but each implementation has its own inflexibilities, shortcomings, and constraints. - -Libwebrtc is still the most mature implementation, but it is also the most difficult to work with. Since it's embedded inside Chrome, it's a moving target and the project [is quite difficult to build and integrate][24]. These are all obstacles for native or server app developers trying to quickly prototype and experiment with things. - -Also, WebRTC was not built for multimedia, so the lower layers get in the way of non-browser use cases and applications. It is quite painful to do anything other than the default "set raw media, transmit" and "receive from remote, get raw media." This means if you want to use your own filters or hardware-specific codecs or sinks/sources, you end up having to fork libwebrtc. - -[**OpenWebRTC**][23] by Ericsson was the first attempt to rectify this situation. It was built on top of GStreamer. Its target audience was app developers, and it fit the bill quite well as a proof of concept—even though it used a custom API and some of the architectural decisions made it quite inflexible for most other uses. However, after an initial flurry of activity around the project, momentum petered out, the project failed to gather a community, and it is now effectively dead. Full disclosure: Centricular worked with Ericsson to polish some of the rough edges around the project immediately prior to its public release. - -### WebRTC in GStreamer - -GStreamer's WebRTC implementation gives you full control, as it does with any other [GStreamer pipeline][25]. - -As we said, the WebRTC standards build upon existing standards and protocols that serve similar purposes. GStreamer has supported almost all of them for a while now because they were being used for real-time communication, live streaming, and many other IP-based applications. This led Ericsson to choose GStreamer as the base for its OpenWebRTC project. - -Combined with the [SRTP][26] and DTLS plugins that were written during OpenWebRTC's development, it means that the implementation is built upon a solid and well-tested base, and implementing WebRTC features does not involve as much code-from-scratch work as one might presume. However, WebRTC is a large collection of standards, and reaching feature-parity with libwebrtc is an ongoing task. - -Due to decisions made while architecting WebRTCbin's internals, the API follows the PeerConnection specification quite closely. Therefore, almost all its missing features involve writing code that would plug into clearly defined sockets. For instance, since the GStreamer 1.14 release, the following features have been added to the WebRTC implementation and will be available in the next release of the GStreamer WebRTC: - - * Forward error correction - * RTP retransmission (RTX) - * RTP BUNDLE - * Data channels over SCTP - - - -We believe GStreamer's API is the most flexible, versatile, and easy to use WebRTC implementation out there, and it will only get better as time goes by. Bringing the power of pipeline-based multimedia manipulation to WebRTC opens new doors for interesting, unique, and highly efficient applications. If you'd like to demo the technology and play with the code, build and run [these demos][27], which include C, Rust, Python, and C# examples. - -Matthew Waters will present [GStreamer WebRTC—The flexible solution to web-based media][28] at [linux.conf.au][29], January 21-25 in Christchurch, New Zealand. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/1/gstreamer - -作者:[Nirbheek Chauhan][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/nirbheek -[b]: https://github.com/lujun9972 -[1]: http://webrtc.org/ -[2]: https://www.centricular.com/ -[3]: https://gstreamer.freedesktop.org/documentation/application-development/introduction/gstreamer.html -[4]: https://en.wikipedia.org/wiki/Voice_over_IP -[5]: https://wiki.ligo.org/DASWG/GstLAL -[6]: https://www.youtube.com/watch?v=ZphadMGufY8 -[7]: http://lca2018.linux.org.au/ -[8]: https://en.wikipedia.org/wiki/WebRTC -[9]: https://en.wikipedia.org/wiki/Real-time_Transport_Protocol -[10]: https://en.wikipedia.org/wiki/RTP_Control_Protocol -[11]: https://en.wikipedia.org/wiki/Session_Description_Protocol -[12]: https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security -[13]: https://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment -[14]: https://en.wikipedia.org/wiki/Internet_Protocol -[15]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol -[16]: https://datatracker.ietf.org/wg/rtcweb/documents/ -[17]: https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection -[18]: https://caniuse.com/#feat=rtcpeerconnection -[19]: https://github.com/webrtc/adapter -[20]: https://github.com/aisouard/libwebrtc -[21]: https://janus.conf.meetecho.com/ -[22]: https://www.kurento.org/kurento-architecture -[23]: https://en.wikipedia.org/wiki/OpenWebRTC -[24]: https://webrtchacks.com/building-webrtc-from-source/ -[25]: https://gstreamer.freedesktop.org/documentation/application-development/introduction/basics.html -[26]: https://en.wikipedia.org/wiki/Secure_Real-time_Transport_Protocol -[27]: https://github.com/centricular/gstwebrtc-demos/ -[28]: https://linux.conf.au/schedule/presentation/143/ -[29]: https://linux.conf.au/ diff --git a/sources/tech/20190124 Orpie- A command-line reverse Polish notation calculator.md b/sources/tech/20190124 Orpie- A command-line reverse Polish notation calculator.md deleted file mode 100644 index 10e666f625..0000000000 --- a/sources/tech/20190124 Orpie- A command-line reverse Polish notation calculator.md +++ /dev/null @@ -1,128 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Orpie: A command-line reverse Polish notation calculator) -[#]: via: (https://opensource.com/article/19/1/orpie) -[#]: author: (Peter Faller https://opensource.com/users/peterfaller) - -Orpie: A command-line reverse Polish notation calculator -====== -Orpie is a scientific calculator that functions much like early, well-loved HP calculators. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calculator_money_currency_financial_tool.jpg?itok=2QMa1y8c) -Orpie is a text-mode [reverse Polish notation][1] (RPN) calculator for the Linux console. It works very much like the early, well-loved Hewlett-Packard calculators. - -### Installing Orpie - -RPM and DEB packages are available for most distributions, so installation is just a matter of using either: - -``` -$ sudo apt install orpie -``` - -or - -``` -$ sudo yum install orpie -``` - -Orpie has a comprehensive man page; new users may want to have it open in another terminal window as they get started. Orpie can be customized for each user by editing the **~/.orpierc** configuration file. The [orpierc(5)][2] man page describes the contents of this file, and **/etc/orpierc** describes the default configuration. - -### Starting up - -Start Orpie by typing **orpie** at the command line. The main screen shows context-sensitive help on the left and the stack on the right. The cursor, where you enter numbers you want to calculate, is at the bottom-right corner. - -![](https://opensource.com/sites/default/files/uploads/orpie_start.png) - -### Example calculation - -For a simple example, let's calculate the factorial of **5 (2 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 3 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 5)**. First the long way: - -| Keys | Result | -| --------- | --------- | -| 2 | Push 2 onto the stack | -| 3 | Push 3 onto the stack | -| * | Multiply to get 6 | -| 4 | Push 4 onto the stack | -| * | Multiply to get 24 | -| 5 | Push 5 onto the stack | -| * | Multiply to get 120 | - -Note that the multiplication happens as soon as you type *****. If you hit **< enter>** after ***** , Orpie will duplicate the value at position 1 on the stack. (If this happens, you can drop the duplicate with **\**.) - -Equivalent sequences are: - -| Keys | Result | -| ------------- | ------------- | -| 2 3 * 4 * 5 * | Faster! | -| 2 3 4 5 * * * | Same result | -| 5 ' fact | Fastest: Use the built-in function | - -Observe that when you enter **'** , the left pane changes to show matching functions as you type. In the example above, typing **fa** is enough to get the **fact** function. Orpie offers many functions—experiment by typing **'** and a few letters to see what's available. - -![](https://opensource.com/sites/default/files/uploads/orpie_functions.png) - -Note that each operation replaces one or more values on the stack. If you want to store the value at position 1 in the stack, key in (for example) **@factot ** and **S'**. To retrieve the value, key in (for example) **@factot ** then **;** (if you want to see it; otherwise just leave **@factot** as the value for the next calculation). - -### Constants and units - -Orpie understands units and predefines many useful scientific constants. For example, to calculate the energy in a blue light photon at 400nm, calculate **E=hc/(400nm)**. The key sequences are: - -| Keys | Result | -| -------------- | -------------- | -| C c | Get the speed of light in m/s | -| C h | Get Planck's constant in Js | -| * | Calculate h*c | -| 400 9 n _ m | Input 4 _ 10^-9 m | -| / | Do the division and get the result: 4.966 _ 10^-19 J | - -Like choosing functions after typing **'** , typing **C** shows matching constants based on what you type. - -![](https://opensource.com/sites/default/files/uploads/orpie_constants.png) - -### Matrices - -Orpie can also do operations with matrices. For example, to multiply two 2x2 matrices: - -| Keys | Result | -| -------- | -------- | -| [ 1 , 2 [ 3 , 4 | Stack contains the matrix [[ 1, 2 ][ 3, 4 ]] | -| [ 1 , 0 [ 1 , 1 | Push the multiplier matrix onto the stack | -| * | The result is: [[ 3, 2 ][ 7, 4 ]] | - -Note that the **]** characters are automatically inserted—entering **[** starts a new row. - -### Complex numbers - -Orpie can also calculate with complex numbers. They can be entered or displayed in either polar or rectangular form. You can toggle between the polar and rectangular display using the **p** key, and between degrees and radians using the **r** key. For example, to multiply **3 + 4i** by **4 + 4i** : - -| Keys | Result | -| -------- | -------- | -| ( 3 , 4 | The stack contains (3, 4) | -| ( 4 , 4 | Push (4, 4) | -| * | Get the result: (-4, 28) | - -Note that as you go, the results are kept on the stack so you can observe intermediate results in a lengthy calculation. - -![](https://opensource.com/sites/default/files/uploads/orpie_final.png) - -### Quitting Orpie - -You can exit from Orpie by typing **Q**. Your state is saved, so the next time you start Orpie, you'll find the stack as you left it. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/1/orpie - -作者:[Peter Faller][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/peterfaller -[b]: https://github.com/lujun9972 -[1]: https://en.wikipedia.org/wiki/Reverse_Polish_notation -[2]: https://github.com/pelzlpj/orpie/blob/master/doc/orpierc.5 diff --git a/sources/tech/20190125 Using Antora for your open source documentation.md b/sources/tech/20190125 Using Antora for your open source documentation.md deleted file mode 100644 index 3df2862ba1..0000000000 --- a/sources/tech/20190125 Using Antora for your open source documentation.md +++ /dev/null @@ -1,208 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Using Antora for your open source documentation) -[#]: via: (https://fedoramagazine.org/using-antora-for-your-open-source-documentation/) -[#]: author: (Adam Šamalík https://fedoramagazine.org/author/asamalik/) - -Using Antora for your open source documentation -====== -![](https://fedoramagazine.org/wp-content/uploads/2019/01/antora-816x345.jpg) - -Are you looking for an easy way to write and publish technical documentation? Let me introduce [Antora][1] — an open source documentation site generator. Simple enough for a tiny project, but also complex enough to cover large documentation sites such as [Fedora Docs][2]. - -With sources stored in git, written in a simple yet powerful markup language AsciiDoc, and a static HTML as an output, Antora makes writing, collaborating on, and publishing your documentation a no-brainer. - -### The basic concepts - -Before we build a simple site, let’s have a look at some of the core concepts Antora uses to make the world a happier place. Or, at least, to build a documentation website. - -#### Organizing the content - -All sources that are used to build your documentation site are stored in a **git repository**. Or multiple ones — potentially owned by different people. For example, at the time of writing, the Fedora Docs had its sources stored in 24 different repositories owned by different groups having their own rules around contributions. - -The content in Antora is organized into **components** , usually representing different areas of your project, or, well, different components of the software you’re documenting — such as the backend, the UI, etc. Components can be independently versioned, and each component gets a separate space on the docs site with its own menu. - -Components can be optionally broken down into so-called **modules**. Modules are mostly invisible on the site, but they allow you to organize your sources into logical groups, and even store each in different git repository if that’s something you need to do. We use this in Fedora Docs to separate [the Release Notes, the Installation Guide, and the System Administrator Guide][3] into three different source repositories with their own rules, while preserving a single view in the UI. - -What’s great about this approach is that, to some extent, the way your sources are physically structured is not reflected on the site. - -#### Virtual catalog - -When assembling the site, Antora builds a **virtual catalog** of all pages, assigning a [unique ID][4] to each one based on its name and the component, the version, and module it belongs to. The page ID is then used to generate URLs for each page, and for internal links as well. So, to some extent, the source repository structure doesn’t really matter as far as the site is concerned. - -As an example, if we’d for some reason decided to merge all the 24 repositories of Fedora Docs into one, nothing on the site would change. Well, except the “Edit this page” link on every page that would suddenly point to this one repository. - -#### Independent UI - -We’ve covered the content, but how it’s going to look like? - -Documentation sites generated with Antora use a so-called [UI bundle][5] that defines the look and feel of your site. The UI bundle holds all graphical assets such as CSS, images, etc. to make your site look beautiful. - -It is expected that the UI will be developed independently of the documentation content, and that’s exactly what Antora supports. - -#### Putting it all together - -Having sources distributed in multiple repositories might raise a question: How do you build the site? The answer is: [Antora Playbook][6]. - -Antora Playbook is a file that points to all the source repositories and the UI bundle. It also defines additional metadata such as the name of your site. - -The Playbook is the only file you need to have locally available in order to build the site. Everything else gets fetched automatically as a part of the build process. - -### Building a site with Antora - -Demo time! To build a minimal site, you need three things: - - 1. At least one component holding your AsciiDoc sources. - 2. An Antora Playbook. - 3. A UI bundle - - - -Good news is the nice people behind Antora provide [example Antora sources][7] we can try right away. - -#### The Playbook - -Let’s first have a look at [the Playbook][8]: - -``` -site: - title: Antora Demo Site -# the 404 page and sitemap files only get generated when the url property is set - url: https://example.org/docs - start_page: component-b::index.adoc -content: - sources: - - url: https://gitlab.com/antora/demo/demo-component-a.git - branches: master - - url: https://gitlab.com/antora/demo/demo-component-b.git - branches: [v2.0, v1.0] - start_path: docs -ui: - bundle: - url: https://gitlab.com/antora/antora-ui-default/-/jobs/artifacts/master/raw/build/ui-bundle.zip?job=bundle-stable - snapshot: true -``` - -As we can see, the Playbook defines some information about the site, lists the content repositories, and points to the UI bundle. - -There are two repositories. The [demo-component-a][9] with a single branch, and the [demo-component-b][10] having two branches, each representing a different version. - -#### Components - -The minimal source repository structure is nicely demonstrated in the [demo-component-a][9] repository: - -``` -antora.yml <- component metadata -modules/ - ROOT/ <- the default module - nav.adoc <- menu definition - pages/ <- a directory with all the .adoc sources - source1.adoc - source2.adoc - ... -``` - -The following - -``` -antora.yml -``` - -``` -name: component-a -title: Component A -version: 1.5.6 -start_page: ROOT:inline-text-formatting.adoc -nav: - - modules/ROOT/nav.adoc -``` - -contains metadata for this component such as the name and the version of the component, the starting page, and it also points to a menu definition file. - -The menu definition file is a simple list that defines the structure of the menu and the content. It uses the [page ID][4] to identify each page. - -``` -* xref:inline-text-formatting.adoc[Basic Inline Text Formatting] -* xref:special-characters.adoc[Special Characters & Symbols] -* xref:admonition.adoc[Admonition] -* xref:sidebar.adoc[Sidebar] -* xref:ui-macros.adoc[UI Macros] -* Lists -** xref:lists/ordered-list.adoc[Ordered List] -** xref:lists/unordered-list.adoc[Unordered List] - -And finally, there's the actual content under modules/ROOT/pages/ — you can see the repository for examples, or the AsciiDoc syntax reference -``` - -#### The UI bundle - -For the UI, we’ll be using the example UI provided by the project. - -Going into the details of Antora UI would be above the scope of this article, but if you’re interested, please see the [Antora UI documentation][5] for more info. - -#### Building the site - -Note: We’ll be using Podman to run Antora in a container. You can [learn about Podman on the Fedora Magazine][11]. - -To build the site, we only need to call Antora on the Playbook file. - -The easiest way to get antora at the moment is to use the container image provided by the project. You can get it by running: - -``` -$ podman pull antora/antora -``` - -Let’s get the playbook repository: - -``` -$ git clone https://gitlab.com/antora/demo/demo-site.git -$ cd demo-site -``` - -And run Antora using the following command: - -``` -$ podman run --rm -it -v $(pwd):/antora:z antora/antora site.yml -``` - -The site will be available in the - -public - -``` -$ cd public -$ python3 -m http.server 8080 -``` - -directory. You can either open it in your web browser directly, or start a local web server using: - -Your site will be available on . - - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/using-antora-for-your-open-source-documentation/ - -作者:[Adam Šamalík][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/asamalik/ -[b]: https://github.com/lujun9972 -[1]: https://antora.org/ -[2]: http://docs.fedoraproject.org/ -[3]: https://docs.fedoraproject.org/en-US/fedora/f29/ -[4]: https://docs.antora.org/antora/2.0/page/page-id/#structure -[5]: https://docs.antora.org/antora-ui-default/ -[6]: https://docs.antora.org/antora/2.0/playbook/ -[7]: https://gitlab.com/antora/demo -[8]: https://gitlab.com/antora/demo/demo-site/blob/master/site.yml -[9]: https://gitlab.com/antora/demo/demo-component-a -[10]: https://gitlab.com/antora/demo/demo-component-b -[11]: https://fedoramagazine.org/running-containers-with-podman/ diff --git a/sources/tech/20190127 Eliminate error handling by eliminating errors.md b/sources/tech/20190127 Eliminate error handling by eliminating errors.md deleted file mode 100644 index 6eac4740eb..0000000000 --- a/sources/tech/20190127 Eliminate error handling by eliminating errors.md +++ /dev/null @@ -1,204 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Eliminate error handling by eliminating errors) -[#]: via: (https://dave.cheney.net/2019/01/27/eliminate-error-handling-by-eliminating-errors) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -Eliminate error handling by eliminating errors -====== - -Go 2 aims to improve the overhead of [error handling][1], but do you know what is better than an improved syntax for handling errors? Not needing to handle errors at all. Now, I’m not saying “delete your error handling code”, instead I’m suggesting changing your code so you don’t have as many errors to handle. - -This article draws inspiration from a chapter in John Ousterhout’s, _[A philosophy of Software Design,][2]_ “Define Errors Out of Existence”. I’m going to try to apply his advice to Go. - -* * * - -Here’s a function to count the number of lines in a file, - -``` -func CountLines(r io.Reader) (int, error) { - var ( - br = bufio.NewReader(r) - lines int - err error - ) - - for { - _, err = br.ReadString('\n') - lines++ - if err != nil { - break - } - } - - if err != io.EOF { - return 0, err - } - return lines, nil - } -``` - -We construct a `bufio.Reader`, then sit in a loop calling the `ReadString` method, incrementing a counter until we reach the end of the file, then we return the number of lines read. That’s the code we _wanted_ to write, instead `CountLines` is made more complicated by its error handling. For example, there is this strange construction: - -``` -_, err = br.ReadString('\n') -lines++ -if err != nil { - break -} -``` - -We increment the count of lines _before_ checking the error—​that looks odd. The reason we have to write it this way is `ReadString` will return an error if it encounters an end-of-file—`io.EOF`—before hitting a newline character. This can happen if there is no trailing newline. - -To address this problem, we rearrange the logic to increment the line count, then see if we need to exit the loop.1 - -But we’re not done checking errors yet. `ReadString` will return `io.EOF` when it hits the end of the file. This is expected, `ReadString` needs some way of saying _stop, there is nothing more to read_. So before we return the error to the caller of `CountLine`, we need to check if the error was _not_ `io.EOF`, and in that case propagate it up, otherwise we return `nil` to say that everything worked fine. This is why the final line of the function is not simply - -``` -return lines, err -``` - -I think this is a good example of Russ Cox’s [observation that error handling can obscure the operation of the function][3]. Let’s look at an improved version. - -``` -func CountLines(r io.Reader) (int, error) { - sc := bufio.NewScanner(r) - lines := 0 - - for sc.Scan() { - lines++ - } - - return lines, sc.Err() -} -``` - -This improved version switches from using `bufio.Reader` to `bufio.Scanner`. Under the hood `bufio.Scanner` uses `bufio.Reader` adding a layer of abstraction which helps remove the error handling which obscured the operation of our previous version of `CountLines` 2 - -The method `sc.Scan()` returns `true` if the scanner _has_ matched a line of text and _has not_ encountered an error. So, the body of our `for` loop will be called only when there is a line of text in the scanner’s buffer. This means our revised `CountLines` correctly handles the case where there is no trailing newline, It also correctly handles the case where the file is empty. - -Secondly, as `sc.Scan` returns `false` once an error is encountered, our `for` loop will exit when the end-of-file is reached or an error is encountered. The `bufio.Scanner` type memoises the first error it encounters and we recover that error once we’ve exited the loop using the `sc.Err()` method. - -Lastly, `buffo.Scanner` takes care of handling `io.EOF` and will convert it to a `nil` if the end of file was reached without encountering another error. - -* * * - -My second example is inspired by Rob Pikes’ _[Errors are values][4]_ blog post. - -When dealing with opening, writing and closing files, the error handling is present but not overwhelming as, the operations can be encapsulated in helpers like `ioutil.ReadFile` and `ioutil.WriteFile`. However, when dealing with low level network protocols it often becomes necessary to build the response directly using I/O primitives, thus the error handling can become repetitive. Consider this fragment of a HTTP server which is constructing a HTTP/1.1 response. - -``` -type Header struct { - Key, Value string -} - -type Status struct { - Code int - Reason string -} - -func WriteResponse(w io.Writer, st Status, headers []Header, body io.Reader) error { - _, err := fmt.Fprintf(w, "HTTP/1.1 %d %s\r\n", st.Code, st.Reason) - if err != nil { - return err - } - - for _, h := range headers { - _, err := fmt.Fprintf(w, "%s: %s\r\n", h.Key, h.Value) - if err != nil { - return err - } - } - - if _, err := fmt.Fprint(w, "\r\n"); err != nil { - return err - } - - _, err = io.Copy(w, body) - return err -} -``` - -First we construct the status line using `fmt.Fprintf`, and check the error. Then for each header we write the header key and value, checking the error each time. Lastly we terminate the header section with an additional `\r\n`, check the error, and copy the response body to the client. Finally, although we don’t need to check the error from `io.Copy`, we do need to translate it from the two return value form that `io.Copy` returns into the single return value that `WriteResponse` expects. - -Not only is this a lot of repetitive work, each operation—fundamentally writing bytes to an `io.Writer`—has a different form of error handling. But we can make it easier on ourselves by introducing a small wrapper type. - -``` -type errWriter struct { - io.Writer - err error -} - -func (e *errWriter) Write(buf []byte) (int, error) { - if e.err != nil { - return 0, e.err - } - - var n int - n, e.err = e.Writer.Write(buf) - return n, nil -} -``` - -`errWriter` fulfils the `io.Writer` contract so it can be used to wrap an existing `io.Writer`. `errWriter` passes writes through to its underlying writer until an error is detected. From that point on, it discards any writes and returns the previous error. - -``` -func WriteResponse(w io.Writer, st Status, headers []Header, body io.Reader) error { - ew := &errWriter{Writer: w} - fmt.Fprintf(ew, "HTTP/1.1 %d %s\r\n", st.Code, st.Reason) - - for _, h := range headers { - fmt.Fprintf(ew, "%s: %s\r\n", h.Key, h.Value) - } - - fmt.Fprint(ew, "\r\n") - io.Copy(ew, body) - - return ew.err -} -``` - -Applying `errWriter` to `WriteResponse` dramatically improves the clarity of the code. Each of the operations no longer needs to bracket itself with an error check. Reporting the error is moved to the end of the function by inspecting the `ew.err` field, avoiding the annoying translation from `io.Copy`’s return values. - -* * * - -When you find yourself faced with overbearing error handling, try to extract some of the operations into a helper type. - - 1. This logic _still_ isn’t correct, can you spot the bug? - 2. `bufio.Scanner` can scan for any pattern, by default it looks for newlines. - - - -### Related posts: - - 1. [Error handling vs. exceptions redux][5] - 2. [Stack traces and the errors package][6] - 3. [Subcommand handling in Go][7] - 4. [Constant errors][8] - - - --------------------------------------------------------------------------------- - -via: https://dave.cheney.net/2019/01/27/eliminate-error-handling-by-eliminating-errors - -作者:[Dave Cheney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://dave.cheney.net/author/davecheney -[b]: https://github.com/lujun9972 -[1]: https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling-overview.md -[2]: https://www.amazon.com/Philosophy-Software-Design-John-Ousterhout/dp/1732102201 -[3]: https://www.youtube.com/watch?v=6wIP3rO6On8 -[4]: https://blog.golang.org/errors-are-values -[5]: https://dave.cheney.net/2014/11/04/error-handling-vs-exceptions-redux (Error handling vs. exceptions redux) -[6]: https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package (Stack traces and the errors package) -[7]: https://dave.cheney.net/2013/11/07/subcommand-handling-in-go (Subcommand handling in Go) -[8]: https://dave.cheney.net/2016/04/07/constant-errors (Constant errors) diff --git a/sources/tech/20190129 A few early marketing thoughts.md b/sources/tech/20190129 A few early marketing thoughts.md deleted file mode 100644 index 79cc6b1b1d..0000000000 --- a/sources/tech/20190129 A few early marketing thoughts.md +++ /dev/null @@ -1,164 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (A few early marketing thoughts) -[#]: via: (https://jvns.ca/blog/2019/01/29/marketing-thoughts/) -[#]: author: (Julia Evans https://jvns.ca/) - -A few early marketing thoughts -====== - -At some point last month I said I might write more about business, so here are some very early marketing thoughts for my zine business (!). The question I’m trying to make some progress on in this post is: “how to do marketing in a way that feels good?” - -### what’s the point of marketing? - -Okay! What’s marketing? What’s the point? I think the ideal way marketing works is: - - 1. you somehow tell a person about a thing - 2. you explain somehow why the thing will be useful to them / why it is good - 3. they buy it and they like the thing because it’s what they expected - - - -(or, when you explain it they see that they don’t want it and don’t buy it which is good too!!) - -So basically as far as I can tell good marketing is just explaining what the thing is and why it is good in a clear way. - -### what internet marketing techniques do people use? - -I’ve been thinking a bit about internet marketing techniques I see people using on me recently. Here are a few examples of internet marketing techniques I’ve seen: - - 1. word of mouth (“have you seen this cool new thing?!”) - 2. twitter / instagram marketing (build a twitter/instagram account) - 3. email marketing (“build a mailing list with a bajillion people on it and sell to them”) - 4. email marketing (“tell your existing users about features that they already have that they might want to use”) - 5. social proof marketing (“jane from georgia bought a sweater”), eg fomo.com - 6. cart notifications (“you left this sweater in your cart??! did you mean to buy it? maybe you should buy it!“) - 7. content marketing (which is fine but whenever people refer to my writing as ‘content’ I get grumpy :)) - - - -### you need _some_ way to tell people about your stuff - -Something that is definitely true about marketing is that you need some way to tell new people about the thing you are doing. So for me when I’m thinking about running a business it’s less about “should i do marketing” and more like “well obviously i have to do marketing, how do i do it in a way that i feel good about?” - -### what’s up with email marketing? - -I feel like every single piece of internet marketing advice I read says “you need a mailing list”. This is advice that I haven’t really taken to heart – technically I have 2 mailing lists: - - 1. the RSS feed for this blog, which sends out new blog posts to a mailing list for folks who don’t use RSS (which 3000 of you get) - 2. ’s list, for comics / new zine announcements (780 people subscribe to that! thank you!) - - - -but definitely neither of them is a Machine For Making Sales and I’ve put in almost no efforts in that direction yet. - -here are a few things I’ve noticed about marketing mailing lists: - - * most marketing mailing lists are boring but some marketing mailing lists are actually interesting! For example I kind of like [amy hoy][1]’s emails. - * Someone told me recently that they have 200,000 people on their mailing list (?!!) which made the “a mailing list is a machine for making money” concept make a lot more sense to me. I wonder if people who make a lot of money from their mailing lists all have huge 10k+ person mailing lists like this? - - - -### what works for me: twitter - -Right now for my zines business I’d guess maybe 70% of my sales come from Twitter. The main thing I do is tweet pages from zines I’m working on (for example: yesterday’s [comic about ss][2]). The comics are usually good and fun so invariably they get tons of retweets, which means that I end up with lots of followers, which means that when I later put up the zine for sale lots of people will buy it. - -And of course people don’t _have_ to buy the zines, I post most of what ends up in my zines on twitter for free, so it feels like a nice way to do it. Everybody wins, I think. - -(side note: when I started getting tons of new followers from my comics I was actually super worried that it would make my experience of Twitter way worse. That hasn’t happened! the new followers all seem totally reasonable and I still get a lot of really interesting twitter replies which is wonderful ❤) - -I don’t try to hack/optimize this really: I just post comics when I make them and I try to make them good. - -### a small Twitter innovation: putting my website on the comics - -Here’s one small marketing change that I made that I think makes sense! - -In the past, I didn’t put anything about how to buy my comics on the comics I posted on Twitter, just my Twitter username. Like this: - -![][3] - -After a while, I realized people were asking me all the time “hey, can I buy a book/collection? where do these come from? how do I get more?“! I think a marketing secret is “people actually want to buy things that are good, it is useful to tell people where they can buy things that are good”. - -So just recently I’ve started adding my website and a note about my current project on the comics I post on Twitter. It doesn’t say much: just “❤ these comics? buy a collection! wizardzines.com” and “page 11 of my upcoming bite size networking zine”. Here’s what it looks like: - -![][4] - -I feel like this strikes a pretty good balance between “julia you need to tell people what you’re doing otherwise how are they supposed to buy things from you” and “omg too many sales pitches everywhere”? I’ve only started doing this recently so we’ll see how it goes. - -### should I work on a mailing list? - -It seems like the same thing that works on twitter would work by email if I wanted to put in the time (email people comics! when a zine comes out, email them about the zine and they can buy it if they want!). - -One thing I LOVE about Twitter though is that people always reply to the comics I post with their own tips and tricks that they love and I often learn something new. I feel like email would be nowhere near as fun :) - -But I still think this is a pretty good idea: keeping up with twitter can be time consuming and I bet a lot of people would like to get occasional email with programming drawings. (would you?) - -One thing I’m not sure about is – a lot of marketing mailing lists seem to use somewhat aggressive techniques to get new emails (a lot of popups on a website, or adding everyone who signs up to their service / buys a thing to a marketing list) and while I’m basically fine with that (unsubscribing is easy!), I’m not sure that it’s what I’d want to do, and maybe less aggressive techniques will work just as well? We’ll see. - -### should I track conversion rates? - -A piece of marketing advice I assume people give a lot is “be data driven, figure out what things convert the best, etc”. I don’t do this almost at all – gumroad used to tell me that most of my sales came from Twitter which was good to know, but right now I have basically no idea how it works. - -Doing a bunch of work to track conversion rates feels bad to me: it seems like it would be really easy to go down a dumb rabbit hole of “oh, let’s try to increase conversion by 5%” instead of just focusing on making really good and cool things. - -My guess is that what will work best for me for a while is to have some data that tells me in broad strokes how the business works (like “about 70% of sales come from twitter”) and just leave it at that. - -### should I do advertising? - -I had a conversation with Kamal about this post that went: - - * julia: “hmm, maybe I should talk about ads?” - * julia: “wait, are ads marketing?” - * kamal: “yes ads are marketing” - - - -So, ads! I don’t know anything about advertising except that you can advertise on Facebook or Twitter or Google. Some non-ethical questions I have about advertising: - - * how do you choose what keywords to advertise on? - * are there actually cheap keywords, like is ‘file descriptors’ cheap? - * how much do you need to pay per click? (for some weird linux keywords, google estimated 20 cents a click?) - * can you use ads effectively for something that costs $10? - - - -This seems nontrivial to learn about and I don’t think I’m going to try soon. - -### other marketing things - -a few other things I’ve thought about: - - * I learned about “social proof marketing” sites like fomo.com yesterday which makes popups on your site like “someone bought COOL THING 3 hours ago”. This seems like it has some utility (people are actually buying things from me all the time, maybe that’s useful to share somehow?) but those popups feel a bit cheap to me and I don’t really think it’s something I’d want to do right now. - * similarly a lot of sites like to inject these popups like “HELLO PLEASE SIGN UP FOR OUR MAILING LIST”. similar thoughts. I’ve been putting an email signup link in the footer which seems like a good balance between discoverable and annoying. As an example of a popup which isn’t too intrusive, though: nate berkopec has [one on his site][5] which feels really reasonable! (scroll to the bottom to see it) - - - -Maybe marketing is all about “make your things discoverable without being annoying”? :) - -### that’s all! - -Hopefully some of this was interesting! Obviously the most important thing in all of this is to make cool things that are useful to people, but I think cool useful writing does not actually sell itself! - -If you have thoughts about what kinds of marketing have worked well for you / you’ve felt good about I would love to hear them! - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019/01/29/marketing-thoughts/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://stackingthebricks.com/ -[2]: https://twitter.com/b0rk/status/1090058524137345025 -[3]: https://jvns.ca/images/kill.jpeg -[4]: https://jvns.ca/images/ss.jpeg -[5]: https://www.speedshop.co/2019/01/10/three-activerecord-mistakes.html diff --git a/sources/tech/20190129 A small notebook for a system administrator.md b/sources/tech/20190129 A small notebook for a system administrator.md deleted file mode 100644 index 45d6ba50eb..0000000000 --- a/sources/tech/20190129 A small notebook for a system administrator.md +++ /dev/null @@ -1,552 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (A small notebook for a system administrator) -[#]: via: (https://habr.com/en/post/437912/) -[#]: author: (sukhe https://habr.com/en/users/sukhe/) - -A small notebook for a system administrator -====== - -I am a system administrator, and I need a small, lightweight notebook for every day carrying. Of course, not just to carry it, but for use it to work. - -I already have a ThinkPad x200, but it’s heavier than I would like. And among the lightweight notebooks, I did not find anything suitable. All of them imitate the MacBook Air: thin, shiny, glamorous, and they all critically lack ports. Such notebook is suitable for posting photos on Instagram, but not for work. At least not for mine. - -After not finding anything suitable, I thought about how a notebook would turn out if it were developed not with design, but the needs of real users in mind. System administrators, for example. Or people serving telecommunications equipment in hard-to-reach places — on roofs, masts, in the woods, literally in the middle of nowhere. - -The results of my thoughts are presented in this article. - - -[![Figure to attract attention][1]][2] - -Of course, your understanding of the admin notebook does not have to coincide with mine. But I hope you will find a couple of interesting thoughts here. - -Just keep in mind that «system administrator» is just the name of my position. And in fact, I have to work as a network engineer, and installer, and perform a significant part of other work related to hardware. Our company is tiny, we are far from large settlements, so all of us have to be universal specialist. - -In order not to constantly clarify «this notebook», later in the article I will call it the “adminbook”. Although it can be useful not only to administrators, but also to all who need a small, lightweight notebook with a lot of connectors. In fact, even large laptops don’t have as many connectors. - -So let's get started… - -### 1\. Dimensions and weight - -Of course, you want it smaller and more lightweight, but the keyboard with the screen should not be too small. And there has to be space for connectors, too. - -In my opinion, a suitable option is a notebook half the size of an x200. That is, approximately the size of a sheet of A5 paper (210x148mm). In addition, the side pockets of many bags and backpacks are designed for this size. This means that the adminbook doesn’t even have to be carried in the main compartment. - -Though I couldn’t fit everything I wanted into 210mm. To make a comfortable keyboard, the width had to be increased to 230mm. - -In the illustrations the adminbook may seem too thick. But that’s only an optical illusion. In fact, its thickness is 25mm (28mm taking the rubber feet into account). - -Its size is close to the usual hardcover book, 300-350 pages thick. - -It’s lightweight, too — about 800 grams (half the weight of the ThinkPad). - -The case of the adminbook is made of mithril aluminum. It’s a lightweight, durable metal with good thermal conductivity. - -### 2\. Keyboard and trackpoint - -A quality keyboard is very important for me. “Quality” there means the fastest possible typing and hotkey speed. It needs to be so “matter-of-fact” I don’t have to think about it at all, as if it types seemingly by force of thought. - -This is possible if the keys are normal size and in their typical positions. But the adminbook is too small for that. In width, it is even smaller than the main block of keys of a desktop keyboard. So, you have to work around that somehow. - -After a long search and numerous tests, I came up with what you see in the picture: - -![](https://habrastorage.org/webt/2-/mh/ag/2-mhagvoofl7vgqiadv3rcnclb0.jpeg) -Fig.2.1 — Adminbook keyboard - -This keyboard has the same vertical key distance as on a regular keyboard. A horizontal distance decreased just only 2mm (17 instead of 19). - -You can even type blindly on this keyboard! To do this, some keys have small bumps for tactile orientation. - -However, if you do not sit at a table, the main input method will be to press the keys “at a glance”. And here the muscle memory does not help — you have to look at the keys with your eyes. - -To hit the buttons faster, different key colors are used. - -For example, the numeric row is specifically colored gray to visually separate it from the QWERTY row, and NumLock is mapped to the “6” key, colored black to stand out. - -To the right of NumLock, gray indicates the area of the numeric keypad. These (and neighboring) buttons work like a numeric keypad in NumLock mode or when you press Fn. I must say, this is a useful feature for the admin computer — some users come up with passwords on the numpad in the form of a “cross”, “snake”, “spiral”, etc. I want to be able to type them that way too. - -As for the function keys. I don’t know about you, but it annoys me when, in a 15-inch laptop, this row is half-height and only accessible through pressing Fn. Given that there’s a lot free space around the keyboard! - -The adminbook doesn’t have free space at all. But the function keys can be pressed without Fn. These are separate keys that are even divided into groups of 4 using color coding and location. - -By the way, have you seen which key is to the right of AltGr on modern ThinkPads? I don’t know what they were thinking, but now they have PrintScreen there! - -Where? Where, I ask, is the context menu key that I use every day? It’s not there. - -So the adminbook has it. Two, even! You can put it up by pressing Fn + Alt. Sorry, I couldn’t map it to a separate key due to lack of space. Just in case, I added the “Right Win” key as Fn + CtrlR. Maybe some people use it for something. - -However, the adminbook allows you to customize the keyboard to your liking. The keyboard is fully reprogrammable. You can assign the scan codes you need to the keys. Setting the keyboard parameters is done via the “KEY” button (Fn + F3). - -Of course, the adminbook has a keyboard backlight. It is turned on with Fn + B (below the trackpoint, you can even find it in the dark). The backlight here is similar to the ThinkPad ThinkLight. That is, it’s an LED above the display, illuminating the keyboard from the top. In this case, it is better than a backlight from below, because it allows you to distinguish the color of the keys. In addition, keys have several characters printed on them, while only English letters are usually made translucent to the backlight. - -Since we’re on the topic of characters… Red letters are Ukrainian and Russian. I specifically drew them to show that keys have space for several alphabets: after all, English is not a native language for most of humanity. - -Since there isn’t enough space for a full touchpad, the trackpoint is used as the positioning device. If you have no experience working with it — don’t worry, it’s actually quite handy. The mouse cursor moves with slight inclines of the trackpoint, like an analog joystick, and its three buttons (under the spacebar) work the same as on the mouse. - -To the left of the trackpoint keys is a fingerprint scanner. That makes it possible to login by fingerprint. It’s very convenient in most cases. - -The space bar has an NFC antenna location mark. You can simply read data from devices equipped with NFC, and you can make it to lock the system while not in use. For example, if you wear an NFC-equipped ring, it looks like this: when you remove hands from the keyboard, the computer locks after a certain time, and unlocks when you put hands on the keyboard again. - -And now the unexpected part. The keyboard and the trackpoint can work as a USB keyboard and mouse for an external computer! For this, there are USB Type C and MicroUSB connectors on the back, labeled «OTG». You can connect to an external computer using a standard USB cable from a phone (which is usually always with you). - -![](https://habrastorage.org/webt/e2/wa/m5/e2wam5d1bbckfdxpvqwl-i6aqle.jpeg) -Fig.2.2 — On the right: the power connector 5.5x2.5mm, the main LAN connector, POE indicator, USB 3.0 Type A, USB Type C (with alternate HDMI mode), microSD card reader and two «magic» buttons - -Switching to the external keyboard mode is done with the «K» button on the right side of the adminbook. And there are actually three modes, since the keyboard+trackpoint combo can also work as a Bluetooth keyboard/mouse! - -Moreover: to save energy, the keyboard and trackpoint can work autonomously from the rest of the adminbook. When the adminbook is turned off, pressing «K» can turn on only the keyboard and trackpoint to use them by connecting to another computer. - -Of course, the keyboard is water-resistant. Excess water is drained down through the drainage holes. - -### 3\. Video subsystem - -There are some devices that normally do not need a monitor and keyboard. For example, industrial computers, servers or DVRs. And since the monitor is «not needed», it is, in most cases, absent. - -And when there is a need to configure such a device from the console, it can be a big surprise that the entire office is working on laptops and there is not a single stationary monitor within reach. Therefore, in some cases you have to take a monitor with you. - -But you don’t need to worry about this if you have the adminbook. - -The fact is that the video outputs of the adminbook can switch «in the opposite direction» and work as video inputs by displaying the incoming image on the built-in screen. So, the adminbook can also replace the monitor (in addition to replace the mouse and keyboard). - -![](https://habrastorage.org/webt/4a/qr/f-/4aqrf-1sgstwwffhx-n4wr0p7ws.jpeg) -Fig.3.1 — On the left side of the adminbook, there are Mini DisplayPort, USB Type C (with alternate DisplayPort mode), SD card reader, USB 3.0 Type A connectors, HDMI, four audio connectors, VGA and power button - -Switching modes between input and output is done by pressing the «M» button on the right side of the adminbook. - -The video subsystem, as well as the keyboard, can work autonomously — that is, when used as a monitor, the other parts of the adminbook remain disabled. To turn on to this mode also uses the «M» button. - -Detailed screen adjustment (contrast, geometry, video input selection, etc.) is performed using the menu, brought up with the «SCR» button (Fn + F4). - -The adminbook has HDMI, MiniDP, VGA and USB Type C connectors (with DisplayPort and HDMI alternate mode) for video input / output. The integrated GPU can display the image simultaneously in three directions (including the integrated display). - -The adminbook display is FullHD (1920x1080), 9.5’’, matte screen. The brightness is sufficient for working outside during the day. And to do it better, the set includes folding blinds for protection from sunlight. - -![](https://habrastorage.org/webt/k-/nc/rh/k-ncrhphspvcoimfds1wurnzk3i.jpeg) -Fig.3.2 — Blinds to protect from sunlight - -In addition to video output via these connectors, the adminbook can use wireless transmission via WiDi or Miracast protocols. - -### 4\. Emulation of external drives - -One of the options for installing the operating system is to install it from a CD / DVD, but now very few computers have optical drives. USB connectors are everywhere, though. Therefore, the adminbook can pretend to be an external optical drive connected via USB. - -That allows connecting it to any computer to install an operating system on it, while also running boot discs with test programs or antiviruses. - -To connect, it uses the same USB cable that’s used for connecting it to a desktop as an external keyboard/mouse. - -The “CD” button (Fn + F2) controls the drive emulation — select a disc image (in an .iso file) and mount / unmount it. - -If you need to copy data from a computer or to it, the adminbook can emulate an external hard drive connected via the same USB cable. HDD emulation is also enabled by the “CD” button. - -This button also turns on the emulation of bootable USB flash drives. They are now used to install operating systems almost more often than CDs. Therefore, the adminbook can pretend to be a bootable flash drive. - -The .iso files are located on a separate partition of the hard disk. This allows you to use them regardless of the operating system. Moreover, in the emulation menu you can connect a virtual drive to one of the USB interfaces of the adminbook. This makes it possible to install an operating system on the adminbook using itself as an installation disc drive. - -By the way, the adminbook is designed to work under Windows 10 and Debian / Kali / Ubuntu. The menu system called via function buttons with Fn works autonomously on a separate microcontroller. - -### 5\. Rear connectors - -First, a classic DB-9 connector for RS-232. Any admin notebook simply has to have it. We have it here, too, and galvanically isolated from the rest of the notebook. - -In addition to RS-232, RS-485 widely used in industrial automation is supported. It has a two-wire and four-wire version, with a terminating resistor and without, with the ability to enable a protective offset. It can also work in RS-422 and UART modes. - -All these protocols are configured in the on-screen menu, called by the «COM» button (Fn + F8). - -Since there are multiple protocols, it is possible to accidentally connect the equipment to a wrong connector and break it. - -To prevent this from happening, when you turn off the computer (or go into sleep mode, or close the display lid), the COM port switches to the default mode. This may be a “port disabled” state, or enabling one of the protocols. - -![](https://habrastorage.org/webt/uz/ii/ig/uziiig_yr86yzdcnivkbapkbbgi.jpeg) -Fig.5.1 — The rear connectors: DB-9, SATA + SATA Power, HD Mini SAS, the second wired LAN connector, two USB 3.0 Type A connectors, two USB 2.0 MicroB connectors, three USB Type C connectors, a USIM card tray, a PBD-12 pin connector (jack) - -The adminbook has one more serial port. But if the first one uses the hardware UART chipset, the second one is connected to the USB 2.0 line through the FT232H converter. - -Thanks to this, via COM2, you can exchange data via I2C, SMBus, SPI, JTAG, UART protocols or use it as 8 outputs for Bit-bang / GPIO. These protocols are used when working with microcontrollers, flashing firmware on routers and debugging any other electronics. For this purpose, pin connectors are usually used with a 2.54mm pitch. Therefore, COM2 is made to look like one of these connectors. - -![](https://habrastorage.org/webt/qd/rc/ln/qdrclnoljgnlohthok4hgjb0be4.jpeg) -Fig.5.2 — USB to UART adapter replaced by COM2 port - -There is also a secondary LAN interface at the back. Like the main one, it is gigabit-capable, with support for VLAN. Both interfaces are able to test the integrity of the cable (for pair length and short circuits), the presence of connected devices, available communication speeds, the presence of POE voltage. With the using a wiremap adapter on the other side (see chapter 17) it is possible to determine how the cable is connected to crimps. - -The network interface menu is called with the “LAN” button (Fn + F6). - -The adminbook has a combined SATA + SATA Power connector, connected directly to the chipset. That makes it possible to perform low-level tests of hard drives that do not work through USB-SATA adapters. Previously, you had to do it through ExpressCards-type adapters, but the adminbook can do without them because it has a true SATA output. - -![](https://habrastorage.org/webt/dr/si/in/drsiinbafiyz8ztzwrowtvi0lk8.jpeg) -Fig.5.3 — USB to SATA/IDE and ExpressCard to SATA adapters - -The adminbook also has a connector that no other laptops have — HD Mini SAS (SFF-8643). PCIe x4 is routed outside through this connector. Thus, it's possible to connect an external U.2 (directly) or M.2 type (through an adapter) drives. Or even a typical desktop PCIe expansion card (like a graphics card). - -![](https://habrastorage.org/webt/ud/ph/86/udph860bshazyd6lvuzvwgymwnk.jpeg) -Fig.5.4 — HD Mini SAS (SFF-8643) to U.2 cable - -![](https://habrastorage.org/webt/kx/dd/99/kxdd99krcllm5ooz67l_egcttym.jpeg) -Fig.5.5 — U.2 drive - -![](https://habrastorage.org/webt/xn/de/gx/xndegxy5i1g7h2lwefs2jt1scpq.jpeg) -Fig.5.6 — U.2 to M.2 adapter - -![](https://habrastorage.org/webt/z2/dd/hd/z2ddhdoioezdwov_nv9e3b0egsa.jpeg) -Fig.5.7 — Combined adapter from U.2 to M.2 and PCIe (sample M.2 22110 drive is installed) - -Unfortunately, the limitations of the chipset don’t allow arbitrary use of PCIe lanes. In addition, the processor uses the same data lanes for PCIe and SATA. Therefore, the rear connectors can only work in two ways: -— all four PCIe lanes go to the Mini SAS connector (the second network interface and SATA don’t work) -— two PCIe lanes go to the Mini SAS, and two lanes to the second network interface and SATA connector - -On the back there are also two USB connectors (usual and Type C), which are constantly powered. That allows you to charge other devices from your notebook, even when the notebook is turned off. - -### 6\. Power Supply - -The adminbook is designed to work in difficult and unpredictable conditions, therefore, it is able to receive power in various ways. - -**Method number one** is Power Delivery. The power supply cable can be connected to any USB Type C connector (except the one marked “OTG”). - -**The second option** is from a normal 5V phone charger with a microUSB or USB Type C connector. At the same time, if you connect to the ports labeled QC 3.0, the QuickCharge fast charging standard will be supported. - -**The third option** — from any source of 12-60V DC power. To connect, use a coaxial ( also known as “barrel”) 5.5x2.5mm power connector, often found in laptop power supplies. - -For greater safety, the 12-60V power supply is galvanically isolated from the rest of the notebook. In addition, there’s reverse polarity protection. In fact, the adminbook can receive energy even if positive and negative ends are mismatched. - -![](https://habrastorage.org/webt/ju/xo/c3/juxoc3lxi7urqwgegyd6ida5h_8.jpeg) -Fig.6.1 — The cable, connecting the power supply to the adminbook (terminated with 5.5x2.5mm connectors) - -Adapters for a car cigarette lighter and crocodile clips are included in the box. - -![](https://habrastorage.org/webt/l6/-v/gv/l6-vgvqjrssirnvyi14czhi0mrc.jpeg) -Fig.6.2 — Adapter from 5.5x2.5mm coaxial connector to crocodile clips - -![](https://habrastorage.org/webt/zw/an/gs/zwangsvfdvoievatpbfxqvxrszg.png) -Fig.6.3 — Adapter to a car cigarette lighter - -**The fourth option** — Power Over Ethernet (POE) through the main network adapter. Supported options are 802.3af, 802.3at and Passive POE. Input voltage from 12 to 60V. This method is convenient if you have to work on the roof or on the tower, setting up Wi-Fi antennas. Power to them comes through Ethernet cables, and there is no other electricity on the tower. - -POE electricity can be used in three ways: - - * power the notebook only - * forward to a second network adapter and power the notebook from batteries - * power the notebook and the antenna at the same time - - - -To prevent equipment damage, if one of the Ethernet cables is disconnected, the power to the second network interface is terminated. The power can only be turned on manually through the corresponding menu item. - -When using the 802.3af / at protocols, you can set the power class that the adminbook will request from the power supply device. This and other POE properties are configured from the menu called with the “LAN” button (Fn + F6). - -By the way, you can remotely reset Ubiquity access points (which is done by closing certain wires in the cable) with the second network interface. - -The indicator next to the main network interface shows the presence and type of POE: green — 802.3af / at, red — Passive POE. - -**The last, fifth** power supply is the battery. Here it’s a LiPol, 42W/hour battery. - -In case the external power supply does not provide sufficient power, the missing power can be drawn from the battery. Thus, it can draw power from the battery and external sources at the same time. - -### 7\. Display unit - -The display can tilt 180 degrees, and it’s locked with latches while closed (opens with a button on the front side). When the display is closed, adminbook doesn’t react to pressing any external buttons. - -In addition to the screen, the notebook lid contains: - - * front and rear cameras with lights, microphones, activity LEDs and mechanical curtains - * LED of the upper backlight of the keyboard (similar to ThinkLight) - * LED indicators for Wi-Fi, Bluetooth, HDD and others - * wireless protocol antennas (in the blue plastic insert) - * photo sensors and LEDs for the infrared remote - * gyroscope, accelerometer, magnetometer - - - -The plastic insert for the antennas does not reach the corners of the display lid. This is done because in the «traveling» notebooks the corners are most affected by impacts, and it's desirable that they be made of metal. - -### 8\. Webcams - -The notebook has 2 webcams. The front-facing one is 8MP (4K / UltraHD), while the “selfie” one is 2MP (FullHD). Both cameras have a backlight controlled by separate buttons (Fn + G and Fn + H). Each camera has a mechanical curtain and an activity LED. The shifted mechanical curtain also turns off the microphones of the corresponding side (configurable). - -The external camera has two quick launch buttons — Fn + 1 takes an instant photo, Fn + 2 turns on video recording. The internal camera has a combination of Fn + Q and Fn + W. - -You can configure cameras and microphones from the menu called up by the “CAM” button (Fn + F10). - -### 9\. Indicator row - -It has the following indicators: Microphone, NumLock, ScrollLock, hard drive access, battery charge, external power connection, sleep mode, mobile connection, WiFi, Bluetooth. - -Three indicators are made to shine through the back side of the display lid, so that they can be seen while the lid is closed: external power connection, battery charge, sleep mode. - -Indicators are color-coded. - -Microphone — lights up red when all microphones are muted - -Battery charge: more than 60% is green, 30-60% is yellow, less than 30% is red, less than 10% is blinking red. - -External power: green — power is supplied, the battery is charged; yellow — power is supplied, the battery is charging; red — there is not enough external power to operate, the battery is drained - -Mobile: 4G (LTE) — green, 3G — yellow, EDGE / GPRS — red, blinking red — on, but no connection - -Wi-Fi: green — connected to 5 GHz, yellow — to 2.4 GHz, red — on, but not connected - -You can configure the indication with the “IND” button (Fn + F9) - -### 10\. Infrared remote control - -Near the indicators (on the front and back of the display lid) there are infrared photo sensors and LEDs to recording and playback commands from IR remotes. You can set it up, as well as emulate a remote control by pressing the “IR” button (Fn + F5). - -### 11\. Wireless interfaces - -WiFi — dual-band, 802.11a/b/g/n/ac with support for Wireless Direct, Intel WI-Di / Miracast, Wake On Wireless LAN. - -You ask, why is Miracast here? Because is already embedded in many WiFi chips, so its presence does not lead to additional costs. But you can transfer the image wirelessly to TVs, projectors and TV set-top boxes, that already have Miracast built in. - -Regarding Bluetooth, there’s nothing special. It’s version 4.2 or newest. By the way, the keyboard and trackpoint have a separate Bluetooth module. This is much easier than connect them to the system-wide module. - -Of course, the adminbook has a built-in cellular modem for 4G (LTE) / 3G / EDGE / GPRS, as well as a GPS / GLONASS / Galileo / Beidou receiver. This receiver also doesn’t cost much, because it’s already built into the 4G modem. - -There is also an NFC communication module, with the antenna under the spacebar. Antennas of all other wireless interfaces are in a plastic insert above the display. - -You can configure wireless interfaces with the «WRLS» button (Fn + F7). - -### 12\. USB connectors - -In total, four USB 3.0 Type A connectors and four USB 3.1 Type C connectors are built into the adminbook. Peripherals are connected to the adminbook through these. - -One more Type C and MicroUSB are allocated only for keyboard / mouse / drive emulation (denoted as “OTG”). - -«QC 3.0» labeled MicroUSB connector can not only be used for power, but it can switch to normal USB 2.0 port mode, except using MicroB instead of normal Type A. Why is it necessary? Because to flash some electronics you sometimes need non-standard USB A to USB A cables. - -In order to not make adapters outselves, you can use a regular phone charging cable by plugging it into this Micro B connector. Or use an USB A to USB Type C cable (if you have one). - -![](https://habrastorage.org/webt/0p/90/7e/0p907ezbunekqwobeogjgs5fgsa.jpeg) -Fig.12.1 — Homemade USB A to USB A cable - -Since USB Type C supports alternate modes, it makes sense to use it. Alternate modes are when the connector works as HDMI or DisplayPort video outputs. Though you’ll need adapters to connect it to a TV or monitor. Or appropriate cables that have Type C on one end and HDMI / DP on the other. However, USB Type C to USB Type C cables might soon become the most common video transfer cable. - -The Type C connector on the left side of the adminbook supports an alternate Display Port mode, and on the right side, HDMI. Like the other video outputs of the adminbook, they can work as both input and output. - -The one thing left to say is that Type C is bidirectional in regard to power delivery — it can both take in power as well as output it. - -### 13\. Other - -On the left side there are four audio connectors: Line In, Line Out, Microphone and the combo headset jack (headphones + microphone). Supports simple stereo, quad and 5.1 mode output. - -Audio outputs are specially placed next to the video connectors, so that when connected to any equipment, the wires are on one side. - -Built-in speakers are on the sides. Outside, they are covered with grills and acoustic fabric with water-repellent impregnation. - -There are also two slots for memory cards — full-size SD and MicroSD. If you think that the first slot is needed only for copying photos from the camera — you are mistaken. Now, both single-board computers like Raspberry Pi and even rack-mount servers are loaded from SD cards. MicroSD cards are also commonly found outside of phones. In general, you need both card slots. - -Sensors more familiar to phones — a gyroscope, an accelerometer and a magnetometer — are built into the lid of the notebook. Thanks to this, one can determine where the notebook cameras are directed and use this for augmented reality, as well as navigation. Sensors are controlled via the menu using the “SNSR” button (Fn + F11). - -Among the function buttons with Fn, F1 (“MAN”) and F12 (“ETC”) I haven’t described yet. The first is a built-in guide on connectors, modes and how to use the adminbook. The second is the settings of non-standard subsystems that have not separate buttons. - -### 14\. What's inside - -The adminbook is based on the Core i5-7Y57 CPU (Kaby Lake architecture). Although it’s less of a CPU, but more of a real SOC (System On a Chip). That is, almost the entire computer (without peripherals) fits in one chip the size of a thumb nail (2x1.6 cm). - -It emits from 3.5W to 7W of heat (depends on the frequency). So, a passive cooling system is adequate in this case. - -8GB of RAM are installed by default, expandable up to 16GB. - -A 256GB M.2 2280 SSD, connected with two PCIe lanes, is used as the hard drive. - -Wi-Fi + Bluetooth and WWAN + GNSS adapters are also designed as M.2 modules. - -RAM, the hard drive and wireless adapters are located on the top of the motherboard and can be replaced by the user — just unscrew and lift the keyboard. - -The battery is assembled from four LP545590 cells and can also be replaced. - -SOC and other irreplaceable hardware are located on the bottom of the motherboard. The heating components for cooling are pressed directly against the case. - -External connectors are located on daughter boards connected to the motherboard via ribbon cables. That allows to release different versions of the adminbook based on the same motherboard. - -For example, one of the possible version: - -![](https://habrastorage.org/webt/j9/sw/vq/j9swvqfi1-ituc4u9nr6-ijv3nq.jpeg) -Fig.14.1 — Adminbook A4 (front view) - -![](https://habrastorage.org/webt/pw/fq/ag/pwfqagvrluf1dbnmcd0rt-0eyc0.jpeg) -Fig.14.2 — Adminbook A4 (back view) - -![](https://habrastorage.org/webt/mn/ir/8i/mnir8in1pssve0m2tymevz2sue4.jpeg) -Fig.14.3 — Adminbook A4 (keyboard) - -This is an adminbook with a 12.5” display, its overall dimensions are 210x297mm (A4 paper format). The keyboard is full-size, with a standard key size (only the top row is a bit narrower). All the standard keys are there, except for the numpad and the Right Win, available with Fn keys. And trackpad added. - -### 15\. The underside of the adminbook - -Not expecting anything interesting from the bottom? But there is! - -First I will say a few words about the rubber feet. On my ThinkPad, they sometimes fall away and lost. I don't know if it's a bad glue, or a backpack is not suitable for a notebook, but it happens. - -Therefore, in the adminbook, the rubber feet are screwed in (the screws are slightly buried in rubber, so as not to scratch the tables). The feet are sufficiently streamlined so that they cling less to other objects. - -On the bottom there are visible drainage holes marked with a water drop. - -And the four threaded holes for connecting the adminbook with fasteners. - -![](https://habrastorage.org/webt/3d/q9/ku/3dq9kus6t7ql3rh5mbpfo3_xqng.jpeg) -Fig.15.1 — The underside of the adminbook - -Large hole in the center has a tripod thread. - -![](https://habrastorage.org/webt/t5/e5/ps/t5e5ps3iasu2j-22uc2rgl_5x_y.jpeg) -Fig.15.2 — Camera clamp mount - -Why is it necessary? Because sometimes you have to hang on high, holding the mast with one hand, holding the notebook with the second, and typing something on the third… Unfortunately, I am not Shiva, so these tricks are not easy for me. And you can just screw the adminbook by a camera mount to any protruding part of the structure and free your hands! - -No protruding parts? No problem. A plate with neodymium magnets is screwed to three other holes and the adminbook is magnetised to any steel surface — even vertical! As you see, opening the display by 180° is pretty useful. - -![](https://habrastorage.org/webt/ua/28/ub/ua28ubhpyrmountubiqjegiibem.jpeg) -Fig.15.3 — Fastening with magnets and shaped holes for nails / screws - -And if there is no metal? For example, working on the roof, and next to only a wooden wall. Then you can screw 1-2 screws in the wall and hang the adminbook on them. To do this, there are special slots in the mount, plus an eyelet on the handle. - -For especially difficult cases, there’s an arm mount. This is not very convenient, but better than nothing. Besides, it allows you to navigate even with a working notebook. - -![](https://habrastorage.org/webt/tp/fo/0y/tpfo0y_8gku4bmlbeqwfux1j4me.jpeg) -Fig.15.4 — Arm mount - -In general, these three holes use a regular metric thread, specifically so that you can make some DIY fastening and fasten it with ordinary screws. - -Except fasteners, an additional radiator can be screwed to these holes, so that you can work for a long time under high load or at high ambient temperature. - -![](https://habrastorage.org/webt/k4/jo/eq/k4joeqhmaxgvzhnxno6z3alg5go.jpeg) -Fig.15.5 — Adminbook with additional radiator - -### 16\. Accessories - -The adminbook has some unique features, and some of them are implemented using equipment designed specifically for the adminbook. Therefore, these accessories are immediately included. However, non-unique accessories are also available immediately. - -Here is a complete list of both: - - * fasteners with magnets - * arm mount - * heatsink - * screen blinds covering it from sunlight - * HD Mini SAS to U.2 cable - * combined adapter from U.2 to M.2 and PCIe - * power cable, terminated by coaxial 5.5x2.5mm connectors - * adapter from power cable to cigarette lighter - * adapter from power cable to crocodile clips - * different adapters from the power cable to coaxial connectors - * universal power supply and power cord from it into the outlet - - - -### 17\. Power supply - -Since this is a power supply for a system administrator's notebook, it would be nice to make it universal, capable of powering various electronic devices. Fortunately, the vast majority of devices are connected via coaxial connectors or USB. I mean devices with external power supplies: routers, switches, notebooks, nettops, single-board computers, DVRs, IPTV set top boxes, satellite tuners and more. - -![](https://habrastorage.org/webt/jv/zs/ve/jvzsveqavvi2ihuoajjnsr1xlp0.jpeg) -Fig.17.1 — Adapters from 5.5x2.5mm coaxial connector to other types of connectors - -There aren’t many connector types, which allows to get by with an adjustable-voltage PSU and adapters for the necessary connectors. It also needs to support various power delivery standards. - -In our case, the power supply supports the following modes: - - * Power Delivery — displayed as **[pd]** - * Quick Charge **[qc]** - * 802.3af/at **[at]** - * voltage from 5 to 54 volts in 0.5V increments (displayed voltage) - - - -![](https://habrastorage.org/webt/fj/jm/qv/fjjmqvdhezywuyh9ew3umy9wgmg.jpeg) -Fig.17.2 — Mode display on the 7-segment indicator (1.9. = 19.5V) - -![](https://habrastorage.org/webt/h9/zg/u0/h9zgu0ngl01rvhgivlw7fb49gpq.jpeg) -Fig.17.3 — Front and top sides of power supply - -USB outputs on the power supply (5V 2A) are always on. On the other outputs the voltage is applied by pressing the ON/OFF button. - -The desired mode is selected with the MODE button and this selection is remembered even when the power is turned off. The modes are listed like this: pd, qc, at, then a series of voltages. - -Voltage increases by pressing and holding the MODE button, decreases by short pressing. Step to the right — 1 Volt, step to the left — 0.5 Volt. Half a volt is needed because some equipment requires, for example, 19.5 volts. These half volts are displayed on the display with decimal points (19V -> **[19]** , 19.5V -> **[1.9.]** ). - -When power is on, the green LED is on. When a short-circuit or overcurrent protection is triggered, **[SH]** is displayed, and the LED lights up red. - -In the Power Delivery and Quick Charge modes, voltage is applied to the USB outputs (Type A and Type C). Only one of them can be used at one time. - -In 802.3af/at modes, the power supply acts as an injector, combining the supply voltage with data from the LAN connector and supplying it to the POE connector. Power is supplied only if a device with 802.3af or 802.3at support is plugged into the POE connector. - -But in the simple voltage supply mode, electricity throu the POE connector is issued immediately, without any checks. This is the so-called Passive POE — positive charge goes to conductors 4 and 5, and negative charge to conductors 7 and 8. At the same time, the voltage is applied to the coaxial connector. Adapters for various types of connectors are used in this mode. - -The power supply unit has a built-in button to remotely reset Ubiquity access points. This is a very useful feature that allows you to reset the antenna to factory settings without having to climb on the mast. I don’t know — is any other manufacturers support a feature like this? - -The power supply also has the passive wiremap adapter, which allows you to determine the correct Ethernet cable crimping. The active part is located in the Ethernet ports of the adminbook. - -![](https://habrastorage.org/webt/pp/bm/ws/ppbmws4g1o5j05eyqqulnwuuwge.jpeg) -Fig.17.4 — Back side and wiremap adapter - -Of course, the network cable tester built into the adminbook will not replace a professional OTDR, but for most tasks it will be enough. - -To prevent overheating, part of the PSU’s body acts as an aluminum heatsink. Power supply power — 65 watts, size 10x5x4cm. - -### 18\. Afterword - -“It won’t fit into such a small case!” — the sceptics will probably say. To be frank, I also sometimes think that way when re-reading what I wrote above. - -And then I open the 3D model and see, that all parts fits. Of course, I am not an electronic engineer, and for sure I miss some important things. But, I hope that if there are mistakes, they are “overcorrections”. That is, real engineers would fit all of that into a case even smaller. - -By and large, the adminbook can be divided into 5 functional parts: - - * the usual part, as in all notebooks — processor, memory, hard drive, etc. - * keyboard and trackpoint that can work separately - * autonomous video subsystem - * subsystem for managing non-standard features (enable / disable POE, infrared remote control, PCIe mode switching, LAN testing, etc.) - * power subsystem - - - -If we consider them separately, then everything looks quite feasible. - -The **SOC Kaby Lake** contains a CPU, a graphics accelerator, a memory controller, PCIe, SATA controller, USB controller for 6 USB3 and 10 USB2 outputs, Gigabit Ethernet controller, 4 lanes to connect webcams, integrated audio and etc. - -All that remains is to trace the lanes to connectors and supply power to it. - -**Keyboard and trackpoint** is a separate module that connects via USB to the adminbook or to an external connector. Nothing complicated here: USB and Bluetooth keyboards are very widespread. In our case, in addition, needs to make a rewritable table of scan codes and transfer non-standard keys over a separate interface other than USB. - -**The video subsystem** receives the video signal from the adminbook or from external connectors. In fact, this is a regular monitor with a video switchboard plus a couple of VGA converters. - -**Non-standard features** are managed independently of the operating system. The easiest way to do it with via a separate microcontroller which receives codes for pressing non-standard keys (those that are pressed with Fn) and performs the corresponding actions. - -Since you have to display a menu to change the settings, the microcontroller has a video output, connected to the adminbook for the duration of the setup. - -**The internal PSU** is galvanically isolated from the rest of the system. Why not? On habr.com there was an article about making a 100W, 9.6mm thickness planar transformer! And it only costs $0.5. - -So the electronic part of the adminbook is quite feasible. There is the programming part, and I don’t know which part will harder. - -This concludes my fairly long article. It long, even though I simplified, shortened and threw out minor details. - -The ideal end of the article was a link to an online store where you can buy an adminbook. But it's not yet designed and released. Since this requires money. - -Unfortunately, I have no experience with Kickstarter or Indigogo. Maybe you have this experience? Let's do it together! - -### Update - -Many people asked for a simplified version. Ok. Done. Sorry — just a 3d model, without render. - -Deleted: second LAN adapter, micro SD card reader, one USB port Type C, second camera, camera lights and camera curtines, display latch, unnecessary audio connectors. - -Also in this version there will be no infrared remote control, a reprogrammable keyboard, QC 3.0 charging standard, and getting power by POE. - -![](https://habrastorage.org/webt/3l/lg/vm/3llgvmv4pebiruzgldqckab0uyc.jpeg) -![](https://habrastorage.org/webt/sp/x6/rv/spx6rvmn6zlumbwg46xwfmjnako.jpeg) -![](https://habrastorage.org/webt/sm/g0/xz/smg0xzdspfm3vr3gep__6bcqae8.jpeg) - - --------------------------------------------------------------------------------- - -via: https://habr.com/en/post/437912/ - -作者:[sukhe][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://habr.com/en/users/sukhe/ -[b]: https://github.com/lujun9972 -[1]: https://habrastorage.org/webt/_1/mp/vl/_1mpvlyujldpnad0cvvzvbci50y.jpeg -[2]: https://habrastorage.org/webt/mr/m6/d3/mrm6d3szvghhpghfchsl_-lzgb4.jpeg diff --git a/sources/tech/20190129 How To Configure System-wide Proxy Settings Easily And Quickly.md b/sources/tech/20190129 How To Configure System-wide Proxy Settings Easily And Quickly.md deleted file mode 100644 index 0848111d08..0000000000 --- a/sources/tech/20190129 How To Configure System-wide Proxy Settings Easily And Quickly.md +++ /dev/null @@ -1,309 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How To Configure System-wide Proxy Settings Easily And Quickly) -[#]: via: (https://www.ostechnix.com/how-to-configure-system-wide-proxy-settings-easily-and-quickly/) -[#]: author: (SK https://www.ostechnix.com/author/sk/) - -How To Configure System-wide Proxy Settings Easily And Quickly -====== - -![](https://www.ostechnix.com/wp-content/uploads/2019/01/ProxyMan-720x340.png) - -Today, we will be discussing a simple, yet useful command line utility named **“ProxyMan”**. As the name says, it helps you to apply and manage proxy settings on our system easily and quickly. Using ProxyMan, we can set or unset proxy settings automatically at multiple points, without having to configure them manually one by one. It also allows you to save the settings for later use. In a nutshell, ProxyMan simplifies the task of configuring system-wide proxy settings with a single command. It is free, open source utility written in **Bash** and standard POSIX tools, no dependency required. ProxyMan can be helpful if you’re behind a proxy server and you want to apply the proxy settings system-wide in one go. - -### Installing ProxyMan - -Download the latest ProxyMan version from the [**releases page**][1]. It is available as zip and tar file. I am going to download zip file. - -``` -$ wget https://github.com/himanshub16/ProxyMan/archive/v3.1.1.zip -``` - -Extract the downloaded zip file: - -``` -$ unzip v3.1.1.zip -``` - -The above command will extract the contents in a folder named “ **ProxyMan-3.1.1** ” in your current working directory. Cd to that folder and install ProxyMan as shown below: - -``` -$ cd ProxyMan-3.1.1/ - -$ ./install -``` - -If you see **“Installed successfully”** message as output, congratulations! ProxyMan has been installed. - -Let us go ahead and see how to configure proxy settings. - -### Configure System-wide Proxy Settings - -ProxyMan usage is pretty simple and straight forward. Like I already said, It allows us to set/unset proxy settings, list current proxy settings, list available configs, save settings in a profile and load profile later. Proxyman currently manages proxy settings for **GNOME gsettings** , **bash** , **apt** , **dnf** , **git** , **npm** and **Dropbox**. - -**Set proxy settings** - -To set proxy settings system-wide, simply run: - -``` -$ proxyman set -``` - -You will asked to answer a series of simple questions such as, - - 1. HTTP Proxy host IP address, - 2. HTTP port, - 3. Use username/password authentication, - 4. Use same settings for HTTPS and FTP, - 5. Save profile for later use, - 6. Finally, choose the list of targets to apply the proxy settings. You can choose all at once or separate multiple choices with space. - - - -Sample output for the above command: - -``` -Enter details to set proxy -HTTP Proxy Host 192.168.225.22 -HTTP Proxy Port 8080 -Use auth - userid/password (y/n)? n -Use same for HTTPS and FTP (y/n)? y -No Proxy (default localhost,127.0.0.1,192.168.1.1,::1,*.local) -Save profile for later use (y/n)? y -Enter profile name : proxy1 -Saved to /home/sk/.config/proxyman/proxy1. - -Select targets to modify -| 1 | All of them ... Don't bother me -| 2 | Terminal / bash / zsh (current user) -| 3 | /etc/environment -| 4 | apt/dnf (Package manager) -| 5 | Desktop settings (GNOME/Ubuntu) -| 6 | npm & yarn -| 7 | Dropbox -| 8 | Git -| 9 | Docker - -Separate multiple choices with space -? 1 -Setting proxy... -To activate in current terminal window -run source ~/.bashrc -[sudo] password for sk: -Done -``` - -**List proxy settings** - -To view the current proxy settings, run: - -``` -$ proxyman list -``` - -Sample output: - -``` -Hmm... listing it all - -Shell proxy settings : /home/sk/.bashrc -export http_proxy="http://192.168.225.22:8080/" -export ftp_proxy="ftp://192.168.225.22:8080/" -export rsync_proxy="rsync://192.168.225.22:8080/" -export no_proxy="localhost,127.0.0.1,192.168.1.1,::1,*.local" -export HTTP_PROXY="http://192.168.225.22:8080/" -export FTP_PROXY="ftp://192.168.225.22:8080/" -export RSYNC_PROXY="rsync://192.168.225.22:8080/" -export NO_PROXY="localhost,127.0.0.1,192.168.1.1,::1,*.local" -export https_proxy="/" -export HTTPS_PROXY="/" - -git proxy settings : -http http://192.168.225.22:8080/ -https https://192.168.225.22:8080/ - -APT proxy settings : -3 -Done -``` - -**Unset proxy settings** - -To unset proxy settings, the command would be: - -``` -$ proxyman unset -``` - -You can unset proxy settings for all targets at once by entering number **1** or enter any given number to unset proxy settings for the respective target. - -``` -Select targets to modify -| 1 | All of them ... Don't bother me -| 2 | Terminal / bash / zsh (current user) -| 3 | /etc/environment -| 4 | apt/dnf (Package manager) -| 5 | Desktop settings (GNOME/Ubuntu) -| 6 | npm & yarn -| 7 | Dropbox -| 8 | Git -| 9 | Docker - -Separate multiple choices with space -? 1 -Unset all proxy settings -To activate in current terminal window -run source ~/.bashrc -Done -``` - -To apply the changes, simply run: - -``` -$ source ~/.bashrc -``` - -On ZSH, use this command instead: - -``` -$ source ~/.zshrc -``` - -To verify if the proxy settings have been removed, simply run “proxyman list” command: - -``` -$ proxyman list -Hmm... listing it all - -Shell proxy settings : /home/sk/.bashrc -None - -git proxy settings : -http -https - -APT proxy settings : -None -Done -``` - -As you can see, there is no proxy settings for all targets. - -**View list of configs (profiles)** - -Remember we saved proxy settings as a profile in the “Set proxy settings” section? You can view the list of available profiles with command: - -``` -$ proxyman configs -``` - -Sample output: - -``` -Here are available configs! -proxy1 -Done -``` - -As you can see, we have only one profile i.e **proxy1**. - -**Load profiles** - -The profiles will be available until you delete them permanently, so you can load a profile (E.g proxy1) at any time using command: - -``` -$ proxyman load proxy1 -``` - -This command will list the proxy settings for proxy1 profile. You can apply these settings to all or multiple targets by entering the respective number with space-separated. - -``` -Loading profile : proxy1 -HTTP > 192.168.225.22 8080 -HTTPS > 192.168.225.22 8080 -FTP > 192.168.225.22 8080 -no_proxy > localhost,127.0.0.1,192.168.1.1,::1,*.local -Use auth > n -Use same > y -Config > -Targets > -Select targets to modify -| 1 | All of them ... Don't bother me -| 2 | Terminal / bash / zsh (current user) -| 3 | /etc/environment -| 4 | apt/dnf (Package manager) -| 5 | Desktop settings (GNOME/Ubuntu) -| 6 | npm & yarn -| 7 | Dropbox -| 8 | Git -| 9 | Docker - -Separate multiple choices with space -? 1 -Setting proxy... -To activate in current terminal window -run source ~/.bashrc -Done -``` - -Finally, activate the changes using command: - -``` -$ source ~/.bashrc -``` - -For ZSH: - -``` -$ source ~/.zshrc -``` - -**Deleting profiles** - -To delete a profile, run: - -``` -$ proxyman delete proxy1 -``` - -Output: - -``` -Deleting profile : proxy1 -Done -``` - -To display help, run: - -``` -$ proxyman help -``` - - -### Conclusion - -Before I came to know about Proxyman, I used to apply proxy settings manually at multiple places, for example package manager, web browser etc. Not anymore! ProxyMan did this job automatically in couple seconds. - -And, that’s all for now. Hope this was useful. More good stuffs to come. Stay tuned. - -Cheers! - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/how-to-configure-system-wide-proxy-settings-easily-and-quickly/ - -作者:[SK][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: https://github.com/himanshub16/ProxyMan/releases/ diff --git a/sources/tech/20190129 You shouldn-t name your variables after their types for the same reason you wouldn-t name your pets -dog- or -cat.md b/sources/tech/20190129 You shouldn-t name your variables after their types for the same reason you wouldn-t name your pets -dog- or -cat.md deleted file mode 100644 index 75ad9e93c6..0000000000 --- a/sources/tech/20190129 You shouldn-t name your variables after their types for the same reason you wouldn-t name your pets -dog- or -cat.md +++ /dev/null @@ -1,83 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (You shouldn’t name your variables after their types for the same reason you wouldn’t name your pets “dog” or “cat”) -[#]: via: (https://dave.cheney.net/2019/01/29/you-shouldnt-name-your-variables-after-their-types-for-the-same-reason-you-wouldnt-name-your-pets-dog-or-cat) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -You shouldn’t name your variables after their types for the same reason you wouldn’t name your pets “dog” or “cat” -====== - -The name of a variable should describe its contents, not the _type_ of the contents. Consider this example: - -``` -var usersMap map[string]*User -``` - -What are some good properties of this declaration? We can see that it’s a map, and it has something to do with the `*User` type, so that’s probably good. But `usersMap` _is_ a map and Go, being a statically typed language, won’t let us accidentally use a map where a different type is required, so the `Map` suffix as a safety precaution is redundant. - -Now, consider what happens if we declare other variables using this pattern: - -``` -var ( - companiesMap map[string]*Company - productsMap map[string]*Products -) -``` - -Now we have three map type variables in scope, `usersMap`, `companiesMap`, and `productsMap`, all mapping `string`s to different `struct` types. We know they are maps, and we also know that their declarations prevent us from using one in place of another—​the compiler will throw an error if we try to use `companiesMap` where the code is expecting a `map[string]*User`. In this situation it’s clear that the `Map` suffix does not improve the clarity of the code, its just extra boilerplate to type. - -My suggestion is avoid any suffix that resembles the _type_ of the variable. Said another way, if `users` isn’t descriptive enough, then `usersMap` won’t be either. - -This advice also applies to function parameters. For example: - -``` -type Config struct { - // -} - -func WriteConfig(w io.Writer, config *Config) -``` - -Naming the `*Config` parameter `config` is redundant. We know it’s a pointer to a `Config`, it says so right there in the declaration. Instead consider if `conf` will do, or maybe just `c` if the lifetime of the variable is short enough. - -This advice is more than just a desire for brevity. If there is more that one `*Config` in scope at any one time, calling them `config1` and `config2` is less descriptive than calling them `original` and `updated` . The latter are less likely to be accidentally transposed—something the compiler won’t catch—while the former differ only in a one character suffix. - -Finally, don’t let package names steal good variable names. The name of an imported identifier includes its package name. For example the `Context` type in the `context` package will be known as `context.Context` when imported into another package . This makes it impossible to use `context` as a variable or type, unless of course you rename the import, but that’s throwing good after bad. This is why the local declaration for `context.Context` types is traditionally `ctx`. eg. - -``` -func WriteLog(ctx context.Context, message string) -``` - -* * * - -A variable’s name should be independent of its type. You shouldn’t name your variables after their types for the same reason you wouldn’t name your pets “dog” or “cat”. You shouldn’t include the name of your type in the name of your variable for the same reason. - -### Related posts: - - 1. [On declaring variables][1] - 2. [Go, without package scoped variables][2] - 3. [A whirlwind tour of Go’s runtime environment variables][3] - 4. [Declaration scopes in Go][4] - - - --------------------------------------------------------------------------------- - -via: https://dave.cheney.net/2019/01/29/you-shouldnt-name-your-variables-after-their-types-for-the-same-reason-you-wouldnt-name-your-pets-dog-or-cat - -作者:[Dave Cheney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://dave.cheney.net/author/davecheney -[b]: https://github.com/lujun9972 -[1]: https://dave.cheney.net/2014/05/24/on-declaring-variables (On declaring variables) -[2]: https://dave.cheney.net/2017/06/11/go-without-package-scoped-variables (Go, without package scoped variables) -[3]: https://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables (A whirlwind tour of Go’s runtime environment variables) -[4]: https://dave.cheney.net/2016/12/15/declaration-scopes-in-go (Declaration scopes in Go) diff --git a/sources/tech/20190131 VA Linux- The Linux Company That Once Ruled NASDAQ.md b/sources/tech/20190131 VA Linux- The Linux Company That Once Ruled NASDAQ.md deleted file mode 100644 index 78e0d0ecfd..0000000000 --- a/sources/tech/20190131 VA Linux- The Linux Company That Once Ruled NASDAQ.md +++ /dev/null @@ -1,147 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (VA Linux: The Linux Company That Once Ruled NASDAQ) -[#]: via: (https://itsfoss.com/story-of-va-linux/) -[#]: author: (Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/) - -VA Linux: The Linux Company That Once Ruled NASDAQ -====== - -This is our first article in the Linux and open source history series. We will be covering more trivia, anecdotes and other nostalgic events from the past. - -At its time, _VA Linux_ was indeed a crusade to free the world from Microsoft’s domination. - -On a historical incident in December 1999, the shares of a private firm skyrocketed from just $30 to a whopping $239 within just a day of its [IPO][1]! It was a record-breaking development that day. - -The company was _VA Linux_ , a firm with only 200 employees that was based on the idea of deploying Intel Hardware with Linux and FOSS, had begun a fantastic journey [on the likes of Sun and Dell][2]. - -It traded with a symbol LNUX and gained around 700 percent on its first day of trading. But hardly one year later, the [LNUX stocks were selling below $9 per share][3]. - -How come a successful Linux based company become a subsidiary of [Gamestop][4], a gaming company? - -Let us look back into the highs and lows of this record-breaking Linux corporation by knowing their history in brief. - -### How did it all actually begin? - -In the year 1993, a graduate student at Stanford University wanted to own a powerful workstation but could not afford to buy expensive [Sun][5] Workstations, which used to be sold at extremely high prices of $7,000 per system at that time. - -So, he decided to do build one on his own ([DIY][6] [FTW][7]!). Using an Intel 486-chip running at just 33 megahertz, he installed Linux and finally had a machine that was twice as fast as Sun’s but at a much lower price tag: $2,000. - -That student was none other than _VA Research_ founder [Larry Augustin][8], whose idea was loved by many at that exciting time in the Stanford campus. People started buying machines with similar configurations from him and his friend and co-founder, James Vera. This is how _VA Research_ was formed. - -![VA Linux founder, Larry Augustin][9] - -> Once software goes into the GPL, you can’t take it back. People can stop contributing, but the code that exists, people can continue to develop on it. -> -> Without a doubt, a futuristic quote from VA Linux founder, Larry Augustin, 10 years ago | Read the whole interview [here][10] - -#### Some screenshots of their web domains from the early days - -![Linux Powered Machines on sale on varesearch.com | July 15, 1997][11] - -![varesearch.com reveals emerging growth | February 16, 1998][12] - -![On June 26, 2001, they transitioned from hardware to software | valinux.com as on June 22, 2001][13] - -### The spectacular rise and the devastating fall of VA Linux - -VA Research had a big year in 1999 and perhaps it was the biggest for them as they acquired many growing companies and competitors at that time, along with starting many innovative initiatives. The next year in 2000, they created a subsidiary in Japan named _VA Linux Systems Japan K.K._ They were at their peak that year. - -After they transitioned completely from hardware to software, stock prices started to fall drastically since 2002. It all happened because of slower-than-expected sales growth from new customers in the dot-com sector. In the later years they sold off a few brands and top employees also resigned in 2010. - -Gamestop finally [acquired][14] Geeknet Inc. (the new name of VA Linux) for $140 million on June 2, 2015. - -In case you’re curious for a detailed chronicle, I have separately created this [timeline][15], highlighting events year-wise. - -![Image Credit: Wikipedia][16] - -### What happened to VA Linux afterward? - -Geeknet owned by Gamestop is now an online retailer for the global geek community as [ThinkGeek][17]. - -SourceForge and Slashdot were what still kept them linked with Linux and Open Source until _Dice Holdings_ acquired Slashdot, SourceForge, and Freecode. - -An [article][18] from 2016 sadly quotes in its final paragraph: - -> “Being acquired by a company that caters to gamers and does not have anything in particular to do with open source software may be a lackluster ending for what was once a spectacularly valuable Linux business.” - -Did we note Linux and Gamers? Does Linux really not have anything to do with Gaming? Are these two terms really so far apart? What about [Gaming on Linux][19]? What about [Open Source Games][20]? - -How could have the stalwarts from _VA Linux_ with years and years of experience in the Linux arena contributed to the Linux Gaming community? What could have happened had [Valve][21] (who are currently so [dedicated][22] towards Linux Gaming) acquired _VA Linux_ instead of Gamestop? Can we ponder? - -The seeds of ideas that were planted by _VA Research_ will continue to inspire the Linux and FOSS community because of its significant contributions in the world of Open Source. At _It’s FOSS,_ our heartfelt salute goes out to those noble ideas! - -Want to feel the nostalgia? Use the [timeline][15] dates with the [Way Back Machine][23] to check out previously owned _VA_ domains like _valinux.com_ or _varesearch.com_ in the past three decades! You can even check _linux.com_ that was once owned by _VA Linux Systems_. - -But wait, are we really done here? What happened to the subsidiary named _VA Linux Systems Japan K.K._? Well, it’s [a different story there][24] and still going strong with the original ideologies of _VA Linux_! - -![VA Linux booth circa 2000 | Image Credit: Storem][25] - -#### _VA Linux_ Subsidiary Still Operational in Japan! - -VA Linux is still operational through its [Japanese subsidiary][26]. It provides the following services: - - * Failure Analysis and Support Services: [_VA Quest_][27] - * Entrusted Development Service - * Consulting Service - - - -_VA_ _Quest_ , in particular, continues its services as a failure-analysis solution for tracking down and dealing with kernel bugs which might be getting in its customers’ way since 2005. [Tetsuro Yogo][28] took over as the New President and CEO on April 3, 2017. Check out their timeline [here][29]! They are also [on GitHub][30]! - -You can also read about a recent development reported on August 2 last year, on this [translated][31] version of a Japanese IT news page. It’s an update about _VA Linux_ providing technical support service of “[Kubernetes][32]” container management software in Japan. - -Its good to know that their 18-year-old subsidiary is still doing well in Japan and the name of _VA Linux_ continues to flourish there even today! - -What are your views? Do you want to share anything on _VA Linux_? Please let us know in the comments section below. - -I hope you liked this first article in the Linux history series. If you know such interesting facts from the past that you would like us to cover here, please let us know. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/story-of-va-linux/ - -作者:[Avimanyu Bandyopadhyay][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/avimanyu/ -[b]: https://github.com/lujun9972 -[1]: https://en.wikipedia.org/wiki/Initial_public_offering -[2]: https://www.forbes.com/1999/05/03/feat.html -[3]: https://www.channelfutures.com/open-source/open-source-history-the-spectacular-rise-and-fall-of-va-linux -[4]: https://www.gamestop.com/ -[5]: http://www.sun.com/ -[6]: https://en.wikipedia.org/wiki/Do_it_yourself -[7]: https://www.urbandictionary.com/define.php?term=FTW -[8]: https://www.linkedin.com/in/larryaugustin/ -[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/09/VA-Linux-Founder-Larry-Augustin.jpg?ssl=1 -[10]: https://www.linuxinsider.com/story/SourceForges-Larry-Augustin-A-Better-Way-to-Build-Web-Apps-62155.html -[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/09/VA-Research-com-Snapshot-July-15-1997.jpg?ssl=1 -[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/09/VA-Research-com-Snapshot-Feb-16-1998.jpg?ssl=1 -[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/09/VA-Linux-com-Snapshot-June-22-2001.jpg?ssl=1 -[14]: http://geekgirlpenpals.com/geeknet-parent-company-to-thinkgeek-entered-agreement-with-gamestop/ -[15]: https://medium.com/@avimanyu786/a-timeline-of-va-linux-through-the-years-6813e2bd4b13 -[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/LNUX-stock-fall.png?ssl=1 -[17]: https://www.thinkgeek.com/ -[18]: https://www.channelfutures.com/open-source/open-source-history-spectacular-rise-and-fall-va-linux -[19]: https://itsfoss.com/linux-gaming-distributions/ -[20]: https://en.wikipedia.org/wiki/Open-source_video_game -[21]: https://www.valvesoftware.com/ -[22]: https://itsfoss.com/steam-play-proton/ -[23]: https://archive.org/web/web.php -[24]: https://translate.google.com/translate?sl=auto&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=https%3A%2F%2Fwww.valinux.co.jp%2Fcorp%2Fstatement%2F&edit-text= -[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/va-linux-team-booth.jpg?resize=800%2C600&ssl=1 -[26]: https://www.valinux.co.jp/english/ -[27]: https://www.linux.com/news/va-linux-announces-linux-failure-analysis-service -[28]: https://www.linkedin.com/in/yogo45/ -[29]: https://www.valinux.co.jp/english/about/timeline/ -[30]: https://github.com/vaj -[31]: https://translate.google.com/translate?sl=auto&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=https%3A%2F%2Fit.impressbm.co.jp%2Farticles%2F-%2F16499 -[32]: https://en.wikipedia.org/wiki/Kubernetes diff --git a/sources/tech/20190202 CrossCode is an Awesome 16-bit Sci-Fi RPG Game.md b/sources/tech/20190202 CrossCode is an Awesome 16-bit Sci-Fi RPG Game.md deleted file mode 100644 index 15349fbf32..0000000000 --- a/sources/tech/20190202 CrossCode is an Awesome 16-bit Sci-Fi RPG Game.md +++ /dev/null @@ -1,98 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (CrossCode is an Awesome 16-bit Sci-Fi RPG Game) -[#]: via: (https://itsfoss.com/crosscode-game/) -[#]: author: (Phillip Prado https://itsfoss.com/author/phillip/) - -CrossCode is an Awesome 16-bit Sci-Fi RPG Game -====== - -What starts off as an obvious sci-fi 16-bit 2D action RPG quickly turns into a JRPG inspired pseudo-MMO open-world puzzle platformer. Though at first glance this sounds like a jumbled mess, [CrossCode][1] manages to bundle all of its influences into a seamless gaming experience that feels nothing shy of excellent. - -Note: CrossCode is not open source software. We have covered it because it is Linux specific. - -![][2] - -### Story - -You play as Lea, a girl who has forgotten her identity, where she comes from, and how to speak. As you walk through the early parts of the story, you come to find that you are a character in a digital world — a video game. But not just any video game — an MMO. And you, Lea, must venture into the digital world known as CrossWorlds in order to unravel the secrets of your past. - -As you progress through the game, you unveil more and more about yourself, learning how you got to this point in the first place. This doesn’t sound too crazy of a story, but the gameplay implementation and appropriately paced storyline make for quite a captivating experience. - -The story unfolds at a satisfying speed and the character’s development is genuinely gratifying — both fictionally and mechanically. The only critique I had was that it felt like the introductory segment took a little too long — dragging the tutorial into the gameplay for quite some time, and keeping the player from getting into the real meat of the game. - -All-in-all, CrossCode’s story did not leave me wanting, not even in the slightest. It’s deep, fun, heartwarming, intelligent, and all while never sacrificing great character development. Without spoiling anything, I will say that if you are someone that enjoys a good story, you will need to give CrossCode a look. - -![][3] - -### Gameplay - -Yes, the story is great and all, but if there is one place that CrossCode truly shines, it has to be its gameplay. The game’s mechanics are fast-paced, challenging, intuitive, and downright fun! - -You start off with a dodge, block, melee, and ranged attack, each slowly developing overtime as the character tree is unlocked. This all-too-familiar mix of combat elements balances skill and hack-n-slash mechanics in a way that doesn’t conflict with one another. - -The game utilizes this mix of skills to create some amazing puzzle solving and combat that helps CrossCode’s gameplay truly stand out. Whether you are making your way through one of the four main dungeons, or you are taking a boss head on, you can’t help but periodically stop and think “wow, this game is great!” - -Though this has to be the game’s strongest feature, it can also be the game’s biggest downfall. Part of the reason that the story and character progression is so satisfying is because the combat and puzzle mechanics can be incredibly challenging, and that’s putting it lightly. - -There are times in which CrossCode’s gameplay feels downright impossible. Bosses take an expert amount of focus, and dungeons require all of the patience you can muster up just to simply finish them. - -![][4] - -The game requires a type of dexterity I have not quite had to master yet. I mean, sure there are more challenging puzzle games out there, yes there are more difficult platformers, and of course there are more grueling RPGs, but adding all of these elements into one game while spurring the player along with an alluring story requires a level of mechanical balance that I haven’t found in many other games. - -And though there were times I felt the gameplay was flat out punishing, I was constantly reminded that this is simply not the case. Death doesn’t cause serious character regression, you can take a break from dungeons when you feel overwhelmed, and there is a plethora of checkpoints throughout the game’s most difficult parts to help the player along. - -Where other games fall short by giving the player nothing to lose, this reality redeems CrossCode amid its rigorous gameplay. CrossCode may be one of the only games I know that takes two common flaws in games and holds the tension between them so well that it becomes one of the game’s best strengths. - -![][5] - -### Design - -One of the things that surprised me most about CrossCode was how well it’s world and sound design come together. Right off the bat, from the moment you boot the game up, it is clear the developers meant business when designing CrossCode. - -Being in a fictional MMO world, the game’s character ensemble is vibrant and distinctive, each having its own tone and personality. The games sound and motion graphics are tactile and responsive, giving the player a healthy amount of feedback during gameplay. And the soundtrack behind the game is simply beautiful, ebbing and flowing between intense moments of combat to blissful moments of exploration. - -If I had to fault CrossCode in this category it would have to be in the size of the map. Yes, the dungeons are long, and yes, the CrossWorlds map looks gigantic, but I still wanted more to explore outside crippling dungeons. The game is beautiful and fluid, but akin to RPG games of yore — aka. Zelda games pre-Breath of the Wild — I wish there was just a little more for me to freely explore. - -It is obvious that the developers really cared about this aspect of the game, and you can tell they spent an incredible amount of time developing its design. CrossCode set itself up for success here in its plot and content, and the developers capitalize on the opportunity, knocking another category out of the park. - -![][6] - -### Conclusion - -In the end, it is obvious how I feel about this game. And just in case you haven’t caught on yet…I love it. It holds a near perfect balance between being difficult and rewarding, simple and complex, linear and open, making CrossCode one of [the best Linux games][7] out there. - -Developed by [Radical Fish Games][8], CrossCode was officially released for Linux on September 21, 2018, seven years after development began. You can pick up the game over on [Steam][9], [GOG][10], or [Humble Bundle][11]. - -If you play games regularly, you may want to [subscribe to Humble Monthly][12] ([affiliate][13] link). For $12 per month, you’ll get games worth over $100 (not all for Linux). Over 450,000 gamers worldwide use Humble Monthly. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/crosscode-game/ - -作者:[Phillip Prado][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/phillip/ -[b]: https://github.com/lujun9972 -[1]: http://www.cross-code.com/en/home -[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/CrossCode-Level-up.png?fit=800%2C451&ssl=1 -[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/CrossCode-Equpiment.png?fit=800%2C451&ssl=1 -[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/CrossCode-character-development.png?fit=800%2C451&ssl=1 -[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/CrossCode-Environment.png?fit=800%2C451&ssl=1 -[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/CrossCode-dungeon.png?fit=800%2C451&ssl=1 -[7]: https://itsfoss.com/free-linux-games/ -[8]: http://www.radicalfishgames.com/ -[9]: https://store.steampowered.com/app/368340/CrossCode/ -[10]: https://www.gog.com/game/crosscode -[11]: https://www.humblebundle.com/store/crosscode -[12]: https://www.humblebundle.com/monthly?partner=itsfoss -[13]: https://itsfoss.com/affiliate-policy/ diff --git a/sources/tech/20190204 Top 5 open source network monitoring tools.md b/sources/tech/20190204 Top 5 open source network monitoring tools.md deleted file mode 100644 index 5b6e7f1bfa..0000000000 --- a/sources/tech/20190204 Top 5 open source network monitoring tools.md +++ /dev/null @@ -1,125 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Top 5 open source network monitoring tools) -[#]: via: (https://opensource.com/article/19/2/network-monitoring-tools) -[#]: author: (Paul Bischoff https://opensource.com/users/paulbischoff) - -Top 5 open source network monitoring tools -====== -Keep an eye on your network to avoid downtime with these monitoring tools. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mesh_networking_dots_connected.png?itok=ovINTRR3) - -Maintaining a live network is one of a system administrator's most essential tasks, and keeping a watchful eye over connected systems is essential to keeping a network functioning at its best. - -There are many different ways to keep tabs on a modern network. Network monitoring tools are designed for the specific purpose of monitoring network traffic and response times, while application performance management solutions use agents to pull performance data from the application stack. If you have a live network, you need network monitoring to make sure you aren't vulnerable to an attacker. Likewise, if you rely on lots of different applications to run your daily operations, you will need an [application performance management][1] solution as well. - -This article will focus on open source network monitoring tools. These tools help monitor individual nodes and applications for signs of poor performance. Through one window, you can view the performance of an entire network and even get alerts to keep you in the loop if you're away from your desk. - -Before we get into the top five network monitoring tools, let's look more closely at the reasons you need to use one. - -### Why do I need a network monitoring tool? - -Network monitoring tools are vital to maintaining networks because they allow you to keep an eye on devices connected to the network from a central location. These tools help flag devices with subpar performance so you can step in and run troubleshooting to get to the root of the problem. - -Running in-depth troubleshooting can minimize performance problems and prevent security breaches. In practical terms, this keeps the network online and eliminates the risk of falling victim to unnecessary downtime. Regular network maintenance can also help prevent outages that could take thousands of users offline. - -A network monitoring tool enables you to: - - * Autodiscover devices connected to your network - * View live and historic performance data for a range of devices and applications - * Configure alerts to notify you of unusual activity - * Generate graphs and reports to analyze network activity in greater depth - -### The top 5 open source network monitoring tools - -Now, that you know why you need a network monitoring tool, take a look at the top 5 open source tools to see which might best meet your needs. - -#### Cacti - -![](https://opensource.com/sites/default/files/uploads/cacti_network-monitoring-tools.png) - -If you know anything about open source network monitoring tools, you've probably heard of [Cacti][2]. It's a graphing solution that acts as an addition to [RRDTool][3] and is used by many network administrators to collect performance data in LANs. Cacti comes with Simple Network Management Protocol (SNMP) support on Windows and Linux to create graphs of traffic data. - -Cacti typically works by using data sourced from user-created scripts that ping hosts on a network. The values returned by the scripts are stored in a MySQL database, and this data is used to generate graphs. - -This sounds complicated, but Cacti has templates to help speed the process along. You can also create a graph or data source template that can be used for future monitoring activity. If you'd like to try it out, [download Cacti][4] for free on Linux and Windows. - -#### Nagios Core - -![](https://opensource.com/sites/default/files/uploads/nagioscore_network-monitoring-tools.png) - -[Nagios Core][5] is one of the most well-known open source monitoring tools. It provides a network monitoring experience that combines open source extensibility with a top-of-the-line user interface. With Nagios Core, you can auto-discover devices, monitor connected systems, and generate sophisticated performance graphs. - -Support for customization is one of the main reasons Nagios Core has become so popular. For example, [Nagios V-Shell][6] was added as a PHP web interface built in AngularJS, searchable tables and a RESTful API designed with CodeIgniter. - -If you need more versatility, you can check the Nagios Exchange, which features a range of add-ons that can incorporate additional features into your network monitoring. These range from the strictly cosmetic to monitoring enhancements like [nagiosgraph][7]. You can try it out by [downloading Nagios Core][8] for free. - -#### Icinga 2 - -![](https://opensource.com/sites/default/files/uploads/icinga2_network-monitoring-tools.png) - -[Icinga 2][9] is another widely used open source network monitoring tool. It builds on the groundwork laid by Nagios Core. It has a flexible RESTful API that allows you to enter your own configurations and view live performance data through the dashboard. Dashboards are customizable, so you can choose exactly what information you want to monitor in your network. - -Visualization is an area where Icinga 2 performs particularly well. It has native support for Graphite and InfluxDB, which can turn performance data into full-featured graphs for deeper performance analysis. - -Icinga2 also allows you to monitor both live and historical performance data. It offers excellent alerts capabilities for live monitoring, and you can configure it to send notifications of performance problems by email or text. You can [download Icinga 2][10] for free for Windows, Debian, DHEL, SLES, Ubuntu, Fedora, and OpenSUSE. - -#### Zabbix - -![](https://opensource.com/sites/default/files/uploads/zabbix_network-monitoring-tools.png) - -[Zabbix][11] is another industry-leading open source network monitoring tool, used by companies from Dell to Salesforce on account of its malleable network monitoring experience. Zabbix does network, server, cloud, application, and services monitoring very well. - -You can track network information such as network bandwidth usage, network health, and configuration changes, and weed out problems that need to be addressed. Performance data in Zabbix is connected through SNMP, Intelligent Platform Management Interface (IPMI), and IPv6. - -Zabbix offers a high level of convenience compared to other open source monitoring tools. For instance, you can automatically detect devices connected to your network before using an out-of-the-box template to begin monitoring your network. You can [download Zabbix][12] for free for CentOS, Debian, Oracle Linux, Red Hat Enterprise Linux, Ubuntu, and Raspbian. - -#### Prometheus - -![](https://opensource.com/sites/default/files/uploads/promethius_network-monitoring-tools.png) - -[Prometheus][13] is an open source network monitoring tool with a large community following. It was built specifically for monitoring time-series data. You can identify time-series data by metric name or key-value pairs. Time-series data is stored on local disks so that it's easy to access in an emergency. - -Prometheus' [Alertmanager][14] allows you to view notifications every time it raises an event. Alertmanager can send notifications via email, PagerDuty, or OpsGenie, and you can silence alerts if necessary. - -Prometheus' visual elements are excellent and allow you to switch from the browser to the template language and Grafana integration. You can also integrate various third-party data sources into Prometheus from Docker, StatsD, and JMX to customize your Prometheus experience. - -As a network monitoring tool, Prometheus is suitable for organizations of all sizes. The onboard integrations and the easy-to-use Alertmanager make it capable of handling any workload, regardless of its size. You can [download Prometheus][15] for free. - -### Which are best? - -No matter what industry you're working in, if you rely on a network to do business, you need to implement some form of network monitoring. Network monitoring tools are an invaluable resource that help provide you with the visibility to keep your systems online. Monitoring your systems will give you the best chance to keep your equipment in working order. - -As the tools on this list show, you don't need to spend an exorbitant amount of money to reap the rewards of network monitoring. Of the five, I believe Icinga 2 and Zabbix are the best options for providing you with everything you need to start monitoring your network to keep it online. Staying vigilant will help to minimize the change of being caught off-guard by performance issues. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/network-monitoring-tools - -作者:[Paul Bischoff][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/paulbischoff -[b]: https://github.com/lujun9972 -[1]: https://www.comparitech.com/net-admin/application-performance-management/ -[2]: https://www.cacti.net/index.php -[3]: https://en.wikipedia.org/wiki/RRDtool -[4]: https://www.cacti.net/download_cacti.php -[5]: https://www.nagios.org/projects/nagios-core/ -[6]: https://exchange.nagios.org/directory/Addons/Frontends-%28GUIs-and-CLIs%29/Web-Interfaces/Nagios-V-2DShell/details -[7]: https://exchange.nagios.org/directory/Addons/Graphing-and-Trending/nagiosgraph/details#_ga=2.79847774.890594951.1545045715-2010747642.1545045715 -[8]: https://www.nagios.org/downloads/nagios-core/ -[9]: https://icinga.com/products/icinga-2/ -[10]: https://icinga.com/download/ -[11]: https://www.zabbix.com/ -[12]: https://www.zabbix.com/download -[13]: https://prometheus.io/ -[14]: https://prometheus.io/docs/alerting/alertmanager/ -[15]: https://prometheus.io/download/ diff --git a/sources/tech/20190205 12 Methods To Check The Hard Disk And Hard Drive Partition On Linux.md b/sources/tech/20190205 12 Methods To Check The Hard Disk And Hard Drive Partition On Linux.md deleted file mode 100644 index ef8c8dc460..0000000000 --- a/sources/tech/20190205 12 Methods To Check The Hard Disk And Hard Drive Partition On Linux.md +++ /dev/null @@ -1,435 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (12 Methods To Check The Hard Disk And Hard Drive Partition On Linux) -[#]: via: (https://www.2daygeek.com/linux-command-check-hard-disks-partitions/) -[#]: author: (Vinoth Kumar https://www.2daygeek.com/author/vinoth/) - -12 Methods To Check The Hard Disk And Hard Drive Partition On Linux -====== - -Usually Linux admins check the available hard disk and it’s partitions whenever they want to add a new disks or additional partition in the system. - -We used to check the partition table of our hard disk to view the disk partitions. - -This will help you to view how many partitions were already created on the disk. Also, it allow us to verify whether we have any free space or not. - -In general hard disks can be divided into one or more logical disks called partitions. - -Each partitions can be used as a separate disk with its own file system and partition information is stored in a partition table. - -It’s a 64-byte data structure. The partition table is part of the master boot record (MBR), which is a small program that is executed when a computer boots. - -The partition information are saved in the 0 the sector of the disk. Make a note, all the partitions must be formatted with an appropriate file system before files can be written to it. - -This can be verified using the following 12 methods. - - * **`fdisk:`** manipulate disk partition table - * **`sfdisk:`** display or manipulate a disk partition table - * **`cfdisk:`** display or manipulate a disk partition table - * **`parted:`** a partition manipulation program - * **`lsblk:`** lsblk lists information about all available or the specified block devices. - * **`blkid:`** locate/print block device attributes. - * **`hwinfo:`** hwinfo stands for hardware information tool is another great utility that used to probe for the hardware present in the system. - * **`lshw:`** lshw is a small tool to extract detailed information on the hardware configuration of the machine. - * **`inxi:`** inxi is a command line system information script built for for console and IRC. - * **`lsscsi:`** list SCSI devices (or hosts) and their attributes - * **`cat /proc/partitions:`** - * **`ls -lh /dev/disk/:`** The directory contains Disk manufacturer name, serial number, partition ID and real block device files, Those were symlink with real block device files. - - - -### How To Check Hard Disk And Hard Drive Partition In Linux Using fdisk Command? - -**[fdisk][1]** stands for fixed disk or format disk is a cli utility that allow users to perform following actions on disks. It allows us to view, create, resize, delete, move and copy the partitions. - -``` -# fdisk -l - -Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0xeab59449 - -Device Boot Start End Sectors Size Id Type -/dev/sda1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 20973568 62914559 41940992 20G 83 Linux - - -Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes - - -Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0x8cc8f9e5 - -Device Boot Start End Sectors Size Id Type -/dev/sdc1 2048 2099199 2097152 1G 83 Linux -/dev/sdc3 4196352 6293503 2097152 1G 83 Linux -/dev/sdc4 6293504 20971519 14678016 7G 5 Extended -/dev/sdc5 6295552 8392703 2097152 1G 83 Linux - - -Disk /dev/sdd: 10 GiB, 10737418240 bytes, 20971520 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes - - -Disk /dev/sde: 10 GiB, 10737418240 bytes, 20971520 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using sfdisk Command? - -sfdisk is a script-oriented tool for partitioning any block device. sfdisk supports MBR (DOS), GPT, SUN and SGI disk labels, but no longer provides any functionality for CHS (Cylinder-Head-Sector) addressing. - -``` -# sfdisk -l - -Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0xeab59449 - -Device Boot Start End Sectors Size Id Type -/dev/sda1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 20973568 62914559 41940992 20G 83 Linux - - -Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes - - -Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0x8cc8f9e5 - -Device Boot Start End Sectors Size Id Type -/dev/sdc1 2048 2099199 2097152 1G 83 Linux -/dev/sdc3 4196352 6293503 2097152 1G 83 Linux -/dev/sdc4 6293504 20971519 14678016 7G 5 Extended -/dev/sdc5 6295552 8392703 2097152 1G 83 Linux - - -Disk /dev/sdd: 10 GiB, 10737418240 bytes, 20971520 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes - - -Disk /dev/sde: 10 GiB, 10737418240 bytes, 20971520 sectors -Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using cfdisk Command? - -cfdisk is a curses-based program for partitioning any block device. The default device is /dev/sda. It provides basic partitioning functionality with a user-friendly interface. - -``` -# cfdisk /dev/sdc - Disk: /dev/sdc - Size: 10 GiB, 10737418240 bytes, 20971520 sectors - Label: dos, identifier: 0x8cc8f9e5 - - Device Boot Start End Sectors Size Id Type ->> /dev/sdc1 2048 2099199 2097152 1G 83 Linux - Free space 2099200 4196351 2097152 1G - /dev/sdc3 4196352 6293503 2097152 1G 83 Linux - /dev/sdc4 6293504 20971519 14678016 7G 5 Extended - ├─/dev/sdc5 6295552 8392703 2097152 1G 83 Linux - └─Free space 8394752 20971519 12576768 6G - - - - ┌───────────────────────────────────────────────────────────────────────────────┐ - │ Partition type: Linux (83) │ - │Filesystem UUID: d17e3c31-e2c9-4f11-809c-94a549bc43b7 │ - │ Filesystem: ext2 │ - │ Mountpoint: /part1 (mounted) │ - └───────────────────────────────────────────────────────────────────────────────┘ - [Bootable] [ Delete ] [ Quit ] [ Type ] [ Help ] [ Write ] - [ Dump ] - - Quit program without writing changes -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using parted Command? - -**[parted][2]** is a program to manipulate disk partitions. It supports multiple partition table formats, including MS-DOS and GPT. It is useful for creating space for new operating systems, reorganising disk usage, and copying data to new hard disks. - -``` -# parted -l - -Model: ATA VBOX HARDDISK (scsi) -Disk /dev/sda: 32.2GB -Sector size (logical/physical): 512B/512B -Partition Table: msdos -Disk Flags: - -Number Start End Size Type File system Flags - 1 10.7GB 32.2GB 21.5GB primary ext4 boot - - -Model: ATA VBOX HARDDISK (scsi) -Disk /dev/sdb: 10.7GB -Sector size (logical/physical): 512B/512B -Partition Table: msdos -Disk Flags: - -Model: ATA VBOX HARDDISK (scsi) -Disk /dev/sdc: 10.7GB -Sector size (logical/physical): 512B/512B -Partition Table: msdos -Disk Flags: - -Number Start End Size Type File system Flags - 1 1049kB 1075MB 1074MB primary ext2 - 3 2149MB 3222MB 1074MB primary ext4 - 4 3222MB 10.7GB 7515MB extended - 5 3223MB 4297MB 1074MB logical - - -Model: ATA VBOX HARDDISK (scsi) -Disk /dev/sdd: 10.7GB -Sector size (logical/physical): 512B/512B -Partition Table: msdos -Disk Flags: - -Model: ATA VBOX HARDDISK (scsi) -Disk /dev/sde: 10.7GB -Sector size (logical/physical): 512B/512B -Partition Table: msdos -Disk Flags: -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using lsblk Command? - -lsblk lists information about all available or the specified block devices. The lsblk command reads the sysfs filesystem and udev db to gather information. - -If the udev db is not available or lsblk is compiled without udev support than it tries to read LABELs, UUIDs and filesystem types from the block device. In this case root permissions are necessary. The command prints all block devices (except RAM disks) in a tree-like format by default. - -``` -# lsblk -NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT -sda 8:0 0 30G 0 disk -└─sda1 8:1 0 20G 0 part / -sdb 8:16 0 10G 0 disk -sdc 8:32 0 10G 0 disk -├─sdc1 8:33 0 1G 0 part /part1 -├─sdc3 8:35 0 1G 0 part /part2 -├─sdc4 8:36 0 1K 0 part -└─sdc5 8:37 0 1G 0 part -sdd 8:48 0 10G 0 disk -sde 8:64 0 10G 0 disk -sr0 11:0 1 1024M 0 rom -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using blkid Command? - -blkid is a command-line utility to locate/print block device attributes. It uses libblkid library to get disk partition UUID in Linux system. - -``` -# blkid -/dev/sda1: UUID="d92fa769-e00f-4fd7-b6ed-ecf7224af7fa" TYPE="ext4" PARTUUID="eab59449-01" -/dev/sdc1: UUID="d17e3c31-e2c9-4f11-809c-94a549bc43b7" TYPE="ext2" PARTUUID="8cc8f9e5-01" -/dev/sdc3: UUID="ca307aa4-0866-49b1-8184-004025789e63" TYPE="ext4" PARTUUID="8cc8f9e5-03" -/dev/sdc5: PARTUUID="8cc8f9e5-05" -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using hwinfo Command? - -**[hwinfo][3]** stands for hardware information tool is another great utility that used to probe for the hardware present in the system and display detailed information about varies hardware components in human readable format. - -``` -# hwinfo --block --short -disk: - /dev/sdd VBOX HARDDISK - /dev/sdb VBOX HARDDISK - /dev/sde VBOX HARDDISK - /dev/sdc VBOX HARDDISK - /dev/sda VBOX HARDDISK -partition: - /dev/sdc1 Partition - /dev/sdc3 Partition - /dev/sdc4 Partition - /dev/sdc5 Partition - /dev/sda1 Partition -cdrom: - /dev/sr0 VBOX CD-ROM -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using lshw Command? - -**[lshw][4]** (stands for Hardware Lister) is a small nifty tool that generates detailed reports about various hardware components on the machine such as memory configuration, firmware version, mainboard configuration, CPU version and speed, cache configuration, usb, network card, graphics cards, multimedia, printers, bus speed, etc. - -``` -# lshw -short -class disk -class volume -H/W path Device Class Description -=================================================== -/0/3/0.0.0 /dev/cdrom disk CD-ROM -/0/4/0.0.0 /dev/sda disk 32GB VBOX HARDDISK -/0/4/0.0.0/1 /dev/sda1 volume 19GiB EXT4 volume -/0/5/0.0.0 /dev/sdb disk 10GB VBOX HARDDISK -/0/6/0.0.0 /dev/sdc disk 10GB VBOX HARDDISK -/0/6/0.0.0/1 /dev/sdc1 volume 1GiB Linux filesystem partition -/0/6/0.0.0/3 /dev/sdc3 volume 1GiB EXT4 volume -/0/6/0.0.0/4 /dev/sdc4 volume 7167MiB Extended partition -/0/6/0.0.0/4/5 /dev/sdc5 volume 1GiB Linux filesystem partition -/0/7/0.0.0 /dev/sdd disk 10GB VBOX HARDDISK -/0/8/0.0.0 /dev/sde disk 10GB VBOX HARDDISK -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using inxi Command? - -**[inxi][5]** is a nifty tool to check hardware information on Linux and offers wide range of option to get all the hardware information on Linux system that i never found in any other utility which are available in Linux. It was forked from the ancient and mindbendingly perverse yet ingenius infobash, by locsmif. - -``` -# inxi -Dp -Drives: HDD Total Size: 75.2GB (22.3% used) - ID-1: /dev/sda model: VBOX_HARDDISK size: 32.2GB - ID-2: /dev/sdb model: VBOX_HARDDISK size: 10.7GB - ID-3: /dev/sdc model: VBOX_HARDDISK size: 10.7GB - ID-4: /dev/sdd model: VBOX_HARDDISK size: 10.7GB - ID-5: /dev/sde model: VBOX_HARDDISK size: 10.7GB -Partition: ID-1: / size: 20G used: 16G (85%) fs: ext4 dev: /dev/sda1 - ID-3: /part1 size: 1008M used: 1.3M (1%) fs: ext2 dev: /dev/sdc1 - ID-4: /part2 size: 976M used: 2.6M (1%) fs: ext4 dev: /dev/sdc3 -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using lsscsi Command? - -Uses information in sysfs (Linux kernel series 2.6 and later) to list SCSI devices (or hosts) currently attached to the system. Options can be used to control the amount and form of information provided for each device. - -By default in this utility device node names (e.g. “/dev/sda” or “/dev/root_disk”) are obtained by noting the major and minor numbers for the listed device obtained from sysfs - -``` -# lsscsi -[0:0:0:0] cd/dvd VBOX CD-ROM 1.0 /dev/sr0 -[2:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sda -[3:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sdb -[4:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sdc -[5:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sdd -[6:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sde -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using ProcFS? - -The proc filesystem (procfs) is a special filesystem in Unix-like operating systems that presents information about processes and other system information. - -It’s sometimes referred to as a process information pseudo-file system. It doesn’t contain ‘real’ files but runtime system information (e.g. system memory, devices mounted, hardware configuration, etc). - -``` -# cat /proc/partitions -major minor #blocks name - - 11 0 1048575 sr0 - 8 0 31457280 sda - 8 1 20970496 sda1 - 8 16 10485760 sdb - 8 32 10485760 sdc - 8 33 1048576 sdc1 - 8 35 1048576 sdc3 - 8 36 1 sdc4 - 8 37 1048576 sdc5 - 8 48 10485760 sdd - 8 64 10485760 sde -``` - -### How To Check Hard Disk And Hard Drive Partition In Linux Using /dev/disk Path? - -This directory contains four directories, it’s by-id, by-uuid, by-path and by-partuuid. Each directory contains some useful information and it’s symlinked with real block device files. - -``` -# ls -lh /dev/disk/by-id -total 0 -lrwxrwxrwx 1 root root 9 Feb 2 23:08 ata-VBOX_CD-ROM_VB0-01f003f6 -> ../../sr0 -lrwxrwxrwx 1 root root 9 Feb 3 00:14 ata-VBOX_HARDDISK_VB26e827b5-668ab9f4 -> ../../sda -lrwxrwxrwx 1 root root 10 Feb 3 00:14 ata-VBOX_HARDDISK_VB26e827b5-668ab9f4-part1 -> ../../sda1 -lrwxrwxrwx 1 root root 9 Feb 2 23:39 ata-VBOX_HARDDISK_VB3774c742-fb2b3e4e -> ../../sdd -lrwxrwxrwx 1 root root 9 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e -> ../../sdc -lrwxrwxrwx 1 root root 10 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e-part1 -> ../../sdc1 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e-part3 -> ../../sdc3 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e-part4 -> ../../sdc4 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e-part5 -> ../../sdc5 -lrwxrwxrwx 1 root root 9 Feb 2 23:39 ata-VBOX_HARDDISK_VBed1cf451-9f51c5f6 -> ../../sdb -lrwxrwxrwx 1 root root 9 Feb 2 23:39 ata-VBOX_HARDDISK_VBf242dbdd-49a982eb -> ../../sde -``` - -Output of by-uuid - -``` -# ls -lh /dev/disk/by-uuid -total 0 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 ca307aa4-0866-49b1-8184-004025789e63 -> ../../sdc3 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 d17e3c31-e2c9-4f11-809c-94a549bc43b7 -> ../../sdc1 -lrwxrwxrwx 1 root root 10 Feb 3 00:14 d92fa769-e00f-4fd7-b6ed-ecf7224af7fa -> ../../sda1 -``` - -Output of by-path - -``` -# ls -lh /dev/disk/by-path -total 0 -lrwxrwxrwx 1 root root 9 Feb 2 23:08 pci-0000:00:01.1-ata-1 -> ../../sr0 -lrwxrwxrwx 1 root root 9 Feb 3 00:14 pci-0000:00:0d.0-ata-1 -> ../../sda -lrwxrwxrwx 1 root root 10 Feb 3 00:14 pci-0000:00:0d.0-ata-1-part1 -> ../../sda1 -lrwxrwxrwx 1 root root 9 Feb 2 23:39 pci-0000:00:0d.0-ata-2 -> ../../sdb -lrwxrwxrwx 1 root root 9 Feb 2 23:39 pci-0000:00:0d.0-ata-3 -> ../../sdc -lrwxrwxrwx 1 root root 10 Feb 2 23:39 pci-0000:00:0d.0-ata-3-part1 -> ../../sdc1 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 pci-0000:00:0d.0-ata-3-part3 -> ../../sdc3 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 pci-0000:00:0d.0-ata-3-part4 -> ../../sdc4 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 pci-0000:00:0d.0-ata-3-part5 -> ../../sdc5 -lrwxrwxrwx 1 root root 9 Feb 2 23:39 pci-0000:00:0d.0-ata-4 -> ../../sdd -lrwxrwxrwx 1 root root 9 Feb 2 23:39 pci-0000:00:0d.0-ata-5 -> ../../sde -``` - -Output of by-partuuid - -``` -# ls -lh /dev/disk/by-partuuid -total 0 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 8cc8f9e5-01 -> ../../sdc1 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 8cc8f9e5-03 -> ../../sdc3 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 8cc8f9e5-04 -> ../../sdc4 -lrwxrwxrwx 1 root root 10 Feb 2 23:39 8cc8f9e5-05 -> ../../sdc5 -lrwxrwxrwx 1 root root 10 Feb 3 00:14 eab59449-01 -> ../../sda1 -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/linux-command-check-hard-disks-partitions/ - -作者:[Vinoth Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/vinoth/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/linux-fdisk-command-to-manage-disk-partitions/ -[2]: https://www.2daygeek.com/how-to-manage-disk-partitions-using-parted-command/ -[3]: https://www.2daygeek.com/hwinfo-check-display-detect-system-hardware-information-linux/ -[4]: https://www.2daygeek.com/lshw-find-check-system-hardware-information-details-linux/ -[5]: https://www.2daygeek.com/inxi-system-hardware-information-on-linux/ diff --git a/sources/tech/20190205 5 Linux GUI Cloud Backup Tools.md b/sources/tech/20190205 5 Linux GUI Cloud Backup Tools.md deleted file mode 100644 index 45e0bf1342..0000000000 --- a/sources/tech/20190205 5 Linux GUI Cloud Backup Tools.md +++ /dev/null @@ -1,251 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (5 Linux GUI Cloud Backup Tools) -[#]: via: (https://www.linux.com/blog/learn/2019/2/5-linux-gui-cloud-backup-tools) -[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) - -5 Linux GUI Cloud Backup Tools -====== -![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/cloud-m-wong-unsplash.jpg?itok=aW0mpzio) - -We have reached a point in time where most every computer user depends upon the cloud … even if only as a storage solution. What makes the cloud really important to users, is when it’s employed as a backup. Why is that such a game changer? By backing up to the cloud, you have access to those files, from any computer you have associated with your cloud account. And because Linux powers the cloud, many services offer Linux tools. - -Let’s take a look at five such tools. I will focus on GUI tools, because they offer a much lower barrier to entry to many of the CLI tools. I’ll also be focusing on various, consumer-grade cloud services (e.g., [Google Drive][1], [Dropbox][2], [Wasabi][3], and [pCloud][4]). And, I will be demonstrating on the Elementary OS platform, but all of the tools listed will function on most Linux desktop distributions. - -Note: Of the following backup solutions, only Duplicati is licensed as open source. With that said, let’s see what’s available. - -### Insync - -I must confess, [Insync][5] has been my cloud backup of choice for a very long time. Since Google refuses to release a Linux desktop client for Google Drive (and I depend upon Google Drive daily), I had to turn to a third-party solution. Said solution is Insync. This particular take on syncing the desktop to Drive has not only been seamless, but faultless since I began using the tool. - -The cost of Insync is a one-time $29.99 fee (per Google account). Trust me when I say this tool is worth the price of entry. With Insync you not only get an easy-to-use GUI for managing your Google Drive backup and sync, you get a tool (Figure 1) that gives you complete control over what is backed up and how it is backed up. Not only that, but you can also install Nautilus integration (which also allows you to easy add folders outside of the configured Drive sync destination). - -![Insync app][7] - -Figure 1: The Insync app window on Elementary OS. - -[Used with permission][8] - -You can download Insync for Ubuntu (or its derivatives), Linux Mint, Debian, and Fedora from the [Insync download page][9]. Once you’ve installed Insync (and associated it with your account), you can then install Nautilus integration with these steps (demonstrating on Elementary OS): - - 1. Open a terminal window and issue the command sudo nano /etc/apt/sources.list.d/insync.list. - - 2. Paste the following into the new file: deb precise non-free contrib. - - 3. Save and close the file. - - 4. Update apt with the command sudo apt-get update. - - 5. Install the necessary package with the command sudo apt-get install insync-nautilus. - - - - -Allow the installation to complete. Once finished, restart Nautilus with the command nautilus -q (or log out and back into the desktop). You should now see an Insync entry in the Nautilus right-click context menu (Figure 2). - -![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/insync_2.jpg?itok=-kA0epiH) - -Figure 2: Insync/Nautilus integration in action. - -[Used with permission][8] - -### Dropbox - -Although [Dropbox][2] drew the ire of many in the Linux community (by dropping support for all filesystems but unencrypted ext4), it still supports a great deal of Linux desktop deployments. In other words, if your distribution still uses the ext4 file system (and you do not opt to encrypt your full drive), you’re good to go. - -The good news is the Dropbox Linux desktop client is quite good. The tool offers a system tray icon that allows you to easily interact with your cloud syncing. Dropbox also includes CLI tools and a Nautilus integration (by way of an additional addon found [here][10]). - -The Linux Dropbox desktop sync tool works exactly as you’d expect. From the Dropbox system tray drop-down (Figure 3) you can open the Dropbox folder, launch the Dropbox website, view recently changed files, get more space, pause syncing, open the preferences window, find help, and quite Dropbox. - -![Dropbox][12] - -Figure 3: The Dropbox system tray drop-down on Elementary OS. - -[Used with permission][8] - -The Dropbox/Nautilus integration is an important component, as it makes quickly adding to your cloud backup seamless and fast. From the Nautilus file manager, locate and right-click the folder to bad added, and select Dropbox > Move to Dropbox (Figure 4). - -The only caveat to the Dropbox/Nautilus integration is that the only option is to move a folder to Dropbox. To some this might not be an option. The developers of this package would be wise to instead have the action create a link (instead of actually moving the folder). - -Outside of that one issue, the Dropbox cloud sync/backup solution for Linux is a great route to go. - -### pCloud - -pCloud might well be one of the finest cloud backup solutions you’ve never heard of. This take on cloud storage/backup includes features like: - - * Encryption (subscription service required for this feature); - - * Mobile apps for Android and iOS; - - * Linux, Mac, and Windows desktop clients; - - * Easy file/folder sharing; - - * Built-in audio/video players; - - * No file size limitation; - - * Sync any folder from the desktop; - - * Panel integration for most desktops; and - - * Automatic file manager integration. - - - - -pCloud offers both Linux desktop and CLI tools that function quite well. pCloud offers both a free plan (with 10GB of storage), a Premium Plan (with 500GB of storage for a one-time fee of $175.00), and a Premium Plus Plan (with 2TB of storage for a one-time fee of $350.00). Both non-free plans can also be paid on a yearly basis (instead of the one-time fee). - -The pCloud desktop client is quite user-friendly. Once installed, you have access to your account information (Figure 5), the ability to create sync pairs, create shares, enable crypto (which requires an added subscription), and general settings. - -![pCloud][14] - -Figure 5: The pCloud desktop client is incredibly easy to use. - -[Used with permission][8] - -The one caveat to pCloud is there’s no file manager integration for Linux. That’s overcome by the Sync folder in the pCloud client. - -### CloudBerry - -The primary focus for [CloudBerry][15] is for Managed Service Providers. The business side of CloudBerry does have an associated cost (one that is probably well out of the price range for the average user looking for a simple cloud backup solution). However, for home usage, CloudBerry is free. - -What makes CloudBerry different than the other tools is that it’s not a backup/storage solution in and of itself. Instead, CloudBerry serves as a link between your desktop and the likes of: - - * AWS - - * Microsoft Azure - - * Google Cloud - - * BackBlaze - - * OpenStack - - * Wasabi - - * Local storage - - * External drives - - * Network Attached Storage - - * Network Shares - - * And more - - - - -In other words, you use CloudBerry as the interface between the files/folders you want to share and the destination with which you want send them. This also means you must have an account with one of the many supported solutions. -Once you’ve installed CloudBerry, you create a new Backup plan for the target storage solution. For that configuration, you’ll need such information as: - - * Access Key - - * Secret Key - - * Bucket - - - - -What you’ll need for the configuration will depend on the account you’re connecting to (Figure 6). - -![CloudBerry][17] - -Figure 6: Setting up a CloudBerry backup for Wasabi. - -[Used with permission][8] - -The one caveat to CloudBerry is that it does not integrate with any file manager, nor does it include a system tray icon for interaction with the service. - -### Duplicati - -[Duplicati][18] is another option that allows you to sync your local directories with either locally attached drives, network attached storage, or a number of cloud services. The options supported include: - - * Local folders - - * Attached drives - - * FTP/SFTP - - * OpenStack - - * WebDAV - - * Amazon Cloud Drive - - * Amazon S3 - - * Azure Blob - - * Box.com - - * Dropbox - - * Google Cloud Storage - - * Google Drive - - * Microsoft OneDrive - - * And many more - - - - -Once you install Duplicati (download the installer for Debian, Ubuntu, Fedora, or RedHat from the [Duplicati downloads page][19]), click on the entry in your desktop menu, which will open a web page to the tool (Figure 7), where you can configure the app settings, create a new backup, restore from a backup, and more. - -![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/duplicati_1.jpg?itok=SVf06tnv) - -To create a backup, click Add backup and walk through the easy-to-use wizard (Figure 8). The backup service you choose will dictate what you need for a successful configuration. - -![Duplicati backup][21] - -Figure 8: Creating a new Duplicati backup for Google Drive. - -[Used with permission][8] - -For example, in order to create a backup to Google Drive, you’ll need an AuthID. For that, click the AuthID link in the Destination section of the setup, where you’ll be directed to select the Google Account to associate with the backup. Once you’ve allowed Duplicati access to the account, the AuthID will fill in and you’re ready to continue. Click Test connection and you’ll be asked to okay the creation of a new folder (if necessary). Click Next to complete the setup of the backup. - -### More Where That Came From - -These five cloud backup tools aren’t the end of this particular rainbow. There are plenty more options where these came from (including CLI-only tools). But any of these backup clients will do a great job of serving your Linux desktop-to-cloud backup needs. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/learn/2019/2/5-linux-gui-cloud-backup-tools - -作者:[Jack Wallen][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linux.com/users/jlwallen -[b]: https://github.com/lujun9972 -[1]: https://www.google.com/drive/ -[2]: https://www.dropbox.com/ -[3]: https://wasabi.com/ -[4]: https://www.pcloud.com/ -[5]: https://www.insynchq.com/ -[6]: /files/images/insync1jpg -[7]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/insync_1.jpg?itok=_SDP77uE (Insync app) -[8]: /licenses/category/used-permission -[9]: https://www.insynchq.com/downloads -[10]: https://www.dropbox.com/install-linux -[11]: /files/images/dropbox1jpg -[12]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/dropbox_1.jpg?itok=BYbg-sKB (Dropbox) -[13]: /files/images/pcloud1jpg -[14]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/pcloud_1.jpg?itok=cAUz8pya (pCloud) -[15]: https://www.cloudberrylab.com -[16]: /files/images/cloudberry1jpg -[17]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/cloudberry_1.jpg?itok=s0aP5xuN (CloudBerry) -[18]: https://www.duplicati.com/ -[19]: https://www.duplicati.com/download -[20]: /files/images/duplicati2jpg -[21]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/duplicati_2.jpg?itok=Xkn8s3jg (Duplicati backup) diff --git a/sources/tech/20190205 5 Streaming Audio Players for Linux.md b/sources/tech/20190205 5 Streaming Audio Players for Linux.md deleted file mode 100644 index 1ddd4552f5..0000000000 --- a/sources/tech/20190205 5 Streaming Audio Players for Linux.md +++ /dev/null @@ -1,172 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (5 Streaming Audio Players for Linux) -[#]: via: (https://www.linux.com/blog/2019/2/5-streaming-audio-players-linux) -[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) - -5 Streaming Audio Players for Linux -====== -![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/music-main.png?itok=bTxfvadR) - -As I work, throughout the day, music is always playing in the background. Most often, that music is in the form of vinyl spinning on a turntable. But when I’m not in purist mode, I’ll opt to listen to audio by way of a streaming app. Naturally, I’m on the Linux platform, so the only tools I have at my disposal are those that play well on my operating system of choice. Fortunately, plenty of options exist for those who want to stream audio to their Linux desktops. - -In fact, Linux offers a number of solid offerings for music streaming, and I’ll highlight five of my favorite tools for this task. A word of warning, not all of these players are open source. But if you’re okay running a proprietary app on your open source desktop, you have some really powerful options. Let’s take a look at what’s available. - -### Spotify - -Spotify for Linux isn’t some dumb-downed, half-baked app that crashes every other time you open it, and doesn’t offer the full-range of features found on the macOS and Windows equivalent. In fact, the Linux version of Spotify is exactly the same as you’ll find on other platforms. With the Spotify streaming client you can listen to music and podcasts, create playlists, discover new artists, and so much more. And the Spotify interface (Figure 1) is quite easy to navigate and use. - -![Spotify][2] - -Figure 1: The Spotify interface makes it easy to find new music and old favorites. - -[Used with permission][3] - -You can install Spotify either using snap (with the command sudo snap install spotify), or from the official repository, with the following commands: - - * sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 931FF8E79F0876134EDDBDCCA87FF9DF48BF1C90 - - * sudo echo deb stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list - - * sudo apt-get update - - * sudo apt-get install spotify-client - - - - -Once installed, you’ll want to log into your Spotify account, so you can start streaming all of the great music to help motivate you to get your work done. If you have Spotify installed on other devices (and logged into the same account), you can dictate to which device the music should stream (by clicking the Devices Available icon near the bottom right corner of the Spotify window). - -### Clementine - -Clementine one of the best music players available to the Linux platform. Clementine not only allows user to play locally stored music, but to connect to numerous streaming audio services, such as: - - * Amazon Cloud Drive - - * Box - - * Dropbox - - * Icecast - - * Jamendo - - * Magnatune - - * RockRadio.com - - * Radiotunes.com - - * SomaFM - - * SoundCloud - - * Spotify - - * Subsonic - - * Vk.com - - * Or internet radio streams - - - - -There are two caveats to using Clementine. The first is you must be using the most recent version (as the build available in some repositories is out of date and won’t install the necessary streaming plugins). Second, even with the most recent build, some streaming services won’t function as expected. For example, with Spotify, you’ll only have available to you the Top Tracks (and not your playlist … or the ability to search for songs). - -With Clementine Internet radio streaming, you’ll find musicians and bands you’ve never heard of (Figure 2), and plenty of them to tune into. - -![Clementine][5] - -Figure 2: Clementine Internet radio is a great way to find new music. - -[Used with permission][3] - -### Odio - -Odio is a cross-platform, proprietary app (available for Linux, MacOS, and Windows) that allows you to stream internet music stations of all genres. Radio stations are curated from [www.radio-browser.info][6] and the app itself does an incredible job of presenting the streams for you (Figure 3). - - -![Odio][8] - -Figure 3: The Odio interface is one of the best you’ll find. - -[Used with permission][3] - -Odio makes it very easy to find unique Internet radio stations and even add those you find and enjoy to your library. Currently, the only way to install Odio on Linux is via Snap. If your distribution supports snap packages, install this streaming app with the command: - -sudo snap install odio - -Once installed, you can open the app and start using it. There is no need to log into (or create) an account. Odio is very limited in its settings. In fact, it only offers the choice between a dark or light theme in the settings window. However, as limited as it might be, Odio is one of your best bets for playing Internet radio on Linux. - -Streamtuner2 is an outstanding Internet radio station GUI tool. With it you can stream music from the likes of: - - * Internet radio stations - - * Jameno - - * MyOggRadio - - * Shoutcast.com - - * SurfMusic - - * TuneIn - - * Xiph.org - - * YouTube - - -### StreamTuner2 - -Streamtuner2 offers a nice (if not slightly outdated) interface, that makes it quite easy to find and stream your favorite music. The one caveat with StreamTuner2 is that it’s really just a GUI for finding the streams you want to hear. When you find a station, double-click on it to open the app associated with the stream. That means you must have the necessary apps installed, in order for the streams to play. If you don’t have the proper apps, you can’t play the streams. Because of this, you’ll spend a good amount of time figuring out what apps to install for certain streams (Figure 4). - -![Streamtuner2][10] - -Figure 4: Configuring Streamtuner2 isn’t for the faint of heart. - -[Used with permission][3] - -### VLC - -VLC has been, for a very long time, dubbed the best media playback tool for Linux. That’s with good reason, as it can play just about anything you throw at it. Included in that list is streaming radio stations. Although you won’t find VLC connecting to the likes of Spotify, you can head over to Internet-Radio, click on a playlist and have VLC open it without a problem. And considering how many internet radio stations are available at the moment, you won’t have any problem finding music to suit your tastes. VLC also includes tools like visualizers, equalizers (Figure 5), and more. - -![VLC ][12] - -Figure 5: The VLC visualizer and equalizer features in action. - -[Used with permission][3] - -The only caveat to VLC is that you do have to have a URL for the Internet Radio you wish you hear, as the tool itself doesn’t curate. But with those links in hand, you won’t find a better media player than VLC. - -### Always More Where That Came From - -If one of these five tools doesn’t fit your needs, I suggest you open your distribution’s app store and search for one that will. There are plenty of tools to make streaming music, podcasts, and more not only possible on Linux, but easy. - -Learn more about Linux through the free ["Introduction to Linux" ][13] course from The Linux Foundation and edX. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/2019/2/5-streaming-audio-players-linux - -作者:[Jack Wallen][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linux.com/users/jlwallen -[b]: https://github.com/lujun9972 -[2]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/spotify_0.jpg?itok=8-Ym-R61 (Spotify) -[3]: https://www.linux.com/licenses/category/used-permission -[5]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/clementine_0.jpg?itok=5oODJO3b (Clementine) -[6]: http://www.radio-browser.info -[8]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/odio.jpg?itok=sNPTSS3c (Odio) -[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/streamtuner2.jpg?itok=1MSbafWj (Streamtuner2) -[12]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/vlc_0.jpg?itok=QEOsq7Ii (VLC ) -[13]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux diff --git a/sources/tech/20190205 CFS- Completely fair process scheduling in Linux.md b/sources/tech/20190205 CFS- Completely fair process scheduling in Linux.md deleted file mode 100644 index fce243271a..0000000000 --- a/sources/tech/20190205 CFS- Completely fair process scheduling in Linux.md +++ /dev/null @@ -1,122 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (messon007) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (CFS: Completely fair process scheduling in Linux) -[#]: via: (https://opensource.com/article/19/2/fair-scheduling-linux) -[#]: author: (Marty kalin https://opensource.com/users/mkalindepauledu) - -CFS: Completely fair process scheduling in Linux -====== -CFS gives every task a fair share of processor resources in a low-fuss but highly efficient way. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/fail_progress_cycle_momentum_arrow.png?itok=q-ZFa_Eh) - -Linux takes a modular approach to processor scheduling in that different algorithms can be used to schedule different process types. A scheduling class specifies which scheduling policy applies to which type of process. Completely fair scheduling (CFS), which became part of the Linux 2.6.23 kernel in 2007, is the scheduling class for normal (as opposed to real-time) processes and therefore is named **SCHED_NORMAL**. - -CFS is geared for the interactive applications typical in a desktop environment, but it can be configured as **SCHED_BATCH** to favor the batch workloads common, for example, on a high-volume web server. In any case, CFS breaks dramatically with what might be called "classic preemptive scheduling." Also, the "completely fair" claim has to be seen with a technical eye; otherwise, the claim might seem like an empty boast. - -Let's dig into the details of what sets CFS apart from—indeed, above—other process schedulers. Let's start with a quick review of some core technical terms. - -### Some core concepts - -Linux inherits the Unix view of a process as a program in execution. As such, a process must contend with other processes for shared system resources: memory to hold instructions and data, at least one processor to execute instructions, and I/O devices to interact with the external world. Process scheduling is how the operating system (OS) assigns tasks (e.g., crunching some numbers, copying a file) to processors—a running process then performs the task. A process has one or more threads of execution, which are sequences of machine-level instructions. To schedule a process is to schedule one of its threads on a processor. - -In a simplifying move, Linux turns process scheduling into thread scheduling by treating a scheduled process as if it were single-threaded. If a process is multi-threaded with N threads, then N scheduling actions would be required to cover the threads. Threads within a multi-threaded process remain related in that they share resources such as memory address space. Linux threads are sometimes described as lightweight processes, with the lightweight underscoring the sharing of resources among the threads within a process. - -Although a process can be in various states, two are of particular interest in scheduling. A blocked process is awaiting the completion of some event such as an I/O event. The process can resume execution only after the event completes. A runnable process is one that is not currently blocked. - -A process is processor-bound (aka compute-bound) if it consumes mostly processor as opposed to I/O resources, and I/O-bound in the opposite case; hence, a processor-bound process is mostly runnable, whereas an I/O-bound process is mostly blocked. As examples, crunching numbers is processor-bound, and accessing files is I/O-bound. Although an entire process might be characterized as either processor-bound or I/O-bound, a given process may be one or the other during different stages of its execution. Interactive desktop applications, such as browsers, tend to be I/O-bound. - -A good process scheduler has to balance the needs of processor-bound and I/O-bound tasks, especially in an operating system such as Linux that thrives on so many hardware platforms: desktop machines, embedded devices, mobile devices, server clusters, supercomputers, and more. - -### Classic preemptive scheduling versus CFS - -Unix popularized classic preemptive scheduling, which other operating systems including VAX/VMS, Windows NT, and Linux later adopted. At the center of this scheduling model is a fixed timeslice, the amount of time (e.g., 50ms) that a task is allowed to hold a processor until preempted in favor of some other task. If a preempted process has not finished its work, the process must be rescheduled. This model is powerful in that it supports multitasking (concurrency) through processor time-sharing, even on the single-CPU machines of yesteryear. - -The classic model typically includes multiple scheduling queues, one per process priority: Every process in a higher-priority queue gets scheduled before any process in a lower-priority queue. As an example, VAX/VMS uses 32 priority queues for scheduling. - -CFS dispenses with fixed timeslices and explicit priorities. The amount of time for a given task on a processor is computed dynamically as the scheduling context changes over the system's lifetime. Here is a sketch of the motivating ideas and technical details: - - * Imagine a processor, P, which is idealized in that it can execute multiple tasks simultaneously. For example, tasks T1 and T2 can execute on P at the same time, with each receiving 50% of P's magical processing power. This idealization describes perfect multitasking, which CFS strives to achieve on actual as opposed to idealized processors. CFS is designed to approximate perfect multitasking. - - * The CFS scheduler has a target latency, which is the minimum amount of time—idealized to an infinitely small duration—required for every runnable task to get at least one turn on the processor. If such a duration could be infinitely small, then each runnable task would have had a turn on the processor during any given timespan, however small (e.g., 10ms, 5ns, etc.). Of course, an idealized infinitely small duration must be approximated in the real world, and the default approximation is 20ms. Each runnable task then gets a 1/N slice of the target latency, where N is the number of tasks. For example, if the target latency is 20ms and there are four contending tasks, then each task gets a timeslice of 5ms. By the way, if there is only a single task during a scheduling event, this lucky task gets the entire target latency as its slice. The fair in CFS comes to the fore in the 1/N slice given to each task contending for a processor. - - * The 1/N slice is, indeed, a timeslice—but not a fixed one because such a slice depends on N, the number of tasks currently contending for the processor. The system changes over time. Some processes terminate and new ones are spawned; runnable processes block and blocked processes become runnable. The value of N is dynamic and so, therefore, is the 1/N timeslice computed for each runnable task contending for a processor. The traditional **nice** value is used to weight the 1/N slice: a low-priority **nice** value means that only some fraction of the 1/N slice is given to a task, whereas a high-priority **nice** value means that a proportionately greater fraction of the 1/N slice is given to a task. In summary, **nice** values do not determine the slice, but only modify the 1/N slice that represents fairness among the contending tasks. - - * The operating system incurs overhead whenever a context switch occurs; that is, when one process is preempted in favor of another. To keep this overhead from becoming unduly large, there is a minimum amount of time (with a typical setting of 1ms to 4ms) that any scheduled process must run before being preempted. This minimum is known as the minimum granularity. If many tasks (e.g., 20) are contending for the processor, then the minimum granularity (assume 4ms) might be more than the 1/N slice (in this case, 1ms). If the minimum granularity turns out to be larger than the 1/N slice, the system is overloaded because there are too many tasks contending for the processor—and fairness goes out the window. - - * When does preemption occur? CFS tries to minimize context switches, given their overhead: time spent on a context switch is time unavailable for other tasks. Accordingly, once a task gets the processor, it runs for its entire weighted 1/N slice before being preempted in favor of some other task. Suppose task T1 has run for its weighted 1/N slice, and runnable task T2 currently has the lowest virtual runtime (vruntime) among the tasks contending for the processor. The vruntime records, in nanoseconds, how long a task has run on the processor. In this case, T1 would be preempted in favor of T2. - - * The scheduler tracks the vruntime for all tasks, runnable and blocked. The lower a task's vruntime, the more deserving the task is for time on the processor. CFS accordingly moves low-vruntime tasks towards the front of the scheduling line. Details are forthcoming because the line is implemented as a tree, not a list. - - * How often should the CFS scheduler reschedule? There is a simple way to determine the scheduling period. Suppose that the target latency (TL) is 20ms and the minimum granularity (MG) is 4ms: - -`TL / MG = (20 / 4) = 5 ## five or fewer tasks are ok` - -In this case, five or fewer tasks would allow each task a turn on the processor during the target latency. For example, if the task number is five, each runnable task has a 1/N slice of 4ms, which happens to equal the minimum granularity; if the task number is three, each task gets a 1/N slice of almost 7ms. In either case, the scheduler would reschedule in 20ms, the duration of the target latency. - -Trouble occurs if the number of tasks (e.g., 10) exceeds TL / MG because now each task must get the minimum time of 4ms instead of the computed 1/N slice, which is 2ms. In this case, the scheduler would reschedule in 40ms: - -`(number of tasks) core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated MG = (10 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 4) = 40ms ## period = 40ms` - - - - -Linux schedulers that predate CFS use heuristics to promote the fair treatment of interactive tasks with respect to scheduling. CFS takes a quite different approach by letting the vruntime facts speak mostly for themselves, which happens to support sleeper fairness. An interactive task, by its very nature, tends to sleep a lot in the sense that it awaits user inputs and so becomes I/O-bound; hence, such a task tends to have a relatively low vruntime, which tends to move the task towards the front of the scheduling line. - -### Special features - -CFS supports symmetrical multiprocessing (SMP) in which any process (whether kernel or user) can execute on any processor. Yet configurable scheduling domains can be used to group processors for load balancing or even segregation. If several processors share the same scheduling policy, then load balancing among them is an option; if a particular processor has a scheduling policy different from the others, then this processor would be segregated from the others with respect to scheduling. - -Configurable scheduling groups are another CFS feature. As an example, consider the Nginx web server that's running on my desktop machine. At startup, this server has a master process and four worker processes, which act as HTTP request handlers. For any HTTP request, the particular worker that handles the request is irrelevant; it matters only that the request is handled in a timely manner, and so the four workers together provide a pool from which to draw a task-handler as requests come in. It thus seems fair to treat the four Nginx workers as a group rather than as individuals for scheduling purposes, and a scheduling group can be used to do just that. The four Nginx workers could be configured to have a single vruntime among them rather than individual vruntimes. Configuration is done in the traditional Linux way, through files. For vruntime-sharing, a file named **cpu.shares** , with the details given through familiar shell commands, would be created. - -As noted earlier, Linux supports scheduling classes so that different scheduling policies, together with their implementing algorithms, can coexist on the same platform. A scheduling class is implemented as a code module in C. CFS, the scheduling class described so far, is **SCHED_NORMAL**. There are also scheduling classes specifically for real-time tasks, **SCHED_FIFO** (first in, first out) and **SCHED_RR** (round robin). Under **SCHED_FIFO** , tasks run to completion; under **SCHED_RR** , tasks run until they exhaust a fixed timeslice and are preempted. - -### CFS implementation - -CFS requires efficient data structures to track task information and high-performance code to generate the schedules. Let's begin with a central term in scheduling, the runqueue. This is a data structure that represents a timeline for scheduled tasks. Despite the name, the runqueue need not be implemented in the traditional way, as a FIFO list. CFS breaks with tradition by using a time-ordered red-black tree as a runqueue. The data structure is well-suited for the job because it is a self-balancing binary search tree, with efficient **insert** and **remove** operations that execute in **O(log N)** time, where N is the number of nodes in the tree. Also, a tree is an excellent data structure for organizing entities into a hierarchy based on a particular property, in this case a vruntime. - -In CFS, the tree's internal nodes represent tasks to be scheduled, and the tree as a whole, like any runqueue, represents a timeline for task execution. Red-black trees are in wide use beyond scheduling; for example, Java uses this data structure to implement its **TreeMap**. - -Under CFS, every processor has a specific runqueue of tasks, and no task occurs at the same time in more than one runqueue. Each runqueue is a red-black tree. The tree's internal nodes represent tasks or task groups, and these nodes are indexed by their vruntime values so that (in the tree as a whole or in any subtree) the internal nodes to the left have lower vruntime values than the ones to the right: - -``` -    25     ## 25 is a task vruntime -    /\ -  17  29   ## 17 roots the left subtree, 29 the right one -  /\  ... - 5  19     ## and so on -...  \ -     nil   ## leaf nodes are nil -``` - -In summary, tasks with the lowest vruntime—and, therefore, the greatest need for a processor—reside somewhere in the left subtree; tasks with relatively high vruntimes congregate in the right subtree. A preempted task would go into the right subtree, thus giving other tasks a chance to move leftwards in the tree. A task with the smallest vruntime winds up in the tree's leftmost (internal) node, which is thus the front of the runqueue. - -The CFS scheduler has an instance, the C **task_struct** , to track detailed information about each task to be scheduled. This structure embeds a **sched_entity** structure, which in turn has scheduling-specific information, in particular, the vruntime per task or task group: - -``` -struct task_struct {       /bin /boot /dev /etc /home /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var info on a task **/ -  ... -  struct sched_entity se;  /** vruntime, etc. **/ -  ... -}; -``` - -The red-black tree is implemented in familiar C fashion, with a premium on pointers for efficiency. A **cfs_rq** structure instance embeds a **rb_root** field named **tasks_timeline** , which points to the root of a red-black tree. Each of the tree's internal nodes has pointers to the parent and the two child nodes; the leaf nodes have nil as their value. - -CFS illustrates how a straightforward idea—give every task a fair share of processor resources—can be implemented in a low-fuss but highly efficient way. It's worth repeating that CFS achieves fair and efficient scheduling without traditional artifacts such as fixed timeslices and explicit task priorities. The pursuit of even better schedulers goes on, of course; for the moment, however, CFS is as good as it gets for general-purpose processor scheduling. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/fair-scheduling-linux - -作者:[Marty kalin][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mkalindepauledu -[b]: https://github.com/lujun9972 diff --git a/sources/tech/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md b/sources/tech/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md deleted file mode 100644 index 7ce1201c4f..0000000000 --- a/sources/tech/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md +++ /dev/null @@ -1,443 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS) -[#]: via: (https://www.ostechnix.com/install-apache-mysql-php-lamp-stack-on-ubuntu-18-04-lts/) -[#]: author: (SK https://www.ostechnix.com/author/sk/) - -Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS -====== - -![](https://www.ostechnix.com/wp-content/uploads/2019/02/lamp-720x340.jpg) - -**LAMP** stack is a popular, open source web development platform that can be used to run and deploy dynamic websites and web-based applications. Typically, LAMP stack consists of Apache webserver, MariaDB/MySQL databases, PHP/Python/Perl programming languages. LAMP is the acronym of **L** inux, **M** ariaDB/ **M** YSQL, **P** HP/ **P** ython/ **P** erl. This tutorial describes how to install Apache, MySQL, PHP (LAMP stack) in Ubuntu 18.04 LTS server. - -### Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS - -For the purpose of this tutorial, we will be using the following Ubuntu testbox. - - * **Operating System** : Ubuntu 18.04.1 LTS Server Edition - * **IP address** : 192.168.225.22/24 - - - -#### 1. Install Apache web server - -First of all, update Ubuntu server using commands: - -``` -$ sudo apt update - -$ sudo apt upgrade -``` - -Next, install Apache web server: - -``` -$ sudo apt install apache2 -``` - -Check if Apache web server is running or not: - -``` -$ sudo systemctl status apache2 -``` - -Sample output would be: - -``` -● apache2.service - The Apache HTTP Server - Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: en - Drop-In: /lib/systemd/system/apache2.service.d - └─apache2-systemd.conf - Active: active (running) since Tue 2019-02-05 10:48:03 UTC; 1min 5s ago - Main PID: 2025 (apache2) - Tasks: 55 (limit: 2320) - CGroup: /system.slice/apache2.service - ├─2025 /usr/sbin/apache2 -k start - ├─2027 /usr/sbin/apache2 -k start - └─2028 /usr/sbin/apache2 -k start - -Feb 05 10:48:02 ubuntuserver systemd[1]: Starting The Apache HTTP Server... -Feb 05 10:48:03 ubuntuserver apachectl[2003]: AH00558: apache2: Could not reliably -Feb 05 10:48:03 ubuntuserver systemd[1]: Started The Apache HTTP Server. -``` - -Congratulations! Apache service is up and running!! - -##### 1.1 Adjust firewall to allow Apache web server - -By default, the apache web browser can’t be accessed from remote systems if you have enabled the UFW firewall in Ubuntu 18.04 LTS. You must allow the http and https ports by following the below steps. - -First, list out the application profiles available on your Ubuntu system using command: - -``` -$ sudo ufw app list -``` - -Sample output: - -``` -Available applications: -Apache -Apache Full -Apache Secure -OpenSSH -``` - -As you can see, Apache and OpenSSH applications have installed UFW profiles. You can list out information about each profile and its included rules using “ **ufw app info “Profile Name”** command. - -Let us look into the **“Apache Full”** profile. To do so, run: - -``` -$ sudo ufw app info "Apache Full" -``` - -Sample output: - -``` -Profile: Apache Full -Title: Web Server (HTTP,HTTPS) -Description: Apache v2 is the next generation of the omnipresent Apache web -server. - -Ports: -80,443/tcp -``` - -As you see, “Apache Full” profile has included the rules to enable traffic to the ports **80** and **443** : - -Now, run the following command to allow incoming HTTP and HTTPS traffic for this profile: - -``` -$ sudo ufw allow in "Apache Full" -Rules updated -Rules updated (v6) -``` - -If you don’t want to allow https traffic, but only http (80) traffic, run: - -``` -$ sudo ufw app info "Apache" -``` - -##### 1.2 Test Apache Web server - -Now, open your web browser and access Apache test page by navigating to **** or ****. - -![](https://www.ostechnix.com/wp-content/uploads/2016/06/apache-2.png) - -If you are see a screen something like above, you are good to go. Apache server is working! - -#### 2. Install MySQL - -To install MySQL On Ubuntu, run: - -``` -$ sudo apt install mysql-server -``` - -Verify if MySQL service is running or not using command: - -``` -$ sudo systemctl status mysql -``` - -**Sample output:** - -``` -● mysql.service - MySQL Community Server -Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enab -Active: active (running) since Tue 2019-02-05 11:07:50 UTC; 17s ago -Main PID: 3423 (mysqld) -Tasks: 27 (limit: 2320) -CGroup: /system.slice/mysql.service -└─3423 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid - -Feb 05 11:07:49 ubuntuserver systemd[1]: Starting MySQL Community Server... -Feb 05 11:07:50 ubuntuserver systemd[1]: Started MySQL Community Server. -``` - -Mysql is running! - -##### 2.1 Setup database administrative user (root) password - -By default, MySQL **root** user password is blank. You need to secure your MySQL server by running the following script: - -``` -$ sudo mysql_secure_installation -``` - -You will be asked whether you want to setup **VALIDATE PASSWORD plugin** or not. This plugin allows the users to configure strong password for database credentials. If enabled, It will automatically check the strength of the password and enforces the users to set only those passwords which are secure enough. **It is safe to leave this plugin disabled**. However, you must use a strong and unique password for database credentials. If don’t want to enable this plugin, just press any key to skip the password validation part and continue the rest of the steps. - -If your answer is **Yes** , you will be asked to choose the level of password validation. - -``` -Securing the MySQL server deployment. - -Connecting to MySQL using a blank password. - -VALIDATE PASSWORD PLUGIN can be used to test passwords -and improve security. It checks the strength of password -and allows the users to set only those passwords which are -secure enough. Would you like to setup VALIDATE PASSWORD plugin? - -Press y|Y for Yes, any other key for No y -``` - -The available password validations are **low** , **medium** and **strong**. Just enter the appropriate number (0 for low, 1 for medium and 2 for strong password) and hit ENTER key. - -``` -There are three levels of password validation policy: - -LOW Length >= 8 -MEDIUM Length >= 8, numeric, mixed case, and special characters -STRONG Length >= 8, numeric, mixed case, special characters and dictionary file - -Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: -``` - -Now, enter the password for MySQL root user. Please be mindful that you must use password for mysql root user depending upon the password policy you choose in the previous step. If you didn’t enable the plugin, just use any strong and unique password of your choice. - -``` -Please set the password for root here. - -New password: - -Re-enter new password: - -Estimated strength of the password: 50 -Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y -``` - -Once you entered the password twice, you will see the password strength (In our case it is **50** ). If it is OK for you, press Y to continue with the provided password. If not satisfied with password length, press any other key and set a strong password. I am OK with my current password, so I chose **y**. - -For the rest of questions, just type **y** and hit ENTER. This will remove anonymous user, disallow root user login remotely and remove test database. - -``` -Remove anonymous users? (Press y|Y for Yes, any other key for No) : y -Success. - -Normally, root should only be allowed to connect from -'localhost'. This ensures that someone cannot guess at -the root password from the network. - -Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y -Success. - -By default, MySQL comes with a database named 'test' that -anyone can access. This is also intended only for testing, -and should be removed before moving into a production -environment. - -Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y -- Dropping test database... -Success. - -- Removing privileges on test database... -Success. - -Reloading the privilege tables will ensure that all changes -made so far will take effect immediately. - -Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y -Success. - -All done! -``` - -That’s it. Password for MySQL root user has been set. - -##### 2.2 Change authentication method for MySQL root user - -By default, MySQL root user is set to authenticate using the **auth_socket** plugin in MySQL 5.7 and newer versions on Ubuntu. Even though it enhances the security, it will also complicate things when you access your database server using any external programs, for example phpMyAdmin. To fix this issue, you need to change authentication method from **auth_socket** to **mysql_native_password**. To do so, login to your MySQL prompt using command: - -``` -$ sudo mysql -``` - -Run the following command at the mysql prompt to find the current authentication method for all mysql user accounts: - -``` -SELECT user,authentication_string,plugin,host FROM mysql.user; -``` - -**Sample output:** - -``` -+------------------|-------------------------------------------|-----------------------|-----------+ -| user | authentication_string | plugin | host | -+------------------|-------------------------------------------|-----------------------|-----------+ -| root | | auth_socket | localhost | -| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | -| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | -| debian-sys-maint | *F126737722832701DD3979741508F05FA71E5BA0 | mysql_native_password | localhost | -+------------------|-------------------------------------------|-----------------------|-----------+ -4 rows in set (0.00 sec) -``` - -![][2] - -As you see, mysql root user uses `auth_socket` plugin for authentication. - -To change this authentication to **mysql_native_password** method, run the following command at mysql prompt. Don’t forget to replace **“password”** with a strong and unique password of your choice. If you have enabled VALIDATION plugin, make sure you have used a strong password based on the current policy requirements. - -``` -ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; -``` - -Update the changes using command: - -``` -FLUSH PRIVILEGES; -``` - -Now check again if the authentication method is changed or not using command: - -``` -SELECT user,authentication_string,plugin,host FROM mysql.user; -``` - -Sample output: - -![][3] - -Good! Now the myql root user can authenticate using password to access mysql shell. - -Exit from the mysql prompt: - -``` -exit -``` - -#### 3\. Install PHP - -To install PHP, run: - -``` -$ sudo apt install php libapache2-mod-php php-mysql -``` - -After installing PHP, create **info.php** file in the Apache root document folder. Usually, the apache root document folder will be **/var/www/html/** or **/var/www/** in most Debian based Linux distributions. In Ubuntu 18.04 LTS, it is **/var/www/html/**. - -Let us create **info.php** file in the apache root folder: - -``` -$ sudo vi /var/www/html/info.php -``` - -Add the following lines: - -``` - -``` - -Press ESC key and type **:wq** to save and quit the file. Restart apache service to take effect the changes. - -``` -$ sudo systemctl restart apache2 -``` - -##### 3.1 Test PHP - -Open up your web browser and navigate to **** URL. - -You will see the php test page now. - -![](https://www.ostechnix.com/wp-content/uploads/2019/02/php-test-page.png) - -Usually, when a user requests a directory from the web server, Apache will first look for a file named **index.html**. If you want to change Apache to serve php files rather than others, move **index.php** to first position in the **dir.conf** file as shown below - -``` -$ sudo vi /etc/apache2/mods-enabled/dir.conf -``` - -Here is the contents of the above file. - -``` - -DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm - - -# vim: syntax=apache ts=4 sw=4 sts=4 sr noet -``` - -Move the “index.php” file to first. Once you made the changes, your **dir.conf** file will look like below. - -``` - -DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm - - -# vim: syntax=apache ts=4 sw=4 sts=4 sr noet -``` - -Press **ESC** key and type **:wq** to save and close the file. Restart Apache service to take effect the changes. - -``` -$ sudo systemctl restart apache2 -``` - -##### 3.2 Install PHP modules - -To improve the functionality of PHP, you can install some additional PHP modules. - -To list the available PHP modules, run: - -``` -$ sudo apt-cache search php- | less -``` - -**Sample output:** - -![][4] - -Use the arrow keys to go through the result. To exit, type **q** and hit ENTER key. - -To find the details of any particular php module, for example **php-gd** , run: - -``` -$ sudo apt-cache show php-gd -``` - -To install a php module run: - -``` -$ sudo apt install php-gd -``` - -To install all modules (not necessary though), run: - -``` -$ sudo apt-get install php* -``` - -Do not forget to restart Apache service after installing any php module. To check if the module is loaded or not, open info.php file in your browser and check if it is present. - -Next, you might want to install any database management tools to easily manage databases via a web browser. If so, install phpMyAdmin as described in the following link. - -Congratulations! We have successfully setup LAMP stack in Ubuntu 18.04 LTS server. - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/install-apache-mysql-php-lamp-stack-on-ubuntu-18-04-lts/ - -作者:[SK][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[2]: http://www.ostechnix.com/wp-content/uploads/2019/02/mysql-1.png -[3]: http://www.ostechnix.com/wp-content/uploads/2019/02/mysql-2.png -[4]: http://www.ostechnix.com/wp-content/uploads/2016/06/php-modules.png diff --git a/sources/tech/20190206 Flowblade 2.0 is Here with New Video Editing Tools and a Refreshed UI.md b/sources/tech/20190206 Flowblade 2.0 is Here with New Video Editing Tools and a Refreshed UI.md deleted file mode 100644 index 603ae570eb..0000000000 --- a/sources/tech/20190206 Flowblade 2.0 is Here with New Video Editing Tools and a Refreshed UI.md +++ /dev/null @@ -1,96 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Flowblade 2.0 is Here with New Video Editing Tools and a Refreshed UI) -[#]: via: (https://itsfoss.com/flowblade-video-editor-release/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -Flowblade 2.0 is Here with New Video Editing Tools and a Refreshed UI -====== - -[Flowblade][1] is one of the rare [video editors that are only available for Linux][2]. It is not the feature set – but the simplicity, flexibility, and being an open source project that counts. - -However, with Flowblade 2.0 – released recently – it is now more powerful and useful. A lot of new tools along with a complete overhaul in the workflow can be seen. - -In this article, we shall take a look at what’s new with Flowblade 2.0. - -### New Features in Flowblade 2.0 - -Here are some of the major new changes in the latest release of Flowblade. - -#### GUI Updates - -![Flowblade 2.0][3] - -This was a much needed change. I’m always looking for open source solutions that works as expected along with a great GUI. - -So, in this update, you will observe a new custom theme set as the default – which looks good though. - -Overall, the panel design, the toolbox and stuff has been taken care of to make it look modern. The overhaul considers small changes like the cursor icon upon tool selection and so on. - -#### Workflow Overhaul - -No matter what features you get to utilize, the workflow matters to people who regularly edit videos. So, it has to be intuitive. - -With the recent release, they have made sure that you can configure and set the workflow as per your preference. Well, that is definitely flexible because not everyone has the same requirement. - -#### New Tools - -![Flowblade Video Editor Interface][4] - -**Keyframe tool** : This enables editing and adjusting the Volume and Brightness [keyframes][5] on timeline. - -**Multitrim** : A combination of trill, roll, and slip tool. - -**Cut:** Available now as a tool in addition to the traditional cut at the playhead. - -**Ripple trim:** It is a mode of Trim tool – not often used by many – now available as a separate tool. - -#### More changes? - -In addition to these major changes listed above, they have added some keyframe editing updates and compositors ( _AlphaXOR, Alpha Out, and Alpha_ ) to utilize alpha channel data to combine images. - -A lot of more tiny little changes have taken place as well – you can check those out in the official [changelog][6] on GitHub. - -### Installing Flowblade 2.0 - -If you use Debian or Ubuntu based Linux distributions, there are .deb binaries available for easily installing Flowblade 2.0. - -For the rest, you’ll have to [install it using the source code][7]. - -All the files are available on it’s GitHub page. You can download it from the page below. - -[Download Flowblade 2.0][8] - -### Wrapping Up - -If you are interested in video editing, perhaps you would like to follow the development of [Olive][9], a new open source video editor in development. - -Now that you know about the latest changes and additions. What do you think about Flowblade 2.0 as a video editor? Is it good enough for you? - -Let us know your thoughts in the comments below. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/flowblade-video-editor-release/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://github.com/jliljebl/flowblade -[2]: https://itsfoss.com/best-video-editing-software-linux/ -[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/flowblade-2.jpg?ssl=1 -[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/flowblade-2-1.jpg?resize=800%2C450&ssl=1 -[5]: https://en.wikipedia.org/wiki/Key_frame -[6]: https://github.com/jliljebl/flowblade/blob/master/flowblade-trunk/docs/RELEASE_NOTES.md -[7]: https://itsfoss.com/install-software-from-source-code/ -[8]: https://github.com/jliljebl/flowblade/releases/tag/v2.0 -[9]: https://itsfoss.com/olive-video-editor/ diff --git a/sources/tech/20190207 Review of Debian System Administrator-s Handbook.md b/sources/tech/20190207 Review of Debian System Administrator-s Handbook.md deleted file mode 100644 index 7b51459c6b..0000000000 --- a/sources/tech/20190207 Review of Debian System Administrator-s Handbook.md +++ /dev/null @@ -1,133 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Review of Debian System Administrator’s Handbook) -[#]: via: (https://itsfoss.com/debian-administrators-handbook/) -[#]: author: (Shirish https://itsfoss.com/author/shirish/) - -Review of Debian System Administrator’s Handbook -====== - -_**Debian System Administrator’s Handbook is a free-to-download book that covers all the essential part of Debian that a sysadmin might need.**_ - -This has been on my to-do review list for quite some time. The book was started by two French Debian Developers Raphael Hertzog and Roland Mas to increase awareness about the Debian project in France. The book was a huge hit among francophone Linux users. The English translation followed soon after that. - -### Debian Administrator’s Handbook - -![][1] - -[Debian Administrator’s Handbook][2] is targeted from a newbie who may be looking to understand what the [Debian project][3] is all about to somebody who might be running a Debian in a production server. - -The latest version of the book covers Debian 8 while the current stable version is Debian 9. But it doesn’t mean that book is outdated and is of no use to Debian 9 users. Most of the part of the book is valid for all Debian and Linux users. - -Let me give you a quick summary of what this book covers. - -#### Section 1 – Debian Project - -The first section sets the tone of the book where it gives a solid foundation to somebody who might be looking into Debian as to what it actually means. Some of it will probably be updated to match the current scenario. - -#### Section 2 – Using fictional case studies for different needs - -The second section deals with the various case-scenarios as to where Debian could be used. The idea being how Debian can be used in various hierarchical or functional scenarios. One aspect which I felt that should have stressed upon is the culture mindshift and openness which at least should have been mentioned. - -#### Section 3 & 4- Setups and Installation - -The third section goes into looking in existing setups. I do think it should have stressed more into documenting existing setups, migrating partial services and users before making a full-fledged transition. While all of the above seem minor points, I have seen many of them come and bit me on the back during a transition. - -Section Four covers the various ways you could install, how the installation process flows and things to keep in mind before installing a Debian System. Unfortunately, UEFI was not present at that point so it was not talked about. - -#### Section 5 & 6 – Packaging System and Updates - -Section Five starts on how a binary package is structured and then goes on to tell how a source package is structured as well. It does mention several gotchas or tricky ways in which a sys-admin can be caught. - -Section Six is perhaps where most of the sysadmins spend most of the time apart from troubleshooting which is another chapter altogether. While it starts from many of the most often used sysadmin commands, the interesting point which I liked was on page 156 which is on better solver algorithims. - -#### Section 7 – Solving Problems and finding Relevant Solutions - -Section Seven, on the other hand, speaks of the various problem scenarios and various ways when you find yourself with a problem. In Debian and most GNU/Linux distributions, the keyword is ‘patience’. If you are patient then many problems in Debian are resolved or can be resolved after a good night’s sleep. - -#### Section 8 – Basic Configuration, Network, Accounts, Printing - -Section Eight introduces you to the basics of networking and having single or multiple user accounts on the workstation. It goes a bit into user and group configuration and practices then gives a brief introduction to the bash shell and gets a brief overview of the [CUPS][4] printing daemon. There is much to explore here. - -#### Section 9 – Unix Service - -Section 9 starts with the introduction to specific Unix services. While it starts with the much controversial, hated and reviled in many quarters [systemd][5], they also shared System V which is still used by many a sysadmin. - -#### Section 10, 11 & 12 – Networking and Adminstration - -Section 10 makes you dive into network infrastructure where it goes into the basics of Virtual Private Networks (OpenVPN), OpenSSH, the PKI credentials and some basics of information security. It also gets into basics of DNS, DHCP and IPv6 and ends with some tools which could help in troubleshooting network issues. - -Section 11 starts with basic configuration and workflow of mail server and postfix. It tries to a bit into depth as there is much to play with. It then goes into the popular web server Apache, FTP File server, NFS and CIFS with Windows shares via Samba. Again, much to explore therein. - -Section 12 starts with Advanced Administration topics such as RAID, LVM, when one is better than the other. Then gets into Virtualization, Xen and give brief about lxc. Again, there is much more to explore than shared herein. - -![Author Raphael Hertzog at a Debian booth circa 2013 | Image Credit][6] - -#### Section 13 – Workstation - -Section 13 shares about having schemas for xserver, display managers, window managers, menu management, the different desktops i.e. GNOME, KDE, XFCE and others. It does mention about lxde in the others. The one omission I felt which probably will be updated in a new release would be [Wayland][7] and [Xwayland][8]. Again much to explore in this section as well. This is rectified in the conclusion - -#### Section 14 – Security - -Section 14 is somewhat comprehensive on what constitues security and bits of threats analysis but stops short as it shares in the introduction of the chapter itself that it’s a vast topic. - -#### Section 15 – Creating a Debian package - -Section 15 explains the tools and processes to ‘ _debianize_ ‘ an application so it becomes part of the Debian archive and available for distribution on the 10 odd hardware architectures that Debian supports. - -### Pros and Cons - -Where Raphael and Roland have excelled is at breaking the visual monotony of the book by using a different style and structure wherever possible from the rest of the reading material. This compels the reader to refresh her eyes while at the same time focus on the important matter at the hand. The different visual style also indicates that this is somewhat more important from the author’s point of view. - -One of the drawbacks, if I may call it that, is the absolute absence of humor in the book. - -### Final Thoughts - -I have been [using Debian][9] for a decade so lots of it was a refresher for myself. Some of it is outdated if I look it from a buster perspective but is invaluable as a historical artifact. - -If you are looking to familiarize yourself with Debian or looking to run Debian 8 or 9 as a production server for your business wouldn’t be able to recommend a better book than this. - -### Download Debian Administrator’s Handbook - -The Debian Handbook has been available in every Debian release after 2012. The [liberation][10] of the Debian Handbook was done in 2012 using [ulule][11]. - -You can download an electronic version of the Debian Administrator’s Handbook in PDF, ePub or Mobi format from the link below: - -[Download Debian Administrator’s Handbook][12] - -You can also buy the book paperback edition of the book if you want to support the amazing work of the authors. - -[Buy the paperback edition][13] - -Lastly, if you want to motivate Raphael, you can reward by donating to his PayPal [account][14]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/debian-administrators-handbook/ - -作者:[Shirish][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/shirish/ -[b]: https://github.com/lujun9972 -[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/Debian-Administrators-Handbook-review.png?resize=800%2C450&ssl=1 -[2]: https://debian-handbook.info/ -[3]: https://www.debian.org/ -[4]: https://www.cups.org -[5]: https://itsfoss.com/systemd-features/ -[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/stand-debian-Raphael.jpg?resize=800%2C600&ssl=1 -[7]: https://wayland.freedesktop.org/ -[8]: https://en.wikipedia.org/wiki/X.Org_Server#XWayland -[9]: https://itsfoss.com/reasons-why-i-love-debian/ -[10]: https://debian-handbook.info/liberation/ -[11]: https://www.ulule.com/debian-handbook/ -[12]: https://debian-handbook.info/get/now/ -[13]: https://debian-handbook.info/get/ -[14]: https://raphaelhertzog.com/ diff --git a/sources/tech/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md b/sources/tech/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md deleted file mode 100644 index 55c1067d12..0000000000 --- a/sources/tech/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md +++ /dev/null @@ -1,185 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (3 Ways to Install Deb Files on Ubuntu Linux) -[#]: via: (https://itsfoss.com/install-deb-files-ubuntu) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -3 Ways to Install Deb Files on Ubuntu Linux -====== - -**This beginner article explains how to install deb packages in Ubuntu. It also shows you how to remove those deb packages afterwards.** - -This is another article in the Ubuntu beginner series. If you are absolutely new to Ubuntu, you might wonder about [how to install applications][1]. - -The easiest way is to use the Ubuntu Software Center. Search for an application by its name and install it from there. - -Life would be too simple if you could find all the applications in the Software Center. But that does not happen, unfortunately. - -Some software are available via DEB packages. These are archived files that end with .deb extension. - -You can think of .deb files as the .exe files in Windows. You double click on the .exe file and it starts the installation procedure in Windows. DEB packages are pretty much the same. - -You can find these DEB packages from the download section of the software provider’s website. For example, if you want to [install Google Chrome on Ubuntu][2], you can download the DEB package of Chrome from its website. - -Now the question arises, how do you install deb files? There are multiple ways of installing DEB packages in Ubuntu. I’ll show them to you one by one in this tutorial. - -![Install deb files in Ubuntu][3] - -### Installing .deb files in Ubuntu and Debian-based Linux Distributions - -You can choose a GUI tool or a command line tool for installing a deb package. The choice is yours. - -Let’s go on and see how to install deb files. - -#### Method 1: Use the default Software Center - -The simplest method is to use the default software center in Ubuntu. You have to do nothing special here. Simply go to the folder where you have downloaded the .deb file (it should be the Downloads folder) and double click on this file. - -![Google Chrome deb file on Ubuntu][4]Double click on the downloaded .deb file to start installation - -It will open the software center and you should see the option to install the software. All you have to do is to hit the install button and enter your login password. - -![Install Google Chrome in Ubuntu Software Center][5]The installation of deb file will be carried out via Software Center - -See, it’s even simple than installing from a .exe files on Windows, isn’t it? - -#### Method 2: Use Gdebi application for installing deb packages with dependencies - -Again, life would be a lot simpler if things always go smooth. But that’s not life as we know it. - -Now that you know that .deb files can be easily installed via Software Center, let me tell you about the dependency error that you may encounter with some packages. - -What happens is that a program may be dependent on another piece of software (libraries). When the developer is preparing the DEB package for you, he/she may assume that your system already has that piece of software on your system. - -But if that’s not the case and your system doesn’t have those required pieces of software, you’ll encounter the infamous ‘dependency error’. - -The Software Center cannot handle such errors on its own so you have to use another tool called [gdebi][6]. - -gdebi is a lightweight GUI application that has the sole purpose of installing deb packages. - -It identifies the dependencies and tries to install these dependencies along with installing the .deb files. - -![gdebi handling dependency while installing deb package][7]Image Credit: [Xmodulo][8] - -Personally, I prefer gdebi over software center for installing deb files. It is a lightweight application so the installation seems quicker. You can read in detail about [using gDebi and making it the default for installing DEB packages][6]. - -You can install gdebi from the software center or using the command below: - -``` -sudo apt install gdebi -``` - -#### Method 3: Install .deb files in command line using dpkg - -If you want to install deb packages in command lime, you can use either apt command or dpkg command. Apt command actually uses [dpkg command][9] underneath it but apt is more popular and easy to use. - -If you want to use the apt command for deb files, use it like this: - -``` -sudo apt install path_to_deb_file -``` - -If you want to use dpkg command for installing deb packages, here’s how to do it: - -``` -sudo dpkg -i path_to_deb_file -``` - -In both commands, you should replace the path_to_deb_file with the path and name of the deb file you have downloaded. - -![Install deb files using dpkg command in Ubuntu][10]Installing deb files using dpkg command in Ubuntu - -If you get a dependency error while installing the deb packages, you may use the following command to fix the dependency issues: - -``` -sudo apt install -f -``` - -### How to remove deb packages - -Removing a deb package is not a big deal as well. And no, you don’t need the original deb file that you had used for installing the program. - -#### Method 1: Remove deb packages using apt commands - -All you need is the name of the program that you have installed and then you can use apt or dpkg to remove that program. - -``` -sudo apt remove program_name -``` - -Now the question comes, how do you find the exact program name that you need to use in the remove command? The apt command has a solution for that as well. - -You can find the list of all installed files with apt command but manually going through this will be a pain. So you can use the grep command to search for your package. - -For example, I installed AppGrid application in the previous section but if I want to know the exact program name, I can use something like this: - -``` -sudo apt list --installed | grep grid -``` - -This will give me all the packages that have grid in their name and from there, I can get the exact program name. - -``` -apt list --installed | grep grid -WARNING: apt does not have a stable CLI interface. Use with caution in scripts. -appgrid/now 0.298 all [installed,local] -``` - -As you can see, a program called appgrid has been installed. Now you can use this program name with the apt remove command. - -#### Method 2: Remove deb packages using dpkg commands - -You can use dpkg to find the installed program’s name: - -``` -dpkg -l | grep grid -``` - -The output will give all the packages installed that has grid in its name. - -``` -dpkg -l | grep grid - -ii appgrid 0.298 all Discover and install apps for Ubuntu -``` - -ii in the above command output means package has been correctly installed. - -Now that you have the program name, you can use dpkg command to remove it: - -``` -dpkg -r program_name -``` - -**Tip: Updating deb packages** -Some deb packages (like Chrome) provide updates through system updates but for most other programs, you’ll have to remove the existing program and install the newer version. - -I hope this beginner guide helped you to install deb packages on Ubuntu. I added the remove part so that you’ll have better control over the programs you installed. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/install-deb-files-ubuntu - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/remove-install-software-ubuntu/ -[2]: https://itsfoss.com/install-chrome-ubuntu/ -[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/deb-packages-ubuntu.png?resize=800%2C450&ssl=1 -[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-4.jpeg?resize=800%2C347&ssl=1 -[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-5.jpeg?resize=800%2C516&ssl=1 -[6]: https://itsfoss.com/gdebi-default-ubuntu-software-center/ -[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/gdebi-handling-dependency.jpg?ssl=1 -[8]: http://xmodulo.com -[9]: https://help.ubuntu.com/lts/serverguide/dpkg.html.en -[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/install-deb-file-with-dpkg.png?ssl=1 -[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/deb-packages-ubuntu.png?fit=800%2C450&ssl=1 diff --git a/sources/tech/20190211 How does rootless Podman work.md b/sources/tech/20190211 How does rootless Podman work.md deleted file mode 100644 index a085ae9014..0000000000 --- a/sources/tech/20190211 How does rootless Podman work.md +++ /dev/null @@ -1,107 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How does rootless Podman work?) -[#]: via: (https://opensource.com/article/19/2/how-does-rootless-podman-work) -[#]: author: (Daniel J Walsh https://opensource.com/users/rhatdan) - -How does rootless Podman work? -====== -Learn how Podman takes advantage of user namespaces to run in rootless mode. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_development_programming.png?itok=4OM29-82) - -In my [previous article][1] on user namespace and [Podman][2], I discussed how you can use Podman commands to launch different containers with different user namespaces giving you better separation between containers. Podman also takes advantage of user namespaces to be able to run in rootless mode. Basically, when a non-privileged user runs Podman, the tool sets up and joins a user namespace. After Podman becomes root inside of the user namespace, Podman is allowed to mount certain filesystems and set up the container. Note there is no privilege escalation here other then additional UIDs available to the user, explained below. - -### How does Podman create the user namespace? - -#### shadow-utils - -Most current Linux distributions include a version of shadow-utils that uses the **/etc/subuid** and **/etc/subgid** files to determine what UIDs and GIDs are available for a user in a user namespace. - -``` -$ cat /etc/subuid -dwalsh:100000:65536 -test:165536:65536 -$ cat /etc/subgid -dwalsh:100000:65536 -test:165536:65536 -``` - -The useradd program automatically allocates 65536 UIDs for each user added to the system. If you have existing users on a system, you would need to allocate the UIDs yourself. The format of these files is **username:STARTUID:TOTALUIDS**. Meaning in my case, dwalsh is allocated UIDs 100000 through 165535 along with my default UID, which happens to be 3265 defined in /etc/passwd. You need to be careful when allocating these UID ranges that they don't overlap with any **real** UID on the system. If you had a user listed as UID 100001, now I (dwalsh) would be able to become this UID and potentially read/write/execute files owned by the UID. - -Shadow-utils also adds two setuid programs (or setfilecap). On Fedora I have: - -``` -$ getcap /usr/bin/newuidmap -/usr/bin/newuidmap = cap_setuid+ep -$ getcap /usr/bin/newgidmap -/usr/bin/newgidmap = cap_setgid+ep -``` - -Podman executes these files to set up the user namespace. You can see the mappings by examining /proc/self/uid_map and /proc/self/gid_map from inside of the rootless container. - -``` -$ podman run alpine cat /proc/self/uid_map /proc/self/gid_map -        0       3267            1 -        1       100000          65536 -        0       3267            1 -        1       100000          65536 -``` - -As seen above, Podman defaults to mapping root in the container to your current UID (3267) and then maps ranges of allocated UIDs/GIDs in /etc/subuid and /etc/subgid starting at 1. Meaning in my example, UID=1 in the container is UID 100000, UID=2 is UID 100001, all the way up to 65536, which is 165535. - -Any item from outside of the user namespace that is owned by a UID or GID that is not mapped into the user namespace appears to belong to the user configured in the **kernel.overflowuid** sysctl, which by default is 35534, which my /etc/passwd file says has the name **nobody**. Since your process can't run as an ID that isn't mapped, the owner and group permissions don't apply, so you can only access these files based on their "other" permissions. This includes all files owned by **real** root on the system running the container, since root is not mapped into the user namespace. - -The [Buildah][3] command has a cool feature, [**buildah unshare**][4]. This puts you in the same user namespace that Podman runs in, but without entering the container's filesystem, so you can list the contents of your home directory. - -``` -$ ls -ild /home/dwalsh -8193 drwx--x--x. 290 dwalsh dwalsh 20480 Jan 29 07:58 /home/dwalsh -$ buildah unshare ls -ld /home/dwalsh -drwx--x--x. 290 root root 20480 Jan 29 07:58 /home/dwalsh -``` - -Notice that when listing the home dir attributes outside the user namespace, the kernel reports the ownership as dwalsh, while inside the user namespace it reports the directory as owned by root. This is because the home directory is owned by 3267, and inside the user namespace we are treating that UID as root. - -### What happens next in Podman after the user namespace is set up? - -Podman uses [containers/storage][5] to pull the container image, and containers/storage is smart enough to map all files owned by root in the image to the root of the user namespace, and any other files owned by different UIDs to their user namespace UIDs. By default, this content gets written to ~/.local/share/containers/storage. Container storage works in rootless mode with either the vfs mode or with Overlay. Note: Overlay is supported only if the [fuse-overlayfs][6] executable is installed. - -The kernel only allows user namespace root to mount certain types of filesystems; at this time it allows mounting of procfs, sysfs, tmpfs, fusefs, and bind mounts (as long as the source and destination are owned by the user running Podman. OverlayFS is not supported yet, although the kernel teams are working on allowing it). - -Podman then mounts the container's storage if it is using fuse-overlayfs; if the storage driver is using vfs, then no mounting is required. Podman on vfs requires a lot of space though, since each container copies the entire underlying filesystem. - -Podman then mounts /proc and /sys along with a few tmpfs and creates the devices in the container. - -In order to use networking other than the host networking, Podman uses the [slirp4netns][7] program to set up **User mode networking for unprivileged network namespace**. Slirp4netns allows Podman to expose ports within the container to the host. Note that the kernel still will not allow a non-privileged process to bind to ports less than 1024. Podman-1.1 or later is required for binding to ports. - -Rootless Podman can use user namespace for container separation, but you only have access to the UIDs defined in the /etc/subuid file. - -### Conclusion - -The Podman tool is enabling people to build and use containers without sacrificing the security of the system; you can give your developers the access they need without giving them root. - -And when you put your containers into production, you can take advantage of the extra security provided by the user namespace to keep the workloads isolated from each other. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/how-does-rootless-podman-work - -作者:[Daniel J Walsh][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/rhatdan -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/article/18/12/podman-and-user-namespaces -[2]: https://podman.io/ -[3]: https://buildah.io/ -[4]: https://github.com/containers/buildah/blob/master/docs/buildah-unshare.md -[5]: https://github.com/containers/storage -[6]: https://github.com/containers/fuse-overlayfs -[7]: https://github.com/rootless-containers/slirp4netns diff --git a/sources/tech/20190211 What-s the right amount of swap space for a modern Linux system.md b/sources/tech/20190211 What-s the right amount of swap space for a modern Linux system.md deleted file mode 100644 index c04d47e5ca..0000000000 --- a/sources/tech/20190211 What-s the right amount of swap space for a modern Linux system.md +++ /dev/null @@ -1,68 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What's the right amount of swap space for a modern Linux system?) -[#]: via: (https://opensource.com/article/19/2/swap-space-poll) -[#]: author: (David Both https://opensource.com/users/dboth) - -What's the right amount of swap space for a modern Linux system? -====== -Complete our survey and voice your opinion on how much swap space to allocate. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/find-file-linux-code_magnifying_glass_zero.png?itok=E2HoPDg0) - -Swap space is one of those things that everyone seems to have an idea about, and I am no exception. All my sysadmin friends have their opinions, and most distributions make recommendations too. - -Many years ago, the rule of thumb for the amount of swap space that should be allocated was 2X the amount of RAM installed in the computer. Of course that was when a typical computer's RAM was measured in KB or MB. So if a computer had 64KB of RAM, a swap partition of 128KB would be an optimum size. - -This took into account the fact that RAM memory sizes were typically quite small, and allocating more than 2X RAM for swap space did not improve performance. With more than twice RAM for swap, most systems spent more time thrashing than performing useful work. - -RAM memory has become quite inexpensive and many computers now have RAM in the tens of gigabytes. Most of my newer computers have at least 4GB or 8GB of RAM, two have 32GB, and my main workstation has 64GB. When dealing with computers with huge amounts of RAM, the limiting performance factor for swap space is far lower than the 2X multiplier. As a consequence, recommended swap space is considered a function of system memory workload, not system memory. - -Table 1 provides the Fedora Project's recommended size for a swap partition, depending on the amount of RAM in your system and whether you want enough memory for your system to hibernate. To allow for hibernation, you need to edit the swap space in the custom partitioning stage. The "recommended" swap partition size is established automatically during a default installation, but I usually find it's either too large or too small for my needs. - -The [Fedora 28 Installation Guide][1] defines current thinking about swap space allocation. Note that other versions of Fedora and other Linux distributions may differ slightly, but this is the same table Red Hat Enterprise Linux uses for its recommendations. These recommendations have not changed since Fedora 19. - -| Amount of RAM installed in system | Recommended swap space | Recommended swap space with hibernation | -| --------------------------------- | ---------------------- | --------------------------------------- | -| ≤ 2GB | 2X RAM | 3X RAM | -| 2GB – 8GB | = RAM | 2X RAM | -| 8GB – 64GB | 4G to 0.5X RAM | 1.5X RAM | -| >64GB | Minimum 4GB | Hibernation not recommended | - -Table 1: Recommended system swap space in Fedora 28's documentation. - -Table 2 contains my recommendations based on my experiences in multiple environments over the years. -| Amount of RAM installed in system | Recommended swap space | -| --------------------------------- | ---------------------- | -| ≤ 2GB | 2X RAM | -| 2GB – 8GB | = RAM | -| > 8GB | 8GB | - -Table 2: My recommended system swap space. - -It's possible that neither of these tables will work for your environment, but they will give you a place to start. The main consideration is that as the amount of RAM increases, adding more swap space simply leads to thrashing well before the swap space comes close to being filled. If you have too little virtual memory, you should add more RAM, if possible, rather than more swap space. - -In order to test the Fedora (and RHEL) swap space recommendations, I used its recommendation of **0.5*RAM** on my two largest systems (the ones with 32GB and 64GB of RAM). Even when running four or five VMs, multiple documents in LibreOffice, Thunderbird, the Chrome web browser, several terminal emulator sessions, the Xfe file manager, and a number of other background applications, the only time I see any use of swap is during backups I have scheduled for every morning at about 2am. Even then, swap usage is no more than 16MB—yes megabytes. These results are for my system with my loads and do not necessarily apply to your real-world environment. - -I recently had a conversation about swap space with some of the other Community Moderators here at [Opensource.com][2], and Chris Short, one of my friends in that illustrious and talented group, pointed me to an old [article][3] where he recommended using 1GB for swap space. This article was written in 2003, and he told me later that he now recommends zero swap space. - -So, we wondered, what you think? What do you recommend or use on your systems for swap space? - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/swap-space-poll - -作者:[David Both][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dboth -[b]: https://github.com/lujun9972 -[1]: https://docs.fedoraproject.org/en-US/fedora/f28/install-guide/ -[2]: http://Opensource.com -[3]: https://chrisshort.net/moving-to-linux-partitioning/ diff --git a/sources/tech/20190212 Top 10 Best Linux Media Server Software.md b/sources/tech/20190212 Top 10 Best Linux Media Server Software.md deleted file mode 100644 index 8fcea6343a..0000000000 --- a/sources/tech/20190212 Top 10 Best Linux Media Server Software.md +++ /dev/null @@ -1,229 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Top 10 Best Linux Media Server Software) -[#]: via: (https://itsfoss.com/best-linux-media-server) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -Top 10 Best Linux Media Server Software -====== - -Did someone tell you that Linux is just for programmers? That is so wrong! You have got a lot of great tools for [digital artists][1], [writers][2] and musicians. - -We have covered such tools in the past. Today it’s going to be slightly different. Instead of creating new digital content, let’s talk about consuming it. - -You have probably heard of media servers? Basically these software (and sometimes gadgets) allow you to view your local or cloud media (music, videos etc) in an intuitive interface. You can even use it to stream the content to other devices on your network. Sort of your personal Netflix. - -In this article, we will talk about the best media software available for Linux that you can use as a media player or as a media server software – as per your requirements. - -Some of these applications can also be used with Google’s Chromecast and Amazon’s Firestick. - -### Best Media Server Software for Linux - -![Best Media Server Software for Linux][3] - -The mentioned Linux media server software are in no particular order of ranking. - -I have tried to provide installation instructions for Ubuntu and Debian based distributions. It’s not possible to list installation steps for all Linux distributions for all the media servers mentioned here. Please take no offence for that. - -A couple of software in this list are not open source. If that’s the case, I have highlighted it appropriately. - -### 1\. Kodi - -![Kodi Media Server][4] - -Kod is one of the most popular media server software and player. Recently, Kodi 18.0 dropped in with a bunch of improvements that includes the support for Digital Rights Management (DRM) decryption, game emulators, ROMs, voice control, and more. - -It is a completely free and open source software. An active community for discussions and support exists as well. The user interface for Kodi is beautiful. I haven’t had the chance to use it in its early days – but I was amazed to see such a good UI for a Linux application. - -It has got great playback support – so you can add any supported 3rd party media service for the content or manually add the ripped video files to watch. - -#### How to install Kodi - -Type in the following commands in the terminal to install the latest version of Kodi via its [official PPA][5]. - -``` -sudo apt-get install software-properties-common -sudo add-apt-repository ppa:team-xbmc/ppa -sudo apt-get update -sudo apt-get install kodi -``` - -To know more about installing a development build or upgrading Kodi, refer to the [official installation guide][6]. - -### 2\. Plex - -![Plex Media Server][7] - -Plex is yet another impressive media player or could be used as a media server software. It is a great alternative to Kodi for the users who mostly utilize it to create an offline network of their media collection to sync and watch across multiple devices. - -Unlike Kodi, **Plex is not entirely open source**. It does offer a free account in order to use it. In addition, it offers premium pricing plans to unlock more features and have a greater control over your media while also being able to get a detailed insight on who/what/how Plex is being used. - -If you are an audiophile, you would love the integration of Plex with [TIDAL][8] music streaming service. You can also set up Live TV by adding it to your tuner. - -#### How to install Plex - -You can simply download the .deb file available on their official webpage and install it directly (or using [GDebi][9]) - -### 3\. Jellyfin - -![Emby media server][10] - -Yet another open source media server software with a bunch of features. [Jellyfin][11] is actually a fork of Emby media server. It may be one of the best out there available for ‘free’ but the multi-platform support still isn’t there yet. - -You can run it on a browser or utilize Chromecast – however – you will have to wait if you want the Android app or if you want it to support several devices. - -#### How to install Jellyfin - -Jellyfin provides a [detailed documentation][12] on how to install it from the binary packages/image available for Linux, Docker, and more. - -You will also find it easy to install it from the repository via the command line for Debian-based distribution. Check out their [installation guide][13] for more information. - -### 4\. LibreELEC - -![libreELEC][14] - -LibreELEC is an interesting media server software which is based on Kodi v18.0. They have recently released a new version (9.0.0) with a complete overhaul of the core OS support, hardware compatibility and user experience. - -Of course, being based on Kodi, it also has the DRM support. In addition, you can utilize its generic Linux builds or the special ones tailored for Raspberry Pi builds, WeTek devices, and more. - -#### How to install LibreELEC - -You can download the installer from their [official site][15]. For detailed instructions on how to use it, please refer to the [installation guide][16]. - -### 5\. OpenFLIXR Media Server - -![OpenFLIXR Media Server][17] - -Want something similar that compliments Plex media server but also compatible with VirtualBox or VMWare? You got it! - -OpenFLIXR is an automated media server software which integrates with Plex to provide all the features along with the ability to auto download TV shows and movies from Torrents. It even fetches the subtitles automatically giving you a seamless experience when coupled with Plex media software. - -You can also automate your home theater with this installed. In case you do not want to run it on a physical instance, it supports VMware, VirtualBox and Hyper-V as well. The best part is – it is an open source solution and based on Ubuntu Server. - -#### How to install OpenFLIXR - -The best way to do it is by installing VirtualBox – it will be easier. After you do that, just download it from the [official website][18] and import it. - -### 6\. MediaPortal - -![MediaPortal][19] - -MediaPortal is just another open source simple media server software with a decent user interface. It all depends on your personal preference – event though I would recommend Kodi over this. - -You can play DVDs, stream videos on your local network, and listen to music as well. It does not offer a fancy set of features but the ones you will mostly need. - -It gives you the option to choose from two different versions (one that is stable and the second which tries to incorporate new features – could be unstable). - -#### How to install MediaPotal - -Depending on what you want to setup (A TV-server only or a complete server setup), follow the [official setup guide][20] to install it properly. - -### 7\. Gerbera - -![Gerbera Media Center][21] - -A simple implementation for a media server to be able to stream using your local network. It does support transcoding which will convert the media in the format your device supports. - -If you have been following the options for media server form a very long time, then you might identify this as the rebranded (and improved) version of MediaTomb. Even though it is not a popular choice among the Linux users – it is still something usable when all fails or for someone who prefers a straightforward and a basic media server. - -#### How to install Gerbera - -Type in the following commands in the terminal to install it on any Ubuntu-based distro: - -``` -sudo apt install gerbera -``` - -For other Linux distributions, refer to the [documentation][22]. - -### 8\. OSMC (Open Source Media Center) - -![OSMC Open Source Media Center][23] - -It is an elegant-looking media server software originally based on Kodi media center. I was quite impressed with the user interface. It is simple and robust, being a free and open source solution. In a nutshell, all the essential features you would expect in a media server software. - -You can also opt in to purchase OSMC’s flagship device. It will play just about anything up to 4K standards with HD audio. In addition, it supports Raspberry Pi builds and 1st-gen Apple TV. - -#### How to install OSMC - -If your device is compatible, you can just select your operating system and download the device installer from the official [download page][24] and create a bootable image to install. - -### 9\. Universal Media Server - -![][25] - -Yet another simple addition to this list. Universal Media Server does not offer any fancy features but just helps you transcode / stream video and audio without needing much configuration. - -It supports Xbox 360, PS 3, and just about any other [DLNA][26]-capable devices. - -#### How to install Universal Media Center - -You can find all the packages listed on [FossHub][27] but you should follow the [official forum][28] to know more about how to install the package that you downloaded from the website. - -### 10\. Red5 Media Server - -![Red5 Media Server][29]Image Credit: [Red5 Server][30] - -A free and open source media server tailored for enterprise usage. You can use it for live streaming solutions – no matter if it is for entertainment or just video conferencing. - -They also offer paid licensing options for mobiles and high scalability. - -#### How to install Red5 - -Even though it is not the quickest installation method, follow the [installation guide on GitHub][31] to get started with the server without needing to tinker around. - -### Wrapping Up - -Every media server software listed here has its own advantages – you should pick one up and try the one which suits your requirement. - -Did we miss any of your favorite media server software? Let us know about it in the comments below! - - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/best-linux-media-server - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/best-linux-graphic-design-software/ -[2]: https://itsfoss.com/open-source-tools-writers/ -[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/best-media-server-linux.png?resize=800%2C450&ssl=1 -[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/kodi-18-media-server.jpg?fit=800%2C450&ssl=1 -[5]: https://itsfoss.com/ppa-guide/ -[6]: https://kodi.wiki/view/HOW-TO:Install_Kodi_for_Linux -[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/plex.jpg?fit=800%2C368&ssl=1 -[8]: https://tidal.com/ -[9]: https://itsfoss.com/gdebi-default-ubuntu-software-center/ -[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/emby-server.jpg?fit=800%2C373&ssl=1 -[11]: https://jellyfin.github.io/ -[12]: https://jellyfin.readthedocs.io/en/latest/ -[13]: https://jellyfin.readthedocs.io/en/latest/administrator-docs/installing/ -[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/libreelec.jpg?resize=800%2C600&ssl=1 -[15]: https://libreelec.tv/downloads_new/ -[16]: https://libreelec.wiki/libreelec_usb-sd_creator -[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/openflixr-media-server.jpg?fit=800%2C449&ssl=1 -[18]: http://www.openflixr.com/#Download -[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/mediaportal.jpg?ssl=1 -[20]: https://www.team-mediaportal.com/wiki/display/MediaPortal1/Quick+Setup -[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/gerbera-server-softwarei.jpg?fit=800%2C583&ssl=1 -[22]: http://docs.gerbera.io/en/latest/install.html -[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/osmc-server.jpg?fit=800%2C450&ssl=1 -[24]: https://osmc.tv/download/ -[25]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/universal-media-server.jpg?ssl=1 -[26]: https://en.wikipedia.org/wiki/Digital_Living_Network_Alliance -[27]: https://www.fosshub.com/Universal-Media-Server.html?dwl=UMS-7.8.0.tgz -[28]: https://www.universalmediaserver.com/forum/viewtopic.php?t=10275 -[29]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/red5.jpg?resize=800%2C364&ssl=1 -[30]: https://www.red5server.com/ -[31]: https://github.com/Red5/red5-server/wiki/Installation-on-Linux -[32]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/best-media-server-linux.png?fit=800%2C450&ssl=1 diff --git a/sources/tech/20190213 How to build a WiFi picture frame with a Raspberry Pi.md b/sources/tech/20190213 How to build a WiFi picture frame with a Raspberry Pi.md deleted file mode 100644 index 615f7620ed..0000000000 --- a/sources/tech/20190213 How to build a WiFi picture frame with a Raspberry Pi.md +++ /dev/null @@ -1,135 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: 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) - -How to build a WiFi picture frame with a Raspberry Pi -====== -DIY a digital photo frame that streams photos from the cloud. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/raspberrypi_board_vector_red.png?itok=yaqYjYqI) - -Digital picture frames are really nice because they let you enjoy your photos without having to print them out. Plus, adding and removing digital files is a lot easier than opening a traditional frame and swapping the picture inside when you want to display a new photo. Even so, it's still a bit of overhead to remove your SD card, USB stick, or other storage from a digital picture frame, plug it into your computer, and copy new pictures onto it. - -An easier option is a digital picture frame that gets its pictures over WiFi, for example from a cloud service. Here's how to make one. - -### Gather your materials - - * Old [TFT][1] LCD screen - * HDMI-to-DVI cable (as the TFT screen supports DVI) - * Raspberry Pi 3 - * Micro SD card - * Raspberry Pi power supply - * Keyboard - * Mouse (optional) - - - -Connect the Raspberry Pi to the display using the cable and attach the power supply. - -### Install Raspbian - -**sudo raspi-config**. There I change the hostname (e.g., to **picframe** ) in Network Options and enable SSH to work remotely on the Raspberry Pi in Interfacing Options. Connect to the Raspberry Pi using (for example) . - -### Build and install the cloud client - -Download and flash Raspbian to the Micro SD card by following these [directions][2] . Plug the Micro SD card into the Raspberry Pi, boot it up, and configure your WiFi. My first action after a new Raspbian installation is usually running. There I change the hostname (e.g., to) in Network Options and enable SSH to work remotely on the Raspberry Pi in Interfacing Options. Connect to the Raspberry Pi using (for example) - -I use [Nextcloud][3] to synchronize my pictures, but you could use NFS, [Dropbox][4], or whatever else fits your needs to upload pictures to the frame. - -If you use Nextcloud, get a client for Raspbian by following these [instructions][5]. This is handy for placing new pictures on your picture frame and will give you the client application you may be familiar with on a desktop PC. When connecting the client application to your Nextcloud server, make sure to select only the folder where you'll store the images you want to be displayed on the picture frame. - -### Set up the slideshow - -The easiest way I've found to set up the slideshow is with a [lightweight slideshow project][6] built for exactly this purpose. There are some alternatives, like configuring a screensaver, but this application appears to be the simplest to set up. - -On your Raspberry Pi, download the binaries from the latest release, unpack them, and move them to an executable folder: - -``` -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/ -``` - -Install the dependencies: - -``` -sudo apt install libexif12 qt5-default -``` - -Run the slideshow by executing the command below (don't forget to modify the path to your images). If you access your Raspberry Pi via SSH, set the **DISPLAY** variable to start the slideshow on the display attached to the Raspberry Pi. - -``` -DISPLAY=:0.0 slide -p /home/pi/nextcloud/picframe -``` - -### Autostart the slideshow - -To autostart the slideshow on Raspbian Stretch, create the following folder and add an **autostart** file to it: - -``` -mkdir -p /home/pi/.config/lxsession/LXDE/ -vi /home/pi/.config/lxsession/LXDE/autostart -``` - -Insert the following commands to autostart your slideshow. The **slide** command can be adjusted to your needs: - -``` -@xset s noblank -@xset s off -@xset -dpms -@slide -p -t 60 -o 200 -p /home/pi/nextcloud/picframe -``` - -Disable screen blanking, which the Raspberry Pi normally does after 10 minutes, by editing the following file: - -``` -vi /etc/lightdm/lightdm.conf -``` - -and adding these two lines to the end: - -``` -[SeatDefaults] -xserver-command=X -s 0 -dpms -``` - -### Configure a power-on schedule - -You can schedule your picture frame to turn on and off at specific times by using two simple cronjobs. For example, say you want it to turn on automatically at 7 am and turn off at 11 pm. Run **crontab -e** and insert the following two lines. - -``` -0 23 * * * /opt/vc/bin/tvservice -o - -0 7 * * * /opt/vc/bin/tvservice -p && sudo systemctl restart display-manager -``` - -Note that this won't turn the Raspberry Pi power's on and off; it will just turn off HDMI, which will turn the screen off. The first line will power off HDMI at 11 pm. The second line will bring the display back up and restart the display manager at 7 am. - -### Add a final touch - -By following these simple steps, you can create your own WiFi picture frame. If you want to give it a nicer look, build a wooden frame for the display. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/wifi-picture-frame-raspberry-pi - -作者:[Manuel Dewald][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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 diff --git a/sources/tech/20190215 Make websites more readable with a shell script.md b/sources/tech/20190215 Make websites more readable with a shell script.md deleted file mode 100644 index 06b748cfb5..0000000000 --- a/sources/tech/20190215 Make websites more readable with a shell script.md +++ /dev/null @@ -1,258 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Make websites more readable with a shell script) -[#]: via: (https://opensource.com/article/19/2/make-websites-more-readable-shell-script) -[#]: author: (Jim Hall https://opensource.com/users/jim-hall) - -Make websites more readable with a shell script -====== -Calculate the contrast ratio between your website's text and background to make sure your site is easy to read. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_team_mobile_desktop.png?itok=d7sRtKfQ) - -If you want people to find your website useful, they need to be able to read it. The colors you choose for your text can affect the readability of your site. Unfortunately, a popular trend in web design is to use low-contrast colors when printing text, such as gray text on a white background. Maybe that looks really cool to the web designer, but it is really hard for many of us to read. - -The W3C provides Web Content Accessibility Guidelines, which includes guidance to help web designers pick text and background colors that can be easily distinguished from each other. This is called the "contrast ratio." The W3C definition of the contrast ratio requires several calculations: given two colors, you first compute the relative luminance of each, then calculate the contrast ratio. The ratio will fall in the range 1 to 21 (typically written 1:1 to 21:1). The higher the contrast ratio, the more the text will stand out against the background. For example, black text on a white background is highly visible and has a contrast ratio of 21:1. And white text on a white background is unreadable at a contrast ratio of 1:1. - -The [W3C says body text][1] should have a contrast ratio of at least 4.5:1 with headings at least 3:1. But that seems to be the bare minimum. The W3C also recommends at least 7:1 for body text and at least 4.5:1 for headings. - -Calculating the contrast ratio can be a chore, so it's best to automate it. I've done that with this handy Bash script. In general, the script does these things: - - 1. Gets the text color and background color - 2. Computes the relative luminance of each - 3. Calculates the contrast ratio - - - -### Get the colors - -You may know that every color on your monitor can be represented by red, green, and blue (R, G, and B). To calculate the relative luminance of a color, my script will need to know the red, green, and blue components of the color. Ideally, my script would read this information as separate R, G, and B values. Web designers might know the specific RGB code for their favorite colors, but most humans don't know RGB values for the different colors. Instead, most people reference colors by names like "red" or "gold" or "maroon." - -Fortunately, the GNOME [Zenity][2] tool has a color-picker app that lets you use different methods to select a color, then returns the RGB values in a predictable format of "rgb( **R** , **G** , **B** )". Using Zenity makes it easy to get a color value: - -``` -color=$( zenity --title 'Set text color' --color-selection --color='black' ) -``` - -In case the user (accidentally) clicks the Cancel button, the script assumes a color: - -``` -if [ $? -ne 0 ] ; then -        echo '** color canceled .. assume black' -        color='rgb(0,0,0)' -fi -``` - -My script does something similar to set the background color value as **$background**. - -### Compute the relative luminance - -Once you have the foreground color in **$color** and the background color in **$background** , the next step is to compute the relative luminance for each. On its website, the [W3C provides an algorithm][3] to compute the relative luminance of a color. - -> For the sRGB colorspace, the relative luminance of a color is defined as -> **L = 0.2126 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated R + 0.7152 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated G + 0.0722 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated B** where R, G and B are defined as: -> -> if RsRGB <= 0.03928 then R = RsRGB/12.92 -> else R = ((RsRGB+0.055)/1.055) ^ 2.4 -> -> if GsRGB <= 0.03928 then G = GsRGB/12.92 -> else G = ((GsRGB+0.055)/1.055) ^ 2.4 -> -> if BsRGB <= 0.03928 then B = BsRGB/12.92 -> else B = ((BsRGB+0.055)/1.055) ^ 2.4 -> -> and RsRGB, GsRGB, and BsRGB are defined as: -> -> RsRGB = R8bit/255 -> -> GsRGB = G8bit/255 -> -> BsRGB = B8bit/255 - -Since Zenity returns color values in the format "rgb( **R** , **G** , **B** )," the script can easily pull apart the R, B, and G values to compute the relative luminance. AWK makes this a simple task, using the comma as the field separator ( **-F,** ) and using AWK's **substr()** string function to pick just the text we want from the "rgb( **R** , **G** , **B** )" color value: - -``` -R=$( echo $color | awk -F, '{print substr($1,5)}' ) -G=$( echo $color | awk -F, '{print $2}' ) -B=$( echo $color | awk -F, '{n=length($3); print substr($3,1,n-1)}' ) -``` - -**(For more on extracting and displaying data with AWK,[Get our AWK cheat sheet][4].)** - -Calculating the final relative luminance is best done using the BC calculator. BC supports the simple if-then-else needed in the calculation, which makes this part simple. But since BC cannot directly calculate exponentiation using a non-integer exponent, we need to do some extra math using the natural logarithm instead: - -``` -echo "scale=4 -rsrgb=$R/255 -gsrgb=$G/255 -bsrgb=$B/255 -if ( rsrgb <= 0.03928 ) r = rsrgb/12.92 else r = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((rsrgb+0.055)/1.055) ) -if ( gsrgb <= 0.03928 ) g = gsrgb/12.92 else g = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((gsrgb+0.055)/1.055) ) -if ( bsrgb <= 0.03928 ) b = bsrgb/12.92 else b = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((bsrgb+0.055)/1.055) ) -0.2126 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated r + 0.7152 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated g + 0.0722 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated b" | bc -l -``` - -This passes several instructions to BC, including the if-then-else statements that are part of the relative luminance formula. BC then prints the final value. - -### Calculate the contrast ratio - -With the relative luminance of the text color and the background color, now the script can calculate the contrast ratio. The [W3C determines the contrast ratio][5] with this formula: - -> (L1 + 0.05) / (L2 + 0.05), where -> L1 is the relative luminance of the lighter of the colors, and -> L2 is the relative luminance of the darker of the colors - -Given two relative luminance values **$r1** and **$r2** , it's easy to calculate the contrast ratio using the BC calculator: - -``` -echo "scale=2 -if ( $r1 > $r2 ) { l1=$r1; l2=$r2 } else { l1=$r2; l2=$r1 } -(l1 + 0.05) / (l2 + 0.05)" | bc -``` - -This uses an if-then-else statement to determine which value ( **$r1** or **$r2** ) is the lighter or darker color. BC performs the resulting calculation and prints the result, which the script can store in a variable. - -### The final script - -With the above, we can pull everything together into a final script. I use Zenity to display the final result in a text box: - -``` -#!/bin/sh -# script to calculate contrast ratio of colors - -# read color and background color: -# zenity returns values like 'rgb(255,140,0)' and 'rgb(255,255,255)' - -color=$( zenity --title 'Set text color' --color-selection --color='black' ) -if [ $? -ne 0 ] ; then -        echo '** color canceled .. assume black' -        color='rgb(0,0,0)' -fi - -background=$( zenity --title 'Set background color' --color-selection --color='white' ) -if [ $? -ne 0 ] ; then -        echo '** background canceled .. assume white' -        background='rgb(255,255,255)' -fi - -# compute relative luminance: - -function luminance() -{ -        R=$( echo $1 | awk -F, '{print substr($1,5)}' ) -        G=$( echo $1 | awk -F, '{print $2}' ) -        B=$( echo $1 | awk -F, '{n=length($3); print substr($3,1,n-1)}' ) - -        echo "scale=4 -rsrgb=$R/255 -gsrgb=$G/255 -bsrgb=$B/255 -if ( rsrgb <= 0.03928 ) r = rsrgb/12.92 else r = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((rsrgb+0.055)/1.055) ) -if ( gsrgb <= 0.03928 ) g = gsrgb/12.92 else g = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((gsrgb+0.055)/1.055) ) -if ( bsrgb <= 0.03928 ) b = bsrgb/12.92 else b = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((bsrgb+0.055)/1.055) ) -0.2126 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated r + 0.7152 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated g + 0.0722 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated b" | bc -l -} - -lum1=$( luminance $color ) -lum2=$( luminance $background ) - -# compute contrast - -function contrast() -{ -        echo "scale=2 -if ( $1 > $2 ) { l1=$1; l2=$2 } else { l1=$2; l2=$1 } -(l1 + 0.05) / (l2 + 0.05)" | bc -} - -rel=$( contrast $lum1 $lum2 ) - -# print results - -( cat< -``` - -Alternatively, add the following to the beginning of each of your BATS test scripts: - -``` -#!/usr/bin/env ./test/libs/bats/bin/bats -load 'libs/bats-support/load' -load 'libs/bats-assert/load' -``` - -and **chmod +x **. This will a) make them executable with the BATS installed in **./test/libs/bats** and b) include these helper libraries. BATS test scripts are typically stored in the **test** directory and named for the script being tested, but with the **.bats** extension. For example, a BATS script that tests **bin/build** should be called **test/build.bats**. - -You can also run an entire set of BATS test files by passing a regular expression to BATS, e.g., **./test/lib/bats/bin/bats test/*.bats**. - -### Organizing libraries and scripts for BATS coverage - -Bash scripts and libraries must be organized in a way that efficiently exposes their inner workings to BATS. In general, library functions and shell scripts that run many commands when they are called or executed are not amenable to efficient BATS testing. - -For example, [build.sh][4] is a typical script that many people write. It is essentially a big pile of code. Some might even put this pile of code in a function in a library. But it's impossible to run a big pile of code in a BATS test and cover all possible types of failures it can encounter in separate test cases. The only way to test this pile of code with sufficient coverage is to break it into many small, reusable, and, most importantly, independently testable functions. - -It's straightforward to add more functions to a library. An added benefit is that some of these functions can become surprisingly useful in their own right. Once you have broken your library function into lots of smaller functions, you can **source** the library in your BATS test and run the functions as you would any other command to test them. - -Bash scripts must also be broken down into multiple functions, which the main part of the script should call when the script is executed. In addition, there is a very useful trick to make it much easier to test Bash scripts with BATS: Take all the code that is executed in the main part of the script and move it into a function, called something like **run_main**. Then, add the following to the end of the script: - -``` -if [[ "${BASH_SOURCE[0]}" == "${0}" ]] -then -  run_main -fi -``` - -This bit of extra code does something special. It makes the script behave differently when it is executed as a script than when it is brought into the environment with **source**. This trick enables the script to be tested the same way a library is tested, by sourcing it and testing the individual functions. For example, here is [build.sh refactored for better BATS testability][5]. - -### Writing and running tests - -As mentioned above, BATS is a TAP-compliant testing framework with a syntax and output that will be familiar to those who have used other TAP-compliant testing suites, such as JUnit, RSpec, or Jest. Its tests are organized into individual test scripts. Test scripts are organized into one or more descriptive **@test** blocks that describe the unit of the application being tested. Each **@test** block will run a series of commands that prepares the test environment, runs the command to be tested, and makes assertions about the exit and output of the tested command. Many assertion functions are imported with the **bats** , **bats-assert** , and **bats-support** libraries, which are loaded into the environment at the beginning of the BATS test script. Here is a typical BATS test block: - -``` -@test "requires CI_COMMIT_REF_SLUG environment variable" { -  unset CI_COMMIT_REF_SLUG -  assert_empty "${CI_COMMIT_REF_SLUG}" -  run some_command -  assert_failure -  assert_output --partial "CI_COMMIT_REF_SLUG" -} -``` - -If a BATS script includes **setup** and/or **teardown** functions, they are automatically executed by BATS before and after each test block runs. This makes it possible to create environment variables, test files, and do other things needed by one or all tests, then tear them down after each test runs. [**Build.bats**][6] is a full BATS test of our newly formatted **build.sh** script. (The **mock_docker** command in this test will be explained below, in the section on mocking/stubbing.) - -When the test script runs, BATS uses **exec** to run each **@test** block as a separate subprocess. This makes it possible to export environment variables and even functions in one **@test** without affecting other **@test** s or polluting your current shell session. The output of a test run is a standard format that can be understood by humans and parsed or manipulated programmatically by TAP consumers. Here is an example of the output for the **CI_COMMIT_REF_SLUG** test block when it fails: - -``` - ✗ requires CI_COMMIT_REF_SLUG environment variable -   (from function `assert_output' in file test/libs/bats-assert/src/assert.bash, line 231, -    in test file test/ci_deploy.bats, line 26) -     `assert_output --partial "CI_COMMIT_REF_SLUG"' failed - -   -- output does not contain substring -- -   substring (1 lines): -     CI_COMMIT_REF_SLUG -   output (3 lines): -     ./bin/deploy.sh: join_string_by: command not found -     oc error -     Could not login -   -- - -   ** Did not delete , as test failed ** - -1 test, 1 failure -``` - -Here is the output of a successful test: - -``` -✓ requires CI_COMMIT_REF_SLUG environment variable -``` - -### Helpers - -Like any shell script or library, BATS test scripts can include helper libraries to share common code across tests or enhance their capabilities. These helper libraries, such as **bats-assert** and **bats-support** , can even be tested with BATS. - -Libraries can be placed in the same test directory as the BATS scripts or in the **test/libs** directory if the number of files in the test directory gets unwieldy. BATS provides the **load** function that takes a path to a Bash file relative to the script being tested (e.g., **test** , in our case) and sources that file. Files must end with the prefix **.bash** , but the path to the file passed to the **load** function can't include the prefix. **build.bats** loads the **bats-assert** and **bats-support** libraries, a small **[helpers.bash][7]** library, and a **docker_mock.bash** library (described below) with the following code placed at the beginning of the test script below the interpreter magic line: - -``` -load 'libs/bats-support/load' -load 'libs/bats-assert/load' -load 'helpers' -load 'docker_mock' -``` - -### Stubbing test input and mocking external calls - -The majority of Bash scripts and libraries execute functions and/or executables when they run. Often they are programmed to behave in specific ways based on the exit status or output ( **stdout** , **stderr** ) of these functions or executables. To properly test these scripts, it is often necessary to make fake versions of these commands that are designed to behave in a specific way during a specific test, a process called "stubbing." It may also be necessary to spy on the program being tested to ensure it calls a specific command, or it calls a specific command with specific arguments, a process called "mocking." For more on this, check out this great [discussion of mocking and stubbing][8] in Ruby RSpec, which applies to any testing system. - -The Bash shell provides tricks that can be used in your BATS test scripts to do mocking and stubbing. All require the use of the Bash **export** command with the **-f** flag to export a function that overrides the original function or executable. This must be done before the tested program is executed. Here is a simple example that overrides the **cat** executable: - -``` -function cat() { echo "THIS WOULD CAT ${*}" } -export -f cat -``` - -This method overrides a function in the same manner. If a test needs to override a function within the script or library being tested, it is important to source the tested script or library before the function is stubbed or mocked. Otherwise, the stub/mock will be replaced with the actual function when the script is sourced. Also, make sure to stub/mock before you run the command you're testing. Here is an example from **build.bats** that mocks the **raise** function described in **build.sh** to ensure a specific error message is raised by the login fuction: - -``` -@test ".login raises on oc error" { -  source ${profile_script} -  function raise() { echo "${1} raised"; } -  export -f raise -  run login -  assert_failure -  assert_output -p "Could not login raised" -} -``` - -Normally, it is not necessary to unset a stub/mock function after the test, since **export** only affects the current subprocess during the **exec** of the current **@test** block. However, it is possible to mock/stub commands (e.g. **cat** , **sed** , etc.) that the BATS **assert** * functions use internally. These mock/stub functions must be **unset** before these assert commands are run, or they will not work properly. Here is an example from **build.bats** that mocks **sed** , runs the **build_deployable** function, and unsets **sed** before running any assertions: - -``` -@test ".build_deployable prints information, runs docker build on a modified Dockerfile.production and publish_image when its not a dry_run" { -  local expected_dockerfile='Dockerfile.production' -  local application='application' -  local environment='environment' -  local expected_original_base_image="${application}" -  local expected_candidate_image="${application}-candidate:${environment}" -  local expected_deployable_image="${application}:${environment}" -  source ${profile_script} -  mock_docker build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t "${expected_deployable_image}" - -  function publish_image() { echo "publish_image ${*}"; } -  export -f publish_image -  function sed() { -    echo "sed ${*}" >&2; -    echo "FROM application-candidate:environment"; -  } -  export -f sed -  run build_deployable "${application}" "${environment}" -  assert_success -  unset sed -  assert_output --regexp "sed.*${expected_dockerfile}" -  assert_output -p "Building ${expected_original_base_image} deployable ${expected_deployable_image} FROM ${expected_candidate_image}" -  assert_output -p "FROM ${expected_candidate_image} piped" -  assert_output -p "build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t ${expected_deployable_image} -" -  assert_output -p "publish_image ${expected_deployable_image}" -} -``` - -Sometimes the same command, e.g. foo, will be invoked multiple times, with different arguments, in the same function being tested. These situations require the creation of a set of functions: - - * mock_foo: takes expected arguments as input, and persists these to a TMP file - * foo: the mocked version of the command, which processes each call with the persisted list of expected arguments. This must be exported with export -f. - * cleanup_foo: removes the TMP file, for use in teardown functions. This can test to ensure that a @test block was successful before removing. - - - -Since this functionality is often reused in different tests, it makes sense to create a helper library that can be loaded like other libraries. - -A good example is **[docker_mock.bash][9]**. It is loaded into **build.bats** and used in any test block that tests a function that calls the Docker executable. A typical test block using **docker_mock** looks like: - -``` -@test ".publish_image fails if docker push fails" { -  setup_publish -  local expected_image="image" -  local expected_publishable_image="${CI_REGISTRY_IMAGE}/${expected_image}" -  source ${profile_script} -  mock_docker tag "${expected_image}" "${expected_publishable_image}" -  mock_docker push "${expected_publishable_image}" and_fail -  run publish_image "${expected_image}" -  assert_failure -  assert_output -p "tagging ${expected_image} as ${expected_publishable_image}" -  assert_output -p "tag ${expected_image} ${expected_publishable_image}" -  assert_output -p "pushing image to gitlab registry" -  assert_output -p "push ${expected_publishable_image}" -} -``` - -This test sets up an expectation that Docker will be called twice with different arguments. With the second call to Docker failing, it runs the tested command, then tests the exit status and expected calls to Docker. - -One aspect of BATS introduced by **mock_docker.bash** is the **${BATS_TMPDIR}** environment variable, which BATS sets at the beginning to allow tests and helpers to create and destroy TMP files in a standard location. The **mock_docker.bash** library will not delete its persisted mocks file if a test fails, but it will print where it is located so it can be viewed and deleted. You may need to periodically clean old mock files out of this directory. - -One note of caution regarding mocking/stubbing: The **build.bats** test consciously violates a dictum of testing that states: [Don't mock what you don't own!][10] This dictum demands that calls to commands that the test's developer didn't write, like **docker** , **cat** , **sed** , etc., should be wrapped in their own libraries, which should be mocked in tests of scripts that use them. The wrapper libraries should then be tested without mocking the external commands. - -This is good advice and ignoring it comes with a cost. If the Docker CLI API changes, the test scripts will not detect this change, resulting in a false positive that won't manifest until the tested **build.sh** script runs in a production setting with the new version of Docker. Test developers must decide how stringently they want to adhere to this standard, but they should understand the tradeoffs involved with their decision. - -### Conclusion - -Introducing a testing regime to any software development project creates a tradeoff between a) the increase in time and organization required to develop and maintain code and tests and b) the increased confidence developers have in the integrity of the application over its lifetime. Testing regimes may not be appropriate for all scripts and libraries. - -In general, scripts and libraries that meet one or more of the following should be tested with BATS: - - * They are worthy of being stored in source control - * They are used in critical processes and relied upon to run consistently for a long period of time - * They need to be modified periodically to add/remove/modify their function - * They are used by others - - - -Once the decision is made to apply a testing discipline to one or more Bash scripts or libraries, BATS provides the comprehensive testing features that are available in other software development environments. - -Acknowledgment: I am indebted to [Darrin Mann][11] for introducing me to BATS testing. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/testing-bash-bats - -作者:[Darin London][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dmlond -[b]: https://github.com/lujun9972 -[1]: https://github.com/sstephenson/bats -[2]: http://testanything.org/ -[3]: https://git-scm.com/book/en/v2/Git-Tools-Submodules -[4]: https://github.com/dmlond/how_to_bats/blob/preBats/build.sh -[5]: https://github.com/dmlond/how_to_bats/blob/master/bin/build.sh -[6]: https://github.com/dmlond/how_to_bats/blob/master/test/build.bats -[7]: https://github.com/dmlond/how_to_bats/blob/master/test/helpers.bash -[8]: https://www.codewithjason.com/rspec-mocks-stubs-plain-english/ -[9]: https://github.com/dmlond/how_to_bats/blob/master/test/docker_mock.bash -[10]: https://github.com/testdouble/contributing-tests/wiki/Don't-mock-what-you-don't-own -[11]: https://github.com/dmann diff --git a/sources/tech/20190222 Q4OS Linux Revives Your Old Laptop with Windows- Looks.md b/sources/tech/20190222 Q4OS Linux Revives Your Old Laptop with Windows- Looks.md deleted file mode 100644 index 93549ac45b..0000000000 --- a/sources/tech/20190222 Q4OS Linux Revives Your Old Laptop with Windows- Looks.md +++ /dev/null @@ -1,192 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Q4OS Linux Revives Your Old Laptop with Windows’ Looks) -[#]: via: (https://itsfoss.com/q4os-linux-review) -[#]: author: (John Paul https://itsfoss.com/author/john/) - -Q4OS Linux Revives Your Old Laptop with Windows’ Looks -====== - -There are quite a few Linux distros available that seek to make new users feel at home by [imitating the look and feel of Windows][1]. Today, we’ll look at a distro that attempts to do this with limited success We’ll be looking at [Q4OS][2]. - -### Q4OS Linux focuses on performance on low hardware - -![Q4OS Linux desktop after first boot][3]Q4OS after first boot - -> Q4OS is a fast and powerful operating system based on the latest technologies while offering highly productive desktop environment. We focus on security, reliability, long-term stability and conservative integration of verified new features. System is distinguished by speed and very low hardware requirements, runs great on brand new machines as well as legacy computers. It is also very applicable for virtualization and cloud computing. -> -> Q4OS Website - -Q4OS currently has two different release branches: 2.# Scorpion and 3.# Centaurus. Scorpion is the Long-Term-Support (LTS) release and will be supported for five years. That support should last until 2022. The most recent version of Scorpion is 2.6, which is based on [Debian][4] 9 Stretch. Centaurus is considered the testing branch and is based on Debian Buster. Centaurus will become the LTS when Debian Buster becomes stable. - -Q4OS is one of the few Linux distros that still support both 32-bit and 64-bit. It has also been ported to ARM devices, specifically the Raspberry PI and the PineBook. - -The one major thing that separates Q4OS from the majority of Linux distros is their use of the Trinity Desktop Environment as the default desktop environment. - -#### The not-so-famous Trinity Desktop Environment - -![][5]Trinity Desktop Environment - -I’m sure that most people are unfamiliar with the [Trinity Desktop Environment (TDE)][6]. I didn’t know until I discovered Q4OS a couple of years ago. TDE is a fork of [KDE][7], specifically KDE 3.5. TDE was created by Timothy Pearson and the first release took place in April 2010. - -From what I read, it sounds like TDE was created for the same reason as [MATE][8]). Early versions of KDE 4 were prone to crash and users were unhappy with the direction the new release was taking, it was decided to fork the previous release. That is where the similarities end. MATE has taken on a life of its own and grew to become an equal among desktop environments. Development of TDE seems to have slowed. There were two years between the last two point releases. - -Quick side note: TDE uses its own fork of Qt 3, named TQt. - -#### System Requirements - -According to the [Q4OS download page][9], the system requirements differ based on the desktop environment you install. - -**TDE Version** - - * At least 300MHz CPU - * 128 MB of RAM - * 3 GB Storage - - - -**KDE Version** - - * At least 1GHz CPU - * 1 GB of RAM - * 5 GB Storage - - - -You can see from the system requirements that Q4OS is a [lightweight Linux distribution suitable for older computers][10]. - -#### Included apps by default - -The following applications are included in the full install of Q4OS: - - * Google Chrome - * Thunderbird - * LibreOffice - * VLC player - * Konqueror browser - * Dolphin file manager - * AisleRiot Solitaire - * Konsole - * Software Center - - - * KMines - * Ockular - * KBounce - * DigiKam - * Kooka - * KolourPaint - * KSnapshot - * Gwenview - * Ark - - - * KMail - * SMPlayer - * KRec - * Brasero - * Amarok player - * qpdfview - * KOrganizer - * KMag - * KNotes - - - -Of course, you can install additional applications through the software center. Since Q4OS is based on Debian, you can also [install applications from deb packages][11]. - -#### Q4OS can be installed from within Windows - -I was able to successfully install TrueOS on my Dell Latitude D630 without any issues. This laptop has an Intel Centrino Duo Core processor running at 2.00 GHz, NVIDIA Quadro NVS 135M graphics chip, and 4 GB of RAM. - -You have a couple of options to choose from when installing Q4OS. You can either install Q4OS with a CD (Live or install) or you can install it from inside Window. The Windows installer asks for the drive location you want to install to, how much space you want Q4OS to take up and what login information do you want to use. - -![][12]Q4OS Windows installer - -Compared to most distros, the Live ISOs are small. The KDE version weighs less than 1GB and the TDE version is just a little north of 500 MB. - -### Experiencing Q4OS: Feels like older Windows versions - -Please note that while there is a KDE installation ISO, I used the TDE installation ISO. The KDE Live CD is a recent addition, so TDE is more in line with the project’s long term goals. - -When you boot into Q4OS for the first time, it feels like you jumped through a time portal and are staring at Windows 2000. The initial app offerings are very slim, you have access to a file manager, a web browser and not much else. There isn’t even a screenshot tool installed. - -![][13]Konqueror film manager - -When you try to use the TDE browser (Konqueror), a dialog box pops up recommending using the Desktop Profiler to [install Google Chrome][14] or some other recent web browser. - -The Desktop Profiler allows you to choose between a bare-bones, basic or full desktop and which desktop environment you wish to use as default. You can also use the Desktop Profiler to install other desktop environments, such as MATE, Xfce, LXQT, LXDE, Cinnamon and GNOME. - -![Q4OS Welcome Screen][15]![Q4OS Welcome Screen][15]Q4OS Welcome Screen - -Q4OS comes with its own application center. However, the offerings are limited to less than 20 options, including Synaptic, Google Chrome, Chromium, Firefox, LibreOffice, Update Manager, VLC, Multimedia codecs, Thunderbird, LookSwitcher, NVIDIA drivers, Network Manager, Skype, GParted, Wine, Blueman, X2Go server, X2Go Client, and Virtualbox additions. - -![][16]Q4OS Software Centre - -If you want to install anything else, you need to either use the command line or the [synaptic package manager][17]. Synaptic is a very good package manager and has been very serviceable for many years, but it isn’t quite newbie friendly. - -If you install an application from the Software Centre, you are treated to an installer that looks a lot like a Windows installer. I can only imagine that this is for people converting to Linux from Windows. - -![][18]Firefox installer - -As I mentioned earlier, when you boot into Q4OS’ desktop for the first time it looks like something out of the 1990s. Thankfully, you can install a utility named LookSwitcher to install a different theme. Initially, you are only shown half a dozen themes. There are other themes that are considered works-in-progress. You can also enhance the default theme by picking a more vibrant background and making the bottom panel transparent. - -![][19]Q4OS using the Debonair theme - -### Final Thoughts on Q4OS - -I may have mentioned a few times in this review that Q4OS looks like a dated version of Windows. It is obviously a very conscious decision because great care was taken to make even the control panel and file manager look Windows-eque. The problem is that it reminds me more of [ReactOS][20] than something modern. The Q4OS website says that it is made using the latest technology. The look of the system disagrees and will probably put some new users off. - -The fact that the install ISOs are smaller than most means that they are very quick to download. Unfortunately, it also means that if you want to be productive, you’ll have to spend quite a bit of time downloading software, either manually or automatically. You’ll also need an active internet connection. There is a reason why most ISOs are several gigabytes. - -I made sure to test the Windows installer. I installed a test copy of Windows 10 and ran the Q4OS installer. The process took a few minutes because the installer, which is less than 10 MB had to download an ISO. When the process was done, I rebooted. I selected Q4OS from the menu, but it looked like I was booting into Windows 10 (got the big blue circle). I thought that the install failed, but I eventually got to Q4OS. - -One of the few things that I liked about Q4OS was how easy it was to install the NVIDIA drivers. After I logged in for the first time, a little pop-up told me that there were NVIDIA drivers available and asked me if I wanted to install them. - -Using Q4OS was definitely an interesting experience, especially using TDE for the first time and the Windows look and feel. However, the lack of apps in the Software Centre and some of the design choices stop me from recommending this distro. - -**Do you like Q4OS?** - -Have you ever used Q4OS? What is your favorite Debian-based distro? Please let us know in the comments below. - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][21]. - - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/q4os-linux-review - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/john/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/windows-like-linux-distributions/ -[2]: https://q4os.org/ -[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os1.jpg?resize=800%2C500&ssl=1 -[4]: https://www.debian.org/ -[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os4.jpg?resize=800%2C412&ssl=1 -[6]: https://www.trinitydesktop.org/ -[7]: https://en.wikipedia.org/wiki/KDE -[8]: https://en.wikipedia.org/wiki/MATE_(software -[9]: https://q4os.org/downloads1.html -[10]: https://itsfoss.com/lightweight-linux-beginners/ -[11]: https://itsfoss.com/list-installed-packages-ubuntu/ -[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os-windows-installer.jpg?resize=800%2C610&ssl=1 -[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os2.jpg?resize=800%2C606&ssl=1 -[14]: https://itsfoss.com/install-chrome-ubuntu/ -[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os10.png?ssl=1 -[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os3.jpg?resize=800%2C507&ssl=1 -[17]: https://www.nongnu.org/synaptic/ -[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os5.jpg?resize=800%2C616&ssl=1 -[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os8Debonaire.jpg?resize=800%2C500&ssl=1 -[20]: https://www.reactos.org/ -[21]: http://reddit.com/r/linuxusersgroup -[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os1.jpg?fit=800%2C500&ssl=1 diff --git a/sources/tech/20190225 How To Identify That The Linux Server Is Integrated With Active Directory (AD).md b/sources/tech/20190225 How To Identify That The Linux Server Is Integrated With Active Directory (AD).md deleted file mode 100644 index 55d30a7910..0000000000 --- a/sources/tech/20190225 How To Identify That The Linux Server Is Integrated With Active Directory (AD).md +++ /dev/null @@ -1,177 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How To Identify That The Linux Server Is Integrated With Active Directory (AD)?) -[#]: via: (https://www.2daygeek.com/how-to-identify-that-the-linux-server-is-integrated-with-active-directory-ad/) -[#]: author: (Vinoth Kumar https://www.2daygeek.com/author/vinoth/) - -How To Identify That The Linux Server Is Integrated With Active Directory (AD)? -====== - -Single Sign On (SSO) Authentication is an implemented in most of the organizations due to multiple applications access. - -It allows a user to logs in with a single ID and password to all the applications which is available in the organization. - -It uses a centralized authentication system for all the applications. - -A while ago we had written an article, **[how to integrate Linux system with AD][1]**. - -Today we are going to show you, how to check that the Linux system is integrated with AD using multiple ways. - -It can be done in four ways and we will explain one by one. - - * **`ps Command:`** It report a snapshot of the current processes. - * **`id Command:`** It prints user identity. - * **`/etc/nsswitch.conf file:`** It is Name Service Switch configuration file. - * **`/etc/pam.d/system-auth file:`** It is Common configuration file for PAMified services. - - - -### How To Identify That The Linux Server Is Integrated With AD Using PS Command? - -ps command displays information about a selection of the active processes. - -To integrate the Linux server with AD, we need to use either `winbind` or `sssd` or `ldap` service. - -So, use the ps command to filter these services. - -If you found any of these services is running on system then we can decide that the system is currently integrate with AD using “winbind” or “sssd” or “ldap” service. - -You might get the output similar to below if the system is integrated with AD using `SSSD` service. - -``` -# ps -ef | grep -i "winbind\|sssd" - -root 29912 1 0 2017 ? 00:19:09 /usr/sbin/sssd -f -D -root 29913 29912 0 2017 ? 04:36:59 /usr/libexec/sssd/sssd_be --domain 2daygeek.com --uid 0 --gid 0 --debug-to-files -root 29914 29912 0 2017 ? 00:29:28 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --debug-to-files -root 29915 29912 0 2017 ? 00:09:19 /usr/libexec/sssd/sssd_pam --uid 0 --gid 0 --debug-to-files -root 31584 26666 0 13:41 pts/3 00:00:00 grep sssd -``` - -You might get the output similer to below if the system is integrated with AD using `winbind` service. - -``` -# ps -ef | grep -i "winbind\|sssd" - -root 676 21055 0 2017 ? 00:00:22 winbindd -root 958 21055 0 2017 ? 00:00:35 winbindd -root 21055 1 0 2017 ? 00:59:07 winbindd -root 21061 21055 0 2017 ? 11:48:49 winbindd -root 21062 21055 0 2017 ? 00:01:28 winbindd -root 21959 4570 0 13:50 pts/2 00:00:00 grep -i winbind\|sssd -root 27780 21055 0 2017 ? 00:00:21 winbindd -``` - -### How To Identify That The Linux Server Is Integrated With AD Using id Command? - -It Prints information for given user name, or the current user. It displays the UID, GUID, User Name, Primary Group Name and Secondary Group Name, etc., - -If the Linux system is integrated with AD then you might get the output like below. The GID clearly shows that the user is coming from AD “domain users”. - -``` -# id daygeek - -uid=1918901106(daygeek) gid=1918900513(domain users) groups=1918900513(domain users) -``` - -### How To Identify That The Linux Server Is Integrated With AD Using nsswitch.conf file? - -The Name Service Switch (NSS) configuration file, `/etc/nsswitch.conf`, is used by the GNU C Library and certain other applications to determine the sources from which to obtain name-service information in a range of categories, and in what order. Each category of information is identified by a database name. - -You might get the output similar to below if the system is integrated with AD using `SSSD` service. - -``` -# cat /etc/nsswitch.conf | grep -i "sss\|winbind\|ldap" - -passwd: files sss -shadow: files sss -group: files sss -services: files sss -netgroup: files sss -automount: files sss -``` - -You might get the output similar to below if the system is integrated with AD using `winbind` service. - -``` -# cat /etc/nsswitch.conf | grep -i "sss\|winbind\|ldap" - -passwd: files [SUCCESS=return] winbind -shadow: files [SUCCESS=return] winbind -group: files [SUCCESS=return] winbind -``` - -You might get the output similer to below if the system is integrated with AD using `ldap` service. - -``` -# cat /etc/nsswitch.conf | grep -i "sss\|winbind\|ldap" - -passwd: files ldap -shadow: files ldap -group: files ldap -``` - -### How To Identify That The Linux Server Is Integrated With AD Using system-auth file? - -It is Common configuration file for PAMified services. - -PAM stands for Pluggable Authentication Module that provides dynamic authentication support for applications and services in Linux. - -system-auth configuration file is provide a common interface for all applications and service daemons calling into the PAM library. - -The system-auth configuration file is included from nearly all individual service configuration files with the help of the include directive. - -You might get the output similar to below if the system is integrated with AD using `SSSD` service. - -``` -# cat /etc/pam.d/system-auth | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so" -or -# cat /etc/pam.d/system-auth-ac | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so" - -auth sufficient pam_sss.so use_first_pass -account [default=bad success=ok user_unknown=ignore] pam_sss.so -password sufficient pam_sss.so use_authtok -session optional pam_sss.so -``` - -You might get the output similar to below if the system is integrated with AD using `winbind` service. - -``` -# cat /etc/pam.d/system-auth | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so" -or -# cat /etc/pam.d/system-auth-ac | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so" - -auth sufficient pam_winbind.so cached_login use_first_pass -account [default=bad success=ok user_unknown=ignore] pam_winbind.so cached_login -password sufficient pam_winbind.so cached_login use_authtok -``` - -You might get the output similar to below if the system is integrated with AD using `ldap` service. - -``` -# cat /etc/pam.d/system-auth | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so" -or -# cat /etc/pam.d/system-auth-ac | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so" - -auth sufficient pam_ldap.so cached_login use_first_pass -account [default=bad success=ok user_unknown=ignore] pam_ldap.so cached_login -password sufficient pam_ldap.so cached_login use_authtok -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/how-to-identify-that-the-linux-server-is-integrated-with-active-directory-ad/ - -作者:[Vinoth Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/vinoth/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/join-integrate-rhel-centos-linux-system-to-windows-active-directory-ad-domain/ diff --git a/sources/tech/20190227 How to Display Weather Information in Ubuntu 18.04.md b/sources/tech/20190227 How to Display Weather Information in Ubuntu 18.04.md deleted file mode 100644 index da0c0df203..0000000000 --- a/sources/tech/20190227 How to Display Weather Information in Ubuntu 18.04.md +++ /dev/null @@ -1,290 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Display Weather Information in Ubuntu 18.04) -[#]: via: (https://itsfoss.com/display-weather-ubuntu) -[#]: author: (Sergiu https://itsfoss.com/author/sergiu/) - -How to Display Weather Information in Ubuntu 18.04 -====== - -You’ve got a fresh Ubuntu install and you’re [customizing Ubuntu][1] to your liking. You want the best experience and the best apps for your needs. - -The only thing missing is a weather app. Luckily for you, we got you covered. Just make sure you have the Universe repository enabled. - -![Tools to Display Weather Information in Ubuntu Linux][2] - -### 8 Ways to Display Weather Information in Ubuntu 18.04 - -Back in the Unity days, there were a few popular options like My Weather Indicator to display weather on your system. Those options are either discontinued or not available in Ubuntu 18.04 and higher versions anymore. - -Fortunately, there are many other options to choose from. Some are minimalist and plain simple to use, some offer detailed information (or even present you with news headlines) and some are made for terminal gurus. Whatever your needs may be, the right app is waiting for you. - -**Note:** The presented apps are in no particular order of ranking. - -**Top Panel Apps** - -These applications usually sit on the top panel of your screen. Good for quick look at the temperature. - -#### 1\. OpenWeather Shell Extension - -![Open Weather Gnome Shell Extesnsion][3] - -**Key features:** - - * Simple to install and customize - * Uses OpenWeatherMap (by default) - * Many Units and Layout options - * Can save multiple locations (that can easily be changed) - - - -This is a great extension presenting you information in a simple manner. There are multiple ways to install this. It is the weather app that I find myself using the most, because it’s just a simple, no-hassle integrated weather display for the top panel. - -**How to Install:** - -I recommend reading this [detailed tutorial about using GNOME extensions][4]. The easiest way to install this extension is to open up a terminal and run: - -``` -sudo apt install gnome-shell-extension-weather -``` - -Then all you have to restart the gnome shell by executing: - -``` -Alt+F2 -``` - -Enter **r** and press **Enter**. - -Now open up **Tweaks** (gnome tweak tool) and enable **Openweather** in the **Extensions** tab. - -#### 2\. gnome-weather - -![Gnome Weather App UI][5] -![Gnome Weather App Top Panel][6] - -**Key features:** - - * Pleasant Design - * Integrated into Calendar (Top Panel) - * Simple Install - * Flatpak install available - - - -This app is great for new users. The installation is only one command and the app is easy to use. Although it doesn’t have as many features as other apps, it is still great if you don’t want to bother with multiple settings and a complex install procedure. - -**How to Install:** - -All you have to do is run: - -``` -sudo apt install gnome-weather -``` - -Now search for **Weather** and the app should pop up. After logging out (and logging back in), the Calendar extension will be displayed. - -If you prefer, you can get a [flatpak][7] version. - -#### 3\. Meteo - -![Meteo Weather App UI][8] -![Meteo Weather System Tray][9] - -**Key features:** - - * Great UI - * Integrated into System Tray (Top Panel) - * Simple Install - * Great features (Maps) - - - -Meteo is a snap app on the heavier side. Most of that weight comes from the great Maps features, with maps presenting temperatures, clouds, precipitations, pressure and wind speed. It’s a distinct feature that I haven’t encountered in any other weather app. - -**Note** : After changing location, you might have to quit and restart the app for the changes to be applied in the system tray. - -**How to Install:** - -Open up the **Ubuntu Software Center** and search for **Meteo**. Install and launch. - -**Desktop Apps** - -These are basically desktop widgets. They look good and provide more information at a glance. - -#### 4\. Temps - -![Temps Weather App UI][10] - -**Key features:** - - * Beautiful Design - * Useful Hotkeys - * Hourly Temperature Graph - - - -Temps is an electron app with a beautiful UI (though not exactly “light”). The most unique features are the temperature graphs. The hotkeys might feel unintuitive at first, but they prove to be useful in the long run. The app will minimize when you click somewhere else. Just press Ctrl+Shift+W to bring it back. - -This app is **Open-Source** , and the developer can’t afford the cost of a faster API key, so you might want to create your own API at [OpenWeatherMap][11]. - -**How to Install:** - -Go to the website and download the version you need (probably 64-bit). Extract the archive. Open the extracted directory and double-click on **Temps**. Press Ctrl+Shift+W if the window minimizes. - -#### 5\. Cumulus - -![Cumulus Weather App UI][12] - -**Key features:** - - * Color Selector for background and text - - * Re-sizable window - - * Tray Icon (temperature only) - - * Allows multiple instances with different locations etc. - - - - -Cumulus is a greatly customizable weather app, with a backend supporting Yahoo! Weather and OpenWeatherMap. The UI is great and the installer is simple to use. This app has amazing features. It’s one of the few weather apps that allow for multiple instances. You should definitely try it you are looking for an experience tailored to your preferences. - -**How to Install:** - -Go to the website and download the (online) installer. Open up a terminal and **cd** (change directory) to the directory where you downloaded the file. - -Then run - -``` -chmod +x Cumulus-online-installer-x64 -./Cumulus-online-installer-x64 -``` - -Search for **Cumulus** and enjoy the app! - -**Terminal Apps** - -You are a terminal dweller? You can check the weather right in your terminal. - -#### 7\. WeGo - -![WeGo Weather App Terminal][13] - -**Key features:** - - * Supports different APIs - * Pretty detailed - * Customizable config - * Multi-language support - * 1 to 7 day forecast - - - -WeGo is a Go app for displaying weather info in the terminal. It’s install can be a little tricky, but it’s easy to set up. You’ll need to register an API Key [here][14] (if using **forecast.io** , which is default). Once you set it up, it’s fairly practical for someone who mostly works in the terminal. - -**How to Install:** - -I recommend you to check out the GitHub page for complete information on installation, setup and features. - -#### 8\. Wttr.in - -![Wttr.in Weather App Terminal][15] - -**Key features:** - - * Simple install - * Easy to use - * Lightweight - * 3 day forecast - * Moon phase - - - -If you really live in the terminal, this is the weather app for you. This is as lightweight as it gets. You can specify location (by default the app tries to detect your current location) and a few other parameters (eg. units). - -**How to Install:** - -Open up a terminal and install Curl: - -``` -sudo apt install curl -``` - -Then: - -``` -curl wttr.in -``` - -That’s it. You can specify location and parameters like so: - -``` -curl wttr.in/london?m -``` - -To check out other options type: - -``` -curl wttr.in/:help -``` - -If you found some settings you enjoy and you find yourself using them frequently, you might want to add an **alias**. To do so, open **~/.bashrc** with your favorite editor (that’s **vim** , terminal wizard). Go to the end and paste in - -``` -alias wttr='curl wttr.in/CITY_NAME?YOUR_PARAMS' -``` - -For example: - -``` -alias wttr='curl wttr.in/london?m' -``` - -Save and close **~/.bashrc** and run the command below to source the new file. - -``` -source ~/.bashrc -``` - -Now, typing **wttr** in the terminal and pressing Enter should execute your custom command. - -**Wrapping Up** - -These are a handful of the weather apps available for Ubuntu. We hope our list helped you discover an app fitting your needs, be that something with pleasant aesthetics or just a quick tool. - -What is your favorite weather app? Tell us about what you enjoy and why in the comments section. - - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/display-weather-ubuntu - -作者:[Sergiu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/sergiu/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/gnome-tricks-ubuntu/ -[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/display-weather-ubuntu.png?resize=800%2C450&ssl=1 -[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/open_weather_gnome_shell-1-1.jpg?fit=800%2C383&ssl=1 -[4]: https://itsfoss.com/gnome-shell-extensions/ -[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/gnome_weather_ui.jpg?fit=800%2C599&ssl=1 -[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/gnome_weather_top_panel.png?fit=800%2C587&ssl=1 -[7]: https://flatpak.org/ -[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/meteo_ui.jpg?fit=800%2C547&ssl=1 -[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/meteo_system_tray.png?fit=800%2C653&ssl=1 -[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/temps_ui.png?fit=800%2C623&ssl=1 -[11]: https://openweathermap.org/ -[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/cumulus_ui.png?fit=800%2C651&ssl=1 -[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/wego_terminal.jpg?fit=800%2C531&ssl=1 -[14]: https://developer.forecast.io/register -[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/wttr_in_terminal.jpg?fit=800%2C526&ssl=1 diff --git a/sources/tech/20190228 3 open source behavior-driven development tools.md b/sources/tech/20190228 3 open source behavior-driven development tools.md deleted file mode 100644 index 9c004a14c2..0000000000 --- a/sources/tech/20190228 3 open source behavior-driven development tools.md +++ /dev/null @@ -1,83 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (3 open source behavior-driven development tools) -[#]: via: (https://opensource.com/article/19/2/behavior-driven-development-tools) -[#]: author: (Christine Ketterlin Fisher https://opensource.com/users/cketterlin) - -3 open source behavior-driven development tools -====== -Having the right motivation is as important as choosing the right tool when implementing BDD. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_code_keyboard_orange_hands.png?itok=G6tJ_64Y) - -[Behavior-driven development][1] (BDD) seems very easy. Tests are written in an easily readable format that allows for feedback from product owners, business sponsors, and developers. Those tests are living documentation for your team, so you don't need requirements. The tools are easy to use and allow you to automate your test suite. Reports are generated with each test run to document every step and show you where tests are failing. - -Quick recap: Easily readable! Living documentation! Automation! Reports! What could go wrong, and why isn't everybody doing this? - -### Getting started with BDD - -So, you're ready to jump in and can't wait to pick the right open source tool for your team. You want it to be easy to use, automate all your tests, and provide easily understandable reports for each test run. Great, let's get started! - -Except, not so fast … First, what is your motivation for trying to implement BDD on your team? If the answer is simply to automate tests, go ahead and choose any of the tools listed below because chances are you're going to see minimal success in the long run. - -### My first effort - -I manage a team of business analysts (BA) and quality assurance (QA) engineers, but my background is on the business analysis side. About a year ago, I attended a talk where a developer talked about the benefits of BDD. He said that he and his team had given it a try during their last project. That should have been the first red flag, but I didn't realize it at the time. You cannot simply choose to "give BDD a try." It takes planning, preparation, and forethought into what you want your team to accomplish. - -However, you can try various parts of BDD without a large investment, and I eventually realized he and his team had written feature files and automated those tests using Cucumber. I also learned it was an experiment done solely by the team's developers, not the BA or QA staff, which defeats the purpose of understanding the end user's behavior. - -During the talk we were encouraged to try BDD, so my test analyst and I went to our boss and said we were willing to give it a shot. And then, we didn't know what to do. We had no guidance, no plan in place, and a leadership team who just wanted to automate testing. I don't think I need to tell you how this story ended. Actually, there wasn't even an end, just a slow fizzle after a few initial attempts at writing behavioral scenarios. - -### A fresh start - -Fast-forward a year, and I'm at a different company with a team of my own and BDD on the brain. I knew there was value there, but I also knew it went deeper than what I had initially been sold. I spent a lot of time thinking about how BDD could make a positive impact, not only on my team, but on our entire development team. Then I read [Discovery: Explore Behaviour Using Examples][2] by Gaspar Nagy and Seb Rose, and one of the first things I learned was that automation of tests is a benefit of BDD, but it should not be the main goal. No wonder we failed! - -This book changed how I viewed BDD and helped me start to fill in the pieces I had been missing. We are now on the (hopefully correct!) path to implementing BDD on our team. It involves active involvement from our product owners, business analysts, and manual and automated testers and buy-in and support from our executive leadership. We have a plan in place for our approach and our measures of success. - -We are still writing requirements (don't ever let anyone tell you that these scenarios can completely replace requirements!), but we are doing so with a more critical eye and evaluating where requirements and test scenarios overlap and how we can streamline the two. - -I have told the team we cannot even try to automate these tests for at least two quarters, at which point we'll evaluate and determine whether we're ready to move forward or not. Our current priorities are defining our team's standard language, practicing writing given/when/then scenarios, learning the Gherkin syntax, determining where to store these tests, and investigating how to integrate these tests into our pipeline. - -### 3 BDD tools to choose - -At its core, BDD is a way to help the entire team understand the end user's actions and behaviors, which will lead to more clear requirements, tests, and ultimately higher-quality applications. Before you pick your tool, do your pre-work. Think about your motivation, and understand that while the different parts and pieces of BDD are fairly simple, integrating them into your team is more challenging and needs careful thought and planning. Also, think about where your people fit in. - -Every organization has different roles, and BDD should not belong solely to developers nor test automation engineers. If you don't involve the business side, you're never going to gain the full benefit of this methodology. Once you have a strategy defined and are ready to move forward with automating your BDD scenarios, there are several open source tools for you to choose from. - -#### Cucumber - -[Cucumber][3] is probably the most recognized tool available that supports BDD. It is widely seen as a straightforward tool to learn and is easy to get started with. Cucumber relies on test scenarios that are written in plain text and follow the given/when/then format. Each scenario is an individual test. Scenarios are grouped into features, which is comparable to a test suite. Scenarios must be written in the Gherkin syntax for Cucumber to understand and execute the scenario's steps. The human-readable steps in the scenarios are tied to the step definitions in your code through the Cucumber framework. To successfully write and automate the scenarios, you need the right mix of business knowledge and technical ability. Identify the skill sets on your team to determine who will write and maintain the scenarios and who will automate them; most likely these should be managed by different roles. Because these tests are executed from the step definitions, reporting is very robust and can show you at which exact step your test failed. Cucumber works well with a variety of browser and API automation tools. - -#### JBehave - -[JBehave][4] is very similar to Cucumber. Scenarios are still written in the given/when/then format and are easily understandable by the entire team. JBehave supports Gherkin but also has its own JBehave syntax that can be used. Gherkin is more universal, but either option will work as long as you are consistent in your choice. JBehave has more configuration options than Cucumber, and its reports, although very detailed, need more configuration to get feedback from each step. JBehave is a powerful tool, but because it can be more customized, it is not quite as easy to get started with. Teams need to ask themselves exactly what features they need and whether or not learning the tool's various configurations is worth the time investment. - -#### Gauge - -Where Cucumber and JBehave are specifically designed to work with BDD, [Gauge][5] is not. If automation is your main goal (and not the entire BDD process), it is worth a look. Gauge tests are written in Markdown, which makes them easily readable. However, without a more standard format, such as the given/when/then BDD scenarios, tests can vary widely and, depending on the author, some tests will be much more digestible for business owners than others. Gauge works with multiple languages, so the automation team can leverage what they already use. Gauge also offers reporting with screenshots to show where the tests failed. - -### What are your needs? - -Implementing BDD allows the team to test the users' behaviors. This can be done without automating any tests at all, but when done correctly, can result in a powerful, reusable test suite. As a team, you will need to identify exactly what your automation needs are and whether or not you are truly going to use BDD or if you would rather focus on automating tests that are written in plain text. Either way, open source tools are available for you to use and to help support your testing evolution. - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/2/behavior-driven-development-tools - -作者:[Christine Ketterlin Fisher][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/cketterlin -[b]: https://github.com/lujun9972 -[1]: https://en.wikipedia.org/wiki/Behavior-driven_development -[2]: https://www.amazon.com/gp/product/1983591254/ref=dbs_a_def_rwt_bibl_vppi_i0 -[3]: https://cucumber.io/ -[4]: https://jbehave.org/ -[5]: https://www.gauge.org/ diff --git a/sources/tech/20190228 MiyoLinux- A Lightweight Distro with an Old-School Approach.md b/sources/tech/20190228 MiyoLinux- A Lightweight Distro with an Old-School Approach.md deleted file mode 100644 index 3217e304cd..0000000000 --- a/sources/tech/20190228 MiyoLinux- A Lightweight Distro with an Old-School Approach.md +++ /dev/null @@ -1,161 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (MiyoLinux: A Lightweight Distro with an Old-School Approach) -[#]: via: (https://www.linux.com/blog/learn/2019/2/miyolinux-lightweight-distro-old-school-approach) -[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) - -MiyoLinux: A Lightweight Distro with an Old-School Approach -====== -![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_main.jpg?itok=ErLiqGwp) - -I must confess, although I often wax poetic about the old ways of the Linux desktop, I much prefer my distributions to help make my daily workflow as efficient as possible. Because of that, my taste in Linux desktop distributions veers very far toward the modern side of things. I want a distribution that integrates apps seamlessly, gives me notifications, looks great, and makes it easy to work with certain services that I use. - -However, every so often it’s nice to dip my toes back into those old-school waters and remind myself why I fell in love with Linux in the first place. That’s precisely what [MiyoLinux][1] did for me recently. This lightweight distribution is based on [Devuan][2] and makes use of the [i3 Tiling Window Manager][3]. - -Why is it important that MiyoLinux is based on Devuan? Because that means it doesn’t use systemd. There are many within the Linux community who’d be happy to make the switch to an old-school Linux distribution that opts out of systemd. If that’s you, MiyoLinux might just charm you into submission. - -But don’t think MiyoLinux is going to be as easy to get up and running as, say, Ubuntu Linux, Elementary OS, or Linux Mint. Although it’s not nearly as challenging as Arch or Gentoo, MiyoLinux does approach installation and basic usage a bit differently. Let’s take a look at how this particular distro handles things. - -### Installation - -The installation GUI of MiyoLinux is pretty basic. The first thing you’ll notice is that you are presented with a good amount of notes, regarding the usage of the MiyoLinux desktop. If you happen to be testing MiyoLinux via VirtualBox, you’ll wind up having to deal with the frustration of not being able to resize the window (Figure 1), as the Guest Additions cannot be installed. This also means mouse integration cannot be enabled during the installation, so you’ll have to tab through the windows and use your keyboard cursor keys and Enter key to make selections. - -![MiyoLinux][5] - -Figure 1: The first step in the MiyoLinux installation. - -[Used with permission][6] - -Once you click the Install MiyoLinux button, you’ll be prompted to continue using either ‘su” or sudo. Click the use sudo button to continue with the installation. - -The next screen of importance is the Installation Options window (Figure 2), where you can select various options for MiyoLinux (such as encryption, file system labels, disable automatic login, etc.). - -![Configuration][8] - -Figure 2: Configuration Installation options for MiyoLinux. - -[Used with permission][6] - -The MiyoLinux installation does not include an automatic partition tool. Instead, you’ll be prompted to run either cfdisk or GParted (Figure 3). If you don’t know your way around cfdisk, select GParted and make use of the GUI tool. - -![partitioning ][10] - -Figure 3: Select your partitioning tool for MiyoLinux. - -[Used with permission][6] - -With your disk partitioned (Figure 4), you’ll be required to take care of the following steps: - - * Configure the GRUB bootloader. - - * Select the filesystem for the bootloader. - - * Configure time zone and locales. - - * Configure keyboard, keyboard language, and keyboard layout. - - * Okay the installation. - - - - -Once, you’ve okay’d the installation, all packages will be installed and you will then be prompted to install the bootloader. Following that, you’ll be prompted to configure the following: - - * Hostname. - - * User (Figure 5). - - * Root password. - - - - -With the above completed, reboot and log into your new MiyoLinux installation. - -![hostname][12] - -Figure 5: Configuring hostname and username. - -[Creative Commons Zero][13] - -### Usage - -Once you’ve logged into the MiyoLinux desktop, you’ll find things get a bit less-than-user-friendly. This is by design. You won’t find any sort of mouse menu available anywhere on the desktop. Instead you use keyboard shortcuts to open the different types of menus. The Alt+m key combination will open the PMenu, which is what one would consider a fairly standard desktop mouse menu (Figure 6). - -The Alt+d key combination will open the dmenu, a search tool at the top of the desktop, where you can scroll through (using the cursor keys) or search for an app you want to launch (Figure 7). - -![dmenu][15] - -Figure 7: The dmenu in action. - -[Used with permission][6] - -### Installing Apps - -If you open the PMenu, click System > Synaptic Package Manager. From within that tool you can search for any app you want to install. However, if you find Synaptic doesn’t want to start from the PMenu, open the dmenu, search for terminal, and (once the terminal opens), issue the command sudo synaptic. That will get the package manager open, where you can start installing any applications you want (Figure 8). - -![Synaptic][17] - -Figure 8: The Synaptic Package Manager on MiyoLinux. - -[Used with permission][6] - -Of course, you can always install applications from the command line. MiyoLinux depends upon the Apt package manager, so installing applications is as easy as: - -``` -sudo apt-get install libreoffice -y -``` - -Once installed, you can start the new package from either the PMenu or dmenu tools. - -### MiyoLinux Accessories - -If you find you need a bit more from the MiyoLinux desktop, type the keyboard combination Alt+Ctrl+a to open the MiyoLinux Accessories tool (Figure 9). From this tool you can configure a number of options for the desktop. - -![Accessories][19] - -Figure 9: Configure i3, Conky, Compton, your touchpad, and more with the Accessories tool. - -[Used with permission][6] - -All other necessary keyboard shortcuts are listed on the default desktop wallpaper. Make sure to put those shortcuts to memory, as you won’t get very far in the i3 desktop without them. - -### A Nice Nod to Old-School Linux - -If you’re itching to throw it back to a time when Linux offered you a bit of challenge to your daily grind, MiyoLinux might be just the operating system for you. It’s a lightweight operating system that makes good use of a minimal set of tools. Anyone who likes their distributions to be less modern and more streamlined will love this take on the Linux desktop. However, if you prefer your desktop with the standard bells and whistles, found on modern distributions, you’ll probably find MiyoLinux nothing more than a fun distraction from the standard fare. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/learn/2019/2/miyolinux-lightweight-distro-old-school-approach - -作者:[Jack Wallen][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linux.com/users/jlwallen -[b]: https://github.com/lujun9972 -[1]: https://sourceforge.net/p/miyolinux/wiki/Home/ -[2]: https://devuan.org/ -[3]: https://i3wm.org/ -[4]: /files/images/miyo1jpg -[5]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_1.jpg?itok=5PxRDYRE (MiyoLinux) -[6]: /licenses/category/used-permission -[7]: /files/images/miyo2jpg -[8]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_2.jpg?itok=svlVr7VI (Configuration) -[9]: /files/images/miyo3jpg -[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_3.jpg?itok=lpNzZBPz (partitioning) -[11]: /files/images/miyo5jpg -[12]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_5.jpg?itok=lijIsgZ2 (hostname) -[13]: /licenses/category/creative-commons-zero -[14]: /files/images/miyo7jpg -[15]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_7.jpg?itok=I8Ow3PX6 (dmenu) -[16]: /files/images/miyo8jpg -[17]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_8.jpg?itok=oa502KfM (Synaptic) -[18]: /files/images/miyo9jpg -[19]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_9.jpg?itok=gUM4mxEv (Accessories) diff --git a/sources/tech/20190304 What you need to know about Ansible modules.md b/sources/tech/20190304 What you need to know about Ansible modules.md deleted file mode 100644 index 8330d4bd59..0000000000 --- a/sources/tech/20190304 What you need to know about Ansible modules.md +++ /dev/null @@ -1,311 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What you need to know about Ansible modules) -[#]: via: (https://opensource.com/article/19/3/developing-ansible-modules) -[#]: author: (Jairo da Silva Junior https://opensource.com/users/jairojunior) - -What you need to know about Ansible modules -====== -Learn how and when to develop custom modules for Ansible. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_container_block.png?itok=S8MbXEYw) - -Ansible works by connecting to nodes and sending small programs called modules to be executed remotely. This makes it a push architecture, where configuration is pushed from Ansible to servers without agents, as opposed to the pull model, common in agent-based configuration management systems, where configuration is pulled. - -These modules are mapped to resources and their respective states, which are represented in YAML files. They enable you to manage virtually everything that has an API, CLI, or configuration file you can interact with, including network devices like load balancers, switches, firewalls, container orchestrators, containers themselves, and even virtual machine instances in a hypervisor or in a public (e.g., AWS, GCE, Azure) and/or private (e.g., OpenStack, CloudStack) cloud, as well as storage and security appliances and system configuration. - -With Ansible's batteries-included model, hundreds of modules are included and any task in a playbook has a module behind it. - -The contract for building modules is simple: JSON in the stdout. The configurations declared in YAML files are delivered over the network via SSH/WinRM—or any other connection plugin—as small scripts to be executed in the target server(s). Modules can be written in any language capable of returning JSON, although most Ansible modules (except for Windows PowerShell) are written in Python using the Ansible API (this eases the development of new modules). - -Modules are one way of expanding Ansible capabilities. Other alternatives, like dynamic inventories and plugins, can also increase Ansible's power. It's important to know about them so you know when to use one instead of the other. - -Plugins are divided into several categories with distinct goals, like Action, Cache, Callback, Connection, Filters, Lookup, and Vars. The most popular plugins are: - - * **Connection plugins:** These implement a way to communicate with servers in your inventory (e.g., SSH, WinRM, Telnet); in other words, how automation code is transported over the network to be executed. - * **Filters plugins:** These allow you to manipulate data inside your playbook. This is a Jinja2 feature that is harnessed by Ansible to solve infrastructure-as-code problems. - * **Lookup plugins:** These fetch data from an external source (e.g., env, file, Hiera, database, HashiCorp Vault). - - - -Ansible's official docs are a good resource on [developing plugins][1]. - -### When should you develop a module? - -Although many modules are delivered with Ansible, there is a chance that your problem is not yet covered or it's something too specific—for example, a solution that might make sense only in your organization. Fortunately, the official docs provide excellent guidelines on [developing modules][2]. - -**IMPORTANT:** Before you start working on something new, always check for open pull requests, ask developers at #ansible-devel (IRC/Freenode), or search the [development list][3] and/or existing [working groups][4] to see if a module exists or is in development. - -Signs that you need a new module instead of using an existing one include: - - * Conventional configuration management methods (e.g., templates, file, get_url, lineinfile) do not solve your problem properly. - * You have to use a complex combination of commands, shells, filters, text processing with magic regexes, and API calls using curl to achieve your goals. - * Your playbooks are complex, imperative, non-idempotent, and even non-deterministic. - - - -In the ideal scenario, the tool or service already has an API or CLI for management, and it returns some sort of structured data (JSON, XML, YAML). - -### Identifying good and bad playbooks - -> "Make love, but don't make a shell script in YAML." - -So, what makes a bad playbook? - -``` -- name: Read a remote resource -   command: "curl -v http://xpto/resource/abc" - register: resource - changed_when: False - - - name: Create a resource in case it does not exist -   command: "curl -X POST http://xpto/resource/abc -d '{ config:{ client: xyz, url: http://beta, pattern: core.md Dict.md lctt2014.md lctt2016.md lctt2018.md README.md } }'" -   when: "resource.stdout | 404" - - # Leave it here in case I need to remove it hehehe - #- name: Remove resource - #  command: "curl -X DELETE http://xpto/resource/abc" - #  when: resource.stdout == 1 -``` - -Aside from being very fragile—what if the resource state includes a 404 somewhere?—and demanding extra code to be idempotent, this playbook can't update the resource when its state changes. - -Playbooks written this way disrespect many infrastructure-as-code principles. They're not readable by human beings, are hard to reuse and parameterize, and don't follow the declarative model encouraged by most configuration management tools. They also fail to be idempotent and to converge to the declared state. - -Bad playbooks can jeopardize your automation adoption. Instead of harnessing configuration management tools to increase your speed, they have the same problems as an imperative automation approach based on scripts and command execution. This creates a scenario where you're using Ansible just as a means to deliver your old scripts, copying what you already have into YAML files. - -Here's how to rewrite this example to follow infrastructure-as-code principles. - -``` -- name: XPTO -  xpto: -    name: abc -    state: present -    config: -      client: xyz -      url: http://beta -      pattern: "*.*" -``` - -The benefits of this approach, based on custom modules, include: - - * It's declarative—resources are properly represented in YAML. - * It's idempotent. - * It converges from the declared state to the current state. - * It's readable by human beings. - * It's easily parameterized or reused. - - - -### Implementing a custom module - -Let's use [WildFly][5], an open source Java application server, as an example to introduce a custom module for our not-so-good playbook: - -``` - - name: Read datasource -   command: "jboss-cli.sh -c '/subsystem=datasources/data-source=DemoDS:read-resource()'" -   register: datasource - - - name: Create datasource -   command: "jboss-cli.sh -c '/subsystem=datasources/data-source=DemoDS:add(driver-name=h2, user-name=sa, password=sa, min-pool-size=20, max-pool-size=40, connection-url=.jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE..)'" -   when: 'datasource.stdout | outcome => failed' -``` - -Problems: - - * It's not declarative. - * JBoss-CLI returns plaintext in a JSON-like syntax; therefore, this approach is very fragile, since we need a type of parser for this notation. Even a seemingly simple parser can be too complex to treat many [exceptions][6]. - * JBoss-CLI is just an interface to send requests to the management API (port 9990). - * Sending an HTTP request is more efficient than opening a new JBoss-CLI session, connecting, and sending a command. - * It does not converge to the desired state; it only creates the resource when it doesn't exist. - - - -A custom module for this would look like: - -``` -- name: Configure datasource -      jboss_resource: -        name: "/subsystem=datasources/data-source=DemoDS" -        state: present -        attributes: -          driver-name: h2 -          connection-url: "jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" -          jndi-name: "java:jboss/datasources/DemoDS" -          user-name: sa -          password: sa -          min-pool-size: 20 -          max-pool-size: 40 -``` - -This playbook is declarative, idempotent, more readable, and converges to the desired state regardless of the current state. - -### Why learn to build custom modules? - -Good reasons to learn how to build custom modules include: - - * Improving existing modules - * You have bad playbooks and want to improve them, or … - * You don't, but want to avoid having bad playbooks. - * Knowing how to build a module considerably improves your ability to debug problems in playbooks, thereby increasing your productivity. - - - -> "…abstractions save us time working, but they don't save us time learning." —Joel Spolsky, [The Law of Leaky Abstractions][7] - -#### Custom Ansible modules 101 - - * JSON (JavaScript Object Notation) in stdout: that's the contract! - * They can be written in any language, but … - * Python is usually the best option (or the second best) - * Most modules delivered with Ansible ( **lib/ansible/modules** ) are written in Python and should support compatible versions. - - - -#### The Ansible way - - * First step: - -``` -git clone https://github.com/ansible/ansible.git -``` - - * Navigate in **lib/ansible/modules/** and read the existing modules code. - - * Your tools are: Git, Python, virtualenv, pdb (Python debugger) - - * For comprehensive instructions, consult the [official docs][8]. - - - - -#### An alternative: drop it in the library directory - -``` -library/                  # if any custom modules, put them here (optional) -module_utils/             # if any custom module_utils to support modules, put them here (optional) -filter_plugins/           # if any custom filter plugins, put them here (optional) - -site.yml                  # master playbook -webservers.yml            # playbook for webserver tier -dbservers.yml             # playbook for dbserver tier - -roles/ -    common/               # this hierarchy represents a "role" -        library/          # roles can also include custom modules -        module_utils/     # roles can also include custom module_utils -        lookup_plugins/   # or other types of plugins, like lookup in this case -``` - - * It's easier to start. - * Doesn't require anything besides Ansible and your favorite IDE/text editor. - * This is your best option if it's something that will be used internally. - - - -**TIP:** You can use this directory layout to overwrite existing modules if, for example, you need to patch a module. - -#### First steps - -You could do it in your own—including using another language—or you could use the AnsibleModule class, as it is easier to put JSON in the stdout ( **exit_json()** , **fail_json()** ) in the way Ansible expects ( **msg** , **meta** , **has_changed** , **result** ), and it's also easier to process the input ( **params[]** ) and log its execution ( **log()** , **debug()** ). - -``` -def main(): - -  arguments = dict(name=dict(required=True, type='str'), -                  state=dict(choices=['present', 'absent'], default='present'), -                  config=dict(required=False, type='dict')) - -  module = AnsibleModule(argument_spec=arguments, supports_check_mode=True) -  try: -      if module.check_mode: -          # Do not do anything, only verifies current state and report it -          module.exit_json(changed=has_changed, meta=result, msg='Fez alguma coisa ou não...') - -      if module.params['state'] == 'present': -          # Verify the presence of a resource -          # Desired state `module.params['param_name'] is equal to the current state? -          module.exit_json(changed=has_changed, meta=result) - -      if module.params['state'] == 'absent': -          # Remove the resource in case it exists -          module.exit_json(changed=has_changed, meta=result) - -  except Error as err: -      module.fail_json(msg=str(err)) -``` - -**NOTES:** The **check_mode** ("dry run") allows a playbook to be executed or just verifies if changes are required, but doesn't perform them. **** Also, the **module_utils** directory can be used for shared code among different modules. - -For the full Wildfly example, check [this pull request][9]. - -### Running tests - -#### The Ansible way - -The Ansible codebase is heavily tested, and every commit triggers a build in its continuous integration (CI) server, [Shippable][10], which includes linting, unit tests, and integration tests. - -For integration tests, it uses containers and Ansible itself to perform the setup and verify phase. Here is a test case (written in Ansible) for our custom module's sample code: - -``` -- name: Configure datasource - jboss_resource: -   name: "/subsystem=datasources/data-source=DemoDS" -   state: present -   attributes: -     connection-url: "jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" -     ... - register: result - -- name: assert output message that datasource was created - assert: -   that: -      - "result.changed == true" -      - "'Added /subsystem=datasources/data-source=DemoDS' in result.msg" -``` - -#### An alternative: bundling a module with your role - -Here is a [full example][11] inside a simple role: - -``` -[*Molecule*]() + [*Vagrant*]() + [*pytest*](): `molecule init` (inside roles/) -``` - -It offers greater flexibility to choose: - - * Simplified setup - * How to spin up your infrastructure: e.g., Vagrant, Docker, OpenStack, EC2 - * How to verify your infrastructure tests: Testinfra and Goss - - - -But your tests would have to be written using pytest with Testinfra or Goss, instead of plain Ansible. If you'd like to learn more about testing Ansible roles, see my article about [using Molecule][12]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/developing-ansible-modules - -作者:[Jairo da Silva Junior][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jairojunior -[b]: https://github.com/lujun9972 -[1]: https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html#developing-plugins -[2]: https://docs.ansible.com/ansible/latest/dev_guide/developing_modules.html -[3]: https://groups.google.com/forum/#!forum/ansible-devel -[4]: https://github.com/ansible/community/ -[5]: http://www.wildfly.org/ -[6]: https://tools.ietf.org/html/rfc7159 -[7]: https://en.wikipedia.org/wiki/Leaky_abstraction#The_Law_of_Leaky_Abstractions -[8]: https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html#developing-modules-general -[9]: https://github.com/ansible/ansible/pull/43682/files -[10]: https://app.shippable.com/github/ansible/ansible/dashboard -[11]: https://github.com/jairojunior/ansible-role-jboss/tree/with_modules -[12]: https://opensource.com/article/18/12/testing-ansible-roles-molecule diff --git a/sources/tech/20190305 How rootless Buildah works- Building containers in unprivileged environments.md b/sources/tech/20190305 How rootless Buildah works- Building containers in unprivileged environments.md deleted file mode 100644 index cf046ec1b3..0000000000 --- a/sources/tech/20190305 How rootless Buildah works- Building containers in unprivileged environments.md +++ /dev/null @@ -1,133 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How rootless Buildah works: Building containers in unprivileged environments) -[#]: via: (https://opensource.com/article/19/3/tips-tricks-rootless-buildah) -[#]: author: (Daniel J Walsh https://opensource.com/users/rhatdan) - -How rootless Buildah works: Building containers in unprivileged environments -====== -Buildah is a tool and library for building Open Container Initiative (OCI) container images. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_2015-1-osdc-lead.png?itok=VEB4zwza) - -In previous articles, including [How does rootless Podman work?][1], I talked about [Podman][2], a tool that enables users to manage pods, containers, and container images. - -[Buildah][3] is a tool and library for building Open Container Initiative ([OCI][4]) container images that is complementary to Podman. (Both projects are maintained by the [containers][5] organization, of which I'm a member.) In this article, I will talk about rootless Buildah, including the differences between it and Podman. - -Our goal with Buildah was to build a low-level tool that could be used either directly or vendored into other tools to build container images. - -### Why Buildah? - -Here is how I describe a container image: It is basically a rootfs directory that contains the code needed to run your container. This directory is called a rootfs because it usually looks like **/ (root)** on a Linux machine, meaning you are likely to find directories in a rootfs like **/etc** , **/usr** , **/bin** , etc. - -The second part of a container image is a JSON file that describes the contents of the rootfs. It contains fields like the command to run the container, the entrypoint, the environment variables required to run the container, the working directory of the container, etc. Basically this JSON file allows the developer of the container image to describe how the container image is expected to be used. The fields in this JSON file have been standardized in the [OCI Image Format specification][6] - -The rootfs and the JSON file then get tar'd together to create an image bundle that is stored in a container registry. To create a layered image, you install more software into the rootfs and modify the JSON file. Then you tar up the differences of the new and the old rootfs and store that in another image tarball. The second JSON file refers back to the first JSON file via a checksum. - -Many years ago, Docker introduced Dockerfile, a simplified scripting language for building container images. Dockerfile was great and really took off, but it has many shortcomings that users have complained about. For example: - - * Dockerfile encourages the inclusion of tools used to build containers inside the container image. Container images do not need to include yum/dnf/apt, but most contain one of them and all their dependencies. - - * Each line causes a layer to be created. Because of this, secrets can mistakenly get added to container images. If you create a secret in one line of the Dockerfile and delete it in the next, the secret is still in the image. - - - - -One of my biggest complaints about the "container revolution" is that six years since it started, the only way to build a container image was still with Dockerfiles. Lots of tools other than **docker build** have appeared besides Buildah, but most still deal only with Dockerfile. So users continue hacking around the problems with Dockerfile. - -Note that [umoci][7] is an alternative to **docker build** that allows you to build container images without Dockerfile. - -Our goal with Buildah was to build a simple tool that could just create a rootfs directory on disk and allow other tools to populate the directory, then create the JSON file. Finally, Buildah would create the OCI image and push it to a container registry where it could be used by any container engine, like [Docker][8], Podman, [CRI-O][9], or another Buildah. - -Buildah also supports Dockerfile, since we know the bulk of people building containers have created Dockerfiles. - -### Using Buildah directly - -Lots of people use Buildah directly. A cool feature of Buildah is that you can script up the container build directly in Bash. - -The example below creates a Bash script called **myapp.sh** , which uses Buildah to pull down the Fedora image, and then uses **dnf** and **make** on a machine to install software into the container image rootfs, **$mnt**. It then adds some fields to the JSON file using **buildah config** and commits the container to a container image **myapp**. Finally, it pushes the container image to a container registry, **quay.io**. (It could push it to any container registry.) Now this OCI image can be used by any container engine or Kubernetes. - -``` -cat myapp.sh -#!/bin/sh -ctr=$(buildah from fedora) -mnt=($buildah mount $ctr) -dnf -y install --installroot $mnt httpd -make install DESTDIR=$mnt myapp -rm -rf $mnt/var/cache $mnt/var/log/* -buildah config --command /usr/bin/myapp -env foo=bar --working-dir=/root $ctr -buildah commit $ctr myapp -buildah push myapp http://quay.io/username/myapp -``` - -To create really small images, you could replace **fedora** in the script above with **scratch** , and Buildah will build a container image that only has the requirements for the **httpd** package inside the container image. No need for Python or DNF. - -### Podman's relationship to Buildah - -With Buildah, we have a low-level tool for building container images. Buildah also provides a library for other tools to build container images. Podman was designed to replace the Docker command line interface (CLI). One of the Docker CLI commands is **docker build**. We needed to have **podman build** to support building container images with Dockerfiles. Podman vendored in the Buildah library to allow it to do **podman build**. Any time you do a **podman build** , you are executing Buildah code to build your container images. If you are only going to use Dockerfiles to build container images, we recommend you only use Podman; there's no need for Buildah at all. - -### Other tools using the Buildah library - -Podman is not the only tool to take advantage of the Buildah library. [OpenShift 4 Source-to-Image][10] (S2I) will also use Buildah to build container images. OpenShift S2I allows developers using OpenShift to use Git commands to modify source code; when they push the changes for their source code to the Git repository, OpenShift kicks off a job to compile the source changes and create a container image. It also uses Buildah under the covers to build this image. - -[Ansible-Bender][11] is a new project to build container images via an Ansible playbook. For those familiar with Ansible, Ansible-Bender makes it easy to describe the contents of the container image and then uses Buildah to package up the container image and send it to a container registry. - -We would love to see other tools and languages for describing and building a container image and would welcome others use Buildah to do the conversion. - -### Problems with rootless - -Buildah works fine in rootless mode. It uses user namespace the same way Podman does. If you execute - -``` -$ buildah bud --tag myapp -f Dockerfile . -$ buildah push myapp http://quay.io/username/myapp -``` - -in your home directory, everything works great. - -However, if you execute the script described above, it will fail! - -The problem is that, when running the **buildah mount** command in rootless mode, the **buildah** command must put itself inside the user namespace and create a new mount namespace. Rootless users are not allowed to mount filesystems when not running in a user namespace. - -When the Buildah executable exits, the user namespace and mount namespace disappear, so the mount point no longer exists. This means the commands after **buildah mount** that attempt to write to **$mnt** will fail since **$mnt** is no longer mounted. - -How can we make the script work in rootless mode? - -#### Buildah unshare - -Buildah has a special command, **buildah unshare** , that allows you to enter the user namespace. If you execute it with no commands, it will launch a shell in the user namespace, and your shell will seem like it is running as root and all the contents of the home directory will seem like they are owned by root. If you look at the owner or files in **/usr** , it will list them as owned by **nfsnobody** (or nobody). This is because your user ID (UID) is now root inside the user namespace and real root (UID=0) is not mapped into the user namespace. The kernel represents all files owned by UIDs not mapped into the user namespace as the NFSNOBODY user. When you exit the shell, you will exit the user namespace, you will be back to your normal UID, and the home directory will be owned by your UID again. - -If you want to execute the **myapp.sh** command defined above, you can execute **buildah unshare myapp.sh** and the script will now run correctly. - -#### Conclusion - -Building and running containers in unprivileged environments is now possible and quite useable. There is little reason for developers to develop containers as root. - -If you want to use a traditional container engine, and use Dockerfile's for builds, then you should probably just use Podman. But if you want to experiment with building container images in new ways without using Dockerfile, then you should really take a look at Buildah. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/tips-tricks-rootless-buildah - -作者:[Daniel J Walsh][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/rhatdan -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/article/19/2/how-does-rootless-podman-work -[2]: https://podman.io/ -[3]: https://github.com/containers/buildah -[4]: https://www.opencontainers.org/ -[5]: https://github.com/containers -[6]: https://github.com/opencontainers/image-spec -[7]: https://github.com/openSUSE/umoci -[8]: https://github.com/docker -[9]: https://cri-o.io/ -[10]: https://github.com/openshift/source-to-image -[11]: https://github.com/TomasTomecek/ansible-bender diff --git a/sources/tech/20190305 Running the ‘Real Debian- on Raspberry Pi 3- -For DIY Enthusiasts.md b/sources/tech/20190305 Running the ‘Real Debian- on Raspberry Pi 3- -For DIY Enthusiasts.md deleted file mode 100644 index 785a6eeb5a..0000000000 --- a/sources/tech/20190305 Running the ‘Real Debian- on Raspberry Pi 3- -For DIY Enthusiasts.md +++ /dev/null @@ -1,134 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Running the ‘Real Debian’ on Raspberry Pi 3+ [For DIY Enthusiasts]) -[#]: via: (https://itsfoss.com/debian-raspberry-pi) -[#]: author: (Shirish https://itsfoss.com/author/shirish/) - -Running the ‘Real Debian’ on Raspberry Pi 3+ [For DIY Enthusiasts] -====== - -If you have ever used a Raspberry Pi device, you probably already know that it recommends a Linux distribution called [Raspbian][1]. - -Raspbian is a heavily customized form of Debian to run on low-powered ARM processors. It’s not bad. In fact, it’s an excellent OS for Raspberry Pi devices but it’s not the real Debian. - -[Debian purists like me][2] would prefer to run the actual Debian over the Raspberry Pi’s customized Debian version. I trust Debian more than any other distribution to provide me a vast amount of properly vetted free software packages. Moreover, a project like this would help other ARM devices as well. - -Above all, running the official Debian on Raspberry Pi is sort of challenge and I like such challenges. - -![Real Debian on Raspberry Pi][3] - -I am not the only one who thinks like this. There are many other Debian users who share the same feeling and this is why there exists an ongoing project to create a [Debian image for Raspberry Pi][4]. - -About two and a half months back, a Debian Developer (DD) named [Gunnar Wolf][5] took over that unofficial Raspberry Pi image generation project. - -I’ll be quickly showing you how can you install this Raspberry Pi Debian Buster preview image on your Raspberry Pi 3 (or higher) devices. - -### Getting Debian on Raspberry Pi [For Experts] - -``` -Warning - -Be aware this Debian image is very raw and unsupported at the moment. Though it’s very new, I believe experienced Raspberry Pi and Debian users should be able to use it. -``` - -Now as far as [Debian][6] is concerned, here is the Debian image and instructions that you could use to put the Debian stock image on your Raspberry pi 3 Model B+. - -#### Step 1: Download the Debian Raspberry Pi Buster image - -You can download the preview images using wget command: - -``` -wget https://people.debian.org/~gwolf/raspberrypi3/20190206/20190206-raspberry-pi-3-buster-PREVIEW.img.xz -``` - -#### Step 2: Verify checksum (optional) - -It’s optional but you should [verify the checksum][7]. You can do that by downloading the SHA256 hashfile and then comparing it with that of the downloaded Raspberry Pi Debian image. - -At my end I had moved both the .sha256 file as img.xz to a directory to make it easier to check although it’s not necessary. - -``` -wget https://people.debian.org/~gwolf/raspberrypi3/20190206/20190206-raspberry-pi-3-buster-PREVIEW.img.xz.sha256 - -sha256sum -c 20190206-raspberry-pi-3-buster-PREVIEW.img.xz.sha256 -``` - -#### Step 3: Write the image to your SD card - -Once you have verified the image, take a look at it. It is around 400MB in the compressed xzip format. You can extract it to get an image of around 1.5GB in size. - -Insert your SD card. **Before you carry on to the next command please change the sdX to a suitable name that corresponds to your SD card.** - -The command basically extracts the img.xz archive to the SD card. The progress switch/flag enables you to see a progress line with a number as to know how much the archive has extracted. - -``` -xzcat 20190206-raspberry-pi-3-buster-PREVIEW.img.xz | dd of=/dev/sdX bs=64k oflag=dsync status=progress$ xzcat 20190206-raspberry-pi-3-buster-PREVIEW.img.xz | dd of=/dev/sdX bs=64k oflag=dsync status=progress -``` - -Once you have successfully flashed your SD card, you should be able test if the installation went ok by sshing into your Raspberry Pi. The default root password is raspberry. - -``` -ssh root@rpi3 -``` - -If you are curious to know how the Raspberry Pi image was built, you can look at the [build scripts][8]. - -You can find more info on the project homepage. - -[DEBIAN RASPBERRY PI IMAGE][15] - -### How to contribute to the Raspberry Pi Buster effort - -There is a mailing list called [debian-arm][9] where people could contribute their efforts and ask questions. As you can see in the list, there is already a new firmware which was released [few days back][10] which might make booting directly a reality instead of the workaround shared above. - -If you want you could make a new image using the raspi3-image-spec shared above or wait for Gunnar to make a new image which might take time. - -Most of the maintainers also hang out at #vmdb2 at #OFTC. You can either use your IRC client or [Riot client][11], register your name at Nickserv and connect with either Gunnar Wolf, Roman Perier or/and Lars Wirzenius, author of [vmdb2][12]. I might do a follow-up on vmdb2 as it’s a nice little tool by itself. - -### The Road Ahead - -If there are enough interest and contributors, for instance, the lowest-hanging fruit would be to make sure that the ARM64 port [wiki page][13] is as current as possible. The benefits are and can be enormous. - -There are a huge number of projects which could benefit from either having a [Pi farm][14] to making your media server or a SiP phone or whatever you want to play/work with. - -Another low-hanging fruit might be synchronization between devices, say an ARM cluster sharing reports to either a Debian desktop by way of notification or on mobile or both ways. - -While I have shared about Raspberry Pi, there are loads of single-board computers on the market already and lot more coming, both from MIPS as well as OpenRISC-V so there is going to plenty of competition in the days ahead. - -Also, OpenRISC-V is and would be open-sourcing lot of its IP so non-free firmware or binary blobs would not be needed. Even MIPS is rumored to be more open which may challenge ARM if MIPS and OpenRISC-V are able to get their logistics and pricing right, but that is a story for another day. - -There are many more vendors, I am just sharing the ones whom I am most interested to see what they come up with. - -I hope the above sheds some light why it makes sense to have Debian on the Raspberry Pi. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/debian-raspberry-pi - -作者:[Shirish][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/shirish/ -[b]: https://github.com/lujun9972 -[1]: https://www.raspberrypi.org/downloads/raspbian/ -[2]: https://itsfoss.com/reasons-why-i-love-debian/ -[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/debian-raspberry-pi.png?resize=800%2C450&ssl=1 -[4]: https://wiki.debian.org/RaspberryPi3 -[5]: https://gwolf.org/node/4139 -[6]: https://www.debian.org/ -[7]: https://itsfoss.com/checksum-tools-guide-linux/ -[8]: https://github.com/Debian/raspi3-image-spec -[9]: https://lists.debian.org/debian-arm/2019/02/threads.html -[10]: https://alioth-lists.debian.net/pipermail/pkg-raspi-maintainers/Week-of-Mon-20190225/000310.html -[11]: https://itsfoss.com/riot-desktop/ -[12]: https://liw.fi/vmdb2/ -[13]: https://wiki.debian.org/Arm64Port -[14]: https://raspi.farm/ -[15]: https://wiki.debian.org/RaspberryPi3 diff --git a/sources/tech/20190306 Getting started with the Geany text editor.md b/sources/tech/20190306 Getting started with the Geany text editor.md deleted file mode 100644 index 7da5f95686..0000000000 --- a/sources/tech/20190306 Getting started with the Geany text editor.md +++ /dev/null @@ -1,141 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Getting started with the Geany text editor) -[#]: via: (https://opensource.com/article/19/3/getting-started-geany-text-editor) -[#]: author: (James Mawson https://opensource.com/users/dxmjames) - -Getting started with the Geany text editor -====== -Geany is a light and swift text editor with IDE features. - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/web_browser_desktop_devlopment_design_system_computer.jpg?itok=pfqRrJgh) - -I have to admit, it took me a rather embarrassingly long time to really get into Linux as a daily driver. One thing I recall from these years in the wilderness was how strange it was to watch open source types get so worked up about text editors. - -It wasn't just that opinions differed. Disagreements were intense. And you'd see them again and again. - -I mean, I suppose it makes some sense. Doing dev or admin work means you're spending a lot of time with a text editor. And when it gets in the way or won't do quite what you want? In that exact moment, that's the most frustrating thing in the world. - -And I know what it means to really hate a text editor. I learned this many years ago in the computer labs at university trying to figure out Emacs. I was quite shocked that a piece of software could have so many sadomasochistic overtones. People were doing that to each other deliberately! - -So perhaps it's a rite of passage that now I have one I very much like. It's called [Geany][1], it's on GPL, and it's [in the repositories][2] of most popular distributions. - -Here's why it works for me. - -### I'm into simplicity - -The main thing I want from a text editor is just to edit text. I don't think there should be any kind of learning curve in the way. I should be able to open it and use it. - -For that reason, I've generally used whatever is included with an operating system. On Windows 10, I used Notepad far longer than I should have. When I finally replaced it, it was with Notepad++. In the Linux terminal, I like Nano. - -I was perfectly aware I was missing out on a lot of useful functionality. But it was never enough of a pain point to make a change. And it's not that I've never tried anything more elaborate. I did some of my first real programming on Visual Basic and Borland Delphi. - -These development environments gave you a graphical interface to design your windows visually, various windows where you could configure properties and settings, a text interface to write your functions, and various odds and ends for debugging. This was a great way to build desktop applications, so long as you used it the way it was intended. - -But if you wanted to do something the authors didn't anticipate, all these extra moving parts suddenly got in the way. As software became more and more about the web and the internet, this situation started happening all the time. - -In the past, I used HTML editing suites like Macromedia Dreamweaver (as it was back then) and FirstPage for static websites. Again, I found the features could get in the way as much as they helped. These applications had their own ideas about how to organize your project, and if you had a different view, it was an awful bother. - -More recently, after a long break from programming, I started learning the people's language: [Python][3]. I bought a book of introductory tutorials, which said to install [IDLE][4], so I did. I think I got about five minutes into it before ditching it to run the interpreter from the command line. It had way too many moving parts to deal with. Especially for HelloWorld.py. - -But I always went back to Notepad++ and Nano whenever I could get away with it. - -So what changed? Well, a few months ago I [ditched Windows 10][5] completely (hooray!). Sticking with what I knew, I used Nano as my main text editor for a few weeks. - -I learned that Nano is great when you're already on the command line and you need to launch a Navy SEAL mission. You know what I mean. A lightning-fast raid. Get in, complete the objective, and get out. - -It's less ideal for long campaigns—or even moderately short ones. Even just adding a new page to a static website turns out to involve many repetitive keystrokes. As much as anything else, I really missed being able to navigate and select text with the mouse. - -### Introducing Geany - -The Geany project began in 2005 and is still actively developed. - -It has minimal dependencies: just the [GTK Toolkit][6] and the libraries that GTK depends on. If you have any kind of desktop environment installed, you almost certainly have GTK on your machine. - -I'm using it on Xfce, but thanks to these minimal dependencies, Geany is portable across desktop environments. - -Geany is fast and light. Installing Geany from the package manager took mere moments, and it uses only 3.1MB of space on my machine. - -So far, I've used it for HTML, CSS, and Python and to edit configuration files. It also recognizes C, Java, JavaScript, Perl, and [more][7]. - -### No-compromise simplicity - -Geany has a lot of great features that make life easier. Just listing them would miss the best bit, which is this: Geany makes sense right out of the box. As soon as it's installed, you can start editing files straightaway, and it just works. - -For all the IDE functionality, none of it gets in the way. The default settings are set intelligently, and the menus are laid out nicely enough that it's no hassle to change them. - -It doesn't try to organize your project for you, and it doesn't have strong opinions about how you should do anything. - -### Handles whitespace beautifully - -By default, every time you press Enter, Geany preserves the indentation on the new line. In addition to saving a few tedious keystrokes, it avoids the inconsistent use of tabs and spaces, which can sometimes sneak in when your mind's elsewhere and make your code hard to follow for anyone with a different text editor. - -But what if you're editing a file that's already suffered this treatment? For example, I needed to edit an HTML file that was indented with a mix of tabs and spaces, making it a nightmare to figure out how the tags were nested. - -With Geany, it took just seconds to hunt through the menus to change the tab length from four spaces to eight. Even better was the option to convert those tabs to spaces. Problem solved! - -### Clever shortcuts and automation - -How often do you write the correct code on the wrong line? I do it all the time. - -Geany makes it easy to move lines of code up and down using Alt+PgUp and Alt+PgDn. This is a little nicer than just a regular cut and paste—instead of needing four or five key presses, you only need one. - -When coding HTML, Geany automatically closes tags for you. As well as saving time, this avoids a lot of annoying bugs. When you forget to close a tag, you can spend ages scouring the document looking for something far more complex. - -It gets even better in Python, where indentation is crucial. Whenever you end a line with a colon, Geany automatically indents it for you. - -One nice little side effect is that when you forget to include the colon—something I do with embarrassing regularity—you realize it immediately when you don't get the automatic indentation you expected. - -The default indentation is a single tab, while I prefer two spaces. Because Geany's menus are very well laid out, it took me only a few seconds to figure out how to change it. - -You, of course, get syntax highlighting too. In addition, it tracks your [variable scope][8] and offers useful autocompletion. - -### Large plugin library - -Geany has a [big library of plugins][9], but so far I haven't needed to try any. Even so, I still feel like I benefit from them. How? Well, it means that my editor isn't crammed with functionality I don't use. - -I reckon this attitude of adding extra functionality into a big library of plugins is a great ethos—no matter your specific needs, you get to have all the stuff you want and none of what you don't. - -### Remote file editing - -One thing that's really nice about terminal text editors is that it's no problem to use them in a remote shell. - -Geany handles this beautifully, as well. You can open remote files anywhere you have SSH access as easily as you can open files on your own machine. - -One frustration I had at first was I only seemed to be able to authenticate with a username and password, which was annoying, because certificates are so much nicer. It turned out that this was just me being a noob by keeping certificates in my home directory rather than in ~/.ssh. - -When editing Python scripts remotely, autocompletion doesn't work when you use packages installed on the server and not on your local machine. This isn't really that big a deal for me, but it's there. - -### In summary - -Text editors are such a personal preference that the right one will be different for different people. - -Geany is excellent if you already know what you want to write and want to just get on with it while enjoying plenty of useful shortcuts to speed up the menial parts. - -Geany is a great way to have your cake and eat it too. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/getting-started-geany-text-editor - -作者:[James Mawson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dxmjames -[b]: https://github.com/lujun9972 -[1]: https://www.geany.org/ -[2]: https://www.geany.org/Download/ThirdPartyPackages -[3]: https://opensource.com/resources/python -[4]: https://en.wikipedia.org/wiki/IDLE -[5]: https://blog.dxmtechsupport.com.au/linux-on-the-desktop-are-we-nearly-there-yet/ -[6]: https://www.gtk.org/ -[7]: https://www.geany.org/Main/AllFiletypes -[8]: https://cscircles.cemc.uwaterloo.ca/11b-how-functions-work/ -[9]: https://plugins.geany.org/ diff --git a/sources/tech/20190311 Building the virtualization stack of the future with rust-vmm.md b/sources/tech/20190311 Building the virtualization stack of the future with rust-vmm.md deleted file mode 100644 index b1e7fbf046..0000000000 --- a/sources/tech/20190311 Building the virtualization stack of the future with rust-vmm.md +++ /dev/null @@ -1,76 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Building the virtualization stack of the future with rust-vmm) -[#]: via: (https://opensource.com/article/19/3/rust-virtual-machine) -[#]: author: (Andreea Florescu ) - -Building the virtualization stack of the future with rust-vmm -====== -rust-vmm facilitates sharing core virtualization components between Rust Virtual Machine Monitors. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_stack_blue_disks.png?itok=3hKDtK20) - -More than a year ago we started developing [Firecracker][1], a virtual machine monitor (VMM) that runs on top of KVM (the kernel-based virtual machine). We wanted to create a lightweight VMM that starts virtual machines (VMs) in a fraction of a second, with a low memory footprint, to enable high-density cloud environments. - -We started out developing Firecracker by forking the Chrome OS VMM ([CrosVM][2]), but we diverged shortly after because we targeted different customer use cases. CrosVM provides Linux application isolation in ChromeOS, while Firecracker is used for running multi-tenant workloads at scale. Even though we now walk different paths, we still have common virtualization components, such as wrappers over KVM input/output controls (ioctls), a minimal kernel loader, and use of the [Virtio][3] device models. - -With this in mind, we started thinking about the best approach for sharing the common code. Having a shared codebase raises the security and quality bar for both projects. Currently, fixing security bugs requires duplicated work in terms of porting the changes from one project to the other and going through different review processes for merging the changes. After open sourcing Firecracker, we've received requests for adding features including GPU support and booting [bzImage][4] files. Some of the requests didn't align with Firecracker's goals, but were otherwise valid use cases that just haven't found the right place for an implementation. - -### The rust-vmm project - -The [rust-vmm][5] project came to life in December 2018 when Amazon, Google, Intel, and Red Hat employees started talking about the best way of sharing virtualization packages. More contributors have joined this initiative along the way. We are still at the beginning of this journey, with only one component published to [Crates.io][6] (Rust's package registry) and several others (such as Virtio devices, Linux kernel loaders, and KVM ioctls wrappers) being developed. With two VMMs written in Rust under active development and growing interest in building other specialized VMMs, rust-vmm was born as the host for sharing core virtualization components. - -The goal of rust-vmm is to enable the community to create custom VMMs that import just the required building blocks for their use case. We decided to organize rust-vmm as a multi-repository project, where each repository corresponds to an independent virtualization component. Each individual building block is published on Crates.io. - -### Creating custom VMMs with rust-vmm - -The components discussed below are currently under development. - -![](https://opensource.com/sites/default/files/uploads/custom_vmm.png) - -Each box on the right side of the diagram is a GitHub repository corresponding to one package, which in Rust is called a crate. The functionality of one crate can be further split into modules, for example virtio-devices. Let's have a look at these components and some of their potential use cases. - - * **KVM interface:** Creating our VMM on top of KVM requires an interface that can invoke KVM functionality from Rust. The kvm-bindings crate represents the Rust Foreign Function Interface (FFI) to KVM kernel headers. Because headers only include structures and defines, we also have wrappers over the KVM ioctls (kvm-ioctls) that we use for opening dev/kvm, creating a VM, creating vCPUs, and so on. - - * **Virtio devices and rate limiting:** Virtio has a frontend-backend architecture. Currently in rust-vmm, the frontend is implemented in the virtio-devices crate, and the backend lies in the vhost package. Vhost has support for both user-land and kernel-land drivers, but users can also plug virtio-devices to their custom backend. The virtio-bindings are the bindings for Virtio devices generated using the Virtio Linux headers. All devices in the virtio-devices crate are exported independently as modules using conditional compilation. Some devices, such as block, net, and vsock support rate limiting in terms of I/O per second and bandwidth. This can be achieved by using the functionality provided in the rate-limiter crate. - - * The kernel-loader is responsible for loading the contents of an [ELF][7] kernel image in guest memory. - - - - -For example, let's say we want to build a custom VMM that allows users to create and configure a single VM running on top of KVM. As part of the configuration, users will be able to specify the kernel image file, the root file system, the number of vCPUs, and the memory size. Creating and configuring the resources of the VM can be implemented using the kvm-ioctls crate. The kernel image can be loaded in guest memory with kernel-loader, and specifying a root filesystem can be achieved with the virtio-devices block module. The last thing needed for our VMM is writing VMM Glue, the code that takes care of integrating rust-vmm components with the VMM user interface, which allows users to create and manage VMs. - -### How you can help - -This is the beginning of an exciting journey, and we are looking forward to getting more people interested in VMMs, Rust, and the place where you can find both: [rust-vmm][5]. - -We currently have [sync meetings][8] every two weeks to discuss the future of the rust-vmm organization. The meetings are open to anyone willing to participate. If you have any questions, please open an issue in the [community repository][9] or send an email to the rust-vmm [mailing list][10] (you can also [subscribe][11]). We also have a [Slack channel][12] and encourage you to join, if you are interested. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/rust-virtual-machine - -作者:[Andreea Florescu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: -[b]: https://github.com/lujun9972 -[1]: https://github.com/firecracker-microvm/firecracker -[2]: https://chromium.googlesource.com/chromiumos/platform/crosvm/ -[3]: https://www.linux-kvm.org/page/Virtio -[4]: https://en.wikipedia.org/wiki/Vmlinux#bzImage -[5]: https://github.com/rust-vmm -[6]: https://crates.io/ -[7]: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format -[8]: http://lists.opendev.org/pipermail/rust-vmm/2019-January/000103.html -[9]: https://github.com/rust-vmm/community -[10]: mailto:rust-vmm@lists.opendev.org -[11]: http://lists.opendev.org/cgi-bin/mailman/listinfo/rust-vmm -[12]: https://join.slack.com/t/rust-vmm/shared_invite/enQtNTI3NDM2NjA5MzMzLTJiZjUxOGEwMTJkZDVkYTcxYjhjMWU3YzVhOGQ0M2Y5NmU5MzExMjg5NGE3NjlmNzNhZDlhMmY4ZjVhYTQ4ZmQ diff --git a/sources/tech/20190312 BackBox Linux for Penetration Testing.md b/sources/tech/20190312 BackBox Linux for Penetration Testing.md deleted file mode 100644 index b79a4a5cee..0000000000 --- a/sources/tech/20190312 BackBox Linux for Penetration Testing.md +++ /dev/null @@ -1,200 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (BackBox Linux for Penetration Testing) -[#]: via: (https://www.linux.com/blog/learn/2019/3/backbox-linux-penetration-testing) -[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) - -BackBox Linux for Penetration Testing -====== -![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/security-2688911_1920.jpg?itok=yZ9TjAXu) - -Any given task can succeed or fail depending upon the tools at hand. For security engineers in particular, building just the right toolkit can make life exponentially easier. Luckily, with open source, you have a wide range of applications and environments at your disposal, ranging from simple commands to complicated and integrated tools. - -The problem with the piecemeal approach, however, is that you might wind up missing out on something that can make or break a job… or you waste a lot of time hunting down the right tools for the job. To that end, it’s always good to consider an operating system geared specifically for penetration testing (aka pentesting). - -Within the world of open source, the most popular pentesting distribution is [Kali Linux][1]. It is, however, not the only tool in the shop. In fact, there’s another flavor of Linux, aimed specifically at pentesting, called [BackBox][2]. BackBox is based on Ubuntu Linux, which also means you have easy access to a host of other outstanding applications besides those that are included, out of the box. - -### What Makes BackBox Special? - -BackBox includes a suite of ethical hacking tools, geared specifically toward pentesting. These testing tools include the likes of: - - * Web application analysis - - * Exploitation testing - - * Network analysis - - * Stress testing - - * Privilege escalation - - * Vulnerability assessment - - * Computer forensic analysis and exploitation - - * And much more - - - - -Out of the box, one of the most significant differences between Kali Linux and BackBox is the number of installed tools. Whereas Kali Linux ships with hundreds of tools pre-installed, BackBox significantly limits that number to around 70. Nonetheless, BackBox includes many of the tools necessary to get the job done, such as: - - * Ettercap - - * Msfconsole - - * Wireshark - - * ZAP - - * Zenmap - - * BeEF Browser Exploitation - - * Sqlmap - - * Driftnet - - * Tcpdump - - * Cryptcat - - * Weevely - - * Siege - - * Autopsy - - - - -BackBox is in active development, the latest version (5.3) was released February 18, 2019. But how is BackBox as a usable tool? Let’s install and find out. - -### Installation - -If you’ve installed one Linux distribution, you’ve installed them all … with only slight variation. BackBox is pretty much the same as any other installation. [Download the ISO][3], burn the ISO onto a USB drive, boot from the USB drive, and click the Install icon. - -The installer (Figure 1) will be instantly familiar to anyone who has installed a Ubuntu or Debian derivative. Just because BackBox is a distribution geared specifically toward security administrators, doesn’t mean the operating system is a challenge to get up and running. In fact, BackBox is a point-and-click affair that anyone, regardless of skills, can install. - -![installation][5] - -Figure 1: The installation of BackBox will be immediately familiar to anyone. - -[Used with permission][6] - -The trickiest section of the installation is the Installation Type. As you can see (Figure 2), even this step is quite simple. - -![BackBox][8] - -Figure 2: Selecting the type of installation for BackBox. - -[Used with permission][6] - -Once you’ve installed BackBox, reboot the system, remove the USB drive, and wait for it to land on the login screen. Log into the desktop and you’re ready to go (Figure 3). - -![desktop][10] - -Figure 3: The BackBox Linux desktop, running as a VirtualBox virtual machine. - -[Used with permission][6] - -### Using BackBox - -Thanks to the [Xfce desktop environment][11], BackBox is easy enough for a Linux newbie to navigate. Click on the menu button in the top left corner to reveal the menu (Figure 4). - -![desktop menu][13] - -Figure 4: The BackBox desktop menu in action. - -[Used with permission][6] - -From the desktop menu, click on any one of the favorites (in the left pane) or click on a category to reveal the related tools (Figure 5). - -![Auditing][15] - -Figure 5: The Auditing category in the BackBox menu. - -[Used with permission][6] - -The menu entries you’ll most likely be interested in are: - - * Anonymous - allows you to start an anonymous networking session. - - * Auditing - the majority of the pentesting tools are found in here. - - * Services - allows you to start/stop services such as Apache, Bluetooth, Logkeys, Networking, Polipo, SSH, and Tor. - - - - -Before you run any of the testing tools, I would recommend you first making sure to update and upgrade BackBox. This can be done via a GUI or the command line. If you opt to go the GUI route, click on the desktop menu, click System, and click Software Updater. When the updater completes its check for updates, it will prompt you if any are available, or if (after an upgrade) a reboot is necessary (Figure 6). - -![reboot][17] - -Figure 6: Time to reboot after an upgrade. - -[Used with permission][6] - -Should you opt to go the manual route, open a terminal window and issue the following two commands: - -``` -sudo apt-get update - -sudo apt-get upgrade -y -``` - -Many of the BackBox pentesting tools do require a solid understanding of how each tool works, so before you attempt to use any given tool, make sure you know how to use said tool. Some tools (such as Metasploit) are made a bit easier to work with, thanks to BackBox. To run Metasploit, click on the desktop menu button and click msfconsole from the favorites (left pane). When the tool opens for the first time, you’ll be asked to configure a few options. Simply select each default given by clicking your keyboard Enter key when prompted. Once you see the Metasploit prompt, you can run commands like: - -``` -db_nmap 192.168.0/24 -``` - -The above command will list out all discovered ports on a 192.168.1.x network scheme (Figure 7). - -![Metasploit][19] - -Figure 7: Open port discovery made simple with Metasploit on BackBox. - -[Used with permission][6] - -Even often-challenging tools like Metasploit are made far easier than they are with other distributions (partially because you don’t have to bother with installing the tools). That alone is worth the price of entry for BackBox (which is, of course, free). - -### The Conclusion - -Although BackBox usage may not be as widespread as Kali Linux, it still deserves your attention. For anyone looking to do pentesting on their various environments, BackBox makes the task far easier than so many other operating systems. Give this Linux distribution a go and see if it doesn’t aid you in your journey to security nirvana. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/learn/2019/3/backbox-linux-penetration-testing - -作者:[Jack Wallen][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linux.com/users/jlwallen -[b]: https://github.com/lujun9972 -[1]: https://www.kali.org/ -[2]: https://linux.backbox.org/ -[3]: https://www.backbox.org/download/ -[4]: /files/images/backbox1jpg -[5]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_1.jpg?itok=pn4fQVp7 (installation) -[6]: /licenses/category/used-permission -[7]: /files/images/backbox2jpg -[8]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_2.jpg?itok=tf-1zo8Z (BackBox) -[9]: /files/images/backbox3jpg -[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_3.jpg?itok=GLowoAUb (desktop) -[11]: https://www.xfce.org/ -[12]: /files/images/backbox4jpg -[13]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_4.jpg?itok=VmQXtuZL (desktop menu) -[14]: /files/images/backbox5jpg -[15]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_5.jpg?itok=UnfM_OxG (Auditing) -[16]: /files/images/backbox6jpg -[17]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/backbox_6.jpg?itok=2t1BiKPn (reboot) -[18]: /files/images/backbox7jpg -[19]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_7.jpg?itok=Vw_GEub3 (Metasploit) diff --git a/sources/tech/20190312 Star LabTop Mk III Open Source Edition- An Interesting Laptop.md b/sources/tech/20190312 Star LabTop Mk III Open Source Edition- An Interesting Laptop.md deleted file mode 100644 index 2e4b8f098a..0000000000 --- a/sources/tech/20190312 Star LabTop Mk III Open Source Edition- An Interesting Laptop.md +++ /dev/null @@ -1,93 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Star LabTop Mk III Open Source Edition: An Interesting Laptop) -[#]: via: (https://itsfoss.com/star-labtop-open-source-edition) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -Star LabTop Mk III Open Source Edition: An Interesting Laptop -====== - -[Star Labs Systems][1] have been producing Laptops tailored for Linux for some time. While you can purchase other variants available on their website, they have recently launched a [Kickstarter campaign][2] for their upcoming ‘Open Source Edition’ laptop that incorporates more features as per the requests by the users or reviewers. - -It may not be the best laptop you’ve ever come across for around a **1000 Euros** – but it certainly is interesting for some specific features. - -In this article, we will talk about what makes it an interesting deal and whether or not it’s worth investing for. - -![star labtop mk III][3] - -### Key Highlight: Open-source Coreboot Firmware - -Normally, you will observe proprietary firmware (BIOS) on computers, American Megatrends Inc, for example. - -But, here, Star Labs have tailored the [coreboot firmware][4] (a.k.a known as the LinuxBIOS) which is an open source alternative to proprietary solutions for this laptop. - -Not just open source but it is also a lighter firmware for better control over your laptop. With [TianoCore EDK II][5], it ensures that you get the maximum compatibility for most of the major Operating Systems. - -### Other Features of Star LabTop Mk III - -![sat labtop mk III][6] - -In addition to the open source firmware, the laptop features an **8th-gen i7 chipse** t ( **i7-8550u** ) coupled with **16 Gigs of LPDDR4 RAM** clocked at **2400 MHz**. - -The GPU being the integrated **Intel UHD Graphics 620** should be enough for professional tasks – except video editing and gaming. It will be rocking a **Full HD 13.3-inch IPS** panel as the display. - -The storage option includes **480 GB or 960 GB of PCIe SSD** – which is impressive as well. In addition to all this, it comes with the **USB Type-C** support. - -Interestingly, the **BIOS, Embedded Controller and SSD** will be receiving automatic [firmware updates][7] via the [LVFS][8] (the Mk III standard edition has this feature already). - -You should also check out a review video of [Star LabTob Mk III][9] to get an idea of how the open source edition could look like: - -If you are curious about the detailed tech specs, you should check out the [Kickstarter page][2]. - - - -### Our Opinion - -![star labtop mk III][10] - -The inclusion of coreboot firmware and being something tailored for various Linux distributions originally is the reason why it is being termed as the “ **Open Source Edition”**. - -The price for the ultimate bundle on Kickstarter is **1087 Euros**. - -Can you get better laptop deals at this price? **Yes** , definitely. But, it really comes down to your preference and your passion for open source – of what you require. - -However, if you want a performance-driven laptop specifically tailored for Linux, yes, this is an option you might want to consider with something new to offer (and potentially considering your requests for their future builds). - -Of course, you cannot consider this for video editing and gaming – for obvious reasons. So, they should considering adding a dedicated GPU to make it a complete package for computing, gaming, video editing and much more. Maybe even a bigger screen, say 15.6-inch? - -### Wrapping Up - -For what it is worth, if you are a Linux and open source enthusiast and want a performance-driven laptop, this could be an option to go with and back this up on Kickstarter right now. - -What do you think about it? Will you be interested in a laptop like this? If not, why? - -Let us know your thoughts in the comments below. - - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/star-labtop-open-source-edition - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://starlabs.systems -[2]: https://www.kickstarter.com/projects/starlabs/star-labtop-mk-iii-open-source-edition -[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/star-labtop-mkiii-2.jpg?resize=800%2C450&ssl=1 -[4]: https://en.wikipedia.org/wiki/Coreboot -[5]: https://github.com/tianocore/tianocore.github.io/wiki/EDK-II -[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/star-labtop-mkiii-1.jpg?ssl=1 -[7]: https://itsfoss.com/update-firmware-ubuntu/ -[8]: https://fwupd.org/ -[9]: https://starlabs.systems/pages/star-labtop -[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/star-labtop-mkiii.jpg?resize=800%2C435&ssl=1 -[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/star-labtop-mkiii-2.jpg?fit=800%2C450&ssl=1 diff --git a/sources/tech/20190313 Game Review- Steel Rats is an Enjoyable Bike-Combat Game.md b/sources/tech/20190313 Game Review- Steel Rats is an Enjoyable Bike-Combat Game.md deleted file mode 100644 index 5af0ae30d3..0000000000 --- a/sources/tech/20190313 Game Review- Steel Rats is an Enjoyable Bike-Combat Game.md +++ /dev/null @@ -1,95 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Game Review: Steel Rats is an Enjoyable Bike-Combat Game) -[#]: via: (https://itsfoss.com/steel-rats) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -Game Review: Steel Rats is an Enjoyable Bike-Combat Game -====== - -Steel Rats is a quite impressive 2.5D motorbike combat game with exciting stunts involved. It was already available for Windows on [Steam][1] – however, recently it has been made available for Linux and Mac as well. - -In case you didn’t know, you can easily [install Steam on Ubuntu][2] or other distributions and [enable Steam Play feature to run some Windows games on Linux][3]. - -So, in this article, we shall take a look at what the game is all about and if it is a good purchase for you. - -This game is neither free nor open source. We have covered it here because the game developers made an effort to port it to Linux. - -### Story Overview - -![steel rats][4] - -You belong to a biker gang – “ **Steel Rats** ” – who stepped up to protect their city from alien robots invasion. The alien robots aren’t just any tiny toys that you can easily defeat but with deadly weapons and abilities. - -The games features the setting as an alternative version of 1940’s USA – with the retro theme in place. You have to use your bike as the ultimate weapon to go against waves of alien robot and boss fights as well. - -You will encounter 4 different characters with unique abilities to switch from after progressing through a couple of rounds. - -You will start playing as “ **Toshi** ” and unlock other characters as you progress. **Toshi** is a genius and will be using a drone as his gadget to fight the alien robots. **James** – is the leader with the hammer attack as his special ability. **Lisa** would be the one utilizing fire to burn the junk robots. And, **Randall** will have his harpoon ready to destroy aerial robots with ease. - -### Gameplay - -![][5] - -Honestly, I am not a fan of 2.5 D (or 2D games). But, games like [Unravel][6] will be the exception – which is still not available for Linux, such a shame – EA. - -In this case, I did end up enjoying “ **Steel Rats** ” as one of the few 2D games I play. - -There is really no rocket science for this game – you just have to get good with the controls. No matter whether you use a controller or a keyboard, it is definitely challenging to get comfortable with the controls. - -You do not need to plan ahead in order to save your health or nitro boost because you will always have it when needed while also having checkpoints to resume your progress. - -You just need to keep the right pace and the perfect jump while hitting every enemy to get the best score in the leader boards. Once you do that, the game ends up being an easy and fun experience. - -If you’re curious about the gameplay, we recommend watching this video: - - ! (or $150/$250/$600 for the corporate rate). - -Here’s the cover and table of contents! - -[![][4]][5] - -A few people have asked for a 3-pack with all 3 “bite size” zines which is coming soon! - -### why this zine? - -In last few years I’ve been doing a lot of networking at work, and along the way I’ve gone from “uh, what even is tcpdump” to “yes I can just type in `sudo tcpdump -c 200 -n port 443 -i lo`” without even thinking twice about it. As usual this zine is the resource I wish I had 4 years ago. There are so many things it took me a long time to figure out how to do like: - - * inspect SSL certificates - * make DNS queries - * figure out what server is using that port - * find out whether the firewall is causing you problems or not - * capture / search network traffic on a machine - - - -and as often happens with computers none of them are really that hard!! But the man pages for the tols you need to do these things are Very Long and as usual don’t differentiate between “everybody always uses this option and you 10000% need to know it” and “you will never use this option it does not matter”. So I spent a long time staring sadly at the tcpdump man page. - -the pitch for this zine is: - -> It’s Thursday afternoon and your users are reporting SSL errors in production and you don’t know why. Or a HTTP header isn’t being set correctly and it’s breaking the site. Or you just got a notification that your site’s SSL certificate is expiring in 2 days. Or you need to update DNS to point to a new server. Or a server suddenly isn’t able to connect to a service. And networking maybe isn’t your full time job, but you still need to get the problem fixed. - -Kamal (my partner) proofreads all my zines and we hit an exciting milestone with this one: this is the first zine where he was like “wow, I really did not know a lot of the stuff in this zine”. This is of course because I’ve spent a lot more time than him debugging weird networking things, and when you practice something you get better at it :) - -### a couple of example pages - -Here are a couple of example pages, to give you an idea of what’s in the zine: - -![][6] ![][7] - -### next thing to get better at: getting feedback! - -One thing I’ve realized that while I get a ton of help from people while writing these zines (I read probably a thousand tweets from people suggesting ideas for things to include in the zine), I don’t get as much feedback from people about the final product as I’d like! - -I often hear positive things (“I love them!”, “thank you so much!”, “this helped me in my job!”) but I’d really love to hear more about which bits specifically helped the most and what didn’t make as much sense or what you would have liked to see more of. So I’ll probably be asking a few questions about that to people who buy this zine! - -### selling zines is going well - -When I made the switch about a year ago from “every zine I release is free” to “the old zines are free but all the new ones are not free” it felt scary! It’s been startlingly totally fine and a very positive thing. Sales have been really good, people take the work more seriously, I can spend more time on them, and I think the quality has gone up. - -And I’ve been doing occasional [giveaways][8] for people who can’t afford a $10 zine, which feels like a nice way to handle “some people legitimately can’t afford $10 and I would like to get them information too”. - -### what’s next? - -I’m not sure yet! A few options: - - * kubernetes - * more about linux concepts (bite size linux part II) - * how to do statistics using simulations - * something else! - - - -We’ll see what I feel most inspired by :) - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019/03/15/new-zine--bite-size-networking-/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://wizardzines.com/zines/bite-size-linux/ -[2]: https://wizardzines.com/zines/bite-size-command-line/ -[3]: https://wizardzines.com/zines/bite-size-networking/ -[4]: https://jvns.ca/images/bite-size-networking-cover.png -[5]: https://gum.co/bite-size-networking -[6]: https://jvns.ca/images/ngrep.png -[7]: https://jvns.ca/images/ping.png -[8]: https://twitter.com/b0rk/status/1104368319816220674 diff --git a/sources/tech/20190318 Building and augmenting libraries by calling Rust from JavaScript.md b/sources/tech/20190318 Building and augmenting libraries by calling Rust from JavaScript.md deleted file mode 100644 index 935f8eded5..0000000000 --- a/sources/tech/20190318 Building and augmenting libraries by calling Rust from JavaScript.md +++ /dev/null @@ -1,176 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Building and augmenting libraries by calling Rust from JavaScript) -[#]: via: (https://opensource.com/article/19/3/calling-rust-javascript) -[#]: author: (Ryan Levick https://opensource.com/users/ryanlevick) - -Building and augmenting libraries by calling Rust from JavaScript -====== - -Explore how to use WebAssembly (Wasm) to embed Rust inside JavaScript. - -![JavaScript in Vim][1] - -In _[Why should you use Rust in WebAssembly?][2]_ , I looked at why you might want to write WebAssembly (Wasm), and why you might choose Rust as the language to do it in. Now I'll share what that looks like by exploring ways to embed Rust inside JavaScript. - -This is something that separates Rust from Go, C#, and other languages with large runtimes that can compile to Wasm. Rust has a minimal runtime (basically just an allocator), making it easy to use Rust from JavaScript libraries. C and C++ have similar stories, but what sets Rust apart is its tooling, which we'll take a look at now. - -### The basics - -If you've never used Rust before, you'll first want to get that set up. It's pretty easy. First download [**Rustup**][3], which is a way to control versions of Rust and different toolchains for cross-compilation. This will give you access to [**Cargo**][4], which is the Rust build tool and package manager. - -Now we have a decision to make. We can easily write Rust code that runs in the browser through WebAssembly, but if we want to do anything other than make people's CPU fans spin, we'll probably at some point want to interact with the Document Object Model (DOM) or use some JavaScript API. In other words: _we need JavaScript interop_ (aka the JavaScript interoperability API). - -### The problem and the solutions - -WebAssembly is an extremely simple machine language. If we want to be able to communicate with JavaScript, Wasm gives us only four data types to do it with: 32- and 64-bit floats and integers. Wasm doesn't have a concept of strings, arrays, objects, or any other rich data type. Basically, we can only pass around pointers between Rust and JavaScript. Needless to say, this is less than ideal. - -The good news is there are two libraries that facilitate communication between Rust-based Wasm and JavaScript: [**wasm-bindgen**][5] and [**stdweb**][6]. The bad news, however, is these two libraries are unfortunately incompatible with each other. **wasm-bindgen** is lower-level than **stdweb** and attempts to provide full control over how JavaScript and Rust interact. In fact, there is even talk of [rewriting **stdweb** using **wasm-bindgen**][7], which would get rid of the issue of incompatibility. - -Because **wasm-bindgen** is the lighter-weight option (and the option officially worked on by the official [Rust WebAssembly working group][8]), we'll focus at that. - -### wasm-bindgen and wasm-pack - -We're going to create a function that takes a string from JavaScript, makes it uppercase and prepends "HELLO, " to it, and returns it back to JavaScript. We'll call this function **excited_greeting**! - -First, let's create our Rust library that will house this fabulous function: - -``` -$ cargo new my-wasm-library --lib -$ cd my-wasm-library -``` - -Now we'll want to replace the contents of **src/lib.rs** with our exciting logic. I think it's best to write the code out instead of copy/pasting. - -``` -// Include the `wasm_bindgen` attribute into the current namespace. -use wasm_bindgen::prelude::wasm_bindgen; - -// This attribute makes calling Rust from JavaScript possible. -// It generates code that can convert the basic types wasm understands -// (integers and floats) into more complex types like strings and -// vice versa. If you're interested in how this works, check this out: -// -#[wasm_bindgen] -// This is pretty plain Rust code. If you've written Rust before this -// should look extremely familiar. If not, why wait?! Check this out: -// -pub fn excited_greeting(original: &str) -> String { -format!("HELLO, {}", original.to_uppercase()) -} -``` - -Second, we'll have to make two changes to our **Cargo.toml** configuration file: - - * Add **wasm_bindgen** as a dependency. - * Configure the type of library binary to be a **cdylib** or dynamic system library. In this case, our system is **wasm** , and setting this option is how we produce **.wasm** binary files. - - -``` -[package] -name = "my-wasm-library" -version = "0.1.0" -authors = ["$YOUR_INFO"] -edition = "2018" - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -wasm-bindgen = "0.2.33" -``` - -Now let's build! If we just use **cargo build** , we'll get a **.wasm** binary, but in order to make it easy to call our Rust code from JavaScript, we'd like to have some JavaScript code that converts rich JavaScript types like strings and objects to pointers and passes these pointers to the Wasm module on our behalf. Doing this manually is tedious and prone to bugs. - -Luckily, in addition to being a library, **wasm-bindgen** also has the ability to create this "glue" JavaScript for us. This means in our code we can interact with our Wasm module using normal JavaScript types, and the generated code from **wasm-bindgen** will do the dirty work of converting these rich types into the pointer types that Wasm actually understands. - -We can use the awesome **wasm-pack** to build our Wasm binary, invoke the **wasm-bindgen** CLI tool, and package all of our JavaScript (and any optional generated TypeScript types) into one nice and neat package. Let's do that now! - -First we'll need to install **wasm-pack** : - -``` -$ cargo install wasm-pack -``` - -By default, **wasm-bindgen** produces ES6 modules. We'll use our code from a simple script tag, so we just want it to produce a plain old JavaScript object that gives us access to our Wasm functions. To do this, we'll pass it the **\--target no-modules** option. - -``` -$ wasm-pack build --target no-modules -``` - -We now have a **pkg** directory in our project. If we look at the contents, we'll see the following: - - * **package.json** : useful if we want to package this up as an NPM module - * **my_wasm_library_bg.wasm** : our actual Wasm code - * **my_wasm_library.js** : the JavaScript "glue" code - * Some TypeScript definition files - - - -Now we can create an **index.html** file that will make use of our JavaScript and Wasm: - -``` -<[html][9]> -<[head][10]> -<[meta][11] content="text/html;charset=utf-8" http-equiv="Content-Type" /> - -<[body][12]> - -<[script][13] src='./pkg/my_wasm_library.js'> - -<[script][13]> -window.addEventListener('load', async () => { -// Load the wasm file -await wasm_bindgen('./pkg/my_wasm_library_bg.wasm'); -// Once it's loaded the `wasm_bindgen` object is populated -// with the functions defined in our Rust code -const greeting = wasm_bindgen.excited_greeting("Ryan") -console.log(greeting) -}); - - - -``` - -You may be tempted to open the HTML file in your browser, but unfortunately, this is not possible. For security reasons, Wasm files have to be served from the same domain as the HTML file. You'll need an HTTP server. If you have a favorite static HTTP server that can serve files from your filesystem, feel free to use that. I like to use [**basic-http-server**][14], which you can install and run like so: - -``` -$ cargo install basic-http-server -$ basic-http-server -``` - -Now open the **index.html** file through the web server by going to **** and check your JavaScript console. You should see a very exciting greeting there! - -If you have any questions, please [let me know][15]. Next time, we'll take a look at how we can use various browser and JavaScript APIs from within our Rust code. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/calling-rust-javascript - -作者:[Ryan Levick][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/javascript_vim.jpg?itok=mqkAeakO (JavaScript in Vim) -[2]: https://opensource.com/article/19/2/why-use-rust-webassembly -[3]: https://rustup.rs/ -[4]: https://doc.rust-lang.org/cargo/ -[5]: https://github.com/rustwasm/wasm-bindgen -[6]: https://github.com/koute/stdweb -[7]: https://github.com/koute/stdweb/issues/318 -[8]: https://www.rust-lang.org/governance/wgs/wasm -[9]: http://december.com/html/4/element/html.html -[10]: http://december.com/html/4/element/head.html -[11]: http://december.com/html/4/element/meta.html -[12]: http://december.com/html/4/element/body.html -[13]: http://december.com/html/4/element/script.html -[14]: https://github.com/brson/basic-http-server -[15]: https://twitter.com/ryan_levick diff --git a/sources/tech/20190318 Install MEAN.JS Stack In Ubuntu 18.04 LTS.md b/sources/tech/20190318 Install MEAN.JS Stack In Ubuntu 18.04 LTS.md deleted file mode 100644 index 925326e0d7..0000000000 --- a/sources/tech/20190318 Install MEAN.JS Stack In Ubuntu 18.04 LTS.md +++ /dev/null @@ -1,266 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Install MEAN.JS Stack In Ubuntu 18.04 LTS) -[#]: via: (https://www.ostechnix.com/install-mean-js-stack-ubuntu/) -[#]: author: (sk https://www.ostechnix.com/author/sk/) - -Install MEAN.JS Stack In Ubuntu 18.04 LTS -====== - -![Install MEAN.JS Stack][1] - -**MEAN.JS** is an Open-Source, full-Stack JavaScript solution for building fast, and robust web applications. **MEAN.JS** stack consists of **MongoDB** (NoSQL database), **ExpressJs** (NodeJS server-side application web framework), **AngularJS** (Client-side web application framework), and **Node.js** (JavaScript run-time, popular for being a web server platform). In this tutorial, we will be discussing how to install MEAN.JS stack in Ubuntu. This guide was tested in Ubuntu 18.04 LTS server. However, it should work on other Ubuntu versions and Ubuntu variants. - -### Install MongoDB - -**MongoDB** is a free, cross-platform, open source, NoSQL document-oriented database. To install MongoDB on your Ubuntu system, refer the following guide: - - * [**Install MongoDB Community Edition In Linux**][2] - - - -### Install Node.js - -**NodeJS** is an open source, cross-platform, and lightweight JavaScript run-time environment that can be used to build scalable network applications. - -To install NodeJS on your system, refer the following guide: - - * [**How To Install NodeJS On Linux**][3] - - - -After installing, MongoDB, and Node.js, we need to install the other required components such as **Yarn** , **Grunt** , and **Gulp** for MEAN.js stack. - -### Install Yarn package manager - -Yarn is a package manager used by MEAN.JS stack to manage front-end packages. - -To install Bower, run the following command: - -``` -$ npm install -g yarn -``` - -### Install Grunt Task Runner - -Grunt Task Runner is used to to automate the development process. - -To install Grunt, run: - -``` -$ npm install -g grunt-cli -``` - -To verify if Yarn and Grunt have been installed, run: - -``` -$ npm list -g --depth=0 /home/sk/.nvm/versions/node/v11.11.0/lib ├── [email protected] ├── [email protected] └── [email protected] -``` - -### Install Gulp Task Runner (Optional) - -This is optional. You can use Gulp instead of Grunt. To install Gulp Task Runner, run the following command: - -``` -$ npm install -g gulp -``` - -We have installed all required prerequisites. Now, let us deploy MEAN.JS stack. - -### Download and Install MEAN.JS Stack - -Install Git if it is not installed already: - -``` -$ sudo apt-get install git -``` - -Next, git clone the MEAN.JS repository with command: - -``` -$ git clone https://github.com/meanjs/mean.git meanjs -``` - -**Sample output:** - -``` -Cloning into 'meanjs'... -remote: Counting objects: 8596, done. -remote: Compressing objects: 100% (12/12), done. -remote: Total 8596 (delta 3), reused 0 (delta 0), pack-reused 8584 Receiving objects: 100% (8596/8596), 2.62 MiB | 140.00 KiB/s, done. -Resolving deltas: 100% (4322/4322), done. -Checking connectivity... done. -``` - -The above command will clone the latest version of the MEAN.JS repository to **meanjs** folder in your current working directory. - -Go to the meanjs folder: - -``` -$ cd meanjs/ -``` - -Run the following command to install the Node.js dependencies required for testing and running our application: - -``` -$ npm install -``` - -This will take some time. Please be patient. - -* * * - -**Troubleshooting:** - -When I run the above command in Ubuntu 18.04 LTS, I get the following error: - -``` -Downloading binary from https://github.com/sass/node-sass/releases/download/v4.5.3/linux-x64-67_binding.node -Cannot download "https://github.com/sass/node-sass/releases/download/v4.5.3/linux-x64-67_binding.node": - -HTTP error 404 Not Found - -[....] -``` - -If you ever get these type of common errors like “node-sass and gulp-sass”, do the following: - -First uninstall the project and global gulp-sass modules using the following commands: - -``` -$ npm uninstall gulp-sass -$ npm uninstall -g gulp-sass -``` - -Next uninstall the global node-sass module: - -``` -$ npm uninstall -g node-sass -``` - -Install the global node-sass first. Then install the gulp-sass module at the local project level. - -``` -$ npm install -g node-sass -$ npm install gulp-sass -``` - -Now try the npm install again from the project folder using command: - -``` -$ npm install -``` - -Now all dependencies will start to install without any issues. - -* * * - -Once all dependencies are installed, run the following command to install all the front-end modules needed for the application: - -``` -$ yarn --allow-root --config.interactive=false install -``` - -Or, - -``` -$ yarn --allow-root install -``` - -You will see the following message at the end if the installation is successful. - -``` -[...] -> meanjs@0.6.0 snyk-protect /home/sk/meanjs -> snyk protect - -Successfully applied Snyk patches - -Done in 99.47s. -``` - -### Test MEAN.JS - -MEAN.JS stack has been installed. We can now able to start a sample application using command: - -``` -$ npm start -``` - -After a few seconds, you will see a message like below. This means MEAN.JS stack is working! - -``` -[...] -MEAN.JS - Development Environment - -Environment: development -Server: http://0.0.0.0:3000 -Database: mongodb://localhost/mean-dev -App version: 0.6.0 -MEAN.JS version: 0.6.0 -``` - -![][4] - -To verify, open up the browser and navigate to **** or ****. You should see a screen something like below. - -![][5] - -Mean stack test page - -Congratulations! MEAN.JS stack is ready to start building web applications. - -For further details, I recommend you to refer **[MEAN.JS stack official documentation][6]**. - -* * * - -Want to setup MEAN.JS stack in CentOS, RHEL, Scientific Linux? Check the following link for more details. - - * **[Install MEAN.JS Stack in CentOS 7][7]** - - - -* * * - -And, that’s all for now, folks. Hope this tutorial will help you to setup MEAN.JS stack. - -If you find this tutorial useful, please share it on your social, professional networks and support OSTechNix. - -More good stuffs to come. Stay tuned! - -Cheers! - -**Resources:** - - * **[MEAN.JS website][8]** - * [**MEAN.JS GitHub Repository**][9] - - - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/install-mean-js-stack-ubuntu/ - -作者:[sk][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[2]: https://www.ostechnix.com/install-mongodb-linux/ -[3]: https://www.ostechnix.com/install-node-js-linux/ -[4]: http://www.ostechnix.com/wp-content/uploads/2016/03/meanjs.png -[5]: http://www.ostechnix.com/wp-content/uploads/2016/03/mean-stack-test-page.png -[6]: http://meanjs.org/docs.html -[7]: http://www.ostechnix.com/install-mean-js-stack-centos-7/ -[8]: http://meanjs.org/ -[9]: https://github.com/meanjs/mean diff --git a/sources/tech/20190318 Solus 4 ‘Fortitude- Released with Significant Improvements.md b/sources/tech/20190318 Solus 4 ‘Fortitude- Released with Significant Improvements.md deleted file mode 100644 index c7a8d4bc55..0000000000 --- a/sources/tech/20190318 Solus 4 ‘Fortitude- Released with Significant Improvements.md +++ /dev/null @@ -1,108 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Solus 4 ‘Fortitude’ Released with Significant Improvements) -[#]: via: (https://itsfoss.com/solus-4-release) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -Solus 4 ‘Fortitude’ Released with Significant Improvements -====== - -Finally, after a year of work, the much anticipated Solus 4 is here. It’s a significant release not just because this is a major upgrade, but also because this is the first major release after [Ikey Doherty (the founder of Solus) left the project][1] a few months ago. - -Now that everything’s under control with the new _management_ , **Solus 4 Fortitude** with updated Budgie desktop and other significant improvements has officially released. - -### What’s New in Solus 4 - -![Solus 4 Fortitude][2] - -#### Core Improvements - -Solus 4 comes loaded with **[Linux Kernel 4.20.16][3]** which enables better hardware support (like Touchpad support, improved support for Intel Coffee Lake and Ice Lake CPUs, and for AMD Picasso & Raven2 APUs). - -This release also ships with the latest [FFmpeg 4.1.1][4]. Also, they have enabled the support for [dav1d][5] in [VLC][6] – which is an open source AV1 decoder. So, you can consider these upgrades to significantly improve the Multimedia experience. - -It also includes some minor fixes to the Software Center – if you were encountering any issues while finding an application or viewing the description. - -In addition, WPS Office has been removed from the listing. - -#### UI Improvements - -![Budgie 10.5][7] - -The Budgie desktop update includes some minor changes and also comes baked in with the [Plata (Noir) GTK Theme.][8] - -You will no longer observe same applications multiple times in the menu, they’ve fixed this. They have also introduced a “ **Caffeine** ” mode as applet which prevents the system from suspending, locking the screen or changing the brightness while you are working. You can schedule the time accordingly. - -![Caffeine Mode][9] - -The new Budgie desktop experience also adds quick actions to the app icons on the task bar, dubbed as “ **Icon Tasklist** “. It makes it easy to manage the active tabs on a browser or the actions to minimize and move it to a new workplace (as shown in the image below). - -![Icon Tasklist][10] - -As the [change log][11] mentions, the above pop over design lets you do more: - - * _Close all instances of the selected application_ - * _Easily access per-window controls for marking it always on top, maximizing / unmaximizing, minimizing, and moving it to various workspaces._ - * _Quickly favorite / unfavorite apps_ - * _Quickly launch a new instance of the selected application_ - * _Scroll up or down on an IconTasklist button when a single window is open to activate and bring it into focus, or minimize it, based on the scroll direction._ - * _Toggle to minimize and unminimize various application windows_ - - - -The notification area now groups the notifications from specific applications instead of piling it all up. So, that’s a good improvement. - -In addition to these, the sound widget got some cool improvements while letting you personalize the look and feel of your desktop in an efficient manner. - -To know about all the nitty-gritty details, do refer the official [release note][11]s. - -### Download Solus 4 - -You can get the latest version of Solus from its download page below. It is available in the default Budgie, GNOME and MATE desktop flavors. - -[Get Solus 4][12] - -### Wrapping Up** - -Solus 4 is definitely an impressive upgrade – without introducing any unnecessary fancy features but by adding only the useful ones, subtle changes. - -What do you think about the latest Solus 4 Fortitude? Have you tried it yet? - -Let us know your thoughts in the comments below. - - - - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/solus-4-release - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/ikey-leaves-solus/ -[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/solus-4-featured.jpg?fit=800%2C450&ssl=1 -[3]: https://itsfoss.com/kernel-4-20-release/ -[4]: https://www.ffmpeg.org/ -[5]: https://code.videolan.org/videolan/dav1d -[6]: https://www.videolan.org/index.html -[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/Budgie-desktop.jpg?resize=800%2C450&ssl=1 -[8]: https://gitlab.com/tista500/plata-theme -[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/caffeine-mode.jpg?ssl=1 -[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/IconTasklistPopover.jpg?ssl=1 -[11]: https://getsol.us/2019/03/17/solus-4-released/ -[12]: https://getsol.us/download/ -[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/Budgie-desktop.jpg?fit=800%2C450&ssl=1 -[14]: https://www.facebook.com/sharer.php?t=Solus%204%20%E2%80%98Fortitude%E2%80%99%20Released%20with%20Significant%20Improvements&u=https%3A%2F%2Fitsfoss.com%2Fsolus-4-release%2F -[15]: https://twitter.com/intent/tweet?text=Solus+4+%E2%80%98Fortitude%E2%80%99+Released+with+Significant+Improvements&url=https%3A%2F%2Fitsfoss.com%2Fsolus-4-release%2F&via=itsfoss2 -[16]: https://www.linkedin.com/shareArticle?title=Solus%204%20%E2%80%98Fortitude%E2%80%99%20Released%20with%20Significant%20Improvements&url=https%3A%2F%2Fitsfoss.com%2Fsolus-4-release%2F&mini=true -[17]: https://www.reddit.com/submit?title=Solus%204%20%E2%80%98Fortitude%E2%80%99%20Released%20with%20Significant%20Improvements&url=https%3A%2F%2Fitsfoss.com%2Fsolus-4-release%2F diff --git a/sources/tech/20190319 Five Commands To Use Calculator In Linux Command Line.md b/sources/tech/20190319 Five Commands To Use Calculator In Linux Command Line.md deleted file mode 100644 index c419d15268..0000000000 --- a/sources/tech/20190319 Five Commands To Use Calculator In Linux Command Line.md +++ /dev/null @@ -1,342 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Five Commands To Use Calculator In Linux Command Line?) -[#]: via: (https://www.2daygeek.com/linux-command-line-calculator-bc-calc-qalc-gcalccmd/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -Five Commands To Use Calculator In Linux Command Line? -====== - -As a Linux administrator you may use the command line calculator many times in a day for some purpose. - -I had used this especially when LVM creation using the PE values. - -There are many commands available for this purpose and i’m going to list most used commands in this article. - -These command line calculators are allow us to perform all kind of actions such as scientific, financial, or even simple calculation. - -Also, we can use these commands in shell scripts for complex math. - -In this article, I’m listing the top five command line calculator commands. - -Those command line calculator commands are below. - - * **`bc:`** An arbitrary precision calculator language - * **`calc:`** arbitrary precision calculator - * **`expr:`** evaluate expressions - * **`gcalccmd:`** gnome-calculator – a desktop calculator - * **`qalc:`** - * **`Linux Shell:`** - - - -### How To Perform Calculation In Linux Using bc Command? - -bs stands for Basic Calculator. bc is a language that supports arbitrary precision numbers with interactive execution of statements. There are some similarities in the syntax to the C programming language. - -A standard math library is available by command line option. If requested, the math library is defined before processing any files. bc starts by processing code from all the files listed on the command line in the order listed. - -After all files have been processed, bc reads from the standard input. All code is executed as it is read. - -By default bc command has installed in all the Linux system. If not, use the following procedure to install it. - -For **`Fedora`** system, use **[DNF Command][1]** to install bc. - -``` -$ sudo dnf install bc -``` - -For **`Debian/Ubuntu`** systems, use **[APT-GET Command][2]** or **[APT Command][3]** to install bc. - -``` -$ sudo apt install bc -``` - -For **`Arch Linux`** based systems, use **[Pacman Command][4]** to install bc. - -``` -$ sudo pacman -S bc -``` - -For **`RHEL/CentOS`** systems, use **[YUM Command][5]** to install bc. - -``` -$ sudo yum install bc -``` - -For **`openSUSE Leap`** system, use **[Zypper Command][6]** to install bc. - -``` -$ sudo zypper install bc -``` - -### How To Use The bc Command To Perform Calculation In Linux? - -We can use the bc command to perform all kind of calculation right from the terminal. - -``` -$ bc -bc 1.07.1 -Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc. -This is free software with ABSOLUTELY NO WARRANTY. -For details type `warranty'. - -1+2 -3 - -10-5 -5 - -2*5 -10 - -10/2 -5 - -(2+4)*5-5 -25 - -quit -``` - -Use `-l` flag to define the standard math library. - -``` -$ bc -l -bc 1.07.1 -Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc. -This is free software with ABSOLUTELY NO WARRANTY. -For details type `warranty'. - -3/5 -.60000000000000000000 - -quit -``` - -### How To Perform Calculation In Linux Using calc Command? - -calc is an arbitrary precision calculator. It’s a simple calculator that allow us to perform all kind of calculation in Linux command line. - -For **`Fedora`** system, use **[DNF Command][1]** to install calc. - -``` -$ sudo dnf install calc -``` - -For **`Debian/Ubuntu`** systems, use **[APT-GET Command][2]** or **[APT Command][3]** to install calc. - -``` -$ sudo apt install calc -``` - -For **`Arch Linux`** based systems, use **[Pacman Command][4]** to install calc. - -``` -$ sudo pacman -S calc -``` - -For **`RHEL/CentOS`** systems, use **[YUM Command][5]** to install calc. - -``` -$ sudo yum install calc -``` - -For **`openSUSE Leap`** system, use **[Zypper Command][6]** to install calc. - -``` -$ sudo zypper install calc -``` - -### How To Use The calc Command To Perform Calculation In Linux? - -We can use the calc command to perform all kind of calculation right from the terminal. - -Intractive mode - -``` -$ calc -C-style arbitrary precision calculator (version 2.12.7.1) -Calc is open software. For license details type: help copyright -[Type "exit" to exit, or "help" for help.] - -; 5+1 - 6 -; 5-1 - 4 -; 5*2 - 10 -; 10/2 - 5 -; quit -``` - -Non-Intractive mode - -``` -$ calc 3/5 - 0.6 -``` - -### How To Perform Calculation In Linux Using expr Command? - -Print the value of EXPRESSION to standard output. A blank line below separates increasing precedence groups. It’s part of coreutils so, we no need to install it. - -### How To Use The expr Command To Perform Calculation In Linux? - -Use the following format for basic calculations. - -For addition - -``` -$ expr 5 + 1 -6 -``` - -For subtraction - -``` -$ expr 5 - 1 -4 -``` - -For division. - -``` -$ expr 10 / 2 -5 -``` - -### How To Perform Calculation In Linux Using gcalccmd Command? - -gnome-calculator is the official calculator of the GNOME desktop environment. gcalccmd is the console version of Gnome Calculator utility. By default it has installed in the GNOME desktop. - -### How To Use The gcalccmd Command To Perform Calculation In Linux? - -I have added few examples on this. - -``` -$ gcalccmd - -> 5+1 -6 - -> 5-1 -4 - -> 5*2 -10 - -> 10/2 -5 - -> sqrt(16) -4 - -> 3/5 -0.6 - -> quit -``` - -### How To Perform Calculation In Linux Using qalc Command? - -Qalculate is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). - -Features include a large library of customizable functions, unit calculations and conversion, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface (GTK+ and CLI). - -For **`Fedora`** system, use **[DNF Command][1]** to install qalc. - -``` -$ sudo dnf install libqalculate -``` - -For **`Debian/Ubuntu`** systems, use **[APT-GET Command][2]** or **[APT Command][3]** to install qalc. - -``` -$ sudo apt install libqalculate -``` - -For **`Arch Linux`** based systems, use **[Pacman Command][4]** to install qalc. - -``` -$ sudo pacman -S libqalculate -``` - -For **`RHEL/CentOS`** systems, use **[YUM Command][5]** to install qalc. - -``` -$ sudo yum install libqalculate -``` - -For **`openSUSE Leap`** system, use **[Zypper Command][6]** to install qalc. - -``` -$ sudo zypper install libqalculate -``` - -### How To Use The qalc Command To Perform Calculation In Linux? - -I have added few examples on this. - -``` -$ qalc -> 5+1 - - 5 + 1 = 6 - -> ans*2 - - ans * 2 = 12 - -> ans-2 - - ans - 2 = 10 - -> 1 USD to INR -It has been 36 day(s) since the exchange rates last were updated. -Do you wish to update the exchange rates now? y - - error: Failed to download exchange rates from coinbase.com: Resolving timed out after 15000 milliseconds. - 1 * dollar = approx. INR 69.638581 - -> 10 USD to INR - - 10 * dollar = approx. INR 696.38581 - -> quit -``` - -### How To Perform Calculation In Linux Using Linux Shell Command? - -We can use the shell commands such as echo, awk, etc to perform the calculation. - -For Addition using echo command. - -``` -$ echo $((5+5)) -10 -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/linux-command-line-calculator-bc-calc-qalc-gcalccmd/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/ -[2]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/ -[3]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/ -[4]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/ -[5]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/ -[6]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/ diff --git a/sources/tech/20190319 How To Set Up a Firewall with GUFW on Linux.md b/sources/tech/20190319 How To Set Up a Firewall with GUFW on Linux.md deleted file mode 100644 index 26b9850109..0000000000 --- a/sources/tech/20190319 How To Set Up a Firewall with GUFW on Linux.md +++ /dev/null @@ -1,365 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How To Set Up a Firewall with GUFW on Linux) -[#]: via: (https://itsfoss.com/set-up-firewall-gufw) -[#]: author: (Sergiu https://itsfoss.com/author/sergiu/) - -How To Set Up a Firewall with GUFW on Linux -====== - -**UFW (Uncomplicated Firewall)** is a simple to use firewall utility with plenty of options for most users. It is an interface for the **iptables** , which is the classic (and harder to get comfortable with) way to set up rules for your network. - -**Do you really need a firewall for desktop?** - -![][1] - -A **[firewall][2]** is a way to regulate the incoming and outgoing traffic on your network. A well-configured firewall is crucial for the security of servers. - -But what about normal, desktop users? Do you need a firewall on your Linux system? Most likely you are connected to internet via a router linked to your internet service provider (ISP). Some routers already have built-in firewall. On top of that, your actual system is hidden behind NAT. In other words, you probably have a security layer when you are on your home network. - -Now that you know you should be using a firewall on your system, let’s see how you can easily install and configure a firewall on Ubuntu or any other Linux distribution. - -### Setting Up A Firewall With GUFW - -**[GUFW][3]** is a graphical utility for managing [Uncomplicated Firewall][4] ( **UFW** ). In this guide, I’ll go over configuring a firewall using **GUFW** that suits your needs, going over the different modes and rules. - -But first, let’s see how to install GUFW. - -#### Installing GUFW on Ubuntu and other Linux - -GUFW is available in all major Linux distributions. I advise using your distribution’s package manager for installing GUFW. - -If you are using Ubuntu, make sure you have the Universe Repository enabled. To do that, open up a terminal (default hotkey**:** CTRL+ALT+T) and enter: - -``` -sudo add-apt-repository universe -sudo apt update -y -``` - -Now you can install GUFW with this command: - -``` -sudo apt install gufw -y -``` - -That’s it! If you prefer not touching the terminal, you can install it from the Software Center as well. - -Open Software Center and search for **gufw** and click on the search result. - -![Search for gufw in software center][5] - -Go ahead and click **Install**. - -![Install GUFW from the Software Center][6] - -To open **gufw** , go to your menu and search for it. - -![Start GUFW][7] - -This will open the firewall application and you’ll be greeted by a “ **Getting Started** ” section. - -![GUFW Interface and Welcome Screen][8] - -#### Turn on the firewall - -The first thing to notice about this menu is the **Status** toggle. Pressing this button will turn on/off the firewall ( **default:** off), applying your preferences (policies and rules). - -![Turn on the firewall][9] - -If turned on, the shield icon turn from grey to colored. The colors, as noted later in this article, reflect your policies. This will also make the firewall **automatically start** on system startup. - -**Note:** _**Home** will be turned **off** by default. The other profiles (see next section) will be turned **on.**_ - -#### Understanding GUFW and its profiles - -As you can see in the menu, you can select different **profiles**. Each profile comes with different **default policies**. What this means is that they offer different behaviors for incoming and outgoing traffic. - -The **default profiles** are: - - * Home - * Public - * Office - - - -You can select another profile by clicking on the current one ( **default: Home** ). - -![][10] - -Selecting one of them will modify the default behavior. Further down, you can change Incoming and Outgoing traffic preferences. - -By default, both in **Home** and in **Office** , these policies are **Deny Incoming** and **Allow Outgoing**. This enables you to use services such as http/https without letting anything get in ( **e.g.** ssh). - -For **Public** , they are **Reject Incoming** and **Allow Outgoing**. **Reject** , similar to **deny** , doesn’t let services in, but also sends feedback to the user/service that tried accessing your machine (instead of simply dropping/hanging the connection). - -Note - -If you are an average desktop user, you can stick with the default profiles. You’ll have to manually change the profiles if you change the network. - -So if you are travelling, set the firewall on public profile and the from here forwards, firewall will be set in public mode on each reboot. - -#### Configuring firewall rules and policies [for advanced users] - -All profiles use the same rules, only the policies the rules build upon will differ. Changing the behavior of a policy ( **Incoming/Outgoing** ) will apply the changes to the selected profile. - -Note that the policies can only be changed while the firewall is active (Status: ON). - -Profiles can easily be added, deleted and renamed from the **Preferences** menu. - -##### Preferences - -In the top bar, click on **Edit**. Select **Preferences**. - -![Open Preferences Menu in GUFW][11] - -This will open up the **Preferences** menu. - -![][12] - -Let’s go over the options you have here! - -**Logging** means exactly what you would think: how much information does the firewall write down in the log files. - -The options under **Gufw** are quite self-explanatory. - -In the section under **Profiles** is where we can add, delete and rename profiles. Double-clicking on a profile will allow you to **rename** it. Pressing **Enter** will complete this process and pressing **Esc** will cancel the rename. - -![][13] - -To **add** a new profile, click on the **+** under the list of profiles. This will add a new profile. However, it won’t notify you about it. You’ll also have to scroll down the list to see the profile you created (using the mouse wheel or the scroll bar on the right side of the list). - -**Note:** _The newly added profile will **Deny Incoming** and **Allow Outgoing** traffic._ - -![][14] - -Clicking a profile highlight that profile. Pressing the **–** button will **delete** the highlighted profile. - -![][15] - -**Note:** _You can’t rename/remove the currently selected profile_. - -You can now click on **Close**. Next, I’ll go into setting up different **rules**. - -##### Rules - -Back to the main menu, somewhere in the middle of the screen you can select different tabs ( **Home, Rules, Report, Logs)**. We already covered the **Home** tab (that’s the quick guide you see when you start the app). - -![][16] - -Go ahead and select **Rules**. - -![][17] - -This will be the bulk of your firewall configuration: networking rules. You need to understand the concepts UFW is based on. That is **allowing, denying, rejecting** and **limiting** traffic. - -**Note:** _In UFW, the rules apply from top to bottom (the top rules take effect first and on top of them are added the following ones)._ - -**Allow, Deny, Reject, Limit:**These are the available policies for the rules you’ll add to your firewall. - -Let’s see exactly what each of them means: - - * **Allow:** allows any entry traffic to a port - * **Deny:** denies any entry traffic to a port - * **Reject:** denies any entry traffic to a port and informs the requester about the rejection - * **Limit:** denies entry traffic if an IP address has attempted to initiate 6 or more connections in the last 30 seconds - - - -##### Adding Rules - -There are three ways to add rules in GUFW. I’ll present all three methods in the following section. - -**Note:** _After you added the rules, changing their order is a very tricky process and it’s easier to just delete them and add them in the right order._ - -But first, click on the **+** at the bottom of the **Rules** tab. - -![][18] - -This should open a pop-up menu ( **Add a Firewall Rule** ). - -![][19] - -At the top of this menu, you can see the three ways you can add rules. I’ll guide you through each method i.e. **Preconfigured, Simple, Advanced**. Click to expand each section. - -**Preconfigured Rules** - -This is the most beginner-friendly way to add rules. - -The first step is choosing a policy for the rule (from the ones detailed above). - -![][20] - -The next step is to choose the direction the rule will affect ( **Incoming, Outgoing, Both** ). - -![][21] - -The **Category** and **Subcategory** choices are plenty. These narrow down the **Applications** you can select - -Choosing an **Application** will set up a set of ports based on what is needed for that particular application. This is especially useful for apps that might operate on multiple ports, or if you don’t want to bother with manually creating rules for handwritten port numbers. - -If you wish to further customize the rule, you can click on the **orange arrow icon**. This will copy the current settings (Application with it’s ports etc.) and take you to the **Advanced** rule menu. I’ll cover that later in this article. - -For this example, I picked an **Office Database** app: **MySQL**. I’ll deny all incoming traffic to the ports used by this app. -To create the rule, click on **Add**. - -![][22] - -You can now **Close** the pop-up (if you don’t want to add any other rules). You can see that the rule has been successfully added. - -![][23] - -The ports have been added by GUFW, and the rules have been automatically numbered. You may wonder why are there two new rules instead of just one; the answer is that UFW automatically adds both a standard **IP** rule and an **IPv6** rule. - -**Simple Rules** - -Although setting up preconfigured rules is nice, there is another easy way to add a rule. Click on the **+** icon again and go to the **Simple** tab. - -![][24] - -The options here are straight forward. Enter a name for your rule and select the policy and the direction. I’ll add a rule for rejecting incoming SSH attempts. - -![][25] - -The **Protocols** you can choose are **TCP, UDP** or **Both**. - -You must now enter the **Port** for which you want to manage the traffic. You can enter a **port number** (e.g. 22 for ssh), a **port range** with inclusive ends separated by a **:** ( **colon** ) (e.g. 81:89) or a **service name** (e.g. ssh). I’ll use **ssh** and select **both TCP and UDP** for this example. As before, click on **Add** to completing the creation of your rule. You can click the **red arrow icon** to copy the settings to the **Advanced** rule creation menu. - -![][26] - -If you select **Close** , you can see that the new rule (along with the corresponding IPv6 rule) has been added. - -![][27] - -**Advanced Rules** - -I’ll now go into how to set up more advanced rules, to handle traffic from specific IP addresses and subnets and targeting different interfaces. - -Let’s open up the **Rules** menu again. Select the **Advanced** tab. - -![][28] - -By now, you should already be familiar with the basic options: **Name, Policy, Direction, Protocol, Port**. These are the same as before. - -![][29] - -**Note:** _You can choose both a receiving port and a requesting port._ - -What changes is that now you have additional options to further specialize our rules. - -I mentioned before that rules are automatically numbered by GUFW. With **Advanced** rules you specify the position of your rule by entering a number in the **Insert** option. - -**Note:** _Inputting **position 0** will add your rule after all existing rules._ - -**Interface** let’s you select any network interface available on your machine. By doing so, the rule will only have effect on traffic to and from that specific interface. - -**Log** changes exactly that: what will and what won’t be logged. - -You can also choose IPs for the requesting and for the receiving port/service ( **From** , **To** ). - -All you have to do is specify an **IP address** (e.g. 192.168.0.102) or an entire **subnet** (e.g. 192.168.0.0/24 for IPv4 addresses ranging from 192.168.0.0 to 192.168.0.255). - -In my example, I’ll set up a rule to allow all incoming TCP SSH requests from systems on my subnet to a specific network interface of the machine I’m currently running. I’ll add the rule after all my standard IP rules, so that it takes effect on top of the other rules I have set up. - -![][30] - -**Close** the menu. - -![][31] - -The rule has been successfully added after the other standard IP rules. - -##### Edit Rules - -Clicking a rule in the rules list will highlight it. Now, if you click on the **little cog icon** at the bottom, you can **edit** the highlighted rule. - -![][32] - -This will open up a menu looking something like the **Advanced** menu I explained in the last section. - -![][33] - -**Note:** _Editing any options of a rule will move it to the end of your list._ - -You can now ether select on **Apply** to modify your rule and move it to the end of the list, or hit **Cancel**. - -##### Delete Rules - -After selecting (highlighting) a rule, you can also click on the **–** icon. - -![][34] - -##### Reports - -Select the **Report** tab. Here you can see services that are currently running (along with information about them, such as Protocol, Port, Address and Application name). From here, you can **Pause Listening Report (Pause Icon)** or **Create a rule from a highlighted service from the listening report (+ Icon)**. - -![][35] - -##### Logs - -Select the **Logs** tab. Here is where you’ll have to check for any errors are suspicious rules. I’ve tried creating some invalid rules to show you what these might look like when you don’t know why you can’t add a certain rule. In the bottom section, there are two icons. Clicking the **first icon copies the logs** to your clipboard and clicking the **second icon** **clears the log**. - -![][36] - -### Wrapping Up - -Having a firewall that is properly configured can greatly contribute to your Ubuntu experience, making your machine safer to use and allowing you to have full control over incoming and outgoing traffic. - -I have covered the different uses and modes of **GUFW** , going into how to set up different rules and configure a firewall to your needs. I hope that this guide has been helpful to you. - -If you are a beginner, this should prove to be a comprehensive guide; even if you are more versed in the Linux world and maybe getting your feet wet into servers and networking, I hope you learned something new. - -Let us know in the comments if this article helped you and why did you decide a firewall would improve your system! - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/set-up-firewall-gufw - -作者:[Sergiu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/sergiu/ -[b]: https://github.com/lujun9972 -[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/firewall-linux.png?resize=800%2C450&ssl=1 -[2]: https://en.wikipedia.org/wiki/Firewall_(computing) -[3]: http://gufw.org/ -[4]: https://en.wikipedia.org/wiki/Uncomplicated_Firewall -[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/ubuntu_software_gufw-1.jpg?ssl=1 -[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/ubuntu_software_install_gufw.jpg?ssl=1 -[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/show_applications_gufw.jpg?ssl=1 -[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw.jpg?ssl=1 -[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_toggle_status.jpg?ssl=1 -[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_select_profile-1.jpg?ssl=1 -[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_open_preferences.jpg?ssl=1 -[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preferences.png?fit=800%2C585&ssl=1 -[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_rename_profile.png?fit=800%2C551&ssl=1 -[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_profile.png?ssl=1 -[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_delete_profile.png?ssl=1 -[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_home_tab.png?ssl=1 -[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_rules_tab.png?ssl=1 -[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_rule.png?ssl=1 -[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_rules_menu.png?ssl=1 -[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preconfigured_rule_policy.png?ssl=1 -[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preconfigured_rule_direction.png?ssl=1 -[22]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preconfigured_add_rule.png?ssl=1 -[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preconfigured_rule_added.png?ssl=1 -[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_simple_rules_menu.png?ssl=1 -[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_simple_rule_name_policy_direction.png?ssl=1 -[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_simple_rule.png?ssl=1 -[27]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_simple_rule_added.png?ssl=1 -[28]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_advanced_rules_menu.png?ssl=1 -[29]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_advanced_rule_basic_options.png?ssl=1 -[30]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_advanced_rule.png?ssl=1 -[31]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_advanced_rule_added.png?ssl=1 -[32]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_edit_highlighted_rule.png?ssl=1 -[33]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_edit_rule_menu.png?ssl=1 -[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_delete_rule.png?ssl=1 -[35]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_report_tab.png?ssl=1 -[36]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_log_tab-1.png?ssl=1 -[37]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/firewall-linux.png?fit=800%2C450&ssl=1 diff --git a/sources/tech/20190319 How to set up a homelab from hardware to firewall.md b/sources/tech/20190319 How to set up a homelab from hardware to firewall.md deleted file mode 100644 index d8bb34395b..0000000000 --- a/sources/tech/20190319 How to set up a homelab from hardware to firewall.md +++ /dev/null @@ -1,107 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to set up a homelab from hardware to firewall) -[#]: via: (https://opensource.com/article/19/3/home-lab) -[#]: author: (Michael Zamot https://opensource.com/users/mzamot) - -How to set up a homelab from hardware to firewall -====== - -Take a look at hardware and software options for building your own homelab. - -![][1] - -Do you want to create a homelab? Maybe you want to experiment with different technologies, create development environments, or have your own private cloud. There are many reasons to have a homelab, and this guide aims to make it easier to get started. - -There are three categories to consider when planning a home lab: hardware, software, and maintenance. We'll look at the first two categories here and save maintaining your computer lab for a future article. - -### Hardware - -When thinking about your hardware needs, first consider how you plan to use your lab as well as your budget, noise, space, and power usage. - -If buying new hardware is too expensive, search local universities, ads, and websites like eBay or Craigslist for recycled servers. They are usually inexpensive, and server-grade hardware is built to last many years. You'll need three types of hardware: a virtualization server, storage, and a router/firewall. - -#### Virtualization servers - -A virtualization server allows you to run several virtual machines that share the physical box's resources while maximizing and isolating resources. If you break one virtual machine, you won't have to rebuild the entire server, just the virtual one. If you want to do a test or try something without the risk of breaking your entire system, just spin up a new virtual machine and you're ready to go. - -The two most important factors to consider in a virtualization server are the number and speed of its CPU cores and its memory. If there are not enough resources to share among all the virtual machines, they'll be overallocated and try to steal each other's CPU cycles and memory. - -So, consider a CPU platform with multiple cores. You want to ensure the CPU supports virtualization instructions (VT-x for Intel and AMD-V for AMD). Examples of good consumer-grade processors that can handle virtualization are Intel i5 or i7 and AMD Ryzen. If you are considering server-grade hardware, the Xeon class for Intel and EPYC for AMD are good options. Memory can be expensive, especially the latest DDR4 SDRAM. When estimating memory requirements, factor at least 2GB for the host operating system's memory consumption. - -If your electricity bill or noise is a concern, solutions like Intel's NUC devices provide a small form factor, low power usage, and reduced noise, but at the expense of expandability. - -#### Network-attached storage (NAS) - -If you want a machine loaded with hard drives to store all your personal data, movies, pictures, etc. and provide storage for the virtualization server, network-attached storage (NAS) is what you want. - -In most cases, you won't need a powerful CPU; in fact, many commercial NAS solutions use low-powered ARM CPUs. A motherboard that supports multiple SATA disks is a must. If your motherboard doesn't have enough ports, use a host bus adapter (HBA) SAS controller to add extras. - -Network performance is critical for a NAS, so select a gigabit network interface (or better). - -Memory requirements will differ based on your filesystem. ZFS is one of the most popular filesystems for NAS, and you'll need more memory to use features such as caching or deduplication. Error-correcting code (ECC) memory is your best bet to protect data from corruption (but make sure your motherboard supports it before you buy). Last, but not least, don't forget an uninterruptible power supply (UPS), because losing power can cause data corruption. - -#### Firewall and router - -Have you ever realized that a cheap router/firewall is usually the main thing protecting your home network from the exterior world? These routers rarely receive timely security updates, if they receive any at all. Scared now? Well, [you should be][2]! - -You usually don't need a powerful CPU or a great deal of memory to build your own router/firewall, unless you are handling a huge throughput or want to do CPU-intensive tasks, like a VPN server or traffic filtering. In such cases, you'll need a multicore CPU with AES-NI support. - -You may want to get at least two 1-gigabit or better Ethernet network interface cards (NICs), also, not needed, but recommended, a managed switch to connect your DIY-router to create VLANs to further isolate and secure your network. - -![Home computer lab PfSense][4] - -### Software - -After you've selected your virtualization server, NAS, and firewall/router, the next step is exploring the different operating systems and software to maximize their benefits. While you could use a regular Linux distribution like CentOS, Debian, or Ubuntu, they usually take more time to configure and administer than the following options. - -#### Virtualization software - -**[KVM][5]** (Kernel-based Virtual Machine) lets you turn Linux into a hypervisor so you can run multiple virtual machines in the same box. The best thing is that KVM is part of Linux, and it is the go-to option for many enterprises and home users. If you are comfortable, you can install **[libvirt][6]** and **[virt-manager][7]** to manage your virtualization platform. - -**[Proxmox VE][8]** is a robust, enterprise-grade solution and a full open source virtualization and container platform. It is based on Debian and uses KVM as its hypervisor and LXC for containers. Proxmox offers a powerful web interface, an API, and can scale out to many clustered nodes, which is helpful because you'll never know when you'll run out of capacity in your lab. - -**[oVirt][9] (RHV)** is another enterprise-grade solution that uses KVM as the hypervisor. Just because it's enterprise doesn't mean you can't use it at home. oVirt offers a powerful web interface and an API and can handle hundreds of nodes (if you are running that many servers, I don't want to be your neighbor!). The potential problem with oVirt for a home lab is that it requires a minimum set of nodes: You'll need one external storage, such as a NAS, and at least two additional virtualization nodes (you can run it just on one, but you'll run into problems in maintenance of your environment). - -#### NAS software - -**[FreeNAS][10]** is the most popular open source NAS distribution, and it's based on the rock-solid FreeBSD operating system. One of its most robust features is its use of the ZFS filesystem, which provides data-integrity checking, snapshots, replication, and multiple levels of redundancy (mirroring, striped mirrors, and striping). On top of that, everything is managed from the powerful and easy-to-use web interface. Before installing FreeNAS, check its hardware support, as it is not as wide as Linux-based distributions. - -Another popular alternative is the Linux-based **[OpenMediaVault][11]**. One of its main features is its modularity, with plugins that extend and add features. Among its included features are a web-based administration interface; protocols like CIFS, SFTP, NFS, iSCSI; and volume management, including software RAID, quotas, access control lists (ACLs), and share management. Because it is Linux-based, it has extensive hardware support. - -#### Firewall/router software - -**[pfSense][12]** is an open source, enterprise-grade FreeBSD-based router and firewall distribution. It can be installed directly on a server or even inside a virtual machine (to manage your virtual or physical networks and save space). It has many features and can be expanded using packages. It is managed entirely using the web interface, although it also has command-line access. It has all the features you would expect from a router and firewall, like DHCP and DNS, as well as more advanced features, such as intrusion detection (IDS) and intrusion prevention (IPS) systems. You can create multiple networks listening on different interfaces or using VLANs, and you can create a secure VPN server with a few clicks. pfSense uses pf, a stateful packet filter that was developed for the OpenBSD operating system using a syntax similar to IPFilter. Many companies and organizations use pfSense. - -* * * - -With all this information in mind, it's time for you to get your hands dirty and start building your lab. In a future article, I will get into the third category of running a home lab: using automation to deploy and maintain it. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/home-lab - -作者:[Michael Zamot (Red Hat)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mzamot -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb -[2]: https://opensource.com/article/18/5/how-insecure-your-router -[3]: /file/427426 -[4]: https://opensource.com/sites/default/files/uploads/pfsense2.png (Home computer lab PfSense) -[5]: https://www.linux-kvm.org/page/Main_Page -[6]: https://libvirt.org/ -[7]: https://virt-manager.org/ -[8]: https://www.proxmox.com/en/proxmox-ve -[9]: https://ovirt.org/ -[10]: https://freenas.org/ -[11]: https://www.openmediavault.org/ -[12]: https://www.pfsense.org/ diff --git a/sources/tech/20190320 Choosing an open messenger client- Alternatives to WhatsApp.md b/sources/tech/20190320 Choosing an open messenger client- Alternatives to WhatsApp.md deleted file mode 100644 index 5f940e9b0b..0000000000 --- a/sources/tech/20190320 Choosing an open messenger client- Alternatives to WhatsApp.md +++ /dev/null @@ -1,97 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Choosing an open messenger client: Alternatives to WhatsApp) -[#]: via: (https://opensource.com/article/19/3/open-messenger-client) -[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) - -Choosing an open messenger client: Alternatives to WhatsApp -====== - -Keep in touch with far-flung family, friends, and colleagues without sacrificing your privacy. - -![Team communication, chat][1] - -Like many families, mine is inconveniently spread around, and I have many colleagues in North and South America. So, over the years, I've relied more and more on WhatsApp to stay in touch with people. The claimed end-to-end encryption appeals to me, as I prefer to maintain some shreds of privacy, and moreover to avoid forcing those with whom I communicate to use an insecure mechanism. But all this [WhatsApp/Facebook/Instagram "convergence"][2] has led our family to decide to vote with our feet. We no longer use WhatsApp for anything except communicating with others who refuse to use anything else, and we're working on them. - -So what do we use instead? Before I spill the beans, I'd like to explain what other options we looked at and how we chose. - -### Options we considered and how we evaluated them - -There is an absolutely [crazy number of messaging apps out there][3], and we spent a good deal of time thinking about what we needed for a replacement. We started by reading Dan Arel's article on [five social media alternatives to protect privacy][4]. - -Then we came up with our list of core needs: - - * Our entire family uses Android phones. - * One of us has a Windows desktop; the rest use Linux. - * Our main interest is something we can use to chat, both individually and as a group, on our phones, but it would be nice to have a desktop client available. - * It would also be nice to have voice and video calling as well. - * Our privacy is important. Ideally, the code should be open source to facilitate security reviews. If the operation is not pure peer-to-peer, then the organization operating the server components should not operate a business based on the commercialization of our personal information. - - - -At that point, we narrowed the long list down to [Viber][5], [Line][6], [Signal][7], [Threema][8], [Wire][9], and [Riot.im][10]. While I lean strongly to open source, we wanted to include some closed source and paid solutions to make sure we weren't missing something important. Here's how those six alternatives measured up. - -### Line - -[Line][11] is a popular messaging application, and it's part of a larger Line "ecosystem"—online gaming, Taxi (an Uber-like service in Japan), Wow (a food delivery service), Today (a news hub), shopping, and others. For us, Line checks a few too many boxes with all those add-on features. Also, I could not determine its current security quality, and it's not open source. The business model seems to be to build a community and figure out how to make money through that community. - -### Riot.im - -[Riot.im][12] operates on top of the Matrix protocol and therefore lets the user choose a Matrix provider. It also appears to check all of our "needs" boxes, although in operation it looks more like Slack, with a room-oriented and interoperable/federated design. It offers desktop clients, and it's open source. Since the Matrix protocol can be hosted anywhere, any business model would be particular to the Matrix provider. - -### Signal - -[Signal][13] offers a similar user experience to WhatsApp. It checks all of our "needs" boxes, with solid security validated by external audit. It is open source, and it is developed and operated by a not-for-profit foundation, in principle similar to the Mozilla Foundation. Interestingly, Signal's communications protocol appears to be used by other messaging apps, [including WhatsApp][14]. - -### Threema - -[Threema][15] is extremely privacy-focused. It checks some of our "needs" boxes, with decent external audit results of its security. It doesn't offer a desktop client, and it [isn't fully open source][16] though some of its core components are. Threema's business model appears to be to offer paid secure communications. - -### Viber - -[Viber][17] is a very popular messaging application. It checks most of our "needs" boxes; however, it doesn't seem to have solid proof of its security—it seems to use a proprietary encryption mechanism, and as far as I could determine, its current security mechanisms are not externally audited. It's not open source. The owner, Rakuten, seems to be planning for a paid subscription as a business model. - -### Wire - -[Wire][18] was started and is built by some ex-Skype people. It appears to check all of our "needs" boxes, although I am not completely comfortable with its security profile since it stores client data that apparently is not encrypted on its servers. It offers desktop clients and is open source. The developer and operator, Wire Swiss, appears to have a [pay-for-service track][9] as its future business model. - -### The final verdict - -In the end, we picked Signal. We liked its open-by-design approach, its serious and ongoing [privacy and security stance][7] and having a Signal app on our GNOME (and Windows) desktops. It performs very well on our Android handsets and our desktops. Moreover, it wasn't a big surprise to our small user community; it feels much more like WhatsApp than, for example, Riot.im, which we also tried extensively. Having said that, if we were trying to replace Slack, we'd probably move to Riot.im. - -_Have a favorite messenger? Tell us about it in the comments below._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/open-messenger-client - -作者:[Chris Hermansen (Community Moderator)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/clhermansen -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_team_mobile_desktop.png?itok=d7sRtKfQ (Team communication, chat) -[2]: https://www.cnbc.com/2018/03/28/facebook-new-privacy-settings-dont-address-instagram-whatsapp.html -[3]: https://en.wikipedia.org/wiki/Comparison_of_instant_messaging_clients -[4]: https://opensource.com/article/19/1/open-source-social-media-alternatives -[5]: https://en.wikipedia.org/wiki/Viber -[6]: https://en.wikipedia.org/wiki/Line_(software) -[7]: https://en.wikipedia.org/wiki/Signal_(software) -[8]: https://en.wikipedia.org/wiki/Threema -[9]: https://en.wikipedia.org/wiki/Wire_(software) -[10]: https://en.wikipedia.org/wiki/Riot.im -[11]: https://line.me/en/ -[12]: https://about.riot.im/ -[13]: https://signal.org/ -[14]: https://en.wikipedia.org/wiki/Signal_Protocol -[15]: https://threema.ch/en -[16]: https://threema.ch/en/faq/source_code -[17]: https://www.viber.com/ -[18]: https://wire.com/en/ diff --git a/sources/tech/20190320 Getting started with Jaeger to build an Istio service mesh.md b/sources/tech/20190320 Getting started with Jaeger to build an Istio service mesh.md deleted file mode 100644 index c4200355e4..0000000000 --- a/sources/tech/20190320 Getting started with Jaeger to build an Istio service mesh.md +++ /dev/null @@ -1,157 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Getting started with Jaeger to build an Istio service mesh) -[#]: via: (https://opensource.com/article/19/3/getting-started-jaeger) -[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) - -Getting started with Jaeger to build an Istio service mesh -====== - -Improve monitoring and tracing of cloud-native apps on a distributed networking system. - -![Mesh networking connected dots][1] - -[Service mesh][2] provides a dedicated network for service-to-service communication in a transparent way. [Istio][3] aims to help developers and operators address service mesh features such as dynamic service discovery, mutual transport layer security (TLS), circuit breakers, rate limiting, and tracing. [Jaeger][4] with Istio augments monitoring and tracing of cloud-native apps on a distributed networking system. This article explains how to get started with Jaeger to build an Istio service mesh on the Kubernetes platform. - -### Spinning up a Kubernetes cluster - -[Minikube][5] allows you to run a single-node Kubernetes cluster based on a virtual machine such as [KVM][6], [VirtualBox][7], or [HyperKit][8] on your local machine. [Install Minikube][9] and use the following shell script to run it: - -``` -#!/bin/bash - -export MINIKUBE_PROFILE_NAME=istio-jaeger -minikube profile $MINIKUBE_PROFILE_NAME -minikube config set cpus 3 -minikube config set memory 8192 - -# You need to replace appropriate VM driver on your local machine -minikube config set vm-driver hyperkit - -minikube start -``` - -In the above script, replace the **\--vm-driver=xxx** option with the appropriate virtual machine driver on your operating system (OS). - -### Deploying Istio service mesh with Jaeger - -Download the Istio installation file for your OS from the [Istio release page][10]. In the Istio package directory, you will find the Kubernetes installation YAML files in **install/** and the sample applications in **sample/**. Use the following commands: - -``` -$ curl -L | sh - -$ cd istio-1.0.5 -$ export PATH=$PWD/bin:$PATH -``` - -The easiest way to deploy Istio with Jaeger on your Kubernetes cluster is to use [Custom Resource Definitions][11]. Install Istio with mutual TLS authentication between sidecars with these commands: - -``` -$ kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml -$ kubectl apply -f install/kubernetes/istio-demo-auth.yaml -``` - -Check if all pods of Istio on your Kubernetes cluster are deployed and running correctly by using the following command and review the output: - -``` -$ kubectl get pods -n istio-system -NAME READY STATUS RESTARTS AGE -grafana-59b8896965-p2vgs 1/1 Running 0 3h -istio-citadel-856f994c58-tk8kq 1/1 Running 0 3h -istio-cleanup-secrets-mq54t 0/1 Completed 0 3h -istio-egressgateway-5649fcf57-n5ql5 1/1 Running 0 3h -istio-galley-7665f65c9c-wx8k7 1/1 Running 0 3h -istio-grafana-post-install-nh5rw 0/1 Completed 0 3h -istio-ingressgateway-6755b9bbf6-4lf8m 1/1 Running 0 3h -istio-pilot-698959c67b-d2zgm 2/2 Running 0 3h -istio-policy-6fcb6d655f-lfkm5 2/2 Running 0 3h -istio-security-post-install-st5xc 0/1 Completed 0 3h -istio-sidecar-injector-768c79f7bf-9rjgm 1/1 Running 0 3h -istio-telemetry-664d896cf5-wwcfw 2/2 Running 0 3h -istio-tracing-6b994895fd-h6s9h 1/1 Running 0 3h -prometheus-76b7745b64-hzm27 1/1 Running 0 3h -servicegraph-5c4485945b-mk22d 1/1 Running 1 3h -``` - -### Building sample microservice apps - -You can use the [Bookinfo][12] app to learn about Istio's features. Bookinfo consists of four microservice apps: _productpage_ , _details_ , _reviews_ , and _ratings_ deployed independently on Minikube. Each microservice will be deployed with an Envoy sidecar via Istio by using the following commands: - -``` -// Enable sidecar injection automatically -$ kubectl label namespace default istio-injection=enabled -$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml - -// Export the ingress IP, ports, and gateway URL -$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml - -$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') -$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') -$ export INGRESS_HOST=$(minikube ip) - -$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT -``` - -### Accessing the Jaeger dashboard - -To view tracing information for each HTTP request, create some traffic by running the following commands at the command line: -``` - -``` - -$ while true; do - curl -s http://${GATEWAY_URL}/productpage > /dev/null - echo -n .; - sleep 0.2 -done - -You can access the Jaeger dashboard through a web browser with [http://localhost:16686][13] if you set up port forwarding as follows: - -``` -kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686 & -``` - -You can explore all traces by clicking "Find Traces" after selecting the _productpage_ service. Your dashboard will look similar to this: - -![Find traces in Jaeger][14] - -You can also view more details about each trace to dig into performance issues or elapsed time by clicking on a certain trace. - -![Viewing details about a trace][15] - -### Conclusion - -A distributed tracing platform allows you to understand what happened from service to service for individual ingress/egress traffic. Istio sends individual trace information automatically to Jaeger, the distributed tracing platform, even if your modern applications aren't aware of Jaeger at all. In the end, this capability helps developers and operators do troubleshooting easier and quicker at scale. - -* * * - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/getting-started-jaeger - -作者:[Daniel Oh (Red Hat)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/mesh_networking_dots_connected.png?itok=ovINTRR3 (Mesh networking connected dots) -[2]: https://blog.buoyant.io/2017/04/25/whats-a-service-mesh-and-why-do-i-need-one/ -[3]: https://istio.io/docs/concepts/what-is-istio/ -[4]: https://www.jaegertracing.io/docs/1.9/ -[5]: https://opensource.com/article/18/10/getting-started-minikube -[6]: https://www.linux-kvm.org/page/Main_Page -[7]: https://www.virtualbox.org/wiki/Downloads -[8]: https://github.com/moby/hyperkit -[9]: https://kubernetes.io/docs/tasks/tools/install-minikube/ -[10]: https://github.com/istio/istio/releases -[11]: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions -[12]: https://github.com/istio/istio/tree/master/samples/bookinfo -[13]: http://localhost:16686/ -[14]: https://opensource.com/sites/default/files/uploads/traces_productpages.png (Find traces in Jaeger) -[15]: https://opensource.com/sites/default/files/uploads/traces_performance.png (Viewing details about a trace) diff --git a/sources/tech/20190320 Nuvola- Desktop Music Player for Streaming Services.md b/sources/tech/20190320 Nuvola- Desktop Music Player for Streaming Services.md deleted file mode 100644 index ba0d8d550d..0000000000 --- a/sources/tech/20190320 Nuvola- Desktop Music Player for Streaming Services.md +++ /dev/null @@ -1,186 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Nuvola: Desktop Music Player for Streaming Services) -[#]: via: (https://itsfoss.com/nuvola-music-player) -[#]: author: (Atharva Lele https://itsfoss.com/author/atharva/) - -Nuvola: Desktop Music Player for Streaming Services -====== - -[Nuvola][1] is not like your usual music players. It’s different because it allows you to play a number of streaming services in a desktop music player. - -Nuvola provides a runtime called [Nuvola Apps Runtime][2] which runs web apps. This is why Nuvola can support a host of streaming services. Some of the major players it supports are: - - * Spotify - * Google Play Music - * YouTube, YouTube Music - * [Pandora][3] - * [SoundCloud][4] - * and many many more. - - - -You can find the full list [here][1] in the Music streaming services section. Apple Music is not supported, if you were wondering. - -Why would you use a streaming music service in a different desktop player when you can run it in a web browser? The advantage with Nuvola is that it provides tight integration with many [desktop environments][5]. - -Ideally it should work with all DEs, but the officially supported ones are GNOME, Unity, and Pantheon (elementary OS). - -### Features of Nuvola Music Player - -Let’s see some of the main features of the open source project Nuvola: - - * Supports a wide variety of music streaming services - * Desktop integration with GNOME, Unity, and Pantheon. - * Keyboard shortcuts with the ability to customize them - * Support for keyboard’s multimedia keys (paid feature) - * Background play with notifications - * [GNOME Media Player][6] extension support - * App Tray indicator - * Dark and Light themes - * Enable or disable features - * Password Manager for web services - * Remote control over internet (paid feature) - * Available for a lot of distros ([Flatpak][7] packages) - - - -Complete list of features is available [here][8]. - -### How to install Nuvola on Ubuntu & other Linux distributions - -Installing Nuvola consists of a few more steps than simply adding a PPA and then installing the software. Since it is based on [Flatpak][7], you have to set up Flatpak first and then you can install Nuvola. - -[Enable Flatpak Support][9] - -The steps are pretty simple. You can follow the guide [here][10] if you want to install using the GUI, however I prefer terminal commands since they’re easier and faster. - -**Warning: If already installed, remove the older version of Nuvola (Click to expand)** - -If you have ever installed Nuvola before, you need to uninstall it to avoid issues. Run these commands in the terminal to do so. - -``` -sudo apt remove nuvolaplayer* -``` - -``` -rm -rf ~/.cache/nuvolaplayer3 ~/.local/share/nuvolaplayer ~/.config/nuvolaplayer3 ~/.local/share/applications/nuvolaplayer3* -``` - -Once you have made sure that your system has Flatpak, you can install Nuvola using this command: - -``` -flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo -flatpak remote-add --if-not-exists nuvola https://dl.tiliado.eu/flatpak/nuvola.flatpakrepo -``` - -This is an optional step but I recommend you install this since the service allows you to commonly configure settings like shortcuts for each of the streaming service that you might use. - -``` -flatpak install nuvola eu.tiliado.Nuvola -``` - -Nuvola supports 29 streaming services. To get them, you need to add those services individually. You can find all the supported music services are available on this [page][10]. - -For the purpose of this tutorial, I’m going to go with [YouTube Music][11]. - -``` -flatpak install nuvola eu.tiliado.NuvolaAppYoutubeMusic -``` - -After this, you should have the app installed and should be able to see the icon if you search for it. - -![Nuvola App specific icons][12] - -Clicking on the icon will pop-up the first time setup. You’ll have to accept the Privacy Policy and then continue. - -![Terms and Conditions page][13] - -After accepting terms and conditions, you should launch into the web app of the respective streaming service, YouTube Music in this case. - -![YouTube Music web app running on Nuvola Runtime][14] - -In case of installation on other distributions, specific guidelines are available on the [Nuvola website][15]. - -### My experience with Nuvola Music Player - -Initially I thought that it wouldn’t be too different than simply running the web app in [Firefox][16], since many desktop environments like KDE support media controls and shortcuts for media playing in Firefox. - -However, this isn’t the case with many other desktops environments and that’s where Nuvola comes in handy. Often, it’s also faster to access than loading the website on the browser. - -Once loaded, it behaves pretty much like a normal web app with the benefit of keyboard shortcuts. Speaking of shortcuts, you should check out the list of must know [Ubuntu shortcuts][17]. - -![Viewing an Artist’s page][18] - -Integration with the DE comes in handy when you quickly want to change a song or play/pause your music without leaving your current application. Nuvola gives you access in GNOME notifications as well as provides an app tray icon. - - * ![Notification music controls][19] - - * ![App tray music controls][20] - - - - -Keyboard shortcuts work well, globally as well as in-app. You get a notification when the song changes. Whether you do it yourself or it automatically switches to the next song. - -![][21] - -By default, very few keyboard shortcuts are provided. However you can enable them for almost everything you can do with the app. For example I set the song change shortcuts to Ctrl + Arrow keys as you can see in the screenshot. - -![Keyboard Shortcuts][22] - -All in all, it works pretty well and it’s fast and responsive. Definitely more so than your usual Snap app. - -**Some criticism** - -Some thing that did not please me as much was the installation size. Since it requires a browser back-end and GNOME integration it essentially installs a browser and necessary GNOME libraries for Flatpak, so that results in having to install almost 350MB in dependencies. - -After that, you install individual apps. The individual apps themselves are not heavy at all. But if you just use one streaming service, having a 300+ MB installation might not be ideal if you’re concerned about disk space. - -Nuvola also does not support local music, at least as far as I could find. - -**Conclusion** - -Hope this article helped you to know more about Nuvola Music Player and its features. If you like such different applications, why not take a look at some of the [lesser known music players for Linux][23]? - -As always, if you have any suggestions or questions, I look forward to reading your comments. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/nuvola-music-player - -作者:[Atharva Lele][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/atharva/ -[b]: https://github.com/lujun9972 -[1]: https://nuvola.tiliado.eu/ -[2]: https://nuvola.tiliado.eu/#fn:1 -[3]: https://itsfoss.com/install-pandora-linux-client/ -[4]: https://itsfoss.com/install-soundcloud-linux/ -[5]: https://itsfoss.com/best-linux-desktop-environments/ -[6]: https://extensions.gnome.org/extension/55/media-player-indicator/ -[7]: https://flatpak.org/ -[8]: http://tiliado.github.io/nuvolaplayer/documentation/4/explore.html -[9]: https://itsfoss.com/flatpak-guide/ -[10]: https://nuvola.tiliado.eu/nuvola/ubuntu/bionic/ -[11]: https://nuvola.tiliado.eu/app/youtube_music/ubuntu/bionic/ -[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_youtube_music_icon.png?resize=800%2C450&ssl=1 -[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_eula.png?resize=800%2C450&ssl=1 -[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_youtube_music.png?resize=800%2C450&ssl=1 -[15]: https://nuvola.tiliado.eu/index/ -[16]: https://itsfoss.com/why-firefox/ -[17]: https://itsfoss.com/ubuntu-shortcuts/ -[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_web_player.png?resize=800%2C449&ssl=1 -[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_music_controls.png?fit=800%2C450&ssl=1 -[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_web_player2.png?fit=800%2C450&ssl=1 -[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_song_change_notification-e1553077619208.png?ssl=1 -[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_shortcuts.png?resize=800%2C450&ssl=1 -[23]: https://itsfoss.com/lesser-known-music-players-linux/ diff --git a/sources/tech/20190321 4 ways to jumpstart productivity at work.md b/sources/tech/20190321 4 ways to jumpstart productivity at work.md deleted file mode 100644 index 679fa75607..0000000000 --- a/sources/tech/20190321 4 ways to jumpstart productivity at work.md +++ /dev/null @@ -1,96 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (4 ways to jumpstart productivity at work) -[#]: via: (https://opensource.com/article/19/3/guide-being-more-productive) -[#]: author: (Sarah Wall https://opensource.com/users/sarahwall) - -4 ways to jumpstart productivity at work -====== - -This article includes six open source productivity tools. - -![][1] - -Time poverty—the idea that there's not enough time to do all the work we need to do—is it a perception or a reality? - -The truth is you'll never get more than 24 hours out of any day. Working longer hours doesn't help. Your productivity actually decreases the longer you work in a given day. Your perception, or intuitive understanding of your time, is what matters. One key to managing productivity is how you use the time you've got. - -You have lots of time that you can use more efficiently, including time lost to ineffective meetings, distractions, and context switching between tasks. By spending your time more wisely, you can get more done and achieve higher overall job performance. You will also have a higher level of job satisfaction and feel lower levels of stress. - -### Jumpstart your productivity - -#### 1\. Eliminate distractions - -When you have too many things vying for your attention, it slows you down and decreases your productivity. Do your best to remove every distraction that pulls you off tasks. - -Cellphones, email, and messaging apps are the most common drains on productivity. Set the ringer on your phone to vibrate, set specific times for checking email, and close irrelevant browser tabs. With this approach, your work will be interrupted less throughout the day. - -#### 2\. Make your to-do list _verb-oriented_ - -To-do lists are a great way to help you focus on exactly what you need to accomplish each day. Some people do best with a physical list, like a notebook, and others do better with digital tools. Check out these suggestions for [open source productivity tools][2] to help you manage your workflow. Or check these six open source tools to stay organized: - - * [Joplin, a note-taking app][3] - * [Wekan, an open source kanban board][4] - * [TaskBoard, a lightweight kanban board][5] - * [Go For It, a flexible to-do list application][6] - * [Org mode without Emacs][7] - * [Freeplane, an open source mind-mapping application][8] - - - -Your list can be as sophisticated or as simple as you like, but just making a list is not enough. What goes on your list makes all the difference. Every item that goes on your list should be actionable. The trick is to make sure there's a verb. For example, "Smith project" is not actionable enough. "Outline key deliverables on Smith project" gives you a more concrete task to complete. - -#### 3\. Stick to the 10-minute rule - -Overwhelmed by an unclear or unwieldy task? Break it into 10-minute mini-tasks instead. This can be a great way to take something unmanageable and turn it into something achievable. - -The beauty of 10-minute tasks is they can be fit into many parts of your day. When you get into the office in the morning and are feeling fresh, kick off your day with a burst of productivity with a few 10-minute tasks. Losing momentum in the afternoon? A 10-minute job can help you regain speed. - -Ten-minute tasks are also a good way to identify tasks that can be delegated to others. The ability to delegate work is often one of the most effective management techniques. By finding a simple task that can be accomplished by another member of your team, you can make short work of a big job. - -#### 4\. Take a break - -Another drain on productivity is the urge to keep pressing ahead on a task to complete it without taking a break. Suddenly you feel really fatigued or hungry, and you realize you haven't gone to the bathroom in hours! Your concentration is affected, and therefore your productivity decreases. - -Set benchmarks for taking breaks and stick to them. For example, commit to once per hour to get up and move around for five minutes. If you're pressed for time, stand up and stretch for two minutes. Changing your body position and focusing on the present moment will help relieve any mental tension that has built up. - -Hydrate your mind with a glass of water. When your body is not properly hydrated, it can put increased stress on your brain. As little as a one to three percent decrease in hydration can negatively affect your memory, concentration, and decision-making. - -### Don't fall into the time-poverty trap - -Time is limited and time poverty is just an idea. How you choose to spend the time you have each day is what's important. When you develop new, healthy habits, you can increase your productivity and direct your time in the ways that give the most value. - -* * * - -_This article was adapted from "[The Keys to Productivity][9]" on ImageX's blog._ - -_Sarah Wall will present_ [_Mindless multitasking: a dummy's guide to productivity_][10], _at_ [_DrupalCon_][11] _in Seattle, April 8-12, 2019._ - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/guide-being-more-productive - -作者:[Sarah Wall][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/sarahwall -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_commun_4604_02_mech_connections_rhcz0.5x.png?itok=YPPU4dMj -[2]: https://opensource.com/article/16/11/open-source-productivity-hacks -[3]: https://opensource.com/article/19/1/productivity-tool-joplin -[4]: https://opensource.com/article/19/1/productivity-tool-wekan -[5]: https://opensource.com/article/19/1/productivity-tool-taskboard -[6]: https://opensource.com/article/19/1/productivity-tool-go-for-it -[7]: https://opensource.com/article/19/1/productivity-tool-org-mode -[8]: https://opensource.com/article/19/1/productivity-tool-freeplane -[9]: https://imagexmedia.com/managing-productivity -[10]: https://events.drupal.org/seattle2019/sessions/mindless-multitasking-dummy%E2%80%99s-guide-productivity -[11]: https://events.drupal.org/seattle2019 diff --git a/sources/tech/20190321 How To Setup Linux Media Server Using Jellyfin.md b/sources/tech/20190321 How To Setup Linux Media Server Using Jellyfin.md deleted file mode 100644 index 9c3de11bc5..0000000000 --- a/sources/tech/20190321 How To Setup Linux Media Server Using Jellyfin.md +++ /dev/null @@ -1,268 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How To Setup Linux Media Server Using Jellyfin) -[#]: via: (https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/) -[#]: author: (sk https://www.ostechnix.com/author/sk/) - -How To Setup Linux Media Server Using Jellyfin -====== - -![Setup Linux Media Server Using Jellyfin][1] - -We’ve already written about setting up your own streaming media server on Linux using [**Streama**][2]. Today, we will going to setup yet another media server using **Jellyfin**. Jellyfin is a free, cross-platform and open source alternative to propriety media streaming applications such as **Emby** and **Plex**. The main developer of Jellyfin forked it from Emby after the announcement of Emby transitioning to a proprietary model. Jellyfin doesn’t include any premium features, licenses or membership plans. It is completely free and open source project supported by hundreds of community members. Using jellyfin, we can instantly setup Linux media server in minutes and access it via LAN/WAN from any devices using multiple apps. - -### Setup Linux Media Server Using Jellyfin - -Jellyfin supports GNU/Linux, Mac OS and Microsoft Windows operating systems. You can install it on your Linux distribution as described below. - -##### Install Jellyfin On Linux - -As of writing this guide, Jellyfin packages are available for most popular Linux distributions, such as Arch Linux, Debian, CentOS, Fedora and Ubuntu. - -On **Arch Linux** and its derivatives like **Antergos** , **Manjaro Linux** , you can install Jellyfin using any AUR helper tools, for example [**YaY**][3]. - -``` -$ yay -S jellyfin-git -``` - -On **CentOS/RHEL** : - -Download the latest Jellyfin rpm package from [**here**][4] and install it as shown below. - -``` -$ wget https://repo.jellyfin.org/releases/server/centos/jellyfin-10.2.2-1.el7.x86_64.rpm - -$ sudo yum localinstall jellyfin-10.2.2-1.el7.x86_64.rpm -``` - -On **Fedora** : - -Download Jellyfin for Fedora from [**here**][5]. - -``` -$ wget https://repo.jellyfin.org/releases/server/fedora/jellyfin-10.2.2-1.fc29.x86_64.rpm - -$ sudo dnf install jellyfin-10.2.2-1.fc29.x86_64.rpm -``` - -On **Debian** : - -Install HTTPS transport for APT if it is not installed already: - -``` -$ sudo apt install apt-transport-https -``` - -Import Jellyfin GPG signing key:`` - -``` -$ wget -O - https://repo.jellyfin.org/debian/jellyfin_team.gpg.key | sudo apt-key add - -``` - -Add Jellyfin repository: - -``` -$ sudo touch /etc/apt/sources.list.d/jellyfin.list - -$ echo "deb [arch=amd64] https://repo.jellyfin.org/debian $( lsb_release -c -s ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list -``` - -Finally, update Jellyfin repository and install Jellyfin using commands:`` - -``` -$ sudo apt update - -$ sudo apt install jellyfin -``` - -On **Ubuntu 18.04 LTS** : - -Install HTTPS transport for APT if it is not installed already: - -``` -$ sudo apt install apt-transport-https -``` - -Import and add Jellyfin GPG signing key:`` - -``` -$ wget -O - https://repo.jellyfin.org/debian/jellyfin_team.gpg.key | sudo apt-key add - -``` - -Add the Jellyfin repository: - -``` -$ sudo touch /etc/apt/sources.list.d/jellyfin.list - -$ echo "deb https://repo.jellyfin.org/ubuntu bionic main" | sudo tee /etc/apt/sources.list.d/jellyfin.list -``` - -For Ubuntu 16.04, just replace **bionic** with **xenial** in the above URL. - -Finally, update Jellyfin repository and install Jellyfin using commands:`` - -``` -$ sudo apt update - -$ sudo apt install jellyfin -``` - -##### Start Jellyfin service - -Run the following commands to enable and start jellyfin service on every reboot: - -``` -$ sudo systemctl enable jellyfin - -$ sudo systemctl start jellyfin -``` - -To check if the service has been started or not, run: - -``` -$ sudo systemctl status jellyfin -``` - -Sample output: - -``` -● jellyfin.service - Jellyfin Media Server -Loaded: loaded (/lib/systemd/system/jellyfin.service; enabled; vendor preset: enabled) -Drop-In: /etc/systemd/system/jellyfin.service.d -└─jellyfin.service.conf -Active: active (running) since Wed 2019-03-20 12:20:19 UTC; 1s ago -Main PID: 4556 (jellyfin) -Tasks: 11 (limit: 2320) -CGroup: /system.slice/jellyfin.service -└─4556 /usr/bin/jellyfin --datadir=/var/lib/jellyfin --configdir=/etc/jellyfin --logdir=/var/log/jellyfin --cachedir=/var/cache/jellyfin --r - -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading Emby.Photos, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading Emby.Server.Implementations, Version=10.2.2.0, Culture=neutral, PublicKeyToken=nu -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading MediaBrowser.MediaEncoding, Version=10.2.2.0, Culture=neutral, PublicKeyToken=nul -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading Emby.Dlna, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading MediaBrowser.LocalMetadata, Version=10.2.2.0, Culture=neutral, PublicKeyToken=nul -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading Emby.Notifications, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading MediaBrowser.XbmcMetadata, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading jellyfin, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Sqlite version: 3.26.0 -Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Sqlite compiler options: COMPILER=gcc-5.4.0 20160609,DEFAULT_FOREIGN_KEYS,ENABLE_COLUMN_M -``` - -If you see an output something, congratulations! Jellyfin service has been started. - -Next, we should do some initial configuration. - -##### Configure Jellyfin - -Once jellyfin is installed, open the browser and navigate to – **http:// :8096** or **http:// :8096** URL. - -You will see the following welcome screen. Select your preferred language and click Next. - -![][6] - -Enter your user details. You can add more users later from the Jellyfin Dashboard. - -![][7] - -The next step is to select media files which we want to stream. To do so, click “Add media Library” button: - -![][8] - -Choose the content type (i.e audio, video, movies etc.,), display name and click plus (+) sign next to the Folders icon to choose the location where you kept your media files. You can further choose other library settings such as the preferred download language, country etc. Click Ok after choosing the preferred options. - -![][9] - -Similarly, add all of the media files. Once you have chosen everything to stream, click Next. - -![][10] - -Choose the Metadata language and click Next: - -![][11] - -Next, you need to configure whether you want to allow remote connections to this media server. Make sure you have allowed the remote connections. Also, enable automatic port mapping and click Next: - -![][12] - -You’re all set! Click Finish to complete Jellyfin configuration. - -![][13] - -You will now be redirected to Jellyfin login page. Click on the username and enter it’s password which we setup earlier. - -![][14] - -This is how Jellyfin dashboard looks like. - -![][15] - -As you see in the screenshot, all of your media files are shown in the dashboard itself under My Media section. Just click on the any media file of your choice and start watching it!! - -![][16] - -You can access this Jellyfin media server from any systems on the network using URL – . You need not to install any extra apps. All you need is a modern web browser. - -If you want to change anything or reconfigure, click on the three horizontal bars from the Home screen. Here, you can add users, media files, change playback settings, add TV/DVR, install plugins, change default port no and a lot more settings. - -![][17] - -For more details, check out [**Jellyfin official documentation**][18] page. - -And, that’s all for now. As you can see setting up a streaming media server on Linux is no big-deal. I tested it on my Ubuntu 18.04 LTS VM. It worked fine out of the box. I can be able to watch the movies from other systems in my LAN. If you’re looking for easy, quick and free solution for hosting a media server, Jellyfin is a good choice. - -Cheers! - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/ - -作者:[sk][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[2]: https://www.ostechnix.com/streama-setup-your-own-streaming-media-server-in-minutes/ -[3]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ -[4]: https://repo.jellyfin.org/releases/server/centos/ -[5]: https://repo.jellyfin.org/releases/server/fedora/ -[6]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-1.png -[7]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-2-1.png -[8]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-3-1.png -[9]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-4-1.png -[10]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-5-1.png -[11]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-6.png -[12]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-7.png -[13]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-8-1.png -[14]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-9.png -[15]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-10.png -[16]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-11.png -[17]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-12.png -[18]: https://jellyfin.readthedocs.io/en/latest/ -[19]: https://github.com/jellyfin/jellyfin -[20]: http://feedburner.google.com/fb/a/mailverify?uri=ostechnix (Subscribe to our Email newsletter) -[21]: https://www.paypal.me/ostechnix (Donate Via PayPal) -[22]: http://ostechnix.tradepub.com/category/information-technology/1207/ -[23]: https://www.facebook.com/ostechnix/ -[24]: https://twitter.com/ostechnix -[25]: https://plus.google.com/+SenthilkumarP/ -[26]: https://www.linkedin.com/in/ostechnix -[27]: http://feeds.feedburner.com/Ostechnix -[28]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=reddit (Click to share on Reddit) -[29]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=twitter (Click to share on Twitter) -[30]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=facebook (Click to share on Facebook) -[31]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=linkedin (Click to share on LinkedIn) -[32]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=pocket (Click to share on Pocket) -[33]: https://api.whatsapp.com/send?text=How%20To%20Setup%20Linux%20Media%20Server%20Using%20Jellyfin%20https%3A%2F%2Fwww.ostechnix.com%2Fhow-to-setup-linux-media-server-using-jellyfin%2F (Click to share on WhatsApp) -[34]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=telegram (Click to share on Telegram) -[35]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=email (Click to email this to a friend) -[36]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/#print (Click to print) diff --git a/sources/tech/20190321 How to use Spark SQL- A hands-on tutorial.md b/sources/tech/20190321 How to use Spark SQL- A hands-on tutorial.md deleted file mode 100644 index 0e4be0aa01..0000000000 --- a/sources/tech/20190321 How to use Spark SQL- A hands-on tutorial.md +++ /dev/null @@ -1,540 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to use Spark SQL: A hands-on tutorial) -[#]: via: (https://opensource.com/article/19/3/apache-spark-and-dataframes-tutorial) -[#]: author: (Dipanjan Sarkar https://opensource.com/users/djsarkar) - -How to use Spark SQL: A hands-on tutorial -====== - -This tutorial explains how to leverage relational databases at scale using Spark SQL and DataFrames. - -![Team checklist and to dos][1] - -In the [first part][2] of this series, we looked at advances in leveraging the power of relational databases "at scale" using [Apache Spark SQL and DataFrames][3]. We will now do a simple tutorial based on a real-world dataset to look at how to use Spark SQL. We will be using Spark DataFrames, but the focus will be more on using SQL. In a separate article, I will cover a detailed discussion around Spark DataFrames and common operations. - -I love using cloud services for my machine learning, deep learning, and even big data analytics needs, instead of painfully setting up my own Spark cluster. I will be using the Databricks Platform for my Spark needs. Databricks is a company founded by the creators of Apache Spark that aims to help clients with cloud-based big data processing using Spark. - -![Apache Spark and Databricks][4] - -The simplest (and free of charge) way is to go to the [Try Databricks page][5] and [sign up for a community edition][6] account. You get a cloud-based cluster, which is a single-node cluster with 6GB and unlimited notebooks—not bad for a free version! I recommend using the Databricks Platform if you have serious needs for analyzing big data. - -Let's get started with our case study now. Feel free to create a new notebook from your home screen in Databricks or your own Spark cluster. - -![Create a notebook][7] - -You can also import my notebook containing the entire tutorial, but please make sure to run every cell and play around and explore with it, instead of just reading through it. Unsure of how to use Spark on Databricks? Follow [this short but useful tutorial][8]. - -This tutorial will familiarize you with essential Spark capabilities to deal with structured data often obtained from databases or flat files. We will explore typical ways of querying and aggregating relational data by leveraging concepts of DataFrames and SQL using Spark. We will work on an interesting dataset from the [KDD Cup 1999][9] and try to query the data using high-level abstractions like the dataframe that has already been a hit in popular data analysis tools like R and Python. We will also look at how easy it is to build data queries using the SQL language and retrieve insightful information from our data. This also happens at scale without us having to do a lot more since Spark distributes these data structures efficiently in the backend, which makes our queries scalable and as efficient as possible. We'll start by loading some basic dependencies. - -``` -import pandas as pd -import matplotlib.pyplot as plt -plt.style.use('fivethirtyeight') -``` - -#### Data retrieval - -The [KDD Cup 1999][9] dataset was used for the Third International Knowledge Discovery and Data Mining Tools Competition, which was held in conjunction with KDD-99, the Fifth International Conference on Knowledge Discovery and Data Mining. The competition task was to build a network-intrusion detector, a predictive model capable of distinguishing between _bad connections_ , called intrusions or attacks, and _good, normal connections_. This database contains a standard set of data to be audited, which includes a wide variety of intrusions simulated in a military network environment. - -We will be using the reduced dataset **kddcup.data_10_percent.gz** that contains nearly a half-million network interactions. We will download this Gzip file from the web locally and then work on it. If you have a good, stable internet connection, feel free to download and work with the full dataset, **kddcup.data.gz**. - -#### Working with data from the web - -Dealing with datasets retrieved from the web can be a bit tricky in Databricks. Fortunately, we have some excellent utility packages like **dbutils** that help make our job easier. Let's take a quick look at some essential functions for this module. - -``` -dbutils.help() -``` - -``` -This module provides various utilities for users to interact with the rest of Databricks. - -fs: DbfsUtils -> Manipulates the Databricks filesystem (DBFS) from the console -meta: MetaUtils -> Methods to hook into the compiler (EXPERIMENTAL) -notebook: NotebookUtils -> Utilities for the control flow of a notebook (EXPERIMENTAL) -preview: Preview -> Utilities under preview category -secrets: SecretUtils -> Provides utilities for leveraging secrets within notebooks -widgets: WidgetsUtils -> Methods to create and get bound value of input widgets inside notebooks -``` - -#### Retrieve and store data in Databricks - -We will now leverage the Python **urllib** library to extract the KDD Cup 99 data from its web repository, store it in a temporary location, and move it to the Databricks filesystem, which can enable easy access to this data for analysis - -> **Note:** If you skip this step and download the data directly, you may end up getting a **InvalidInputException: Input path does not exist** error. - -``` -import urllib -urllib.urlretrieve("", "/tmp/kddcup_data.gz") -dbutils.fs.mv("file:/tmp/kddcup_data.gz", "dbfs:/kdd/kddcup_data.gz") -display(dbutils.fs.ls("dbfs:/kdd")) -``` - -![Spark Job kddcup_data.gz][10] - -#### Build the KDD dataset - -Now that we have our data stored in the Databricks filesystem, let's load up our data from the disk into Spark's traditional abstracted data structure, the [Resilient Distributed Dataset][11] (RDD). - -``` -data_file = "dbfs:/kdd/kddcup_data.gz" -raw_rdd = sc.textFile(data_file).cache() -raw_rdd.take(5) -``` - -![Data in Resilient Distributed Dataset \(RDD\)][12] - -You can also verify the type of data structure of our data (RDD) using the following code. - -``` -type(raw_rdd) -``` - -![output][13] - -#### Build a Spark DataFrame on our data - -A Spark DataFrame is an interesting data structure representing a distributed collecion of data. Typically the entry point into all SQL functionality in Spark is the **SQLContext** class. To create a basic instance of this call, all we need is a **SparkContext** reference. In Databricks, this global context object is available as **sc** for this purpose. - -``` -from pyspark.sql import SQLContext -sqlContext = SQLContext(sc) -sqlContext -``` - -![output][14] - -#### Split the CSV data - -Each entry in our RDD is a comma-separated line of data, which we first need to split before we can parse and build our dataframe. - -``` -csv_rdd = raw_rdd.map(lambda row: row.split(",")) -print(csv_rdd.take(2)) -print(type(csv_rdd)) -``` - -![Splitting RDD entries][15] - -#### Check the total number of features (columns) - -We can use the following code to check the total number of potential columns in our dataset. - -``` -len(csv_rdd.take(1)[0]) - -Out[57]: 42 -``` - -#### Understand and parse data - -The KDD 99 Cup data consists of different attributes captured from connection data. You can obtain the [full list of attributes in the data][16] and further details pertaining to the [description for each attribute/column][17]. We will just be using some specific columns from the dataset, the details of which are specified as follows. - -feature num | feature name | description | type ----|---|---|--- -1 | duration | length (number of seconds) of the connection | continuous -2 | protocol_type | type of the protocol, e.g., tcp, udp, etc. | discrete -3 | service | network service on the destination, e.g., http, telnet, etc. | discrete -4 | src_bytes | number of data bytes from source to destination | continuous -5 | dst_bytes | number of data bytes from destination to source | continuous -6 | flag | normal or error status of the connection | discrete -7 | wrong_fragment | number of "wrong" fragments | continuous -8 | urgent | number of urgent packets | continuous -9 | hot | number of "hot" indicators | continuous -10 | num_failed_logins | number of failed login attempts | continuous -11 | num_compromised | number of "compromised" conditions | continuous -12 | su_attempted | 1 if "su root" command attempted; 0 otherwise | discrete -13 | num_root | number of "root" accesses | continuous -14 | num_file_creations | number of file creation operations | continuous - -We will be extracting the following columns based on their positions in each data point (row) and build a new RDD as follows. - -``` -from pyspark.sql import Row - -parsed_rdd = csv_rdd.map(lambda r: Row( - duration=int(r[0]), - protocol_type=r[1], - service=r[2], - flag=r[3], - src_bytes=int(r[4]), - dst_bytes=int(r[5]), - wrong_fragment=int(r[7]), - urgent=int(r[8]), - hot=int(r[9]), - num_failed_logins=int(r[10]), - num_compromised=int(r[12]), - su_attempted=r[14], - num_root=int(r[15]), - num_file_creations=int(r[16]), - label=r[-1] - ) -) -parsed_rdd.take(5) -``` - -![Extracting columns][18] - -#### Construct the DataFrame - -Now that our data is neatly parsed and formatted, let's build our DataFrame! -``` - -``` - -df = sqlContext.createDataFrame(parsed_rdd) -display(df.head(10)) - -![DataFrame][19] - -You can also now check out the schema of our DataFrame using the following code. - -``` -df.printSchema() -``` - -![Dataframe schema][20] - -#### Build a temporary table - -We can leverage the **registerTempTable()** function to build a temporary table to run SQL commands on our DataFrame at scale! A point to remember is that the lifetime of this temp table is tied to the session. It creates an in-memory table that is scoped to the cluster in which it was created. The data is stored using Hive's highly optimized, in-memory columnar format. - -You can also check out **saveAsTable()** , which creates a permanent, physical table stored in S3 using the Parquet format. This table is accessible to all clusters. The table metadata, including the location of the file(s), is stored within the Hive metastore. - -``` -help(df.registerTempTable) -``` - -![help\(df.registerTempTable\)][21] - -``` -df.registerTempTable("connections") -``` - -### Execute SQL at Scale - -Let's look at a few examples of how we can run SQL queries on our table based off of our dataframe. We will start with some simple queries and then look at aggregations, filters, sorting, sub-queries, and pivots in this tutorial. - -#### Connections based on the protocol type - -Let's look at how we can get the total number of connections based on the type of connectivity protocol. First, we will get this information using normal DataFrame DSL syntax to perform aggregations. - -``` -display(df.groupBy('protocol_type') -.count() -.orderBy('count', ascending=False)) -``` - -![Total number of connections][22] - -Can we also use SQL to perform the same aggregation? Yes, we can leverage the table we built earlier for this! - -``` -protocols = sqlContext.sql(""" - SELECT protocol_type, count(*) as freq - FROM connections - GROUP BY protocol_type - ORDER BY 2 DESC - """) -display(protocols) -``` - -![protocol type and frequency][23] - -You can clearly see that you get the same results and don't need to worry about your background infrastructure or how the code is executed. Just write simple SQL! - -#### Connections based on good or bad (attack types) signatures - -We will now run a simple aggregation to check the total number of connections based on good (normal) or bad (intrusion attacks) types. - -``` -labels = sqlContext.sql(""" - SELECT label, count(*) as freq - FROM connections - GROUP BY label - ORDER BY 2 DESC -""") -display(labels) -``` - -![Connection by type][24] - -We have a lot of different attack types. We can visualize this in the form of a bar chart. The simplest way is to use the excellent interface options in the Databricks notebook. - -![Databricks chart types][25] - -This gives us a nice-looking bar chart, which you can customize further by clicking on **Plot Options**. - -![Bar chart][26] - -Another way is to write the code to do it. You can extract the aggregated data as a Pandas DataFrame and plot it as a regular bar chart. - -``` -labels_df = pd.DataFrame(labels.toPandas()) -labels_df.set_index("label", drop=True,inplace=True) -labels_fig = labels_df.plot(kind='barh') - -plt.rcParams["figure.figsize"] = (7, 5) -plt.rcParams.update({'font.size': 10}) -plt.tight_layout() -display(labels_fig.figure) -``` - -![Bar chart][27] - -### Connections based on protocols and attacks - -Let's look at which protocols are most vulnerable to attacks by using the following SQL query. - -``` - -attack_protocol = sqlContext.sql(""" - SELECT - protocol_type, - CASE label - WHEN 'normal.' THEN 'no attack' - ELSE 'attack' - END AS state, - COUNT(*) as freq - FROM connections - GROUP BY protocol_type, state - ORDER BY 3 DESC -""") -display(attack_protocol) -``` - -![Protocols most vulnerable to attacks][28] - -Well, it looks like ICMP connections, followed by TCP connections have had the most attacks. - -#### Connection stats based on protocols and attacks - -Let's take a look at some statistical measures pertaining to these protocols and attacks for our connection requests. - -``` -attack_stats = sqlContext.sql(""" - SELECT - protocol_type, - CASE label - WHEN 'normal.' THEN 'no attack' - ELSE 'attack' - END AS state, - COUNT(*) as total_freq, - ROUND(AVG(src_bytes), 2) as mean_src_bytes, - ROUND(AVG(dst_bytes), 2) as mean_dst_bytes, - ROUND(AVG(duration), 2) as mean_duration, - SUM(num_failed_logins) as total_failed_logins, - SUM(num_compromised) as total_compromised, - SUM(num_file_creations) as total_file_creations, - SUM(su_attempted) as total_root_attempts, - SUM(num_root) as total_root_acceses - FROM connections - GROUP BY protocol_type, state - ORDER BY 3 DESC -""") -display(attack_stats) -``` - -![Statistics pertaining to protocols and attacks][29] - -Looks like the average amount of data being transmitted in TCP requests is much higher, which is not surprising. Interestingly, attacks have a much higher average payload of data being transmitted from the source to the destination. - -#### Filtering connection stats based on the TCP protocol by service and attack type - -Let's take a closer look at TCP attacks, given that we have more relevant data and statistics for the same. We will now aggregate different types of TCP attacks based on service and attack type and observe different metrics. - -``` -tcp_attack_stats = sqlContext.sql(""" -SELECT -service, -label as attack_type, -COUNT(*) as total_freq, -ROUND(AVG(duration), 2) as mean_duration, -SUM(num_failed_logins) as total_failed_logins, -SUM(num_file_creations) as total_file_creations, -SUM(su_attempted) as total_root_attempts, -SUM(num_root) as total_root_acceses -FROM connections -WHERE protocol_type = 'tcp' -AND label != 'normal.' -GROUP BY service, attack_type -ORDER BY total_freq DESC -""") -display(tcp_attack_stats) -``` - -![TCP attack data][30] - -There are a lot of attack types, and the preceding output shows a specific section of them. - -#### Filtering connection stats based on the TCP protocol by service and attack type - -We will now filter some of these attack types by imposing some constraints in our query based on duration, file creations, and root accesses. - -``` -tcp_attack_stats = sqlContext.sql(""" -SELECT -service, -label as attack_type, -COUNT(*) as total_freq, -ROUND(AVG(duration), 2) as mean_duration, -SUM(num_failed_logins) as total_failed_logins, -SUM(num_file_creations) as total_file_creations, -SUM(su_attempted) as total_root_attempts, -SUM(num_root) as total_root_acceses -FROM connections -WHERE (protocol_type = 'tcp' -AND label != 'normal.') -GROUP BY service, attack_type -HAVING (mean_duration >= 50 -AND total_file_creations >= 5 -AND total_root_acceses >= 1) -ORDER BY total_freq DESC -""") -display(tcp_attack_stats) -``` - -![Filtered by attack type][31] - -It's interesting to see that [multi-hop attacks][32] can get root accesses to the destination hosts! - -#### Subqueries to filter TCP attack types based on service - -Let's try to get all the TCP attacks based on service and attack type such that the overall mean duration of these attacks is greater than zero ( **> 0** ). For this, we can do an inner query with all aggregation statistics and extract the relevant queries and apply a mean duration filter in the outer query, as shown below. - -``` -tcp_attack_stats = sqlContext.sql(""" -SELECT -t.service, -t.attack_type, -t.total_freq -FROM -(SELECT -service, -label as attack_type, -COUNT(*) as total_freq, -ROUND(AVG(duration), 2) as mean_duration, -SUM(num_failed_logins) as total_failed_logins, -SUM(num_file_creations) as total_file_creations, -SUM(su_attempted) as total_root_attempts, -SUM(num_root) as total_root_acceses -FROM connections -WHERE protocol_type = 'tcp' -AND label != 'normal.' -GROUP BY service, attack_type -ORDER BY total_freq DESC) as t -WHERE t.mean_duration > 0 -""") -display(tcp_attack_stats) -``` - -![TCP attacks based on service and attack type][33] - -This is nice! Now another interesting way to view this data is to use a pivot table, where one attribute represents rows and another one represents columns. Let's see if we can leverage Spark DataFrames to do this! - -#### Build a pivot table from aggregated data - -We will build upon the previous DataFrame object where we aggregated attacks based on type and service. For this, we can leverage the power of Spark DataFrames and the DataFrame DSL. - -``` -display((tcp_attack_stats.groupby('service') -.pivot('attack_type') -.agg({'total_freq':'max'}) -.na.fill(0)) -) -``` - -![Pivot table][34] - -We get a nice, neat pivot table showing all the occurrences based on service and attack type! - -### Next steps - -I would encourage you to go out and play with Spark SQL and DataFrames. You can even [import my notebook][35] and play with it in your own account. - -Feel free to refer to [my GitHub repository][36] also for all the code and notebooks used in this article. It covers things we didn't cover here, including: - - * Joins - * Window functions - * Detailed operations and transformations of Spark DataFrames - - - -You can also access my tutorial as a [Jupyter Notebook][37], in case you want to use it offline. - -There are plenty of articles and tutorials available online, so I recommend you check them out. One useful resource is Databricks' complete [guide to Spark SQL][38]. - -Thinking of working with JSON data but unsure of using Spark SQL? Databricks supports it! Check out this excellent guide to [JSON support in Spark SQL][39]. - -Interested in advanced concepts like window functions and ranks in SQL? Take a look at "[Introducing Window Functions in Spark SQL][40]." - -I will write another article covering some of these concepts in an intuitive way, which should be easy for you to understand. Stay tuned! - -In case you have any feedback or queries, you can reach out to me on [LinkedIn][41]. - -* * * - -*This article originally appeared on Medium's [Towards Data Science][42] channel and is republished with permission. * - -* * * - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/apache-spark-and-dataframes-tutorial - -作者:[Dipanjan (DJ) Sarkar (Red Hat)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/djsarkar -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/todo_checklist_team_metrics_report.png?itok=oB5uQbzf (Team checklist and to dos) -[2]: https://opensource.com/article/19/3/sql-scale-apache-spark-sql-and-dataframes -[3]: https://spark.apache.org/sql/ -[4]: https://opensource.com/sites/default/files/uploads/13_spark-databricks.png (Apache Spark and Databricks) -[5]: https://databricks.com/try-databricks -[6]: https://databricks.com/signup#signup/community -[7]: https://opensource.com/sites/default/files/uploads/14_create-notebook.png (Create a notebook) -[8]: https://databricks.com/spark/getting-started-with-apache-spark -[9]: http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html -[10]: https://opensource.com/sites/default/files/uploads/15_dbfs-kdd-kddcup_data-gz.png (Spark Job kddcup_data.gz) -[11]: https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds -[12]: https://opensource.com/sites/default/files/uploads/16_rdd-data.png (Data in Resilient Distributed Dataset (RDD)) -[13]: https://opensource.com/sites/default/files/uploads/16a_output.png (output) -[14]: https://opensource.com/sites/default/files/uploads/16b_output.png (output) -[15]: https://opensource.com/sites/default/files/uploads/17_split-csv.png (Splitting RDD entries) -[16]: http://kdd.ics.uci.edu/databases/kddcup99/kddcup.names -[17]: http://kdd.ics.uci.edu/databases/kddcup99/task.html -[18]: https://opensource.com/sites/default/files/uploads/18_extract-columns.png (Extracting columns) -[19]: https://opensource.com/sites/default/files/uploads/19_build-dataframe.png (DataFrame) -[20]: https://opensource.com/sites/default/files/uploads/20_dataframe-schema.png (Dataframe schema) -[21]: https://opensource.com/sites/default/files/uploads/21_registertemptable.png (help(df.registerTempTable)) -[22]: https://opensource.com/sites/default/files/uploads/22_number-of-connections.png (Total number of connections) -[23]: https://opensource.com/sites/default/files/uploads/23_sql.png (protocol type and frequency) -[24]: https://opensource.com/sites/default/files/uploads/24_intrusion-type.png (Connection by type) -[25]: https://opensource.com/sites/default/files/uploads/25_chart-interface.png (Databricks chart types) -[26]: https://opensource.com/sites/default/files/uploads/26_plot-options-chart.png (Bar chart) -[27]: https://opensource.com/sites/default/files/uploads/27_pandas-barchart.png (Bar chart) -[28]: https://opensource.com/sites/default/files/uploads/28_most-attacked.png (Protocols most vulnerable to attacks) -[29]: https://opensource.com/sites/default/files/uploads/29_data-transmissions.png (Statistics pertaining to protocols and attacks) -[30]: https://opensource.com/sites/default/files/uploads/30_tcp-attack-metrics.png (TCP attack data) -[31]: https://opensource.com/sites/default/files/uploads/31_attack-type.png (Filtered by attack type) -[32]: https://attack.mitre.org/techniques/T1188/ -[33]: https://opensource.com/sites/default/files/uploads/32_tcp-attack-types.png (TCP attacks based on service and attack type) -[34]: https://opensource.com/sites/default/files/uploads/33_pivot-table.png (Pivot table) -[35]: https://databricks-prod-cloudfront.cloud.databricks.com/public/4027ec902e239c93eaaa8714f173bcfc/3137082781873852/3704545280501166/1264763342038607/latest.html -[36]: https://github.com/dipanjanS/data_science_for_all/tree/master/tds_spark_sql_intro -[37]: http://nbviewer.jupyter.org/github/dipanjanS/data_science_for_all/blob/master/tds_spark_sql_intro/Working%20with%20SQL%20at%20Scale%20-%20Spark%20SQL%20Tutorial.ipynb -[38]: https://docs.databricks.com/spark/latest/spark-sql/index.html -[39]: https://databricks.com/blog/2015/02/02/an-introduction-to-json-support-in-spark-sql.html -[40]: https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html -[41]: https://www.linkedin.com/in/dipanzan/ -[42]: https://towardsdatascience.com/sql-at-scale-with-apache-spark-sql-and-dataframes-concepts-architecture-and-examples-c567853a702f diff --git a/sources/tech/20190321 NVIDIA Jetson Nano is a -99 Raspberry Pi Rival for AI Development.md b/sources/tech/20190321 NVIDIA Jetson Nano is a -99 Raspberry Pi Rival for AI Development.md deleted file mode 100644 index 52f02edc95..0000000000 --- a/sources/tech/20190321 NVIDIA Jetson Nano is a -99 Raspberry Pi Rival for AI Development.md +++ /dev/null @@ -1,98 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (NVIDIA Jetson Nano is a $99 Raspberry Pi Rival for AI Development) -[#]: via: (https://itsfoss.com/nvidia-jetson-nano/) -[#]: author: (Atharva Lele https://itsfoss.com/author/atharva/) - -NVIDIA Jetson Nano is a $99 Raspberry Pi Rival for AI Development -====== - -At the [GPU Technology Conference][1] NVIDIA announced the [Jetson Nano Module][2] and the [Jetson Nano Developer Kit][3]. Compared to other Jetson boards which cost between $299 and $1099, the Jetson Nano bears a low cost of $99. This puts it within the reach of many developers, educators, and researchers who could not spend hundreds of dollars to get such a product. - -![The Jetson Nano Development Kit \(left\) and the Jetson Nano Module \(right\)][4] - -### Bringing back AI development from ‘cloud’ - -In the last few years, we have seen a lot of [advances in AI research][5]. Traditionally AI computing was always done in the cloud, where there was plenty of processing power available. - -Recently, there’s been a trend in shifting this computation away from the cloud and do it locally. This is called [Edge Computing][6]. Now at the embedded level, products which could do such complex calculations required for AI and Machine Learning were sparse, but we’re seeing a great explosion these days in this product segment. - -Products like the [SparkFun Edge][7] and [OpenMV Board][8] are good examples. The Jetson Nano, is NVIDIA’s latest offering in this market. When connected to your system, it will be able to supply the processing power needed for Machine Learning and AI tasks without having to rely on the cloud. - -This is great for privacy as well as saving on internet bandwidth. It is also more secure since your data always stays on the device itself. - -### Jetson Nano focuses on smaller AI projects - -![Jetson Nano powered JetBot][9] - -Previously released Jetson Boards like the [TX2][10] and [AGX Xavier][11] were used in products like drones and cars, the Jetson Nano is targeting smaller projects, projects where you need to have the processing power which boards like the [Raspberry Pi][12] cannot provide. - -Did you know? - -NVIDIA’s JetPack SDK provides a ‘complete desktop Linux environment based on Ubuntu 18.04 LTS’. In other words, the Jetson Nano is powered by Ubuntu Linux. - -### NVIDIA Jetson Nano Specifications - -For $99, you get 472 GFLOPS of processing power due to 128 NVIDIA Maxwell Architecture CUDA Cores, a quad-core ARM A57 processor, 4GB of LP-DDR4 RAM, 16GB of on-board storage, and 4k video encode/decode capabilities. The port selection is also pretty decent with the Nano having Gigabit Ethernet, MIPI Camera, Display outputs, and a couple of USB ports (1×3.0, 3×2.0). Full range of specifications can be found [here][13]. - -CPU | Quad-core ARM® Cortex®-A57 MPCore processor ----|--- -GPU | NVIDIA Maxwell™ architecture with 128 NVIDIA CUDA® cores -RAM | 4 GB 64-bit LPDDR4 -Storage | 16 GB eMMC 5.1 Flash -Camera | 12 lanes (3×4 or 4×2) MIPI CSI-2 DPHY 1.1 (1.5 Gbps) -Connectivity | Gigabit Ethernet -Display Ports | HDMI 2.0 and DP 1.2 -USB Ports | 1 USB 3.0 and 3 USB 2.0 -Other | 1 x1/2/4 PCIE, 1x SDIO / 2x SPI / 6x I2C / 2x I2S / GPIOs -Size | 69.6 mm x 45 mm - -Along with good hardware, you get support for the majority of popular AI frameworks like TensorFlow, PyTorch, Keras, etc. It also has support for NVIDIA’s [JetPack][14] and [DeepStream][15] SDKs, same as the more expensive TX2 and AGX Boards. - -“Jetson Nano makes AI more accessible to everyone — and is supported by the same underlying architecture and software that powers our nation’s supercomputer. Bringing AI to the maker movement opens up a whole new world of innovation, inspiring people to create the next big thing.” said Deepu Talla, VP and GM of Autonomous Machines at NVIDIA. - -[Subscribe to It’s FOSS YouTube Channel][16] - -**What do you think of Jetson Nano?** - -The availability of Jetson Nano differs from country to country. - -The [Intel Neural Stick][17], is also one such accelerator which is competitively prices at $79. It’s good to see competition stirring up at these lower price points from the big manufacturers. - -I’m looking forward to getting my hands on the product if possible. - -What do you guys think about a product like this? Let us know in the comments below. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/nvidia-jetson-nano/ - -作者:[Atharva Lele][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/atharva/ -[b]: https://github.com/lujun9972 -[1]: https://www.nvidia.com/en-us/gtc/ -[2]: https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-nano/ -[3]: https://developer.nvidia.com/embedded/buy/jetson-nano-devkit -[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/jetson-nano-family-press-image-hd.jpg?ssl=1 -[5]: https://itsfoss.com/nanotechnology-open-science-ai/ -[6]: https://en.wikipedia.org/wiki/Edge_computing -[7]: https://www.sparkfun.com/news/2886 -[8]: https://openmv.io/ -[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nvidia_jetson_bot.jpg?ssl=1 -[10]: https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-tx2/ -[11]: https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-agx-xavier/ -[12]: https://itsfoss.com/things-you-need-to-get-your-raspberry-pi-working/ -[13]: https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-nano/#specifications -[14]: https://developer.nvidia.com/embedded/jetpack -[15]: https://developer.nvidia.com/deepstream-sdk -[16]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 -[17]: https://software.intel.com/en-us/movidius-ncs-get-started diff --git a/sources/tech/20190321 Top 10 New Linux SBCs to Watch in 2019.md b/sources/tech/20190321 Top 10 New Linux SBCs to Watch in 2019.md deleted file mode 100644 index f3f1f7c72b..0000000000 --- a/sources/tech/20190321 Top 10 New Linux SBCs to Watch in 2019.md +++ /dev/null @@ -1,101 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Top 10 New Linux SBCs to Watch in 2019) -[#]: via: (https://www.linux.com/blog/2019/3/top-10-new-linux-sbcs-watch-2019) -[#]: author: (Eric Brown https://www.linux.com/users/ericstephenbrown) - -Top 10 New Linux SBCs to Watch in 2019 -====== - -![UP Xtreme][1] - -Aaeon's Linux-ready UP Xtreme SBC. - -[Used with permission][2] - -A recent [Global Market Insights report][3] projects the single board computer market will grow from $600 million in 2018 to $1 billion by 2025. Yet, you don’t need to read a market research report to realize the SBC market is booming. Driven by the trends toward IoT and AI-enabled edge computing, new boards keep rolling off the assembly lines, many of them [tailored for highly specific applications][4]. - -Much of the action has been in Linux-compatible boards, including the insanely popular Raspberry Pi. The number of different vendors and models has exploded thanks in part to the rise of [community-backed, open-spec SBCs][5]. - -Here we examine 10 of the most intriguing, Linux-driven SBCs among the many products announced in the last four weeks that bookended the recent [Embedded World show][6] in Nuremberg. (There was also some [interesting Linux software news][7] at the show.) Two of the SBCs—the Intel Whiskey Lake based UP Xtreme and Nvidia Jetson Nano driven Jetson Nano Dev Kit—were announced only this week. - -Our mostly open source list also includes a few commercial boards. Processors range from the modest, Cortex-A7 driven STM32MP1 to the high-powered Whiskey Lake and Snapdragon 845. Mid-range models include Google’s i.MX8M powered Coral Dev Board and a similarly AI-enhanced, TI AM5729 based BeagleBone AI. Deep learning acceleration chips—and standard RPi 40-pin or 96Boards expansion connectors—are common themes among most of these boards. - -The SBCs are listed in reverse chronological order according to their announcement dates. The links in the product names go to recent LinuxGizmos reports, which link to vendor product pages. - -**[UP Xtreme][8]** —The latest in Aaeon’s line of community-backed SBCs taps Intel’s 8th Gen Whiskey Lake-U CPUs, which maintain a modest 15W TDP while boosting performance with up to quad-core, dual threaded configurations. Depending on when it ships, this Linux-ready model will likely be the most powerful community-backed SBC around -- and possibly the most expensive. - -The SBC supports up to 16GB DDR4 and 128GB eMMC and offers 4K displays via HDMI, DisplayPort, and eDP. Other features include SATA, 2x GbE, 4x USB 3.0, and 40-pin “HAT” and 100-pin GPIO add-on board connectors. You also get mini-PCIe and dual M.2 slots that support wireless modems and more SATA options. The slots also support Aaeon’s new AI Core X modules, which offer Intel’s latest Movidius Myriad X VPUs for 1TOPS neural processing acceleration. - -**[Jetson Nano Dev Kit][9]** —Nvidia just announced a low-end Jetson Nano compute module that’s sort of like a smaller (70 x 45mm) version of the old Jetson TX1. It offers the same 4x Cortex-A57 cores but has an even lower-end 128-core Maxwell GPU. The module has half the RAM and flash (4GB/16GB) of the TX1 and TX2, and no WiFi/Bluetooth radios. Like the hexa-core Jetson TX2, however, it supports 4K video and the GPU offers similar CUDA-X deep learning libraries. - -Although Nvidia has backed all its Linux-driven Jetson modules with development kits, the Jetson Nano Dev Kit is its first community-backed, maker-oriented kit. It does not appear to offer open specifications, but it costs only $99 and there’s a forum and other community resources. Many of the specs match or surpass the Raspberry Pi 3B+, including the addition of a 40-pin GPIO. Highlights include an M.2 slot, GbE with Power-over-Ethernet, HDMI 2.0 and eDP links, and 4x USB 3.0 ports. - -**[Coral Dev Board][10]** —Google’s very first Linux maker board arrived earlier this month featuring an NXP i.MX8M and Google’s Edge TPU AI chip—a stripped-down version of Google’s TPU Unit is designed to run TensorFlow Lite ML models. The $150, Raspberry Pi-like Coral Dev Board was joined by a similarly Edge TPU-enabled Coral USB Accelerator USB stick. These will be followed by an Edge TPU based Coral PCIe Accelerator and a Coral SOM compute module. All these devices are backed with schematics, community resources, and other open-spec resources. - -The Coral Dev Board combines the Edge TPU chip with NXP’s quad-core, 1.5GHz Cortex-A53 i.MX8M with a 3D Vivante GPU/VPU and a Cortex-M4 MCU. The SBC is even more like the Raspberry Pi 3B+ than Nvidia’s Dev Kit, mimicking the size and much of the layout and I/O, including the 40-pin GPIO connector. Highlights include 4K-ready GbE, HDMI 2.0a, 4-lane MIPI-DSI and CSI, and USB 3.0 host and Type-C ports. - -**[SBC-C43][11]** —Seco’s commercial, industrial temperature SBC-C43 board is the first SBC based on NXP’s high-end, up to hexa-core i.MX8. The 3.5-inch SBC supports the i.MX8 QuadMax with 2x Cortex-A72 cores and 4x Cortex-A53 cores, the QuadPlus with a single Cortex-A72 and 4x -A53, and the Quad with no -A72 cores and 4x -A53. There are also 2x Cortex-M4F real-time cores and 2x Vivante GPU/VPU cores. Yocto Project, Wind River Linux, and Android are available. - -The feature-rich SBC-C43 supports up to 8GB DDR4 and 32GB eMMC, both soldered for greater reliability. Highlights include dual GbE, HDMI 2.0a in and out ports, WiFi/Bluetooth, and a variety of industrial interfaces. Dual M.2 slots support SATA, wireless, and more. - -**[Nitrogen8M_Mini][12]** —This Boundary Devices cousin to the earlier, i.MX8M based Nitrogen8M is available for $135, with shipments due this Spring. The open-spec Nitrogen8M_Mini is the first SBC to feature NXP’s new i.MX8M Mini SoC. The Mini uses a more advanced 14LPC FinFET process than the i.MX8M, resulting in lower power consumption and higher clock rates for both the 4x Cortex-A53 (1.5GHz to 2GHz) and Cortex-M4 (400MHz) cores. The drawback is that you’re limited to HD video resolution. - -Supported with Linux and Android, the Nitrogen8M_Mini ships with 2GB to 4GB LPDDR4 RAM and 8GB to 128GB eMMC. MIPI-DSI and -CSI interfaces support optional touchscreens and cameras, respectively. A GbE port is standard and PoE and WiFi/BT are optional. Other features include 3x USB ports, one or two PCIe slots, and optional -40 to 85°C support. A Nitrogen8M_Mini SOM module with similar specs is also in the works. - -**[Pine H64 Model B][13]** —Pine64’s latest hacker board was teased in late January as part of an [ambitious roll-out][14] of open source products, including a laptop, tablet, and phone. The Raspberry Pi semi-clone, which recently went on sale for $39 (2GB) or $49 (3GB), showcases the high-end, but low-cost Allwinner H64. The quad -A53 SoC is notable for its 4K video with HDR support. - -The Pine H64 Model B offers up to 128GB eMMC storage, WiFi/BT, and a GbE port. I/O includes 2x USB 2.0 and single USB 3.0 and HDMI 2.0a ports plus SPDIF audio and an RPi-like 40-pin connector. Images include Android 7.0 and an “in progress” Armbian Debian Stretch. - -**[AI-ML Board][15]** —Arrow unveiled this i.MX8X based SBC early this month along with a similarly 96Boards CE Extended format, i.MX8M based Thor96 SBC. While there are plenty of i.MX8M boards these days, we’re more intrigued with the lowest-end i.MX8X member of the i.MX8 family. The AI-ML Board is the first SBC we’ve seen to feature the low-power i.MX8X, which offers up to 4x 64-bit, 1.2GHz Cortex-A35 cores, a 4-shader, 4K-ready Vivante GPU/VPU, a Cortex-M4F chip, and a Tensilica HiFi 4 DSP. - -The open-spec, Yocto Linux driven AI-ML Board is targeted at low-power, camera-equipped applications such as drones. The board has 2GB LPDDR4, Ethernet, WiFi/BT, and a pair each of MIPI-DSI and USB 3.0 ports. Cameras are controlled via the 96Boards 60-pin, high-power GPIO connector, which is joined by the usual 40-pin low-power link. The launch is expected June 1. - -**[BeagleBone AI][16]** —The long-awaited successor to the Cortex-A8 AM3358 based BeagleBone family of boards advances to TIs dual-core Cortex-A15 AM5729, with similar PowerVR GPU and MCU-like PRU cores. The real story, however, is the AI firepower enabled by the SoC’s dual TI C66x DSPs and four embedded-vision-engine (EVE) neural processing cores. BeagleBoard.org claims that calculations for computer-vision models using EVE run at 8x times the performance per watt compared to the similar, but EVE-less, AM5728. The EVE and DSP chips are supported through a TIDL machine learning OpenCL API and pre-installed tools. - -Due to go on sale in April for about $100, the Linux-powered BeagleBone AI is based closely on the BeagleBone Black and offers backward header, mechanical, and software compatibility. It doubles the RAM to 1GB and quadruples the eMMC storage to 16GB. You now get GbE and high-speed WiFi, as well as a USB Type-C port. - -**[Robotics RB3 Platform (DragonBoard 845c)][17]** —Qualcomm and Thundercomm are initially launching their 96Boards CE form factor, Snapdragon 845-based upgrade to the Snapdragon 820-based [DragonBoard 820c][18] SBC as part of a Qualcomm Robotics RB3 Platform. Yet, 96Boards.org has already posted a [DragonBoard 845c product page][17], and we imagine the board will be available in the coming months without all the robotics bells and whistles. A compute module version is also said to be in the works. - -The 10nm, octa-core, “Kryo” based Snapdragon 845 is one of the most powerful Arm SoCs around. It features an advanced Adreno 630 GPU with “eXtended Reality” (XR) VR technology and a Hexagon 685 DSP with a third-gen Neural Processing Engine (NPE) for AI applications. On the RB3 kit, the board’s expansion connectors are pre-stocked with Qualcomm cellular and robotics camera mezzanines. The $449 and up kit also includes standard 4K video and tracking cameras, and there are optional Time-of-Flight (ToF) and stereo SLM camera depth cameras. The SBC runs Linux with ROS (Robot Operating System). - -**[Avenger96][19]** —Like Arrow’s AI-ML Board, the Avenger96 is a 96Boards CE Extended SBC aimed at low-power IoT applications. Yet, the SBC features an even more power-efficient (and slower) SoC: ST’s recently announced [STM32MP153][20]. The Avenger96 runs Linux on the high-end STM32MP157 model, which has dual, 650MHz Cortex-A7 cores, a Cortex-M4, and a Vivante 3D GPU. - -This sandwich-style board features an Avenger96 module with the STM32MP157 SoC, 1GB of DDR3L, 2MB SPI flash, and a power management IC. It’s unclear if the 8GB eMMC and WiFi-ac/Bluetooth 4.2 module are on the module or carrier board. The Avenger96 SBC is further equipped with GbE, HDMI, micro-USB OTG, and dual USB 2.0 host ports. There’s also a microSD slot and the usual 40- and 60-pin GPIO connectors. The board is expected to go on sale in April. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/2019/3/top-10-new-linux-sbcs-watch-2019 - -作者:[Eric Brown][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linux.com/users/ericstephenbrown -[b]: https://github.com/lujun9972 -[1]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/aaeon_upxtreme.jpg?itok=QnwAt3mp (UP Xtreme) -[2]: /LICENSES/CATEGORY/USED-PERMISSION -[3]: https://www.globenewswire.com/news-release/2019/02/13/1724445/0/en/Single-Board-Computer-Market-to-surpass-1bn-by-2025-Global-Market-Insights-Inc.html -[4]: https://www.linux.com/blog/2019/1/linux-hacker-board-trends-2018-and-beyond -[5]: http://linuxgizmos.com/catalog-of-122-open-spec-linux-hacker-boards/ -[6]: https://www.embedded-world.de/en -[7]: https://www.linux.com/news/2019/2/embedded-linux-software-highlights-embedded-world -[8]: http://linuxgizmos.com/latest-up-board-combines-whiskey-lake-with-ai-core-x-modules/ -[9]: http://linuxgizmos.com/trimmed-down-jetson-nano-modules-ships-on-99-linux-dev-kit/ -[10]: http://linuxgizmos.com/google-launches-i-mx8m-dev-board-with-edge-tpu-ai-chip/ -[11]: http://linuxgizmos.com/first-i-mx8-quadmax-sbc-breaks-cover/ -[12]: http://linuxgizmos.com/open-spec-nitrogen8m_mini-sbc-ships-along-with-new-mini-based-som/ -[13]: http://linuxgizmos.com/revised-allwiner-h64-based-pine-h64-sbc-has-rpi-size-and-gpio/ -[14]: https://www.linux.com/blog/2019/2/pine64-launch-open-source-phone-laptop-tablet-and-camera -[15]: http://linuxgizmos.com/arrows-latest-96boards-sbcs-tap-i-mx8x-and-i-mx8m/ -[16]: http://linuxgizmos.com/beaglebone-ai-sbc-features-dual-a15-soc-with-eve-ai-cores/ -[17]: http://linuxgizmos.com/robotics-kit-runs-linux-on-new-dragonboard-845c-96boards-sbc/ -[18]: http://linuxgizmos.com/debian-driven-dragonboard-expands-to-96boards-extended-spec/ -[19]: http://linuxgizmos.com/sandwich-style-96boards-sbc-runs-linux-on-sts-new-cortex-a7-m4-soc/ -[20]: https://www.linux.com/news/2019/2/st-spins-its-first-linux-powered-cortex-soc diff --git a/sources/tech/20190322 How to Install OpenLDAP on Ubuntu Server 18.04.md b/sources/tech/20190322 How to Install OpenLDAP on Ubuntu Server 18.04.md deleted file mode 100644 index a4325fe74b..0000000000 --- a/sources/tech/20190322 How to Install OpenLDAP on Ubuntu Server 18.04.md +++ /dev/null @@ -1,205 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Install OpenLDAP on Ubuntu Server 18.04) -[#]: via: (https://www.linux.com/blog/2019/3/how-install-openldap-ubuntu-server-1804) -[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) - -How to Install OpenLDAP on Ubuntu Server 18.04 -====== - -![OpenLDAP][1] - -In part one of this short tutorial series, Jack Wallen explains how to install OpenLDAP. - -[Creative Commons Zero][2] - -The Lightweight Directory Access Protocol (LDAP) allows for the querying and modification of an X.500-based directory service. In other words, LDAP is used over a Local Area Network (LAN) to manage and access a distributed directory service. LDAPs primary purpose is to provide a set of records in a hierarchical structure. What can you do with those records? The best use-case is for user validation/authentication against desktops. If both server and client are set up properly, you can have all your Linux desktops authenticating against your LDAP server. This makes for a great single point of entry so that you can better manage (and control) user accounts. - -The most popular iteration of LDAP for Linux is [OpenLDAP][3]. OpenLDAP is a free, open-source implementation of the Lightweight Directory Access Protocol, and makes it incredibly easy to get your LDAP server up and running. - -In this three-part series, I’ll be walking you through the steps of: - - 1. Installing OpenLDAP server. - - 2. Installing the web-based LDAP Account Manager. - - 3. Configuring Linux desktops, such that they can communicate with your LDAP server. - - - - -In the end, all of your Linux desktop machines (that have been configured properly) will be able to authenticate against a centralized location, which means you (as the administrator) have much more control over the management of users on your network. - -In this first piece, I’ll be demonstrating the installation and configuration of OpenLDAP on Ubuntu Server 18.04. All you will need to make this work is a running instance of Ubuntu Server 18.04 and a user account with sudo privileges. -Let’s get to work. - -### Update/Upgrade - -The first thing you’ll want to do is update and upgrade your server. Do note, if the kernel gets updated, the server will need to be rebooted (unless you have Live Patch, or a similar service running). Because of this, run the update/upgrade at a time when the server can be rebooted. -To update and upgrade Ubuntu, log into your server and run the following commands: - -``` -sudo apt-get update - -sudo apt-get upgrade -y -``` - -When the upgrade completes, reboot the server (if necessary), and get ready to install and configure OpenLDAP. - -### Installing OpenLDAP - -Since we’ll be using OpenLDAP as our LDAP server software, it can be installed from the standard repository. To install the necessary pieces, log into your Ubuntu Server and issue the following command: - -### sudo apt-get instal slapd ldap-utils -y - -During the installation, you’ll be first asked to create an administrator password for the LDAP directory. Type and verify that password (Figure 1). - -![password][4] - -Figure 1: Creating an administrator password for LDAP. - -[Used with permission][5] - -Configuring LDAP - -With the installation of the components complete, it’s time to configure LDAP. Fortunately, there’s a handy tool we can use to make this happen. From the terminal window, issue the command: - -``` -sudo dpkg-reconfigure slapd -``` - -In the first window, hit Enter to select No and continue on. In the second window of the configuration tool (Figure 2), you must type the DNS domain name for your server. This will serve as the base DN (the point from where a server will search for users) for your LDAP directory. In my example, I’ve used example.com (you’ll want to change this to fit your needs). - -![domain name][6] - -Figure 2: Configuring the domain name for LDAP. - -[Used with permission][5] - -In the next window, type your Organizational name (ie the name of your company or department). You will then be prompted to (once again) create an administrator password (you can use the same one as you did during the installation). Once you’ve taken care of that, you’ll be asked the following questions: - - * Database backend to use - select **MDB**. - - * Do you want the database to be removed with slapd is purged? - Select **No.** - - * Move old database? - Select **Yes.** - - - - -OpenLDAP is now ready for data. - -### Adding Initial Data - -Now that OpenLDAP is installed and running, it’s time to populate the directory with a bit of initial data. In the second piece of this series, we’ll be installing a web-based GUI that makes it much easier to handle this task, but it’s always good to know how to add data the manual way. - -One of the best ways to add data to the LDAP directory is via text file, which can then be imported in with the __ldapadd__ command. Create a new file with the command: - -``` -nano ldap_data.ldif -``` - -In that file, paste the following contents: - -``` -dn: ou=People,dc=example,dc=com - -objectClass: organizationalUnit - -ou: People - - -dn: ou=Groups,dc=EXAMPLE,dc=COM - -objectClass: organizationalUnit - -ou: Groups - - -dn: cn=DEPARTMENT,ou=Groups,dc=EXAMPLE,dc=COM - -objectClass: posixGroup - -cn: SUBGROUP - -gidNumber: 5000 - - -dn: uid=USER,ou=People,dc=EXAMPLE,dc=COM - -objectClass: inetOrgPerson - -objectClass: posixAccount - -objectClass: shadowAccount - -uid: USER - -sn: LASTNAME - -givenName: FIRSTNAME - -cn: FULLNAME - -displayName: DISPLAYNAME - -uidNumber: 10000 - -gidNumber: 5000 - -userPassword: PASSWORD - -gecos: FULLNAME - -loginShell: /bin/bash - -homeDirectory: USERDIRECTORY -``` - -In the above file, every entry in all caps needs to be modified to fit your company needs. Once you’ve modified the above file, save and close it with the [Ctrl]+[x] key combination. - -To add the data from the file to the LDAP directory, issue the command: - -``` -ldapadd -x -D cn=admin,dc=EXAMPLE,dc=COM -W -f ldap_data.ldif -``` - -Remember to alter the dc entries (EXAMPLE and COM) in the above command to match your domain name. After running the command, you will be prompted for the LDAP admin password. When you successfully authentication to the LDAP server, the data will be added. You can then ensure the data is there, by running a search like so: - -``` -ldapsearch -x -LLL -b dc=EXAMPLE,dc=COM 'uid=USER' cn gidNumber -``` - -Where EXAMPLE and COM is your domain name and USER is the user to search for. The command should report the entry you searched for (Figure 3). - -![search][7] - -Figure 3: Our search was successful. - -[Used with permission][5] - -Now that you have your first entry into your LDAP directory, you can edit the above file to create even more. Or, you can wait until the next entry into the series (installing LDAP Account Manager) and take care of the process with the web-based GUI. Either way, you’re one step closer to having LDAP authentication on your network. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/2019/3/how-install-openldap-ubuntu-server-1804 - -作者:[Jack Wallen][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linux.com/users/jlwallen -[b]: https://github.com/lujun9972 -[1]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldap.png?itok=r9viT8n6 (OpenLDAP) -[2]: /LICENSES/CATEGORY/CREATIVE-COMMONS-ZERO -[3]: https://www.openldap.org/ -[4]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldap_1.jpg?itok=vbWScztB (password) -[5]: /LICENSES/CATEGORY/USED-PERMISSION -[6]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldap_2.jpg?itok=10CSCm6Z (domain name) -[7]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldap_3.jpg?itok=df2Y65Dv (search) diff --git a/sources/tech/20190322 How to set up Fedora Silverblue as a gaming station.md b/sources/tech/20190322 How to set up Fedora Silverblue as a gaming station.md deleted file mode 100644 index 2d794f2d29..0000000000 --- a/sources/tech/20190322 How to set up Fedora Silverblue as a gaming station.md +++ /dev/null @@ -1,100 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to set up Fedora Silverblue as a gaming station) -[#]: via: (https://fedoramagazine.org/set-up-fedora-silverblue-gaming-station/) -[#]: author: (Michal Konečný https://fedoramagazine.org/author/zlopez/) - -How to set up Fedora Silverblue as a gaming station -====== - -![][1] - -This article gives you a step by step guide to turn your Fedora Silverblue into an awesome gaming station with the help of Flatpak and Steam. - -Note: Do you need the NVIDIA proprietary driver on Fedora 29 Silverblue for a complete experience? Check out [this blog post][2] for pointers. - -### Add the Flathub repository - -This process starts with a clean Fedora 29 Silverblue installation with a user already created for you. - -First, go to and enable the Flathub repository on your system. To do this, click the _Quick setup_ button on the main page. - -![Quick setup button on flathub.org/home][3] - -This redirects you to where you should click on the Fedora icon. - -![Fedora icon on flatpak.org/setup][4] - -Now you just need to click on _Flathub repository file._ Open the downloaded file with the _Software Install_ application. - -![Flathub repository file button on flatpak.org/setup/Fedora][5] - -The GNOME Software application opens. Next, click on the _Install_ button. This action needs _sudo_ permissions, because it installs the Flathub repository for use by the whole system. - -![Install button in GNOME Software][6] - -### Install the Steam flatpak - -You can now search for the S _team_ flatpak in _GNOME Software_. If you can’t find it, try rebooting — or logout and login — in case _GNOME Software_ didn’t read the metadata. That happens automatically when you next login. - -![Searching for Steam][7] - -Click on the _Steam_ row and the _Steam_ page opens in _GNOME Software._ Next, click on _Install_. - -![Steam page in GNOME Software][8] - -And now you have installed _Steam_ flatpak on your system. - -### Enable Steam Play in Steam - -Now that you have _Steam_ installed, launch it and log in. To play Windows games too, you need to enable _Steam Play_ in _Steam._ To enable it, choose _Steam > Settings_ from the menu in the main window. - -![Settings button in Steam][9] - -Navigate to the _Steam Play_ section. You should see the option _Enable Steam Play for supported titles_ is already ticked, but it’s recommended you also tick the _Enable Steam Play_ option for all other titles. There are plenty of games that are actually playable, but not whitelisted yet on _Steam._ To see which games are playable, visit [ProtonDB][10] and search for your favorite game. Or just look for the games with the most platinum reports. - -![Steam Play settings menu on Steam][11] - -If you want to know more about Steam Play, you can read the [article][12] about it here on Fedora Magazine: - -> [Play Windows games on Fedora with Steam Play and Proton][12] - -### Appendix - -You’re now ready to play plenty of games on Linux. Please remember to share your experience with others using the _Contribute_ button on [ProtonDB][10] and report bugs you find on [GitHub][13], because sharing is nice. 🙂 - -* * * - -_Photo by _[ _Hardik Sharma_][14]_ on _[_Unsplash_][15]_._ - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/set-up-fedora-silverblue-gaming-station/ - -作者:[Michal Konečný][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/zlopez/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/03/silverblue-gaming-816x345.jpg -[2]: https://blogs.gnome.org/alexl/2019/03/06/nvidia-drivers-in-fedora-silverblue/ -[3]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-15-12-29-00.png -[4]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-15-12-36-35-1024x713.png -[5]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-15-12-45-12.png -[6]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-15-12-57-37.png -[7]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-15-13-08-21.png -[8]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-15-13-13-59-1024x769.png -[9]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-15-13-30-20.png -[10]: https://www.protondb.com/ -[11]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-15-13-41-53.png -[12]: https://fedoramagazine.org/play-windows-games-steam-play-proton/ -[13]: https://github.com/ValveSoftware/Proton -[14]: https://unsplash.com/photos/I7rXyzBNVQM?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText -[15]: https://unsplash.com/search/photos/video-game-laptop?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20190322 Printing from the Linux command line.md b/sources/tech/20190322 Printing from the Linux command line.md deleted file mode 100644 index 75aec13bb3..0000000000 --- a/sources/tech/20190322 Printing from the Linux command line.md +++ /dev/null @@ -1,177 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Printing from the Linux command line) -[#]: via: (https://www.networkworld.com/article/3373502/printing-from-the-linux-command-line.html) -[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) - -Printing from the Linux command line -====== - -There's a lot more to printing from the Linux command line than the lp command. Check out some of the many available options. - -![Sherry \(CC BY 2.0\)][1] - -Printing from the Linux command line is easy. You use the **lp** command to request a print, and **lpq** to see what print jobs are in the queue, but things get a little more complicated when you want to print double-sided or use portrait mode. And there are lots of other things you might want to do — such as printing multiple copies of a document or canceling a print job. Let's check out some options for getting your printouts to look just the way you want them to when you're printing from the command line. - -### Displaying printer settings - -To view your printer settings from the command line, use the **lpoptions** command. The output should look something like this: - -``` -$ lpoptions -copies=1 device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=1553023232 marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 marker-levels=18,62,62,63 marker-names='Black\ Cartridge\ HP\ CC530A,Cyan\ Cartridge\ HP\ CC531A,Magenta\ Cartridge\ HP\ CC533A,Yellow\ Cartridge\ HP\ CC532A' marker-types=toner,toner,toner,toner number-up=1 printer-commands=none printer-info='HP Color LaserJet CP2025dn (F47468)' printer-is-accepting-jobs=true printer-is-shared=true printer-is-temporary=false printer-location printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' printer-state=3 printer-state-change-time=1553023232 printer-state-reasons=none printer-type=167964 printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn sides=one-sided -``` - -This output is likely to be a little more human-friendly if you turn its blanks into carriage returns. Notice how many settings are listed. - -NOTE: In the output below, some lines have been reconnected to make this output more readable. - -``` -$ lpoptions | tr " " '\n' -copies=1 -device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ -finishings=3 -job-cancel-after=10800 -job-hold-until=no-hold -job-priority=50 -job-sheets=none,none -marker-change-time=1553023232 -marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 -marker-levels=18,62,62,63 -marker-names='Black\ Cartridge\ HP\ CC530A, -Cyan\ Cartridge\ HP\ CC531A, -Magenta\ Cartridge\ HP\ CC533A, -Yellow\ Cartridge\ HP\ CC532A' -marker-types=toner,toner,toner,toner -number-up=1 -printer-commands=none -printer-info='HP Color LaserJet CP2025dn (F47468)' -printer-is-accepting-jobs=true -printer-is-shared=true -printer-is-temporary=false -printer-location -printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' -printer-state=3 -printer-state-change-time=1553023232 -printer-state-reasons=none -printer-type=167964 -printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn -sides=one-sided -``` - -With the **-v** option, the **lpinfo** command will list drivers and related information. - -``` -$ lpinfo -v -network ipp -network https -network socket -network beh -direct hp -network lpd -file cups-brf:/ -network ipps -network http -direct hpfax -network dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ <== printer -network socket://192.168.0.23 <== printer IP -``` - -The lpoptions command will show the settings of your default printer. Use the **-p** option to specify one of a number of available printers. - -``` -$ lpoptions -p LaserJet -``` - -The **lpstat -p** command displays the status of a printer while **lpstat -p -d** also lists available printers. - -``` -$ lpstat -p -d -printer Color-LaserJet-CP2025dn is idle. enabled since Tue 19 Mar 2019 05:07:45 PM EDT -system default destination: Color-LaserJet-CP2025dn -``` - -### Useful commands - -To print a document on the default printer, just use the **lp** command followed by the name of the file you want to print. If the filename includes blanks (rare on Linux systems), either put the name in quotes or start entering the file name and press the tab key to invoke file completion (as shown in the second example below). - -``` -$ lp "never leave home angry" -$ lp never\ leave\ home\ angry -``` - -The **lpq** command displays the print queue. - -``` -$ lpq -Color-LaserJet-CP2025dn is ready and printing -Rank Owner Job File(s) Total Size -active shs 234 agenda 2048 bytes -``` - -With the **-n** option, the lp command allows you to specify the number of copies of a printout you want. - -``` -$ lp -n 11 agenda -``` - -To cancel a print job, you can use the **cancel** or **lprm** command. If you don't act quickly, you might see this: - -``` -$ cancel 229 -cancel: cancel-job failed: Job #229 is already completed - can't cancel. -``` - -### Two-sided printing - -To print in two-sided mode, you can issue your lp command with a **sides** option that says both to print on both sides of the paper and which edge to turn the paper on. This setting represents the normal way that you would expect two-sided portrait documents to look. - -``` -$ lp -o sides=two-sided-long-edge Notes.pdf -``` - -If you want all of your documents to print in two-side mode, you can change your lp settings by using the **lpoptions** command to change the setting for **sides**. - -``` -$ lpoptions -o sides=two-sided-short-edge -``` - -To revert to single-sided printing, you would use a command like this one: - -``` -$ lpoptions -o sides=one-sided -``` - -#### Printing in landscape mode - -To print in landscape mode, you would use the **landscape** option with the lp command. - -``` -$ lp -o landscape penguin.jpg -``` - -### CUPS - -The print system used on Linux systems is the standards-based, open source printing system called CUPS, originally standing for **Common Unix Printing System**. It allows a computer to act as a print server. - -Join the Network World communities on [Facebook][2] and [LinkedIn][3] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3373502/printing-from-the-linux-command-line.html - -作者:[Sandra Henry-Stocker][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/03/printouts-paper-100791390-large.jpg -[2]: https://www.facebook.com/NetworkWorld/ -[3]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190325 Backup on Fedora Silverblue with Borg.md b/sources/tech/20190325 Backup on Fedora Silverblue with Borg.md deleted file mode 100644 index 8aa5c65139..0000000000 --- a/sources/tech/20190325 Backup on Fedora Silverblue with Borg.md +++ /dev/null @@ -1,314 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Backup on Fedora Silverblue with Borg) -[#]: via: (https://fedoramagazine.org/backup-on-fedora-silverblue-with-borg/) -[#]: author: (Steven Snow https://fedoramagazine.org/author/jakfrost/) - -Backup on Fedora Silverblue with Borg -====== - -![][1] - -When it comes to backing up a Fedora Silverblue system, some of the traditional tools may not function as expected. BorgBackup (Borg) is an alternative available that can provide backup capability for your Silverblue based systems. This how-to explains the steps for using BorgBackup 1.1.8 as a layered package to back up Fedora Silverblue 29 system. - -On a normal Fedora Workstation system, _dnf_ is used to install a package. However, on Fedora Silverblue, _rpm-ostree install_ is used to install new software. This is termed layering on the Silverblue system, since the core ostree is an immutable image and the rpm package is layered onto the core system during the install process resulting in a new local image with the layered package. - -> “BorgBackup (short: Borg) is a deduplicating backup program. Optionally, it supports compression and authenticated encryption.” -> -> From the Borg website - -Additionally, the main way to interact with Borg is via the command line. Reading the Quick Start guide it becomes apparent that Borg is well suited to scripting. In fact, it is pretty much necessary to use some form of shell script when performing repeated thorough backup’s of a system. A basic script is provided in the [Borg Quick Start guide][2] , as a point to get started. - -### Installing Borg - -In a terminal, type the following command to install BorgBackup as a layered package: - -``` -$rpm-ostree install borgbackup -``` -This installs BorgBackup to the Fedora Silverblue system. To use it, reboot into the new ostree with: - -``` -$systemctl reboot -``` - -Now Borg is installed, and ready to use. - -### Some notes about Silverblue and its file system, layered packages and flatpaks - -#### The file system - -Silverblue is an immutable operating system based on ostree, with support for layering rpm’s through the use of rpm-ostree. At the user level, this means the path that appears as _/home_ in a flatpak, will actually be _/var/home_ to the system. For programs like Borg, and other backup tools this is important to remember since they often require the actual path, so in this example that would be _/var/home_ instead of just _/home_. - -Before starting a backup it’s a good idea to understand where potential data could be stored, and then if that data should be backed up. Silverblue’s file system layout is very specific with respect to what is writable and what is not. On Silverblue _/etc_ and _/var_ are the only places that are not immutable, therefore writable. On a single user system, typically the user home directory would be a likely choice for data backup. Normally excluding Downloads, but including Documents and more. Also, _/etc_ is a logical choice for some configuration options you don’t want to go through again. Take notes of what to exclude from your home directory and from _/etc_. Some files and subdirectories of /etc you need root or sudo privileges to access. - -#### Flatpaks - -Flatpak applications store data in your home directory under _$HOME/.var/app/flatpakapp_ , regardless of whether they were installed as user or system. If installed at a user level, there is also data found in _$HOME/.local/share/flatpak/app/_ , or if installed at a system level it will be found in _/var/lib/flatpak/app_ For the purposes of this article, it was enough to list the flatpak’s installed and redirect the output to a file for backing up. Reasoning that if there is a need to reinstall them (flatpaks) the list file could be used to do it from. For a more robust approach, examining the flatpak file system layouts can be done [here.][3] - -#### Layering and rpm-ostree - -There is no easy way for a user to retrieve the layered package information aside from the - -$rpm-ostree status - -command. Which shows the current and previous ostree commit’s layered packages, and if any commits are pinned they would be listed too. Below is the output on my system, note the LayeredPackages label at the end of each commit listing. - -![][4] - -The command - -$ostree log - -is useful to retrieve a history of commits for the system. Type it in your terminal to see the output. - -### Preparing the backup repo - -In order to use Borg to back up a system, you need to first initialize a Borg repo. Before initializing, the decision must be made to use encryption (or not) and if so, what mode. - -With Borg the data can be protected using 256-bit AES encryption. The integrity and authenticity of the data, which is encrypted on the clientside, is verified using HMAC-SHA256. The encryption modes are listed below. - -#### Encryption modes - -Hash/MAC | Not encrypted no auth | Not encrypted, but authenticated | Encrypted (AEAD w/ AES) and authenticated ----|---|---|--- -SHA-256 | none | authenticated | repokey keyfile -BLAKE2b | n/a | authenticated-blake2 | repokey-blake2 keyfile-blake2 - -The encryption mode decided on was keyfile-blake2, which requires a passphrase to be entered as well as the keyfile being needed. - -Borg can use the following compression types which you can specify at backup creation time. - - * lz4 (super fast, low compression) - * zstd (wide range from high speed and low compression to high compression and lower speed) - * zlib (medium speed and compression) - * lzma (low speed, high compression) - - - -For compression lzma was chosen at setting 6, the highest sensible compression level. The initial backup took 4 minutes 59.98 seconds to complete, while subsequent ones have taken less than 20 seconds as a rule. - -#### Borg init - -To be able to perform backups with Borg, first, create a directory for your Borg repo: - -``` -$mkdir borg_testdir -``` - -and then change to it. - -``` -$cd borg_testdir -``` - -Next, initialize the Borg repo with the borg init command: - -``` -$borg init -e=keyfile-blake2 . -``` - -Borg will prompt for your passphrase, which is case sensitive, and at creation must be entered twice. A suitable passphrase of alpha-numeric characters and symbols, and of a reasonable length should be created. It can be changed later on if needed without affecting the keyfile, or your encrypted data. The keyfile can be exported and should be for backup purposes, along with the passphrase, and stored somewhere secure. - -#### Creating a backup - -Next, create a test backup of the Documents directory, remember on Silverblue the actual path to the user Documents directory is _/var/home/username/Documents_. In practice on Silverblue, it is suitable to use _~/_ or _$HOME_ to indicate your home directory. The distinction between the actual path and environment variables being the real path does not change whereas the environment variable can be changed. From within the Borg repo, type the following command - -``` -$borg create .::borgtest /var/home/username/Documents -``` - -and that will create a backup of the Documents directory named **borgtest**. To break down the command a bit; **create** requires a **repo location** , in this case **.** since we are in the **top level** of the **repo**. That makes the path **.::borgtest** for the backup name. Finally **/var/home/username/Documents** is the location of the data we are backing up. - -The following command - -``` -$borg list -``` - -returns a listing of your backups, after a few days it look similar to this: - -![Output of borg list command in my backup repo.][5] - -To delete the test backup, type the following in the terminal - -``` -$borg delete .::borgtest -``` - -at this time Borg will prompt for the encryption passphrase in order to delete the backup. - -### Pulling it together into a shell script - -As mentioned Borg is an eminently script friendly tool. The Borg documentation links provided are great places to find out more about BorgBackup, and there is more. The example script provided by Borg was modified to suit this article. Below is a version with the basic parts that others could use as a starting point if desired. It tries to capture the three information pieces of the system and apps mentioned earlier. The output of _flatpak list_ , _rpm-ostree status_ , and _ostree log_ as human readable files given the same names each time so overwritten each time. The repo setup had to be changed since the original example is for a remote server login with ssh, and this was intended to be used locally. The other changes mostly involved correcting directory paths, tailoring the excluded content to suit this systems home directory, and choosing the compression. -``` -#!/bin/sh - - - -# This gets the ostree commit data, this file is overwritten each time - -sudo ostree log fedora-workstation:fedora/29/x86_64/silverblue > ostree.log - - - -rpm-ostree status > rpm-ostree-status.lst - - - -# Flatpaks get listed too - -flatpak list > flatpak.lst - - - -# Setting this, so the repo does not need to be given on the commandline: - -export BORG_REPO=/var/home/usernamehere/borg_testdir - - - -# Setting this, so you won't be asked for your repository passphrase:(Caution advised!) - -export BORG_PASSPHRASE='usercomplexpassphrasehere' - - - -# some helpers and error handling: - -info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; } - -trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM - - - -info "Starting backup" - - - -# Backup the most important directories into an archive named after - -# the machine this script is currently running on: - -borg create \ - - --verbose \ - - --filter AME \ - - --list \ - - --stats \ - - --show-rc \ - - --compression auto,lzma,6 \ - - --exclude-caches \ - - --exclude '/var/home/*/borg_testdir'\ - - --exclude '/var/home/*/Downloads/'\ - - --exclude '/var/home/*/.var/' \ - - --exclude '/var/home/*/Desktop/'\ - - --exclude '/var/home/*/bin/' \ - - \ - - ::'{hostname}-{now}' \ - - /etc \ - - /var/home/ssnow \ - - - - backup_exit=$? - - - - info "Pruning repository" - - - - # Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly - - # archives of THIS machine. The '{hostname}-' prefix is very important to - - # limit prune's operation to this machine's archives and not apply to - - # other machines' archives also: - - - - borg prune \ - - --list \ - - --prefix '{hostname}-' \ - - --show-rc \ - - --keep-daily 7 \ - - --keep-weekly 4 \ - - --keep-monthly 6 \ - - - - prune_exit=$? - - - - # use highest exit code as global exit code - - global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit )) - - - - if [ ${global_exit} -eq 0 ]; then - - info "Backup and Prune finished successfully" - - elif [ ${global_exit} -eq 1 ]; then - - info "Backup and/or Prune finished with warnings" - - else - - info "Backup and/or Prune finished with errors" - - fi - - - - exit ${global_exit} -``` - -This listing is missing some more excludes that were specific to the test system setup and backup intentions, and is very basic with room for customization and improvement. For this test to write an article it wasn’t a problem having the passphrase inside of a shell script file. Under normal use it is better to enter the passphrase each time when performing the backup. - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/backup-on-fedora-silverblue-with-borg/ - -作者:[Steven Snow][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/2019/03/borg-816x345.jpg -[2]: https://borgbackup.readthedocs.io/en/stable/quickstart.html -[3]: https://github.com/flatpak/flatpak/wiki/Filesystem -[4]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-18-17-11-21-1024x285.png -[5]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-18-18-56-03.png diff --git a/sources/tech/20190325 Contribute at the Fedora Test Day for Fedora Modularity.md b/sources/tech/20190325 Contribute at the Fedora Test Day for Fedora Modularity.md deleted file mode 100644 index 3de297db06..0000000000 --- a/sources/tech/20190325 Contribute at the Fedora Test Day for Fedora Modularity.md +++ /dev/null @@ -1,50 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Contribute at the Fedora Test Day for Fedora Modularity) -[#]: via: (https://fedoramagazine.org/contribute-at-the-fedora-test-day-for-fedora-modularity/) -[#]: author: (Sumantro Mukherjee https://fedoramagazine.org/author/sumantrom/) - -Contribute at the Fedora Test Day for Fedora Modularity -====== - -![][1] - -Modularity lets you keep the right version of an application, language runtime, or other software on your Fedora system even as the operating system is updated. You can read more about Modularity in general on the [Fedora documentation site][2]. - -The Modularity folks have been working on Modules for everyone. As a result, the Fedora Modularity and QA teams have organized a test day for **Tuesday, March 26, 2019**. Refer to the [wiki page][3] for links to the test images you’ll need to participate. Read on for more information on the test day. - -### How do test days work? - -A test day is an event where anyone can help make sure changes in Fedora work well in an upcoming release. Fedora community members often participate, and the public is welcome at these events. If you’ve never contributed before, this is a perfect way to get started. - -To contribute, you only need to be able to do the following things: - - * Download test materials, which include some large files - * Read and follow directions step by step - - - -The [wiki page][3] for the modularity test day has a lot of good information on what and how to test. After you’ve done some testing, you can log your results in the test day [web application][4]. If you’re available on or around the day of the event, please do some testing and report your results. - -Happy testing, and we hope to see you on test day. - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/contribute-at-the-fedora-test-day-for-fedora-modularity/ - -作者:[Sumantro Mukherjee][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/sumantrom/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2015/03/test-days-945x400.png -[2]: https://docs.fedoraproject.org/en-US/modularity/ -[3]: https://fedoraproject.org/wiki/Test_Day:2019-03-26_Modularity_Test_Day -[4]: http://testdays.fedorainfracloud.org/events/61 diff --git a/sources/tech/20190325 How Open Source Is Accelerating NFV Transformation.md b/sources/tech/20190325 How Open Source Is Accelerating NFV Transformation.md deleted file mode 100644 index 22f7df8876..0000000000 --- a/sources/tech/20190325 How Open Source Is Accelerating NFV Transformation.md +++ /dev/null @@ -1,77 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How Open Source Is Accelerating NFV Transformation) -[#]: via: (https://www.linux.com/blog/2019/3/how-open-source-accelerating-nfv-transformation) -[#]: author: (Pam Baker https://www.linux.com/users/pambaker) - -How Open Source Is Accelerating NFV Transformation -====== - -![NFV][1] - -In anticipation of the upcoming Open Networking Summit, we talked with Thomas Nadeau, Technical Director NFV at Red Hat, about the role of open source in innovation for telecommunications service providers. - -[Creative Commons Zero][2] - -Red Hat is noted for making open source a culture and business model, not just a way of developing software, and its message of [open source as the path to innovation][3] resonates on many levels. - -In anticipation of the upcoming [Open Networking Summit][4], we talked with [Thomas Nadeau][5], Technical Director NFV at Red Hat, who gave a [keynote address][6] at last year’s event, to hear his thoughts regarding the role of open source in innovation for telecommunications service providers. - -One reason for open source’s broad acceptance in this industry, he said, was that some very successful projects have grown too large for any one company to manage, or single-handedly push their boundaries toward additional innovative breakthroughs. - -“There are projects now, like Kubernetes, that are too big for any one company to do. There's technology that we as an industry need to work on, because no one company can push it far enough alone,” said Nadeau. “Going forward, to solve these really hard problems, we need open source and the open source software development model.” - -Here are more insights he shared on how and where open source is making an innovative impact on telecommunications companies. - -**Linux.com: Why is open source central to innovation in general for telecommunications service providers?** - -**Nadeau:** The first reason is that the service providers can be in more control of their own destiny. There are some service providers that are more aggressive and involved in this than others. Second, open source frees service providers from having to wait for long periods for the features they need to be developed. - -And third, open source frees service providers from having to struggle with using and managing monolith systems when all they really wanted was a handful of features. Fortunately, network equipment providers are responding to this overkill problem. They're becoming much more flexible, more modular, and open source is the best means to achieve that. - -**Linux.com: In your ONS keynote presentation, you said open source levels the playing field for traditional carriers in competing with cloud-scale companies in creating digital services and revenue streams. Please explain how open source helps.** - -**Nadeau:** Kubernetes again. OpenStack is another one. These are tools that these businesses really need, not to just expand, but to exist in today's marketplace. Without open source in that virtualization space, you’re stuck with proprietary monoliths, no control over your future, and incredibly long waits to get the capabilities you need to compete. - -There are two parts in the NFV equation: the infrastructure and the applications. NFV is not just the underlying platforms, but this constant push and pull between the platforms and the applications that use the platforms. - -NFV is really virtualization of functions. It started off with monolithic virtual machines (VMs). Then came "disaggregated VMs" where individual functions, for a variety of reasons, were run in a more distributed way. To do so meant separating them, and this is where SDN came in, with the separation of the control plane from the data plane. Those concepts were driving changes in the underlying platforms too, which drove up the overhead substantially. That in turn drove interest in container environments as a potential solution, but it's still NFV. - -You can think of it as the latest iteration of SOA with composite applications. Kubernetes is the kind of SOA model that they had at Google, which dropped the worry about the complicated networking and storage underneath and simply allowed users to fire up applications that just worked. And for the enterprise application model, this works great. - -But not in the NFV case. In the NFV case, in the previous iteration of the platform at OpenStack, everybody enjoyed near one-for-one network performance. But when we move it over here to OpenShift, we're back to square one where you lose 80% of the performance because of the latest SOA model that they've implemented. And so now evolving the underlying platform rises in importance, and so the pendulum swing goes, but it's still NFV. Open source allows you to adapt to these changes and influences effectively and quickly. Thus innovations happen rapidly and logically, and so do their iterations. - -**Linux.com: Tell us about the underlying Linux in NFV, and why that combo is so powerful.** - -**Nadeau:** Linux is open source and it always has been in some of the purest senses of open source. The other reason is that it's the predominant choice for the underlying operating system. The reality is that all major networks and all of the top networking companies run Linux as the base operating system on all their high-performance platforms. Now it's all in a very flexible form factor. You can lay it on a Raspberry Pi, or you can lay it on a gigantic million-dollar router. It's secure, it's flexible, and scalable, so operators can really use it as a tool now. - -**Linux.com: Carriers are always working to redefine themselves. Indeed, many are actively seeking ways to move out of strictly defensive plays against disruptors, and onto offense where they ARE the disruptor. How can network function virtualization (NFV) help in either or both strategies?** - -**Nadeau:** Telstra and Bell Canada are good examples. They are using open source code in concert with the ecosystem of partners they have around that code which allows them to do things differently than they have in the past. There are two main things they do differently today. One is they design their own network. They design their own things in a lot of ways, whereas before they would possibly need to use a turnkey solution from a vendor that looked a lot, if not identical, to their competitors’ businesses. - -These telcos are taking a real “in-depth, roll up your sleeves” approach. ow that they understand what they're using at a much more intimate level, they can collaborate with the downstream distro providers or vendors. This goes back to the point that the ecosystem, which is analogous to partner programs that we have at Red Hat, is the glue that fills in gaps and rounds out the network solution that the telco envisions. - -_Learn more at[Open Networking Summit][4], happening April 3-5 at the San Jose McEnery Convention Center._ - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/2019/3/how-open-source-accelerating-nfv-transformation - -作者:[Pam Baker][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linux.com/users/pambaker -[b]: https://github.com/lujun9972 -[1]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/nfv-443852_1920.jpg?itok=uFbzmEPY (NFV) -[2]: /LICENSES/CATEGORY/CREATIVE-COMMONS-ZERO -[3]: https://www.linuxfoundation.org/blog/2018/02/open-source-standards-team-red-hat-measures-open-source-success/ -[4]: https://events.linuxfoundation.org/events/open-networking-summit-north-america-2019/ -[5]: https://www.linkedin.com/in/tom-nadeau/ -[6]: https://onseu18.sched.com/event/Fmpr diff --git a/sources/tech/20190325 Reducing sysadmin toil with Kubernetes controllers.md b/sources/tech/20190325 Reducing sysadmin toil with Kubernetes controllers.md deleted file mode 100644 index 80ddb77264..0000000000 --- a/sources/tech/20190325 Reducing sysadmin toil with Kubernetes controllers.md +++ /dev/null @@ -1,166 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Reducing sysadmin toil with Kubernetes controllers) -[#]: via: (https://opensource.com/article/19/3/reducing-sysadmin-toil-kubernetes-controllers) -[#]: author: (Paul Czarkowski https://opensource.com/users/paulczar) - -Reducing sysadmin toil with Kubernetes controllers -====== - -Controllers can ease a sysadmin's workload by handling things like creating and managing DNS addresses and SSL certificates. - -![][1] - -Kubernetes is a platform for reducing toil cunningly disguised as a platform for running containers. The element that allows for both running containers and reducing toil is the Kubernetes concept of a **Controller**. - -Most resources in Kubernetes are managed by **kube-controller-manager** , or "controller" for short. A [controller][2] is defined as "a control loop that watches the shared state of a cluster … and makes changes attempting to move the current state toward the desired state." Think of it like this: A Kubernetes controller is to a microservice as a Chef recipe (or an Ansible playbook) is to a monolith. - -Each Kubernetes resource is controlled by its own control loop. This is a step forward from previous systems like Chef or Puppet, which both have control loops at the server level, but not the resource level. A controller is a fairly simple piece of code that creates a control loop over a single resource to ensure the resource is behaving correctly. These control loops can stack together to create complex functionality with simple interfaces. - -The canonical example of this in action is in how we manage Pods in Kubernetes. A Pod is effectively a running copy of an application that a specific worker node is asked to run. If that application crashes, the kubelet running on that node will start it again. However, if that node crashes, the Pod is not recovered, as the control loop (via the kubelet process) responsible for the resource no longer exists. To make applications more resilient, Kubernetes has the ReplicaSet controller. - -The ReplicaSet controller is bundled inside the Kubernetes **controller-manager** , which runs on the Kubernetes master node and contains the controllers for these more advanced resources. The ReplicaSet controller is responsible for ensuring that a set number of copies of your application is always running. To do this, the ReplicaSet controller requests that a given number of Pods is created. It then routinely checks that the correct number of Pods is still running and will request more Pods or destroy existing Pods to do so. - -By requesting a ReplicaSet from Kubernetes, you get a self-healing deployment of your application. You can further add lifecycle management to your workload by requesting [a Deployment][3], which is a controller that manages ReplicaSets and provides rolling upgrades by managing multiple versions of your application's ReplicaSets. - -These controllers are great for managing Kubernetes resources and fantastic for managing resources outside of Kubernetes. The [Cloud Controller Manager][4] is a grouping of Kubernetes controllers that acts on resources external to Kubernetes, specifically resources that provide functionality to Kubernetes on the underlying cloud infrastructure. This is what drives Kubernetes' ability to do things like having a **LoadBalancer** [Service][5] type create and manage a cloud-specific load-balancer (e.g., an Elastic Load Balancer on AWS). - -Furthermore, you can extend Kubernetes by writing a controller that watches for events and annotations and performs extra work, acting on Kubernetes resources or external resources that have some form of programmable API. - -To review: - - * Controllers are a fundamental building block of Kubernetes' functionality. - * A controller forms a control loop to ensure that the state of a given resource matches the requested state. - * Kubernetes provides controllers via Controller Manager and Cloud Controller Manager processes that provide additional resilience and functionality. - * The ReplicaSet controller adds resiliency to pods by ensuring the correct number of replicas is running. - * A Deployment controller adds rolling upgrade capabilities to ReplicaSets. - * You can extend Kubernetes' functionality by writing your own controllers. - - - -### Controllers reduce sysadmin toil - -Some of the most common tickets in a sysadmin's queue are for fairly simple tasks that should be automated, but for various reasons are not. For example, creating or updating a DNS record generally requires updating a [zone file][6], but one bad entry and you can take down your entire DNS infrastructure. Or how about those tickets that look like _[SYSAD-42214] Expired SSL Certificate - Production is down_? - -[![DNS Haiku][7]][8] - -DNS haiku, image by HasturHasturHamster - -What if I told you that Kubernetes could manage these things for you by running some additional controllers? - -Imagine a world where asking Kubernetes to run applications for you would automatically create and manage DNS addresses and SSL certificates. What a world we live in! - -#### Example: External DNS controller - -The **[external-dns][9]** controller is a perfect example of Kubernetes treating operations as a microservice. You configure it with your DNS provider, and it will watch resources including Services and Ingress controllers. When one of those resources changes, it will inspect them for annotations that will tell it when it needs to perform an action. - -With the **external-dns** controller running in your cluster, you can add the following annotation to a service, and it will go out and create a matching [DNS A record][10] for that resource: -``` -kubectl annotate service nginx \ -"external-dns.alpha.kubernetes.io/hostname=nginx.example.org." -``` -You can change other characteristics, such as the DNS record's TTL value: -``` -kubectl annotate service nginx \ -"external-dns.alpha.kubernetes.io/ttl=10" -``` -Just like that, you now have automatic DNS management for your applications and services in Kubernetes that reacts to any changes in your cluster to ensure your DNS is correct. - -#### Example: Certificate manager operator - -Like the **external-dns** controller, the [**cert-manager**][11] will react to changes in resources, but it also comes with a custom resource definition (CRD) that will allow you to request certificates as a resource on their own, not just as a byproduct of an annotation. - -**cert-manager** works with [Let's Encrypt][12] and other sources of certificates to request valid, signed Transport Layer Security (TLS) certificates. You can even use it in combination with **external-dns** , like in the following example, which registers **web.example.com** , retrieves a TLS certificate from Let's Encrypt, and stores it in a Secret. - -``` -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - annotations: - certmanager.k8s.io/acme-http01-edit-in-place: "true" - certmanager.k8s.io/cluster-issuer: letsencrypt-prod - kubernetes.io/tls-acme: "true" - name: example -spec: - rules: - - host: web.example.com - http: - paths: - - backend: - serviceName: example - servicePort: 80 - path: /* - tls: - - hosts: - - web.example.com - secretName: example-tls -``` - -You can also request a certificate directly from the **cert-manager** CRD, like in the following example. As in the above, it will result in a certificate key pair stored in a Kubernetes Secret: -``` -apiVersion: certmanager.k8s.io/v1alpha1 -kind: Certificate -metadata: - name: example-com - namespace: default -spec: - secretName: example-com-tls - issuerRef: - name: letsencrypt-staging - commonName: example.com - dnsNames: - - www.example.com - acme: - config: - - http01: - ingressClass: nginx - domains: - - example.com - - http01: - ingress: my-ingress - domains: - - www.example.com -``` - -### Conclusion - -This was a quick look at one way Kubernetes is helping enable a new wave of changes in how we operate software. This is one of my favorite topics, and I look forward to sharing more on [Opensource.com][14] and my [blog][15]. I'd also like to hear how you use controllers—message me on Twitter [@pczarkowski][16]. - -* * * - -_This article is based on[Cloud Native Operations - Kubernetes Controllers][17] originally published on Paul Czarkowski's blog._ - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/reducing-sysadmin-toil-kubernetes-controllers - -作者:[Paul Czarkowski][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/paulczar -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_wheel_gear_devops_kubernetes.png?itok=xm4a74Kv -[2]: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/ -[3]: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ -[4]: https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/ -[5]: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types -[6]: https://en.wikipedia.org/wiki/Zone_file -[7]: https://opensource.com/sites/default/files/uploads/dns_haiku.png (DNS Haiku) -[8]: https://www.reddit.com/r/sysadmin/comments/4oj7pv/network_solutions_haiku/ -[9]: https://github.com/kubernetes-incubator/external-dns -[10]: https://en.wikipedia.org/wiki/List_of_DNS_record_types#Resource_records -[11]: http://docs.cert-manager.io/en/latest/ -[12]: https://letsencrypt.org/ -[13]: http://www.example.com -[14]: http://Opensource.com -[15]: https://tech.paulcz.net/blog/ -[16]: https://twitter.com/pczarkowski -[17]: https://tech.paulcz.net/blog/cloud-native-operations-k8s-controllers/ diff --git a/sources/tech/20190326 An inside look at an IIoT-powered smart factory.md b/sources/tech/20190326 An inside look at an IIoT-powered smart factory.md deleted file mode 100644 index 52c7c925dd..0000000000 --- a/sources/tech/20190326 An inside look at an IIoT-powered smart factory.md +++ /dev/null @@ -1,74 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (An inside look at an IIoT-powered smart factory) -[#]: via: (https://www.networkworld.com/article/3384378/an-inside-look-at-tempo-automations-iiot-powered-smart-factory.html#tk.rss_all) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -An inside look at an IIoT-powered smart factory -====== - -### Despite housing some 50 robots and 50 people, Tempo Automation’s gleaming connected factory relies on industrial IoT and looks more like a high-tech startup office than a manufacturing plant. - -![Tempo Automation][1] - -As someone who’s spent his whole career working in offices, not factories, I had very little idea what a modern “smart factory” powered by the industrial Internet of Things (IIoT) might look like. That’s why I was so interested in [Tempo Automation][2]’s new 42,000-square-foot facility in San Francisco’s trendy Design District. - -Frankly, I pictured the company’s facility, which uses IIoT to automatically configure, operate, and monitor the prototyping and low-volume production of printed circuit board assemblies (PCBAs), as a cacophony of robots and conveyor belts attended to by a grizzled band of grease-stained technicians. You know, a 21stcentury update of Charlie Chaplin’s 1936 classic *Modern Times *making equipment for customers in the aerospace, medtech, industrial automation, consumer electronics, and automotive industries. (The company just inked a [new contract with Lockheed Martin][3].) - -**[ Learn more about the[industrial Internet of Things][4]. | Get regularly scheduled insights by [signing up for Network World newsletters][5]. ]** - -Not exactly. As you can see from the below pictures, despite housing some 50 robots and 50 people, this gleaming “connected factory” looks more like a high-tech startup office, with just as many computers and few more hard-to-identify machines, including Solder Jet and Stencil Printers, zone reflow ovens, 3D X-ray devices and many more. - -![Tempo Automation office space][6] - -![Tempo Automation factory floor][7] - -## How Tempo Automation's 'smart factory' works - -On the front end, Tempo’s customers upload CAD files with their board designs and Bills of Materials (BOM) listing the required parts to be used. After performing feature extraction on the design and developing a virtual model of the finished product, the Tempo system, the platform (called Tempocom) creates a manufacturing plan and automatically programs the factory’s machines. Tempocom also creates work plans for the factory employees, uploading them to the networked IIoT mobile devicesthey all carry. Updated in real time based on design and process changes, this“digital traveler” tells workers where to go and what to work on next. - -While Tempocom is planning and organizing the internal work of production, the system is also connected to supplier databases, seeking and ordering the parts that will be used in assembly, optimizing for speed of delivery to the Tempo factory. - -## Connecting the digital thread - -“There could be up to 20 robots, 400 unique parts, and 25 people working on the factory floor to produce one order start to finish in a matter of hours,” explained [Shashank Samala][8], Tempo’s co-founder and vice president of product in an email. Tempo “employs IIoT to automatically configure, operate, and monitor” the entire process, coordinated by a “connected manufacturing system” that creates an “unbroken digital thread from design intent of the engineer captured on the website, to suppliers distributed across the country, to robots and people on the factory floor.” - -Rather than the machines on the floor functioning as “isolated islands of technology,” Samala added, Tempo Automation uses [Amazon Web Services (AWS) GovCloud][9] to network everything in a bi-directional feedback loop. - -“After customers upload their design to the Tempo platform, our software extracts the design features and then streams relevant data down to all the devices, processes, and robots on the factory floor,” he said. “This loop then works the other way: As the robots build the products, they collect data and feedback about the design during production. This data is then streamed back through the Tempo secure cloud architecture to the customer as a ‘Production Forensics’ report.” - -Samala claimed the system has “streamlined operations, improved collaboration, and simplified remote management and control.” - -## Traditional IoT, too - -Of course, the Tempo factory isn’t all fancy, cutting-edge IIoT implementations. According to Ryan Saul, vice president of manufacturing,the plant also includes an array of IoT sensors that track temperature, humidity, equipment status, job progress, reported defects, and so on to help engineers and executives understand how the facility is operating. - -Join the Network World communities on [Facebook][10] and [LinkedIn][11] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3384378/an-inside-look-at-tempo-automations-iiot-powered-smart-factory.html#tk.rss_all - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/03/tempo-automation-iiot-factory-floor-100791923-large.jpg -[2]: http://www.tempoautomation.com/ -[3]: https://www.businesswire.com/news/home/20190325005097/en/Tempo-Automation-Announces-Contract-Lockheed-Martin -[4]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html#nww-fsb -[5]: https://www.networkworld.com/newsletters/signup.html#nww-fsb -[6]: https://images.idgesg.net/images/article/2019/03/tempo-automation-iiot-factory-2-100791921-large.jpg -[7]: https://images.idgesg.net/images/article/2019/03/tempo-automation-iiot-factory-100791922-large.jpg -[8]: https://www.linkedin.com/in/shashanksamala/ -[9]: https://aws.amazon.com/govcloud-us/ -[10]: https://www.facebook.com/NetworkWorld/ -[11]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190326 Bringing Kubernetes to the bare-metal edge.md b/sources/tech/20190326 Bringing Kubernetes to the bare-metal edge.md deleted file mode 100644 index 836eac23be..0000000000 --- a/sources/tech/20190326 Bringing Kubernetes to the bare-metal edge.md +++ /dev/null @@ -1,72 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Bringing Kubernetes to the bare-metal edge) -[#]: via: (https://opensource.com/article/19/3/bringing-kubernetes-bare-metal-edge) -[#]: author: (John Studarus https://opensource.com/users/studarus) - -Bringing Kubernetes to the bare-metal edge -====== -New Kubespray features enable Kubernetes clusters to be deployed across -next-generation edge locations. -![cubes coming together to create a larger cube][1] - -[Kubespray][2], a community project that provides Ansible playbooks for the deployment and management of Kubernetes clusters, recently added support for the bare-metal cloud [Packet][3]. This allows Kubernetes clusters to be deployed across next-generation edge locations, including [cell-tower based micro datacenters][4]. - -Packet, which is unique in its bare-metal focus, expands Kubespray's support beyond the usual clouds—Amazon Web Services, Google Compute Engine, Azure, OpenStack, vSphere, and Oracle Cloud Infrastructure. Kubespray removes the complexities of standing up a Kubernetes cluster through automation using Terraform and Ansible. Terraform provisions the infrastructure and installs the prerequisites for the Ansible installation. Terraform provider plugins enable support for a variety of different cloud providers. The Ansible playbook then deploys and configures Kubernetes. - -Since there are already [detailed instructions online][5] for deploying with Kubespray on Packet, I'll focus on why bare-metal support is important for Kubernetes and what's required to make it happen. - -### Why bare metal? - -Historically, Kubernetes deployments relied upon the "creature comforts" of a public cloud or a fully managed private cloud to provide virtual machines and networking infrastructure for running Kubernetes. This adds a layer of abstraction (e.g., a hypervisor with virtual machines) that Kubernetes doesn't necessarily need. In fact, Kubernetes began its life on bare metal as Google's Borg. - -As we move workloads closer to the end user (in the form of edge computing) and deploy to more diverse environments (including hybrid and on-premises infrastructure of different architectures and sizes), relying on a homogenous public cloud substrate isn't always possible or ideal. For instance, with edge locations being resource constrained, it is more efficient and practical to run Kubernetes directly on bare metal. - -### Mind the gaps - -Without a full-featured public cloud underneath a bare-metal cluster, some traditional capabilities, such as load balancing and storage orchestration, will need to be managed directly within the Kubernetes cluster. Luckily there are projects, such as [MetalLB][6] and [Rook][7], that provide this support for Kubernetes. - -MetalLB, a Layer 2 and Layer 3 load balancer, is integrated into Kubespray, and it's easy to install support for Rook, which orchestrates Ceph to provide distributed and replicated storage for a Kubernetes cluster, on a bare-metal cluster. In addition to enabling full functionality, this "bring your own" approach to storage and load balancing removes reliance upon specific cloud services, helping you avoid lock-in with an approach that can be installed anywhere. - -Kubespray has support for ARM64 processors. The ARM architecture (which is starting to show up regularly in datacenter-grade hardware, SmartNICs, and other custom accelerators) has a long history in mobile and embedded devices, making it well-suited for edge deployments. - -Going forward, I hope to see deeper integration with MetalLB and Rook as well as bare-metal continuous integration (CI) of daily builds atop a number of different hardware configurations. Access to automated bare metal at Packet enables testing and maintaining support across various processor types, storage options, and networking setups. This will help ensure that Kubespray-powered Kubernetes can be deployed and managed confidently across public clouds, bare metal, and edge environments. - -### It takes a village - -Kubespray is an open source project driven by the community, indebted to its core developers and contributors as well as the folks that assisted with the Packet integration. Contributors include [Maxime Guyot][8] and [Aivars Sterns][9] for the initial commits and code reviews, [Rong Zhang][10] and [Ed Vielmetti][11] for document reviews, as well as [Tomáš Karásek][12] (who maintains the Packet Go library and Terraform provider). - -* * * - -_John Studarus will present[The Open Micro Edge Data Center][13] at the [Open Infrastructure Summit][14], April 29-May 1 in Denver._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/bringing-kubernetes-bare-metal-edge - -作者:[John Studarus][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/studarus -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cube_innovation_process_block_container.png?itok=vkPYmSRQ (cubes coming together to create a larger cube) -[2]: https://kubespray.io/ -[3]: https://www.packet.com/ -[4]: https://twitter.com/packethost/status/1062147355108085760 -[5]: https://github.com/kubernetes-sigs/kubespray/blob/master/docs/packet.md -[6]: https://metallb.universe.tf/ -[7]: https://rook.io/ -[8]: https://twitter.com/Miouge -[9]: https://github.com/Atoms -[10]: https://github.com/riverzhang -[11]: https://twitter.com/vielmetti -[12]: https://t0mk.github.io/ -[13]: https://www.openstack.org/summit/denver-2019/summit-schedule/events/23153/the-open-micro-edge-data-center -[14]: https://openstack.org/summit diff --git a/sources/tech/20190326 Changes in SD-WAN Purchase Drivers Show Maturity of the Technology.md b/sources/tech/20190326 Changes in SD-WAN Purchase Drivers Show Maturity of the Technology.md deleted file mode 100644 index 803b6a993d..0000000000 --- a/sources/tech/20190326 Changes in SD-WAN Purchase Drivers Show Maturity of the Technology.md +++ /dev/null @@ -1,65 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Changes in SD-WAN Purchase Drivers Show Maturity of the Technology) -[#]: via: (https://www.networkworld.com/article/3384103/changes-in-sd-wan-purchase-drivers-show-maturity-of-the-technology.html#tk.rss_all) -[#]: author: (Cliff Grossner https://www.networkworld.com/author/Cliff-Grossner/) - -Changes in SD-WAN Purchase Drivers Show Maturity of the Technology -====== - -![istock][1] - -[SD-WANs][2] have been available now for the past five years, but adoption has been light compared to that of the overall WAN market. This should be no surprise, as the technology was immature, and customers were dipping their toes in the water first as a test. Recently, however, there are signs that the market is maturing, which also happens to coincide with an acceleration of the market. - -Evidence of the maturation of SD-WANs can be seen in the most recent IHS Markit _Campus LAN and WAN SDN Strategies and Leadership North American Enterprise Survey_. Exhibit 1 shows that the top drivers of SD-WAN deployments are the simplification of WAN provisioning, automation capabilities. and direct cloud connectivity—all of which require an architectural change. - -This is in stark contrast to the approach of early adopters looking for a reduction in opex and capex savings, doing so in the past by shifting to cheap broadband and low-cost branch hardware. The survey data finds that opex savings now ranks tied in fifth place among the purchase drivers of SD-WAN; and that reduced capex is last, indicating that cost savings no longer possess the same level of importance as with early adopters. - -The shift in purchase drivers indicates companies are looking for SD-WAN to provide more value than legacy WAN. - -With [SD-WAN][3], the “software defined” indicates that the control plane has been separated from the data plane, enabling the control plane to be abstracted away from the hardware and allowing centralized, distributed, and hybrid control architectures, working alongside the centralized management of those architectures. This provides many benefits, the biggest of which is to make WAN provisioning easier. - -![Exhibit 1: Simplification and automation are top drivers for SD-WAN.][4] - -With SD-WAN, most mainstream buyers now demand Zero Touch Provisioning, where the SD-WAN appliance automatically calls home when it attaches to the network and pulls its configuration down from a centralized location. Also, changes can be made through a centralized console and then immediately pushed out to every device. This can automate many of the mundane and repetitive tasks associated with running a network. - -Such a setup carries many benefits—the most important being that highly skilled network engineers can dedicate more time to innovation and less time to working on tasks associated with “keeping the lights on.” - -At present, most resources—time and money—associated with running the WAN are allocated to maintaining the status quo. In the cloud era, however, business leaders embracing digital transformation are looking to their IT organization to help drive innovation and leapfrog the competition. SD-WANs can modernize the network, and the technology will tip the IT resource scale back in favor of innovation. - -### Mainstream buyers set new expectations for SD-WAN - -With early adopters, technology innovation is key because adopters are generally tech-savvy buyers and are always looking to use the latest and greatest to gain an edge. With mainstream buyers, other concerns arise. Exhibit 2 from the IHS Markit survey shows that technological innovation now ranks tied in fourth place in what buyers look for from an SD-WAN provider. While innovation is still important, factors such as security, financial stability, and product service and reliability rank higher. And although businesses need a strong technical solution, it cannot be achieved at the expense of security, vendor stability, or quality without putting operations at risk. - -It’s not surprising, then, that security turned out to be the overwhelming top evaluation criterion, as SD-WANs enable businesses to implement local internet breakout and cloud on-ramp features. Overall, SD-WANs help make applications perform better, especially as enterprises deploy workloads in off-premises, cloud-service-provider-operated data centers as they build their hybrid and multi-clouds. - -Another security capability of SD-WANs is their ability to easily implement segmentation, which enables businesses to establish centrally defined and globally consistent security policies that isolate traffic. For example, a retailer could isolate point-of-sale systems from its guest Wi-Fi network. [SD-WAN vendors][5] can also establish partnerships with well-known security vendors that enable the SD-WAN software to be service chained into application traffic flows, in the process allowing mainstream buyers their choice of security technology. - -![Exhibit 2: SD-WAN buyers now want security and financially viable vendors.][6] - -### The bottom line - -The SD-WAN market is maturing, and the shift from early adopters to mainstream businesses will create a “rising tide” that will benefit all SD-WAN buyers in the WAN ecosystem. As a result, vendors will work to meet calls emphasizing greater simplicity and risk reduction, as well as bring about features that provide an integrated connectivity fabric for enterprise edge, hybrid, and multi-clouds. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3384103/changes-in-sd-wan-purchase-drivers-show-maturity-of-the-technology.html#tk.rss_all - -作者:[Cliff Grossner][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Cliff-Grossner/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/03/istock-998475736-100791932-large.jpg -[2]: https://www.silver-peak.com/sd-wan -[3]: https://www.silver-peak.com/sd-wan/sd-wan-explained -[4]: https://images.idgesg.net/images/article/2019/03/chart-1_post-10-100791930-large.jpg -[5]: https://www.silver-peak.com/sd-wan/choosing-an-sd-wan-vendor -[6]: https://images.idgesg.net/images/article/2019/03/chart-2_post-10-100791931-large.jpg diff --git a/sources/tech/20190326 How to use NetBSD on a Raspberry Pi.md b/sources/tech/20190326 How to use NetBSD on a Raspberry Pi.md deleted file mode 100644 index 37c14fec39..0000000000 --- a/sources/tech/20190326 How to use NetBSD on a Raspberry Pi.md +++ /dev/null @@ -1,229 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to use NetBSD on a Raspberry Pi) -[#]: via: (https://opensource.com/article/19/3/netbsd-raspberry-pi) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -How to use NetBSD on a Raspberry Pi -====== - -Experiment with NetBSD, an open source OS with direct lineage back to the original UNIX source code, on your Raspberry Pi. - -![][1] - -Do you have an old Raspberry Pi lying around gathering dust, maybe after a recent Pi upgrade? Are you curious about [BSD Unix][2]? If you answered "yes" to both of these questions, you'll be pleased to know that the first is the solution to the second, because you can run [NetBSD][3], as far back as the very first release, on a Raspberry Pi. - -BSD is the Berkley Software Distribution of [Unix][4]. In fact, it's the only open source Unix with direct lineage back to the original source code written by Dennis Ritchie and Ken Thompson at Bell Labs. Other modern versions are either proprietary (such as AIX and Solaris) or clever re-implementations (such as Minix and GNU/Linux). If you're used to Linux, you'll feel mostly right at home with BSD, but there are plenty of new commands and conventions to discover. If you're still relatively new to open source, trying BSD is a good way to experience a traditional Unix. - -Admittedly, NetBSD isn't an operating system that's perfectly suited for the Pi. It's a minimal install compared to many Linux distributions designed specifically for the Pi, and not all components of recent Pi models are functional under NetBSD yet. However, it's arguably an ideal OS for the older Pi models, since it's lightweight and lovingly maintained. And if nothing else, it's a lot of fun for any die-hard Unix geek to experience another side of the [POSIX][5] world. - -### Download NetBSD - -There are different versions of BSD. NetBSD has cultivated a reputation for being lightweight and versatile (its website features the tagline "Of course it runs NetBSD"). It offers an image of the latest version of the OS for every version of the Raspberry Pi since the original. To download a version for your Pi, you must first [determine what variant of the ARM architecture your Pi uses][6]. Some information about this is available on the NetBSD site, but for a comprehensive overview, you can also refer to [RPi Hardware History][7]. - -The Pi I used for this article is, as far as I can tell, a Raspberry Pi Model B Rev 2.0 (with two USB ports and no mounting holes). According to the [Raspberry Pi FAQ][8], this means the architecture is ARMv6, which translates to **earmv6hf** in NetBSD's architecture notation. - -![NetBSD on Raspberry Pi][9] - -If you're not sure what kind of Pi you have, the good news is that there are only two Pi images, so try **earmv7hf** first; if it doesn't work, fall back to **earmv6hf**. - -For the easiest and quickest install, use the binary image instead of an installer. Using the image is the most common method of getting an OS onto your Pi: you copy the image to your SD card and boot it up. There's no install necessary, because the image is a generic installation of the OS, and you've just copied it, bit for bit, onto the media that the Pi uses as its boot drive. - -The image files are found in the **binary > gzimg** directories of the NetBSD installation media server, which you can reach from the [front page][3] of NetBSD.org. The image is **rpi.img.gz** , a compressed **.img** file. Download it to your hard drive. - -Once you have downloaded the entire image, extract it. If you're running Linux, BSD, or MacOS, you can use the **gunzip** command: - -``` -$ gunzip ~/Downloads/rpi.img.gz -``` - -If you're working on Windows, you can install the open source [7-Zip][10] archive utility. - -### Copy the image to your SD card - -Once the image file is uncompressed, you must copy it to your Pi's SD card. There are two ways to do this, so use the one that works best for you. - -#### 1\. Using Etcher - -Etcher is a cross-platform application specifically designed to copy OS images to USB drives and SD cards. Download it from [Etcher.io][11] and launch it. - -In the Etcher interface, select the image file on your hard drive and the SD card you want to flash, then click the Flash button. - -![Etcher][12] - -That's it. - -#### 2\. Using the dd command - -On Linux, BSD, or MacOS, you can use the **dd** command to copy the image to your SD card. - - 1. First, insert your SD card into a card reader. Don't mount the card to your system because **dd** needs the device to be disengaged to copy data onto it. - - 2. Run **dmesg | tail** to find out where the card is located without it being mounted. On MacOS, use **diskutil list**. - - 3. Copy the image file to the SD card: - -``` -$ sudo dd if=~/Downloads/rpi.img of=/dev/mmcblk0 bs=2M status=progress -``` - -Before doing this, you _must be sure_ you have the correct location of the SD card. If you copy the image file to the incorrect device, you could lose data. If you are at all unsure about this, use Etcher instead! - - - - -When either **dd** or Etcher has written the image to the SD card, place the card in your Pi and power it on. - -### First boot - -The first time it's booted, NetBSD detects that the SD card's filesystem does not occupy all the free space available and resizes the filesystem accordingly. - -![Booting NetBSD on Raspberry Pi][13] - -Once that's finished, the Pi reboots and presents a login prompt. Log into your NetBSD system using **root** as the user name. No password is required. - -### Set up a user account - -First, set a password for the root user: - -``` -# passwd -``` - -Then create a user account for yourself with the **-m** option to prompt NetBSD to create a home directory and the **-G wheel** option to add your account to the wheel group so that you can become the administrative user (root) as needed: - -``` -# useradd -m -G wheel seth -``` - -Use the **passwd** command again to set a password for your user account: - -``` -# passwd seth -``` - -Log out, and then log back in with your new credentials. - -### Add software to NetBSD - -If you've ever used a Pi, you probably know that the way to add more software to your system is with a special command like **apt** or **dnf** (depending on whether you prefer to run [Raspbian][14] or [FedBerry][15] on your Pi). On NetBSD, use the **pkg_add** command. But some setup is required before the command knows where to go to get the packages you want to install. - -There are ready-made (pre-compiled) packages for NetBSD on NetBSD's servers using the scheme **<[ftp://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/[PORT]/[VERSION]/All>][16]**. Replace PORT with the architecture you are using, either **earmv6hf** or **earmv7hf**. Replace VERSION with the NetBSD release you are using; at the time of this writing, that's **8.0**. - -Place this value in a file called **/etc/pkg_install.conf**. Since that's a system file outside your user folder, you must invoke root privileges to create it: - -``` -$ su - - -# echo "PKG_PATH=" >> /etc/pkg_install.conf -``` - -Now you can install packages from the NetBSD software distribution. A good first candidate is Bash, commonly the default shell on a Linux (and Mac) system. Also, if you're not already a Vi text editor user, you may want to try something more intuitive such as [Jove][17] or [Nano][18]: - -``` -# pkg_add -v bash jove nano -# exit -$ -``` - -Unlike many Linux distributions ([Slackware][19] being a notable exception), NetBSD does very little configuration on your behalf, and this is considered a feature. So, to use Bash, Jove, or Nano as your default toolset, you must set the configuration yourself. - -You can set many of your preferences dynamically using environment variables, which are special variables that your whole system can access. For instance, most applications in Unix know that if there is a **VISUAL** or **EDITOR** variable set, the value of those variables should be used as the default text editor. You can set these two variables temporarily, just for your current login session: - -``` -$ export EDITOR=nano -# export VISUAL=nano -``` - -Or you can make them permanent by adding them to the default NetBSD **.profile** file: - -``` -$ sed -i 's/EDITOR=vi/EDITOR=nano/' ~/.profile -``` - -Load your new settings: - -``` -$ . ~/.profile -``` - -To make Bash your default shell, use the **chsh** (change shell) command, which now loads into your preferred editor. Before running **chsh** , though, make sure you know where Bash is located: - -``` -$ which bash -/usr/pkg/bin/bash -``` - -Set the value for **shell** in the **chsh** entry to **/usr/pkg/bin/bash** , then save the document. - -### Add sudo - -The **pkg_add** command is a privileged command, which means to use it, you must become the root user with the **su** command. If you prefer, you can also set up the **sudo** command, which allows certain users to use their own password to execute administrative tasks. - -First, install it: - -``` -# pkg_add -v sudo -``` - -And then use the **visudo** command to edit its configuration file. You must use the **visudo** command to edit the **sudo** configuration, and it must be run as root: - -``` -$ su -# SUDO_EDITOR=nano visudo -``` - -Once you are in the editor, find the line allowing members of the wheel group to execute any command, and uncomment it (by removing **#** from the beginning of the line): - -``` -### Uncomment to allow members of group wheel to execute any command -%wheel ALL=(ALL) ALL -``` - -Save the document as described in Nano's bottom menu panel and exit the root shell. - -Now you can use **pkg_add** with **sudo** instead of becoming root: - -``` -$ sudo pkg_add -v fluxbox -``` - -### Net gain - -NetBSD is a full-featured Unix operating system, and now that you have it set up on your Pi, you can explore every nook and cranny. It happens to be a pretty lightweight OS, so even an old Pi with a 700mHz processor and 256MB of RAM can run it with ease. If this article has sparked your interest and you have an old Pi sitting in a drawer somewhere, try it out! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/netbsd-raspberry-pi - -作者:[Seth Kenlon (Red Hat, Community Moderator)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/seth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_development_programming.png?itok=4OM29-82 -[2]: https://en.wikipedia.org/wiki/Berkeley_Software_Distribution -[3]: http://netbsd.org/ -[4]: https://en.wikipedia.org/wiki/Unix -[5]: https://en.wikipedia.org/wiki/POSIX -[6]: http://wiki.netbsd.org/ports/evbarm/raspberry_pi -[7]: https://elinux.org/RPi_HardwareHistory -[8]: https://www.raspberrypi.org/documentation/faqs/ -[9]: https://opensource.com/sites/default/files/uploads/pi.jpg (NetBSD on Raspberry Pi) -[10]: https://www.7-zip.org/ -[11]: https://www.balena.io/etcher/ -[12]: https://opensource.com/sites/default/files/uploads/etcher_0.png (Etcher) -[13]: https://opensource.com/sites/default/files/uploads/boot.png (Booting NetBSD on Raspberry Pi) -[14]: http://raspbian.org/ -[15]: http://fedberry.org/ -[16]: ftp://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/%5BPORT%5D/%5BVERSION%5D/All%3E -[17]: https://opensource.com/article/17/1/jove-lightweight-alternative-vim -[18]: https://www.nano-editor.org/ -[19]: http://www.slackware.com/ diff --git a/sources/tech/20190326 Today-s Retailer is Turning to the Edge for CX.md b/sources/tech/20190326 Today-s Retailer is Turning to the Edge for CX.md deleted file mode 100644 index babc54c0f7..0000000000 --- a/sources/tech/20190326 Today-s Retailer is Turning to the Edge for CX.md +++ /dev/null @@ -1,52 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Today’s Retailer is Turning to the Edge for CX) -[#]: via: (https://www.networkworld.com/article/3384202/today-s-retailer-is-turning-to-the-edge-for-cx.html#tk.rss_all) -[#]: author: (Cindy Waxer https://www.networkworld.com/author/Cindy-Waxer/) - -Today’s Retailer is Turning to the Edge for CX -====== - -### Despite the increasing popularity and convenience of ecommerce, 92% of purchases continue to be made off-line, according to the U.S. Census. - -![iStock][1] - -Despite the increasing popularity and convenience of ecommerce, 92% of purchases continue to be made off-line, according to the [U.S. Census][2]. That’s putting enormous pressure on retailers to meet new consumer expectations around real-time access to merchandise and order information. In fact, 85.3% of shoppers expect retailers to provide associates with handheld or fixed devices to check inventory and price within a store, a nearly 51% increase over 2017, according to a [survey from SOTI][3]. - -With an eye on transforming the customer experience of spending time in a store, retailers are investing aggressively in compute power located closer to the buyer, also known as [edge computing][4]. - -So what new and innovative technologies are edge environments supporting? Here’s where retail is headed with customer service and how edge computing will help them get there. - -**Face forward** : Facial recognition technology is on the rise in retail as brands search for new ways to engage customers. Take, CaliBurger, for example. The restaurant chain recently tested out self-ordering kiosks that use AI and facial-recognition technology to identify registered customers and pull up their loyalty accounts and order preferences. By automatically displaying a customer’s most popular purchases, the system aims to help patrons complete their orders in seconds flat for greater speed and convenience. - -**Customer experience on display** : Forget about traditional counter displays. Savvy retailers are experimenting with high-tech, in-store digital signage solutions to attract consumers and gather valuable data. For instance, Glass Media’s projection-based, end-to-end digital retail signage combines display technology, a cloud-based IoT platform, and data analytic capabilities. Through projection, the solution can influence customers at the point-of-decision. - -**Backroom access** : Tracking inventory manually requires substantial human resources. IoT-powered backroom technologies such as RFID, real-time point of sale (POS), and smart shelving systems promise to change that by improving the accuracy of inventory tracking throughout the supply chain. These automated solutions can track and reorder items automatically, eliminating the need for humans to take inventory and reducing the risk of product shortages. - -**Robots to the rescue** : Hoping to transform the branch experience, HSBC recently unveiled Pepper, a concierge robot whose job is to help customers with simple tasks, from answering commonly asked questions to directing them to available tellers. Pepper also acts as an online banking station where customers can log into their mobile banking account or access information about products. By putting Pepper on the payroll, HSBC hopes to reduce customer wait times and free up its “human” bankers. - -These innovative technologies provide retailers with unique opportunities to enhance customer experience, develop new revenue streams, and boost customer loyalty. But many of them require edge computing to work properly. Bandwidth-intensive content and vast volumes of data can lead to latency issues, outages, and other IT headaches. Fortunately, by placing computing power and storage capabilities directly on the edge of the network, edge computing can help retailers deliver the best customer experience possible. - -To find out more about how edge computing is transforming the customer experience in retail, visit [APC.com][5]. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3384202/today-s-retailer-is-turning-to-the-edge-for-cx.html#tk.rss_all - -作者:[Cindy Waxer][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Cindy-Waxer/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/03/istock-508154656-100791924-large.jpg -[2]: https://ycharts.com/indicators/ecommerce_sales_as_percent_retail_sales -[3]: https://www.soti.net/resources/newsroom/2019/annual-connected-retailer-survey-new-soti-survey-reveals-us-consumers-prefer-speed-and-convenience-when-shopping-with-limited-human-interaction/ -[4]: https://www.hpe.com/us/en/servers/edgeline-iot-systems.html?pp=false&jumpid=ps_83cqske5um_aid-510380402&gclid=CjwKCAjw6djYBRB8EiwAoAF6oWwk-M6LWcfCbbZ331fXhEHShXGbLWoSwTIzue6mxQg4gDvYx59XZxoC_4oQAvD_BwE&gclsrc=aw.ds -[5]: https://www.apc.com/us/en/solutions/business-solutions/edge-computing.jsp diff --git a/sources/tech/20190326 Why are monoidal categories interesting.md b/sources/tech/20190326 Why are monoidal categories interesting.md deleted file mode 100644 index 37aaef753a..0000000000 --- a/sources/tech/20190326 Why are monoidal categories interesting.md +++ /dev/null @@ -1,134 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why are monoidal categories interesting?) -[#]: via: (https://jvns.ca/blog/2019/03/26/what-are-monoidal-categories/) -[#]: author: (Julia Evans https://jvns.ca/) - -Why are monoidal categories interesting? -====== - -Hello! Someone on Twitter asked a question about tensor categories recently and I remembered “oh, I know something about that!! These are a cool thing!“. Monoidal categories are also called “tensor categories” and I think that term feels a little more concrete: one of the biggest examples of a tensor category is the category of vector spaces with the tensor product as the way you combine vectors / functions. “Monoidal” means “has an associative binary operation with an identity”, and with vector spaces the tensor product is the “associative binary operation” it’s referring to. So I’m going to mostly use “tensor categories” in this post instead. - -So here’s a quick stab at explaining why tensor categories are cool. I’m going to make a lot of oversimplifications which I figure is better than trying to explain category theory from the ground up. I’m not a category theorist (though I spent 2 years in grad school doing a bunch of category theory) and I will almost certainly say wrong things about category theory. - -In this post I’m going to try to talk about [Seven Sketches in Compositionality: An Invitation to Applied Category Theory][1] using mostly plain English. - -### tensor categories aren’t monads - -If you have been around functional programming for a bit, you might see the word “monoid” and “categories” and wonder “oh, is julia writing about monads, like in Haskell”? I am not!! - -There is a sentence “monads are a monoid in the category of endofunctors” which includes both the word “monoid” and “category” but that is not what I am talking about at all. We’re not going to talk about types or Haskell or monads or anything. - -#### tensor categories are about proving (or defining) things with pictures - -Here’s what I think is a really nice example from this [“seven sketches in compositionality”](() PDF (on page 47): - -![][2] - -The idea here is that you have 3 inequalities - - 1. `t <= v + w` - 2. `w + u <= x + z` - 3. `v + x <= y`, - - - -and you want to prove that `t + u <= y + z`. - -You can do this algebraically pretty easily. - -But in this diagram they’ve done something really different! They’ve sort of drawn the inequalities as boxes with lines coming out of them for each variable, and then you can see that you end up with a `t` and a `u` on the left and a `y` and a `z` on the right, and so maybe that means that `t + u <= y + z`. - -The first time I saw something like this in a math class I felt like – what? what is happening? you can’t just draw PICTURES to prove things?!! And of course you can’t _just_ draw pictures to prove things. - -What’s actually happening in pictures like this is that when you put 2 things next to each other in the picture (like `t` and `u`), that actually represents the “tensor product” of `t` and `u`. In this case the “tensor product” is defined to be addition. And the tensor product (addition in this case) has some special properties – - - 1. it’s associative - 2. if `a <= b` and `c <= d` then `a + c <= b + d` - - - -so saying that this picture proves that `t + u <= y + z` **actually** means that you can read a proof off the diagram in a straightforward way: - -``` - t + u -<= (v + w) + u -= v + (w + u) -<= v + (x + z) -= (v + x) + z -<= y + z -``` - -So all the things that “look like they would work” according to the picture actually do work in practice because our tensor product thing is associative and because addition works nicely with the `<=` relationship. The book explains all this in a lot more detail. - -### draw vector spaces with “string diagrams” - -Proving this simple inequality is kind of boring though! We want to do something more interesting, so let’s talk about vector spaces! Here’s a diagram that includes some vector spaces (U1, U2, V1, V2) and some functions (f,g) between them. - -![][3] - -Again, here what it means to have U1 stacked on top of U2 is that we’re taking a tensor product of U1 and U2. And the tensor product is associative, so there’s no ambiguity if we stack 3 or 4 vector spaces together! - -This is all explained in a lot more detail in this nice blog post called [introduction to string diagrams][4] (which I took that picture from). - -### define the trace of a matrix with a picture - -So far this is pretty boring! But in a [follow up blog post][5], they talk about something more outrageous: you can (using vector space duality) take the lines in one of these diagrams and move them **backwards** and make loops. So that lets us define the trace of a function `f : V -> V` like this: - -![][6] - -This is a really outrageous thing! We’ve said, hey, we have a function and we want to get a number in return right? Okay, let’s just… draw a circle around it so that there are no lines left coming out of it, and then that will be a number! That seems a lot more natural and prettier than the usual way of defining the trace of a matrix (“sum up the numbers on the diagonal”)! - -When I first saw this I thought it was super cool that just drawing a circle is actually a legitimate way of defining a mathematical concept! - -### how are tensor category diagrams different from regular category theory diagrams? - -If you see “tensor categories let you prove things with pictures” you might think “well, the whole point of category theory is to prove things with pictures, so what?“. I think there are a few things that are different in tensor category diagrams: - - 1. with string diagrams, the lines are objects and the boxes are functions which is the opposite of how usual category theory diagrams are - 2. putting things next to each other in the diagram has a specific meaning (“take the tensor product of those 2 things”) where as in usual category theory diagrams it doesn’t. being able to combine things in this way is powerful! - 3. half circles have a specific meaning (“take the dual”) - 4. you can use specific elements of a (eg vector space) in a diagram which usually you wouldn’t do in a category theory diagram (the objects would be the whole vector space, not one element of that vector space) - - - -### what does this have to do with programming? - -Even though this is usually a programming blog I don’t know whether this particular thing really has anything to do with programming, I just remembered I thought it was cool. I wrote my [master’s thesis][7] (which i will link to even though it’s not very readable) on topological quantum computing which involves a bunch of monoidal categories. - -Some of the diagrams in this post are sort of why I got interested in that area in the first place – I thought it was really cool that you could formally define / prove things with pictures. And useful things, like the trace of a matrix! - -### edit: some ways this might be related to programming - -Someone pointed me to a couple of twitter threads (coincidentally from this week!!) that relate tensor categories & diagrammatic methods to programming: - - 1. [this thread from @KenScambler][8] (“My best kept secret* is that string & wiring diagrams–plucked straight out of applied category theory–are _fabulous_ for software and system design.) - 2. [this other thread by him of 31 interesting related things to this topic][9] - - - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019/03/26/what-are-monoidal-categories/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://arxiv.org/pdf/1803.05316.pdf -[2]: https://jvns.ca/images/monoidal-preorder.png -[3]: https://jvns.ca/images/tensor-vector.png -[4]: https://qchu.wordpress.com/2012/11/05/introduction-to-string-diagrams/ -[5]: https://qchu.wordpress.com/2012/11/06/string-diagrams-duality-and-trace/ -[6]: https://jvns.ca/images/trace.png -[7]: https://github.com/jvns/masters-thesis/raw/master/thesis.pdf -[8]: https://twitter.com/KenScambler/status/1108738366529400832 -[9]: https://twitter.com/KenScambler/status/1109474342822244353 diff --git a/sources/tech/20190327 Cisco forms VC firm looking to weaponize fledgling technology companies.md b/sources/tech/20190327 Cisco forms VC firm looking to weaponize fledgling technology companies.md deleted file mode 100644 index 2a0dde5fb3..0000000000 --- a/sources/tech/20190327 Cisco forms VC firm looking to weaponize fledgling technology companies.md +++ /dev/null @@ -1,66 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Cisco forms VC firm looking to weaponize fledgling technology companies) -[#]: via: (https://www.networkworld.com/article/3385039/cisco-forms-vc-firm-looking-to-weaponize-fledgling-technology-companies.html#tk.rss_all) -[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) - -Cisco forms VC firm looking to weaponize fledgling technology companies -====== - -### Decibel, an investment firm focused on early stage funding for enterprise-product startups, will back technologies related to Cisco's core interests. - -![BrianaJackson / Getty][1] - -Cisco this week stepped deeper into the venture capital world by announcing Decibel, an early-stage investment firm that will focus on bringing enterprise-oriented startups to market. - -Veteran VC groundbreaker and former general partner at New Enterprise Associates [Jon Sakoda][2] will lead Decibel. Sakoda had been with NEA since 2006 and focused on startup investments in software and Internet companies. - -**[ Now see[7 free network tools you must have][3]. ]** - -Of Decibel Sakoda said: “We want to invest in companies that are helping our customers use innovation as a weapon in the game to transform their respective industries.” - -“Decibel combines the speed, agility, and independent risk-taking traditionally found in the best VC firms, while offering differentiated access to the scale, entrepreneurial talent, and deep customer relationships found in one of the largest tech companies in the world,” [Sakoda said][4]. “This approach is an industry first and provides a unique way for entrepreneurs to get access to unparalleled resources at a time and stage when they need it most.” - -“As one of the most prolific strategic venture capitalists in the world, Cisco already has a view into future technologies shaping our markets through our rich portfolio of companies,” wrote Rob Salvagno, vice president of Corporate Development and Cisco Investments in a [blog about Decibel][5]. “But we realized we could do even more by engaging with the startup community earlier in its lifecycle.” - -Indeed Cisco already has an investment arm, Cisco Investments, that focuses on later stage startups, the company says. Cisco said this arm invests $200 to $300 million annually, and it will continue its charter of investing and partnering with best-in-class companies in core and adjacent markets. - -Cisco didn’t talk about how much money would be involved in Decibel, but according to a [CNBC report][6], Cisco is setting up Decibel as an independent firm with a separate pool of cash, an unusual model for corporate investors. The fund hasn’t closed yet, but a [Securities and Exchange Commission filing][7] from October indicated that Sakoda was setting out to [raise $500 million][8], CNBC wrote. - -**[[Become a Microsoft Office 365 administrator in record time with this quick start course from PluralSight.][9] ]** - -Decibel does plan to invest anywhere from $5M – 15M in each start up in their portfolio, Cisco says. - -“Cisco has a culture of leveraging both internal and external innovation – accelerating our rich internal development capabilities by our ability to also partner, invest and acquire, Salvagno said. - -He said the company recognizes that significant innovation happens outside of the walls of Cisco. Cisco has acquired more than 200 companies, accounting for more than one in eight Cisco employees have joined as a result. "We have a deep bench of acquired founders, many of which play leadership roles within the company today, which continues to reinforce this entrepreneurial spirit," Salvagno said. - -Join the Network World communities on [Facebook][10] and [LinkedIn][11] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3385039/cisco-forms-vc-firm-looking-to-weaponize-fledgling-technology-companies.html#tk.rss_all - -作者:[Michael Cooney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Michael-Cooney/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/money_salary_magnet_flying-money_money-magnet-by-brianajackson-getty-100787974-large.jpg -[2]: https://twitter.com/jonsakoda -[3]: https://www.networkworld.com/article/2825879/7-free-open-source-network-monitoring-tools.html -[4]: https://www.decibel.vc/the-blast/announcingdecibel -[5]: https://blogs.cisco.com/news/cisco-fuels-innovation-engine-with-investment-in-new-early-stage-vc-fund -[6]: https://www.cnbc.com/2019/03/26/cisco-introduces-decibel-an-early-stage-venture-firm-with-jon-sakoda.html -[7]: https://www.sec.gov/Archives/edgar/data/1754260/000175426018000002/xslFormDX01/primary_doc.xml -[8]: https://www.cnbc.com/2018/10/08/cisco-lead-investor-jon-sakoda-catalyst-labs-500-million.html -[9]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fadministering-office-365-quick-start -[10]: https://www.facebook.com/NetworkWorld/ -[11]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190327 How to make a Raspberry Pi gamepad.md b/sources/tech/20190327 How to make a Raspberry Pi gamepad.md deleted file mode 100644 index 694c09d4c9..0000000000 --- a/sources/tech/20190327 How to make a Raspberry Pi gamepad.md +++ /dev/null @@ -1,235 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to make a Raspberry Pi gamepad) -[#]: via: (https://opensource.com/article/19/3/gamepad-raspberry-pi) -[#]: author: (Leon Anavi https://opensource.com/users/leon-anavi) - -How to make a Raspberry Pi gamepad -====== - -This DIY retro video game controller for the Raspberry Pi is fun and not difficult to build but requires some time. - -![Raspberry Pi Gamepad device][1] - -From time to time, I get nostalgic about the video games I played during my childhood in the late '80s and the '90s. Although most of my old computers and game consoles are long gone, my Raspberry Pi can fulfill my retro-gaming fix. I enjoy the simple games included in Raspbian, and the open source RetroPie project helped me turn my Raspberry Pi into an advanced retro-gaming machine. - -But, for a more authentic experience, like back in the "old days," I needed a gamepad. There are a lot of options on the market for USB gamepads and joysticks, but as an open source enthusiast, maker, and engineer, I prefer doing it the hard way. So, I made my own simple open source hardware gamepad, which I named the [ANAVI Play pHAT][2]. I designed it as an add-on board for Raspberry Pi using an [EEPROM][3] and a devicetree binary overlay I created for mapping the keys. - -### Get the gamepad buttons and EEPROM - -There are a huge variety of gamepads available for purchase, and some of them are really complex. However, it's not hard to make a gamepad similar to the iconic NES controller using the design I created. - -The gamepad uses eight "momentary" buttons (i.e., switches that are active only while they're pushed): four tactile (tact) switches for movement (Up, Down, Left, Right), two tact buttons for A and B, and two smaller tact buttons for Select and Start. I used [through-hole][4] tact switches: six 6x6x4.3mm switches for movement and the A and B buttons, and two 3x6x4.3mm switches for the Start and Select buttons. - -While the gamepad's primary purpose is to play retro games, the add-on board is large enough to include home-automation features, such as monitoring temperature, humidity, light, or barometric pressure, that you can use when you're not playing games. I added three slots for attaching [I2C][5] sensors to the primary I2C bus on physical pins 3 and 5. - -The most interesting and important part of the hardware design is the EEPROM (electrically erasable programmable read-only memory). A through-hole mounted EEPROM is easier to flash on a breadboard and solder to the gamepad. An article in the [MagPi magazine][6] recommends CAT24C32 EEPROM; if that model isn't available, try to find a model with similar technical specifications. All Raspberry Pi models and versions released after 2014 (Raspberry Pi B+ and newer) have a secondary I2C bus on physical pins 27 and 28. - -Once you have this hardware, use a breadboard to check that it works. - -### Create the printed circuit board - -The next step is to create a printed circuit board (PCB) design and have it manufactured. As an open source enthusiast, I believe that free and open source software should be used for creating open source hardware. I rely on [KiCad][7], electronic design automation (EDA) software available under the GPLv3+ license. KiCad works on Windows, MacOS, and GNU/Linux. (I use KiCad version 5 on Ubuntu 18.04.) - -KiCad allows you to create PCBs with up to 32 copper layers plus 14 fixed-purpose technical layers. It also has an integrated 3D viewer. It's actively developed, including many contributions by CERN developers, and used for industrial applications; for example, Olimex uses KiCad to design complex PCBs with multiple layers, like the one in its [TERES-I][8] DIY open source hardware laptop. - -The KiCad workflow includes three major steps: - - * Designing the schematics in the schematic layout editor - * Drawing the edge cuts, placing the components, and routing the tracks in the PCB layout editor - * Exporting Gerber and drill files for manufacture - - - -If you haven't designed PCBs before, keep in mind there is a steep learning curve. Go through the [examples and user's guides][9] provided by KiCad to learn how to work with the schematic and the PCB layout editor. (If you are not in the mood to do everything from scratch, you can just clone the ANAVI Play pHAT project in my [GitHub repository][10].) - -![KiCad schematic][11] - -In KiCad's schematic layout editor, connect the Raspberry Pi's GPIOs to the buttons, the slots for sensors to the primary I2C, and the EEPROM to the secondary I2C. Assign an appropriate footprint to each component. Perform an electrical rule check and, if there are no errors, generate the [netlist][12], which describes an electronic circuit's connectivity. - -Open the PCB layout editor. It contains several layers. Read the netlist. All components and tracks must be on the front and bottom copper layers (F.Cu and B.Cu), and the board's form must be created in the Edge.Cuts layer. Any text, including button labels, must be on the silkscreen layers. - -![Printable circuit board design][13] - -Finally, export the Gerber and drill files that you'll send to the company that will produce your PCB. The Gerber format is the de facto industry standard for PCBs. It is an open ASCII vector format for 2D binary images; simply explained, it is like a PDF for PCB manufacturing. - -There are numerous companies that can make a simple two-layer board like the gamepad's. For a few prototypes, you can count on [OSHPark in the US][14] or [Aisler in Europe][15]. There are also a lot of Chinese manufacturers, such as JLCPCB, PCBWay, ALLPCB, Seeed Studio, and many more. Alternatively, if you prefer to skip the hassle of PCB manufacturing and sourcing components, you can order the [ANAVI Play pHAT maker kit from Crowd Supply][2] and solder all the through-hole components on your own. - -### Understanding devicetree - -[Devicetree][16] is a specification for a software data structure that describes the hardware components. Its purpose is to allow the compiled Linux kernel to handle a variety of different hardware configurations within a wider architecture family. The bootloader loads the devicetree into memory and passes it to the Linux kernel. - -The devicetree includes three components: - - * Devicetree source (DTS) - * Devicetree blob (DTB) and overlay (DTBO) - * Devicetree compiler (DTC) - - - -The DTC creates binaries from a textual source. Devicetree overlays allow a central DTB to be overlaid on the devicetree. Overlays include a number of fragments. - -For several years, a devicetree has been required for all new ARM systems on a chip (SoCs), including Broadcom SoCs in all Raspberry Pi models and versions. With the default bootloader in Raspberry Pi's popular Raspbian distribution, DTO can be set in the configuration file ( **config.txt** ) on the FAT partition of a bootable microSD card using the keyword **device_tree=**. - -Since 2014, the Raspberry Pi's pin header has been extended to 40 pins. Pins 27 and 28 are dedicated for a secondary I2C bus. This way, the DTBO can be automatically loaded from an EEPROM attached to these pins. Furthermore, additional system information can be saved in the EEPROM. This feature is among the Raspberry Pi Foundation's requirements for any Raspberry Pi HAT (hardware attached on top) add-on board. On Raspbian and other GNU/Linux distributions for Raspberry Pi, the information from the EEPROM can be seen from userspace at **/proc/device-tree/hat/** after booting. - -In my opinion, the devicetree is one of the most fascinating features added in the Linux ecosystem over the past decade. Creating devicetree blobs and overlays is an advanced task and requires some background knowledge. However, it's possible to create a devicetree binary overlay for the Raspberry Pi add-on board and flash it on an appropriate EEPROM. The device binary overlay defines the Linux key codes for each key of the gamepad. The result is a gamepad for Raspberry Pi with keys that work as soon as you boot Raspbian. - -#### Creating the DTBO - -There are three major steps to create a devicetree binary overlay for the gamepad: - - * Creating the devicetree source with mapping for the keys based on the Linux key codes - * Compiling the devicetree binary overlay using the devicetree compiles - * Creating an **.eep** file and flashing it on an EEPROM using the open source tools provided by the Raspberry Pi Foundation - - - -Linux key codes are defined in the file **/usr/include/linux/input-event-codes.h**. The device source file should describe which Raspberry Pi GPIO pin is connected to which hardware button and which Linux key code should be triggered when the button is pressed. In this gamepad, GPIO17 (pin 11) is connected to the tactile button for Right, GPIO4 (pin 7) to Left, GPIO22 (pin 15) to Up, GPIO27 (pin 13) to Down, GPIO5 (pin 29) to Start, GPIO6 (pin 31) to Select, GPIO19 (pin 35) to A, and GPIO26 (pin 37) to B. - -Please note there is a difference between the GPIO numbers and the physical position of the pin on the header. For convenience, all pins are located on the second row of the Raspberry Pi's 40-pin header. This approach makes it easier to route the printed circuit board in KiCad. - -The entire devicetree source for the gamepad is [available on GitHub][17]. As an example, the following is a short code snippet that demonstrates how GPIO17, corresponding to physical pin 11 on the Raspberry Pi, is mapped to the tact button for Right: - -``` -button@17 { -label = "right"; -linux,code = <106>; -gpios = <&gpio 17 1>; -}; -``` - -To compile the DTS directly on the Raspberry Pi, install the devicetree compiler on Raspbian by executing the following command in the terminal: -``` -sudo apt-get update -sudo apt-get install device-tree-compiler -``` -Run DTC and provide as arguments the name of the output DTBO and the path to the source file. For example: - -``` -dtc -I dts -O dtb -o anavi-play-phat.dtbo anavi-play-phat.dts -``` - -The Raspberry Pi Foundation provides a [GitHub repository with the mechanical, hardware, and software specifications for HATs][18]. It also includes three very convenient tools: - - * **eepmake:** Creates an **.eep** file from a text file with settings - * **eepdump:** Useful for debugging, as it dumps a binary **.eep** file as human-readable text - * **eepflash:** Writes or reads an **.eep** binary image to/from an EEPROM - - - -The **eeprom_settings.txt** file can be used as a template. [The Raspberry Pi Foundation][19] and [MagPi magazine][6] have helpful articles and tutorials, so I won't go into too many details. As I wrote above, the recommended EEPROM is CAT24C32, but it can be replaced with any other EEPROM with the same technical specifications. Using an EEPROM with an eight-pin, through-hole, dual in-line (DIP) package is easier for hobbyists to flash because it can be done with a breadboard. The following example command creates a file ready to be flashed on the EEPROM using the **eepmake** tool from the Raspberry Pi GitHub repository: - -``` -./eepmake settings.txt settings.eep anavi-play-phat.dtbo -``` - -Before proceeding with flashing, ensure that the EEPROM is connected properly to the primary I2C bus (pins 3 and 5) on the Raspberry Pi. (You can consult the MagPi magazine article linked above for a discussion on wiring schematics.) Then run the following command and follow the onscreen instructions to flash the **.eep** file on the EEPROM: - -``` -sudo ./eepflash.sh -w -f=settings.eep -t=24c32 -``` - -Before soldering the EEPROM to the printed circuit board, move it to the secondary I2C bus on the breadboard and test it to ensure it works as expected. If you detect any issues while testing the EEPROM on the breadboard, correct the settings files, move it back to the primary I2C bus, and flash it again. - -### Testing the gamepad - -Now comes the fun part! It is time to test the add-on board using Raspbian, which you can [download][20] from RaspberryPi.org. After booting, open a terminal and enter the following commands: - -``` -cat /proc/device-tree/hat/product -cat /proc/device-tree/hat/vendor -``` - -The output should be similar to this: - -![Testing output][21] - -If it is, congratulations! The data from the EEPROM has been read successfully. - -The next step is to verify that the keys on the Play pHAT are set properly and working. In a terminal or a text editor, press each of the eight buttons and verify they are acting as configured. - -Finally, it is time to play games! By default, Raspbian's desktop includes [Python Games][22]. Launch them from the application menu. Make an audio output selection and pick a game from the list. My favorite is Wormy, a Snake-like game. As a former Symbian mobile application developer, I find playing Wormy brings back memories of the glorious days of Nokia. - -### Retro gaming with RetroPie - -![RetroPie with the Play pHAT][23] - -Raspbian is amazing, but [RetroPie][24] offers so much more for retro games fans. It is a GNU/Linux distribution optimized for playing retro games and combines the open source projects RetroArch and Emulation Station. It's available for Raspberry Pi, the [Odroid][25] C1/C2, and personal computers running Debian or Ubuntu. It provides emulators for loading ROMs—the digital versions of game cartridges. Keep in mind that no ROMs are included in RetroPie due to copyright issues. You will have to [find appropriate ROMs and copy them][26] to the Raspberry Pi after booting RetroPie. - -The open source hardware gamepad works fine in RetroPie's menus, but I discovered that the keys fail after launching some games and emulators. After debugging, I found a solution to ensuring they work in the game emulators: add a Python script for additional software emulation of the keys. [The script is available on GitHub.][27] Here's how to get it and install Python on RetroPie: - -``` - -sudo apt-get update -sudo apt-get install -y python-pip -sudo pip install evdev -cd ~ -git clone -``` - -Finally, add the following line to **/etc/rc.local** so it will be executed automatically when RetroPie boots: - -``` -sudo python /home/pi/anavi-examples/anavi-play-phat/anavi-play-gamepad.py & -``` - -That's it! After following these steps, you can create an entirely open source hardware gamepad as an add-on board for any Raspberry Pi model with a 40-pin header and use it with Raspbian and RetroPie! - -### What's next? - -Combining free and open source software with open source hardware is fun and not difficult, but it requires a significant amount of time. After creating the open source hardware gamepad in my spare time, I ran a modest crowdfunding campaign at [Crowd Supply][2] for low-volume manufacturing in my hometown in Plovdiv, Bulgaria. [The Open Source Hardware Association][28] certified the ANAVI Play pHAT as an open source hardware project under [BG000007][29]. Even [the acrylic enclosures][30] that protect the board from dust are open source hardware created with the free and open source software OpenSCAD. - -![Game pad in acrylic enclosure][31] - -If you enjoyed reading this article, I encourage you to try creating your own open source hardware add-on board for Raspberry Pi with KiCad. If you don't have enough spare time, you can order an [ANAVI Play pHAT maker kit][2], grab your soldering iron, and assemble the through-hole components. If you're not comfortable with the soldering iron, you can just order a fully assembled version. - -Happy retro gaming everybody! Next time someone irritably asks what you can learn from playing vintage computer games, tell them about Raspberry Pi, open source hardware, Linux, and devicetree. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/gamepad-raspberry-pi - -作者:[Leon Anavi][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/leon-anavi -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/gamepad_raspberrypi_hardware.jpg?itok=W16gOnay (Raspberry Pi Gamepad device) -[2]: https://www.crowdsupply.com/anavi-technology/anavi-play-phat -[3]: https://en.wikipedia.org/wiki/EEPROM -[4]: https://en.wikipedia.org/wiki/Through-hole_technology -[5]: https://en.wikipedia.org/wiki/I%C2%B2C -[6]: https://www.raspberrypi.org/magpi/make-your-own-hat/ -[7]: http://kicad-pcb.org/ -[8]: https://www.olimex.com/Products/DIY-Laptop/ -[9]: http://kicad-pcb.org/help/getting-started/ -[10]: https://github.com/AnaviTechnology/anavi-play-phat -[11]: https://opensource.com/sites/default/files/uploads/kicad-schematic.png (KiCad schematic) -[12]: https://en.wikipedia.org/wiki/Netlist -[13]: https://opensource.com/sites/default/files/uploads/circuitboard.png (Printable circuit board design) -[14]: https://oshpark.com/ -[15]: https://aisler.net/ -[16]: https://www.devicetree.org/ -[17]: https://github.com/AnaviTechnology/hats/blob/anavi/eepromutils/anavi-play-phat.dts -[18]: https://github.com/raspberrypi/hats -[19]: https://www.raspberrypi.org/blog/introducing-raspberry-pi-hats/ -[20]: https://www.raspberrypi.org/downloads/ -[21]: https://opensource.com/sites/default/files/uploads/testing-output.png (Testing output) -[22]: https://www.raspberrypi.org/documentation/usage/python-games/ -[23]: https://opensource.com/sites/default/files/uploads/retropie.jpg (RetroPie with the Play pHAT) -[24]: https://retropie.org.uk/ -[25]: https://www.hardkernel.com/product-category/odroid-board/ -[26]: https://opensource.com/article/19/1/retropie -[27]: https://github.com/AnaviTechnology/anavi-examples/blob/master/anavi-play-phat/anavi-play-gamepad.py -[28]: https://www.oshwa.org/ -[29]: https://certification.oshwa.org/bg000007.html -[30]: https://github.com/AnaviTechnology/anavi-cases/tree/master/anavi-play-phat -[31]: https://opensource.com/sites/default/files/uploads/gamepad-acrylic.jpg (Game pad in acrylic enclosure) diff --git a/sources/tech/20190327 Identifying exceptional user experience (UX) in IoT platforms.md b/sources/tech/20190327 Identifying exceptional user experience (UX) in IoT platforms.md deleted file mode 100644 index f7c49381f4..0000000000 --- a/sources/tech/20190327 Identifying exceptional user experience (UX) in IoT platforms.md +++ /dev/null @@ -1,126 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Identifying exceptional user experience (UX) in IoT platforms) -[#]: via: (https://www.networkworld.com/article/3384738/identifying-exceptional-user-experience-ux-in-iot-platforms.html#tk.rss_all) -[#]: author: (Steven Hilton https://www.networkworld.com/author/Steven-Hilton/) - -Identifying exceptional user experience (UX) in IoT platforms -====== - -### Examples of excellent IoT platform UX from the perspectives of 5 typical IoT platform personas. - -![Leo Wolfert / Getty Images][1] - -Enterprises are inundated with information about IoT platforms’ features and capabilities. But to find a long-lived IoT platform that minimizes ongoing development costs, enterprises must focus on exceptional user experience (UX) for 5 types of IoT platform users. - -Marketing and sales literature from IoT platform vendors is filled with information about IoT platform features. And no doubt, enterprises choosing to buy IoT platform services need to understand the actual capabilities of IoT platforms – preferably by [testing a variety of IoT platforms][2] – before making a purchase decision. - -However, it is a lot harder to gauge the quality of an IoT platform UX than itemizing an IoT platform’s features. Having excellent UX leads to lower platform deployment and management costs and higher customer satisfaction and retention. So enterprises should make UX one of their top criteria when selecting an IoT platform. - -[RELATED: Storage tank operator turns to IoT for energy savings][3] - -One of the ways to determine excellent IoT platform UX is to simulate the tasks conducted by typical IoT platform users. By completing these tasks, it becomes readily apparent when an IoT platform is exceptional or annoyingly bad. - -In this blog, I describe excellent IoT platform UX from the perspectives of five typical IoT platform users or personas. - -## Persona 1: platform administrator - -A platform administrator’s primary role is to configure, monitor, and maintain the functionality of an IoT platform. A platform administrator is typically an IT employee responsible for maintaining and configuring the various data management, device management, access control, external integration, and monitoring services that comprise an IoT platform. - -Typical platform administrator tasks include - - * configuration of the on-platform data visualization and data aggregation tools - * configuration of available device management functionality or execution of in-bulk device management tasks - * configuration and creation of on-platform complex event processing (CEP) workflows - * management and configuration of platform service orchestration - - - -Enterprises should pick IoT platforms with superlative access to on-platform configuration functionality with an emphasis on declarative interfaces for configuration management. Although many platform administrators are capable of working with RESTful API endpoints, good UX design should not require that platform administrators use third-party tools to automate basic functionality or execute bulk tasks. Some programmatic interfaces, such as SQL syntax for limiting monitoring views or dashboards for setting event processing trigger criteria, are acceptable and expected, although a fully declarative solution that maintains similar functionality is preferred. - -## Persona 2: platform operator - -A platform operator’s primary role is to leverage an IoT platform to execute common day-to-day business-centric operations and services. While the responsibilities of a platform operator will vary based on enterprise vertical and use case, all platform operators conduct business rather than IoT domain tasks. - -Typical platform operator tasks include - - * visualizing and aggregating on-platform data to view key business KPIs - * using device management functionality on a per-device basis - * creating, managing, and monitoring per-device and per-location event processing rules - * executing self-service administrative tasks, such as enrolling downstream operators - - - -Enterprises should pick IoT platforms centered on excellent ease-of-use for a business user. In general, the UX should be focused on providing information immediately required for the execution of day-to-day operational tasks while removing more complex functionality. These platforms should have easy access to well-defined and well-constrained operational functions or data visualization. An effective UX should enable easy creation and modification of data views, graphs, dashboards, and other visualizations by allowing operators to select devices using a declarative rather than SQL or other programmatic interfaces. - -## Persona 3: hardware and systems developer - -A hardware and systems developer’s primary role is the integration and configuration of IoT assets into an IoT platform. The hardware and systems developer possesses very specific, detailed knowledge about IoT hardware (e.g., specific multipoint control units, embedded platforms, or PLC/SCADA control systems), and leverages this knowledge to enable protocol and asset compatibility with northbound platform services. - -Typical hardware and systems developer tasks include - - * designing and implementing firmware for IoT assets based on either standardized IoT SDKs or platform-specific SDKs - * updating firmware or software packages over deployment lifecycles - * integrating manufacturer-specific protocols adapters into either IoT assets or the northbound platform - - - -Enterprises should pick IoT platforms that allow hardware and systems developers to most efficiently design and implement low-level device and protocol functionality. An effective developer experience provides well-documented and fully-featured SDKs supporting a variety of languages and device architectures to enable integration with various types of IoT hardware. - -## Persona 4: platform and backend developer - -A platform and backend developer’s primary role is to execute customer-specific application logic and integrations within an IoT deployment. Customer-specific logic may include on-platform or on-edge custom applications, such as those used for analytics, data aggregation and normalization, or any type of event processing workflow. In addition, a platform and backend developer is responsible for integrating the IoT platform with external databases, analytic solutions, or business systems such as MES, ERP, or CRM applications. - -Typical platform and backend developer tasks include - - * integrating streaming data from the IoT platform into external systems and applications - * configuring inbound and outbound platform actions and interactions with external systems - * configuring complex code-based event processing capabilities beyond the scope of a platform administrator’s knowledge or ability - * debugging low-level platform functionalities that require coding to detect or resolve - - - -Enterprises should pick excellent IoT platforms that provide access to well-documented and well-featured platform-level SDKs for application or service development. A best-in-class platform UX should provide real-time logging tools, debugging tools, and indexed and searchable access to all platform logs. Finally, a platform and backend developer is particularly dependent upon high-quality, platform-level documentation, especially for platform APIs. - -## Persona 5: user interface and experience (UI/UX) developer - -A UI/UX developer’s primary role is to design the various operator interfaces and monitoring views for an IoT platform. In more complex IoT deployments, various operator audiences will need to be addressed, including solution domain experts such as a factory manager; role-specific experts such as an equipment operator or factory technician; and business experts such as a supply-chain analyst or company executive. - -Typical UI/UX developer tasks include - - * building and maintaining customer-specific dashboards and monitoring views on either the IoT platform or edge devices - * designing, implementing, and maintaining various operator consoles for a variety of operator audiences and customer-specific use cases - * ensuring good user experience for customers over the lifetime of an IoT implementation - - - -Enterprises should pick IoT platforms that provide an exceptional variety and quality of UI/UX tools, such as dashboarding frameworks for on-platform monitoring solutions that are declaratively or programmatically customizable, as well as various widget and display blocks to help the developer rapidly implement customer-specific views. An IoT platform must also provide a UI/UX developer with appropriate debugging and logging tools for monitoring and operator console frameworks and platform APIs. Finally, a best-in-class platform should provide a sample dashboard, operator console, and on-edge monitoring implementation in order to enable the UI/UX developer to quickly become accustomed with platform paradigms and best practices. - -Enterprises should make UX one of their top criteria when selecting an IoT platform. Having excellent UX allows enterprises to minimize platform deployment and management costs. At the same time, excellent UX allows enterprises to more readily launch new solutions to the market thereby increasing customer satisfaction and retention. - -**This article is published as part of the IDG Contributor Network.[Want to Join?][4]** - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3384738/identifying-exceptional-user-experience-ux-in-iot-platforms.html#tk.rss_all - -作者:[Steven Hilton][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Steven-Hilton/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/industry_4-0_industrial_iot_smart_factory_by_leowolfert_gettyimages-689799380_2400x1600-100788464-large.jpg -[2]: https://www.machnation.com/2018/09/25/announcing-mit-e-2-0-hands-on-benchmarking-for-iot-cloud-edge-and-analytics-platforms/ -[3]: https://www.networkworld.com/article/3169384/internet-of-things/storage-tank-operator-turns-to-iot-for-energy-savings.html#tk.nww-fsb -[4]: /contributor-network/signup.html -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190327 IoT roundup- Keeping an eye on energy use and Volkswagen teams with AWS.md b/sources/tech/20190327 IoT roundup- Keeping an eye on energy use and Volkswagen teams with AWS.md deleted file mode 100644 index 016c5151fb..0000000000 --- a/sources/tech/20190327 IoT roundup- Keeping an eye on energy use and Volkswagen teams with AWS.md +++ /dev/null @@ -1,71 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (IoT roundup: Keeping an eye on energy use and Volkswagen teams with AWS) -[#]: via: (https://www.networkworld.com/article/3384697/iot-roundup-keeping-an-eye-on-energy-use-and-volkswagen-teams-with-aws.html#tk.rss_all) -[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/) - -IoT roundup: Keeping an eye on energy use and Volkswagen teams with AWS -====== - -### This week's roundup features new tech from MIT, big news in the automotive sector and a handy new level of centralization from a smaller IoT-focused company. - -![Getty Images][1] - -Much of what’s exciting about IoT technology has to do with getting data from a huge variety of sources into one place so it can be mined for insight, but sensors used to gather that data are frequently legacy devices from the early days of industrial automation or cheap, lightweight, SoC-based gadgets without a lot of sophistication of their own. - -Researchers at MIT have devised a system that can gather a certain slice of data from unsophisticated devices that are grouped on the same electrical circuit without adding sensors to each device. - -**[ Check out our[corporate guide to addressing IoT security][2]. ]** - -The technology’s called non-intrusive load monitoring, and sits directly on a given building's, vehicle's or other piece of infrastructure’s electrical circuits, identifies devices based on their power usage, and sends alerts when there are irregularities. - -It seems likely to make IIoT-related waves once it’s out of testing and onto the market. - -NLIM was recently tested, said MIT’s news service, on a U.S. Coast Guard cutter based in Boston, where it was attached to the outside of an electrical wire “at a single point, without requiring any cutting or splicing of wires.” - -Two such connections allowed the scientists to monitor roughly 20 separate devices on an electrical circuit, and the system was able to detect an anomalous amount of energy use from a component of the ship’s diesel engines known as a jacket water heater. - -“[C]rewmembers were skeptical about the reading but went to check it anyway. The heaters are hidden under protective metal covers, but as soon as the cover was removed from the suspect device, smoke came pouring out, and severe corrosion and broken insulation were clearly revealed,” the MIT report stated. Two other important but slightly less critical faults were also detected by the system. - -It’s easy to see why NLIM could easily prove to be an attractive technology for IIoT use in the future. It sounds as though it’s very simple to install, can operate without any kind of Internet connection (though most implementers will probably want to connect it to a wider monitoring setup for a more holistic picture of their systems) and does all of its computational work locally. It can even be used for general energy audits. What, in short, is not to like? - -**Volkswagen teams up with Amazon** - -AWS has got a new flagship client for its growing IoT services in the form of the Volkswagen Group, which [announced][3] that AWS is going to design and build the Volkswagen Industrial Cloud, a floor-to-ceiling industrial IoT implementation aimed at improving uptime, flexibility, productivity and vehicle quality. - -Real-time data from all 122 of VW’s manufacturing plants around the world will be available to the system, everything from part tracking to comparative analysis of efficiency to even deeper forms of analytics will take place in the company’s “data lake,” as the announcement calls it. Oh, and machine learning is part of it, too. - -The German carmaker clearly believes that AWS’s technology can provide a lot of help to its operations across the board, [even in the wake of a partnership with Microsoft for Azure-based cloud services announced last year.][4] - -**IoT-in-a-box** - -IoT can be very complicated. While individual components of any given implementation are often quite simple, each implementation usually contains a host of technologies that have to work in close concert. That means a lot of orchestration work has to go into making this stuff work. - -Enter Digi International, which rolled out an IoT-in-a-box package called Digi Foundations earlier this month. The idea is to take a lot of the logistical legwork out of IoT implementations by integrating cloud-connection software and edge-computing capabilities into the company’s core industrial router business. Foundations, which is packaged as a software subscription that adds these capabilities and more to the company’s devices, also includes a built-in management layer, allowing for simplified configuration and monitoring. - -OK, so it’s not quite all-in-one, but it’s still an impressive level of integration, particularly from a company that many might not have heard of before. It’s also a potential bellwether for other smaller firms upping their technical sophistication in the IoT sector. - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3384697/iot-roundup-keeping-an-eye-on-energy-use-and-volkswagen-teams-with-aws.html#tk.rss_all - -作者:[Jon Gold][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/2018/08/nw_iot-news_internet-of-things_smart-city_smart-home7-100768495-large.jpg -[2]: https://www.networkworld.com/article/3269165/internet-of-things/a-corporate-guide-to-addressing-iot-security-concerns.html -[3]: https://www.volkswagen-newsroom.com/en/press-releases/volkswagen-and-amazon-web-services-to-develop-industrial-cloud-4780 -[4]: https://www.volkswagenag.com/en/news/2018/09/volkswagen-and-microsoft-announce-strategic-partnership.html -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190327 Standardizing WASI- A system interface to run WebAssembly outside the web.md b/sources/tech/20190327 Standardizing WASI- A system interface to run WebAssembly outside the web.md deleted file mode 100644 index e473614955..0000000000 --- a/sources/tech/20190327 Standardizing WASI- A system interface to run WebAssembly outside the web.md +++ /dev/null @@ -1,347 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Standardizing WASI: A system interface to run WebAssembly outside the web) -[#]: via: (https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/) -[#]: author: (Lin Clark https://twitter.com/linclark) - -Standardizing WASI: A system interface to run WebAssembly outside the web -====== - -Today, we announce the start of a new standardization effort — WASI, the WebAssembly system interface. - -**Why:** Developers are starting to push WebAssembly beyond the browser, because it provides a fast, scalable, secure way to run the same code across all machines. - -But we don’t yet have a solid foundation to build upon. Code outside of a browser needs a way to talk to the system — a system interface. And the WebAssembly platform doesn’t have that yet. - -**What:** WebAssembly is an assembly language for a conceptual machine, not a physical one. This is why it can be run across a variety of different machine architectures. - -Just as WebAssembly is an assembly language for a conceptual machine, WebAssembly needs a system interface for a conceptual operating system, not any single operating system. This way, it can be run across all different OSs. - -This is what WASI is — a system interface for the WebAssembly platform. - -We aim to create a system interface that will be a true companion to WebAssembly and last the test of time. This means upholding the key principles of WebAssembly — portability and security. - -**Who:** We are chartering a WebAssembly subgroup to focus on standardizing [WASI][1]. We’ve already gathered interested partners, and are looking for more to join. - -Here are some of the reasons that we, our partners, and our supporters think this is important: - -### Sean White, Chief R&D Officer of Mozilla - -“WebAssembly is already transforming the way the web brings new kinds of compelling content to people and empowers developers and creators to do their best work on the web. Up to now that’s been through browsers, but with WASI we can deliver the benefits of WebAssembly and the web to more users, more places, on more devices, and as part of more experiences.” - -### Tyler McMullen, CTO of Fastly - -“We are taking WebAssembly beyond the browser, as a platform for fast, safe execution of code in our edge cloud. Despite the differences in environment between our edge and browsers, WASI means WebAssembly developers won’t have to port their code to each different platform.” - -### Myles Borins, Node Technical Steering committee director - -“WebAssembly could solve one of the biggest problems in Node — how to get close-to-native speeds and reuse code written in other languages like C and C++ like you can with native modules, while still remaining portable and secure. Standardizing this system interface is the first step towards making that happen.” - -### Laurie Voss, co-founder of npm - -“npm is tremendously excited by the potential WebAssembly holds to expand the capabilities of the npm ecosystem while hugely simplifying the process of getting native code to run in server-side JavaScript applications. We look forward to the results of this process.” - -So that’s the big news! 🎉 - -There are currently 3 implementations of WASI: - - -+ [wasmtime](https://github.com/CraneStation/wasmtime), Mozilla’s WebAssembly runtime -+ [Lucet](https://www.fastly.com/blog/announcing-lucet-fastly-native-webassembly-compiler-runtime), Fastly’s WebAssembly runtime -+ [a browser polyfill](https://wasi.dev/polyfill/) - - -You can see WASI in action in this video: - - - -And if you want to learn more about our proposal for how this system interface should work, keep reading. - -### What’s a system interface? - -Many people talk about languages like C giving you direct access to system resources. But that’s not quite true. - -These languages don’t have direct access to do things like open or create files on most systems. Why not? - -Because these system resources — such as files, memory, and network connections— are too important for stability and security. - -If one program unintentionally messes up the resources of another, then it could crash the program. Even worse, if a program (or user) intentionally messes with the resources of another, it could steal sensitive data. - -[![A frowning terminal window indicating a crash, and a file with a broken lock indicating a data leak][2]][3] - -So we need a way to control which programs and users can access which resources. People figured this out pretty early on, and came up with a way to provide this control: protection ring security. - -With protection ring security, the operating system basically puts a protective barrier around the system’s resources. This is the kernel. The kernel is the only thing that gets to do operations like creating a new file or opening a file or opening a network connection. - -The user’s programs run outside of this kernel in something called user mode. If a program wants to do anything like open a file, it has to ask the kernel to open the file for it. - -[![A file directory structure on the left, with a protective barrier in the middle containing the operating system kernel, and an application knocking for access on the right][4]][5] - -This is where the concept of the system call comes in. When a program needs to ask the kernel to do one of these things, it asks using a system call. This gives the kernel a chance to figure out which user is asking. Then it can see if that user has access to the file before opening it. - -On most devices, this is the only way that your code can access the system’s resources — through system calls. - -[![An application asking the operating system to put data into an open file][6]][7] - -The operating system makes the system calls available. But if each operating system has its own system calls, wouldn’t you need a different version of the code for each operating system? Fortunately, you don’t. - -How is this problem solved? Abstraction. - -Most languages provide a standard library. While coding, the programmer doesn’t need to know what system they are targeting. They just use the interface. - -Then, when compiling, your toolchain picks which implementation of the interface to use based on what system you’re targeting. This implementation uses functions from the operating system’s API, so it’s specific to the system. - -This is where the system interface comes in. For example, `printf` being compiled for a Windows machine could use the Windows API to interact with the machine. If it’s being compiled for Mac or Linux, it will use POSIX instead. - -[![The interface for putc being translated into two different implementations, one implemented using POSIX and one implemented using Windows APIs][8]][9] - -This poses a problem for WebAssembly, though. - -With WebAssembly, you don’t know what kind of operating system you’re targeting even when you’re compiling. So you can’t use any single OS’s system interface inside the WebAssembly implementation of the standard library. - -[![an empty implementation of putc][10]][11] - -I’ve talked before about how WebAssembly is [an assembly language for a conceptual machine][12], not a real machine. In the same way, WebAssembly needs a system interface for a conceptual operating system, not a real operating system. - -But there are already runtimes that can run WebAssembly outside the browser, even without having this system interface in place. How do they do it? Let’s take a look. - -### How is WebAssembly running outside the browser today? - -The first tool for producing WebAssembly was Emscripten. It emulates a particular OS system interface, POSIX, on the web. This means that the programmer can use functions from the C standard library (libc). - -To do this, Emscripten created its own implementation of libc. This implementation was split in two — part was compiled into the WebAssembly module, and the other part was implemented in JS glue code. This JS glue would then call into the browser, which would then talk to the OS. - -[![A Rube Goldberg machine showing how a call goes from a WebAssembly module, into Emscripten's JS glue code, into the browser, into the kernel][13]][14] - -Most of the early WebAssembly code was compiled with Emscripten. So when people started wanting to run WebAssembly without a browser, they started by making Emscripten-compiled code run. - -So these runtimes needed to create their own implementations for all of these functions that were in the JS glue code. - -There’s a problem here, though. The interface provided by this JS glue code wasn’t designed to be a standard, or even a public facing interface. That wasn’t the problem it was solving. - -For example, for a function that would be called something like `read` in an API that was designed to be a public interface, the JS glue code instead uses `_system3(which, varargs)`. - -[![A clean interface for read, vs a confusing one for system3][15]][16] - -The first parameter, `which`, is an integer which is always the same as the number in the name (so 3 in this case). - -The second parameter, `varargs`, are the arguments to use. It’s called `varargs` because you can have a variable number of them. But WebAssembly doesn’t provide a way to pass in a variable number of arguments to a function. So instead, the arguments are passed in via linear memory. This isn’t type safe, and it’s also slower than it would be if the arguments could be passed in using registers. - -That was fine for Emscripten running in the browser. But now runtimes are treating this as a de facto standard, implementing their own versions of the JS glue code. They are emulating an internal detail of an emulation layer of POSIX. - -This means they are re-implementing choices (like passing arguments in as heap values) that made sense based on Emscripten’s constraints, even though these constraints don’t apply in their environments. - -[![A more convoluted Rube Goldberg machine, with the JS glue and browser being emulated by a WebAssembly runtime][17]][18] - -If we’re going to build a WebAssembly ecosystem that lasts for decades, we need solid foundations. This means our de facto standard can’t be an emulation of an emulation. - -But what principles should we apply? - -### What principles does a WebAssembly system interface need to uphold? - -There are two important principles that are baked into WebAssembly : - - * portability - * security - - - -We need to maintain these key principles as we move to outside-the-browser use cases. - -As it is, POSIX and Unix’s Access Control approach to security don’t quite get us there. Let’s look at where they fall short. - -### Portability - -POSIX provides source code portability. You can compile the same source code with different versions of libc to target different machines. - -[![One C source file being compiled to multiple binaries][19]][20] - -But WebAssembly needs to go one step beyond this. We need to be able to compile once and run across a whole bunch of different machines. We need portable binaries. - -[![One C source file being compiled to a single binary][21]][22] - -This kind of portability makes it much easier to distribute code to users. - -For example, if Node’s native modules were written in WebAssembly, then users wouldn’t need to run node-gyp when they install apps with native modules, and developers wouldn’t need to configure and distribute dozens of binaries. - -### Security - -When a line of code asks the operating system to do some input or output, the OS needs to determine if it is safe to do what the code asks. - -Operating systems typically handle this with access control that is based on ownership and groups. - -For example, the program might ask the OS to open a file. A user has a certain set of files that they have access to. - -When the user starts the program, the program runs on behalf of that user. If the user has access to the file — either because they are the owner or because they are in a group with access — then the program has that same access, too. - -[![An application asking to open a file that is relevant to what it's doing][23]][24] - -This protects users from each other. That made a lot of sense when early operating systems were developed. Systems were often multi-user, and administrators controlled what software was installed. So the most prominent threat was other users taking a peek at your files. - -That has changed. Systems now are usually single user, but they are running code that pulls in lots of other, third party code of unknown trustworthiness. Now the biggest threat is that the code that you yourself are running will turn against you. - -For example, let’s say that the library you’re using in an application gets a new maintainer (as often happens in open source). That maintainer might have your interest at heart… or they might be one of the bad guys. And if they have access to do anything on your system — for example, open any of your files and send them over the network — then their code can do a lot of damage. - -[![An evil application asking for access to the users bitcoin wallet and opening up a network connection][25]][26] - -This is why using third-party libraries that can talk directly to the system can be dangerous. - -WebAssembly’s way of doing security is different. WebAssembly is sandboxed. - -This means that code can’t talk directly to the OS. But then how does it do anything with system resources? The host (which might be a browser, or might be a wasm runtime) puts functions in the sandbox that the code can use. - -This means that the host can limit what a program can do on a program-by-program basis. It doesn’t just let the program act on behalf of the user, calling any system call with the user’s full permissions. - -Just having a mechanism for sandboxing doesn’t make a system secure in and of itself — the host can still put all of the capabilities into the sandbox, in which case we’re no better off — but it at least gives hosts the option of creating a more secure system. - -[![A runtime placing safe functions into the sandbox with an application][27]][28] - -In any system interface we design, we need to uphold these two principles. Portability makes it easier to develop and distribute software, and providing the tools for hosts to secure themselves or their users is an absolute must., - -### What should this system interface look like? - -Given those two key principles, what should the design of the WebAssembly system interface be? - -That’s what we’ll figure out through the standardization process. We do have a proposal to start with, though: - - * Create a modular set of standard interfaces - * Start with standardizing the most fundamental module, wasi-core - - - -[![Multiple modules encased in the WASI standards effort][29]][30] - -What will be in wasi-core? - -wasi-core will contain the basics that all programs need. It will cover much of the same ground as POSIX, including things such as files, network connections, clocks, and random numbers. - -And it will take a very similar approach to POSIX for many of these things. For example, it will use POSIX’s file-oriented approach, where you have system calls such as open, close, read, and write and everything else basically provides augmentations on top. - -But wasi-core won’t cover everything that POSIX does. For example, the process concept does not map clearly onto WebAssembly. And beyond that, it doesn’t make sense to say that every WebAssembly engine needs to support process operations like `fork`. But we also want to make it possible to standardize `fork`. - -This is where the modular approach comes in. This way, we can get good standardization coverage while still allowing niche platforms to use only the parts of WASI that make sense for them. - -[![Modules filled in with possible areas for standardization, such as processes, sensors, 3D graphics, etc][31]][32] - -Languages like Rust will use wasi-core directly in their standard libraries. For example, Rust’s `open` is implemented by calling `__wasi_path_open` when it’s compiled to WebAssembly. - -For C and C++, we’ve created a [wasi-sysroot][33] that implements libc in terms of wasi-core functions. - -[![The Rust and C implementations of openat with WASI][34]][35] - -We expect compilers like Clang to be ready to interface with the WASI API, and complete toolchains like the Rust compiler and Emscripten to use WASI as part of their system implementations - -How does the user’s code call these WASI functions? - -The runtime that is running the code passes the wasi-core functions in as imports. - -[![A runtime placing an imports object into the sandbox][36]][37] - -This gives us portability, because each host can have their own implementation of wasi-core that is specifically written for their platform — from WebAssembly runtimes like Mozilla’s wasmtime and Fastly’s Lucet, to Node, or even the browser. - -It also gives us sandboxing because the host can choose which wasi-core functions to pass in — so, which system calls to allow — on a program-by-program basis. This preserves security. - -[ -][38][![Three runtimes—wastime, Node, and the browser—passing their own implementations of wasi_fd_open into the sandbox][39]][40] - -WASI gives us a way to extend this security even further. It brings in more concepts from capability-based security. - -Traditionally, if code needs to open a file, it calls `open` with a string, which is the path name. Then the OS does a check to see if the code has permission (based on the user who started the program). - -With WASI, if you’re calling a function that needs to access a file, you have to pass in a file descriptor, which has permissions attached to it. This could be for the file itself, or for a directory that contains the file. - -This way, you can’t have code that randomly asks to open `/etc/passwd`. Instead, the code can only operate on the directories that are passed in to it. - -[![Two evil apps in sandboxes. The one on the left is using POSIX and succeeds at opening a file it shouldn't have access to. The other is using WASI and can't open the file.][41]][42] - -This makes it possible to safely give sandboxed code more access to different system calls — because the capabilities of these system calls can be limited. - -And this happens on a module-by-module basis. By default, a module doesn’t have any access to file descriptors. But if code in one module has a file descriptor, it can choose to pass that file descriptor to functions it calls in other modules. Or it can create more limited versions of the file descriptor to pass to the other functions. - -So the runtime passes in the file descriptors that an app can use to the top level code, and then file descriptors get propagated through the rest of the system on an as-needed basis. - -[![The runtime passing a directory to the app, and then then app passing a file to a function][43]][44] - -This gets WebAssembly closer to the principle of least privilege, where a module can only access the exact resources it needs to do its job. - -These concepts come from capability-oriented systems, like CloudABI and Capsicum. One problem with capability-oriented systems is that it is often hard to port code to them. But we think this problem can be solved. - -If code already uses `openat` with relative file paths, compiling the code will just work. - -If code uses `open` and migrating to the `openat` style is too much up-front investment, WASI can provide an incremental solution. With [libpreopen][45], you can create a list of file paths that the application legitimately needs access to. Then you can use `open`, but only with those paths. - -### What’s next? - -We think wasi-core is a good start. It preserves WebAssembly’s portability and security, providing a solid foundation for an ecosystem. - -But there are still questions we’ll need to address after wasi-core is fully standardized. Those questions include: - - * asynchronous I/O - * file watching - * file locking - - - -This is just the beginning, so if you have ideas for how to solve these problems, [join us][1]! - --------------------------------------------------------------------------------- - -via: https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/ - -作者:[Lin Clark][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://twitter.com/linclark -[b]: https://github.com/lujun9972 -[1]: https://wasi.dev/ -[2]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/01-01_crash-data-leak-1-500x220.png -[3]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/01-01_crash-data-leak-1.png -[4]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/01-02-protection-ring-sec-1-500x298.png -[5]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/01-02-protection-ring-sec-1.png -[6]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/01-03-syscall-1-500x227.png -[7]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/01-03-syscall-1.png -[8]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/02-01-implementations-1-500x267.png -[9]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/02-01-implementations-1.png -[10]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/02-02-implementations-1-500x260.png -[11]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/02-02-implementations-1.png -[12]: https://hacks.mozilla.org/2017/02/creating-and-working-with-webassembly-modules/ -[13]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/03-01-emscripten-1-500x329.png -[14]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/03-01-emscripten-1.png -[15]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/03-02-system3-1-500x179.png -[16]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/03-02-system3-1.png -[17]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/03-03-emulation-1-500x341.png -[18]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/03-03-emulation-1.png -[19]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-01-portability-1-500x375.png -[20]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-01-portability-1.png -[21]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-02-portability-1-500x484.png -[22]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-02-portability-1.png -[23]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-03-access-control-1-500x224.png -[24]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-03-access-control-1.png -[25]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-04-bitcoin-1-500x258.png -[26]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-04-bitcoin-1.png -[27]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-05-sandbox-1-500x278.png -[28]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/04-05-sandbox-1.png -[29]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-01-wasi-1-500x419.png -[30]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-01-wasi-1.png -[31]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-02-wasi-1-500x251.png -[32]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-02-wasi-1.png -[33]: https://github.com/CraneStation/wasi-sysroot -[34]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-03-open-imps-1-500x229.png -[35]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-03-open-imps-1.png -[36]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-04-imports-1-500x285.png -[37]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-04-imports-1.png -[38]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-05-sec-port-1.png -[39]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-05-sec-port-2-500x705.png -[40]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-05-sec-port-2.png -[41]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-06-openat-path-1-500x192.png -[42]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-06-openat-path-1.png -[43]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-07-file-perms-1-500x423.png -[44]: https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2019/03/05-07-file-perms-1.png -[45]: https://github.com/musec/libpreopen diff --git a/sources/tech/20190328 As memory prices plummet, PCIe is poised to overtake SATA for SSDs.md b/sources/tech/20190328 As memory prices plummet, PCIe is poised to overtake SATA for SSDs.md deleted file mode 100644 index 3dfb93eec7..0000000000 --- a/sources/tech/20190328 As memory prices plummet, PCIe is poised to overtake SATA for SSDs.md +++ /dev/null @@ -1,85 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (As memory prices plummet, PCIe is poised to overtake SATA for SSDs) -[#]: via: (https://www.networkworld.com/article/3384700/as-memory-prices-plummet-pcie-is-poised-to-overtake-sata-for-ssds.html#tk.rss_all) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -As memory prices plummet, PCIe is poised to overtake SATA for SSDs -====== - -### Taiwan vendors believe PCIe and SATA will achieve price and market share parity by years' end. - -![Intel SSD DC P6400 Series][1] - -A collapse in price for NAND flash memory and a shrinking gap between the prices of PCI Express-based and SATA-based [solid-state drives][2] (SSDs) means the shift to PCI Express SSDs will accelerate in 2019, with the newer, faster format replacing the old by years' end. - -According to the Taiwanese tech publication DigiTimes (the stories are now archived and unavailable without a subscription), falling NAND flash prices continue to drag down SSD prices, which will drive the adoption of SSDs in enterprise and data-center applications. This, in turn, will further drive the adoption of PCIe drives, which are a superior format to SATA. - -**[ Read also:[Backup vs. archive: Why it’s important to know the difference][3] ]** - -## SATA vs. PCI Express - -SATA was introduced in 2001 as a replacement for the IDE interface, which had a much larger cable and slower interface. But SATA is a legacy HDD connection and not fast enough for NAND flash memory. - -I used to review SSDs, and it was always the same when it came to benchmarking, with the drives scoring within a few milliseconds of each other despite the memory used. The SATA interface was the bottleneck. A SATA SSD is like a one-lane highway with no speed limit. - -PCIe is several times faster and has much more parallelism, so throughput is more suited to the NAND format. It comes in two physical formats: an [add-in card][4] that plugs into a PCIe slot and M.2, which is about the size of a [stick of gum][5] and sits on the motherboard. PCIe is most widely used in servers, while M.2 is in consumer devices. - -There used to be a significant price difference between PCIe and SATA drives with the same capacity, but they have come into parity thanks to Moore’s Law, said Jim Handy, principal analyst with Objective Analysis, who follows the memory market. - -“The controller used to be a big part of the price of an SSD. But complexity has not grown with transistor count. It can have a lot of transistors, and it doesn’t cost more. SATA got more complicated, but PCIe has not. PCIe is very close to the same price as SATA, and [the controller] was the only thing that justified the price diff between the two,” he said. - -**[[Get certified as an Apple Technical Coordinator with this seven-part online course from PluralSight.][6] ]** - -DigiTimes estimates that the price drop for NAND flash chips will cause global shipments of SSDs to surge 20 to 25 percent in 2019, and PCIe SSDs are expected to emerge as a new mainstream offering by the end of 2019 with a market share of 50 percent, matching SATA SSDs. - -## SSD and NAND memory prices already falling - -Market sources to DigiTimes said that unit price for 512GB PCIe SSD has fallen by 11 percent sequentially in the first quarter of 2019, while SATA SSDs have dropped 9 percent. They added that the current average unit price for 512GB SSDs is now equal to that of 256GB SSDs from one year ago, with prices continuing to drop. - -According to DRAMeXchange, NAND flash contract prices will continue falling but at a slower rate in the second quarter of 2019. Memory makers are cutting production to avoid losing any more profits. - -“We’re in a price collapse. For over a year I’ve been saying the destination for NAND is 8 cents per gigabyte, and some spot markets are 6 cents. It was 30 cents a year ago. Contract pricing is around 15 cents now, it had been 25 to 27 cents last year,” said Handy. - -A contract price is what it sounds like. A memory maker like Samsung or Micron signs a contract with a SSD maker like Toshiba or Kingston for X amount for Y cents per gigabyte. Spot prices are prices that take place at the end of a quarter (like now) where a vendor anxious to unload excessive inventory has a fire sale to a drive maker that needs it on short supply. - -DigiTimes’s contacts aren’t the only ones who foresee this. Handy was at an analyst event by Samsung a few months back where they presented their projection that PCIe SSD would outsell SATA by the end of this year, and not just in the enterprise but everywhere. - -**More about backup and recovery:** - - * [Backup vs. archive: Why it’s important to know the difference][3] - * [How to pick an off-site data-backup method][7] - * [Tape vs. disk storage: Why isn’t tape dead yet?][8] - * [The correct levels of backup save time, bandwidth, space][9] - - - -Join the Network World communities on [Facebook][10] and [LinkedIn][11] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3384700/as-memory-prices-plummet-pcie-is-poised-to-overtake-sata-for-ssds.html#tk.rss_all - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/12/intel-ssd-p4600-series1-100782098-large.jpg -[2]: https://www.networkworld.com/article/3326058/what-is-an-ssd.html -[3]: https://www.networkworld.com/article/3285652/storage/backup-vs-archive-why-its-important-to-know-the-difference.html -[4]: https://www.newegg.com/Product/Product.aspx?Item=N82E16820249107 -[5]: https://www.newegg.com/Product/Product.aspx?Item=20-156-199&cm_sp=SearchSuccess-_-INFOCARD-_-m.2+-_-20-156-199-_-2&Description=m.2+ -[6]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fapple-certified-technical-trainer-10-11 -[7]: https://www.networkworld.com/article/3328488/backup-systems-and-services/how-to-pick-an-off-site-data-backup-method.html -[8]: https://www.networkworld.com/article/3315156/storage/tape-vs-disk-storage-why-isnt-tape-dead-yet.html -[9]: https://www.networkworld.com/article/3302804/storage/the-correct-levels-of-backup-save-time-bandwidth-space.html -[10]: https://www.facebook.com/NetworkWorld/ -[11]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190328 Elizabeth Warren-s right-to-repair plan fails to consider data from IoT equipment.md b/sources/tech/20190328 Elizabeth Warren-s right-to-repair plan fails to consider data from IoT equipment.md deleted file mode 100644 index 1ae1222f6e..0000000000 --- a/sources/tech/20190328 Elizabeth Warren-s right-to-repair plan fails to consider data from IoT equipment.md +++ /dev/null @@ -1,65 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Elizabeth Warren's right-to-repair plan fails to consider data from IoT equipment) -[#]: via: (https://www.networkworld.com/article/3385122/elizabeth-warrens-right-to-repair-plan-fails-to-consider-data-from-iot-equipment.html#tk.rss_all) -[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/) - -Elizabeth Warren's right-to-repair plan fails to consider data from IoT equipment -====== - -### Senator and presidential candidate Elizabeth Warren suggests national legislation focused on farm equipment. But that’s only a first step. The data collected by that equipment must also be considered. - -![Thinkstock][1] - -There’s a surprising battle being fought on America’s farms, between farmers and the companies that sell them tractors, combines, and other farm equipment. Surprisingly, the outcome of that war could have far-reaching implications for the internet of things (IoT) — and now Massachusetts senator and Democratic presidential candidate Elizabeth Warren has weighed in with a proposal that could shift the balance of power in this largely under-the-radar struggle. - -## Right to repair farm equipment - -Here’s the story: As part of a new plan to support family farms, Warren came out in support of a national right-to-repair law for farm equipment. That might not sound like a big deal, but it raises the stakes in a long-simmering fight between farmers and equipment makers over who really controls access to the equipment — and to the increasingly critical data gathered by the IoT capabilities built into it. - -**[ Also read:[Right-to-repair smartphone ruling loosens restrictions on industrial, farm IoT][2] | Get regularly scheduled insights: [Sign up for Network World newsletters][3] ]** - -[Warren’s proposal reportedly][4] calls for making all diagnostics tools and manuals freely available to the equipment owners, as well as independent repair shops — not just vendors and their authorized agents — and focuses solely on farm equipment. - -That’s a great start, and kudos to Warren for being by far the most prominent politician to weigh in on the issue. - -## Part of a much bigger IoT data issue - -But Warren's proposal merely scratches the surface of the much larger issue of who actually controls the equipment and devices that consumers and businesses buy. Even more important, it doesn’t address the critical data gathered by IoT sensors in everything ranging from smartphones, wearables, and smart-home devices to private and commercial vehicles and aircraft to industrial equipment. - -And as many farmers can tell you, this isn’t some academic argument. That data has real value — not to mention privacy implications. For farmers, it’s GPS-equipped smart sensors tracking everything — from temperature to moisture to soil acidity — that can determine the most efficient times to plant and harvest crops. For consumers, it might be data that affects their home or auto insurance rates, or even divorce cases. For manufacturers, it might cover everything from which equipment needs maintenance to potential issues with raw materials or finished products. - -The solution is simple: IoT users need consistent regulations that ensure free access to what is really their own data, and give them the option to share that data with the equipment vendors — if they so choose and on their own terms. - -At the very least, users need clear statements of the rules, so they know exactly what they’re getting — and not getting — when they buy IoT-enhanced devices and equipment. And if they’re being honest, most equipment vendors would likely admit that clear rules would benefit them as well by creating a level playing field, reducing potential liabilities and helping to avoid making customers unhappy. - -Sen. Warren made headlines earlier this month by proposing to ["break up" tech giants][5] such as Amazon, Apple, and Facebook. If she really wants to help technology buyers, prioritizing the right-to-repair and the associated right to own your own data seems like a more effective approach. - -**[ Now read this:[Big trouble down on the IoT farm][6] ]** - -Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3385122/elizabeth-warrens-right-to-repair-plan-fails-to-consider-data-from-iot-equipment.html#tk.rss_all - -作者:[Fredric Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Fredric-Paul/ -[b]: https://github.com/lujun9972 -[1]: https://images.techhive.com/images/article/2017/03/ai_agriculture_primary-100715481-large.jpg -[2]: https://www.networkworld.com/article/3317696/the-recent-right-to-repair-smartphone-ruling-will-also-affect-farm-and-industrial-equipment.html -[3]: https://www.networkworld.com/newsletters/signup.html -[4]: https://appleinsider.com/articles/19/03/27/presidential-candidate-elizabeth-warren-focusing-right-to-repair-on-farmers-not-tech -[5]: https://www.nytimes.com/2019/03/08/us/politics/elizabeth-warren-amazon.html -[6]: https://www.networkworld.com/article/3262631/big-trouble-down-on-the-iot-farm.html -[7]: https://www.facebook.com/NetworkWorld/ -[8]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190328 Microsoft introduces Azure Stack for HCI.md b/sources/tech/20190328 Microsoft introduces Azure Stack for HCI.md deleted file mode 100644 index 0400f4db04..0000000000 --- a/sources/tech/20190328 Microsoft introduces Azure Stack for HCI.md +++ /dev/null @@ -1,63 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Microsoft introduces Azure Stack for HCI) -[#]: via: (https://www.networkworld.com/article/3385078/microsoft-introduces-azure-stack-for-hci.html#tk.rss_all) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Microsoft introduces Azure Stack for HCI -====== - -### Azure Stack is great for your existing hardware, so Microsoft is covering the bases with a turnkey solution. - -![Thinkstock/Microsoft][1] - -Microsoft has introduced Azure Stack HCI Solutions, a new implementation of its on-premises Azure product specifically for [Hyper Converged Infrastructure][2] (HCI) hardware. - -[Azure Stack][3] is an on-premises version of its Azure cloud service. It gives companies a chance to migrate to an Azure environment within the confines of their own enterprise rather than onto Microsoft’s data centers. Once you have migrated your apps and infrastructure to Azure Stack, moving between your systems and Microsoft’s cloud service is easy. - -HCI is the latest trend in server hardware. It uses scale-out hardware systems and a full software-defined platform to handle [virtualization][4] and management. It’s designed to reduce the complexity of a deployment and on-going management, since everything ships fully integrated, hardware and software. - -**[ Read also:[12 most powerful hyperconverged infrasctructure vendors][5] | Get regularly scheduled insights: [Sign up for Network World newsletters][6] ]** - -It makes sense for Microsoft to take this step. Azure Stack was ideal for an existing enterprise. Now you can deploy a whole new hardware configuration setup to run Azure in-house, complete with Hyper-V-based software-defined compute, storage, and networking. - -The Windows Admin Center is the main management tool for Azure Stack HCI. It connects to other Azure tools, such as Azure Monitor, Azure Security Center, Azure Update Management, Azure Network Adapter, and Azure Site Recovery. - -“We are bringing our existing HCI technology into the Azure Stack family for customers to run virtualized applications on-premises with direct access to Azure management services such as backup and disaster recovery,” wrote Julia White, corporate vice president of Microsoft Azure, in a [blog post announcing Azure Stack HCI][7]. - -It’s not so much a new product launch as a rebranding. When Microsoft launched Server 2016, it introduced a version called Windows Server Software-Defined Data Center (SDDC), which was built on the Hyper-V hypervisor, and says so in a [FAQ][8] as part of the announcement. - -"Azure Stack HCI is the evolution of Windows Server Software-Defined (WSSD) solutions previously available from our hardware partners. We brought it into the Azure Stack family because we have started to offer new options to connect seamlessly with Azure for infrastructure management services,” the company said. - -Microsoft introduced Azure Stack in 2017, but it was not the first to offer an on-premises cloud option. That distinction goes to [OpenStack][9], a joint project between Rackspace and NASA built on open-source code. Amazon followed with its own product, called [Outposts][10]. - -Join the Network World communities on [Facebook][11] and [LinkedIn][12] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3385078/microsoft-introduces-azure-stack-for-hci.html#tk.rss_all - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2017/08/5_microsoft-azure-100733132-large.jpg -[2]: https://www.networkworld.com/article/3207567/what-is-hyperconvergence.html -[3]: https://www.networkworld.com/article/3207748/microsoft-introduces-azure-stack-its-answer-to-openstack.html -[4]: https://www.networkworld.com/article/3234795/what-is-virtualization-definition-virtual-machine-hypervisor.html -[5]: https://www.networkworld.com/article/3112622/hardware/12-most-powerful-hyperconverged-infrastructure-vendors.htmll -[6]: https://www.networkworld.com/newsletters/signup.html -[7]: https://azure.microsoft.com/en-us/blog/enabling-customers-hybrid-strategy-with-new-microsoft-innovation/ -[8]: https://azure.microsoft.com/en-us/blog/announcing-azure-stack-hci-a-new-member-of-the-azure-stack-family/ -[9]: https://www.openstack.org/ -[10]: https://www.networkworld.com/article/3324043/aws-does-hybrid-cloud-with-on-prem-hardware-vmware-help.html -[11]: https://www.facebook.com/NetworkWorld/ -[12]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190328 Motorola taps freed-up wireless spectrum for enterprise LTE networks.md b/sources/tech/20190328 Motorola taps freed-up wireless spectrum for enterprise LTE networks.md deleted file mode 100644 index ce38f54f79..0000000000 --- a/sources/tech/20190328 Motorola taps freed-up wireless spectrum for enterprise LTE networks.md +++ /dev/null @@ -1,68 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Motorola taps freed-up wireless spectrum for enterprise LTE networks) -[#]: via: (https://www.networkworld.com/article/3385117/motorola-taps-cbrs-spectrum-to-create-private-broadband-lmr-system.html#tk.rss_all) -[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/) - -Motorola taps freed-up wireless spectrum for enterprise LTE networks -====== - -### Citizens Broadband Radio Service (CBRS) is developing. Out of the gate, Motorola is creating a land mobile radio (LMR) system that includes enterprise-level, voice handheld devices and fast, private data networks. - -![Jiraroj Praditcharoenkul / Getty Images][1] - -In a move that could upend how workers access data in the enterprise, Motorola has announced a broadband product that it says will deliver data at double the capacity and four-times the range of Wi-Fi for end users. The handheld, walkie-talkie-like device, called Mototrbo Nitro, will, importantly, also include a voice channel. “Business-critical voice with private broadband data,” as [Motorola describes it on its website][2]. - -The company sees the product being implemented in traditional, moving-around, voice communications environments, such as factories and warehouses, that increasingly need data supplementation, too. A shop floor that has an electronically delivered repair manual, with included video demonstration, could be one example. Video could be two-way, even. - -**[ Also read:[Wi-Fi 6 is coming to a router near you][3] | Get regularly scheduled insights: [Sign up for Network World newsletters][4] ]** - -The product takes advantage of upcoming Citizens Broadband Radio Service (CBRS) spectrum. That’s a swath of radio bandwidth that’s being released by the Federal Communications Commission (FCC) in the 3.5GHz band. It’s a frequency chunk that is also expected to be used heavily for 5G. In this case, though, Motorola is creating a private LTE network for the enterprise. - -The CBRS band is the first time publicly available broadband spectrum has been available, [Motorola explains in a white paper][5] (pdf) — organizations don’t have to buy licenses, yet they can get access to useful spectrum: [A tiered sharing system, where auction winners will get priority access licenses, but others will have some access too is proposed][6] by the FCC. The non-prioritized open access could be used by any enterprise for whatever — internet of things (IoT) or private networks. - -## Motorola's pitch for using a private broadband network - -Why a private broadband network and not simply cell phones? One giveaway line is in Motorola’s promotional video: “Without sacrificing control,” it says. What it means is that the firm thinks there’s a market for companies who want to run entire business communications systems — data and voice — without involvement from possibly nosy Mobile Network Operator phone companies. [I’ve written before about how control over security is prompting large industrials to explore private networks][7] more. Motorola manages the network in this case, though, for the enterprise. - -Motorola also refers to potentially limited or intermittent onsite coverage and congestion for public, commercial, single-platform voice and data networks. That’s particularly the case in factories, [Motorola says in an ebook][8]. Heavy machinery containing radio-unfriendly metal can hinder Wi-Fi and cellular, it claims. Or that traditional Land Mobile Radios (LMRs), such as walkie-talkies and vehicle-mounted mobile radios, don’t handle data natively. In particular, it says that if you want to get into artificial intelligence (AI) and analytics, say, you need a more evolving voice and fast data communications setup. - -## Industrial IoT uses for Motorola's Nitro network - -Industrial IoT will be another beneficiary, Motorola says. It says its CBRS Nitro network could include instant notifications of equipment failures that traditional products can’t provide. It also suggests merging fixed security cameras with “photos and videos of broken machines and sending real-time video to an expert.” - -**[[Take this mobile device management course from PluralSight and learn how to secure devices in your company without degrading the user experience.][9] ]** - -Motorola also suggests that by separating consumer Wi-Fi (as is offered in hospitality and transport verticals, for example) from business-critical systems, one reduces traffic congestion risks. - -The highly complicated CBRS band-sharing system is still not through its government testing. “However, we could deploy customer systems under an experimental license,” a Motorola representative told me. - -Join the Network World communities on [Facebook][10] and [LinkedIn][11] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3385117/motorola-taps-cbrs-spectrum-to-create-private-broadband-lmr-system.html#tk.rss_all - -作者:[Patrick Nelson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Patrick-Nelson/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/02/industry_4-0_industrial_iot_smart_factory_automation_robotic_arm_gear_engineer_tablet_by_jiraroj_praditcharoenkul_gettyimages-1091790364_2400x1600-100788459-large.jpg -[2]: https://www.motorolasolutions.com/en_us/products/two-way-radios/mototrbo/nitro.html -[3]: https://www.networkworld.com/article/3311921/mobile-wireless/wi-fi-6-is-coming-to-a-router-near-you.html -[4]: https://www.networkworld.com/newsletters/signup.html -[5]: https://www.motorolasolutions.com/content/dam/msi/docs/products/mototrbo/nitro/cbrs-white-paper.pdf -[6]: https://www.networkworld.com/article/3300339/private-lte-using-new-spectrum-approaching-market-readiness.html -[7]: https://www.networkworld.com/article/3319176/private-5g-networks-are-coming.html -[8]: https://img04.en25.com/Web/MotorolaSolutionsInc/%7B293ce809-fde0-4619-8507-2b42076215c3%7D_radio_evolution_eBook_Nitro_03.13.19_MS_V3.pdf?elqTrackId=850d56c6d53f4013afa2290a66d6251f&elqaid=2025&elqat=2 -[9]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture -[10]: https://www.facebook.com/NetworkWorld/ -[11]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190328 Robots in Retail are Real- and so is Edge Computing.md b/sources/tech/20190328 Robots in Retail are Real- and so is Edge Computing.md deleted file mode 100644 index f62317ae54..0000000000 --- a/sources/tech/20190328 Robots in Retail are Real- and so is Edge Computing.md +++ /dev/null @@ -1,48 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Robots in Retail are Real… and so is Edge Computing) -[#]: via: (https://www.networkworld.com/article/3385046/robots-in-retail-are-real-and-so-is-edge-computing.html#tk.rss_all) -[#]: author: (Wendy Torell https://www.networkworld.com/author/Wendy-Torell/) - -Robots in Retail are Real… and so is Edge Computing -====== - -### I’ve seen plenty of articles touting the promise of edge computing technologies like AI and robotics in retail brick & mortar, but it wasn’t until this past weekend that I had my first encounter with an actual robot in a retail store. - -![Getty][1] - -I’ve seen plenty of articles touting the promise of [edge computing][2] technologies like AI and robotics in retail brick & mortar, but it wasn’t until this past weekend that I had my first encounter with an actual robot in a retail store. I was doing my usual weekly grocery shopping at my local Stop & Shop, and who comes strolling down the aisle, but…. Marty… the autonomous robot. He was friendly looking with his big googly eyes and was wearing a sign that explained he was there for safety, and that he was monitoring the aisles to report spills, debris, and other hazards to employees to improve my shopping experience. He caught the attention of most of the shoppers. - -At the National Retail Federation conference in NY that I attended in January, this was a topic of one of the [panel sessions][3]. It all makes sense… a positive customer experience is critical to retail success. But employee-to-customer (human to human) interaction has also been proven important. That’s where Marty comes in… to free up resources spent on tedious, time consuming tasks so that personnel can spend more time directly helping customers. - -**Use cases for robots in stores** - -Robotics have been utilized by retailers in manufacturing floors, and in distribution warehouses to improve productivity and optimize business processes along the supply chain. But it is only more recently that we’re seeing them make their way into the retail store front, where they are in contact with the customers. Alerting to hazards in the aisles is just one of many use-cases for the robots. They can also be used to scan and re-stock shelves, or as general information sources and greeters upon entering the store to guide your shopping experience. But how does a retailer justify the investment in this type of technology? Determining your ROI isn’t as cut and dry as in a warehouse environment, for example, where costs are directly tied to number of staff, time to complete tasks, etc… I guess time will tell for the retailers that are giving it a go. - -**What does it mean for the IT equipment on-premise ([micro data center][4])** - -Robotics are one of the many ways retail stores are being digitized. Video analytics is another big one, being used to analyze facial expressions for customer satisfaction, obtain customer demographics as input to product development, or ensure queue lines don’t get too long. My colleague, Patrick Donovan, wrote a detailed [blog post][5] about our trip to NRF and the impact on the physical infrastructure in the stores. In a nutshell, the equipment on-premise is becoming more mission critical, more integrated to business applications in the cloud, more tied to positive customer-experiences… and with that comes the need for more secure, more available, more manageable edge. But this is easier said than done in an environment that generally has no IT staff on-premise, and with hundreds or potentially thousands of stores spread out geographically. So how do we address this? - -We answer this question in a white paper that Patrick and I are currently writing titled “An Integrated Ecosystem to Solve Edge Computing Infrastructure Challenges”. Here’s a hint, (1) an integrated ecosystem of partners, and (2) an integrated micro data center that emerges from the ecosystem. I’ll be sure to comment on this blog with the link when the white paper becomes publicly available! In the meantime, explore our [edge computing][2] landing page to learn more. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3385046/robots-in-retail-are-real-and-so-is-edge-computing.html#tk.rss_all - -作者:[Wendy Torell][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Wendy-Torell/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/03/gettyimages-828488368-1060x445-100792228-large.jpg -[2]: https://www.apc.com/us/en/solutions/business-solutions/edge-computing.jsp -[3]: https://stores.org/2019/01/15/why-is-there-a-robot-in-my-store/ -[4]: https://www.apc.com/us/en/solutions/business-solutions/micro-data-centers.jsp -[5]: https://blog.apc.com/2019/02/06/4-thoughts-edge-computing-infrastructure-retail-sector/ diff --git a/sources/tech/20190329 How to submit a bug report with Bugzilla.md b/sources/tech/20190329 How to submit a bug report with Bugzilla.md deleted file mode 100644 index ee778410e7..0000000000 --- a/sources/tech/20190329 How to submit a bug report with Bugzilla.md +++ /dev/null @@ -1,102 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to submit a bug report with Bugzilla) -[#]: via: (https://opensource.com/article/19/3/bug-reporting) -[#]: author: (David Both https://opensource.com/users/dboth) - -How to submit a bug report with Bugzilla -====== - -Submitting bug reports is an easy way to give back and it helps everyone. - -![][1] - -I spend a lot of time doing research for my books and [Opensource.com][2] articles. Sometimes this leads me to discover bugs in the software I use, including Fedora and the Linux kernel. As a long-time Linux user and sysadmin, I have benefited greatly from GNU/Linux, and I like to give back. I am not a C language programmer, so I don't create fixes and submit them with bug reports, as some people do. But a way I can return some value to the Linux community is by reporting bugs. - -Product maintainers use a lot of tools to let their users search for existing bugs and report new ones. Bugzilla is a popular tool, and I use the Red Hat [Bugzilla][3] website to report Fedora-related bugs because I primarily use Fedora on the systems I'm responsible for. It's an easy process, but it may seem daunting if you have never done it before. So let's start with the basics. - -### Start with a search - -Even though it's tempting, never assume that seemingly anomalous behavior is the result of a bug. I always start with a search of relevant websites, such as the [Fedora wiki][4], the [CentOS wiki][5], and the documentation for the distro I'm using. I also try to check the various distro listservs. - -If it appears that no one has encountered this problem before (or if they have, they haven't reported it as a bug), I go to the Red Hat Bugzilla site and begin searching for a bug report that might come close to matching the symptoms I encountered. - -You can search the Red Hat Bugzilla site without an account. Go to the Bugzilla site and click on the [Advanced Search tab][6]. - -![Searching for a bug][7] - -For example, if you want to search for bug reports related to Fedora's Rescue mode kernel, enter the following data in the Advanced Search form. - -Field | Logic | Data or Selection ----|---|--- -Summary | Contains the string | Rescue mode kernel -Classification | | Fedora -Product | | Fedora -Component | | grub2 -Status | | New + Assigned - -Then press **Search**. This returns a list of one bug with the ID 1654337 (which happens to be a bug I reported). - -![Bug report list][8] - -Click on the ID to view my bug report details. I entered as much relevant data as possible in the top section of the report. In the comments, I described the problem and included supporting files, other relevant comments (such as the fact that the problem occurred on multiple motherboards), and the steps to reproduce the problem. - -![Bug report details][9] - -The more information you can provide here that pertains to the bug, such as symptoms, the hardware and software environments (if they are applicable), other software that was running at the time, kernel and distro release levels, and so on, the easier it will be to determine where to assign your bug. In this case, I originally chose the kernel component, but it was quickly changed to the GRUB2 component because the problem occurred before the kernel loaded. - -### How to submit a bug report - -The Red Hat [Bugzilla][3] website requires an account to submit new bugs or comment on old ones. It is easy to sign up. On Bugzilla's main page, click **Open a New Account** and fill in the requested information. After you verify your email address, you can fill in the rest of the information to create your account. - -_**Advisory:**_ _Bugzilla is a working website that people count on for support. I strongly suggest not creating an account unless you intend to submit bug reports or comment on existing bugs._ - -To demonstrate how to submit a bug report, I'll use a fictional example of creating a bug against the Xfce4-terminal emulator in Fedora. _Please do not do this unless you have a real bug to report._ - -Log into your account and click on **New** in the menu bar or the **File a Bug** button. You'll need to select a classification for the bug to continue the process. This will narrow down some of the choices on the next page. - -The following image shows how I filled out the required fields (and a couple of others that are not required). - -![Reporting a bug][10] - -When you type a short problem description in the **Summary** field, Bugzilla displays a list of other bugs that might match yours. If one matches, click **Add Me to the CC List** to receive emails when changes are made to the bug. - -If none match, fill in the information requested in the **Description** field. Add as much information as you can, including error messages and screen captures that illustrate the problem. Be sure to describe the exact steps needed to reproduce the problem and how reproducible it is: does it fail every time, every second, third, fourth, random time, or whatever. If it happened only once, it's very unlikely anyone will be able to reproduce the problem you observed. - -When you finish adding as much information as you can, press **Submit Bug**. - -### Be kind - -Bug reporting websites are not for asking questions—they are for searching and reporting bugs. That means you must have performed some work on your own to conclude that there really is a bug. There are many wikis, listservs, and Q&A websites that are appropriate for asking questions. Use sites like Bugzilla to search for existing bug reports on the problem you have found. - -Be sure you submit your bugs on the correct bug reporting website. For example, only submit bugs about Red Hat products on the Red Hat Bugzilla, and submit bugs about LibreOffice by following [LibreOffice's instructions][11]. - -Reporting bugs is not difficult, and it is an important way to participate. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/bug-reporting - -作者:[David Both (Community Moderator)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dboth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bug-insect-butterfly-diversity-inclusion-2.png?itok=TcC9eews -[2]: http://Opensource.com -[3]: https://bugzilla.redhat.com/ -[4]: https://fedoraproject.org/wiki/ -[5]: https://wiki.centos.org/ -[6]: https://bugzilla.redhat.com/query.cgi?format=advanced -[7]: https://opensource.com/sites/default/files/uploads/bugreporting-1.png (Searching for a bug) -[8]: https://opensource.com/sites/default/files/uploads/bugreporting-2.png (Bug report list) -[9]: https://opensource.com/sites/default/files/uploads/bugreporting-4.png (Bug report details) -[10]: https://opensource.com/sites/default/files/uploads/bugreporting-3.png (Reporting a bug) -[11]: https://wiki.documentfoundation.org/QA/BugReport diff --git a/sources/tech/20190329 Russia demands access to VPN providers- servers.md b/sources/tech/20190329 Russia demands access to VPN providers- servers.md deleted file mode 100644 index 0c950eb04f..0000000000 --- a/sources/tech/20190329 Russia demands access to VPN providers- servers.md +++ /dev/null @@ -1,77 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Russia demands access to VPN providers’ servers) -[#]: via: (https://www.networkworld.com/article/3385050/russia-demands-access-to-vpn-providers-servers.html#tk.rss_all) -[#]: author: (Tim Greene https://www.networkworld.com/author/Tim-Greene/) - -Russia demands access to VPN providers’ servers -====== - -### 10 VPN service providers have been ordered to link their servers in Russia to the state censorship agency by April 26 - -![Getty Images][1] - -The Russian censorship agency Roskomnadzor has ordered 10 [VPN][2] service providers to link their servers in Russia to its network in order to stop users within the country from reaching banned sites. - -If they fail to comply, their services will be blocked, according to a machine translation of the order. - -[RELATED: Best VPN routers for small business][3] - -The 10 VPN providers are ExpressVPN, HideMyAss!, Hola VPN, IPVanish, Kaspersky Secure Connection, KeepSolid, NordVPN, OpenVPN, TorGuard, and VyprVPN. - -In response at least five of the 10 – Express VPN, IPVanish, KeepSolid, NordVPN, TorGuard and – say they are tearing down their servers in Russia but continuing to offer their services to Russian customers if they can reach the providers’ servers located outside of Russia. A sixth provider, Kaspersky Labs, which is based in Moscow, says it will comply with the order. The other four could not be reached for this article. - -IPVanish characterized the order as another phase of “Russia’s censorship agenda” dating back to 2017 when the government enacted a law forbidding the use of VPNs to access blocked Web sites. - -“Up until recently, however, they had done little to enforce such rules,” IPVanish [says in its blog][4]. “These new demands mark a significant escalation.” - -The reactions of those not complying are similar. TorGuard says it has taken steps to remove all its physical servers from Russia. It is also cutting off its business with data centers in the region - -**[[Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][5] ]** - -“We would like to be clear that this removal of servers was a voluntary decision by TorGuard management and no equipment seizure occurred,” [TorGuard says in its blog][6]. “We do not store any logs so even if servers were compromised it would be impossible for customer’s data to be exposed.” - -TorGuard says it is deploying more servers in adjacent countries to protect fast download speeds for customers in the region. - -IPVanish says it has faced similar demands from Russia before and responded similarly. In 2016, a new Russian law required online service providers to store customers’ private data for a year. “In response, [we removed all physical server presence in Russia][7], while still offering Russians encrypted connections via servers outside of Russian borders,” the company says. “That decision was made in accordance with our strict zero-logs policy.” - -KeepSolid says it had no servers in Russia, but it will not comply with the order to link with Roskomnadzor's network. KeepSolid says it will [draw on its experience dealing with the Great Firewall of China][8] to fight the Russian censorship attempt. "Our team developed a special [KeepSolid Wise protocol][9] which is designed for use in countries where the use of VPN is blocked," a spokesperson for the company said in an email statement. - -NordVPN says it’s shutting down all its Russian servers, and all of them will be shredded as of April 1. [The company says in a blog][10] that some of its customers who connected to its Russian servers without use of the NordVPN application will have to reconfigure their devices to insure their security. Those customers using the app won’t have to do anything differently because the option to connect to Russia via the app has been removed. - -ExpressVPN is also not complying with the order. "As a matter of principle, ExpressVPN will never cooperate with efforts to censor the internet by any country," said the company's vice presidentn Harold Li in an email, but he said that blocking traffic will be ineffective. "We epect that Russian internet users will still be able to find means of accessing the sites and services they want, albeit perhaps with some additional effort." - -Kaspersky Labs says it will comply with the Russian order and responded to emailed questions about its reaction with this written response: - -“Kaspersky Lab is aware of the new requirements from Russian regulators for VPN providers operating in the country. These requirements oblige VPN providers to restrict access to a number of websites that were listed and prohibited by the Russian Government in the country’s territory. As a responsible company, Kaspersky Lab complies with the laws of all the countries where it operates, including Russia. At the same time, the new requirements don’t affect the main purpose of Kaspersky Secure Connection which protects user privacy and ensures confidentiality and protection against data interception, for example, when using open Wi-Fi networks, making online payments at cafes, airports or hotels. Additionally, the new requirements are relevant to VPN use only in Russian territory and do not concern users in other countries.” - -Join the Network World communities on [Facebook][11] and [LinkedIn][12] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3385050/russia-demands-access-to-vpn-providers-servers.html#tk.rss_all - -作者:[Tim Greene][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Tim-Greene/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/10/ipsecurity-protocols-network-security-vpn-100775457-large.jpg -[2]: https://www.networkworld.com/article/3268744/understanding-virtual-private-networks-and-why-vpns-are-important-to-sd-wan.html -[3]: http://www.networkworld.com/article/3002228/router/best-vpn-routers-for-small-business.html#tk.nww-fsb -[4]: https://nordvpn.com/blog/nordvpn-servers-roskomnadzor-russia/ -[5]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr -[6]: https://torguard.net/blog/why-torguard-has-removed-all-russian-servers/ -[7]: https://blog.ipvanish.com/ipvanish-removes-russian-vpn-servers-from-moscow/ -[8]: https://www.vpnunlimitedapp.com/blog/what-roskomnadzor-demands-from-vpns/ -[9]: https://www.vpnunlimitedapp.com/blog/keepsolid-wise-a-smart-solution-to-get-total-online-freedom/ -[10]: /cms/article/blog%20https:/nordvpn.com/blog/nordvpn-servers-roskomnadzor-russia/ -[11]: https://www.facebook.com/NetworkWorld/ -[12]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190329 ShadowReader- Serverless load tests for replaying production traffic.md b/sources/tech/20190329 ShadowReader- Serverless load tests for replaying production traffic.md deleted file mode 100644 index 3d7f7eaf0c..0000000000 --- a/sources/tech/20190329 ShadowReader- Serverless load tests for replaying production traffic.md +++ /dev/null @@ -1,176 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (ShadowReader: Serverless load tests for replaying production traffic) -[#]: via: (https://opensource.com/article/19/3/shadowreader-serverless) -[#]: author: (Yuki Sawa https://opensource.com/users/yukisawa1/users/yongsanchez) - -ShadowReader: Serverless load tests for replaying production traffic -====== -This open source tool recreates serverless production conditions to -pinpoint causes of memory leaks and other errors that aren't visible in -the QA environment. -![Traffic lights at night][1] - -While load testing has become more accessible, configuring load tests that faithfully re-create production conditions can be difficult. A good load test must use a set of URLs that are representative of production traffic and achieve request rates that mimic real users. Even performing distributed load tests requires the upkeep of a fleet of servers. - -[ShadowReader][2] aims to solve these problems. It gathers URLs and request rates straight from production logs and replays them using AWS Lambda. Being serverless, it is more cost-efficient and performant than traditional distributed load tests; in practice, it has scaled beyond 50,000 requests per minute. - -At Edmunds, we have been able to utilize these capabilities to solve problems, such as Node.js memory leaks that were happening only in production, by recreating the same conditions in our QA environment. We're also using it daily to generate load for pre-production canary deployments. - -The memory leak problem we faced in our Node.js application confounded our engineering team; as it was only occurring in our production environment; we could not reproduce it in QA until we introduced ShadowReader to replay production traffic into QA. - -### The incident - -On Christmas Eve 2017, we suffered an incident where there was a jump in response time across the board with error rates tripling and impacting many users of our website. - -![Christmas Eve 2017 incident][3] - -![Christmas Eve 2017 incident][4] - -Monitoring during the incident helped identify and resolve the issue quickly, but we still needed to understand the root cause. - -At Edmunds, we leverage a robust continuous delivery (CD) pipeline that releases new updates to production multiple times a day. We also dynamically scale up our applications to accommodate peak traffic and scale down to save costs. Unfortunately, this had the side effect of masking a memory leak. - -In our investigation, we saw that the memory leak had existed for weeks, since early December. Memory usage would climb to 60%, along with a slow increase in 99th percentile response time. - -Between our CD pipeline and autoscaling events, long-running containers were frequently being shut down and replaced by newer ones. This inadvertently masked the memory leak until December, when we decided to stop releasing software to ensure stability during the holidays. - -![Slow increase in 99th percentile response time][5] - -### Our CD pipeline - -At a glance, Edmunds' CD pipeline looks like this: - - 1. Unit test - 2. Build a Docker image for the application - 3. Integration test - 4. Load test/performance test - 5. Canary release - - - -The solution is fully automated and requires no manual cutover. The final step is a canary deployment directly into the live website, allowing us to release multiple times a day. - -For our load testing, we leveraged custom tooling built on top of JMeter. It takes random samples of production URLs and can simulate various percentages of traffic. Unfortunately, however, our load tests were not able to reproduce the memory leak in any of our pre-production environments. - -### Solving the memory leak - -When looking at the memory patterns in QA, we noticed there was a very healthy pattern. Our initial hypothesis was that our JMeter load testing in QA was unable to simulate production traffic in a way that allows us to predict how our applications will perform. - -While the load test takes samples from production URLs, it can't precisely simulate the URLs customers use and the exact frequency of calls (i.e., the burst rate). - -Our first step was to re-create the problem in QA. We used a new tool called ShadowReader, a project that evolved out of our hackathons. While many projects we considered were product-focused, this was the only operations-centric one. It is a load-testing tool that runs on AWS Lambda and can replay production traffic and usage patterns against our QA environment. - -The results it returned were immediate: - -![QA results in ShadowReader][6] - -Knowing that we could re-create the problem in QA, we took the additional step to point ShadowReader to our local environment, as this allowed us to trigger Node.js heap dumps. After analyzing the contents of the dumps, it was obvious the memory leak was coming from two excessively large objects containing only strings. At the time the snapshot dumped, these objects contained 373MB and 63MB of strings! - -![Heap dumps show source of memory leak][7] - -We found that both objects were temporary lookup caches containing metadata to be used on the client side. Neither of these caches was ever intended to be persisted on the server side. The user's browser cached only its own metadata, but on the server side, it cached the metadata for all users. This is why we were unable to reproduce the leak with synthetic testing. Synthetic tests always resulted in the same fixed set of metadata in the server-side caches. The leak surfaced only when we had a sufficient amount of unique metadata being generated from a variety of users. - -Once we identified the problem, we were able to remove the large caches that we observed in the heap dumps. We've since instrumented the application to start collecting metrics that can help detect issues like this faster. - -![Collecting metrics][8] - -After making the fix in QA, we saw that the memory usage was constant and the leak was plugged. - -![Graph showing memory leak fixed][9] - -### What is ShadowReader? - -ShadowReader is a serverless load-testing framework powered by AWS Lambda and S3 to replay production traffic. It mimics real user traffic by replaying URLs from production at the same rate as the live website. We are happy to announce that after months of internal usage, we have released it as open source! - -#### Features - - * ShadowReader mimics real user traffic by replaying user requests (URLs). It can also replay certain headers, such as True-Client-IP and User-Agent, along with the URL. - - - * It is more efficient cost- and performance-wise than traditional distributed load tests that run on a fleet of servers. Managing a fleet of servers for distributed load testing can cost $1,000 or more per month; with a serverless stack, it can be reduced to $100 per month by provisioning compute resources on demand. - - - * We've scaled it up to 50,000 requests per minute, but it should be able to handle more than 100,000 reqs/min. - - - * New load tests can be spun up and stopped instantly, unlike traditional load-testing tools, which can take many minutes to generate the test plan and distribute the test data to the load-testing servers. - - - * It can ramp traffic up or down by a percentage value to function as a more traditional load test. - - - * Its plugin system enables you to switch out plugins to change its behavior. For instance, you can switch from past replay (i.e., replays past requests) to live replay (i.e., replays requests as they come in). - - - * Currently, it can replay logs from the [Application Load Balancer][10] and [Classic Load Balancer][11] Elastic Load Balancers (ELBs), and support for other load balancers is coming soon. - - - -### How it works - -ShadowReader is composed of four different Lambdas: a Parser, an Orchestrator, a Master, and a Worker. - -![ShadowReader architecture][12] - -When a user visits a website, a load balancer (in this case, an ELB) typically routes the request. As the ELB routes the request, it will log the event and ship it to S3. - -Next, ShadowReader triggers a Parser Lambda every minute via a CloudWatch event, which parses the latest access (ELB) logs on S3 for that minute, then ships the parsed URLs into another S3 bucket. - -On the other side of the system, ShadowReader also triggers an Orchestrator lambda every minute. This Lambda holds the configurations and state of the system. - -The Orchestrator then invokes a Master Lambda function. From the Orchestrator, the Master receives information on which time slice to replay and downloads the respective data from the S3 bucket of parsed URLs (deposited there by the Parser). - -The Master Lambda divides the load-test URLs into smaller batches, then invokes and passes each batch into a Worker Lambda. If 800 requests must be sent out, then eight Worker Lambdas will be invoked, each one handling 100 URLs. - -Finally, the Worker receives the URLs passed from the Master and starts load-testing the chosen test environment. - -### The bigger picture - -The challenge of reproducibility in load testing serverless infrastructure becomes increasingly important as we move from steady-state application sizing to on-demand models. While ShadowReader is designed and used with Edmunds' infrastructure in mind, any application leveraging ELBs can take full advantage of it. Soon, it will have support to replay the traffic of any service that generates traffic logs. - -As the project moves forward, we would love to see it evolve to be compatible with next-generation serverless runtimes such as Knative. We also hope to see other open source communities build similar toolchains for their infrastructure as serverless becomes more prevalent. - -### Getting started - -If you would like to test drive ShadowReader, check out the [GitHub repo][2]. The README contains how-to guides and a batteries-included [demo][13] that will deploy all the necessary resources to try out live replay in your AWS account. - -We would love to hear what you think and welcome contributions. See the [contributing guide][14] to get started! - -* * * - -_This article is based on "[How we fixed a Node.js memory leak by using ShadowReader to replay production traffic into QA][15]," published on the_ _Edmunds Tech Blog_ _with the help of Carlos Macasaet, Sharath Gowda, and Joey Davis._ _Yuki_ _Sawa_ _also presented this_ as* [ShadowReader—Serverless load tests for replaying production traffic][16] at ([SCaLE 17x][17]) March 7-10 in Pasadena, Calif.* - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/3/shadowreader-serverless - -作者:[Yuki Sawa][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/yukisawa1/users/yongsanchez -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/traffic-light-go.png?itok=nC_851ys (Traffic lights at night) -[2]: https://github.com/edmunds/shadowreader -[3]: https://opensource.com/sites/default/files/uploads/shadowreader_incident1_0.png (Christmas Eve 2017 incident) -[4]: https://opensource.com/sites/default/files/uploads/shadowreader_incident2.png (Christmas Eve 2017 incident) -[5]: https://opensource.com/sites/default/files/uploads/shadowreader_99thpercentile.png (Slow increase in 99th percentile response time) -[6]: https://opensource.com/sites/default/files/uploads/shadowreader_qa.png (QA results in ShadowReader) -[7]: https://opensource.com/sites/default/files/uploads/shadowreader_heapdumps.png (Heap dumps show source of memory leak) -[8]: https://opensource.com/sites/default/files/uploads/shadowreader_code.png (Collecting metrics) -[9]: https://opensource.com/sites/default/files/uploads/shadowreader_leakplugged.png (Graph showing memory leak fixed) -[10]: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html -[11]: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html -[12]: https://opensource.com/sites/default/files/uploads/shadowreader_architecture.png (ShadowReader architecture) -[13]: https://github.com/edmunds/shadowreader#live-replay -[14]: https://github.com/edmunds/shadowreader/blob/master/CONTRIBUTING.md -[15]: https://technology.edmunds.com/2018/08/25/Investigating-a-Memory-Leak-and-Introducing-ShadowReader/ -[16]: https://www.socallinuxexpo.org/scale/17x/speakers/yuki-sawa -[17]: https://www.socallinuxexpo.org/ diff --git a/sources/tech/20190401 Meta Networks builds user security into its Network-as-a-Service.md b/sources/tech/20190401 Meta Networks builds user security into its Network-as-a-Service.md deleted file mode 100644 index 777108f639..0000000000 --- a/sources/tech/20190401 Meta Networks builds user security into its Network-as-a-Service.md +++ /dev/null @@ -1,87 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Meta Networks builds user security into its Network-as-a-Service) -[#]: via: (https://www.networkworld.com/article/3385531/meta-networks-builds-user-security-into-its-network-as-a-service.html#tk.rss_all) -[#]: author: (Linda Musthaler https://www.networkworld.com/author/Linda-Musthaler/) - -Meta Networks builds user security into its Network-as-a-Service -====== - -### Meta Networks has a unique approach to the security of its Network-as-a-Service. A tight security perimeter is built around every user and the specific resources each person needs to access. - -![MF3d / Getty Images][1] - -Network-as-a-Service (NaaS) is growing in popularity and availability for those organizations that don’t want to host their own LAN or WAN, or that want to complement or replace their traditional network with something far easier to manage. - -With NaaS, a service provider creates a multi-tenant wide area network comprised of geographically dispersed points of presence (PoPs) connected via high-speed Tier 1 carrier links that create the network backbone. The PoPs peer with cloud services to facilitate customer access to cloud applications such as SaaS offerings, as well as to infrastructure services from the likes of Amazon, Google and Microsoft. User organizations connect to the network from whatever facilities they have — data centers, branch offices, or even individual client devices — typically via SD-WAN appliances and/or VPNs. - -Numerous service providers now offer Network-as-a-Service. As the network backbone and the PoPs become more of a commodity, the providers are distinguishing themselves on other value-added services, such as integrated security or WAN optimization. - -**[ Also read:[What to consider when deploying a next generation firewall][2] | Get regularly scheduled insights: [Sign up for Network World newsletters][3]. ]** - -Ever since its launch about a year ago, [Meta Networks][4] has staked security as its primary value-add. What’s different about the Meta NaaS is the philosophy that the network is built around users, not around specific sites or offices. Meta Networks does this by building a software-defined perimeter (SDP) for each user, giving workers micro-segmented access to only the applications and network resources they need. The vendor was a little ahead of its time with SDP, but the market is starting to catch up. Companies are beginning to show interest in SDP as a VPN replacement or VPN alternative. - -Meta NaaS has a zero-trust architecture where each user is bound by an SDP. Each user has a unique, fixed identity no matter from where they connect to this network. The SDP security framework allows one-to-one network connections that are dynamically created on demand between the user and the specific resources they need to access. Everything else on the NaaS is invisible to the user. No access is possible unless it is explicitly granted, and it’s continuously verified at the packet level. This model effectively provides dynamically provisioned secure network segmentation. - -## SDP tightly controls access to specific resources - -This approach works very well when a company wants to securely connect employees, contractors, and external partners to specific resources on the network. For example, one of Meta Networks’ customers is Via Transportation, a New York-based company that has a ride-sharing platform. The company operates its own ride-sharing services in various cities in North America and Europe, and it licenses its technology to other transit systems around the world. - -Via’s operations are completely cloud-native, and so it has no legacy-style site-based WAN to connect its 400-plus employees and contractors to their cloud-based applications. Via’s partners, primarily transportation operators in different cities and countries, also need controlled access to specific portions of Via’s software platform to manage rideshares. Giving each group of users access to the applications they need — and _only_ to the ones they specifically need – was a challenge using a VPN. Using the Meta NaaS instead gives Via more granular control over who has what access. - -**[[Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][5] ]** - -Via’s employees with managed devices connect to the Meta NaaS using client software on the device, and they are authenticated using Okta and a certificate. Contractors and customers with unmanaged devices use a browser-based access solution from Meta that doesn’t require installation or setup. New users can be on-boarded quickly and assigned granular access policies based on their role. Integration with Okta provides information that facilitates identity-based access policies. Once users connect to the network, they can see only the applications and network resources that their policy allows; everything else is invisible to them under the SDP architecture. - -For Via, there are several benefits to the Meta NaaS approach. First and foremost, the company doesn’t have to own or operate its own WAN infrastructure. Everything is a managed service located in the cloud — the same business model that Via itself espouses. Next, this solution scales easily to support the company’s growth. Meta’s security integrates with Via’s existing identity management system, so identities and access policies can be centrally managed. And finally, the software-defined perimeter hides resources from unauthorized users, creating security by obscurity. - -## Tightening security even further - -Meta Networks further tightens the security around the user by doing device posture checks — “NAC lite,” if you will. A customer can define the criteria that devices have to meet before they are allowed to connect to the NaaS. For example, the check could be whether a security certificate is installed, if a registry key is set to a specific value, or if anti-virus software is installed and running. It’s one more way to enforce company policies on network access. - -When end users use the browser-based method to connect to the Meta NaaS, all activity is recorded in a rich log so that everything can be audited, but also to set alerts and look for anomalies. This data can be exported to a SIEM if desired, but Meta has its own notification and alert system for security incidents. - -Meta Networks recently implemented some new features around management, including smart groups and support for the System for Cross-Domain Identity Management (SCIM) protocol. The smart groups feature provides the means to add an extra notation or tag to elements such as devices, services, network subnets or segments, and basically everything that’s in the system. These tags can then be applied to policy. For example, a customer could label some of their services as a production, staging, or development environment. Then a policy could be implemented to say that only sales people can access the production environment. Smart groups are just one more way to get even more granular about policy. - -The SCIM support makes on-boarding new users simple. SCIM is a protocol that is used to synchronize and provision users and identities from a third-party identity provider such as Okta, Azure AD, or OneLogin. A customer can use SCIM to provision all the users from the IdP into the Meta system, synchronize in real time the groups and attributes, and then use that information to build the access policies inside Meta NaaS. - -These and other security features fit into Meta Networks’ vision that the security perimeter goes with you no matter where you are, and the perimeter includes everything that was formerly delivered through the data center. It is delivered through the cloud to your client device with always-on security. It’s a broad approach to SDP and a unique approach to NaaS. - -**Reviews: 4 free, open-source network monitoring tools** - - * [Icinga: Enterprise-grade, open-source network-monitoring that scales][6] - * [Nagios Core: Network-monitoring software with lots of plugins, steep learning curve][7] - * [Observium open-source network monitoring tool: Won’t run on Windows but has a great user interface][8] - * [Zabbix delivers effective no-frills network monitoring][9] - - - -Join the Network World communities on [Facebook][10] and [LinkedIn][11] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3385531/meta-networks-builds-user-security-into-its-network-as-a-service.html#tk.rss_all - -作者:[Linda Musthaler][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Linda-Musthaler/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/10/firewall_network-security_lock_padlock_cyber-security-100776989-large.jpg -[2]: https://www.networkworld.com/article/3236448/lan-wan/what-to-consider-when-deploying-a-next-generation-firewall.html -[3]: https://www.networkworld.com/newsletters/signup.html -[4]: https://www.metanetworks.com/ -[5]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr -[6]: https://www.networkworld.com/article/3273439/review-icinga-enterprise-grade-open-source-network-monitoring-that-scales.html?nsdr=true#nww-fsb -[7]: https://www.networkworld.com/article/3304307/nagios-core-monitoring-software-lots-of-plugins-steep-learning-curve.html -[8]: https://www.networkworld.com/article/3269279/review-observium-open-source-network-monitoring-won-t-run-on-windows-but-has-a-great-user-interface.html?nsdr=true#nww-fsb -[9]: https://www.networkworld.com/article/3304253/zabbix-delivers-effective-no-frills-network-monitoring.html -[10]: https://www.facebook.com/NetworkWorld/ -[11]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190401 Top Ten Reasons to Think Outside the Router -2- Simplify and Consolidate the WAN Edge.md b/sources/tech/20190401 Top Ten Reasons to Think Outside the Router -2- Simplify and Consolidate the WAN Edge.md deleted file mode 100644 index 8177390648..0000000000 --- a/sources/tech/20190401 Top Ten Reasons to Think Outside the Router -2- Simplify and Consolidate the WAN Edge.md +++ /dev/null @@ -1,103 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Top Ten Reasons to Think Outside the Router #2: Simplify and Consolidate the WAN Edge) -[#]: via: (https://www.networkworld.com/article/3384928/top-ten-reasons-to-think-outside-the-router-2-simplify-and-consolidate-the-wan-edge.html#tk.rss_all) -[#]: author: (Rami Rammaha https://www.networkworld.com/author/Rami-Rammaha/) - -Top Ten Reasons to Think Outside the Router #2: Simplify and Consolidate the WAN Edge -====== - -![istock][1] - -We’re now near reaching the end of our homage to the iconic David Letterman Top Ten List segment from his former Late Show, as [Silver Peak][2] counts down the *Top Ten Reasons to Think Outside the Router. *Click for the [#3][3], [#4][4], [#5][5], [#6][6], [#7][7], [#8][8], [#9][9] and [#10][10] reasons to retire traditional branch routers. - -_The #2 reason it’s time to retire branch routers: conventional router-centric WAN architectures are rigid and complex to manage!_ - -### **Challenges of conventional WAN edge architecture** - -A conventional WAN edge architecture consists of a disparate array of devices, including routers, firewalls, WAN optimization appliances, wireless controllers and so on. This architecture was born in the era when applications were hosted exclusively in the data center. With this model, deploying new applications or provisioning new policies or making policy changes has become an arduous and time-consuming task. Configuration, deployment and management requires specialized on-premise IT expertise to manually program and configure each device with its own management interface, often using an arcane CLI. This process has hit the wall in the cloud era proving too slow, complex, error-prone, costly and inefficient. - -As cloud-first enterprises increasingly migrate applications and infrastructure to the cloud, the traditional WAN architecture is no longer efficient. IT is now faced with a new set of challenges when it comes to connecting users securely and directly to the applications that run their businesses: - - * How do you manage and consistently apply QoS and security policies across the distributed enterprise? - * How do you intelligently automate traffic steering across multiple WAN transport services based on application type and unique requirements? - * How do you deliver the highest quality of experiences to users when running applications over broadband, especially voice and video? - * How do you quickly respond to continuously changing business requirements? - - - -These are just some of the new challenges facing IT teams in the cloud era. To be successful, enterprises will need to shift toward a business-first networking model where top-down business intent drives how the network behaves. And they would be well served to deploy a business-driven unified [SD-WAN][11] edge platform to transform their networks from a business constraint to a business accelerant. - -### **Shifting toward a business-driven WAN edge platform** - -A business-driven WAN edge platform is designed to enable enterprises to realize the full transformation promise of the cloud. It is a model where top-down business intent is the driver, not bottoms-up technology constraints. It’s outcome oriented, utilizing automation, artificial intelligence (AI) and machine learning to get smarter every day. Through this continuous adaptation, and the ability to improve the performance of underlying transport and applications, it delivers the highest quality of experience to end users. This is in stark contrast to the router-centric model where application policies must be shoe-horned to fit within the constraints of the network. A business-driven, top-down approach continuously stays in compliance with business intent and centrally defined security policies. - -### **A unified platform for simplifying and consolidating the WAN Edge** - -Achieving a business-driven architecture requires a unified platform, designed from the ground up as one system, uniting [SD-WAN][12], [firewall][13], [segmentation][14], [routing][15], [WAN optimization][16], application visibility and control in a single-platform. Furthermore, it requires [centralized orchestration][17] with complete observability of the entire wide area network through a single pane of glass. - -The use case “[Simplifying WAN Architecture][18]” describes in detail key capabilities of the Silver Peak [Unity EdgeConnect™][19] SD-WAN edge platform. It illustrates how EdgeConnect enables enterprises to simplify branch office WAN edge infrastructure and streamline deployment, configuration and ongoing management. - -![][20] - -### **Business and IT outcomes of a business-driven SD-WAN** - - * Accelerates deployment, leveraging consistent hardware, software, cloud delivery models - * Saves up to 40 percent on hardware, software, installation, management and maintenance costs when replacing traditional routers - * Protects existing investment in security through simplified service chaining with our broadest ecosystem partners: [Check Point][21], [Forcepoint][22], [McAfee][23], [OPAQ][24], [Palo Alto Networks][25], [Symantec][26] and [Zscaler][27]. - * Reduces foot print by 75 percent as it unifies network functions into a single platform - * Saves more than 50 percent on WAN optimization costs by selectively applying it when and where is needed on an application-by-application basis - * Accelerates time-to-resolution of application or network performance bottlenecks from days to minutes with simple, visual application and WAN analytics - - - -Calculate your [ROI][28] today and learn why the time is now to [think outside the router][29] and deploy the business-driven Silver Peak EdgeConnect SD-WAN edge platform! - -![][30] - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3384928/top-ten-reasons-to-think-outside-the-router-2-simplify-and-consolidate-the-wan-edge.html#tk.rss_all - -作者:[Rami Rammaha][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Rami-Rammaha/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/silverpeak_main-100792490-large.jpg -[2]: https://www.silver-peak.com/why-silver-peak -[3]: http://blog.silver-peak.com/think-outside-the-router-reason-3-mpls-contract-renewal -[4]: http://blog.silver-peak.com/top-ten-reasons-to-think-outside-the-router-4-broadband-is-used-only-for-failover -[5]: http://blog.silver-peak.com/think-outside-the-router-reason-5-manual-cli-based-configuration-and-management -[6]: http://blog.silver-peak.com/https-blog-silver-peak-com-think-outside-the-router-reason-6 -[7]: http://blog.silver-peak.com/think-outside-the-router-reason-7-exorbitant-router-support-and-maintenance-costs -[8]: http://blog.silver-peak.com/think-outside-the-router-reason-8-garbled-voip-pixelated-video -[9]: http://blog.silver-peak.com/think-outside-router-reason-9-sub-par-saas-performance -[10]: http://blog.silver-peak.com/think-outside-router-reason-10-its-getting-cloudy -[11]: https://www.silver-peak.com/sd-wan/sd-wan-explained -[12]: https://www.silver-peak.com/sd-wan -[13]: https://www.silver-peak.com/products/unity-edge-connect/orchestrated-security-policies -[14]: https://www.silver-peak.com/resource-center/centrally-orchestrated-end-end-segmentation -[15]: https://www.silver-peak.com/products/unity-edge-connect/bgp-routing -[16]: https://www.silver-peak.com/products/unity-boost -[17]: https://www.silver-peak.com/products/unity-orchestrator -[18]: https://www.silver-peak.com/use-cases/simplifying-wan-architecture -[19]: https://www.silver-peak.com/products/unity-edge-connect -[20]: https://images.idgesg.net/images/article/2019/04/sp_linkthrough-copy-100792505-large.jpg -[21]: https://www.silver-peak.com/resource-center/check-point-silver-peak-securing-internet-sd-wan -[22]: https://www.silver-peak.com/company/tech-partners/forcepoint -[23]: https://www.silver-peak.com/company/tech-partners/mcafee -[24]: https://www.silver-peak.com/company/tech-partners/opaq-networks -[25]: https://www.silver-peak.com/resource-center/palo-alto-networks-and-silver-peak -[26]: https://www.silver-peak.com/company/tech-partners/symantec -[27]: https://www.silver-peak.com/resource-center/zscaler-and-silver-peak-solution-brief -[28]: https://www.silver-peak.com/sd-wan-interactive-roi-calculator -[29]: https://www.silver-peak.com/think-outside-router -[30]: https://images.idgesg.net/images/article/2019/04/roi-100792506-large.jpg diff --git a/sources/tech/20190402 3 Essentials for Achieving Resiliency at the Edge.md b/sources/tech/20190402 3 Essentials for Achieving Resiliency at the Edge.md deleted file mode 100644 index 38cbc70e94..0000000000 --- a/sources/tech/20190402 3 Essentials for Achieving Resiliency at the Edge.md +++ /dev/null @@ -1,83 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (3 Essentials for Achieving Resiliency at the Edge) -[#]: via: (https://www.networkworld.com/article/3386438/3-essentials-for-achieving-resiliency-at-the-edge.html#tk.rss_all) -[#]: author: (Anne Taylor https://www.networkworld.com/author/Anne-Taylor/) - -3 Essentials for Achieving Resiliency at the Edge -====== - -### Edge computing requires different thinking and management to ensure the always-on availability that users have come to demand. - -![iStock][1] - -> “The IT industry has done a good job of making robust data centers that are highly manageable, highly secure, with redundant systems,” [says Kevin Brown][2], SVP Innovation and CTO for Schneider Electric’s Secure Power Division. - -However, he continues, companies then connect these data centers to messy edge closets and server rooms, which over time have become “micro mission-critical data centers” in their own right — making system availability vital. If not designed and managed correctly, the situation can be disastrous if users cannot connect to business-critical applications. - -To avoid unacceptable downtime, companies should incorporate three essential ingredients into their edge computing deployments: remote management, physical security, and rapid deployments. - -**Remote management** - -Depending on the company’s size, staff could be managing several — or many multiple — edge sites. Not only is this time consuming and costly, it’s also complex, especially if protocols differ from site to site. - -While some organizations might deploy traditional remote monitoring technology to manage these sites, it’s important to note these tools: don’t provide real-time status updates; are largely reactionary rather than proactive; and are sometimes limited in terms of data output. - -Coupled with the need to overcome these limitations, the economics for managing edge sites necessitate that organizations consider a digital, or cloud-based, solution. In addition to cost savings, these platforms provide: - - * Simplification in monitoring across edge sites - * Real-time visibility, right down to any device on the network - * Predictive analytics, including data-driven intelligence and recommendations to ensure proactive service delivery - - - -**Physical security** - -Small, local edge computing sites are often situated within larger corporate or wide-open spaces, sometimes in highly accessible, shared offices and public areas. And sometimes they’re set up on-the-fly for a time-sensitive project. - -However, when there is no dedicated location and open racks are unsecured, the risks of malicious and accidental incidents escalate. - -To prevent unauthorized access to IT equipment at edge computing sites, proper physical security is critical and requires: - - * Physical space monitoring, with environmental sensors for temperature and humidity - * Access control, with biometric sensors as an option - * Audio and video surveillance and monitoring with recording - * If possible, install IT equipment within a secure enclosure - - - -**Rapid deployments** - -The [benefits of edge computing][3] are significant, especially the ability to bring bandwidth-intensive computing closer to the user, which leads to faster speed to market and greater productivity. - -Create a holistic plan that will enable the company to quickly deploy edge sites, while ensuring resiliency and reliability. That means having a standardized, repeatable process including: - - * Pre-configured, integrated equipment that combines server, storage, networking, and software in a single enclosure — a prefabricated micro data center, if you will - * Designs that specify supporting racks, UPSs, PDUs, cable management, airflow practices, and cooling systems - - - -These best practices as well as a balanced, systematic approach to edge computing deployments will ensure the always-on availability that today’s employees and users have come to expect. - -Learn how to enable resiliency within your edge computing deployment at [APC.com][4]. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3386438/3-essentials-for-achieving-resiliency-at-the-edge.html#tk.rss_all - -作者:[Anne Taylor][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Anne-Taylor/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/istock-900882382-100792635-large.jpg -[2]: https://www.youtube.com/watch?v=IfsCTFSH6Jc -[3]: https://www.networkworld.com/article/3342455/how-edge-computing-will-bring-business-to-the-next-level.html -[4]: https://www.apc.com/us/en/solutions/business-solutions/edge-computing.jsp diff --git a/sources/tech/20190402 Automate password resets with PWM.md b/sources/tech/20190402 Automate password resets with PWM.md deleted file mode 100644 index 0bc7012c21..0000000000 --- a/sources/tech/20190402 Automate password resets with PWM.md +++ /dev/null @@ -1,94 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Automate password resets with PWM) -[#]: via: (https://opensource.com/article/19/4/automate-password-resets-pwm) -[#]: author: (James Mawson https://opensource.com/users/dxmjames) - -Automate password resets with PWM -====== -PWM puts responsibility for password resets in users' hands, freeing IT -for more pressing tasks. -![Password][1] - -One of the things that can be "death by a thousand cuts" for any IT team's sanity and patience is constantly being asked to reset passwords. - -The best way we've found to handle this is to ditch your hashing algorithms and store your passwords in plaintext so that your users can retrieve them at any time. - -Ha! I am, of course, kidding. That's a terrible idea. - -When your users forget their passwords, you'll still need to reset them. But is there a way to break free from the monotonous, repetitive task of doing it manually? - -### PWM puts password resets in users' hands - -[PWM][2] is an open source ([GPLv2][3]) [JavaServer Pages][4] application that provides a webpage where users can submit their own password resets. If certain conditions are met—which you can configure—PWM will send a password reset instruction to whichever directory service you've connected it to. - -![PWM password reset screen][5] - -One thing that's great about PWM is it's very easy to add it to an existing network. If you're largely happy with what you've already built—just sick of processing password requests manually—you can just throw PWM into the mix. - -PWM works with any implementation of [LDAP][6] and written to run on [Apache Tomcat][7]. Once you get it up and running, you can administer it through a browser-based dashboard. - -### Why PWM is better than Microsoft SSPR - -As much as our team prefers open source, we still have to deal with Windows networks. Of course, Microsoft has its own password-reset tool, called Self Service Password Reset (SSPR). But I prefer PWM, and not just because of a general preference for open source. I believe PWM is better for my use case for the following reasons: - - * **SSPR has a very complex licensing system**. You need different products depending on what servers you're running and whose metal they're running on. This is a constraint on your flexibility and a whole extra pain in the neck when it's time to move to new architecture. For [the busy admin who wants to go home on time][8], it's extra bureaucracy to get the purchase approved. PWM just works on what it's configured to work on at no cost. - - * **PWM is not just for Windows**. It works with any kind of LDAP server. So, it's one less part you need to worry about if you ever stop using Windows for a certain role. It also means that, once you've gotten the hang of it, you have something in your bag of tricks that you can use in many different environments. - - * **PWM is easy to install**. If you know how to install Linux as a virtual machine—and, let's face it, if you're running a network, you probably do—then you're already most of the way there. - - - - -PWM can run on Windows, but we prefer to include it in a Windows network by running it on a Linux virtual machine, [for example, Ubuntu Server 16.04][9]. - -### Risks and rewards of automation - -Password resets are an attack vector, so be thoughtful about where and how you use PWM. Automating your password resets can mean an attacker is potentially just one unencrypted email connection away from resetting a password. - -To some extent, automating your password resets trades a bit of security for some convenience. So maybe this isn't the right way to handle C-suite user accounts that approve large payments. - -On the other hand, manual resets are not 100% secure either—they can be gamed with targeted attacks like spear phishing and social engineering. It's much easier to fall for these scams if your team gets frequent reset requests and is sick of dealing with them. You may benefit from automating the bulk of lower-risk requests so you can focus on protecting the higher-risk accounts manually; this is possible given the time you can save using PWM. - -Some of the risks associated with shifting resets to users can be mitigated with PWM's built-in features, such as insisting users verify their password reset request by email or SMS. You can also make PWM accessible only on the intranet. - -![PWM configuration options][10] - -PWM doesn't store any passwords, so that's one less headache. It does, however, store answers to users' secret questions in a MySQL database that can be configured to be stored locally or on a separate server, depending on your preference. - -There are a ton of ways to make PWM look and feel like a polished part of your team's infrastructure. With a little bit of CSS know-how, you can customize the user interface for your business' branding. There are also more options for implementation than you can shake a stick at. - -### Wrapping up - -PWM is a great open source project, it's actively developed, and it has a helpful online community. It's a great alternative to Microsoft's Azure SSPR solution for small to midsized businesses that have to keep a tight grip on the purse strings, and it slots in neatly to any existing Active Directory infrastructure. It also saves IT's time by outsourcing this mundane task to users. - -I advise every network admin to dive in and have a look at the cool stuff PWM offers. Check out the [getting started resources][11] and reach out to the community if you have any questions. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/automate-password-resets-pwm - -作者:[James Mawson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dxmjames -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/password.jpg?itok=ec6z6YgZ (Password) -[2]: https://github.com/pwm-project/pwm -[3]: https://github.com/pwm-project/pwm/blob/master/LICENSE -[4]: https://www.oracle.com/technetwork/java/index-jsp-138231.html -[5]: https://opensource.com/sites/default/files/uploads/pwm_password-reset.png (PWM password reset screen) -[6]: https://opensource.com/business/14/5/top-4-open-source-ldap-implementations -[7]: http://tomcat.apache.org/ -[8]: https://opensource.com/article/18/7/tools-admin -[9]: https://blog.dxmtechsupport.com.au/adding-pwm-password-reset-tool-to-windows-network/ -[10]: https://opensource.com/sites/default/files/uploads/pwm-configuration.png (PWM configuration options) -[11]: https://github.com/pwm-project/pwm#links diff --git a/sources/tech/20190402 How to Install and Configure Plex on Ubuntu Linux.md b/sources/tech/20190402 How to Install and Configure Plex on Ubuntu Linux.md deleted file mode 100644 index 8b5010a2ec..0000000000 --- a/sources/tech/20190402 How to Install and Configure Plex on Ubuntu Linux.md +++ /dev/null @@ -1,202 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Install and Configure Plex on Ubuntu Linux) -[#]: via: (https://itsfoss.com/install-plex-ubuntu) -[#]: author: (Chinmay https://itsfoss.com/author/chinmay/) - -How to Install and Configure Plex on Ubuntu Linux -====== - -When you are a media hog and have a big collection of movies, photos or music, the below capabilities would be very handy. - - * Share media with family and other people. - * Access media from different devices and platforms. - - - -Plex ticks all of those boxes and more. Plex is a client-server media player system with additional features. Plex supports a wide array of platforms, both for the server and the player. No wonder it is considered one of the [best media servers for Linux][1]. - -Note: Plex is not a completely open source media player. We have covered it because this is one of the frequently [requested tutorial][2]. - -### Install Plex on Ubuntu - -For this guide I am installing Plex on Elementary OS, an Ubuntu based distribution. You can still follow along if you are installing it on a headless Linux machine. - -Go to the Plex [downloads][3] page, select Ubuntu 64-bit (I would not recommend installing it on a 32-bit CPU) and download the .deb file. - -![][4] - -[Download Plex][3] - -You can [install the .deb file][5] by just clicking on the package. If it does not work, you can use an installer like **Eddy** or **[GDebi][6].** - -You can also install it via the terminal using dpkg as shown below. - -Install Plex on a headless Linux system - -For a [headless system][7], you can use **wget** to download the .deb package. This example uses the current link for Ubuntu, at the time of writing. Be sure to use the up-to-date version supplied on the Plex website. - -``` -wget https://downloads.plex.tv/plex-media-server-new/1.15.1.791-8bec0f76c/debian/plexmediaserver_1.15.1.791-8bec0f76c_amd64.deb -``` - -The above command downloads the 64-bit .deb package. Once downloaded install the package using the following command. - -``` -dpkg -i plexmediaserver*.deb -``` - -Enable version upgrades for Plex - -The .deb installation does create an entry in sources.d, but [repository updates][8] are not enabled by default and the contents of _plexmediaserver.list_ are commented out. This means that if there is a new Plex version available, your system will not be able to update your Plex install. - -To enable repository updates you can either remove the # from the line starting with deb or run the following commands. - -``` -echo deb https://downloads.plex.tv/repo/deb public main | sudo tee /etc/apt/sources.list.d/plexmediaserver.list -``` - -The above command updates the entry in sources.d directory. - -We also need to add Plex’s public key to facilitate secure and safe downloads. You can try running the command below, unfortunately this **did not work for me** and the [GPG][9] key was not added. - -``` -curl https://downloads.plex.tv/plex-keys/PlexSign.key | sudo apt-key add - -``` - -To fix this issue I found out the key hash for from the error message after running _sudo apt-get update._ - -![][10] - -``` -97203C7B3ADCA79D -``` - -The above hash can be used to add the key from the key-server. Run the below commands to add the key. - -``` -gpg --keyserver https://downloads.plex.tv/plex-keys/PlexSign.key --recv-keys 97203C7B3ADCA79D -``` - -``` -gpg --export --armor 97203C7B3ADCA79D|sudo apt-key add - -``` - -You should see an **OK** once the key is added. - -Run the below command to verify that the repository is added to the sources list successfully. - -``` -sudo apt update -``` - -To update Plex to the newest version available on the repository, run the below [apt-get command][11]. - -``` -sudo apt-get --only-upgrade install plexmediaserver -``` - -Once installed the Plex service automatically starts running. You can check if its running by running the this command in a terminal. - -``` -systemctl status plexmediaserver -``` - -If the service is running properly you should see something like this. - -![Check the status of Plex Server][12] - -### Configuring Plex as a Media Server - -The Plex server is accessible on the ports 32400 and 32401. Navigate to **localhost:32400** or **localhost:32401** using a browser. You should replace the ‘localhost’ with the IP address of the machine running Plex server if you are going headless. - -The first time you are required to sign up or log in to your Plex account. - -![Plex Login Page][13] - -Now you can go ahead and give a friendly name to your Plex Server. This name will be used to identify the server over the network. You can also have multiple Plex servers identified by different names on the same network. - -![Plex Server Setup][14] - -Now it is finally time to add all your collections to the Plex library. Here your collections will be automatically get indexed and organized. - -You can click the add library button to add all your collections. - -![Add Media Library][15] - -![][16] - -Navigate to the location of the media you want to add to Plex . - -![][17] - -You can add multiple folders and different types of media. - -When you are done, you are taken to a very slick looking Plex UI. You can already see the contents of your libraries showing up on the home screen. It also automatically selects a thumbnail and also fills the metadata. - -![][18] - -You can head over to the settings and configure some of the settings. You can create new users( **only with Plex Pass** ), adjust the transcoding settings set scheduled library updates and more. - -If you have a public IP assigned to your router by the ISP you can also enable Remote Access. This means that you can be traveling and still access your libraries at home, considering you have your Plex server running all the time. - -Now you are all set up and ready, but how do you access your media? Yes you can access through your browser but Plex has a presence in almost all platforms you can think of including Android Auto. - -### Accessing Your Media and Plex Pass - -You can access you media either by using the web browser (the same address you used earlier) or Plex’s suite of apps. The web browser experience is pretty good on computers and can be better on phones. - -Plex apps provide a much better experience. But, the iOS and Android apps need to be activated with a [Plex Pass][19]. Without activation you are limited to 1 minute of video playback and images are watermarked. - -Plex Pass is a premium subscription service which activates the mobile apps and enables more features. You can also individually activate your apps tied to a particular phone for a cheaper price. You can also create multiple users and set permissions with the Plex Pass which is a very handy feature. - -You can check out all the benefits of Plex Pass [here][19]. - -_Note: Plex Meida Player is free on all platforms other than Android and iOS App._ - -**Conclusion** - -That’s about all things you need to know for the first time configuration, go ahead and explore the Plex UI, it also gives you access to free online content like podcasts and music through Tidal. - -There are alternatives to Plex like [Jellyfin][20] which is free but native apps are in beta and on road to be published on the App stores.You can also use a NAS with any of the freely available media centers like Kodi, OpenELEC or even VLC media player. - -Here is an article listing the [best Linux media servers.][1] - -Let us know your experience with Plex and what you use for your media sharing needs. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/install-plex-ubuntu - -作者:[Chinmay][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/chinmay/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/best-linux-media-server/ -[2]: https://itsfoss.com/request-tutorial/ -[3]: https://www.plex.tv/media-server-downloads/ -[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/downloads-plex.png?ssl=1 -[5]: https://itsfoss.com/install-deb-files-ubuntu/ -[6]: https://itsfoss.com/gdebi-default-ubuntu-software-center/ -[7]: https://www.lions-wing.net/lessons/servers/home-server.html -[8]: https://itsfoss.com/ubuntu-repositories/ -[9]: https://www.gnupg.org/ -[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/Screenshot-from-2019-03-26-07-21-05-1.png?ssl=1 -[11]: https://itsfoss.com/apt-get-linux-guide/ -[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/check-plex-service.png?ssl=1 -[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/plex-home-page.png?ssl=1 -[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/Plex-server-setup.png?ssl=1 -[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/add-library.png?ssl=1 -[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/add-plex-library.png?ssl=1 -[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/add-plex-folder.png?ssl=1 -[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/Screenshot-from-2019-03-17-22-27-56.png?ssl=1 -[19]: https://www.plex.tv/plex-pass/ -[20]: https://jellyfin.readthedocs.io/en/latest/ diff --git a/sources/tech/20190402 Intel-s Agilex FPGA family targets data-intensive workloads.md b/sources/tech/20190402 Intel-s Agilex FPGA family targets data-intensive workloads.md deleted file mode 100644 index 686a2be6a4..0000000000 --- a/sources/tech/20190402 Intel-s Agilex FPGA family targets data-intensive workloads.md +++ /dev/null @@ -1,103 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Intel's Agilex FPGA family targets data-intensive workloads) -[#]: via: (https://www.networkworld.com/article/3386158/intels-agilex-fpga-family-targets-data-intensive-workloads.html#tk.rss_all) -[#]: author: (Marc Ferranti https://www.networkworld.com) - -Intel's Agilex FPGA family targets data-intensive workloads -====== -Agilex processors are the first Intel FPGAs to use 10nm manufacturing, achieving a performance boost for AI, financial and IoT workloads -![Intel][1] - -After teasing out details about the technology for a year and half under the code name Falcon Mesa, Intel has unveiled the Agilex family of FPGAs, aimed at data-center and network applications that are processing increasing amounts of data for AI, financial, database and IoT workloads. - -The Agilex family, expected to start appearing in devices in the third quarter, is part of a new wave of more easily programmable FPGAs that is beginning to take an increasingly central place in computing as data centers are called on to handle an explosion of data. - -**Learn about edge networking** - - * [How edge networking and IoT will reshape data centers][2] - * [Edge computing best practices][3] - * [How edge computing can help secure the IoT][4] - - - -FPGAs, or field programmable gate arrays, are built around around a matrix of configurable logic blocks (CLBs) linked via programmable interconnects that can be programmed after manufacturing – and even reprogrammed after being deployed in devices – to run algorithms written for specific workloads. They can thus be more efficient on a performance-per-watt basis than general-purpose CPUs, even while driving higher performance. - -### Accelerated computing takes center stage - -CPUs can be packaged with FPGAs, offloading specific tasks to them and enhancing overall data-center and network efficiency. The concept, known as accelerated computing, is increasingly viewed by data-center and network managers as a cost-efficient way to handle increasing data and network traffic. - -"This data is creating what I call an innovation race across from the edge to the network to the cloud," said Dan McNamara, general manager of the Programmable Solutions Group (PSG) at Intel. "We believe that we’re in the largest adoption phase for FPGAs in our history." - -The Agilex family is the first line of FPGAs developed from the ground up in the wake of [Intel’s $16.7 billion 2015 acquisition of Altera.][5] It's the first FPGA line to be made with Intel's 10nm manufacturing process, which adds billions of transistors to the FPGAs compared to earlier generations. Along with Intel's second-generation HyperFlex architecture, it helps give Agilex 40 percent higher performance than the company's current high-end FPGA family, the Stratix 10 line, Intel says. - -HyperFlex architecture includes additional registers – places on a processor that temporarily hold data – called Hyper-Registers, located everywhere throughout the core fabric to enhance bandwidth as well as area and power efficiency. - -**[[Take this mobile device management course from PluralSight and learn how to secure devices in your company without degrading the user experience.][6] ]** - -### Memory coherency is key - -Agilex FPGAs are also the first processors to support [Compute Express Link (CXL), a high-speed interconnect][7] designed to maintain memory coherency among CPUs like Intel's second-generation Xeon Scalable processors and purpose-built accelerators like FPGAs and GPUs. It ensures that different processors don't clash when trying to write to the same memory space, essentially allowing CPUs and accelerators to share memory. - -"By having this CXL bus you can actually write applications that will use all the real memory so what that does is it simplifies the programming model in large memory workloads," said Patrick Moorhead, founder and principal at Moor Insights & Strategy. - -The ability to integrate FPGAs, other accelerators and CPUs is key to Intel's accelerated computing strategy for the data center. Intel calls it "any to any" integration. - -### 'Any-to-any' integration is crucial for the data center - -The Agilex family uses embedded multi-die interconnect bridge (EMIB) packaging technology to integrate, for example, Xeon Scalable CPUs or ASICs – special-function processors that are not reprogammable – alongside FPGA fabric. Intel last year bought eASIC, a maker of structured ASICs, which the company describes as an intermediary technology between FPGAs and ASICs. The idea is to deliver products that offer a mix of functionality to achieve optimal cost and performance efficiency for data-intensive workloads. - -Intel underscored the importance of processor integration for the data center by unveiling Agilex on Tuesday at its Data Centric Innovation Day in San Francisco, when it also discussed plans for its second generation Xeon Scalable line. - -Traditionally, FPGAs were mainly used in embedded devices, communications equipment and in hyperscale data centers, and not sold directly to enterprises. But several products based on Intel Stratix 10 and Arria 10 FPGAs are now being sold to enterprises, including in Dell EMC and Fujitsu off-the-shelf servers. - -Making FPGAs easier to program is key to making them more mainstream. "What's really, really important is the software story," said Intel's McNamara. "None of this really matters if we can't generate more users and make it easier to program FPGA's." - -Intel's Quartus Prime design tool will be available for Agilex hardware developers but the real breakthrough for FPGA software development will be Intel's OneAPI concept, announced in December. - -"OneAPI is is an effort by Intel to be able to have programmers write to OneAPI and OneAPI determines the best piece of silicon to run it on," Moorhead said. "I lovingly refer to it as the magic API; this is the big play I always thought Intel was gonna be working on ever since it bought Altera. The first thing I expect to happen are the big enterprise developers like SAP and Oracle to write to Agilex, then smaller ISVs, then custom enterprise applications." - -![][8] - -Intel plans three different product lines in the Agilex family – from low to high end, the F-, I- and M-series – aimed at different applications and processing requirements. The Agilex family, depending on the series, supports PCIe (peripheral component interconnect express) Gen 5, and different types of memory including DDR5 RAM, HBM (high-bandwidth memory) and Optane DC persistent memory. It will offer up to 112G bps transceiver data rates and a greater mix of arithmetic precision for AI, including bfloat16 number format. - -In addition to accelerating server-based workloads like AI, genomics, financial and database applications, FPGAs play an important part in networking. Their cost-per-watt efficiency makes them suitable for edge networks, IoT devices as well as deep packet inspection. In addition, they can be used in 5G base stations; as 5G standards evolve, they can be reprogrammed. Once 5G standards are hardened, the "any to any" integration will allow processing to be offloaded to special-purpose ASICs for ultimate cost efficiency. - -### Agilex will compete with Xylinx's ACAPs - -Agilex will likely vie with Xylinx's upcoming [Versal product family][9], due out in devices in the second half of the year. Xylinx competed for years with Altera in the FPGA market, and with Versal has introduced what it says is [a new product category, the Adaptive Compute Acceleration Platform (ACAP)][10]. Versal ACAPs will be made using TSMC's 7nm manufacturing process technology, though because Intel achieves high transistor density, the number of transistors offered by Agilex and Versal chips will likely be equivalent, noted Moorhead. - -Though Agilex and Versal differ in details, the essential pitch is similar: the programmable processors offer a wider variety of programming options than prior generations of FPGA, work with CPUs to accelerate data-intensive workloads, and offer memory coherence. Rather than CXL, though, the Versal family uses the cache coherent interconnect for accelerators (CCIX) interconnect fabric. - -Neither Intel or Xylinx for the moment have announced OEM support for Agilex or Versal products that will be sold to the enterprise, but that should change as the year progresses. - -Join the Network World communities on [Facebook][11] and [LinkedIn][12] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3386158/intels-agilex-fpga-family-targets-data-intensive-workloads.html#tk.rss_all - -作者:[Marc Ferranti][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/agilex-100792596-large.jpg -[2]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html -[3]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html -[4]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html -[5]: https://www.networkworld.com/article/2903454/intel-could-strengthen-its-server-product-stack-with-altera.html -[6]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture -[7]: https://www.networkworld.com/article/3359254/data-center-giants-announce-new-high-speed-interconnect.html -[8]: https://images.idgesg.net/images/article/2019/04/agilex-family-100792597-large.jpg -[9]: https://www.xilinx.com/news/press/2018/xilinx-unveils-versal-the-first-in-a-new-category-of-platforms-delivering-rapid-innovation-with-software-programmability-and-scalable-ai-inference.html -[10]: https://www.networkworld.com/article/3263436/fpga-maker-xilinx-aims-range-of-software-programmable-chips-at-data-centers.html -[11]: https://www.facebook.com/NetworkWorld/ -[12]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190402 What are Ubuntu Repositories- How to enable or disable them.md b/sources/tech/20190402 What are Ubuntu Repositories- How to enable or disable them.md deleted file mode 100644 index dc0961a66d..0000000000 --- a/sources/tech/20190402 What are Ubuntu Repositories- How to enable or disable them.md +++ /dev/null @@ -1,189 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What are Ubuntu Repositories? How to enable or disable them?) -[#]: via: (https://itsfoss.com/ubuntu-repositories) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -What are Ubuntu Repositories? How to enable or disable them? -====== - -_**This detailed article tells you about various repositories like universe, multiverse in Ubuntu and how to enable or disable them.**_ - -So, you are trying to follow a tutorial from the web and installing a software using apt-get command and it throws you an error: - -``` -E: Unable to locate package xyz -``` - -You are surprised because others the package should be available. You search on the internet and come across a solution that you have to enable universe or multiverse repository to install that package. - -**You can enable universe and multiverse repositories in Ubuntu using the commands below:** - -``` -sudo add-apt-repository universe multiverse -sudo apt update -``` - -You installed the universe and multiverse repository but do you know what are these repositories? How do they play a role in installing packages? Why there are several repositories? - -I’ll explain all these questions in detail here. - -### The concept of repositories in Ubuntu - -Okay, so you already know that to [install software in Ubuntu][1], you can use the [apt command][2]. This is the same [APT package manager][3] that Ubuntu Software Center utilizes underneath. So all the software (except Snap packages) that you see in the Software Center are basically from APT. - -Have you ever wondered where does the apt program install the programs from? How does it know which packages are available and which are not? - -Apt basically works on the repository. A repository is nothing but a server that contains a set of software. Ubuntu provides a set of repositories so that you won’t have to search on the internet for the installation file of various software of your need. This centralized way of providing software is one of the main strong points of using Linux. - -The APT package manager gets the repository information from the /etc/apt/sources.list file and files listed in /etc/apt/sources.list.d directory. Repository information is usually in the following format: - -``` -deb http://us.archive.ubuntu.com/ubuntu/ bionic main -``` - -In fact, you can [go to the above server address][4] and see how the repository is structured. - -When you [update Ubuntu using the apt update command][5], the apt package manager gets the information about the available packages (and their version info) from the repositories and stores them in local cache. You can see this in /var/lib/apt/lists directory. - -Keeping this information locally speeds up the search process because you don’t have to go through the network and search the database of available packages just to check if a certain package is available or not. - -Now you know how repositories play an important role, let’s see why there are several repositories provided by Ubuntu. - -### Ubuntu Repositories: Main, Universe, Multiverse, Restricted and Partner - -![][6] - -Software in Ubuntu repository are divided into five categories: main, universe, multiverse, restricted and partner. - -Why Ubuntu does that? Why not put all the software into one single repository? To answer this question, let’s see what are these repositories: - -#### **Main** - -When you install Ubuntu, this is the repository enabled by default. The main repository consists of only FOSS (free and open source software) that can be distributed freely without any restrictions. - -Software in this repository are fully supported by the Ubuntu developers. This is what Ubuntu will provide with security updates until your system reaches end of life. - -#### **Universe** - -This repository also consists free and open source software but Ubuntu doesn’t guarantee of regular security updates to software in this category. - -Software in this category are packaged and maintained by the community. The Universe repository has a vast amount of open source software and thus it enables you to have access to a huge number of software via apt package manager. - -#### **Multiverse** - -Multiverse contains the software that are not FOSS. Due to licensing and legal issues, Ubuntu cannot enable this repository by default and cannot provide fix and updates. - -It’s up to you to decide if you want to use Multiverse repository and check if you have the right to use the software. - -#### **Restricted** - -Ubuntu tries to provide only free and open source software but that’s not always possible specially when it comes to supporting hardware. - -The restricted repositories consists of proprietary drivers. - -#### **Partner** - -This repository consist of proprietary software packaged by Ubuntu for their partners. Earlier, Ubuntu used to provide Skype trough this repository. - -#### Third party repositories and PPA (Not provided by Ubuntu) - -The above five repositories are provided by Ubuntu. You can also add third party repositories (it’s up to you if you want to do it) to access more software or to access newer version of a software (as Ubuntu might provide old version of the same software). - -For example, if you add the repository provided by [VirtualBox][7], you can get the latest version of VurtualBox. It will add a new entry in your sources.list. - -You can also install additional application using PPA (Personal Package Archive). I have written about [what is PPA and how it works][8] in detail so please read that article. - -Tip - -Try NOT adding anything other than Ubuntu’s repositories in your sources.list file. You should keep this file in pristine condition because if you mess it up, you won’t be able to update your system or (at times) even install new packages. - -### Add universe, multiverse and other repositories - -As I had mentioned earlier, only the Main repository is enabled by default when you install Ubuntu. To access more software, you can add the additional repositories. - -Let me show you how to do it in command line first and then I’ll show you the GUI ways as well. - -To enable Universe repository, use: - -``` -sudo add-apt-repository universe -``` - -To enable Restricted repository, use: - -``` -sudo add-apt-repository restricted -``` - -To enable Multiverse repository, use this command: - -``` -sudo add-apt-repository multiverse -``` - -You must use sudo apt update command after adding the repository so that you system creates the local cache with package information. - -If you want to **remove a repository** , simply add -r like **sudo add-apt-repository -r universe**. - -Graphically, go to Software & Updates and you can enable the repositories here: - -![Adding Universe, Restricted and Multiverse repositories][9] - -You’ll find the option to enable partner repository in the Other Software tab. - -![Adding Partner repository][10] - -To disable a repository, simply uncheck the box. - -### Bonus Tip: How to know which repository a package belongs to? - -Ubuntu has a dedicated website that provides you with information about all the packages available in the Ubuntu archive. Go to Ubuntu Packages website. - -[Ubuntu Packages][11] - -You can search for a package name in the search field. You can select if you are looking for a particular Ubuntu release or a particular repository. I prefer using ‘any’ option in both fields. - -![][12] - -It will show you all the matching packages, Ubuntu releases and the repository information. - -![][13] - -As you can see above the package tor is available in the Universe repository for various Ubuntu releases. - -**Conclusion** - -I hope this article helped you in understanding the concept of repositories in Ubuntu. - -If you have any questions or suggestions, please feel free to leave a comment below. If you liked the article, please share it on social media sites like Reddit and Hacker News. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/ubuntu-repositories - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/remove-install-software-ubuntu/ -[2]: https://itsfoss.com/apt-command-guide/ -[3]: https://wiki.debian.org/Apt -[4]: http://us.archive.ubuntu.com/ubuntu/ -[5]: https://itsfoss.com/update-ubuntu/ -[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/ubuntu-repositories.png?resize=800%2C450&ssl=1 -[7]: https://itsfoss.com/install-virtualbox-ubuntu/ -[8]: https://itsfoss.com/ppa-guide/ -[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/enable-repositories-ubuntu.png?resize=800%2C490&ssl=1 -[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/enable-partner-repository-ubuntu.png?resize=800%2C490&ssl=1 -[11]: https://packages.ubuntu.com -[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/search-packages-ubuntu-archive.png?ssl=1 -[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/search-packages-ubuntu-archive-1.png?resize=800%2C454&ssl=1 diff --git a/sources/tech/20190402 When Wi-Fi is mission-critical, a mixed-channel architecture is the best option.md b/sources/tech/20190402 When Wi-Fi is mission-critical, a mixed-channel architecture is the best option.md deleted file mode 100644 index 29a73998d7..0000000000 --- a/sources/tech/20190402 When Wi-Fi is mission-critical, a mixed-channel architecture is the best option.md +++ /dev/null @@ -1,90 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (When Wi-Fi is mission-critical, a mixed-channel architecture is the best option) -[#]: via: (https://www.networkworld.com/article/3386376/when-wi-fi-is-mission-critical-a-mixed-channel-architecture-is-the-best-option.html#tk.rss_all) -[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/) - -When Wi-Fi is mission-critical, a mixed-channel architecture is the best option -====== - -### Multi-channel is the norm for Wi-Fi today, but it’s not always the best choice. Single-channel and hybrid APs offer compelling alternatives when reliable Wi-Fi is a must. - -![Getty Images][1] - -I’ve worked with a number of companies that have implemented digital projects only to see them fail. The ideation was correct, the implementation was sound, and the market opportunity was there. The weak link? The Wi-Fi network. - -For example, a large hospital wanted to improve clinician response times to patient alarms by having telemetry information sent to mobile devices. Without the system, the only way a nurse would know about a patient alarm is from an audible alert. And with all the background noise, it’s often tough to discern where noises are coming from. The problem was the Wi-Fi network in the hospital had not been upgraded in years and caused messages to be significantly delayed in their delivery, often taking four to five minutes to deliver. The long delivery times caused a lack of confidence in the system, so many clinicians stopped using it and went back to manual alerting. As a result, the project was considered a failure. - -I’ve seen similar examples in manufacturing, K-12 education, entertainment, and other industries. Businesses are competing on the basis of customer experience, and that’s driven from the ever-expanding, ubiquitous wireless edge. Great Wi-Fi doesn’t necessarily mean market leadership, but bad Wi-Fi will have a negative impact on customers and employees. And in today’s competitive climate, that’s a recipe for disaster. - -**[ Read also:[Wi-Fi site-survey tips: How to avoid interference, dead spots][2] ]** - -## Wi-Fi performance historically inconsistent - -The problem with Wi-Fi is that it’s inherently flaky. I’m sure everyone reading this has experienced the typical flaws with failed downloads, dropped connections, inconsistent performance, and lengthy wait times to connect to public hot spots. - -Picture sitting in a conference prior to a keynote address and being able to tweet, send email, browse the web, and do other things with no problem. Then the keynote speaker comes on stage and the entire audiences start snapping pics, uploading those pictures, and streaming things – and the Wi-Fi stops working. I find this to be the norm more than the exception, underscoring the need for [no-compromise Wi-Fi][3]. - -The question for network professionals is how to get to a place where the Wi-Fi is rock solid 100% of the time. Some say that just beefing up the existing network will do that, and it might, but in some cases, the type of Wi-Fi might not be appropriate. - -The most commonly deployed type of Wi-Fi is multi-channel, also known as micro-cell, where each client connects to the access point (AP) using a radio channel. A high-quality experience is based on two things: good signal strength and minimal interference. Several things can cause interference, such as APs being too close, layout issues, or interference from other equipment. To minimize interference, businesses invest a significant amount of time and money in [site surveys to plan the optimal channel map][2], but even with that’s done well, Wi-Fi glitches can still happen. - -**[[Take this mobile device management course from PluralSight and learn how to secure devices in your company without degrading the user experience.][4] ]** - -## Multi-channel Wi-Fi not always the best choice - -For many carpeted offices, multi-channel Wi-Fi is likely to be solid, but there are some environments where external circumstances will impact performance. A good example of this is a multi-tenant building in which there are multiple Wi-Fi networks transmitting on the same channel and interfering with one another. Another example is a hospital where there are many campus workers moving between APs. The client will also try to connect to the best AP, causing the client to continually disconnect and reconnect resulting in dropped sessions. Then there are environments such as schools, airports, and conference facilities where there is a high number of transient devices and multi-channel can struggle to keep up. - -## Single channel Wi-Fi offers better reliability but with a performance hit - -What’s a network manager to do? Is inconsistent Wi-Fi just a fait accompli? Multi-channel is the norm, but it isn’t designed for dynamic physical environments or those where reliable connectivity is a must. - -Several years ago an alternative architecture was proposed that would solve these problems. As the name suggests, “single channel” Wi-Fi uses a single radio channel for all APs in the network. Think of this as being a single Wi-Fi fabric that operates on one channel. With this architecture, the placement of APs is irrelevant because they all utilize the same channel, so they won’t interfere with one another. This has an obvious simplicity advantage, such as if coverage is poor, there’s no reason to do another expensive site survey. Instead, just drop in APs where they are needed. - -One of the disadvantages of single-channel is that aggregate network throughput was lower than multi-channel because only one channel can be used. This might be fine in environments where reliability trumps performance, but many organizations want both. - -## Hybrid APs offer the best of both worlds - -There has been recent innovation from the manufacturers of single-channel systems that mix channel architectures, creating a “best of both worlds” deployment that offers the throughput of multi-channel with the reliability of single-channel. For example, Allied Telesis offers Hybrid APs that can operate in multi-channel and single-channel mode simultaneously. That means some web clients can be assigned to the multi-channel to have maximum throughput, while others can use single-channel for seamless roaming experience. - -A practical use-case of such a mix might be a logistics facility where the office staff uses multi-channel, but the fork-lift operators use single-channel for continuous connectivity as they move throughout the warehouse. - -Wi-Fi was once a network of convenience, but now it is perhaps the most mission-critical of all networks. A traditional multi-channel system might work, but due diligence should be done to see how it functions under a heavy load. IT leaders need to understand how important Wi-Fi is to digital transformation initiatives and do the proper testing to ensure it’s not the weak link in the infrastructure chain and choose the best technology for today’s environment. - -**Reviews: 4 free, open-source network monitoring tools:** - - * [Icinga: Enterprise-grade, open-source network-monitoring that scales][5] - * [Nagios Core: Network-monitoring software with lots of plugins, steep learning curve][6] - * [Observium open-source network monitoring tool: Won’t run on Windows but has a great user interface][7] - * [Zabbix delivers effective no-frills network monitoring][8] - - - -Join the Network World communities on [Facebook][9] and [LinkedIn][10] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3386376/when-wi-fi-is-mission-critical-a-mixed-channel-architecture-is-the-best-option.html#tk.rss_all - -作者:[Zeus Kerravala][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Zeus-Kerravala/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/09/tablet_graph_wifi_analytics-100771638-large.jpg -[2]: https://www.networkworld.com/article/3315269/wi-fi-site-survey-tips-how-to-avoid-interference-dead-spots.html -[3]: https://www.alliedtelesis.com/blog/no-compromise-wi-fi -[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fmobile-device-management-big-picture -[5]: https://www.networkworld.com/article/3273439/review-icinga-enterprise-grade-open-source-network-monitoring-that-scales.html?nsdr=true#nww-fsb -[6]: https://www.networkworld.com/article/3304307/nagios-core-monitoring-software-lots-of-plugins-steep-learning-curve.html -[7]: https://www.networkworld.com/article/3269279/review-observium-open-source-network-monitoring-won-t-run-on-windows-but-has-a-great-user-interface.html?nsdr=true#nww-fsb -[8]: https://www.networkworld.com/article/3304253/zabbix-delivers-effective-no-frills-network-monitoring.html -[9]: https://www.facebook.com/NetworkWorld/ -[10]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190402 Zero-trust- microsegmentation networking.md b/sources/tech/20190402 Zero-trust- microsegmentation networking.md deleted file mode 100644 index 864bd8eea4..0000000000 --- a/sources/tech/20190402 Zero-trust- microsegmentation networking.md +++ /dev/null @@ -1,137 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Zero-trust: microsegmentation networking) -[#]: via: (https://www.networkworld.com/article/3384748/zero-trust-microsegmentation-networking.html#tk.rss_all) -[#]: author: (Matt Conran https://www.networkworld.com/author/Matt-Conran/) - -Zero-trust: microsegmentation networking -====== - -### Microsegmentation gives administrators the control to set granular policies in order to protect the application environment. - -![Aaron Burson \(CC0\)][1] - -The transformation to the digital age has introduced significant changes to the cloud and data center environments. This has compelled the organizations to innovate more quickly than ever before. This, however, brings with it both – the advantages and disadvantages. - -The network and security need to keep up with this rapid pace of change. If you cannot match with the speed of the [digital age,][2] then ultimately bad actors will become a hazard. Therefore, the organizations must move to a [zero-trust environment][3]: default deny, with least privilege access. In today’s evolving digital world this is the primary key to success. - -Ideally, a comprehensive solution must provide protection across all platforms including legacy servers, VMs, services in public clouds, on-premise, off-premise, hosted, managed or self-managed. We are going to stay hybrid for a long time, therefore we need to equip our architecture with [zero-trust][4]. - -**[ Don’t miss[customer reviews of top remote access tools][5] and see [the most powerful IoT companies][6] . | Get daily insights by [signing up for Network World newsletters][7]. ]** - -We need to have the ability to support all of these hybrid environments that can analyze at a process, flow data, and infrastructure level. As a matter of fact, there is never just one element to analyze within a network in order to create an effective security posture. - -To adequately secure such an environment requires a solution with key components: such as appropriate visibility, microsegmentation, and breach detection. Let's learn more about one of these primary elements: zero-trust microsegmentation networking. - -There are a variety of microsegmentation vendors, all with competing platforms. We have, for example, SDN-based, container-centric, network-based appliance be it physical or virtual, and container-centric to name just a few. - -## What is microsegmentation? - -Microsegmentation is the ability to put a wrapper around the access control for each component of an application. The traditional days are gone where we can just impose a block on source/destination/port numbers or higher up in the stack with protocols, such as HTTP or HTTPS. - -As the communication patterns become more complex, thereby isolating the communication flows between entities, hence following the microsegmentation principles has become a necessity. - -## Why is microsegmentation important? - -Microsegmentation gives administrators the control to set granular policies in order to protect the application environment. It defines the rules and policies as to how an application can communicate within its tier. The policies are granular (a lot more granular than what we had before), which restrict the communication to hosts that are only allowed to communicate. - -Eventually, this reduces the available attack surface and completely locks down the ability for the bad actors to move laterally within the application infrastructure. Why? Because it governs the application’s activity at a granular level, thereby improving the entire security posture. The traditional zone-based networking no longer cuts it in today’s [digital world][8]. - -## General networking - -Let's start with the basics. We all know that with security, you are only as strong as your weakest link. As a result, enterprises have begun to further segment networks into microsegments. Some call them nanosegments. - -But first, let’s recap on what we actually started within the initial stage- nothing! We had IP addresses that were used for connectivity but unfortunately, they have no built-in authentication mechanism. Why? Because it wasn't a requirement back then. - -Network connectivity based on network routing protocols was primarily used for sharing resources. A printer, 30 years ago, could cost the same as a house, so connectivity and the sharing of resources were important. The authentication of the communication endpoints was not considered significant. - -## Broadcast domains - -As networks grew in size, virtual LANs (VLANs) were introduced to divide the broadcast domains and improve network performance. A broadcast domain is a logical division of a computer network. All nodes can reach each other by sending a broadcast at the data link layer. When the broadcast domain swells, the network performance takes a hit. - -Over time the role of the VLAN grew to be used as a security tool but it was never meant to be in that space. VLANs were used to improve performance, not to isolate the resources. The problem with VLANs is that there is no intra VLAN filtering. They have a very broad level of access and trust. If bad actors gain access to one segment in the zone, they should not be allowed to try and compromise another device within that zone, but with VLANs, this is a strong possibility. - -Hence, VLAN offers the bad actor a pretty large attack surface to play with and move across laterally without inspection. Lateral movements are really hard to detect with traditional architectures. - -Therefore, enterprises were forced to switch to microsegmentation. Microsegmentation further segments networks within the zone. On the contrary, the whole area of virtualization complicates the segmentation process. A virtualized server may only have a single physical network port but it supports numerous logical networks where services and applications reside across multiple security zones. - -Thus, microsegmentation needs to work at both; the physical network layer as well as within the virtualized networking layer. As you are aware, there has been a change in the traffic pattern. The good thing about microsegmentation is that it controls both; the “north & south” and also the “east & west” movement of traffic, further isolating the size of broadcast domains. - -## Microsegmentation – a multi-stage process - -Implementing microsegmentation is a multi-stage process. There are certain prerequisites that must be followed before the implementation. Firstly, you need to fully understand the communication patterns, map the flows and all the application dependencies. - -Once this is done, it's only then you can enable microsegmentation in a platform-agnostic manner across all the environments. Segmenting your network appropriately creates a dark network until the administrator turns on the lights. Authentication is performed first and then access is granted to the communicating entities operating with zero-trust with least privilege access. - -Once you are connecting the entities, they need to run through a number of technologies in order to be fully connected. There is not a once-off check with microsegmentation. It’s rather a continuous process to make sure that both entities are doing what they are supposed to do. - -This ensures that everyone is doing what they are entitled to do. You want to reduce the unnecessary cross-talk to an absolute minimum and only allow communication that is a complete necessity. - -## How do you implement microsegmentation? - -Firstly, you need strong visibility not just at the traffic flow level but also at the process and data contextual level. Without granular application visibility, it's impossible to map and fully understand what is normal traffic flow and irregular application communication patterns. - -Visibility cannot be mapped out manually, as there could be hundreds of workloads. Therefore, an automatic approach must be taken. Manual mapping is more prone to errors and is inefficient. The visibility also needs to be in real-time. A static snapshot of the application architecture, even if it's down to a process level, will not tell you anything about the behaviors that are sanctioned or unsanctioned. - -You also need to make sure that you, not under-segmenting, similar to what we had in the old days. Primarily, microsegmentation must manage communication workflows all the way up to Layer 7 of the Open Systems Interconnection (OSI) layer. Layer 4 microsegmentation only focuses on the Transport layer. If you are only segmenting the network at Layer 4 then you are widening your attack surface, thereby opening the network to be compromised. - -Segmenting right up to the application layer means you are locking down the lateral movements, open ports, and protocols. It enables you to restrict access to the source and destination process rather than source and destination port numbers. - -## Security issues with hybrid cloud - -Since the [network perimeter][9] has been removed, therefore, it has become difficult to bolt the traditional security tools. Traditionally, we could position a static perimeter around the network infrastructure. However, this is not an available option today as we have a mixture of containerized applications, for example, a legacy database server. We have legacy communicating to the containerized land. - -Hybrid enables organizations to use different types of cloud architects to include the on-premise and new technologies, such as containers. We are going to have a hybrid cloud in coming times which will change the way we think about networking. Hybrid forces the organizations to rethink about the network architectures. - -When you attach the microsegment policies around the workload itself, then the policies will go with the workload. Then it would not matter if the entity moves to the on-premise or to the cloud. If the workload auto scales up and down or horizontally, the policy needs to go with the workload. Even if you go deeper than the workload, into the process level, you can set even more granular controls for microsegmentation. - -## Identity - -However, this is the point where identity becomes a challenge. If things are scaling and becoming dynamic, you can’t tie policies to the IP addresses. Rather than using IP addresses as the base for microsegmentation, policies are based on the logical (not physical) attributes. - -With microsegmentation, the workload identity is based on logical attributes, such as the multi-factor authentication (MFA), transport layer security (TLS) certificate, the application service, or the use of a logical label associated with the workload. - -These are what are known as logical attributes. Ultimately the policies map to the IP addresses but these are set by using the logical attributes, not the physical ones. As we progress in this technological era, the IP address is less relevant now. Named data networking is one of the perfect examples. - -Other identity methods for microsegmentation are TLS certificates. If the traffic is encrypted with a different TLS certificate or from an invalid source, it automatically gets dropped, even if it comes from the right location. It will get blocked as it does not have the right identity. - -You can even extend that further and look inside the actual payload. If an entity is trying to do a hypertext transfer protocol (HTTP) post to a record and if it tries to perform any other operation, it will get blocked. - -## Policy enforcement - -Practically, all of these policies can be implemented and enforced in different places throughout the network. However, if you enforce in only one place, that point in the network can become compromised and become an entry door to the bad actor. You can, for example, enforce in 10 different network points, even if you subvert in 2 of them the other 8 will still protect you. - -Zero-trust microsegmentation ensures that you can enforce in different points throughout the network and also with different mechanics. - -**This article is published as part of the IDG Contributor Network.[Want to Join?][10]** - -Join the Network World communities on [Facebook][11] and [LinkedIn][12] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3384748/zero-trust-microsegmentation-networking.html#tk.rss_all - -作者:[Matt Conran][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Matt-Conran/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/07/hive-structured_windows_architecture_connections_connectivity_network_lincoln_park_pavilion_chicago_by_aaron_burson_cc0_via_unsplash_1200x800-100765880-large.jpg -[2]: https://youtu.be/AnMQH_noNDo -[3]: https://network-insight.net/2018/10/zero-trust-networking-ztn-want-ghosted/ -[4]: https://network-insight.net/2018/09/embrace-zero-trust-networking/ -[5]: https://www.networkworld.com/article/3262145/lan-wan/customer-reviews-top-remote-access-tools.html#nww-fsb -[6]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html#nww-fsb -[7]: https://www.networkworld.com/newsletters/signup.html#nww-fsb -[8]: https://network-insight.net/2017/10/internet-things-iot-dissolving-cloud/ -[9]: https://network-insight.net/2018/09/software-defined-perimeter-zero-trust/ -[10]: /contributor-network/signup.html -[11]: https://www.facebook.com/NetworkWorld/ -[12]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190403 Intel unveils an epic response to AMD-s server push.md b/sources/tech/20190403 Intel unveils an epic response to AMD-s server push.md deleted file mode 100644 index 826cd9d413..0000000000 --- a/sources/tech/20190403 Intel unveils an epic response to AMD-s server push.md +++ /dev/null @@ -1,78 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Intel unveils an epic response to AMD’s server push) -[#]: via: (https://www.networkworld.com/article/3386142/intel-unveils-an-epic-response-to-amds-server-push.html#tk.rss_all) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Intel unveils an epic response to AMD’s server push -====== - -### Intel introduced more than 50 new Xeon Scalable Processors for servers that cover a variety of workloads. - -![Intel][1] - -Intel on Tuesday introduced its second-generation Xeon Scalable Processors for servers, developed under the codename Cascade Lake, and it’s clear AMD has lit a fire under a once complacent company. - -These new Xeon SP processors max out at 28 cores and 56 threads, a bit shy of AMD’s Epyc server processors with 32 cores and 64 threads, but independent benchmarks are still to come, which may show Intel having a lead at single core performance. - -And for absolute overkill, there is the Xeon SP Platinum 9200 Series, which sports 56 cores and 112 threads. It will also require up to 400W of power, more than twice what the high-end Xeons usually consume. - -**[ Now read:[What is quantum computing (and why enterprises should care)][2] ]** - -The new processors were unveiled at a big event at Intel’s headquarters in Santa Clara, California, and live-streamed on the web. [Newly minted CEO][3] Bob Swan kicked off the event, saying the new processors were the “first truly data-centric portfolio for our customers.” - -“For the last several years, we have embarked on a journey to transform from a PC-centric company to a data-centric computing company and build the silicon processors with our partners to help our customers prosper and grow in an increasingly data-centric world,” he added. - -He also said the move to a data-centric world isn’t just CPUs, but a suite of accelerant technologies, including the [Agilex FPGA processors][4], Optane memory, and more. - -This launch is the largest Xeon launch in the company’s history, with more than 50 processor designs across the Xeon 8200 and 9200 lines. While something like that can lead to confusion, many of these are specific to certain workloads instead of general-purpose processors. - -**[[Get certified as an Apple Technical Coordinator with this seven-part online course from PluralSight.][5] ]** - -Cascade Lake chips are the replacement for the previous Skylake platform, and the mainstream Cascade Lake chips have the same architecture as the Purley motherboard used by Skylake. Like the current Xeon Scalable processors, they have up to 28 cores with up to 38.5 MB of L3 cache, but speeds and feeds have been bumped up. - -The Cascade Lake generation supports the new UPI (Ultra Path Interface) high-speed interconnect, up to six memory channels, AVX-512 support, and up to 48 PCIe lanes. Memory capacity has been doubled, from 768GB to 1.5TB of memory per socket. They work in the same socket as Purley motherboards and are built on a 14nm manufacturing process. - -Some of the new Xeons, however, can access up to 4.5TB of memory per processor: 1.5TB of memory and 3TB of Optane memory, the new persistent memory that sits between DRAM and NAND flash memory and acts as a massive cache for both. - -## Built-in fixes for Meltdown and Spectre vulnerabilities - -Most important, though, is that these new Xeons have built-in fixes for the Meltdown and Spectre vulnerabilities. There are existing fixes for the exploits, but they have the effect of reducing performance, which varies based on workload. Intel showed a slide at the event that shows the company is using a combination of firmware and software mitigation. - -New features also include Intel Deep Learning Boost (DL Boost), a technology developed to accelerate vector computing that Intel said makes this the first CPU with built-in inference acceleration for AI workloads. It works with the AVX-512 extension, which should make it ideal for machine learning scenarios. - -Most of the new Xeons are available now, except for the 9200 Platinum, which is coming in the next few months. Many Intel partners – Dell, Cray, Cisco, Supermicro – all have new products, with Supermicro launching more than 100 new products built around Cascade Lake. - -## Intel also rolls out Xeon D-1600 series processors - -In addition to its hot rod Xeons, Intel also rolled out the Xeon D-1600 series processors, a low power variant based on a completely different architecture. Xeon D-1600 series processors are designed for space and/or power constrained environments, such as edge network devices and base stations. - -Along with the new Xeons and FPGA chips, Intel also announced the Intel Ethernet 800 series adapter, which supports 25, 50 and 100 Gigabit transfer speeds. - -Thank you, AMD. This is what competition looks like. - -Join the Network World communities on [Facebook][6] and [LinkedIn][7] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3386142/intel-unveils-an-epic-response-to-amds-server-push.html#tk.rss_all - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/intel-xeon-family-1-100792811-large.jpg -[2]: https://www.networkworld.com/article/3275367/what-s-quantum-computing-and-why-enterprises-need-to-care.html -[3]: https://www.networkworld.com/article/3336921/intel-promotes-swan-to-ceo-bumps-off-itanium-and-eyes-mellanox.html -[4]: https://www.networkworld.com/article/3386158/intels-agilex-fpga-family-targets-data-intensive-workloads.html -[5]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fapple-certified-technical-trainer-10-11 -[6]: https://www.facebook.com/NetworkWorld/ -[7]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190403 Top Ten Reasons to Think Outside the Router -1- It-s Time for a Router Refresh.md b/sources/tech/20190403 Top Ten Reasons to Think Outside the Router -1- It-s Time for a Router Refresh.md deleted file mode 100644 index 72d566a7d0..0000000000 --- a/sources/tech/20190403 Top Ten Reasons to Think Outside the Router -1- It-s Time for a Router Refresh.md +++ /dev/null @@ -1,101 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Top Ten Reasons to Think Outside the Router #1: It’s Time for a Router Refresh) -[#]: via: (https://www.networkworld.com/article/3386116/top-ten-reasons-to-think-outside-the-router-1-it-s-time-for-a-router-refresh.html#tk.rss_all) -[#]: author: (Rami Rammaha https://www.networkworld.com/author/Rami-Rammaha/) - -Top Ten Reasons to Think Outside the Router #1: It’s Time for a Router Refresh -====== - -![istock][1] - -We’re now at the end of our homage to the iconic David Letterman Top Ten List segment from his former Late Show, as [Silver Peak][2] counts down the _Top Ten Reasons to Think Outside the Router._ Click for the [#2][3], [#3][4], [#4][5], [#5][6], [#6][7], [#7][8], [#8][9], [#9][10] and [#10][11] reasons to retire traditional branch routers. - -_**The #1 reason it’s time to retire conventional routers at the branch: your branch routers are coming due for a refresh – the perfect time to evaluate new options.**_ - -Your WAN architecture is due for a branch router refresh! You’re under immense pressure to advance your organization’s digital transformation initiatives and deliver a high quality of experience to your users and customers. Your applications – at least SaaS apps – are all cloud-based. You know you need to move more quickly to keep pace with changing business requirements to realize the transformational promise of the cloud. And, you’re dealing with shifting traffic patterns and an insatiable appetite for more bandwidth at branch sites to support your users and applications. Finally, you know your IT budget for networking isn’t going to increase. - -_So, what’s next?_ You really only have three options when it comes to refreshing your WAN. You can continue to try and stretch your conventional router-centric model. You can choose a basic [SD-WAN][12] model that may or may not be good enough. Or you can take a new approach and deploy a business-driven SD-WAN edge platform. - -### **The pitfalls of a router-centric model** - -![][13] - -The router-centric approach worked well when enterprise applications were hosted in the data center; before the advent of the cloud. All traffic was routed directly from branch offices to the data center. With the emergence of the cloud, businesses were forced to conform to the constraints of the network when deploying new applications or making network changes. This is a bottoms-up device centric approach in which the network becomes a bottleneck to the business. - -A router-centric approach requires manual device-by-device configuration that results in endless hours of manual programming, making it extremely difficult for network administrators to scale without experiencing major challenges in configuration, outages and troubleshooting. Any changes that arise when deploying a new application or changing a QoS or security policy, once again requires manually programming every router at every branch across the network. Re-programming is time consuming and requires utilizing a complex, cumbersome CLI, further adding to the inefficiencies of the model. In short, the router-centric WAN has hit the wall. - -### **Basic SD-WAN, a step in the right direction** - -![][14] - -In this model, businesses realize the benefit of foundational features, but this model falls short of the goal of a fully automated, business-driven network. A basic SD-WAN approach is unable to provide what the business really needs, including the ability to deliver the best Quality of Experience for users. - -Some of the basic SD-WAN features include the ability to use multiple forms of transport, path selection, centralized management, zero-touch provisioning and encrypted VPN overlays. However, a basic SD-WAN lacks in many areas: - - * Limited end-to-end orchestration of WAN edge network functions - * Rudimentary path selection with traffic steering limited to pre-defined rules - * Long fail-over times in response to WAN transport outages - * Inability to use links when they experience brownouts due to link congestion or packet loss - * Fixed application definitions and manually scripted ACLs to control traffic steering across the internet - - - -### **The solution: shift to a business-first networking model** - -![][15] - -In this model, the network enables the business. The WAN is transformed into a business accelerant that is fully automated and continuous, giving every application the resources it truly needs while delivering 10x the bandwidth for the same budget – ultimately achieving the highest quality of experience to users and IT alike. With a business-first networking model, the network functions (SD-WAN, firewall, segmentation, routing, WAN optimization and application visibility and control) are unified in a single platform and are centrally orchestrated and managed. Top-down business intent is the driver, enabling businesses to unlock the full transformational promise of the cloud. - -The business-driven [Silver Peak® EdgeConnect™ SD-WAN][16] edge platform was built for the cloud, enabling enterprises to liberate their applications from the constraints of existing WAN approaches. EdgeConnect offers the following advanced capabilities: - -1\. Automates traffic steering and security policy enforcement based on business intent instead of TCP/IP addresses, delivering the highest Quality of Experience for users - -2\. Actively embraces broadband to increase application performance and availability while lowering costs - -3\. Securely and directly connect branch users to SaaS and IaaS cloud services - -4\. Increases operational efficiency while increasing business agility and time-to-market via centralized orchestration - -Silver Peak has more than 1,000 enterprise customer deployments across a range of vertical industries. Bentley Systems, [Nuffield Health][17] and [Solis Mammography][18] have all realized tangible business outcomes from their EdgeConnect deployments. - -![][19] - -Learn why the time is now to [think outside the router][20]! - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3386116/top-ten-reasons-to-think-outside-the-router-1-it-s-time-for-a-router-refresh.html#tk.rss_all - -作者:[Rami Rammaha][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Rami-Rammaha/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/istock-478729482-100792542-large.jpg -[2]: https://www.silver-peak.com/why-silver-peak -[3]: http://blog.silver-peak.com/think-outside-the-router-reason-2-simplify-and-consolidate-the-wan-edge -[4]: http://blog.silver-peak.com/think-outside-the-router-reason-3-mpls-contract-renewal -[5]: http://blog.silver-peak.com/top-ten-reasons-to-think-outside-the-router-4-broadband-is-used-only-for-failover -[6]: http://blog.silver-peak.com/think-outside-the-router-reason-5-manual-cli-based-configuration-and-management -[7]: http://blog.silver-peak.com/https-blog-silver-peak-com-think-outside-the-router-reason-6 -[8]: http://blog.silver-peak.com/think-outside-the-router-reason-7-exorbitant-router-support-and-maintenance-costs -[9]: http://blog.silver-peak.com/think-outside-the-router-reason-8-garbled-voip-pixelated-video -[10]: http://blog.silver-peak.com/think-outside-router-reason-9-sub-par-saas-performance -[11]: http://blog.silver-peak.com/think-outside-router-reason-10-its-getting-cloudy -[12]: https://www.silver-peak.com/sd-wan/sd-wan-explained -[13]: https://images.idgesg.net/images/article/2019/04/1_router-centric-vs-business-first-100792538-medium.jpg -[14]: https://images.idgesg.net/images/article/2019/04/2_basic-sd-wan-vs-business-first-100792539-medium.jpg -[15]: https://images.idgesg.net/images/article/2019/04/3_bus-first-networking-model-100792540-large.jpg -[16]: https://www.silver-peak.com/products/unity-edge-connect -[17]: https://www.silver-peak.com/resource-center/nuffield-health-deploys-uk-wide-sd-wan-silver-peak -[18]: https://www.silver-peak.com/resource-center/national-leader-mammography-services-accelerates-access-life-critical-scans -[19]: https://images.idgesg.net/images/article/2019/04/4_real-world-business-outcomes-100792541-large.jpg -[20]: https://www.silver-peak.com/think-outside-router diff --git a/sources/tech/20190404 9 features developers should know about Selenium IDE.md b/sources/tech/20190404 9 features developers should know about Selenium IDE.md deleted file mode 100644 index b099da68e2..0000000000 --- a/sources/tech/20190404 9 features developers should know about Selenium IDE.md +++ /dev/null @@ -1,158 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (9 features developers should know about Selenium IDE) -[#]: via: (https://opensource.com/article/19/4/features-selenium-ide) -[#]: author: (Al Sargent https://opensource.com/users/alsargent) - -9 features developers should know about Selenium IDE -====== -The new Selenium IDE brings the benefits of functional test automation -to many IT professionals—and to frontend developers specifically. -![magnifying glass on computer screen][1] - -There has long been a stigma associated with using record-and-playback tools for testing rather than scripted QA automation tools like [Selenium Webdriver][2], [Cypress][3], and [WebdriverIO][4]. - -Record-and-playbook tools are perceived to suffer from many issues, including a lack of cross-browser support, no way to run scripts in parallel or from CI build scripts, poor support for responsive web apps, and no way to quickly diagnose frontend bugs. - -Needless to say, it's been somewhat of a rough road for these tools, and after Selenium IDE [went end-of-life][5] in 2017, many thought the road for record and playback would end altogether. - -Well, it turns out this perception was wrong. Not long after the Selenium IDE project was discontinued, my colleagues at [Applitools approached the Selenium open source community][6] to see how they could help. - -Since then, much of Selenium IDE's code has been revamped. The code is now freely available on GitHub under an Apache 2.0 license, managed by the Selenium community, and supported by [two full-time engineers][7], one of whom literally wrote the book on [Selenium testing][8]. - -![Selenium IDE's GitHub repository][9] - -The new Selenium IDE brings the benefits of functional test automation to many IT professionals—and to frontend developers specifically. Here are nine things developers should know about the new Selenium IDE. - -### 1\. Selenium IDE is now cross-browser - -When the record-and-playback tool first came out in 2006, Firefox was the shiny new browser it hitched its wagon to, and it remained that way for a decade. No more! Selenium IDE is now available as a [Google Chrome Extension][10] and [Firefox Add-on][11]. - -Even better, Selenium IDE can run its tests on Selenium WebDriver servers by using Selenium IDE's new command-line test runner, [SIDE Runner][12]. SIDE Runner blends elements of Selenium IDE and Selenium Webdriver. It takes a Selenium IDE script, saved as a [**.side** file][13], and runs it using browser drivers such as [ChromeDriver][14], [EdgeDriver][15], Firefox's [Geckodriver][16], [IEDriver][17], and [SafariDriver][18]. - -SIDE Runner and the other drivers above are available as [straightforward npm installs][12]. Here's what it looks like in action. - -![SIDE Runner][19] - -### 2\. No more brittle functional tests - -For years, brittle tests have been an issue for functional tests—whether you record them or code them by hand. Now that developers are releasing new features more frequently, their user interface (UI) code is constantly changing as well. When a UI changes, object locators often change, too. - -Selenium IDE fixes that by capturing multiple object locators when you record your script. During playback, if Selenium IDE can't find one locator, it tries each of the other locators until it finds one that works. Your test will fail only if none of the locators work. This doesn't guarantee scripts will always play back, but it does insulate scripts against numerous changes. As you can see below, Selenium IDE captures linkText, an xPath expression, and CSS-based locators. - -![Selenium IDE captures linkText, an xPath expression, and CSS-based locators][20] - -### 3\. Conditional logic to handle UI features - -When testing web apps, scripts have to handle intermittent UI elements that can randomly appear in your app. These come in the form of cookie notices, popups for special offers, quote requests, newsletter subscriptions, paywall notifications, adblocker requests, and more. - -Conditional logic is a great way to handle these intermittent UI features. Developers can easily insert conditional logic—also called control flow—into Selenium IDE scripts. [Here are details][21] and how it looks. - -![Selenium IDE's Conditional logic][22] - -### 4\. Support for embedded code - -As broad as the new [Selenium IDE API][23] is, it doesn't do everything. For this reason, Selenium IDE has **[**execute** **script**][24]** and **[execute async script][25]** commands that let your script call a JavaScript snippet. - -This provides developers with a tremendous amount of flexibility to take advantage of JavaScript's flexibility and wide range of libraries. To use it, click on the test step where you want JavaScript to run, choose **Insert New Command** , and enter **execute script** or **execute async script** in the command field, as shown below. - -![Selenium IDE's command line][26] - -### 5\. Selenium IDE runs from CI build scripts - -Because SIDE Runner is called from the command line, you can easily fit it into CI build scripts, so long as the CI server can call **selenium-ide-runner** and upload the **.side** file (the test script) as a build artifact. For example, here's how to upload an input file in [Jenkins][27], [Travis][28], and [CircleCI][29]. - -This means Selenium IDE can be better integrated into the software development technology stack. In addition, the scripts created by less-technical QA team members—including business analysts—can run with every build. This helps better align QA with the developer so fewer bugs escape into production. - -### 6\. Support for third-party plugins - -Imagine companies building plugins to have Selenium IDE do all kinds of things, like uploading scripts to a functional testing cloud, a load testing cloud, or a production application monitoring service. - -Plenty of companies have integrated Selenium Webdriver into their offerings, and I bet the same will happen with Selenium IDE. You can also [build your own Selenium IDE plugin][30]. - -### 7\. Visual UI testing - -Speaking of new plugins, Applitools introduced a new Selenium IDE plugin to add artificial intelligence-powered visual validations to the equation. Available through the [Chrome][31] and [Firefox][32] stores via a three-second install, just plug in the Applitools API key and go. - -Visual checkpoints are a great way to ensure a UI renders correctly. Rather than a bunch of assert statements on all the UI elements—which would be a pain to maintain—one visual checkpoint checks all your page elements. - -Best of all, visual AI looks at a web app the same way a human does, ignoring minor differences. This means fewer fake bugs to frustrate a development team. - -### 8\. Visually test responsive web apps - -When testing the visual layout of [responsive web apps][33], it's best to do it on a wide range of screen sizes (also called viewports) to ensure nothing appears out of whack. It's all too easy for responsive web bugs to creep in, and when they do, the problems can range from merely cosmetic to business stopping. - -When you use visual UI testing for Selenium IDE, you can visually test your webpages on the Applitools [Visual Grid][34], which has more than 100 combinations of browsers, emulated devices, and viewport sizes. - -Once tests run on the Visual Grid, developers can easily check the test results on all the various combinations. - -![Selenium IDE's Visual Grid][35] - -### 9\. Responsive web bugs have nowhere to hide - -Selenium IDE can help pinpoint the cause of frontend bugs. Every Selenium IDE script that's run with the Visual Grid can be analyzed with Applitools' [Root Cause Analysis][36]. It's no longer enough to find a bug—developers also need to fix it. - -When a visual bug is discovered, it can be clicked on and just the relevant (not all) Document Object Model (DOM) and CSS differences will be displayed. - -![Finding visual bugs][37] - -In summary, much like many emerging technologies in software development, Selenium IDE is part of a larger trend of making life easier and simpler for technical professionals and enabling them to spend more time and effort on creating code for even faster feedback. - -* * * - -_This article is based on[16 reasons why to use Selenium IDE in 2019 (and 2 why not)][38] originally published on the Applitools blog._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/features-selenium-ide - -作者:[Al Sargent][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/alsargent -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/search_find_code_issue_bug_programming.png?itok=XPrh7fa0 (magnifying glass on computer screen) -[2]: https://www.seleniumhq.org/projects/webdriver/ -[3]: https://www.cypress.io/ -[4]: https://webdriver.io/ -[5]: https://seleniumhq.wordpress.com/2017/08/09/firefox-55-and-selenium-ide/ -[6]: https://seleniumhq.wordpress.com/2018/08/06/selenium-ide-tng/ -[7]: https://github.com/SeleniumHQ/selenium-ide/graphs/contributors -[8]: http://davehaeffner.com/ -[9]: https://opensource.com/sites/default/files/uploads/selenium_ide_github_graphic_1.png (Selenium IDE's GitHub repository) -[10]: https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd -[11]: https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ -[12]: https://www.seleniumhq.org/selenium-ide/docs/en/introduction/command-line-runner/ -[13]: https://www.seleniumhq.org/selenium-ide/docs/en/introduction/command-line-runner/#launching-the-runner -[14]: http://chromedriver.chromium.org/ -[15]: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ -[16]: https://github.com/mozilla/geckodriver -[17]: https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver -[18]: https://developer.apple.com/documentation/webkit/testing_with_webdriver_in_safari -[19]: https://opensource.com/sites/default/files/uploads/selenium_ide_side_runner_2.png (SIDE Runner) -[20]: https://opensource.com/sites/default/files/uploads/selenium_ide_linktext_3.png (Selenium IDE captures linkText, an xPath expression, and CSS-based locators) -[21]: https://www.seleniumhq.org/selenium-ide/docs/en/introduction/control-flow/ -[22]: https://opensource.com/sites/default/files/uploads/selenium_ide_conditional_logic_4.png (Selenium IDE's Conditional logic) -[23]: https://www.seleniumhq.org/selenium-ide/docs/en/api/commands/ -[24]: https://www.seleniumhq.org/selenium-ide/docs/en/api/commands/#execute-script -[25]: https://www.seleniumhq.org/selenium-ide/docs/en/api/commands/#execute-async-script -[26]: https://opensource.com/sites/default/files/uploads/selenium_ide_command_line_5.png (Selenium IDE's command line) -[27]: https://stackoverflow.com/questions/27491789/how-to-upload-a-generic-file-into-a-jenkins-job -[28]: https://docs.travis-ci.com/user/uploading-artifacts/ -[29]: https://circleci.com/docs/2.0/artifacts/ -[30]: https://www.seleniumhq.org/selenium-ide/docs/en/plugins/plugins-getting-started/ -[31]: https://chrome.google.com/webstore/detail/applitools-for-selenium-i/fbnkflkahhlmhdgkddaafgnnokifobik -[32]: https://addons.mozilla.org/en-GB/firefox/addon/applitools-for-selenium-ide/ -[33]: https://en.wikipedia.org/wiki/Responsive_web_design -[34]: https://applitools.com/visualgrid -[35]: https://opensource.com/sites/default/files/uploads/selenium_ide_visual_grid_6.png (Selenium IDE's Visual Grid) -[36]: https://applitools.com/root-cause-analysis -[37]: https://opensource.com/sites/default/files/uploads/seleniumice_rootcauseanalysis_7.png (Finding visual bugs) -[38]: https://applitools.com/blog/why-selenium-ide-2019 diff --git a/sources/tech/20190404 Edge Computing is Key to Meeting Digital Transformation Demands - and Partnerships Can Help Deliver Them.md b/sources/tech/20190404 Edge Computing is Key to Meeting Digital Transformation Demands - and Partnerships Can Help Deliver Them.md deleted file mode 100644 index b2f8a59ab4..0000000000 --- a/sources/tech/20190404 Edge Computing is Key to Meeting Digital Transformation Demands - and Partnerships Can Help Deliver Them.md +++ /dev/null @@ -1,72 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Edge Computing is Key to Meeting Digital Transformation Demands – and Partnerships Can Help Deliver Them) -[#]: via: (https://www.networkworld.com/article/3387140/edge-computing-is-key-to-meeting-digital-transformation-demands-and-partnerships-can-help-deliver-t.html#tk.rss_all) -[#]: author: (Rob McKernan https://www.networkworld.com/author/Rob-McKernan/) - -Edge Computing is Key to Meeting Digital Transformation Demands – and Partnerships Can Help Deliver Them -====== - -### Organizations in virtually every vertical industry are undergoing a digital transformation in an attempt to take advantage of edge computing technology - -![Getty Images][1] - -Organizations in virtually every vertical industry are undergoing a digital transformation in an attempt to take advantage of [edge computing][2] technology to make their businesses more efficient, innovative and profitable. In the process, they’re coming face to face with challenges ranging from time to market to reliability of IT infrastructure. - -It’s a complex problem, especially when you consider the scope of what digital transformation entails. “Digital transformation is not simply a list of IT projects, it involves completely rethinking how an organization uses technology to pursue new revenue streams, products, services, and business models,” as the [research firm IDC says][3]. - -Companies will be spending more than $650 billion per year on digital transformation efforts by 2024, a CAGR of more than 18.5% from 2018, according to the research firm [Market Research Engine][4]. - -The drivers behind all that spending include Internet of Things (IoT) technology, which involves collecting data from machines and sensors covering every aspect of the organization. That is contributing to Big Data – the treasure trove of data that companies mine to find the keys to efficiency, opportunity and more. Artificial intelligence and machine learning are crucial to that effort, helping companies make sense of the mountains of data they’re creating and consuming, and to find opportunities. - -**Requirements for Edge Computing** - -All of these trends are creating the need for more and more compute power and data storage. And much of it needs to be close to the source of the data, and to those employees who are working with it. In other words, it’s driving the need for companies to build edge data centers or edge computing sites. - -Physically, these edge computing sites bear little resemblance to large, centralized data centers, but they have many of the same requirements in terms of performance, reliability, efficiency and security. Given they are typically in locations with few if any IT personnel, the data centers must have a high degree of automation and remote management capabilities. And to meet business requirements, they must be built quickly. - -**Answering the Call at the Edge** - -These are complex requirements, but if companies are to meet time-to-market goals and deal with the lack of IT personnel at the edge, they demand simple solutions. - -One solution is integration. We’re seeing this already in the IT space, with vendors delivering hyper-converged infrastructure that combines servers, storage, networking and software that is tightly integrated and delivered in a single enclosure. This saves IT groups valuable time in terms of procuring and configuring equipment and makes it far easier to manage over the long term. - -Now we’re seeing the same strategy applied to edge data centers. Prefabricated, modular data centers are an ideal solution for delivering edge data center capacity quickly and reliably. All the required infrastructure – power, cooling, racks, UPSs – can be configured and installed in a factory and delivered as a single, modular unit to the data center site (or multiple modules, depending on requirements). - -Given they’re built in a factory under controlled conditions, modular data centers are more reliable over the long haul. They can be configured with management software built-in, enabling remote management capabilities and a high degree of automation. And they can be delivered in weeks or months, not years – and in whatever size is required, including small “micro” data centers. - -Few companies, however, have all the components required to deliver a complete, functional data center, not to mention the expertise required to install and configure it. So, it takes effective partnerships to deliver complete edge data center solutions. - -**Tech Data Partnership Delivers at the Edge ** - -APC by Schneider Electric has a long history of partnering to deliver complete solutions that address customer needs. Of the thousands of partnerships it has established over the years, the [25-year partnership][5] with [Tech Data][6] is particularly relevant for the digital transformation era. - -Tech Data is a $36.8 billion, Fortune 100 company that has established itself as the world’s leading end-to-end IT distributor. Power and physical infrastructure specialists from Tech Data team up with their counterparts from APC to deliver innovative solutions, including modular and [micro data centers][7]. Many of these solutions are pre-certified by major alliance partners, including IBM, HPE, Cisco, Nutanix, Dell EMC and others. - -To learn more, [access the full story][8] that explains how the Tech Data and APC partnership helps deliver [Certainty in a Connected World][9] and effective edge computing solutions that meet today’s time to market requirements. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3387140/edge-computing-is-key-to-meeting-digital-transformation-demands-and-partnerships-can-help-deliver-t.html#tk.rss_all - -作者:[Rob McKernan][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Rob-McKernan/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/gettyimages-494323751-942x445-100792905-large.jpg -[2]: https://www.apc.com/us/en/solutions/business-solutions/edge-computing.jsp -[3]: https://www.idc.com/getdoc.jsp?containerId=US43985717 -[4]: https://www.marketresearchengine.com/digital-transformation-market -[5]: https://www.apc.com/us/en/partners-alliances/partners/tech-data-and-apc-partnership-drives-edge-computing-success/full-resource.jsp -[6]: https://www.techdata.com/ -[7]: https://www.apc.com/us/en/solutions/business-solutions/micro-data-centers.jsp -[8]: https://www.apc.com/us/en/partners-alliances/partners/tech-data-and-apc-partnership-drives-edge-computing-success/index.jsp -[9]: https://www.apc.com/us/en/who-we-are/certainty-in-a-connected-world.jsp diff --git a/sources/tech/20190404 Intel formally launches Optane for data center memory caching.md b/sources/tech/20190404 Intel formally launches Optane for data center memory caching.md deleted file mode 100644 index 3ec4b4600e..0000000000 --- a/sources/tech/20190404 Intel formally launches Optane for data center memory caching.md +++ /dev/null @@ -1,73 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Intel formally launches Optane for data center memory caching) -[#]: via: (https://www.networkworld.com/article/3387117/intel-formally-launches-optane-for-data-center-memory-caching.html#tk.rss_all) -[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/) - -Intel formally launches Optane for data center memory caching -====== - -### Intel formally launched the Optane persistent memory product line, which includes 3D Xpoint memory technology. The Intel-only solution is meant to sit between DRAM and NAND and to speed up performance. - -![Intel][1] - -As part of its [massive data center event][2] on Tuesday, Intel formally launched the Optane persistent memory product line. It had been out for a while, but the current generation of Xeon server processors could not fully utilize it. The new Xeon 8200 and 9200 lines take full advantage of it. - -And since Optane is an Intel product (co-developed with Micron), that means AMD and Arm server processors are out of luck. - -As I have [stated in the past][3], Optane DC Persistent Memory uses 3D Xpoint memory technology that Intel developed with Micron Technology. 3D Xpoint is a non-volatile memory type that is much faster than solid-state drives (SSD), almost at the speed of DRAM, but it has the persistence of NAND flash. - -**[ Read also:[Why NVMe? Users weigh benefits of NVMe-accelerated flash storage][4] and [IDC’s top 10 data center predictions][5] | Get regularly scheduled insights [Sign up for Network World newsletters][6] ]** - -The first 3D Xpoint products were SSDs called Intel’s ["ruler,"][7] because they were designed in a long, thin format similar to the shape of a ruler. They were designed that way to fit in 1u server carriages. As part of Tuesday’s announcement, Intel introduced the new Intel SSD D5-P4326 'Ruler' SSD, using four-cell or QLC 3D NAND memory, with up to 1PB of storage in a 1U design. - -Optane DC Persistent Memory will be available in DIMM capacities of 128GB on up to 512GB initially. That’s two to four times what you can get with DRAM, said Navin Shenoy, executive vice president and general manager of Intel’s Data Center Group, who keynoted the event. - -“We expect system capacity in a server system to scale to 4.5 terabytes per socket or 36 TB in an 8-socket system. That’s three times larger than what we were able to do with the first-generation of Xeon Scalable,” he said. - -## Intel Optane memory uses and speed - -Optane runs in two different modes: Memory Mode and App Direct Mode. Memory mode is what I have been describing to you, where Optane memory exists “above” the DRAM and acts as a cache. In App Direct mode, the DRAM and Optane DC Persistent Memory are pooled together to maximize the total capacity. Not every workload is ideal for this kind of configuration, so it should be used in applications that are not latency-sensitive. The primary use case for Optane, as Intel is promoting it, is Memory Mode. - -**[[Get certified as an Apple Technical Coordinator with this seven-part online course from PluralSight.][8] ]** - -When 3D Xpoint was initially announced a few years back, Intel claimed it was 1,000 times faster than NAND, with 1000 times the endurance, and 10 times the density potential of DRAM. Well that was a little exaggerated, but it does have some intriguing elements. - -Optane memory, when used in 256B contiguous 4 cacheline, can achieve read speeds of 8.3GB/sec and write speeds of 3.0GB/sec. Compare that with the read/write speed of 500 or so MB/sec for a SATA SSD, and you can see the performance gain. Optane, remember, is feeding memory, so it caches frequently accessed SSD content. - -This is the key takeaware of Optane DC. It will keep very large data sets very close to memory, and hence the CPU, with low latency while at the same time minimizing the need to access the slower storage subsystem, whether it’s SSD or HDD. It now offers the possibility of putting multiple terabytes of data very close to the CPU for much faster access. - -## One challenge with Optane memory - -The only real challenge is that Optane goes into DIMM slots, which is where memory goes. Now some motherboards come with as many as 16 DIMM slots per CPU socket, but that’s still board real estate that the customer and OEM provider will need to balance out: Optane vs. memory. There are some Optane drives in PCI Express format, which alleviate the memory crowding on the motherboard. - -3D Xpoint also offers higher endurance than traditional NAND flash memory due to the way it writes data. Intel promises a five-year warranty with its Optane, while a lot of SSDs offer only three years. - -Join the Network World communities on [Facebook][9] and [LinkedIn][10] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3387117/intel-formally-launches-optane-for-data-center-memory-caching.html#tk.rss_all - -作者:[Andy Patrizio][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Andy-Patrizio/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/06/intel-optane-persistent-memory-100760427-large.jpg -[2]: https://www.networkworld.com/article/3386142/intel-unveils-an-epic-response-to-amds-server-push.html -[3]: https://www.networkworld.com/article/3279271/intel-launches-optane-the-go-between-for-memory-and-storage.html -[4]: https://www.networkworld.com/article/3290421/why-nvme-users-weigh-benefits-of-nvme-accelerated-flash-storage.html -[5]: https://www.networkworld.com/article/3242807/data-center/top-10-data-center-predictions-idc.html#nww-fsb -[6]: https://www.networkworld.com/newsletters/signup.html#nww-fsb -[7]: https://www.theregister.co.uk/2018/02/02/ruler_and_miniruler_ssd_formats_look_to_banish_diskstyle_drives/ -[8]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fapple-certified-technical-trainer-10-11 -[9]: https://www.facebook.com/NetworkWorld/ -[10]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190405 5 open source tools for teaching young children to read.md b/sources/tech/20190405 5 open source tools for teaching young children to read.md deleted file mode 100644 index c3a1fe82c8..0000000000 --- a/sources/tech/20190405 5 open source tools for teaching young children to read.md +++ /dev/null @@ -1,97 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (5 open source tools for teaching young children to read) -[#]: via: (https://opensource.com/article/19/4/early-literacy-tools) -[#]: author: (Laura B. Janusek https://opensource.com/users/lbjanusek) - -5 open source tools for teaching young children to read -====== -Early literacy apps give kids a foundation in letter recognition, -alphabet sequencing, word finding, and more. -![][1] - -Anyone who sees a child using a tablet or smartphone observes their seemingly innate ability to scroll through apps and swipe through screens, flexing those "digital native" muscles. According to [Common Sense Media][2], the percentage of US households in which 0- to 8-year-olds have access to a smartphone has grown from 52% in 2011 to 98% in 2017. While the debates around age guidelines and screen time surge, it's hard to deny that children are developing familiarity and skills with technology at an unprecedented rate. - -This rise in early technical literacy may be astonishing, but what about _traditional_ literacy, the good old-fashioned ability to read? What does the intersection of early literacy development and early tech use look like? Let's explore some open source tools for early learners that may help develop both of these critical skill sets. - -### Balancing risks and rewards - -But first, a disclaimer: Guidelines for technology use, especially for young children, are [constantly changing][3]. Organizations like the American Academy of Pediatrics, Common Sense Media, Zero to Three, and PBS Kids are continually conducting research and publishing recommendations. One position that all of these and other organizations can agree on is that plopping a child in front of a screen with unmonitored content for an unlimited set of time is highly inadvisable. - -Even setting kids up with educational content or tools for extended periods of time may have risks. And on the flip side, research on the benefits of education technologies is often limited or unavailable. In short, there are many cases in which we don't know for certain if educational technology use at a young age is beneficial, detrimental, or simply neutral. - -But if screen time is available to your child or student, it's logical to infer that educational resources would be preferable over simpler pop-the-bubble or slice-the-fruit games or platforms that could house inappropriate content or online predators. While we may not be able to prove that education apps will make a child's test scores soar, we can at least take comfort in their generally being safer and more age-appropriate than the internet at large. - -That said, if you're open to exploring early-education technologies, there are many reasons to look to open source options. Open source technologies are not only free but open to collaborative improvement. In many cases, they are created by developers who are educators or parents themselves, and they're a great way to avoid in-app purchases, advertisements, and paid upgrades. Open source programs can often be downloaded and installed on your device and accessed without an internet connection. Plus, the idea of [open source in education][4] is a growing trend, and there are countless resources to [learn more][5] about the concept. - -But for now, let's check out some open source tools for early literacy in action! - -### Childsplay - -![Childsplay screenshot][6] - -Let's start simple. [Childsplay][7], licensed under the GPLv2, is the most basic of the resources on this list. It's a compilation of just over a dozen educational games for young learners, four of which are specific to letter recognition, including memory games and an activity where the learner identifies a spoken letter. - -### eduActiv8 - -![eduActiv8 screenshot][8] - -[eduActiv8][9] started in 2011 as a personal project for the developer's son, "whose thirst for learning and knowledge inspired the creation of this educational program." It includes activities for building basic math and early literacy skills, including a variety of spelling, matching, and listening activities. Games include filling in missing letters in the alphabet, unscrambling letters to form a word, matching words to images, and completing mazes by connecting letters in the correct order. eduActiv8 was written in [Python][10] and is available under the GPLv3. - -### GCompris - -![GCompris screenshot][11] - -[GCompris][12] is an open source behemoth (licensed under the GPLv3) of early educational activities. A French software engineer started it in 2000, and it now includes over 130 educational games in nearly 20 languages. Tailored for learners under age 10, it includes activities for letter recognition and drawing, alphabet sequencing, vocabulary building, and games like hangman to identify missing letters in words, plus activities for learning braille. It also includes games in math and music, plus classics from tic-tac-toe to chess. - -### Feed the Monster - -![Feed the Monster screenshot][13] - -The quality of the playful "monster" graphics in [Feed the Monster][14] definitely sets it apart from the others on this list, plus it supports nearly 40 languages! The app includes activities for sorting letters to form words, memory games to match words to images, and letter-tracing writing activities. The app is developed by Curious Learning, which states: "We create, localize, distribute, and optimize open source mobile software so every child can learn to read." While Feed the Monster's offerings are geared toward early readers, Curious Mind's roadmap suggests it's headed towards a more robust personalized literacy platform growing on a foundation of research with MIT, Tufts, and Georgia State University. - -### Syntax Untangler - -![Syntax Untangler screenshot][15] - -[Syntax Untangler][16] is the outlier of this group. Developed by a technologist at the University of Wisconsin–Madison under the GPLv2, the application is "particularly designed for training language learners to recognize and parse linguistic features." Examples show the software being used for foreign language learning, but anyone can use it to create language identification games, including games for early literacy activities like letter recognition. It could also be applied to later literacy skills, like identifying parts of speech in complex sentences or literary techniques in poetry or fiction. - -### Wrapping up - -Access to [literary environments][17] has been shown to impact literacy and attitudes towards reading. Why not strive to create a digital literary environment for our kids by filling our devices with educational technologies, just like our shelves are filled with books? - -Now it's your turn! What open source literacy tools have you used? Comment below to share. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/early-literacy-tools - -作者:[Laura B. Janusek][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/lbjanusek -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/idea_innovation_kid_education.png?itok=3lRp6gFa -[2]: https://www.commonsensemedia.org/research/the-common-sense-census-media-use-by-kids-age-zero-to-eight-2017?action -[3]: https://www.businessinsider.com/smartphone-use-young-kids-toddlers-limits-science-2018-3 -[4]: /article/18/1/best-open-education -[5]: https://opensource.com/resources/open-source-education -[6]: https://opensource.com/sites/default/files/uploads/cp_flashcards.gif (Childsplay screenshot) -[7]: http://www.childsplay.mobi/ -[8]: https://opensource.com/sites/default/files/uploads/eduactiv8.jpg (eduActiv8 screenshot) -[9]: https://www.eduactiv8.org/ -[10]: /article/17/11/5-approaches-learning-python -[11]: https://opensource.com/sites/default/files/uploads/gcompris2.png (GCompris screenshot) -[12]: https://gcompris.net/index-en.html -[13]: https://opensource.com/sites/default/files/uploads/feedthemonster.png (Feed the Monster screenshot) -[14]: https://www.curiouslearning.org/ -[15]: https://opensource.com/sites/default/files/uploads/syntaxuntangler.png (Syntax Untangler screenshot) -[16]: https://courses.dcs.wisc.edu/untangler/ -[17]: http://www.jstor.org/stable/41386459 diff --git a/sources/tech/20190405 How to Authenticate a Linux Desktop to Your OpenLDAP Server.md b/sources/tech/20190405 How to Authenticate a Linux Desktop to Your OpenLDAP Server.md deleted file mode 100644 index 6ee1633f9d..0000000000 --- a/sources/tech/20190405 How to Authenticate a Linux Desktop to Your OpenLDAP Server.md +++ /dev/null @@ -1,190 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Authenticate a Linux Desktop to Your OpenLDAP Server) -[#]: via: (https://www.linux.com/blog/how-authenticate-linux-desktop-your-openldap-server) -[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen) - -How to Authenticate a Linux Desktop to Your OpenLDAP Server -====== - -![][1] - -[Creative Commons Zero][2] - -In this final part of our three-part series, we reach the conclusion everyone has been waiting for. The ultimate goal of using LDAP (in many cases) is enabling desktop authentication. With this setup, admins are better able to manage and control user accounts and logins. After all, Active Directory admins shouldn’t have all the fun, right? - -WIth OpenLDAP, you can manage your users on a centralized directory server and connect the authentication of every Linux desktop on your network to that server. And since you already have [OpenLDAP][3] and the [LDAP Authentication Manager][4] setup and running, the hard work is out of the way. At this point, there is just a few quick steps to enabling those Linux desktops to authentication with that server. - -I’m going to walk you through this process, using the Ubuntu Desktop 18.04 to demonstrate. If your desktop distribution is different, you’ll only have to modify the installation steps, as the configurations should be similar. - -**What You’ll Need** - -Obviously you’ll need the OpenLDAP server up and running. You’ll also need user accounts created on the LDAP directory tree, and a user account on the client machines with sudo privileges. With those pieces out of the way, let’s get those desktops authenticating. - -**Installation** - -The first thing we must do is install the necessary client software. This will be done on all the desktop machines that require authentication with the LDAP server. Open a terminal window on one of the desktop machines and issue the following command: - -``` -sudo apt-get install libnss-ldap libpam-ldap ldap-utils nscd -y -``` - -During the installation, you will be asked to enter the LDAP server URI ( **Figure 1** ). - -![][5] - -Figure 1: Configuring the LDAP server URI for the client. - -[Used with permission][6] - -The LDAP URI is the address of the OpenLDAP server, in the form ldap://SERVER_IP (Where SERVER_IP is the IP address of the OpenLDAP server). Type that address, tab to OK, and press Enter on your keyboard. - -In the next window ( **Figure 2)** , you are required to enter the Distinguished Name of the OpenLDAP server. This will be in the form dc=example,dc=com. - -![][7] - -Figure 2: Configuring the DN of your OpenLDAP server. - -[Used with permission][6] - -If you’re unsure of what your OpenLDAP DN is, log into the LDAP Account Manager, click Tree View, and you’ll see the DN listed in the left pane ( **Figure 3** ). - -![][8] - -Figure 3: Locating your OpenLDAP DN with LAM. - -[Used with permission][6] - -The next few configuration windows, will require the following information: - - * Specify LDAP version (select 3) - - * Make local root Database admin (select Yes) - - * Does the LDAP database require login (select No) - - * Specify LDAP admin account suffice (this will be in the form cn=admin,dc=example,dc=com) - - * Specify password for LDAP admin account (this will be the password for the LDAP admin user) - - - - -Once you’ve answered the above questions, the installation of the necessary bits is complete. - -**Configuring the LDAP Client** - -Now it’s time to configure the client to authenticate against the OpenLDAP server. This is not nearly as hard as you might think. - -First, we must configure nsswitch. Open the configuration file with the command: - -``` -sudo nano /etc/nsswitch.conf -``` - -In that file, add ldap at the end of the following line: - -``` -passwd: compat systemd - -group: compat systemd - -shadow: files -``` - -These configuration entries should now look like: - -``` -passwd: compat systemd ldap -group: compat systemd ldap -shadow: files ldap -``` - -At the end of this section, add the following line: - -``` -gshadow files -``` - -The entire section should now look like: - -``` -passwd: compat systemd ldap - -group: compat systemd ldap - -shadow: files ldap - -gshadow files -``` - -Save and close that file. - -Now we need to configure PAM for LDAP authentication. Issue the command: - -``` -sudo nano /etc/pam.d/common-password -``` - -Remove use_authtok from the following line: - -``` -password [success=1 user_unknown=ignore default=die] pam_ldap.so use_authtok try_first_pass -``` - -Save and close that file. - -There’s one more PAM configuration to take care of. Issue the command: - -``` -sudo nano /etc/pam.d/common-session -``` - -At the end of that file, add the following: - -``` -session optional pam_mkhomedir.so skel=/etc/skel umask=077 -``` - -The above line will create the default home directory (upon first login), on the Linux desktop, for any LDAP user that doesn’t have a local account on the machine. Save and close that file. - -**Logging In** - -Reboot the client machine. When the login is presented, attempt to log in with a user on your OpenLDAP server. The user account should authenticate and present you with a desktop. You are good to go. - -Make sure to configure every single Linux desktop on your network in the same fashion, so they too can authenticate against the OpenLDAP directory tree. By doing this, any user in the tree will be able to log into any configured Linux desktop machine on your network. - -You now have an OpenLDAP server running, with the LDAP Account Manager installed for easy account management, and your Linux clients authenticating against that LDAP server. - -And that, my friends, is all there is to it. - -We’re done. - -Keep using Linux. - -It’s been an honor. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/how-authenticate-linux-desktop-your-openldap-server - -作者:[Jack Wallen][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linux.com/users/jlwallen -[b]: https://github.com/lujun9972 -[1]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/cyber-3400789_1280_0.jpg?itok=YiinDnTw -[2]: /LICENSES/CATEGORY/CREATIVE-COMMONS-ZERO -[3]: https://www.linux.com/blog/2019/3/how-install-openldap-ubuntu-server-1804 -[4]: https://www.linux.com/blog/learn/2019/3/how-install-ldap-account-manager-ubuntu-server-1804 -[5]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldapauth_1.jpg?itok=DgYT8iY1 -[6]: /LICENSES/CATEGORY/USED-PERMISSION -[7]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldapauth_2.jpg?itok=CXITs7_J -[8]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldapauth_3.jpg?itok=HmhiYj7J diff --git a/sources/tech/20190408 Beyond SD-WAN- VMware-s vision for the network edge.md b/sources/tech/20190408 Beyond SD-WAN- VMware-s vision for the network edge.md deleted file mode 100644 index 4ec5b372e0..0000000000 --- a/sources/tech/20190408 Beyond SD-WAN- VMware-s vision for the network edge.md +++ /dev/null @@ -1,114 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Beyond SD-WAN: VMware’s vision for the network edge) -[#]: via: (https://www.networkworld.com/article/3387641/beyond-sd-wan-vmwares-vision-for-the-network-edge.html#tk.rss_all) -[#]: author: (Linda Musthaler https://www.networkworld.com/author/Linda-Musthaler/) - -Beyond SD-WAN: VMware’s vision for the network edge -====== -Under the ownership of VMware, the VeloCloud Business Unit is greatly expanding its vision of what an SD-WAN should be. VMware calls the strategy “the network edge.” -![istock][1] - -VeloCloud is now a Business Unit within VMware since being acquired in December 2017. The two companies have had sufficient time to integrate their operations and fit their technologies together to build a cohesive offering. In January, Neal Weinberg provided [an overview of where VMware is headed with its reinvention][2]. Now let’s look at it from the VeloCloud [SD-WAN][3] perspective. - -I recently talked to Sanjay Uppal, vice president and general manager of the VeloCloud Business Unit. He shared with me where VeloCloud is heading, adding that it’s all possible because of the complementary products that VMware brings to VeloCloud’s table. - -**[ Read also:[Edge computing is the place to address a host of IoT security concerns][4] ]** - -It all starts with this architecture chart that shows the VMware vision for the network edge. - -![][5] - -The left side of the chart shows that in the branch office, you can put an edge device that can be either a VeloCloud hardware appliance or VeloCloud software running on some third-party hardware. Then the right side of the chart shows where the workloads are — the traditional data center, the public cloud, and SaaS applications. You can put one or more edge devices there and then you have the classic hub-and-spoke model with the VeloCloud SD-WAN on running on top. - -In the middle of the diagram are the gateways, which are a differentiator and a unique benefit of VeloCloud. - -“If you have applications in the public cloud or SaaS, then you can use our gateways instead of spinning up individual edges at each of the applications,” Uppal said. “Those gateways really perform a multi-tenanted edge function. So, instead of locating an individual edge at every termination point at the cloud, you basically go from an edge in the branch to a gateway in the cloud, and then from that gateway you go to your final destination. We've engineered it so that the gateways are close to where the end applications are — typically within five milliseconds.” - -Going back to the architecture diagram, there are two clouds in the middle of the chart. The left-hand cloud is the over-the-top (OTT) service run by VeloCloud. It uses 800 gateways deployed over 30 points of presence (PoPs) around the world. The right-hand cloud is the telco cloud, which deploys gateways as network-based services. VeloCloud has several telco partners that take the same VeloCloud gateways and deploy them in their cloud. - -“Between a telco service, a cloud service, and hub and spoke on premise, we essentially have covered all the bases in terms of how enterprises would want to consume software-defined WAN. This flexibility is part of the reason why we've been successful in this market,” Uppal said. - -Where is VeloCloud going with this strategy? Again, looking at the architecture chart, the “vision” pieces are labeled 1 through 5. Let’s look at each of those areas. - -### Edge compute - -Starting with number 1 on the left-hand side of the diagram, there is the expansion from the edge itself going deeper into the branch by crossing over a LAN or a Wi-Fi boundary to get to where the individual users and IoT “things” are. This approach uses the same VeloCloud platform to spin up [compute at the edge][6], which can be either a container or a virtual machine (VM). - -“Of course, VMwareis very strong in compute in the data center. Our CEO recently articulated the VMware edge story, which is compute edge and device edge. When you combine it with the network edge, which is VeloCloud, then you have a full edge solution,” Uppal explained. “So, this first piece that you see is our foray into getting deeper into the branch all the way up to the individual users and things and combining compute functions on to the VeloCloud solution. There's been a lot of talk about edge compute and we do know that the pendulum is swinging back, but one of the major challenges is how to manage it all. VMware has strong technology in the data center space that we are bringing to bear out there at the edge.” - -### 5G underlay intelligence - -The next piece, number 2 on the diagram, is [5G][7]. At the Mobile World Congress, VMware and AT&T announced they are bringing SD-WAN out running on 5G. The idea here is that 5G should give you a low-latency connection and you get on-demand control, so you can tell 5G on the fly that you want this type of connection. Once that is done, the right network slices would be put in place and then you can get a connection according to the specifications that you asked for. - -“We as VeloCloud would measure the underlay continuously. It's like a speed test on steroids. We would measure bandwidth, packet loss, jitter and latency continuously with low overhead because we piggyback on real user traffic. And then on the basis of that measurement, we would steer the traffic one way or another,” Uppal said. “For example, your real-time voice is important, so let's pick the best performing network at that instant of time, which might change in the next instant, so that's why we have to make that decision on a per-packet basis.” - -Uppal continued, “What 5G allows us to do is to look at that underlay as not just being one underlay, but it could be several different underlays, and it's programmable so you could ask it for a type of underlay. That is actually pretty revolutionary — that we would run an overlay with the intelligence of SD-WAN counting on the underlay intelligence of 5G. - -“We are working pretty closely with our partner AT&T in this space. We are talking about the business aspect of 5G being used as a transport mechanism for enterprise data, rather than consumer phones having 5G on them. This is available from AT&T today in a handful of cities. So as 5G becomes more ubiquitous, you'll begin to see it deployed more and more. Then we will do an Ethernet or Wi-Fi handoff to the hotspot, and from then on, we'll jump onto the 5G network for the SD-WAN. Then the next phase of that will be 5G natively on our devices, which is what we are working on today.” - -### Gateway federation - -The third part of the vision is gateway federation, some of which is available today. The left-hand cloud in the diagram, which is the OTT service, should be able to interoperate gateway to gateway with the cloud on the right-hand side, which is the network-based service. For example, if you have a telco cloud of gateways but those gateways don't reach out into areas where the telco doesn’t have a presence, then you can reuse VeloCloud gateways that are sitting in other locations. A gateway would federate with another gateway, so it would extend the telco’s network beyond the facilities that they own. That's the first step of gateway federation, which is available from VeloCloud today. - -Uppal said the next step is a telco-to telco-federation. “There's a lot of interest from folks in the industry on how to get that federation done. We're working with the Metro Ethernet Forum (MEF) on that,” he said. - -### SD-WAN as a platform - -The next piece of the vision is SD-WAN as a platform. VeloCloud already incorporates security services into its SD-WAN platform in the form of [virtual network functions][8] (VNFs) from Palo Alto, Check Point Software, and other partners. Deploying a service as a VNF eliminates having separate hardware on the network. Now the company is starting to bring more services onto its platform. - -“Analytics is the area we are bringing in next,” Uppal said. “We partnered with SevOne and Plixer so that they can take analytics that we are providing, correlate them with other analytics that they have and then come up with inferences on whether things worked correctly or not, or to check for anomalous behavior.” - -Two additional areas that VeloCloud is working on are unified communications as a service (UCaaS) and universal customer premises equipment (uCPE). - -“We announced that we are working with RingCentral in the UCaaS space, and with ADVA and Telco Systems for uCPE. We have our own uCPE offering today but with a limited number of VNFs, so ADVA and Telco Systems will help us expand those capabilities,” Uppal explained. “With SD-WAN becoming a platform for on-premise deployments, you can virtualize functions and manage them from the same place, whether they're VNF-type of functions or compute-type of functions. This is an important direction that we are moving towards.” - -### Hybrid and multi-cloud integration - -The final piece of the strategy is hybrid and multi-cloud integration. Since its inception, VeloCloud has had gateways to facilitate access to specific applications running in the cloud. These gateways provide a secure end-to-end connection and an ROI advantage. - -Recognizing that workloads have expanded to multi-cloud and hybrid cloud, VeloCloud is broadening this approach utilizing VMware’s relationships with Microsoft, Amazon, and Google and offerings on Azure, Amazon Web Services, and Google Cloud, respectively. From a networking standpoint, you can get the same consistency of access using VeloCloud because you can decide from the gateway whichever direction you want to go. That direction will be chosen — and services added — based on your business policy. - -“We think this is the next hurdle in terms of deployment of SD-WAN, and once that is solved, people are going to deploy a lot more for hybrid and multi-cloud,” said Uppal. “We want to be the first ones out of the gate to get that done.” - -Uppal further said, “These five areas are where we see our SD-WAN headed, and we call this a network edge because it's beyond just the traditional SD-WAN functions. It includes edge computing, SD-WAN becoming a broader platform, integrating with hybrid multi cloud — these are all aspects of features that go way beyond just the narrower definition of SD-WAN.” - -**More about edge networking:** - - * [How edge networking and IoT will reshape data centers][9] - * [Edge computing best practices][10] - * [How edge computing can help secure the IoT][11] - - - -Join the Network World communities on [Facebook][12] and [LinkedIn][13] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3387641/beyond-sd-wan-vmwares-vision-for-the-network-edge.html#tk.rss_all - -作者:[Linda Musthaler][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Linda-Musthaler/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/01/istock-864405678-100747484-large.jpg -[2]: https://www.networkworld.com/article/3340259/vmware-s-transformation-takes-hold.html -[3]: https://www.networkworld.com/article/3031279/sd-wan-what-it-is-and-why-you-ll-use-it-one-day.html -[4]: https://www.networkworld.com/article/3307859/edge-computing-helps-a-lot-of-iot-security-problems-by-getting-it-involved.html -[5]: https://images.idgesg.net/images/article/2019/04/vmware-vision-for-network-edge-100793086-large.jpg -[6]: https://www.networkworld.com/article/3224893/what-is-edge-computing-and-how-it-s-changing-the-network.html -[7]: https://www.networkworld.com/article/3203489/what-is-5g-how-is-it-better-than-4g.html -[8]: https://www.networkworld.com/article/3206709/what-s-the-difference-between-sdn-and-nfv.html -[9]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html -[10]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html -[11]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html -[12]: https://www.facebook.com/NetworkWorld/ -[13]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190408 InitRAMFS, Dracut, and the Dracut Emergency Shell.md b/sources/tech/20190408 InitRAMFS, Dracut, and the Dracut Emergency Shell.md deleted file mode 100644 index b0e1948ff4..0000000000 --- a/sources/tech/20190408 InitRAMFS, Dracut, and the Dracut Emergency Shell.md +++ /dev/null @@ -1,135 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (InitRAMFS, Dracut, and the Dracut Emergency Shell) -[#]: via: (https://fedoramagazine.org/initramfs-dracut-and-the-dracut-emergency-shell/) -[#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/) - -InitRAMFS, Dracut, and the Dracut Emergency Shell -====== - -![][1] - -The [Linux startup process][2] goes through several stages before reaching the final [graphical or multi-user target][3]. The initramfs stage occurs just before the root file system is mounted. Dracut is a tool that is used to manage the initramfs. The dracut emergency shell is an interactive mode that can be initiated while the initramfs is loaded. - -This article will show how to use the dracut command to modify the initramfs. Some basic troubleshooting commands that can be run from the dracut emergency shell will also be demonstrated. - -### The InitRAMFS - -[Initramfs][4] stands for Initial Random-Access Memory File System. On modern Linux systems, it is typically stored in a file under the /boot directory. The kernel version for which it was built will be included in the file name. A new initramfs is generated every time a new kernel is installed. - -![A Linux Boot Directory][5] - -By default, Fedora keeps the previous two versions of the kernel and its associated initramfs. This default can be changed by modifying the value of the _installonly_limit_ setting the /etc/dnf/dnf.conf file. - -You can use the _lsinitrd_ command to list the contents of your initramfs archive: - -![The LsInitRD Command][6] - -The above screenshot shows that my initramfs archive contains the _nouveau_ GPU driver. The _modinfo_ command tells me that the nouveau driver supports several models of NVIDIA video cards. The _lspci_ command shows that there is an NVIDIA GeForce video card in my computer’s PCI slot. There are also several basic Unix commands included in the archive such as _cat_ and _cp_. - -By default, the initramfs archive only includes the drivers that are needed for your specific computer. This allows the archive to be smaller and decreases the time that it takes for your computer to boot. - -### The Dracut Command - -The _dracut_ command can be used to modify the contents of your initramfs. For example, if you are going to move your hard drive to a new computer, you might want to temporarily include all drivers in the initramfs to be sure that the operating system can load on the new computer. To do so, you would run the following command: - -``` -# dracut --force --no-hostonly -``` - -The _force_ parameter tells dracut that it is OK to overwrite the existing initramfs archive. The _no-hostonly_ parameter overrides the default behavior of including only drivers that are germane to the currently-running computer and causes dracut to instead include all drivers in the initramfs. - -By default dracut operates on the initramfs for the currently-running kernel. You can use the _uname_ command to display which version of the Linux kernel you are currently running: - -``` -$ uname -r -5.0.5-200.fc29.x86_64 -``` - -Once you have your hard drive installed and running in your new computer, you can re-run the dracut command to regenerate the initramfs with only the drivers that are needed for the new computer: - -``` -# dracut --force -``` - -There are also parameters to add arbitrary drivers, dracut modules, and files to the initramfs archive. You can also create configuration files for dracut and save them under the /etc/dracut.conf.d directory so that your customizations will be automatically applied to all new initramfs archives that are generated when new kernels are installed. As always, check the man page for the details that are specific to the version of dracut you have installed on your computer: - -``` -$ man dracut -``` - -### The Dracut Emergency Shell - -![The Dracut Emergency Shell][7] - -Sometimes something goes wrong during the initramfs stage of your computer’s boot process. When this happens, you will see “Entering emergency mode” printed to the screen followed by a shell prompt. This gives you a chance to try and fix things up manually and continue the boot process. - -As a somewhat contrived example, let’s suppose that I accidentally deleted an important kernel parameter in my boot loader configuration: - -``` -# sed -i 's/ rd.lvm.lv=fedora\/root / /' /boot/grub2/grub.cfg -``` - -The next time I reboot my computer, it will seem to hang for several minutes while it is trying to find the root partition and eventually give up and drop to an emergency shell. - -From the emergency shell, I can enter _journalctl_ and then use the **Space** key to page down though the startup logs. Near the end of the log I see a warning that reads “/dev/mapper/fedora-root does not exist”. I can then use the _ls_ command to find out what does exist: - -``` -# ls /dev/mapper -control fedora-swap -``` - -Hmm, the fedora-root LVM volume appears to be missing. Let’s see what I can find with the lvm command: - -``` -# lvm lvscan -ACTIVE '/dev/fedora/swap' [3.85 GiB] inherit -inactive '/dev/fedora/home' [22.85 GiB] inherit -inactive '/dev/fedora/root' [46.80 GiB] inherit -``` - -Ah ha! There’s my root partition. It’s just inactive. All I need to do is activate it and exit the emergency shell to continue the boot process: - -``` -# lvm lvchange -a y fedora/root -# exit -``` - -![The Fedora Login Screen][8] - -The above example only demonstrates the basic concept. You can check the [troubleshooting section][9] of the [dracut guide][10] for a few more examples. - -It is possible to access the dracut emergency shell manually by adding the _rd.break_ parameter to your kernel command line. This can be useful if you need to access your files before any system services have been started. - -Check the _dracut.kernel_ man page for details about what kernel options your version of dracut supports: - -``` -$ man dracut.kernel -``` - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/initramfs-dracut-and-the-dracut-emergency-shell/ - -作者:[Gregory Bartholomew][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/glb/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/04/dracut-816x345.png -[2]: https://en.wikipedia.org/wiki/Linux_startup_process -[3]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-targets -[4]: https://en.wikipedia.org/wiki/Initial_ramdisk -[5]: https://fedoramagazine.org/wp-content/uploads/2019/04/boot.jpg -[6]: https://fedoramagazine.org/wp-content/uploads/2019/04/lsinitrd.jpg -[7]: https://fedoramagazine.org/wp-content/uploads/2019/04/dracut-shell.jpg -[8]: https://fedoramagazine.org/wp-content/uploads/2019/04/fedora-login-1024x768.jpg -[9]: http://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html#_troubleshooting -[10]: http://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html diff --git a/sources/tech/20190408 Performance-Based Routing (PBR) - The gold rush for SD-WAN.md b/sources/tech/20190408 Performance-Based Routing (PBR) - The gold rush for SD-WAN.md deleted file mode 100644 index 9844c3d3bf..0000000000 --- a/sources/tech/20190408 Performance-Based Routing (PBR) - The gold rush for SD-WAN.md +++ /dev/null @@ -1,129 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Performance-Based Routing (PBR) – The gold rush for SD-WAN) -[#]: via: (https://www.networkworld.com/article/3387152/performance-based-routing-pbr-the-gold-rush-for-sd-wan.html#tk.rss_all) -[#]: author: (Matt Conran https://www.networkworld.com/author/Matt-Conran/) - -Performance-Based Routing (PBR) – The gold rush for SD-WAN -====== -The inefficiency factor in the case of traditional routing is one of the main reasons why SD-WAN is really taking off. -![Getty Images][1] - -BGP (Border Gateway Protocol) is considered the glue of the internet. If we view through the lens of farsightedness, however, there’s a question that still remains unanswered for the future. Will BGP have the ability to route on the best path versus the shortest path? - -There are vendors offering performance-based solutions for BGP-based networks. They have adopted various practices, such as, sending out pings to monitor the network and then modifying the BGP attributes, such as the AS prepending to make BGP do the performance-based routing (PBR). However, this falls short in a number of ways. - -The problem with BGP is that it's not capacity or performance aware and therefore its decisions can sink the application’s performance. The attributes that BGP relies upon for path selection are, for example, AS-Path length and multi-exit discriminators (MEDs), which do not always correlate with the network’s performance. - -[The time of 5G is almost here][2] - -Also, BGP changes paths only in reaction to changes in the policy or the set of available routes. It traditionally permits the use of only one path to reach a destination. Hence, traditional routing falls short as it doesn't always look for the best path which may not be the shortest path. - -### Blackout and brownouts - -As a matter of fact, we live in a world where we have more brownouts than blackouts. However, BGP was originally designed to detect only the blackouts i.e. the events wherein a link fails to reroute the traffic to another link. In a world where brownouts can last from 10 milliseconds to 10 seconds, you ought to be able to detect the failure in sub-seconds and re-route to a better path. - -This triggered my curiosity to dig out some of the real yet significant reasons why [SD-WAN][3] was introduced. We all know it saves cost and does many other things but were the inefficiencies in routing one of the main reasons? I decided to sit down with [Sorell][4] to discuss the need for policy-based routing (PBR). - -### SD-WAN is taking off - -The inefficiency factor in the case of traditional routing is one of the main reasons why SD-WAN is really taking off. SD-WAN vendors are adding proprietary mechanisms to their routing in order to select the best path, not the shortest path. - -Originally, we didn't have real-time traffic, such as, voice and video, which is latency and jitter sensitive. Besides, we also assumed that all links were equal. But in today's world, we witness more of a mix and match, for example, 100Gig and slower long-term evolution (LTE) links. The assumption that the shortest path is the best no longer holds true. - -### Introduction of new protocols - -To overcome the drawbacks of traditional routing, we have had the onset of new protocols, such as, [IPv6 segment routing][5] and named data networking along with specific SD-WAN vendor mechanisms that improve routing. - -For optimum routing, effective packet steering is a must. And SD-WAN overlays provide this by utilizing encapsulation which could be a combination of GRE, UDP, Ethernet, MPLS, [VxLAN][6] and IPsec. IPv6 segment routing implements a stack of segments (IPv6 address list) inserted in every packet and the named data networking can be distributed with routing protocols. - -Another critical requirement is the hop-by-hop payload encryption. You should be able to encrypt payloads for sessions that do not have transport layer encryption. Re-encrypting data can be expensive; it fragments the packets and further complicates the networks. Therefore, avoiding double encryption is also a must. - -The SD-WAN overlays furnish an all or nothing approach with [IPsec][7]. IPv6 segment routing requires application layer security that is provided by [IPsec][8] and named data network can offer since it’s object-based. - -### The various SD-WAN solutions - -The above are some of the new protocols available and some of the technologies that the SD-WAN vendors offer. Different vendors will have different mechanisms to implement PBR. Different vendors term PBR with different names, such as, “application-aware routing.” - -SD-WAN vendors are using many factors to influence the routing decision. They are not just making routing decisions on the number of hops or links the way traditional routing does by default. They monitor how the link is performing and do not just evaluate if the link is up or down. - -They are using a variety of mechanisms to perform PBR. For example, some are adding timestamps to every packet. Whereas, others are adding sequence numbers to the packets over and above what you would get in a transmission control protocol (TCP) sequence number. - -Another option is the use of the domain name system (DNS) and [transport layer security][9] (TLS) certificates to automatically identify the application and then based on the identity of the application; they have default classes for it. However, others use timestamps by adding a proprietary label. This is the same as adding a sequence number to the packets, but the sequence number is at Layer 3 instead of Layer 4. - -I can tie all my applications and sequence numbers and then use the network time protocol (NTP) to identify latency, jitter and dropped packets. Running NTP on both ends enables the identification of end-to-end vs hop-by-hop performance. - -Some vendors use an internet control message protocol (ICMP) or bidirectional forwarding detection (BFD). Hence, instead of adding a label to every packet which can introduce overhead, they are doing a sampling for every quarter or half a second. - -Realistically, it is yet to be determined which technology is the best to use, but what is consistent is that these mechanisms are examining elements, such as, the latency, dropped packets and jitter on the links. Essentially, different vendors are using different technologies to choose the best path, but the end result is still the same. - -With these approaches, one can, for example, identify a WebEx session and since a WebEx session has voice and video, can create that session as a high-priority session. All packets associated with the WebEx sessions get placed in a high-value queue. - -The rules are set to say, “I want my WebEx session to go over the multiprotocol label switching (MPLS) link instead of a slow LTE link.” Hence, if your MPLS link faces latency or jitter problems, it automatically reroutes the flow to a better alternate path. - -### Problems with TCP - -One critical problem that surfaces today due to the transmission control protocol (TCP) and adaptive codex is called waves. Let’s say you have 30 file transfers across a link, now to carry out the file transfers, the TCP window size will grow to a point where the link gets maxed out. The router will start to drop packets, followed by the reduced TCP window size. As a result, the bandwidth shrinks and at times when not dropping packets the window size increases. This hits the threshold and eventually, the packets start getting dropped again. - -This can be a continuous process, happening again and again. With all these waves obstructing the efficiency, we need products, like wide area network (WAN) optimizations to manage multiple TCP flows. Why? Because only TCP is aware of the flow that it controls, the single flow. It is not the networking aware of other flows moving across the path. Primarily, the TCP window size is only aware of one single file transfer. - -### Problems with adaptive codex - -Adaptive codex will use upward of 6 megabytes of the video if the link is clean but as soon as it starts to drop packets, the adaptive codex will send more packets for forwarding error-control in the codex. Therefore, it makes the problem even worse before it backs off to change the frame rate and resolution. - -Adaptive codex is the opposite of fixed codex that will always send out a fixed packet size. Adaptive codex is the standard used in WebRTC and can vary the jitter, buffer size and the frequency of packets based on the network conditions. - -Adaptive codex works better off Internet connections that have higher loss and jitter rate than, for example, more stable links, such as MPLS. This is the reason why real-time voice and the video does not use TCP because if the packet gets dropped, there is no point in sending a new packet. Logically, having the additional headers of TCP does not buy you anything. - -QUIC, on the other hand, can take a single flow and run it across multiple network-flows. This helps the video applications in rebuffering and improves throughput. In addition, it helps in boosting the response for bandwidth-intensive applications. - -### The introduction of new technologies - -With the introduction of [edge computing][10], augmented reality (AR), virtual reality (VR), real-time driving applications, [IoT sensors][11] on critical systems and other hypersensitive latency applications, PBR becomes a necessity. - -With AR you want the computing to be accomplished between 5 to 10 milliseconds of the endpoint. In the world of brownouts and path congestion, you need to pick a better path much more quickly. Also, service providers (SP) are rolling out 5G networks and announcing the use of different routing protocols that are being used as PBR. So the future looks bright for PBR. - -As voice and video, edge and virtual reality gain more existence in the market, PBR will become more popular. Even Facebook and Google are putting PBR inside their internal networks. Over time it will have a role in all the networks, specifically, the Internet Exchange points, both private and public. - -### Internet exchange points - -Back in the early 90s, there were only 4 internet exchange points in the US and 9 across the world overall. Now we have more than 3,000 where different providers have come together, and they exchange Internet traffic. - -When BGP was first rolled out in the mid-‘90s, because the internet exchange points were located far apart, the concept of shortest path held true more than today, where you have an internet that is highly distributed. - -The internet architecture will get changed as different service providers move to software-defined networking and update the routing protocols that they use. As far as the foreseeable future is concerned, however, the core internet exchanges will still use BGP. - -**This article is published as part of the IDG Contributor Network.[Want to Join?][12]** - -Join the Network World communities on [Facebook][13] and [LinkedIn][14] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3387152/performance-based-routing-pbr-the-gold-rush-for-sd-wan.html#tk.rss_all - -作者:[Matt Conran][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Matt-Conran/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/10/smart-city_iot_digital-transformation_networking_wireless_city-scape_skyline-100777499-large.jpg -[2]: https://www.networkworld.com/article/3354477/mobile-world-congress-the-time-of-5g-is-almost-here.html -[3]: https://network-insight.net/2017/08/sd-wan-networks-scalpel/ -[4]: https://techvisionresearch.com/ -[5]: https://network-insight.net/2015/07/segment-routing-introduction/ -[6]: https://youtu.be/5XtkCSfRy3c -[7]: https://network-insight.net/2015/01/design-guide-ipsec-fault-tolerance/ -[8]: https://network-insight.net/2015/01/ipsec-virtual-private-network-vpn-overview/ -[9]: https://network-insight.net/2015/10/back-to-basics-ssl-security/ -[10]: https://youtu.be/5mbPiKd_TFc -[11]: https://network-insight.net/2016/11/internet-of-things-iot-networking/ -[12]: /contributor-network/signup.html -[13]: https://www.facebook.com/NetworkWorld/ -[14]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190409 AI Ops- Let the data talk.md b/sources/tech/20190409 AI Ops- Let the data talk.md deleted file mode 100644 index 2b3d57ef17..0000000000 --- a/sources/tech/20190409 AI Ops- Let the data talk.md +++ /dev/null @@ -1,66 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (AI Ops: Let the data talk) -[#]: via: (https://www.networkworld.com/article/3388217/ai-ops-let-the-data-talk.html#tk.rss_all) -[#]: author: (Marie Fiala, Director of Portfolio Marketing for Blue Planet at Ciena ) - -AI Ops: Let the data talk -====== -The catalysts and ROI of AI-powered network analytics for automated operations were the focus of discussion for service providers at the recent FutureNet conference in London. Blue Planet’s Marie Fiala details the conversation. -![metamorworks][1] - -![Marie Fiala, Director of Portfolio Marketing for Blue Planet at Ciena][2] - -_The catalysts and ROI of AI-powered network analytics for automated operations were the focus of discussion for service providers at the recent FutureNet conference in London. Blue Planet’s Marie Fiala details the conversation._ - -Do we need perfect data? Or is ‘good enough’ data good enough? Certainly, there is a need to find a pragmatic approach or else one could get stalled in analysis-paralysis. Is closed-loop automation the end goal? Or is human-guided open loop automation desired? If the quality of data defines the quality of the process, then for closed-loop automation of critical business processes, one needs near-perfect data. Is that achievable? - -These issues were discussed and debated at the recent FutureNet conference in London, where the show focused on solving network operators’ toughest challenges. Industry presenters and panelists stayed true to the themes of AI and automation, all touting the necessity of these interlinked software technologies, yet there were varied opinions on approaches. Network and service providers such as BT, Colt, Deutsche Telekom, KPN, Orange, Telecom Italia, Telefonica, Telenor, Telia, Telus, Turk Telkom, and Vodafone weighed in on the discussion. - -**Catalysts for AI-powered analytics** - -On one point, most service providers were in agreement: there is a need to identify a specific business use case with measurable ROI, as an initial validation point when introducing AI-powered analytics into operations. - -Host operator, Vodafone, positioned 5G as the catalyst. With the advent of 5G technology supporting 100x connections, 10Gbps super-bandwidth, and ultra-low <10ms latency, the volume, velocity and variety of data is exploding. It’s a virtuous cycle – 5G technologies generate a plethora of data, and conversely, a 5G network requires data-driven automation to function accurately and optimally (how else can virtualized network functions be managed in real-time?). - -![5G as catalyst for digitalisation][3] - -Another operator stated that the ‘AI gateway for telecom’ is the customer experience domain, citing how agents can use analytics to better serve the customer base. For another operator, capacity planning is the killer use case: first leverage AI to understand what’s going on in your network, then use predictive AI for planning so that you can make smarter investment decisions. Another point of view was that service assurance is the area where the most benefits from AI will be realized. There was even mention of ‘AI as a business’ by enabling the creation of new services, such as home assistants. At the broadest level, it was noted that AI allows network operators to remain relevant in the eyes of customers. - -**The human side of AI and automation** - -When it comes to implementation, the significant human impact of AI and automation was not overlooked. Across the board, service providers acknowledged that a new skillset is needed in network operations centers. Network engineers have to upskill to become data scientists and DevOps developers in order to best leverage the new AI-driven software tools. - -Furthermore, it is a challenge to recruit specialist AI experts, especially since web-scale providers are also vying for the same talent. On the flip side of the dire need for new skills, there is also a shortage of qualified experts in legacy technologies. Operators need automated, zero-touch management before the workforce retires! - -![FutureNet panelists discuss how automated AI can be leveraged as a competitive differentiator][4] - -**The ROI of AI** - -In many cases, the approach to AI has been a technology-driven ‘Field of Dreams’: build it and they will come. A strategic decision was made to hire experts, build data lakes, collect data, and then the business case that yielded positive returns was discovered. In other cases, the business use case came first. But no matter what the approach, the ROI was significant. - -These positive results are spurring determination for continued research to uncover ever more areas where AI can deliver tangible benefits. This is however no easy task – one operator highlighted that data collection takes 80% of the effort, with the remaining 20% spent on development of algorithms. For AI to really proliferate throughout all aspects of operations, that trend needs to be reversed. It needs to be relatively easy and quick to collect massive amounts of heterogeneous data, aggregate it, and correlate it. This would allow investment to be overwhelmingly applied to the development of predictive and prescriptive analytics tailored to specific use cases, and to enacting intelligent closed-loop automation. Only then will data be able to truly talk – and tell us what we haven’t even thought of yet. - -[Discover Intelligent Automation at Blue Planet][5] - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3388217/ai-ops-let-the-data-talk.html#tk.rss_all - -作者:[Marie Fiala, Director of Portfolio Marketing for Blue Planet at Ciena][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2019/04/istock-957627892-100793278-large.jpg -[2]: https://images.idgesg.net/images/article/2019/04/marla-100793273-small.jpg -[3]: https://images.idgesg.net/images/article/2019/04/ciena-post-5-image-1-100793275-large.jpg -[4]: https://images.idgesg.net/images/article/2019/04/ciena-post-5-image-2-100793276-large.jpg -[5]: https://www.blueplanet.com/resources/Intelligent-Automation-Driving-Digital-Automation-for-Service-Providers.html?utm_campaign=X1058319&utm_source=NWW&utm_term=BPVision&utm_medium=newsletter diff --git a/sources/tech/20190409 Juniper opens SD-WAN service for the cloud.md b/sources/tech/20190409 Juniper opens SD-WAN service for the cloud.md deleted file mode 100644 index 7ed701ec14..0000000000 --- a/sources/tech/20190409 Juniper opens SD-WAN service for the cloud.md +++ /dev/null @@ -1,80 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Juniper opens SD-WAN service for the cloud) -[#]: via: (https://www.networkworld.com/article/3388030/juniper-opens-sd-wan-service-for-the-cloud.html#tk.rss_all) -[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) - -Juniper opens SD-WAN service for the cloud -====== -Juniper rolls out its Contrail SD-WAN cloud offering. -![Thinkstock][1] - -Juniper has taken the wraps off a cloud-based SD-WAN service it says will ease the management and bolster the security of wired and wireless-connected branch office networks. - -The Contrail SD-WAN cloud offering expands on the company’s existing on-premise ([SRX][2]-based) and virtual ([NFX][3]-based) SD-WAN offerings to include greater expansion possibilities – up to 10,000 spoke-attached sites and support for more variants of passive redundant hybrid WAN links – and topologies such as hub and spoke, partial, and dynamic full mesh, Juniper stated. - -**More about SD-WAN** - - * [How to buy SD-WAN technology: Key questions to consider when selecting a supplier][4] - * [How to pick an off-site data-backup method][5] - * [SD-Branch: What it is and why you’ll need it][6] - * [What are the options for security SD-WAN?][7] - - - -The service brings with it Juniper’s Contrail Service Orchestration package, which secures, automates, and runs the service life cycle across [NFX Series][3] Network Services Platforms, [EX Series][8] Ethernet Switches, [SRX Series][2] next-generation firewalls, and [MX Series][9] 5G Universal Routing Platforms. Ultimately it lets customers manage and set up SD-WANs all from a single portal. - -The package is also a service orchestrator for the [vSRX][10] Virtual Firewall and [vMX][11] Virtual Router, available in public cloud marketplaces such as Amazon Web Services (AWS) and Microsoft Azure, Juniper said. The SD-WAN offering also includes integration with cloud security provider ZScaler. - -Contrail Service Orchestration offers organizations visibility across SD-WAN, as well as branch wired and now wireless infrastructure. Monitoring and intelligent analytics offer real-time insight into network operations, allowing administrators to preempt looming threats and degradations, as well as pinpoint issues for faster recovery. - -The new service also includes support for Juniper’s [recently acquired][12] Mist Systems wireless technology, which lets the service access and manage Mist’s wireless access points, allowing customers to meld wireless and wired networks. - -Juniper recently closed the agreement to buy innovative wireless-gear-maker Mist for $405 million. Mist touts itself as having developed an artificial-intelligence-based wireless platform that makes Wi-Fi more predictable, reliable, and measurable. - -With Contrail, administrators can control a growing mix of legacy and modern scale-out architectures while automating their operational workflows using software that provides smarter, easier-to-use automation, orchestration and infrastructure visibility, wrote Juniper CTO [Bikash Koley][13] in a [blog about the SD-WAN announcement][14]. - -“Management complexity and policy enforcement are traditional network administrator fears, while both data and network security are growing in importance for organizations of all sizes,” Koley stated. ** **“Cloud-delivered SD-WAN removes the complexity of software operations, arguably the most difficult part of Software Defined Networking.” - -Analysts said the Juniper announcement could help the company compete in a super-competitive, rapidly evolving SD-WAN world. - -“The announcement is more a ‘me too’ than a particular technological breakthrough,” said Lee Doyle, principal analyst with Doyle Research. “The Mist integration is what’s interesting here, and that could help them, but there are 15 to 20 other vendors that have the same technology, bigger partners, and bigger sales channels than Juniper does.” - -Indeed the SD-WAN arena is a crowded one with Cisco, VMware, Silver Peak, Riverbed, Aryaka, Nokia, and Versa among the players. - -The cloud-based Contrail SD-WAN offering is available as an annual or multi-year subscription. - -Join the Network World communities on [Facebook][15] and [LinkedIn][16] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3388030/juniper-opens-sd-wan-service-for-the-cloud.html#tk.rss_all - -作者:[Michael Cooney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Michael-Cooney/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/01/cloud_network_blockchain_bitcoin_storage-100745950-large.jpg -[2]: https://www.juniper.net/us/en/products-services/security/srx-series/ -[3]: https://www.juniper.net/us/en/products-services/sdn/nfx-series/ -[4]: https://www.networkworld.com/article/3323407/sd-wan/how-to-buy-sd-wan-technology-key-questions-to-consider-when-selecting-a-supplier.html -[5]: https://www.networkworld.com/article/3328488/backup-systems-and-services/how-to-pick-an-off-site-data-backup-method.html -[6]: https://www.networkworld.com/article/3250664/lan-wan/sd-branch-what-it-is-and-why-youll-need-it.html -[7]: https://www.networkworld.com/article/3285728/sd-wan/what-are-the-options-for-securing-sd-wan.html?nsdr=true -[8]: https://www.juniper.net/us/en/products-services/switching/ex-series/ -[9]: https://www.juniper.net/us/en/products-services/routing/mx-series/ -[10]: https://www.juniper.net/us/en/products-services/security/srx-series/vsrx/ -[11]: https://www.juniper.net/us/en/products-services/routing/mx-series/vmx/ -[12]: https://www.networkworld.com/article/3353042/juniper-grabs-mist-for-wireless-ai-cloud-service-delivery-technology.html -[13]: https://www.networkworld.com/article/3324374/juniper-cto-talks-cloud-intent-computing-revolution-high-speed-networking-and-open-source-growth.html?nsdr=true -[14]: https://forums.juniper.net/t5/Engineering-Simplicity/Cloud-Delivered-Branch-Simplicity-Now-Surpasses-SD-WAN/ba-p/461188 -[15]: https://www.facebook.com/NetworkWorld/ -[16]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190409 UP Shell Script - Quickly Navigate To A Specific Parent Directory In Linux.md b/sources/tech/20190409 UP Shell Script - Quickly Navigate To A Specific Parent Directory In Linux.md deleted file mode 100644 index 2bb20bc8a0..0000000000 --- a/sources/tech/20190409 UP Shell Script - Quickly Navigate To A Specific Parent Directory In Linux.md +++ /dev/null @@ -1,149 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (UP Shell Script – Quickly Navigate To A Specific Parent Directory In Linux) -[#]: via: (https://www.2daygeek.com/up-shell-script-quickly-go-back-to-a-specific-parent-directory-in-linux/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -UP Shell Script – Quickly Navigate To A Specific Parent Directory In Linux -====== - -Recently we had written an article about **[bd command][1]** , which help us to **[quickly go back to the specific parent directory][1]**. - -Even, the [up shell script][2] allow us to perform the same but has different approach so, we would like to explore it. - -This will allow us to quickly navigate to a specific parent directory with mentioning the directory name. - -Instead we can give the directory number. I mean to say that number of times you’d have to go back. - -Stop typing `cd ../../..` endlessly and navigate easily to a specific parent directory by using up shell script. - -It support tab completion so, it’s become more convenient. - -The `up.sh` registers the up function and some completion functions via your `.bashrc` or `.zshrc` file. - -It was completely written using shell script and it’s support zsh and fish shell as well. - -We had written an article about **[autocd][3]**. It’s a builtin shell variable that helps us to **[navigate to inside a directory without cd command][3]**. - -### How To Install up Linux? - -It’s not based on the distribution and you have to install it based on your shell. - -Simple run the following command to enable up script on `bash` shell. - -``` -$ curl --create-dirs -o ~/.config/up/up.sh https://raw.githubusercontent.com/shannonmoeller/up/master/up.sh - -$ echo 'source ~/.config/up/up.sh' >> ~/.bashrc -``` - -Run the following command to take the changes to effect. - -``` -$ source ~/.bashrc -``` - -Simple run the following command to enable up script on `zsh` shell. - -``` -$ curl --create-dirs -o ~/.config/up/up.sh https://raw.githubusercontent.com/shannonmoeller/up/master/up.sh - -$ echo 'source ~/.config/up/up.sh' >> ~/.zshrc -``` - -Run the following command to take the changes to effect. - -``` -$ source ~/.zshrc -``` - -Simple run the following command to enable up script on `fish` shell. - -``` -$ curl --create-dirs -o ~/.config/up/up.fish https://raw.githubusercontent.com/shannonmoeller/up/master/up.fish - -$ source ~/.config/up/up.fish -``` - -### How To Use This In Linux? - -We have successfully installed and configured the up script on system. It’s time to test it. - -I’m going to take the below directory path for this testing. - -Run the `pwd` command or `dirs` command to know your current location. - -``` -daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ pwd -or -daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ dirs - -/usr/share/icons/Adwaita/256x256/apps -``` - -How to up one level? Quickly go back to one directory. I’m currently in `/usr/share/icons/Adwaita/256x256/apps` and if i want to go one directory up `256x256` directory quickly then simple type the following command. - -``` -daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ up - -daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256$ pwd -/usr/share/icons/Adwaita/256x256 -``` - -How to up multiple levels? Quickly go back to multiple directory. I’m currently in `/usr/share/icons/Adwaita/256x256/apps` and if i want to go to `share` directory quickly then simple type the following command. - -``` -daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ up 4 - -daygeek@Ubuntu18:/usr/share$ pwd -/usr/share -``` - -How to up by full name? Quickly go back to the given directory instead of number. - -``` -daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ up icons - -daygeek@Ubuntu18:/usr/share/icons$ pwd -/usr/share/icons -``` - -How to up by partial name? Quickly go back to the given directory instead of number. - -``` -daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ up Ad - -daygeek@Ubuntu18:/usr/share/icons/Adwaita$ pwd -/usr/share/icons/Adwaita -``` - -As i told in the beginning of the article, it supports tab completion. - -``` -daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ up -256x256/ Adwaita/ icons/ share/ usr/ -``` - -This tutorial allows you to quickly go back to a specific parent directory but there is no option to move forward quickly. - -We have another solution for this, will come up with new solution shortly. Please stay tune with us. - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/up-shell-script-quickly-go-back-to-a-specific-parent-directory-in-linux/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/bd-quickly-go-back-to-a-specific-parent-directory-in-linux/ -[2]: https://github.com/shannonmoeller/up -[3]: https://www.2daygeek.com/navigate-switch-directory-without-using-cd-command-in-linux/ diff --git a/sources/tech/20190409 What it takes to become a blockchain developer.md b/sources/tech/20190409 What it takes to become a blockchain developer.md deleted file mode 100644 index 668824b99a..0000000000 --- a/sources/tech/20190409 What it takes to become a blockchain developer.md +++ /dev/null @@ -1,204 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What it takes to become a blockchain developer) -[#]: via: (https://opensource.com/article/19/4/blockchain-career-developer) -[#]: author: (Joseph Mugo https://opensource.com/users/mugo) - -What it takes to become a blockchain developer -====== -If you’ve been considering a career in blockchain development, the time -to get your foot in the door is now. Here's how to get started. -![][1] - -The past decade has been an interesting time for the development of decentralized technologies. Before 2009, the progress was slow and without any clear direction until Satoshi Nakamoto created and deployed Bitcoin. That brought blockchain, the record-keeping technology behind Bitcoin, into the limelight. - -Since then, we've seen blockchain revolutionize various concepts that we used to take for granted, such as monitoring supply chains, [creating digital identities,][2] [tracking jewelry][3], and [managing shipping systems.][4] Companies such as IBM and Samsung are at the forefront of blockchain as the underlying infrastructure for the next wave of tech innovation. There is no doubt that blockchain's role will grow in the years to come. - -Thus, it's no surprise that there's a high demand for blockchain developers. LinkedIn put "blockchain developers" at the top of its 2018 [emerging jobs report][5] with an expected 33-fold growth. The freelancing site Upwork also released a report showing that blockchain was one of the [fastest growing skills][6] out of more than 5,000 in its index. - -Describing the internet in 2003, [Jeff Bezos said][7], "we are at the 1908 Hurley washing machine stage." The same can be said about blockchain today. The industry is busy building its foundation. If you've been considering a career as a blockchain developer, the time to get your foot in the door is now. - -However, you may not know where to start. It can be frustrating to go through countless blog posts and white papers or messy Slack channels when trying to find your footing. This article is a report on what I learned when contemplating whether I should become a blockchain developer. I'll approach it from the basics, with resources for each topic you need to master to be industry-ready. - -### Technical fundamentals - -Although you're won't be expected to build a blockchain from scratch, you need to be skilled enough to handle the duties of blockchain development. A bachelor's degree in computer science or information security is required. You also need to have some fundamentals in data structures, cryptography, and networking and distributed systems. - -#### Data structures - -The complexity of blockchain requires a solid understanding of data structures. At the core, a distributed ledger is like a network of replicated databases, only it stores information in blocks rather than tables. The blocks are also cryptographically secured to ensure their integrity every time a block is added. - -For this reason, you have to know how common data structures, such as binary search trees, hash maps, graphs, and linked lists, work. It's even better if you can build them from scratch. - -This [GitHub repository][8] contains all information newbies need to learn data structures and algorithms. Common languages such as Python, Java, Scala, C, C-Sharp, and C++ are featured. - -#### Cryptography - -Cryptography is the foundation of blockchain; it is what makes cryptocurrencies work. The Bitcoin blockchain employs public-key cryptography to create digital signatures and hash functions. You might be discouraged if you don't have a strong math background, but Stanford offers [a free course][9] that's perfect for newbies. You'll learn about authenticated encryption, message integrity, and block ciphers. - -You should also study [RSA][10], which doesn't require a strong background in mathematics, and look at [ECDSA][11] (elliptic curve cryptography). - -And don't forget [cryptographic hash functions][12]. They are the equations that enable most forms of encryptions on the internet. They keep payments secure on e-commerce sites and are the core mechanism behind the HTTPS protocol. There's extensive use of cryptographic hash functions in blockchain. - -#### Networking and distributed systems - -Build a good foundation in understanding how distributed ledgers work. Also understand how peer-to-peer networks work, which translates to a good foundation in computer networks, from networking topologies to routing. - -In blockchain, the processing power is harnessed from connected computers. For seamless recording and interchange of information between these devices, you need to understand about [Byzantine fault-tolerant consensus][13], which is a key security feature in blockchain. You don't need to know everything; an understanding of how distributed systems work is good enough. - -Stanford has a free, self-paced [course on computer networking][14] if you need to start from scratch. You can also consult this list of [awesome material on distributed systems][15]. - -### Cryptonomics - -We've covered some of the most important technical bits. It's time to talk about the economics of this industry. Although cryptocurrencies don't have central banks to monitor the money supply or keep crypto companies in check, it's essential to understand the economic structures woven around them. - -You'll need to understand game theory, the ideal mathematical framework for modeling scenarios in which conflicts of interest exist among involved parties. Take a look at Michael Karnjanaprakorn's [Beginner's Guide to Game Theory][16]. It's lucid and well explained. - -You also need to understand what affects currency valuation and the various monetary policies that affect cryptocurrencies. Here are some books you can refer to: - - * _[The Business Blockchain: Promise, Practice, and Application of the Next Internet Technology][17]_ by William Mougayar - * _[Blockchain: Blueprint for the New Economy][18]_ by Melanie Swan - * _[Blockchain: The Blockchain For Beginners Guide to Blockchain Technology and Leveraging Blockchain Programming][19]_ by Josh Thompsons - - - -Depending on how skilled you are, you won't need to go through all those materials. But once you're done, you'll understand the fundamentals of blockchain. Then you can dive into the good stuff. - -### Smart contracts - -A [smart contract][20] is a program that runs on the blockchain once a transaction is complete to enhance blockchain's capabilities. - -Unlike traditional judicial systems, smart contracts are enforced automatically and impartially. There are also no middlemen, so you don't need a lawyer to oversee a transaction. - -As smart contracts get more complex, they become harder to secure. You need to be aware of every possible way a smart contract can be executed and ensure that it does what is expected. At the moment, not many developers can properly optimize and audit smart contracts. - -### Decentralized applications - -Decentralized applications (DApps) are software built on blockchains. As a blockchain developer, there are several platforms where you can build a DApp. Here are some of them: - -#### Ethereum - -Ethereum is Vitalik Buterin's brainchild. It went live in 2015 and is one of the most popular development platforms. Ether is the cryptocurrency that fuels the Ethereum. - -It has its own language called Solidity, which is similar to C++ and JavaScript. If you've got any experience with either, you'll pick it up easily. - -One thing that makes Solidity unique is that it is smart-contract oriented. - -#### NEO - -Originally known as Antshares, NEO was founded by Erik Zhang and Da Hongfei in 2014. It became NEO in 2017. Unlike Ethereum, it's not limited to one language. You can use different programming languages to build your DApps on NEO, including C# and Java. Experienced users can easily start building DApps on NEO. It's focused on providing platforms for future digital businesses. - -Consider NEO if you have applications that will need to process lots of transactions per second. However, it works closely with the Chinese government and follows Chinese business regulations. - -#### EOS - -EOS blockchain aims to be a decentralized operating system that can support industrial-scale applications. It's basically like Ethereum, but with faster transaction speeds and more scalable. - -#### Hyperledger - -Hyperledger is an open source collaborative platform that was created to develop cross-industry blockchain technologies. The Linux Foundation hosts Hyperledger as a hub for open industrial blockchain development. - -### Learning resources - -Here are some courses and other resources that'll help make you an industry-ready blockchain developer. - - * The University of Buffalo and The State University of New York have a [blockchain specialization course][21] that also teaches smart contracts. You can complete it in two months if you put in 10 hours per week. You'll learn about designing and implementing smart contracts and various methods for developing decentralized applications on blockchain. - * [DApps for Beginners][22] offers tutorials and other information to get you started on creating decentralized apps on the Ethereum blockchain. You'll need to know JavaScript, and knowledge of C++ is an added advantage. - * IBM also offers [Blockchain for Developers][23], where you'll work with IBM's private blockchain and build smart contracts using the [Hyperledger Fabric][24]. - * For $3,500 you can enroll in MIT's online [Blockchain Technologies: Business Innovation and Application][25] program, which examines blockchain from an economic perspective. You need deep pockets for this one; it's meant for executives who want to know how blockchain can be used in their organizations. - * If you're willing to commit 10 hours per week, Udacity's [Blockchain Developer Nanodegree][26] can prepare you to become an industry-ready blockchain developer in six months. Before enrolling, you should have some experience in object-oriented programming. You should also have developed the frontend and backend of a web application with JavaScript. And you're required to have used a remote API to create and consume data. You'll work with Bitcoin and Ethereum protocols to build projects for real-world applications. - * If you need to shore up your foundations, you may be interested in the Open Source Society University's wildly popular and [free computer science curriculum][27]. - * You can read a variety of articles about [blockchain in open source][28] on [Opensource.com][29]. - - - -### Types of blockchain development - -What does a blockchain developer really do? It doesn't involve building a blockchain from scratch. Depending on the organization you work for, here are some of the categories that blockchain developers fall under. - -#### Backend developers - -In this case, the developer is responsible for: - - * Designing and developing APIs for blockchain integration - * Doing performance testing and deployment - * Gathering requirements and working side-by-side with other developers and designers to design software - * Providing technical support - - - -#### Blockchain-specific - -Blockchain developers and project managers fall under this category. Their main roles include: - - * Developing and maintaining decentralized applications - * Supervising and planning blockchain projects - * Advising companies on how to structure initial coin offerings (ICOs) - * Understanding what a company needs and creating apps that address those needs - * For project managers, organizing training for employees - - - -#### Smart-contract engineers - -This type of developer is required to know a smart-contract language like Solidity, Python, or Go. Their main roles include: - - * Auditing and developing smart contracts - * Meeting with users and buyers - * Understanding business flow and security to ensure there are no loopholes in smart contracts - * Doing end-to-end business process testing - - - -### The state of the industry - -There's a wide base of knowledge to help you become a blockchain developer. If you're interested in joining the field, it's an opportunity for you to make a difference by pioneering the next wave of tech innovations. It pays very well and is in high demand. There's also a wide community you can join to help you gain entry as an actual developer, including [Ethereum Stack Exchange][30] and meetup events around the world. - -The banking sector, the insurance industry, governments, and retail industries are some of the sectors where blockchain developers can work. If you're willing to work for it, being a blockchain developer is an excellent career choice. Currently, the need outpaces available talent by far. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/blockchain-career-developer - -作者:[Joseph Mugo][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mugo -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/EDU_UnspokenBlockers_1110_A.png?itok=x8A9mqVA -[2]: https://www.fool.com/investing/2018/02/16/this-is-really-happening-microsoft-is-developing-b.aspx -[3]: https://www.engadget.com/2018/04/26/ibm-blockchain-jewelry-provenance/ -[4]: https://www.engadget.com/2018/04/16/samsung-blockchain-based-global-shipping-system/ -[5]: https://economicgraph.linkedin.com/research/linkedin-2018-emerging-jobs-report -[6]: https://www.upwork.com/blog/2018/05/fastest-growing-skills-upwork-q1-2018/ -[7]: https://www.wsj.com/articles/SB104690855395981400 -[8]: https://github.com/TheAlgorithms -[9]: https://www.coursera.org/learn/crypto -[10]: https://en.wikipedia.org/wiki/RSA_(cryptosystem) -[11]: https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm -[12]: https://komodoplatform.com/cryptographic-hash-function/ -[13]: https://en.wikipedia.org/wiki/Byzantine_fault -[14]: https://lagunita.stanford.edu/courses/Engineering/Networking-SP/SelfPaced/about -[15]: https://github.com/theanalyst/awesome-distributed-systems -[16]: https://hackernoon.com/beginners-guide-to-game-theory-31e3e6adcec9 -[17]: https://www.amazon.com/dp/B01EIGP8HG/ -[18]: https://www.amazon.com/Blockchain-Blueprint-Economy-Melanie-Swan/dp/1491920491 -[19]: https://www.amazon.com/Blockchain-Beginners-Technology-Leveraging-Programming-ebook/dp/B0711RN8KJ -[20]: https://lifeinpaces.com/2019/03/04/ethereum-smart-contracts-how-do-they-work/ -[21]: https://www.coursera.org/specializations/blockchain?aid=true -[22]: https://dappsforbeginners.wordpress.com/ -[23]: https://developer.ibm.com/tutorials/cl-ibm-blockchain-101-quick-start-guide-for-developers-bluemix-trs/#start -[24]: https://www.hyperledger.org/projects/fabric -[25]: https://executive.mit.edu/openenrollment/program/blockchain-technologies-business-innovation-and-application-self-paced-online/#.XJSk-CgzbRY -[26]: https://www.udacity.com/course/blockchain-developer-nanodegree--nd1309 -[27]: https://github.com/ossu/computer-science -[28]: https://opensource.com/tags/blockchain -[29]: http://Opensource.com -[30]: https://ethereum.stackexchange.com/ diff --git a/sources/tech/20190410 How to enable serverless computing in Kubernetes.md b/sources/tech/20190410 How to enable serverless computing in Kubernetes.md deleted file mode 100644 index 75e5a5868d..0000000000 --- a/sources/tech/20190410 How to enable serverless computing in Kubernetes.md +++ /dev/null @@ -1,136 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to enable serverless computing in Kubernetes) -[#]: via: (https://opensource.com/article/19/4/enabling-serverless-kubernetes) -[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh/users/daniel-oh) - -How to enable serverless computing in Kubernetes -====== -Knative is a faster, easier way to develop serverless applications on -Kubernetes platforms. -![Kubernetes][1] - -In the first two articles in this series about using serverless on an open source platform, I described [how to get started with serverless platforms][2] and [how to write functions][3] in popular languages and build components using containers on Apache OpenWhisk. - -Here in the third article, I'll walk you through enabling serverless in your [Kubernetes][4] environment. Kubernetes is the most popular platform to manage serverless workloads and microservice application containers and uses a finely grained deployment model to process workloads more quickly and easily. - -Keep in mind that serverless not only helps you reduce infrastructure management while utilizing a consumption model for actual service use but also provides many capabilities of what the cloud platform serves. There are many serverless or FaaS (Function as a Service) platforms, but Kuberenetes is the first-class citizen for building a serverless platform because there are more than [13 serverless or FaaS open source projects][5] based on Kubernetes. - -However, Kubernetes won't allow you to build, serve, and manage app containers for your serverless workloads in a native way. For example, if you want to build a [CI/CD pipeline][6] on Kubernetes to build, test, and deploy cloud-native apps from source code, you need to use your own release management tool and integrate it with Kubernetes. - -Likewise, it's difficult to use Kubernetes in combination with serverless computing unless you use an independent serverless or FaaS platform built on Kubernetes, such as [Apache OpenWhisk][7], [Riff][8], or [Kubeless][9]. More importantly, the Kubernetes environment is still difficult for developers to learn the features of how it deals with serverless workloads from cloud-native apps. - -### Knative - -[Knative][10] was born for developers to create serverless experiences natively without depending on extra serverless or FaaS frameworks and many custom tools. Knative has three primary components—[Build][11], [Serving][12], and [Eventing][13]—for addressing common patterns and best practices for developing serverless applications on Kubernetes platforms. - -To learn more, let's go through the usual development process for using Knative to increase productivity and solve Kubernetes' difficulties from the developer's point of view. - -**Step 1:** Generate your cloud-native application from scratch using [Spring Initializr][14] or [Thorntail Project Generator][15]. Begin implementing your business logic using the [12-factor app methodology][16], and you might also do assembly testing to see if the function works correctly in many local testing tools. - -![Spring Initializr screenshot][17] | ![Thorntail Project Generator screenshot][18] ----|--- - -**Step 2:** Build container images from your source code repositories via the Knative Build component. You can define multiple steps, such as installing dependencies, running integration testing, and pushing container images to your secured image registry for using existing Kubernetes primitives. More importantly, Knative Build makes developers' daily work easier and simpler—"boring but difficult." Here's an example of the Build YAML: - - -``` -apiVersion: build.knative.dev/v1alpha1 -kind: Build -metadata: -name: docker-build -spec: -serviceAccountName: build-bot -source: -git: -revision: master -url: -steps: -\- args: -\- --context=/workspace/java/springboot -\- --dockerfile=/workspace/java/springboot/Dockerfile -\- --destination=docker.io/demo/event-greeter:0.0.1 -env: -\- name: DOCKER_CONFIG -value: /builder/home/.docker -image: gcr.io/kaniko-project/executor -name: docker-push -``` - -**Step 3:** Deploy and serve your container applications as serverless workloads via the Knative Serving component. This step shows the beauty of Knative in terms of automatically scaling up your serverless containers on Kubernetes then scaling them down to zero if there is no request to the containers for a specific period (e.g., two minutes). More importantly, [Istio][19] will automatically address ingress and egress networking traffic of serverless workloads in multiple, secure ways. Here's an example of the Serving YAML: - - -``` -apiVersion: serving.knative.dev/v1alpha1 -kind: Service -metadata: -name: greeter -spec: -runLatest: -configuration: -revisionTemplate: -spec: -container: -image: dev.local/rhdevelopers/greeter:0.0.1 -``` - -**Step 4:** Bind running serverless containers to a variety of eventing platforms, such as SaaS, FaaS, and Kubernetes, via Knative's Eventing component. In this step, you can define event channels and subscriptions, which are delivered to your services via a messaging platform such as [Apache Kafka][20] or [NATS streaming][21]. Here's an example of the Event sourcing YAML: - - -``` -apiVersion: sources.eventing.knative.dev/v1alpha1 -kind: CronJobSource -metadata: -name: test-cronjob-source -spec: -schedule: "* * * * *" -data: '{"message": "Event sourcing!!!!"}' -sink: -apiVersion: eventing.knative.dev/v1alpha1 -kind: Channel -name: ch-event-greeter -``` - -### Conclusion - -Developing with Knative will save a lot of time in building serverless applications in the Kubernetes environment. It can also make developers' jobs easier by focusing on developing serverless applications, functions, or cloud-native containers. - -* * * - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/enabling-serverless-kubernetes - -作者:[Daniel Oh (Red Hat, Community Moderator)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/daniel-oh/users/daniel-oh -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes.png?itok=PqDGb6W7 (Kubernetes) -[2]: https://opensource.com/article/18/11/open-source-serverless-platforms -[3]: https://opensource.com/article/18/11/developing-functions-service-apache-openwhisk -[4]: https://kubernetes.io/ -[5]: https://landscape.cncf.io/format=serverless -[6]: https://opensource.com/article/18/8/what-cicd -[7]: https://openwhisk.apache.org/ -[8]: https://projectriff.io/ -[9]: https://kubeless.io/ -[10]: https://cloud.google.com/knative/ -[11]: https://github.com/knative/build -[12]: https://github.com/knative/serving -[13]: https://github.com/knative/eventing -[14]: https://start.spring.io/ -[15]: https://thorntail.io/generator/ -[16]: https://12factor.net/ -[17]: https://opensource.com/sites/default/files/uploads/spring_300.png (Spring Initializr screenshot) -[18]: https://opensource.com/sites/default/files/uploads/springboot_300.png (Thorntail Project Generator screenshot) -[19]: https://istio.io/ -[20]: https://kafka.apache.org/ -[21]: https://nats.io/ diff --git a/sources/tech/20190411 How do you contribute to open source without code.md b/sources/tech/20190411 How do you contribute to open source without code.md deleted file mode 100644 index 659fd9064e..0000000000 --- a/sources/tech/20190411 How do you contribute to open source without code.md +++ /dev/null @@ -1,73 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How do you contribute to open source without code?) -[#]: via: (https://opensource.com/article/19/4/contribute-without-code) -[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen/users/don-watkins/users/greg-p/users/petercheer) - -How do you contribute to open source without code? -====== - -![Dandelion held out over water][1] - -My earliest open source contributions date back to the mid-1980s when our organization first connected to [UseNet][2] where we discovered the contributed code and the opportunities to share in its development and support. - -Today there are endless contribution opportunities, from contributing code to making how-to videos. - -I'm going to step right over the whole issue of contributing code, other than pointing out that many of us who write code but don't consider ourselves developers can still [contribute code][3]. Instead, I'd like to remind everyone that there are lots of [non-code ways to contribute to open source][4] and talk about three alternatives. - -### Filing bug reports - -One important and concrete kind of contribution could best be described as "not being afraid to file a decent bug report" and [all the consequences related to that][5]. Sometimes it's quite challenging to [file a decent bug report][6]. For example: - - * A bug may be difficult to record or describe. A long and complicated message with all sorts of unrecognizable codes may flash by as the computer is booting, or there may just be some "odd behavior" on the screen with no error messages produced. - * A bug may be difficult to reproduce. It may occur only on certain hardware/software configurations, or it may be rarely triggered, or the precise problem area may not be apparent. - * A bug may be linked to a very specific development environment configuration that is too big, messy, and complicated to share, requiring laborious creation of a stripped-down example. - * When reporting a bug to a distro, the maintainers may suggest filing the bug upstream instead, which can sometimes lead to a lot of work when the version supported by the distro is not the primary version of interest to the upstream community. (This can happen when the version provided in the distro lags the officially supported release and development version.) - - - -Nevertheless, I exhort would-be bug reporters (including me) to press on and try to get bugs fully recorded and acknowledged. - -One way to get started is to use your favorite search tool to look for similar bug reports, see how they are described, where they are filed, and so on. Another important thing to know is the formal mechanism defined for bug reporting by your distro (for example, [Fedora's is here][7]; [openSUSE's is here][8]; [Ubuntu's is here][9]) or software package ([LibreOffice's is here][10]; [Mozilla's seems to be here][11]). - -### Answering user's questions - -I lurk and occasionally participate in various mailing lists and forums, such as the [Ubuntu quality control team][12] and [forums][13], [LinuxQuestions.org][14], and the [ALSA users' mailing list][15]. Here, the contributions may relate less to bugs and more to documenting complex use cases. It's a great feeling for everyone to see someone jumping in to help a person sort out their trouble with a particular issue. - -### Writing about open source - -Finally, another area where I really enjoy contributing is [_writing_][16] about using open source software; whether it's a how-to guide, a comparative evaluation of different solutions to a particular problem, or just generally exploring an area of interest (in my case, using open source music-playing software to enjoy music). A similar option is making an instructional video; it's easy to [record the desktop][17] while demonstrating some fiendishly difficult desktop maneuver, such as creating a splashy logo with GIMP. And those of you who are bi- or multi-lingual can also consider translating existing how-to articles or videos to another language. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/contribute-without-code - -作者:[Chris Hermansen (Community Moderator)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/clhermansen/users/don-watkins/users/greg-p/users/petercheer -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/dandelion_blue_water_hand.jpg?itok=QggW8Wnw (Dandelion held out over water) -[2]: https://en.wikipedia.org/wiki/Usenet -[3]: https://opensource.com/article/19/2/open-science-git -[4]: https://opensource.com/life/16/1/8-ways-contribute-open-source-without-writing-code -[5]: https://producingoss.com/en/bug-tracker.html -[6]: https://opensource.com/article/19/3/bug-reporting -[7]: https://docs.fedoraproject.org/en-US/quick-docs/howto-file-a-bug/ -[8]: https://en.opensuse.org/openSUSE:Submitting_bug_reports -[9]: https://help.ubuntu.com/stable/ubuntu-help/report-ubuntu-bug.html.en -[10]: https://wiki.documentfoundation.org/QA/BugReport -[11]: https://developer.mozilla.org/en-US/docs/Mozilla/QA/Bug_writing_guidelines -[12]: https://wiki.ubuntu.com/QATeam -[13]: https://ubuntuforums.org/ -[14]: https://www.linuxquestions.org/ -[15]: https://www.alsa-project.org/wiki/Mailing-lists -[16]: https://opensource.com/users/clhermansen -[17]: https://opensource.com/education/16/10/simplescreenrecorder-and-kazam diff --git a/sources/tech/20190411 Managed, enabled, empowered- 3 dimensions of leadership in an open organization.md b/sources/tech/20190411 Managed, enabled, empowered- 3 dimensions of leadership in an open organization.md deleted file mode 100644 index 890b934ef1..0000000000 --- a/sources/tech/20190411 Managed, enabled, empowered- 3 dimensions of leadership in an open organization.md +++ /dev/null @@ -1,103 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Managed, enabled, empowered: 3 dimensions of leadership in an open organization) -[#]: via: (https://opensource.com/open-organization/19/4/managed-enabled-empowered) -[#]: author: (Heidi Hess von Ludewig https://opensource.com/users/heidi-hess-von-ludewig/users/amatlack) - -Managed, enabled, empowered: 3 dimensions of leadership in an open organization -====== -Different types of work call for different types of engagement. Should -open leaders always aim for empowerment? -![][1] - -"Empowerment" seems to be the latest people management [buzzword][2]. And it's an important consideration for open organizations, too. After all, we like to think these open organizations thrive when the people inside them are equipped to take initiative to do their best work as they see fit. Shouldn't an open leader's goal be complete and total empowerment of everyone, in all parts of the organization, doing all types of work? - -Not necessarily. - -Before we jump on the employee [empowerment bandwagon][3], we should explore the important connections between empowerment and innovation. That requires placing empowerment in context. - -As Allison Matlack has already demonstrated, employee investment in an organization's mission and activities—and employee _autonomy_ relative to those things—[can take several forms][4], from "managed" to "enabled" to "empowered." Sometimes, complete and total empowerment _isn't_ the most desirable type of investment an open leader would like to activate in a contributor. Projects are always changing. New challenges are always arising. As a result, the _type_ or _degree_ of involvement leaders can expect in different situations is always shifting. "Managed," "enabled," and "empowered," contributors exist simultaneously and dynamically, depending on the work they're performing (and that work's desired outcomes). - -So before we head down to the community center to win a game of buzzword bingo, let's examine the different types of work, how they function, and how they contribute to the overall innovation of a company. Let's refine what we mean by "managed," "enabled," and "empowered" work, and discuss why we need all three. - -### Managed, enabled, empowered - -First, let's consider and define each type of work activity. - -"Managed" work involves tasks that are coordinated using guidance, supervision, and direction in order to achieve specific outcomes. When someone works to coordinate _every_ part of _every_ task, we colloquially call that behavior "micro-managing." "Enabled" associates have the ability to direct themselves while working within boundaries (guidance), and they have access to the materials and resources (information, people, technologies, etc.) they require to problem-solve as they see fit. Lastly, "empowered" individuals _direct themselves_ within organizational limits, have access materials and resources, and also have the authority to represent their team or organization and make decisions about work on behalf using their best judgement, based on the former elements. - -Most important here is the idea that these concepts are _nested_ (see Figure 1). Because each level builds on the one before it, one cannot have the full benefit of "empowered" associates without also having clear guidance and direction ("managed"), and transparency of information and resources ("enabled"). What changes from level to level is the amount of managed or enabled activity that comes before it. - -Let's dive more deeply into the nature of those activities and discuss the roles leaders should play in each. - -#### Managed work - -"Managed" work is just that: work activity supervised and directed to some degree. The amount of management occurring in a situation is dynamic and depends on the activity itself. For instance, in the manufacturing economy, managed work is prominent. I'll call this "widget" work, the point of which is producing a widget the same way, every time. People need to perform this work according to consistent processes with consistent, standardized outcomes. - -Before we jump on the employee empowerment bandwagon, we should explore the important connections between empowerment and innovation. That requires placing empowerment in context. - -Because this work requires consistency, it typically proceeds via explicit guidelines and policies (rules about cost, schedule, quality, quantity, process, and so on—characteristics applicable to all work to a greater or lesser degree). We can find examples of it in a variety of roles across many industries. Quite often, _any_ role in _any_ industry requires _some_ amount of this type of work. Examples include manufacturing precision machine parts, answering a customer support case within a specified timeframe for contractual reasons and with a friendly greeting, etc. In the software industry, a role that's _entirely_ like this would be a rarity, yet even these roles require some work of the "managed" type. For instance, consider the way a support engineer must respond to a case using a set of quality standards (friendliness, perhaps with a professional written tone, a branded signature line, adherence to a participat contractual agreement, usually responding within a particular time frame, etc.). - -"Management" is the best strategy when _work requirements include adhering to a consistent schedule, process, and quality._ - -#### Enabled work - -As the amount of creativity a role requires _increases_ , the amount of directed and "managed" work we find in that role _decreases_. Guidelines get broader, processes looser, schedules lengthened (I wish!). This is because what's required to "be creative" involves other types of work (and new degrees of transparency and authority along with them). Ron McFarland explains this in [his article on adaptive leadership][5]: Many challenges challenges are ambiguous, as opposed to technical, and therefore require specific kinds of leadership. - -To take this idea one step further, we might say open leaders need to be _adaptive_ to how they view and implement the different kinds of work on their teams or in their organizations. "Enabling" associates means growing their skills and knowledge so they can manage themselves. The foundation for this type of activity is information—access to it, sharing it, and opportunities to independently use it to complete work activity. This is the kind of work Peter Drucker was referring to when he coined the term "knowledge work." - -Enabled work liberates associates from the constraints of managed work, though it still involves leaders providing considerable direction and guidance. Outcomes of this work might be familiar and normalized, but the _paths to achieving them_ are more open-ended than in managed work. Methods are more flexible and inclusive of individual preference and capability. - -"Enablement" is the best strategy when _objectives are well-defined and the outcomes are aligned with past outcomes and results_. - -#### Empowered work - -In "[Beyond Engagement][4]," Allison describes empowerment as a state in which employees have "access to all the information, training, tools, and connections to people and others teams that they need to do their best work, as well as a safe environment in which to do that work so they feel comfortable making their own decisions." In other words, empowerment is enablement with the opportunity for associates to _act using their own best judgment as it relates to shared understanding of team and organizational guidelines and objectives._ - -"Empowerment" is the best strategy when _objectives and methods for achieving them are unclear and creative flexibility is necessary for defining them._ Often this work is focused on activities where problem definition and possible solutions (i.e. investigation, planning, and execution) are not well-defined. - -Any role in any organization involves these three types of work occurring at various moments and in various situations. No job requires just one. - -### Supporting innovation through managed, enabled, and empowered work - -The labels "managed," enabled," and "empowered" apply to different work at different times, and _all three_ are embedded in work activity at different times and in different tasks. That means leaders should be paying more attention to the work contributors are doing: the kind of work, its purpose, and its desired outcomes. We're now in a position to consider how _innovation_ factors into this equation. - -Frequently, people discuss the different modes of work by way of _contrast_. Most language about them connotes negativity: managed work is "the worst," while empowered work is "the best." The goal of any leadership practice should be to "move people along the scale"—to create empowered contributors. - -However, just as types of work are located on a continuum that doesn't include this element of negation, so too should our understanding of the types of work. Rather than seeing work as, for example " _always empowered"_ or _"always managed_ ," we should recognize that any role is a function of _of all three types of work at the same time_ , each to a varying degree. Think of the equation this way: - -> _Work = managed (x) + enabled (x) + empowered (x)_ - -Note here that the more enabled and empowered the work is, the more potential there is for creativity when doing that work. This is because creativity (and the creative individual) requires information—consistently updated and "fresh" sources of information—used in conjunction with individual judgment and capacity for interpreting how to _use_ and _combine_ that information to define problems, ideate, and solve problems. Enabled and empowered work can increase inclusivity—that is, draw more closely on an individual's unique skills, perspectives, and talents because, by definition, those kinds of work are less managed and more guided. Open leadership clearly supports hiring for diversity exactly for the reason that it makes inclusivity so much richer. The ambiguity that's characteristic of the challenges we face in modern workplaces means that the work we do is ripe with potential for innovation—if we embrace risk and adapt our leadership styles to liberate it. - -In other words: - -> _Innovation = enabled (x) + empowered (x) / managed (x)_ -> -> _The more enabled and empowered the work is, the more potential for innovation._ - -Focusing on the importance of enabled work and empowered work is not to devalue managed work in any way. I would say that managed work creates a stable foundation on which creative (enabled and empowered) work can blossom. Imagine if all the work we did was empowered; our organizations would be completely chaotic, undefined, and ambiguous. Organizations need a degree of managed work in order to ensure some direction, some understanding of priorities, and some definition of "quality." - -Any role in any organization involves these three types of work occurring at various moments and in various situations. No job requires just one. As open leaders, we must recognize that work isn't an all-or-nothing, one-type-of-work-alone equation. We have to get better at understanding work in _these three different ways_ and using each one to the organization's advantage, depending on the situation. - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/4/managed-enabled-empowered - -作者:[Heidi Hess von Ludewig (Red Hat)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/heidi-hess-von-ludewig/users/amatlack -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BIZ_ControlNotDesirable.png?itok=nrXwSkv7 -[2]: https://www.entrepreneur.com/article/288340 -[3]: https://www.forbes.com/sites/lisaquast/2011/02/28/6-ways-to-empower-others-to-succeed/#5c860b365c62 -[4]: https://opensource.com/open-organization/18/10/understanding-engagement-and-empowerment -[5]: https://opensource.com/open-organization/19/3/adaptive-leadership-review diff --git a/sources/tech/20190411 Testing Small Scale Scrum in the real world.md b/sources/tech/20190411 Testing Small Scale Scrum in the real world.md deleted file mode 100644 index 0e4016435e..0000000000 --- a/sources/tech/20190411 Testing Small Scale Scrum in the real world.md +++ /dev/null @@ -1,57 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Testing Small Scale Scrum in the real world) -[#]: via: (https://opensource.com/article/19/4/next-steps-small-scale-scrum) -[#]: author: (Agnieszka Gancarczyk Leigh Griffin https://opensource.com/users/agagancarczyk/users/lgriffin/users/agagancarczyk/users/lgriffin) - -Testing Small Scale Scrum in the real world -====== -We plan to test the Small Scale Scrum framework in real-world projects -involving small teams. -![Green graph of measurements][1] - -Scrum is built on the three pillars of inspection, adaptation, and transparency. Our empirical research is really the starting point in bringing scrum, one of the most popular agile implementations, to smaller teams. As presented in the diagram below, we are now taking time to inspect this framework and principles by testing them in real-world projects. - -![small-scale-scrum-inspection.png][2] - -Progress in empirical process control - -We plan to implement Small Scale Scrum in several upcoming projects. Our test candidates are customers with real projects where teams of one to three people will undertake short-lived projects (ranging from a few weeks to three months) with an emphasis on quality and outputs. Individual projects, such as final-year projects (over 24 weeks) that are a capstone project after four years in a degree program, are almost exclusively completed by a single person. In projects of this nature, there is an emphasis on the project plan and structure and on maximizing the outputs that a single person can achieve. - -We plan to metricize and publish the results of these projects and hold several retrospectives with the teams involved. We are particularly interested in metrics centered around quality, with a particular emphasis on quality in a software engineering context and management, both project management through the lifecycle with a customer and management of the day-to-day team activities and the delivery, release, handover, and signoff process. - -Ultimately, we will retrospectively analyze the overall framework and principles and see if the Manifesto we envisioned holds up to the reality of executing a project with small numbers. From this data, we will produce the second version of Small Scale Scrum and begin a cyclic pattern of inspecting the model in new projects and adapting it again. - -We want to do all of this transparently. This series of articles is one window into the data, the insights, the experiences, and the reality of running scrum for small teams whose everyday challenges include context switching, communication, and the need for a quality delivery. A follow-up series of articles is planned to examine the outputs and help develop the second edition of Small Scale Scrum entirely in the community. - -We also plan to attend conferences and share our knowledge with the Agile community. Our first conference will be Agile 2019 where the evolution of Small Scale Scrum will be further explored as an Experience Report. We are advising colleges and sharing our structure and approach to managing and executing final-year projects. All our outputs will be freely available in the open source way. - -Given the changes to recommended team sizes in the Scrum Guide, our long-term goal and vision is to have the Scrum Guide reflect that teams of one or more people occupying one or more roles within a project are capable of following scrum. - -* * * - -_Leigh Griffin will present Small Scale Scrum at Agile 2019 in Washington, August 5-9, 2019 as an Experience Report. An expanded paper will be published on[Agile Alliance][3] to accompany this._ - -* * * - -* * * - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/next-steps-small-scale-scrum - -作者:[Agnieszka Gancarczyk (Red Hat)Leigh Griffin (Red Hat)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/agagancarczyk/users/lgriffin/users/agagancarczyk/users/lgriffin -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_lead-steps-measure.png?itok=DG7rFZPk (Green graph of measurements) -[2]: https://opensource.com/sites/default/files/small-scale-scrum-inspection.png (small-scale-scrum-inspection.png) -[3]: https://www.agilealliance.org/ diff --git a/sources/tech/20190412 Designing posters with Krita, Scribus, and Inkscape.md b/sources/tech/20190412 Designing posters with Krita, Scribus, and Inkscape.md deleted file mode 100644 index 3136ed60a0..0000000000 --- a/sources/tech/20190412 Designing posters with Krita, Scribus, and Inkscape.md +++ /dev/null @@ -1,131 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Designing posters with Krita, Scribus, and Inkscape) -[#]: via: (https://opensource.com/article/19/4/design-posters) -[#]: author: (Raghavendra Kamath https://opensource.com/users/raghukamath/users/seilarashel/users/raghukamath/users/raghukamath/users/greg-p/users/raghukamath) - -Designing posters with Krita, Scribus, and Inkscape -====== -Graphic designers can do professional work with free and open source -tools. -![Hand drawing out the word "code"][1] - -A few months ago, I was asked to design some posters for a local [Free Software Foundation][2] (FSF) event. Richard M. Stallman was [visiting][3] our country, and my friend [Abhas Abhinav][4] wanted to put up some posters and banners to promote his visit. I designed two posters for RMS's talk in Bangalore. - -I create my artwork with F/LOSS (free/libre open source software) tools. Although many artists successfully use free software to create artwork, I repeatedly encounter comments in discussion forums claiming that free software is not made for creative work. This article is my effort to detail the process I typically use to create my artwork and to spread awareness that one can do professional work with the help of F/LOSS tools. - -### Sketching some concepts - -After understanding Abhas' initial requirements, I sat down to visualize some concepts. I am not that great of a copywriter, so I started reading the FSF website to get some copy material. I needed to finish the project in two days time, while simultaneously working on other projects. I started sketching some rough layouts. From five layouts, I liked three. I scanned them using [Skanlite][5]; although these sketches were very rough and would need proper layout and design, they were a good base for me to work from. - -![Skanlite][6] - -![Poster sketches][7] - -![Poster sketch][8] - -I had three concepts: - - * On the [FSF's website][2], I read about taking free software to new frontiers, which made me think about the idea of "conquering a summit." Free software work is also filled with adventures, in my opinion, and sometimes a task may seem like scaling a summit. So, I thought showing some mountaineers would resonate well. - * I also wanted to ask people to donate to FSF, so I sketched a hand giving a heart. I didn't feel any excitement in executing this idea, nevertheless, I kept it for backup in case I fell short of time. - * The FSF website has a hashtag for a donation program called #thankGNU, so I thought about using this as the basis of my design. Repurposing my hand visual, I replaced the heart with a bouquet of flowers that has a heart-shaped card saying #thankGNU! - - - -I know these are somewhat quick and safe concepts, but given the little time I had for the project, I went ahead with them. - -My design process mostly depends on the kind of look I need in the final image. I choose my software and process according to my needs. I may use one software from start to finish or combine various software packages to accomplish what I need. For this project, I used [Krita][9] and [Scribus][10], with some minimal use of [Inkscape][11]. - -### Krita: Making the illustrations - -I imported my sketches into [Krita][12] and started adding more defined lines and shapes. - -For the first image, which has some mountaineers climbing, I used [vector layers][13] in Krita to add basic shapes and then used [Alpha Inheritance][14], which is similar to what is called Clipping Masks in Photoshop, to add texture and gradients inside the shapes. This helped me change the underlying base shape (in this case, the shape of the mountain in the first poster) anytime during the process. Krita also has a nice feature called the Reference Image tool, which lets you pin some references around your canvas (this helps a lot and saves many Alt+Tabs). Once I got the mountain how I wanted, according to the layout, I started painting the mountaineers and added more details for the ice and other features. I like grungy brushes and brushes that have a texture akin to chalks and sponges. Krita has a wide range of brushes as well as a brush engine, which makes replicating a traditional medium easier. After about 3.5 hours of painting, this image was ready for further processing. - -I wanted the second poster to have the feel of an old-style book illustration. So, I created the illustration with inked lines, somewhat similar to what we see in textbooks or novels. Inking in Krita is really a time saver; since it has stabilizer options, your wavy, hand-drawn lines will be smooth and crisp. I added a textured background and some minimal colors beneath the lines. It took me about three hours to do this illustration as well. - -![Poster][15] - -![Poster][16] - -### Scribus: Adding layout and typography - -Once my illustrations were ready, it was time to move on to the next part: adding text and other things to the layout. For this, I used Scribus. Both Scribus and Krita have CMYK support. In both applications, you can soft-proof your artwork and make changes according to the color profile you get from the printer. I mostly do my work in RGB and then, if required, I convert it to CMYK. Since most printers nowadays will do the color conversion, I don't think CMYK is support required, however, it's good to be able to work in CMYK with free software tools. - -I use open source fonts for my design work unless a client has licensed a closed font for use. A good way to browse for suitable fonts is [Google Fonts repository][17]. (I have the entire repository cloned.) Occasionally, I also browse fonts on [Font Library][18], as it also has a nice collection. I decided to use Montserrat by Julieta Ulanovsky for the posters. Placing text was very quick in Scribus; once you create a style, you can apply it to any number of paragraphs or titles. This helped me place text in both designs quickly since I didn't have to re-create the text properties. - -![Poster in Scribus][19] - -I keep two layers in Scribus. One is for the illustrations, which are linked to the original files so if I change an illustration, it will update in Scribus. The other is for text and it's layered on top of the illustration layer. - -### Inkscape: QR codes - -I used Inkscape to generate a QR code that points to the Membership page on FSF's website. To generate a QR code in Scribus, go to **Extensions > Render > Barcode > QR Code** in Inkscape's menu. The logos are also vector; because Scribus supports vector images, you can directly paste things from Inkscape into Scribus. In a way, this helps in designing CMYK-based vector graphics. - -![Final poster design][20] - -![Final poster design][21] - -With the designs ready, I exported them to layered PDF and sent to them to Abhas for feedback. He asked me to add FSF India's logo, which I did and sent a new PDF to him. - -### Printing the posters - -From here, Abhas took over the printing part of the process. His local printer in Bangalore printed the posters in A2 size. He was kind enough to send me some pictures of them. The prints came out well, considering I didn't even convert them to CMYK nor do any color corrections or soft proofing, as I usually do when I get the color profile from my printer. My opinion is that 100% accurate CMYK printing is just a myth; there are too many factors to consider. If I really want perfect color reproduction, I leave this job to the printer, as they know their printer well and can do the conversion. - -![Final poster design][22] - -![Final poster design][23] - -### Accessing the source files - -When we discussed the requirements for these posters, Abhas told me to release the artwork under a Creative Commons license so others can re-use, modify, and share it. I am really glad he mentioned it. Anyone who wants to poke at the files can [download them from my Nextcloud drive][24]. If you have any improvements to make, please go ahead—and do remember to share your work with everybody. - -Let me know what you think about this article by [emailing me][25]. - -* * * - -_[This article][26] originally appeared on [Raghukamath.com][27] and is republished with the author's permission._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/design-posters - -作者:[Raghavendra Kamath][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/raghukamath/users/seilarashel/users/raghukamath/users/raghukamath/users/greg-p/users/raghukamath -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_hand_draw.png?itok=dpAf--Db (Hand drawing out the word "code") -[2]: https://www.fsf.org/ -[3]: https://rms-tour.gnu.org.in/ -[4]: https://abhas.io/ -[5]: https://kde.org/applications/graphics/skanlite/ -[6]: https://opensource.com/sites/default/files/uploads/skanlite.png (Skanlite) -[7]: https://opensource.com/sites/default/files/uploads/sketch-01.png (Poster sketches) -[8]: https://opensource.com/sites/default/files/uploads/sketch-02.png (Poster sketch) -[9]: https://krita.org/ -[10]: https://www.scribus.net/ -[11]: https://inkscape.org/ -[12]: /life/16/4/nick-hamilton-linuxfest-northwest-2016-krita -[13]: https://docs.krita.org/en/user_manual/vector_graphics.html#vector-graphics -[14]: https://docs.krita.org/en/tutorials/clipping_masks_and_alpha_inheritance.html -[15]: https://opensource.com/sites/default/files/uploads/poster-illo-01.jpg (Poster) -[16]: https://opensource.com/sites/default/files/uploads/poster-illo-02.jpg (Poster) -[17]: https://fonts.google.com/ -[18]: https://fontlibrary.org/ -[19]: https://opensource.com/sites/default/files/uploads/poster-in-scribus.png (Poster in Scribus) -[20]: https://opensource.com/sites/default/files/uploads/final-01.png (Final poster design) -[21]: https://opensource.com/sites/default/files/uploads/final-02.png (Final poster design) -[22]: https://opensource.com/sites/default/files/uploads/posters-in-action-01.jpg (Final poster design) -[23]: https://opensource.com/sites/default/files/uploads/posters-in-action-02.jpg (Final poster design) -[24]: https://box.raghukamath.com/cloud/index.php/s/97KPnTBP4QL4iCx -[25]: mailto:raghu@raghukamath.com?Subject=designing-posters-with-free-software -[26]: https://raghukamath.com/journal/designing-posters-with-free-software/ -[27]: https://raghukamath.com/ diff --git a/sources/tech/20190412 How libraries are adopting open source.md b/sources/tech/20190412 How libraries are adopting open source.md deleted file mode 100644 index 2a8c8806e5..0000000000 --- a/sources/tech/20190412 How libraries are adopting open source.md +++ /dev/null @@ -1,71 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How libraries are adopting open source) -[#]: via: (https://opensource.com/article/19/4/software-libraries) -[#]: author: (Don Watkins https://opensource.com/users/don-watkins) - -How libraries are adopting open source -====== -Over the past decade, ByWater Solutions has expanded its business by -advocating for open source software. -![][1] - -Four years ago, I [interviewed Nathan Currulla][2], co-founder of ByWater Solutions, a major services and solutions provider for [Koha][3], a popular open source integrated library system (ILS). Since then, I've benefitted directly from his company's work, as my local [Chautauqua–Cattaraugus Library System][4] in western New York migrated from a proprietary software system to a [ByWater Systems][5]' Koha implementation. - -When I learned that ByWater is celebrating its 10th anniversary in 2019, I decided to reach out to Nathan to learn how the company has grown over the last decade. (Our remarks have been edited slightly for grammar and clarity.) - -**Don Watkins** : How has ByWater grown in the last 10 years? - -**Nathan Currulla** : Over the last 10 years, ByWater has grown by leaps and bounds. By the end of 2009, we supported five libraries with five contracts. That number shot up to 117 libraries made up of 46 contracts by the end of 2010. We now support over 1,500 libraries and 450+ contracts. We also went from having two team members to 25 in the past 10 years. The service-focused processes we have developed for migrating new libraries have been adopted by other library companies, and we have become a real market disruptor, putting pressure on other companies to provide better support and lower software subscription fees for libraries using their products. This was our goal from the outset, to change the way libraries work with the technology companies who support them, whomever they may be. - -Since the beginning, we have been rooted in the future, while legacy systems are still rooted in the past. Ten years ago, it was a real struggle for us to overcome the barriers presented by the fear of change in libraries and the outdated perceptions of open source in general. Now, although we still have to deal with change aversion, there are enough users to disprove any misinformation that exists regarding Koha and open source. The conversation is easier now than it ever was. That said, despite the fact that the ideals and morals held by open source are directly aligned with those of libraries, we still have a long way to go until open source technologies are the norm in this marketplace. - -**DW** : What kinds of libraries do you support? - -**NC** : Our partners are made up of a diverse set of library types. About 35% of our partners are public libraries, 35% are academic, and the remaining 30% are made up of museum, corporate, law, school, and other special library types. Because of Koha's flexibility and diverse feature set, we can successfully provide services to a variety of library types despite the current trend of consolidation in the library technology marketplace. - -**DW** : How does ByWater work with and help the Koha community? - -**NC** : We are working with the rest of the Koha community to streamline workflows and further improve the process of submitting and accepting new features into Koha. The vast majority of the community is made up of volunteers; by providing paid positions within the community, we can dedicate more time to the quality assurance and sign-off processes needed to stay competitive with other systems, both open source and proprietary. The number of new features submitted to the Koha community for each release is staggering. The more resources we have to get those features out to our users, the faster Koha can evolve and further shape the library-technology marketplace. - -**DW** : When we talked in 2015, ByWater had recently partnered with library solutions provider [EBSCO][6]. What initiatives are you working on now with EBSCO? - -**NC** : Originally, Catalyst IT of New Zealand worked with EBSCO to create the EBSCO Discovery Service (EDS) plugin that is used by many of our customers. Unlike most discovery systems that sit on top of a library's online public access catalog (OPAC), Koha's integration with EDS uses the Koha OPAC as the frontend, with EDS feeding data into the Koha interface. This allows libraries to choose which interface they prefer (EDS or Koha as the frontend) and provides a unified library service platform (LSP). EBSCO has always been a great partner and has always shown a strong willingness to contribute to the open source initiative. They understand the importance of having fewer barriers between the ILS and the libraries' other content to provide a seamless interface to the end user. - -Outside of Koha, ByWater is working closely with EBSCO to provide implementation, training, and support services for its [Folio LSP][7]. Folio is an open source LSP for academic libraries with the intent to provide even more seamless integration with other content providers using an extensible, open app marketplace. ByWater is developing a separate department for the implementation and ongoing support of Folio, with EBSCO providing hosting services to our mutual customers. The fact that EBSCO is investing millions in the creation of an open source platform lends further credence to the importance and validity of open source technologies in the library market. - -**DW** : What other projects are you supporting? How do they complement Koha? - -**NC** : ByWater also supports Libki, an open source, web-based kiosk and print management solution; Coral, an open source electronic resource management (ERM) solution; and Folio. Libki and Coral seamlessly integrate with Koha to provide a unified LSP. Folio may work in cooperation with Koha on some functionality, but it is too early to tell what that will specifically look like. - -ByWater also offers Koha Klassmates, a program that provides free installations of Koha to over 40 library schools in the US to familiarize the next generation of librarians with open source and the tools they will use daily in the workforce. We are also rolling out a program called Koha University, which will mentor computer science students in writing and submitting code to Koha, one of the largest open source projects in the world. This will give them experience in working in such an environment and provide the opportunity for their names to be listed as official Koha contributors. - -**DW** : What is ByWater's strategic focus over the next five years? - -**NC** : ByWater will continue offering top-rated support to our ever-growing customer base while leveraging new open source opportunities to disprove misinformation surrounding the use of open source solutions in libraries. We will focus on making open source the norm and educating libraries that could be taking advantage of these technologies but do not because of outdated information and perceptions. - -Additionally, our research and development efforts will be focused on analyzing machine learning for advanced education and support services. We also want to work closely with our partners on advancing the marketing efforts (through software) for small and large libraries to help cement their roles as community centers by marketing inventory, programs, and library events. We want to be community builders on different levels, both for our partner libraries and with the open source communities that we are involved in. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/software-libraries - -作者:[Don Watkins (Community Moderator)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/don-watkins -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/EDUCATION_opencardcatalog.png?itok=f9PyJEe- -[2]: https://opensource.com/business/15/5/bywater-solutions-empowering-library-tech -[3]: http://www.koha.org/ -[4]: https://catalog.cclsny.org/ -[5]: https://bywatersolutions.com/ -[6]: https://www.ebsco.com/ -[7]: https://www.ebsco.com/products/ebsco-folio-library-services diff --git a/sources/tech/20190412 Joe Doss- How Do You Fedora.md b/sources/tech/20190412 Joe Doss- How Do You Fedora.md deleted file mode 100644 index bc642fb1d6..0000000000 --- a/sources/tech/20190412 Joe Doss- How Do You Fedora.md +++ /dev/null @@ -1,122 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Joe Doss: How Do You Fedora?) -[#]: via: (https://fedoramagazine.org/joe-doss-how-do-you-fedora/) -[#]: author: (Charles Profitt https://fedoramagazine.org/author/cprofitt/) - -Joe Doss: How Do You Fedora? -====== - -![Joe Doss][1] - -We recently interviewed Joe Doss on how he uses Fedora. This is part of a [series][2] on the Fedora Magazine. The series profiles Fedora users and how they use Fedora to get things done. Contact us on the [feedback form][3] to express your interest in becoming a interviewee. - -### Who is Joe Doss? - -Joe Doss lives in Chicago, Illinois USA and his favorite food is pizza. He is the Director of Engineering Operations and Kenna Security, Inc. Doss describes his employer this way: “Kenna uses data science to help enterprises combine their infrastructure and application vulnerability data with exploit intelligence to measure risk, predict attacks and prioritize remediation.” - -His first Linux distribution was Red Hat Linux 5. A friend of his showed him a computer that wasn’t running Windows. Doss thought it was just a program to install on Windows when his friend gave him a Red Hat Linux 5 install disk. “I proceeded to install this Linux ‘program’ on my Father’s PC,” he says. Luckily for Doss, his father supported his interest in computers. “I ended up totally wiping out the Windows 95 install as a result and this was how I got my first computer.” - -At Kenna, Doss’ group makes use of Fedora and [Ansible][4]: “We run Fedora Cloud in multiple VPC deployments in AWS and Google Compute with over 200 virtual machines. We use Ansible to automate everything we do with Fedora.” - -Doss brews beer at home and contributes to open source in his free time. He also has a cat named Tibby. “I rescued Tibby off the street the Hyde Park neighborhood of Chicago when she was 7 months old. She is not very smart, but she makes up for that with cuteness.” His favorite place to visit is his childhood home of Michigan, but Doss says, “anywhere with a warm beach, a cool drink, and the ocean is pretty nice too.” - -![Tibby the cute cat!][5] - -### The Fedora community - -Doss became involved with Fedora and the Fedora community through his job at Kenna Security. When he first joined the company they were using Ubuntu and Chef in production. There was a desire to make the infrastructure more reproducible and reliable, and he says, “I was able to greenfield our deployments with Fedora Cloud and Ansible.” This project got him involved in the Fedora Cloud release. - -When asked about his first impression of the Fedora community, Doss said, “Overwhelming to be honest. There is so much going on and it is hard to figure out who are the stakeholders of each part of Fedora.” Once he figured out who he needed to talk to he found the community very welcoming and super supportive. - -One of the ideas he had to improve the community was to unite the various projects and team under on bug tracking tool and community resource. “Pagure, Bugzilla, Github, Fedora Forums, Discourse Forums, Mailing lists… it is all over the place and hard to navigate at first.” Despite the initial complexity of becoming familiar with the Fedora Project, Doss feels it is amazingly rewarding to be involved. “It feels awesome it to be apart of a Linux distro that impacts so many people in very positive ways. You can make a difference.” - -Doss called out Dusty Mabe at Red Hat for helping him become involved, saying Dusty “has been an amazing mentor and resource for enabling me to contribute back to Fedora.” - -Doss has an interesting way of explaining to non-technical friends what he does. “Imagine changing the tires on a very large bus while it is going down the highway at 70 MPH and sometimes you need to get involved with the tire manufacturer to help make this process work well.” This metaphor helps people understand what replacing 200-plus VMs across more than five production VPCs in AWS and Google Compute with every Fedora release. - -Doss drew my attention to one specific incident with Fedora 29 and Vagrant. “Recently we encountered an issue where Vagrant wouldn’t set the hostname on a Fresh Fedora 29 Beta VM. This was due to Fedora 29 Cloud no longer shipping the network service stub in favor of NetworkManager. This led to me working with a colleague at Kenna Security to send a patch upstream to the Vagrant project to help their developers produce a fix for Fedora 29. Vagrant usage with Fedora is a very large part of our development cycle at Kenna, and having this broken before the Fedora 29 release would have impacted us a lot.” As Doss said, “Sometimes you need to help make the tires before they go on the bus.” - -Doss is the [COPR][6] Fedora, RHEL, and CentOS package maintainer for [WireGuard VPN][7]. “The CentOS repo just went over 60 thousand downloads last month which is pretty awesome.” - -### What Hardware? - -Doss uses Fedora 29 cloud in the over five VPC deployments in AWS and Google computer. At home he has a SuperMicro SYS-5019A-FTN4 1U Server that runs Fedora 29 Server with Openshift OKD installed on it. His laptops are all Lenovo. “For Laptops I use a ThinkPad T460s for work and a ThinkPad 25 at home. Both have Fedora 29 installed. ThinkPads are the best with Fedora.” - -### What Software? - -Doss used GNOME 3 as his preferred desktop on Fedora Workstation. “I use Sublime Text 3 for my text editor on the desktop or vim on servers.” For development and testing he uses Vagrant. “Ansible is what I use for any kind of automation with Fedora. I maintain an [Ansible playbook][8] for setting up my workstation.” - -### Ansible - -I asked Doss if he had advice for people trying to learn Ansible. - -“Start small. Automate the stuff that makes your life easier, but don’t over complicate it. [Ansible Galaxy][9] is a great resource to get things done quickly, but if you truly want to learn how to use Ansible, writing your own roles and playbooks the path I would take. - -“I have helped a lot of my coworkers that have joined my Operations team at Kenna get up to speed on using Ansible by buying them a copy of [Ansible for Devops][10] by Jeff Geerling. This book will give anyone new to Ansible the foundation they need to start using it everyday. #ansible on Freenode is a great resource as well along with the [official Ansible docs][11].” - -Doss also said, “Knowing what to automate is most likely the most difficult thing to master without over complicating things. Debugging complex playbooks and roles is a close second.” - -### Home lab - -He recommended setting up a home lab. “At Kenna and at home I use [Vagrant][12] with the [Vagrant-libvirt plugin][13] for developing Ansible roles and playbooks. You can iterate quickly to build your roles and playbooks on your laptop with your favorite editor and run _vagrant provision_ to run your playbook. Quick feedback loop and the ability to burn down your Vagrant VM and start over quickly is an amazing workflow. Below is a sample Vagrant file that I keep handy to spin up a Fedora VM to test my playbooks.” - -``` --- mode: ruby -- - vi: set ft=ruby : - Vagrant.configure(2) do |config| - config.vm.provision "shell", inline: "dnf install nfs-utils rpcbind @development-tools @ansible-node redhat-rpm-config gcc-c++ -y" - config.ssh.forward_agent = true - config.vm.define "f29", autostart: false do |f29| - f29.vm.box = "fedora/29-cloud-base" - f29.vm.hostname = "f29.example.com" - f29.vm.provider "libvirt" do |vm| - vm.memory = 2048 - vm.cpus = 2 - vm.driver = "kvm" - vm.nic_model_type = "e1000" - end -config.vm.synced_folder '.', '/vagrant', disabled: true - -config.vm.provision "ansible" do |ansible| - ansible.groups = { - } - ansible.playbook = "playbooks/main.yml" - ansible.inventory_path = "inventory/development" - ansible.extra_vars = { - ansible_python_interpreter: "/usr/bin/python3" - } -# ansible.verbose = 'vvv' end -end -end -``` - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/joe-doss-how-do-you-fedora/ - -作者:[Charles Profitt][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/cprofitt/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/03/IMG_20181029_121944-816x345.jpg -[2]: https://fedoramagazine.org/tag/how-do-you-fedora/ -[3]: https://fedoramagazine.org/submit-an-idea-or-tip/ -[4]: https://ansible.com -[5]: https://fedoramagazine.org/wp-content/uploads/2019/04/IMG_20181231_110920_fixed.jpg -[6]: https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/ -[7]: https://www.wireguard.com/install/ -[8]: https://github.com/jdoss/fedora-workstation -[9]: https://galaxy.ansible.com/ -[10]: https://www.ansiblefordevops.com/ -[11]: https://docs.ansible.com/ansible/latest/index.html -[12]: http://www.vagrantup.com/ -[13]: https://github.com/vagrant-libvirt/vagrant-libvirt%20plugin diff --git a/sources/tech/20190414 Working with Microsoft Exchange from your Linux Desktop.md b/sources/tech/20190414 Working with Microsoft Exchange from your Linux Desktop.md deleted file mode 100644 index 657464affb..0000000000 --- a/sources/tech/20190414 Working with Microsoft Exchange from your Linux Desktop.md +++ /dev/null @@ -1,100 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Working with Microsoft Exchange from your Linux Desktop) -[#]: via: (https://itsfoss.com/microsoft-exchange-linux-desktop/) -[#]: author: (It's FOSS Community https://itsfoss.com/author/itsfoss/) - -Working with Microsoft Exchange from your Linux Desktop -====== - -Recently I had to do some research (and even magic) to be able to work on my Ubuntu Desktop with Exchange Mail Server from my current employer. I am going to share my experience with you. - -### Microsoft Exchange on Linux desktop - -I guess many readers might feel confused, I mean, it shouldn’t be that hard if you simply use [Thunderbird][1] or any other [Linux email client][2] with your Office365 Exchange Account, right? Well, for better or for worse it was not this case for me. - -Here’s my ordeal and what I did to make Microsoft Exchange work on my Linux desktop. - -![][3] - -#### The initial problem, no Office365 - -The first problem encountered in my situation was that we don’t currently use Office365 like probably majority of current people does for hosting their Exchange accounts, we currently use an on premises Exchange server and a very old version of it. - -So, this means I didn’t have the luxury of using automatic configuration that comes in majority of email clients to simply connect to Office365. - -#### Webmail is always an option… right? - -Short answer is yes, however, as I mentioned we are using Exchange 2010, so the webmail interface is not only outdated, it even won’t allow you to have a decent email signature as it has a limit of characters in webmail configuration, so I needed to use an email client if I really wanted to be able to use the email the way I needed. - -#### Another problem, I am picky for my email client - -I am a regular Google user, I have been using GMail for the past 14 years as my personal email, so I really like how it looks and works. I actually use the webmail as I don’t like to be tied to my email client or even my computer device, if something happens and I need to switch to a newer device I don’t want to have to copy things over, I just want things to be there waiting for me to use them. - -This leads me not liking Thunderbird, K-9 or Evolution Mail clients. All of these are capable of being connected to Exchange servers (one way or the other) but again, they don’t meet the standard of a clean, easy and modern GUI I wanted plus they couldn’t even manage my Exchange calendar well (which was a real deal breaker for me). - -#### Found some options as email clients! - -After some other research I found there were a couple of options for email clients that I could use and that actually would work the way I expected. - -These were: [Hiri][4], which had a very modern and innovative user interface and had Exchange Server capabilities and there also was [Mailspring][5] which is a fork of an old foe ([Nylas Mail][6]) and which was my real favorite. - -However, Mailspring couldn’t connect directly to an Exchange server (using Exchange’s protocol) unless you use Office365, it required [IMAP][7] (another luxury!) and the IT department at my office was reluctant to activate IMAP for “security reasons”. - -Hiri is a good option but it’s not free. - -#### No IMAP, no Office365, game over? Not yet! - -I have to confess, I was really ready to give up and simply use the old webmail and learn to live with it, however, I gave a last shot on my research capabilities and I found a possible solution: what if I had a way to put a “man in the middle”? What if I was able to make the IMAP to run locally on my computer while my computer simply pull the emails via Exchange protocol? It was a long shot but, could work… - -So I started looking here and there and found this [DavMail][8], which works as a Gateway to “talk” with an Exchange server and then locally provide you whatever you need in order to use it. Basically it was like a “translator” between by computer and the Exchange and then provided me with whatever service I needed. - -![DavMail Settings][9] - -So basically I only had to give DavMail my Exchange Server’s URL (even OWA URL) and set whatever ports I wanted on my local computer to be the new ports where my email client could connect. - -This way I was free to basically use ANY client I wanted, at least any client which was capable of using IMAP protocol would work, as long as I configure the same ports I set up as my local ports. - -![Mailspring working my office’s on premises Exchange. Information has been blurred due to non-disclosure agreement at my office.][10] - -And that was it! I was able to use MailSpring (which is my preferred choice for email client) under my non favorable conditions. - -#### Bonus point: this is a multi-platform solution! - -What’s best is that this solution will work for any platform! So if you have the same problem while using Windows or macOS, DavMail has a version for all tastes! - -![avatar][11] - -![avatar][11] - -### Helder Martins - -Systems Engineer, technology evangelist, Ubuntu user, Linux enthusiast, father and husband. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/microsoft-exchange-linux-desktop/ - -作者:[It's FOSS Community][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/itsfoss/ -[b]: https://github.com/lujun9972 -[1]: https://www.thunderbird.net/en-US/ -[2]: https://itsfoss.com/best-email-clients-linux/ -[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/04/microsoft-exchange-linux-desktop.png?resize=800%2C450&ssl=1 -[4]: https://www.hiri.com/ -[5]: https://getmailspring.com/ -[6]: https://itsfoss.com/n1-open-source-email-client/ -[7]: https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol -[8]: http://davmail.sourceforge.net/ -[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/04/davmail-exchange-settings.png?resize=800%2C597&ssl=1 -[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/04/davmail-exchange-settings-1.jpg?ssl=1 -[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/04/helder-martins-1.jpeg?ssl=1 diff --git a/sources/tech/20190415 Blender short film, new license for Chef, ethics in open source, and more news.md b/sources/tech/20190415 Blender short film, new license for Chef, ethics in open source, and more news.md deleted file mode 100644 index f33d614f86..0000000000 --- a/sources/tech/20190415 Blender short film, new license for Chef, ethics in open source, and more news.md +++ /dev/null @@ -1,75 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Blender short film, new license for Chef, ethics in open source, and more news) -[#]: via: (https://opensource.com/article/15/4/news-april-15) -[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) - -Blender short film, new license for Chef, ethics in open source, and more news -====== -Here are some of the biggest headlines in open source in the last two -weeks -![][1] - -In this edition of our open source news roundup, we take a look at the 12th Blender short film, Chef shifts away from open core toward a 100% open source license, SuperTuxKart's latest release candidate with online multiplayer support, and more. - -### Blender Animation Studio releases Spring - -[Spring][2], the latest short film from [Blender Animation Studio][3], premiered on April 4th. The [press release on Blender.org][4] describes _Spring_ as "the story of a shepherd girl and her dog, who face ancient spirits in order to continue the cycle of life." The development version of Blender 2.80, as well as other open source tools, were used to create this animated short film. The character and asset files for the film are available from [Blender Cloud][5], and tutorials, walkthroughs, and other instructional material are coming soon. - -### The importance of ethics in open source - -Reuven M. Lerner, writing for [Linux Journal][6], shares his thoughts about need for teaching programmers about ethics in an article titled [Open Source Is Winning, and Now It's Time for People to Win Too][7]. Part retrospective looking back at the history of open source and part call to action for moving forward, Lerner's article discusses many issues relevant to open source beyond just coding. He argues that when we teach kids about open source "[w]e also need to inform them of the societal parts of their work, and the huge influence and power that today's programmers have." He continues by stating "It's sometimes okay—and even preferable—for a company to make less money deliberately, when the alternative would be to do things that are inappropriate or illegal." Overall a very thought-provoking piece, Lerner makes a solid case for making sure to remember that the open source movement is about more than free code. - -### Chef transitions from open core to open source - -Chef, the company behind the well-known DevOps automation tool, [announced][8] that they will be release 100% of their software as open source under an Apache 2.0 license. This move marks a departure from their current [open core model][9]. Given a tendency for companies to try to move in the opposite direction, Chef's move is a big one. By operating under a fully open source model Chef builds a better, stronger relationship with the community, and the community benefits from full access to all the source code. Even developers of competing projects (and the commercial projects based on those products) benefit from being able to learn from Chef's code, as Chef can do from its open source competitors, which is one of the greatest advantages of open source; the best ideas get to win and business relationships are built around trust and quality of service, not proprietary secrets. For a more detailed look at this development, read Steven J. Vaughan-Nichols's [article for ZDNet][10]. - -### SuperTuxKart releases version 0.10 RC1 for testing - -SuperTuxKart, the open source Mario Kart clone featuring open source mascots, is getting very close to releasing a version that supports online multi-player. On April 5th, the SuperTuxKart blog announced the release of [SuperTuxKart 0.10 Release Candidate 1][11], which needs testing before the final release. Users who want to help test the online and LAN multiplayer options can [download the game from SourceForge][12]. In addition to the new online and LAN features, SuperTuxKart 0.10 features a couple new tracks to race on; Ravenbridge Mansion replaces the old Mansion track, and Black Forest, which was an add-on track in earlier versions, is now part of the official track set. - -#### In other news - - * [My code is your code: Embracing the power of open sourcing][13] - * [FOSS means kids can have a big impact][14] - * [Open-source textbooks lighten students’ financial load][15] - * [Developing the ultimate open source radio control transmitter][16] - * [How does open source tech transform Government?][17] - - - -_Thanks, as always, to Opensource.com staff members and moderators for their help this week._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/15/4/news-april-15 - -作者:[Joshua Allen Holm (Community Moderator)][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/holmja -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/weekly_news_roundup_tv.png?itok=B6PM4S1i -[2]: https://www.youtube.com/watch?v=WhWc3b3KhnY (Spring) -[3]: https://blender.studio/ (Blender Animation Studio) -[4]: https://www.blender.org/press/spring-open-movie/ (Spring Open Movie) -[5]: https://cloud.blender.org/p/spring/ (Spring on Blender Cloud) -[6]: https://www.linuxjournal.com/ (Linux Journal) -[7]: https://www.linuxjournal.com/content/open-source-winning-and-now-its-time-people-win-too (Open Source Is Winning, and Now It's Time for People to Win Too) -[8]: https://blog.chef.io/2019/04/02/chef-software-announces-the-enterprise-automation-stack/ (Introducing the New Chef: 100% Open, Always) -[9]: https://en.wikipedia.org/wiki/Open-core_model (Wikipedia: Open-core model) -[10]: https://www.zdnet.com/article/leading-devops-program-chef-goes-all-in-with-open-source/ (Leading DevOps program Chef goes all in with open source) -[11]: http://blog.supertuxkart.net/2019/04/supertuxkart-010-release-candidate-1.html (SuperTuxKart 0.10 Release Candidate 1 Released) -[12]: https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart/0.10-rc1/ (SourceForge: SuperTuxKart) -[13]: https://www.forbes.com/sites/forbestechcouncil/2019/04/10/my-code-is-your-code-embracing-the-power-of-open-sourcing/ (My code is your code: Embracing the power of open sourcing) -[14]: https://www.linuxjournal.com/content/foss-means-kids-can-have-big-impact (FOSS means kids can have a big impact) -[15]: https://www.schoolnewsnetwork.org/2019/04/09/open-source-textbooks-lighten-students-financial-load/ (Open-source textbooks lighten students’ financial load) -[16]: https://hackaday.com/2019/04/03/developing-the-ultimate-open-source-radio-control-transmitter/ (Developing the ultimate open source radio control transmitter) -[17]: https://www.openaccessgovernment.org/open-source-tech-transform/62059/ (How does open source tech transform Government?) diff --git a/sources/tech/20190417 How to use Ansible to document procedures.md b/sources/tech/20190417 How to use Ansible to document procedures.md deleted file mode 100644 index 51eddfe92c..0000000000 --- a/sources/tech/20190417 How to use Ansible to document procedures.md +++ /dev/null @@ -1,132 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to use Ansible to document procedures) -[#]: via: (https://opensource.com/article/19/4/ansible-procedures) -[#]: author: (Marco Bravo https://opensource.com/users/marcobravo/users/shawnhcorey/users/marcobravo) - -How to use Ansible to document procedures -====== -In Ansible, the documentation is the playbook, so the documentation -naturally evolves alongside the code -![][1] - -> "Documentation is a love letter that you write to your future self." —[Damian Conway][2] - -I use [Ansible][3] as my personal notebook for documenting coding procedures—both the ones I use often and the ones I rarely use. This process facilitates my work and reduces the time it takes to do repetitive tasks, the ones where specific commands in a certain sequence are executed to accomplish a specific result. - -By documenting with Ansible, I don't need to memorize all the parameters for each command or all the steps involved with a specific procedure, and it's easy to share the details with my teammates. - -Traditional approaches for documentation, like wikis or shared drives, are useful for general documents, but inevitably they become outdated and can't keep pace with the rapid changes in infrastructure and environments. For specific procedures, it's better to document directly into the code using a tool like Ansible. - -### Ansible's advantages - -Before we begin, let's recap some basic Ansible concepts: a _playbook_ is a high-level organization of procedures using plays; _plays_ are specific procedures for a group of hosts; _tasks_ are specific actions, _modules_ are units of code, and _inventory_ is a list of managed nodes. - -Ansible's great advantage is that the documentation is the playbook itself, so it evolves with and is contained inside the code. This is not only useful; it's also practical because, more than just documenting solutions with Ansible, you're also coding a playbook that permits you to write your procedures and commands, reproduce them, and automate them. This way, you can look back in six months and be able to quickly understand and execute them again. - -It's true that this way of resolving problems could take more time at first, but it will definitely save a lot of time in the long term. By being courageous and disciplined to adopt these new habits, you will improve your skills in each iteration. - -Following are some other important elements and support tools that will facilitate your process. - -### Use source code control - -> "First do it, then do it right, then do it better." —[Addy Osmani][4] - -When working with Ansible playbooks, it's very important to implement a playbook-as-code strategy. A good way to accomplish this is to use a source code control repository that will permit to you start with a simple solution and iterate to improve it. - -A source code control repository provides many advantages as you collaborate with other developers, restore previous versions, and back up your work. But in creating documentation, its main advantages are that you get traceability about what are you doing and can iterate around small changes to improve your work. - -The most popular source control system is [Git][5], but there are [others][6] like [Subversion][7], [Bazaar][8], [BitKeeper][9], and [Mercurial][10]. - -### Keep idempotency in mind - -In infrastructure automation, idempotency means to reach a specific end state that remains the same, no matter how many times the process is executed. So when you are preparing to automate your procedures, keep the desired result in mind and write scripts and commands that will achieve them consistently. - -This concept exists in most Ansible modules because after you specify the desired final state, Ansible will accomplish it. For instance, there are modules for creating filesystems, modifying iptables, and managing cron entries. All of these modules are idempotent by default, so you should give them preference. - -If you are using some of the lower-level modules, like command or shell, or developing your own modules, be careful to write code that will be idempotent and safe to repeat many times to get the same result. - -The idempotency concept is important when you prepare procedures for automation because it permits you to evaluate several scenarios and incorporate the ones that will make your code safer and create an abstraction level that points to the desired result. - -### Test it! - -Testing your deployment workflow creates fewer surprises when your code arrives in production. Ansible's belief that you shouldn't need another framework to validate basic things in your infrastructure is true. But your focus should be on application testing, not infrastructure testing. - -Ansible's documentation offers several [testing strategies for your procedures][11]. For testing Ansible playbooks, you can use [Molecule][12], which is designed to aid in the development and testing of Ansible roles. Molecule supports testing with multiple instances, operating systems/distributions, virtualization providers, test frameworks, and testing scenarios. This means Molecule will run through all the testing steps: linting verifications, checking playbook syntax, building Docker environments, running playbooks against Docker environments, running the playbook again to verify idempotence, and cleaning everything up afterward. [Testing Ansible roles with Molecule][13] is a good introduction to Molecule. - -### Run it! - -Running Ansible playbooks can create logs that are formatted in an unfriendly and difficult-to-read way. In those cases, the Ansible Run Analysis (ARA) is a great complementary tool for running Ansible playbooks, as it provides an intuitive interface to browse them. Read [Analyzing Ansible runs using ARA][14] for more information. - -Remember to protect your passwords and other sensitive information with [Ansible Vault][15]. Vault can encrypt binary files, **group_vars** , **host_vars** , **include_vars** , and **var_files**. But this encrypted data is exposed when you run a playbook in **-v** (verbose) mode, so it's a good idea to combine it with the keyword **no_log** set to **true** to hide any task's information, as it indicates that the value of the argument should not be logged or displayed. - -### A basic example - -Do you need to connect to a server to produce a report file and copy the file to another server? Or do you need a lot of specific parameters to connect? Maybe you're not sure where to store the parameters. Or are your procedures are taking a long time because you need to collect all the parameters from several sources? - -Suppose you have a network topology with some restrictions and you need to copy a file from a server that you can access ( **server1** ) to another server that is managed by a third party ( **server2** ). The parameters to connect are: - - -``` -Source server: server1 -Target server: server2 -Port: 2202 -User: transfers -SSH Key: transfers_key -File to copy: file.log -Remote directory: /logs/server1/ -``` - -In this scenario, you need to connect to **server1** and copy the file using these parameters. You can accomplish this using a one-line command: - - -``` -`ssh server1 "scp -P 2202 -oUser=transfers -i ~/.ssh/transfers_key file.log server2:/logs/server1/"` -``` - -Now your playbook can do the procedure. - -### Useful combinations - -If you produce a lot of Ansible playbooks, you can organize all your procedures with other tools like [AWX][16] (Ansible Works Project), which provides a web-based user interface, a REST API, and a task engine built on top of Ansible so that users can better control their Ansible project use in IT environments. - -Other interesting combinations are Ansible with [Rundeck][17], which provides procedures as self-service jobs, and [Jenkins][18] for continuous integration and continuous delivery processes. - -### Conclusion - -I hope that these tips for using Ansible will help you improve your automation processes, coding, and documentation. If you have more interest, dive in and learn more. And I would like to hear your ideas or questions, so please share them in the comments below. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/ansible-procedures - -作者:[Marco Bravo][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/marcobravo/users/shawnhcorey/users/marcobravo -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/document_free_access_cut_security.png?itok=ocvCv8G2 -[2]: https://en.wikipedia.org/wiki/Damian_Conway -[3]: https://www.ansible.com/ -[4]: https://addyosmani.com/ -[5]: https://git-scm.com/ -[6]: https://en.wikipedia.org/wiki/Comparison_of_version_control_software -[7]: https://subversion.apache.org/ -[8]: https://bazaar.canonical.com/en/ -[9]: https://www.bitkeeper.org/ -[10]: https://www.mercurial-scm.org/ -[11]: https://docs.ansible.com/ansible/latest/reference_appendices/test_strategies.html -[12]: https://molecule.readthedocs.io/en/latest/ -[13]: https://opensource.com/article/18/12/testing-ansible-roles-molecule -[14]: https://opensource.com/article/18/5/analyzing-ansible-runs-using-ara -[15]: https://docs.ansible.com/ansible/latest/user_guide/vault.html -[16]: https://github.com/ansible/awx -[17]: https://www.rundeck.com/ansible -[18]: https://www.redhat.com/en/blog/integrating-ansible-jenkins-cicd-process diff --git a/sources/tech/20190418 Electronics designed in 5 different countries with open hardware.md b/sources/tech/20190418 Electronics designed in 5 different countries with open hardware.md deleted file mode 100644 index 5c81f2d8bc..0000000000 --- a/sources/tech/20190418 Electronics designed in 5 different countries with open hardware.md +++ /dev/null @@ -1,119 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Electronics designed in 5 different countries with open hardware) -[#]: via: (https://opensource.com/article/19/4/hardware-international) -[#]: author: (Michael Weinberg https://opensource.com/users/mweinberg) - -Electronics designed in 5 different countries with open hardware -====== -This month's open source hardware column looks at certified open -hardware from five countries that may surprise you. -![Gadgets and open hardware][1] - -The Open Source Hardware Association's [Hardware Registry][2] lists hardware from 29 different countries on five continents, demonstrating the broad, international footprint of certified open source hardware. - -![Open source hardware map][3] - -In some ways, this international reach shouldn't be a surprise. Like many other open source communities, the open source hardware community is built on top of the internet, not grounded in any specific geographical location. The focus on documentation, sharing, and openness makes it easy for people in different places with different backgrounds to connect and work together to develop new hardware. Even the community-developed open source hardware [definition][4] has been translated into 11 languages from the original English. - -Even if you're familiar with the international nature of open source hardware, it can still be refreshing to step back and remember what it means in practice. While it may not surprise you that there are many certifications from the United States, Germany, and India, some of the other countries boasting certifications might be a bit less expected. Let's look at six such projects from five of those countries. - -### Bulgaria - -Bulgaria may have the highest per-capita open source hardware certification rate of any country on earth. That distinction is mostly due to the work of two companies: [ANAVI Technology][5] and [Olimex][6]. - -ANAVI focuses mostly on IoT projects built on top of the Raspberry Pi and ESP8266. The concept of "creator contribution" means that these projects can be certified open source even though they are built upon non-open bases. That is because all of ANAVI's work to develop the hardware on top of these platforms (ANAVI's "creator contribution") has been open sourced in compliance with the certification requirements. - -The [ANAVI Light pHAT][7] was the first piece of Bulgarian hardware to be certified by OSHWA. The Light pHAT makes it easy to add a 12V RGB LED strip to a Raspberry Pi. - -![ANAVI-Light-pHAT][8] - -[ANAVI-Light-pHAT][9] - -Olimex's first OSHWA certification was for the [ESP32-PRO][10], a highly connectable IoT board built around an ESP32 microcontroller. - -![Olimex ESP32-PRO][11] - -[Olimex ESP32-PRO][12] - -### China - -While most people know China is a hotbed for hardware development, fewer realize that it is also the home to a thriving _open source_ hardware culture. One of the reasons is the tireless advocacy of Naomi Wu (also known as [SexyCyborg][13]). It is fitting that the first piece of certified hardware from China is one she helped develop: the [sino:bit][14]. The sino:bit is designed to help introduce students to programming and includes China-specific features like a LED matrix big enough to represent Chinese characters. - -![sino:bit][15] - -[ sino:bit][16] - -### Mexico - -Mexico has also produced a range of certified open source hardware. A recent certification is the [Meow Meow][17], a capacitive touch interface from [Electronic Cats][18]. Meow Meow makes it easy to use a wide range of objects—bananas are always a favorite—as controllers for your computer. - -![Meow Meow][19] - -[Meow Meow][20] - -### Saudi Arabia - -Saudi Arabia jumped into open source hardware earlier this year with the [M1 Rover][21]. The robot is an unmanned vehicle that you can build (and build upon). It is compatible with a number of different packages designed for specific purposes, so you can customize it for a wide range of applications. - -![M1-Rover ][22] - -[M1-Rover][23] - -### Sri Lanka - -This project from Sri Lanka is part of a larger effort to improve traffic flow in urban areas. The team behind the [Traffic Wave Disruptor][24] read research about how many traffic jams are caused by drivers slamming on their brakes when they drive too close to the car in front of them, producing a ripple of rapid breaking on the road behind them. This stop/start effect can be avoided if cars maintain a consistent, optimal distance from one another. If you reduce the stop/start pattern, you also reduce the number of traffic jams. - -![Traffic Wave Disruptor][25] - -[Traffic Wave Disruptor][26] - -But how can drivers know if they are keeping an optimal distance? The prototype Traffic Wave Disruptor aims to give drivers feedback when they fail to keep optimal spacing. Wider adoption could help increase traffic flow without building new highways nor reducing the number of cars using them. - -* * * - -You may have noticed that all the hardware featured here is based on electronics. In next month's open source hardware column, we will take a look at open source hardware for the outdoors, away from batteries and plugs. Until then, [certify][27] your open source hardware project (especially if your country is not yet on the registry). It might be featured in a future column. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/hardware-international - -作者:[Michael Weinberg][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mweinberg -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/openhardwaretools_0.png?itok=NUIvc-R1 (Gadgets and open hardware) -[2]: https://certification.oshwa.org/list.html -[3]: https://opensource.com/sites/default/files/uploads/opensourcehardwaremap.jpg (Open source hardware map) -[4]: https://www.oshwa.org/definition/ -[5]: http://anavi.technology/ -[6]: https://www.olimex.com/ -[7]: https://certification.oshwa.org/bg000001.html -[8]: https://opensource.com/sites/default/files/uploads/anavi-light-phat.png (ANAVI-Light-pHAT) -[9]: http://anavi.technology/#products -[10]: https://certification.oshwa.org/bg000010.html -[11]: https://opensource.com/sites/default/files/uploads/olimex-esp32-pro.png (Olimex ESP32-PRO) -[12]: https://www.olimex.com/Products/IoT/ESP32/ESP32-PRO/open-source-hardware -[13]: https://www.youtube.com/channel/UCh_ugKacslKhsGGdXP0cRRA -[14]: https://certification.oshwa.org/cn000001.html -[15]: https://opensource.com/sites/default/files/uploads/sinobit.png (sino:bit) -[16]: https://github.com/sinobitorg/hardware -[17]: https://certification.oshwa.org/mx000003.html -[18]: https://electroniccats.com/ -[19]: https://opensource.com/sites/default/files/uploads/meowmeow.png (Meow Meow) -[20]: https://electroniccats.com/producto/meowmeow/ -[21]: https://certification.oshwa.org/sa000001.html -[22]: https://opensource.com/sites/default/files/uploads/m1-rover.png (M1-Rover ) -[23]: https://www.hackster.io/AhmedAzouz/m1-rover-362c05 -[24]: https://certification.oshwa.org/lk000001.html -[25]: https://opensource.com/sites/default/files/uploads/traffic-wave-disruptor.png (Traffic Wave Disruptor) -[26]: https://github.com/Aightm8/Traffic-wave-disruptor -[27]: https://certification.oshwa.org/ diff --git a/sources/tech/20190418 How to organize with Calculist- Ideas, events, and more.md b/sources/tech/20190418 How to organize with Calculist- Ideas, events, and more.md deleted file mode 100644 index 7c9d844315..0000000000 --- a/sources/tech/20190418 How to organize with Calculist- Ideas, events, and more.md +++ /dev/null @@ -1,120 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to organize with Calculist: Ideas, events, and more) -[#]: via: (https://opensource.com/article/19/4/organize-calculist) -[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) - -How to organize with Calculist: Ideas, events, and more -====== -Give structure to your ideas and plans with Calculist, an open source -web app for creating outlines. -![Team checklist][1] - -Thoughts. Ideas. Plans. We all have a few of them. Often, more than a few. And all of us want to make some or all of them a reality. - -Far too often, however, those thoughts and ideas and plans are a jumble inside our heads. They refuse to take a discernable shape, preferring instead to rattle around here, there, and everywhere in our brains. - -One solution to that problem is to put everything into [an outline][2]. An outline can be a great way to organize what you need to organize and give it the shape you need to take it to the next step. - -A number of people I know rely on a popular web-based tool called WorkFlowy for their outlining needs. If you prefer your applications (including web ones) to be open source, you'll want to take a look at [Calculist][3]. - -The brainchild of [Dan Allison][4], Calculist is billed as _the thinking tool for problem solvers_. It does much of what WorkFlowy does, and it has a few features that its rival is missing. - -Let's take a look at using Calculist to organize your ideas (and more). - -### Getting started - -If you have a server, you can try to [install Calculist][5] on it. If, like me, you don't have server or just don't have the technical chops, you can turn to the [hosted version][6] of Calculist. - -[Sign up][7] for a no-cost account, then log in. Once you've done that, you're ready to go. - -### Creating a basic outline - -What you use Calculist for really depends on your needs. I use Calculist to create outlines for articles and essays, to create lists of various sorts, and to plan projects. Regardless of what I'm doing, every outline I create follows the same pattern. - -To get started, click the **New List** button. This creates a blank outline (which Calculist calls a _list_ ). - -![Create a new list in Calculist][8] - -The outline is a blank slate waiting for you to fill it up. Give the outline a name, then press Enter. When you do that, Calculist adds the first blank line for your outline. Use that as your starting point. - -![A new outline in Calculist][9] - -Add a new line by pressing Enter. To indent a line, press the Tab key while on that line. If you need to create a hierarchy, you can indent lines as far as you need to indent them. Press Shift+Tab to outdent a line. - -Keep adding lines until you have a completed outline. Calculist saves your work every few seconds, so you don't need to worry about that. - -![Calculist outline][10] - -### Editing an outline - -Outlines are fluid. They morph. They grow and shrink. Individual items in an outline change. Calculist makes it easy for you to adapt and make those changes. - -You already know how to add an item to an outline. If you don't, go back a few paragraphs for a refresher. To edit text, click on an item and start typing. Don't double-click (more on this in a few moments). If you accidentally double-click on an item, press Esc on your keyboard and all will be well. - -Sometimes you need to move an item somewhere else in the outline. Do that by clicking and holding the bullet for that item. Drag the item and drop it wherever you want it. Anything indented below the item moves with it. - -At the moment, Calculist doesn't support adding notes or comments to an item in an outline. A simple workaround I use is to add a line indented one level deeper than the item where I want to add the note. That's not the most elegant solution, but it works. - -### Let your keyboard do the walking - -Not everyone likes to use their mouse to perform actions in an application. Like a good desktop application, you're not at the mercy of your mouse when you use Calculist. It has many keyboard shortcuts that you can use to move around your outlines and manipulate them. - -The keyboard shortcuts I mentioned a few paragraphs ago are just the beginning. There are a couple of dozen keyboard shortcuts that you can use. - -For example, you can focus on a single portion of an outline by pressing Ctrl+Right Arrow key. To get back to the full outline, press Ctrl+Left Arrow key. There are also shortcuts for moving up and down in your outline, expanding and collapsing lists, and deleting items. - -You can view the list of shortcuts by clicking on your user name in the upper-right corner of the Calculist window and clicking **Preferences**. You can also find a list of [keyboard shortcuts][11] in the Calculist GitHub repository. - -If you need or want to, you can change the shortcuts on the **Preferences** page. Click on the shortcut you want to change—you can, for example, change the shortcut for zooming in on an item to Ctrl+0. - -### The power of commands - -Calculist's keyboard shortcuts are useful, but they're only the beginning. The application has command mode that enables you to perform basic actions and do some interesting and complex tasks. - -To use a command, double-click an item in your outline or press Ctrl+Enter while on it. The item turns black. Type a letter or two, and a list of commands displays. Scroll down to find the command you want to use, then press Enter. There's also a [list of commands][12] in the Calculist GitHub repository. - -![Calclulist commands][13] - -The commands are quite comprehensive. While in command mode, you can, for example, delete an item in an outline or delete an entire outline. You can import or export outlines, sort and group items in an outline, or change the application's theme or font. - -### Final thoughts - -I've found that Calculist is a quick, easy, and flexible way to create and view outlines. It works equally well on my laptop and my phone, and it packs not only the features I regularly use but many others (including support for [LaTeX math expressions][14] and a [table/spreadsheet mode][15]) that more advanced users will find useful. - -That said, Calculist isn't for everyone. If you prefer your outlines on the desktop, then check out [TreeLine][16], [Leo][17], or [Emacs org-mode][18]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/organize-calculist - -作者:[Scott Nesbitt ][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/scottnesbitt -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist) -[2]: https://en.wikipedia.org/wiki/Outline_(list) -[3]: https://calculist.io/ -[4]: https://danallison.github.io/ -[5]: https://github.com/calculist/calculist-web -[6]: https://app.calculist.io/ -[7]: https://app.calculist.io/join -[8]: https://opensource.com/sites/default/files/uploads/calculist-new-list.png (Create a new list in Calculist) -[9]: https://opensource.com/sites/default/files/uploads/calculist-getting-started.png (A new outline in Calculist) -[10]: https://opensource.com/sites/default/files/uploads/calculist-outline.png (Calculist outline) -[11]: https://github.com/calculist/calculist/wiki/Keyboard-Shortcuts -[12]: https://github.com/calculist/calculist/wiki/Command-Mode -[13]: https://opensource.com/sites/default/files/uploads/calculist-commands.png (Calculist commands) -[14]: https://github.com/calculist/calculist/wiki/LaTeX-Expressions -[15]: https://github.com/calculist/calculist/issues/32 -[16]: https://opensource.com/article/18/1/creating-outlines-treeline -[17]: http://www.leoeditor.com/ -[18]: https://orgmode.org/ diff --git a/sources/tech/20190418 Level up command-line playgrounds with WebAssembly.md b/sources/tech/20190418 Level up command-line playgrounds with WebAssembly.md deleted file mode 100644 index 411adc44fa..0000000000 --- a/sources/tech/20190418 Level up command-line playgrounds with WebAssembly.md +++ /dev/null @@ -1,196 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Level up command-line playgrounds with WebAssembly) -[#]: via: (https://opensource.com/article/19/4/command-line-playgrounds-webassembly) -[#]: author: (Robert Aboukhalil https://opensource.com/users/robertaboukhalil) - -Level up command-line playgrounds with WebAssembly -====== -WebAssembly is a powerful tool for bringing command line utilities to -the web and giving people the chance to tinker with tools. -![Various programming languages in use][1] - -[WebAssembly][2] (Wasm) is a new low-level language designed with the web in mind. Its main goal is to enable developers to compile code written in other languages—such as C, C++, and Rust—into WebAssembly and run that code in the browser. In an environment where JavaScript has traditionally been the only option, WebAssembly is an appealing counterpart, and it enables portability along with the promise for near-native runtimes. WebAssembly has also already been used to port lots of tools to the web, including [desktop applications][3], [games][4], and even [data science tools written in Python][5]! - -Another application of WebAssembly is command line playgrounds, where users are free to play with a simulated version of a command line tool. In this article, we'll explore a concrete example of leveraging WebAssembly for this purpose, specifically to port the tool **[jq][6]** —which is normally confined to the command line—to run directly in the browser. - -If you haven't heard, jq is a very powerful command line tool for querying, modifying, and wrangling JSON objects on the command line. - -### Why WebAssembly? - -Aside from WebAssembly, there are two other approaches we can take to build a jq playground: - - 1. **Set up a sandboxed environment** on your server that executes queries and returns the result to the user via API calls. Although this means your users get to play with the real thing, the thought of hosting, securing, and sanitizing user inputs for such an application is worrisome. Aside from security, the other concern is responsiveness; the additional round trips to the server can introduce noticeable latencies and negatively impact the user experience. - 2. **Simulate the command line environment using JavaScript** , where you define a series of steps that the user can take. Although this approach is more secure than option 1, it involves _a lot_ more work, as you need to rewrite the logic of the tool in JavaScript. This method is also limiting: when I'm learning a new tool, I'm not just interested in the "happy path"; I want to break things! - - - -These two solutions are not ideal because we have to choose between security and a meaningful learning experience. Ideally, we could simply run the command line tool directly in the browser, with no servers and no simulations. Lucky for us, WebAssembly is just the solution we need to achieve that. - -### Set up your environment - -In this article, we'll use the [Emscripten tool][7] to port jq from C to WebAssembly. Conveniently, it provides us with drop-in replacements for the most common C/C++ build tools, including gcc, make, and configure. - -Instead of [installing Emscripten from scratch][8] (the build process can take a long time), we'll use a Docker image I put together that comes prepackaged with everything you'll need for this article (and beyond!). - -Let's start by pulling the image and creating a container from it: - - -``` -# Fetch docker image containing Emscripten -docker pull robertaboukhalil/emsdk:1.38.26 - -# Create container from that image -docker run -dt --name wasm robertaboukhalil/emsdk:1.38.26 - -# Enter the container -docker exec -it wasm bash - -# Make sure we can run emcc, Emscripten's wrapper around gcc -emcc --version -``` - -If you see the Emscripten version on the screen, you're good to go! - -### Porting jq to WebAssembly - -Next, let's clone the jq repository: - - -``` -git clone -cd jq -git checkout 9fa2e51 -``` - -Note that we're checking out a specific commit, just in case the jq code changes significantly after this article is published. - -Before we compile jq to WebAssembly, let's first consider how we would normally compile jq to binary for use on the command line. - -From the [README file][9], here is what we need to build jq to binary (don't type this in yet): - - -``` -# Fetch jq dependencies -git submodule update --init - -# Generate ./configure file -autoreconf -fi - -# Run ./configure -./configure \ -\--with-oniguruma=builtin \ -\--disable-maintainer-mode - -# Build jq executable -make LDFLAGS=-all-static -``` - -Instead, to compile jq to WebAssembly, we'll leverage Emscripten's drop-in replacements for the configure and make build tools (note the differences here from the previous entry: **emconfigure** and **emmake** in the Run and Build statements, respectively): - - -``` -# Fetch jq dependencies -git submodule update --init - -# Generate ./configure file -autoreconf -fi - -# Run ./configure -emconfigure ./configure \ -\--with-oniguruma=builtin \ -\--disable-maintainer-mode - -# Build jq executable -emmake make LDFLAGS=-all-static -``` - -If you type the commands above inside the Wasm container we created earlier, you'll notice that emconfigure and emmake will make sure jq is compiled using emcc instead of gcc (Emscripten also has a g++ replacement called em++). - -So far, this was surprisingly easy: we just prepended a handful of commands with Emscripten tools and ported a codebase—comprising tens of thousands of lines—from C to WebAssembly. Note that it won't always be this easy, especially for more complex codebases and graphical applications, but that's for [another article][10]. - -Another advantage of Emscripten is that it can generate some JavaScript glue code for us that handles initializing the WebAssembly module, calling C functions from JavaScript, and even providing a [virtual filesystem][11]. - -Let's generate that glue code from the executable file jq that emmake outputs: - - -``` -# But first, rename the jq executable to a .o file; otherwise, -# emcc complains that the "file has an unknown suffix" -mv jq jq.o - -# Generate .js and .wasm files from jq.o -# Disable errors on undefined symbols to avoid warnings about llvm_fma_f64 -emcc jq.o -o jq.js \ --s ERROR_ON_UNDEFINED_SYMBOLS=0 -``` - -To make sure it works, let's try an example from the [jq tutorial][12] directly on the command line: - - -``` -# Output the description of the latest commit on the jq repo -$ curl -s "" | \ -node jq.js '.[0].commit.message' -"Restore cfunction arity in builtins/0\n\nCount arguments up-front at definition/invocation instead of doing it at\nbind time, which comes after generating builtins/0 since e843a4f" -``` - -And just like that, we are now ready to run jq in the browser! - -### The result - -Using the output of emcc above, we can put together a user interface that calls jq on a JSON blob the user provides. This is the approach I took to build [jqkungfu][13] (source code [available on GitHub][14]): - -![jqkungfu screenshot][15] - -jqkungfu, a playground built by compiling jq to WebAssembly - -Although there are similar web apps that let you execute arbitrary jq queries in the browser, they are generally implemented as server-side applications that execute user queries in a sandbox (option #1 above). - -Instead, by compiling jq from C to WebAssembly, we get the best of both worlds: the flexibility of the server and the security of the browser. Specifically, the benefits are: - - 1. **Flexibility** : Users can "choose their own adventure" and use the app with fewer limitations - 2. **Speed** : Once the Wasm module is loaded, executing queries is extremely fast because all the magic happens in the browser - 3. **Security** : No backend means we don't have to worry about our servers being compromised or used to mine Bitcoins - 4. **Convenience** : Since we don't need a backend, jqkungfu is simply hosted as static files on a cloud storage platform - - - -### Conclusion - -WebAssembly is a powerful tool for bringing existing command line utilities to the web. When included as part of a tutorial, such playgrounds can become powerful teaching tools. They can even allow your users to test-drive your tool before they bother installing it. - -If you want to dive further into WebAssembly and learn how to build applications like jqkungfu (or games like Pacman!), check out my book [_Level up with WebAssembly_][16]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/4/command-line-playgrounds-webassembly - -作者:[Robert Aboukhalil][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/robertaboukhalil -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_language_c.png?itok=mPwqDAD9 (Various programming languages in use) -[2]: https://webassembly.org/ -[3]: https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/ -[4]: http://www.continuation-labs.com/projects/d3wasm/ -[5]: https://hacks.mozilla.org/2019/03/iodide-an-experimental-tool-for-scientific-communicatiodide-for-scientific-communication-exploration-on-the-web/ -[6]: https://stedolan.github.io/jq/ -[7]: https://emscripten.org/ -[8]: https://emscripten.org/docs/getting_started/downloads.html -[9]: https://github.com/stedolan/jq/blob/9fa2e51099c55af56e3e541dc4b399f11de74abe/README.md -[10]: https://medium.com/@robaboukhalil/porting-games-to-the-web-with-webassembly-70d598e1a3ec?sk=20c835664031227eae5690b8a12514f0 -[11]: https://emscripten.org/docs/porting/files/file_systems_overview.html -[12]: https://stedolan.github.io/jq/tutorial/ -[13]: http://jqkungfu.com -[14]: https://github.com/robertaboukhalil/jqkungfu/ -[15]: https://opensource.com/sites/default/files/uploads/jqkungfu.gif (jqkungfu screenshot) -[16]: http://levelupwasm.com/ diff --git a/sources/tech/20190418 Simplifying organizational change- A guide for the perplexed.md b/sources/tech/20190418 Simplifying organizational change- A guide for the perplexed.md deleted file mode 100644 index e9fa0cb7fd..0000000000 --- a/sources/tech/20190418 Simplifying organizational change- A guide for the perplexed.md +++ /dev/null @@ -1,167 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Simplifying organizational change: A guide for the perplexed) -[#]: via: (https://opensource.com/open-organization/19/4/simplifying-change) -[#]: author: (Jen Kelchner https://opensource.com/users/jenkelchner) - -Simplifying organizational change: A guide for the perplexed -====== -Here's a 4-step, open process for making change easier—both for you and -your organization. -![][1] - -Most organizational leaders have encountered a certain paralysis around efforts to implement culture change—perhaps because of perceived difficulty or the time necessary for realizing our work. But change is only as difficult as we choose to make it. In order to lead successful change efforts, we must simplify our understanding and approach to change. - -Change isn't something rare. We live everyday life in a continuous state of change—from grappling with the speed of innovation to simply interacting with the environment around us. Quite simply, *change is how we process, disseminate, and adopt new information. *And whether you're leading a team or an organization—or are simply breathing—you'll benefit from a more focused, simplified approach to change. Here's a process that can save you time and reduce frustration. - -### Three interactions with change - -Everyone interacts with change in different ways. Those differences are based on who we are, our own unique experiences, and our core beliefs. In fact, [only 5% of decision making involves conscious processing][2]. Even when you don't _think_ you're making a decision, you are actually making a decision (that is, to not take action). - -So you see, two actors are at play in situations involving change. The first is the human decision maker. The second is the information _coming to_ the decision maker. Both are present in three sets of interactions at varying stages in the decision-making process. - -#### **Engaging change** - -First, we must understand that uncertainty is really the result of "new information" we must process. We must accept where we are, at that moment, while waiting for additional information. Engaging with change requires us to trust—at the very least, ourselves and our capacity to manage—as new information continues to arrive. Everyone will respond to new information differently, and those responses are based on multiple factors: general hardwiring, unconscious needs that need to be met to feel safe, and so on. How do you feel safe in periods of uncertainty? Are you routine driven? Do you need details or need to assess risk? Are you good with figuring it out on the fly? Or does safety feel like creating something brand new? - -#### **Navigating change** - -"Navigating" doesn't necessarily mean "going around" something safely. It's knowing how to "get through it." Navigating change truly requires "all hands on deck" in order to keep everything intact and moving forward as we encounter each oncoming wave of new information. Everyone around you has something to contribute to the process of navigation; leverage them for “smooth sailing." - -#### **Adopting change** - -Only a small set of members in your organization will be truly comfortable with adopting change. But that committed and confident minority can spread the fire of change and help you grow some innovative ideas within your organization. Consider taking advantage of what researchers call "[the pendulum effect][3]," which holds that a group as small as 5% of an organization's population can influence a crowd's direction (the other 95% will follow along without realizing it). Moreover, [scientists at Rensselaer Polytechnic Institute have found][4] that when just 10% of a population holds an unshakable belief, that belief will always be adopted by a majority. Findings from this cognitive study have implications for the spread of innovations and movements within a collective group of people. Opportunities for mass adoption are directly related to your influence with the external parties around you. - -Everyone interacts with change in different ways. Those differences are based on who we are, our own unique experiences, and our core beliefs. - -### A useful matrix to guide culture change - -So far, we've identified three "interactions" every person, team, or department will experience with change: "engaging," "navigating," and "adopting." When we examine the work of _implementing_ change in the broader context of an organization (any kind), we can also identify _three relationships_ that drive the success of each interaction: "people," "capacity," and "information." - -Here's a brief list of considerations you should make—at every moment and with every relationship—to help you build roadmaps thoughtfully. - -#### **Engaging—People** - -Organizational success comes from the overlap of awareness and action of the "I" and the "We." - - * _Individuals (I)_ are aware of and engage based on their [natural response strength][5]. - * _Teams (We)_ are aware of and balance their responsibilities based on the Individual strengths by initiative. - * _Leaders (I/We) l_ everage insight based on knowing their (I) and the collective (We). - - - -#### **Engaging—Capacity** - -"Capacity" applies to skills, processes, and culture that is clearly structured, documented, and accessible with your organization. It is the “space” within which you operate and achieve solutions. - - * _Current state_ awareness allows you to use what and who you have available and accessible through your known operational capacity. - * _Future state_ needs will show you what is required of you to learn, _or stretch_ , in order to bridge any gaps; essentially, you will design the recoding of your organization. - - - -#### **Engaging—Information** - - * _Access to information_ is readily available to all based on appropriate needs within protocols. - * _Communication flows_ easily and is reciprocated at all levels. - * _Communication flow_ is timely and transparent. - - - -#### **Navigating—People** - - * Balance responses from both individuals and the collective will impact your outcomes. - * Balance the _I_ with the _We_. This allows for responses to co-exist in a seamless, collaborative way—which fuels every project. - - - -#### **Navigating—Capacity** - - * _Skills_ : Assuring a continuous state of assessment and learning through various modalities allows you to navigate with ease as each person graduates their understanding in preparation for the next iteration of change. - * _Culture:_ Be clear on goals and mission with a supported ecosystem in which your teams can operate by contributing their best efforts when working together. - * _Processes:_ Review existing processes and let go of anything that prevents you from evolving. Open practices and methodologies do allow for a higher rate of adaptability and decision making. - * _Utilize Talent:_ Discover who is already in your organization and how you can leverage their talent in new ways. Go beyond your known teams and seek out sources of new perspectives. - - - -#### **Navigating—Information** - - * Be clear on your mission. - * Be very clear on your desired endgame so everyone knows what you are navigating toward (without clearly defined and posted directions, it's easy to waste time, money and efforts resulting in missed targets). - - - -#### **Adopting—People** - - * _Behaviors_ have a critical impact on influence and adoption. - * For _internal adoption_ , consider the [pendulum of thought][3] swung by the committed few. - - - -#### **Adopting—Capacity** - - * _Sustainability:_ Leverage people who are more routine and legacy-oriented to help stabilize and embed your new initiatives. - * Allows your innovators and co-creators to move into the next phase of development and begin solving problems while other team members can perform follow-through efforts. - - - -#### **Adopting—Information** - - * Be open and transparent with your external communication. - * Lead the way in _what_ you do and _how_ you do it to create a tidal wave of change. - * Remember that mass adoption has a tipping point of 10%. - - - -[**Download a one-page guide to this model on GitHub.**][6] ---- - -### Four steps to simplify change - -You now understand what change is and how you are processing it. You've seen how you and your organization can reframe various interactions with it. Now, let's examine the four steps to simplify how you interact with and implement change as an individual, team leader, or organizational executive. - -#### **1\. Understand change** - -Change is receiving and processing new information and determining how to respond and participate with it (think personal or organizational operating system). Change is a _reciprocal_ action between yourself and incoming new information (think system interface). Change is an evolutionary process that happens in layers and stages in a continuous cycle (think data processing, bug fixes, and program iterations). - -#### **2\. Know your people** - -Change is personal and responses vary by context. People's responses to change are not indicators of the speed of adoption. Knowing how your people and your teams interact with change allows you to balance and optimize your efforts to solving problems, building solutions and sustaining implementations. Are they change makers, fast followers, innovators, stabilizers? When you know how you, _or others_ , process change, you can leverage your risk mitigators to sweep for potential pitfalls; and, your routine minded folks to be responsible for implementation follow through. - -Only a small set of members in your organization will be truly comfortable with adopting change. But that committed and confident minority can spread the fire of change and help you grow some innovative ideas within your organization. - -#### **3\. Know your capacity** - -Your capacity to implement widespread change will depend on your culture, your processes, and decision-making models. Get familiar with your operational capacity and guardrails (process and policy). - -#### **4\. Prepare for Interaction** - -Each interaction uses your people, capacity (operational), and information flow. Working with the stages of change is not always a linear process and may overlap at certain points along the way. Understand that [_people_ feed all engagement, navigation, and adoption actions][7]. - -Humans are built for adaptation to our environments. Yes, any kind of change can be scary at first. But it need not involve some major new implementation with a large, looming deadline that throws you off. Knowing that you can take a simplified approach to change, hopefully, you're able to engage new information with ease. Using this approach over time—and integrating it as habit—allows for both the _I_ and the _We_ to experience continuous cycles of change without the tensions of old. - -_Want to learn more about simplifying change?[View additional resources on GitHub][8]._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/4/simplifying-change - -作者:[Jen Kelchner][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jenkelchner -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/GOV_2dot0.png?itok=bKJ41T85 -[2]: http://www.simplifyinginterfaces.com/2008/08/01/95-percent-of-brain-activity-is-beyond-our-conscious-awareness/ -[3]: http://www.leeds.ac.uk/news/article/397/sheep_in_human_clothing__scientists_reveal_our_flock_mentality -[4]: https://news.rpi.edu/luwakkey/2902 -[5]: https://opensource.com/open-organization/18/7/transformation-beyond-digital-2 -[6]: https://github.com/jenkelchner/simplifying-change/blob/master/Visual_%20Simplifying%20Change%20(1).pdf -[7]: https://opensource.com/open-organization/17/7/digital-transformation-people-1 -[8]: https://github.com/jenkelchner/simplifying-change diff --git a/sources/tech/20190422 Strawberry- A Fork of Clementine Music Player.md b/sources/tech/20190422 Strawberry- A Fork of Clementine Music Player.md deleted file mode 100644 index 66b0345586..0000000000 --- a/sources/tech/20190422 Strawberry- A Fork of Clementine Music Player.md +++ /dev/null @@ -1,132 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Strawberry: A Fork of Clementine Music Player) -[#]: via: (https://itsfoss.com/strawberry-music-player/) -[#]: author: (John Paul https://itsfoss.com/author/john/) - -Strawberry: A Fork of Clementine Music Player -====== - -In this age of streaming music and cloud services, there are still people who need an application to collect and play their music. If you are such a person, this article should interest you. - -We have earlier covered [Sayonara music player][1]. Today, we will be taking a look at the Strawberry Music Player. - -### Strawberry Music Player: A fork of Clementine - -The [Strawberry Music Player][2] is, quite simply, an application to manage and play your music. - -![Strawberry media library][3] - -Strawberry contains the following list of features: - - * Play and organize music - * Supports WAV, FLAC, WavPack, DSF, DSDIFF, Ogg Vorbis, Speex, MPC, TrueAudio, AIFF, MP4, MP3, ASF and Monkey’s Audio Audio CD playback - * Native desktop notifications - * Support for playlists in multiple formats - * Advanced audio output and device configuration for bit-perfect playback on Linux - * Edit tags on music files - * Fetch tags from [MusicBrainz Picard][4] - * Album cover art from [Last.fm][5], MusicBrainz and Discogs - * Song lyrics from [AudD][6] - * Support for multiple backends - * Audio analyzer - * Audio equalizer - * Transfer music to iPod, iPhone, MTP or mass-storage USB player - * Streaming support for Tidal - * Scrobbler with support for Last.fm, Libre.fm and ListenBrainz - - - -If you take a look at the screenshots, they probably look familiar. That is because Strawberry is a fork of the [Clementine Music Player][7]. Clementine has not been updated since 2016, while the most recent version of Strawberry (0.5.3) was released early April 2019. - -Trivia - -You might think that Strawberry music player is named after the fruit. However, its [creator][8] claims that he has named the project after the band [Strawbs][9]. - -### Installing Strawberry Music player - -Now let’s take a look at how you can install Strawberry on your system. - -#### Ubuntu - -The easiest way to install Strawberry on Ubuntu is to install the [official snap][10]. Just type: - -``` -sudo snap install strawberry -``` - -If you are not a fan of snaps, you can download a .deb file from Strawberry’s GitHub [release page][11]. You can [install the .deb file][12] by double-clicking it and opening it via the Software Center. - -Strawberry is not available in the main [Ubuntu repositories][13]. - -#### Fedora - -Installing Strawberry on Fedora is much simpler. Strawberry is in the Fedora repos, so you just have to type `sudo dnf strawberry`. Strawberry is not available on Flatpak. - -#### Arch - -Just like Fedora, Strawberry is in the Arch repos. All you have to type is `sudo pacman -S strawberry`. The same is true for Manjaro. - -You can find a list of Linux distros that have Strawberry in their repos [here][14]. If you have openSUSE or Mageia, click [here][15]. You can also compile Strawberry from source. - -### Experience with Strawberry Music Player - -![Playing an audio book with Strawberry][16] - -I installed Strawberry on Fedora and Windows. I have used Clementine in the past, so I knew what to expect. I downloaded a number of audiobooks and several [Old Time Radio][17] [shows][18] as I don’t listen to a lot of music. Instead of using a dedicated [audiobook player like Cozy][19], I used Strawberry for listening to these radio shows. - -Once I told Strawberry where my files were located, it quickly imported them. I used [EasyTag][20] to fix some of the MP3 information on the old time radio shows. Strawberry has a tag editor, but EasyTag allows you to edit several folders very quickly. Strawberry undated the media library instantaneously. - -The big plus for me was performance. It loaded quickly and ran well. This might have something to do with the fact that it is not another Electron app. Strawberry is written in good-old-fashioned C++ and Qt 5. No need to load a whole web browser every time you want to play music, or in my case listen to audio dramas. - -I was not able to test the Tidal streaming feature because I don’t have an account. Also, I don’t sync music to my iPod. - -### Final Thoughts - -Strawberry is like a standard music player that makes managing and playing your audio library very easy. - -The features that I miss from Clementine include the option to access your media from cloud storage systems (like Box and Dropbox) and the ability to download podcasts. But then, I don’t store my media in the cloud and I mainly listen to podcasts on my iPod. - -I recommend giving Strawberry a try. You just might like it as much as I do. - -Have you ever used Strawberry? What is your favorite music player/manager? Please let us know in the comments below. - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][21]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/strawberry-music-player/ - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/john/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/sayonara-music-player/ -[2]: https://strawbs.org/ -[3]: https://itsfoss.com/wp-content/uploads/2019/04/strawberry1-800x471.png -[4]: https://itsfoss.com/musicbrainz-picard/ -[5]: https://www.last.fm/ -[6]: https://audd.io/ -[7]: https://www.clementine-player.org/ -[8]: https://github.com/jonaski -[9]: https://en.wikipedia.org/wiki/Strawbs -[10]: https://snapcraft.io/strawberry -[11]: https://github.com/jonaski/strawberry/releases -[12]: https://itsfoss.com/install-deb-files-ubuntu/ -[13]: https://itsfoss.com/ubuntu-repositories/ -[14]: https://repology.org/project/strawberry/versions -[15]: https://download.opensuse.org/repositories/home:/jonaski:/audio/ -[16]: https://itsfoss.com/wp-content/uploads/2019/04/strawberry3-800x471.png -[17]: https://en.wikipedia.org/wiki/Golden_Age_of_Radio -[18]: https://zootradio.com/ -[19]: https://itsfoss.com/cozy-audiobook-player/ -[20]: https://wiki.gnome.org/Apps/EasyTAG -[21]: http://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20190425 Debian has a New Project Leader.md b/sources/tech/20190425 Debian has a New Project Leader.md deleted file mode 100644 index 00f114b907..0000000000 --- a/sources/tech/20190425 Debian has a New Project Leader.md +++ /dev/null @@ -1,106 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Debian has a New Project Leader) -[#]: via: (https://itsfoss.com/debian-project-leader-election/) -[#]: author: (Shirish https://itsfoss.com/author/shirish/) - -Debian has a New Project Leader -====== - -Like each year, the Debian Secretary announced a call for nominations for the post of Debian Project Leader (commonly known as DPL) in early March. Soon 5 candidates shared their nomination. One of the DPL candidates backed out due to personal reasons and we had [four candidates][1] as can be seen in the Nomination section of the Vote page. - -### Sam Hartman, the new Debian Project Leader - -![][2] - -While I will not go much into details as Sam already outlined his position on his [platform][3], it is good to see that most Debian developers recognize that it’s no longer just the technical excellence which need to be looked at. I do hope he is able to create more teams which would leave some more time in DPL’s hands and less stress going forward. - -As he has shared, he would be looking into also helping the other DPL candidates, all of which presented initiatives to make Debian better. - -Apart from this, there had been some excellent suggestions, for example modernizing debian-installer, making lists.debian.org have a [Mailman 3][4] instance, modernizing Debian packaging and many more. - -While probably a year is too short a time for any of the deliverables that Debian people are thinking, some sort of push or start should enable Debian to reach greater heights than today. - -### A brief history of DPL elections - -In the beginning, Debian was similar to many distributions which have a [BDFL][5], although from the very start Debian had a sort of rolling leadership. While I wouldn’t go through the whole history, from October 1998 there was an idea [germinated][6] to have a Debian Constitution. - -After quite a bit of discussion between Debian users, contributors, developers etc. [Debian 1.0 Constitution][7] was released on December 2nd, 1998. One of the big changes was that it formalised the selection of Debian Project Leader via elections. - -From 1998 till 2019 13 Debian project leaders have been elected till date with Sam Hartman being the latest (2019). - -Before Sam, [Chris Lamb][8] was DPL in 2017 and again stood up for re-election in 2018. One of the biggest changes in Chris’s tenure was having more impetus to outreach than ever before. This made it possible to have many more mini-debconfs all around the world and thus increasing more number of Debian users and potential Debian Developers. - -[][9] - -Suggested read SemiCode OS: A Linux Distribution For Programmers And Web Developers - -### Duties and Responsibilities of the Debian Project Leader - -![][10] - -Debian Project Leader (DPL) is a non-monetary position which means that the DPL doesn’t get a salary or any monetary benefits in the traditional sense but it’s a prestigious position. - -Curious what what a DPL does? Here are some of the duties, responsibilities, prestige and perks associated with this position. - -#### Travelling - -As the DPL is the public face of the project, she/he is supposed to travel to many places in the world to share about Debian. While the travel may be a perk, it is and could be discounted by being not paid for the time spent articulating Debian’s position in various free software and other communities. Also travel, language, politics of free software are also some of the stress points that any DPL would have to go through. - -#### Communication - -A DPL is expected to have excellent verbal and non-verbal communication skills as she/he is the expected to share Debian’s vision of computing to technical and non-technical people. As she/he is also expected to weigh in many a sensitive matter, the Project Leader has to make choices about which communications should be made public and which should be private. - -#### Budgeting - -Quite a bit of the time the Debian Project Leader has to look into the finances along with the Secretary and take a call at various initiatives mooted by the larger community. The Project Leader has to ask and then make informed decisions on the same. - -#### Delegation - -One of the important tasks of the DPL is to delegate different tasks to suitable people. Some sensitive delegations include ftp-master, ftp-assistant, list-managers, debian-mirror, debian-infrastructure and so on. - -#### Influence - -Last but not the least, just like any other election, the people who contest for DPL have a platform where they share their ideas about where they would like to see the Debian project heading and how they would go about doing it. - -This is by no means an exhaustive list. I would suggest to read Lucas Nussbaum’s [mail][11] in which he outlines some more responsibilities as a Debian Project Leader. - -[][12] - -Suggested read Lightweight Linux Distribution Bodhi Linux 5.0 Released - -**In the end…** - -I wish Sam Hartman all the luck. I look forward to see how Debian grows under his leadership. - -I also hope that you learned a few non-technical thing around Debian. If you are an [ardent Debian user][13], stuff like this make you feel more involved with Debian project. What do you say? - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/debian-project-leader-election/ - -作者:[Shirish][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/shirish/ -[b]: https://github.com/lujun9972 -[1]: https://www.debian.org/vote/2019/vote_001 -[2]: https://itsfoss.com/wp-content/uploads/2019/04/Debian-Project-Leader-election-800x450.png -[3]: https://www.debian.org/vote/2019/platforms/hartmans -[4]: http://docs.mailman3.org/en/latest/ -[5]: https://en.wikipedia.org/wiki/Benevolent_dictator_for_life -[6]: https://lists.debian.org/debian-devel/1998/09/msg00506.html -[7]: https://www.debian.org/devel/constitution.1.0 -[8]: https://www.debian.org/vote/2017/platforms/lamby -[9]: https://itsfoss.com/semicode-os-linux/ -[10]: https://itsfoss.com/wp-content/uploads/2019/04/leadership-800x450.jpg -[11]: https://lists.debian.org/debian-vote/2019/03/msg00023.html -[12]: https://itsfoss.com/bodhi-linux-5/ -[13]: https://itsfoss.com/reasons-why-i-love-debian/ diff --git a/sources/tech/20190426 NomadBSD, a BSD for the Road.md b/sources/tech/20190426 NomadBSD, a BSD for the Road.md deleted file mode 100644 index d31f9b4a90..0000000000 --- a/sources/tech/20190426 NomadBSD, a BSD for the Road.md +++ /dev/null @@ -1,125 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (NomadBSD, a BSD for the Road) -[#]: via: (https://itsfoss.com/nomadbsd/) -[#]: author: (John Paul https://itsfoss.com/author/john/) - -NomadBSD, a BSD for the Road -====== - -As regular It’s FOSS readers should know, I like diving into the world of BSDs. Recently, I came across an interesting BSD that is designed to live on a thumb drive. Let’s take a look at NomadBSD. - -### What is NomadBSD? - -![Nomadbsd Desktop][1] - -[NomadBSD][2] is different than most available BSDs. NomadBSD is a live system based on FreeBSD. It comes with automatic hardware detection and an initial config tool. NomadBSD is designed to “be used as a desktop system that works out of the box, but can also be used for data recovery, for educational purposes, or to test FreeBSD’s hardware compatibility.” - -This German BSD comes with an [OpenBox][3]-based desktop with the Plank application dock. NomadBSD makes use of the [DSB project][4]. DSB stands for “Desktop Suite (for) (Free)BSD” and consists of a collection of programs designed to create a simple and working environment without needing a ton of dependencies to use one tool. DSB is created by [Marcel Kaiser][5] one of the lead devs of NomadBSD. - -Just like the original BSD projects, you can contact the NomadBSD developers via a [mailing list][6]. - -[][7] - -Suggested read Enjoy Netflix? You Should Thank FreeBSD - -#### Included Applications - -NomadBSD comes with the following software installed: - - * Thunar file manager - * Asunder CD ripper - * Bash 5.0 - * Filezilla FTP client - * Firefox web browser - * Fish Command line - * Gimp - * Qpdfview - * Git - - - * Hexchat IRC client - * Leafpad text editor - * Midnight Commander file manager - * PaleMoon web browser - * PCManFM file manager - * Pidgin messaging client - * Transmission BitTorrent client - - - * Redshift - * Sakura terminal emulator - * Slim login manager - * Thunderbird email client - * VLC media player - * Plank application dock - * Z Shell - - - -You can see a complete of the pre-installed applications in the [MANIFEST file][8]. - -![Nomadbsd Openbox Menu][9] - -#### Version 1.2 Released - -NomadBSD recently released version 1.2 on April 21, 2019. This means that NomadBSD is now based on FreeBSD 12.0-p3. TRIM is now enabled by default. One of the biggest changes is that the initial command-line setup was replaced with a Qt graphical interface. They also added a Qt5 tool to install NomadBSD to your hard drive. A number of fixes were included to improve graphics support. They also added support for creating 32-bit images. - -[][10] - -Suggested read 6 Reasons Why Linux Users Switch to BSD - -### Installing NomadBSD - -Since NomadBSD is designed to be a live system, we will need to add the BSD to a USB drive. First, you will need to [download it][11]. There are several options to choose from: 64-bit, 32-bit, or 64-bit Mac. - -You will be a USB drive that has at least 4GB. The system that you are installing to should have a 1.2 GHz processor and 1GB of RAM to run NomadBSD comfortably. Both BIOS and UEFI are supported. - -All of the images available for download are compressed as a `.lzma` file. So, once you have downloaded the file, you will need to extract the `.img` file. On Linux, you can use either of these commands: `lzma -d nomadbsd-x.y.z.img.lzma` or `xzcat nomadbsd-x.y.z.img.lzma`. (Be sure to replace x.y.z with the correct file name you just downloaded.) - -Before we proceed, we need to find out the id of your USB drive. (Hopefully, you have inserted it by now.) I use the `lsblk` command to find my USB drive, which in my case is `sdb`. To write the image file, use this command `sudo dd if=nomadbsd-x.y.z.img of=/dev/sdb bs=1M conv=sync`. (Again, don’t forget to correct the file name.) If you are uncomfortable using `dd`, you can use [Etcher][12]. If you have Windows, you will need to use [7-zip][13] to extract the image file and Etcher or [Rufus][14] to write the image to the USB drive. - -When you boot from the USB drive, you will encounter a simple config tool. Once you answer the required questions, you will be greeted with a simple Openbox desktop. - -### Thoughts on NomadBSD - -I first discovered NomadBSD back in January when they released 1.2-RC1. At the time, I had been unable to install [Project Trident][15] on my laptop and was very frustrated with BSDs. I downloaded NomadBSD and tried it out. I initially ran into issues reaching the desktop, but RC2 fixed that issue. However, I was unable to get on the internet, even though I had an Ethernet cable plugged in. Luckily, I found the wifi manager in the menu and was able to connect to my wifi. - -Overall, my experience with NomadBSD was pleasant. Once I figured out a few things, I was good to go. I hope that NomadBSD is the first of a new generation of BSDs that focus on mobility and ease of use. BSD has conquered the server world, it’s about time they figured out how to be more user-friendly. - -Have you ever used NomadBSD? What is your BSD? Please let us know in the comments below. - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][16]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/nomadbsd/ - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/john/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/wp-content/uploads/2019/04/NomadBSD-desktop-800x500.jpg -[2]: http://nomadbsd.org/ -[3]: http://openbox.org/wiki/Main_Page -[4]: https://freeshell.de/%7Emk/projects/dsb.html -[5]: https://github.com/mrclksr -[6]: http://nomadbsd.org/contact.html -[7]: https://itsfoss.com/netflix-freebsd-cdn/ -[8]: http://nomadbsd.org/download/nomadbsd-1.2.manifest -[9]: https://itsfoss.com/wp-content/uploads/2019/04/NomadBSD-Openbox-menu-800x500.jpg -[10]: https://itsfoss.com/why-use-bsd/ -[11]: http://nomadbsd.org/download.html -[12]: https://www.balena.io/etcher/ -[13]: https://www.7-zip.org/ -[14]: https://rufus.ie/ -[15]: https://itsfoss.com/project-trident-interview/ -[16]: http://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20190429 Awk utility in Fedora.md b/sources/tech/20190429 Awk utility in Fedora.md deleted file mode 100644 index 21e40641f7..0000000000 --- a/sources/tech/20190429 Awk utility in Fedora.md +++ /dev/null @@ -1,177 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Awk utility in Fedora) -[#]: via: (https://fedoramagazine.org/awk-utility-in-fedora/) -[#]: author: (Stephen Snow https://fedoramagazine.org/author/jakfrost/) - -Awk utility in Fedora -====== - -![][1] - -Fedora provides _awk_ as part of its default installation, including all its editions, including the immutable ones like Silverblue. But you may be asking, what is _awk_ and why would you need it? - -_Awk_ is a data driven programming language that acts when it matches a pattern. On Fedora, and most other distributions, GNU _awk_ or _gawk_ is used. Read on for more about this language and how to use it. - -### A brief history of awk - -_Awk_ began at Bell Labs in 1977. Its name is an acronym from the initials of the designers: Alfred V. Aho, Peter J. Weinberger, and Brian W. Kernighan. - -> The specification for _awk_ in the POSIX Command Language and Utilities standard further clarified the language. Both the _gawk_ designers and the original _awk_ designers at Bell Laboratories provided feedback for the POSIX specification. -> -> From [The GNU Awk User’s Guide][2] - -For a more in-depth look at how _awk/gawk_ ended up being as powerful and useful as it is, follow the link above. Numerous individuals have contributed to the current state of _gawk_. Among those are: - - * Arnold Robbins and David Trueman, the creators of _gawk_ - * Michael Brennan, the creator of _mawk_ , which later was merged with _gawk_ - * Jurgen Kahrs, who added networking capabilities to _gawk_ in 1997 - * John Hague, who rewrote the _gawk_ internals and added an _awk_ -level debugger in 2011 - - - -### Using awk - -The following sections show various ways of using _awk_ in Fedora. - -#### At the command line - -The simples way to invoke _awk_ is at the command line. You can search a text file for a particular pattern, and if found, print out the line(s) of the file that match the pattern anywhere. As an example, use _cat_ to take a look at the command history file in your home director: - -``` -$ cat ~/.bash_history -``` - -There are probably many lines scrolling by right now. - -_Awk_ helps with this type of file quite easily. Instead of printing the entire file out to the terminal like _cat_ , you can use _awk_ to find something of specific interest. For this example, type the following at the command line if you’re running a standard Fedora edition: - -``` -$ awk '/dnf/' ~/.bash_history -``` - -If you’re running Silverblue, try this instead: - -``` -$ awk '/rpm-ostree/' ~/.bash_history -``` - -In both cases, more data likely appears than what you really want. That’s no problem for _awk_ since it can accept regular expressions. Using the previous example, you can change the pattern to more closely match search requirements of wanting to know about installs only. Try changing the search pattern to one of these: - -``` -$ awk '/rpm-ostree install/' ~/.bash_history -$ awk '/dnf install/' ~/.bash_history -``` - -All the entries of your bash command line history appear that have the pattern specified at any position along the line. Awk works on one line of a data file at a time. It matches pattern, then performs an action, then moves to next line until the end of file (EOF) is reached. - -#### From an _awk_ program - -Using awk at the command line as above is not much different than piping output to _grep_ , like this: - -``` -$ cat .bash_history | grep 'dnf install' -``` - -The end result of printing to standard output ( _stdout_ ) is the same with both methods. - -Awk is a programming language, and the command _awk_ is an interpreter of that language. The real power and flexibility of _awk_ is you can make programs with it, and combine them with shell scripts to create even more powerful programs. For more feature rich development with _awk_ , you can also incorporate C or C++ code using [Dynamic-Extensions][3]. - -Next, to show the power of _awk_ , let’s make a couple of program files to print the header and draw five numbers for the first row of a bingo card. To do this we’ll create two awk program files. - -The first file prints out the header of the bingo card. For this example it is called _bingo-title.awk_. Use your favorite editor to save this text as that file name: -``` - -``` - -BEGIN { -print "B\tI\tN\tG\tO" -} -``` - -``` - -Now the title program is ready. You could try it out with this command: - -``` -$ awk -f bingo-title.awk -``` - -The program prints the word BINGO, with a tab space ( _\t_ ) between the characters. For the number selection, let’s use one of awk’s builtin numeric functions called _rand()_ and use two of the control statements, _for_ and _switch._ (Except the editor changed my program, so no switch statement used this time). - -The title of the second awk program is _bingo-num.awk_. Enter the following into your favorite editor and save with that file name: -``` - -``` - -@include "bingo-title.awk" -BEGIN { -for (i = 1; i < = 5; i++) { -b = int(rand() * 15) + (15*(i-1)) -printf "%s\t", b -} -print -} -``` - -``` - -The _@include_ statement in the file tells the interpreter to process the included file first. In this case the interpreter processs the _bingo-title.awk_ file so the title prints out first. - -#### Running the test program - -Now enter the command to pick a row of bingo numbers: - -``` -$ awk -f bingo-num.awk -``` - -Output appears similar to the following. Note that the _rand()_ function in _awk_ is not ideal for truly random numbers. It’s used here only as for example purposes. -``` - -``` - -$ awk -f bingo-num.awk -B I N G O -13 23 34 53 71 -``` - -``` - -In the example, we created two programs with only beginning sections that used actions to manipulate data generated from within the awk program. In order to satisfy the rules of Bingo, more work is needed to achieve the desirable results. The reader is encouraged to fix the programs so they can reliably pick bingo numbers, maybe look at the awk function _srand()_ for answers on how that could be done. - -### Final examples - -_Awk_ can be useful even for mundane daily search tasks that you encounter, like listing all _flatpak’s_ on the _Flathub_ repository from _org.gnome_ (providing you have the Flathub repository setup). The command to do that would be: - -``` -$ flatpak remote-ls flathub --system | awk /org.gnome/ -``` - -A listing appears that shows all output from _remote-ls_ that matches the _org.gnome_ pattern. To see flatpaks already installed from org.gnome, enter this command: - -``` -$ flatpak list --system | awk /org.gnome/ -``` - -Awk is a powerful and flexible programming language that fills a niche with text file manipulation exceedingly well. - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/awk-utility-in-fedora/ - -作者:[Stephen Snow][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/2019/04/awk-816x345.jpg -[2]: https://www.gnu.org/software/gawk/manual/gawk.html#Foreword3 -[3]: https://www.gnu.org/software/gawk/manual/gawk.html#Dynamic-Extensions diff --git a/sources/tech/20190501 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-1.md b/sources/tech/20190501 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-1.md deleted file mode 100644 index 27bf04eb05..0000000000 --- a/sources/tech/20190501 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-1.md +++ /dev/null @@ -1,247 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Monitor and Manage Docker Containers with Portainer.io (GUI tool) – Part-1) -[#]: via: (https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-part1/) -[#]: author: (Shashidhar Soppin https://www.linuxtechi.com/author/shashidhar/) - -Monitor and Manage Docker Containers with Portainer.io (GUI tool) – Part-1 -====== - -As **Docker** usage and adoption is growing faster and faster, monitoring **Docker container** images is becoming more challenging. As multiple Docker container images are getting created day-by-day, monitoring them is very important. There are already some in built tools and technologies, but configuring them is little complex. As micro-services based architecture is becoming the de-facto standard in coming days, learning such tool adds one more arsenal to your tool-set. - -Based on the above scenarios, there was in need of one light weight and robust tool requirement was growing. So Portainer.io addressed this. “ **Portainer.io** “,(Latest version is 1.20.2) the tool is very light weight(with 2-3 commands only one can configure it) and has become popular among Docker users. - -**This tool has advantages over other tools; some of these are as below** , - - * Light weight (requires only 2-3 commands to be required to run to install this tool) {Also installation image is only around 26-30MB of size) - * Robust and easy to use - * Can be used for Docker monitor and Build - * This tool provides us a detailed overview of your Docker environments - * This tool allows us to manage your containers, images, networks and volumes. - * Portainer is simple to deploy – this requires just one Docker command (can be run from anywhere.) - * Complete Docker-container environment can be monitored easily - - - -**Portainer is also equipped with** , - - * Community support - * Enterprise support - * Has professional services available(along with partner OEM services) - - - -**Functionality and features of Portainer tool are,** - - 1. It comes-up with nice Dashboard, easy to use and monitor. - 2. Many in-built templates for ease of operation and creation - 3. Support of services (OEM, Enterprise level) - 4. Monitoring of Containers, Images, Networks, Volume and configuration at almost real-time. - 5. Also includes Docker-Swarm monitoring - 6. User management with many fancy capabilities - - - -**Read Also :[How to Install Docker CE on Ubuntu 16.04 / 18.04 LTS System][1]** - -### How to install and configure Portainer.io on Ubuntu Linux / RHEL / CentOS - -**Note:** This installation is done on Ubuntu 18.04 but the installation on RHEL & CentOS would be same. We are assuming Docker CE is already installed on your system. - -``` -root@linuxtechi:~$ lsb_release -a -No LSB modules are available. -Distributor ID: Ubuntu -Description: Ubuntu 18.04 LTS -Release: 18.04 -Codename: bionic -root@linuxtechi:~$ -``` - -Create the Volume for portainer - -``` -root@linuxtechi:~$ sudo docker volume create portainer_data -portainer_data -root@linuxtechi:~$ -``` - -Launch and start Portainer Container using the beneath docker command, - -``` -root@linuxtechi:~$ sudo docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer -Unable to find image 'portainer/portainer:latest' locally -latest: Pulling from portainer/portainer -d1e017099d17: Pull complete -0b1e707a06d2: Pull complete -Digest: sha256:d6cc2c20c0af38d8d557ab994c419c799a10fe825e4aa57fea2e2e507a13747d -Status: Downloaded newer image for portainer/portainer:latest -35286de9f2e21d197309575bb52b5599fec24d4f373cc27210d98abc60244107 -root@linuxtechi:~$ -``` - -Once the complete installation is done, use the ip of host or Docker using port 9000 of the Docker engine where portainer is running using your browser. - -**Note:** If OS firewall is enabled on your Docker host then make sure 9000 port is allowed else its GUI will not come up. - -In my case, IP address of my Docker Host / Engine is “192.168.1.16” so URL will be, - - - -[![Portainer-Login-User-Name-Password][2]][3] - -Please make sure that you enter 8-character passwords. Let the admin be the user as it is and then click “Create user”. - -Now the following screen appears, in this select “Local” rectangle box. - -[![Connect-Portainer-Local-Docker][4]][5] - -Click on “Connect” - -Nice GUI with admin as user home screen appears as below, - -[![Portainer-io-Docker-Monitor-Dashboard][6]][7] - -Now Portainer is ready to launch and manage your Docker containers and it can also be used for containers monitoring. - -### Bring-up container image on Portainer tool - -[![Portainer-Endpoints][8]][9] - -Now check the present status, there are two container images are already running, if you create one more that appears instantly. - -From your command line kick-start one or two containers as below, - -``` -root@linuxtechi:~$ sudo docker run --name test -it debian -Unable to find image 'debian:latest' locally -latest: Pulling from library/debian -e79bb959ec00: Pull complete -Digest: sha256:724b0fbbda7fda6372ffed586670573c59e07a48c86d606bab05db118abe0ef5 -Status: Downloaded newer image for debian:latest -root@linuxtechi:/# -``` - -Now click Refresh button (Are you sure message appears, click “continue” on this) in Portainer GUI, you will now see 3 container images as highlighted below, - -[![Portainer-io-new-container-image][10]][11] - -Click on the “ **containers** ” (in which it is red circled above), next window appears with “ **Dashboard Endpoint summary** ” - -[![Portainer-io-Docker-Container-Dash][12]][13] - -In this page, click on “ **Containers** ” as highlighted in red color. Now you are ready to monitor your container image. - -### Simple Docker container image monitoring - -From the above step, it appears that a fancy and nice looking “Container List” page appears as below, - -[![Portainer-Container-List][14]][15] - -All the container images can be controlled from here (stop, start, etc) - -**1)** Now from this page, stop the earlier started {“test” container (this was the debian image that we started earlier)} - -To do this select the check box in front of this image and click stop button from above, - -[![Stop-Container-Portainer-io-dashboard][16]][17] - -From the command line option, you will see that this image has been stopped or exited now, - -``` -root@linuxtechi:~$ sudo docker container ls -a -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -d45902e717c0 debian "bash" 21 minutes ago Exited (0) 49 seconds ago test -08b96eddbae9 centos:7 "/bin/bash" About an hour ago Exited (137) 9 minutes ago mycontainer2 -35286de9f2e2 portainer/portainer "/portainer" 2 hours ago Up About an hour 0.0.0.0:9000->9000/tcp compassionate_benz -root@linuxtechi:~$ -``` - -**2)** Now start the stopped containers (test & mycontainer2) from Portainer GUI, - -Select the check box in front of stopped containers, and the click on Start - -[![Start-Containers-Portainer-GUI][18]][19] - -You will get a quick window saying, “ **Container successfully started** ” and with running state - -[![Conatiner-Started-successfully-Portainer-GUI][20]][21] - -### Various other options and features are explored as below step-by-step - -**1)** Click on “ **Images** ” which is highlighted, you will get the below window, - -[![Docker-Container-Images-Portainer-GUI][22]][23] - -This is the list of container images that are available but some may not running. These images can be imported, exported or uploaded to various locations, below screen shot shows the same, - -[![Upload-Docker-Container-Image-Portainer-GUI][24]][25] - -**2)** Click on “ **volumes”** which is highlighted, you will get the below window, - -[![Volume-list-Portainer-io-gui][26]][27] - -**3)** Volumes can be added easily with following option, click on add volume button, below window appears, - -Provide the name as “ **myvol** ” in the name box and click on “ **create the volume** ” button. - -[![Volume-Creation-Portainer-io-gui][28]][29] - -The newly created volume appears as below, (with unused state) - -[![Volume-unused-Portainer-io-gui][30]][31] - -#### Conclusion: - -As from the above installation steps, configuration and playing around with various options you can see how easy and fancy looking is Portainer.io tool is. This provides multiple features and options to explore on building, monitoring docker container. As explained this is very light weight tool, so doesn’t add any overload to host system. Next set-of options will be explored in part-2 of this series. - -Read Also: **[Monitor and Manage Docker Containers with Portainer.io (GUI tool) – Part-2][32]** - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-part1/ - -作者:[Shashidhar Soppin][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/shashidhar/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/how-to-setup-docker-on-ubuntu-server-16-04/ -[2]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Login-User-Name-Password-1024x681.jpg -[3]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Login-User-Name-Password.jpg -[4]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Connect-Portainer-Local-Docker-1024x538.jpg -[5]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Connect-Portainer-Local-Docker.jpg -[6]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-Docker-Monitor-Dashboard-1024x544.jpg -[7]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-Docker-Monitor-Dashboard.jpg -[8]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Endpoints-1024x252.jpg -[9]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Endpoints.jpg -[10]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-new-container-image-1024x544.jpg -[11]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-new-container-image.jpg -[12]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-Docker-Container-Dash-1024x544.jpg -[13]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-io-Docker-Container-Dash.jpg -[14]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Container-List-1024x538.jpg -[15]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-Container-List.jpg -[16]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Stop-Container-Portainer-io-dashboard-1024x447.jpg -[17]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Stop-Container-Portainer-io-dashboard.jpg -[18]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Start-Containers-Portainer-GUI-1024x449.jpg -[19]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Start-Containers-Portainer-GUI.jpg -[20]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Conatiner-Started-successfully-Portainer-GUI-1024x538.jpg -[21]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Conatiner-Started-successfully-Portainer-GUI.jpg -[22]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker-Container-Images-Portainer-GUI-1024x544.jpg -[23]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker-Container-Images-Portainer-GUI.jpg -[24]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Upload-Docker-Container-Image-Portainer-GUI-1024x544.jpg -[25]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Upload-Docker-Container-Image-Portainer-GUI.jpg -[26]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-list-Portainer-io-gui-1024x544.jpg -[27]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-list-Portainer-io-gui.jpg -[28]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-Creation-Portainer-io-gui-1024x544.jpg -[29]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-Creation-Portainer-io-gui.jpg -[30]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-unused-Portainer-io-gui-1024x544.jpg -[31]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Volume-unused-Portainer-io-gui.jpg -[32]: https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/ diff --git a/sources/tech/20190502 Crowdsourcing license compliance with ClearlyDefined.md b/sources/tech/20190502 Crowdsourcing license compliance with ClearlyDefined.md deleted file mode 100644 index fe36e37b9c..0000000000 --- a/sources/tech/20190502 Crowdsourcing license compliance with ClearlyDefined.md +++ /dev/null @@ -1,99 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Crowdsourcing license compliance with ClearlyDefined) -[#]: via: (https://opensource.com/article/19/5/license-compliance-clearlydefined) -[#]: author: (Jeff McAffer https://opensource.com/users/jeffmcaffer) - -Crowdsourcing license compliance with ClearlyDefined -====== -Licensing is what holds open source together, and ClearlyDefined takes -the mystery out of projects' licenses, copyright, and source location. -![][1] - -Open source use continues to skyrocket, not just in use cases and scenarios but also in volume. It is trivial for a developer to depend on a 1,000 JavaScript packages from a single run of `npm install` or have thousands of packages in a [Docker][2] image. At the same time, there is increased interest in ensuring license compliance. - -Without the right license you may not be able to legally use a software component in the way you intend or may have obligations that run counter to your business model. For instance, a JavaScript package could be marked as [MIT license][3], which allows commercial reuse, while one of its dependencies is licensed has a [copyleft license][4] that requires you give your software away under the same license. Complying means finding the applicable license(s), and assessing and adhering to the terms, which is not too bad for individual components adn can be daunting for large initiatives. - -Fortunately, this open source challenge has an open source solution: [ClearlyDefined][5]. ClearlyDefined is a crowdsourced, open source, [Open Source Initiative][6] (OSI) effort to gather, curate, and upstream/normalize data about open source components, such as license, copyright, and source location. This data is the cornerstone of reducing the friction in open source license compliance. - -The premise behind ClearlyDefined is simple: we are all struggling to find and understand key information related to the open source we use—whether it is finding the license, knowing who to attribute, or identifying the source that goes with a particular package. Rather than struggling independently, ClearlyDefined allows us to collaborate and share the compliance effort. Moreover, the ClearlyDefined community seeks to upstream any corrections so future releases are more clearly defined and make conventions more explicit to improve community understanding of project intent. - -### How it works - -![ClearlyDefined's harvest, curate, upstream process][7] - -ClearlyDefined monitors the open source ecosystem and automatically harvests relevant data from open source components using a host of open source tools such as [ScanCode][8], [FOSSology][9], and [Licensee][10]. The results are summarized and aggregated to create a _definition_ , which is then surfaced to users via an API and a UI. Each definition includes: - - * Declared license of the component - * Licenses and copyrights discovered across all files - * Exact source code location to the commit level - * Release date - * List of embedded components - - - -Coincidentally (well, not really), this is exactly the data you need to do license compliance. - -### Curating - -Any given definition may have gaps or imperfections due to tool issues or the data being missing or incorrect at the origin. ClearlyDefined enables users to curate the results by refining the values and filling in the gaps. These contributions are reviewed and merged, as with any open source project. The result is an improved dataset for all to use. - -### Getting ahead - -To a certain degree, this process is still chasing the problem—analyzing and curating after the packages have already been published. To get ahead of the game, the ClearlyDefined community also feeds merged curations back to the originating projects as pull requests (e.g., adding a license file, clarifying a copyright). This increases the clarity of future release and sets up a virtuous cycle. - -### Adapting, not mandating - -In doing the analysis, we've found quite a number of approaches to expressing license-related data. Different communities put LICENSE files in different places or have different practices around attribution. The ClearlyDefined philosophy is to discover these conventions and adapt to them rather than asking the communities to do something different. A side benefit of this is that implicit conventions can be made more explicit, improving clarity for all. - -Related to this, ClearlyDefined is careful to not look too hard for this interesting data. If we have to be too smart and infer too much to find the data, then there's a good chance the origin is not all that clear. Instead, we prefer to work with the community to better understand and clarify the conventions being used. From there, we can update the tools accordingly and make it easier to be "clearly defined." - -#### NOTICE files - -As an added bonus for users, we set up an API and UI for generating NOTICE files, making it trivial for you to comply with the attribution requirements found in most open source licenses. You can give ClearlyDefined a list of components (e.g., _drag and drop an npm package-lock.json file on the UI_ ) and get back a fully formed NOTICE file rendered by one of several renderers (e.g., text, HTML, Handlebars.js template). This is a snap, given that we already have all the compliance data. Big shout out to the [OSS Attribution Builder project][11] for making a simple and pluggable NOTICE renderer we could just pop into the ClearlyDefined service. - -### Getting involved - -You can get involved with ClearlyDefined in several ways: - - * Become an active user, contributing to your compliance workflow - * Review other people's curations using the interface - * Get involved in [the code][12] (Node and React) - * Ask and answer questions on [our mailing list][13] or [Discord channel][14] - * Contribute money to the OSI targeted to ClearlyDefined. We'll use that to fund development and curation. - - - -We are excited to continue to grow our community of contributors so that licensing can continue to become an understable part of any team's open source adoption. For more information, check out [https://clearlydefined.io][15]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/license-compliance-clearlydefined - -作者:[Jeff McAffer][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jeffmcaffer -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_Crowdfunding_520x292_9597717_0612CM.png?itok=lxSKyFXU -[2]: https://opensource.com/resources/what-docker -[3]: /article/19/4/history-mit-license -[4]: /resources/what-is-copyleft -[5]: https://clearlydefined.io -[6]: https://opensource.org -[7]: https://opensource.com/sites/default/files/uploads/clearlydefined.png (ClearlyDefined's harvest, curate, upstream process) -[8]: https://github.com/nexB/scancode-toolkit -[9]: https://www.fossology.org/ -[10]: https://github.com/licensee/licensee -[11]: https://github.com/amzn/oss-attribution-builder -[12]: https://github.com/clearlydefined -[13]: mailto:clearlydefined@googlegroups.com -[14]: %C2%A0https://clearlydefined.io/discord) -[15]: https://clearlydefined.io/ diff --git a/sources/tech/20190502 The making of the Breaking the Code electronic book.md b/sources/tech/20190502 The making of the Breaking the Code electronic book.md deleted file mode 100644 index 6786df8549..0000000000 --- a/sources/tech/20190502 The making of the Breaking the Code electronic book.md +++ /dev/null @@ -1,62 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The making of the Breaking the Code electronic book) -[#]: via: (https://opensource.com/article/19/5/code-book) -[#]: author: (Alicia Gibb https://opensource.com/users/aliciagibb/users/don-watkins) - -The making of the Breaking the Code electronic book -====== -Offering a safe space for middle school girls to learn technology speaks -volumes about who should be sitting around the tech table. -![Open hardware electronic book][1] - -I like a good challenge. The [Open Source Stories team][2] came to me with a great one: Create a hardware project where students could create their own thing that would be put together as a larger thing. The students would be middle school girls. My job was to figure out the hardware and make this thing make sense. - -After days of sketching out concepts, I was wandering through my local public library, and it dawned on me that the perfect piece of hardware where everyone could design their own part to create something whole is a book! The idea of a book using paper electronics was exciting, simple enough to be taught in a day, and fit the criteria of needing no special equipment, like soldering irons. - -!["Breaking the Code" book cover][3] - -I designed two parts to the electronics within the book. Half the circuits were developed with copper tape, LEDs, and DIY buttons, and half were developed with LilyPad Arduino microcontrollers, sensors, LEDs, and DIY buttons. Using the electronics in the book, the girls could make pages light up, buzz, or play music using various inputs such as button presses, page turns, or tilting the book. - -!['Breaking the Code' interior pages][4] - -We worked with young adult author [Lauren Sabel][5] to come up with the story, which features two girls who get locked in the basement of their school and have to solve puzzles to get out. Setting the scene in the basement gave us lots of opportunities to use lights! Along with the story, we received illustrations that the girls enhanced with electronics. The girls got creative, for example, using lights as the skeleton's eyes, not just for the obvious light bulb in the room. - -Creating a curriculum that was flexible enough to empower each girl to build her own successfully functioning circuit was a vital piece of the user experience. We chose components so the circuit wouldn't need to be over-engineered. We also used breakout boards and LEDs with built-in resistors so that the circuits allowed flexibility and functioned with only basic knowledge of circuit design—without getting too muddled in the deep end. - -!['Breaking the Code' interior pages][6] - -The project curriculum gave girls the confidence and skills to understand electronics by building two circuits, in the process learning circuit layout, directional aspects, cause-and-effect through inputs and outputs, and how to identify various components. Controlling electrons by pushing them through a circuit feels a bit like you're controlling a tiny part of the universe. And seeing the girls' faces light up is like seeing a universe of opportunities open in front of them. - -!['Breaking the Code' interior pages][7] - -The girls were ecstatic to see their work as a completed book, taking pride in their pages and showing others what they had built. - -![About 'Breaking the Code'][8] - -Teaching them my little corner of the world for the day was a truly empowering experience for me. As a woman in tech, I think this is the right approach for companies trying to change the gender inequalities we see in tech. Offering a safe space to learn—with lots of people in the room who look like you as mentors—speaks volumes about who should be sitting around the tech table. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/code-book - -作者:[Alicia Gibb][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/aliciagibb/users/don-watkins -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_book_electronics_hardware.jpg?itok=zb-zaiwz (Open hardware electronic book) -[2]: https://www.redhat.com/en/open-source-stories -[3]: https://opensource.com/sites/default/files/uploads/codebook_cover.jpg ("Breaking the Code" book cover) -[4]: https://opensource.com/sites/default/files/uploads/codebook_38-39.jpg ('Breaking the Code' interior pages) -[5]: https://www.amazon.com/Lauren-Sabel/e/B01M0FW223 -[6]: https://opensource.com/sites/default/files/uploads/codebook_lightbulb.jpg ('Breaking the Code' interior pages) -[7]: https://opensource.com/sites/default/files/uploads/codebook_10-11.jpg ('Breaking the Code' interior pages) -[8]: https://opensource.com/sites/default/files/uploads/codebook_pg1.jpg (About 'Breaking the Code') diff --git a/sources/tech/20190503 Mirror your System Drive using Software RAID.md b/sources/tech/20190503 Mirror your System Drive using Software RAID.md deleted file mode 100644 index ba62a2f21a..0000000000 --- a/sources/tech/20190503 Mirror your System Drive using Software RAID.md +++ /dev/null @@ -1,306 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Mirror your System Drive using Software RAID) -[#]: via: (https://fedoramagazine.org/mirror-your-system-drive-using-software-raid/) -[#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/) - -Mirror your System Drive using Software RAID -====== - -![][1] - -Nothing lasts forever. When it comes to the hardware in your PC, most of it can easily be replaced. There is, however, one special-case hardware component in your PC that is not as easy to replace as the rest — your hard disk drive. - -### Drive Mirroring - -Your hard drive stores your personal data. Some of your data can be backed up automatically by scheduled backup jobs. But those jobs scan the files to be backed up for changes and trying to scan an entire drive would be very resource intensive. Also, anything that you’ve changed since your last backup will be lost if your drive fails. [Drive mirroring][2] is a better way to maintain a secondary copy of your entire hard drive. With drive mirroring, a secondary copy of _all the data_ on your hard drive is maintained _in real time_. - -An added benefit of live mirroring your hard drive to a secondary hard drive is that it can [increase your computer’s performance][3]. Because disk I/O is one of your computer’s main performance [bottlenecks][4], the performance improvement can be quite significant. - -Note that a mirror is not a backup. It only protects your data from being lost if one of your physical drives fail. Types of failures that drive mirroring, by itself, does not protect against include: - - * [File System Corruption][5] - * [Bit Rot][6] - * Accidental File Deletion - * Simultaneous Failure of all Mirrored Drives (highly unlikely) - - - -Some of the above can be addressed by other file system features that can be used in conjunction with drive mirroring. File system features that address the above types of failures include: - - * Using a [Journaling][7] or [Log-Structured][8] file system - * Using [Checksums][9] ([ZFS][10] , for example, does this automatically and transparently) - * Using [Snapshots][11] - * Using [BCVs][12] - - - -This guide will demonstrate one method of mirroring your system drive using the Multiple Disk and Device Administration (mdadm) toolset. Just for fun, this guide will show how to do the conversion without using any extra boot media (CDs, USB drives, etc). For more about the concepts and terminology related to the multiple device driver, you can skim the _md_ man page: - -``` -$ man md -``` - -### The Procedure - - 1. **Use** [**sgdisk**][13] **to (re)partition the _extra_ drive that you have added to your computer** : - -``` - $ sudo -i -# MY_DISK_1=/dev/sdb -# sgdisk --zap-all $MY_DISK_1 -# test -d /sys/firmware/efi/efivars || sgdisk -n 0:0:+1MiB -t 0:ef02 -c 0:grub_1 $MY_DISK_1 -# sgdisk -n 0:0:+1GiB -t 0:ea00 -c 0:boot_1 $MY_DISK_1 -# sgdisk -n 0:0:+4GiB -t 0:fd00 -c 0:swap_1 $MY_DISK_1 -# sgdisk -n 0:0:0 -t 0:fd00 -c 0:root_1 $MY_DISK_1 -``` - -– If the drive that you will be using for the second half of the mirror in step 12 is smaller than this drive, then you will need to adjust down the size of the last partition so that the total size of all the partitions is not greater than the size of your second drive. -– A few of the commands in this guide are prefixed with a test for the existence of an _efivars_ directory. This is necessary because those commands are slightly different depending on whether your computer is BIOS-based or UEFI-based. - - 2. **Use** [**mdadm**][14] **to create RAID devices that use the new partitions to store their data** : - -``` - # mdadm --create /dev/md/boot --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/disk/by-partlabel/boot_1 missing -# mdadm --create /dev/md/swap --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/disk/by-partlabel/swap_1 missing -# mdadm --create /dev/md/root --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/disk/by-partlabel/root_1 missing - -# cat << END > /etc/mdadm.conf -MAILADDR root -AUTO +all -DEVICE partitions -END - -# mdadm --detail --scan >> /etc/mdadm.conf -``` - -– The _missing_ parameter tells mdadm to create an array with a missing member. You will add the other half of the mirror in step 14. -– You should configure [sendmail][15] so you will be notified if a drive fails. -– You can configure [Evolution][16] to [monitor a local mail spool][17]. - - 3. **Use** [**dracut**][18] **to update the initramfs** : - -``` -# dracut -f --add mdraid --add-drivers xfs -``` - -– Dracut will include the /etc/mdadm.conf file you created in the previous section in your initramfs _unless_ you build your initramfs with the _hostonly_ option set to _no_. If you build your initramfs with the hostonly option set to no, then you should either manually include the /etc/mdadm.conf file, manually specify the UUID’s of the RAID arrays to assemble at boot time with the _rd.md.uuid_ kernel parameter, or specify the _rd.auto_ kernel parameter to have all RAID arrays automatically assembled and started at boot time. This guide will demonstrate the _rd.auto_ option since it is the most generic. - - 4. **Format the RAID devices** : - -``` - # mkfs -t vfat /dev/md/boot -# mkswap /dev/md/swap -# mkfs -t xfs /dev/md/root -``` - -– The new [Boot Loader Specification][19] states “if the OS is installed on a disk with GPT disk label, and no ESP partition exists yet, a new suitably sized (let’s say 500MB) ESP should be created and should be used as $BOOT” and “$BOOT must be a VFAT (16 or 32) file system”. - - 5. **Reboot and set the _rd.auto_ , _rd.break_ and _single_ kernel parameters** : - -``` -# reboot -``` - -– You may need to [set your root password][20] before rebooting so that you can get into _single-user mode_ in step 7. -– See “[Making Temporary Changes to a GRUB 2 Menu][21]” for directions on how to set kernel parameters on compters that use the GRUB 2 boot loader. - - 6. **Use** [**the dracut shell**][18] **to copy the root file system** : - -``` - # mkdir /newroot -# mount /dev/md/root /newroot -# shopt -s dotglob -# cp -ax /sysroot/* /newroot -# rm -rf /newroot/boot/* -# umount /newroot -# exit -``` - -– The _dotglob_ flag is set for this bash session so that the [wildcard character][22] will match hidden files. -– Files are removed from the _boot_ directory because they will be copied to a separate partition in the next step. -– This copy operation is being done from the dracut shell to insure that no processes are accessing the files while they are being copied. - - 7. **Use _single-user mode_ to copy the non-root file systems** : - -``` - # mkdir /newroot -# mount /dev/md/root /newroot -# mount /dev/md/boot /newroot/boot -# shopt -s dotglob -# cp -Lr /boot/* /newroot/boot -# test -d /newroot/boot/efi/EFI && mv /newroot/boot/efi/EFI/* /newroot/boot/efi && rmdir /newroot/boot/efi/EFI -# test -d /sys/firmware/efi/efivars && ln -sfr /newroot/boot/efi/fedora/grub.cfg /newroot/etc/grub2-efi.cfg -# cp -ax /home/* /newroot/home -# exit -``` - -– It is OK to run these commands in the dracut shell shown in the previous section instead of doing it from single-user mode. I’ve demonstrated using single-user mode to avoid having to explain how to mount the non-root partitions from the dracut shell. -– The parameters being past to the _cp_ command for the _boot_ directory are a little different because the VFAT file system doesn’t support symbolic links or Unix-style file permissions. -– In rare cases, the _rd.auto_ parameter is known to cause LVM to fail to assemble due to a [race condition][23]. If you see errors about your _swap_ or _home_ partition failing to mount when entering single-user mode, simply try again by repeating step 5 but omiting the _rd.break_ paramenter so that you will go directly to single-user mode. - - 8. **Update _fstab_ on the new drive** : - -``` - # cat << END > /newroot/etc/fstab -/dev/md/root / xfs defaults 0 0 -/dev/md/boot /boot vfat defaults 0 0 -/dev/md/swap swap swap defaults 0 0 -END -``` - - 9. **Configure the boot loader on the new drive** : - -``` - # NEW_GRUB_CMDLINE_LINUX=$(cat /etc/default/grub | sed -n 's/^GRUB_CMDLINE_LINUX="\(.*\)"/\1/ p') -# NEW_GRUB_CMDLINE_LINUX=${NEW_GRUB_CMDLINE_LINUX//rd.lvm.*([^ ])} -# NEW_GRUB_CMDLINE_LINUX=${NEW_GRUB_CMDLINE_LINUX//resume=*([^ ])} -# NEW_GRUB_CMDLINE_LINUX+=" selinux=0 rd.auto" -# sed -i "/^GRUB_CMDLINE_LINUX=/s/=.*/=\"$NEW_GRUB_CMDLINE_LINUX\"/" /newroot/etc/default/grub -``` - -– You can re-enable selinux after this procedure is complete. But you will have to [relabel your file system][24] first. - - 10. **Install the boot loader on the new drive** : - -``` - # sed -i '/^GRUB_DISABLE_OS_PROBER=.*/d' /newroot/etc/default/grub -# echo "GRUB_DISABLE_OS_PROBER=true" >> /newroot/etc/default/grub -# MY_DISK_1=$(mdadm --detail /dev/md/boot | grep active | grep -m 1 -o "/dev/sd.") -# for i in dev dev/pts proc sys run; do mount -o bind /$i /newroot/$i; done -# chroot /newroot env MY_DISK_1=$MY_DISK_1 bash --login -# test -d /sys/firmware/efi/efivars || MY_GRUB_DIR=/boot/grub2 -# test -d /sys/firmware/efi/efivars && MY_GRUB_DIR=$(find /boot/efi -type d -name 'fedora' -print -quit) -# test -e /usr/sbin/grub2-switch-to-blscfg && grub2-switch-to-blscfg --grub-directory=$MY_GRUB_DIR -# grub2-mkconfig -o $MY_GRUB_DIR/grub.cfg \; -# test -d /sys/firmware/efi/efivars && test /boot/grub2/grubenv -nt $MY_GRUB_DIR/grubenv && cp /boot/grub2/grubenv $MY_GRUB_DIR/grubenv -# test -d /sys/firmware/efi/efivars || grub2-install "$MY_DISK_1" -# logout -# for i in run sys proc dev/pts dev; do umount /newroot/$i; done -# test -d /sys/firmware/efi/efivars && efibootmgr -c -d "$MY_DISK_1" -p 1 -l "$(find /newroot/boot -name shimx64.efi -printf '/%P\n' -quit | sed 's!/!\\!g')" -L "Fedora RAID Disk 1" -``` - -– The _grub2-switch-to-blscfg_ command is optional. It is only supported on Fedora 29+. -– The _cp_ command above should not be necessary, but there appears to be a bug in the current version of grub which causes it to write to $BOOT/grub2/grubenv instead of $BOOT/efi/fedora/grubenv on UEFI systems. -– You can use the following command to verify the contents of the _grub.cfg_ file right after running the _grub2-mkconfig_ command above: - -``` -# sed -n '/BEGIN .*10_linux/,/END .*10_linux/ p' $MY_GRUB_DIR/grub.cfg -``` - -– You should see references to _mdraid_ and _mduuid_ in the output from the above command if the RAID array was detected properly. - - 11. **Boot off of the new drive** : - -``` -# reboot -``` - -– How to select the new drive is system-dependent. It usually requires pressing one of the **F12** , **F10** , **Esc** or **Del** keys when you hear the [System OK BIOS beep code][25]. -– On UEFI systems the boot loader on the new drive should be labeled “Fedora RAID Disk 1”. - - 12. **Remove all the volume groups and partitions from your old drive** : - -``` - # MY_DISK_2=/dev/sda -# MY_VOLUMES=$(pvs | grep $MY_DISK_2 | awk '{print $2}' | tr "\n" " ") -# test -n "$MY_VOLUMES" && vgremove $MY_VOLUMES -# sgdisk --zap-all $MY_DISK_2 -``` - -– **WARNING** : You want to make certain that everything is working properly on your new drive before you do this. A good way to verify that your old drive is no longer being used is to try booting your computer once without the old drive connected. -– You can add another new drive to your computer instead of erasing your old one if you prefer. - - 13. **Create new partitions on your old drive to match the ones on your new drive** : - -``` - # test -d /sys/firmware/efi/efivars || sgdisk -n 0:0:+1MiB -t 0:ef02 -c 0:grub_2 $MY_DISK_2 -# sgdisk -n 0:0:+1GiB -t 0:ea00 -c 0:boot_2 $MY_DISK_2 -# sgdisk -n 0:0:+4GiB -t 0:fd00 -c 0:swap_2 $MY_DISK_2 -# sgdisk -n 0:0:0 -t 0:fd00 -c 0:root_2 $MY_DISK_2 -``` - -– It is important that the partitions match in size and type. I prefer to use the _parted_ command to display the partition table because it supports setting the display unit: - -``` - # parted /dev/sda unit MiB print -# parted /dev/sdb unit MiB print -``` - - 14. **Use mdadm to add the new partitions to the RAID devices** : - -``` - # mdadm --manage /dev/md/boot --add /dev/disk/by-partlabel/boot_2 -# mdadm --manage /dev/md/swap --add /dev/disk/by-partlabel/swap_2 -# mdadm --manage /dev/md/root --add /dev/disk/by-partlabel/root_2 -``` - - 15. **Install the boot loader on your old drive** : - -``` - # test -d /sys/firmware/efi/efivars || grub2-install "$MY_DISK_2" -# test -d /sys/firmware/efi/efivars && efibootmgr -c -d "$MY_DISK_2" -p 1 -l "$(find /boot -name shimx64.efi -printf "/%P\n" -quit | sed 's!/!\\!g')" -L "Fedora RAID Disk 2" -``` - - 16. **Use mdadm to test that email notifications are working** : - -``` -# mdadm --monitor --scan --oneshot --test -``` - - - - -As soon as your drives have finished synchronizing, you should be able to select either drive when restarting your computer and you will receive the same live-mirrored operating system. If either drive fails, mdmonitor will send an email notification. Recovering from a drive failure is now simply a matter of swapping out the bad drive with a new one and running a few _sgdisk_ and _mdadm_ commands to re-create the mirrors (steps 13 through 15). You will no longer have to worry about losing any data if a drive fails! - -### Video Demonstrations - -Converting a UEFI PC to RAID1 - -Converting a BIOS PC to RAID1 - - * TIP: Set the the quality to 720p on the above videos for best viewing. - - - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/mirror-your-system-drive-using-software-raid/ - -作者:[Gregory Bartholomew][a] -选题:[lujun9972][b] -译者:[lixin555](https://github.com/lixin555) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/glb/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/05/raid_mirroring-816x345.jpg -[2]: https://en.wikipedia.org/wiki/Disk_mirroring -[3]: https://en.wikipedia.org/wiki/Disk_mirroring#Additional_benefits -[4]: https://en.wikipedia.org/wiki/Bottleneck_(software) -[5]: https://en.wikipedia.org/wiki/Data_corruption -[6]: https://en.wikipedia.org/wiki/Data_degradation -[7]: https://en.wikipedia.org/wiki/Journaling_file_system -[8]: https://www.quora.com/What-is-the-difference-between-a-journaling-vs-a-log-structured-file-system -[9]: https://en.wikipedia.org/wiki/File_verification -[10]: https://en.wikipedia.org/wiki/ZFS#Summary_of_key_differentiating_features -[11]: https://en.wikipedia.org/wiki/Snapshot_(computer_storage)#File_systems -[12]: https://en.wikipedia.org/wiki/Business_continuance_volume -[13]: https://fedoramagazine.org/managing-partitions-with-sgdisk/ -[14]: https://fedoramagazine.org/managing-raid-arrays-with-mdadm/ -[15]: https://fedoraproject.org/wiki/QA:Testcase_Sendmail -[16]: https://en.wikipedia.org/wiki/Evolution_(software) -[17]: https://dotancohen.com/howto/root_email.html -[18]: https://fedoramagazine.org/initramfs-dracut-and-the-dracut-emergency-shell/ -[19]: https://systemd.io/BOOT_LOADER_SPECIFICATION#technical-details -[20]: https://docs.fedoraproject.org/en-US/Fedora/26/html/System_Administrators_Guide/sec-Changing_and_Resetting_the_Root_Password.html -[21]: https://docs.fedoraproject.org/en-US/fedora/rawhide/system-administrators-guide/kernel-module-driver-configuration/Working_with_the_GRUB_2_Boot_Loader/#sec-Making_Temporary_Changes_to_a_GRUB_2_Menu -[22]: https://en.wikipedia.org/wiki/Wildcard_character#File_and_directory_patterns -[23]: https://en.wikipedia.org/wiki/Race_condition -[24]: https://wiki.centos.org/HowTos/SELinux#head-867ca18a09f3103705cdb04b7d2581b69cd74c55 -[25]: https://en.wikipedia.org/wiki/Power-on_self-test#Original_IBM_POST_beep_codes diff --git a/sources/tech/20190503 SuiteCRM- An Open Source CRM Takes Aim At Salesforce.md b/sources/tech/20190503 SuiteCRM- An Open Source CRM Takes Aim At Salesforce.md deleted file mode 100644 index 63802d4976..0000000000 --- a/sources/tech/20190503 SuiteCRM- An Open Source CRM Takes Aim At Salesforce.md +++ /dev/null @@ -1,105 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (SuiteCRM: An Open Source CRM Takes Aim At Salesforce) -[#]: via: (https://itsfoss.com/suitecrm-ondemand/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -SuiteCRM: An Open Source CRM Takes Aim At Salesforce -====== - -SuiteCRM is one of the most popular open source CRM (Customer Relationship Management) software available. With its unique-priced managed CRM hosting service, SuiteCRM is aiming to challenge enterprise CRMs like Salesforce. - -### SuiteCRM: An Open Source CRM Software - -CRM stands for Customer Relationship Management. It is used by businesses to manage the interaction with customers, keep track of services, supplies and other things that help the business manage their customers. - -![][1] - -[SuiteCRM][2] came into existence after the hugely popular [SugarCRM][3] decided to stop developing its open source version. The open source version of SugarCRM was then forked into SuiteCRM by UK-based [SalesAgility][4] team. - -In just a couple of years, SuiteCRM became immensely popular and started to be considered the best open source CRM software out there. You can gauge its popularity from the fact that it’s nearing a million download and it has over 100,000 community members. There are around 4 million SuiteCRM users worldwide (a CRM software usually has more than one user) and it is available in several languages. It’s even used by National Health Service ([NHS][5]) in UK. - -Since SuiteCRM is a free and open source software, you are free to download it and deploy it on your cloud server such as [UpCloud][6] (we at It’s FOSS use it), [DigitalOcean][7], [AWS][8] or any Linux server of our own. - -But configuring the software, deploying it and managing it a tiresome job and requires certain skill level or a the services of a sysadmin. This is why business oriented open source software provide a hosted version of their software. - -This enables you to enjoy the open source software without the additional headache and the team behind the software has a way to generate revenue and continue the development of their software. - -### Suite:OnDemand – Cost effective managed hosting of SuiteCRM - -So, recently, [SalesAgility][4] – the creators/maintainers of SuiteCRM, decided to challenge [Salesforce][9] and other enterprise CRMs by introducing [Suite:OnDemand][10] , a hosted version of SuiteCRM. - -[][11] - -Suggested read Papyrus: An Open Source Note Manager - -Normally, you will observe pricing plans on the basis of number of users. But, with SuiteCRM’s OnDemand cloud hosting plans, they are trying to give businesses an affordable solution on a “per-server” basis instead of paying for every user you add. - -In other words, they want you to pay extra only for advanced features, not for more users. - -Here’s what SalesAgility mentioned in their [press release][12]: - -> Unlike Salesforce and other enterprise CRM vendors, the practice of pricing per user has been abandoned in favour of per-server hosting packages all of which will support unlimited users. In addition, there’s no increase in cost for access to advanced features. With Suite:OnDemand every feature and benefit is available with each hosting package. - -Of course, unlimited users does not mean that you will have to abuse the term. So, there’s a recommended number of users for every hosting plan you opt for. - -![Suitecrm Hosting][13] - -The CEO of SalesAgility also had to describe their goals for this step: - -“ _We want SuiteCRM to be available to all businesses and to all users within a business,_ ”said **Dale Murray CEO** of **SalesAgility**. - -In addition to that, they also mentioned that they want to revolutionize the way enterprise-class CRM is being currently offered in order to make it more accessible to businesses and organizations: - -> “Many organisations do not have the experience to run and support our product on-premise or it is not part of their technology strategy to do so. With Suite:OnDemand we are providing our customers with a quick and easy solution to access all the features of SuiteCRM without a per user cost. We’re also saying to Salesforce that enterprise-class CRM can be delivered, enhanced, maintained and supported without charging mouth-wateringly expensive monthly fees. Our aim is to transform the CRM market to enable users to make CRM pervasive within their organisations.” -> -> Dale Murray, CEO of SalesAgility - -### Why is this a big deal? - -This is a huge relief for small business owners and startups because other CRMs like Saleforce and SugarCRM charge $30-$40 per month per user. If you have 10 members in your team, this will increase the cost to $300-$400 per month. - -[][14] - -Suggested read Winds Beautifully Combines Feed Reader and Podcast Player in One Single App - -This is also a good news for the open source community that we will have an affordable alternative to Salesforce. - -In addition to this, SuiteCRM is fully open source meaning there are no license fees or vendor lock-in – as they mention. You are always free to use it on your own. - -It is interesting to see different strategies and solutions being applied for an open source CRM software to take an aim at Salesforce directly. - -What do you think? Let us know your thoughts in the comments below. - -_With inputs from Abhishek Prakash._ - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/suitecrm-ondemand/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/wp-content/uploads/2019/05/suite-crm-800x450.png -[2]: https://suitecrm.com/ -[3]: https://www.sugarcrm.com/ -[4]: https://salesagility.com/ -[5]: https://www.nhs.uk/ -[6]: https://www.upcloud.com/register/?promo=itsfoss -[7]: https://m.do.co/c/d58840562553 -[8]: https://aws.amazon.com/ -[9]: https://www.salesforce.com -[10]: https://suitecrm.com/suiteondemand/ -[11]: https://itsfoss.com/papyrus-open-source-note-manager/ -[12]: https://suitecrm.com/sod-pr/ -[13]: https://itsfoss.com/wp-content/uploads/2019/05/suitecrm-hosting-800x457.jpg -[14]: https://itsfoss.com/winds-podcast-feedreader/ diff --git a/sources/tech/20190503 Tutanota Launches New Encrypted Tool to Support Press Freedom.md b/sources/tech/20190503 Tutanota Launches New Encrypted Tool to Support Press Freedom.md deleted file mode 100644 index 692b4ecba8..0000000000 --- a/sources/tech/20190503 Tutanota Launches New Encrypted Tool to Support Press Freedom.md +++ /dev/null @@ -1,85 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Tutanota Launches New Encrypted Tool to Support Press Freedom) -[#]: via: (https://itsfoss.com/tutanota-secure-connect/) -[#]: author: (John Paul https://itsfoss.com/author/john/) - -Tutanota Launches New Encrypted Tool to Support Press Freedom -====== - -A secure email provider has announced the release of a new product designed to help whistleblowers get their information to the media. The tool is free for journalists. - -### Tutanota helps you protect your privacy - -![][1] - -[Tutanota][2] is a German-based company that provides “world’s most secure email service, easy to use and private by design.” They offer end-to-end encryption for their [secure email service][3]. Recently Tutanota announced a [desktop app for their email service][4]. - -They also make use of two-factor authentication and [open source the code][5] that they use. - -While you can get an account for free, you don’t have to worry about your information being sold or seeing ads. Tutanota makes money by charging for extra features and storage. They also offer solutions for non-profit organizations. - -Tutanota has launched a new service to further help journalists, social activists and whistleblowers in communicating securely. - -[][6] - -Suggested read Purism's New Offering is a Dream Come True for Privacy Concerned People - -### Secure Connect: An encrypted form for websites - -![][7] - -Tutanota has released a new piece of software named Secure Connect. Secure Connect is “an open source encrypted contact form for news sites”. The goal of the project is to create a way so that “whistleblowers can get in touch with journalists securely”. Tutanota picked the right day because May 3rd is the [Day of Press Freedom][8]. - -According to Tutanota, Secure Connect is designed to be easily added to websites, but can also work on any blog to ensure access by smaller news agencies. A whistleblower would access Secure Connect app on a news site, preferably using Tor, and type in any information that they want to bring to light. The whistleblower would also be able to upload files. Once they submit the information, Secure Connect will assign a random address and password, “which lets the whistleblower re-access his sent message at a later stage and check for replies from the news site.” - -![Secure Connect Encrypted Contact Form][9] - -While Tutanota will be offering Secure Connect to journalists for free, they know that someone will have to foot the bill. They plan to pay for further development of the project by selling it to businesses, such as “lawyers, financial institutions, medical institutions, educational institutions, and the authorities”. Non-journalists would have to pay €24 per month. - -You can see a demo of Secure Connect, by clicking [here][10]. If you are a journalist interested in adding Secure Connect to your website or blog, you can contact them at [[email protected]][11] Be sure to include a link to your website. - -[][12] - -Suggested read 8 Privacy Oriented Alternative Search Engines To Google in 2019 - -### Final Thoughts on Secure Connect - -I have read repeatedly about whistleblowers whose identities were accidentally exposed, either by themselves or others. Tutanota’s project looks like it would remove that possibility by making it impossible for others to discover their identity. It also gives both parties an easy way to exchange information without having to worry about encryption or PGP keys. - -I understand that it’s not the same as [Firefox Send][13], another encrypted file sharing program from Mozilla. The only question I have is whose servers will the whistleblowers’ information be sitting on? - -Do you think that Tutanota’s Secure Connect will be a boon for whistleblowers and activists? Please let us know in the comments below. - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][14]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/tutanota-secure-connect/ - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/john/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/wp-content/uploads/2018/02/tutanota-featured-800x450.png -[2]: https://tutanota.com/ -[3]: https://itsfoss.com/tutanota-review/ -[4]: https://itsfoss.com/tutanota-desktop/ -[5]: https://tutanota.com/blog/posts/open-source-email -[6]: https://itsfoss.com/librem-one/ -[7]: https://itsfoss.com/wp-content/uploads/2019/05/secure-communication.jpg -[8]: https://en.wikipedia.org/wiki/World_Press_Freedom_Day -[9]: https://itsfoss.com/wp-content/uploads/2019/05/secure-connect-encrypted-contact-form.png -[10]: https://secureconnect.tutao.de/contactform/demo -[11]: /cdn-cgi/l/email-protection -[12]: https://itsfoss.com/privacy-search-engines/ -[13]: https://itsfoss.com/firefox-send/ -[14]: http://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20190504 Fedora 30 Workstation Installation Guide with Screenshots.md b/sources/tech/20190504 Fedora 30 Workstation Installation Guide with Screenshots.md deleted file mode 100644 index 9e0ebd4381..0000000000 --- a/sources/tech/20190504 Fedora 30 Workstation Installation Guide with Screenshots.md +++ /dev/null @@ -1,207 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Fedora 30 Workstation Installation Guide with Screenshots) -[#]: via: (https://www.linuxtechi.com/fedora-30-workstation-installation-guide/) -[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) - -Fedora 30 Workstation Installation Guide with Screenshots -====== - -If you are a **Fedora distribution** lover and always try the things at Fedora Workstation and Servers, then it is good news for you as Fedora has released its latest OS edition as **Fedora 30** for the Workstation and Server. One of the important updates in Fedora 30 from its previous release is that it has introduced **Fedora CoreOS** as a replacement of Fedora Atomic host. - -Some other noticeable updates in Fedora 30 are listed beneath: - - * Updated Desktop Gnome 3.32 - * New Linux Kernel 5.0.9 - * Updated Bash Version 5.0, PHP 7.3 & GCC 9 - * Updated Python 3.7.3, JDK12, Ruby 2.6 Mesa 19.0.2 and Golang 1.12 - * Improved DNF (Default Package Manager) - - - -In this article we will walk through the Fedora 30 workstation Installation steps for laptop or desktop. - -**Following are the minimum system requirement for Fedora 30 workstation,** - - * 1GHz Processor (Recommended 2 GHz Dual Core processor) - * 2 GB RAM - * 15 GB unallocated Hard Disk - * Bootable Media (USB / DVD) - * nternet Connection (Optional) - - - -Let’s Jump into Installation steps, - -### Step:1) Download Fedora 30 Workstation ISO File - -Download the Fedora 30 Workstation ISO file on your system from its Official Web Site - - - -Once the ISO file is downloaded, then burn it either in USB drive or DVD and make it bootable. - -### Step:2) Boot Your Target System with Bootable media (USB Drive or DVD) - -Reboot your target machine (i.e. machine where you want to install Fedora 30), Set the boot medium as USB or DVD from Bios settings so system boots up with bootable media. - -### Step:3) Choose Start Fedora-Workstation-30 Live - -When the system boots up with bootable media then we will get the following screen, to begin with installation on your system’s hard disk, choose “ **Start Fedora-Workstation-30 Live** “, - - - -### Step:4) Select Install to Hard Drive Option - -Select “ **Install to Hard Drive** ” option to install Fedora 30 on your system’s hard disk, you can also try Fedora on your system without installing it, for that select “ **Try Fedora** ” Option - - - -### Step:5) Choose appropriate language for your Fedora 30 Installation - -In this step choose your language which will be used during Fedora 30 Installation, - - - -Click on Continue - -### Step:6) Choose Installation destination and partition Scheme - -In the next window we will be present the following screen, here we will choose our installation destination, means on which hard disk we will do installation - - - -In the next screen we will see the local available hard disk, select the disk that suits your installation and then choose how you want to create partitions on it from storage configuration tab. - -If you choose “ **Automatic** ” partition scheme, then installer will create the necessary partition for your system automatically but if you want to create your own customize partition scheme then choose “ **Custom** ” option, - - - -Click on Done - -In this article I will demonstrate how to create [**LVM**][1] based custom partitions, in my case I have around 40 GB unallocated hard drive, so I will be creating following partitions on it, - - * /boot = 2 GB (ext4 file system) - * /home = 15 GB (ext4 file system) - * /var = 10 GB (ext4 file system) - * / = 10 GB (ext4 file system) - * Swap = 2 GB - - - - - -Select “ **LVM** ” as partitioning scheme and then click on plus (+) symbol, - -Specify the mount point as /boot and partition size as 2 GB and then click on “Add mount point” - - - - - -Now create next partition as /home of size 15 GB, Click on + symbol - - - -Click on “ **Add mount point** ” - - - -If you might have noticed, /home partition is created as LVM partition under default Volume Group, if you wish to change default Volume Group name then click on “ **Modify** ” option from Volume Group Tab, - -Mention the Volume Group name you want to set and then click on Save. Now onward all the LVM partition will be part of fedora30 volume group. - - - -Similarly create the next two partitions **/var** and **/** of size 10 GB respectively, - -**/var partition:** - - - -**/ (slash) partition:** - - - -Now create the last partition as swap of size 2 GB, - - - -In the next window, click on Done - - - -In the next screen, choose “ **Accept Changes** ” - - - -Now we will get Installation Summary window, here you can also change the time zone that suits to your installation and then click on “ **Begin Installation** ” - - - -### Step:7) Fedora 30 Installation started - -In this step we can see Fedora 30 Installation has been started and it is in progress, - - - -Once the Installation is completed, you will be prompted to restart your system - - - -Click on Quit and reboot your system. - -Don’t forget the Change boot medium from Bios settings so your system boots up with hard disk. - -### Step:8) Welcome message and login Screen after reboot - -When we first time reboot Fedora 30 system after the successful installation, we will get below welcome screen, - - - -Click on Next - -In the next screen you can Sync your online accounts or else you can skip, - - - -In the next window you will be required to specify the local account (user name) and its password, later this account will be used to login to the system - - - - - -Click on Next - -And finally, we will get below screen which confirms that we are ready to use Fedora 30, - - - -Click on “ **Start Using Fedora** ” - - - -Above Gnome Desktop Screen confirms that we have successfully installed Fedora 30 Workstation, now explore it and have fun 😊 - -In Fedora 30 workstation, if you want to install any packages or software from command line use DNF command. - -Read More On: **[26 DNF Command Examples for Package Management in Fedora Linux][2]** - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/fedora-30-workstation-installation-guide/ - -作者:[Pradeep Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/pradeep/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/lvm-good-way-to-utilize-disks-space/ -[2]: https://www.linuxtechi.com/dnf-command-examples-rpm-management-fedora-linux/ diff --git a/sources/tech/20190504 May the fourth be with you- How Star Wars (and Star Trek) inspired real life tech.md b/sources/tech/20190504 May the fourth be with you- How Star Wars (and Star Trek) inspired real life tech.md deleted file mode 100644 index a05f9a6b4f..0000000000 --- a/sources/tech/20190504 May the fourth be with you- How Star Wars (and Star Trek) inspired real life tech.md +++ /dev/null @@ -1,93 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (May the fourth be with you: How Star Wars (and Star Trek) inspired real life tech) -[#]: via: (https://opensource.com/article/19/5/may-the-fourth-star-wars-trek) -[#]: author: (Jeff Macharyas https://opensource.com/users/jeffmacharyas) - -May the fourth be with you: How Star Wars (and Star Trek) inspired real life tech -====== -The technologies may have been fictional, but these two acclaimed sci-fi -series have inspired open source tech. -![Triangulum galaxy, NASA][1] - -Conventional wisdom says you can either be a fan of _Star Trek_ or of _Star Wars_ , but mixing the two is like mixing matter and anti-matter. I'm not sure that's true, but even if the laws of physics cannot be changed, these two acclaimed sci-fi series have influenced the open source universe and created their own open source multi-verses. - -For example, fans have used the original _Star Trek_ as "source code" to create fan-made films, cartoons, and games. One of the more notable fan creations was the web series _Star Trek Continues_ , which faithfully adapted Gene Roddenberry's universe and redistributed it to the world. - -"Eventually we realized that there is no more profound way in which people could express what _Star Trek_ has meant to them than by creating their own very personal _Star Trek_ things," [Roddenberry said][2]. However, due to copyright restrictions, this "open source" channel [has since been curtailed][3]. - -_Star Wars_ has a different approach to open sourcing its universe. [Jess Paguaga writes][4] on FanSided: "With a variety [of] fan film awards dating back to 2002, the _Star Wars_ brand has always supported and encouraged the creation of short films that help expand the universe of a galaxy far, far away." - -But, _Star Wars_ is not without its own copyright prime directives. In one case, a Darth Vader film by a YouTuber called Star Wars Theory has drawn a copyright claim from Disney. The claim does not stop production of the film, but diverts monetary gains from it, [reports James Richards][5] on FanSided. - -This could be one of the [Ferengi Rules of Acquisition][6], perhaps. - -But if you can't watch your favorite fan film, you can still get your [_Star Wars_ fix right in the Linux terminal][7] by entering: - - -``` -`telnet towel.blinkenlights.nl` -``` - -And _Star Trek_ fans can also interact with the Federation with the original text-based video game from 1971. While a high-school senior, Mike Mayfield ported the game from punch cards to HP BASIC. If you'd like to go old school and battle Klingons, the source code is available at the [Code Project][8]. - -### Real-life star tech - -Both _Star Wars_ and _Star Trek_ have inspired real-life technologies. Although those technologies were fictional, many have become the practical, open technology we use today. Some of them inspired technologies that are still in development now. - -In the early 1970s, Motorola engineer Martin Cooper was trying to beat AT&T at the car-phone game. He says he was watching Captain Kirk use a "communicator" on an episode of _Star Trek_ and had a eureka moment. His team went on to create the first portable cellular 800MHz phone prototype in 90 days. - -In _Star Wars_ , scout stormtroopers of the Galactic Empire rode the Aratech 74-Z Speeder Bike, and a real-life counterpart is the [Aero-X][9] being developed by California's Aerofex. - -Perhaps the most visible _Star Wars_ tech to enter our lives is droids. We first encountered R2-D2 back in the 1970s, but now we have droids vacuuming our carpets and mowing our lawns, from Roombas to the [Worx Landroid][10] lawnmower. - -And, in _Star Wars_ , Princess Leia appeared to Obi-Wan Kenobi as a hologram, and in Star Trek: Voyager, the ship's chief medical officer was an interactive hologram that could diagnose and treat patients. The technology to bring characters like these to "life" is still a ways off, but there are some interesting open source developments that hint of things to come. [OpenHolo][11], "an open source library containing algorithms and software implementations for holograms in various fields," is one such project. - -### Where's the beef? - -> "She handled… real meat… touched it, and cut it?" —Keiko O'Brien, Star Trek: The Next Generation - -In the _Star Trek_ universe, crew members get their meals by simply ordering a replicator to produce whatever food they desire. That could one day become a reality thanks to a concept created by two German students for an open source "meat-printer" they call the [Cultivator][12]. It would use bio-printing to produce something that appears to be meat; the user could even select its mineral and fat content. Perhaps with more collaboration and development, the Cultivator could become the replicator in tomorrow's kitchen! - -### The 501st - -Cosplayers, people from all walks of life who dress as their favorite characters, are the "open source embodiment" of their favorite universes. The [501st][13] [Legion][13] is an all-volunteer _Star Wars_ fan organization "formed for the express purpose of bringing together costume enthusiasts under a collective identity within which to operate," according to its charter. - -Jon Stallard, a member of Garrison Tyranus, the Central Virginia chapter of the 501st Legion says, "Everybody wanted to be something else when they were a kid, right? Whether it was Neil Armstrong, Batman, or the Six Million Dollar Man. Every backyard playdate was some kind of make-believe. The 501st lets us participate in our fan communities while contributing to the community at large." - -Are cosplayers really "open source characters"? Well, that depends. The copyright laws around cosplay and using unique props, costumes, and more are very complex, [writes Meredith Filak Rose][14] for _Public Knowledge_. "We're lucky to be living in a time where fandom generally enjoys a positive relationship with the creators whose work it admires," Rose concludes. - -So, it is safe to say that stormtroopers, Ferengi, Vulcans, and Yoda are all here to stay for a long, long time, near, and far, far away. - -Live long and prosper, you shall. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/may-the-fourth-star-wars-trek - -作者:[Jeff Macharyas ][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/triangulum_galaxy_nasa_stars.jpg?itok=NdS19A7m -[2]: https://fanlore.org/wiki/Gene_Roddenberry#His_Views_Regarding_Fanworks -[3]: https://trekmovie.com/2016/06/23/cbs-and-paramount-release-fan-film-guidelines/ -[4]: https://dorksideoftheforce.com/2019/01/17/star-wars-fan-films/ -[5]: https://dorksideoftheforce.com/2019/01/16/disney-claims-copyright-star-wars-theory/ -[6]: https://en.wikipedia.org/wiki/Rules_of_Acquisition -[7]: https://itsfoss.com/star-wars-linux/ -[8]: https://www.codeproject.com/Articles/28228/Star-Trek-1971-Text-Game -[9]: https://www.livescience.com/58943-real-life-star-wars-technology.html -[10]: https://www.digitaltrends.com/cool-tech/best-robot-lawnmowers/ -[11]: http://openholo.org/ -[12]: https://www.pastemagazine.com/articles/2016/05/the-future-is-vegan-according-to-star-trek.html -[13]: https://www.501st.com/ -[14]: https://www.publicknowledge.org/news-blog/blogs/copyright-and-cosplay-working-with-an-awkward-fit diff --git a/sources/tech/20190505 -Review- Void Linux, a Linux BSD Hybrid.md b/sources/tech/20190505 -Review- Void Linux, a Linux BSD Hybrid.md deleted file mode 100644 index cc8a660252..0000000000 --- a/sources/tech/20190505 -Review- Void Linux, a Linux BSD Hybrid.md +++ /dev/null @@ -1,136 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: ([Review] Void Linux, a Linux BSD Hybrid) -[#]: via: (https://itsfoss.com/void-linux/) -[#]: author: (John Paul https://itsfoss.com/author/john/) - -[Review] Void Linux, a Linux BSD Hybrid -====== - -There are distros that follow the crowd and there are others that try to make their own path through the tall weed. Today, we’ll be looking at a small distro that looks to challenge how a distro should work. We’ll be looking at Void Linux. - -### What is Void Linux? - -[Void Linux][1] is a “general purpose operating system, based on the monolithic Linux kernel. Its package system allows you to quickly install, update and remove software; software is provided in binary packages or can be built directly from sources with the help of the XBPS source packages collection.” - -![Void Linux Neofetch][2] - -Like Solus, Void Linux is written from scratch and does not depend on any other operating system. It is a rolling release. Unlike the majority of Linux distros, Void does not use [systemd][3]. Instead, it uses [runit][4]. Another thing that separates Void from the rest of Linux distros is the fact that they use LibreSSL instead of OpenSSL. Void also offers support for the [musl C library][5]. In fact, when you download a .iso file, you can choose between `glibc` and `musl`. - -The homegrown package manager that Void uses is named X Binary Package System (or xbps). According to the [Void wiki][6], xbps has the following features: - - * Supports multiple local and remote repositories (HTTP/HTTPS/FTP). - * RSA signed remote repositories - * SHA256 hashes for package metadata, files, and binary packages - * Supports package states (ala dpkg) to mitigate broken package * installs/updates - * Ability to resume partial package install/updates - * Ability to unpack only files that have been modified in * package updates - * Ability to use virtual packages - * Ability to check for incompatible shared libraries in reverse dependencies - * Ability to replace packages - * Ability to put packages on hold (to never update them) - * Ability to preserve/update configuration files - * Ability to force reinstallation of any installed package - * Ability to downgrade any installed package - * Ability to execute pre/post install/remove/update scriptlets - * Ability to check package integrity: missing files, hashes, missing or unresolved (reverse)dependencies, dangling or modified symlinks, etc. - - - -#### System Requirements - -According to the [Void Linux download page][7], the system requirements differ based on the architecture you choose. 64-bit images require “EM64T CPU, 96MB RAM, 350MB disk, Ethernet/WiFi for network installation”. 32-bit images require “Pentium 4 CPU (SSE2), 96MB RAM, 350MB disk, Ethernet / WiFi for network installation”. The [Void Linux handbook][8] recommends 700 MB for storage and also notes that “Flavor installations require more resources. How much more depends on the flavor.” - -Void also supports ARM devices. You can download [ready to boot images][9] for Raspberry Pi and several other [Raspberry Pi alternatives][10]. - -[][11] - -Suggested read NomadBSD, a BSD for the Road - -### Void Linux Installation - -NOTE: you can either install [Void Linux download page][7] via a live image or use a net installer. I used a live image. - -I was able to successfully install Void Linux on my Dell Latitude D630. This laptop has an Intel Centrino Duo Core processor running at 2.00 GHz, NVIDIA Quadro NVS 135M graphics chip, and 4 GB of RAM. - -![Void Linux Mate][12] - -After I `dd`ed the 800 MB Void Linux MATE image to my thumb drive and inserted it, I booted my computer. I was very quickly presented with a vanilla MATE desktop. To start installing Void, I opened up a terminal and typed `sudo void-installer`. After using the default password `voidlinux`, the installer started. The installer reminded me a little bit of the terminal Debian installer, but it was laid out more like FreeBSD. It was divided into keyboard, network, source, hostname, locale, timezone, root password, user account, bootloader, partition, and filesystems sections. - -Most of the sections where self-explanatory. In the source section, you could choose whether to install the packages from the local image or grab them from the web. I chose local because I did not want to eat up bandwidth or take longer than I had to. The partition and filesystems sections are usually handled automatically by most installers, but not on Void. In this case, the first section allows you to use `cfdisk` to create partitions and the second allows to specify what filesystems will be used in those partitions. I followed the partition layout on [this page][13]. - -If you install Void Linux from the local image, you definitely need to update your system. The [Void wiki][14] recommends running `xbps-install -Suv` until there are no more updates to install. It would probably be a good idea to reboot between batches of updates. - -### Experience with Void Linux - -So far in my Linux journey, Void Linux has been by far the most difficult. It feels more like I’m [using a BSD than a Linux distro][15]. (I guess that should not be surprising since Void was created by a former [NetBSD][16] developer who wanted to experiment with his own package manager.) The steps in the command line installer are closer to that of [FreeBSD][17] than Debian. - -Once Void was installed and updated, I went to work installing apps. Unfortunately, I ran into an issue with missing applications. Most of these applications come preinstalled on other distros. I had to install wget, unzip, git, nano, LibreOffice to name just a few. - -Void does not come with a graphical package manager. There are three unofficial frontends for the xbps package manager and [one is based on qt][18]. I ran into issues getting one of the Bash-based tools to work. It hadn’t been updated in 4-5 years. - -![Octoxbps][19] - -The xbps package manager is kinda interesting. It downloads the package and its signature to verify it. You can see the [terminal print out][20] from when I installed Mcomix. Xbps does not use the normal naming convention used in most package managers (ie `apt install` or `pacman -R`), instead, it uses `xbps-install`, `xbps-query`, `xbps-remove`. Luckily, the Void wiki had a [page][21] to show what xbps command relates to apt or dnf commands. - -[][22] - -Suggested read How To Solve: error: no such partition grub rescue in Ubuntu Linux - -The main repo for Void is located in Germany, so I decided to switch to a more local server to ease the burden on that server and to download packages quicker. Switching to a local mirror took a couple of tries because the documentation was not very clear. Documentation for Void is located in two different places: the [wiki][23] and the [handbook][24]. For me, the wiki’s [explanation][25] was confusing and I ran into issues. So, I searched for an answer on DuckDuckGo. From there I stumbled upon the [handbook’s instructions][26], which were much clearer. (The handbook is not linked on the Void Linux website and I had to stumble across it via search.) - -One of the nice things about Void is the speed of the system once everything was installed. It had the quickest boot time I have ever encountered. Overall, the system was very responsive. I did not run into any system crashes. - -### Final Thoughts - -Void Linux took more work to get to a useable state than any other distro I have tried. Even the BSDs I tried felt more polished than Void. I think the tagline “General purpose Linux” is misleading. It should be “Linux with hackers and tinkerers in mind”. Personally, I prefer using distros that are ready for me to use after installing. While it is an interesting combination of Linux and BSD ideas, I don’t think I’ll add Void to my short list of go-to distros. - -If you like tinkering with your Linux system or like building it from scratch, give [Void Linux][7] a try. - -Have you ever used Void Linux? What is your favorite Debian-based distro? Please let us know in the comments below. - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][27]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/void-linux/ - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/john/ -[b]: https://github.com/lujun9972 -[1]: https://voidlinux.org/ -[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/04/Void-Linux-Neofetch.png?resize=800%2C562&ssl=1 -[3]: https://en.wikipedia.org/wiki/Systemd -[4]: http://smarden.org/runit/ -[5]: https://www.musl-libc.org/ -[6]: https://wiki.voidlinux.org/XBPS -[7]: https://voidlinux.org/download/ -[8]: https://docs.voidlinux.org/installation/base-requirements.html -[9]: https://voidlinux.org/download/#download-ready-to-boot-images-for-arm -[10]: https://itsfoss.com/raspberry-pi-alternatives/ -[11]: https://itsfoss.com/nomadbsd/ -[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/04/Void-Linux-Mate.png?resize=800%2C640&ssl=1 -[13]: https://wiki.voidlinux.org/Disks#Filesystems -[14]: https://wiki.voidlinux.org/Post_Installation#Updates -[15]: https://itsfoss.com/why-use-bsd/ -[16]: https://itsfoss.com/netbsd-8-release/ -[17]: https://www.freebsd.org/ -[18]: https://github.com/aarnt/octoxbps -[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/04/OctoXBPS.jpg?resize=800%2C534&ssl=1 -[20]: https://pastebin.com/g31n1bFT -[21]: https://wiki.voidlinux.org/Rosetta_stone -[22]: https://itsfoss.com/solve-error-partition-grub-rescue-ubuntu-linux/ -[23]: https://wiki.voidlinux.org/ -[24]: https://docs.voidlinux.org/ -[25]: https://wiki.voidlinux.org/XBPS#Official_Repositories -[26]: https://docs.voidlinux.org/xbps/repositories/mirrors/changing.html -[27]: http://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20190505 Five Methods To Check Your Current Runlevel In Linux.md b/sources/tech/20190505 Five Methods To Check Your Current Runlevel In Linux.md deleted file mode 100644 index 2169f04e51..0000000000 --- a/sources/tech/20190505 Five Methods To Check Your Current Runlevel In Linux.md +++ /dev/null @@ -1,183 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Five Methods To Check Your Current Runlevel In Linux?) -[#]: via: (https://www.2daygeek.com/check-current-runlevel-in-linux/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -Five Methods To Check Your Current Runlevel In Linux? -====== - -A run level is an operating system state on Linux system. - -There are seven runlevels exist, numbered from zero to six. - -A system can be booted into any of the given runlevel. Run levels are identified by numbers. - -Each runlevel designates a different system configuration and allows access to a different combination of processes. - -By default Linux boots either to runlevel 3 or to runlevel 5. - -Only one runlevel is executed at a time on startup. It doesn’t execute one after another. - -The default runlevel for a system is specified in the /etc/inittab file for SysVinit system. - -But systemd systems doesn’t read this file and it uses the following file `/etc/systemd/system/default.target` to get default runlevel information. - -We can check the Linux system current runlevel using the below five methods. - - * **`runlevel Command:`** runlevel prints the previous and current runlevel of the system. - * **`who Command:`** Print information about users who are currently logged in. It will print the runlevel information with “-r” option. - * **`systemctl Command:`** It controls the systemd system and service manager. - * **`Using /etc/inittab File:`** The default runlevel for a system is specified in the /etc/inittab file for SysVinit System. - * **`Using /etc/systemd/system/default.target File:`** The default runlevel for a system is specified in the /etc/systemd/system/default.target file for systemd System. - - - -Detailed runlevels information is described in the below table. - -**Runlevel** | **SysVinit System** | **systemd System** ----|---|--- -0 | Shutdown or Halt the system | shutdown.target -1 | Single user mode | rescue.target -2 | Multiuser, without NFS | multi-user.target -3 | Full multiuser mode | multi-user.target -4 | unused | multi-user.target -5 | X11 (Graphical User Interface) | graphical.target -6 | reboot the system | reboot.target - -The system will execute the programs/service based on the runlevel. - -For SysVinit system, it will be execute from the following location. - - * Run level 0 – /etc/rc.d/rc0.d/ - * Run level 1 – /etc/rc.d/rc1.d/ - * Run level 2 – /etc/rc.d/rc2.d/ - * Run level 3 – /etc/rc.d/rc3.d/ - * Run level 4 – /etc/rc.d/rc4.d/ - * Run level 5 – /etc/rc.d/rc5.d/ - * Run level 6 – /etc/rc.d/rc6.d/ - - - -For systemd system, it will be execute from the following location. - - * runlevel1.target – /etc/systemd/system/rescue.target - * runlevel2.target – /etc/systemd/system/multi-user.target.wants - * runlevel3.target – /etc/systemd/system/multi-user.target.wants - * runlevel4.target – /etc/systemd/system/multi-user.target.wants - * runlevel5.target – /etc/systemd/system/graphical.target.wants - - - -### 1) How To Check Your Current Runlevel In Linux Using runlevel Command? - -runlevel prints the previous and current runlevel of the system. - -``` -$ runlevel -N 5 -``` - - * **`N:`** “N” indicates that the runlevel has not been changed since the system was booted. - * **`5:`** “5” indicates the current runlevel of the system. - - - -### 2) How To Check Your Current Runlevel In Linux Using who Command? - -Print information about users who are currently logged in. It will print the runlevel information with `-r` option. - -``` -$ who -r - run-level 5 2019-04-22 09:32 -``` - -### 3) How To Check Your Current Runlevel In Linux Using systemctl Command? - -systemctl is used to controls the systemd system and service manager. systemd is system and service manager for Unix like operating systems. - -It can work as a drop-in replacement for sysvinit system. systemd is the first process get started by kernel and holding PID 1. - -systemd uses `.service` files Instead of bash scripts (SysVinit uses). systemd sorts all daemons into their own Linux cgroups and you can see the system hierarchy by exploring `/cgroup/systemd` file. - -``` -$ systemctl get-default -graphical.target -``` - -### 4) How To Check Your Current Runlevel In Linux Using /etc/inittab File? - -The default runlevel for a system is specified in the /etc/inittab file for SysVinit System but systemd systemd doesn’t read the files. - -So, it will work only on SysVinit system and not in systemd system. - -``` -$ cat /etc/inittab -# inittab is only used by upstart for the default runlevel. -# -# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. -# -# System initialization is started by /etc/init/rcS.conf -# -# Individual runlevels are started by /etc/init/rc.conf -# -# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf -# -# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf, -# with configuration in /etc/sysconfig/init. -# -# For information on how to write upstart event handlers, or how -# upstart works, see init(5), init(8), and initctl(8). -# -# Default runlevel. The runlevels used are: -# 0 - halt (Do NOT set initdefault to this) -# 1 - Single user mode -# 2 - Multiuser, without NFS (The same as 3, if you do not have networking) -# 3 - Full multiuser mode -# 4 - unused -# 5 - X11 -# 6 - reboot (Do NOT set initdefault to this) -# -id:5:initdefault: -``` - -### 5) How To Check Your Current Runlevel In Linux Using /etc/systemd/system/default.target File? - -The default runlevel for a system is specified in the /etc/systemd/system/default.target file for systemd System. - -It doesn’t work on SysVinit system. - -``` -$ cat /etc/systemd/system/default.target -# This file is part of systemd. -# -# systemd is free software; you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation; either version 2.1 of the License, or -# (at your option) any later version. - -[Unit] -Description=Graphical Interface -Documentation=man:systemd.special(7) -Requires=multi-user.target -Wants=display-manager.service -Conflicts=rescue.service rescue.target -After=multi-user.target rescue.service rescue.target display-manager.service -AllowIsolate=yes -``` --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/check-current-runlevel-in-linux/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 diff --git a/sources/tech/20190505 How To Navigate Directories Faster In Linux.md b/sources/tech/20190505 How To Navigate Directories Faster In Linux.md deleted file mode 100644 index e0979b3915..0000000000 --- a/sources/tech/20190505 How To Navigate Directories Faster In Linux.md +++ /dev/null @@ -1,350 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How To Navigate Directories Faster In Linux) -[#]: via: (https://www.ostechnix.com/navigate-directories-faster-linux/) -[#]: author: (sk https://www.ostechnix.com/author/sk/) - -How To Navigate Directories Faster In Linux -====== - -![Navigate Directories Faster In Linux][1] - -Today we are going to learn some command line productivity hacks. As you already know, we use “cd” command to move between a stack of directories in Unix-like operating systems. In this guide I am going to teach you how to navigate directories faster without having to use “cd” command often. There could be many ways, but I only know the following five methods right now! I will keep updating this guide when I came across any methods or utilities to achieve this task in the days to come. - -### Five Different Methods To Navigate Directories Faster In Linux - -##### Method 1: Using “Pushd”, “Popd” And “Dirs” Commands - -This is the most frequent method that I use everyday to navigate between a stack of directories. The “Pushd”, “Popd”, and “Dirs” commands comes pre-installed in most Linux distributions, so don’t bother with installation. These trio commands are quite useful when you’re working in a deep directory structure and scripts. For more details, check our guide in the link given below. - - * **[How To Use Pushd, Popd And Dirs Commands For Faster CLI Navigation][2]** - - - -##### Method 2: Using “bd” utility - -The “bd” utility also helps you to quickly go back to a specific parent directory without having to repeatedly typing “cd ../../.” on your Bash. - -Bd is also available in the [**Debian extra**][3] and [**Ubuntu universe**][4] repositories. So, you can install it using “apt-get” package manager in Debian, Ubuntu and other DEB based systems as shown below: - -``` -$ sudo apt-get update - -$ sudo apt-get install bd -``` - -For other distributions, you can install as shown below. - -``` -$ sudo wget --no-check-certificate -O /usr/local/bin/bd https://raw.github.com/vigneshwaranr/bd/master/bd - -$ sudo chmod +rx /usr/local/bin/bd - -$ echo 'alias bd=". bd -si"' >> ~/.bashrc - -$ source ~/.bashrc -``` - -To enable auto completion, run: - -``` -$ sudo wget -O /etc/bash_completion.d/bd https://raw.github.com/vigneshwaranr/bd/master/bash_completion.d/bd - -$ source /etc/bash_completion.d/bd -``` - -The Bd utility has now been installed. Let us see few examples to understand how to quickly move through stack of directories using this tool. - -Create some directories. - -``` -$ mkdir -p dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10 -``` - -The above command will create a hierarchy of directories. Let us check [**directory structure**][5] using command: - -``` -$ tree dir1/ -dir1/ -└── dir2 - └── dir3 - └── dir4 - └── dir5 - └── dir6 - └── dir7 - └── dir8 - └── dir9 - └── dir10 - -9 directories, 0 files -``` - -Alright, we have now 10 directories. Let us say you’re currently in 7th directory i.e dir7. - -``` -$ pwd -/home/sk/dir1/dir2/dir3/dir4/dir5/dir6/dir7 -``` - -You want to move to dir3. Normally you would type: - -``` -$ cd /home/sk/dir1/dir2/dir3 -``` - -Right? yes! But it not necessary though! To go back to dir3, just type: - -``` -$ bd dir3 -``` - -Now you will be in dir3. - -![][6] - -Navigate Directories Faster In Linux Using “bd” Utility - -Easy, isn’t it? It supports auto complete, so you can just type the partial name of a directory and hit the tab key to auto complete the full path. - -To check the contents of a specific parent directory, you don’t need to inside that particular directory. Instead, just type: - -``` -$ ls `bd dir1` -``` - -The above command will display the contents of dir1 from your current working directory. - -For more details, check out the following GitHub page. - - * [**bd GitHub repository**][7] - - - -##### Method 3: Using “Up” Shell script - -The “Up” is a shell script allows you to move quickly to your parent directory. It works well on many popular shells such as Bash, Fish, and Zsh etc. Installation is absolutely easy too! - -To install “Up” on **Bash** , run the following commands one bye: - -``` -$ curl --create-dirs -o ~/.config/up/up.sh https://raw.githubusercontent.com/shannonmoeller/up/master/up.sh - -$ echo 'source ~/.config/up/up.sh' >> ~/.bashrc -``` - -The up script registers the “up” function and some completion functions via your “.bashrc” file. - -Update the changes using command: - -``` -$ source ~/.bashrc -``` - -On **zsh** : - -``` -$ curl --create-dirs -o ~/.config/up/up.sh https://raw.githubusercontent.com/shannonmoeller/up/master/up.sh - -$ echo 'source ~/.config/up/up.sh' >> ~/.zshrc -``` - -The up script registers the “up” function and some completion functions via your “.zshrc” file. - -Update the changes using command: - -``` -$ source ~/.zshrc -``` - -On **fish** : - -``` -$ curl --create-dirs -o ~/.config/up/up.fish https://raw.githubusercontent.com/shannonmoeller/up/master/up.fish - -$ source ~/.config/up/up.fish -``` - -The up script registers the “up” function and some completion functions via “funcsave”. - -Now it is time to see some examples. - -Let us create some directories. - -``` -$ mkdir -p dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10 -``` - -Let us say you’re in 7th directory i.e dir7. - -``` -$ pwd -/home/sk/dir1/dir2/dir3/dir4/dir5/dir6/dir7 -``` - -You want to move to dir3. Using “cd” command, we can do this by typing the following command: - -``` -$ cd /home/sk/dir1/dir2/dir3 -``` - -But it is really easy to go back to dir3 using “up” script: - -``` -$ up dir3 -``` - -That’s it. Now you will be in dir3. To go one directory up, just type: - -``` -$ up 1 -``` - -To go back two directory type: - -``` -$ up 2 -``` - -It’s that simple. Did I type the full path? Nope. Also it supports tab completion. So just type the partial directory name and hit the tab to complete the full path. - -For more details, check out the GitHub page. - - * [**Up GitHub Repository**][8] - - - -Please be mindful that “bd” and “up” tools can only help you to go backward i.e to the parent directory of the current working directory. You can’t move forward. If you want to switch to dir10 from dir5, you can’t! Instead, you need to use “cd” command to switch to dir10. These two utilities are meant for quickly moving you to the parent directory! - -##### Method 4: Using “Shortcut” tool - -This is yet another handy method to switch between different directories quickly and easily. This is somewhat similar to [**alias**][9] command. In this method, we create shortcuts to frequently used directories and use the shortcut name to go to that respective directory without having to type the path. If you’re working in deep directory structure and stack of directories, this method will greatly save some time. You can learn how it works in the guide given below. - - * [**Create Shortcuts To The Frequently Used Directories In Your Shell**][10] - - - -##### Method 5: Using “CDPATH” Environment variable - -This method doesn’t require any installation. **CDPATH** is an environment variable. It is somewhat similar to **PATH** variable which contains many different paths concatenated using **‘:’** (colon). The main difference between PATH and CDPATH variables is the PATH variable is usable with all commands whereas CDPATH works only for **cd** command. - -I have the following directory structure. - -![][11] - -Directory structure - -As you see, there are four child directories under a parent directory named “ostechnix”. - -Now add this parent directory to CDPATH using command: - -``` -$ export CDPATH=~/ostechnix -``` - -You now can instantly cd to the sub-directories of the parent directory (i.e **~/ostechnix** in our case) from anywhere in the filesystem. - -For instance, currently I am in **/var/mail/** location. - -![][12] - -To cd into **~/ostechnix/Linux/** directory, we don’t have to use the full path of the directory as shown below: - -``` -$ cd ~/ostechnix/Linux -``` - -Instead, just mention the name of the sub-directory you want to switch to: - -``` -$ cd Linux -``` - -It will automatically cd to **~/ostechnix/Linux** directory instantly. - -![][13] - -As you can see in the above output, I didn’t use “cd ”. Instead, I just used “cd ” command. - -Please note that CDPATH will allow you to quickly navigate to only one child directory of the parent directory set in CDPATH variable. It doesn’t much help for navigating a stack of directories (directories inside sub-directories, of course). - -To find the values of CDPATH variable, run: - -``` -$ echo $CDPATH -``` - -Sample output would be: - -``` -/home/sk/ostechnix -``` - -**Set multiple values to CDPATH** - -Similar to PATH variable, we can also set multiple values (more than one directory) to CDPATH separated by colon (:). - -``` -$ export CDPATH=.:~/ostechnix:/etc:/var:/opt -``` - -**Make the changes persistent** - -As you already know, the above command (export) will only keep the values of CDPATH until next reboot. To permanently set the values of CDPATH, just add them to your **~/.bashrc** or **~/.bash_profile** files. - -``` -$ vi ~/.bash_profile -``` - -Add the values: - -``` -export CDPATH=.:~/ostechnix:/etc:/var:/opt -``` - -Hit **ESC** key and type **:wq** to save and exit. - -Apply the changes using command: - -``` -$ source ~/.bash_profile -``` - -**Clear CDPATH** - -To clear the values of CDPATH, use **export CDPATH=””**. Or, simply delete the entire line from **~/.bashrc** or **~/.bash_profile** files. - -In this article, you have learned the different ways to navigate directory stack faster and easier in Linux. As you can see, it’s not that difficult to browse a pile of directories faster. Now stop typing “cd ../../..” endlessly by using these tools. If you know any other worth trying tool or method to navigate directories faster, feel free to let us know in the comment section below. I will review and add them in this guide. - -And, that’s all for now. Hope this helps. More good stuffs to come. Stay tuned! - -Cheers! - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/navigate-directories-faster-linux/ - -作者:[sk][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/wp-content/uploads/2017/12/Navigate-Directories-Faster-In-Linux-720x340.png -[2]: https://www.ostechnix.com/use-pushd-popd-dirs-commands-faster-cli-navigation/ -[3]: https://tracker.debian.org/pkg/bd -[4]: https://launchpad.net/ubuntu/+source/bd -[5]: https://www.ostechnix.com/view-directory-tree-structure-linux/ -[6]: http://www.ostechnix.com/wp-content/uploads/2017/12/Navigate-Directories-Faster-1.png -[7]: https://github.com/vigneshwaranr/bd -[8]: https://github.com/shannonmoeller/up -[9]: https://www.ostechnix.com/the-alias-and-unalias-commands-explained-with-examples/ -[10]: https://www.ostechnix.com/create-shortcuts-frequently-used-directories-shell/ -[11]: http://www.ostechnix.com/wp-content/uploads/2018/12/tree-command-output.png -[12]: http://www.ostechnix.com/wp-content/uploads/2018/12/pwd-command.png -[13]: http://www.ostechnix.com/wp-content/uploads/2018/12/cdpath.png diff --git a/sources/tech/20190506 Use udica to build SELinux policy for containers.md b/sources/tech/20190506 Use udica to build SELinux policy for containers.md deleted file mode 100644 index 4e31288a43..0000000000 --- a/sources/tech/20190506 Use udica to build SELinux policy for containers.md +++ /dev/null @@ -1,199 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Use udica to build SELinux policy for containers) -[#]: via: (https://fedoramagazine.org/use-udica-to-build-selinux-policy-for-containers/) -[#]: author: (Lukas Vrabec https://fedoramagazine.org/author/lvrabec/) - -Use udica to build SELinux policy for containers -====== - -![][1] - -While modern IT environments move towards Linux containers, the need to secure these environments is as relevant as ever. Containers are a process isolation technology. While containers can be a defense mechanism, they only excel when combined with SELinux. - -Fedora SELinux engineering built a new standalone tool, **udica** , to generate SELinux policy profiles for containers by automatically inspecting them. This article focuses on why _udica_ is needed in the container world, and how it makes SELinux and containers work better together. You’ll find examples of SELinux separation for containers that let you avoid turning protection off because the generic SELinux type _container_t_ is too tight. With _udica_ you can easily customize the policy with limited SELinux policy writing skills. - -### SELinux technology - -SELinux is a security technology that brings proactive security to Linux systems. It’s a labeling system that assigns a label to all _subjects_ (processes and users) and _objects_ (files, directories, sockets, etc.). These labels are then used in a security policy that controls access throughout the system. It’s important to mention that what’s not allowed in an SELinux security policy is denied by default. The policy rules are enforced by the kernel. This security technology has been in use on Fedora for several years. A real example of such a rule is: - -``` -allow httpd_t httpd_log_t: file { append create getattr ioctl lock open read setattr }; -``` - -The rule allows any process labeled as _httpd_t_ ****to create, append, read and lock files labeled as _httpd_log_t_. Using the _ps_ command, you can list all processes with their labels: - -``` -$ ps -efZ | grep httpd -system_u:system_r:httpd_t:s0 root 13911 1 0 Apr14 ? 00:05:14 /usr/sbin/httpd -DFOREGROUND -... -``` - -To see which objects are labeled as httpd_log_t, use _semanage_ : - -``` -# semanage fcontext -l | grep httpd_log_t -/var/log/httpd(/.)? all files system_u:object_r:httpd_log_t:s0 -/var/log/nginx(/.)? all files system_u:object_r:httpd_log_t:s0 -... -``` - -The SELinux security policy for Fedora is shipped in the _selinux-policy_ RPM package. - -### SELinux vs. containers - -In Fedora, the _container-selinux_ RPM package provides a generic SELinux policy for all containers started by engines like _podman_ or _docker_. Its main purposes are to protect the host system against a container process, and to separate containers from each other. For instance, containers confined by SELinux with the process type _container_t_ can only read/execute files in _/usr_ and write to _container_file_t_ ****files type on host file system. To prevent attacks by containers on each other, Multi-Category Security (MCS) is used. - -Using only one generic policy for containers is problematic, because of the huge variety of container usage. On one hand, the default container type ( _container_t_ ) is often too strict. For example: - - * [Fedora SilverBlue][2] needs containers to read/write a user’s home directory - * [Fluentd][3] project needs containers to be able to read logs in the _/var/log_ directory - - - -On the other hand, the default container type could be too loose for certain use cases: - - * It has no SELinux network controls — all container processes can bind to any network port - * It has no SELinux control on [Linux capabilities][4] — all container processes can use all capabilities - - - -There is one solution to handle both use cases: write a custom SELinux security policy for the container. This can be tricky, because SELinux expertise is required. For this purpose, the _udica_ tool was created. - -### Introducing udica - -Udica generates SELinux security profiles for containers. Its concept is based on the “block inheritance” feature inside the [common intermediate language][5] (CIL) supported by SELinux userspace. The tool creates a policy that combines: - - * Rules inherited from specified CIL blocks (templates), and - * Rules discovered by inspection of container JSON file, which contains mountpoints and ports definitions - - - -You can load the final policy immediately, or move it to another system to load into the kernel. Here’s an example, using a container that: - - * Mounts _/home_ as read only - * Mounts _/var/spool_ as read/write - * Exposes port _tcp/21_ - - - -The container starts with this command: - -``` -# podman run -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it fedora bash -``` - -The default container type ( _container_t_ ) doesn’t allow any of these three actions. To prove it, you could use the _sesearch_ tool to query that the _allow_ rules are present on system: - -``` -# sesearch -A -s container_t -t home_root_t -c dir -p read -``` - -There’s no _allow_ rule present that lets a process labeled as _container_t_ access a directory labeled _home_root_t_ (like the _/home_ directory). The same situation occurs with _/var/spool_ , which is labeled _var_spool_t:_ - -``` -# sesearch -A -s container_t -t var_spool_t -c dir -p read -``` - -On the other hand, the default policy completely allows network access. - -``` -# sesearch -A -s container_t -t port_type -c tcp_socket -allow container_net_domain port_type:tcp_socket { name_bind name_connect recv_msg send_msg }; -allow sandbox_net_domain port_type:tcp_socket { name_bind name_connect recv_msg send_msg }; -``` - -### Securing the container - -It would be great to restrict this access and allow the container to bind just on TCP port _21_ or with the same label. Imagine you find an example container using _podman ps_ whose ID is _37a3635afb8f_ : - -``` -# podman ps -q -37a3635afb8f -``` - -You can now inspect the container and pass the inspection file to the _udica_ tool. The name for the new policy is _my_container_. - -``` -# podman inspect 37a3635afb8f > container.json -# udica -j container.json my_container -Policy my_container with container id 37a3635afb8f created! - -Please load these modules using: - # semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil} - -Restart the container with: "--security-opt label=type:my_container.process" parameter -``` - -That’s it! You just created a custom SELinux security policy for the example container. Now you can load this policy into the kernel and make it active. The _udica_ output above even tells you the command to use: - -``` -# semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil} -``` - -Now you must restart the container to allow the container engine to use the new custom policy: - -``` -# podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it fedora bash -``` - -The example container is now running in the newly created _my_container.process_ SELinux process type: - -``` -# ps -efZ | grep my_container.process -unconfined_u:system_r:container_runtime_t:s0-s0:c0.c1023 root 2275 434 1 13:49 pts/1 00:00:00 podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it fedora bash -system_u:system_r:my_container.process:s0:c270,c963 root 2317 2305 0 13:49 pts/0 00:00:00 bash -``` - -### Seeing the results - -The command _sesearch_ now shows _allow_ rules for accessing _/home_ and _/var/spool:_ - -``` -# sesearch -A -s my_container.process -t home_root_t -c dir -p read -allow my_container.process home_root_t:dir { getattr ioctl lock open read search }; -# sesearch -A -s my_container.process -t var_spool_t -c dir -p read -allow my_container.process var_spool_t:dir { add_name getattr ioctl lock open read remove_name search write } -``` - -The new custom SELinux policy also allows _my_container.process_ to bind only to TCP/UDP ports labeled the same as TCP port 21: - -``` -# semanage port -l | grep 21 | grep ftp - ftp_port_t tcp 21, 989, 990 -# sesearch -A -s my_container.process -c tcp_socket -p name_bind - allow my_container.process ftp_port_t:tcp_socket name_bind; -``` - -### Conclusion - -The _udica_ tool helps you create SELinux policies for containers based on an inspection file without any SELinux expertise required. Now you can increase the security of containerized environments. Sources are available on [GitHub][6], and an RPM package is available in Fedora repositories for Fedora 28 and later. - -* * * - -*Photo by _[_Samuel Zeller_][7]_ on *[ _Unsplash_.][8] - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/use-udica-to-build-selinux-policy-for-containers/ - -作者:[Lukas Vrabec][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/lvrabec/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/05/udica-816x345.jpg -[2]: https://silverblue.fedoraproject.org -[3]: https://www.fluentd.org -[4]: http://man7.org/linux/man-pages/man7/capabilities.7.html -[5]: https://en.wikipedia.org/wiki/Common_Intermediate_Language -[6]: https://github.com/containers/udica -[7]: https://unsplash.com/photos/KVG-XMOs6tw?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText -[8]: https://unsplash.com/search/photos/lockers?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20190507 Prefer table driven tests.md b/sources/tech/20190507 Prefer table driven tests.md deleted file mode 100644 index 0a41860207..0000000000 --- a/sources/tech/20190507 Prefer table driven tests.md +++ /dev/null @@ -1,521 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Prefer table driven tests) -[#]: via: (https://dave.cheney.net/2019/05/07/prefer-table-driven-tests) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -Prefer table driven tests -====== - -I’m a big fan of testing, specifically [unit testing][1] and TDD ([done correctly][2], of course). A practice that has grown around Go projects is the idea of a table driven test. This post explores the how and why of writing a table driven test. - -Let’s say we have a function that splits strings: - -``` -// Split slices s into all substrings separated by sep and -// returns a slice of the substrings between those separators. -func Split(s, sep string) []string { - var result []string - i := strings.Index(s, sep) - for i > -1 { - result = append(result, s[:i]) - s = s[i+len(sep):] - i = strings.Index(s, sep) - } - return append(result, s) -} -``` - -In Go, unit tests are just regular Go functions (with a few rules) so we write a unit test for this function starting with a file in the same directory, with the same package name, `strings`. - -``` -package split - -import ( - "reflect" - "testing" -) - -func TestSplit(t *testing.T) { - got := Split("a/b/c", "/") - want := []string{"a", "b", "c"} - if !reflect.DeepEqual(want, got) { - t.Fatalf("expected: %v, got: %v", want, got) - } -} -``` - -Tests are just regular Go functions with a few rules: - - 1. The name of the test function must start with `Test`. - 2. The test function must take one argument of type `*testing.T`. A `*testing.T` is a type injected by the testing package itself, to provide ways to print, skip, and fail the test. - - - -In our test we call `Split` with some inputs, then compare it to the result we expected. - -### Code coverage - -The next question is, what is the coverage of this package? Luckily the go tool has a built in branch coverage. We can invoke it like this: - -``` -% go test -coverprofile=c.out -PASS -coverage: 100.0% of statements -ok split 0.010s -``` - -Which tells us we have 100% branch coverage, which isn’t really surprising, there’s only one branch in this code. - -If we want to dig in to the coverage report the go tool has several options to print the coverage report. We can use `go tool cover -func` to break down the coverage per function: - -``` -% go tool cover -func=c.out -split/split.go:8: Split 100.0% -total: (statements) 100.0% -``` - -Which isn’t that exciting as we only have one function in this package, but I’m sure you’ll find more exciting packages to test. - -#### Spray some .bashrc on that - -This pair of commands is so useful for me I have a shell alias which runs the test coverage and the report in one command: - -``` -cover () { - local t=$(mktemp -t cover) - go test $COVERFLAGS -coverprofile=$t $@ \ - && go tool cover -func=$t \ - && unlink $t -} -``` - -### Going beyond 100% coverage - -So, we wrote one test case, got 100% coverage, but this isn’t really the end of the story. We have good branch coverage but we probably need to test some of the boundary conditions. For example, what happens if we try to split it on comma? - -``` -func TestSplitWrongSep(t *testing.T) { - got := Split("a/b/c", ",") - want := []string{"a/b/c"} - if !reflect.DeepEqual(want, got) { - t.Fatalf("expected: %v, got: %v", want, got) - } -} -``` - -Or, what happens if there are no separators in the source string? - -``` -func TestSplitNoSep(t *testing.T) { - got := Split("abc", "/") - want := []string{"abc"} - if !reflect.DeepEqual(want, got) { - t.Fatalf("expected: %v, got: %v", want, got) - } -} -``` - -We’re starting build a set of test cases that exercise boundary conditions. This is good. - -### Introducing table driven tests - -However the there is a lot of duplication in our tests. For each test case only the input, the expected output, and name of the test case change. Everything else is boilerplate. What we’d like to to set up all the inputs and expected outputs and feel them to a single test harness. This is a great time to introduce table driven testing. - -``` -func TestSplit(t *testing.T) { - type test struct { - input string - sep string - want []string - } - - tests := []test{ - {input: "a/b/c", sep: "/", want: []string{"a", "b", "c"}}, - {input: "a/b/c", sep: ",", want: []string{"a/b/c"}}, - {input: "abc", sep: "/", want: []string{"abc"}}, - } - - for _, tc := range tests { - got := Split(tc.input, tc.sep) - if !reflect.DeepEqual(tc.want, got) { - t.Fatalf("expected: %v, got: %v", tc.want, got) - } - } -} -``` - -We declare a structure to hold our test inputs and expected outputs. This is our table. The `tests` structure is usually a local declaration because we want to reuse this name for other tests in this package. - -In fact, we don’t even need to give the type a name, we can use an anonymous struct literal to reduce the boilerplate like this: - -``` -func TestSplit(t *testing.T) { - tests := []struct { - input string - sep string - want []string - }{ - {input: "a/b/c", sep: "/", want: []string{"a", "b", "c"}}, - {input: "a/b/c", sep: ",", want: []string{"a/b/c"}}, - {input: "abc", sep: "/", want: []string{"abc"}}, - } - - for _, tc := range tests { - got := Split(tc.input, tc.sep) - if !reflect.DeepEqual(tc.want, got) { - t.Fatalf("expected: %v, got: %v", tc.want, got) - } - } -} -``` - -Now, adding a new test is a straight forward matter; simply add another line the `tests` structure. For example, what will happen if our input string has a trailing separator? - -``` -{input: "a/b/c", sep: "/", want: []string{"a", "b", "c"}}, -{input: "a/b/c", sep: ",", want: []string{"a/b/c"}}, -{input: "abc", sep: "/", want: []string{"abc"}}, -{input: "a/b/c/", sep: "/", want: []string{"a", "b", "c"}}, // trailing sep -``` - -But, when we run `go test`, we get - -``` -% go test ---- FAIL: TestSplit (0.00s) - split_test.go:24: expected: [a b c], got: [a b c ] -``` - -Putting aside the test failure, there are a few problems to talk about. - -The first is by rewriting each test from a function to a row in a table we’ve lost the name of the failing test. We added a comment in the test file to call out this case, but we don’t have access to that comment in the `go test` output. - -There are a few ways to resolve this. You’ll see a mix of styles in use in Go code bases because the table testing idiom is evolving as people continue to experiment with the form. - -### Enumerating test cases - -As tests are stored in a slice we can print out the index of the test case in the failure message: - -``` -func TestSplit(t *testing.T) { - tests := []struct { - input string - sep . string - want []string - }{ - {input: "a/b/c", sep: "/", want: []string{"a", "b", "c"}}, - {input: "a/b/c", sep: ",", want: []string{"a/b/c"}}, - {input: "abc", sep: "/", want: []string{"abc"}}, - {input: "a/b/c/", sep: "/", want: []string{"a", "b", "c"}}, - } - - for i, tc := range tests { - got := Split(tc.input, tc.sep) - if !reflect.DeepEqual(tc.want, got) { - t.Fatalf("test %d: expected: %v, got: %v", i+1, tc.want, got) - } - } -} -``` - -Now when we run `go test` we get this - -``` -% go test ---- FAIL: TestSplit (0.00s) - split_test.go:24: test 4: expected: [a b c], got: [a b c ] -``` - -Which is a little better. Now we know that the fourth test is failing, although we have to do a little bit of fudging because slice indexing—​and range iteration—​is zero based. This requires consistency across your test cases; if some use zero base reporting and others use one based, it’s going to be confusing. And, if the list of test cases is long, it could be difficult to count braces to figure out exactly which fixture constitutes test case number four. - -### Give your test cases names - -Another common pattern is to include a name field in the test fixture. - -``` -func TestSplit(t *testing.T) { - tests := []struct { - name string - input string - sep string - want []string - }{ - {name: "simple", input: "a/b/c", sep: "/", want: []string{"a", "b", "c"}}, - {name: "wrong sep", input: "a/b/c", sep: ",", want: []string{"a/b/c"}}, - {name: "no sep", input: "abc", sep: "/", want: []string{"abc"}}, - {name: "trailing sep", input: "a/b/c/", sep: "/", want: []string{"a", "b", "c"}}, - } - - for _, tc := range tests { - got := Split(tc.input, tc.sep) - if !reflect.DeepEqual(tc.want, got) { - t.Fatalf("%s: expected: %v, got: %v", tc.name, tc.want, got) - } - } -} -``` - -Now when the test fails we have a descriptive name for what the test was doing. We no longer have to try to figure it out from the output—​also, now have a string we can search on. - -``` -% go test ---- FAIL: TestSplit (0.00s) - split_test.go:25: trailing sep: expected: [a b c], got: [a b c ] -``` - -We can dry this up even more using a map literal syntax: - -``` -func TestSplit(t *testing.T) { - tests := map[string]struct { - input string - sep string - want []string - }{ - "simple": {input: "a/b/c", sep: "/", want: []string{"a", "b", "c"}}, - "wrong sep": {input: "a/b/c", sep: ",", want: []string{"a/b/c"}}, - "no sep": {input: "abc", sep: "/", want: []string{"abc"}}, - "trailing sep": {input: "a/b/c/", sep: "/", want: []string{"a", "b", "c"}}, - } - - for name, tc := range tests { - got := Split(tc.input, tc.sep) - if !reflect.DeepEqual(tc.want, got) { - t.Fatalf("%s: expected: %v, got: %v", name, tc.want, got) - } - } -} -``` - -Using a map literal syntax we define our test cases not as a slice of structs, but as map of test names to test fixtures. There’s also a side benefit of using a map that is going to potentially improve the utility of our tests. - -Map iteration order is _undefined_ 1 This means each time we run `go test`, our tests are going to be potentially run in a different order. - -This is super useful for spotting conditions where test pass when run in statement order, but not otherwise. If you find that happens you probably have some global state that is being mutated by one test with subsequent tests depending on that modification. - -### Introducing sub tests - -Before we fix the failing test there are a few other issues to address in our table driven test harness. - -The first is we’re calling `t.Fatalf` when one of the test cases fails. This means after the first failing test case we stop testing the other cases. Because test cases are run in an undefined order, if there is a test failure, it would be nice to know if it was the only failure or just the first. - -The testing package would do this for us if we go to the effort to write out each test case as its own function, but that’s quite verbose. The good news is since Go 1.7 a new feature was added that lets us do this easily for table driven tests. They’re called [sub tests][3]. - -``` -func TestSplit(t *testing.T) { - tests := map[string]struct { - input string - sep string - want []string - }{ - "simple": {input: "a/b/c", sep: "/", want: []string{"a", "b", "c"}}, - "wrong sep": {input: "a/b/c", sep: ",", want: []string{"a/b/c"}}, - "no sep": {input: "abc", sep: "/", want: []string{"abc"}}, - "trailing sep": {input: "a/b/c/", sep: "/", want: []string{"a", "b", "c"}}, - } - - for name, tc := range tests { - t.Run(name, func(t *testing.T) { - got := Split(tc.input, tc.sep) - if !reflect.DeepEqual(tc.want, got) { - t.Fatalf("expected: %v, got: %v", tc.want, got) - } - }) - } -} -``` - -As each sub test now has a name we get that name automatically printed out in any test runs. - -``` -% go test ---- FAIL: TestSplit (0.00s) - --- FAIL: TestSplit/trailing_sep (0.00s) - split_test.go:25: expected: [a b c], got: [a b c ] -``` - -Each subtest is its own anonymous function, therefore we can use `t.Fatalf`, `t.Skipf`, and all the other `testing.T`helpers, while retaining the compactness of a table driven test. - -#### Individual sub test cases can be executed directly - -Because sub tests have a name, you can run a selection of sub tests by name using the `go test -run` flag. - -``` -% go test -run=.*/trailing -v -=== RUN TestSplit -=== RUN TestSplit/trailing_sep ---- FAIL: TestSplit (0.00s) - --- FAIL: TestSplit/trailing_sep (0.00s) - split_test.go:25: expected: [a b c], got: [a b c ] -``` - -### Comparing what we got with what we wanted - -Now we’re ready to fix the test case. Let’s look at the error. - -``` ---- FAIL: TestSplit (0.00s) - --- FAIL: TestSplit/trailing_sep (0.00s) - split_test.go:25: expected: [a b c], got: [a b c ] -``` - -Can you spot the problem? Clearly the slices are different, that’s what `reflect.DeepEqual` is upset about. But spotting the actual difference isn’t easy, you have to spot that extra space after `c`. This might look simple in this simple example, but it is any thing but when you’re comparing two complicated deeply nested gRPC structures. - -We can improve the output if we switch to the `%#v` syntax to view the value as a Go(ish) declaration: - -``` -got := Split(tc.input, tc.sep) -if !reflect.DeepEqual(tc.want, got) { - t.Fatalf("expected: %#v, got: %#v", tc.want, got) -} -``` - -Now when we run our test it’s clear that the problem is there is an extra blank element in the slice. - -``` -% go test ---- FAIL: TestSplit (0.00s) - --- FAIL: TestSplit/trailing_sep (0.00s) - split_test.go:25: expected: []string{"a", "b", "c"}, got: []string{"a", "b", "c", ""} -``` - -But before we go to fix our test failure I want to talk a little bit more about choosing the right way to present test failures. Our `Split` function is simple, it takes a primitive string and returns a slice of strings, but what if it worked with structs, or worse, pointers to structs? - -Here is an example where `%#v` does not work as well: - -``` -func main() { - type T struct { - I int - } - x := []*T{{1}, {2}, {3}} - y := []*T{{1}, {2}, {4}} - fmt.Printf("%v %v\n", x, y) - fmt.Printf("%#v %#v\n", x, y) -} -``` - -The first `fmt.Printf`prints the unhelpful, but expected slice of addresses; `[0xc000096000 0xc000096008 0xc000096010] [0xc000096018 0xc000096020 0xc000096028]`. However our `%#v` version doesn’t fare any better, printing a slice of addresses cast to `*main.T`;`[]*main.T{(*main.T)(0xc000096000), (*main.T)(0xc000096008), (*main.T)(0xc000096010)} []*main.T{(*main.T)(0xc000096018), (*main.T)(0xc000096020), (*main.T)(0xc000096028)}` - -Because of the limitations in using any `fmt.Printf` verb, I want to introduce the [go-cmp][4] library from Google. - -The goal of the cmp library is it is specifically to compare two values. This is similar to `reflect.DeepEqual`, but it has more capabilities. Using the cmp pacakge you can, of course, write: - -``` -func main() { - type T struct { - I int - } - x := []*T{{1}, {2}, {3}} - y := []*T{{1}, {2}, {4}} - fmt.Println(cmp.Equal(x, y)) // false -} -``` - -But far more useful for us with our test function is the `cmp.Diff` function which will produce a textual description of what is different between the two values, recursively. - -``` -func main() { - type T struct { - I int - } - x := []*T{{1}, {2}, {3}} - y := []*T{{1}, {2}, {4}} - diff := cmp.Diff(x, y) - fmt.Printf(diff) -} -``` - -Which instead produces: - -``` -% go run -{[]*main.T}[2].I: - -: 3 - +: 4 -``` - -Telling us that at element 2 of the slice of `T`s the `I`field was expected to be 3, but was actually 4. - -Putting this all together we have our table driven go-cmp test - -``` -func TestSplit(t *testing.T) { - tests := map[string]struct { - input string - sep string - want []string - }{ - "simple": {input: "a/b/c", sep: "/", want: []string{"a", "b", "c"}}, - "wrong sep": {input: "a/b/c", sep: ",", want: []string{"a/b/c"}}, - "no sep": {input: "abc", sep: "/", want: []string{"abc"}}, - "trailing sep": {input: "a/b/c/", sep: "/", want: []string{"a", "b", "c"}}, - } - - for name, tc := range tests { - t.Run(name, func(t *testing.T) { - got := Split(tc.input, tc.sep) - diff := cmp.Diff(tc.want, got) - if diff != "" { - t.Fatalf(diff) - } - }) - } -} -``` - -Running this we get - -``` -% go test ---- FAIL: TestSplit (0.00s) - --- FAIL: TestSplit/trailing_sep (0.00s) - split_test.go:27: {[]string}[?->3]: - -: - +: "" -FAIL -exit status 1 -FAIL split 0.006s -``` - -Using `cmp.Diff` our test harness isn’t just telling us that what we got and what we wanted were different. Our test is telling us that the strings are different lengths, the third index in the fixture shouldn’t exist, but the actual output we got an empty string, “”. From here fixing the test failure is straight forward. - - 1. Please don’t email me to argue that map iteration order is _random_. [It’s not][5]. - - - -#### Related posts: - - 1. [Writing table driven tests in Go][6] - 2. [Internets of Interest #7: Ian Cooper on Test Driven Development][7] - 3. [Automatically run your package’s tests with inotifywait][8] - 4. [How to write benchmarks in Go][9] - - - --------------------------------------------------------------------------------- - -via: https://dave.cheney.net/2019/05/07/prefer-table-driven-tests - -作者:[Dave Cheney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://dave.cheney.net/author/davecheney -[b]: https://github.com/lujun9972 -[1]: https://dave.cheney.net/2019/04/03/absolute-unit-test -[2]: https://www.youtube.com/watch?v=EZ05e7EMOLM -[3]: https://blog.golang.org/subtests -[4]: https://github.com/google/go-cmp -[5]: https://golang.org/ref/spec#For_statements -[6]: https://dave.cheney.net/2013/06/09/writing-table-driven-tests-in-go (Writing table driven tests in Go) -[7]: https://dave.cheney.net/2018/10/15/internets-of-interest-7-ian-cooper-on-test-driven-development (Internets of Interest #7: Ian Cooper on Test Driven Development) -[8]: https://dave.cheney.net/2016/06/21/automatically-run-your-packages-tests-with-inotifywait (Automatically run your package’s tests with inotifywait) -[9]: https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go (How to write benchmarks in Go) diff --git a/sources/tech/20190508 Innovations on the Linux desktop- A look at Fedora 30-s new features.md b/sources/tech/20190508 Innovations on the Linux desktop- A look at Fedora 30-s new features.md deleted file mode 100644 index 083a8c9768..0000000000 --- a/sources/tech/20190508 Innovations on the Linux desktop- A look at Fedora 30-s new features.md +++ /dev/null @@ -1,140 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Innovations on the Linux desktop: A look at Fedora 30's new features) -[#]: via: (https://opensource.com/article/19/5/fedora-30-features) -[#]: author: (Anderson Silva https://opensource.com/users/ansilva/users/marcobravo/users/alanfdoss/users/ansilva) - -Innovations on the Linux desktop: A look at Fedora 30's new features -====== -Learn about some of the highlights in the latest version of Fedora -Linux. -![Fedora Linux distro on laptop][1] - -The latest version of Fedora Linux was released at the end of April. As a full-time Fedora user since its original release back in 2003 and an active contributor since 2007, I always find it satisfying to see new features and advancements in the community. - -If you want a TL;DR version of what's has changed in [Fedora 30][2], feel free to ignore this article and jump straight to Fedora's [ChangeSet][3] wiki page. Otherwise, keep on reading to learn about some of the highlights in the new version. - -### Upgrade vs. fresh install - -I upgraded my Lenovo ThinkPad T series from Fedora 29 to 30 using the [DNF system upgrade instructions][4], and so far it is working great! - -I also had the chance to do a fresh install on another ThinkPad, and it was a nice surprise to see a new boot screen on Fedora 30—it even picked up the Lenovo logo. I did not see this new and improved boot screen on the upgrade above; it was only on the fresh install. - -![Fedora 30 boot screen][5] - -### Desktop changes - -If you are a GNOME user, you'll be happy to know that Fedora 30 comes with the latest version, [GNOME 3.32][6]. It has an improved on-screen keyboard (handy for touch-screen laptops), brand new icons for core applications, and a new "Applications" panel under Settings that allows users to gain a bit more control on GNOME default handlers, access permissions, and notifications. Version 3.32 also improves Google Drive performance so that Google files and calendar appointments will be integrated with GNOME. - -![Applications panel in GNOME Settings][7] - -The new Applications panel in GNOME Settings - -Fedora 30 also introduces two new Desktop environments: Pantheon and Deepin. Pantheon is [ElementaryOS][8]'s default desktop environment and can be installed with a simple: - - -``` -`$ sudo dnf groupinstall "Pantheon Desktop"` -``` - -I haven't used Pantheon yet, but I do use [Deepin][9]. Installation is simple; just run: - - -``` -`$ sudo dnf install deepin-desktop` -``` - -then log out of GNOME and log back in, choosing "Deepin" by clicking on the gear icon on the login screen. - -![Deepin desktop on Fedora 30][10] - -Deepin desktop on Fedora 30 - -Deepin appears as a very polished, user-friendly desktop environment that allows you to control many aspects of your environment with a click of a button. So far, the only issue I've had is that it can take a few extra seconds to complete login and return control to your mouse pointer. Other than that, it is brilliant! It is the first desktop environment I've used that seems to do high dots per inch (HiDPI) properly—or at least close to correctly. - -### Command line - -Fedora 30 upgrades the Bourne Again Shell (aka Bash) to version 5.0.x. If you want to find out about every change since its last stable version (4.4), read this [description][11]. I do want to mention that three new environments have been introduced in Bash 5: - - -``` -$ echo $EPOCHSECONDS -1556636959 -$ echo $EPOCHREALTIME -1556636968.012369 -$ echo $BASH_ARGV0 -bash -``` - -Fedora 30 also updates the [Fish shell][12], a colorful shell with auto-suggestion, which can be very helpful for beginners. Fedora 30 comes with [Fish version 3][13], and you can even [try it out in a browser][14] without having to install it on your machine. - -(Note that Fish shell is not the same as guestfish for mounting virtual machine images, which comes with the libguestfs-tools package.) - -### Development - -Fedora 30 brings updates to the following languages: [C][15], [Boost (C++)][16], [Erlang][17], [Go][18], [Haskell][19], [Python][20], [Ruby][21], and [PHP][22]. - -Regarding these updates, the most important thing to know is that Python 2 is deprecated in Fedora 30. The community and Fedora leadership are requesting that all package maintainers that still depend on Python 2 port their packages to Python 3 as soon as possible, as the plan is to remove virtually all Python 2 packages in Fedora 31. - -### Containers - -If you would like to run Fedora as an immutable OS for a container, kiosk, or appliance-like environment, check out [Fedora Silverblue][23]. It brings you all of Fedora's technology managed by [rpm-ostree][24], which is a hybrid image/package system that allows automatic updates and easy rollbacks for developers. It is a great option for anyone who wants to learn more and play around with [Flatpak deployments][25]. - -Fedora Atomic is no longer available under Fedora 30, but you can still [download it][26]. If your jam is containers, don't despair: even though Fedora Atomic is gone, a brand new [Fedora CoreOS][27] is under development and should be going live soon! - -### What else is new? - -As of Fedora 30, **/usr/bin/gpg** points to [GnuPG][28] v2 by default, and [NFS][29] server configuration is now located at **/etc/nfs.conf** instead of **/etc/sysconfig/nfs**. - -There have also been a [few changes][30] for installation and boot time. - -Last but not least, check out [Fedora Spins][31] for a spin of Fedora that defaults to your favorite Window manager and [Fedora Labs][32] for functionally curated software bundles built on Fedora 30 (i.e. astronomy, security, and gaming). - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/fedora-30-features - -作者:[Anderson Silva ][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/ansilva/users/marcobravo/users/alanfdoss/users/ansilva -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/fedora_on_laptop_lead.jpg?itok=XMc5wo_e (Fedora Linux distro on laptop) -[2]: https://getfedora.org/ -[3]: https://fedoraproject.org/wiki/Releases/30/ChangeSet -[4]: https://fedoraproject.org/wiki/DNF_system_upgrade#How_do_I_use_it.3F -[5]: https://opensource.com/sites/default/files/uploads/fedora30_fresh-boot.jpg (Fedora 30 boot screen) -[6]: https://help.gnome.org/misc/release-notes/3.32/ -[7]: https://opensource.com/sites/default/files/uploads/fedora10_gnome.png (Applications panel in GNOME Settings) -[8]: https://elementary.io/ -[9]: https://www.deepin.org/en/dde/ -[10]: https://opensource.com/sites/default/files/uploads/fedora10_deepin.png (Deepin desktop on Fedora 30) -[11]: https://git.savannah.gnu.org/cgit/bash.git/tree/NEWS -[12]: https://fishshell.com/ -[13]: https://fishshell.com/release_notes.html -[14]: https://rootnroll.com/d/fish-shell/ -[15]: https://docs.fedoraproject.org/en-US/fedora/f30/release-notes/developers/Development_C/ -[16]: https://docs.fedoraproject.org/en-US/fedora/f30/release-notes/developers/Development_Boost/ -[17]: https://docs.fedoraproject.org/en-US/fedora/f30/release-notes/developers/Development_Erlang/ -[18]: https://docs.fedoraproject.org/en-US/fedora/f30/release-notes/developers/Development_Go/ -[19]: https://docs.fedoraproject.org/en-US/fedora/f30/release-notes/developers/Development_Haskell/ -[20]: https://docs.fedoraproject.org/en-US/fedora/f30/release-notes/developers/Development_Python/ -[21]: https://docs.fedoraproject.org/en-US/fedora/f30/release-notes/developers/Development_Ruby/ -[22]: https://docs.fedoraproject.org/en-US/fedora/f30/release-notes/developers/Development_Web/ -[23]: https://silverblue.fedoraproject.org/ -[24]: https://rpm-ostree.readthedocs.io/en/latest/ -[25]: https://flatpak.org/setup/Fedora/ -[26]: https://getfedora.org/en/atomic/ -[27]: https://coreos.fedoraproject.org/ -[28]: https://gnupg.org/index.html -[29]: https://en.wikipedia.org/wiki/Network_File_System -[30]: https://docs.fedoraproject.org/en-US/fedora/f30/release-notes/sysadmin/Installation/ -[31]: https://spins.fedoraproject.org -[32]: https://labs.fedoraproject.org/ diff --git a/sources/tech/20190509 A day in the life of an open source performance engineering team.md b/sources/tech/20190509 A day in the life of an open source performance engineering team.md deleted file mode 100644 index 373983e8bc..0000000000 --- a/sources/tech/20190509 A day in the life of an open source performance engineering team.md +++ /dev/null @@ -1,138 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (A day in the life of an open source performance engineering team) -[#]: via: (https://opensource.com/article/19/5/life-performance-engineer) -[#]: author: (Aakarsh Gopi https://opensource.com/users/aakarsh/users/portante/users/anaga/users/gameloid) - -A day in the life of an open source performance engineering team -====== -Collaborating with the community enables performance engineering to -address the confusion and complexity that come with working on a broad -spectrum of products. -![Team checklist and to dos][1] - -In today's world, open source software solutions are a collaborative effort of the community. Can a performance engineering team operate the same way, by collaborating with the community to address the confusion and complexity that come with working on a broad spectrum of products? - -To answer that question, we need to explore some basic questions: - - * What does a performance engineering team do? - * How does a performance engineering team fulfill its responsibilities? - * How are open source tools developed or leveraged for performance analysis? - - - -The term "performance engineering" has different meanings, which causes difficulty in figuring out a performance engineering team's responsibilities. Adding to the confusion, a team may be charged with working on a broad spectrum of products, ranging from an operating system like RHEL, whose performance can be significantly impacted by hardware components (CPU caches, network interface controllers, disk technologies, etc.), to something much higher up in the stack like Kubernetes, which comes with the added challenges of operating at scale without compromising on performance. - -Performance engineering has progressed a lot since the days of running manual A/B testing and single-system benchmarks. Now, these teams test cloud infrastructures and add machine learning classifiers as a component in the CI/CD pipeline for identifying performance regression in releases of products. - -### What does a performance engineering team do? - -A performance engineering team is generally responsible for the following (among other things): - - * Identifying potential performance issues - * Identifying any scale issues that could occur - * Developing tuning guides and/or tools that would enable the user to achieve the most out of a product - * Developing guides and/or working with customers to help with capacity planning - * Providing customers with performance expectations for different use cases of the product - - - -The mission of our specific team is to: - - * Establish performance and scale leadership of the Red Hat portfolio; the scope includes component level, system, and solution analysis - * Collaborate with engineering, product management, product marketing, and Customer Experience and Engagement (CEE), as well as hardware and software partners - * Deliver public-facing guidance, internal enablement, and continuous integration tests - - - -Our team fulfills our mission in the following ways: - - * We work with product teams to set performance goals and develop performance tests to run against those products deployed to see how they measure up to those goals. - * We also work to re-run performance tests to ensure there are no regressions in behaviors. - * We develop open source tooling to achieve our product performance goals, making them available to the communities where the products are derived to re-create what we do. - * We work to be transparent and open about how we do performance engineering; sharing these methods and approaches benefits communities, allowing them to reuse our work, and benefits us by leveraging the work they contribute with these tools. - - - -### How does a performance engineering team fulfill its responsibilities? - -Meeting these responsibilities requires collaboration with other teams, such as product management, development, QA/QE, documentation, and consulting, and with the communities. - -_Collaboration_ allows a team to be successful by pulling together team members' diverse knowledge and experience. A performance engineering team builds tools to share their knowledge both within the team and with the community, furthering the value of collaboration. - -Our performance engineering team achieves success through: - - * **Collaboration:** _Intra_ -team collaboration is as important as _inter_ -team collaboration for our performance engineering team - * Most performance engineers tend to create a niche for themselves in one or more sub-disciplines of performance engineering via tooling, performance analysis, systems knowledge, systems configuration, and such. Our team is composed of engineers with knowledge of setting up/configuring systems across the product stack, those who know how a configuration option would affect the system's performance, and so on. Our team's success is heavily reliant on effective collaboration between performance engineers on the team. - * Our team works closely with other organizations at various levels within Red Hat and the communities where our products are derived. - * **Knowledge:** To understand the performance implications of configuration and/or system changes, deep knowledge of the product alone is not sufficient. - * Our team has the knowledge to cover performance across all levels of the stack: - * Hardware setup and configuration - * Networking and scale considerations - * Operating system setup and configuration (Linux kernel, userspace stack) - * Storage sub-systems (Ceph) - * Cloud infrastructure (OpenStack, RHV) - * Cloud deployments (OpenShift/Kubernetes) - * Product architectures - * Software technologies (databases like Postgres; software-defined networking and storage) - * Product interactions with the underlying hardware - * Tooling to monitor and accomplish repeatable benchmarking - * **Tooling:** The differentiator for our performance engineering team is the data collected through its tools to help tackle performance analysis complexity in the environments where our products are deployed. - - - -### How are open source tools developed or leveraged for performance analysis? - -Tooling is no longer a luxury but a need for today's performance engineering teams. With today's product solutions being so complex (and increasing in complexity as more solutions are composed to solve ever-larger problems), we need tools to help us run performance test suites in a repeatable manner, collect data about those runs, and help us distill that data so it becomes understandable and usable. - -Yet, no performance engineering team is judged on how performance analysis is done, but rather on the results achieved from this analysis. - -This tension can be resolved by collaboratively developing tools. A performance engineering team can't spend all its time developing tools, since that would prevent it from effectively collecting data. By developing its tools in a collaborative manner, a team can leverage work from the community to make further progress while still generating the result by which they will be measured. - -Tooling is the backbone of our performance engineering team, and we strive to use the tools already available upstream. When no tools are available in the community that fit our needs, we've built tools that help us achieve our goals and made them available to the community. Open sourcing our tools has helped us immensely because we receive contributions from our competitors and partners, allowing us to solve problems collectively through collaboration. - -![Performance Engineering Tools][2] - -Following are some of the tools our team has contributed to and rely upon for our work: - - * **[Perf-c2c][3]:** Is your performance impacted by false sharing in CPU caches? The perf-c2c tool can help you tackle this problem by helping you inspect the cache lines where false sharing is detected and understand the readers/writers accessing those cache lines along with the offsets where those accesses occurred. You can read more about this tool on [Joe Mario's blog][4]. - * **[Pbench][5]:** Do you repeat the same steps when collecting data about performance, but fail to do it consistently? Or do you find it difficult to compare results with others because you're collecting different configuration data? Pbench is a tool that attempts to standardize the way data is collected for performance so comparisons and historical reviews are much easier. Pbench is at the heart of our tooling efforts, as most of the other tools consume it in some form. Pbench is a Swiss Army Knife, as it allows the user to run benchmarks such as fio, uperf, or custom, user-defined tests while gathering metrics through tools such as sar, iostat, and pidstat, standardizing the methods of collecting configuration data about the environment. Pbench provides a dashboard UI to help review and analyze the data collected. - * **[Browbeat][6]:** Do you want to monitor a complex environment such as an OpenStack cluster while running tests? Browbeat is the solution, and its power lies in its ability to collect comprehensive data, ranging from logs to system metrics, about an OpenStack cluster while it orchestrates workloads. Browbeat can also monitor the OpenStack cluster while users run test/workloads of their choice either manually or through their own automation. - * **[Ripsaw][7]:** Do you want to compare the performance of different Kubernetes distros against the same platform? Do you want to compare the performance of the same Kubernetes distros deployed on different platforms? Ripsaw is a relatively new tool created to run workloads through Kubernetes native calls using the Ansible operator framework to provide solutions to the above questions. Ripsaw's unique selling point is that it can run against any kind of Kubernetes distribution, thus it would run the same against a Kubernetes cluster, on Minikube, or on an OpenShift cluster deployed on OpenStack or bare metal. - * **[ClusterLoader][8]:** Ever wondered how an OpenShift component would perform under different cluster states? If you are looking for an answer that can stress the cluster, ClusterLoader will help. The team has generalized the tool so it can be used with any Kubernetes distro. It is currently hosted in the [perf-tests repository][9]. - - - -### Bottom line - -Given the scale at which products are evolving rapidly, performance engineering teams need to build tooling to help them keep up with products' evolution and diversification. - -Open source-based software solutions are a collaborative effort of the community. Our performance engineering team operates in the same way, collaborating with the community to address the confusion and complexity that comes with working on a broad spectrum of products. By developing our tools in a collaborative manner and using tools from the community, we are leveraging the community's work to make progress, while still generating the results we are measured on. - -_Collaboration_ is our key to accomplish our goals and ensure the success of our team. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/life-performance-engineer - -作者:[Aakarsh Gopi ][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/aakarsh/users/portante/users/anaga/users/gameloid -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/todo_checklist_team_metrics_report.png?itok=oB5uQbzf (Team checklist and to dos) -[2]: https://opensource.com/sites/default/files/uploads/performanceengineeringtools.png (Performance Engineering Tools) -[3]: http://man7.org/linux/man-pages/man1/perf-c2c.1.html -[4]: https://joemario.github.io/blog/2016/09/01/c2c-blog/ -[5]: https://github.com/distributed-system-analysis/pbench -[6]: https://github.com/openstack/browbeat -[7]: https://github.com/cloud-bulldozer/ripsaw -[8]: https://github.com/openshift/origin/tree/master/test/extended/cluster -[9]: https://github.com/kubernetes/perf-tests/tree/master/clusterloader diff --git a/sources/tech/20190509 Query freely available exchange rate data with ExchangeRate-API.md b/sources/tech/20190509 Query freely available exchange rate data with ExchangeRate-API.md deleted file mode 100644 index 3db9708c81..0000000000 --- a/sources/tech/20190509 Query freely available exchange rate data with ExchangeRate-API.md +++ /dev/null @@ -1,162 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Query freely available exchange rate data with ExchangeRate-API) -[#]: via: (https://opensource.com/article/19/5/exchange-rate-data) -[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) - -Query freely available exchange rate data with ExchangeRate-API -====== -In this interview, ExchangeRate-API's founder explains why exchange rate -data should be freely accessible to developers who want to build useful -stuff. -![scientific calculator][1] - -Last year, [I wrote about][2] using the Groovy programming language to access foreign exchange rate data from an API to simplify my expense records. I showed how two exchange rate sites, [fixer.io][3] and apilayer.net (now [apilayer.com][4]), could provide the data I needed, allowing me to convert between Indian rupees (INR) and Canadian dollars (CAD) using the former, and Chilean pesos (CLP) and Canadian dollars using the latter. - -Recently, David over at [ExchangeRate-API.com][5] reached out to me to say, "the free API you mentioned (Fixer) has been bought by CurrencyLayer and had its no-signup/unlimited access deprecated." He also told me, "I run a free API called ExchangeRate-API.com that has the same JSON format as the original Fixer, doesn't require any signup, and allows unlimited requests." - -After exchanging a few emails, we decided to turn our conversation into an interview. Below the interview, you can find scripts and usage instructions. (The interview has been edited slightly for clarity.) - -### About ExchangeRate-API - -_**Chris:** How is ExchangeRate-API different from other online exchange-rate services? What motivates you to provide this service?_ - -**David:** When I started ExchangeRate-API with a friend in 2010, we built and released it for free because we really needed this service for another project and couldn't find one despite extensive googling. There are now around 20 such APIs offering quite a few different approaches. Over the years, I've tried a number of different approaches, but offering quality data for free has always proven the most popular. I'm also motivated by the thought that this data should be freely accessible to developers who want to build useful stuff even if they don't have a budget. - -Thus, the main difference with our currency conversion API is that it's unlimited and requires no signup. This also makes starting to use it really fast—you literally just copy the endpoint URL and you're good to go. - -There are one or two other free and unlimited APIs, but these typically just serve the daily reference rates provided by the European Central Bank. ExchangeRate-API collects the public reference rates from a number of central banks and then blends them to reduce the risk of outlying values. It also does acceptance checking to ensure the rates aren't wildly wrong (for instance an inverted data capture recording US dollars to CLP instead of CLP to USD) and weights different sources based on their historical accuracy. This makes the service quite reliable. I'm currently working on a transparency project to compare and show the accuracy of this public reference rate blend against a proprietary data source so potential users can make more informed decisions on what type of currency data service is right for them. - -_**Chris:** I'm delighted that you've included Canadian dollars and Indian rupees, as that is one problem I need to solve. I'm sad to see that you don't have Chilean pesos (another problem I need to solve). Can you tell us how you select the list of currencies? Do you anticipate adding other currencies to your list?_ - -**David:** Since my main aim for this service is to offer stable and reliable exchange rate data, I only include currencies when there is more than one data source for that currency code. For instance, after you mentioned that you're looking for CLP data, I added the daily reference rates published by the Central Bank of Chile to our system. If I can find another source that includes CLP, it would be included in our list of supported currencies, but until then, unfortunately not. The goal is to support as many currencies as possible. - -One thing to note is that, for some currencies, the service has the minimum two sources, but a few currency pairs (for instance USD/EUR) are included in almost every set of public reference rates. The transparent accuracy project I mentioned will hopefully make this difference clear so that users can understand why our USD/EUR rate might be more accurate than less common pairs like CLP/INR and also the degree of variance in accuracy between the pairs. It will take some work to make showing this information quick and easy to understand. - -### The API's architecture - -_**Chris:** Can you tell us a bit about your API's architecture? Do you use open source components to deliver your service?_ - -**David:** I exclusively use open source software to run ExchangeRate-API. I'm definitely an open source enthusiast and am always getting friends to switch to open source, explaining licenses, and donating when I can to the projects I use most. I also try to email maintainers of projects I use to say thanks, but I don't do this enough. - -The stack is currently Ubuntu LTS, MariaDB, Nginx, PHP 7, and Memcached. I also use Bootstrap and Picnic open source CSS frameworks. I use Let's Encrypt for HTTPS certificates via the Electronic Frontier Foundation's open source ACME client, [Certbot][6]. The service makes extensive use of classic tools like UFW/iptables, cURL, OpenSSH, and Git. - -My approach is typically to keep everything as simple as possible while using the tried-and-tested open source building blocks. For a project that aims to _always_ be available for users to convert currencies, this feels like the best route to reliability. I love reading about innovative new projects that could be useful for a project like this (for example, CockroachDB), but I wouldn't use them until they are considered really bulletproof. Obviously, things like [Heartbleed][7] show that there are risks with "boring" projects too—but I think these are easier to manage than the potential for unknown risks with newer, cutting-edge projects. - -In terms of the infrastructure setup, I've steadily built and improved the system over the last nine years, and it now comprises roughly three tiers. The main cluster runs on Amazon Web Services (AWS) and consists of Ubuntu EC2 servers and a high-availability MariaDB relational database service (RDS) instance. The EC2 instances are spread across multiple AWS Availability Zones and fronted by the managed AWS Elastic Load Balancing (ELB) service. Between the RDS database instance with automated cross-zone failover and the ELB-fronted EC2 instances spread across availability zones, this setup is exceptionally available. It is, however, only in one locale. So I've set up a second tier of virtual private server (VPS) instances in different geographic locations to reduce latency and distribute the load away from the more expensive AWS infrastructure. These are currently with Linode, but I have also used DigitalOcean and Vultr recently. - -Finally, this is all protected behind Cloudflare. With a free service, it's inevitable that some users will choose to abuse the system, and Cloudflare is an amazing product that's vital to ExchangeRate-API. Our servers can be protected and our users get low-latency, in-region caches. Cloudflare is set up with both the load balancing and traffic steering products to reduce latency and instantly shift traffic from unhealthy parts of the infrastructure to available origins. - -With this very redundant approach, there hasn't been downtime as a result of infrastructure problems or user load for around three years. The few periods of degraded service experienced in this time are all due to issues with code, deployment strategy, or config mistakes. The setup currently handles hundreds of millions of requests per month with low load levels and manageable costs, so there's plenty of room for growth. - -The actual application code is PHP with heavy use of Memcached. Memcached is an amazing open source project started by Brad Fitzpatrick in 2003. It's not particularly glamorous, but it is an incredibly reliable and performant distributed in-memory key value store. - -### Engaging with the open source community - -_**Chris:** There is an impressive amount of open source in your configuration. How do you engage with the broader community of users in these projects?_ - -**David:** I really struggle with the best way to be a good open source citizen while running a side project SaaS. I've considered building an open source library of some sort and releasing it, but I haven't thought of something that hasn't already been done and that I would be able to make the time commitment to reliably maintain. I'd only start a project like this if I could be confident I'd have the time to ensure users who choose the project wouldn't suddenly find themselves depending on abandonware. I've also looked into contributing to the projects that ExchangeRate-API depends on, but since I only use the biggest, most established options, I lack the expertise to make a meaningful contribution to such serious projects. - -I'm currently working on a new "Pro" plan for the service and I'm going to set a percentage of this income to donate to my open source dependencies. This still feels like a bandage though—answering this question makes me realize I need to put more time into starting an open source project that calls ExchangeRate-API home! - -### Looking ahead - -_**Chris:** We can only query the latest exchange rate, but it appears that you may be offering historical rates sometime later this year. Can you tell us more about the technical challenges with serving up historical data?_ - -**David:** There is a dataset of historical rates blended using our same algorithm from multiple central bank reference sets. However, I stopped new signups for it due to some issues with the data quality. The dataset reaches back to 1990, and there were a few earlier periods that need better data validation. As such, I'm building a better system for checking and comparing the data as it's ingested as well as adding an additional data source. The plan is to have a clean and more comprehensively verified-as-accurate dataset available later this year. - -In terms of the technical side of things, historical data is slightly more complex than live data. Compared to the live dataset (which is just a few bytes) the historical data is millions of database rows. This data was originally served from the database infrastructure with a long time-to-live (TTL) intermediary-caching layer. This was largely performant but struggled in situations where users wanted to dump the entire dataset as fast as the network could handle it. If the cache was sufficiently warm, this was fine, but if reboots, new server deployments, etc. had taken place recently, these big request sets would "miss" enough on the cache that the database would have problematic load spikes. - -Obviously, the goal is an infrastructure that can handle even aggressive use cases with normal performance, so the new historical rates dataset will be accompanied by a preemptive in-memory cache rather than a request-driven one. Thankfully, RAM is cheap these days, and putting a couple hundred megabytes of data entirely into RAM is a plausible approach even for a small project like ExchangeRate-API.com. - -_**Chris:** It sounds like you've been through quite a few iterations of this service to get to where it is today! Where do you see it going in the next few years?_ - -**David:** I'd aim for it to have reached coverage of every world currency so that anyone looking for this sort of software can easily and programmatically get the exchange rates they need for free. - -I'd also definitely like to have an affordable Pro plan that really resonates with users. Getting this right would mean better infrastructure and lower latency for free users as well. - -Finally, I'd like to have some sort of useful open source library under the ExchangeRate-API banner. Starting a small project that finds an enthusiastic community would be really rewarding. It's great to run something that's free-as-in-beer, but it would be even better if part of it was free-as-in-speech, as well. - -### How to use the service - -It's easy enough to test out the service using **wget** , as follows: - - -``` -clh@marseille:~$ wget -O - -\--2019-04-26 13:48:23-- -Resolving api.exchangerate-api.com (api.exchangerate-api.com)... 2606:4700:20::681a:c80, 2606:4700:20::681a:d80, 104.26.13.128, ... -Connecting to api.exchangerate-api.com (api.exchangerate-api.com)|2606:4700:20::681a:c80|:443... connected. -HTTP request sent, awaiting response... 200 OK -Length: unspecified [application/json] -Saving to: ‘STDOUT’ - -\- [<=> -] 0 --.-KB/s {"base":"INR","date":"2019-04-26","time_last_updated":1556236800,"rates":{"INR":1,"AUD":0.020343,"BRL":0.056786,"CAD":0.019248,"CHF":0.014554,"CNY":0.096099,"CZK":0.329222,"DKK":0.095497,"EUR":0.012789,"GBP":0.011052,"HKD":0.111898,"HUF":4.118615,"IDR":199.61769,"ILS":0.051749,"ISK":1.741659,"JPY":1.595527,"KRW":16.553091,"MXN":0.272383,"MYR":0.058964,"NOK":0.123365,"NZD":0.02161,"PEN":0.047497,"PHP":0.744974,"PLN":0.054927,"RON":0.060923,"RUB":0.921808,"SAR":0.053562,"SEK":0.135226,"SGD":0.019442,"THB":0.457501,"TRY":0- [ <=> ] 579 --.-KB/s in 0s - -2019-04-26 13:48:23 (15.5 MB/s) - written to stdout [579] - -clh@marseille:~$ -``` - -The result is returned as a JSON payload, giving conversion rates from Indian rupees (the currency I requested in the URL) to all the currencies handled by ExchangeRate-API. - -The Groovy shell can access the API: - - -``` -clh@marseille:~$ groovysh -Groovy Shell (2.5.3, JVM: 1.8.0_212) -Type ':help' or ':h' for help. -\---------------------------------------------------------------------------------------------------------------------------------- -groovy:000> import groovy.json.JsonSlurper -===> groovy.json.JsonSlurper -groovy:000> result = (new JsonSlurper()).parse( -groovy:001> new InputStreamReader((new URL(')) -groovy:002> ) -===> [base:INR, date:2019-04-26, time_last_updated:1556236800, rates:[INR:1, AUD:0.020343, BRL:0.056786, CAD:0.019248, CHF:0.014554, CNY:0.096099, CZK:0.329222, DKK:0.095497, EUR:0.012789, GBP:0.011052, HKD:0.111898, HUF:4.118615, IDR:199.61769, ILS:0.051749, ISK:1.741659, JPY:1.595527, KRW:16.553091, MXN:0.272383, MYR:0.058964, NOK:0.123365, NZD:0.02161, PEN:0.047497, PHP:0.744974, PLN:0.054927, RON:0.060923, RUB:0.921808, SAR:0.053562, SEK:0.135226, SGD:0.019442, THB:0.457501, TRY:0.084362, TWD:0.441385, USD:0.014255, ZAR:0.206271]] -groovy:000> -``` - -The same JSON payload is returned as a result of the Groovy JSON slurper operating on the URL. Of course, since this is Groovy, the JSON is converted into a Map, so you can do stuff like this: - - -``` -groovy:000> println result.base -INR -===> null -groovy:000> println result.date -2019-04-26 -===> null -groovy:000> println result.rates.CAD -0.019248 -===> null -``` - -And that's it! - -Do you use ExchangeRate-API or a similar service? Share how you use exchange rate data in the comments. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/exchange-rate-data - -作者:[Chris Hermansen ][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/clhermansen -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calculator_money_currency_financial_tool.jpg?itok=2QMa1y8c (scientific calculator) -[2]: https://opensource.com/article/18/3/groovy-calculate-foreign-exchange -[3]: https://fixer.io/ -[4]: https://apilayer.com/ -[5]: https://www.exchangerate-api.com/ -[6]: https://certbot.eff.org/ -[7]: https://en.wikipedia.org/wiki/Heartbleed diff --git a/sources/tech/20190509 Red Hat Enterprise Linux (RHEL) 8 Installation Steps with Screenshots.md b/sources/tech/20190509 Red Hat Enterprise Linux (RHEL) 8 Installation Steps with Screenshots.md deleted file mode 100644 index 0b2d9e55c6..0000000000 --- a/sources/tech/20190509 Red Hat Enterprise Linux (RHEL) 8 Installation Steps with Screenshots.md +++ /dev/null @@ -1,256 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Red Hat Enterprise Linux (RHEL) 8 Installation Steps with Screenshots) -[#]: via: (https://www.linuxtechi.com/rhel-8-installation-steps-screenshots/) -[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) - -Red Hat Enterprise Linux (RHEL) 8 Installation Steps with Screenshots -====== - -Red Hat has released its most awaited OS **RHEL 8** on 7th May 2019. RHEL 8 is based on **Fedora 28** distribution and Linux **kernel version 4.18**. One of the important key features in RHEL 8 is that it has introduced “ **Application Streams** ” which allows developers tools, frameworks and languages to be updated frequently without impacting the core resources of base OS. In other words, application streams will help to segregate the users space packages from OS Kernel Space. - -Apart from this, there are many new features which are noticed in RHEL 8 like: - - * XFS File system supports copy-on-write of file extents - * Introduction of Stratis filesystem, Buildah, Podman, and Skopeo - * Yum utility is based on DNF - * Chrony replace NTP. - * Cockpit is the default Web Console tool for Server management. - * OpenSSL 1.1.1 & TLS 1.3 support - * PHP 7.2 - * iptables replaced by nftables - - - -### Minimum System Requirements for RHEL 8: - - * 4 GB RAM - * 20 GB unallocated disk space - * 64-bit x86 or ARM System - - - -**Note:** RHEL 8 supports the following architectures: - - * AMD or Intel x86 64-bit - * 64-bit ARM - * IBM Power Systems, Little Endian & IBM Z - - - -In this article we will demonstrate how to install RHEL 8 step by step with screenshots. - -### RHEL 8 Installation Steps with Screenshots - -### Step:1) Download RHEL 8.0 ISO file - -Download RHEL 8 iso file from its official web site, - - - -I am assuming you have the active subscription if not then register yourself for evaluation and then download ISO file - -### Step:2) Create Installation bootable media (USB or DVD) - -Once you have downloaded RHEL 8 ISO file, make it bootable by burning it either into a USB drive or DVD. Reboot the target system where you want to install RHEL 8 and then go to its bios settings and set the boot medium as USB or DVD, - -### Step:3) Choose “Install Red Hat Enterprise Linux 8.0” option - -When the system boots up with installation media (USB or DVD), we will get the following screen, choose “ **Install Red Hat Enterprise Linux 8.0** ” and hit enter, - - - -### Step:4) Choose your preferred language for RHEL 8 installation - -In this step, you need to choose a language that you want to use for RHEL 8 installation, so make a selection that suits to your setup. - - - -Click on Continue - -### Step:5) Preparing RHEL 8 Installation - -In this step we will decide the installation destination for RHEL 8, apart from this we can configure the followings: - - * Time Zone - * Kdump (enabled/disabled) - * Software Selection (Packages) - * Networking and Hostname - * Security Policies & System purpose - - - - - -By default, installer will automatically pick time zone and will enable the **kdump** , if wish to change the time zone then click on “ **Time & Date**” option and set your preferred time zone and then click on Done. - - - -To configure IP address and Hostname click on “ **Network & Hostname**” option from installation summary screen, - -If your system is connected to any switch or modem, then it will try to get IP from DHCP server otherwise we can configure IP manually. - -Mention the hostname that you want to set and then click on “ **Apply”**. Once you are done with IP address and hostname configuration click on “Done” - - - -To define the installation disk and partition scheme for RHEL 8, click on “ **Installation Destination** ” option, - - - -Click on Done - -As we can see I have around 60 GB free disk space on sda drive, I will be creating following customize lvm based partitions on this disk, - - * /boot = 2GB (xfs file system) - * / = 20 GB (xfs file system) - * /var = 10 GB (xfs file system) - * /home = 15 GB (xfs file system) - * /tmp = 5 GB (xfs file system) - * Swap = 2 GB (xfs file system) - - - -**Note:** If you don’t want to create manual partitions then select “ **Automatic** ” option from Storage Configuration Tab - - - -Let’s create our first partition as /boot of size 2 GB, Select LVM as mount point partitioning scheme and then click on + “plus” symbol, - - - -Click on “ **Add mount point** ” - - - -To create next partition as / of size 20 GB, click on + symbol and specify the details as shown below, - - - -Click on “Add mount point” - - - -As we can see installer has created the Volume group as “ **rhel_rhel8** “, if you want to change this name then click on Modify option and specify the desired name and then click on Save - - - -Now onward all partitions will be part of Volume Group “ **VolGrp** ” - -Similarly create next three partitions **/home** , **/var** and **/tmp** of size 15GB, 10 GB and 5 GB respectively - -**/home partition:** - - - -**/var partition:** - - - -**/tmp partition:** - - - -Now finally create last partition as swap of size of 2 GB, - - - -Click on “Add mount point” - -Once you are done with partition creations, click on Done on Next screen, example is shown below - - - -In the next window, choose “ **Accept Changes** ” - - - -### Step:6) Select Software Packages and Choose Security Policy and System purpose - -After accepting the changes in above step, we will be redirected to installation summary window. - -By default, installer will select “ **Server with GUI”** as software packages and if you want to change it then click on “ **Software Selection** ” option and choose your preferred “ **Basic Environment** ” - - - -Click on Done - -If you want to set the security policies during the installation, the choose the required profile from Security polices option else you can leave as it is. - -From “ **System Purpose** ” option specify the Role, Red Hat Service Level Agreement and Usage. Though You can leave this option as it is. - - - -Click on Done to proceed further. - -### Step:7) Choose “Begin Installation” option to start installation - -From the Installation summary window click on “Begin Installation” option to start the installation, - - - -As we can see below RHEL 8 Installation is started & is in progress - - - -Set the root password, - - - -Specify the local user details like its Full Name, user name and its password, - - - -Once the installation is completed, installer will prompt us to reboot the system, - - - -Click on “Reboot” to restart your system and don’t forget to change boot medium from bios settings so that system boots up with hard disk. - -### Step:8) Initial Setup after installation - -When the system is rebooted first time after the successful installation then we will get below window there we need to accept the license (EULA), - - - -Click on Done, - -In the next Screen click on “ **Finish Configuration** ” - - - -### Step:8) Login Screen of RHEL 8 Server after Installation - -As we have installed RHEL 8 Server with GUI, so we will get below login screen, use the same user name and password that we created during the installation - - - -After the login we will get couple of Welcome Screen and follow the screen instructions and then finally we will get the following screen, - - - -Click on “Start Using Red Hat Enterprise Linux” - - - -This confirms that we have successfully installed RHEL 8, that’s all from this article. We will be writing articles on RHEL 8 in the coming future till then please do share your feedback and comments on this article. - -Read Also :** [How to Setup Local Yum/DNF Repository on RHEL 8 Server Using DVD or ISO File][1]** - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/rhel-8-installation-steps-screenshots/ - -作者:[Pradeep Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/pradeep/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/setup-local-yum-dnf-repository-rhel-8/ diff --git a/sources/tech/20190510 5 open source hardware products for the great outdoors.md b/sources/tech/20190510 5 open source hardware products for the great outdoors.md deleted file mode 100644 index 357fbfdcb8..0000000000 --- a/sources/tech/20190510 5 open source hardware products for the great outdoors.md +++ /dev/null @@ -1,96 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (5 open source hardware products for the great outdoors) -[#]: via: (https://opensource.com/article/19/5/hardware-outdoors) -[#]: author: (Michael Weinberg https://opensource.com/users/mweinberg/users/aliciagibb) - -5 open source hardware products for the great outdoors -====== -Here's some equipment you can buy or make yourself for hitting the great -outdoors, no generators or batteries required. -![Tree clouds][1] - -When people think about open source hardware, they often think about the general category of electronics that can be soldered and needs batteries. While there are [many][2] fantastic open source pieces of electronics, the overall category of open source hardware is much broader. This month we take a look at open source hardware that you can take out into the world, no power outlet or batteries required. - -### Hummingbird Hammocks - -[Hummingbird Hammocks][3] offers an entire line of open source camping gear. You can set up an open source [rain tarp][4]... - -![An open source rain tarp from Hummingbird Hammocks][5] - -...with open source [friction adjusters][6] - -![Open source friction adjusters from Hummingbird Hammocks.][7] - -Open source friction adjusters from Hummingbird Hammocks. - -...over your open source [hammock][8] - -![An open source hammock from Hummingbird Hammocks.][9] - -An open source hammock from Hummingbird Hammocks. - -...hung with open source [tree straps][10]. - -![Open source tree straps from Hummingbird Hammocks.][11] - -Open source tree straps from Hummingbird Hammocks. - -The design for each of these items is fully documented, so you can even use them as a starting point for making your own outdoor gear (if you are willing to trust friction adjusters you design yourself). - -### Openfoil - -[Openfoil][12] is an open source hydrofoil for kitesurfing. Hydrofoils are attached to the bottom of kiteboards and allow the rider to rise out of the water. This aspect of the design makes riding in low wind situations and with smaller kites easier. It can also reduce the amount of noise the board makes on the water, making for a quieter experience. Because this hydrofoil is open source you can customize it to your needs and adventure tolerance. - -![Openfoil, an open source hydrofoil for kitesurfing.][13] - -Openfoil, an open source hydrofoil for kitesurfing. - -### Solar water heater - -If you prefer your outdoors-ing a bit closer to home, you could build this open source [solar water heater][14] created by the [Anisa Foundation][15]. This appliance focuses energy from the sun to heat water that can then be used in your home, letting you reduce your carbon footprint without having to give up long, hot showers. Of course, you can also [monitor its temperature ][16]over the internet if you need to feel connected. - -![An open source solar water heater from the Anisa Foundation.][17] - -An open source solar water heater from the Anisa Foundation. - -## Wrapping up - -As these projects make clear, open source hardware is more than just electronics. You can take it with you to the woods, to the beach, or just to your roof. Next month we’ll talk about open source instruments and musical gear. Until then, [certify][18] your open source hardware! - -Learn how and why you may want to start using the Open Source Hardware Certification logo on an... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/hardware-outdoors - -作者:[Michael Weinberg][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mweinberg/users/aliciagibb -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life_tree_clouds.png?itok=b_ftihhP (Tree clouds) -[2]: https://certification.oshwa.org/list.html -[3]: https://hummingbirdhammocks.com/ -[4]: https://certification.oshwa.org/us000102.html -[5]: https://opensource.com/sites/default/files/uploads/01-hummingbird_hammocks_rain_tarp.png (An open source rain tarp from Hummingbird Hammocks) -[6]: https://certification.oshwa.org/us000105.html -[7]: https://opensource.com/sites/default/files/uploads/02-hummingbird_hammocks_friction_adjusters_400_px.png (Open source friction adjusters from Hummingbird Hammocks.) -[8]: https://certification.oshwa.org/us000095.html -[9]: https://opensource.com/sites/default/files/uploads/03-hummingbird_hammocks_hammock_400_px.png (An open source hammock from Hummingbird Hammocks.) -[10]: https://certification.oshwa.org/us000098.html -[11]: https://opensource.com/sites/default/files/uploads/04-hummingbird_hammocks_tree_straps_400_px_0.png (Open source tree straps from Hummingbird Hammocks.) -[12]: https://certification.oshwa.org/fr000004.html -[13]: https://opensource.com/sites/default/files/uploads/05-openfoil-original_size.png (Openfoil, an open source hydrofoil for kitesurfing.) -[14]: https://certification.oshwa.org/mx000002.html -[15]: http://www.fundacionanisa.org/index.php?lang=en -[16]: https://thingspeak.com/channels/72565 -[17]: https://opensource.com/sites/default/files/uploads/06-solar_water_heater_500_px.png (An open source solar water heater from the Anisa Foundation.) -[18]: https://certification.oshwa.org/ diff --git a/sources/tech/20190510 Keeping an open source project alive when people leave.md b/sources/tech/20190510 Keeping an open source project alive when people leave.md deleted file mode 100644 index 31a0ab7412..0000000000 --- a/sources/tech/20190510 Keeping an open source project alive when people leave.md +++ /dev/null @@ -1,180 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Keeping an open source project alive when people leave) -[#]: via: (https://opensource.com/article/19/5/code-missing-community-management) -[#]: author: (Rodrigo Duarte Sousa https://opensource.com/users/rodrigods/users/tellesnobrega) - -Keeping an open source project alive when people leave -====== -How to find out what's done, what's not, and what's missing. -![][1] - -Suppose you wake up one day and decide to finally use that recipe video you keep watching all over social media. You get the ingredients, organize the necessary utensils, and start to follow the recipe steps. You cut this, cut that, then start heating the oven at the same time you put butter and onions in a pan. Then, your phone reminds you: you have a dinner appointment with your boss, and you're already late! You turn off everything and leave immediately, stopping the cooking process somewhere near the end. - -Some minutes later, your roommate arrives at home ready to have dinner and finds only the _ongoing work_ in the kitchen. They have the following options: - - 1. Clean up the mess and start cooking something from scratch. - 2. Order dinner and don’t bother to cook and/or fix the mess you left. - 3. Start cooking “around” the mess you left, which will probably take more time since most of the utensils are dirty and there isn’t much space left in the kitchen. - - - -If you left the printed version of the recipe somewhere, your roommate also has a fourth option. They could finish what you started! The problem is that they have no idea what's missing. It is not like you crossed out each completed step. Their best bet is either to call you or to examine all of your _changes_ to infer what is missing. - -In this example, the kitchen is like a software project, the utensils are the code, and the recipe is a new feature being implemented. Leaving something behind is not usually doable in a company's private project since you're accountable for your work and—in a scenario where you need to leave—it's almost certain that there is someone tracking/following the project, so they avoid having a "single point of failure." With open source projects, though, this continuity rarely happens. So how can we in the open source community deal with legacy, unfinished code, or code that is completed but no one dares touch it? - -### Knowledge legacy in open source projects - -We have always felt that open source is one of the best ways for an inexperienced software engineer to improve her skills. For many, open source projects offer their first hands-on experience with particular tools. [Version control systems][2], [unit][3] and [integration][4] tests, [continuous delivery][5], [code reviews][6], [features planning][7], [bug reporting/fixing][8], and more. - -In addition to learning opportunities, we can also view open source projects as a career opportunity—many senior engineers in the community get paid to be there, and you can add your contributions to your resume. That’s pretty cool. There's nothing like learning while improving your resume and getting potential employers' attention so you can pay your rent. - -Is this whole situation an infinite loop where everyone wins? The answer is obviously no. This post focuses on one of the main issues that arise in any project: the [bus/truck factor][9]. In the open source context, specifically, when people experience major changes such as a new job or other more personal factors, they tend to leave the community. We will first describe the problems that can arise from people leaving their _recipes_ unfinished by using [OpenStack][10] as an example. Then, we'll try to discuss some ideas to try to mitigate the issues. - -### Common problems - -In the past few years, we've seen a lot of changes in the [OpenStack][11] community, where some projects lost some portion of their active contributors team. These losses led to incomplete work and even finished modules without clear maintainers. Below are other examples of what happens when people suddenly leave. While this article uses OpenStack terms, such as “specs,” these issues easily apply to software development in general: - - * **Broken documentation:** A new API or setting either wasn't documented, or it was documented but not implemented. - * **Hard to resolve knowledge deficits:** For example, a new requirement and/or feature requires part of the code to be refactored but no one has the necessary expertise. - * **Incomplete features:** What are the missing tasks required for each feature? Which tasks were completed? - * **Debugging drama:** If the person who wrote the code isn't there, meaning that it takes a lot of engineering hours just to decrypt—so to speak—the code path that needs to be fixed. - - - -To illustrate, we will use the [Project Tree Deletion][12] feature. Project Tree Deletion is a tiny feature that one of us proposed more than three years ago and couldn’t complete. Basically, the main goal was to enable an OpenStack user/operator to erase a whole branch of projects without having to manually disable/delete every single of them starting from the leaves. Very straightforward, right? The PTD spec has been merged and has the following _work items_ : - - * Update API spec documentation. - * Add new rules to the file **policy.json**. - * Add new endpoints to mirror the new features. - * Implement the new deletion/disabling behavior for the project’s hierarchy. - - - -What about the sequence of steps (roadmap) to get these work items done? How do we know where to start and when what to tackle next? Are there any logical dependencies between the work items? How do we know where to start, and with what? - -Also, how do we know which work has been completed (if any)? One of the things that we do is look in the [blueprint][13] and/or the new [bug tracker][14], for example: - - * Recursive deletion and project disabling: (merged) - * API changes for Reseller: (merged) - * Add parent_id to GET /projects: (merged) - * Manager support for project cascade update: (merged) - * API support for cascade update: (abandoned) - * Manager support for project delete cascade: (merged) - * API support for project cascade delete: (abandoned) - * Add backend support for deleting a projects list: (merged) - * Test list project hierarchy is correct for a large tree: (merged) - * Fix cascade operations documentation: (merged) - * Revert “Fix cascade operations documentation”: (merged) - * Remove the APIs from the doc that aren't supported yet: (merged) - - - -Here we can see a lot of merged patches, but also that some were abandoned, and that some include the words Revert and Remove in their titles. Now we have strong evidence that this work is not completed, but at least some work was started to clean it up and avoid exposing something incomplete in the service API. Let’s dig a little bit deeper and look at the [_current_ delete project code][15]. - -There, we can see an added **cascade** argument (“cascade” resembles deleting related things together, so this argument must be somehow related to the proposed feature), and that it has a special block to treat the cases for the possible values of **cascade** : - - -``` -`def _delete_project(self, project, initiator=None, cascade=False):`[/code] [code] - -if cascade: -# Getting reversed project's subtrees list, i.e. from the leaves -# to the root, so we do not break parent_id FK. -subtree_list = self.list_projects_in_subtree(project_id) -subtree_list.reverse() -if not self._check_whole_subtree_is_disabled( -project_id, subtree_list=subtree_list): -raise exception.ForbiddenNotSecurity( -_('Cannot delete project %(project_id)s since its subtree ' -'contains enabled projects.') -% {'project_id': project_id}) - -project_list = subtree_list + [project] -projects_ids = [x['id'] for x in project_list] - -ret = self.driver.delete_projects_from_ids(projects_ids) -for prj in project_list: -self._post_delete_cleanup_project(prj['id'], prj, initiator) -else: -ret = self.driver.delete_project(project_id) -self._post_delete_cleanup_project(project_id, project, initiator) -``` - -What about the callers of this function? Do they use **cascade** at all? If we search for it, we only find occurrences in the backend tests: - - -``` -$ git grep "delete_project" | grep "cascade" | grep -v "def" -keystone/tests/unit/resource/test_backends.py: PROVIDERS.resource_api.delete_project(root_project['id'], cascade=True) -keystone/tests/unit/resource/test_backends.py: PROVIDERS.resource_api.delete_project(p1['id'], cascade=True) -``` - -We can also confirm this finding by looking at the [delete projects API implementation][16]. - -So it seems that we have a problem here, something simple that I started was left behind a very long time ago. How could the community or I have prevented this from happening? - -From the example above, one of the most apparent problems is the lack of a clear roadmap and list of completed tasks somewhere. To follow the actual implementation status, we had to dig into the blueprint/bug comments and the code. - -Based on this issue, we can sketch an idea: for each new feature, we need a roadmap stored somewhere to reflect the implementation status. Once the roadmap is defined within a spec, we can track each step as a [Launchpad][17] entry, for example, and have a better view of the progress status of that spec. - -Of course, these steps won’t prevent unfinished projects and they add a little bit of process, but following them can give a better view of what's missing so someone else from the community could finish or even revert what's there. - -### That’s not all - -What about other aspects of the project besides feature completion? We shouldn’t expect that every person on the core team is an expert in every single project module. This issue highlights another very important aspect of any open source community: mentoring. - -New people come to the community all the time and many have an incentive to continuing coming back as we discussed earlier. However, are our current community members willing to mentor them? How many times have you participated as a mentor in a program such as [Outreachy ][18]or [Google Summer of Code][19], or taken time to answer questions in the project’s chat? - -We also know that people eventually move on to other open source communities, so we have the chance of not leaving what we learned behind. We can always transmit that knowledge directly to those who are currently interested and actively asking questions, or indirectly, by writing documentation, blog posts, giving talks, and so forth. - -In order to have a healthy open source community, knowledge can’t be dominated by few people. We need to make an effort to have as many people capable of moving the project forward as possible. Also, a key aspect of mentoring is not only related to coding, but also to leadership skills. Preparing people to take roles like Project Team Lead, joining the Technical Committee, and so on is crucial if we intend to see the community grow even when we're not around anymore. - -Needless to say, mentoring is also an important skill for climbing the engineering ladder in most companies. Consider that another motivation. - -### To conclude - -Open source should not be treated as only the means to an end. Collaboration is a crucial part of these projects, and alongside mentoring, should always be treated as a first citizen in any open source community. And, of course, we will fix the unfinished spec used as this article's example. - -If you are part of an open source community, it is your responsibility to be focusing on sharing your knowledge while you are still around. Chances are that no one is going to tell you to do so, it should be part of the routine of any open source collaborator. - -What are other ways of sharing knowledge? What are your thoughts and ideas about the issue? - -_This original article was posted on[rodrigods][20]._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/code-missing-community-management - -作者:[Rodrigo Duarte Sousa][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/rodrigods/users/tellesnobrega -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BIZ_question_B.png?itok=f88cyt00 -[2]: https://en.wikipedia.org/wiki/Version_control -[3]: https://en.wikipedia.org/wiki/Unit_testing -[4]: https://en.wikipedia.org/wiki/Integration_testing -[5]: https://en.wikipedia.org/wiki/Continuous_delivery -[6]: https://en.wikipedia.org/wiki/Code_review -[7]: https://www.agilealliance.org/glossary/sprint-planning/ -[8]: https://www.softwaretestinghelp.com/how-to-write-good-bug-report/ -[9]: https://en.wikipedia.org/wiki/Bus_factor -[10]: https://www.openstack.org/ -[11]: /resources/what-is-openstack -[12]: https://review.opendev.org/#/c/148730/35 -[13]: https://blueprints.launchpad.net/keystone/+spec/project-tree-deletion -[14]: https://bugs.launchpad.net/keystone/+bug/1816105 -[15]: https://github.com/openstack/keystone/blob/master/keystone/resource/core.py#L475-L519 -[16]: https://github.com/openstack/keystone/blob/master/keystone/api/projects.py#L202-L214 -[17]: https://launchpad.net -[18]: https://www.outreachy.org/ -[19]: https://summerofcode.withgoogle.com/ -[20]: https://blog.rodrigods.com/knowledge-legacy-the-issue-of-passing-the-baton/ diff --git a/sources/tech/20190510 Learn to change history with git rebase.md b/sources/tech/20190510 Learn to change history with git rebase.md deleted file mode 100644 index 4d46fef81f..0000000000 --- a/sources/tech/20190510 Learn to change history with git rebase.md +++ /dev/null @@ -1,597 +0,0 @@ -Translating by Scoutydren.... - - -[#]: collector: (lujun9972) -[#]: translator: (Scoutydren) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Learn to change history with git rebase!) -[#]: via: (https://git-rebase.io/) -[#]: author: (git-rebase https://git-rebase.io/) - -Learn to change history with git rebase! -====== -One of Git 's core value-adds is the ability to edit history. Unlike version control systems that treat the history as a sacred record, in git we can change history to suit our needs. This gives us a lot of powerful tools and allows us to curate a good commit history in the same way we use refactoring to uphold good software design practices. These tools can be a little bit intimidating to the novice or even intermediate git user, but this guide will help to demystify the powerful git-rebase . - -``` -A word of caution : changing the history of public, shared, or stable branches is generally advised against. Editing the history of feature branches and personal forks is fine, and editing commits that you haven't pushed yet is always okay. Use git push -f to force push your changes to a personal fork or feature branch after editing your commits. -``` - -Despite the scary warning, it's worth mentioning that everything mentioned in this guide is a non-destructive operation. It's actually pretty difficult to permanently lose data in git. Fixing things when you make mistakes is covered at the end of this guide. - -### Setting up a sandbox - -We don't want to mess up any of your actual repositories, so throughout this guide we'll be working with a sandbox repo. Run these commands to get started: - -``` -git init /tmp/rebase-sandbox -cd /tmp/rebase-sandbox -git commit --allow-empty -m"Initial commit" -``` - -If you run into trouble, just run rm -rf /tmp/rebase-sandbox and run these steps again to start over. Each step of this guide can be run on a fresh sandbox, so it's not necessary to re-do every task. - - -### Amending your last commit - -Let's start with something simple: fixing your most recent commit. Let's add a file to our sandbox - and make a mistake: - -``` -echo "Hello wrold!" >greeting.txt - git add greeting.txt - git commit -m"Add greeting.txt" -``` - -Fixing this mistake is pretty easy. We can just edit the file and commit with `--amend`, like so: - -``` -echo "Hello world!" >greeting.txt - git commit -a --amend -``` - -Specifying `-a` automatically stages (i.e. `git add`'s) all files that git already knows about, and `--amend` will squash the changes into the most recent commit. Save and quit your editor (you have a chance to change the commit message now if you'd like). You can see the fixed commit by running `git show`: - -``` -commit f5f19fbf6d35b2db37dcac3a55289ff9602e4d00 (HEAD -> master) -Author: Drew DeVault -Date: Sun Apr 28 11:09:47 2019 -0400 - - Add greeting.txt - -diff --git a/greeting.txt b/greeting.txt -new file mode 100644 -index 0000000..cd08755 ---- /dev/null -+++ b/greeting.txt -@@ -0,0 +1 @@ -+Hello world! -``` - -### Fixing up older commits - -Amending only works for the most recent commit. What happens if you need to correct an older commit? Let's start by setting up our sandbox accordingly: - -``` -echo "Hello!" >greeting.txt -git add greeting.txt -git commit -m"Add greeting.txt" - -echo "Goodbye world!" >farewell.txt -git add farewell.txt -git commit -m"Add farewell.txt" -``` - -Looks like `greeting.txt` is missing "world". Let's write a commit normally which fixes that: - -``` -echo "Hello world!" >greeting.txt -git commit -a -m"fixup greeting.txt" -``` - -So now the files look correct, but our history could be better - let's use the new commit to "fixup" the last one. For this, we need to introduce a new tool: the interactive rebase. We're going to edit the last three commits this way, so we'll run `git rebase -i HEAD~3` (`-i` for interactive). This'll open your text editor with something like this: - -``` -pick 8d3fc77 Add greeting.txt -pick 2a73a77 Add farewell.txt -pick 0b9d0bb fixup greeting.txt - -# Rebase f5f19fb..0b9d0bb onto f5f19fb (3 commands) -# -# Commands: -# p, pick = use commit -# f, fixup = like "squash", but discard this commit's log message -``` - -This is the rebase plan, and by editing this file you can instruct git on how to edit history. I've trimmed the summary to just the details relevant to this part of the rebase guide, but feel free to skim the full summary in your text editor. - -When we save and close our editor, git is going to remove all of these commits from its history, then execute each line one at a time. By default, it's going to pick each commit, summoning it from the heap and adding it to the branch. If we don't edit this file at all, we'll end up right back where we started, picking every commit as-is. We're going to use one of my favorite features now: fixup. Edit the third line to change the operation from "pick" to "fixup" and move it to immediately after the commit we want to "fix up": - -``` -pick 8d3fc77 Add greeting.txt -fixup 0b9d0bb fixup greeting.txt -pick 2a73a77 Add farewell.txt -``` - -**Tip** : We can also abbreviate this with just "f" to speed things up next time. - -Save and quit your editor - git will run these commands. We can check the log to verify the result: - -``` -$ git log -2 --oneline -fcff6ae (HEAD -> master) Add farewell.txt -a479e94 Add greeting.txt -``` - -### Squashing several commits into one - -As you work, you may find it useful to write lots of commits as you reach small milestones or fix bugs in previous commits. However, it may be useful to "squash" these commits together, to make a cleaner history before merging your work into master. For this, we'll use the "squash" operation. Let's start by writing a bunch of commits - just copy and paste this if you want to speed it up: - -``` -git checkout -b squash -for c in H e l l o , ' ' w o r l d; do - echo "$c" >>squash.txt - git add squash.txt - git commit -m"Add '$c' to squash.txt" -done -``` - -That's a lot of commits to make a file that says "Hello, world"! Let's start another interactive rebase to squash them together. Note that we checked out a branch to try this on, first. Because of that, we can quickly rebase all of the commits since we branched by using `git rebase -i master`. The result: - -``` -pick 1e85199 Add 'H' to squash.txt -pick fff6631 Add 'e' to squash.txt -pick b354c74 Add 'l' to squash.txt -pick 04aaf74 Add 'l' to squash.txt -pick 9b0f720 Add 'o' to squash.txt -pick 66b114d Add ',' to squash.txt -pick dc158cd Add ' ' to squash.txt -pick dfcf9d6 Add 'w' to squash.txt -pick 7a85f34 Add 'o' to squash.txt -pick c275c27 Add 'r' to squash.txt -pick a513fd1 Add 'l' to squash.txt -pick 6b608ae Add 'd' to squash.txt - -# Rebase 1af1b46..6b608ae onto 1af1b46 (12 commands) -# -# Commands: -# p, pick = use commit -# s, squash = use commit, but meld into previous commit -``` - -**Tip** : your local master branch evolves independently of the remote master branch, and git stores the remote branch as `origin/master`. Combined with this trick, `git rebase -i origin/master` is often a very convenient way to rebase all of the commits which haven't been merged upstream yet! - -We're going to squash all of these changes into the first commit. To do this, change every "pick" operation to "squash", except for the first line, like so: - -``` -pick 1e85199 Add 'H' to squash.txt -squash fff6631 Add 'e' to squash.txt -squash b354c74 Add 'l' to squash.txt -squash 04aaf74 Add 'l' to squash.txt -squash 9b0f720 Add 'o' to squash.txt -squash 66b114d Add ',' to squash.txt -squash dc158cd Add ' ' to squash.txt -squash dfcf9d6 Add 'w' to squash.txt -squash 7a85f34 Add 'o' to squash.txt -squash c275c27 Add 'r' to squash.txt -squash a513fd1 Add 'l' to squash.txt -squash 6b608ae Add 'd' to squash.txt -``` - -When you save and close your editor, git will think about this for a moment, then open your editor again to revise the final commit message. You'll see something like this: - -``` -# This is a combination of 12 commits. -# This is the 1st commit message: - -Add 'H' to squash.txt - -# This is the commit message #2: - -Add 'e' to squash.txt - -# This is the commit message #3: - -Add 'l' to squash.txt - -# This is the commit message #4: - -Add 'l' to squash.txt - -# This is the commit message #5: - -Add 'o' to squash.txt - -# This is the commit message #6: - -Add ',' to squash.txt - -# This is the commit message #7: - -Add ' ' to squash.txt - -# This is the commit message #8: - -Add 'w' to squash.txt - -# This is the commit message #9: - -Add 'o' to squash.txt - -# This is the commit message #10: - -Add 'r' to squash.txt - -# This is the commit message #11: - -Add 'l' to squash.txt - -# This is the commit message #12: - -Add 'd' to squash.txt - -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# -# Date: Sun Apr 28 14:21:56 2019 -0400 -# -# interactive rebase in progress; onto 1af1b46 -# Last commands done (12 commands done): -# squash a513fd1 Add 'l' to squash.txt -# squash 6b608ae Add 'd' to squash.txt -# No commands remaining. -# You are currently rebasing branch 'squash' on '1af1b46'. -# -# Changes to be committed: -# new file: squash.txt -# -``` - -This defaults to a combination of all of the commit messages which were squashed, but leaving it like this is almost always not what you want. The old commit messages may be useful for reference when writing the new one, though. - -**Tip** : the "fixup" command you learned about in the previous section can be used for this purpose, too - but it discards the messages of the squashed commits. - -Let's delete everything and replace it with a better commit message, like this: - -``` -Add squash.txt with contents "Hello, world" - -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# -# Date: Sun Apr 28 14:21:56 2019 -0400 -# -# interactive rebase in progress; onto 1af1b46 -# Last commands done (12 commands done): -# squash a513fd1 Add 'l' to squash.txt -# squash 6b608ae Add 'd' to squash.txt -# No commands remaining. -# You are currently rebasing branch 'squash' on '1af1b46'. -# -# Changes to be committed: -# new file: squash.txt -# -``` - -Save and quit your editor, then examine your git log - success! - -``` -commit c785f476c7dff76f21ce2cad7c51cf2af00a44b6 (HEAD -> squash) -Author: Drew DeVault -Date: Sun Apr 28 14:21:56 2019 -0400 - - Add squash.txt with contents "Hello, world" -``` - -Before we move on, let's pull our changes into the master branch and get rid of this scratch one. We can use `git rebase` like we use `git merge`, but it avoids making a merge commit: - -``` -git checkout master -git rebase squash -git branch -D squash -``` - -We generally prefer to avoid using git merge unless we're actually merging unrelated histories. If you have two divergent branches, a git merge is useful to have a record of when they were... merged. In the course of your normal work, rebase is often more appropriate. - -### Splitting one commit into several - -Sometimes the opposite problem happens - one commit is just too big. Let's look into splitting it up. This time, let's write some actual code. Start with a simple C program2 (you can still copy+paste this snippet into your shell to do this quickly): - -``` -cat <main.c -int main(int argc, char *argv[]) { - return 0; -} -EOF -``` - -We'll commit this first. - -``` -git add main.c -git commit -m"Add C program skeleton" -``` - -Next, let's extend the program a bit: - -``` -cat <main.c -#include <stdio.h> - -const char *get_name() { - static char buf[128]; - scanf("%s", buf); - return buf; -} - -int main(int argc, char *argv[]) { - printf("What's your name? "); - const char *name = get_name(); - printf("Hello, %s!\n", name); - return 0; -} -EOF -``` - -After we commit this, we'll be ready to learn how to split it up. - -``` -git commit -a -m"Flesh out C program" -``` - -The first step is to start an interactive rebase. Let's rebase both commits with `git rebase -i HEAD~2`, giving us this rebase plan: - -``` -pick 237b246 Add C program skeleton -pick b3f188b Flesh out C program - -# Rebase c785f47..b3f188b onto c785f47 (2 commands) -# -# Commands: -# p, pick = use commit -# e, edit = use commit, but stop for amending -``` - -Change the second commit's command from "pick" to "edit", then save and close your editor. Git will think about this for a second, then present you with this: - -``` -Stopped at b3f188b... Flesh out C program -You can amend the commit now, with - - git commit --amend - -Once you are satisfied with your changes, run - - git rebase --continue -``` - -We could follow these instructions to add new changes to the commit, but instead let's do a "soft reset"3 by running `git reset HEAD^`. If you run `git status` after this, you'll see that it un-commits the latest commit and adds its changes to the working tree: - -``` -Last commands done (2 commands done): - pick 237b246 Add C program skeleton - edit b3f188b Flesh out C program -No commands remaining. -You are currently splitting a commit while rebasing branch 'master' on 'c785f47'. - (Once your working directory is clean, run "git rebase --continue") - -Changes not staged for commit: - (use "git add ..." to update what will be committed) - (use "git checkout -- ..." to discard changes in working directory) - - modified: main.c - -no changes added to commit (use "git add" and/or "git commit -a") -``` - -To split this up, we're going to do an interactive commit. This allows us to selectively commit only specific changes from the working tree. Run `git commit -p` to start this process, and you'll be presented with the following prompt: - -``` -diff --git a/main.c b/main.c -index b1d9c2c..3463610 100644 ---- a/main.c -+++ b/main.c -@@ -1,3 +1,14 @@ -+#include <stdio.h> -+ -+const char *get_name() { -+ static char buf[128]; -+ scanf("%s", buf); -+ return buf; -+} -+ - int main(int argc, char *argv[]) { -+ printf("What's your name? "); -+ const char *name = get_name(); -+ printf("Hello, %s!\n", name); - return 0; - } -Stage this hunk [y,n,q,a,d,s,e,?]? -``` - -Git has presented you with just one "hunk" (i.e. a single change) to consider committing. This one is too big, though - let's use the "s" command to "split" up the hunk into smaller parts. - -``` -Split into 2 hunks. -@@ -1 +1,9 @@ -+#include -+ -+const char *get_name() { -+ static char buf[128]; -+ scanf("%s", buf); -+ return buf; -+} -+ - int main(int argc, char *argv[]) { -Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? -``` - -**Tip** : If you're curious about the other options, press "?" to summarize them. - -This hunk looks better - a single, self-contained change. Let's hit "y" to answer the question (and stage that "hunk"), then "q" to "quit" the interactive session and proceed with the commit. Your editor will pop up to ask you to enter a suitable commit message. - -``` -Add get_name function to C program - -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# -# interactive rebase in progress; onto c785f47 -# Last commands done (2 commands done): -# pick 237b246 Add C program skeleton -# edit b3f188b Flesh out C program -# No commands remaining. -# You are currently splitting a commit while rebasing branch 'master' on 'c785f47'. -# -# Changes to be committed: -# modified: main.c -# -# Changes not staged for commit: -# modified: main.c -# -``` - -Save and close your editor, then we'll make the second commit. We could do another interactive commit, but since we just want to include the rest of the changes in this commit we'll just do this: - -``` -git commit -a -m"Prompt user for their name" -git rebase --continue -``` - -That last command tells git that we're done editing this commit, and to continue to the next rebase command. That's it! Run `git log` to see the fruits of your labor: - -``` -$ git log -3 --oneline -fe19cc3 (HEAD -> master) Prompt user for their name -659a489 Add get_name function to C program -237b246 Add C program skeleton -``` - -### Reordering commits - -This one is pretty easy. Let's start by setting up our sandbox: - -``` -echo "Goodbye now!" >farewell.txt -git add farewell.txt -git commit -m"Add farewell.txt" - -echo "Hello there!" >greeting.txt -git add greeting.txt -git commit -m"Add greeting.txt" - -echo "How're you doing?" >inquiry.txt -git add inquiry.txt -git commit -m"Add inquiry.txt" -``` - -The git log should now look like this: - -``` -f03baa5 (HEAD -> master) Add inquiry.txt -a4cebf7 Add greeting.txt -90bb015 Add farewell.txt -``` - -Clearly, this is all out of order. Let's do an interactive rebase of the past 3 commits to resolve this. Run `git rebase -i HEAD~3` and this rebase plan will appear: - -``` -pick 90bb015 Add farewell.txt -pick a4cebf7 Add greeting.txt -pick f03baa5 Add inquiry.txt - -# Rebase fe19cc3..f03baa5 onto fe19cc3 (3 commands) -# -# Commands: -# p, pick = use commit -# -# These lines can be re-ordered; they are executed from top to bottom. -``` - -The fix is now straightforward: just reorder these lines in the order you wish for the commits to appear. Should look something like this: - -``` -pick a4cebf7 Add greeting.txt -pick f03baa5 Add inquiry.txt -pick 90bb015 Add farewell.txt -``` - -Save and close your editor and git will do the rest for you. Note that it's possible to end up with conflicts when you do this in practice - click here for help resolving conflicts. - -### git pull --rebase - -If you've been writing some commits on a branch which has been updated upstream, normally `git pull` will create a merge commit. In this respect, `git pull`'s behavior by default is equivalent to: - -``` -git fetch origin -git merge origin/master -``` - -There's another option, which is often more useful and leads to a much cleaner history: `git pull --rebase`. Unlike the merge approach, this is equivalent to the following: - -``` -git fetch origin -git rebase origin/master -``` - -The merge approach is simpler and easier to understand, but the rebase approach is almost always what you want to do if you understand how to use git rebase. If you like, you can set it as the default behavior like so: - -``` -git config --global pull.rebase true -``` - -When you do this, technically you're applying the procedure we discuss in the next section... so let's explain what it means to do that deliberately, too. - -### Using git rebase to... rebase - -Ironically, the feature of git rebase that I use the least is the one it's named for: rebasing branches. Say you have the following branches: - -``` -o--o--o--o--> master - \--o--o--> feature-1 - \--o--> feature-2 -``` - -It turns out feature-2 doesn't depend on any of the changes in feature-1, so you can just base it off of master. The fix is thus: - -``` -git checkout feature-2 -git rebase master -``` - -The non-interactive rebase does the default operation for all implicated commits ("pick")4, which simply rolls your history back to the last common anscestor and replays the commits from both branches. Your history now looks like this: - -``` -o--o--o--o--> master - | \--o--> feature-2 - \--o--o--> feature-1 -``` - -### Resolving conflicts - -The details on resolving merge conflicts are beyond the scope of this guide - keep your eye out for another guide for this in the future. Assuming you're familiar with resolving conflicts in general, here are the specifics that apply to rebasing. - -The details on resolving merge conflicts are beyond the scope of this guide - keep your eye out for another guide for this in the future. Assuming you're familiar with resolving conflicts in general, here are the specifics that apply to rebasing. - -Sometimes you'll get a merge conflict when doing a rebase, which you can handle just like any other merge conflict. Git will set up the conflict markers in the affected files, `git status` will show you what you need to resolve, and you can mark files as resolved with `git add` or `git rm`. However, in the context of a git rebase, there are two options you should be aware of. - -The first is how you complete the conflict resolution. Rather than `git commit` like you'll use when addressing conflicts that arise from `git merge`, the appropriate command for rebasing is `git rebase --continue`. However, there's another option available to you: `git rebase --skip`. This will skip the commit you're working on, and it won't be included in the rebase. This is most common when doing a non-interactive rebase, when git doesn't realize that a commit it's pulled from the "other" branch is an updated version of the commit that it conflicts with on "our" branch. - -### Help! I broke it! - -No doubt about it - rebasing can be hard sometimes. If you've made a mistake and in so doing lost commits which you needed, then `git reflog` is here to save the day. Running this command will show you every operation which changed a ref, or reference - that is, branches and tags. Each line shows you what the old reference pointed to, and you can `git cherry-pick`, `git checkout`, `git show`, or use any other operation on git commits once thought lost. - - --------------------------------------------------------------------------------- - -via: https://git-rebase.io/ - -作者:[git-rebase][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://git-rebase.io/ -[b]: https://github.com/lujun9972 diff --git a/sources/tech/20190512 How to Setup Local Yum-DNF Repository on RHEL 8 Server Using DVD or ISO File.md b/sources/tech/20190512 How to Setup Local Yum-DNF Repository on RHEL 8 Server Using DVD or ISO File.md deleted file mode 100644 index c136a83deb..0000000000 --- a/sources/tech/20190512 How to Setup Local Yum-DNF Repository on RHEL 8 Server Using DVD or ISO File.md +++ /dev/null @@ -1,164 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Setup Local Yum/DNF Repository on RHEL 8 Server Using DVD or ISO File) -[#]: via: (https://www.linuxtechi.com/setup-local-yum-dnf-repository-rhel-8/) -[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) - -How to Setup Local Yum/DNF Repository on RHEL 8 Server Using DVD or ISO File -====== - -Recently Red Hat has released its most awaited operating system “ **RHEL 8** “, in case you have installed RHEL 8 Server on your system and wondering how to setup local yum or dnf repository using installation DVD or ISO file then refer below steps and procedure. - - - -In RHEL 8, we have two package repositories: - - * BaseOS - * Application Stream - - - -BaseOS repository have all underlying OS packages where as Application Stream repository have all application related packages, developer tools and databases etc. Using Application stream repository, we can have multiple of versions of same application and Database. - -### Step:1) Mount RHEL 8 ISO file / Installation DVD - -To mount RHEL 8 ISO file inside your RHEL 8 server use the beneath mount command, - -``` -[root@linuxtechi ~]# mount -o loop rhel-8.0-x86_64-dvd.iso /opt/ -``` - -**Note:** I am assuming you have already copied RHEL 8 ISO file inside your system, - -In case you have RHEL 8 installation DVD, then use below mount command to mount it, - -``` -[root@linuxtechi ~]# mount /dev/sr0 /opt -``` - -### Step:2) Copy media.repo file from mounted directory to /etc/yum.repos.d/ - -In our case RHEL 8 Installation DVD or ISO file is mounted under /opt folder, use cp command to copy media.repo file to /etc/yum.repos.d/ directory, - -``` -[root@linuxtechi ~]# cp -v /opt/media.repo /etc/yum.repos.d/rhel8.repo -'/opt/media.repo' -> '/etc/yum.repos.d/rhel8.repo' -[root@linuxtechi ~]# -``` - -Set “644” permission on “ **/etc/yum.repos.d/rhel8.repo** ” - -``` -[root@linuxtechi ~]# chmod 644 /etc/yum.repos.d/rhel8.repo -[root@linuxtechi ~]# -``` - -### Step:3) Add repository entries in “/etc/yum.repos.d/rhel8.repo” file - -By default, **rhel8.repo** file will have following content, - - - -Edit rhel8.repo file and add the following contents, - -``` -[root@linuxtechi ~]# vi /etc/yum.repos.d/rhel8.repo -[InstallMedia-BaseOS] -name=Red Hat Enterprise Linux 8 - BaseOS -metadata_expire=-1 -gpgcheck=1 -enabled=1 -baseurl=file:///opt/BaseOS/ -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release - -[InstallMedia-AppStream] -name=Red Hat Enterprise Linux 8 - AppStream -metadata_expire=-1 -gpgcheck=1 -enabled=1 -baseurl=file:///opt/AppStream/ -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release -``` - -rhel8.repo should look like above once we add the content, In case you have mounted the Installation DVD or ISO on different folder then change the location and folder name in base url line for both repositories and rest of parameter leave as it is. - -### Step:4) Clean Yum / DNF and Subscription Manager Cache - -Use the following command to clear yum or dnf and subscription manager cache, - -``` -root@linuxtechi ~]# dnf clean all -[root@linuxtechi ~]# subscription-manager clean -All local data removed -[root@linuxtechi ~]# -``` - -### Step:5) Verify whether Yum / DNF is getting packages from Local Repo - -Use dnf or yum repolist command to verify whether these commands are getting packages from Local repositories or not. - -``` -[root@linuxtechi ~]# dnf repolist -Updating Subscription Management repositories. -Unable to read consumer identity -This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. -Last metadata expiration check: 1:32:44 ago on Sat 11 May 2019 08:48:24 AM BST. -repo id repo name status -InstallMedia-AppStream Red Hat Enterprise Linux 8 - AppStream 4,672 -InstallMedia-BaseOS Red Hat Enterprise Linux 8 - BaseOS 1,658 -[root@linuxtechi ~]# -``` - -**Note :** You can use either dnf or yum command, if you use yum command then its request is redirecting to DNF itself because in RHEL 8 yum is based on DNF command. - -If you have noticed the above command output carefully, we are getting warning message “ **This system is not registered to Red Hat Subscription Management**. **You can use subscription-manager to register”** , if you want to suppress or prevent this message while running dnf / yum command then edit the file “/etc/yum/pluginconf.d/subscription-manager.conf”, changed the parameter “enabled=1” to “enabled=0” - -``` -[root@linuxtechi ~]# vi /etc/yum/pluginconf.d/subscription-manager.conf -[main] -enabled=0 -``` - -save and exit the file. - -### Step:6) Installing packages using DNF / Yum - -Let’s assume we want to install nginx web server then run below dnf command, - -``` -[root@linuxtechi ~]# dnf install nginx -``` - -![][1] - -Similarly if you want to install **LEMP** stack on your RHEL 8 system use the following dnf command, - -``` -[root@linuxtechi ~]# dnf install nginx mariadb php -y -``` - -[![][2]][3] - -This confirms that we have successfully configured Local yum / dnf repository on our RHEL 8 server using Installation DVD or ISO file. - -In case these steps help you technically, please do share your feedback and comments. - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/setup-local-yum-dnf-repository-rhel-8/ - -作者:[Pradeep Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/pradeep/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/wp-content/uploads/2019/05/dnf-install-nginx-rhel8-1024x376.jpg -[2]: https://www.linuxtechi.com/wp-content/uploads/2019/05/LEMP-Stack-Install-RHEL8-1024x540.jpg -[3]: https://www.linuxtechi.com/wp-content/uploads/2019/05/LEMP-Stack-Install-RHEL8.jpg diff --git a/sources/tech/20190513 Manage business documents with OpenAS2 on Fedora.md b/sources/tech/20190513 Manage business documents with OpenAS2 on Fedora.md deleted file mode 100644 index c8e82151ef..0000000000 --- a/sources/tech/20190513 Manage business documents with OpenAS2 on Fedora.md +++ /dev/null @@ -1,153 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Manage business documents with OpenAS2 on Fedora) -[#]: via: (https://fedoramagazine.org/manage-business-documents-with-openas2-on-fedora/) -[#]: author: (Stuart D Gathman https://fedoramagazine.org/author/sdgathman/) - -Manage business documents with OpenAS2 on Fedora -====== - -![][1] - -Business documents often require special handling. Enter Electronic Document Interchange, or **EDI**. EDI is more than simply transferring files using email or http (or ftp), because these are documents like orders and invoices. When you send an invoice, you want to be sure that: - -1\. It goes to the right destination, and is not intercepted by competitors. -2\. Your invoice cannot be forged by a 3rd party. -3\. Your customer can’t claim in court that they never got the invoice. - -The first two goals can be accomplished by HTTPS or email with S/MIME, and in some situations, a simple HTTPS POST to a web API is sufficient. What EDI adds is the last part. - -This article does not cover the messy topic of formats for the files exchanged. Even when using a standardized format like ANSI or EDIFACT, it is ultimately up to the business partners. It is not uncommon for business partners to use an ad-hoc CSV file format. This article shows you how to configure Fedora to send and receive in an EDI setup. - -### Centralized EDI - -The traditional solution is to use a Value Added Network, or **VAN**. The VAN is a central hub that transfers documents between their customers. Most importantly, it keeps a secure record of the documents exchanged that can be used as evidence in disputes. The VAN can use different transfer protocols for each of its customers - -### AS Protocols and MDN - -The AS protocols are a specification for adding a digital signature with optional encryption to an electronic document. What it adds over HTTPS or S/MIME is the Message Disposition Notification, or **MDN**. The MDN is a signed and dated response that says, in essence, “We got your invoice.” It uses a secure hash to identify the specific document received. This addresses point #3 without involving a third party. - -The [AS2 protocol][2] uses HTTP or HTTPS for transport. Other AS protocols target [FTP][3] and [SMTP][4]. AS2 is used by companies big and small to avoid depending on (and paying) a VAN. - -### OpenAS2 - -OpenAS2 is an open source Java implemention of the AS2 protocol. It is available in Fedora since 28, and installed with: - -``` -$ sudo dnf install openas2 -$ cd /etc/openas2 -``` - -Configuration is done with a text editor, and the config files are in XML. The first order of business before starting OpenAS2 is to change the factory passwords. - -Edit _/etc/openas2/config.xml_ and search for _ChangeMe_. Change those passwords. The default password on the certificate store is _testas2_ , but that doesn’t matter much as anyone who can read the certificate store can read _config.xml_ and get the password. - -### What to share with AS2 partners - -There are 3 things you will exchange with an AS2 peer. - -#### AS2 ID - -Don’t bother looking up the official AS2 standard for legal AS2 IDs. While OpenAS2 implements the standard, your partners will likely be using a proprietary product which doesn’t. While AS2 allows much longer IDs, many implementations break with more than 16 characters. Using otherwise legal AS2 ID chars like ‘:’ that can appear as path separators on a proprietary OS is also a problem. Restrict your AS2 ID to upper and lower case alpha, digits, and ‘_’ with no more than 16 characters. - -#### SSL certificate - -For real use, you will want to generate a certificate with SHA256 and RSA. OpenAS2 ships with two factory certs to play with. Don’t use these for anything real, obviously. The certificate file is in PKCS12 format. Java ships with _keytool_ which can maintain your PKCS12 “keystore,” as Java calls it. This article skips using _openssl_ to generate keys and certificates. Simply note that _sudo keytool -list -keystore as2_certs.p12_ will list the two factory practice certs. - -#### AS2 URL - -This is an HTTP URL that will access your OpenAS2 instance. HTTPS is also supported, but is redundant. To use it you have to uncomment the https module configuration in _config.xml_ , and supply a certificate signed by a public CA. This requires another article and is entirely unnecessary here. - -By default, OpenAS2 listens on 10080 for HTTP and 10443 for HTTPS. OpenAS2 can talk to itself, so it ships with two partnerships using __ as the AS2 URL. If you don’t find this a convincing demo, and can install a second instance (on a VM, for instance), you can use private IPs for the AS2 URLs. Or install [Cjdns][5] to get IPv6 mesh addresses that can be used anywhere, resulting in AS2 URLs like _http://[fcbf:fc54:e597:7354:8250:2b2e:95e6:d6ba]:10080_. - -Most businesses will also want a list of IPs to add to their firewall. This is actually [bad practice][6]. An AS2 server has the same security risk as a web server, meaning you should isolate it in a VM or container. Also, the difficulty of keeping mutual lists of IPs up to date grows with the list of partners. The AS2 server rejects requests not signed by a configured partner. - -### OpenAS2 Partners - -With that in mind, open _partnerships.xml_ in your editor. At the top is a list of “partners.” Each partner has a name (referenced by the partnerships below as “sender” or “receiver”), AS2 ID, certificate, and email. You need a partner definition for yourself and those you exchange documents with. You can define multiple partners for yourself. OpenAS2 ships with two partners, OpenAS2A and OpenAS2B, which you’ll use to send a test document. - -### OpenAS2 Partnerships - -Next is a list of “partnerships,” one for each direction. Each partnership configuration includes the sender, receiver, and the AS2 URL used to send the documents. By default, partnerships use synchronous MDN. The MDN is returned on the same HTTP transaction. You could uncomment the _as2_receipt_option_ for asynchronous MDN, which is sent some time later. Use synchronous MDN whenever possible, as tracking pending MDNs adds complexity to your application. - -The other partnership options select encryption, signature hash, and other protocol options. A fully implemented AS2 receiver can handle any combination of options, but AS2 partners may have incomplete implementations or policy requirements. For example, DES3 is a comparatively weak encryption algorithm, and may not be acceptable. It is the default because it is almost universally implemented. - -If you went to the trouble to set up a second physical or virtual machine for this test, designate one as OpenAS2A and the other as OpenAS2B. Modify the _as2_url_ on the OpenAS2A-to-OpenAS2B partnership to use the IP (or hostname) of OpenAS2B, and vice versa for the OpenAS2B-to-OpenAS2A partnership. Unless they are using the FedoraWorkstation firewall profile, on both machines you’ll need: - -``` -# sudo firewall-cmd --zone=public --add-port=10080/tcp -``` - -Now start the _openas2_ service (on both machines if needed): - -``` -# sudo systemctl start openas2 -``` - -### Resetting the MDN password - -This initializes the MDN log database with the factory password, not the one you changed it to. This is a packaging bug to be fixed in the next release. To avoid frustration, here’s how to change the h2 database password: - -``` -$ sudo systemctl stop openas2 -$ cat >h2passwd <<'DONE' -#!/bin/bash -AS2DIR="/var/lib/openas2" -java -cp "$AS2DIR"/lib/h2* org.h2.tools.Shell \ - -url jdbc:h2:"$AS2DIR"/db/openas2 \ - -user sa -password "$1" <testdoc <<'DONE' -This is not a real EDI format, but is nevertheless a document. -DONE -$ sudo chown openas2 testdoc -$ sudo mv testdoc /var/spool/openas2/toOpenAS2B -$ sudo journalctl -f -u openas2 -... log output of sending file, Control-C to stop following log -^C -``` - -OpenAS2 does not send a document until it is writable by the _openas2_ user or group. As a consequence, your actual business application will copy, or generate in place, the document. Then it changes the group or permissions to send it on its way, to avoid sending a partial document. - -Now, on the OpenAS2B machine, _/var/spool/openas2/OpenAS2A_OID-OpenAS2B_OID/inbox_ shows the message received. That should get you started! - -* * * - -_Photo by _[ _Beatriz Pérez Moya_][7]_ on _[_Unsplash_][8]_._ - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/manage-business-documents-with-openas2-on-fedora/ - -作者:[Stuart D Gathman][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/sdgathman/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/05/openas2-816x345.jpg -[2]: https://en.wikipedia.org/wiki/AS2 -[3]: https://en.wikipedia.org/wiki/AS3_(networking) -[4]: https://en.wikipedia.org/wiki/AS1_(networking) -[5]: https://fedoramagazine.org/decentralize-common-fedora-apps-cjdns/ -[6]: https://www.ld.com/as2-part-2-best-practices/ -[7]: https://unsplash.com/photos/XN4T2PVUUgk?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText -[8]: https://unsplash.com/search/photos/documents?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20190514 Why bother writing tests at all.md b/sources/tech/20190514 Why bother writing tests at all.md deleted file mode 100644 index 2b80dbaf40..0000000000 --- a/sources/tech/20190514 Why bother writing tests at all.md +++ /dev/null @@ -1,93 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why bother writing tests at all?) -[#]: via: (https://dave.cheney.net/2019/05/14/why-bother-writing-tests-at-all) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -Why bother writing tests at all? -====== - -In previous posts and presentations I talked about [how to test][1], and [when to test][2]. To conclude this series of I’m going to ask the question, _why test at all?_ - -### Even if you don’t, someone _will_ test your software - -I’m sure no-one reading this post thinks that software should be delivered without being tested first. Even if that were true, your customers are going to test it, or at least use it. If nothing else, it would be good to discover any issues with the code before your customers do. If not for the reputation of your company, at least for your professional pride. - -So, if we agree that software should be tested, the question becomes: _who_ should do that testing? - -### The majority of testing should be performed by development teams - -I argue that the majority of the testing should be done by development groups. Moreover, testing should be automated, and thus the majority of these tests should be unit style tests. - -To be clear, I am _not_ saying you shouldn’t write integration, functional, or end to end tests. I’m also _not_ saying that you shouldn’t have a QA group, or integration test engineers. However at a recent software conference, in a room of over 1,000 engineers, nobody raised their hand when I asked if they considered themselves in a pure quality assurance role. - -You might argue that the audience was self selecting, that QA engineers did not feel a software conference was relevant–or welcoming–to them. However, I think this proves my point, the days of [one developer to one test engineer][3] are gone and not coming back. - -If development teams aren’t writing the majority of tests, who is? - -### Manual testing should not be the majority of your testing because manual testing is O(n) - -Thus, if individual contributors are expected to test the software they write, why do we need to automate it? Why is a manual testing plan not good enough? - -Manual testing of software or manual verification of a defect is not sufficient because it does not scale. As the number of manual tests grows, engineers are tempted to skip them or only execute the scenarios they _think_ are could be affected. Manual testing is expensive in terms of time, thus dollars, and it is boring. 99.9% of the tests that passed last time are _expected_ to pass again. Manual testing is looking for a needle in a haystack, except you don’t stop when you find the first needle. - -This means that your first response when given a bug to fix or a feature to implement should be to write a failing test. This doesn’t need to be a unit test, but it should be an automated test. Once you’ve fixed the bug, or added the feature, now have the test case to prove it worked–and you can check them in together. - -### Tests are the critical component that ensure you can always ship your master branch - -As a development team, you are judged on your ability to deliver working software to the business. No, seriously, the business could care less about OOP vs FP, CI/CD, table tennis or limited run La Croix. - -Your super power is, at any time, anyone on the team should be confident that the master branch of your code is shippable. This means at any time they can deliver a release of your software to the business and the business can recoup its investment in your development R&D. - -I cannot emphasise this enough. If you want the non technical parts of the business to believe you are heros, you must never create a situation where you say “well, we can’t release right now because we’re in the middle of an important refactoring. It’ll be a few weeks. We hope.” - -Again, I’m not saying you cannot refactor, but at every stage your product must be shippable. Your tests have to pass. It may not have all the desired features, but the features that are there should work as described on the tin. - -### Tests lock in behaviour - -Your tests are the contract about what your software does and does not do. Unit tests should lock in the behaviour of the package’s API. Integration tests do the same for complex interactions. Tests describe, in code, what the program promises to do. - -If there is a unit test for each input permutation, you have defined the contract for what the code will do _in code_ , not documentation. This is a contract anyone on your team can assert by simply running the tests. At any stage you _know_ with a high degree of confidence that the behaviour people relied on before your change continues to function after your change. - -### Tests give you confidence to change someone else’s code - -Lastly, and this is the biggest one, for programmers working on a piece of code that has been through many hands. Tests give you the confidence to make changes. - -Even though we’ve never met, something I know about you, the reader, is you will eventually leave your current employer. Maybe you’ll be moving on to a new role, or perhaps a promotion, perhaps you’ll move cities, or follow your partner overseas. Whatever the reason, the succession of the maintenance of programs you write is key. - -If people cannot maintain our code then as you and I move from job to job we’ll leave behind programs which cannot be maintained. This goes beyond advocacy for a language or tool. Programs which cannot be changed, programs which are too hard to onboard new developers, or programs which feel like career digression to work on them will reach only one end state–they are a dead end. They represent a balance sheet loss for the business. They will be replaced. - -If you worry about who will maintain your code after you’re gone, write good tests. - -#### Related posts: - - 1. [Writing table driven tests in Go][4] - 2. [Prefer table driven tests][5] - 3. [Automatically run your package’s tests with inotifywait][6] - 4. [The value of TDD][7] - - - --------------------------------------------------------------------------------- - -via: https://dave.cheney.net/2019/05/14/why-bother-writing-tests-at-all - -作者:[Dave Cheney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://dave.cheney.net/author/davecheney -[b]: https://github.com/lujun9972 -[1]: https://dave.cheney.net/2019/05/07/prefer-table-driven-tests -[2]: https://dave.cheney.net/paste/absolute-unit-test-london-gophers.pdf -[3]: https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/evolving-test-practices-microsoft -[4]: https://dave.cheney.net/2013/06/09/writing-table-driven-tests-in-go (Writing table driven tests in Go) -[5]: https://dave.cheney.net/2019/05/07/prefer-table-driven-tests (Prefer table driven tests) -[6]: https://dave.cheney.net/2016/06/21/automatically-run-your-packages-tests-with-inotifywait (Automatically run your package’s tests with inotifywait) -[7]: https://dave.cheney.net/2016/04/11/the-value-of-tdd (The value of TDD) diff --git a/sources/tech/20190515 How to manage access control lists with Ansible.md b/sources/tech/20190515 How to manage access control lists with Ansible.md deleted file mode 100644 index 692dd70599..0000000000 --- a/sources/tech/20190515 How to manage access control lists with Ansible.md +++ /dev/null @@ -1,139 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to manage access control lists with Ansible) -[#]: via: (https://opensource.com/article/19/5/manage-access-control-lists-ansible) -[#]: author: (Taz Brown https://opensource.com/users/heronthecli) - -How to manage access control lists with Ansible -====== -Automating ACL management with Ansible's ACL module is a smart way to -strengthen your security strategy. -![Data container block with hexagons][1] - -Imagine you're a new DevOps engineer in a growing agile environment, and recently your company has experienced phenomenal growth. To support expansion, the company increased hiring by 25% over the last quarter and added 5,000 more servers and network devices to its infrastructure. The company now has over 13,000 users, and you need a tool to scale the existing infrastructure and manage your large number of users and their thousands of files and directories. The company decided to adopt [Ansible][2] company-wide to manage [access control lists (ACLs)][3] and answer the call of effectively managing files and directories and permissions. - -Ansible can be used for a multitude of administration and maintenance tasks and, as a DevOps engineer or administrator, it's likely you've been tasked with using it to manage ACLs. - -### About managing ACLs - -ACLs allow regular users to share their files and directories selectively with other users and groups. With ACLs, a user can grant others the ability to read, write, and execute files and directories without leaving those filesystem elements open. - -ACLs are set and removed at the command line using the **setfacl** utility. The command is usually followed by the name of a file or directory. To set permissions, you would use the Linux command **setfacl -m d ⭕rx ** (e.g., **setfacl -m d ⭕rx Music/**). To view the current permissions on a directory, you would use the command **getfacl ** (e.g., **getfacl Music/** ). To remove an ACL from a file or directory, you would type the command, **# setfacl -x ** (to remove only the specified ACL from the file/directory) or **# setfacl -b ** (to remove all ACLs from the file/directory). - -Only the owner assigned to the file or directory can set ACLs. (It's important to understand this before you, as the admin, take on Ansible to manage your ACLs.) There are also default ACLs, which control directory access; if a file inside a directory has no ACL, then the default ACL is applied. - - -``` -sudo setfacl -m d⭕rx Music -getfacl Music/ -# file: Music/ -# owner: root -# group: root -user::rwx -group::--- -other::--- -default:user::rwx -default:group::--- -default:other::r-x -``` - -### Enter Ansible - -So how can Ansible, in all its wisdom, tackle the task of applying permissions to users, files, directories, and more? Ansible can play nicely with ACLs, just as it does with a lot of features, utilities, APIs, etc. Ansible has an out-of-the-box [ACL module][3] that allows you to create playbooks/roles around granting a user access to a file, removing ACLs for users on a specific file, setting default ACLs for users on files, or obtaining ACLs on particular files. - -Anytime you are administering ACLs, you should use the best practice of "least privilege," meaning you should give a user access only to what they need to perform their role or execute a task, and no more. Restraint and minimizing the attack surface are critical. The more access extended, the higher the risk of unauthorized access to company assets. - -Here's an example Ansible playbook: - -![Ansible playbook][4] - -As an admin, automating ACL management demands that your Ansible playbooks can scale across your infrastructure to increase speed, improve efficiency, and reduce the time it takes to achieve your goals. There will be times when you need to determine the ACL for a specific file. This is essentially the same as using **getfacl ** in Linux. If you want to determine the ACLs of many, specific files, start with a playbook that looks like this: - - -``` -\--- -\- hosts: all -tasks: -\- name: obtain the acl for a specific file -acl: -path: /etc/logrotate.d -user_nfsv4_acls: true -register: acl_info -``` - -You can use the following playbook to set permissions on files/directories: - -![Ansible playbook][5] - -This playbook grants user access to a file: - - -``` -\- hosts: -become: yes -gather_facts: no -tasks: -\- name: Grant user Shirley read access to a file -acl: -path: /etc/foo.conf -entity: shirley -etype: user -permissions: r -state: present -``` - -And this playbook grants user access to a directory: - - -``` -\--- -\- hosts: all -become: yes -gather_facts: no -tasks: -\- name: setting permissions on directory and user -acl: -path: /path/to/scripts/directory -entity: "{{ item }}" -etype: user -permissions: rwx -state: present -loop: -\- www-data -\- root -``` - -### Security realized? - -Applying ACLs to files and users is a practice you should take seriously in your role as a DevOps engineer. Security best practices and formal compliance often get little or no attention. When you allow access to files with sensitive data, you are always risking that the data will be tampered with, stolen, or deleted. Therefore, data protection must be a focal point in your security strategy. Ansible can be part of your security automation strategy, as demonstrated here, and your ACL application is as good a place to start as any. - -Automating your security practices will, of course, go beyond just managing ACLs; it might also involve [SELinux][6] configuration, cryptography, security, and compliance. Remember that Ansible also allows you to define your systems for security, whether it's locking down users and groups (e.g., managing ACLs), setting firewall rules, or applying custom security policies. - -Your security strategy should start with a baseline plan. As a DevOps engineer or admin, you should examine the current security strategy (or the lack thereof), then chart your plan for automating security in your environment. - -### Conclusion - -Using Ansible to manage your ACLs as part of your overall security automation strategy depends on the size of both the company you work for and the infrastructure you manage. Permissions, users, and files can quickly get out of control, potentially placing your security in peril and putting the company in a position you definitely don't want to it be. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/manage-access-control-lists-ansible - -作者:[Taz Brown ][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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_container_block.png?itok=S8MbXEYw (Data container block with hexagons) -[2]: https://opensource.com/article/19/2/quickstart-guide-ansible -[3]: https://docs.ansible.com/ansible/latest/modules/acl_module.html -[4]: https://opensource.com/sites/default/files/images/acl.yml_.png (Ansible playbook) -[5]: https://opensource.com/sites/default/files/images/set_filedir_permissions.png (Ansible playbook) -[6]: https://opensource.com/article/18/8/cheat-sheet-selinux diff --git a/sources/tech/20190516 Create flexible web content with a headless management system.md b/sources/tech/20190516 Create flexible web content with a headless management system.md deleted file mode 100644 index df58e96d0d..0000000000 --- a/sources/tech/20190516 Create flexible web content with a headless management system.md +++ /dev/null @@ -1,113 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Create flexible web content with a headless management system) -[#]: via: (https://opensource.com/article/19/5/headless-cms) -[#]: author: (Sam Bocetta https://opensource.com/users/sambocetta) - -Create flexible web content with a headless management system -====== -Get the versatility and freedom to deliver content however you think is -best. -![Browser of things][1] - -In recent years, we’ve witnessed an explosion in the number of technological devices that deliver web-based content to users. Smartphones, tablets, smartwatches, and more—all with progressively advancing technical capabilities and support for an ever-widening list of operating systems and web browsers—swarm anew onto the market each year. - -What does this trend have to do with web development and headless versus traditional Content Management Systems (CMS)? Quite a lot. - -### CMS creates the internet - -A CMS is an application or set of computer programs used to manage digital content like images, videos, blog posts—essentially anything you would post on a website. An obvious example of a CMS is [WordPress][2]. - -The word "manage" is used broadly here. It can refer to creating, editing, or updating any kind of digital content on a website, as well as indexing the site to make it easily searchable. - -So, a CMS essentially separates the content displayed on a website from how that content is displayed. It also allows you, the website administrator, to set permissions on who can access, edit, modify, or otherwise manage that content. - -Suppose you want to post a new blog entry, update or correct something in an old post, write on your Facebook page, share a social media link to a video or article, or embed a video, music file, or pre-written set of text into a page on your website. If you have ever done anything like this, you have made use of CMS features. - -### Traditional CMS architecture: Benefits and flaws - -There are two major components that make up a CMS: the Content Management Application (CMA) and the Content Delivery Application (CDA). The CMA pertains to the front-end portion of the website. This is what allows authors or other content managers to edit and create content without help from a web developer. The CDA pertains to the back end portion of a website. By organizing and compiling content to make website content updates possible, it automates the function of a website administrator. - -Traditionally, these two pieces are joined into a single unit as a "coupled" CMS architecture. A **coupled CMS** uses a specific front-end delivery system (CMA) built into the application itself. The term "coupled" comes from the fact that the front-end framework—the templates and layout of the pages and how those pages respond to being opened in certain browsers—is coupled to the website’s content. In other words, in a coupled CMS architecture the Content Management Application (CMA) and Content Delivery Application (CDA) are inseparably merged. - -#### Benefits of the traditional CMS - -Coupled architecture does offer advantages, mainly in simplicity and ease of use for those who are not technically sophisticated. This fact explains why a platform like WordPress, which retains a traditional CMS setup, [remains so popular][3] for those who create websites or blogs. - -Further simplifying the web development process [are website builder applications][4], such as [Wix][5] and [Squarespace][6], which allow you to build drag-and-drop websites. The most popular of these builders use open source libraries but are themselves closed source. These sites allow almost anyone who can find the internet to put a website together without wading through the relatively short weeds of a CMS environment. While builder applications were [the object of derision][7] not so long ago amongst many in the open source community—mainly because they tended to give websites a generic and pre-packaged look and feel—they have grown increasingly functional and variegated. - -#### Security is an issue - -However, for all but the simplest web apps, a traditional CMS architecture results in inflexible technology. Modifying a static website or web app with a traditional CMS requires tremendous time and effort to produce updates, patches, and installations, preventing developers from keeping up with the growing number of devices and browsers. - -Furthermore, coupled CMSs have two built-in security flaws: - -**Risk #1** : Since content management and delivery are bound together, hackers who breach your website through the front end automatically gain access to the back-end database. This lack of separation between data and its presentation increases the likelihood that data will be stolen. Depending on the kind of user data stored on your website’s servers, a large-scale theft could be catastrophic. - -**Risk #2** : The risk of successful [Distributed Denial of Service][8] (DDoS) attacks increases without a separate system for delivering content to your website. DDoS attacks flood content delivery networks with so many traffic requests that they become overwhelmed and go offline. If your content delivery network is separated from your actual web servers, attackers will be less able to bring down your site. - -To avoid these problems, developers have introduced headless and decoupled CMSs. - -### Comparing headless and decoupled CMSs - -The "head" of a CMS is a catch-all term for the Content Delivery Application. Therefore, a CMS without one—and so with no way of delivering content to a user—is called "headless." - -This lack of an established delivery method gives headless CMSs enormous versatility. Without a CDA there is no pre-established delivery method, so developers can design separate frameworks as the need arises. The problem of constantly patching your website, web apps, and other code to guarantee compatibility disappears. - -Another option, a **decoupled CMS** , includes many of the same features and benefits as a headless CMS, but there is one crucial difference. Where a headless CMS leaves it entirely to the developer to deliver and present content to their users, a decoupled CMS offers pre-established delivery tools that developers can either take or leave. Decoupled CMSs thus offer both the simplicity of the traditional CMS and the versatility of the headless ones. - -In short, a decoupled CMS is sometimes called a **hybrid CMS ****since it's a hybrid of the coupled and headless designs. Decoupled CMSs are not a new concept. As far back as 2015, PHP core repository developer David Buchmann was [calling on devs][9] to decouple their CMSs to meet a wider set of challenges. - -### Security improvements with a headless CMS - -Perhaps the most important point to make about headless versus decoupled content management architectures, and how they both differ from traditional architecture, is the added security benefit. In both the headless and decoupled designs, content and user data are located on a separate back-end system protected by a firewall. The user can’t access the content management application itself. - -However, it's important to keep in mind that the major consequence of this change in architectures is that since the architecture is fragmented, developers have to fill in the gaps and design content delivery and presentation mechanisms on their own. This means that whether you opt to go headless or decoupled, your developer needs to understand security. While separating content management and content delivery gives hackers one fewer vector through which to attack, this isn’t a security benefit in itself. The burden will be on your devs to properly secure your resulting CDA. - -A firewall protecting the back end provides a [crucial layer of security][10]. Headless and decoupled architectures can distribute your content among multiple databases, so if you take advantage of this possibility you can lower the chance of successful DDoS attacks even further. Open source headless CMS can also benefit from the installation of a [Linux VPN][11] or Linux kernel firewall management tool like [iptables][12]. All of these options combine to provide the added security developers need to create no matter what kind of CDA or back end setup they choose. - -Benefits aside, keep in mind that headless CMS platforms are a fairly new tech. Before making the switch to headless or decoupled, consider whether the host you’re using can support your added security so that you can host your application behind network security systems to block attempts at unauthorized access. If they cannot, a host change might be in order. When evaluating new hosts, also consider any existing contracts or security and compliance restrictions in place (GDPR, CCPA, etc.) which could cause migration troubles. - -### Open source options - -As you can see, headless architecture offers designers the versatility and freedom to deliver content however they think best. This spirit of freedom fits naturally with the open source paradigm in software design, in which all source code is available to public view and may be taken and modified by anyone for any reason. - -There are a number of open source headless CMS platforms that allow developers to do just that: [Mura,][13] [dotCMS][14], and [Cockpit CMS][15] to name a few. For a deeper dive into the world of open source headless CMS platforms, [check out this article][16]. - -### Final thoughts - -For web designers and developers, the idea of a headless CMS marks a significant rethinking of how sites are built and delivered. Moving to this architecture is a great way to future-proof your website against changing preferences and whatever tricks future hackers may cook up, while at the same time creating a seamless user experience no matter what device or browser is used. You might also take a look at [this guide][17] for UX tips on designing your website in a way that meshes with headless and decoupled architectures. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/headless-cms - -作者:[Sam Bocetta][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/browser_desktop_website_checklist_metrics.png?itok=OKKbl1UR (Browser of things) -[2]: https://wordpress.org/ -[3]: https://kinsta.com/wordpress-market-share/ -[4]: https://hostingcanada.org/website-builders/ -[5]: https://www.wix.com/ -[6]: https://www.squarespace.com -[7]: https://arstechnica.com/information-technology/2016/11/wordpress-and-wix-trade-shots-over-alleged-theft-of-open-source-code/ -[8]: https://www.cloudflare.com/learning/ddos/what-is-a-ddos-attack/ -[9]: https://opensource.com/business/15/3/decoupling-your-cms -[10]: https://www.hostpapa.com/blog/security/why-your-small-business-needs-a-firewall/ -[11]: https://surfshark.com/download/linux -[12]: https://www.linode.com/docs/security/firewalls/control-network-traffic-with-iptables/ -[13]: https://www.getmura.com/ -[14]: https://dotcms.com/ -[15]: https://getcockpit.com/ -[16]: https://www.cmswire.com/web-cms/13-headless-cmss-to-put-on-your-radar/ -[17]: https://medium.com/@mat_walker/tips-for-content-modelling-with-the-headless-cms-contentful-7e886a911962 diff --git a/sources/tech/20190516 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-2.md b/sources/tech/20190516 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-2.md deleted file mode 100644 index 58a9459a41..0000000000 --- a/sources/tech/20190516 Monitor and Manage Docker Containers with Portainer.io (GUI tool) - Part-2.md +++ /dev/null @@ -1,244 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Monitor and Manage Docker Containers with Portainer.io (GUI tool) – Part-2) -[#]: via: (https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/) -[#]: author: (Shashidhar Soppin https://www.linuxtechi.com/author/shashidhar/) - -Monitor and Manage Docker Containers with Portainer.io (GUI tool) – Part-2 -====== - -As a continuation of Part-1, this part-2 has remaining features of Portainer covered and as explained below. - -### Monitoring docker container images - -``` -root@linuxtechi ~}$ docker ps -a -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -9ab9aa72f015 ubuntu "/bin/bash" 14 seconds ago Exited (0) 12 seconds ago suspicious_shannon -305369d3b2bb centos "/bin/bash" 24 seconds ago Exited (0) 22 seconds ago admiring_mestorf -9a669f3dc4f6 portainer/portainer "/portainer" 7 minutes ago Up 7 minutes 0.0.0.0:9000->9000/tcp trusting_keller -``` - -Including the portainer(which is a docker container image), all the exited and present running docker images are displayed. Below screenshot from Portainer GUI displays the same. - -[![Docker_status][1]][2] - -### Monitoring events - -Click on the “Events” option from the portainer webpage as shown below. - -Various events that are generated and created based on docker-container activity, are captured and displayed in this page - -[![Container-Events-Poratiner-GUI][3]][4] - -Now to check and validate how the “ **Events** ” section works. Create a new docker-container image redis as explained below, check the docker ps –a status at docker command-line. - -``` -root@linuxtechi ~}$ docker ps -a -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -cdbfbef59c31 redis "docker-entrypoint.s…" About a minute ago Up About a minute 6379/tcp angry_varahamihira -9ab9aa72f015 ubuntu "/bin/bash" 10 minutes ago Exited (0) 10 minutes ago suspicious_shannon -305369d3b2bb centos "/bin/bash" 11 minutes ago Exited (0) 11 minutes ago admiring_mestorf -9a669f3dc4f6 portainer/portainer "/portainer" 17 minutes ago Up 17 minutes 0.0.0.0:9000->9000/tcp trusting_keller -``` - -Click the “Event List” on the top to refresh the events list, - -[![events_updated][5]][6] - -Now the event’s page also updated with this change, - -### Host status - -Below is the screenshot of the portainer displaying the host status. This is a simple window showing-up. This shows the basic info like “CPU”, “hostname”, “OS info” etc of the host linux machine. Instead of logging- into the host command-line, this page provides very useful info on for quick glance. - -[![Host-names-Portainer][7]][8] - -### Dashboard in Portainer - -Until now we have seen various features of portainer based under “ **Local”** section. Now jump on to the “ **Dashboard** ” section of the selected Docker Container image. - -When “ **EndPoint** ” option is clicked in the GUI of Portainer, the following window appears, - -[![End_Point_Settings][9]][10] - -This Dashboard has many statuses and options, for a host container image. - -**1) Stacks:** Clicking on this option, provides status of any stacks if any. Since there are no stacks, this displays zero. - -**2) Images:** Clicking on this option provides host of container images that are available. This option will display all the live and exited container images - -[![Docker-Container-Images-Portainer][11]][12] - -For example create one more “ **Nginx”** container and refresh this list to see the updates. - -``` -root@linuxtechi ~}$ sudo docker run nginx -Unable to find image 'nginx:latest' locally -latest: Pulling from library/nginx -27833a3ba0a5: Pull complete -ea005e36e544: Pull complete -d172c7f0578d: Pull complete -Digest: sha256:e71b1bf4281f25533cf15e6e5f9be4dac74d2328152edf7ecde23abc54e16c1c -Status: Downloaded newer image for nginx:latest -``` - -The following is the image after refresh, - -[![Nginx_Image_creation][13]][14] - -Once the Nginx image is stopped/killed and docker container image will be moved to unused status. - -**Note** :-One can see all the image details here are very clear with memory usage, creation date and time. As compared to command-line option, maintaining and monitoring containers from here it will be very easy. - -**3) Networks:** this option is used for network operations. Like assigning IP address, creating subnets, providing IP address range, access control (admin and normal user) . The following window provides the details of various options possible. Based on your need these options can be explored further. - -[![Conatiner-Network-Portainer][15]][16] - -Once all the various networking parameters are entered, “ **create network** ” button is clicked for creating the network. - -**4) Container:** (click on container) This option will provide the container status. This list will provide details on live and not running container statuses. This output is similar to docker ps command option. - -[![Containers-Status-Portainer][17]][18] - -From this window only the containers can be stopped and started as need arises by checking the check box and selecting the above buttons. One example is provided as below, - -Example, Both “CentOS” and “Ubuntu” containers which are in stopped state, they are started now by selecting check boxes and hitting “Start” button. - -[![start_containers1][19]][20] - -[![start_containers2][21]][22] - -**Note:** Since both are Linux container images, they will not be started. Portainer tries to start and stops later. Try “Nginx” instead and you can see it coming to “running”status. - -[![start_containers3][23]][24] - -**5) Volume:** Described in Part-I of Portainer Article - -### Setting option in Portainer - -Until now we have seen various features of portainer based under “ **Local”** section. Now jump on to the “ **Setting”** section of the selected Docker Container image. - -When “Settings” option is clicked in the GUI of Portainer, the following further configuration options are available, - -**1) Extensions** : This is a simple Portainer CE subscription process. The details and uses can be seen from the attached window. This is mainly used for maintaining the license and subscription of the respective version. - -[![Extensions][25]][26] - -**2) Users:** This option is used for adding “users” with or without administrative privileges. Following example provides the same. - -Enter the selected user name “shashi” in this case and your choice of password and hit “ **Create User** ” button below. - -[![create_user_portainer][27]][28] - -[![create_user2_portainer][29]][30] - -[![Internal-user-Portainer][31]][32] - -Similarly the just now created user “shashi” can be removed by selecting the check box and hitting remove button. - -[![user_remove_portainer][33]][34] - -**3) Endpoints:** this option is used for Endpoint management. Endpoints can be added and removed as shown in the attached windows. - -[![Endpoint-Portainer-GUI][35]][36] - -The new endpoint “shashi” is created using the various default parameters as shown below, - -[![Endpoint2-Portainer-GUI][37]][38] - -Similarly this endpoint can be removed by clicking the check box and hitting remove button. - -**4) Registries:** this option is used for registry management. As docker hub has registry of various images, this feature can be used for similar purposes. - -[![Registry-Portainer-GUI][39]][40] - -With the default options the “shashi-registry” can be created. - -[![Registry2-Portainer-GUI][41]][42] - -Similarly this can be removed if not required. - -**5) Settings:** This option is used for the following various options, - - * Setting-up snapshot interval - * For using custom logo - * To create external templates - * Security features like- Disable and enable bin mounts for non-admins, Disable/enable privileges for non-admins, Enabling host management features - - - -Following screenshot shows some options enabled and disabled for demonstration purposes. Once all done hit on “Save Settings” button to save all these options. - -[![Portainer-GUI-Settings][43]][44] - -Now one more option pops-up on “Authentication settings” for LDAP, Internal or OAuth extension as shown below” - -[![Authentication-Portainer-GUI-Settings][45]][46] - -Based on what level of security features we want for our environment, respective option is chosen. - -That’s all from this article, I hope these Portainer GUI articles helps you to manage and monitor containers more efficiently. Please do share your feedback and comments. - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/ - -作者:[Shashidhar Soppin][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/shashidhar/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker_status-1024x423.jpg -[2]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Docker_status.jpg -[3]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Events-1024x404.jpg -[4]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Events.jpg -[5]: https://www.linuxtechi.com/wp-content/uploads/2019/05/events_updated-1024x414.jpg -[6]: https://www.linuxtechi.com/wp-content/uploads/2019/05/events_updated.jpg -[7]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Host_names-1024x408.jpg -[8]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Host_names.jpg -[9]: https://www.linuxtechi.com/wp-content/uploads/2019/05/End_Point_Settings-1024x471.jpg -[10]: https://www.linuxtechi.com/wp-content/uploads/2019/05/End_Point_Settings.jpg -[11]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Images-1024x398.jpg -[12]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Images.jpg -[13]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Nginx_Image_creation-1024x439.jpg -[14]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Nginx_Image_creation.jpg -[15]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Network-1024x463.jpg -[16]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Network.jpg -[17]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Containers-1024x364.jpg -[18]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Containers.jpg -[19]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers1-1024x432.jpg -[20]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers1.jpg -[21]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers2-1024x307.jpg -[22]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers2.jpg -[23]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers3-1024x435.jpg -[24]: https://www.linuxtechi.com/wp-content/uploads/2019/05/start_containers3.jpg -[25]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Extensions-1024x421.jpg -[26]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Extensions.jpg -[27]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user-1024x350.jpg -[28]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user.jpg -[29]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user2-1024x372.jpg -[30]: https://www.linuxtechi.com/wp-content/uploads/2019/05/create_user2.jpg -[31]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Internal-user-Portainer-1024x257.jpg -[32]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Internal-user-Portainer.jpg -[33]: https://www.linuxtechi.com/wp-content/uploads/2019/05/user_remove-1024x318.jpg -[34]: https://www.linuxtechi.com/wp-content/uploads/2019/05/user_remove.jpg -[35]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint-1024x349.jpg -[36]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint.jpg -[37]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint2-1024x379.jpg -[38]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Endpoint2.jpg -[39]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry-1024x420.jpg -[40]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry.jpg -[41]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry2-1024x409.jpg -[42]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Registry2.jpg -[43]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-GUI-Settings-1024x418.jpg -[44]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Portainer-GUI-Settings.jpg -[45]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Authentication-Portainer-GUI-Settings-1024x344.jpg -[46]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Authentication-Portainer-GUI-Settings.jpg diff --git a/sources/tech/20190516 System76-s secret sauce for success.md b/sources/tech/20190516 System76-s secret sauce for success.md deleted file mode 100644 index 9409de535f..0000000000 --- a/sources/tech/20190516 System76-s secret sauce for success.md +++ /dev/null @@ -1,71 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (System76's secret sauce for success) -[#]: via: (https://opensource.com/article/19/5/system76-secret-sauce) -[#]: author: (Don Watkins https://opensource.com/users/don-watkins/users/don-watkins) - -System76's secret sauce for success -====== -Linux computer maker's approach to community-informed software and -hardware development embodies the open source way. -![][1] - -In [_The Open Organization_][2], Jim Whitehurst says, "show passion for the purpose of your organization and constantly drive interest in it. People are drawn to and generally, want to follow passionate people." Carl Richell, the founder and CEO of Linux hardware maker [System76][3], pours that secret sauce to propel his company in the world of open hardware, Linux, and open source. - -Carl demonstrates quiet confidence and engages the team at System76 in a way that empowers their creative synergy. During a recent visit to System76's Denver factory, I could immediately tell that the employees love what they do, what they produce, and their interaction with each other and their customers, and Carl sets that example. They are as they [describe themselves][4]: a diverse team of creators, makers, and builders; a small company innovating the next big things; and a group of extremely hard-core nerds. - -### A revolutionary approach - -In 2005, Carl had a vision, which began as talk over some beers, to produce desktop and laptop computers that come installed with Linux. He's transformed that idea into a highly successful company founded on the [belief][5] that "the computer and operating system are the most powerful and versatile tools ever created." And by producing the best tools, System76 can inspire the curious to make their greatest discovery or complete their greatest project. - -![System 76 founder and CEO Carl Richell][6] - -Carl Richell's enthusiasm was obvious at System 76's [Thelio launch event][7]. - -System76 lives up to its name, which was inspired by the American Revolution of 1776. The company views itself as a leader in the open source revolution, granting people freedom and independence from proprietary hardware and software. - -But the revolution does not end there; it continues with the company's business practices and diverse environment that aims to close the gender gap in technology leadership. Eight of the company's 28 employees are women, including vice president of marketing Louisa Bisio, creative manager Kate Hazen, purchasing manager May Liu, head of technical support Emma Marshall, and manufacturing control and logistics manager Sarah Zinger. - -### Community-informed design - -The staff members' passion and ingenuity for making the Linux experience enjoyable for customers creates an outstanding culture. Because the company believes the Linux desktop deserves a dedicated PC manufacturer, in 2018, it brought manufacturing in-house. This allows System76's engineers to make design changes more quickly, based on their frequent interactions with Linux users to learn about their needs and wants. It also opens up its parts and process to the public, including publishing design files under GPL on [GitHub][8], consistent with its commitment to openness and open source. - -For example, when System76 decided to create its own version of Linux, [Pop!_OS][9], it hosted online meetings to discuss and learn what features and software its customers wanted. This decision to work closely with the community has been instrumental in making Pop!_OS successful. - -System76 again turned to the community when it began developing [Thelio][10], its new line of desktop computers. Marketing VP Louisa Bisio says, "Taking a similar approach to open hardware has been great. We started in-house design in 2016, prototyping different desktop designs. Then we moved from prototyping acrylic to sheet metal. Then the first few prototypes of Thelio were presented to our [Superfan][11] attendees in 2017, and their feedback was really important in adjusting the desktop designs and progressing Thelio iterations forward." - -Thelio is the product of research and development focusing on high-quality components and design. It features a unique cabling layout, innovative airflow within the computer case, and the Thelio Io open hardware SATA controller. Many of System76's customers use platforms like [CUDA][12] to do their work; to support them, System76 works backward and pulls out proprietary functionality, piece by piece, until everything is open. - -### Open roads ahead - -Manufacturing open laptops are on the long-range roadmap, but the company is actively working on an open motherboard and maintaining Pop!_OS and System76 drivers, which are open. This commitment to openness, customer-driven design, and culture give System 76 a unique place in computer manufacturing. All of this stems from founder Carl Richell and his philosophy "that technology should be open and accessible to everyone." [As Carl says][13], "open hardware benefits all of us. It's how we further advance technology and make it more available to everyone." - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/system76-secret-sauce - -作者:[Don Watkins ][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/don-watkins/users/don-watkins -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bubblehands_fromRHT_520_0612LL.png?itok=_iQ2dO3S -[2]: https://www.amazon.com/Open-Organization-Igniting-Passion-Performance/dp/1511392460 -[3]: https://system76.com/ -[4]: https://system76.com/about -[5]: https://system76.com/pop -[6]: https://opensource.com/sites/default/files/uploads/carl_richell.jpg (System 76 founder and CEO Carl Richell) -[7]: https://trevgstudios.smugmug.com/System76/121418-Thelio-Press-Event/i-w6XNmKS -[8]: https://github.com/system76 -[9]: https://opensource.com/article/18/1/behind-scenes-popos-linux -[10]: https://system76.com/desktops -[11]: https://system76.com/superfan -[12]: https://en.wikipedia.org/wiki/CUDA -[13]: https://opensource.com/article/19/4/system76-hardware diff --git a/sources/tech/20190517 Announcing Enarx for running sensitive workloads.md b/sources/tech/20190517 Announcing Enarx for running sensitive workloads.md deleted file mode 100644 index 81d021f7d7..0000000000 --- a/sources/tech/20190517 Announcing Enarx for running sensitive workloads.md +++ /dev/null @@ -1,83 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Announcing Enarx for running sensitive workloads) -[#]: via: (https://opensource.com/article/19/5/enarx-security) -[#]: author: (Mike Bursell https://opensource.com/users/mikecamel/users/wgarry155) - -Announcing Enarx for running sensitive workloads -====== -Enarx leverages the capabilities of a TEE to change the trust model for -your application. -![cubes coming together to create a larger cube][1] - -Running software is something that most of us do without thinking about it. We run in "on premises"—our own machines—or we run it in the cloud - on somebody else's machines. We don't always think about what those differences mean, or about what assumptions we're making about the securtiy of the data that's being processed, or even of the software that's doing that processing. Specifically, when you run software (a "workload") on a system (a "host") on the cloud or on your own premises, there are lots and lots of layers. You often don't see those layers, but they're there. - -Here's an example of the layers that you might see in a standard cloud virtualisation architecture. The different colours represent different entities that "own" different layers or sets of layers. - -![Layers in a standard cloud virtualisation architecture][2] - -Here's a similar diagram depicting a standard cloud container architecture. As before, each different colour represents a different "owner" of a layer or set of layers. - -![Standard cloud container architecture][3] - -These owners may be of very different types, from hardware vendors to OEMs to cloud service providers (CSPs) to middleware vendors to operating system vendors to application vendors to you, the workload owner. And for each workload that you run, on each host, the exact list of layers is likely to be different. And even when they're the same, the versions of the layers instances may be different, whether it's a different BIOS version, a different bootloader, a different kernel version, or whatever else. - -Now, in many contexts, you might not worry about this, and your CSP goes out of its way to abstract these layers and their version details away from you. But this is a security article, for security people, and that means that anybody who's reading this probably does care. - -The reason we care is not just the different versions and the different layers, but the number of different things—and different entities—that we need to trust if we're going to be happy running any sort of sensitive workload on these types of stacks. I need to trust every single layer, and the owner of every single layer, not only to do what they say they will do, but also not to be compromised. This is a _big_ stretch when it comes to running my sensitive workloads. - -### What's Enarx? - -Enarx is a new project that is trying to address this problem of having to trust all of those layers. A few of us at Red Hat have been working on it for a few months now. My colleague Nathaniel McCallum demoed an early incarnation of it at [Red Hat Summit 2019][4] in Boston, and we're ready to start announcing it to the world. We have code, we have a demo, we have a GitHub repository, we have a logo: what more could a project want? Well, people—but we'll get to that. - -![Enarx logo][5] - -With Enarx, we made the decision that we wanted to allow people running workloads to be able to reduce the number of layers—and owners—that they need to trust to the absolute minimum. We plan to use trusted execution environments ("TEEs"—see "[Oh, how I love my TEE (or do I?)][6]") to provide an architecture that looks a little more like this: - -![Enarx architecture][7] - -In a world like this, you have to trust the CPU and firmware, and you need to trust some middleware—of which Enarx is part—but you don't need to trust all of the other layers, because we will leverage the capabilities of the TEE to ensure the integrity and confidentiality of your application. The Enarx project will provide attestation of the TEE, so that you know you're running on a true and trusted TEE, and will provide open source, auditable code to help you trust the layer directly beneath your application. - -The initial code is out there—working on AMD's SEV TEE at the momen—and enough of it works now that we're ready to tell you about it. - -Making sure that your application meets your own security requirements is down to you. :-) - -### How do I find out more? - -The easiest way to learn more is to visit the [Enarx GitHub][8]. - -We'll be adding more information there—it's currently just code—but bear with us: there are only a few of us on the project at the moment. A blog is on the list of things we'd like to have, but we wanted to get things started. - -We'd love to have people in the community getting involved in the project. It's currently quite low-level and requires quite a lot of knowledge to get running, but we'll work on that. You will need some specific hardware to make it work, of course. Oh, and if you're an early boot or a low-level KVM hacker, we're _particularly_ interested in hearing from you. - -I will, of course, respond to comments on this article. - -* * * - -_This article was originally published on[Alice, Eve, and Bob][9] and is reprinted with the author's permission._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/enarx-security - -作者:[Mike Bursell ][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mikecamel/users/wgarry155 -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cube_innovation_process_block_container.png?itok=vkPYmSRQ (cubes coming together to create a larger cube) -[2]: https://opensource.com/sites/default/files/uploads/classic-cloud-virt-arch-1.png (Layers in a standard cloud virtualisation architecture) -[3]: https://opensource.com/sites/default/files/uploads/cloud-container-arch.png (Standard cloud container architecture) -[4]: https://www.redhat.com/en/summit/2019 -[5]: https://opensource.com/sites/default/files/uploads/enarx.png (Enarx logo) -[6]: https://aliceevebob.com/2019/02/26/oh-how-i-love-my-tee-or-do-i/ -[7]: https://opensource.com/sites/default/files/uploads/reduced-arch.png (Enarx architecture) -[8]: https://github.com/enarx -[9]: https://aliceevebob.com/2019/05/07/announcing-enarx/ diff --git a/sources/tech/20190519 The three Rs of remote work.md b/sources/tech/20190519 The three Rs of remote work.md deleted file mode 100644 index f40f8b652e..0000000000 --- a/sources/tech/20190519 The three Rs of remote work.md +++ /dev/null @@ -1,65 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The three Rs of remote work) -[#]: via: (https://dave.cheney.net/2019/05/19/the-three-rs-of-remote-work) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -The three Rs of remote work -====== - -I started working remotely in 2012. Since then I’ve worked for big companies and small, organisations with outstanding remote working cultures, and others that probably would have difficulty spelling the word without predictive text. I broadly classify my experiences into three tiers; - -### Little r remote - -The first kind of remote work I call _little r_ remote. - -Your company has an office, but it’s not convenient or you don’t want to work from there. It could be the commute is too long, or its in the next town over, or perhaps a short plane flight away. Sometimes you might go into the office for a day or two a week, and should something serious arise you could join your co-workers onsite for an extended period of time. - -If you often hear people say they are going to work from home to get some work done, that’s little r remote. - -### Big R remote - -The next category I call _Big R_ remote. Big R remote differs mainly from little r remote by the tyranny of distance. It’s not impossible to visit your co-workers in person, but it is inconvenient. Meeting face to face requires a day’s flying. Passports and boarder crossings are frequently involved. The expense and distance necessitates week long sprints and commensurate periods of jetlag recuperation. - -Because of timezone differences meetings must be prearranged and periods of overlap closely guarded. Communication becomes less spontaneous and care must be taken to avoid committing to unsustainable working hours. - -### Gothic ℜ remote - -The final category is basically Big R remote working on hard mode. Everything that was hard about Big R remote, timezone, travel schedules, public holidays, daylight savings, video call latency, cultural and language barriers is multiplied for each remote worker. - -In person meetings are so rare that without a focus on written asynchronous communication progress can repeatedly stall for days, if not weeks, as miscommunication leads to disillusionment and loss of trust. - -In my experience, for knowledge workers, little r remote work offers many benefits over [the open office hell scape][1] du jour. Big R remote takes a serious commitment by all parties and if you are the first employee in that category you will bare most of the cost to making Big R remote work for you. - -Gothic ℜ remote working should probably be avoided unless all those involved have many years of working in that style _and_ the employer is committed to restructuring the company as a remote first organisation. It is not possible to succeed in a Gothic ℜ remote role without a culture of written communication and asynchronous decision making mandated, _and consistently enforced,_ by the leaders of the company. - -#### Related posts: - - 1. [How to dial remote SSL/TLS services in Go][2] - 2. [How does the go build command work ?][3] - 3. [Why Slack is inappropriate for open source communications][4] - 4. [The office coffee model of concurrent garbage collection][5] - - - --------------------------------------------------------------------------------- - -via: https://dave.cheney.net/2019/05/19/the-three-rs-of-remote-work - -作者:[Dave Cheney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://dave.cheney.net/author/davecheney -[b]: https://github.com/lujun9972 -[1]: https://twitter.com/davecheney/status/761693088666357760 -[2]: https://dave.cheney.net/2010/10/05/how-to-dial-remote-ssltls-services-in-go (How to dial remote SSL/TLS services in Go) -[3]: https://dave.cheney.net/2013/10/15/how-does-the-go-build-command-work (How does the go build command work ?) -[4]: https://dave.cheney.net/2017/04/11/why-slack-is-inappropriate-for-open-source-communications (Why Slack is inappropriate for open source communications) -[5]: https://dave.cheney.net/2018/12/28/the-office-coffee-model-of-concurrent-garbage-collection (The office coffee model of concurrent garbage collection) diff --git a/sources/tech/20190520 Blockchain 2.0 - Explaining Distributed Computing And Distributed Applications -Part 11.md b/sources/tech/20190520 Blockchain 2.0 - Explaining Distributed Computing And Distributed Applications -Part 11.md deleted file mode 100644 index c34effe6be..0000000000 --- a/sources/tech/20190520 Blockchain 2.0 - Explaining Distributed Computing And Distributed Applications -Part 11.md +++ /dev/null @@ -1,88 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Blockchain 2.0 – Explaining Distributed Computing And Distributed Applications [Part 11]) -[#]: via: (https://www.ostechnix.com/blockchain-2-0-explaining-distributed-computing-and-distributed-applications/) -[#]: author: (editor https://www.ostechnix.com/author/editor/) - -Blockchain 2.0 – Explaining Distributed Computing And Distributed Applications [Part 11] -====== - -![Explaining Distributed Computing And Distributed Applications][1] - -### How DApps serve the purpose of [Blockchain 2.0][2] - -**Blockchain 1.0** was about introducing the “blockchain” into the list of modern buzzwords along with the advent of **bitcoin**. Multiple white papers detailing bitcoin’s underlying blockchain network specified the use of the blockchain for other uses as well. Although most of the said uses was around the basic concept of using the blockchain as a **decentralized medium** for storage, a use that stems from this property is utilizing it for carrying out **Distributed computing** on top of this layer. - -**DApps** or **Distributed Applications** are computer programs that are stored and run on a distributed storage system such as the [**Ethereum**][3] blockchain for instance. To understand how DApps function and how they’re different from traditional applications on your desktop or phone, we’ll need to delve into what distributed computing is. This post will explore some fundamental concepts of distributed computing and the role of blockchains in executing the said objective. Furthermore, well also look at a few applications or DApps, in blockchain lingo, to get a hang of things. - -### What is Distributed Computing? - -We’re assuming many readers are familiar with multi-threaded applications and multi-threading in general. Multi-threading is the reason why processor manufacturers are forever hell bent on increasing the core count on their products. Fundamentally speaking, some applications such as video rendering software suites are capable of dividing their work (in this case rendering effects and video styles) into multiple chunks and parallelly get them processed from a supporting computing system. This reduces the lead time on getting the work done and is generally more efficient in terms of time, money and energy usage. Applications such as some games however, cannot make use of this system since processing and responses need to be obtained real time based on user inputs rather than via planned execution. Nonetheless, the fact that more processing power may be exploited from existing hardware using these computing methods remains true and significant. - -Even supercomputers are basically a bunch of powerful CPUs all tied up together in a circuit to enable faster processing as mentioned above. The average core count on flagship CPUs from the lead manufacturers AMD and Intel have in fact gone up in the last few years, because increasing core count has recently been the only method to claim better processing and claim upgrades to their product lines. This information notwithstanding, the fact remains that distributed computing and related concepts of parallel computing are the only legitimate ways to improve processing capabilities in the near future. There are minor differences between distributed and parallel computing models as well, however that is beyond the scope off this post. - -Another method to get many computers executing programs simultaneously is to connect them through the internet and have a cloud-based program to be implemented in parts by all of the participating systems. This is the basic fundamental behind distributed applications. - -For a more detailed account and primer regarding what and how parallel computing works, interested readers may visit [this][4] webpage. For a more detailed study of the topic, for people who have a background in computer science, you may refer to [this][5] website and the accompanying book. - -### What are DApps or Distributed Applications - -Application that can make use of the capabilities offered by a distributed computing system is called a **distributed application**. The execution and structure of such an application’s back end needs to be carefully designed in order to be compatible with the system. - -The blockchain presents an opportunity to store data in a distributed system of participating nodes. Stepping up from this opportunity we can logically build systems and applications running on such a network (think about how you used to download files via the Torrent protocol). - -Such decentralized applications present a lot of benefits over conventional applications that typically run from a central server. Some highlights are: - - * DApps run on a network of such participating nodes and any user request is parsed through such network nodes to provide the user with the requested functionality. _**Program is executed on the network instead of a single computer or a server**_. - * DApps will have codified methods of filtering through requests and executing them so as to always be fair and transparent when users interact with it. To create a new block of data in the chain, the same has to be approved via a **consensus algorithm** by the participating nodes. This fundamental idea of peer to peer approval applies for DApps as well. This essentially means that DApps cannot by extension of this principle provide different outputs to the same query or input. All users will be given the same priority unless it is explicitly mentioned and all users will receive similar results from the DApp as well. This will prove to be important in developing better industry practices for insurance and finance companies for instance. A DApp that specializes in microlending, for instance, cannot differentiate and offer different interest rates for different borrowers other than their credit history. This also means that all users will eventually end up paying for their required operations uniformly depending on the computational complexity of the task they passed on to the application. For instance, combing through 10000 entries of data will cost proportionately more than combing through say 100. The payment or incentivisation system might be different for different applications and blockchain protocols though. - * Most DApps are by default redundant and fail safe. If you’re using a service which is run on a central server, a failure from the server end will freeze the application. Think of a service such as PayPal for instance. If the PayPal server in your immediate region fails due to some reason and somehow the central server cannot re route your request, your payment will not go through. However, even in case multiple participating nodes in the blockchain dies, you will still find the application live and running provided at least one node is live. This presents a use case for applications which are by definition supposed to be live all the time. Emergency services, insurance, communications etc., are some key areas where investors hope such DApps will bring in much needed reliability. - * DApps are usually cost-effective owing to them not requiring a central server to be maintained for their functionality. Once they become mainstream, the mean computing cost of running tasks on the same is also supposed to decrease. - * DApps will as mentioned exist till eternity at least until one participant is live on the chain. This essentially means that DApps cannot be censored or hacked into bowing and shutting down. - - - -The above list of features seems very few, however, combine that with all the other capabilities of the blockchain, the advancement of wireless network access, and, the increasing capabilities of millions of smartphones and here we have in our hands nothing less than a paradigm shift in how the apps that we rely on work. - -We will look deeper into how DApps function and how you can make your own DApps on the Ethereum blockchain in a proceeding post. To give you an idea of the DApp environment right now, we present 4 carefully chosen examples that are fairly advanced and popular. - -##### 1\. BITCOIN (or any Cryptocurrency) - -We’re very sure that readers did not expect BITCOIN to be one among a list of applications in this post. The point we’re trying to make here however, is that any cryptocurrency currently running on a blockchain backbone can be termed as a DApp. Cryptocurrencies are in fact the most popular DApp format out there and a revolutionary one at that too. - -##### 2\. [MELON][6] - -We’ve talked about how asset management can be an easier task utilizing blockchain and [**smart contracts**][7]. **Melon** is a company that aims to provide its users with usable relevant tools to manage and maximize their returns from the assets they own. They specialize in cryptographic assets as of now with plans to turn to real digitized assets in the future. - -##### 3\. [Request][8] - -**Request** is primarily a ledger system that handles financial transactions, invoicing, and taxation among other things. Working with other compatible databases and systems it is also capable of verifying payer data and statistics. Large corporations which typically have a significant number of defaulting customers will find it easier to handle their operations with a system such as this. - -##### 4\. [CryptoKitties][9] - -Known the world over as the video game that broke the Ethereum blockchain, **CryptoKitties** is a video game that runs on the Ethereum blockchain. The video game identifies each user individually by building your own digital profiles and gives you unique **virtual cats** in return. The game went viral and due to the sheer number of users it actually managed to slow down the Ethereum blockchain and its transaction capabilities. Transactions took longer than usual with users having to pay significantly extra money for simple transactions even. Concerns regarding scalability of the Ethereum blockchain have been raised by several stakeholders since then. - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/blockchain-2-0-explaining-distributed-computing-and-distributed-applications/ - -作者:[editor][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/editor/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/wp-content/uploads/2019/05/Distributed-Computing-720x340.png -[2]: https://www.ostechnix.com/blockchain-2-0-an-introduction/ -[3]: https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/ -[4]: https://www.techopedia.com/definition/7/distributed-computing-system -[5]: https://www.distributed-systems.net/index.php/books/distributed-systems-3rd-edition-2017/ -[6]: https://melonport.com/ -[7]: https://www.ostechnix.com/blockchain-2-0-explaining-smart-contracts-and-its-types/ -[8]: https://request.network/en/use-cases/ -[9]: https://www.cryptokitties.co/ diff --git a/sources/tech/20190520 How To Map Oracle ASM Disk Against Physical Disk And LUNs In Linux.md b/sources/tech/20190520 How To Map Oracle ASM Disk Against Physical Disk And LUNs In Linux.md deleted file mode 100644 index 4e9df8a0ff..0000000000 --- a/sources/tech/20190520 How To Map Oracle ASM Disk Against Physical Disk And LUNs In Linux.md +++ /dev/null @@ -1,229 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How To Map Oracle ASM Disk Against Physical Disk And LUNs In Linux?) -[#]: via: (https://www.2daygeek.com/shell-script-map-oracle-asm-disks-physical-disk-lun-in-linux/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -How To Map Oracle ASM Disk Against Physical Disk And LUNs In Linux? -====== - -You might already know about ASM, Device Mapper Multipathing (DM-Multipathing) if you are working quit long time as a Linux administrator. - -There are multiple ways to check these information. However, you will be getting part of the information when you use the default commands. - -It doesn’t show you all together in the single output. - -If you want to check all together in the single output then we need to write a small shell script to achieve this. - -We have added two shell script to get those information and you can use which one is suitable for you. - -Major and Minor numbers can be used to match the physical devices in Linux system. - -This tutorial helps you to find which ASM disk maps to which Linux partition or DM Device. - -If you want to **[manage Oracle ASM disks][1]** (such as start, enable, stop, list, query and etc) then navigate to following URL. - -### What Is ASMLib? - -ASMLib is an optional support library for the Automatic Storage Management feature of the Oracle Database. - -Automatic Storage Management (ASM) simplifies database administration and greatly reduces kernel resource usage (e.g. the number of open file descriptors). - -It eliminates the need for the DBA to directly manage potentially thousands of Oracle database files, requiring only the management of groups of disks allocated to the Oracle Database. - -ASMLib allows an Oracle Database using ASM more efficient and capable access to the disk groups it is using. - -### What Is Device Mapper Multipathing (DM-Multipathing)? - -Device Mapper Multipathing or DM-multipathing is a Linux host-side native multipath tool, which allows us to configure multiple I/O paths between server nodes and storage arrays into a single device by utilizing device-mapper. - -### Method-1 : Shell Script To Map ASM Disks To Physical Devices? - -In this shell script we are using for loop to achieve the results. - -Also, we are not using any ASM related commands. - -``` -# vi asm_disk_mapping.sh - -#!/bin/bash - -ls -lh /dev/oracleasm/disks > /tmp/asmdisks1.txt - -for ASMdisk in `cat /tmp/asmdisks1.txt | tail -n +2 | awk '{print $10}'` - -do - -minor=$(grep -i "$ASMdisk" /tmp/asmdisks1.txt | awk '{print $6}') - -major=$(grep -i "$ASMdisk" /tmp/asmdisks1.txt | awk '{print $5}' | cut -d"," -f1) - -phy_disk=$(ls -l /dev/* | grep ^b | grep "$major, *$minor" | awk '{print $10}') - -echo "ASM disk $ASMdisk is associated on $phy_disk [$major, $minor]" - -done -``` - -Set an executable permission to port_scan.sh file. - -``` -$ chmod +x asm_disk_mapping.sh -``` - -Finally run the script to achieve this. - -``` -# sh asm_disk_mapping.sh - -ASM disk MP4E6D_DATA01 is associated on /dev/dm-1 -3600a0123456789012345567890234q11 [253, 1] -ASM disk MP4E6E_DATA02 is associated on /dev/dm-2 -3600a0123456789012345567890234q12 [253, 2] -ASM disk MP4E6F_DATA03 is associated on /dev/dm-3 -3600a0123456789012345567890234q13 [253, 3] -ASM disk MP4E70_DATA04 is associated on /dev/dm-4 -3600a0123456789012345567890234q14 [253, 4] -ASM disk MP4E71_DATA05 is associated on /dev/dm-5 -3600a0123456789012345567890234q15 [253, 5] -ASM disk MP4E72_DATA06 is associated on /dev/dm-6 -3600a0123456789012345567890234q16 [253, 6] -ASM disk MP4E73_DATA07 is associated on /dev/dm-7 -3600a0123456789012345567890234q17 [253, 7] -``` - -### Method-2 : Shell Script To Map ASM Disks To Physical Devices? - -In this shell script we are using while loop to achieve the results. - -Also, we are using ASM related commands. - -``` -# vi asm_disk_mapping_1.sh - -#!/bin/bash - -/etc/init.d/oracleasm listdisks > /tmp/asmdisks.txt - -while read -r ASM_disk - -do - -major="$(/etc/init.d/oracleasm querydisk -d $ASM_disk | awk -F[ '{ print $2 }'| awk -F] '{ print $1 }' | cut -d"," -f1)" - -minor="$(/etc/init.d/oracleasm querydisk -d $ASM_disk | awk -F[ '{ print $2 }'| awk -F] '{ print $1 }' | cut -d"," -f2)" - -phy_disk="$(ls -l /dev/* | grep ^b | grep "$major, *$minor" | awk '{ print $10 }')" - -echo "ASM disk $ASM_disk is associated on $phy_disk [$major, $minor]" - -done < /tmp/asmdisks.txt -``` - -Set an executable permission to port_scan.sh file. - -``` -$ chmod +x asm_disk_mapping_1.sh -``` - -Finally run the script to achieve this. - -``` -# sh asm_disk_mapping_1.sh - -ASM disk MP4E6D_DATA01 is associated on /dev/dm-1 -3600a0123456789012345567890234q11 [253, 1] -ASM disk MP4E6E_DATA02 is associated on /dev/dm-2 -3600a0123456789012345567890234q12 [253, 2] -ASM disk MP4E6F_DATA03 is associated on /dev/dm-3 -3600a0123456789012345567890234q13 [253, 3] -ASM disk MP4E70_DATA04 is associated on /dev/dm-4 -3600a0123456789012345567890234q14 [253, 4] -ASM disk MP4E71_DATA05 is associated on /dev/dm-5 -3600a0123456789012345567890234q15 [253, 5] -ASM disk MP4E72_DATA06 is associated on /dev/dm-6 -3600a0123456789012345567890234q16 [253, 6] -ASM disk MP4E73_DATA07 is associated on /dev/dm-7 -3600a0123456789012345567890234q17 [253, 7] -``` - -### How To List Oracle ASM Disks? - -If you would like to list only Oracle ASM disk then use the below command to List available/created Oracle ASM disks in Linux. - -``` -# oracleasm listdisks - -ASM_Disk1 -ASM_Disk2 -ASM_Disk3 -ASM_Disk4 -ASM_Disk5 -ASM_Disk6 -ASM_Disk7 -``` - -### How To List Oracle ASM Disks Against Major And Minor Number? - -If you would like to map Oracle ASM disks against major and minor number then use the below commands to List available/created Oracle ASM disks in Linux. - -``` -# for ASMdisk in `oracleasm listdisks`; do /etc/init.d/oracleasm querydisk -d $ASMdisk; done - -Disk "ASM_Disk1" is a valid Disk on device [253, 1] -Disk "ASM_Disk2" is a valid Disk on device [253, 2] -Disk "ASM_Disk3" is a valid Disk on device [253, 3] -Disk "ASM_Disk4" is a valid Disk on device [253, 4] -Disk "ASM_Disk5" is a valid Disk on device [253, 5] -Disk "ASM_Disk6" is a valid Disk on device [253, 6] -Disk "ASM_Disk7" is a valid Disk on device [253, 7] -``` - -Alternatively, we can get the same results using the ls command. - -``` -# ls -lh /dev/oracleasm/disks - -total 0 -brw-rw---- 1 oracle oinstall 253, 1 May 19 14:44 ASM_Disk1 -brw-rw---- 1 oracle oinstall 253, 2 May 19 14:44 ASM_Disk2 -brw-rw---- 1 oracle oinstall 253, 3 May 19 14:44 ASM_Disk3 -brw-rw---- 1 oracle oinstall 253, 4 May 19 14:44 ASM_Disk4 -brw-rw---- 1 oracle oinstall 253, 5 May 19 14:44 ASM_Disk5 -brw-rw---- 1 oracle oinstall 253, 6 May 19 14:44 ASM_Disk6 -brw-rw---- 1 oracle oinstall 253, 7 May 19 14:44 ASM_Disk7 -``` - -### How To List Physical Disks Against LUNs? - -If you would like to map physical disks against LUNs then use the below command. - -``` -# multipath -ll | grep NETAPP - -3600a0123456789012345567890234q11 dm-1 NETAPP,LUN C-Mode -3600a0123456789012345567890234q12 dm-2 NETAPP,LUN C-Mode -3600a0123456789012345567890234q13 dm-3 NETAPP,LUN C-Mode -3600a0123456789012345567890234q14 dm-4 NETAPP,LUN C-Mode -3600a0123456789012345567890234q15 dm-5 NETAPP,LUN C-Mode -3600a0123456789012345567890234q16 dm-6 NETAPP,LUN C-Mode -3600a0123456789012345567890234q17 dm-7 NETAPP,LUN C-Mode -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/shell-script-map-oracle-asm-disks-physical-disk-lun-in-linux/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/start-stop-restart-enable-reload-oracleasm-service-linux-create-scan-list-query-rename-delete-configure-oracleasm-disk/ diff --git a/sources/tech/20190521 How to Disable IPv6 on Ubuntu Linux.md b/sources/tech/20190521 How to Disable IPv6 on Ubuntu Linux.md deleted file mode 100644 index 4420b034e6..0000000000 --- a/sources/tech/20190521 How to Disable IPv6 on Ubuntu Linux.md +++ /dev/null @@ -1,219 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Disable IPv6 on Ubuntu Linux) -[#]: via: (https://itsfoss.com/disable-ipv6-ubuntu-linux/) -[#]: author: (Sergiu https://itsfoss.com/author/sergiu/) - -How to Disable IPv6 on Ubuntu Linux -====== - -Are you looking for a way to **disable IPv6** connections on your Ubuntu machine? In this article, I’ll teach you exactly how to do it and why you would consider this option. I’ll also show you how to **enable or re-enable IPv6** in case you change your mind. - -### What is IPv6 and why would you want to disable IPv6 on Ubuntu? - -**[Internet Protocol version 6][1]** [(][1] **[IPv6][1]**[)][1] is the most recent version of the Internet Protocol (IP), the communications protocol that provides an identification and location system for computers on networks and routes traffic across the Internet. It was developed in 1998 to replace the **IPv4** protocol. - -**IPv6** aims to improve security and performance, while also making sure we don’t run out of addresses. It assigns unique addresses globally to every device, storing them in **128-bits** , compared to just 32-bits used by IPv4. - -![Disable IPv6 Ubuntu][2] - -Although the goal is for IPv4 to be replaced by IPv6, there is still a long way to go. Less than **30%** of the sites on the Internet makes IPv6 connectivity available to users (tracked by Google [here][3]). IPv6 can also cause [problems with some applications at time][4]. - -Since **VPNs** provide global services, the fact that IPv6 uses globally routed addresses (uniquely assigned) and that there (still) are ISPs that don’t offer IPv6 support shifts this feature lower down their priority list. This way, they can focus on what matters the most for VPN users: security. - -Another possible reason you might want to disable IPv6 on your system is not wanting to expose yourself to various threats. Although IPv6 itself is safer than IPv4, the risks I am referring to are of another nature. If you aren’t actively using IPv6 and its features, [having IPv6 enabled leaves you vulnerable to various attacks][5], offering the hacker another possible exploitable tool. - -On the same note, configuring basic network rules is not enough. You have to pay the same level of attention to tweaking your IPv6 configuration as you do for IPv4. This can prove to be quite a hassle to do (and also to maintain). With IPv6 comes a suite of problems different to those of IPv4 (many of which can be referenced online, given the age of this protocol), giving your system another layer of complexity. - -[][6] - -Suggested read How To Remove Drive Icons From Unity Launcher In Ubuntu 14.04 [Beginner Tips] - -### Disabling IPv6 on Ubuntu [For Advanced Users Only] - -In this section, I’ll be covering how you can disable IPv6 protocol on your Ubuntu machine. Open up a terminal ( **default:** CTRL+ALT+T) and let’s get to it! - -**Note:** _For most of the commands you are going to input in the terminal_ _you are going to need root privileges ( **sudo** )._ - -Warning! - -If you are a regular desktop Linux user and prefer a stable working system, please avoid this tutorial. This is for advanced users who know what they are doing and why they are doing so. - -#### 1\. Disable IPv6 using Sysctl - -First of all, you can **check** if you have IPv6 enabled with: - -``` -ip a -``` - -You should see an IPv6 address if it is enabled (the name of your internet card might be different): - -![IPv6 Address Ubuntu][7] - -You have see the sysctl command in the tutorial about [restarting network in Ubuntu][8]. We are going to use it here as well. To **disable IPv6** you only have to input 3 commands: - -``` -sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 -sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1 -sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1 -``` - -You can check if it worked using: - -``` -ip a -``` - -You should see no IPv6 entry: - -![IPv6 Disabled Ubuntu][9] - -However, this only **temporarily disables IPv6**. The next time your system boots, IPv6 will be enabled again. - -One method to make this option persist is modifying **/etc/sysctl.conf**. I’ll be using vim to edit the file, but you can use any editor you like. Make sure you have **administrator rights** (use **sudo** ): - -![Sysctl Configuration][10] - -Add the following lines to the file: - -``` -net.ipv6.conf.all.disable_ipv6=1 -net.ipv6.conf.default.disable_ipv6=1 -net.ipv6.conf.lo.disable_ipv6=1 -``` - -For the settings to take effect use: - -``` -sudo sysctl -p -``` - -If IPv6 is still enabled after rebooting, you must create (with root privileges) the file **/etc/rc.local** and fill it with: - -``` -#!/bin/bash -# /etc/rc.local - -/etc/sysctl.d -/etc/init.d/procps restart - -exit 0 -``` - -Now use [chmod command][11] to make the file executable: - -``` -sudo chmod 755 /etc/rc.local -``` - -What this will do is manually read (during the boot time) the kernel parameters from your sysctl configuration file. - -[][12] - -Suggested read 3 Ways to Check Linux Kernel Version in Command Line - -#### 2\. Disable IPv6 using GRUB - -An alternative method is to configure **GRUB** to pass kernel parameters at boot time. You’ll have to edit **/etc/default/grub**. Once again, make sure you have administrator privileges: - -![GRUB Configuration][13] - -Now you need to modify **GRUB_CMDLINE_LINUX_DEFAULT** and **GRUB_CMDLINE_LINUX** to disable IPv6 on boot: - -``` -GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ipv6.disable=1" -GRUB_CMDLINE_LINUX="ipv6.disable=1" -``` - -Save the file and run: - -``` -sudo update-grub -``` - -The settings should now persist on reboot. - -### Re-enabling IPv6 on Ubuntu - -To re-enable IPv6, you’ll have to undo the changes you made. To enable IPv6 until reboot, enter: - -``` -sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0 -sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0 -sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0 -``` - -Otherwise, if you modified **/etc/sysctl.conf** you can either remove the lines you added or change them to: - -``` -net.ipv6.conf.all.disable_ipv6=0 -net.ipv6.conf.default.disable_ipv6=0 -net.ipv6.conf.lo.disable_ipv6=0 -``` - -You can optionally reload these values: - -``` -sudo sysctl -p -``` - -You should once again see a IPv6 address: - -![IPv6 Reenabled in Ubuntu][14] - -Optionally, you can remove **/etc/rc.local** : - -``` -sudo rm /etc/rc.local -``` - -If you modified the kernel parameters in **/etc/default/grub** , go ahead and delete the added options: - -``` -GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" -GRUB_CMDLINE_LINUX="" -``` - -Now do: - -``` -sudo update-grub -``` - -**Wrapping Up** - -In this guide I provided you ways in which you can **disable IPv6** on Linux, as well as giving you an idea about what IPv6 is and why you would want to disable it. - -Did you find this article useful? Do you disable IPv6 connectivity? Let us know in the comment section! - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/disable-ipv6-ubuntu-linux/ - -作者:[Sergiu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/sergiu/ -[b]: https://github.com/lujun9972 -[1]: https://en.wikipedia.org/wiki/IPv6 -[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/disable_ipv6_ubuntu.png?fit=800%2C450&ssl=1 -[3]: https://www.google.com/intl/en/ipv6/statistics.html -[4]: https://whatismyipaddress.com/ipv6-issues -[5]: https://www.internetsociety.org/blog/2015/01/ipv6-security-myth-1-im-not-running-ipv6-so-i-dont-have-to-worry/ -[6]: https://itsfoss.com/remove-drive-icons-from-unity-launcher-in-ubuntu/ -[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/ipv6_address_ubuntu.png?fit=800%2C517&ssl=1 -[8]: https://itsfoss.com/restart-network-ubuntu/ -[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/ipv6_disabled_ubuntu.png?fit=800%2C442&ssl=1 -[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/sysctl_configuration.jpg?fit=800%2C554&ssl=1 -[11]: https://linuxhandbook.com/chmod-command/ -[12]: https://itsfoss.com/find-which-kernel-version-is-running-in-ubuntu/ -[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/grub_configuration-1.jpg?fit=800%2C565&ssl=1 -[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/ipv6_address_ubuntu-1.png?fit=800%2C517&ssl=1 diff --git a/sources/tech/20190521 I don-t know how CPUs work so I simulated one in code.md b/sources/tech/20190521 I don-t know how CPUs work so I simulated one in code.md deleted file mode 100644 index 3b9be98d2f..0000000000 --- a/sources/tech/20190521 I don-t know how CPUs work so I simulated one in code.md +++ /dev/null @@ -1,174 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (I don't know how CPUs work so I simulated one in code) -[#]: via: (https://djhworld.github.io/post/2019/05/21/i-dont-know-how-cpus-work-so-i-simulated-one-in-code/) -[#]: author: (daniel harper https://djhworld.github.io) - -I don't know how CPUs work so I simulated one in code -====== - -![][1] - -A few months ago it dawned on me that I didn’t really understand how computers work under the hood. I still don’t understand how modern computers work. - -However, after making my way through [But How Do It Know?][2] by J. Clark Scott, a book which describes the bits of a simple 8-bit computer from the NAND gates, through to the registers, RAM, bits of the CPU, ALU and I/O, I got a hankering to implement it in code. - -While I’m not that interested in the physics of the circuitry, the book just about skims the surface of those waters and gives a neat overview of the wiring and how bits move around the system without the requisite electrical engineering knowledge. For me though I can’t get comfortable with book descriptions, I have to see things in action and learn from my inevitable mistakes, which led me to chart a course on the rough seas of writing a circuit in code and getting a bit weepy about it. - -The fruits of my voyage can be seen in [simple-computer][3]; a simple computer that’s simple and computes things. - -[![][4]][5] [![][6]][7] [![][8]][9] -Example programs - -It is quite a neat little thing, the CPU code is implemented [as a horrific splurge of gates turning on and off][10] but it works, I’ve [unit tested it][11], and we all know unit tests are irrefutable proof that something works. - -It handles [keyboard inputs][12], and renders text [to a display][13] using a painstakingly crafted set of glyphs for a professional font I’ve named “Daniel Code Pro”. The only cheat bit is to get the keyboard input and display output working I had to hook up go channels to speak to the outside world via [GLFW][14], but the rest of it is a simulated circuit. - -I even wrote a [crude assembler][15] which was eye opening to say the least. It’s not perfect. Actually it’s a bit crap, but it highlighted to me the problems that other people have already solved many, many years ago and I think I’m a better person for it. Or worse, depending who you ask. - -### But why you do that? - -> “I’ve seen thirteen year old children do this in Minecraft, come back to me when you’ve built a REAL CPU out of telegraph relays” - -My mental model of computing is stuck in beginner computer science textbooks, and the CPU that powers the [gameboy emulator I wrote back in 2013][16] is really nothing like the CPUs that are running today. Even saying that, the emulator is just a state machine, it doesn’t describe the stuff at the logic gate level. You can implement most of it using just a `switch` statement and storing the state of the registers. - -So I’m trying to get a better understanding of this stuff because I don’t know what L1/L2 caches are, I don’t know what pipelining means, I’m not entirely sure I understand the Meltdown and Spectre vulnerability papers. Someone told me they were optimising their code to make use of CPU caches, I don’t know how to verify that other than taking their word for it. I’m not really sure what all the x86 instructions mean. I don’t understand how people off-load work to a GPU or TPU. I don’t know what a TPU is. I don’t know how to make use of SIMD instructions. - -But all that is built on a foundation of knowledge you need to earn your stripes for, so I ain’t gonna get there without reading the map first. Which means getting back to basics and getting my hands dirty with something simple. The “Scott Computer” described in the book is simple. That’s the reason. - -### Great Scott! It’s alive! - -The Scott computer is an 8-bit processor attached to 256 bytes of RAM, all connected via an 8-bit system bus. It has 4 general purpose registers and can execute [17 machine instructions][17]. Someone built a visual simulator [for the web here][18], which is really cool, I dread to think how long it took to track all the wiring states! - -[![][19]][20] -A diagram outlining all the components that make up the Scott CPU -Copyright © 2009 - 2016 by Siegbert Filbinger and John Clark Scott. - -The book takes you on a journey from the humble NAND gate, onto a Bit of memory, onto a register and then keeps layering on components until you end up with something resembling the above. I really recommend reading it, even if you are already familiar with the concepts because it’s quite a good overview. I don’t recommend the Kindle version though because the diagrams are sometimes hard to zoom in and decipher on a screen. A perennial problem for the Kindle in my experience. - -The only thing that’s different about my computer is I upgraded it to 16-bit to have more memory to play with, as storing even just the glyphs for the [ASCII table][21] would have dwarfed most of the 8-bit machine described in the book, with not much room left for useful code. - -### My development journey - -During development it really was just a case of reading the text, scouring the diagrams and then attempting to translate that using a general purpose programming language code and definitely not using something that’s designed for integrated circuit development. The reason why I wrote it in Go, is well, I know a bit of Go. Naysayers might chime in and say, you blithering idiot! I can’t believe you didn’t spend all your time learning [VHDL][22] or [Verilog][23] or [LogSim][24] or whatever but I’d already written my bits and bytes and NANDs by that point, I was in too deep. Maybe I’ll learn them next and weep about my time wasted, but that’s my cross to bear. - -In the grand scheme of things most of the computer is just passing around a bunch of booleans, so any boolean friendly language will do the job. - -Applying a schema to those booleans is what helps you (the programmer) derive its meaning, and the biggest decision anyone needs to make is decide what [endianness][25] your system is going to use and make sure all the components transfer things to and from the bus in the right order. - -This was an absolute pain in the backside to implement. From the offset I opted for little endian but when testing the ALU my hair took a beating trying to work out why the numbers were coming out wrong. Many, many print statements took place on this one. - -Development did take a while, maybe about a month or two during some of my free time, but once the CPU was done and successfully able to execute 2 + 2 = 5, I was happy. - -Well, until the book discussed the I/O features, with designs for a simple keyboard and display interface so you can get things in and out of the machine. Well I’ve already gotten this far, no point in leaving it in a half finished state. I set myself a goal of being able to type something on a keyboard and render the letters on a display. - -### Peripherals - -The peripherals use the [adapter pattern][26] to act as a hardware interface between the CPU and the outside world. It’s probably not a huge leap to guess this was what the software design pattern took inspiration from. - -![][27] -How the I/O adapters connect to a GLFW window - -With this separation of concerns it was actually pretty simple to hook the other end of the keyboard and display to a window managed by GLFW. In fact I just pulled most of the code from my [emulator][28] and reshaped it a bit, using go channels to act as the signals in and out of the machine. - -### Bringing it to life - -![][29] - -This was probably the most tricky part, or at least the most cumbersome. Writing assembly with such a limited instruction set sucks. Writing assembly using a crude assembler I wrote sucks even more because you can’t shake your fist at someone other than yourself. - -The biggest problem was juggling the 4 registers and keeping track of them, pulling and putting stuff in memory as a temporary store. Whilst doing this I remembered the Gameboy CPU having a stack pointer register so you could push and pop state. Unfortunately this computer doesn’t have such a luxury, so I was mostly moving stuff in and out of memory on a bespoke basis. - -The only pseudo instruction I took the time to implement was `CALL` to help calling functions, this allows you to run a function and then return to the point after the function was called. Without that stack though you can only call one level deep. - -Also as the machine does not support interrupts, you have to implement awful polling code for functions like getting keyboard state. The book does discuss the steps needed to implement interrupts, but it would involve a lot more wiring. - -But anyway enough of the moaning, I ended up writing [four programs][30] and most of them make use of some shared code for drawing fonts, getting keyboard input etc. Not exactly operating system material but it did make me appreciate some of the services a simple operating system might provide. - -It wasn’t easy though, the trickiest part of the text-writer program was getting the maths right to work out when to go to a newline, or what happens when you hit the enter key. - -``` -main-getInput: - CALL ROUTINE-io-pollKeyboard - CALL ROUTINE-io-drawFontCharacter - JMP main-getInput -``` - -The main loop for the text-writer program - -I didn’t get round to implementing the backspace key either, or any of the modifier keys. Made me appreciate how much work must go in to making text editors and how tedious that probably is. - -### On reflection - -This was a fun and very rewarding project for me. In the midst of programming in the assembly language I’d largely forgotten about the NAND, AND and OR gates firing underneath. I’d ascended into the layers of abstraction above. - -While the CPU in the is very simple and a long way from what’s sitting in my laptop, I think this project has taught me a lot, namely: - - * How bits move around between all components using a bus - * How a simple ALU works - * What a simple Fetch-Decode-Execute cycle looks like - * That a machine without a stack pointer register + concept of a stack sucks - * That a machine without interrupts sucks - * What an assembler is and does - * How a peripherals communicate with a simple CPU - * How simple fonts work and an approach to rendering them on a display - * What a simple operating system might start to look like - - - -So what’s next? The book said that no-one has built a computer like this since 1952, meaning I’ve got 67 years of material to brush up on, so that should keep me occupied for a while. I see the [x86 manual is 4800 pages long][31], enough for some fun, light reading at bedtime. - -Maybe I’ll have a brief dalliance with operating system stuff, a flirtation with the C language, a regrettable evening attempting to [solder up a PiDP-11 kit][32] then probably call it quits. I dunno, we’ll see. - -With all seriousness though I think I’m going to start looking into RISC based stuff next, maybe RISC-V, but probably start with early RISC processors to get an understanding of the lineage. Modern CPUs have a lot more features like caches and stuff so I want to understand them as well. A lot of stuff out there to learn. - -Do I need to know any of this stuff in my day job? Probably helps, but not really, but I’m enjoying it, so whatever, thanks for reading xxxx - --------------------------------------------------------------------------------- - -via: https://djhworld.github.io/post/2019/05/21/i-dont-know-how-cpus-work-so-i-simulated-one-in-code/ - -作者:[daniel harper][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://djhworld.github.io -[b]: https://github.com/lujun9972 -[1]: https://djhworld.github.io/img/simple-computer/text-writer.gif (Hello World) -[2]: http://buthowdoitknow.com/ -[3]: https://github.com/djhworld/simple-computer -[4]: https://djhworld.github.io/img/simple-computer/ascii1.png (ASCII) -[5]: https://djhworld.github.io/img/simple-computer/ascii.png -[6]: https://djhworld.github.io/img/simple-computer/brush1.png (brush) -[7]: https://djhworld.github.io/img/simple-computer/brush.png -[8]: https://djhworld.github.io/img/simple-computer/text-writer1.png (doing the typesin') -[9]: https://djhworld.github.io/img/simple-computer/text-writer.png -[10]: https://github.com/djhworld/simple-computer/blob/master/cpu/cpu.go#L763 -[11]: https://github.com/djhworld/simple-computer/blob/master/cpu/cpu_test.go -[12]: https://github.com/djhworld/simple-computer/blob/master/io/keyboard.go#L20 -[13]: https://github.com/djhworld/simple-computer/blob/master/io/display.go#L13 -[14]: https://github.com/djhworld/simple-computer/blob/master/cmd/simulator/glfw_io.go -[15]: https://github.com/djhworld/simple-computer/blob/master/asm/assembler.go -[16]: https://github.com/djhworld/gomeboycolor -[17]: https://github.com/djhworld/simple-computer#instructions -[18]: http://www.buthowdoitknow.com/but_how_do_it_know_cpu_model.html -[19]: https://djhworld.github.io/img/simple-computer/scott-cpu.png (The Scott CPU) -[20]: https://djhworld.github.io/img/simple-computer/scott-cpu.png -[21]: https://github.com/djhworld/simple-computer/blob/master/_programs/ascii.asm#L27 -[22]: https://en.wikipedia.org/wiki/VHDL -[23]: https://en.wikipedia.org/wiki/Verilog -[24]: http://www.cburch.com/logisim/ -[25]: https://en.wikipedia.org/wiki/Endianness -[26]: https://en.wikipedia.org/wiki/Adapter_pattern -[27]: https://djhworld.github.io/img/simple-computer/io.png (i couldn't be bothered to do the corners around the CPU for the system bus) -[28]: https://github.com/djhworld/gomeboycolor-glfw -[29]: https://djhworld.github.io/img/simple-computer/brush.gif (brush.bin) -[30]: https://github.com/djhworld/simple-computer/blob/master/_programs/README.md -[31]: https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf -[32]: https://obsolescence.wixsite.com/obsolescence/pidp-11 diff --git a/sources/tech/20190522 Damn- Antergos Linux has been Discontinued.md b/sources/tech/20190522 Damn- Antergos Linux has been Discontinued.md deleted file mode 100644 index 38c11508bf..0000000000 --- a/sources/tech/20190522 Damn- Antergos Linux has been Discontinued.md +++ /dev/null @@ -1,103 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Damn! Antergos Linux has been Discontinued) -[#]: via: (https://itsfoss.com/antergos-linux-discontinued/) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -Damn! Antergos Linux has been Discontinued -====== - -_**Beginner-friendly Arch Linux based distribution Antergos has announced that the project is being discontinued.**_ - -Arch Linux has always been considered a no-go zone for the beginners. Antergos challenged this status quo and made Arch Linux accessible to everyone by providing easier installation method. People who wouldn’t dare [installing Arch Linux][1], opted for Antergos. - -![Antergos provided easy access to Arch with its easy to use GUI tools][2] - -The project started in 2012-13 and started gaining popularity around 2014. I used Antergos, liked it and covered it here on It’s FOSS and perhaps (slightly) contributed to its popularity. In last five years, Antergos was downloaded close to a million times. - -But for past year or so, I felt that this project was stagnating. Antergos hardly made any news. Neither the forum nor the social media handles were active. The community around Antergos grew thinner though a few dedicated users still remain. - -### The end of Antergos Linux project - -![][3] - -On May 21, 2019, Antergos [announced][4] its discontinuation. Lack of free time cited as the main reason behind this decision. - -> Today, we are announcing the end of this project. As many of you probably noticed over the past several months, we no longer have enough free time to properly maintain Antergos. We came to this decision because we believe that continuing to neglect the project would be a huge disservice to the community. -> -> Antergos Team - -Antergos developers also mentioned that since the project’s code still works, it’s an opportunity for interested developers to take what they find useful and start their own projects. - -#### What happens to Existing Antergos users? - -If you are an Antergos user, you don’t have to worry a lot. It’s not that your system will be unusable from today. Your system will continue to get updates directly from Arch Linux. - -Antergos team plans to release an update to remove the Antergos repositories from your system along with any Antergos-specific packages that no longer serve a purpose as the project is ending. After that any packages installed from the Antergos repo that are in the AUR will begin to receive updates from [AUR][5]. - -[][6] - -Suggested read Peppermint 8 Released. Download Now! - -The Antergos forum and wiki will be functional but only for some time. - -If you think using an ‘unmaintained’ project is not a good idea, you should switch your distribution. The most appropriate choice would be [Manjaro Linux][7]. - -Manjaro Linux started around the same time as Antergos. Both Antergos and Manjaro were sort of competitors as both of them tried to make Arch Linux accessible for everyone. - -Manjaro gained a huge userbase in the last few years and its community is thriving. If you want to remain in Arch domain but don’t want to install Arch Linux itself, Manjaro is the best choice for you. - -Just note that Manjaro Linux doesn’t provide all the updates immediately as Arch or Antergos. It is a rolling release but with stability in mind. So the updates are tested first. - -#### Inevitable fate for smaller distributions? - -_Here’s my opinion on the discontinuation on Antergos and other similar open source projects._ - -Antergos was a niche distribution. It had a smaller but dedicated userbase. The developers cited lack of free time as the main reason for their decision. However, I believe that lack of motivation plays a bigger role in such cases. - -What motivates the people behind a project? They start it mostly as a side project and if the project is good, they start gaining users. This growth of userbase drives their motivation to work on the project. - -If the userbase starts declining or gets stagnated, the motivation takes a hit. - -If the userbase keeps on growing, the motivation increases but only to a certain point. More users require more effort in various tasks around the project. Keeping the wiki and forum along with social media itself is a challenging part, leave aside the actual code development. The situation becomes overwhelming. - -When a project grows in considerable size, project owners have two choices. First choice is to form a community of volunteers and start delegating tasks that could be delegated. Having volunteers dedicated to project is not easy but it can surely be achieved as Debian and Manjaro have done it already. - -[][8] - -Suggested read Lightweight Distribution Linux Lite 4.0 Released With Brand New Look - -Second choice is to create some revenue generation channel around the project. The additional revenue may ‘justify’ those extra hours and in some cases, it could drive the developer to work full time on the project. [elementary OS][9] is trying to achieve something similar by developing an ecosystem of ‘payable apps’ in their software center. - -You may argue that money should not be a factor in Free and Open Source Software culture but the unfortunate truth is that money is always a factor, in every aspect of our life. I am not saying that a project should be purely driven by money but a project must be sustainable in every aspect. - -We have see how other smaller but moderately popular Linux distributions like Korora has been discontinued due to lack of free time. [Solus creator Ikey Doherty had to leave the project][10] to focus on his personal life. Developing and maintaining a successful open source project is not an easy task. - -That’s just my opinion. Please feel free to disagree with it and voice your opinion in the comment section. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/antergos-linux-discontinued/ - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/install-arch-linux/ -[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2015/08/Installing_Antergos_Linux_7.png?ssl=1 -[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/antergos-linux-dead.jpg?resize=800%2C450&ssl=1 -[4]: https://antergos.com/blog/antergos-linux-project-ends/ -[5]: https://itsfoss.com/best-aur-helpers/ -[6]: https://itsfoss.com/peppermint-8-released/ -[7]: https://manjaro.org/ -[8]: https://itsfoss.com/linux-lite-4/ -[9]: https://elementary.io/ -[10]: https://itsfoss.com/ikey-leaves-solus/ diff --git a/sources/tech/20190522 How to Download and Use Ansible Galaxy Roles in Ansible Playbook.md b/sources/tech/20190522 How to Download and Use Ansible Galaxy Roles in Ansible Playbook.md deleted file mode 100644 index 3bb9e39184..0000000000 --- a/sources/tech/20190522 How to Download and Use Ansible Galaxy Roles in Ansible Playbook.md +++ /dev/null @@ -1,193 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Download and Use Ansible Galaxy Roles in Ansible Playbook) -[#]: via: (https://www.linuxtechi.com/use-ansible-galaxy-roles-ansible-playbook/) -[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) - -How to Download and Use Ansible Galaxy Roles in Ansible Playbook -====== - -**Ansible** is tool of choice these days if you must manage multiple devices, be it Linux, Windows, Mac, Network Devices, VMware and lot more. What makes Ansible popular is its agent less feature and granular control. If you have worked with python or have experience with **yaml** , you will feel at home with Ansible. To see how you can install [Ansible][1] click here. - - - -Ansible core modules will let you manage almost anything should you wish to write playbooks, however often there is someone who has already written a role for a problem you are trying to solve. Let’s take an example, you wish to manage NTP clients on the Linux machines, you have 2 choices either write a role which can be applied to the nodes or use **ansible-galaxy** to download an existing role someone has already written/tested for you. Ansible galaxy has roles for almost all the domains and these caters different problems. You can visit to get an idea on domains and popular roles it has. Each role published on galaxy repository is thoroughly tested and has been rated by the users, so you get an idea on how other people who have used it liked it. - -To keep moving with the NTP idea, here is how you can search and install an NTP role from galaxy. - -Firstly, lets run ansible-galaxy with the help flag to check what options does it give us - -``` -[root@linuxtechi ~]# ansible-galaxy --help -``` - -![ansible-galaxy-help][2] - -As you can see from the output above there are some interesting options been shown, since we are looking for a role to manage ntp clients lets try the search option to see how good it is finding what we are looking for. - -``` -[root@linuxtechi ~]# ansible-galaxy search ntp -``` - -Here is the truncated output of the command above. - -![ansible-galaxy-search][3] - -It found 341 matches based on our search, as you can see from the output above many of these roles are not even related to NTP which means our search needs some refinement however, it has managed to pull some NTP roles, lets dig deeper to see what these roles are. But before that let me tell you the naming convention being followed here. The name of a role is always preceded by the author name so that it is easy to segregate roles with the same name. So, if you have written an NTP role and have published it to galaxy repo, it does not get mixed up with someone else repo with the same name. - -With that out of the way, lets continue with our job of installing a NTP role for our Linux machines. Let’s try **bennojoy.ntp** for this example, but before using this we need to figure out couple of things, is this role compatible with the version of ansible I am running. Also, what is the license status of this role. To figure out these, let’s run below ansible-galaxy command, - -``` -[root@linuxtechi ~]# ansible-galaxy info bennojoy.ntp -``` - -![ansible-galaxy-info][4] - -ok so this says the minimum version is 1.4 and the license is BSD, lets download it - -``` -[root@linuxtechi ~]# ansible-galaxy install bennojoy.ntp -- downloading role 'ntp', owned by bennojoy -- downloading role from https://github.com/bennojoy/ntp/archive/master.tar.gz -- extracting bennojoy.ntp to /etc/ansible/roles/bennojoy.ntp -- bennojoy.ntp (master) was installed successfully -[root@linuxtechi ~]# ansible-galaxy list -- bennojoy.ntp, master -[root@linuxtechi ~]# -``` - -Let’s find the newly installed role. - -``` -[root@linuxtechi ~]# cd /etc/ansible/roles/bennojoy.ntp/ -[root@linuxtechi bennojoy.ntp]# ls -l -total 4 -drwxr-xr-x. 2 root root 21 May 21 22:38 defaults -drwxr-xr-x. 2 root root 21 May 21 22:38 handlers -drwxr-xr-x. 2 root root 48 May 21 22:38 meta --rw-rw-r--. 1 root root 1328 Apr 20 2016 README.md -drwxr-xr-x. 2 root root 21 May 21 22:38 tasks -drwxr-xr-x. 2 root root 24 May 21 22:38 templates -drwxr-xr-x. 2 root root 55 May 21 22:38 vars -[root@linuxtechi bennojoy.ntp]# -``` - -I am going to run this newly downloaded role on my Elasticsearch CentOS node. Here is my hosts file - -``` -[root@linuxtechi ~]# cat hosts -[CentOS] -elastic7-01 ansible_host=192.168.1.15 ansibel_port=22 ansible_user=linuxtechi -[root@linuxtechi ~]# -``` - -Let’s try to ping the node using below ansible ping module, - -``` -[root@linuxtechi ~]# ansible -m ping -i hosts elastic7-01 -elastic7-01 | SUCCESS => { - "changed": false, - "ping": "pong" -} -[root@linuxtechi ~]# -``` - -Here is what the current ntp.conf looks like on elastic node. - -``` -[root@linuxtechi ~]# head -30 /etc/ntp.conf -``` - -![Current-ntp-conf][5] - -Since I am in India, lets add server **in.pool.ntp.org** to ntp.conf. I would have to edit the variables in default directory of the role. - -``` -[root@linuxtechi ~]# vi /etc/ansible/roles/bennojoy.ntp/defaults/main.yml -``` - -Change NTP server address in “ntp_server” parameter, after updating it should look like below. - -![Update-ansible-ntp-role][6] - -The last thing now is to create my playbook which would call this role. - -``` -[root@linuxtechi ~]# vi ntpsite.yaml ---- - - name: Configure NTP on CentOS/RHEL/Debian System - become: true - hosts: all - roles: - - {role: bennojoy.ntp} -``` - -save and exit the file - -We are ready to run this role now, use below command to run ntp playbook, - -``` -[root@linuxtechi ~]# ansible-playbook -i hosts ntpsite.yaml -``` - -Output of above ntp ansible playbook should be something like below, - -![ansible-playbook-output][7] - -Let’s check updated file now. go to elastic node and view the contents of ntp.conf file - -``` -[root@linuxtechi ~]# cat /etc/ntp.conf -#Ansible managed - -driftfile /var/lib/ntp/drift -server in.pool.ntp.org - -restrict -4 default kod notrap nomodify nopeer noquery -restrict -6 default kod notrap nomodify nopeer noquery -restrict 127.0.0.1 -[root@linuxtechi ~]# -``` - -Just in case you do not find a role fulfilling your requirement ansible-galaxy can help you create a directory structure for your custom roles. This helps your playbooks along with the variables, handlers, templates etc assembled in a standardized file structure. Let’s create our own role, its always a good practice to let ansible-galaxy create the structure for you. - -``` -[root@linuxtechi ~]# ansible-galaxy init pk.backup -- pk.backup was created successfully -[root@linuxtechi ~]# -``` - -Verify the structure of your role using the tree command, - -![createing-roles-ansible-galaxy][8] - -Let me quickly explain what each of these directories and files are for, each of these serves a purpose. - -The very first one is the **defaults** directory which contains the files containing variables with takes the lowest precedence, if the same variables are assigned in var directory it will be take precedence over default. The **handlers** directory hosts the handlers. The **file** and **templates** keep any files your role may need to copy and **jinja templates** to be used in playbooks respectively. The **tasks** directory is where your playbooks containing the tasks are kept. The var directory consists of all the files that hosts the variables used in role. The test directory consists of a sample inventory and test playbooks which can be used to test the role. The **meta directory** consists of any dependencies on other roles along with the authorship information. - -Finally, **README.md** file simply consists of some general information like description and minimum version of ansible this role is compatible with. - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/use-ansible-galaxy-roles-ansible-playbook/ - -作者:[Pradeep Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/pradeep/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/install-and-use-ansible-in-centos-7/ -[2]: https://www.linuxtechi.com/wp-content/uploads/2019/05/ansible-galaxy-help-1024x294.jpg -[3]: https://www.linuxtechi.com/wp-content/uploads/2019/05/ansible-galaxy-search-1024x552.jpg -[4]: https://www.linuxtechi.com/wp-content/uploads/2019/05/ansible-galaxy-info-1024x557.jpg -[5]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Current-ntp-conf.jpg -[6]: https://www.linuxtechi.com/wp-content/uploads/2019/05/Update-ansible-ntp-role.jpg -[7]: https://www.linuxtechi.com/wp-content/uploads/2019/05/ansible-playbook-output-1024x376.jpg -[8]: https://www.linuxtechi.com/wp-content/uploads/2019/05/createing-roles-ansible-galaxy.jpg diff --git a/sources/tech/20190523 Testing a Go-based S2I builder image.md b/sources/tech/20190523 Testing a Go-based S2I builder image.md deleted file mode 100644 index a6facd515d..0000000000 --- a/sources/tech/20190523 Testing a Go-based S2I builder image.md +++ /dev/null @@ -1,222 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Testing a Go-based S2I builder image) -[#]: via: (https://opensource.com/article/19/5/source-image-golang-part-3) -[#]: author: (Chris Collins https://opensource.com/users/clcollins) - -Testing a Go-based S2I builder image -====== -In the third article in this series on Source-to-Image for Golang -applications, build your application image and take it out for a spin. -![gopher illustrations][1] - -In the first two articles in this series, we explored the general [requirements of a Source To Image (S2I) system][2] and [prepared an environment][3] specifically for a Go (Golang) application. Now let's give it a spin. - -### Building the builder image - -Once the Dockerfile and Source-to-Image (S2I) scripts are ready, the Golang builder image can be created with the **docker build** command: - - -``` -`docker build -t golang-builder .` -``` - -This will produce a builder image named **golang-builder** with the context of our current directory. - -### Building the application image - -The golang-builder image is not much use without an application to build. For this exercise, we will build a simple **hello-world** application. - -#### GoHelloWorld - -Let's meet our test app, [GoHelloWorld][4]. Download the latest [version of Go][5] if you want to follow along. There are two important (for this exercise) files in this repository: - - -``` -// goHelloWorld.go -package main - -import "fmt" - -func main() { -fmt.Println("Hello World!") -} -``` - -This is a very basic app, but it will work fine for testing the builder image. We also have a basic test for GoHelloWorld: - - -``` -// goHelloWorld_test.go -package main - -import "testing" - -func TestMain(t *testing.T) { -t.Log("Hello World!") -} -``` - -#### Build the application image - -Building the application image entails running the **s2i build** command with arguments for the repository containing the code to build (or **.** to build with code from the current directory), the name of the builder image to use, and the name of the resulting application image to create. - - -``` -`$ s2i build https://github.com/clcollins/goHelloWorld.git golang-builder go-hello-world` -``` - -To build from a local directory on a filesystem, replace the Git URL with a period to represent the current directory. For example: - - -``` -`$ s2i build . golang-builder go-hello-world` -``` - -_Note:_ If a Git repository is initialized in the current directory, S2I will fetch the code from the repository URL rather than using the local code. This results in local, uncommitted changes not being used when building the image (if you're unfamiliar with what I mean by "uncommitted changes," brush up on your [Git terminology over here][6]). Directories that are not Git-initialized repositories behave as expected. - -#### Run the application image - -Once the application image is built, it can be tested by running it with the **Docker** command. Source-to-Image has replaced the **CMD** in the image with the run script created earlier so it will execute the **/go/src/app/app** binary created during the build process: - - -``` -$ docker run go-hello-world -Hello World! -``` - -Success! We now have a compiled Go application inside a Docker image created by passing the contents of a Git repo to S2I and without needing a special Dockerfile for our application. - -The application image we just built includes not only the application, but also its source code, test code, the S2I scripts, Golang libraries, and _much of the Debian Linux distribution_ (because the Golang image is based on the Debian base image). The resulting image is not small: - - -``` -$ docker images | grep go-hello-world -go-hello-world latest 75a70c79a12f 4 minutes ago 789 MB -``` - -For applications written in languages that are interpreted at runtime and depend on linked libraries, like Ruby or Python, having all the source code and operating system are necessary to run. The build images will be pretty large as a result, but at least we know it will be able to run. With these languages, we could stop here with our S2I builds. - -There is the option, however, to more explicitly define the production requirements for the application. - -Since the resulting application image would be the same image that would run the production app, I want to assure the required ports, volumes, and environment variables are added to the Dockerfile for the builder image. By writing these in a declarative way, our app is closer to the [Twelve-Factor App][7] recommended practice. For example, if we were to use the builder image to create application images for a Ruby on Rails application running [Puma][8], we would want to open a port to access the webserver. We should add the line **PORT 3000** in the builder Dockerfile so it can be inherited by all the images generated from it. - -But for the Go app, we can do better. - -### Build a runtime image - -Since our builder image created a statically compiled Go binary with our application, we can create a final "runtime" image containing _only_ the binary and none of the other cruft. - -Once the application image is created, the compiled GoHelloWorld app can be extracted and put into a new, empty image using the save-artifacts script. - -#### Runtime files - -Only the application binary and a Dockerfile are required to create the runtime image. - -##### Application binary - -Inside of the application image, the save-artifacts script is written to stream a tar archive of the app binary to stdout. We can check the files included in the tar archive created by save-artifacts with the **-vt** flags for tar: - - -``` -$ docker run go-hello-world /usr/libexec/s2i/save-artifacts | tar -tvf - --rwxr-xr-x 1001/root 1997502 2019-05-03 18:20 app -``` - -If this results in errors along the lines of "This does not appear to be a tar archive," the save-artifacts script is probably outputting other data in addition to the tar stream, as mentioned above. We must make sure to suppress all output other than the tar stream. - -If everything looks OK, we can use **save-artifacts** to copy the binary out of the application image: - - -``` -`$ docker run go-hello-world /usr/libexec/s2i/save-artifacts | tar -xf -` -``` - -This will copy the app file into the current directory, ready to be added to its own image. - -##### Dockerfile - -The Dockerfile is extremely simple, with only three lines. The **FROM scratch** source denotes that it uses an empty, blank parent image. The rest of the Dockerfile specifies copying the app binary into **/app** in the image and using that binary as the image **ENTRYPOINT** : - - -``` -FROM scratch -COPY app /app -ENTRYPOINT ["/app"] -``` - -Save this Dockerfile as **Dockerfile-runtime**. - -Why **ENTRYPOINT** and not **CMD**? We could do either, but since there is nothing else in the image (no filesystem, no shell), we couldn't run anything else anyway. - -#### Building the runtime image - -With the Dockerfile and binary ready to go, we can build the new runtime image: - - -``` -`$ docker build -f Dockerfile-runtime -t go-hello-world:slim .` -``` - -The new runtime image is considerably smaller—just 2MB! - - -``` -$ docker images | grep -e 'go-hello-world *slim' -go-hello-world slim 4bd091c43816 3 minutes ago 2 MB -``` - -We can test that it still works as expected with **docker run** : - - -``` -$ docker run go-hello-world:slim -Hello World! -``` - -### Bootstrapping s2i with s2i create - -While we hand-created all the S2I files in this example, the **s2i** command has a sub-command to help scaffold all the files we might need for a Source-to-Image build: **s2i create**. - -Using the **s2i create** command, we can generate a new project, creatively named **go-hello-world-2** in the **./ghw2** directory: - - -``` -$ s2i create go-hello-world-2 ./ghw2 -$ ls ./ghw2/ -Dockerfile Makefile README.md s2i test -``` - -The **create** sub-command creates a placeholder Dockerfile, a README.md with information about how to use Source-to-Image, some example S2I scripts, a basic test framework, and a Makefile. The Makefile is a great way to automate building and testing the Source-to-Image builder image. Out of the box, running **make** will build our image, and it can be extended to do more. For example, we could add steps to build a base application image, run tests, or generate a runtime Dockerfile. - -### Conclusion - -In this tutorial, we have learned how to use Source-to-Image to build a custom Golang builder image, create an application image using **s2i build** , and extract the application binary to create a super-slim runtime image. - -In a future extension to this series, I would like to look at how to use the builder image we created with [OKD][9] to automatically deploy our Golang apps with **buildConfigs** , **imageStreams** , and **deploymentConfigs**. Please let me know in the comments if you are interested in me continuing the series, and thanks for reading. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/source-image-golang-part-3 - -作者:[Chris Collins][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/clcollins -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/go-golang.png?itok=OAW9BXny (gopher illustrations) -[2]: https://opensource.com/article/19/5/source-image-golang-part-1 -[3]: https://opensource.com/article/19/5/source-image-golang-part-2 -[4]: https://github.com/clcollins/goHelloWorld.git -[5]: https://golang.org/doc/install -[6]: /article/19/2/git-terminology -[7]: https://12factor.net/ -[8]: http://puma.io/ -[9]: https://okd.io/ diff --git a/sources/tech/20190524 Choosing the right model for maintaining and enhancing your IoT project.md b/sources/tech/20190524 Choosing the right model for maintaining and enhancing your IoT project.md deleted file mode 100644 index 06b8fd6de3..0000000000 --- a/sources/tech/20190524 Choosing the right model for maintaining and enhancing your IoT project.md +++ /dev/null @@ -1,96 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Choosing the right model for maintaining and enhancing your IoT project) -[#]: via: (https://opensource.com/article/19/5/model-choose-embedded-iot-development) -[#]: author: (Drew Moseley https://opensource.com/users/drewmoseley) - -Choosing the right model for maintaining and enhancing your IoT project -====== -Learn more about these two models: Centralized Golden Master and -Distributed Build System -![][1] - -In today's connected embedded device market, driven by the [Internet of things (IoT)][2], a large share of devices in development are based on Linux of one form or another. The prevalence of low-cost boards with ready-made Linux distributions is a key driver in this. Acquiring hardware, building your custom code, connecting the devices to other hardware peripherals and the internet as well as device management using commercial cloud providers has never been easier. A developer or development team can quickly prototype a new application and get the devices in the hands of potential users. This is a good thing and results in many interesting new applications, as well as many questionable ones. - -When planning a system design for beyond the prototyping phase, things get a little more complex. In this post, we want to consider mechanisms for developing and maintaining your base [operating system (OS) image][3]. There are many tools to help with this but we won't be discussing individual tools; of interest here is the underlying model for maintaining and enhancing this image and how it will make your life better or worse. - -There are two primary models for generating these images: - - 1. Centralized Golden Master - 2. Distributed Build System - - - -These categories mirror the driving models for [Source Code Management (SCM)][4] systems, and many of the arguments regarding centralized vs. distributed are applicable when discussing OS images. - -### Centralized Golden Master - -Hobbyist and maker projects primarily use the Centralized Golden Master method of creating and maintaining application images. This fact gives this model the benefit of speed and familiarity, allowing developers to quickly set up such a system and get it running. The speed comes from the fact that many device manufacturers provide canned images for their off-the-shelf hardware. For example, boards from such families as the [BeagleBone][5] and [Raspberry Pi][6] offer ready-to-use OS images and [flashing][7]. Relying on these images means having your system up and running in just a few mouse clicks. The familiarity is due to the fact that these images are generally based on a desktop distro many device developers have already used, such as [Debian][8]. Years of using Linux can then directly transfer to the embedded design, including the fact that the packaging utilities remain largely the same, and it is simple for designers to get the extra software packages they need. - -There are a few downsides of such an approach. The first is that the [golden master image][9] is generally a choke point, resulting in lost developer productivity after the prototyping stage since everyone must wait for their turn to access the latest image and make their changes. In the SCM realm, this practice is equivalent to a centralized system with individual [file locking][10]. Only the developer with the lock can work on any given file. - -![Development flow with the Centralized Golden Master model.][11] - -The second downside with this approach is image reproducibility. This issue is usually managed by manually logging into the target systems, installing packages using the native package manager, configuring applications and dot files, and then modifying the system configuration files in place. Once this process is completed, the disk is imaged using the **dd** utility, or an equivalent, and then distributed. - -Again, this approach creates a minefield of potential issues. For example, network-based package feeds may cease to exist, and the base software provided by the vendor image may change. Scripting can help mitigate these issues. However, these scripts tend to be fragile and break when changes are made to configuration file formats or the vendor's base software packages. - -The final issue that arises with this development model is reliance on third parties. If the hardware vendor's image changes don't work for your design, you may need to invest significant time to adapt. To make matters even more complicated, as mentioned before, the hardware vendors often based their images on an upstream project such as Debian or Ubuntu. This situation introduces even more third parties who can affect your design. - -### Distributed Build System - -This method of creating and maintaining an image for your application relies on the generation of target images separate from the target hardware. The developer workflow here is similar to standard software development using an SCM system; the image is fully buildable by tooling and each developer can work independently. Changes to the system are made via edits to metadata files (scripting, recipes, configuration files, etc) and then the tooling is rerun to generate an updated image. These metadata files are then managed using an SCM system. Individual developers can merge the latest changes into their working copies to produce their development images. In this case, no golden master image is needed and developers can avoid the associated bottleneck. - -Release images are then produced by a build system using standard SCM techniques to pull changes from all the developers. - -![Development flow with the Distributed Build System model.][12] - -Working in this fashion allows the size of your development team to increase without reducing productivity of individual developers. All engineers can work independently of the others. Additionally, this build setup ensures that your builds can be reproduced. Using standard SCM workflows can ensure that, at any future time, you can regenerate a specific build allowing for long term maintenance, even if upstream providers are no longer available. Similar to working with distributed SCM tools however, there is additional policy that needs to be in place to enable reproducible, release candidate images. Individual developers have their own copies of the source and can build their own test images but for a proper release engineering effort, development teams will need to establish merging and branching standards and ensure that all changes targeted for release eventually get merged into a well-defined branch. Many upstream projects already have well-defined processes for this kind of release strategy (for instance, using *-stable and *-next branches). - -The primary downside of this approach is the lack of familiarity. For example, adding a package to the image normally requires creating a recipe of some kind and then updating the definitions so that the package binaries are included in the image. This is very different from running apt while logged into a running system. The learning curve of these systems can be daunting but the results are more predictable and scalable and are likely a better choice when considering a design for a product that will be mass produced. - -Dedicated build systems such as [OpenEmbedded][13] and [Buildroot][14] use this model as do distro packaging tools such as [debootstrap][15] and [multistrap][16]. Newer tools such as [Isar][17], [debos][18], and [ELBE][19] also use this basic model. Choices abound, and it is worth the investment to learn one or more of these packages for your designs. The long term maintainability and reproducibility of these systems will reduce risk in your design by allowing you to generate reproducible builds, track all the source code, and remove your dependency on third-party providers continued existence. - -#### Conclusion - -To be clear, the distributed model does suffer some of the same issues as mentioned for the Golden Master Model; especially the reliance on third parties. This is a consequence of using systems designed by others and cannot be completely avoided unless you choose a completely roll-your-own approach which comes with a significant cost in development and maintenance. - -For prototyping and proof-of-concept level design, and a team of just a few developers, the Golden Master Model may well be the right choice given restrictions in time and budget that are present at this stage of development. For low volume, high touch designs, this may be an acceptable trade-off for production use. - -For general production use, the benefits in terms of team size scalability, image reproducibility and developer productivity greatly outweigh the learning curve and overhead of systems implementing the distributed model. Support from board and chip vendors is also widely available in these systems reducing the upfront costs of developing with them. For your next product, I strongly recommend starting the design with a serious consideration of the model being used to generate the base OS image. If you choose to prototype with the golden master model with the intention of migrating to the distributed model, make sure to build sufficient time in your schedule for this effort; the estimates will vary widely depending on the specific tooling you choose as well as the scope of the requirements and the out-of-the-box availability of software packages your code relies on. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/model-choose-embedded-iot-development - -作者:[Drew Moseley][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/drewmoseley -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=RPkPPtDe -[2]: https://en.wikipedia.org/wiki/Internet_of_things -[3]: https://en.wikipedia.org/wiki/System_image -[4]: https://en.wikipedia.org/wiki/Version_control -[5]: http://beagleboard.org/ -[6]: https://www.raspberrypi.org/ -[7]: https://en.wikipedia.org/wiki/Flash_memory -[8]: https://www.debian.org/ -[9]: https://en.wikipedia.org/wiki/Software_release_life_cycle#RTM -[10]: https://en.wikipedia.org/wiki/File_locking -[11]: https://opensource.com/sites/default/files/uploads/cgm1_500.png (Development flow with the Centralized Golden Master model.) -[12]: https://opensource.com/sites/default/files/uploads/cgm2_500.png (Development flow with the Distributed Build System model.) -[13]: https://www.openembedded.org/ -[14]: https://buildroot.org/ -[15]: https://wiki.debian.org/Debootstrap -[16]: https://wiki.debian.org/Multistrap -[17]: https://github.com/ilbers/isar -[18]: https://github.com/go-debos/debos -[19]: https://elbe-rfs.org/ diff --git a/sources/tech/20190524 Dual booting Windows and Linux using UEFI.md b/sources/tech/20190524 Dual booting Windows and Linux using UEFI.md deleted file mode 100644 index b281b6036b..0000000000 --- a/sources/tech/20190524 Dual booting Windows and Linux using UEFI.md +++ /dev/null @@ -1,104 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Dual booting Windows and Linux using UEFI) -[#]: via: (https://opensource.com/article/19/5/dual-booting-windows-linux-uefi) -[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss/users/ckrzen) - -Dual booting Windows and Linux using UEFI -====== -A quick rundown of setting up Linux and Windows to dual boot on the same -machine, using the Unified Extensible Firmware Interface (UEFI). -![Linux keys on the keyboard for a desktop computer][1] - -Rather than doing a step-by-step how-to guide to configuring your system to dual boot, I’ll highlight the important points. As an example, I will refer to my new laptop that I purchased a few months ago. I first installed [Ubuntu Linux][2] onto the entire hard drive, which destroyed the pre-installed [Windows 10][3] installation. After a few months, I decided to install a different Linux distribution, and so also decided to re-install Windows 10 alongside [Fedora Linux][4] in a dual boot configuration. I’ll highlight some essential facts to get started. - -### Firmware - -Dual booting is not just a matter of software. Or, it is, but it involves changing your firmware, which among other things tells your machine how to begin the boot process. Here are some firmware-related issues to keep in mind. - -#### UEFI vs. BIOS - -Before attempting to install, make sure your firmware configuration is optimal. Most computers sold today have a new type of firmware known as [Unified Extensible Firmware Interface (UEFI)][5], which has pretty much replaced the other firmware known as [Basic Input Output System (BIOS)][6], which is often included through the mode many providers call Legacy Boot. - -I had no need for BIOS, so I chose UEFI mode. - -#### Secure Boot - -One other important setting is Secure Boot. This feature detects whether the boot path has been tampered with, and stops unapproved operating systems from booting. For now, I disabled this option to ensure that I could install Fedora Linux. According to the Fedora Project Wiki [Features/Secure Boot ][7] Fedora Linux will work with it enabled. This may be different for other Linux distributions —I plan to revisit this setting in the future. - -In short, if you find that you cannot install your Linux OS with this setting active, disable Secure Boot and try again. - -### Partitioning the boot drive - -If you choose to dual boot and have both operating systems on the same drive, you have to break it into partitions. Even if you dual boot using two different drives, most Linux installations are best broken into a few basic partitions for a variety of reasons. Here are some options to consider. - -#### GPT vs MBR - -If you decide to manually partition your boot drive in advance, I recommend using the [GUID Partition Table (GPT)][8] rather than the older [Master Boot Record (MBR)][9]. Among the reasons for this change, there are two specific limitations of MBR that GPT doesn’t have: - - * MBR can hold up to 15 partitions, while GPT can hold up to 128. - * MBR only supports up to 2 terabytes, while GPT uses 64-bit addresses which allows it to support disks up to 8 million terabytes. - - - -If you have shopped for hard drives recently, then you know that many of today’s drives exceed the 2 terabyte limit. - -#### The EFI system partition - -If you are doing a fresh installation or using a new drive, there are probably no partitions to begin with. In this case, the OS installer will create the first one, which is the [EFI System Partition (ESP)][10]. If you choose to manually partition your drive using a tool such as [gdisk][11], you will need to create this partition with several parameters. Based on the existing ESP, I set the size to around 500MB and assigned it the ef00 (EFI System) partition type. The UEFI specification requires the format to be FAT32/msdos, most likely because it is supportable by a wide range of operating systems. - -![Partitions][12] - -### Operating System Installation - -Once you accomplish the first two tasks, you can install your operating systems. While I focus on Windows 10 and Fedora Linux here, the process is fairly similar when installing other combinations as well. - -#### Windows 10 - -I started the Windows 10 installation and created a 20 Gigabyte Windows partition. Since I had previously installed Linux on my laptop, the drive had an ESP, which I chose to keep. I deleted all existing Linux and swap partitions to start fresh, and then started my Windows installation. The Windows installer automatically created another small partition—16 Megabytes—called the [Microsoft Reserved Partition (MSR)][13]. Roughly 400 Gigabytes of unallocated space remained on the 512GB boot drive once this was finished. - -I then proceeded with and completed the Windows 10 installation process. I then rebooted into Windows to make sure it was working, created my user account, set up wi-fi, and completed other tasks that need to be done on a first-time OS installation. - -#### Fedora Linux - -I next moved to install Linux. I started the process, and when it reached the disk configuration steps, I made sure not to change the Windows NTFS and MSR partitions. I also did not change the EPS, but I did set its mount point to **/boot/efi**. I then created the usual ext4 formatted partitions, **/** (root), **/boot** , and **/home**. The last partition I created was Linux **swap**. - -As with Windows, I continued and completed the Linux installation, and then rebooted. To my delight, at boot time the [GRand][14] [Unified Boot Loader (GRUB)][14] menu provided the choice to select either Windows or Linux, which meant I did not have to do any additional configuration. I selected Linux and completed the usual steps such as creating my user account. - -### Conclusion - -Overall, the process was painless. In past years, there has been some difficulty navigating the changes from UEFI to BIOS, plus the introduction of features such as Secure Boot. I believe that we have now made it past these hurdles and can reliably set up multi-boot systems. - -I don’t miss the [Linux LOader (LILO)][15] anymore! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/dual-booting-windows-linux-uefi - -作者:[Alan Formy-Duval][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/alanfdoss/users/ckrzen -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer) -[2]: https://www.ubuntu.com -[3]: https://www.microsoft.com/en-us/windows -[4]: https://getfedora.org -[5]: https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface -[6]: https://en.wikipedia.org/wiki/BIOS -[7]: https://fedoraproject.org/wiki/Features/SecureBoot -[8]: https://en.wikipedia.org/wiki/GUID_Partition_Table -[9]: https://en.wikipedia.org/wiki/Master_boot_record -[10]: https://en.wikipedia.org/wiki/EFI_system_partition -[11]: https://sourceforge.net/projects/gptfdisk/ -[12]: /sites/default/files/u216961/gdisk_screenshot_s.png -[13]: https://en.wikipedia.org/wiki/Microsoft_Reserved_Partition -[14]: https://en.wikipedia.org/wiki/GNU_GRUB -[15]: https://en.wikipedia.org/wiki/LILO_(boot_loader) diff --git a/sources/tech/20190527 4 open source mobile apps for Nextcloud.md b/sources/tech/20190527 4 open source mobile apps for Nextcloud.md deleted file mode 100644 index c97817e3c1..0000000000 --- a/sources/tech/20190527 4 open source mobile apps for Nextcloud.md +++ /dev/null @@ -1,140 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (4 open source mobile apps for Nextcloud) -[#]: via: (https://opensource.com/article/19/5/mobile-apps-nextcloud) -[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) - -4 open source mobile apps for Nextcloud -====== -Increase Nextcloud's value by turning it into an on-the-go information -hub. -![][1] - -I've been using [Nextcloud][2] (and before that, ownCloud), an open source alternative to file syncing and storage services like Dropbox and Google Drive, for many years. It's been both reliable and useful, and it respects my privacy. - -While Nextcloud is great at both syncing and storage, it's much more than a place to dump your files. Thanks to applications that you can fold into Nextcloud, it becomes more of an information hub than a storage space. - -While I usually interact with Nextcloud using the desktop client or in a browser, I'm not always at my computer (or any computer that I trust). So it's important that I can work with Nextcloud using my [LineageOS][3]-powered smartphone or tablet. - -To do that, I use several open source apps that work with Nextcloud. Let's take a look at four of them. - -As you've probably guessed, this article looks at the Android version of those apps. I grabbed mine from [F-Droid][4], although you get them from other Android app markets. You might be able to get some or all of them from Apple's App Store if you're an iOS person. - -### Working with files and folders - -The obvious app to start with is the [Nextcloud sync client][5]. This little app links your phone or tablet to your Nextcloud account. - -![Nextcloud mobile app][6] - -Using the app, you can: - - * Create folders - * Upload one or more files - * Sync files between your device and server - * Rename or remove files - * Make files available offline - - - -You can also tap a file to view or edit it. If your device doesn't have an app that can open the file, then you're out of luck. You can still download it to your phone or tablet though. - -### Reading news feeds - -Remember all the whining that went on when Google pulled the plug on Google Reader in 2013? This despite Google giving users several months to find an alternative. And, yes, there are alternatives. One of them, believe it or not, is Nextcloud. - -Nextcloud has a built-in RSS reader. All you need to do to get started is upload an [OPML][7] file containing your feeds or manually add a site's RSS feed to Nextcloud. - -Going mobile is easy, too, with the Nextcloud [News Reader app][8]. - -![Nextcloud News app][9] - -Unless you configure the app to sync when you start it up, you'll need to swipe down from the top of the app to load updates to your feeds. Depending on how many feeds you have, and how many unread items are in those feeds, syncing takes anywhere from a few seconds to half a minute. - -From there, tap an item to read it in the News app. - -![Nextcloud News app][10] - -You can also add feeds or open what you're reading in your device's default web browser. - -### Reading and writing notes - -I don't use Nextcloud's [Notes][11] app all that often (I'm more of a [Standard Notes][12] person). That said, you might find the Notes app comes in handy. - -How? By giving you a lightweight way to take [plain text][13] notes on your mobile device. The Notes app syncs any notes you have in your Nextcloud account and displays them in chronological order—newest or last-edited notes first. - -![Nextcloud Notes app][14] - -Tap a note to read or edit it. You can also create a note by tapping the **+** button, then typing what you need to type. - -![Nextcloud Notes app][15] - -There's no formatting, although you can add markup (like Markdown) to the note. Once you're done editing, the app syncs your note with Nextcloud. - -### Accessing your bookmarks - -Nextcloud has a decent bookmarking tool, and its [Bookmarks][16] app makes it easy to work with the tool on your phone or tablet. - -![Nextcloud Bookmarks app][17] - -Like the Notes app, Bookmarks displays your bookmarks in chronological order, with the newest appearing first in the list. - -If you tagged your bookmarks in Nextcloud, you can swipe left in the app to see a list of those tags rather than a long list of bookmarks. Tap a tag to view the bookmarks under it. - -![Nextcloud Bookmarks app][18] - -From there, just tap a bookmark. It opens in your device's default browser. - -You can also add a bookmark within the app. To do that, tap the **+** menu and add the bookmark. - -![Nextcloud Bookmarks app][19] - -You can include: - - * The URL - * A title for the bookmark - * A description - * One or more tags - - - -### Is that all? - -Definitely not. There are apps for [Nextcloud Deck][20] (a personal kanban tool) and [Nextcloud Talk][21] (a voice and video chat app). There are also a number of third-party apps that work with Nextcloud. Just do a search for _Nextcloud_ or _ownCloud_ in your favorite app store to track them down. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/mobile-apps-nextcloud - -作者:[Scott Nesbitt][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/scottnesbitt -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_BUS_cloudagenda_20140341_jehb.png?itok=1NGs3_n4 -[2]: https://nextcloud.com/ -[3]: https://lineageos.org/ -[4]: https://opensource.com/life/15/1/going-open-source-android-f-droid -[5]: https://f-droid.org/en/packages/com.nextcloud.client/ -[6]: https://opensource.com/sites/default/files/uploads/nextcloud-app.png (Nextcloud mobile app) -[7]: http://en.wikipedia.org/wiki/OPML -[8]: https://f-droid.org/en/packages/de.luhmer.owncloudnewsreader/ -[9]: https://opensource.com/sites/default/files/uploads/nextcloud-news.png (Nextcloud News app) -[10]: https://opensource.com/sites/default/files/uploads/nextcloud-news-reading.png (Nextcloud News app) -[11]: https://f-droid.org/en/packages/it.niedermann.owncloud.notes -[12]: https://opensource.com/article/18/12/taking-notes-standard-notes -[13]: https://plaintextproject.online -[14]: https://opensource.com/sites/default/files/uploads/nextcloud-notes.png (Nextcloud Notes app) -[15]: https://opensource.com/sites/default/files/uploads/nextcloud-notes-add.png (Nextcloud Notes app) -[16]: https://f-droid.org/en/packages/org.schabi.nxbookmarks/ -[17]: https://opensource.com/sites/default/files/uploads/nextcloud-bookmarks.png (Nextcloud Bookmarks app) -[18]: https://opensource.com/sites/default/files/uploads/nextcloud-bookmarks-tags.png (Nextcloud Bookmarks app) -[19]: https://opensource.com/sites/default/files/uploads/nextcloud-bookmarks-add.png (Nextcloud Bookmarks app) -[20]: https://f-droid.org/en/packages/it.niedermann.nextcloud.deck -[21]: https://f-droid.org/en/packages/com.nextcloud.talk2 diff --git a/sources/tech/20190527 Blockchain 2.0 - Introduction To Hyperledger Sawtooth -Part 12.md b/sources/tech/20190527 Blockchain 2.0 - Introduction To Hyperledger Sawtooth -Part 12.md deleted file mode 100644 index 8ab4b5b0b8..0000000000 --- a/sources/tech/20190527 Blockchain 2.0 - Introduction To Hyperledger Sawtooth -Part 12.md +++ /dev/null @@ -1,103 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Blockchain 2.0 – Introduction To Hyperledger Sawtooth [Part 12]) -[#]: via: (https://www.ostechnix.com/blockchain-2-0-introduction-to-hyperledger-sawtooth/) -[#]: author: (editor https://www.ostechnix.com/author/editor/) - -Blockchain 2.0 – Introduction To Hyperledger Sawtooth [Part 12] -====== - -![Introduction To Hyperledger Sawtooth][1] - -After having discussed the [**Hyperledger Fabric**][2] project in detail on this blog, its time we moved on to the next project of interest at the Hyperledger camp. **Hyperledger Sawtooth** is Intel’s contribution to the [**Blockchain**][3] consortium mission to develop enterprise ready modular distributed ledgers and applications. Sawtooth is another attempt at creating an easy to roll out blockchain ledger for businesses keeping their resource constraints and security requirements in mind. While platforms such as [**Ethereum**][4] will in theory offer similar functionality when placed in capable hands, Sawtooth readily provides a lot of customizability and is built from the ground up for specific enterprise level use cases. - -The Hyperledger project page has an introductory video detailing the Sawtooth architecture and platform. We’re attaching it here for readers to get a quick round-up about the product. - -Moving to the intricacies of the Sawtooth project, there are **five primary and significant differences** between Sawtooth and its alternatives. The post from now and on will explore these differences and at the end will mention an example real world use case for Hyperledger Sawtooth in managing supply chains. - -### Distinction 1: The consensus algorithm – PoET - -This is perhaps amongst the most notable and significant changes that Sawtooth brings to the fore. While exploring all the different consensus algorithms that exist for blockchain platforms these days is out of the scope of this post, what is to be noted is that Sawtooth uses a **Proof Of Elapsed Time** (POET) based consensus algorithm. Such a system for validating transactions and blocks on the blockchain is considered to be resources efficient unlike other computation heavy systems which use the likes of **Proof of work** or **Proof of stake** algorithms. - -POET is designed to utilize the security and tamper proof features of modern processors with reference implementations utilizing **Intel’s trusted execution environment** (TEE) architecture on its modern CPUs. The fact that the execution of the validating program takes use of a TEE along with a **“lottery”** system that is implemented to choose the **validator** or **node** to fulfill the request makes the process of creating blocks on the Sawtooth architecture secure and resource efficient at the same time. - -The POET algorithm basically elects a validator randomly based on a stochastic process. The probability of a particular node being selected depends on a host of pointers one of which depends on the amount of computing resources the said node has contributed to the ledger so far. The chosen validator then proceeds to timestamp the said block of data and shares it with the permissioned nodes in the network so that there remains a reliable record of the blockchains immutability. This method of electing the “validator” node was developed by **Intel** and so far, has been shown to exhibit zero bias and or error in executing its function. - -### Distinction 2: A fully separated level of abstraction between the application level and core system - -As mentioned, the Sawtooth platform takes modularity to the next level. Here in the reference implementation that is shared by the [**Hyperledger project**][5] foundation, the core system that enables users to create a distributed ledger, and, the application run-time environment (the virtual environment where applications developed to run on the blockchain otherwise known as [**smart contracts**][6] or **chaincode** ) are separated by a full level of abstraction. This essentially means that developers can separately code applications in any programming language of their choice instead of having to conform to and follow platform specific languages. The Sawtooth platform provides support for the following contract languages out of the box: **Java** , **Python** , **C++** , **Go** , **JavaScript** and **Rust**. This distinction between the core system and application levels are obtained by defining a custom transaction family for each application that is developed on the platform. - -A transaction family contains the following: - - * **A transaction processor** : basically, your applications logic or business logic. - * **Data model** : a system that defines and handles data storage and processing at the system level. - * **Client-side handler** to handle the end user side of your application. - - - -Multiple low-level transaction families such as this may be defined in a permissioned blockchain and used in a modular fashion throughout the network. For instance, if a consortium of banks chose to implement it, they could come together and define common functionalities or rules for their applications and then plug and play the transaction families they need in their respective systems without having to develop everything on their own. - -### Distinction 3: SETH - -It is without doubt that a blockchain future would for sure have Ethereum as one of the key players. People at the Hyperledger foundation know this well. The **Hyperledger Burrow project** is in fact meant to address the existence of entities working on multiple platforms by providing a way for developers to use Ethereum blockchain specifications to build custom distributed applications using the **EVM** (Ethereum virtual machine). - -Basically speaking, Burrow lets you customize and deploy Ethereum based [**DApps**][7] (written in **solidity** ) in non-public blockchains (the kind developed for use at the Hyperledger foundation). The Burrow and Sawtooth projects teamed up and created **SETH**. **Sawtooth-Ethereum Integration project** (SETH) is meant to add Ethereum (solidity) smart contract functionality and compatibility to Sawtooth based distributed ledger networks. A much-less known agenda to SETH is the fact that applications (DApps) and smart contracts written for EVM can now be easily ported to Sawtooth. - -### Distinction 4: ACID principle and ability to batch process - -A rather path breaking feature of Sawtooth is its ability to batch transactions together and then package them into a block. The blocks and transactions will still be subject to the **ACID** principle ( **A** tomicity, **C** onsistency, **I** solation and **D** urability). The implication of these two facts are highlighted using an example as follows. - -Let’s say you have **6 transactions** to be packaged into **two blocks (4+2)**. Block A has 4 transactions which individually needs to succeed in order for the next block of 2 transactions to be timestamped and validated. Assuming they succeed, the next block of 2 transactions is processed and assuming even they are successful the entire package of 6 transactions are deemed successful and the overall business logic is deemed successful. For instance, assume you’re selling a car. Different transactions at the ends of the buyer (block A) and the seller (block B) will need be completed in order for the trade to be deemed valid. Ownership is transferred only if both the sides are successful in carrying out their individual transactions. - -Such a feature will improve accountability on individual ends by separating responsibilities and improve the recognizability of faults and errors by the same principle. The ACID principle is implemented by coding for a custom transaction processor and defining a transaction family that will store data in the said block structure. - -### Distinction 5: Parallel transaction execution - -Blockchain platforms usually follow a serial **first come first serve route** to executing transactions and follow a queueing system for the same. Sawtooth provides support for both **serial** and **parallel execution** of transactions. Parallel transaction processing offers significant performance gains for even faster transactions by reducing overall transaction latencies. More faster transactions will be processed along with slower and bigger transactions at the same time on the platform instead of transactions of all types to be kept waiting. - -The methodology followed to implement the parallel transaction paradigm efficiently takes care of the double spending problems and errors due to multiple changes being made to the same state by defining a custom scheduler for the network which can identity processes and their predecessors. - -Real world use case: Supply Chain Management using Sawtooth applied with IoT - -The Sawtooth **official website** lists seafood traceability as an example use case for the Sawtooth platform. The basic template is applicable for almost all supply chain related use cases. - -![][8] - -Figure 1 From the Hyperledger Sawtooth Official Website - -Traditional supply chain management solutions in this space work majorly through manual record keeping which leaves room for massive frauds, errors, and significant quality control issues. IoT has been cited as a solution to overcome such issues with supply chains in day to day use. Inexpensive GPS enabled RFID-tags can be attached to fresh catch or produce as the case may be and can be scanned for updating at the individual processing centres automatically. Buyers or middle men can verify and or track the information easily using a client on their mobile device to know the route their dinner has taken before arriving on their plates. - -While tracking seafood seems to be a first world problem in countries like India, the change an IoT enabled system can bring to public delivery systems in developing countries can be a welcome change. The application is available for demo at this **[link][9]** and users are encouraged to fiddle with it and adopt it to suit their needs. - -**Reference:** - - * [**The Official Hyperledger Sawtooth Docs**][10] - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/blockchain-2-0-introduction-to-hyperledger-sawtooth/ - -作者:[editor][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/editor/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/wp-content/uploads/2019/05/Hyperledger-Sawtooth-720x340.png -[2]: https://www.ostechnix.com/blockchain-2-0-introduction-to-hyperledger-fabric/ -[3]: https://www.ostechnix.com/blockchain-2-0-an-introduction/ -[4]: https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/ -[5]: https://www.ostechnix.com/blockchain-2-0-an-introduction-to-hyperledger-project-hlp/ -[6]: https://www.ostechnix.com/blockchain-2-0-explaining-smart-contracts-and-its-types/ -[7]: https://www.ostechnix.com/blockchain-2-0-explaining-distributed-computing-and-distributed-applications/ -[8]: http://www.ostechnix.com/wp-content/uploads/2019/05/Sawtooth.png -[9]: https://sawtooth.hyperledger.org/examples/seafood.html -[10]: https://sawtooth.hyperledger.org/docs/core/releases/1.0/contents.html diff --git a/sources/tech/20190529 Packit - packaging in Fedora with minimal effort.md b/sources/tech/20190529 Packit - packaging in Fedora with minimal effort.md deleted file mode 100644 index ad431547da..0000000000 --- a/sources/tech/20190529 Packit - packaging in Fedora with minimal effort.md +++ /dev/null @@ -1,244 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Packit – packaging in Fedora with minimal effort) -[#]: via: (https://fedoramagazine.org/packit-packaging-in-fedora-with-minimal-effort/) -[#]: author: (Petr Hracek https://fedoramagazine.org/author/phracek/) - -Packit – packaging in Fedora with minimal effort -====== - -![][1] - -### What is packit - -Packit ([https://packit.dev/)][2] is a CLI tool that helps you auto-maintain your upstream projects into the Fedora operating system. But what does it really mean? - -As a developer, you might want to update your package in Fedora. If you’ve done it in the past, you know it’s no easy task. If you haven’t let me reiterate: it’s no easy task. - -And this is exactly where packit can help: once you have your package in Fedora, you can maintain your SPEC file upstream and, with just one additional configuration file, packit will help you update your package in Fedora when you update your source code upstream. - -Furthermore, packit can synchronize downstream changes to a SPEC file back into the upstream repository. This could be useful if the SPEC file of your package is changed in Fedora repositories and you would like to synchronize it into your upstream project. - -Packit also provides a way to build an SRPM package based on an upstream repository checkout, which can be used for building RPM packages in COPR. - -Last but not least, packit provides a status command. This command provides information about upstream and downstream repositories, like pull requests, release and more others. - -Packit provides also another two commands: _build_ and _create-update_. - -The command _packit build_ performs a production build of your project in Fedora build system – koji. You can Fedora version you want to build against using an option _–dist-git-branch_. The command _packit create-updates_ creates a Bodhi update for the specific branch using the option — _dist-git-branch_. - -### Installation - -You can install packit on Fedora using dnf: - -``` -sudo dnf install -y packit -``` - -### Configuration - -For demonstration use case, I have selected the upstream repository of **colin** ([https://github.com/user-cont/colin)][3]. Colin is a tool to check generic rules and best-practices for containers, dockerfiles, and container images. - -First of all, clone **colin** git repository: - -``` -$ git clone https://github.com/user-cont/colin.git -$ cd colin -``` - -Packit expects to run in the root of your git repository. - -Packit ([https://github.com/packit-service/packit/)][4] needs information about your project, which has to be stored in the upstream repository in the _.packit.yaml_ file (). - -See colin’s packit configuration file: - -``` -$ cat .packit.yaml -specfile_path: colin.spec -synced_files: - -.packit.yaml - - colin.spec -upstream_project_name: colin -downstream_package_name: colin -``` - -What do the values mean? - - * _specfile_path_ – a relative path to a spec file within the upstream repository (mandatory) - * _synced_files_ – a list of relative paths to files in the upstream repo which are meant to be copied to dist-git during an update - * _upstream_project_name_ – name of the upstream repository (e.g. in PyPI); this is used in %prep section - * _downstream_package_name_ – name of the package in Fedora (mandatory) - - - -For more information see the packit configuration documentation () - -### What can packit do? - -Prerequisite for using packit is that you are in a working directory of a git checkout of your upstream project. - -Before running any packit command, you need to do several actions. These actions are mandatory for filing a PR into the upstream or downstream repositories and to have access into the Fedora dist-git repositories. - -Export GitHub token taken from : - -``` -$ export GITHUB_TOKEN= -``` - -Obtain your Kerberos ticket needed for Fedora Account System (FAS) : - -``` -$ kinit @FEDORAPROJECT.ORG -``` - -Export your Pagure API keys taken from : - -``` -$ export PAGURE_USER_TOKEN= -``` - -Packit also needs a fork token to create a pull request. The token is taken from - -Do it by running: - -``` -$ export PAGURE_FORK_TOKEN= -``` - -Or store these tokens in the **~/.config/packit.yaml** file: - -``` -$ cat ~/.config/packit.yaml - -github_token: -pagure_user_token: -pagure_fork_token: -``` - -#### Propose a new upstream release in Fedora - -The command for this first use case is called _**propose-update**_ (). The command creates a new pull request in Fedora dist-git repository using a selected or the latest upstream release. - -``` -$ packit propose-update - -INFO: Running 'anitya' versioneer -Version in upstream registries is '0.3.1'. -Version in spec file is '0.3.0'. -WARNING Version in spec file is outdated -Picking version of the latest release from the upstream registry. -Checking out upstream version 0.3.1 -Using 'master' dist-git branch -Copying /home/vagrant/colin/colin.spec to /tmp/tmptfwr123c/colin.spec. -Archive colin-0.3.0.tar.gz found in lookaside cache (skipping upload). -INFO: Downloading file from URL https://files.pythonhosted.org/packages/source/c/colin/colin-0.3.0.tar.gz -100%[=============================>] 3.18M eta 00:00:00 -Downloaded archive: '/tmp/tmptfwr123c/colin-0.3.0.tar.gz' -About to upload to lookaside cache -won't be doing kinit, no credentials provided -PR created: https://src.fedoraproject.org/rpms/colin/pull-request/14 -``` - -Once the command finishes, you can see a PR in the Fedora Pagure instance which is based on the latest upstream release. Once you review it, it can be merged. - -![][5] - -#### Sync downstream changes back to the upstream repository - -Another use case is to sync downstream changes into the upstream project repository. - -The command for this purpose is called _**sync-from-downstream**_ (). Files synced into the upstream repository are mentioned in the _packit.yaml_ configuration file under the _synced_files_ value. - -``` -$ packit sync-from-downstream - -upstream active branch master -using "master" dist-git branch -Copying /tmp/tmplvxqtvbb/colin.spec to /home/vagrant/colin/colin.spec. -Creating remote fork-ssh with URL git@github.com:phracek/colin.git. -Pushing to remote fork-ssh using branch master-downstream-sync. -PR created: https://github.com/user-cont/colin/pull/229 -``` - -As soon as packit finishes, you can see the latest changes taken from the Fedora dist-git repository in the upstream repository. This can be useful, e.g. when Release Engineering performs mass-rebuilds and they update your SPEC file in the Fedora dist-git repository. - -![][6] - -#### Get the status of your upstream project - -If you are a developer, you may want to get all the information about the latest releases, tags, pull requests, etc. from the upstream and the downstream repository. Packit provides the _**status**_ command for this purpose. - -``` -$ packit status -Downstream PRs: - ID Title URL ----- -------------------------------- --------------------------------------------------------- - 14 Update to upstream release 0.3.1 https://src.fedoraproject.org//rpms/colin/pull-request/14 - 12 Upstream pr: 226 https://src.fedoraproject.org//rpms/colin/pull-request/12 - 11 Upstream pr: 226 https://src.fedoraproject.org//rpms/colin/pull-request/11 - 8 Upstream pr: 226 https://src.fedoraproject.org//rpms/colin/pull-request/8 - -Dist-git versions: -f27: 0.2.0 -f28: 0.2.0 -f29: 0.2.0 -f30: 0.2.0 -master: 0.2.0 - -GitHub upstream releases: -0.3.1 -0.3.0 -0.2.1 -0.2.0 -0.1.0 - -Latest builds: -f27: colin-0.2.0-1.fc27 -f28: colin-0.3.1-1.fc28 -f29: colin-0.3.1-1.fc29 -f30: colin-0.3.1-2.fc30 - -Latest bodhi updates: -Update Karma status ------------------- ------- -------- -colin-0.3.1-1.fc29 1 stable -colin-0.3.1-1.fc28 1 stable -colin-0.3.0-2.fc28 0 obsolete -``` - -#### Create an SRPM - -The last packit use case is to generate an SRPM package based on a git checkout of your upstream project. The packit command for SRPM generation is _**srpm**_. - -``` -$ packit srpm -Version in spec file is '0.3.1.37.g00bb80e'. -SRPM: /home/phracek/work/colin/colin-0.3.1.37.g00bb80e-1.fc29.src.rpm -``` - -### Packit as a service - -In the summer, the people behind packit would like to introduce packit as a service (). In this case, the packit GitHub application will be installed into the upstream repository and packit will perform all the actions automatically, based on the events it receives from GitHub or fedmsg. - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/packit-packaging-in-fedora-with-minimal-effort/ - -作者:[Petr Hracek][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/phracek/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/05/packit3-816x345.png -[2]: https://packit.dev/ -[3]: https://github.com/user-cont/colin -[4]: https://github.com/packit-service/packit/ -[5]: https://fedoramagazine.org/wp-content/uploads/2019/05/colin_pr-1024x781.png -[6]: https://fedoramagazine.org/wp-content/uploads/2019/05/colin_upstream_pr-1-1024x677.png diff --git a/sources/tech/20190530 Creating a Source-to-Image build pipeline in OKD.md b/sources/tech/20190530 Creating a Source-to-Image build pipeline in OKD.md deleted file mode 100644 index 713d117cb3..0000000000 --- a/sources/tech/20190530 Creating a Source-to-Image build pipeline in OKD.md +++ /dev/null @@ -1,484 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Creating a Source-to-Image build pipeline in OKD) -[#]: via: (https://opensource.com/article/19/5/creating-source-image-build-pipeline-okd) -[#]: author: (Chris Collins https://opensource.com/users/clcollins) - -Creating a Source-to-Image build pipeline in OKD -====== -S2I is an ideal way to build and compile Go applications in a repeatable -way, and it just gets better when paired with OKD BuildConfigs. -![][1] - -In the first three articles in this series, we explored the general [requirements][2] of a Source-to-Image (S2I) system and [prepared][3] and [tested][4] an environment specifically for a Go (Golang) application. This S2I build is perfect for local development or maintaining a builder image with a code pipeline, but if you have access to an [OKD][5] or OpenShift cluster (or [Minishift][6]), you can set up the entire workflow using OKD BuildConfigs, not only to build and maintain the builder image but also to use the builder image to create the application image and subsequent runtime image automatically. This way, the images can be rebuilt automatically when downstream images change and can trigger OKD deploymentConfigs to redeploy applications running from these images. - -### Step 1: Build the builder image in OKD - -As in local S2I usage, the first step is to create the builder image to build the GoHelloWorld test application that we can reuse to compile other Go-based applications. This first build step will be a Docker build, just like before, that pulls the Dockerfile and S2I scripts from a Git repository to build the image. Therefore, those files must be committed and available in a public Git repo (or you can use the companion [GitHub repo][7] for this article). - -_Note:_ OKD BuildConfigs do not require that source Git repos are public. To use a private repo, you must set up deploy keys and link the keys to a builder service account. This is not difficult, but for simplicity's sake, this exercise will use a public repository. - -#### Create an image stream for the builder image - -The BuildConfig will create a builder image for us to compile the GoHelloWorld app, but first, we need a place to store the image. In OKD, that place is an image stream. - -An [image stream][8] and its tags are like a manifest or list of related images and image tags. It serves as an abstraction layer that allows you to reference an image, even if the image changes. Think of it as a collection of aliases that reference specific images and, as images are updated, automatically points to the new image version. The image stream is nothing except these aliases—just metadata about real images stored in a registry. - -An image stream can be created with the **oc create imagestream ** command, or it can be created from a YAML file with **oc create -f **. Either way, a brand-new image stream is a small placeholder object that is empty until it is populated with image references, either manually (who wants to do things manually?) or with a BuildConfig. - -Our golang-builder image stream looks like this: - - -``` -# imageStream-golang-builder.yaml -\--- -apiVersion: image.openshift.io/v1 -kind: ImageStream -metadata: -generation: 1 -name: golang-builder -spec: -lookupPolicy: -local: false -``` - -Other than a name, and a (mostly) empty spec, there is nothing really there. - -_Note:_ The **lookupPolicy** has to do with allowing Kubernetes-native components to resolve image stream references since image streams are OKD-native and not a part of the Kubernetes core. This topic is out of scope for this article, but you can read more about how it works in OKD's documentation [Using Image Streams with Kubernetes Resources][9]. - -Create an image stream for the builder image and its progeny. - - -``` -$ oc create -f imageStream-golangBuilder.yaml - -# Check the ImageStream -$ oc get imagestream golang-builder -NAME DOCKER REPO TAGS UPDATED -imagestream.image.openshift.io/golang-builder docker-registry.default.svc:5000/golang-builder/golang-builder -``` - -Note that the newly created image stream has no tags and has never been updated. - -#### Create a BuildConfig for the builder image - -In OKD, a [BuildConfig][10] describes how to build container images from a specific source and triggers for when they build. Don't be thrown off by the language—just as you might say you build and re-build the same image from a Dockerfile, but in reality, you have built multiple images, a BuildConfig builds and rebuilds the same image, but in reality, it creates multiple images. (And suddenly the reason for image streams becomes much clearer!) - -Our builder image BuildConfig describes how to build and re-build our builder image(s). The BuildConfig's core is made up of four important parts: - - 1. Build source - 2. Build strategy - 3. Build output - 4. Build triggers - - - -The _build source_ (predictably) describes where the thing that runs the build comes from. The builds described by the golang-builder BuildConfig will use the Dockerfile and S2I scripts we created previously and, using the Git-type build source, clone a Git repository to get the files to do the builds. - - -``` -source: -type: Git -git: -ref: master -uri: -``` - -The _build strategy_ describes what the build will do with the source files from the build source. The golang-builder BuildConfig mimics the **docker build** we used previously to build our local builder image by using the Docker-type build strategy. - - -``` -strategy: -type: Docker -dockerStrategy: {} -``` - -The **dockerStrategy** build type tells OKD to build a Docker image from the Dockerfile contained in the source specified by the build source. - -The _build output_ tells the BuildConfig what to do with the resulting image. In this case, we specify the image stream we created above and a tag to give to the image. As with our local build, we're tagging it with **golang-builder:1.12** as a reference to the Go version inherited from the parent image. - - -``` -output: -to: -kind: ImageStreamTag -name: golang-builder:1.12 -``` - -Finally, the BuildConfig defines a set of _build triggers_ —events that will cause the image to be rebuilt automatically. For this BuildConfig, a change to the BuildConfig configuration or an update to the upstream image (golang:1.12) will trigger a new build. - - -``` -triggers: -\- type: ConfigChange -\- imageChange: -type: ImageChange -``` - -Using the [builder image BuildConfig][11] from the GitHub repo as a reference (or just using that file), create a BuildConfig YAML file and use it to create the BuildConfig. - - -``` -$ oc create -f buildConfig-golang-builder.yaml - -# Check the BuildConfig -$ oc get bc golang-builder -NAME TYPE FROM LATEST -golang-builder Docker Git@master 1 -``` - -Because the BuildConfig included the "ImageChange" trigger, it immediately kicks off a new build. You can check that the build was created with the **oc get builds** command. - - -``` -# Check the Builds -$ oc get builds -NAME TYPE FROM STATUS STARTED DURATION -golang-builder-1 Docker Git@8eff001 Complete About a minute ago 13s -``` - -While the build is running and after it has completed, you can view its logs with **oc logs -f ** and see the Docker build output as you would locally. - - -``` -$ oc logs -f golang-builder-1-build -Step 1/11 : FROM docker.io/golang:1.12 -\---> 7ced090ee82e -Step 2/11 : LABEL maintainer "Chris Collins <[collins.christopher@gmail.com][12]>" -\---> 7ad989b765e4 -Step 3/11 : ENV CGO_ENABLED 0 GOOS linux GOCACHE /tmp STI_SCRIPTS_PATH /usr/libexec/s2i SOURCE_DIR /go/src/app -\---> 2cee2ce6757d - -<...> -``` - -If you did not include any build triggers (or did not have them in the right place), your build may not start automatically. You can manually kick off a new build with the **oc start-build** command. - - -``` -$ oc start-build golang-builder - -# Or, if you want to automatically tail the build log -$ oc start-build golang-builder --follow -``` - -When the build completes, the resulting image is tagged and pushed to the integrated image registry and the image stream is updated with the new image's information. Check the image stream with the **oc get imagestream** command to see that the new tag exists. - - -``` -$ oc get imagestream golang-builder -NAME DOCKER REPO TAGS UPDATED -golang-builder docker-registry.default.svc:5000/golang-builder/golang-builder 1.12 33 seconds ago -``` - -### Step 2: Build the application image in OKD - -Now that we have a builder image for our Golang applications created and stored within OKD, we can use this builder image to compile all of our Go apps. First on the block is the example GoHelloWorld app from our [local build example][4]. GoHelloWorld is a simple Go app that just outputs **Hello World!** when it's run. - -Just as we did in the local example with the **s2i build** command, we can tell OKD to use our builder image and S2I to build the application image for GoHelloWorld, compiling the Go binary from the source code in the [GoHelloWorld GitHub repository][13]. This can be done with a BuildConfig with a **sourceStrategy** build. - -#### Create an image stream for the application image - -First things first, we need to create an image stream to manage the image created by the BuildConfig. The image stream is just like the golang-builder image stream, just with a different name. Create it with **oc create is** or using a YAML file from the [GitHub repo][7]. - - -``` -$ oc create -f imageStream-goHelloWorld-appimage.yaml -imagestream.image.openshift.io/go-hello-world-appimage created -``` - -#### Create a BuildConfig for the application image - -Just as we did with the builder image BuildConfig, this BuildConfig will use the Git source option to clone our source code from the GoHelloWorld repository. - - -``` -source: -type: Git -git: -uri: -``` - -Instead of using a DockerStrategy build to create an image from a Dockerfile, this BuildConfig will use the sourceStrategy definition to build the image using S2I. - - -``` -strategy: -type: Source -sourceStrategy: -from: -kind: ImageStreamTag -name: golang-builder:1.12 -``` - -Note the **from:** hash in sourceStrategy. This tells OKD to use the **golang-builder:1.12** image we created previously for the S2I build. - -The BuildConfig will output to the new **appimage** image stream we created, and we'll include config- and image-change triggers to kick off new builds automatically if anything updates. - - -``` -output: -to: -kind: ImageStreamTag -name: go-hello-world-appimage:1.0 -triggers: -\- type: ConfigChange -\- imageChange: -type: ImageChange -``` - -Once again, create a BuildConfig or use the one from the GitHub repo. - - -``` -`$ oc create -f buildConfig-goHelloWorld-appimage.yaml` -``` - -The new build shows up alongside the golang-builder build and, because image-change triggers are specified, the build starts immediately. - - -``` -$ oc get builds -NAME TYPE FROM STATUS STARTED DURATION -golang-builder-1 Docker Git@8eff001 Complete 8 minutes ago 13s -go-hello-world-appimage-1 Source Git@99699a6 Running 44 seconds ago -``` - -If you want to watch the build logs, use the **oc logs -f** command. Once the application image build completes, it is pushed to the image stream we specified, then the new image stream tag is created. - - -``` -$ oc get is go-hello-world-appimage -NAME DOCKER REPO TAGS UPDATED -go-hello-world-appimage docker-registry.default.svc:5000/golang-builder/go-hello-world-appimage 1.0 10 minutes ago -``` - -Success! The GoHelloWorld app was cloned from source into a new image and compiled and tested using our S2I scripts. We can use the image as-is but, as with our local S2I builds, we can do better and create an image with just the new Go binary in it. - -### Step 3: Build the runtime image in OKD - -Now that the application image has been created with a compiled Go binary for the GoHelloWorld app, we can use something called chain builds to mimic when we extracted the binary from our local application image and created a new runtime image with just the binary in it. - -#### Create an image stream for the runtime image - -Once again, the first step is to create an image stream image for the new runtime image. - - -``` -# Create the ImageStream -$ oc create -f imageStream-goHelloWorld.yaml -imagestream.image.openshift.io/go-hello-world created - -# Get the ImageStream -$ oc get imagestream go-hello-world -NAME DOCKER REPO TAGS UPDATED -go-hello-world docker-registry.default.svc:5000/golang-builder/go-hello-world -``` - -#### Chain builds - -Chain builds are when one or more BuildConfigs are used to compile software or assemble artifacts for an application, and those artifacts are saved and used by a subsequent BuildConfig to generate a runtime image without re-compiling the code. - -![Chain Build workflow][14] - -Chain build workflow - -#### Create a BuildConfig for the runtime image - -The runtime BuildConfig uses the DockerStrategy build to build the image from a Dockerfile—the same thing we did with the builder image BuildConfig. This time, however, the source is not a Git source, but a Dockerfile source. - -What is the Dockerfile source? It's an inline Dockerfile! Instead of cloning a repo with a Dockerfile in it and building that, we specify the Dockerfile in the BuildConfig. This is especially appropriate with our runtime Dockerfile because it's just three lines long. - - -``` -source: -type: Dockerfile -dockerfile: |- -FROM scratch -COPY app /app -ENTRYPOINT ["/app"] -images: -\- from: -kind: ImageStreamTag -name: go-hello-world-appimage:1.0 -paths: -\- sourcePath: /go/src/app/app -destinationDir: "." -``` - -Note that the Dockerfile in the Dockerfile source definition above is the same as the Dockerfile we used in the [third article][4] in this series when we built the slim GoHelloWorld image locally using the binary we extracted with the S2I **save-artifacts** script. - -Something else to note: **scratch** is a reserved word in Dockerfiles. Unlike other **FROM** statements, it does not define an _actual_ image, but rather that the first layer of this image will be nothing. It is defined with **kind: DockerImage** but does not have a registry or group/namespace/project string. Learn more about this behavior in this excellent [container best practices][15] reference. - -The **images** section of the Dockerfile source describes the source of the artifact(s) to be used in the build; in this case, from the appimage generated earlier. The **paths** subsection describes where to get the binary (i.e., in the **/go/src/app** directory of the app image, get the **app** binary) and where to save it (i.e., in the current working directory of the build itself: **"."** ). This allows the **COPY app /app** to grab the binary from the current working directory and add it to **/app** in the runtime image. - -_Note:_ **paths** is an array of source and the destination path _pairs_. Each entry in the list consists of a source and destination. In the example above, there is just one entry because there is just a single binary to copy. - -The Docker strategy is then used to build the inline Dockerfile. - - -``` -strategy: -type: Docker -dockerStrategy: {} -``` - -Once again, it is output to the image stream created earlier and includes build triggers to automatically kick off new builds. - - -``` -output: -to: -kind: ImageStreamTag -name: go-hello-world:1.0 -triggers: -\- type: ConfigChange -\- imageChange: -type: ImageChange -``` - -Create a BuildConfig YAML or use the runtime BuildConfig from the GitHub repo. - - -``` -$ oc create -f buildConfig-goHelloWorld.yaml -buildconfig.build.openshift.io/go-hello-world created -``` - -If you watch the logs, you'll notice the first step is **FROM scratch** , which confirms we're adding the compiled binary to a blank image. - - -``` -$ oc logs -f pod/go-hello-world-1-build -Step 1/5 : FROM scratch -\---> -Step 2/5 : COPY app /app -\---> 9e70e6c710f8 -Removing intermediate container 4d0bd9cef0a7 -Step 3/5 : ENTRYPOINT /app -\---> Running in 7a2dfeba28ca -\---> d697577910fc - -<...> -``` - -Once the build is completed, check the image stream tag to validate that the new image was pushed to the registry and image stream was updated. - - -``` -$ oc get imagestream go-hello-world -NAME DOCKER REPO TAGS UPDATED -go-hello-world docker-registry.default.svc:5000/golang-builder/go-hello-world 1.0 4 minutes ago -``` - -Make a note of the **DOCKER REPO** string for the image. It will be used in the next section to run the image. - -### Did we create a tiny, binary-only image? - -Finally, let's validate that we did, indeed, build a tiny image with just the binary. - -Check out the image details. First, get the image's name from the image stream. - - -``` -$ oc describe imagestream go-hello-world -Name: go-hello-world -Namespace: golang-builder -Created: 42 minutes ago -Labels: -Annotations: -Docker Pull Spec: docker-registry.default.svc:5000/golang-builder/go-hello-world -Image Lookup: local=false -Unique Images: 1 -Tags: 1 - -1.0 -no spec tag - -* docker-registry.default.svc:5000/golang-builder/go-hello-world@sha256:eb11e0147a2917312f5e0e9da71109f0cb80760e945fdc1e2db6424b91bc9053 -13 minutes ago -``` - -The image is listed at the bottom, described with the SHA hash (e.g., **sha256:eb11e0147a2917312f5e0e9da71109f0cb80760e945fdc1e2db6424b91bc9053** ; yours will be different). - -Get the details of the image using the hash. - - -``` -$ oc describe image sha256:eb11e0147a2917312f5e0e9da71109f0cb80760e945fdc1e2db6424b91bc9053 -Docker Image: docker-registry.default.svc:5000/golang-builder/go-hello-world@sha256:eb11e0147a2917312f5e0e9da71109f0cb80760e945fdc1e2db6424b91bc9053 -Name: sha256:eb11e0147a2917312f5e0e9da71109f0cb80760e945fdc1e2db6424b91bc9053 -Created: 15 minutes ago -Annotations: image.openshift.io/dockerLayersOrder=ascending -image.openshift.io/manifestBlobStored=true -openshift.io/image.managed=true -Image Size: 1.026MB -Image Created: 15 minutes ago -Author: -Arch: amd64 -Entrypoint: /app -Working Dir: -User: -Exposes Ports: -Docker Labels: io.openshift.build.name=go-hello-world-1 -io.openshift.build.namespace=golang-builder -Environment: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -OPENSHIFT_BUILD_NAME=go-hello-world-1 -OPENSHIFT_BUILD_NAMESPACE=golang-builder -``` - -Notice the image size, 1.026MB, is exactly as we want. The image is a scratch image with just the binary inside it! - -### Run a pod with the runtime image - -Using the runtime image we just created, let's create a pod on-demand and run it and validate that it still works. - -This almost never happens in Kubernetes/OKD, but we will run a pod, just a pod, by itself. - - -``` -$ oc run -it go-hello-world --image=docker-registry.default.svc:5000/golang-builder/go-hello-world:1.0 --restart=Never -Hello World! -``` - -Everything is working as expected—the image runs and outputs "Hello World!" just as it did in the previous, local S2I builds. - -By creating this workflow in OKD, we can use the golang-builder S2I image for any Go application. This builder image is in place and built for any other applications, and it will auto-update and rebuild itself anytime the upstream golang:1.12 image changes. - -New apps can be built automatically using the S2I build by creating a chain build strategy in OKD with an appimage BuildConfig to compile the source and the runtime BuildConfig to create the final image. Using the build triggers, any change to the source code in the Git repo will trigger a rebuild through the entire pipeline, rebuilding the appimage and the runtime image automatically. - -This is a great way to maintain updated images for any application. Paired with an OKD deploymentConfig with an image build trigger, long-running applications (e.g., webapps) will be automatically redeployed when new code is committed. - -Source-to-Image is an ideal way to develop builder images to build and compile Go applications in a repeatable way, and it just gets better when paired with OKD BuildConfigs. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/5/creating-source-image-build-pipeline-okd - -作者:[Chris Collins][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/clcollins -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/blocks_building.png?itok=eMOT-ire -[2]: https://opensource.com/article/19/5/source-image-golang-part-1 -[3]: https://opensource.com/article/19/5/source-image-golang-part-2 -[4]: https://opensource.com/article/19/5/source-image-golang-part-3 -[5]: https://www.okd.io/ -[6]: https://github.com/minishift/minishift -[7]: https://github.com/clcollins/golang-s2i.git -[8]: https://docs.okd.io/latest/architecture/core_concepts/builds_and_image_streams.html#image-streams -[9]: https://docs.okd.io/latest/dev_guide/managing_images.html#using-is-with-k8s -[10]: https://docs.okd.io/latest/dev_guide/builds/index.html#defining-a-buildconfig -[11]: https://github.com/clcollins/golang-s2i/blob/master/okd/buildConfig-golang-builder.yaml -[12]: mailto:collins.christopher@gmail.com -[13]: https://github.com/clcollins/goHelloWorld.git -[14]: https://opensource.com/sites/default/files/uploads/chainingbuilds.png (Chain Build workflow) -[15]: http://docs.projectatomic.io/container-best-practices/#_from_scratch diff --git a/sources/tech/20190604 Aging in the open- How this community changed us.md b/sources/tech/20190604 Aging in the open- How this community changed us.md deleted file mode 100644 index a03d49eca2..0000000000 --- a/sources/tech/20190604 Aging in the open- How this community changed us.md +++ /dev/null @@ -1,135 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Aging in the open: How this community changed us) -[#]: via: (https://opensource.com/open-organization/19/6/four-year-celebration) -[#]: author: (Bryan Behrenshausen https://opensource.com/users/bbehrens) - -Aging in the open: How this community changed us -====== -Our community dedicated to exploring open organizational culture and -design turns four years old this week. -![Browser window with birthday hats and a cake][1] - -A community will always surprise you. - -That's not an easy statement for someone like me to digest. I'm not one for surprises. I revel in predictability. I thrive on consistency. - -A passionate and dedicated community offers few of these comforts. Participating in something like [the open organization community at Opensource.com][2]—which [turns four years old this week][3]—means acquiescing to dynamism, to constant change. Every day brings novelty. Every correspondence is packed with possibility. Every interaction reveals undisclosed pathways. - -To [a certain type of person][4] (me again), it can be downright terrifying. - -But that unrelenting and genuine surprise is the [very source of a community's richness][5], its sheer abundance. If a community is the nucleus of all those reactions that catalyze innovations and breakthroughs, then unpredictability and serendipity are its fuel. I've learned to appreciate it—more accurately, perhaps, to stand in awe of it. Four years ago, when the Opensource.com team heeded [Jim Whitehurst's call][6] to build a space for others to "share your thoughts and opinions… on how you think we can all lead and work better in the future" (see the final page of _The Open Organization_ ), we had little more than a mandate, a platform, and a vision. We'd be an open organization [committed to studying, learning from, and propagating open organizations][7]. The rest was a surprise—or rather, a series of surprises: - - * [Hundreds of articles, reviews, guides, and tutorials][2] on infusing open principles into organizations of all sizes across industries - * [A book series][8] spanning five volumes (with [another currently in production][9]) - * A detailed, comprehensive, community-maintained [definition of the "open organization" concept][10] - * A [robust maturity model][11] for anyone seeking to understand how that definition might (or might not) support their own work - - - -All of that—everything you see there, [and more][12]—is the work of a community that never stopped conversing, never ceased creating, never failed to outsmart itself. No one could have predicted it. No one could have [planned for it][13]. We simply do our best to keep up with it. - -And after four years the work continues, more focused and impassioned than ever. Remaining involved with this bunch of writers, educators, consultants, coaches, leaders, and mentors—all united by their belief that openness is the surest source of hope for organizations struggling to address the challenges of our age—has made me appreciate the power of the utterly surprising. I'm even getting a little more comfortable with it. - -That's been its gift to me. But the gifts it has given each of its participants have been equally special. - -As we celebrate four years of challenges, collaboration, and camaraderie this week, let's recount those surprising gifts by hearing from some of the members: - -* * * - -Four years of the open organization community—congratulations to all! - -My first thought was to look at the five most-read articles over the past four years. Here they are: - - * [5 laws every aspiring DevOps engineer should know][14] - * [What value do you bring to your company?][15] - * [8 answers to management questions from an open point of view][16] - * [What to do when you're feeling underutilized][17] - * [What's the point of DevOps?][18] - - - -All great articles. And then I started to think: Of all the great content over the past four years, which articles have impacted me the most? - -I remembered reading several great articles about meetings and how to make them more effective. So I typed "opensource.com meetings" into my search engine, and these two wonderful articles were at the top of the results list: - - * [The secret to better one-on-one meetings][19] - * [Time to rethink your team's approach to meetings][20] - - - -Articles like that have inspired my favorite open organization management principle, which I've tried to apply and has made a huge difference: All meetings are optional. - -**—Jeff Mackanic, senior director, Marketing, Red Hat** - -* * * - -Being a member of the "open community" has reminded me of the power of getting things done via values and shared purpose without command and control—something that seems more important than ever in today's fragmented and often abusive management world, and at a time when truth and transparency themselves are under attack. - -Four years is a long journey for this kind of initiative—but there's still so much to learn and understand about what makes "open" work and what it will take to accelerate the embrace of its principles more widely through different domains of work and society. Congratulations on all you, your colleagues, partners, and other members of the community have done thus far! - -**—Brook Manville, Principal, Brook Manville LLC, author of _A Company of Citizens_ and co-author of _The Harvard Business Review Leader's Handbook_** - -* * * - -The Open Organization Ambassador program has, in the last four years, become an inspired community of experts. We have defined what it means to be a truly open organization. We've written books, guides, articles, and other resources for learning about, understanding, and implementing open principles. We've done this while bringing open principles to other communities, and we've done this together. - -For me, personally and professionally, the togetherness is the best part of this endeavor. I have learned so much from my colleagues. I'm absolutely ecstatic to be one of the idealists and activists in this community—committed to making our workplaces more equitable and open. - -**—Laura Hilliger, co-founder, We Are Open Co-Op, and[Open Organization Ambassador][21]** - -* * * - -Finding the open organization community opened me up to knowing that there are others out there who thought as I did. I wasn't alone. My ideas on leadership and the workplace were not crazy. This sense of belonging increased once I joined the Ambassador team. Our monthly meetings are never long enough. I don't like when we have to hang up because each session is full of laughter, sharpening each other, idea exchange, and joy. Humans seek community. We search for people who share values and ideals as we do but who also push back and help us expand. This is the gift of the open organization community—expansion, growth, and lifelong friendships. Thank you to all of those who contribute their time, intellect, content, and whole self to this awesome think tank that is changing the shape of how we organize to solve problems! - -**—Jen Kelchner, founder and Chief Change Architect, LDR21, and[Open Organization Ambassador][21]** - -* * * - -Happy fourth birthday, open organization community! Thank you for being an ever-present reminder in my life that being open is better than being closed, that listening is more fruitful than telling, and that together we can achieve more. - -**—Michael Doyle, professional coach and[Open Organization Ambassador][21]** - -* * * - -Wow, what a journey it's been exploring the world of open organizations. We're seeing more interest now than ever before. It's amazing to see what this community has done and I'm excited to see what the future holds for open organizations and open leadership. - -**—Jason Hibbets, senior community architect, Red Hat** - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/6/four-year-celebration - -作者:[Bryan Behrenshausen][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/bbehrens -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/happy_birthday_anniversary_celebrate_hats_cake.jpg?itok=Zfsv6DE_ (Browser window with birthday hats and a cake) -[2]: https://opensource.com/open-organization -[3]: https://opensource.com/open-organization/15/5/introducing-open-organization -[4]: https://opensource.com/open-organization/18/11/design-communities-personality-types -[5]: https://opensource.com/open-organization/18/1/why-build-community-1 -[6]: https://www.redhat.com/en/explore/the-open-organization-book -[7]: https://opensource.com/open-organization/resources/ambassadors-program -[8]: https://opensource.com/open-organization/resources/book-series -[9]: https://opensource.com/open-organization/19/5/educators-guide-project -[10]: https://opensource.com/open-organization/resources/open-org-definition -[11]: https://opensource.com/open-organization/resources/open-org-maturity-model -[12]: https://opensource.com/open-organization/resources -[13]: https://opensource.com/open-organization/19/2/3-misconceptions-agile -[14]: https://opensource.com/open-organization/17/5/5-devops-laws -[15]: https://opensource.com/open-organization/15/7/what-value-do-you-bring-your-company -[16]: https://opensource.com/open-organization/16/5/open-questions-and-answers-about-open-management -[17]: https://opensource.com/open-organization/17/4/feeling-underutilized -[18]: https://opensource.com/open-organization/17/5/what-is-the-point-of-DevOps -[19]: https://opensource.com/open-organization/18/5/open-one-on-one-meetings-guide -[20]: https://opensource.com/open-organization/18/3/open-approaches-meetings -[21]: https://opensource.com/open-organization/resources/meet-ambassadors diff --git a/sources/tech/20190604 ExamSnap Guide- 6 Excellent Resources for Microsoft 98-366- Networking Fundamentals Exam.md b/sources/tech/20190604 ExamSnap Guide- 6 Excellent Resources for Microsoft 98-366- Networking Fundamentals Exam.md deleted file mode 100644 index 97414f530f..0000000000 --- a/sources/tech/20190604 ExamSnap Guide- 6 Excellent Resources for Microsoft 98-366- Networking Fundamentals Exam.md +++ /dev/null @@ -1,103 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (ExamSnap Guide: 6 Excellent Resources for Microsoft 98-366: Networking Fundamentals Exam) -[#]: via: (https://www.2daygeek.com/examsnap-guide-6-excellent-resources-for-microsoft-98-366-networking-fundamentals-exam/) -[#]: author: (2daygeek http://www.2daygeek.com/author/2daygeek/) - -ExamSnap Guide: 6 Excellent Resources for Microsoft 98-366: Networking Fundamentals Exam -====== - -The Microsoft 98-366 exam is almost similar to the CompTIA Network+ certification test when it comes to its content. - -It is also known as Networking Fundamentals, and its purpose is to assess your knowledge of switches, routers, OSI models, wide area and local area networks, wireless networking, and IP addressing. - -Those who pass the exam earn the MTA (Microsoft Technology Associate) certificate. This certifications an ideal entry-level credential to help you begin your IT career. - -### 6 Resources for Microsoft MTA 98-366 Exam - -Using approved training materials is the best method to prepare for your certification exam. Most candidates are fond of shortcuts and often use PDFs and brain dumps to prepare for the test. - -It is important to note that these materials need additional study methods. They will not help you gain better knowledge that is meant to make you perform better at work. - -When you take your time to master the course contents of a certification exam, you are not only getting ready for the test but also developing your skills, expertise, and knowledge in the topics covered there. - - * **[ExamSnap][1]** - - - -Another important point to note is that you shouldn’t rely only on brain dumps. Microsoft can withhold or withdraw your certification if it is discovered that you have cheated. - -This may also result in the situation when a person is not allowed to earn the credentials any more. Thus, use only verified platforms such as Examsnap. - -Most people tend to believe that there is no way they can get discovered. However, you need to know that Microsoft has been offering professional certification exams for years and they know what they are doing. - -Now when we have established the importance of using legal materials to prepare for your certification exam, we need to highlight the top resources you can use to prepare for the Microsoft 98-366 test. - -### 1\. Microsoft Video Academy - -The MVA (Microsoft Video Academy) provides you with introductory lessons on the 98-366 certification exam.This is not sufficient for your study although it is a great way to begin your preparation for the test. The materials in the video do not cover everything you need to know before taking the exam. - -In fact, it is introductory series that is meant to lay down the foundation for your study. You will have to explore other materials for you to get an in-depth knowledge of the topics. - -These videos are available without payment, so you can easily access them and use whenever you want. - - * [Microsoft Certification Overview][2] - - - -### 2\. Examsnap - -If you have been looking for material that can help you prepare for the Microsoft Networking Fundamentals exam, look no further because you will know about Examsnap now. - -It is an online platform that provides you with exam dumps and video series of various certification courses. All you need to do is to register on the website and pay a fee for you to be able to access various tools that will help you prepare for the test. - -Examsnap will enable you to pass your exams with confidence by providing you with the most accurate and comprehensive preparation materials on the Internet. The platform also has training courses to help you improve your study. - -Before making any payment on the site, you can complete the trial course to establish whether the site is suitable for your exam preparation needs. - -### 3\. Exam 98-366: MTA Networking Fundamentals - -This is a study resource that is a book. It provides you with a comprehensive approach to the various topics. It is important for you to note that this study guide is critical to your success. - -It offers you more detailed material than the introductory lectures by the MVA. It is advisable that you do not focus on the sample questions in each part when using this book. - -You should not concentrate on the sample questions because they are not so informative. You can make up for this shortcoming by checking out other practice test options. Overall, this book is a top resource that will contribute greatly to your certification exam success. - -### 4\. Measure-Up - -Measure-Up is the official Microsoft practice test provider whereby you can access different materials. You can get a lab and hands-on practice with networking software tools, which are very beneficial for your preparation. The site also has study questions that you can purchase. - -### 5\. U-Certify - -The U-Certify platform is a reputable organization that offers video courses that are considered to be more understandable than those offered by the MVA. In addition to video courses, the site presents flashcards at the end of the videos. - -You can also access a series of practice tests, which contain several hundreds of study questions on the platform. There are more contents in videos and tests that you can access the moment you subscribe. Depending on what you are looking for, you can choose to buy the tests or the videos. - -### 6\. Networking Essentials – Wiki - -There are several posts that are linked to the Networking Essentials page on Wiki, and you can be sure that these articles are greatly detailed with information that will be helpful for your exam preparation. - -It is important to note that they are not meant to be studied as the only resource materials. You should only use them as additional means for the purpose of getting more information on specific topics but not as an individual study tool. - -### Conclusion - -You may not be able to access all the top resources available. However, you can access some of them. In addition to the resources mentioned, there are also some others that are very good. Visit the Microsoft official website to get the list of reliable resource platforms you can use. Study and be well-prepared for the 98-366 certification exam! - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/examsnap-guide-6-excellent-resources-for-microsoft-98-366-networking-fundamentals-exam/ - -作者:[2daygeek][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: http://www.2daygeek.com/author/2daygeek/ -[b]: https://github.com/lujun9972 -[1]: https://www.examsnap.com/ -[2]: https://www.microsoft.com/en-us/learning/certification-overview.aspx diff --git a/sources/tech/20190604 Four Ways To Install Security Updates On Red Hat (RHEL) And CentOS Systems.md b/sources/tech/20190604 Four Ways To Install Security Updates On Red Hat (RHEL) And CentOS Systems.md deleted file mode 100644 index ebe841dbcb..0000000000 --- a/sources/tech/20190604 Four Ways To Install Security Updates On Red Hat (RHEL) And CentOS Systems.md +++ /dev/null @@ -1,174 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Four Ways To Install Security Updates On Red Hat (RHEL) And CentOS Systems?) -[#]: via: (https://www.2daygeek.com/install-security-updates-on-redhat-rhel-centos-system/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -Four Ways To Install Security Updates On Red Hat (RHEL) And CentOS Systems? -====== - -Patching of the Linux server is one of important and routine task of Linux admin. - -Keeping the system with latest patch level is must. It protects your system against unnecessary attack. - -There are three kind of erratas available in the RHEL/CentOS repository, these are Security, Bug Fix and Product Enhancement. - -Now, you have two options to handle this. - -Either install only security updates or all the errata packages. - -We have already written an article in the past **[to check available security updates?][1]**. - -Also, **[check the installed security updates on your system][2]** using this link. - -You can navigate to the above link, if you would like to verify available security updates before installing them. - -In this article, we will show your, how to install security updates in multiple ways on RHEL and CentOS system. - -### 1) How To Install Entire Errata Updates In Red Hat And CentOS System? - -Run the following command to download and apply all available security updates on your system. - -Make a note, this command will install the last available version of any package with at least one security errata. - -Also, install non-security erratas if they provide a more updated version of the package. - -``` -# yum update --security - -Loaded plugins: changelog, package_upload, product-id, search-disabled-repos, subscription-manager, verify, versionlock -RHEL7-Server-DVD | 4.3 kB 00:00:00 -rhel-7-server-rpms | 2.0 kB 00:00:00 ---> 1:grub2-tools-extra-2.02-0.76.el7.1.x86_64 from rhel-7-server-rpms removed (updateinfo) ---> nss-pem-1.0.3-5.el7_6.1.x86_64 from rhel-7-server-rpms removed (updateinfo) -. -35 package(s) needed (+0 related) for security, out of 115 available -Resolving Dependencies ---> Running transaction check ----> Package NetworkManager.x86_64 1:1.12.0-6.el7 will be updated ----> Package NetworkManager.x86_64 1:1.12.0-10.el7_6 will be an update -``` - -Once you ran the above command, it will check all the available updates and its dependency satisfaction. - -``` ---> Finished Dependency Resolution ---> Running transaction check ----> Package kernel.x86_64 0:3.10.0-514.26.1.el7 will be erased ----> Package kernel-devel.x86_64 0:3.10.0-514.26.1.el7 will be erased ---> Finished Dependency Resolution - -Dependencies Resolved -===================================================================================================================================================================== -Package Arch Version Repository Size -===================================================================================================================================================================== -Installing: -kernel x86_64 3.10.0-957.10.1.el7 rhel-7-server-rpms 48 M -kernel-devel x86_64 3.10.0-957.10.1.el7 rhel-7-server-rpms 17 M -Updating: -NetworkManager x86_64 1:1.12.0-10.el7_6 rhel-7-server-rpms 1.7 M -NetworkManager-adsl x86_64 1:1.12.0-10.el7_6 rhel-7-server-rpms 157 k -. -Removing: -kernel x86_64 3.10.0-514.26.1.el7 @rhel-7-server-rpms 148 M -kernel-devel x86_64 3.10.0-514.26.1.el7 @rhel-7-server-rpms 34 M -``` - -If these dependencies were satisfied, which finally gives you a total summary about it. - -The transaction summary shows, how many packages will be getting Installed, upgraded and removed from the system. - -``` -Transaction Summary -===================================================================================================================================================================== -Install 2 Packages -Upgrade 33 Packages -Remove 2 Packages - -Total download size: 124 M -Is this ok [y/d/N]: -``` - -### How To Install Only Security Updates In Red Hat And CentOS System? - -Run the following command to install only the packages that have a security errata. - -``` -# yum update-minimal --security - -Loaded plugins: changelog, package_upload, product-id, search-disabled-repos, subscription-manager, verify, versionlock -rhel-7-server-rpms | 2.0 kB 00:00:00 -Resolving Dependencies ---> Running transaction check ----> Package NetworkManager.x86_64 1:1.12.0-6.el7 will be updated ----> Package NetworkManager.x86_64 1:1.12.0-8.el7_6 will be an update -. ---> Finished Dependency Resolution ---> Running transaction check ----> Package kernel.x86_64 0:3.10.0-514.26.1.el7 will be erased ----> Package kernel-devel.x86_64 0:3.10.0-514.26.1.el7 will be erased ---> Finished Dependency Resolution - -Dependencies Resolved -===================================================================================================================================================================== -Package Arch Version Repository Size -===================================================================================================================================================================== -Installing: -kernel x86_64 3.10.0-957.10.1.el7 rhel-7-server-rpms 48 M -kernel-devel x86_64 3.10.0-957.10.1.el7 rhel-7-server-rpms 17 M -Updating: -NetworkManager x86_64 1:1.12.0-8.el7_6 rhel-7-server-rpms 1.7 M -NetworkManager-adsl x86_64 1:1.12.0-8.el7_6 rhel-7-server-rpms 157 k -. -Removing: -kernel x86_64 3.10.0-514.26.1.el7 @rhel-7-server-rpms 148 M -kernel-devel x86_64 3.10.0-514.26.1.el7 @rhel-7-server-rpms 34 M - -Transaction Summary -===================================================================================================================================================================== -Install 2 Packages -Upgrade 33 Packages -Remove 2 Packages - -Total download size: 124 M -Is this ok [y/d/N]: -``` - -### How To Install Security Update Using CVE reference In Red Hat And CentOS System? - -If you would like to install a security update using a CVE reference, run the following command. - -``` -# yum update --cve - -# yum update --cve CVE-2008-0947 -``` - -### How To Install Security Update Using Specific Advisory In Red Hat And CentOS System? - -Run the following command, if you want to apply only a specific advisory. - -``` -# yum update --advisory= - -# yum update --advisory=RHSA-2014:0159 -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/install-security-updates-on-redhat-rhel-centos-system/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/check-list-view-find-available-security-updates-on-redhat-rhel-centos-system/ -[2]: https://www.2daygeek.com/check-installed-security-updates-on-redhat-rhel-and-centos-system/ diff --git a/sources/tech/20190604 Linux Shell Script To Monitor CPU Utilization And Send Email.md b/sources/tech/20190604 Linux Shell Script To Monitor CPU Utilization And Send Email.md deleted file mode 100644 index f1cb86573b..0000000000 --- a/sources/tech/20190604 Linux Shell Script To Monitor CPU Utilization And Send Email.md +++ /dev/null @@ -1,178 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Linux Shell Script To Monitor CPU Utilization And Send Email) -[#]: via: (https://www.2daygeek.com/linux-shell-script-to-monitor-cpu-utilization-usage-and-send-email/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -Linux Shell Script To Monitor CPU Utilization And Send Email -====== - -There are many opensource monitoring tools are available to monitor Linux systems performance. - -It will send an email alert when the system reaches the given threshold limit. - -It monitors everything such as CPU utilization, Memory utilization, swap utilization, disk space utilization and much more. - -If you only have few systems and want to monitor them then writing a small shell script can achieve this. - -In this tutorial we have added two shell script to monitor CPU utilization on Linux system. - -When the system reaches the given threshold then it will trigger a mail to corresponding email id. - -### Method-1 : Linux Shell Script To Monitor CPU Utilization And Send an Email - -If you want to only get CPU utilization percentage through mail when the system reaches the given threshold, use the following script. - -This is very simple and straightforward and one line script. - -It will trigger an email when your system reaches `80%` CPU utilization. - -``` -*/5 * * * * /usr/bin/cat /proc/loadavg | awk '{print $1}' | awk '{ if($1 > 80) printf("Current CPU Utilization is: %.2f%\n"), $0;}' | mail -s "High CPU Alert" [email protected] -``` - -**Note:** You need to change the email id instead of ours. Also, you can change the CPU utilization threshold value as per your requirement. - -**Output:** You will be getting an email alert similar to below. - -``` -Current CPU Utilization is: 80.40% -``` - -We had added many useful shell scripts in the past. If you want to check those, navigate to the below link. - - * **[How to automate day to day activities using shell scripts?][1]** - - - -### Method-2 : Linux Shell Script To Monitor CPU Utilization And Send an Email - -If you want to get more information about the CPU utilization in the mail alert. - -Then use the following script, which includes top CPU utilization process details based on the top Command and ps Command. - -This will inconstantly gives you an idea what is going on your system. - -It will trigger an email when your system reaches `80%` CPU utilization. - -**Note:** You need to change the email id instead of ours. Also, you can change the CPU utilization threshold value as per your requirement. - -``` -# vi /opt/scripts/cpu-alert.sh - -#!/bin/bash -cpuuse=$(cat /proc/loadavg | awk '{print $1}') - -if [ "$cpuuse" > 80 ]; then - -SUBJECT="ATTENTION: CPU Load Is High on $(hostname) at $(date)" - -MESSAGE="/tmp/Mail.out" - -TO="[email protected]" - - echo "CPU Current Usage is: $cpuuse%" >> $MESSAGE - - echo "" >> $MESSAGE - - echo "+------------------------------------------------------------------+" >> $MESSAGE - - echo "Top CPU Process Using top command" >> $MESSAGE - - echo "+------------------------------------------------------------------+" >> $MESSAGE - - echo "$(top -bn1 | head -20)" >> $MESSAGE - - echo "" >> $MESSAGE - - echo "+------------------------------------------------------------------+" >> $MESSAGE - - echo "Top CPU Process Using ps command" >> $MESSAGE - - echo "+------------------------------------------------------------------+" >> $MESSAGE - - echo "$(ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10)" >> $MESSAGE - - mail -s "$SUBJECT" "$TO" < $MESSAGE - - rm /tmp/Mail.out - - fi -``` - -Finally add a **[cronjob][2]** to automate this. It will run every 5 minutes. - -``` -# crontab -e -*/10 * * * * /bin/bash /opt/scripts/cpu-alert.sh -``` - -**Note:** You will be getting an email alert 5 mins later since the script has scheduled to run every 5 minutes (But it's not exactly 5 mins and it depends the timing). - -Say for example. If your system reaches the limit at 8.25 then you will get an email alert in another 5 mins. Hope it's clear now. - -**Output:** You will be getting an email alert similar to below. - -``` -CPU Current Usage is: 80.51% - -+------------------------------------------------------------------+ -Top CPU Process Using top command -+------------------------------------------------------------------+ -top - 13:23:01 up 1:43, 1 user, load average: 2.58, 2.58, 1.51 -Tasks: 306 total, 3 running, 303 sleeping, 0 stopped, 0 zombie -%Cpu0 : 6.2 us, 6.2 sy, 0.0 ni, 87.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -%Cpu1 : 18.8 us, 0.0 sy, 0.0 ni, 81.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -%Cpu2 : 50.0 us, 37.5 sy, 0.0 ni, 12.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -%Cpu3 : 5.9 us, 5.9 sy, 0.0 ni, 88.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -%Cpu4 : 0.0 us, 5.9 sy, 0.0 ni, 94.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -%Cpu5 : 29.4 us, 23.5 sy, 0.0 ni, 47.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -%Cpu6 : 0.0 us, 5.9 sy, 0.0 ni, 94.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -%Cpu7 : 5.9 us, 0.0 sy, 0.0 ni, 94.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -KiB Mem : 16248588 total, 223436 free, 5816924 used, 10208228 buff/cache -KiB Swap: 17873388 total, 17871340 free, 2048 used. 7440884 avail Mem - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 8867 daygeek 20 2743884 440420 360952 R 100.0 2.7 1:07.25 /usr/lib/virtualbox/VirtualBoxVM --comment CentOS7 --startvm 002f47b8-2af2-48f5-be1d-67b67e03514c --no-startvm-errormsgbox - 9119 daygeek 20 36136 784 R 46.7 0.0 0:00.07 /usr/bin/CROND -n - 1057 daygeek 20 889808 487692 461692 S 13.3 3.0 4:21.12 /usr/lib/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3 - 3098 daygeek 20 1929012 351412 120532 S 13.3 2.2 16:42.51 /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 9236 -prefMapSize 184485 -parentBuildID 20190521202118 -greomni /us+ - 1 root 20 188820 10144 7708 S 6.7 0.1 0:06.92 /sbin/init - 818 gdm 20 199836 25120 15876 S 6.7 0.2 0:01.85 /usr/lib/Xorg vt1 -displayfd 3 -auth /run/user/120/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3 - 1170 daygeek 9 -11 2676516 16516 12520 S 6.7 0.1 1:28.30 /usr/bin/pulseaudio --daemonize=no - 8271 root 20 I 6.7 0:00.21 [kworker/u16:4-i915] - 9117 daygeek 20 13528 4036 3144 R 6.7 0.0 0:00.01 top -bn1 - -+------------------------------------------------------------------+ -Top CPU Process Using ps command -+------------------------------------------------------------------+ -%CPU PID USER COMMAND - 8.8 8522 daygeek /usr/lib/virtualbox/VirtualBox -86.2 8867 daygeek /usr/lib/virtualbox/VirtualBoxVM --comment CentOS7 --startvm 002f47b8-2af2-48f5-be1d-67b67e03514c --no-startvm-errormsgbox -76.1 8921 daygeek /usr/lib/virtualbox/VirtualBoxVM --comment Ubuntu-18.04 --startvm e8c32dbb-8b01-41b0-977a-bf28b9db1117 --no-startvm-errormsgbox - 5.5 8080 daygeek /usr/bin/nautilus --gapplication-service - 4.7 4575 daygeek /usr/lib/firefox/firefox -contentproc -childID 12 -isForBrowser -prefsLen 9375 -prefMapSize 184485 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1525 true tab - 4.4 3511 daygeek /usr/lib/firefox/firefox -contentproc -childID 8 -isForBrowser -prefsLen 9308 -prefMapSize 184485 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1525 true tab - 4.4 3190 daygeek /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 9237 -prefMapSize 184485 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1525 true tab - 4.4 1612 daygeek /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 184485 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1525 true tab - 4.2 3565 daygeek /usr/bin/../lib/notepadqq/notepadqq-bin -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/linux-shell-script-to-monitor-cpu-utilization-usage-and-send-email/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/category/shell-script/ -[2]: https://www.2daygeek.com/crontab-cronjob-to-schedule-jobs-in-linux/ diff --git a/sources/tech/20190605 Tweaking the look of Fedora Workstation with themes.md b/sources/tech/20190605 Tweaking the look of Fedora Workstation with themes.md deleted file mode 100644 index 441415925f..0000000000 --- a/sources/tech/20190605 Tweaking the look of Fedora Workstation with themes.md +++ /dev/null @@ -1,140 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Tweaking the look of Fedora Workstation with themes) -[#]: via: (https://fedoramagazine.org/tweaking-the-look-of-fedora-workstation-with-themes/) -[#]: author: (Ryan Lerch https://fedoramagazine.org/author/ryanlerch/) - -Tweaking the look of Fedora Workstation with themes -====== - -![][1] - -Changing the theme of a desktop environment is a common way to customize your daily experience with Fedora Workstation. This article discusses the 4 different types of visual themes you can change and how to change to a new theme. Additionally, this article will cover how to install new themes from both the Fedora repositories and 3rd party theme sources. - -### Theme Types - -When changing the theme of Fedora Workstation, there are 4 different themes that can be changed independently of each other. This allows a user to mix and match the theme types to customize their desktop in a multitude of combinations. The 4 theme types are the **Application** (GTK) theme, the **shell** theme, the **icon** theme, and the **cursor** theme. - -#### Application (GTK) themes - -As the name suggests, Application themes change the styling of the applications that are displayed on a user’s desktop. Application themes control the style of the window borders and the window titlebar. Additionally, they also control the style of the widgets in the windows — like dropdowns, text inputs, and buttons. One point to note is that an application theme does not change the icons that are displayed in an application — this is achieved using the icon theme. - -![Two application windows with two different application themes. The default Adwaita theme on the left, the Adapta theme on the right.][2] - -Application themes are also known as GTK themes, as GTK ( **G** IMP **T** ool **k** it) is the underlying technology that is used to render the windows and user interface widgets in those windows on Fedora Workstation. - -#### Shell Themes - -Shell themes change the appearance of the GNOME Shell. The GNOME Shell is the technology that displays the top bar (and the associated widgets like drop downs), as well as the overview screen and the applications list it contains. - -![Comparison of two Shell themes, with the Fedora Workstation default on top, and the Adapta shell theme on the bottom.][3] - -#### Icon Themes - -As the name suggests, icon themes change the icons used in the desktop. Changing the icon theme will change the icons displayed both in the Shell, and in applications. - -![Comparison of two icon themes, with the Fedora 30 Workstation default Adwaita on the left, and the Yaru icon theme on the right][4] - -One important item to note with icon themes is that all icon themes will not have customized icons for all application icons. Consequently, changing the icon theme will not change all the icons in the applications list in the overview. - -![Comparison of two icon themes, with the Fedora 30 Workstation default Adwaita on the top, and the Yaru icon theme on the bottom][5] - -#### Cursor Theme - -The cursor theme allows a user to change how the mouse pointer is displayed. Most cursor themes change all the common cursors, including the pointer, drag handles and the loading cursor. - -![Comparison of multiple cursors of two different cursor themes. Fedora 30 default is on the left, the Breeze Snow theme on the right.][6] - -### Changing the themes - -Changing themes on Fedora Workstation is a simple process. To change all 4 types of themes, use the **Tweaks** application. Tweaks is a tool used to change a range of different options in Fedora Workstation. It is not installed by default, and is installed using the Software application: - -![][7] - -Alternatively, install Tweaks from the command line with the command: - -``` -sudo dnf install gnome-tweak-tool -``` - -In addition to Tweaks, to change the Shell theme, the **User Themes** GNOME Shell Extension needs to be installed and enabled. [Check out this post for more details on installing extensions][8]. - -Next, launch Tweaks, and switch to the Appearance pane. The Themes section in the Appearance pane allows the changing of the multiple theme types. Simply choose the theme from the dropdown, and the new theme will apply automatically. - -![][9] - -### Installing themes - -Armed with the knowledge of the types of themes, and how to change themes, it is time to install some themes. Broadly speaking, there are two ways to install new themes to your Fedora Workstation — installing theme packages from the Fedora repositories, or manually installing a theme. One point to note when installing themes, is that you may need to close and re-open the Tweaks application to make a newly installed theme appear in the dropdowns. - -#### Installing from the Fedora repositories - -The Fedora repositories contain a small selection of additional themes that once installed are available to we chosen in Tweaks. Theme packages are not available in the Software application, and have to be searched for and installed via the command line. Most theme packages have a consistent naming structure, so listing available themes is pretty easy. - -To find Application (GTK) themes use the command: - -``` -dnf search gtk | grep theme -``` - -To find Shell themes: - -``` -dnf search shell-theme -``` - -Icon themes: - -``` -dnf search icon-theme -``` - -Cursor themes: - -``` -dnf search cursor-theme -``` - -Once you have found a theme to install, install the theme using dnf. For example: - -``` -sudo dnf install numix-gtk-theme -``` - -#### Installing themes manually - -For a wider range of themes, there are a plethora of places on the internet to find new themes to use on Fedora Workstation. Two popular places to find themes are [OpenDesktop][10] and [GNOMELook][11]. - -Typically when downloading themes from these sites, the themes are encapsulated in an archive like a tar.gz or zip file. In most cases, to install these themes, simply extract the contents into the correct directory, and the theme will appear in Tweaks. Note too, that themes can be installed either globally (must be done using sudo) so all users on the system can use them, or can be installed just for the current user. - -For Application (GTK) themes, and GNOME Shell themes, extract the archive to the **.themes/** directory in your home directory. To install for all users, extract to **/usr/share/themes/** - -For Icon and Cursor themes, extract the archive to the **.icons/** directory in your home directory. To install for all users, extract to **/usr/share/icons/** - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/tweaking-the-look-of-fedora-workstation-with-themes/ - -作者:[Ryan Lerch][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/ryanlerch/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/06/themes.png-816x345.jpg -[2]: https://fedoramagazine.org/wp-content/uploads/2019/06/application-theme-1024x514.jpg -[3]: https://fedoramagazine.org/wp-content/uploads/2019/06/overview-theme-1024x649.jpg -[4]: https://fedoramagazine.org/wp-content/uploads/2019/06/icon-theme-application-1024x441.jpg -[5]: https://fedoramagazine.org/wp-content/uploads/2019/06/overview-icons-1024x637.jpg -[6]: https://fedoramagazine.org/wp-content/uploads/2019/06/cursortheme-1024x467.jpg -[7]: https://fedoramagazine.org/wp-content/uploads/2019/06/tweaks-in-software-1024x725.png -[8]: https://fedoramagazine.org/install-extensions-via-software-application/ -[9]: https://fedoramagazine.org/wp-content/uploads/2019/06/tweaks-choose-themes.png -[10]: https://www.opendesktop.org/ -[11]: https://www.gnome-look.org/ diff --git a/sources/tech/20190606 Examples of blameless culture outside of DevOps.md b/sources/tech/20190606 Examples of blameless culture outside of DevOps.md deleted file mode 100644 index b78722f3ef..0000000000 --- a/sources/tech/20190606 Examples of blameless culture outside of DevOps.md +++ /dev/null @@ -1,65 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Examples of blameless culture outside of DevOps) -[#]: via: (https://opensource.com/article/19/6/everyday-blameless) -[#]: author: (Patrick Housley https://opensource.com/users/patrickhousley) - -Examples of blameless culture outside of DevOps -====== -Is blameless culture just a matter of postmortems and top-down change? -Or are there things individuals can do to promote it? -![people in different locations who are part of the same team][1] - -A blameless culture is not a new concept in the technology industry. In fact, in 2012, [John Allspaw][2] wrote about how [Etsy uses blameless postmortems][3] to dive to the heart of problems when they arise. Other technology giants, like Google, have also worked hard to implement a blameless culture. But what is a blameless culture? Is it just a matter of postmortems? Does it take a culture change to make blameless a reality? And what about flagrant misconduct? - -### Exploring blameless culture - -In 2009, [Mike Rother][4] wrote an [award-winning book][5] on the culture of Toyota, in which he broke down how the automaker became so successful in the 20th century when most other car manufacturers were either stagnant or losing ground. Books on Toyota were nothing new, but how Mike approached Toyota's success was unique. Instead of focusing on the processes and procedures Toyota implements, he explains in exquisite detail the company's culture, including its focus on blameless failure and continuous improvement. - -Mike explains that Toyota, in the face of failure, focuses on the system where the failure occurred instead of who is at fault. Furthermore, the company treats failure as a learning opportunity, not a chance to chastise the operator. This is the very definition of a blameless culture and one that the technology field can still learn much from. - -### It's not a culture shift - -It shouldn't take an executive initiative to attain blamelessness. It's not so much the company's culture that we need to change, but our attitudes towards fault and failure. Sure, the company's culture should change, but, even in a blameless culture, some people still have the undying urge to point fingers and call others out for their shortcomings. - -I was once contracted to work with a company on developing and improving its digital footprint. This company employed its own developers, and, as you might imagine, there was tension at times. If a bug was found in production, the search began immediately for the person responsible. I think it's just human nature to want to find someone to blame. But there is a better way, and it will take practice. - -### Blamelessness at the microscale - -When I talk about implementing blamelessness, I'm not talking about doing it at the scale of companies and organizations. That's too large for most of us. Instead, focus your attention on the smallest scale: the code commit, review, and pull request. Focus on your actions and the actions of your peers and those you lead. You may find that you have the biggest impact in this area. - -How often do you or one of your peers get a bug report, dig in to find out what is wrong, and stop once you determine who made the breaking change? Do you immediately assume that a pull request or code commit needs to be reverted? Do you contact that individual and tell them what they broke and which commit it was? If this is happening within your team, you're the furthest from blamelessness you could be. But it can be remedied. - -Obviously, when you find a bug, you need to understand what broke, where, and who did it. But don't stop there. Attempt to fix the issue. The chances are high that patching the code will be a faster resolution than trying to figure out which code to back out. Too many times, I have seen people try to back out code only to find that they broke something else. - -If you're not confident that you can fix the issue, politely ask the individual who made the breaking change to assist. Yes, assist! My mom always said, "you can catch more flies with honey than vinegar." You will typically get a more positive response if you ask people for help instead of pointing out what they broke. - -Finally, once you have a fix, make sure to ask the individual who caused the bug to review your change. This isn't about rubbing it in their face. Remember that failure represents a learning opportunity, and the person who created the failure will learn if they have a chance to review the fix you created. Furthermore, that individual may have unique details and reasoning that suggests your change may fix the immediate issue but may not solve the original problem. - -### Catch flagrant misconduct and abuse sooner - -A blameless culture doesn't provide blanket protection if someone is knowingly attempting to do wrong. That also doesn't mean the system is not faulty. Remember how Toyota focuses on the system where failure occurs? If an individual can knowingly create havoc within the software they are working on, they should be held accountable—but so should the system. - -When reviewing failure, no matter how small, always ask, "How could we have caught this sooner?" Chances are you could improve some part of your software development lifecycle (SDLC) to make failures less likely to happen. Maybe you need to add more tests. Or run your tests more often. Whatever the solution, remember that fixing the bug is only part of a complete fix. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/everyday-blameless - -作者:[Patrick Housley][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/patrickhousley -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/connection_people_team_collaboration.png?itok=0_vQT8xV (people in different locations who are part of the same team) -[2]: https://twitter.com/allspaw -[3]: https://codeascraft.com/2012/05/22/blameless-postmortems/ -[4]: http://www-personal.umich.edu/~mrother/Homepage.html -[5]: https://en.wikipedia.org/wiki/Toyota_Kata diff --git a/sources/tech/20190606 Why hypothesis-driven development is key to DevOps.md b/sources/tech/20190606 Why hypothesis-driven development is key to DevOps.md deleted file mode 100644 index 766393dc3f..0000000000 --- a/sources/tech/20190606 Why hypothesis-driven development is key to DevOps.md +++ /dev/null @@ -1,152 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why hypothesis-driven development is key to DevOps) -[#]: via: (https://opensource.com/article/19/6/why-hypothesis-driven-development-devops) -[#]: author: (Brent Aaron Reed https://opensource.com/users/brentaaronreed/users/wpschaub) - -Why hypothesis-driven development is key to DevOps -====== -A hypothesis-driven development mindset harvests the core value of -feature flags: experimentation in production. -![gears and lightbulb to represent innovation][1] - -The definition of DevOps, offered by [Donovan Brown][2] * _is_ "The union of **people** , **process** , and **products** to enable continuous delivery of **value** to our customers.*" It accentuates the importance of continuous delivery of value. Let's discuss how experimentation is at the heart of modern development practices. - -![][3] - -### Reflecting on the past - -Before we get into hypothesis-driven development, let's quickly review how we deliver value using waterfall, agile, deployment rings, and feature flags. - -In the days of _**waterfall**_ , we had predictable and process-driven delivery. However, we only delivered value towards the end of the development lifecycle, often failing late as the solution drifted from the original requirements, or our killer features were outdated by the time we finally shipped. - -![][4] - -Here, we have one release X and eight features, which are all deployed and exposed to the patiently waiting user. We are continuously delivering value—but with a typical release cadence of six months to two years, _the value of the features declines as the world continues to move on_. It worked well enough when there was time to plan and a lower expectation to react to more immediate needs. - -The introduction of _**agile**_ allowed us to create and respond to change so we could continuously deliver working software, sense, learn, and respond. - -![][5] - -Now, we have three releases: X.1, X.2, and X.3. After the X.1 release, we improved feature 3 based on feedback and re-deployed it in release X.3. This is a simple example of delivering features more often, focused on working software, and responding to user feedback. _We are on the path of continuous delivery, focused on our key stakeholders: our users._ - -Using _**deployment rings**_ and/or _**feature flags**_ , we can decouple release deployment and feature exposure, down to the individual user, to control the exposure—the blast radius—of features. We can conduct experiments; progressively expose, test, enable, and hide features; fine-tune releases, and continuously pivot on learnings and feedback. - -When we add feature flags to the previous workflow, we can toggle features to be ON (enabled and exposed) or OFF (hidden). - -![][6] - -Here, feature flags for features 2, 4, and 8 are OFF, which results in the user being exposed to fewer of the features. All features have been deployed but are not exposed (yet). _We can fine-tune the features (value) of each release after deploying to production._ - -_**Ring-based deployment**_ limits the impact (blast) on users while we gradually deploy and evaluate one or more features through observation. Rings allow us to deploy features progressively and have multiple releases (v1, v1.1, and v1.2) running in parallel. - -![Ring-based deployment][7] - -Exposing features in the canary and early-adopter rings enables us to evaluate features without the risk of an all-or-nothing big-bang deployment. - -_**Feature flags**_ decouple release deployment and feature exposure. You "flip the flag" to expose a new feature, perform an emergency rollback by resetting the flag, use rules to hide features, and allow users to toggle preview features. - -![Toggling feature flags on/off][8] - -When you combine deployment rings and feature flags, you can progressively deploy a release through rings and use feature flags to fine-tune the deployed release. - -> See [deploying new releases: Feature flags or rings][9], [what's the cost of feature flags][10], and [breaking down walls between people, process, and products][11] for discussions on feature flags, deployment rings, and related topics. - -### Adding hypothesis-driven development to the mix - -_**Hypothesis-driven development**_ is based on a series of experiments to validate or disprove a hypothesis in a [complex problem domain][12] where we have unknown-unknowns. We want to find viable ideas or fail fast. Instead of developing a monolithic solution and performing a big-bang release, we iterate through hypotheses, evaluating how features perform and, most importantly, how and if customers use them. - -> **Template:** _**We believe**_ {customer/business segment} _**wants**_ {product/feature/service} _**because**_ {value proposition}. -> -> **Example:** _**We believe**_ that users _**want**_ to be able to select different themes _**because**_ it will result in improved user satisfaction. We expect 50% or more users to select a non-default theme and to see a 5% increase in user engagement. - -Every experiment must be based on a hypothesis, have a measurable conclusion, and contribute to feature and overall product learning. For each experiment, consider these steps: - - * Observe your user - * Define a hypothesis and an experiment to assess the hypothesis - * Define clear success criteria (e.g., a 5% increase in user engagement) - * Run the experiment - * Evaluate the results and either accept or reject the hypothesis - * Repeat - - - -Let's have another look at our sample release with eight hypothetical features. - -![][13] - -When we deploy each feature, we can observe user behavior and feedback, and prove or disprove the hypothesis that motivated the deployment. As you can see, the experiment fails for features 2 and 6, allowing us to fail-fast and remove them from the solution. _**We do not want to carry waste that is not delivering value or delighting our users!**_ The experiment for feature 3 is inconclusive, so we adapt the feature, repeat the experiment, and perform A/B testing in Release X.2. Based on observations, we identify the variant feature 3.2 as the winner and re-deploy in release X.3. _**We only expose the features that passed the experiment and satisfy the users.**_ - -### Hypothesis-driven development lights up progressive exposure - -When we combine hypothesis-driven development with progressive exposure strategies, we can vertically slice our solution, incrementally delivering on our long-term vision. With each slice, we progressively expose experiments, enable features that delight our users and hide those that did not make the cut. - -But there is more. When we embrace hypothesis-driven development, we can learn how technology works together, or not, and what our customers need and want. We also complement the test-driven development (TDD) principle. TDD encourages us to write the test first (hypothesis), then confirm our features are correct (experiment), and succeed or fail the test (evaluate). _**It is all about quality and delighting our users** , as outlined in principles 1, 3, and 7_ of the [Agile Manifesto][14]: - - * Our highest priority is to satisfy the customers through early and continuous delivery of value. - * Deliver software often, from a couple of weeks to a couple of months, with a preference to the shorter timescale. - * Working software is the primary measure of progress. - - - -More importantly, we introduce a new mindset that breaks down the walls between development, business, and operations to view, design, develop, deliver, and observe our solution in an iterative series of experiments, adopting features based on scientific analysis, user behavior, and feedback in production. We can evolve our solutions in thin slices through observation and learning in production, a luxury that other engineering disciplines, such as aerospace or civil engineering, can only dream of. - -The good news is that hypothesis-driven development supports the empirical process theory and its three pillars: **Transparency** , **Inspection** , and **Adaption**. - -![][15] - -But there is more. Based on lean principles, we must pivot or persevere after we measure and inspect the feedback. Using feature toggles in conjunction with hypothesis-driven development, we get the best of both worlds, as well as the ability to use A|B testing to make decisions on feedback, such as likes/dislikes and value/waste. - -### Remember: - -Hypothesis-driven development: - - * Is about a series of experiments to confirm or disprove a hypothesis. Identify value! - * Delivers a measurable conclusion and enables continued learning. - * Enables continuous feedback from the key stakeholder—the user—to understand the unknown-unknowns! - * Enables us to understand the evolving landscape into which we progressively expose value. - - - -Progressive exposure: - - * Is not an excuse to hide non-production-ready code. _**Always ship quality!**_ - * Is about deploying a release of features through rings in production. _**Limit blast radius!**_ - * Is about enabling or disabling features in production. _**Fine-tune release values!**_ - * Relies on circuit breakers to protect the infrastructure from implications of progressive exposure. _**Observe, sense, act!**_ - - - -What have you learned about progressive exposure strategies and hypothesis-driven development? We look forward to your candid feedback. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/why-hypothesis-driven-development-devops - -作者:[Brent Aaron Reed][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/brentaaronreed/users/wpschaub -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/innovation_lightbulb_gears_devops_ansible.png?itok=TSbmp3_M (gears and lightbulb to represent innovation) -[2]: http://donovanbrown.com/post/what-is-devops -[3]: https://opensource.com/sites/default/files/hypo-1_copy.png -[4]: https://opensource.com/sites/default/files/uploads/hyp0-2-trans.png -[5]: https://opensource.com/sites/default/files/uploads/hypo-3-trans.png -[6]: https://opensource.com/sites/default/files/uploads/hypo-4_0.png -[7]: https://opensource.com/sites/default/files/uploads/hypo-6-trans.png -[8]: https://opensource.com/sites/default/files/uploads/hypo-7-trans.png -[9]: https://opensource.com/article/18/2/feature-flags-ring-deployment-model -[10]: https://opensource.com/article/18/7/does-progressive-exposure-really-come-cost -[11]: https://opensource.com/article/19/3/breaking-down-walls-between-people-process-and-products -[12]: https://en.wikipedia.org/wiki/Cynefin_framework -[13]: https://opensource.com/sites/default/files/uploads/hypo-5-trans.png -[14]: https://agilemanifesto.org/principles.html -[15]: https://opensource.com/sites/default/files/uploads/adapt-transparent-inspect.png diff --git a/sources/tech/20190607 An Introduction to Kubernetes Secrets and ConfigMaps.md b/sources/tech/20190607 An Introduction to Kubernetes Secrets and ConfigMaps.md deleted file mode 100644 index 7d28e67ea4..0000000000 --- a/sources/tech/20190607 An Introduction to Kubernetes Secrets and ConfigMaps.md +++ /dev/null @@ -1,608 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (An Introduction to Kubernetes Secrets and ConfigMaps) -[#]: via: (https://opensource.com/article/19/6/introduction-kubernetes-secrets-and-configmaps) -[#]: author: (Chris Collins https://opensource.com/users/clcollins) - -An Introduction to Kubernetes Secrets and ConfigMaps -====== -Kubernetes Secrets and ConfigMaps separate the configuration of -individual container instances from the container image, reducing -overhead and adding flexibility. -![Kubernetes][1] - -Kubernetes has two types of objects that can inject configuration data into a container when it starts up: Secrets and ConfigMaps. Secrets and ConfigMaps behave similarly in [Kubernetes][2], both in how they are created and because they can be exposed inside a container as mounted files or volumes or environment variables. - -To explore Secrets and ConfigMaps, consider the following scenario: - -> You're running the [official MariaDB container image][3] in Kubernetes and must do some configuration to get the container to run. The image requires an environment variable to be set for **MYSQL_ROOT_PASSWORD** , **MYSQL_ALLOW_EMPTY_PASSWORD** , or **MYSQL_RANDOM_ROOT_PASSWORD** to initialize the database. It also allows for extensions to the MySQL configuration file **my.cnf** by placing custom config files in **/etc/mysql/conf.d**. - -You could build a custom image, setting the environment variables and copying the configuration files into it to create a bespoke container image. However, it is considered a best practice to create and use generic images and add configuration to the containers created from them, instead. This is a perfect use-case for ConfigMaps and Secrets. The **MYSQL_ROOT_PASSWORD** can be set in a Secret and added to the container as an environment variable, and the configuration files can be stored in a ConfigMap and mounted into the container as a file on startup. - -Let's try it out! - -### But first: A quick note about Kubectl - -Make sure that your version of the **kubectl** client command is the same or newer than the Kubernetes cluster version in use. - -An error along the lines of: - - -``` -`error: SchemaError(io.k8s.api.admissionregistration.v1beta1.ServiceReference): invalid object doesn't have additional properties` -``` - -may mean the client version is too old and needs to be upgraded. The [Kubernetes Documentation for Installing Kubectl][4] has instructions for installing the latest client on various platforms. - -If you're using Docker for Mac, it also installs its own version of **kubectl** , and that may be the issue. You can install a current client with **brew install** , replacing the symlink to the client shipped by Docker: - - -``` -$ rm /usr/local/bin/kubectl -$ brew link --overwrite kubernetes-cli -``` - -The newer **kubectl** client should continue to work with Docker's Kubernetes version. - -### Secrets - -Secrets are a Kubernetes object intended for storing a small amount of sensitive data. It is worth noting that Secrets are stored base64-encoded within Kubernetes, so they are not wildly secure. Make sure to have appropriate [role-based access controls][5] (RBAC) to protect access to Secrets. Even so, extremely sensitive Secrets data should probably be stored using something like [HashiCorp Vault][6]. For the root password of a MariaDB database, however, base64 encoding is just fine. - -#### Create a Secret manually - -To create the Secret containing the **MYSQL_ROOT_PASSWORD** , choose a password and convert it to base64: - - -``` -# The root password will be "KubernetesRocks!" -$ echo -n 'KubernetesRocks!' | base64 -S3ViZXJuZXRlc1JvY2tzIQ== -``` - -Make a note of the encoded string. You need it to create the YAML file for the Secret: - - -``` -apiVersion: v1 -kind: Secret -metadata: -name: mariadb-root-password -type: Opaque -data: -password: S3ViZXJuZXRlc1JvY2tzIQ== -``` - -Save that file as **mysql-secret.yaml** and create the Secret in Kubernetes with the **kubectl apply** command: - - -``` -$ kubectl apply -f mysql-secret.yaml -secret/mariadb-root-password created -``` - -#### View the newly created Secret - -Now that you've created the Secret, use **kubectl describe** to see it: - - -``` -$ kubectl describe secret mariadb-root-password -Name: mariadb-root-password -Namespace: secrets-and-configmaps -Labels: -Annotations: -Type: Opaque - -Data -==== -password: 16 bytes -``` - -Note that the **Data** field contains the key you set in the YAML: **password**. The value assigned to that key is the password you created, but it is not shown in the output. Instead, the value's size is shown in its place, in this case, 16 bytes. - -You can also use the **kubectl edit secret ** command to view and edit the Secret. If you edit the Secret, you'll see something like this: - - -``` -# Please edit the object below. Lines beginning with a '#' will be ignored, -# and an empty file will abort the edit. If an error occurs while saving this file will be -# reopened with the relevant failures. -# -apiVersion: v1 -data: -password: S3ViZXJuZXRlc1JvY2tzIQ== -kind: Secret -metadata: -annotations: -kubectl.kubernetes.io/last-applied-configuration: | -{"apiVersion":"v1","data":{"password":"S3ViZXJuZXRlc1JvY2tzIQ=="},"kind":"Secret","metadata":{"annotations":{},"name":"mariadb-root-password","namespace":"secrets-and-configmaps"},"type":"Opaque"} -creationTimestamp: 2019-05-29T12:06:09Z -name: mariadb-root-password -namespace: secrets-and-configmaps -resourceVersion: "85154772" -selfLink: /api/v1/namespaces/secrets-and-configmaps/secrets/mariadb-root-password -uid: 2542dadb-820a-11e9-ae24-005056a1db05 -type: Opaque -``` - -Again, the **data** field with the **password** key is visible, and this time you can see the base64-encoded Secret. - -#### Decode the Secret - -Let's say you need to view the Secret in plain text, for example, to verify that the Secret was created with the correct content. You can do this by decoding it. - -It is easy to decode the Secret by extracting the value and piping it to base64. In this case, you will use the output format **-o jsonpath= ** to extract only the Secret value using a JSONPath template. - - -``` -# Returns the base64 encoded secret string -$ kubectl get secret mariadb-root-password -o jsonpath='{.data.password}' -S3ViZXJuZXRlc1JvY2tzIQ== - -# Pipe it to `base64 --decode -` to decode: -$ kubectl get secret mariadb-root-password -o jsonpath='{.data.password}' | base64 --decode - -KubernetesRocks! -``` - -#### Another way to create Secrets - -You can also create Secrets directly using the **kubectl create secret** command. The MariaDB image permits setting up a regular database user with a password by setting the **MYSQL_USER** and **MYSQL_PASSWORD** environment variables. A Secret can hold more than one key/value pair, so you can create a single Secret to hold both strings. As a bonus, by using **kubectl create secret** , you can let Kubernetes mess with base64 so that you don't have to. - - -``` -$ kubectl create secret generic mariadb-user-creds \ -\--from-literal=MYSQL_USER=kubeuser\ -\--from-literal=MYSQL_PASSWORD=kube-still-rocks -secret/mariadb-user-creds created -``` - -Note the **\--from-literal** , which sets the key name and the value all in one. You can pass as many **\--from-literal** arguments as you need to create one or more key/value pairs in the Secret. - -Validate that the username and password were created and stored correctly with the **kubectl get secrets** command: - - -``` -# Get the username -$ kubectl get secret mariadb-user-creds -o jsonpath='{.data.MYSQL_USER}' | base64 --decode - -kubeuser - -# Get the password -$ kubectl get secret mariadb-user-creds -o jsonpath='{.data.MYSQL_PASSWORD}' | base64 --decode - -kube-still-rocks -``` - -### ConfigMaps - -ConfigMaps are similar to Secrets. They can be created and shared in the containers in the same ways. The only big difference between them is the base64-encoding obfuscation. ConfigMaps are intended for non-sensitive data—configuration data—like config files and environment variables and are a great way to create customized running services from generic container images. - -#### Create a ConfigMap - -ConfigMaps can be created in the same ways as Secrets. You can write a YAML representation of the ConfigMap manually and load it into Kubernetes, or you can use the **kubectl create configmap** command to create it from the command line. The following example creates a ConfigMap using the latter method but, instead of passing literal strings (as with **\--from-literal= =** in the Secret above), it creates a ConfigMap from an existing file—a MySQL config intended for **/etc/mysql/conf.d** in the container. This config file overrides the **max_allowed_packet** setting that MariaDB sets to 16M by default. - -First, create a file named **max_allowed_packet.cnf** with the following content: - - -``` -[mysqld] -max_allowed_packet = 64M -``` - -This will override the default setting in the **my.cnf** file and set **max_allowed_packet** to 64M. - -Once the file is created, you can create a ConfigMap named **mariadb-config** using the **kubectl create configmap** command that contains the file: - - -``` -$ kubectl create configmap mariadb-config --from-file=max_allowed_packet.cnf -configmap/mariadb-config created -``` - -Just like Secrets, ConfigMaps store one or more key/value pairs in their Data hash of the object. By default, using **\--from-file= ** (as above) will store the contents of the file as the value, and the name of the file will be stored as the key. This is convenient from an organization viewpoint. However, the key name can be explicitly set, too. For example, if you used **\--from-file=max-packet=max_allowed_packet.cnf** when you created the ConfigMap, the key would be **max-packet** rather than the file name. If you had multiple files to store in the ConfigMap, you could add each of them with an additional **\--from-file= ** argument. - -#### View the new ConfigMap and read the data - -As mentioned, ConfigMaps are not meant to store sensitive data, so the data is not encoded when the ConfigMap is created. This makes it easy to view and validate the data and edit it directly. - -First, validate that the ConfigMap was, indeed, created: - - -``` -$ kubectl get configmap mariadb-config -NAME DATA AGE -mariadb-config 1 9m -``` - -The contents of the ConfigMap can be viewed with the **kubectl describe** command. Note that the full contents of the file are visible and that the key name is, in fact, the file name, **max_allowed_packet.cnf**. - - -``` -$ kubectl describe cm mariadb-config -Name: mariadb-config -Namespace: secrets-and-configmaps -Labels: -Annotations: - -Data -==== -max_allowed_packet.cnf: -\---- -[mysqld] -max_allowed_packet = 64M - -Events: -``` - -A ConfigMap can be edited live within Kubernetes with the **kubectl edit** command. Doing so will open a buffer with the default editor showing the contents of the ConfigMap as YAML. When changes are saved, they will immediately be live in Kubernetes. While not really the _best_ practice, it can be handy for testing things in development. - -Say you want a **max_allowed_packet** value of 32M instead of the default 16M or the 64M in the **max_allowed_packet.cnf** file. Use **kubectl edit configmap mariadb-config** to edit the value: - - -``` -$ kubectl edit configmap mariadb-config - -# Please edit the object below. Lines beginning with a '#' will be ignored, -# and an empty file will abort the edit. If an error occurs while saving this file will be -# reopened with the relevant failures. -# -apiVersion: v1 - -data: -max_allowed_packet.cnf: | -[mysqld] -max_allowed_packet = 32M -kind: ConfigMap -metadata: -creationTimestamp: 2019-05-30T12:02:22Z -name: mariadb-config -namespace: secrets-and-configmaps -resourceVersion: "85609912" -selfLink: /api/v1/namespaces/secrets-and-configmaps/configmaps/mariadb-config -uid: c83ccfae-82d2-11e9-832f-005056a1102f -``` - -After saving the change, verify the data has been updated: - - -``` -# Note the '.' in max_allowed_packet.cnf needs to be escaped -$ kubectl get configmap mariadb-config -o "jsonpath={.data['max_allowed_packet\\.cnf']}" - -[mysqld] -max_allowed_packet = 32M -``` - -### Using Secrets and ConfigMaps - -Secrets and ConfigMaps can be mounted as environment variables or as files within a container. For the MariaDB container, you will need to mount the Secrets as environment variables and the ConfigMap as a file. First, though, you need to write a Deployment for MariaDB so that you have something to work with. Create a file named **mariadb-deployment.yaml** with the following: - - -``` -apiVersion: apps/v1 -kind: Deployment -metadata: -labels: -app: mariadb -name: mariadb-deployment -spec: -replicas: 1 -selector: -matchLabels: -app: mariadb -template: -metadata: -labels: -app: mariadb -spec: -containers: -\- name: mariadb -image: docker.io/mariadb:10.4 -ports: -\- containerPort: 3306 -protocol: TCP -volumeMounts: -\- mountPath: /var/lib/mysql -name: mariadb-volume-1 -volumes: -\- emptyDir: {} -name: mariadb-volume-1 -``` - -This is a bare-bones Kubernetes Deployment of the official MariaDB 10.4 image from Docker Hub. Now, add your Secrets and ConfigMap. - -#### Add the Secrets to the Deployment as environment variables - -You have two Secrets that need to be added to the Deployment: - - 1. **mariadb-root-password** (with one key/value pair) - 2. **mariadb-user-creds** (with two key/value pairs) - - - -For the **mariadb-root-password** Secret, specify the Secret and the key you want by adding an **env** list/array to the container spec in the Deployment and setting the environment variable value to the value of the key in your Secret. In this case, the list contains only a single entry, for the variable **MYSQL_ROOT_PASSWORD**. - - -``` -env: -\- name: MYSQL_ROOT_PASSWORD -valueFrom: -secretKeyRef: -name: mariadb-root-password -key: password -``` - -Note that the name of the object is the name of the environment variable that is added to the container. The **valueFrom** field defines **secretKeyRef** as the source from which the environment variable will be set; i.e., it will use the value from the **password** key in the **mariadb-root-password** Secret you set earlier. - -Add this section to the definition for the **mariadb** container in the **mariadb-deployment.yaml** file. It should look something like this: - - -``` -spec: -containers: -\- name: mariadb -image: docker.io/mariadb:10.4 -env: -\- name: MYSQL_ROOT_PASSWORD -valueFrom: -secretKeyRef: -name: mariadb-root-password -key: password -ports: -\- containerPort: 3306 -protocol: TCP -volumeMounts: -\- mountPath: /var/lib/mysql -name: mariadb-volume-1 -``` - -In this way, you have explicitly set the variable to the value of a specific key from your Secret. This method can also be used with ConfigMaps by using **configMapRef** instead of **secretKeyRef**. - -You can also set environment variables from _all_ key/value pairs in a Secret or ConfigMap to automatically use the key name as the environment variable name and the key's value as the environment variable's value. By using **envFrom** rather than **env** in the container spec, you can set the **MYSQL_USER** and **MYSQL_PASSWORD** from the **mariadb-user-creds** Secret you created earlier, all in one go: - - -``` -envFrom: -\- secretRef: -name: mariadb-user-creds -``` - -**envFrom** is a list of sources for Kubernetes to take environment variables. Use **secretRef** again, this time to specify **mariadb-user-creds** as the source of the environment variables. That's it! All the keys and values in the Secret will be added as environment variables in the container. - -The container spec should now look like this: - - -``` -spec: -containers: -\- name: mariadb -image: docker.io/mariadb:10.4 -env: -\- name: MYSQL_ROOT_PASSWORD -valueFrom: -secretKeyRef: -name: mariadb-root-password -key: password -envFrom: -\- secretRef: -name: mariadb-user-creds -ports: -\- containerPort: 3306 -protocol: TCP -volumeMounts: -\- mountPath: /var/lib/mysql -name: mariadb-volume-1 -``` - -_Note:_ You could have just added the **mysql-root-password** Secret to the **envFrom** list and let it be parsed as well, as long as the **password** key was named **MYSQL_ROOT_PASSWORD** instead. There is no way to manually specify the environment variable name with **envFrom** as with **env**. - -#### Add the max_allowed_packet.cnf file to the Deployment as a volumeMount - -As mentioned, both **env** and **envFrom** can be used to share ConfigMap key/value pairs with a container as well. However, in the case of the **mariadb-config** ConfigMap, your entire file is stored as the value to your key, and the file needs to exist in the container's filesystem for MariaDB to be able to use it. Luckily, both Secrets and ConfigMaps can be the source of Kubernetes "volumes" and mounted into the containers instead of using a filesystem or block device as the volume to be mounted. - -The **mariadb-deployment.yaml** already has a volume and volumeMount specified, an **emptyDir** (effectively a temporary or ephemeral) volume mounted to **/var/lib/mysql** to store the MariaDB data: - - -``` -<...> - -volumeMounts: -\- mountPath: /var/lib/mysql -name: mariadb-volume-1 - -<...> - -volumes: -\- emptyDir: {} -name: mariadb-volume-1 - -<...> -``` - -_Note:_ This is not a production configuration. When the Pod restarts, the data in the **emptyDir** volume is lost. This is primarily used for development or when the contents of the volume don't need to be persistent. - -You can add your ConfigMap as a source by adding it to the volume list and then adding a volumeMount for it to the container definition: - - -``` -<...> - -volumeMounts: -\- mountPath: /var/lib/mysql -name: mariadb-volume-1 -\- mountPath: /etc/mysql/conf.d -name: mariadb-config - -<...> - -volumes: -\- emptyDir: {} -name: mariadb-volume-1 -\- configMap: -name: mariadb-config -items: -\- key: max_allowed_packet.cnf -path: max_allowed_packet.cnf -name: mariadb-config-volume - -<...> -``` - -The **volumeMount** is pretty self-explanatory—create a volume mount for the **mariadb-config-volume** (specified in the **volumes** list below it) to the path **/etc/mysql/conf.d**. - -Then, in the **volumes** list, **configMap** tells Kubernetes to use the **mariadb-config** ConfigMap, taking the contents of the key **max_allowed_packet.cnf** and mounting it to the path **max_allowed_packed.cnf**. The name of the volume is **mariadb-config-volume** , which was referenced in the **volumeMounts** above. - -_Note:_ The **path** from the **configMap** is the name of a file that will contain the contents of the key's value. In this case, your key was a file name, too, but it doesn't have to be. Note also that **items** is a list, so multiple keys can be referenced and their values mounted as files. These files will all be created in the **mountPath** of the **volumeMount** specified above: **/etc/mysql/conf.d**. - -### Create a MariaDB instance from the Deployment - -At this point, you should have enough to create a MariaDB instance. You have two Secrets, one holding the **MYSQL_ROOT_PASSWORD** and another storing the **MYSQL_USER** , and the **MYSQL_PASSWORD** environment variables to be added to the container. You also have a ConfigMap holding the contents of a MySQL config file that overrides the **max_allowed_packed** value from its default setting. - -You also have a **mariadb-deployment.yaml** file that describes a Kubernetes deployment of a Pod with a MariaDB container and adds the Secrets as environment variables and the ConfigMap as a volume-mounted file in the container. It should look like this: - - -``` -apiVersion: apps/v1 -kind: Deployment -metadata: -labels: -app: mariadb -name: mariadb-deployment -spec: -replicas: 1 -selector: -matchLabels: -app: mariadb -template: -metadata: -labels: -app: mariadb -spec: -containers: -\- image: docker.io/mariadb:10.4 -name: mariadb -env: -\- name: MYSQL_ROOT_PASSWORD -valueFrom: -secretKeyRef: -name: mariadb-root-password -key: password -envFrom: -\- secretRef: -name: mariadb-user-creds -ports: -\- containerPort: 3306 -protocol: TCP -volumeMounts: -\- mountPath: /var/lib/mysql -name: mariadb-volume-1 -\- mountPath: /etc/mysql/conf.d -name: mariadb-config-volume -volumes: -\- emptyDir: {} -name: mariadb-volume-1 -\- configMap: -name: mariadb-config -items: -\- key: max_allowed_packet.cnf -path: max_allowed_packet.cnf -name: mariadb-config-volume -``` - -#### Create the MariaDB instance - -Create a new MariaDB instance from the YAML file with the **kubectl create** command: - - -``` -$ kubectl create -f mariadb-deployment.yaml -deployment.apps/mariadb-deployment created -``` - -Once the deployment has been created, use the **kubectl get** command to view the running MariaDB pod: - - -``` -$ kubectl get pods -NAME READY STATUS RESTARTS AGE -mariadb-deployment-5465c6655c-7jfqm 1/1 Running 0 3m -``` - -Make a note of the Pod name (in this example, it's **mariadb-deployment-5465c6655c-7jfqm** ). Note that the Pod name will differ from this example. - -#### Verify the instance is using the Secrets and ConfigMap - -Use the **kubectl exec** command (with your Pod name) to validate that the Secrets and ConfigMaps are in use. For example, check that the environment variables are exposed in the container: - - -``` -$ kubectl exec -it mariadb-deployment-5465c6655c-7jfqm env |grep MYSQL -MYSQL_PASSWORD=kube-still-rocks -MYSQL_USER=kubeuser -MYSQL_ROOT_PASSWORD=KubernetesRocks! -``` - -Success! All three environment variables—the one using the **env** setup to specify the Secret, and two using **envFrom** to mount all the values from the Secret—are available in the container for MariaDB to use. - -Spot check that the **max_allowed_packet.cnf** file was created in **/etc/mysql/conf.d** and that it contains the expected content: - - -``` -$ kubectl exec -it mariadb-deployment-5465c6655c-7jfqm ls /etc/mysql/conf.d -max_allowed_packet.cnf - -$ kubectl exec -it mariadb-deployment-5465c6655c-7jfqm cat /etc/mysql/conf.d/max_allowed_packet.cnf -[mysqld] -max_allowed_packet = 32M -``` - -Finally, validate that MariaDB used the environment variable to set the root user password and read the **max_allowed_packet.cnf** file to set the **max_allowed_packet** configuration variable. Use the **kubectl exec** command again, this time to get a shell inside the running container and use it to run some **mysql** commands: - - -``` -$ kubectl exec -it mariadb-deployment-5465c6655c-7jfqm / -bin/sh - -# Check that the root password was set correctly -$ mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e 'show databases;' -+--------------------+ -| Database | -+--------------------+ -| information_schema | -| mysql | -| performance_schema | -+--------------------+ - -# Check that the max_allowed_packet.cnf was parsed -$ mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SHOW VARIABLES LIKE 'max_allowed_packet';" -+--------------------+----------+ -| Variable_name | Value | -+--------------------+----------+ -| max_allowed_packet | 33554432 | -+--------------------+----------+ -``` - -### Advantages of Secrets and ConfigMaps - -This exercise explained how to create Kubernetes Secrets and ConfigMaps and how to use those Secrets and ConfigMaps by adding them as environment variables or files inside of a running container instance. This makes it easy to keep the configuration of individual instances of containers separate from the container image. By separating the configuration data, overhead is reduced to maintaining only a single image for a specific type of instance while retaining the flexibility to create instances with a wide variety of configurations. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/introduction-kubernetes-secrets-and-configmaps - -作者:[Chris Collins][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/clcollins -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes.png?itok=PqDGb6W7 (Kubernetes) -[2]: https://opensource.com/resources/what-is-kubernetes -[3]: https://hub.docker.com/_/mariadb -[4]: https://kubernetes.io/docs/tasks/tools/install-kubectl/ -[5]: https://kubernetes.io/docs/reference/access-authn-authz/rbac/ -[6]: https://www.vaultproject.io/ diff --git a/sources/tech/20190610 Blockchain 2.0 - EOS.IO Is Building Infrastructure For Developing DApps -Part 13.md b/sources/tech/20190610 Blockchain 2.0 - EOS.IO Is Building Infrastructure For Developing DApps -Part 13.md deleted file mode 100644 index a44ceeb105..0000000000 --- a/sources/tech/20190610 Blockchain 2.0 - EOS.IO Is Building Infrastructure For Developing DApps -Part 13.md +++ /dev/null @@ -1,88 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Blockchain 2.0 – EOS.IO Is Building Infrastructure For Developing DApps [Part 13]) -[#]: via: (https://www.ostechnix.com/blockchain-2-0-eos-io-is-building-infrastructure-for-developing-dapps/) -[#]: author: (editor https://www.ostechnix.com/author/editor/) - -Blockchain 2.0 – EOS.IO Is Building Infrastructure For Developing DApps [Part 13] -====== - -![Building infrastructure for Developing DApps][1] - -When a blockchain startup makes over **$4 billion** through an ICO without having a product or service to show for it, that is newsworthy. It becomes clear at this point that people invested these billions on this project because it seemed to promise a lot. This post will seek to demystify this mystical and seemingly powerful platform. - -**EOS.IO** is a [**blockchain**][2] platform that aims to develop standardized infrastructure including an application protocol and operating system for developing DApps ([ **distributed applications**][3]). **Block.one** the lead developer and investor in the project envisions **EOS.IO as the world’s’ first distributed operating system** providing a developing environment for decentralized applications. The system is meant to mirror a real computer by simulating hardware such as its CPUs, GPUs, and even RAM, apart from the obvious storage solutions courtesy of the blockchain database system. - -### Who is block.one? - -Block.one is the company behind EOS.IO. They developed the platform from the ground up based on a white paper published on GitHub. Block.one also spearheaded the yearlong “continuous” ICO that eventually made them a whopping $4 billion. They have one of the best teams of backers and advisors any company in the blockchain space can hope for with partnerships from **Bitmain** , **Louis Bacon** and **Alan Howard** among others. Not to mention **Peter Thiel** being one of the lead investors in the company. The expectations from their purported platform the EOS.IO and their crypto VC fund **EOS.VC** are high indeed. - -### What is EOS.IO? - -It is difficult to arrive at a short description for EOS.IO. The platform aims to position itself as a world wide computer with virtually simulated resources, hence creating a virtual environment for distributed applications to be built and run. The team behind EOS.IO aims achieve the following by directly quoting [**Ethereum**][4] as competition. - - * Increase transaction throughput to millions per second, - - * Reduce transaction costs to insignificant sums or remove them altogether. - - - - -Though EOS.IO is not anywhere near solving any of these problems, the platform has a few capabilities that make it noteworthy as an alternative to Ethereum for DApp enthusiasts and developers. - - 1. **Scalability** : EOS.IO uses a different consensus algorithm for handling blocks called **DPoS**. We’ve described it briefly below. The DPoS system basically allows the system to handle far more requests at better speeds than Ethereum is capable of with its **PoW** algorithm. The claim is that because they’ll be able to handle such massive throughputs they’ll be able to afford transactions at insignificant or even zero charges if need be. - 2. **Governance capabilities** : The consensus algorithm allows EOS.IO to dynamically understand malicious user (or node) behaviour to penalize or deactivate the user. The elected delegate feature of the delegated proof of stake system also ensures faster amendments to the rules that govern the network and its users. - 3. **Parallel processing** : Touted to another major feature. This will basically allow programs on the EOS.IO blockchain to utilize multiple computers or processors or even computing resources such as GPUs to parallelly processes large chunks of data and blocks. This is not yet seen in a roll out ready form. (This however is not a unique feature of EOS.IO. [**Hyperledger Sawtooth**][5] and Burrow for instance support the same at the moment). - 4. **Self-sufficiency** : The system has a built-in grievance system along with well defined incentive and penal systems for providing feedback for acceptable and non-acceptable behaviour. This means that the platform has a governance system without actually having a central governing body. - - - -All or at least most of the selling points of the system is based on the consensus algorithm it follows, DPoS. We explore more about the same below. - -### What is the delegated Proof of Stake (DPoS) consensus algorithm? - -As far as blockchains are concerned consensus algorithms are what gives them the strength and the selling point they need. However, as a general rule of thumb, as the “openness” and immutability of the ledger increases so does the computational power that is required to run it. For instance, if a blockchain intends to be secure against intrusion, be safe and immutable with respect to data, while being accessible to a lot of users, it will use up a lot of computing power in creating and maintaining itself. Think of it as a number lock. A 6-digit pin code is safer than a 3-digit pin code, but the latter will be easier and faster to open, now consider a million of these locks but with limited manpower to open them, and you get the scale at which blockchains operate and how much these consensus algorithms matter. - -In fact, this is a major area where competing platforms differ from each other. Hyperledger Sawtooth uses a proof of elapsed time algorithm (PoET), while ethereum uses a slightly modified proof of work (PoW) algorithm. Each of these have their own pros and cons which we will cover in a detailed post later on. However, for now, to be noted is that EOS.IO uses a delegated proof of stake mechanism for attesting and validating blocks under it. This has the following implications for users. - -Only one node can actively change the status of data written on the blockchain. In the case of a DPoS based system, this validator node is selected as part of a delegation by all the token holders of the blockchain. Every token holder gets to vote and have a say in who should be a validator. The weight the vote carries is usually proportional to the number of tokens the user carries. This is seen as a democratic way to ensure centralized accountability in terms of running the network. Furthermore, the validator is given additional monetary incentives to keep the network running smoothly and without friction. In case a validator or delegate member who is elected appears to be malicious, the system automatically votes out the said node member. - -DPoS system is efficient as it requires fewer computing resources to cast a vote and select a leader to validate. Further, it incentivizes good behaviour and penalizes bad ones leading to self-correction and maintenance of the blockchain. **The average transaction time for PoW vs DPoS is 10 minutes vs 10 seconds**. The downside to this paradigm being centralized operations, weighted voting systems, lack of redundancy, and possible malicious behaviour from the validator. - -To understand the difference between PoW and DPoS, imagine this: Let’s say your network has 100 participants out of which 10 are capable of handling validator duties and you need to choose one to do the same. In PoW, you give each of them a tough problem to solve to know who’s the fastest and smartest. You give the validator position to the winner and reward them for the same. In the DPoS system, the rest of the members vote for the person they think should hold the position. This is a simple matter of choosing based on arithmetic performance data based on the past. The node with the most votes win, and if the winner tries to do something fishy, the same electorate votes him out for the next transaction. - -### So does Ethereum lose out? - -While EOS.IO has miles to go before it even steps into the same ballpark as Ethereum with respect to the market cap and user base, EOS.IO targets specific shortfalls with Ethereum and solves them. We conclude this post by summarising some findings based on a 2017 [**paper**][6] written and published by **Ian Grigg**. - - 1. The consensus algorithm used in the Ethereum (proof of work) platform uses far more computing resources and time to process transactions. This is true even for small block sizes. This limits its scaling potential and throughput. A meagre 15 transactions per second globally is no match for the over 2000 that payments network Visa manages. If the platform is to be adopted on a global scale based on a large scale roll out this is not acceptable. - - 2. The reliance on proprietary languages, tool kits and protocols (including **Solidity** for instance) limits developer capability. Interoperability between platforms is also severely hurt due to this fact. - - 3. This is rather subjective, however, the fact that Ethereum foundation refuses to acknowledge even the need for governance on the platform instead choosing to intervene on an ad-hoc manner when things turn sour on the network is not seen by many industry watchers as a sustainable model to be emulated in the future. - - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/blockchain-2-0-eos-io-is-building-infrastructure-for-developing-dapps/ - -作者:[editor][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/editor/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/wp-content/uploads/2019/05/Developing-DApps-720x340.png -[2]: https://www.ostechnix.com/blockchain-2-0-an-introduction/ -[3]: https://www.ostechnix.com/blockchain-2-0-explaining-distributed-computing-and-distributed-applications/ -[4]: https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/ -[5]: https://www.ostechnix.com/blockchain-2-0-introduction-to-hyperledger-sawtooth/ -[6]: http://iang.org/papers/EOS_An_Introduction.pdf diff --git a/sources/tech/20190610 Constant Time.md b/sources/tech/20190610 Constant Time.md deleted file mode 100644 index f19207fb58..0000000000 --- a/sources/tech/20190610 Constant Time.md +++ /dev/null @@ -1,281 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Constant Time) -[#]: via: (https://dave.cheney.net/2019/06/10/constant-time) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -Constant Time -====== - -This essay is a derived from my [dotGo 2019 presentation][1] about my favourite feature in Go. - -* * * - -Many years ago Rob Pike remarked, - -> “Numbers are just numbers, you’ll never see `0x80ULL` in a `.go` source file”. - -—Rob Pike, [The Go Programming Language][2] - -Beyond this pithy observation lies the fascinating world of Go’s constants. Something that is perhaps taken for granted because, as Rob noted, is Go numbers–constants–just work. -In this post I intend to show you a few things that perhaps you didn’t know about Go’s `const` keyword. - -## What’s so great about constants? - -To kick things off, why are constants good? Three things spring to mind: - - * _Immutability_. Constants are one of the few ways we have in Go to express immutability to the compiler. - * _Clarity_. Constants give us a way to extract magic numbers from our code, giving them names and semantic meaning. - * _Performance_. The ability to express to the compiler that something will not change is key as it unlocks optimisations such as constant folding, constant propagation, branch and dead code elimination. - - - -But these are generic use cases for constants, they apply to any language. Let’s talk about some of the properties of Go’s constants. - -### A Challenge - -To introduce the power of Go’s constants let’s try a little challenge: declare a _constant_ whose value is the number of bits in the natural machine word. - -We can’t use `unsafe.SizeOf` as it is not a constant expression. We could use a build tag and laboriously record the natural word size of each Go platform, or we could do something like this: - -``` -const uintSize = 32 << (^uint(0) >> 32 & 1) -``` - -There are many versions of this expression in Go codebases. They all work roughly the same way. If we’re on a 64 bit platform then the exclusive or of the number zero–all zero bits–is a number with all bits set, sixty four of them to be exact. - -``` -1111111111111111111111111111111111111111111111111111111111111111 -``` - -If we shift that value thirty two bits to the right, we get another value with thirty two ones in it. - -``` -0000000000000000000000000000000011111111111111111111111111111111 -``` - -Anding that with a number with one bit in the final position give us, the same thing, `1`, - -``` -0000000000000000000000000000000011111111111111111111111111111111 & 1 = 1 -``` - -Finally we shift the number thirty two one place to the right, giving us 641. - -``` -32 << 1 = 64 -``` - -This expression is an example of a _constant expression_. All of these operations happen at compile time and the result of the expression is itself a constant. If you look in the in runtime package, in particular the garbage collector, you’ll see how constant expressions are used to set up complex invariants based on the word size of the machine the code is compiled on. - -So, this is a neat party trick, but most compilers will do this kind of constant folding at compile time for you. Let’s step it up a notch. - -## Constants are values - -In Go, constants are values and each value has a type. In Go, user defined types can declare their own methods. Thus, a constant value can have a method set. If you’re surprised by this, let me show you an example that you probably use every day. - -``` -const timeout = 500 * time.Millisecond -fmt.Println("The timeout is", timeout) // 500ms -``` - -In the example the untyped literal constant `500` is multiplied by `time.Millisecond`, itself a constant of type `time.Duration`. The rule for assignments in Go are, unless otherwise declared, the type on the left hand side of the assignment operator is inferred from the type on the right.`500` is an untyped constant so it is converted to a `time.Duration` then multiplied with the constant `time.Millisecond`. - -Thus `timeout` is a constant of type `time.Duration` which holds the value `500000000`. -Why then does `fmt.Println` print `500ms`, not `500000000`? - -The answer is `time.Duration` has a `String` method. Thus any `time.Duration` value, even a constant, knows how to pretty print itself. - -Now we know that constant values are typed, and because types can declare methods, we can derive that _constant values can fulfil interfaces_. In fact we just saw an example of this. `fmt.Println` doesn’t assert that a value has a `String` method, it asserts the value implements the `Stringer` interface. - -Let’s talk a little about how we can use this property to make our Go code better, and to do that I’m going to take a brief digression into the Singleton pattern. - -## Singletons - -I’m generally not a fan of the singleton pattern, in Go or any language. Singletons complicate testing and create unnecessary coupling between packages. I feel the singleton pattern is often used _not_ to create a singular instance of a thing, but instead to create a place to coordinate registration. `net/http.DefaultServeMux` is a good example of this pattern. - -``` -package http - -// DefaultServeMux is the default ServeMux used by Serve. -var DefaultServeMux = &defaultServeMux - -var defaultServeMux ServeMux -``` - -There is nothing singular about `http.defaultServerMux`, nothing prevents you from creating another `ServeMux`. In fact the `http` package provides a helper that will create as many `ServeMux`‘s as you want. - -``` -// NewServeMux allocates and returns a new ServeMux. -func NewServeMux() *ServeMux { return new(ServeMux) } -``` - -`http.DefaultServeMux` is not a singleton. Never the less there is a case for things which are truely singletons because they can only represent a single thing. A good example of this are the file descriptors of a process; 0, 1, and 2 which represent stdin, stdout, and stderr respectively. - -It doesn’t matter what names you give them, `1` is always stdout, and there can only ever be one file descriptor `1`. Thus these two operations are identical: - -``` -fmt.Fprintf(os.Stdout, "Hello dotGo\n") -syscall.Write(1, []byte("Hello dotGo\n")) -``` - -So let’s look at how the `os` package defines `Stdin`, `Stdout`, and `Stderr`: - -``` -package os - -var ( - Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin") - Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout") - Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr") -) -``` - -There are a few problems with this declaration. Firstly their type is `*os.File` not the respective `io.Reader` or `io.Writer` interfaces. People have long complained that this makes replacing them with alternatives problematic. However the notion of replacing these variables is precisely the point of this digression. Can you safely change the value of `os.Stdout` once your program is running without causing a data race? - -I argue that, in the general case, you cannot. In general, if something is unsafe to do, as programmers we shouldn’t let our users think that it is safe, [lest they begin to depend on that behaviour][3]. - -Could we change the definition of `os.Stdout` and friends so that they retain the observable behaviour of reading and writing, but remain immutable? It turns out, we can do this easily with constants. - -``` -type readfd int - -func (r readfd) Read(buf []byte) (int, error) { - return syscall.Read(int(r), buf) -} - -type writefd int - -func (w writefd) Write(buf []byte) (int, error) { - return syscall.Write(int(w), buf) -} - -const ( - Stdin = readfd(0) - Stdout = writefd(1) - Stderr = writefd(2) -) - -func main() { - fmt.Fprintf(Stdout, "Hello world") -} -``` - -In fact this change causes only one compilation failure in the standard library.2 - -## Sentinel error values - -Another case of things which look like constants but really aren’t, are sentinel error values. `io.EOF`, `sql.ErrNoRows`, `crypto/x509.ErrUnsupportedAlgorithm`, and so on are all examples of sentinel error values. They all fall into a category of _expected_ errors, and because they are expected, you’re expected to check for them. - -To compare the error you have with the one you were expecting, you need to import the package that defines that error. Because, by definition, sentinel errors are exported public variables, any code that imports, for example, the `io` package could change the value of `io.EOF`. - -``` -package nelson - -import "io" - -func init() { - io.EOF = nil // haha! -} -``` - -I’ll say that again. If I know the name of `io.EOF` I can import the package that declares it, which I must if I want to compare it to my error, and thus I could change `io.EOF`‘s value. Historically convention and a bit of dumb luck discourages people from writing code that does this, but technically there is nothing to prevent you from doing so. - -Replacing `io.EOF` is probably going to be detected almost immediately. But replacing a less frequently used sentinel error may cause some interesting side effects: - -``` -package innocent - -import "crypto/rsa" - -func init() { - rsa.ErrVerification = nil // 🤔 -} -``` - -If you were hoping the race detector will spot this subterfuge, I suggest you talk to the folks writing testing frameworks who replace `os.Stdout` without it triggering the race detector. - -## Fungibility - -I want to digress for a moment to talk about _the_ most important property of constants. Constants aren’t just immutable, its not enough that we cannot overwrite their declaration, -Constants are _fungible_. This is a tremendously important property that doesn’t get nearly enough attention. - -Fungible means identical. Money is a great example of fungibility. If you were to lend me 10 bucks, and I later pay you back, the fact that you gave me a 10 dollar note and I returned to you 10 one dollar bills, with respect to its operation as a financial instrument, is irrelevant. Things which are fungible are by definition equal and equality is a powerful property we can leverage for our programs. - -``` -var myEOF = errors.New("EOF") // io/io.go line 38 -fmt.Println(myEOF == io.EOF) // false -``` - -Putting aside the effect of malicious actors in your code base the key design challenge with sentinel errors is they behave like _singletons_ , not _constants_. Even if we follow the exact procedure used by the `io` package to create our own EOF value, `myEOF` and `io.EOF` are not equal. `myEOF` and `io.EOF` are not fungible, they cannot be interchanged. Programs can spot the difference. - -When you combine the lack of immutability, the lack of fungibility, the lack of equality, you have a set of weird behaviours stemming from the fact that sentinel error values in Go are not constant expressions. But what if they were? - -## Constant errors - -Ideally a sentinel error value should behave as a constant. It should be immutable and fungible. Let’s recap how the built in `error` interface works in Go. - -``` -type error interface { - Error() string -} -``` - -Any type with an `Error() string` method fulfils the `error` interface. This includes user defined types, it includes types derived from primitives like string, and it includes constant strings. With that background, consider this error implementation: - -``` -type Error string - -func (e Error) Error() string { - return string(e) -} -``` - -We can use this error type as a constant expression: - -``` -const err = Error("EOF") -``` - -Unlike `errors.errorString`, which is a struct, a compact struct literal initialiser is not a constant expression and cannot be used. - -``` -const err2 = errors.errorString{"EOF"} // doesn't compile -``` - -As constants of this `Error` type are not variables, they are immutable. - -``` -const err = Error("EOF") -err = Error("not EOF") // doesn't compile -``` - -Additionally, two constant strings are always equal if their contents are equal: - -``` -const str1 = "EOF" -const str2 = "EOF" -fmt.Println(str1 == str2) // true -``` - -which means two constants of a type derived from string with the same contents are also equal. - -``` -type Error string - -const err1 = Error("EOF") -const err2 = Error("EOF") - fmt.Println(err1 == err2) // true``` - -``` -Said another way, equal constant `Error` values are the same, in the way that the literal constant `1` is the same as every other literal constant `1`. - -Now we have all the pieces we need to make sentinel errors, like `io.EOF`, and `rsa.ErrVerfication`, immutable, fungible, constant expressions. -``` - - % git diff - diff --git a/src/io/io.go b/src/io/io.go - inde \ No newline at end of file diff --git a/sources/tech/20190610 Tmux Command Examples To Manage Multiple Terminal Sessions.md b/sources/tech/20190610 Tmux Command Examples To Manage Multiple Terminal Sessions.md deleted file mode 100644 index d9ed871a10..0000000000 --- a/sources/tech/20190610 Tmux Command Examples To Manage Multiple Terminal Sessions.md +++ /dev/null @@ -1,296 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Tmux Command Examples To Manage Multiple Terminal Sessions) -[#]: via: (https://www.ostechnix.com/tmux-command-examples-to-manage-multiple-terminal-sessions/) -[#]: author: (sk https://www.ostechnix.com/author/sk/) - -Tmux Command Examples To Manage Multiple Terminal Sessions -====== - -![tmux command examples][1] - -We’ve already learned to use [**GNU Screen**][2] to manage multiple Terminal sessions. Today, we will see yet another well-known command-line utility named **“Tmux”** to manage Terminal sessions. Similar to GNU Screen, Tmux is also a Terminal multiplexer that allows us to create number of terminal sessions and run more than one programs or processes at the same time inside a single Terminal window. Tmux is free, open source and cross-platform program that supports Linux, OpenBSD, FreeBSD, NetBSD and Mac OS X. In this guide, we will discuss most-commonly used Tmux commands in Linux. - -### Installing Tmux in Linux - -Tmux is available in the official repositories of most Linux distributions. - -On Arch Linux and its variants, run the following command to install it. - -``` -$ sudo pacman -S tmux -``` - -On Debian, Ubuntu, Linux Mint: - -``` -$ sudo apt-get install tmux -``` - -On Fedora: - -``` -$ sudo dnf install tmux -``` - -On RHEL and CentOS: - -``` -$ sudo yum install tmux -``` - -On SUSE/openSUSE: - -``` -$ sudo zypper install tmux -``` - -Well, we have just installed Tmux. Let us go ahead and see some examples to learn how to use Tmux. - -### Tmux Command Examples To Manage Multiple Terminal Sessions - -The default prefix shortcut to all commands in Tmux is **Ctrl+b**. Just remember this keyboard shortcut when using Tmux. - -* * * - -**Note:** The default prefix to all **Screen** commands is **Ctrl+a**. - -* * * - -##### Creating Tmux sessions - -To create a new Tmux session and attach to it, run the following command from the Terminal: - -``` -tmux -``` - -Or, - -``` -tmux new -``` - -Once you are inside the Tmux session, you will see a **green bar at the bottom** as shown in the screenshot below. - -![][3] - -New Tmux session - -It is very handy to verify whether you’re inside a Tmux session or not. - -##### Detaching from Tmux sessions - -To detach from a current Tmux session, just press **Ctrl+b** and **d**. You don’t need to press this both Keyboard shortcut at a time. First press “Ctrl+b” and then press “d”. - -Once you’re detached from a session, you will see an output something like below. - -``` -[detached (from session 0)] -``` - -##### Creating named sessions - -If you use multiple sessions, you might get confused which programs are running on which sessions. In such cases, you can just create named sessions. For example if you wanted to perform some activities related to web server in a session, just create the Tmux session with a custom name, for example **“webserver”** (or any name of your choice). - -``` -tmux new -s webserver -``` - -Here is the new named Tmux session. - -![][4] - -Tmux session with a custom name - -As you can see in the above screenshot, the name of the Tmux session is **webserver**. This way you can easily identify which program is running on which session. - -To detach, simply press **Ctrl+b** and **d**. - -##### List Tmux sessions - -To view the list of open Tmux sessions, run: - -``` -tmux ls -``` - -Sample output: - -![][5] - -List Tmux sessions - -As you can see, I have two open Tmux sessions. - -##### Creating detached sessions - -Sometimes, you might want to simply create a session and don’t want to attach to it automatically. - -To create a new detached session named **“ostechnix”** , run: - -``` -tmux new -s ostechnix -d -``` - -The above command will create a new Tmux session called “ostechnix”, but won’t attach to it. - -You can verify if the session is created using “tmux ls” command: - -![][6] - -Create detached Tmux sessions - -##### Attaching to Tmux sessions - -You can attach to the last created session by running this command: - -``` -tmux attach -``` - -Or, - -``` -tmux a -``` - -If you want to attach to any specific named session, for example “ostechnix”, run: - -``` -tmux attach -t ostechnix -``` - -Or, shortly: - -``` -tmux a -t ostechnix -``` - -##### Kill Tmux sessions - -When you’re done and no longer required a Tmux session, you can kill it at any time with command: - -``` -tmux kill-session -t ostechnix -``` - -To kill when attached, press **Ctrl+b** and **x**. Hit “y” to kill the session. - -You can verify if the session is closed with “tmux ls” command. - -To Kill Tmux server along with all Tmux sessions, run: - -``` -tmux kill-server -``` - -Be careful! This will terminate all Tmux sessions even if there are any running jobs inside the sessions without any warning. - -When there were no running Tmux sessions, you will see the following output: - -``` -$ tmux ls -no server running on /tmp/tmux-1000/default -``` - -##### Split Tmux Session Windows - -Tmux has an option to split a single Tmux session window into multiple smaller windows called **Tmux panes**. This way we can run different programs on each pane and interact with all of them simultaneously. Each pane can be resized, moved and closed without affecting the other panes. We can split a Tmux window either horizontally or vertically or both at once. - -**Split panes horizontally** - -To split a pane horizontally, press **Ctrl+b** and **”** (single quotation mark). - -![][7] - -Split Tmux pane horizontally - -Use the same key combination to split the panes further. - -**Split panes vertically** - -To split a pane vertically, press **Ctrl+b** and **%**. - -![][8] - -Split Tmux panes vertically - -**Split panes horizontally and vertically** - -We can also split a pane horizontally and vertically at the same time. Take a look at the following screenshot. - -![][9] - -Split Tmux panes - -First, I did a horizontal split by pressing **Ctrl+b “** and then split the lower pane vertically by pressing **Ctrl+b %**. - -As you see in the above screenshot, I am running three different programs on each pane. - -**Switch between panes** - -To switch between panes, press **Ctrl+b** and **Arrow keys (Left, Right, Up, Down)**. - -**Send commands to all panes** - -In the previous example, we run three different commands on each pane. However, it is also possible to run send the same commands to all panes at once. - -To do so, press **Ctrl+b** and type the following command and hit ENTER: - -``` -:setw synchronize-panes -``` - -Now type any command on any pane. You will see that the same command is reflected on all panes. - -**Swap panes** - -To swap panes, press **Ctrl+b** and **o**. - -**Show pane numbers** - -Press **Ctrl+b** and **q** to show pane numbers. - -**Kill panes** - -To kill a pane, simply type **exit** and ENTER key. Alternatively, press **Ctrl+b** and **x**. You will see a confirmation message. Just press **“y”** to close the pane. - -![][10] - -Kill Tmux panes - -At this stage, you will get a basic idea of Tmux and how to use it to manage multiple Terminal sessions. For more details, refer man pages. - -``` -$ man tmux -``` - -Both GNU Screen and Tmux utilities can be very helpful when managing servers remotely via SSH. Learn Screen and Tmux commands thoroughly to manage your remote servers like a pro. - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/tmux-command-examples-to-manage-multiple-terminal-sessions/ - -作者:[sk][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/wp-content/uploads/2019/06/Tmux-720x340.png -[2]: https://www.ostechnix.com/screen-command-examples-to-manage-multiple-terminal-sessions/ -[3]: https://www.ostechnix.com/wp-content/uploads/2019/06/Tmux-session.png -[4]: https://www.ostechnix.com/wp-content/uploads/2019/06/Named-Tmux-session.png -[5]: https://www.ostechnix.com/wp-content/uploads/2019/06/List-Tmux-sessions.png -[6]: https://www.ostechnix.com/wp-content/uploads/2019/06/Create-detached-sessions.png -[7]: https://www.ostechnix.com/wp-content/uploads/2019/06/Horizontal-split.png -[8]: https://www.ostechnix.com/wp-content/uploads/2019/06/Vertical-split.png -[9]: https://www.ostechnix.com/wp-content/uploads/2019/06/Split-Panes.png -[10]: https://www.ostechnix.com/wp-content/uploads/2019/06/Kill-panes.png diff --git a/sources/tech/20190611 Cisco software to make networks smarter, safer, more manageable.md b/sources/tech/20190611 Cisco software to make networks smarter, safer, more manageable.md deleted file mode 100644 index 7bdf5361ab..0000000000 --- a/sources/tech/20190611 Cisco software to make networks smarter, safer, more manageable.md +++ /dev/null @@ -1,104 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Cisco software to make networks smarter, safer, more manageable) -[#]: via: (https://www.networkworld.com/article/3401523/cisco-software-to-make-networks-smarter-safer-more-manageable.html) -[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) - -Cisco software to make networks smarter, safer, more manageable -====== -Cisco software announced at Cisco Live embraces AI to help customers set consistent network and security policies across their domains and improve intent-based networking. -![bigstock][1] - -SAN DIEGO—Cisco injected a number of new technologies into its key networking control-point software that makes it easier to stretch networking from the data center to the cloud while making the whole environment smarter and easier to manage. - -At the company’s annual Cisco Live customer event here it rolled out software that lets customers more easily meld typically siloed domains across the enterprise and cloud to the wide area network. The software enables what Cisco calls multidomain integration that lets customers set policies to apply uniform access controls to users, devices and applications regardless of where they connect to the network, the company said. - -**More about SD-WAN** - - * [How to buy SD-WAN technology: Key questions to consider when selecting a supplier][2] - * [How to pick an off-site data-backup method][3] - * [SD-Branch: What it is and why you’ll need it][4] - * [What are the options for security SD-WAN?][5] - - - -The company also unveiled Cisco AI Network Analytics, a software package that uses [AI and machine learning techniques][6] to learn network traffic and security patterns that can help customers spot and fix problems proactively across the enterprise. - -All of the new software runs on Cisco’s DNA Center platform which is rapidly becoming an ever-more crucial component to the company’s intent-based networking plans. DNA Center has always been important since its introduction two years ago as it features automation capabilities, assurance setting, fabric provisioning and policy-based segmentation for enterprise networks. - -Beyond device management and configuration, Cisco DNA Center gives IT teams the ability to control access through policies using Software-Defined Access (SD-Access), automatically provision through Cisco DNA Automation, virtualize devices through Cisco Network Functions Virtualization (NFV), and lower security risks through segmentation and Encrypted Traffic Analysis. But experts say these software enhancements take it to a new level. - -“You can call it the rise of DNA Center and it’s important because it lets customers manage and control their entire network from one place – similar to what VMware does with its vCenter,” said Zeus Kerravala, founder and principal analyst with ZK Research. vCenter is VMware’s centralized platform for controlling its vSphere virtualized environments. - -“Cisco will likely roll more and more functionality into DNA Center in the future making it stronger,” Kerravala said. - -**[[Become a Microsoft Office 365 administrator in record time with this quick start course from PluralSight.][7] ]** - -Together the new software and DNA Center will help customers set consistent policies across their domains and collaborate with others for the benefit of the entire network. Customers can define a policy once, apply it everywhere, and monitor it systematically to ensure it is realizing its business intent, said Prashanth Shenoy, Cisco vice president of marketing for Enterprise Network and Mobility. It will help customers segment their networks to reduce congestion, improve security and compliance and contain network problems, he said. - -“In the campus, Cisco’s SD-Access solution uses this technology to group users and devices within the segments it creates according to their access privileges. Similarly, Cisco ACI creates groups of similar applications in the data center,” Shenoy said. “When integrated, SD-Access and ACI exchange their groupings and provide each other an awareness into their access policies. With this knowledge, each of the domains can map user groups with applications, jointly enforce policies, and block unauthorized access to applications.” - -In the Cisco world it basically means there now can be a unification of its central domain network controllers and they can work together and let customers drive policies across domains. - -Cisco also said that security capabilities can be spread across domains. - -Cisco Advanced Malware Protection (AMP) prevents breaches, monitors malicious behavior and detects and removes malware. Security constructs built into Cisco SD-WAN, and the recently announced SD-WAN onRamp for CoLocation, provide a full security stack that applies protection consistently from user to branch to clouds. Cisco Stealthwatch and Stealthwatch Cloud detect threats across the private network, public clouds, and in encrypted traffic. - -Analysts said Cisco’s latest efforts are an attempt to simplify what are fast becoming complex networks with tons of new devices and applications to support. - -Cisco’s initial efforts were product specific, but its latest announcements cross products and domains, said Lee Doyle principal analyst with Doyle Research. “Cisco is making a strong push to make its networks easier to use, manage and program.” - -That same strategy is behind the new AI Analytics program. - -“Trying to manually analyze and troubleshoot the traffic flowing through thousands of APs, switches and routers is a near impossible task, even for the most sophisticated NetOps team. In a wireless environment, onboarding and interference errors can crop up randomly and intermittently, making it even more difficult to determine probable causes,” said Anand Oswal, senior vice president, engineering for Cisco’s Enterprise Networking Business. - -Cisco has been integrating AI/ML into many operational and security components, with Cisco DNA Center the focal point for insights and actions, Oswal wrote in a [blog][8] about the AI announcement. AI Network Analytics collects massive amounts of network data from Cisco DNA Centers at participating customer sites, encrypts and anonymizes the data to ensure privacy, and collates all of it into the Cisco Worldwide Data Platform. In this cloud, the aggregated data is analyzed with deep machine learning to reveal patterns and anomalies such as: - - * Highly personalized network baselines with multiple levels of granularity that define “normal” for a given network, site, building and SSID. - - * Sudden changes in onboarding times for Wi-Fi devices, by individual APs, floor, building, campus -``` - -``` - and branch. - - * Simultaneous connectivity failures with numerous clients at a specific location - - * Changes in SaaS and Cloud application performance via SD-WAN direct internet connections or [Cloud OnRamps][9]. - - * Pattern-matching capabilities of ML will be used to spot anomalies in network behavior that might otherwise be missed. - - - - -“The intelligence of its large base of customers can help Cisco to derive important insights about how users can better manage their networks and solve problems and the power of MI/AI technology will continue to improve over time,” Doyle said. - -Join the Network World communities on [Facebook][10] and [LinkedIn][11] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3401523/cisco-software-to-make-networks-smarter-safer-more-manageable.html - -作者:[Michael Cooney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Michael-Cooney/ -[b]: https://github.com/lujun9972 -[1]: https://images.idgesg.net/images/article/2018/11/intelligentnetwork-100780636-large.jpg -[2]: https://www.networkworld.com/article/3323407/sd-wan/how-to-buy-sd-wan-technology-key-questions-to-consider-when-selecting-a-supplier.html -[3]: https://www.networkworld.com/article/3328488/backup-systems-and-services/how-to-pick-an-off-site-data-backup-method.html -[4]: https://www.networkworld.com/article/3250664/lan-wan/sd-branch-what-it-is-and-why-youll-need-it.html -[5]: https://www.networkworld.com/article/3285728/sd-wan/what-are-the-options-for-securing-sd-wan.html?nsdr=true -[6]: https://www.networkworld.com/article/3400382/cisco-will-use-aiml-to-boost-intent-based-networking.html -[7]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fadministering-office-365-quick-start -[8]: https://blogs.cisco.com/analytics-automation/cisco-ai-network-analytics-making-networks-smarter-simpler-and-more-secure -[9]: https://www.networkworld.com/article/3393232/cisco-boosts-sd-wan-with-multicloud-to-branch-access-system.html -[10]: https://www.facebook.com/NetworkWorld/ -[11]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20190611 How To Find Linux System Details Using inxi.md b/sources/tech/20190611 How To Find Linux System Details Using inxi.md deleted file mode 100644 index 4fc24fd137..0000000000 --- a/sources/tech/20190611 How To Find Linux System Details Using inxi.md +++ /dev/null @@ -1,608 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How To Find Linux System Details Using inxi) -[#]: via: (https://www.ostechnix.com/how-to-find-your-system-details-using-inxi/) -[#]: author: (sk https://www.ostechnix.com/author/sk/) - -How To Find Linux System Details Using inxi -====== - -![find Linux system details using inxi][1] - -**Inxi** is a free, open source, and full featured command line system information tool. It shows system hardware, CPU, drivers, Xorg, Desktop, Kernel, GCC version(s), Processes, RAM usage, and a wide variety of other useful information. Be it a hard disk or CPU, mother board or the complete detail of the entire system, inxi will display it more accurately in seconds. Since it is CLI tool, you can use it in Desktop or server edition. Inxi is available in the default repositories of most Linux distributions and some BSD systems. - -### Install inxi - -**On Arch Linux and derivatives:** - -To install inxi in Arch Linux or its derivatives like Antergos, and Manajaro Linux, run: - -``` -$ sudo pacman -S inxi -``` - -Just in case if Inxi is not available in the default repositories, try to install it from AUR (It varies year to year) using any AUR helper programs. - -Using [**Yay**][2]: - -``` -$ yay -S inxi -``` - -**On Debian / Ubuntu and derivatives:** - -``` -$ sudo apt-get install inxi -``` - -**On Fedora / RHEL / CentOS / Scientific Linux:** - -inxi is available in the Fedora default repositories. So, just run the following command to install it straight away. - -``` -$ sudo dnf install inxi -``` - -In RHEL and its clones like CentOS and Scientific Linux, you need to add the EPEL repository and then install inxi. - -To install EPEL repository, just run: - -``` -$ sudo yum install epel-release -``` - -After installing EPEL repository, install inxi using command: - -``` -$ sudo yum install inxi -``` - -**On SUSE/openSUSE:** - -``` -$ sudo zypper install inxi -``` - -### Find Linux System Details Using inxi - -inxi will require some additional programs to operate properly. They will be installed along with inxi. However, in case if they are not installed automatically, you need to find and install them. - -To list all required programs, run: - -``` -$ inxi --recommends -``` - -If you see any missing programs, then install them before start using inxi. - -Now, let us see how to use it to reveal the Linux system details. inxi usage is pretty simple and straight forward. - -Open up your Terminal and run the following command to print a short summary of CPU, memory, hard drive and kernel information: - -``` -$ inxi -``` - -**Sample output:** - -``` -CPU: Dual Core Intel Core i3-2350M (-MT MCP-) speed/min/max: 798/800/2300 MHz -Kernel: 5.1.2-arch1-1-ARCH x86_64 Up: 1h 31m Mem: 2800.5/7884.2 MiB (35.5%) -Storage: 465.76 GiB (80.8% used) Procs: 163 Shell: bash 5.0.7 inxi: 3.0.34 -``` - -![][3] - -Find Linux System Details Using inxi - -As you can see, Inxi displays the following details of my Arch Linux desktop: - - 1. CPU type, - 2. CPU speed, - 3. Kernel details, - 4. Uptime, - 5. Memory details (Total and used memory), - 6. Hard disk size along with current usage, - 7. Procs, - 8. Default shell details, - 9. Inxi version. - - - -To display full summary, use **“-F”** switch as shown below. - -``` -$ inxi -F -``` - -**Sample output:** - -``` -System: Host: sk Kernel: 5.1.2-arch1-1-ARCH x86_64 bits: 64 Desktop: Deepin 15.10.1 Distro: Arch Linux -Machine: Type: Portable System: Dell product: Inspiron N5050 v: N/A serial: - Mobo: Dell model: 01HXXJ v: A05 serial: BIOS: Dell v: A05 date: 08/03/2012 -Battery: ID-1: BAT0 charge: 39.0 Wh condition: 39.0/48.8 Wh (80%) -CPU: Topology: Dual Core model: Intel Core i3-2350M bits: 64 type: MT MCP L2 cache: 3072 KiB - Speed: 798 MHz min/max: 800/2300 MHz Core speeds (MHz): 1: 798 2: 798 3: 798 4: 798 -Graphics: Device-1: Intel 2nd Generation Core Processor Family Integrated Graphics driver: i915 v: kernel - Display: x11 server: X.Org 1.20.4 driver: modesetting unloaded: vesa resolution: 1366x768~60Hz - Message: Unable to show advanced data. Required tool glxinfo missing. -Audio: Device-1: Intel 6 Series/C200 Series Family High Definition Audio driver: snd_hda_intel - Sound Server: ALSA v: k5.1.2-arch1-1-ARCH -Network: Device-1: Realtek RTL810xE PCI Express Fast Ethernet driver: r8169 - IF: enp5s0 state: down mac: 45:c8:gh:89:b6:45 - Device-2: Qualcomm Atheros AR9285 Wireless Network Adapter driver: ath9k - IF: wlp9s0 state: up mac: c3:11:96:22:87:3g - Device-3: Qualcomm Atheros AR3011 Bluetooth type: USB driver: btusb -Drives: Local Storage: total: 465.76 GiB used: 376.31 GiB (80.8%) - ID-1: /dev/sda vendor: Seagate model: ST9500325AS size: 465.76 GiB -Partition: ID-1: / size: 456.26 GiB used: 376.25 GiB (82.5%) fs: ext4 dev: /dev/sda2 - ID-2: /boot size: 92.8 MiB used: 62.9 MiB (67.7%) fs: ext4 dev: /dev/sda1 - ID-3: swap-1 size: 2.00 GiB used: 0 KiB (0.0%) fs: swap dev: /dev/sda3 -Sensors: System Temperatures: cpu: 58.0 C mobo: N/A - Fan Speeds (RPM): cpu: 3445 -Info: Processes: 169 Uptime: 1h 38m Memory: 7.70 GiB used: 2.94 GiB (38.2%) Shell: bash inxi: 3.0.34 -``` - -Inxi used on IRC automatically filters out your network device MAC address, WAN and LAN IP, your /home username directory in partitions, and a few other items in order to maintain basic privacy and security. You can also trigger this filtering with the **-z** option like below. - -``` -$ inxi -Fz -``` - -To override the IRC filter, use the **-Z** option. - -``` -$ inxi -FZ -``` - -This can be useful in debugging network connection issues online in a private chat, for example. Please be very careful while using -Z option. It will display your MAC addresses. You shouldn’t share the results got with -Z option in public forums. - -##### Displaying device-specific details - -When running inxi without any options, you will get basic details of your system, such as CPU, Memory, Kernel, Uptime, harddisk etc. - -You can, of course, narrow down the result to show specific device details using various options. Inxi has numerous options (both uppercase and lowercase). - -First, we will see example commands for all uppercase options in alphabetical order. Some commands may require root/sudo privileges to get actual data. - -####### **Uppercase options** - -**1\. Display Audio/Sound card details** - -To show your audio and sound card(s) information with sound card driver, use **-A** option. - -``` -$ inxi -A -Audio: Device-1: Intel 6 Series/C200 Series Family High Definition Audio driver: snd_hda_intel - Sound Server: ALSA v: k5.1.2-arch1-1-ARCH -``` - -**2\. Display Battery details** - -To show battery details of your system with current charge and condition, use **-B** option. - -``` -$ inxi -B -Battery: ID-1: BAT0 charge: 39.0 Wh condition: 39.0/48.8 Wh (80%) -``` - -**3\. Display CPU details** - -To show complete CPU details including no of cores, CPU model, CPU cache, CPU clock speed, CPU min/max speed etc., use **-C** option. - -``` -$ inxi -C -CPU: Topology: Dual Core model: Intel Core i3-2350M bits: 64 type: MT MCP L2 cache: 3072 KiB - Speed: 798 MHz min/max: 800/2300 MHz Core speeds (MHz): 1: 798 2: 798 3: 798 4: 798 -``` - -**4\. Display hard disk details** - -To show information about your hard drive, such as Disk type, vendor, device ID, model, disk size, total disk space, used percentage etc., use **-D** option. - -``` -$ inxi -D -Drives: Local Storage: total: 465.76 GiB used: 376.31 GiB (80.8%) - ID-1: /dev/sda vendor: Seagate model: ST9500325AS size: 465.76 GiB -``` - -**5\. Disply Graphics details** - -To show details about the graphics card, including details of grahics card, driver, vendor, display server, resolution etc., use **-G** option. - -``` -$ inxi -G -Graphics: Device-1: Intel 2nd Generation Core Processor Family Integrated Graphics driver: i915 v: kernel - Display: x11 server: X.Org 1.20.4 driver: modesetting unloaded: vesa resolution: 1366x768~60Hz - Message: Unable to show advanced data. Required tool glxinfo missing. -``` - -**6\. Display details about processes, uptime, memory, inxi version** - -To show information about no of processes, total uptime, total memory with used memory, Shell details and inxi version etc., use **-I** option. - -``` -$ inxi -I -Info: Processes: 170 Uptime: 5h 47m Memory: 7.70 GiB used: 3.27 GiB (42.4%) Shell: bash inxi: 3.0.34 -``` - -**7\. Display Motherboard details** - -To show information about your machine details, manufacturer, motherboard, BIOS, use **-M** option. - -``` -$ inxi -M -Machine: Type: Portable System: Dell product: Inspiron N5050 v: N/A serial: - Mobo: Dell model: 034ygt v: A018 serial: BIOS: Dell v: A001 date: 09/04/2015 -``` - -**8\. Display network card details** - -To show information about your network card, including vendor, card driver and no of network interfaces etc., use **-N** option. - -``` -$ inxi -N -Network: Device-1: Realtek RTL810xE PCI Express Fast Ethernet driver: r8169 - Device-2: Qualcomm Atheros AR9285 Wireless Network Adapter driver: ath9k - Device-3: Qualcomm Atheros AR3011 Bluetooth type: USB driver: btusb -``` - -If you want to show the advanced details of the network cards, such as MAC address, speed and state of nic, use **-n** option. - -``` -$ inxi -n -``` - -Please careful sharing this details on public forum. - -**9\. Display Partition details** - -To display basic partition information, use **-P** option. - -``` -$ inxi -P -Partition: ID-1: / size: 456.26 GiB used: 376.25 GiB (82.5%) fs: ext4 dev: /dev/sda2 - ID-2: /boot size: 92.8 MiB used: 62.9 MiB (67.7%) fs: ext4 dev: /dev/sda1 - ID-3: swap-1 size: 2.00 GiB used: 0 KiB (0.0%) fs: swap dev: /dev/sda3 -``` - -To show full partition information including mount points, use **-p** option. - -``` -$ inxi -p -``` - -**10\. Display RAID details** - -To show RAID info, use **-R** option. - -``` -$ inxi -R -``` - -**11\. Display system details** - -To show Linux system information such as hostname, kernel, DE, OS version etc., use **-S** option. - -``` -$ inxi -S -System: Host: sk Kernel: 5.1.2-arch1-1-ARCH x86_64 bits: 64 Desktop: Deepin 15.10.1 Distro: Arch Linux -``` - -**12\. Displaying weather details** - -Inixi is not just for finding hardware details. It is useful for getting other stuffs too. - -For example, you can display the weather details of a given location. To do so, run inxi with **-W** option like below. - -``` -$ inxi -W 95623,us -Weather: Temperature: 21.1 C (70 F) Conditions: Scattered clouds Current Time: Tue 11 Jun 2019 04:34:35 AM PDT - Source: WeatherBit.io -``` - -Please note that you should use only ASCII letters in city/state/country names to get valid results. - -####### Lowercase options - -**1\. Display basic system details** - -To show only the basic summary of your system details, use **-b** option. - -``` -$ inxi -b -``` - -Alternatively, you can use this command: - -Both servers the same purpose. - -``` -$ inxi -v 2 -``` - -**2\. Set color scheme** - -We can set different color schemes for inxi output using **-c** option. Yu can set color scheme number from **0** to **42**. If no scheme number is supplied, **0** is assumed. - -Here is inxi output with and without **-c** option. - -![][4] - -inxi output without color scheme - -As you can see, when we run inxi with -c option, the color scheme is disabled. The -c option is useful to turnoff colored output when redirecting clean output without escape codes to a text file. - -Similarly, we can use other color scheme values. - -``` -$ inxi -c10 - -$ inxi -c42 -``` - -**3\. Display optical drive details** - -We can show the optical drive data details along with local hard drive details using **-d** option. - -``` -$ inxi -d -Drives: Local Storage: total: 465.76 GiB used: 376.31 GiB (80.8%) - ID-1: /dev/sda vendor: Seagate model: ST9500325AS size: 465.76 GiB - Optical-1: /dev/sr0 vendor: PLDS model: DVD+-RW DS-8A8SH dev-links: cdrom - Features: speed: 24 multisession: yes audio: yes dvd: yes rw: cd-r,cd-rw,dvd-r,dvd-ram -``` - -**4\. Display all CPU flags** - -To show all CPU flags used, run: - -``` -$ inxi -f -``` - -**5\. Display IP details** - -To show WAN and local ip address along network card details such as device vendor, driver, mac, state etc., use **-i** option. - -``` -$ inxi -i -``` - -**6\. Display partition labels** - -If you have set labels for the partitions, you can view them using **-l** option. - -``` -$ inxi -l -``` - -You can also view the labels of all partitions along with mountpoints using command: - -``` -$ inxi -pl -``` - -**7\. Display Memory details** - -We can display memory details such as total size of installed RAM, how much memory is used, no of available DIMM slots, total size of supported RAM, how much RAM is currently installed in each slots etc., using **-m** option. - -``` -$ sudo inxi -m -[sudo] password for sk: -Memory: RAM: total: 7.70 GiB used: 2.26 GiB (29.3%) - Array-1: capacity: 16 GiB slots: 2 EC: None - Device-1: DIMM_A size: 4 GiB speed: 1067 MT/s - Device-2: DIMM_B size: 4 GiB speed: 1067 MT/s -``` - -**8\. Display unmounted partition details** - -To show unmounted partition details, use **-o** option. - -``` -$ inxi -o -``` - -If there were no unmounted partitions in your system, you will see an output something like below. - -``` -Unmounted: Message: No unmounted partitions found. -``` - -**9\. Display list of repositories** - -To display the the list of repositories in your system, use **-r** option. - -``` -$ inxi -r -``` - -**Sample output:** - -``` -Repos: Active apt sources in file: /etc/apt/sources.list -deb http://in.archive.ubuntu.com/ubuntu/ xenial main restricted -deb http://in.archive.ubuntu.com/ubuntu/ xenial-updates main restricted -deb http://in.archive.ubuntu.com/ubuntu/ xenial universe -deb http://in.archive.ubuntu.com/ubuntu/ xenial-updates universe -deb http://in.archive.ubuntu.com/ubuntu/ xenial multiverse -deb http://in.archive.ubuntu.com/ubuntu/ xenial-updates multiverse -deb http://in.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse -deb http://security.ubuntu.com/ubuntu xenial-security main restricted -deb http://security.ubuntu.com/ubuntu xenial-security universe -deb http://security.ubuntu.com/ubuntu xenial-security multiverse -``` - -* * * - -**Suggested read:** - - * [**How To Find The List Of Installed Repositories From Commandline In Linux**][5] - - - -* * * - -**10\. Show system temperature, fan speed details** - -Inxi is capable to find motherboard/CPU/GPU temperatures and fan speed. - -``` -$ inxi -s -Sensors: System Temperatures: cpu: 60.0 C mobo: N/A - Fan Speeds (RPM): cpu: 3456 -``` - -Please note that Inxi requires sensors to find the system temperature. Make sure **lm_sensors** is installed and correctly configured in your system. For more details about lm_sensors, check the following guide. - - * [**How To View CPU Temperature On Linux**][6] - - - -**11\. Display details about processes** - -To show the list processes top 5 processes which are consuming most CPU and Memory, simply run: - -``` -$ inxi -t -Processes: CPU top: 5 - 1: cpu: 14.3% command: firefox pid: 15989 - 2: cpu: 10.5% command: firefox pid: 13487 - 3: cpu: 7.1% command: firefox pid: 15062 - 4: cpu: 3.1% command: xorg pid: 13493 - 5: cpu: 3.0% command: firefox pid: 14954 - System RAM: total: 7.70 GiB used: 2.99 GiB (38.8%) - Memory top: 5 - 1: mem: 1115.8 MiB (14.1%) command: firefox pid: 15989 - 2: mem: 606.6 MiB (7.6%) command: firefox pid: 13487 - 3: mem: 339.3 MiB (4.3%) command: firefox pid: 13630 - 4: mem: 303.1 MiB (3.8%) command: firefox pid: 18617 - 5: mem: 260.1 MiB (3.2%) command: firefox pid: 15062 -``` - -We can also sort this output by either CPU usage or Memory usage. - -For instance, to find the which top 5 processes are consuming most memory, use the following command: - -``` -$ inxi -t m -Processes: System RAM: total: 7.70 GiB used: 2.73 GiB (35.4%) - Memory top: 5 - 1: mem: 966.1 MiB (12.2%) command: firefox pid: 15989 - 2: mem: 468.2 MiB (5.9%) command: firefox pid: 13487 - 3: mem: 347.9 MiB (4.4%) command: firefox pid: 13708 - 4: mem: 306.7 MiB (3.8%) command: firefox pid: 13630 - 5: mem: 247.2 MiB (3.1%) command: firefox pid: 15062 -``` - -To sort the top 5 processes based on CPU usage, run: - -``` -$ inxi -t c -Processes: CPU top: 5 - 1: cpu: 14.9% command: firefox pid: 15989 - 2: cpu: 10.6% command: firefox pid: 13487 - 3: cpu: 7.0% command: firefox pid: 15062 - 4: cpu: 3.1% command: xorg pid: 13493 - 5: cpu: 2.9% command: firefox pid: 14954 -``` - -Bydefault, Inxi will display the top 5 processes. You can change the number of processes, for example 10, like below. - -``` -$ inxi -t cm10 -Processes: CPU top: 10 - 1: cpu: 14.9% command: firefox pid: 15989 - 2: cpu: 10.6% command: firefox pid: 13487 - 3: cpu: 7.0% command: firefox pid: 15062 - 4: cpu: 3.1% command: xorg pid: 13493 - 5: cpu: 2.9% command: firefox pid: 14954 - 6: cpu: 2.8% command: firefox pid: 13630 - 7: cpu: 1.8% command: firefox pid: 18325 - 8: cpu: 1.4% command: firefox pid: 18617 - 9: cpu: 1.3% command: firefox pid: 13708 - 10: cpu: 0.8% command: firefox pid: 14427 - System RAM: total: 7.70 GiB used: 2.92 GiB (37.9%) - Memory top: 10 - 1: mem: 1160.9 MiB (14.7%) command: firefox pid: 15989 - 2: mem: 475.1 MiB (6.0%) command: firefox pid: 13487 - 3: mem: 353.4 MiB (4.4%) command: firefox pid: 13708 - 4: mem: 308.0 MiB (3.9%) command: firefox pid: 13630 - 5: mem: 269.6 MiB (3.4%) command: firefox pid: 15062 - 6: mem: 249.3 MiB (3.1%) command: firefox pid: 14427 - 7: mem: 238.5 MiB (3.0%) command: firefox pid: 14954 - 8: mem: 208.2 MiB (2.6%) command: firefox pid: 18325 - 9: mem: 194.0 MiB (2.4%) command: firefox pid: 18617 - 10: mem: 143.6 MiB (1.8%) command: firefox pid: 23960 -``` - -The above command will display the top 10 processes that consumes the most CPU and Memory. - -To display only top10 based on memory usage, run: - -``` -$ inxi -t m10 -``` - -**12\. Display partition UUID details** - -To show partition UUIDs ( **U** niversally **U** nique **Id** entifier), use **-u** option. - -``` -$ inxi -u -``` - -There are much more options are yet to be covered. But, these are just enough to get almost all details of your Linux box. - -For more details and options, refer the man page. - -``` -$ man inxi -``` - -* * * - -**Related read:** - - * **[Neofetch – Display your Linux system’s information][7]** - - - -* * * - -The primary purpose of Inxi tool is to use in IRC or forum support. If you are looking for any help via a forum or website where someone is asking the specification of your system, just run this command, and copy/paste the output. - -**Resources:** - - * [**Inxi GitHub Repository**][8] - * [**Inxi home page**][9] - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/how-to-find-your-system-details-using-inxi/ - -作者:[sk][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/wp-content/uploads/2016/08/inxi-520x245-1-720x340.png -[2]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ -[3]: http://www.ostechnix.com/wp-content/uploads/2016/08/Find-Linux-System-Details-Using-inxi.png -[4]: http://www.ostechnix.com/wp-content/uploads/2016/08/inxi-output-without-color-scheme.png -[5]: https://www.ostechnix.com/find-list-installed-repositories-commandline-linux/ -[6]: https://www.ostechnix.com/view-cpu-temperature-linux/ -[7]: http://www.ostechnix.com/neofetch-display-linux-systems-information/ -[8]: https://github.com/smxi/inxi -[9]: http://smxi.org/docs/inxi.htm diff --git a/sources/tech/20190611 Step by Step Zorin OS 15 Installation Guide with Screenshots.md b/sources/tech/20190611 Step by Step Zorin OS 15 Installation Guide with Screenshots.md deleted file mode 100644 index 79d0b9e1a5..0000000000 --- a/sources/tech/20190611 Step by Step Zorin OS 15 Installation Guide with Screenshots.md +++ /dev/null @@ -1,204 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Step by Step Zorin OS 15 Installation Guide with Screenshots) -[#]: via: (https://www.linuxtechi.com/zorin-os-15-installation-guide-screenshots/) -[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) - -Step by Step Zorin OS 15 Installation Guide with Screenshots -====== - -Good News for all the Zorin users out there! Zorin has launched its latest version (Zorin OS 15) of its Ubuntu based Linux distro. This version is based on Ubuntu 18.04.2, since its launch in July 2009, it is estimated that this popular distribution has reached more than 17 million downloads. Zorin is renowned for creating a distribution for beginner level users and the all new Zorin OS 15 comes packed with a lot of goodies that surely will make Zorin OS lovers happy. Let’s see some of the major enhancements made in the latest version. - -### New Features of Zorin OS 15 - -Zorin OS has always amazed users with different set of features when every version is released Zorin OS 15 is no exception as it comes with a lot of new features as outlined below: - -**Enhanced User Experience** - -The moment you look at the Zorin OS 15, you will ask whether it is a Linux distro because it looks more like a Windows OS. According to Zorin, it wanted Windows users to get ported to Linux in a more user-friendly manner. And it features a Windows like Start menu, quick app launchers, a traditional task bar section, system tray etc. - -**Zorin Connect** - -Another major highlight of Zorin OS 15 is the ability to integrate your Android Smartphones seamlessly with your desktop using the Zorin Connect application. With your phone connected, you can share music, videos and other files between your phone and desktop. You can even use your phone as a mouse to control the desktop. You can also easily control the media playback in your desktop from your phone itself. Quickly reply to all your messages and notifications sent to your phone from your desktop. - -**New GTK Theme** - -Zorin OS 15 ships with an all new GTK Theme that has been exclusively built for this distro and the theme is available in 6 different colors along with the hugely popular dark theme. Another highlight is that the OS automatically detects the time of the day and changes the desktop theme accordingly. Say for example, during sunset it switches to a dark theme whereas in the morning it switches to bright theme automatically. - -**Other New Features:** - -Zorin OS 15 comes packed with a lot of new features including: - - * Compatible with Thunderbolt 3.0 devices - * Supports color emojis - * Comes with an upgraded Linux Kernel 4.18 - * Customized settings available for application menu and task bar - * System font changed to Inter - * Supports renaming bulk files - - - -### Minimum system requirements for Zorin OS 15 (Core): - - * Dual Core 64-bit (1GHZ) - * 2 GB RAM - * 10 GB free disk space - * Internet Connection Optional - * Display (800×600) - - - -### Step by Step Guide to Install Zorin OS 15 (Core) - -Before you start installing Zorin OS 15, ensure you have a copy of the Zorin OS 15 downloaded in your system. If not download then refer official website of [Zorin OS 15][1]. Remember this Linux distribution is available in 4 versions including: - - * Ultimate (Paid Version) - * Core (Free Version) - * Lite (Free Version) - * Education (Free Version) - - - -Note: In this article I will demonstrate Zorin OS 15 Core Installation Steps - -### Step 1) Create Zorin OS 15 Bootable USB Disk - -Once you have downloaded Zorin OS 15, copy the ISO into an USB disk and create a bootable disk. Change our system settings to boot using an USB disk and restart your system. Once you restart your system, you will see the screen as shown below. Click “ **Install or Try Zorin OS** ” - - - -### Step 2) Choose Install Zorin OS - -In the next screen, you will be shown option to whether install Zorin OS 15 or to try Zorin OS. Click “ **Install Zorin OS** ” to continue the installation process. - - - -### Step 3) Choose Keyboard Layout - -Next step is to choose your keyboard layout. By default, English (US) is selected and if you want to choose a different language, then choose it and click “ **Continue** ” - - - -### Step 4) Download Updates and Other Software - -In the next screen, you will be asked whether you need to download updates while you are installing Zorin OS and install other 3rd party applications. In case your system is connected to internet then you can select both of these options, but by doing so your installation time increases considerably, or if you don’t want to install updates and third party software during the installation then untick both these options and click “Continue” - - - -### Step 5) Choose Zorin OS 15 Installation Method - -If you are new to Linux and want fresh installation and don’t want to customize partitions, then better choose option “ **Erase disk and install Zorin OS** ” - -If you want to create customize partitions for Zorin OS then choose “ **Something else** “, In this tutorial I will demonstrate how to create customize partition scheme for Zorin OS 15 installation, - -So, choose “ **Something else** ” option and then click on Continue - - - - - -As we can see we have around 42 GB disk available for Zorin OS, We will be creating following partitions, - - * /boot = 2 GB (ext4 file system) - * /home = 20 GB (ext4 file system) - * / = 10 GB (ext4 file system) - * /var = 7 GB (ext4 file system) - * Swap = 2 GB (ext4 file system) - - - -To start creating partitions, first click on “ **New Partition Table** ” and it will show it is going to create empty partition table, click on continue - - - -In the next screen we will see that we have now 42 GB free space on disk (/dev/sda), so let’s create our first partition as /boot, - -Select the free space, then click on + symbol and then specify the partition size as 2048 MB, file system type as ext4 and mount point as /boot, - - - -Click on OK - -Now create our next partition /home of size 20 GB (20480 MB), - - - -Similarly create our next two partition / and /var of size 10 and 7 GB respectively, - - - - - -Let’s create our last partition as swap of size 2 GB - - - -Click on OK - -Choose “ **Install Now** ” option in next window, - - - -In next window, choose “Continue” to write changes to disk and to proceed with installation - - - -### Step 6) Choose Your Preferred Location - -In the next screen, you will be asked to choose your location and click “Continue” - - - -### Step 7) Provide User Credentials - -In the next screen, you’ll be asked to enter the user credentials including your name, computer name, - -Username and password. Once you are done, click “Continue” to proceed with the installation process. - - - -### Step 8) Installing Zorin OS 15 - -Once you click continue, you can see that the Zorin OS 15 starts installing and it may take some time to complete the installation process. - - - -### Step 9) Restart your system after Successful Installation - -Once the installation process is completed, it will ask to restart your computer. Hit “ **Restart Now** ” - - - -### Step 10) Login to Zorin OS 15 - -Once the system restarts, you will be asked to login into the system using the login credentials provided earlier. - -Note: Don’t forget to change the boot medium from bios so that system boots up with disk. - - - -### Step 11) Zorin OS 15 Welcome Screen - -Once your login is successful, you can see the Zorin OS 15 welcome screen. Now you can start exploring all the incredible features of Zorin OS 15. - - - -That’s all from this tutorial, please do share feedback and comments. - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/zorin-os-15-installation-guide-screenshots/ - -作者:[Pradeep Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/pradeep/ -[b]: https://github.com/lujun9972 -[1]: https://zorinos.com/download/ diff --git a/sources/tech/20190614 A data-centric approach to patching systems with Ansible.md b/sources/tech/20190614 A data-centric approach to patching systems with Ansible.md deleted file mode 100644 index ade27106f3..0000000000 --- a/sources/tech/20190614 A data-centric approach to patching systems with Ansible.md +++ /dev/null @@ -1,141 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (A data-centric approach to patching systems with Ansible) -[#]: via: (https://opensource.com/article/19/6/patching-systems-ansible) -[#]: author: (Mark Phillips https://opensource.com/users/markp/users/markp) - -A data-centric approach to patching systems with Ansible -====== -Use data and variables in Ansible to control selective patching. -![metrics and data shown on a computer screen][1] - -When you're patching Linux machines these days, I could forgive you for asking, "How hard can it be?" Sure, a **yum update -y** will sort it for you in a flash. - -![Animation of updating Linux][2] - -But for those of us working with more than a handful of machines, it's not that simple. Sometimes an update can create unintended consequences across many machines, and you're left wondering how to put things back the way they were. Or you might think, "Should I have applied the critical patch on its own and saved myself a lot of pain?" - -Faced with these sorts of challenges in the past led me to build a way to cherry-pick the updates needed and automate their application. - -### A flexible idea - -Here's an overview of the process: - -![Overview of the Ansible patch process][3] - -This system doesn't permit machines to have direct access to vendor patches. Instead, they're selectively subscribed to repositories. Repositories contain only the patches that are required––although I'd encourage you to give this careful consideration so you don't end up with a proliferation (another management overhead you'll not thank yourself for creating). - -Now patching a machine comes down to 1) The repositories it's subscribed to and 2) Getting the "thumbs up" to patch. By using variables to control both subscription and permission to patch, we don't need to tamper with the logic (the plays); we only need to alter the data. - -Here is an [example Ansible role][4] that fulfills both requirements. It manages repository subscriptions and has a simple variable that controls running the patch command. - - -``` -\--- -# tasks file for patching - -\- name: Include OS version specific differences -include_vars: "{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml" - -\- name: Ensure Yum repositories are configured -template: -src: template.repo.j2 -dest: "/etc/yum.repos.d/{{ item.label }}.repo" -owner: root -group: root -mode: 0644 -when: patching_repos is defined -loop: "{{ patching_repos }}" -notify: patching-clean-metadata - -\- meta: flush_handlers - -\- name: Ensure OS shipped yum repo configs are absent -file: -path: "/etc/yum.repos.d/{{ patching_default_repo_def }}" -state: absent - -# add flexibility of repos here -\- name: Patch this host -shell: 'yum update -y' -args: -warn: false -when: patchme|bool -register: result -changed_when: "'No packages marked for update' not in result.stdout" -``` - -### Scenarios - -In our fictitious, large, globally dispersed environment (of four hosts), we have: - - * Two web servers - * Two database servers - * An application comprising one of each server type - - - -OK, so this number of machines isn't "enterprise-scale," but remove the counts and imagine the environment as multiple, tiered, geographically dispersed applications. We want to patch elements of the stack across server types, application stacks, geographies, or the whole estate. - -![Example patch groups][5] - -Using only changes to variables, can we achieve that flexibility? Sort of. Ansible's [default behavior][6] for hashes is to overwrite. In our example, the **patching_repos** variable for the **db1** and **web1** hosts are overwritten because of their later occurrence in our inventory. Hmm, a bit of a pickle. There are two ways to manage this: - - 1. Multiple inventory files - 2. [Change the variable behavior][7] - - - -I chose number one because it maintains clarity. Once you start merging variables, it's hard to find where a hash appears and how it's put together. Using the default behavior maintains clarity, and it's the method I'd encourage you to stick with for your own sanity. - -### Get on with it then - -Let's run the play, focusing only on the database servers. - -Did you notice the final step— **Patch this host** —says **skipping**? That's because we didn't set [the controlling variable][8] to do the patching. What we have done is set up the repository subscriptions to be ready. - -So let's run the play again, limiting it to the web servers and tell it to do the patching. I ran this example with verbose output so you can see the yum updates happening. - -Patching an application stack requires another inventory file, as mentioned above. Let's rerun the play. - -Patching hosts in the European geography is the same scenario as the application stack, so another inventory file is required. - -Now that all the repository subscriptions are configured, let's just patch the whole estate. Note the **app1** and **emea** groups don't need the inventory here––they were only being used to separate the repository definition and setup. Now, **yum update -y** patches everything. If you didn't want to capture those repositories, they could be configured as **enabled=0**. - -### Conclusion - -The flexibility comes from how we group our hosts. Because of default hash behavior, we need to think about overlaps—the easiest way, to my mind at least, is with separate inventories. - -With regard to repository setup, I'm sure you've already said to yourself, "Ah, but the cherry-picking isn't that simple!" There is additional overhead in this model to download patches, test that they work together, and bundle them with dependencies in a repository. With complementary tools, you could automate the process, and in a large-scale environment, you'd have to. - -Part of me is drawn to just applying full patch sets as a simpler and easier way to go; skip the cherry-picking part and apply a full set of patches to a "standard build." I've seen this approach applied to both Unix and Windows estates with enforced quarterly updates. - -I’d be interested in hearing your experiences of patching regimes, and the approach proposed here, in the comments below or [via Twitter][9]. - -Many companies still have massive data centres full of hardware. Here's how Ansible can help. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/patching-systems-ansible - -作者:[Mark Phillips][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/markp/users/markp -[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://opensource.com/sites/default/files/uploads/quick_update.gif (Animation of updating Linux) -[3]: https://opensource.com/sites/default/files/uploads/patch_process.png (Overview of the Ansible patch process) -[4]: https://github.com/phips/ansible-patching/blob/master/roles/patching/tasks/main.yml -[5]: https://opensource.com/sites/default/files/uploads/patch_groups.png (Example patch groups) -[6]: https://docs.ansible.com/ansible/2.3/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable -[7]: https://docs.ansible.com/ansible/2.3/intro_configuration.html#sts=hash_behaviour -[8]: https://github.com/phips/ansible-patching/blob/master/roles/patching/defaults/main.yml#L4 -[9]: https://twitter.com/thismarkp diff --git a/sources/tech/20190614 Learning by teaching, and speaking, in open source.md b/sources/tech/20190614 Learning by teaching, and speaking, in open source.md deleted file mode 100644 index b2bd11f7b4..0000000000 --- a/sources/tech/20190614 Learning by teaching, and speaking, in open source.md +++ /dev/null @@ -1,75 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Learning by teaching, and speaking, in open source) -[#]: via: (https://opensource.com/article/19/6/conference-proposal-tips) -[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeo) - -Learning by teaching, and speaking, in open source -====== -Want to speak at an open source conference? Here are a few tips to get -started. -![photo of microphone][1] - -_"Everything good, everything magical happens between the months of June and August."_ - -When Jenny Han wrote these words, I doubt she had the open source community in mind. Yet, for our group of dispersed nomads, the summer brings a wave of conferences that allow us to connect in person. - -From [OSCON][2] in Portland to [Drupal GovCon][3] in Bethesda, and [Open Source Summit North America][4] in San Diego, there’s no shortage of ways to match faces with Twitter avatars. After months of working on open source projects via Slack and Google Hangouts, the face time that these summer conferences offer is invaluable. - -The knowledge attendees gain at open source conferences serves as the spark for new contributions. And speaking from experience, the best way to gain value from these conferences is for you to _speak_ at them. - -But, does the thought of speaking give you chills? Hear me out before closing your browser. - -Last August, I arrived at the Vancouver Convention Centre to give a lightning talk and speak on a panel at [Open Source Summit North America 2018][5]. It’s no exaggeration to say that this conference—and applying to speak at it—transformed my career. Nine months later, I’ve: - - * Become a Community Moderator for Opensource.com - * Spoken at two additional open source conferences ([All Things Open][6] and [DrupalCon North America][7]) - * Made my first GitHub pull request - * Taken "Intro to Python" and written my first lines of code in [React][8] - * Taken the first steps towards writing a book proposal - - - -I don’t discount how much time, effort, and money are [involved in conference speaking][9]. Regardless, I can say with certainty that nothing else has grown my career so drastically. In the process, I met strangers who quickly became friends and unofficial mentors. Their feedback, advice, and connections have helped me grow in ways that I hadn’t envisioned this time last year. - -Had I not boarded that flight to Canada, I would not be where I am today. - -So, have I convinced you to take the first step? It’s easier than you think. If you want to [apply to speak at an open source conference][10] but are stuck on what to discuss, ask yourself this question: **What do I want to learn?** - -You don’t have to be an expert on the topics that you pitch. You don’t have to know everything about JavaScript, [ML][11], or Linux to [write conference proposals][12] on these topics. - -Here’s what you _do_ need: A willingness to do the work of teaching yourself these topics. And like any self-directed task, you’ll be most willing to do this work if you're invested in the subject. - -As summer conference season draws closer, soak up all the knowledge you can. Then, ask yourself what you want to learn more about, and apply to speak about those subjects at fall/winter open source events. - -After all, one of the most effective ways to learn is by [teaching a topic to someone else][13]. So, what will the open source community learn from you? - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/conference-proposal-tips - -作者:[Lauren Maffeo][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/lmaffeo -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/microphone_speak.png?itok=wW6elbl5 (photo of microphone) -[2]: https://conferences.oreilly.com/oscon/oscon-or -[3]: https://www.drupalgovcon.org -[4]: https://events.linuxfoundation.org/events/open-source-summit-north-america-2019/ -[5]: https://events.linuxfoundation.org/events/open-source-summit-north-america-2018/ -[6]: https://allthingsopen.org -[7]: https://lab.getapp.com/bias-in-ai-drupalcon-debrief/ -[8]: https://reactjs.org -[9]: https://twitter.com/venikunche/status/1130868572098572291 -[10]: https://opensource.com/article/19/1/public-speaking-resolutions -[11]: https://en.wikipedia.org/wiki/ML_(programming_language) -[12]: https://dev.to/aspittel/public-speaking-as-a-developer-2ihj -[13]: https://opensource.com/article/19/5/learn-python-teaching diff --git a/sources/tech/20190617 How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers.md b/sources/tech/20190617 How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers.md deleted file mode 100644 index 1a6f5988e9..0000000000 --- a/sources/tech/20190617 How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers.md +++ /dev/null @@ -1,173 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers) -[#]: via: (https://www.linuxtechi.com/vlan-tagged-nic-ethernet-card-centos-rhel-servers/) -[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) - -How to Use VLAN tagged NIC (Ethernet Card) on CentOS and RHEL Servers -====== - -There are some scenarios where we want to assign multiple IPs from different **VLAN** on the same Ethernet card (nic) on Linux servers ( **CentOS** / **RHEL** ). This can be done by enabling VLAN tagged interface. But for this to happen first we must make sure multiple VLANs are attached to port on switch or in other words we can say we should configure trunk port by adding multiple VLANs on switch. - - - -Let’s assume we have a Linux Server, there we have two Ethernet cards (enp0s3 & enp0s8), first NIC ( **enp0s3** ) will be used for data traffic and second NIC ( **enp0s8** ) will be used for control / management traffic. For Data traffic I will using multiple VLANs (or will assign multiple IPs from different VLANs on data traffic ethernet card). - -I am assuming the port from switch which is connected to my server data NIC is configured as trunk port by mapping the multiple VLANs to it. - -Following are the VLANs which is mapped to data traffic Ethernet Card (NIC): - - * VLAN ID (200), VLAN N/W = 172.168.10.0/24 - * VLAN ID (300), VLAN N/W = 172.168.20.0/24 - - - -To use VLAN tagged interface on CentOS 7 / RHEL 7 / CentOS 8 /RHEL 8 systems, [kernel module][1] **8021q** must be loaded. - -Use the following command to load the kernel module “8021q” - -``` -[root@linuxtechi ~]# lsmod | grep -i 8021q -[root@linuxtechi ~]# modprobe --first-time 8021q -[root@linuxtechi ~]# lsmod | grep -i 8021q -8021q 29022 0 -garp 14384 1 8021q -mrp 18542 1 8021q -[root@linuxtechi ~]# -``` - -Use below modinfo command to display information about kernel module “8021q” - -``` -[root@linuxtechi ~]# modinfo 8021q -filename: /lib/modules/3.10.0-327.el7.x86_64/kernel/net/8021q/8021q.ko -version: 1.8 -license: GPL -alias: rtnl-link-vlan -rhelversion: 7.2 -srcversion: 2E63BD725D9DC11C7DA6190 -depends: mrp,garp -intree: Y -vermagic: 3.10.0-327.el7.x86_64 SMP mod_unload modversions -signer: CentOS Linux kernel signing key -sig_key: 79:AD:88:6A:11:3C:A0:22:35:26:33:6C:0F:82:5B:8A:94:29:6A:B3 -sig_hashalgo: sha256 -[root@linuxtechi ~]# -``` - -Now tagged (or mapped) the VLANs 200 and 300 to NIC enp0s3 using the [ip command][2] - -``` -[root@linuxtechi ~]# ip link add link enp0s3 name enp0s3.200 type vlan id 200 -``` - -Bring up the interface using below ip command: - -``` -[root@linuxtechi ~]# ip link set dev enp0s3.200 up -``` - -Similarly mapped the VLAN 300 to NIC enp0s3 - -``` -[root@linuxtechi ~]# ip link add link enp0s3 name enp0s3.300 type vlan id 300 -[root@linuxtechi ~]# ip link set dev enp0s3.300 up -[root@linuxtechi ~]# -``` - -Now view the tagged interface status using ip command: - -[![tagged-interface-ip-command][3]][4] - -Now we can assign the IP address to tagged interface from their respective VLANs using beneath ip command, - -``` -[root@linuxtechi ~]# ip addr add 172.168.10.51/24 dev enp0s3.200 -[root@linuxtechi ~]# ip addr add 172.168.20.51/24 dev enp0s3.300 -``` - -Use below ip command to see whether IP is assigned to tagged interface or not. - -![ip-address-tagged-nic][5] - -All the above changes via ip commands will not be persistent across the reboot. These tagged interfaces will not be available after reboot and after network service restart - -So, to make tagged interfaces persistent across the reboot then use interface **ifcfg files** - -Edit interface (enp0s3) file “ **/etc/sysconfig/network-scripts/ifcfg-enp0s3** ” and add the following content, - -Note: Replace the interface name that suits to your env, - -``` -[root@linuxtechi ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 -TYPE=Ethernet -DEVICE=enp0s3 -BOOTPROTO=none -ONBOOT=yes -``` - -Save & exit the file - -Create tagged interface file for VLAN id 200 as “ **/etc/sysconfig/network-scripts/ifcfg-enp0s3.200** ” and add the following contents to it. - -``` -[root@linuxtechi ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.200 -DEVICE=enp0s3.200 -BOOTPROTO=none -ONBOOT=yes -IPADDR=172.168.10.51 -PREFIX=24 -NETWORK=172.168.10.0 -VLAN=yes -``` - -Save & exit the file - -Similarly create interface file for VLAN id 300 as “/etc/sysconfig/network-scripts/ifcfg-enp0s3.300” and add the following contents to it - -``` -[root@linuxtechi ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.300 -DEVICE=enp0s3.300 -BOOTPROTO=none -ONBOOT=yes -IPADDR=172.168.20.51 -PREFIX=24 -NETWORK=172.168.20.0 -VLAN=yes -``` - -Save and exit file and then restart network services using the beneath command, - -``` -[root@linuxtechi ~]# systemctl restart network -[root@linuxtechi ~]# -``` - -Now verify whether tagged interface are configured and up & running using the ip command, - -![tagged-interface-status-ip-command-linux-server][6] - -That’s all from this article, I hope you got an idea how to configure and enable VLAN tagged interface on CentOS 7 / 8 and RHEL 7 /8 Severs. Please do share your feedback and comments. - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/vlan-tagged-nic-ethernet-card-centos-rhel-servers/ - -作者:[Pradeep Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/pradeep/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/how-to-manage-kernel-modules-in-linux/ -[2]: https://www.linuxtechi.com/ip-command-examples-for-linux-users/ -[3]: https://www.linuxtechi.com/wp-content/uploads/2019/06/tagged-interface-ip-command-1024x444.jpg -[4]: https://www.linuxtechi.com/wp-content/uploads/2019/06/tagged-interface-ip-command.jpg -[5]: https://www.linuxtechi.com/wp-content/uploads/2019/06/ip-address-tagged-nic-1024x343.jpg -[6]: https://www.linuxtechi.com/wp-content/uploads/2019/06/tagged-interface-status-ip-command-linux-server-1024x656.jpg diff --git a/sources/tech/20190617 KIT Scenarist is a Powerful Tool for Creating Screenplays.md b/sources/tech/20190617 KIT Scenarist is a Powerful Tool for Creating Screenplays.md deleted file mode 100644 index 65f492420d..0000000000 --- a/sources/tech/20190617 KIT Scenarist is a Powerful Tool for Creating Screenplays.md +++ /dev/null @@ -1,101 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (KIT Scenarist is a Powerful Tool for Creating Screenplays) -[#]: via: (https://itsfoss.com/kit-scenarist/) -[#]: author: (John Paul https://itsfoss.com/author/john/) - -KIT Scenarist is a Powerful Tool for Creating Screenplays -====== - -Did you ever wish that there was an open source tool for all your screenplay writing needs? Well, you are in luck. Today, we will be looking at an application that will do just that. Today, we will be looking at KIT Scenarist. - -### KIT Scenarist: An Open Source tool for writing screenplays - -[KIT Scenarist][1] is a program designed to be your one-stop-shop to create the next great screenplay. KIT Scenarist’s tools are split up into four modules: Research, Cards, Script, and Statistics. When you load KIT Scenarist for the first time after installing it, you will be asked if you want to enable each of these modules. You can also disable any of the modules from the setting menu. - -![Scenarist][2] - -The Research module gives you a place to store your story ideas, as well as, ideas and information for both characters and locations. You can also add images for a character or location to give you inspiration. - -The Cards module shows you the scenes that you have written or sketched out like cards on a cord board. You can drag these scenes around on the board to rearrange them. You can also jump to a certain scene or mark a scene as done. - -The Script module is where the actual writing takes place. It has a widget that tells you approximately how long your screenplay will take to perform. Like a word processor, you can tell KIT Scenarist what parts of the script are the actions, character, dialogue, etc and it will format it correctly. - -![Scenarist Research module][3] - -The Statistics module gives you all kinds of reports and graphs about your screenplay. The scene report shows how long each act is and what characters are in it. The location report shows how much time is spent at each location and in which acts. The cast report shows how many scenes each character is in and how much dialogue they have. There is even a report that lists all of the dialogue for each character. - -[][4] - -Suggested read Tilix: Advanced Tiling Terminal Emulator for Power Users - -Like all well-designed apps, KIT Scenarist has both a light and dark theme. The dark theme is the default. - -![Scenarist Statistics module][5] - -KIT Scenarist stores your projects in `.kitsp` files. These files are essentially SQLite database files with a different extension. This means that if you ever run into issues with KIT Scenarist, you can retrieve your information with an SQLite viewer. - -This application also allows you to import scripts from a wide range of script writing applications. You can import the following file formats: Final Draft Screenplay (.fdx), Final Draft Template (.fdxt), Trelby Screenplay (.trelby), [Fountain Text][6] (.foundation), Celtx Project (.celtx), .odt, . doc and .docx. You can export your outline and script to .docx, .pdf, .fdx. or .Fountain. - -The desktop version of KIT Scenarist is free, but they also have a couple of [Pro options][7]. They have a cloud service to collaborate with others or sync your work to other devices. The cloud service costs $4.99 for a month or $52.90 for a year. They have other subscription lengths. KIT Scenarist is available in the iOS app store or the Google Play store, but cost money there. Finally, if you are an organization who wants to use KIT Scenarist but it is missing a feature you want, they will add it if you finance the work. - -![Scenarist Cards module][8] - -### How to Install Scenarist - -Currently, the only repo that Scenarist is available for downloading is the [Arch User Repository][9]. (Arch rulez :D) - -Otherwise, you have to [download][10] a package installer from the website. They have packages available for Linux (both .deb and .rpm), Windows, and macOS. As I stated above, there are also versions available for both Android and iOS, but they are not free. You can find the source code of KIT Scenarist on GitHub. - -[KIT Scenarist on GitHub][11] - -If KIT Scenarist won’t start on your Linux system, try installing the `libxcb-xinerama0` package. - -![Scenarist Script][12] - -### Final Thoughts on KIT Scenarist - -KIT Scenarist offers the full script writing experience. All your information is stored in one place, so you don’t need to look everywhere for your information. It does everything. Now, the creator just needs to add a feature to submit your script directly to the person who will make you the next famous playwright. - -[][13] - -Suggested read Bookworm: A Simple yet Magnificent eBook Reader for Linux - -If KIT Scenarist looks too overwhelming and you want to try something simpler, I would recommend trying [Trelby][14]. If you are into writing, you may read my list of [useful open source tools for writers][15]. - -Have you every used KIT Scenarist? What is your favorite open source screenwriting tool? Please let us know in the comments below. - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][16]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/kit-scenarist/ - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/john/ -[b]: https://github.com/lujun9972 -[1]: https://kitscenarist.ru/en/index.html -[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/scenarist-about.png?fit=800%2C469&ssl=1 -[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/scenarist-research.png?fit=800%2C371&ssl=1 -[4]: https://itsfoss.com/tilix-terminal-emulator/ -[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/06/scenarist-statistics.png?fit=800%2C467&ssl=1 -[6]: https://www.fountain.io/ -[7]: https://kitscenarist.ru/en/pricing.html -[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/06/scenarist-cards.png?fit=800%2C470&ssl=1 -[9]: https://aur.archlinux.org/packages/scenarist -[10]: https://kitscenarist.ru/en/download.html -[11]: https://github.com/dimkanovikov/kitscenarist -[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/06/scenarist-script.png?fit=800%2C468&ssl=1 -[13]: https://itsfoss.com/bookworm-ebook-reader-linux/ -[14]: https://www.trelby.org/ -[15]: https://itsfoss.com/open-source-tools-writers/ -[16]: http://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20190618 Cylon - The Arch Linux Maintenance Program For Newbies.md b/sources/tech/20190618 Cylon - The Arch Linux Maintenance Program For Newbies.md deleted file mode 100644 index 6843910f91..0000000000 --- a/sources/tech/20190618 Cylon - The Arch Linux Maintenance Program For Newbies.md +++ /dev/null @@ -1,257 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Cylon – The Arch Linux Maintenance Program For Newbies) -[#]: via: (https://www.ostechnix.com/cylon-arch-linux-maintenance-program/) -[#]: author: (sk https://www.ostechnix.com/author/sk/) - -Cylon – The Arch Linux Maintenance Program For Newbies -====== - -![Cylon is an Arch Linux Maintenance Program][1] - -Recently switched to Arch Linux as your daily driver? Great! I’ve got a good news for you. Meet **Cylon** , a maintenance program for Arch Linux and derivatives. It is a menu-driven **Bash** script which provides updates, maintenance, backups and system checks for Arch Linux and its derivatives such as Manjaro Linux etc. Cylon is mainly a CLI program, and also has a basic dialog GUI. In this guide, we will see how to install and use Cylon in Arch Linux. - -### Cylon – The Arch Linux Maintenance Program - -##### Install Cylon - -Cylon is available in the [**AUR**][2]. You can install it using any AUR helpers, for example [**Yay**][3]. - -``` -$ yay -S cylon -``` - -##### Usage - -Please note that Cylon _**will not install all tools**_ by default. Some functions require various dependencies packages to be installed. There are three dependencies and the rest are optional dependencies. The optional dependencies are left to user discretion. When you perform a function, it will display the missing packages if there are any. All missing packages will be shown as **n/a** (not available) in menus. You need to install the missing packages by yourself before using such functions. - -To launch Cylon, type _**cylon**_ in the Terminal: - -``` -$ cylon -``` - -Sample output from my Arch linux system: - -![][4] - -Default interface of Cylon, the Arch Linux maintenance program - -You can also launch Cylon from the Menu. It usually found under **Applications > System Tools**. - -As you see in the above screenshot, there are **14** menu entries in Cylon main menu to perform different functions. To go to each entry, type the respective number. Also, as you see in the screenshot, there is **n/a** besides the 2 and 3 menu entries which means **auracle** and [**Trizen**][5] are not installed. You need to install them first before performing those functions. - -Let us see what each menu entry does. - -**1\. Pacman** - -Under [**Pacman**][6] section, you can do various package management operations such as install, update, upgrade, verify, remove packages, display package information, view Arch Linux news feed and many. Just type a number to perform the respective action. - -![][7] - -You can go back to main menu by typing the number **21**. - -**2. auracle -** - -The **auracle** is an AUR helper program that can be used to perform various AUR actions such as install, update, download, search, remove AUR packages in your Arch linux box. - -**3\. trizen** - -It is same as above section. - -**4\. System Update** - -As the name says, this section is dedicated to perform Arch Linux update. Here you can update both the official and AUR packages. Cylon gives you the following four options in this section. - - 1. Update Arch Main Repos only, - 2. Update AUR only, - 3. Update All repos, - 4. No Update and exit. - - - -![][8] - -**5\. System Maintenance** - -In this section, you can do the following maintenance tasks. - - 1. Failed Systemd Services and status, - 2. Check Journalctl log for Errors, - 3. Check Journalctl for fstrim SSD trim, - 4. Analyze system boot-up performance, - 5. Check for Broken Symlinks, - 6. Find files where no group or User corresponds to file’s numeric ID, - 7. lostfiles, - 8. Diskspace usage, - 9. Find 200 of the biggest files, - 10. Find inodes usage, - 11. Old configuration files scan, - 12. Print sensors information, - 13. Clean journal files, - 14. Delete core dumps /var/lib/systemd/coredump/, - 15. Delete files, - 16. bleachbit n/a, - 17. rmlint n/a, - 18. List All Open Files, - 19. DMI table decoder, - 20. Return. - - - -The non-installed packages will be shown with letters n/a besides that applications. You need to install them first before choosing that particular action. - -** **Recommended Download** – [**Free Video: “Penetration Testing Methodologies Training Course (a $99 value!) FREE”**][9] - -**6\. System backup** - -This section provides backup utilities such as **rsync** to backup your Arch Linux system. Also, there is a custom backup options which allows you to manually backup files/folders to a user-specified location. - -![][10] - -**7\. System Security** - -Cylon provides various security tools including the following: - - 1. ccrypt – Encrypt/decrypt files, - 2. clamav – Antivirus, - 3. rkhunter – RootKit hunter scan, - 4. lynis – System audit tool, - 5. Password generator, - 6. List the password aging info of a user, - 7. Audit SUID/SGID Files. - - - -Remember you need to install them yourself in order to use them. Cylon will not help you to install the missing packages. - -**8\. Network Maintenance** - -This section is for network related functions. Here, you can: - - 1. See wifi link quality continuously on screen, - 2. Use speedtest-cli -testing internet bandwidth, - 3. Check if website up with netcat and ping, - 4. Display all interfaces which are currently available, - 5. Display kernal routing table, - 6. Check the status of UFW, Uncomplicated Firewall, - 7. Network Time Synchronization status check, - 8. traceroute print route packets trace to network host, - 9. tracepath traces path to a network host, - 10. View all open ports - - - -**9\. xterm terminal** - -Here, you can launch xterm terminal at output folder path in new window. - -**10\. View/Edit config file** - -View and edit the configuration files if necessary. - -**11\. System information** - -This is most useful feature of Cylon utlity. This section provides your Arch Linux system’s information such as, - - * Uptime, - * Kernel details, - * OS architecture, - * Username, - * Default Shell, - * Screen resolution, - * CPU, - * RAM (used/total), - * Editor variable, - * Location of pacman cache folder, - * Hold packages, - * Number of orphan packages, - * Total number of installed packages, - * Number of all explicitly installed packages, - * All foreign installed packages, - * All foreign explicitly installed packages, - * All packages installed as dependencies, - * Top 5 largest packages, - * 5 newest updated packages, - * Packages Installed size by repositories. - - - -![][11] - -**12\. Cylon information** - -It will display the information about Cylon program. It also performs the dependencies installation check and display the list of installed non-installed dependencies. - -![][12] - -**13\. Weather** - -It displays the 3 day weather forecast by **wttr.in** utility. - -* * * - -**Related Read:** - - * **[How To Check Weather Details From Command Line In Linux][13]** - - - -* * * - -**14\. Exit** - -Type **14** to exit Cylon. - -For more details, type **cylon -h** in the Terminal to print cylon information. - -* * * - -**Recommended read:** - - * [**Cylon-deb : The Debian Linux Maintenance Program**][14] - - - -* * * - -Cylon script offers a lot of tools and features to maintain your Arch Linux system. If you’re new to Arch Linux, give it a try and see if it helps. - -**Resource:** - - * [**Cylon GitHub page**][15] - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/cylon-arch-linux-maintenance-program/ - -作者:[sk][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.ostechnix.com/author/sk/ -[b]: https://github.com/lujun9972 -[1]: https://www.ostechnix.com/wp-content/uploads/2017/06/Cylon-The-Arch-Linux-Maintenance-Program-720x340.png -[2]: https://aur.archlinux.org/packages/cylon/ -[3]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ -[4]: http://www.ostechnix.com/wp-content/uploads/2017/06/cylon-interface.png -[5]: https://www.ostechnix.com/trizen-lightweight-aur-package-manager-arch-based-systems/ -[6]: https://www.ostechnix.com/getting-started-pacman/ -[7]: http://www.ostechnix.com/wp-content/uploads/2017/06/Cylon-pacman.png -[8]: http://www.ostechnix.com/wp-content/uploads/2017/06/Cylon-system-update.png -[9]: https://ostechnix.tradepub.com/free/w_cybf03/prgm.cgi -[10]: http://www.ostechnix.com/wp-content/uploads/2017/06/Cylon-system-backup.png -[11]: http://www.ostechnix.com/wp-content/uploads/2017/06/Cylon-system-information.png -[12]: http://www.ostechnix.com/wp-content/uploads/2017/06/Cylon-information.png -[13]: https://www.ostechnix.com/check-weather-details-command-line-linux/ -[14]: https://www.ostechnix.com/cylon-deb-debian-linux-maintenance-program/ -[15]: https://github.com/gavinlyonsrepo/cylon diff --git a/sources/tech/20190618 How to use MapTool to build an interactive dungeon RPG.md b/sources/tech/20190618 How to use MapTool to build an interactive dungeon RPG.md deleted file mode 100644 index 94aaf47de2..0000000000 --- a/sources/tech/20190618 How to use MapTool to build an interactive dungeon RPG.md +++ /dev/null @@ -1,231 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to use MapTool to build an interactive dungeon RPG) -[#]: via: (https://opensource.com/article/19/6/how-use-maptools) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -How to use MapTool to build an interactive dungeon RPG -====== -By using MapTool, most of a game master's work is done well before a -role-playing game begins. -![][1] - -In my previous article on MapTool, I explained how to download, install, and configure your own private, [open source virtual tabletop][2] so you and your friends can play a role-playing game (RPG) together. [MapTool][3] is a complex application with lots of features, and this article demonstrates how a game master (GM) can make the most of it. - -### Update JavaFX - -MapTool requires JavaFX, but Java maintainers recently stopped bundling it in Java downloads. This means that, even if you have Java installed, you might not have JavaFX installed. - -Some Linux distributions have a JavaFX package available, so if you try to run MapTool and get an error about JavaFX, download the latest self-contained version: - - * For [Ubuntu and other Debian-based systems][4] - * For [Fedora and Red Hat-based systems][5] - - - -### Build a campaign - -The top-level file in MapTool is a campaign (.cmpgn) file. A campaign can contain all of the maps required by the game you're running. As your players progress through the campaign, everyone changes to the appropriate map and plays. - -For that to go smoothly, you must do a little prep work. - -First, you need the digital equivalents of miniatures: _tokens_ in MapTool terminology. Tokens are available from various sites, but the most prolific is [immortalnights.com/tokensite][6]. If you're still just trying out virtual tabletops and aren't ready to invest in digital art yet, you can get a stunning collection of starter tokens from immortalnights.com for $0. - -You can add starter content to MapTool quickly and easily using its built-in resource importer. Go to the **File** menu and select **Add Resource to Library**. - -In the **Add Resource to Library** dialogue box, select the RPTools tab, located at the bottom-left. This lists all the free art packs available from the RPTools server, tokens and maps alike. Click to download and import. - -![Add Resource to Library dialogue][7] - -You can import assets you already have on your computer by selecting files from the file system, using the same dialogue box. - -MapTool resources appear in the Library panel. If your MapTool window has no Library panel, select **Library** in the **Window** menu to add one. - -### Gather your maps - -The next step in preparing for your game is to gather maps. Depending on what you're playing, that might mean you need to draw your maps, purchase a map pack, or just open a map bundled with a game module. If all you need is a generic dungeon, you can also download free maps from within MapTool's **Add Resource to Library**. - -If you have a set of maps you intend to use often, you can import them as resources. If you are building a campaign you intend to use just once, you can quickly add any PNG or JPEG file as a **New Map** in the **Map** menu. - -![Creating a new map][8] - -Set the **Background** to a texture that roughly matches your map or to a neutral color. - -Set the **Map** to your map graphics file. - -Give your new map a unique **Name**. The map name is visible to your players, so keep it free of spoilers. - -To switch between maps, click the **Select Map** button in the top-right corner of the MapTool window, and choose the map name in the drop-down menu that appears. - -![Select a map][9] - -Before you let your players loose on your map, you still have some important prep work to do. - -### Adjust the grid size - -Since most RPGs govern how far players can move during their turn, especially during combat, game maps are designed to a specific scale. The most common scale is one map square for every five feet. Most maps you download already have a grid drawn on them; if you're designing a map, you should draw on graph paper to keep your scale consistent. Whether your map graphic has a grid or not, MapTool doesn't know about it, but you can adjust the digital grid overlay so that your player tokens are constrained into squares along the grid. - -MapTool doesn't show the grid by default, so go to the **Map** menu and select **Adjust grid**. This displays MapTool's grid lines, and your goal is to make MapTool's grid line up with the grid drawn onto your map graphic. If your map graphic doesn't have a grid, it may indicate its scale; a common scale is one inch per five feet, and you can usually assume 72 pixels is one inch (on a 72 DPI screen). While adjusting the grid, you can change the color of the grid lines for your own reference. Set the cell size in pixels. Click and drag to align MapTool's grid to your map's grid. - -![Adjusting the grid][10] - -If your map has no grid and you want the grid to remain visible after you adjust it, go to the **View** menu and select **Show Grid**. - -### Add players and NPCs - -To add a player character (PC), non-player character (NPC), or monster to your map, find an appropriate token in your **Library** panel, then drag and drop one onto your map. In the **New Token** dialogue box that appears, give the token a name and set it as an NPC or a PC, then click the OK button. - -![Adding a player character to the map][11] - -Once a token is on the map, try moving it to see how its movements are constrained to the grid you've designated. Make sure **Interaction Tools** , located in the toolbar just under the **File** menu, is selected. - -![A token moving within the grid][12] - -Each token added to a map has its own set of properties, including the direction it's facing, a light source, player ownership, conditions (such as incapacitated, prone, dead, and so on), and even class attributes. You can set as many or as few of these as you want, but at the very least you should right-click on each token and assign it ownership. Your players must be logged into your MapTool server for tokens to be assigned to them, but you can assign yourself NPCs and monsters in advance. - -The right-click menu provides access to all important token-related functions, including setting which direction it's facing, setting a health bar and health value, a copy and paste function (enabling you and your players to move tokens from map to map), and much more. - -![The token menu unlocks great, arcane power][13] - -### Activate fog-of-war effects - -If you're using maps exclusively to coordinate combat, you may not need a fog-of-war effect. But if you're using maps to help your players visualize a dungeon they're exploring, you probably don't want them to see the whole map before they've made significant moves, like opening locked doors or braving a decaying bridge over a pit of hot lava. - -The fog-of-war effect is an invaluable tool for the GM, and it's essential to set it up early so that your players don't accidentally get a sneak peek at all the horrors your dungeon holds for them. - -To activate fog-of-war on a map, go to the **Map** and select **Fog-of-War**. This blackens the entire screen for your players, so your next step is to reveal some portion of the map so that your players aren't faced with total darkness when they switch to the map. Fog-of-war is a subtractive process; it starts 100% dark, and as the players progress, you reveal new portions of the map using fog-of-war drawing tools available in the **FOG** toolbar, just under the **View** menu. - -You can reveal sections of the map in rectangle blocks, ovals, polygons, diamonds, and freehand shapes. Once you've selected the shape, click and release on the map, drag to define an area to reveal, and then click again. - -![Fog-of-war as experienced by a playe][14] - -If you're accidentally overzealous with what you reveal, you have two ways to reverse what you've done: You can manually draw new fog, or you can reset all fog. The quicker method is to reset all fog with **Ctrl+Shift+A**. The more elegant solution is to press **Shift** , then click and release, draw an area of fog, and then click again. Instead of exposing an area of the map, it restores fog. - -### Add lighting effects - -Fog-of-war mimics the natural phenomenon of not being able to see areas of the world other than where you are, but lighting effects mimic the visibility player characters might experience in light and dark. For games like Pathfinder and Dungeons and Dragons 5e, visibility is governed by light sources matched against light conditions. - -First, activate lighting by clicking on the **Map** menu, selecting **Vision** , and then choosing either Daylight or Night. Now lighting effects are active, but none of your players have light sources, so they have no visibility. - -To assign light sources to players, right-click on the appropriate token and choose **Light Source**. Definitions exist for the D20 system (candle, lantern, torch, and so on) and in generic measurements. - -With lighting effects active, players can expose portions of fog-of-war as their light sources get closer to unexposed fog. That's a great effect, but it doesn't make much sense when players can illuminate the next room right through a solid wall. To prevent that, you have to help MapTool differentiate between empty space and solid objects. - -#### Define solid objects - -Defining walls and other solid objects through which light should not pass is easier than it sounds. MapTool's **Vision Blocking Layer** (VBL) tools are basic and built to minimize prep time. There are several basic shapes available, including a basic rectangle and an oval. Draw these shapes over all the solid walls, doors, pillars, and other obstructions, and you have instant rudimentary physics. - -![Setting up obstructions][15] - -Now your players can move around the map with light sources without seeing what lurks in the shadows of a nearby pillar or behind an innocent-looking door… until it's too late! - -![Lighting effects][16] - -### Track initiative - -Eventually, your players are going to stumble on something that wants to kill them, and that means combat. In most RPG systems, combat is played in rounds, with the order of turns decided by an _initiative_ roll. During combat, each player (in order of their initiative roll, from greatest to lowest) tries to defeat their foe, ideally dealing enough damage until their foe is left with no health points (HP). It's usually the most paperwork a GM has to do during a game because it involves tracking whose turn it is, how much damage each monster has taken, what amount of damage each monster's attack deals, what special abilities each monster has, and more. Luckily, MapTool can help with that—and better yet, you can extend it with a custom macro to do even more. - -MapTool's basic initiative panel helps you keep track of whose turn it is and how many rounds have transpired so far. To view the initiative panel, go to the **Window** menu and select **Initiative**. - -To add characters to the initiative order, right-click a token and select **Add To Initiative**. As you add each, the token and its label appear in the initiative panel in the order that you add them. If you make a mistake or someone holds their action and changes the initiative order, click and drag the tokens in the initiative panel to reorder them. - -During combat, click the **Next** button in the top-left of the initiative panel to progress to the next character. As long as you use the **Next** button, the **Round** counter increments, helping you track how many rounds the combat has lasted (which is helpful when you have spells or effects that last only for a specific number of rounds). - -Tracking combat order is helpful, but it's even better to track health points. Your players should be tracking their own health, but since everyone's staring at the same screen, it doesn't hurt to track it publicly in one place. An HP property and a graphical health bar (which you can activate) are assigned to each token, so that's all the infrastructure you need to track HP in MapTool, but doing it manually takes a lot of clicking around. Since MapTool can be extended with macros, it's trivial to bring all these components together for a smooth GM experience. - -The first step is to activate graphical health bars for your tokens. To do this, right-click on each token and select **Edit**. In the **Edit Token** dialog box, click on the **State** tab and deselect the radio button next to **Hide**. - -![Don't hide the health bar][17] - -Do this for each token whose health you want to expose. - -#### Write a macro - -Macros have access to all token properties, so each token's HP can be tracked by reading and writing whatever value exists in the token's HP property. The graphical health bar, however, bases its state on a percentage, so for the health bars to be meaningful, your tokens also must have some value that represents 100% of its HP. - -Go to the **Edit** menu and select **Campaign Properties** to globally add properties to tokens. In the **Campaign Properties** window, select the **Token Properties** tab and then click the **Basic** category in the left column. Under ***@HP** , add ***@MaxHP** and click the **Update** button. Click the **OK** button to close the window. - -![Adding a property to all tokens][18] - -Now right-click a token and select **Edit**. In the **Edit Token** window, select the **State** tab and enter a value for the token's maximum HP (from the player's character sheet). - -To create a new macro, reveal the **Campaign** panel in the **Window** menu. - -In the **Campaign** panel, right-click and select **Add New Macro**. A button labeled **New** appears in the panel. Right-click on the **New** button and select **Edit**. - -Enter this code in the macro editor window: - - -``` -[h:status = input( -"hpAmount|0|Points", -"hpType|Damage,Healing|Damage or heal?|RADIO|SELECT=0")] -[h:abort(status)] - -[if(hpType == 0),CODE: { -[h:HP = HP - hpAmount] -[h:bar.Health = HP / MaxHP] -[r:token.name] takes [r:hpAmount] damage.}; -{ -[h:diff = MaxHP - HP] -[h:HP = min(HP+hpAmount, MaxHP)] -[h:bar.Health = HP / MaxHP] -[r:token.name] gains [r:min(diff,hpAmount)] HP. };] -``` - -You can find full documentation of functions available in MapTool macros and their syntax from the [RPTools wiki][19]. - -In the **Details** tab, enable **Include Label** and **Apply to Selected Tokens** , and leave all other values at their default. Give your macro a better name than **New** , such as **HPTracker** , then click **Apply** and **OK**. - -![Macro editing][20] - -Your campaign now has a new ability! - -Select a token and click your **HPTracker** button. Enter the number of points to deduct from the token, click **OK** , and watch the health bar change to reflect the token's new state. - -It may seem like a simple change, but in the heat of battle, this is a GM's greatest weapon. - -### During the game - -There's obviously a lot you can do with MapTool, but with a little prep work, most of your work is done well before you start playing. You can even create a template campaign by creating an empty campaign with only the macros and settings you want, so all you have to do is import maps and stat out tokens. - -During the game, your workflow is mostly about revealing areas from fog-of-war and managing combat. The players can manage their own tokens, and your prep work takes care of everything else. - -MapTool makes digital gaming easy and fun, and most importantly, it keeps it open source and self-contained. Level-up today by learning MapTool and using it for your games. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/how-use-maptools - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/dice-keys_0.jpg?itok=PGEs3ZXa -[2]: https://opensource.com/article/18/5/maptool -[3]: https://github.com/RPTools/maptool -[4]: https://github.com/RPTools/maptool/releases -[5]: https://klaatu.fedorapeople.org/RPTools/maptool/ -[6]: https://immortalnights.com/tokensite/ -[7]: https://opensource.com/sites/default/files/uploads/maptool-resources.png (Add Resource to Library dialogue) -[8]: https://opensource.com/sites/default/files/uploads/map-properties.png (Creating a new map) -[9]: https://opensource.com/sites/default/files/uploads/map-select.jpg (Select a map) -[10]: https://opensource.com/sites/default/files/uploads/grid-adjust.jpg (Adjusting the grid) -[11]: https://opensource.com/sites/default/files/uploads/token-new.png (Adding a player character to the map) -[12]: https://opensource.com/sites/default/files/uploads/token-move.jpg (A token moving within the grid) -[13]: https://opensource.com/sites/default/files/uploads/token-menu.jpg (The token menu unlocks great, arcane power) -[14]: https://opensource.com/sites/default/files/uploads/fog-of-war.jpg (Fog-of-war as experienced by a playe) -[15]: https://opensource.com/sites/default/files/uploads/vbl.jpg (Setting up obstructions) -[16]: https://opensource.com/sites/default/files/uploads/map-light.jpg (Lighting effects) -[17]: https://opensource.com/sites/default/files/uploads/token-edit.jpg (Don't hide the health bar) -[18]: https://opensource.com/sites/default/files/uploads/campaign-properties.jpg (Adding a property to all tokens) -[19]: https://lmwcs.com/rptools/wiki/Main_Page -[20]: https://opensource.com/sites/default/files/uploads/macro-detail.jpg (Macro editing) diff --git a/sources/tech/20190619 11 Free and Open Source Video Editing Software.md b/sources/tech/20190619 11 Free and Open Source Video Editing Software.md deleted file mode 100644 index 57ad8a5358..0000000000 --- a/sources/tech/20190619 11 Free and Open Source Video Editing Software.md +++ /dev/null @@ -1,327 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (11 Free and Open Source Video Editing Software) -[#]: via: (https://itsfoss.com/open-source-video-editors/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -11 Free and Open Source Video Editing Software -====== - -We’ve already covered the [top video editors for Linux][1]. That list contained some non-open source software as well. This made us write this article to feature only open source video editors. We’ve also mentioned what platforms are supported by these software so that this list is helpful even if you are not using Linux. - -### Top Free and Open Source Video Editors - -![Best Open Source Video Editors][2] - -Just for your information, this list is not a ranking and the editors listed here are not in any specific order. I have not mentioned the installation procedure but you can find that information on the website of each project. - -#### 1\. Kdenlive - -![][3] - -**Key Features** : - - * Multi-track Video Editing - * All kinds of audio/video format supported with the help of FFmpeg libraries - * 2D Title maker - * Customizable Interface and shortcuts - * Proxy editing to make things faster - * Automatic backup - * Timeline preview - * Keyframeable effects - * Audiometer, Histogram, Waveform, etc. - - - -**Platforms available on:** Linux, macOS and Windows. - -Kdenlive is an open source video editor (and free) available for Windows, Mac OSX, and Linux distros. - -If you are on a Mac, you will have to manually compile and install it. However, if you are on Windows, you can download the EXE file and should have no issues installing it. - -[Kdenlive][4] - -#### 2\. LiVES - -![][5] - -**Key Features:** - - * Frame and sample accurate editing - * Edit video in real-time - * Can be controlled using MIDI, keyboard, Joystic - * Multi-track support - * VJ keyboard control during playback - * Plugins supported - * Compatible with various effects frameworks: projectM, LADSPA audio, and so on. - - - -**Platforms available on:** Linux and macOS. Support for Windows will be added soon. - -LiVES is an interesting open source video editor. You can find the code on [GitHub][6]. It is currently available for **Linux and macOS Leopard**. It will soon be available for Windows (hopefully by the end of 2019). - -[LiVES][7] - -#### 3\. OpenShot - -![][8] - -**Key Features:** - - * Almost all video/audio formats supported - * Key frame animation framework - * Multi-track support - * Desktop integration (drag and drop support) - * Video transition with real-time previews - * 3D animated titles and effects - * Advanced timeline with drag/drop support, panning, scrolling, zooming, and snapping. - - - -**Platforms available on:** Linux, macOS and Windows. - -OpenShot is a quite popular video editor and it is open source as well. Unlike others, OpenShot offers a DMG installer for Mac OSX. So, you don’t have to compile and install it manually. - -If you are a fan of open source solutions and you own a Mac, OpenShot seems like a very good option. - -[OpenShot][9] - -#### 4\. VidCutter - -![][10] - -**Key Features:** - - * Keyframes viewer - * Cut, Split, and add different clips - * Major audio/video formats supported - - - -[][11] - -Suggested read Install Windows Like Desktop Widgets In Ubuntu Linux With Screenlets - -**Platforms available on:** Linux, macOS and Windows. - -VidCutter is an open source video editor for basic tasks. It does not offer a plethora of features – but it works for all the common tasks like clipping or cutting. It’s under active development as well. - -For Linux, it is available on Flathub as well. And, for Windows and Mac OS, you do get EXE and DMG file packages in the latest releases. - -[VidCutter][12] - -#### 5\. Shotcut - -![][13] - -**Key Features:** - - * Supports almost all major audio/video formats with the help of FFmpeg libraries. - * Multiple dockable/undockable panels - * Intuitive UI - * JACK transport sync - * Stereo, mono, and 5.1 surround support - * Waveform, Histogram, etc. - * Easy to use with dual monitors - * Portable version available - - - -**Platforms available on:** Linux, macOS and Windows. - -Shotcut is yet another popular open source video editor available across multiple platforms. It features a nice interface to work on. - -When considering the features, it offers almost everything that you would ever need (from color correction to adding transitions). Also, it provides a portable version for Windows – which is an impressive thing. - -[Shotcut][14] - -#### 6\. Flowblade - -![][15] - -**Key Features:** - - * Advanced timeline control - * Multi-track editing - * [G’mic][16] tool - * All major audio/video formats supported with the help of FFMpeg libraries - - - -**Platforms available on:** Linux - -Flowblade is an intuitive open source video editor available only for Linux. Yes, it is a bummer that we do not have cross-platform support for this. - -However, if you are using a Linux distro, you can either download the .deb file and get it installed or use the source code on GitHub. - -[Flowblade][17] - -#### 7\. Avidemux - -![][18] - -**Key Features:** - - * Trim - * Cut - * Filter support - * Major video format supported - - - -**Platforms available on:** Linux, BSD, macOS and Windows. - -If you are looking for a basic cross-platform open source video editor – this will be one of our recommendations. You just get the ability to cut, save, add a filter, and perform some other basic editing tasks. Their official [SourceForge page][19] might look like it has been abandoned, but it is in active development. - -[Avidemux][19] - -#### 8\. Pitivi - -![][20] - -**Key Features:** - - * All major video formats supported using [GStreamer Multimedia Framework][21] - * Advanced timeline independent of frame rate - * Animated effects and transitions - * Audio waveforms - * Real-time trimming previews - - - -**Platforms available on:** Linux - -Yet another open source video editor that is available only for Linux. The UI is user-friendly and the features offered will help you perform some advanced edits as well. - -You can install it using Flatpak or look for the source code on their official website. It should be available in the repositories of most distributions as well. - -[Pitivi][22] - -#### 9\. Blender - -![][23] - -**Key Features:** - - * VFX - * Modeling tools - * Animation and Rigging tools - * Draw in 2D or 3D - - - -[][24] - -Suggested read 4 Best Modern Open Source Text Editors For Coding in Linux - -**Platforms available on:** Linux, macOS and Windows. - -Blender is an advanced 3D creation suite. And, it is surprising that you get all those powerful abilities for free (and while being open source). - -Of course, Blender is not a solution for every user – however, it is definitely one of the best open source tool available for Windows, macOS, and Linux. You can also find it on [Steam][25] to install it. - -[Blender][26] - -#### 10\. Cinelerra - -![][27] - -**Key Features:** - - * Advanced timeline - * Motion tracking support - * Video stabilization - * Audio mastering - * Color correction - - - -**Platforms available on:** Linux - -Cinelerra is a quite popular open source video editor. However, it has several branches to it (in other words – different versions). I am not sure if that is a good thing – but you get different features (and ability) on each of them. - -Cinelerra GG, CV, CVE, and HV are those variants catering to users with different preferences. Personally, I would recommend to check out [Cinelerra GG][28]. - -[Cinelerra][29] - -#### 11\. NATRON - -![][30] - -**Key Features:** - - * VFX - * Powerful Tracker - * Keying tools for production needs - * Shadertoy and G’mic tools - * OpenFX plugin support - - - -**Platforms available on** : Linux, macOS and Windows. - -If you are into VFX and motion graphics, NATRON is a good alternative to Blender. Of course, in order to compare them for your usage, you will have to give it a try yourself. - -You do have the installer available for Windows and the dmg package for Mac. So, it is quite easy to get it installed. You can always head to its [GitHub page][31] for more information. - -[Natron][32] - -**Wrapping Up** - -So, now that you know about some of the most popular open source video editors available out there – what do you think about them? - -Are they good enough for professional requirements? Or, did we miss any of your favorite open source video editor that deserved the mention? - -I am not an expert video editor and have only experience with simple editing tasks to create YouTube videos. If you are an experienced and professional video editor, I would like to hear your opinion on how good are these open source video editors for the experts. - -Let us know your thoughts in the comments below. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/open-source-video-editors/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/best-video-editing-software-linux/ -[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/06/best-open-source-video-editors-800x450.png?resize=800%2C450&ssl=1 -[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2016/06/kdenlive-free-video-editor-on-ubuntu.jpg?ssl=1 -[4]: https://kdenlive.org/en/ -[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/06/lives-video-editor.jpg?fit=800%2C600&ssl=1 -[6]: https://github.com/salsaman/LiVES -[7]: http://lives-video.com/ -[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2016/06/openshot-free-video-editor-on-ubuntu.jpg?ssl=1 -[9]: https://www.openshot.org/ -[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/06/vidcutter.jpg?fit=800%2C585&ssl=1 -[11]: https://itsfoss.com/install-windows-desktop-widgets-linux/ -[12]: https://github.com/ozmartian/vidcutter -[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2016/06/shotcut-video-editor-linux.jpg?resize=800%2C503&ssl=1 -[14]: https://shotcut.org/ -[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2016/06/flowblade-movie-editor-on-ubuntu.jpg?ssl=1 -[16]: https://gmic.eu/ -[17]: https://jliljebl.github.io/flowblade/index.html -[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/avidemux.jpg?resize=800%2C697&ssl=1 -[19]: http://avidemux.sourceforge.net/ -[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/pitvi.jpg?resize=800%2C464&ssl=1 -[21]: https://en.wikipedia.org/wiki/GStreamer -[22]: http://www.pitivi.org/ -[23]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2016/06/blender-running-on-ubuntu-16.04.jpg?ssl=1 -[24]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ -[25]: https://store.steampowered.com/app/365670/Blender/ -[26]: https://www.blender.org/ -[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2016/06/cinelerra-screenshot.jpeg?ssl=1 -[28]: https://www.cinelerra-gg.org/ -[29]: http://cinelerra.org/ -[30]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/natron.jpg?fit=800%2C481&ssl=1 -[31]: https://github.com/NatronGitHub/Natron -[32]: https://natrongithub.github.io/ diff --git a/sources/tech/20190620 How to SSH into a running container.md b/sources/tech/20190620 How to SSH into a running container.md deleted file mode 100644 index f0b4cdafc2..0000000000 --- a/sources/tech/20190620 How to SSH into a running container.md +++ /dev/null @@ -1,185 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to SSH into a running container) -[#]: via: (https://opensource.com/article/19/6/how-ssh-running-container) -[#]: author: (Seth Kenlon https://opensource.com/users/seth/users/bcotton) - -How to SSH into a running container -====== -SSH is probably not the best way to run commands in a container; try -this instead. -![cubes coming together to create a larger cube][1] - -Containers have shifted the way we think about virtualization. You may remember the days (or you may still be living them) when a virtual machine was the full stack, from virtualized BIOS, operating system, and kernel up to each virtualized network interface controller (NIC). You logged into the virtual box just as you would your own workstation. It was a very direct and simple analogy. - -And then containers came along, [starting with LXC][2] and culminating in the Open Container Initiative ([OCI][3]), and that's when things got complicated. - -### Idempotency - -In the world of containers, the "virtual machine" is only mostly virtual. Everything that doesn't need to be virtualized is borrowed from the host machine. Furthermore, the container itself is usually meant to be ephemeral and idempotent, so it stores no persistent data, and its state is defined by configuration files on the host machine. - -If you're used to the old ways of virtual machines, then you naturally expect to log into a virtual machine in order to interact with it. But containers are ephemeral, so anything you do in a container is forgotten, by design, should the container need to be restarted or respawned. - -The commands controlling your container infrastructure (such as **oc, crictl**, **lxc**, and **docker**) provide an interface to run important commands to restart services, view logs, confirm the existence and permissions modes of an important file, and so on. You should use the tools provided by your container infrastructure to interact with your application, or else edit configuration files and relaunch. That's what containers are designed to do. - -For instance, the open source forum software [Discourse][4] is officially distributed as a container image. The Discourse software is _stateless_, so its installation is self-contained within **/var/discourse**. As long as you have a backup of **/var/discourse**, you can always restore the forum by relaunching the container. The container holds no persistent data, and its configuration file is **/var/discourse/containers/app.yml**. - -Were you to log into the container and edit any of the files it contains, all changes would be lost if the container had to be restarted. - -LXC containers you're building from scratch are more flexible, with configuration files (in a location defined by you) passed to the container when you launch it. - -A build system like [Jenkins][5] usually has a default configuration file, such as **jenkins.yaml**, providing instructions for a base container image that exists only to build and run tests on source code. After the builds are done, the container goes away. - -Now that you know you don't need SSH to interact with your containers, here's an overview of what tools are available (and some notes about using SSH in spite of all the fancy tools that make it redundant). - -### OpenShift web console - -[OpenShift 4][6] offers an open source toolchain for container creation and maintenance, including an interactive web console. - -When you log into your web console, navigate to your project overview and click the **Applications** tab for a list of pods. Select a (running) pod to open the application's **Details** panel. - -![Pod details in OpenShift][7] - -Click the **Terminal** tab at the top of the **Details** panel to open an interactive shell in your container. - -![A terminal in a running container][8] - -If you prefer a browser-based experience for Kubernetes management, you can learn more through interactive lessons available at [learn.openshift.com][9]. - -### OpenShift oc - -If you prefer a command-line interface experience, you can use the **oc** command to interact with containers from the terminal. - -First, get a list of running pods (or refer to the web console for a list of active pods). To get that list, enter: - - -``` -`$ oc get pods` -``` - -You can view the logs of a resource (a pod, build, or container). By default, **oc logs** returns the logs from the first container in the pod you specify. To select a single container, add the **\--container** option: - - -``` -`$ oc logs --follow=true example-1-e1337 --container app` -``` - -You can also view logs from all containers in a pod with: - - -``` -`$ oc logs --follow=true example-1-e1337 --all-containers` -``` - -#### Execute commands - -You can execute commands remotely with: - - -``` -$ oc exec example-1-e1337 --container app hostname -        example.local -``` - -This is similar to running SSH non-interactively: you get to run the command you want to run without an interactive shell taking over your environment. - -#### Remote shell - -You can attach to a running container. This still does _not_ open a shell in the container, but it does run commands directly. For example: - - -``` -`$ oc attach example-1-e1337 --container app` -``` - -If you need a true interactive shell in a container, you can open a remote shell with the **oc rsh** command as long as the container includes a shell. By default, **oc rsh** launches **/bin/sh**: - - -``` -`$ oc rsh example-1-e1337 --container app` -``` - -### Kubernetes - -If you're using Kubernetes directly, you can use the **kubetcl** **exec** command to run a Bash shell in your pod. - -First, confirm that your pod is running: - - -``` -`$ kubectl get pods` -``` - -As long as the pod containing your application is listed, you can use the **exec** command to launch a shell in the container. Using the name **example-pod** as the pod name, enter: - - -``` -$ kubectl exec --stdin=false --tty=false -  example-pod -- /bin/bash -[root@example.local][10]:/# ls -bin   core etc   lib    root  srv -boot  dev  home  lib64  sbin  tmp  var -``` - -### Docker - -The **docker** command is similar to **kubectl**. With the **dockerd** daemon running, get the name of the running container (you may have to use **sudo** to escalate privileges if you're not in the appropriate group): - - -``` -$ docker ps -CONTAINER ID    IMAGE       COMMAND      NAME -678ac5cca78e    centos     "/bin/bash"   example-centos -``` - -Using the container name, you can run a command in the container: - - -``` -$ docker exec example/centos cat /etc/os-release -CentOS Linux release 7.6 -NAME="CentOS Linux" -VERSION="7" -ID="centos" -ID_LIKE="rhel fedora" -VERSION_ID="7" -[...] -``` - -Or you can launch a Bash shell for an interactive session: - - -``` -`$ docker exec -it example-centos /bin/bash` -``` - -### Containers and appliances - -The important thing to remember when dealing with the cloud is that containers are essentially runtimes rather than virtual machines. While they have much in common with a Linux system (because they _are_ a Linux system!), they rarely translate directly to the commands and workflow you may have developed on your Linux workstation. However, like appliances, containers have an interface to help you develop, maintain, and monitor them, so get familiar with the front-end commands and services until you're happily interacting with them just as easily as ****you interact with virtual (or bare-metal) machines. Soon, you'll wonder why everything isn't developed to be ephemeral. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/how-ssh-running-container - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/seth/users/bcotton -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cube_innovation_process_block_container.png?itok=vkPYmSRQ (cubes coming together to create a larger cube) -[2]: https://opensource.com/article/18/11/behind-scenes-linux-containers -[3]: https://www.opencontainers.org/ -[4]: http://discourse.org -[5]: http://jenkins.io -[6]: https://www.openshift.com/learn/get-started -[7]: https://opensource.com/sites/default/files/uploads/openshift-pod-access.jpg (Pod details in OpenShift) -[8]: https://opensource.com/sites/default/files/uploads/openshift-pod-terminal.jpg (A terminal in a running container) -[9]: http://learn.openshift.com -[10]: mailto:root@example.local diff --git a/sources/tech/20190620 How to use OpenSSL- Hashes, digital signatures, and more.md b/sources/tech/20190620 How to use OpenSSL- Hashes, digital signatures, and more.md deleted file mode 100644 index 724c97bc01..0000000000 --- a/sources/tech/20190620 How to use OpenSSL- Hashes, digital signatures, and more.md +++ /dev/null @@ -1,337 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: 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) - -How to use OpenSSL: Hashes, digital signatures, and more -====== -Dig deeper into the details of cryptography with OpenSSL: Hashes, -digital signatures, digital certificates, and more -![A person working.][1] - -The [first article in this series][2] introduced hashes, encryption/decryption, digital signatures, and digital certificates through the OpenSSL libraries and command-line utilities. This second article drills down into the details. Let’s begin with hashes, which are ubiquitous in computing, and consider what makes a hash function _cryptographic_. - -### Cryptographic hashes - -The download page for the OpenSSL source code () contains a table with recent versions. Each version comes with two hash values: 160-bit SHA1 and 256-bit SHA256. These values can be used to verify that the downloaded file matches the original in the repository: The downloader recomputes the hash values locally on the downloaded file and then compares the results against the originals. Modern systems have utilities for computing such hashes. Linux, for instance, has **md5sum** and **sha256sum**. OpenSSL itself provides similar command-line utilities. - -Hashes are used in many areas of computing. For example, the Bitcoin blockchain uses SHA256 hash values as block identifiers. To mine a Bitcoin is to generate a SHA256 hash value that falls below a specified threshold, which means a hash value with at least N leading zeroes. (The value of N can go up or down depending on how productive the mining is at a particular time.) As a point of interest, today’s miners are hardware clusters designed for generating SHA256 hashes in parallel. During a peak time in 2018, Bitcoin miners worldwide generated about 75 million terahashes per second—yet another incomprehensible number. - -Network protocols use hash values as well—often under the name **checksum**—to support message integrity; that is, to assure that a received message is the same as the one sent. The message sender computes the message’s checksum and sends the results along with the message. The receiver recomputes the checksum when the message arrives. If the sent and the recomputed checksum do not match, then something happened to the message in transit, or to the sent checksum, or to both. In this case, the message and its checksum should be sent again, or at least an error condition should be raised. (Low-level network protocols such as UDP do not bother with checksums.) - -Other examples of hashes are familiar. Consider a website that requires users to authenticate with a password, which the user enters in their browser. Their password is then sent, encrypted, from the browser to the server via an HTTPS connection to the server. Once the password arrives at the server, it's decrypted for a database table lookup. - -What should be stored in this lookup table? Storing the passwords themselves is risky. It’s far less risky is to store a hash generated from a password, perhaps with some _salt_ (extra bits) added to taste before the hash value is computed. Your password may be sent to the web server, but the site can assure you that the password is not stored there. - -Hash values also occur in various areas of security. For example, hash-based message authentication code ([HMAC][3]) uses a hash value and a secret cryptographic key to authenticate a message sent over a network. HMAC codes, which are lightweight and easy to use in programs, are popular in web services. An X509 digital certificate includes a hash value known as the _fingerprint_, which can facilitate certificate verification. An in-memory truststore could be implemented as a lookup table keyed on such fingerprints—as a _hash map_, which supports constant-time lookups. The fingerprint from an incoming certificate can be compared against the truststore keys for a match. - -What special property should a _cryptographic hash function_ have? It should be _one-way_, which means very difficult to invert. A cryptographic hash function should be relatively straightforward to compute, but computing its inverse—the function that maps the hash value back to the input bitstring—should be computationally intractable. Here is a depiction, with **chf** as a cryptographic hash function and my password **foobar** as the sample input: - - -``` -        +---+ -foobar—>|chf|—>hash value ## straightforward -        +--–+ -``` - -By contrast, the inverse operation is infeasible: - - -``` -            +-----------+ -hash value—>|chf inverse|—>foobar ## intractable -            +-----------+ -``` - -Recall, for example, the SHA256 hash function. For an input bitstring of any length N > 0, this function generates a fixed-length hash value of 256 bits; hence, this hash value does not reveal even the input bitstring’s length N, let alone the value of each bit in the string. By the way, SHA256 is not susceptible to a [_length extension attack_][4]. The only effective way to reverse engineer a computed SHA256 hash value back to the input bitstring is through a brute-force search, which means trying every possible input bitstring until a match with the target hash value is found. Such a search is infeasible on a sound cryptographic hash function such as SHA256. - -Now, a final review point is in order. Cryptographic hash values are statistically rather than unconditionally unique, which means that it is unlikely but not impossible for two different input bitstrings to yield the same hash value—a _collision_. The [_birthday problem_][5] offers a nicely counter-intuitive example of collisions. There is extensive research on various hash algorithms’ _collision resistance_. For example, MD5 (128-bit hash values) has a breakdown in collision resistance after roughly 221 hashes. For SHA1 (160-bit hash values), the breakdown starts at about 261 hashes. - -A good estimate of the breakdown in collision resistance for SHA256 is not yet in hand. This fact is not surprising. SHA256 has a range of 2256 distinct hash values, a number whose decimal representation has a whopping 78 digits! So, can collisions occur with SHA256 hashing? Of course, but they are extremely unlikely. - -In the command-line examples that follow, two input files are used as bitstring sources: **hashIn1.txt** and **hashIn2.txt**. The first file contains **abc** and the second contains **1a2b3c**. - -These files contain text for readability, but binary files could be used instead. - -Using the Linux **sha256sum** utility on these two files at the command line—with the percent sign (**%**) as the prompt—produces the following hash values (in hex): - - -``` -% sha256sum hashIn1.txt -9e83e05bbf9b5db17ac0deec3b7ce6cba983f6dc50531c7a919f28d5fb3696c3 hashIn1.txt - -% sha256sum hashIn2.txt -3eaac518777682bf4e8840dd012c0b104c2e16009083877675f00e995906ed13 hashIn2.txt -``` - -The OpenSSL hashing counterparts yield the same results, as expected: - - -``` -% openssl dgst -sha256 hashIn1.txt -SHA256(hashIn1.txt)= 9e83e05bbf9b5db17ac0deec3b7ce6cba983f6dc50531c7a919f28d5fb3696c3 - -% openssl dgst -sha256 hashIn2.txt -SHA256(hashIn2.txt)= 3eaac518777682bf4e8840dd012c0b104c2e16009083877675f00e995906ed13 -``` - -This examination of cryptographic hash functions sets up a closer look at digital signatures and their relationship to key pairs. - -### Digital signatures - -As the name suggests, a digital signature can be attached to a document or some other electronic artifact (e.g., a program) to vouch for its authenticity. Such a signature is thus analogous to a hand-written signature on a paper document. To verify the digital signature is to confirm two things. First, that the vouched-for artifact has not changed since the signature was attached because it is based, in part, on a cryptographic _hash_ of the document. Second, that the signature belongs to the person (e.g., Alice) who alone has access to the private key in a pair. By the way, digitally signing code (source or compiled) has become a common practice among programmers. - -Let’s walk through how a digital signature is created. As mentioned before, there is no digital signature without a public and private key pair. When using OpenSSL to create these keys, there are two separate commands: one to create a private key, and another to extract the matching public key from the private one. These key pairs are encoded in base64, and their sizes can be specified during this process. - -The private key consists of numeric values, two of which (a _modulus_ and an _exponent_) make up the public key. Although the private key file contains the public key, the extracted public key does _not_ reveal the value of the corresponding private key. - -The resulting file with the private key thus contains the full key pair. Extracting the public key into its own file is practical because the two keys have distinct uses, but this extraction also minimizes the danger that the private key might be publicized by accident. - -Next, the pair’s private key is used to process a hash value for the target artifact (e.g., an email), thereby creating the signature. On the other end, the receiver’s system uses the pair’s public key to verify the signature attached to the artifact. - -Now for an example. To begin, generate a 2048-bit RSA key pair with OpenSSL: - -**openssl genpkey -out privkey.pem -algorithm rsa 2048** - -We can drop the **-algorithm rsa** flag in this example because **genpkey** defaults to the type RSA. The file’s name (**privkey.pem**) is arbitrary, but the Privacy Enhanced Mail (PEM) extension **pem** is customary for the default PEM format. (OpenSSL has commands to convert among formats if needed.) If a larger key size (e.g., 4096) is in order, then the last argument of **2048** could be changed to **4096**. These sizes are always powers of two. - -Here’s a slice of the resulting **privkey.pem** file, which is in base64: - - -``` -\-----BEGIN PRIVATE KEY----- -MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANnlAh4jSKgcNj/Z -JF4J4WdhkljP2R+TXVGuKVRtPkGAiLWE4BDbgsyKVLfs2EdjKL1U+/qtfhYsqhkK -… -\-----END PRIVATE KEY----- -``` - -The next command then extracts the pair’s public key from the private one: - -**openssl rsa -in privkey.pem -outform PEM -pubout -out pubkey.pem** - -The resulting **pubkey.pem** file is small enough to show here in full: - - -``` -\-----BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZ5QIeI0ioHDY/2SReCeFnYZJY -z9kfk11RrilUbT5BgIi1hOAQ24LMilS37NhHYyi9VPv6rX4WLKoZCmkeYaWk/TR5 -4nbH1E/AkniwRoXpeh5VncwWMuMsL5qPWGY8fuuTE27GhwqBiKQGBOmU+MYlZonO -O0xnAKpAvysMy7G7qQIDAQAB -\-----END PUBLIC KEY----- -``` - -Now, with the key pair at hand, the digital signing is easy—in this case with the source file **client.c** as the artifact to be signed: - -**openssl dgst -sha256 -sign privkey.pem -out sign.sha256 client.c** - -The digest for the **client.c** source file is SHA256, and the private key resides in the **privkey.pem** file created earlier. The resulting binary signature file is **sign.sha256**, an arbitrary name. To get a readable (if base64) version of this file, the follow-up command is: - -**openssl enc -base64 -in sign.sha256 -out sign.sha256.base64** - -The file **sign.sha256.base64** now contains: - - -``` -h+e+3UPx++KKSlWKIk34fQ1g91XKHOGFRmjc0ZHPEyyjP6/lJ05SfjpAJxAPm075 -VNfFwysvqRGmL0jkp/TTdwnDTwt756Ej4X3OwAVeYM7i5DCcjVsQf5+h7JycHKlM -o/Jd3kUIWUkZ8+Lk0ZwzNzhKJu6LM5KWtL+MhJ2DpVc= -``` - -Or, the executable file **client** could be signed instead, and the resulting base64-encoded signature would differ as expected: - - -``` -VMVImPgVLKHxVBapJ8DgLNJUKb98GbXgehRPD8o0ImADhLqlEKVy0HKRm/51m9IX -xRAN7DoL4Q3uuVmWWi749Vampong/uT5qjgVNTnRt9jON112fzchgEoMb8CHNsCT -XIMdyaPtnJZdLALw6rwMM55MoLamSc6M/MV1OrJnk/g= -``` - -The final step in this process is to verify the digital signature with the public key. The hash used to sign the artifact (in this case, the executable **client** program) should be recomputed as an essential step in the verification since the verification process should indicate whether the artifact has changed since being signed. - -There are two OpenSSL commands used for this purpose. The first decodes the base64 signature: - -**openssl enc -base64 -d -in sign.sha256.base64 -out sign.sha256** - -The second verifies the signature: - -**openssl dgst -sha256 -verify pubkey.pem -signature sign.sha256 client** - -The output from this second command is, as it should be: - - -``` -`Verified OK` -``` - -To understand what happens when verification fails, a short but useful exercise is to replace the executable **client** file in the last OpenSSL command with the source file **client.c** and then try to verify. Another exercise is to change the **client** program, however slightly, and try again. - -### Digital certificates - -A digital certificate brings together the pieces analyzed so far: hash values, key pairs, digital signatures, and encryption/decryption. The first step toward a production-grade certificate is to create a certificate signing request (CSR), which is then sent to a certificate authority (CA). To do this for the example with OpenSSL, run: - -**openssl req -out myserver.csr -new -newkey rsa:4096 -nodes -keyout myserverkey.pem** - -This example generates a CSR document and stores the document in the file **myserver.csr** (base64 text). The purpose here is this: the CSR document requests that the CA vouch for the identity associated with the specified domain name—the common name (CN) in CA-speak. - -A new key pair also is generated by this command, although an existing pair could be used. Note that the use of **server** in names such as **myserver.csr** and **myserverkey.pem** hints at the typical use of digital certificates: as vouchers for the identity of a web server associated with a domain such as [www.google.com][6]. - -The same command, however, creates a CSR regardless of how the digital certificate might be used. It also starts an interactive question/answer session that prompts for relevant information about the domain name to link with the requester’s digital certificate. This interactive session can be short-circuited by providing the essentials as part of the command, with backslashes as continuations across line breaks. The **-subj** flag introduces the required information: - - -``` -% 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" -``` - -The resulting CSR document can be inspected and verified before being sent to a CA. This process creates the digital certificate with the desired format (e.g., X509), signature, validity dates, and so on: - -**openssl req -text -in myserver.csr -noout -verify** - -Here’s a slice of the output: - - -``` -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🇩🇪73: -… -Exponent: 65537 (0x10001) -Attributes: -a0:00 -Signature Algorithm: sha256WithRSAEncryption -… -``` - -### A self-signed certificate - -During the development of an HTTPS web site, it is convenient to have a digital certificate on hand without going through the CA process. A self-signed certificate fills the bill during the HTTPS handshake’s authentication phase, although any modern browser warns that such a certificate is worthless. Continuing the example, the OpenSSL command for a self-signed certificate—valid for a year and with an RSA public key—is: - -**openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 -keyout myserver.pem -out myserver.crt** - -The OpenSSL command below presents a readable version of the generated certificate: - -**openssl x509 -in myserver.crt -text -noout** - -Here’s part of the output for the self-signed certificate: - - -``` -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🇩🇪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: -     ... -``` - -As mentioned earlier, an RSA private key contains values from which the public key is generated. However, a given public key does _not_ give away the matching private key. For an introduction to the underlying mathematics, see . - -There is an important correspondence between a digital certificate and the key pair used to generate the certificate, even if the certificate is only self-signed: - - * The digital certificate contains the _exponent_ and _modulus_ values that make up the public key. These values are part of the key pair in the originally-generated PEM file, in this case, the file **myserver.pem**. - * The exponent is almost always 65,537 (as in this case) and so can be ignored. - * The modulus from the key pair should match the modulus from the digital certificate. - - - -The modulus is a large value and, for readability, can be hashed. Here are two OpenSSL commands that check for the same modulus, thereby confirming that the digital certificate is based upon the key pair in the PEM file: - - -``` -% openssl x509 -noout -modulus -in myserver.crt | openssl sha1 ## modulus from CRT -(stdin)= 364d21d5e53a59d482395b1885aa2c3a5d2e3769 - -% openssl rsa -noout -modulus -in myserver.pem | openssl sha1 ## modulus from PEM -(stdin)= 364d21d5e53a59d482395b1885aa2c3a5d2e3769 -``` - -The resulting hash values match, thereby confirming that the digital certificate is based upon the specified key pair. - -### Back to the key distribution problem - -Let’s return to an issue raised at the end of Part 1: the TLS handshake between the **client** program and the Google web server. There are various handshake protocols, and even the Diffie-Hellman version at work in the **client** example offers wiggle room. Nonetheless, the **client** example follows a common pattern. - -To start, during the TLS handshake, the **client** program and the web server agree on a cipher suite, which consists of the algorithms to use. In this case, the suite is **ECDHE-RSA-AES128-GCM-SHA256**. - -The two elements of interest now are the RSA key-pair algorithm and the AES128 block cipher used for encrypting and decrypting messages if the handshake succeeds. Regarding encryption/decryption, this process comes in two flavors: symmetric and asymmetric. In the symmetric flavor, the _same_ key is used to encrypt and decrypt, which raises the _key distribution problem_ in the first place: How is the key to be distributed securely to both parties? In the asymmetric flavor, one key is used to encrypt (in this case, the RSA public key) but a different key is used to decrypt (in this case, the RSA private key from the same pair). - -The **client** program has the Google web server’s public key from an authenticating certificate, and the web server has the private key from the same pair. Accordingly, the **client** program can send an encrypted message to the web server, which alone can readily decrypt this message. - -In the TLS situation, the symmetric approach has two significant advantages: - - * In the interaction between the **client** program and the Google web server, the authentication is one-way. The Google web server sends three certificates to the **client** program, but the **client** program does not send a certificate to the web server; hence, the web server has no public key from the client and can’t encrypt messages to the client. - * Symmetric encryption/decryption with AES128 is nearly a _thousand times faster_ than the asymmetric alternative using RSA keys. - - - -The TLS handshake combines the two flavors of encryption/decryption in a clever way. During the handshake, the **client** program generates random bits known as the pre-master secret (PMS). Then the **client** program encrypts the PMS with the server’s public key and sends the encrypted PMS to the server, which in turn decrypts the PMS message with its private key from the RSA pair: - - -``` -              +-------------------+ encrypted PMS  +--------------------+ -client PMS--->|server’s public key|--------------->|server’s private key|--->server PMS -              +-------------------+                +--------------------+ -``` - -At the end of this process, the **client** program and the Google web server now have the same PMS bits. Each side uses these bits to generate a _master secret_ and, in short order, a symmetric encryption/decryption key known as the _session key_. There are now two distinct but identical session keys, one on each side of the connection. In the **client** example, the session key is of the AES128 variety. Once generated on both the **client** program’s and Google web server’s sides, the session key on each side keeps the conversation between the two sides confidential. A handshake protocol such as Diffie-Hellman allows the entire PMS process to be repeated if either side (e.g., the **client** program) or the other (in this case, the Google web server) calls for a restart of the handshake. - -### Wrapping up - -The OpenSSL operations illustrated at the command line are available, too, through the API for the underlying libraries. These two articles have emphasized the utilities to keep the examples short and to focus on the cryptographic topics. If you have an interest in security issues, OpenSSL is a fine place to start—and to stay. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/cryptography-basics-openssl-part-2 - -作者:[Marty Kalin][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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://opensource.com/article/19/6/cryptography-basics-openssl-part-1 -[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 diff --git a/sources/tech/20190620 You can-t buy DevOps.md b/sources/tech/20190620 You can-t buy DevOps.md deleted file mode 100644 index 36717058a0..0000000000 --- a/sources/tech/20190620 You can-t buy DevOps.md +++ /dev/null @@ -1,103 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (You can't buy DevOps) -[#]: via: (https://opensource.com/article/19/6/you-cant-buy-devops) -[#]: author: (Julie Gunderson https://opensource.com/users/juliegund) - -You can't buy DevOps -====== -But plenty of people are happy to sell it to you. Here's why it's not -for sale. -![Coffee shop photo][1] - -![DevOps price tag graphic][2] - -Making a move to [DevOps][3] can be a daunting undertaking, with many organizations not knowing the right place to start. I recently had some fun taking a few "DevOps assessments" to see what solutions they offered. I varied my answers—from an organization that fully embraces DevOps to one at the beginning of the journey. Some of the assessments provided real value, linking me back to articles on culture and methodologies, while others merely offered me a tool promising to bring all my DevOps dreams into reality. - -Tools are absolutely essential to the DevOps journey; for instance, tools can continuously deliver, automate, or monitor your environment. However, **DevOps is not a product**, and tools alone will not enable the processes necessary to realize the full value of DevOps. People are what matter most; you can't do DevOps without building the people, mindset, and culture first. - -### Don't 'win' at DevOps; become a champion - -As a DevOps advocate at PagerDuty, I am proud to be a part of an organization with a strong commitment to DevOps methodologies, well beyond just "checking the boxes" of tool adoption. - -I recently had a conversation with PagerDuty CEO Jennifer Tejada about being a winner versus a champion. She talked about how winning is fantastic—you get a trophy, a title, or maybe even a few million dollars (if it's the lottery). However, in the big picture, winning is all about short-term goals, while being a champion means focusing on long-term successes or outcomes. This got me thinking about how to apply this principle to organizations embracing DevOps. - -One of my favorite examples of DevOps tooling is XebiaLabs' [Periodic Table of DevOps Tools][4]: - -[![Periodic Table of DevOps][5]][4] - -(Click table for interactive version.) - -The table shows that numerous tools fit into DevOps. However, too many times, I have heard about organizations "transforming to DevOps" by purchasing tools. While tooling is an essential part of the DevOps journey, a tool alone does not create a DevOps environment. You have to consider all the factors that make a DevOps team function well: collaboration, breaking down silos, defined processes, ownership, and automation, along with continuous improvement/continuous delivery. - -Deciding to purchase tooling is a great step in the right direction; what is more important is to define the "why" or the end goal behind decisions first. Which brings us back to the mentality of a champion; look at Olympic gold medalist Michael Phelps, for example. Phelps is the most decorated Olympian of all time and holds 39 world records. To achieve these accomplishments, Phelps didn't stop at one, two, or even 20 wins; he aimed to be a champion. This was all done through commitment, practice, and focusing on the desired end state. - -### DevOps defined - -There are hundreds of definitions for DevOps, but almost everyone can agree on the core tenet outlined in the [State of DevOps Report][6]: - -> "DevOps is a set of principles aimed at building culture and processes to help teams work more efficiently and deliver better software faster." - -You can't change culture and processes with a credit card. Tooling can enable an organization to collaborate better or automate or continuously deliver; however, without the right mindset and adoption, a tool's full capability may not be achievable. - -For example, one of my former colleagues heard how amazing Slack is for teams transforming to DevOps by opening up channels for collaboration. He convinced his manager that Slack would solve all of their communication woes. However, six months into the Slack adoption, most teams were still using Skype, including the manager. Slack ended up being more of a place to talk about brewing beer than a tool to bring the product to market faster. The issue was not Slack; it was the lack of buy-in from the team and organization and knowledge around the product's full functionality. - -Purchasing a tool can definitely be a win for a team, but purchasing a tool is not purchasing DevOps. Making tooling and best practices work for the team and achieving short- and long-term goals are where our conversation around being a champion comes up. This brings us back to the why, the overall and far-reaching goal for the team or organization. Once you identify the goal, how do you get buy-in from key stakeholders? After you achieve buy-in, how do you implement the solution? - -### Organizational change - -#### - -[![Change management comic by Randy Glasbergen][7]][8] - -Change is hard for many organizations and individuals; moreover, meaningful change does not happen overnight. It is important to understand how people and organizations process change. In the [Kotter 8-Step Process for Leading Change][9], it's about articulating the need for a change, creating urgency around the why, then starting small and finding and developing internal champions, _before_ trying to prove wins or, in this case, purchasing a tool. - -If people in an organization are not aware of a problem or that there's a better way of operating, it will be hard to get the buy-in necessary and motivate team members to adopt new ideas and take action. People may be perfectly content with the current state; perhaps the processes in place are adequate or, at a minimum, the current state is a known factor. However, for the overall team to function well and achieve its shared goal in a faster, more agile way, new mechanisms must be put into place first. - -![Kotter 8-Step Process for Leading Change][10] - -### How to be a DevOps champion - -Being a champion in the DevOps world means going beyond the win and delving deeper into the team/organizational structure and culture, thereby identifying outlying issues beyond tools, and then working with others to embrace the right change that leads to defined results. Go back to the beginning and define the end goal. Here are a few sample questions you can ask to get started: - - * What are your core values? - * Why are you trying to become a more agile company or team? - * What obstacles is your team or organization facing? - * What will the tool or process accomplish? - * How are people communicating and collaborating? - * Are there silos and why? - * How are you championing the customer? - * Are employees empowered? - - - -After defining the end state, find other like-minded individuals to be part of your champion team, and don't lose sight of what you are trying to accomplish. When making any change, make sure to start small, e.g., with one team or a test environment. By starting small and building on the wins, internal champions will start creating themselves. - -Remember, companies are happy and eager to try to sell you DevOps, but at the end of the day, DevOps is not a product. It is a fully embraced methodology and mindset of automation, collaboration, people, and processes. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/you-cant-buy-devops - -作者:[Julie Gunderson][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/juliegund -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee-shop-devops.png?itok=CPefJZJL (Coffee shop photo) -[2]: https://opensource.com/sites/default/files/uploads/devops-pricetag.jpg (DevOps price tag graphic) -[3]: https://opensource.com/resources/devops -[4]: https://xebialabs.com/periodic-table-of-devops-tools/ -[5]: https://opensource.com/sites/default/files/uploads/periodic-table-of-devops-tools.png (Periodic Table of DevOps) -[6]: https://puppet.com/resources/whitepaper/state-of-devops-report -[7]: https://opensource.com/sites/default/files/uploads/cartoon.png (Change management comic by Randy Glasbergen) -[8]: https://images.app.goo.gl/JiMaWAenNkLcmkZJ9 -[9]: https://www.kotterinc.com/8-steps-process-for-leading-change/ -[10]: https://opensource.com/sites/default/files/uploads/kotter-process.png (Kotter 8-Step Process for Leading Change) diff --git a/sources/tech/20190621 7 infrastructure performance and scaling tools you should be using.md b/sources/tech/20190621 7 infrastructure performance and scaling tools you should be using.md deleted file mode 100644 index 3a9003ae9c..0000000000 --- a/sources/tech/20190621 7 infrastructure performance and scaling tools you should be using.md +++ /dev/null @@ -1,94 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (7 infrastructure performance and scaling tools you should be using) -[#]: via: (https://opensource.com/article/19/6/performance-scaling-tools) -[#]: author: (Pradeep SurisettyPeter Portante https://opensource.com/users/psuriset/users/aakarsh/users/portante/users/anaga) - -7 infrastructure performance and scaling tools you should be using -====== -These open source tools will help you feel confident in your -infrastructure's performance as it scales up. -![Several images of graphs.][1] - -[Sysadmins][2], [site reliability engineers][3] (SREs), and cloud operators all too often struggle to feel confident in their infrastructure as it scales up. Also too often, they think the only way to solve their challenges is to write a tool for in-house use. Fortunately, there are options. There are many open source tools available to test an infrastructure's performance. Here are my favorites. - -### Pbench - -Pbench is a performance testing harness to make executing benchmarks and performance tools easier and more convenient. In short, it: - - * Excels at running micro-benchmarks on large scales of hosts (bare-metal, virtual machines, containers, etc.) while automating a potentially large set of benchmark parameters - * Focuses on installing, configuring, and executing benchmark code and performance tools and not on provisioning or orchestrating the testbed (e.g., OpenStack, RHEV, RHEL, Docker, etc.) - * Is designed to work in concert with provisioning tools like BrowBeat or Ansible playbooks - - - -Pbench's [documentation][4] includes installation and user guides, and the code is [maintained on GitHub][5], where the team welcomes contributions and issues. - -### Ripsaw - -Baselining is a critical aspect of infrastructure reliability. Ripsaw is a performance benchmark Operator for launching workloads on Kubernetes. It deploys as a Kuberentes Operator that then deploys common workloads, including specific applications (e.g., Couchbase) or general performance tests (e.g., Uperf) to measure and establish a performance baseline. - -Ripsaw is [maintained on GitHub][6]. You can also find its maintainers on the [Kubernetes Slack][7], where they are active contributors. - -### OpenShift Scale - -The collection of tools in OpenShift Scale, OpenShift's open source solution for performance testing, do everything from spinning up OpenShift on OpenStack installations (TripleO Install and ShiftStack Install), installing on Amazon Web Services (AWS), or providing containerized tooling, like running Pbench on your cluster or doing cluster limits testing, network tests, storage tests, metric tests with Prometheus, logging, and concurrent build testing. - -Scale's CI suite is flexible enough to both add workloads and include your workloads when deploying to Azure or anywhere else you might run. You can see the full suite of tools [on GitHub][8]. - -### Browbeat - -[Browbeat][9] calls itself "a performance tuning and analysis tool for OpenStack." You can use it to analyze and tune the deployment of your workloads. It also automates the deployment of standard monitoring and data analysis tools like Grafana and Graphite. Browbeat is [maintained on GitHub][10]. - -### Smallfile - -Smallfile is a filesystem workload generator targeted for scale-out, distributed storage. It has been used to test a number of open filesystem technologies, including GlusterFS, CephFS, Network File System (NFS), Server Message Block (SMB), and OpenStack Cinder volumes. It is [maintained on GitHub][11]. - -### Ceph Benchmarking Tool - -Ceph Benchmarking Tool (CBT) is a testing harness that can automate tasks for testing [Ceph][12] cluster performance. It records system metrics with collectl, and it can collect more information with tools including perf, blktrace, and valgrind. CBT can also do advanced testing that includes automated object storage daemon outages, erasure-coded pools, and cache-tier configurations. - -Contributors have extended CBT to use [Pbench monitoring tools and Ansible][13] and to run the [Smallfile benchmark][14]. A separate Grafana visualization dashboard uses Elasticsearch data generated by [Automated Ceph Test][15]. - -### satperf - -Satellite-performance (satperf) is a set of Ansible playbooks and helper scripts to deploy Satellite 6 environments and measure the performance of selected actions, such as concurrent registrations, remote execution, Puppet operations, repository synchronizations and promotions, and more. You can find Satperf [on GitHub][16]. - -### Conclusion - -Sysadmins, SREs, and cloud operators face a wide variety of challenges as they work to scale their infrastructure, but luckily there is also a wide variety of tools to help them get past those common issues. Any of these seven tools should help you get started testing your infrastructure's performance as it scales. - -Are there other open source performance and scaling tools that should be on this list? Add your favorites in the comments. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/performance-scaling-tools - -作者:[Pradeep SurisettyPeter Portante][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/psuriset/users/aakarsh/users/portante/users/anaga -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_scale_performance.jpg?itok=R7jyMeQf (Several images of graphs.) -[2]: /16/12/yearbook-10-open-source-sysadmin-tools -[3]: /article/19/5/life-performance-engineer -[4]: https://distributed-system-analysis.github.io/pbench/ -[5]: https://github.com/distributed-system-analysis/pbench -[6]: https://github.com/cloud-bulldozer/ripsaw -[7]: https://github.com/cloud-bulldozer/ripsaw#community -[8]: https://github.com/openshift-scale -[9]: https://browbeatproject.org/ -[10]: https://github.com/cloud-bulldozer/browbeat -[11]: https://github.com/distributed-system-analysis/smallfile -[12]: https://ceph.com/ -[13]: https://github.com/acalhounRH/cbt -[14]: https://nuget.pkg.github.com/bengland2/cbt/tree/smallfile -[15]: https://github.com/acalhounRH/automated_ceph_test -[16]: https://github.com/redhat-performance/satperf diff --git a/sources/tech/20190621 The state of open source translation tools for contributors to your project.md b/sources/tech/20190621 The state of open source translation tools for contributors to your project.md deleted file mode 100644 index 07bac654fc..0000000000 --- a/sources/tech/20190621 The state of open source translation tools for contributors to your project.md +++ /dev/null @@ -1,97 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The state of open source translation tools for contributors to your project) -[#]: via: (https://opensource.com/article/19/6/translation-platforms-matter) -[#]: author: (Jean-Baptiste Holcroft https://opensource.com/users/jibec/users/jibec) - -The state of open source translation tools for contributors to your project -====== -There are almost 100 languages with more than 10 million speakers. How -many of your active contributors speak one? -![Team of people around the world][1] - -In the world of free software, many people speak English: It is the **one** language. English helps us cross borders to meet others. However, this language is also a barrier for the majority of people. - -Some master it while others don't. Complex English terms are, in general, a barrier to the understanding and propagation of knowledge. Whenever you use an uncommon English word, ask yourself about your real mastery of what you are explaining, and the unintentional barriers you build in the process. - -_“If you talk to a man in a language he understands, that goes to his head. If you talk to him in his language, that goes to his heart.”_ — Nelson Mandela - -We are 7 billion humans, and less than 400 million of us are English natives. The wonders done day after day by free/libre open source contributors deserve to reach the hearts of the [6.6 billion people][2] for whom English is not their mother tongue. In this day and age, we have the technology to help translate all types of content: websites, documentation, software, and even sounds and images. Even if I do not translate of all of these media personally, I do not know of any real limits. The only prerequisite for getting this content translated is both the willingness of the creators and the collective will of the users, customers, and—in the case of free software—the contributors. - -### Why successful translation requires real tooling - -Some projects are stuck in the stone ages and require translators to use [Git][3], [Mercurial][4], or other development tools. These tools don’t meet the needs of translation communities. Let’s help these projects evolve, as discussed in the section "A call for action." - -Other projects have integrated translation platforms, which are key tools for linguistic diversity and existence. These tools understand the needs of translators and serve as a bridge to the development world. They make translation contribution easy, and keep those doing the translations motivated over time. - -This aspect is important: There are almost 100 languages with more than 10 million speakers. Do you really believe that your project can have an active contributor for each of these languages? Unless you are a huge organization, like Mozilla or LibreOffice, there is no chance. The translators who help you also help two, ten, or a hundred other projects. They need tools to be effective, such as [translation memories][5], progress reports, alerts, ways to collaborate, and knowing that what they do is useful. - -### Translation platforms are in trouble - -However, the translation platforms distributed as free software are disappearing in favor of closed platforms. These platforms set their rules and efforts according to what will bring them the most profit. - -Linguistic and cultural diversity does not bring money: It opens doors and allows local development. It emancipates populations and can ensure the survival of certain cultures and languages. In the 21st century, is your culture really alive if it does not exist in cyberspace? - -The short history of translation platforms is not pretty: - - * In 2011, Transifex ceased to be open when they decided to no longer publish their source code. - * Since September 2017, the [Pootle][6] project seems to have stalled. - * In October 2018, the [Zanata][7] project shut down because it had not succeeded in building a community of technical contributors capable of taking over when corporate funding was halted. - - - -In particular, the [Fedora Project][8]—which I work closely with—has ridden the roller coaster from Transifex to Zanata and is now facing another move and more challenges. - -Two significant platforms remain: - - * [Pontoon][9]: Dedicated to the Mozilla use case (large community, common project). - * [Weblate][10]: A generic platform created by developer [Michal Čihař][11] (a generic purpose platform). - - - -These two tools are of high quality and are technically up-to-date, but Mozilla’s Pontoon is not designed to appeal to the greatest number of people. This project is dedicated to the specific challenges Mozilla faces.  - -### A call for action - -There is an urgent need for large communities to share resources to perpetuate Weblate as free software and promote its adoption. Support is also needed for other tools, such as [po4a][12], the [Translate Toolkit][13], and even our old friend [gettext][14]. Will we accept a sword of Damocles hanging over our heads? Will we continue to consume years of free work without giving a cent in return? Or will we take the lead in bringing security to our communities? - -**What you can do as a contributor**: Promote Weblate as an open source translation platform, and help your beloved project use it. [Hosting is free for open source projects][15]. - -**What you can do as a developer**: Make sure all of your project’s content can be translated into any language. Think about this issue from the beginning, as all tools don’t provide the same internationalization features. - -**What you can do as an entity with a budget**: Whether you’re a company or just part of the community, pay for the support, hosting, or development of the tools you use. Even if the amount is symbolic, doing this will lower the risks. In particular, [here is the info for Weblate][16]. (Note: I’m not involved with the Weblate project other than bug reports and translation.) - -**What to do if you’re a language enthusiast**: Contact me to help create an open source language organization to promote our tools and their usage, and find money to fund them. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/translation-platforms-matter - -作者:[Jean-Baptiste Holcroft][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jibec/users/jibec -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_global_people_gis_location.png?itok=Rl2IKo12 (Team of people around the world) -[2]: https://www.ethnologue.com/statistics/size -[3]: https://git-scm.com -[4]: https://www.mercurial-scm.org -[5]: https://en.wikipedia.org/wiki/Translation_memory -[6]: http://pootle.translatehouse.org -[7]: http://zanata.org -[8]: https://getfedora.org -[9]: https://github.com/mozilla/pontoon/ -[10]: https://weblate.org -[11]: https://cihar.com -[12]: https://po4a.org -[13]: http://docs.translatehouse.org/projects/translate-toolkit/en/latest/ -[14]: https://www.gnu.org/software/gettext/ -[15]: http://hosted.weblate.org/ -[16]: https://weblate.org/en/hosting/ diff --git a/sources/tech/20190623 What does debugging a program look like.md b/sources/tech/20190623 What does debugging a program look like.md deleted file mode 100644 index 7cc7c1432e..0000000000 --- a/sources/tech/20190623 What does debugging a program look like.md +++ /dev/null @@ -1,184 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What does debugging a program look like?) -[#]: via: (https://jvns.ca/blog/2019/06/23/a-few-debugging-resources/) -[#]: author: (Julia Evans https://jvns.ca/) - -What does debugging a program look like? -====== - -I was debugging with a friend who’s a relatively new programmer yesterday, and showed them a few debugging tips. Then I was thinking about how to teach debugging this morning, and [mentioned on Twitter][1] that I’d never seen a really good guide to debugging your code. (there are a ton of really great replies by Anne Ogborn to that tweet if you are interested in debugging tips) - -As usual, I got a lot of helpful answers and now I have a few ideas about how to teach debugging skills / describe the process of debugging. - -### a couple of debugging resources - -I was hoping for more links to debugging books/guides, but here are the 2 recommendations I got: - -**“Debugging” by David Agans**: Several people recommended the book [Debugging][2], which looks like a nice and fairly short book that explains a debugging strategy. I haven’t read it yet (though I ordered it to see if I should be recommending it) and the rules laid out in the book (“understand the system”, “make it fail”, “quit thinking and look”, “divide and conquer”, “change one thing at a time”, “keep an audit trail”, “check the plug”, “get a fresh view”, and “if you didn’t fix it, it ain’t fixed”) seem extremely resaonable :). He also has a charming [debugging poster][3]. - -**“How to debug” by John Regehr**: [How to Debug][4] is a very good blog post based on Regehr’s experience teaching a university embedded systems course. Lots of good advice. He also has a [blog post reviewing 4 books about debugging][5], including Agans’ book. - -### reproduce your bug (but how do you do that?) - -The rest of this post is going to be an attempt to aggregate different ideas about debugging people tweeted at me. - -Somewhat obviously, everybody agrees that being able to consistently reproduce a bug is important if you want to figure out what’s going on. I have an intuitive sense for how to do this but I’m not sure how to **explain** how to go from “I saw this bug twice” to “I can consistently reproduce this bug on demand on my laptop”, and I wonder whether the techniques you use to do this depend on the domain (backend web dev, frontend, mobile, games, C++ programs, embedded etc). - -### reproduce your bug _quickly_ - -Everybody also agrees that it’s extremely useful be able to reproduce the bug quickly (if it takes you 3 minutes to check if every change helped, iterating is VERY SLOW). - -A few suggested approaches: - - * for something that requires clicking on a bunch of things in a browser to reproduce, recording what you clicked on with [Selenium][6] and getting Selenium to replay the UI interactions (suggested [here][7]) - * writing a unit test that reproduces the bug (if you can). bonus: you can add this to your test suite later if it makes sense - * writing a script / finding a command line incantation that does it (like `curl MY_APP.local/whatever`) - - - -### accept that it’s probably your code’s fault - -Sometimes I see a problem and I’m like “oh, library X has a bug”, “oh, it’s DNS”, “oh, SOME OTHER THING THAT IS NOT MY CODE is broken”. And sometimes it’s not my code! But in general between an established library and my code that I wrote last month, usually it’s my code that I wrote last month that’s the problem :). - -### start doing experiments - -@act_gardner gave a [nice, short explanation of what you have to do after you reproduce your bug][8] - -> I try to encourage people to first fully understand the bug - What’s happening? What do you expect to happen? When does it happen? When does it not happen? Then apply their mental model of the system to guess at what could be breaking and come up with experiments. -> -> Experiments could be changing or removing code, making API calls from a REPL, trying new inputs, poking at memory values with a debugger or print statements. - -I think the loop here may be: - - * make guess about one aspect about what might be happening (“this variable is set to X where it should be Y”, “the server is being sent the wrong request”, “this code is never running at all”) - * do experiment to check that guess - * repeat until you understand what’s going on - - - -### change one thing at a time - -Everybody definitely agrees that it is important to change one thing a time when doing an experiment to verify an assumption. - -### check your assumptions - -A lot of debugging is realizing that something you were **sure** was true (“wait this request is going to the new server, right, not the old one???“) is actually… not true. I made an attempt to [list some common incorrect assumptions][9]. Here are some examples: - - * this variable is set to X (“that filename is definitely right”) - * that variable’s value can’t possibly have changed between X and Y - * this code was doing the right thing before - * this function does X - * I’m editing the right file - * there can’t be any typos in that line I wrote it is just 1 line of code - * the documentation is correct - * the code I’m looking at is being executed at some point - * these two pieces of code execute sequentially and not in parallel - * the code does the same thing when compiled in debug / release mode (or with -O2 and without, or…) - * the compiler is not buggy (though this is last on purpose, the compiler is only very rarely to blame :)) - - - -### weird methods to get information - -There are a lot of normal ways to do experiments to check your assumptions / guesses about what the code is doing (print out variable values, use a debugger, etc). Sometimes, though, you’re in a more difficult environment where you can’t print things out and don’t have access to a debugger (or it’s inconvenient to do those things, maybe because there are too many events). Some ways to cope: - - * [adding sounds on mobile][10]: “In the mobile world, I live on this advice. Xcode can play a sound when you hit a breakpoint (and continue without stopping). I place them certain places in the code, and listen for buzzing Tink to indicate tight loops or Morse/Pop pairs to catch unbalanced events” (also [this tweet][11]) - * there’s a very cool talk about [using XCode to play sound for iOS debugging here][12] - * [adding LEDs][13]: “When I did embedded dev ages ago on grids of transputers, we wired up an LED to an unused pin on each chip. It was surprisingly effective for diagnosing parallelism issues.” - * [string][14]: “My networks prof told me about a hack he saw at Xerox in the early days of Ethernet: a tap in the coax with an amp and motor and piece of string. The busier the network was, the faster the string twirled.” - * [peep][15] is a “network auralizer” that translates what’s happening on your system into sounds. I spent 10 minutes trying to get it to compile and failed so far but it looks very fun and I want to try it!! - - - -The point here is that information is the most important thing and you need to do whatever’s necessary to get information. - -### write your code so it’s easier to debug - -Another point a few people brought up is that you can improve your program to make it easier to debug. tef has a nice post about this: [Write code that’s easy to delete, and easy to debug too.][16] here. I thought this was very true: - -> Debuggable code isn’t necessarily clean, and code that’s littered with checks or error handling rarely makes for pleasant reading. - -I think one interpretation of “easy to debug” is “every single time there’s an error, the program reports to you exactly what happened in an easy to understand way”. Whenever my program has a problem and says sometihng “error: failure to connect to SOME_IP port 443: connection timeout” I’m like THANK YOU THAT IS THE KIND OF THING I WANTED TO KNOW and I can check if I need to fix a firewall thing or if I got the wrong IP for some reason or what. - -One simple example of this recently: I was making a request to a server I wrote and the reponse I got was “upstream connect error or disconnect/reset before headers”. This is an nginx error which basically in this case boiled down to “your program crashed before it sent anything in response to the request”. Figuring out the cause of the crash was pretty easy, but having better error handling (returning an error instead of crashing) would have saved me a little time because instead of having to go check the cause of the crash, I could have just read the error message and figured out what was going on right away. - -### error messages are better than silently failing - -To get closer to the dream of “every single time there’s an error, the program reports to you exactly what happened in an easy to understand way” you also need to be disciplined about immediately returning an error message instead of silently writing incorrect data / passing a nonsense value to another function which will do WHO KNOWS WHAT with it and cause you a gigantic headache. This means adding code like this: - -``` -if UNEXPECTED_THING: - raise "oh no THING happened" -``` - -This isn’t easy to get right (it’s not always obvious where you should be raising errors!“) but it really helps a lot. - -### failure: print out a stack of errors, not just one error. - -Related to returning helpful errors that make it easy to debug: Rust has a really incredible error handling library [called failure][17] which basicaly lets you return a chain of errors instead of just one error, so you can print out a stack of errors like: - -``` -"error starting server process" caused by -"error initializing logging backend" caused by -"connection failure: timeout connecting to 1.2.3.4 port 1234". -``` - -This is SO MUCH MORE useful than just `connection failure: timeout connecting to 1.2.3.4 port 1234` by itself because it tells you the significance of 1.2.3.4 (it’s something to do with the logging backend!). And I think it’s also more useful than `connection failure: timeout connecting to 1.2.3.4 port 1234` with a stack trace, because it summarizes at a high level the parts that went wrong instead of making you read all the lines in the stack trace (some of which might not be relevant!). - -tools like this in other languages: - - * Go: the idiom to do this seems to be to just concatenate your stack of errors together as a big string so you get “error: thing one: error: thing two : error: thing three” which works okay but is definitely a lot less structured than `failure`’s system - * Java: I hear you can give exceptions causes but haven’t used that myself - * Python 3: you can use `raise ... from` which sets the `__cause__` attribute on the exception and then your exceptions will be separated by `The above exception was the direct cause of the following exception:..` - - - -If you know how to do this in other languages I’d be interested to hear! - -### understand what the error messages mean - -One sub debugging skill that I take for granted a lot of the time is understanding what error messages mean! I came across this nice graphic explaining [common Python errors and what they mean][18], which breaks down things like `NameError`, `IOError`, etc. - -I think a reason interpreting error messages is hard is that understanding a new error message might mean learning a new concept – `NameError` can mean “Your code uses a variable outside the scope where it’s defined”, but to really understand that you need to understand what variable scope is! I ran into this a lot when learning Rust – the Rust compiler would be like “you have a weird lifetime error” and I’d like be “ugh ok Rust I get it I will go actually learn about how lifetimes work now!“. - -And a lot of the time error messages are caused by a problem very different from the text of the message, like how “upstream connect error or disconnect/reset before headers” might mean “julia, your server crashed!“. The skill of understanding what error messages mean is often not transferable when you switch to a new area (if I started writing a lot of React or something tomorrow, I would probably have no idea what any of the error messages meant!). So this definitely isn’t just an issue for beginner programmers. - -### that’s all for now! - -I feel like the big thing I’m missing when talking about debugging skills is a stronger understanding of where people get stuck with debugging – it’s easy to say “well, you need to reproduce the problem, then make a more minimal reproduction, then start coming up with guesses and verifying them, and improve your mental model of the system, and then figure it out, then fix the problem and hopefully write a test to make it not come back”, but – where are people actually getting stuck in practice? What are the hardest parts? I have some sense of what the hardest parts usually are for me but I’m still not sure what the hardest parts usually are for someone newer to debugging their code. - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019/06/23/a-few-debugging-resources/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://twitter.com/b0rk/status/1142825259546140673 -[2]: http://debuggingrules.com/ -[3]: http://debuggingrules.com/?page_id=40 -[4]: https://blog.regehr.org/archives/199 -[5]: https://blog.regehr.org/archives/849 -[6]: https://www.seleniumhq.org/ -[7]: https://twitter.com/AnnieTheObscure/status/1142843984642899968 -[8]: https://twitter.com/act_gardner/status/1142838587437830144 -[9]: https://twitter.com/b0rk/status/1142812831420768257 -[10]: https://twitter.com/cocoaphony/status/1142847665690030080 -[11]: https://twitter.com/AnnieTheObscure/status/1142842421954244608 -[12]: https://qnoid.com/2013/06/08/Sound-Debugging.html -[13]: https://twitter.com/wombatnation/status/1142887843963867136 -[14]: https://twitter.com/irvingreid/status/1142887472441040896 -[15]: http://peep.sourceforge.net/intro.html -[16]: https://programmingisterrible.com/post/173883533613/code-to-debug -[17]: https://github.com/rust-lang-nursery/failure -[18]: https://pythonforbiologists.com/29-common-beginner-errors-on-one-page/ diff --git a/sources/tech/20190624 Book Review- A Byte of Vim.md b/sources/tech/20190624 Book Review- A Byte of Vim.md deleted file mode 100644 index e221a3bc6f..0000000000 --- a/sources/tech/20190624 Book Review- A Byte of Vim.md +++ /dev/null @@ -1,99 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: 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/) - -Book Review: A Byte of Vim -====== - -[Vim][1] is a tool that is both simple and very powerful. Most new users will be intimidated by it because it doesn’t ‘work’ like regular graphical text editors. The ‘unusual’ keyboard shortcuts makes people wonder about [how to save and exit Vim][2]. But once you master Vim, there is nothing like it. - -There are numerous [Vim resources available online][3]. We have covered some Vim tricks on It’s FOSS as well. Apart from online resources, plenty of books have been dedicated to this editor as well. Today, we will look at one of such book that is designed to make Vim easy for most users to understand. The book we will be discussing is [A Byte of Vim][4] by [Swaroop C H][5]. - -The author [Swaroop C H][6] has worked in computing for over a decade. He previously worked at Yahoo and Adobe. Out of college, he made money by selling Linux CDs. He started a number of businesses, including an iPod charger named ion. He is currently an engineering manager for the AI team at [Helpshift][7]. - -### A Byte of Vim - -![][8] - -Like all good books, A Byte of Vim starts by talking about what Vim is: “a computer program used for writing any kind of text”. He does on to say, “What makes Vim special is that it is one of those few software which is both simple and powerful.” - -Before diving into telling how to use Vim, Swaroop tells the reader how to install Vim for Windows, Mac, Linux, and BSD. Once the installation is complete, he runs you through how to launch Vim and how to create your first file. - -Next, Swaroop discusses the different modes of Vim and how to navigate around your document using Vim’s keyboard shortcuts. This is followed by the basics of editing a document with Vim, including the Vim version of cut/copy/paste and undo/redo. - -Once the editing basics are covered, Swaroop talks about using Vim to edit multiple parts of a single document. You can also multiple tabs and windows to edit multiple documents at the same time. - -[][9] - -Suggested read  Bring Your Old Computer Back to Life With 4MLinux - -The book also covers extending the functionality of Vim through scripting and installing plugins. There are two ways to using scripts in Vim, use Vim’s built-in scripting language or using a programming language like Python or Perl to access Vim’s internals. There are five types of Vim plugins that can be written or downloaded: vimrc, global plugin, filetype plugin, syntax highlighting plugin, and compiler plugin. - -In a separate section, Swaroop C H covers the features of Vim that make it good for programming. These features include syntax highlighting, smart indentation, support for shell commands, omnicompletion, and the ability to be used as an IDE. - -#### Getting the ‘A Byte of Vim’ book and contributing to it - -A Byte of Book is licensed under [Creative Commons 4.0][10]. You can read an online version of the book for free on [the author’s website][4]. You can also download a [PDF][11], [Epub][12], or [Mobi][13] for free. - -[Get A Byte of Vim for FREE][4] - -If you prefer reading a [hard copy][14], you have that option, as well. - -Please note that the _**original version of A Byte of Vim was written in 2008**_ and converted to PDf. Unfortunately, Swaroop C H lost the original source files and he is working to convert the book to [Markdown][15]. If you would like to help, please visit the [book’s GitHub page][16]. - -Preview | Product | Price | ----|---|---|--- -![Mastering Vim Quickly: From WTF to OMG in no time][17] ![Mastering Vim Quickly: From WTF to OMG in no time][17] | [Mastering Vim Quickly: From WTF to OMG in no time][18] | $34.00[][19] | [Buy on Amazon][20] - -#### Conclusion - -When I first stared into the angry maw that is Vim, I did not have a clue what to do. I wish that I had known about A Byte of Vim then. This book is a good resource for anyone learning about Linux, especially if you are getting into the command line. - -Have you read [A Byte of Vim][4] by Swaroop C H? If yes, how do you find it? If not, what is your favorite book on an open source topic? Let us know in the comments below. - -[][21] - -Suggested read  Iridium Browser: A Browser for the Privacy Conscious - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][22]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/book-review-a-byte-of-vim/ - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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 diff --git a/sources/tech/20190624 Check your password security with Have I Been Pwned- and pass.md b/sources/tech/20190624 Check your password security with Have I Been Pwned- and pass.md deleted file mode 100644 index d4557725ba..0000000000 --- a/sources/tech/20190624 Check your password security with Have I Been Pwned- and pass.md +++ /dev/null @@ -1,113 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Check your password security with Have I Been Pwned? and pass) -[#]: via: (https://opensource.com/article/19/6/check-passwords) -[#]: author: (Brian "bex" Exelbierd https://opensource.com/users/bexelbie/users/jason-baker/users/admin/users/mtsouk) - -Check your password security with Have I Been Pwned? and pass -====== -Periodically checking for password compromise is an excellent way to -help ward off most attackers in most threat models. -![Password lock][1] - -Password security involves a broad set of practices, and not all of them are appropriate or possible for everyone. Therefore, the best strategy is to develop a threat model by thinking through your most significant risks—who and what you are protecting against—then model your security approach on the activities that are most effective against those specific threats. The Electronic Frontier Foundation (EFF) has a [great series on threat modeling][2] that I encourage everyone to read. - -In my threat model, I am very concerned about the security of my passwords against (among other things) [dictionary attacks][3], in which an attacker uses a list of likely or known passwords to try to break into a system. One way to stop dictionary attacks is to have your service provider rate-limit or deny login attempts after a certain number of failures. Another way is not to use passwords in the "known passwords" dataset. - -### Check password security with HIBP - -[Troy Hunt][4] created [Have I Been Pwned?][5] (HIBP) to notify people when their information is found in leaked data dumps and breaches. If you haven't already registered, you should, as the mere act of registering exposes nothing. Troy has built a collection of over 550 million real-world passwords from this data. These are passwords that real people used and were exposed by data that was stolen or accidentally made public. - -The site _does not_ publish the plaintext password list, but it doesn't have to. By definition, this data is already out there. If you've ever reused a password or used a "common" password, then you are at risk because someone is building a dictionary of these passwords to try right now. - -Recently, Firefox and HIBP announced they are [teaming up][6] to make breach searches easier. And the National Institutes of Standards and Technology (NIST) recommends that you [check passwords][7] against those known to be compromised and change them if they are found. HIBP supports this via a password-checking feature that is exposed via an API, so it is easy to use. - -Now, it would be a bad idea to send the website a full list of your passwords. While I trust [HaveIBeenPwned.com][5], it could be compromised one day. Instead, the site uses a process called [k-Anonymity][8] that allows you to check your passwords without exposing them. This is a three-step process. First, let's review the steps, and then we can use the **pass-pwned** plugin to do it for us: - - 1. Create a hash value of your password. A hash value is just a way of turning arbitrary data—your password—into a fixed data representation—the hash value. A cryptographic hash function is collision-resistant, meaning it creates a unique hash value for every input. The algorithm used for the hash is a one-way transformation, which makes it hard to know the input value if you only have the hash value. For example, using the SHA-1 algorithm that HIBP uses, the password **hunter2** becomes **F3BBBD66A63D4BF1747940578EC3D0103530E21D**. - 2. Send the first five characters (**F3BBB** in our example) to the site, and the site will send back a list of all the hash values that start with those five characters. This way, the site can't know which hash values you are interested in. The k-Anonymity process ensures there is so much statistical noise that it is hard for a compromised site to determine which password you inquired about. For example, our query returns a list of 527 potential matches from HIBP. - 3. Search through the list of results to see if your hash is there. If it is, your password has been compromised. If it isn't, the password isn't in a publicly known data breach. HIBP returns a bonus in its data: a count of how many times the password has been seen in data breaches. Astoundingly, **hunter2** has been seen 17,043 times! - - - -### Check password security with pass - -I use [**pass**][9], a [GNU Privacy Guard][10]-based password manager. It has many extensions, which are available on the [**pass** website][11] and as a separately maintained [awesome-style list][12]. One of these extensions is [**pass-pwned**][13], which will check your passwords with HIBP. Both **pass** and **pass-pwned** are packaged for Fedora 29, 30, and Rawhide. You can install the extension with: - - -``` -`sudo dnf install pass pass-pwned` -``` - -or you can follow the manual instructions on their respective websites. - -If you're just getting started with **pass**, read [Managing passwords the open source way][14] for a great overview. - -The following will quickly set up **pass** and check a stored password. This example assumes you already have a GPG key. - - -``` -# Setup a pass password store -$ pass init <GPG key email> - -# Add the password, "hunter2" to the store -$ pass insert awesome-site.com - -# Install the pass-pwned extension -# Download the bash script from the upstream and then review it -$ mkdir ~/.password-store/.extensions -$ wget -O ~/.password-store/.extensions/pwned.bash -$ vim ~/.password-store/.extensions/pwned.bash - -# If everything is OK, set it executable and enable pass extensions -$ chmod u+x ~/.password-store/.extensions/pwned.bash -$ echo 'export PASSWORD_STORE_ENABLE_EXTENSIONS="true"' >> ~/.bash_profile -$ source ~/.bash_profile - -# Check the password -$ pass pwned awesome-site.com -Password found in haveibeenpwned 17043 times - -# Change this password to something randomly generated and verify it -$ pass generate -i awesoem-site.com -The generated password for awesome-site.com is: -<REDACTED> -$ pass pwned awesome-site.com -Password not found in haveibeenpwned -``` - -Congratulations, your password is now more secure than it was before! You can also [use wildcards to check multiple passwords][15] at once. - -Periodically checking for password compromise is an excellent way to help ward off most attackers in most threat models. If your password management system doesn't make it this easy, you may want to upgrade to something like **pass**. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/6/check-passwords - -作者:[Brian "bex" Exelbierd][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/bexelbie/users/jason-baker/users/admin/users/mtsouk -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/password.jpg?itok=ec6z6YgZ (Password lock) -[2]: https://ssd.eff.org/en/module/your-security-plan -[3]: https://en.wikipedia.org/wiki/Dictionary_attack -[4]: https://www.troyhunt.com/ -[5]: https://haveibeenpwned.com/ -[6]: https://www.troyhunt.com/were-baking-have-i-been-pwned-into-firefox-and-1password/ -[7]: https://pages.nist.gov/800-63-FAQ/#q-b5 -[8]: https://blog.cloudflare.com/validating-leaked-passwords-with-k-anonymity/ -[9]: https://www.passwordstore.org/ -[10]: https://gnupg.org/ -[11]: https://www.passwordstore.org/#extensions -[12]: https://github.com/tijn/awesome-password-store -[13]: https://github.com/alzeih/pass-pwned -[14]: https://opensource.com/life/14/7/managing-passwords-open-source-way -[15]: https://github.com/alzeih/pass-pwned/issues/3 diff --git a/sources/tech/20190624 How to Install and Configure KVM on RHEL 8.md b/sources/tech/20190624 How to Install and Configure KVM on RHEL 8.md deleted file mode 100644 index 3021561dd8..0000000000 --- a/sources/tech/20190624 How to Install and Configure KVM on RHEL 8.md +++ /dev/null @@ -1,256 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Install and Configure KVM on RHEL 8) -[#]: via: (https://www.linuxtechi.com/install-configure-kvm-on-rhel-8/) -[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) - -How to Install and Configure KVM on RHEL 8 -====== - -**KVM** is an open source virtualization technology which converts your Linux machine into a type-1 bare-metal hypervisor that allows you to run multiple virtual machines (VMs) or guest VMs - - - -KVM stands for **Kernel based Virtual machine**, as the name suggests KVM is a kernel module, once it is loaded into the kernel , then your Linux machine will start working as a KVM hypervisor. In this article we will demonstrate how to install KVM on RHEL 8 system but before start installing KVM on your RHEL 8 system first we have to make sure that your system’s processor supports hardware virtualization extensions like **Intel VT** or **AMD-V** and enabled it from BIOS. - -**RHEL 8 KVM Lab Details:** - - * OS = RHEL 8 - * Hostname = rhel8-kvm - * Ethernet Cards = ens32 –  192.168.1.4 & ens36 – 192.168..1.12 - * RAM = 4 GB - * CPU = 2 - * Disk = 40 GB Free Space (/var/libvirtd) - - - -Let’s Jump into the KVM installation steps - -### Step:1) Verify Hardware Virtualization is enabled or not - -Open the terminal and execute the beneath egrep command - -``` -[root@linuxtechi ~]# egrep -c '(vmx|svm)' /proc/cpuinfo -2 -[root@linuxtechi ~]# -``` - -If output of above egrep command is equal to 1 or more than 1 then this confirms that hardware virtualization is enabled and supported. - -Alternate way to check whether hardware virtualization is enabled or not , execute the beneath command, - -``` -[root@linuxtechi ~]# lscpu | grep Virtualization: -Virtualization: VT-x -[root@linuxtechi opt]# -``` - -If there is no output in above command then it confirms that Virtualization is not enabled from BIOS. - -**Note:** To enable hardware virtualization reboot your system, go to bios settings and then look for Intel VT or AMD virtualization option and enable one of this option which which suits to your system architecture. - -### Step:2) Install KVM and its dependent packages using dnf - -Run the following dnf command to install KVM and its dependent packages, - -``` -[root@linuxtechi ~]# dnf install qemu-kvm qemu-img libvirt virt-install libvirt-client virt-manager -y -``` - -Once above packages has been installed successfully, then run the below command to confirm whether KVM module has been loaded into the kernel or not, - -``` -root@linuxtechi ~]# lsmod | grep -i kvm -kvm_intel 245760 0 -kvm 745472 1 kvm_intel -irqbypass 16384 1 kvm -[root@linuxtechi ~]# -``` - -### Step:3) Enable and Start libvirtd service - -Run the following systemctl command to enable and start libvirtd service, - -``` -[root@linuxtechi ~]# systemctl enable libvirtd -[root@linuxtechi ~]# systemctl start libvirtd -``` - -### Step:4) Create Network bridge and attach Interface to it  - -In RHEL 8, network scripts are deprecated, We have to use Network Manager (nmcli / nmtui) to configure network and network bridges. - -I have two Ethernet cards on my server, ens36 will attached to bridge br0 and ens32 will be used for management . - -``` -[root@linuxtechi ~]# nmcli connection show -NAME UUID TYPE DEVICE -ens32 1d21959d-e2ea-4129-bb89-163486c8d7bc ethernet ens32 -ens36 1af408b6-c98e-47ce-bca7-5141b721f8d4 ethernet ens36 -virbr0 d0f05de4-4b3b-4710-b904-2524b5ad11bf bridge virbr0 -[root@linuxtechi ~]# -``` - -Delete the existing connection of interface “ens36” - -``` -[root@linuxtechi ~]# nmcli connection delete ens36 -Connection 'ens36' (1af408b6-c98e-47ce-bca7-5141b721f8d4) successfully deleted. -[root@linuxtechi ~]# -``` - -Create a Network Bridge with name “**br0**” using mcli command, - -``` -[root@linuxtechi ~]# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0 -Connection 'br0' (62c14e9d-3e72-41c2-8ecf-d17978ad02da) successfully added. -[root@linuxtechi ~]# -``` - -Assign the same IP of ens36 to the bridge interface using following nmcli commands, - -``` -[root@linuxtechi ~]# nmcli connection modify br0 ipv4.addresses 192.168.1.12/24 ipv4.method manual -[root@linuxtechi ~]# nmcli connection modify br0 ipv4.gateway 192.168.1.1 -[root@linuxtechi ~]# nmcli connection modify br0 ipv4.dns 192.168.1.1 -``` - -Add ens36 interface as bridge salve to the network bridge br0, - -``` -[root@linuxtechi ~]# nmcli connection add type bridge-slave autoconnect yes con-name ens36 ifname ens36 master br0 -Connection 'ens36' (0c2065bc-ad39-47a7-9a3e-85c80cd73c94) successfully added. -[root@linuxtechi ~]# -``` - -Now bring up the network bridge using beneath nmcli command, - -``` -[root@linuxtechi ~]# nmcli connection up br0 -Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/9) -[root@linuxtechi ~]# -``` - -Verify the connections using following command, - -``` -[root@linuxtechi ~]# nmcli connection show -NAME UUID TYPE DEVICE -br0 00bcff8f-af85-49ad-9196-974de2d9d9d1 bridge br0 -ens32 1d21959d-e2ea-4129-bb89-163486c8d7bc ethernet ens32 -ens36 eaef13c9-c24e-4a3f-ae85-21bf0610471e ethernet ens36 -virbr0 d0f05de4-4b3b-4710-b904-2524b5ad11bf bridge virbr0 -[root@linuxtechi ~]# -``` - -View the bridge (br0) details and status using ip command, - -![rhel-8-bridge-details][1] - -**Note:** If you want to use network-scripts in RHEL 8 system then install network-scripts packages, - -``` -~ ]# dnf install network-scripts -y -``` - -### Step:5) Creating and Managing KVM Virtual Machines - -In RHEL 8 there are different ways to create and manage KVM virtual machines, - - * virt-manager (GUI) - * Command Line tools (**virt-install** & **virsh**) - - - -During the KVM installation we have already installed virt-manager and virt-install packages. - -### Creating Virtual Machines using virt-manager GUI tool: - -Run the virt-manager command from command line or Access virt-manager from RHEL 8 Desktop - -[![Access-Virt-Manager-RHEL8][2]][3] - -Click on Monitor Icon to create a new guest VM (Virtual Machine), - -Choose Local Installation Media as ISO, - -[![Choose-ISO-KVM-RHEL8][4]][5] - -Click on forward, - -In the next screen, browse the OS installation ISO file , in my case i have placed Ubuntu 18.04 LTS server ISO file under /opt folder, - -[![Installation-ISO-File-RHEL8-KVM][6]][7] - -click on Forward to Proceed further, - -In the next window you will be prompted to specify RAM and vCPU for your virtual machine, so specify the values that suits your installation and then click on Forward, - -[![Specify-RAM-CPU-KVM-RHEL8][8]][9] - -In next window specify disk size for your Virtual Machine and the click on Forward, in my case i am giving disk space for my VM as 20 GB, - -[![Disk-Image-RHEL8-KVM-VM][10]][11] - -In the next window, specify the name of VM and choose the Network that you want to attach to VM’s Ethernet card, as we had created network bridge “br0” for vms networking, so choose bridge“br0”. - -[![Network-Selection-KVM-RHEL8][12]][13] - -Click on Finish to proceed with VM creation and its OS installation, - -[![OS-Installation-KVM-VM-RHEL8][14]][15] - -Follow the screen Instructions and complete the Installation. - -**Creating KVM Virtual Machine from Command Line** - -if you are fan of command line then there is a command line tool for you called “**virt-install**” to create virtual machines. Once the Virtual machines are provisioned then vms can be managed via command line tool “[virsh][16]“. - -Let’s assume we want to create CentOS 7 VM using virt-install, i have already placed CentOS 7 ISO file under /opt folder, - -Execute beneath command to provision a VM - -``` -[root@linuxtechi ~]# virt-install -n CentOS7-Server --description "CentOS 7 Virtual Machine" --os-type=Linux --os-variant=rhel7 --ram=1096 --vcpus=1 --disk path=/var/lib/libvirt/images/centos7-server.img,bus=virtio,size=20 --network bridge:br0 --graphics none --location /opt/CentOS-7-x86_64-DVD-1511.iso --extra-args console=ttyS0 -``` - -Output of command would be something like below, - -![Virt-Install-KVM-RHEL8][17] - -Follow screen instructions to complete CentOS 7 Installation. That’s all from this tutorial, i hope these steps helped you to setup KVM on your RHEL 8 system, please do share your feedback and comments. - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/install-configure-kvm-on-rhel-8/ - -作者:[Pradeep Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/pradeep/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/wp-content/uploads/2019/06/rhel-8-bridge-details-1024x628.jpg -[2]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Access-Virt-Manager-RHEL8-1024x471.jpg -[3]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Access-Virt-Manager-RHEL8.jpg -[4]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Choose-ISO-KVM-RHEL8-1024x479.jpg -[5]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Choose-ISO-KVM-RHEL8.jpg -[6]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Installation-ISO-File-RHEL8-KVM-1024x477.jpg -[7]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Installation-ISO-File-RHEL8-KVM.jpg -[8]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Specify-RAM-CPU-KVM-RHEL8-1024x478.jpg -[9]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Specify-RAM-CPU-KVM-RHEL8.jpg -[10]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Disk-Image-RHEL8-KVM-VM-1024x483.jpg -[11]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Disk-Image-RHEL8-KVM-VM.jpg -[12]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Network-Selection-KVM-RHEL8-1024x482.jpg -[13]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Network-Selection-KVM-RHEL8.jpg -[14]: https://www.linuxtechi.com/wp-content/uploads/2019/06/OS-Installation-KVM-VM-RHEL8-1024x479.jpg -[15]: https://www.linuxtechi.com/wp-content/uploads/2019/06/OS-Installation-KVM-VM-RHEL8.jpg -[16]: https://www.linuxtechi.com/create-revert-delete-kvm-virtual-machine-snapshot-virsh-command/ -[17]: https://www.linuxtechi.com/wp-content/uploads/2019/06/Virt-Install-KVM-RHEL8.jpg diff --git a/sources/tech/20190625 The cost of JavaScript in 2019 - V8.md b/sources/tech/20190625 The cost of JavaScript in 2019 - V8.md deleted file mode 100644 index e21eefd5ad..0000000000 --- a/sources/tech/20190625 The cost of JavaScript in 2019 - V8.md +++ /dev/null @@ -1,178 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The cost of JavaScript in 2019 · V8) -[#]: via: (https://v8.dev/blog/cost-of-javascript-2019) -[#]: author: (Addy Osmani https://twitter.com/addyosmani) - -The cost of JavaScript in 2019 · V8 -====== -**Note:** If you prefer watching a presentation over reading articles, then enjoy the video below! If not, skip the video and read on. - -[“The cost of JavaScript”][1] as presented by Addy Osmani at #PerfMatters Conference 2019. - -One large change to [the cost of JavaScript][2] over the last few years has been an improvement in how fast browsers can parse and compile script. **In 2019, the dominant costs of processing scripts are now download and CPU execution time.** - -User interaction can be delayed if the browser’s main thread is busy executing JavaScript, so optimizing bottlenecks with script execution time and network can be impactful. - -### Actionable high-level guidance # - -What does this mean for web developers? Parse & compile costs are **no longer as slow** as we once thought. The three things to focus on for JavaScript bundles are: - - * **Improve download time** - * Keep your JavaScript bundles small, especially for mobile devices. Small bundles improve download speeds, lower memory usage, and reduce CPU costs. - * Avoid having just a single large bundle; if a bundle exceeds ~50–100 kB, split it up into separate smaller bundles. (With HTTP/2 multiplexing, multiple request and response messages can be in flight at the same time, reducing the overhead of additional requests.) - * On mobile you’ll want to ship much less especially because of network speeds, but also to keep plain memory usage low. - * **Improve execution time** - * Avoid [Long Tasks][3] that can keep the main thread busy and can push out how soon pages are interactive. Post-download, script execution time is now a dominant cost. - * **Avoid large inline scripts** (as they’re still parsed and compiled on the main thread). A good rule of thumb is: if the script is over 1 kB, avoid inlining it (also because 1 kB is when [code caching][4] kicks in for external scripts). - - - -### Why does download and execution time matter? # - -Why is it important to optimize download and execution times? Download times are critical for low-end networks. Despite the growth in 4G (and even 5G) across the world, our [effective connection types][5] remain inconsistent with many of us running into speeds that feel like 3G (or worse) when we’re on the go. - -JavaScript execution time is important for phones with slow CPUs. Due to differences in CPU, GPU, and thermal throttling, there are huge disparities between the performance of high-end and low-end phones. This matters for the performance of JavaScript, as execution is CPU-bound. - -In fact, of the total time a page spends loading in a browser like Chrome, anywhere up to 30% of that time can be spent in JavaScript execution. Below is a page load from a site with a pretty typical workload (Reddit.com) on a high-end desktop machine:![][6]JavaScript processing represents 10–30% of time spent in V8 during page load. - -On mobile, it takes 3–4× longer for a median phone (Moto G4) to execute Reddit’s JavaScript compared to a high-end device (Pixel 3), and over 6× as long on a low-end device (the <$100 Alcatel 1X):![][7]The cost of Reddit’s JavaScript across a few different device classes (low-end, average, and high-end) - -**Note:** Reddit has different experiences for desktop and mobile web, and so the MacBook Pro results cannot be compared to the other results. - -When you’re trying to optimize JavaScript execution time, keep an eye out for [Long Tasks][8] that might be monopolizing the UI thread for long periods of time. These can block critical tasks from executing even if the page looks visually ready. Break these up into smaller tasks. By splitting up your code and prioritizing the order in which it is loaded, you can get pages interactive faster and hopefully have lower input latency.![][9]Long tasks monopolize the main thread. You should break them up. - -### What has V8 done to improve parse/compile? # - -Raw JavaScript parsing speed in V8 has increased 2× since Chrome 60. At the same time, raw parse (and compile) cost has become less visible/important due to other optimization work in Chrome that parallelizes it. - -V8 has reduced the amount of parsing and compilation work on the main thread by an average of 40% (e.g. 46% on Facebook, 62% on Pinterest) with the highest improvement being 81% (YouTube), by parsing and compiling on a worker thread. This is in addition to the existing off-main-thread streaming parse/compile.![][10]V8 parse times across different versions - -We can also visualize the CPU time impact of these changes across different versions of V8 across Chrome releases. In the same amount of time it took Chrome 61 to parse Facebook’s JS, Chrome 75 can now parse both Facebook’s JS AND 6 times Twitter’s JS.![][11]In the time it took Chrome 61 to parse Facebook’s JS, Chrome 75 can now parse both Facebook’s JS and 6 times Twitter’s JS. - -Let’s dive into how these changes were unlocked. In short, script resources can be streaming-parsed and-compiled on a worker thread, meaning: - - * V8 can parse+compile JavaScript without blocking the main thread. - * Streaming starts once the full HTML parser encounters a ` -``` - -_editor_url_  is a link to document editors. - -A button to open each file for viewing: - -``` - -``` - -Now we need to add a div with  _id_ , in which the document editor will be opened: - -``` -
            -``` - -To open the editor, we have to call a function: - -``` - -``` - -There are two arguments for the DocEditor function: id of the element where the editors will be opened and a JSON with the editors’ settings. -In this example, the following mandatory parameters are used: - - * _documentType_ is identified by its format (.docx, .xlsx, .pptx for texts, spreadsheets and presentations accordingly) - * _document.url_ is the link to the file you are going to open. - * _editorConfig.mode_. - - - -We can also add _title_ that will be displayed in the editors. - -So, now we have everything to view docs in our Python app. - -**3\. How to edit docs in ONLYOFFICE within the Python App** -First of all, add the “Edit” button: - -``` - -``` - -Then create a new function that will open files for editing. It is similar to the View function. -Now we have 3 functions: - -``` - -``` - -_destroyEditor_  is called to close an open editor. -As you might notice, the _editorConfig_ parameter is absent from the _edit()_ function, because it has by default the value * {“mode”: “edit”}.* - -Now we have everything to open docs for co-editing in your Python app. - -**4\. How to co-edit docs in ONLYOFFICE within the Python App** -Co-editing is implemented by using the same document.key for the same document in the editors’ settings. Without this key, the editors will create the editing session each time you open the file. - -Set unique keys for each doc to make users connect to the same editing session for co-editing. The format of the key should be the following:  _filename + “_key”_. The next step is to add it to all of the configs where document is present. - -``` -document: { -url: "host_url" + '/' + filepath, -title: filename, -key: filename + '_key' -}, -``` - -**5\. How to save docs in ONLYOFFICE within the Python App** -Every time we change and save the file, ONLYOFFICE stores all its versions. Let’s see closely how it works. After we close the editor, Document Server builds the file version to be saved and sends the request to callbackUrl address. This request contains document.key and the link to the just built file. -document.key is used to find the old version of the file and replace it with the new one. As we do not have any database here, we just send the filename using callbackUrl. -Specify _callbackUrl_ parameter in the setting in _editorConfig.callbackUrl_ and add it to the _edit()method_: - -``` -function edit(filename) { -const filepath = 'files/' + filename; -if (editor) { -editor.destroyEditor() -} -editor = new DocsAPI.DocEditor("editor", -{ -documentType: get_file_type(filepath), -document: { -url: "host_url" + '/' + filepath, -title: filename, -key: filename + '_key' -} -, -editorConfig: { -mode: 'edit', -callbackUrl: "host_url" + '/callback' + '&filename=' + filename // add file name as a request parameter -} -}); -} -``` - -Write a method that will save file after getting the POST request to* /callback* address: - -``` -@post("/callback") # processing post requests for /callback -def callback(): -if request.json['status'] == 2: -file = requests.get(request.json['url']).content -with open('files/' + request.query['filename'], 'wb') as f: -f.write(file) -return "{\"error\":0}" -``` - -* # status 2*  is the built file. - -When we close the editor, the new version of the file will be saved to storage. - -**6\. How to manage users in ONLYOFFICE within the Python App** -If there are users in your app, and you need to see who exactly is editing a doc, write their identifiers (id and name) in the editors’ configuration. -Add the ability to select a user in the interface: - -``` - -``` - -If you add the call of the function *pick_user()*at the beginning of the tag _<script>_, it will initialize, in the function itself, the variables responsible for the id and the user name. - -``` -function pick_user() { -const user_selector = document.getElementById("user_selector"); -this.current_user_name = user_selector.options[user_selector.selectedIndex].text; -this.current_user_id = user_selector.options[user_selector.selectedIndex].value; -} -``` - -Make use of _editorConfig.user.id_ and  _editorConfig.user.name_ to configure user’s settings. Add these parameters to the editors’ configuration in the file editing function. - -``` -function edit(filename) { -const filepath = 'files/' + filename; -if (editor) { -editor.destroyEditor() -} -editor = new DocsAPI.DocEditor("editor", -{ -documentType: get_file_type(filepath), -document: { -url: "host_url" + '/' + filepath, -title: filename -}, -editorConfig: { -mode: 'edit', -callbackUrl: "host_url" + '/callback' + '?filename=' + filename, -user: { -id: this.current_user_id, -name: this.current_user_name -} -} -}); -} -``` - -Using this approach, you can integrate ONLYOFFICE editors into your app written in Python and get all the necessary tools for working and collaborating on docs. For more integration examples (Java, Node.js, PHP, Ruby), please, refer to the official [_API documentation_][5]. - -**By: Maria Pashkina** - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/09/integrate-online-documents-editors-into-a-python-web-app-using-onlyoffice/ - -作者:[Aashima Sharma][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/aashima-sharma/ -[b]: https://github.com/lujun9972 -[1]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2016/09/Typist-composing-text-in-laptop.jpg?resize=696%2C420&ssl=1 (Typist composing text in laptop) -[2]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2016/09/Typist-composing-text-in-laptop.jpg?fit=900%2C543&ssl=1 -[3]: https://www.onlyoffice.com/en/ -[4]: https://www.onlyoffice.com/en/developer-edition.aspx -[5]: https://api.onlyoffice.com/editors/basic diff --git a/sources/tech/20190925 Mutation testing by example- Execute the test.md b/sources/tech/20190925 Mutation testing by example- Execute the test.md deleted file mode 100644 index 2706e6dae1..0000000000 --- a/sources/tech/20190925 Mutation testing by example- Execute the test.md +++ /dev/null @@ -1,163 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Mutation testing by example: Execute the test) -[#]: via: (https://opensource.com/article/19/9/mutation-testing-example-execute-test) -[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzic) - -Mutation testing by example: Execute the test -====== -Use the logic created so far in this series to implement functioning -code, then use failure and unit testing to make it better. -![A cat.][1] - -The [second article][2] in this series demonstrated how to implement the logic for determining whether it's daylight or nighttime in a home automation system (HAS) application that controls locking and unlocking a cat door. This third article explains how to write code to use that logic in an application that locks a door at night and unlocks it during daylight hours. - -As a reminder, set yourself up to follow along using the .NET xUnit.net testing framework by following the [instructions here][3]. - -### Disable the cat trap door during nighttime - -Assume the cat door is a sophisticated Internet of Things (IoT) product that has an IP address and can be accessed by sending a request to its API. For the sake of brevity, this series doesn't go into how to program an IoT device; rather, it simulates the service to keep the focus on test-driven development (TDD) and mutation testing. - -Start by writing a failing unit test: - - -``` -[Fact] -public void GivenNighttimeDisableTrapDoor() { -   var expected = "Cat trap door disabled"; -   var timeOfDay = dayOrNightUtility.GetDayOrNight(nightHour); -   var actual = catTrapDoor.Control(timeOfDay); -   Assert.Equal(expected, actual); -} -``` - -This describes a brand new component or service (**catTrapDoor**). That component (or service) has the capability to control the trap door given the current time. Now it's time to implement **catTrapDoor**. - -To simulate this service, you must first describe its capabilities by using the interface. Create a new file in the app folder and name it **ICatTrapDoor.cs** (by convention, an interface name starts with an uppercase letter **I**). Add the following code to that file: - - -``` -namespace app{ -   public interface ICatTrapDoor { -       string Control(string dayOrNight); -   } -} -``` - -This interface is not capable of functioning. It merely describes your intention when building the **CatTrapDoor** service. Interfaces are a nice way to create abstractions of the services you are working with. In a way, you could regard this interface as an API of the **CatTrapDoor** service. - -To implement the API, create a new file in the app folder and name it **FakeCatTrapDoor.cs**. Enter the following code into the class file: - - -``` -namespace app{ -   public class FakeCatTrapDoor : ICatTrapDoor { -       public string Control(string dayOrNight) { -           string trapDoorStatus = "Undetermined"; -           if(dayOrNight == "Nighttime") { -               trapDoorStatus = "Cat trap door disabled"; -           } - -           return trapDoorStatus; -       } -   } -} -``` - -This new **FakeCatTrapDoor** class implements the interface **ICatTrapDoor**. Its method **Control** accepts string value **dayOrNight** and checks whether the value passed in is "Nighttime." If it is, it modifies **trapDoorStatus** from "Undetermined" to "Cat trap door disabled" and returns that value to the calling client. - -Why is it called **FakeCatTrapDoor**? Because it's not a representation of the real cat trap door. The fake just helps you work out the processing logic. Once your logic is airtight, the fake service is replaced with the real service (this topic is reserved for the discipline of integration testing). - -With everything implemented, all the unit tests pass when they run: - - -``` -Starting test execution, please wait... - -Total tests; 3. Passed: 3. failed: 0. Skipped: 0. -Test Run Successful. -Test execution time: 1.3913 Seconds -``` - -### Enable the cat trap door during daytime - -It's time to look at the next scenario in our user story: - -> _Scenario #2: Enable cat trap door during daylight_ -> -> * Given that the clock detects the daylight -> * When the clock notifies the HAS -> * Then the HAS enables the cat trap door -> - - -This should be easy, just the flip side of the first scenario. First, write the failing test. Add the following unit test to your **UnitTest1.cs** file in the **unittest** folder: - - -``` -[Fact] -public void GivenDaylightEnableTrapDoor() { -   var expected = "Cat trap door enabled"; -   var timeOfDay = dayOrNightUtility.GetDayOrNight(dayHour); -   var actual = catTrapDoor.Control(timeOfDay); -   Assert.Equal(expected, actual); -} -``` - -You can expect to receive a "Cat trap door enabled" notification when sending the "Daylight" status to **catTrapDoor** service. When you run unit tests, you see the result you expect, which fails as expected: - - -``` -Starting test execution, please wait... -[Xunit unittest.UnitTest1.UnitTest1.GivenDaylightEnableTrapDoor [FAIL] -Failed unittest.UnitTest1.UnitTest1.GivenDaylightEnableTrapDoor -[...] -``` - -The unit test expected to receive a "Cat trap door enabled" notification but instead was notified that the cat trap door status is "Undetermined." Cool; now's the time to fix this minor failure. - -Adding three lines of code to the **FakeCatTrapDoor** does the trick: - - -``` -if(dayOrNight == "Daylight") { -   trapDoorStatus = "Cat trap door enabled"; -} -``` - -Run the unit tests again, and all tests pass: - - -``` -Starting test execution, please wait... - -Total tests: 4. Passed: 4. Failed: 0. Skipped: 0. -Test Run Successful. -Test execution time: 2.4888 Seconds -``` - -Awesome! Everything looks good, all the unit tests are in green, you have a rock-solid solution. Thank you, TDD! - -### Not so fast! - -Experienced engineers would not be convinced that the solution is rock-solid. Why? Because the solution hasn't been mutated yet. To dive deeply into what mutation is and why it's important, be sure to read the final article in this series. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/9/mutation-testing-example-execute-test - -作者:[Alex Bunardzic][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/alex-bunardzic -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cat_pet_animal.jpg?itok=HOrVTfBZ (A cat.) -[2]: https://opensource.com/article/19/9/mutation-testing-example-part-2-failure-experimentation -[3]: https://opensource.com/article/19/8/mutation-testing-evolution-tdd diff --git a/sources/tech/20190926 3 open source social platforms to consider.md b/sources/tech/20190926 3 open source social platforms to consider.md deleted file mode 100644 index dddde6dc77..0000000000 --- a/sources/tech/20190926 3 open source social platforms to consider.md +++ /dev/null @@ -1,76 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (3 open source social platforms to consider) -[#]: via: (https://opensource.com/article/19/9/open-source-social-networks) -[#]: author: (Jaouhari Youssef https://opensource.com/users/jaouharihttps://opensource.com/users/danarelhttps://opensource.com/users/osmomjianhttps://opensource.com/users/dff) - -3 open source social platforms to consider -====== -A photo-sharing platform, a privacy-friendly social network, and a web -application for building and sharing portfolios. -![Hands holding a mobile phone with open on the screen][1] - -It is no mystery why modern social media platforms were designed to be addictive: the more we consult them, the more data they have to fuel them—which enables them to grow smarter and bigger and more powerful. - -The massive, global interest in these platforms has created the attention economy, and people's focused mental engagement is the new gold in the age of information abundance. As economist, political scientist, and cognitive psychologist Herbert A. Simon said in [_Designing organizations for an information-rich world_][2], "the wealth of information means a dearth of something else: a scarcity of whatever it is that information consumes." And information consumes our attention, a resource we only have so much of it. - -According to [GlobalWebIndex][3], we are now spending an average of 142 minutes on social media and messaging platforms daily, 63% more than the 90 minutes we spent on these platforms just seven years ago. This can be explained by the fact that these platforms have grown more intelligent over time by studying the minds and behaviors of users and applying those findings to boost their appeal. - -Of relevance here is the psychological concept [variable-ratio schedule][4], which gives rewards after an average number of responses but on an unpredictable schedule. One example is slot machines, which may provide a reward an average of every five games, but the players don't know the specific number of games (one, two, seven, or even 15) they must play before obtaining a reward. This schedule leads to a high response rate and strong engagement. - -Knowing all of this, what can we do to make things better and loosen the grip social networks have on us and our data? I suggest the answer is migrating to open source social platforms, which I believe consider the humane aspect of technology more than private companies do. Here are three open source social platforms to consider. - -### Pixelfed - -[Pixelfed][5] is a photo-sharing platform that is ad-free and privacy-focused, which means no third party is making a profit from your data. Posts are in chronological order, which means there is no algorithm making distinctions between content. - -To join the network, you can pick one of the servers on the [list of instances][6], or you can [install and run][7] your own Pixelfed instance. - -Once you are set up, you can connect with other Pixelfed instances. This is known as federation, which means many instances of a software (in this case, Pixelfed) share data (in this case, pictures). When you federate with another instance of Pixelfed, you can see and interact with pictures posted to other accounts. - -The project is ongoing and needs the community's support to grow. Check [Pixelfed's GitHub][8] page for more information about contributing. - -### Okuna - -[Okuna][9] is an open source, privacy-friendly social network. It is committed to being a positive influence on society and the environment, plus it donates 30% of its profits to worthy causes. - -### Mahara - -[Mahara][10] is an open source web application for building and sharing electronic portfolios. (The word _mahara_ is Māori for _memory_ or _thoughtful consideration_.) With Mahara, you can create a meaningful and verifiable professional profile, but all your data belongs to you rather than a corporate sponsor. It is customizable and can be integrated into other web services. - -You can try Mahara on its [demo site][11]. - -### Engage for change - -If you want to know more about the impact of the attention economy on our lives and engage for positive change, take a look at the [Center for Humane Technology][12], an organization trying to temper the attention economy and make technology more humane. Its aim is to spur change that will protect human vulnerabilities from being exploited and therefore build a better society. - -As Sonya Parker said, "whatever you focus your attention on will become important to you even if it's unimportant." So let's focus our attention on building a better world for all. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/9/open-source-social-networks - -作者:[Jaouhari Youssef][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jaouharihttps://opensource.com/users/danarelhttps://opensource.com/users/osmomjianhttps://opensource.com/users/dff -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolserieshe_rh_041x_0.png?itok=tfg6_I78 (Hands holding a mobile phone with open on the screen) -[2]: https://digitalcollections.library.cmu.edu/awweb/awarchive?type=file&item=33748 -[3]: https://www.digitalinformationworld.com/2019/01/how-much-time-do-people-spend-social-media-infographic.html -[4]: https://dictionary.apa.org/variable-ratio-schedule -[5]: https://pixelfed.org/ -[6]: https://pixelfed.org/join -[7]: https://docs.pixelfed.org/installing-pixelfed/ -[8]: https://github.com/pixelfed/pixelfed -[9]: https://www.okuna.io/en/home -[10]: https://mahara.org/ -[11]: https://demo.mahara.org/ -[12]: https://humanetech.com/problem/ diff --git a/sources/tech/20190926 Mutation testing by example- Evolving from fragile TDD.md b/sources/tech/20190926 Mutation testing by example- Evolving from fragile TDD.md deleted file mode 100644 index 4ce6e23232..0000000000 --- a/sources/tech/20190926 Mutation testing by example- Evolving from fragile TDD.md +++ /dev/null @@ -1,258 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Mutation testing by example: Evolving from fragile TDD) -[#]: via: (https://opensource.com/article/19/9/mutation-testing-example-definition) -[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzichttps://opensource.com/users/alex-bunardzichttps://opensource.com/users/marcobravo) - -Mutation testing by example: Evolving from fragile TDD -====== -Test-driven development is not enough for delivering lean code that -works exactly to expectations. Mutation testing is a powerful step -forward. Here's what that looks like. -![Binary code on a computer screen][1] - -The [third article][2] in this series demonstrated how to use failure and unit testing to develop better code. - -While it seemed that the journey was over with a successful sample Internet of Things (IoT) application to control a cat door, experienced programmers know that solutions need _mutation_. - -### What's mutation testing? - -Mutation testing is the process of iterating through each line of implemented code, mutating that line, then running unit tests and checking if the mutation broke the expectations. If it hasn't, you have created a surviving mutant. - -Surviving mutants are always an alarming issue that points to potentially risky areas in a codebase. As soon as you catch a surviving mutant, you must kill it. And the only way to kill a surviving mutant is to create additional descriptions—new unit tests that describe your expectations regarding the output of your function or module. In the end, you deliver a lean, mean solution that is airtight and guarantees no pesky bugs or defects are lurking in your codebase. - -If you leave surviving mutants to kick around and proliferate, live long, and prosper, then you are creating the much dreaded technical debt. On the other hand, if any unit test complains that the temporarily mutated line of code produces output that's different from the expected output, the mutant has been killed. - -### Installing Stryker - -The quickest way to try mutation testing is to leverage a dedicated framework. This example uses [Stryker][3]. - -To install Stryker, go to the command line and run: - - -``` -`$ dotnet tool install -g dotnet-stryker` -``` - -To run Stryker, navigate to the **unittest** folder and type: - - -``` -`$ dotnet-stryker` -``` - -Here is Stryker's report on the quality of our solution: - - -``` -14 mutants have been created. Each mutant will now be tested, this could take a while. - -Tests progress | 14/14 | 100% | ~0m 00s | -Killed : 13 -Survived : 1 -Timeout : 0 - -All mutants have been tested, and your mutation score has been calculated -\- \app [13/14 (92.86%)] -[...] -``` - -The report says: - - * Stryker created 14 mutants - * Stryker saw 13 mutants were killed by the unit tests - * Stryker saw one mutant survive the onslaught of the unit tests - * Stryker calculated that the existing codebase contains 92.86% of code that serves the expectations - * Stryker calculated that 7.14% of the codebase contains code that does not serve the expectations - - - -Overall, Stryker claims that the application assembled in the first three articles in this series failed to produce a reliable solution. - -### How to kill a mutant - -When software developers encounter surviving mutants, they typically reach for the implemented code and look for ways to modify it. For example, in the case of the sample application for cat door automation, change the line: - - -``` -`string trapDoorStatus = "Undetermined";` -``` - -to: - - -``` -`string trapDoorStatus = "";` -``` - -and run Stryker again. A mutant has survived: - - -``` -All mutants have been tested, and your mutation score has been calculated -\- \app [13/14 (92.86%)] -[...] -[Survived] String mutation on line 4: '""' ==> '"Stryker was here!"' -[...] -``` - -This time, you can see that Stryker mutated the line: - - -``` -`string trapDoorStatus = "";` -``` - -into: - - -``` -`string trapDoorStatus = ""Stryker was here!";` -``` - -This is a great example of how Stryker works: it mutates every line of our code, in a smart way, in order to see if there are further test cases we have yet to think about. It's forcing us to consider our expectations in greater depth. - -Defeated by Stryker, you can attempt to improve the implemented code by adding more logic to it: - - -``` -public string Control(string dayOrNight) { -   string trapDoorStatus = "Undetermined"; -   if(dayOrNight == "Nighttime") { -       trapDoorStatus = "Cat trap door disabled"; -   } else if(dayOrNight == "Daylight") { -       trapDoorStatus = "Cat trap door enabled"; -   } else { -       trapDoorStatus = "Undetermined"; -   } -   return trapDoorStatus; -} -``` - -But after running Stryker again, you see this attempt created a new mutant: - - -``` -ll mutants have been tested, and your mutation score has been calculated -\- \app [13/15 (86.67%)] -[...] -[Survived] String mutation on line 4: '"Undetermined"' ==> '""' -[...] -[Survived] String mutation on line 10: '"Undetermined"' ==> '""' -[...] -``` - -![Stryker report][4] - -You cannot wiggle out of this tight spot by modifying the implemented code. It turns out the only way to kill surviving mutants is to _describe additional expectations_. And how do you describe expectations? By writing unit tests. - -### Unit testing for success - -It's time to add a new unit test. Since the surviving mutant is located on line 4, you realize you have not specified expectations for the output with value "Undetermined." - -Let's add a new unit test: - - -``` -[Fact] -public void GivenIncorrectTimeOfDayReturnUndetermined() { -   var expected = "Undetermined"; -   var actual = catTrapDoor.Control("Incorrect input"); -   Assert.Equal(expected, actual); -} -``` - -The fix worked! Now all mutants are killed: - - -``` -All mutants have been tested, and your mutation score has been calculated -\- \app [14/14 (100%)] -[Killed] [...] -``` - -You finally have a complete solution, including a description of what is expected as output if the system receives incorrect input values. - -### Mutation testing to the rescue - -Suppose you decide to over-engineer a solution and add this method to the **FakeCatTrapDoor**: - - -``` -private string getTrapDoorStatus(string dayOrNight) { -   string status = "Everything okay"; -   if(dayOrNight != "Nighttime" || dayOrNight != "Daylight") { -       status = "Undetermined"; -   } -   return status; -} -``` - -Then replace the line 4 statement: - - -``` -`string trapDoorStatus = "Undetermined";` -``` - -with: - - -``` -`string trapDoorStatus = getTrapDoorStatus(dayOrNight);` -``` - -When you run unit tests, everything passes: - - -``` -Starting test execution, please wait... - -Total tests: 5. Passed: 5. Failed: 0. Skipped: 0. -Test Run Successful. -Test execution time: 2.7191 Seconds -``` - -The test has passed without an issue. TDD has worked. But bring  Stryker to the scene, and suddenly the picture looks a bit grim: - - -``` -All mutants have been tested, and your mutation score has been calculated -\- \app [14/20 (70%)] -[...] -``` - -Stryker created 20 mutants; 14 mutants were killed, while six mutants survived. This lowers the success score to 70%. This means only 70% of our code is there to fulfill the described expectations. The other 30% of the code is there for no clear reason, which puts us at risk of misuse of that code. - -In this case, Stryker helps fight the bloat. It discourages the use of unnecessary and convoluted logic because it is within the crevices of such unnecessary complex logic where bugs and defects breed. - -### Conclusion - -As you've seen, mutation testing ensures that no uncertain fact goes unchecked. - -You could compare Stryker to a chess master who is thinking of all possible moves to win a match. When Stryker is uncertain, it's telling you that winning is not yet a guarantee. The more unit tests we record as facts, the further we are in our match, and the more likely Stryker can predict a win. In any case, Stryker helps detect losing scenarios even when everything looks good on the surface. - -It is always a good idea to engineer code properly. You've seen how TDD helps in that regard. TDD is especially useful when it comes to keeping your code extremely modular. However, TDD on its own is not enough for delivering lean code that works exactly to expectations. Developers can add code to an already implemented codebase without first describing the expectations. That puts the entire code base at risk. Mutation testing is especially useful in catching breaches in the regular test-driven development (TDD) cadence. You need to mutate every line of implemented code to be certain no line of code is there without a specific reason. - -Now that you understand how mutation testing works, you should look into how to leverage it. Next time, I'll show you how to put mutation testing to good use when tackling more complex scenarios. I will also introduce more agile concepts to see how DevOps culture can benefit from maturing technology. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/9/mutation-testing-example-definition - -作者:[Alex Bunardzic][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/alex-bunardzichttps://opensource.com/users/alex-bunardzichttps://opensource.com/users/marcobravo -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/binary_code_computer_screen.png?itok=7IzHK1nn (Binary code on a computer screen) -[2]: https://opensource.com/article/19/9/mutation-testing-example-part-3-execute-test -[3]: https://stryker-mutator.io/ -[4]: https://opensource.com/sites/default/files/uploads/strykerreport.png (Stryker report) diff --git a/sources/tech/20190928 Microsoft open sourcing its C-- library, Cloudera-s open source data platform, new tools to remove leaked passwords on GitHub and combat ransomware, and more open source news.md b/sources/tech/20190928 Microsoft open sourcing its C-- library, Cloudera-s open source data platform, new tools to remove leaked passwords on GitHub and combat ransomware, and more open source news.md deleted file mode 100644 index cb803113ab..0000000000 --- a/sources/tech/20190928 Microsoft open sourcing its C-- library, Cloudera-s open source data platform, new tools to remove leaked passwords on GitHub and combat ransomware, and more open source news.md +++ /dev/null @@ -1,83 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Microsoft open sourcing its C++ library, Cloudera's open source data platform, new tools to remove leaked passwords on GitHub and combat ransomware, and more open source news) -[#]: via: (https://opensource.com/article/19/9/news-september-28) -[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) - -Microsoft open sourcing its C++ library, Cloudera's open source data platform, new tools to remove leaked passwords on GitHub and combat ransomware, and more open source news -====== -Catch up on the biggest open source headlines from the past two weeks. -![Weekly news roundup with TV][1] - -In this edition of our open source news roundup, we take a look Cloudera's open source data platform, Microsoft open sourcing its C++ library, new tools to beef up digital security, and more! - -### Cloudera releases open source cloud data platform - -It was only a few months ago that data processing software vendor Cloudera went [all in on open source][2]. The results of that shift have started to appear, with the company releasing "[an integrated data platform made up entirely of open-source elements.][3]" - -Called Cloudera Data Platform, it combines "a cloud-native data warehouse, machine learning service and data hub, each running as instances within the self-contained operating environments." Cloudera's chief product officer Arun Murthy said that by using "existing components in the cloud, the platform cuts deployment times from weeks to hours." The speed of open source adoption is a great industry proof point. One can image the next step is Cloudera's participation in the underlying open source communities they now depend on.  - -### Microsoft open sources its C++ standard library - -When you think of open source software, programming language libraries probably aren't the first things that come to mind. But they're often an essential part of the software that we use. A team at Microsoft recognized the importance of the company's implementation of the C++ Standard Library (STL) and it's been [released as open source][4]. - -By making the library open source, users get "easy access to all the latest developments in C++" and enables them to participate "in the STL’s development by reporting issues and commenting on pull requests." The library, which is under an Apache License, is [available on GitHub][5]. - -### Two new open source security tools - -Nowadays, more than ever it seems, digital security is important to anyone using a computer — from average users to system administrators to software developers. Open source has been playing its part in helping make systems more secure, and two new open source tools to help secure an organization's code and its computers have been released. - -If you, or someone in your company, has ever accidentally published sensitive information to a public GitHub repository, then [Shhgit is for you][6]. The tool, which you can [find on GitHub][7], is designed to detect passwords, connection strings, and access keys that wind up being exposed. Unlike similar tools, you don't need to point Shhgit at a particular repository. Instead, it "taps into the GitHub firehose to automatically flag up leaked secrets". - -Ransomware attacks are no joke, and defending against them is serious business. Cameyo, a company specializing in virtualization, has released an [open source monitoring tool][8] that "any organization can use to identify attacks taking place over RDP (Remote Desktop Protocol) in their environment." Called [RDPmon][9], the software enables users to "monitor and identify brute force attacks and to help protect against ransomware". It does this by watching the number of attempted RDP connections, along with the number of users and which programs those users are running. - -### New foundation to develop open source data processing engine - -There's a new open source foundation in town. Tech firms Alibaba, Facebook, Twitter, and Uber have [teamed up][10] to further develop Presto, a database search engine and processing tool originally crafted by Facebook. - -The Presto Foundation, which operates under the Linux Foundation's umbrella, aims to make Presto the "fastest and most reliable SQL engine for massively distributed data processing." One of the foundation members, Alibaba, already has plans for the tool. According to an [article in CX Tech][11], Alibaba intends to refine Presto to more efficiently "sift through the mountains of data generated by its e-commerce platforms." - -#### In other news - - * [Scientists Create World’s First Open Source Tool for 3D Analysis of Advanced Biomaterials][12] - * [Percona announces Percona Distribution for PostgreSQL to support open source databases][13] - * [Sage gets cloudy, moves towards open source and microservices][14] - * [Compliance monitoring of EU’s Common Agricultural Policy made more transparent and efficient with Open Source][15] - * [WebLinc is taking its in-house ecommerce platform open source][16] - - - -_Thanks, as always, to Opensource.com staff members and moderators for their help this week._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/9/news-september-28 - -作者:[Scott Nesbitt][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/scottnesbitt -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/weekly_news_roundup_tv.png?itok=B6PM4S1i (Weekly news roundup with TV) -[2]: https://opensource.com/19/7/news-july-20#cloudera -[3]: https://siliconangle.com/2019/09/24/cloudera-debuts-open-source-integrated-cloud-data-platform/ -[4]: https://devclass.com/2019/09/18/microsoft-turns-to-github-to-open-source-c-stl/ -[5]: https://github.com/microsoft/STL -[6]: https://portswigger.net/daily-swig/open-source-tool-for-bug-hunters-searches-for-leaked-secrets-in-github-commits -[7]: https://github.com/eth0izzle/shhgit/ -[8]: https://betanews.com/2019/09/18/tool-prevents-brute-force-ransomware/ -[9]: https://github.com/cameyo/rdpmon -[10]: https://sdtimes.com/data/the-presto-foundation-launches-under-the-linux-foundation/ -[11]: https://www.caixinglobal.com/2019-09-24/alibaba-global-tech-giants-form-foundation-for-open-source-database-tool-101465449.html -[12]: https://sputniknews.com/science/201909111076763585-russian-german-scientists-create-worlds-first-open-source-tool-for-3d-analysis-of-advanced/ -[13]: https://hub.packtpub.com/percona-announces-percona-distribution-for-postgresql-to-support-open-source-databases/ -[14]: https://www.itworldcanada.com/article/sage-gets-cloudy-moves-towards-open-source-and-microservices/421771 -[15]: https://joinup.ec.europa.eu/node/702122 -[16]: https://technical.ly/philly/2019/09/24/weblinc-ecommerce-platform-open-source-workarea/ diff --git a/sources/tech/20190929 Open Source Voice Chat Mumble Makes a Big Release After 10 Years.md b/sources/tech/20190929 Open Source Voice Chat Mumble Makes a Big Release After 10 Years.md deleted file mode 100644 index 3205c22a0a..0000000000 --- a/sources/tech/20190929 Open Source Voice Chat Mumble Makes a Big Release After 10 Years.md +++ /dev/null @@ -1,117 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Open Source Voice Chat Mumble Makes a Big Release After 10 Years) -[#]: via: (https://itsfoss.com/mumble-voice-chat/) -[#]: author: (John Paul https://itsfoss.com/author/john/) - -Open Source Voice Chat Mumble Makes a Big Release After 10 Years -====== - -The greatest power of the Internet is its ability to connect people anywhere in the world. Voice chat applications are just one category of tools uniting us. Recently, one of the biggest open-source voice chat apps made a new release, 10 years after its previous release. - -### Mumble: Open Source, Low Latency, High Quality Voice Chat - -![Mumble][1] - -[Mumble][2] is a “free, open source, low latency, high quality voice chat application”. It was originally created to be used by gamers, but it is also used to record podcasts. Several [Linux podcasts][3] use Mumble to record hosts located at different places in the world, including Late Nite Linux. To give you an idea of how powerful Mumble is, it has been used to connect “Eve Online players with huge communities of over 100 simultaneous voice participants”. - -Here are some of the features that make Mumble interesting: - - * Low-latency (ideal for gamers) - * Connections always encrypted and secured - * Connect with friends across servers - * Extensive user permission system - * Extendable through Ice and GRPC protocols - * Automatable administration through Ice middleware - * Low resource cost for hosting - * Free choice between official and third-party server software - * Provide users with channel viewer data (CVP) without giving control away - - - -It’s a powerful software with a lot of features. If you are new to it and want to start using it, I suggest [going through its documentation][4]. - -### What’s New in Mumble 1.3.0? - -![Mumble 1.30 Interface with Lite Theme][5] - -The team behind Mumble released [version 1.3.0][6] in early August. This is the first major release in ten years and it contains over 3,000 changes. Here are just a few of the new features in Mumble 1.3.0: - - * UI redesign - * New lite and dark themes - * Individual user volume adjustment - * New bindable shortcut for changing transmission modes - * Quickly filter channels - * Multichannel recordings are synchronous even after several hours - * PulseAudio monitor devices can be used as input devices - * An optional clock (current time) in the overlay - * Improved user management, including searchable ban list - * Added support for systemd - * Option to disable public server list - * Lower volume of other users when “Priority Speaker” talks - * New interface allows renaming users as well as (batch) deletions - * Mumble client can be controlled through SocketRPC - * Support for Logitech G-keys has been added - - - -### Installing Mumble on Linux - -![Mumble 1.30 Interface Dark Theme][7] - -The Mumble team has installers available for Linux, Windows (32 and 64 bit), and macOS. You can find and download them from the [project’s website][8]. You can also browse its [source code on GitHub][9]. - -They have a [PPA available for Ubuntu][10]. Which means you can easily install it on Ubuntu and Ubuntu-based distributions like Linux Mint, elementary OS. To install, just enter these commands, one by one, in the terminal: - -``` -sudo add-apt-repository ppa:mumble/release -sudo apt update -sudo apt install mumble -``` - -The Snap community also created a [snap app for Mumble][11]. This makes installing Mumble easier in any Linux distribution that supports Snap. You can install it with the following command: - -``` -sudo snap install mumble -``` - -There are also _third-party clients_ for Android and iOS on the download page. - -[Download Mumble for other platforms][8] - -**Final Thoughts** - -I have never used Mumble or any other voice chat app. I just never had the need. That being said, I’m glad that there is a powerful FOSS option available and so widely used. - -Have you ever used Mumble? What is your favorite voice chat app? Please let us know in the comments below. - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][12]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/mumble-voice-chat/ - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/john/ -[b]: https://github.com/lujun9972 -[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/mumble-voice-chat-logo.png?ssl=1 -[2]: https://www.mumble.info/ -[3]: https://itsfoss.com/linux-podcasts/ -[4]: https://wiki.mumble.info/wiki/Main_Page -[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/mumble-1.30-interface.jpg?ssl=1 -[6]: https://www.mumble.info/blog/mumble-1.3.0-release-announcement/ -[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/mumble-1.30-interface-1.png?resize=800%2C529&ssl=1 -[8]: https://www.mumble.info/downloads/ -[9]: https://github.com/mumble-voip/mumble -[10]: https://itsfoss.com/ppa-guide/ -[11]: https://snapcraft.io/mumble -[12]: https://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20190930 Cacoo- A Lightweight Online Tool for Modelling AWS Architecture.md b/sources/tech/20190930 Cacoo- A Lightweight Online Tool for Modelling AWS Architecture.md deleted file mode 100644 index 428c68007a..0000000000 --- a/sources/tech/20190930 Cacoo- A Lightweight Online Tool for Modelling AWS Architecture.md +++ /dev/null @@ -1,72 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Cacoo: A Lightweight Online Tool for Modelling AWS Architecture) -[#]: via: (https://opensourceforu.com/2019/09/cacoo-a-lightweight-online-tool-for-modelling-aws-architecture/) -[#]: author: (Magesh Kasthuri https://opensourceforu.com/author/magesh-kasthuri/) - -Cacoo: A Lightweight Online Tool for Modelling AWS Architecture -====== - -[![AWS][1]][2] - -_Cacoo is a simple and efficient online tool that can be used to model diagrams for AWS architecture. It is not specific to AWS architecture and can be used for UML modelling, cloud architecture for GCP, Azure, network architecture, etc. However, this open source tool is one of the most efficient in architecture modelling for AWS solutions._ - -For a cloud architect, representing the solution’s design as an architecture diagram is much more helpful in explaining the details visually to target audiences like the IT manager, the development team, business stakeholders and the application owner. Though there are many tools like Sparkx Enterprise Architect, Rational Software Modeler and Visual Paradigm, to name a few, these are not so sophisticated and flexible enough for cloud architecture modelling. Cacoo is an advanced and lightweight tool that has many features to support AWS cloud modelling, as can be seen in Figures 1 and 2. - -![Figure 1: Template options for AWS architecture diagram][3] - -![Figure 2: Sample AWS architecture diagram in Cacoo][4] - -![Figure 3: AWS diagram options in Cacoo][5] - -Though AWS provides developer tools, there is no built-in tool provided for solution modelling and hence we have to choose an external tool like Cacoo for the design preparation. - -We can start with solution modelling in Cacoo either by using the AWS diagram templates, which list pre-built templates for standard architecture diagrams like the network diagram, DevOps solutions, etc. If you want to develop a custom solution from the list of shapes available in the Cacoo online editor, you can choose AWS components like compute, storage, network, analytics, AI tools, etc, and prepare custom architecture to suit your solution, as shown in Figure 2. - -There are connectors available to relate the components (for example, how network communication happens, and how ELB or elastic load balancing branches to EC2 storage). Figure 3 lists sample diagram shapes available for AWS architecture diagrams in Cacoo. - -![Figure 4: Create an IAM role to connect to Cacoo][6] - -![Figure 5: Add the policy to the IAM role to enable Cacoo to import from the AWS account][7] - -**Integrating Cacoo with an AWS account to import architecture** -One of the biggest advantages of Cacoo compared to other cloud modelling tools is that it can import architecture from an AWS account. We can connect to an AWS account, and Cacoo selects the services created in the account with the role attached and prepares an architecture diagram, on the fly. - -For this, we need to first create an IAM (Identity and Access Management) role in the AWS account with the account ID and external ID as given in the Cacoo Import AWS Architecture account (Figure 4). - -Then we need to add a policy to the IAM role in order to access the components attached to this role from Cacoo. For policy creation, we have sample policies available in Cacoo’s Import AWS Architecture wizard. We just need to copy and paste the policy as shown in Figure 5. - -Once this is done, the IAM role is created in the AWS account. Now we need to copy the role ARN (Amazon Resource Name) from the new role created and paste it in Cacoo’s Import AWS Architecture wizard as shown in Figure 6. This imports the architecture of the services created in the account, which is attached to the IAM role we have created and displays it as an architecture diagram. - -![Figure 6: Cacoo’s AWS Architecture Import wizard][8] - -![Figure 7: Cacoo’ worksheet with AWS imported architecture][9] - -Once this is done, we can see the architecture in Cacoo’s worksheet (Figure 7). We can print or export the architecture diagram into PPT, PNG, SVG, PDF, etc, for an architecture document, or for poster printing and other technical discussion purposes, as needed. -Cacoo is one of the most powerful cloud architecture modelling tools and can be used for visual designs for AWS architecture, on the fly, using online tools without installing any software. The online account is accessible from anywhere and can be used for quick architecture presentation. - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/09/cacoo-a-lightweight-online-tool-for-modelling-aws-architecture/ - -作者:[Magesh Kasthuri][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/magesh-kasthuri/ -[b]: https://github.com/lujun9972 -[1]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/07/AWS.jpg?resize=696%2C427&ssl=1 (AWS) -[2]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/07/AWS.jpg?fit=750%2C460&ssl=1 -[3]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-1-Template-options-for-AWS-architecture-diagram.jpg?resize=350%2C262&ssl=1 -[4]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-2-Sample-AWS-architecture-diagram-in-Cacoo.jpg?resize=350%2C186&ssl=1 -[5]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-3-AWS-diagram-options-in-Cacoo.jpg?resize=350%2C337&ssl=1 -[6]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-4-Create-an-IAM-role-to-connect-to-Cacoo.jpg?resize=350%2C228&ssl=1 -[7]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-5-Add-the-policy-to-the-IAM-role-to-enable-Cacoo-to-import-from-the-AWS-account.jpg?resize=350%2C221&ssl=1 -[8]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-6-Cacoo%E2%80%99s-AWS-Architecture-Import-wizard.jpg?resize=350%2C353&ssl=1 -[9]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-7-Cacoo%E2%80%99s-worksheet-with-AWS-imported-architecture.jpg?resize=350%2C349&ssl=1 diff --git a/sources/tech/20191001 How to create the data structure for a Corteza Low Code application.md b/sources/tech/20191001 How to create the data structure for a Corteza Low Code application.md deleted file mode 100644 index 6e065ac302..0000000000 --- a/sources/tech/20191001 How to create the data structure for a Corteza Low Code application.md +++ /dev/null @@ -1,225 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to create the data structure for a Corteza Low Code application) -[#]: via: (https://opensource.com/article/19/10/corteza-low-code-data-structure) -[#]: author: (Lenny Horstink https://opensource.com/users/lenny-horstink) - -How to create the data structure for a Corteza Low Code application -====== -Corteza is an open source alternative to Salesforce. Learn how to use it -in this series. -![Green graph of measurements][1] - -In the [first article][2] in this series, I showed how to create a custom application to track donations using Corteza Low-Code, a graphical user interface- (GUI) and web-based development environment that serves as an alternative to Salesforce. So far, the Donations application merely exists, but this article explains how to make it do something by populating it with a data structure using modules and fields. - -Modules and fields exist inside your application. (In programming terminology, they are "locally defined.") Modules and fields define places where data is stored in your application. Without modules and fields, your application has no memory nor anything to work with, so defining them is the next step when creating a new app. - -The [Donations application][3] is available on the Corteza community server. You need to be logged in or create a free Corteza community server account to check it out. - -### Enter the application's admin area - -To enter the admin area of an application, you first need to open the application inside Corteza Low-Code. To enter the Donations application created in the first part of this series: - - 1. Enter Corteza. (Read [_Intro to Corteza, an open source alternative to Salesforce_][4] if you need some background on this.) - 2. Click on the **+** button to create a new tab. - 3. Select Corteza Low-Code. - 4. Click on the Donations namespace to enter the Donations application. - - - -Since the Donations application doesn't have any modules or pages yet, the only thing you see is an **Admin panel** link on the right. If the applications had pages, it would show the main menu and the **Admin panel** link on the far right. - -![Open Corteza Low Code admin panel][5] - -Click on it to enter the application's admin area. There are four menu items: - -![Corteza Low Code admin panel menu][6] - - * **Modules:** Create or edit modules and fields - * **Pages:** Define the visual part of your application - * **Charts:** Create charts to add to pages - * **Automation:** Add automation rules to automate business processes and workflows - - - -The **Public pages** link takes you back to your application. - -### Create modules and fields - -Modules and fields define what data you need to store in your application and how that data links to other data. If you've ever built a database with [LibreOffice Base][7], Filemaker Pro, or a similar application, this might feel familiar—but you don't need any database experience to work with Corteza. - -#### Modules - -A module is like a table in a database. A simple application typically has a few modules, while bigger applications have many more. Corteza CRM, for example, has over 35. The number of modules an application can have is unlimited. - -A new application does not have any modules. You can create one by using the form on top or by importing an existing module from a different application using an export file. You can import and export individual modules or all modules at the same time. - -When you create a module, best practice is to give it a descriptive name without spaces and using capital letters on different words, e.g., _Lead_, _Account_, or _CaseUpdate_. - -The Donations application includes the following modules: - - * **Contact:** To store the donor's contact data - * **ContactDonation:** To track a contact's donation(s) - * **Project:** To store a project you can assign donations to - * **Note:** To store notes related to a project - - - -![Donations application modules][8] - -#### Fields - -Each module consists of a set of fields that define what data you want to store and in what format. - -You can add new fields to a module by using the **Add new field** button. This adds a new row with the following fields: - - * **Name:** It must be unique and cannot have spaces, e.g., "firstname." This is not shown to the end user. - * **Title:** This is the field's label—the field name the end users see when they view or edit a record. It can contain any character, including spaces. Although it's best practice to keep this title unique, it's not mandatory. An example is "First name." - * **Type:** This is where you set the field type. The wrench icon on the right allows you to set more detailed data for the field type. - * **Multiple values:** This checkbox is available when you want a field type to allow multiple value entries. - * **Required:** This makes the field mandatory for the end user when creating or editing a record. - * **Sensitive:** This allows you to mark data that is sensitive, such as name, email, or telephone number, so your application is compliant with privacy regulations such as the [GDPR][9]. - - - -At the end of the row, you can find a **Delete** button (to remove a field) and a **Permission** button (to set read permissions and update field permissions per role). - -### Field types - -You can select from the following field types. The wrench icon beside the field type provides further options for each case. - - * **Checkbox (Y/N):** This field shows a checkbox to the end user when editing a record. When you click on the wrench icon, you can select what checked and unchecked represent. For example: Yes/No, Active/Inactive, etc. - * **DateTime:** This makes a date field. You can select: - * Date only - * Time only - * Past values only - * Future value only - * Output relative value (e.g., three days ago) - * Custom output format (see [Moment.js][10] for formatting options) - * **Email:** This field auto-validates whether the input is an email and turns it into a clickable email link in record-viewing mode. You can select the **Don't turn email into a link** option to remove the auto-link feature. - * **Select:** When you click on the wrench icon, you can use the **Add** button to add as many Select options as you need. You can also set whether the end user can select multiple values at once. - * **Number:** This field gives you the option to add a prefix (for example a $ for values in dollars), a suffix (for example % for a number that represents a percentage), and the decimal precision (e.g., zero for whole numbers or two for values like 1.13, 2.44, 3.98), and you can use the **Format Input** field to create more complex formats. - * **Record:** This field allows you to link the current module to another module. It will show as a Select to the end user. You can select the module in the **Module name** field and choose the field to use to load the Select options. In **Query fields on search**, you can define what fields you want the user to be able to search on. As with the **Select** field type, you can set whether the user can select multiple values at once. - * **String:** By default, a String field is a single-line text-input field, but you can choose to make it multi-line or even a rich text editor. - * **URL:** The URL field automatically validates whether the field is a link to a site. You can select the following options for this field: - * Trim # from the URL - * Trim ? from the URL - * Only allow SSL (HTTPS) URLs - * Don't turn URL into a link - * **User:** This creates a Select field that loads with all users in Corteza. You can preset the value to the current user. - * **File:** This creates a **File Upload** button for the end user. - - - -#### Field types in the Donations application - -The Donations application includes the following fields in its four modules. - -##### 1\. Contact - -![Contact module][11] - - * Name (String) - * Email (Email) - * Phone (String) - * Address (String; _Multi-line_) - - - -##### 2\. ContactDonation - -![Corteza Donations app modules][12] - - * Contact (Record; link to **Contact**) - * Donation (Number; _Prefix $_ and _Precision 2_) - * Project (Record; link to **Project**) - - - -##### 3\. Project - -![Project module][13] - - * Name (String) - * Description (String; _Multi-line_ and _Use rich text editor_) - * Status (Select; with options _Planning_, _Active_, and _Finished_) - * Start date (DateTime; _Date only_) - * Website link (URL) - * Donations total (Number; _Prefix $_ and _Precision 2_) - * Project owner (User; _Multiple select_ and _Preset with current user_) - - - -##### 4\. Notes - -![Notes module][14] - - * Project (Record; link to **Project**) - * Subject (String) - * Note (String; _Multi-line_ and _Use rich text editor_) - * File (File; _Single image_) - - - -### Create relationships between modules - -Practically every Corteza Low Code application consists of multiple modules that are linked together. For example, projects can have notes or donations can be assigned to different projects. The **Record** field type creates relationships between modules. - -The **Record** field type's basic function is to link from module B back to module A. Records in module B are children of records in module A (you could say it's a 1-N relationship). - -For example, in the Donations application, the module **Note** has a **Record** field that links to the module **Project**. The end user will see a **Select** field in a **Note** record with the value of the **Project** that the note pertains to. - -To create this relationship in the Donations application, select the wrench icon in the **projectId** row: - -![Wrench icon][15] - -In the popup that opens, select the module the field will link to, the label end users will see, and which fields the end user can search on.  - -![Setting query fields for search][16] - -This creates a simple relationship that allows the **Project** to have **Notes**. A many-to-many relationship between modules is more complex. For example, the Donations application needs to support contacts who make multiple donations and donations that are assigned to different projects. The **ContactDonation** module sits in the middle to manage this. - -This module has two fields of the **Record** type. For each, we need to select the correct module and set the label and query fields the user can search on. The Donations application needs the following to be set for the **Contact** and **Project** modules: - -![Contact module field settings][17] - -![Project module field settings][18] - -This creates a many-to-many relationship between modules. - -You've now set up a structure for the data in your application. The next step is to create the visual side of your app using Corteza's **Pages** feature. It's easier than you might expect, as you'll see in the third article in this series. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/corteza-low-code-data-structure - -作者:[Lenny Horstink][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/lenny-horstink -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_lead-steps-measure.png?itok=DG7rFZPk (Green graph of measurements) -[2]: https://opensource.com/article/19/9/how-build-application-corteza-low-code-open-source-alternative-salesforce -[3]: https://latest.cortezaproject.org/compose/ns/donations/ -[4]: https://opensource.com/article/19/8/corteza-open-source-alternative-salesforce -[5]: https://opensource.com/sites/default/files/uploads/corteza_donationsadminpanel.png (Open Corteza Low Code admin panel) -[6]: https://opensource.com/sites/default/files/uploads/corteza_donationsmenuadminpanel.png (Corteza Low Code admin panel menu) -[7]: https://www.libreoffice.org/discover/base/ -[8]: https://opensource.com/sites/default/files/uploads/corteza_donationstmodules.png (Donations application modules) -[9]: https://eugdpr.org/ -[10]: https://momentjs.com/docs/#/displaying/format/ -[11]: https://opensource.com/sites/default/files/uploads/corteza_contactmodulefields.png (Contact module) -[12]: https://opensource.com/sites/default/files/uploads/corteza_contactdonationmodule.png (Corteza Donations app modules) -[13]: https://opensource.com/sites/default/files/uploads/corteza_projectmodule.png (Project module) -[14]: https://opensource.com/sites/default/files/uploads/corteza_notesmodule.png (Notes module) -[15]: https://opensource.com/sites/default/files/uploads/corteza_createrelationshipicon.png (Wrench icon) -[16]: https://opensource.com/sites/default/files/uploads/corteza_queryfieldsonsearch.png (Setting query fields for search) -[17]: https://opensource.com/sites/default/files/uploads/corteza_modulefieldsettings-contact.png (Contact module field settings) -[18]: https://opensource.com/sites/default/files/uploads/corteza_modulefieldsettings-project.png (Project module field settings) diff --git a/sources/tech/20191001 The Best Android Apps for Protecting Privacy and Keeping Information Secure.md b/sources/tech/20191001 The Best Android Apps for Protecting Privacy and Keeping Information Secure.md deleted file mode 100644 index 6e47df1e3a..0000000000 --- a/sources/tech/20191001 The Best Android Apps for Protecting Privacy and Keeping Information Secure.md +++ /dev/null @@ -1,134 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The Best Android Apps for Protecting Privacy and Keeping Information Secure) -[#]: via: (https://opensourceforu.com/2019/10/the-best-android-apps-for-protecting-privacy-and-keeping-information-secure/) -[#]: author: (Magimai Prakash https://opensourceforu.com/author/magimai-prakash/) - -The Best Android Apps for Protecting Privacy and Keeping Information Secure -====== - -[![][1]][2] - -_Privacy violations and data theft occur every day, making it necessary for all of us to safeguard our data. We trust our smartphones way too much and tend to store personal data on them, ignoring the fact that these devices could easily be compromised. However, there are a few open source apps that can ensure the data on your phone is not compromised. This article lists the best ones._ - -Everyone is becoming aware about information security. There are plenty of privacy and security apps available in the Google Play store too, but it is not easy to select the right one. Most users prefer free apps, but some of these offer only limited functionality and force users to upgrade to a premium membership, which many cannot afford. - -This article sheds light on some FOSS Android apps that will really help in safeguarding your privacy. - -![Figure 1: Safe Notes][3] - -![Figure 2: Exodus Privacy][4] - -**Safe Notes** -Safe Notes is a companion app for the Protected Text website (__). It is an online encrypted notepad which offers space on a separate site for users to store their notes. To use this service, you do not need to sign up with the website. Instead, you need to choose a site name and a password to protect it. - -You have two options to use Safe Notes — you can either use this app to save your notes locally, or you can import your existing Protected Text site in the app. In the latter case, you can synchronise your notes between the app as well as in the Protected Text website. - -By default, all the notes will be in an unlocked state. After you have saved your notes, if you want to encrypt them, click on the key icon beside your note and you will be prompted to give a password. After entering the password of your choice, your note will be encrypted and instead of the key icon, you will see an unlocked icon in its place, which means that your note is not locked. To lock your note, click the ‘Unlocked’ icon beside your note — your note will get locked and the password will be removed from your device. - -Passwords that you are using are not transmitted anywhere. Even if you are using an existing Protected Text site, your passwords are not transmitted. Only your encrypted notes get sent to the Protected Text servers, so you are in total control. But this also means that you cannot recover your password if you lose it. - -Your notes are encrypted by the AES algorithm and SHA 12 for hashing, while SSL is used for data transmission. - -![Figure 3: Net Guard][5] - -**Exodus Privacy** -Have you ever wondered how many permissions you are granting to an Android app? While you can see these in the Google Play store, you may not know that some of those permissions are impacting your privacy more severely than you realise. - -While permissions are taking control of your device with or without your knowledge, third party trackers also compromise your privacy by stealthily collecting data without your consent. And the worst part is that you have no clue as to how many trackers you have in your Android app. - -To view the permissions for an Android app and the trackers in it, use Exodus Privacy. - -Exodus Privacy is an Android app that has been created and maintained by a French non-profit organisation. While the app is not capable of any analysis, it will fetch reports from the Exodus Platform for the apps that are installed in your device. - -These reports are auto-generated by using the static analysis method and, currently, the Exodus platform contains 58,392 reports. Each report gives you information about the number of trackers and permissions. - -Permissions are evaluated using the three levels of Google Permission Classification. These are ‘Normal’, ‘Signature’ and ‘Dangerous’. We should be concerned about the ‘Dangerous’ level because such permissions can access the user’s private and other stored sensitive data. - -Trackers are also listed in this app. When you click on a tracker, you will be taken to a page which shows you the other Android apps that have that particular tracker. This can be really useful to know if the same tracker has been used in the other apps that you have installed. - -In addition, the reports will contain information such as ‘Fingerprint’ and other geographical details about the app publisher such as ‘Country’, ‘State’ and ‘Locality’. - -![Figure 4: xBrowserSync][6] - -![Figure 5: Scrambled Exif][7] - -**Net Guard** -Most Android apps need network access to function properly, but offline apps don’t need this to operate. Yet some of these offline apps continue to run in the background and use network access for some reason or the other. As a result, your battery gets drained very quickly and the data plan on your phone gets exhausted faster than you think. - -Net Guard solves this problem by blocking the network access to selected apps. Net Guard will only block the outgoing traffic from apps, not what’s incoming. - -The Net Guard main window displays all the installed apps. For every app you will see the ‘mobile network’ icon and the ‘Wi-Fi’ icon. When they are both green, it means that Net Guard will allow the app to have network access via the mobile network and Wi-Fi. Alternatively, you can enable any one of them; for example, you can allow the app to use the Internet only via the mobile network by clicking on the ‘Mobile network’ icon to turn it green while the ‘Wi-Fi’ icon is red. - -When both the ‘Mobile network’ and ‘Wi-Fi’ icons are red, the app’s outgoing traffic is blocked. -Also, when ‘Lockdown’ mode is enabled, it will block the network access for all apps except those that are configured to have network access in the ‘Lockdown’ mode too. This is useful when you have very little battery and your data plan is about to expire. - -Net Guard can also block network access to the system apps, but please be cautious about this because sometimes, when the user blocks Internet access to some critical system apps, it could result in a malfunction of other apps. - -**xBrowserSync** -xBrowserSync is a free and open source service that helps to sync bookmarks across your devices. Most of the sync services require you to sign up and keep your data with them. - -xBrowserSync is an anonymous and secure service, for which you need not sign up. To use this service you need to know your sync ID and have a strong password for it. - -Currently, xBrowserSync supports the Mozilla and Chrome browsers; so if you’re using either one of them, you can proceed further. Also, if you have to transfer a huge number of bookmarks from your existing service to xBrowserSync, it is advised that you have a backup of all your bookmarks before you create your first sync. - -You can create your first sync by entering a strong password for it. After your sync is created, a unique sync ID will be shown to you, which can be used to sync your bookmarks across your devices. - -xBrowserSync encrypts all your data locally before it is synced. It also uses PBKDF2 with 250,000 iterations of SHA-256 for the key derivation to combat brute force attacks. Apart from that, It uses PBKDF2 with 250,000 iterations of SHA-256 for the key derivation to combat brute force attacks. And it uses AES-GCM with a random 16 byte IV (Initialization Vector- a random number that is used with secret key to encrypt the data) with 32-bit char sync ID of the user as a salt value. All of these are in place to ensure that your data cannot be decrypted without your password. - -The app provides you with a sleek interface that makes it easy for you to add bookmarks, and share and edit them by adding descriptions and tags to them. - -xBrowserSync is currently hosted by four providers, including the official one. So to accommodate all the users, the synced data that isn’t accessed for a long time is removed. If you don’t want to be dependent on other providers, you can host xBrowserSync for yourself. - -![Figure 6: Riseup VPN][8] - -**Scrambled Exif** -When we share our photos on social media, sometimes we share the metadata on those photos accidentally. Metadata can be useful for some situations but it can also pose a serious threat to your privacy. A typical photo may consist of the following pieces of data such as ‘date and time’, ‘make and model of the camera’, ‘phone name’ and ‘location’. When all these pieces of data are put together by a system or by a group of people, they are able to determine your location at that particular time. - -So if you want to share your photos with your friends as well as on social media without divulging metadata, you can use Scrambled Exif. - -Scrambled Exif is a free and open source tool which removes the Exif data from your photos, after installing the app. So when you want to share a photo, you have to click on the ‘Share’ button from the photo, and it will show you the available options for sharing — choose ‘Scrambled Exif’. Once you have done that, all your metadata is removed from that photo, and you will again be shown the share list. From there on, you can share your photos normally. - -**Riseup VPN** -Riseup VPN (Virtual Private Network) is a tool that enables you to protect your identity, as well as bypass the censorship that is imposed on your network and the encryption of your Internet traffic. Some VPN service providers log your IP address and quietly betray your trust. - -Riseup VPN is a personal VPN service offered by the Riseup Organization, which is a non-profit that fights for a free Internet by providing tools and other resources for anyone who wants to enjoy the Internet without being restrained. - -To use the Riseup VPN, you do not need to register, nor do you need to configure the settings — it is all prepped for you. All you need is to click on the ‘Turn on’ button and within a few moments, you can see that your traffic is routed through the Riseup networks. By default, Riseup does not log your IP address. - -At present, Riseup VPN supports the Riseup networks in Hong Kong and Amsterdam. - -![Figure 7: Secure Photo Viewer][9] - -**Secure Photo Viewer** -When you want to show a cool picture of yours to your friends by giving your phone to them, some of them may get curious and go to your gallery to view all your photos. Once you unlock the gallery, you cannot control what should be shown and what ought to be hidden, as long as your phone is with them. - -Secure Photo Viewer fixes this problem. After installing it, choose the photos or videos you want to show to a friend and click ‘share’. This will show ‘Secure Photo Viewer’ in the available options. Once you click on it, a new window will open and it will instruct you to lock your device. Within a few seconds the photo you have chosen will show up on the screen. Now you can show your friends just that photo, and they can’t get into your gallery and view the rest of your private photos. - -Most of the apps listed here are available on F-Droid as well as on Google Play. I recommend using F-Droid because every app has been compiled via its source code by F-Droid itself, so it is unlikely to have malicious code injected in it. - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/10/the-best-android-apps-for-protecting-privacy-and-keeping-information-secure/ - -作者:[Magimai Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/magimai-prakash/ -[b]: https://github.com/lujun9972 -[1]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Android-Apps-security.jpg?resize=696%2C658&ssl=1 (Android Apps security) -[2]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Android-Apps-security.jpg?fit=890%2C841&ssl=1 -[3]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-1-Safe-Notes.jpg?resize=211%2C364&ssl=1 -[4]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-2-Exodus-Privacy.jpg?resize=225%2C386&ssl=1 -[5]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-3-Net-Guard.jpg?resize=226%2C495&ssl=1 -[6]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-4-xBrowserSync.jpg?resize=251%2C555&ssl=1 -[7]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-5-Scrambled-Exif-350x535.jpg?resize=235%2C360&ssl=1 -[8]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-6-Riseup-VPN.jpg?resize=242%2C536&ssl=1 -[9]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure-7-Secure-Photo-Viewer.jpg?resize=228%2C504&ssl=1 diff --git a/sources/tech/20191002 How to create the user interface for your Corteza Low Code application.md b/sources/tech/20191002 How to create the user interface for your Corteza Low Code application.md deleted file mode 100644 index 52056a29ac..0000000000 --- a/sources/tech/20191002 How to create the user interface for your Corteza Low Code application.md +++ /dev/null @@ -1,240 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to create the user interface for your Corteza Low Code application) -[#]: via: (https://opensource.com/article/19/10/corteza-low-code-user-interface) -[#]: author: (Lenny Horstink https://opensource.com/users/lenny-horstink) - -How to create the user interface for your Corteza Low Code application -====== -Add a user-friendly interface to your application built in Corteza Low -Code, an open source alternative to Salesforce. -![metrics and data shown on a computer screen][1] - -In the first two articles in this series, I explained how to use Corteza Low Code to [create an application][2] to track donations and [set up its data structure][3] with modules and fields. In the third article, I will explain how to create the graphical part of the Donations application. - -**Pages** is the HTTP web layer of Corteza Low Code. For comfort of design and to ensure your application is responsive and mobile-ready by default, Pages are built-in blocks. Each block can be resized and dragged wherever you desire. In all blocks, you can define the title, the description, and the layout. - -There are two types of pages: **Record** pages (which show data for or related to a single record) and **List** pages (which show a searchable list of multiple records). Each type is described below. - -### Record pages - -A module without a Record page cannot do anything. To store data inside a module, you need to create a Record page and add it to a module by selecting the appropriate **Page builder** button on the **Modules** page. This opens the drag-and-drop page editor. - -The Donations application has four modules, and each one has the **Page builder** link: - -![Page Builder Link][4] - -First, create the record page for the **Contact** module. When you click on the **Page builder** link, an empty record page opens. Add blocks with the **\+ Add block** button. - -![Add block button][5] - -There are multiple block types available. - -![Block types][6] - -The "Contact" record page in the "Donations" application uses two block types: **Record** and **Record list**. - -#### Record blocks - -The **Record** block is the most important block for a Record page. You can select the block's layout and the fields you want to show. The **Contact** record page needs to show: _Name_, _Email_, _Phone,_ and _Address_. Select those fields and hit **Save and close**, and the block will be added. - -![Form to change Record block][7] - -When you view a record, the values of these fields are shown as strings, and when you add or edit a record, these fields turn into form-input fields. - -Tip: You can drag-and-drop the fields and place them in any order you prefer. - -#### Record list blocks - -The **Contact** page will show the list of donation each contact has given. Create a list of records by selecting the **Record list** block. - -Make **Donations** the title, and select the **ContactDonation** module in the **Module** field. After selecting a module, the columns that are available are populated automatically, and you can select the columns you want to show in the **Record list**: _Donation_, _Project_, and the system field _Created at_. - -If you saved the **Record list** block right now, you would see all donations from all contacts. Because you want to show the donations related to a single contact record, you need to add a **prefilter**. - -The **Prefilter records** field allows simplified SQL "Where" conditions, and variables like **${recordID}**, **${ownerID}**, and **${userID}** are evaluated (when available). For the **Record list**, you want to filter **ContactDonation** records by contact, so you need to fill in: **${recordID} = contactId**. Note: **contactId** is a **Record** field in the module **ContactDonation**. Take a look back at the [second article][3] in this series for more info about linking modules. - -You also want to be able to sort a contact's donations by date. This can be done in the **Presort records** field by inserting **createdAt DESC**. This field supports simplified SQL _Order by_ condition syntax. - -You can also select to hide or show the **New record** button and Search box, and you can define the number of records shown. A best practice is to adjust this number to the size of the block. - -![Form to change Record list block][8] - -To save the block and add it to the page, hit **Save and close**. Now the second block has been added to the page. - -#### Other block types - -Other block types are: - - * **Content:** This block allows you to add fixed text, which you can create with a rich text editor. This is ideal for "help" texts or links to resources, such as the sales handbook on an intranet. - * **Chart:** Inserts charts that have been created with the chart builder. This is very useful when you are creating dashboards. - * **Social media feed:** You can show live content from Twitter here—either a fixed Twitter feed (which is shown in all records) or from a Module field that represents a Twitter link (which enables each record to have his own feed). - * **Automation:** In this block, you can add automation rules that have a manual trigger and that are available for the module, as well as automation rules with no primary module. They are shown to end users as buttons. You can format the automation rule buttons by inserting custom text and selecting a style, and you can change the order of them (when you have multiple buttons) with a drag-and-drop. - * **Calendar:** This block inserts a calendar, which can be shown in the following formats: - * Month - * Month agenda - * Week agenda - * Day agenda - * Month list - * Week list - * Day list The source of the calendar is a list of records from one or multiple modules. For each source, you can select which field represents the title, start date, and end date of the event. - * **File:** You can upload a file and show it on the page. Just like the **Content** block, the content of this block will be the same for all records. To have files that are related to a record, you need to use the **File** field type when creating fields in a module. - - - -Next, add the Record pages for the other modules in the Donations application. Once that is done, you will see the following list under **Pages**: - -![List of pages][9] - -### Change the page layout - -After adding blocks to pages, such as the **Contact Details** and **Donations** blocks in the **Contact** module's Record page, you can resize and position them to create the layout you want. - -![Moving blocks around][10] - -The end result is: - -![Corteza layout][11] - -Corteza Low-Code is responsive by default, so the blocks will resize and reposition automatically on devices with small screens. - -### List pages - -List pages are not related to any single record; rather, they show lists of records. This page type is used to create a home page, list of contacts, list of projects, dashboards, etc. List pages are important because you can't enter new records without viewing a list because the **Add new record** button is shown on lists. - -For the Donations application, create the following list pages: _Home_, _Contacts_, and _Projects_. - -To create a List page, you need to go to the **Pages** administrative page and enter a title in the **Create a new page** box at the top. When you submit this form, it opens the **Edit page** form, which allows you to add a page description (for internal use; the end user will not see it), and you can set the page to **Enabled** so it can be accessed. - -Your list of pages will now look like: - -![List of pages][12] - -You can drag-and-drop to rearrange this to: - -![List of pages][13] - -Rearranging pages makes it easier to maintain the application. It also allows you to generate the application menu structure because List pages (but not Record pages) are shown as menu items. - -Adding content to each List page is exactly the same as adding blocks to Record pages. The only difference is that you cannot select the **Record** block type (because it is related to a single record). - -### Create a menu - -The menu in a Corteza Low-Code application is automatically generated by the tree of pages on the admin page **Pages**. It only shows List pages and ignores Record pages. - -To reorder the menu, simply drag-and-drop the pages in the desired order within the tree of pages. - -### Add charts - -Everybody loves charts and graphs. If pictures are worth 1,000 words, then you can create a priceless application in Corteza. - -Corteza Low-Code comes with a chart builder that allows you to build line, bar, pie, and donut charts: - -![Chart types available in Corteza Low Code][14] - -As an example, add a chart that shows how many donations have been made to each Project. To begin, enter the **Charts** page in the admin menu. - -![Corteza charts admin page][15] - -To create a new chart, use the **Create a new chart** field. - -Inside the chart builder, you will find the following fields: - - * **Name:** Enter a name for the chart; e.g., _Donations_. - * **Module:** This is the module that provides the data to the chart. - * **Filters:** You can select one of the predefined filters, such as **Records created this year**, or add any custom filter (such as **status = "Active"**). - * **Dimensions:** These can be **Datetime** and **Select** fields. Datetime fields allow grouping (e.g., by day, by week, by month). The **Skip missing values** option is handy to remove values that would return null (e.g., records with incomplete data), and **Calculate how many labels can be shown** can avoid overlapping labels (which is useful for charts with many dates on the X-axis). - * **Metrics:** Metrics are numeric fields and have a predefined _count_ option. You can add multiple metric blocks and give each a different label, field (source), function (COUNTD, SUM, MAX, MIN, AVG, or STD, if possible), output (line or bar), and color. - - - -This sample chart uses the **ContactDonation** module and shows total donations per day. - -![Chart of donations per day][16] - -The final step is to add a chart to a page. To add this chart to the home page: - - * Enter **Pages** in the admin menu. - * Click on the **Page builder** link of the **Home** page. - * Add a page block of the type **Chart**, add a block title, and select the chart. - * Resize and reposition the block (or blocks) to make the layout look nice. - - - -![Chart added][17] - -When you save the page and enter your Donation application (via the **Public pages** link on the top right), you will see the home page with the chart. - -![Chart displayed on Corteza UI][18] - -### Add automation - -Automation can make your Corteza Low Code application more efficient. With the Automation tool, you can create business logic that evaluates records automatically when they are created, updated, or deleted, or you can execute a rule manually. - -Triggers are written in JavaScript, one of the most used programming languages in the world, enabling you to write simple code that can evaluate, calculate, and transform data (such as numbers, strings, or dates). Corteza Low Code comes with extra functions that allow you to access, create, save, or delete records; find users; send notifications via email; use Corteza Messaging; and more. - -[Corteza CRM][19] has an extensive set of automation rules that can be used as examples. Some of them are: - - * Account: Create new case - * Account: Create new opportunity - * Case: Insert case number - * Contract: Send contract to custom email - * Lead: Convert a lead into an account and opportunity - * Opportunity: Apply price book - * Opportunity: Generate new quote - * Quote: Submit quote for approval - - - -A complete manual on how to use the automation module, together with code examples, is in development. - -### Deploy an application - -Deploying a Corteza Low Code application is very simple. As soon as it's Enabled, it's deployed and available in the Corteza Low Code Namespaces menu. Once deployed, you can start using your application! - -### For more information - -As I mentioned in parts 1 and 2 of this series, the complete Donations application created in this series is available on the [Corteza community server][20]. You need to be logged in or create a free Corteza community server account to check it out. - -Also, check out the documentation on the [Corteza website][21] for other, up-to-date user and admin tutorials. - -If you have any questions—or would like to contribute—please join the [Corteza Community][22]. After you log in, please introduce yourself in the #Welcome channel. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/corteza-low-code-user-interface - -作者:[Lenny Horstink][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/lenny-horstink -[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://opensource.com/article/19/9/how-build-application-corteza-low-code-open-source-alternative-salesforce -[3]: https://opensource.com/article/19/9/creating-data-structure-corteza-low-code -[4]: https://opensource.com/sites/default/files/uploads/corteza_donationspagebuilderlink.png (Page Builder Link) -[5]: https://opensource.com/sites/default/files/uploads/corteza_addblock.png (Add block button) -[6]: https://opensource.com/sites/default/files/uploads/corteza_blocktypes.png (Block types) -[7]: https://opensource.com/sites/default/files/uploads/corteza_changerecordblock.png (Form to change Record block) -[8]: https://opensource.com/sites/default/files/uploads/corteza_changerecordlistblock.png (Form to change Record list block) -[9]: https://opensource.com/sites/default/files/uploads/corteza_pageslist.png (List of pages) -[10]: https://opensource.com/sites/default/files/uploads/corteza_movingblocks.png (Moving blocks around) -[11]: https://opensource.com/sites/default/files/uploads/corteza_layoutresult.png (Corteza layout) -[12]: https://opensource.com/sites/default/files/uploads/corteza_pageslist2.png (List of pages) -[13]: https://opensource.com/sites/default/files/uploads/corteza_pageslist3.png (List of pages) -[14]: https://opensource.com/sites/default/files/uploads/corteza_charttypes.png (Chart types available in Corteza Low Code) -[15]: https://opensource.com/sites/default/files/uploads/corteza_createachart.png (Corteza charts admin page) -[16]: https://opensource.com/sites/default/files/uploads/corteza_chartdonationsperday.png (Chart of donations per day) -[17]: https://opensource.com/sites/default/files/uploads/corteza_addchartpreview.png (Chart added) -[18]: https://opensource.com/sites/default/files/uploads/corteza_pageshowingchart.png (Chart displayed on Corteza UI) -[19]: https://cortezaproject.org/technology/core/corteza-crm/ -[20]: https://latest.cortezaproject.org/compose/ns/donations/ -[21]: https://www.cortezaproject.org/ -[22]: https://latest.cortezaproject.org/ diff --git a/sources/tech/20191003 4 open source eBook readers for Android.md b/sources/tech/20191003 4 open source eBook readers for Android.md deleted file mode 100644 index f2c6638bc4..0000000000 --- a/sources/tech/20191003 4 open source eBook readers for Android.md +++ /dev/null @@ -1,174 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (4 open source eBook readers for Android) -[#]: via: (https://opensource.com/article/19/10/open-source-ereaders-android) -[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) - -4 open source eBook readers for Android -====== -Looking for a new eBook app? Check out these four solid, open source -eBook readers for Android. -![Computer browser with books on the screen][1] - -Who doesn't like a good read? Instead of frittering away your time on social media or a [messaging app][2], you can enjoy a book, magazine, or another document on your Android-powered phone or tablet. - -To do that, all you need is the right eBook reader app. So let's take a look at four solid, open source eBook readers for Android. - -### Book Reader - -Let's start off with my favorite open source Android eBook reader: [Book Reader][3]. It's based on the older, open source version of the now-proprietary FBReader app. Like earlier versions of its progenitor, Book Reader is simple and minimal, but it does a great job. - -**Pros of Book Reader:** - - * It's easy to use. - * The app's interface follows Android's [Material Design guidelines][4], so it's very clean. - * You can add bookmarks to an eBook and share text with other apps on your device. - * There's growing support for languages other than English. - - - -**Cons of Book Reader:** - - * Book Reader has a limited number of configuration options. - * There's no built-in dictionary or support for an external dictionary. - - - -**Supported eBook formats:** - -Book Reader supports EPUB, .mobi, PDF, [DjVu][5], HTML, plain text, Word documents, RTF, and [FictionBook][6]. - -![Book Reader Android app][7] - -Book Reader's source code is licensed under the GNU General Public License version 3.0, and you can find it on [GitLab][8]. - -### Cool Reader - -[Cool Reader][9] is a zippy and easy-to-use eBook app. While I think the app's icons are reminiscent of those found in Windows Vista, Cool Reader does have several useful features. - -**Pros of Cool Reader:** - - * It's highly configurable. You can change fonts, line and paragraph spacing, hyphenation, font sizes, margins, and background colors. - * You can override the stylesheet in a book. I found this useful with two or three books that set all text in small capital letters. - * It automatically scans your device for new books when you start it up. You can also access books on [Project Gutenberg][10] and the [Internet Archive][11]. - - - -**Cons of Cool Reader:** - - * Cool Reader doesn't have the cleanest or most modern interface. - * While it's usable out of the box, you really need to do a bit of configuration to make Cool Reader comfortable to use. - * The app's default dictionary is proprietary, although you can swap it out for [an open one][12]. - - - -**Supported eBook formats:** - -You can use Cool Reader to browse EPUB, FictionBook, plain text, RTF, HTML, [Compiled HTML Help][13] (.chm), and TCR (the eBook format for the Psion series of handheld computers) files. - -![Cool Reader Android app][14] - -Cool Reader's source code is licensed under the GNU General Public License version 2, and you can find it on [Sourceforge][15]. - -### KOReader - -[KOReader][16] was originally created for [E Ink][17] eBook readers but found its way to Android. While testing it, I found KOReader to be both useful and frustrating in equal measures. It's definitely not a bad app, but it's not my first choice. - -**Pros of KOReader:** - - * It's highly configurable. - * It supports multiple languages. - * It allows you to look up words using a [dictionary][18] (if you have one installed) or Wikipedia (if you're connected to the internet). - - - -**Cons of KOReader:** - - * You need to change the settings for each book you read. KOReader doesn't remember settings when you open a new book. - * The interface is reminiscent of a dedicated eBook reader. The app doesn't have that Android look and feel. - - - -**Supported eBook formats:** - -You can view PDF, DjVu, CBT, and [CBZ][5] eBooks. It also supports EPUB, FictionBook, .mobi, Word documents, text files, and [Compiled HTML Help][13] (.chm) files. - -![KOReader Android app][19] - -KOReader's source code is licensed under the GNU Affero General Public License version 3.0, and you can find it on [GitHub][20]. - -### Booky McBookface - -Yes, that really is the name of [this eBook reader][21]. It's the most basic of the eBook readers in this article but don't let that (or the goofy name) put you off. Booky McBookface is easy to use and does the one thing it does quite well. - -**Pros of Booky McBookface:** - - * There are no frills. It's just you and your eBook. - * The interface is simple and clean. - * Long-tapping the app's icon in the Android Launcher pops up a menu from which you can open the last book you were reading, get a list of unread books, or find and open a book on your device. - - - -**Cons of Booky McBookface:** - - * The app has few configuration options—you can change the size of the font and the brightness, and that's about it. - * You need to use the buttons at the bottom of the screen to navigate through an eBook. Tapping the edges of the screen doesn't work. - * You can't add bookmarks to an eBook. - - - -**Supported eBook formats:** - -You can read eBooks in EPUB, HTML, or plain text formats with Booky McBookface. - -![Booky McBookface Android app][22] - -Booky McBookface's source code is available under the GNU General Public License version 3.0, and you can find it [on GitHub][23]. - -Do you have a favorite open source eBook reader for Android? Share it with the community by leaving a comment. - -Have you ever downloaded an Android app only to find that it wants access to all your phone's... - -There is a rich and growing ecosystem of open source applications for mobile devices, just like the... - -With these seven open source apps, you can play chess against your phone or an online opponent,... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/open-source-ereaders-android - -作者:[Scott Nesbitt][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/scottnesbitt -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_browser_program_books_read.jpg?itok=iNMWe8Bu (Computer browser with books on the screen) -[2]: https://opensource.com/article/19/3/open-messenger-client -[3]: https://f-droid.org/en/packages/com.github.axet.bookreader/ -[4]: https://material.io/design/ -[5]: https://opensource.com/article/19/3/comic-book-archive-djvu -[6]: https://en.wikipedia.org/wiki/FictionBook -[7]: https://opensource.com/sites/default/files/uploads/book_reader-book-list.png (Book Reader Android app) -[8]: https://gitlab.com/axet/android-book-reader/tree/HEAD -[9]: https://f-droid.org/en/packages/org.coolreader/ -[10]: https://www.gutenberg.org/ -[11]: https://archive.org -[12]: http://aarddict.org/ -[13]: https://fileinfo.com/extension/chm -[14]: https://opensource.com/sites/default/files/uploads/cool_reader-icons.png (Cool Reader Android app) -[15]: https://sourceforge.net/projects/crengine/ -[16]: https://f-droid.org/en/packages/org.koreader.launcher/ -[17]: https://en.wikipedia.org/wiki/E_Ink -[18]: https://github.com/koreader/koreader/wiki/Dictionary-support -[19]: https://opensource.com/sites/default/files/uploads/koreader-lookup.png (KOReader Android app) -[20]: https://github.com/koreader/koreader -[21]: https://f-droid.org/en/packages/com.quaap.bookymcbookface/ -[22]: https://opensource.com/sites/default/files/uploads/booky_mcbookface-menu.png (Booky McBookface Android app) -[23]: https://github.com/quaap/BookyMcBookface diff --git a/sources/tech/20191003 Creating a perfect landing page for free.md b/sources/tech/20191003 Creating a perfect landing page for free.md deleted file mode 100644 index 877e133f50..0000000000 --- a/sources/tech/20191003 Creating a perfect landing page for free.md +++ /dev/null @@ -1,74 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Creating a perfect landing page for free) -[#]: via: (https://opensourceforu.com/2019/10/creating-a-perfect-landing-page-for-free/) -[#]: author: (Jagoda Glowacka https://opensourceforu.com/author/jagoda-glowacka/) - -Creating a perfect landing page for free -====== - -[![][1]][2] - -_Nowadays running an online business has become more popular than doing it in a traditional way. Entrepreneurs are lured by the lack of barriers of entry, simplicity of reaching wide ranges of customers and endless possibilities of growing. With Internet and new technologies it is far easier today to become an online businessman than a traditional one. However, one thing is to become an entrepreneur and another is to keep oneself on the market._ - -Since the digital business world is in constant expansion the competition is getting fiercer and the quality of products and services offered increases. It makes it more troublesome to be noticed in the crowd of alike ambitious online businessmen offering similar products. In order to survive you need to use all the cards you have and even if you have already done that you should always think about improvement and innovation. - -One of this card should definitely be a decent nice-looking and attention-grabbing landing page that boosts your conversions and build trust among your potential customers. Since today you can easily [_create landing page_][3] for free you should never deprive your business of one. As it is a highly powerful tool than can move your business off the ground and gain a lot of new leads. However, in order to do all of this it has to be a high quality landing page that will be impeccable for your targeted audience. - -**A landing page is a must for every online business** - -The concept of landing pages arrived a few years back but these few years were enough to settle down and become the necessity of every online business. At the beginning loads of businessmen decided to ignore their existence and preferred to persuade themselves that a homepage is already enough. Well, sorry to break it for them – but it’s not. - -**Homepage should never equal landing page** - -Obviously, a homepage is also a must for every online business and without it the business can only exist in entrepreneur’s imagination ;-) However, an essence of a homepage is not the same what an essence of a landing page is. And even the most state-of-the-art business website does not replace a good piece of landing page. - -Homepages do serve multiple purposes but none of them is focused on attracting new clients as they don’t clearly encourage visitors to take an action such as subscribing or filling out a contact form. Homepages’ primary focus is the company itself – its full offer, history or founder and it makes them full of distracting information and links. And last but not least, the information on them is not put in order that would make the visitors desire the product instantly. - -**Landing pages impose action** - -Landing page is a standalone website and serves as a first-impression maker among the visitors. It is the place where your new potential customers land and in order to keep them you need to show them instantly that your solution is something they need. It should quickly grab attention of the visitors, engage them in an action and make them interested in your product or service. And it should do all of that as quickly as possible. - -Therefore, landing pages are a great tool which helps you increase your conversion rate, getting information about your visitors, engage new potential leads into action (such as subscribing for a free trial or a newsletter what provide you with personal information about them) and make them believe your product or service is worthwhile. However, in order to fulfill all these functions it needs to have all the necessary landing page elements and it has to be a landing page of high quality. - -**Every landing page needs some core features** -In order to create a perfectly converting landing page you need to plan its structure and put all the essential elements on it that will help you achieve your goals. The core elements that should be placed on every landing page are: - - * headlines which should be catchy, keywords focused and eye-catching. It is the first, and sometimes only, element that visitors read so it has to be well-thought and a little intriguing, - * subheadlines which should be completion of headlines, a little bit more descriptive but still keywords focused and catchy, - * benefits of your solution clearly outlined and demonstrating high value and absolute necessity of purchasing it for your potential leads, - * call-to-action in a visible place and allowing the visitors to subscribe for a free trial, coupons, a newsletter or purchase right away. - - - -All of these features put together in a right order enable you to boost your conversions and make your product or service absolutely desirable for your customers. They are all the core elements of every landing page and without any of them there is a higher risk of landing page failure. - -However, putting all the elements is one thing but designing a landing page is another. When planning its structure you should always have in mind who your target is and adjust your landing page look accordingly. You should always keep up with landing page trends which make your landing page up-to-date and appealing for the customers. - -If it all sounds quite confusing and you are a landing page newbie or still don’t really feel confident in landing page creation you may facilitate this task and use a highly powerful tool the landing page savvies have prepared for you. And that is a [_free landing page creator_][4] which help you create a high quality and eye-catching landing page in less than an hour. - -**Creating a free landing page is a piece of cake** -Today the digital marketing world is full of bad quality landing pages that don’t truly work miracles for businesses. In order to give you all the bonanza the quality of landing page is crucial and choosing a landing page builder designed by landing page experts is one of the most secure options to create a landing page of excellence. - -They are online tools which slightly guide you through the whole creation process making it effortless and quick. They are full of pre-installed features such as landing page layouts and templates, drag and drop function, simple copying and moving or tailoring your landing page to every type of device. You can use these builders up to 14 days for free thanks to a free trial period. Quite nice, huh? ;-) - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/10/creating-a-perfect-landing-page-for-free/ - -作者:[Jagoda Glowacka][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/jagoda-glowacka/ -[b]: https://github.com/lujun9972 -[1]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/09/Long-wait-open-for-webpage-in-broser-using-laptop.jpg?resize=696%2C405&ssl=1 (Long wait open for webpage in broser using laptop) -[2]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/09/Long-wait-open-for-webpage-in-broser-using-laptop.jpg?fit=1996%2C1162&ssl=1 -[3]: https://landingi.com/blog/how-to-create-landing-page -[4]: https://landingi.com/free-landing-page diff --git a/sources/tech/20191003 SQL queries don-t start with SELECT.md b/sources/tech/20191003 SQL queries don-t start with SELECT.md deleted file mode 100644 index 18fb43d437..0000000000 --- a/sources/tech/20191003 SQL queries don-t start with SELECT.md +++ /dev/null @@ -1,144 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (SQL queries don't start with SELECT) -[#]: via: (https://jvns.ca/blog/2019/10/03/sql-queries-don-t-start-with-select/) -[#]: author: (Julia Evans https://jvns.ca/) - -SQL queries don't start with SELECT -====== - -Okay, obviously many SQL queries do start with `SELECT` (and actually this post is only about `SELECT` queries, not `INSERT`s or anything). - -But! Yesterday I was working on an [explanation of window functions][1], and I found myself googling “can you filter based on the result of a window function”. As in – can you filter the result of a window function in a WHERE or HAVING or something? - -Eventually I concluded “window functions must run after WHERE and GROUP BY happen, so you can’t do it”. But this led me to a bigger question – **what order do SQL queries actually run in?**. - -This was something that I felt like I knew intuitively (“I’ve written at least 10,000 SQL queries, some of them were really complicated! I must know this!“) but I struggled to actually articulate what the order was. - -### SQL queries happen in this order - -I looked up the order, and here it is! (SELECT isn’t the first thing, it’s like the 5th thing!) ([here it is in a tweet][2]). - -(I really want to find a more accurate way of phrasing this than “sql queries happen/run in this order” but I haven’t figured it out yet) - - - -In a non-image format, the order is: - - * `FROM/JOIN` and all the `ON` conditions - * `WHERE` - * `GROUP BY` - * `HAVING` - * `SELECT` (including window functions) - * `ORDER BY` - * `LIMIT` - - - -### questions this diagram helps you answer - -This diagram is about the _semantics_ of SQL queries – it lets you reason through what a given query will return and answers questions like: - - * Can I do `WHERE` on something that came from a `GROUP BY`? (no! WHERE happens before GROUP BY!) - * Can I filter based on the results of a window function? (no! window functions happen in `SELECT`, which happens after both `WHERE` and `GROUP BY`) - * Can I `ORDER BY` based on something I did in GROUP BY? (yes! `ORDER BY` is basically the last thing, you can `ORDER BY` based on anything!) - * When does `LIMIT` happen? (at the very end!) - - - -**Database engines don’t actually literally run queries in this order** because they implement a bunch of optimizations to make queries run faster – we’ll get to that a little later in the post. - -So: - - * you can use this diagram when you just want to understand which queries are valid and how to reason about what results of a given query will be - * you _shouldn’t_ use this diagram to reason about query performance or anything involving indexes, that’s a much more complicated thing with a lot more variables - - - -### confounding factor: column aliases - -Someone on Twitter pointed out that many SQL implementations let you use the syntax: - -``` -SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*) -FROM table -GROUP BY full_name -``` - -This query makes it _look_ like GROUP BY happens after SELECT even though GROUP BY is first, because the GROUP BY references an alias from the SELECT. But it’s not actually necessary for the GROUP BY to run after the SELECT for this to work – the database engine can just rewrite the query as - -``` -SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*) -FROM table -GROUP BY CONCAT(first_name, ' ', last_name) -``` - -and run the GROUP BY first. - -Your database engine also definitely does a bunch of checks to make sure that what you put in SELECT and GROUP BY makes sense together before it even starts to run the query, so it has to look at the query as a whole anyway before it starts to come up with an execution plan. - -### queries aren’t actually run in this order (optimizations!) - -Database engines in practice don’t actually run queries by joining, and then filtering, and then grouping, because they implement a bunch of optimizations reorder things to make the query run faster as long as reordering things won’t change the results of the query. - -One simple example of a reason why need to run queries in a different order to make them fast is that in this query: - -``` -SELECT * FROM -owners LEFT JOIN cats ON owners.id = cats.owner -WHERE cats.name = 'mr darcy' -``` - -it would be silly to do the whole left join and match up all the rows in the 2 tables if you just need to look up the 3 cats named ‘mr darcy’ – it’s way faster to do some filtering first for cats named ‘mr darcy’. And in this case filtering first doesn’t change the results of the query! - -There are lots of other optimizations that database engines implement in practice that might make them run queries in a different order but there’s no room for that and honestly it’s not something I’m an expert on. - -### LINQ starts queries with `FROM` - -LINQ (a querying syntax in C# and VB.NET) uses the order `FROM ... WHERE ... SELECT`. Here’s an example of a LINQ query: - -``` -var teenAgerStudent = from s in studentList - where s.Age > 12 && s.Age < 20 - select s; -``` - -pandas (my [favourite data wrangling tool][3]) also basically works like this, though you don’t need to use this exact order – I’ll often write pandas code like this: - -``` -df = thing1.join(thing2) # like a JOIN -df = df[df.created_at > 1000] # like a WHERE -df = df.groupby('something', num_yes = ('yes', 'sum')) # like a GROUP BY -df = df[df.num_yes > 2] # like a HAVING, filtering on the result of a GROUP BY -df = df[['num_yes', 'something1', 'something']] # pick the columns I want to display, like a SELECT -df.sort_values('sometthing', ascending=True)[:30] # ORDER BY and LIMIT -df[:30] -``` - -This isn’t because pandas is imposing any specific rule on how you have to write your code, though. It’s just that it often makes sense to write code in the order JOIN / WHERE / GROUP BY / HAVING. (I’ll often put a `WHERE` first to improve performance though, and I think most database engines will also do a WHERE first in practice) - -`dplyr` in R also lets you use a different syntax for querying SQL databases like Postgres, MySQL and SQLite, which is also in a more logical order. - -### I was really surprised that I didn’t know this - -I’m writing a blog post about this because when I found out the order I was SO SURPRISED that I’d never seen it written down that way before – it explains basically everything that I knew intuitively about why some queries are allowed and others aren’t. So I wanted to write it down in the hopes that it will help other people also understand how to write SQL queries. - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019/10/03/sql-queries-don-t-start-with-select/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://twitter.com/b0rk/status/1179419244808851462?s=20 -[2]: https://twitter.com/b0rk/status/1179449535938076673 -[3]: https://github.com/jvns/pandas-cookbook diff --git a/sources/tech/20191006 Use internal packages to reduce your public API surface.md b/sources/tech/20191006 Use internal packages to reduce your public API surface.md deleted file mode 100644 index eef43ae560..0000000000 --- a/sources/tech/20191006 Use internal packages to reduce your public API surface.md +++ /dev/null @@ -1,54 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Use internal packages to reduce your public API surface) -[#]: via: (https://dave.cheney.net/2019/10/06/use-internal-packages-to-reduce-your-public-api-surface) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -Use internal packages to reduce your public API surface -====== - -In the beginning, before the `go` tool, before Go 1.0, the Go distribution stored the standard library in a subdirectory called `pkg/` and the commands which built upon it in `cmd/`. This wasn’t so much a deliberate taxonomy but a by product of the original `make` based build system. In [September 2014][1], the Go distribution dropped the `pkg/` subdirectory, but then this tribal knowledge had set root in large Go projects and continues to this day. - -I tend to view empty directories inside a Go project with suspicion. Often they are a hint that the module’s author may be trying to create a taxonomy of packages rather than ensuring each package’s name, and thus its enclosing directory, [uniquely describes its purpose][2]. While the symmetry with `cmd/` for `package main` commands is appealing, a directory that exists only to hold other packages is a potential design smell. - -More importantly, the boilerplate of an empty `pkg/` directory distracts from the more useful idiom of an `internal/` directory. `internal/` is a special directory name recognised by the `go` tool which will prevent one package from being imported by another unless both share a common ancestor. Packages within an `internal/` directory are therefore said to be _internal packages_. - -To create an internal package, place it within a directory named `internal/`. When the `go` command sees an import of a package with `internal/` in the import path, it verifies that the importing package is within the tree rooted at the _parent_ of the `internal/` directory. - -For example, a package `/a/b/c/internal/d/e/f` can only be imported by code in the directory tree rooted at `/a/b/c`. It cannot be imported by code in `/a/b/g` or in any other repository. - -If your project contains multiple packages you may find you have some exported symbols which are intended to be used by other packages in your project, but are not intended to be part of your project’s public API. Although Go has limited visibility modifiers–public, exported, symbols and private, non exported, symbols–internal packages provide a useful mechanism for controlling visibility to parts of your project which would otherwise be considered part of its public versioned API. - -You can, of course, promote internal packages later if you want to commit to supporting that API; just move them up a directory level or two. The key is this process is _opt-in_. As the author, internal packages give you control over which symbols in your project’s public API without being forced to glob concepts together into unwieldy mega packages to avoid exporting them. - -### Related posts: - - 1. [Stress test your Go packages][3] - 2. [Practical public speaking for Nerds][4] - 3. [Five suggestions for setting up a Go project][5] - 4. [Automatically fetch your project’s dependencies with gb][6] - - - --------------------------------------------------------------------------------- - -via: https://dave.cheney.net/2019/10/06/use-internal-packages-to-reduce-your-public-api-surface - -作者:[Dave Cheney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://dave.cheney.net/author/davecheney -[b]: https://github.com/lujun9972 -[1]: https://groups.google.com/forum/m/#!msg/golang-dev/c5AknZg3Kww/OFLmvGyfNR0J -[2]: https://dave.cheney.net/2019/01/08/avoid-package-names-like-base-util-or-common -[3]: https://dave.cheney.net/2013/06/19/stress-test-your-go-packages (Stress test your Go packages) -[4]: https://dave.cheney.net/2015/02/17/practical-public-speaking-for-nerds (Practical public speaking for Nerds) -[5]: https://dave.cheney.net/2014/12/01/five-suggestions-for-setting-up-a-go-project (Five suggestions for setting up a Go project) -[6]: https://dave.cheney.net/2016/06/26/automatically-fetch-your-projects-dependencies-with-gb (Automatically fetch your project’s dependencies with gb) diff --git a/sources/tech/20191007 Introduction to open source observability on Kubernetes.md b/sources/tech/20191007 Introduction to open source observability on Kubernetes.md deleted file mode 100644 index acd1bc1331..0000000000 --- a/sources/tech/20191007 Introduction to open source observability on Kubernetes.md +++ /dev/null @@ -1,202 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Introduction to open source observability on Kubernetes) -[#]: via: (https://opensource.com/article/19/10/open-source-observability-kubernetes) -[#]: author: (Yuri Grinshteyn https://opensource.com/users/yuri-grinshteyn) - -Introduction to open source observability on Kubernetes -====== -In the first article in this series, learn the signals, mechanisms, -tools, and platforms you can use to observe services running on -Kubernetes. -![Looking back with binoculars][1] - -With the advent of DevOps, engineering teams are taking on more and more ownership of the reliability of their services. While some chafe at the increased operational burden, others welcome the opportunity to treat service reliability as a key feature, invest in the necessary capabilities to measure and improve reliability, and deliver the best possible customer experiences. - -This change is measured explicitly in the [2019 Accelerate State of DevOps Report][2]. One of its most interesting conclusions (as written in the summary) is: - -> "Delivering software quickly, **reliably** _[emphasis mine]_, and safely is at the heart of technology transformation and organizational performance. We see continued evidence that software speed, stability, and **availability** _[emphasis mine]_ contribute to organizational performance (including profitability, productivity, and customer satisfaction). Our highest performers are twice as likely to meet or exceed their organizational performance goals." - -The full [report][3] says: - -> "**Low performers use more proprietary software than high and elite performers**: The cost to maintain and support proprietary software can be prohibitive, prompting high and elite performers to use open source solutions. This is in line with results from previous reports. In fact, the 2018 Accelerate State of DevOps Report found that elite performers were 1.75 times more likely to make extensive use of open source components, libraries, and platforms." - -This is a strong testament to the value of open source as a general accelerator of performance. Combining these two conclusions leads to the rather obvious thesis for this series: - -> Reliability is a critical feature, observability is a necessary component of reliability, and open source tooling is at least _A_ right approach, if not _THE_ right approach. - -This article, the first in a series, will introduce the types of signals engineers typically rely on and the mechanisms, tools, and platforms that you can use to instrument services running on Kubernetes to emit these signals, ingest and store them, and use and interpret them. - -From there, the series will continue with hands-on tutorials, where I will walk through getting started with each of the tools and technologies. By the end, you should be well-equipped to start improving the observability of your own systems! - -### What is observability? - -While observability as a general [concept in control theory][4] has been around since at least 1960, its applicability to digital systems and services is rather new and in some ways an evolution of how these systems have been monitored for the last two decades. You are likely familiar with the necessity of monitoring services to ensure you know about issues before your users are impacted. You are also likely familiar with the idea of using metric data to better understand the health and state of a system, especially in the context of troubleshooting during an incident or debugging. - -The key differentiation between monitoring and observability is that observability is an inherent property of a system or service, rather than something someone does to the system, which is what monitoring fundamentally is. [Cindy Sridharan][5], author of a free [e-book][6] on observability in distributed systems, does a great job of explaining the difference in an excellent [Medium article][7]. - -It is important to distinguish between these two terms because observability, as a property of the service you build, is your responsibility. As a service developer and owner, you have full control over the signals your system emits, how and where those signals are ingested and stored, and how they're utilized. This is in contrast to "monitoring," which may be done by others (and by you) to measure the availability and performance of your service and generate alerts to let you know that service reliability has degraded. - -### Signals - -Now that you understand the idea of observability as a property of a system that you control and that is explicitly manifested as the signals you instruct your system to emit, it's important to understand and describe the kinds of signals generally considered in this context. - -#### What are metrics? - -A metric is a fundamental type of signal that can be emitted by a service or the infrastructure it's running on. At its most basic, it is the combination of: - - 1. Some identifier, hopefully descriptive, that indicates what the metric represents - 2. A series of data points, each of which contains two elements: -a. The timestamp at which the data point was generated (or ingested) -b. A numeric value representing the state of the thing you're measuring at that time - - - -Time-series metrics have been and remain the key data structure used in monitoring and observability practice and are the primary way that the state and health of a system are represented over time. They are also the primary mechanism for alerting, but that practice and others (like incident management, on-call, and postmortems) are outside the scope here. For now, the focus is on how to instrument systems to emit metrics, how to store them, and how to use them for charts and dashboards to help you visualize the current and historical state of your system. - -Metrics are used for two primary purposes: health and insight. - -Understanding the health and state of your infrastructure, platform, and service is essential to keeping them available to users. Generally, these are emitted by the various components chosen to build services, and it's just a matter of setting up the right collection and storage infrastructure to be able to use them. Metrics from the simple (node CPU utilization) to the esoteric (garbage collection statistics) fall into this category. - -Metrics are also essential to understanding what is happening in the system to avoid interruptions to your services. From this perspective, a service can emit custom telemetry that precisely describes specific aspects of how the service is functioning and performing. This will require you to instrument the code itself, usually by including specific libraries, and specify an export destination. - -#### What are logs? - -Unlike metrics that represent numeric values that change over time, logs represent discrete events. Log entries contain both the log payload—the message emitted by a component of the service or the code—and often metadata, such as the timestamp, label, tag, or other identifiers. Therefore, this is by far the largest volume of data you need to store, and you should carefully consider your log ingestion and storage strategies as you look to take on increasing user traffic. - -#### What are traces? - -Distributed tracing is a relatively new addition to the observability toolkit and is specifically relevant to microservice architectures to allow you to understand latency and how various backend service calls contribute to it. Ted Young published an [excellent article on the concept][8] that includes its origins with Google's [Dapper paper][9] and subsequent evolution. This series will be specifically concerned with the various implementations available. - -### Instrumentation - -Once you identify the signals you want to emit, store, and analyze, you need to instruct your system to create the signals and build a mechanism to store and analyze them. Instrumentation refers to those parts of your code that are used to generate metrics, logs, and traces. In this series, we'll discuss open source instrumentation options and introduce the basics of their use through hands-on tutorials. - -### Observability on Kubernetes - -Kubernetes is the dominant platform today for deploying and maintaining containers. As it rose to the top of the industry's consciousness, so did new technologies to provide effective observability tooling around it. Here is a short list of these essential technologies; they will be covered in greater detail in future articles in this series. - -#### Metrics - -Once you select your preferred approach for instrumenting your service with metrics, the next decision is where to store those metrics and what set of services will support your effort to monitor your environment. - -##### Prometheus - -[Prometheus][10] is the best place to start when looking to monitor both your Kubernetes infrastructure and the services running in the cluster. It provides everything you'll need, including client instrumentation libraries, the [storage backend][11], a visualization UI, and an alerting framework. Running Prometheus also provides a wealth of infrastructure metrics right out of the box. It further provides [integrations][12] with third-party providers for storage, although the data exchange is not bi-directional in every case, so be sure to read the documentation if you want to store metric data in multiple locations. - -Later in this series, I will walk through setting up Prometheus in a cluster for basic infrastructure monitoring and adding custom telemetry to an application using the Prometheus client libraries. - -##### Graphite - -[Graphite][13] grew out of an in-house development effort at Orbitz and is now positioned as an enterprise-ready monitoring tool. It provides metrics storage and retrieval mechanisms, but no instrumentation capabilities. Therefore, you will still need to implement Prometheus or OpenCensus instrumentation to collect metrics. Later in this series, I will walk through setting up Graphite and sending metrics to it. - -##### InfluxDB - -[InfluxDB][14] is another open source database purpose-built for storing and retrieving time-series metrics. Unlike Graphite, InfluxDB is supported by a company called InfluxData, which provides both the InfluxDB software and a cloud-hosted version called InfluxDB Cloud. Later in this series, I will walk through setting up InfluxDB in a cluster and sending metrics to it. - -##### OpenTSDB - -[OpenTSDB][15] is also an open source purpose-built time-series database. One of its advantages is the ability to use [HBase][16] as the storage layer, which allows integration with a cloud managed service like Google's Cloud Bigtable. Google has published a [reference guide][17] on setting up OpenTSDB to monitor your Kubernetes cluster (assuming it's running in Google Kubernetes Engine, or GKE). Since it's a great introduction, I recommend following Google's tutorial if you're interested in learning more about OpenTSDB. - -##### OpenCensus - -[OpenCensus][18] is the open source version of the [Census library][19] developed at Google. It provides both metric and tracing instrumentation capabilities and supports a number of backends to [export][20] the metrics to—including Prometheus! Note that OpenCensus does not monitor your infrastructure, and you will still need to determine the best approach if you choose to use OpenCensus for custom metric telemetry. - -We'll revisit this library later in this series, and I will walk through creating metrics in a service and exporting them to a backend. - -#### Logging for observability - -If metrics provide "what" is happening, logging tells part of the story of "why." Here are some common options for consistently gathering and analyzing logs. - -##### Collecting with fluentd - -In the Kubernetes ecosystem, [fluentd][21] is the de-facto open source standard for collecting logs emitted in the cluster and forwarding them to a specified backend. You can use config maps to modify fluentd's behavior, and later in the series, I'll walk through deploying it in a cluster and modifying the associated config map to parse unstructured logs and convert them to structured for better and easier analysis. In the meantime, you can read my post "[Customizing Kubernetes logging (Part 1)][22]" on how to do that on GKE. - -##### Storing and analyzing with ELK - -The most common storage mechanism for logs is provided by [Elastic][23] in the form of the "ELK" stack. As Elastic says: - -> "'ELK' is the acronym for three open source projects: Elasticsearch, Logstash, and Kibana. Elasticsearch is a search and analytics engine. Logstash is a server‑side data processing pipeline that ingests data from multiple sources simultaneously, transforms it, and then sends it to a 'stash' like Elasticsearch. Kibana lets users visualize data with charts and graphs in Elasticsearch." - -Later in the series, I'll walk through setting up Elasticsearch, Kibana, and Logstash in -a cluster to store and analyze logs being collected by fluentd. - -#### Distributed traces and observability - -When asking "why" in analyzing service issues, logs can only provide the information that applications are designed to share with it. The way to go even deeper is to gather traces. As the [OpenTracing initiative][24] says: - -> "Distributed tracing, also called distributed request tracing, is a method used to profile and monitor applications, especially those built using a microservices architecture. Distributed tracing helps pinpoint where failures occur and what causes poor performance." - -##### Istio - -The [Istio][25] open source service mesh provides multiple benefits for microservice architectures, including traffic control, security, and observability capabilities. It does not combine multiple spans into a single trace to assemble a full picture of what happens when a user call traverses a distributed system, but it can nevertheless be useful as an easy first step toward distributed tracing. It also provides other observability benefits—it's the easiest way to get ["golden signal"][26] metrics for each service, and it also adds logging for each request, which can be very useful for calculating error rates. You can read my post on [using it with Google's Stackdriver][27]. I'll revisit it in this series and show how to install it in a cluster and configure it to export observability data to a backend. - -##### OpenCensus - -I described [OpenCensus][28] in the Metrics section above, and that's one of the main reasons for choosing it for distributed tracing: Using a single library for both metrics and traces is a great option to reduce your instrumentation work—with the caveat that you must be working in a language that supports both the traces and stats exporters. I'll come back to OpenCensus and show how to get started instrumenting code for distributed tracing. Note that OpenCensus provides only the instrumentation library, and you'll still need to use a storage and visualization layer like Zipkin, Jaeger, Stackdriver (on GCP), or X-Ray (on AWS). - -##### Zipkin - -[Zipkin][29] is a full, distributed tracing solution that includes instrumentation, storage, and visualization. It's a tried and true set of tools that's been around for years and has a strong user and developer community. It can also be used as a backend for other instrumentation options like OpenCensus. In a future tutorial, I'll show how to set up the Zipkin server and instrument your code. - -##### Jaeger - -[Jaeger][30] is another open source tracing solution that includes all the components you'll need. It's a newer project that's being incubated at the Cloud Native Computing Foundation (CNCF). Whether you choose to use Zipkin or Jaeger may ultimately depend on your experience with them and their support for the language you're writing your service in. In this series, I'll walk through setting up Jaeger and instrumenting code for tracing. - -### Visualizing observability data - -The final piece of the toolkit for using metrics is the visualization layer. There are basically two options here: the "native" visualization that your persistence layers enable (e.g., the Prometheus UI or Flux with InfluxDB) or a purpose-built visualization tool. - -[Grafana][31] is currently the de facto standard for open source visualization. I'll walk through setting it up and using it to visualize data from various backends later in this series. - -### Looking ahead - -Observability on Kubernetes has many parts and many options for each type of need. Metric, logging, and tracing instrumentation provide the bedrock of information needed to make decisions about services. Instrumenting, storing, and visualizing data are also essential. Future articles in this series will dive into all of these options with hands-on tutorials for each. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/open-source-observability-kubernetes - -作者:[Yuri Grinshteyn][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/yuri-grinshteyn -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/look-binoculars-sight-see-review.png?itok=NOw2cm39 (Looking back with binoculars) -[2]: https://cloud.google.com/blog/products/devops-sre/the-2019-accelerate-state-of-devops-elite-performance-productivity-and-scaling -[3]: https://services.google.com/fh/files/misc/state-of-devops-2019.pdf -[4]: https://en.wikipedia.org/wiki/Observability -[5]: https://twitter.com/copyconstruct -[6]: https://t.co/0gOgZp88Jn?amp=1 -[7]: https://medium.com/@copyconstruct/monitoring-and-observability-8417d1952e1c -[8]: https://opensource.com/article/18/5/distributed-tracing -[9]: https://research.google.com/pubs/pub36356.html -[10]: https://prometheus.io/ -[11]: https://prometheus.io/docs/prometheus/latest/storage/ -[12]: https://prometheus.io/docs/operating/integrations/#remote-endpoints-and-storage -[13]: https://graphiteapp.org/ -[14]: https://www.influxdata.com/get-influxdb/ -[15]: http://opentsdb.net/ -[16]: https://hbase.apache.org/ -[17]: https://cloud.google.com/solutions/opentsdb-cloud-platform -[18]: https://opencensus.io/ -[19]: https://opensource.googleblog.com/2018/03/how-google-uses-opencensus-internally.html -[20]: https://opencensus.io/exporters/#exporters -[21]: https://www.fluentd.org/ -[22]: https://medium.com/google-cloud/customizing-kubernetes-logging-part-1-a1e5791dcda8 -[23]: https://www.elastic.co/ -[24]: https://opentracing.io/docs/overview/what-is-tracing -[25]: http://istio.io/ -[26]: https://landing.google.com/sre/sre-book/chapters/monitoring-distributed-systems/ -[27]: https://medium.com/google-cloud/istio-and-stackdriver-59d157282258 -[28]: http://opencensus.io/ -[29]: https://zipkin.io/ -[30]: https://www.jaegertracing.io/ -[31]: https://grafana.com/ diff --git a/sources/tech/20191007 Understanding Joins in Hadoop.md b/sources/tech/20191007 Understanding Joins in Hadoop.md deleted file mode 100644 index 4c34ed896c..0000000000 --- a/sources/tech/20191007 Understanding Joins in Hadoop.md +++ /dev/null @@ -1,66 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Understanding Joins in Hadoop) -[#]: via: (https://opensourceforu.com/2019/10/understanding-joins-in-hadoop/) -[#]: author: (Bhaskar Narayan Das https://opensourceforu.com/author/bhaskar-narayan/) - -Understanding Joins in Hadoop -====== - -[![Hadoop big data career opportunities][1]][2] - -_Those who have just begun the study of Hadoop might have come across different types of joins. This article briefly discusses normal joins, map side joins and reduce side joins. The differences between map side joins and reduce side joins, as well as their pros and cons, are also discussed._ - -Normally, the term join is used to refer to the combination of the record-sets of two tables. Thus when we run a query, tables are joined and we get the data from two tables in the joined format, as is the case in SQL joins. Joins find maximum usage in Hadoop processing. They should be used when large data sets are encountered and there is no urgency to generate the outcome. In case of Hadoop common joins, Hadoop distributes all the rows on all the nodes based on the join key. Once this is achieved, all the keys that have the same values end up on the same node and then, finally, the join at the reducer happens. This scenario is perfect when both the tables are huge, but when one table is small and the other is quite big, common joins become inefficient and take more time to distribute the row. - -While processing data using Hadoop, we generally do it over the map phase and the reduce phase. Thus there are mappers and reducers that do the job for the map phase and the reduce phase. We use map reduce joins when we encounter a large data set that is too big to use data-sharing techniques. - -**Map side joins** -Map side join is the term used when the record sets of two tables are joined within the mapper. In this case, the reduce phase is not involved. In the map side join, the record sets of the tables are loaded into memory, ensuring a faster join operation. Map side join is convenient for small tables and not recommended for large tables. In situations where you have queries running too frequently with small table joins you could experience a very significant reduction in query computation time. - -**Reduce side joins** -Reduce side joins happen at the reduce side of Hadoop processing. They are also known as repartitioned sort merge joins, or simply, repartitioned joins or distributed joins or common joins. They are the most widely used joins. Reduce side joins happen when both the tables are so big that they cannot fit into the memory. The process flow of reduce side joins is as follows: - - 1. The input data is read by the mapper, which needs to be combined on the basis of the join key or common column. - 2. Once the input data is processed by the mapper, it adds a tag to the processed input data in order to distinguish the input origin sources. - 3. The mapper returns the intermediate key-value pair, where the key is also the join key. - 4. For the reducer, a key and a list of values is generated once the sorting and shuffling phase is complete. - 5. The reducer joins the values that are present in the generated list along with the key to produce the final outcome. - - - -The join at the reduce side combines the output of two mappers based on a common key. This scenario is quite synonymous with SQL joins, where the data sets of two tables are joined based on a primary key. In this case we have to decide which field is the primary key. -There are a few terms associated with reduce side joins: -1\. _Data source:_ This is nothing but the input files. -2\. _Tag:_ This is basically used to distinguish each input data on the basis of its origin. -3\. _Group key:_ This refers to the common column that is used as a join key to combine the output of two mappers. - -**Difference between map side joins and reduce side joins** - - 1. A map side join, as explained earlier, happens on the map side whereas a reduce side join happens on the reduce side. - 2. A map side join happens in the memory whereas a reduce side join happens off the memory. - 3. Map side joins are effective when one data set is big while the other is small, whereas reduce side joins work effectively for big size data sets. - 4. Map side joins are expensive, whereas reduce side joins are cheap. - - - -Opt for map side joins when the table size is small and fits in memory, and you require the job to be completed in a short span of time. Use the reduce side join when dealing with large data sets, which cannot fit into the memory. Reduce side joins are easy to implement and have the advantage of their inbuilt sorting and shuffling algorithms. Besides this, there is no requirement to strictly follow any formatting rule for input in case of reduce side joins, and these could also be performed on unstructured data sets. - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/10/understanding-joins-in-hadoop/ - -作者:[Bhaskar Narayan Das][a] -选题:[lujun9972][b] -译者:[heguangzhi](https://github.com/heguangzhi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/bhaskar-narayan/ -[b]: https://github.com/lujun9972 -[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/06/Hadoop-big-data.jpg?resize=696%2C441&ssl=1 (Hadoop big data career opportunities) -[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/06/Hadoop-big-data.jpg?fit=750%2C475&ssl=1 diff --git a/sources/tech/20191008 Bringing Some Order into a Collection of Photographs.md b/sources/tech/20191008 Bringing Some Order into a Collection of Photographs.md deleted file mode 100644 index b3c2dee08e..0000000000 --- a/sources/tech/20191008 Bringing Some Order into a Collection of Photographs.md +++ /dev/null @@ -1,119 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Bringing Some Order into a Collection of Photographs) -[#]: via: (https://opensourceforu.com/2019/10/bringing-some-order-into-a-collection-of-photographs/) -[#]: author: (Dr Anil Seth https://opensourceforu.com/author/anil-seth/) - -Bringing Some Order into a Collection of Photographs -====== - -[![][1]][2] - -_In this article, the author shares tips on managing photographs using different Internet resources and Python programming._ - -These days, it is very easy to let Google Photos or similar cloud based services manage your photos. You can keep clicking on the smartphone and the photos get saved. The tools for helping you find photos, especially based on the content, keep getting better. There is no cost to keeping all your photos as long as you are an amateur and not taking very high resolution images. And it is far easier to let the dozens of photos clicked by accident remain on the cloud, than to remove them! - -Even if you are willing to delegate the task of managing photos to AI tools, there is still the challenge of what to do with the photos taken before the smartphone era. Broadly, the photos can be divided into two groups — those taken with digital cameras and the physical photo prints. -Each of the two categories will need to be handled and managed differently. First, consider the older physical photos. - -**Managing physical photos in the digital era** - -Photos can deteriorate over time. So, the sooner you digitise them, the better you will preserve your memories. Besides, it is far easier to share a memory digitally when the family members are scattered across the globe. - -The first hard decision is related to the physical albums. Should you take photos out of albums for scanning and risk damaging the albums, or scan the album pages and then crop individual photos from the album pages? Scanning or imaging tools can help with the cropping of photos. -In this article, we assume that you are ready to deal with a collection of individual photos. - -One of the great features of photo management software, both on the cloud and the desktop, is that they organise the photos by date. However, the only date associated with scanned photos is the date of scanning! It will be a while before the AI software will place the photos on a timeline by examining the age of the people in the photos. Currently, you will need to handle this aspect manually. - -One would like to be able to store a date in the metadata of the image so every tool can use it. -Python has a number of packages to help you do this. A pretty easy one to use is pyexiv2. Here is a snippet of sample code to modify the date of an image: - -``` -import datetime -import pyexiv2 -EXIF_DATE = ‘Exif.Image.DateTime’ -EXIF_ORIG_DATE = ‘Exif.Photo.DateTimeOriginal’ -def update_exif(filename,date): -try: -metadata=pyexiv2.ImageMetadata(filename) -metadata.read() -metadata[EXIF_DATE]=date -metadata[EXIF_ORIG_DATE]=date -metadata.write() -except: -print(“Error “ + f) -``` - -Most photo management software seem to use either of the two dates, whichever is available. While you are setting the date, you might as well set both! There can be various ways in which the date for the photo may be specified. You may find the following scheme convenient. -Sort the photos manually into directories, each with the name _yy-mm-dd_. If the date is not known, you might as well select an approximate date. If the month also is not known, set it to 01. Now, you can use the _os.walk_ function to iterate over the directories and files, and set the date for each file as just suggested above. - -You may further divide the files into event based sub-directories, event_label, and use that to label photos, as follows: - -``` -LABEL = ‘Xmp.xmp.Label’ -metadata[LABEL] = pyexiv2.XmpTag(LABEL,event_label) -``` - -This is only for illustration purposes. You can decide on how you would like to organise the photos and use what seems most convenient for you. - -**Digital photos** -Digital photos have different challenges. It is so easy to keep taking photos that you are likely to have a lot of them. Unless you have been careful, you are likely to find that you have used different tools for downloading photos from digital cameras and smartphones, so the file names and directory names are not consistent. A convenient option is to use the date and time of an image from the metadata and rename files accordingly. An example code follows: - -``` -import os -import datetime -import pyexiv2 -EXIF_DATE = ‘Exif.Image.DateTime’ -EXIF_ORIG_DATE = ‘Exif.Photo.DateTimeOriginal’ -def rename_file(p,f,fpref,ctr): -fold,fext = f.rsplit(‘.’,1) # separate the ext, e.g. jpg -fname = fpref + “-%04i”%ctr # add a serial number to ensure uniqueness -fnew = ‘.’.join((fname,fext)) -os.rename(‘/’.join((p,f)),’/’.join((p,fnew))) - -def process_files(path, files): -ctr = 0 -for f in files: -try: -metadata=pyexiv2.ImageMetadata(‘/’.join((path,f))) -metadata.read() -if EXIF_ORIG_DATE in metadata.exif_keys: -datestamp = metadata[EXIF_ORIG_DATE].human_value -else: -datestamp = metadata[EXIF_DATE].human_value -datepref = ‘_’.join([ x.replace(‘:’,’-’) for x in datestamp.split(‘ ‘)]) -rename_file(path,f,datepref,ctr) -ctr += 1 -except: -print(‘Error in %s/%s’%(path,f)) -for path, dirs, files in os.walk(‘.’): # work with current directory for convenience -if len(files) > 0: -process_files(path, files) -``` - -All the file names now have a consistent file name. Since the photo managing software provides a way to view the photos by time, it seems that organising the files into directories that have meaningful names may be preferable. You can move photos into directories/albums that are meaningful. The photo management software will let you view photos either by albums or by dates. - -**Reducing clutter and duplicates** -Over time, my collection included multiple copies of the same photos. In the old days, to share photos easily, I used to even keep low resolution copies. Digikam has an excellent option of identifying similar photos. However, each photo needs to be handled individually. A very convenient tool for finding the duplicate files and managing them programmatically is *. The output of this program contains each set of duplicate files on a separate line. - -You can use the Python Pillow and Matplotlib packages to display the images. Use the image’s size to select the image with the highest resolution among the duplicates, retain that and delete the rest. -One thing is certain, though. After all the work is done, it is a pleasure to look at the photographs and relive all those old memories. - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/10/bringing-some-order-into-a-collection-of-photographs/ - -作者:[Dr Anil Seth][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/anil-seth/ -[b]: https://github.com/lujun9972 -[1]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Gimp-6-Souping-up-photos.jpg?resize=696%2C492&ssl=1 (Gimp-6 Souping up photos) -[2]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Gimp-6-Souping-up-photos.jpg?fit=900%2C636&ssl=1 diff --git a/sources/tech/20191009 Start developing in the cloud with Eclipse Che IDE.md b/sources/tech/20191009 Start developing in the cloud with Eclipse Che IDE.md deleted file mode 100644 index e3ddcf5e07..0000000000 --- a/sources/tech/20191009 Start developing in the cloud with Eclipse Che IDE.md +++ /dev/null @@ -1,124 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Start developing in the cloud with Eclipse Che IDE) -[#]: via: (https://opensource.com/article/19/10/cloud-ide-che) -[#]: author: (Bryant Son https://opensource.com/users/brson) - -Start developing in the cloud with Eclipse Che IDE -====== -Eclipse Che offers Java developers an Eclipse IDE in a container-based -cloud environment. -![Tools in a cloud][1] - -In the many, many technical interviews I've gone through in my professional career, I've noticed that I'm rarely asked questions that have definitive answers. Most of the time, I'm asked open-ended questions that do not have an absolutely correct answer but evaluate my prior experiences and how well I can explain things. - -One interesting open-ended question that I've been asked several times is: - -> "As you start your first day on a project, what five tools do you install first and why?" - -There is no single definitely correct answer to this question. But as a programmer who codes, I know the must-have tools that I cannot live without. And as a Java developer, I always include an interactive development environment (IDE)—and my two favorites are Eclipse IDE and IntelliJ IDEA. - -### My Java story - -When I was a student at the University of Texas at Austin, most of my computer science courses were taught in Java. And as an enterprise developer working for different companies, I have mostly worked with Java to build various enterprise-level applications. So, I know Java, and most of the time I've developed with Eclipse. I have also used the Spring Tools Suite (STS), which is a variation of the Eclipse IDE that is installed with Spring Framework plugins, and IntelliJ, which is not exactly open source, since I prefer its paid edition, but some Java developers favor it due to its faster performance and other fancy features. - -Regardless of which IDE you use, installing your own developer IDE presents one common, big problem: _"It works on my computer, and I don't know why it doesn't work on your computer."_ - -[![xkcd comic][2]][3] - -Because a developer tool like Eclipse can be highly dependent on the runtime environment, library configuration, and operating system, the task of creating a unified sharing environment for everyone can be quite a challenge. - -But there is a perfect solution to this. We are living in the age of cloud computing, and Eclipse Che provides an open source solution to running an Eclipse-based IDE in a container-based cloud environment. - -### From local development to a cloud environment - -I want the benefits of a cloud-based development environment with the familiarity of my local system. That's a difficult balance to find. - -When I first heard about Eclipse Che, it looked like the cloud-based development environment I'd been looking for, but I got busy with technology I needed to learn and didn't follow up with it. Then a new project came up that required a remote environment, and I had the perfect excuse to use Che. Although I couldn't fully switch to the cloud-based IDE for my daily work, I saw it as a chance to get more familiar with it. - -![Eclipse Che interface][4] - -Eclipse Che IDE has a lot of excellent [features][5], but what I like most is that it is an open source framework that offers exactly what I want to achieve: - - 1. Scalable workspaces leveraging the power of cloud - 2. Extensible and customizable plugins for different runtimes - 3. A seamless onboarding experience to enable smooth collaboration between members - - - -### Getting started with Eclipse Che - -Eclipse Che can be installed on any container-based environment. I run both [Code Ready Workspace 1.2][6] and [Eclipse Che 7][7] on [OpenShift][8], but I've also tried it on top of [Minikube][9] and [Minishift][10]. - -![Eclipse Che on OpenShift][11] - -Read the requirement guides to ensure your runtime is compatible with Che: - - * [Che on Kubernetes][12] - * [Che on OpenShift-compatible OSS environments like OKD][13] - - - -For instance, you can quickly install Eclipse Che if you launch OKD locally through Minishift, but make sure to have at least 5GB RAM to have a smooth experience. - -There are various ways to install Eclipse Che; I recommend leveraging the Che command-line interface, [chectl][14]. Although it is still in an incubator stage, it is my preferred way because it gives multiple configuration and management options. You can also run the installation as [an Operator][15], which you can [read more about][16]. I decided to go with chectl since I did not want to take on both concepts at the same time. Che's quick-start provides [installation steps for many scenarios][17]. - -### Why cloud works best for me - -Although the local installation of Eclipse Che works, I found the most painless way is to install it on one of the common public cloud vendors. - -I like to collaborate with others in my IDE; working collaboratively is essential if you want your application to be something more than a hobby project. And when you are working at a company, there will be enterprise considerations around the application lifecycle of develop, test, and deploy for your application. - -Eclipse Che's multi-user capability means each person owns an isolated workspace that does not interfere with others' workspaces, yet team members can still collaborate on application development by working in the same cluster. And if you are considering moving to Eclipse Che for something more than a hobby or testing, the cloud environment's multi-user features will enable a faster development cycle. This includes [resource management][18] to ensure resources are allocated to each environment, as well as security considerations like [authentication and authorization][19] (or specific needs like [OpenID][20]) that are important to maintaining the environment. - -Therefore, moving Eclipse Che to the cloud early will be a good choice if your development experience is like mine. By moving to the cloud, you can take advantage of cloud-based scalability and resource flexibility while on the road. - -### Use Che and give back - -I really enjoy this new development configuration that enables me to regularly code in the cloud. Open source enables me to do so in an easy way, so it's important for me to consider how to give back. All of Che's components are open source under the Eclipse Public License 2.0 and available on GitHub at the following links: - - * [Eclipse Che GitHub][21] - * [Eclipse Che Operator][15] - * [chectl (Eclipse Che CLI)][14] - - - -Consider using Che and giving back—either as a user by filing bug reports or as a developer to help enhance the project. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/cloud-ide-che - -作者:[Bryant Son][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/cloud_tools_hardware.png?itok=PGjJenqT (Tools in a cloud) -[2]: https://opensource.com/sites/default/files/uploads/1_xkcd.jpg (xkcd comic) -[3]: https://xkcd.com/1316 -[4]: https://opensource.com/sites/default/files/uploads/0_banner.jpg (Eclipse Che interface) -[5]: https://www.eclipse.org/che/features -[6]: https://developers.redhat.com/products/codeready-workspaces/overview -[7]: https://che.eclipse.org/eclipse-che-7-is-now-available-40ae07120b38 -[8]: https://www.openshift.com/ -[9]: https://kubernetes.io/docs/tutorials/hello-minikube/ -[10]: https://www.okd.io/minishift/ -[11]: https://opensource.com/sites/default/files/uploads/2_openshiftresources.jpg (Eclipse Che on OpenShift) -[12]: https://www.eclipse.org/che/docs/che-6/kubernetes-single-user.html -[13]: https://www.eclipse.org/che/docs/che-6/openshift-single-user.html -[14]: https://github.com/che-incubator/chectl -[15]: https://github.com/eclipse/che-operator -[16]: https://opensource.com/article/19/6/kubernetes-potential-run-anything -[17]: https://www.eclipse.org/che/docs/che-7/che-quick-starts.html#running-che-locally_che-quick-starts -[18]: https://www.eclipse.org/che/docs/che-6/resource-management.html -[19]: https://www.eclipse.org/che/docs/che-6/user-management.html -[20]: https://www.eclipse.org/che/docs/che-6/authentication.html -[21]: https://github.com/eclipse/che diff --git a/sources/tech/20191009 The Emacs Series ht.el- The Hash Table Library for Emacs.md b/sources/tech/20191009 The Emacs Series ht.el- The Hash Table Library for Emacs.md deleted file mode 100644 index 84e5a46acb..0000000000 --- a/sources/tech/20191009 The Emacs Series ht.el- The Hash Table Library for Emacs.md +++ /dev/null @@ -1,414 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The Emacs Series ht.el: The Hash Table Library for Emacs) -[#]: via: (https://opensourceforu.com/2019/10/the-emacs-series-ht-el-the-hash-table-library-for-emacs/) -[#]: author: (Shakthi Kannan https://opensourceforu.com/author/shakthi-kannan/) - -The Emacs Series ht.el: The Hash Table Library for Emacs -====== - -[![][1]][2] - -_In this article, we explore the various hash table functions and macros provided by the ht.el library._ - -The ht.el hash table library for Emacs has been written by Wilfred Hughes. The latest tagged release is version 2.2 and the software is released under the GNU General Public License v3. The source code is available at __. It provides a comprehensive list of hash table operations and a very consistent API. For example, any mutation function will always return nil. - -**Installation** -The Milkypostman’s Emacs Lisp Package Archive (MELPA) and Marmalade repositories have ht.el available for installation. You can add the following command to your Emacs init.el configuration file: - -``` -(require ‘package) -(add-to-list ‘package-archives ‘(“melpa” . “https://melpa.org/packages/”) t) -``` - -You can then run _M-x package <RET> ht <RET>_ to install the _ht.el_ library. If you are using Cask, then you simply add the following code to your Cask file: - -``` -(depends-on “ht”) -``` - -You will need the ht library in your Emacs environment before using the API functions. - -``` -(require ‘ht) -``` - -**Usage** -Let us now explore the various API functions provided by the _ht.el_ library. The _ht-create_ function will return a hash table that can be assigned to a hash table variable. You can also verify that the variable is a hash table using the type-of function as shown below: - -``` -(let ((greetings (ht-create))) -(type-of greetings)) - -hash-table -``` - -You can add an item to the hash table using the ht-set! function, which takes the hash table, key and value as arguments. The entries in the hash table can be listed using the _ht-items_ function as illustrated below: - -``` -(ht-set! hash-table key value) ;; Syntax -(ht-items hash-table) ;; Syntax - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-items greetings)) - -((“Adam” “Hello Adam!”)) -``` - -The keys present in a hash table can be retrieved using the _ht-keys_ function, while the values in a hash table can be obtained using the _ht-values_ function, as shown in the following examples: - -``` -(ht-keys hash-table) ;; Syntax -(ht-values hash-table) ;; Syntax - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-keys greetings)) - -(“Adam”) - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-values greetings)) - -(“Hello Adam!”) -``` - -The “ht-clear!” function can be used to clear all the items in a hash-table. For example: - -``` -(ht-clear! hash-table) ;; Syntax - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-clear! greetings) -(ht-items greetings)) - -nil -``` - -An entire hash table can be copied to another hash table using the _ht-copy_ API as shown below: - -``` -(ht-copy hash-table) ;; Syntax - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-items (ht-copy greetings))) - -((“Adam” “Hello Adam!”)) -``` - -The _ht-merge_ function can combine two different hash tables into one. In the following example, the items in the _english_ and _numbers_ hash tables are merged together. - -``` -(ht-merge hash-table1 hash-table2) ;; Syntax - -(let ((english (ht-create)) -(numbers (ht-create))) -(ht-set! english “a” “A”) -(ht-set! numbers “1” “One”) -(ht-items (ht-merge english numbers))) - -((“1” “One”) (“a” “A”)) -``` - -You can make modifications to an existing hash table. For example, you can remove an item in the hash table using the _ht-remove!_ function, which takes as input a hash table and a key as shown below: - -``` -(ht-remove hash-table key) ;; Syntax - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-set! greetings “Eve” “Hello Eve!”) -(ht-remove! greetings “Eve”) -(ht-items greetings)) - -((“Adam” “Hello Adam!”)) -``` - -You can do an in-place modification to an item in the hash table using the _ht-update!_ function. An example is given below: - -``` -(ht-update! hash-table key value) ;; Syntax - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-update! greetings (ht (“Adam” “Howdy Adam!”))) -(ht-items greetings)) - -((“Adam” “Howdy Adam!”)) -``` - -A number of predicate functions are available in _ht.el_ that can be used to check for conditions in a hash table. The _ht_? function checks to see if the input argument is a hash table. It returns t if the argument is a hash table and _nil_ otherwise. - -``` -(ht? hash-table) ;; Syntax - -(ht? nil) - -nil - -(let ((greetings (ht-create))) -(ht? greetings)) - -t -``` - -You can verify if a key is present in a hash table using the _ht-contains_? API, which takes a hash table and key as arguments. It returns t if the item exists in the hash table. Otherwise, it simply returns _nil_. - -``` -(ht-contains? hash-table key) ;; Syntax - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-contains? greetings “Adam”)) - -t - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-contains? greetings “Eve”)) - -nil -``` - -The _ht-empty?_ function can be used to check if the input hash-table is empty or not. A couple of examples are shown below: - -``` -(ht-empty? hash-table) ;; Syntax - -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-empty? greetings)) - -nil - -(let ((greetings (ht-create))) -(ht-empty? greetings)) - -t -``` - -The equality check can be used on a couple of hash tables to verify if they are the same, using the _ht-equal_? function as illustrated below: - -``` -(ht-equal? hash-table1 hash-table2) ;; Syntax - -(let ((english (ht-create)) -(numbers (ht-create))) -(ht-set! english “a” “A”) -(ht-set! numbers “1” “One”) -(ht-equal? english numbers)) - -nil -``` - -A few of the ht.el library functions accept a function as an argument and apply it to the items of the list. For example, the ht-map function takes a function with a key and value as arguments, and applies the function to each item in the hash table. For example: - -``` -(ht-map function hash-table) ;; Syntax - -(let ((numbers (ht-create))) -(ht-set! numbers 1 “One”) -(ht-map (lambda (x y) (* x 2)) numbers)) - -(2) -``` - -You can also use the _ht-each_ API to iterate through each item in the hash-table. In the following example, the sum of all the values is calculated and finally printed in the output. - -``` -(ht-each function hash-table) ;; Syntax - -(let ((numbers (ht-create)) -(sum 0)) -(ht-set! numbers “A” 1) -(ht-set! numbers “B” 2) -(ht-set! numbers “C” 3) -(ht-each (lambda (key value) (setq sum (+ sum value))) numbers) -(print sum)) - -6 -``` - -The _ht-select_ function can be used to match and pick a specific set of items in the list. For example: - -``` -(ht-select function hash-table) ;; Syntax - -(let ((numbers (ht-create))) -(ht-set! numbers 1 “One”) -(ht-set! numbers 2 “Two”) -(ht-items (ht-select (lambda (x y) (= x 2)) numbers))) - -((“2” “Two”)) -``` - -You can also reject a set of values by passing a filter function to the _ht-reject API_, and retrieve those items from the hash table that do not match the predicate function. In the following example, key 2 is rejected and the item with key 1 is returned. - -``` -(ht-reject function hash-table) ;; Syntax - -(let ((numbers (ht-create))) -(ht-set! numbers 1 “One”) -(ht-set! numbers 2 “Two”) -(ht-items (ht-reject (lambda (x y) (= x 2)) numbers))) - -((“1” “One”)) -``` - -If you want to mutate the existing hash table and remove the items that match a filter function, you can use the _ht-reject_! function as shown below: - -``` -(ht-reject! function hash-table) ;; Syntax - -(let ((numbers (ht-create))) -(ht-set! numbers 1 “One”) -(ht-set! numbers 2 “Two”) -(ht-reject! (lambda (x y) (= x 2)) numbers) -(ht-items numbers)) - -((“1” “One”)) -``` - -The _ht-find_ function accepts a function and a hash table, and returns the items that satisfy the input function. For example: - -``` -(ht-find function hash-table) ;; Syntax - -(let ((numbers (ht-create))) -(ht-set! numbers 1 “One”) -(ht-set! numbers 2 “Two”) -(ht-find (lambda (x y) (= x 2)) numbers)) - -(2 “Two”) -``` - -You can retrieve the items in the hash table using a specific set of keys with the _ht-select-keys_ API, as illustrated below: - -``` -(ht-select-keys hash-table keys) ;; Syntax - -(let ((numbers (ht-create))) -(ht-set! numbers 1 “One”) -(ht-set! numbers 2 “Two”) -(ht-items (ht-select-keys numbers ‘(1)))) - -((1 “One”)) -``` - -The following two examples are more comprehensive in using the hash table library functions. The _say-hello_ function returns a greeting based on the name as shown below: - -``` -(defun say-hello (name) -(let ((greetings (ht-create))) -(ht-set! greetings “Adam” “Hello Adam!”) -(ht-set! greetings “Eve” “Hello Eve!”) -(ht-get greetings name “Hello stranger!”))) - -(say-hello “Adam”) -“Hello Adam!” - -(say-hello “Eve”) -“Hello Eve!” - -(say-hello “Bob”) -“Hello stranger!” -``` - -The _ht_ macro returns a hash table and we create nested hash tables in the following example: - -``` -(let ((alphabets (ht (“Greek” (ht (1 (ht (‘letter “α”) -(‘name “alpha”))) -(2 (ht (‘letter “β”) -(‘name “beta”))))) -(“English” (ht (1 (ht (‘letter “a”) -(‘name “A”))) -(2 (ht (‘letter “b”) -(‘name “B”)))))))) -(ht-get* alphabets “Greek” 1 ‘letter)) - -“α” -``` - -**Testing** -The _ht.el_ library has built-in tests that you can execute to validate the API functions. You first need to clone the repository using the following commands: - -``` -$ git clone git@github.com:Wilfred/ht.el.git - -Cloning into ‘ht.el’... -remote: Enumerating objects: 1, done. -remote: Counting objects: 100% (1/1), done. -Receiving objects: 100% (471/471), 74.58 KiB | 658.00 KiB/s, done. -remote: Total 471 (delta 0), reused 1 (delta 0), pack-reused 470 -Resolving deltas: 100% (247/247), done. -``` - -If you do not have Cask, install the same using the instructions provided in the _README_ file at __. -You can then change the directory into the cloned ‘_ht.el_’ folder and run _cask install_. This will locally install the required dependencies for running the tests. - -``` -$ cd ht.el/ -$ cask install -Loading package information... Select coding system (default utf-8): -done -Package operations: 4 installs, 0 removals -- Installing [ 1/4] dash (2.12.0)... done -- Installing [ 2/4] ert-runner (latest)... done -- Installing [ 3/4] cl-lib (latest)... already present -- Installing [ 4/4] f (latest)... already present -``` - -A _Makefile_ exists in the top-level directory and you can simply run ‘make’ to run the tests, as shown below: - -``` -$ make -rm -f ht.elc -make unit -make[1]: Entering directory ‘/home/guest/ht.el’ -cask exec ert-runner -......................................... - -Ran 41 tests in 0.016 seconds -make[1]: Leaving directory ‘/home/guest/ht.el’ -make compile -make[1]: Entering directory ‘/home/guest/ht.el’ -cask exec emacs -Q -batch -f batch-byte-compile ht.el -make[1]: Leaving directory ‘/home/guest/ht.el’ -make unit -make[1]: Entering directory ‘/home/guest/ht.el’ -cask exec ert-runner -......................................... - -Ran 41 tests in 0.015 seconds -make[1]: Leaving directory ‘/home/guest/ht.el’ -make clean-elc -make[1]: Entering directory ‘/home/guest/ht.el’ -rm -f ht.elc -make[1]: Leaving directory ‘/home/guest/ht.el’ -``` - -You are encouraged to read the ht.el _README_ file from the GitHub repository at __ for more information. - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/10/the-emacs-series-ht-el-the-hash-table-library-for-emacs/ - -作者:[Shakthi Kannan][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/shakthi-kannan/ -[b]: https://github.com/lujun9972 -[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/10/GPL-3.jpg?resize=696%2C351&ssl=1 (GPL 3) -[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/10/GPL-3.jpg?fit=998%2C503&ssl=1 diff --git a/sources/tech/20191010 Achieve high-scale application monitoring with Prometheus.md b/sources/tech/20191010 Achieve high-scale application monitoring with Prometheus.md deleted file mode 100644 index dc5ecedfff..0000000000 --- a/sources/tech/20191010 Achieve high-scale application monitoring with Prometheus.md +++ /dev/null @@ -1,301 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Achieve high-scale application monitoring with Prometheus) -[#]: via: (https://opensource.com/article/19/10/application-monitoring-prometheus) -[#]: author: (Paul Brebner https://opensource.com/users/paul-brebner) - -Achieve high-scale application monitoring with Prometheus -====== -Prometheus' prowess as a monitoring system and its ability to achieve -high-scalability make it a strong choice for monitoring applications and -servers. -![Tall building with windows][1] - -[Prometheus][2] is an increasingly popular—for good reason—open source tool that provides monitoring and alerting for applications and servers. Prometheus' great strength is in monitoring server-side metrics, which it stores as [time-series data][3]. While Prometheus doesn't lend itself to application performance management, active control, or user experience monitoring (although a GitHub extension does make user browser metrics available to Prometheus), its prowess as a monitoring system and ability to achieve high-scalability through a [federation of servers][4] make Prometheus a strong choice for a wide variety of use cases. - -In this article, we'll take a closer look at Prometheus' architecture and functionality and then examine a detailed instance of the tool in action. - -### Prometheus architecture and components - -Prometheus consists of the Prometheus server (handling service discovery, metrics retrieval and storage, and time-series data analysis through the PromQL query language), a data model for metrics, a graphing GUI, and native support for [Grafana][5]. There is also an optional alert manager that allows users to define alerts via the query language and an optional push gateway for short-term application monitoring. These components are situated as shown in the following diagram. - -![Promethius architecture][6] - -Prometheus can automatically capture standard metrics by using agents to execute general-purpose code in the application environment. It can also capture custom metrics through instrumentation, placing custom code within the source code of the monitored application. Prometheus officially supports [client libraries][7] for Go, Python, Ruby, and Java/Scala and also enables users to write their own libraries. Additionally, many unofficial libraries for other languages are available. - -Developers can also utilize third-party [exporters][8] to automatically activate instrumentation for many popular software solutions they might be using. For example, users of JVM-based applications like open source [Apache Kafka][9] and [Apache Cassandra][10] can easily collect metrics by leveraging the existing [JMX exporter][11]. In other cases, an exporter won't be needed because the application will [expose metrics][12] that are already in the Prometheus format. Those on Cassandra might also find Instaclustr's freely available [Cassandra Exporter for Prometheus][13] to be helpful, as it integrates Cassandra metrics from a self-managed cluster into Prometheus application monitoring. - -Also important: Developers can leverage an available [node exporter][14] to monitor kernel metrics and host hardware. Prometheus offers a [Java client][15] as well, with a number of features that can be registered either piecemeal or at once through a single **DefaultExports.initialize();** command—including memory pools, garbage collection, JMX, classloading, and thread counts. - -### Prometheus data modeling and metrics - -Prometheus provides four metric types: - - * **Counter:** Counts incrementing values; a restart can return these values to zero - * **Gauge:** Tracks metrics that can go up and down - * **Histogram:** Observes data according to specified response sizes or durations and counts the sums of observed values along with counts in configurable buckets - * **Summary:** Counts observed data similar to a histogram and offers configurable quantiles that are calculated over a sliding time window - - - -Prometheus time-series data metrics each include a string name, which follows a naming convention to include the name of the monitored data subject, the logical type, and the units of measure used. Each metric includes streams of 64-bit float value that are timestamped down to the millisecond, and a set of key:value pairs labeling the dimensions it measures. Prometheus automatically adds **Job** and **Instance** labels to each metric to keep track of the configured job name of the data target and the **<host>:<port>** piece of the scraped target URL, respectively. - -### Prometheus example: the Anomalia Machina anomaly detection experiment - -Before moving into the example, download and begin using open source Prometheus by following this [getting started][16] guide. - -To demonstrate how to put Prometheus into action and perform application monitoring at a high scale, let's take a look at a recent [experimental Anomalia Machina project][17] we completed at Instaclustr. This project—just a test case, not a commercially available solution—leverages Kafka and Cassandra in an application deployed by Kubernetes, which performs anomaly detection on streaming data. (Such detection is critical to use cases including IoT applications and digital ad fraud, among other areas.) The experimental application relies heavily on Prometheus to collect application metrics across distributed instances and make them readily available to view. - -This diagram displays the experiment's architecture: - -![Anomalia Machina Architecture][18] - -Our goals in utilizing Prometheus included monitoring the application's more generic metrics, such as throughput, as well as the response times delivered by the Kafka load generator (the Kafka producer), the Kafka consumer, and the Cassandra client tasked with detecting any anomalies in the data. Prometheus monitors the system's hardware metrics as well, such as the CPU for each AWS EC2 instance running the application. The project also counts on Prometheus to monitor application-specific metrics such as the total number of rows each Cassandra read returns and, crucially, the number of anomalies it detects. All of this monitoring is centralized for simplicity. - -In practice, this means forming a test pipeline with producer, consumer, and detector methods, as well as the following three metrics: - - * A counter metric, called **prometheusTest_requests_total**, increments each time that each pipeline stage executes without incident, while a **stage** label allows for tracking the successful execution of each stage, and a **total** label tracks the total pipeline count. - * Another counter metric, called **prometheusTest_anomalies_total**, counts any detected anomalies. - * Finally, a gauge metric called **prometheusTest_duration_seconds** tracks the seconds of duration for each stage (again using a **stage** label and a **total** label). - - - -The code behind these measurements increments counter metrics using the **inc()** method and sets the time value of the gauge metric with the **setToTime()** method. This is demonstrated in the following annotated example code: - - -``` -import java.io.IOException; -import io.prometheus.client.Counter; -import io.prometheus.client.Gauge; -import io.prometheus.client.exporter.HTTPServer; -import io.prometheus.client.hotspot.DefaultExports; -  -// -// Demo of how we plan to use Prometheus Java client to instrument Anomalia Machina. -// Note that the Anomalia Machina application will have Kafka Producer and Kafka consumer and rest of pipeline running in multiple separate processes/instances. -// So metrics from each will have different host/port combinations. -public class PrometheusBlog {   -static String appName = "prometheusTest"; -// counters can only increase in value (until process restart) -// Execution count. Use a single Counter for all stages of the pipeline, stages are distinguished by labels -static final Counter pipelineCounter = Counter.build() -    .name(appName + "_requests_total").help("Count of executions of pipeline stages") -    .labelNames("stage") -    .register(); -// in theory could also use pipelineCounter to count anomalies found using another label -// but less potential for confusion having another counter. Doesn't need a label -static final Counter anomalyCounter = Counter.build() -    .name(appName + "_anomalies_total").help("Count of anomalies detected") -    .register(); -// A Gauge can go up and down, and is used to measure current value of some variable. -// pipelineGauge will measure duration in seconds of each stage using labels. -static final Gauge pipelineGauge = Gauge.build() -    .name(appName + "_duration_seconds").help("Gauge of stage durations in seconds") -    .labelNames("stage") -    .register(); -  -public static void main(String[] args) { -// Allow default JVM metrics to be exported -   DefaultExports.initialize(); -  -   // Metrics are pulled by Prometheus, create an HTTP server as the endpoint -   // Note if there are multiple processes running on the same server need to change port number. -   // And add all IPs and port numbers to the Prometheus configuration file. -HTTPServer server = null; -try { -server = new HTTPServer(1234); -} catch (IOException e) { -e.printStackTrace(); -} -// now run 1000 executions of the complete pipeline with random time delays and increasing rate -int max = 1000; -for (int i=0; i < max; i++) -{ -// total time for complete pipeline, and increment anomalyCounter -pipelineGauge.labels("total").setToTime(() -> { -producer(); -consumer(); -if (detector()) -anomalyCounter.inc(); -}); -// total pipeline count -pipelineCounter.labels("total").inc(); -System.out.println("i=" + i); -  -// increase the rate of execution -try { -Thread.sleep(max-i); -} catch (InterruptedException e) { -e.printStackTrace(); -} -} -server.stop(); -} -// the 3 stages of the pipeline, for each we increase the stage counter and set the Gauge duration time -public  static void producer() { -class Local {}; -String name = Local.class.getEnclosingMethod().getName(); -pipelineGauge.labels(name).setToTime(() -> { -try { -Thread.sleep(1 + (long)(Math.random()*20)); -} catch (InterruptedException e) { -e.printStackTrace(); -} -}); -pipelineCounter.labels(name).inc(); -   } -public  static void consumer() { -class Local {}; -String name = Local.class.getEnclosingMethod().getName(); -pipelineGauge.labels(name).setToTime(() -> { -try { -Thread.sleep(1 + (long)(Math.random()*10)); -} catch (InterruptedException e) { -e.printStackTrace(); -} -}); -pipelineCounter.labels(name).inc(); -   } -// detector returns true if anomaly detected else false -public  static boolean detector() { -class Local {}; -String name = Local.class.getEnclosingMethod().getName(); -pipelineGauge.labels(name).setToTime(() -> { -try { -Thread.sleep(1 + (long)(Math.random()*200)); -} catch (InterruptedException e) { -e.printStackTrace(); -} -}); -pipelineCounter.labels(name).inc(); -return (Math.random() > 0.95); -   } -} -``` - -Prometheus collects metrics by polling ("scraping") instrumented code (unlike some other monitoring solutions that receive metrics via push methods). The code example above creates a required HTTP server on port 1234 so that Prometheus can scrape metrics as needed. - -The following sample code addresses Maven dependencies: - - -``` -<!-- The client --> -<dependency> -<groupId>io.prometheus</groupId> -<artifactId>simpleclient</artifactId> -<version>LATEST</version> -</dependency> -<!-- Hotspot JVM metrics--> -<dependency> -<groupId>io.prometheus</groupId> -<artifactId>simpleclient_hotspot</artifactId> -<version>LATEST</version> -</dependency> -<!-- Exposition HTTPServer--> -<dependency> -<groupId>io.prometheus</groupId> -<artifactId>simpleclient_httpserver</artifactId> -<version>LATEST</version> -</dependency> -<!-- Pushgateway exposition--> -<dependency> -<groupId>io.prometheus</groupId> -<artifactId>simpleclient_pushgateway</artifactId> -<version>LATEST</version> -</dependency> -``` - -The code example below tells Prometheus where it should look to scrape metrics. This code can simply be added to the configuration file (default: Prometheus.yml) for basic deployments and tests. - - -``` -global: - scrape_interval:    15s # By default, scrape targets every 15 seconds. -  -# scrape_configs has jobs and targets to scrape for each. -scrape_configs: -# job 1 is for testing prometheus instrumentation from multiple application processes. - # The job name is added as a label job=<job_name> to any timeseries scraped from this config. - - job_name: 'testprometheus' -  -   # Override the global default and scrape targets from this job every 5 seconds. -   scrape_interval: 5s -    -   # this is where to put multiple targets, e.g. for Kafka load generators and detectors -   static_configs: -     - targets: ['localhost:1234', 'localhost:1235'] -      - # job 2 provides operating system metrics (e.g. CPU, memory etc). - - job_name: 'node' -  -  # Override the global default and scrape targets from this job every 5 seconds. -   scrape_interval: 5s -    -   static_configs: -     - targets: ['localhost:9100'] -``` - -Note the job named "node" that uses port 9100 in this configuration file; this job offers node metrics and requires running the [Prometheus node exporter][14] on the same server where the application is running. Polling for metrics should be done with care: doing it too often can overload applications, too infrequently can result in lag. Where application metrics can't be polled, Prometheus also offers a [push gateway][19]. - -### Viewing Prometheus metrics and results - -Our experiment initially used [expressions][20], and later [Grafana][5], to visualize data and overcome Prometheus' lack of default dashboards. Using the Prometheus interface (or [http://localhost:][21]9[090/metrics][21]), select metrics by name and then enter them in the expression box for execution. (Note that it's common to experience error messages at this stage, so don't be discouraged if you encounter a few issues.) With correctly functioning expressions, results will be available for display in tables or graphs as appropriate. - -Using the **[irate][22]** or **[rate][23]** function on a counter metric will produce a useful rate graph: - -![Rate graph][24] - -Here is a similar graph of a gauge metric: - -![Gauge graph][25] - -Grafana provides much more robust graphing capabilities and built-in Prometheus support with graphs able to display multiple metrics: - -![Grafana graph][26] - -To enable Grafana, install it, navigate to , create a Prometheus data source, and add a Prometheus graph using an expression. A note here: An empty graph often points to a time range issue, which can usually be solved by using the "Last 5 minutes" setting. - -Creating this experimental application offered an excellent opportunity to build our knowledge of what Prometheus is capable of and resulted in a high-scale experimental production application that can monitor 19 billion real-time data events for anomalies each day. By following this guide and our example, hopefully, more developers can successfully put Prometheus into practice. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/application-monitoring-prometheus - -作者:[Paul Brebner][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/paul-brebner -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/windows_building_sky_scale.jpg?itok=mH6CAX29 (Tall building with windows) -[2]: https://prometheus.io/ -[3]: https://prometheus.io/docs/concepts/data_model -[4]: https://prometheus.io/docs/prometheus/latest/federation -[5]: https://grafana.com/ -[6]: https://opensource.com/sites/default/files/uploads/prometheus_architecture.png (Promethius architecture) -[7]: https://prometheus.io/docs/instrumenting/clientlibs/ -[8]: https://prometheus.io/docs/instrumenting/exporters/ -[9]: https://kafka.apache.org/ -[10]: http://cassandra.apache.org/ -[11]: https://github.com/prometheus/jmx_exporter -[12]: https://prometheus.io/docs/instrumenting/exporters/#software-exposing-prometheus-metrics -[13]: https://github.com/instaclustr/cassandra-exporter -[14]: https://prometheus.io/docs/guides/node-exporter/ -[15]: https://github.com/prometheus/client_java -[16]: https://prometheus.io/docs/prometheus/latest/getting_started/ -[17]: https://github.com/instaclustr/AnomaliaMachina -[18]: https://opensource.com/sites/default/files/uploads/anomalia_machina_architecture.png (Anomalia Machina Architecture) -[19]: https://prometheus.io/docs/instrumenting/pushing/ -[20]: https://prometheus.io/docs/prometheus/latest/querying/basics/ -[21]: http://localhost:9090/metrics -[22]: https://prometheus.io/docs/prometheus/latest/querying/functions/#irate -[23]: https://prometheus.io/docs/prometheus/latest/querying/functions/#rate -[24]: https://opensource.com/sites/default/files/uploads/rate_graph.png (Rate graph) -[25]: https://opensource.com/sites/default/files/uploads/gauge_graph.png (Gauge graph) -[26]: https://opensource.com/sites/default/files/uploads/grafana_graph.png (Grafana graph) diff --git a/sources/tech/20191013 Sugarizer- The Taste of Sugar on Any Device.md b/sources/tech/20191013 Sugarizer- The Taste of Sugar on Any Device.md deleted file mode 100644 index 749ff78037..0000000000 --- a/sources/tech/20191013 Sugarizer- The Taste of Sugar on Any Device.md +++ /dev/null @@ -1,59 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Sugarizer: The Taste of Sugar on Any Device) -[#]: via: (https://opensourceforu.com/2019/10/sugarizer-the-taste-of-sugar-on-any-device/) -[#]: author: (Dr Anil Seth https://opensourceforu.com/author/anil-seth/) - -Sugarizer: The Taste of Sugar on Any Device -====== - -[![][1]][2] - -_Sugar is a learning platform that was initially developed for the OLPC project. The Sugar Learning Environment can be downloaded and installed on any Linux-compatible hardware. Sugarizer mimics the UI of Sugar using HTML5 and CSS3._ - -The One Laptop Per Child (OLPC) project was launched less than 12 years ago. The goal of bringing down the cost of a laptop to US$ 100 was never really achieved. The project also did not turn out to be as much of a success as anticipated. However, the goal was not really about the laptop, but to educate as many children as possible. -The interactive learning environment of the OLPC project was equally critical. This became a separate project under Sugar Labs, [_https://wiki.sugarlabs.org/_][3], and continues to be active. The Sugar Learning Environment is available as a Fedora spin, and can be downloaded and installed on any Linux-compatible hardware. It would be a good option to install it on an old system, which could then be donated. The US$ 90 Pinebook, [_https://www.pine64.org/,_][4] with Sugar installed on it would also make a memorable and useful gift. -The Sugar Environment can happily coexist with other desktop environments on Linux. So, the computer does not have to be dedicated to Sugar. On Fedora, you may add it to your existing desktop as follows: - -``` -$ sudo dnf group install ‘Sugar Desktop Environment’ -``` - -I have not tried it on Ubuntu. However, the following command should work: - -``` -$ sudo apt install sucrose -``` - -However, Sugar remains, by and large, an unknown entity. This is especially disappointing considering that the need to _learn to learn_ has never been greater. -Hence, the release of Sugarizer is a pleasant surprise. It allows you to use the Sugar environment on any device, with the help of Web technologies. Sugarizer mimics the UI of Sugar using HTML5 and CSS3. It runs activities that have been written in HTML5/JavaScript. The current release includes a number of Sugar activities written initially in Python, which have been ported to HTML5/JavaScript. -You may try the new release at _sugarizer.org_. Better still, install it from Google Play on your Android tablet or from App Store on an Apple device. It works well even on a two-year-old, low-end tablet. Hence, you may easily put your old tablet to good use by gifting it to a child after installing Sugarizer on it. In this way, you could even rationalise your desire to buy the replacement tablet you have been eyeing. - -**Does it work?** -My children are too old and grandchildren too young. Reason tells me that it should work. Experience also tells me that it will most likely NOT improve school grades. I did not like school. I was bored most of the time. If I was studying in today’s schools, I would have had ulcers or a nervous breakdown! -When I think of schools, I recall the frustration of a child long ago (just 20 years) who got an answer wrong. The book and the teacher said that a mouse has two buttons. The mouse he used at home had three! -So, can you risk leaving the education of children you care about to the schools? Think about the skills you may be using today. Could these have been taught at schools a mere five years ago? -I never took JavaScript seriously and never made an effort to learn it. Today, I see Sugarizer and Snap! (a clone of Scratch in JavaScript) and am acutely aware of my foolishness. However, having learnt programming outside the classroom, I am confident that I can learn to program in JavaScript, should the need arise. -The intention at the start was to write about the activities in Sugarizer and, maybe, explore the source code. My favourite activities include TamTam, Turtle Blocks, Maze, etc. From the food chain activity, I discovered that some animals that I had believed to be carnivores, were not. I have also seen children get excited by the Speak activity. -However, once I started writing after the heading ‘Does it work?’, my mind took a radical turn. Now, I am convinced that Sugarizer will work only if you try it out. - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/10/sugarizer-the-taste-of-sugar-on-any-device/ - -作者:[Dr Anil Seth][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/anil-seth/ -[b]: https://github.com/lujun9972 -[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Technology-Development-in-Computers-Innovation-eLearning-1.jpg?resize=696%2C696&ssl=1 (Technology Development in Computers (Innovation), eLearning) -[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Technology-Development-in-Computers-Innovation-eLearning-1.jpg?fit=900%2C900&ssl=1 -[3]: https://wiki.sugarlabs.org/ -[4]: https://www.pine64.org/, diff --git a/sources/tech/20191014 My Linux story- I grew up on PC Magazine not candy.md b/sources/tech/20191014 My Linux story- I grew up on PC Magazine not candy.md deleted file mode 100644 index d3f967357f..0000000000 --- a/sources/tech/20191014 My Linux story- I grew up on PC Magazine not candy.md +++ /dev/null @@ -1,48 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (My Linux story: I grew up on PC Magazine not candy) -[#]: via: (https://opensource.com/article/19/10/linux-journey-newb-ninja) -[#]: author: (Michael Zamot https://opensource.com/users/mzamot) - -My Linux story: I grew up on PC Magazine not candy -====== -This Linux story begins with a kid reading about Linux in issues of PC -Magazine from his childhood home in Costa Rica. Today, he's a passionate -member of the global Linux community. -![The back of a kid head][1] - -In 1998, the movie _Titanic_ was released, mobile phones were just a luxury, and pagers were still in use. This was also the year I got my first computer. I can remember the details as if it were yesterday: Pentium 133MHz and just 16MB of memory. Back in that time (while running nothing less than Windows 95), this was a good machine. I can still hear in my mind the old spinning hard drive noise when I powered that computer on, and see the Windows 95 flag. It never crossed my mind, though (especially as an 8-year-old kid), that I would dedicate every minute of my life to Linux and open source. - -Being just a kid, I always asked my mom to buy me every issue of PC Magazine instead of candies. I never skipped a single issue, and all of those dusty old magazines are still there in Costa Rica. It was in these magazines that I discovered the essential technology that changed my life. An issue in the year 2000 talked extensively about Linux and the advantages of free and open-source software. That issue also included a review of one of the most popular Linux distributions back then: Corel Linux. Unfortunately, the disc was not included. Without internet at home, I was out of luck, but that issue still lit a spark within me. - -In 2003, I asked my mom to take me to a Richard Stallman talk. I couldn’t believe he was in the country. I was the only kid in that room, and I was laser-focused on everything he was saying, though I didn’t understand anything about patents, licenses, or the jokes about him with an old hard drive over his head. - -Despite my attempts, I couldn’t make Linux work on my computer. One rainy afternoon in the year 2003, with the heavy smell of recently brewed coffee, my best friend and I were able to get a local magazine with a two-disk bundle: Mandrake Linux 7.1 (if my memory doesn’t fail) on one and StarOffice on the other. My friend poured more coffee into our mugs while I inserted the Mandrake disk into the computer with my shaking, excited hands. Linux was finally running—the same Linux I had been obsessed with since I read about it 3 years earlier. - -We were lucky enough to get broadband internet in 2006 (at the lightning speed of 128/64Kbps), so I was able to use an old Pentium II computer under my bed and run it 24x7 with Debian, Apache, and my own mail server (my personal server, I told myself). This old machine was my playground to experiment on and put into practice all of the knowledge and reading I had been doing (and also to make the electricity bill more expensive). - -As soon as I discovered there were open source communities in the country, I started attending their meetings. Eventually, I was helping in their events, and not long after I was organizing and giving talks. We used to host two annual events for many years: Festival Latinoamericano de Software Libre (Latin American Free Software Installation Fest) and Software Freedom Day. - -Thanks to what I learned from my reading, but more importantly from the people in these local communities that guided and mentored me, I was able to land my first Linux job in 2011, even without college. I kept growing from there, working for many companies and learning more about open source and Linux at each one. Eventually, I felt that I had an obligation (or a social debt) to give back to the community so that other people like the younger me could also learn. Not long after, I started teaching classes and meeting wonderful and passionate people, many of whom are now as devoted to Linux and open source as I am. I can definitely say: Mission accomplished! - -Eventually, what I learned about open source, Linux, OpenStack, Docker, and every other technology I played with sent me overseas, allowing me to work (doesn’t feel like it) for the most amazing company I’ve ever worked for, doing what I love. Because of open source and Linux, I became a part of something bigger than me. I was a member of a community, and I experienced what I consider the most significant impact on my life: Meeting and learning from so many masterminds and amazing people that today I can call friends. Without them and these communities, I wouldn’t be the person I am today. - -How could I know when I was 10 years old and reading a magazine that Linux and open source would connect me to the greatest people, and change my life forever? - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/linux-journey-newb-ninja - -作者:[Michael Zamot][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mzamot -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/idea_innovation_kid_education.png?itok=3lRp6gFa (The back of a kid head) diff --git a/sources/tech/20191015 Formatting NFL data for doing data science with Python.md b/sources/tech/20191015 Formatting NFL data for doing data science with Python.md deleted file mode 100644 index 67f15777ad..0000000000 --- a/sources/tech/20191015 Formatting NFL data for doing data science with Python.md +++ /dev/null @@ -1,235 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Formatting NFL data for doing data science with Python) -[#]: via: (https://opensource.com/article/19/10/formatting-nfl-data-python) -[#]: author: (Christa Hayes https://opensource.com/users/cdhayes2) - -Formatting NFL data for doing data science with Python -====== -In part 1 of this series on machine learning with Python, learn how to -prepare a National Football League dataset for training. -![A football field.][1] - -No matter what medium of content you consume these days (podcasts, articles, tweets, etc.), you'll probably come across some reference to data. Whether it's to back up a talking point or put a meta-view on how data is everywhere, data and its analysis are in high demand. - -As a programmer, I've found data science to be more comparable to wizardry than an exact science. I've coveted the ability to get ahold of raw data and glean something useful and concrete from it. What a useful talent! - -This got me thinking about the difference between data scientists and programmers. Aren't data scientists just statisticians who can code? Look around and you'll see any number of tools aimed at helping developers become data scientists. AWS has a full-on [machine learning course][2] geared specifically towards turning developers into experts. [Visual Studio][3] has built-in Python projects that—with the click of a button—will create an entire template for classification problems. And scores of programmers are writing tools designed to make data science easier for anyone to pick up. - -I thought I'd lean into the clear message of recruiting programmers to the data (or dark) side and give it a shot with a fun project: training a machine learning model to predict plays using a National Football League (NFL) dataset. - -### Set up the environment - -Before I can dig into the data, I need to set up my [virtual environment][4]. This is important because, without an environment, I'll have nowhere to work. Fortunately, Opensource.com has [some great resources][5] for installing and configuring the setup. - -Any of the code you see here, I was able to look up through existing documentation. If there is one thing programmers are familiar with, it's navigating foreign (and sometimes very sparse) documentation. - -### Get the data - -As with any modern problem, the first step is to make sure you have quality data. Luckily, I came across a set of [NFL tracking data][6] from 2017 that was used for the NFL Big Data Bowl. Even the NFL is trying its best to attract the brightest stars in the data realm. - -Everything I need to know about the schema is in the README. This exercise will train a machine learning model to predict run (in which the ball carrier keeps the football and runs downfield) and pass (in which the ball is passed to a receiving player) plays using the plays.csv [data file][7]. I won't use player tracking data in this exercise, but it could be fun to explore later. - -First things first, I need to get access to my data by importing it into a dataframe. The [Pandas][8] library is an open source Python library that provides algorithms for easy analysis of data structures. The structure in the sample NFL data happens to be a two-dimensional array (or in simpler terms, a table), which data scientists often refer to as a dataframe. The Pandas function dealing with dataframes is [pandas.DataFrame][9]. I'll also import several other libraries that I will use later. - - -``` -import pandas as pd -import numpy as np -import seaborn as sns -import matplotlib.pyplot as plt -import xgboost as xgb - -from sklearn import metrics - -df = pd.read_csv('data/plays.csv') - -print(len(df)) -print(df.head()) -``` - -### Format the data - -The NFL data dump does not explicitly indicate which plays are runs (also called rushes) and which are passes. Therefore, I have to classify the offensive play types through some football savvy and reasoning. - -Right away, I can get rid of special teams plays in the **isSTPLAY** column. Special teams are neither offense nor defense, so they are irrelevant to my objective. - - -``` -#drop st plays -df = df[~df['isSTPlay']] -print(len(df)) -``` - -Skimming the **playDescription** column, I see some plays where the quarterback kneels, which effectively ends a play. This is usually called a "victory formation" because the intent is to run out the clock. These are significantly different than normal running plays, so I can drop them as well. - - -``` -#drop kneels -df = df[~df['playDescription'].str.contains("kneels")] -print (len(df)) -``` - -The data reports time in terms of the quarters in which a game is normally played (as well as the time on the game clock in each quarter). Is this the most intuitive in terms of trying to predict a sequence? One way to answer this is to consider how gameplay differs between time splits. - -When a team has the ball with a minute left in the first quarter, will it act the same as if it has the ball with a minute left in the second quarter? Probably not. Will it act the same with a minute to go at the end of both halves? All else remaining equal, the answer is likely yes in most scenarios. - -I'll convert the **quarter** and **GameClock** columns from quarters to halves, denoted in seconds rather than minutes. I'll also create a **half** column from the **quarter** values. There are some fifth quarter values, which I take to be overtime. Since overtime rules are different than normal gameplay, I can drop them. - - -``` -#drop overtime -df = df[~(df['quarter'] == 5)] -print(len(df)) - -#convert time/quarters -def translate_game_clock(row): -    raw_game_clock = row['GameClock'] -    quarter = row['quarter'] -    minutes, seconds_raw = raw_game_clock.partition(':')[::2] - -    seconds = seconds_raw.partition(':')[0] - -    total_seconds_left_in_quarter = int(seconds) + (int(minutes) * 60) - -    if quarter == 3 or quarter == 1: -        return total_seconds_left_in_quarter + 900 -    elif quarter == 4 or quarter == 2: -        return total_seconds_left_in_quarter - -if 'GameClock' in list (df.columns): -    df['secondsLeftInHalf'] = df.apply(translate_game_clock, axis=1) - -if 'quarter' in list(df.columns): -    df['half'] = df['quarter'].map(lambda q: 2 if q > 2 else 1) -``` - -The **yardlineNumber** column also needs to be transformed. The data currently lists the yard line as a value from one to 50. Again, this is unhelpful because a team would not act the same on its own 20-yard line vs. its opponent's 20-yard line. I will convert it to represent a value from one to 99, where the one-yard line is nearest the possession team's endzone, and the 99-yard line is nearest the opponent's end zone. - - -``` -def yards_to_endzone(row): -    if row['possessionTeam'] == row['yardlineSide']: -        return 100 - row['yardlineNumber'] -    else : -        return row['yardlineNumber'] - -df['yardsToEndzone'] = df.apply(yards_to_endzone, axis = 1) -``` - -The personnel data would be extremely useful if I could get it into a format for the machine learning algorithm to take in. Personnel identifies the different types of skill positions on the field at a given time. The string value currently shown in **personnel.offense** is not conducive to input, so I'll convert each personnel position to its own column to indicate the number present on the field during the play. Defense personnel might be interesting to include later to see if it has any outcome on prediction. For now, I'll just stick with offense. - - -``` -def transform_off_personnel(row): - -   rb_count = 0 -   te_count = 0 -   wr_count = 0 -   ol_count = 0 -   dl_count = 0 -   db_count = 0 - -   if not pd.isna(row['personnel.offense']): -       personnel = row['personnel.offense'].split(', ') -       for p in personnel: -           if p[2:4] == 'RB': -               rb_count = int(p[0]) -           elif p[2:4] == 'TE': -                te_count = int(p[0]) -           elif p[2:4] == 'WR': -                wr_count = int(p[0]) -           elif p[2:4] == 'OL': -                ol_count = int(p[0]) -           elif p[2:4] == 'DL': -                dl_count = int(p[0]) -           elif p[2:4] == 'DB': -               db_count = int(p[0]) - -   return pd.Series([rb_count,te_count,wr_count,ol_count,dl_count, db_count]) - -df[['rb_count','te_count','wr_count','ol_count','dl_count', 'db_count']] = df.apply(transform_off_personnel, axis=1) -``` - -Now the offense personnel values are represented by individual columns. - -![Result of reformatting offense personnel][10] - -Formations describe how players are positioned on the field, and this is also something that would seemingly have value in predicting play outcomes. Once again, I'll convert the string values into integers. - - -``` -df['offenseFormation'] = df['offenseFormation'].map(lambda f : 'EMPTY' if pd.isna(f) else f) - -def formation(row): -    form = row['offenseFormation'].strip() -    if form == 'SHOTGUN': -        return 0 -    elif form == 'SINGLEBACK': -        return 1 -    elif form == 'EMPTY': -        return 2 -    elif form == 'I_FORM': -        return 3 -    elif form == 'PISTOL': -        return 4 -    elif form == 'JUMBO': -        return 5 -    elif form == 'WILDCAT': -        return 6 -    elif form=='ACE': -        return 7 -    else: -        return -1 - -df['numericFormation'] = df.apply(formation, axis=1) - -print(df.yardlineNumber.unique()) -``` - -Finally, it's time to classify the play types. The **PassResult** column has four distinct values: I, C, S, and null, which represent Incomplete passing plays, Complete passing plays, Sacks (classified as passing plays), and a null value. Since I've already eliminated all special teams plays, I can assume the null values are running plays. So I'll convert the play outcome into a single column called **play_type** represented by either a 0 for running or a 1 for passing. This will be the column (or _label_, as the data scientists say) I want my algorithm to predict. - - -``` -def play_type(row): -    if row['PassResult'] == 'I' or row['PassResult'] == 'C' or row['PassResult'] == 'S': -        return 'Passing' -    else: -        return 'Rushing' - -df['play_type'] = df.apply(play_type, axis = 1) -df['numericPlayType'] = df['play_type'].map(lambda p: 1 if p == 'Passing' else 0) -``` - -### Take a break - -Is it time to start predicting things yet? Most of my work so far has been trying to understand the data and what format it needs to be in—before I even get started on predicting anything. Anyone else need a minute? - -In part two, I'll do some analysis and visualization of the data before feeding it into a machine learning algorithm, and then I'll score the model's results to see how accurate they are. Stay tuned! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/formatting-nfl-data-python - -作者:[Christa Hayes][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/cdhayes2 -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_LIFE_football__520x292.png?itok=5hPbxQF8 (A football field.) -[2]: https://aws.amazon.com/training/learning-paths/machine-learning/developer/ -[3]: https://docs.microsoft.com/en-us/visualstudio/python/overview-of-python-tools-for-visual-studio?view=vs-2019 -[4]: https://opensource.com/article/19/9/get-started-data-science-python -[5]: https://opensource.com/article/17/10/python-101 -[6]: https://github.com/nfl-football-ops/Big-Data-Bowl -[7]: https://github.com/nfl-football-ops/Big-Data-Bowl/tree/master/Data -[8]: https://pandas.pydata.org/ -[9]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html -[10]: https://opensource.com/sites/default/files/uploads/nfl-python-7_personneloffense.png (Result of reformatting offense personnel) diff --git a/sources/tech/20191018 Perceiving Python programming paradigms.md b/sources/tech/20191018 Perceiving Python programming paradigms.md deleted file mode 100644 index 9a0027d61d..0000000000 --- a/sources/tech/20191018 Perceiving Python programming paradigms.md +++ /dev/null @@ -1,122 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Perceiving Python programming paradigms) -[#]: via: (https://opensource.com/article/19/10/python-programming-paradigms) -[#]: author: (Jigyasa Grover https://opensource.com/users/jigyasa-grover) - -Perceiving Python programming paradigms -====== -Python supports imperative, functional, procedural, and object-oriented -programming; here are tips on choosing the right one for a specific use -case. -![A python with a package.][1] - -Early each year, TIOBE announces its Programming Language of The Year. When its latest annual [TIOBE index][2] report came out, I was not at all surprised to see [Python again winning the title][3], which was based on capturing the most search engine ranking points (especially on Google, Bing, Yahoo, Wikipedia, Amazon, YouTube, and Baidu) in 2018. - -![Python data from TIOBE Index][4] - -Adding weight to TIOBE's findings, earlier this year, nearly 90,000 developers took Stack Overflow's annual [Developer Survey][5], which is the largest and most comprehensive survey of people who code around the world. The main takeaway from this year's results was: - -> "Python, the fastest-growing major programming language, has risen in the ranks of programming languages in our survey yet again, edging out Java this year and standing as the second most loved language (behind Rust)." - -Ever since I started programming and exploring different languages, I have seen admiration for Python soaring high. Since 2003, it has consistently been among the top 10 most popular programming languages. As TIOBE's report stated: - -> "It is the most frequently taught first language at universities nowadays, it is number one in the statistical domain, number one in AI programming, number one in scripting and number one in writing system tests. Besides this, Python is also leading in web programming and scientific computing (just to name some other domains). In summary, Python is everywhere." - -There are several reasons for Python's rapid rise, bloom, and dominance in multiple domains, including web development, scientific computing, testing, data science, machine learning, and more. The reasons include its readable and maintainable code; extensive support for third-party integrations and libraries; modular, dynamic, and portable structure; flexible programming; learning ease and support; user-friendly data structures; productivity and speed; and, most important, community support. The diverse application of Python is a result of its combined features, which give it an edge over other languages. - -But in my opinion, the comparative simplicity of its syntax and the staggering flexibility it provides developers coming from many other languages win the cake. Very few languages can match Python's ability to conform to a developer's coding style rather than forcing him or her to code in a particular way. Python lets more advanced developers use the style they feel is best suited to solve a particular problem. - -While working with Python, you are like a snake charmer. This allows you to take advantage of Python's promise to offer a non-conforming environment for developers to code in the style best suited for a particular situation and to make the code more readable, testable, and coherent. - -## Python programming paradigms - -Python supports four main [programming paradigms][6]: imperative, functional, procedural, and object-oriented. Whether you agree that they are valid or even useful, Python strives to make all four available and working. Before we dive in to see which programming paradigm is most suitable for specific use cases, it is a good time to do a quick review of them. - -### Imperative programming paradigm - -The [imperative programming paradigm][7] uses the imperative mood of natural language to express directions. It executes commands in a step-by-step manner, just like a series of verbal commands. Following the "how-to-solve" approach, it makes direct changes to the state of the program; hence it is also called the stateful programming model. Using the imperative programming paradigm, you can quickly write very simple yet elegant code, and it is super-handy for tasks that involve data manipulation. Owing to its comparatively slower and sequential execution strategy, it cannot be used for complex or parallel computations. - -[![Linus Torvalds quote][8]][9] - -Consider this example task, where the goal is to take a list of characters and concatenate it to form a string. A way to do it in an imperative programming style would be something like: - - -``` ->>> sample_characters = ['p','y','t','h','o','n'] ->>> sample_string = '' ->>> sample_string -'' ->>> sample_string = sample_string + sample_characters[0] ->>> sample_string -'p' ->>> sample_string = sample_string + sample_characters[1] ->>> sample_string -'py' ->>> sample_string = sample_string + sample_characters[2] ->>> sample_string -'pyt' ->>> sample_string = sample_string + sample_characters[3] ->>> sample_string -'pyth' ->>> sample_string = sample_string + sample_characters[4] ->>> sample_string -'pytho' ->>> sample_string = sample_string + sample_characters[5] ->>> sample_string -'python' ->>> -``` - -Here, the variable **sample_string** is also like a state of the program that is getting changed after executing the series of commands, and it can be easily extracted to track the progress of the program. The same can be done using a **for** loop (also considered imperative programming) in a shorter version of the above code: - - -``` ->>> sample_characters = ['p','y','t','h','o','n'] ->>> sample_string = '' ->>> sample_string ->>> for c in sample_characters: -...    sample_string = sample_string + c -...    print(sample_string) -... -p -py -pyt -pyth -pytho -python ->>> -``` - -### Functional programming paradigm - -The [functional programming paradigm][10] treats program computation as the evaluation of mathematical functions based on [lambda calculus][11]. Lambda calculus is a formal system in mathematical logic for expressing computation based on function abstraction and application using variable binding and substitution. It follows the "what-to-solve" approach—that is, it expresses logic without describing its control flow—hence it is also classified as the declarative programming model. - -The functional programming paradigm promotes stateless functions, but it's important to note that Python's implementation of functional programming deviates from standard implementation. Python is said to be an _impure_ functional language because it is possible to maintain state and create side effects if you are not careful. That said, functional programming is handy for parallel processing and is super-efficient for tasks requiring recursion and concurrent execution. - - -``` ->>> sample_characters = ['p','y','t','h','o','n'] ->>> import functools ->>> sample_string = functools.reduce(lambda s,c: s + c, sample_characters) ->>> sample_string -'python' ->>> -``` - -Using the same example, the functional way of concatenating a list of characters to form a string would be the same as above. Since the computation happens in a single line, there is no explicit way to obtain the state of the program with **sample_string** and track the progress. The functional programming implementation of this example is fascinating, as it reduces the lines of code and simply does its job in a single line, with the exception of using the **functools** module and the **reduce** method. The three keywords—**functools**, **reduce**, and **lambda**—are defined as follows: - - * **functools** is a module for higher-order functions and provides for functions that act on or return other functions. It encourages writing reusable code, as it is easier to replicate existing functions with some arguments already passed and create a new version of a function in a well-documented manner. - * **reduce** is a method that applies a function of two arguments cumulatively to the items in sequence, from left to right, to reduce the sequence to a single value. For example: [code] >>> sample_list = [1,2,3,4,5] ->>> import functools ->>> sum = functools.reduce(lambda x,y: x + y, sample_list) ->>> sum -15 ->>> ((((1+2)+3)+4)+5) -15 ->>> -``` - * **lambda functions** are small, anonymized (i.e., nameless) functions that can take any number of arguments but spit out only one value. They are useful when they are used as an argu \ No newline at end of file diff --git a/sources/tech/20191022 Beginner-s Guide to Handle Various Update Related Errors in Ubuntu.md b/sources/tech/20191022 Beginner-s Guide to Handle Various Update Related Errors in Ubuntu.md deleted file mode 100644 index 381ee4c9dd..0000000000 --- a/sources/tech/20191022 Beginner-s Guide to Handle Various Update Related Errors in Ubuntu.md +++ /dev/null @@ -1,261 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Beginner’s Guide to Handle Various Update Related Errors in Ubuntu) -[#]: via: (https://itsfoss.com/ubuntu-update-error/) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -Beginner’s Guide to Handle Various Update Related Errors in Ubuntu -====== - -_**Who hasn’t come across an error while doing an update in Ubuntu? Update errors are common and plenty in Ubuntu and other Linux distributions based on Ubuntu. Here are some common Ubuntu update errors and their fixes.**_ - -This article is part of Ubuntu beginner series that explains the know-how of Ubuntu so that a new user could understand the things better. - -In an earlier article, I discussed [how to update Ubuntu][1]. In this tutorial, I’ll discuss some common errors you may encounter while updating [Ubuntu][2]. It usually happens because you tried to add software or repositories on your own and that probably caused an issue. - -There is no need to panic if you see the errors while updating your system.The errors are common and the fix is easy. You’ll learn how to fix those common update errors. - -_**Before you begin, I highly advise reading these two articles to have a better understanding of the repository concept in Ubuntu.**_ - -![Understand Ubuntu repositories][3] - -![Understand Ubuntu repositories][3] - -###### **Understand Ubuntu repositories** - -Learn what are various repositories in Ubuntu and how they enable you to install software in your system. - -[Read More][4] - -![Understanding PPA in Ubuntu][5] - -![Understanding PPA in Ubuntu][5] - -###### **Understanding PPA in Ubuntu** - -Further improve your concept of repositories and package handling in Ubuntu with this detailed guide on PPA. - -[Read More][6] - -### Error 0: Failed to download repository information - -Many Ubuntu desktop users update their system through the graphical software updater tool. You are notified that updates are available for your system and you can click one button to start downloading and installing the updates. - -Well, that’s what usually happens. But sometimes you’ll see an error like this: - -![][7] - -_**Failed to download repository information. Check your internet connection.**_ - -That’s a weird error because your internet connection is most likely working just fine and it still says to check the internet connection. - -Did you note that I called it ‘error 0’? It’s because it’s not an error in itself. I mean, most probably, it has nothing to do with the internet connection. But there is no useful information other than this misleading error message. - -If you see this error message and your internet connection is working fine, it’s time to put on your detective hat and [use your grey cells][8] (as [Hercule Poirot][9] would say). - -You’ll have to use the command line here. You can [use Ctrl+Alt+T keyboard shortcut to open the terminal in Ubuntu][10]. In the terminal, use this command: - -``` -sudo apt update -``` - -Let the command finish. Observe the last three-four lines of its output. That will give you the real reason why sudo apt-get update fails. Here’s an example: - -![][11] - -Rest of the tutorial here shows how to handle the errors that you just saw in the last few lines of the update command output. - -### Error 1: Problem With MergeList - -When you run update in terminal, you may see an error “[problem with MergeList][12]” like below: - -``` -E:Encountered a section with no Package: header, -E:Problem with MergeList /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_binary-i386_Packages, -E:The package lists or status file could not be parsed or opened.’ -``` - -For some reasons, the file in /var/lib/apt/lists directory got corrupted. You can delete all the files in this directory and run the update again to regenerate everything afresh. Use the following commands one by one: - -``` -sudo rm -r /var/lib/apt/lists/* -sudo apt-get clean && sudo apt-get update -``` - -Your problem should be fixed. - -### Error 2: Hash Sum mismatch - -If you find an error that talks about [Hash Sum mismatch][13], the fix is the same as the one in the previous error. - -``` -W:Failed to fetch bzip2:/var/lib/apt/lists/partial/in.archive.ubuntu.com_ubuntu_dists_oneiric_restricted_binary-i386_Packages Hash Sum mismatch, -W:Failed to fetch bzip2:/var/lib/apt/lists/partial/in.archive.ubuntu.com_ubuntu_dists_oneiric_multiverse_binary-i386_Packages Hash Sum mismatch, -E:Some index files failed to download. They have been ignored, or old ones used instead -``` - -The error occurs possibly because of a mismatched metadata cache between the server and your system. You can use the following commands to fix it: - -``` -sudo rm -rf /var/lib/apt/lists/* -sudo apt update -``` - -### Error 3: Failed to fetch with error 404 not found - -If you try adding a PPA repository that is not available for your current [Ubuntu version][14], you’ll see that it throws a 404 not found error. - -``` -W: Failed to fetch http://ppa.launchpad.net/venerix/pkg/ubuntu/dists/raring/main/binary-i386/Packages 404 Not Found -E: Some index files failed to download. They have been ignored, or old ones used instead. -``` - -You added a PPA hoping to install an application but it is not available for your Ubuntu version and you are now stuck with the update error. This is why you should check beforehand if a PPA is available for your Ubuntu version or not. I have discussed how to check the PPA availability in the detailed [PPA guide][6]. - -Anyway, the fix here is that you remove the troublesome PPA from your list of repositories. Note the PPA name from the error message. Go to _Software & Updates_ tool: - -![Open Software & Updates][15] - -In here, move to _Other Software_ tab and look for that PPA. Uncheck the box to [remove the PPA][16] from your system. - -![Remove PPA Using Software & Updates In Ubuntu][17] - -Your software list will be updated when you do that. Now if you run the update again, you shouldn’t see the error. - -### Error 4: Failed to download package files error - -A similar error is **[failed to download package files error][18] **like this: - -![][19] - -In this case, a newer version of the software is available but it’s not propagated to all the mirrors. If you are not using a mirror, easily fixed by changing the software sources to Main server. Please read this article for more details on [failed to download package error][18]. - -Go to _Software & Updates_ and in there changed the download server to Main server: - -![][20] - -### Error 5: GPG error: The following signatures couldn’t be verified - -Adding a PPA may also result in the following [GPG error: The following signatures couldn’t be verified][21] when you try to run an update in terminal: - -``` -W: GPG error: http://repo.mate-desktop.org saucy InRelease: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 68980A0EA10B4DE8 -``` - -All you need to do is to fetch this public key in the system. Get the key number from the message. In the above message, the key is 68980A0EA10B4DE8. - -This key can be used in the following manner: - -``` -sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 68980A0EA10B4DE8 -``` - -Once the key has been added, run the update again and it should be fine. - -### Error 6: BADSIG error - -Another signature related Ubuntu update error is [BADSIG error][22] which looks something like this: - -``` -W: A error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://extras.ubuntu.com precise Release: The following signatures were invalid: BADSIG 16126D3A3E5C1192 Ubuntu Extras Archive Automatic Signing Key -W: GPG error: http://ppa.launchpad.net precise Release: -The following signatures were invalid: BADSIG 4C1CBC1B69B0E2F4 Launchpad PPA for Jonathan French W: Failed to fetch http://extras.ubuntu.com/ubuntu/dists/precise/Release -``` - -All the repositories are signed with the GPG and for some reason, your system finds them invalid. You’ll need to update the signature keys. The easiest way to do that is by regenerating the apt packages list (with their signature keys) and it should have the correct key. - -Use the following commands one by one in the terminal: - -``` -cd /var/lib/apt -sudo mv lists oldlist -sudo mkdir -p lists/partial -sudo apt-get clean -sudo apt-get update -``` - -### Error 7: Partial upgrade error - -Running updates in terminal may throw this partial upgrade error: - -![][23] - -``` -Not all updates can be installed -Run a partial upgrade, to install as many updates as possible -``` - -Run the following command in terminal to fix this error: - -``` -sudo apt-get install -f -``` - -### Error 8: Could not get lock /var/cache/apt/archives/lock - -This error happens when another program is using APT. Suppose you are installing some thing in Ubuntu Software Center and at the same time, trying to run apt in terminal. - -``` -E: Could not get lock /var/cache/apt/archives/lock – open (11: Resource temporarily unavailable) -E: Unable to lock directory /var/cache/apt/archives/ -``` - -Check if some other program might be using apt. It could be a command running terminal, Software Center, Software Updater, Software & Updates or any other software that deals with installing and removing applications. - -If you can close other such programs, close them. If there is a process in progress, wait for it to finish. - -If you cannot find any such programs, use the following [command to kill all such running processes][24]: - -``` -sudo killall apt apt-get -``` - -This is a tricky problem and if the problem still persists, please read this detailed tutorial on [fixing the unable to lock the administration directory error in Ubuntu][25]. - -_**Any other update error you encountered?**_ - -That compiles the list of frequent Ubuntu update errors you may encounter. I hope this helps you to get rid of these errors. - -Have you encountered any other update error in Ubuntu recently that hasn’t been covered here? Do mention it in comments and I’ll try to do a quick tutorial on it. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/ubuntu-update-error/ - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/update-ubuntu/ -[2]: https://ubuntu.com/ -[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/ubuntu-repositories.png?ssl=1 -[4]: https://itsfoss.com/ubuntu-repositories/ -[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/12/what-is-ppa.png?ssl=1 -[6]: https://itsfoss.com/ppa-guide/ -[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2013/04/Failed-to-download-repository-information-Ubuntu-13.04.png?ssl=1 -[8]: https://idioms.thefreedictionary.com/little+grey+cells -[9]: https://en.wikipedia.org/wiki/Hercule_Poirot -[10]: https://itsfoss.com/ubuntu-shortcuts/ -[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2013/11/Ubuntu-Update-error.jpeg?ssl=1 -[12]: https://itsfoss.com/how-to-fix-problem-with-mergelist/ -[13]: https://itsfoss.com/solve-ubuntu-error-failed-to-download-repository-information-check-your-internet-connection/ -[14]: https://itsfoss.com/how-to-know-ubuntu-unity-version/ -[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/05/software-updates-ubuntu-gnome.jpeg?ssl=1 -[16]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ -[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/remove_ppa_using_software_updates_in_ubuntu.jpg?ssl=1 -[18]: https://itsfoss.com/fix-failed-download-package-files-error-ubuntu/ -[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2014/09/Ubuntu_Update_error.jpeg?ssl=1 -[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2014/09/Change_server_Ubuntu.jpeg?ssl=1 -[21]: https://itsfoss.com/solve-gpg-error-signatures-verified-ubuntu/ -[22]: https://itsfoss.com/solve-badsig-error-quick-tip/ -[23]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2013/09/Partial_Upgrade_error_Elementary_OS_Luna.png?ssl=1 -[24]: https://itsfoss.com/how-to-find-the-process-id-of-a-program-and-kill-it-quick-tip/ -[25]: https://itsfoss.com/could-not-get-lock-error/ diff --git a/sources/tech/20191022 How collaboration fueled a development breakthrough at Greenpeace.md b/sources/tech/20191022 How collaboration fueled a development breakthrough at Greenpeace.md deleted file mode 100644 index 6d236a3ab7..0000000000 --- a/sources/tech/20191022 How collaboration fueled a development breakthrough at Greenpeace.md +++ /dev/null @@ -1,108 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How collaboration fueled a development breakthrough at Greenpeace) -[#]: via: (https://opensource.com/open-organization/19/10/collaboration-breakthrough-greenpeace) -[#]: author: (Laura Hilliger https://opensource.com/users/laurahilliger) - -How collaboration fueled a development breakthrough at Greenpeace -====== -We're building an innovative platform to connect environmental -advocates—but system complexity threatened to slow us down. Opening up -was the answer. -![The Open Organization at Greenpeace][1] - -Activists really don't like feeling stuck. - -We thrive on forward momentum and the energy it creates. When that movement grinds to a halt, even for a moment, our ability to catalyze passion in others stalls too. - -And my colleagues and I at Greenpeace International were feeling stuck. - -We'd managed to launch a prototype of Planet 4, [Greenpeace's new, open engagement platform][2] for activists and communities. It's live in more than 38 countries (with many more sites). More than 1.75 million people are using it. We've topped more than 3.1 million pageviews. - -To get here, we [spent more than 650 hours in meetings, drank 1,478 litres of coffee, and fixed more than 300 bugs][3]. But it fell short of our vision; it _still_ wasn't [the minimum lovable product][4] we wanted and we didn't know how to move it forward. - -We were stuck. - -Planet 4's complexity was daunting. We didn't always have the right people to address the numerous challenges the project raised. We didn't know if we'd ever realize our vision. Yet a commitment to openness had gotten us here, and I knew a commitment to openness would get us through this, too. - -As [the story of Planet 4][5] continues, I'll explain how it did. - -### An opportunity - -By 2016, my work helping Greenpeace International become a more open organization—[which I described in the first part of this series][6]—was beginning to bear fruit. We were holding regular [community calls][7]. We were releasing project updates frequently and publicly. We were networking with global stakeholders across the organization to define what Planet 4 needed to be. We were [architecting the project with participation in mind][8]. - -Becoming open is an organic process. There's no standard "game plan" for implementing process and practices in an organization. Success depends on the people, the tools, the project, the very fabric of the culture you're working inside. - -Inside Greenpeace, we were beginning to see that success. - -A commitment to openness had gotten us here, and I knew a commitment to openness would get us through this, too. - -For some, this open way of working was inspiring and engaging. For others it was terrifying. Some thought asking for everyone's input was ridiculous. Some thought only "experts" should be part of the conversations, a viewpoint that doesn't mesh well with [the principle of inclusivity][9]. I appreciate expertise—don't get me wrong—but the problem with only asking for "expert" opinions is that you exclude people who might have more interest, passion, and knowledge than someone with a formal title. - -Planet 4 was a vision—not just of a new and open engagement platform, but of an organization that could make _use_ of this platform. And it raised problems on both those fronts: - - * **Data and systems integration:** As a network of 28 independent offices all over the world, Greenpeace has a complex technical landscape. While Greenpeace International provides system _recommendations_ and _support_, individual National and Regional Offices are free to make their own systems choices, even if they aren't the supported ones. This is a good thing; different tools better address different needs for different offices. But it's challenging, too, because the absence of standardization means a lack of expertise in all those systems. - * **Organizational culture and work styles:** Planet 4 devoured many of Greenpeace's internal strategies and visions, then spit them out into a way that promised to move toward the type of organization we wanted to be. It was challenging the organizational status quo. - - - -Our team was too small, our work too big, and the landscape of working in a global non-profit too complex. The team was struggling, and we needed help. - -Then, in 2018, I saw an opportunity. - -As an [Open Organization Ambassador][10], I'd been to Red Hat Summit to speak on a panel about open organizational principles. There I noticed a session exploring what [Red Hat had done to help UNICEF][11], another global non-profit, with its digital transformation efforts. Surely, I thought, Red Hat and Greenpeace could work together, too. - -So I did something that shouldn't seem so revolutionary or audacious: I found the Red Hatter responsible for the company's collaboration with UNICEF, Alexandra Machado, and I _said hello_. I wasn't just introducing myself; I was approaching Alexandra on behalf of a global community of open-minded advocates. - -And it worked. - -### Accelerating - -Together, Alexandra and I spent more than a year coordinating a collaboration that could help Greenpeace move forward. Earlier this year, we started to succeed. - -Planet 4 was a vision—not just of a new and open engagement platform, but of an organization that could make use of this platform. And it raised problems on both those fronts. - -In late May, members of the Planet 4 project and a team from Red Hat's App Dev Center of Excellence met in Amsterdam. The goal: Accelerate us. - -We'd spend an entire week together in a design sprint aimed at helping us chart a speedy path toward making our vision for the Planet 4 engagement platform a reality, beginning with navigating its technical complexity. And in the process, we'd lean heavily on the open way of working we'd learned to embrace. - -At the sprint, our teams got to know each other. We dumped everything on the table. In a radically open and honest way, the Greenpeace team helped the Red Hat team from Waterford understand the technical and cultural hurdles we faced. We explained our organization and our tech stack, our vision and our dreams. Red Hatters noticed our passion and worked alongside us to explore possible technologies that could make our vision a reality. - -Through a series of exercises—including a particularly helpful session of [event storming][12]—we confirmed that our dream was not only the right one to have but also fully realizable. We talked through the dynamics of the systems we are addressing, and, in the end, the Red Hat team helped us envision a prototype for integrated systems that the Greenpeace team could take forward. We've already begun user testing. - -_Listen to Patrick Carney of Red Hat Open Innovation Labs explain event storming._ - -On top of that, our new allies wrote a technical report that laid out the complexities we could _see_ but not _address_—and in a way that spurred internal conversations forward. We found ourselves, a few weeks after the event, moving forward at speed. - -Finally, we were unstuck. - -In the final chapter of Planet 4's story, I'll explain what the experience taught us about the power of openness. - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/10/collaboration-breakthrough-greenpeace - -作者:[Laura Hilliger][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/laurahilliger -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/images/open-org/open-org-greenpeace-article-2-blog-thumbnail-520x292.png?itok=YNEKRAxS (The Open Organization at Greenpeace) -[2]: http://greenpeace.org/international -[3]: https://medium.com/planet4/p4-in-2018-3bec1cc12be8 -[4]: https://medium.com/planet4/past-the-prototype-d3e0a4d3a171 -[5]: https://opensource.com/tags/open-organization-greenpeace -[6]: https://opensource.com/open-organization/19/10/open-platform-greenpeace-1 -[7]: https://opensource.com/open-organization/16/1/community-calls-will-increase-participation-your-open-organization -[8]: https://opensource.com/open-organization/16/8/best-results-design-participation -[9]: https://opensource.com/open-organization/resources/open-org-definition -[10]: https://opensource.com/open-organization/resources/meet-ambassadors -[11]: https://www.redhat.com/en/proof-of-concept-series -[12]: https://openpracticelibrary.com/practice/event-storming/ diff --git a/sources/tech/20191022 NGT- A library for high-speed approximate nearest neighbor search.md b/sources/tech/20191022 NGT- A library for high-speed approximate nearest neighbor search.md deleted file mode 100644 index 5922064511..0000000000 --- a/sources/tech/20191022 NGT- A library for high-speed approximate nearest neighbor search.md +++ /dev/null @@ -1,258 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (NGT: A library for high-speed approximate nearest neighbor search) -[#]: via: (https://opensource.com/article/19/10/ngt-open-source-library) -[#]: author: (Masajiro Iwasaki https://opensource.com/users/masajiro-iwasaki) - -NGT: A library for high-speed approximate nearest neighbor search -====== -NGT is a high-performing, open source deep learning library for -large-scale and high-dimensional vectors. -![Houses in a row][1] - -Approximate nearest neighbor ([ANN][2]) search is used in deep learning to make a best guess at the point in a given set that is most similar to another point. This article explains the differences between ANN search and traditional search methods and introduces [NGT][3], a top-performing open source ANN library developed by [Yahoo! Japan Research][4]. - -### Nearest neighbor search for high-dimensional data - -Different search methods are used for different data types. For example, full-text search is for text data, content-based image retrieval is for images, and relational databases are for data relationships. Deep learning models can easily generate vectors from various kinds of data so that the vector space has embedded relationships among source data. This means that if two source data are similar, the two vectors from the data will be located near each other in the vector space. Therefore, all you have to do is search the vectors instead of the source data. - -Moreover, the vectors not only represent the text and image characteristics of the source data, but they also represent products, human beings, organizations, and so forth. Therefore, you can search for similar documents and images as well as products with similar attributes, human beings with similar skills, clothing with similar features, and so on. For example, [Yahoo! Japan][5] provides a similarity-based fashion-item search using NGT. - -![Nearest neighbour search][6] - -Since the number of dimensions in deep learning models tends to increase, ANN search methods are indispensable when searching for more than several million high-dimensional vectors. ANN search methods allow you to search for neighbors to the specified query vector in high-dimensional space. - -There are many nearest-neighbor search methods to choose from. [ANN Benchmarks][7] evaluates the best-known ANN search methods, including Faiss (Facebook), Flann, and Hnswlib. According to this benchmark, NGT achieves top-level performance. - -### NGT algorithms - -The NGT index combines a graph and a tree. This result is a very good search performance, with the graph's vertices representing searchable objects. Neighboring vertices are connected by edges. - -This animation shows how a graph is constructed. - -![NGT graph construction][8] - -In the search procedure, neighboring vertices to the specified query can be found descending the graph. Densely connected vertices enable users to explore the graph effectively. - -![NGT graph][9] - -NGT provides a command-line tool, along with C, C++, and Python APIs. This article focuses on the command-line tool and the Python API. - -### Using NGT with the command-line tool - -#### Linux installation - -Download the [latest version of NGT][10] as a ZIP file and install it on Linux with: - - -``` -unzip NGT-x.x.x.zip -cd NGT-x.x.x -mkdir build -cd build -cmake .. -make -make install -``` - -Since NGT libraries are installed in **/usr/local/lib(64)** by default, add the directory to the search path: - - -``` -export PATH="$PATH:/opt/local/bin" -export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" -``` - -#### Sample dataset generation - -Before you can search for a large-scale dataset, you must generate an NGT dataset. As an example, [download the][11] [fastText][11] [dataset][11] from the [fastText website][12], then convert it to the NGT registration format with: - - -``` -curl -O -unzip wiki-news-300d-1M-subword.vec.zip -tail -n +2 wiki-news-300d-1M-subword.vec | cut -d " " -f 2- > objects.ssv -``` - -**Objects.ssv** is a registration file that has 1 million objects. One object in the file is extracted as a query: - - -``` -`head -10000 objects.ssv | tail -1 > query.ssv` -``` - -#### Index construction - -An **ngt_index** can be constructed using the following command: - - -``` -`ngt create -d 300 -D c index objects.ssv` -``` - -_-d_ specifies the number of dimensions of the vector. _-D c_ means using cosine similarity. - -#### Approximate nearest neighbor search - -The **ngt_index** can be searched for with the queries using: - - -``` -`ngt search -n 10 index query.ssv` -``` - -**-n** specifies the number of resulting objects. - -The search results are: - - -``` -Query No.1 -Rank    ID      Distance -1       10000   0 -2       21516   0.184495 -3       201860  0.240375 -4       71865   0.241284 -5       339589  0.267265 -6       485158  0.280977 -7       7961    0.283865 -8       924513  0.286571 -9       28870   0.286654 -10      395274  0.290466 -Query Time= 0.000972628 (sec), 0.972628 (msec) -Average Query Time= 0.000972628 (sec), 0.972628 (msec), (0.000972628/1) -``` - -Please see the [NGT command-line README][13] for more information. - -### Using NGT from Python - -Although NGT has C and C++ APIs, the [ngtpy][14] Python binding for NGT is the simplest option for programming. - -#### Installing ngtpy - -Install the Python binding (ngtpy) through PyPI with: - - -``` -`pip3 install ngt` -``` - -#### Sample dataset generation - -Generate data files for Python sample programs from the sample data set you downloaded by using this code: - - -``` -dataset_path = 'wiki-news-300d-1M-subword.vec' -with open(dataset_path, 'r') as fi, open('objects.tsv', 'w') as fov, -open('words.tsv', 'w') as fow: -    n, dim = map(int, fi.readline().split()) -    fov.write('{0}¥t{1}¥n'.format(n, dim)) -    for line in fi: -        tokens = line.rstrip().split(' ') -        fow.write(tokens[0] + '¥n') -        fov.write('{0}¥n'.format('¥t'.join(tokens[1:]))) -``` - -#### Index construction - -Construct the NGT index with: - - -``` -import ngtpy - -index_path = 'index' -with open('objects.tsv', 'r') as fin: -    n, dim = map(int, fin.readline().split()) -    ngtpy.create(index_path, dim, distance_type='Cosine') # create an index -    index = ngtpy.Index(index_path) # open the index -    print('inserting objects...') -    for line in fin: -        object = list(map(float, line.rstrip().split('¥t'))) -        index.insert(object) # insert objects -print('building objects...') -index.build_index() -print('saving the index...') -index.save() -``` - -#### Approximate nearest neighbor search - -Here is an example ANN search program: - - -``` -import ngtpy - -print('loading words...') -with open('words.tsv', 'r') as fin: -    words = list(map(lambda x: x.rstrip('¥n'), fin.readlines())) - -index = ngtpy.Index('index', zero_based_numbering = False) # open index -query_id = 10000 -query_object = index.get_object(query_id) # get the object for a query - -result = index.search(query_object) # aproximate nearest neighbor search -print('Query={}'.format(words[query_id - 1])) -print('Rank¥tID¥tDistance¥tWord') -for rank, object in enumerate(result): -    print('{}¥t{}¥t{:.6f}¥t{}'.format(rank + 1, object[0], object[1], words[object[0] - 1])) -``` - -And here are the search results, which are the same as the NGT command-line option's results: - - -``` -loading words... -Query=Horse -Rank    ID      Distance        Word -1       10000   0.000000        Horse -2       21516   0.184495        Horses -3       201860  0.240375        Horseback -4       71865   0.241284        Horseman -5       339589  0.267265        Prancing -6       485158  0.280977        Horsefly -7       7961    0.283865        Dog -8       924513  0.286571        Horsing -9       28870   0.286654        Pony -10      395274  0.290466        Blood-Horse -``` - -For more information, please see [ngtpy README][14]. - -Approximate nearest neighbor (ANN) principles are important features for analyzing data. Learning how to use it in your own projects, or to make sense of data that you're analyzing, is a powerful way to make correlations and interpret information. With NGT, you can use ANN in whatever way you require, or build upon it to add custom features. - -Introduction to Apache Hadoop, an open source software framework for storage and large scale... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/ngt-open-source-library - -作者:[Masajiro Iwasaki][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/masajiro-iwasaki -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/house_home_colors_live_building.jpg?itok=HLpsIfIL (Houses in a row) -[2]: https://en.wikipedia.org/wiki/Nearest_neighbor_search#Approximate_nearest_neighbor -[3]: https://github.com/yahoojapan/NGT -[4]: https://research-lab.yahoo.co.jp/en/ -[5]: https://www.yahoo.co.jp/ -[6]: https://opensource.com/sites/default/files/browser-visual-search_new.jpg (Nearest neighbour search) -[7]: https://github.com/erikbern/ann-benchmarks -[8]: https://opensource.com/sites/default/files/uploads/ngt_movie2.gif (NGT graph construction) -[9]: https://opensource.com/sites/default/files/uploads/ngt_movie1.gif (NGT graph) -[10]: https://github.com/yahoojapan/NGT/releases/latest -[11]: https://dl.fbaipublicfiles.com/fasttext/vectors-english/wiki-news-300d-1M-subword.vec.zip -[12]: https://fasttext.cc/ -[13]: https://github.com/yahoojapan/NGT/blob/master/bin/ngt/README.md -[14]: https://github.com/yahoojapan/NGT/blob/master/python/README-ngtpy.md diff --git a/sources/tech/20191023 Best practices in test-driven development.md b/sources/tech/20191023 Best practices in test-driven development.md deleted file mode 100644 index 47f025a111..0000000000 --- a/sources/tech/20191023 Best practices in test-driven development.md +++ /dev/null @@ -1,206 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Best practices in test-driven development) -[#]: via: (https://opensource.com/article/19/10/test-driven-development-best-practices) -[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzic) - -Best practices in test-driven development -====== -Ensure you're producing very high-quality code by following these TDD -best practices. -![magnifying glass on computer screen][1] - -In my previous series on [test-driven development (TDD) and mutation testing][2], I demonstrated the benefits of relying on examples when building a solution. That begs the question: What does "relying on examples" mean? - -In that series, I described one of my expectations when building a solution to determine whether it's daytime or nighttime. I provided an example of a specific hour of the day that I consider to fall in the daytime category. I created a **DateTime** variable named **dayHour** and gave it the specific value of **August 8, 2019, 7 hours, 0 minutes, 0 seconds**. - -My logic (or way of reasoning) was: "When the system is notified that the time is exactly 7am on August 8, 2019, I expect that the system will perform the necessary calculations and return the value **Daylight**." - -Armed with such a specific example, it was very easy to create a unit test (**Given7amReturnDaylight**). I then ran the tests and watched my unit test fail, which gave me the opportunity to work on fixing this early failure. - -### Iteration is the solution - -One very important aspect of TDD (and, by proxy, of agile) is the fact that it is impossible to arrive at an acceptable solution unless you are iterating. TDD is a professional discipline based on the process of relentless iterating. It is very important to note that it mandates that each iteration must begin with a micro-failure. That micro-failure has only one purpose: to solicit immediate feedback. And that immediate feedback ensures we can rapidly close the gap between _wanting_ a solution and _getting_ a solution. - -Iteration provides an opportunity to solicit immediate feedback by failing as early as possible. Because that failure is fast (i.e., it is a micro-failure), it is not alarming; even when we fail, we can remain calm, knowing that it will be easy to fix the failure. And the feedback from that failure will guide us toward fixing the failure. - -Rinse, repeat, until we completely close the gap and deliver the solution that fully meets the expectation (but keep in mind that the expectation must also be a micro-expectation). - -### Why micro? - -This approach often feels very unambitious. In TDD (and in agile), it's best to pick a tiny, almost trivial challenge, and then do the TDD song-and-dance by failing first, then iterating until we solve that trivial challenge. People who are used to more substantial, beefy engineering and problem solving tend to feel that such an exercise is beneath their level of competence. - -One of the cornerstones of agile philosophy relies on reducing the problem space to multiple, smallest-possible surface areas. As Robert C. Martin puts it: - -> _"Agile is a small idea about the small problems of small programming teams doing small things"_ - -But how can making an unimpressive series of such pedestrian, minuscule, and almost insignificant micro-victories ever enable us to reach the big-scale solution? - -Here is where sophisticated and elaborate systems thinking comes into play. When building a system, there's always the risk of ending up with a dreaded "monolith." A monolith is a system built on the principle of tight coupling. Any part of the monolith is highly dependent on many other parts of the same monolith. That arrangement makes the monolith very brittle, unreliable, and difficult to operate, maintain, troubleshoot, and fix. - -The only way to avoid this trap is to minimize or, better yet, completely remove coupling. Instead of investing heroic efforts into building elaborate parts that will be assembled into a system, it is much better to take humble, baby steps toward building tiny, micro parts. These micro parts have very little capability on their own, and will, by virtue of such arrangement, not be dependent on other components. This will minimize and even remove any coupling. - -The desired end game in building a useful, elaborate system is to compose it from a collection of generic, completely independent components. The more generic each component is, the more robust, resilient, and flexible the resulting system will be. Also, having a collection of generic components enables them to be repurposed to build brand new systems by reconfiguring those components. - -Consider a toy castle made out of Lego blocks. If we pick almost any block from that castle and examine it in isolation, we won't be able to find anything on that block that specifies it is a Lego block meant for building a castle. The block itself is sufficiently generic, which makes it suitable for building other contraptions, such as toy cars, toy airplanes, toy boats, etc. That's the power of having generic components. - -TDD is a proven discipline for delivering generic, independent, and autonomous components that can be safely used to assemble large, sophisticated systems expediently. As in agile, TDD is focused on micro-activities. And because agile is based on the fundamental principle known as "the Whole Team," the humble approach illustrated here is also important when specifying business examples. If the example used for building a component is not modest, it will be difficult to meet the expectations. Therefore, the expectations must be humble, which makes the resulting examples equally humble. - -For instance, if a member of the Whole Team (a requester) provides the developer with an expectation and an example that reads: - -> _"When processing an order, make sure to apply appropriate discount for orders made by loyal customers, or for orders over certain monetary value, or both."_ - -The developer should recognize that this example is too ambitious. That's not a humble expectation. It is not sufficiently micro, if you will. The developer should always strive to guide a requester in being more specific and micro-level when crafting examples. Paradoxically, the more specific the example, the more generic the resulting solution will be. - -A much better, more effective expectation and example would be: - -> _"Discount made for an order greater than $100.00 is $18.00."_ - -Or: - -> _"Discount made for an order greater than $100.00 that was made by a customer who already placed three orders is $25.00."_ - -Such micro-examples make it easy to turn them into automated micro-expectations (read: unit tests). Such expectations will make us fail, and then we will pick ourselves up and iterate until we deliver the solution—a robust, generic component that knows how to calculate discounts based on the micro-examples supplied by the Whole Team. - -### Writing quality unit tests - -Merely writing unit tests without any concern about their quality is a fool's errand. Shoddily written unit tests will result in bloated, tightly coupled code. Such code is brittle, difficult to reason about, and often nearly impossible to fix. - -We need to lay down some ground rules for writing quality unit tests. These ground rules will help us make swift progress in building robust, reliable solutions. The easiest way to do that is to introduce a mnemonic in the form of an acronym: **FIRST**, which says unit tests must be: - - * **F** = Fast - * **I** = Independent - * **R** = Repeatable - * **S** = Self-validating - * **T** = Thorough - - - -#### Fast - -Since a unit test describes a micro-example, it should expect very simple processing from the implemented code. This means that each unit test should be very fast to run. - -#### Independent - -Since a unit test describes a micro-example, it should describe a very simple process that does not depend on any other unit test. - -#### Repeatable - -Since a unit test does not depend on any other unit test, it must be fully repeatable. What that means is that each time a certain unit test runs, it produces the same results as the previous time it ran. Neither the number of times the unit tests run nor the order in which they run should ever affect the expected output. - -#### Self-validating - -When unit tests run, the outcome of the testing should be instantly visible. Developers should not be expected to reach for some other source(s) of information to find out whether their unit tests failed or passed. - -#### Thorough - -Unit tests should describe all the expectations as defined in the micro-examples. - -### Well-structured unit tests - -Unit tests are code. And the same as any other code, unit tests need to be well-structured. It is unacceptable to deliver sloppy, messy unit tests. All the principles that apply to the rules governing clean implementation code apply with equal force to unit tests. - -A time-tested and proven methodology for writing reliable quality code is based on the clean code principle known as **SOLID**. This acronym that helps us remember five very important principles: - - * **S** = Single responsibility principle - * **O** = Open–closed principle - * **L** = Liskov substitution principle - * **I** = Interface segregation principle - * **D** = Dependency inversion principle - - - -#### Single responsibility principle - -Each component must be responsible for performing only one operation. This principle is illustrated in this meme - -![Sign illustrating single-responsibility principle][3] - -Pumping septic tanks is an operation that must be kept separate from filling swimming pools. - -Applied to unit tests, this principle ensures that each unit test verifies one—and only one—expectation. From a technical standpoint, this means each unit test must have one and only one **Assert** statement. - -#### Open–closed principle - -This principle states that a component should be open for extensions, but closed for any modifications. - -![Open-closed principle][4] - -Applied to unit tests, this principle ensures that we will not implement a change to an existing unit test in that unit test. Instead, we must write a brand new unit test that will implement the changes. - -#### Liskov substitution principle - -This principle provides a guide for deciding which level of abstraction may be appropriate for the solution. - -![Liskov substitution principle][5] - -Applied to unit tests, this principle guides us to avoid tight coupling with dependencies that depend on the underlying computing environment (such as databases, disks, network, etc.). - -#### Interface segregation principle - -This principle reminds us not to bloat APIs. When subsystems need to collaborate to complete a task, they should communicate via interfaces. But those interfaces must not be bloated. If a new capability becomes necessary, don't add it to the already defined interface; instead, craft a brand new interface. - -![Interface segregation principle][6] - -Applied to unit tests, removing the bloat from interfaces helps us craft more specific unit tests, which, in turn, results in more generic components. - -#### Dependency inversion principle - -This principle states that we should control our dependencies, instead of dependencies controlling us. If there is a need to use another component's services, instead of being responsible for instantiating that component within the component we are building, it must instead be injected into our component. - -![Dependency inversion principle][7] - -Applied to the unit tests, this principle helps separate the intention from the implementation. We must strive to inject only those dependencies that have been sufficiently abstracted. That approach is important for ensuring unit tests are not mixed with integration tests. - -### Testing the tests - -Finally, even if we manage to produce well-structured unit tests that fulfill the FIRST principles, it does not guarantee that we have delivered a solid solution. TDD best practices rely on the proper sequence of events when building components/services; we are always and invariably expected to provide a description of our expectations (supplied in the micro-examples). Only after those expectations are described in the unit test can we move on to writing the implementation code. However, two unwanted side effects can, and often do, happen while writing implementation code: - - 1. Implemented code enables the unit tests to pass, but they are written in a convoluted way, using unnecessarily complex logic - 2. Implemented code gets tagged on AFTER the unit tests have been written - - - -In the first case, even if all unit tests pass, mutation testing uncovers that some mutants have survived. As I explained in _[Mutation testing by example: Evolving from fragile TDD][8]_, that is an extremely undesirable situation because it means that the solution is unnecessarily complex and, therefore, unmaintainable. - -In the second case, all unit tests are guaranteed to pass, but a potentially large portion of the codebase consists of implemented code that hasn't been described anywhere. This means we are dealing with mysterious code. In the best-case scenario, we could treat that mysterious code as deadwood and safely remove it. But more likely than not, removing this not-described, implemented code will cause some serious breakages. And such breakages indicate that our solution is not well engineered. - -### Conclusion - -TDD best practices stem from the time-tested methodology called [extreme programming][9] (XP for short). One of the cornerstones of XP is based on the **three C's**: - - 1. **Card:** A small card briefly specifies the intent (e.g., "Review customer request"). - 2. **Conversation:** The card becomes a ticket to conversation. The whole team gets together and talks about "Review customer request." What does that mean? Do we have enough information/knowledge to ship the "review customer request" functionality in this increment? If not, how do we further slice this card? - 3. **Concrete confirmation examples:** This includes all the specific values plugged in (e.g., concrete names, numeric values, specific dates, whatever else is pertinent to the use case) plus all values expected as an output of the processing. - - - -Starting from such micro-examples, we write unit tests. We watch unit tests fail, then make them pass. And while doing that, we observe and respect the best software engineering practices: the **FIRST** principles, the **SOLID** principles, and the mutation testing discipline (i.e., kill all surviving mutants). - -This ensures that our components and services are delivered with solid quality built in. And what is the measure of that quality? Simple—**the cost of change**. If the delivered code is costly to change, it is of shoddy quality. Very high-quality code is structured so well that it is simple and inexpensive to change and, at the same time, does not incur any change-management risks. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/test-driven-development-best-practices - -作者:[Alex Bunardzic][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/alex-bunardzic -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/search_find_code_issue_bug_programming.png?itok=XPrh7fa0 (magnifying glass on computer screen) -[2]: https://opensource.com/users/alex-bunardzic -[3]: https://opensource.com/sites/default/files/uploads/single-responsibility.png (Sign illustrating single-responsibility principle) -[4]: https://opensource.com/sites/default/files/uploads/openclosed_cc.jpg (Open-closed principle) -[5]: https://opensource.com/sites/default/files/uploads/liskov_substitution_cc.jpg (Liskov substitution principle) -[6]: https://opensource.com/sites/default/files/uploads/interface_segregation_cc.jpg (Interface segregation principle) -[7]: https://opensource.com/sites/default/files/uploads/dependency_inversion_cc.jpg (Dependency inversion principle) -[8]: https://opensource.com/article/19/9/mutation-testing-example-definition -[9]: https://en.wikipedia.org/wiki/Extreme_programming diff --git a/sources/tech/20191024 The Five Most Popular Operating Systems for the Internet of Things.md b/sources/tech/20191024 The Five Most Popular Operating Systems for the Internet of Things.md deleted file mode 100644 index 89d6ef1acf..0000000000 --- a/sources/tech/20191024 The Five Most Popular Operating Systems for the Internet of Things.md +++ /dev/null @@ -1,147 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The Five Most Popular Operating Systems for the Internet of Things) -[#]: via: (https://opensourceforu.com/2019/10/the-five-most-popular-operating-systems-for-the-internet-of-things/) -[#]: author: (K S Kuppusamy https://opensourceforu.com/author/ks-kuppusamy/) - -The Five Most Popular Operating Systems for the Internet of Things -====== - -[![][1]][2] - -_Connecting every ‘thing’ that we see around us to the Internet is the fundamental idea of the Internet of Things (IoT). There are many operating systems to get the best out of the things that are connected to the Internet. This article explores four popular operating systems for IoT — Ubuntu Core, RIOT, Contiki and TinyOS._ - -To say that life is running on the Internet these days is not an exaggeration due to the number and variety of services that we consume on the Net. These services span multiple domains such as information, financial services, social networking and entertainment. As this list grows longer, it becomes imperative that we do not restrict the types of devices that can connect to the Internet. The Internet of Things (IoT) facilitates connecting various types of ‘things’ to the Internet infrastructure. By connecting a device or thing to the Internet, these things get the ability to not only interact with the user but also between themselves. This feature of a variety of things interacting among themselves to assist users in a pervasive manner constitutes an interesting phenomenon called ambient intelligence. - -![Figure 1: IoT application domains][3] - -IoT is becoming increasingly popular as the types of devices that can be connected to it are becoming more diverse. The nature of applications is also evolving. Some of the popular domains in which IoT is getting used increasingly are listed below (Figure 1): - - * Smart homes - * Smart cities - * Smart agriculture - * Connected automobiles - * Smart shopping - * Connected health - - - -![Figure 2: IoT operating system features][4] - -As the application domains become diverse, the need to manage the IoT infrastructure efficiently is also becoming more important. The operating systems in normal computers perform the primary functions such as resource management, user interaction, etc. The requirements of IoT operating systems are specialised due to the nature and size of the devices involved in the process. Some of the important characteristics/requirements of IoT operating systems are listed below (Figure 2): - - * A tiny memory footprint - * Energy efficiency - * Connectivity features - * Hardware-agnostic operations - * Real-time processing requirements - * Security requirements - * Application development ecosystem - - - -As of 2019, there is a spectrum of choices for selecting the operating system (OS) for the Internet of Things. Some of these OSs are shown in Figure 3. - -![Figure 3: IoT operating systems][5] - -**Ubuntu Core** -As Ubuntu is a popular Linux distribution, the Ubuntu Core IoT offering has also become popular. Ubuntu Core is a secure and lightweight OS for IoT, and is designed with a ‘security first’ philosophy. According to the official documentation, the entire system has been redesigned to focus on security from the first boot. There is a detailed white paper available on Ubuntu Core’s security features. It can be accessed at _ -ubuntu-core-security-whitepaper.pdf?_ga=2.74563154.1977628533. 1565098475-2022264852.1565098475_. - -Ubuntu Core has been made tamper-resistant. As the applications may be from diverse sources, they are given privileges for only their own data. This has been done so that one poorly designed app does not make the entire system vulnerable. Ubuntu Core is ‘built for business’, which means that the developers can focus directly on the application at hand, while the other requirements are supported by the default operating system. - -Another important feature of Ubuntu Core is the availability of a secure app store, which you can learn more about at __. There is a ready-to-go software ecosystem that makes using Ubuntu Core simple. - -The official documentation lists various successful case studies about how Ubuntu Core has been successfully used. - -**RIOT** -RIOT is a user-friendly OS for the Internet of Things. This FOSS OS has been developed by a number of people from around the world. -RIOT supports many low-power IoT devices. It has support for various microcontroller architectures. The official documentation lists the following reasons for using the RIOT OS. - - * _**It is developer friendly:**_ It supports the standard environments and tools so that developers need not go through a steep learning curve. Standard programming languages such as C or C++ are supported. The hardware dependent code is very minimal. Developers can code once and then run their code on 8-bit, 16-bit and 32-bit platforms. - * _**RIOT is resource friendly:**_ One of the important features of RIOT is its ability to support lightweight devices. It enables maximum energy efficiency. It supports multi-threading with very little overhead for threading. - * _**RIOT is IoT friendly:**_ The common system support provided by RIOT makes it a very important choice for IoT. It has support for CoAP, CBOR, high resolution and long-term timers. - - - -**Contiki** -Contiki is an important OS for IoT. It facilitates connecting tiny, low-cost and low-energy devices to the Internet. -The prominent reasons for choosing the Contiki OS are as follows. - - * _**Internet standards:**_ The Contiki OS supports the IPv6 and IPv4 standards, in addition to the low-power 6lowpan, RPL and CoAP standards. - * _**Support for a variety of hardware:**_ Contiki can be run on a variety of low-power devices, which are easily available online. - * _**Large community support:**_ One of the important advantages of using Contiki is the availability of an active community of developers. So when you have some technical issues to be solved, these community members make the problem solving process simple and effective. - - - -The major features of Contiki are listed below. - - * _**Memory allocation:**_ Even the tiny systems with only a few kilobytes of memory can also use Contiki. Its memory efficiency is an important feature. - * _**Full IP networking:**_ The Contiki OS offers a full IP network stack. This includes major standard protocols such as UDP, TCP, HTTP, 6lowpan, RPL, CoAP, etc. - * _**Power awareness:**_ The ability to assess the power requirements and to use them in an optimal minimal manner is an important feature of Contiki. - * The Cooja network simulator makes the process of developing and debugging software easier. - * The availability of the Coffee Flash file system and the Contiki shell makes the file handling and command execution simpler and more effective. - - - -**TinyOS** -TinyOS is an open source operating system designed for low-power wireless devices. It has a vibrant community of users spread across the world from both academia and industry. The popularity of TinyOS can be understood from the fact that it gets downloaded more than 35,000 times in a year. -TinyOS is very effectively used in various scenarios such as sensor networks, smart buildings, smart meters, etc. The main repository of TinyOS is available at . -TinyOS is written in nesC which is a dialect of C. A sample code snippet is shown below: - -``` -configuration Led { -provides { -interface LedControl; -} -uses { -interface Gpio; -} -} -implementation { - -command void LedControl.turnOn() { -call Gpio.set(); -} - -command void LedControl.turnOff() { -call Gpio.clear(); -} - -} -``` - -**Zephyr** -Zephyr is a real-time OS that supports multiple architectures and is optimised for resource-constrained environments. Security is also given importance in the Zephyr design. - -The prominent features of Zephyr are listed below: - - * Support for 150+ boards. - * Complete flexibility and freedom of choice. - * Can handle small footprint IoT devices. - * Can develop products with built-in security features. - - - -This article has introduced readers to a list of four OSs for the IoT, from which they can select the ideal one, based on individual requirements. - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/10/the-five-most-popular-operating-systems-for-the-internet-of-things/ - -作者:[K S Kuppusamy][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/ks-kuppusamy/ -[b]: https://github.com/lujun9972 -[1]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/10/OS-for-IoT.jpg?resize=696%2C647&ssl=1 (OS for IoT) -[2]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/10/OS-for-IoT.jpg?fit=800%2C744&ssl=1 -[3]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Figure-1-IoT-application-domains.jpg?resize=350%2C107&ssl=1 -[4]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Figure-2-IoT-operating-system-features.jpg?resize=350%2C93&ssl=1 -[5]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Figure-3-IoT-operating-systems.jpg?resize=350%2C155&ssl=1 diff --git a/sources/tech/20191026 How to Backup Configuration Files on a Remote System Using the Bash Script.md b/sources/tech/20191026 How to Backup Configuration Files on a Remote System Using the Bash Script.md deleted file mode 100644 index c2d3b4397f..0000000000 --- a/sources/tech/20191026 How to Backup Configuration Files on a Remote System Using the Bash Script.md +++ /dev/null @@ -1,550 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Backup Configuration Files on a Remote System Using the Bash Script) -[#]: via: (https://www.2daygeek.com/linux-bash-script-backup-configuration-files-remote-linux-system-server/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -How to Backup Configuration Files on a Remote System Using the Bash Script -====== - -It is a good practice to backup configuration files before performing any activity on a Linux system. - -You can use this script if you are restarting the server after several days. - -If you are really concerned about the backup of your configuration files, it is advisable to use this script at least once a month. - -If something goes wrong, you can restore the system to normal by comparing configuration files based on the error message. - -Three **[bash scripts][1]** are included in this article, and each **[shell script][2]** is used for specific purposes. - -You can choose one based on your requirements. - -Everything in Linux is a file. If you make some wrong changes in the configuration file, it will cause the associated service to crash. - -So it is a good idea to take a backup of configuration files, and you do not have to worry about disk usage as this not consume much space. - -### What does this script do? - -This script backs up specific configuration files, moves them to another server, and finally deletes the backup on the remote machine. - -This script has six parts, and the details are below. - - * **Part-1:** Backup a General Configuration Files - * **Part-2:** Backup a wwn/wwpn number if the server is physical. - * **Part-3:** Backup an oracle related files if the system has an oracle user account. - * **Part-4:** Create a tar archive of backup configuration files. - * **Part-5:** Copy the tar archive to other server. - * **Part-6:** Remove Backup of configuration files on the remote system. - - - -**System details are as follows:** - - * **Server-A:** Local System/ JUMP System (local.2daygeek.com) - * **Server-B:** Remote System-1 (CentOS6.2daygeek.com) - * **Server-C:** Remote System-2 (CentOS7.2daygeek.com) - - - -### 1) Bash Script to Backup Configuration files on Remote Server - -Two scripts are included in this example, which allow you to back up important configurations files from one server to another (that is, from a remote server to a local server). - -For example, if you want to back up important configuration files from **“Server-B”** to **“Server-A”**. Use the following script. - -This is a real bash script that takes backup of configuration files on the remote server. - -``` -# vi /home/daygeek/shell-script/config-file.sh - -#!/bin/bash -mkdir /tmp/conf-bk-$(date +%Y%m%d) -cd /tmp/conf-bk-$(date +%Y%m%d) - -For General Configuration Files -hostname > hostname.out -uname -a > uname.out -uptime > uptime.out -cat /etc/hosts > hosts.out -/bin/df -h>df-h.out -pvs > pvs.out -vgs > vgs.out -lvs > lvs.out -/bin/ls -ltr /dev/mapper>mapper.out -fdisk -l > fdisk.out -cat /etc/fstab > fstab.out -cat /etc/exports > exports.out -cat /etc/crontab > crontab.out -cat /etc/passwd > passwd.out -ip link show > ip.out -/bin/netstat -in>netstat-in.out -/bin/netstat -rn>netstat-rn.out -/sbin/ifconfig -a>ifconfig-a.out -cat /etc/sysctl.conf > sysctl.out -sleep 10s - -#For Physical Server -vserver=$(lscpu | grep vendor | wc -l) -if [ $vserver -gt 0 ] -then -echo "$(hostname) is a VM" -else -systool -c fc_host -v | egrep "(Class Device path | port_name |port_state)" > systool.out -fi -sleep 10s - -#For Oracle DB Servers -if id oracle >/dev/null 2>&1; then -/usr/sbin/oracleasm listdisks>asm.out -/sbin/multipath -ll > mpath.out -/bin/ps -ef|grep pmon > pmon.out -else -echo "oracle user does not exist on server" -fi -sleep 10s - -#Create a tar archive -tar -cvf /tmp/$(hostname)-date +%Y%m%d.tar /tmp/conf-bk-$(date +%Y%m%d) -sleep 10s - -#Copy a tar archive to other server -sshpass -p 'password' scp /tmp/$(hostname)-date +%Y%m%d.tar Server-A:/home/daygeek/backup/ - -#Remove the backup config folder -cd .. -rm -Rf conf-bk-$(date +%Y%m%d) -rm $(hostname)-date +%Y%m%d.tar -rm config-file.sh -exit -``` - -This is a sub-script that pushes the above script to the target server. - -``` -# vi /home/daygeek/shell-script/conf-remote.sh - -#!/bin/bash -echo -e "Enter the Remote Server Name: \c" -read server -scp /home/daygeek/shell-script/config-file.sh $server:/tmp/ -ssh [email protected]${server} sh /home/daygeek/shell-script/config-file.sh -sleep 10s -exit -``` - -Finally run the bash script to achieve this. - -``` -# sh /home/daygeek/shell-script/conf-remote.sh - -Enter the Remote Server Name: CentOS6.2daygeek.com -config-file.sh 100% 1446 647.8KB/s 00:00 -CentOS6.2daygeek.com is a VM -oracle user does not exist on server -tar: Removing leading `/' from member names -/tmp/conf-bk-20191024/ -/tmp/conf-bk-20191024/pvs.out -/tmp/conf-bk-20191024/vgs.out -/tmp/conf-bk-20191024/ip.out -/tmp/conf-bk-20191024/netstat-in.out -/tmp/conf-bk-20191024/fstab.out -/tmp/conf-bk-20191024/ifconfig-a.out -/tmp/conf-bk-20191024/hostname.out -/tmp/conf-bk-20191024/crontab.out -/tmp/conf-bk-20191024/netstat-rn.out -/tmp/conf-bk-20191024/uptime.out -/tmp/conf-bk-20191024/uname.out -/tmp/conf-bk-20191024/mapper.out -/tmp/conf-bk-20191024/lvs.out -/tmp/conf-bk-20191024/exports.out -/tmp/conf-bk-20191024/df-h.out -/tmp/conf-bk-20191024/sysctl.out -/tmp/conf-bk-20191024/hosts.out -/tmp/conf-bk-20191024/passwd.out -/tmp/conf-bk-20191024/fdisk.out -``` - -Once you run the above script, use the ls command to check the copied tar archive file. - -``` -# ls -ltrh /home/daygeek/backup/*.tar - --rw-r--r-- 1 daygeek daygeek 30K Oct 25 11:01 /home/daygeek/backup/CentOS6.2daygeek.com-20191024.tar -``` - -If it is moved successfully, you can find the contents of it without extracting it using the following tar command. - -``` -# tar -tvf /home/daygeek/backup/CentOS6.2daygeek.com-20191024.tar - -drwxr-xr-x root/root 0 2019-10-25 11:00 tmp/conf-bk-20191024/ --rw-r--r-- root/root 96 2019-10-25 11:00 tmp/conf-bk-20191024/pvs.out --rw-r--r-- root/root 92 2019-10-25 11:00 tmp/conf-bk-20191024/vgs.out --rw-r--r-- root/root 413 2019-10-25 11:00 tmp/conf-bk-20191024/ip.out --rw-r--r-- root/root 361 2019-10-25 11:00 tmp/conf-bk-20191024/netstat-in.out --rw-r--r-- root/root 785 2019-10-25 11:00 tmp/conf-bk-20191024/fstab.out --rw-r--r-- root/root 1375 2019-10-25 11:00 tmp/conf-bk-20191024/ifconfig-a.out --rw-r--r-- root/root 21 2019-10-25 11:00 tmp/conf-bk-20191024/hostname.out --rw-r--r-- root/root 457 2019-10-25 11:00 tmp/conf-bk-20191024/crontab.out --rw-r--r-- root/root 337 2019-10-25 11:00 tmp/conf-bk-20191024/netstat-rn.out --rw-r--r-- root/root 62 2019-10-25 11:00 tmp/conf-bk-20191024/uptime.out --rw-r--r-- root/root 116 2019-10-25 11:00 tmp/conf-bk-20191024/uname.out --rw-r--r-- root/root 210 2019-10-25 11:00 tmp/conf-bk-20191024/mapper.out --rw-r--r-- root/root 276 2019-10-25 11:00 tmp/conf-bk-20191024/lvs.out --rw-r--r-- root/root 0 2019-10-25 11:00 tmp/conf-bk-20191024/exports.out --rw-r--r-- root/root 236 2019-10-25 11:00 tmp/conf-bk-20191024/df-h.out --rw-r--r-- root/root 1057 2019-10-25 11:00 tmp/conf-bk-20191024/sysctl.out --rw-r--r-- root/root 115 2019-10-25 11:00 tmp/conf-bk-20191024/hosts.out --rw-r--r-- root/root 2194 2019-10-25 11:00 tmp/conf-bk-20191024/passwd.out --rw-r--r-- root/root 1089 2019-10-25 11:00 tmp/conf-bk-20191024/fdisk.out -``` - -### 2) Bash Script to Backup Configuration files on Remote Server - -There are two scripts added in this example, which do the same as the above script, but this can be very useful if you have a JUMP server in your environment. - -This script allows you to copy important configuration files from your client system into the JUMP box - -For example, since we have already set up a password-less login, you have ten clients that can be accessed from the JUMP server. If so, use this script. - -This is a real bash script that takes backup of configuration files on the remote server. - -``` -# vi /home/daygeek/shell-script/config-file-1.sh - -#!/bin/bash -mkdir /tmp/conf-bk-$(date +%Y%m%d) -cd /tmp/conf-bk-$(date +%Y%m%d) - -For General Configuration Files -hostname > hostname.out -uname -a > uname.out -uptime > uptime.out -cat /etc/hosts > hosts.out -/bin/df -h>df-h.out -pvs > pvs.out -vgs > vgs.out -lvs > lvs.out -/bin/ls -ltr /dev/mapper>mapper.out -fdisk -l > fdisk.out -cat /etc/fstab > fstab.out -cat /etc/exports > exports.out -cat /etc/crontab > crontab.out -cat /etc/passwd > passwd.out -ip link show > ip.out -/bin/netstat -in>netstat-in.out -/bin/netstat -rn>netstat-rn.out -/sbin/ifconfig -a>ifconfig-a.out -cat /etc/sysctl.conf > sysctl.out -sleep 10s - -#For Physical Server -vserver=$(lscpu | grep vendor | wc -l) -if [ $vserver -gt 0 ] -then -echo "$(hostname) is a VM" -else -systool -c fc_host -v | egrep "(Class Device path | port_name |port_state)" > systool.out -fi -sleep 10s - -#For Oracle DB Servers -if id oracle >/dev/null 2>&1; then -/usr/sbin/oracleasm listdisks>asm.out -/sbin/multipath -ll > mpath.out -/bin/ps -ef|grep pmon > pmon.out -else -echo "oracle user does not exist on server" -fi -sleep 10s - -#Create a tar archieve -tar -cvf /tmp/$(hostname)-date +%Y%m%d.tar /tmp/conf-bk-$(date +%Y%m%d) -sleep 10s - -#Remove the backup config folder -cd .. -rm -Rf conf-bk-$(date +%Y%m%d) -rm config-file.sh -exit -``` - -This is a sub-script that pushes the above script to the target server. - -``` -# vi /home/daygeek/shell-script/conf-remote-1.sh - -#!/bin/bash -echo -e "Enter the Remote Server Name: \c" -read server -scp /home/daygeek/shell-script/config-file-1.sh $server:/tmp/ -ssh [email protected]${server} sh /home/daygeek/shell-script/config-file-1.sh -sleep 10s -echo -e "Re-Enter the Remote Server Name: \c" -read server -scp $server:/tmp/$server-date +%Y%m%d.tar /home/daygeek/backup/ -exit -``` - -Finally run the bash script to achieve this. - -``` -# sh /home/daygeek/shell-script/conf-remote-1.sh - -Enter the Remote Server Name: CentOS6.2daygeek.com -config-file.sh 100% 1446 647.8KB/s 00:00 -CentOS6.2daygeek.com is a VM -oracle user does not exist on server -tar: Removing leading `/' from member names -/tmp/conf-bk-20191025/ -/tmp/conf-bk-20191025/pvs.out -/tmp/conf-bk-20191025/vgs.out -/tmp/conf-bk-20191025/ip.out -/tmp/conf-bk-20191025/netstat-in.out -/tmp/conf-bk-20191025/fstab.out -/tmp/conf-bk-20191025/ifconfig-a.out -/tmp/conf-bk-20191025/hostname.out -/tmp/conf-bk-20191025/crontab.out -/tmp/conf-bk-20191025/netstat-rn.out -/tmp/conf-bk-20191025/uptime.out -/tmp/conf-bk-20191025/uname.out -/tmp/conf-bk-20191025/mapper.out -/tmp/conf-bk-20191025/lvs.out -/tmp/conf-bk-20191025/exports.out -/tmp/conf-bk-20191025/df-h.out -/tmp/conf-bk-20191025/sysctl.out -/tmp/conf-bk-20191025/hosts.out -/tmp/conf-bk-20191025/passwd.out -/tmp/conf-bk-20191025/fdisk.out -Enter the Server Name Once Again: CentOS6.2daygeek.com -CentOS6.2daygeek.com-20191025.tar -``` - -Once you run the above script, use the ls command to check the copied tar archive file. - -``` -# ls -ltrh /home/daygeek/backup/*.tar - --rw-r--r-- 1 daygeek daygeek 30K Oct 25 11:44 /home/daygeek/backup/CentOS6.2daygeek.com-20191025.tar -``` - -If it is moved successfully, you can find the contents of it without extracting it using the following tar command. - -``` -# tar -tvf /home/daygeek/backup/CentOS6.2daygeek.com-20191025.tar - -drwxr-xr-x root/root 0 2019-10-25 11:43 tmp/conf-bk-20191025/ --rw-r--r-- root/root 96 2019-10-25 11:43 tmp/conf-bk-20191025/pvs.out --rw-r--r-- root/root 92 2019-10-25 11:43 tmp/conf-bk-20191025/vgs.out --rw-r--r-- root/root 413 2019-10-25 11:43 tmp/conf-bk-20191025/ip.out --rw-r--r-- root/root 361 2019-10-25 11:43 tmp/conf-bk-20191025/netstat-in.out --rw-r--r-- root/root 785 2019-10-25 11:43 tmp/conf-bk-20191025/fstab.out --rw-r--r-- root/root 1375 2019-10-25 11:43 tmp/conf-bk-20191025/ifconfig-a.out --rw-r--r-- root/root 21 2019-10-25 11:43 tmp/conf-bk-20191025/hostname.out --rw-r--r-- root/root 457 2019-10-25 11:43 tmp/conf-bk-20191025/crontab.out --rw-r--r-- root/root 337 2019-10-25 11:43 tmp/conf-bk-20191025/netstat-rn.out --rw-r--r-- root/root 61 2019-10-25 11:43 tmp/conf-bk-20191025/uptime.out --rw-r--r-- root/root 116 2019-10-25 11:43 tmp/conf-bk-20191025/uname.out --rw-r--r-- root/root 210 2019-10-25 11:43 tmp/conf-bk-20191025/mapper.out --rw-r--r-- root/root 276 2019-10-25 11:43 tmp/conf-bk-20191025/lvs.out --rw-r--r-- root/root 0 2019-10-25 11:43 tmp/conf-bk-20191025/exports.out --rw-r--r-- root/root 236 2019-10-25 11:43 tmp/conf-bk-20191025/df-h.out --rw-r--r-- root/root 1057 2019-10-25 11:43 tmp/conf-bk-20191025/sysctl.out --rw-r--r-- root/root 115 2019-10-25 11:43 tmp/conf-bk-20191025/hosts.out --rw-r--r-- root/root 2194 2019-10-25 11:43 tmp/conf-bk-20191025/passwd.out --rw-r--r-- root/root 1089 2019-10-25 11:43 tmp/conf-bk-20191025/fdisk.out -``` - -### 3) Bash Script to Backup Configuration files on Multiple Linux Remote Systems - -This script allows you to copy important configuration files from multiple remote Linux systems into the JUMP box at the same time. - -This is a real bash script that takes backup of configuration files on the remote server. - -``` -# vi /home/daygeek/shell-script/config-file-2.sh - -#!/bin/bash -mkdir /tmp/conf-bk-$(date +%Y%m%d) -cd /tmp/conf-bk-$(date +%Y%m%d) - -For General Configuration Files -hostname > hostname.out -uname -a > uname.out -uptime > uptime.out -cat /etc/hosts > hosts.out -/bin/df -h>df-h.out -pvs > pvs.out -vgs > vgs.out -lvs > lvs.out -/bin/ls -ltr /dev/mapper>mapper.out -fdisk -l > fdisk.out -cat /etc/fstab > fstab.out -cat /etc/exports > exports.out -cat /etc/crontab > crontab.out -cat /etc/passwd > passwd.out -ip link show > ip.out -/bin/netstat -in>netstat-in.out -/bin/netstat -rn>netstat-rn.out -/sbin/ifconfig -a>ifconfig-a.out -cat /etc/sysctl.conf > sysctl.out -sleep 10s - -#For Physical Server -vserver=$(lscpu | grep vendor | wc -l) -if [ $vserver -gt 0 ] -then -echo "$(hostname) is a VM" -else -systool -c fc_host -v | egrep "(Class Device path | port_name |port_state)" > systool.out -fi -sleep 10s - -#For Oracle DB Servers -if id oracle >/dev/null 2>&1; then -/usr/sbin/oracleasm listdisks>asm.out -/sbin/multipath -ll > mpath.out -/bin/ps -ef|grep pmon > pmon.out -else -echo "oracle user does not exist on server" -fi -sleep 10s - -#Create a tar archieve -tar -cvf /tmp/$(hostname)-date +%Y%m%d.tar /tmp/conf-bk-$(date +%Y%m%d) -sleep 10s - -#Remove the backup config folder -cd .. -rm -Rf conf-bk-$(date +%Y%m%d) -rm config-file.sh -exit -``` - -This is a sub-script that pushes the above script to the target servers. - -``` -# vi /home/daygeek/shell-script/conf-remote-2.sh - -#!/bin/bash -for server in CentOS6.2daygeek.com CentOS7.2daygeek.com -do -scp /home/daygeek/shell-script/config-file-2.sh $server:/tmp/ -ssh [email protected]${server} sh /tmp/config-file-2.sh -sleep 10s -scp $server:/tmp/$server-date +%Y%m%d.tar /home/daygeek/backup/ -done -exit -``` - -Finally run the bash script to achieve this. - -``` -# sh /home/daygeek/shell-script/conf-remote-2.sh - -config-file-1.sh 100% 1444 416.5KB/s 00:00 -CentOS6.2daygeek.com is a VM -oracle user does not exist on server -tar: Removing leading `/' from member names -/tmp/conf-bk-20191025/ -/tmp/conf-bk-20191025/pvs.out -/tmp/conf-bk-20191025/vgs.out -/tmp/conf-bk-20191025/ip.out -/tmp/conf-bk-20191025/netstat-in.out -/tmp/conf-bk-20191025/fstab.out -/tmp/conf-bk-20191025/ifconfig-a.out -/tmp/conf-bk-20191025/hostname.out -/tmp/conf-bk-20191025/crontab.out -/tmp/conf-bk-20191025/netstat-rn.out -/tmp/conf-bk-20191025/uptime.out -/tmp/conf-bk-20191025/uname.out -/tmp/conf-bk-20191025/mapper.out -/tmp/conf-bk-20191025/lvs.out -/tmp/conf-bk-20191025/exports.out -/tmp/conf-bk-20191025/df-h.out -/tmp/conf-bk-20191025/sysctl.out -/tmp/conf-bk-20191025/hosts.out -/tmp/conf-bk-20191025/passwd.out -/tmp/conf-bk-20191025/fdisk.out -CentOS6.2daygeek.com-20191025.tar -config-file-1.sh 100% 1444 386.2KB/s 00:00 -CentOS7.2daygeek.com is a VM -oracle user does not exist on server -/tmp/conf-bk-20191025/ -/tmp/conf-bk-20191025/hostname.out -/tmp/conf-bk-20191025/uname.out -/tmp/conf-bk-20191025/uptime.out -/tmp/conf-bk-20191025/hosts.out -/tmp/conf-bk-20191025/df-h.out -/tmp/conf-bk-20191025/pvs.out -/tmp/conf-bk-20191025/vgs.out -/tmp/conf-bk-20191025/lvs.out -/tmp/conf-bk-20191025/mapper.out -/tmp/conf-bk-20191025/fdisk.out -/tmp/conf-bk-20191025/fstab.out -/tmp/conf-bk-20191025/exports.out -/tmp/conf-bk-20191025/crontab.out -/tmp/conf-bk-20191025/passwd.out -/tmp/conf-bk-20191025/ip.out -/tmp/conf-bk-20191025/netstat-in.out -/tmp/conf-bk-20191025/netstat-rn.out -/tmp/conf-bk-20191025/ifconfig-a.out -/tmp/conf-bk-20191025/sysctl.out -tar: Removing leading `/' from member names -CentOS7.2daygeek.com-20191025.tar -``` - -Once you run the above script, use the ls command to check the copied tar archive file. - -``` -# ls -ltrh /home/daygeek/backup/*.tar - --rw-r--r-- 1 daygeek daygeek 30K Oct 25 12:37 /home/daygeek/backup/CentOS6.2daygeek.com-20191025.tar --rw-r--r-- 1 daygeek daygeek 30K Oct 25 12:38 /home/daygeek/backup/CentOS7.2daygeek.com-20191025.tar -``` - -If it is moved successfully, you can find the contents of it without extracting it using the following tar command. - -``` -# tar -tvf /home/daygeek/backup/CentOS7.2daygeek.com-20191025.tar - -drwxr-xr-x root/root 0 2019-10-25 12:23 tmp/conf-bk-20191025/ --rw-r--r-- root/root 21 2019-10-25 12:23 tmp/conf-bk-20191025/hostname.out --rw-r--r-- root/root 115 2019-10-25 12:23 tmp/conf-bk-20191025/uname.out --rw-r--r-- root/root 62 2019-10-25 12:23 tmp/conf-bk-20191025/uptime.out --rw-r--r-- root/root 228 2019-10-25 12:23 tmp/conf-bk-20191025/hosts.out --rw-r--r-- root/root 501 2019-10-25 12:23 tmp/conf-bk-20191025/df-h.out --rw-r--r-- root/root 88 2019-10-25 12:23 tmp/conf-bk-20191025/pvs.out --rw-r--r-- root/root 84 2019-10-25 12:23 tmp/conf-bk-20191025/vgs.out --rw-r--r-- root/root 252 2019-10-25 12:23 tmp/conf-bk-20191025/lvs.out --rw-r--r-- root/root 197 2019-10-25 12:23 tmp/conf-bk-20191025/mapper.out --rw-r--r-- root/root 1088 2019-10-25 12:23 tmp/conf-bk-20191025/fdisk.out --rw-r--r-- root/root 465 2019-10-25 12:23 tmp/conf-bk-20191025/fstab.out --rw-r--r-- root/root 0 2019-10-25 12:23 tmp/conf-bk-20191025/exports.out --rw-r--r-- root/root 451 2019-10-25 12:23 tmp/conf-bk-20191025/crontab.out --rw-r--r-- root/root 2748 2019-10-25 12:23 tmp/conf-bk-20191025/passwd.out --rw-r--r-- root/root 861 2019-10-25 12:23 tmp/conf-bk-20191025/ip.out --rw-r--r-- root/root 455 2019-10-25 12:23 tmp/conf-bk-20191025/netstat-in.out --rw-r--r-- root/root 505 2019-10-25 12:23 tmp/conf-bk-20191025/netstat-rn.out --rw-r--r-- root/root 2072 2019-10-25 12:23 tmp/conf-bk-20191025/ifconfig-a.out --rw-r--r-- root/root 449 2019-10-25 12:23 tmp/conf-bk-20191025/sysctl.out -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/linux-bash-script-backup-configuration-files-remote-linux-system-server/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/category/bash-script/ -[2]: https://www.2daygeek.com/category/shell-script/ diff --git a/sources/tech/20191028 Enterprise JavaBeans, infrastructure predictions, and more industry trends.md b/sources/tech/20191028 Enterprise JavaBeans, infrastructure predictions, and more industry trends.md deleted file mode 100644 index e915fe74d9..0000000000 --- a/sources/tech/20191028 Enterprise JavaBeans, infrastructure predictions, and more industry trends.md +++ /dev/null @@ -1,69 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Enterprise JavaBeans, infrastructure predictions, and more industry trends) -[#]: via: (https://opensource.com/article/19/10/enterprise-javabeans-and-more-industry-trends) -[#]: author: (Tim Hildred https://opensource.com/users/thildred) - -Enterprise JavaBeans, infrastructure predictions, and more industry trends -====== -A weekly look at open source community and industry trends. -![Person standing in front of a giant computer screen with numbers, data][1] - -As part of my role as a senior product marketing manager at an enterprise software company with an open source development model, I publish a regular update about open source community, market, and industry trends for product marketers, managers, and other influencers. Here are five of my and their favorite articles from that update. - -## [Gartner: 10 infrastructure trends you need to know][2] - -> Corporate network infrastructure is only going to get more involved  over the next two to three years as automation, network challenges, and hybrid cloud become more integral to the enterprise. - -**The impact:** The theme running through all these predictions is the impact of increased complexity. As consumers of technology, we expect things to get easier and easier. As producers of technology, we know what's going on behind the curtains to make that simplicity possible is its opposite. - -## [Jakarta EE: What's in store for Enterprise JavaBeans?][3] - -> [Enterprise JavaBeans (EJB)][4] has been very important to the Java EE ecosystem and promoted many robust solutions to enterprise problems. Besides that, in the past when integration techniques were not so advanced, EJB did great work with remote EJB, integrating many Java EE applications. However, remote EJB is not necessary anymore, and we have many techniques and tools that are better for doing that. So, does EJB still have a place in this new cloud-native world? - -**The impact:** This offers some insights into how programming languages and frameworks evolve and change over time. Respond to changes in developer affinity by identifying the good stuff in a language and getting it landed somewhere else. Ideally that "somewhere else" should be an open standard so that no single vendor gets to control your technology destiny. - -## [From virtualization to containerization][5] - -> Before the telecom industry has got to grips with "step one" virtualization, many industry leaders are already moving on to the next level—containerization. This is a key part of making network software cloud-native i.e. designed, developed, and optimized to exploit cloud technology such as distributed processing and data stores. - -**The impact:** There are certain industries that make big technology decisions on long time horizons; I can only imagine the FOMO that the fast-moving world of infrastructure technology could cause when you've picked something and it starts to look a bit crufty next to the new hotness. - -## [How do you rollback deployments in Kubernetes?][6] - -> There are several strategies when it comes to deploying apps into production. In Kubernetes, rolling updates are the default strategy to update the running version of your app. The rolling update cycles previous Pod out and bring newer Pod in incrementally. - -**The impact:** What is the cloud-native distributed equivalent to **ctrl+z**? And aren't you glad there is one? - -## [What's a Trusted Compute Base?][7] - -> A few months ago, in an article called [Turtles—and chains of trust][8], I briefly mentioned Trusted Compute Bases, or TCBs, but then didn’t go any deeper.  I had a bit of a search across the articles on this blog, and realised that I’ve never gone into this topic in much detail, which feels like a mistake, so I’m going to do it now. - -**The impact:** The issue of to what extent you can trust the computer systems that power your whole life is only going to become more prevalent and more vexing. That turns out to be a great argument for open source from the bottom turtle (hardware) all the way up. - -_I hope you enjoyed this list of what stood out to me from last week and come back next Monday for more open source community, market, and industry trends._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/enterprise-javabeans-and-more-industry-trends - -作者:[Tim Hildred][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/thildred -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data) -[2]: https://www.networkworld.com/article/3447397/gartner-10-infrastructure-trends-you-need-to-know.html -[3]: https://developers.redhat.com/blog/2019/10/22/jakarta-ee-whats-in-store-for-enterprise-javabeans/ -[4]: https://docs.oracle.com/cd/E13222_01/wls/docs100/ejb/deploy.html -[5]: https://www.lightreading.com/nfv/from-virtualization-to-containerization/a/d-id/755016 -[6]: https://learnk8s.io/kubernetes-rollbacks/ -[7]: https://aliceevebob.com/2019/10/22/whats-a-trusted-compute-base/ -[8]: https://aliceevebob.com/2019/07/02/turtles-and-chains-of-trust/ diff --git a/sources/tech/20191029 Demystifying namespaces and containers in Linux.md b/sources/tech/20191029 Demystifying namespaces and containers in Linux.md deleted file mode 100644 index 80b505bfd0..0000000000 --- a/sources/tech/20191029 Demystifying namespaces and containers in Linux.md +++ /dev/null @@ -1,146 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Demystifying namespaces and containers in Linux) -[#]: via: (https://opensource.com/article/19/10/namespaces-and-containers-linux) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Demystifying namespaces and containers in Linux -====== -Peek behind the curtains to understand the backend of Linux container -technology. -![cubes coming together to create a larger cube][1] - -Containers have taken the world by storm. Whether you think of Kubernetes, Docker, CoreOS, Silverblue, or Flatpak when you hear the term, it's clear that modern applications are running in containers for convenience, security, and scalability. - -Containers can be confusing to understand, though. What does it mean to run in a container? How can processes in a container interact with the rest of the computer they're running on? Open source dislikes mystery, so this article explains the backend of container technology, just as [my article on Flatpak][2] explained a common frontend. - -### Namespaces - -Namespaces are common in the programming world. If you dwell in the highly technical places of the computer world, then you have probably seen code like this: - - -``` -`using namespace std;` -``` - -Or you may have seen this in XML: - - -``` -`` -``` - -These kinds of phrases provide context for commands used later in a source code file. The only reason C++ knows, for instance, what programmers mean when they type **cout** is because C++ knows the **cout** namespace is a meaningful word. - -If that's too technical for you to picture, you may be surprised to learn that we all use namespaces every day in real life, too. We don't call them namespaces, but we use the concept all the time. For instance, the phrase "I'm a fan of the Enterprise" has one meaning in an IT company that serves large businesses (which are commonly called "enterprises"), but it may have a different meaning at a science fiction convention. The question "what engine is it running?" has one meaning in a garage and a different meaning in web development. We don't always declare a namespace in casual conversation because we're human, and our brains can adapt quickly to determine context, but for computers, the namespace must be declared explicitly. - -For containers, a namespace is what defines the boundaries of a process' "awareness" of what else is running around it. - -### lsns - -You may not realize it, but your Linux machine quietly maintains different namespaces specific to given processes. By using a recent version of the **util-linux** package, you can list existing namespaces on your machine: - - -``` -$ lsns -        NS TYPE   NPROCS   PID USER    COMMAND -4026531835 cgroup     85  1571 seth /usr/lib/systemd/systemd --user -4026531836 pid        85  1571 seth /usr/lib/systemd/systemd --user -4026531837 user       80  1571 seth /usr/lib/systemd/systemd --user -4026532601 user        1  6266 seth /usr/lib64/firefox/firefox [...] -4026532928 net         1  7164 seth /usr/lib64/firefox/firefox [...] -[...] -``` - -If your version of **util-linux** doesn't provide the **lsns** command, you can see namespace entries in **/proc**: - - -``` -$ ls /proc/*/ns -1571 -6266 -7164 -[...] -$ ls /proc/6266/ns -ipc net pid user uts [...] -``` - -Each process running on your Linux machine is enumerated with a process ID (PID). Each PID is assigned a namespace. PIDs in the same namespace can have access to one another because they are programmed to operate within a given namespace. PIDs in different namespaces are unable to interact with one another by default because they are running in a different context, or _namespace_. This is why a process running in a "container" under one namespace cannot access information outside its container or information running inside a different container. - -### Creating a new namespace - -A usual feature of software dealing with containers is automatic namespace management. A human administrator starting up a new containerized application or environment doesn't have to use **lsns** to check which namespaces exist and then create a new one manually; the software using PID namespaces does that automatically with the help of the Linux kernel. However, you can mimic the process manually to gain a better understanding of what's happening behind the scenes. - -First, you need to identify a process that is _not_ running on your computer. For this example, I'll use the Z shell ([Zsh][3]) because I'm running the Bash shell on my machine. If you're running Zsh on your computer, then use **Bash** or **tcsh** or some other shell that you're not currently running. The goal is to find something that you can prove is not running. You can prove something is not running with the **pidof** command, which queries your system to discover the PID of any application you name: - - -``` -$ pidof zsh -$ sudo pidof zsh -``` - -As long as no PID is returned, the application you have queried is not running. - -#### Unshare - -The **unshare** command runs a program in a namespace _unshared_ from its parent process. There are many kinds of namespaces available, so read the **unshare** man page for all options available. - -To create a new namespace for your test command: - - -``` -$ sudo unshare --fork --pid --mount-proc zsh -% -``` - -Because Zsh is an interactive shell, it conveniently brings you into its namespace upon launch. Not all processes do that, because some processes run in the background, leaving you at a prompt in its native namespace. As long as you remain in the Zsh session, you can see that you have left the usual namespace by looking at the PID of your new forked process: - - -``` -% pidof zsh -pid 1 -``` - -If you know anything about Linux process IDs, then you know that PID 1 is always reserved, mostly by nature of the boot process, for the initialization application (systemd on most distributions outside of Slackware, Devuan, and maybe some customized installations of Arch). It's next to impossible for Zsh, or any application that isn't a boot initialization application, to be PID 1 (because without an init system, a computer wouldn't know how to boot up). Yet, as far as your shell knows in this demonstration, Zsh occupies the PID 1 slot. - -Despite what your shell is now telling you, PID 1 on your system has _not_ been replaced. Open a second terminal or terminal tab on your computer and look at PID 1: - - -``` -$ ps 1 -init -``` - -And then find the PID of Zsh: - - -``` -$ pidof zsh -7723 -``` - -As you can see, your "host" system sees the big picture and understands that Zsh is actually running as some high-numbered PID (it probably won't be 7723 on your computer, except by coincidence). Zsh sees itself as PID 1 only because its scope is confined to (or _contained_ within) its namespace. Once you have forked a process into its own namespace, its children processes are numbered starting from 1, but only within that namespace. - -Namespaces, along with other technologies like **cgroups** and more, form the foundation of containerization. Understanding that namespaces exist within the context of the wider namespace of a host environment (in this demonstration, that's your computer, but in the real world the host is typically a server or a hybrid cloud) can help you understand how and why containerized applications act the way they do. For instance, a container running a Wordpress blog doesn't "know" it's not running in a container; it knows that it has access to a kernel and some RAM and whatever configuration files you've provided it, but it probably can't access your home directory or any directory you haven't specifically given it permission to access. Furthermore, a runaway process within that blog software can't affect any other process on your system, because as far as it knows, the PID "tree" only goes back to 1, and 1 is the container it's running in. - -Containers are a powerful Linux feature, and they're getting more popular every day. Now that you understand how they work, try exploring container technology such as Kubernetes, Silverblue, or Flatpak, and see what you can do with containerized apps. Containers are Linux, so start them up, inspect them carefully, and learn as you go. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/namespaces-and-containers-linux - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/cube_innovation_process_block_container.png?itok=vkPYmSRQ (cubes coming together to create a larger cube) -[2]: https://opensource.com/article/19/10/how-build-flatpak-packaging -[3]: https://opensource.com/article/19/9/getting-started-zsh diff --git a/sources/tech/20191030 Test automation without assertions for web development.md b/sources/tech/20191030 Test automation without assertions for web development.md deleted file mode 100644 index 7940402936..0000000000 --- a/sources/tech/20191030 Test automation without assertions for web development.md +++ /dev/null @@ -1,163 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Test automation without assertions for web development) -[#]: via: (https://opensource.com/article/19/10/test-automation-without-assertions) -[#]: author: (Jeremias Roessler https://opensource.com/users/roesslerj) - -Test automation without assertions for web development -====== -Recheck-web promises the benefits of golden master-based testing without -the drawbacks. -![Coding on a computer][1] - -Graphical user interface (GUI) test automation is broken. Regression testing is not testing; it's version control for a software's behavior. Here's my assertion: test automation _without_ _assertions_ works better! - -In software development and test automation, an assertion is a means to check the result of a calculation, typically by comparing it to a singular expected value. While this is very well suited for unit-based test automation (i.e. testing the system from within), applying it to testing an interface (specifically the user interface) has proven to be problematic, as this post will explain. - -The number of tools that work according to the [golden master][2] approach to testing, characterization testing, and approval testing—such as [Approval Tests][3], [Jest][4], or [recheck-web][5] ([retest][6])—is constantly increasing. This approach promises more robust tests with less effort (for both creation and maintenance) while testing more thoroughly. - -The examples in this article are available on [GitHub][7]. - -### A basic Selenium test - -Here's a simple example of a traditional test running against a web application's login page. Using [Selenium][8] as the testing framework, the code could look like this: - - -``` -public class MySeleniumTest { - -        RemoteWebDriver driver; - -        @Before -        public void setup() { -                driver =  new ChromeDriver(); -        } - -        @Test -        public void login() throws Exception { -                driver.get(""); - -                driver.findElement(By.id("username")).sendKeys("Simon"); -                driver.findElement(By.id("password")).sendKeys("secret"); -                driver.findElement(By.id("sign-in")).click(); - -                assertEquals(driver.findElement(By.tagName("h4")).getText(), "Success!"); -        } - -        @After -        public void tearDown() throws InterruptedException { -                driver.quit(); -        } -} -``` - -This is a very simple test. It opens a specific URL, then finds input fields by their invisible element IDs. It enters the user name and password, then clicks the login button. - -As is currently best practice, this test then uses a unit-test library to check the correct outcome by means of an _assert_ statement. - -In this example, the test determines whether the text "Success!" is displayed. - -You can run the test a few times to verify success, but it's important to experience failure, as well. To create an error, change the HTML of the website being tested. You could, for instance, edit the CSS declaration: - - -``` -`` -``` - -Changing or removing as much as a single character of the URL (e.g. change "main" to "min") changes the website to display as raw HTML without a layout. - -![Website login form displayed as raw HTML][9] - -This small change is definitely an error. However, when the test is executed, it shows no problem and still passes. To outright ignore such a blatant error clearly is not what you would expect of your tests. They should guard against you involuntarily breaking your website after all. - -Now instead, change or remove the element IDs of the input fields. Since these IDs are invisible, this change doesn't have any impact on the website from a user's perspective. But when the test executes, it fails with a **NoSuchElementException**. This essentially means that this irrelevant change _broke the test_. Tests that ignore major changes but fail on invisible and hence irrelevant ones are the current standard in test automation. This is basically the _opposite_ of how a test should behave. - -Now, take the original test and wrap the driver in a RecheckDriver: - - -``` -`driver = new RecheckDriver( new ChromeDriver() );` -``` - -Then either replace the assertion with a call to **driver.capTest();** at the end of the test or add a Junit 5 rule: **@ExtendWith(RecheckExtension.class)**. If you remove the CSS from the website, the test fails, as it should: - -![Failed test][10] - -But if you change or remove the element IDs instead, the test still passes. - -This surprising ability, coming from the "unbreakable" feature of recheck-web, is explained in detail below. This is how a test should behave: detect changes important to the user, and do not break on changes that are irrelevant to the user. - -### How it works - -The [recheck-web][5] project is a free, open source tool that operates on top of Selenium. It is golden master-based, which essentially means that it creates a copy of the rendered website the first time the test is executed, and subsequent runs of the test compare the current state against that copy (the golden master). This is how it can detect that the website has changed in unfavorable ways. It is also how it can still identify an element after its ID has changed: It simply peeks into the golden master (where the ID is still present) and finds the element there. Using additional properties like XPath, HTML name, and CSS classes, recheck-web identifies the element on the changed website and returns it to Selenium. The test can then interact with the element, just as before, and report the change. - -![recheck-web's process][11] - -#### Problems with golden master testing - -Golden master testing, in general, has two essential drawbacks: - - 1. It is often difficult to ignore irrelevant changes. Many changes are not problematic (e.g., date and time changes, random IDs, etc.). For the same reason that Git features the **.gitignore** file, recheck-web features the **recheck.ignore** file. And its Git-like syntax makes it easy to specify which differences to ignore. - 2. It is often cumbersome to maintain redundancy. Golden masters usually have quite an overlap. Often, the same change has to be approved multiple times, nullifying the efficiency gained during the fast test creation. For that, recheck comes complete with its own [command-line interface (CLI)][12] that takes care of this annoying task. The CLI (and the [commercial GUI][13]) lets users easily apply the same change to the same element in all instances or simply apply or ignore all changes at once. - - - -The example above illustrates both drawbacks and their respective solutions: the changed ID was detected, but not reported because the ID attribute in the **recheck.ignore** file was specified to be ignored with **attribute=id**. Removing that rule makes the test fail, but it does not _break_ (the test still executes and reports the changed ID). - -The example test uses the implicit checking mechanism, which automatically checks the result after every action. (Note that if you prefer to do explicit checking (e.g. by calling **re.check**) this is entirely possible.) Opening the URL, entering the user name, and entering the password are three actions that are being performed on the same page, therefore three golden masters are created for the same page. The changed ID thus is reported three times. All three instances can be treated with a single call to **recheck commit --all tests.report** on the command line. Applying the change makes the recheck-web test fail because the ID is removed from the golden master. This calls for anther neat feature of recheck-web: the **retestId**. - -### Virtual constant IDs - -The basic idea of the **retestId** is to introduce an additional attribute in the copy of the website. Since this attribute lives only in the website copy, not on the live site, it can never be affected by a change (unless the element is completely removed). This is called a _virtual constant ID_. - -Now, this **retestId** can be referred to in the test. Simply replace the call to, for instance, **By._id_("username")** with **By._retestId_("username")**, and this problem is solved for good. This also addresses instances where elements are hard to reference because they have no ID to begin with. - -### Filter mechanism - -What would Git be without the **.gitignore** file? Filtering out irrelevant changes is one of the most important features of a version-control system. Traditional assertion-based testing ignores more than 99% of the changes. Instead, similar to Git without a **.gitignore** file, recheck-web reports any and all changes. - -It's up to the user to ignore changes that aren't of interest. Recheck-web can be used for cross-browser testing, cross-device testing, deep visual regression testing, and functional regression testing, depending on what you do or do not ignore. - -The filtering mechanism is as simple (based on the **.gitignore** file) as it is powerful. Single attributes can be filtered globally or for certain elements. Single elements—or even whole parts of the page—can be ignored. If this is not powerful enough, you can implement filter rules in JavaScript to, for example, ignore different URLs with the same base or position differences of less than five pixels. - -A good starting point for understanding this is the [predefined filter files][14] that are distributed with recheck-web. Ignoring element positioning is usually a good idea. If you want to learn more about how to maintain your **recheck.ignore** file or create your own filters, see the [documentation][15]. - -### Summary - -Recheck-web is one of the few golden master-based testing tools available; alternatives include Approval Tests and Jest. - -Recheck-web provides the ability to quickly and easily create tests that are more complete and robust than traditional tests. Because it compares rendered websites (or parts of them) with each other, cross-browser testing, cross-platform testing, and other test scenarios can be realized. Also, this kind of testing is an "enabler" technology that will enable artificial intelligence to generate additional tests. - -Recheck-web is free and open source, so please [try it out][5]. The company's business model is to offer additional services (e.g., storing golden masters and reports as well as an AI to generate tests) and to have a commercial GUI on top of the CLI for maintaining the golden masters. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/test-automation-without-assertions - -作者:[Jeremias Roessler][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/roesslerj -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) -[2]: https://opensource.com/article/19/7/what-golden-image -[3]: https://approvaltests.com -[4]: https://jestjs.io/ -[5]: https://github.com/retest/recheck-web -[6]: http://retest.de -[7]: https://github.com/retest/recheck-web-example -[8]: https://www.seleniumhq.org/ -[9]: https://opensource.com/sites/default/files/uploads/webformerror.png (Website login form displayed as raw HTML) -[10]: https://opensource.com/sites/default/files/uploads/testfails.png (Failed test) -[11]: https://opensource.com/sites/default/files/uploads/recheck-web-process.png (recheck-web's process) -[12]: https://github.com/retest/recheck.cli -[13]: https://retest.de/review/ -[14]: https://github.com/retest/recheck/tree/master/src/main/resources/filter/web -[15]: https://docs.retest.de/recheck/usage/filter diff --git a/sources/tech/20191031 4 Python tools for getting started with astronomy.md b/sources/tech/20191031 4 Python tools for getting started with astronomy.md deleted file mode 100644 index 79e64651b3..0000000000 --- a/sources/tech/20191031 4 Python tools for getting started with astronomy.md +++ /dev/null @@ -1,69 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: 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 tools for getting started with astronomy -====== -Explore the universe with NumPy, SciPy, Scikit-Image, and Astropy. -![Person looking up at the stars][1] - -NumFOCUS is a nonprofit charity that supports amazing open source toolkits for scientific computing and data science. As part of the effort to connect Opensource.com readers with the NumFOCUS community, we are republishing some of the most popular articles from [our blog][2]. To learn more about our mission and programs, please visit [numfocus.org][3]. If you're interested in participating in the NumFOCUS community in person, check out a local [PyData event][4] happening near you. - -* * * - -### Astronomy with Python - -Python is a great language for science, and specifically for astronomy. The various packages such as [NumPy][5], [SciPy][6], [Scikit-Image][7] and [Astropy][8] (to name but a few) are all a great testament to the suitability of Python for astronomy, and there are plenty of use cases. [NumPy, Astropy, and SciPy are NumFOCUS fiscally sponsored projects; Scikit-Image is an affiliated project.] Since leaving the field of astronomical research behind more than 10 years ago to start a second career as software developer, I have always been interested in the evolution of these packages. Many of my former colleagues in astronomy used most if not all of these packages for their research work. I have since worked on implementing professional astronomy software packages for instruments for the Very Large Telescope (VLT) in Chile, for example. - -It struck me recently that the Python packages have evolved to such an extent that it is now fairly easy for anyone to build [data reduction][9] scripts that can provide high-quality data products. Astronomical data is ubiquitous, and what is more, it is almost all publicly available—you just need to look for it. - -For example, ESO, which runs the VLT, offers the data for download on their site. Head over to [www.eso.org/UserPortal][10] and create a user name for their portal. If you look for data from the instrument SPHERE you can download a full dataset for any of the nearby stars that have exoplanet or proto-stellar discs. It is a fantastic and exciting project for any Pythonista to reduce that data and make the planets or discs that are deeply hidden in the noise visible. - -I encourage you to download the ESO or any other astronomy imaging dataset and go on that adventure. Here are a few tips: - - 1. Start off with a good dataset. Have a look at papers about nearby stars with discs or exoplanets and then search, for example: . Notice that some data on this site is marked as red and some as green. The red data is not publicly available yet — it will say under “release date” when it will be available. - 2. Read something about the instrument you are using the data from. Try and get a basic understanding of how the data is obtained and what the standard data reduction should look like. All telescopes and instruments have publicly available documents about this. - 3. You will need to consider the standard problems with astronomical data and correct for them: - 1. Data comes in FITS files. You will need **pyfits** or **astropy** (which contains pyfits) to read them into **NumPy** arrays. In some cases the data comes in a cube and you should to use **numpy.median **along the z-axis to turn them into 2-D arrays. For some SPHERE data you get two copies of the same piece of sky on the same image (each has a different filter) which you will need to extract using **indexing and slicing.** - 2. The master dark and bad pixel map. All instruments will have specific images taken as “dark frames” that contain images with the shutter closed (no light at all). Use these to extract a mask of bad pixels using **NumPy masked arrays** for this. This mask of bad pixels will be very important — you need to keep track of it as you process the data to get a clean combined image in the end. In some cases it also helps to subtract this master dark from all scientific raw images. - 3. Instruments will typically also have a master flat frame. This is an image or series of images taken with a flat uniform light source. You will need to divide all scientific raw images by this (again, using numpy masked array makes this an easy division operation). - 4. For planet imaging, the fundamental technique to make planets visible against a bright star rely on using a coronagraph and a technique known as angular differential imaging. To that end, you need to identify the optical centre on the images. This is one of the most tricky steps and requires finding some artificial helper images embedded in the images using **skimage.feature.blob_dog**. - 4. Be patient. It can take a while to understand the data format and how to handle it. Making some plots and histograms of the pixel data can help you to understand it. It is well worth it to be persistent! You will learn a lot about imaging data and processing. - - - -Using the tools offered by NumPy, SciPy, Astropy, scikit-image and more in combination, with some patience and persistence, it is possible to analyse the vast amount of available astronomical data to produce some stunning results. And who knows, maybe you will be the first one to find a planet that was previously overlooked! Good luck! - -_This article was originally published on the NumFOCUS blog and is republished with permission. It is based on [a talk][11] by [Ole Moeller-Nilsson][12], CTO at Pivigo. If you want to support NumFOCUS, you can donate [here][13] or find your local [PyData event][4] happening around the world._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/python-astronomy-open-data - -作者:[Gina Helfrich, Ph.D.][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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 diff --git a/sources/tech/20191031 Advance your awk skills with two easy tutorials.md b/sources/tech/20191031 Advance your awk skills with two easy tutorials.md deleted file mode 100644 index f84e4ebe3a..0000000000 --- a/sources/tech/20191031 Advance your awk skills with two easy tutorials.md +++ /dev/null @@ -1,287 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Advance your awk skills with two easy tutorials) -[#]: via: (https://opensource.com/article/19/10/advanced-awk) -[#]: author: (Dave Neary https://opensource.com/users/dneary) - -Advance your awk skills with two easy tutorials -====== -Go beyond one-line awk scripts with mail merge and word counting. -![a checklist for a team][1] - -Awk is one of the oldest tools in the Unix and Linux user's toolbox. Created in the 1970s by Alfred Aho, Peter Weinberger, and Brian Kernighan (the A, W, and K of the tool's name), awk was created for complex processing of text streams. It is a companion tool to sed, the stream editor, which is designed for line-by-line processing of text files. Awk allows more complex structured programs and is a complete programming language. - -This article will explain how to use awk for more structured and complex tasks, including a simple mail merge application. - -### Awk program structure - -An awk script is made up of functional blocks surrounded by **{}** (curly brackets). There are two special function blocks, **BEGIN** and **END**, that execute before processing the first line of the input stream and after the last line is processed. In between, blocks have the format: - - -``` -`pattern { action statements }` -``` - -Each block executes when the line in the input buffer matches the pattern. If no pattern is included, the function block executes on every line of the input stream. - -Also, the following syntax can be used to define functions in awk that can be called from any block: - - -``` -`function name(parameter list) { statements }` -``` - -This combination of pattern-matching blocks and functions allows the developer to structure awk programs for reuse and readability. - -### How awk processes text streams - -Awk reads text from its input file or stream one line at a time and uses a field separator to parse it into a number of fields. In awk terminology, the current buffer is a _record_. There are a number of special variables that affect how awk reads and processes a file: - - * **FS** (field separator): By default, this is any whitespace (spaces or tabs) - * **RS** (record separator): By default, a newline (**\n**) - * **NF** (number of fields): When awk parses a line, this variable is set to the number of fields that have been parsed - * **$0:** The current record - * **$1, $2, $3, etc.:** The first, second, third, etc. field from the current record - * **NR** (number of records): The number of records that have been parsed so far by the awk script - - - -There are many other variables that affect awk's behavior, but this is enough to start with. - -### Awk one-liners - -For a tool so powerful, it's interesting that most of awk's usage is basic one-liners. Perhaps the most common awk program prints selected fields from an input line from a CSV file, a log file, etc. For example, the following one-liner prints a list of usernames from **/etc/passwd**: - - -``` -`awk -F":" '{print $1 }' /etc/passwd` -``` - -As mentioned above, **$1** is the first field in the current record. The **-F** option sets the FS variable to the character **:**. - -The field separator can also be set in a BEGIN function block: - - -``` -`awk 'BEGIN { FS=":" } {print $1 }' /etc/passwd` -``` - -In the following example, every user whose shell is not **/sbin/nologin** can be printed by preceding the block with a pattern match: - - -``` -`awk 'BEGIN { FS=":" } ! /\/sbin\/nologin/ {print $1 }' /etc/passwd` -``` - -### Advanced awk: Mail merge - -Now that you have some of the basics, try delving deeper into awk with a more structured example: creating a mail merge. - -A mail merge uses two files, one (called in this example **email_template.txt**) containing a template for an email you want to send: - - -``` -From: Program committee <[pc@event.org][2]> -To: {firstname} {lastname} <{email}> -Subject: Your presentation proposal - -Dear {firstname}, - -Thank you for your presentation proposal: -  {title} - -We are pleased to inform you that your proposal has been successful! We -will contact you shortly with further information about the event -schedule. - -Thank you, -The Program Committee -``` - -And the other is a CSV file (called **proposals.csv**) with the people you want to send the email to: - - -``` -firstname,lastname,email,title -Harry,Potter,[hpotter@hogwarts.edu][3],"Defeating your nemesis in 3 easy steps" -Jack,Reacher,[reacher@covert.mil][4],"Hand-to-hand combat for beginners" -Mickey,Mouse,[mmouse@disney.com][5],"Surviving public speaking with a squeaky voice" -Santa,Claus,[sclaus@northpole.org][6],"Efficient list-making" -``` - -You want to read the CSV file, replace the relevant fields in the first file (skipping the first line), then write the result to a file called **acceptanceN.txt**, incrementing **N** for each line you parse. - -Write the awk program in a file called **mail_merge.awk**. Statements are separated by **;** in awk scripts. The first task is to set the field separator variable and a couple of other variables the script needs. You also need to read and discard the first line in the CSV, or a file will be created starting with _Dear firstname_. To do this, use the special function **getline** and reset the record counter to 0 after reading it. - - -``` -BEGIN { -  FS=","; -  template="email_template.txt"; -  output="acceptance"; -  getline; -  NR=0; -} -``` - -The main function is very straightforward: for each line processed, a variable is set for the various fields—**firstname**, **lastname**, **email**, and **title**. The template file is read line by line, and the function **sub** is used to substitute any occurrence of the special character sequences with the value of the relevant variable. Then the line, with any substitutions made, is output to the output file. - -Since you are dealing with the template file and a different output file for each line, you need to clean up and close the file handles for these files before processing the next record. - - -``` -{ -        # Read relevant fields from input file -        firstname=$1; -        lastname=$2; -        email=$3; -        title=$4; - -        # Set output filename -        outfile=(output NR ".txt"); - -        # Read a line from template, replace special fields, and -        # print result to output file -        while ( (getline ln < template) > 0 ) -        { -                sub(/{firstname}/,firstname,ln); -                sub(/{lastname}/,lastname,ln); -                sub(/{email}/,email,ln); -                sub(/{title}/,title,ln); -                print(ln) > outfile; -        } - -        # Close template and output file in advance of next record -        close(outfile); -        close(template); -} -``` - -You're done! Run the script on the command line with: - - -``` -`awk -f mail_merge.awk proposals.csv` -``` - -or - - -``` -`awk -f mail_merge.awk < proposals.csv` -``` - -and you will find text files generated in the current directory. - -### Advanced awk: Word frequency count - -One of the most powerful features in awk is the associative array. In most programming languages, array entries are typically indexed by a number, but in awk, arrays are referenced by a key string. You could store an entry from the file _proposals.txt_ from the previous section. For example, in a single associative array, like this: - - -``` -        proposer["firstname"]=$1; -        proposer["lastname"]=$2; -        proposer["email"]=$3; -        proposer["title"]=$4; -``` - -This makes text processing very easy. A simple program that uses this concept is the idea of a word frequency counter. You can parse a file, break out words (ignoring punctuation) in each line, increment the counter for each word in the line, then output the top 20 words that occur in the text. - -First, in a file called **wordcount.awk**, set the field separator to a regular expression that includes whitespace and punctuation: - - -``` -BEGIN { -        # ignore 1 or more consecutive occurrences of the characters -        # in the character group below -        FS="[ .,:;()<>{}@!\"'\t]+"; -} -``` - -Next, the main loop function will iterate over each field, ignoring any empty fields (which happens if there is punctuation at the end of a line), and increment the word count for the words in the line. - - -``` -{ -        for (i = 1; i <= NF; i++) { -                if ($i != "") { -                        words[$i]++; -                } -        } -} -``` - -Finally, after the text is processed, use the END function to print the contents of the array, then use awk's capability of piping output into a shell command to do a numerical sort and print the 20 most frequently occurring words: - - -``` -END { -        sort_head = "sort -k2 -nr | head -n 20"; -        for (word in words) { -                printf "%s\t%d\n", word, words[word] | sort_head; -        } -        close (sort_head); -} -``` - -Running this script on an earlier draft of this article produced this output: - - -``` -[[dneary@dhcp-49-32.bos.redhat.com][7]]$ awk -f wordcount.awk < awk_article.txt -the     79 -awk     41 -a       39 -and     33 -of      32 -in      27 -to      26 -is      25 -line    23 -for     23 -will    22 -file    21 -we      16 -We      15 -with    12 -which   12 -by      12 -this    11 -output  11 -function        11 -``` - -### What's next? - -If you want to learn more about awk programming, I strongly recommend the book [_Sed and awk_][8] by Dale Dougherty and Arnold Robbins. - -One of the keys to progressing in awk programming is mastering "extended regular expressions." Awk offers several powerful additions to the sed [regular expression][9] syntax you may already be familiar with. - -Another great resource for learning awk is the [GNU awk user guide][10]. It has a full reference for awk's built-in function library, as well as lots of examples of simple and complex awk scripts. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/10/advanced-awk - -作者:[Dave Neary][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dneary -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_hands_team_collaboration.png?itok=u82QepPk (a checklist for a team) -[2]: mailto:pc@event.org -[3]: mailto:hpotter@hogwarts.edu -[4]: mailto:reacher@covert.mil -[5]: mailto:mmouse@disney.com -[6]: mailto:sclaus@northpole.org -[7]: mailto:dneary@dhcp-49-32.bos.redhat.com -[8]: https://www.amazon.com/sed-awk-Dale-Dougherty/dp/1565922255/book -[9]: https://en.wikibooks.org/wiki/Regular_Expressions/POSIX-Extended_Regular_Expressions -[10]: https://www.gnu.org/software/gawk/manual/gawk.html diff --git a/sources/tech/20191031 Looping your way through bash.md b/sources/tech/20191031 Looping your way through bash.md deleted file mode 100644 index f53d3c8089..0000000000 --- a/sources/tech/20191031 Looping your way through bash.md +++ /dev/null @@ -1,236 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Looping your way through bash) -[#]: via: (https://www.networkworld.com/article/3449116/looping-your-way-through-bash.html) -[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) - -Looping your way through bash -====== -There are many ways to loop through data in a bash script and on the command line. Which way is best depends on what you're trying to do. -[Alan Levine / Flickr][1] [(CC BY 2.0)][2] - -There are a lot of options for looping in bash whether on the command line or in a script. The choice depends on what you're trying to do. - -You may want to loop indefinitely or quickly run through the days of the week. You might want to loop once for every file in a directory or for every account on a server. You might want to loop through every line in a file or have the number of loops be a choice when the script is run. Let's check out some of the options. - -[[Get regularly scheduled insights by signing up for Network World newsletters.]][3] - -### Simple loops - -Probably the simplest loop is a **for** loop like the one below. It loops as many times as there are pieces of text on the line. We could as easily loop through the words **cats are smart** as the numbers 1, 2, 3 and 4. - -[][4] - -BrandPost Sponsored by HPE - -[Take the Intelligent Route with Consumption-Based Storage][4] - -Combine the agility and economics of HPE storage with HPE GreenLake and run your IT department with efficiency. - -``` -#!/bin/bash - -for num in 1 2 3 4 -do - echo $num -done -``` - -And, to prove it, here's a similar loop run on the command line: - -``` -$ for word in cats are smart -> do -> echo $word -> done -cats -are -smart -``` - -### for vs while - -Bash provides both a **for** and a **while** looping command. In **while** loops, some condition is tested each time through the loop to determine whether the loop should continue. This example is practically the same as the one before in how it works, but imagine what a difference it would make if we wanted to loop 444 times instead of just 4. - -``` -#!/bin/bash - -n=1 - -while [ $n -le 4 ] -do - echo $n - ((n++)) -done -``` - -### Looping through value ranges - -If you want to loop through every letter of the alphabet or some more restricted range of letters, you can use syntax like this: - -``` -#!/bin/bash - -for x in {a..z} -do - echo $x -done -``` - -If you used **{d..f}**, you would only loop three times. - -### Looping inside loops - -There's also nothing stopping you from looping inside a loop. In this example, we're using a **for** loop inside a **while** loop. - -``` -#!/bin/bash - -n=1 - -while [ $n -lt 6 ] -do - for l in {a..d} - do - echo $n$l - done - ((n++)) -done -``` - -The output would in this example include 1a, 1b, 1c, 1d, 2a and so on, ending at 5d. Note that **((n++))** is used to increment the value of $n so that **while** has a stopping point. - -### Looping through variable data - -If you want to loop through every account on the system, every file in a directory or some other kind of variable data, you can issue a command within your loop to generate the list of values to loop through. In this example, we loop through every account (actually every file) in **/home** – assuming, as we should expect, that there are no other files or directories in **/home**. - -``` -#!/bin/bash - -for user in `ls /home` -do - echo $user -done -``` - -If the command were **date** instead of **ls /home**, we'd run through each of the 7 pieces of text in the output of the date command. - -``` -$ for word in `date` -> do -> echo $word -> done -Thu -31 -Oct -2019 -11:59:59 -PM -EDT -``` - -### Looping by request - -It's also very easy to allow the person running the script to determine how many times a loop should run. If you want to do this, however, you should test the response provided to be sure that it's numeric. This example shows three ways to do that. - -``` -#!/bin/bash - -echo -n "How many times should I say hello? " -read ans - -if [ "$ans" -eq "$ans" ]; then - echo ok1 -fi - -if [[ $ans = *[[:digit:]]* ]]; then - echo ok2 -fi - -if [[ "$ans" =~ ^[0-9]+$ ]]; then - echo ok3 -fi -``` - -The first option above shown might look a little odd, but it works because the **-eq** test only works if the values being compared are numeric. If the test came down to asking if **"f" -eq "f"**, it would fail. The second test uses the bash character class for digits. The third tests the variable to ensure that it contains only digits. - -Of course, once you've selected how you prefer to test a user response to be sure that it's numeric, you need to follow through on the loop. In this next example, we'll print "hello" as many times as the user wants to see it. The **le** does a "less than or equal" test. - -``` -#!/bin/bash - -echo -n "How many times should I say hello? " -read ans - -if [ "$ans" -eq "$ans" ]; then - n=1 - while [ $n -le $ans ] - do - echo hello - ((n++)) - done -fi -``` - -### Looping through the lines in a file - -If you want to loop through the contents of a file line by line (i.e., NOT word by word), you can use a loop like this one: - -``` -#!/bin/bash - -echo -n "File> " -read file -n=0 - -while read line; do - ((n++)) - echo "$n: $line" -done < $file -``` - -The word "line" used in the above script is for clarity, but you could use any variable name. The **while read** and the redirection of the file content on the last line of the script is what provides the line-by-line reading. - -### Looping forever - -If you want to loop forever or until, well, someone gets tired of seeing the script's output and decides to kill it, you can simple use the **while true** syntax. - -``` -#!/bin/bash - -while true -do - echo -n "Still running at " - date - sleep 10 -done -``` - -The examples shown above are basically only (excuse the pun) "shells" for the kind of real work that you might need to do and are meant simply to provide the basic syntax for running undoubtedly far more useful commands. - -### Now see: - -Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3449116/looping-your-way-through-bash.html - -作者:[Sandra Henry-Stocker][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ -[b]: https://github.com/lujun9972 -[1]: https://www.flickr.com/photos/cogdog/7778741378/in/photolist-cRo5NE-8HFUGG-e1kzG-4TFXrc-D3mM8-Lzx7h-LzGRB-fN3CY-LzwRo-8mWuUB-2jJ2j8-AABU8-eNrDET-eND7Nj-eND6Co-pNq3ZR-3bndB2-dNobDn-3brHfC-eNrSXv-4z4dNn-R1i2P5-eNDvyQ-agaw5-eND55q-4KQnc9-eXg6mo-eNscpF-eNryR6-dTGEqg-8uq9Wm-eND54j-eNrKD2-cynYp-eNrJsk-eNCSSj-e9uAD5-25xTWb-eNrJ3e-eNCW8s-7nKXtJ-5URF1j-8Y253Z-oaNVEQ-4AUK9b-6SJiLP-7GL54w-25yEqLa-fN3gL-dEgidW -[2]: https://creativecommons.org/licenses/by/2.0/legalcode -[3]: https://www.networkworld.com/newsletters/signup.html -[4]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE20773&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage) -[5]: https://www.facebook.com/NetworkWorld/ -[6]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20191104 How to Add Windows and Linux host to Nagios Server for Monitoring.md b/sources/tech/20191104 How to Add Windows and Linux host to Nagios Server for Monitoring.md deleted file mode 100644 index 6f49e48f98..0000000000 --- a/sources/tech/20191104 How to Add Windows and Linux host to Nagios Server for Monitoring.md +++ /dev/null @@ -1,308 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Add Windows and Linux host to Nagios Server for Monitoring) -[#]: via: (https://www.linuxtechi.com/add-windows-linux-host-to-nagios-server/) -[#]: author: (James Kiarie https://www.linuxtechi.com/author/james/) - -How to Add Windows and Linux host to Nagios Server for Monitoring -====== - -In the previous article, we demonstrated how to install [Nagios Core on CentOS 8 / RHEL 8][1] server. In this guide, we will dive deeper and add Linux and Windows hosts to the Nagios Core server for monitoring. - -![Add-Linux-Windows-Host-Nagios-Server][2] - -### Adding a Remote Windows Host to Nagios Server - -In this section, you will learn how to add a **Windows host** system to the **Nagios server**. For this to be possible, you need to install **NSClient++** agent on the Windows Host system. In this guide, we are going to install the NSClient++ on a Windows Server 2019 Datacenter edition. - -On the Windows host system,  head out to the download link as specified and download NSClient ++ agent. - -Once downloaded, double click on the downloaded installation file to launch the installation wizard. - -[![NSClient-installer-Windows][2]][3] - -On the first step on the installation procedure click ‘**Next**’ - -[![click-nex-to-install-NSClient][2]][4] - -In the next section, check off the ‘**I accept the terms in the license Agreement**’ checkbox and click ‘**Next**’ - -[![Accept-terms-conditions-NSClient][2]][5] - -Next, click on the ‘**Typical**’ option from the list of options and click ‘**Next**’ - -[![click-on-Typical-option-NSClient-Installation][2]][6] - -In the next step, leave the default settings as they are and click ‘**Next**’. - -[![Define-path-NSClient-Windows][2]][7] - -On the next page, specify your Nagios Server core’s IP address and tick off all the modules and click ‘**Next**’ as shown below. - -[![Specify-Nagios-Server-IP-address-NSClient-Windows][2]][8] - -Next, click on the ‘**Install**’ option to commence the installation process.[![Click-install-to-being-the-installation-NSClient][2]][9] - -The installation process will start and will take a couple of seconds to complete. On the last step. Click ‘**Finish**’ to complete the installation and exit the Wizard. - -[![Click-finish-NSClient-Windows][2]][10] - -To start the NSClient service, click on the **Start** menu and click on the ‘**Start NSClient ++**’ option. - -[![Click-start-NSClient-service-windows][2]][11] - -To confirm that indeed the service is running, press **Windows Key + R**, type services.msc and hit **ENTER**. Scroll and search for the **NSClient** service and ensure it’s running - -[![NSClient-running-windows][2]][12] - -At this point, we have successfully installed NSClient++ on Windows Server 2019 host and verified that it’s running. - -### Configure Nagios Server to monitor Windows host - -After the successful installation of the NSClient ++ on the Windows host PC, log in to the Nagios server Core system and configure it to monitor the Windows host system. - -Open the windows.cfg file using your favorite text editor - -``` -# vim /usr/local/nagios/etc/objects/windows.cfg -``` - -In the configuration file, ensure that the host_name attribute matches the hostname of your Windows client system. In our case, the hostname for the Windows server PC is windows-server. This hostname should apply for all the host_name attributes. - -For the address attribute, specify your Windows host IP address. , In our case, this was 10.128.0.52. - -![Specify-hostname-IP-Windows][2] - -After you are done, save the changes and exit the text editor. - -Next, open the Nagios configuration file. - -``` -# vim /usr/local/nagios/etc/nagios.cfg -``` - -Uncomment the line below and save the changes. - -cfg_file=/usr/local/nagios/etc/objects/windows.cfg - -![Uncomment-Windows-cfg-Nagios][2] - -Finally, to verify that Nagios configuration is free from any errors, run the command: - -``` -# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg -``` - -Output - -![Verify-configuration-for-errors-Nagios][2] - -As you can see from the output, there are no warnings or errors. - -Now browse your Nagios Server IP address, log in and click on Hosts. Your Windows hostname, in this case, windows-server will appear on the dashboard. - -![Windows-Host-added-Nagios][2] - -### Adding a remote Linux Host to Nagios Server - -Having added a Windows host to the Nagios server, let’s add a Linux host system. In our case, we are going to add a **Ubuntu 18.04 LTS** to the Nagios monitoring server. To monitor a Linux host, we need to install an agent on the remote Linux system called **NRPE**. NRPE is short for **Nagios Remote Plugin Executor**. This is the plugin that will allow you to monitor Linux host systems. It allows you to monitor resources such as Swap, memory usage, and CPU load to mention a few on remote Linux hosts. So the first step is to install NRPE on Ubuntu 18.04 LTS remote system. - -But first, update Ubuntu system - -``` -# sudo apt update -``` - -Next,  install Nagios NRPE by running the command as shown: - -``` -# sudo apt install nagios-nrpe-server nagios-plugins -``` - -![Install-nrpe-server-nagios-plugins][2] - -After the successful installation of  NRPE and Nagios plugins, configure NRPE by opening its configuration file in /etc/nagios/nrpe.cfg - -``` -# vim /etc/nagios/nrpe.cfg -``` - -Append the Linux host IP address to the **server_address** attribute. In this case, 10.128.0.53 is the IP address of the Ubuntu 18.04 LTS system. - -![Specify-server-address-Nagios][2] - -Next, add Nagios server IP address in the ‘allowed_hosts’ attribute, in this case, 10.128.0.50 - -![Allowed-hosts-Nagios][2] - -Save and exit the configuration file. - -Next, restart NRPE service and verify its status - -``` -# systemctl restart nagios-nrpe-server -# systemctl enable nagios-nrpe-server -# systemctl status nagios-nrpe-server -``` - -![Restart-nrpe-check-status][2] - -### Configure Nagios Server to monitor Linux host - -Having successfully installed NRPE and nagios plugins on the remote linux server, log in to Nagios Server and install EPEL (Extra packages for Enterprise Linux) package. - -``` -# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -``` - -Next, install NRPE plugin on the server - -``` -# dnf install nagios-plugins-nrpe -y -``` - -After the installation of the NRPE plugin, open the Nagios configuration file “/usr/local/nagios/etc/nagios.cfg” - -``` -# vim /usr/local/nagios/etc/nagios.cfg -``` - -Next, uncomment the line below in the configuration file - -cfg_dir=/usr/local/nagios/etc/servers - -![uncomment-servers-line-Nagios-Server-CentOS8][2] - -Next, create a configuration directory - -``` -# mkdir /usr/local/nagios/etc/servers -``` - -Then create client configuration file - -``` -# vim /usr/local/nagios/etc/servers/ubuntu-host.cfg -``` - -Copy and paste the configuration below to the file. This configuration monitors swap space, system load, total processes, logged in users, and disk usage. - -``` -define host{ - use linux-server - host_name ubuntu-nagios-client - alias ubuntu-nagios-client - address 10.128.0.53 - -} - -define hostgroup{ - hostgroup_name linux-server - alias Linux Servers - members ubuntu-nagios-client -} - -define service{ - use local-service - host_name ubuntu-nagios-client - service_description SWAP Uasge - check_command check_nrpe!check_swap - -} - -define service{ - use local-service - host_name ubuntu-nagios-client - service_description Root / Partition - check_command check_nrpe!check_root - -} - -define service{ - use local-service - host_name ubuntu-nagios-client - service_description Current Users - check_command check_nrpe!check_users -} - -define service{ - use local-service - host_name ubuntu-nagios-client - service_description Total Processes - check_command check_nrpe!check_total_procs -} - -define service{ - use local-service - host_name ubuntu-nagios-client - service_description Current Load - check_command check_nrpe!check_load -} -``` - -Save and exit the configuration file. - -Next, verify that there are no errors in Nagios configuration - -``` -# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg -``` - -Now restart Nagios service and ensure that it is up and running. - -``` -# systemctl restart nagios -``` - -Remember to open port 5666 which is used by NRPE plugin on the firewall of the Nagios server. - -``` -# firewall-cmd --permanent --add-port=5666/tcp -# firewall-cmd --reload -``` - -![Allow-firewall-Nagios-server][2] - -Likewise, head out to your Linux host (Ubuntu 18.04 LTS) and allow the port on UFW firewall - -``` -# ufw allow 5666/tcp -# ufw reload -``` - -![Allow-NRPE-service][2] - -Finally, head out to the Nagios Server’s URL and click on ‘**Hosts**’. Your Ubuntu system will be displayed on the dashboard alongside the Windows host machine we added earlier on. - -![Linux-host-added-monitored-Nagios][2] - -And this wraps up our 2-part series on Nagios installation and adding remote hosts. Feel free to get back to us with your feedback. - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/add-windows-linux-host-to-nagios-server/ - -作者:[James Kiarie][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/james/ -[b]: https://github.com/lujun9972 -[1]: https://www.linuxtechi.com/install-nagios-core-rhel-8-centos-8/ -[2]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[3]: https://www.linuxtechi.com/wp-content/uploads/2019/11/NSClient-installer-Windows.jpg -[4]: https://www.linuxtechi.com/wp-content/uploads/2019/11/click-nex-to-install-NSClient.jpg -[5]: https://www.linuxtechi.com/wp-content/uploads/2019/11/Accept-terms-conditions-NSClient.jpg -[6]: https://www.linuxtechi.com/wp-content/uploads/2019/11/click-on-Typical-option-NSClient-Installation.jpg -[7]: https://www.linuxtechi.com/wp-content/uploads/2019/11/Define-path-NSClient-Windows.png -[8]: https://www.linuxtechi.com/wp-content/uploads/2019/11/Specify-Nagios-Server-IP-address-NSClient-Windows.jpg -[9]: https://www.linuxtechi.com/wp-content/uploads/2019/11/Click-install-to-being-the-installation-NSClient.jpg -[10]: https://www.linuxtechi.com/wp-content/uploads/2019/11/Click-finish-NSClient-Windows.jpg -[11]: https://www.linuxtechi.com/wp-content/uploads/2019/11/Click-start-NSClient-service-windows.jpg -[12]: https://www.linuxtechi.com/wp-content/uploads/2019/11/NSClient-running-windows.jpg diff --git a/sources/tech/20191106 An introduction to monitoring with Prometheus.md b/sources/tech/20191106 An introduction to monitoring with Prometheus.md deleted file mode 100644 index 4a6db0757f..0000000000 --- a/sources/tech/20191106 An introduction to monitoring with Prometheus.md +++ /dev/null @@ -1,434 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (An introduction to monitoring with Prometheus) -[#]: via: (https://opensource.com/article/19/11/introduction-monitoring-prometheus) -[#]: author: (Yuri Grinshteyn https://opensource.com/users/yuri-grinshteyn) - -An introduction to monitoring with Prometheus -====== -Prometheus is a popular and powerful toolkit to monitor Kubernetes. This -is a tutorial on how to get started. -![Wheel of a ship][1] - -[Metrics are the primary way][2] to represent both the overall health of your system and any other specific information you consider important for monitoring and alerting or observability. [Prometheus][3] is a leading open source metric instrumentation, collection, and storage toolkit [built at SoundCloud][4] beginning in 2012. Since then, it's [graduated][5] from the Cloud Native Computing Foundation and become the de facto standard for Kubernetes monitoring. It has been covered in some detail in: - - * [Getting started with Prometheus][6] - * [5 examples of Prometheus monitoring success][7] - * [Achieve high-scale application monitoring with Prometheus][8] - * [Tracking the weather with Python and Prometheus][9] - - - -However, none of these articles focus on how to use Prometheus on Kubernetes. This article: - - * Describes the Prometheus architecture and data model to help you understand how it works and what it can do - * Provides a tutorial on setting Prometheus up in a Kubernetes cluster and using it to monitor clusters and applications - - - -### Architecture - -While knowing how Prometheus works may not be essential to using it effectively, it can be helpful, especially if you're considering using it for production. The [Prometheus documentation][10] provides this graphic and details about the essential elements of Prometheus and how the pieces connect together. - -[![Prometheus architecture][11]][10] - -For most use cases, you should understand three major components of Prometheus: - - 1. The Prometheus **server** scrapes and stores metrics. Note that it uses a **persistence** layer, which is part of the server and not expressly mentioned in the documentation. Each node of the server is autonomous and does not rely on distributed storage. I'll revisit this later when looking to use a dedicated time-series database to store Prometheus data, rather than relying on the server itself. - 2. The web **UI** allows you to access, visualize, and chart the stored data. Prometheus provides its own UI, but you can also configure other visualization tools, like [Grafana][12], to access the Prometheus server using PromQL (the Prometheus Query Language). - 3. **Alertmanager** sends alerts from client applications, especially the Prometheus server. It has advanced features for deduplicating, grouping, and routing alerts and can route through other services like PagerDuty and OpsGenie. - - - -The key to understanding Prometheus is that it fundamentally relies on **scraping**, or pulling, metrics from defined endpoints. This means that your application needs to expose an endpoint where metrics are available and instruct the Prometheus server how to scrape it (this is covered in the tutorial below). There are [exporters][13] for many applications that do not have an easy way to add web endpoints, such as [Kafka][14] and [Cassandra][15] (using the JMX exporter). - -### Data model - -Now that you understand how Prometheus works to scrape and store metrics, the next thing to learn is the kinds of metrics Prometheus supports. Some of the following information (noted with quotation marks) comes from the [metric types][16] section of the Prometheus documentation. - -#### Counters and gauges - -The two simplest metric types are **counter** and **gauge**. When getting started with Prometheus (or with time-series monitoring more generally), these are the easiest types to understand because it's easy to connect them to values you can imagine monitoring, like how much system resources your application is using or how many events it has processed. - -> "A **counter** is a cumulative metric that represents a single monotonically increasing counter whose value can only **increase** or be **reset** to zero on restart. For example, you can use a counter to represent the number of requests served, tasks completed, or errors." - -Because you cannot decrease a counter, it can and should be used only to represent cumulative metrics. - -> "A **gauge** is a metric that represents a single numerical value that can arbitrarily go up and down. Gauges are typically used for measured values like [CPU] or current memory usage, but also 'counts' that can go up and down, like the number of concurrent requests." - -#### Histograms and summaries - -Prometheus supports two more complex metric types: [**histograms**][17] [and][17] [**summaries**][17]. There is ample opportunity for confusion here, given that they both track the number of observations _and_ the sum of observed values. One of the reasons you might choose to use them is that you need to calculate an average of the observed values. Note that they create multiple time series in the database; for example, they each create a sum of the observed values with a **_sum** suffix. - -> "A **histogram** samples observations (usually things like request durations or response sizes) and counts them in configurable buckets. It also provides a sum of all observed values." - -This makes it an excellent candidate to track things like latency that might have a service level objective (SLO) defined against it. From the [documentation][17]: - -> You might have an SLO to serve 95% of requests within 300ms. In that case, configure a histogram to have a bucket with an upper limit of 0.3 seconds. You can then directly express the relative amount of requests served within 300ms and easily alert if the value drops below 0.95. The following expression calculates it by job for the requests served in the last 5 minutes. The request durations were collected with a histogram called **http_request_duration_seconds**. -> -> [code]`sum(rate(http_request_duration_seconds_bucket{le="0.3"}[5m])) by (job) / sum(rate(http_request_duration_seconds_count[5m])) by (job)` -``` -> ->   - -Returning to definitions: - -> "Similar to a histogram, a **summary** samples observations (usually things like request durations and response sizes). While it also provides a total count of observations and a sum of all observed values, it calculates configurable quantiles over a sliding time window." - -The essential difference between summaries and histograms is that summaries calculate streaming φ-quantiles on the client-side and expose them directly, while histograms expose bucketed observation counts, and the calculation of quantiles from the buckets of a histogram happens on the server-side using the **histogram_quantile()** function. - -If you are still confused, I suggest taking the following approach: - - * Use gauges most of the time for straightforward time-series metrics. - * Use counters for things you know to increase monotonically, e.g., if you are counting the number of times something happens. - * Use histograms for latency measurements with simple buckets, e.g., one bucket for "under SLO" and another for "over SLO." - - - -This should be sufficient for the overwhelming majority of use cases, and you should rely on a statistical analysis expert to help you with more advanced scenarios. - -Now that you have a basic understanding of what Prometheus is, how it works, and the kinds of data it can collect and store, you're ready to begin the tutorial. - -## Prometheus and Kubernetes hands-on tutorial - -This tutorial covers the following: - - * Installing Prometheus in your cluster - * Downloading the sample application and reviewing the code - * Building and deploying the app and generating load against it - * Accessing the Prometheus UI and reviewing the basic metrics - - - -This tutorial assumes: - - * You already have a Kubernetes cluster deployed. - * You have configured the **kubectl** command-line utility for access. - * You have the **cluster-admin** role (or at least sufficient privileges to create namespaces and deploy applications). - * You are running a Bash-based command-line interface. Adjust this tutorial if you run other operating systems or shell environments. - - - -If you don't have Kubernetes running yet, this [Minikube tutorial][18] is an easy way to set it up on your laptop. - -If you're ready now, let's go. - -### Install Prometheus - -In this section, you will clone the sample repository and use Kubernetes' configuration files to deploy Prometheus to a dedicated namespace. - - 1. Clone the sample repository locally and use it as your working directory: [code] $ git clone -$ cd  prometheus-demo -$ WORKDIR=$(pwd) -``` - 2. Create a dedicated namespace for the Prometheus deployment: [code]`$ kubectl create namespace prometheus` -``` - 3. Give your namespace the cluster reader role: [code] $ kubectl apply -f $WORKDIR/kubernetes/clusterRole.yaml -clusterrole.rbac.authorization.k8s.io/prometheus created -clusterrolebinding.rbac.authorization.k8s.io/prometheus created -``` - 4. Create a Kubernetes configmap with scraping and alerting rules: [code] $ kubectl apply -f $WORKDIR/kubernetes/configMap.yaml -n prometheus -configmap/prometheus-server-conf created -``` - 5. Deploy Prometheus: [code] $ kubectl create -f prometheus-deployment.yaml -n prometheus -deployment.extensions/prometheus-deployment created -``` - 6. Validate that Prometheus is running: [code] $ kubectl get pods -n prometheus -NAME                                     READY   STATUS    RESTARTS   AGE -prometheus-deployment-78fb5694b4-lmz4r   1/1     Running   0          15s -``` -### Review basic metrics - -In this section, you'll access the Prometheus UI and review the metrics being collected. - - 1. Use port forwarding to enable web access to the Prometheus UI locally: -**Note:** Your **prometheus-deployment** will have a different name than this example. Review and replace the name of the pod from the output of the previous command. [code] $ kubectl port-forward prometheus-deployment-7ddb99dcb-fkz4d 8080:9090 -n prometheus -Forwarding from 127.0.0.1:8080 -> 9090 -Forwarding from [::1]:8080 -> 9090 -``` - - 2. Go to in a browser: -![Prometheus console][19] - -You are now ready to query Prometheus metrics! - - - - 3. Some basic machine metrics (like the number of CPU cores and memory) are available right away. For example, enter **machine_memory_bytes** in the expression field, switch to the Graph view, and click Execute to see the metric charted: - - - -![Prometheus metric channel][20] - - 4. Containers running in the cluster are also automatically monitored. For example, enter **rate(container_cpu_usage_seconds_total{container_name="prometheus"}[1m])** as the expression and click Execute to see the rate of CPU usage by Prometheus: - - - -![CPU usage metric][21] - -Now that you know how to install Prometheus and use it to measure some out-of-the-box metrics, it's time for some real monitoring. - -#### Golden signals - -As described in the "[Monitoring Distributed Systems][22]" chapter of [Google's SRE][23] book: - -> "The four golden signals of monitoring are latency, traffic, errors, and saturation. If you can only measure four metrics of your user-facing system, focus on these four." - -The book offers thorough descriptions of all four, but this tutorial focuses on the three signals that most easily serve as proxies for user happiness: - - * **Traffic:** How many requests you're receiving - * **Error rate:** How many of those requests you can successfully serve - * **Latency:** How quickly you can serve successful requests - - - -As you probably realize by now, Prometheus does not measure any of these for you; you'll have to instrument any application you deploy to emit them. Following is an example implementation. - -Open the **$WORKDIR/node/golden_signals/app.js** file, which is a sample application written in Node.js (recall we cloned **yuriatgoogle/prometheus-demo** and exported **$WORKDIR** earlier). Start by reviewing the first section, where the metrics to be recorded are defined: - - -``` -// total requests - counter -const nodeRequestsCounter = new prometheus.Counter({ -    name: 'node_requests', -    help: 'total requests' -}); -``` - -The first metric is a counter that will be incremented for each request; this is how the total number of requests is counted: - - -``` -// failed requests - counter -const nodeFailedRequestsCounter = new prometheus.Counter({ -    name: 'node_failed_requests', -    help: 'failed requests' -}); -``` - -The second metric is another counter that increments for each error to track the number of failed requests: - - -``` -// latency - histogram -const nodeLatenciesHistogram = new prometheus.Histogram({ -    name: 'node_request_latency', -    help: 'request latency by path', -    labelNames: ['route'], -    buckets: [100, 400] -}); -``` - -The third metric is a histogram that tracks request latency. Working with a very basic assumption that the SLO for latency is 100ms, you will create two buckets: one for 100ms and the other 400ms latency. - -The next section handles incoming requests, increments the total requests metric for each one, increments failed requests when there is an (artificially induced) error, and records a latency histogram value for each successful request. I have chosen not to record latencies for errors; that implementation detail is up to you. - - -``` -app.get('/', (req, res) => { -    // start latency timer -    const requestReceived = new Date().getTime(); -    console.log('request made'); -    // increment total requests counter -    nodeRequestsCounter.inc(); -    // return an error 1% of the time -    if ((Math.floor(Math.random() * 100)) == 100) { -        // increment error counter -        nodeFailedRequestsCounter.inc(); -        // return error code -        res.send("error!", 500); -    } -    else { -        // delay for a bit -        sleep.msleep((Math.floor(Math.random() * 1000))); -        // record response latency -        const responseLatency = new Date().getTime() - requestReceived; -        nodeLatenciesHistogram -            .labels(req.route.path) -            .observe(responseLatency); -        res.send("success in " + responseLatency + " ms"); -    } -}) -``` - -#### Test locally - -Now that you've seen how to implement Prometheus metrics, see what happens when you run the application. - - 1. Install the required packages: [code] $ cd $WORKDIR/node/golden_signals -$ npm install --save -``` -2. Launch the app: [code]`$ node app.js` -``` - 3. Open two browser tabs: one to and another to . - 4. When you go to the **/metrics** page, you can see the Prometheus metrics being collected and updated every time you reload the home page: - - - -![Prometheus metrics being collected][24] - -You're now ready to deploy the sample application to your Kubernetes cluster and test your monitoring. - -#### Deploy monitoring to Prometheus on Kubernetes - -Now it's time to see how metrics are recorded and represented in the Prometheus instance deployed in your cluster by: - - * Building the application image - * Deploying it to your cluster - * Generating load against the app - * Observing the metrics recorded - - - -##### Build the application image - -The sample application provides a Dockerfile you'll use to build the image. This section assumes that you have: - - * Docker installed and configured locally - * A Docker Hub account - * Created a repository - - - -If you're using Google Kubernetes Engine to run your cluster, you can use Cloud Build and the Google Container Registry instead. - - 1. Switch to the application directory: [code]`$ cd $WORKDIR/node/golden_signals` -``` -2. Build the image with this command: [code]`$ docker build . --tag=/prometheus-demo-node:latest` -``` - 3. Make sure you're logged in to Docker Hub: [code]`$ docker login` -``` -4. Push the image to Docker Hub using this command: [code]`$ docker push /prometheus-demo-node:latest` -``` - 5. Verify that the image is available: [code]`$ docker images` -``` -#### Deploy the application - -Now that the application image is in the Docker Hub, you can deploy it to your cluster and run the application. - - 1. Modify the **$WORKDIR/node/golden_signals/prometheus-demo-node.yaml** file to pull the image from Docker Hub: [code] spec: -      containers: -      - image: docker.io/<Docker username>/prometheus-demo-node:latest -``` - 2. Deploy the image: [code] $ kubectl apply -f $WORKDIR/node/golden_signals/prometheus-demo-node.yaml -deployment.extensions/prometheus-demo-node created -``` - 3. Verify that the application is running: [code] $ kubectl get pods -NAME                                    READY   STATUS    RESTARTS   AGE -prometheus-demo-node-69688456d4-krqqr   1/1     Running   0          65s -``` - 4. Expose the application using a load balancer: [code] $ kubectl expose deployment prometheus-node-demo --type=LoadBalancer --name=prometheus-node-demo --port=8080 -service/prometheus-demo-node exposed -``` - 5. Confirm that your service has an external IP address: [code] $ kubectl get services -NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE -kubernetes             ClusterIP      10.39.240.1     <none>           443/TCP          23h -prometheus-demo-node   LoadBalancer   10.39.248.129   35.199.186.110   8080:31743/TCP   78m -``` - - - -##### Generate load to test monitoring - -Now that your service is up and running, generate some load against it by using [Apache Bench][25]. - - 1. Get the IP address of your service as a variable: [code]`$ export SERVICE_IP=$(kubectl get svc prometheus-demo-node -ojson | jq -r '.status.loadBalancer.ingress[].ip')` -``` -2. Use **ab** to generate some load. You may want to run this in a separate terminal window. [code]`$ ab -c 3 -n 1000 http://${SERVICE_IP}:8080/` -``` - - - -##### Review metrics - -While the load is running, access the Prometheus UI in the cluster again and confirm that the "golden signal" metrics are being collected. - - 1. Establish a connection to Prometheus: [code] - -$ kubectl get pods -n prometheus -NAME                                     READY   STATUS    RESTARTS   AGE -prometheus-deployment-78fb5694b4-lmz4r   1/1     Running   0          15s - -$ kubectl port-forward prometheus-deployment-78fb5694b4-lmz4r 8080:9090 -n prometheus -Forwarding from 127.0.0.1:8080 -> 9090 -Forwarding from [::1]:8080 -> 9090 - -``` -**Note:** Make sure to replace the name of the pod in the second command with the output of the first. - - 2. Open in a browser: - - - - -![Prometheus console][26] - - 3. Use this expression to measure the request rate: [code]`rate(node_requests[1m])` -``` - - - -![Measuring the request rate][27] - - 4. Use this expression to measure your error rate: [code]`rate(node_failed_requests[1m])` -``` -![Measuring the error rate][28] - - 5. Finally, use this expression to validate your latency SLO. Remember that you set up two buckets, 100ms and 400ms. This expression returns the percentage of requests that meet the SLO : [code]`sum(rate(node_request_latency_bucket{le="100"}[1h])) / sum(rate(node_request_latency_count[1h]))` -``` - - - -![SLO query graph][29] - -About 10% of the requests are within SLO. This is what you should expect since the code sleeps for a random number of milliseconds between 0 and 1,000. As such, about 10% of the time, it returns in more than 100ms, and this graph shows that you can't meet the latency SLO as a result. - -### Summary - -Congratulations! You've completed the tutorial and hopefully have a much better understanding of how Prometheus works, how to instrument your application with custom metrics, and how to use it to measure your SLO compliance. The next article in this series will look at another metric instrumentation approach using OpenCensus. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/introduction-monitoring-prometheus - -作者:[Yuri Grinshteyn][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/yuri-grinshteyn -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes.png?itok=PqDGb6W7 (Wheel of a ship) -[2]: https://opensource.com/article/19/10/open-source-observability-kubernetes -[3]: https://prometheus.io/ -[4]: https://en.wikipedia.org/wiki/Prometheus_(software)#History -[5]: https://www.cncf.io/announcement/2018/08/09/prometheus-graduates/ -[6]: https://opensource.com/article/18/12/introduction-prometheus -[7]: https://opensource.com/article/18/9/prometheus-operational-advantage -[8]: https://opensource.com/article/19/10/application-monitoring-prometheus -[9]: https://opensource.com/article/19/4/weather-python-prometheus -[10]: https://prometheus.io/docs/introduction/overview/ -[11]: https://opensource.com/sites/default/files/uploads/prometheus-architecture.png (Prometheus architecture) -[12]: https://grafana.com/ -[13]: https://prometheus.io/docs/instrumenting/exporters/ -[14]: https://github.com/danielqsj/kafka_exporter -[15]: https://github.com/prometheus/jmx_exporter -[16]: https://prometheus.io/docs/concepts/metric_types/ -[17]: https://prometheus.io/docs/practices/histograms/ -[18]: https://opensource.com/article/18/10/getting-started-minikube -[19]: https://opensource.com/sites/default/files/uploads/prometheus-console.png (Prometheus console) -[20]: https://opensource.com/sites/default/files/uploads/prometheus-machine_memory_bytes.png (Prometheus metric channel) -[21]: https://opensource.com/sites/default/files/uploads/prometheus-cpu-usage.png (CPU usage metric) -[22]: https://landing.google.com/sre/sre-book/chapters/monitoring-distributed-systems/ -[23]: https://landing.google.com/sre/sre-book/toc/ -[24]: https://opensource.com/sites/default/files/uploads/prometheus-metrics-collected.png (Prometheus metrics being collected) -[25]: https://httpd.apache.org/docs/2.4/programs/ab.html -[26]: https://opensource.com/sites/default/files/uploads/prometheus-enable-query-history.png (Prometheus console) -[27]: https://opensource.com/sites/default/files/uploads/prometheus-request-rate.png (Measuring the request rate) -[28]: https://opensource.com/sites/default/files/uploads/prometheus-error-rate.png (Measuring the error rate) -[29]: https://opensource.com/sites/default/files/uploads/prometheus-slo-query.png (SLO query graph) diff --git a/sources/tech/20191107 A guide to open source for microservices.md b/sources/tech/20191107 A guide to open source for microservices.md deleted file mode 100644 index 5731e85cf5..0000000000 --- a/sources/tech/20191107 A guide to open source for microservices.md +++ /dev/null @@ -1,309 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (A guide to open source for microservices) -[#]: via: (https://opensource.com/article/19/11/microservices-cheat-sheet) -[#]: author: (Girish Managoli https://opensource.com/users/gammay) - -A guide to open source for microservices -====== -Build and manage high-scale microservices networks and solve the -challenges of running services without fault that scale based on -business demand. -![Text editor on a browser, in blue][1] - -Microservices—applications broken down into smaller, composable pieces that work together—are getting as much attention as the hottest new restaurant in town. (If you're not yet familiar, dive into [What Are Microservices][2] before continuing here.) - -However, if you have moved on from "Hello, World" and running a simple handful of microservices, and are building hundreds of microservices and running thousands of instances, you know there is nothing "micro" about them. You want your instances to increase when users increase and decrease when users decrease. You want to distribute requests effectively between instances. You want to build and run your services intelligently. You need a clear view of the service instances that are running or going down. How can you manage all of this complexity? - -This article looks at some of the key terminologies in the microservices ecosystem and some of the open source software available to build out a microservices architecture. The focus is on building and managing high-scale microservices networks and solving the challenges of running services without fault and that scale correctly based on business demand. - -Here is a wholesome, lavish spread of open source cuisine that is sure to be gastronomically, "_microservically"_ appetizing. I'm sure I've overlooked some open source applications in this area; please let me know about them in the comments. - -**[Download the PDF version of this cheat sheet [here][3]]** - -### Containers - -The right way to deploy applications is in [containers][4]. Briefly, a container is a miniature virtual server packed with the software required to run an application. The container pack is small, smart, and easy to deploy and maintain. And deploying your application in a container is clever. You can deploy as many instances as you need and scale up or down as needed to meet the current load. - -**Open source containers** - -**Software** | **Code** | **License** ----|---|--- -[rkt][5] | [GitHub][6] | Apache License 2.0 -[Docker][7] | [GitHub][8] | Apache License 2.0 -[FreeBSD Jail][9] | [GitHub][10] | FreeBSD License -[LXC][11] | [GitHub][12] | GNU LGPL v.2.1 -[OpenVZ][13] | [GitHub][14] | GNU General Public License v2.0 - -### Container orchestrators - -If you have hundreds or thousands of service instances deployed on containers, you need a good way to manage them. Container orchestration is the right solution for deploying and managing all of these containers. Orchestrators can move across; scale up, down, or out; manage higher or lower loads; regulate added, removed, and dead containers; and much more. - -**Open source container orchestrators** - -**Software** | **Code** | **License** ----|---|--- -[Kubernetes][15] | [GitHub][16] | Apache License 2.0 -[OpenShift][17] | [GitHub][18] | Apache License 2.0 -[Nomad][19] | [GitHub][20] | Mozilla Public License 2.0 -[LXD][21] | [GitHub][22] | Apache License 2.0 - -### API gateways - -An API gateway is a watchman that controls and monitors API calls to your application. An API gateway has three key roles: - - 1. **API data and management:** API listing, API subscription, API documentation, community support - 2. **API viewpoint and billing:** Analytics, metrics, billing - 3. **API control and security:** Subscription caller management, rate control, blocking, data conversion, production and sandbox support, key management - - - -API gateways are usually multi-tenant solutions to deploy multiple applications on the same gateway. - -**Open source API gateways** - -Not all of the following API gateways support every function mentioned above, so pick and choose depending on your needs. - -**Software** | **Code** | **License** ----|---|--- -[3scale][23] | [GitHub][24] | Apache License 2.0 -[API Umbrella][25] | [GitHub][26] | MIT License -[Apigee][27] | [GitHub][28] | Apache License 2.0 -[Apiman][29] | [GitHub][30] | Apache License 2.0 -[DreamFactory][31] | [GitHub][32] | Apache License 2.0 -[Fusio][33] | [GitHub][34] | GNU Affero General Public License v3.0 -[Gravitee][35] | [GitHub][36] | Apache License 2.0 -[Kong][37] | [GitHub][38] | Apache License 2.0 -[KrakenD][39] | [GitHub][40] | Apache License 2.0 -[Tyk][41] | [GitHub][42] | Mozilla Public License 2.0 - -### CI/CD - -Continuous integration (CI) and continuous deployment (CD; it may also stand for continuous delivery) are the net sum of processes to build and run your processes. [CI/CD][43] is a philosophy that ensures your microservices are built and run correctly to meet users' expectations. Automation is the critical CI/CD factor that makes the build and run process easy and structured. CI's primary processes are build and test, and CD's are deploy and monitor. - -All of the CI/CD tools and platforms listed below are open source. I don't include SaaS platforms that are free for hosting open source. GitHub also isn't on the list because it is not open source and does not have built-in CI/CD; it uses third-party CI/CD product integrations instead. GitLab is open source and has a built-in CI/CD service, so it is on this list. - -**Open source CI/CD tools** - -**Software** | **Code** | **License** ----|---|--- -[Jenkins][44] | [GitHub][45] | MIT License -[GitLab][46] | [GitLab][47] | MIT License -[Buildbot][48] | [GitHub][49] | GNU General Public License v2.0 -[Concourse][50] | [GitHub][51] | Apache License 2.0 -[GoCD][52] | [GitHub][53] | Apache License 2.0 -[Hudson][54] | [GitHub][55] | MIT License -[Spinnaker][56] | [GitHub][57] | Apache License 2.0 - -### Load balancers - -When your number of requests scale, you must deploy multiple instances of your application and share requests across those instances. The application that manages the requests between instances is called a load balancer. A load balancer can be configured to distribute requests based on round-robin scheduling, IP routing, or another algorithm. The load balancer automatically manages request distributions when new instances are added (to support higher load) or decommissioned (when load scales down). Session persistence is another load-balancing feature that redirects new requests to the previous instance when needed (for example, to maintain a session). There are hardware- and software-based load balancers. - -**Open source load balancers** - -**Software** | **Code** | **License** ----|---|--- -[HAProxy][58] | [GitHub][59] | HAPROXY's license / GPL v2.0 -[Apache modules][60] (mod_athena, mod_proxy_balancer) | [SourceForge][61] or -[Code.Google][62] or -[GitHub][63] | Apache License 2.0 -[Balance][64] | [SourceForge][65] | GNU General Public License v2.0 -[Distributor][66] | [SourceForge][67] | GNU General Public License v2.0 -[GitHub Load Balancer (GLB) Director][68] | [GitHub][69] | BSD 3-Clause License -[Neutrino][70] | [GitHub][71] | Apache License 2.0 -[OpenLoBa][72] | [SourceForge][73] | Not known -[Pen][74] | [GitHub][75] | GNU General Public License, v2.0 -[Seesaw][76] | [GitHub][77] | Apache License 2.0 -[Synapse][78] | [GitHub][79] | Apache License 2.0 -[Traefik][80] | [GitHub][81] | MIT License - -### Service registry and service discovery - -When several hundreds or thousands of service instances are deployed and talking to each other, how do requester services know how to connect the right responder services, given that deployment points are dynamic as services are scaled in and out? A service registry and service discovery service solves this problem. These systems are essentially key-value stores that maintain configuration information and naming and provide distributed synchronization. - -**Open source service registry and discovery services** - -**Software** | **Code** | **License** ----|---|--- -[Baker Street][82] | [GitHub][83] | Apache License 2.0 -[Consul][84] | [GitHub][85] | Mozilla Public License 2.0 -[etcd][86] | [GitHub][87] | Apache License 2.0 -[Registrator][88] | [GitHub][89] | MIT License -[Serf][90] | [GitHub][91] | Mozilla Public License 2.0 -[ZooKeeper][92] | [GitHub][93] | Apache License 2.0 - -### Monitoring - -When your microservices and their instances cater to users' needs, you need to maintain a good view of their performance. Monitoring tools to the rescue! - -Open source monitoring tools and software come in numerous flavors, some barely better than [top][94]. Other options include OS-specific; enterprise-grade; tool collections that provide complete integration; do-one-thing tools that merely monitor or report or visualize and integrate with third-party tools; and tools that monitor specific or multiple components such as networks, log files, web requests, and databases. Monitoring tools can be web-based or standalone tools, and notification options range from passive reporting to active alerting. - -Choose one or more of these tools to enjoy a chewy crunch of your microservices network. - -**Open source monitoring software** - -**Software** | **Code** | **License** ----|---|--- -[OpenNMS][95] | [GitHub][96] | GNU Affero General Public License -[Grafana][97] | [GitHub][98] | Apache License 2.0 -[Graphite][99] | [GitHub][100] | Apache License 2.0 -[Icinga][101] | [GitHub][102] | GNU General Public License v2.0 -[InfluxDB][103] | [GitHub][104] | MIT License -[LibreNMS][105] | [GitHub][106] | GNU General Public License v3.0 -[Naemon][107] | [GitHub][108] | GNU General Public License v2.0 -[Nagios][109] | [GitHub][110] | GNU General Public License v2.0 -[ntop][111] | [GitHub][112] | GNU General Public License v3.0 -[ELK][113] | [GitHub][114] | Apache License 2.0 -[Prometheus][115] | [GitHub][116] | Apache License 2.0 -[Sensu][117] | [GitHub][118] | MIT License -[Zabbix][119] | [Self-hosted repo][120] | GNU General Public License v2.0 -[Zenoss][121] | [SourceForge][122] | GNU General Public License v2.0 - -### The right ingredients - -Pure open source solutions can offer the right ingredients for deploying and running microservices at high scale. I hope you find them to be relishing, gratifying, satiating, and most of all, _microservicey_! - -### Download the [Microservices cheat sheet][3].  - -What are microservices? Opensource.com created a new resource page which gently introduces... - -What are microservices, how do container technologies allow for their use, and what other tools do... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/microservices-cheat-sheet - -作者:[Girish Managoli][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/gammay -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png?itok=lcf-m6N7 (Text editor on a browser, in blue) -[2]: https://opensource.com/resources/what-are-microservices -[3]: https://opensource.com/content/microservices-cheat-sheet -[4]: https://opensource.com/resources/what-are-linux-containers -[5]: https://coreos.com/rkt/ -[6]: https://github.com/rkt/rkt/ -[7]: https://www.docker.com/ -[8]: https://github.com/docker -[9]: https://www.freebsd.org/doc/handbook/jails-build.html -[10]: https://github.com/freebsd/freebsd -[11]: https://linuxcontainers.org/lxc/ -[12]: https://github.com/lxc/lxc -[13]: https://openvz.org/ -[14]: https://github.com/OpenVZ -[15]: https://kubernetes.io/ -[16]: https://github.com/kubernetes/kubernetes -[17]: https://www.openshift.com/ -[18]: https://github.com/openshift -[19]: https://www.nomadproject.io/ -[20]: https://github.com/hashicorp/nomad -[21]: https://linuxcontainers.org/lxd/introduction/ -[22]: https://github.com/lxc/lxd -[23]: https://www.redhat.com/en/technologies/jboss-middleware/3scale -[24]: https://github.com/3scale/APIcast -[25]: https://apiumbrella.io/ -[26]: https://github.com/NREL/api-umbrella -[27]: https://cloud.google.com/apigee/ -[28]: https://github.com/apigee/microgateway-core -[29]: http://www.apiman.io/ -[30]: https://github.com/apiman/apiman -[31]: https://www.dreamfactory.com/ -[32]: https://github.com/dreamfactorysoftware/dreamfactory -[33]: https://www.fusio-project.org/ -[34]: https://github.com/apioo/fusio -[35]: https://gravitee.io/ -[36]: https://github.com/gravitee-io/gravitee-gateway -[37]: https://konghq.com/kong/ -[38]: https://github.com/Kong/ -[39]: https://www.krakend.io/ -[40]: https://github.com/devopsfaith/krakend -[41]: https://tyk.io/ -[42]: https://github.com/TykTechnologies/tyk -[43]: https://opensource.com/article/18/8/what-cicd -[44]: https://jenkins.io/ -[45]: https://github.com/jenkinsci/jenkins -[46]: https://gitlab.com/ -[47]: https://gitlab.com/gitlab-org -[48]: https://buildbot.net/ -[49]: https://github.com/buildbot/buildbot -[50]: https://concourse-ci.org/ -[51]: https://github.com/concourse/concourse -[52]: https://www.gocd.org/ -[53]: https://github.com/gocd/gocd -[54]: http://hudson-ci.org/ -[55]: https://github.com/hudson -[56]: https://www.spinnaker.io/ -[57]: https://github.com/spinnaker/spinnaker -[58]: http://www.haproxy.org/ -[59]: https://github.com/haproxy/haproxy -[60]: https://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html -[61]: http://ath.sourceforge.net/ -[62]: https://code.google.com/archive/p/ath/ -[63]: https://github.com/omnigroup/Apache/blob/master/httpd/modules/proxy/mod_proxy_balancer.c -[64]: https://www.inlab.net/balance/ -[65]: https://sourceforge.net/projects/balance/ -[66]: http://distributor.sourceforge.net/ -[67]: https://sourceforge.net/projects/distributor/files/ -[68]: https://github.blog/2016-09-22-introducing-glb/ -[69]: https://github.com/github/glb-director -[70]: https://neutrinoslb.github.io/ -[71]: https://github.com/eBay/Neutrino -[72]: http://openloba.sourceforge.net/ -[73]: https://sourceforge.net/p/openloba/code/HEAD/tree/ -[74]: http://siag.nu/pen/ -[75]: https://github.com/UlricE/pen -[76]: https://opensource.google.com/projects/seesaw -[77]: https://github.com/google/seesaw -[78]: https://synapse.apache.org/ -[79]: https://github.com/apache/synapse/tree/master -[80]: https://traefik.io/ -[81]: https://github.com/containous/traefik -[82]: http://bakerstreet.io/ -[83]: https://github.com/datawire/bakerstreet -[84]: https://www.consul.io/ -[85]: https://github.com/hashicorp/consul -[86]: https://etcd.io/ -[87]: https://github.com/etcd-io/etcd -[88]: https://gliderlabs.github.io/registrator/latest/ -[89]: https://github.com/gliderlabs/registrator -[90]: https://www.serf.io/ -[91]: https://github.com/hashicorp/serf -[92]: https://zookeeper.apache.org/ -[93]: https://github.com/apache/zookeeper -[94]: https://en.wikipedia.org/wiki/Top_(software) -[95]: https://www.opennms.com/ -[96]: https://github.com/OpenNMS/opennms -[97]: https://grafana.com -[98]: https://github.com/grafana/grafana -[99]: https://graphiteapp.org/ -[100]: https://github.com/graphite-project -[101]: https://icinga.com/ -[102]: https://github.com/icinga/ -[103]: https://www.influxdata.com/ -[104]: https://github.com/influxdata/influxdb -[105]: https://www.librenms.org/ -[106]: https://github.com/librenms/librenms -[107]: http://www.naemon.org/ -[108]: https://github.com/naemon -[109]: https://www.nagios.org/ -[110]: https://github.com/NagiosEnterprises/nagioscore -[111]: https://www.ntop.org/ -[112]: https://github.com/ntop/ntopng -[113]: https://www.elastic.co/ -[114]: https://github.com/elastic -[115]: https://prometheus.io/ -[116]: https://github.com/prometheus/prometheus -[117]: https://sensu.io/ -[118]: https://github.com/sensu -[119]: https://www.zabbix.com/ -[120]: https://git.zabbix.com/projects/ZBX/repos/zabbix/browse -[121]: https://www.zenoss.com/ -[122]: https://sourceforge.net/projects/zenoss/ diff --git a/sources/tech/20191108 Managing software and services with Cockpit.md b/sources/tech/20191108 Managing software and services with Cockpit.md deleted file mode 100644 index c2039de262..0000000000 --- a/sources/tech/20191108 Managing software and services with Cockpit.md +++ /dev/null @@ -1,129 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Managing software and services with Cockpit) -[#]: via: (https://fedoramagazine.org/managing-software-and-services-with-cockpit/) -[#]: author: (Shaun Assam https://fedoramagazine.org/author/sassam/) - -Managing software and services with Cockpit -====== - -![][1] - -The Cockpit series continues to focus on some of the tools users and administrators can use to perform everyday tasks within the web user-interface. So far we’ve covered [introducing the user-interface][2], [storage][3] and [network management][4], and [user accounts][5]. Hence, this article will highlight how Cockpit handles software and services. - -The menu options for Applications and Software Updates are available through Cockpit’s PackageKit feature. To install it from the command-line, run: - -``` -sudo dnf install cockpit-packagekit -``` - -For [Fedora Silverblue][6], [Fedora CoreOS][7], and other ostree-based operating systems, install the _cockpit-ostree_ package and reboot the system: - -``` -sudo rpm-ostree install cockpit-ostree; sudo systemctl reboot -``` - -### Software updates - -On the main screen, Cockpit notifies the user whether the system is updated, or if any updates are available. Click the **Updates Available** link on the main screen, or **Software Updates** in the menu options, to open the updates page. - -#### RPM-based updates - -The top of the screen displays general information such as the number of updates and the number of security-only updates. It also shows when the system was last checked for updates, and a button to perform the check. Likewise, this button is equivalent to the command **sudo dnf check-update**. - -Below is the **Available Updates** section, which lists the packages requiring updates. Furthermore, each package displays the name, version, and best of all, the severity of the update. Clicking a package in the list provides additional information such as the CVE, the Bugzilla ID, and a brief description of the update. For details about the CVE and related bugs, click their respective links. - -Also, one of the best features about Software Updates is the option to only install security updates. Distinguishing which updates to perform makes it simple for those who may not need, or want, the latest and greatest software installed. Of course, one can always use [Red Hat Enterprise Linux][8] or [CentOS][9] for machines requiring long-term support. - -The example below demonstrates how Cockpit applies RPM-based updates. - -![][10] - -#### OSTree-based updates - -The popular article [What is Silverblue][11] states: - -> OSTree is used by rpm-ostree, a hybrid package/image based system… It atomically replicates a base OS and allows the user to “layer” the traditional RPM on top of the base OS if needed. - -Because of this setup, Cockpit uses a snapshot-like layout for these operating systems. As seen in the demo below, the top of the screen displays the repository (_fedora_), the base OS image, and a button to **Check for Updates**. - -Clicking the repository name (_fedora_ in the demo below) opens the **Change Repository** screen. From here one can **Add New Repository**, or click the pencil icon to edit an existing repository. Editing provides the option to delete the repository, or **Add Another Key**. To add a new repository, enter the name and URL. Also, select whether or not to **Use trusted GPG key**. - -There are three categories that provide details of its respective image: Tree, Packages, and Signature. **Tree** displays basic information such as the operating system, version of the image, how long ago it was released, and the origin of the image. **Packages** displays a list of installed packages within that image. **Signature** verifies the integrity of the image such as the author, date, RSA key ID, and status. - -The current, or running, image displays a green check-mark beside it. If something happens, or an update causes an issue, click the **Roll Back and Reboot** button. This restores the system to a previous image. - -![][12] - -### Applications - -The **Applications** screen displays a list of add-ons available for Cockpit. This makes it easy to find and install the plugins required by the user. At the time of this article, some of the options include the 389 Directory Service, Fleet Commander, and Subscription Manager. The demo below shows a complete list of available Cockpit add-ons. - -Also, each item displays the name, a brief description, and a button to install, or remove, the add-on. Furthermore, clicking the item displays more information (if available). To refresh the list, click the icon at the top-right corner. - -![][13] - -### Subscription Management - -Subscription managers allow admins to attach subscriptions to the machine. Even more, subscriptions give admins control over user access to content and packages. One example of this is the famous [Red Hat subscription model][14]. This feature works in relation to the **subscription-manager** command - -The Subscriptions add-on can be installed via Cockpit’s Applications menu option. It can also be installed from the command-line with: - -``` -sudo dnf install cockpit-subscriptions -``` - -To begin, click **Subscriptions** in the main menu. If the machine is currently unregistered, it opens the **Register System** screen. Next, select the URL. You can choose **Default**, which uses Red Hat’s subscription server, or enter a **Custom URL**. Enter the **Login**, **Password**, **Activation Key**, and **Organization** ID. Finally, to complete the process, click the **Register** button. - -The main page for Subscriptions show if the machine is registered, the System Purpose, and a list of installed products. - -![][15] - -### Services - -To start, click the **Services** menu option. Because Cockpit uses _[systemd][16]_, we get the options to view **System Services**, **Targets**, **Sockets**, **Timers**, and **Paths**. Cockpit also provides an intuitive interface to help users search and find the service they want to configure. Services can also be filtered by it’s state: **All**, **Enabled**, **Disabled**, or **Static**. Below this is the list of services. Each row displays the service name, description, state, and automatic startup behavior. - -For example, let’s take _bluetooth.service_. Typing _bluetooth_ in the search bar automatically displays the service. Now, select the service to view the details of that service. The page displays the status and path of the service file. It also displays information in the service file such as the requirements and conflicts. Finally, at the bottom of the page, are the logs pertaining to that service. - -Also, users can quickly start and stop the service by toggling the switch beside the service name. The three-dots to the right of that switch expands those options to **Enable**, **Disable**, **Mask/Unmask** the service - -To learn more about _systemd_, check out the series in the Fedora Magazine starting with [What is an init system?][17] - -![][18] - -In the next article we’ll explore the security features available in Cockpit. - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/managing-software-and-services-with-cockpit/ - -作者:[Shaun Assam][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/sassam/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/11/cockpit-sw-services-816x345.jpg -[2]: https://fedoramagazine.org/cockpit-and-the-evolution-of-the-web-user-interface/ -[3]: https://fedoramagazine.org/performing-storage-management-tasks-in-cockpit/ -[4]: https://fedoramagazine.org/managing-network-interfaces-and-firewalld-in-cockpit/ -[5]: https://fedoramagazine.org/managing-user-accounts-with-cockpit/ -[6]: https://silverblue.fedoraproject.org/ -[7]: https://getfedora.org/en/coreos/ -[8]: https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux?intcmp=701f2000001OEGhAAO -[9]: https://www.centos.org/ -[10]: https://fedoramagazine.org/wp-content/uploads/2019/11/cockpit-software-updates-rpm.gif -[11]: https://fedoramagazine.org/what-is-silverblue/ -[12]: https://fedoramagazine.org/wp-content/uploads/2019/11/cockpit-software-updates-ostree.gif -[13]: https://fedoramagazine.org/wp-content/uploads/2019/11/cockpit-applications.gif -[14]: https://www.redhat.com/en/about/value-of-subscription -[15]: https://fedoramagazine.org/wp-content/uploads/2019/11/cockpit-subscriptions.gif -[16]: https://fedoramagazine.org/series/systemd-series/ -[17]: https://fedoramagazine.org/what-is-an-init-system/ -[18]: https://fedoramagazine.org/wp-content/uploads/2019/11/cockpit-services.gif diff --git a/sources/tech/20191110 How to Create Affinity and Anti-Affinity Policy in OpenStack.md b/sources/tech/20191110 How to Create Affinity and Anti-Affinity Policy in OpenStack.md deleted file mode 100644 index 8e65ed8a02..0000000000 --- a/sources/tech/20191110 How to Create Affinity and Anti-Affinity Policy in OpenStack.md +++ /dev/null @@ -1,214 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Create Affinity and Anti-Affinity Policy in OpenStack) -[#]: via: (https://www.linuxtechi.com/create-affinity-anti-affinity-policy-openstack/) -[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/) - -How to Create Affinity and Anti-Affinity Policy in OpenStack -====== - -In the organizations where the **OpenStack** is used aggressively, so in such organizations application and database teams can come up with requirement that their application and database instances are required to launch either on same **compute nodes** (hypervisor) or different compute nodes. - -[![OpenStack-VMs-Affinity-AntiAffinity-Policy][1]][2] - -So, this requirement in OpenStack is fulfilled via **server groups** with **affinity** and **anti-affinity** policies. Server Group is used control affinity and anti-affinity rules for scheduling openstack instances. - -When we try to provision virtual machines with affinity server group then all virtual machines will be launched on same compute node. When VMs are provisioned with ant-affinity server group then all VMs will be launched in different compute nodes. In this article we will demonstrate how to create OpenStack server groups with Affinity and Anti-Affinity rules. - -Let’s first verify whether your OpenStack setup support Affinity and Anti-Affinity Policies or not, execute the following grep command from your controller nodes, - -``` -# grep -i "scheduler_default_filters" /etc/nova/nova.conf -``` - -Output should be something like below, - -![Affinity-AntiAffinity-Filter-Nova-Conf-OpenStack][1] - -As we can see Affinity and Ant-Affinity filters are enabled but in case if these are not enabled then add these filters in **/etc/nova/nova.conf**  file of controller nodes under “**scheduler_default_filters**” parameters. - -``` -# vi /etc/nova/nova.conf -……………… -scheduler_default_filters=xx,xxx,xxx,xxxxx,xxxx,xxx,xxx,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,xx,xxx,xxxx,xx -……………… -``` - -Save and exit the file - -To make above changes into the effect, restart the following services - -``` -# systemctl restart openstack-nova-scheduler -# systemctl restart openstack-nova-conductor -``` - -Now let’s create OpenStack Server Groups with Affinity and Anti-Affinity Policies - -### Server Group with Affinity Policy - -To create a server group with name “app” for affinity policy, execute the following openstack command from controller node, - -**Syntax:** - -# openstack server group create –policy affinity <Server-Group-Name> - -Or - -# nova server-group-create <Server-Group-Name> affinity - -**Note:** Before start executing openstack command, please make sure you source project credential file, in my case project credential file is “**openrc**” - -Example: - -``` -# source openrc -# openstack server group create --policy affinity app -``` - -### Server Group with Anti-Affinity Policy - -To create a server group with anti-affinity policy, execute the following openstack command from controller node, I am assuming server group name is “database” - -**Syntax:** - -# openstack server group create –policy anti-affinity <Server-Group-Name> - -Or - -# nova server-group-create <Server-Group-Name> anti-affinity - -Example: - -``` -# source openrc -# openstack server group create --policy anti-affinity database -``` - -### List Server Group’s ID and Policies - -Execute either nova command or Openstack command to get server group’s id and their policies - -``` -# nova server-group-list | grep -Ei "Policies|database" -Or -# openstack server group list --long | grep -Ei "Policies|app|database" -``` - -Output would be something like below, - -![Server-Group-Policies-OpenStack][1] - -### [Launch Virtual Machines (VMs)][3] with Affinity Policy - -Let’s assume we want to launch 4 vms with affinity policy, run the following “**openstack server create**” command - -**Syntax:** - -# openstack server create –image <img-name> –flavor <id-or-flavor-name> –security-group <security-group-name> –nic net-id=<network-id> –hint group=<Server-Group-ID> –max <number-of-vms>  <VM-Name> - -**Example:** - -``` -# openstack server create --image Cirros --flavor m1.small --security-group default --nic net-id=37b9ab9a-f198-4db1-a5d6-5789b05bfb4c --hint group="a9847c7f-b7c2-4751-9c9a-03b117e704ff" --max 4 affinity-test -``` - -Output of above command, - -![OpenStack-Server-create-with-hint-option][1] - -Let’s verify whether VMs are launched on same compute node or not, run following command - -``` -# openstack server list --long -c Name -c Status -c Host -c "Power State" | grep -i affinity-test -``` - -![Affinity-VMs-Status-OpenStack][1] - -This confirms that our affinity policy is working fine as all the VMs are launched on same compute node. - -Now let’s test anti-affinity policy - -### Launch Virtual Machines (VMs) with Anti-Affinity Policy - -For anti-affinity policy we will launch 4 VMs, in above ‘openstack server create’ command, we need to replace Anti-Affinity Server Group’s ID. In our case we will be using database server group id. - -Run the following openstack command to launch 4 VMs on different computes with anti-affinity policy, - -``` -# openstack server create --image Cirros --flavor m1.small --security-group default --nic net-id=37b9ab9a-f198-4db1-a5d6-5789b05bfb4c --hint group="498fd41b-8a8a-497a-afd8-bc361da2d74e" --max 4 anti-affinity-test -``` - -Output - -![Openstack-server-create-anti-affinity-hint-option][1] - -Use below openstack command to verify whether VMs are launched on different compute nodes or not - -``` -# openstack server list --long -c Name -c Status -c Host -c "Power State" | grep -i anti-affinity-test -``` - -![Anti-Affinity-VMs-Status-OpenStack][1] - -Above output confirms that our anti-affinity policy is also working fine. - -**Note:** Default Quota for Server group is 10 for every tenant , it means we can max launch 10 VMs inside a server group. - -Use below command to view Server Group quota for a specific tenant, replace the tenant id that suits to your setup - -``` -# openstack quota show f6852d73eaee497a8a640757fe02b785 | grep -i server_group -| server_group_members | 10 | -| server_groups | 10 | -# -``` - -To update Server Group Quota, execute the following commands - -``` -# nova quota-update --server-group-members 15 f6852d73eaee497a8a640757fe02b785 -# nova quota-update --server-groups 15 f6852d73eaee497a8a640757fe02b785 -``` - -Now re-run the openstack quota command to verify server group quota - -``` -# openstack quota show f6852d73eaee497a8a640757fe02b785 | grep -i server_group -| server_group_members | 15 | -| server_groups | 15 | -# -``` - -That’s all, we have successfully updated Server Group quota for the tenant. This conclude the article as well, please do hesitate to share it among your technical friends. - - * [Facebook][4] - * [Twitter][5] - * [LinkedIn][6] - * [Reddit][7] - - - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/create-affinity-anti-affinity-policy-openstack/ - -作者:[Pradeep Kumar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/pradeep/ -[b]: https://github.com/lujun9972 -[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[2]: https://www.linuxtechi.com/wp-content/uploads/2019/11/OpenStack-VMs-Affinity-AntiAffinity-Policy.jpg -[3]: https://www.linuxtechi.com/create-delete-virtual-machine-command-line-openstack/ -[4]: http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.linuxtechi.com%2Fcreate-affinity-anti-affinity-policy-openstack%2F&t=How%20to%20Create%20Affinity%20and%20Anti-Affinity%20Policy%20in%20OpenStack -[5]: http://twitter.com/share?text=How%20to%20Create%20Affinity%20and%20Anti-Affinity%20Policy%20in%20OpenStack&url=https%3A%2F%2Fwww.linuxtechi.com%2Fcreate-affinity-anti-affinity-policy-openstack%2F&via=Linuxtechi -[6]: http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.linuxtechi.com%2Fcreate-affinity-anti-affinity-policy-openstack%2F&title=How%20to%20Create%20Affinity%20and%20Anti-Affinity%20Policy%20in%20OpenStack -[7]: http://www.reddit.com/submit?url=https%3A%2F%2Fwww.linuxtechi.com%2Fcreate-affinity-anti-affinity-policy-openstack%2F&title=How%20to%20Create%20Affinity%20and%20Anti-Affinity%20Policy%20in%20OpenStack diff --git a/sources/tech/20191111 3 approaches to secrets management for Flatpak applications.md b/sources/tech/20191111 3 approaches to secrets management for Flatpak applications.md deleted file mode 100644 index fd33e978f4..0000000000 --- a/sources/tech/20191111 3 approaches to secrets management for Flatpak applications.md +++ /dev/null @@ -1,133 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (3 approaches to secrets management for Flatpak applications) -[#]: via: (https://opensource.com/article/19/11/secrets-management-flatpak-applications) -[#]: author: (Daiki Ueno https://opensource.com/users/ueno) - -3 approaches to secrets management for Flatpak applications -====== -Flatpak secrets management is getting an upgrade. Here's what's coming. -![A top secret file.][1] - -[Flatpak][2] enables desktop applications to run in isolated sandboxes, which significantly improves security as it prevents applications from affecting one another and impacting the host system. In practice, however, typical applications still need to access services and user data that are shared among other applications and the host. This situation has been improved [by hardening permissions around the portal mechanism][3], though there was a long-standing issue: How to manage user secrets. - -In this article, we present our approach to managing user secrets for Flatpak applications. While most applications can transparently take advantage of the proposed mechanism, some applications need code modification. The migration steps are also presented. - -### How secrets are managed on the Linux desktop - -On a modern Linux desktop, most of the secrets—passwords, tokens, and so on, with their associated attributes—are centrally managed by the daemon process **gnome-keyring-daemon**. Applications access this daemon through [the Secret Service API][4], which is exposed through D-Bus. This process is done under the hood if the application is using a client library like **libsecret**.  - -**Note:** For the same purpose, there is a library called **libgnome-keyring**, which is now obsolete. Note that, despite the name, **libgnome-keyring** is a separate project from **gnome-keyring**, which is NOT obsolete and still maintains the central role of secrets management. - -On the daemon side, the secrets are stored on the filesystem and encrypted. Other than that, the daemon is nothing but a normal storage service, meaning that any application can store data on arbitrary "paths" that other applications can also see. While this model is sufficient as long as we trust all applications, it negates one of Flatpak’s security goals: [Increase the security of desktop systems by isolating applications from one another][5]. - -Therefore, when installing a Flatpak application that uses the Secret Service API, the user is asked to grant the necessary permissions to the application. In the example below, you can see that the application requires access to the Secret Service API (**org.freedesktop.secrets**). If the user doesn’t want to allow this application to access the service, their only option is to forfeit installation: - - -``` -$ flatpak install org.gnome.Epiphany -… -org.gnome.Epiphany permissions: -        ipc                     network         pulseaudio      wayland -        x11                     dri             file access [1] dbus access [2] -        system dbus access [3] - -        [1] xdg-download, xdg-run/dconf, ~/.config/dconf:ro -        [2] ca.desrt.dconf, org.freedesktop.Notifications, org.freedesktop.secrets -        [3] org.freedesktop.GeoClue2 -Proceed with these changes to the Default system installation? [Y/n]: -``` - -This is clearly an undesirable outcome. - -### The local storage approach - -The basic idea to tackle this problem is to store the secrets on the application side, rather than the host side (**gnome-keyring-daemon**). This practice is analogous to [the recent work on GSettings][6], where applications store the settings data in a local file instead of in a [**dconf**][7] service running on the host. - -When it comes to secrets, however, there is a bootstrapping problem: The application has to encrypt secrets when storing them in a local file, but it doesn’t know the encryption key yet. To provision the application with an encryption key, we rely on the [Flatpak portal][8] mechanism, which sits between the application and the host to let the two communicate through a restricted interface. - -We also added [a new portal][9] that allows applications to retrieve encryption keys. First, the application sends a request to the portal (the request contains a Unix file descriptor where the encryption key is written). Then, the portal delegates the request to the back-end implementation in **gnome-keyring-daemon**, which sends a unique encryption key for the sandboxed application through the file descriptor. - -With the received encryption key, the application encrypts the secrets and stores them in the application data directory (**~/.var/app/$APPID/data/keyrings**), which is **bind**-mounted and accessible from both the host and the sandbox. - -### The libsecret API - -The **libsecret** project provides two different sets of APIs. One is [the simple API][10], and the other is [the complete API][11]. The former provides simpler, stateless operations for retrieving and storing secrets, while the latter provides a more complete, object-oriented API that maps the D-Bus interface to the C API. - -Local storage is only supported in the simple API. If your applications are already using the simple API, then they will automatically use local storage when running under Flatpak. Otherwise, to enable local storage, the applications need to be ported to the simple API. See [the migration patch in Epiphany][12] as an example. - -Having a distinction between the two API sets also makes it possible for the applications to opt-out from using local storage. For example, if your application is a password manager that needs full access to user keyrings, you can bypass local storage by using the complete API. - -### The keyring format - -Although ideally, we should be able to use the same keyring format for both local storage and **gnome-keyring-daemon**, we realized that the keyring format used by **gnome-keyring-daemon** has limitations. Secrets, including associated attributes, are encrypted as a single chunk, meaning that they can consume an unnecessary amount of locked memory. Also, attributes are hashed without a key, meaning that it is possible to guess which secrets are stored in the file. - -Therefore, instead of implementing this format in two places, we decided to define a new version of the keyring file format, with the following characteristics: Secrets are encrypted individually and attribute hashes are now a [message authentication code (MAC)][13] over the attributes. - -This new format is based on [the][14] [GVariant serialization format][14], except for the header, and this change allows us to reuse most of the code for encoding, decoding, and lookup. - -### What's next for Flatpak secrets management - -The necessary patches are (currently) only available in the Git repositories of the relevant components (**xdg-desktop-portal**, **gnome-keyring**, and **libsecret**). They will be included in the next releases leading up to GNOME 3.36. - -If you are a developer, there is still room for improvement in this area. Here is where your help would be greatly appreciated: - - * **Session keyrings:** The Secret Service API supports "session" keyrings, which only last for the duration of the user session. The local storage backend doesn’t support this feature yet. This code could be implemented using the session keyring in the Linux kernel. - - * **Management and backup application:** Application secrets are now stored in multiple locations, and not just the host keyrings. It would be useful if there were a tool to manage application secrets and make backups. This process should be possible by enhancing GNOME’s Seahorse to look at application secrets. - - * **Online accounts portal:** These days, it is common for web applications to be integrated with web-based access delegation protocols such as OAuth 2.0. These protocols are supported by **gnome-online-accounts**, which in turn uses **gnome-keyring-daemon** for storing the tokens. A portal interface for online accounts would be useful for restricting access per application. - - * **Wider adoption of the new keyring format:** While the new format has several advantages, it is currently only used by **libsecret** on the application side. It would be beneficial if **gnome-keyring-daemon** on the host side also used the same format. - - * **Hardening the reinstall process:** By default, the application’s keyring file (**~/.var/app/$APPID/data/keyrings**) persists after uninstall, along with other data. This persistence is vulnerable in case the application ID is reused by an untrusted publisher. Currently, we recommend using the **\--delete-data** option to ensure that such application data is removed. This procedure could be improved if a publisher’s ID was associated with the application. - - - - -### Summary - -This article presented a mechanism to provision Flatpak applications with user secrets. This mechanism was designed based on the following principles: - - * Minimize the host interface. - * Let applications interact with the host through a Flatpak portal. - * Store the application data in a common data format. - - - -Although the mechanism is transparent, as long as you use **libsecret**, the mechanism is only enabled through **libsecret**’s simple API. For a smoother transition, we suggest migrating applications to this API. More information about the project’s background and the design rationale is available in the GUADEC presentation ([slides][15], [recording][16]). - -Fragmentation is a longstanding Achilles heel for the Linux desktop. In a world of myriad... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/secrets-management-flatpak-applications - -作者:[Daiki Ueno][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/ueno -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/topsecret_folder_file_security.jpg?itok=y0P2GC5K (A top secret file.) -[2]: https://opensource.com/article/19/10/how-build-flatpak-packaging -[3]: https://blog.tingping.se/2019/10/06/hardening-flatpak-permissions.html -[4]: https://specifications.freedesktop.org/secret-service/ -[5]: http://docs.flatpak.org/en/latest/sandbox-permissions.html#sandbox-permissions -[6]: https://blogs.gnome.org/mclasen/2019/07/12/settings-in-a-sandbox-world/ -[7]: https://wiki.gnome.org/Projects/dconf -[8]: https://flatpak.github.io/xdg-desktop-portal/portal-docs.html -[9]: https://github.com/flatpak/xdg-desktop-portal/pull/359 -[10]: https://developer.gnome.org/libsecret/unstable/simple.html -[11]: https://developer.gnome.org/libsecret/unstable/complete.html -[12]: https://gitlab.gnome.org/GNOME/epiphany/commit/ed514f3ef43b323c51fb539274bef9dce0907ff2 -[13]: https://en.wikipedia.org/wiki/Message_authentication_code -[14]: https://people.gnome.org/~desrt/gvariant-serialisation.pdf -[15]: https://people.gnome.org/~dueno/libsecret-guadec.pdf -[16]: https://guadec.ubicast.tv/videos/desktop-secrets-management-for-the-future/ diff --git a/sources/tech/20191111 Bash Script to Monitor Disk Space Usage on Multiple Remote Linux Systems With eMail Alert.md b/sources/tech/20191111 Bash Script to Monitor Disk Space Usage on Multiple Remote Linux Systems With eMail Alert.md deleted file mode 100644 index 136748169d..0000000000 --- a/sources/tech/20191111 Bash Script to Monitor Disk Space Usage on Multiple Remote Linux Systems With eMail Alert.md +++ /dev/null @@ -1,200 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Bash Script to Monitor Disk Space Usage on Multiple Remote Linux Systems With eMail Alert) -[#]: via: (https://www.2daygeek.com/linux-bash-script-to-monitor-disk-space-usage-on-multiple-remote-linux-systems-send-email/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -Bash Script to Monitor Disk Space Usage on Multiple Remote Linux Systems With eMail Alert -====== - -Some time ago, we had wrote **[Bash script to monitor disk space usage on a Linux][1]** system with an email alert. - -That script works on a single machine, and you have to put the script on the corresponding machine. - -If you want to set disk space usage alerts on multiple computers at the same time, that script does not help you. - -So we have written this new **[shell script][2]** to achieve this. - -To do so, you need a JUMP server (centralized server) that can communicate with any other computer without a password. - -This means that password-less authentication must be set as a prerequisite. - -When the prerequisite is complete, run the script on the JUMP server. - -Finally add a **[cronjob][3]** to completely automate this process. - -Three shell scripts are included in this article, and choose the one you like. - -### 1) Bash Script-1: Bash Script to Check Disk Space Usage on Multiple Remote Linux Systems and Print Output on Terminal - -This **[bash script][4]** checks the disk space usage on a given remote machine and print the output to the terminal if the system reaches the specified threshold. - -In this example, we set the threshold limit to 80% for testing purpose and you can adjust this limit to suit your needs. - -Also, replace your email id instead of us to receive this alert. - -``` -# vi /opt/scripts/disk-usage-multiple.sh - -#!/bin/sh -output1=/tmp/disk-usage.out -echo "---------------------------------------------------------------------------" -echo "HostName Filesystem Size Used Avail Use% Mounted on" -echo "---------------------------------------------------------------------------" -for server in `more /opt/scripts/servers.txt` -do -output=`ssh $server df -Ph | tail -n +2 | sed s/%//g | awk '{ if($5 > 80) print $0;}'` -echo "$server: $output" >> $output1 -done -cat $output1 | grep G | column -t -rm $output1 -``` - -Run the script file once you have added the above script to a file. - -``` -# sh /opt/scripts/disk-usage-multiple.sh -``` - -You get an output like the one below. - -``` ------------------------------------------------------------------------------------------------- -HostName Filesystem Size Used Avail Use% Mounted on ------------------------------------------------------------------------------------------------- -server01: /dev/mapper/vg_root-lv_red 5.0G 4.3G 784M 85 /var/log/httpd -server02: /dev/mapper/vg_root-lv_var 5.8G 4.5G 1.1G 81 /var -server03: /dev/mapper/vg01-LogVol01 5.7G 4.5G 1003M 82 /usr -server04: /dev/mapper/vg01-LogVol04 4.9G 3.9G 711M 85 /usr -server05: /dev/mapper/vg_root-lv_u01 74G 56G 15G 80 /u01 -``` - -### 2) Shell Script-2: Shell Script to Monitor Disk Space Usage on Multiple Remote Linux Systems With eMail Alerts - -This shell script checks the disk space usage on a given remote machine and sends the output via a mail in a simple text once the system reaches the specified threshold. - -``` -# vi /opt/scripts/disk-usage-multiple-1.sh - -#!/bin/sh -SUBJECT="Disk Usage Report on "`date`"" -MESSAGE="/tmp/disk-usage.out" -MESSAGE1="/tmp/disk-usage-1.out" -TO="[email protected]" -echo "---------------------------------------------------------------------------------------------------" >> $MESSAGE1 -echo "HostName Filesystem Size Used Avail Use% Mounted on" >> $MESSAGE1 -echo "---------------------------------------------------------------------------------------------------" >> $MESSAGE1 -for server in `more /opt/scripts/servers.txt` -do -output=`ssh $server df -Ph | tail -n +2 | sed s/%//g | awk '{ if($5 > 80) print $0;}'` -echo "$server: $output" >> $MESSAGE -done -cat $MESSAGE | grep G | column -t >> $MESSAGE1 -mail -s "$SUBJECT" "$TO" < $MESSAGE1 -rm $MESSAGE -rm $MESSAGE1 -``` - -Run the script file once you have added the above script to a file. - -``` -# sh /opt/scripts/disk-usage-multiple-1.sh -``` - -You get an output like the one below. - -``` ------------------------------------------------------------------------------------------------- -HostName Filesystem Size Used Avail Use% Mounted on ------------------------------------------------------------------------------------------------- -server01: /dev/mapper/vg_root-lv_red 5.0G 4.3G 784M 85 /var/log/httpd -server02: /dev/mapper/vg_root-lv_var 5.8G 4.5G 1.1G 81 /var -server03: /dev/mapper/vg01-LogVol01 5.7G 4.5G 1003M 82 /usr -server04: /dev/mapper/vg01-LogVol04 4.9G 3.9G 711M 85 /usr -server05: /dev/mapper/vg_root-lv_u01 74G 56G 15G 80 /u01 -``` - -Finally add a cronjob to automate this. It will run every 10 minutes. - -``` -# crontab -e - -*/10 * * * * /bin/bash /opt/scripts/disk-usage-multiple-1.sh -``` - -### 3) Bash Script-3: Bash Script to Monitor Disk Space Usage on Multiple Remote Linux Systems With eMail Alerts - -This shell script checks the disk space usage on a given remote machine and sends the output via the mail with a CSV file if the system reaches the specified threshold. - -``` -# vi /opt/scripts/disk-usage-multiple-2.sh - -#!/bin/sh -MESSAGE="/tmp/disk-usage.out" -MESSAGE2="/tmp/disk-usage-1.csv" -echo "Server Name, Filesystem, Size, Used, Avail, Use%, Mounted on" > $MESSAGE2 -for server in thvtstrhl7 thvrhel6 -for server in `more /opt/scripts/servers-disk-usage.txt` -do -output1=`ssh $server df -Ph | tail -n +2 | sed s/%//g | awk '{ if($5 > 80) print $0;}'` -echo "$server $output1" >> $MESSAGE -done -cat $MESSAGE | grep G | column -t | while read output; -do -Sname=$(echo $output | awk '{print $1}') -Fsystem=$(echo $output | awk '{print $2}') -Size=$(echo $output | awk '{print $3}') -Used=$(echo $output | awk '{print $4}') -Avail=$(echo $output | awk '{print $5}') -Use=$(echo $output | awk '{print $6}') -Mnt=$(echo $output | awk '{print $7}') -echo "$Sname,$Fsystem,$Size,$Used,$Avail,$Use,$Mnt" >> $MESSAGE2 -done -echo "Disk Usage Report for `date +"%B %Y"`" | mailx -s "Disk Usage Report on `date`" -a /tmp/disk-usage-1.csv [email protected] -rm $MESSAGE -rm $MESSAGE2 -``` - -Run the script file once you have added the above script to a file. - -``` -# sh /opt/scripts/disk-usage-multiple-2.sh -``` - -You get an output like the one below. - -![][5] - -Finally add a cronjob to automate this. It will run every 10 minutes. - -``` -# crontab -e - -*/10 * * * * /bin/bash /opt/scripts/disk-usage-multiple-1.sh -``` - -**Note:** Because the script is scheduled to run once every 10 minutes, you will receive an email alert every 10 minutes. - -If your system reaches a given limit after 18 minutes, you will receive an email alert on the second cycle, such as after 20 minutes (2nd 10 minute cycle). - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/linux-bash-script-to-monitor-disk-space-usage-on-multiple-remote-linux-systems-send-email/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/linux-shell-script-to-monitor-disk-space-usage-and-send-email/ -[2]: https://www.2daygeek.com/category/shell-script/ -[3]: https://www.2daygeek.com/crontab-cronjob-to-schedule-jobs-in-linux/ -[4]: https://www.2daygeek.com/category/bash-script/ -[5]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 diff --git a/sources/tech/20191111 The Top Nine Open Source Cloud Management Platforms.md b/sources/tech/20191111 The Top Nine Open Source Cloud Management Platforms.md deleted file mode 100644 index 7801a465d0..0000000000 --- a/sources/tech/20191111 The Top Nine Open Source Cloud Management Platforms.md +++ /dev/null @@ -1,302 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The Top Nine Open Source Cloud Management Platforms) -[#]: via: (https://opensourceforu.com/2019/11/the-top-nine-open-source-cloud-management-platforms/) -[#]: author: (Dr Anand Nayyar https://opensourceforu.com/author/anand-nayyar/) - -The Top Nine Open Source Cloud Management Platforms -====== - -[![][1]][2] - -_A cloud management platform (CMP) is a comprehensive software suite with integrated tools that an enterprise can use to monitor and control cloud computing resources. There are many CMPs out there, both open source and proprietary. This article explores how cloud platforms work, their capabilities, as well as a selection of the top open source cloud platforms of the day._ - -In recent times, all the enterprises that have started or have adopted cloud computing face new challenges with regard to ensuring the same visibility in cloud applications as they have with their on-premise apps. With any cloud-based full implementation, the issues that users face include preserving the integrity, usability and security of all the data migrated online. According to John Webster, senior partner and analyst for the Evaluator Group, and whose research area is the hybrid cloud and Big Data, “As enterprise IT operations start to expand our capabilities and resources into the cloud, we now want to manage cloud resources with the same policy, procedure, guidance and expectations that we have over our existing IT environment.” - -The only solution to all the issues arising from cloud-based implementations is a cloud management platform (CMP). This provides a rich set of capabilities for discovery, template-based provisioning, orchestration and automation. It also enables operational monitoring and management, governance and cost optimisation across multiple public and private clouds as well as virtual and bare-metal servers. - -A CMP is a comprehensive suite with integrated software tools that an enterprise can use to monitor and control cloud computing resources. An enterprise can use a CMP for either a private or public cloud, but CMPs facilitate toolsets for hybrid and multi-cloud models to centralise the control of various cloud-based infrastructures. - -A wide range of tools is available to deal with these challenges and help companies efficiently operate applications and services in the cloud. Vendors offer a variety of cloud management tools that enable IT organisations to build, purchase, manage, monitor, track and optimise their cloud resources. With the help of these tools, organisations can save time and effort while allowing IT staff to focus on more strategic goals. These tools also help in monitoring users’ interactions with the cloud infrastructure and in managing resource allocation. - -In the cloud marketplace, different tools have unique feature sets. Capabilities include unified management across multiple clouds, integration with third-party tools for configuration and monitoring purposes, dashboards and reports for detailed information about resource consumption, notifications and alerts when predefined thresholds are reached, and controlled access to resources to avoid over usage or unauthorised access. By simplifying the management of cloud environments and reducing the complexity and cost of managing multiple activities, the right cloud management tool can bring speed, flexibility, security and cost efficiency to any organisation. - -![Figure 1: Cloudstack architecture][3] - -So the important question is, “Which CMP is the best?” Well, there are both commercial and open source options. Nowadays, open source technology has become a central facet of cloud computing for many users around the world. In this article, we discuss the top open source cloud management platforms to assist admins, systems analysts, network security as well as cloud computing professionals select the best platform, based on the requirements of the enterprise. - -Before we dive into the types of open source CMPs, let’s discuss some of their broad capabilities and how they work. - -According to analysis by Market Research Future (MRF), the global CMP market was valued at US$ 8.18 billion in 2018 and is expected to reach US$ 26.77 billion by 2022, registering a CAGR of 18.4 per cent during the forecast period. The market growth is attributed to the rising need for enterprises to have greater control over IT spending, the surge in the adoption of heterogeneous and multi-modal IT service delivery environments, the rapid deployment of virtualised workloads, and improved operational efficiency. On the other hand, insufficient technical expertise and the rising security concerns for platforms developed in-house are some of the factors expected to hinder the market growth during the assessment period. - -**How cloud management platforms work** -A CMP is deployed into existing cloud environments as a virtual machine (VM) consisting of a database and server. The server communicates with application programming interfaces (APIs) to connect the database and virtual resources held in the cloud. The database collects the information on how the virtual infrastructure is performing and sends an analysis to the Web interface, where systems administrators can analyse the cloud performance. The whole interconnectivity relies on the operating system, which commands all the different technologies that make up clouds and also deploys cloud management tools. - -A CMP should be capable of the following things. - - * **Strong integration with IT infrastructure:** CMPs should be customised as per the enterprise’s needs, and must meet the requirements of the operating systems, apps, storage frameworks and anything else running in the cloud. - * **Automating manual tasks:** CMPs should have self-service capabilities to automate everything, with no human involvement. - * **Cost management:** CMPs should assist organisations with precision cost forecasting and reporting to easily use and manage all sorts of cloud services. - * **Service management:** They should assist the IT team to monitor cloud-based services to help in capacity planning, workload deployment, asset management and incident management. - * **Governance and security:** CMPs should enable administrators to enforce policy-based control of cloud resources, and offer security features like encryption as well as identity and access management. - - - -**Top open source CMPs** -The following are the top open source cloud management platform providers. - -**Apache CloudStack** -Apache CloudStack is an open source, multi-hypervisor, multi-tenant, high-availability Infrastructure-as-a-Service CMP, which facilitates creating, deploying and managing cloud services by providing a complete stack of features and components for cloud environments. It uses existing hypervisors such as KVM, VMware vSphere, VMware ESXi, VMware vCenter and XenServer/XCP for virtualisation. CloudStack can also orchestrate the non-technical elements of service delivery such as billing and metering. It presents a range of APIs, allowing it to be integrated with any other platform. - -The main components of CloudStack are: - - 1. Compute nodes (CNs), which are servers when VM instances are instantiated. - 2. A cluster, which is composed of several CNs that share the same hypervisor and primary storage system. - 3. Pod is a rack of hardware including Layer-2 switches and one or more clusters. It is responsible for storing the VM files, which represent the primary storage. - 4. The Availability Zone is made up of one or more pods, with secondary storage forming a zone. This is equivalent to a single data centre, representing geographic allocations. The secondary storage stores VM templates, ISO images and disk volume snapshots. - 5. The management server is a single point of configuration that provides Web user interfaces and APIs, and manages the assignment of VM instances to particular hosts and of public and private IP addresses to particular accounts, as well as the allocation of storage. - - - -_**Features**_ - - * _Self-service user interface:_ AJAX console access, multi-role support, network virtualisation, hypervisor agnostic, usage metering, virtual routers. - * _LVM support:_ Block storage volumes, NetScaler support, OpenStack Swift integration, LDAP integration, domains and delegated administration. - - - -_**Official website:**_ __ -_**Latest version:**_ 4.12.0.0 - -![Figure 2: Openstack components][4] - -**OpenStack** -OpenStack consists of a set of software tools for building and managing cloud computing platforms for public and private clouds using pooled virtual resources. The tools comprising the OpenStack platform are called projects. They handle core cloud computing services of compute, networking, storage, identity and image services. OpenStack software controls large pools of compute, storage and networking resources throughout a data centre, and is managed through a dashboard or via the OpenStack API. - -OpenStack consists of the following nine components. - - * **Nova:** This is the primary computing engine used for deploying and managing a large number of virtual machines and instances to handle computing tasks. - * **Swift:** This is a storage system for objects and files. - * **Cinder:** This is a persistent block storage component for compute instances. - * **Neutron:** This provides networking capability so that all components can communicate quickly. - * **Horizon:** This is a GUI interface for OpenStack. - * **Keystone:** This provides identity services for OpenStack. - * **Glance:** This provides image services and allows images (virtual copies of hard disks) to be used as templates for deploying new virtual machine instances. - * **Ceilometer:** This provides telemetry services, and billing services to individuals. - * **Heat:** This is an orchestration component that allows developers to store the requirements of cloud applications in files. - - - -_**Features**_ - - * _Services:_ Messaging, clustering, containers, compute, identity, app data protection as a service, events, metadata indexing as service, workflows, DNS, database as a service, bare metal provisioning, optimisation and deployment, governance, and benchmarking. - * Web front-end, Big Data processing framework, container orchestration engine, key management, and NFV orchestration. - - - -_**Official website:** _ -**Latest version:** Stein - -**ManageIQ** -This is an open source CMP for hybrid IT environments, with a mix of public and private clouds. It provides tools for managing small and large environments as well as supports multiple technologies like virtual machines, public clouds and containers. It allows users to download any virtual appliance and deploy copies of it into virtualisation platforms like OpenStack or VMware. Three main variants of ManageIQ are available: Vagrant, Docker and Public Cloud. - -ManageIQ is written in Ruby and uses the Ruby on Rails framework. The ManageIQ software is shipped as a pre-built virtual appliance, roughly 1GB in size. The appliance is based on the CentOS operating system and includes an embedded PostgreSQL database. Since the Darga release, a container based version has also been made available. An appliance can be used on its own, or it can be part of a three-tier federated architecture. In the latter case, the operator configures zones, regions and a single super-region. Appliances can be assigned to a specific zone or region and are configured with specific roles so that work is coordinated within the region. Most roles are multi-master and distribute work automatically in a queue, but some roles like the database are singletons. - -**Features** - - * Offers insights through discovery, monitoring, utilisation, performance, reporting, analytics, chargeback and trending. - * Controls security, compliance, alerting, policy-based resource and configuration management. - * Automates IT processes, tasks and events, provisioning, workload management and orchestration. - * Integrates systems management, tools and processes, event consoles, CMDB, RBA and Web services. - - - -_**Official website:** _ -**Latest version:** Hammer-10 - -**Cloudify** -Cloudify is an open source software cloud and NFV orchestration product that uses OASIS TOSCA technology. It is designed using Python. Cloudify allows users to model and automate an application’s entire life cycle. This includes deployment to a cloud or data centre environment, the management of the deployed application, failure detection and ongoing maintenance. The platform is ideal for users who want to launch prebuilt applications in the cloud without handling the technical aspects. - -_**How it works:**_ It translates applications into a blueprint configuration written in the YAML format and describes how the application should be deployed, managed and automated. It identifies the resources and events for every application tier. The cloud orchestrator uses blueprints to install applications in the cloud using a cloud API, which creates VMs and installs Cloudify agents, and is used to orchestrate, install and start the application. Cloudify monitors the application for any pre-defined metrics and displays results on the dashboard. - -Cloudify enables users to deploy applications using two main methods — by using the CLI and by using a Cloudify manager. The latter is a dedicated environment comprising an open source stack which enables the user to: - - * Use plugins (such as Docker, Script, Chef and Puppet plugins) to manage application hosts. - * Keep a directory of the user’s blueprints. - * Create multiple deployments for each blueprint and install them. - * Execute healing, scaling and other custom workflows on installed applications. - * Run multiple workflows concurrently. - * View an application’s topology. - * Perform different tasks using the Cloudify Web UI view metrics. - - - -Cloudify performs the following tasks. - - * _Application modelling:_ This describes the application with all its resources. - * _Orchestration:_ This maintains and runs an application, and performs ongoing operations such as scaling, healing and maintenance. - * _Pluggability:_ This provides reusable component abstraction for the system. - * _Security:_ This provides secure communication via SSL, which enables clients to ensure that the data set received is encrypted. - - - -_**Features**_ -Easy orchestration, built-in node types, a blueprints catalogue, role-based access control, IT security and governance, network and TOSCA orchestration, new NFV capabilities, custom widgets and LDAP integration. - -_**Official website:**_ -_**Latest version:**_ 5.0 - -**Mist.io** -Mist.io is a platform that simplifies cloud management and helps users prevent vendor and complexity lock-in. It offers cost and usage reporting, RBAC, management, provisioning, orchestration, monitoring and automation for servers across public and private clouds, Docker containers and KVM hypervisors. It gives actionable alerts so users can address operational issues from anywhere, using any Web-connected device. - -Mist.io offers a unified interface for performing common management tasks like provisioning, orchestration, monitoring and automation. It works from any device, including laptops, tablets and phones, to help users take action from where ever they are. Due to the RESTful API and command line tools, it’s easy to integrate it in the user’s existing workflow. Because Mist.io abstracts the infrastructure level, users can replicate the entire setup across providers in a matter of seconds. It’s a freemium service with an open source component that aims to become the de facto standard for multi-cloud management and a broker of cloud computing services. It’s targeted at developers, systems administrators and any organisation that performs on-premise, remote, or hybrid computing. - -_**Features**_ - - * Controls public and private clouds, containers, bare metal servers and more. - * Has fine grained controls for delegating access to team members. - * Enables cost and usage reporting across the whole infrastructure. - * Orchestrates repeatable deployments, and automates common responses. - * Enforces policies consistently, across any computing platform. - - - -_**Official website:** _ - -**VirtEngine** -VirtEngine is an open source CMP that can be used to build private or public clouds, which support IaaS, PaaS and SaaS. This Platform as a Service system allows customers to deploy applications in a few clicks. VirtEngine has a wide range of applications and a simple user interface for customers to self-serve their needs. It helps users build both public and private clouds within very little time, and supports infrastructure platforms and other storage devices. It is also very scalable and comes with automation tools that provide companies a competitive advantage. VirtEngine by DET.io is available as two different solutions for the public and private cloud. The public cloud allows users to build their own cloud and offer servers to customers. It is available as a mini edition as well as a complete solution. The private cloud is available as an open source and free solution as well as a powerful solution for enterprises that supports HA and other enterprise features. - -_**Features**_ - - * Access control, demand and supply monitoring, cost management, multi-cloud management, one-click apps, and automatic launch. - * DNS support, self-healing, cloud-native, multi-locations, Docker containers, cloud virtual machines and migration tools. - - - -_**Official website:**_ __ - -![Figure 3: OpenNebula components][5] - -**openQRM** -openQRM is a free and open source cloud computing management platform for managing heterogeneous data centre infrastructures. It provides a complete, automated workflow engine for all bare metal and VM deployment, as well as for all IT sub-systems, enabling professional management and monitoring of the data centre and cloud capacities. The openQRM platform manages a data centre’s infrastructure to build private, public and hybrid Infrastructure as a Service clouds. openQRM orchestrates storage, networks, virtualisation, monitoring and security implementation technologies to deploy multi-tier services as virtual machines on distributed infrastructures, combining both data centre resources and remote cloud resources, according to allocation policies. - -openQRM provides a Web-based, open source data centre management and cloud platform with the help of which various internal and external technologies can be abstracted and grouped within a common management tool. This management system also takes care of provisioning, high availability and the monitoring of services offered. Instead of providing individual tools for individual tasks, such as configuration management and system monitoring, openQRM integrates proven open source management tools such as Nagios and Zabbix. - -_**Architecture:**_ The openQRM system architecture comprises three components — data centre management and cloud platform, the plugin API, and the hybrid cloud connector. - -The data centre management and cloud platform provides the basic functionality of openQRM, and uses the plugin API to communicate with the data centre’s resources that are also installed on the local network (hypervisor, storage and network). openQRM comes with support for five virtualisation environments — VMware ESX, Citrix XenServer, KVM, LXC and OpenVZ. - -openQRM can handle LVM, iSCSI, NFS, ATA over Ethernet, SAN Boot and Tmpfs storage. For the network configuration, openQRM integrates critical network services such as DNS, DHCP, TFTP and Wake-on-LAN. The network manager included with the package helps administrators configure the network bridges required for these services. The hybrid cloud connector takes care of connecting with external data centre resources, such as Amazon Web Services, Eucalyptus, or OpenStack cloud. -The openQRM cloud portal provides a Web interface that internal or external users can access to compile IT resources, as needed. - -_**Features**_ - - * Supports P2V, P2P, V2P, V2V migrations and high availability. - * Integrates with all major open and commercial storage technologies. - * Integrated billing system that maps CCU/h (cloud computing units) to real currency. - * Self-service portal for end users provisions new servers and application stacks in minutes! - - - -_**Official website:** _ - -**OpenNebula** -OpenNebula is a simple yet powerful and flexible turnkey open source solution to build private clouds and manage data centre virtualisation. The OpenNebula platform manages a data centre’s virtual infrastructure to build private, public and hybrid implementations of Infrastructure as a Service. The two primary uses of the OpenNebula platform are data centre virtualisation solutions and cloud infrastructure solutions. - -OpenNebula was designed to help companies build simple, cost-effective, reliable, open enterprise clouds on existing IT infrastructure. It provides flexible tools that orchestrate storage, network and virtualisation technologies to enable the dynamic placement of services. The design of OpenNebula is flexible and modular, to allow integration with different storage and network infrastructure and hypervisor technologies. - -OpenNebula components include the following three layers: - -1\. The driver layer is responsible for the creation, start-up and shutdown of virtual machines (VMs), for allocating storage to VMs, and for monitoring the operational status of physical machines (PMs). -2\. The core layer manages the VMs’ full life cycle, including setting up virtual networks dynamically, dynamic IP address allocation for VMs and managing VMs’ storage. -3\. The tool layer provides interfaces, such as the command line interface (CLI), to communicate with users. - -_**Features**_ - - * Supports numerous APIs like AWS EC2, EBS and OGF OCCI. - * Powerful UNIX based CLI for administration. - * GUI for cloud customers and data centre professionals. - * Resource allocation via fine-grained ACLs; load balancing, high availability, high performance computing. - * Powerful scheduling for task management. - * Supports integration with LDAP and Active directory. - * Supports SSH and X.509 for security, and even supports login token functionality. - - - -_**Official website:** _ -_**Latest version:**_ 5.8.4 - -**Eucalyptus** -Eucalyptus is an acronym for Elastic Utility Computing Architecture for Linking Your Programs to Useful Systems. It is an open source software framework that provides the platform for private cloud computing implementation on computer clusters. Eucalyptus implements Infrastructure as a Service (IaaS) methodology for solutions in private and hybrid clouds. - -Eucalyptus provides a platform for a single interface so that users can calculate the resources available in private clouds and the resources available externally in public cloud services. It is designed with extensible and modular architecture for Web services. It also implements the industry standard Amazon Web Services (AWS) API. - -![Figure 4: Eucalyptus architecture][6] - -The Eucalyptus user console provides an interface for users to provision and configure compute, network and storage resources on their own. Eucalyptus can run multiple versions of Windows and Linux virtual machine images. Users can build a library of Eucalyptus machine images (EMIs) with application metadata that is decoupled from infrastructure details to allow them to run on Eucalyptus clouds. - -Amazon Machine Images are also compatible with Eucalyptus clouds. VMware images and vApps can be converted to run on Eucalyptus clouds and AWS public clouds. Eucalyptus user identity management can be integrated with existing Microsoft Active Directory or LDAP systems to have fine-grained role-based access control over cloud resources. Eucalyptus supports storage area network devices to take advantage of storage arrays, thus improving performance and reliability. Eucalyptus machine images can be backed by EBS-like persistent storage volumes, improving the performance of image launch time and enabling fully persistent virtual machine instances. Eucalyptus also supports direct-attached storage. - -_**Architecture:**_ The Eucalyptus architecture has the following five main components. - - * **Cloud controller (CLC):** CLC acts as the administrative interface for cloud management and performs high-level resource scheduling and system accounting. The CLC accepts user API requests from command-line interfaces like euca2ools or GUI-based tools like the Eucalyptus management console, and manages the underlying computer storage and network resources. - * **Scalable object storage (SOS):** This is a pluggable service that allows infrastructure administrators the flexibility to implement scale-out storage on top of commodity resources using open source and commercial solutions that implement the S3 interface. - * **Cluster controller (CC):** Written in C, this acts as the front-end for clusters within the Eucalyptus cloud and communicates with the storage and node controllers. - * **Storage controller (SC):** Written in Java, this communicates with the cluster controller and the node controller, managing Eucalyptus block volumes and snapshots to instances within its specific cluster. It interfaces with storage systems including Local, NFS, iSCSI and SAN. - * **Node controller (NC):** This is written in C, hosts the virtual machine instances and manages the virtual network endpoints. It caches images from scalable object storage, and creates and caches instances. - - - -_**Features**_ - - * Works with multiple hypervisors including VMware, Xen and KVM. - * Communication within internal processes is secured through SOAP and WS-Security. - * Offers administrative features such as user and group management, and reports. - * Well-defined interfaces (via WSDL, since they are Web services) and thus can be easily swapped out for custom components. - * Flexible and can be installed on a very minimal setup. - - - -_**Official website:** _ -_**Latest version:**_ 4.4.3 - -![Avatar][7] - -[Dr Anand Nayyar][8] - -The author works in a Graduate School, Duy Tan University in -Vietnam. He loves to work and research on open source technologies, -sensor communications, network security, Internet of Things etc. He -can be reached at [anandnayyar@duytan.edu.vn][9]. YouTube channel: -Gyaan with Anand Nayyar at [www.youtube.com/anandnayyar][10]. - -[![][11]][12] - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/11/the-top-nine-open-source-cloud-management-platforms/ - -作者:[Dr Anand Nayyar][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/anand-nayyar/ -[b]: https://github.com/lujun9972 -[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Young-man-with-the-head-in-the-clouds-thinking_15259762_xl.jpg?resize=505%2C487&ssl=1 (Young-man-with-the-head-in-the-clouds-thinking_15259762_xl) -[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Young-man-with-the-head-in-the-clouds-thinking_15259762_xl.jpg?fit=505%2C487&ssl=1 -[3]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-1-CloudStack-architecture.jpg?resize=350%2C250&ssl=1 -[4]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-2-OpenStack-components.jpg?resize=350%2C226&ssl=1 -[5]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-3-OpenNebula-components.jpg?resize=350%2C196&ssl=1 -[6]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-4-Eucalyptus-architecture.jpg?resize=350%2C241&ssl=1 -[7]: https://secure.gravatar.com/avatar/ab87a2bd63788f386c2d815c0f7d2d29?s=100&r=g -[8]: https://opensourceforu.com/author/anand-nayyar/ -[9]: mailto:anandnayyar@duytan.edu.vn -[10]: http://www.youtube.com/anandnayyar -[11]: https://opensourceforu.com/wp-content/uploads/2019/11/assoc.png -[12]: https://feedburner.google.com/fb/a/mailverify?uri=LinuxForYou&loc=en_US diff --git a/sources/tech/20191111 Understanding -disk space math.md b/sources/tech/20191111 Understanding -disk space math.md deleted file mode 100644 index fbbe9d3aa7..0000000000 --- a/sources/tech/20191111 Understanding -disk space math.md +++ /dev/null @@ -1,124 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Understanding “disk space math”) -[#]: via: (https://fedoramagazine.org/understanding-disk-space-math/) -[#]: author: (Pat Kelly https://fedoramagazine.org/author/tablepc/) - -Understanding “disk space math” -====== - -![][1] - -Everything in a PC, laptop, or server is represented as binary digits (a.k.a. _bits,_ where each bit can only be 1 or 0). There are no characters like we use for writing or numbers as we write them anywhere in a computer’s memory or secondary storage such as disk drives. For general purposes, the unit of measure for groups of binary bits is the byte — eight bits. Bytes are an agreed-upon measure that helped standardize computer memory, storage, and how computers handled data. - -There are various terms in use to specify the capacity of a disk drive (either magnetic or electronic). The same measures are applied to a computers random access memory (RAM) and other memory devices that inhabit your computer. So now let’s see how the numbers are made up. - -Suffixes are used with the number that specifies the capacity of the device. The suffixes designate a multiplier that is to be applied to the number that preceded the suffix. Commonly used suffixes are: - - * Kilo = 103 = 1,000 (one thousand) - * Mega = 106 = 1,000,000 (one million) - * Giga = 109 = 1000,000,000 (one billion) - * Tera = 1012 = 1,000,000,000,000 (one trillion) - - - -As an example 500 GB (gigabytes) is 500,000,000,000 bytes. - -The units that memory and storage are specified in  advertisements, on boxes in the store, and so on are in the decimal system as shown above. However since computers only use binary bits, the actual capacity of these devices is different than the advertised capacity. - -You saw that the decimal numbers above were shown with their equivalent powers of ten. In the binary system numbers can be represented as powers of two. The table below shows how bits are used to represent powers of two in an 8 bit Byte. At the bottom of the table there is an example of how the decimal number 109 can be represented as a binary number that can be held in a single byte of 8 bits (01101101). - -Eight bit binary number | | | | | | | | ----|---|---|---|---|---|---|---|--- -| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 -Power of 2 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 -Decimal Value | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 -Example Number | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 - -The example bit values comprise the binary number 01101101. To get the equivalent decimal value just add the decimal values from the table where the bit is set to 1. That is 64 + 32 + 8 + 4 + 1 = 109. - -By the time you get out to 230 you have decimal 1,073,741,824 with just 31 bits (don’t forget the 20) You’ve got a large enough number to start specifying memory and storage sizes. - -Now comes what you have been waiting for. The table below lists common designations as they are used for labeling decimal and binary values. - -Decimal - -| - -Binary - ----|--- - -KB (Kilobyte) - -1KB = 1,000 bytes - -| - -KiB (Kibibyte) - -1KiB = 1,024 bytes - -MB (Megabyte) - -1MB = 1,000,000 bytes - -| - -MiB (Mebibyte) - -1MiB = 1,048,576 bytes - -GB (Gigabyte) - -1GB = 1,000,000,000 bytes - -| - -GiB (Gibibyte) - -1 GiB (Gibibyte) = 1,073,741,824 bytes - -TB (Terabyte) - -1TB = 1,000,000,000,000 - -| - -TiB (Tebibyte) - -1TiB = 1,099,511,627,776 bytes - -Note that all of the quantities of bytes in the table above are expressed as decimal numbers. They are not shown as binary numbers because those numbers would be more than 30 characters long. - -Most users and programmers need not be concerned with the small differences between the binary and decimal storage size numbers. If you’re developing software or hardware that deals with data at the binary level you may need the binary numbers. - -As for what this means to your PC: Your PC will make use of the full capacity of your storage and memory devices. If you want to see the capacity of your disk drives, thumb drives, etc, the Disks utility in Fedora will show you the actual capacity of the storage device in number of bytes as a decimal number. - -There are also command line tools that can provide you with more flexibility in seeing how your storage bytes are being used. Two such command line tools are [_du_][2] (for files and directories) and [_df_][3] (for file systems). You can read about these by typing _man du_ or _man df_ at the command line in a terminal window. - -* * * - -*Photo by _[_Franck V._][4]_ on *[_Unsplash_][5]. - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/understanding-disk-space-math/ - -作者:[Pat Kelly][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/tablepc/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/11/disk-space-math-816x345.jpg -[2]: https://linux.die.net/man/1/du -[3]: https://linux.die.net/man/1/df -[4]: https://unsplash.com/@franckinjapan?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText -[5]: https://unsplash.com/s/photos/math?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20191112 8 great podcasts for open source enthusiasts.md b/sources/tech/20191112 8 great podcasts for open source enthusiasts.md deleted file mode 100644 index c0d249d754..0000000000 --- a/sources/tech/20191112 8 great podcasts for open source enthusiasts.md +++ /dev/null @@ -1,99 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (8 great podcasts for open source enthusiasts) -[#]: via: (https://opensource.com/article/19/11/open-source-podcasts) -[#]: author: (Don Watkins https://opensource.com/users/don-watkins) - -8 great podcasts for open source enthusiasts -====== -Expand your knowledge about Linux, Python, and open source generally -while you're doing other things. -![Woman programming][1] - -Where I live, almost everything is a 20- or 30-minute drive from my home, and I'm always looking for ways to use my car time productively. One way is by listening to podcasts on topics that interest me, so as an open source enthusiast, I subscribe to a variety of open source-related podcasts. - -Here are eight Linux and open source podcasts that I Iook forward to every week. - -### Linux4Everyone - -[Linux4Everyone][2] by Jason Evangelho (whom I [recently interviewed][3]) is a favorite. The podcasts always offer fresh insights on Linux along with thoughtful interviews, including his conversations with [Barton George][4] of Dell and [Christopher Scott][5] of Microsoft. Jason's only been at this gig for a few months, but he already has a loyal following supporting him on Patreon. - -I have recently been listening to [**Command Line Heroes**][6]. Its host, Saron Yitbarek, is a developer and the founder of [CodeNewbie][7]. I've learned about how [C and Unix][8] laid important groundwork for the development and growth of Linux, as well as the evolution of the [Python community][9]—which will continue since founder Guido Van Rossum stepped down from his benevolent dictatorship role. - -### Linux Headlines - -[Linux Headlines][10] from [Jupiter Broadcasting][11] never fails to pique my interest in what's happening in the Linux world. Hosts [Chris Fisher][12], [Joe Ressington][13], [Wes Payne][14], and [Drew Davore][15] are always dishing up the latest developments that inspire me to learn and explore more. If you only have a few minutes to spare, this podcast is for you. - -### Self-Hosted - -[Self-Hosted][16] is a new podcast about home networks that hooked me immediately. With all the emphasis on containers and the cloud, you might think your local network doesn't have much to offer anymore. Hosts [Alex Kretzschmar][17] and Chris Fisher are two longtime self-hosters who share their learnings with listeners. - -### Online Life is Real Life - -In [Online Life is Real Life][18], sponsored by Firefox, "host [Manoush Zomorodi][19] shares real stories of life online and real talk about the future of the web." A recent show, "[Privacy or Profit—Why Not Both?][20]," dug into the concept that "privacy" means different things to different people. Do you know how your personal data is being used? Do you care? If so, this podcast might interest you. - -### The Changelog - -[The Changelog][21] bills itself as "conversations with the hackers, leaders, and innovators of software development." In a recent episode, [Chris Anderson][22], former editor-in-chief of _Wired_, shared how his hobby with drones started out terribly wrong but led him to 3D robotics, do-it-yourself drones, and the [Dronecode][23] project. - -### Destination Linux - -[Destination Linux][24], where "Linux is our passion," is a weekly show hosted by [Ryan][25], [Michael][26], [Zebediah][27], and [Noah][28]. The show started in 2017, and all of its content is licensed under Creative Commons 4.0 ShareAlike. One recent podcast focused on the addition of ZFS to Ubuntu 19.10 and how Project Trident ditched FreeBSD for Linux. - -### Talk Python to Me - -[Talk Python To Me][29] with host [Michael Kennedy][30] keeps me growing on my Python learning curve. - -In one of my favorite shows, "[Python in digital humanities research][31]," Michael interviewed Cornelius Van Lit, a medieval Islamic philosophy scholar, who is using Python to parse ancient manuscripts. - -Most of these podcasts come with show notes, which include links to the content they cover. Since I can't take notes when I'm driving, the show notes help me review what I hear and learn more about the topics mentioned. - -I am always eager to learn, so please share your favorite open source-related podcasts in the comments section. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/open-source-podcasts - -作者:[Don Watkins][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/don-watkins -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop-music-headphones.png?itok=EQZ2WKzy (Woman programming) -[2]: https://linuxforeveryone.fireside.fm/ -[3]: https://opensource.com/article/19/9/found-linux-video-gaming -[4]: https://twitter.com/barton808?lang=en -[5]: https://opensource.com/article/19/10/trust-linux-community -[6]: https://www.redhat.com/en/command-line-heroes -[7]: https://www.codenewbie.org/ -[8]: https://opensource.com/article/19/10/command-line-heroes-c -[9]: https://opensource.com/article/19/6/command-line-heroes-python -[10]: https://linuxheadlines.show/ -[11]: https://opensource.com/article/19/10/linux-podcasts-Jupiter-Broadcasting -[12]: https://twitter.com/ChrisLAS -[13]: https://twitter.com/JoeRessington -[14]: https://twitter.com/wespayne?lang=en -[15]: https://twitter.com/drewofdoom -[16]: https://selfhosted.show/ -[17]: https://twitter.com/ironicbadger?lang=en -[18]: https://irlpodcast.org/ -[19]: https://twitter.com/manoushz -[20]: https://irlpodcast.org/season5/episode7/ -[21]: https://changelog.com/podcast -[22]: https://twitter.com/chr1sa -[23]: https://www.dronecode.org/ -[24]: https://destinationlinux.org/ -[25]: https://destinationlinux.org/ryan/#contact -[26]: https://twitter.com/michaeltunnell?lang=en -[27]: https://twitter.com/zebedeeboss -[28]: https://destinationlinux.org/noah/ -[29]: https://talkpython.fm/ -[30]: https://twitter.com/mkennedy?lang=en -[31]: https://talkpython.fm/episodes/show/230/python-in-digital-humanities-research diff --git a/sources/tech/20191114 Creating Custom Themes in Drupal 8.md b/sources/tech/20191114 Creating Custom Themes in Drupal 8.md deleted file mode 100644 index f2ebf73568..0000000000 --- a/sources/tech/20191114 Creating Custom Themes in Drupal 8.md +++ /dev/null @@ -1,229 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Creating Custom Themes in Drupal 8) -[#]: via: (https://opensourceforu.com/2019/11/creating-custom-themes-in-drupal-8/) -[#]: author: (Bhanu Prakash Poluparthi https://opensourceforu.com/author/bhanu-poluparthi/) - -Creating Custom Themes in Drupal 8 -====== - -[![][1]][2] - -_A theme in a website is a set of files that defines the overall look and the user experience of a website. It usually comprises all the graphical elements such as colours and window decorations that help the user to customise the website. Drupal provides the user with a bunch of basic themes for a website that are very generic. However, these default themes do not suit all types of users. So there is a need to build themes that meet one’s requirements._ - -Creating and customising themes in Drupal 8 is easy because of a modern template engine for PHP named Twig, which is a part of the Symfony 2 framework. Moving from a PHP template to Twig, and from the INI format to YAML, are some of the main changes in Drupal 8 theming. These changes in Drupal 8 have improved the security and inheritance, making theming more distinguished. - -With reference to Figure 1, - - * _.info_ provides information about your theme. - * _html.tpl.php_ displays the basic HTML structure of a single Drupal page. - * _page.tpl.php_ is the main template that defines the contents on most of the pages. - * _style.css_ is the CSS file that sets the CSS rules for the template. - * _node.tpl.php_ defines the contents of the nodes. - * _block.tpl.php_ defines the contents in the blocks. - * _comment.tpl.php_ defines the contents in the comments. - * _Template.php_ is used to hold preprocessors for generating variables before they are merged with the markup inside .tpl.php files. - * _Theme-settings.php_ is used to modify the entire theme settings form. - * _.libraries.yml_ defines your libraries (mostly your JS, CSS files). - * _.breakpoints.yml_ defines the points to fit different screen devices. - * _.theme_ is the PHP file that stores conditional logic and data preprocessing of the variables before they are merged with markup inside the .html.twig file. - * _/includes_ is where third-party libraries (like Bootstrap, Foundation, Font Awesome, etc) are put. It is a standard convention to store them in this folder. - - - -The basic requirement to create a new Drupal theme is to have Drupal localhost installed on your system. - -![Figure 1: Drupal 7 theme structure \(https://www.drupal.org/docs/7/theming/ overview-of-theme-files\)][3] - -**Drupal 8 theme structure** -A custom theme can be made by following the steps mentioned below. - -_**Step 1: Creating the custom themes folder**_ -Go to the Drupal folder in which you can find a folder named Theme. - - * Enter the folder ‘theme’. - * Create a folder ‘custom’. - * Enter the folder ‘custom’. - * Create a folder ‘osfy’. - - - -Start creating your theme files over here. The theme name taken here is osfy. - -_**Step 2: Creating a YML file**_ -To inform the website about the existence of this theme, we use _.yml_ files. The basic details required in the YML are mentioned below: -1\. Name -2\. Description -3\. Type -4\. Core - -``` -name: osfy -description: My first responsive custom theme. -type: theme -package: custom -base theme: classy -core: 8.x - -regions: -head: head -header: header -content: content -sidebar: sidebar -footer: Footer - -Stylesheets-remove: --”Remove Stylesheets” -``` - -We can proceed once the theme appears in the uninstalled section of your website’s _Appearance_ tab. -Open the Drupal website and check for the new theme in the _Appearance_ section. It will be under the uninstalled list of themes in the _Appearance_ tab. - -**Note:** 1\. Base theme indicates which base theme your custom theme is going to inherit. The default base theme provided by Drupal is ‘Stable’. - -2\. Regions defines the regions in which your blocks are to be placed in your theme. If not declared, Drupal uses default regions from the core. - ---- - -_**Step 3: Adding the .libraries.yml file:**_ -We have indicated all the libraries comprising JavaScript and CSS styling, and now we will define them in the _libraries.yml_ file. - -``` -global-components: -version: 1.x -css: -theme: -css/style.css: {} -includes/bootstrap/css/bootstrap.css: {} -``` - -We will use _style.css_ for the theme styling and bootstrap.css for responsive display using Bootstrap libraries. Style.css resides in the core/css folder, whereas bootstrap.css resides in the _includes/bootstrap/css_ folder. - -![Figure 2: Drupal 8 theme structure][4] - -_**Step 4: Creating theme regions**_ -To better understand how Twig has made things easier, use the following code: - -``` - - -

            - -

            - - -{{ title_prefix }} -{% if title %} -

            -{{ title }} -

            -{% endif %} -``` - -The template file functions are: - -_html.html.twig_ – Theme implementation for the basic structure of a single page -_page.html.twig_ – Theme implementation to display a single page -_node.html.twig_ – Default theme implementation to display a node -_region.html.twig_ – Default theme implementation to display a region -_block.html.twig_ – Default theme implementation to display a block -_field.html.twig_ – Theme implementation for a field - -To create the page.html.twig file, give the following commands: - -``` -/** -* @file -* Default theme implementation to display a single page. -* -* example code for basic header, footer and content page -**/ - -
            -{% if page.head %} - -{% endif %} - -
            -
            -
            -
            -{{ page.content }} -
            -{% if page.sidebar %} - -{% endif %} -
            -
            -
            -{% if page.footer %} -
            -
            -{{ page.footer }} -
            -
            -{% endif %} -
            -``` - -_**Step 5: Enabling the theme**_ -To place content in the respective regions, in the Manage administrative menu, navigate to _Structure > Block layout > Custom block library (admin/structure/block/block-content)_. Click Add custom block. The Add custom block page appears. Fill in the fields and click on _Save_. -The block design used here is as in Figure 2. - -**A few more things to do** - - * Place a _logo.svg_ file in the theme folder. Drupal will look for it by default and enable the logo for the theme. - * To show your theme picture in the admin interface next to your theme name, place an image screenshot.png in your theme directory itself. - * Use your creativity from here onwards to style and customise the appearance of your theme. - * While writing the code for Twig files, remember to comment all the important information for future reference. - - - -To make your theme work on your Drupal localhost, go to _/admin/appearance_ where you can find the theme ‘osfy’. Choose the option ‘Set as default’. - -You can start using your theme from now. - -![Avatar][5] - -[Bhanu Prakash Poluparthi][6] - -The author is an open source enthusiast and has been a part of -the Drupal organisation since 2017. He was an intern at Google -Summer of Code 2017 and a mentor at Google Code-In 2018. - -[![][7]][8] - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/11/creating-custom-themes-in-drupal-8/ - -作者:[Bhanu Prakash Poluparthi][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/bhanu-poluparthi/ -[b]: https://github.com/lujun9972 -[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/d8-1.jpg?resize=696%2C397&ssl=1 (d8) -[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/d8-1.jpg?fit=788%2C449&ssl=1 -[3]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-1-Drupal-7-theme-structure.jpg?resize=350%2C308&ssl=1 -[4]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Screenshot-from-2019-11-14-16-13-53.png?resize=350%2C298&ssl=1 -[5]: https://secure.gravatar.com/avatar/a0a27865017dd4456f47f0a9e7d964a6?s=100&r=g -[6]: https://opensourceforu.com/author/bhanu-poluparthi/ -[7]: https://opensourceforu.com/wp-content/uploads/2019/11/assoc.png -[8]: https://feedburner.google.com/fb/a/mailverify?uri=LinuxForYou&loc=en_US diff --git a/sources/tech/20191115 PyRadio- An open source alternative for internet radio.md b/sources/tech/20191115 PyRadio- An open source alternative for internet radio.md deleted file mode 100644 index 85dd5f2296..0000000000 --- a/sources/tech/20191115 PyRadio- An open source alternative for internet radio.md +++ /dev/null @@ -1,106 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (PyRadio: An open source alternative for internet radio) -[#]: via: (https://opensource.com/article/19/11/pyradio) -[#]: author: (Lee Tusman https://opensource.com/users/leeto) - -PyRadio: An open source alternative for internet radio -====== -Play your favorite internet radio stations—while keeping your personal -data private—with PyRadio. -![Stereo radio with dials][1] - -[PyRadio][2] is a convenient, open source, command-line application for playing any radio station that has a streaming link. And in 2019, almost every radio station (certainly, every one that has a web presence) has a way to listen online. Using the free PyRadio program, you can add, edit, play and switch between your own selected list of streaming radio stations. It is a command-line tool for Linux that can run on many computers, including Macintosh and tiny computers like Raspberry Pi. To some, a command-line client for playing music might sound needlessly complicated, but it's actually a simple alternative and one that serves as an instant text-based dashboard to easily select music to listen to. - -A little background about myself: I spend a lot of time browsing for and listening to new music on [Bandcamp][3], on various blogs, and even Spotify. I don't spend time casually listening to app *radio* stations, which are really algorithmically-generated continuous streams of similarly tagged music. Rather, I prefer listening to non-profit, college and locally-produced independent radio stations that are run by a community and don't rely on advertisements to sustain themselves. - -I have always been a huge fan of community radio, from Drexel University's great reggae weekends on WKDU; the uncanny experimental WFMU from Orange, N.J.; and WNYC's eclectic schedule, including New Sounds. In my college days, I was a DJ on Brandeis' WBRS 100.1FM, playing experimental electronic music on the show Frequency. And as recently as 2018, I helped manage the station managers and schedule for [KCHUNG Radio][4], an artist-run internet and low-power AM station run out of Chinatown, Los Angeles. - -![The PyRadio interface][5] - -Just as a car radio (in days of yore) had buttons with presets for the owner's favorite radio stations, PyRadio lets me create a very simple list of radio stations that I can easily turn on and switch between. Since I spend most days working, researching, or writing to music, it's become my go-to software for listening. In an era where many people are used to commercial streaming services like curated Spotify mood playlists or Pandora "stations," it's nice to be able to set my own radio stations from a variety of sources outside of a commercial app and sans additional advertising. - -Importantly, by not using commercial clients in the cloud, nothing is sending my user data or preferences to a company for whatever purposes they see fit. Nothing is collecting my preferences to build a profile to sell me more things. - -PyRadio just works, and it's easy to use. Like some other Linux software, the hardest part of using PyRadio is installing it. This tutorial will help you install and run PyRadio for the first time. It assumes some basic knowledge of the command line. If you have no experience working in the terminal, I recommend reading a beginner-friendly [introduction to the command line][6] first. - -### Installing PyRadio - -In the past, I've used the Python package installer [pip][7] to install PyRadio, but the latest version is not yet installable from pip, and I couldn't find a package on Homebrew for my Mac. On my laptop running Ubuntu, I really wanted the latest version of PyRadio for its excellent new features, but I couldn't find an installation on Apt. - -**[[Download our pip cheat sheet][8]]** - -To get the current version on these computers, I built it from source. You can download the latest release from [github.com/coderholic/pyradio/releases][9], and then unzip or [untar][10] it. Change directory into the PyRadio source folder, and you're ready to begin. - -Install the dependencies using your distribution's package manager (such as **dnf** on Fedora or **apt** on Ubuntu): - - * python3-setuptools - * git - * MPV, MPlayer, or VLC - - - -On a Mac, install [Git][11], [sed][12], and [MPlayer][13] dependencies using Homebrew: - - -``` -brew install git -brew install gnu-sed --default-names -brew install mplayer -``` - -Once all dependencies are resolved, run the installer script, using the argument **3** to indicate that you want PyRadio to build for Python3: - - -``` -`$ sh devel/build_install_pyradio 3` -``` - -The installation process takes about a minute. - -### Using and tweaking the station list - -To launch the application, just run **pyradio**. You can navigate up and down the default station list with the arrow or [Vim][14] keys and select a station with Enter. The artist name and track title currently streaming from the station should be displayed, if they are available. Typing **?** brings up a help text box that lists available commands. You can change the interface color themes with **t** or modify your configuration with **c**. - -Out of the box, PyRadio comes with an extensive list of internet streaming stations. But I wanted to add my favorite public radio and college radio stations to the list, as well as some online music playlists. You can find streaming URLs on your favorite radio stations' websites or by browsing online station directories such as [Shoutcast][15]. In particular, I recommend the variety of excellent stations from [Soma FM][16]. You'll need to input the station's streaming playlist file, a URL that ends in **.pls**. You can also enter direct links to streaming audio files, such as MP3s. - -The easiest way to add a station is to type **a**. PyRadio will ask you for the name of the station and its streaming URL, and you can press Enter to add it to your **stations** file. To delete any station, navigate to it and press **x**. You'll be prompted to confirm. The default station list is stored in **~/.config/pyradio/stations.csv**. The station list is a two-column CSV file with the station names and the stream URLs. - -![Adding a station to PyRadio][17] - -Those are the basics of PyRadio. You can find additional information in its [GitHub repo][18]. I hope you have many hours of audio enjoyment ahead of you. If you have any other PyRadio tips or suggestions for stations, please leave a comment below. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/pyradio - -作者:[Lee Tusman][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/leeto -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-lead-stereo-radio-music.png?itok=st66SdwS (Stereo radio with dials) -[2]: http://www.coderholic.com/pyradio/ -[3]: http://bandcamp.com -[4]: https://kchungradio.org/ -[5]: https://opensource.com/sites/default/files/interface_0.png (The PyRadio interface) -[6]: https://www.redhat.com/sysadmin/navigating-filesystem-linux-terminal -[7]: https://pypi.org/project/pip/ -[8]: https://opensource.com/article/19/11/introducing-our-python-pip-cheat-sheet -[9]: https://github.com/coderholic/pyradio/releases -[10]: https://opensource.com/article/17/7/how-unzip-targz-file -[11]: https://git-scm.com/ -[12]: https://www.gnu.org/software/sed/manual/sed.html -[13]: http://www.mplayerhq.hu/design7/news.html -[14]: https://www.vim.org/ -[15]: https://directory.shoutcast.com/ -[16]: https://somafm.com/ -[17]: https://opensource.com/sites/default/files/pyradio-add.png (Adding a station to PyRadio) -[18]: https://github.com/coderholic/pyradio diff --git a/sources/tech/20191116 Troubleshooting -E- Unable to locate package- Error on Ubuntu -Beginner-s Tutorial.md b/sources/tech/20191116 Troubleshooting -E- Unable to locate package- Error on Ubuntu -Beginner-s Tutorial.md deleted file mode 100644 index d386cdc24e..0000000000 --- a/sources/tech/20191116 Troubleshooting -E- Unable to locate package- Error on Ubuntu -Beginner-s Tutorial.md +++ /dev/null @@ -1,166 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Troubleshooting “E: Unable to locate package” Error on Ubuntu [Beginner’s Tutorial]) -[#]: via: (https://itsfoss.com/unable-to-locate-package-error-ubuntu/) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -Troubleshooting “E: Unable to locate package” Error on Ubuntu [Beginner’s Tutorial] -====== - -_**This beginner tutorial shows how to go about fixing the E: Unable to locate package error on Ubuntu Linux.**_ - -One of the [many ways of installing software in Ubuntu][1] is to use the [apt-get][2] or the [apt command][3]. You open a terminal and use the program name to install it like this: - -``` -sudo apt install package_name -``` - -Sometimes, you may encounter an error while trying to install application in this manner. The error reads: - -``` -sudo apt-get install package_name -Reading package lists... Done -Building dependency tree -Reading state information... Done -E: Unable to locate package package_name -``` - -The error is self explanatory. Your Linux system cannot find the package that you are trying to install. But why is it so? Why can it not find the package? Let’s see some of the actions you can take to fix this issue. - -### Fixing ‘Unable to locate package error’ on Ubuntu - -![][4] - -Let’s see how to troubleshoot this issue one step at a time. - -#### 1\. Check the package name (no, seriously) - -This should be the first thing to check. Did you make a typo in the package name? I mean, if you are trying to [install vlc][5] and you typed vcl, it will surely fail. Typos are common so make sure that you have not made any mistakes in typing the name of the package. - -#### 2\. Update the repository cache - -If this is the first time you are using your system after installing, you should run the update command: - -``` -sudo apt update -``` - -This command won’t [update Ubuntu][6] straightaway. I recommend to get through the [concept of Ubuntu repositories][7]. Basically, the ‘apt update’ command builds a local cache of available packages. - -When you use the install command, apt package manager searches the cache to get the package and version information and then download it from its repositories over the network. If the package is not in this cache, your system won’t be able to install it. - -When you have a freshly installed Ubuntu system, the cache is empty. This is why you should run the apt update command right after installing Ubuntu or any other distributions based on Ubuntu (like Linux Mint). - -Even if its not a fresh install, your apt cache might be outdated. It’s always a good idea to update it. - -#### 3\. Check if package is available for your Ubuntu version - -Alright! You checked the name of the package and it is correct. You run the update command to rebuild the cache and yet you see the unable to locate package error. - -It is possible that the package is really not available. But you are following the instructions mentioned on some website and everyone else seems to be able to install it like that. What could be the issue? - -I can see two things here. Either the package available in Universe repository and your system hasn’t enabled it or the package is not available on your Ubuntu version altogether. Don’t get confused. I’ll explain it for you. - -First step, [check the Ubuntu version you are running][8]. Open a terminal and use the following command: - -``` -lsb_release -a -``` - -You’ll get the Ubuntu version number and the codename in the output. The codename is what important here: - -``` -[email protected]:~$ lsb_release -a -No LSB modules are available. -Distributor ID: Ubuntu -Description: Ubuntu 18.04.3 LTS -Release: 18.04 -Codename: bionic -``` - -![Ubuntu Version Check][9] - -As you can see here, I am using Ubuntu 18.04 and its codename is _bionic_. You may have something else but you get the gist of what you need to note here. - -Once you have the version number and the codename, head over to the Ubuntu packages website: - -[Ubuntu Packages][10] - -Scroll down a bit on this page and go to the Search part. You’ll see a keyword field. Enter the package name (which cannot be found by your system) and then set the correct distribution codename. The section should be ‘any’. When you have set these three details, hit the search button. - -![Ubuntu Package Search][11] - -This will show if the package is available for your Ubuntu version and if yes, which repository it belongs to. In my case, I searched for [Shutter screenshot tool][12] and this is what it showed me for Ubuntu 18.04 Bionic version: - -![Package Search Result][13] - -In my case, the package name is an exact match. This means the package shutter is available for Ubuntu 18.04 Bionic but in the ‘Universe repository’. If you are wondering what the heck is Universe repository, please [refer to the Ubuntu repository article I had mentioned earlier][7]. - -If the intended package is available for your Ubuntu version but it a repository like universe or multiverse, you should enable these additional repositories: - -``` -sudo add-apt-repository universe multiverse -``` - -You must also update the cache so that your system is aware of the new packages available through these repositories: - -``` -sudo apt update -``` - -Now if you try to install the package, things should be fine. - -#### Nothing works, what now? - -If Ubuntu Packages website also shows that the package is not available for your specific version, then you’ll have to find some other ways to install the package. - -Take Shutter for example. It’s an [excellent screenshot tool for Linux][14] but it hasn’t been updated in years and thus Ubuntu has dropped it from Ubuntu 18.10 and newer versions. How to install it now? Thankfully, some third party developer created a personal repository (PPA) and you can install it using that. [Please read this detailed guide to [understand PPA in Ubuntu][15].] You can search for packages and their PPA on Ubuntu’s Launchpad website. - -Do keep in mind that you shouldn’t add random (unofficial) PPAs to your repositories list. I advise sticking with what your distribution provides. - -If there are no PPAs, check the official website of the project and see if they provide some alternative ways of installing the application. Some projects provide .[DEB files][16] or [AppImage][17] files. Some projects have switched to [Snap packages][18]. - -In other words, check the official website of the project and check if they have changed their installation method. - -If nothing works, perhaps the project itself is discontinued and if that’s the case, you should look for its alternative application. - -**In the end…** - -If you are new to Ubuntu or Linux, things could be overwhelming. This is why I am covering some basic topics like this so that you get a better understanding of how things work in your system. - -I hope this tutorial helps you handling the package error in Ubuntu. If you have questions or suggestions, please feel free to ask in the comment section. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/unable-to-locate-package-error-ubuntu/ - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/remove-install-software-ubuntu/ -[2]: https://itsfoss.com/apt-get-linux-guide/ -[3]: https://itsfoss.com/apt-command-guide/ -[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/unable_to_locate_package_error_ubuntu.png?ssl=1 -[5]: https://itsfoss.com/install-latest-vlc/ -[6]: https://itsfoss.com/update-ubuntu/ -[7]: https://itsfoss.com/ubuntu-repositories/ -[8]: https://itsfoss.com/how-to-know-ubuntu-unity-version/ -[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/ubuntu_version_check.jpg?ssl=1 -[10]: https://packages.ubuntu.com/ -[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/ubuntu_package_search.png?ssl=1 -[12]: https://itsfoss.com/install-shutter-ubuntu/ -[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/11/package_search_result.png?resize=800%2C311&ssl=1 -[14]: https://itsfoss.com/take-screenshot-linux/ -[15]: https://itsfoss.com/ppa-guide/ -[16]: https://itsfoss.com/install-deb-files-ubuntu/ -[17]: https://itsfoss.com/use-appimage-linux/ -[18]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/ diff --git a/sources/tech/20191118 Creating a Chat Bot with Recast.AI.md b/sources/tech/20191118 Creating a Chat Bot with Recast.AI.md deleted file mode 100644 index 0b86e74c72..0000000000 --- a/sources/tech/20191118 Creating a Chat Bot with Recast.AI.md +++ /dev/null @@ -1,181 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Creating a Chat Bot with Recast.AI) -[#]: via: (https://opensourceforu.com/2019/11/creating-a-chat-bot-with-recast-ai/) -[#]: author: (Athira Lekshmi C.V https://opensourceforu.com/author/athira-lekshmi/) - -Creating a Chat Bot with Recast.AI -====== - -[![][1]][2] - -_According to a Gartner report from February 2018, “25 per cent of customer service and support operations will integrate virtual customer assistant (VCA) or chatbot technology across engagement channels by 2020, up from less than 2 per cent in 2017.” In the light of this, readers will find this tutorial on how the open source Recast. AI bot-creating platform works, helpful._ - -Chat bots, both voice based and others, have been in use for quite a while now. From chatbots that engage the user in a murder mystery game to bots which help in real estate deals and medical diagnosis, chatbots have traversed across domains. - -There are many platforms which enable users to create and deploy bots. Recast.AI (now known as SAP Conversational AI after its acquisition by SAP) is a forerunner amongst these. - -The cool interface, its collaborative nature and the analytics tools it provides, make it a popular choice. -As the Recast official site says, “It is an ultimate collaborative platform to build, train, deploy and monitor intelligent bots.” - -![Figure 1: Setting the bot properties][3] - -![Figure 2: Bot dashboard][4] - -![Figure 3: Searching an intent][5] - -**Building a basic bot in Recast** -Let us look at how to build a basic bot in Recast. - - 1. Create an account in __. Signing up can be done either with an email ID or with a GitHub account. - 2. Once you log in, you will land on the dashboard. Click on the + New Bot icon on the top right-hand side to create a new bot. - 3. On the next screen, you will see that there is a set of predefined skills you can select. Select Greetings for the time being (Figure 1). This bot is already trained to understand basic greetings. - 4. Provide a name for your bot. For now, since this is a very basic bot, you can have the bot crack some jokes, so let us name it Joke Bot and select the default language as English. - 5. Select Non-personal data under the data policy since you won’t be dealing with any sensitive information; then select the Public bot option and click on Create a bot. - - - -So that’s your bot created on the Recast platform. - -![Figure 4: @joke intent][6] - -![Figure 5: Predefined expressions][7] - -**The five stages of developing a bot** -To use the words from the official Recast blog, there are five stages in a bot’s life. - - * Training – Teaching your bot what it needs to understand - * Building – Creating your conversational flow with the Bot Builder tool - * Coding – Connecting your bot with external APIs or a database - * Connecting – Shipping your bot to one or several messaging platforms - * Monitoring – Training your bot to make it sharper and get insights on its usage - - - -**Training a bot through intents** -You will be able to see the options to either search, fork or create an intent in the dashboard. -“An intent is a box of expressions that mean the same thing but which are constructed in different ways. Intents are the heart of your bot’s understanding. Each one of your intents represents an idea your bot is able to understand.” (from the _Recast.AI_ website) -As decided earlier, you need the bot to be able to crack jokes. So the base line is that the bot should be able to understand that the user is asking it to tell a joke; it shouldn’t be that even when the user just says, “Hi,” the bot responds with a joke – that would not be good. -So group the utterances that the user might make, like: - -``` -Tell me a joke. -Tell me a funny fact. -Can you crack a joke? -What’s funny today? -``` - -………………… - -Before going on to create the intent from scratch, let us explore the Search/fork option. Type _Joke_ in the search field (Figure 3). This gives a list of intents created by users of Recast around the globe, which is public, and this is why Recast is said to be collaborative in nature. So there’s no need to create all intents from scratch, one can build upon intents already created. This brings down the effort needed to train the bot with common intents. - - * Select the first intent in the list and fork it into the bot. - * Click on the Fork button. The intent is now added to the bot (Figure 4). - * Click on the intent @joke, and a list of expressions which already exist in the intent will be displayed (Figure 5). - * Add a few more expressions to it (Figure 6). - - - -![Figure 6: Suggested expressions][8] - -![Figure 7: Suggested expressions][9] - -Once a few expressions are added, the bot gives suggestions like shown in Figure 7. Select a few and add them to the intent (Figure 7). -You can also tag your own custom entities to detect keywords, depending on your bot’s context. - -**Skills** -A skill is a block of conversation that has a clear purpose and that your bot can execute to achieve a goal. It can be as simple as the ability to greet someone, but it can also be more complex, like giving movie suggestions based on information provided by the user. - -It need not be just a one query-answer set, but rather, skills running through multiple exchanges. For example, consider a bot which helps you learn about currency exchange rates. It starts by asking the source currency, then the target currency, before giving the exact response. Skills can be combined to create complex conversational flows. -Here’s how you create a skill for the joke bot: - - * Go to the _Build_ tab. Click on the + icon to create a skill. - * Name the skill _Joke_ (Figure 8) - * Once created, click on the skill. You will see four tabs. _Read me, Triggers, Requirements and Actions_. - * Navigate to the Requirements tab. You should store the information only if the intent joke is present. So, add a requirement as shown in Figure 9. - - - -![Figure 8: Skills dashboard][10] - -![Figure 9: Adding a trigger][11] - -Since this is a simple use case, you needn’t consider any specific requirements in the Requirement tab but consider a case for which a response needs to be triggered only if certain keywords or entities are present – in such a case you will need ‘requirements’. - -Requirements are either intents or entities that your skill needs to retrieve before executing actions. Requirements are pieces of information that are important in the conversation and that your bot can use; for example, the user’s name or a location. Once a requirement is completed, the associated value is stored in the bot’s memory for the entire conversation. - -Now let us move to the Action tab to set the responses (see Figure 10). -Click on Add _new message group_. Then select _Send message_ and add a text message, which can be any joke in this case. Also, since you don’t want your bot to crack the same joke each time, you can add multiple messages which will be randomly picked each time. - -![Figure 10: Adding actions][12] - -![Figure 11: Adding text messages][13] - -![Figure 12: Setting up webchat][14] - -**Channel integrations** -Well, the success of a bot also depends upon how easily it is accessible. Recast has built-in integrations with many messaging channels such as Skype for Business, Kik Messenger, Telegram, Line, Facebook Messenger, Slack, Alexa, etc. In addition to that, Recast also provides SDKs to develop custom channels. - -Also, there is a ready-to-use Web chat provided by Recast (in the Connect tab). You can customise the colour schemes, headers, bot pictures, etc. It provides you with a script tag to be injected into the page. Your interface is now up (Figure 12). - -The Web chat code base is open sourced, which makes it easier for developers to play around with the look and feel, the standard response types and much more. -The dashboard provides step-by-step procedures on how to deploy the bot on various channels. The joke bot was deployed in Telegram and in Web chat, as shown in Figure 13. - -![Figure 13: Webchat deployed][15] - -![Figure 14: Bot deployed in Telegram][16] - -![Figure 15: Multi-language bot][17] - -**And there is more** -Recast supports multiple languages, Select one language as the base while creating the bot, but then you also have the option to add as many languages as you want. - -The example considered here is a simple static joke bot, but actual use cases will need interaction with various systems. Recast has a Web hook feature which allows users to connect with various systems to get responses. Also, there is detailed API documentation to help leverage each independent feature of the platform. - -As for analytics, Recast has a monitoring dashboard which helps you understand the accuracy of the bot and train it further. - -![Avatar][18] - -[Athira Lekshmi C.V][19] - -The author is an open-source enthusiast. - -[![][20]][21] - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/11/creating-a-chat-bot-with-recast-ai/ - -作者:[Athira Lekshmi C.V][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/athira-lekshmi/ -[b]: https://github.com/lujun9972 -[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/04/Build-ChatBoat.jpg?resize=696%2C442&ssl=1 (Build ChatBoat) -[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/04/Build-ChatBoat.jpg?fit=900%2C572&ssl=1 -[3]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-1-Setting-the-bot-properties.jpg?resize=350%2C201&ssl=1 -[4]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-2-Setting-the-bot-properties.jpg?resize=350%2C217&ssl=1 -[5]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-3-Searching-an-intent.jpg?resize=350%2C271&ssl=1 -[6]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-4-@joke-intent.jpg?resize=350%2C214&ssl=1 -[7]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-5-Predefined-expressions-350x227.jpg?resize=350%2C227&ssl=1 -[8]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-6-Suggested-expressions-350x197.jpg?resize=350%2C197&ssl=1 -[9]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-7-Suggested-expressions-350x248.jpg?resize=350%2C248&ssl=1 -[10]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-8-Skills-dashboard.jpg?resize=350%2C187&ssl=1 -[11]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-9-Adding-a-trigger.jpg?resize=350%2C197&ssl=1 -[12]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-10-Adding-actions.jpg?resize=350%2C175&ssl=1 -[13]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-11-Adding-text-messages.jpg?resize=350%2C255&ssl=1 -[14]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-12-Setting-up-webchat.jpg?resize=350%2C326&ssl=1 -[15]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-13-Webchat-deployed.jpg?resize=350%2C425&ssl=1 -[16]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-14-Bot-deployed-in-Telegram.jpg?resize=350%2C269&ssl=1 -[17]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-15-Multi-language-bot.jpg?resize=350%2C419&ssl=1 -[18]: https://secure.gravatar.com/avatar/d24503a2a0bb8bd9eefe502587d67323?s=100&r=g -[19]: https://opensourceforu.com/author/athira-lekshmi/ -[20]: https://opensourceforu.com/wp-content/uploads/2019/11/assoc.png -[21]: https://feedburner.google.com/fb/a/mailverify?uri=LinuxForYou&loc=en_US diff --git a/sources/tech/20191118 How to use regular expressions in awk.md b/sources/tech/20191118 How to use regular expressions in awk.md deleted file mode 100644 index 2cf5881263..0000000000 --- a/sources/tech/20191118 How to use regular expressions in awk.md +++ /dev/null @@ -1,279 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to use regular expressions in awk) -[#]: via: (https://opensource.com/article/19/11/how-regular-expressions-awk) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -How to use regular expressions in awk -====== -Use regex to search code using dynamic and complex pattern definitions. -![Coding on a computer][1] - -In awk, regular expressions (regex) allow for dynamic and complex pattern definitions. You're not limited to searching for simple strings but also patterns within patterns. - -The syntax for using regular expressions to match lines in awk is: - - -``` -`word ~ /match/` -``` - -The inverse of that is _not_ matching a pattern: - - -``` -`word !~ /match/` -``` - -If you haven't already, create the sample file from our [previous article][2]: - - -``` -name       color  amount -apple      red    4 -banana     yellow 6 -strawberry red    3 -raspberry  red    99 -grape      purple 10 -apple      green  8 -plum       purple 2 -kiwi       brown  4 -potato     brown  9 -pineapple  yellow 5 -``` - -Save the file as **colours.txt** and run: - - -``` -$ awk -e '$1 ~ /p[el]/ {print $0}' colours.txt -apple      red    4 -grape      purple 10 -apple      green  8 -plum       purple 2 -pineapple  yellow 5 -``` - -You have selected all records containing the letter **p** followed by _either_ an **e** or an **l**. - -Adding an **o** inside the square brackets creates a new pattern to match: - - -``` -$ awk -e '$1 ~ /p[el]/ {print $0}' colours.txt -apple      red    4 -grape      purple 10 -apple      green  8 -plum       purple 2 -pineapple  yellow 5 -potato     brown  9 -``` - -### Regular expression basics - -Certain characters have special meanings when they're used in regular expressions. - -#### Anchors - -Anchor | Function ----|--- -**^** | Indicates the beginning of the line -**$** | Indicates the end of a line -**\A** | Denotes the beginning of a string -**\z** | Denotes the end of a string -**\b** | Marks a word boundary - -For example, this awk command prints any record containing an **r** character: - - -``` -$ awk -e '$1 ~ /r/ {print $0}' colours.txt -strawberry red    3 -raspberry  red    99 -grape      purple 10 -``` - -Add a **^** symbol to select only records where **r** occurs at the beginning of the line: - - -``` -$ awk -e '$1 ~ /^r/ {print $0}' colours.txt -raspberry  red    99 -``` - -#### Characters - -Character | Function ----|--- -**[ad]** | Selects **a** or **d** -**[a-d]** | Selects any character **a** through **d** (a, b, c, or d) -**[^a-d]** | Selects any character _except_ **a** through **d** (e, f, g, h…) -**\w** | Selects any word -**\s** | Selects any whitespace character -**\d** | Selects any digit - -The capital versions of w, s, and d are negations; for example, **\D** _does not_ select any digit. - -[POSIX][3] regex offers easy mnemonics for character classes: - -POSIX mnemonic | Function ----|--- -**[:alnum:]** | Alphanumeric characters -**[:alpha:]** | Alphabetic characters -**[:space:]** | Space characters (such as space, tab, and formfeed) -**[:blank:]** | Space and tab characters -**[:upper:]** | Uppercase alphabetic characters -**[:lower:]** | Lowercase alphabetic characters -**[:digit:]** | Numeric characters -**[:xdigit:]** | Characters that are hexadecimal digits -**[:punct:]** | Punctuation characters (i.e., characters that are not letters, digits, control characters, or space characters) -**[:cntrl:]** | Control characters -**[:graph:]** | Characters that are both printable and visible (e.g., a space is printable but not visible, whereas an **a** is both) -**[:print:]** | Printable characters (i.e., characters that are not control characters) - -### Quantifiers - -Quantifier | Function ----|--- -**.** | Matches any character -**+** | Modifies the preceding set to mean _one or more times_ -***** | Modifies the preceding set to mean _zero or more times_ -**?** | Modifies the preceding set to mean _zero or one time_ -**{n}** | Modifies the preceding set to mean _exactly n times_ -**{n,}** | Modifies the preceding set to mean _n or more times_ -**{n,m}** | Modifies the preceding set to mean _between n and m times_ - -Many quantifiers modify the character sets that precede them. For example, **.** means any character that appears exactly once, but **.*** means _any or no_ character. Here's an example; look at the regex pattern carefully: - - -``` -$ printf "red\nrd\n" -red -rd -$ printf "red\nrd\n" | awk -e '$0 ~ /^r.d/ {print}' -red -$ printf "red\nrd\n" | awk -e '$0 ~ /^r.*d/ {print}' -red -rd -``` - -Similarly, numbers in braces specify the number of times something occurs. To find records in which an **e** character occurs exactly twice: - - -``` -$ awk -e '$2 ~ /e{2}/ {print $0}' colours.txt -apple      green  8 -``` - -### Grouped matches - -Quantifier | Function ----|--- -**(red)** | Parentheses indicate that the enclosed letters must appear contiguously -** | ** - -For instance, the pattern **(red)** matches the word **red** and **ordered** but not any word that contains all three of those letters in another order (such as the word **order**). - -### Awk like sed with sub() and gsub() - -Awk features several functions that perform find-and-replace actions, much like the Unix command **sed**. These are functions, just like **print** and **printf**, and can be used in awk rules to replace strings with a new string, whether the new string is a string or a variable. - -The **sub** function substitutes the _first_ matched entity (in a record) with a replacement string. For example, if you have this rule in an awk script: - - -``` -{ sub(/apple/, "nut", $1); -    print $1 } -``` - -running it on the example file **colours.txt** produces this output: - - -``` -name -nut -banana -raspberry -strawberry -grape -nut -plum -kiwi -potato -pinenut -``` - -The reason both **apple** and **pineapple** were replaced with **nut** is that both are the first match of their records. If the records were different, then the results could differ: - - -``` -$ printf "apple apple\npineapple apple\n" | \ -awk -e 'sub(/apple/, "nut")' -nut apple -pinenut apple -``` - -The **gsub** command substitutes _all_ matching items: - - -``` -$ printf "apple apple\npineapple apple\n" | \ -awk -e 'gsub(/apple/, "nut")' -nut nut -pinenut nut -``` - -#### Gensub - -An even more complex version of these functions, called **gensub()**, is also available. - -The **gensub** function allows you to use the **&** character to recall the matched text. For example, if you have a file with the word **Awk** and you want to change it to **GNU Awk**, you could use this rule: - - -``` -`{ print gensub(/(Awk)/, "GNU &", 1) }` -``` - -This searches for the group of characters **Awk** and stores it in memory, represented by the special character **&**. Then it substitutes the string for **GNU &**, meaning **GNU Awk**. The **1** character at the end tells **gensub()** to replace the first occurrence. - - -``` -$ printf "Awk\nAwk is not Awkward" \ -| awk -e ' { print gensub(/(Awk)/, "GNU &",1) }' -GNU Awk -GNU Awk is not Awkward -``` - -### There's a time and a place - -Awk is a powerful tool, and regex are complex. You might think awk is so very powerful that it could easily replace **grep** and **sed** and **tr** and [**sort**][4] and many more, and in a sense, you'd be right. However, awk is just one tool in a toolbox that's overflowing with great options. You have a choice about what you use and when you use it, so don't feel that you have to use one tool for every job great and small. - -With that said, awk really _is_ a powerful tool with lots of great functions. The more you use it, the better you get to know it. Remember its capabilities, and fall back on it occasionally so can you get comfortable with it. - -Our next article will cover looping in Awk, so come back soon! - -* * * - -_This article is adapted from an episode of [Hacker Public Radio][5], a community technology podcast._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/how-regular-expressions-awk - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[lixin555](https://github.com/lixin555) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/seth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) -[2]: https://opensource.com/article/19/10/intro-awk -[3]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains -[4]: https://opensource.com/article/19/10/get-sorted-sort -[5]: http://hackerpublicradio.org/eps.php?id=2129 diff --git a/sources/tech/20191118 Some notes on vector drawing apps.md b/sources/tech/20191118 Some notes on vector drawing apps.md deleted file mode 100644 index 7c57682fc6..0000000000 --- a/sources/tech/20191118 Some notes on vector drawing apps.md +++ /dev/null @@ -1,99 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Some notes on vector drawing apps) -[#]: via: (https://jvns.ca/blog/2019/11/18/some-notes-on-vector-drawing-apps/) -[#]: author: (Julia Evans https://jvns.ca/) - -Some notes on vector drawing apps -====== - -For the last year and a half I’ve been using the iPad Notability app to draw my [zines][1]. Last week I decided I wanted more features, did a bit of research, and decided to switch to Affinity Designer (a much more complicated program). So here are a few quick notes about it. - -The main difference between them is that Notability is a simple note taking app (aimed at regular people), and Affinity Designer is a vector graphics app (aimed at illustrators / graphic designers), like Adobe Illustrator. - -I’ve never used a serious vector graphics program before, so it’s been cool to learn what kinds of features are available! - -### Notability is super simple - -This is what the Notability UI looks like. There’s a pencil, an eraser, a text tool, and a selection tool. That’s basically it. I LOVED this simplicity when I started using Notability, and I made 4 zines using it (help! i have a manager!, oh shit, git!, bite size networking!, and http: use your browser’s language). - - - -Recently though, I’ve had a couple of problems with it, the main one being that text boxes and things drawn with the pencil tool don’t mix well. (In general Notability has been GREAT though and their support team has always been incredibly helpful when I’ve had questions.) - -### Affinity Designer is really complicated - -Affinity Designer, by comparison, is WAY more complicated. Here’s what the UI looks like: - - - -There are - - * 14 tools on the left - * 14 more panels on the right that alter what the tools do - * a bottom toolbar which has different options for each tool - * 2 menus which together have another 25 things or so that you can do - - - -I still don’t understand what all the tools do (what’s the difference between Pencil and Vector Brush? I don’t know!). But I’m pretty excited about this because (unlike with Notability) there are so many options that if I’m frustrated about something, 90% of the time there’s a way to do the thing I want! - -### switching from Notability to Affinity Designer is really easy - -Switching to Notability wasn’t the best: I [reverse engineered the file format][2] to transfer some files over but the quality was never the best (probably because of problems with my script) and I ended up having to redraw a lot of them in practice. - -With Affinity Designer, I can just - - * export a PDF with Notability (or anything else) - * import the PDF with Affinity Designer - * and then I can easily edit it and that’s it?!? - - - -It’s not perfect – the vector paths it comes up with are kind of weird, probably because of the way the PDF is – but it’s very good! It makes me feel confident that if I need to make a small edit to something I made in the past I can just import the PDF! - -### what can a vector drawing app do? - -here are a few things Affinity Designer can do that Notability can’t: - - * **custom paper sizes**: In Notability every page is 8.5x11, but usually I want something more like 5.5x8.5 which is a different aspect ratio (this is technically sort of possible in Notability by importing a PDF of the correct size but it’s a pain and it means you can’t use a grid) - * **custom colour palettes**: I can have the 10 colours I like to use in my comics all in one place - * **grouping objects together** – I can “group” a bunch of objects together so that I can easily resize and move them all together - * **two kinds of text box**. This is the kind of thing that I wouldn’t have understood 2 years ago but that now I LOVE – you can either have “art text” that acts like an image (no word wrap, gets bigger when you resize it) or “frame text” that has word wrap and doesn’t get bigger when you resize it. - * **really great import** – I can import a PDF or SVG and individually edit / move around parts of the PDF. Notability doesn’t have any import tools that let you edit after importing. - * **custom export options for printing**. I don’t understand what it **does** yet but there are export presets for print PDFs and it fixes some printing problems I was having! - - - -There are also a LOT more features that I’m not interested in but I’m pretty excited about those 6 things and it feels like an app that I won’t grow out of. - -### iPad apps are great - -I’ve been exclusively using Linux for the last 15 years where the image editing/media tools aren’t always great (though I really like Inkscape and I hear good things about Krita!), so it’s really cool to have access to all these great iPad apps. And the prices seem pretty reasonable: - - * Notability is $12 - * Affinity Designer is $20 - * LumaFusion (a nice video editor I’ve been using a little) is $30 - - - -It doesn’t make me want a Mac (I like the Linux desktop experience!), but it’s nice to have access to a bunch of these great tools. And I think a lot of these art tools work better on an iPad than on a computer anyway since you can just draw on the screen :) - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019/11/18/some-notes-on-vector-drawing-apps/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://wizardzines.com -[2]: https://jvns.ca/blog/2018/03/31/reverse-engineering-notability-format/ diff --git a/sources/tech/20191119 App Highlight- Flameshot for Taking and Editing Screenshots.md b/sources/tech/20191119 App Highlight- Flameshot for Taking and Editing Screenshots.md deleted file mode 100644 index bc287325cd..0000000000 --- a/sources/tech/20191119 App Highlight- Flameshot for Taking and Editing Screenshots.md +++ /dev/null @@ -1,153 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (App Highlight: Flameshot for Taking and Editing Screenshots) -[#]: via: (https://itsfoss.com/flameshot/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -App Highlight: Flameshot for Taking and Editing Screenshots -====== - -If you have been following It’s FOSS regularly, you might have come across my coverage on the [best ways to take a screenshot in Linux][1]. - -![][2] - -I did recommend using Flameshot as well because it happens to be my personal favorite to take screenshots. In case you didn’t know, [Flameshot][3] is an open source screenshot tool available for Linux. - -However, in this article, I shall be focusing on ‘Flameshot’ to help you install it, configure it, and highlight the features it has to offer. - -### Flameshot Features - -Flameshot offers almost all the essential features that you would ever require on a screenshot tool in Linux. Here are some of the key features in video format: - -[Subscribe to our YouTube channel for more Linux videos][4] - -#### Upload screenshot to Imgur - -![][5] - -A lot of users want to simply upload their screenshots directly to the cloud in order to easily share it with others. - -You can do that by syncing your saved files to a cloud storage solution and share them later. But, that’s quite a few steps to follow in order to share your screenshot, right? - -So, here, Flameshot lets you upload your image directly to [Imgur][6] with a single click. All you have to do is share the URL. - -Do note that these uploads will not be associated with your Imgur account (if you have one) and will be only accessible to the ones with the link. - -#### Annotation Options - -![][7] - -The whole point of having a 3rd party screenshot utility is the ability to annotate the pictures. - -You can choose to add an arrow mark, highlight a text, blur a section, add a text, draw something, add a rectangular/circular shaped border, and add a solid color box. - -![][8] - -You can take a closer look at the options with the help of the GIF above (from their official [GitHub page][9]): - -#### Customization Options - -![][10] - -In addition to all the useful features, it also gives you the ability to customize the UI, filename (when you save a screenshot), and some general options as well. - -### Installing Flameshot on Linux - -Before configuring Flameshot, you need to get it installed on your Linux system. - -You might find it in your Software Center/App Center/Package Manager, simply search for “flameshot” and get it installed. - -In case you do not find it there, you can head on to its [GitHub releases page][11] and download the setup file suitable for your Linux distro. It is available in DEB (for Ubuntu), RPM (for Fedora) and AppImage (for all Linux distributions) format. - -[Download Flameshot][11] - -### How To Setup Flameshot? - -Now that you are aware of the features (and probably have it installed), how do you use it? - -Of course, you don’t want to launch a screenshot tool by searching for it in the list of applications installed. - -So, the best way to access it would be to press the **PRT SC** key, right? - -But, by default, when you press the **Print Screen** button, it will launch the default screenshot tool (or directly take a full-screen screenshot). - -Fret not, you can easily change it. Here’s how you can set flameshot to launch upon pressing the ‘**Prt Sc**‘ button: - -1\. Head to the system settings and navigate your way to the “**Device**” options. - -2\. Next, head inside the “**Keyboard Shortcuts**” option. - -3\. Now, you need to change the keyboard shortcut for “**Saving a screenshot to Pictures**” from **Prt Sc** to anything else (a button you don’t use frequently). - -![Assign a custom keyboard shortcut to Flameshot][12] - -Refer to the image above to understand it better. - -4\. Once you have done this, scroll down to the bottom and add a new keyboard shortcut by clicking on the “**+**” button. - -5\. Here, you will get the option to name the shortcut (it can be anything) and in place of the command, you will have to enter: - -``` -flameshot gui -``` - -And, hit the **Prt Sc** button when you set the shortcut. That’s it! - -Here’s how it should look after configuration: - -![][13] - -Now, you should be able to launch Flameshot by pressing the **Prt Sc** button. - -### Few Tips To Note - -![][14] - - * By default, Flameshot saves the pictures in [PNG][15] format. So, if you need a [JPEG][16] file, you can simply rename the file extension. - * You can change the color of the text/arrow mark by performing a right-click before adding it. Once you change it, the color remains the same even when you use it the next time. You can change the color again, the same way. - * If you want the option to choose a custom color (instead of the pre-defined color selection), just hit the **SPACE** **bar** after you select a region to take the screenshot. - * If you cannot access the Flameshot configuration option via the app drawer, simply type in “**flameshot config**” in the terminal. - - - -**Wrapping Up** - -Even though there are alternatives to Flameshot available, I find it to be the best screenshot tool for my usage. - -If you found this tutorial helpful, do share it with other Linux users. If you find Flameshot useful, please do consider making a [donation to its developer][17]. - -In either case, if you already use a screenshot tool, which one is it? Do you know of something that happens to be better than Flameshot? Let me know your thoughts in the comments below. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/flameshot/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/take-screenshot-linux/ -[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/11/flameshot.png?ssl=1 -[3]: https://flameshot.js.org/ -[4]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 -[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/flameshot-cloud-upload-feature.jpg?ssl=1 -[6]: https://imgur.com/ -[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/flameshot-options.jpg?ssl=1 -[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/10/flameshot-usage.gif?ssl=1 -[9]: https://github.com/lupoDharkael/flameshot -[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/flameshot-customization.jpg?ssl=1 -[11]: https://github.com/lupoDharkael/flameshot/releases -[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/10/keyboard-shortcut-option.jpg?ssl=1 -[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/flameshot-shortcut-config.jpg?ssl=1 -[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/flameshot-tips.jpg?ssl=1 -[15]: https://en.wikipedia.org/wiki/Portable_Network_Graphics -[16]: https://en.wikipedia.org/wiki/JPEG -[17]: https://flameshot.js.org/#/ diff --git a/sources/tech/20191119 Container reality checks and more industry trends.md b/sources/tech/20191119 Container reality checks and more industry trends.md deleted file mode 100644 index 5f5477e0aa..0000000000 --- a/sources/tech/20191119 Container reality checks and more industry trends.md +++ /dev/null @@ -1,53 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Container reality checks and more industry trends) -[#]: via: (https://opensource.com/article/19/11/container-reality-checks-and-more-industry-trends) -[#]: author: (Tim Hildred https://opensource.com/users/thildred) - -Container reality checks and more industry trends -====== -A weekly look at open source community, market, and industry trends. -![Person standing in front of a giant computer screen with numbers, data][1] - -As part of my role as a senior product marketing manager at an enterprise software company with an open source development model, I publish a regular update about open source community, market, and industry trends for product marketers, managers, and other influencers. Here are five of my and their favorite articles from that update. - -## [The benefits of gamification in business][2] - -> While its value as an industry is still growing each year, it seems that some organisations are still struggling to implement gamification technology in the first place or engage employees once they have. Early difficulties revolved around a lack of real clarity as to what gamification is and how it can help an organisation. This fed into poor initial results that have dampened enthusiasm among early adopters. There was also a belief that a one-size-fits-all approach could be used, regardless of the circumstances, the demographics of the teams involved or the processes being gamified. For the persistent, these early forays provided valuable lessons that rendered future projects more successful. - -**The impact**: The science fiction fan in me always found the idea of gamification dystopian; a way to trick employees into caring about things they otherwise wouldn't. The summer camp counselor in me recognizes the power of play in learning and teaching. Hopefully, that is the way the pendulum is swinging. - -## [Compare three distinct types of Kubernetes platforms][3] - -> Let's explore the benefits and risks of three types of Kubernetes platforms: the native open source tool, managed cloud services, and integrated ecosystems. We'll examine the technical features each option offers, the extent to which it supports enterprise container and cloud environments, and ease of use. - -**The impact**: This is all the other stuff that you should have been thinking about when you started to get hype on containers, and none of it comes for free. - -## [Deeply understanding the difference between portability, compatibility, and supportability][4] - -> Since the OCI standard governs the images specification, a container image can be created with Podman, pushed to almost any container registry, shared with the world, and consumed by almost any container engine including Docker, RKT, CRI-O, containerd and, of course, other Podman instances. Standardizing on this image format lets us build infrastructure like registry servers which can be used to store any container image, be it RHEL 6, RHEL 7, RHEL8, Fedora, or even Windows container images. - -**The impact**: Another container reality check that also drives home why going through the trouble of standards can be worth it in the long run. - -_I hope you enjoyed this list of what stood out to me from last week and come back next Monday for more open source community, market, and industry trends._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/container-reality-checks-and-more-industry-trends - -作者:[Tim Hildred][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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://social.hays.com/2019/11/05/benefits-of-gamification-in-business/ -[3]: https://searchitoperations.techtarget.com/feature/Compare-3-distinct-types-of-Kubernetes-platforms -[4]: http://crunchtools.com/deeply-understanding-the-different-between-portability-compatibility-and-supportability/ diff --git a/sources/tech/20191119 Loops in Emacs Lisp.md b/sources/tech/20191119 Loops in Emacs Lisp.md deleted file mode 100644 index 66422100bf..0000000000 --- a/sources/tech/20191119 Loops in Emacs Lisp.md +++ /dev/null @@ -1,321 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Loops in Emacs Lisp) -[#]: via: (https://opensourceforu.com/2019/11/loops-in-emacs-lisp/) -[#]: author: (Shakthi Kannan https://opensourceforu.com/author/shakthi-kannan/) - -Loops in Emacs Lisp -====== - -[![][1]][2] - -_This article in the Emacs series explores looping techniques that are available with Emacs Lisp._ - -T here are built-in constructs such as _while_ and _dolist_ that are shipped with the default GNU Emacs. The dash.el library provides functions to iterate over lists, and is written by Magnar Sveen. The latest release of dash.el is v2.16.0, and its source code is available at __ under the GNU General Public License v3.0. -Let us also explore the structures available in loop.el, another library for implementing imperative loops. This has been written by Wilfred Hughes, and has also been released under the GNU General Public License v3.0. - -**Installation** -The dash.el and loop.el packages are available in Milkypostman’s Emacs Lisp Package Archive (MELPA) and in the Marmalede repo. You can install the package using the following commands in GNU Emacs: - -``` -M-x package-install dash -M-x package-install loop -``` - -The other method of installation is to copy the dash.el and loop.el source files to your Emacs load path and load them. In order to get syntax highlighting of dash functions in Emacs buffers, you can add the following command to your Emacs initialisation settings: - -``` -(eval-after-load 'dash '(dash-enable-font-lock)) -``` - -If you are using Cask (__) to manage your Emacs configuration, then you can simply add the following code to your Cask file: - -``` -(depends-on "dash") -(depends-on "loop") -``` - -The usage of various loop construct is as follows. - -**Built-in** -GNU Emacs has built-in loop constructs. The _while_ function, for example, has the following syntax: - -``` -(while TEST BODY...) -``` - -The BODY code segment is evaluated if the result of TEST is not nil. Until TEST returns nil, the BODY will continue to be executed. An example of _while_ function usage is given below: - -``` -(setq alphabets '(a b c d e)) - -(defun print-list-elements (list) -"Print each element of the input LIST" -(while list -(print (car list)) -(setq list (cdr list)))) - -(print-list-elements alphabets) -``` - -The output is as follows: - -``` -a -b -c -d -e -nil -``` - -The ‘dolist’ macro loops over a list and is also built-in with Emacs. Its definition is as follows: - -``` -(dolist (VAR LIST [RESULT]) BODY...) -``` - -The VAR argument represents each element in LIST for every iteration in the BODY segment. The value in RESULT is returned by the function, and is optional. By default, a nil is returned. The ‘alphabet’ list elements can be printed using the _dolist_ macro as shown below: - -``` -(setq alphabets '(a b c d e)) -(dolist (element alphabets) -(print element)) -``` - -The resultant output is the same. - -``` -a -b -c -d -e -nil -``` - -**dash.el** -The dash.el list library provides functions to iterate over lists. The -each function, for example, takes a list and a function, and applies the function to every element in the list. In the following example, a reverse of the input list is created by doubling each element’s value. - -``` -(-each list function) ;; Syntax - -(let (s) (-each '(1 2 3) (lambda (item) (setq s (cons (* item 2) s)))) s) -(6 4 2) -``` - -Another function API from the dash.el library is the -each-while function, which takes three arguments – a list, a predicate and a function. The function is applied to every element in the list that satisfies the predicate. For example: - -``` -(-each-while list predicate function) ;; Syntax - -(defun even? (num) (= 0 (% num 2))) -(let (s) (--each-while '(1 2 3 4) (< it 3) (!cons it s)) s) -(2 1) -``` - -The _-each-r_ function takes a list and a function, and applies the function on every item in the list in the reverse order. An example is given below: - -``` -(-each-r list function) ;; Syntax - -(let (s) (-each-r '(1 2 3) (lambda (item) (setq s (cons (* item 2) s)))) s) - -(2 4 6) -``` - -If you would like to use a predicate function with _-each-r_, you can use the _-each-r-while_ function as illustrated below: - -``` -(-each-r-while list predicate function) ;; Syntax - -(let (s) (-each-r-while '(1 2 3 4 5 6) 'even? (lambda (item) (!cons item s))) s) -(6) -``` - -The _-dotimes_ function will repeatedly call a function from 0 to the input number, minus 1. - -``` -(-dotimes number function) ;; Syntax - -(let (s) (-dotimes 3 (lambda (n) (!cons n s))) s) -(2 1 0) -``` - -You can explore more of the iterative functions available in dash.el under the Side-effects section in the GitHub source repository available at __. - -**loop.el** -We shall now explore the constructs available in the _loop.el_ library. The loop-while construct executes the body of the loop while the condition is true. In the following example, the sum of the numbers from 0 to 5 is computed. - -``` -(require 'loop) - -;; loop-while -loop-while (condition body...) ;; Syntax - -(let ((x 0) -(sum 0)) -;; sum of 0..5 -(loop-while (< x 5) -(setq sum (+ sum x)) -(setq x (1+ x))) -sum) -10 -``` - -If you want to evaluate the body at least once before checking the condition, you can use the _loop-do-while_ construct. In the following example, the value of x is incremented by one and then the condition is satisfied for the loop execution. - -``` -loop-do-while (condition body...) ;; Syntax - -(let ((x 0) -(sum 0)) -;; sum of 1..4 -(loop-do-while (and (> x 0) (< x 5)) -(setq sum (+ sum x)) -(setq x (1+ x))) -sum) -10 -``` - -The _loop-until_ construct repeatedly evaluates the body of the code until the condition becomes true. For example: - -``` -loop-until (condition body...) ;; Syntax - -(let ((x 0) -(sum 0)) -;; sum of 0..4 -(loop-until (= x 5) -(setq sum (+ sum x)) -(setq x (1+ x))) -sum) -10 -``` - -The _loop-for-each_ construct takes three arguments – a var, a list and a body. The var represents an element in the list for the iteration. In the following example, the sum of numbers from 1 to 5 is calculated. - -``` -loop-for-each (var list body...) ;; Syntax - -(let ((sum 0)) -(loop-for-each x (list 1 2 3 4 5) -(setq sum (+ sum x))) -sum) -15 -``` - -A couple of constructs are available to break or continue execution within a loop. The _loop-break_ construct breaks out of the innermost loop. For example: - -``` -loop-break () ;; Syntax - -(let ((sum 0)) -;; sum 1..5 -(loop-for-each x (list 1 2 3 4 5 6) -(setq sum (+ sum x)) -(when (= x 5) -(loop-break))) -sum) -15 -``` - -The _loop-continue_ construct will skip the rest of the current loop-while, loop-do-while or loop-for-each block and will proceed to the next iteration in the loop. In the following example, the list is iterated for elements between 1 and 6, and is skipped when the iteration matches the element 2. - -``` -loop-continue () ;; Syntax - -(let ((sum 0)) -;; sum the numbers 1, 3, 5 -(loop-for-each x (list 1 2 3 4 5 6) -(when (= x 2) -(loop-continue)) -(setq sum (+ sum x))) -sum) -19 -``` - -The loop.el library has unit tests included in the source code, which you can run to validate the defined constructs. In order to run the tests, you need to first clone the source repository using the following commands: - -``` -$ git clone https://github.com/Wilfred/loop.el -Cloning into 'loop.el'... -remote: Enumerating objects: 232, done. -remote: Total 232 (delta 0), reused 0 (delta 0), pack-reused 232 -Receiving objects: 100% (232/232), 31.29 KiB | 801.00 KiB/s, done. -Resolving deltas: 100% (117/117), done. -``` - -If you do not have Cask, install it using the instructions provided in the README file at __. -You can then change the directory into the cloned loop.el folder, and run cask install. This will locally install the required dependencies for running the tests. - -``` -$ cd loop.el/ -$ cask install -Loading package information... Select coding system (default utf-8): -done -Package operations: 3 installs, 0 removals -- Installing [ 1/3] undercover (latest)... done -- Installing [ 2/3] ert-runner (latest)... done -- Installing [ 3/3] f (latest)... already present -``` - -A _Makefile_ exists in the top-level directory, the contents of which are provided below for reference: - -``` -$ cat Makefile -CASK ?= cask -EMACS ?= emacs - -all: test -test: unit - -unit: -${CASK} exec ert-runner - -install: -${CASK} install -``` - -You can now simply run _make_ test at the shell prompt to execute the tests as shown below: - -``` -$ make test -cask exec ert-runner -................. - -Ran 17 tests in 0.001 seconds -``` - -Readers are encouraged to go through the README file at for more information. - -![Avatar][3] - -[Shakthi Kannan][4] - -The author is a free software developer at the Fedora project, and also a blogger. He co-maintains the Fedora Electronic Lab project. - -[![][5]][6] - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/11/loops-in-emacs-lisp/ - -作者:[Shakthi Kannan][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/shakthi-kannan/ -[b]: https://github.com/lujun9972 -[1]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/01/Tips-to-hire-a-web-developer-with-skills-in-2019.jpg?resize=696%2C365&ssl=1 (Tips to hire a web developer with skills in 2019) -[2]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/01/Tips-to-hire-a-web-developer-with-skills-in-2019.jpg?fit=1200%2C630&ssl=1 -[3]: https://secure.gravatar.com/avatar/d6df0aa46ea197a6e5a6b80bba666830?s=100&r=g -[4]: https://opensourceforu.com/author/shakthi-kannan/ -[5]: https://opensourceforu.com/wp-content/uploads/2019/11/assoc.png -[6]: https://feedburner.google.com/fb/a/mailverify?uri=LinuxForYou&loc=en_US diff --git a/sources/tech/20191119 What is a community of practice in an open organization.md b/sources/tech/20191119 What is a community of practice in an open organization.md deleted file mode 100644 index 65e9ce464c..0000000000 --- a/sources/tech/20191119 What is a community of practice in an open organization.md +++ /dev/null @@ -1,97 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What is a community of practice in an open organization?) -[#]: via: (https://opensource.com/open-organization/19/11/what-is-community-practice) -[#]: author: (Tracy Buckner https://opensource.com/users/tracyb) - -What is a community of practice in an open organization? -====== -If organizational silos are slowing your teams down, consider building -communities of practice to supercharge collaboration. -![Open community, gardeners and food co-op][1] - -Community is a fundamental component of open organizations. The [Open Organization Definition][2] notes that: - -> Shared values and purpose guide participation in open organizations, and these values—more so than arbitrary geographical locations or hierarchical positions—help determine the organization's boundaries and conditions of participation. - -In other words, people in open organizations often define their roles, responsibilities, and affiliations through shared interests and passions—not title, role, or position on an organizational chart. - -That means organizational leaders will find themselves invested in building communities inside their organizations, connecting like-minded people with one another to accelerate business objectives. - -For this reason, communities of practice can be a useful component of open organizations. In this three-part series, I'll explain what communities of practice are, why they are beneficial to an organization, and how you can start a community of practice.  - -### Community at the core - -Community has always been central to organizations built on open principles. In fact, [The Open Source Way][3] explains community as: - -> … the group of people who form intentionally and spontaneously around something important to them. It includes the people who use or benefit from the project, those who participate and share the project to wider audiences, and the contributors who are essential to growth and survival. - -This definition informs our vision for communities of practice (CoPs) at Red Hat. - -In 1991, cognitive anthropologists [Jean Lave][4] and [Etienne Wenger][5] first coined the term "community of practice" while studying group learning. They defined it as “a group of people who share an interest, a craft, and/or a profession.” Communities of practice have been around since the beginning of civilization. Groups of people have come together telling stories, imparting wisdom, and passing on tradition. Any group of people can form a CoP—a group of teachers exploring a new topic, for example, or architects discussing a typical customer problem and identifying a resolution. - -Not all groups are communities of practice. A CoP must have a shared domain of interest, practitioners who share resources (tools, techniques, and ideas), and community members. A CoP forms at the intersection of those factors (see Figure 1). - -![][6] - -### Domain - -A community of practice is defined by a shared _domain_ of interest. It's not merely a group of friends hanging out together; members have a commitment to the success of the domain and a desire to share their knowledge. They value use cases, success stories, feedback, and learning from the other members. - -### Practice  - -A community of practice is not simply a group of people who like the same things (such as certain kinds of music). Members of CoPs are _practitioners_ who engage in shared activities, share resources, tools, techniques, and ideas. Together they develop ways of addressing problems in new ways. Members value interactions and seek knowledge from each other. Many often become thought leaders and experts in the domain. - -### Members - -Not all groups are communities of practice. A CoP must have a shared domain of interest, practitioners who share resources (tools, techniques, and ideas), and community members. - -Community of practice _members_ engage in joint activities and discussions, assist each other, and share their knowledge. They build relationships that enable them to learn from each other; they care about their standing with each other. Members of a community of practice participate regularly but do not necessarily work together on a daily basis.  - -[Wenger][7] suggests several characteristics and potential activities of communities of practice, including: - - * Problem-solving - * Making recommendations - * Sharing experiences - * Hosting community forums - * Developing shared measurement tools - * Building an argument for a policy campaign - * Growing confidence and encouraging representatives to speak out - * Discussing developments in communities and solutions to challenges - * Documenting data needed to move communities forward - * Coordinating visits to participants' sites to learn more about different approaches and perspectives - * Mapping knowledge and identifying gaps - - - -Communities of practice can form inside and across roles and departments in an open organization. When they do, they can help dissolve organizational silos by providing safe spaces for practitioners to come together as a community and work on a domain the members enjoy. - -Together, members can solve current problems—and innovative on new products and solutions. Communities of practice also provide an opportunity to learn from the interaction and open communication in the group. Members mentor and encourage each other to learn more and do more within the community. CoPs provide a place to begin personal branding and to find the confidence to reach out for other thought leadership activities. - -Communities of practice drawn together domain, practice, and members to provide benefits for both the members and the organization. They are a cost-effective way to enhance learning, reduce silos, and promote innovation. And as [Wegner][7] said, “We need others to complement and develop our own expertise.” - -In the next article in this series, we will discuss the benefits of a CoP in an organization. - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/19/11/what-is-community-practice - -作者:[Tracy Buckner][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/tracyb -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open_community_lead.jpg?itok=F9KKLI7x (Open community, gardeners and food co-op) -[2]: https://opensource.com/open-organization/resources/open-org-definition -[3]: http://www.theopensourceway.org/book/index.html -[4]: http://en.wikipedia.org/wiki/Jean_Lave -[5]: http://en.wikipedia.org/wiki/Etienne_Wenger -[6]: https://opensource.com/sites/default/files/resize/images/open-org/cop_figure1-500x460.png -[7]: https://wenger-trayner.com/wp-content/uploads/2015/04/07-Brief-introduction-to-communities-of-practice.pdf diff --git a/sources/tech/20191120 Set up single sign-on for Fedora Project services.md b/sources/tech/20191120 Set up single sign-on for Fedora Project services.md deleted file mode 100644 index e580b1dd21..0000000000 --- a/sources/tech/20191120 Set up single sign-on for Fedora Project services.md +++ /dev/null @@ -1,105 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Set up single sign-on for Fedora Project services) -[#]: via: (https://fedoramagazine.org/set-up-single-sign-on-for-fedora-project-services/) -[#]: author: (Stephen Gallagher https://fedoramagazine.org/author/sgallagh/) - -Set up single sign-on for Fedora Project services -====== - -![][1] - -In addition to an operating system, the Fedora Project provides [services][2] for users and developers. Services such as [Ask Fedora][3], the [Fedora Project wiki][4] and the [Fedora Project mailing lists][5] help users [learn][6] how to best take advantage of Fedora. For developers of Fedora, there are many other services such as [dist-git][7], [Pagure][8], [Bodhi][9], [COPR][10] and [Bugzilla][11] for the packaging and release process. - -These services are available with a free account from the [Fedora Accounts System][12] (FAS). This account is the passport to all things Fedora! This article covers how to get set up with an account and configure [Fedora Workstation][13] for browser single sign-on. - -### Signing up for a Fedora account - -To create a FAS account, browse to the [account creation page][14]. Here, you will fill out your basic identity data: - -![Account creation page][15] - -Once you enter your data, the account system sends an email to the address you provided, with a temporary password. Pick a strong password and use it. - -![Password reset page][16] - -Next, the account details page appears. If you want to contribute to the Fedora Project, you should complete the [Contributor Agreement][17] now. Otherwise, you are done and you can use your account to log into the various Fedora services. - -![Account details page][18] - -### Configuring Fedora Workstation for single sign-On - -Now that you have your account, you can sign into any of the Fedora Project services. Most of these services support single sign-on (SSO), so you can sign in without re-entering your username and password. - -Fedora Workstation provides an easy workflow to add your Fedora credentials. The GNOME Online Accounts tool helps you quickly set up your system to access many popular services. To access it, go to the _Settings_ menu. - -![][19] - -Click on the option labeled _Fedora_. A prompt opens for you to provide your username and password for your Fedora Account. - -![][20] - -GNOME Online Accounts stores your password in [GNOME Keyring][21] and automatically acquires your single-sign-on credentials for you when you log in. - -### Single sign-on with a web browser - -Today, Fedora Workstation supports three web browsers out of the box with support for single sign-on with the Fedora Project services. These are [Mozilla Firefox][22], [GNOME Web][23], and [Google Chrome][24]. - -Due to a [bug][25] in Chromium, single sign-on doesn’t work currently if you have more than one set of Kerberos (SSO) credentials active on your session. As a result, Fedora doesn’t enable this function out of the box for Chromium in Fedora. - -To sign on to a service, browse to it and select the _login_ option for that service. For most Fedora services, this is all you need to do; the browser handles the rest. Some services such as the [Fedora mailing lists][26] and [Bugzilla][11] support multiple login types. For them, select the _Fedora_ or _Fedora Account System_ login type. - -That’s it! You can now log into any of the Fedora Project services without re-entering your password. - -##### Special consideration for Google Chrome - -To enable single sign-on out of the box for Google Chrome, Fedora takes advantage of certain features in Chrome that are intended for use in “managed” environments. A managed environment is traditionally a corporate or other organization that sets certain security and/or monitoring requirements on the browser. - -Recently, Google Chrome changed its behavior and it now reports _Managed by your organization_ or possibly _Managed by fedoraproject.org_ under the ⋮ menu in Google Chrome. That [link][27] leads to a page that says, “If your Chrome browser is managed, your administrator can set up or restrict certain features, install extensions, monitor activity, and control how you use Chrome.” However, **[Fedora will never monitor your browser activity or restrict your actions][28].** - -Enter _chrome://policy_ in the address bar to see exactly what settings Fedora has enabled in the browser. The _AuthNegotiateDelegateWhitelist_ and _AuthServerWhitelist_ options will be set to _*.fedoraproject.or_g. These are the only changes Fedora makes. - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/set-up-single-sign-on-for-fedora-project-services/ - -作者:[Stephen Gallagher][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/sgallagh/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/05/sso-fedora-web-services-816x345.jpg -[2]: https://apps.fedoraproject.org/ -[3]: https://ask.fedoraproject.org/ -[4]: https://fedoraproject.org/wiki/Fedora_Project_Wiki -[5]: https://lists.fedoraproject.org/archives/ -[6]: https://fedoramagazine.org/check-out-the-new-askfedora/ -[7]: http://src.fedoraproject.org/ -[8]: https://pagure.io -[9]: https://bodhi.fedoraproject.org -[10]: https://copr.fedorainfracloud.org/ -[11]: https://bugzilla.redhat.com -[12]: https://admin.fedoraproject.org/accounts -[13]: https://getfedora.org/ -[14]: https://admin.fedoraproject.org/accounts/user/new -[15]: https://fedoramagazine.org/wp-content/uploads/2019/05/FAS-new.png -[16]: https://fedoramagazine.org/wp-content/uploads/2019/05/changepass-1024x318.png -[17]: https://admin.fedoraproject.org/accounts/fpca/ -[18]: https://fedoramagazine.org/wp-content/uploads/2019/05/account-blurred.png -[19]: https://fedoramagazine.org/wp-content/uploads/2019/09/goa-toplevel.png -[20]: https://fedoramagazine.org/wp-content/uploads/2019/09/goa-fedora-creds.png -[21]: https://wiki.gnome.org/Projects/GnomeKeyring -[22]: https://www.mozilla.org/en-US/firefox -[23]: https://wiki.gnome.org/Apps/Web -[24]: https://www.google.com/chrome/ -[25]: https://bugzilla.redhat.com/show_bug.cgi?id=1640158 -[26]: https://lists.fedoraproject.org -[27]: https://support.google.com/chrome/answer/9281740 -[28]: https://fedoraproject.org/wiki/Legal:PrivacyPolicy diff --git a/sources/tech/20191120 Tools that Accelerate a Newbie-s Understanding of Machine Learning.md b/sources/tech/20191120 Tools that Accelerate a Newbie-s Understanding of Machine Learning.md deleted file mode 100644 index 0b41f3e7f2..0000000000 --- a/sources/tech/20191120 Tools that Accelerate a Newbie-s Understanding of Machine Learning.md +++ /dev/null @@ -1,215 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Tools that Accelerate a Newbie’s Understanding of Machine Learning) -[#]: via: (https://opensourceforu.com/2019/11/tools-that-accelerate-a-newbies-understanding-of-machine-learning/) -[#]: author: (Jatin Karthik Tripathy https://opensourceforu.com/author/jatin-tripathy/) - -Tools that Accelerate a Newbie’s Understanding of Machine Learning -====== - -[![][1]][2] - -_The world of machine learning (ML) and deep learning (DL) is a fascinating one. Many newbies would like to dabble in this field but have some inhibitions. This article introduces readers to some of the best tools to kickstart their journey into the ML/ DL domain._ - -Machine learning is a term that is applied to a broad range of topics which have one thing in common – the use of algorithms and other statistical models to improve the performance of a particular task. All machine learning (ML) models are used to build a mathematical model of the data provided, to help the user predict or make decisions with a very high level of accuracy; thereby considerably reducing the strain of manually sifting through the data. Currently, there are several fields in which ML is used extensively, from filtering out emails and computer vision, to choosing a smart assistant. Readers are urged to spend some time researching only the topics that they are interested in and not get overwhelmed or distracted by the countless other applications of ML. - -Deep learning can be considered a subset of machine learning, though to call it that really does not do it justice. Currently, most applications have moved on from the somewhat old fashioned ML algorithms to employ deep learning (DL) algorithms. The latter provide much more support for the building of more complex mathematical models which cannot be provided by ML. Deep learning algorithms employ multiple ML algorithms in a manner vaguely inspired by how the human brain works, and hence the term‘neural networks’. Deep learning algorithms have been developed to the point where it has been proved that computers can indeed be smarter than humans. - -![Figure 1: Creating a notebook][3] - -This article explores five of the most user-friendly, highly scaleable ML libraries/tools available. These are: - - * Scikit-learn - * OpenCV - * TensorFlow - * Keras - * Google Colaboratory - - - -Some of you may be familiar with a couple of these libraries and even know how to use them. This is not meant to be an in-depth tutorial for any of these tools. The idea is that, hopefully, by the end of this article, readers will discover which of the five libraries featured, interests them enough to read further on the topic. - -**Scikit-learn** -The founders of Scikit-learn started off by trying to find answers to simple problems. I believe that any aspirant must follow the pioneer’s footsteps. Scikit-learn is a free library written for Python which lets users do exactly that. It operates using Python’s NumPy and SciPy libraries to achieve multiple aspects of machine learning with ease, such as various algorithms for classification, regression and clustering. It lets the user easily step into the world of artificial intelligence (AI) without making them feel that they’ve taken too big a leap. With its easy-to-use libraries, you can easily incorporate any of the above ML algorithms into your code. While Scikit-learn is essentially for older ML algorithms, beginners will have their hands full trying to implement various algorithms to see how they affect a particular use case. -This library is largely implemented in Python with some parts of it written in Cython, thus restricting its usage to how much Python you know. Python, incidentally, has a tremendous collection of libraries and third party APIs. - -The advantage of starting off with Scikit-learn is that most programmers with similar aspirations have also started off along the same path. There is huge support for Scikit-learn with the entire code written using the Scikit-learn library, making the learning process fairly simple. It also helps that the official documentation of Scikit-learn is one of the more refined and well written. So, most of your doubts will probably get clarified by just going through the documentation. -To start off with Scikit Learn, just follow the instructions available at the official site, at __. - -![Figure 2: Accessing notebook settings][4] - -**OpenCV** -OpenCV is a cross platform library that lets the user tackle any kind of real-time computer vision. - -**Note:** _Computer vision is a field of computer science that deals with how computers can be made to acquire a high level knowledge from photos or videos. It includes the tasks of acquiring, processing, analysing and understanding the data._ - -OpenCV has a wide range of applications, starting with simple algorithms that deal with 2D images, all the way up to augmented reality, motion tracking, etc. OpenCV is not as user-friendly as Scikit-learn, yet, with a little time anyone can easily understand the flow of things – well enough to use OpenCV to its maximum extent. OpenCV, unlike Scikit-learn, is mostly written in C/C++ and is a cross platform library. This means that the users can truly optimise their code by using lower level and complied languages such as C/C++ or Java. OpenCV also includes a statistical ML library with which it can stand alone to some extent. OpenCV also has integrations with leading DL frameworks such as TensorFlow and Torch/PyTorch, making it a very versatile tool which can be used even if the provided ML library does not meet the user’s demands. - -One of the notable things about OpenCV is that it supports hardware acceleration in three different cases, namely: - - * Intel’s Integrated Performance Primitives - * A CUDA based GPU interface - * An OpenCL based GPU interface - - - -The fact that OpenCV can use hardware acceleration means that the user can easily increase the performance of the code with simple modifications, thereby resulting in smoother real-time applications due to faster code execution. - -**Note:** _It is advisable to use hardware accelerations that are mathematically intensive to perform, else there is a chance of a drop in performance due to the time it takes to shift resources to the GPU from the CPU._ - -Detailed installation instructions for OpenCV are available from the official documentation for the Python programming language at _ py_setup/py_setup_in_windows/py_setup_in_windows.html_. Other installations can also be found in the documentation. - -**TensorFlow** -TensorFlow is an open source library which tackles data flow programming across a range of applications, from a symbolical mathematical library to the core library in neural network programming. Developed by the Google Brain team for the search giant’s internal use, today it is used within the firm for purposes ranging from research to production. - -**Note:** _The TensorFlow library is so named because it operates on multi-dimensional data arrays called tensors, whilst performing calculations for neural networks._ - -Unlike the earlier libraries, TensorFlow has been streamlined to make neural networks and is optimised for DL applications. TensorFlow is best at data crunching at a scale where data can be realistically processed using any other older technique. You can do all this while keeping the usage so simple, that, any devoted Python user will feel right at home with the line-by-line implementation of the neural network, allowing the user to easily implement high level concepts that involve a huge amount of mathematical theory behind them, with the call of a single function. This allows the user to quickly create a neural model and focus on refining it rather than worry about the mathematics behind it, making for faster prototyping. - -Like OpenCV, TensorFlow is not restricted to Python but supports other languages. Support ranges from having direct support to having third party APIs taking care of that. TensorFlow has a very flexible architecture system that allows it to be used in various devices, whether it is CPUs, GPUs or even TPUs (tensor processing units), as well as clustered servers or even handheld devices such as mobile phones. This allows TensorFlow to have a hardware acceleration capability that is unrivalled by most other libraries. - -**Note:** _Keras is a pure Python library unlike TensorFlow_ - -TensorFlow can take code to the browser with the use of TensorFlow.js, making DL projects lightweight and easily scaleable. TensorFlow Lite, which was built for using TensorFlow, specifically for Android development (beginning from Android Oreo) is even lighter. It has a wide reach. There are several applications of this library for different use cases, from being the foundation of some new technologies such as Deep Dream, an automated image captioning software, to being the core in many users’neural network projects. While it can be applied for a great many things, getting started off is not that hard. TensorFlow has huge support online with no lack of example code to go through before you tackle your first project. - -You can begin your TensorFlow journey by getting the Python library at _. org/install/_ and if you have a GPU that meets CUDA requirements, you can even optimise your execution using hardware acceleration. - -![Figure 3: Hardware accelerator][5] - -**Keras** -Keras is an open source Python library which runs on top of other Python libraries such as TensorFlow, Microsoft Cognitive Toolkit, or Theano. Keras focuses on being more user-friendly, modular and extensible compared to the libraries that it runs on top of. -Keras has official support from Google’s TensorFlow team (for the TensorFlow core library), allowing users to quickly build their code using the numerous implementations of commonly used neural networks methods already predefined in the Keras package. Like TensorFlow, Keras also supports hardware acceleration by the use of GPUs or TPUs, allowing the user far easier coding in almost the same execution time. - -Unlike the other tools mentioned in our list, Keras is not a standalone library. Rather, it acts as a high-level API to other libraries that require comparatively more complex ways of coding. This allows users to achieve far more rapid prototyping with their code. As a trade-off for this level of user-friendly Python coding, you lose some level of control over your code. For example, in Keras, while you do have considerable control over your network, any of the lower level packages that implement Keras will control the finer things of the network. - -This might lead you to wonder, why one should even use Keras? The sole reason is that most of the time, while trying out new implementations of neural networks, that high level of control over the hyper parameters isn’t required. The trade-off obtained by dropping that functionality makes far more sense to any programmer who only wants to see how the network performs. You can think of Keras as a way of getting the feel of what you are trying to build before trying to optimise it at a much lower level so that your networks perform the best. Keras has one of the most user-friendly approaches to coding neural networks. For anyone who just wants to try out the latest advances in current technology, Keras will almost always meet such a user’s demands. One small shortcoming is that Keras is a pure Python library unlike TensorFlow. - -**Note:** _As of June 2019, Keras has officially been ported together with Tensorflow to bcome Tensorflow 2.0. This new version of Tensorflow cuts back on a lot of extras previously available, resulting in a more standardised approach of writing code using the Keras API. Tensorflow 2.0 is currently in beta stage, but it already implements a lot of the more commonly used features, so if you feel like foraging into the new and improved library, head over to: _ - -It is possible for one to transform Keras models from Python to lower level languages such as C/C++. -As an example of how easy it is to understand and use Keras as compared to TensorFlow, let us take a look at both these libraries when used for the same application – the classification of handwritten numbers using the Mnist data set. -First let us look at an example of using pure TensorFlow to finish the task, as shown below: - -``` -import tensorflow as tf -mnist = tf.keras.datasets.mnist - -n_nodes = 512 -n_classes = 10 -batch_size = 100 - -x = tf.placeholder('float', [None, 784]) -y = tf.placeholder('float') - -def neural_network_model(data): -layer_1 = {'weights':tf.Variable(tf.random_normal([784, n_nodes])), -'biases':tf.Variable(tf.random_normal([n_nodes]))} -output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes, n_classes])), -'biases':tf.Variable(tf.random_normal([n_classes])),} -l1 = tf.add(tf.matmul(data,layer_1['weights']), layer_1['biases']) -l1 = tf.nn.relu(l1) -output = tf.matmul(l1,output_layer['weights']) + output_layer['biases'] -return output - -def train_neural_network(x): -prediction = neural_network_model(x) -cost = tf.reduce_mean( tf.nn.sparse_softmax_cross_entropy_with_logits(logits=prediction,labels=y) ) -optimizer = tf.train.AdamOptimizer().minimize(cost) -hm_epochs = 5 -with tf.Session() as sess: -sess.run(tf.initialize_all_variables()) -for epoch in range(hm_epochs): -epoch_loss = 0 -for _ in range(int(mnist.train.num_examples/batch_size)): -epoch_x, epoch_y = mnist.train.next_batch(batch_size) -_, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y}) -epoch_loss += c -print('Epoch', epoch, 'completed out of',hm_epochs,'loss:',epoch_loss) - -correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) -accuracy = tf.reduce_mean(tf.cast(correct, 'float')) -print('Accuracy:',accuracy.eval({x:mnist.test.images, y:mnist.test.labels})) - -train_neural_network(x) -``` - -Now that we have that part done, let us take a look at the same implementation using _tf.keras_ : - -``` -import tensorflow as tf -mnist = tf.keras.datasets.mnist - -(x_train, y_train),(x_test, y_test) = mnist.load_data() -x_train, x_test = x_train / 255.0, x_test / 255.0 - -model = tf.keras.models.Sequential([ -tf.keras.layers.Flatten(), -tf.keras.layers.Dense(512, activation=tf.nn.relu), -tf.keras.layers.Dense(10, activation=tf.nn.softmax) -]) -model.compile(optimizer='adam', -loss='sparse_categorical_crossentropy', -metrics=['accuracy']) -print("running...") -model.fit(x_train, y_train, epochs=5) -model.evaluate(x_test, y_test) -``` - -The Keras code is far simpler and the language is at a higher level than TensorFlow. - -**Colaboratory by Google** -Increased performance in the execution of code is possible through the use of hardware like GPUs or TPUs rather than by running it solely on the CPUs. This is because CPUs, unlike the other two, have a limited number of cores and cannot process the vast mathematical calculations required even for quite a simple neural network. However, what can be done if your GPU is not supported by CUDA or you simply do not have one? - -That is where services such as Colaboratory come into play. Colaboratory is an online service that lets you use an online notebook system called Jupyter to write and execute code which is wholly based on the cloud. This avoids investing in expensive hardware such as a GPU to optimise code. Google Colaboratory gives you access to a Nvidia Tesla K80 GPU at no cost at all. The Colaboratory environment is exactly the same as any offline Python implementation. This means that there is absolutely no learning curve prior to starting off with Colaboratory. The fact that you run you code completely online means that you do not have to install any of the dependencies on your personal computer and this means that you are not restrained from implementing the latest ideas. -Putting your projects completely on the cloud allows you far more freedom and the access to Google TPUs which power the Colaboratory project. Unlike the Nvidia Tesla K80 GPU, the TPU does not come free, but you can use it for a basic fee calculated on TPU usage per second. This allows for the least possible execution time at the cheapest possible price. Like the TPU, Colaboratory also has several plans for other more powerful GPU prices, which are lower than the TPU rates, allowing you to choose what you feel is best for your particular use case. - -As mentioned earlier, Colaboratory is the same as any offline Python development environment that you may already be used to, thus allowing you to use packages that you normally do, such as OpenCV, TensorFlow, Keras, etc. A simple implementation of TensorFlow using Google Colaboratory is given below, starting from the official welcome page, __. - -To start off, first create your Python3 notebook in Colaboratory as shown in Figure 1. -Once you have done that, navigate to the notebook settings (_Edit > Notebook Settings_) as shown in Figure 2. - -Once you have selected the notebook settings, you can now change the runtime type to Python2 or Python3 and you can also change the hardware accelerator. It is here that you will decide on whether you want use the free Nvidia Tesla K80 GPU or the TPU provided by the service (Figure 3). - -![Figure 4: Mnist example][6] - -Now that the environment is set up, we can finally try out some program to test it. The purpose of this article is not to take you through any specific machine learning or deep learning example. For the sake of testing Colaboratory, let’s use the classic Mnist example that has been taken directly from the TensorFlow website __ -Once you have grabbed the code, simply execute it in the notebook and you should see an output as shown in Figure 4. - -Using Colaboratory, you have executed a basic classification example within minutes, without the need for any extra installations of TensorFlow (or even Python) on your computer. Thus, you can fully concentrate only on what you want to achieve and not bother about the dependencies needed for your project. - -We have seen only five of the vast number libraries that are available in the open source world. These five tools will provide the reader with a strong-enough footing to push forward and explore more complex tools that are streamlined for a particular use case. I urge you to also try to learn the mathematics of any new technology that you implement as it gives you a finer understanding of the how and whys of each thing. A nice start to any theory is the Machine Learning Cheatsheet, __ which, while barely scratching the surface of the mathematics behind the implementations, gives a very clear idea about the concepts and code examples to lead you in the right direction - -![Avatar][7] - -[Jatin Karthik Tripathy][8] - -The author takes a keen interest in graphics programming, graphics modelling, artificial intelligence, etc. He can be reached at jatinkarthik (dot) tripathy (at) vitap(dot) ac(dot) in. - -[![][9]][10] - --------------------------------------------------------------------------------- - -via: https://opensourceforu.com/2019/11/tools-that-accelerate-a-newbies-understanding-of-machine-learning/ - -作者:[Jatin Karthik Tripathy][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensourceforu.com/author/jatin-tripathy/ -[b]: https://github.com/lujun9972 -[1]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Deep-Learning-Machine-learning-Artificial-intelligence.jpg?resize=696%2C502&ssl=1 (Deep Learning Machine learning Artificial intelligence) -[2]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Deep-Learning-Machine-learning-Artificial-intelligence.jpg?fit=700%2C505&ssl=1 -[3]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-1-Creating-a-notebook.jpg?resize=350%2C175&ssl=1 -[4]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-2-Accessing-notebook-settings.jpg?resize=350%2C280&ssl=1 -[5]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-3-Hardware-accelerator.jpg?resize=350%2C256&ssl=1 -[6]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/11/Figure-4-Mnist-example-350x281.jpg?resize=350%2C281&ssl=1 -[7]: https://secure.gravatar.com/avatar/19d277f27f20b7db95dacaff344a6948?s=100&r=g -[8]: https://opensourceforu.com/author/jatin-tripathy/ -[9]: https://opensourceforu.com/wp-content/uploads/2019/11/assoc.png -[10]: https://feedburner.google.com/fb/a/mailverify?uri=LinuxForYou&loc=en_US diff --git a/sources/tech/20191120 Troubleshooting PCIe Bus Error severity Corrected on Ubuntu and Linux Mint.md b/sources/tech/20191120 Troubleshooting PCIe Bus Error severity Corrected on Ubuntu and Linux Mint.md deleted file mode 100644 index e2051d7401..0000000000 --- a/sources/tech/20191120 Troubleshooting PCIe Bus Error severity Corrected on Ubuntu and Linux Mint.md +++ /dev/null @@ -1,160 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Troubleshooting PCIe Bus Error severity Corrected on Ubuntu and Linux Mint) -[#]: via: (https://itsfoss.com/pcie-bus-error-severity-corrected/) -[#]: author: (Community https://itsfoss.com/author/itsfoss/) - -Troubleshooting PCIe Bus Error severity Corrected on Ubuntu and Linux Mint -====== - -Recently I was trying to install Mint on several nodes in my institute. At times, I was not able to install and got lots of ‘PCIe Bus’ errors on the screen. I have also observed similar issue with Ubuntu 18.04. - -I got stuck into it for more than a month, after using many solution and observations (solution is the same, but observation and treatment may be different), I found something which was helpful for me and I think could be helpful for other Ubuntu and Linux Mint users. - -### Observations about PCIe Bus Error severity Corrected - -![][1] - -It happened with my HP system and it seems that there is some compatibility issues with the HP hardware. The PCIe Bus Error is basically the Linux kernel reporting the hardware issue. - -This error reporting turns into nightmare because of the frequency of error messages generated by the system. I have noticed in various [Linux forums][2] that many HP user have encountered this error, probably HP needs to improve Linux support for their hardware. - -Do note that this doesn’t necessarily mean that you cannot use Linux on your HP system. You might be able to use Linux like everyone else. It’s just that seeing this message flashing on the screen on every boot is annoying and sometimes, it could lead to bigger troubles. - -If the system keeps on reporting, it will increase the log size. If you have limited space for root, it could mean that your system will stuck at the black screen displaying the PCIe error message and your system won’t be able to boot. - -Now that you know a few things, let’s see how to tackle this error. - -### Handling PCIe Bus Error messages if you can boot in to your Linux system - -If you see the PCIe Bus Error message on the screen while booting but you are still able to log in, you could do a workaround for this annoyance. - -You can do little on the hardware compatibility front. I mean you (most probably) cannot go ahead and start coding drivers for your hardware or fix the existing drivers code. If your system works fine, your main concern should be that too much of error reporting doesn’t eat up the disk space. - -In that regard, you can change the Linux kernel parameter and ask it to stop reporting the PCIe errors. To do that, you need to edit the grub configuration. - -Basically, you just have to use a text editor for editing the file. - -First thing first, make a backup of your grub config file so that you can revert in case if you are not sure of things you changed. Open a terminal and use the following command: - -``` -cp /etc/default/grub ~/grub.back -``` - -Now open the file with Gedit for editing: - -``` -sudo gedit /etc/default/grub -``` - -Look for the line that has **GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”** - -Add pci=noaer in this line. AER stands for Advanced Error Reporting and ‘noaer’ asks the kernel to not use/log Advanced Error Reporting. The changed line should look like this: - -``` -GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=noaer" -``` - -Once you have saved the file, you should update the grub using this command: - -``` -sudo update-grub -``` - -[Restart Ubuntu][3] and you shouldn’t see the ‘PCIe Bus Error severity Corrected messages’ anymore. - -If this doesn’t fix the issue for you, you can try to change other kernel parameters. - -#### Further troubleshooting: Disable MSI - -Now you are resorting to hit and trial. You may try disabling [MSI][4]. Though Linux kernel supports MSI for several years now, a wrong implementation of MSI from some hardware manufacturer may lead to the PCIe errors. - -The drill is practically the same as you saw in the previous section. You edit the grub configuration and make the GRUB_CMDLINE_LINUX_DEFAULT line look like this: - -``` -GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nomsi" -``` - -Update grub and reboot the system: - -``` -sudo update-grub -``` - -#### Even further troubleshooting: Disable mmconf - -I know it’s getting repetitive but if you are still facing the issue, it could be worth to give this a last try. This time, disable the mmconf parameter in Linux kernel. - -mmconf means memory mapped config and if you have an old computer, a buggy BIOS may lead to this issue. - -The steps remain the same. Just change the line GRUB_CMDLINE_LINUX_DEFAULT in your grub config to make it look like: - -``` -GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nommconf" -``` - -#### Can’t boot! How to edit grub config now? - -In some cases, if you are not even able to boot at all, perhaps your root is out of space. An idea here would be to delete old log files and see if you could boot now and if yes, change the grub config. - -On reboot, if you stuck with logs on the screen and do a hard boot (use power button to turn it off and on again). When you power on, choose to go in to recovery mode from the grub screen. It should be under Advanced options. - -![][5] - -If your system doesn’t show the grub screen, press and hold shift key at boot. In some systems, pressing the Esc key brings the grub screen. - -In the advanced option->recovery mode: - -![][6] - -Drop into root shell: - -![][7] - -If you use the ls command to find large files, you’ll see that sys.log and kern.log take huge space: - -``` -ls -s -S /var/log -``` - -You can [empty the log files in Linux command line][8] this way: - -``` -$ > syslog -$ > kern.log -``` - -Once that is done, reboot your system. You should be able to log in. You should quickly change the grub parameters as discussed above. Adding pci=noaer should help you in this case. - -I know it’s more of a workaround than solution. But this is something that troubled me long and helped me get around the error. Otherwise I had to reinstall the system. - -I just wanted to share what worked for me with the community here. I hope it helps you as well. - -This article is written by Arun Shrimali. Arun is IT Head at Resonance Institute in India and he tries to implement Open Source Software across his organization. - -The article has been edited by Abhishek Prakash. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/pcie-bus-error-severity-corrected/ - -作者:[Community][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/itsfoss/ -[b]: https://github.com/lujun9972 -[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/troubleshooting_linux.png?ssl=1 -[2]: https://itsfoss.community/ -[3]: https://linuxhandbook.com/restart-ubuntu-server/ -[4]: https://en.wikipedia.org/wiki/Message_Signaled_Interrupts -[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2012/07/new-grub-menu-ubuntu.png?ssl=1 -[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2012/07/boot-into-recovery-mode-ubuntu-1.jpg?ssl=1 -[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2012/07/drop-to-root-prompt-1.png?ssl=1 -[8]: https://linuxhandbook.com/empty-file-linux/ diff --git a/sources/tech/20191122 How to use Bitwarden for password protection on Active Directory.md b/sources/tech/20191122 How to use Bitwarden for password protection on Active Directory.md deleted file mode 100644 index 67b79f1c64..0000000000 --- a/sources/tech/20191122 How to use Bitwarden for password protection on Active Directory.md +++ /dev/null @@ -1,219 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to use Bitwarden for password protection on Active Directory) -[#]: via: (https://opensource.com/article/19/11/bitwarden-password-protection-active-directory) -[#]: author: (Stephen Bancroft https://opensource.com/users/stevereaver) - -How to use Bitwarden for password protection on Active Directory -====== -Integrate your Linux self-hosted Bitwarden instance with AD using -Bitwarden Directory Connector. -![A lock on the side of a building][1] - -[Bitwarden][2] is a fantastic tool for managing passwords. It has applications for every platform, a browser plugin, and a self-hosted version, and it offers some great password management tricks like folders and collections. One of my favorite features is that it will keep a history of your old passwords, which is a great feature for enterprise users. - -If you are an enterprise user, you are probably self-hosting Bitwarden and want to sync your users with a staff directory. My organization uses Active Directory (AD), which is the standard for user directories and integrates seamlessly with Windows desktops. I also need it to work with our open source tools, and herein lies the secret sauce shared in this article. - -The tool that allows you to do this is [Bitwarden Directory Connector][3] (BWDC). If you do a Google search, you will not find much information on using BWDC with AD on Linux. [Bitwarden's blog][4] is a great starting point if you're using the Windows version but it won't help you integrate it into your Linux environment. You can find instructions to do that on Bitwarden's GitHub page, but they aren't very clear. So, here I'll explain how to get your Linux self-hosted version of Bitwarden to integrate with your enterprise Active Directory (and, hopefully, provide more fruitful results for future Google searchers looking for this information). - -In my setup, both Bitwarden and Active Directory are hosted on AWS, the former in an EC2 instance and the latter in AWS Simple Directory. The Bitwarden Docker container is installed in the home directory of a user called **bitwarden**. [Bitwarden's instructions][5] make this easy to set up. But setting up BWDC is not as clear, so I will try to fix that here. - -### Install BWDC - -Start by setting up a directory for BWDC, then download the ZIP file and unzip it: - - -``` -cd /home/bitwarden -mkdir directory-connector -cd directory-connector -wget -unzip bwdc-linux-2.6.2.zip -chmod +x bwdc -``` - -(At the time of this writing, BWDC 2.6.2 was the current version; that may change, so make sure to download the latest release.) - -You will now have a binary file called **bwdc** and a file called **keytar.node**; leave both files right where they are. - -Next, edit the profile of the **bitwarden** user: - - -``` -`vi /home/bitwarden/.profile` -``` - -and add the lines: - - -``` -export BITWARDENCLI_CONNECTOR_PLAINTEXT_SECRETS=true -export PATH=$PATH:/home/bitwarden/directory-connector -``` - -Log out and back in to pick up the new settings, or you can source the profile with: - - -``` -`  . ~/.profile` -``` - -The line **BITWARDENCLI_CONNECTOR_PLAINTEXT_SECRETS=true** tells BWDC not to use any desktop-based keystore. Since this is a server and it's unlikely to have a desktop installed, you will have to keep the password in plain text (but you will take precautions to protect it later). The second line sets up a path to the **bwdc** binary so it can run from any directory you are in. - -### Configure BWDC - -Once BWDC is installed, configure it to connect to your Bitwarden instance: - - -``` -bwdc login -? Email address: <your email for your master account> -? Master password: [hidden] -``` - -After you are logged in, you're ready to work on the **data.json** file. - -If you set up BWDC using the steps above, its configuration information will be stored in **/home/bitwarden/.config/Bitwarden Directory Connector/data.json**. This file contains the **appId** and **access token**; these are the login credentials for your Bitwarden instance. But what about Active Directory, you say? You can add that manually by editing your **data.json** file (I assume you are on a server and are using Vi): - - -``` -`vi '/home/bitwarden/.config/Bitwarden Directory Connector/data.json'` -``` - -Add the following just underneath the **appId** line: - - -``` -"rememberEmail": true, -  "rememberedEmail": "<the email address you logged in with>", -  "organizationId": "<your organization id>", -  "directoryType": 0, -  "directoryConfig_0": { -    "ssl": false, -    "sslAllowUnauthorized": false, -    "port": 389, -    "currentUser": false, -    "ad": true, -    "hostname": "<hostname of your active directory>", -    "rootPath": "<root path of AD, something like; dc=com,dc=au>", -    "username": "<username with privilege to read the AD; DOMAIN\\\Username>", -    "password": "<password for the above account>" -  }, -  "directoryConfig_2": {}, -  "directoryConfig_1": {}, -  "directoryConfig_3": {}, -  "syncConfig": { -    "users": true, -    "groups": true, -    "interval": 5, -    "removeDisabled": true, -    "overwriteExisting": true, -    "useEmailPrefixSuffix": false, -    "creationDateAttribute": "whenCreated", -    "revisionDateAttribute": "whenChanged", -    "emailPrefixAttribute": "sAMAccountName", -    "memberAttribute": "member", -    "userObjectClass": "person", -    "groupObjectClass": "group", -    "userEmailAttribute": "mail", -    "groupNameAttribute": "name", -    "userFilter": "(&(memberOf=CN=bitwarden,OU=groups,DC=work,DC=corp))", -    "groupPath": "OU=Groups", -    "userPath": "CN=Users" -  }, -  "environmentUrls": { -    "base": "<base url of your bitwarden instance; [https://bitwarden.yourdomain\>][6]", -    "api": null, -    "identity": null, -    "webVault": null, -    "icons": null, -    "notifications": null, -    "events": null -  }, -``` - -If you look through this, you'll see that you need to change several values in this entry, including the **userFilter**, **groupPath**, and **userPath**. (I will assume you are familiar with LDAP and AD and know what those values should be for your instance.) Keep the **CN=bitwarden** part for the Bitwarden AD group you will create later. The other value you need to change is **organizationID**, which you can find in your **bwdata** directory as the name of one of the JSON files. List the files: - - -``` -`ls /home/bitwarden/bwdata/core/licenses/organization` -``` - -This should return a directory listing, containing a single filename in the form **<organization id>.json**. The filename itself is your organization's ID. Insert it into the **organizationID** line in the code above. - -Once you get your **data.json** file right, _I **highly** recommend you back up this file_. There seems to be an issue that sets this file back to default settings if BWDC finds a problem with it. This means if you innocently make a change to the file and there is a mistake, you will lose the entire configuration. - -Next, test connectivity to your AD as the **bitwarden** user: - - -``` -`bwdc test` -``` - -This should return a dump of the groups in your AD. To protect your password, set the permissions on that file so that only the **bitwarden** user can read it: - - -``` -`chmod 700 '/home/bitwarden/.config/Bitwarden Directory Connector/data.json'` -``` - -### Set up your group - -Now add a group to your AD (my group is called **bitwarden**), where you will add and remove users as they need access to Bitwarden. This group is necessary because, if you don't filter the users based on this group, BWDC will try to use ALL users in your AD. If the number of users is greater than your Bitwarden license allows, BWDC will fail silently, and you will hate yourself for a long time…. much like I did! - -Once the group is set up and has at least one user, run the test again. You should see your user's email address in the output. - -Now it is time to sync. Once you sync, any users that appear in the **bitwarden** group will be added to Bitwarden, and an email will be sent to them to invite them to sign up. Working as the **bitwarden** user, sync the directories with: - - -``` -`bwdc sync` -``` - -Given that **removeDisabled** is set to **true** in the **data.json** file, you can set up a cron job to keep the members of the **bitwarden** group and the Bitwarden users in constant sync so that any changes you make in your AD are immediately reflected in your Bitwarden instance. Add the following to your **/etc/crontab**: - - -``` -# Sync for Active Directory to Bitwarden -* *     * * *   bitwarden export BITWARDENCLI_CONNECTOR_PLAINTEXT_SECRETS=true ; /home/bitwarden/directory-connector/bwdc sync >/dev/null 2>&1 -``` - -Once you have auto-sync going, you will have a complete list of all your AD groups in Bitwarden. From there, it's just a simple matter of assigning a group to a collection and then adding members to groups in your AD. The users will be automatically assigned to the correct password collections and see the passwords they need. - -### Potential traps - -Finally, I will tell you about a few little traps that I fell into when setting this up. First, be aware of the **AD Primary Group**. You may have set this for a user if any of your Linux or other POSIX systems get login credentials from AD. It seems that AD will not include a user in group search results if that group is set as the primary group; this could remove a user from a group and therefore lose access to a collection. - -Second, when you need to delete a user, you might think that removing an account from the group in AD would remove the user… wrong! It seems that Bitwarden keeps some user information hanging around in its database. This became painfully obvious when I removed my own account and then discovered that I was no longer able to log in after recreating it because the multi-factor authentication (MFA) was still active and the token had expired, effectively locking me out. You must explicitly tell Bitwarden to remove that stuff in the database. To do so, go to the URL: - - -``` -`https:///#/recover-delete` -``` - -Enter the email address the user signed up with. They will get an email instructing them to click a link to confirm to remove the account. Once that is done, the user can be put back in the Bitwarden AD group and go through the sign-on process again. - -Now you know how to get your self-hosted Bitwarden working with your AD. I think you will still experience a few issues, but with a little bit of patience and tinkering with the configuration, it will work. Just don't muck around with it too much once it is working! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/bitwarden-password-protection-active-directory - -作者:[Stephen Bancroft][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/stevereaver -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_3reasons.png?itok=k6F3-BqA (A lock on the side of a building) -[2]: https://bitwarden.com/ -[3]: https://github.com/bitwarden/directory-connector -[4]: https://blog.bitwarden.com/organization-user-groups-directory-sync-ba674cb78a5c -[5]: https://help.bitwarden.com/article/install-on-premise/ -[6]: https://bitwarden.yourdomain\> diff --git a/sources/tech/20191125 25 Raspberry Pi Project Ideas to Put Your Pi to Some Good Use.md b/sources/tech/20191125 25 Raspberry Pi Project Ideas to Put Your Pi to Some Good Use.md deleted file mode 100644 index 37912e7e20..0000000000 --- a/sources/tech/20191125 25 Raspberry Pi Project Ideas to Put Your Pi to Some Good Use.md +++ /dev/null @@ -1,303 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (25 Raspberry Pi Project Ideas to Put Your Pi to Some Good Use) -[#]: via: (https://itsfoss.com/raspberry-pi-projects/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -25 Raspberry Pi Project Ideas to Put Your Pi to Some Good Use -====== - -It won’t be an exaggeration if I call Raspberry Pi a revolutionary gadget. When it was first launched in the year 2011-12, people just couldn’t believe that a computer can be available in just $25. - -If you bought a Pi and wondering what should do with my Raspberry Pi, I have got your back. I am going to list some cool Raspberry Pi projects that you can start following in your free time. - -These Raspberry Pi project ideas are not limited to Pi. You can use them with other [Raspberry Pi like devices such as Orange Pi, Khadas][1] etc. - -### 25 Cool Raspberry Pi Projects - -I have listed several these project ideas by categorizing them in terms of the level of complexity (beginner, intermediate, and advanced). Some projects need additional equipment and sensors as well. - -Of course, it is worth noting that it will be subjective to what expertise you have. So, let us take a look at the project ideas. - -**Beginner Level Raspberry Pi Projects** - -#### 1\. Media Server - -Building a media server using Rasberry Pi is the most common and probably the easiest project there is. - -You can take a look at some of the [best media server software][2] available for Linux and get started. - -To know more about it, you can refer to the official documentation of [using Kodi with Raspberry Pi][3] (which is one of the media server software available). - -[Using Kodi On Raspberry Pi][3] - -#### 2\. Weather Station - -![][4] - -If you’re good at building projects with electronic components, building a weather station using Raspberry Pi should be fun for you. - -This may not be the easiest one to start with – but it’s quite simple if you carefully look into the project requirements. - -You will be able to collect weather data using a variety of sensors as per your requirements. The project has been listed on the official website to help you build it as easily as possible. - -[Weather Station Project][5] - -#### 3\. The Parent Detector - -![][6] - -Yet another project from Raspberry Pi’s official website, this project uses minimal hardware to set up a motion detector which then triggers a video recording using the Raspberry Pi camera module. - -The use-case for this can be a lot of things. If you are a parent, you can keep an eye on your child when they enter their room. In either case, this can also come in handy to keep an eye on your door as a security measure to check when someone arrives. - -You can find all the necessary details on Raspberry Pi’s official site. - -[The Parent Detector][7] - -#### 4\. FM Radio Station - -Raspberry Pi is an inexpensive device for making an FM radio station. The pre-requisites may not be much but is worth exploring for fun. - -Do note that you may not want to interfere with the local FM frequencies. You can find all the details to set it up by clicking the button below. - -[FM Radio Transmitter][8] - -#### 5\. Minecraft Game Sever - -![][9] - -Minecraft is a quite popular game. However, if you want a personal server, you might have to pay a premium. - -Fret not, you can use your Raspberry Pi to build a local server, create your own world and have fun with your family/friends. - -[Minecraft Game Server][10] - -#### 6\. Temperature Log - -It was something interesting I found on the official website to help you learn a few things like – how to write data to a file etc. - -Here, you will be recording the temperature using the sensor present. - -For this, you will be utilizing the command-line to monitor the temperature of Raspberry Pi. - -[Temperature Log][11] - -#### 7\. Retro Gaming Console - -You can turn your Raspberry Pi into a gaming console by simply installing an OS on an SD card and transfer a few files to it. - -We also have an article on how you can [turn your old PC into a Retrogaming console][12] if you are curious. - -I have linked a resource to help you make this project in the button below: - -[Retro Gaming Console][13] - -#### 8\. Full-Fledged Desktop - -![][14] - -If you do not want to invest a lot to build a PC, you can easily utilize your Raspberry Pi to build one. - -Technically, your Raspberry Pi will be the heart of your PC and you will need to add accessories (monitor, keyboard, mouse, etc) to turn it into a PC. You can also choose to build a custom case for the board if you want – which is totally optional. - -Obviously, the PC won’t be powerful enough for all kinds of tasks – but it will be usable. You can also check out the experience of having [Raspberry Pi 4 as a desktop replacement][15] on their official website as a reference to this project. - -[Full-Fledged Desktop][16] - -**Intermediate Level Raspberry Pi Project Ideas** - -#### 9\. Build a LAMP Web Server with WordPress - -If you are into web development, you can try setting up a LAMP (Linux + Apache + MySQL + PHP) server and install WordPress to create a website. You can also choose to make something else from scratch without installing WordPress. - -You will be able to access the site on any device on the same network as your Raspberry Pi. - -[Build a LAMP Web Server][17] - -#### 10\. Laser Tripwire - -It is a similar concept to the parent detector that uses a motion sensor. In this case, a laser beam is used to detect activity whenever someone breaks the beam. - -You just need a few things to set up the alarm and complete the tripwire. Of course, this is a simple project to start with that has potentially different applications. - -[Laser Tripwire][18] - -#### 11\. Print Server - -What if you can turn your old printer to work on a network of devices even without requiring a built-in WiFi feature? - -Well, that’s what this project is about. You will be able to access your printer from multiple devices using a print server. Check out all the details to help build one by clicking the button below. - -[Raspberry Pi Print Server][19] - -#### 12\. Time Lapse Camera - -Looking for a cheap dedicated time-lapse camera? Well, you can do it yourself with a Raspberry Pi. - -You can use the Pi camera module or explore other options as well. - -[Time-Lapse Camera][20] - -#### 13\. Music Box - -You can build a button-controlled music box using Raspberry Pi to have a great time with your kids or anyone who loves music. - -When you press a button, it will play a sound. You can find the short description of the project in the video above, for more details click on the button below. - -[Music Box][21] - -#### 14\. Google Home On Raspberry Pi - -If you could configure and set up Google Assistant on your Raspberry Pi, you can turn it into an inexpensive Google Home DIY alternative, right? - -Fortunately, you can achieve that with your Raspberry Pi. Find out more about it in the video above. - -#### 15\. Build Smart TV Box - -If you know how to set up a media server on Raspberry Pi (as mentioned in the first project idea of this article), you can make this happen too. - -With the help of the Kodi box (or similar), you can build your own personal smart TV box powered by the media server of your choice. - -[Smart TV Box][22] - -#### 16\. Add Gesture Controls To Raspberry Pi - -You can add the ability to have gesture controls for any of your projects on Raspberry Pi using a [Flick board][23]. - -It may not be the cheapest project but it is an impressive touch for your Raspberry Pi project. - -[Gesture Controls][23] - -**Advanced Level Raspberry Pi Project Ideas** - -#### 17\. Tor Router - -If you are someone who wants to explore ways to enhance your personal digital privacy, you can start by building your own local Tor onion router. - -With this, you can scramble your Internet connection and remain anonymous with your browsing activities. It is just something like a VPN but technically different. - -[Tor Router][24] - -#### 18\. Control LEDs with your voice - -![][25] - -This is quite interesting. I have already mentioned a project where you can set up Google Assistant on your Raspberry Pi. However, in this case, you will be able to control the LEDs with your voice. - -You will not need the assistant this time, all you need is the [Google AIY voice kit][26]. This has been featured on the list of official DIY projects using Raspberry Pi, you can get more information there. - -[Control LEDs With Voice][27] - -#### 19\. WiFi Extender - -If you want to increase the range of your WiFi network, you might have to opt for a premium gadget that can help you do that or you can utilize Raspberry Pi to get the job done. - -Yes, that’s right, you can build a WiFi extender by just using your Raspberry Pi. - -[WiFi Extender][28] - -#### 20\. VPN Server - -You do not need to trust the VPN providers if you can build your own local VPN server. It can be quite challenging to make it happen. - -So, if you are up for some action, you can use your Raspberry Pi to make a private VPN server for your connection. Explore more about it here: - -[VPN Server][29] - -#### 21\. Home Automation Using Raspberry Pi - -A lot of powerful projects can be done using the Raspberry Pi, one of which is – ‘Home Automation’. - -If I want to implement home automation, it will be expensive. But, if I end up using Raspberry Pi to create something similar, it will require less investment. Of course, you will have to explore and improve to make it a reliable system but you can get started with the basics. - -[Home Automation][30] - -#### 22\. Local Cloud Server - -You can also build your own cloud using Raspberry Pi. You can also install Nextcloud on it to protect and store your data. - -A lot of exciting things to explore once you have your own cloud, right? - -[Local Cloud Server][31] - -#### 23\. Portable Hacking Device - -Let me make one thing clear, I am not encouraging you to do something illegal (just like the movies) by building a portable hacking device. - -So, just for educational/testing purposes, feel free to try making your own portable device for hacking using Raspberry Pi. - -[Portable Hacking Device][32] - -#### 24\. Smart Gloves - -Making a pair of smart gloves is really a cool project with Raspberry Pi. In my college days, I witnessed a senior make this thing, it was interesting. - -You can refer to the official resource for this project and get started. - -[Smart Gloves][33] - -#### 25\. Ad Blocker - -With Raspberry Pi, you can easily implement a network-wide Adblocker so that you won’t have to install adblockers separately on devices or browsers. - -You need to utilize Pi-Hole (the ad blocker) to set it up. Check out the video above and the official resource through the button below. - -[Ad Blocker][34] - -**Wrapping Up** - -Here, I listed some of the most interesting projects that I could find that might come in handy for you. - -If you know some other cool ideas, let me know in the comments down below. I might update this list of Raspberry Pi projects with your idea. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/raspberry-pi-projects/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/raspberry-pi-alternatives/ -[2]: https://itsfoss.com/best-linux-media-server/ -[3]: https://www.raspberrypi.org/documentation/usage/kodi/ -[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/diy-weather-station.jpg?ssl=1 -[5]: https://projects.raspberrypi.org/en/projects/build-your-own-weather-station -[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/parents-detector-pi.png?ssl=1 -[7]: https://projects.raspberrypi.org/en/projects/parent-detector -[8]: https://circuitdigest.com/microcontroller-projects/raspberry-pi-fm-transmitter -[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/minecraft-game-server.jpg?ssl=1 -[10]: https://www.makeuseof.com/tag/setup-minecraft-server-raspberry-pi/ -[11]: https://projects.raspberrypi.org/en/projects/temperature-log -[12]: https://itsfoss.com/lakka-retrogaming-linux/ -[13]: https://lifehacker.com/how-to-turn-your-raspberry-pi-into-a-retro-game-console-498561192 -[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/11/raspberry-pi-desktop.jpg?ssl=1 -[15]: https://www.raspberrypi.org/blog/raspberry-pi-4-a-full-desktop-replacement/ -[16]: https://www.makeuseof.com/tag/use-your-raspberry-pi-like-a-desktop-pc/ -[17]: https://projects.raspberrypi.org/en/projects/lamp-web-server-with-wordpress -[18]: https://projects.raspberrypi.org/en/projects/laser-tripwire -[19]: https://circuitdigest.com/microcontroller-projects/raspberry-pi-print-server -[20]: https://projects.raspberrypi.org/en/projects/raspberry-pi-zero-time-lapse-cam -[21]: https://projects.raspberrypi.org/en/projects/gpio-music-box -[22]: https://www.modmy.com/kodi-box-guide -[23]: https://magpi.raspberrypi.org/articles/flick-hat-swipe-gestures-raspberry-pi -[24]: https://magpi.raspberrypi.org/articles/tor-router -[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/11/control-led-voice-raspberry-pi.jpg?fit=800%2C450&ssl=1 -[26]: https://aiyprojects.withgoogle.com/voice -[27]: https://projects.raspberrypi.org/en/projects/google-voice-aiy/ -[28]: https://pimylifeup.com/raspberry-pi-wifi-extender/ -[29]: https://www.comparitech.com/blog/vpn-privacy/raspberry-pi-vpn/ -[30]: https://circuitdigest.com/microcontroller-projects/iot-raspberry-pi-home-automation -[31]: https://opensource.com/article/18/9/host-cloud-nas-raspberry-pi -[32]: https://www.hackster.io/mehedishakeel/portable-hacking-machine-kali-linux-raspberry-pi-touch-18b7c3 -[33]: https://www.raspberrypi.org/blog/raspberry-pi-glove/ -[34]: https://www.raspberrypi.org/blog/pi-hole-raspberry-pi/ diff --git a/sources/tech/20191125 Challenge- Write a bouncy window manager.md b/sources/tech/20191125 Challenge- Write a bouncy window manager.md deleted file mode 100644 index 601e231f53..0000000000 --- a/sources/tech/20191125 Challenge- Write a bouncy window manager.md +++ /dev/null @@ -1,104 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Challenge: Write a bouncy window manager) -[#]: via: (https://jvns.ca/blog/2019/11/25/challenge--make-a-bouncy-window-manager/) -[#]: author: (Julia Evans https://jvns.ca/) - -Challenge: Write a bouncy window manager -====== - -Hello! I’m writing a short series of programming challenges with [Julian][1], and this is the first one! - -### the challenge - -![][2] - -**requirements** - -The goal here is to make a very silly Linux window manager that bounces its windows around the screen, like in the gif above. - -**anti-requirements** - -The window manager doesn’t need to do anything else! It doesn’t need to support: - - * moving or resizing windows - * switching between windows - * minimizing windows - * literally any of the other things you might normally expect a window manager to do - - - -It turns out implementing this kind of toy window manager is surprisingly approachable! - -### the setup: start with tinywm - -All the instructions here only work on Linux (since this is about writing a Linux window manager). - -**starter kit: tinywm** - -Writing a window manager from scratch seems intimidating (at first I didn’t even know how to start!). But then I found **[tinywm][3]**, which is a tiny window manager written in only **50 lines of C**. This is a GREAT starting point and there’s an annotated version of the source code which explains a lot of the details. There’s a Python version of tinywm too, but I wasn’t able to get it to work. - -I did this challenge by modifying [tinywm][3] and it worked really well. - -**tools** - - * **Xephyr** lets you embed an X session in a window in your regular desktop, so that you can develop your toy window manager without breaking your usual desktop. I ran it like this: `Xephyr -ac -screen 1280x1024 -br -reset -terminate 2> /dev/null :1 &` - * You can start an xterm in the Xephyr desktop with `xterm -display :1` - * I compiled my window manager with `gcc bouncewm.c -g -o bouncewm -lX11` and ran it with `env DISPLAY=:1 ./bouncewm` - * **xtrace** lets you trace all requests to the X windows system that your window manager is making. I found it really helpful when debugging. (run it like `xtrace ./bouncewm`) - - - -**documentation** - -Some useful references: - - * the [dwm source code][4] (dwm is a 2000-line-of-C window manager) - * the [Xlib programming manual][5] - - - -If you’re not comfortable writing C, there are also libraries that let you work with X in other languages. I personally found C easier to use because a lot of the window manager documentation and examples I found were for the Xlib C library. - -### my experience: 5 hours, 50 lines of code - -To give you a very rough idea of the difficulty of this exercise: I did this in 4 or 5 hours this morning and last night, producing the window manager you see in the gif at the top of the blog post (which is 50 lines of code). I’d never looked at the source code for a window manager before yesterday. - -As usual when working with a new library I spent most of that time being confused about various basic things about how X works. (and as a result I learned several new things about X!) - -For me this challenge was a fun way to: - - * learn some basics about the X window system protocol (I’ve been using window managers for 15 years, today I got to write one!) - * research an unfamiliar library (“ooh, what does this function do?”) - * use a C library, since I don’t usually write C - - - -### send me your solution if you do this! - -I’ll post the solution I came up in a week. If you think this window manager challenge sounds fun and end up doing it, I’d love it if you sent me your solution (to [[email protected]][6])! - -I’d be delighted to post any solutions you send me in the solutions blog post. - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019/11/25/challenge--make-a-bouncy-window-manager/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: http://www.cipht.net/2017/10/03/are-jump-tables-always-fastest.html -[2]: https://jvns.ca/images/bouncewm.gif -[3]: http://incise.org/tinywm.html -[4]: https://git.suckless.org/dwm/file/dwm.c.html -[5]: https://tronche.com/gui/x/xlib/ -[6]: https://jvns.ca/cdn-cgi/l/email-protection diff --git a/sources/tech/20191125 My top 5 Ansible modules.md b/sources/tech/20191125 My top 5 Ansible modules.md deleted file mode 100644 index 9a76342854..0000000000 --- a/sources/tech/20191125 My top 5 Ansible modules.md +++ /dev/null @@ -1,74 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (My top 5 Ansible modules) -[#]: via: (https://opensource.com/article/19/11/ansible-modules) -[#]: author: (Mark Phillips https://opensource.com/users/markp) - -My top 5 Ansible modules -====== -Learn how to achieve almost anything with these Ansible modules. -![][1] - -When I was growing up, my grandfather had a shed in his garden. He would spend hours in there, making and fixing things. This was way before we had the internet, so I spent a lot of time studying him creating things in that shed. Although the shed was full of many tools, from drills to lathes to electrical gubbins and lots of things I doubt I could identify even today, he made use of only a tiny subset of what he had at hand. Yet there never seemed to be limits to what he could achieve. - -I tell you that story because I feel like my career has been spent in a metaphorical shed. Computers are so many tools, all in a small (virtual?) space. And there are tool sheds within tool sheds—my favourite being Ansible. The recent 2.9 release ships with 3,681 modules! **3,681!** When I first started using Ansible in the summer of 2013, version 1.2.1 had just 113 modules, yet, as [I wrote at the time][2], I could still achieve anything I imagined. - -Modules are the backbone of Ansible, the gears to make light of heavy lifting. They're designed to do one job well, thus realising [the Unix philosophy][3]. This is how we've come to bundle so many of them; Ansible as the conductor of the orchestra now has a lot of instruments at its command. - -Reviewing a Git repository of my Ansible plays and roles over the years reveals that I have used just 35 modules. This small subset was used to build large infrastructures. I wonder what could be achieved with an even smaller subset, though? As I reviewed those 35, I pondered if I could achieve the same results with only five modules at my disposal. So here are my five favourite modules, in a rather tenuous order of precedence. - -### 5. [authorized_key][4] - -Secure shell (SSH) is at the heart of Ansible, at least for almost everything besides Windows. Key (no pun intended) to using SSH efficiently with Ansible is… [keys][5]! Slight aside—there are a lot of very cool things you can do for security with SSH keys. It's worth perusing the **authorized_keys** section of the [sshd manual page][6]. Managing SSH keys can become laborious if you're getting into the realms of granular user access, and although we could do it with either of my next two favourites, I prefer to use the module because it [enables easy management through variables][7]. - -### 4. [file][8] - -Besides the obvious function of placing a file somewhere, the **file** module also sets ownership and permissions. I'd say that's a lot of _bang for your buck_ with one module. I'd proffer a substantial portion of security relates to setting permissions too, so the **file** module plays nicely with **authorized_keys**. - -### 3. [template][9] - -There are so many ways to manipulate the contents of files, and I see lots of folk use **[lineinfile][10]**. I've used it myself for small tasks. However, the **template** module is so much clearer because you maintain the entire file for context. My preference is to write Ansible content in such a way that anyone can understand it _easily_—which to me means not making it hard to understand what is happening. Use of **template** means being able to see the entire file you're putting into place, complete with the variables you are using to change pieces. - -### 2. [uri][11] - -Many modules in the current distribution leverage Ansible as an orchestrator. They talk to another service, rather than doing something specific like putting a file into place. Usually, that talking is over HTTP too. In the days before many of these modules existed, you _could_ program an API directly using the **uri** module. It's a powerful access tool, enabling you to do a lot. I wouldn't be without it in my fictitious Ansible shed. - -### 1. [shell][12] - -The joker card in our pack. The Swiss Army Knife. If you're absolutely stuck for how to control something else, use **shell**. Some will argue we're now talking about making Ansible a Bash script—but, I would say it's still better because with the use of the **name** parameter in your plays and roles, you document every step. To me, that's as big a bonus as anything. Back in the days when I was still consulting, I once helped a database administrator (DBA) migrate to Ansible. The DBA wasn't one for change and pushed back at changing working methods. So, to ease into the Ansible way, we called some existing DB management scripts from Ansible using the **shell** module. With an informative **name** statement to accompany the task. - -You can achieve a lot with these five modules. Yes, modules designed to do a specific task will make your life even easier. But with a smidgen of engineering simplicity, you can achieve a lot with very little. Ansible developer Brian Coca is a master at it, and [his tips and tricks talk][13] is always worth a watch. - -* * * - -What do you think about my top five? What five modules would you pick and why, if you were so limited? Let me know in the comments below! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/ansible-modules - -作者:[Mark Phillips][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/markp -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mandelbrot_set.png?itok=bmPc0np5 -[2]: http://probably.co.uk/post/puppet-vs-chef-vs-ansible/ -[3]: https://en.wikipedia.org/wiki/Unix_philosophy#Do_One_Thing_and_Do_It_Well -[4]: https://docs.ansible.com/ansible/latest/modules/authorized_key_module.html -[5]: https://linux.die.net/man/1/ssh-keygen -[6]: https://linux.die.net/man/8/sshd -[7]: https://github.com/phips/ansible-demos/blob/3bf59df1eb2390b31b5c42333197e2fbb7fec93f/roles/ansible-users/tasks/main.yml#L35 -[8]: https://docs.ansible.com/ansible/latest/modules/file_module.html -[9]: https://docs.ansible.com/ansible/latest/modules/template_module.html -[10]: https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html -[11]: https://docs.ansible.com/ansible/latest/modules/uri_module.html -[12]: https://docs.ansible.com/ansible/latest/modules/shell_module.html -[13]: https://www.ansible.com/ansible-tips-and-tricks diff --git a/sources/tech/20191126 App Highlight- Penguin Subtitle Player for Adding Subtitles to Online Videos.md b/sources/tech/20191126 App Highlight- Penguin Subtitle Player for Adding Subtitles to Online Videos.md deleted file mode 100644 index 9907322467..0000000000 --- a/sources/tech/20191126 App Highlight- Penguin Subtitle Player for Adding Subtitles to Online Videos.md +++ /dev/null @@ -1,122 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (App Highlight: Penguin Subtitle Player for Adding Subtitles to Online Videos) -[#]: via: (https://itsfoss.com/penguin-subtitle-player/) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -App Highlight: Penguin Subtitle Player for Adding Subtitles to Online Videos -====== - -I must confess. I am addicted to subtitles. It helps me understand the dialogues completely, specially if some dialogues are in a different accent or in a different language. - -This has led to a habit of watching online videos with subtitles. - -While streaming services like Netflix and Amazon Prime provide subtitles for their content, the same is not true for all the websites. - -I often discover interesting content that are on YouTube, Dailymotion or other websites. And that becomes a problem because most of the time, these videos don’t have subtitles. - -The good news is that you have the possibility to watch any online video content with subtitles and I’ll share that neat little trick with you in this article. - -### Watch any online video with subtitles using Penguin subtitle player - -![][1] - -What the heck is a Subtitle player? - -The [open source video players][2] you use allow you to add subtitles. Players like [VLC allow you to download subtitles automatically][3]. - -But they are video player and their main task is to play video. - -A subtitle player on the other hand has only one task and that is to play subtitles. Confused? Let me explain. - -A subtitle player basically provides an interface where you can add subtitle file and play the subtitles with a semi transparent background. The trick here is that this player will be visible all the time on top of any other application. - -So if you are running the subtitle player even while using a website, it will still be visible. That actually is the trick to watch any online video with subtitles. - -![An external subtitle playing on top of YouTube video][4] - -All you have to do is to find appropriate subtitles from an online website like OpenSubtitles and add it to the subtitle player. Now open the website where you want to watch the video. Play it full screen (if that option is available) and it will feel like that the subtitles are part of the video itself. - -![][5] - -#### Install Penguin subtitle player - -[Penguin][6] is a free and open source subtitle player. It is available for Linux, macOS and Windows. - -If you are using Ubuntu-based distribution, you can [use this PPA][7] to easily install Penguin subtitle player. - -``` -sudo add-apt-repository ppa:nilarimogard/webupd8 -sudo apt update -sudo apt install penguin-subtitle-player -``` - -For other Linux distributions, Windows and macOS, you can download the installer files from SourceForge: - -[Download Penguin Subtitle Player][8] - -#### Using Penguin subtitle player - -Once you have installed the application, look for it in the menu and start it. You’ll see an interface like this: - -![Penguin Subtitle Player Interface][9] - -If you have already downloaded the .srt subtitle file, you can add it to the player by clicking the folder icon. - -![Add Subtitle In Penguin Subtitle Player][10] - -You can play/pause the subtitles, skip it to a new time. This helps in adjusting the subtitles with the video. - -![Adjust Subtitle In Penguin Subtitle Player][11] - -You can also tweak the appearance of the subtitles and subtitle player. - -![Configure Penguin Subtitle Player][12] - -You also have the option to change the fonts, font size and color of the subtitle text. You may also increase or decrease the transparency and color of the background. - -![Config Options In Penguin Subtitle Player][13] - -You can also resize the subtitle player interface and move it around anywhere on the screen. - -#### Keep in mind - -There are a few things to keep in mind while using Penguin subtitle player. - -Not all video files and subtitle files are made for each other. Subtitle synchronization is a common problem so you’ll have to make sure that the subtitle you downloaded is best suited for the video you want to play. - -Most video players, even the one embedded on the websites, allow to pause and play the video with the space key. Unfortunately, there is no keyboard shortcut to pause the Penguin subtitle player. In other words, you cannot pause the video and the subtitle player in one keystroke. - -With this much configuration, you should be set for watching online videos with subtitles. - -I hope you enjoy this nifty little open source application. Do let me know whether you find it useful or not. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/penguin-subtitle-player/ - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/abhishek/ -[b]: https://github.com/lujun9972 -[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/Add_subtitle_online_videos.png?ssl=1 -[2]: https://itsfoss.com/video-players-linux/ -[3]: https://itsfoss.com/download-subtitles-automatically-vlc-media-player-ubuntu/ -[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/penguin_subtitle_player.jpg?ssl=1 -[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2015/05/Penguin_Subtitle_Player.jpg?ssl=1 -[6]: https://github.com/carsonip/Penguin-Subtitle-Player -[7]: https://itsfoss.com/ppa-guide/ -[8]: https://sourceforge.net/projects/penguinsubtitleplayer/ -[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/penguin-subtitle-player-interface.jpg?ssl=1 -[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/add_subtitle_in_penguin_subtitle_player.jpg?ssl=1 -[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/adjust_subtitle_in_penguin_subtitle_player.jpg?ssl=1 -[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/configure_penguin_subtitle_player.jpg?ssl=1 -[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/config_options_in_penguin_subtitle_player.jpg?ssl=1 diff --git a/sources/tech/20191126 Make Lua development easy with Luarocks.md b/sources/tech/20191126 Make Lua development easy with Luarocks.md deleted file mode 100644 index 23a636b826..0000000000 --- a/sources/tech/20191126 Make Lua development easy with Luarocks.md +++ /dev/null @@ -1,233 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Make Lua development easy with Luarocks) -[#]: via: (https://opensource.com/article/19/11/getting-started-luarocks) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Make Lua development easy with Luarocks -====== -Luarocks makes it easy to get started with Lua, a lightweight, -efficient, and embeddable scripting language. -![Coding on a computer][1] - -Bash too basic? Too much whitespace in Python? Go too corporate? - -You should try Lua, a lightweight, efficient, and embeddable scripting language supporting procedural programming, object-oriented programming, functional programming, data-driven programming, and data description. And best of all, it uses explicit syntax for scoping! - -Lua is also small. Lua's source code is just 24,000 lines of C, the Lua interpreter (on 64-bit Linux) built with all standard Lua libraries is 247K, and the Lua library is 421K. - -You might think that such a small language must be too simplistic to do any real work, but in fact Lua has a vast collection of third-party libraries (including GUI toolkits), it's used extensively in video game and film production for 3D shaders, and is a common scripting language for video game engines. To make it easy to get started with Lua, there's even a package manager called [Luarocks][2]. - -### What is Luarocks? - -Python has PIP, Ruby has Gems, Java has Maven, Node has npm, and Lua has Luarocks. Luarocks is a website and a command. The website is home to open source libraries available for programmers to add to their Lua projects. The command searches the site and installs libraries (defined as "rocks") upon demand. - -### What is a programming library? - -If you're new to programming, you might think of a "library" as just a place where books are stored. Programming libraries ("lib" or "libs" for short) are a little like a book library in the sense that both of these things contain information that someone else has already worked to discover, and which you can borrow so you have to do less work. - -For example, if you were writing code that measures how much stress a special polymer can withstand before breaking, you might think you'd have to be pretty clever with math. But if there was already an open source library specifically designed for exactly that sort of calculation, then you could include that library in your code and let it solve that problem for you (provided you give the library's internal functions the numbers it needs in order to perform an accurate calculation). - -In open source programming, you can install libraries freely and use other people's work at will. Luarocks is the mechanism for Lua that makes it quick and easy to find and use a Lua library. - -### Installing Luarocks - -The **luarocks** command isn't actually _required_ to use packages from the Luarocks website, but it does keep you from having to leave your text editor and venture onto the worldwide web [of potential distractions]. To install Luarocks, you first need to install Lua. - -Lua is available from [lua.org][3] or, on Linux, from your distribution's software repository. For example, on Fedora, CentOS, or RHEL: - - -``` -`$ sudo dnf install lua` -``` - -On Debian and Ubuntu: - - -``` -`$ sudo apt install lua` -``` - -On Windows and Mac, you can download and install Lua from the website. - -Once Lua is installed, install Luarocks. If you're on Linux, the **luarocks** command is available in your distribution's repository. - -On Mac, you can install it with [Brew][4] or compile from source: - - -``` -$ wget -$ tar zxpf luarocks-X.Y.Z.tar.gz -$ cd luarocks-X.Y.Z -$ ./configure; sudo make bootstrap -``` - -On Windows, follow the [install instructions][5] on the Luarocks wiki. - -### Search for a library with Luarocks - -The typical usage of the **luarocks** command, from the perspective of a user rather than a developer, involves searching for a library required by some Lua application you want to run and installing that library. - -To search for the Lua package **luasec** (a library providing HTTPS support for **luarocks**), try this command: - - -``` -$ luarocks search luasec -Warning: falling back to curl - -install luasec to get native HTTPS support - -Search results: -=============== - -Rockspecs and source rocks: -\--------------------------- - -luasec -   0.9-1 (rockspec) - -   0.9-1 (src) - -   0.8.2-1 (rockspec) - -[...] -``` - -### Install a library with Luarocks - -To install the **luasec** library: - - -``` -$ luarocks install --local luasec -[...] -gcc -shared -o ssl.so -L/usr/lib64 -src/config.o src/ec.o src/x509.o [...] --L/usr/lib -Wl,-rpath,/usr/lib: -lssl -lcrypto - -luasec 0.9-1 is now installed in -/home/seth/.luarocks (license: MIT) -``` - -You can install Lua libraries locally or on a systemwide basis. A _local_ install indicates that the Lua library you install is available to you, but no other user of the computer. If you share your computer with someone else, and you each have your own [login account][6], then you probably want to install a library systemwide. However, if you're the only user of your computer, it's a good habit to install libraries locally, if only because that's the appropriate method when you develop with Lua. - -If you're _developing_ a Lua application, then you probably want to install a library to a project directory instead. In Luarocks terminology, this is a _tree_. Your default tree when installing libraries locally is **$HOME/.luarocks**, but you can redefine it arbitrarily. - - -``` -$ mkdir local -$ luarocks --tree=./local install cmark -Installing -gcc -O2 -fPIC -I/usr/include -c cmark_wrap.c [..] -gcc -O2 -fPIC -I/usr/include -c ext/blocks.c -o ext/blocks.o [..] -[...] -No existing manifest. Attempting to rebuild... -cmark 0.29.0-1 is now installed in -/home/seth/downloads/osdc/example-lua/./local -(license: BSD2) -``` - -The library (in this example, the **cmark** library) is installed to the path specified by the **\--tree** option. You can verify it by listing the contents of the destination: - - -``` -$ find ./local/ -type d -name "cmark" -./local/share/lua/5.1/cmark -./local/lib/luarocks/rocks/cmark -``` - -You can use the library in your Lua code by defining the **package.path** variable to point to your local rocks directory: - - -``` -package.path = package.path .. ';local/share/lua/5.3/?.lua' - -require("cmark") -``` - -### Getting information about an installed rock - -You can see information about an installed rock with the **show** option: - - -``` -$ luarocks show luasec -LuaSec 0.9-1 - A binding for OpenSSL library -to provide TLS/SSL communication over LuaSocket. - -This version delegates to LuaSocket the TCP -connection establishment between -the client and server. Then LuaSec uses this -connection to start a secure TLS/SSL session. - -License:        MIT -Homepage:       -Installed in:   /home/seth/.luarocks -[...] -``` - -This provides you with a summary of what a library provides from a user's perspective, displays the project homepage in case you want to investigate further, and shows you where the library is installed. In this example, it's installed in my home directory in a **.luarocks** folder. This assures me that it's installed locally, which means that if I migrate my home directory to a different computer, I'll retain my Luarocks configuration and installs. - -### Get a list of installed rocks - -You can list all installed rocks on your system with the **list** option: - - -``` -$ luarocks list - -Installed rocks: -\---------------- - -luasec -   0.9-1 (installed) - /home/seth/.luarocks/lib/luarocks/rocks - -luasocket -   3.0rc1-2 (installed) - /home/seth/.luarocks/lib/luarocks/rocks - -luce -   scm-0 (installed) - /home/seth/.luarocks/lib/luarocks/rocks - -tekui -   1.07-1 (installed) - /home/seth/.luarocks/lib/luarocks/rocks -``` - -This displays the rocks you have installed in the default install location. Developers can override this by using the **\--tree** option to redefine the active tree. - -### Remove a rock - -If you want to remove a rock, you can do that with Luarocks using the **remove** option: - - -``` -`$ luarocks remove --local cmark` -``` - -This removes a library (in this example, the **cmark** library) from your local tree. Developers can override this by using the **\--tree** option to redefine the active tree. - -If you want to remove _all_ the rocks you have installed, use the **purge** option instead. - -### Luarocks rocks - -Whether you're a user exploring exciting new Lua applications and need to install some dependencies or you're a developer using Lua to create exciting new applications, Luarocks makes your job easy. Lua is a beautiful and simple language, and Luarocks is perfectly suited to be its package manager. Give both a try today! - -Discussing Tarantool this year at the Percona Live Data Performance Conference. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/getting-started-luarocks - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/seth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) -[2]: http://luarocks.org -[3]: http://lua.org -[4]: http://brew.sh -[5]: https://github.com/luarocks/luarocks/wiki/Installation-instructions-for-Windows -[6]: https://opensource.com/article/19/11/add-user-gui-linux diff --git a/sources/tech/20191127 How to Manage Remote Windows Host using Ansible.md b/sources/tech/20191127 How to Manage Remote Windows Host using Ansible.md deleted file mode 100644 index fa82225b79..0000000000 --- a/sources/tech/20191127 How to Manage Remote Windows Host using Ansible.md +++ /dev/null @@ -1,233 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Manage Remote Windows Host using Ansible) -[#]: via: (https://www.linuxtechi.com/manage-windows-host-using-ansible/) -[#]: author: (James Kiarie https://www.linuxtechi.com/author/james/) - -How to Manage Remote Windows Host using Ansible -====== - -**Ansible** is increasingly becoming the go-to platform for application deployment, and software provisioning among developers owing to its ease of use and flexibility. Furthermore, it is easy to set up and no agent is required to be installed on remote nodes, instead, Ansible uses password less SSH authentication to manage remote Unix/Linux hosts. In this topic, however, we are going to see how you can manage Windows Host using Ansible. - -[![Manage-Windows-Hosts-using-Ansible][1]][2] - -**Lab setup** - -We shall use the setup below to accomplish our objective - - * Ansible Control node   –    CentOS 8          –     IP: 192.168.43.13 - * Windows 10 node         –    Windows 10     –     IP: 192.168.43.147 - - - -### Part 1: Installing Ansible on the Control node (CentOS 8) - -Before anything else, we need to get Ansible installed on the Control node which is the CentOS 8 system. - -#### Step 1: Verify that Python3 is installed on Ansible control node - -Firstly, we need to confirm if Python3 is installed. CentOS 8 ships with Python3 but if it’s missing for any reason, install using the command: - -``` -# sudo dnf install python3 -``` - -Next, make Python3 the default Python version by running: - -``` -# sudo alternatives --set python /usr/bin/python3 -``` - -To verify if python3 is installed, run the command: - -``` -# python --version -``` - -**![check-python-version][1] ** - -**Read Also :** **[How to Install Ansible (Automation Tool) on CentOS 8/RHEL 8][3]** - -#### Step 2: Install a virtual environment for running Ansible - -For this exercise, an isolated environment for running and testing Ansible is preferred. This will keep at bay issues such as dependency problems and package conflicts. The isolated environment we are going to create is called a virtual environment. - -Firstly, let’s begin with the installation of the virtual environment on CentOS 8. - -``` -# sudo dnf install python3-virtualenv -``` - -![install-python3-virtualenv][1] - -After the installation of the virtual environment, create a virtual workspace by running: - -``` -# virtualenv env -``` - -![virtualenv-env-ansible][1] - -``` -# source env/bin/activate -``` - -![source-env-bin-activate-ansible][1] - -Great! Observer that the prompt has now changed to (env). - -#### Step 3: Install Ansible - -After the creation of the virtual environment, proceed and install Ansible automation tool using pip as shown: - -``` -# pip install ansible -``` - -![pip-install-Ansible][1] - -You can later confirm the installation of Ansible using the command: - -``` -# ansible --version -``` - -![check-ansible-version][1] - -To test Ansible and see if it’s working on our Ansible Control server run: - -``` -# ansible localhost -m ping -``` - -![Test-ansible-for-connectivity][1] - -Great! Next, we need to define the Windows host or system on a host file on the Ansible control node. Therefore, open the default hosts file - -``` -# vim /etc/ansible/hosts -``` - -Define the Windows hosts as shown below. - -![Ansible-hosts-file][1] - -**Note:** The username and password point to the user on the Windows host system. - -Next, save and exit the configuration file. - -#### Step 4: Install Pywinrm - -Unlike in Unix systems where Ansible uses SSH to communicate with remote hosts, with Windows it’s a different story altogether. To communicate with Windows hosts, you need to install Winrm. - -To install winrm, once again, use pip tool as shown: - -``` -# pip install pywinrm -``` - -![install-pywinrm][1] - -### Part 2: Configuring Windows Host - -In this section, we are going to configure our Windows 10 remote host system to connect with the Ansible Control node. We are going to install the **WinRM listener-** short for **Windows Remote** – which will allow the connection between the Windows host system and the Ansible server. - -But before we do so, your Windows host system needs to fulfill a few requirements for the installation to succeed: - - * Your Windows host system should be **Windows 7 or later**. For Servers, ensure that you are using **Windows Server 2008** and later versions. - * Ensure your system is running **.NET Framework 4.0** and later. - * Windows **PowerShell** should be Version 3.0 & later - - - -With all the requirements met, now follow the steps stipulated below: - -#### Step 1: Download the WinRM script on Windows 10 host - -WinRM can be installed using a script that you can download from this [link][4]. Copy the entire script and paste it onto the notepad editor. Thereafter, ensure you save the WinRM script at the most convenient location. In our case, we have saved the file on the Desktop under the name  ConfigureRemotingForAnsible.ps1 - -#### Step 2: Run the WinRM script on Windows 10 host - -Next, run PowerShell as the Administrator - -![Run-PowerShell-as-Administrator][1] - -Navigate to the script location and run it. In this case, we have navigated to the Desktop location where we saved the script. Next, proceed and execute the WinRM script on the WIndows host: - -``` -.\ConfigureRemotingForAnsible.ps1 -``` - -This takes about a minute and you should get the output shown below. The output shows that WinRM has successfully been installed. - -![set-up-WinRM-on-Windows10][1] - -### Part 3: Connecting to Windows Host from Ansible Control Node - -To test connectivity to the Windows 10 host, run the command: - -``` -# ansible winhost -m win_ping -``` - -![Ansible-ping-windows-host-machine][1] - -The output shows that we have indeed established a connection to the remote Windows 10 host from the Ansible Control node. This implies that we can now manage the remote Windows host using Ansible Playbooks. Let’s create a sample playbook for the Windows host system. - -### Part 4: Creating and running a playbook for Windows 10 host - -In this final section, we shall create a playbook and create a task that will install Chocolatey on the remote host. Chocolatey is a package manager for Windows system. The play is defined as shown: - -``` -# vim chocolatey.yml ---- -- host: winhost - gather_facts: no - tasks: - - name: Install Chocolatey on Windows10 - win_chocolatey: name=procexp status=present -``` - -![Ansible-Playbook-install-chocolatey][1] - -Save and close the yml file. Next, execute the playbook as shown - -``` -# ansible-playbook chocolatey.yml -``` - -![Ansible-playBook-succeeded][1] - -The output is a pointer that all went well. And this concludes this topic on how you can manage Windows host using Ansible. - - * [Facebook][5] - * [Twitter][6] - * [LinkedIn][7] - * [Reddit][8] - - - --------------------------------------------------------------------------------- - -via: https://www.linuxtechi.com/manage-windows-host-using-ansible/ - -作者:[James Kiarie][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.linuxtechi.com/author/james/ -[b]: https://github.com/lujun9972 -[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[2]: http://www.linuxtechi.com/wp-content/uploads/2019/11/Manage-Windows-Hosts-using-Ansible.jpg -[3]: http://www.linuxtechi.com/install-ansible-centos-8-rhel-8/ -[4]: https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -[5]: http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.linuxtechi.com%2Fmanage-windows-host-using-ansible%2F&t=How%20to%20Manage%20Remote%20Windows%20Host%20using%20Ansible -[6]: http://twitter.com/share?text=How%20to%20Manage%20Remote%20Windows%20Host%20using%20Ansible&url=https%3A%2F%2Fwww.linuxtechi.com%2Fmanage-windows-host-using-ansible%2F&via=Linuxtechi -[7]: http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.linuxtechi.com%2Fmanage-windows-host-using-ansible%2F&title=How%20to%20Manage%20Remote%20Windows%20Host%20using%20Ansible -[8]: http://www.reddit.com/submit?url=https%3A%2F%2Fwww.linuxtechi.com%2Fmanage-windows-host-using-ansible%2F&title=How%20to%20Manage%20Remote%20Windows%20Host%20using%20Ansible diff --git a/sources/tech/20191129 Holiday gift guide- Books for the learner, explorer, or tinkerer on your list.md b/sources/tech/20191129 Holiday gift guide- Books for the learner, explorer, or tinkerer on your list.md deleted file mode 100644 index dd3c603bc4..0000000000 --- a/sources/tech/20191129 Holiday gift guide- Books for the learner, explorer, or tinkerer on your list.md +++ /dev/null @@ -1,130 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Holiday gift guide: Books for the learner, explorer, or tinkerer on your list) -[#]: via: (https://opensource.com/article/19/11/books-wishlist-2019) -[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) - -Holiday gift guide: Books for the learner, explorer, or tinkerer on your list -====== -Get our list of books to give as gifts or add to your own wishlist this -holiday season. -![4 books that spell out open][1] - -It is my pleasure to introduce Opensource.com's selection of books that would make excellent holiday gift ideas. We hope you find them interesting items to give as gifts this holiday season or to add to your own holiday wishlist. Each book exhibits qualities that make them excellent gifts for open source enthusiasts, as they all encourage learning, exploring, and tinkering. - -### The Big Book of Maker Camp Projects - -![The Big Book of Maker Camp Projects][2] - -**by Sandy Roberts** - -[_The Big Book of Maker Camp Projects_][3] contains dozens of projects that are perfect for maker camps or individuals looking to tinker. Projects cover a wide range of topics ranging from making faux campfires using LEDs and Circuit Playground Express (CPX) boards to tie-dye t-shirts and other wearable crafts. There are plenty of projects to keep maker camp participants engaged and entertained. - -### How Open Source Ate Software - -* * * - -* * * - -* * * - -**![How Open Source Ate Software ][4]** - -**by Gordon Haff** - -Learn more about the history of open source with [_How Open Source Ate Software_][5]. This brief, 180-page book explores how open source became the phenomenon that it is today. This book is an excellent read for anyone interested in where open source came from and how it changed the way software is developed. - -### The Rust Programming Language - -* * * - -* * * - -* * * - -**![The Rust Programming Language ][6]** - -**by Steve Klabnik and Carol Nichols** - -Learn one of the hot, new programming languages with [_The Rust Programming Language_][7]. Yes, this is a print edition of the exact same book that is installed with Rust and can be read in your browser by running **rustup doc --book**, but a physical book offers some benefits by giving the material inside a little more structure than the free HTML version. It is easier to digest material covered over a two-page spread instead of having to scroll through a long web page. Just be sure to get the edition with "Covers Rust 2018" on the cover, so you get a print copy that covers the latest Rust edition. - -### Secret Coders: The Complete Box Set - -* * * - -* * * - -* * * - -**![Secret Coders][8]** - -**by Gene Luen Yang & Mike Holmes** - -[_Secret Coders: The Complete Box Set_][9] collects all six volumes in the Secret Coder series. This series of graphic novels introduces readers to the world of coding by following the exploits of the three protagonists, Hopper, Eni, and Josh, as they explore coding and fight against the schemes of Dr. One-Zero. Each book in the series builds upon the volumes that precede it, and by the time readers have finished the series, they should have an excellent understanding of basic programming concepts. - -### Thing Explainer - -* * * - -* * * - -* * * - -**![Thing Explainer][10]** - -**by Randall Munroe** - -[_Thing Explainer_][11], by the creator of the [xkcd webcomic][12], is a book in the same vein as David Macaulay's [_The Way Things Work_][13] and similar titles. This book, as one would expect from the title, explains things. Using only the 1,000 most common words in the English language and illustrations, Munroe explains airplanes, tectonic plates, and more. - -### Open role-playing games and dice tower - -![Pathfinder][14] | ![Starfinder][15] ----|--- -![Fate Core][16] | ![Fate Accelerated][17] - -If you would like to spend time with your friends and family having exciting adventures, consider one of several pen-and-paper role-playing games with rules books that are released under an open license. - -For example, Paizo's [_Pathfinder_][18] and [_Starfinder_][19] are released under the [Open Game License][20], and [_Fate Core_][21] and [_Fate Accelerated_][22] from Evil Hat are released under the Open Game License and a Creative Commons Attribution license. - -But these are just a few examples, there are plenty of role-playing games that are [released under an open license][23], so there are games out there for a variety of tastes. You can also pair the rule books with a homemade dice tower using these Creative Commons Attribution-NonCommercial licensed [dice tower plans][24]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/11/books-wishlist-2019 - -作者:[Joshua Allen Holm][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/holmja -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/EDU_OSDC_BYU_520x292_FINAL.png?itok=NVY7vR8o (4 books that spell out open) -[2]: https://opensource.com/sites/default/files/uploads/the_big_book_of_maker_camp_projects.jpg (The Big Book of Maker Camp Projects) -[3]: http://www.kaleidoscopeenrichment.com/home/the-big-book-of-maker-camp-projects/ -[4]: https://opensource.com/sites/default/files/uploads/how_open_source_ate_software.jpg (How Open Source Ate Software ) -[5]: https://www.apress.com/us/book/9781484238936 -[6]: https://opensource.com/sites/default/files/uploads/the_rust_programming_language.jpg (The Rust Programming Language ) -[7]: https://nostarch.com/Rust2018 -[8]: https://opensource.com/sites/default/files/uploads/secret_coders_the_complete_boxed_set.jpeg (Secret Coders) -[9]: https://us.macmillan.com/secretcodersthecompleteboxedset/geneluenyang/9781250294685/ -[10]: https://opensource.com/sites/default/files/uploads/thing_explainer.png (Thing Explainer) -[11]: https://xkcd.com/thing-explainer/ -[12]: https://xkcd.com/ -[13]: https://en.wikipedia.org/wiki/The_Way_Things_Work -[14]: https://opensource.com/sites/default/files/uploads/pathfinder_100px.jpg (Pathfinder) -[15]: https://opensource.com/sites/default/files/uploads/starfinder_100px.jpg (Starfinder) -[16]: https://opensource.com/sites/default/files/uploads/fate_core_100px.jpg (Fate Core) -[17]: https://opensource.com/sites/default/files/uploads/fate_accelerated_100px.jpg (Fate Accelerated) -[18]: https://paizo.com/pathfinder -[19]: https://paizo.com/starfinder -[20]: https://en.wikipedia.org/wiki/Open_Game_License -[21]: https://www.evilhat.com/home/fate-core/ -[22]: https://www.evilhat.com/home/fae/ -[23]: https://opensource.com/article/19/5/free-rpg-day -[24]: https://msraynsford.blogspot.com/2016/05/working-dice-tower-with-plans.html diff --git a/sources/tech/20191201 Modernize your Linux desktop with Enlightenment.md b/sources/tech/20191201 Modernize your Linux desktop with Enlightenment.md deleted file mode 100644 index b975ca18e7..0000000000 --- a/sources/tech/20191201 Modernize your Linux desktop with Enlightenment.md +++ /dev/null @@ -1,72 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Modernize your Linux desktop with Enlightenment) -[#]: via: (https://opensource.com/article/19/12/linux-enlightenment-desktop) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Modernize your Linux desktop with Enlightenment -====== -This article is part of a special series of 24 days of Linux desktops. -Enlightenment offers a smooth, appealing, and modern Linux desktop -experience, even on older hardware. -![Light at the end of the tunnel][1] - -One of Linux's many advantages is its ability to install and run on old computers. What Linux can't _technically_ do is make an old computer's hardware magically perform better. After all, the hardware is the same hardware as ever, and sometimes old hardware feels notably slow when processing modern software that tries to take advantage of new hardware features. This means that an old computer running Linux must run a rather basic desktop, because too many effects or animations might use up precious memory and graphics processing, resulting in sluggish performance. - -The [Enlightenment][2] desktop wasn't designed to solve this exact problem, but in practice, that's exactly what it does. With its finely crafted foundation and custom libraries, Enlightenment provides an attractive and dynamic environment that runs smoothly on old computers and low-powered systems like the [Raspberry Pi][3]. You never have to feel like you're compromising your user experience (UX) just because you're running modest hardware. True to its name, it delivers on the promise of eco-friendly computing and is the first line of defense (or second, if Linux itself is the first) against planned obsolescence. - -Of course, you don't have to run Enlightenment on an old computer. It works just as well on new computers. - -Install Enlightenment from your distribution's software repository. Past versions of Enlightenment are still popular today (and some are still maintained as separate projects), and all of them are good, but the latest versions are the ones above 20. After installing it, log out of your current desktop session so you can log into your new Enlightenment desktop. By default, your session manager (KDM, GDM, LightDM, or XDM, depending on your setup) will continue to log you into your default desktop, so you must override the default when logging in. - -Here's how to override the default and switch to Enlightenment on GNOME Desktop Manager: - -![Selecting the Enlightenment desktop in GDM][4] - -And on KDM: - -![Selecting the Enlightenment desktop in KDM][5] - -The first time you log into Enlightenment, it asks for some basic preferences, such as your desired language setting, size of window title bars, and so on. It's OK to accept the defaults when you're unsure, and it's safe to ignore the warning about ConnMan not being available. Most distributions use [NetworkManager][6] instead of Enlightenment's own network manager, ConnMan. - -### Enlightenment desktop - -By default, the Enlightenment desktop provides desktop icons for common places, such as your home directory, the root directory, and a temporary directory. There's also a "shelf," a docking area at the bottom of the screen where major applications can go when minimized, where launchers can be created for quick access to common applications, and where applets (such as volume control, a clock, keyboard layout, and so on) run. - -Anything configurable in Enlightenment is configurable with a right-click. - -Here's what Enlightenment looks like on Fedora: - -![Enlightenment running on Fedora][7] - -### Features - -To access an application menu, click anywhere on the desktop. Enlightenment is a desktop environment, but it's disguised as a window manager. Its primary task is to help you arrange and manage windows, but it also ships with a file manager (called Fileman) and has options to use a network manager called ConnMan and its own terminal called Terminology. It also has a global settings panel to help manage themes, keyboard shortcuts, screen resolution, and so on. - -Because Enlightenment ships with just a few applications, your default application set can stay the same as what you were using before trying Enlightenment. All of your K apps or GNOME applications and third-party applications like Firefox or Blender or LibreOffice will function as usual. - -Enlightenment is a smooth, appealing, and modern desktop experience. Settle in and become enlightened! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/linux-enlightenment-desktop - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/light_tunnel_death.jpg?itok=ERLZDTfl (Light at the end of the tunnel) -[2]: https://www.enlightenment.org/ -[3]: https://opensource.com/resources/raspberry-pi -[4]: https://opensource.com/sites/default/files/uploads/advent-enlightenment-gdm.jpg (Selecting the Enlightenment desktop in GDM) -[5]: https://opensource.com/sites/default/files/uploads/advent-enlightenment-kdm.jpg (Selecting the Enlightenment desktop in KDM) -[6]: https://en.wikipedia.org/wiki/NetworkManager -[7]: https://opensource.com/sites/default/files/uploads/advent-enlightenment.jpg (Enlightenment running on Fedora) diff --git a/sources/tech/20191202 Holiday gift guide- Linux and open source tech gadgets.md b/sources/tech/20191202 Holiday gift guide- Linux and open source tech gadgets.md deleted file mode 100644 index abc9c9f3e4..0000000000 --- a/sources/tech/20191202 Holiday gift guide- Linux and open source tech gadgets.md +++ /dev/null @@ -1,109 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Holiday gift guide: Linux and open source tech gadgets) -[#]: via: (https://opensource.com/article/19/12/gadgets-holiday-wishlist) -[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) - -Holiday gift guide: Linux and open source tech gadgets -====== -Each of these gadgets encourages learning, exploring, and tinkering, -qualities that reflect the values and interests of open source -enthusiasts. -![new techie gadgets representing innovation][1] - -Everything on Opensource.com's annual selection of tech gadgets would make an excellent holiday gift for your friends and family—or even something to add to your own holiday wishlist. Each of these gadgets encourages learning, exploring, and tinkering, qualities that reflect the values and interests of open source enthusiasts. - -### Circuit Playground Express - -![Circuit Playground Express][2] - -The [Circuit Playground Express][3] packs a wide array of interesting tech into a tiny, programmable package, which makes it an excellent choice for wearable projects. It features a motion sensor, temperature sensor, light sensor, sound sensor, speaker, 10 lights that can display any color, and much more. It can be programmed using block-based, drag-and-drop coding or JavaScript using [Microsoft MakeCode for Adafruit][4], or it can be programmed in Python using [CircuitPython][5]. Advanced users can use the [Arduino IDE][6] to program the board. - -### FreedomBox - -![FreedomBox][7] - -[FreedomBox][8] is a self-hosted, privacy-focused alternative to a wide variety of online services. With FreedomBox, you can handle your email with a web-based IMAP client, calendar, online chatting, file storage, and [more][9] without being tied to services outside of your control. The FreedomBox software is built around Debian GNU/Linux, and all the services it can provide are open source. If you want a ready-to-go home server, you can purchase the [Pioneer edition FreedomBox Home Server][10]. If you want to be more "hands-on," you can download the [FreedomBox software][11] and install it on the supported hardware of your choice. - -### Hack laptop - -![Hack computer][12] - -The [Hack][13] laptop is an ASUS E406MA laptop preloaded with a version of [Endless OS][14] that adds learning activities designed to teach children how to program. With only 4GB of RAM and a 64GB eMMC drive for storage, the Hack laptop is not a super-powerful computer, but it is a nice laptop for basic tasks like word processing, web browsing, and email. If the pre-installed Endless OS is not right for the user, the hardware is compatible with recent releases of most other Linux distributions. - -### Kano Computer Kit - -![Kano Computer Kit][15] - -The [Kano Computer Kit][16] is a computer kit based around a custom Raspberry Pi 3 and running the open source [Kano OS][17]. Users follow step-by-step instructions to build their own computer. Once the computer is assembled, there are more than 100 programming activities that provide even more learning and entertainment. The Kano Computer Kit comes with everything needed to get started, except a monitor. The more expensive [Computer Kit Touch][18] comes with a touchscreen display. - -### micro:bit - -![micro:bit][19] - -The [micro:bit][20] is a tiny, programmable circuit board that is great for learning and making. The board features an array of lights on one side of the circuit board, and the board can be programmed to respond to button presses, light, motion, and temperature. It can be programmed using drag-and-drop block or JavaScript using the [MakeCode editor][21], or it can be programmed in Python. - -### pi-top [4] - -![pi-top \[4\]][22] - -The [pi-top [4]][23] is a kit designed to work with the Raspberry Pi 4. This kit includes a case, cables, and a selection of programmable sensors, buttons, and LEDs. The pi-top [4] is designed to work with [pi-topOS][24], but the kit can work reasonably well with other Raspberry Pi [operating systems][25]. - -### Raspberry Pi 4 (and other models) - -![Raspberry Pi 4][26] - -Of all the single-board computers on the market, the Raspberry Pi is probably the most well-known. Part of the reason for the Raspberry Pi's fame is the copious amount of ancillary material available for learning about projects that can be made using a Raspberry Pi. The [_MagPi Magazine_][27] is published monthly, contains tons of interesting projects, and is free to download. So if you give or receive the official [Raspberry Pi 4 Desktop Kit][28], another Raspberry Pi kit from a vendor, or a custom project built around a Raspberry Pi, you are sure to have an excellent gift, one that can keep on giving as _MagPi_ publishes more and more tutorials. - -### Bonus: Tux Super Key Sticker - -![Tux Super Key Keyboard Sticker][29] - -Sure, a sticker is not a tech gadget, but this [Tux sticker][30] from Think Penguin can turn the Windows key on any computer keyboard into a Tux key. This inexpensive sticker can provide a little extra Linux-ness to any computer keyboard. The sticker is also a great item to buy in bulk and give out throughout the year as a Linux advocacy item. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/gadgets-holiday-wishlist - -作者:[Joshua Allen Holm][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/holmja -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/innovation_virtual_gadgets_device_drone.png?itok=JTAgRb-1 (new techie gadgets representing innovation) -[2]: https://opensource.com/sites/default/files/uploads/circuit_playground_express.jpg (Circuit Playground Express) -[3]: https://learn.adafruit.com/adafruit-circuit-playground-express/overview -[4]: https://learn.adafruit.com/makecode -[5]: https://www.adafruit.com/category/956 -[6]: https://www.arduino.cc/en/Main/Software -[7]: https://opensource.com/sites/default/files/uploads/freedombox_pioneer_edition.jpg (FreedomBox) -[8]: https://freedombox.org -[9]: https://wiki.debian.org/FreedomBox/Features -[10]: https://freedombox.org/buy/ -[11]: https://freedombox.org/download/ -[12]: https://opensource.com/sites/default/files/uploads/endless_hack_laptop.jpg (Hack computer) -[13]: https://hack-computer.com/ -[14]: https://endlessos.com/download/ -[15]: https://opensource.com/sites/default/files/uploads/kano_computer_kit.jpeg (Kano Computer Kit) -[16]: https://kano.me/store/us/products/computer-kit -[17]: https://kano.me/downloadable/us -[18]: https://kano.me/us/store/products/computer-kit-touch -[19]: https://opensource.com/sites/default/files/uploads/microbit.png (micro:bit) -[20]: https://www.microbit.org/ -[21]: https://makecode.microbit.org/ -[22]: https://opensource.com/sites/default/files/uploads/pi-top_4.png (pi-top [4]) -[23]: https://www.pi-top.com/products/pi-top-4 -[24]: https://www.pi-top.com/products/os -[25]: https://www.raspberrypi.org/downloads/ -[26]: https://opensource.com/sites/default/files/uploads/raspberry_pi_4_model_b.jpg (Raspberry Pi 4) -[27]: https://magpi.raspberrypi.org/ -[28]: https://www.raspberrypi.org/blog/whats-inside-the-raspberry-pi-4-desktop-kit/ -[29]: https://opensource.com/sites/default/files/uploads/tux_key_sticker.jpg (Tux Super Key Keyboard Sticker) -[30]: https://www.thinkpenguin.com/gnu-linux/tux-super-key-keyboard-sticker diff --git a/sources/tech/20191203 App Highlight- Caligator is a Beautiful Calculator - Converter.md b/sources/tech/20191203 App Highlight- Caligator is a Beautiful Calculator - Converter.md deleted file mode 100644 index b177be913e..0000000000 --- a/sources/tech/20191203 App Highlight- Caligator is a Beautiful Calculator - Converter.md +++ /dev/null @@ -1,99 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (App Highlight: Caligator is a Beautiful Calculator & Converter) -[#]: via: (https://itsfoss.com/caligator/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -App Highlight: Caligator is a Beautiful Calculator & Converter -====== - -You will find [lots of useful applications for Linux][1], however, not all of them focus primarily on the user experience. - -Sure, the user interface may end up being something nice and simple but not necessarily pleasing to look at. - -For the very same reason, I wanted to have a calculator and converter app on Linux similar to [Numi][2] (which is available only for macOS). I know we already have a superb calculator app like [Qalculate][3] but I am not a fan of its simple looking (read boring) interface. - -Recently, I came across something very similar – ‘[Caligator][4]‘ made by [Team XenoX][5]. - -### It’s Not Your Typical Calculator - -![][6] - -When compared to traditional calculator apps – this is something different. It lets you calculate or convert by simply typing on it (as you can see in the image above). - -Just like you type in to search for something on Google (or on [privacy-oriented Google alternatives][7]), the user has to just type the instruction naturally to get the output. - -Not just limited to the ability to understand instructions for conversions, it also displays the output as you type. So, you do not have to wait and press another button to get the result. - -![How Caligator Works][8] - -### Feature Overview - -![Caligator Screenshot][9] - -For now, you can perform any kind of arithmetic calculations and convert things like Currency, Length, Weight, and more. - -You can choose between a dark or light theme. However, for now, the app might get stuck when you try to change the theme. Atleast, I’m facing this issue right now on Pop!_OS 19.04. - -They would fix the issue in the next update probably. - -In addition to what’s possible, the developers have planned (as per the [official announcement][10]) the following features for the next update: - - * Font size preferences - * Export options - * Click to copy - * More themes - - - -### Getting Caligator on Linux - -You can directly head on to find its [GitHub releases][11] page and download the asset suitable for you. - -For Linux, they have three file formats available: AppImage, Deb files and source code. - -I suggest downloading the [AppImage][12] file. You just have to give it execute permission and then you can run Caligator on any Linux distribution. - -In addition to Linux, you can also try it on your Mac/Windows machine. - -[Caligator][4] - -**Wrapping Up** - -Caligator is still under development so you may encounter bugs. If you do, please open a bug report for the developers on their GitHub repository. - -While this may be in its early stage of development now, it is definitely an impressive project which should incorporate interesting features in the near future. - -I remember that elementary OS also has a [similar application called NaSC][13]. You may want to check it out as well. - -What do you think about ‘Caligator’? Also, if you know about some interesting new open source projects for desktop Linux, let us know in the comments below. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/caligator/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/essential-linux-applications/ -[2]: https://numi.app/ -[3]: https://itsfoss.com/qalculate/ -[4]: https://caligator.now.sh/ -[5]: https://dev.to/teamxenox -[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/caligator-screenshot.png?ssl=1 -[7]: https://itsfoss.com/privacy-search-engines/ -[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/caligator-works.gif?ssl=1 -[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/caligator-screenshot-1.jpg?ssl=1 -[10]: https://dev.to/teamxenox/introducing-caligator-a-simple-yet-powerful-open-source-calculator-convertor-5f86 -[11]: https://github.com/sarthology/caligator/releases -[12]: https://itsfoss.com/use-appimage-linux/ -[13]: https://itsfoss.com/math-ubuntu-nasc/ diff --git a/sources/tech/20191203 Bash Script to Check Successful and Failed User Login Attempts on Linux.md b/sources/tech/20191203 Bash Script to Check Successful and Failed User Login Attempts on Linux.md deleted file mode 100644 index 8ae58c08da..0000000000 --- a/sources/tech/20191203 Bash Script to Check Successful and Failed User Login Attempts on Linux.md +++ /dev/null @@ -1,182 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Bash Script to Check Successful and Failed User Login Attempts on Linux) -[#]: via: (https://www.2daygeek.com/bash-script-to-check-successful-and-failed-user-login-attempts-on-linux/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -Bash Script to Check Successful and Failed User Login Attempts on Linux -====== - -One of the typical tasks of Linux administrators is to check successful and failed login attempts in the Linux system. - -This ensures that there are no illegal attempts at the environment. - -It is very difficult to manually verify them because the output of the **“/var/log/secure”** file looks awkward. - -To make this easier and more effective, we need to write a bash script. - -Yes, you can achieve this using the following **[Bash script][1]**. - -I’ve included two shell scripts in this tutorial. - -These scripts will show the number of users logged into the system for a given date. Also, it shows successful login attempts and failed login attempts. - -The first **[shell script][2]** allows you to verify user access information for any date available in the **“/var/log/secure”** file. - -The second bash script allows you to send a mail with user access information on a daily basis. - -### Method-1 : Shell Script to Check Successful and Failed User Login Attempts on Linux - -This script allows you to verify user access information for a given date from the terminal. - -``` -# vi /opt/scripts/user-access-details.sh - -#!/bin/bash -echo "" -echo -e "Enter the Date, Use Double Space for date from 1 to 9 (Nov 3) and use Single Space for date from 10 to 31 (Nov 30): \c" -read yday -MYPATH=/var/log/secure* -yday=$(date --date='yesterday' | awk '{print $2,$3}') -yday=$(date | awk '{print $2,$3}') -tuser=$(grep "$yday" $MYPATH | grep "Accepted|Failed" | wc -l) -suser=$(grep "$yday" $MYPATH | grep "Accepted password|Accepted publickey|keyboard-interactive" | wc -l) -fuser=$(grep "$yday" $MYPATH | grep "Failed password" | wc -l) -scount=$(grep "$yday" $MYPATH | grep "Accepted" | awk '{print $9;}' | sort | uniq -c) -fcount=$(grep "$yday" $MYPATH | grep "Failed" | awk '{print $9;}' | sort | uniq -c) -echo "--------------------------------------------" -echo " User Access Report on: $yday" -echo "--------------------------------------------" -echo "Number of Users logged on System: $tuser" -echo "Successful logins attempt: $suser" -echo "Failed logins attempt: $fuser" -echo "--------------------------------------------" -echo -e "Success User Details:\n $scount" -echo "--------------------------------------------" -echo -e "Failed User Details:\n $fcount" -echo "--------------------------------------------" -``` - -Set an executable **[Linux file permission][3]** to **“user-access-details-1.sh”** file. - -``` -# chmod +x /opt/scripts/user-access-details-1.sh -``` - -When you run the script you will receive an alert like the one below. - -``` -# sh /opt/scripts/user-access-details.sh - -Enter the Date, Use Double Space for date from 1 to 9 (Nov 3) and use Single Space for date from 10 to 31 (Nov 30): Nov 6 ------------------------------------------- - User Access Report on: Nov 6 ------------------------------------------- -Number of Users logged on System: 1 -Successful logins attempt: 1 -Failed logins attempt: 0 ------------------------------------------- -Success User Details: - 1 root ------------------------------------------- -Failed User Details: ------------------------------------------- -``` - -When you run the script you will receive an alert like the one below. - -``` -# sh /opt/scripts/user-access-details.sh - -Enter the Date, Use Double Space for date from 1 to 9 (Nov 3) and use Single Space for date from 10 to 31 (Nov 30): Nov 30 ------------------------------------------- - User Access Report on: Nov 30 ------------------------------------------- -Number of Users logged on System: 20 -Successful logins attempt: 14 -Failed logins attempt: 6 ------------------------------------------- -Success User Details: - 1 daygeek - 1 root - 3 u1 - 4 u2 - 1 u3 - 2 u4 - 2 u5 ------------------------------------------- -Failed User Details: - 3 u1 - 3 u4 ------------------------------------------- -``` - -### Method-2 : Bash Script to Check Successful and Failed User Login Attempts With eMail Alert. - -This Bash script allows you to send a mail with user access details on a daily basis via email for yesterday’s date. - -``` -# vi /opt/scripts/user-access-details-2.sh - -#!/bin/bash -/tmp/u-access.txt -SUBJECT="User Access Reports on "date"" -MESSAGE="/tmp/u-access.txt" -TO="[email protected]" -MYPATH=/var/log/secure* -yday=$(date --date='yesterday' | awk '{print $2,$3}') -tuser=$(grep "$yday" $MYPATH | grep "Accepted|Failed" | wc -l) -suser=$(grep "$yday" $MYPATH | grep "Accepted password|Accepted publickey|keyboard-interactive" | wc -l) -fuser=$(grep "$yday" $MYPATH | grep "Failed password" | wc -l) -scount=$(grep "$yday" $MYPATH | grep "Accepted" | awk '{print $9;}' | sort | uniq -c) -fcount=$(grep "$yday" $MYPATH | grep "Failed" | awk '{print $9;}' | sort | uniq -c) -echo "--------------------------------------------" >> $MESSAGE -echo " User Access Report on: $yday" >> $MESSAGE -echo "--------------------------------------------" >> $MESSAGE -echo "Number of Users logged on System: $tuser" >> $MESSAGE -echo "Successful logins attempt: $suser" >> $MESSAGE -echo "Failed logins attempt: $fuser" >> $MESSAGE -echo "--------------------------------------------" >> $MESSAGE -echo -e "Success User Details:\n $scount" >> $MESSAGE -echo "--------------------------------------------" >> $MESSAGE -echo -e "Failed User Details:\n $fcount" >> $MESSAGE -echo "--------------------------------------------" >> $MESSAGE -mail -s "$SUBJECT" "$TO" < $MESSAGE -``` - -Set an executable permission to **“user-access-details-2.sh”** file. - -``` -# chmod +x /opt/scripts/user-access-details-2.sh -``` - -Finally add a **[cronjob][4]** to automate this. It will run everyday at 8’o clock. - -``` -# crontab -e - -0 8 * * * /bin/bash /opt/scripts/user-access-details-2.sh -``` - -**Note:** You will be getting an email alert everyday at 8 o’clock, which is for previous day’s user access information. - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/bash-script-to-check-successful-and-failed-user-login-attempts-on-linux/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/category/bash-script/ -[2]: https://www.2daygeek.com/category/shell-script/ -[3]: https://www.2daygeek.com/understanding-linux-file-permissions/ -[4]: https://www.2daygeek.com/linux-crontab-cron-job-to-schedule-jobs-task/ diff --git a/sources/tech/20191203 How to write a security integration module for Ansible.md b/sources/tech/20191203 How to write a security integration module for Ansible.md deleted file mode 100644 index 550dfd44a6..0000000000 --- a/sources/tech/20191203 How to write a security integration module for Ansible.md +++ /dev/null @@ -1,189 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to write a security integration module for Ansible) -[#]: via: (https://opensource.com/article/19/12/security-ansible-module) -[#]: author: (Adam Miller https://opensource.com/users/maxamillion) - -How to write a security integration module for Ansible -====== -Ansible automation offers a lot of potential for the information -security industry. Learn how to take advantage of it in this summary of -an AnsibleFest 2019 talk. -![Security monster][1] - -[Ansible][2] is a [radically simple IT automation platform][3] that makes your applications and systems easier to deploy. It allows you to avoid writing scripts or custom code to deploy and update your applications, systems, and various classifications of network-attached devices. Ansible allows you to automate in a language that approaches plain English with no agents to install on remote systems and uses native protocols based on device type—such as SSH for Unix-style operating systems, WinRM for Windows systems, REST APIs (**httpapi**) for REST API appliances, and many more. - -### Background - -At [AnsibleFest 2019][4], my colleague [Sumit Jaiswal][5] and I gave a talk, titled "[Ansible development deep dive: How to write a security integration module and collection for Ansible][6]," about something that we have been working on. This article recaps the finer points of our talk; I hope it will highlight the potential of what Ansible is—and can be capable of—in the realm of information security automation. - -A lot of this started with my colleague [Massimo Ferrari's][7] statement that "Ansible automation can be the _lingua franca_ to integrate and orchestrate the many security platforms spread across different domains." We spent a lot of time mulling this over; it may be obvious to DevOps and automation professionals who've discovered the power of Ansible, but infosec doesn't have similar tools that target the industry's problems in the same way. Therefore, Ferrari's statement offers a lot of potential for the infosec industry. - -In this article, I'll summarize two major points we highlighted in our AnsbileFest 2019 talk: - - * Ansible recommended development practices - * Classify what you're integrating with and how you connect to it (API or CLI?) - - - -### Ansible recommended development practices - -The Ansible engineering team likes to never write the words "best practice," because we can't possibly know what's best for you in your specific situation. You are the expert on topics as they apply to your unique environment and requirements. However, we can provide _recommendations_, which I'll outline from the perspective of an Ansible module developer. - -#### Modules - -Modules are user-focused and self-contained. This mostly means that the code contained in your module should be self-contained within your [module][8] or in a **[module_util][9]**. The latter is what allows us to share code between modules, but everything must be as self-contained as possible, as we don't want to introduce too many external dependencies. We also want each module to perform some sort of state management. Each module should be [idempotent][10], which basically means "inflict change if needed, otherwise, do not." A module should not attempt to contain a workflow (that's what [playbooks][11] are for), and we want to leave that up to the user. Modules shouldn't attempt to "do too much," such that you have one massive module that takes 100 arguments and, based on values provided by the user, performs wildly different actions on the target device. - -An example of what we generally want to avoid could go something like this: - - -``` -\- name: Create a virtual machine -  some_module: -    thing_to_do: "create_virtual_machine" -    name: "bobs_awesome_vm" -    storage_size: 100G -    ram: 24G -    vcpus: 4 - -\- name: Create a virtual storage volume -  some_module: -    thing_to_do: "create_virtual_storage_vol" -    name: "bobs_awesome_storage" -    storage_size: 1000G -    lun_id: 12 -``` - -In this example, the fictitious **some_module** is performing completely disjointed actions based on the value of **thing_to_do**. This is not a discrete, self-contained unit of work from the perspective of an Ansible module. These should be two separate modules that could even share code on the backend through a custom module_util (if that makes the developer's life easier). Either way, they should be separate modules so the user can easily define, read, and understand the task as written. As a developer, you want to make the module's interaction user-focused. - -Another aspect of being user-focused is that the user should not need any knowledge of the destination API in order to use the module effectively. The module should provide useful defaults, documentation, and examples that allow users to pick their own automation path. - -#### Collections - -[Ansible collections][12] are a relatively new concept, but they are generally seen as the future for Ansible content of all shapes and sizes. They allow Ansible content, such as modules, module_utils, plugins of all kinds, roles, docs, tests, playbooks, and whatever the community dreams up next, to exist as a cohesive unit to be tested, verified, and distributed as an entity. What's more (and this is its real advantage for developers) is that it decouples the content from the [Ansible Core runtime][13]. This allows Ansible content to be lifecycle-managed separately from Ansible itself, meaning it can be released as often or as infrequently as the content author or maintainer desires. No longer will new features have to wait six months for the next Ansible release. The collection authors can release as often as they desire. - -Collections are meant to be a simple progression into a brave new world where the Ansible Core execution engine is symbolically similar to [CPython][14]. Ansible collections are symbolically similar to Python modules found on [PyPI][15]. [Ansible Galaxy][16] is symbolically similar to PyPI as the de facto distribution mechanism. - -From a developer standpoint, you simply need to drop your files in the correct location and update any custom module_utils Python import paths. From a user perspective, you just need to add the **collection** namespace and name to the [play][11] or [block][17] that intends to use that content. - -### Classify what you're integrating with and how you connect to it - -In the security realm, appliance devices or software that is meant to be used like an appliance (network devices, embedded systems, and so on) sometimes present the administrator both an [application programming interface][18] (API) and a [command-line interface][19] (CLI). As a module developer, you must make some decisions in service of ease of development, maintainability of code, and, ultimately, consistent user experience. - -#### CLI - -If you are potentially going to wrap a CLI, ask yourself whether that CLI offers a consistent interface with output you can reasonably and consistently parse. Beyond that, does the CLI offer the ability to formulate idempotent transactions? While the majority of CLIs offer **get** and **set** types of transactions (especially on Unix/Linux systems), some of them do not, and this is something module authors need to consider. - -When considering CLI implementations with network or embedded devices that have a standard CLI but don't offer a traditional Unix shell, you should look into implementing a [cliconf plugin][20]. This type of plugin enables your users to interact with appliances or embedded devices in a way that's natural to the seasoned Ansible user and beginner alike. Alternatively, should you find yourself with a device that allows you to execute local Python code (_local_ to the device or system itself; a "managed host" in Ansible terminology), then consider the **[run_command][21]** module_util. The latter situation is effectively just a traditional [module development][22] workflow, as it would be for a traditional GNU/Linux distribution. - -#### API - -If the technology you are attempting to integrate with offers an API, determine whether that API is a local on-system API (local to the remote "managed host" system) or a remote API such as a [REST][23] API? - -In the event you find yourself with a local Python API and it's advantageous to use it instead of the REST API (in the event both are available), this situation is effectively the same as a traditional [module development][22] workflow in a GNU/Linux distribution. - -However, if the only option is a REST API, or if the available REST API is determined to be the best option, then writing an [httpapi connection plugin][24] is best for general ease of implementation, maintenance, and handling things like AuthN, AuthZ, sessions, and so on. It also offers an idiomatic pattern for talking to these types of devices, even though they have a considerably different means of communication than most others that Ansible works with. - -An example to illustrate this point is probably common to anyone who has automated a web service with a module that doesn't provide an httpapi connection plugin. Typically in these scenarios, the play, block, or task must be run against **localhost**, and the various information for the connection to the web service must be passed to each invocation of the module for each task. - - -``` -\--- -\- name: talk to foo device -  hosts: localhost -  tasks: -    - name: do something -      foo_device_do_thing: -        url: foo.example.com -        username: "{{ foo_device_username }}" -        passwd: "{{ foo_device_password }}" -        validate_certs: true -        thing_state: present -        some_param: bar -``` - -If this module had been implemented against an httpapi connection plugin instead, then the various connection-specific parameters would be host variables or group variables and wouldn't have to be carried around at the task level in playbooks. - -Here's an inventory entry to handle the AuthN/AuthZ connection for all Ansible modules, written against the httpapi connection plugin. It also performs session handling for increased performance: - - -``` -[foo_devices] -foo.example.com - -[foo_devices:vars] -ansible_network_os=foo_device -ansible_user=foo_device_username -ansible_httpapi_pass=foo_device_password -ansible_httpapi_validate_certs=true -``` - -This playbook would be considerably more idiomatic. The **foo_devices** are a first-class device type and [host pattern][25] for the playbook. - - -``` -\--- -\- name: talk to foo device -  hosts: foo_devices -  tasks: -    - name: do something -      foo_device_do_thing: -        thing_state: present -        some_param: bar -``` - -A playbook has to define information for every task, so imagine one that has 20 or 100 tasks. The overhead would be considerable. This doesn't feel much like directly automating the hosts defined in the host field. However, the httpapi connection plugin negates the need to define the connection information over and over, and it also talks natively to devices over a REST API, just as you would on a Linux system over SSH in a playbook. - -Something to note about httpapi connection plugins is that, even though the user defines hosts, groups, host vars, and group vars, just in like a traditional Unix/Linux or Windows-managed host, these modules actually execute against the localhost (the "control host" in Ansible nomenclature). This is something to keep in mind when you're developing. - -### What the what? - -If you're new to Ansible module development, this might seem like a lot to take in at once. To be fair, it is. However, as you become more seasoned in the finer points of Ansible module development for a wide array of device types and technology solution classifications, the motivation for different development strategies starts to make sense. Some device classifications have idiosyncrasies, and this model helps Ansible developers and users deal with those in a consistent and predictable way. - -### Wrapping up - -If you have questions about Ansible module development models, feel free to reach out through the vibrant [Ansible Community][26], and more specifically, the [Ansible Security Automation Working Group][27]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/security-ansible-module - -作者:[Adam Miller][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/maxamillion -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_password_chaos_engineer_monster.png?itok=J31aRccu (Security monster) -[2]: https://www.ansible.com -[3]: https://opensource.com/article/19/2/quickstart-guide-ansible -[4]: https://www.ansible.com/ansiblefest -[5]: https://github.com/justjais -[6]: https://www.ansible.com/development-deep-dive-how-to-write-a-security-integration-module-for-ansible -[7]: https://www.linkedin.com/in/massimoferrari/ -[8]: https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html#developing-modules-general -[9]: https://docs.ansible.com/ansible/latest/dev_guide/developing_module_utilities.html -[10]: https://en.wikipedia.org/wiki/Idempotence -[11]: https://docs.ansible.com/ansible/latest/user_guide/playbooks.html -[12]: https://docs.ansible.com/ansible/latest/dev_guide/developing_collections.html -[13]: https://github.com/ansible/ansible -[14]: https://en.wikipedia.org/wiki/CPython -[15]: https://pypi.org -[16]: https://galaxy.ansible.com -[17]: https://docs.ansible.com/ansible/latest/user_guide/playbooks_blocks.html -[18]: https://en.wikipedia.org/wiki/Application_programming_interface -[19]: https://en.wikipedia.org/wiki/Command-line_interface -[20]: https://docs.ansible.com/ansible/latest/plugins/cliconf.html -[21]: https://docs.ansible.com/ansible/latest/reference_appendices/module_utils.html#ansible.module_utils.basic.AnsibleModule.run_command -[22]: https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html -[23]: https://en.wikipedia.org/wiki/Representational_state_transfer -[24]: https://docs.ansible.com/ansible/latest/network/dev_guide/developing_plugins_network.html#developing-plugins-httpapi -[25]: https://docs.ansible.com/ansible/latest/user_guide/intro_patterns.html -[26]: https://www.ansible.com/community -[27]: https://github.com/ansible/community/wiki/Security-Automation diff --git a/sources/tech/20191203 Solutions to the tiny window manager challenge.md b/sources/tech/20191203 Solutions to the tiny window manager challenge.md deleted file mode 100644 index 54883376cc..0000000000 --- a/sources/tech/20191203 Solutions to the tiny window manager challenge.md +++ /dev/null @@ -1,131 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Solutions to the tiny window manager challenge) -[#]: via: (https://jvns.ca/blog/2019/12/03/solutions-to-the-tiny-window-manager-challenge/) -[#]: author: (Julia Evans https://jvns.ca/) - -Solutions to the tiny window manager challenge -====== - -Hello! Last week I posted a small [programming challenge to write a tiny window manager that bounces windows around the screen][1]. - -![][2] - -I’ll write a bit about my experience of solving the challenge, or you can just skip to the end to see the solutions. - -### what’s a window manager? - -An X window manager is a program that sends messages to the X server (which is in charge of drawing your windows) to tell it which windows to display and where. - -I found out that you can trace those events with `xtrace`. Here’s some example output from xtrace (for the toy window manager which is just moving windows about) - -``` -000:<:02d8: 20: Request(12): ConfigureWindow window=0x004158e5 values={x=560 y=8} -000:<:02da: 20: Request(12): ConfigureWindow window=0x004158e5 values={x=554 y=12} -000:<:02dc: 20: Request(12): ConfigureWindow window=0x004158e5 values={x=548 y=16} -000:<:02de: 20: Request(12): ConfigureWindow window=0x004158e5 values={x=542 y=20} -000:<:02e0: 20: Request(12): ConfigureWindow window=0x004158e5 values={x=536 y=24} -000:<:02e2: 20: Request(12): ConfigureWindow window=0x004158e5 values={x=530 y=28} -000:<:02e4: 20: Request(12): ConfigureWindow window=0x004158e5 values={x=524 y=32} -``` - -### you can run programs without a window manager - -You technically don’t _need_ a window manager to run graphical programs – if you want to start an xterm in a window-manager-less X session you can just run - -``` -xterm -display :1 -``` - -and it’ll start the xterm. Here’s a screenshot of an X session with no window manager open. I even have 2 windows open! (chrome and an xterm). It has some major usability problems, for example I don’t think you can resize or move or switch between windows. Which is where the window manager comes in! - - - -### move a window with XMoveWindow - -The challenge was to make the window bounce around the screen. - -In the [tinywm source][3] they use `XMoveResizeWindow` to move and resize windows, but I found in the [docs][4] that there’s also a function called `XMoveWindow`. Perfect! - -Here’s what it looks like. What could be simpler, right? And it works just the way I’d expect! - -``` -XMoveWindow(display, windowID, x, y) -``` - -Except… - -### problem: multiple `XMoveWindow`s don’t work - -I ran into a problem (which I got stuck on for a couple of hours) where when I ran XMoveWindow twice, it would only apply the last move. - -``` -XMoveWindow(display, windowID, 100, 200) -usleep(2000 * 1000); # sleep for 2 seconds -XMoveWindow(display, windowID, 300, 400) -``` - -I’d expect this to move the window once, wait 2 seconds, and them move it again. But that was not what happened! Instead, it would pause for 2 seconds and then move the window once (to the second location). - -### use xtrace to trace window manager events - -I used xtrace to trace the events and found out that my `ConfigureWindow` events that `XMoveWindow` was sending were all being sent at the same time. So it seemed like X was batching the events. But why? - -### XSync forces X to process events - -I didn’t know why this was happening, but I emailed Julian about it and he pointed me in the direction of [XSync][5], which forces X to process all the events you’ve sent it. Sure enough, I used XSync and everything worked beautifully. - -### solutions - -I asked people to email me if they completed the challenge, and 4 people did! Here are their solutions. All the solutions I got implemented more features than I did, so I’d encourage you to look at all the solutions if you’re interested in how to solve this problem! - - * [Kacper Słomiński’s solution][6] (which uses `XQueryTree` to find the windows to bounce, which is nice) - * [@whichxyj’s solution][7] - * [Alexsey Lagoshin’s stressfulwm][8], which allows bouncing multiple windows: - * [Aldrin Martoq Ahumada’s bouncywm-ruby][9], which is the only solution in a language other than C I got! It uses an Xlib Ruby library that looks pretty straightforward to use. - * one really nice one with fancier bouncing effects which I’ll post here later if the person sends me the source - * [my solution][10] - - - -Here’s a gif of Alexsey’s solution. Apparently `XQuartz` on a Mac performs better than Xephyr! - -![][11] - -And Aldrin’s solution, with a great use of `xeyes`: - -![][12] - -### thanks! - -Thanks to everyone who emailed me a solution, and if you write your own implementation I’d love to post it here too, especially if you write one that isn’t in C or Ruby! I’m [[email protected]][13] - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019/12/03/solutions-to-the-tiny-window-manager-challenge/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://jvns.ca/blog/2019/11/25/challenge--make-a-bouncy-window-manager/ -[2]: https://jvns.ca/images/bouncewm.gif -[3]: http://incise.org/tinywm.html -[4]: https://tronche.com/gui/x/xlib/window/XMoveWindow.html -[5]: https://tronche.com/gui/x/xlib/event-handling/XSync.html -[6]: https://gist.github.com/jvns/d5a0a4daf300f3dd7fa76d13b5aa2d53 -[7]: https://github.com/whichxjy/bounce-wm/blob/master/bounce-wm.c -[8]: https://github.com/ayzenquwe/stressfulwm -[9]: https://github.com/aldrinmartoq/bouncywm-ruby -[10]: https://gist.github.com/jvns/c7a297fc4e17e797fd7b76b68860e55c -[11]: https://raw.githubusercontent.com/ayzenquwe/stressfulwm/d06531d286a5f00424bf12f7c77b18e11437ff20/gif/example.gif -[12]: https://raw.githubusercontent.com/aldrinmartoq/bouncywm-ruby/f6d424b6107c1349c8ee338b6a46c7116c6d1ea7/demo/demo.gif -[13]: https://jvns.ca/cdn-cgi/l/email-protection diff --git a/sources/tech/20191204 4 ways to control the flow of your awk script.md b/sources/tech/20191204 4 ways to control the flow of your awk script.md deleted file mode 100644 index df08e99812..0000000000 --- a/sources/tech/20191204 4 ways to control the flow of your awk script.md +++ /dev/null @@ -1,273 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (4 ways to control the flow of your awk script) -[#]: via: (https://opensource.com/article/19/12/control-awk-script) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -4 ways to control the flow of your awk script -====== -Learn to use switch statements and the break, continue, and next -commands to control awk scripts. -![JavaScript in Vim][1] - -There are many ways to control the flow of an awk script, including [loops][2], **switch** statements and the **break**, **continue**, and **next** commands. - -### Sample data - -Create a sample data set called **colours.txt** and copy this content into it: - - -``` -name       color  amount -apple      red    4 -banana     yellow 6 -strawberry red    3 -raspberry  red    99 -grape      purple 10 -apple      green  8 -plum       purple 2 -kiwi       brown  4 -potato     brown  9 -pineapple  yellow 5 -``` - -### Switch statements - -The **switch** statement is a feature specific to GNU awk, so you can only use it with **gawk**. If your system or your target system doesn't have **gawk**, then you should not use a switch statement. - -The **switch** statement in **gawk** is similar to the one in C and many other languages. The syntax is: - - -``` -switch (expression) { -        case VALUE: -                <do something here> -        [...] -        default: -                <do something here> -} -``` - -The **expression** part can be any awk expression that returns a numeric or string result. The **VALUE** part (after the word **case**) is a numeric or string constant or a regular expression. - -When a **switch** statement runs, the _expression_ is evaluated, and the result is matched against each case value. If there's a match, then the code contained within a case definition is executed. If there's no match in any case definition, then the default statement is executed. - -The keyword **break** is at the end of the code in each case definition to break the loop. Without **break**, awk would continue to search for matching case values. - -Here's an example **switch** statement: - - -``` -#!/usr/bin/awk -f -# -# Example of the use of 'switch' in GNU Awk. - -NR > 1 { -    printf "The %s is classified as: ",$1 - -    switch ($1) { -        case "apple": -            print "a fruit, pome" -            break -        case "banana": -        case "grape": -        case "kiwi": -            print "a fruit, berry" -            break -                case "raspberry": -                        print "a computer, pi" -                        break -        case "plum": -            print "a fruit, drupe" -            break -        case "pineapple": -            print "a fruit, fused berries (syncarp)" -            break -        case "potato": -            print "a vegetable, tuber" -            break -        default: -            print "[unclassified]" -    } -} -``` - -This script notably ignores the first line of the file, which in the case of the sample data is just a header. It does this by operating only on records with an index number greater than 1. On all other records, this script compares the contents of the first field (**$1**, as you know from previous articles) to the value of each **case** definition. If there's a match, the **print** function is used to print the botanical classification of the entry. If there are no matches, then the **default** instance prints **"[unclassified]"**. - -The banana, grape, and kiwi are all botanically classified as a berry, so there are three **case** definitions associated with one **print** result. - -Run the script on the **colours.txt** sample file, and you should get this: - - -``` -The apple is classified as: a fruit, pome -The banana is classified as: a fruit, berry -The strawberry is classified as: [unclassified] -The raspberry is classified as: a computer, pi -The grape is classified as: a fruit, berry -The apple is classified as: a fruit, pome -The plum is classified as: a fruit, drupe -The kiwi is classified as: a fruit, berry -The potato is classified as: a vegetable, tuber -The pineapple is classified as: a fruit, fused berries (syncarp) -``` - -### Break - -The **break** statement is mainly used for the early termination of a **for**, **while**, or **do-while** loop or a **switch** statement. In a loop, **break** is often used where it's not possible to determine the number of iterations of the loop beforehand. Invoking **break** terminates the enclosing loop (which is relevant when there are nested loops or loops within loops). - -This example, straight out of the [GNU awk manual][3], shows a method of finding the smallest divisor. Read the additional comments for a clear understanding of how the code works: - - -``` -#!/usr/bin/awk -f - -{ -    num = $1 - -    # Make an infinite FOR loop -    for (divisor = 2; ; divisor++) { - -        # If num is divisible by divisor, then break -        if (num % divisor == 0) { -            printf "Smallest divisor of %d is %d\n", num, divisor -            break -        } - -        # If divisor has gotten too large, the number has no -        # divisor, so is a prime -        if (divisor * divisor > num) { -            printf "%d is prime\n", num -            break -        } -    } -} -``` - -Try running the script to see its results: - - -``` -    $ echo 67 | ./divisor.awk -    67 is prime -    $ echo 69 | ./divisor.awk -    Smallest divisor of 69 is 3 -``` - -As you can see, even though the script starts out with an explicit _infinite_ loop with no end condition, the **break** function ensures that the script eventually terminates. - -### Continue - -The **continue** function is similar to **break**. It can be used in a **for**, **while**, or **do-while** loop (it's not relevant to a **switch** statements, though). Invoking **continue** skips the rest of the enclosing loop and begins the next cycle. - -Here's another good example from the GNU awk manual to demonstrate a possible use of **continue**: - - -``` -#!/usr/bin/awk -f - -# Loop, printing numbers 0-20, except 5 - -BEGIN { -    for (x = 0; x <= 20; x++) { -        if (x == 5) -            continue -        printf "%d ", x -    } -    print "" -} -``` - -This script analyzes the value of **x** before printing anything. If the value is exactly 5, then **continue** is invoked, causing the **printf** line to be skipped, but leaves the loop unbroken. Try the same code but with **break** instead to see the difference. - -### Next - -This statement is not related to loops like **break** and **continue** are. Instead, **next** applies to the main record processing cycle of awk: the functions you place between the BEGIN and END functions. The **next** statement causes awk to stop processing the _current input record_ and to move to the next one. - -As you know from the earlier articles in this series, awk reads records from its input stream and applies rules to them. The **next** statement stops the execution of rules for the current record and moves to the next one. - -Here's an example of **next** being used to "hold" information upon a specific condition: - - -``` -#!/usr/bin/awk -f - -# Ignore the header -NR == 1 { next } - -# If field 2 (colour) is less than 6 -# characters, then save it with its -#  line number and skip it - -length($2) < 6 { -    skip[NR] = $0 -    next -} - -# It's not the header and -# the colour name is > 6 characters, -# so print the line -{ -    print -} - -# At the end, show what was skipped -END { -    printf "\nSkipped:\n" -    for (n in skip) -        print n": "skip[n] -} -``` - -This sample uses **next** in the first rule to avoid the first line of the file, which is a header row. The second rule skips lines when the color name is less than six characters long, but it also saves that line in an array called **skip**, using the line number as the key (also known as the _index_). - -The third rule prints anything it sees, but it is not invoked if either rule 1 or rule 2 causes it to be skipped. - -Finally, at the end of all the processing, the **END** rule prints the contents of the array. - -Run the sample script on the **colours.txt** file from above (and previous articles): - - -``` -$ ./next.awk colours.txt -banana     yellow 6 -grape      purple 10 -plum       purple 2 -pineapple  yellow 5 - -Skipped: -2: apple      red    4 -4: strawberry red    3 -6: apple      green  8 -8: kiwi       brown  4 -9: potato     brown  9 -``` - -### Control freak - -In summary, **switch**, **continue**, **next**, and **break** are important preemptive exceptions to awk rules that provide greater control of your script. You don't have to use them directly; often, you can gain the same logic through other means, but they're great convenience functions that make the coder's life a lot easier. The next article in this series covers the **printf** statement. - -* * * - -Would you rather listen to this article? It was adapted from an episode of [Hacker Public Radio][4], a community technology podcast by hackers, for hackers. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/control-awk-script - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/javascript_vim.jpg?itok=mqkAeakO (JavaScript in Vim) -[2]: https://opensource.com/article/19/11/loops-awk -[3]: https://www.gnu.org/software/gawk/manual/ -[4]: http://hackerpublicradio.org/eps.php?id=2438 diff --git a/sources/tech/20191204 Complementary engineering indicators.md b/sources/tech/20191204 Complementary engineering indicators.md deleted file mode 100644 index 981720ab11..0000000000 --- a/sources/tech/20191204 Complementary engineering indicators.md +++ /dev/null @@ -1,61 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Complementary engineering indicators) -[#]: via: (https://dave.cheney.net/2019/12/04/complementary-engineering-indicators) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -Complementary engineering indicators -====== - -Last year I had the opportunity to watch Cat Swetel’s presentation _[The Development Metrics You Should Use (but Don’t)][1]_. The information that could be gleaned from just tracking the start and finish date of work items was eye opening. If you’re using an issue tracker this information is probably already (perhaps with some light data munging) available — no need for TPS reports. Additionally, statistics obtained by data mining your project’s issue tracker are, perhaps, less likely to be juked. - -Around the time I saw Cat’s presentation I finished reading Andy Grove’s _High Output Management_. The hidden gem in this book (assuming becoming a meeting powerhouse isn’t your bag) was Grove’s notion of indicator pairs. An example of a paired indicator might be the number of sales deals closed paired with the customer retention rate. The underling principle being optimising for one indicator will have an adverse impact on the other. In the example, overly aggressive or deceptive tactics could superficially raise the number of sales made, but would be reflected in a dip in the retention rate as customers returned the product or terminated their service prematurely. - -These ideas lead me to thinking about indicators you could use for a team delivering a software product. Could those indicators be derived cheaply from the hand to hand combat of software delivery? Could they be structured in a way that aggressively pursuing one metric would be reflected negatively in another? I think so. - -These are the three metrics that I’ve been using to track the health of the project that I lead. - - * Date; was the software done when we said it would be done. If you prefer this indicator as a scalar, how many days difference is there between the ship date agreed on at the start of the sprint/milestone/whatever and what was the actual date that you considered it done. - * Completeness; when the software is done, how many of the things we said we’re going to do actually got delivered in that release. - * Defects reported; once the software is in the field, what is the rate of bugs reported. - - - -It is relatively easy, for example, to hit a delivery date if you aggressively descope anything risky or simply don’t do it. But in doing so this lack of promised functionality would impact the completeness metric. - -Conversely, it’s straight forward to hit your milestone’s completeness target if you let the release date slip and slip. Bringing both the metics into line requires good estimation skills to judge how much can be attempted in milestone and provide direct feedback if your estimation skills needed work. - -The third indicator, defects reported in the field, acts as a check on the other two. It would be easy to consistent hit your delivery date with 100% feature completion if your team does a shoddy job. The high fives and 🎉 emojis will be short lived if each release brings with it a swathe of high priority bug reports. This indicator also tends to have a second order effect, rushed features to meet a deadline tend to generate remedial work in the following milestones, crowding out promised work or blowing later deadlines. - -I consider these to be complementary metrics, they should be considered together, as a group, rather than individually. Ideally your team should be delivering what you promised, when you promised it, with a low defect rate. But more importantly, if that isn’t the case, if one of the indicators is unhealthy, addressing it shouldn’t result in the problem moving to another. - -### Related posts: - - 1. [Never edit a method, always rewrite it][2] - 2. [The Mythical Man-Month selection bias][3] - 3. [The office coffee model of concurrent garbage collection][4] - 4. [Sydney High Performance Go workshop][5] - - - --------------------------------------------------------------------------------- - -via: https://dave.cheney.net/2019/12/04/complementary-engineering-indicators - -作者:[Dave Cheney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://dave.cheney.net/author/davecheney -[b]: https://github.com/lujun9972 -[1]: https://www.youtube.com/watch?v=cW3yM-K2M08 -[2]: https://dave.cheney.net/2017/11/30/never-edit-a-method-always-rewrite-it (Never edit a method, always rewrite it) -[3]: https://dave.cheney.net/2013/12/04/the-mythical-man-month-selection-bias (The Mythical Man-Month selection bias) -[4]: https://dave.cheney.net/2018/12/28/the-office-coffee-model-of-concurrent-garbage-collection (The office coffee model of concurrent garbage collection) -[5]: https://dave.cheney.net/2019/07/05/sydney-high-performance-go-workshop (Sydney High Performance Go workshop) diff --git a/sources/tech/20191204 Spice up your Linux desktop with Cinnamon.md b/sources/tech/20191204 Spice up your Linux desktop with Cinnamon.md deleted file mode 100644 index 036f253188..0000000000 --- a/sources/tech/20191204 Spice up your Linux desktop with Cinnamon.md +++ /dev/null @@ -1,68 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Spice up your Linux desktop with Cinnamon) -[#]: via: (https://opensource.com/article/19/12/cinnamon-linux-desktop) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Spice up your Linux desktop with Cinnamon -====== -This article is part of a special series of 24 days of Linux desktops. -Just like its namesake, the Cinnamon Linux desktop is warm and inviting -and cozy. -![Cinnamon][1] - -When GNOME 3 was released, some GNOME users were not ready to give up GNOME 2. The [Linux Mint][2] project was so dissatisfied with GNOME 3 that it started its own desktop as an alternative, and thus the [Cinnamon][3] desktop was born. - -Cinnamon originally sought to "remix" GNOME 3 so that it looked and acted like the GNOME 2 so many users knew and loved, but eventually, it diverged enough to be a true fork. Today, Cinnamon uses GTK3 libraries and forked versions of key GNOME 3 applications to create a classic GNOME experience. - -You may find Cinnamon in your distribution's software repository, or you can download and install a distribution that ships with Cinnamon as its default desktop. Before you do, though, be aware that it is meant to provide a full desktop experience, so many Cinnamon apps are installed along with the desktop. If you're already running a different desktop, you may find yourself with redundant applications (two PDF readers, two media players, two file managers, and so on). - -If you just want to try the Cinnamon desktop, you can install a Cinnamon-based distribution in a virtual machine, such as [GNOME Boxes][4]. - -### Cinnamon desktop tour - -The Cinnamon desktop layout has a classic look, although—in spite of being inspired by GNOME 2—that look is not at all like GNOME 2. In fact, it shares more with KDE's Plasma desktop than with GNOME 2, with an application menu in the lower-left corner, a taskbar for pinned and active applications, and a system tray in the lower-right corner. There's no top menu bar with Applications and Places and System menus, and the taskbar uses icons with no text, so if it's a clone of GNOME 2 you're looking for, Cinnamon doesn't provide that. - -![Cinnamon desktop on Linux Mint][5] - -What Cinnamon does provide, however, is the opportunity for Linux Mint developers to control the environment they maintain. The Mint desktop is very much a Linux Mint creation, so much so that it's almost a part of the Mint brand. And yet it's appealing enough for enough users that it's available on [other distributions][6], even ones traditionally seen as "rivals" (at least, insofar as there are rivalries in open source). Here's the Cinnamon desktop environment fitting in nicely with a Fedora install: - -![Cinnamon desktop on Fedora][7] - -The desktop experience, aside from its panel layout, is a simple and classic one. There are icons on the desktop serving as shortcuts to common locations, there's an application for most file-management tasks, and there are applets in the systems tray for common administrative tasks. It's a familiar user experience. Just like its name, it's warm and inviting and cozy. - -### Customizing the desktop - -Cinnamon isn't as flexible as something like Fluxbox or KDE, but it's not as rigid as GNOME 3 or Pantheon. The System Settings application provides customization for all the usual small details, such as keyboard layout, keyboard shortcuts, workspace behavior, a firewall, and so on. A right-click on any element usually brings up a useful contextual menu with settings or information about what you've clicked. - -There are definitely some expectations about what your workflow ought to be when using Cinnamon, but these assumptions are all generic and safe. It may not be the most efficient desktop environment, but it's soundly a generic, all-purpose one. Both power users and new users feel at home in Cinnamon. You can customize the experience within certain parameters, and if you hit the ceiling when you try to make drastic changes, then you can fall back on the fact that this is open source, and you have plenty of other options. - -You may never hit that ceiling, though. Cinnamon's an attractive and responsive interface. It's a pleasure to use because it's simple and intuitive, with no surprises or puzzling user-interface choices to slow you down. With a few custom keyboard shortcuts and a little time to settle into a new environment, you can do amazing things with Cinnamon, and you'll love every moment of it because it's a beautiful thing to witness. Cinnamon is restrained with animations and effects, and the ones it uses are appealing and even informative. - -### Spice of life - -It's fun to try new desktops, and Cinnamon is worth trying. Install or download it today and see what you think. It's one of those desktops that you already know how to use, even if you've never used it before. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/cinnamon-linux-desktop - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/cinnamon.jpg?itok=4GV-boum (Cinnamon) -[2]: https://www.linuxmint.com/ -[3]: https://github.com/linuxmint/Cinnamon -[4]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization -[5]: https://opensource.com/sites/default/files/uploads/advent-cinnamon.jpg (Cinnamon desktop on Linux Mint) -[6]: https://en.wikipedia.org/wiki/Cinnamon_(desktop_environment)#Adoption -[7]: https://opensource.com/sites/default/files/uploads/advent-cinnamon-fedora.jpg (Cinnamon desktop on Fedora) diff --git a/sources/tech/20191205 Challenge- find Twitter memes with suffix arrays.md b/sources/tech/20191205 Challenge- find Twitter memes with suffix arrays.md deleted file mode 100644 index c767c9f1ed..0000000000 --- a/sources/tech/20191205 Challenge- find Twitter memes with suffix arrays.md +++ /dev/null @@ -1,220 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Challenge: find Twitter memes with suffix arrays) -[#]: via: (https://jvns.ca/blog/twitter-memes-challenge/) -[#]: author: (Julia Evans https://jvns.ca/) - -Challenge: find Twitter memes with suffix arrays -====== - -This challenge is a mix of data analysis and using fun algorithms! It’s the second challenge in a a short series of programming challenge I’m writing with Julian. (the [first one was to write a tiny fun window manager][1]) - -Twitter has a lot of memes. For example, if you search Twitter for [Flight attendant: is there a doctor on this flight?][2], you’ll find a bunch of tweets making jokes like this: - -``` -Flight Attendant: is there a doctor on board? -Parent: *nudging* That should've been you -Me: Not now, this is serious -Parent: Not asking for a hacker to help, are they? -Me: AAAAAAAA\x00\xd0X?\xfc\x7fBBBBj\x0bX\x99Rfh-p\x89\xe1Rjhh/bash/bin\x89\xe3RQS\x89\xe1\xcd\x80 -Parent:~# -``` - -or if you search [as a kpop fan][3] there are thousands of these: - -``` -me as a kpop fan - -- kpop fan age: 10 years -- first group ever stan: super junior -- current ult groups: iKON, X1, Day6 -- number of albums: >20 -- concerts attended: 6 -- lightsticks owned: 2 -``` - -So! Suppose you have a million tweets from the last 2 days. How do you find the jokes / quizzes / memes people are playing with on Twitter? - -### Challenge: find the twitter memes in 1 million tweets - -This is a pretty open ended challenge and you can do it any way you want. Here’s a [SQLite database with 1.2 million tweets][4], collected from the [twitter streaming api][5] over 2 days. It’s 250MB (70MB compressed), it only has English tweets. It excludes retweets and many tweets that are generated by bots. - -The challenge: find at least 5 Twitter memes using that dataset. - -### memes as common substrings - -The idea here is that memes are substrings like “me as a kpop fan” that many different people are using. The tricky thing is that you don’t really know how long those substrings will be, and maybe you’re interested in phrases of different lengths. - -You can probably do this challenge without using anything fancy (with a hashmap of phrases or something) but I think it’s a nice opportunity to play with a fun data structure: suffix arrays! So let’s talk about what those are. - -### suffix arrays: sort all suffixes - -Suffix arrays sort all suffixes of a string. For example, here’s the suffix array for “plantain” which has the suffixes plantain, lantain, antain, ntain, tain, ain, in, n. - -``` -ain -antain -in -lantain -n -ntain -plantain -tain -``` - -Representing this as a list of strings would be very inefficient (quadratic space), so instead we replace each suffix with the index of its first character in the original string – `[5,2,6,1,7,3,0,4]`. - -``` -5 (ain) -2 (antain) -6 (in) -1 (lantain) -7 (n) -3 (ntain) -0 (plantain) -4 (tain) -``` - -Here’s a real example of what a suffix array of 1 million tweets concatenated looks like. This is an excerpt from the middle of the suffix array, with some of the suffixes that start with `A little`. - -``` -... - A little distracted for a bit ...what do i do w my life hon......... - A little exercise I did this afternoon. #comics #art #clip......... - A little extra Christmas Cash on me! Good Luck to everyone!......... - A little girl in Savannah, Ga., appears to be the 38th huma......... - A little heavy on the smut t… https://t.co/nvoxE7SNjTI wa......... - A little in state battle tonight. #nova vs #penn. two very ......... - A little kiss...” one more time I’m going to vomit. #TT......... - A little late catching up on last nights @GoodDoctorABC. On......... - A little less bling never hurt anyone! Next project...🎄 ......... - A little more intensity to augment their talent and a coupl......... - A little more time, because I have never lived really - Os......... - A little mor… https://t.co/kcq3zf9jgeWe love MX ❤️<9F>......... - A little over 50k! Can We Guess How Much Is In Your Account......... - A little ray of joy & light in the midst of these very ......... - A little refreshment… https://t.co/HgX8PmYwPIThank you @L......... - A little respect goes a long way. ......... - A little salt in d country's troubled legal system“Grant................ - A little snow & people lose all common senseromantic st............... - A little sun for the soul @realfreewebcams https://t.co/3CB............... - A little sunkissed moment for y’all. ............... - .... -``` - -Again, this is actually represented by a bunch of integer indexes into a concatenated string of all the tweets, like `[18238223, 1921812, ...]` so it’s a LOT more memory efficient than actually repeating all those strings. - -### suffix arrays let you find common substrings! - -So what does this have to do with Twitter memes? Well, we can basically - - 1. concatenate all tweets into a big string - 2. make a suffix array of that string - 3. iterate through the suffix array and notice when you see a lot of repeated substrings, like here: - - - -``` -me as a kpop fan ✨kpop fan age: 15 y/o ✨first group ever stan: blackpink ✨current ult groups: btxt ✨number of albu… https://t.co/24diHX9sLm -me as a kpop fan ⭐k-pop fan age: 12 y/o ⭐first group ever stan: bts ⭐current ult gps: bts and txt ⭐number of albu… https://t.co/8R95roQXoE -me as a kpop fan ⭐k-pop fan age: 14 y/o ⭐first group ever stan: girls generation ⭐current ult gp: txt ⭐number of a… https://t.co/010hLuJscF -me as a kpop fan ⭐k-pop fan age: 14-16 y/o ⭐first group ever stan: bts ⭐current ult gps: bts txt ⭐number of albums… https://t.co/0fDcxZGRrh -me as a kpop fan ⭐k-pop fan age: 15 y/o ⭐first group ever stan: blackpink ⭐current ult gps: txt ⭐number of albums… https://t.co/d8zZL83TvV -me as a kpop fan 🌸 k-pop fan age: 12 years old 🌸 first group ever stan: bts 🌸 current ult gps: bts & wanna one 🌸 n… https://t.co/22R1nJpwNX -me as a kpop fan 🌸k-pop fan age: 10 🌸first group ever stan: 2pm 🌸current ult gps: skz,got7,itzy,twice, 🌸number of… https://t.co/mAluaP2yxH -me as a kpop fan 🌸k-pop fan age: 11 yo 🌸first group ever stan: beast 🌸current ult gps: ateez 🌸number of albums: 1… https://t.co/qxtFHG9HDg -me as a kpop fan 🌸k-pop fan age: 11 🌸first group ever stan: bts 🌸current ult gps: bts and ateez 🌸number of albums:… https://t.co/mKXlkrBBtC -me as a kpop fan 🌸k-pop fan age: 13 (now im 19) 🌸first group ever stan: snsd 🌸current ult gps: nct day6 aoa mamam… https://t.co/8XyQ3r5hwz -me as a kpop fan 🌸k-pop fan age: 13 years 🌸first group ever stan: 2pm,suju,bigbang 🌸current ult gps: bts,tbz,ateez… https://t.co/Zs1nQQz6Lt -me as a kpop fan 🌸k-pop fan age: 14 (2005) 🌸first group ever stan: super junior 🌸current ult gps: exo, gfriend, rv… https://t.co/vgmhe2vFMY -me as a kpop fan 🌸k-pop fan age: 14 y/o 🌸first group ever stan: nct dream 🌸current ult gps: svt and,,*insert stan… https://t.co/I38Ui69PvL -me as a kpop fan 🌸k-pop fan age: 15 y/o 🌸first group ever stan: 5sos 🌸current ult gps: bts and 5sos also some ggs… https://t.co/61ZmRkzmdl -me as a kpop fan 🌸k-pop fan age: 15 y/o 🌸first group ever stan: bts 🌸current ult gps: SVT, GOT7, Day6 🌸number of… https://t.co/16SWb3mSPg -me as a kpop fan 🌸k-pop fan age: 18 🌸first group ever stan: suju & soshi 🌸current ult gps: snsd & izone 🌸number of… https://t.co/SmSBFqJnGk -me as a kpop fan 🌸k-pop fan age: 19 y/o marupok 🌸first group ever stan: APINK 🌸current ult gps: SEVENTEEN 🌸number… https://t.co/StYjxr6uq9 -me as a kpop fan 🌸k-pop fan age: 19 🌸first group ever stan: SuJu 🌸current ult gps: SuJu, SF9, SKZ, VIXX, ONEUS, NO… https://t.co/2o2DulCY5b -``` - -### suffix arrays also enable really fast search - -As an aside, the reason I got interested in suffix arrays in the first place was actually not for finding Twitter memes at all but for search. - -I’ve spent a lot of time using Nelson Elhage’s [livegrep][6] at work to search code. It creates a suffix array using the divsufsort library. He has a blog post [Regular Expression Search with Suffix Arrays][7] where he talks about some of the implementation details. - -The reason suffix arrays work for fast search is basically that if you’re looking for the string `A little`, you can do a binary search over the suffix array to find every instance of `A little` in your dataset. Binary searches are extremely fast so every search is guaranteed to run very quickly (in less than a microsecond I believe). What livegrep does is more complicated than that because it does a regular expression search, but that’s the idea to start. - -There’s another blog post [How to use suffix arrays to combat common limitations of full-text search][8] applying suffix arrays to searching through a patent database. In that example, like with code search, the patent officers want to search patents for exact strings. - -### How do you make a suffix array? - -You can use an existing suffix array library, for example [index/suffixarray in Go][9], which is what I used, or [divsufsort][10]. There are [Python bindings for divsufsort][11]. - -If you’re more excited about the data structures/algorithms aspect of suffix arrays you can also implement a suffix array-building algorithm yourself! I did not do this but you can see an implementation of [qsufsort here in Go][12]. That implementation links to a paper. There are lots of algorithms for constructing suffix arrays –`sais` and `divsufsort` are a couple of others. - -### 5 or so hours, 100 lines of Go - -As always with these challenges, I did this one to make sure that it’s both doable in a reasonable amount of time and fun for at least one person (me). - -I did this one in about 5 hours and 100 lines of Go using the suffixarray implementation in the Go standard library, with a bit of bash shell scripting to postprocess the results. This is a messy data analysis challenge – as an example of a messy thing, Spotify released their end-of-2019 results while I was building the dataset and so there are a lot of tweets generated by the Spotify app. - -My results ended up looking something like this: - -``` -5 an Aries and that’s why I gotta -5 an Aries and that’s why I am so -5 an Aquarius and that’s why I -5 AM SO PROUD OF YOU -5 am not a fan of -5 am I the only one who -5 am going to have to -``` - -Then I sifted through them pretty manually to find the Twitter memes. - -### suffix arrays are used in bioinformatics - -This “find twitter memes using suffix arrays” approach is a silly thing but it does have some relationship to reality – DNA sequences are basically really long strings, and biologists need to find patterns in them, and they sometimes use suffix arrays to do it. - -I looked up [packages in Debian that use libdivsufsort][13] and I found [infernal][14]: - -> Infernal (“INFERence of RNA ALignment”) is for searching DNA sequence databases for RNA structure and sequence similarities. It is an implementation of a special case of profile stochastic context-free grammars called covariance models (CMs). A CM is like a sequence profile, but it scores a combination of sequence consensus and RNA secondary structure consensus, so in many cases, it is more capable of identifying RNA homologs that conserve their secondary structure more than their primary sequence. - -### email me the twitter memes you find if you do this! - -If you do this exercise, I’d love it if you emailed me ([[email protected]][15]) with the twitter memes you found and/or your code! I found about 8 but I’m sure there are more. - -I’ll publish any solutions I get (unless you don’t want me to publish your solution – just let me know!). - -Thanks to Julian for discussing suffix arrays and suffix trees and trigram indexes with me at length, and to Kamal who had the idea of using suffix arrays to find Twitter memes. - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/twitter-memes-challenge/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://jvns.ca/blog/2019/11/25/challenge--make-a-bouncy-window-manager/ -[2]: https://twitter.com/search?q=%22attendant%3A%20is%20there%20a%20doctor%20on%20%22&src=typed_query&f=live -[3]: https://twitter.com/search?q=%22as%20a%20kpop%20fan%22&src=typed_query -[4]: https://www.dropbox.com/s/5xnaf1mbdr1424p/twitter.db.gz?dl=0 -[5]: https://developer.twitter.com/en/docs/tutorials/consuming-streaming-data -[6]: https://livegrep.com/search/linux -[7]: https://blog.nelhage.com/2015/02/regular-expression-search-with-suffix-arrays/ -[8]: https://blog.griddynamics.com/using-suffix-arrays-to-fix-limitations-of-full-text-search/ -[9]: https://golang.org/pkg/index/suffixarray/ -[10]: https://github.com/y-256/libdivsufsort -[11]: https://github.com/debatem1/pydivsufsort -[12]: https://github.com/golang/go/blob/release-branch.go1.12/src/index/suffixarray/qsufsort.go -[13]: https://codesearch.debian.net/search?q=divsufsort -[14]: http://eddylab.org/infernal/ -[15]: https://jvns.ca/cdn-cgi/l/email-protection diff --git a/sources/tech/20191206 A beginner-s guide to using Vagrant.md b/sources/tech/20191206 A beginner-s guide to using Vagrant.md deleted file mode 100644 index a96389215c..0000000000 --- a/sources/tech/20191206 A beginner-s guide to using Vagrant.md +++ /dev/null @@ -1,219 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (A beginner's guide to using Vagrant) -[#]: via: (https://opensource.com/article/19/12/beginner-vagrant) -[#]: author: (Jessica Repka https://opensource.com/users/jrepka) - -A beginner's guide to using Vagrant -====== -This easy "hello world" tutorial makes it easy to start using Vagrant -for virtual machine management. -![A person programming][1] - -Vagrant [describes itself][2] as "a tool for building and managing virtual machine environments in a single workflow. With an easy-to-use workflow and focus on automation, Vagrant lowers development environment setup time, increases production parity, and makes the 'works on my machine' excuse a relic of the past." - -Vagrant works with a standard format for documenting an environment, called a Vagrantfile. [According to Vagrant's website][3]: - -> "The primary function of the Vagrantfile is to describe the type of machine required for a project, and how to configure and provision these machines. Vagrantfiles are called Vagrantfiles because the actual literal filename for the file is **Vagrantfile** (casing does not matter unless your file system is running in a strict case sensitive mode)." - -Vagrant is essentially a wrapper to allow for repeatable virtual machine management, but it does not run VMs itself. This tutorial will use [VirtualBox][4] as that environment manager, though Hyper-V and Docker also work by default. Check out Vagrant's documentation to [learn how to use a different provider][5] for this tutorial. - -### Build a Vagrantfile - -This tutorial works through an example application for a simple Hello World page inside a Ruby on Rails (Rails for short) web app. Before you begin, install the following (if you haven't already): - - * [Vagrant][6] - * [VirtualBox][7] - * [Ruby on Rails][8] - * An editing environment, like [Atom][9] or [Notepad++][10] - - - -If you're on Fedora and prefer using the command line, there is an [excellent Fedora tutorial][11], and there's a similarly helpful tutorial for [Windows using Chocolatey][12]. After everything is installed, open your terminal and create a new directory to work in. You can put your directory wherever you like; I prefer to use a folder under my user account: - - -``` -$ mkdir -p ~/Development/Rails_app -$ cd ~/Development/Rails_app -$ vagrant init - -A `Vagrantfile` has been placed in this directory. You are now -ready to `vagrant up` your first virtual environment! Please read -the comments in the Vagrantfile as well as documentation on -`vagrantup.com` for more information on using Vagrant. -``` - -This creates a Vagrantfile with the default configuration information written in Ruby syntax. Look at line 15: - - -``` -`config.vm.box = "base"` -``` - -This indicates that Vagrant will use a default operating system image it hosts called **base**, which you don't have yet. Confirm that by running **box list**: - - -``` -$ vagrant box list - -There are no installed boxes! Use `vagrant box add` to add some. -``` - -If you try to start your environment using the **up** command, it will fail, because Vagrant expects an OS called **base** to exist locally. Switch to the most commonly used environment, **bento/ubuntu-16.04**, then try to spin up your environment. Change the **config.vm.box** line in your Vagrantfile to: - - -``` -`config.vm.box = "centos/7"` -``` - -And now you can run the most satisfying command in virtual machine history: - - -``` -$ vagrant up -Bringing machine 'default' up with 'libvirt' provider... -==> default: Box 'centos/7' could not be found. Attempting to find and install... -    default: Box Provider: libvirt -    default: Box Version: >= 0 -==> default: Loading metadata for box 'centos/7' -    default: URL: -==> default: Adding box 'centos/7' (v1905.1) for provider: libvirt -    default: Downloading: -    default: Download redirected to host: cloud.centos.org -... -``` - -Here is why this is so nice. This tutorial sets up a small website, but if you had a larger website and needed to check whether the frontend looks right, your playbook file and copy-over files would allow you to see your changes. If you have small applications you want to test quickly—without doing an entire Docker image build or logging into a server—this local testing is good for quick checks and repairs. If you're working within hardware, this will make it easy to see if the application will work within your operating system, and it allows you to know which dependencies you need. In the end, it makes for easier deployment and faster testing than doing a from-scratch continuous integration and deployment (CI/CD) to a test server, and it provides quicker access and more control. - -The reason this is so cool can be explained in one simple sentence: You now have local automation. It also allows you to gather a larger breadth of knowledge behind [Ansible][13] and headless server deployments. - -### Verify Vagrant worked correctly - -One way to determine whether this finished properly is seeing a bunch of green text and the words **rails server -h** for startup options. This means the web app has started and is running. - -![Verifying with the vagrant status command][14] - -But you want to use **vagrant global-status** as well as **vagrant status**. - -![Verifying with the vagrant global-status command][15] - -The **vagrant status** command checks the machine states that originate in the current directory. So, if you have a VM up and running, it will show as up and running. If it is broken in any way, it will display a message with an error and some logs when you run **vagrant up**. If some machines are down, they will also show as not running or shut down. - -However, the **vagrant global-status** command can give the status of multiple environments created in Vagrant. So, if you split the environments for different VM types or storage types, this command gives you an option to see everything in all the environments you've created. - -### Customize the Vagrant configuration - -The machine settings have multiple [config.vm][16] options. This tutorial will use the networking option to allow port forwarding. Port forwarding allows you to access a network port in our virtual environment as if it was a local port via a special local network. This means traffic is allowed to see the one thing you allow on this server; in this case, it's a tiny frontend webpage. - -The main reason this matters is for security. Limiting traffic can prevent bad actors and traffic overflow. The way this is built, you can't log into this server unless you configure it as such. This also means no one else can SSH in or see anything except the one little frontend webpage. - -Before moving on, remove the VM so you can start over by running [**vagrant destroy**][17]: - - -``` -$ vagrant destroy -    default: Are you sure you want to destroy the 'default' VM? [y/N] y -==> default: Removing domain... -``` - -To include port forwarding, add this in the next config line: - - -``` - Vagrant.configure("2") do |config| -  config.vm.box = "bento/ubuntu-16.04" -  config.vm.network "forwarded_port", guest: 3000, host: 9090 -  end -``` - -Save the file and run: - - -``` -`vagrant up` -``` - -You now have a VM that forwards port **3000** out to the open world as **9090**. You should now be able to go to **127.0.0.1:9090** on your web browser and see nothing but a plain white page. - -Run **vagrant destroy** again to remove the VM so you can start over. - -### Provision Vagrant with Ansible and scripts - -While base boxes offer a good starting point, it's common to customize a VM during the provisioning process, and you can use multiple provisioning tactics. To follow along, [download the playbook and script][18]. - -This example uses Ansible to set up a basic install of the Ruby on Rails web framework. Then, it adds an extra shell script to configure the web app's welcome page to say: _Hello World, Sorry for the Delay_. (The purpose of this message is because this build takes a long time and people may become frustrated by the delay.) - -The following Vagrantfile reflects Ansible and a playbook running locally on my machine, so it will differ from yours. You can read about [using Ansible with Vagrant][19] in Vagrant's docs. - - -``` -Vagrant.configure("2") do |config| - config.vm.box = "bento/ubuntu-16.04" -  config.vm.network "forwarded_port", guest: 3000, host: 9090 -  ####### Provision ####### -  config.vm.provision "ansible_local" do |ansible| -   ansible.playbook = "prov/playbook.yml" -    ansible.verbose = true -  config.vm.provision "shell", path: "script.sh" -  end -end -``` - -After saving the file, run my favorite command: - - -``` -`vagrant up` -``` - -You now have a VM up and running with Rails, and when you enter **127.0.0.1:9090** in your web browser, you see a webpage that says: _Hello World, Sorry for the Delay_. - -Now that you have all this background, you can try to [build your own script][20]. - -### Final notes - -Vagrant is fairly easy to work with and has abundant [documentation][21] to help you along the way. It's is a great tool if you're looking to work with code in a small staging or development environment; any destruction is a non-issue because the environment itself is disposable. - -Want to give it a try? Take a look at my [repo][18]. - -In this short video, Daniel Farrell tells us about Vagrant, a tool for working with Virtual... - -Learn how Vagrant and Ansible can be used to provision virtual machines for web development. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/beginner-vagrant - -作者:[Jessica Repka][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb (A person programming) -[2]: https://www.vagrantup.com/intro/index.html -[3]: https://www.vagrantup.com/docs/vagrantfile/ -[4]: https://www.virtualbox.org/browser/vbox/trunk -[5]: https://www.vagrantup.com/docs/providers/basic_usage.html -[6]: https://www.vagrantup.com/docs/installation/ -[7]: https://www.virtualbox.org/wiki/Downloads -[8]: http://installrails.com/steps/choose_os -[9]: https://atom.io/ -[10]: https://notepad-plus-plus.org/downloads/ -[11]: https://computingforgeeks.com/how-to-install-vagrant-and-virtualbox-on-fedora/ -[12]: https://codingbee.net/vagrant/vagrant-installing-vagrant-on-windows -[13]: https://www.ansible.com/ -[14]: https://opensource.com/sites/default/files/uploads/vagrant1_vagrant-status.png (Verifying with the vagrant status command) -[15]: https://opensource.com/sites/default/files/uploads/vagrant2_vagrant-global-status.png (Verifying with the vagrant global-status command) -[16]: https://www.vagrantup.com/docs/vagrantfile/machine_settings.html -[17]: https://www.vagrantup.com/docs/cli/destroy.html -[18]: https://github.com/Alynder/vagrant_adwx -[19]: https://www.vagrantup.com/docs/provisioning/ansible.html -[20]: https://www.bogotobogo.com/RubyOnRails/RubyOnRails_HelloWorld_Rails.php -[21]: https://www.vagrantup.com/docs/index.html diff --git a/sources/tech/20191208 8 Best Open Source Accounting Software.md b/sources/tech/20191208 8 Best Open Source Accounting Software.md deleted file mode 100644 index 3639504902..0000000000 --- a/sources/tech/20191208 8 Best Open Source Accounting Software.md +++ /dev/null @@ -1,199 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (8 Best Open Source Accounting Software) -[#]: via: (https://itsfoss.com/open-source-accounting-software/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -8 Best Open Source Accounting Software -====== - -Accounting software is a necessity when it comes to managing billings, debts, stocks, invoices and any other kind of financial transactions. You might require something for your personal finances or perhaps for enterprise-focused accounting software. No matter what, it is important to consider open source solutions available (especially being Linux enthusiasts). - -So, in this article, I list out some of the best open source accounting software that I think would come in handy for you. At the end of the list, feel free to suggest your favorite ones in the comments. - -### Best Open Source Accounting Software - -**Note:** _The list is in no particular order of ranking._ - -#### 1\. Skrooge - -![][1] - -Key Highlights: - - * Personal finances manager - * Tailored for Plasma Desktop but compatible with others too - * Cross-platform (Windows, Linux, and macOS) - - - -Skrooge is one of the most useful personal finances manager by KDE. It is originally tailored for the Plasma Desktop but other desktop environments are compatible. - -Supports most of the basic features (reporting, budgeting, etc.) and allows you to work on some pretty big data sets. - -[Skrooge][2] - -#### 2\. Akaunting - -![][3] - -Key Highlights: - - * Online accounting software - * Completely free and open source - * Client portal - * Invoicing - * Expense tracking - * Reporting - * Cashflow - - - -Akaunting is an interesting online accounting software that’s available for free. Yes, surprisingly, there’s no hidden subscription charges or additional upgrade options. It is totally free. If you are looking for a FreshBooks alternative, you should give it a try. - -Ranging from invoicing to managing deposits and transfers. A whole lot of features. You can either utilize their hosting (again, it is free!) or host it yourself. It’s fit for both personal and enterprise needs. Try it out! - -[Akaunting][4] - -#### 3\. Apache OFBiz - -![][5] - -Key Highlights: - - * ERP & CRM - * Developer-friendly - * Powerful Java Web Framework - * Cross-platform (Linux and macOS) - - - -We’ve already mentioned this in our list of [best open source CRM software][6]. Apache OFBiz is an impressive open source solution that incorporates an ERP system and a CRM suite for various types of requirements. - -It’s completely free – however, you will have to host it yourself (or just hire someone to do it). In addition to all the basic features needed for accounting software, it lets a developer extend/enhance features easily while being a Java-based web framework. - -[Apache OFBiz][7] - -#### 4\. iDempiere - -![][8] - -Key Highlights: - - * Community-focused - * Simple and useful - * Cross-platform (Linux and Windows) - - - -Originally based on ADEmpiere ERP. It is a community focused accounting software maintained by an active group of people. iDempiere aims to utilize technologies like [Apache Maven][9] to provide a business suite ERP/CRM/SCM. - -There’s a ready-to-use Virtual machine available to download. In addition, you can utilize it on Windows or Linux. - -[iDempiere][10] - -#### 5\. Openmiracle - -![Openmiracle][11] - -Key Highlights: - - * Plug-ins available - * Completely free - - - -Openmiracle is a quite popular open source and free accounting software. There’s no premium plans to it. So, you can utilize all the power and flexibility for free. - -It features all the necessary options needed in an accounting software. From setting the budget to managing the payroll, there’s a lot of things to explore. - -[Openmiracle][12] - -#### 6\. GnuCash - -![][13] - -Key Highlights: - - * Cross-platform (Linux, Windows, and macOS) - * Fit for personal and small businesses - - - -GNUCash is a great open-source financial accounting software to manage stocks/income/expenses for small business or individuals. - -From reports to quick calculation features, it has a lot to offer. And, the best thing is – it is available across multiple platforms (including Linux), so that’s a plus. - -[GNUCash][14] - -#### 7\. LedgerSMB - -![Ledgersmb Screenshot][15] - -Key Highlights: - - * Dead simple open source ERP - * Optional commercial support available - * Cross-platform (Windows, Linux, and macOS) - - - -A powerful yet simple open source accounting solution. It has been tailored to small and medium sized businesses. Starting from managing invoices to inventory – you also get the ability to translate (up to 45 languages supported). You can try pre-release version or just get the latest stable build to test it out yourself! - -[LedgerSMB][16] - -#### 8\. GNUKhata - -Key Highlights: - - * GST, VAT compliant Invoices if you are based in India (tailored for Indian users) - * Easy to use - * Simple user interface - * Cross-platform (Windows and Linux) - - - -We already covered an article on [GNUKhata][17], if you want to dive into the details. - -However, it is a simple and robust accounting software that is available for free. From the looks of it, the setup is easy and anyone can get used to it. Feel free to try it out and explore. - -[GNUKhata][18] - -**Wrapping Up** - -These are our recommended picks for an open source accounting software. If we missed listing your favorite open-source accounting software, let us in the comments below. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/open-source-accounting-software/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/2019/09/skrooge.jpg?ssl=1 -[2]: https://skrooge.org/ -[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/akaunting.jpg?ssl=1 -[4]: https://akaunting.com/ -[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/07/apache-ofbiz.jpg?ssl=1 -[6]: https://itsfoss.com/best-open-source-crm/ -[7]: https://ofbiz.apache.org/ -[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/idempiere.jpg?ssl=1 -[9]: https://en.wikipedia.org/wiki/Apache_Maven -[10]: https://www.idempiere.org/home -[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/openmiracle.jpg?ssl=1 -[12]: http://www.openmiracle.com/ -[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/gnucash-screenshot.png?ssl=1 -[14]: https://www.gnucash.org/ -[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/ledgerSMB-screenshot.jpg?ssl=1 -[16]: https://ledgersmb.org/ -[17]: https://itsfoss.com/using-gnu-khata/ -[18]: https://gnukhata.in/ diff --git a/sources/tech/20191208 Dynamically scoped variables in Go.md b/sources/tech/20191208 Dynamically scoped variables in Go.md deleted file mode 100644 index 959799f89e..0000000000 --- a/sources/tech/20191208 Dynamically scoped variables in Go.md +++ /dev/null @@ -1,200 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Dynamically scoped variables in Go) -[#]: via: (https://dave.cheney.net/2019/12/08/dynamically-scoped-variables-in-go) -[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) - -Dynamically scoped variables in Go -====== - -This is a thought experiment in API design. It starts with the classic Go unit testing idiom: - -``` -func TestOpenFile(t *testing.T) { - f, err := os.Open("notfound") - if err != nil { - t.Fatal(err) - } - - // ... -} -``` - -What’s the problem with this code? The assertion. `if err != nil { ... }` is repetitive and in the case where multiple conditions need to be checked, somewhat error prone if the author of the test uses `t.Error` not `t.Fatal`, eg: - -``` -f, err := os.Open("notfound") -if err != nil { - t.Error(err) -} -f.Close() // boom! -``` - -What’s the solution? DRY it up, of course, by moving the repetitive assertion logic to a helper: - -``` -func TestOpenFile(t *testing.T) { -       f, err := os.Open("notfound") -       check(t, err) - -       // ... -} - -func check(t *testing.T, err error) { -       if err != nil { -                t.Helper() -               t.Fatal(err) -        } -} -``` - -Using the `check` helper the code is a little cleaner, and clearer, _check the error_, and hopefully the indecision between `t.Error` and `t.Fatal` has been solved. The downside of abstracting the assertion to a helper function is now you need to pass a `testing.T` into _each and every invocation_. Worse, you need to pass a `*testing.T` to everything that needs to call `check`, transitively, just in case. - -This is ok, I guess, but I will make the observation that the `t` variable is only needed _when the assertion fails_ — and even in a testing scenario, most of the time, most of the tests pass, so that means reading, and writing, all these `t`‘s is a constant overhead for the relatively rare occasion that a test fails. - -What about if we did something like this instead? - -``` -func TestOpenFile(t *testing.T) { -       f, err := os.Open("notfound") -        check(err) - -       // ... -} - -func check(err error) { -        if err != nil { -                panic(err.Error()) -        } -} -``` - -Yeah, that’ll work, but it has a few problems - -``` -% go test ---- FAIL: TestOpenFile (0.00s) -panic: open notfound: no such file or directory [recovered] -        panic: open notfound: no such file or directory - -goroutine 22 [running]: -testing.tRunner.func1(0xc0000b4400) -        /Users/dfc/go/src/testing/testing.go:874 +0x3a3 -panic(0x111b040, 0xc0000866f0) -        /Users/dfc/go/src/runtime/panic.go:679 +0x1b2 -github.com/pkg/expect_test.check(...) -        /Users/dfc/src/github.com/pkg/expect/expect_test.go:18 -github.com/pkg/expect_test.TestOpenFile(0xc0000b4400) -        /Users/dfc/src/github.com/pkg/expect/expect_test.go:10 +0xa1 -testing.tRunner(0xc0000b4400, 0x115ac90) -        /Users/dfc/go/src/testing/testing.go:909 +0xc9 -created by testing.(*T).Run -        /Users/dfc/go/src/testing/testing.go:960 +0x350 -exit status 2 -``` - -Let’s start with the good; we didn’t have to pass a `testing.T` every place we call `check`, the test fails immediately, and we get a nice message in the panic — albeit twice. But _where_ the assertion failed is hard to see. It occurred on `expect_test.go:11` but you’d be forgiven for not knowing that. - -So `panic` isn’t really a good solution, but there’s something in this stack trace that is — can you see it? Here’s a hint, `github.com/pkg/expect_test.TestOpenFile(0xc0000b4400)`. - -`TestOpenFile` has a `t` value, it was passed to it by `tRunner`, so there’s a `testing.T` in memory at address `0xc0000b4400`. What if we could get access to that `t` inside `check`? Then we could use it to call `t.Helper` and `t.Fatal`. Is that possible? - -### Dynamic scoping - -What we want is to be able to access a variable whose declaration is neither global, or local to the function, but somewhere higher in the call stack. This is called _dynamic scoping_. Go doesn’t support dynamic scoping, but it turns out, for restricted cases, we can fake it. I’ll skip to the chase: - -``` -// getT returns the address of the testing.T passed to testing.tRunner -// which called the function which called getT. If testing.tRunner cannot -// be located in the stack, say if getT is not called from the main test -// goroutine, getT returns nil. -func getT() *testing.T { -        var buf [8192]byte -        n := runtime.Stack(buf[:], false) -        sc := bufio.NewScanner(bytes.NewReader(buf[:n])) -        for sc.Scan() { -                var p uintptr -                n, _ := fmt.Sscanf(sc.Text(), "testing.tRunner(%v", &p) -                if n != 1 { -                        continue -                } -                return (*testing.T)(unsafe.Pointer(p)) -        } -        return nil -} -``` - -We know that each `Test` is called by the `testing` package in its own goroutine (see the stack trace above). The `testing` package launches the test via a function called `tRunner` which takes a `*testing.T` and a `func(*testing.T)` to invoke. Thus we grab a stack trace of the current goroutine, scan through it for the line beginning with `testing.tRunner` — which can only be the `testing` package as `tRunner` is a private function — and parse the address of the first parameter, which is a pointer to a `testing.T`. With a little `unsafe` we convert the raw pointer back to a `*testing.T` and we’re done. - -If the search fails then it is likely that `getT` wasn’t called from a `Test`. This is actually ok because the reason we needed the `*testing.T` was to call `t.Fatal` and the testing package already requires that `t.Fatal` be called from the [main test goroutine][1]. - -``` -import "github.com/pkg/expect" - -func TestOpenFile(t *testing.T) { -        f, err := os.Open("notfound") -        expect.Nil(err) - -        // ... -} -``` - -Putting it all together we’ve eliminated the assertion boilerplate and possibly made the expectation of the test a little clearer to read, _after opening the file `err` is expected to be nil_. - -### Is this fine? - -At this point you should be asking, _is this fine?_ And the answer is, no, this is not fine. You should be screaming internally at this point. But it’s probably worth introspecting those feelings of revulsion. - -Apart from the inherent fragility of scrobbling around in a goroutine’s call stack, there are some serious design issues: - - 1. The `expect.Nil`‘s behaviour now depends on _who called it_. Provided with the same arguments it may have different behaviour depending on where it appears in the call stack — this is unexpected. - 2. Taken to the extreme dynamic scoping effective brings into the scope of a single function all the variables passed into any function that preceded it. It is a side channel for passing data in to and out of functions that is not explicitly documented in function declaration. - - - -Ironically these are precisely the critiques I have of [`context.Context`][2]. I’ll leave it to you to decide if they are justified. - -### A final word - -This is a bad idea, no argument there. This is not a pattern you should ever use in production code. But, this isn’t production code, it’s a test, and perhaps there are different rules that apply to test code. After all, we use mocks, and stubs, and monkey patching, and type assertions, and reflection, and helper functions, and build flags, and global variables, all so we can test our code effectively. None of those, uh, _hacks_ will ever show up in the production code path, so is it really the end of the world? - -If you’ve read this far perhaps you’ll agree with me that as unconventional as this approach is, not having to pass a `*testing.T` into every function that could possibly need to assert something transitively, makes for clearer test code. - -So maybe, in this case, the ends do justify the means. - -* * * - -If you’re interested, I’ve put together a [small assertion library][3] using this pattern. _Caveat emptor_. - -#### Related posts: - - 1. [Go, without package scoped variables][4] - 2. [On declaring variables][5] - 3. [A whirlwind tour of Go’s runtime environment variables][6] - 4. [You shouldn’t name your variables after their types for the same reason you wouldn’t name your pets “dog” or “cat”][7] - - - --------------------------------------------------------------------------------- - -via: https://dave.cheney.net/2019/12/08/dynamically-scoped-variables-in-go - -作者:[Dave Cheney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://dave.cheney.net/author/davecheney -[b]: https://github.com/lujun9972 -[1]: https://golang.org/pkg/testing/#T.FailNow -[2]: https://dave.cheney.net/2017/01/26/context-is-for-cancelation -[3]: https://github.com/pkg/expect -[4]: https://dave.cheney.net/2017/06/11/go-without-package-scoped-variables (Go, without package scoped variables) -[5]: https://dave.cheney.net/2014/05/24/on-declaring-variables (On declaring variables) -[6]: https://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables (A whirlwind tour of Go’s runtime environment variables) -[7]: https://dave.cheney.net/2019/01/29/you-shouldnt-name-your-variables-after-their-types-for-the-same-reason-you-wouldnt-name-your-pets-dog-or-cat (You shouldn’t name your variables after their types for the same reason you wouldn’t name your pets “dog” or “cat”) diff --git a/sources/tech/20191208 Why choose Xfce for your lightweight Linux desktop.md b/sources/tech/20191208 Why choose Xfce for your lightweight Linux desktop.md deleted file mode 100644 index cde1d600d7..0000000000 --- a/sources/tech/20191208 Why choose Xfce for your lightweight Linux desktop.md +++ /dev/null @@ -1,63 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why choose Xfce for your lightweight Linux desktop) -[#]: via: (https://opensource.com/article/19/12/xfce-linux-desktop) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Why choose Xfce for your lightweight Linux desktop -====== -This article is part of a special series of 24 days of Linux desktops. -Looking for for a lightweight Linux distribution with plenty of -features? The Xfce Linux desktop has been the standard for a long time. -![Woman sitting in front of her laptop][1] - -The [Xfce desktop][2] has a specific, self-stated goal: to be fast on a system with low resources while being visually appealing and user-friendly. It's been the de facto choice for lightweight Linux distributions (or remixes) for years and is often cited by its fans as a desktop that provides just enough to be useful, but never so much as to be a burden. - -You may find Xfce included in the software repository of your Linux distribution, or you can download and install a distribution that ships Xfce as an available desktop (like the Xfce [Mageia][3] or [Fedora][4] spins or [Slackware][5]). Before you install it, be aware that, while it's lightweight, it is intended to provide a full desktop experience, so many Xfce apps are installed along with the desktop. If you're already running a different desktop, you may find yourself with redundant applications (two PDF readers, two file managers, and so on). If you just want to try the Xfce desktop, you can install an Xfce-based distribution in a virtual machine, such as [GNOME Boxes][6]. - -### Xfce desktop tour - -True to the Unix philosophy, Xfce keeps its desktop modular. Many different components, such as the xfwm4 window manager, xfce4-panel, xfdesktop, Thunar, Xfconf, and so on, are bundled together to form the Xfce desktop environment. That may seem a pedantic way of defining a bunch of components that are always bundled together as a desktop, but in the case of Xfce, it's significant because these components truly are separate. You can run the Xfce panel over your Openbox or PekWM window manager, or use Xfce applets in your Fluxbox toolbar, and run Thunar as your file manager in Cinnamon or Pantheon. The possibilities are endless, but together they form the Xfce desktop. - -The design of the Xfce desktop is clean, direct, and true to its Unix origins. Xfce began as some desktop widgets written with the XForms framework, even before GNOME existed. It was based conceptually upon the CDE desktop, which was the ubiquitous desktop at the time. Neither CDE nor XForms were open source, but Xfce was distributed freely. Eventually, Xfce was rewritten using the open source GTK toolkit, was included in several distributions, became a popular CDE and GNOME alternative, and eventually became the dominant choice of "lightweight" distributions. - -Here's what it looked like on [Alan Formy-Duval's][7] desktop back in 2003: - -![XFCE in 2003][8] - -Xfce isn't necessarily a simple desktop: its application menu is in the upper-left corner (a tradition familiar to Linux users but probably foreign to newcomers), and it has a place for pinned application launchers, a system tray, virtual desktops, and a taskbar. It's a proper control panel for the GUI side of a Linux computer, with all the essential knobs and switches exposed for easy access. And it does all of that without making much of an impact on your system resources. - -![XFCE in 2019 on Mageia Linux][9] - -Significantly, Xfce uses GTK libraries to accomplish a lightweight desktop, and in doing so, it looks good, it looks familiar, and it can be themed to look really beautiful. The [Xfce screenshot forum][10] affords users the opportunity to show off their themes and configurations. - -### Using the Xfce desktop - -Xfce is an ideal desktop for a server or when you want quick access to important settings on a desktop that you rarely _look_ at. It's also ideal for Linux power users who want to adjust common settings quickly, but otherwise rarely deals with the GUI. Then again, it's a good-looking lightweight desktop, it can be themed easily, and it's got plenty of features. It may be the perfect desktop for you, no matter how you use your Linux computer. The only way to find out is to try! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/xfce-linux-desktop - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/OSDC_women_computing_4.png?itok=VGZO8CxT (Woman sitting in front of her laptop) -[2]: http://xfce.org -[3]: http://mageia.org -[4]: http://fedoraproject.org -[5]: http://slackware.com -[6]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization -[7]: https://opensource.com/users/alanfdoss -[8]: https://opensource.com/sites/default/files/advent-xfce-2003.jpg (XFCE in 2003) -[9]: https://opensource.com/sites/default/files/advent-xfce.jpg (XFCE on Mageia Linux in 2019) -[10]: https://forum.xfce.org/viewtopic.php?id=12676 diff --git a/sources/tech/20191210 App Highlight- Open Source Video Transcoder Handbrake.md b/sources/tech/20191210 App Highlight- Open Source Video Transcoder Handbrake.md deleted file mode 100644 index d6e239c3eb..0000000000 --- a/sources/tech/20191210 App Highlight- Open Source Video Transcoder Handbrake.md +++ /dev/null @@ -1,151 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (App Highlight: Open Source Video Transcoder Handbrake) -[#]: via: (https://itsfoss.com/handbrake/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -App Highlight: Open Source Video Transcoder Handbrake -====== - -_**Brief: HandBrake is a free and open-source video conversion tool that is quite useful. Let’s see what are its main features and how to use them for converting videos from one format to another.**_ - -### HandBrake: An Open Source Video Transcoder - -![][1] - -[HandBrake][2] is a quite useful tool which helps you to convert a video from one format to some of the widely supported codecs (**.mp4/.m4v/.mkv/.webm**) - -It can support any video format and help you convert it. In addition to that, you have several features on board to customize the video attributes while converting. - -If you are looking for a [Format Factory alternative][3], this is your best bet. - -I shall highlight the key features to help you know more. - -![HandBrake][4] - -### Features of HandBrake - -When you start using the video transcoder, you will find a lot of tiny features for video conversion. However, here, I’ll highlight the important things you need to know about HandBrake: - -#### Video Conversion Presets - -![HandBrake Presets][5] - -Suppose you want to convert a full HD video to play on a mobile which was originally tailored for desktop viewing, what do you do? - -Would you test various dimensions and convert them repeatedly to get the perfect mobile port? Or, would you rather prefer to have pre-defined settings for such conversions? - -If you opt for a preset, you just have to select the target device (or type of device) from the list of available presets. - -It even features presets for PS4 Pro (4K) and Discord. So, you can expect a big list of presets available. - -#### Input Sources Support - -Unless the file has some sort of copy protection, HandBrake can help you convert it. You will have no problems whatsoever even if you have an Ultra HD Blu-ray disc as the source with no copyright protection. - -All the available video encoding formats should work fine as an input source file. - -#### Basic Video Manipulation - -![HandBrake Screenshot][6] - -In addition to the ability of video conversion, it also lets you tweak the video to suit your requirements. - -You can change the dimensions, crop it, add a filter, change the frame rate settings, and a lot more things. - -If that wasn’t enough, you also get the ability to add subtitles and chapter markers. - -#### Live Video Preview - -This may not be a big deal to have – but I haven’t seen any video converter tool featuring video previews while being able to convert/tweak the video. It could come in handy for someone specific. - -### Installing HandBrake on Ubuntu and other Linux distributions - -HandBrake is a cross-platform application and you can install it on all different platforms like Linux, macOS and Windows. Just head over to heir website and download it from there. - -[Download HandBrake for any platform][7] - -On It’s FOSS, our focus is on Linux so I am going to show the steps to install it on Linux. - -**Installing HandBrake on Ubuntu** - -HandBrake is available in the [universe repository in Ubuntu][8]. If you have it enabled, you should find it in the software center. Just search for the name and install it from there. - -![HandBrake in Ubuntu Software Center][9] - -You can also use terminal for installing HandBrake with apt or [apt-get command][10]: - -``` -sudo apt-get install handbrake -``` - -However, the software center might feature the older version. If you want to install the latest version of HandBrake on Ubuntu and other Ubuntu-based distributions, you can [use its official PPA][11]. It’s better to uninstall any existing version of HandBrake beforehand. - -``` -sudo apt remove handbrake -sudo add-apt-repository ppa:stebbins/handbrake-releases -sudo apt update -sudo apt install handbrake-gtk -``` - -You can [learn more about using PPA here][12]. It will help you to [remove PPA][13], if you ever need to uninstall HandBrake installed via the PPA. - -If you want to install the CLI version of Handbrake, simply use this command: - -``` -sudo apt install handbrake-cli -``` - -Quite honestly, HandBrake should be used as a GUI application. If you want command line, you can always [use ffmpeg][14] that is more powerful and HandBrake uses it underneath anyways. - -**Installing HandBrake on other Linux distributions** - -HandBrake is one of the [popular Linux software][15] and it should be available in the official repositories of almost all Linux distributions. - -Just use the software center or package manager of your distribution to install HandBrake. - -But again, your distribution might not have the latest version of HandBrale. So, if you want the latest version installed, you can try installing the [Flatpak package][16] available. If you are not sure how to use Flatpak, refer to our guide on [using Flatpak on Linux][17]. - -[HandBrake][2] - -**Wrapping Up** - -A free and open-source video conversion tool that gets the job done. I’m quite satisfied with it personally. - -If you use HandBrake extensively, mention at least one feature that you like the most about it. - -If you use some other application for converting video formats, do share it with us in the comments. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/handbrake/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/12/handbrake_software_logo.png?ssl=1 -[2]: https://handbrake.fr/ -[3]: https://itsfoss.com/format-factory-alternative-linux/ -[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/11/handbrake.png?ssl=1 -[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/11/handbrake-presets.png?ssl=1 -[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/handbrake-screenshot.png?ssl=1 -[7]: https://handbrake.fr/downloads.php -[8]: https://itsfoss.com/ubuntu-repositories/ -[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/11/handbrake_ubuntu_software_center.png?ssl=1 -[10]: https://itsfoss.com/apt-get-linux-guide/ -[11]: https://launchpad.net/~stebbins/+archive/ubuntu/handbrake-releases -[12]: https://itsfoss.com/ppa-guide/ -[13]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ -[14]: https://itsfoss.com/ffmpeg/ -[15]: https://itsfoss.com/essential-linux-applications/ -[16]: https://flathub.org/apps/details/fr.handbrake.ghb -[17]: https://itsfoss.com/flatpak-guide/ diff --git a/sources/tech/20191211 Revamp your old Linux desktop with Joe-s Window Manager.md b/sources/tech/20191211 Revamp your old Linux desktop with Joe-s Window Manager.md deleted file mode 100644 index 97240d2de9..0000000000 --- a/sources/tech/20191211 Revamp your old Linux desktop with Joe-s Window Manager.md +++ /dev/null @@ -1,78 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Revamp your old Linux desktop with Joe's Window Manager) -[#]: via: (https://opensource.com/article/19/12/joes-window-manager-linux-desktop) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Revamp your old Linux desktop with Joe's Window Manager -====== -This article is part of a special series of 24 days of Linux desktops. -JWM's meager weight and simplicity makes it a great window manager for -slow or old Linux computers. -![and old computer and a new computer, representing migration to new software or hardware][1] - -Joe's Window Manager ([JWM][2] for short) is a lightweight window manager for X11. It's written in C, minimally using [Xlib][3]. Because it's so small and simple, JWM makes a great window manager for slow or old computers. The Raspberry Pi barely registers that JWM is running, leaving precious system resources for more important tasks than the desktop. - -JWM follows in the footsteps of environments like FVWM, Window Maker, and Fluxbox. It provides an application menu, window decoration, and a panel with an application menu, taskbar, and clock. - -Install JWM from your distribution's software repository. After installing it, log out of your current desktop session so you can log into JWM. By default, your session manager (KDM, GDM, LightDM, or XDM, depending on your setup) will continue to log you into your previous desktop, so you must override that before logging in. - -To select a new desktop with GDM: - -![Select your desktop session in GDM][4] - -With KDM: - -![Select your desktop session with KDM][5] - -The first time you log into JWM, you may find a black screen with a panel at the bottom. It's normal on most distributions to let you choose the wallpaper for this minimal desktop. You can set a wallpaper with the **feh** command (you may need to install it from your repository). This command has a few options for setting the background, including **\--bg-fill** to fill the screen with your wallpaper of choice, **\--bg-scale** to scale it to fit, and so on. - - -``` -`$ feh --bg-fill ~/Pictures/wallpapers/mybackground.jpg` -``` - -### Application menu - -There are two locations for the application menus in JWM: it appears at your mouse cursor when you left-click on the desktop, and it is also available by clicking the JWM logo in the lower-left corner. - -![JWM running on Debian][6] - -There aren't any applications bundled with JWM, so it's up to you to decide what applications to use. You can get applications from any desktop, like GNOME or KDE, or you can use independent applications. Most of the integration between applications is done by [D-Bus][7] and other backend technology on Linux, so it's safe to mix and match them. I use [PCManFM-Qt][8] as a file manager, [unicode-rxvt][9] as a terminal, and, of course, Firefox as an internet browser. - -### Configuration - -Two configuration files govern JWM. The system-wide configuration file is **/etc/jwm/system.jwmrc**, and the user local file is **$HOME/.jwmrc**. Configuration files are written in XML, but the schema is very basic and easy to reverse-engineer, whether you know XML or not. Configuration options are well-documented on [Joewing.net][10], home of the JWM project. - -### Why you should use JWM - -There's no shortage of lightweight window managers available for Linux, and you might wonder why there seems to be so much redundancy, much less why you should try Joe's. There are a few reasons JWM is as important as any of the others. When looking at software projects, redundancy is a _good thing_. Should one project's implementation of a desktop paradigm fade, you have many others to choose from. And often, the strengths of each project are in the minor details. For example, the quick and easy setup of a taskbar and application menu makes for a quick, sensible default configuration for all the users who want that common setup. For technical users, the XML configuration may be a refreshing change from the custom configuration formats in other environments. - -Joe's Window Manager, in a way, demonstrates the rich diversity of open source and how it's a luxury Linux users enjoy. If you're interested in JWM, try it out today, and see if you can make your own window manager, too. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/joes-window-manager-linux-desktop - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/migration_innovation_computer_software.png?itok=VCFLtd0q (and old computer and a new computer, representing migration to new software or hardware) -[2]: http://joewing.net/projects/jwm/ -[3]: https://en.wikipedia.org/wiki/Xlib -[4]: https://opensource.com/sites/default/files/advent-gdm_0.jpg (Select your desktop session in GDM) -[5]: https://opensource.com/sites/default/files/advent-kdm.jpg (Select your desktop session with KDM) -[6]: https://opensource.com/sites/default/files/uploads/advent-jwm_675px.jpg (JWM running on Debian) -[7]: https://en.wikipedia.org/wiki/D-Bus -[8]: https://blog.lxqt.org/category/pcmanfm-qt/ -[9]: https://opensource.com/article/19/10/why-use-rxvt-terminal -[10]: http://joewing.net/projects/jwm/config-2.3.html diff --git a/sources/tech/20191212 15 Useful Firefox Keyboard Shortcuts You Should Know.md b/sources/tech/20191212 15 Useful Firefox Keyboard Shortcuts You Should Know.md deleted file mode 100644 index 345802439f..0000000000 --- a/sources/tech/20191212 15 Useful Firefox Keyboard Shortcuts You Should Know.md +++ /dev/null @@ -1,129 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (15 Useful Firefox Keyboard Shortcuts You Should Know) -[#]: via: (https://itsfoss.com/firefox-keyboard-shortcuts/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -15 Useful Firefox Keyboard Shortcuts You Should Know -====== - -[Firefox][1] is one of the most popular free and open-source browsers for Linux users. Even though you have a lot of [open source chrome alternatives][2], Firefox still is one of the best choices to go with. - -And you don’t even need to [install Firefox on Ubuntu][3] or most other distributions because it is installed by default. - -What if you can make your browsing experience on Firefox even better by using some keyboard shortcuts? - -Hold on, of course, not everyone prefers to use keyboard shortcuts. But, if you’re comfortable with that and want to do perform tasks in a jiffy, you should know some of the most common Firefox keyboard shortcuts. - -It is also worth noting that you could use some of these shortcuts on Chrome/Chromium as well- however, we already have a list of [useful Google Chrome shortcuts][4] to help you out. So, if you’re using Chrome/Chromium, I insist you check out that article. - -### 15 Useful Firefox Keyboard Shortcuts - -![][5] - -You could always refer to the [official documentation][6] of keyboard shortcuts for Firefox. However, that’s a very long list, and you probably do not need to use all of that. - -So, here, I shall be listing the most commonly used (and useful) keyboard shortcuts that you can use on Firefox. To be honest, these are the shortcuts that I use most frequently on Firefox. - -#### 1\. Open A New Tab - -You don’t have to hover your cursor over to the **+** sign in the browser. - -Simply press **CTRL + T** to open a new tab in the same window. - -#### 2\. Open A New Tab In A New Window - -If you want to open up a new window along with a new tab, you just have to press **CTRL + N**. - -#### 3\. Close A Tab - -Lazy to use your mouse to navigate and close the tab? Fret not, just press **CTRL + W** to make your active tab vanish! - -#### 4\. Open A New Private Window - -Don’t want to store the history/cookies for a specific browsing session? You can try the private mode by pressing **CTRL + Shift + P** as the keyboard shortcut for Firefox. - -#### 5\. Open Recently Closed Tabs - -If you closed a tab recently (or a number of tabs), just press **CTRL + Shift + T** till you get all your closed tabs restored. - -#### 6\. Reload Webpage - -You might want to reload a webpage quickly, to do that press **F5**. - -If you want to ignore the cached content and want to fetch a new copy of the webpage, you can try **CTRL + F5**. - -#### 7\. Scroll Up/Down Webpage - -You can also scroll up/down using just your keyboard. - -Simply use **PAGE UP** to scroll up and **PAGE DOWN** key to scroll down. - -#### 8\. Find A Text In Webpage - -You do not need to endlessly look for a word on a webpage just like you would in a physical book. - -Simply press **CTRL + F** and then type in the exact word, it should highlight the matching words if it exists. - -#### 9\. Close Your Browser At Once - -Hit **CTRL + Shift + W** to close all the tabs in one go. However, you might get the prompt to confirm it. - -#### 10\. View The Page Source - -If you’re interested to take peek at the webpage’s source code, you just have to press **CTRL + U** to open view source in a new tab. - -#### 11\. Switch Tabs Quickly - -If you have multiple tabs opened up, you can easily navigate through them by pressing: - -**CTRL + Tab**. - -#### 12\. View Your Downloads - -Do you want to quickly take a look at your download library? All you need to do is press: - -**CTRL + Shift + Y** - -#### 13\. Bookmark A Webpage - -To bookmark a webpage, hit **CTRL + D** and press the **ENTER** key to save it. - -#### 14\. Select the Address/Search Bar - -If you want to search for something through the address bar, hit **CTRL + L** to immediately highlight the search bar for you. - -#### 15\. Check Browsing History - -Usually, it needs a couple of clicks to view your history. But, you can just press **CTRL + H** to launch the sidebar to view your history right away. - -### Wrapping Up - -As I mentioned, you will find a huge list of Firefox keyboard shortcuts if you take a look at their [official documentation][6]. - -If you want to explore more options, feel free to check the documentation. In either case, the mentioned keyboard shortcuts should come pretty handy. - -I’ll be interested to know what Firefox keyboard shortcuts do you use? Let me know your thoughts in the comments below. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/firefox-keyboard-shortcuts/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://www.mozilla.org/en-US/firefox/ -[2]: https://itsfoss.com/open-source-browsers-linux/ -[3]: https://itsfoss.com/firefox-quantum-ubuntu/ -[4]: https://itsfoss.com/google-chrome-shortcuts/ -[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/Firefox_Keyboard_Shortcuts.jpg?ssl=1 -[6]: https://developer.mozilla.org/en-US/docs/Tools/Keyboard_shortcuts diff --git a/sources/tech/20191213 How to generate code with Apache Velocity.md b/sources/tech/20191213 How to generate code with Apache Velocity.md deleted file mode 100644 index ad431b0a55..0000000000 --- a/sources/tech/20191213 How to generate code with Apache Velocity.md +++ /dev/null @@ -1,88 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to generate code with Apache Velocity) -[#]: via: (https://opensource.com/article/19/12/generate-code-apache-velocity) -[#]: author: (Girish Managoli https://opensource.com/users/gammay) - -How to generate code with Apache Velocity -====== -Get started with Velocity, an open source, Java-based template engine -and code generator that converts templates into source code. -![Binary code on a computer screen][1] - -Apache [Velocity][2] is an open source, Java-based template engine and code generator that converts templates into source code. Because it is implemented in Java, it is capable of interpreting varied templates and generating code for any language (web, service, SQL, scripts, etc.), although it seems to be oriented mostly toward web development. - -## Velocity's structure - -Velocity's structure is comprised of an engine and tools. Its core is the Velocity Engine, which uses the defined template, interprets the template language, and generates the code. - -Templates are defined with Velocity Template Language ([VTL][3]), a simple language with effective directives. VTL statements are directives or variables, and variables can be standalone or class methods. - -Examples of VTL expressions include: - - -``` -`package ${packagename};`[/code] | Inserts a package statement in Java where the package name is defined as **packagename** ----|--- -``` -`public ${classname} implements Serializable {`[/code] | Adds a class with name **classname** - -``` - #foreach( $property in $properties ) - public ${property.fieldType} get${property.getField()}() { -     return this.${property.fieldName}; - } -#end [/code] | Creates getter methods for all defined properties - -Velocity tools are collections of basic user-friendly capabilities. There are [GenericTools][4], a "set of classes that provide basic infrastructure for using tools in standard Java SE Velocity projects, as well as a set of tools for use in generic Velocity templates." They include DateTool, MathTool, NumberTool, SortTool, and XmlTool. There are also [VelocityView][5] tools, which include "all of the GenericTools and adds infrastructure and specialized tools for using Velocity in the view layer of web applications (Java EE projects)." VelocityView tools include BrowserTool, CookieTool, and ImportTool - -## Velocity advantages and disadvantages - -Velocity is easy to use and has the capability to generate any language. On the downside, there is a learning curve to understand and apply its template language. Velocity is morphology- and ontology-free. It has no knowledge of the design capability of the module it generates. As a practical example, Velocity may use a template for a controller (e.g., Model-View-Controller or an architecture style) and generate the code, but it has no awareness of the concept of a controller. This is both an advantage and disadvantage, with a generator being simple and easy to use but with no awareness of the design's aptitude. - -## Using Velocity - -Velocity's Java library is available on the [Maven repository][6]. To use the .jar file, define Velocity's latest version in your Maven build config. (Velocity 1.7 is the latest version, as of this writing.) For example, enter the following in your Maven Project Object Model (POM): -``` - - -<dependency> -        <groupId>org.apache.velocity</groupId> -        <artifactId>velocity</artifactId> -        <version>1.7</version> -</dependency> - -``` -### Java Hello World example - -To generate code, you need two things: - - 1. The **Velocity template** to be used for generation, e.g., java_example.vm: [code] public class ${className} { - -    public static void main([String][7][] args) { -        [System][8].out.println("${message}"); -    } - -} -``` - - - - 2. The **Velocity generator** that uses the template to generate code, e.g., VelocityStartGenerator.java: [code] public class VelocityStartGenerator { -  -    static [String][7] inputTemplate = "java_example.vm"; -    static [String][7] className = "VelocityExample"; -    static [String][7] message = "Hello World!"; -    static [String][7] outputFile = className + ".java"; -        -    public static void main([String][7][] args) throws [IOException][9] { -        -        VelocityEngine velocityEngine = new VelocityEngine(); -        velocityEngine.init(); -      -        VelocityContext context = new VelocityContext(); -        context.put("className", className); -  \ No newline at end of file diff --git a/sources/tech/20191213 Why you need to know about Seeed hardware devices.md b/sources/tech/20191213 Why you need to know about Seeed hardware devices.md deleted file mode 100644 index eec34577da..0000000000 --- a/sources/tech/20191213 Why you need to know about Seeed hardware devices.md +++ /dev/null @@ -1,121 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Why you need to know about Seeed hardware devices) -[#]: via: (https://opensource.com/article/19/12/seeeduino-nano-review) -[#]: author: (Alan Smithee https://opensource.com/users/alansmithee) - -Why you need to know about Seeed hardware devices -====== -Learn how Seeed microcontrollers solve the problem of building modular -projects. -![Multi-colored and directional network computer cables][1] - -The microcontroller craze doesn't seem to be dying down—and that's a good thing because these products consistently succeed where the mobile market consistently fails: Users get open software _and hardware_, a portable form factor, and a wide choice of vendors and products that are built to last. - -Among the best of the open hardware and software vendors is [Seeed][2], the self-proclaimed "IoT Hardware Enabler." I recently started seeing the Seeed logo on projects, so I contacted the company to learn about the interesting things they're doing. In response, they generously sent me one of their latest products: the [Seeeduino Nano][3], a compact board that the company says is fully compatible with the Arduino Nano but at half the price and a quarter the size, along with a sample sensor to get me started. - -I spent a few days with it, and I'm already working on a project to improve my home garden and thinking of several others for home automation. Far from just another Arduino-like product, the Seeeduino Nano solves several problems new makers face when they get a microcontroller and want to use it. - -### What do I do with this? - -The most common problem I hear from people underwhelmed by the Raspberry Pi, Arduino, or similar microcontroller is that they excitedly got a board, stepped through its tutorial, and then realized they didn't know what to do with it. As computer users, we're not used to purpose-driven devices. You get a computer-like device and use it for many purposes, so it feels strange to get a computing device and build it into a project. - -It can also be a little overwhelming to get a microcontroller. It's full of potential, but it's also just a microcontroller. It can be intimidating to figure out what kind of project to start when you have a device that apparently is capable of anything. - -Seeed has a line of input and output peripherals (they call it Grove) that are easy to connect and provide an easy way to modularly build projects based on what kind of information you want to process. There's nothing special about the Grove modules compared to sensors or servos you can get for any other device, but Seeed makes what can sometimes seem to be an overwhelming number of choices a lot more navigable. And better yet, Seeed provides libraries for each Grove module, so you'll never buy a part for your project then find that you don't know how to make your controller recognize it. - -Because Seeed sent me a temperature and humidity sensor, my potential projects, at least in the short term, became highly focused. I knew I'd be designing either a thermometer and humidity detector for my home or a moisture monitor for some of my favorite plants. Based on the other Grove modules, I've come up with several more projects, too. - -### Clean connectors - -What makes the Grove modules especially nice is that they're based around I2C connectors. That means you can turn this: - -![Cables and pins and alligator clips][4] - -into this: - -![The Seeeduino Nano with a Grove module connected][5] - -Of course, you can also solve that problem with any number of attachments for a Pi or Arduino or whatever product you happen to own, but the Seeed and Grove are built for one another, so if you're embarking on a new project, this is an easy way to keep things under control from the start. - -### Small footprint - -The Seeeduino Nano is small. It's just 18mm by 43mm (that's about 1.5" by 1"), yet it has eight analog pins, 14 digital pins, and features the ATmega328P 8-bit AVR microcontroller. If your project has space issues, this is a great option. - -![Seeeduino Nano microcontroller][6] - -The sensors tend to be small, too. Size varies depending on what you purchase, but they're generally designed to save space. - -![The Grove temperature and humidity pro \(left\) and a US quarter \(right\)][7] - -### Setup - -Getting started with the Seeeduino Nano was as easy as getting started with an Arduino. That's not always the case with Arduino-like products, because some of them assume you know the components they're built from. You might get a microcontroller, download the Arduino IDE, and discover that the product you purchased isn't an option in the Board menu, leaving you to guess which Arduino board yours is equivalent to. Seeed leaves nothing to chance and provides board definitions for all of its products. You have to import them yourself since they don't ship with the Arduino IDE, but the [Seeed wiki][8] provides instructions on how to do that through the IDE's Board Manager interface. - -After you've imported the board definition, you can either start with the ritual flashing of the Blink code onto your device or just code in the Arduino IDE as usual. There are instructions on the Seeed wiki for that, too. - -### Code - -In addition to board definitions, Seeed provides sample code for each Grove module, so you know how to send data to the module or gather data from it. I was using the Temperature and Humidity Pro sensor, which requires the [DHT library][9]. Seeed provides the library along with a DHTtester [project][10], and instructions on how to install it are on its wiki. - -The only thing Seeed doesn't provide is the name of the correct input pin for the Grove module. The project's example code, written by [LadyAda][11], uses the first analog pin (A0), but, on the Seeeduino Nano, the Grove attaches to what turns out to be A5. This is difficult to tell by looking at it, because the Grove physically attaches to the I2C plug, with no indication of what pin it's connected to. However, the Seeed is open source, so you can either look at the specs for the board, or you can just do what these kinds of gadgets beg you to do: experiment! - -In the end, the basic code to get information from the Grove humidity and temperature sensor is about 20 lines of code (25 if you build in sanity checks, as LadyAda's code does): - - -``` -// public domain code by ladyada -#include "DHT.h" -#define DHTPIN A5 -#define DHTTYPE DHT22 - -DHT dht(DHTPIN, DHTTYPE); - -void setup() { -  Serial.begin(9600); -  dht.begin(); } - -void loop() { -  float h = dht.readHumidity(); -  float t = dht.readTemperature(); -  Serial.print("Humidity: "); -  Serial.print(h); -  Serial.print(" %\t"); -  Serial.print("Temperature: "); -  Serial.print(t); -  Serial.println(" *C"); } -``` - -### Open source everything - -The Seeeduino is open source, from the [downloadable Eagle file][12] to the [software][13] that helps you drive it. It's a dream platform for new users who feel overwhelmed by confusing and disparate choices or for experienced makers who have moved on from a prototype and are ready to build a neatly organized and cleanly wired project. If you've got a budding inventor in your life, let Seeed help seed their projects. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/seeeduino-nano-review - -作者:[Alan Smithee][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/alansmithee -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/connections_wires_sysadmin_cable.png?itok=d5WqHmnJ (Multi-colored and directional network computer cables) -[2]: http://seeedstudio.com -[3]: http://wiki.seeedstudio.com/Seeeduino-Nano/ -[4]: https://opensource.com/sites/default/files/uploads/rpi-mess.jpg (Cables and pins and alligator clips) -[5]: https://opensource.com/sites/default/files/uploads/seeeduino-grove.jpg (The Seeeduino Nano with a Grove module connected) -[6]: https://opensource.com/sites/default/files/uploads/seeeduino-nano-wiki_0.jpg (Seeeduino Nano microcontroller) -[7]: https://opensource.com/sites/default/files/uploads/tempandhumid.jpg (The Grove temperature and humidity pro (left) and a US quarter (right)) -[8]: http://wiki.seeedstudio.com/ -[9]: https://github.com/Seeed-Studio/Grove_Temperature_And_Humidity_Sensor/releases -[10]: https://project.seeedstudio.com/ -[11]: https://www.adafruit.com -[12]: https://github.com/SeeedDocument/Seeeduino-Nano/raw/master/res/Seeeduino%20nano.zip -[13]: https://github.com/Seeed-Studio diff --git a/sources/tech/20191215 Customize your Linux desktop with the Trinity Desktop Environment.md b/sources/tech/20191215 Customize your Linux desktop with the Trinity Desktop Environment.md deleted file mode 100644 index 561e90d771..0000000000 --- a/sources/tech/20191215 Customize your Linux desktop with the Trinity Desktop Environment.md +++ /dev/null @@ -1,65 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Customize your Linux desktop with the Trinity Desktop Environment) -[#]: via: (https://opensource.com/article/19/12/linux-trinity-desktop-environment-tde) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Customize your Linux desktop with the Trinity Desktop Environment -====== -This article is part of a special series of 24 days of Linux desktops. -TDE is a fully customizable Linux desktop that will be instantly -recognizable to anyone who knew and loved KDE 3. -![Person standing in front of a giant computer screen with numbers, data][1] - -When KDE 4 was released in 2008, KDE 3 went into support mode until support was dropped entirely. That's the usual lifecycle of software, desktops included, but the KDE 3 fanbase wasn't universally pleased with KDE 4, and some of them decided a fork was in order. - -Some of them formed a new project with the mission of preserving the look and feel of KDE 3, starting from KDE 3.5.10 (the last official release in the 3.x series), and then forking Qt 3 into TQt to keep the underlying technology updated. Today, the [Trinity Desktop Environment][2] (TDE) delivers a traditional desktop environment that looks and feels essentially the same as KDE 3 did 10-plus years ago. - -You may find the Trinity desktop included in the software repository of your distribution. Before you install it, be aware that it is meant to provide a full desktop experience, so many TDE apps are installed along with the desktop. If you're already running another desktop, you may find yourself with redundant applications (two PDF readers, two media players, two file managers, and so on). - -If your software repo doesn't offer Trinity, or you just don't want to install it and all of its applications, you can install a TDE distribution in a virtual machine, such as [GNOME Boxes][3]. I used the [exeGNU][4] distribution for the screenshots below, and there are other distros listed on [TDE's LiveCDs][5] page. - -### TDE desktop tour - -The Trinity Desktop Environment is a very traditional desktop. It's one that's likely to be familiar to you—whether or not you've used KDE at all, in fact. It has one panel at the bottom of the screen that contains an application menu in the left corner, a taskbar in the middle, and a system tray in the right, and there are icons for common locations on the desktop. It behaves exactly as you'd expect a desktop to behave, and you can probably change whatever you want to change because TDE is completely customizable. - -If you were a KDE 3 user in the past, revisiting the Trinity Desktop Environment is a little like stepping back in time. While a side-by-side comparison of the two desktops might reveal significant differences, it would be a real challenge to find a deviation in TDE from the desktop you remember. All the key components are there: the sidebar tabs, the Konqueror file manager, the traditional application menu, the retractable panel, and the classic layout. - -![TDE on exeGNU][6] - -How different this is from KDE 4 or KDE 5 is a matter of perspective. To many users, the TDE default is pretty much the same as the default layout of late KDE 4 or current KDE 5 desktops. As is often the case, however, the biggest differences are in the smallest of details. The absence of Dolphin in favor of [Konqueror][7] is one of the biggest non-changes. Konqueror has quite literally set the standard for both file management and web browsing (KHTML is the code that Apple and Google forked to create the Safari and Chrome browsers), so preserving it as the central desktop application is particularly noteworthy. - -All the "old" applications are still there, and seemingly not a button or widget has moved from the old default 3.5 location. The defaults are always set to what they were in KDE 3.5, but nearly everything can be rearranged, changed, hidden, or disassembled. User experience is supreme, and TDE never assumes that any two users want the same experience. - -![Trinity Control Center][8] - -To a tried and true KDE 3.5.x user, using TDE is just a matter of surrendering to muscle memory. - -### Trinity and open source - -Trinity, along with the Mate fork of GNOME 2, is one of the most direct examples of how open source empowers developers to sustain a beloved software project that's otherwise reached its end. Not all software is kept alive by a fork and a dedicated team of true believers, but sometimes it does happen, and when it does, it results in greater variety and more choice. Whether you choose KDE 5 or TDE, or GNOME 3 or Mate, you get to make those choices because open source empowers developers and users to make technology work better for everyone. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/linux-trinity-desktop-environment-tde - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data) -[2]: https://www.trinitydesktop.org/ -[3]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization -[4]: http://exegnulinux.net -[5]: https://wiki.trinitydesktop.org/LiveCDs -[6]: https://opensource.com/sites/default/files/uploads/advent-trinity.jpg (TDE on exeGNU) -[7]: https://kde.org/applications/internet/org.kde.konqueror -[8]: https://opensource.com/sites/default/files/uploads/advent-trinity-control.jpg (Trinity Control Center) diff --git a/sources/tech/20191216 Setting up the sway window manager on Fedora.md b/sources/tech/20191216 Setting up the sway window manager on Fedora.md deleted file mode 100644 index 67c1e34f4c..0000000000 --- a/sources/tech/20191216 Setting up the sway window manager on Fedora.md +++ /dev/null @@ -1,157 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Setting up the sway window manager on Fedora) -[#]: via: (https://fedoramagazine.org/setting-up-the-sway-window-manager-on-fedora/) -[#]: author: (George Luiz Maluf https://fedoramagazine.org/author/georgelmaluf/) - -Setting up the sway window manager on Fedora -====== - -![][1] - -Sometimes during a critical activity, working with overlapping windows becomes counterproductive. You might find a tiled window manager like sway to be a good alternative. - -Sway is a tiling Wayland compositor. It has the advantage of compatibility with an existing [i3 configuration][2], so you can use it to replace i3 and use Wayland as the display protocol. - -### Installing sway - -To setup sway, open a new terminal and type the following command - -``` -sudo dnf install sway -``` - -Once the installation is completed, log out of your user session. At the login screen, select your user account. Before you enter your password, choose _Sway_ from the menu, as shown in the following image. - -![][3] - -After login, your desktop looks like this: - -![][4] - -### Configuration - -To begin configuration, copy the default config into your user directory. Do that using the following commands. - -``` -mkdir -p .config/sway -cp /etc/sway/config ~/.config/sway/ -``` - -Sway is highly configurable. It’s suggested you read the project’s [wiki page][5] to fine tune your settings. For example, to change the keyboard layout, open a new terminal and run this command: - -``` -$ swaymsg -t get_inputs -[george@mrwhite ~]$ swaymsg -t get_inputs - Input device: VirtualPS/2 VMware VMMouse - Type: Mouse - Identifier: 2:19:VirtualPS/2_VMware_VMMouse - Product ID: 19 - Vendor ID: 2 - Libinput Send Events: enabled - Input device: VirtualPS/2 VMware VMMouse - Type: Mouse - Identifier: 2:19:VirtualPS/2_VMware_VMMouse - Product ID: 19 - Vendor ID: 2 - Libinput Send Events: enabled - Input device: AT Translated Set 2 keyboard - Type: Keyboard - Identifier: 1:1:AT_Translated_Set_2_keyboard - Product ID: 1 - Vendor ID: 1 - Active Keyboard Layout: Portuguese (Brazil) - Libinput Send Events: enabled -``` - -Copy the identifier keyboard code. Open your _~/.config/sway/config file_ with your text editor and edit the configuration accordingly: - -``` -## Input configuration -input "1:1:AT_Translated_Set_2_keyboard" { - xkb_layout br -} -``` - -Save the settings. To reload the configurations, press **Super+Shift+c**. (Typically the **Super** key is mapped to the logo key on a PC.) - -### Waybar - -Sway’s default status bar may not have all the functions you want. Fortunately Waybar is a good replacement. To install, run the follow commands. _(Note, however, that COPR is not an official Fedora repository and not supported by the Fedora Project.)_ - -``` -sudo dnf copr enable alebastr/waybar -sudo dnf install waybar -``` - -Open your _~/.config/sway/config_ file. Edit the bar configuration like this: - -``` -bar { - swaybar_command waybar -} -``` - -Reload the configuration and you’ll now see the waybar in action, as shown below. - -![][6] - -To customize the waybar, you can visit this [wiki page][7] for more details and ideas. - -### Alacritty - -Alacritty is a terminal emulator that uses the GPU for rendering, and a good replacement for _urxvt_. To install run the following lines - -``` -sudo dnf copr enable pschyska/alacritty -sudo dnf install alacritty -``` - -To enable it as default terminal emulator edit your _~/.config/sway/config_. Change this line: - -``` -set $term urxvt256c-ml -``` - -To: - -``` -set $term alacritty -``` - -Reload your configuration. - -When you open a new terminal with **Super+C**, alacritty will be open as seen in the following image: - -![][8] - -* * * - -_Photo by [Ivan Vranić][9] on [Unsplash][10]._ - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/setting-up-the-sway-window-manager-on-fedora/ - -作者:[George Luiz Maluf][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/georgelmaluf/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/12/sway-816x345.jpg -[2]: https://fedoramagazine.org/getting-started-i3-window-manager/ -[3]: https://fedoramagazine.org/wp-content/uploads/2019/11/sway_login_menu-1024x522.png -[4]: https://fedoramagazine.org/wp-content/uploads/2019/11/sway_desktop_default-1024x522.png -[5]: https://github.com/swaywm/sway/wiki -[6]: https://fedoramagazine.org/wp-content/uploads/2019/11/sway_waybar_default-1024x522.png -[7]: https://github.com/Alexays/Waybar/wiki/Configuration -[8]: https://fedoramagazine.org/wp-content/uploads/2019/11/sway_alacritty-1024x522.png -[9]: https://unsplash.com/@hvranic?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText -[10]: https://unsplash.com/s/photos/sway?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20191218 Emacs for Vim users- Getting started with the Spacemacs text editor.md b/sources/tech/20191218 Emacs for Vim users- Getting started with the Spacemacs text editor.md deleted file mode 100644 index a5782451e1..0000000000 --- a/sources/tech/20191218 Emacs for Vim users- Getting started with the Spacemacs text editor.md +++ /dev/null @@ -1,113 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Emacs for Vim users: Getting started with the Spacemacs text editor) -[#]: via: (https://opensource.com/article/19/12/spacemacs) -[#]: author: (Kevin Sonney https://opensource.com/users/ksonney) - -Emacs for Vim users: Getting started with the Spacemacs text editor -====== -Spacemacs offers all the power of Emacs combined with the keystroke -commands and functionality you are used to in Vim. -![Hands programming][1] - -I use [Vim][2] a lot. I'm a site reliability engineer (SRE), and Vim is the one thing I know I can access on every machine in our fleet. I also like [Emacs][3], with its wide variety of useful packages, ease of extending, and its many built-in tools. Because they each have their own set of commands, I have to actively switch codes in my head (usually after typing **:wq** in Emacs or trying to **C+X** in Vim). The [Evil][4] package for Emacs helps quite a bit by making Emacs behave more like Vim, but there is some effort required to set it up the first time. - -### Enter Spacemacs - -![Spacemacs splash screen][5] - -[Spacemacs][6] is a set of configurations for Emacs that combines an easy setup, Evil, and a system to manage and set up additional Emacs packages with pre-built configurations to make them easier to use out of the box. - -### Installation and setup - -As I mentioned above, Spacemacs is easy to install. No, really: it takes just one command: - - -``` -`git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d` -``` - -Then just start Emacs. It will prompt you through the basic configuration options and generate a **.spacemacs** configuration file. The defaults are as safe as can be: Vim keybindings, Spacemacs' recommended packages, and the Helm search engine. When the configuration completes, you will see a help screen with some basic information and commands. - -![Spacemacs help screen][7] - -Now Spacemacs is set up and ready to go and will behave like Vim. You can start right away by entering **:e </path/to/file>** to open and edit a file and using good old **:wq** to save (among other commands). As a bonus, if you are a seasoned Emacs user, many of the commands you are used to are still there. - -### Using Spacemacs - -On the main splash screen, you'll notice a lot of information. There are buttons to update Spacemacs and the packages, access different forms of documentation, and open recently edited files. - -Whenever you're not in insert mode, you can press the **Space Bar** to bring up a menu of other available options. The default options include access to the Helm search engine and the basic functions for opening and editing files. As you add packages, they will also show up in the menu. In most special screens (i.e., those that are not a document you are editing), the **q** key will exit the screen. - -### Configuring Spacemacs - -Before getting into Spacemacs' configuration, you need to understand **layers**. Layers are self-contained configuration files that load on top of one another. A layer is comprised of the instructions to download and install the package and any dependencies, as well as the basic configuration and key mappings for the package. - -Spacemacs has quite a few [layers available][8], and more are being added all the time. You can find the complete list in the **~/.emacs.d/layers** directory tree. They are organized by type; to use one, just add it in the main **.spacemacs** configuration file to the **dotspacemacs-configuration-layers** list. - -I generally enable the Git, Version-Control, Markdown, and Colors (theme support) layers. If you are familiar with configuring Emacs, you can also add custom configurations in [Lisp][9] to the **dotspacemacs/user-config** section. - -You can also enable a Nyan Cat progress bar by adding the following line in your layers list: - - -``` -`(colors :variables colors-enable-nyan-cat-progress-bar t)` -``` - -  - -![Nyan Cat progress bar in Spacemacs][10] - -### Using Org mode in Spacemacs - -One of my other favorite layers is [Org mode][11], probably one of the most popular notes, to-do, and project management applications in the open source world. - -To install Org, just open up the **.spacemacs** file and uncomment the line for **org** under **dotspacemacs-configuration-layers**. - -![Installing Org mode in Spacemacs][12] - -Exit and restart Emacs, and it will download the Org packages and set them up. Type **Space Bar+a**, and you see a new menu item for Org with the hotkey **o**, and the common Org functions—agenda, to-do list, etc.—are under that menu. They are  blank until you configure the default Org files. The easiest way to do that is with the built-in Emacs configuration tool, which you can access by typing **Space Bar+?** and searching for **Customize**. When the Customize screen opens, search for **org-agenda-files**. Add a file or two to the list (I used **~/todo.org** and **~/notes.org**), click Apply and Save, then exit Customize. - -![Emacs Customize tool in Spacemacs][13] - -Next, create a file so that Org can read them into the agenda and to-do list. Even if the file is blank, that's OK—it just has to exist. Since I added two files—todo.org and notes.org—to my configuration, I can type **:e todo.org** and **:e notes.org** to open both, and then **:w** to save the blank files. - -Next, enter the Org agenda with **Space Bar+a+o+a** or the Org to-do list with **Space Bar+a+o+t**. If you have added actionable items or scheduled events to the notes or to-do files, you will see them now. You can find out more about Org's structure and syntax in _[Get started with Org mode without Emacs][14]_ or on the [Org mode][11] website. - -![Spacemacs todo.org and the Org todo agenda][15] - -Spacemacs offers all the power of Emacs combined with the keystroke commands and functionality you are used to with Vim. Give it a try, and please let me know what you think in the comments. - -This is a short list of my favorite graphical text editors for Linux that can be classified as IDE... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/spacemacs - -作者:[Kevin Sonney][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/ksonney -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop.png?itok=pGfEfu2S (Hands programming) -[2]: https://www.vim.org/ -[3]: https://www.gnu.org/software/emacs -[4]: https://www.emacswiki.org/emacs/Evil -[5]: https://opensource.com/sites/default/files/uploads/spacemacs_spash.png (Spacemacs splash screen) -[6]: https://www.spacemacs.org/ -[7]: https://opensource.com/sites/default/files/uploads/spacemacs_help.png (Spacemacs help screen) -[8]: https://www.spacemacs.org/layers/LAYERS.html -[9]: https://en.wikipedia.org/wiki/Lisp_(programming_language) -[10]: https://opensource.com/sites/default/files/uploads/nyan-cat-progress.png (Nyan Cat progress bar in Spacemacs) -[11]: https://orgmode.org -[12]: https://opensource.com/sites/default/files/uploads/spacemacs_org_change.png (Installing Org mode in Spacemacs) -[13]: https://opensource.com/sites/default/files/uploads/emacs_customize.png (Emacs Customize tool in Spacemacs) -[14]: https://opensource.com/article/19/1/productivity-tool-org-mode -[15]: https://opensource.com/sites/default/files/uploads/spacemacs_org.png (Spacemacs todo.org and the Org todo agenda) diff --git a/sources/tech/20191218 How to tell if you-re using a bash builtin in Linux.md b/sources/tech/20191218 How to tell if you-re using a bash builtin in Linux.md deleted file mode 100644 index 466dde98c7..0000000000 --- a/sources/tech/20191218 How to tell if you-re using a bash builtin in Linux.md +++ /dev/null @@ -1,153 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to tell if you’re using a bash builtin in Linux) -[#]: via: (https://www.networkworld.com/article/3505818/how-to-tell-if-youre-using-a-bash-builtin-in-linux.html) -[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) - -How to tell if you’re using a bash builtin in Linux -====== -A built-in is a Linux command that's part of whatever shell you're using. Can you tell what commands are built-ins and which are not? -Guenter Guni / Getty Images - -If you’re not sure if you’re running a Linux command or you’re using a bash builtin, don’t stress, it isn’t all that obvious. In fact, you can get very used to commands like **cd** without realizing that they’re part of your shell, unlike commands like **date** and **whoami** that invoke executables (**/bin/date** and **/usr/bin/whoami**). - -Builtins in general are commands that are built into shell interpreters, and bash is especially rich in them, which is a good thing because built-ins by their very nature run a bit faster than commands which have to be loaded into memory when you call them into play. - -[[Get regularly scheduled insights by signing up for Network World newsletters.]][1] - -In other words, some commands are built into the shell because they pretty much have to be. After all, a command like **cd** needs to change the shell’s view of the world – or at least its perspective on the file system. Others provide the shell with its special ability to loop and evaluate data – like **case**, **for** and **while** commands. In short, these commands make the shell what it is for all of its devoted users. Still others just make commands run a little faster. - -[][2] - -BrandPost Sponsored by HPE - -[Take the Intelligent Route with Consumption-Based Storage][2] - -Combine the agility and economics of HPE storage with HPE GreenLake and run your IT department with efficiency. - -To get a list of bash built-ins, all you have to type is “help”. - -``` -$ help -GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu) -These shell commands are defined internally. Type `help' to see this list. -Type `help name' to find out more about the function `name'. -Use `info bash' to find out more about the shell in general. -Use `man -k' or `info' to find out more about commands not in this list. - -A star (*) next to a name means that the command is disabled. - - job_spec [&] history [-c] [-d offset] [n] or history -an> - (( expression )) if COMMANDS; then COMMANDS; [ elif COMMANDS> - . filename [arguments] jobs [-lnprs] [jobspec ...] or jobs -x comm> - : kill [-s sigspec | -n signum | -sigspec] pi> - [ arg... ] let arg [arg ...] - [[ expression ]] local [option] name[=value] ... - alias [-p] [name[=value] ... ] logout [n] - bg [job_spec ...] mapfile [-d delim] [-n count] [-O origin] [> - bind [-lpsvPSVX] [-m keymap] [-f filename] [> popd [-n] [+N | -N] - break [n] printf [-v var] format [arguments] - builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir] - caller [expr] pwd [-LP] - case WORD in [PATTERN [| PATTERN]...) COMMAN> read [-ers] [-a array] [-d delim] [-i text]> - cd [-L|[-P [-e]] [-@]] [dir] readarray [-d delim] [-n count] [-O origin]> - command [-pVv] command [arg ...] readonly [-aAf] [name[=value] ...] or reado> - compgen [-abcdefgjksuv] [-o option] [-A acti> return [n] - complete [-abcdefgjksuv] [-pr] [-DEI] [-o op> select NAME [in WORDS ... ;] do COMMANDS; d> - compopt [-o|+o option] [-DEI] [name ...] set [-abefhkmnptuvxBCHP] [-o option-name] [> - continue [n] shift [n] - coproc [NAME] command [redirections] shopt [-pqsu] [-o] [optname ...] - declare [-aAfFgilnrtux] [-p] [name[=value] .> source filename [arguments] - dirs [-clpv] [+N] [-N] suspend [-f] - disown [-h] [-ar] [jobspec ... | pid ...] test [expr] - echo [-neE] [arg ...] time [-p] pipeline - enable [-a] [-dnps] [-f filename] [name ...> times - eval [arg ...] trap [-lp] [[arg] signal_spec ...] - exec [-cl] [-a name] [command [arguments ...> true - exit [n] type [-afptP] name [name ...] - export [-fn] [name[=value] ...] or export -> typeset [-aAfFgilnrtux] [-p] name[=value] .> - false ulimit [-SHabcdefiklmnpqrstuvxPT] [limit] - fc [-e ename] [-lnr] [first] [last] or fc -s> umask [-p] [-S] [mode] - fg [job_spec] unalias [-a] name [name ...] - for NAME [in WORDS ... ] ; do COMMANDS; don> unset [-f] [-v] [-n] [name ...] - for (( exp1; exp2; exp3 )); do COMMANDS; don> until COMMANDS; do COMMANDS; done - function name { COMMANDS ; } or name () { CO> variables - Names and meanings of some shel> - getopts optstring name [arg] wait [-fn] [id ...] - hash [-lr] [-p pathname] [-dt] [name ...] while COMMANDS; do COMMANDS; done - help [-dms] [pattern ...] { COMMANDS ; } -``` - -You might notice that some of these built-ins (e.g., **echo** and **kill**) also exist as executables. - -``` -$ ls -l /bin/echo /bin/kill --rwxr-xr-x 1 root root 39256 Sep 5 06:38 /bin/echo --rwxr-xr-x 1 root root 30952 Aug 8 12:46 /bin/kill -``` - -One quick way to determine whether the command you are using is a bash built-in or not is to use the command “command”. Yes, the command is called “command”. Try it with a **-V** (capital V) option like this: - -``` -$ command -V command -command is a shell builtin -$ command -V echo -echo is a shell builtin -$ command -V date -date is hashed (/bin/date) -``` - -When you see a “command is hashed” message like the one above, that means that the command has been put into a hash table for quicker lookup. - -### **Looking for help in other shells** - -If you switch shells and try running “help”, you’ll notice that some support this command and others do not. You can run a command like this in bash to see what each of the shells on your system will tell you: - -``` -for shell in `ls /bin/*sh` -do - echo $shell - $shell -c "help" - echo =============== -done -``` - -This loop will try running the help command in each of the shells in /bin. The $shell -c (e.g., zsh -c) syntax will run just the single help command in that shell and then exit. - -### How to tell what shell you're currently using - -If you switch shells you can’t depend on $SHELL to tell you what shell you’re currently using because $SHELL is just an environment variable that is set when you log in and doesn't necessarily reflect your current shell. Try **ps -p $$** instead as shown in these examples: - -``` -$ ps -p $$ - PID TTY TIME CMD -18340 pts/0 00:00:00 bash <== -$ /bin/dash -$ ps -p $$ - PID TTY TIME CMD -19517 pts/0 00:00:00 dash <== -``` - -Built-ins are extremely useful and give each shell a lot of its character. If you use some particular shell all of the time, it’s easy to lose track of which commands are part of your shell and which are not. Differentiating a shell built-in from a Linux executable requires only a little extra effort. - -Join the Network World communities on [Facebook][3] and [LinkedIn][4] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3505818/how-to-tell-if-youre-using-a-bash-builtin-in-linux.html - -作者:[Sandra Henry-Stocker][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ -[b]: https://github.com/lujun9972 -[1]: https://www.networkworld.com/newsletters/signup.html -[2]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE20773&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage) -[3]: https://www.facebook.com/NetworkWorld/ -[4]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20191218 Introduction to automation with Bash scripts.md b/sources/tech/20191218 Introduction to automation with Bash scripts.md deleted file mode 100644 index f73c6e36c4..0000000000 --- a/sources/tech/20191218 Introduction to automation with Bash scripts.md +++ /dev/null @@ -1,164 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Introduction to automation with Bash scripts) -[#]: via: (https://opensource.com/article/19/12/automation-bash-scripts) -[#]: author: (David Both https://opensource.com/users/dboth) - -Introduction to automation with Bash scripts -====== -In the first article in this four-part series, learn how to create a -simple shell script and why they are the best way to automate tasks. -![Person using a laptop][1] - -Sysadmins, those of us who run and manage Linux computers most closely, have direct access to tools that help us work more efficiently. To help you use these tools to their maximum benefit to make your life easier, this series of articles explores using automation in the form of Bash shell scripts. It covers: - - * The advantages of automation with Bash shell scripts - * Why using shell scripts is a better choice for sysadmins than compiled languages like C or C++ - * Creating a set of requirements for new scripts - * Creating simple Bash shell scripts from command-line interface (CLI) programs - * Enhancing security through using the user ID (UID) running the script - * Using logical comparison tools to provide execution flow control for command-line programs and scripts - * Using command-line options to control script functionality - * Creating Bash functions that can be called from one or more locations within a script - * Why and how to license your code as open source - * Creating and implementing a simple test plan - - - -I previously wrote a series of articles about Bash commands and syntax and creating Bash programs at the command line, which you can find in the references section at the end of this article. But this series of four articles is as much about creating scripts (and some techniques that I find useful) as it is about Bash commands and syntax. - -### Why I use shell scripts - -In Chapter 9 of [_The Linux Philosophy for Sysadmins_][2], I write: - -> "A sysadmin is most productive when thinking—thinking about how to solve existing problems and about how to avoid future problems; thinking about how to monitor Linux computers in order to find clues that anticipate and foreshadow those future problems; thinking about how to make [their] job more efficient; thinking about how to automate all of those tasks that need to be performed whether every day or once a year. -> -> "Sysadmins are next most productive when creating the shell programs that automate the solutions that they have conceived while appearing to be unproductive. The more automation we have in place, the more time we have available to fix real problems when they occur and to contemplate how to automate even more than we already have." - -This first article explores why shell scripts are an important tool for the sysadmin and the basics of creating a very simple Bash script. - -### Why automate? - -Have you ever performed a long and complex task at the command line and thought, "Glad that's done. Now I never have to worry about it again!"? I have—frequently. I ultimately figured out that almost everything that I ever need to do on a computer (whether mine or one that belongs to an employer or a consulting customer) will need to be done again sometime in the future. - -Of course, I always think that I will remember how I did the task. But, often, the next time is far enough into the future that I forget that I have _ever_ done it, let alone _how_ to do it. I started writing down the steps required for some tasks on bits of paper, then thought, "How stupid of me!" So I transferred those scribbles to a simple notepad application on my computer, until one day, I thought again, "How stupid of me!" If I am going to store this data on my computer, I might as well create a shell script and store it in a standard location, like **/usr/local/bin** or **~/bin**, so I can just type the name of the shell program and let it do all the tasks I used to do manually. - -For me, automation also means that I don't have to remember or recreate the details of how I performed the task in order to do it again. It takes time to remember how to do things and time to type in all the commands. This can become a significant time sink for tasks that require typing large numbers of long commands. Automating tasks by creating shell scripts reduces the typing necessary to perform routine tasks. - -### Shell scripts - -Writing shell programs—also known as scripts—is the best strategy for leveraging my time. Once I write a shell program, I can rerun it as many times as I need to. I can also update my shell scripts to compensate for changes from one release of Linux to the next, installing new hardware and software, changing what I want or need to accomplish with the script, adding new functions, removing functions that are no longer needed, and fixing the not-so-rare bugs in my scripts. These kinds of changes are just part of the maintenance cycle for any type of code. - -Every task performed via the keyboard in a terminal session by entering and executing shell commands can and should be automated. Sysadmins should automate everything we are asked to do or decide needs to be done. Many times, doing the automation upfront saves me time the first time. - -One Bash script can contain anywhere from a few commands to many thousands. I have written Bash scripts with only one or two commands, and I have written a script with over 2,700 lines, more than half of which are comments. - -### Getting started - -Here's a trivial example of a shell script and how to create it. In my earlier series on Bash command-line programming, I used the example from every book on programming I have ever read: "Hello world." From the command line, it looks like this: - - -``` -[student@testvm1 ~]$ echo "Hello world" -Hello world -``` - -By definition, a program or shell script is a sequence of instructions for the computer to execute. But typing them into the command line every time is quite tedious, especially when the programs are long and complex. Storing them in a file that can be executed with a single command saves time and reduces the possibility for errors to creep in. - -I recommend trying the following examples as a non-root user on a test system or virtual machine (VM). Although the examples are harmless, mistakes do happen, and being safe is always wise. - -The first task is to create a file to contain your program. Use the **touch** command to create the empty file, **hello**, then make it executable: - - -``` -[student@testvm1 ~]$ touch hello -[student@testvm1 ~]$ chmod 774 hello -``` - -Now, use your favorite editor to add the following line to the file: - - -``` -`echo "Hello world"` -``` - -Save the file and run it from the command line. You can use a separate shell session to execute the scripts in this series: - - -``` -[student@testvm1 ~]$ ./hello -Hello world! -``` - -This is the simplest Bash program you may ever create—a single statement in a file. For this exercise, your complete shell script will be built around this simple Bash statement. The function of the program is irrelevant for this purpose, and this simple statement allows you to build a program structure—a template for other programs—without being concerned about the logic of a functional purpose. You can concentrate on the basic program structure and creating your template in a very simple way, and you can create and test the template itself rather than a complex functional program. - -### Shebang - -The single statement works fine as long as you use Bash or a shell compatible with the commands used in the script. If no shell is specified in the script, the default shell will be used to execute the script commands. - -The next task is to ensure that the script will run using the Bash shell, even if another shell is the default. This is accomplished with the shebang line. Shebang is the geeky way to describe the **#!** characters that explicitly specify which shell to use when running the script. In this case, that is Bash, but it could be any other shell. If the specified shell is not installed, the script will not run. - -Add the shebang line as the first line of the script, so now it looks like this: - - -``` -#!/usr/bin/bash -echo "Hello world!" -``` - -Run the script again—you should see no difference in the result. If you have other shells installed (such as ksh, csh, tcsh, zsh, etc.), start one and run the script again. - -### Scripts vs. compiled programs - -When writing programs to automate—well, everything—sysadmins should always use shell scripts. Because shell scripts are stored in ASCII text format, they can be viewed and modified by humans just as easily as they can by computers. You can examine a shell program and see exactly what it does and whether there are any obvious errors in the syntax or logic. This is a powerful example of what it means to be _open_. - -I know some developers consider shell scripts something less than "true" programming. This marginalization of shell scripts and those who write them seems to be predicated on the idea that the only "true" programming language is one that must be compiled from source code to produce executable code. I can tell you from experience that this is categorically untrue. - -I have used many languages, including BASIC, C, C++, Pascal, Perl, Tcl/Expect, REXX (and some of its variations, including Object REXX), many shell languages (including Korn, csh and Bash), and even some assembly language. Every computer language ever devised has had one purpose: to allow humans to tell computers what to do. When you write a program, regardless of the language you choose, you are giving the computer instructions to perform specific tasks in a specific sequence. - -Scripts can be written and tested far more quickly than compiled languages. Programs usually must be written quickly to meet time constraints imposed by circumstances or the pointy-haired boss. Most scripts that sysadmins write are to fix a problem, to clean up the aftermath of a problem, or to deliver a program that must be operational long before a compiled program could be written and tested. - -Writing a program quickly requires shell programming because it enables a quick response to the needs of the customer—whether that is you or someone else. If there are problems with the logic or bugs in the code, they can be corrected and retested almost immediately. If the original set of requirements is flawed or incomplete, shell scripts can be altered very quickly to meet the new requirements. In general, the need for speed of development in the sysadmin's job overrides the need to make the program run as fast as possible or to use as little as possible in the way of system resources like RAM. - -Most things sysadmins do take longer to figure out how to do than to execute. Thus, it might seem counterproductive to create shell scripts for everything you do. It takes some time to write the scripts and make them into tools that produce reproducible results and can be used as many times as necessary. The time savings come every time you can run the script without having to figure out (again) how to do the task. - -### Final thoughts - -This article didn't get very far with creating a shell script, but it did create a very small one. It also explored the reasons for creating shell scripts and why they are the most efficient option for the system administrator (rather than compiled programs). - -In the next article, you will begin creating a Bash script template that can be used as a starting point for other Bash scripts. The template will ultimately contain a Help facility, a GNU licensing statement, a number of simple functions, and some logic to deal with those options, as well as others that might be needed for the scripts that will be based on this template. - -### Resources  - - * [How to program with Bash: Syntax and tools][3] - * [How to program with Bash: Logical operators and shell expansions][4] - * [How to program with Bash: Loops][5] - - - -* * * - -_This series of articles is partially based on Volume 2, Chapter 10 of David Both's three-part Linux self-study course, [Using and Administering Linux—Zero to SysAdmin][6]._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/automation-bash-scripts - -作者:[David Both][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dboth -[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://www.both.org/?page_id=903 -[3]: https://opensource.com/article/19/10/programming-bash-syntax-tools -[4]: https://opensource.com/article/19/10/programming-bash-logical-operators-shell-expansions -[5]: https://opensource.com/article/19/10/programming-bash-loops -[6]: http://www.both.org/?page_id=1183 diff --git a/sources/tech/20191218 Linux desktops for minimalists- Getting started with LXQt and LXDE.md b/sources/tech/20191218 Linux desktops for minimalists- Getting started with LXQt and LXDE.md deleted file mode 100644 index 4d12d6c268..0000000000 --- a/sources/tech/20191218 Linux desktops for minimalists- Getting started with LXQt and LXDE.md +++ /dev/null @@ -1,72 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Linux desktops for minimalists: Getting started with LXQt and LXDE) -[#]: via: (https://opensource.com/article/19/12/lxqt-lxde-linux-desktop) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Linux desktops for minimalists: Getting started with LXQt and LXDE -====== -This article is part of a special series of 24 days of Linux desktops. -Both LXDE and LXQt aim to provide a lightweight desktop for users who -either need it or just prefer it, with minimal setup or configuration -required. -![Penguins walking on the beach ][1] - -Preserving and resurrecting old computers is a popular part of the Linux hacker's ethos, and one way to help make that possible is with a desktop environment that doesn't use up scarce system resources. After all, the fact that a current version of Linux can run effectively on a computer over 15 years old is quite a feat, but it doesn't make the CPU and RAM any better than the day they were slotted in. There are extremely light desktops available, but there's usually a catch: the user must assemble the parts. Fortunately, a number of lightweight desktops have appeared over the years in an attempt to provide a fast and light desktop with no setup required. - -Two early implementations of this idea were [LXDE][2] and [Razor-qt][3], the former based on GTK (the libraries used by GNOME) and the latter based on Qt (the libraries used by KDE). Coincidentally, the lead maintainer of LXDE discovered [the bliss that is Qt development][4] and decided to port (just as a side project!) the entire desktop to Qt. LXDE, the Qt port of it, and the Razor-qt project were combined to form [LXQt][5], although today, LXDE and LXQt coexist as separate projects. - -Whether you use LXDE or LXQt, their goals are the same: to provide a lightweight desktop for users who either need it or just prefer it, with minimal setup or configuration required. These are drop-in desktops for any Linux or BSD system, whether it's 15 years old, or a new Raspberry Pi, or a hefty workstation that was just assembled. I used LXQt for this article, but everything apart from the GUI toolkit and some application names applies equally to LXQt and LXDE. - -![LXQt on CentOS][6] - -You may find LXQt or LXDE included your distribution's software repository, or you can download and install a distribution that ships LXQt or LXDE as a default desktop. Before you do, though, be aware that an LX* desktop is meant to provide a full desktop experience, so many applications are installed along with the desktop. If you're already running another desktop, you may find yourself with redundant applications (two PDF readers, two media players, two file managers, and so on). If you just want to try the LXQt or LXDE desktop, consider using a desktop virtualization application, such as [GNOME Boxes][7]. - -After installing, log out of your current desktop session so you can log into your new desktop. By default, your session manager (KDM, GDM, or LightDM, depending on your setup) will continue to log you into your previous desktop, so you must override that before logging in. - -With GDM: - -![][8] - -With SDDM: - -![][9] - -### LXQt and LXDE desktop tour - -The desktop layout has a classic look that's familiar to anyone who's used KDE's Plasma desktop or, realistically, any computer within the past two decades. There's an application menu in the lower-left corner, a taskbar for pinned and active applications, and a system tray in the lower-right corner. Because this is a full desktop environment, a few lightweight but robust applications are included. There's a text editor, an excellent file manager called PCManFM on LXDE and PCManFM-Qt on LXQt, configuration panels, a terminal, theme settings, and so on. - -![LXDE desktop on Fedora][10] - -The goal, aside from being light on resources, is to be intuitive, and these desktops excel at that. This isn't the place to look for an innovative new desktop design. The LXDE and LXQt desktops feel like they've been around forever, gliding through user actions with ease, finding just the right balance between explanatory prompts and minimal design. All the default settings are sensible, and 90% of what most users need to do on a desktop is covered (I'm reserving a conservative 10% for unique personal tastes that nobody expects any desktop to guess). - -### To LXDE or to LXQt - -Linux power users know GTK from Qt and sometimes even _care_ about which one they use, but it seems everyone admits it's down to personal taste and, in the end, doesn't actually matter. If you have no preference between GTK and Qt, then whether you use LXDE or LXQt may as well be a flip of a coin. They each have the same admirable goal: to provide a full desktop experience to any Linux computer that needs one, regardless of processor power or amount of RAM. If you're a fan of simplicity, then both desktops will appeal to you, and you're likely to settle into the defaults without spending hours customizing or rearranging anything at all. Sometimes it's refreshing to not care about the details and get straight to work. LXDE and LXQt are determined to bring that convenience to you, so give one a try. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/lxqt-lxde-linux-desktop - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/community-penguins-osdc-lead.png?itok=BmqsAF4A (Penguins walking on the beach ) -[2]: http://lxde.org -[3]: https://web.archive.org/web/20160220061334/http://razor-qt.org/ -[4]: https://opensource.com/article/17/4/pyqt-versus-wxpython -[5]: http://lxqt.org -[6]: https://opensource.com/sites/default/files/uploads/advent-lxqt-file.jpg (LXQt on CentOS) -[7]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization -[8]: https://opensource.com/sites/default/files/advent-gdm_1.jpg -[9]: https://opensource.com/sites/default/files/advent-kdm_0.jpg -[10]: https://opensource.com/sites/default/files/uploads/advent-lxde.jpg (LXDE desktop on Fedora) diff --git a/sources/tech/20191218 Make sysadmin work on Fedora easier with screen.md b/sources/tech/20191218 Make sysadmin work on Fedora easier with screen.md deleted file mode 100644 index 1523293a7d..0000000000 --- a/sources/tech/20191218 Make sysadmin work on Fedora easier with screen.md +++ /dev/null @@ -1,165 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Make sysadmin work on Fedora easier with screen) -[#]: via: (https://fedoramagazine.org/make-sysadmin-work-on-fedora-easier-with-screen/) -[#]: author: (Carmine Zaccagnino https://fedoramagazine.org/author/carzacc/) - -Make sysadmin work on Fedora easier with screen -====== - -![][1] - -When you manage a Linux instance, you’ll find that your job is made much easier by the many tools designed specifically to deal with something specific within the system. For example, if you need to install packages, you have easy-to-use package managers that make that a breeze. If you need to create, resize or delete filesystems, you can do so using tools that are built to be used by humans. The same goes for managing services and browsing logs with [systemd][2] using the _systemctl_ and _journalctl_ commands respectively. The _screen_ tool is another such example. - -You can run all of those tools directly at the command line interface. But if you’re connecting to a server remotely using SSH, sometimes you need another layer between you and the operating system so the command you’re running doesn’t stop if your remote connection terminates. Sysadmins do this to prevent sudden termination in case of a connection issue, but also on purpose to run a command that needs to keep running indefinitely in the background. Enter the _screen_ utility. - -### Introducing screen - -The _screen_ tool allows you to have multiple sessions (called _screens_) that are independent from each other and that you can name, leave and join as you desire. It’s multi-tasking for the remote CLI. You can get started with it simply by running this command: - -``` -$ screen -``` - -The command creates a screen and connect you to it: your current session is now a screen. You can run any command that does something and doesn’t automatically terminate after a few seconds. For example, you might call a web app executable or a game server. Then press **Ctrl+A** and, right after that, the **D** key and you will _detach_ from the screen, leaving it running in the background. - -The **Ctrl+A** combination, given that it is part of every _screen_ command, is often shortened in documentation to **C-a**. Then the _detach_ command used earlier can be described simply as **C-a d**. - -#### Getting in and out of sessions - -If you want to connect to that screen again, run _screen -r_ and you will _attach_ to that screen. Just running **screen** will create a new screen, and subsequent _screen -r_ commands will print out something like this: - -``` -There are several suitable screens on: - 5589.pts-0.hostname (Detached) - 5536.pts-0.hostname (Detached) - Type "screen [-d] -r [pid.]tty.host" to resume one of them. -``` - -You can then choose whether to resume the first or the second screen you created by running either one of these commands: - -``` -$ screen -r 5536 -$ screen -r 5589 -``` - -Adding the rest of the name of the string is optional in this case. - -#### Named screens - -If you know you’ll have multiple screens, you might want to be able to connect to a screen using a name you choose. This is easier than choosing from a list of numbers that only reflect the process IDs of the screen sessions. To do that, use the _-S_ option as in the following example: - -``` -$ screen -S mywebapp -``` - -Then you can resume that screen in the future using this command: - -``` -$ screen -r mywebapp -``` - -#### Starting a process in the background using screen - -An optional argument is the command to be executed inside the created session. For example: - -``` -$ screen -S session_name command args -``` - -This would be the same as running: - -``` -$ screen -S session_name -``` - -…And then running this command inside the _screen_ session: - -``` -$ command args -``` - -The screen session will terminate when the command finishes its execution. - -This is made particularly useful by passing the **-dm** option, which starts the screen in the background without attaching to it. For example, you can copy a very large file in the background by running this command: - -``` -$ screen -S copy -d -m cp /path/to/file /path/to/output -``` - -### Other screen features - -Now that you’ve seen the basics, let’s see some of the other most commonly used screen features. - -#### Easily switching between windows in a screen - -When inside a screen, you can create a new window using **C-a c**. After you do that, you can switch between the windows using **C-a n** to go to the next one and **C-a p** to go to the previous window. You can destroy (kill) the current window with **C-a k**. - -#### Copying and pasting text - -The screen tool also enables you to copy any text on the screen and paste it later wherever you can type some text. - -The **C-a [** keybinding frees your cursor of any constraints and lets it go anywhere your will takes it using the arrow keys on your keyboard. To select and copy text, move to the start of the string you want to copy, and press **Enter** on the keyboard. Then move the cursor to the end of the text you want to copy and press **Enter** again. - -After you’ve done that, use **C-a ]** to paste that text in your shell. Or you can open a text editor like _vim_ or _nano_ and paste the text you copied there. - -### Important notes about screen - -Here are some other tips to keep in mind when using this utility. - -#### Privileged sessions vs. sudo inside a screen - -What if you need to run a command with root privileges inside screen? You can run either of these commands: - -``` -$ screen -S sessionname sudo command -$ sudo screen -S sessionname command -``` - -Notice that the second command is like running this command: - -``` -# screen -S sessionname command -``` - -Seeing things this way makes it a lot more obvious coupled with the fact that each screen is associated to a user: - - * The first one creates a screen with root privileges that can be accessed by the current user even if, within that screen, they switch to another user or _root_ using the _sudo -i_ command. - * The second one creates a screen that can only be accessed by the _root_ user, or by running _sudo screen -r_ as a user with the [appropriate _sudo_ access][3]. - - - -#### Notes about screen in systemd units - -You might be tempted to run a screen session in the background as part of a systemd unit executed at startup, just like any Unix daemon. That way you can resume the screen session and interact with whatever you ran that way. That can work, but you need to consider that it requires the right setup. - -By default, [systemd assumes][4] services are either _oneshot,_ meaning they set up something and then shut down, or _simple_. A service is simple by default when you create a unit file with no _Type_. What you actually need to do is to set the _Type_ to _forking_, which describes _screen_‘s actual behavior when the **-dm** option is passed. It starts the process and then forks itself, leaving the process running in the background while the foreground process closes. - -If you don’t set that, that _screen_ behavior is interpreted by systemd as the service exiting or failing. This causes systemd to kill the background process when the foreground process exits, which is not what you want. - -* * * - -_Photo by [Vlad Tchompalov][5] on [Unsplash][6]._ - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/make-sysadmin-work-on-fedora-easier-with-screen/ - -作者:[Carmine Zaccagnino][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/carzacc/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/12/screen-816x345.jpg -[2]: https://fedoramagazine.org/what-is-an-init-system/ -[3]: https://fedoramagazine.org/howto-use-sudo/ -[4]: https://www.freedesktop.org/software/systemd/man/systemd.service.html -[5]: https://unsplash.com/@tchompalov?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText -[6]: https://unsplash.com/s/photos/screen?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20191219 An Actionable Guide to Enhance Your Online Privacy With Tor.md b/sources/tech/20191219 An Actionable Guide to Enhance Your Online Privacy With Tor.md deleted file mode 100644 index 36fb202b9e..0000000000 --- a/sources/tech/20191219 An Actionable Guide to Enhance Your Online Privacy With Tor.md +++ /dev/null @@ -1,260 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (An Actionable Guide to Enhance Your Online Privacy With Tor) -[#]: via: (https://itsfoss.com/tor-guide/) -[#]: author: (Community https://itsfoss.com/author/itsfoss/) - -An Actionable Guide to Enhance Your Online Privacy With Tor -====== - -In a world where technology is rapidly evolving, companies are gathering data and information from users in order to optimize the functionality of their applications as much as possible, privacy has slowly begun to fade and look like a myth. - -Many people believe that completely concealing their identity online is a difficult process that cannot be achieved. But of course, for security experts and for those who are optimistic that anonymity will not be lost, the answer is that we can enhance anonymity on the Internet. - -This can clearly be achieved with the help of _Tor_. Tor stands for The Onion Routing. - -Tor is a free and open source software developed by the [Tor project][1], a non-profit organization focusing on the freedom and privacy of users on the Internet. - -![Tor Onion][2] - -Let’s see below how you can enhance our online privacy with Tor. - -### What is Tor? - -As I mentioned before, Tor is a free open source software which defends users’ privacy. Specifically, The Onion Router software is being used by students, companies, universities, reporters who maybe want to share an idea anonymously for many years. In order to conceal users’ identities, Tor routes traffic through a worldwide overlay network which consisting of thousand of relays. - -![Tor Network][3] - -In addition, it has a very handy functionality as it encrypts the data multiple times, including the next IP address for the node it is intended for, and sends it through a virtual circuit that includes a random node. Each node decrypts a layer of encrypted information in order to reveal the next node. The result is that the remaining encrypted information will be decrypted at the last node without revealing the source IP address. This process builds the Tor circuit. - -### How to install Tor on Linux - -Since Tor is one of the most popular software in the open source community, it can be found in almost every Linux distribution’s repository. - -For Ubuntu-based distributions, it is available in the universe repository. We have a separate article on [installing Tor browser on Ubuntu][4] which you may refer. It also has a few tips on using the browser that you may find useful. - -I am using Debian 10 so I’ll mention the steps for installing Tor on Debian: - -All you have to do is to add the backport repository to our sources.list and then we can easily install Tor and its components. Use the following commands: - -``` -echo "deb http://deb.debian.org/debian buster-backports main contrib" > /etc/apt/sources.list.d/buster-backports.list - -sudo apt update -sudo apt install tor torbrowser-launcher -``` - -Remember! - -Do not run Tor as root, as it is not secure for your operating system. It is recommended to run it as a normal user. - -### What can you achieve with Tor? - -As we move on, you will see numerous privacy enhancements that can be impressively accomplished with Tor. - -Particularly, below we will see the topics that will be covered: - - * Explore the Tor Network with Tor Browser - * Use Tor through Firefox - - - -Note: It would be helpful to take into consideration that Tor can be used alongside with many applications, so anyone can privately use the application she/he desires. - - * Create a hidden Tor service - * Create a middle Tor relay - - - -#### Explore the Tor network with Tor browser - -To connect to the Tor network through the Tor browser, open the application that will be with the rest of your internet applications or type in the terminal: - -``` -torbrowser-launcher -``` - -Initially, a window will appear, which allows some settings to be modified in the connection. For example, for users who wish to access the Tor network, and their country does not allow them, they must have the necessary settings for a successful connection. - -![Tor Network Settings][5] - -You can always request a bridge from the Tor Database, [BridgeDB][6]. - -If everything is under control, all that’s left is to connect. - -![Tor Browser][7] - -_**Welcome to Tor..**_ - -It is worth mentioning that it would be helpful and safe to avoid adding extensions to Tor Browser as it can reveal user’s real location and IP address to the website operators. - -It is also recommended to avoid downloading torrents, to avoid IP revealing. - -_**Let the exploration begin ..**_ - -#### How to use Tor through Firefox - -You don’t always need to use the Tor browser. The [awesome Firefox][8] allows you to use Tor network. - -In order to connect to tor network via Firefox, you must first open the tor service. To do this, execute the following command: - -``` -sudo service tor start -``` - -To ensure that the tor is active, you can observe the open links. Below you can see the running port, which is the 9050. - -``` -netstat -nvlp -``` - -Here’s the output: - -``` -.. .. .. .. .. - -tcp 0 0 127.0.0.1:9050 0.0.0.0:* LISTEN -``` - -The only thing left to do is to set Firefox to be connected through Tor proxy. - -Go to Preferences → General → Network Proxy and set the localhost IP and Tor listening port to SOCKS v5 as shows below: - -![Setting Tor in Firefox][9] - -#### How to create a Tor Hidden Service - -Ttry to search for the term “Hidden Wiki”, you will notice that you will not find any hidden content. This is because the content discussed above does not represent the standard domain, but a top-level domain that can be found through Tor. This domain is .onion. - -So let’s see how you can create your own _**secret onion service**_. - -With the installation of Tor, torrc was created. The torrc is the tor configuration file, and its path is /etc/tor/torrc. - -Note: In order for modification to be applied, the ‘#’ symbol must be removed from the start of the line. - -To create the onion service you need to modify the configuration file so that after its modification it contains our service. - -You can open the file with a [command line text editor][10] of your choice. Personally, my favourite text editor is Vim. If Vim is used and you have any difficulty, you can take a look at the following article to make the situation clearer. - -In torrc you will find a lot of content, which can, in any case, be analyzed in a related article. For the time being, we are interested in the line mentioned by “Hidden Service”. - -![][11] - -At first glance, it can be understood that a path, a network address and finally two doors should be set. - -``` -HiddenServiceDir /var/lib/tor/hidden_service/ -``` - -‘HiddenServiceDir’ denotes the path the hostname will generate, which will then be the user visit point to the secret service created. - -HiddenServicePort 80 127.0.0.1:80 - -‘HiddenServicePort’ indicates which address and port the .onion service will be connected to. - -For example, below is the creation of a hidden service named linuxhandbook, which as a port destination will have port 80, as the address will have localhost’s IP and port 80 respectively. - -![][12] - -Finally, the only thing left to complete the creation is to restart the tor service. Once the tor is restarted, the /var/lib/tor// path will have both the public and private secret service key, as well as the hostname file. The ‘Hostname’ file contains the .onion link provided for our onion site. - -Here is the output of my ‘hostname’ file. - -``` -ogl3kz3nfckz22xp4migfed76fgbofwueytf7z6d2tnlh7vuto3zjjad.onion -``` - -Just visit this link through your Tor Browser and you will see your up and running server based on a .onion domain. - -![Sample Onion Web Page][13] - -#### How to Create a Middle Tor Relay - -The Tor network, as mentioned before, is an open network, which consists of many nodes. Tor nodes are a creation of volunteers, that is, contributors to enhancing privacy. It is worth noting that the nodes are over 7000 and they are getting bigger day by day. Everyone’s contribution is always acceptable as we expand one of the predominantly largest networks worldwide. - -Tor contains Guard, Middle and Exit Relays. A Guard Relay is the the first relay of a Tor circuit. The Middle Relay is the second hop of the circuit. Guard and Middle Relays are listed in the public list of Tor relays. Exit Relay is the final relay of a tor circuit. It is a crucial relay, as it sends traffic out its destination. - -All relays are meaningful but in this article, we will cover about Middle relays. - -Here’s and image showing middle-relay traffic the last two months. - -![][14] - -Lets see how we can create a middle relay. - -Once again, in order to create your own middle relay, you have to modify the torrc file. - -In any case, as I mentioned above, you can uncomment the lines when you need your configuration to be enabled. - -However, it is feasible to copy the following lines and then modify them. - -``` -#change the nickname “Linuxhandbook” to a name that you like -Nickname Linuxhandbook -ORPort 443 -ExitRelay 0 -SocksPort 0 -ControlSocket 0 -#change the email address below and be aware that it will be published -ContactInfo [email protected] -``` - -An explanation should make the situation clearer. - - * Nickname: Set your own relay name. - * ORPort: Set a port which will be the relay’s listening port. - * ExitRelay: By default, is set to 0, we want to create a middle relay. - - - -Note: tor service needs to be open. - -You should see your middle-relay up and running in Tor Metrics after a few couple of hours. Therefore, it usually takes 3 hours to be published, according to [Tormetrics][15]. - -Warning! - -For sure, some of you may have heard of the term “Deep Web”, “Hidden Wiki” and many other services that you haven’t been able to visit yet. Besides, you may have heard that there is content posted on the Tor network which may be illegal. - -In the Tor network, one can find almost anything, such as forums with any kind of discussion. Quite right, since there is no censorship in a network whose entities are anonymous. This is both good and bad at the same time. - -I am not going to give sermons here about what you should use and what you should not use. I believe that you are sensible enough to make that decision. - -In conclusion, you can thoroughly see, that one can, in any case, enhance their privacy as well as defend themselves from Internet censorship. I would love to hear your opinion about Tor. - -##### Panos - -Penetration Tester and Operating System developer - -Panos’ love for Free Open Source Software is invaluable. In his spare time, he observes the night sky with his telescope. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/tor-guide/ - -作者:[Community][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/itsfoss/ -[b]: https://github.com/lujun9972 -[1]: https://www.torproject.org/ -[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/12/tor_onion.jpg?ssl=1 -[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/tor-network-diagram.png?ssl=1 -[4]: https://itsfoss.com/install-tar-browser-linux/ -[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/12/tor_browser.png?ssl=1 -[6]: https://www.bridgedb.org/ -[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/12/tor_firefox.jpg?ssl=1 -[8]: https://itsfoss.com/why-firefox/ -[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/tor_settings.png?ssl=1 -[10]: https://itsfoss.com/command-line-text-editors-linux/ -[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/create_tor_relay.jpg?ssl=1 -[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/12/create_tor_relay_2.jpg?ssl=1 -[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/onion_web_page.jpg?ssl=1 -[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/12/tor_relay.jpg?ssl=1 -[15]: https://metrics.torproject.org/ diff --git a/sources/tech/20191219 Creating a Bash script template.md b/sources/tech/20191219 Creating a Bash script template.md deleted file mode 100644 index 3cfd549c3d..0000000000 --- a/sources/tech/20191219 Creating a Bash script template.md +++ /dev/null @@ -1,236 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Creating a Bash script template) -[#]: via: (https://opensource.com/article/19/12/bash-script-template) -[#]: author: (David Both https://opensource.com/users/dboth) - -Creating a Bash script template -====== -In the second article in this series, create a fairly simple template -that you can use as a starting point for other Bash programs, then test -it. -![A person programming][1] - -In the [first article][2] in this series, you created a very small, one-line Bash script and explored the reasons for creating shell scripts and why they are the most efficient option for the system administrator, rather than compiled programs. - -In this second article, you will begin creating a Bash script template that can be used as a starting point for other Bash scripts. The template will ultimately contain a Help facility, a licensing statement, a number of simple functions, and some logic to deal with those options and others that might be needed for the scripts that will be based on this template. - -### Why create a template? - -Like automation in general, the idea behind creating a template is to be the "[lazy sysadmin][3]." A template contains the basic components that you want in all of your scripts. It saves time compared to adding those components to every new script and makes it easy to start a new script. - -Although it can be tempting to just throw a few command-line Bash statements together into a file and make it executable, that can be counterproductive in the long run. A well-written and well-commented Bash program with a Help facility and the capability to accept command-line options provides a good starting point for sysadmins who maintain the program, which includes the programs that _you_ write and maintain. - -### The requirements - -You should always create a set of requirements for every project you do. This includes scripts, even if it is a simple list with only two or three items on it. I have been involved in many projects that either failed completely or failed to meet the customer's needs, usually due to the lack of a requirements statement or a poorly written one. - -The requirements for this Bash template are pretty simple: - - 1. Create a template that can be used as the starting point for future Bash programming projects. - 2. The template should follow standard Bash programming practices. - 3. It must include: - * A heading section that can be used to describe the function of the program and a changelog - * A licensing statement - * A section for functions - * A Help function - * A function to test whether the program user is root - * A method for evaluating command-line options - - - -### The basic structure - -A basic Bash script has three sections. Bash has no way to delineate sections, but the boundaries between the sections are implicit. - - * All scripts must begin with the shebang (**#!**), and this must be the first line in any Bash program. - * The functions section must begin after the shebang and before the body of the program. As part of my need to document everything, I place a comment before each function with a short description of what it is intended to do. I also include comments inside the functions to elaborate further. Short, simple programs may not need functions. - * The main part of the program comes after the function section. This can be a single Bash statement or thousands of lines of code. One of my programs has a little over 200 lines of code, not counting comments. That same program has more than 600 comment lines. - - - -That is all there is—just three sections in the structure of any Bash program. - -### Leading comments - -I always add more than this for various reasons. First, I add a couple of sections of comments immediately after the shebang. These comment sections are optional, but I find them very helpful. - -The first comment section is the program name and description and a change history. I learned this format while working at IBM, and it provides a method of documenting the long-term development of the program and any fixes applied to it. This is an important start in documenting your program. - -The second comment section is a copyright and license statement. I use GPLv2, and this seems to be a standard statement for programs licensed under GPLv2. If you use a different open source license, that is fine, but I suggest adding an explicit statement to the code to eliminate any possible confusion about licensing. Scott Peterson's article [_The source code is the license_][4] helps explain the reasoning behind this. - -So now the script looks like this: - - -``` -#!/bin/bash -################################################################################ -#                              scriptTemplate                                  # -#                                                                              # -# Use this template as the beginning of a new program. Place a short           # -# description of the script here.                                              # -#                                                                              # -# Change History                                                               # -# 11/11/2019  David Both    Original code. This is a template for creating     # -#                           new Bash shell scripts.                            # -#                           Add new history entries as needed.                 # -#                                                                              # -#                                                                              # -################################################################################ -################################################################################ -################################################################################ -#                                                                              # -#  Copyright (C) 2007, 2019 David Both                                         # -#  [LinuxGeek46@both.org][5]                                                        # -#                                                                              # -#  This program is free software; you can redistribute it and/or modify        # -#  it under the terms of the GNU General Public License as published by        # -#  the Free Software Foundation; either version 2 of the License, or           # -#  (at your option) any later version.                                         # -#                                                                              # -#  This program is distributed in the hope that it will be useful,             # -#  but WITHOUT ANY WARRANTY; without even the implied warranty of              # -#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               # -#  GNU General Public License for more details.                                # -#                                                                              # -#  You should have received a copy of the GNU General Public License           # -#  along with this program; if not, write to the Free Software                 # -#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   # -#                                                                              # -################################################################################ -################################################################################ -################################################################################ - -echo "hello world!" -``` - -Run the revised program to verify that it still works as expected. - -### About testing - -Now is a good time to talk about testing. - -> "_There is always one more bug."_ -> — Lubarsky's Law of Cybernetic Entomology - -Lubarsky—whoever that might be—is correct. You can never find all the bugs in your code. For every bug I find, there always seems to be another that crops up, usually at a very inopportune time. - -Testing is not just about programs. It is also about verification that problems—whether caused by hardware, software, or the seemingly endless ways users can find to break things—that are supposed to be resolved actually are. Just as important, testing is also about ensuring that the code is easy to use and the interface makes sense to the user. - -Following a well-defined process when writing and testing shell scripts can contribute to consistent and high-quality results. My process is simple: - - 1. Create a simple test plan. - 2. Start testing right at the beginning of development. - 3. Perform a final test when the code is complete. - 4. Move to production and test more. - - - -#### The test plan - -There are lots of different formats for test plans. I have worked with the full range—from having it all in my head; to a few notes jotted down on a sheet of paper; and all the way to a complex set of forms that require a full description of each test, which functional code it would test, what the test would accomplish, and what the inputs and results should be. - -Speaking as a sysadmin who has been (but is not now) a tester, I try to take the middle ground. Having at least a short written test plan will ensure consistency from one test run to the next. How much detail you need depends upon how formal your development and test functions are. - -The sample test plan documents I found using Google were complex and intended for large organizations with very formal development and test processes. Although those test plans would be good for people with "test" in their job title, they do not apply well to sysadmins' more chaotic and time-dependent working conditions. As in most other aspects of the job, sysadmins need to be creative. So here is a short list of things to consider including in your test plan. Modify it to suit your needs: - - * The name and a short description of the software being tested - * A description of the software features to be tested - * The starting conditions for each test - * The functions to follow for each test - * A description of the desired outcome for each test - * Specific tests designed to test for negative outcomes - * Tests for how the program handles unexpected inputs - * A clear description of what constitutes pass or fail for each test - * Fuzzy testing, which is described below - - - -This list should give you some ideas for creating your test plans. Most sysadmins should keep it simple and fairly informal. - -#### Test early—test often - -I always start testing my shell scripts as soon as I complete the first portion that is executable. This is true whether I am writing a short command-line program or a script that is an executable file. - -I usually start creating new programs with the shell script template. I write the code for the Help function and test it. This is usually a trivial part of the process, but it helps me get started and ensures that things in the template are working properly at the outset. At this point, it is easy to fix problems with the template portions of the script or to modify it to meet needs that the standard template does not. - -Once the template and Help function are working, I move on to creating the body of the program by adding comments to document the programming steps required to meet the program specifications. Now I start adding code to meet the requirements stated in each comment. This code will probably require adding variables that are initialized in that section of the template—which is now becoming a shell script. - -This is where testing is more than just entering data and verifying the results. It takes a bit of extra work. Sometimes I add a command that simply prints the intermediate result of the code I just wrote and verify that. For more complex scripts, I add a **-t** option for "test mode." In this case, the internal test code executes only when the **-t** option is entered on the command line. - -#### Final testing - -After the code is complete, I go back to do a complete test of all the features and functions using known inputs to produce specific outputs. I also test some random inputs to see if the program can handle unexpected input. - -Final testing is intended to verify that the program is functioning essentially as intended. A large part of the final test is to ensure that functions that worked earlier in the development cycle have not been broken by code that was added or changed later in the cycle. - -If you have been testing the script as you add new code to it, you may think there should not be any surprises during the final test. Wrong! There are always surprises during final testing. Always. Expect those surprises, and be ready to spend time fixing them. If there were never any bugs discovered during final testing, there would be no point in doing a final test, would there? - -#### Testing in production - -Huh—what? - -> "Not until a program has been in production for at least six months will the most harmful error be discovered." -> — Troutman's Programming Postulates - -Yes, testing in production is now considered normal and desirable. Having been a tester myself, this seems reasonable. "But wait! That's dangerous," you say. My experience is that it is no more dangerous than extensive and rigorous testing in a dedicated test environment. In some cases, there is no choice because there is no test environment—only production. - -Sysadmins are no strangers to the need to test new or revised scripts in production. Anytime a script is moved into production, that becomes the ultimate test. The production environment constitutes the most critical part of that test. Nothing that testers can dream up in a test environment can fully replicate the true production environment. - -The allegedly new practice of testing in production is just the recognition of what sysadmins have known all along. The best test is production—so long as it is not the only test. - -#### Fuzzy testing - -This is another of those buzzwords that initially caused me to roll my eyes. Its essential meaning is simple: have someone bang on the keys until something happens, and see how well the program handles it. But there really is more to it than that. - -Fuzzy testing is a bit like the time my son broke the code for a game in less than a minute with random input. That pretty much ended my attempts to write games for him. - -Most test plans utilize very specific input that generates a specific result or output. Regardless of whether the test defines a positive or negative outcome as a success, it is still controlled, and the inputs and results are specified and expected, such as a specific error message for a specific failure mode. - -Fuzzy testing is about dealing with randomness in all aspects of the test, such as starting conditions, very random and unexpected input, random combinations of options selected, low memory, high levels of CPU contending with other programs, multiple instances of the program under test, and any other random conditions that you can think of to apply to the tests. - -I try to do some fuzzy testing from the beginning. If the Bash script cannot deal with significant randomness in its very early stages, then it is unlikely to get better as you add more code. This is a good time to catch these problems and fix them while the code is relatively simple. A bit of fuzzy testing at each stage is also useful in locating problems before they get masked by even more code. - -After the code is completed, I like to do some more extensive fuzzy testing. Always do some fuzzy testing. I have certainly been surprised by some of the results. It is easy to test for the expected things, but users do not usually do the expected things with a script. - -### Previews of coming attractions - -This article accomplished a little in the way of creating a template, but it mostly talked about testing. This is because testing is a critical part of creating any kind of program. In the next article in this series, you will add a basic Help function along with some code to detect and act on options, such as **-h**, to your Bash script template. - -### Resources - - * [How to program with Bash: Syntax and tools][6] - * [How to program with Bash: Logical operators and shell expansions][7] - * [How to program with Bash: Loops][8] - - - -* * * - -_This series of articles is partially based on Volume 2, Chapter 10 of David Both's three-part Linux self-study course, [Using and Administering Linux—Zero to SysAdmin][9]._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/bash-script-template - -作者:[David Both][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dboth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb (A person programming) -[2]: https://opensource.com/article/19/12/introduction-automation-bash-scripts -[3]: https://opensource.com/article/18/7/how-be-lazy-sysadmin -[4]: https://opensource.com/article/17/12/source-code-license -[5]: mailto:LinuxGeek46@both.org -[6]: https://opensource.com/article/19/10/programming-bash-syntax-tools -[7]: https://opensource.com/article/19/10/programming-bash-logical-operators-shell-expansions -[8]: https://opensource.com/article/19/10/programming-bash-loops -[9]: http://www.both.org/?page_id=1183 diff --git a/sources/tech/20191219 Go mouseless with the Linux Ratpoison window manager.md b/sources/tech/20191219 Go mouseless with the Linux Ratpoison window manager.md deleted file mode 100644 index fa66d18314..0000000000 --- a/sources/tech/20191219 Go mouseless with the Linux Ratpoison window manager.md +++ /dev/null @@ -1,107 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Go mouseless with the Linux Ratpoison window manager) -[#]: via: (https://opensource.com/article/19/12/ratpoison-linux-desktop) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Go mouseless with the Linux Ratpoison window manager -====== -This article is part of a special series of 24 days of Linux desktops. -If you'd rather live in a terminal all day and avoid mousing around, the -Ratpoison window manager is the solution for you. -![Buildings with different color windows][1] - -Maybe you don't like desktops. Maybe even a lightweight window manager seems excessive to you. Maybe all you really use is a graphical user interface (GUI) application or two, and you're otherwise perfectly happy living in a terminal all day. If one or more of these sentiments sound familiar, then [Ratpoison][2] is the solution. - -![Ratpoison][3] - -The Ratpoison window manager models itself after [GNU Screen][4]. All window controls are performed with keyboard shortcuts, so you don't have to grab the mouse just to move a window out of your way. The trade-off is that it's impossibly minimalistic, which is, conveniently, also its greatest strength. - -### Installing Ratpoison - -Install Ratpoison from your distribution's software repository. After installing it, log out of your current desktop session so you can log into your new one. By default, your session manager (KDM, GDM, LightDM, or XDM, depending on your setup) will continue to log you into your previous desktop, so you must override that before logging in. - -With GDM: - -![][5] - -With SDDM: - -![][6] - -### Ratpoison desktop tour - -The first time you log into Ratpoison, you are greeted by a black screen with some text in the upper-right corner telling you that you can press **Ctrl+t** for help. - -That's all there is to the Ratpoison desktop. - -### Interacting with Ratpoison - -Ratpoison documentation uses Emacs-style notation for keyboard controls, so I'll use the same notation in this article. If you're unfamiliar with Emacs or GNU Screen, it can look confusing at first, so here's explicit instruction on how to "decode" this style of notation. The Control key on your keyboard is written as **C-**. To trigger Ratpoison's command mode, you press **C-t**, which means that you press **Ctrl+t**. - -Since the **C-t** shortcut puts you into command mode, it's expected that some other key sequence will follow. For instance, to launch an xterm window, press **Ctrl+t**, just as you would when opening a new tab in a web browser, then press **c**. This may feel a little unnatural at first, because most of the keyboard shortcuts you're used to probably involve only one action. Ratpoison (and GNU Screen and Emacs) more often involve two. - -The first application you probably should launch is either Emacs or a terminal. - -In Ratpoison, your terminal is your exclusive gateway to the rest of the computer because there's no application menu or icons to click. The default terminal is the humble xterm, and it's available with the **C-t c** shortcut (I remember the **c** as being short for "console"). - -#### Launching applications - -I usually start with Emacs instead, because it has most of the features I use anyway, including the **shell** terminal and the **dired** file manager. To start an arbitrary application in Ratpoison, press **C-t** and then the **!** (exclamation point) symbol. This provides a prompt in the upper-right corner of the screen. Type the command for the application you want to start and press **Return** or **Enter** to launch it. - -#### Switching windows - -Each application you launch takes over the entire screen by default. That means if [urxvt][7] is running, and then you launch Emacs, you can no longer interact with urxvt. Because switching back and forth between two application windows is a pretty common task, Ratpoison assigns it to the same keystroke as your usual Ratpoison command: **C-t C-t**. That means you press **Ctrl+t** once, and then **Ctrl+t** a second time. This is a toggle, like the default (at least in KDE and GNOME) behavior of a quick **Alt+Tab**. - -To cycle through all open windows, use **C-t n** for _next_ and **C-t p** for _previous_. - -#### Tiling window manager - -You're free to use Ratpoison as a full-screen viewscreen, but most of us are used to seeing more than one window at a time. To allow that, Ratpoison lets you split your screen into frames or tiles and launch an application within each space. - -![Ratpoison in split-screen mode][8] - -With at least one application open, you can split the screen horizontally with **C-t s** (that's a lowercase "s") or vertically with **C-t S** (that's a capital "S"). - -To switch to another frame, use **C-t Tab**. - -To remove another frame, press **C-t R**. - -#### Moving windows in split-screen mode - -Rearranging frames when Ratpoison has been split into several parts is done with the **Ctrl** key and a corresponding **Arrow** key. For instance, suppose you have a vertical split in the top half of your screen and a single frame in the bottom half. If an application is in the top-left frame, and you want to move it to the lower half of the screen, then—with that application active (use **C-t Tab** to get there)—press **C-t** to enter command mode and then **C-Down** (that's **Ctrl** with the **Down arrow** key). The application moves to the bottom half of the screen, with the application that took up the bottom half moving into the top-left. - -To move that application to the top-right frame instead, press **C-t Right** (**Ctrl** with the **Right arrow** key). - -To remove the top-left frame entirely, use **C-t R**. This doesn't kill the application in the frame, it only removes the frame from your viewport. The application that once occupied the frame is sent to the background and can be reached by cycling through the windows as usual (**C-t n**, for instance). - -### Why you need to try Ratpoison - -Ratpoison is a great example of an early (but current) tiling window manager. Other window managers like it exist, and some desktops even borrow concepts from this tradition by offering tiling features (KWin in KDE, for example, has an option to spawn new windows in tiles across the desktop). - -If you've never used a tiling window manager, you owe it to yourself to try at least once. First, make it a goal to use Ratpoison. Then make it a goal to get through a whole afternoon without your mouse. Once you get the hang of it, you might be surprised at how quickly you can work. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/ratpoison-linux-desktop - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/colors-colorful-box-rectangle.png?itok=doWmqCdf (Buildings with different color windows) -[2]: https://www.nongnu.org/ratpoison/ -[3]: https://opensource.com/sites/default/files/uploads/advent-ratpoison.png (Ratpoison) -[4]: https://opensource.com/article/17/3/introduction-gnu-screen -[5]: https://opensource.com/sites/default/files/advent-gdm_1.jpg -[6]: https://opensource.com/sites/default/files/advent-kdm_0.jpg -[7]: https://opensource.com/article/19/10/why-use-rxvt-terminal -[8]: https://opensource.com/sites/default/files/uploads/advent-ratpoison-split.jpg (Ratpoison in split-screen mode) diff --git a/sources/tech/20191220 How to add a Help facility to your Bash program.md b/sources/tech/20191220 How to add a Help facility to your Bash program.md deleted file mode 100644 index d51466411f..0000000000 --- a/sources/tech/20191220 How to add a Help facility to your Bash program.md +++ /dev/null @@ -1,346 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to add a Help facility to your Bash program) -[#]: via: (https://opensource.com/article/19/12/help-bash-program) -[#]: author: (David Both https://opensource.com/users/dboth) - -How to add a Help facility to your Bash program -====== -In the third article in this series, learn about using functions as you -create a simple Help facility for your Bash script. -![bash logo on green background][1] - -In the [first article][2] in this series, you created a very small, one-line Bash script and explored the reasons for creating shell scripts and why they are the most efficient option for the system administrator, rather than compiled programs. In the [second article][3], you began the task of creating a fairly simple template that you can use as a starting point for other Bash programs, then explored ways to test it. - -This third of the four articles in this series explains how to create and use a simple Help function. While creating your Help facility, you will also learn about using functions and how to handle command-line options such as **-h**. - -### Why Help? - -Even fairly simple Bash programs should have some sort of Help facility, even if it is fairly rudimentary. Many of the Bash shell programs I write are used so infrequently that I forget the exact syntax of the command I need. Others are so complex that I need to review the options and arguments even when I use them frequently. - -Having a built-in Help function allows you to view those things without having to inspect the code itself. A good and complete Help facility is also a part of program documentation. - -### About functions - -Shell functions are lists of Bash program statements that are stored in the shell's environment and can be executed, like any other command, by typing their name at the command line. Shell functions may also be known as procedures or subroutines, depending upon which other programming language you are using. - -Functions are called in scripts or from the command-line interface (CLI) by using their names, just as you would for any other command. In a CLI program or a script, the commands in the function execute when they are called, then the program flow sequence returns to the calling entity, and the next series of program statements in that entity executes. - -The syntax of a function is: - - -``` -`FunctionName(){program statements}` -``` - -Explore this by creating a simple function at the CLI. (The function is stored in the shell environment for the shell instance in which it is created.) You are going to create a function called **hw**, which stands for "hello world." Enter the following code at the CLI and press **Enter**. Then enter **hw** as you would any other shell command: - - -``` -[student@testvm1 ~]$ hw(){ echo "Hi there kiddo"; } -[student@testvm1 ~]$ hw -Hi there kiddo -[student@testvm1 ~]$ -``` - -OK, so I am a little tired of the standard "Hello world" starter. Now, list all of the currently defined functions. There are a lot of them, so I am showing just the new **hw** function. When it is called from the command line or within a program, a function performs its programmed task and then exits and returns control to the calling entity, the command line, or the next Bash program statement in a script after the calling statement: - - -``` -[student@testvm1 ~]$ declare -f | less -<snip> -hw () -{ -    echo "Hi there kiddo" -} -<snip> -``` - -Remove that function because you do not need it anymore. You can do that with the **unset** command: - - -``` -[student@testvm1 ~]$ unset -f hw ; hw -bash: hw: command not found -[student@testvm1 ~]$ -``` - -### Creating the Help function - -Open the **hello** program in an editor and add the Help function below to the **hello** program code after the copyright statement but before the **echo "Hello world!"** statement. This Help function will display a short description of the program, a syntax diagram, and short descriptions of the available options. Add a call to the Help function to test it and some comment lines that provide a visual demarcation between the functions and the main portion of the program: - - -``` -################################################################################ -# Help                                                                         # -################################################################################ -Help() -{ -   # Display Help -   echo "Add description of the script functions here." -   echo -   echo "Syntax: scriptTemplate [-g|h|v|V]" -   echo "options:" -   echo "g     Print the GPL license notification." -   echo "h     Print this Help." -   echo "v     Verbose mode." -   echo "V     Print software version and exit." -   echo -} - -################################################################################ -################################################################################ -# Main program                                                                 # -################################################################################ -################################################################################ - -Help -echo "Hello world!" -``` - -The options described in this Help function are typical for the programs I write, although none are in the code yet. Run the program to test it: - - -``` -[student@testvm1 ~]$ ./hello -Add description of the script functions here. - -Syntax: scriptTemplate [-g|h|v|V] -options: -g     Print the GPL license notification. -h     Print this Help. -v     Verbose mode. -V     Print software version and exit. - -Hello world! -[student@testvm1 ~]$ -``` - -Because you have not added any logic to display Help only when you need it, the program will always display the Help. Since the function is working correctly, read on to add some logic to display the Help only when the **-h** option is used when you invoke the program at the command line.  - -### Handling options - -A Bash script's ability to handle command-line options such as **-h** gives some powerful capabilities to direct the program and modify what it does. In the case of the **-h** option, you want the program to print the Help text to the terminal session and then quit without running the rest of the program. The ability to process options entered at the command line can be added to the Bash script using the **while** command (see [_How to program with Bash: Loops_][4] to learn more about **while**) in conjunction with the **getops** and **case** commands. - -The **getops** command reads any and all options specified at the command line and creates a list of those options. In the code below, the **while** command loops through the list of options by setting the variable **$options** for each. The **case** statement is used to evaluate each option in turn and execute the statements in the corresponding stanza. The **while** statement will continue to evaluate the list of options until they have all been processed or it encounters an exit statement, which terminates the program. - -Be sure to delete the Help function call just before the **echo "Hello world!"** statement so that the main body of the program now looks like this: - - -``` -################################################################################ -################################################################################ -# Main program                                                                 # -################################################################################ -################################################################################ -################################################################################ -# Process the input options. Add options as needed.                            # -################################################################################ -# Get the options -while getopts ":h" option; do -   case $option in -      h) # display Help -         Help -         exit;; -   esac -done - -echo "Hello world!" -``` - -Notice the double semicolon at the end of the exit statement in the case option for **-h**. This is required for each option added to this case statement to delineate the end of each option. - -### Testing - -Testing is now a little more complex. You need to test your program with a number of different options—and no options—to see how it responds. First, test with no options to ensure that it prints "Hello world!" as it should: - - -``` -[student@testvm1 ~]$ ./hello -Hello world! -``` - -That works, so now test the logic that displays the Help text: - - -``` -[student@testvm1 ~]$ ./hello -h -Add description of the script functions here. - -Syntax: scriptTemplate [-g|h|t|v|V] -options: -g     Print the GPL license notification. -h     Print this Help. -v     Verbose mode. -V     Print software version and exit. -``` - -That works as expected, so try some testing to see what happens when you enter some unexpected options: - - -``` -[student@testvm1 ~]$ ./hello -x -Hello world! -[student@testvm1 ~]$ ./hello -q -Hello world! -[student@testvm1 ~]$ ./hello -lkjsahdf -Add description of the script functions here. - -Syntax: scriptTemplate [-g|h|t|v|V] -options: -g     Print the GPL license notification. -h     Print this Help. -v     Verbose mode. -V     Print software version and exit. - -[student@testvm1 ~]$ -``` - -The program just ignores any options without specific responses without generating any errors. But notice the last entry (with **-lkjsahdf** for options): because there is an **h** in the list of options, the program recognizes it and prints the Help text. This testing has shown that the program doesn't have the ability to handle incorrect input and terminate the program if any is detected. - -You can add another case stanza to the case statement to match any option that doesn't have an explicit match. This general case will match anything you have not provided a specific match for. The case statement now looks like this, with the catch-all match of **\?** as the last case. Any additional specific cases must precede this final one: - - -``` -while getopts ":h" option; do -   case $option in -      h) # display Help -         Help -         exit;; -     \?) # incorrect option -         echo "Error: Invalid option" -         exit;; -   esac -done -``` - -Test the program again using the same options as before and see how it works now. - -### Where you are - -You have accomplished a good amount in this article by adding the capability to process command-line options and a Help procedure. Your Bash script now looks like this: - - -``` -#!/usr/bin/bash -################################################################################ -#                              scriptTemplate                                  # -#                                                                              # -# Use this template as the beginning of a new program. Place a short           # -# description of the script here.                                              # -#                                                                              # -# Change History                                                               # -# 11/11/2019  David Both    Original code. This is a template for creating     # -#                           new Bash shell scripts.                            # -#                           Add new history entries as needed.                 # -#                                                                              # -#                                                                              # -################################################################################ -################################################################################ -################################################################################ -#                                                                              # -#  Copyright (C) 2007, 2019 David Both                                         # -#  [LinuxGeek46@both.org][5]                                                        # -#                                                                              # -#  This program is free software; you can redistribute it and/or modify        # -#  it under the terms of the GNU General Public License as published by        # -#  the Free Software Foundation; either version 2 of the License, or           # -#  (at your option) any later version.                                         # -#                                                                              # -#  This program is distributed in the hope that it will be useful,             # -#  but WITHOUT ANY WARRANTY; without even the implied warranty of              # -#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               # -#  GNU General Public License for more details.                                # -#                                                                              # -#  You should have received a copy of the GNU General Public License           # -#  along with this program; if not, write to the Free Software                 # -#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   # -#                                                                              # -################################################################################ -################################################################################ -################################################################################ - -################################################################################ -# Help                                                                         # -################################################################################ -Help() -{ -   # Display Help -   echo "Add description of the script functions here." -   echo -   echo "Syntax: scriptTemplate [-g|h|t|v|V]" -   echo "options:" -   echo "g     Print the GPL license notification." -   echo "h     Print this Help." -   echo "v     Verbose mode." -   echo "V     Print software version and exit." -   echo -} - -################################################################################ -################################################################################ -# Main program                                                                 # -################################################################################ -################################################################################ -################################################################################ -# Process the input options. Add options as needed.                            # -################################################################################ -# Get the options -while getopts ":h" option; do -   case $option in -      h) # display Help -         Help -         exit;; -     \?) # incorrect option -         echo "Error: Invalid option" -         exit;; -   esac -done - -echo "Hello world!" -``` - -Be sure to test this version of the program very thoroughly. Use random inputs and see what happens. You should also try testing valid and invalid options without using the dash (**-**) in front. - -### Next time - -In this article, you added a Help function as well as the ability to process command-line options to display it selectively. The program is getting a little more complex, so testing is becoming more important and requires more test paths in order to be complete. - -The next article will look at initializing variables and doing a bit of sanity checking to ensure that the program will run under the correct set of conditions. - -### Resources - - * [How to program with Bash: Syntax and tools][6] - * [How to program with Bash: Logical operators and shell expansions][7] - * [How to program with Bash: Loops][4] - - - -* * * - -_This series of articles is partially based on Volume 2, Chapter 10 of David Both's three-part Linux self-study course, [Using and Administering Linux—Zero to SysAdmin][8]._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/help-bash-program - -作者:[David Both][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dboth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) -[2]: https://opensource.com/article/19/12/introduction-automation-bash-scripts -[3]: https://opensource.com/article/19/12/creating-bash-script-template -[4]: https://opensource.com/article/19/10/programming-bash-loops -[5]: mailto:LinuxGeek46@both.org -[6]: https://opensource.com/article/19/10/programming-bash-syntax-tools -[7]: https://opensource.com/article/19/10/programming-bash-logical-operators-shell-expansions -[8]: http://www.both.org/?page_id=1183 diff --git a/sources/tech/20191220 The Difference Between DNF and YUM, Why is Yum Replaced by DNF.md b/sources/tech/20191220 The Difference Between DNF and YUM, Why is Yum Replaced by DNF.md deleted file mode 100644 index 01d6522274..0000000000 --- a/sources/tech/20191220 The Difference Between DNF and YUM, Why is Yum Replaced by DNF.md +++ /dev/null @@ -1,77 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The Difference Between DNF and YUM, Why is Yum Replaced by DNF?) -[#]: via: (https://www.2daygeek.com/comparison-difference-between-dnf-vs-yum/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -The Difference Between DNF and YUM, Why is Yum Replaced by DNF? -====== - -**[Yum Package Manager][1]** has been replaced by **[DNF Package Manager][2]** since many long-standing issues in Yum remain unresolved. - -These problems include poor performance, excessive memory usage, slowdown for dependency resolution. - -DNF uses “libsolv” for dependency resolution, developed and maintained by SUSE to improve performance. - -It was written mostly in python, and it has its own way of coping with dependency resolution. - -Its API is not fully documented, and its extension system only allows Python plugins. - -Yum is a front-end tool for rpm that manages dependencies and repositories, and then uses RPM to install, download, and remove packages. - -Why would they want to build a new tool instead of fixing existing problems? - -Ales Kozamblak explained that the fixing was not technically feasible and that the yum team was not ready to accept the changes immediately. - -Also, the big challenge is that there are 56K lines for yum, but only 29K lines for DNF. - -So there is no way to fix it, except the fork. - -However yum was working fine. - -S.No | DNF (Dandified YUM) | YUM (Yellowdog Updater, Modified) ----|---|--- -1 | DNF uses libsolv for dependency resolution, developed and maintained by SUSE. | YUM uses the public API for dependency resolution -2 | API is fully documented | API is not fully documented -3 | It is written in C, C++, Python | It is written only in Python -4 | DNF is currently used in Fedora, Red Hat Enterprise Linux 8 (RHEL), CentOS 8, OEL 8 and Mageia 6/7. | YUM is currently used in Red Hat Enterprise Linux 6/7 (RHEL), CentOS 6/7, OEL 6/7. -5 | DNf supports various extensions | Yum supports only Python based extension -6 | The API is well documented so it's easy to create new features | It is very difficult to create new features because the API is not properly documented. -7 | The DNF uses less memory when synchronizing the metadata of the repositories. | The YUM uses excessive memory when synchronizing the metadata of the repositories. -8 | DNF uses a satisfiability algorithm to solve dependency resolution (It's using a dictionary approach to store and retrieve package and dependency information). | Yum dependency resolution gets sluggish due to public API. -9 | All performance is good in terms of memory usage and dependency resolution of repository metadata. | Over all performance is poor in terms of many factors. -10 | DNF Update: If a package contains irrelevant dependencies during a DNF update process, the package will not be updated. | YUM will update a package without verifying this. -11 | If the enabled repository does not respond, dnf will skip it and continue the transaction with the available repositories. | If a repository is not available, YUM will stop immediately. -12 | dnf update and dnf upgrade equals. | It's different in yum -13 | The dependencies on package installation are not updated | Yum offered an option for this behavior -14 | Clean Up Package Removal: When removing a package, dnf automatically removes any dependency packages not explicitly installed by the user. | Yum didn’t do this -15 | Repo Cache Update Schedule: By default, ten minutes after the system boots, updates to configured repositories are checked by dnf hourly. This action is controlled by the system timer unit named "/usr/lib/systemd/system/dnf-makecache.timer". | Yum do this too. -16 | Kernel packages are not protected by dnf. Unlike Yum, you can delete all kernel packages, including one that runs. | Yum will not allow you to remove the running kernel -17 | libsolv: for solving packages and reading repositories. - -hawkey: hawkey, library providing simplified C and Python API to libsolv. - -librepo: library providing C and Python (libcURL like) API for downloading linux repository metadata and packages. - -libcomps: Libcomps is alternative for yum.comps library. It’s written in pure C as library and there’s bindings for python2 and python3 | Yum does not use separate libraries to perform this function. -18 | DNF contains 29k lines of code | Yum contains 56k lines of code -19 | DNF was developed by Ales Kozumplik | YUM was developed by Zdenek Pavlas, Jan Silhan and team members - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/comparison-difference-between-dnf-vs-yum/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/ -[2]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ diff --git a/sources/tech/20191221 Testing your Bash script.md b/sources/tech/20191221 Testing your Bash script.md deleted file mode 100644 index 4a8504cbe9..0000000000 --- a/sources/tech/20191221 Testing your Bash script.md +++ /dev/null @@ -1,288 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Testing your Bash script) -[#]: via: (https://opensource.com/article/19/12/testing-bash-script) -[#]: author: (David Both https://opensource.com/users/dboth) - -Testing your Bash script -====== -In the fourth and final article in this series on automation with shell -scripts, learn about initializing variables and ensuring your program -runs correctly. -![Team checklist and to dos][1] - -In the [first article][2] in this series, you created your first, very small, one-line Bash script and explored the reasons for creating shell scripts. In the [second article][3], you began creating a fairly simple template that can be a starting point for other Bash programs and began testing it. In the [third article][4], you created and used a simple Help function and learned about using functions and how to handle command-line options such as **-h**. - -This fourth and final article in the series gets into variables and initializing them as well as how to do a bit of sanity testing to help ensure the program runs under the proper conditions. Remember, the objective of this series is to build working code that will be used for a template for future Bash programming projects. The idea is to make getting started on new programming projects easy by having common elements already available in the template. - -### Variables - -The Bash shell, like all programming languages, can deal with variables. A variable is a symbolic name that refers to a specific location in memory that contains a value of some sort. The value of a variable is changeable, i.e., it is variable. If you are not familiar with using variables, read my article [_How to program with Bash: Syntax and tools_][5] before you go further. - -Done? Great! Let's now look at some good practices when using variables. - -I always set initial values for every variable used in my scripts. You can find this in your template script immediately after the procedures as the first part of the main program body, before it processes the options. Initializing each variable with an appropriate value can prevent errors that might occur with uninitialized variables in comparison or math operations. Placing this list of variables in one place allows you to see all of the variables that are supposed to be in the script and their initial values. - -Your little script has only a single variable, **$option**, so far. Set it by inserting the following lines as shown: - - -``` -################################################################################ -################################################################################ -# Main program                                                                 # -################################################################################ -################################################################################ -# Initialize variables -option="" -################################################################################ -# Process the input options. Add options as needed.                            # -################################################################################ -``` - -Test this to ensure that everything works as it should and that nothing has broken as the result of this change. - -### Constants - -Constants are variables, too—at least they should be. Use variables wherever possible in command-line interface (CLI) programs instead of hard-coded values. Even if you think you will use a particular value (such as a directory name, a file name, or a text string) just once, create a variable and use it where you would have placed the hard-coded name. - -For example, the message printed as part of the main body of the program is a string literal, **echo "Hello world!"**. Change that to a variable. First, add the following statement to the variable initialization section: - - -``` -`Msg="Hello world!"` -``` - -And now change the last line of the program from: - - -``` -`echo "Hello world!"` -``` - -to: - - -``` -`echo "$Msg"` -``` - -Test the results. - -### Sanity checks - -Sanity checks are simply tests for conditions that need to be true in order for the program to work correctly, such as: the program must be run as the root user, or it must run on a particular distribution and release of that distro. Add a check for _root_ as the running user in your simple program template. - -Testing that the root user is running the program is easy because a program runs as the user that launches it. - -The **id** command can be used to determine the numeric user ID (UID) the program is running under. It provides several bits of information when it is used without any options: - - -``` -[student@testvm1 ~]$ id -uid=1001(student) gid=1001(student) groups=1001(student),5000(dev) -``` - -Using the **-u** option returns just the user's UID, which is easily usable in your Bash program: - - -``` -[student@testvm1 ~]$ id -u -1001 -[student@testvm1 ~]$ -``` - -Add the following function to the program. I added it after the Help procedure, but you can place it anywhere in the procedures section. The logic is that if the UID is not zero, which is always the root user's UID, the program exits: - - -``` -################################################################################ -# Check for root.                                                              # -################################################################################ -CheckRoot() -{ -   if [ `id -u` != 0 ] -   then -      echo "ERROR: You must be root user to run this program" -      exit -   fi   -} -``` - -Now, add a call to the **CheckRoot** procedure just before the variable's initialization. Test this, first running the program as the student user: - - -``` -[student@testvm1 ~]$ ./hello -ERROR: You must be root user to run this program -[student@testvm1 ~]$ -``` - -then as the root user: - - -``` -[root@testvm1 student]# ./hello -Hello world! -[root@testvm1 student]# -``` - -You may not always need this particular sanity test, so comment out the call to **CheckRoot** but leave all the code in place in the template. This way, all you need to do to use that code in a future program is to uncomment the call. - -### The code - -After making the changes outlined above, your code should look like this: - - -``` -#!/usr/bin/bash -################################################################################ -#                              scriptTemplate                                  # -#                                                                              # -# Use this template as the beginning of a new program. Place a short           # -# description of the script here.                                              # -#                                                                              # -# Change History                                                               # -# 11/11/2019  David Both    Original code. This is a template for creating     # -#                           new Bash shell scripts.                            # -#                           Add new history entries as needed.                 # -#                                                                              # -#                                                                              # -################################################################################ -################################################################################ -################################################################################ -#                                                                              # -#  Copyright (C) 2007, 2019 David Both                                         # -#  [LinuxGeek46@both.org][6]                                                        # -#                                                                              # -#  This program is free software; you can redistribute it and/or modify        # -#  it under the terms of the GNU General Public License as published by        # -#  the Free Software Foundation; either version 2 of the License, or           # -#  (at your option) any later version.                                         # -#                                                                              # -#  This program is distributed in the hope that it will be useful,             # -#  but WITHOUT ANY WARRANTY; without even the implied warranty of              # -#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               # -#  GNU General Public License for more details.                                # -#                                                                              # -#  You should have received a copy of the GNU General Public License           # -#  along with this program; if not, write to the Free Software                 # -#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   # -#                                                                              # -################################################################################ -################################################################################ -################################################################################ - -################################################################################ -# Help                                                                         # -################################################################################ -Help() -{ -   # Display Help -   echo "Add description of the script functions here." -   echo -   echo "Syntax: scriptTemplate [-g|h|v|V]" -   echo "options:" -   echo "g     Print the GPL license notification." -   echo "h     Print this Help." -   echo "v     Verbose mode." -   echo "V     Print software version and exit." -   echo -} - -################################################################################ -# Check for root.                                                              # -################################################################################ -CheckRoot() -{ -   # If we are not running as root we exit the program -   if [ `id -u` != 0 ] -   then -      echo "ERROR: You must be root user to run this program" -      exit -   fi -} - -################################################################################ -################################################################################ -# Main program                                                                 # -################################################################################ -################################################################################ - -################################################################################ -# Sanity checks                                                                # -################################################################################ -# Are we rnning as root? -# CheckRoot - -# Initialize variables -option="" -Msg="Hello world!" -################################################################################ -# Process the input options. Add options as needed.                            # -################################################################################ -# Get the options -while getopts ":h" option; do -   case $option in -      h) # display Help -         Help -         exit;; -     \?) # incorrect option -         echo "Error: Invalid option" -         exit;; -   esac -done - -echo "$Msg" -``` - -### A final exercise - -You probably noticed that the Help function in your code refers to features that are not in the code. As a final exercise, figure out how to add those functions to the code template you created. - -### Summary - -In this article, you created a couple of functions to perform a sanity test for whether your program is running as root. Your program is getting a little more complex, so testing is becoming more important and requires more test paths to be complete. - -This series looked at a very minimal Bash program and how to build a script up a bit at a time. The result is a simple template that can be the starting point for other, more useful Bash scripts and that contains useful elements that make it easy to start new scripts. - -By now, you get the idea: Compiled programs are necessary and fill a very important need. But for sysadmins, there is always a better way. Always use shell scripts to meet your job's automation needs. Shell scripts are open; their content and purpose are knowable. They can be readily modified to meet different requirements. I have never found anything that I need to do in my sysadmin role that cannot be accomplished with a shell script. - -What you have created so far in this series is just the beginning. As you write more Bash programs, you will find more bits of code that you use frequently and should be included in your program template. - -### Resources - - * [How to program with Bash: Syntax and tools][5] - * [How to program with Bash: Logical operators and shell expansions][7] - * [How to program with Bash: Loops][8] - - - -* * * - -_This series of articles is partially based on Volume 2, Chapter 10 of David Both's three-part Linux self-study course, [Using and Administering Linux—Zero to SysAdmin][9]._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/testing-bash-script - -作者:[David Both][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dboth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/todo_checklist_team_metrics_report.png?itok=oB5uQbzf (Team checklist and to dos) -[2]: https://opensource.com/article/19/12/introduction-automation-bash-scripts -[3]: https://opensource.com/article/19/12/creating-bash-script-template -[4]: https://opensource.com/article/19/12/give-your-bash-program-some-help -[5]: https://opensource.com/article/19/10/programming-bash-syntax-tools -[6]: mailto:LinuxGeek46@both.org -[7]: https://opensource.com/article/19/10/programming-bash-logical-operators-shell-expansions -[8]: https://opensource.com/article/19/10/programming-bash-loops -[9]: http://www.both.org/?page_id=1183 diff --git a/sources/tech/20191222 Create a unique Linux experience with the Unix Desktop Environment.md b/sources/tech/20191222 Create a unique Linux experience with the Unix Desktop Environment.md deleted file mode 100644 index bf82680c8b..0000000000 --- a/sources/tech/20191222 Create a unique Linux experience with the Unix Desktop Environment.md +++ /dev/null @@ -1,179 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Create a unique Linux experience with the Unix Desktop Environment) -[#]: via: (https://opensource.com/article/19/12/linux-unix-desktop-environment-ude) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Create a unique Linux experience with the Unix Desktop Environment -====== -This article is part of a special series of 24 days of Linux desktops. -If you're in the mood for something completely unique, then UDE is the -desktop you need to try. -![Penguins][1] - -When the UDE project started in 1996, the developers took on a bold name—[Unix Desktop Environment (UDE)][2]—and held high hopes of reinventing what a desktop could be. They weren't just trying to redefine Unix desktops; they were trying to change the way users interacted with applications on their system. Windows 95 had just come out, so the idea of managing a make-believe "desktop" filled with "folders" and "windows" meant to mimic a real-world desktop had not won all computer users' mindshare (it still hasn't, but it does at least seem to be a reliably stable option now). There was still room for experimentation in computer user interfaces (UIs), and the UDE project introduced some truly innovative ideas. - -One of UDE's most intriguing concepts is that its windows have no title bars or handles. All window control is performed with a hex menu that appears when a window border is clicked. Windows are moved with a middle-click and resized with a right-click. - -![Unix Desktop Environment][3] - -If you're in the mood for something completely unique, then UDE is the desktop you need to try. - -### Installing UDE - -Your distribution probably doesn't have UDE in its software repository, but it's relatively easy to compile for someone who's used to building software from raw source code. - -I installed UDE on Slackware 14.2, but it doesn't rely on any libraries other than standard Xlibs, so it should work on any Linux or BSD system. The compile process requires build tools, which ship by default on Slackware but are often omitted on other distributions to save space on the initial download. The names of the packages you must install to build from source code vary depending on your distro, so refer to the documentation for specifics. For example, on Debian-based distributions, you can learn about build requirements in [Debian's BuildingTutorial][4] doc, and on Fedora-based distributions, refer to [Fedora's Installing software from source][5] doc. Once you have the build tools installed, you can build UDE the standard [GNU Automake][6] way: - - -``` -$ ./configure -$ make -j2 -$ sudo make install -``` - -The default location for installation is **/usr/local**, but you can adjust the paths during the configuration step. - -### Xinitrc and UDE - -The easiest way to get up and running with UDE is to let Xorg do the bulk of the work. First, you must create a **$HOME/.xinitrc** file. I adapted this from scripts bundled in Slackware: - - -``` -#!/bin/sh -# $XConsortium: xinitrc.cpp,v 1.4 91/08/22 11:41:34 rws Exp $ - -userresources=$HOME/.Xresources -usermodmap=$HOME/.Xmodmap -sysresources=/etc/X11/xinit/.Xresources -sysmodmap=/etc/X11/xinit/.Xmodmap - -# merge in defaults and keymaps - -if [ -f $sysresources ]; then -    xrdb -merge $sysresources -fi - -if [ -f $sysmodmap ]; then -    xmodmap $sysmodmap -fi - -if [ -f $userresources ]; then -    xrdb -merge $userresources -fi - -if [ -f $usermodmap ]; then -    xmodmap $usermodmap -fi - -# window manager -exec /usr/local/bin/uwm -``` - -According to this file, the default action for the **startx** command is to launch the **uwm** window manager (which houses UDE). However, your distribution may have other ideas about what happens when your graphic server is launched (or killed to be restarted), so this file may do you little good. On many distributions, you can add a **.desktop** file to **/usr/share/xsessions** to have it listed in the GDM or KDM menu, so create a file called **uwm.desktop** and enter this text: - - -``` -[Desktop Entry] -Name=UDE -Comment=UNIX Desktop Environment -Exec=/usr/local/bin/uwm -Type=Application -``` - -Log out from your desktop session and log back into UDE. By default, your session manager (KDM, GDM, or LightDM, depending on your setup) will continue to log you into your previous desktop, so you must override that before logging in. - -With GDM: - -![][7] - -With SDDM: - -![][8] - -#### Launching with brute force - -If UDE fails to start, try installing XDM, a lightweight session manager that doesn't look at **/usr/share/xsessions** and instead just does whatever the authenticated user's **.xinitrc** prescribes. - -### Desktop tour - -When UDE first launches, you may find yourself staring at a black screen. That's the default primary desktop for UDE, and it's blank because no background wallpaper has been set. You can set one for yourself with the **feh** command (you may need to install it from your repository). This command has a few options for setting the background, including **\--bg-fill** to fill the screen with your wallpaper of choice, **\--bg-scale** to scale it to fit, and so on. - - -``` -`$ feh --bg-fill ~/Pictures/wallpapers/mybackground.jpg` -``` - -### Interacting with the desktop - -The next task is to launch an application. UDE provides an application menu, which you can bring up at your mouse pointer's position with a right-click on the desktop. Because you haven't customized the menu yet, your best bet is to launch an **xterm** window so that you can issue arbitrary commands. - -Once you have an xterm window open, you might notice that there's no window decoration. This is the central idea behind UDE: windows are manipulated primarily with a "honeycomb" or hex menu that appears when you left-click on the border of any window. - -![UDE honeycomb menu][9] - -Clockwise from the top hex, the options are: - - * Close - * Kill (confirm by selecting the pop-up hex that appears upon mouseover) - * Make sticky or send to a different desktop - * Maximize - * Send behind other windows - * Minimize - - - -Most of them are self-explanatory, but the minimize option can be confusing because there's no place for windows to be minimized _to_ because there's no taskbar, no docklet, and no desktop icons. To retrieve a minimized window, middle-click on the desktop. - -![UDE middle-click menu][10] - -This presents a menu of virtual desktops, one of which is your current desktop and therefore contains even your minimized applications. Select the minimized application to restore it to your screen. - -### Menus and configuration - -There are example and default config files in **/usr/local/share/uwm/config**, including one for the right-click application menu configuration. The syntax for the menu is simple and well-documented at the top of the file. This code sample changes the browser option from Netscape to Firefox: - - -``` -LINE; -% ITEM "Netscape":"netscape"; -ITEM "Firefox":"firefox"; -LINE; -``` - -To see your changes, restart UDE from the left-click menu. The **uwmrc** configuration files dictate the layout of UDE, including the size of window borders, fonts, and other stylistic choices. They are - -also well-documented in comments, so look through them and make changes to experiment and find what works best for you. - -### Old innovations, new again - -UDE's interface is strange and new and—if you're intrigued by UI design—very exciting. UDE's design exemplifies the advantages and disadvantages of creating standards in computing. On the one hand, something like UDE is so alien to most users that it's bound to get in the way, yet on the other hand, it's fresh and different and forces users to re-evaluate their workflows, which may result in several unexpected improvements. The reaction you probably have when trying UDE is the same one you're likely to see when you introduce a friend to Linux: What's an old, familiar GNOME or KDE desktop to you is a puzzle to them. But deep down, most of us know the potential benefits of changing the way we look at something we take for granted. - -That said, UDE is unquestionably an experiment, not a finished project. It probably isn't going to be your primary desktop, but it's well worth exploring. This is innovation. It's sometimes messy, sometimes slow, sometimes tumultuous. But it's important, bold, and a heck of a lot of fun. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/linux-unix-desktop-environment-ude - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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]: http://udeproject.sourceforge.net/ -[3]: https://opensource.com/sites/default/files/uploads/advent-ude.jpg (Unix Desktop Environment) -[4]: https://wiki.debian.org/BuildingTutorial -[5]: https://docs.pagure.org/docs-fedora/installing-software-from-source.html -[6]: https://opensource.com/article/19/7/introduction-gnu-autotools -[7]: https://opensource.com/sites/default/files/advent-gdm_2.jpg -[8]: https://opensource.com/sites/default/files/advent-kdm_1.jpg -[9]: https://opensource.com/sites/default/files/uploads/advent-ude-hex.jpg (UDE honeycomb menu) -[10]: https://opensource.com/sites/default/files/uploads/advent-ude-middle.jpg (UDE middle-click menu) diff --git a/sources/tech/20191223 10 resources to become a better Bash user.md b/sources/tech/20191223 10 resources to become a better Bash user.md deleted file mode 100644 index b00f359d4d..0000000000 --- a/sources/tech/20191223 10 resources to become a better Bash user.md +++ /dev/null @@ -1,77 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (10 resources to become a better Bash user) -[#]: via: (https://opensource.com/article/19/12/bash-resources) -[#]: author: (David Both https://opensource.com/users/dboth) - -10 resources to become a better Bash user -====== -Take a look through our top 10 Bash articles from 2019. -![bash logo on green background][1] - -As another great year wraps up at Opensource.com, my fascination with all things [Bash][2] has me looking back at the top 10 Bash articles we published in 2019. These articles include basic how-to articles, tools, shortcuts, and even a way to build your own command-line game with Bash. - -I didn't select these articles based solely on the number of hits they had but rather on a number of criteria. In the true spirit of top 10 countdowns, the top Bash article from 2019 is at the end for the final reveal. - - 10. [_Bash vs. Python: Which language should you use?_][3] by Archit Modi looks at the strengths and weaknesses of these popular languages. Although both have many good points, the bottom line—as with most things Linux—is, "it depends." - - - 9. [_How to program with Bash: Logical operators and shell expansions_][4] is the second in a three-part series I wrote about Bash programming. This article lists all of the Bash logical operators and provides some easy examples for using them. It also discusses five of the seven types of shell expansions and includes easy-to-understand examples that help to clarify how these expansions work. - - - 8. Abhishek Tamrakar shows us how to _[Hone advanced Bash skills by building Minesweeper][5]._ This is an interesting, fun, and informative way to improve the Bash skills you already have. When finished, you have a working command-line game of Minesweeper and some serious skills. This article is one of my favorites because it not only stretches our skills, but it illustrates the power of Bash as a programming language. - - - 7. [_How to program with Bash: Syntax and tools_][6] is the first article in my Bash programming series. In addition to introducing Bash as a programming language, it looks at the basic syntax of Bash programming, the use of variables, and flow control. - - - 6. Matthew Broberg's [_The birth of the Bash shell_][7] delves into the history of the Bash shell with a look at how it all started with Unix and the original (Ken) Thompson shell. As someone who appreciates the historical roots of Linux and many of its components, I gained some new insights from this article. - - - 5. Seth Kenlon contributed _[How to write a loop in Bash][8],_ which explores the _for_ loop in some detail. A _for_ loop is a recipe detailing what actions you want your computer to take for each data object (such as a file) you specify. This article has some excellent examples to get you started and shows the power that loops can bring to Bash scripts. - - - 4. _[7 Bash history shortcuts you will actually use][9]_ shows how to save time on the command line by using Bash shortcuts. Ian Miell describes time-saving tools that go far beyond just simple command-line recall. These are very cool, and I especially like the easy method for reissuing the previous command while reordering the arguments. - - - 3. Seth Kenlon also shows some [_Bash aliases you can't live without_][10] that will save even more time. This article takes us through one of the ways that we "lazy sysadmins" can become even more efficient than we already are. This is all about less typing while getting more results. - - - 2. I always recommend testing scripts to ensure that they do what they are intended to—and that they don't create any other problems while doing so. Darin London introduces us to _[Testing Bash with BATS][11],_ the Bash Automated Testing System, a TAP-compliant testing framework for Bash. The [Test Anything Protocol][12] is also used for testing many other Unix languages. This article is loaded with examples and recommendations for structuring Bash programs so that they can be tested easily with this tool. - - - 1. Our number 1 spot for 2019 is—drum-roll—Seth Kenlon with [_3 command line games for learning Bash the fun way_][13]. Learning is work, but it can be fun. If you are into games (and it seems that we sysadmins like to have fun), this article looks at three tools for learning more about Bash for everyone from noobs to gurus. Everything you do in the game of Bashcrawl, for example, is a valid Bash command that you can use later in real life, and playing the game provides Bash practice because the "game" is made out of actual directories and files on your computer. - - - -These articles can help you learn Bash and some of its many powerful features. I have certainly learned a lot from them. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/bash-resources - -作者:[David Both][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dboth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) -[2]: https://opensource.com/downloads/bash-cheat-sheet -[3]: https://opensource.com/article/19/4/bash-vs-python -[4]: https://opensource.com/article/19/10/programming-bash-logical-operators-shell-expansions -[5]: https://opensource.com/article/19/9/advanced-bash-building-minesweeper -[6]: https://opensource.com/article/19/10/programming-bash-syntax-tools -[7]: https://opensource.com/19/9/command-line-heroes-bash -[8]: https://opensource.com/article/19/6/how-write-loop-bash -[9]: https://opensource.com/article/19/10/bash-history-shortcuts -[10]: https://opensource.com/article/19/7/bash-aliases -[11]: https://opensource.com/article/19/2/testing-bash-bats -[12]: https://testanything.org/producers.html -[13]: https://opensource.com/article/19/10/learn-bash-command-line-games diff --git a/sources/tech/20191223 Best of 2019- Fedora for system administrators.md b/sources/tech/20191223 Best of 2019- Fedora for system administrators.md deleted file mode 100644 index 5e57ff2912..0000000000 --- a/sources/tech/20191223 Best of 2019- Fedora for system administrators.md +++ /dev/null @@ -1,70 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Best of 2019: Fedora for system administrators) -[#]: via: (https://fedoramagazine.org/best-of-2019-fedora-for-system-administrators/) -[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/) - -Best of 2019: Fedora for system administrators -====== - -![][1] - -The end of the year is a perfect time to look back on some of the Magazine’s most popular articles of 2019. One of the Fedora operating systems’s many strong points is its wide array of tools for system administrators. As your skills progress, you’ll find that the Fedora OS has even more to offer. And because Linux is the sysadmin’s best friend, you’ll always be in good company. In 2019, there were quite a few articles about sysadmin tools our readers enjoyed. Here’s a sampling. - -### Introducing Fedora CoreOS - -If you follow modern IT topics, you know that containers are a hot topic — and [containers mean Linux][2]. This summer brought the first preview release of [Fedora CoreOS][3]. This new edition of Fedora can run containerized workloads. You can use it to deploy apps and services in a modern way. - -> [Introducing Fedora CoreOS][4] - -### InitRAMFS, dracut and the dracut emergency shell - -To be a good sysadmin, you need to understand system startup and the boot process. From time to time, you’ll encounter software errors, configuration problems, or other issues that keep your system from starting normally. With the information in the article below, you can do some life-saving surgery on your system, and restore it to working order. - -> [InitRAMFS, Dracut, and the Dracut Emergency Shell][5] - -### How to reset your root password - -Although this article was published a few years ago, it continues to be one of the most popular. Apparently, we’re not the only people who sometimes get locked out of our own system! If this happens to you, and you need to reset the root password, the article below should do the trick. - -> [How to reset a root password on Fedora][6] - -### Systemd: unit dependencies and order - -This article is part of [an entire series][7] on systemd, the modern system and process manager in Fedora and other distributions. As you may know, systemd has sophisticated but easy to use methods to start up or shut own services in the right order. This article shows you how they work. That way you can apply the right options to unit files you create for systemd. - -> [systemd: Unit dependencies and order][8] - -### Setting kernel command line arguments - -Fedora 30 introduced new ways to change the boot options for your kernel. This article from Laura Abbott on the Fedora kernel team explains the new Bootloader Spec (BLS). It also tells you how to use it to set options on your kernel for boot time. - -> [Setting kernel command line arguments with Fedora 30][9] - -Stay tuned to the Magazine for other upcoming “Best of 2019” categories. All of us at the Magazine hope you have a great end of year and holiday season. - --------------------------------------------------------------------------------- - -via: https://fedoramagazine.org/best-of-2019-fedora-for-system-administrators/ - -作者:[Paul W. Frields][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://fedoramagazine.org/author/pfrields/ -[b]: https://github.com/lujun9972 -[1]: https://fedoramagazine.org/wp-content/uploads/2019/12/2019top-sysadmins.png-816x345.jpg -[2]: https://www.redhat.com/en/blog/containers-are-linux -[3]: https://getfedora.org/coreos/ -[4]: https://fedoramagazine.org/introducing-fedora-coreos/ -[5]: https://fedoramagazine.org/initramfs-dracut-and-the-dracut-emergency-shell/ -[6]: https://fedoramagazine.org/reset-root-password-fedora/ -[7]: https://fedoramagazine.org/series/systemd-series/ -[8]: https://fedoramagazine.org/systemd-unit-dependencies-and-order/ -[9]: https://fedoramagazine.org/setting-kernel-command-line-arguments-with-fedora-30/ diff --git a/sources/tech/20191223 Get back to basics with the TWM Linux desktop.md b/sources/tech/20191223 Get back to basics with the TWM Linux desktop.md deleted file mode 100644 index 19b16daf6f..0000000000 --- a/sources/tech/20191223 Get back to basics with the TWM Linux desktop.md +++ /dev/null @@ -1,109 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Get back to basics with the TWM Linux desktop) -[#]: via: (https://opensource.com/article/19/12/twm-linux-desktop) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Get back to basics with the TWM Linux desktop -====== -This article is part of a special series of 24 days of Linux desktops. -TWM may be bare-bones by default, but it's a great foundation for a -customized Linux desktop that has all your favorite bits and pieces. -![Penguin driving a car with a yellow background][1] - -The most humble of window managers, TWM, is a little akin to those sample photographs you get when you buy a picture frame. It's basic, almost a bare-minimum proof of concept that Xorg ships with the [X11][2] Windows System to demonstrate that a desktop can indeed be created for a graphical user interface (GUI). - -Some distributions treat it as a fallback window manager that can be launched in a pinch if you break your usual desktop and need a terminal just long enough for repairs. Now that Xorg is basically bulletproof and moving aside for [Wayland][3], sometimes TWM isn't even included at all. And yet, amazingly, TWM, short for either _Timeless Window Manager_ or _Tabbed Window Manager_, depending on who you ask, has some fun features and configuration options. - -![TWM][4] - -Your distribution (XQuartz on Mac OS included) may discreetly include TWM as a fallback window manager. Otherwise, you are likely to find it in your software repository, and you can also get it from the [Freedesktop][5] GitHub repository. If you're already running a different desktop, it's safe to install TWM on the same system because it doesn't include any bundled applications aside from a few configuration panels. - -After installing, log out of your current desktop session so you can log into TWM. By default, your session manager (KDM, GDM, LightDM, or XDM, depending on your setup) will continue to log you into your previous desktop, so you must override that before logging into your new one. - -With GDM: - -![Selecting your desktop in GDM][6] - -With SDDM: - -![Selecting your desktop in KDM][7] - -### Desktop tour - -TWM's basic configuration is usually unspectacular. Here's TWM on my Slackware system: - -![TWM by default][8] - -You can get a pop-up menu with a left-click on the desktop. By default, it has one application listed: xterm. When you launch xterm, the outline of a window appears until you click to place it on the desktop. - -More actions are available with a right-click or a middle-click on the desktop or a window's title bar. For instance, to resize a window, you can middle-click the title bar and select **Resize**; this places you into resize mode so you can drag your mouse across the edge of the window you want to make smaller or larger. Click again to confirm the new size. - -When you right-click the icon in the upper-left corner of any window, that window is minimized into a desktop icon (a precursor to the OS X dock). You can drag this icon anywhere on your desktop and right-click on it to restore it back to a full-sized window. - -These are all old Unix conventions; tricks of the visual interface that long-time Unix users will remember fondly but are utterly baffling at first to new users. You can learn to love them by using TWM, but if you do that, you'll no doubt want something a little prettier and more tailored to your daily workflow. - -### TWM configuration - -One of my favorite sites is [Linux Questions][9], a tried-and-true Linux support forum. I stumbled across a post there about TWM, where user **rkfb** was, apparently in all seriousness, praising TWM as his favorite lightweight window manager. What's more, **rkfb** had [the config file to prove it][10]. - -I downloaded the sample **.twmrc** file and discovered that there are a surprising number of options and features in TWM. Like other "building-block" window managers, such as [FVWM][11] or [MLVWM][12], it takes a lot of work to customize it and bring it up to modern expectations. You can also add the usual laundry list of applications to TWM. For instance, you could run [Tint2][13] or [Xfce-panel][14] to provide a traditional taskbar and other applets, or [stalonetray][15] for a system tray, and [vdesk][16] to provide virtual desktops, but then again, TWM isn't meant to be a _modern_ window manager, but a _timeless_ window manager. You may not want to make it too modern. - -There are _lots_ of options and definitions in the config file for TWM. Two of my favorites are **RandomPlacement** (an option to activate random placement of windows, so you don't have to manually click to set the location of each window you launch) and **ShowIconManager** (which displays a vertical taskbar). - -The syntax to define the contents of the menus is pretty easy to understand: - - -``` -menu "Shells" { -   "Shells"     f.title -   "rxvt"               f.exec "urxvt -fg cyan -bg black -cr white &" -   "Konsole"    f.exec "konsole &" -} -``` - -Color themes are similarly intuitive from the sample file. - -You can set a background using the **feh** command (you probably need to install it first): - - -``` -`$ feh --bg-fill ~/christopher-burns_unsplash.jpg` -``` - -### Old TWM is new TWM - -TWM looks and feels like an artifact of a bygone era, when desktops were simpler in design but complex in configuration. It's probably not the best or the most flexible window manager available, but it's surprisingly configurable. You can use it as the foundation of a customized desktop consisting of all your favorite desktop bits and pieces. You can spend the time to make TWM something you enjoy using, and you'll learn a lot about interface design, Unix history, and pixmap bit depth along the way. Give TWM another look, and make that look beautiful. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/twm-linux-desktop - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background) -[2]: https://en.wikipedia.org/wiki/X_Window_System -[3]: https://wayland.freedesktop.org/ -[4]: https://opensource.com/sites/default/files/uploads/advent-twm.jpg (TWM) -[5]: https://github.com/freedesktop/twm -[6]: https://opensource.com/sites/default/files/uploads/advent-gdm_3.jpg (Selecting your desktop in GDM) -[7]: https://opensource.com/sites/default/files/uploads/advent-kdm_2.jpg (Selecting your desktop in KDM) -[8]: https://opensource.com/sites/default/files/uploads/advent-twm-basic.jpg (TWM by default) -[9]: http://linuxquestions.org -[10]: https://www.linuxquestions.org/questions/linux-desktop-74/share-your-configuration-file-of-twm-best-x-windows-manager-4175585974 -[11]: https://opensource.com/article/19/12/fvwm-linux-desktop -[12]: https://opensource.com/article/19/12/linux-mlvwm-desktop -[13]: https://opensource.com/article/19/1/productivity-tool-tint2 -[14]: https://opensource.com/article/19/12/xfce-linux-desktop -[15]: http://stalonetray.sourceforge.net/ -[16]: https://offog.org/code/vdesk diff --git a/sources/tech/20191224 Top articles for learning Python in 2020.md b/sources/tech/20191224 Top articles for learning Python in 2020.md deleted file mode 100644 index 3b0ba8b166..0000000000 --- a/sources/tech/20191224 Top articles for learning Python in 2020.md +++ /dev/null @@ -1,72 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Top articles for learning Python in 2020) -[#]: via: (https://opensource.com/article/19/12/learn-python) -[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg) - -Top articles for learning Python in 2020 -====== -No matter where you are in your Python programming journey, -Opensource.com's top Python articles from 2019 will help you along the -way. -![Hands on a keyboard with a Python book ][1] - -Python had a big year in 2019. According to popular resources like [GitHub][2] and [Stack Overflow][3], it's trending as the second most popular language in the world. - -> "Python, the fastest-growing major programming language, has risen in the ranks of programming languages in our survey yet again, edging out Java this year and standing as the second most loved language (behind Rust)." -> — [Stack Overflow Insights][3] - -Similarly, Python grew in readership on Opensource.com by leaps and bounds. Here are the top Python articles from 2019, grouped by topic, for your perusal. - -### Why choose Python? - -There are many languages out there, so what makes Python such a destination? If the most-read articles tell us anything, it's that people enjoy its flexibility. There are [multiple paradigms][4] that are accessible to Python developers, as Jigyasa Grover explains, including the popular [object-oriented programming][5] Seth Kenlon's tutorial shows. - -If you're a long-time user and looking for advanced examples of why Python is a perfect language, Moshe Zadka covers his [top 5 reasons for loving Python][6]. If that's not enough, you can also use it play around with powerful tools without a lot of code, like in Parul Pandey's tutorial on [image manipulation][7]. - -### Configuring Python - -As Python's popularity continues to rise, more people are starting with the language than ever before. Many of those first-timers are doing so on the Mac operating system and are using a [guide to setting up Python 3][8] that Moshe and I wrote. - -After installing Python, decisions on where to write your code come next. There are many options when it comes to text editors and integrated development environments (IDEs), but readers appear to favor graphical options, as Stephan Avenwedde's article about [Pythonic][9] and my article on [JupyterLab][10] were the most read articles on that topic in 2019. - -On the path to getting confident with the language, developers will have to face the multitude of options available for how to manage versions of the language and project dependencies. Luckily, László Kiss Kollár's article makes [managing Python packages][11] a bit simpler. - -When you're ready to configure an IDE with all of the features you'll want to make the most of the language, be sure to give the [opinionated linter Black][12] a try, as Moshe explains, to keep your code clean. - -### Wrapping up - -No matter where you are in your path to enjoying Python programming, the top Python articles from 2019 are here to help you along the way. I can't wrap this up without at least one acknowledgment of the importance of testing, and Moshe offers another well-read article [on tox][13] for that purpose. - -Thank you to all the authors who wrote for Opensource.com in 2019! If you're just learning to program in Python, let us know in the comments what you want to know. And, if you're a seasoned veteran, consider sharing your tips and tricks with us by [writing an article][14] about your favorite Python topic. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/learn-python - -作者:[Matthew Broberg][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mbbroberg -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) -[2]: https://octoverse.github.com/#top-languages -[3]: https://insights.stackoverflow.com/survey/2019 -[4]: https://opensource.com/article/19/10/python-programming-paradigms -[5]: https://opensource.com/article/19/7/get-modular-python-classes -[6]: https://opensource.com/article/19/10/why-love-python -[7]: https://opensource.com/article/19/3/python-image-manipulation-tools -[8]: https://opensource.com/article/19/5/python-3-default-mac -[9]: https://opensource.com/article/19/5/graphically-programming-pythonic -[10]: https://opensource.com/article/19/5/jupyterlab-python-developers-magic -[11]: https://opensource.com/article/19/4/managing-python-packages -[12]: https://opensource.com/article/19/5/python-black -[13]: https://opensource.com/article/19/5/python-tox -[14]: https://opensource.com/how-submit-article diff --git a/sources/tech/20191225 12 open source resources for kids and young adults.md b/sources/tech/20191225 12 open source resources for kids and young adults.md deleted file mode 100644 index 48ca3107a4..0000000000 --- a/sources/tech/20191225 12 open source resources for kids and young adults.md +++ /dev/null @@ -1,97 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (12 open source resources for kids and young adults) -[#]: via: (https://opensource.com/article/19/12/kids-students-education) -[#]: author: (Don Watkins https://opensource.com/users/don-watkins) - -12 open source resources for kids and young adults -====== -Explore new technologies with Opensource.com's top 12 articles from 2019 -about learning an open source technology. -![Person reading a book and digital copy][1] - -Are you looking to challenge your children (or even yourself) to learn new things about open source technologies? Whether you're in elementary school, high school, or college, or even a parent or teacher, Opensource.com has some great reading about open source technologies suitable for the younger generation. Here are our top 12 articles from 2019 on open source for students (and those who love them). - -### Hacking math education with Python - -As a student, I had difficulty with the abstraction of mathematics. Traditional classroom instruction didn't work for me. Peter Farrell has another approach for learners who are challenged by conventional mathematics instruction. His unique approach, which teaches math using Python, resonated with me when I interviewed him about how he is [_Hacking math education with Python_][2]. - -### 5 open source tools for teaching young children to read - -No doubt, you have seen how easy it is for children to master today's electronic devices—but what about traditional literacy? Are today's children getting the foundation in reading, writing, and arithmetic that they need to be successful? Laura Janusek's [_5 open source tools for teaching young children to read_][3] may help. She says, "Access to literary environments has been shown to impact literacy and attitudes towards reading. Why not strive to create a digital literacy environment for our kids by filling our devices with educational technologies, just like our shelves are filled with books?" - -### What programming language would you teach a kid first? - -Coding has become a hot area for schools and parents. Opinions abound on the best computer language to teach and when to begin teaching it. Lauren Pritchett celebrated Ada Lovelace Day 2019 by exploring [_What programming language would you teach kids first?_][4] Be sure to take the accompanying poll, too. - -### Getting started with the BBC Microbit - -Learning to code should be fun, and one of the ways to ensure a great early experience is by using an inexpensive open hardware board. In [_Getting started with the BBC Microbit_][5], I provide step-by-step directions and some code examples so your child can learn to program with MicroPython. - -### Introducing kids to computational thinking with Python - -Coding can be the key that lifts children out of poverty and empowers them to gain new skills, confidence, and the knowledge necessary to break free from socioeconomic disadvantages. In [_Introducing kids to computational thinking with Python_][6], I interviewed librarian Qumisha Goss, who is leveraging the power of Python to transform children's lives in Detroit. - -### A dozen ways to learn Python - -Do you know someone who really wants to learn to Python but is looking for the right hook to get started? Removing abstraction has been key to my best learning experiences, and I share some of the resources I've found in [_A dozen ways to learn Python_][7]. They will start you on your journey to Python proficiency and sustain your learning over the long haul. - -### 100 ways to learn Python and R for data science - -Many people want to learn data science but are drowning in the deluge of information available online, leaving them confused about where to find the best book, tutorial, or other learning resources. Where would you turn to learn the skills necessary to play a role in this rapidly growing field? Chris Englehardt, Dorris Scott, and Annu Singh share their suggestions in [_100 ways to learn Python and_ _R for data science_][8]. - -### How a trip to China inspired Endless OS and teaching kids to hack - -I've long been interested in inexpensive, Linux-based computers that help children around the world learn how to code. One of these is Endless' Hack, a low-cost laptop, and an accompanying series of video games designed to get kids coding and become creative problem solvers while they're having fun. In 2019, I got to interview Endless' founder Matt Dalio, where he shares [_How a trip to China inspired Endless OS and teaching kids to hack_][9]. - -### How to use the internet to learn IT skills - -Looking to do something meaningful in the new year? How about helping a few young people take their first steps in an IT career? You can follow the lead of David Clinton, a systems administrator, teacher, and writer, who shares [_How to use the internet to learn IT skills_][10]. Giving students access to open source tools and letting them explore and iterate creates a rich learning experience, he explains. - -### Digital divide? How the Asian Penguins share Linux at Minnesota charter school - -Stu Keroff is an educator who has turned his passion for Linux and open source into a school–community outreach program that serves a large number of immigrant families in Minnesota. He is a husband, father, teacher, speaker, and advocate for Linux in K-12 education and a winner of the [2016 Opensource.com Readers Choice Award][11]. In [_Digital divide? How the Asian Penguins share Linux at Minnesota charter school_][12], Stu shares his Linux-powered solution to expand digital literacy in his community. - -### 13 books for picking up new tech in 2019 - -If you (or someone you know) learn best by reading, my [_13 books for picking up new tech in 2019_][13] may help you discover a new skill that piques your curiosity. The list includes books on everything from Python to Linux to developing games on a Raspberry Pi. - -### 11 surprising ways you use Linux every day - -If you, like me, wonder what powers all the electronic gadgets that power our day-to-day lives today, read my article on [_11 surprising ways you use Linux every day_][14]. You might be amazed at how much we depend on open source to get us through our days. - -### A lifetime of learning - -What would you like to know to help the children in your life expand their tech knowledge and skills? Please share your ideas in the comments, or even consider sharing your own experiences with Opensource.com readers by [submitting an article][15] about your favorite open source education topic. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/kids-students-education - -作者:[Don Watkins][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/don-watkins -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/read_book_guide_tutorial_teacher_student_apaper.png?itok=_GOufk6N (Person reading a book and digital copy) -[2]: https://opensource.com/article/19/1/hacking-math -[3]: https://opensource.com/article/19/4/early-literacy-tools -[4]: https://opensource.com/article/19/10/first-programming-language-kids -[5]: https://opensource.com/article/19/8/getting-started-bbc-microbit -[6]: https://opensource.com/article/19/2/break-down-stereotypes-python -[7]: https://opensource.com/article/19/8/dozen-ways-learn-python -[8]: https://opensource.com/article/19/5/learn-python-r-data-science -[9]: https://opensource.com/article/19/6/endless-digital-literacy -[10]: https://opensource.com/article/19/5/it-skills-internet -[11]: https://opensource.com/community/16/2/winners-2016-community-awards -[12]: https://opensource.com/article/19/2/asian-penguins-close-digital-divide -[13]: https://opensource.com/article/19/1/tech-books-new-skils -[14]: https://opensource.com/article/19/8/everyday-tech-runs-linux -[15]: https://opensource.com/how-submit-article diff --git a/sources/tech/20191225 5 security tips from Santa.md b/sources/tech/20191225 5 security tips from Santa.md deleted file mode 100644 index 1c2f83c02a..0000000000 --- a/sources/tech/20191225 5 security tips from Santa.md +++ /dev/null @@ -1,84 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (5 security tips from Santa) -[#]: via: (https://opensource.com/article/19/12/security-tips) -[#]: author: (Mike Bursell https://opensource.com/users/mikecamel) - -5 security tips from Santa -====== -Stay off Santa's (and your employer's) naughty list by following this -list of useful security tips and practices. -![Security monster][1] - -If you're reading this in 2019, it's almost Christmas (as celebrated according to the Western Christian calendar), and, like all children and IT professionals, it's time to write your letter to Santa/St. Nick/Father Christmas. Don't forget: those who have been good get nice presents and those who haven't get coal. Coal is _not_ a clean-burning fuel, and with climate change well and truly upon us,[1][2] you don't want to be going for the latter option. - -Think back to all of the good security practices you've adopted over the past 11 or so months. And then think back to all of the bad security practices you've adopted when you should have been doing the _right_ thing. Oh, dear. It's not looking good for you, is it? - -Here's the good news, though: because Santa is a benevolent soul, there's time to make amends (unless you're reading this after Christmas[2][3]). Here's a list of useful security tips and practices that Santa follows and therefore are bound to put you on his "good" side. - -### 1\. Use a password manager - -Santa is very careful with his passwords. Here's a little secret: from time to time, rather than have his elves handcraft every little present, he sources his gifts from other parties. I'm not suggesting that he pays market rates (he's ordering in bulk, and he has a very, very good credit rating), but he uses lots of different suppliers, and he's aware that not all of them take security as seriously as he does. He doesn't want all his account logins to be leaked if one of his suppliers is hacked, so he uses separate passwords for each account. Now, Santa, being Santa, could remember all of these details if he wanted to—and even generate unique passwords that meet all the relevant complexity requirements for each site—but he uses an open source [password manager][4] for safety and for succession planning.[3][5] - -### 2\. Manage personal information properly - -You may work for a large company, organisation, or government, and you may think you have lots of customers and associated data, but consider Santa. He manages (or has managed) names, birth dates, addresses, hobbies, shoe sizes, colour preferences, and other personal data for literally every person on Earth. That's an awful lot of sensitive data, and it needs to be protected. When people grow too old for presents from Santa,[4][6] he needs to delete their data securely. In fact, Santa may well be the archetypal [GDPR][7] data controller, and he needs to be very careful who and what can access the data that he holds. Of course, he encrypts all the data and is very careful about key management. He's also very aware of the dangers associated with cold boot attacks (given the average temperature around his residence), so he ensures data is properly wiped before shutdown. - -### 3\. Measure and mitigate risk - -Santa knows all about [risk][8]. He has complex systems for ordering, fulfillment, travel planning, logistics, and delivery that are the envy of most of the world. He understands what impact failure in any part of the supply chain can have on his customers: mainly children and IT professionals. He quantifies risk, recalculating it on a regular basis to ensure that he is up to date with possible vulnerabilities and ready with mitigations. - -### 4\. Patch frequently but carefully - -Santa absolutely cannot afford for his systems to go down, particularly around his most busy period. He has established processes to ensure that the [concerns of security are balanced with the needs of the business][9].[5][10] He knows that sometimes business continuity must take priority, and on other occasions, the impact of a security breach would be so major that patches just _have_ to be applied. He tells people what he wants and listens to their views, taking them into account where he can. In other words, he embraces open management, delegating decisions where possible to the people who are best positioned to make the call, and only intervenes when asked for an executive decision or when exceptions arise. Santa is a _very_ enlightened manager. - -### 5\. Embrace diversity - -One of the useful consequences of running a global operation is that Santa values diversity. Old or young (at heart); male, female, or gender-neutral; neurotypical or neurodiverse; of any culture, sexuality, race, ability, creed, or nose colour, Santa takes into account his stakeholders and their views on what might go wrong. What a fantastic set of viewpoints Santa has available to him! And he's surprisingly hip to the opportunities for security practices that a wide and [diverse set of opinions and experiences][11] can bring[6][12] not to mention the multiple [positive impacts][13] on his organisation. - -### Summary - -Here's my advice: Be like Santa, and adopt at least some of his security practices. You'll have a much better opportunity of getting onto his good side, and that's going to go down well—not just with him, but also with your employer, who is just certain to give you a nice bonus, right? And if not, well, it's not too late to write that letter directly to Santa himself. - -* * * - - 1. If you have a problem with this statement, then either you need to find another article, or you're reading this in the far future where all our climate problems have been solved. I hope. - 2. Or you dwell in one of those cultures where Santa visits quite early in December. - 3. A high-flying goose in the face can do terrible damage to a fast-moving reindeer, and if the sleigh were to crash, what then...? - 4. Not me! - 5. Santa doesn't refer to it as a "business," but he's happy for us to call it that, so we can model our own experience on his. He's nice like that. - 6. Though Santa would never use the phrase "hip to the opportunities." He's way too cool for that. - - - -Download the free All Things Open interview series eBook Jessica McKellar is an entrepreneur,... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/security-tips - -作者:[Mike Bursell][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mikecamel -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_password_chaos_engineer_monster.png?itok=J31aRccu (Security monster) -[2]: tmp.PgLkHLx1Uz#1 -[3]: tmp.PgLkHLx1Uz#2 -[4]: https://opensource.com/article/18/4/3-password-managers-linux-command-line -[5]: tmp.PgLkHLx1Uz#3 -[6]: tmp.PgLkHLx1Uz#4 -[7]: https://opensource.com/article/18/1/being-open-about-data-privacy -[8]: http://aliceevebob.com/2019/03/12/dont-talk-security-talk-risk/ -[9]: http://aliceevebob.com/2017/10/17/stop-reading-start-patching/ -[10]: tmp.PgLkHLx1Uz#5 -[11]: http://aliceevebob.com/2017/08/08/diversity-in-it-security-not-just-a-canine-issue/ -[12]: tmp.PgLkHLx1Uz#6 -[13]: https://opensource.com/article/19/11/diversity-and-inclusion-strategies diff --git a/sources/tech/20191225 Khadas VIM3L- An Open Source HTPC Device.md b/sources/tech/20191225 Khadas VIM3L- An Open Source HTPC Device.md deleted file mode 100644 index 9d25522d26..0000000000 --- a/sources/tech/20191225 Khadas VIM3L- An Open Source HTPC Device.md +++ /dev/null @@ -1,149 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Khadas VIM3L: An Open Source HTPC Device) -[#]: via: (https://itsfoss.com/vim3l/) -[#]: author: (Community https://itsfoss.com/author/itsfoss/) - -Khadas VIM3L: An Open Source HTPC Device -====== - -If you’ve read our list of [Raspberry Pi alternatives][1], you might have come across VIM by Khadas. - -China-based [Khadas][2] is becoming increasingly popular for its single board computers (SCB). Apart from the generic do-it-yourself (DIY) VIM series, Khadas also has [Tone boards][3] that can be utilized for DJing and [Edge][4] boards for AI and other related projects. - -As discussed in [Raspberry Pi projects][5], one of the most popular use of a single board computer is to use it as a media center. You can turn your TV in more than just a smart TV (without being monitored) and play local music, videos, pictures and even games on your TV. You can also watch streaming services through these media center. - -You can always configure VIm (or any other SCB) as a media center. It’s a good DIY exercise but not everyone would like it. - -This is why Khadas has introduced [VIM3L][6] which is a ready to use media center device based on VIM 3. In this article, we’ll have a look at this device and see how to set it up. - -### VIM 3L specifications - -One of the strong point of Khadas is its emphasis on open source. All their source code, including [U-Boot][7], mainline Linux and Android is available on [their GitHub repository][8]. - -VIM3L comes with [CoreELEC][9] operating system. CoreELEC is a custom Linux distribution that comes with software like [Kodi][10] and its add-ons to give you a complete HTPC (home theatre PC) experience. - -![][11] - -You are not restricted to CoreELEC though. You can get the barebon version of VIM 3L and use Android or install your a Linux distribution of your choice. - - * Amlogic S905D3 SoC with quad-core Cortex-A55 CPU clocked at 1.9GHz - * 16GB eMMC - * 2GB RAM - * 2x WiFi antennas - * PCIe 2.0 and M.2 NVMe SSD support - * HDMI port - * Dolby Audio - - - -The HTPC version costs slightly more than the bare board but it consists of some additional hardware along with CoreELEC operating system: - - * Transparent DIY case - * Metal DIY case - * Heatsink - * IR Remote - - - -![VIM3L HTPC Kit][12] - -VIM3L is capable of running 4K video at 75 fps. It also includes TrustZone based security for DRM video streaming. Both Android and CoreELEC are capable of [OTA updates][13]. - -[VIM3L HTPC version costs $89.99][14] and the bare board (with Android) costs $69.99. It’s FOSS readers can _**get $6 off with itsfossfuns coupon code**_ that can be used at the checkout page of Khadas shop. - -[Khadas VIM3 Series][15] - -You may opt for the free shipping option but it will take 2-3 weeks for the device to reach you from China. You can pay $20 extra for an express DHL shipping. The shipping options are available at checkout. I think you might have to pay custom tax depending on your country’s rules so ordering one from Amazon would be better in such a case but you won’t get the It’s FOSS special discount on Amazon. - -Now that you are aware of the specifications, let me show you how to set it up and how was my experience with it. - -_The amazon links in this article are affiliate links. Please read our [affiliate policy][16]._ - -### Setting up VIM3L and using it as home theatre PC - -Initially, when you start VIM3L, a window appears on the screen which consists of a series of questions and options. Everything you choose determines the initial state of its operation. In each case, however, you can modify your options from the settings menu. Better not to rush through the settings, since the multitude of options you have at startup seem to turn the VIM3L into a superpower device. - -![Setting up proxy network][17] - -The addition of the proxy connectivity in the internet settings is a welcome option. As a enthusiast of user privacy, I enabled it to connect through the [Tor network][18]. The choice is of course yours. - -![Peripheral devices][19] - -You can modify how many and which peripheral devices you have on that device. For example, in addition to the handheld control, you can mount a keyboard or even a console controller. Correct! A console controller that will allow you to play games. - -![Option to save logs][20] - -An important addition is the log storage option. With this, the users can consult the logs in case of an event of an error or malfunction. This could help in troubleshooting the issue. - -![Plenty of add-ons][21] - -On the left, a user can see options such as music, videos, radio, photos, games and many other options that we would like to take some time to cover. - -Add-ons further extends the capabilities of your HTPC. Here, you can find music libraries, documentaries, games, open-source software and more. The software includes various graphics, audio, and video editors, simulators etc. - -You have the freedom to choose whether you want to download them through 3rd party repositories, or from the environment of the accessory. Also, if you try to install software, you will most likely notice that along with the program, appropriate libraries and software are also installed. As you can see, this is not an accessory from scratch, but an accessory that is ready to cope with its users’ choices. - -VIM3L has different configuration profile consisting of a standard, intermediate, expert profile. As you climb into difficulty, your choices are multiplied, giving you total freedom. - -### Thoughts on VIM3L - -![][22] - -I liked VIM3L for what it offers. This is not to say that it is a perfect device. - -I found that some point, the controller is not fully accurate in signal transmission. As a result, after pressing a button twice, the signal is sent later and there is a quick change of screen. Maybe the controller I received was faulty. - -In conclusion, I would like to say that it’s not an expensive device and the feature it offers are good enough to provide you with entertainment, fun, productivity, and creativity. Most importantly, the software it offers are free and open source. - -If you like what you see here, you can either order it from [its own shop that ships from China][6] or get it from [Amazon][23]. - -Preview | Product | Price | ----|---|---|--- -![Khadas Amlogic S905D3 VIM3L HTPC Kit][24] ![Khadas Amlogic S905D3 VIM3L HTPC Kit][24] | [Khadas Amlogic S905D3 VIM3L HTPC Kit][25] | $89.99[][26] | [Buy on Amazon][27] - -Have you used VIM3L or any other pre-built media center device? Or do you prefer making your own HTPC? Do share your views. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/vim3l/ - -作者:[Community][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/itsfoss/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/raspberry-pi-alternatives/ -[2]: https://www.khadas.com/ -[3]: https://www.amazon.com/dp/B07K6GQNH3?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Tone boards) -[4]: https://www.khadas.com/edge -[5]: https://itsfoss.com/raspberry-pi-projects/ -[6]: https://www.khadas.com/vim3l -[7]: https://www.denx.de/wiki/U-Boot -[8]: https://github.com/khadas -[9]: https://coreelec.org/ -[10]: https://itsfoss.com/install-kodi-ubuntu/ -[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/VIM3L_OS_Freedom_graphic.jpg?ssl=1 -[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/12/VIM3L-Htpc-Kit.jpg?ssl=1 -[13]: https://source.android.com/devices/tech/ota -[14]: https://www.amazon.com/dp/B081H66D7Q?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (VIM3L HTPC version costs $89.99) -[15]: https://www.khadas.com/shop-vim3 -[16]: https://itsfoss.com/affiliate-policy/ -[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/12/khadas_vim3l_3.jpg?ssl=1 -[18]: https://itsfoss.com/tor-guide/ -[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/khadas_vim3l_2.jpg?ssl=1 -[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/khadas_vim3l_4.jpg?ssl=1 -[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/12/khadas_vim3l_1.jpg?ssl=1 -[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/12/VIM3L.jpg?ssl=1 -[23]: https://www.amazon.com/dp/B081H66D7Q?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Amazon) -[24]: https://i0.wp.com/m.media-amazon.com/images/I/41YC-mlA2PL._SL160_.jpg?ssl=1 -[25]: https://www.amazon.com/dp/B081H66D7Q?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Khadas Amlogic S905D3 VIM3L HTPC Kit) -[26]: https://www.amazon.com/gp/prime/?tag=chmod7mediate-20 (Amazon Prime) -[27]: https://www.amazon.com/dp/B081H66D7Q?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Buy on Amazon) diff --git a/sources/tech/20191225 Making trade-offs when writing Python code.md b/sources/tech/20191225 Making trade-offs when writing Python code.md deleted file mode 100644 index 47da30cb93..0000000000 --- a/sources/tech/20191225 Making trade-offs when writing Python code.md +++ /dev/null @@ -1,61 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Making trade-offs when writing Python code) -[#]: via: (https://opensource.com/article/19/12/zen-python-trade-offs) -[#]: author: (Moshe Zadka https://opensource.com/users/moshez) - -Making trade-offs when writing Python code -====== -This is part of a special series about the Zen of Python focusing on the -seventh, eighth, and ninth principles: readability, special cases, and -practicality. -![Brick wall between two people, a developer and an operations manager][1] - -Software development is a discipline rife with trade-offs. For every choice, there is an equally defensible but opposite choice. Make a method private? You're encouraging copy-paste. Make a method public? You're committing prematurely to an interface. - -Software developers make hard choices every minute. While all the principles in the [Zen of Python][2] cover trade-offs to some extent, the following principles take the hardest, coldest look at some trade-offs. - -### Readability counts. - -In some sense, this middle principle is indeed the center of the entire Zen of Python. The Zen is not about writing efficient programs. It is not even about writing robust programs, for the most part. It is about writing programs that _other people can read_. - -Reading code, by its nature, happens after the code has been added to the system. Often, it happens long after. Neglecting readability is the easiest choice since it does not hurt right now. Whatever the reason for adding new code—a painful bug or a highly requested feature—it does hurt. Right now. - -In the face of immense pressure to throw readability to the side and just "solve the problem," the Zen of Python reminds us: readability counts. Writing the code so it can be read is a form of compassion for yourself and others. - -### Special cases aren't special enough to break the rules. - -There is always an excuse. This bug is particularly painful; let's not worry about simplicity. This feature is particularly urgent; let's not worry about beauty. The domain rules covering this case are particularly hairy; let's not worry about nesting levels. - -Once we allow special pleading, the dam wall breaks, and there are no more principles; things devolve into a Mad Max dystopia with every programmer for themselves, trying to find the best excuses. - -Discipline requires commitment. It is only when things are hard, when there is a strong temptation, that a software developer is tested. There is always a valid excuse to break the rules, and that's why the rules must be kept the rules. Discipline is the art of saying no to exceptions. No amount of explanation can change that. - -### Although, practicality beats purity. - -> "If you think only of hitting, springing, striking, or touching the enemy, you will not be able actually to cut him." -> — Miyamoto Musashi, _[The Book of Water][3]_ - -Ultimately, software development is a practical discipline. Its goal is to solve real problems, faced by real people. Practicality beats purity: above all else, we must _solve the problem_. If we think only about readability, simplicity, or beauty, we will not be able to actually _solve the problem_. - -As Musashi suggested, the primary goal of every code change should be to _solve a problem_. The problem must be foremost in our minds. If we waver from it and think only of the Zen of Python, we have failed the Zen of Python. This is another one of those contradictions inherent in the Zen of Python. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/zen-python-trade-offs - -作者:[Moshe Zadka][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/devops_confusion_wall_questions.png?itok=zLS7K2JG (Brick wall between two people, a developer and an operations manager) -[2]: https://www.python.org/dev/peps/pep-0020/ -[3]: https://en.wikipedia.org/wiki/The_Book_of_Five_Rings#The_Book_of_Water diff --git a/sources/tech/20191226 -server- is hard to define.md b/sources/tech/20191226 -server- is hard to define.md deleted file mode 100644 index e53338857b..0000000000 --- a/sources/tech/20191226 -server- is hard to define.md +++ /dev/null @@ -1,196 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: ("server" is hard to define) -[#]: via: (https://jvns.ca/blog/2019/12/26/whats-a-server/) -[#]: author: (Julia Evans https://jvns.ca/) - -"server" is hard to define -====== - -Somebody asked me recently what a server was, and I had a harder time explaining it than I expected! I thought I was going to be able to give some kind of simple pithy answer but it kind of got away from me. So here’s an short exploration of what the word “server” can mean: - -### a server responds to requests - -A server definitely responds to requests. A few examples: - -webserver: - -``` -Me: "please give me google.com" -Server: "here is the HTML for that webpage" -``` - -bittorrent server: - -``` -Me: "I would like this chunk of the good wife season 2" -Server: "here are some of the bytes from that .avi file!" -``` - -mail server: - -``` -Me: "can you send this email to [email protected]" -Server: "I sent it!" -``` - -But what is a server actually specifically exactly? - -### a server is a program - -My first instinct is to say “a server is a program” because for example a “the wordpress server” is a PHP program, so let’s start with that. - -A server is usually a program that listens on a **port** (like 80). For example, if we’re talking about a Rails webserver, then the program is a Ruby program that’s listening on a port for HTTP requests. - -For example, we can start a Python server to serve files out of the current directory. - -``` -$ python3 -m http.server & -Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) .. -``` - -and send requests to it with `curl`: - -``` -$ curl localhost:8000/config.yaml -baseurl: https://jvns.ca -disablePathToLower: true -languageCode: en-us -title: Julia Evans -author: Julia Evans -... -``` - -### a server might be a virtual machine - -But often when I talk about “a server” at work, I’ll use it in a sentence like “I’m going to SSH to that server to see what’s going on with it”, or “wow, that server is swapping a lot, that’s bad!“. - -So in those cases clearly I don’t mean a program when I say “that server” (you can’t ssh to a program, though the ssh server that runs on the VM is itself a program!), I mean the AWS instance that the server program is running on. That AWS instance is a virtual machine, which looks like a computer in a lot of ways (it’s running an operating system!) but it isn’t a physical computer. - -### a server might be a container - -Similarly to how your server might be a virtual machine, it could also be a container running in a virtual machine. So “the server is running out of memory” could mean “the container is running out of memory and crashing” which really means “we set a cgroup memory limit on this container and the programs in the container with that cgroup exceeded the limit so the Linux kernel OOM killed them”. - -But containers make everything a lot more complicated so I think we should stop there for now. - -### a server is a computer - -But also when you **buy** a server from Dell or some other computer company, you’re not buying a virtual machine, you’re buying an actual physical machine. - -Usually these computers are in building datacenters. For example in this video you can see thousands of servers in a Google datacenter. - -The computers in this datacenter don’t look like the computers in my house! They’re short and wide because they’re designed to fit into these giant racks of servers. For example if you search Newegg for [1U server][1] you’ll find servers that are 1 “[rack unit][2]” high, and a rack unit is 1.75 inches. There are also 2U servers which are twice as high. - -Here’s a picture of a 1U server I found on Newegg: - -![][3] - -I’ve only seen a server rack once at the [Internet Archive][4] which is in what used to be a church in San Francisco, and it was really cool to realize – wow, when I use the Wayback Machine it’s using the actual computers in this room! - -### “the server” might be 1000 computers - -Next, let’s say we’re talking about how Gmail works. You might ask “hey, when I search my email to find my boarding pass, does that happen in the frontend or on the server?”. - -The answer is “it happens on the server”, but what’s “the server” here? There’s not just one computer or program or virtual machine that searches your Gmail, there are probably lots of computers and programs at Google that are reponsible for that and they’re probably distributed across many datacenters all over the world. - -And even if we’re just talking about doing 1 search, there could easily be 20 different computers in 3 different countries involved in just running that 1 search. - -So the words “the server” in “oh yeah, that happens on the server” mean something kind of complicated here – what you’re actually saying is something “well the browser makes a request, and that request does _something_, but I’m not really going to worry about what because the important thing is just that the browser made a request and got some kind of response back.” - -### what happens when I search my email for a boarding pass? - -When I search for “boarding” in my email, the Javascript running on the frontend puts together this request. It’s mostly indecipherable but it definitely contains the word “boarding”: - -``` -{ - "1": { - "1": 79, - "2": 101, - "4": "boarding", - "5": { - "5": 0, - "12": "1577376926313", - "13": -18000000 - }, - "6": "itemlist-ViewType(79)-5", - "7": 1, - "8": 2000, - "10": 0, - "14": 1, - "16": { - "1": 1, - "2": 0, - "3": 0, - "7": 1 - }, - "19": 1 - }, - "3": { - "1": "0", - "2": 5, - "5": 1, - "6": 1, - "7": 1 - } -} -``` - -We get a response back which is large and complicated and definitely contains search results from my email about boarding passes. Here’s an excerpt: - -``` -"your electronic boarding pass. You could also be asked to display this \nmessage to airport security. * PLEASE NOTE: A printable", -"the attached boarding pass to present at the airport. Manage your booking \nBooking Details Passenger: JULIA EVANS Booking", -"Electronic boarding pass is not offered for your flight. Click the link \nbelow to access the PRINTABLE VERSION of your boarding", -"Save time at the airport Save time at the airport Web version", -"GET YOUR BOARDING PASS IN ADVANCE > You can now check in for your flight \nand you will receive a boarding pass > allowing", -"Save time at the airport Save time at the airport Web version", -"Booking Confirmation Booking Reference: xxxxxx Date of issue: xxxxxxxxxxxx \nSelect Seats eUpgrade", -"your electronic boarding pass. You could also be asked to display this \nmessage to airport security. * PLEASE NOTE: A printable", -"your electronic boarding pass. You could also be asked to display this \nmessage to airport security. * PLEASE NOTE: A printable", -"Save time at the airport Save time at the airport Web version", -"house was boarded up during the last round of bombings. I have no spatial \nimagination and cannot picture the house in three", -"Booking Confirmation Booking Reference: xxxxxx Date of issue: xxxxxxxxxxxx \nSelect Seats eUpgrade" -"required when boarding a flight to Canada. For more details, please visit \nCanada.ca/eTA . - Terms and Conditions of Sale", -"Your KLM boarding pass(s) on XXXXXX To: [image: KLM SkyTeam] Boarding \ninformation Thank you for checking in! Attached you", -"Boarding information Thank you for checking in! Attached you will find your \nboarding pass and/or other documents. Below", -"jetBlue® Your upcoming trip to SEATTLE, WA on xxxxxxxxxxx Flight status \nBaggage info Airport info TAG", -"your electronic boarding pass. You could also be asked to display this \nmessage to airport security. * PLEASE NOTE: A printable" -``` - -That request got sent to 172.217.13.197:443, which corresponds to some edge server near me. There were probably many other computers involved in searching my email than just the first one who got my request, but the nice thing about this is that we don’t need to care exactly what happened behind the scenes! The browser sent a request, and it got search results back, and it doesn’t need to know what servers. - -We can just say “it happens on the server” and not worry too much about the ambiguity of what exactly that means (until something weird goes wrong :)). - -### the meaning of “server” depends on the context - -So we’ve arrived somewhere a little bit interesting – at first when I thought about the question “what’s a server?” I really thought there was going to be a single simple answer! But it turns out that if you look at sentences where we use the word “server” it can actually refer to a lot of different things in a way that can be confusing: - - * “Let me just ssh into the server and see what’s going on” => a virtual machine (or possibly a computer) - * “I sent a SIGTERM to the server and that fixed the problem” => a program - * “Let’s look at the server code” => a program - * “Let’s buy 20 of those 2U servers” => a computer - * “We need to add more server capacity” => a program and a virtual machine probably - * “That happens on the server” => possibly some complex distributed system - - - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019/12/26/whats-a-server/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://www.newegg.com/p/pl?d=1u+server -[2]: https://en.wikipedia.org/wiki/Rack_unit -[3]: https://c1.neweggimages.com/NeweggImage/ProductImage/11-152-136-02.jpg -[4]: https://archive.org/ diff --git a/sources/tech/20191226 10 articles to become more data science savvy.md b/sources/tech/20191226 10 articles to become more data science savvy.md deleted file mode 100644 index f334c7451a..0000000000 --- a/sources/tech/20191226 10 articles to become more data science savvy.md +++ /dev/null @@ -1,123 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (10 articles to become more data science savvy) -[#]: via: (https://opensource.com/article/19/12/data-science-resources) -[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeo) - -10 articles to become more data science savvy -====== -Boost your data science game in 2020 with Opensource.com's top 10 -most-read articles on the topic from 2019. -![Open data brain][1] - -When LinkedIn released its third annual [Emerging Jobs report][2], engineers everywhere said, "Amen." More than half the list consists of engineering roles, with new fields like robotics appearing for the first time. - -But data science had a strong showing as well. The role shows 37% annual growth, topping that aspect of the Emerging Jobs list for the third year in a row. - -Looking at the core skills a data scientist needs—including R, Python, and Apache Spark—it's easy to find overlaps with open source. So, we're not surprised that data science was one of the most popular topics at Opensource.com in 2019. - -We saw a need for knowledge about diverse data science topics. And our community of authors delivered answers. - -For your reading pleasure, we've listed the top 10 data science articles of 2019. We define "top" as the data science articles that were published in 2019 and earned the most page views, starting with the most popular. - -Whether you want to use Kubernetes for batch jobs or query 10 years' worth of GitHub data, these articles will boost your data science game in 2020. - -### Why data scientists love Kubernetes - -Kubernetes is having more than a moment. That's due in no small part to its versatility. You might already know that Kubernetes helps software developers and system operators deploy applications in Linux containers. But did you know how helpful it can be for data science as well? - -In [_Why data scientists love Kubernetes_][3], our most popular data science article in 2019, William Benton and Sophie Watson share how Kubernetes supports the data science workflow. From repeatable batch jobs to debugging ML models, this article shares several ways for data scientists to leverage Kubernetes. - -### How to use Spark SQL: A hands-on tutorial - -Wondering how to use a cloud service for big data analytics? [_How to use Spark SQL: A hands-on tutorial_][4] uses Spark DataFrames to show how to use relational databases at scale. DJ Sarkar uses a real-world dataset to walk readers through the process of using Spark SQL. - -Rich with screenshots and code, Sarkar's tutorial is the ideal sequel to [his first piece][5] on this subject. He shares several ways that you can use Spark to manage structured data obtained from flat files or databases. - -### 9 resources for data science projects - -The growth of data science in open source—from machine learning to neural networks—has left many engineers wanting to learn more. In [_9 resources for data science projects_][6], Dan Barker shares the books, tools, and online courses he thinks are a must for any engineer who wants to get started. - -Barker is especially keen on Cathy O'Neil's book [_Weapons of Math Destruction_][7], which shares how bias creeps into data and how you can stop it. He also shares a range of websites for newbies to explore. - -### Getting started with data science using Python - -Alongside the rise of data science techniques, Python has seen a meteoric rise. It's now one of the most popular programming languages. When used with libraries like pandas and Seaborn, Python is an ideal entry to data science. - -In [_Getting started with data science using Python_][8], a follow-up to his [intro to Python][9] article, Seth Kenlon shares how to create a Python virtual environment; install pandas and NumPy; create a sample dataset; and much more. This article is an especially good read if you want to learn more about data visualization. - -### How to analyze log data with Python and Apache Spark - -Like many articles in our top 10 list, [_How to analyze log data with Python and Apache Spark_][10] is a sequel to [an earlier article][11] on using Python and Apache Spark to wrangle data. Once you've learned how to put your data into a clean, structured format, DJ Sarkar offers this piece to help you analyze that data. - -Whether you want to see the top 10 error endpoints or content size statistics, Sarkar shows you how to analyze several types of log data in your [DataFrame][12]. The data that he uses isn't "big data" from a size or volume standpoint. But these techniques can scale for use with larger datasets. - -### How to wrangle log data with Python and Apache Spark - -[_How to wrangle log data with Python and Apache Spark_][11], DJ Sarkar's prequel to his piece on analyzing log data, also made our top 10 list. It's no surprise since most organizations use a range of systems and infrastructure that run constantly. Data logs are an ideal way to make sure that everything keeps working effectively. - -In this tutorial, Sarkar shows how to use Apache Spark on real-world production logs from NASA. He walks through the process of using Spark to do log analytics at scale on semi-structured log data. This ranges from setting up dependencies to data wrangling. - -### Querying 10 years of GitHub data with GHTorrent and Libraries.io - -Did you know that you can use Kibana or the Elasticsearch API to turn Amazon S3 object-storage data into a searchable Elasticsearch-type cluster? Likewise, did you know about the project that aims to build an offline version of all data available through GitHub APIs? - -In [_Querying 10 years of GitHub data with GHTorrent and Libraries.io_][13], Pete Cheslock explores how to access and query GHTorrent data. You can do it using several formats, including CSV and Google Big Query. Cheslock uses the latter to search indexed GHTorrent data to learn which software languages, licenses, and rates of growth are most popular for GitHub projects. - -### Predicting NFL play outcomes with Python and data science - -Want to increase your machine learning skills in Python? With the NFL playoff season upon us, it's a great time to read [_Predicting NFL play outcomes with Python and data science_][14], which shares some data science tips to predict plays. - -Christa Hayes shows how to spot weird values, predict downs and play types, make regression plots, and train models. Once you've read her article on [how to format data for training][15], this one is the ideal next step. - -### Analyzing the Stack Overflow Survey with Python and Pandas - -Stack Overflow's annual developer survey is a tech behemoth. Nearly 90,000 developers took this year's 20-minute survey and left a lot of data in their wake. - -To find certain results, Moshe Zadka used the pandas library to search the survey's [anonymized results][16]. If you want to filter Stack Overflow's dataset for certain details (like seeing how many developers use certain languages or contribute to open source projects), Moshe's [_Analyzing the Stack Overflow Survey with Python and Pandas_][17] tutorial shows you how. - -### 4 Python tools for getting started with astronomy - -For readers with their heads in the clouds, NumFOCUS republished some of its blog posts on Opensource.com this year. In [_4 Python tools for getting started with astronomy_][18], Dr. Gina Helfrich shares how you can get involved in astronomy. - -Intimidated? Don't be: Dr. Helfrich says Python packages are so advanced that building data-reduction scripts is much easier than ever before. If you want to play with astronomy imaging datasets, this piece will steer you in the right direction. - -### What do you want to know about data science? - -Data science is an exciting field with countless things to explore. If there's something you want to know about data science, please tell us about it in the comments so we can try to cover it in 2020. Or, if you are so inclined, please share your knowledge with Opensource.com readers by [submitting an article][19] about your favorite data science topic. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/data-science-resources - -作者:[Lauren Maffeo][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/lmaffeo -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc_520x292_opendata_0613mm.png?itok=UIjD_jhK (Open data brain) -[2]: https://business.linkedin.com/content/dam/me/business/en-us/talent-solutions/emerging-jobs-report/Emerging_Jobs_Report_U.S._FINAL.pdf -[3]: https://opensource.com/article/19/1/why-data-scientists-love-kubernetes -[4]: https://opensource.com/article/19/3/apache-spark-and-dataframes-tutorial -[5]: https://opensource.com/article/19/3/sql-scale-apache-spark-sql-and-dataframes -[6]: https://opensource.com/article/19/2/learn-data-science-ai -[7]: https://www.amazon.com/Weapons-Math-Destruction-Increases-Inequality/dp/0553418815 -[8]: https://opensource.com/article/19/9/get-started-data-science-python -[9]: https://opensource.com/article/17/10/python-101 -[10]: https://opensource.com/article/19/5/visualize-log-data-apache-spark -[11]: https://opensource.com/article/19/5/log-data-apache-spark -[12]: https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html#dataframe -[13]: https://opensource.com/article/19/5/chaossearch-github-ghtorrent -[14]: https://opensource.com/article/19/10/predicting-nfl-plays-python -[15]: https://opensource.com/article/19/10/formatting-nfl-data-python -[16]: https://insights.stackoverflow.com/survey -[17]: https://opensource.com/article/19/9/stack-overflow-survey-python-pandas -[18]: https://opensource.com/article/19/10/python-astronomy-open-data -[19]: https://opensource.com/how-submit-article diff --git a/sources/tech/20191226 How the Zen of Python handles errors.md b/sources/tech/20191226 How the Zen of Python handles errors.md deleted file mode 100644 index 030c889db3..0000000000 --- a/sources/tech/20191226 How the Zen of Python handles errors.md +++ /dev/null @@ -1,56 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How the Zen of Python handles errors) -[#]: via: (https://opensource.com/article/19/12/zen-python-errors) -[#]: author: (Moshe Zadka https://opensource.com/users/moshez) - -How the Zen of Python handles errors -====== -This is part of a special series about the Zen of Python focusing on the -10th and 11th principles: on the silence (or not) of errors. -![a checklist for a team][1] - -Handling "exceptional conditions" is one of the most debated issues in programming. That could be because the stakes are high: mishandled error values can bring down even the largest systems. Since "exception conditions," by nature, are the least tested but occur with unpleasant frequency, correctly handling them can often distinguish a system that horror stories are told about to a system that "just works." - -From Java's **checked** exceptions through Erlang's fault isolation to Haskell's **Maybe**, different languages have remarkably different attitudes to error handling. - -The [Zen][2] offers Python's meditation on the topic. - -### Errors should never pass silently… - -Before the Zen of Python was a twinkle in Tim Peters' eye, before Wikipedia became informally known as "wiki," the first WikiWiki site, [C2][3], existed as a trove of programming guidelines. These are principles that mostly came out of a [Smalltalk][4] programming community. Smalltalk's ideas influenced many object-oriented languages, Python included. - -The C2 wiki defines the Samurai Principle: "return victorious, or not at all." In Pythonic terms, it encourages eschewing sentinel values, such as returning **None** or **-1** to indicate an inability to complete the task, in favor of raising exceptions. A **None** is silent: it looks like a value and can be put in a variable and passed around. Sometimes, it is even a _valid_ return value. - -The principle here is that if a function cannot accomplish its contract, it should "fail loudly": raise an exception. The raised exception will never look like a possible value. It will skip past the **returned_value = call_to_function(parameter)** line and go up the stack, potentially crashing the program. - -A crash is straightforward to debug: there is a stack trace indicating the problem as well as the call stack. The failure might mean that a necessary condition for the program was not met, and human intervention is needed. It might mean that the program's logic is faulty. In either case, the loud failure is better than a hidden, "missing" value, infecting the program's valid data with **None**, until it is used somewhere and an error message says "**None does not have method split**," which you probably already knew. - -### Unless explicitly silenced. - -Exceptions sometimes need to be explicitly caught. We might anticipate some of the lines in a file are misformatted and want to handle those in a special way, maybe by putting them in a "lines to be looked at by a human" file, instead of crashing the entire program. - -Python allows us to catch exceptions with **except**. This means errors can be _explicitly_ silenced. This explicitness means that the **except** line is visible in code reviews. It makes sense to question why this is the right place to silence, and potentially recover from, the exception. It makes sense to ask if we are catching too many exceptions or too few. - -Because this is all explicit, it is possible for someone to read the code and understand which exceptional conditions are recoverable. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/zen-python-errors - -作者:[Moshe Zadka][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/checklist_hands_team_collaboration.png?itok=u82QepPk (a checklist for a team) -[2]: https://www.python.org/dev/peps/pep-0020/ -[3]: https://wiki.c2.com/ -[4]: https://en.wikipedia.org/wiki/Smalltalk diff --git a/sources/tech/20191226 Top 10 Raspberry Pi articles of 2019.md b/sources/tech/20191226 Top 10 Raspberry Pi articles of 2019.md deleted file mode 100644 index e4fae2c6ca..0000000000 --- a/sources/tech/20191226 Top 10 Raspberry Pi articles of 2019.md +++ /dev/null @@ -1,72 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Top 10 Raspberry Pi articles of 2019) -[#]: via: (https://opensource.com/article/19/12/raspberry-pi-2019) -[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) - -Top 10 Raspberry Pi articles of 2019 -====== -Take a look back at the year in Raspberry Pi and get excited for what's -to come in 2020. -![Raspberries with pi symbol overlay][1] - -Since its introduction, the Raspberry Pi has been one of the hottest topics on Opensource.com. This trend continued in 2019 with an impressive list of over 30 articles about various Raspberry Pi projects. The top 10 articles are covered below, but if you are a true Raspberry Pi aficionado, I encourage you to check out out our entire selection of [Raspberry Pi articles][2]. - - 1. _[Turn a Raspberry Pi 3B+ into a PriTunl VPN][3]_ by Stephen Bancroft demonstrates how to set up a PriTunl virtual private networking (VPN) on a Raspberry Pi 3B+. There are several sticky points about the process that Bancroft helpfully and clearly explains. Following his instructions, you can easily turn a Raspberry Pi into a VPN server. - - 2. In _[Let’s get physical: How to use GPIO pins on the Raspberry Pi][4]_, Anderson Silva provides a brief introduction to using the GPIO pins on a Raspberry Pi. The article is full of links to other resources, including some of Silva’s other pieces, for those who want to dig deeper into the topic. - - 3. Sam Bocetta’s article _[How to use your Raspberry Pi as a VPN server][5]_, demonstrates how to install and configure PiVPN on a Raspberry Pi to create a VPN server. The article covers every aspect of the installation and configuration process, so if the reader has followed all the instructions provided, they will end up with their own Raspberry Pi-powered VPN. - - 4. _[Program the real world using Rust on Raspberry Pi][6]_ by Rahul Thakoor explores how to use the Rust programming language on the Raspberry Pi. By adding **rust_gpiozero** to a Rust project, it is possible to write code in Rust that can interact with buttons, servos, and other hardware connected to a Raspberry Pi. This article shows you how to get started. - - 5. Ben Nuttall, Raspberry Pi community manager, proclaims _[Raspberry Pi 4 is here!][7]_ in this article covering the release of the Raspberry Pi 4. The Raspberry Pi 4 features many improvements over previous Raspberry Pi models, and Nuttall walks through them in detail. From the new hardware features to the software updates in the updated release of Raspbian, this article brings you up to speed on what the Raspberry Pi 4 brings to the Raspberry Pi ecosystem. - - 6. _[How to build a WiFi picture frame with a Raspberry Pi][8]_ by Manuel Dewald shows you how to create a WiFi-connected digital picture frame using a Raspberry Pi 3. This step-by-step tutorial provides all the instructions needed to configure the software, but if you want to make a fancy case for your digital picture frame, that part is up to you. - - 7. Anderson Silva’s _[How to boot up a new Raspberry Pi][9]_ explains what you need to do to boot an operating system on a Raspberry Pi. This article primarily provides an overview of NOOBS (New Out Of Box Software) and contains links to the official Raspberry Pi website for the most up-to-date installation instructions. - - 8. _[How to build a mobile particulate matter sensor with a Raspberry Pi][10]_ by Stephan Tetzel illustrates how to build a sensor that can monitor your air quality using a Raspberry Pi, a small LCD display, and an inexpensive sensor. The particulate matter sensor you create can be used anywhere when paired with a power bank. - - 9. _[3 popular programming languages you can learn with Raspberry Pi][11]_ by Anderson Silva looks at programming Python, Java, and JavaScript on the Raspberry Pi. The Thonny IDE for Python and the BlueJ IDE for Java are briefly covered. The article also encourages users who are interested in other programming languages with the assurance that "there’s a high likelihood that you can use your Raspberry Pi to compile or interpret any language of choice, including C, C++, PHP, and Ruby." - - 10. Take a trip down memory lane by _[Resurrecting the Amiga on the Raspberry Pi][12]_ with this guide by Sarah Thornton. Using the instructions provided, you can experience the Amiga again on a Raspberry Pi or several other devices. Thornton even provides a helpful set of links for those interested in learning more about the history of the Amiga. - - - - -I hope these articles encourage you to explore the possibilities of the Raspberry Pi. Maybe they have even inspired you to [share your own Raspberry Pi story][13] with us? Your story could end up on this list next year! - -In this month's Raspberry Pi column, Ben Nuttall introduces readers to five projects that you might... - -Owning a little cloud has a lot of benefits and can save you over $100 per month. In this step-by-... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/raspberry-pi-2019 - -作者:[Joshua Allen Holm][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/holmja -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life-raspberrypi_0.png?itok=Kczz87J2 (Raspberries with pi symbol overlay) -[2]: https://opensource.com/tags/raspberry-pi -[3]: https://opensource.com/article/19/1/pritunl-vpn-raspberry-pi -[4]: https://opensource.com/article/19/3/gpio-pins-raspberry-pi -[5]: https://opensource.com/article/19/6/raspberry-pi-vpn-server -[6]: https://opensource.com/article/19/3/physical-computing-rust-raspberry-pi -[7]: https://opensource.com/article/19/6/raspberry-pi-4 -[8]: https://opensource.com/article/19/2/wifi-picture-frame-raspberry-pi -[9]: https://opensource.com/article/19/3/how-boot-new-raspberry-pi -[10]: https://opensource.com/article/19/3/mobile-particulate-matter-sensor -[11]: https://opensource.com/article/19/3/programming-languages-raspberry-pi -[12]: https://opensource.com/article/19/3/amiga-raspberry-pi -[13]: https://opensource.com/how-submit-article diff --git a/sources/tech/20191227 2019- Year in review.md b/sources/tech/20191227 2019- Year in review.md deleted file mode 100644 index 12b423b903..0000000000 --- a/sources/tech/20191227 2019- Year in review.md +++ /dev/null @@ -1,100 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (2019: Year in review) -[#]: via: (https://jvns.ca/blog/2019-year-in-review/) -[#]: author: (Julia Evans https://jvns.ca/) - -2019: Year in review -====== - -It’s the end of the year again! Here are a few things that happened in 2019. - -### I have a business instead of a job! - -The biggest change this year is that I left my job in August after working there for 5.5 years and now I don’t have a job! Now I have a [business][1] (wizard zines). - -This has been exciting (I can do anything I want with my time! No rules! Wow!) and also disorienting (I can do anything I… want? Wait, what do I want to do exactly?). Obviously this is a good problem to have but it’s a big adjustment from the structure I had when I had a job. - -My plan for now is to give myself a year (until August 2020) to see how this new way of existing goes and then reevaluate. - -I wanted to write some reflections on my 5 years at Stripe here but it’s been such a huge part of my life for so long that I couldn’t figure out how to summarize it. I was in a much worse place in my career 6 years ago before I started working there and it really changed everything for me. - -### !!Con - -2019 was [!!Con][2]’s 6th year! It’s a conference about the joy, excitement, and surprise of programming. And !!Con also expanded to the [west coast][3]!! I wasn’t part of organizing the west coast conference at all but I got to attend and it was wonderful. - -Running a conference is a ton of work and I feel really lucky to get to do it with such great co-organizers – there have been at least 20 people involved in organizing over the years and I only do a small part (right now I organize sponsorships for the east coast conference). - -This year we also incorporated the [Exclamation Foundation][4] which is the official entity which runs both conferences which is going to make organizing money things a lot easier. - -### I understand how the business works a little better - -Earlier this year I signed up for a business course called [30x500][5] by Amy Hoy and Alex Hillman. They’ve influenced me a lot this year. Basically I signed up for it because I had a business that had made $100,000 in revenue already but I didn’t really understand how the business _worked_ and it felt like it could just evaporate at any point. So $2000 (the cost at the time of 30x500) was worth it to help me understand what was going on. - -Amy and Alex both just the other day wrote 100-tweet threads that have some of the ideas that I learned this year in them: [Alex on creating sustainable businesses][6] and [Amy on design][7]. - -I was hoping to build a system for selling printed zines in 2019 and I didn’t get to it – that’s probably my one concrete business goal for 2020. I tried out Lulu for printing in the hopes that I could experiment with print-on-demand but the quality was awful so it’s going to be a bit more work. - -### blog posts and things - -In 2019 I: - - * wrote 29 blog posts - * published 2 [zines][8] (Bite Size Networking, HTTP: Learn Your Browser’s Language) and wrote most of a third - * published 1 box set of my zines ([Your Linux Toolbox][9], it’s in Real Physical Bookstores!!) - * did some experiments in interactive SQL/server exercises, which I’m excited about but are sort of on the back burner right now. Maybe I’ll go back to them in 2020! - * made the same business [revenue][1] as in 2018 (which I was thrilled about) - * gave 0 talks (which was a goal of mine) - - - -The blog post I’m happiest to have published this year is definitely [Get your work recognized: write a brag document][10]. I’ve seen quite a few people saying that it helped them track their work and it makes me really happy. A bunch of people at my old job adopted it and it’s one of the non-engineering projects I’m most proud of having done there. - -Publishing this post about my [business revenue][1] was also important to me – in the past I loved blogging, but I didn’t think it was possible to make a living by explaining computer things online. And I was totally wrong! It is possible! So I think it’s important to tell other people that it’s a possibility. - -Having a Real Traditionally Published Book out is also really cool, I could not have imagined [4 years ago][11] that I could go to an actual bookstore and buy the little 16-page zine I wrote about how much I love strace. - -### what went well - -some things that were good this year: - - * spending time understanding why the business works the way it does instead of just guessing - * collaborating with many great people on !!Con to do a big thing together - * I’m happy to have given myself the time/space to do whatever it is I want, even though it’s a big adjustment - * writing things that help people a little bit with their careers (the brag documents post) is nice - - - -some things that are harder: - - * I used to have a lot of really amazing coworkers at my job, and right now I’m working much more by myself. I definitely miss having so many great people right there to talk to all the time. - - - --------------------------------------------------------------------------------- - -via: https://jvns.ca/blog/2019-year-in-review/ - -作者:[Julia Evans][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://jvns.ca/ -[b]: https://github.com/lujun9972 -[1]: https://jvns.ca/blog/2019/10/01/zine-revenue-2019/ -[2]: https://bangbangcon.com -[3]: https://bangbangcon.com/west -[4]: https://exclamation.foundation/ -[5]: https://30x500.com/academy/ -[6]: https://twitter.com/alexhillman/status/1209252239501647874 -[7]: https://twitter.com/amyhoy/status/1209693440872603651 -[8]: https://wizardzines.com -[9]: https://jvns.ca/blog/2019/10/21/print-collection-of-my-first-7-zines/ -[10]: https://jvns.ca/blog/brag-documents/ -[11]: https://jvns.ca/blog/2015/04/14/strace-zine/ diff --git a/sources/tech/20191227 The importance of consistency in your Python code.md b/sources/tech/20191227 The importance of consistency in your Python code.md deleted file mode 100644 index 812a4df058..0000000000 --- a/sources/tech/20191227 The importance of consistency in your Python code.md +++ /dev/null @@ -1,71 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (The importance of consistency in your Python code) -[#]: via: (https://opensource.com/article/19/12/zen-python-consistency) -[#]: author: (Moshe Zadka https://opensource.com/users/moshez) - -The importance of consistency in your Python code -====== -This is part of a special series about the Zen of Python focusing on the -12th, 13th, and 14th principles: the roles of ambiguity and obviousness. -![Two animated computers waving one missing an arm][1] - -The principle of least surprise is [a guideline][2] when designing user interfaces. It says that when the user performs an action, the program should do whatever would surprise the user the least. This is for the same reason kids love reading the same book over and over again: there is nothing more comforting to people than the ability to predict and have those predictions come true. - -A critical insight in the development of the [ABC language][3], Python's inspiration, was that programming languages are user interfaces and need to be designed with the same tools that UI designers use. Thankfully, since then, more languages have adopted the concepts of affordance and ergonomics from UI design, even if they apply them less strictly. - -This brings us to the next three principles in the [Zen of Python][4]. - -### In the face of ambiguity, refuse the temptation to guess. - -What should the result of **1 + "1"** be? Both **"11"** and **2** would be valid guesses. This expression is _ambiguous_: there is no single thing it can do that would not be a surprise to at least some people. - -Some languages choose to guess. In JavaScript, the result is **"11"**. In Perl, the result is **2**. In C, naturally, the result is the empty string. In the face of ambiguity, JavaScript, Perl, and C all guess. - -In Python, this raises a **TypeError**: an error that is not silent. It is atypical to catch **TypeError**: it will usually terminate the program or at least the current task (for example, in most web frameworks, it will terminate the handling of the current request). - -Python refuses to guess what **1 + "1"** means. The programmer is forced to write code with clear intention: either **1 + int("1")**, which would be **2**; or **str(1) + "1"**, which would be **"11"**; or **"1"[1:]**, which would be an empty string. By refusing to guess, Python makes programs more predictable. - -### There should be one—and preferably only one—obvious way to do it. - -Prediction also goes the other way. Given a task, can you predict the code that will be written to achieve it? It is impossible, of course, to predict perfectly. Programming, after all, is a creative task. - -However, there is no reason to intentionally provide multiple, redundant ways to achieve the same thing. There is a sense in which some solutions are "better" or "more Pythonic." - -Part of the appreciation for the Pythonic aesthetic is that it is OK to have healthy debates about which solution is better. It is even OK to disagree and keep programming. It is even OK to agree to disagree for the sake of harmony. But beneath it all, there has to be a feeling that, eventually, the right solution will come to light. There must be the hope that eventually we can live in true harmony by agreeing on the best way to achieve a goal. - -### Although that way may not be obvious at first (unless you're Dutch). - -This is an important caveat: It is often _not_ obvious, at first, what is the best way to achieve a task. Ideas are evolving. _Python_ is evolving. The best way to read a file block-by-block is, probably, to wait until Python 3.8 and use the [walrus operator][5]. - -This common task, reading a file block-by-block, did not have a "single best way to do it" for almost _30 years_ of Python's existence. - -When I started using Python in 1998 with Python 1.5.2, there was no single best way to read a file line-by-line. For many years, the best way to know if a dictionary had a key was to use **.haskey**, until the **in** operator became the best way. - -It is only by appreciating that sometimes, finding the one (and only one) way of achieving a goal can take 30 years of trying out alternatives that Python can keep aiming to find those ways. This view of history, where 30 years is an acceptable time for something to take, often feels foreign to people in the United States, when the country has existed for just over 200 years. - -The Dutch, whether it's Python creator [Guido van Rossum][6] or famous computer scientist [Edsger W. Dijkstra][7], have a different worldview according to this part of the Zen of Python. A certain European appreciation for time is essential to appreciate it. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/zen-python-consistency - -作者:[Moshe Zadka][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/rh_003499_01_other11x_cc.png?itok=I_kCDYj0 (Two animated computers waving one missing an arm) -[2]: https://www.uxpassion.com/blog/the-principle-of-least-surprise/ -[3]: https://en.wikipedia.org/wiki/ABC_(programming_language) -[4]: https://www.python.org/dev/peps/pep-0020/ -[5]: https://www.python.org/dev/peps/pep-0572/#abstract -[6]: https://en.wikipedia.org/wiki/Guido_van_Rossum -[7]: http://en.wikipedia.org/wiki/Edsger_W._Dijkstra diff --git a/sources/tech/20191228 Most-read open source news stories of 2019.md b/sources/tech/20191228 Most-read open source news stories of 2019.md deleted file mode 100644 index 6c5955bc84..0000000000 --- a/sources/tech/20191228 Most-read open source news stories of 2019.md +++ /dev/null @@ -1,90 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Most-read open source news stories of 2019) -[#]: via: (https://opensource.com/article/19/12/open-source-news) -[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) - -Most-read open source news stories of 2019 -====== -Here are some of the big news items from the year and a look at the -future of open source. -![Radio wave.][1] - -A great deal happened in the world of open source in 2019. Once upon a time, you would have been hard-pressed to find news about Linux, free software, and open source software outside of a small handful of specialist publications. Today, though, news about open source is everywhere; the online edition of Forbes even has its own [Linux columnist][2]. - -We regularly round up many of the most interesting and topical news articles in [fortnightly articles][3]. Of those, we’ve compiled the top 10 most read (by you, our readers) stories we curated during 2019. - -### Google's trusted hardware project - -Many of us take the security of our software seriously but, at the same time, take the security of our hardware for granted. How do we know if the hardware we’re using is secure and trusted? To help ensure that it is, Google [announced OpenTitan][4], a secure, open source chip design project. The project builds upon a chip that Google developed called Titan, and the search giant has recruited several hardware manufacturers to join this initiative. - -### Database makers embrace open source licenses - -Over the last 18 months or so, several open source database firms moved to less open licenses for the software they develop in an attempt to stay competitive in a tough market. Cloudera and YugaByte, however, went in the opposite direction in 2019. Cloudera put the proprietary portions of its products under the umbrella of the [AGPL and Apache 2.0 licenses][5], while YugaByte [announced it was adopting][6] the Apache 2.0 license for its wares. - -### GNOME and KDE agree to work together - -It’s always great when two rivals put aside their differences to work for a greater good; especially when that greater good is the further advancement of the Linux desktop. That’s what happened when the GNOME Foundation and KDE [announced they were going to work together][7]. The goal is to bring the GNOME and KDE communities together "to build an application ecosystem that transcends individual distros and broadens the market for everyone." - -### System76 announces Linux laptops with Coreboot firmware - -While there are several small companies selling Linux-powered computers, not all components of those computers are open source. That’s especially true for their firmware. Computer maker System76 is trying to change that. The company announced that it will [ship two of its most popular laptops][8] with the lightweight Coreboot open source firmware. According to Forbes Online, by adopting Coreboot (which helps computers start faster) System76 is taking another step in "the company’s steady march toward offering open source software and hardware." - -### Open source platform spans the globe to help local communities - -Open source knows no borders. Proof of that is at the St. Francis Neighborhood Center in West Baltimore, which [adopted the Lutèce platform][9] to help deliver its programs and services. While Lutèce was developed in France and runs services in French cities like Paris, Lyon, and Marseille, the implementation in West Baltimore is the first time the platform has been used outside of its country of origin. - -### Australian government uses open source to build notification platform - -When Australia’s Digital Transformation Agency (DTA) need to quickly deploy an email and text message notification system, it turned to software developed by the Government Digital Service in the UK. The result was a platform called Notify. Using existing software enabled the DTA to [get the platform up and running][10] in eight weeks. Notify is now being used by over 100 government departments across the country. - -### Dutch city to further embrace open source - -Like many cities in Europe, Nijmegen in the eastern part of the Netherlands has long been an advocate of using open source in government. Unfortunately, the city’s procurement processes still favored proprietary solutions. That’s starting to change, thanks to a [resolution passed in 2019][11] which requires the city to "deploy both the mandatory and the recommended open standards listed by the Dutch Standardisation Forum." The municipal government hopes that the resolution will spur wider use of open source software to avoid vendor lock-in. - -### Acquia buys Mautic - -Acquia, the company behind the popular open source content management system Drupal, took a big step in its ambition to create the first "open digital experience platform" by acquiring open source marketing automation firm Mautic. The idea behind the acquisition is to give companies that use Acquia’s offerings "the freedom they need to own their digital destiny without the constraint of vendor lock-in." - -### Mozilla Labs makes a return - -A few years ago, Mozilla had seemed to abandoned Mozilla Labs. Labs, you might remember, was the home of various beta features for Firefox that users could test drive. In early 2019, Mozilla [brought Labs back][12] with more experimental goodness. The new edition of Mozilla Labs is aimed at sharing ways to expand the capabilities of Firefox. It also showcases technologies that make it easier for anyone interact with virtual reality and the Internet of Things. - -### Making it easier to announce software's end of life - -Like many things, older versions of software have a use-by date - a date after which it won’t be supported or be compatible with its supporting software or operating systems. That information often gets buried on a project’s website. That’s where [endoflife.date][13] comes in. It’s a repository of information that "aims to overcome the complexity of end of life (EOL) announcements for software." - -### Predictions for 2020 - -What Linux and open source projects and news do you predict being big stories in 2020? Let us know about them in the comments, or send a story proposal to [open@opensource.com][14]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/open-source-news - -作者:[Scott Nesbitt][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/scottnesbitt -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/news-radio-wave-lead_520.png?itok=J86HG1Vg (Radio wave.) -[2]: https://opensource.com/article/19/9/found-linux-video-gaming -[3]: https://opensource.com/tags/news -[4]: https://techcrunch.com/2019/11/05/google-opentitan-secure-chip/ -[5]: https://www.cbronline.com/news/cloudera-open-source -[6]: http://www.dbta.com/Editorial/News-Flashes/YugaByte-Becomes-100-percent-Open-Source-Under-Apache-20-License-133083.aspx -[7]: https://www.zdnet.com/article/gnome-and-kde-work-together-on-the-linux-desktop/ -[8]: https://www.forbes.com/sites/jasonevangelho/2019/10/10/system76-will-begin-shipping-2-linux-laptops-with-coreboot-based-open-source-firmware/#3c5fb7294e64 -[9]: https://technical.ly/baltimore/2019/04/19/paris-lutece-open-source-platform-city-services-west-baltimore-community-center-st-francis/ -[10]: https://www.zdnet.com/article/open-source-notify-gov-au-delivered-in-eight-weeks-for-a-cost-of-au150k/ -[11]: https://joinup.ec.europa.eu/collection/open-source-observatory-osor/news/not-having-choose -[12]: https://betanews.com/2018/12/28/mozilla-labs-is-back/ -[13]: https://endoflife.date/ -[14]: mailto:open@opensource.com diff --git a/sources/tech/20191230 8 must-read DevOps articles for success in 2020.md b/sources/tech/20191230 8 must-read DevOps articles for success in 2020.md deleted file mode 100644 index 3ea0d05f72..0000000000 --- a/sources/tech/20191230 8 must-read DevOps articles for success in 2020.md +++ /dev/null @@ -1,153 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (8 must-read DevOps articles for success in 2020) -[#]: via: (https://opensource.com/article/19/12/devops-resources) -[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) - -8 must-read DevOps articles for success in 2020 -====== -Get up to speed on DevOps with our eight most popular DevOps articles -this year. -![Brick wall between two people, a developer and an operations manager][1] - -I am an avid reader, but I go through periods where I'm so busy that it's hard to find the time to keep up with my reading list. Even during my busiest times, I try to stay up to date on DevOps news since it's one of my areas of focus. - -Here, I've summarized key takeaways from the top eight DevOps articles Opensource.com published this year so you can increase your knowledge even if you don't have time to read all of them. Since DevOps is about **people**, **processes**, and **tools**, I've categorized the top eight articles around those themes. - -### People - -#### 5 essential values for the DevOps mindset - -Conversations about IT problems and solutions often focus on the technology or the tools. But often, the people and processes are harder and more important to get right than the technology and tools. In [_5 essential values for the DevOps mindset_][2], Brent Aaron Reed and Willy-Peter Schaub outline the foundation for establishing the right processes and hiring the right people. - - * Create a continuous feedback loop with stakeholders (customers, business teams, partners, etc.). Ensure changes are being made for the right reasons and that they benefit all stakeholders. - * Processes should be continuously improved. Having a repeatable framework and process is good, but look for ways to make it better. - * Don't replace existing silos with new silos. Teamwork is essential; changing the name of a team or creating a new team does not help. You should be working to break down silos, not create new silos with new names. - * Your primary stakeholder is the customer. Every department in the organization needs to work together to make sure the customer's needs are met. - * Learning is infectious. When you learn something new, share it with others. - - - -#### The case for making the transition from sysadmin to DevOps engineer - -Making the leap from system administrator (sysadmin) to DevOps engineer requires shifting your mindset and learning new tools and technology. In [_The case for making the transition from sysadmin to DevOps engineer_][3], [Correspondent][4] Taz Brown covers this experience and the things you should do if you are considering taking on a DevOps engineer role. - - * Learn a scripting language like Python, Perl, Bash, or Powershell. You don't need to become an expert; learn the basics, and build up your skills over time. - * Think strategically and consider the business impact of your day-to-day tasks. - * Learn a programming language like Ruby, Go, or Python. - * Understand CI/CD pipelines and how and where to automate tasks within the pipeline. - * Become familiar with configuration and orchestration tools. - * Learn common Git commands as well as the fundamentals of version control. - - - -### Processes - -#### Don't test in production? Test in production! - -The notion of testing in production is a sticky subject, but Ann Marie Fred covers it well in [_Don't test in production? Test in production!_][5] Historically, development, test, and production systems were treated differently from the perspective of security, compliance, and risk management. The risks are much higher if data in production systems becomes corrupted than if it happens in a test environment. - -There are pros and cons to testing in production. The majority of the cons boil down to risk and compliance concerns like corrupted or leaked data, unintended side effects, and overloaded systems. Many of the pros can be lumped into two categories: improving the user experience (UX) and gaining new knowledge about your architecture. Improving UX includes things like usability testing, UX research, real-user monitoring, canary testing, and regression testing. Testing in production also enables you to learn more about your environment by running A/B tests, experimenting, chaos engineering, and failover testing. - -By testing in production, you gain feedback you would not otherwise get into quality, performance, availability, resiliency, user experience, and changes. Testing on real data can reveal things you would not see with mock or test data. You should test in production, but before you begin, put mechanisms in place to keep your systems safe and minimize risk. - - * Test all systems thoroughly with automated tests before you start testing in production. - * Review the risks associated with bug hunt days and put appropriate guardrails in place from the start. - * Follow the principles of chaos engineering: plan ahead; contain the blast radius; scale or squash. - - - -Yes, there are risks associated with testing in production, but you can minimize them with proper safeguards. - -#### 8 principles to achieve DevOps at scale - -Processes are a vital aspect of a successful DevOps initiative. The most important part is building processes suited to your organization rather than copying what worked somewhere else. The guidelines Matthieu Fronton lists in [_8 principles to achieve DevOps at scale_][6] ensure you will implement strategies focused on your business needs. - - * Teams create silos. Instead of building a DevOps team, create a DevOps task force of highly skilled and diverse members. Its objective is to help other projects and departments identify slow processes, automate processes, improve performance, and ensure effectiveness. - * Reduce overhead when collaborating and syncing on tasks. Make status updates and team availability publicly available, make work visible by putting everything in shared collaboration tools, and work on one task at a time to avoid context switching. - * Get outside help; hire an agile coach to be your advocate. - * Schedule regular team training on needed job skills, ranging from soft skills to how to use specific tools. - * Empower teams to make their own decisions and learn from their mistakes. - * Embrace uncertainty. Failures will happen, so run blameless post-mortems and determine how to improve and reduce uncertainty the next time around. - * DevOps is about people, processes, and tools. It is not just about the technical implementation of a product. - * Always be learning. Stay up to date on trends in the DevOps space. - - - -#### Small scale scrum vs. large scale scrum - -In [_Small scale scrum vs. large scale scrum_][7], Agnieszka Gancarczyk shares her analysis of 54 early responses to a survey on agile adoption. - - * 96% work in distributed teams, think scrum principles help them reduce development complexity, and believe agile contributes to the success of their projects. - * The most popular length of a sprint is three weeks (62%). - * Participants take on additional roles on their projects when needed, such as business analyst, project manager, and quality engineer. When changing roles, they lose an average of one to two hours. - * The majority of teams don't have a definition of "ready" to ensure that user stories are actionable, testable, and clear. - * Participants ask for help and mentoring when a task is complex. - - - -#### Scrum vs. kanban: Which agile framework is better? - -Agile is a process of iterative development and continuous feedback. While both scrum and kanban are classified as agile frameworks, they are not the same thing. In [_Scrum vs. kanban: Which agile framework is better?_][8] Taz Brown explores the differences. - -Kanban is an agile framework that utilizes a visual method for managing a project's creation through set steps, and the emphasis is on continuous flow through the steps. Tasks can be color-coded to identify different types of tasks. Work-in-progress limits can be used to restrict the maximum number of work items allowed in a single stage. The goal is to see progress and bottlenecks at a glance. Any team (not just software developers) can use the kanban methodology. - -The goal of scrum is to create a shippable product. Scrum involves daily standups, planning, reviews, retrospectives, and a two- to four-week cadence. Since its goal is to ship a product, scrum is primarily used by software development teams. - -Choosing which methodology is best for you depends on the state of your organization, the team, the people on the team, and the end product or service. - -### Tools - -#### Automate user acceptance testing with your DevOps pipeline - -User acceptance testing (UAT) determines whether a system satisfies user needs, business requirements, and authorized entity requirements. These tests need to be run whenever there is a new design in the application, which is why it's so valuable to automate them. In [_Automate user acceptance testing with your DevOps pipeline_][9], Daniel Oh shares how to skip manually validating test cases and automate them with Selenium. - -You can build WebDriver scripts with Selenium to execute test cases programmatically, then automate them by integrating the Selenium tool with your DevOps pipeline. - -#### A beginner's guide to building DevOps pipelines with open source tools - -Saving the best for last, Bryant Son's [_A beginner's guide to building DevOps pipelines with open source tools_][10] is a comprehensive overview of one critical category of DevOps tooling: continuous integration/continuous deployment (CI/CD) pipelines. The CI/CD pipeline is the process of taking code and configuration from a repository and moving it to production. - -Bryant describes some of the tools in a typical CI/CD pipeline. - - * A CI/CD tool like Jenkins talks to many different services and tools to configure and orchestrate them. - * Source control management (SCM) stores code in repositories, versions code, and facilitates collaboration with project members. (CI/CD can automate checking source code in and out among team members.) - * Build-automation tools compile and create a deployable package format from the source code. - * A web application server is the location where an executable will be deployed so the application can be used. - * Code testing coverage catches errors early on and ensures users are satisfied with the application. Code test frameworks help write the tests, and code-quality suggestion tools help improve the quality of the code. - - - -### More in 2020 - -Opensource.com's most widely read DevOps articles of 2019 covered a diverse range of topics under the umbrella of people, processes, and tools. We appreciate these writers for sharing their knowledge, and I look forward to reading more from them in 2020. - -What DevOps topics would you like us to cover in the coming months? Feel free to leave a comment or, better yet, [submit an article proposal][11]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/devops-resources - -作者:[Dawn Parzych][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dawnparzych -[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://opensource.com/article/19/5/values-devops-mindset -[3]: https://opensource.com/article/19/7/devops-vs-sysadmin -[4]: https://opensource.com/correspondent-program -[5]: https://opensource.com/article/19/5/dont-test-production -[6]: https://opensource.com/article/19/4/principles-achieve-devops-scale -[7]: https://opensource.com/article/19/3/small-scale-scrum-vs-large-scale-scrum -[8]: https://opensource.com/article/19/8/scrum-vs-kanban -[9]: https://opensource.com/article/19/4/devops-pipeline-acceptance-testing -[10]: https://opensource.com/article/19/4/devops-pipeline -[11]: https://opensource.com/how-submit-article diff --git a/sources/tech/20191231 7 resources to grow your Java skills.md b/sources/tech/20191231 7 resources to grow your Java skills.md deleted file mode 100644 index e3ce14f901..0000000000 --- a/sources/tech/20191231 7 resources to grow your Java skills.md +++ /dev/null @@ -1,109 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (7 resources to grow your Java skills) -[#]: via: (https://opensource.com/article/19/12/java-resources) -[#]: author: (Stephon Brown https://opensource.com/users/stephb) - -7 resources to grow your Java skills -====== -Java is still evolving and going strong decades after its launch. Catch -up with our hottest Java articles from 2019. -![Coffee beans and a cup of coffee][1] - -Java is still one of the most influential programming languages today. It only recently dropped from #2 to the third most used [programming language on GitHub][2]. You may say usage is not everything, but Java also remains popular. According to [Stack Overflow's Developer Survey Results for 2019][3], Java is the fifth most popular programming language. It was first released to the public in 1998, and it stays high on the usage and popularity scale after all this time. A big reason for that fact is that Java has grown and evolved significantly since its release. As a strongly-typed language, Java continues to push the envelope of the object-oriented programming (OOP) paradigm and is continually used to implement new concepts and technologies. - -Testifying to its ongoing popularity, Opensource.com publishes many excellent articles about the language. The following seven are Opensource.com's top read Java articles of 2019. - -### What is an object in Java? - -Chris Hermansen provides an in-depth look at the OOP paradigm and its importance to Java development in [_What is an object in Java?_][4] OOP is based on the idea that data and programs should all be viewed as "objects." Each object has properties and behaviors that describe how it is used in a program. - -There are a number of principals that define OOP and its use of objects for all aspects of programming. These include: - - * **Inheritance:** This is the hierarchical use of objects for mutating and reusing object properties and behaviors from parent objects to child objects. - * **Typing:** Static and strong typing express the idea that, at compile time, the type should be defined and constant unless explicitly converted or changed, which helps with both debugging and consistent functionality. - * **Classes and primitives:** Objects natively implemented into OOP languages are called "primitives," including int, long, etc.; however, objects designed and implemented using class declarations and by assigning properties and behaviors to primitives are called classes. - * **Object class:** In Java, the Object class is the parent class that all classes inherit from. It allows the use of basic functions and properties, including comparison and **hashCode** functionality. - - - -Overall, objects are the basis of Java development, and Chris expounds upon them in his in-depth article. - -### What is a Java constructor? - -As a great follow-up to Chris Hermansen's overview of the Java object, I recommend reading [_What is a Java constructor?_][5] The constructor is an important concept to understand when working within the realms of OOP and Java, and Seth Kenlon introduces it in this easy-to-understand guide. The constructor in Java (and most OOP languages) is where you instantiate or create an instance of an object you have defined. In many languages, an instance is created with the **new** keyword and the object you want to create. For example, **Dog fluffy = new Dog();** will create a new instance of **Dog**. Constructors can also set properties within the object you are instantiating; therefore, if you have an implementation for a constructor to set your object's size, height, and type, you can set those all from the constructor. By default, Java allows objects to be instantiated with the **new** keyword without having an explicit constructor defined and creates them at compilation time. - -### Initializing arrays in Java - -An array is a longstanding data structure that originates in early math concepts. In computer science, as Chris Hermansen says in [_Initializing arrays in Java_][6], it represents "…a contiguous block of memory where each location is a certain type," which can be any type—from primitives (int, long, etc.) to custom objects (Dog, Cat, Car). An array is initialized with a specific type of constructor that reserves the fixed length of the array; in other words, it is a defined amount of memory that the array is reserving. It looks like this: **int[] a = new int[15]**. Much like instantiating a new object, arrays are similar in form and functions. In addition, because arrays inherit from the Object class, they can utilize methods and properties associated with the Object class, including **GetClass()**. - -In addition to simple arrays, Java implements **ArrayLists** and **Map** objects by default. Both of these collection types allow elements to be added or removed dynamically; there is no need to set the size of each manually. The ArrayList allows the addition, retrieval, and removal of elements dynamically as your code runs. These lists must be of one type, which is defined when it is instantiated. The Map allows a dictionary object to be created, which means each index, or "key," is connected to another object. For example, **Map<string, Integer> scores = new Map<String, Integer>()** would allow you to insert a student's score, with the key being their name, with **scores.put("Stephon", 50)**. Arrays, ArrayLists, and Maps are excellent ways to store, retrieve, and manipulate data within your Java application. - -### Getting started with blockchain for Java developers - -Blockchain is an amalgamation of cryptography, computer science, cryptocurrency, and many other fields. It is the technology at the heart of Bitcoin and other cryptocurrencies, but it can stand alone and is powerful when implemented with other concepts. As Bilgin Ibrayam writes in [_Getting started with blockchain for Java developers_][7], "the technologies most people know, such as Java, .NET, and relational databases, are not common in the blockchain space; instead, blockchain is primarily dominated by C, Go, and Rust on the server side, and JavaScript on the client side." However, this should not deter you from using Java for developing blockchain projects, and Ibrayam provides seven Java-based open source technologies that leverage the Java language and the Java Virtual Machine (JVM) for blockchain development. - -The seven technologies he presents are: Corda, a business-focused, blockchain technology that focuses on building smart contracts to process and streamline business transactions on the chain; Hyperledger's Pantheon (or Besu), an Ethereum client that enables use of private and public networks and was created to introduce Java developers to blockchain development; Bitcoinj, a Java implementation of the Bitcoin protocol that allows the use of a wallet and transactions without Bitcoin Core; Web3j, a lightweight Ethereum client that has implementations for both Android and Java for smart contract development; Hyperledger Fabric SDK, a complete solution for building and providing security for a localized or distributed blockchain; FundRequest, a decentralized platform/marketplace that enables requesting open source work and is completely implemented in Java on top of the Ethereum network; and Eventeum, which allows monitoring of the Ethereum network and storage of events and their details on a messaging server like Kafka or RabbitMQ. - -### 7 Java tips for new developers - -When learning a new language, there are always obstacles, whether they be syntactical differences or entire development paradigm shifts. Seth Kenlon provides [_7 Java tips for new developers_][8], focusing on what to look for when diving into Java programming. Installing Java and the Java Development Kit (JDK) are the first steps to developing in Java. Most computers may already have Java and JVM installed, but you will need JDK to begin programming. - -In brief, Seth's tips are: - - * Most other languages allow importing and exporting libraries or other code that you may require when developing a project. Java packages are external or internal libraries that need to be managed. The packages are separated and organized by namespaces, which are like buckets for organizing code. - * Packages are imported with the simple syntax of **import** with the library's namespace. - * Declaring a class allows you to create an object in your program. These classes can use different access modifiers; within the classes are properties and methods or functions that also can have access modifiers that define whether they can be used only inside of the class, outside of the class with inherited classes, or by any other class. - * The class modifier **Static** allows the use of properties or functions without having to instantiate or create an instance of an object. - * Code will eventually have bugs; it is inevitable. "Try and catch" flow control allows you to catch errors and exceptions and implement recovery and logging mechanisms. - * To run a Java application outside an integrated development environment (IDE), such as Netbeans or Eclipse, navigate to your Java project folders from the command line and type **java <filename.java>** or, if the application is already compiled into a .jar file, **java -jar <filename.jar>**. - - - -### Using the Java Persistence API - -[_Using the Java Persistence API_][9] (JPA) is my introduction to connecting Java to various data persistence solutions, whether they be relational, NoSQL, or basic file representations in a system. Java provides a broad interface that allows connection to generally any type of persistence solution. This tutorial walks through creating an application with common libraries, including Spring Boot, a module/template for quickly configuring applications in Java; Maven, a package manager for Java; Lombok, a library that simplifies defining object accessors/mutators; and Netbeans, a popular IDE for developing in Java. - -The tutorial uses these libraries to create models for a fictitious bike shop's database. The models' accessors/mutators are defined with Lombok and provide data annotations that are used when persisting to the chosen database. Then the database is set up and configured through the **application.properties** file, which the JPA reads to connect and persist data. The persisting and fetching implementation is done mostly with the Spring framework for Mongo; however, you can also override functions for more control of what should be fetched when finding, updating, or persisting objects. In a matter of minutes, you will be able to define objects and call basic functions on local databases without much boilerplate. - -### How to compare strings in Java - -Flexibility is often considered a gift, and while there are tradeoffs between statically typed and dynamically typed languages, one of Java's strengths is its ability to compare types and equality of types. In fact, Girish Managoli explains in [_How to compare strings in Java_][10], there six different ways to compare the immutable string type in Java. - -The double-equal operator (**==**) compares memory location rather than string content. When the compiler sees two strings that are equal, it will allocate the same memory for both. If a new string is instantiated, it will not share the same memory location or object reference. - -The **equals** method compares the case-sensitive content of the string, not the object information. For example, if you use **equals** to compare **Dog** and **Dog**, the result would be true, even if they are two different objects; however, **dog** and **Dog** would be false because the function is case-sensitive. The **equalsIgnoreCase** function is the same as **equals**, except that it removes case-sensitivity; therefore, comparing **dog** and **Dog** would be true. The **compareTo** and **compareToIgnoreCase** functions compare strings based on the Unicode value of each character in the string; they compare the total value to the other string and return the total lexical value difference between the two (with case-sensitivity and case-insensitivity, respectively). Last but not least, the **Objects equals** function allows the comparison of two string object references and of null values. - -### Java: Still growing and evolving - -Java is still going strong, evolving, and staying relevant after all this time, and there is continued optimism in its growth. Since its release, the Java platform has continued to change with the times, from OpenJDK to release schedule changes, and push the envelope of what you can accomplish with it. - -As you can see from the top Java articles on Opensource.com in 2019, it never hurts to know the language, because you never know where you can use it for your next project. These (and other) Opensource.com articles have been really helpful to me as a [new developer transitioning from higher education][11]. I look forward to reading and sharing more in 2020, and I hope you'll join me. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/java-resources - -作者:[Stephon Brown][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/stephb -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/java-coffee-mug.jpg?itok=Bj6rQo8r (Coffee beans and a cup of coffee) -[2]: https://octoverse.github.com/#top-languages -[3]: https://insights.stackoverflow.com/survey/2019 -[4]: https://opensource.com/article/19/8/what-object-java -[5]: https://opensource.com/article/19/6/what-java-constructor -[6]: https://opensource.com/article/19/10/initializing-arrays-java -[7]: https://opensource.com/article/19/4/blockchain-java-developers -[8]: https://opensource.com/article/19/10/java-basics -[9]: https://opensource.com/article/19/10/using-java-persistence-api -[10]: https://opensource.com/article/19/9/compare-strings-java -[11]: https://opensource.com/article/19/6/5-transferable-higher-education-skills diff --git a/sources/tech/20200102 10 open source software alternatives for the new year.md b/sources/tech/20200102 10 open source software alternatives for the new year.md deleted file mode 100644 index 59d7f4067e..0000000000 --- a/sources/tech/20200102 10 open source software alternatives for the new year.md +++ /dev/null @@ -1,70 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (10 open source software alternatives for the new year) -[#]: via: (https://opensource.com/article/20/1/open-source-alternatives) -[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) - -10 open source software alternatives for the new year -====== -Open source software can help you become better organized, more -productive, more secure, and even healthier. -![Multi-colored and directional network computer cables][1] - -Open source isn't just for techies. On your desktop (regardless of your operating system), on your phone, and in your business, open source software can help you become better organized, more productive, more secure, and healthier. Best of all, you don't need to worry about the shackles of proprietary licenses. - -Throughout 2019, Opensource.com's team of [Correspondents][2] and community of writers have highlighted top-notch open source alternatives to proprietary software. Take a quick look at the best 10 of those articles. - -In _[Intro to Corteza, an open source alternative to Salesforce][3]_, Dennis Arh introduces us to Corteza, a powerful and flexible customer relationship management (CRM) system. Dennis outlines what Corteza has to offer, then walks us through how to install and configure the system. While Corteza might not pack all the features of the bigger closed source CRM systems, it's more than enough for the majority of users. - -Opensource.com Correspondent Chris Hermansen whips up an overview of a half-dozen instant messaging apps for mobile devices in _[Choosing an open messenger client: Alternatives to WhatsApp][4]_. While each of the six apps has its strengths, Chris recommends Signal for "its open-by-design approach, its serious and ongoing privacy and security stance, and having a Signal app on our GNOME (and Windows) desktops." - -In _[5 social media alternatives to protect your privacy][5]_, privacy advocate Dan Arel walks through several open source replacements for Twitter, Facebook, Instagram, WhatsApp, and Facebook Messenger. Dan also shares how he cut his ties with those privacy-crushing services without losing touch with the people who matter. His approach might work for you, too. - -You don't need an expensive application like Adobe Acrobat to work with PDF files on the Linux desktop, as I show in _[Two graphical tools for manipulating PDFs on the Linux desktop][6]_. These tools are simple, but they pack a lot of punch and take care of most of your PDF manipulation needs. - -In _[How to create an automated calendar with Google Apps Script with open source on top][7]_, Correspondent Dan Barker explores how to manage conference submissions by stitching together a Google Sheet with Google Calendar using a script he wrote. OK, the services Dan's script interacts with aren't open source, but you can grab that script from [Dan's GitLab repository][8] and modify it to your heart's content. - -In _[4 open source apps for plant-based diets][9]_, Correspondent Joshua Allen Holm uncovers some mobile apps that can help you plan meatless meals, shop more effectively for the ingredients for those meals, and find vegan and vegetarian restaurants nearby. As someone who's shifting to a more plant-based diet, I can see myself using a couple of these apps in the near future. And that they're available on [F-Droid][10] is a bonus. - -I dive into a very useful spreadsheet editor that's built for collaboration in _[Get going with EtherCalc, a web-based alternative to Google Sheets][11]_. If you're of a technical bent, you can run your own instance; otherwise, you can use one of several hosted editions. EtherCalc does take a bit of getting used to, but if your needs are simple, you'll find (as I did) that it's a flexible tool. - -Opensource.com's Seth Kenlon examines _[CBZ and DjVu: Open source alternatives to PDFs][12]_. This pair of digital archive formats can do everything PDF can do but are easier to manipulate. Seth also shows how to use command-line tools to create archives in the CBZ and DjVu formats and, with DjVu files, offers some advanced tips and tricks. - -I explain how a good open source application can exist quite nicely in a proprietary environment in _[Organize your information on the Mac desktop with nvALT][13]_. In this article, I discuss how to how to manage notes and more with this _very_ useful tool. What makes nvALT all the more attractive to me is that [plain text][14] is at its core, so it's a solid fit for my workflow whenever I'm working in MacOS. - -In _[Getting started with Pimcore: An open source alternative for product information management][15]_, Dietmar Rietsch introduces a tool for businesses of all sizes to manage, mold, and share data about their products. In the past, I worked for a company or two that specialized in this type of software. It's great to see an open source alternative that's as flexible, polished, and easy to use as its closed source cousins. - -These articles give you a taste of the open source alternatives to proprietary software that are out there. Are there any substitutes for proprietary software that you think we should cover in the coming months? Feel free to leave a comment or, better yet, [submit an article proposal][16]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/1/open-source-alternatives - -作者:[Scott Nesbitt][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/scottnesbitt -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/connections_wires_sysadmin_cable.png?itok=d5WqHmnJ (Multi-colored and directional network computer cables) -[2]: https://opensource.com/correspondent-program -[3]: https://opensource.com/article/19/8/corteza-open-source-alternative-salesforce -[4]: https://opensource.com/article/19/3/open-messenger-client -[5]: https://opensource.com/article/19/1/open-source-social-media-alternatives -[6]: https://opensource.com/article/19/2/manipulating-pdfs-linux -[7]: https://opensource.com/article/19/1/automate-calendar -[8]: https://gitlab.com/barkerd427/conference-scripts -[9]: https://opensource.com/article/19/4/apps-plant-based-diets -[10]: https://f-droid.org/ -[11]: https://opensource.com/article/19/7/get-going-ethercalc -[12]: https://opensource.com/article/19/3/comic-book-archive-djvu -[13]: https://opensource.com/article/19/1/nvalt -[14]: https://plaintextproject.online/ -[15]: https://opensource.com/article/19/11/pimcore-alternative-product-information-management -[16]: https://opensource.com/how-submit-article diff --git a/sources/tech/20200107 Bash Script to Check How Long the High CPU-Memory Consumption Processes Runs on Linux.md b/sources/tech/20200107 Bash Script to Check How Long the High CPU-Memory Consumption Processes Runs on Linux.md deleted file mode 100644 index fc3818c344..0000000000 --- a/sources/tech/20200107 Bash Script to Check How Long the High CPU-Memory Consumption Processes Runs on Linux.md +++ /dev/null @@ -1,149 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: 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/) - -Bash Script to Check How Long the High CPU/Memory Consumption Processes Runs on Linux -====== - -In the past, we have written three different articles to identify this using Linux commands. - -You can access them immediately by going to the relevant URLs below. - - * **[How to Find High CPU Consumption Processes in Linux][1]** - * **[How to Find Out Top Memory Consuming Processes in Linux][2]** - * **[Five Ways to Check How Long a Process Has Been Running in Linux][3]** - - - -Two scripts are included in this tutorial, which helps you to identify how long the high CPU/memory consumption processes are running on Linux. - -The script will show you the process ID, the owner of the process, the name of the process and how long the processes are running. - -This will help you identify which jobs are running overtime (which must be completed beforehand). - -This can be achieved using the ps command. - -### What’s ps Command - -ps stands for processes status, it display the information about the active/running processes on the system. - -It provides a snapshot of the current processes along with detailed information like username, user id, cpu usage, memory usage, process start date and time command name etc. - -### 1) Bash Script to Check How Long the High CPU Consumption Processes Runs on Linux - -This script will help you to identify how long the high CPU consumption processes has been running on 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 "--------------------------------------------------" -``` - -Set an executable **[Linux file permission][4]** to **“long-running-cpu-proc.sh”** file. - -``` -# chmod +x /opt/scripts/long-running-cpu-proc.sh -``` - -When you run this script, you will get an output like the one below. - -``` -# 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) Bash Script to Check How Long the High Memory Consumption Processes Runs on Linux - -This script will help you to identify how long the top memory consumption processes has been running on 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 "--------------------------------------------------" -``` - -Set an executable Linux file permission to **“long-running-memory-proc.sh”** file. - -``` -# chmod +x /opt/scripts/long-running-memory-proc.sh -``` - -When you run this script, you will get an output like the one below. - -``` -# 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] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/how-to-find-high-cpu-consumption-processes-in-linux/ -[2]: https://www.2daygeek.com/linux-find-top-memory-consuming-processes/ -[3]: https://www.2daygeek.com/how-to-check-how-long-a-process-has-been-running-in-linux/ -[4]: https://www.2daygeek.com/understanding-linux-file-permissions/ diff --git a/sources/tech/20200108 6 requirements of cloud-native software.md b/sources/tech/20200108 6 requirements of cloud-native software.md deleted file mode 100644 index fcdbe9818c..0000000000 --- a/sources/tech/20200108 6 requirements of cloud-native software.md +++ /dev/null @@ -1,66 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (6 requirements of cloud-native software) -[#]: via: (https://opensource.com/article/20/1/cloud-native-software) -[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh) - -6 requirements of cloud-native software -====== -A checklist for developing and implementing cloud-native -(container-first) software. -![Team checklist][1] - -For many years, monolithic applications were the standard enterprise architecture for achieving business requirements. But that changed significantly once cloud infrastructure began treating business acceleration at scale and speed. Application architectures have also transformed to fit into the cloud-native applications and the [microservices][2], [serverless][3], and event-driven services that are running on immutable infrastructures across hybrid and multi-cloud platforms. - -### The cloud-native connection to Kubernetes - -According to the [Cloud Native Computing Foundation][4] (CNCF): - -> "Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach. -> -> "These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil." - -Container orchestration platforms like [Kubernetes][5] allow DevOps teams to build immutable infrastructures to develop, deploy, and manage application services. The speed at which rapid iteration is possible now aligns with business needs. Developers building containers to run in Kubernetes need an effective place to do so. - -### Requirements for cloud-native software - -What capabilities are required to create a cloud-native application architecture, and what benefits will developers gain from it? - -While there are many ways to build and architect cloud-native applications, the following are some ingredients to consider: - - * **Runtimes:** They are more likely to be written in the container-first or/and Kubernetes-native language, which means runtimes such as Java, Node.js, Go, Python, and Ruby. - * **Security:** When deploying and maintaining applications in a multi-cloud or hybrid cloud application environment, security is of utmost importance and should be part of the environment. - * **Observability:** Use tools such as Prometheus, Grafana, and Kiali that can enhance observability by providing realtime metrics and more information about how applications are being used and behave in the cloud. - * **Efficiency:** Focus on a tiny memory footprint, small artifact size, and fast boot time to make applications portable across hybrid/multi-cloud platforms. - * **Interoperability:** Integrate cloud-native apps with open source technologies that enable you to meet the requirements listed above, including Infinispan, MicroProfile, Hibernate, Kafka, Jaeger, Prometheus, and more, for building standard runtime architectures. - * **DevOps/DevSecOps:** These methodologies are designed for continuous deployment to production, in-line with the minimum viable product (MVP) and with security as part of the tooling. - - - -### Making cloud-native concrete - -Cloud-native can seem like an abstract term, but reviewing the definition and thinking like a developer can make it more concrete. In order for cloud-native applications to be successful, they need to include a long, well-defined list of ingredients. - -How are you planning for cloud-native application design? Share your thoughts in the comments. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/1/cloud-native-software - -作者:[Daniel Oh][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist) -[2]: https://opensource.com/resources/what-are-microservices -[3]: https://opensource.com/article/18/11/open-source-serverless-platforms -[4]: https://github.com/cncf/toc/blob/master/DEFINITION.md -[5]: https://opensource.com/resources/what-is-kubernetes diff --git a/sources/tech/20200118 3 Methods to Install the Latest PHP 7 Package on CentOS-RHEL 7 and CentOS-RHEL 6.md b/sources/tech/20200118 3 Methods to Install the Latest PHP 7 Package on CentOS-RHEL 7 and CentOS-RHEL 6.md deleted file mode 100644 index 09b2f4ca73..0000000000 --- a/sources/tech/20200118 3 Methods to Install the Latest PHP 7 Package on CentOS-RHEL 7 and CentOS-RHEL 6.md +++ /dev/null @@ -1,227 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (3 Methods to Install the Latest PHP 7 Package on CentOS/RHEL 7 and CentOS/RHEL 6) -[#]: via: (https://www.2daygeek.com/install-php-7-on-centos-6-centos-7-rhel-7-redhat-7/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -3 Methods to Install the Latest PHP 7 Package on CentOS/RHEL 7 and CentOS/RHEL 6 -====== - -PHP is the most popular open-source general-purpose scripting language and is widely used for web development. - -It’s part of the LAMP stack application suite and is used to create dynamic websites. - -Popular CMS applications WordPress, Joomla and Drupal are developed in PHP language. - -These applications require PHP 7 for their installation and configuration. - -PHP 7 loads your web application faster and consumes less server resources. - -By default the CentOS/RHEL 6 operating system provides PHP 5.3 in their official repository and CentOS/RHEL 7 provides PHP 5.4. - -In this article we will show you how to install the latest version of PHP on CentOS/RHEL 7 and CentOS/RHEL 6 systems. - -This can be done by adding the necessary **[additional third-party RPM repository][1]** to the system. - -### Method-1 : How to Install PHP 7 on CentOS 6/7 Using the Software Collections Repository (SCL) - -The SCL repository is now maintained by a CentOS SIG, which rebuilds the Red Hat Software Collections and also provides some additional packages of their own. - -It contains newer versions of various programs that can be installed alongside existing older packages and invoked by using the scl command. - -Run the following **[yum command][2]** to install Software Collections Repository (SCL) on CentOS - -``` -# yum install centos-release-scl -``` - -Run the following command to verify the PHP 7 version available in the scl repository. - -``` -# yum --disablerepo="*" --enablerepo="centos-sclo-rh" list *php - -Loaded plugins: fastestmirror, langpacks -Loading mirror speeds from cached hostfile -centos-sclo-rh: centos.mirrors.estointernet.in -Available Packages -php54-php.x86_64 5.4.40-4.el7 centos-sclo-rh -php55-php.x86_64 5.5.21-5.el7 centos-sclo-rh -rh-php70-php.x86_64 7.0.27-2.el7 centos-sclo-rh -rh-php71-php.x86_64 7.1.30-2.el7 centos-sclo-rh -rh-php72-php.x86_64 7.2.24-1.el7 centos-sclo-rh -``` - -Run the command below to install the PHP 7.2 on your system from scl. - -``` -# yum --disablerepo="*" --enablerepo="centos-sclo-rh" install rh-php72-php -``` - -If you need to install additional modules for PHP 7.2, you can install them by running the command format below. For instance, you can install the **“gd”** and **“pdo”** packages by executing the command below. - -``` -# yum --disablerepo="*" --enablerepo="centos-sclo-rh" install rh-php72-php-gd rh-php72-php-pdo -``` - -### Method-1a : How to Install PHP 7 on RHEL 7 Using the Software Collections Repository (SCL) - -For Red Hat 7, enable the following repositories to install the latest PHP 7 package. - -``` -# sudo subscription-manager repos --enable rhel-7-server-extras-rpms -# sudo subscription-manager repos --enable rhel-7-server-optional-rpms -# sudo subscription-manager repos --enable rhel-server-rhscl-7-rpms -``` - -Run the command below to search the available PHP 7 version from the RHSCL repository. - -``` -# yum search rh-php* -``` - -You can easily install PHP 7.3 on the RHEL 7 machine by running the command below from the RHSCL repository. - -``` -# yum install rh-php73 -``` - -### Method-2 : How to Install PHP 7 on CentOS 6/7 Using the Remi Repository - -The **[Remi repository][3]** stores and maintains the latest version of PHP packages with a large collection of libraries, extensions and tools. Some of them are back-ported from Fedora and EPEL. - -This is a CentOS community-recognized repository and doesn’t modify or affect any underlying packages. - -As a prerequisite, this installs the **[EPEL repository][4]** if it is not already installed on your system. - -You can easily find the available version of the PHP 7 package from the Remy repository because it adds a separate repo to each version. You can view them using the **[ls command][5]**. - -``` -# ls -lh /etc/yum.repos.d/remi-php* - --rw-r--r--. 1 root root 456 Sep 6 01:31 /etc/yum.repos.d/remi-php54.repo --rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php70.repo --rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php71.repo --rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php72.repo --rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php73.repo --rw-r--r--. 1 root root 1.3K Sep 6 01:31 /etc/yum.repos.d/remi-php74.repo -``` - -You can easily install PHP 7.4 on the CentOS 6/7 systems by running the command below from the remi repository. - -``` -# yum --disablerepo="*" --enablerepo="remi-php74" install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo -``` - -### Method-2a : How to Install PHP 7 on RHEL 7 Using the Remi Reposiotry - -For Red Hat 7, install the following repositories to install the latest PHP 7 package. - -To install EPEL Repository on RHEL 7 - -``` -# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -``` - -To install Remi Repository on RHEL 7 - -``` -# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm -``` - -To enable the optional RPMS repository. - -``` -# subscription-manager repos --enable=rhel-7-server-optional-rpms -``` - -You can easily install PHP 7.4 on the RHEL 7 systems by running the below command from the remi repository. - -``` -# yum --disablerepo="*" --enablerepo="remi-php74" install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo -``` - -To verify the PHP 7 installation, run the following command - -``` -# php -v - -PHP 7.4.1 (cli) (built: Dec 17 2019 16:35:58) ( NTS ) -Copyright (c) The PHP Group -Zend Engine v3.4.0, Copyright (c) Zend Technologies -``` - -### Method-3 : How to Install PHP 7 on CentOS 6/7 Using the IUS Community Repository - -IUS Community is a CentOS Community Approved third-party RPM repository which contains latest upstream versions of PHP, Python, MySQL, etc.., packages for Enterprise Linux (RHEL & CentOS) 5, 6 & 7. - -**[IUS Community Repository][6]** have dependency with EPEL Repository so we have to install EPEL repository prior to IUS repository installation. Follow the below steps to install & enable EPEL & IUS Community Repository to RPM systems and install the packages. - -EPEL package is included in the CentOS Extras repository and enabled by default so, we can install this by running below command. - -``` -# yum install epel-release -``` - -Download IUS Community Repository Shell script - -``` -# curl 'https://setup.ius.io/' -o setup-ius.sh - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed -100 1914 100 1914 0 0 6563 0 --:--:-- --:--:-- --:--:-- 133k -``` - -Install/Enable IUS Community Repository. - -``` -# sh setup-ius.sh -``` - -Run the following command to check available PHP 7 version in the IUS repository. - -``` -# yum --disablerepo="*" --enablerepo="ius" list *php7* - -Loaded plugins: fastestmirror, langpacks -Loading mirror speeds from cached hostfile -Available Packages -mod_php71u.x86_64 7.1.33-1.el7.ius ius -mod_php72u.x86_64 7.2.26-1.el7.ius ius -mod_php73.x86_64 7.3.13-1.el7.ius ius -php71u-bcmath.x86_64 7.1.33-1.el7.ius ius -php71u-cli.x86_64 7.1.33-1.el7.ius ius -php71u-common.x86_64 7.1.33-1.el7.ius ius -php71u-dba.x86_64 7.1.33-1.el7.ius ius -php71u-dbg.x86_64 7.1.33-1.el7.ius ius -php71u-devel.x86_64 7.1.33-1.el7.ius ius -php71u-embedded.x86_64 7.1.33-1.el7.ius ius -``` - -You can easily install PHP 7.3 on the CentOS 6/7 systems by running the command below from the IUS Community repository. - -``` -# yum --disablerepo="*" --enablerepo="ius" install php73-common php73-cli php73-gd php73-gd php73-mysqlnd php73-ldap php73-soap php73-mbstring -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/install-php-7-on-centos-6-centos-7-rhel-7-redhat-7/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/8-additional-thirdparty-yum-repositories-centos-rhel-fedora-linux/ -[2]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/ -[3]: https://www.2daygeek.com/install-enable-remi-repository-on-centos-rhel-fedora-linux/ -[4]: https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-oracle-linux/ -[5]: https://www.2daygeek.com/linux-unix-ls-command-display-directory-contents/ -[6]: https://www.2daygeek.com/install-enable-ius-community-repository-on-rhel-centos/ diff --git a/sources/tech/20200120 Use Wireshark at the Linux command line with TShark.md b/sources/tech/20200120 Use Wireshark at the Linux command line with TShark.md deleted file mode 100644 index d582ca77f0..0000000000 --- a/sources/tech/20200120 Use Wireshark at the Linux command line with TShark.md +++ /dev/null @@ -1,768 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Use Wireshark at the Linux command line with TShark) -[#]: via: (https://opensource.com/article/20/1/wireshark-linux-tshark) -[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) - -Use Wireshark at the Linux command line with TShark -====== -Learning to analyze network packets is a powerful skill. -![Multi-colored and directional network computer cables][1] - -Most of the time when we connect to the internet, we don't think about the network protocols at work underneath that make it all possible. Right now, while you are reading this article, numerous packets are being exchanged by your computer and traveling across the internet. - -To understand these protocols, you need a tool that can capture and help you analyze these packets. [Wireshark][2] is a popular open source graphical user interface (GUI) tool for analyzing packets. However, it also provides a powerful command-line utility called [TShark][3] for people who prefer to work on the Linux command line. - -To try the examples in this article, you need to be connected to the internet. For any changes to TShark's command-line options or flags, please refer to the appropriate man pages and online [documentation][4]. Also, I am using Fedora for these examples. - - -``` -[gaurav@testbox ~]$ cat /etc/fedora-release -Fedora release 30 (Thirty) -[gaurav@testbox ~]$ -``` - -### Check your installation - -First, ensure the required packages are installed: - - -``` -[gaurav@testbox ~]$ rpm -qa | grep -i wireshark -wireshark-cli-3.0.1-1.fc30.x86_64 -[gaurav@testbox ~]$ -``` - -If the Wireshark package is installed, check whether the TShark utility is installed and, if so, which version: - - -``` -[gaurav@testbox ~]$ tshark -v -TShark (Wireshark) 3.0.1 (23f278e2) - -Built using gcc 9.0.1 20190312 (Red Hat 9.0.1-0.10). -[gaurav@testbox ~]$ -``` - -If you are logged in as a regular, non-root user, you need sudo rights to use the TShark utility. Root users can skip sudo and directly run the **tshark** command. - -### Find network devices available to TShark - -Before TShark can analyze packets, it needs to capture those packets. Network packets are processed via a network interface card (NIC) on servers, workstations, or desktops or a WiFi card on laptops. Begin by identifying the NIC or WiFi card used to connect to the internet. - -To identify what network devices are available to TShark, run the following command. My laptop (which I am using for these examples) shows: - - -``` -[gaurav@testbox ~]$ sudo tshark -D -Running as user "root" and group "root". This could be dangerous. -1\. wlp61s0 -2\. lo (Loopback) -3\. any -4\. virbr0 -5\. enp0s31f6 -6\. bluetooth-monitor -7\. nflog -8\. nfqueue -[gaurav@testbox ~]$ -``` - -I am using my WiFi card to connect to my home router for accessing the internet. You can use the **ifconfig -a** command to view all network interfaces on a system. If the **ifconfig** command is not installed, you can use the newer **ip addr show** command instead. One of the interfaces should have an IP address assigned to it. For a specific interface, you can use **ifconfig <interface-name>**, for example: - - -``` -`ifconfig wlp61s0` -``` - -### Capture some packets - -Now that you know which interface is being used to connect to the internet, you can start capturing some packets using it. The **-i** option can be used to capture packets on this specific interface. You'll see a bunch of output that shows the network packets being transmitted via the interface, but you can stop it with the **Ctrl+C** command: - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -    1 0.000000000  192.168.1.9 → 192.168.1.1  DNS 77 Standard query 0xa02b AAAA fedoraproject.org -    2 0.000128115  192.168.1.9 → 192.168.1.1  DNS 77 Standard query 0xcc47 A fedoraproject.org -    3 0.000316195  192.168.1.9 → 192.168.1.1  DNS 77 Standard query 0xe29d A fedoraproject.org -    4 0.000616019  192.168.1.9 → 192.168.1.1  DNS 77 Standard query 0xac7c AAAA fedoraproject.org -    5 0.007963200  192.168.1.1 → 192.168.1.9  DNS 93 Standard query response 0xcc47 A fedoraproject.org A 185.141.165.254 -    6 0.009171815  192.168.1.1 → 192.168.1.9  DNS 93 Standard query response 0xe29d A fedoraproject.org A 185.141.165.254 -    7 0.011075350  192.168.1.1 → 192.168.1.9  DNS 322 Standard query response 0xa02b AAAA fedoraproject.org AAAA 2610:28:3090:3001:dead:beef:cafe:fed3 AAAA 2605:bc80:3010:600:dead:beef:cafe:fed9 AAAA 2604:1580:fe00:0:dead:beef:cafe:fed1 NS ns04.fedoraproject.org NS ns05.fedoraproject.org NS ns02.fedoraproject.org A 152.19.134.139 AAAA 2610:28:3090:3001:dead:beef:cafe:fed5 A 209.132.181.17 A 85.236.55.10 AAAA 2001:4178:2:1269:dead:beef:cafe:fed5 -    8 0.012458151  192.168.1.1 → 192.168.1.9  DNS 322 Standard query response 0xac7c AAAA fedoraproject.org AAAA 2605:bc80:3010:600:dead:beef:cafe:fed9 AAAA 2610:28:3090:3001:dead:beef:cafe:fed3 AAAA 2604:1580:fe00:0:dead:beef:cafe:fed1 NS ns05.fedoraproject.org NS ns02.fedoraproject.org NS ns04.fedoraproject.org A 152.19.134.139 AAAA 2610:28:3090:3001:dead:beef:cafe:fed5 A 209.132.181.17 A 85.236.55.10 AAAA 2001:4178:2:1269:dead:beef:cafe:fed5 -^C8 packets captured -[gaurav@testbox ~]$ -``` - -Look at the first two packets above; they are denoted by numbers at the beginning of the line: - - -``` -1 0.000000000  192.168.1.9 → 192.168.1.1  DNS 77 Standard query 0xa02b AAAA fedoraproject.org -2 0.000128115  192.168.1.9 → 192.168.1.1  DNS 77 Standard query 0xcc47 A fedoraproject.org -``` - -These lines include two IP addresses on either side of an arrow—these are the hosts that are exchanging the packet. The arrow's direction indicates which direction the packet is going. Therefore, **192.168.1.9 → 192.168.1.1** means the packet originated at host **192.168.1.9**, which is my laptop, and is headed for destination **192.168.1.1**, which is my home router. After the destination IP address, you see **DNS**, which is just the Domain Name System protocol, followed by a DNS query. More about that later. - -You can limit the number of packets captured and displayed on the screen using the **-c** (count) option. The following example shows 10 packets being captured. Notice the protocols—you saw DNS above, and here there are other protocols like NTP and TCP: - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 -c 10 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -    1 0.000000000  192.168.1.9 → 10.5.26.10   NTP 90 NTP Version 4, client -    2 0.803303963  192.168.1.9 → 10.5.27.10   NTP 90 NTP Version 4, client -    3 3.524867645  192.168.1.9 → 192.168.1.1  DNS 69 Standard query 0x3837 A testbox -    4 6.227373094  192.168.1.9 → 192.168.1.1  DNS 89 Standard query 0x0814 A location.services.mozilla.com -    5 6.227395145  192.168.1.9 → 192.168.1.1  DNS 89 Standard query 0x5e1c AAAA location.services.mozilla.com -    6 6.234878912  192.168.1.1 → 192.168.1.9  DNS 105 Standard query response 0x0814 A location.services.mozilla.com A 34.253.23.107 -    7 6.238110416  192.168.1.1 → 192.168.1.9  DNS 223 Standard query response 0x5e1c AAAA location.services.mozilla.com CNAME locprod1-elb-eu-west-1.prod.mozaws.net SOA ns-1260.awsdns-29.org -    8 6.238446999  192.168.1.9 → 34.253.23.107 TCP 74 35326 → 443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2832002333 TSecr=0 WS=128 -    9 6.438833991 34.253.23.107 → 192.168.1.9  TCP 74 443 → 35326 [SYN, ACK] Seq=0 Ack=1 Win=26847 Len=0 MSS=1440 SACK_PERM=1 TSval=2056252981 TSecr=2832002333 WS=256 -   10 6.438947001  192.168.1.9 → 34.253.23.107 TCP 66 35326 → 443 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=2832002533 TSecr=2056252981 -10 packets captured -[gaurav@testbox ~]$ -``` - -The DNS protocol converts the hostname to an IP address and the IP address to a hostname. There are dedicated DNS (or name) servers, which you can query with either a hostname or an IP address. The example below uses the **nslookup** command to query the name servers to resolve a hostname to an IP address. Before you proceed, ensure the **bind-utils** package is installed: - - -``` -[gaurav@testbox ~]$ rpm -qa | grep -i bind-utils -bind-utils-9.11.5-13.P4.fc30.x86_64 -[gaurav@testbox ~]$ -``` - -In order to query your name server, you need to find out which one your machine is talking to. You can find that information in the **/etc/resolv.conf** file. In my case, the name server is pointed to **1.1.1.1**, which is a public DNS service provided by Cloudflare: - - -``` -[gaurav@testbox ~]$ cat /etc/resolv.conf -# Generated by NetworkManager -nameserver 1.1.1.1 -[gaurav@testbox ~]$ -``` - -Hostnames like Opensource.com are easy for humans to understand, but machines use IP addresses to connect to other machines over a network or the internet. For your computer to connect to opensource.com, it needs to find the site's IP address; you can find it with the command: - - -``` -`nslookup opensource.com` -``` - -If **nslookup** is not available on your machine, you can use the **dig** command instead: - - -``` -`dig opensource.com` -``` - -But—_before you hit Enter_—open another terminal and type the following command to tell TShark to capture any traffic that goes to your name server (e.g., 1.1.1.1): - - -``` -`sudo tshark -i wlp61s0 host 1.1.1.1` -``` - -Keep that terminal running and return to the other one, then run **nslookup** (or **dig**). When the command completes, it gives Opensource.com's IP address, which is 54.204.39.132. Here is **nslookup**'s output: - - -``` -[gaurav@testbox ~]$ nslookup opensource.com -Server:         1.1.1.1 -Address:        1.1.1.1#53 - -Non-authoritative answer: -Name:   opensource.com -Address: 54.204.39.132 - -[gaurav@testbox ~]$ -``` - -And **dig**'s output: - - -``` -[gaurav@testbox ~]$ dig opensource.com - -; <<>> DiG 9.11.5-P4-RedHat-9.11.5-13.P4.fc30 <<>> opensource.com -;; global options: +cmd -;; Got answer: -;; ->>HEADER<<\- opcode: QUERY, status: NOERROR, id: 33030 -;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 - -;; OPT PSEUDOSECTION: -; EDNS: version: 0, flags:; udp: 1452 -;; QUESTION SECTION: -;opensource.com.                        IN      A - -;; ANSWER SECTION: -opensource.com.         206     IN      A       54.204.39.132 - -;; Query time: 30 msec -;; SERVER: 1.1.1.1#53(1.1.1.1) -;; WHEN: Sat Nov 02 21:05:54 IST 2019 -;; MSG SIZE  rcvd: 59 - -[gaurav@testbox ~]$ -``` - -So far, so good, but what is happening at the packet level? Move to the terminal where you entered the **tshark** command. It captured a few packets: - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 host 1.1.1.1 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -    2 1.798275687  192.168.1.9 → 1.1.1.1      DNS 74 Standard query 0xcda0 A opensource.com -    3 1.827143443      1.1.1.1 → 192.168.1.9  DNS 90 Standard query response 0xcda0 A opensource.com A 54.204.39.132 -    ^C packets captured -[gaurav@testbox ~]$ -``` - -The packet below originated from my laptop **192.168.1.9** and is headed for destination **1.1.1.1**. The packet is for the DNS protocol, and it's querying (Standard query) the name server for Opensource.com: - - -``` -`2 1.798275687 192.168.1.9 → 1.1.1.1 DNS 74 Standard query 0xcda0 A opensource.com` -``` - -The packet below is a reply coming from my name server **1.1.1.1** to my machine **192.168.1.9**. Again, it's DNS, but now it's a response for the query (Standard query response) for Opensource.com's IP address: - - -``` -`3 1.827143443      1.1.1.1 → 192.168.1.9  DNS 90 Standard query response 0xcda0 A opensource.com A 54.204.39.132` -``` - -If you know beforehand what protocol you are looking for, you can add it to the **tshark** command. The following example is looking only for UDP packets, but it captured DNS packets. This is because DNS packets use the UDP protocol underneath: - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 udp -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -    1 0.000000000  192.168.1.9 → 1.1.1.1      DNS 89 Standard query 0xcc6d A location.services.mozilla.com -    2 0.000068640  192.168.1.9 → 1.1.1.1      DNS 89 Standard query 0x6484 AAAA location.services.mozilla.com -    3 0.032616053      1.1.1.1 → 192.168.1.9  DNS 189 Standard query response 0xcc6d A location.services.mozilla.com CNAME locprod1-elb-eu-west-1.prod.mozaws.net A 52.215.71.87 A 54.72.168.141 A 34.253.23.107 -    4 0.108203529      1.1.1.1 → 192.168.1.9  DNS 241 Standard query response 0x6484 AAAA location.services.mozilla.com CNAME locprod1-elb-eu-west-1.prod.mozaws.net SOA ns-1260.awsdns-29.org -    5 1.268489014  192.168.1.9 → 1.1.1.1      DNS 69 Standard query 0x74be A testbox -    6 1.302652455      1.1.1.1 → 192.168.1.9  DNS 144 Standard query response 0x74be No such name A testbox SOA a.root-servers.net -    7 6.268558254  192.168.1.9 → 1.1.1.1      DNS 79 Standard query 0xc47a A cups.pnq.redhat.com -    8 6.268618039  192.168.1.9 → 1.1.1.1      DNS 79 Standard query 0xb08b AAAA cups.pnq.redhat.com -    9 6.664992312      1.1.1.1 → 192.168.1.9  DNS 143 Standard query response 0xb08b AAAA cups.pnq.redhat.com SOA a1-68.akam.net -   10 6.665088305      1.1.1.1 → 192.168.1.9  DNS 143 Standard query response 0xc47a A cups.pnq.redhat.com SOA a1-68.akam.net -^C10 packets captured -[gaurav@testbox ~]$ -``` - -The **ping** command is often used to check if a machine is up or accessible over a network. You can run the **ping** command against Opensource.com's IP address to see if the server is up and running. - -Before you do that, start a packet capture so you can analyze the packet later. Open a terminal and run the following command, which will keep running and looking for packets that are originating in or destined for IP address 54.204.39.132: - - -``` -`sudo tshark -i wlp61s0 host 54.204.39.132` -``` - -In another terminal, run the following **ping** command. The **-c** is for count, so **-c 2** means it should send only two packets to the given host: - - -``` -`ping -c 2 54.204.39.132` -``` - -From the terminal where you ran the **ping** command, you can see two packets were sent and two were received. It also says that there was 0% packet loss, which suggests that the destination 54.204.39.132 responded to the **ping** requests: - - -``` -[gaurav@testbox ~]$ ping -c 2 54.204.39.132 -PING 54.204.39.132 (54.204.39.132) 56(84) bytes of data. -64 bytes from 54.204.39.132: icmp_seq=1 ttl=43 time=357 ms -64 bytes from 54.204.39.132: icmp_seq=2 ttl=43 time=278 ms - -\--- 54.204.39.132 ping statistics --- -2 packets transmitted, 2 received, 0% packet loss, time 1ms -rtt min/avg/max/mdev = 278.045/317.410/356.776/39.369 ms -[gaurav@testbox ~]$ -``` - -Move back to the terminal where TShark is running. It shows four packets: the requests in the **ping** command (**-c 2**) and two replies, hence a total of four packets: - - -``` -Packet 1 - request (1st request) -Packet 2 - reply (to Packet 1) -Packet 3 - request (2nd request) -Packet 4 - reply (to Packet 3) -``` - -The output shows that it is using the [ICMP][5] protocol. **Ping** works over ICMP to complete its tasks: - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 host 54.204.39.132 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -    1 0.000000000  192.168.1.9 → 54.204.39.132 ICMP 98 Echo (ping) request  id=0x1749, seq=1/256, ttl=64 -    2 0.356750411 54.204.39.132 → 192.168.1.9  ICMP 98 Echo (ping) reply    id=0x1749, seq=1/256, ttl=43 (request in 1) -    3 1.000295229  192.168.1.9 → 54.204.39.132 ICMP 98 Echo (ping) request  id=0x1749, seq=2/512, ttl=64 -    4 1.278267790 54.204.39.132 → 192.168.1.9  ICMP 98 Echo (ping) reply    id=0x1749, seq=2/512, ttl=43 (request in 3) -^C4 packets captured -[gaurav@testbox ~]$ -``` - -Network packets are sent in binary format, so if you want to see how they look on the network, you can dump the packet's hexadecimal format by simply adding an **-x** to the **tshark** command, and you will see the hexadecimal output. The following output shows a **ping** request sent by running the command **ping -c 1 54.204.39.132**: - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 -x -c 2 host 54.204.39.132 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -0000  28 c6 8e 3e 39 3a 48 89 e7 a0 33 db 08 00 45 00   (..>9:H...3...E. -0010  00 54 e6 29 40 00 40 01 34 7e c0 a8 01 09 36 cc   .T.)@.@.4~....6. -0020  27 84 08 00 25 5f 27 d1 00 01 7e aa bd 5d 00 00   '...%_'...~..].. -0030  00 00 a2 f3 0d 00 00 00 00 00 10 11 12 13 14 15   ................ -0040  16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25   .......... !"#$% -0050  26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35   &'()*+,-./012345 -0060  36 37                                             67 - -0000  48 89 e7 a0 33 db 28 c6 8e 3e 39 3a 08 00 45 00   H...3.(..>9:..E. -0010  00 54 31 06 00 00 2b 01 3e a2 36 cc 27 84 c0 a8   .T1...+.>.6.'... -0020  01 09 00 00 2d 5f 27 d1 00 01 7e aa bd 5d 00 00   ....-_'...~..].. -0030  00 00 a2 f3 0d 00 00 00 00 00 10 11 12 13 14 15   ................ -0040  16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25   .......... !"#$% -0050  26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35   &'()*+,-./012345 -0060  36 37                                             67 - -2 packets captured -[gaurav@testbox ~]$ -``` - -### Save your output - -Seeing output on the screen is OK, but often you need to save data to a file to use it later. Use the **ping** command but add **-w** to tell TShark to dump the output to a file. For example, the following saves the output to file named **nlog.pcap** within the **/tmp** directory: - - -``` -`sudo tshark -w /tmp/nlog.pcap -i wlp61s0 host 54.204.39.132` -``` - -Now run the **ping** command again from another terminal, but this time with a count of five packets: - - -``` -`ping -c 5 54.204.39.132` -``` - -The TShark terminal shows that 10 packets were captured. Why 10? Because you asked **ping** to send five requests, and you got five replies, hence 10 packets. Use **Ctrl+C** to stop the packet capture: - - -``` -[gaurav@testbox ~]$ sudo tshark -w /tmp/nlog.pcap -i wlp61s0 host 54.204.39.132 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -10 ^C -[gaurav@testbox ~]$ -``` - -TShark saved the output to the file **/tmp/nlog.pcap**: - - -``` -[gaurav@testbox ~]$ ls -l /tmp/nlog.pcap --rw-------. 1 root root 1692 Nov  2 21:10 /tmp/nlog.pcap -[gaurav@testbox ~]$ -``` - -The **file** command shows the file type is a **pcapng** capture file, so you can't just open the file using an editor like Vim and start reading; all you'll see is a bunch of garbage characters: - - -``` -[gaurav@testbox ~]$ sudo file /tmp/nlog.pcap -/tmp/nlog.pcap: pcapng capture file - version 1.0 -[gaurav@testbox ~]$ -``` - -Since TShark wrote the data to the file, it can read it back from the file as well using the **-r** option followed by the filename. The following shows all 10 packets (five requests and five replies): - - -``` -[gaurav@testbox ~]$ sudo tshark -r /tmp/nlog.pcap -Running as user "root" and group "root". This could be dangerous. -    1 0.000000000  192.168.1.9 → 54.204.39.132 ICMP 98 Echo (ping) request  id=0x1875, seq=1/256, ttl=64 -    2 0.270098703 54.204.39.132 → 192.168.1.9  ICMP 98 Echo (ping) reply    id=0x1875, seq=1/256, ttl=43 (request in 1) -    3 1.000485186  192.168.1.9 → 54.204.39.132 ICMP 98 Echo (ping) request  id=0x1875, seq=2/512, ttl=64 -    4 1.323571769 54.204.39.132 → 192.168.1.9  ICMP 98 Echo (ping) reply    id=0x1875, seq=2/512, ttl=43 (request in 3) -    5 2.000955585  192.168.1.9 → 54.204.39.132 ICMP 98 Echo (ping) request  id=0x1875, seq=3/768, ttl=64 -    6 2.347737132 54.204.39.132 → 192.168.1.9  ICMP 98 Echo (ping) reply    id=0x1875, seq=3/768, ttl=43 (request in 5) -    7 3.000912998  192.168.1.9 → 54.204.39.132 ICMP 98 Echo (ping) request  id=0x1875, seq=4/1024, ttl=64 -    8 3.269412434 54.204.39.132 → 192.168.1.9  ICMP 98 Echo (ping) reply    id=0x1875, seq=4/1024, ttl=43 (request in 7) -    9 4.001573635  192.168.1.9 → 54.204.39.132 ICMP 98 Echo (ping) request  id=0x1875, seq=5/1280, ttl=64 -   10 4.293431592 54.204.39.132 → 192.168.1.9  ICMP 98 Echo (ping) reply    id=0x1875, seq=5/1280, ttl=43 (request in 9) -[gaurav@testbox ~]$ - -#TCP handshake -``` - -A [TCP handshake][6] is done before establishing a connection over a network. The examples above just queried a name server or tried to determine whether a machine is reachable via a **ping** command, neither of which requires establishing a connection with the host. Try to fetch [www.opensource.com][7] via the **wget** command. - -Before you run **wget**, run the following command in another terminal to capture packets. I have deliberately kept the count to three since the handshake involves initial packets: - - -``` -`sudo tshark -i wlp61s0 -c 3 host 54.204.39.132` -``` - -Next, run the **wget** command to download the index file: - - -``` -[gaurav@testbox ~]$ wget -\--2019-11-02 21:13:54--   -Resolving [www.opensource.com][7] ([www.opensource.com][7])... 54.204.39.132 -Connecting to [www.opensource.com][7] ([www.opensource.com)|54.204.39.132|:443][8]... connected. -HTTP request sent, awaiting response... 301 Moved Permanently -Location: [following] -\--2019-11-02 21:13:56--   -Resolving opensource.com (opensource.com)... 54.204.39.132 -Connecting to opensource.com (opensource.com)|54.204.39.132|:80... connected. -HTTP request sent, awaiting response... 302 Found -Location: [following] -\--2019-11-02 21:13:57--   -Connecting to opensource.com (opensource.com)|54.204.39.132|:443... connected. -HTTP request sent, awaiting response... 200 OK -Length: 71561 (70K) [text/html] -Saving to: ‘index.html’ - -index.html                        100%[=============================================================>]  69.88K   105KB/s    in 0.7s     - -2019-11-02 21:13:59 (105 KB/s) - ‘index.html’ saved [71561/71561] - -[gaurav@testbox ~]$ ^C -``` - -You can view the three packets below. The first packet sends a **SYN** request from my laptop to the Opensource.com server. The second packet is the Opensource.com server replying with a **SYN, ACK** flag set. Finally, the third packet is my laptop sending an **ACK** request to acknowledge receiving the second packet. This is called a TCP handshake. After this handshake, both nodes (i.e., my laptop and the Opensource.com server) can exchange data. - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 -c 3 host 54.204.39.132 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -    1 0.000000000  192.168.1.9 → 54.204.39.132 TCP 74 58784 → 443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=790376430 TSecr=0 WS=128 -    2 0.306538226 54.204.39.132 → 192.168.1.9  TCP 74 443 → 58784 [SYN, ACK] Seq=0 Ack=1 Win=26847 Len=0 MSS=1440 SACK_PERM=1 TSval=1306268046 TSecr=790376430 WS=512 -    3 0.306671608  192.168.1.9 → 54.204.39.132 TCP 66 58784 → 443 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=790376737 TSecr=1306268046 -3 packets captured -[gaurav@testbox ~]$ -``` - -If you exclude **-c 3**, it will capture all packets, and you will see a similar ritual to close a connection. Only this time, my laptop sent a **FIN, ACK** packet to Opensource.com (in packet 1 below), followed by a **FIN, ACK** from Opensource.com to my laptop (in packet 2 below), and finally an **ACK** packet sent by my laptop to the Opensource.com server. This concludes the network connection that was established earlier, and any future connections will have to set up a TCP handshake again. - - -``` -   73 4.505715716  192.168.1.9 → 54.204.39.132 TCP 66 59574 → 443 [FIN, ACK] Seq=814 Ack=76239 Win=69888 Len=0 TSval=792384514 TSecr=1306769989 -   74 4.737227282 54.204.39.132 → 192.168.1.9  TCP 66 443 → 59574 [FIN, ACK] Seq=76239 Ack=815 Win=29184 Len=0 TSval=1306770066 TSecr=792384514 -   75 4.737389399  192.168.1.9 → 54.204.39.132 TCP 66 59574 → 443 [ACK] Seq=815 Ack=76240 Win=69888 Len=0 TSval=792384745 TSecr=1306770066 -``` - -### Encrypt handshake data - -These days, most websites are accessed over HTTPS instead of HTTP. This ensures the data passed between the two nodes is encrypted on the wire as it passes through the internet. To ensure data is encrypted, a [TLS handshake][9] method, which is similar to the TCP handshake, happens. - -Fire another **wget** command, but this time it captures 11 packets from the beginning: - - -``` -[gaurav@testbox ~]$ wget -\--2019-11-02 21:15:21--   -Resolving [www.opensource.com][7] ([www.opensource.com][7])... 54.204.39.132 -Connecting to [www.opensource.com][7] ([www.opensource.com)|54.204.39.132|:443][8]... connected. -HTTP request sent, awaiting response... 301 Moved Permanently -Location: [following] -\--2019-11-02 21:15:23--   -Resolving opensource.com (opensource.com)... 54.204.39.132 -Connecting to opensource.com (opensource.com)|54.204.39.132|:80... connected. -HTTP request sent, awaiting response... 302 Found -Location: [following] -\--2019-11-02 21:15:28--   -Connecting to opensource.com (opensource.com)|54.204.39.132|:443... connected. -HTTP request sent, awaiting response... 200 OK -Length: 71561 (70K) [text/html] -Saving to: ‘index.html’ - -index.html                        100%[=============================================================>]  69.88K   114KB/s    in 0.6s     - -2019-11-02 21:15:31 (114 KB/s) - ‘index.html’ saved [71561/71561] - -[gaurav@testbox ~]$ -``` - -The TCP handshake concludes in the first three packets, and the fourth to the ninth have various packets that have TLS strings, which follow a similar handshake ritual to set up a secure, encrypted connection between the two hosts: - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 -c 11 host 54.204.39.132 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -    1 0.000000000  192.168.1.9 → 54.204.39.132 TCP 74 58800 → 443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=790462858 TSecr=0 WS=128 -    2 0.305006506 54.204.39.132 → 192.168.1.9  TCP 74 443 → 58800 [SYN, ACK] Seq=0 Ack=1 Win=26847 Len=0 MSS=1440 SACK_PERM=1 TSval=1306289652 TSecr=790462858 WS=512 -    3 0.305135180  192.168.1.9 → 54.204.39.132 TCP 66 58800 → 443 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=790463163 TSecr=1306289652 -    4 0.308282152  192.168.1.9 → 54.204.39.132 TLSv1 583 Client Hello -    5 0.613210220 54.204.39.132 → 192.168.1.9  TCP 66 443 → 58800 [ACK] Seq=1 Ack=518 Win=28160 Len=0 TSval=1306289729 TSecr=790463166 -    6 0.613298883 54.204.39.132 → 192.168.1.9  TLSv1.2 3139 Server Hello, Certificate, Server Key Exchange, Server Hello Done -    7 0.613356054  192.168.1.9 → 54.204.39.132 TCP 66 58800 → 443 [ACK] Seq=518 Ack=3074 Win=61184 Len=0 TSval=790463472 TSecr=1306289729 -    8 0.617318607  192.168.1.9 → 54.204.39.132 TLSv1.2 192 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message -    9 0.919718195 54.204.39.132 → 192.168.1.9  TLSv1.2 324 New Session Ticket, Change Cipher Spec, Encrypted Handshake Message -   10 0.940858609  192.168.1.9 → 54.204.39.132 TLSv1.2 240 Application Data -   11 1.228530079 54.204.39.132 → 192.168.1.9  TLSv1.2 754 Application Data -11 packets captured -[gaurav@testbox ~]$ -``` - -Because HTTPS works on port 443 by default, you can use it as a filter in TShark to capture traffic going to that specific port: - - -``` -`sudo tshark -i wlp61s0 host 54.204.39.132 and port 443` -``` - -Timestamps are essential when you need to analyze packets offline to reconstruct events from the past, e.g., for debugging. Adding a **-t ad** flag to TShark will add timestamps to the beginning of each packet capture: - - -``` -[gaurav@testbox ~]$ sudo tshark -n -i wlp61s0 -t ad -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -    1 2019-11-02 21:43:58.344158174 25:c9:8e:3f:38:3a → 48:89:e7:a0:33:db ARP 42 Who has 192.168.1.9? Tell 192.168.1.1 -    2 2019-11-02 21:43:58.344194844 48:89:e7:a0:33:db → 25:c9:8e:3f:38:3a ARP 42 192.168.1.9 is at 48:89:e7:a0:33:db -    3 2019-11-02 21:44:00.223393961  192.168.1.9 → 1.1.1.1      DNS 79 Standard query 0x00fb A cups.pnq.redhat.com -    4 2019-11-02 21:44:00.223460961  192.168.1.9 → 1.1.1.1      DNS 79 Standard query 0x1814 AAAA cups.pnq.redhat.com -    5 2019-11-02 21:44:00.266325914      1.1.1.1 → 192.168.1.9  DNS 143 Standard query response 0x00fb A cups.pnq.redhat.com SOA a1-68.akam.net -    6 2019-11-02 21:44:00.269102767      1.1.1.1 → 192.168.1.9  DNS 143 Standard query response 0x1814 AAAA cups.pnq.redhat.com SOA a1-68.akam.net -^C6 packets captured -[gaurav@testbox ~]$ -``` - -### View an entire packet - -So far, you have seen several examples of packets and ways to interpret them but not an entire packet. Here's how to use **ping** and the **nslookup** utility to dump an entire packet: - - -``` -[gaurav@testbox ~]$ ping -c 1 54.204.39.132 -PING 54.204.39.132 (54.204.39.132) 56(84) bytes of data. -64 bytes from 54.204.39.132: icmp_seq=1 ttl=43 time=357 ms - -\--- 54.204.39.132 ping statistics --- -1 packets transmitted, 1 received, 0% packet loss, time 0ms -rtt min/avg/max/mdev = 356.961/356.961/356.961/0.000 ms -[gaurav@testbox ~]$ -``` - -In another window, run the following command and then the **ping** command above. Notice the additional **-V** flag—it is used to dump the entire packet information on the screen. The output is divided into various sections, starting with Frames, then moving to Ethernet, then to Internet Protocol, and so on. - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 -c 1 -V host 54.204.39.132 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -Frame 1: 98 bytes on wire (784 bits), 98 bytes captured (784 bits) on interface 0 -    Interface id: 0 (wlp61s0) -        Interface name: wlp61s0 -    Encapsulation type: Ethernet (1) -    Arrival Time: Nov  2, 2019 21:17:55.556150846 IST -    [Time shift for this packet: 0.000000000 seconds] -    Epoch Time: 1572709675.556150846 seconds -    [Time delta from previous captured frame: 0.000000000 seconds] -    [Time delta from previous displayed frame: 0.000000000 seconds] -    [Time since reference or first frame: 0.000000000 seconds] -    Frame Number: 1 -    Frame Length: 98 bytes (784 bits) -    Capture Length: 98 bytes (784 bits) -    [Frame is marked: False] -    [Frame is ignored: False] -    [Protocols in frame: eth:ethertype:ip:icmp:data] -Ethernet II, Src: IntelCor_a0:33:db (48:89:e7:a0:33:db), Dst: Netgear_3f:38:3a (25:c9:8e:3f:38:3a) -    Destination: Netgear_3f:38:3a (25:c9:8e:3f:38:3a) -        Address: Netgear_3f:38:3a (25:c9:8e:3f:38:3a) -        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default) -        .... ...0 .... .... .... .... = IG bit: Individual address (unicast) -    Source: IntelCor_a0:33:db (48:89:e7:a0:33:db) -        Address: IntelCor_a0:33:db (48:89:e7:a0:33:db) -        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default) -        .... ...0 .... .... .... .... = IG bit: Individual address (unicast) -    Type: IPv4 (0x0800) -Internet Protocol Version 4, Src: 192.168.1.9, Dst: 54.204.39.132 -    0100 .... = Version: 4 -    .... 0101 = Header Length: 20 bytes (5) -    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) -        0000 00.. = Differentiated Services Codepoint: Default (0) -        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0) -    Total Length: 84 -    Identification: 0x8f68 (36712) -    Flags: 0x4000, Don't fragment -        0... .... .... .... = Reserved bit: Not set -        .1.. .... .... .... = Don't fragment: Set -        ..0. .... .... .... = More fragments: Not set -        ...0 0000 0000 0000 = Fragment offset: 0 -    Time to live: 64 -    Protocol: ICMP (1) -    Header checksum: 0x8b3f [validation disabled] -    [Header checksum status: Unverified] -    Source: 192.168.1.9 -    Destination: 54.204.39.132 -Internet Control Message Protocol -    Type: 8 (Echo (ping) request) -    Code: 0 -    Checksum: 0xcfc5 [correct] -    [Checksum Status: Good] -    Identifier (BE): 7399 (0x1ce7) -    Identifier (LE): 59164 (0xe71c) -    Sequence number (BE): 1 (0x0001) -    Sequence number (LE): 256 (0x0100) -    Timestamp from icmp data: Nov  2, 2019 21:17:55.000000000 IST -    [Timestamp from icmp data (relative): 0.556150846 seconds] -    Data (48 bytes) - -0000  5b 7c 08 00 00 00 00 00 10 11 12 13 14 15 16 17   [|.............. -0010  18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27   ........ !"#$%&' -0020  28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37   ()*+,-./01234567 -        Data: 5b7c080000000000101112131415161718191a1b1c1d1e1f… -        [Length: 48] - -1 packet captured -[gaurav@testbox ~] -``` - -Similarly, run the following **nslookup** command and, on the side, dump the entire packet via TShark: - - -``` -[gaurav@testbox ~]$ nslookup opensource.com -Server:         1.1.1.1 -Address:        1.1.1.1#53 - -Non-authoritative answer: -Name:   opensource.com -Address: 54.204.39.132 - -[gaurav@testbox ~]$ -``` - -Here is how the packet looks when you do a DNS lookup—notice the UDP protocol is being used: - - -``` -[gaurav@testbox ~]$ sudo tshark -i wlp61s0 -c 1 -V host 1.1.1.1 -Running as user "root" and group "root". This could be dangerous. -Capturing on 'wlp61s0' -Frame 1: 88 bytes on wire (704 bits), 88 bytes captured (704 bits) on interface 0 -    Interface id: 0 (wlp61s0) -        Interface name: wlp61s0 -    Encapsulation type: Ethernet (1) -    Arrival Time: Nov  2, 2019 21:19:32.161216715 IST -    [Time shift for this packet: 0.000000000 seconds] -    Epoch Time: 1572709772.161216715 seconds -    [Time delta from previous captured frame: 0.000000000 seconds] -    [Time delta from previous displayed frame: 0.000000000 seconds] -    [Time since reference or first frame: 0.000000000 seconds] -    Frame Number: 1 -    Frame Length: 88 bytes (704 bits) -    Capture Length: 88 bytes (704 bits) -    [Frame is marked: False] -    [Frame is ignored: False] -    [Protocols in frame: eth:ethertype:ip:udp:dns] -Ethernet II, Src: IntelCor_a0:33:db (48:89:e7:a0:33:db), Dst: Netgear_3f:38:3a (25:c9:8e:3f:38:3a) -    Destination: Netgear_3f:38:3a (25:c9:8e:3f:38:3a) -        Address: Netgear_3f:38:3a (25:c9:8e:3f:38:3a) -        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default) -        .... ...0 .... .... .... .... = IG bit: Individual address (unicast) -    Source: IntelCor_a0:33:db (48:89:e7:a0:33:db) -        Address: IntelCor_a0:33:db (48:89:e7:a0:33:db) -        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default) -        .... ...0 .... .... .... .... = IG bit: Individual address (unicast) -    Type: IPv4 (0x0800) -Internet Protocol Version 4, Src: 192.168.1.9, Dst: 1.1.1.1 -    0100 .... = Version: 4 -    .... 0101 = Header Length: 20 bytes (5) -    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) -        0000 00.. = Differentiated Services Codepoint: Default (0) -        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0) -    Total Length: 74 -    Identification: 0x907d (36989) -    Flags: 0x4000, Don't fragment -        0... .... .... .... = Reserved bit: Not set -        .1.. .... .... .... = Don't fragment: Set -        ..0. .... .... .... = More fragments: Not set -        ...0 0000 0000 0000 = Fragment offset: 0 -    Time to live: 64 -    Protocol: UDP (17) -    Header checksum: 0xe672 [validation disabled] -    [Header checksum status: Unverified] -    Source: 192.168.1.9 -    Destination: 1.1.1.1 -User Datagram Protocol, Src Port: 60656, Dst Port: 53 -    Source Port: 60656 -    Destination Port: 53 -    Length: 54 -    Checksum: 0x2fd2 [unverified] -    [Checksum Status: Unverified] -    [Stream index: 0] -    [Timestamps] -        [Time since first frame: 0.000000000 seconds] -        [Time since previous frame: 0.000000000 seconds] -Domain Name System (query) -    Transaction ID: 0x303c -    Flags: 0x0100 Standard query -        0... .... .... .... = Response: Message is a query -        .000 0... .... .... = Opcode: Standard query (0) -        .... ..0. .... .... = Truncated: Message is not truncated -        .... ...1 .... .... = Recursion desired: Do query recursively -        .... .... .0.. .... = Z: reserved (0) -        .... .... ...0 .... = Non-authenticated data: Unacceptable -    Questions: 1 -    Answer RRs: 0 -    Authority RRs: 0 -    Additional RRs: 0 -    Queries -        clock01.util.phx2.redhat.com: type A, class IN -            Name: clock01.util.phx2.redhat.com -            [Name Length: 28] -            [Label Count: 5] -            Type: A (Host Address) (1) -            Class: IN (0x0001) - -1 packet captured -[gaurav@testbox ~]$ -``` - -### Next steps - -Once you are comfortable with these basics of packet capturing and analysis, you can utilize TShark's various capture and display filters when working on more advanced use cases. Refer to the online documentation for more information on these filters. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/1/wireshark-linux-tshark - -作者:[Gaurav Kamathe][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/gkamathe -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/connections_wires_sysadmin_cable.png?itok=d5WqHmnJ (Multi-colored and directional network computer cables) -[2]: https://www.wireshark.org/ -[3]: https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html -[4]: https://www.wireshark.org/docs/man-pages/tshark.html -[5]: https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol -[6]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment -[7]: http://www.opensource.com -[8]: http://www.opensource.com)|54.204.39.132|:443 -[9]: https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake diff --git a/sources/tech/20200121 Ansible Automation Tool Installation, Configuration and Quick Start Guide.md b/sources/tech/20200121 Ansible Automation Tool Installation, Configuration and Quick Start Guide.md deleted file mode 100644 index 76cf181ff2..0000000000 --- a/sources/tech/20200121 Ansible Automation Tool Installation, Configuration and Quick Start Guide.md +++ /dev/null @@ -1,360 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Ansible Automation Tool Installation, Configuration and Quick Start Guide) -[#]: via: (https://www.2daygeek.com/install-configure-ansible-automation-tool-linux-quick-start-guide/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -Ansible Automation Tool Installation, Configuration and Quick Start Guide -====== - -There are many automation tools on the market. - -I can name a few of them, and they are widely used by many organizations, such as Puppet, Chef, CFEngine, Foreman, Katello, Saltstock, Space Walk. - -### What Automation Tool Does? - -Automation tools make the life of a Linux administrator much easier by automating routine tasks without human intervention. - -These tools allow users to perform configuration management, application deployment and provisioning. - -### Why do you like Ansible? - -Ansible is an agent-less automation tool that uses SSH to perform all tasks, but others require agents on client nodes. - -### What is Ansible? - -Ansible is an open source, easy-to-use, powerful IT automation tool that performs tasks on client nodes over SSH. - -It is built in Python and is one of the most popular and robust programming languages in the world today’s. - -The Python package is required on both ends to perform all the modules. - -It can configure systems, deploy software, and schedule advanced IT tasks such as continuous deployment or zero downtime rolling updates. - -You can easily perform any kind of automation tasks with simple and complex tasks through Ansible. - -Before you get started, you need to understand some of the Ansible terminology that helps you to make a task easier. - -### How Ansible Works? - -Ansible works by pushing small programs known as ansible modules on the client nodes, and these modules are temporarily stored in the client nodes, which are used to communicate with the Ansible server via a JSON protocol. - -Ansible runs these modules via SSH and remove them when finished. - -Modules are nothing but scripts written in Python, Perl, etc,. - -![][1] - -The control node, which controls the entire functionality of the playbook, including client nodes (hosts). - - * **Control node:** The host you use Ansible to execute tasks on managed nodes. You can have multiple control nodes, but you cannot use a Windows machine as a control node. - * **Managed nodes:** List of hosts configured by the control node - * **Inventory:** A list of hosts managed by the control nodes, these nodes are configured in the **“/etc/ansible/hosts”** file. It contains information about each node, such as an IP address or its hostname, and these nodes can be grouped as needed. - * **Modules:** Each module is used to perform a specific task, which currently supports 3387 modules. - * **ad-hoc:** It allows you to run one task at a time (it uses the **/usr/bin/ansible** binary). - * **Tasks:** There is a list of tasks in each play. Tasks are executed in order, one at a time in the managed nodes. - * **Playbooks:** You can perform multiple tasks simultaneously using playbooks, whereas you can only perform one task using an ad-hoc command. Playbooks are written in YAML and are easy to read (which uses the **/usr/bin/ansible-playbook** binary). In the future we will create an article about playbooks that you can use to perform complex tasks. - - - -### Testing Environment: - -This environment contains one control node (**server.2g.lab**) and three managed nodes (**node1.2g.lab, node2.2g.lab, node3.2g.lab**), all running in the virtual environment with the following operating systems. - -``` -+----------------------+---------------+-------------+---------------+ -| System Purpose | Hostname | IP Address | OS | -+----------------------+---------------+-------------+---------------+ -|Ansible Control Node | server.2g.lab | 192.168.1.7 | Manjaro 18 | -|Managed Node1 | node1.2g.lab | 192.168.1.6 | CentOS7 | -|Managed Node2 | node2.2g.lab | 192.168.1.5 | CentOS8 | -|Managed Node3 | node3.2g.lab | 192.168.1.9 | Ubuntu 18.04 | -|User: daygeek | -+--------------------------------------------------------------------+ -``` - -### Prerequisites: - - * Enable password-less authentication between Ansible control node and managed nodes. - * The control node must be Python 2 (version 2.7) or Python 3 (versions 3.5 and higher). - * The managed node must be Python 2 (version 2.6 or later) or Python 3 (version 3.5 or later). - * If you have SELinux enabled on remote nodes, you will also want to install **libselinux-python** on them before using any copy/file/template related functions in Ansible. - - - -### How to Install the Ansible on Control Node - -The Ansible package is available in the distribution official repository, so you can easily install it. - -For **“Fedora/RHEL 8/CentOS 8”** system, use the **[DNF Command][2]** to install ansible. - -Make a note: You need to enable the **[EPEL repository][3]** on RHEL/CentOS systems because the Ansible package is not available in the distribution official repository. - -``` -$ sudo dnf install ansible -``` - -For **“Debian/Ubuntu”** systems, use **[APT-GET Command][4]** or **[APT Command][5]** to install ansible. - -Configure the blow PPA to install the latest stable version of ansible on Ubuntu. - -``` -$ sudo apt update -$ sudo apt install software-properties-common -$ sudo apt-add-repository --yes --update ppa:ansible/ansible -$ sudo apt install ansible -``` - -For Debian system, configure the blow source list: - -``` -$ echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main" | sudo tee -a /etc/apt/sources.list.d/ansible.list -$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367 -$ sudo apt update -$ sudo apt install ansible -``` - -For **“Arch Linux”** based systems, use **[Pacman Command][6]** to install ansible. - -``` -$ sudo pacman -S ansible -``` - -For **“RHEL/CentOS”** systems, use **[YUM Command][7]** to install ansible. - -``` -$ sudo yum install ansible -``` - -For **“openSUSE”** system, use **[Zypper Command][8]** to install ansible. - -``` -$ sudo zypper install ansible -``` - -Alternatively, you can install it using the **[PIP Python package manager][9]** - -``` -$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py -$ sudo python get-pip.py -$ sudo pip install ansible -``` - -Check the version of Ansible installed on the control node as follows: - -``` -$ ansible --version - -ansible 2.9.2 - config file = /etc/ansible/ansible.cfg - configured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] - ansible python module location = /usr/lib/python3.8/site-packages/ansible - executable location = /usr/bin/ansible - python version = 3.8.1 (default, Jan 8 2020, 23:09:20) [GCC 9.2.0] -``` - -### How to Install Python Package on Managed Nodes - -Use the following command to install the python package on managed nodes. - -``` -$ sudo yum install -y python -$ sudo dnf install -y python -$ sudo zypper install -y python -$ sudo pacman -S python -$ sudo apt install -y python -``` - -### How to Setup SSH key authentication (Password-less Authentication) on Linux - -Use the following command to create an ssh key, and then copy them to remote machines. - -``` -$ ssh-keygen -$ ssh-copy-id [email protected] -$ ssh-copy-id [email protected] -$ ssh-copy-id [email protected] -``` - -Refer the following article to **[setup SSH key authentication (Password-less Authentication) on Linux][10]** - -### How to Create Ansible Inventory - -Add the list of nodes you want to manage in the **“/etc/ansible/hosts”** file. If you do not find an existing one you can create a new file. This is a sample inventory file for my test environment. - -``` -$ sudo vi /etc/ansible/hosts - -[web] -node1.2g.lab -node2.2g.lab - -[app] -node3.2g.lab -``` - -Let’s see if we can find all hosts using the following command. - -``` -$ ansible all --list-hosts - - hosts (3): - node1.2g.lab - node2.2g.lab - node3.2g.lab -``` - -Run the below command for individual groups. - -``` -$ ansible web --list-hosts - - hosts (2): - node1.2g.lab - node2.2g.lab -``` - -### How to Perform a Task Using the ad-hoc Command - -Once the host inventory validation check is done, you are ready to drive a car. Here you go..! - -**Syntax:** - -``` -ansible [pattern] -m [module] -a "[module options]" - -Details: -======== -ansible: A command -pattern: Enter the entire inventory or a specific group --m [module]: Run the given module name --a [module options]: Specify the module arguments -``` - -Use the Ping module to ping all nodes in your inventory: - -``` -$ ansible all -m ping - -node3.2g.lab | SUCCESS => { - "ansible_facts": { - "discovered_interpreter_python": "/usr/bin/python" - }, - "changed": false, - "ping": "pong" -} -node1.2g.lab | SUCCESS => { - "ansible_facts": { - "discovered_interpreter_python": "/usr/bin/python" - }, - "changed": false, - "ping": "pong" -} -node2.2g.lab | SUCCESS => { - "ansible_facts": { - "discovered_interpreter_python": "/usr/libexec/platform-python" - }, - "changed": false, - "ping": "pong" -} -``` - -All systems have given a successful result, nothing has changed, and return `pong’ on success. - -You can get a list of available modules using the following command. - -``` -$ ansible-doc -l -``` - -Currently supports 3387 built-in modules, which will grow with each Ansible release: - -``` -$ ansible-doc -l | wc -l -3387 -``` - -Use the command module to execute commands against all nodes in your inventory: - -``` -$ ansible all -m command -a "uptime" - -node3.2g.lab | CHANGED | rc=0 >> - 18:05:07 up 1:21, 3 users, load average: 0.12, 0.06, 0.01 -node1.2g.lab | CHANGED | rc=0 >> - 06:35:06 up 1:21, 4 users, load average: 0.01, 0.03, 0.05 -node2.2g.lab | CHANGED | rc=0 >> - 18:05:07 up 1:25, 3 users, load average: 0.01, 0.01, 0.00 -``` - -Execute the command module for a specific group. - -To check the memory usage for the **“app”** group. - -``` -$ ansible app -m command -a "free -m" - -node3.2g.lab | CHANGED | rc=0 >> - total used free shared buff/cache available -Mem: 1993 1065 91 6 836 748 -Swap: 1425 0 1424 -``` - -To run the hostnamectl command against the **“web”** group, use the following format. - -``` -$ ansible web -m command -a "hostnamectl" - -node1.2g.lab | CHANGED | rc=0 >> - Static hostname: CentOS7.2daygeek.com - Icon name: computer-vm - Chassis: vm - Machine ID: 002f47b82af248f5be1d67b67e03514c - Boot ID: dc38f9b8089d4b2d9304e526e00c6a8f - Virtualization: kvm - Operating System: CentOS Linux 7 (Core) - CPE OS Name: cpe:/o:centos:centos:7 - Kernel: Linux 3.10.0-957.el7.x86_64 - Architecture: x86-64 -node2.2g.lab | CHANGED | rc=0 >> - Static hostname: node2.2g.lab - Icon name: computer-vm - Chassis: vm - Machine ID: e39e3a27005d44d8bcbfcab201480b45 - Boot ID: 27b46a09dde546da95ace03420fe12cb - Virtualization: oracle - Operating System: CentOS Linux 8 (Core) - CPE OS Name: cpe:/o:centos:centos:8 - Kernel: Linux 4.18.0-80.el8.x86_64 - Architecture: x86-64 -``` - -**Reference:** [Ansible Docs][11] - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/install-configure-ansible-automation-tool-linux-quick-start-guide/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[2]: https://www.2daygeek.com/linux-dnf-command-examples-manage-packages-fedora-centos-rhel-systems/ -[3]: https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-oracle-linux/ -[4]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/ -[5]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/ -[6]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/ -[7]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/ -[8]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/ -[9]: https://www.2daygeek.com/install-pip-manage-python-packages-linux/ -[10]: https://www.2daygeek.com/configure-setup-passwordless-ssh-key-based-authentication-linux/ -[11]: https://docs.ansible.com/ansible/latest/user_guide/index.html diff --git a/sources/tech/20200122 9 favorite open source tools for Node.js developers.md b/sources/tech/20200122 9 favorite open source tools for Node.js developers.md deleted file mode 100644 index 7885b9f642..0000000000 --- a/sources/tech/20200122 9 favorite open source tools for Node.js developers.md +++ /dev/null @@ -1,249 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (9 favorite open source tools for Node.js developers) -[#]: via: (https://opensource.com/article/20/1/open-source-tools-nodejs) -[#]: author: (Hiren Dhadhuk https://opensource.com/users/hirendhadhuk) - -9 favorite open source tools for Node.js developers -====== -Of the wide range of tools available to simplify Node.js development, -here are the 10 best. -![Tools illustration][1] - -I recently read a survey on [StackOverflow][2] that said more than 49% of developers use Node.js for their projects. This came as no surprise to me. - -As an avid user of technology, I think it's safe to say that the introduction of Node.js led to a new era of software development. It is now one of the most preferred technologies for software development, right next to JavaScript. - -### What is Node.js, and why is it so popular? - -Node.js is a cross-platform, open source runtime environment for executing JavaScript code outside of the browser. It is also a preferred runtime environment built on Chrome's JavaScript runtime and is mainly used for building fast, scalable, and efficient network applications. - -I remember when we used to sit for hours and hours coordinating between front-end and back-end developers who were writing different scripts for each side. All of this changed as soon as Node.js came into the picture. I believe that the one thing that drives developers towards this technology is its two-way efficiency. - -With Node.js, you can run your code simultaneously on both the client and the server side, speeding up the whole process of development. Node.js bridges the gap between front-end and back-end development and makes the development process much more efficient. - -### A wave of Node.js tools - -For 49% of all developers (including me), Node.js is at the top of the pyramid when it comes to front-end and back-end development. There are tons of [Node.js use cases][3] that have helped me and my team deliver complex projects within our deadlines. Fortunately, Node.js' rising popularity has also produced a wave of open source projects and tools to help developers working with the environment. - -Recently, there has been a sudden increase in demand for projects built with Node.js. Sometimes, I find it quite challenging to manage these projects and keep up the pace while delivering high-quality results. So I decided to automate certain aspects of development using some of the most efficient of the many open source tools available for Node.js developers. - -In my extensive experience with Node.js, I've worked with a wide range of tools that have helped me with the overall development process—from streamlining the coding process to monitoring to content management. - -To help my fellow Node.js developers, I compiled this list of 9 of my favorite open source tools for simplifying Node.js development. - -### Webpack - -[Webpack][4] is a handy JavaScript module bundler used to simplify front-end development. It detects modules with dependencies and transforms them into static assets that represent the modules. - -You can install the tool through either the npm or Yarn package manager. - -With npm: - - -``` -`npm install --save-dev webpack` -``` - -With Yarn: - - -``` -`yarn add webpack --dev` -``` - -Webpack creates single bundles or multiple chains of assets that can be loaded asynchronously at runtime. Each asset does not have to be loaded individually. Bundling and serving assets becomes quick and efficient with the Webpack tool, making the overall user experience better and reducing the developer's hassle in managing load time. - -### Strapi - -[Strapi][5] is an open source headless content management system (CMS). A headless CMS is basically software that lets you manage your content devoid of a prebuilt frontend. It is a backend-only system that functions using RESTful APIs. - -You can install Strapi through Yarn or npx packages. - -With Yarn: - - -``` -`yarn create strapi-app my-project --quickstart` -``` - -With npx: - - -``` -`npx create-strapi-app my-project --quickstart` -``` - -Strapi's goal is to fetch and deliver your content in a structured manner across any device. The CMS makes it easy to manage your applications' content and make sure they are dynamic and accessible across any device. - -It provides a lot of features, including file upload, a built-in email system, JSON Web Token (JWT) authentication, and auto-generated documentation. I find it very convenient, as it simplifies the overall CMS and gives me full autonomy in editing, creating, or deleting all types of contents. - -In addition, the content structure built through Strapi is extremely flexible because you can create and reuse groups of content and customizable APIs. - -### Broccoli - -[Broccoli][6] is a powerful build tool that runs on an [ES6][7] module. Build tools are software that let you assemble all the different assets within your application or website, e.g., images, CSS, JavaScript, etc., into one distributable format. Broccoli brands itself as the "asset pipeline for ambitious applications." - -You need a project directory to work with Broccoli. Once you have the project directory in place, you can install Broccoli with npm using: - - -``` -npm install --save-dev broccoli -npm install --global broccoli-cli -``` - -You can also use Yarn for installation.  - -The current version of Node.js would be the best version for the tool as it provides long-time support. This helps you avoid the hassle of updating and reinstalling as you go. Once the installation process is completed, you can include the build specification in your Brocfile.js. - -In Broccoli, the unit of abstraction is a tree, which stores files and subdirectories within specific subdirectories. Therefore, before you build, you must have a specific idea of what you want your build to look like. - -The best part about Broccoli is that it comes with a built-in server for development that lets you host your assets on a local HTTP server. Broccoli is great for streamlined rebuilds, as its concise architecture and flexible ecosystem boost rebuild and compilation speeds. Broccoli lets you get organized to save time and maximize productivity during development. - -### Danger - -[Danger][8] is a very handy open source tool for streamlining your pull request (PR) checks. As Danger's library description says, the tool helps you "formalize" your code review system by managing PR checks. Danger integrates with your CI and helps you speed up the review process. - -Integrating Danger with your project is an easy step-by-step process—you just need to include the Danger module and create a Danger file for each project. However, it's more convenient to create a Danger account (easy to do through GitHub or Bitbucket), then set up access tokens for your open source software projects. - -Danger can be installed via NPM or Yarn. To use Yarn, add danger -D to add it to your package.JSON. - -After you add Danger to your CI, you can: - - * Highlight build artifacts of importance - * Manage sprints by enforcing links to tools like Trello and Jira - * Enforce changelogs - * Utilize descriptive labels - * And much more - - - -For example, you can design a system that defines the team culture and sets out specific rules for code review and PR checks. Common issues can be solved based on the metadata Danger provides along with its extensive plugin ecosystem. - -### Snyk - -Cybersecurity is a major concern for developers. [Snyk][9] is one of the most well-known tools to fix vulnerabilities in open source components. It started as a project to fix vulnerabilities in Node.js projects and has evolved to detect and fix vulnerabilities in Ruby, Java, Python, and Scala apps as well. Snyk mainly runs in four stages: - - * Finding vulnerability dependencies - * Fixing specific vulnerabilities - * Preventing security risks by PR checks - * Monitoring apps continuously - - - -Snyk can be integrated with your project at any stage, including coding, CI/CD, and reporting. I find it extremely helpful for testing Node.js projects to test out npm packages for security risks or at build-time. You can also run PR checks for your applications in GitHub to make your projects more secure. Synx also provides a range of integrations that you can use to monitor dependencies and fix specific problems. - -To run Snyk on your machine locally, you can install it through NPM: - - -``` -`npm install -g snyk` -``` - -### Migrat - -[Migrat][10] is an extremely easy to use data-migration tool that uses plain text. It works across a diverse range of stacks and processes that make it even more convenient. You can install Migrat with a simple line of code: - - -``` -`$ npm install -g migrat` -``` - -Migrat is not specific to a particular database engine. It supports multi-node environments, as migrations can run on one node globally or once per server. What makes Migrat convenient is the facilitation of passing context to each migration. - -You can define what each migration is for (e.g.,. database sets, connections, logging interfaces, etc.). Moreover, to avoid haphazard migrations, where multiple servers are running migrations globally, Migrat facilitates global lockdown while the process is running so that it can run only once globally. It also comes with a range of plug-ins for SQL databases, Slack, HipChat, and the Datadog dashboard. You can send live migrations to any of these platforms. - -### Clinic.js - -[Clinic.js][11] is an open source monitoring tool for Node.js projects. It combines three different tools—Doctor, Bubbleprof, and Flame—that help you monitor, detect, and solve performance issues with Node.js. - -You can install Clinic.js from npm by running this command: - - -``` -`$ npm install clinic` -``` - -You can choose which of the three tools that comprise Clinic.js you want to use based on which aspect of your project you want to monitor and the report you want to generate: - - * Doctor provides detailed metrics by injecting probes and provides recommendations on the overall health of your project. - * Bubbleprof is great for profiling and generates metrics using async_hooks. - * Flame is great for uncovering hot paths and bottlenecks in your code. - - - -### PM2 - -Monitoring is one of the most important aspects of any backend development process. [PM2][12] is a process management tool for Node.js that helps developers monitor multiple aspects of their projects such as logs, delays, and speed. The tool is compatible with Linux, MacOS, and Windows and supports all Node.js versions starting from Node.js 8.X. - -You can install PM2 with npm using: - - -``` -`$ npm install pm2 --g` -``` - -If you do not already have Node.js installed, you can use: - - -``` -`wget -qO- https://getpm2.com/install.sh | bash` -``` - -Once it's installed, start the application with: - - -``` -`$ pm2 start app.js` -``` - -The best part about PM2 is that it lets you run your apps in cluster mode. You can spawn a process for multiple CPU cores at a time. This makes it easy to enhance application performance and maximize reliability. PM2 is also great for updates, as you can update your apps and reload them with zero downtime using the "hot reload" option. Overall, it's a great tool to simplify process management for Node.js applications. - -### Electrode - -[Electrode][13] is an open source application platform from Walmart Labs. The platform helps you build large-scale, universal React/Node.js applications in a structured manner. - -The Electrode app generator lets you build a flexible core focused on the code, provides some great modules to add complex features to the app, and comes with a wide range of tools to optimize your app's Node.js bundle. - -Electrode can be installed using npm. Once the installation is finished, you can start the app using Ignite and dive right in with the Electrode app generator. - -You can install Electrode using NPM: - - -``` -`npm install -g electrode-ignite xclap-cli` -``` - -### Which are your favorite? - -These are just a few of the always-growing list of open source tools that can come in handy at different stages when working with Node.js. Which are your go-to open source Node.js tools? Please share your recommendations in the comments. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/1/open-source-tools-nodejs - -作者:[Hiren Dhadhuk][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/hirendhadhuk -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_hardware_purple.png?itok=3NdVoYhl (Tools illustration) -[2]: https://insights.stackoverflow.com/survey/2019#technology-_-other-frameworks-libraries-and-tools -[3]: https://www.simform.com/nodejs-use-case/ -[4]: https://webpack.js.org/ -[5]: https://strapi.io/ -[6]: https://broccoli.build/ -[7]: https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-_ECMAScript_2015 -[8]: https://danger.systems/ -[9]: https://snyk.io/ -[10]: https://github.com/naturalatlas/migrat -[11]: https://clinicjs.org/ -[12]: https://pm2.keymetrics.io/ -[13]: https://www.electrode.io/ diff --git a/sources/tech/20200124 Ansible Ad-hoc Command Quick Start Guide with Examples.md b/sources/tech/20200124 Ansible Ad-hoc Command Quick Start Guide with Examples.md deleted file mode 100644 index cb4783b6ab..0000000000 --- a/sources/tech/20200124 Ansible Ad-hoc Command Quick Start Guide with Examples.md +++ /dev/null @@ -1,313 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Ansible Ad-hoc Command Quick Start Guide with Examples) -[#]: via: (https://www.2daygeek.com/ansible-ad-hoc-command-quick-start-guide-with-examples/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -Ansible Ad-hoc Command Quick Start Guide with Examples -====== - -Recently, we have written an article about the **[Ansible installation and configuration][1]**. - -Only a few examples of how to use it are included in that tutorial. - -If you are new to Ansible, I suggest you read the Installation and Configuration section by pressing the URL above. - -Once you’re good in that area, go ahead and play with this article. - -By default, Ansible uses only 5 parallel processes. If you want to perform a task on multiple hosts, you need to manually set the value of the fork count by adding **“-f [fork count]”**. - -### What is ad-hoc Command - -The ad-hoc command is used to automate a task on one or more managed nodes. Ad-hoc commands are very simple, but they are not re-usable. It uses the **“/usr/bin/ansible”** binary to perform all actions. - -Ad-hoc commands are best for tasks you run once. For example, if you want to check whether a given user is available or not, you can use the Ansible Quick One liner without writing a playbook. - -### Why Would You Like to Know About ad-hoc Commands? - -Ad-hoc commands prove the simplicity and power of the Ansible. It currently supports 3389 modules as of version 2.9, so you need to understand and learn the list of Ansible modules you want to use regularly. - -If you are new to Ansible, you can easily practice those modules and their arguments with the help of ad-hoc command. - -The concepts you learn here will port over directly to the playbook language. - -**General Syntax of ad-hoc command:** - -``` -ansible | [pattern] | -m [module] | -a "[module options]" - A | B | C | D -``` - -The ad-hoc command comes with four parts and the details are below. - -``` -+-----------------+--------------------------------------------------+ -| Details | Description | -+-----------------+--------------------------------------------------+ -|ansible | A command | -|pattern | Input the entire inventory or a specific group | -|module | Run the given module name | -|module options | Specify the module arguments | -+-----------------+--------------------------------------------------+ -``` - -### How To Use Ansible Inventory File - -If you use the default inventory file of Ansible **“/etc/ansible/hosts”**, you can call it directly. - -If not, the entire path of the Ansible Inventory file should be called with the **“-i”** option. - -### What’s Pattern and How to Use it? - -An Ansible pattern can refer to a single host, IP address, an inventory group, a set of groups, or all hosts in your inventory. - -It allows you to run commands and playbooks against them. Patterns are very flexible and you can use them according to your needs. - -For example, you can exclude hosts, use wildcards or regular expressions, and more. - -The table below describes common patterns and their use. But if it doesn’t meet your needs, you can use variables in patterns with the **“-e”** argument in the ansible-playbook. - -``` -+-----------------------+------------------------------+-----------------------------------------------------+ -| Description | Pattern(s) | Targets | -+-----------------------+------------------------------+-----------------------------------------------------+ -|All hosts | all (or *) | Run an Ansible against all servers in your inventory| -|One host | host1 | Run an Ansible against only the given host. | -|Multiple hosts | host1:host2 (or host1,host2) | Run an Ansible against the mentioned multiple hosts | -|One group | webservers | Run an Ansible against the webservers group | -|Multiple groups | webservers:dbservers | all hosts in webservers plus all hosts in dbservers | -|Excluding groups | webservers:!atlanta | all hosts in webservers except those in atlanta | -|Intersection of groups | webservers:&staging | any hosts in webservers that are also in staging | -+-----------------------+------------------------------+-----------------------------------------------------+ -``` - -### What is Ansible Modules and What it Does? - -Modules (also referred to as “task plugins” or “library plugins”) are units of code that can be used to perform a specific task directly on remote hosts or through Playbooks. - -Ansible executes the given module on the remote target node and collects the return values. - -Each module supports multiple arguments, allowing it to meet the user’s needs. Almost all modules take **“key=value”** arguments except few. - -You can add multiple arguments with the space at once, and the command/shell modules directly take the string of the command you want to run. - -We will add a table with the most frequently used **“module options”** arguments. - -To list all available modules, run the command below. - -``` -$ ansible-doc -l -``` - -Run the command below to read the documentation for the given module - -``` -$ ansible-doc [Module] -``` - -### 1) How to List the Contents of a Directory Using Ansible on Linux - -This can be done using the Ansible command module as follows. We have listed the contents of the **“daygeek”** user’s home directory on the **“node1.2g.lab”** and **“node2.2g.lab”** remote server. - -``` -$ ansible web -m command -a "ls -lh /home/daygeek" - -node1.2g.lab | CHANGED | rc=0 >> -total 12K -drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Desktop -drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Documents -drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Downloads -drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Music --rwxr-xr-x. 1 daygeek daygeek 159 Mar 4 2019 passwd-up.sh -drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Pictures -drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Public -drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Templates --rwxrwxr-x. 1 daygeek daygeek 138 Mar 10 2019 user-add.sh --rw-rw-r--. 1 daygeek daygeek 18 Mar 10 2019 user-list1.txt -drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Videos - -node2.2g.lab | CHANGED | rc=0 >> -total 0 -drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Desktop -drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Documents -drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Downloads -drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Music -drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Pictures -drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Public -drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Templates -drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Videos -``` - -### 2) How to Manage Files Using Ansible on Linux - -Ansible “copy module” copies a file from a local system to a remote system. Use the Ansible command module to move or copy files to a remote machine. - -``` -$ ansible web -m copy -a "src=/home/daygeek/backup/CentOS7.2daygeek.com-20191025.tar dest=/home/u1" --become - -node1.2g.lab | CHANGED => { - "ansible_facts": { - "discovered_interpreter_python": "/usr/bin/python" - }, - "changed": true, - "checksum": "ad8aadc0542028676b5fe34c94347829f0485a8c", - "dest": "/home/u1/CentOS7.2daygeek.com-20191025.tar", - "gid": 0, - "group": "root", - "md5sum": "ee8e778646e00456a4cedd5fd6458cf5", - "mode": "0644", - "owner": "root", - "secontext": "unconfined_u:object_r:user_home_t:s0", - "size": 30720, - "src": "/home/daygeek/.ansible/tmp/ansible-tmp-1579726582.474042-118186643704900/source", - "state": "file", - "uid": 0 -} - -node2.2g.lab | CHANGED => { - "ansible_facts": { - "discovered_interpreter_python": "/usr/libexec/platform-python" - }, - "changed": true, - "checksum": "ad8aadc0542028676b5fe34c94347829f0485a8c", - "dest": "/home/u1/CentOS7.2daygeek.com-20191025.tar", - "gid": 0, - "group": "root", - "md5sum": "ee8e778646e00456a4cedd5fd6458cf5", - "mode": "0644", - "owner": "root", - "secontext": "unconfined_u:object_r:user_home_t:s0", - "size": 30720, - "src": "/home/daygeek/.ansible/tmp/ansible-tmp-1579726582.4793239-237229399335623/source", - "state": "file", - "uid": 0 -} -``` - -We can verify it by running the command below. - -``` -$ ansible web -m command -a "ls -lh /home/u1" --become - -node1.2g.lab | CHANGED | rc=0 >> -total 36K --rw-r--r--. 1 root root 30K Jan 22 14:56 CentOS7.2daygeek.com-20191025.tar --rw-r--r--. 1 root root 25 Dec 9 03:31 user-add.sh - -node2.2g.lab | CHANGED | rc=0 >> -total 36K --rw-r--r--. 1 root root 30K Jan 23 02:26 CentOS7.2daygeek.com-20191025.tar --rw-rw-r--. 1 u1 u1 18 Jan 23 02:21 magi.txt -``` - -To copy a file from one location to another on the remote machine, use the following command. - -``` -$ ansible web -m command -a "cp /home/u2/magi/ansible-1.txt /home/u2/magi/2g" --become -``` - -To move a file, use the following command. - -``` -$ ansible web -m command -a "mv /home/u2/magi/ansible.txt /home/u2/magi/2g" --become -``` - -To create a new file named **“ansible.txt”** under **“u1”** user, run the following command. - -``` -$ ansible web -m file -a "dest=/home/u1/ansible.txt owner=u1 group=u1 state=touch" --become -``` - -To create a new directory named **“magi”** under the **“u1”** user, run the following command. **_“**The file module can also create directories as follows**_“**. - -``` -$ ansible web -m file -a "dest=/home/u1/magi mode=755 owner=u2 group=u2 state=directory" --become -``` - -To change the permission of the **“ansible.txt”** file to **“777”** under **“u1”** user, run the following command. - -``` -$ ansible web -m file -a "dest=/home/u1/ansible.txt mode=777" --become -``` - -To delete the “ansible.txt” file under “u1” user, run the following command. - -``` -$ ansible web -m file -a "dest=/home/u2/magi/ansible-1.txt state=absent" --become -``` - -Use the following command to delete a directory and it will delete the given directory recursively. - -``` -$ ansible web -m file -a "dest=/home/u2/magi/2g state=absent" --become -``` - -### 3) User Management - -You can easily perform the user management activity through Ansible, such as user creation, deleting a user, and adding a user to the group. - -``` -$ ansible all -m user -a "name=foo password=[crypted password here]" -``` - -To remove a user, run the following command. - -``` -$ ansible all -m user -a "name=foo state=absent" -``` - -### 4) Managing Package - -Package installation can be easily managed using the appropriate Ansible Package Manager module. For example, we are going to use the yum module to manage packages on the CentOS system. - -To install the latest Apache (httpd) package. - -``` -$ ansible web -m yum -a "name=httpd state=latest" -``` - -To uninstall the Apache (httpd) package. - -``` -$ ansible web -m yum -a "name=httpd state=absent" -``` - -### 5) Managing Service - -Use the following Ansible module command to manage any service on Linux using Ansible - -To stop the httpd service - -``` -$ ansible web -m service -a "name=httpd state=stopped" -``` - -To start the httpd service - -``` -$ ansible web -m service -a "name=httpd state=started" -``` - -To restart the httpd service - -``` -$ ansible web -m service -a "name=httpd state=restarted" -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/ansible-ad-hoc-command-quick-start-guide-with-examples/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/install-configure-ansible-automation-tool-linux-quick-start-guide/ diff --git a/sources/tech/20200127 Managing processes on Linux with kill and killall.md b/sources/tech/20200127 Managing processes on Linux with kill and killall.md deleted file mode 100644 index 339d97f307..0000000000 --- a/sources/tech/20200127 Managing processes on Linux with kill and killall.md +++ /dev/null @@ -1,157 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Managing processes on Linux with kill and killall) -[#]: via: (https://opensource.com/article/20/1/linux-kill-killall) -[#]: author: (Jim Hall https://opensource.com/users/jim-hall) - -Managing processes on Linux with kill and killall -====== -Know how to terminate processes and reclaim system resources with the -ps, kill, and killall commands. -![Penguin with green background][1] - -In Linux, every program and daemon is a "process." Most processes represent a single running program. Other programs can fork off other processes, such as processes to listen for certain things to happen and then respond to them. And each process requires a certain amount of memory and processing power. The more processes you have running, the more memory and CPU cycles you'll need. On older systems, like my seven-year-old laptop, or smaller computers, like the Raspberry Pi, you can get the most out of your system if you keep an eye on what processes you have running in the background. - -You can get a list of running processes with the **ps** command. You'll usually want to give **ps** some options to show more information in its output. I like to use the **-e** option to see every process running on my system, and the **-f** option to get full details about each process. Here are some examples: - - -``` -$ ps -    PID TTY          TIME CMD -  88000 pts/0    00:00:00 bash -  88052 pts/0    00:00:00 ps -  88053 pts/0    00:00:00 head - -[/code] [code] - -$ ps -e | head -    PID TTY          TIME CMD -      1 ?        00:00:50 systemd -      2 ?        00:00:00 kthreadd -      3 ?        00:00:00 rcu_gp -      4 ?        00:00:00 rcu_par_gp -      6 ?        00:00:02 kworker/0:0H-events_highpri -      9 ?        00:00:00 mm_percpu_wq -     10 ?        00:00:01 ksoftirqd/0 -     11 ?        00:00:12 rcu_sched -     12 ?        00:00:00 migration/0 - -[/code] [code] - -$ ps -ef | head -UID          PID    PPID  C STIME TTY          TIME CMD -root           1       0  0 13:51 ?        00:00:50 /usr/lib/systemd/systemd --switched-root --system --deserialize 36 -root           2       0  0 13:51 ?        00:00:00 [kthreadd] -root           3       2  0 13:51 ?        00:00:00 [rcu_gp] -root           4       2  0 13:51 ?        00:00:00 [rcu_par_gp] -root           6       2  0 13:51 ?        00:00:02 [kworker/0:0H-kblockd] -root           9       2  0 13:51 ?        00:00:00 [mm_percpu_wq] -root          10       2  0 13:51 ?        00:00:01 [ksoftirqd/0] -root          11       2  0 13:51 ?        00:00:12 [rcu_sched] -root          12       2  0 13:51 ?        00:00:00 [migration/0] -``` - -The last example shows the most detail. On each line, the UID (user ID) shows the user that owns the process. The PID (process ID) represents the numerical ID of each process, and PPID (parent process ID) shows the ID of the process that spawned this one. In any Unix system, processes count up from PID 1, the first process to run once the kernel starts up. Here, **systemd** is the first process, which spawned **kthreadd**. And **kthreadd** created other processes including **rcu_gp**, **rcu_par_gp**, and a bunch of other ones. - -### Process management with the kill command - -The system will take care of most background processes on its own, so you don't need to worry about them. You should only have to get involved in managing any processes that you create, usually by running applications. While many applications run one process at a time (think about your music player or terminal emulator or game), other applications might create background processes. Some of these might keep running when you exit the application so they can get back to work quickly the next time you start the application. - -Process management is an issue when I run Chromium, the open source base for Google's Chrome browser. Chromium works my laptop pretty hard and fires off a lot of extra processes. Right now, I can see these Chromium processes running with only five tabs open: - - -``` -$ ps -ef | fgrep chromium -jhall      66221   [...]  /usr/lib64/chromium-browser/chromium-browser [...] -jhall      66230   [...]  /usr/lib64/chromium-browser/chromium-browser [...] -[...] -jhall      66861   [...]  /usr/lib64/chromium-browser/chromium-browser [...] -jhall      67329   65132  0 15:45 pts/0    00:00:00 grep -F chromium -``` - -I've omitted some lines, but there are 20 Chromium processes and one **grep** process that is searching for the string "chromium." - - -``` -$ ps -ef | fgrep chromium | wc -l -21 -``` - -But after I exit Chromium, those processes remain open. How do you shut them down and reclaim the memory and CPU that those processes are taking up? - -The **kill** command lets you terminate a process. In the simplest case, you tell **kill** the PID of what you want to stop. For example, to terminate each of these processes, I would need to execute the **kill** command against each of the 20 Chromium process IDs. One way to do that is with a command line that gets the Chromium PIDs and another that runs **kill** against that list: - - -``` -$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}' -66221 -66230 -66239 -66257 -66262 -66283 -66284 -66285 -66324 -66337 -66360 -66370 -66386 -66402 -66503 -66539 -66595 -66734 -66848 -66861 -69702 - -$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}' > /tmp/pids -$ kill $( cat /tmp/pids) -``` - -Those last two lines are the key. The first command line generates a list of process IDs for the Chromium browser. The second command line runs the **kill** command against that list of process IDs. - -### Introducing the killall command - -A simpler way to stop a bunch of processes all at once is to use the **killall** command. As you might guess by the name, **killall** terminates all processes that match a name. That means we can use this command to stop all of our rogue Chromium processes. This is as simple as: - - -``` -`$ killall /usr/lib64/chromium-browser/chromium-browser` -``` - -But be careful with **killall**. This command can terminate any process that matches what you give it. That's why I like to first use **ps -ef** to check my running processes, then run **killall** against the exact path to the command that I want to stop. - -You might also want to use the **-i** or **\--interactive** option to ask **killall** to prompt you before it stops each process. - -**killall** also supports options to select processes that are older than a specific time using the **-o** or **\--older-than** option. This can be helpful if you discover a set of rogue processes that have been running unattended for several days, for example. Or you can select processes that are younger than a specific time, such as runaway processes you recently started. Use the **-y** or **\--younger-than** option to select these processes. - -### Other ways to manage processes - -Process management can be an important part of system maintenance. In my early career as a Unix and Linux systems administrator, the ability to kill escaped jobs was a useful tool to keep systems running properly. You may not need to kill rogue processes in a modern Linux desktop, but knowing **kill** and **killall** can help you when things eventually go awry. - -You can also look for other ways to manage processes. In my case, I didn't really need to use **kill** or **killall** to stop the background Chromium processes after I exited the browser. There's a simple setting in Chromium to control that: - -![Chromium background processes setting][2] - -Still, it's always a good idea to keep an eye on what processes are running on your system and know how to manage them when needed. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/1/linux-kill-killall - -作者:[Jim Hall][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jim-hall -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_penguin_green.png?itok=ENdVzW22 (Penguin with green background) -[2]: https://opensource.com/sites/default/files/uploads/chromium-settings-continue-running.png (Chromium background processes setting) diff --git a/sources/tech/20200129 Ansible Playbooks Quick Start Guide with Examples.md b/sources/tech/20200129 Ansible Playbooks Quick Start Guide with Examples.md deleted file mode 100644 index 93b17b0fd3..0000000000 --- a/sources/tech/20200129 Ansible Playbooks Quick Start Guide with Examples.md +++ /dev/null @@ -1,349 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Ansible Playbooks Quick Start Guide with Examples) -[#]: via: (https://www.2daygeek.com/ansible-playbooks-quick-start-guide-with-examples/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -Ansible Playbooks Quick Start Guide with Examples -====== - -We have already written two articles about Ansible, this is the third article. - -If you are new to Ansible, I advise you to read the two topics below, which will teach you the basics of Ansible and what it is. - - * **Part-1: [How to Install and Configure Ansible on Linux][1]** - * **Part-2: [Ansible ad-hoc Command Quick Start Guide][2]** - - - -If you have finished them, you will feel the continuity as you read this article. - -### What is the Ansible Playbook? - -Playbooks are much more powerful and completely different way than ad-hoc command mode. - -It uses the **“/usr/bin/ansible-playbook”** binary. It provides rich features to make complex task easier. - -Playbooks are very useful if you want to run a task often. - -Also, this is useful if you want to perform multiple tasks at the same time on the group of server. - -Playbooks are written in YAML language. YAML stands for Ain’t Markup Language, which is easier for humans to read and write than other common data formats such as XML or JSON. - -The Ansible Playbook Flow Chart below will tell you its detailed structure. - -![][3] - -### Understanding the Ansible Playbooks Terminology - - * **Control Node:** The machine where Ansible is installed. It is responsible for managing client nodes. - * **Managed Nodes:** List of hosts managed by the control node - * **Playbook:** A Playbook file contains a set of procedures used to automate a task. - * **Inventory:** The inventory file contains information about the servers you manage. - * **Task:** Each play has multiple tasks, tasks that are executed one by one against a given machine (it a host or multiple host or a group of host). - * **Module:** Modules are a unit of code that is used to gather information from the client node. - * **Role:** Roles are ways to automatically load some vars_files, tasks, and handlers based on known file structure. - * **Play:** Each playbook has multiple plays, and a play is the implementation of a particular automation from beginning to end. - * **Handlers:** This helps you reduce any service restart in a play. Lists of handler tasks are not really different from regular tasks, and changes are notified by notifiers. If the handler does not receive any notification, it will not work. - - - -### How Does the Basic Playbook looks Like? - -Here’s how the basic playbook looks. - -``` ---- [YAML file should begin with a three dash] -- name: [Description about a script] - hosts: group [Add a host or host group] - become: true [It requires if you want to run a task as a root user] - tasks: [What action do you want to perform under task] - - name: [Enter the module options] - module: [Enter a module, which you want to perform] - module_options-1: value [Enter the module options] - module_options-2: value - . - module_options-N: value -``` - -### How to Understand Ansible Output - -The Ansible Playbook output comes with 4 colors, see below for color definitions. - - * **Green:** **ok –** If that is correct, the associated task data already exists and configured as needed. - * **Yellow: changed –** Specific data has updated or modified according to the needs of the tasks. - * **Red: FAILED –** If there is any problem while doing a task, it returns a failure message, it may be anything and you need to fix it accordingly. - * **White:** It comes with multiple parameters - - - -To do so, create a playbook directory to keep them all in one place. - -``` -$ sudo mkdir /etc/ansible/playbooks -``` - -### Playbook-1: Ansible Playbook to Install Apache Web Server on RHEL Based Systems - -This sample playbook allows you to install the Apache web server on a given target node. - -``` -$ sudo nano /etc/ansible/playbooks/apache.yml - ---- -- hosts: web - become: yes - name: "Install and Configure Apache Web server" - tasks: - - name: "Install Apache Web Server" - yum: - name: httpd - state: latest - - name: "Ensure Apache Web Server is Running" - service: - name: httpd - state: started -``` - -``` -$ ansible-playbook apache1.yml -``` - -![][3] - -### How to Understand Playbook Execution in Ansible - -To check the syntax error, run the following command. If it finds no error, it only shows the given file name. If it detects any error, you will get an error as follows, but the contents may differ based on your input file. - -``` -$ ansible-playbook apache1.yml --syntax-check - -ERROR! Syntax Error while loading YAML. - found a tab character that violate indentation -The error appears to be in '/etc/ansible/playbooks/apache1.yml': line 10, column 1, but may -be elsewhere in the file depending on the exact syntax problem. -The offending line appears to be: - state: latest -^ here -There appears to be a tab character at the start of the line. - -YAML does not use tabs for formatting. Tabs should be replaced with spaces. -For example: - - name: update tooling - vars: - version: 1.2.3 -# ^--- there is a tab there. -Should be written as: - - name: update tooling - vars: - version: 1.2.3 -# ^--- all spaces here. -``` - -Alternatively, you can check your ansible-playbook content from online using the following url @ [YAML Lint][4] - -Run the following command to perform a **“Dry Run”**. When you run a ansible-playbook with the **“–check”** option, it does not make any changes to the remote machine. Instead, it will tell you what changes they have made rather than create them. - -``` -$ ansible-playbook apache.yml --check - -PLAY [Install and Configure Apache Webserver] ******************************************************************** - -TASK [Gathering Facts] ******************************************************************************************* -ok: [node2.2g.lab] -ok: [node1.2g.lab] - -TASK [Install Apache Web Server] ********************************************************************************* -changed: [node2.2g.lab] -changed: [node1.2g.lab] - -TASK [Ensure Apache Web Server is Running] *********************************************************************** -changed: [node1.2g.lab] -changed: [node2.2g.lab] - -PLAY RECAP ******************************************************************************************************* -node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -``` - -If you want detailed information about your ansible playbook implementation, use the **“-vv”** verbose option. It shows what it really does to gather this information. - -``` -$ ansible-playbook apache.yml --check -vv - -ansible-playbook 2.9.2 - config file = /etc/ansible/ansible.cfg - configured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] - ansible python module location = /usr/lib/python3.8/site-packages/ansible - executable location = /usr/bin/ansible-playbook - python version = 3.8.1 (default, Jan 8 2020, 23:09:20) [GCC 9.2.0] -Using /etc/ansible/ansible.cfg as config file - -PLAYBOOK: apache.yml ***************************************************************************************************** -1 plays in apache.yml - -PLAY [Install and Configure Apache Webserver] **************************************************************************** - -TASK [Gathering Facts] *************************************************************************************************** -task path: /etc/ansible/playbooks/apache.yml:2 -ok: [node2.2g.lab] -ok: [node1.2g.lab] -META: ran handlers - -TASK [Install Apache Web Server] ***************************************************************************************** -task path: /etc/ansible/playbooks/apache.yml:6 -changed: [node2.2g.lab] => {"changed": true, "msg": "Check mode: No changes made, but would have if not in check mod -e", "rc": 0, "results": ["Installed: httpd"]} -changed: [node1.2g.lab] => {"changed": true, "changes": {"installed": ["httpd"], "updated": []}, "msg": "", "obsolet -es": {"urw-fonts": {"dist": "noarch", "repo": "@anaconda", "version": "2.4-16.el7"}}, "rc": 0, "results": []} - -TASK [Ensure Apache Web Server is Running] ******************************************************************************* -task path: /etc/ansible/playbooks/apache.yml:10 -changed: [node1.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"} -changed: [node2.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"} -META: ran handlers -META: ran handlers - -PLAY RECAP *************************************************************************************************************** -node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -``` - -### Playbook-2: Ansible Playbook to Install Apache Web Server on Ubuntu Based Systems - -This sample playbook allows you to install the Apache web server on a given target node. - -``` -$ sudo nano /etc/ansible/playbooks/apache-ubuntu.yml - ---- -- hosts: web - become: yes - name: "Install and Configure Apache Web Server" - tasks: - - name: "Install Apache Web Server" - yum: - name: apache2 - state: latest - - - name: "Start the Apache Web Server" - service: - name: apaceh2 - state: started - - - name: "Enable mod_rewrite module" - apache2_module: - name: rewrite - state: present - - notify: - - start apache - - handlers: - - name: "Ensure Apache Web Server is Running" - service: - name: apache2 - state: restarted - enabled: yes -``` - -### Playbook-3: Ansible Playbook to Install a List of Packages on Red Hat Based Systems - -This sample playbook allows you to install a list of packages on a given target node. - -**Method-1:** - -``` -$ sudo nano /etc/ansible/playbooks/packages-redhat.yml - ---- -- hosts: web - become: yes - name: "Install a List of Packages on Red Hat Based System" - tasks: - - name: "Installing a list of packages" - yum: - name: - - curl - - httpd - - nano - - htop -``` - -**Method-2:** - -``` -$ sudo nano /etc/ansible/playbooks/packages-redhat-1.yml - ---- -- hosts: web - become: yes - name: "Install a List of Packages on Red Hat Based System" - tasks: - - name: "Installing a list of packages" - yum: name={{ item }} state=latest - with_items: - - curl - - httpd - - nano - - htop -``` - -**Method-3: Using Array Variable** - -``` -$ sudo nano /etc/ansible/playbooks/packages-redhat-2.yml - ---- -- hosts: web - become: yes - name: "Install a List of Packages on Red Hat Based System" - vars: - packages: [ 'curl', 'git', 'htop' ] - tasks: - - name: Install a list of packages - yum: name={{ item }} state=latest - with_items: "{{ packages }}" -``` - -### Playbook-4: Ansible Playbook to Install Updates on Linux Systems - -This sample playbook allows you to install updates on your Linux systems, running Red Hat and Debian-based client nodes. - -``` -$ sudo nano /etc/ansible/playbooks/security-update.yml - ---- -- hosts: web - become: yes - name: "Install Security Update" - tasks: - - name: "Installing Security Update on Red Hat Based System" - yum: name=* update_cache=yes security=yes state=latest - when: ansible_facts['distribution'] == "CentOS" - - - name: "Installing Security Update on Ubuntu Based System" - apt: upgrade=dist update_cache=yes - when: ansible_facts['distribution'] == "Ubuntu" -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/ansible-playbooks-quick-start-guide-with-examples/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/install-configure-ansible-automation-tool-linux-quick-start-guide/ -[2]: https://www.2daygeek.com/ansible-ad-hoc-command-quick-start-guide-with-examples/ -[3]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[4]: http://www.yamllint.com/ diff --git a/sources/tech/20200222 How to install TT-RSS on a Raspberry Pi.md b/sources/tech/20200222 How to install TT-RSS on a Raspberry Pi.md deleted file mode 100644 index ec5a177314..0000000000 --- a/sources/tech/20200222 How to install TT-RSS on a Raspberry Pi.md +++ /dev/null @@ -1,245 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to install TT-RSS on a Raspberry Pi) -[#]: via: (https://opensource.com/article/20/2/ttrss-raspberry-pi) -[#]: author: (Patrick H. Mullins https://opensource.com/users/pmullins) - -How to install TT-RSS on a Raspberry Pi -====== -Read your news feeds while keeping your privacy intact with Tiny Tiny -RSS. -![Raspberries with pi symbol overlay][1] - -[Tiny Tiny RSS][2] (TT-RSS) is a free and open source web-based news feed (RSS/Atom) reader and aggregator. It's ideally suited to those who are privacy-focused and still rely on RSS for their daily news. Tiny Tiny RSS is self-hosted software, so you have 100% control of the server, your data, and your overall privacy. It also supports a wide range of plugins, add-ons, and themes, Want a dark mode interface? No problem. Want to filter your incoming news based on keywords? TT-RSS has you covered there, as well. - -![Tiny Tiny RSS screenshot][3] - -Now that you know what TT-RSS is and why you may want to use it, I'll explain everything you need to know about installing it on a Raspberry Pi or a Debian 10 server. - -### Install and configure TT-RSS - -To install TT-RSS on a Raspberry Pi, you must also install and configure the latest version of PHP (7.3 as of this writing), PostgreSQL for the database backend, the Nginx web server, Git, and finally, TT-RSS. - -#### 1\. Install PHP 7 - -Installing PHP 7 is, by far, the most involved part of this process. Thankfully, it's not as difficult as it might appear. Start by installing the following support packages: - - -``` -`$ sudo apt install -y ca-certificates apt-transport-https` -``` - -Now, add the repository PGP key: - - -``` -`$ wget -q https://packages.sury.org/php/apt.gpg -O- | sudo apt-key add -` -``` - -Next, add the PHP repository to your apt sources: - - -``` -`$ echo "deb https://packages.sury.org/php/ buster main" | sudo tee /etc/apt/sources.list.d/php.list` -``` - -Then update your repository index: - - -``` -`$ sudo apt update` -``` - -Finally, install PHP 7.3 (or the latest version) and some common components: - - -``` -`$ sudo apt install -y php7.3 php7.3-cli php7.3-fpm php7.3-opcache php7.3-curl php7.3-mbstring php7.3-pgsql php7.3-zip php7.3-xml php7.3-gd php7.3-intl` -``` - -The command above assumes you're using PostgreSQL as your database backend and installs **php7.3-pgsql**. If you'd rather use MySQL or MariaDB, you can easily change this to **php7.3-mysql**. - -Next, verify that PHP is installed and running on your Raspberry Pi: - - -``` -`$ php -v` -``` - -Now it's time to install and configure the webserver. - -#### 2\. Install Nginx - -Nginx can be installed via apt with: - - -``` -`$ sudo apt install -y nginx` -``` - -Modify the default Nginx virtual host configuration so that the webserver will recognize PHP files and know what to do with them: - - -``` -`$ sudo nano /etc/nginx/sites-available/default` -``` - -You can safely delete everything in the original file and replace it with: - - -``` -server { -        listen 80 default_server; -        listen [::]:80 default_server; - -        root /var/www/html; -        index index.html index.htm index.php; -        server_name _; - -        location / { -                try_files $uri $uri/ =404; -        } - -        location ~ \\.php$ { -          include snippets/fastcgi-php.conf; -          fastcgi_pass unix:/run/php/php7.3-fpm.sock; -        } - -} -``` - -Use **Ctrl+O** to save your new configuration file and then **Ctrl+X** to exit Nano. You can test your new configuration with: - - -``` -`$ nginx -t` -``` - -If there are no errors, restart the Nginx service: - - -``` -`$ systemctl restart nginx` -``` - -#### 3\. Install PostgreSQL - -Next up is installing the database server. Installing PostgreSQL on the Raspberry Pi is super easy: - - -``` -`$ sudo apt install -y postgresql postgresql-client postgis` -``` - -Check to see if the database server was successfully installed by entering: - - -``` -`$ psql --version` -``` - -#### 4\. Create the Tiny Tiny RSS database - -Before you can do anything else, you need to create a database that the TT-RSS software will use to store data. First, log into the PostgreSQL server: - - -``` -`sudo -u postgres psql` -``` - -Next, create a new user and assign a password: - - -``` -`CREATE USER username WITH PASSWORD 'your_password' VALID UNTIL 'infinity';` -``` - -Then create the database that will be used by TT-RSS: - - -``` -`CREATE DATABASE tinyrss;` -``` - -Finally, grant full permissions to the new user: - - -``` -`GRANT ALL PRIVILEGES ON DATABASE tinyrss to user_name;` -``` - -That's it for the database. You can exit the **psql** app by typing **\q**. - -#### 5\. Install Git - -Installing TT-RSS requires Git, so install Git with: - - -``` -`$ sudo apt install git -y` -``` - -Now, change directory to wherever Nginx serves web pages: - - -``` -`$ cd /var/www/html` -``` - -Then download the latest source for TT-RSS: - - -``` -`$ git clone https://git.tt-rss.org/fox/tt-rss.git tt-rss` -``` - -Note that this process creates a new **tt-rss** folder. - -#### 6\. Install and configure Tiny Tiny RSS - -It's finally time to install and configure your new TT-RSS server. First, verify that you can open **** in a web browser. If you get a **403 Forbidden** error, your permissions are not set properly on the **/var/www/html** folder. The following will usually fix this issue: - - -``` -`$ chmod 755 /var/www/html/ -v` -``` - -If everything goes as planned, you'll see the TT-RSS Installer page, and it will ask you for some database information. Just tell it the database username and password that you created earlier; the database name; **localhost** for the hostname; and **5432** for the port. - -Click **Test Configuration** to continue. If all went well, you should see a red button labeled **Initialize Database.** Click on it to begin the installation. Once finished, you'll have a configuration file that you can copy and save as **config.php** in the TT-RSS directory. - -After finishing with the installer, open your TT-RSS installation at **** and log in with the default credentials (username: **admin**, password: **password**). The system will recommend that you change the admin password as soon as you log in. I highly recommend that you follow that advice and change it as soon as possible. - -### Set up TT-RSS - -If all went well, you can start using TT-RSS right away. It's recommended that you create a new non-admin user, log in as the new user, and start importing your feeds, subscribing, and configuring it as you see fit. - -Finally, and this is super important, don't forget to read the [Updating Feeds][4] section on TT-RSS's wiki. It describes how to create a simple systemd service that will update your feeds. If you skip this step, your RSS feeds will not update automatically. - -### Conclusion - -Whew! That was a lot of work, but you did it! You now have your very own RSS aggregation server. Want to learn more about TT-RSS? I recommend checking out the official [FAQ][5], the [support][6] forum, and the detailed [installation][7] notes. Feel free to comment below if you have any questions or issues. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/2/ttrss-raspberry-pi - -作者:[Patrick H. Mullins][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/pmullins -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life-raspberrypi_0.png?itok=Kczz87J2 (Raspberries with pi symbol overlay) -[2]: https://tt-rss.org/ -[3]: https://opensource.com/sites/default/files/uploads/tt-rss.jpeg (Tiny Tiny RSS screenshot) -[4]: https://tt-rss.org/wiki/UpdatingFeeds -[5]: https://tt-rss.org/wiki/FAQ -[6]: https://community.tt-rss.org/c/tiny-tiny-rss/support -[7]: https://tt-rss.org/wiki/InstallationNotes diff --git a/sources/tech/20200223 The Zen of Go.md b/sources/tech/20200223 The Zen of Go.md new file mode 100644 index 0000000000..c4143aed32 --- /dev/null +++ b/sources/tech/20200223 The Zen of Go.md @@ -0,0 +1,414 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (The Zen of Go) +[#]: via: (https://dave.cheney.net/2020/02/23/the-zen-of-go) +[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) + +The Zen of Go +====== + +_This article was derived from my [GopherCon Israel 2020][1] presentation. It’s also quite long. If you’d prefer a shorter version, head over to [the-zen-of-go.netlify.com][2]_. + +_A recording of the presentation is available on [YouTube][3]._ + +* * * + +### How should I write good code? + +Something that I’ve been thinking about a lot recently, when reflecting on the body of my own work, is a common subtitle, _how should I write good code?_ Given nobody actively seeks to write _bad_ code, this leads to the question; _how do you know when you’ve written good Go code?_ + +If there’s a continuum between good and bad, how to do we know what the good parts are? What are its properties, its attributes, its hallmarks, its patterns, and its idioms? + +### Idiomatic Go + +![][4] + +Which brings me to idiomatic Go. To say that something is idiomatic is to say that it follows the style of the time. If something is not idiomatic, it is not following the prevailing style. It is unfashionable. + +More importantly, to say to someone that their code is not idiomatic does not explain _why_ it’s not idiomatic. Why is this? Like all truths, the answer is found in the dictionary. + +> idiom (noun): a group of words established by usage as having a meaning not deducible from those of the individual words. + +Idioms are hallmarks of shared values. Idiomatic Go is not something you learn from a book, it’s something that you acquire by being part of a community. + +![][5] + +My concern with the mantra of idiomatic Go is, in many ways, it can be exclusionary. It’s saying “you can’t sit with us.” After all, isn’t that what we mean when critique of someone’s work as non-idiomatic? They didn’t do It right. It doesn’t look right. It doesn’t follow the style of time. + +I offer that idiomatic Go is not a suitable mechanism for teaching how to write good Go code because it is defined, fundamentally, by telling someone they did it wrong. Wouldn’t it be better if the advice we gave didn’t alienate the author right at the point they were most willing to accept it? + +### Proverbs + +Stepping away problematic idioms, what other cultural artefacts do Gophers have? Perhaps we can turn to Rob Pike’s wonderful [Go Proverbs][6]. Are these suitable teaching tools? Will these tell newcomers how to write good Go code? + +In general, I don’t think so. This is not to dismiss Pike’s work, it is just that the Go Proverbs, like Segoe Kensaku’s original, are observations, not statements of value. Again, the dictionary comes to the rescue: + +> proverb (noun): a short, well-known pithy saying, stating a general truth or piece of advice. + +The goal of the Go Proverbs are to reveal a deeper truth about the design of the language, but how useful is advice like the _empty interface says nothing_ to a novice from a language that doesn’t have structural typing? + +It’s important to recognise that, in a growing community, at any time the people learning Go far outnumber those who claim to have mastered the language. Thus proverbs are perhaps not the best teaching tool in this scenario. + +### Engineering Values + +Dan Luu found [an old presentation][7] by Mark Lucovsky about the engineering culture of the windows team around the windows NT-windows 2000 timeframe. The reason I mention it is Lukovsky’s description of a culture as a common way of evaluating designs and making tradeoffs. + +![][8] + +There are many ways of discussing culture, but with respect to an engineering culture Lucovsky’s description is apt. The central idea is _values guide decisions in an unknown design space_. The values of the NT team were; portability, reliability, security, and extensibility. Engineering values are, crudely translated, the way things are done around here. + +### Go’s values + +What are the explicit values of Go? What are the core beliefs or philosophy that define the way a Go programmer interprets the world? How are they promulgated? How are they taught? How are they enforced? How do they change over time? + +How will you, as a newly minted Go programmer, inculcate the engineering values of Go? Or, how will you, a seasoned Go professional promulgate your values to a future generations? And just so we’re clear, this process of knowledge transfer is not optional. Without new blood and new ideas, our community become myopic and wither. + +#### The values of other languages + +To set the scene for what I’m getting at we can look to other languages we see examples of their engineering values. + +For example, C++ (and by extension Rust) believe that a programmer _should not have to pay for a feature they do not use_. If a program does not use some computationally expensive feature of the language, then it shouldn’t be forced to shoulder the cost of that feature. This value extends from the language, to its standard library, and is used as a yardstick for judging the design of all code written in C++. + +In Java, and Ruby, and Smalltalk, the core value that _everything is an object_ drives the design of programs around message passing, information hiding, and polymorphism. Designs that shoehorn a procedural style, or even a functional style, into these languages are considered to be wrong–or as Gophers would say, non idiomatic. + +Turning to our own community, what are the engineering values that bind Go programmers? Discourse in our community is often fractious, so deriving a set of values from first principles would be a formidable challenge. Consensus is critical, but exponentially more difficult as the number of contributors to the discussion increases. But what if someone had done the hard work for us. + +### The Zen of ~~Python~~ Go + +Several decades ago Tim Peters sat down and penned _[PEP-20][9]_, the Zen of Python. Peters’ attempted to document the engineering values that he saw Guido van Rossum apply in his role as BDFL for Python. + +For the remainder of this article, I’m going to look towards the Zen of Python and ask, is there anything that can inform the engineering values of Go programmers? + +### A good package starts with a good name + +Let’s start with something spicy, + +> “Namespaces are one honking great idea–let’s do more of those!” + +The Zen of Python, Item 19 + +This is pretty unequivocal, Python programmers should use namespaces. Lots of them. + +In Go parlance a namespace is a package. I doubt there is any question that grouping things into packages is good for design and potentially reuse. But there might be some confusion, especially if you’re coming with a decade of experience in another language, about the right way to do this. + +In Go each package should have a purpose, and the best way to know a package’s purpose is by its name—a noun. A package’s name describes what it provides. So too reinterpret Peters’ words, every Go package should have a single purpose. + +This is not a new idea, [I’ve been saying this a while][10], but why should you do this rather than approach where packages are used for fine grained taxonomy? Why, because change. + +> “Design is the art of arranging code to work today, and be changeable forever.” + +Sandi Metz + +Change is the name of the game we’re in. What we do as programmers is manage change. When we do that well we call it design, or architecture. When we do it badly we call it technical debt, or legacy code. + +If you are writing a program that works perfectly, one time, for one fixed set of inputs then nobody cares if the code is good or bad because ultimately the output of the program is all the business cares about. + +But this is _never_ true. Software has bugs, requirements change, inputs change, and very few programs are written solely to be executed once, thus your program _will_ change over time. Maybe it’s you who’ll be tasked with this, more likely it will be someone else, but someone has to change that code. Someone has to maintain that code. + +So, how can we make it easy to for programs to change? Interfaces everywhere? Make everything mockable? Pernicious dependency injection? Well, maybe, for some classes of programs, but not many, those techniques will be useful. However, for the majority of programs, designing something to be flexible up front is over engineering. + +What if, instead, we take a position that rather than enhancing components, we replace them. Then the best way to know when something needs to be replaced, is when it doesn’t do what it says on the tin. + +A good package starts with choosing a good name. Think of your package’s name as an elevator pitch, using just one word, to describe what it provides. When the name no longer matches the requirement, find a replacement. + +### Simplicity matters + +> “Simple is better than complex.” + +The Zen of Python, Item 3 + +PEP-20 says simple is better than complex, I couldn’t agree more. A couple of years ago I made this tweet; + +> Most programming languages start out aiming to be simple, but end up just settling for being powerful. +> +> — Dave Cheney (@davecheney) [December 2, 2014][11] + +My observation, at least at the time, was that I couldn’t think of a language introduced in my life time that didn’t purport to be simple. Each new language offered as a justification, and an enticement, their inherent simplicity. But as I researched, I found that simplicity was not a core value of the many of the languages considered Go’s contemporaries. [1][12] Maybe this is just a cheap shot, but could it be that either these languages aren’t simple, or they don’t _think_ of themselves as being simple. They don’t consider simplicity to be a core value. + +Call me old fashioned, but when did being simple fall out of style? Why does the commercial software development industry continually, gleefully, forget this fundamental truth? + +> “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” + +C. A. R. Hoare, The Emperor’s Old Clothes, 1980 Turing Award Lecture + +Simple does not mean easy, we know that. Often it is more work to make something simple to use, than easy to build. + +> “Simplicity is prerequisite for reliability.” + +Edsger W Dijkstra, EWD498, 18 June 1975 + +Why should we strive for simplicity? Why is important that Go programs be simple? Simple doesn’t mean crude, it means readable and maintainable. Simple doesn’t mean unsophisticated, it means reliable, relatable, and understandable. + +> “Controlling complexity is the essence of computer programming.” + +Brian W. Kernighan, _Software Tools_ (1976) + +Whether Python abides by its mantra of simplicity is a matter for debate, but Go holds simplicity as a core value. I think that we can all agree that when it comes to Go, simple code is preferable to clever code. + +### Avoid package level state + +> “Explicit is better than implicit.” + +_The Zen of Python, Item_ 2 + +This is a place where I think Peters’ was more aspirational than factual. Many things in Python are not explicit; decorators, dunder methods, and so on. Without doubt they are powerful, there’s a reason those features exists. Each feature is something someone cared enough about to do the work to implement it, especially the complicated ones. But heavy use of those features makes is harder for the reader to predict the cost of an operation. + +The good news is we have a choice, as Go programmers, to choose to make our code explicit. Explicit could mean many things, perhaps you may be thinking explicit is just a nice way of saying bureaucratic and long winded, but that’s a superficial interpretation. It’s a misnomer to focus only on the syntax on the page, to fret about line lengths and DRYing up expressions. The more valuable, in my opinon, place to be explicit are to do with coupling and with state. + +Coupling is a measure of the amount one thing depends on another. If two things are tightly coupled, they move together. An action that affects one is directly reflected in another. Imagine a train, each carriage joined–ironically the correct word is coupled–together; where the engine goes, the carriages follow. + +Another way to describe coupling is the word cohesion. Cohesion measures how well two things naturally belong together. We talk about a cohesive argument, or a cohesive team; all their parts fit together as if they were designed that way. + +Why does coupling matter? Because just like trains, when you need to change a piece of code, all the code that is tightly coupled to it must change. A prime example, someone release a new version of their API and now your code doesn’t compile. + +APIs are an unavoidable source of coupling but there are more insidious forms of coupling. Clearly everyone knows that if an API’s signature changes the data passing into and out of that call changes. It’s right there in the signature of the function; I take values of these types and return values of other types. But what if the API passed data another way? What if every time you called this API the result was based on the previous time you called that API even though you didn’t change your parameters. + +This is state, and management of state is _the_ problem in computer science. + +``` +package counter + +var count int + +func Increment(n int) int { + count += n + return count +} +``` + +Suppose we have this simple `counter` package. You can call `Increment` to increment the counter, you can even get the value back if you `Increment` with a value of zero. + +Suppose you had to test this code, how would you reset the counter after each test? Suppose you wanted to run those tests in parallel, could you do it? Now suppose that you wanted to count more than one thing per program, could you do it? + +No, of course not. Clearly the answer is to encapsulate the `count` variable in a type. + +``` +package counter + +type Counter struct { + count int +} + +func (c *Counter) Increment(n int) int { + c.count += n + return c.count +} +``` + +Now imagine that this problem isn’t restricted to just counters, but your applications main business logic. Can you test it in isolation? Can you test it in parallel? Can you use more than one instance at a time? If the answer those question is _no_, the reason is package level state. + +Avoid package level state. Reduce coupling and spooky action at a distance by providing the dependencies a type needs as fields on that type rather than using package variables. + +### Plan for failure, not success + +> “Errors should never pass silently.” + +_The Zen of Python, Item 1_0 + +It’s been said of languages that favour exception handling follow the Samurai principle; _return victorious or not at all_. In exception based languages functions only return valid results. If they don’t succeed then control flow takes an entirely different path. + +Unchecked exceptions are clearly an unsafe model to program in. How can you possibly write code that is robust in the presence of errors when you don’t know which statements could throw an exception? Java tried to make exceptions safer by introducing the notion of a checked exception which, to the best of my knowledge, has not been repeated in another mainstream language. There are plenty of languages which use exceptions but they all, with the singular exception of Java, do so in the unchecked variety. + +Obviously Go chose a different path. Go programmers believe that robust programs are composed from pieces that handle the failure cases _before_ they handle the happy path. In the space that Go was designed for; server programs, multi threaded programs, programs that handle input over the network, dealing with unexpected data, timeouts, connection failures and corrupted data must be front and centre of the programmer’s mind if they are to produce robust programs. + +> “I think that error handling should be explicit, this should be a core value of the language.” + +Peter Bourgon, [GoTime #91][13] + +I want to echo Peter’s assertion, as it was the impetus for this article. I think so much of the success of Go is due to the explicit way errors are handled. Go programmers thinks about the failure case first. We solve the “what if…​” case first. This leads to programs where failures are handled at the point of writing, rather than the point they occur in production. + +The verbosity of + +``` +if err != nil { + return err +} +``` + +is outweighed by the value of deliberately handling each failure condition at the point at which they occur. Key to this is the cultural value of handling each and every error explicitly. + +### Return early rather than nesting deeply + +> “Flat is better than nested.” + +The Zen of Python, Item 5 + +This is sage advice coming from a language where indentation is the primary form of control flow. How can we interpret this advice in terms of Go? `gofmt` controls the overall whitespace of a Go program so there’s not thing doing there. + +I wrote earlier about package names, and there is probably some advice here about avoiding a complicated package hierarchy. In my experience the more a programmer tries to subdivide and taxonimise their Go codebase the more they risk hitting the dead end that is package import loops. + +I think the best application of item 5’s advice is the control flow _within_ a function. Simply put, avoid control flow that requires deep indentation. + +> “Line of sight is a straight line along which an observer has unobstructed vision.” + +May Ryer, [Code: Align the happy path to the left edge][14] + +Mat Ryer describes this idea as line of sight coding. Light of sight coding means things like: + + * Using guard clauses to return early if a precondition is not met. + * Placing the successful return statement at the end of the function rather than inside a conditional block. + * Reducing the overall indentation level of the function by extracting functions and methods. + + + +Key to this advice is the thing that you care about, the thing that the function does, is never in danger of sliding out of sight to the right of your screen. This style has a bonus side effect that you’ll avoid pointless arguments about line lengths on your team. + +Every time you indent you add another precondition to the programmers stack, consuming one of their 7 ±2 short term memory slots. Rather than nesting deeply, keep the successful path of the function close to the left hand side of your screen. + +### If you think it’s slow, prove it with a benchmark + +> “In the face of ambiguity, refuse the temptation to guess.” + +The Zen of Python, Item 12 + +Programming is based on mathematics and logic, two concepts which rarely involve the element of chance. But there are many things we, as programmers, guess about every day. What does this variable do? What does this parameter do? What happens if I pass `nil` here? What happens if I call `Register` twice? There’s actually a lot of guesswork in modern programming, especially when it comes to using libraries you didn’t write. + +> “APIs should be easy to use and hard to misuse.” + +Josh Bloch + +One of the best ways I know to help a programmer avoid having to guess is to, when building an API, [focus on the default use case][15]. Make it as easy as you can for the caller to do the most common thing. However, I’ve written and talked a lot about API design in the past, so instead my interpretation of item 12 is; _don’t guess about performance_. + +Despite how you may feel about Knuth’s advice, one of the drivers of Go’s success is its efficient execution. You can write efficient programs in Go and thus people _will_ choose Go because of this. There are a lot of misconceptions about performance, so my request is, when you’re looking to performance tune your code or you’re facing some dogmatic advice like defer is slow, CGO is expensive, or always use atomics not mutexes, don’t guess. + +Don’t complicate your code because of outdated dogma, and, if you think something is slow, first prove it with a benchmark. Go has excellent benchmarking and profiling tools that come in the distribution for free. Use them to find your bottlenecks. + +### Before you launch a goroutine, know when it will stop + +At this point I think I think I’ve mined the valuable points from PEP-20 and possibly stretched its reinterpretation beyond the point of good taste. I think that’s fine, because although this was a useful rhetorical device, ultimately we are talking about two different languages. + +> “You type g o, a space, and then a function call. Three keystrokes, you can’t make it much shorter than that. Three keystrokes and you’ve just started a sub process.” + +Rob Pike, [Simplicity is Complicated][16], dotGo 2015 + +The next two suggestions I’ll dedicate to goroutines. Goroutines are the signature feature of the language, our answer for first class concurrency. They are so easy to use, just put the word `go` in front of the statement and you’ve launched that function asynchronously. It’s so simple, no threads, no stack sizes, no thread pool executors, no ID’s, no tracking completion status. + +Goroutines are cheap. Because of the runtime’s ability to multiplex goroutines onto a small pool of threads (which you don’t have to manage), hundreds of thousands, millions of goroutines are easily accommodated. This opens up designs that would be not be practical under competing concurrency models like threads or evented callbacks. + +But as cheap as goroutines are, they’re not free. At a minimum there’s a few kilobytes for their stack, which, when you’re getting up into the 10^6 goroutines, does start to add up. This is not to say you shouldn’t use millions of goroutines if that is what the design calls for, but when you do, it’s critical that you keep track of them because 10^6 of anything can consume a non trivial amount of resources in aggregate. + +Goroutines are the key to resource ownership in Go. To be useful a goroutine has to do something, and that means it almost always holds reference to, or ownership of, a resource; a lock, a network connection, a buffer with data, the sending end of a channel. While that goroutine is alive, the lock is held, the network connection remains open, the buffer retained and the receivers of the channel will continue to wait for more data. + +The simplest way to free those resources is to tie them to the lifetime of the goroutine–when the goroutine exits, the resource has been freed. So while it’s near trivial to start a goroutine, before you write those three letters, g o and a space, make sure you have an answer to these questions: + + * **Under what condition will a goroutine stop?** Go doesn’t have a way to tell a goroutine to exit. There is no stop or kill function, for good reason. If we cannot command a goroutine to stop, we must instead ask it, politely. Almost always this comes down to a channel operation. Range loops over a channel exit when the channel is closed. A channel will become selectable if it is closed. The signal from one goroutine to another is best expressed as a closed channel. + * **What is required for that condition to arise?** If channels are both the vehicle to communicate between goroutines and the mechanism for them to signal completion, the next question to the programmer becomes, who will close the channel, when will that happen? + * **What signal will you use to know the goroutine has stopped?** When you signal a goroutine to stop, that stopping will happen at some time in the future relative to the goroutine’s frame of reference. It might happen quickly in terms of human perception, but computers execute billions of instructions every second, and from the point of view of each goroutine, their execution of instructions is unsynchronised. The solution is often to use a channel to signal back or a waitgroup where a fan in approach is needed. + + + +### Leave concurrency to the caller + +It is likely that in any serious Go program you write there will be concurrency involved. This raises the problem, many of the libraries and code that we write fall into this a one goroutine per connection, or worker pattern. How will you manage the lifetime of those goroutines? + +`net/http` is a prime example. Shutting down the server owning the listening socket is relatively straight forward, but what about a goroutines spawned from that accepting socket? `net/http` does provide a context object inside the request object which can be used to signal–to code that is listening–that the request should be canceled, thereby terminating the goroutine, however it is less clear how to know when all of these things have been done. It’s one thing to call `context.Cancel`, its another to know that the cancellation has completed.[2][17] + +The point I want to make about `net/http` is that its a counter example to good practice. Because each connection is handled by a goroutine spawned inside the `net/http.Server` type, the program, living outside the `net/http` package, does not have an ability to control the goroutines spawned for the accepting socket. + +This is an area of design that is still evolving, with efforts like go-kit’s `run.Group` and the Go team’s [`ErrGroup`][18] which provide a framework to execute, cancel and wait on functions run asynchronously. + +The bigger design maxim here is for library writers, or anyone writing code that could be run asynchronously, leave the responsibility of starting to goroutine to your caller. Let the caller choose how they want to start, track, and wait on your functions execution. + +### Write tests to lock in the behaviour of your package’s API + +Perhaps you were hoping to read an article from me where I didn’t rant about testing. Sadly, today is not that day. + +Your tests are the contract about what your software does and does not do. Unit tests at the package level should lock in the behaviour of the package’s API. They describe, in code, what the package promises to do. If there is a unit test for each input permutation, you have defined the contract for what the code will do _in code_, not documentation. + +This is a contract you can assert as simply as typing `go test`. At any stage, you can _know_ with a high degree of confidence, that the behaviour people relied on before your change continues to function after your change. + +Tests lock in api behaviour. Any change that adds, modifies or removes a public api must include changes to its tests. + +### Moderation is a virtue + +Go is a simple language, only 25 keywords. In some ways this makes the features that are built into the language stand out. Equally these are the features that the language sells itself on, lightweight concurrency, structural typing. + +I think all of us have experienced the confusion that comes from trying to use all of Go’s features at once. Who was so excited to use channels that they used them as much as they could, as often as they could? Personally for me I found the result was hard to test, fragile, and ultimately overcomplicated. Am I alone? + +I had the same experience with goroutines, attempting to break the work into tiny units I created a hard to manage hurd of Goroutines and ultimately missed the observation that most of my goroutines were always blocked waiting for their predecessor– the code was ultimately sequential and I had added a lot of complexity for little real world benefit. Who has experienced something like this? + +I had the same experience with embedding. Initially I mistook it for inheritance. Then later I recreated the fragile base class problem by composing complicated types, which already had several responsibilities, into more complicated mega types. + +This is potentially the least actionable piece of advice, but one I think is important enough to mention. The advice is always the same, all things in moderation, and Go’s features are no exception. If you can, don’t reach for a goroutine, or a channel, or embed a struct, anonymous functions, going overboard with packages, interfaces for everything, instead prefer simpler approach rather than the clever approach. + +### Maintainability counts + +I want to close with one final item from PEP-20, + +> “Readability Counts.” + +The Zen of Python, Item 7 + +So much has been said, about the importance of readability, not just in Go, but all programming languages. People like me who stand on stages advocating for Go use words like simplicity, readability, clarity, productivity, but ultimately they are all synonyms for one word–_maintainability_. + +The real goal is to write maintainable code. Code that can live on after the original author. Code that can exist not just as a point in time investment, but as a foundation for future value. It’s not that readability doesn’t matter, maintainability matters _more_. + +Go is not a language that optimises for clever one liners. Go is not a language which optimises for the least number of lines in a program. We’re not optimising for the size of the source code on disk, nor how long it takes to type the program into an editor. Rather, we want to optimise our code to be clear to the reader. Because its the reader who’s going to have to maintain this code. + +If you’re writing a program for yourself, maybe it only has to run once, or you’re the only person who’ll ever see it, then do what ever works for you. But if this is a piece of software that more than one person will contribute to, or that will be used by people over a long enough time that requirements, features, or the environment it runs in may change, then your goal must be for your program to be maintainable. If software cannot be maintained, then it will be rewritten; and that could be the last time your company will invest in Go. + +Can the thing you worked hard to build be maintained after you’re gone? What can you do today to make it easier for someone to maintain your code tomorrow? + +##### [the-zen-of-go.netlify.com][2] + + 1. This part of the talk had several screenshots of the landing pages for the websites for [Ruby][19], [Swift][20], [Elm][21], [Go][22], [NodeJS][23], [Python][24], [Rust][25], highlighting how the language described itself.[][26] + 2. I tend to pick on `net/http` a lot, and this is not because it is bad, in fact it is the opposite, it is the most successful, oldest, most used API in the Go codebase. And because of that its design, evolution, and shortcoming have been thoroughly picked over. Think of this as flattery, not criticism.[][27] + + + +#### Related posts: + + 1. [Never start a goroutine without knowing how it will stop][28] + 2. [Simplicity Debt][29] + 3. [Curious Channels][30] + 4. [Let’s talk about logging][31] + + + +-------------------------------------------------------------------------------- + +via: https://dave.cheney.net/2020/02/23/the-zen-of-go + +作者:[Dave Cheney][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://dave.cheney.net/author/davecheney +[b]: https://github.com/lujun9972 +[1]: https://www.gophercon.org.il +[2]: https://the-zen-of-go.netlify.com +[3]: https://www.youtube.com/watch?v=yd_rtwYaXps +[4]: https://dave.cheney.net/wp-content/uploads/2020/02/1011226.jpg +[5]: https://dave.cheney.net/wp-content/uploads/2020/02/mean-girls-you-cant-sit-with-us-main.jpg +[6]: http://go-proverbs.github.io +[7]: https://danluu.com/microsoft-culture/ +[8]: https://dave.cheney.net/wp-content/uploads/2020/02/Lucovsky.001.jpeg +[9]: https://www.python.org/dev/peps/pep-0020/ +[10]: https://dave.cheney.net/2019/01/08/avoid-package-names-like-base-util-or-common +[11]: https://twitter.com/davecheney/status/539576755254611968?ref_src=twsrc%5Etfw +[12]: tmp.iUoDiQyXMU#easy-footnote-bottom-1-3936 (This part of the talk had several screenshots of the landing pages for the websites for Ruby, Swift, Elm, Go, NodeJS, Python, Rust, highlighting how the language described itself.) +[13]: https://changelog.com/gotime/91 +[14]: https://medium.com/@matryer/line-of-sight-in-code-186dd7cdea88 +[15]: http://sweng.the-davies.net/Home/rustys-api-design-manifesto +[16]: https://www.youtube.com/watch?v=rFejpH_tAHM +[17]: tmp.iUoDiQyXMU#easy-footnote-bottom-2-3936 (I tend to pick on net/http a lot, and this is not because it is bad, in fact it is the opposite, it is the most successful, oldest, most used API in the Go codebase. And because of that its design, evolution, and shortcoming have been thoroughly picked over. Think of this as flattery, not criticism.) +[18]: https://godoc.org/golang.org/x/sync/errgroup +[19]: https://www.ruby-lang.org/en/ +[20]: https://swift.org +[21]: https://elm-lang.org +[22]: https://golang.org +[23]: https://nodejs.org/en/ +[24]: https://www.python.org +[25]: https://www.rust-lang.org +[26]: tmp.iUoDiQyXMU#easy-footnote-1-3936 +[27]: tmp.iUoDiQyXMU#easy-footnote-2-3936 +[28]: https://dave.cheney.net/2016/12/22/never-start-a-goroutine-without-knowing-how-it-will-stop (Never start a goroutine without knowing how it will stop) +[29]: https://dave.cheney.net/2017/06/15/simplicity-debt (Simplicity Debt) +[30]: https://dave.cheney.net/2013/04/30/curious-channels (Curious Channels) +[31]: https://dave.cheney.net/2015/11/05/lets-talk-about-logging (Let’s talk about logging) diff --git a/sources/tech/20200228 4 technologists on careers in tech for minorities.md b/sources/tech/20200228 4 technologists on careers in tech for minorities.md deleted file mode 100644 index 806300d5db..0000000000 --- a/sources/tech/20200228 4 technologists on careers in tech for minorities.md +++ /dev/null @@ -1,126 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (4 technologists on careers in tech for minorities) -[#]: via: (https://opensource.com/article/20/2/careers-tech-minorities) -[#]: author: (Shilla Saebi https://opensource.com/users/shillasaebi) - -4 technologists on careers in tech for minorities -====== -Learn what Black History Month means to them, what influences their -career, resources for minorities wanting to break into tech, and more. -![Team meeting][1] - -In honor of Black History Month, I've garnered the opinions of a few of my favorite technology professionals and open source contributors. These four individuals are paving the way for the next generation alongside the work they're doing in the technology industry. Learn what Black History Month means to them, what influences their career, resources for minorities wanting to break into tech, and more. - -**[Tameika Reed][2], founder of Women In Linux** - -Since its launch, Tameika leads initiatives with a focus on exploring careers in infrastructure, cybersecurity, DevOps and IoT, pivoting into leadership and continuous skill-building. As a self-taught system administrator, Tameika believes the best way to learn tech is by just diving in. In efforts to give women a 360° view of tech, Tameika hosts a weekly virtual meetup to explore outside the norm of just Linux but introducing hyperledger, Kubernetes, microservices, and high-performance computing. Tameika’s career includes different conference talks from OSCon, LISA 2018, Seagl, HashiCorp EU 2019, and various local events. - -**[Michael Scott Winslow][3], Director, Core Applications and Platforms, Comcast** - -"I'm a father, husband, brother, and son. I come from a small family so I have fun turning friends into an extended family. When I attach my name to something, I obsess over its success, so I am very careful what I agree to be a part of. Oh, so as far as my career I have been involved with software development for decades. I solve problems. I work with others to help solve large problems. I lead, guide and mentor newer software engineers while observing others that I want to learn from." - -**[Bryan Liles][4], senior staff engineer, VMware** - -"I’m working with our team to rethink how developers interact with Kubernetes. When not working, I’m out in the community trying to inspire the next generation of software engineers and building robots." - -**[Mutale Nkonde][5], founding CEO of AI For the People (AFP)** - -AFP is a nonprofit creative agency. Prior to starting a nonprofit she worked in AI Governance. During that time she was part of the team that introduced the Algorithmic and Deep Fakes Algorithmic Acts, as well as the No Biometric Barriers to Housing Act to the US House of Representatives. Nkonde started her career as a broadcast journalist and worked at the BBC, CNN & ABC. She also writes widely on race and tech, as well as holding fellowships at Harvard and Stanford. - -### What influenced you to pursue a career in technology? - -My fear of the computer when I went back to college. I was afraid of the computer because I dropped out of college. After and going back, I made it my mission to learn all I can. This is still my motto to this day, learning never stops. —Tameika Reed - -I won’t mince words, I was a child geek! At 10 years old I started writing GW-BASIC from code that I read in printed magazines. Every single day. I gave it a bit of a break to have a life while I went to high school, but when it came time to pick a major for college, it was an easy choice. I stayed in technology thanks to the amazing mentors and colleagues I’ve had along the way. —Michael Scott Winslow - -I’ve been writing software since I was in middle school. I like being able to tell computers to do things and seeing the results. As an adult, I quickly realized that having a job that gave me satisfaction and paid well was the way to go. —Bryan Liles - -I wanted to explore the questions around why so few black women were being hired by tech companies. —Mutale Nkonde - -### Is there a particular person or people in open source and the tech world who have inspired you? - -I get inspired by a lot of other people and projects. For example, I love seeing others come to [Women In Linux][6] and are sure where they want to go. I try to give people a 360-view of tech so they can make a decision on what they like. Its easy to say I want to be in tech but it’s hard to get started and stay. You don’t have to be just a coder/programmer but you can be a cloud architect. —Tameika Reed - -[Kelsey Hightower][7], [Bryan Liles][4], and Kim Scott inspire me very much. They are so REAL! They say things that I feel and experience every day. Get your job done! Stop complaining! Own your actions and understand how you contribute to your situation! [Gene Kim][8] is a big inspiration as well. As a leader in the DevOps movement, I see myself following and emulating a lot of things he does. —Michael Scott Winslow - -No. I didn’t see the inspiration I wanted, so I’ve worked hard to be the inspiration I needed 20 years ago. —Bryan Liles - -There are so many! One of my favorites is [Dorothy Vaughan][9]: She was the first person in the US to program an IBM Watson computer. Her story is captured in the movie Hidden Figures. —Mutale Nkonde - -### Are there particular resources you would recommend for minorities wanting to break into tech? - -Yes, I recommend finding folks on Twitter and just ask questions. Here is a list of people I follow and admire in tech: —Tameika Reed - - * [@techgirl1908][10] - * [@bryanl][4] - * [@kelseyhightower][7] - * [@kstewart][11] - * [@tiffani][12] - * [@EricaJoy][13] - * [@womeninlinux][6] - * [@ArlanWasHere][14] - * [@blkintechnology][15] - * [@digundiv][16] - - - -Respected bootcamps are really cutting down the time it takes to break into the tech industry. I’ve met several professionals who went through bootcamps who have outshined their 4-year institution counterparts. I think we can really start respecting everything that people bring to the table, rather than technical fluency. —Michael Scott Winslow - -I’m not sure I can recommend anything specific. Tech is a big thing and there isn’t an easy answer. My advice is to pick something you think will be interested in and work to become an expert on the topic. Start asking why instead of how, and also start understanding how things work together. — Bryan Liles - -It really depends on the type of work they want to do. For people working at the intersection of tech and social justice, I would recommend the book [Algorithms of Oppression][17] by Safiya Noble. —Mutale Nkonde - -### What advice would you give to a person of color considering technology as their career? - -I suggest you study your craft. You will be a forever learner. There will always be someone or something in your way how you respond and move will be on you. Never take the first offer push back and know your worth. I look at tech like I look at art. It takes time to develop so be patient with yourself. It's okay to unplug and say no. —Tameika Reed - -As someone who is a bit of a protector of the industry, I don’t want people who are not suited for technology. So really decide if you have the personality for tech. Are you a problem solver? Are you more logical than emotional? Do you constantly find yourself creating processes? If so, no matter your background, I think you can find a home in tech. —Michael Scott Winslow - -It is not going to be simple. Your progress will be slowed because of your race. You will have to work harder. Use this adversity as a strength. You will be better prepared than those around you and when the opportunity arises, you will be able to tackle it. Find a network of those who look like you. Air grievances in private and show strength in public. You belong and you can succeed. —Bryan Liles - -To think beyond working for a company, the field of public interest tech is growing, our work centers on how technology impacts real people. Many of the people leading this work are women of color and Black women are making huge strides. Mutale Nkonde - -### What does Black History Month mean to you? - -It means never stop because you can never forget. —Tameika Reed - -Black History Month to me means focusing on the Tuskegee Airmen and not slavery. Highlighting how we contributed to history and not how were victims of it. I want people to understand where our pride comes from and not our anger. There are a lot of really bad things that happened to our people and we are still right here. Strong! —Michael Scott Winslow - -Black History Month is a time to reflect on the forgotten history of black people in the United States. I take it as a time to be thankful for the sacrifices my ancestors made. —Bryan Liles - -It is a time to center the contributions black people have made across the globe. I love it, it is one of my favorite times of year. —Mutale Nkonde - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/2/careers-tech-minorities - -作者:[Shilla Saebi][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/shillasaebi -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/meeting-team-listen-communicate.png?itok=KEBP6vZ_ (Team meeting) -[2]: https://www.linkedin.com/in/tameika-reed-1a7290128/ -[3]: https://twitter.com/michaelswinslow -[4]: https://twitter.com/bryanl -[5]: https://twitter.com/mutalenkonde -[6]: https://twitter.com/WomenInLinux -[7]: https://twitter.com/kelseyhightower -[8]: https://twitter.com/RealGeneKim -[9]: https://en.wikipedia.org/wiki/Dorothy_Vaughan -[10]: https://twitter.com/techgirl1908 -[11]: https://twitter.com/kstewart -[12]: https://twitter.com/tiffani -[13]: https://twitter.com/EricaJoy -[14]: https://twitter.com/ArlanWasHere -[15]: https://twitter.com/blkintechnology -[16]: https://twitter.com/digundiv -[17]: http://algorithmsofoppression.com/ diff --git a/sources/tech/20200304 Getting started with the Gutenberg editor in Drupal.md b/sources/tech/20200304 Getting started with the Gutenberg editor in Drupal.md deleted file mode 100644 index 6050adebfa..0000000000 --- a/sources/tech/20200304 Getting started with the Gutenberg editor in Drupal.md +++ /dev/null @@ -1,122 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Getting started with the Gutenberg editor in Drupal) -[#]: via: (https://opensource.com/article/20/3/gutenberg-editor-drupal) -[#]: author: (MaciejLukianski https://opensource.com/users/maciejlukianski) - -Getting started with the Gutenberg editor in Drupal -====== -Learn how to use the WYSIWYG editor, made popular in WordPress, with -Drupal. -![Text editor on a browser, in blue][1] - -Since 2017, WordPress has had a really great WYSIWYG editor in the [Gutenberg][2] plugin. But the Drupal community hasn't yet reached consensus on the best approach to the content management system's (CMS) editorial experience. But a strong new option appeared when, with a lot of community effort, [Gutenberg was integrated with Drupal][3]. - -Previously, there were two main approaches to content creation in Drupal 8: - - * In the [**Paragraph-based approach**][4], content is assembled out of entities called paragraphs. Currently, approximately 100,000 websites use the Paragraphs module (according to Drupal). - * The [**Layout-Builder approach**][5] uses an editorial tool shipped with Drupal 8.5. It is still undergoing improvements, but it is the next strong contender because it is really well integrated with the Drupal core. Stats on usage are not available since Layout Builder is part of Drupal. - - - -At the end of 2018, the Drupal community, lead by Fronkom (a Norwegian digital agency strongly focused on open source solutions), ported the WordPress Gutenberg project as a contributed module into Drupal. Let's take a look at how Gutenberg works in Drupal (including some cool Drupal-specific integrations). - -### Installation - -Installing the [Gutenberg module][6] is as straightforward as installing any Drupal module, and it has good [installation documentation][7]. - -### Configuration - -Gutenberg is integrated into Drupal's default content-entity creation workflow. You can use it on any of the content types you choose, provided that the content type has at least one text area field, which is where the Gutenberg editor's output will be saved. - -To enable the Gutenberg project on a content type in Drupal, you have to navigate to its settings: **Structure > Content types** and, from the dropdown next to the content type where you want to use Gutenberg, click **Edit**. - -![Drupal settings][8] - -In the form that appears, scroll down and select the **Gutenberg experience** tab on the left, where you can find the settings described below. Select the **Enable Gutenberg experience** box. - -![Drupal Gutenberg settings][9] - -#### Template - -This is one of the cool features that is not available in WordPress out of the box. It enables you to define a template for a new page in a JSON structure. This will pre-populate all newly created articles with dummy placeholder content, which will help editors structure content correctly. In the screenshot above, I added a heading and a paragraph. Note that any double-quotes have to be escaped. - -#### Template lock - -This setting allows you to define whether users are allowed to delete the placeholder content, add new blocks, or just edit the existing, pre-populated content. - -#### Allowed Gutenberg and Drupal blocks - -This is another super-cool feature on the Drupal side of Gutenberg. Drupal allows users to create various types of blocks to design a page. For example, you could create a block with a list of the five latest blog posts, the most recent comments, or a form to collect users' emails. - -Gutenberg's deep integration with Drupal allows users to select which Drupal blocks are available to users while they are editing (e.g., limit embeds to YouTube) and use blocks as inline content. This is a very handy feature that allows granular control of the user experience. - -There's not much to choose from in a blank Drupal installation, but a live site usually has many blocks that provide various functionalities. In the screenshot below, the **Search form** Drupal block is selected. - -![Drupal Gutenberg blocks][10] - -After you finish the configuration, hit **Save content type**. - -### Publishing content with Drupal Gutenberg - -When Gutenberg is enabled for a content type, it takes over most of the editorial experience. - -![Drupal Gutenberg content screen][11] - -In the main window, you can see the dummy placeholder content I added in the Template configuration above. - -#### Drupal-specific options - -On the right-hand side, there are a few fields and settings that Drupal provides. For example, the **Title** field is a required separate field in Drupal, and therefore it is not on the main Gutenberg screen. - -Underneath the **Title**, there are additional settings that can vary, depending on the modules installed and options set up in Drupal. You can see **Revision log messages**, **Menu settings**, **Comment settings**, and a place to add a **URL alias**. - -Typically, Drupal content types are composed of several text fields, such as tags, categories, checkboxes, image fields for teasers, etc. When you enable Gutenberg for a content type, these additional fields are available in the **More settings** tab. - -You can now add your content—it works the same as it does in WordPress Gutenberg, with the additional option to add Drupal blocks. - -In the screenshot below, you can see what happens when I add some text to replace the placeholder text, a search block from Drupal, a title, tags, and a custom URL alias. - -![Drupal Gutenberg entering text][12] - -After you hit **Save**, your content will be published. - -![Drupal Gutenberg output][13] - -And that is it. It works like a charm! - -### Working together for better software experiences - -Gutenberg in Drupal works well. It is an alternative option that allows editors to control the look and feel of their websites down to the tiniest details. Adoption is growing well, with over 1,000 installations as of this writing and 50 new ones every month. The Drupal integration adds other cool features like fine-grained permissions, placeholder content, and the ability to include Drupal blocks inline, which aren't available in the WordPress plugin. - -It is great to see the communities of two separate projects working together to achieve the common goal of giving people better software. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/3/gutenberg-editor-drupal - -作者:[MaciejLukianski][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/maciejlukianski -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png?itok=lcf-m6N7 (Text editor on a browser, in blue) -[2]: https://wordpress.org/plugins/gutenberg/ -[3]: https://drupalgutenberg.org/ -[4]: https://www.droptica.com/blog/flexible-and-easy-content-creation-drupal-paragraphs-module/ -[5]: https://www.droptica.com/blog/layout-builder-building-drupal-8-layouts/ -[6]: https://www.drupal.org/project/gutenberg -[7]: https://www.drupal.org/docs/8/extending-drupal-8/installing-drupal-8-modules -[8]: https://opensource.com/sites/default/files/uploads/gutenberg_edit.png (Drupal settings) -[9]: https://opensource.com/sites/default/files/uploads/gutenberg_settings.png (Drupal Gutenberg settings) -[10]: https://opensource.com/sites/default/files/uploads/gutenberg_blocks.png (Drupal Gutenberg blocks) -[11]: https://opensource.com/sites/default/files/uploads/gutenberg_contentwindow.png (Drupal Gutenberg content screen) -[12]: https://opensource.com/sites/default/files/uploads/gutenberg_entry.png (Drupal Gutenberg entering text) -[13]: https://opensource.com/sites/default/files/uploads/gutenberg-demo.png (Drupal Gutenberg output) diff --git a/sources/tech/20200310 Getting started with Emacs.md b/sources/tech/20200310 Getting started with Emacs.md deleted file mode 100644 index bb5ceffb86..0000000000 --- a/sources/tech/20200310 Getting started with Emacs.md +++ /dev/null @@ -1,181 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Getting started with Emacs) -[#]: via: (https://opensource.com/article/20/3/getting-started-emacs) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Getting started with Emacs -====== -10 tips for diving into the world of this useful group of open source -text editors. -![Computer keyboard typing][1] - -Many people say they want to learn [Emacs][2], but many of them shy away after the briefest encounter. It's not because Emacs is bad or even that complex. The problem, I believe, is that people don't actually want to learn Emacs; they want to be comfortable with Emacs traditions. They want to understand the arcane keyboard shortcuts and unfamiliar terminology. They want to use Emacs as they believe it's "meant to be used." - -I sympathize with this because that's how I felt about Emacs. I thought that all true Emacs users only ran it inside a terminal, and never used arrow keys or menus, much less a mouse. That's a great way to discourage yourself from getting started with Emacs. There are enough unique .emacs config files out there to prove that if there's one common strain among Emacs users, it's that everyone uses Emacs differently. - -Learning Emacs is easy. It's loving Emacs that's hard. To love Emacs, you have to discover the features it has that you've been looking for, sometimes without knowing you've been missing them. And that takes experience. - -The only way to get that experience is to start at the beginning—by actively using Emacs. Here are ten tips to help you figure out what works best for you. - -### Start with the GUI - -One of the greatest things about Emacs (and its friendly competitor, [Vim][3], too) is that it can be run in a terminal, which is useful when you SSH into a server, but not very significant on computers built within the last 15 years or so. The GUI version of Emacs can be run on extremely [low-powered devices][4], and it has lots of pragmatic features that both novice and experienced users can appreciate. - -For example, if you don't know how to copy a word with just keyboard shortcuts in Emacs, the Edit menu's Copy, Cut, and Paste selections provide the path of least resistance. There's no reason to punish yourself for choosing Emacs. Use its menus, use your mouse to select regions and click in-buffer buttons, and don't let unfamiliarity stand in your way of being productive. - -![Emacs slackware][5] - -These features are built into Emacs because users use them. You should use them when you need them and work your way up to the obscure commands you think you might need when you eventually use Emacs over SSH on a VT100 terminal with no Alt or arrow keys. - -### Get used to the terminology - -Emacs has special terms for its UI elements. The evolution of personal computing didn't build upon the same terms, so many are relatively foreign to the modern computer user, and others are the same but have different meanings. Here are some of the most common terms: - - * Frame: In Emacs, the frame is what modern computing calls a "window." - * Buffer: A buffer is a communication channel for Emacs. It may serve as a command-line for an Emacs process, or a shell, or just the contents of a file. - * Window: A window is your view into a buffer. - * Mini-buffer: The primary command-line, located at the bottom of the Emacs window. - - - -![Emacs tutorial map][6] - -### Making sense of Emacs modifier keys - -On a PC keyboard, the Ctrl key is referred to as C, and the Alt key is referred to as M. These aren't the C and M keys, and because they're always paired with an accompanying letter or symbol key, they're easy to recognize in the documentation. - -For example, C-x means Ctrl+X in modern keyboard notation, and M-x is Alt+X. You press the keys together just as you do when you're cutting text from any application. - -There's another level of keyboard shortcuts, though, quite unlike anything on modern computers. Sometimes, a keyboard shortcut isn't just one key combo and instead consists of a series of key presses. - -For instance, C-x C-f means to press Ctrl+X as usual, and then Ctrl+C as usual. - -Sometimes, a keyboard shortcut has a mixture of key types. The combo C-x 3 means to press Ctrl+X as usual, and then the number 3 key. - -The way Emacs can do these fancy power combos is because certain keys put Emacs into a special command mode. If you press C-X (that's Ctrl+X), you're telling Emacs to enter an idle state, waiting for a second key or keyboard shortcut. - -Emacs documentation, both official and unofficial, is full of keyboard shortcuts. Practice mentally translating C to Ctrl and M to Alt, and all those docs will make a lot more sense to you. - -### Alternate shortcuts for cut, copy, and paste - -Canonically, copying text is performed with a series of keyboard shortcuts that depend on how you want to copy or cut. - -For instance, you can cut a whole word with M-d (Emacs lingo for Alt+d), or a whole line with C-k (Ctrl+K), or a highlighted region with M-m (Alt+M). You can get used to that if you want, but if you like Ctrl+C and Ctrl+X and Ctrl-V, then you can use those instead. - -Enabling modern cut-copy-paste requires activating a feature called CUA (Common User Access). To activate CUA, click on the Options menu and select Use CUA Keys. With this enabled, C-c copies highlighted text, C-x cuts highlighted text, and C-v pastes text. This mode is only actually active when you've selected text, so you can still learn the usual C-x and C-c bindings that Emacs normally uses. - -### It's OK to share - -Emacs is an application and has no awareness of your feelings or loyalty towards it. If you want to use Emacs only for tasks that "feel" right for Emacs, and different editor (like Vim) for other tasks, you can do that. - -Your interactions with an application influence how you work, so if the pattern of keypresses required in Emacs doesn't agree with a specific task, then don't force yourself to use Emacs for that task. Emacs is just one of many open source tools available to you, and there's no reason to limit yourself to just one tool. - -### Explore new functions - -Most of what Emacs does is an elisp function that can be invoked from a menu selection, keyboard shortcut, or in some cases, a specific event. All functions can be executed from the mini-buffer (the command-line at the bottom of the Emacs frame). You could, in theory, even navigate your cursor by typing in functions like **forward-word** and **backward-word** and **next-line** and **previous-line**, and so on. It would be unbearably inefficient, but that's the kind of direct access to the code you're running. In a way, Emacs is its own API. - -You can find out about new functions by reading about Emacs on community blogs, or you can take a more direct approach and use the describe-function function. To get help on any function, press M-x (that's Alt+X) and then type describe-function, and then press Return or Enter. You are prompted for a function name, and then shown a description of that function. - -You can get a list of all available functions by typing M-x (Alt+X), followed by ?. - -You can also get pop-up descriptions of functions as you type them by pressing M-x and then typing **auto-complete-mode**, and then pressing Return or Enter. With this mode active, as you type any Emacs function into your document, you're offered auto-completion options, along with a description of the function. - -![Emacs function][7] - -When you find a useful function and use it, Emacs tells you the keyboard binding for it, if one is set. If one doesn't exist, you can assign one yourself by opening your $HOME/.emacs configuration file and entering a keyboard shortcut assignment. The syntax is global-set-key, followed by the keyboard shortcut you want to use, followed by the function you want to invoke. - -For example, to assign the screenwriter-slugline function to a keyboard binding: - - -``` -`(global-set-key (kbd “C-c s”) 'screenwriter-slugline)` -``` - -Reload your configuration file, and the keyboard shortcut is available to you: - - -``` -`M-x load-file ~/.emacs` -``` - -### Panic button - -As you use Emacs and try new functions, you're bound to start invoking something you didn't mean to invoke. The universal panic button in Emacs is C-g (that's Ctrl+G). -I remember this by associating G with GNU, and I imagine I'm calling upon GNU to rescue me from a poor decision, but feel free to make up your own mnemonic. - -If you press C-g a few times, the Emacs mini-buffer returns to a latent state, pop-up windows are hidden, and you're back to the safety of a plain old boring text editor. - -### Ignore the keyboard shortcuts - -There are too many potential keyboard shortcuts to summarize them all here, much less for you ever to hope to memorize. That's by design. Emacs is meant to be customized, and when people write plugins for Emacs, they get to define their own special keyboard shortcuts. - -The idea isn't to memorize all shortcuts right away. Your goal, instead, is to get comfortable using Emacs. The more comfortable you become in Emacs, the more you'll get tired of resorting to the menu bar all the time, and you'll start to memorize the combos important to you. - -Everyone has their own favorite shortcuts based on what they typically do in Emacs. Someone who spends all day writing code in Emacs may know all the keyboard shortcuts for running a debugger or for launching language-specific modes, but know nothing about Org-mode or Artist-mode. It's natural, and it's fine. - -### Practice Emacs when you use Bash - -One advantage to knowing Emacs keyboard shortcuts is that many of them also apply in Bash: - - * C-a—go to the beginning of a line - * C-e—go to the end of a line - * C-k—cut the whole line - * M-f—go forward a word - * M-b—go back a word - * M-d—cut a word - * C-y—yank back (paste) the most recently cut content - * M-Shift-U—capitalize a word - * C-t—swap two characters (for example, sl becomes ls) - - - -There are many more examples, and it an make your interactions with your Bash terminal faster than you ever imagined. - -### Packages - -Emacs has a built-in package manager to help you discover new plugins. Its package manager contains modes to help you edit specific types of text (for instance, if you edit JSON files frequently, you might try ejson-mode), embedded applications, themes, spellchecking options, linters, and more. This is where Emacs has the potential to become crucial to your daily computing; once you find a great Emacs package, you may not be able to live without it. - -![Emacs emoji][8] - -You can browse packages by pressing M-x (that's Alt+X) and then typing **package-list-packages** command and then pressing Return or Enter. The package manager updates its cache each time you launch it, so be patient the first time you use it while it downloads a list of available packages. Once loaded, you can navigate with your keyboard or mouse (remember, Emacs is a GUI application). Each package name is a button, so either move your cursor over it and press Return or just click it with your mouse. You can read about the package in the new window that appears in your Emacs frame, and then install it with the Install button. - -Some packages need special configuration, which is sometimes listed in its description, but other times require you to visit the package's home page to read more about it. For example, the auto-complete package ac-emoji installs easily but requires you to have a symbol font defined. It works either way, but you only see the corresponding emoji if you have the font installed, and you might not know that unless you visit its homepage. - -### Tetris - -Emacs has games, believe it or not. There's Sudoku, quizzes, minesweeper, a just-for-fun psychotherapist, and even Tetris. These aren't particularly useful, but interacting with Emacs on any level is great practice, and games are a great way to maximize your time spent in Emacs. - -![Emacs tetris][9] - -Tetris is also how I was introduced to Emacs in the first place, so of all versions of the game, it's the Emacs version that's truly my favorite. - -### Using Emacs - -GNU Emacs is popular because it's impossibly flexible and highly extensible. People get so accustomed to Emacs keyboard shortcuts that they habitually try to use them in all other applications, and they build applications into Emacs, so they never have to leave in the first place. If you want Emacs to play an important role in your computing life, the ultimate key is to embrace the unknown and start using Emacs. Stumble through it until you've discovered how to make it work for you, and then settle in for 40 years of comfort. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/3/getting-started-emacs - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/keyboaord_enter_writing_documentation.jpg?itok=kKrnXc5h (Computer keyboard typing) -[2]: https://opensource.com/downloads/emacs-cheat-sheet -[3]: https://opensource.com/downloads/cheat-sheet-vim -[4]: https://opensource.com/article/17/2/pocketchip-or-pi -[5]: https://opensource.com/sites/default/files/uploads/emacs-slackware.jpg (Emacs slackware) -[6]: https://opensource.com/sites/default/files/uploads/emacs-tutorial-map.png (Emacs tutorial map) -[7]: https://opensource.com/sites/default/files/uploads/emacs-function.jpg (Emacs function) -[8]: https://opensource.com/sites/default/files/uploads/emacs-emoji_0.jpg (Emacs emoji) -[9]: https://opensource.com/sites/default/files/uploads/emacs-tetris.jpg (Emacs tetris) diff --git a/sources/tech/20200316 How to upload an OpenStack disk image to Glance.md b/sources/tech/20200316 How to upload an OpenStack disk image to Glance.md deleted file mode 100644 index 82fb71244b..0000000000 --- a/sources/tech/20200316 How to upload an OpenStack disk image to Glance.md +++ /dev/null @@ -1,848 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to upload an OpenStack disk image to Glance) -[#]: via: (https://opensource.com/article/20/3/glance) -[#]: author: (Jair Patete https://opensource.com/users/jpatete) - -How to upload an OpenStack disk image to Glance -====== -Make images available to your private cloud, and more. -![blank background that says your image here][1] - -[Glance][2] is an image service that allows you to discover, provide, register, or even delete disk and/or server images. It is a fundamental part of managing images on [OpenStack][3] and [TripleO][4] (which stands for "OpenStack-On-OpenStack"). - -If you have used a recent version of the OpenStack platform, you may already have launched your first Overcloud using TripleO, as you interact with Glance when uploading the Overcloud disk images inside the Undercloud's OpenStack (i.e., the node inside your cloud that is used to install the Overcloud, add/delete nodes, and do some other handy things). - -In this article, I'll explain how to upload an image to Glance. Uploading an image to the service makes it available for the instances in your private cloud. Also, when you're deploying an Overcloud, it makes the image(s) available so the bare-metal nodes can be deployed using them. - -In an Undercloud, execute the following command: - - -``` -`$ openstack overcloud image upload --image-path /home/stack/images/` -``` - -This uploads the following Overcloud images to Glance: - - 1. overcloud-full - 2. overcloud-full-initrd - 3. overcloud-full-vmlinuz - - - -After some seconds, the images will upload successfully. Check the result by running: - - -``` -(undercloud) [stack@undercloud ~]$ openstack image list -+--------------------------------------+------------------------+--------+ -| ID                                   | Name                   | Status | -+--------------------------------------+------------------------+--------+ -| 09ca88ea-2771-459d-94a2-9f87c9c393f0 | overcloud-full         | active | -| 806b6c35-2dd5-478d-a384-217173a6e032 | overcloud-full-initrd  | active | -| b2c96922-161a-4171-829f-be73482549d5 | overcloud-full-vmlinuz | active | -+--------------------------------------+------------------------+--------+ -``` - -This is a mandatory and easy step in the process of deploying an Overcloud, and it happens within seconds, which makes it hard to see what's under the hood. But what if you want to know what is going on? - -One thing to keep in mind: Glance works using client-server communication carried through REST APIs. Therefore, you can see what is going on by using [tcpdump][5] to take some TCP packets. - -Another thing that is important: There is a database (there's always a database, right?) that is shared among all the OpenStack platform components, and it contains all the information that Glance (and other components) needs to operate. (In my case, MariaDB is the backend.) I won't get into how to access the SQL database, as I don't recommend playing around with it, but I will show what the database looks like during the upload process. (This is an entirely-for-test OpenStack installation, so there's no need to play with the database in this example.) - -### The database - -The basic flow of this example exercise is: - -_Image Created -> Image Queued -> Image Saved -> Image Active_ - -You need permission to go through this flow, so first, you must ask OpenStack's identity service, [Keystone][6], for authorization. My Keystone catalog entry looks like this; as I'm in the Undercloud, I'll hit the public endpoint: - - -``` -| keystone  | identity       | regionOne                           | -|           |                |   public: | -|           |                | regionOne                           | -|           |                |   internal: | -|           |                | regionOne                           | -|           |                |   admin:   | -``` - -And for Glance: - - -``` -| glance    | image    | regionOne                              | -|           |          |   public:    | -|           |          | regionOne                              | -|           |          |   internal:    | -|           |          | regionOne                              | -|           |          |   admin:       | -``` - -I'll hit those ports and TCP port 3306 in the capture; the latter is so I can capture what's going on with the SQL database. To capture the packets, use the tcpdump command: - - -``` -`$ tcpdump -nvs0 -i ens3 host 172.16.0.20 and port 13000 or port 3306 or port 13292` -``` - -Under the hood, this looks like: - -Authentication: - -**Initial request (discovery of API Version Information):** - - -``` -`https://172.16.0.20:13000 "GET / HTTP/1.1"` -``` - -**Response:** - - -``` -Content-Length: 268 Content-Type: application/json Date: Tue, 18 Feb 2020 04:49:55 GMT Location: Server: Apache Vary: X-Auth-Token x-openstack-request-id: req-6edc6642-3945-4fd0-a0f7-125744fb23ec - -{ -   "versions":{ -      "values":[ -         { -            "id":"v3.13", -            "status":"stable", -            "updated":"2019-07-19T00:00:00Z", -            "links":[ -               { -                  "rel":"self", -                  "href":"" -               } -            ], -            "media-types":[ -               { -                  "base":"application/json", -                  "type":"application/vnd.openstack.identity-v3+json" -               } -            ] -         } -      ] -   } -} -``` - -**Authentication request** - - -``` -`https://172.16.0.20:13000 "POST /v3/auth/tokens HTTP/1.1"` -``` - -After this step, a token is assigned for the admin user to use the services. (The token cannot be displayed for security reasons.) The token tells the other services something like: "I've already logged in with the proper credentials against Keystone; please let me go straight to the service and ask no more questions about who I am." - -At this point, the command: - - -``` -`$ openstack overcloud image upload --image-path /home/stack/images/` -``` - -executes, and it is authorized to upload the image to the Glance service. - -The current status is: - -_**Image Created**_ _-> Image Queued -> Image Saved -> Image Active_ - -The service checks whether this image already exists: - - -``` -`https://172.16.0.20:13292 "GET /v2/images/overcloud-full-vmlinuz HTTP/1.1"` -``` - -From the client's point of view, the request looks like: - - -``` -`curl -g -i -X GET -H 'b'Content-Type': b'application/octet-stream'' -H 'b'X-Auth-Token': b'gAAAAABeS2zzWzAZBqF-whE7SmJt_Atx7tiLZhcL8mf6wJPrO3RBdv4SdnWImxbeSQSqEQdZJnwBT79SWhrtt7QDn-2o6dsAtpUb1Rb7w6xe7Qg_AHQfD5P1rU7tXXtKu2DyYFhtPg2TRQS5viV128FyItyt49Yn_ho3lWfIXaR3TuZzyIz38NU'' -H 'User-Agent: python-glanceclient' -H 'Accept-Encoding: gzip, deflate' -H 'Accept: */*' -H 'Connection: keep-alive'  --cacert /etc/pki/ca-trust/source/anchors/cm-local-ca.pem  --cert None --key None https://172.16.0.20:13292/v2/images/overcloud-full-vmlinuz` -``` - -Here, you can see the fernet token, the user-agent indicating Glance is speaking, and the TLS certificate; this is why you don't see anything in your tcpdump. - -Since the image does not exist, it is OK to get a 404 ERROR for this request. - -Next, the current images are consulted: - - -``` -`https://172.16.0.20:13292 "GET /v2/images?limit=20 HTTP/1.1" 200 78` -``` - -and retrieved from the service: - - -``` -HTTP/1.1 200 OK -Content-Length: 78 -Content-Type: application/json -X-Openstack-Request-Id: req-0f117984-f427-4d35-bec3-956432865dd1 -Date: Tue, 18 Feb 2020 04:49:55 GMT - -{ -   "images":[ - -   ], -   "first":"/v2/images?limit=20", -   "schema":"/v2/schemas/images" -} -``` - -Yes, it is still empty. - -Meanwhile, the same check has been done on the database, where a huge query has been triggered with the same results. (To sync on the timestamp, I checked on the tcpdump after the connection and queries were finished, and then compared them with the API calls' timestamp.) - -To identify where the Glance-DB calls started, I did a full-packet search with the word "glance" inside the tcpdump file. This saves a lot of time vs. searching through all the other database calls, so this is my starting point to check each database call. - -![Searching "glance" inside tcpdump][7] - -The first query returns nothing in the fields, as the image still does not exist: - - -``` -SELECT images.created_at AS images_created_at, images.updated_at AS images_updated_at, images.deleted_at AS images_deleted_at, images.deleted AS images_deleted, images.id AS images_id, images.name AS images_name, images.disk_format AS images_disk_format, images.container_format AS images_container_format, images.size AS images_size, images.virtual_size AS images_virtual_size, images.status AS images_status, images.visibility AS images_visibility, images.checksum AS images_checksum, images.os_hash_algo AS images_os_hash_algo, images.os_hash_value AS images_os_hash_value, images.min_disk AS images_min_disk, images.min_ram AS images_min_ram, images.owner AS images_owner, images.protected AS images_protected, images.os_hidden AS images_os_hidden, image_properties_1.created_at AS image_properties_1_created_at, image_properties_1.updated_at AS image_properties_1_updated_at, image_properties_1.deleted_at AS image_properties_1_deleted_at, image_properties_1.deleted AS image_properties_1_deleted, image_properties_1.id AS image_properties_1_id, image_properties_1.image_id AS image_properties_1_image_id, image_properties_1.name AS image_properties_1_name, image_properties_1.value AS image_properties_1_value, image_locations_1.created_at AS image_locations_1_created_at, image_locations_1.updated_at AS image_locations_1_updated_at, image_locations_1.deleted_at AS image_locations_1_deleted_at, image_locations_1.deleted AS image_locations_1_deleted, image_locations_1.id AS image_locations_1_id, image_locations_1.image_id AS image_locations_1_image_id, image_locations_1.value AS image_locations_1_value, image_locations_1.meta_data AS image_locations_1_meta_data, image_locations_1.status AS image_locations_1_status -FROM images LEFT OUTER JOIN image_properties AS image_properties_1 ON images.id = image_properties_1.image_id LEFT OUTER JOIN image_locations AS image_locations_1 ON images.id = image_locations_1.image_id -WHERE images.id = 'overcloud-full-vmlinuz' -``` - -Next, the image will start uploading, so an API call and a write to the database are expected. - -On the API side, the image scheme is retrieved by consulting the service in: - - -``` -`https://172.16.0.20:13292 "GET /v2/schemas/image HTTP/1.1"` -``` - -Then, some of the fields are populated with image information. This is what the scheme looks like: - - -``` -{ -   "name":"image", -   "properties":{ -      "id":{ -         "type":"string", -         "description":"An identifier for the image", -         "pattern":"^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$" -      }, -      "name":{ -         "type":[ -            "null", -            "string" -         ], -         "description":"Descriptive name for the image", -         "maxLength":255 -      }, -      "status":{ -         "type":"string", -         "readOnly":true, -         "description":"Status of the image", -         "enum":[ -            "queued", -            "saving", -            "active", -            "killed", -            "deleted", -            "uploading", -            "importing", -            "pending_delete", -            "deactivated" -         ] -      }, -      "visibility":{ -         "type":"string", -         "description":"Scope of image accessibility", -         "enum":[ -            "community", -            "public", -            "private", -            "shared" -         ] -      }, -      "protected":{ -         "type":"boolean", -         "description":"If true, image will not be deletable." -      }, -      "os_hidden":{ -         "type":"boolean", -         "description":"If true, image will not appear in default image list response." -      }, -      "checksum":{ -         "type":[ -            "null", -            "string" -         ], -         "readOnly":true, -         "description":"md5 hash of image contents.", -         "maxLength":32 -      }, -      "os_hash_algo":{ -         "type":[ -            "null", -            "string" -         ], -         "readOnly":true, -         "description":"Algorithm to calculate the os_hash_value", -         "maxLength":64 -      }, -      "os_hash_value":{ -         "type":[ -            "null", -            "string" -         ], -         "readOnly":true, -         "description":"Hexdigest of the image contents using the algorithm specified by the os_hash_algo", -         "maxLength":128 -      }, -      "owner":{ -         "type":[ -            "null", -            "string" -         ], -         "description":"Owner of the image", -         "maxLength":255 -      }, -      "size":{ -         "type":[ -            "null", -            "integer" -         ], -         "readOnly":true, -         "description":"Size of image file in bytes" -      }, -      "virtual_size":{ -         "type":[ -            "null", -            "integer" -         ], -         "readOnly":true, -         "description":"Virtual size of image in bytes" -      }, -      "container_format":{ -         "type":[ -            "null", -            "string" -         ], -         "description":"Format of the container", -         "enum":[ -            null, -            "ami", -            "ari", -            "aki", -            "bare", -            "ovf", -            "ova", -            "docker", -            "compressed" -         ] -      }, -      "disk_format":{ -         "type":[ -            "null", -            "string" -         ], -         "description":"Format of the disk", -         "enum":[ -            null, -            "ami", -            "ari", -            "aki", -            "vhd", -            "vhdx", -            "vmdk", -            "raw", -            "qcow2", -            "vdi", -            "iso", -            "ploop" -         ] -      }, -      "created_at":{ -         "type":"string", -         "readOnly":true, -         "description":"Date and time of image registration" -      }, -      "updated_at":{ -         "type":"string", -         "readOnly":true, -         "description":"Date and time of the last image modification" -      }, -      "tags":{ -         "type":"array", -         "description":"List of strings related to the image", -         "items":{ -            "type":"string", -            "maxLength":255 -         } -      }, -      "direct_url":{ -         "type":"string", -         "readOnly":true, -         "description":"URL to access the image file kept in external store" -      }, -      "min_ram":{ -         "type":"integer", -         "description":"Amount of ram (in MB) required to boot image." -      }, -      "min_disk":{ -         "type":"integer", -         "description":"Amount of disk space (in GB) required to boot image." -      }, -      "self":{ -         "type":"string", -         "readOnly":true, -         "description":"An image self url" -      }, -      "file":{ -         "type":"string", -         "readOnly":true, -         "description":"An image file url" -      }, -      "stores":{ -         "type":"string", -         "readOnly":true, -         "description":"Store in which image data resides.  Only present when the operator has enabled multiple stores.  May be a comma-separated list of store identifiers." -      }, -      "schema":{ -         "type":"string", -         "readOnly":true, -         "description":"An image schema url" -      }, -      "locations":{ -         "type":"array", -         "items":{ -            "type":"object", -            "properties":{ -               "url":{ -                  "type":"string", -                  "maxLength":255 -               }, -               "metadata":{ -                  "type":"object" -               }, -               "validation_data":{ -                  "description":"Values to be used to populate the corresponding image properties. If the image status is not 'queued', values must exactly match those already contained in the image properties.", -                  "type":"object", -                  "writeOnly":true, -                  "additionalProperties":false, -                  "properties":{ -                     "checksum":{ -                        "type":"string", -                        "minLength":32, -                        "maxLength":32 -                     }, -                     "os_hash_algo":{ -                        "type":"string", -                        "maxLength":64 -                     }, -                     "os_hash_value":{ -                        "type":"string", -                        "maxLength":128 -                     } -                  }, -                  "required":[ -                     "os_hash_algo", -                     "os_hash_value" -                  ] -               } -            }, -            "required":[ -               "url", -               "metadata" -            ] -         }, -         "description":"A set of URLs to access the image file kept in external store" -      }, -      "kernel_id":{ -         "type":[ -            "null", -            "string" -         ], -         "pattern":"^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$", -         "description":"ID of image stored in Glance that should be used as the kernel when booting an AMI-style image.", -         "is_base":false -      }, -      "ramdisk_id":{ -         "type":[ -            "null", -            "string" -         ], -         "pattern":"^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$", -         "description":"ID of image stored in Glance that should be used as the ramdisk when booting an AMI-style image.", -         "is_base":false -      }, -      "instance_uuid":{ -         "type":"string", -         "description":"Metadata which can be used to record which instance this image is associated with. (Informational only, does not create an instance snapshot.)", -         "is_base":false -      }, -      "architecture":{ -         "description":"Operating system architecture as specified in ", -         "type":"string", -         "is_base":false -      }, -      "os_distro":{ -         "description":"Common name of operating system distribution as specified in ", -         "type":"string", -         "is_base":false -      }, -      "os_version":{ -         "description":"Operating system version as specified by the distributor.", -         "type":"string", -         "is_base":false -      }, -      "description":{ -         "description":"A human-readable string describing this image.", -         "type":"string", -         "is_base":false -      }, -      "cinder_encryption_key_id":{ -         "description":"Identifier in the OpenStack Key Management Service for the encryption key for the Block Storage Service to use when mounting a volume created from this image", -         "type":"string", -         "is_base":false -      }, -      "cinder_encryption_key_deletion_policy":{ -         "description":"States the condition under which the Image Service will delete the object associated with the 'cinder_encryption_key_id' image property.  If this property is missing, the Image Service will take no action", -         "type":"string", -         "enum":[ -            "on_image_deletion", -            "do_not_delete" -         ], -         "is_base":false -      } -   }, -   "additionalProperties":{ -      "type":"string" -   }, -   "links":[ -      { -         "rel":"self", -         "href":"{self}" -      }, -      { -         "rel":"enclosure", -         "href":"{file}" -      }, -      { -         "rel":"describedby", -         "href":"{schema}" -      } -   ] -} -``` - -That's a long scheme! - -Here is the API call to start uploading the image information, and it will now move to the "queue" state: - - -``` -`curl -g -i -X POST -H 'b'Content-Type': b'application/json'' -H 'b'X-Auth-Token': b'gAAAAABeS2zzWzAZBqF-whE7SmJt_Atx7tiLZhcL8mf6wJPrO3RBdv4SdnWImxbeSQSqEQdZJnwBT79SWhrtt7QDn-2o6dsAtpUb1Rb7w6xe7Qg_AHQfD5P1rU7tXXtKu2DyYFhtPg2TRQS5viV128FyItyt49Yn_ho3lWfIXaR3TuZzyIz38NU'' -H 'User-Agent: python-glanceclient' -H 'Accept-Encoding: gzip, deflate' -H 'Accept: */*' -H 'Connection: keep-alive'  --cacert /etc/pki/ca-trust/source/anchors/cm-local-ca.pem  --cert None --key None -d '{"name": "overcloud-full-vmlinuz", "disk_format": "aki", "visibility": "public", "container_format": "bare"}' https://172.16.0.20:13292/v2/images` -``` - -Here is the API response: - - -``` -HTTP/1.1 201 Created -Content-Length: 629 -Content-Type: application/json -Location: -Openstack-Image-Import-Methods: web-download -X-Openstack-Request-Id: req-bd5194f0-b1c2-40d3-a646-8a24ed0a1b1b -Date: Tue, 18 Feb 2020 04:49:56 GMT - -{ -   "name":"overcloud-full-vmlinuz", -   "disk_format":"aki", -   "container_format":"bare", -   "visibility":"public", -   "size":null, -   "virtual_size":null, -   "status":"queued", -   "checksum":null, -   "protected":false, -   "min_ram":0, -   "min_disk":0, -   "owner":"c0a46a106d3341649a25b10f2770aff8", -   "os_hidden":false, -   "os_hash_algo":null, -   "os_hash_value":null, -   "id":"13892850-6add-4c28-87cd-6da62e6f8a3c", -   "created_at":"2020-02-18T04:49:55Z", -   "updated_at":"2020-02-18T04:49:55Z", -   "tags":[ - -   ], -   "self":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c", -   "file":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c/file", -   "schema":"/v2/schemas/image" -} -``` - -and the SQL call to store the information in the Glance-DB: - - -``` -`INSERT INTO images (created_at, updated_at, deleted_at, deleted, id, name, disk_format, container_format, SIZE, virtual_size, STATUS, visibility, checksum, os_hash_algo, os_hash_value, min_disk, min_ram, owner, protected, os_hidden) VALUES ('2020-02-18 04:49:55.993652', '2020-02-18 04:49:55.993652', NULL, 0, '13892850-6add-4c28-87cd-6da62e6f8a3c', 'overcloud-full-vmlinuz', 'aki', 'bare', NULL, NULL, 'queued', 'public', NULL, NULL, NULL, 0, 0, 'c0a46a106d3341649a25b10f2770aff8', 0, 0)` -``` - -Current status: - -_Image Created ->_ _**Image Queued**_ _-> Image Saved -> Image Active_ - -In the Glance architecture, the images are "physically" stored in the specified backend (Swift in this case), so traffic will also hit the Swift endpoint at port 8080. Capturing this traffic will make the .pcap file as large as the images being uploaded (2GB in my case).[*][8]   - -![Glance architecture][9] - - -``` -SELECT image_properties.created_at AS image_properties_created_at, image_properties.updated_at AS image_properties_updated_at, image_properties.deleted_at AS image_properties_deleted_at, image_properties.deleted AS image_properties_deleted, image_properties.id AS image_properties_id, image_properties.image_id AS image_properties_image_id, image_properties.name AS image_properties_name, image_properties.value AS image_properties_value -FROM image_properties -WHERE '13892850-6add-4c28-87cd-6da62e6f8a3c' = image_properties.image_id -``` - -You can see some validations happening within the database. At this point, the flow status is "queued" (as shown above), and you can check it here: - -![Checking the Glance image status][10] - -You can also check it with the following queries, where the **updated_at** field and the flow status are modified accordingly (i.e., queued to saving): - -Current status: - -_Image Created -> Image Queued ->_ _**Image Saved**_ _-> Image Active_ - - -``` -SELECT images.id AS images_id -FROM images -WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c' AND images.status = 'queued' -UPDATE images SET updated_at='2020-02-18 04:49:56.046542', id='13892850-6add-4c28-87cd-6da62e6f8a3c', name='overcloud-full-vmlinuz', disk_format='aki', container_format='bare', SIZE=NULL, virtual_size=NULL, STATUS='saving', visibility='public', checksum=NULL, os_hash_algo=NULL, os_hash_value=NULL, min_disk=0, min_ram=0, owner='c0a46a106d3341649a25b10f2770aff8', protected=0, os_hidden=0 WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c' AND images.status = 'queued' -``` - -This is validated during the process with the following query: - - -``` -SELECT images.created_at AS images_created_at, images.updated_at AS images_updated_at, images.deleted_at AS images_deleted_at, images.deleted AS images_deleted, images.id AS images_id, images.name AS images_name, images.disk_format AS images_disk_format, images.container_format AS images_container_format, images.size AS images_size, images.virtual_size AS images_virtual_size, images.status AS images_status, images.visibility AS images_visibility, images.checksum AS images_checksum, images.os_hash_algo AS images_os_hash_algo, images.os_hash_value AS images_os_hash_value, images.min_disk AS images_min_disk, images.min_ram AS images_min_ram, images.owner AS images_owner, images.protected AS images_protected, images.os_hidden AS images_os_hidden, image_properties_1.created_at AS image_properties_1_created_at, image_properties_1.updated_at AS image_properties_1_updated_at, image_properties_1.deleted_at AS image_properties_1_deleted_at, image_properties_1.deleted AS image_properties_1_deleted, image_properties_1.id AS image_properties_1_id, image_properties_1.image_id AS image_properties_1_image_id, image_properties_1.name AS image_properties_1_name, image_properties_1.value AS image_properties_1_value, image_locations_1.created_at AS image_locations_1_created_at, image_locations_1.updated_at AS image_locations_1_updated_at, image_locations_1.deleted_at AS image_locations_1_deleted_at, image_locations_1.deleted AS image_locations_1_deleted, image_locations_1.id AS image_locations_1_id, image_locations_1.image_id AS image_locations_1_image_id, image_locations_1.value AS image_locations_1_value, image_locations_1.meta_data AS image_locations_1_meta_data, image_locations_1.status AS image_locations_1_status -FROM images LEFT OUTER JOIN image_properties AS image_properties_1 ON images.id = image_properties_1.image_id LEFT OUTER JOIN image_locations AS image_locations_1 ON images.id = image_locations_1.image_id -WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c' -``` - -And you can see its response in the Wireshark capture: - -![Wireshark capture][11] - -After the image is completely uploaded, its status will change to "active," which means the image is available in the service and ready to use. - - -``` - "GET /v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c HTTP/1.1" 200 - -{ -   "name":"overcloud-full-vmlinuz", -   "disk_format":"aki", -   "container_format":"bare", -   "visibility":"public", -   "size":8106848, -   "virtual_size":null, -   "status":"active", -   "checksum":"5d31ee013d06b83d02c106ea07f20265", -   "protected":false, -   "min_ram":0, -   "min_disk":0, -   "owner":"c0a46a106d3341649a25b10f2770aff8", -   "os_hidden":false, -   "os_hash_algo":"sha512", -   "os_hash_value":"9f59d36dec7b30f69b696003e7e3726bbbb27a36211a0b31278318c2af0b969ffb279b0991474c18c9faef8b9e96cf372ce4087ca13f5f05338a36f57c281499", -   "id":"13892850-6add-4c28-87cd-6da62e6f8a3c", -   "created_at":"2020-02-18T04:49:55Z", -   "updated_at":"2020-02-18T04:49:56Z", -   "direct_url":"swift+config://ref1/glance/13892850-6add-4c28-87cd-6da62e6f8a3c", -   "tags":[ - -   ], -   "self":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c", -   "file":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c/file", -   "schema":"/v2/schemas/image" -} -``` - -You can also see the database call that updates the current status: - - -``` -`UPDATE images SET updated_at='2020-02-18 04:49:56.571879', id='13892850-6add-4c28-87cd-6da62e6f8a3c', name='overcloud-full-vmlinuz', disk_format='aki', container_format='bare', SIZE=8106848, virtual_size=NULL, STATUS='active', visibility='public', checksum='5d31ee013d06b83d02c106ea07f20265', os_hash_algo='sha512', os_hash_value='9f59d36dec7b30f69b696003e7e3726bbbb27a36211a0b31278318c2af0b969ffb279b0991474c18c9faef8b9e96cf372ce4087ca13f5f05338a36f57c281499', min_disk=0, min_ram=0, owner='c0a46a106d3341649a25b10f2770aff8', protected=0, os_hidden=0 WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c' AND images.status = 'saving'` -``` - -Current status: - -_Image Created -> Image Queued -> Image Saved ->_ _**Image Active**_ - -One interesting thing is that a property in the image is added after the image is uploaded using a PATCH. This property is **hw_architecture** and it is set to **x86_64**: - - -``` - "PATCH /v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c HTTP/1.1" - -curl -g -i -X PATCH -H 'b'Content-Type': b'application/openstack-images-v2.1-json-patch'' -H 'b'X-Auth-Token': b'gAAAAABeS2zzWzAZBqF-whE7SmJt_Atx7tiLZhcL8mf6wJPrO3RBdv4SdnWImxbeSQSqEQdZJnwBT79SWhrtt7QDn-2o6dsAtpUb1Rb7w6xe7Qg_AHQfD5P1rU7tXXtKu2DyYFhtPg2TRQS5viV128FyItyt49Yn_ho3lWfIXaR3TuZzyIz38NU'' -H 'User-Agent: python-glanceclient' -H 'Accept-Encoding: gzip, deflate' -H 'Accept: */*' -H 'Connection: keep-alive'  --cacert /etc/pki/ca-trust/source/anchors/cm-local-ca.pem  --cert None --key None -d '[{"op": "add", "path": "/hw_architecture", "value": "x86_64"}]' - -Response: - -{ -   "hw_architecture":"x86_64", -   "name":"overcloud-full-vmlinuz", -   "disk_format":"aki", -   "container_format":"bare", -   "visibility":"public", -   "size":8106848, -   "virtual_size":null, -   "status":"active", -   "checksum":"5d31ee013d06b83d02c106ea07f20265", -   "protected":false, -   "min_ram":0, -   "min_disk":0, -   "owner":"c0a46a106d3341649a25b10f2770aff8", -   "os_hidden":false, -   "os_hash_algo":"sha512", -   "os_hash_value":"9f59d36dec7b30f69b696003e7e3726bbbb27a36211a0b31278318c2af0b969ffb279b0991474c18c9faef8b9e96cf372ce4087ca13f5f05338a36f57c281499", -   "id":"13892850-6add-4c28-87cd-6da62e6f8a3c", -   "created_at":"2020-02-18T04:49:55Z", -   "updated_at":"2020-02-18T04:49:56Z", -   "direct_url":"swift+config://ref1/glance/13892850-6add-4c28-87cd-6da62e6f8a3c", -   "tags":[ - -   ], -   "self":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c", -   "file":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c/file", -   "schema":"/v2/schemas/image" -} -``` - -This is also updated in the MySQL database: - - -``` -`INSERT INTO image_properties (created_at, updated_at, deleted_at, deleted, image_id, name, VALUE) VALUES ('2020-02-18 04:49:56.655780', '2020-02-18 04:49:56.655783', NULL, 0, '13892850-6add-4c28-87cd-6da62e6f8a3c', 'hw_architecture', 'x86_64')` -``` - -This is pretty much what happens when you upload an image to Glance. Here's what it looks like if you check on the database: - - -``` -MariaDB [glance]> SELECT images.created_at AS images_created_at, images.updated_at AS images_updated_at, images.deleted_at AS images_deleted_at, images.deleted AS images_deleted, images.id AS images_id, images.name AS images_name, images.disk_format AS images_disk_format, images.container_format AS images_container_format, images.size AS images_size, images.virtual_size AS images_virtual_size, images.status AS images_status, images.visibility AS images_visibility, images.checksum AS images_checksum, images.os_hash_algo AS images_os_hash_algo, images.os_hash_value AS images_os_hash_value, images.min_disk AS images_min_disk, images.min_ram AS images_min_ram, images.owner AS images_owner, images.protected AS images_protected, images.os_hidden AS images_os_hidden, image_properties_1.created_at AS image_properties_1_created_at, image_properties_1.updated_at AS image_properties_1_updated_at, image_properties_1.deleted_at AS image_properties_1_deleted_at, image_properties_1.deleted AS image_properties_1_deleted, image_properties_1.id AS image_properties_1_id, image_properties_1.image_id AS image_properties_1_image_id, image_properties_1.name AS image_properties_1_name, image_properties_1.value AS image_properties_1_value, image_locations_1.created_at AS image_locations_1_created_at, image_locations_1.updated_at AS image_locations_1_updated_at, image_locations_1.deleted_at AS image_locations_1_deleted_at, image_locations_1.deleted AS image_locations_1_deleted, image_locations_1.id AS image_locations_1_id, image_locations_1.image_id AS image_locations_1_image_id, image_locations_1.value AS image_locations_1_value, image_locations_1.meta_data AS image_locations_1_meta_data, image_locations_1.status AS image_locations_1_status  FROM images LEFT OUTER JOIN image_properties AS image_properties_1 ON images.id = image_properties_1.image_id LEFT OUTER JOIN image_locations AS image_locations_1 ON images.id = image_locations_1.image_id  WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c'\G; -*************************** 1. row *************************** -            images_created_at: 2020-02-18 04:49:55 -            images_updated_at: 2020-02-18 04:49:56 -            images_deleted_at: NULL -               images_deleted: 0 -                    images_id: 13892850-6add-4c28-87cd-6da62e6f8a3c -                  images_name: overcloud-full-vmlinuz -           images_disk_format: aki -      images_container_format: bare -                  images_size: 8106848 -          images_virtual_size: NULL -                images_status: active -            images_visibility: public -              images_checksum: 5d31ee013d06b83d02c106ea07f20265 -          images_os_hash_algo: sha512 -         images_os_hash_value: 9f59d36dec7b30f69b696003e7e3726bbbb27a36211a0b31278318c2af0b969ffb279b0991474c18c9faef8b9e96cf372ce4087ca13f5f05338a36f57c281499 -              images_min_disk: 0 -               images_min_ram: 0 -                 images_owner: c0a46a106d3341649a25b10f2770aff8 -             images_protected: 0 -             images_os_hidden: 0 -image_properties_1_created_at: 2020-02-18 04:49:56 -image_properties_1_updated_at: 2020-02-18 04:49:56 -image_properties_1_deleted_at: NULL -   image_properties_1_deleted: 0 -        image_properties_1_id: 11 -  image_properties_1_image_id: 13892850-6add-4c28-87cd-6da62e6f8a3c -      image_properties_1_name: hw_architecture -     image_properties_1_value: x86_64 - image_locations_1_created_at: 2020-02-18 04:49:56 - image_locations_1_updated_at: 2020-02-18 04:49:56 - image_locations_1_deleted_at: NULL -    image_locations_1_deleted: 0 -         image_locations_1_id: 7 -   image_locations_1_image_id: 13892850-6add-4c28-87cd-6da62e6f8a3c -      image_locations_1_value: swift+config://ref1/glance/13892850-6add-4c28-87cd-6da62e6f8a3c -  image_locations_1_meta_data: {} -     image_locations_1_status: active -1 row in set (0.00 sec) -``` - -The final result is: - - -``` -(undercloud) [stack@undercloud ~]$ openstack image list -+--------------------------------------+------------------------+--------+ -| ID                                   | Name                   | Status | -+--------------------------------------+------------------------+--------+ -| 9a26b9da-3783-4223-bdd7-c553aa194e30 | overcloud-full         | active | -| a2914297-c70f-4021-bc3e-8ec2123f6ea6 | overcloud-full-initrd  | active | -| 13892850-6add-4c28-87cd-6da62e6f8a3c | overcloud-full-vmlinuz | active | -+--------------------------------------+------------------------+--------+ -(undercloud) [stack@undercloud ~]$ -``` - -Some other minor things are happening during this process, but overall, this is how it looks. - -### Conclusion - -Understanding the flow of the most common actions in the OpenStack platform will enable you to enhance your troubleshooting skills when facing some issues at work. You can check the status of an image in Glance; know whether an image is in a "queued," "saving," or "active" state; and do some captures in your environment to see what is going on by checking the endpoints you need to check. - -I enjoy debugging. I consider this is an important skill for any role—whether you are working in a support, consulting, developer (of course!), or architect role. I hope this article gave you some basic guidelines to start debugging things. - -* * * - -* In case you're wondering how to open a 2GB .pcap file without problems, here is one way to do it: - - -``` -`$ editcap -c 5000 image-upload.pcap upload-overcloud-image.pcap` -``` - -This splits your huge capture in smaller captures of 5,000 packets each. - -* * * - -_This article was [originally posted][12] on LinkedIn and is reprinted with permission._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/3/glance - -作者:[Jair Patete][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jpatete -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yourimagehere_520x292.png?itok=V-xhX7KL (blank background that says your image here) -[2]: https://www.openstack.org/software/releases/ocata/components/glance -[3]: https://www.openstack.org/ -[4]: https://wiki.openstack.org/wiki/TripleO -[5]: https://www.tcpdump.org/ -[6]: https://docs.openstack.org/keystone/latest/ -[7]: https://opensource.com/sites/default/files/uploads/glance-db-calls.png (Searching "glance" inside tcpdump) -[8]: tmp.qBKg0ttLIJ#* -[9]: https://opensource.com/sites/default/files/uploads/glance-architecture.png (Glance architecture) -[10]: https://opensource.com/sites/default/files/uploads/check-flow-status.png (Checking the Glance image status) -[11]: https://opensource.com/sites/default/files/uploads/wireshark-capture.png (Wireshark capture) -[12]: https://www.linkedin.com/pulse/what-happens-behind-doors-when-we-upload-image-glance-patete-garc%25C3%25ADa/?trackingId=czWiFC4dRfOsSZJ%2BXdzQfg%3D%3D diff --git a/sources/tech/20200317 Create Stunning Pixel Art With Free and Open Source Editor Pixelorama.md b/sources/tech/20200317 Create Stunning Pixel Art With Free and Open Source Editor Pixelorama.md deleted file mode 100644 index fc3c4b7bab..0000000000 --- a/sources/tech/20200317 Create Stunning Pixel Art With Free and Open Source Editor Pixelorama.md +++ /dev/null @@ -1,108 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Create Stunning Pixel Art With Free and Open Source Editor Pixelorama) -[#]: via: (https://itsfoss.com/pixelorama/) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -Create Stunning Pixel Art With Free and Open Source Editor Pixelorama -====== - -_**Brief: Pixelorama is a cross-platform, free and open source 2D sprite editor. It provides all the necessary tools to create pixel art in a neat user interface.**_ - -### Pixelorama: open source sprite editor - -[Pixelorama][1] is a tool created by young game developers at [Orama Interactive][2]. They have developed a few 2D games and a couple of them use pixel art. - -While Orama is primarily into game development, the developers are also creating utility tools that help them (and others) create those games. - -The free and open source sprite editor, Pixelorama is such a utility tool. It’s built on top of [Godot Engine][3] and is perfect for creating pixel art. - -![Pixelorama screenshot][4] - -You see the pixel art in the screenshot above? It’s been created using Pixelorama. This video shows a timelapse video of creating the above image. - -### Features of Pixelorama - -Here are the main features Pixelorama provides: - - * Multiple tools like penicl, erase, fill bucket color picker etc - * Multiple layer system that allows you to add, remove, move up and down, clone and merge as many layers as you like - * Support for spritesheets - * Import images and edit them inside Pixelorama - * Animation timeline with [Onion Skinning][5] - * Custom brushes - * Save and open your projects in Pixelorama’s custom file format, .pxo - * Horizontal & vertical mirrored drawing - * Tile Mode for pattern creation - * Split screen mode and mini canvas preview - * Zoom with mouse scroll wheel - * Unlimited undo and redo - * Scale, crop, flip, rotate, color invert and desaturate your images - * Keyboard shortcuts - * Available in several languages - * Supports Linux, Windows and macOS - - - -### Installing Pixelorama on Linux - -Pixelorama is available as a Snap application and if you are using Ubuntu, you can find it in the software center itself. - -![Pixelorama is available in Ubuntu Software Center][6] - -Alternatively, if you have [Snap support enabled on your Linux distribution][7], you can install it using this command: - -``` -sudo snap install pixelorama -``` - -If you don’t want to use Snap, no worries. You can download the latest release of Pixelorama from [their GitHub repository][8], [extract the zip file][9] and you’ll see an executable file. Give this file execute permission and double click on it to run the application. - -[Download Pixelorama][10] - -**Conclusion** - -![Pixelorama Welcome Screen][11] - -In the Pixeloaram features, it says that you can import images and edit them. I guess that’s only true for certain kind of files because when I tried to import PNG or JPEG files, the application crashed. - -However, I could easily doodle like a 3 year old and make random pixel art. I am not that into arts but I think this is a [useful tool for digital artists on Linux][12]. - -I liked the idea that despite being game developers, they are creating tools that could help other game developers and artists. That’s the spirit of open source. - -If you like the project and will be using it, consider supporting them by a donation. [It’s FOSS has made a humble donation][13] of $25 to thank their effort. - -[Donate to Pixelorama (personal Paypal account of the lead developer)][14] - -Do you like Pixelorama? Do you use some other open source sprite editor? Feel free to share your views in the comment section. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/pixelorama/ - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/abhishek/ -[b]: https://github.com/lujun9972 -[1]: https://www.orama-interactive.com/pixelorama -[2]: https://www.orama-interactive.com/ -[3]: https://godotengine.org/ -[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/pixelorama-v6.jpg?ssl=1 -[5]: https://en.wikipedia.org/wiki/Onion_skinning -[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/pixelorama-ubuntu-software-center.jpg?ssl=1 -[7]: https://itsfoss.com/install-snap-linux/ -[8]: https://github.com/Orama-Interactive/Pixelorama -[9]: https://itsfoss.com/unzip-linux/ -[10]: https://github.com/Orama-Interactive/Pixelorama/releases -[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/pixelorama.jpg?ssl=1 -[12]: https://itsfoss.com/best-linux-graphic-design-software/ -[13]: https://itsfoss.com/donations-foss/ -[14]: https://www.paypal.me/erevos diff --git a/sources/tech/20200318 Share data between C and Python with this messaging library.md b/sources/tech/20200318 Share data between C and Python with this messaging library.md deleted file mode 100644 index cda6e54e33..0000000000 --- a/sources/tech/20200318 Share data between C and Python with this messaging library.md +++ /dev/null @@ -1,663 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: 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) - -Share data between C and Python with this messaging library -====== -ZeroMQ makes for a fast and resilient messaging library to gather data -and share between multiple languages. -![Chat via email][1] - -I've had moments as a software engineer when I'm asked to do a task that sends shivers down my spine. One such moment was when I had to write an interface between some new hardware infrastructure that requires C and a cloud infrastructure, which is primarily Python. - -One strategy could be to [write an extension in C][2], which Python supports by design. A quick glance at the documentation shows this would mean writing a good amount of C. That can be good in some cases, but it's not what I prefer to do. Another strategy is to put the two tasks in separate processes and exchange messages between the two with the [ZeroMQ messaging library][3]. - -When I experienced this type of scenario before discovering ZeroMQ, I went through the extension-writing path. It was not that bad, but it is very time-consuming and convoluted. Nowadays, to avoid that, I subdivide a system into independent processes that exchange information through messages sent over [communication sockets][4]. With this approach, several programming languages can coexist, and each process is simpler and thus easier to debug. - -ZeroMQ provides an even easier process: - - 1. Write a small shim in C that reads data from the hardware and sends whatever it finds as a message. - 2. Write a Python interface between the new and existing infrastructure. - - - -One of ZeroMQ's project's founders is [Pieter Hintjens][5], a remarkable person with [interesting views and writings][6]. - -### Prerequisites - -For this tutorial, you will need: - - * A C compiler (e.g., [GCC][7] or [Clang][8]) - * The [**libzmq** library][9] - * [Python 3][10] - * [ZeroMQ bindings][11] for python - - - -Install them on Fedora with: - - -``` -`$ dnf install clang zeromq zeromq-devel python3 python3-zmq` -``` - -For Debian or Ubuntu: - - -``` -`$ apt-get install clang libzmq5 libzmq3-dev python3 python3-zmq` -``` - -If you run into any issues, refer to each project's installation instructions (which are linked above). - -### Writing the hardware-interfacing library - -Since this is a hypothetical scenario, this tutorial will write a fictitious library with two functions: - - * **fancyhw_init()** to initiate the (hypothetical) hardware - * **fancyhw_read_val()** to return a value read from the hardware - - - -Save the library's full source code to a file named **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][12](init_param); -} - -int16_t fancyhw_read_val(void) -{ -    return (int16_t)[rand][13](); -} - -#endif -``` - -This library can simulate the data you want to pass between languages, thanks to the random number generator. - -### Designing a C interface - -The following will go step-by-step through writing the C interface—from including the libraries to managing the data transfer. - -#### Libraries - -Begin by loading the necessary libraries (the purpose of each library is in a comment in the code): - - -``` -// 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" -``` - -#### Significant parameters - -Define the **main** function and the significant parameters needed for the rest of the program: - - -``` -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"; - -    ... -``` - -#### Initialization - -Both libraries need some initialization. The fictitious one needs just one parameter: - - -``` -`fancyhw_init(INIT_PARAM);` -``` - -The ZeroMQ library needs some real initialization. First, define a **context**—an object that manages all the sockets: - - -``` -void *context = zmq_ctx_new(); - -if (!context) -{ -    [printf][14]("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno)); - -    return EXIT_FAILURE; -} -``` - -Then define the socket used to deliver data. ZeroMQ supports several types of sockets, each with its application. Use a **publish** socket (also known as **PUB** socket), which can deliver copies of a message to multiple receivers. This approach enables you to attach several receivers that will all get the same messages. If there are no receivers, the messages will be discarded (i.e., they will not be queued). Do this with: - - -``` -`void *data_socket = zmq_socket(context, ZMQ_PUB);` -``` - -The socket must be bound to an address so that the clients know where to connect. In this case, use the [TCP transport layer][15] (there are [other options][16], but TCP is a good default choice): - - -``` -const int rb = zmq_bind(data_socket, "tcp://*:5555"); - -if (rb != 0) -{ -    [printf][14]("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno)); - -    return EXIT_FAILURE; -} -``` - -Next, calculate some useful values that you will need later. Note **TOPIC** in the code below; **PUB** sockets need a topic to be associated with the messages they send. Topics can be used by the receivers to filter messages: - - -``` -const size_t topic_size = [strlen][17](TOPIC); -const size_t envelope_size = topic_size + 1 + PACKET_SIZE * sizeof(int16_t); - -[printf][14]("Topic: %s; topic size: %zu; Envelope size: %zu\n", TOPIC, topic_size, envelope_size); -``` - -#### Sending messages - -Start a loop that sends **REPETITIONS** messages: - - -``` -for (unsigned int i = 0; i < REPETITIONS; i++) -{ -    ... -``` - -Before sending a message, fill a buffer of **PACKET_SIZE** values. The library provides signed integers of 16 bits. Since the dimension of an **int** in C is not defined, use an **int** with a specific width: - - -``` -int16_t buffer[PACKET_SIZE]; - -for (unsigned int j = 0; j < PACKET_SIZE; j++) -{ -    buffer[j] = fancyhw_read_val(); -} - -[printf][14]("Read %u data values\n", PACKET_SIZE); -``` - -The first step in message preparation and delivery is creating a ZeroMQ message and allocating the memory necessary for your message. This empty message is an envelope to store the data you will ship: - - -``` -zmq_msg_t envelope; - -const int rmi = zmq_msg_init_size(&envelope, envelope_size); -if (rmi != 0) -{ -    [printf][14]("ERROR: ZeroMQ error occurred during zmq_msg_init_size(): %s\n", zmq_strerror(errno)); - -    zmq_msg_close(&envelope); - -    break; -} -``` - -Now that the memory is allocated, store the data in the ZeroMQ message "envelope." The **zmq_msg_data()** function returns a pointer to the beginning of the buffer in the envelope. The first part is the topic, followed by a space, then the binary data. Add whitespace as a separator between the topic and the data. To move along the buffer, you have to play with casts and [pointer arithmetic][18]. (Thank you, C, for making things straightforward.) Do this with: - - -``` -[memcpy][19](zmq_msg_data(&envelope), TOPIC, topic_size); -[memcpy][19]((void*)((char*)zmq_msg_data(&envelope) + topic_size), " ", 1); -[memcpy][19]((void*)((char*)zmq_msg_data(&envelope) + 1 + topic_size), buffer, PACKET_SIZE * sizeof(int16_t)); -``` - -Send the message through the **data_socket**: - - -``` -const size_t rs = zmq_msg_send(&envelope, data_socket, 0); -if (rs != envelope_size) -{ -    [printf][14]("ERROR: ZeroMQ error occurred during zmq_msg_send(): %s\n", zmq_strerror(errno)); - -    zmq_msg_close(&envelope); - -    break; -} -``` - -Make sure to dispose of the envelope after you use it: - - -``` -zmq_msg_close(&envelope); - -[printf][14]("Message sent; i: %u, topic: %s\n", i, TOPIC); -``` - -#### Clean it up - -Because C does not provide [garbage collection][20], you have to tidy up. After you are done sending your messages, close the program with the clean-up needed to release the used memory: - - -``` -const int rc = zmq_close(data_socket); - -if (rc != 0) -{ -    [printf][14]("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][14]("Error occurred during zmq_ctx_destroy(): %s\n", zmq_strerror(errno)); - -    return EXIT_FAILURE; -} - -return EXIT_SUCCESS; -``` - -#### The entire C program - -Save the full interface library below to a local file called **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][14]("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][14]("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno)); - -        return EXIT_FAILURE; -    } - -    const size_t topic_size = [strlen][17](TOPIC); -    const size_t envelope_size = topic_size + 1 + PACKET_SIZE * sizeof(int16_t); - -    [printf][14]("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][14]("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][14]("ERROR: ZeroMQ error occurred during zmq_msg_init_size(): %s\n", zmq_strerror(errno)); -    -            zmq_msg_close(&envelope); -    -            break; -        } -        -        [memcpy][19](zmq_msg_data(&envelope), TOPIC, topic_size); - -        [memcpy][19]((void*)((char*)zmq_msg_data(&envelope) + topic_size), " ", 1); - -        [memcpy][19]((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][14]("ERROR: ZeroMQ error occurred during zmq_msg_send(): %s\n", zmq_strerror(errno)); -    -            zmq_msg_close(&envelope); -    -            break; -        } -    -        zmq_msg_close(&envelope); - -        [printf][14]("Message sent; i: %u, topic: %s\n", i, TOPIC); - -        sleep(1); -    } - -    const int rc = zmq_close(data_socket); - -    if (rc != 0) -    { -        [printf][14]("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][14]("Error occurred during zmq_ctx_destroy(): %s\n", zmq_strerror(errno)); - -        return EXIT_FAILURE; -    } - -    return EXIT_SUCCESS; -} -``` - -Compile using the command: - - -``` -`$ clang -std=c99 -I. hw_interface.c -lzmq -o hw_interface` -``` - -If there are no compilation errors, you can run the interface. What's great is that ZeroMQ **PUB** sockets can run without any applications sending or retrieving data. That reduces complexity because there is no obligation in terms of which process needs to start first. - -Run the interface: - - -``` -$ ./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 -... -... -``` - -The output shows the data being sent through ZeroMQ. Now you need an application to read the data. - -### Write a Python data processor - -You are now ready to pass the data from C to a Python application. - -#### Libraries - -You need two libraries to help transfer data. First, you need ZeroMQ bindings in Python: - - -``` -`$ python3 -m pip install zmq` -``` - -The other is the [**struct** library][21], which decodes binary data. It's commonly available with the Python standard library, so there's no need to **pip install** it. - -The first part of the Python program imports both of these libraries: - - -``` -import zmq -import struct -``` - -#### Significant parameters - -To use ZeroMQ, you must subscribe to the same topic used in the constant **TOPIC** above: - - -``` -topic = "fancyhw_data".encode('ascii') - -print("Reading messages with topic: {}".format(topic)) -``` - -#### Initialization - -Next, initialize the context and the socket. Use a **subscribe** socket (also known as a **SUB** socket), which is the natural partner of the **PUB** socket. The socket also needs to subscribe to the right 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 - -    ... -``` - -#### Receiving messages - -Start an infinite loop that waits for new messages to be delivered to the SUB socket. The loop will be closed if you press **Ctrl+C** or if an error occurs: - - -``` -    try: -        while True: - -            ... # we will fill this in next - -    except KeyboardInterrupt: -        socket.close() -    except Exception as error: -        print("ERROR: {}".format(error)) -        socket.close() -``` - -The loop waits for new messages to arrive with the **recv()** method. Then it splits whatever is received at the first space to separate the topic from the content: - - -``` -`binary_topic, data_buffer = socket.recv().split(b' ', 1)` -``` - -#### Decoding messages - -Python does yet not know that the topic is a string, so decode it using the standard ASCII encoding: - - -``` -topic = binary_topic.decode(encoding = 'ascii') - -print("Message {:d}:".format(i)) -print("\ttopic: '{}'".format(topic)) -``` - -The next step is to read the binary data using the **struct** library, which can convert shapeless binary blobs to significant values. First, calculate the number of values stored in the packet. This example uses 16-bit signed integers that correspond to an "h" in the **struct** [format][22]: - - -``` -packet_size = len(data_buffer) // struct.calcsize("h") - -print("\tpacket size: {:d}".format(packet_size)) -``` - -By knowing how many values are in the packet, you can define the format by preparing a string with the number of values and their types (e.g., "**16h**"): - - -``` -`struct_format = "{:d}h".format(packet_size)` -``` - -Convert that binary blob to a series of numbers that you can immediately print: - - -``` -data = struct.unpack(struct_format, data_buffer) - -print("\tdata: {}".format(data)) -``` - -#### The full Python program - -Here is the complete data receiver in 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() -``` - -Save it to a file called **online_analysis.py**. Python does not need to be compiled, so you can run the program immediately. - -Here is the output: - - -``` -$ ./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) -... -... -``` - -### Conclusion - -This tutorial describes an alternative way of gathering data from C-based hardware interfaces and providing it to Python-based infrastructures. You can take this data and analyze it or pass it off in any number of directions. It employs a messaging library to deliver data between a "gatherer" and an "analyzer" instead of having a monolithic piece of software that does everything. - -This tutorial also increases what I call "software granularity." In other words, it subdivides the software into smaller units. One of the benefits of this strategy is the possibility of using different programming languages at the same time with minimal interfaces acting as shims between them. - -In practice, this design allows software engineers to work both more collaboratively and independently. Different teams may work on different steps of the analysis, choosing the tool they prefer. Another benefit is the parallelism that comes for free since all the processes can run in parallel. The [ZeroMQ messaging library][3] is a remarkable piece of software that makes all of this much easier. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/3/zeromq-c-python - -作者:[Cristiano L. Fontana][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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 diff --git a/sources/tech/20200323 5 Python scripts for automating basic community management tasks.md b/sources/tech/20200323 5 Python scripts for automating basic community management tasks.md deleted file mode 100644 index 3f8dd00aa1..0000000000 --- a/sources/tech/20200323 5 Python scripts for automating basic community management tasks.md +++ /dev/null @@ -1,114 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (5 Python scripts for automating basic community management tasks) -[#]: via: (https://opensource.com/article/20/3/automating-community-management-python) -[#]: author: (Rich Bowen https://opensource.com/users/rbowen) - -5 Python scripts for automating basic community management tasks -====== -If you have to do something three times, try to automate it. -![shapes of people symbols][1] - -I've [written before about what a community manager does][2], and if you ask ten community managers, you'll get 12 different answers. Mostly, though, you do what the community needs for you to do at any given moment. And a lot of it can be repetitive. - -Back when I was a sysadmin, I had a rule: if I had to do something three times, I'd try to automate it. And, of course, these days, with awesome tools like Ansible, there's a whole science to that. - -Some of what I do on a daily or weekly basis involves looking something up in a few places and then generating some digest or report of that information to publish elsewhere. A task like that is a perfect candidate for automation. None of this is [rocket surgery][3], but when I've shared some of these scripts with colleagues, invariably, at least one of them turns out to be useful. - -[On GitHub][4], I have several scripts that I use every week. None of them are complicated, but they save me a few minutes every time. Some of them are in Perl because I'm almost 50. Some of them are in Python because a few years ago, I decided I needed to learn Python. Here's an overview: - -### **[tshirts.py][5]** - -This simple script takes a number of Tshirts that you're going to order for an event and tells you what the size distribution should be. It spreads them on a normal curve (also called a bell curve), and, in my experience, this coincides pretty well with what you'll actually need for a normal conference audience. You might want to adjust the script to slightly larger if you're using it in the USA, slightly smaller if you're using it in Europe. YMMV. - -Usage: - - -``` -[rbowen@sasha:community-tools/scripts]$ ./tshirts.py                                                                                                                                                           -How many shirts? 300 -For a total of 300 shirts, order: - -30.0 small -72.0 medium -96.0 large -72.0 xl -30.0 2xl -``` - -### **[followers.py][6]** - -This script provides me with the follower count for Twitter handles I care about. - -This script is only 14 lines long and isn't exciting, but it saves me perhaps ten minutes of loading web pages and looking for a number. - -You'll need to edit the feeds array to add the accounts you care about: - - -``` -feeds = [ -        'centosproject', -        'centos' -        ]; -``` - -NB: It probably won't work if you're running it outside of English-speaking countries, because it's just a simple screen-scraping script that reads HTML and looks for particular information buried within it. So when the output is in a different language, the regular expressions won't match. - -Usage: - - -``` -[rbowen@sasha:community-tools/scripts]$ ./followers.py                                                                                                                                                                           -centosproject: 11,479 Followers -centos: 18,155 Followers -``` - -### **[get_meetups][7]** - -This script fits into another category—API scripts. This particular script uses the [meetup.com][8] API to look for meetups on a particular topic in a particular area and time range so that I can report them to my community. Many of the services you rely on provide an API so that your scripts can look up information without having to manually look through web pages. Learning how to use those APIs can be frustrating and time-consuming, but you'll end up with skills that will save you a LOT of time. - -_Disclaimer: [meetup.com][8] changed their API in August of 2019, and I have not yet updated this script to the new API, so it doesn't actually work right now. Watch this repo for a fixed version in the coming weeks._ - -### **[centos-announcements.pl][9]** - -This script is considerably more complicated and extremely specific to my use case, but you probably have a similar situation. This script looks at a mailing list archive—in this case, the centos-announce mailing list—and finds messages that are in a particular format, then builds a report of those messages. Reports come in a couple of different formats—one for my monthly newsletter and one for scheduling messages (via Hootsuite) for Twitter. - -I use Hootsuite to schedule content for Twitter, and they have a convenient CSV (comma-separated value) format that lets you bulk-schedule a whole week of tweets in one go. Auto-generating that CSV from various data sources (i.e., mailing lists, blogs, other web pages) can save you a lot of time. Do note, however, that this should probably only be used for a first draft, which you then examine and edit yourself so that you don't end up auto-tweeting something you didn't intend to. - -### **[reporting.pl][10]** - -This script is also fairly specific to my particular needs, but the concept itself is universal. I send out a monthly mailing to the [CentOS SIGs][11] (Special Interest Groups), which are scheduled to report in that given month. This script simply tells me which SIGs those are this month, and writes the email that needs to go to them. - -It does not actually send that email, however, for a couple of reasons. One, I may wish to edit those messages before they go out. Two, while scripts sending email worked great in the old days, these days, they're likely to result in getting spam-filtered. - -### In conclusion - -There are some other scripts in that repo that are more or less specific to my particular needs, but I hope at least one of them is useful to you, and that the variety of what's there inspires you to automate something of your own. I'd love to see your handy automation script repos, too; link to them in the comments! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/3/automating-community-management-python - -作者:[Rich Bowen][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/rbowen -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/Open%20Pharma.png?itok=GP7zqNZE (shapes of people symbols) -[2]: http://drbacchus.com/what-does-a-community-manager-do/ -[3]: https://6dollarshirts.com/rocket-surgery -[4]: https://github.com/rbowen/centos-community-tools/tree/master/scripts -[5]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/tshirts.py -[6]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/followers.py -[7]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/get_meetups -[8]: http://meetup.com -[9]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/centos-announcements.pl -[10]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/sig_reporting/reporting.pl -[11]: https://wiki.centos.org/SpecialInterestGroup diff --git a/sources/tech/20200323 How to create a personal file server with SSH on Linux.md b/sources/tech/20200323 How to create a personal file server with SSH on Linux.md deleted file mode 100644 index f758123bb1..0000000000 --- a/sources/tech/20200323 How to create a personal file server with SSH on Linux.md +++ /dev/null @@ -1,137 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to create a personal file server with SSH on Linux) -[#]: via: (https://opensource.com/article/20/3/personal-file-server-ssh) -[#]: author: (Jim Hall https://opensource.com/users/jim-hall) - -How to create a personal file server with SSH on Linux -====== -Connecting to a remote Linux system over SSH is just plain easy. Here's -how to do it. -![Hand putting a Linux file folder into a drawer][1] - -The Raspberry Pi makes for a useful and inexpensive home server for lots of things. I most often use the [Raspberry Pi as a print server][2] to share a laser printer with other devices in our home or as a personal file server to store copies of projects and other data. - -I use this file server in various ways. Let's say I'm working on a project, such as a new book, and I want to make a snapshot copy of my work and all my associated files. In that case, I simply copy my **BookProject** folder to a **BookBackup** folder on the file server. - -Or if I'm cleaning up my local files, and I discover some files that I don't really need but I'm not yet ready to delete, I'll copy them to a **KeepForLater** folder on the file server. That's a convenient way to remove clutter from my everyday Linux system and offload infrequently used files to my personal file server. - -Setting up a Raspberry Pi—or any Linux system—as a personal file server doesn't require configuring Network File System (NFS) or Common Internet File System (CIFS) or tinkering with other file-sharing systems such as WebDAV. You can easily set up a remote file server using SSH. And here's how. - -### Set up SSHD on the remote system - -Your Linux system probably has the SSH daemon (sshd) installed. It may even be running by default. If not, you can easily set up SSH through whatever control panel you prefer on your Linux distribution. I run [Fedora ARM][3] on my Raspberry Pi, and I can access the control panel remotely by pointing my Pi's web browser to port 9090. (On my home network, the Raspberry Pi's IP address is **10.0.0.11**, so I connect to **10.0.0.11:9090**.) If the SSH daemon isn't running by default, you can set it to start automatically in Services in the control panel. - -![sshd in the list of system services][4] - -You can find sshd in the list of system services. - -![slider to activate sshd][5] - -Click the slider to activate **sshd** if it isn't already. - -### Do you have an account? - -Make sure you have an account on the remote system. It might be the same as the username you use on your local system, or it could be something different. - -On the popular Raspbian distribution, the default account username is **pi**. But other Linux distributions may require you to set up a unique new user when you install it. If you don't know your username, you can use your distribution's control panel to create one. On my Raspberry Pi, I set up a **jhall** account that matches the username on my everyday Linux desktop machine. - -![Set up a new account on Fedora Server][6] - -If you use Fedora Server, click the **Create New Account** button to set up a new account. - -![Set password or SSH key][7] - -Don't forget to set a password or add a public SSH key. - -### Optional: Share your SSH public key - -If you exchange your public SSH key with the remote Linux system, you can log in without having to enter a password. This step is optional; you can use a password if you prefer. - -You can learn more about SSH keys in these Opensource.com articles: - - * [Tools for SSH key management][8] - * [Graphically manage SSH keys with Seahorse][9] - * [How to manage multiple SSH keys][10] - * [How to enable SSH access using a GPG key for authentication][11] - - - -### Make a file manager shortcut - -Since you've started the SSH daemon on the remote system and set up your account username and password, all that's left is to map a shortcut to the other Linux system from your file manager. I use GNOME as my desktop, but the steps are basically the same for any Linux desktop. - -#### Make the initial connection - -In the GNOME file manager, look for the **+Other Locations** button in the left-hand navigation. Click that to open a **Connect to Server** prompt. Enter the address of the remote Linux server here, starting with the SSH connection protocol. - -![Creating a shortcut in GNOME file manager][12] - -The GNOME file manager supports a variety of connection protocols. To make a connection over SSH, start your server address with **sftp://** or **ssh://**. - -If your username is the same on your local Linux system and your remote Linux system, you can just enter the server's address and the folder location. To make my connection to the **/home/jhall** directory on my Raspberry Pi, I use: - - -``` -`sftp://10.0.0.11/home/jhall` -``` - -![GNOME file manager Connect to Server][13] - -If your username is different, you can specify your remote system's username with an **@** sign before the remote system's address. To connect to a Raspbian system on the other end, you might use: - - -``` -`sftp://pi@10.0.0.11/home/pi` -``` - -![GNOME file manager Connect to Server][14] - -If you didn't share your public SSH key, you may need to enter a password. Otherwise, the GNOME file manager should automatically open the folder on the remote system and let you navigate. - -![GNOME file manager connection][15] - -#### Create a shortcut so you can easily connect to the server later - -This is easy in the GNOME file manager. Right-click on the remote system's name in the navigation list, and select **Add Bookmark**. This creates a shortcut to the remote location. - -![GNOME file manager - adding bookmark][16] - -If you want to give the bookmark a more memorable name, you can right-click on the shortcut and choose **Rename**. - -### That's it! - -Connecting to a remote Linux system over SSH is just plain easy. And you can use the same method to connect to systems other than home file servers. I also have a shortcut that allows me to instantly access files on my provider's web server and another that lets me open a folder on my project server. SSH makes it a secure connection; all of my traffic is encrypted. Once I've opened the remote system over SSH, I can use the GNOME file manager to manage my remote files as easily as I'd manage my local folders. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/3/personal-file-server-ssh - -作者:[Jim Hall][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jim-hall -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer) -[2]: https://opensource.com/article/18/3/print-server-raspberry-pi -[3]: https://arm.fedoraproject.org/ -[4]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-sshd.png (sshd in the list of system services) -[5]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-sshd-service.png (slider to activate sshd) -[6]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-accounts_create-user.png (Set up a new account on Fedora Server) -[7]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-accounts.png (Set password or SSH key) -[8]: https://opensource.com/article/20/2/ssh-tools -[9]: https://opensource.com/article/19/4/ssh-keys-seahorse -[10]: https://opensource.com/article/19/4/gpg-subkeys-ssh-manage -[11]: https://opensource.com/article/19/4/gpg-subkeys-ssh -[12]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-other-locations.png (Creating a shortcut in GNOME file manager) -[13]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-other-sftp.png (GNOME file manager Connect to Server) -[14]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-other-sftp-username.png (GNOME file manager Connect to Server) -[15]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-remote-jhall.png (GNOME file manager connection) -[16]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-remote-jhall-add-bookmark.png (GNOME file manager - adding bookmark) diff --git a/sources/tech/20200324 Audacious 4.0 Released With Qt 5- Here-s How to Install it on Ubuntu.md b/sources/tech/20200324 Audacious 4.0 Released With Qt 5- Here-s How to Install it on Ubuntu.md deleted file mode 100644 index 53e7ea3fa6..0000000000 --- a/sources/tech/20200324 Audacious 4.0 Released With Qt 5- Here-s How to Install it on Ubuntu.md +++ /dev/null @@ -1,106 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Audacious 4.0 Released With Qt 5: Here’s How to Install it on Ubuntu) -[#]: via: (https://itsfoss.com/audacious-4-release/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -Audacious 4.0 Released With Qt 5: Here’s How to Install it on Ubuntu -====== - -[Audacious][1] is an open-source audio player available for multiple platforms that include Linux. Almost after 2 years of its last major release, Audacious 4.0 has arrived with some big changes. - -The latest release Audacious 4.0 comes with [Qt 5][2] UI by default. You can still go for the old GTK2 UI from the source – however, the new features will be added to the Qt UI only. - -Let’s take a look at what has changed and how to install the latest Audacious on your Linux system. - -### Audacious 4.0 Key Changes & Features - -![Audacious 4 Release][3] - -Of course, the major change would be the use of Qt 5 UI as the default. In addition to that, there are a lot of improvements and feature additions mentioned in their [official announcement post][4], here they are: - - * Clicking on playlist column headers sorts the playlist - * Dragging playlist column headers changes the column order - * Application-wide settings for volume and time step sizes - * New option to hide playlist tabs - * Sorting playlist by path now sorts folders after files - * Implemented additional MPRIS calls for compatibility with KDE 5.16+ - * New OpenMPT-based tracker module plugin - * New VU Meter visualization plugin - * Added option to use a SOCKS network proxy - * The Song Change plugin now works on Windows - * New “Next Album” and “Previous Album” commands - * The tag editor in Qt UI can now edit multiple files at once - * Implemented equalizer presets window for Qt UI - * Lyrics plugin gained the ability to save and load lyrics locally - * Blur Scope and Spectrum Analyzer visualizations ported to Qt - * MIDI plugin SoundFont selection ported to Qt - * JACK output plugin gained some new options - * Added option to endlessly loop PSF files - - - -If you didn’t know about it previously, you can easily get it installed and use the equalizer coupled with [LADSP][5] effects to tweak your music experience. - -![Audacious Winamp Classic Interface][6] - -### How to Install Audacious 4.0 on Ubuntu - -It is worth noting that the [unofficial PPA][7] is made available by [UbuntuHandbook][8]. You can simply follow the instructions below to install it on Ubuntu 16.04, 18.04, 19.10, and 20.04. - -1\. First, you have to add the PPA to your system by typing in the following command in the terminal: - -``` -sudo add-apt-repository ppa:ubuntuhandbook1/apps -``` - -3\. Next, you need to update/refresh the package information from the repositories/sources you have and proceed to install the app. Here’s how to do that: - -``` -sudo apt update -sudo apt install audacious audacious-plugins -``` - -That’s it. You don’t have to do anything else. In either case, if you want to [remove the PPA and the software][9], just type in the following commands in order: - -``` -sudo add-apt-repository --remove ppa:ubuntuhandbook1/apps -sudo apt remove --autoremove audacious audacious-plugins -``` - -You can also check out their GitHub page for more information on the source and potentially install it on other Linux distros as well, if that’s what you’re looking for. - -[Audacious Source Code][10] - -### Wrapping Up - -The new features and the Qt 5 UI switch should be a good thing to improve the user experience and the functionality of the audio player. If you’re a fan of the classic Winamp interface, it works just fine as well – but missing a few features as mentioned in their announcement post. - -You can try it out and let me know your thoughts in the comments below! - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/audacious-4-release/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://audacious-media-player.org -[2]: https://doc.qt.io/qt-5/qt5-intro.html -[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/audacious-4-release.jpg?ssl=1 -[4]: https://audacious-media-player.org/news/45-audacious-4-0-released -[5]: https://www.ladspa.org/ -[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/audacious-winamp.jpg?ssl=1 -[7]: https://itsfoss.com/ppa-guide/ -[8]: http://ubuntuhandbook.org/index.php/2020/03/audacious-4-0-released-qt5-ui/ -[9]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ -[10]: https://github.com/audacious-media-player/audacious diff --git a/sources/tech/20200326 Tricks for getting around your Linux file system.md b/sources/tech/20200326 Tricks for getting around your Linux file system.md deleted file mode 100644 index e8ed2b3869..0000000000 --- a/sources/tech/20200326 Tricks for getting around your Linux file system.md +++ /dev/null @@ -1,146 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Tricks for getting around your Linux file system) -[#]: via: (https://www.networkworld.com/article/3533421/tricks-for-getting-around-your-linux-file-system.html) -[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) - -Tricks for getting around your Linux file system -====== -The cd command is probably one of the first 10 that any Linux user learns, but it's not the only way to navigate the Linux file system.Here are some other ways. -Thinkstock - -Whether you're moving around the file system, looking for files or trying to move into important directories, Linux can provide a lot of help. In this post, we'll look at a number of tricks to make moving around the file system and both finding and using commands that you need a little easier. - -### Adding to your $PATH - -One of the easiest and most useful ways to ensure that you don't have to invest a lot of time into finding commands on a Linux system is to add the proper directories to your $PATH variable. The order of directories that you add to your $PATH variable is, however, very important. They determine the order in which the system will look through the directories to find the command to run -- stopping when it finds the first match. - -You might, for example, want to put your home directory first so that, if you create a script that has the same name as some other executable, it will be the one that you end up running whenever you type its name. - -[RELATED: Linux hardening: a 15-step checklist for a secure Linux server][1] - -To add your home directory to your $PATH variable, you could do this: - -``` -$ export PATH=~:$PATH -``` - -The **~** character represents your home directory. - -If you keep your scripts in your bin directory, this would work for you: - -``` -$ export PATH=~/bin:$PATH -``` - -You can then run a script located in your home directory like this: - -[][2] - -``` -$ myscript -Good morning, you just ran /home/myacct/bin/myscript -``` - -**IMPORTANT:** The commands shown above _add_ to your search path because $PATH (the current path) is included. They don't override it. Your search path should be configured in your **.bashrc** file, and any changes you intend to be permanent should be added there as well. - -### Using symbolic links - -Symbolic links provide an easy and obvious way to record the location of directories that you might need to use often. If you manage content for a web site, for example, you might want to get your account to "remember" where the web files are located by creating a link like this: - -``` -ln -s /var/www/html www -``` - -The order of the arguments is critical. The first (/var/www/html) is the target and the second is the name of the link that you will be creating. If you're not currently located in your home directory, the following command would do the same thing: - -``` -ln -s /var/www/html ~/www -``` - -After setting this up, you can use "cd www" to get to **/var/www/html**. - -### Using shopt - -The **shopt** command also provides a way to make moving to a different directory a bit easier. When you employ **shopt'**s **autocd** option, you can go to a directory simply by typing its name. For example: - -``` -$ shopt -s autocd -$ www -cd -- www -/home/myacct/www -$ pwd -P -/var/www/html - -$ ~/bin -cd -- /home/myacct/bin -$ pwd -/home/myacct/bin -``` - -In the first set of commands above, the **shopt** command's **autocd** option is enabled. Typing **www** then invokes a "cd www" command. Because this symbolic link was created in one of the **ln** command examples above, this moves us to **/var/www/html**. The **pwd -P** command displays the actual location. - -In the second set, typing **~/bin** invokes a **cd** into the **bin** directory in the user's home. - -Note that the **autocd** behavior will _not_ kick in when what you type is a command –  even if it's also the name of a directory. - -The **shopt** command is a bash builtin and has a lot of options. This one just means that you don't have to type "cd" before the name of each directory you want to move into. - -To see **shopt**'s other options, just type "shopt". - -### Using $CDPATH - -Probably one of the most useful tricks for moving into particular directories is adding the paths that you want to be able to move into easily to your **$CDPATH**. This creates a list of directories that will be moved into by typing only a portion of the full path names. - -There is one aspect of this that may be just a little tricky. Your **$CDPATH** needs to include the directories that _contain_ the directories that you want to move into, not the directories themselves. - -For example, say that you want to be able to move into the **/var/www/html** directory simply by typing "cd html" and into subdirectories in /var/log using only "cd" and the simple directory names. In this case, this **$CDPATH** would work: - -``` -$ CDPATH=.:/var/log:/var/www -``` - -Here's what you would see: - -``` -$ cd journal -/var/log/journal -$ cd html -/var/www/html -``` - -Your **$CDPATH** kicks in when what you type is _not_ a full path. Then it looks down its list of directories in order to see if the directory you identified exists in one of them. Once it finds a match, it takes you there. - -Keeping the "." at the beginning of your **$CDPATH** means that you can move into local directories without having to have them defined in the **$CDPATH**. - -``` -$ export CDPATH=".:$CDPATH" -$ Videos -cd -- Videos -/home/myacct/Videos -``` - -It's not hard to move around the Linux file system, but you can save a few brain cells if you use some handy tricks for getting to various locations easily. - -Join the Network World communities on [Facebook][3] and [LinkedIn][4] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3533421/tricks-for-getting-around-your-linux-file-system.html - -作者:[Sandra Henry-Stocker][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ -[b]: https://github.com/lujun9972 -[1]: https://www.networkworld.com/article/3143050/linux/linux-hardening-a-15-step-checklist-for-a-secure-linux-server.html#tk.nww-fsb -[2]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy) -[3]: https://www.facebook.com/NetworkWorld/ -[4]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20200331 Rambox is an All-in-one Messenger for Linux.md b/sources/tech/20200331 Rambox is an All-in-one Messenger for Linux.md deleted file mode 100644 index f70829e98f..0000000000 --- a/sources/tech/20200331 Rambox is an All-in-one Messenger for Linux.md +++ /dev/null @@ -1,98 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Rambox is an All-in-one Messenger for Linux) -[#]: via: (https://itsfoss.com/rambox/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -Rambox is an All-in-one Messenger for Linux -====== - -_**Brief: Rambox is an all-in-one messenger that lets you combine multiple services like Discord, Slack, Facebook Messenger and hundreds of more such services in one place.**_ - -### Rambox: Add multiple messaging Services in a single app - -![][1] - -Rambox is one of the best ways to manage multiple services for communication through a single app installed. You can use [multiple messaging services][2] like Facebook Messenger, Gmail chats, AOL, Discord, Google Duo, [Viber][3] and a lot more from the same interface. - -This way, you don’t need to install individual apps or keep them opened in browser all the time. You can use a master password to lock the Rambox application. You can also use do not disturb feature. - -Rambox offers an [open source community edition][4] which is free to use. The paid pro version gives you access to 600+ apps while the community addition has 99+ apps. Pro version has additional features like themes, hibernation, ad-block, spell check and premium support. - -Don’t worry. The open source community edition itself is quite useful and you may not even need those pro features. - -### Features of Rambox - -![][5] - -While you should find most of the essential features in the open-source edition, you might notice some of them limited to the pro version. - -Here, I’ve mentioned all the essential features available: - - * You get about 100 apps/services to choose from in the open-source edition - * Ability to protect the app with a single Master password lock - * Ability to lock each session that you load up - * Do Not Disturb mode - * Ability to sync apps and configuration across multiple devices. - * You can create and add custom apps - * Support for keyboard shortcuts - * Ability to enable/disable apps without needing to delete them - * JS & CSS injection support to tweak the styling of apps - * Ad-block (**pro version**) - * Hibernation support (**pro version**) - * Theme support (**pro version**) - * Mobile view **(pro version)** - * Spell check **(pro version)** - * Work hours – to schedule a time for incoming notifications **(pro version)** - * Proxies support **(pro version)** - - - -In addition to what I’ve listed here, you might find some more features in the Rambox Pro edition. To know more about it, you can refer to the [official list of features][6]. - -It is also worth noting that you cannot have more than 3 active simultaneous device connections. - -### Installing Rambox on Linux - -You can easily get started using Rambox using the **.AppImage** file available on the [official download page][4]. If you’re curious, you can refer our guide on how to [use the AppImage file on Linux][7]. - -In either case, you can also get it from the [Snap store][8]. Also, feel free to check their [GitHub releases section][9] for **.deb / .rpm** or other packages. - -[Download Rambox Community Edition][4] - -### Wrapping Up - -It can be a little overwhelming to have a lot of apps installed using Rambox. So, I’d suggest you monitor the RAM usage when adding more apps and using them for work. - -There is also a similar app called [Franz][10] which is also part open source and part premium like Rambox. - -Even though solutions like Rambox or Franz are quite useful, they aren’t always resource-friendly, specially if you start using tens of services at the same time. So, keep an eye on your system resources (if you notice a performance impact). - -Otherwise, it’s an impressive app that does the work that you’d expect. Have you tried it out? Feel free to let me know your thoughts! - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/rambox/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/03/rambox-ce.jpg?ssl=1 -[2]: https://itsfoss.com/best-messaging-apps-linux/ -[3]: https://itsfoss.com/viber-linux-client-beta-install/ -[4]: https://rambox.pro/#ce -[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/rambox-preferences.png?ssl=1 -[6]: https://rambox.pro/#features -[7]: https://itsfoss.com/use-appimage-linux/ -[8]: https://snapcraft.io/rambox -[9]: https://github.com/ramboxapp/community-edition/releases -[10]: https://itsfoss.com/franz-messaging-app/ diff --git a/sources/tech/20200401 3 Python templating languages you should (probably) never use.md b/sources/tech/20200401 3 Python templating languages you should (probably) never use.md deleted file mode 100644 index e23b443b0d..0000000000 --- a/sources/tech/20200401 3 Python templating languages you should (probably) never use.md +++ /dev/null @@ -1,180 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (3 Python templating languages you should (probably) never use) -[#]: via: (https://opensource.com/article/20/4/python-templating-languages) -[#]: author: (Moshe Zadka https://opensource.com/users/moshez) - -3 Python templating languages you should (probably) never use -====== -Python has accumulated a lot of templating languages, including these -three that are perfect for April Fools' Day. -![Hands on a keyboard with a Python book ][1] - -When reaching for a templating language for writing a [Python][2] web application, there are an abundance of robust solutions.  - -There are [Jinja2][3], [Genshi, and Mako][4]. There are even solutions like [Chameleon][5], which are a bit older, but still recommended by the [Pyramid][6] framework. - -Python has been around for a long time. In that time, deep in the corners of its system, it has accumulated some almost forgotten templating languages that are well worth poking at. - -Like cute koalas on top of a eucalyptus tree, happy in their ecological niche, and sometimes as dangerous to work with, these are the templating languages few have heard of—and even fewer should use. - -### 3\. string.Template - -Have you ever wondered, "How can I get a templating language with no features, but also without needing to **pip install** anything?" The Python standard library has you covered. While it does no looping or conditionals, the **string.Template** class is a minimal templating language. - -Using it is simplicity itself. - - -``` ->>> import string ->>> greeting = string.Template("Hello, $name, good $time!") ->>> greeting.substitute(name="OpenSource.com", time="afternoon") -'Hello, OpenSource.com, good afternoon!' -``` - -### 2\. twisted.web.template - -What gift do you give the library that has everything? - -Not a templating language, certainly, because it already has one. Nestled in **twisted.web.template** are two templating languages. One is XML-based and has a [great tutorial][7]. - -But there is another one, one that is based on using Python as a domain-specific language to produce HTML documents. - -It is based on two primitives: **twisted.web.template.tags**, which contains tag objects, and **twisted.web.template.flattenString**, which will render them. Because it is part of Twisted, it has built-in support for rendering async results efficiently. - -This example will render a silly little page: - - -``` -async def render(reactor): -    my_title = "A Fun page" -    things = ["one", "two", "red", "blue"] -    template = tags.html( -            tags.head( -                tags.title(my_title), -            ), -            tags.body( -                tags.h1(my_title), -                tags.ul( -                    [tags.li(thing) for thing in things], -                ), -                tags.p( -                    task.deferLater(reactor, 3, lambda: "Hello "), -                    task.deferLater(reactor, 3, lambda: "world!"), -                ) -            ) -    ) -    res = await flattenString(None, template) -    res = res.decode('utf-8') -    with open("hello.html", 'w') as fpout: -        fpout.write(res) -``` - -The template is regular Python code that uses the **tags.<TAGNAME>** to indicate the hierarchy. It natively supports strings as renderables, so any string is fine. - -To render it, the only things you need to do are to add a preamble: - - -``` -from twisted.internet import task, defer -from twisted.web.template import tags, flattenString - -def main(reactor): -    return defer.ensureDeferred(render(reactor)) -``` - -and an epilogue to run the whole thing: - - -``` -`task.react(main)` -``` - -In just _three_ seconds (and not _six_), it will render a nice HTML page. In real-life, those **deferLater**s can be, for example, calls to an HTTP API: they will be sent and processed in parallel, without having to put in any effort. I recommend you instead read about a [far better use for Twisted][8]. But still, this works. - -### 1\. Quixote - -You will say, "But Python is not _optimized_ for being an HTML-spouting domain-specific language." What if, instead of settling for Python-as-is, there was a language that [transpiles][9] to Python, but is better at defining templates? A "Python template language" (PTL), if you will. - -Writing your own language is sometimes said to be a dreamer's project for someone who tilts at windmills. Irony was not lost on the creators of Quixote (available on [PyPI][10]) when they decided to do exactly that. - -The following will render an equivalent template to the one done with Twisted above. _Warning: the following is not valid Python_: - - -``` -import time - -def render [html] (): -    my_title = "A Fun page" -    things = ["one", "two", "red", "blue"] -    "<html><head><title>" -    my_title -    "</head></title><body><h1>" -    my_title -    "</h1>" -    "<ul>" -    for thing in things: -        "<li>" -        thing -        "</li>" -    "<p>" -    time.sleep(3) -    (lambda: "Hello ")() -    time.sleep(3) -    (lambda: "world!")() -    "</p>" -    "</body></html>" - -def write(): -    result = render() -    with open("hello.html", 'w') as fpout: -        fpout.write(str(result)) -``` - -However, if you put it in a file called **template.ptl**, you can make it importable to Quixote and write out the rendered version of the template: - - -``` ->>> from quixote import enable_ptl ->>> enable_ptl() ->>> import template ->>> template.write() -``` - -Quixote installs an import hook that will cause PTL files to transpile into Python. Note that this render takes _six_ seconds, not _three_; you no longer gain free asynchronicity. - -### So many templates in Python - -Python has a long and winding history of libraries, some of which can achieve the same outcomes in more or less similar ways (for example, Python [package management][11]). - -On this April Fools' Day, I hope you enjoyed exploring three ways you _can_ create templates in Python. Instead, I recommend starting with [one of these libraries][4] for ways you _should_ template. - -Do you have another esoteric way to template? Share it in the comments below! - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/python-templating-languages - -作者:[Moshe Zadka][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) -[2]: https://opensource.com/resources/python -[3]: https://opensource.com/article/20/2/jinja2-cheat-sheet -[4]: https://opensource.com/resources/python/template-libraries -[5]: https://chameleon.readthedocs.io/en/latest/ -[6]: https://opensource.com/article/18/5/pyramid-framework -[7]: https://twistedmatrix.com/documents/13.1.0/web/howto/twisted-templates.html -[8]: https://opensource.com/article/20/3/treq-python -[9]: https://en.wikipedia.org/wiki/Source-to-source_compiler -[10]: https://pypi.org/project/Quixote/ -[11]: https://opensource.com/article/19/4/managing-python-packages diff --git a/sources/tech/20200404 Best Raspberry Pi Operating Systems for Various Purposes.md b/sources/tech/20200404 Best Raspberry Pi Operating Systems for Various Purposes.md deleted file mode 100644 index f4b09c9dbc..0000000000 --- a/sources/tech/20200404 Best Raspberry Pi Operating Systems for Various Purposes.md +++ /dev/null @@ -1,296 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Best Raspberry Pi Operating Systems for Various Purposes) -[#]: via: (https://itsfoss.com/raspberry-pi-os/) -[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) - -Best Raspberry Pi Operating Systems for Various Purposes -====== - -[Raspberry Pi][1] is an indispensable single-board computer that comes in handy for a lot of work. Don’t believe me? Just [go through this list of Raspberry Pi projects][2] to get a gist of what this tiny device is capable of. - -Considering how useful a Raspberry Pi is – it is an important task to choose the right operating system for it. Of course, you can do a lot of things with Linux but an OS specially configured for a specific purpose can save you considerable time and effort. - -So, in this article, I will be mentioning some of the popular and useful operating systems tailored for Raspberry Pi. - -### Installing any OS on Raspberry Pi is really easy thanks to the Raspberry Pi Imager tool - -[Installing a Raspberry PI operating system on an SD card][3] is easier than ever before. You can simply get the [Raspberry Pi Imager][4] and get any Raspberry Pi OS installed quickly. Check the official video to see how easy it is. - -You may also utilize [NOOBS][5] (New Out Of the Box Software) to easily install different operating systems on Raspberry Pi. You might also get a pre-installed SD card from the list of their supported retailers mentioned in their [official NOOBS download page][5]. - -Feel free to explore more about installing the operating systems in their [official documentation][6]. - -[Raspberry Pi OS Download][4] - -Now that you know how to install it (and where to get it from), let me highlight a list of useful Raspberry Pi OS to help you out. - -### Various operating systems for Raspberry Pi - -Please keep in mind that I have taken some effort to list only those Raspberry Pi operating system projects that are being actively maintained. If a project gets discontinued in near future, let me know in the comment section and I’ll update this article. - -Another thing is that I have focused on the latest Raspberry 4 but this should not be considered a list of Raspberry Pi 4 OS. You should be able to use it on Raspberry Pi 3, 3 B+ and other variants as well but please check the official project websites for the exact details. - -**Note:** The list is in no particular order of ranking. - -#### 1\. Raspbian OS: The official Raspberry Pi OS - -![][7] - -Raspbian is the officially supported OS for Raspberry Pi boards. It comes baked in with several tools for education, programming, and general use. Specifically, it includes Python, Scratch, Sonic Pi, Java, and several other important packages. - -Originally, Raspbian is based on Debian and comes pre-installed with loads of useful packages. So, when you get this installed, you probably don’t need to install essentials separately – you should find almost everything pre-installed. - -Raspbian OS is actively maintained and it is one of the most popular Raspberry Pi OS out there. You can install it using [NOOBS][5] or follow the [official documentation][6] to get it installed. - -[Raspbian OS][8] - -#### 2\. Ubuntu MATE: For general purpose computing - -![][9] - -Even though Raspbian is the officially supported OS, it does not feature the latest and greatest packages. So, if you want quicker updates and potentially latest packages, you can try Ubuntu MATE for Raspberry Pi. - -Ubuntu MATE tailored as a Raspberry Pi OS is an incredibly lightweight distribution to have installed. It’s also popularly used on [NVIDIA’s Jetson Nano][10]. In other words, you can utilize it for several use-cases with the Raspberry Pi. - -To help you out, we also have a detailed guide on [how to install Ubuntu MATE on Raspberry Pi][11]. - -[Ubuntu MATE for Raspberry Pi][12] - -#### 3\. Ubuntu Server: To use it as a Linux server - -![][13] - -If you’re planning to use your Raspberry Pi as some sort of server for your project, Ubuntu Server can be a great choice to have installed. - -You can find both 32-bit and 64-bit images of the OS. And, depending on what board you have (if it supports 64-bit), you can go ahead and install the same. - -However, it is worth noting that Ubuntu Server isn’t tailored for desktop usage. So, you need to keep in mind that you will have no proper graphical user interface installed by default. - -[Ubuntu Server][14] - -#### 4\. LibreELEC: For media server - -![][15] - -While we already have a list of [media server software available for Linux][16], LibreELEC is one of them. - -It’s a great lightweight OS system capable enough to have [KODI][17] on your Raspberry Pi. You can try installing it using the Raspberry Pi Imager. - -You can easily head to their [official download webpage][18] and find a suitable installer image for your board. - -[LibreELEC][19] - -#### 5\. OSMC: For media server - -![][20] - -OSMC is yet another [popular media server software][16] for Linux. While considering the use of Raspberry Pi boards as media center devices, this is one of the best Raspberry Pi OS that you can recommend to someone. - -Similar to LibreELEC, OSMC also runs KODI to help you manage your media files and enjoy watching the content you already have. - -OSMC does not officially mention the support for **Raspberry Pi 4**. So, if you have Raspberry Pi 3 or lower, you should be good to go. - -[OSMC][21] - -#### 6\. RISC OS: The original ARM OS - -![][22] - -Originally crafted for ARM devices, RISC OS has been around for almost 30 years or so. - -We also have a separate detailed article on [RISC OS][23], if you’re curious to know more about it. Long story short, RISC OS is also tailored for modern ARM-based single-board computers like the Raspberry Pi. It presents a simple user interface with a focus on performance. - -Again, this is not something meant for the Raspberry Pi 4. So, only if you have a Raspberry Pi 3 or lower, you can give it a try. - -[RISC OS][24] - -#### 7\. Mozilla WebThings Gateway: For IoT projects - -![][25] - -As part of Mozilla’s [open-source implementation for IoT devices][26], WebThings Gateway lets you monitor and control all your connected IoT devices. - -You can follow the [official documentation][27] to check the requirements and the instructions to get it installed on a Raspberry Pi. Definitely, one of the most useful Raspberry Pi OS for IoT applications. - -[WebThings Gateway][28] - -#### 8\. Ubuntu Core: For IoT projects - -Yet another Raspberry Pi OS for potential [IoT][29] applications or just to simply test snaps – Ubuntu Core. - -Ubuntu core is specifically tailored for IoT devices or specifically Raspberry Pi, here. I wouldn’t make any claims about it- but Ubuntu Core is a suitable secure OS for Raspberry Pi boards. You can give this a try for yourself! - -[Ubuntu Core][30] - -#### 9\. DietPi: Lightweight Raspberry Pi OS - -![DietPi Screenshot via Distrowatch][31] - -DietPi is a lightweight [Debian][32] operating system that also claims to be lighter than the “Raspbian Lite” OS. - -While considering it as a lightweight Raspberry Pi OS, it offers a lot of features that could come in handy for several use-cases. Ranging from easy installers for software packages to a backup solution, there’s a lot to explore. - -If you’re aiming to get an OS with a low footprint but potentially better performance, you could give this a try. - -[DietPi][33] - -#### 10\. Lakka Linux: Make a retro gaming console - -![][34] - -Looking for a way to turn your Raspberry Pi to a retro gaming console? - -Lakka Linux distribution is originally built on the RetroArch emulator. So, you can have all your retro games on your Raspberry Pi in no time. - -We also have a separate article on [Lakka Linux][35] – if you’re curious to know about it. Or else, just go right ahead and test it out! - -[Lakka][36] - -#### 11\. RetroPie: For retro gaming - -![ ][37] - -RetroPie is yet another popular Raspberry Pi OS that turns it into a retro gaming console. It features several configuration tools so that you can customize the theme or just tweak the emulator to have the best retro games. - -It is worth noting that it does not include any copyrighted games. You can give it a try and see how it works! - -[RetroPie][38] - -#### 12\. Kali Linux: For hacking on budget - -![][39] - -Want to try and learn some ethical hacking skills on your Raspberry Pi? Kali Linux can be a perfect fit for it. And, yes, it usually supports the latest Raspberry Pi as soon as it launches. - -Not just limited to Raspberry Pi, but you can get a long list of other supported devices as well. Try it out and have fun! - -[Kali Linux][40] - -#### 13\. OpenMediaVault: For Network Attached Storage (NAS) - -![][41] - -If you’re trying to set up a [NAS][42] (Network Attached Storage) solution on minimal hardware, Raspberry Pi can help. - -Originally, based on Debian Linux, OpenMediaVault offers a bunch of features that include web-based administration capabilities, plugin support, and more. It does support most of the Raspberry Pi models – so you can try downloading it and get it installed! - -[OpenMediaVault][43] - -#### 14\. ROKOS: For crypto mining - -![][44] - -If you’re someone who’s interested in cryptocurrencies and bitcoins specifically, this could interest you. - -ROKOS is a Debian-based OS that basically lets you turn your Raspberry Pi into a node while having pre-installed drivers and packages for the same. Of course, you need to know how it works before getting it installed. So, I suggest you do some research if you’re not sure what you’re doing. - -[ROKOS][45] - -#### 15\. Alpine Linux: Lightweight security-focused Linux - -Nowadays, a lot of users are usually looking for security-focused and [privacy-focused distributions][46]. And, if you are one of them, you might as well try Alpine Linux for Raspberry Pi. - -It may not be as user-friendly as you’d expect (or beginner-friendly) if you’re just getting started with Raspberry Pi. But, if you want something different to start with, you can try Alpine Linux, which is a security-focused Linux distribution. - -[Alpine Linux][47] - -#### 16\. Kano OS: Operating system for kids’education - -![][48] - -If you’re looking for an open-source OS for Raspberry Pi to make things interesting to learn and educate kids, Kano OS is a good choice. - -It’s being actively maintained and the user experience for the desktop integration on Kano OS is quite simple and fun for someone to play and make kids learn from it. - -[Kano OS][49] - -#### 17\. KDE Plasma Bigscreen: To convert regular TVs into Smart TVs - -![][50] - -This is an under development project from KDE. With [KDE Plasma Bigscreen OS][51] installed on Raspberry Pi, you can use your regular TV like a smart TV. - -You don’t need a special remote to control the TV. You can use the regular remote control. - -Plasma Bigscreen also integrates [MyCroft open source AI][52] for voice control. - -The project is in beta phase so expect some bugs and issues if you are willing to give it a try. - -[Plasma Bigscreen][53] - -#### Wrapping Up - -I’m sure there are a lot of other operating systems tailored for Raspberry Pi – but I’ve tried to list the most popular or the useful ones that are actively maintained. - -If you think I missed one of best suited Raspberry Pi OS, feel free to let me know about it in the comments below! - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/raspberry-pi-os/ - -作者:[Ankush Das][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/ankush/ -[b]: https://github.com/lujun9972 -[1]: https://www.raspberrypi.org/ -[2]: https://itsfoss.com/raspberry-pi-projects/ -[3]: https://itsfoss.com/tutorial-how-to-install-raspberry-pi-os-raspbian-wheezy/ -[4]: https://www.raspberrypi.org/downloads/ -[5]: https://www.raspberrypi.org/downloads/noobs/ -[6]: https://www.raspberrypi.org/documentation/installation/installing-images/README.md -[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/raspbian_home_screen.jpg?resize=800%2C492&ssl=1 -[8]: https://www.raspbian.org/ -[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/04/Desktop-ubuntu.jpg?resize=800%2C600&ssl=1 -[10]: https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-nano/ -[11]: https://itsfoss.com/ubuntu-mate-raspberry-pi/ -[12]: https://ubuntu-mate.org/raspberry-pi/ -[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/ubunt-server.png?ssl=1 -[14]: https://ubuntu.com/download/raspberry-pi -[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/libreelec.jpg?resize=800%2C600&ssl=1 -[16]: https://itsfoss.com/best-linux-media-server/ -[17]: https://kodi.tv/ -[18]: https://libreelec.tv/downloads_new/ -[19]: https://libreelec.tv/ -[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/osmc-server.jpg?resize=800%2C450&ssl=1 -[21]: https://osmc.tv/ -[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/10/riscos5.1.jpg?resize=800%2C600&ssl=1 -[23]: https://itsfoss.com/risc-os-is-now-open-source/ -[24]: https://www.riscosopen.org/content/ -[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/web-things-gateway.png?ssl=1 -[26]: https://iot.mozilla.org/about/ -[27]: https://iot.mozilla.org/docs/gateway-getting-started-guide.html -[28]: https://iot.mozilla.org/gateway/ -[29]: https://en.wikipedia.org/wiki/Internet_of_things -[30]: https://ubuntu.com/download/raspberry-pi-core -[31]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/diet-pi.jpg?ssl=1 -[32]: https://www.debian.org/ -[33]: https://dietpi.com/ -[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2016/08/lakkaos.jpg?resize=1024%2C640&ssl=1 -[35]: https://itsfoss.com/lakka-retrogaming-linux/ -[36]: http://www.lakka.tv/ -[37]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/retro-pie.png?ssl=1 -[38]: https://retropie.org.uk/ -[39]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/kali-linux-pi.png?ssl=1 -[40]: https://www.offensive-security.com/kali-linux-arm-images/ -[41]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/openmediavault.jpg?ssl=1 -[42]: https://en.wikipedia.org/wiki/Network-attached_storage -[43]: https://www.openmediavault.org/ -[44]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/rocos-bitcoin-pi.jpg?ssl=1 -[45]: https://rokos.space/ -[46]: https://itsfoss.com/privacy-focused-linux-distributions/ -[47]: https://alpinelinux.org/ -[48]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/kano-os-pi.jpeg?ssl=1 -[49]: https://kano.me/row/downloadable -[50]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/plasma-bigscreen-menu.jpg?ssl=1 -[51]: https://itsfoss.com/kde-plasma-bigscreen/ -[52]: https://itsfoss.com/mycroft-mark-2/ -[53]: https://plasma-bigscreen.org/#download-jumpto diff --git a/sources/tech/20200404 Bodhi Linux 5.1 Review- Slightly Different Lightweight Linux.md b/sources/tech/20200404 Bodhi Linux 5.1 Review- Slightly Different Lightweight Linux.md deleted file mode 100644 index 6b8be0c8bd..0000000000 --- a/sources/tech/20200404 Bodhi Linux 5.1 Review- Slightly Different Lightweight Linux.md +++ /dev/null @@ -1,129 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (qfzy1233) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Bodhi Linux 5.1 Review: Slightly Different Lightweight Linux) -[#]: via: (https://itsfoss.com/bodhi-linux-review/) -[#]: author: (John Paul https://itsfoss.com/author/john/) - -Bodhi Linux 5.1 Review: Slightly Different Lightweight Linux -====== - -Bodhi Linux is a [lightweight Linux distribution][1] based on Ubuntu. Unlike most other distributions, Bodhi uses its own Moksha desktop and focuses on providing you a minimal setup to run on older computers. - -### What is Bodhi Linux? - -![Bodhi Start Page][2] - -[Bodhi Linux][3] was first introduced in 2011. It is designed with “[minimalism, resource efficiency, and user choice][4]” in mind. The devs strove to provide a “[system that is functional but not bloated][5]“. As such, it uses the lightweight Moksha Desktop and has only the basic applications preinstalled. The idea is to give the user a stable platform to build the system that they want. It is based on the latest Ubuntu LTS. - -### Moksha Desktop - -![Bodhi Desktop][6] - -Originally Bodhi shipped with the [Enlightenment desktop environment][7]. Bodhi Linux has long been known as the “Enlightened” Linux distro. In fact, the word ‘bodhi’ is based on the Sanskrit word for “enlightenment”. - -However, that changed when Enlightenment 18 was released. The release was in such bad shape that it was not included in Bodhi. Enlightenment 19 was released and fixed some of the problems, but still had issues. - -After trying to work with the Enlightenment dev team and getting nowhere, the Bodhi devs [forked][8] Enlightenment 17 in 2015. The new desktop environment would be named [Moksha][9], which is based on the Sanskrit word for “emancipation, liberation, or release”. You can find the code for it on [GitHub][10]. - -### What is new in 5.1.0? - -[Subscribe to our YouTube channel for more Linux videos][11] - -[Bodhi 5.1.0][12] is the first release in two years and the second release to be based on Ubuntu 18.04. Besides updating packages, it also has new default icons and theme. This release makes several changes to the default applications. Leafpad comes preinstalled instead of epad and [GNOME Web][13] (also known as Epiphany) replaces [Midori][14]). The eepDater system updater was removed. - -There are currently [four different versions][15] of Bodhi 5.1.0 available to [download][16]: Standard, Hwe, Legacy, and AppPack. - - * Standard will work for systems made in the last decade. It does not push kernel updates. - * Hwe (Hardware Enablement) edition is new to the Bodhi family and is designed to include support for newer hardware and will received kernel updates. The 5.1 release features the 5.3.0-42 kernel. - * Legacy is the only edition that is 32-bit. It uses the “older 4.9.0-6-686 Linux kernel that is optimized for old (15+ years old) hardware. This kernel also does not include the PAE extension which is not supported on many older systems.” - * The AppPack edition is for those who want a fully-loaded system out of the box and comes with many applications preinstalled. - - - -### System Requirements for Bodhi Linux - -Minimum system requirement - - * 500 MHz processor - * 256 MB of RAM - * 5 GB of drive space - - - -Recommended system requirement - - * 1.0 GHz processor - * 512 MB of RAM - * 10 GB of drive space - - - -### Experiencing Bodhi Linux - -![Old Bodhi Linux][17] - -Since it is based on Ubuntu, installing Bodhi was very simple. After I signed into Bodhi, I was surprised by the new theme and icon set. The last time I installed Bodhi (including 5.0 a couple of months ago) I thought that it needed a new look. There was nothing really wrong with the previous theme, but it looked like something from the early 2000. The new theme gives it a more modern look. - -![Bodhi Linux 5.1][18] - -I was also glad to see that Midori had been replaced by GNOME Web. I’m not a fan of [Midori browser][19]. It always seemed too minimal for me. (However, that might change in the future with [Midori Next][20].) Web felt more like the web browser I need. Most importantly it comes with Firefox Sync, so I can keep all of my bookmarks and passwords synced. - -Unlike many Linux distros, Bodhi doesn’t really come with a stand-alone software center. Instead, if you click the AppCenter icon it opens the browser and navigates to the [AppCenter p][21][a][21][ge][21] of the Bodhi website. Here apps are sorted by category. Most of them are [lightweight applications][22]. - -![Bodhi Linux Appcenter][23] - -If you click on one of the pages and click “Install”, Bodhi will install it (after to type in your passwords). This is achieved using a neat little program named [apturl][24] that “is a very simple way to install a software package from a web browser”. It’s pretty slick and I wish more Ubuntu-based distros would use it. - -Overall, I like the Moksha desktop. It adheres to the desktop metaphor we have seen for decades (and which I am most comfortable with). It stays out of your way but is very easy to change and modify. The only thing I miss is that the application menu doesn’t open when I hit the super key. But I guess you can’t have everything in life. - -### Final Thoughts - -I was pleasantly surprised by this recent release of Bodhi Linux. In the past, I’ve played with it from time to time. I always liked it, but this last release has been the best so far. In a way, they have broken free of the idea that Bodhi is only for older system by adding support for newer kernels. - -If you are looking for a change of scenery while staying close to the world of Ubuntu give [Bodhi Linux][3] a try. - -Have you ever used Bodhi Linux? What is your favorite Ubuntu-based distro? Please let us know in the comments below. - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][25]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/bodhi-linux-review/ - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/john/ -[b]: https://github.com/lujun9972 -[1]: https://itsfoss.com/lightweight-linux-beginners/ -[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/bodhi-start-page.png?resize=800%2C500&ssl=1 -[3]: https://www.bodhilinux.com/ -[4]: https://www.bodhilinux.com/w/wiki/ -[5]: https://www.bodhilinux.com/w/what-is-bodhi-linux/ -[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/bodhi-desktop.jpg?resize=800%2C500&ssl=1 -[7]: https://www.enlightenment.org/start -[8]: https://www.bodhilinux.com/2015/04/28/introducing-the-moksha-desktop/ -[9]: https://www.bodhilinux.com/moksha-desktop/ -[10]: https://github.com/JeffHoogland/moksha -[11]: https://www.youtube.com/c/itsfoss?sub_confirmation=1 -[12]: https://www.bodhilinux.com/2020/03/25/bodhi-linux-5-1-0-released/ -[13]: https://wiki.gnome.org/Apps/Web/ -[14]: https://en.wikipedia.org/wiki/Midori_(web_browser -[15]: https://www.bodhilinux.com/w/selecting-the-correct-iso-image/ -[16]: https://www.bodhilinux.com/download/ -[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/bodhi.png?resize=800%2C400&ssl=1 -[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/bodhi-Linux-5-1-screenshot.jpg?ssl=1 -[19]: https://itsfoss.com/midori-browser/ -[20]: https://www.midori-browser.org/2020/01/15/midori-next-come-on-yarovi-we-can/ -[21]: https://www.bodhilinux.com/a/ -[22]: https://itsfoss.com/lightweight-alternative-applications-ubuntu/ -[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/Bodhi-Linux-AppCenter.png?resize=800%2C500&ssl=1 -[24]: https://wiki.ubuntu.com/AptUrl -[25]: https://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20200407 How to avoid man-in-the-middle cyber attacks.md b/sources/tech/20200407 How to avoid man-in-the-middle cyber attacks.md deleted file mode 100644 index c8a72579ef..0000000000 --- a/sources/tech/20200407 How to avoid man-in-the-middle cyber attacks.md +++ /dev/null @@ -1,94 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (tinyeyeser ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to avoid man-in-the-middle cyber attacks) -[#]: via: (https://opensource.com/article/20/4/mitm-attacks) -[#]: author: (Jackie Lam https://opensource.com/users/beenverified) - -How to avoid man-in-the-middle cyber attacks -====== -Understanding MITM attacks is the first step in not being a victim of -this high-tech style of eavesdropping. -![Security monster][1] - -Whether you're sending data on your computer or talking to someone online, you want to assume some level of security and privacy. - -But what if a third party is eavesdropping online, unbeknownst to you? And worse, what if they're impersonating someone from a business you trust in order to gain damaging information? This could put your personal data into the hands of dangerous, would-be thieves. - -Welcome to what's called a man-in-the-middle (MITM) attack. - -### What are man-in-the-middle attacks? - -A man-in-the-middle attack occurs when a cybercriminal inserts themselves into communications between you, the targeted victim, and a device in order to steal sensitive information that can be used for a variety of criminal purposes—most notably identity theft, says Steve J. J. Weisman, founder of Scamicide. - -"A man-in-the-middle-attack can also occur when the victim believes he or she is communicating with a legitimate app or website," says Weisman, "when the truth is that the victim is communicating with a phony website or app and thereby providing sensitive information to the criminal." - -One of the oldest forms of cyberattacks, MITM attacks have been around since the 1980s. What's more, they're quite common. As Weisman explains, there are a handful of ways a MITM attack can happen: - - * **Attacking a WiFi router that is not properly secured:** This typically occurs when someone is using public WiFi. "While home routers might be vulnerable, it's more common for criminals to attack public WiFi networks," says Weisman. The goal is to spy on unsuspecting people who are handling sensitive information, such as their online bank accounts, he adds. - * **Hacking email accounts of banks, financial advisers, and other companies:** "Once [the criminals] have hacked these email systems, they send out emails that appear to come from the legitimate bank or other company," Weisman says. "[They ask] for personal information, such as usernames and passwords, under the guise of an emergency. The targeted victim is lured into providing that information." - * **Sending phishing emails:** Thieves might also send emails pretending to be legitimate companies that the targeted victim does business with, asking the recipient for their personal information. "In many instances, the spear-phishing emails will direct the victim to a counterfeit website that appears to be that of a legitimate company with which the victim does business," says Weisman. - * **Using malicious code in legitimate websites:** Attackers can also place malicious code—usually JavaScript—into a legitimate website by way of a web application. "When the victim loads the legitimate page, the malicious code just sits in the background until the user enters sensitive information, such as account login or credit card details, which the malicious code then copies and sends to the attackers' servers," says Nicholas McBride, a cybersecurity consultant. - - - -### What is an example of an MITM attack? - -The Lenovo case is a well-known example of an MITM attack. In 2014 and 2015, the major computer manufacturer sold consumer laptops with preinstalled software that meddled with how a user's browser communicated with websites. Whenever the user's cursor hovered over a product, this software, called VisualDiscovery, sent pop-up ads from retail partners that sold similar products. - -Here's the kicker: This MITM attack allowed VisualDiscovery to access all of the user's personal data, including social security numbers, info about financial transactions, medical info, and logins and passwords. All without the user knowing or granting permission beforehand. The FTC deemed this a deceptive and unfair online scam. Lenovo agreed to pay $8.3 million in a class-action settlement in 2019. - -### How can I protect myself from an online attack? - - * **Avoid using public WiFi:** Weisman recommends never using public WiFi for financial transactions unless you've installed a reliable virtual private network (VPN) client on your device and have a VPN host you can use and trust. Over a VPN connection, your communications are encrypted, so your information can't be stolen. - - * **Be on the lookout:** Be wary of emails or text messages that ask you to update your password or provide your username or personal information. These methods can be used to steal your identity. - -If you are unsure of the actual identity of the party sending you the email, you can use tools such as a reverse phone or email search. With a reverse phone number lookup, you may be able to find out more about the identity of an unknown texter. And with a reverse email lookup, you can try to determine who might have sent you a message. - -Generally, if something's actually a problem, you'll hear from someone you know and trust within your company, or from someone you can also go and meet, in person, at your bank or school or other organization. Important account information is never the purview of an unknown technician. - - * **Don't click on links contained in emails:** If someone sends you an email telling you that you need to sign into an account, don't click on the link provided in the email. Instead, navigate to the site yourself, log in as you normally would, and look for an alert there. If you don't see an alert message in your account settings, contact a representative by phone using contact information on the site and _not_ from the email. - - * **Install reliable security software:** If you're on Windows, install good open source antivirus like [ClamAV][2]. On all platforms, keep your software up to date with the latest security patches. - - * **Take alerts seriously:** If you're visiting a site that starts with HTTPS, your browser might alert you to an issue, says McBride. For instance, if the domain name on the site's certificate doesn't match the one you're trying to visit. Don't ignore the alert. Heed it and navigate away from the site for now. Verify that you haven't [mistyped it][3], and if the problem persists, contact the site owner if you can. - - * **Use an ad blocker:** Pop-up ads (also known as _adware attacks_) can be used to intercept your personal information, so use an ad blocker. "The truth is, as an individual user, it's hard to protect against a MITM attack," says McBride, "as it is designed to leave the victim in the dark and to prevent them from noticing that there is anything wrong." - -A good open source ad blocker (or "wide-spectrum blocker," in the developer's words) is [uBlock origin][4]. It's available for both Firefox and Chromium (and all Chromium-based browsers, such as Chrome, Brave, Vivaldi, Edge, and so on), and even Safari. - - - - -### Stay alert - -Remember, you don't have to click anything online right away, and you don't have to follow random people's instructions, no matter how urgent they may seem. The internet will still be there after you step away from the computer and verify the identity of a person or site demanding your attention. - -While MITM attacks can happen to anyone, understanding what they are, knowing how they happen, and actively taking steps to prevent them can safeguard you from being a victim. - -* * * - -_This article was originally published on [BeenVerified.com][5] under a [CC BY-SA 2.0][6] license._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/mitm-attacks - -作者:[Jackie Lam][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/beenverified -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_password_chaos_engineer_monster.png?itok=J31aRccu (Security monster) -[2]: https://www.clamav.net -[3]: https://opensource.com/article/20/1/stop-typosquatting-attacks -[4]: https://github.com/gorhill/uBlock -[5]: https://www.beenverified.com/crime/what-is-a-man-in-the-middle-attack/ -[6]: https://creativecommons.org/licenses/by-sa/2.0/ diff --git a/sources/tech/20200407 How to use pyenv to run multiple versions of Python on a Mac.md b/sources/tech/20200407 How to use pyenv to run multiple versions of Python on a Mac.md deleted file mode 100644 index a77ff4ede5..0000000000 --- a/sources/tech/20200407 How to use pyenv to run multiple versions of Python on a Mac.md +++ /dev/null @@ -1,186 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (MjSeven) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to use pyenv to run multiple versions of Python on a Mac) -[#]: via: (https://opensource.com/article/20/4/pyenv) -[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg) - -How to use pyenv to run multiple versions of Python on a Mac -====== -If you need to run a project that uses a Python version you don't have -installed on macOS, try pyenv. -![Searching for code][1] - -Managing a local Python development environment continues to be a challenge, even for experienced developers. While there are well-documented [strategies for package management][2], there is another step necessary to ensure you are running the version of Python you need when you need it. - -### Why does the version of Python matter? - -It's a strange concept at first, but programming languages change like any other software. They have bugs, fixes, and updates like any of your favorite [APIs][3] and any other software. Similarly again, different releases are identified by a three-digit number known as a [semantic version][4]. - -> 😭😭😭 [pic.twitter.com/yt1Z2439W8][5] -> -> — Denny Perez (@dennyperez18) [May 28, 2019][6] - -For many years, Python 2 was the commonly used major version of the programming language. In January 2020, Python 2 [reached end of life][7], and only Python 3 will be supported by the language's core maintainers from then forward. Python 3 is developing steadily, and releasing new updates regularly. That makes it important for me to regularly get those updates. - -Recently, I tried to run a project on macOS that depended on Python 3.5.9, a version that I did not have installed on my system. It might seem logical to think the Python package manager **pip** could install it*, but that wasn't the case: - - -``` -$ pip install python3.5.9 -Collecting python3.5.9 -  ERROR: Could not find a version that satisfies the requirement python3.5.9 (from versions: none) -ERROR: No matching distribution found for python3.5.9 -``` - -Alternatively, I could have downloaded that version from the official Python website, but how would I run it in on my Mac alongside my existing version of Python? Specifying the version of Python I intend to use every time I run the interpreter (python3.7 or python3.5 for example) seems error-prone at best. There has to be a better way. - -_(A note on the above: I know this makes no sense to seasoned Python developer, but it made sense to me at the time. I would happily talk about why I still think it should.)_ - -### Installing and setting up pyenv - -Thankfully, **pyenv** exists to work around this series of complexities. To start, I needed to install pyenv. I could clone and compile it myself [from source][8], but I prefer to manage packages like this through the Homebrew package manager: - - -``` -`$ brew install pyenv` -``` - -In order to use the version of Python through pyenv, it's essential to understand the shell's PATH variable. PATH determines where the shell searches for files by the name of the command. You must ensure the shell will find the version of Python run by pyenv, not the one installed by default (which is often called the _system version_). If you don't change the path, here is the result: - - -``` -$ which python -/usr/bin/python -``` - -That's the system version of Python. - -To set up pyenv correctly, you can run the following in Bash or zsh: - - -``` -`$ PATH=$(pyenv root)/shims:$PATH` -``` - -Now, if you check the version of Python, you'll see it is the one managed by pyenv: - - -``` -$ which python -/Users/my_username/.pyenv/shims/python -``` - -That export statement (PATH=) will only change for this shell instance, so make it a permanent change, you need to add it to your dotfiles. Since zsh is officially macOS's default shell, I'll focus on it. Append that same syntax to the **~/.zshrc** file: - - -``` -`$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc` -``` - -Now every time we run a command in zsh, it will use the pyenv version of Python. Note that I used single quotes with **echo** so it does not evaluate and expand the commands. - -The .zshrc file only manages zsh instances, so be sure to check what your shell is and edit the associated dotfiles. If you need to double-check what your default shell is, you can run **echo $SHELL**. If it's zsh, use the command above. If you use Bash, change **~/.zshrc** to **~/.bashrc**. You can dive deep into [path setting][9] in pyenv's README if you would like to learn more. - -### Using pyenv to manage Python versions - -Now that pyenv is in control, we can see it only has the system Python available to it: - - -``` -$ pyenv versions -system -``` - -As mentioned above, you absolutely do not want to use this version ([read more on why][10]). Now that pyenv is set up correctly, I want it to have a few different versions of Python that I regularly use. - -There is a way to see all Python versions available from all the different repositories pyenv has access to by running **pyenv install --list**. It's a long, overwhelming list that may be helpful to review in the future. For now, I stick with the latest of each dot-release (3.5.x or 3.6.x where x is the latest) found on the [Python download page][11]. With that in mind, I'll install 3.5.9 and 3.8.0: - - -``` -$ pyenv install 3.5.9 -$ pyenv install 3.8.0 -``` - -This will take a while, so get some tea (or read one of the links above). It's interesting to note that the output walks through the download and building of that version of Python. For example, the output shows that the file comes directly from [Python.org][12]. - -Once everything is installed, you can set up your defaults. I like to live at the cutting edge, so I set my global default Python version to the latest: - - -``` -`$ pyenv global 3.8.0` -``` - -And that version is immediately set in my shell. To confirm: - - -``` -$ python -V -Python 3.8.0 -``` - -The project I want to run works only with Python 3.5, so I'll set the version locally and confirm it's in use: - - -``` -$ pyenv local 3.5.9 -$ python -V -Python 3.5.9 -``` - -Because I used the **local** option with pyenv, it added a file to my current directory to track that information.  - - -``` -$ cat .python-version -3.5.9 -``` - -Now, I can finally set up a virtual environment for the project I want and be sure I'm running the right version of Python. - - -``` -$ python -m venv venv -$ source ./venv/bin/activate -(venv) $ which python -/Users/mbbroberg/Develop/my_project/venv/bin/python -``` - -To learn more, check out this tutorial about [managing virtual environments on a Mac][13]. - -### Wrapping up - -By default, running multiple Python versions can be a challenge. I find starting with pyenv ensures I have the versions of Python I need set up to run when I need them. - -Do you have other beginner or intermediate Python questions? Leave a comment, and we will consider them for a future article. - -Newcomers to python-ideas occasionally make reference to the idea of "Python 4000" when proposing... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/pyenv - -作者:[Matthew Broberg][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/mbbroberg -[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://opensource.com/article/19/4/managing-python-packages -[3]: https://opensource.com/article/19/5/api-evolution-right-way -[4]: https://semver.org/ -[5]: https://t.co/yt1Z2439W8 -[6]: https://twitter.com/dennyperez18/status/1133505310516232203?ref_src=twsrc%5Etfw -[7]: https://opensource.com/article/19/11/end-of-life-python-2 -[8]: https://github.com/pyenv/pyenv -[9]: https://github.com/pyenv/pyenv#understanding-path -[10]: https://opensource.com/article/19/5/python-3-default-mac -[11]: https://www.python.org/downloads/ -[12]: http://python.org -[13]: https://opensource.com/article/19/6/python-virtual-environments-mac diff --git a/sources/tech/20200408 My Linux Story- From 8-bit enthusiast to Unix sysadmin.md b/sources/tech/20200408 My Linux Story- From 8-bit enthusiast to Unix sysadmin.md deleted file mode 100644 index b777bbe74e..0000000000 --- a/sources/tech/20200408 My Linux Story- From 8-bit enthusiast to Unix sysadmin.md +++ /dev/null @@ -1,78 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (bingzxy) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (My Linux Story: From 8-bit enthusiast to Unix sysadmin) -[#]: via: (https://opensource.com/article/20/4/linux-story) -[#]: author: (James Farrell https://opensource.com/users/jamesf) - -bingzxy is translating -My Linux Story: From 8-bit enthusiast to Unix sysadmin -====== -How my early interest in computers got me hooked on a career as a -sysadmin and Linux fan. -![Person typing on a 1980's computer][1] - -It all started in the mid-1980s with an [Apple ][c][2] that my parents purchased for our family. Although I enjoyed playing games, I quickly became fascinated with BASIC programming and how useful it could be for work and fun. This was an era when computers were viewed as little more than typewriters, so people with "advanced computer skills" could easily use them to their advantage. - -One example was using BASIC and a dot matrix printer to auto-generate punishment assignments. When I was assigned to write out 200 times some apologetic statements, I asked my teacher if it could be typed out. On confirmation, I wrote a 5 line BASIC program to generate it for me. Another example of subtle trickery was using non-WYSIWYG word processors, such as AppleWorks for micro-manipulation of fonts, line spacing, and margins to "stretch" term papers out to the required length. - -My obsession with computers quickly lead to an Apple ][gs with a RAM drive card and an x86 PC co-processor card. Modems and BBSs were getting hot, and having a dual-hardware system like this gave me all sorts of options for software. However, modem speeds of 2400bps put a real damper on getting anything more than a few KBs of fun downloads per day. I stuck with Apple as a hobby for some time, but that was soon to change. - -### Venturing into Unix - -My undergraduate program was BS in Computer Information Systems (CIS) and my graduate degree was MS in Computer Science. My undergraduate education program put me mostly into PCs and a little into timeshare mainframes. The real fun began in my graduate programs, where dial-in access to Unix machines with internet connections opened a whole new world of exploration. Although I still used my dual-processor ][gs for modem work and writing and printing papers, Unix systems really grabbed my attention with their general-access Telnet-based games, FTP archives, online email, and C programming. Gopher was popular and growing with people like me who were bound to plain terminal interfaces. - -My graduate program took a fateful turn for the better when I was assigned to the academic computing department, which was charged with running computer services for the school. The students had access to [Ultrix][3]-based systems with X Window terminals. Most were grayscale, as color processing was then a CPU intensive task and really affected system performance. The few color systems were nice, but those machines just dragged. - -This was a really fun time for me, as I was given root access to systems and assigned to system and network maintenance. I had some excellent mentors, and this strongly influenced my decision to get into system administration rather than programming (although I still really love programming to this day). - -### From Unix to Linux - -Scarcity is the mother of invention, and we students often got creative when we had to share the scant resources of the school's computer systems. We had three to five times more students than we had Ultrix workstations, so finding resources (especially at project delivery time) was often a challenge. There was a bank of 56k [PPP][4] modems available for remote system access when graphical displays were not needed. However, finding a machine with spare resources and sharing the system for source compilation often resulted in slow progress. Like most, I found working at night often helped, but I needed something else to let me iterate more quickly. - -Then one of the school's sysadmins suggested I check out a Unix system that was freely available. This was Linux, made available as 3.5" floppy images. Given our school's blazing fast T1 line, it was easy for me to search newsgroups and other sources to learn how to download it. It was all 32-bit Intel PC-based, a class of equipment that I did not own. - -Luckily, my work at the school gave me access to junk piles of old computers, so the wheels started turning. - -I found enough discarded PCs to build a solid 80386 PC with some decent RAM (I am sure well under 1GB), a workable graphic display, a thin-net (coax) Ethernet card, and a hard disk. The images I had were Linux kernel 0.98, and I don't recall it being part of an official distribution (it might have been SLS). What I do remember is that it came on a series of floppy images—the first booted the kernel and a minimal installer, next it formatted the drive, and then it asked for each successive floppy image to install the core GNU utilities. After the core was installed and the system bootable, you would download and install other package images, like compilers and such. - -This was a serious boon to me in my academic career. With no X Window server display running, this PC seriously outperformed the Ultrix workstations I had access to at school. I was allowed to connect this machine to the academic network, mount the school's student Network File System (NFS) shares, and access the internet directly. Since my graduate program used [GCC][5] (and sometimes Perl 4) for most student work, I could do my development work locally. This gave me exclusive access to a key resource that enabled me to iterate more quickly on my projects. - -All was not perfect, however. The hardware was a tiny bit unstable (likely why it was discarded), but I could deal with that. What really got me was how much Linux and Ultrix differed at the OS and system library level. I began to appreciate what it meant to port software to other platforms; I was free to develop wherever I wanted, but I had to deliver my projects as Ultrix compiled binaries. The C code that ran perfectly on one platform would crash on the other. This was very frustrating, but probably my rudest awakening was early Linux's handling of null-pointer dereferencing. Linux seemed happy to pass over these as a virtual no-op, but Ultrix promptly dumped core on [SIGSEGV][6]. This was quite a thing to find out when my first port to the target platform happened days before my project was due! This also made my exploration of C++ quite challenging, as my careless use of malloc()/free() along with automatic [constructor and destructor][7] processing peppered my projects with null pointer bombs all over the place. - -Toward the end of my graduate program, I upgraded to a complete beast of a workstation—an Intel 486DX2 66MHz with SCSI hard drives, a CD-ROM drive, a 1024x768 RGB monitor, and a 16550 UART serial card perfectly matched to my new US Robotics V.Everything modem. It could dual-boot Windows and Linux, but more importantly, the graphics card and processor allowed a much more pleasant (and faster) development environment. The old 386 was still in service back at the school, but most of my heavy work and hacking now happened at home. - -Similar to [Mike Harris' story][8] about Linux in the '90s, I really got into those CD bundles that were popular at the time. There was a new Micro Center computer store close to where I lived, and it was a goldmine of hobby PC parts, phenomenal technical books, and every conceivable Linux (and free Unix) CD archive. I remember [Yggdrasil][9] and [Slackware][10] being some of my favorite distributions. What was really incredible was the enormous size of CD storage—650MB! This was an essential resource for getting access to software. Yes, you could download the bits at 56k, but that was quite limiting. Not to mention the fact that most people could not afford to archive that much idle data for later perusal. - -### And on to today - -This is what kicked off my more than 25 years of system administration and open source software fun. Linux has been an important part of both my career and personal development. Nowadays, I am still heavily into Linux (mostly CentOS, RedHat, and Ubuntu), but often have fun with the likes of [FreeBSD][11] and other cool open source offerings. - -My forays into Linux led me to Opensource.com, where I hope to give back a little and help bootstrap new generations of hands-on computer fun. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/linux-story - -作者:[James Farrell][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jamesf -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) -[2]: https://en.wikipedia.org/wiki/Apple_IIc -[3]: https://en.wikipedia.org/wiki/Ultrix -[4]: https://en.wikipedia.org/wiki/Point-to-Point_Protocol -[5]: https://en.wikipedia.org/wiki/GNU_Compiler_Collection -[6]: https://en.wikipedia.org/wiki/Segmentation_fault -[7]: https://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm -[8]: https://opensource.com/article/19/11/learning-linux-90s -[9]: https://en.wikipedia.org/wiki/Yggdrasil_Linux/GNU/X -[10]: http://slackware.com -[11]: https://www.freebsd.org/ diff --git a/sources/tech/20200410 Get started with Bash programming.md b/sources/tech/20200410 Get started with Bash programming.md deleted file mode 100644 index cadcef4c71..0000000000 --- a/sources/tech/20200410 Get started with Bash programming.md +++ /dev/null @@ -1,157 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (mr-ping) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Get started with Bash programming) -[#]: via: (https://opensource.com/article/20/4/bash-programming-guide) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Get started with Bash programming -====== -Learn how to write custom programs in Bash to automate your repetitive -tasks. Download our new eBook to get started. -![Command line prompt][1] - -One of the original hopes for Unix was that it would empower everyday computer users to fine-tune their computers to match their unique working style. The expectations around computer customization have diminished over the decades, and many users consider their collection of apps and websites to be their "custom environment." One reason for that is that the components of many operating systems are not open, so their source code isn't available to normal users. - -But for Linux users, custom programs are within reach because the entire system is based around commands available through the terminal. The terminal isn't just an interface for quick commands or in-depth troubleshooting; it's a scripting environment that can reduce your workload by taking care of mundane tasks for you. - -### How to learn programming - -If you've never done any programming before, it might help to think of it in terms of two different challenges: one is to understand how code is written, and the other is to understand what code to write. You can learn _syntax_—but you won't get far without knowing what words are available to you in the _language_. In practice, you start learning both concepts all at once because you can't learn syntax without words to arrange, so initially, you write simple tasks using basic commands and basic programming structures. Once you feel comfortable with the basics, you can explore more of the language so you can make your programs do more and more significant things. - -In [Bash][2], most of the _words_ you use are Linux commands. The _syntax_ is Bash. If you already use Bash on a frequent basis, then the transition to Bash programming is relatively easy. But if you don't use Bash, you'll be pleased to learn that it's a simple language built for clarity and simplicity. - -### Interactive design - -Sometimes, the hardest thing to figure out when learning to program is what a computer can do for you. Obviously, if a computer on its own could do everything you do with it, then you wouldn't have to ever touch a computer again. But the reality is that humans are important. The key to finding something your computer can help you with is to take notice of tasks you repeatedly do throughout the week. Computers handle repetition particularly well. - -But for you to be able to tell your computer to do something, you must know how to do it. This is an area Bash excels in: interactive programming. As you perform an action in the terminal, you are also learning how to script it. - -For instance, I was once tasked with converting a large number of PDF books to versions that would be low-ink and printer-friendly. One way to do this is to open the PDF in a PDF editor, select each one of the hundreds of images—page backgrounds and textures counted as images—delete them, and then save it to a new PDF. Just one book would take half a day this way. - -My first thought was to learn how to script a PDF editor, but after days of research, I could not find a PDF editing application that could be scripted (outside of very ugly mouse-automation hacks). So I turned my attention to finding out to accomplish the task from within a terminal. This resulted in several new discoveries, including GhostScript, the open source version of PostScript (the printer language PDF is based on). By using GhostScript for the task for a few days, I confirmed that it was the solution to my problem. - -Formulating a basic script to run the command was merely a matter of copying the command and options I used to remove images from a PDF and pasting them into a text file. Running the file as a script would, presumably, produce the same results. - -### Passing arguments to a Bash script - -The difference between running a command in a terminal and running a command in a shell script is that the former is interactive. In a terminal, you can adjust things as you go. For instance, if I just processed **example_1.pdf** and am ready to process the next document, to adapt my command, I only need to change the filename. - -A shell script isn't interactive, though. In fact, the only reason a shell _script_ exists is so that you don't have to attend to it. This is why commands (and the shell scripts that run them) accept arguments. - -In a shell script, there are a few predefined variables that reflect how a script starts. The initial variable is **$0**, and it represents the command issued to start the script. The next variable is **$1**, which represents the first "argument" passed to the shell script. For example, in the command **echo hello**, the command **echo** is **$0,** and the word **hello** is **$1**. In the command **echo hello world**, the command **echo** is **$0**, **hello** is **$1**, and **world** is **$2**. - -In an interactive shell: - - -``` -$ echo hello world -hello world -``` - -In a non-interactive shell script, you _could_ do the same thing in a very literal way. Type this text into a text file and save it as **hello.sh**: - - -``` -`echo hello world` -``` - -Now run the script: - - -``` -$ bash hello.sh -hello world -``` - -That works, but it doesn't take advantage of the fact that a script can take input. Change **hello.sh** to this: - - -``` -`echo $1` -``` - -Run the script with two arguments grouped together as one with quotation marks: - - -``` -$ bash hello.sh "hello bash" -hello bash -``` - -For my PDF reduction project, I had a real need for this kind of non-interactivity, because each PDF took several minutes to condense. But by creating a script that accepted input from me, I could feed the script several PDF files all at once. The script processed each one sequentially, which could take half an hour or more, but it was a half-hour I could use for other tasks. - -### Flow control - -It's perfectly acceptable to create Bash scripts that are, essentially, transcripts of the exact process you took to achieve the task you need to be repeated. However, scripts can be made more powerful by controlling how information flows through them. Common methods of managing a script's response to data are: - - * if/then - * for loops - * while loops - * case statements - - - -Computers aren't intelligent, but they are good at comparing and parsing data. Scripts can feel a lot more intelligent if you build some data analysis into them. For example, the basic **hello.sh** script runs whether or not there's anything to echo: - - -``` -$ bash hello.sh foo -foo -$ bash hello.sh - -$ -``` - -It would be more user-friendly if it provided a help message when it receives no input. That's an if/then statement, and if you're using Bash in a basic way, you probably wouldn't know that such a statement existed in Bash. But part of programming is learning the language, and with a little research you'd learn about if/then statements: - - -``` -if [ "$1" = "" ]; then -        echo "syntax: $0 WORD" -        echo "If you provide more than one word, enclose them in quotes." -else -        echo "$1" -fi -``` - -Running this new version of **hello.sh** results in: - - -``` -$ bash hello.sh -syntax: hello.sh WORD -If you provide more than one word, enclose them in quotes. -$ bash hello.sh "hello world" -hello world -``` - -### Working your way through a script - -Whether you're looking for something to remove images from PDF files, or something to manage your cluttered Downloads folder, or something to create and provision Kubernetes images, learning to script Bash is a matter of using Bash and then learning ways to take those scripts from just a list of commands to something that responds to input. It's usually a process of discovery: you're bound to find new Linux commands that perform tasks you never imagined could be performed with text commands, and you'll find new functions of Bash to make your scripts adaptable to all the different ways you want them to run. - -One way to learn these tricks is to read other people's scripts. Get a feel for how people are automating rote commands on their systems. See what looks familiar to you, and look for more information about the things that are unfamiliar. - -Another way is to download our [introduction to programming with Bash][3] eBook. It introduces you to programming concepts specific to Bash, and with the constructs you learn, you can start to build your own commands. And of course, it's free to download and licensed under a [Creative Commons][4] license, so grab your copy today. - -### [Download our introduction to programming with Bash eBook!][3] - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/bash-programming-guide - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt) -[2]: https://opensource.com/resources/what-bash -[3]: https://opensource.com/downloads/bash-programming-guide -[4]: https://opensource.com/article/20/1/what-creative-commons diff --git a/sources/tech/20200413 9 open source CSS frameworks for frontend web development.md b/sources/tech/20200413 9 open source CSS frameworks for frontend web development.md deleted file mode 100644 index 0d2bd7ddc1..0000000000 --- a/sources/tech/20200413 9 open source CSS frameworks for frontend web development.md +++ /dev/null @@ -1,254 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (9 open source CSS frameworks for frontend web development) -[#]: via: (https://opensource.com/article/20/4/open-source-css-frameworks) -[#]: author: (Bryant Son https://opensource.com/users/brson) - -9 open source CSS frameworks for frontend web development -====== -Explore open source CSS frameworks and find the right one for your -project. -![Digital creative of a browser on the internet][1] - -When most people think about web development, HTML or JavaScript usually come to mind. They usually forget about the technology that has far more impact on the ability to enjoy a website: [cascading style sheets (CSS)][2]. CSS is both one of the most important and the most often forgotten parts of any webpage, even though it's one of the three cornerstone technologies of the World Wide Web, according to Wikipedia. - -This article explores nine popular, powerful, and open source frameworks that make CSS development straightforward for building beautiful website frontends. - -Name | What It Is | License ----|---|--- -[Bootstrap][3] | The most popular CSS framework; by Twitter | MIT -[PatternFly][4] | Open source framework; by Red Hat | MIT -[Material Components for the web][5] | Open source framework; by Google | MIT -[Pure][6] | Open source framework; by Yahoo | BSD -[Foundation][7] | Frontend framework; by Zurb Foundation | MIT -[Bulma][8] | Modern CSS framework based on Flexbox | MIT -[Skeleton][9] | Lightweight CSS framework | MIT -[Materialize][10] | CSS framework based on Material Design | MIT -[Bootflat][11] | Open source Flat UI kit based on Bootstrap 3.3.0 | MIT - -  - -If you prefer to follow along as I explore this live, you can watch my video. - -### Bootstrap - -[Bootstrap][12] is easily the most popular CSS framework, and it is the one that started all frontend web design. Developed by Twitter, Bootstrap offers usability, functionality, and extensibility. - -![Bootstrap homepage][13] - -Bootstrap also offers plenty of [examples][14] to get you started. - -![Bootstrap examples][15] - -With Bootstrap, you can stitch together different components and layouts to create an interesting page design. It also offers plenty of detailed documentation. - -![Bootstrap documentation][16] - -Bootstrap's [GitHub][3] repository lists more than 19,000 commits and 1,100 contributors. It is based on the MIT License, so (as with all of the frameworks on this list) you can jump in and contribute as well. - -![Bootstrap GitHub][17] - -### PatternFly - -[PatternFly][18] is an open source (under the MIT License) CSS framework by Red Hat. PatternFly takes a different approach than Bootstrap: While Bootstrap is meant for anyone interested in creating a beautiful website, PatternFly is primarily focused on enterprise application developers and provides components, such as bars, charts, and navigations, that are very appealing for creating powerful, metrics-driven dashboards. In fact, Red Hat uses this CSS framework for the design of its products, such as OpenShift. - -![PatternFly homepage][19] - -In addition to static HTML, PatternFly also supports the ReactJS framework, a popular JavaScript framework developed by Facebook. - -![PatternFly ReactJS support][20] - -PatternFly has many advanced components, such as bars, charts, [modals][21], and layouts, that are suitable for enterprise-level applications. - -![PatternFly chart component][22] - -PatternFly's [GitHub][4] page lists more than 1,050 commits and 44 contributors. PatternFly is getting a lot of attention, and you are more than welcome to contribute. - -![PatternFly GitHub][23] - -### Material Components for the web - -With its highly successful Android platform, Google set its own standard design guidelines with a concept called [Material Design][24]. The Material Design standards are intended to be reflected across all Google products, and they are also available to the general public and open source under the MIT License. - -![Material Design homepage][25] - -Material Design has a number of [Components][26], "interactive building blocks for creating a user interface." These buttons, cards, backdrops, and more can be used to create any type of user interface for a website or mobile application. - -![Material Components webpage][27] - -The maintainers provide thorough documentation for different platforms. - -![Material Design documentation][28] - -There are also step-by-step tutorials with exercises for accomplishing different goals. - -![Material Design tutorial][29] - -The Material Components GitHub page hosts repos for different platforms, including [Material Components for the web (MDC Web)][5] for website development. MDC Web has more than 5,700 commits and 349 contributors. - -![MDC Web GitHub][30] - -### Pure - -Bootstrap, Patternfly, and MDC Web are very powerful CSS frameworks, yet they can be quite heavy and complex. If you want a lightweight CSS framework that it is closer to coding CSS yourself yet helps you build a nice web page, try [Pure.css][31]. Pure is a lightweight CSS framework with a minimal footprint. It was developed by Yahoo and is open source under the BSD License. - -![Pure.css homepage][32] - -Despite its small size, Pure offers plenty of the components necessary to build a good-looking webpage. - -![Pure.css components][33] - -Pure's [GitHub][6] page shows more than 565 commits and 59 contributors. - -![Pure.css GitHub][34] - -### Foundation - -[Foundation][35] claims to be the most advanced responsive frontend framework in the world. It provides advanced features and tutorials for building professional websites. - -![Foundation homepage][36] - -The framework is [used][37] by many companies, organizations, and even politicians, and it has plenty of documentation available. - -![Foundation documentation][38] - -Foundation's [GitHub][7] page shows nearly 17,000 commits and 1,000 contributors. Like most of the other frameworks on this list, it's available under the MIT License. - -![Foundation GitHub][39] - -### Bulma - -[Bulma][40] is an open source framework based on Flexbox and available under the MIT License. Bulma is a pretty lightweight framework, as it requires only one CSS file. - -![Bulma homepage][41] - -Bulma has clean and simple docs that make it easy to choose the topics you want to explore. It also has a number of web components you can just pick up and use in your design. - -![Bulma documentation][42] - -Bulma's [GitHub][8] page lists more than 1,400 commits and 300 contributors. - -![Bulma GitHub][43] - -### Skeleton - -If even Pure is too heavy for you, there is an even lighter-weight framework called [Skeleton][44]. The Skeleton library is only about 400 lines long, and the framework provides only the essential components to start your CSS framework journey. - -![Skeleton homepage][45] - -Despite its simplicity, Skeleton offers detailed docs to help you get started right away. - -![Skeleton documentation][46] - -Skeleton's [GitHub][9] lists 167 commits and 22 contributors. However, it's not the most active project; its last update was in 2014, so it may need some maintenance before using it. Since it is released under the MIT License, feel free to do that yourself. - -![Skeleton GitHub][47] - -### Materialize - -[Materialize][48] is a responsive frontend framework based on Google's Material Design with additional themes and components developed by Materialize's contributors. - -![Materialize homepage][49] - -Materialize's documentation page is comprehensive and pretty easy to follow. Its components page includes buttons, cards, navigations, and more. - -![Materialize documentation][50] - -Materialize is an open source project under the MIT License, and its [GitHub][10] lists more than 3,800 commits and 250 contributors. - -![Materialize GitHub][51] - -### Bootflat - -[Bootflat][52] is an open source CSS framework derived from Twitter's Bootstrap. Compared to Bootstrap, Bootflat is simpler, with lighter-weight framework components. - -![Bootflat homepage][53] - -Bootflat's [documentation][54] almost seems inspired by IKEA—it shows an image of each component without much text. - -![Bootflat docs][55] - -Bootflat is available under the MIT License, and its [GitHub][11] page includes 159 commits and eight contributors, as of this writing. - -![Bootflat GitHub][56] - -### Which CSS framework should you choose? - -You have many options for open source CSS frameworks, depending on how feature-rich or simple you want the tooling to be. Like all technology decisions, there is no single right answer for everything or everyone; there is only the right choice for the given time and the given project. - -Give a few of these a spin and see which one you want to use in your next project. Also, did I miss any interesting open source CSS frameworks? Please share your feedback and ideas in the comments below. - -Which frontend framework should you pick for your next web app? Pam Selle will address this... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/open-source-css-frameworks - -作者:[Bryant Son][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet) -[2]: https://en.wikipedia.org/wiki/Cascading_Style_Sheets -[3]: https://github.com/twbs/bootstrap -[4]: https://github.com/patternfly/patternfly -[5]: https://github.com/material-components/material-components-web -[6]: https://github.com/pure-css/pure -[7]: https://github.com/foundation/foundation-sites -[8]: https://github.com/jgthms/bulma -[9]: https://github.com/dhg/Skeleton -[10]: https://github.com/Dogfalo/materialize -[11]: https://github.com/bootflat/bootflat.github.io -[12]: https://getbootstrap.com -[13]: https://opensource.com/sites/default/files/uploads/2_bootstrapscreenshot.jpg (Bootstrap homepage) -[14]: https://getbootstrap.com/docs/4.4/examples/ -[15]: https://opensource.com/sites/default/files/uploads/3_bootstrapsamples.jpg (Bootstrap examples) -[16]: https://opensource.com/sites/default/files/uploads/4_bootstrapdocs.jpg (Bootstrap documentation) -[17]: https://opensource.com/sites/default/files/uploads/5_bootstrapgithub.jpg (Bootstrap GitHub) -[18]: https://www.patternfly.org -[19]: https://opensource.com/sites/default/files/uploads/6_patternflyhomepage.jpg (PatternFly homepage) -[20]: https://opensource.com/sites/default/files/uploads/7_patternflyreactjs.jpg (PatternFly ReactJS support) -[21]: https://en.wikipedia.org/wiki/Modal_window -[22]: https://opensource.com/sites/default/files/uploads/8_patternflycomponents.jpg (PatternFly chart component) -[23]: https://opensource.com/sites/default/files/uploads/9_patternflygithub.jpg (PatternFly GitHub) -[24]: https://material.io -[25]: https://opensource.com/sites/default/files/uploads/10_materialhome.jpg (Material Design homepage) -[26]: https://material.io/components/ -[27]: https://opensource.com/sites/default/files/uploads/11_materialcomponents.jpg (Material Components webpage) -[28]: https://opensource.com/sites/default/files/uploads/12_materialdocs.jpg (Material Design documentation) -[29]: https://opensource.com/sites/default/files/uploads/13_materialtutorial.jpg (Material Design tutorial) -[30]: https://opensource.com/sites/default/files/uploads/15_materialgithub.jpg (MDC Web GitHub) -[31]: https://purecss.io -[32]: https://opensource.com/sites/default/files/uploads/16_purehome.jpg (Pure.css homepage) -[33]: https://opensource.com/sites/default/files/uploads/17_purecomponents.jpg (Pure.css components) -[34]: https://opensource.com/sites/default/files/uploads/18_puregithub.jpg (Pure.css GitHub) -[35]: https://get.foundation -[36]: https://opensource.com/sites/default/files/uploads/19_foundationhome.jpg (Foundation homepage) -[37]: https://zurb.com/responsive -[38]: https://opensource.com/sites/default/files/uploads/21_foundationdocs.jpg (Foundation documentation) -[39]: https://opensource.com/sites/default/files/uploads/22_foundationgithub.jpg (Foundation GitHub) -[40]: https://bulma.io -[41]: https://opensource.com/sites/default/files/uploads/23_bulmahome.jpg (Bulma homepage) -[42]: https://opensource.com/sites/default/files/uploads/24_bulmadoc.jpg (Bulma documentation) -[43]: https://opensource.com/sites/default/files/uploads/25_bulmagithub.jpg (Bulma GitHub) -[44]: http://getskeleton.com -[45]: https://opensource.com/sites/default/files/uploads/26_skeletonhome.jpg (Skeleton homepage) -[46]: https://opensource.com/sites/default/files/uploads/27_skeletondocs.jpg (Skeleton documentation) -[47]: https://opensource.com/sites/default/files/uploads/28_skeletongithub.jpg (Skeleton GitHub) -[48]: https://materializecss.com -[49]: https://opensource.com/sites/default/files/uploads/29_materializehome.jpg (Materialize homepage) -[50]: https://opensource.com/sites/default/files/uploads/30_materializedocs.jpg (Materialize documentation) -[51]: https://opensource.com/sites/default/files/uploads/31_materializegithub.jpg (Materialize GitHub) -[52]: http://bootflat.github.io -[53]: https://opensource.com/sites/default/files/uploads/32_bootflathome.jpg (Bootflat homepage) -[54]: http://bootflat.github.io/documentation.html -[55]: https://opensource.com/sites/default/files/uploads/33_bootflatdocs.jpg (Bootflat docs) -[56]: https://opensource.com/sites/default/files/uploads/34_bootflatgithub.jpg (Bootflat GitHub) diff --git a/sources/tech/20200414 How I containerize a build system.md b/sources/tech/20200414 How I containerize a build system.md deleted file mode 100644 index 1271aa27af..0000000000 --- a/sources/tech/20200414 How I containerize a build system.md +++ /dev/null @@ -1,166 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (LazyWolfLin) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How I containerize a build system) -[#]: via: (https://opensource.com/article/20/4/how-containerize-build-system) -[#]: author: (Ravi Chandran https://opensource.com/users/ravichandran) - -How I containerize a build system -====== -Building a repeatable structure to deliver applications as containers -can be complicated. Here is one way to do it effectively. -![Containers on a ship on the ocean][1] - -A build system is comprised of the tools and processes used to transition from source code to a running application. This transition also involves changing the code's audience from the software developer to the end user, whether the end user is a colleague in operations or a deployment system. - -After creating a few build systems using containers, I think I have a decent, repeatable approach that's worth sharing. These build systems were used for generating loadable software images for embedded hardware and compiling machine learning algorithms, but the approach is abstract enough to be used in any container-based build system. - -This approach is about creating or organizing the build system in a way that makes it easy to use and maintain. It's not about the tricks needed to deal with containerizing any particular software compilers or tools. It applies to the common use case of software developers building software to hand off a maintainable image to other technical users (whether they are sysadmins, DevOps engineers, or some other title). The build system is abstracted away from the end users so that they can focus on the software. - -### Why containerize a build system? - -Creating a repeatable, container-based build system can provide a number of benefits to a software team: - - * **Focus:** I want to focus on writing my application. When I call a tool to "build," I want the toolset to deliver a ready-to-use binary. I don't want to spend time troubleshooting the build system. In fact, I'd rather not know or care about the build system. - * **Identical build behavior:** Whatever the use case, I want to ensure that the entire team uses the same versions of the toolset and gets the same results when building. Otherwise, I am constantly dealing with the case of "it works on my PC but not yours." Using the same toolset version and getting identical output for a given input source file set is critical in a team project. - * **Easy setup and future migration:** Even if a detailed set of instructions is given to everyone to install a toolset for a project, chances are someone will get it wrong. Or there could be issues due to how each person has customized their Linux environment. This can be further compounded by the use of different Linux distributions across the team (or other operating systems). The issues can get uglier quickly when it comes time for moving to the next version of the toolset. Using containers and the guidelines in this article will make migration to newer versions much easier. - - - -Containerizing the build systems that I use on my projects has certainly been valuable in my experience, as it has alleviated the problems above. I tend to use Docker for my container tooling, but there can still be issues due to the installation and network configuration being unique environment to environment, especially if you work in a corporate environment involving some complex proxy settings. But at least now I have fewer build system problems to deal with. - -### Walking through a containerized build system - -I created a [tutorial repository][2] you can clone and examine at a later time or follow along through this article. I'll be walking through all the files in the repository. The build system is deliberately trivial (it runs **gcc**) to keep the focus on the build system architecture. - -### Build system requirements - -Two key aspects that I think are desirable in a build system are: - - * **Standard build invocation:** I want to be able to build code by pointing to some work directory whose path is **/path/to/workdir**. I want to invoke the build as: [code]`./build.sh /path/to/workdir`[/code] To keep the example architecture simple (for the sake of explanation), I'll assume that the output is also generated somewhere within **/path/to/workdir**. (Otherwise, it would increase the number of volumes exposed to the container, which is not difficult, but more cumbersome to explain.) - * **Custom build invocation via shell:** Sometimes, the toolset needs to be used in unforeseen ways. In addition to the standard **build.sh** to invoke the toolset, some of these could be added as options to **build.sh**, if needed. But I always want to be able to get to a shell where I can invoke toolset commands directly. In this trivial example, say I sometimes want to try out different **gcc** optimization options to see the effects. To achieve this, I want to invoke: [code]`./shell.sh /path/to/workdir`[/code] This should get me to a Bash shell inside the container with access to the toolset and to my **workdir**, so I can experiment as I please with the toolset. - - - -### Build system architecture - -To comply with the basic requirements above, here is how I architect the build system: - -![Container build system architecture][3] - -At the bottom, the **workdir** represents any software source code that needs to be built by the software developer end users. Typically, this **workdir** will be a source-code repository. The end users can manipulate this source code repository in any way they want before invoking a build. For example, if they're using **git** for version control, they could **git checkout** the feature branch they are working on and add or modify files. This keeps the build system independent of the **workdir**. - -The three blocks at the top collectively represent the containerized build system. The left-most (yellow) block at the top represents the scripts (**build.sh** and **shell.sh**) that the end user will use to interact with the build system. - -In the middle (the red block) is the Dockerfile and the associated script **build_docker_image.sh**. The development operations people (me, in this case) will typically execute this script and generate the container image. (In fact, I'll execute this many, many times until I get everything working right, but that's another story.) And then I would distribute the image to the end users, such as through a container trusted registry. The end users will need this image. In addition, they will clone the build system repository (i.e., one that is equivalent to the [tutorial repository][2]). - -The **run_build.sh** script on the right is executed inside the container when the end user invokes either **build.sh** or **shell.sh**. I'll explain these scripts in detail next. The key here is that the end user does not need to know anything about the red or blue blocks or how a container works in order to use any of this. - -### Build system details - -The tutorial repository's file structure maps to this architecture. I've used this prototype structure for relatively complex build systems, so its simplicity is not a limitation in any way. Below, I've listed the tree structure of the relevant files from the repository. The **dockerize-tutorial** folder could be replaced with any other name corresponding to a build system. From within this folder, I invoke either **build.sh** or **shell.sh** with the one argument that is the path to the **workdir**. - - -``` -dockerize-tutorial/ -├── build.sh -├── shell.sh -└── swbuilder -    ├── build_docker_image.sh -    ├── install_swbuilder.dockerfile -    └── scripts -        └── run_build.sh -``` - -Note that I've deliberately excluded the **example_workdir** above, which you'll find in the tutorial repository. Actual source code would typically reside in a separate repository and not be part of the build tool repository; I included it in this repository, so I didn't have to deal with two repositories in the tutorial. - -Doing the tutorial is not necessary if you're only interested in the concepts, as I'll explain all the files. But if you want to follow along (and have Docker installed), first build the container image **swbuilder:v1** with: - - -``` -cd dockerize-tutorial/swbuilder/ -./build_docker_image.sh -docker image ls  # resulting image will be swbuilder:v1 -``` - -Then invoke **build.sh** as: - - -``` -cd dockerize-tutorial -./build.sh ~/repos/dockerize-tutorial/example_workdir -``` - -The code for [build.sh][4] is below. This script instantiates a container from the container image **swbuilder:v1**. It performs two volume mappings: one from the **example_workdir** folder to a volume inside the container at path **/workdir**, and the second from **dockerize-tutorial/swbuilder/scripts** outside the container to **/scripts** inside the container. - - -``` -docker container run                              \ -    --volume $(pwd)/swbuilder/scripts:/scripts    \ -    --volume $1:/workdir                          \ -    --user $(id -u ${USER}):$(id -g ${USER})      \ -    --rm -it --name build_swbuilder swbuilder:v1  \ -    build -``` - -In addition, the **build.sh** also invokes the container to run with your username (and group, which the tutorial assumes to be the same) so that you will not have issues with file permissions when accessing the generated build output. - -Note that [**shell.sh**][5] is identical except for two things: **build.sh** creates a container named **build_swbuilder** while **shell.sh** creates one named **shell_swbuilder**. This is so that there are no conflicts if either script is invoked while the other one is running. - -The other key difference between the two scripts is the last argument: **build.sh** passes in the argument **build** while **shell.sh** passes in the argument **shell**. If you look at the [Dockerfile][6] that is used to create the container image, the last line contains the following **ENTRYPOINT**. This means that the **docker container run** invocation above will result in executing the **run_build.sh** script with either **build** or **shell** as the sole input argument. - - -``` -# run bash script and process the input command -ENTRYPOINT [ "/bin/bash", "/scripts/run_build.sh"] -``` - -[**run_build.sh**][7] uses this input argument to either start the Bash shell or invoke **gcc** to perform the build of the trivial **helloworld.c** project. A real build system would typically invoke a Makefile and not run **gcc** directly. - - -``` -cd /workdir - -if [ $1 = "shell" ]; then     -    echo "Starting Bash Shell" -    /bin/bash -elif [ $1 = "build" ]; then -    echo "Performing SW Build" -    gcc helloworld.c -o helloworld -Wall -fi -``` - -You could certainly pass more than one argument if your use case demands it. For the build systems I've dealt with, the build is usually for a given project with a specific **make** invocation. In the case of a build system where the build invocation is complex, you can have **run_build.sh** call a specific script inside **workdir** that the end user has to write. - -### A note about the scripts folder - -You may be wondering why the **scripts** folder is located deep in the tree structure rather than at the top level of the repository. Either approach would work, but I didn't want to encourage the end user to poke around and change things there. Placing it deeper is a way to make it more difficult to poke around. Also, I could have added a **.dockerignore** file to ignore the **scripts** folder, as it doesn't need to be part of the container context. But since it's tiny, I didn't bother. - -### Simple yet flexible - -While the approach is simple, I've used it for a few rather different build systems and found it to be quite flexible. The aspects that are going to be relatively stable (e.g., a given toolset that changes only a few times a year) are fixed inside the container image. The aspects that are more fluid are kept outside the container image as scripts. This allows me to easily modify how the toolset is invoked by updating the script and pushing the changes to the build system repository. All the user needs to do is to pull the changes to their local build system repository, which is typically quite fast (unlike updating a Docker image). The structure lends itself to having as many volumes and scripts as are needed while abstracting the complexity away from the end user. - -How will you need to modify your application to optimize it for a containerized environment? - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/how-containerize-build-system - -作者:[Ravi Chandran][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/ravichandran -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_2015-3-osdc-lead.png?itok=O6aivM_W (Containers on a ship on the ocean) -[2]: https://github.com/ravi-chandran/dockerize-tutorial -[3]: https://opensource.com/sites/default/files/uploads/build_sys_arch.jpg (Container build system architecture) -[4]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/build.sh -[5]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/shell.sh -[6]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/swbuilder/install_swbuilder.dockerfile -[7]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/swbuilder/scripts/run_build.sh diff --git a/sources/tech/20200415 How to automate your cryptocurrency trades with Python.md b/sources/tech/20200415 How to automate your cryptocurrency trades with Python.md deleted file mode 100644 index c216d22663..0000000000 --- a/sources/tech/20200415 How to automate your cryptocurrency trades with Python.md +++ /dev/null @@ -1,424 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to automate your cryptocurrency trades with Python) -[#]: via: (https://opensource.com/article/20/4/python-crypto-trading-bot) -[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) - -How to automate your cryptocurrency trades with Python -====== -In this tutorial, learn how to set up and use Pythonic, a graphical -programming tool that makes it easy for users to create Python -applications using ready-made function modules. -![scientific calculator][1] - -Unlike traditional stock exchanges like the New York Stock Exchange that have fixed trading hours, cryptocurrencies are traded 24/7, which makes it impossible for anyone to monitor the market on their own. - -Often in the past, I had to deal with the following questions related to my crypto trading: - - * What happened overnight? - * Why are there no log entries? - * Why was this order placed? - * Why was no order placed? - - - -The usual solution is to use a crypto trading bot that places orders for you when you are doing other things, like sleeping, being with your family, or enjoying your spare time. There are a lot of commercial solutions available, but I wanted an open source option, so I created the crypto-trading bot [Pythonic][2]. As [I wrote][3] in an introductory article last year, "Pythonic is a graphical programming tool that makes it easy for users to create Python applications using ready-made function modules." It originated as a cryptocurrency bot and has an extensive logging engine and well-tested, reusable parts such as schedulers and timers. - -### Getting started - -This hands-on tutorial teaches you how to get started with Pythonic for automated trading. It uses the example of trading [Tron][4] against [Bitcoin][5] on the [Binance][6] exchange platform. I choose these coins because of their volatility against each other, rather than any personal preference. - -The bot will make decisions based on [exponential moving averages][7] (EMAs). - -![TRX/BTC 1-hour candle chart][8] - -TRX/BTC 1-hour candle chart - -The EMA indicator is, in general, a weighted moving average that gives more weight to recent price data. Although a moving average may be a simple indicator, I've had good experiences using it. - -The purple line in the chart above shows an EMA-25 indicator (meaning the last 25 values were taken into account). - -The bot monitors the pitch between the current EMA-25 value (t0) and the previous EMA-25 value (t-1). If the pitch exceeds a certain value, it signals rising prices, and the bot will place a buy order. If the pitch falls below a certain value, the bot will place a sell order. - -The pitch will be the main indicator for making decisions about trading. For this tutorial, it will be called the _trade factor_. - -### Toolchain - -The following tools are used in this tutorial: - - * Binance expert trading view (visualizing data has been done by many others, so there's no need to reinvent the wheel by doing it yourself) - * Jupyter Notebook for  data-science tasks - * Pythonic, which is the  overall framework - * PythonicDaemon as the  pure runtime (console- and Linux-only) - - - -### Data mining - -For a crypto trading bot to make good decisions, it's essential to get open-high-low-close ([OHLC][9]) data for your asset in a reliable way. You can use Pythonic's built-in elements and extend them with your own logic. - -The general workflow is: - - 1. Synchronize with Binance time - 2. Download OHLC data - 3. Load existing OHLC data from the file into memory - 4. Compare both datasets and extend the existing dataset with the newer rows - - - -This workflow may be a bit overkill, but it makes this solution very robust against downtime and disconnections. - -To begin, you need the **Binance OHLC Query** element and a **Basic Operation** element to execute your own code. - -![Data-mining workflow][10] - -Data-mining workflow - -The OHLC query is set up to query the asset pair **TRXBTC** (Tron/Bitcoin) in one-hour intervals. - -![Configuration of the OHLC query element][11] - -Configuring the OHLC query element - -The output of this element is a [Pandas DataFrame][12]. You can access the DataFrame with the **input** variable in the **Basic Operation** element. Here, the **Basic Operation** element is set up to use Vim as the default code editor. - -![Basic Operation element set up to use Vim][13] - -Basic Operation element set up to use Vim - -Here is what the code looks like: - - -``` -import pickle, pathlib, os -import pandas as pd - -outout = None - -if isinstance(input, pd.DataFrame): -    file_name = 'TRXBTC_1h.bin' -    home_path = str(pathlib.Path.home()) -    data_path = os.path.join(home_path, file_name) - -    try: -        df = pickle.load(open(data_path, 'rb')) -        n_row_cnt = df.shape[0] -        df = pd.concat([df,input], ignore_index=True).drop_duplicates(['close_time']) -        df.reset_index(drop=True, inplace=True) -        n_new_rows = df.shape[0] - n_row_cnt -        log_txt = '{}: {} new rows written'.format(file_name, n_new_rows) -    except: -        log_txt = 'File error - writing new one: {}'.format(e) -        df = input - -    pickle.dump(df, open(data_path, "wb" )) -    output = df -``` - -First, check whether the input is the DataFrame type. Then look inside the user's home directory (**~/**) for a file named **TRXBTC_1h.bin**. If it is present, then open it, concatenate new rows (the code in the **try** section), and drop overlapping duplicates. If the file doesn't exist, trigger an _exception_ and execute the code in the **except** section, creating a new file. - -As long as the checkbox **log output** is enabled, you can follow the logging with the command-line tool **tail**: - - -``` -`$ tail -f ~/Pythonic_2020/Feb/log_2020_02_19.txt` -``` - -For development purposes, skip the synchronization with Binance time and regular scheduling for now. This will be implemented below. - -### Data preparation - -The next step is to handle the evaluation logic in a separate grid; therefore, you have to pass over the DataFrame from Grid 1 to the first element of Grid 2 with the help of the **Return element**. - -In Grid 2, extend the DataFrame by a column that contains the EMA values by passing the DataFrame through a **Basic Technical Analysis** element. - -![Technical analysis workflow in Grid 2][14] - -Technical analysis workflow in Grid 2 - -Configure the technical analysis element to calculate the EMAs over a period of 25 values. - -![Configuration of the technical analysis element][15] - -Configuring the technical analysis element - -When you run the whole setup and activate the debug output of the **Technical Analysis** element, you will realize that the values of the EMA-25 column all seem to be the same. - -![Missing decimal places in output][16] - -Decimal places are missing in the output - -This is because the EMA-25 values in the debug output include just six decimal places, even though the output retains the full precision of an 8-byte float value. - -For further processing, add a **Basic Operation** element: - -![Workflow in Grid 2][17] - -Workflow in Grid 2 - -With the **Basic Operation** element, dump the DataFrame with the additional EMA-25 column so that it can be loaded into a Jupyter Notebook; - -![Dump extended DataFrame to file][18] - -Dump extended DataFrame to file - -### Evaluation logic - -Developing the evaluation logic inside Juypter Notebook enables you to access the code in a more direct way. To load the DataFrame, you need the following lines: - -![Representation with all decimal places][19] - -Representation with all decimal places - -You can access the latest EMA-25 values by using [**iloc**][20] and the column name. This keeps all of the decimal places. - -You already know how to get the latest value. The last line of the example above shows only the value. To copy the value to a separate variable, you have to access it with the **.at** method, as shown below. - -You can also directly calculate the trade factor, which you will need in the next step. - -![Buy/sell decision][21] - -Buy/sell decision - -### Determine the trading factor - -As you can see in the code above, I chose 0.009 as the trade factor. But how do I know if 0.009 is a good trading factor for decisions? Actually, this factor is really bad, so instead, you can brute-force the best-performing trade factor. - -Assume that you will buy or sell based on the closing price. - -![Validation function][22] - -Validation function - -In this example, **buy_factor** and **sell_factor** are predefined. So extend the logic to brute-force the best performing values. - -![Nested for loops for determining the buy and sell factor][23] - -Nested _for_ loops for determining the buy and sell factor - -This has 81 loops to process (9x9), which takes a couple of minutes on my machine (a Core i7 267QM). - -![System utilization while brute forcing][24] - -System utilization while brute-forcing - -After each loop, it appends a tuple of **buy_factor**, **sell_factor**, and the resulting **profit** to the **trading_factors** list. Sort the list by profit in descending order. - -![Sort profit with related trading factors in descending order][25] - -Sort profit with related trading factors in descending order - -When you print the list, you can see that 0.002 is the most promising factor. - -![Sorted list of trading factors and profit][26] - -Sorted list of trading factors and profit - -When I wrote this in March 2020, the prices were not volatile enough to present more promising results. I got much better results in February, but even then, the best-performing trading factors were also around 0.002. - -### Split the execution path - -Start a new grid now to maintain clarity. Pass the DataFrame with the EMA-25 column from Grid 2 to element 0A of Grid 3 by using a **Return** element. - -In Grid 3, add a **Basic Operation** element to execute the evaluation logic. Here is the code of that element: - -![Implemented evaluation logic][27] - -Implemented evaluation logic - -The element outputs a **1** if you should buy or a **-1** if you should sell. An output of **0** means there's nothing to do right now. Use a **Branch** element to control the execution path. - -![Branch element: Grid 3 Position 2A][28] - -Branch element: Grid 3, Position 2A - -Due to the fact that both **0** and **-1** are processed the same way, you need an additional Branch element on the right-most execution path to decide whether or not you should sell. - -![Branch element: Grid 3 Position 3B][29] - -Branch element: Grid 3, Position 3B - -Grid 3 should now look like this: - -![Workflow on Grid 3][30] - -Workflow on Grid 3 - -### Execute orders - -Since you cannot buy twice, you must keep a persistent variable between the cycles that indicates whether you have already bought. - -You can do this with a **Stack element**. The Stack element is, as the name suggests, a representation of a file-based stack that can be filled with any Python data type. - -You need to define that the stack contains only one Boolean element, which determines if you bought (**True**) or not (**False**). As a consequence, you have to preset the stack with one **False**. You can set this up, for example, in Grid 4 by simply passing a **False** to the stack. - -![Forward a False-variable to the subsequent Stack element][31] - -Forward a **False** variable to the subsequent Stack element - -The Stack instances after the branch tree can be configured as follows: - -![Configuration of the Stack element][32] - -Configuring the Stack element - -In the Stack element configuration, set **Do this with input** to **Nothing**. Otherwise, the Boolean value will be overwritten by a 1 or 0. - -This configuration ensures that only one value is ever saved in the stack (**True** or **False**), and only one value can ever be read (for clarity). - -Right after the Stack element, you need an additional **Branch** element to evaluate the stack value before you place the **Binance Order** elements. - -![Evaluate the variable from the stack][33] - -Evaluating the variable from the stack - -Append the Binance Order element to the **True** path of the Branch element. The workflow on Grid 3 should now look like this: - -![Workflow on Grid 3][34] - -Workflow on Grid 3 - -The Binance Order element is configured as follows: - -![Configuration of the Binance Order element][35] - -Configuring the Binance Order element - -You can generate the API and Secret keys on the Binance website under your account settings. - -![Creating an API key in Binance][36] - -Creating an API key in the Binance account settings - -In this tutorial, every trade is executed as a market trade and has a volume of 10,000 TRX (~US$ 150 on March 2020). (For the purposes of this tutorial, I am demonstrating the overall process by using a Market Order. Because of that, I recommend using at least a Limit order.) - -The subsequent element is not triggered if the order was not executed properly (e.g., a connection issue, insufficient funds, or incorrect currency pair). Therefore, you can assume that if the subsequent element is triggered, the order was placed. - -Here is an example of output from a successful sell order for XMRBTC: - -![Output of a successfully placed sell order][37] - -Successful sell order output - -This behavior makes subsequent steps more comfortable: You can always assume that as long the output is proper, the order was placed. Therefore, you can append a **Basic Operation** element that simply writes the output to **True** and writes this value on the stack to indicate whether the order was placed or not. - -If something went wrong, you can find the details in the logging message (if logging is enabled). - -![Logging output of Binance Order element][38] - -Logging output from Binance Order element - -### Schedule and sync - -For regular scheduling and synchronization, prepend the entire workflow in Grid 1 with the **Binance Scheduler** element. - -![Binance Scheduler at Grid 1, Position 1A][39] - -Binance Scheduler at Grid 1, Position 1A - -The Binance Scheduler element executes only once, so split the execution path on the end of Grid 1 and force it to re-synchronize itself by passing the output back to the Binance Scheduler element. - -![Grid 1: Split execution path][40] - -Grid 1: Split execution path - -Element 5A points to Element 1A of Grid 2, and Element 5B points to Element 1A of Grid 1 (Binance Scheduler). - -### Deploy - -You can run the whole setup 24/7 on your local machine, or you could host it entirely on an inexpensive cloud system. For example, you can use a Linux/FreeBSD cloud system for about US$5 per month, but they usually don't provide a window system. If you want to take advantage of these low-cost clouds, you can use PythonicDaemon, which runs completely inside the terminal. - -![PythonicDaemon console interface][41] - -PythonicDaemon console - -PythonicDaemon is part of the basic installation. To use it, save your complete workflow, transfer it to the remote running system (e.g., by Secure Copy [SCP]), and start PythonicDaemon with the workflow file as an argument: - - -``` -`$ PythonicDaemon trading_bot_one` -``` - -To automatically start PythonicDaemon at system startup, you can add an entry to the crontab: - - -``` -`# crontab -e` -``` - -![Crontab on Ubuntu Server][42] - -Crontab on Ubuntu Server - -### Next steps - -As I wrote at the beginning, this tutorial is just a starting point into automated trading. Programming trading bots is approximately 10% programming and 90% testing. When it comes to letting your bot trade with your money, you will definitely think thrice about the code you program. So I advise you to keep your code as simple and easy to understand as you can. - -If you want to continue developing your trading bot on your own, the next things to set up are: - - * Automatic profit calculation (hopefully only positive!) - * Calculation of the prices you want to buy for - * Comparison with your order book (i.e., was the order filled completely?) - - - -You can download the whole example on [GitHub][2]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/python-crypto-trading-bot - -作者:[Stephan Avenwedde][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/hansic99 -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calculator_money_currency_financial_tool.jpg?itok=2QMa1y8c (scientific calculator) -[2]: https://github.com/hANSIc99/Pythonic -[3]: https://opensource.com/article/19/5/graphically-programming-pythonic -[4]: https://tron.network/ -[5]: https://bitcoin.org/en/ -[6]: https://www.binance.com/ -[7]: https://www.investopedia.com/terms/e/ema.asp -[8]: https://opensource.com/sites/default/files/uploads/1_ema-25.png (TRX/BTC 1-hour candle chart) -[9]: https://en.wikipedia.org/wiki/Open-high-low-close_chart -[10]: https://opensource.com/sites/default/files/uploads/2_data-mining-workflow.png (Data-mining workflow) -[11]: https://opensource.com/sites/default/files/uploads/3_ohlc-query.png (Configuration of the OHLC query element) -[12]: https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html#dataframe -[13]: https://opensource.com/sites/default/files/uploads/4_edit-basic-operation.png (Basic Operation element set up to use Vim) -[14]: https://opensource.com/sites/default/files/uploads/6_grid2-workflow.png (Technical analysis workflow in Grid 2) -[15]: https://opensource.com/sites/default/files/uploads/7_technical-analysis-config.png (Configuration of the technical analysis element) -[16]: https://opensource.com/sites/default/files/uploads/8_missing-decimals.png (Missing decimal places in output) -[17]: https://opensource.com/sites/default/files/uploads/9_basic-operation-element.png (Workflow in Grid 2) -[18]: https://opensource.com/sites/default/files/uploads/10_dump-extended-dataframe.png (Dump extended DataFrame to file) -[19]: https://opensource.com/sites/default/files/uploads/11_load-dataframe-decimals.png (Representation with all decimal places) -[20]: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html -[21]: https://opensource.com/sites/default/files/uploads/12_trade-factor-decision.png (Buy/sell decision) -[22]: https://opensource.com/sites/default/files/uploads/13_validation-function.png (Validation function) -[23]: https://opensource.com/sites/default/files/uploads/14_brute-force-tf.png (Nested for loops for determining the buy and sell factor) -[24]: https://opensource.com/sites/default/files/uploads/15_system-utilization.png (System utilization while brute forcing) -[25]: https://opensource.com/sites/default/files/uploads/16_sort-profit.png (Sort profit with related trading factors in descending order) -[26]: https://opensource.com/sites/default/files/uploads/17_sorted-trading-factors.png (Sorted list of trading factors and profit) -[27]: https://opensource.com/sites/default/files/uploads/18_implemented-evaluation-logic.png (Implemented evaluation logic) -[28]: https://opensource.com/sites/default/files/uploads/19_output.png (Branch element: Grid 3 Position 2A) -[29]: https://opensource.com/sites/default/files/uploads/20_editbranch.png (Branch element: Grid 3 Position 3B) -[30]: https://opensource.com/sites/default/files/uploads/21_grid3-workflow.png (Workflow on Grid 3) -[31]: https://opensource.com/sites/default/files/uploads/22_pass-false-to-stack.png (Forward a False-variable to the subsequent Stack element) -[32]: https://opensource.com/sites/default/files/uploads/23_stack-config.png (Configuration of the Stack element) -[33]: https://opensource.com/sites/default/files/uploads/24_evaluate-stack-value.png (Evaluate the variable from the stack) -[34]: https://opensource.com/sites/default/files/uploads/25_grid3-workflow.png (Workflow on Grid 3) -[35]: https://opensource.com/sites/default/files/uploads/26_binance-order.png (Configuration of the Binance Order element) -[36]: https://opensource.com/sites/default/files/uploads/27_api-key-binance.png (Creating an API key in Binance) -[37]: https://opensource.com/sites/default/files/uploads/28_sell-order.png (Output of a successfully placed sell order) -[38]: https://opensource.com/sites/default/files/uploads/29_binance-order-output.png (Logging output of Binance Order element) -[39]: https://opensource.com/sites/default/files/uploads/30_binance-scheduler.png (Binance Scheduler at Grid 1, Position 1A) -[40]: https://opensource.com/sites/default/files/uploads/31_split-execution-path.png (Grid 1: Split execution path) -[41]: https://opensource.com/sites/default/files/uploads/32_pythonic-daemon.png (PythonicDaemon console interface) -[42]: https://opensource.com/sites/default/files/uploads/33_crontab.png (Crontab on Ubuntu Server) diff --git a/sources/tech/20200415 Tweaking history on Linux.md b/sources/tech/20200415 Tweaking history on Linux.md deleted file mode 100644 index b17a666a8a..0000000000 --- a/sources/tech/20200415 Tweaking history on Linux.md +++ /dev/null @@ -1,189 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Tweaking history on Linux) -[#]: via: (https://www.networkworld.com/article/3537214/tweaking-history-on-linux.html) -[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) - -Tweaking history on Linux -====== -The bash shell's history command in Linux makes it easy to review and reuse commands, but there's a lot you do to control how much it remembers and how much forgets. -[Claudio Testa][1] [(CC0)][2] - -The bash **history** command on Linux systems helps with remembering commands you’ve previously run and repeating those commands without having to retype them. - -You could decide, however, that you’d be just as happy to forget that you referenced a dozen man pages, listed your files every 10 minutes or viewed previously run commands by typing “history”. In this post, we’re going to look at how you can get the history command to remember just what you want it to remember and forget commands that are likely to be of little "historic value". - -### Viewing your command history - -To view previously run commands, you simply type “history”. You’ll probably see a long list of commands. The number of commands remembered depends on an environment variable called **$HISTSIZE** that is set up in your **~/.bashrc** file, but there’s nothing stopping you from changing this setting if you want to save more or fewer commands. - -To view history, use the **history** command: - -``` -$ history -209 uname -v -210 date -211 man chage -... -``` - -To see the maximum number of commands that will be displayed: - -``` -$ echo $HISTSIZE -500 -``` - -You can change **$HISTSIZE** and make the change permanent by running commands like these: - -``` -$ export HISTSIZE=1000 -$ echo “HISTSIZE=1000” >> ~/.bashrc -``` - -There’s also a difference between how much history is preserved for you and how much is displayed when you type “history”. The **$HISTSIZE** variable controls how much history is displayed while the **$HISTFILESIZE** variable controls how many commands are retained in your **.bash_history** file. - -[][3] - -``` -$ echo $HISTSIZE -1000 -$ echo $HISTFILESIZE -2000 -``` - -You can verify the second variable by counting the lines in your history file: - -``` -$ wc -l .bash_history -2000 .bash_history -``` - -One thing to keep in mind is that commands that you enter during a login session aren’t added to your **.bash_history** file until you log off, even though they show up in the **history** command output right away. - -### Using history - -There are three ways to reissue commands that you find in your history. The simplest way, especially if the command you want to reuse was run recently, is often to type a ! followed by enough of the first letters in the command's name to uniquely identify it. - -``` -$ !u -uname -v -#37-Ubuntu SMP Thu Mar 26 20:41:27 UTC 2020 -``` - -Another easy way to repeat a command is to simply press your up-arrow key until the command is displayed and then press enter. - -Alternately, if you run the history command and see the command you want to rerun listed, you can type an ! followed by the sequence number shown to the left of the command. - -``` -$ !209 -uname -v -#37-Ubuntu SMP Thu Mar 26 20:41:27 UTC 2020 -``` - -### Hiding history - -If you want to stop recording commands for some period of time, you can use this command: - -``` -$ set +o history -``` - -Commands will not show up when you type "history" nor will they be added to your **.bash_history** file when you exit the session by logging off or exiting the terminal. - -To reverse this setting, use **set -o history**. To make it permanent, you can add it to your **.bashrc** file, though failing to make use of command history altogether is generally not a good idea. - -``` -$ echo 'set +o history' >> ~/.bashrc -``` - -To temporarily clear history, so that only commands that you enter afterwards show up when you type "history", use the **history -c** (clear) command: - -``` -$ history | tail -3 -209 uname -v -210 date -211 man chage -$ history -c -$ history -1 history -``` - -NOTE: The commands entered after typing "history -c" will not be added to your .bash_history file. - -### Controlling history - -The command history settings on many systems will default to including one called **$HISTCONTROL** that ensures that, even if you run the same command seven times in a row, it will only be remembered once. It also ensures that commands that you type after first entering one or more blanks will be omitted from your command history. - -``` -$ grep HISTCONTROL .bashrc -HISTCONTROL=ignoreboth -``` - -The "ignoreboth" means "ignore both duplicate commands and command starting with blanks". For example, if you type these commands: - -``` -$ echo try this -$ date -$ date -$ date -$ pwd -$ history -``` - -your history command should report something like this: - -``` -$ history -$ echo try this -$ date -$ history -``` - -Notice that the sequential date commands were reduced to one and the indented command was omitted. - -### Overlooking history - -To ignore certain commands so that they never show up when you type "history" and are never added to your **.bash_history** file, use the **$HISTIGNORE** setting. For example: - -``` -$ export HISTIGNORE=”history:cd:exit:ls:pwd:man” -``` - -This setting will cause all **history**, **cd**, **exit**, **ls**, **pwd** and **man** commands to be omitted from your **history** output and your **.bash_history** file. - -If you want to make this setting permanent, you have to add it to your **.bashrc** file. - -``` -$ echo 'HISTIGNORE="history:cd:exit:ls:pwd:man"' >> .bashrc -``` - -This setting just means that when you look back through previously run commands, the list won’t be cluttered by commands that you're unlikely to be looking for when you are looking through your command history. - -### Remembering, ignoring and forgetting the past - -Command history is useful because it helps you remember what commands you’ve recently used and reminds you about changes you’ve recently made. It also makes it easier to rerun commands, especially those with a string of arguments that you don't necessarily want to recreate. Tailoring your history settings can make your use of command history a little easier and more efficient. - -Join the Network World communities on [Facebook][4] and [LinkedIn][5] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3537214/tweaking-history-on-linux.html - -作者:[Sandra Henry-Stocker][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ -[b]: https://github.com/lujun9972 -[1]: https://unsplash.com/photos/iqeG5xA96M4 -[2]: https://creativecommons.org/publicdomain/zero/1.0/ -[3]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy) -[4]: https://www.facebook.com/NetworkWorld/ -[5]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20200416 Learning to love systemd.md b/sources/tech/20200416 Learning to love systemd.md deleted file mode 100644 index 70243db915..0000000000 --- a/sources/tech/20200416 Learning to love systemd.md +++ /dev/null @@ -1,328 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (messon007) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Learning to love systemd) -[#]: via: (https://opensource.com/article/20/4/systemd) -[#]: author: (David Both https://opensource.com/users/dboth) - -Learning to love systemd -====== -systemd is the mother of all processes, responsible for bringing the -Linux host up to a state where productive work can be done. -![Penguin driving a car with a yellow background][1] - -systemd—yes, all lower-case, even at the beginning of a sentence—is the modern replacement for init and SystemV init scripts. It is also much more. - -Like most sysadmins, when I think of the init program and SystemV, I think of Linux startup and shutdown and not really much else, like managing services once they are up and running. Like init, systemd is the mother of all processes, and it is responsible for bringing the Linux host up to a state in which productive work can be done. Some of the functions assumed by systemd, which is far more extensive than the old init program, are to manage many aspects of a running Linux host, including mounting filesystems, managing hardware, handling timers, and starting and managing the system services that are required to have a productive Linux host. - -This series of articles, which is based in part on excerpts from my three-volume Linux training course, [_Using and administering Linux: zero to sysadmin_][2], explores systemd's functions both at startup and beginning after startup finishes. - -### Linux boot - -The complete process that takes a Linux host from an off state to a running state is complex, but it is open and knowable. Before getting into the details, I'll give a quick overview from when the host hardware is turned on until the system is ready for a user to log in. Most of the time, "the boot process" is discussed as a single entity, but that is not accurate. There are, in fact, three major parts to the full boot and startup process: - - * **Hardware boot:** Initializes the system hardware - * **Linux boot:** Loads the Linux kernel and then systemd - * **Linux startup:** Where systemd prepares the host for productive work - - - -The Linux startup sequence begins after the kernel has loaded either init or systemd, depending upon whether the distribution uses the old or new startup, respectively. The init and systemd programs start and manage all the other processes and are both known as the "mother of all processes" on their respective systems. - -It is important to separate the hardware boot from the Linux boot from the Linux startup and to explicitly define the demarcation points between them. Understanding these differences and what part each plays in getting a Linux system to a state where it can be productive makes it possible to manage these processes and better determine where a problem is occurring during what most people refer to as "boot." - -The startup process follows the three-step boot process and brings the Linux computer up to an operational state in which it is usable for productive work. The startup process begins when the kernel transfers control of the host to systemd. - -### systemd controversy - -systemd can evoke a wide range of reactions from sysadmins and others responsible for keeping Linux systems up and running. The fact that systemd is taking over so many tasks in many Linux systems has engendered pushback and discord among certain groups of developers and sysadmins. - -SystemV and systemd are two different methods of performing the Linux startup sequence. SystemV start scripts and the init program are the old methods, and systemd using targets is the new method. Although most modern Linux distributions use the newer systemd for startup, shutdown, and process management, there are still some that do not. One reason is that some distribution maintainers and some sysadmins prefer the older SystemV method over the newer systemd. - -I think both have advantages. - -#### Why I prefer SystemV - -I prefer SystemV because it is more open. Startup is accomplished using Bash scripts. After the kernel starts the init program, which is a compiled binary, init launches the **rc.sysinit** script, which performs many system initialization tasks. After **rc.sysinit** completes, init launches the **/etc/rc.d/rc** script, which in turn starts the various services defined by the SystemV start scripts in the **/etc/rc.d/rcX.d**, where "X" is the number of the runlevel being started. - -Except for the init program itself, all these programs are open and easily knowable scripts. It is possible to read through these scripts and learn exactly what is taking place during the entire startup process, but I don't think many sysadmins actually do that. Each start script is numbered so that it starts its intended service in a specific sequence. Services are started serially, and only one service starts at a time. - -systemd, developed by Red Hat's Lennart Poettering and Kay Sievers, is a complex system of large, compiled binary executables that are not understandable without access to the source code. It is open source, so "access to the source code" isn't hard, just less convenient. systemd appears to represent a significant refutation of multiple tenets of the Linux philosophy. As a binary, systemd is not directly open for the sysadmin to view or make easy changes. systemd tries to do everything, such as managing running services, while providing significantly more status information than SystemV. It also manages hardware, processes, and groups of processes, filesystem mounts, and much more. systemd is present in almost every aspect of the modern Linux host, making it the one-stop tool for system management. All of this is a clear violation of the tenets that programs should be small and that each program should do one thing and do it well. - -#### Why I prefer systemd - -I prefer systemd as my startup mechanism because it starts as many services as possible in parallel, depending upon the current stage in the startup process. This speeds the overall startup and gets the host system to a login screen faster than SystemV. - -systemd manages almost every aspect of a running Linux system. It can manage running services while providing significantly more status information than SystemV. It also manages hardware, processes and groups of processes, filesystem mounts, and much more. systemd is present in almost every aspect of the modern Linux operating system, making it the one-stop tool for system management. (Does this sound familiar?) - -The systemd tools are compiled binaries, but the tool suite is open because all the configuration files are ASCII text files. Startup configuration can be modified through various GUI and command-line tools, as well as adding or modifying various configuration files to suit the needs of the specific local computing environment. - -#### The real issue - -Did you think I could not like both startup systems? I do, and I can work with either one. - -In my opinion, the real issue and the root cause of most of the controversy between SystemV and systemd is that there is [no choice][3] on the sysadmin level. The choice of whether to use SystemV or systemd has already been made by the developers, maintainers, and packagers of the various distributions—but with good reason. Scooping out and replacing an init system, by its extreme, invasive nature, has a lot of consequences that would be hard to tackle outside the distribution design process. - -Despite the fact that this choice is made for me, my Linux hosts boot up and work, which is what I usually care the most about. As an end user and even as a sysadmin, my primary concern is whether I can get my work done, work such as writing my books and this article, installing updates, and writing scripts to automate everything. So long as I can do my work, I don't really care about the start sequence used on my distro. - -I do care when there is a problem during startup or service management. Regardless of which startup system is used on a host, I know enough to follow the sequence of events to find the failure and fix it. - -#### Replacing SystemV - -There have been previous attempts at replacing SystemV with something a bit more modern. For about two releases, Fedora used a thing called Upstart to replace the aging SystemV, but it did not replace init and provided no changes that I noticed. Because Upstart provided no significant changes to the issues surrounding SystemV, efforts in this direction were quickly dropped in favor of systemd. - -Despite the fact that most Linux developers agree that replacing the old SystemV startup is a good idea, many developers and sysadmins dislike systemd for that. Rather than rehash all the so-called issues that people have—or had—with systemd, I will refer you to two good, if somewhat old, articles that should cover most everything. Linus Torvalds, the creator of the Linux kernel, seems disinterested. In a 2014 ZDNet article, _[Linus Torvalds and others on Linux's systemd][4]_, Linus is clear about his feelings. - -> "I don't actually have any particularly strong opinions on systemd itself. I've had issues with some of the core developers that I think are much too cavalier about bugs and compatibility, and I think some of the design details are insane (I dislike the binary logs, for example), but those are details, not big issues." - -In case you don't know much about Linus, I can tell you that if he does not like something, he is very outspoken, explicit, and quite clear about that dislike. He has become more socially acceptable in his manner of addressing his dislike about things. - -In 2013, Poettering wrote a long blog post in which he debunks the [myths about systemd][5] while providing insight into some of the reasons for creating it. This is a very good read, and I highly recommend it. - -### systemd tasks - -Depending upon the options used during the compile process (which are not considered in this series), systemd can have as many as 69 binary executables that perform the following tasks, among others: - - * The systemd program runs as PID 1 and provides system startup of as many services in parallel as possible, which, as a side effect, speeds overall startup times. It also manages the shutdown sequence. - * The systemctl program provides a user interface for service management. - * Support for SystemV and LSB start scripts is offered for backward compatibility. - * Service management and reporting provide more service status data than SystemV. - * It includes tools for basic system configuration, such as hostname, date, locale, lists of logged-in users, running containers and virtual machines, system accounts, runtime directories and settings, daemons to manage simple network configuration, network time synchronization, log forwarding, and name resolution. - * It offers socket management. - * systemd timers provide advanced cron-like capabilities to include running a script at times relative to system boot, systemd startup, the last time the timer was started, and more. - * It provides a tool to analyze dates and times used in timer specifications. - * Mounting and unmounting of filesystems with hierarchical awareness allows safer cascading of mounted filesystems. - * It enables the positive creation and management of temporary files, including deletion. - * An interface to D-Bus provides the ability to run scripts when devices are plugged in or removed. This allows all devices, whether pluggable or not, to be treated as plug-and-play, which considerably simplifies device handling. - * Its tool to analyze the startup sequence can be used to locate the services that take the most time. - * It includes journals for storing system log messages and tools for managing the journals. - - - -### Architecture - -Those tasks and more are supported by a number of daemons, control programs, and configuration files. Figure 1 shows many of the components that belong to systemd. This is a simplified diagram designed to provide a high-level overview, so it does not include all of the individual programs or files. Nor does it provide any insight into data flow, which is so complex that it would be a useless exercise in the context of this series of articles. - -![systemd architecture][6] - -A full exposition of systemd would take a book on its own. You do not need to understand the details of how the systemd components in Figure 1 fit together; it's enough to know about the programs and components that enable managing various Linux services and deal with log files and journals. But it's clear that systemd is not the monolithic monstrosity it is purported to be by some of its critics. - -### systemd as PID 1 - -systemd is PID 1. Some of its functions, which are far more extensive than the old SystemV3 init program, are to manage many aspects of a running Linux host, including mounting filesystems and starting and managing system services required to have a productive Linux host. Any of systemd's tasks that are not related to the startup sequence are outside the scope of this article (but some will be explored later in this series). - -First, systemd mounts the filesystems defined by **/etc/fstab**, including any swap files or partitions. At this point, it can access the configuration files located in **/etc**, including its own. It uses its configuration link, **/etc/systemd/system/default.target**, to determine which state or target it should boot the host into. The **default.target** file is a symbolic link to the true target file. For a desktop workstation, this is typically going to be the **graphical.target**, which is equivalent to runlevel 5 in SystemV. For a server, the default is more likely to be the **multi-user.target**, which is like runlevel 3 in SystemV. The **emergency.target** is similar to single-user mode. Targets and services are systemd units. - -The table below (Figure 2) compares the systemd targets with the old SystemV startup runlevels. systemd provides the systemd target aliases for backward compatibility. The target aliases allow scripts—and many sysadmins—to use SystemV commands like **init 3** to change runlevels. Of course, the SystemV commands are forwarded to systemd for interpretation and execution. - -**systemd targets** | **SystemV runlevel** | **target aliases** | **Description** ----|---|---|--- -default.target | | | This target is always aliased with a symbolic link to either **multi-user.target** or **graphical.target**. systemd always uses the **default.target** to start the system. The **default.target** should never be aliased to **halt.target**, **poweroff.target**, or **reboot.target**. -graphical.target | 5 | runlevel5.target | **Multi-user.target** with a GUI -| 4 | runlevel4.target | Unused. Runlevel 4 was identical to runlevel 3 in the SystemV world. This target could be created and customized to start local services without changing the default **multi-user.target**. -multi-user.target | 3 | runlevel3.target | All services running, but command-line interface (CLI) only -| 2 | runlevel2.target | Multi-user, without NFS, but all other non-GUI services running -rescue.target | 1 | runlevel1.target | A basic system, including mounting the filesystems with only the most basic services running and a rescue shell on the main console -emergency.target | S | | Single-user mode—no services are running; filesystems are not mounted. This is the most basic level of operation with only an emergency shell running on the main console for the user to interact with the system. -halt.target | | | Halts the system without powering it down -reboot.target | 6 | runlevel6.target | Reboot -poweroff.target | 0 | runlevel0.target | Halts the system and turns the power off - -Each target has a set of dependencies described in its configuration file. systemd starts the required dependencies, which are the services required to run the Linux host at a specific level of functionality. When all the dependencies listed in the target configuration files are loaded and running, the system is running at that target level. In Figure 2, the targets with the most functionality are at the top of the table, with functionality declining towards the bottom of the table. - -systemd also looks at the legacy SystemV init directories to see if any startup files exist there. If so, systemd uses them as configuration files to start the services described by the files. The deprecated network service is a good example of one that still uses SystemV startup files in Fedora. - -Figure 3 (below) is copied directly from the bootup man page. It shows a map of the general sequence of events during systemd startup and the basic ordering requirements to ensure a successful startup. - - -``` -                                         cryptsetup-pre.target -                                                   | - (various low-level                                v -     API VFS mounts:                 (various cryptsetup devices...) -  mqueue, configfs,                                |    | -  debugfs, ...)                                    v    | -  |                                  cryptsetup.target  | -  |  (various swap                                 |    |    remote-fs-pre.target -  |   devices...)                                  |    |     |        | -  |    |                                           |    |     |        v -  |    v                       local-fs-pre.target |    |     |  (network file systems) -  |  swap.target                       |           |    v     v                 | -  |    |                               v           |  remote-cryptsetup.target  | -  |    |  (various low-level  (various mounts and  |             |              | -  |    |   services: udevd,    fsck services...)   |             |    remote-fs.target -  |    |   tmpfiles, random            |           |             |             / -  |    |   seed, sysctl, ...)          v           |             |            / -  |    |      |                 local-fs.target    |             |           / -  |    |      |                        |           |             |          / -  \\____|______|_______________   ______|___________/             |         / -                              \ /                                |        / -                               v                                 |       / -                        sysinit.target                           |      / -                               |                                 |     / -        ______________________/|\\_____________________           |    / -       /              |        |      |               \          |   / -       |              |        |      |               |          |  / -       v              v        |      v               |          | / -  (various       (various      |  (various            |          |/ -   timers...)      paths...)   |   sockets...)        |          | -       |              |        |      |               |          | -       v              v        |      v               |          | - timers.target  paths.target   |  sockets.target      |          | -       |              |        |      |               v          | -       v              \\_______ | _____/         rescue.service   | -                              \|/                     |          | -                               v                      v          | -                           basic.target         rescue.target    | -                               |                                 | -                       ________v____________________             | -                      /              |              \            | -                      |              |              |            | -                      v              v              v            | -                  display-    (various system   (various system  | -              manager.service     services        services)      | -                      |         required for        |            | -                      |        graphical UIs)       v            v -                      |              |            multi-user.target - emergency.service    |              |              | -         |            \\_____________ | _____________/ -         v                          \|/ - emergency.target                    v -                              graphical.target -``` - -The **sysinit.target** and **basic.target** targets can be considered checkpoints in the startup process. Although one of systemd's design goals is to start system services in parallel, certain services and functional targets must be started before other services and targets can start. These checkpoints cannot be passed until all of the services and targets required by that checkpoint are fulfilled. - -The **sysinit.target** is reached when all of the units it depends on are completed. All of those units, mounting filesystems, setting up swap files, starting udev, setting the random generator seed, initiating low-level services, and setting up cryptographic services (if one or more filesystems are encrypted), must be completed but, within the **sysinit.target**, those tasks can be performed in parallel. - -The **sysinit.target** starts up all of the low-level services and units required for the system to be marginally functional and that are required to enable moving onto the **basic.target**. - -After the **sysinit.target** is fulfilled, systemd then starts all the units required to fulfill the next target. The basic target provides some additional functionality by starting units that are required for all of the next targets. These include setting up things like paths to various executable directories, communication sockets, and timers. - -Finally, the user-level targets, **multi-user.target** or **graphical.target**, can be initialized. The **multi-user.target** must be reached before the graphical target dependencies can be met. The underlined targets in Figure 3 are the usual startup targets. When one of these targets is reached, startup has completed. If the **multi-user.target** is the default, then you should see a text-mode login on the console. If **graphical.target** is the default, then you should see a graphical login; the specific GUI login screen you see depends on your default display manager. - -The bootup man page also describes and provides maps of the boot into the initial RAM disk and the systemd shutdown process. - -systemd also provides a tool that lists dependencies of a complete startup or for a specified unit. A unit is a controllable systemd resource entity that can range from a specific service, such as httpd or sshd, to timers, mounts, sockets, and more. Try the following command and scroll through the results. - - -``` -`systemctl list-dependencies graphical.target` -``` - -Notice that this fully expands the top-level target units list required to bring the system up to the graphical target run mode. Use the **\--all** option to expand all of the other units as well. - - -``` -`systemctl list-dependencies --all graphical.target` -``` - -You can search for strings such as "target," "slice," and "socket" using the search tools of the **less** command. - -So now, try the following. - - -``` -`systemctl list-dependencies multi-user.target` -``` - -and - - -``` -`systemctl list-dependencies rescue.target` -``` - -and - - -``` -`systemctl list-dependencies local-fs.target` -``` - -and - - -``` -`systemctl list-dependencies dbus.service` -``` - -This tool helps me visualize the specifics of the startup dependencies for the host I am working on. Go ahead and spend some time exploring the startup tree for one or more of your Linux hosts. But be careful because the systemctl man page contains this note: - -> _"Note that this command only lists units currently loaded into memory by the service manager. In particular, this command is not suitable to get a comprehensive list at all reverse dependencies on a specific unit, as it won't list the dependencies declared by units currently not loaded."_ - -### Final thoughts - -Even before getting very deep into systemd, it's obvious that it is both powerful and complex. It is also apparent that systemd is not a single, huge, monolithic, and unknowable binary file. Rather, it is composed of a number of smaller components and subcommands that are designed to perform specific tasks. - -The next article in this series will explore systemd startup in more detail, as well as systemd configuration files, changing the default target, and how to create a simple service unit. - -### Resources - -There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup. - - * The Fedora Project has a good, practical [guide][7] [to systemd][7]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd. - * The Fedora Project also has a good [cheat sheet][8] that cross-references the old SystemV commands to comparable systemd ones. - * For detailed technical information about systemd and the reasons for creating it, check out [Freedesktop.org][9]'s [description of systemd][10]. - * [Linux.com][11]'s "More systemd fun" offers more advanced systemd [information and tips][12]. - - - -There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers. - - * [Rethinking PID 1][13] - * [systemd for Administrators, Part I][14] - * [systemd for Administrators, Part II][15] - * [systemd for Administrators, Part III][16] - * [systemd for Administrators, Part IV][17] - * [systemd for Administrators, Part V][18] - * [systemd for Administrators, Part VI][19] - * [systemd for Administrators, Part VII][20] - * [systemd for Administrators, Part VIII][21] - * [systemd for Administrators, Part IX][22] - * [systemd for Administrators, Part X][23] - * [systemd for Administrators, Part XI][24] - - - -Alison Chiaken, a Linux kernel and systems programmer at Mentor Graphics, offers a preview of her... - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/systemd - -作者:[David Both][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/dboth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background) -[2]: http://www.both.org/?page_id=1183 -[3]: http://www.osnews.com/story/28026/Editorial_Thoughts_on_Systemd_and_the_Freedom_to_Choose -[4]: https://www.zdnet.com/article/linus-torvalds-and-others-on-linuxs-systemd/ -[5]: http://0pointer.de/blog/projects/the-biggest-myths.html -[6]: https://opensource.com/sites/default/files/uploads/systemd-architecture.png (systemd architecture) -[7]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html -[8]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet -[9]: http://Freedesktop.org -[10]: http://www.freedesktop.org/wiki/Software/systemd -[11]: http://Linux.com -[12]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ -[13]: http://0pointer.de/blog/projects/systemd.html -[14]: http://0pointer.de/blog/projects/systemd-for-admins-1.html -[15]: http://0pointer.de/blog/projects/systemd-for-admins-2.html -[16]: http://0pointer.de/blog/projects/systemd-for-admins-3.html -[17]: http://0pointer.de/blog/projects/systemd-for-admins-4.html -[18]: http://0pointer.de/blog/projects/three-levels-of-off.html -[19]: http://0pointer.de/blog/projects/changing-roots -[20]: http://0pointer.de/blog/projects/blame-game.html -[21]: http://0pointer.de/blog/projects/the-new-configuration-files.html -[22]: http://0pointer.de/blog/projects/on-etc-sysinit.html -[23]: http://0pointer.de/blog/projects/instances.html -[24]: http://0pointer.de/blog/projects/inetd.html diff --git a/sources/tech/20200417 Create a SDN on Linux with open source.md b/sources/tech/20200417 Create a SDN on Linux with open source.md deleted file mode 100644 index 5e69bb4db6..0000000000 --- a/sources/tech/20200417 Create a SDN on Linux with open source.md +++ /dev/null @@ -1,194 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (messon007) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Create a SDN on Linux with open source) -[#]: via: (https://opensource.com/article/20/4/quagga-linux) -[#]: author: (M Umer https://opensource.com/users/noisybotnet) - -Create a SDN on Linux with open source -====== -Make your Linux system act like a router with the open source routing -stack Quagga. -![Coding on a computer][1] - -Network routing protocols fall into two main categories: interior gateway protocols and exterior gateway protocols. Interior gateway protocols are used by routers to share information within a single autonomous system. If you are running Linux, you can make your system behave as a router through the open source (GPLv2) routing stack [Quagga][2]. - -### What is Quagga? - -Quagga is a [routing software suite][3] and a fork of [GNU Zebra][4]. It provides implementations of all major routing protocols such as Open Shortest Path First (OSPF), Routing Information Protocol (RIP), Border Gateway Protocol (BGP), and Intermediate System to Intermediate System (IS-IS) for Unix-like platforms. - -Although Quagga implements the routing protocols for both IPv4 and IPv6, it doesn't act as a complete router. A true router not only implements all the routing protocols but also has the ability to forward network traffic. Quagga only implements the routing stack, and the job of forwarding network traffic is handled by the Linux kernel. - -### Architecture - -Quagga implements the different routing protocols through protocol-specific daemons. The daemon name is the same as the routing protocol followed by the letter "d." Zebra is the core and a protocol-independent daemon that provides an [abstraction layer][5] to the kernel and presents the Zserv API over TCP sockets to Quagga clients. Each protocol-specific daemon is responsible for running the relevant protocol and building the routing table based on the information exchanged. - -![Quagga architecture][6] - -### Setup - -This tutorial implements the OSPF protocol to configure dynamic routing using Quagga. The setup includes two CentOS 7.7 hosts, named Alpha and Beta. Both hosts share access to the **192.168.122.0/24** network. - -**Host Alpha:** - -IP: 192.168.122.100/24 -Gateway: 192.168.122.1 - -**Host Beta:** - -IP: 192.168.122.50/24 -Gateway: 192.168.122.1 - -### Install the package - -First, install the Quagga package on both hosts. It is available in the CentOS base repo: - - -``` -`yum install quagga -y` -``` - -### Enable IP forwarding - -Next, enable IP forwarding on both hosts since that will performed by the Linux kernel: - - -``` -sysctl -w net.ipv4.ip_forward = 1 -sysctl -p -``` - -### Configuration - -Now, go into the **/etc/quagga** directory and create the configuration files for your setup. You need three files: - - * **zebra.conf**: Quagga's daemon configuration file, which is where you'll define the interfaces and their IP addresses and IP forwarding - * **ospfd.conf**: The protocol configuration file, which is where you'll define the networks that will be offered through the OSPF protocol - * **daemons**: Where you'll specify the relevant protocol daemons that are required to run - - - -On host Alpha, - - -``` - [root@alpha]# cat /etc/quagga/zebra.conf -interface eth0 - ip address 192.168.122.100/24 - ipv6 nd suppress-ra -interface eth1 - ip address 10.12.13.1/24 - ipv6 nd suppress-ra -interface lo -ip forwarding -line vty - -[root@alpha]# cat /etc/quagga/ospfd.conf -interface eth0 -interface eth1 -interface lo -router ospf - network 192.168.122.0/24 area 0.0.0.0 - network 10.12.13.0/24 area 0.0.0.0 -line vty - -[root@alphaa ~]# cat /etc/quagga/daemons -zebra=yes -ospfd=yes -``` - -On host Beta, - - -``` -[root@beta quagga]# cat zebra.conf -interface eth0 - ip address 192.168.122.50/24 - ipv6 nd suppress-ra -interface eth1 - ip address 10.10.10.1/24 - ipv6 nd suppress-ra -interface lo -ip forwarding -line vty - -[root@beta quagga]# cat ospfd.conf -interface eth0 -interface eth1 -interface lo -router ospf - network 192.168.122.0/24 area 0.0.0.0 - network 10.10.10.0/24 area 0.0.0.0 -line vty - -[root@beta ~]# cat /etc/quagga/daemons -zebra=yes -ospfd=yes -``` - -### Configure the firewall - -To use the OSPF protocol, you must allow it in the firewall: - - -``` -firewall-cmd --add-protocol=ospf –permanent - -firewall-cmd –reload -``` - -Now, start the zebra and ospfd daemons. - - -``` -# systemctl start zebra -# systemctl start ospfd -``` - -Look at the route table on both hosts using: - - -``` -[root@alpha ~]# ip route show   -default via 192.168.122.1 dev eth0 proto static metric 100 -10.10.10.0/24 via 192.168.122.50 dev eth0 proto zebra metric 20 -10.12.13.0/24 dev eth1 proto kernel scope link src 10.12.13.1 -192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.100 metric 100 -``` - -You can see that the routing table on Alpha contains an entry of **10.10.10.0/24** via **192.168.122.50** offered through protocol **zebra**. Similarly, on host Beta, the table contains an entry of network **10.12.13.0/24** via **192.168.122.100**. - - -``` -[root@beta ~]# ip route show -default via 192.168.122.1 dev eth0 proto static metric 100 -10.10.10.0/24 dev eth1 proto kernel scope link src 10.10.10.1 -10.12.13.0/24 via 192.168.122.100 dev eth0 proto zebra metric 20 -192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.50 metric 100 -``` - -### Conclusion - -As you can see, the setup and configuration are relatively simple. To add complexity, you can add more network interfaces to the router to provide routing for more networks. You can also implement BGP and RIP protocols using the same method. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/quagga-linux - -作者:[M Umer][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/noisybotnet -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) -[2]: https://www.quagga.net/ -[3]: https://en.wikipedia.org/wiki/Quagga_(software) -[4]: https://www.gnu.org/software/zebra/ -[5]: https://en.wikipedia.org/wiki/Abstraction_layer -[6]: https://opensource.com/sites/default/files/uploads/quagga_arch.png (Quagga architecture) diff --git a/sources/tech/20200417 How to compress files on Linux 5 ways.md b/sources/tech/20200417 How to compress files on Linux 5 ways.md deleted file mode 100644 index 5ce33cd18c..0000000000 --- a/sources/tech/20200417 How to compress files on Linux 5 ways.md +++ /dev/null @@ -1,207 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to compress files on Linux 5 ways) -[#]: via: (https://www.networkworld.com/article/3538471/how-to-compress-files-on-linux-5-ways.html) -[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) - -How to compress files on Linux 5 ways -====== -There are a number of tools that you use to compress files on Linux systems, but they don't all behave the same way or yield the same level of compression. In this post, we compare five of them. -Getty Images - -There are quite a few commands on Linux for compressing files. One of the newest and most effective is **xz**, but they all have advantages for both saving disk space and preserving files for later use. In this post, we compare the compression commands and point out the significant differences. - -### tar - -The tar command is not specifically a compression command. It’s generally used to pull a number of files into a single file for easy transport to another system or to back the files up as a related group. It also provides compression as a feature, which makes a lot of sense, and the addition of the **z** compression option is available to make this happen. - -When compression is added to a **tar** command with the **z** option, tar uses **gzip** to do the compressing. - -You can use **tar** to compress a single file as easily as a group though this offers no particular advantage over using **gzip** directly. To use **tar** for this, just identify the file as you would a group of files with a “tar cfz newtarfile filename” command like this: - -``` -$ tar cfz bigfile.tgz bigfile - ^ ^ - | | - +- new file +- file to be compressed - -$ ls -l bigfile* --rw-rw-r-- 1 shs shs 103270400 Apr 16 16:09 bigfile --rw-rw-r-- 1 shs shs 21608325 Apr 16 16:08 bigfile.tgz -``` - -Note the significant reduction in the file size. - -If you prefer, you can use the **tar.gz** extension which might make the character of the file a bit more obvious, but most Linux users will probably recognize **tgz** as meaning the same thing – the combination of **tar** and **gz** to indicate that the file is a compressed tar file. You will be left with both the original file and the compressed file once the compression is complete. - -To collect a number of files together and compress the resultant “tar ball” in one command, use the same basic syntax, but specify the files to be included as a group in place of the single file. Here’s an example: - -[][1] - -``` -$ tar cfz bin.tgz bin/* - ^ ^ - | +-- files to include - + new file -``` - -### zip - -The **zip** command creates a compressed file while leaving the original file intact. The syntax is straightforward except that, as with **tar**, you have to remember that your original file should be the last argument on the command line. - -``` -$ zip ./bigfile.zip bigfile -updating: bigfile (deflated 79%) -$ ls -l bigfile bigfile.zip --rw-rw-r-- 1 shs shs 103270400 Apr 16 11:18 bigfile --rw-rw-r-- 1 shs shs 21606889 Apr 16 11:19 bigfile.zip -``` - -### gzip - -The **gzip** command is very simple to use. You just type "gzip" followed by the name of the file you want to compress. Unlike the commands described above, **gzip** will encrypt the files "in place". In other words, the original file will be replaced by the encrypted file. - -``` -$ gzip bigfile -$ ls -l bigfile* --rw-rw-r-- 1 shs shs 21606751 Apr 15 17:57 bigfile.gz -``` - -### bzip2 - -As with the **gzip** command, **bzip2** will compress the file that you select "in place", leaving only the original file. - -``` -$ bzip bigfile -$ ls -l bigfile* --rw-rw-r-- 1 shs shs 18115234 Apr 15 17:57 bigfile.bz2 -``` - -### xz - -A relative newcomer to the compression command team, **xz** is a front runner in terms of how well it compresses files. Like the two previous commands, you only need to supply the file name to the command. Again, the original file is compressed in place. - -``` -$ xz bigfile -$ ls -l bigfile* --rw-rw-r-- 1 shs shs 13427236 Apr 15 17:30 bigfile.xz -``` - -For large files, you are likely to notice that **xz** takes longer to run than other compression commands, but the compression results are very impressive. - -### Comparisons to consider - -Most people have heard it said that "size isn't everything". So, let's compare file size as well as some other issues to be considered when you make plans for how you want to compress your files. - -The stats shown below all relate to compressing the single file – bigfile – used in the example commands shown above. This file is a large and fairly random text file. Compression rates will depend to some extent on the content of the files. - -#### Size reduction - -When compared, the various compression commands shown above yielded the following results. The percentages represent how the compressed files compare with the original file. - -``` --rw-rw-r-- 1 shs shs 103270400 Apr 16 14:01 bigfile ------------------------------------------------------- --rw-rw-r-- 1 shs shs 18115234 Apr 16 13:59 bigfile.bz2 ~17% --rw-rw-r-- 1 shs shs 21606751 Apr 16 14:00 bigfile.gz ~21% --rw-rw-r-- 1 shs shs 21608322 Apr 16 13:59 bigfile.tgz ~21% --rw-rw-r-- 1 shs shs 13427236 Apr 16 14:00 bigfile.xz ~13% --rw-rw-r-- 1 shs shs 21606889 Apr 16 13:59 bigfile.zip ~21% -``` - -The **xz** commands wins, ending up at only 13% the size of the original file, but all of these compression commands reduced the original file size quite significantly. - -#### Whether the original files are replaced - -The **bzip2**, **gzip** and **xz** commands all replace the original files with compressed versions. The **tar** and **zip** commands to not. - -#### Run time - -The **xz** command seems to take more time than the other commands to encrypt the files. For bigfile, the approximate times were: - -``` -command run-time -tar 4.9 seconds -zip 5.2 seconds -bzip2 22.8 seconds -gzip 4.8 seconds -xz 50.4 seconds -``` - -Decompression times are likely to be considerably smaller than compression times. - -#### File permissions - -Regardless of what permissions you have set on your original file, permissions for the compressed file will be based on your **umask** setting, except for **bzip2** which retains the original file's permissions. - -#### Compatibility with Windows - -The **zip** command creates a file which can be used (i.e., decompressed) on Windows systems as well as Linux and other Unix systems without having to install other tools which may or may not be available. - -### Decompressing files - -The commands for decompressing files are similar to those used to compress the files. These commands would work for decompressing bigfile after the compression commands shown above were run. - - * tar: **tar xf bigfile.tgz** - * zip: **unzip bigfile.zip** - * gzip: **gunzip bigfile.gz** - * bzip2: **bunzip2 bigfile.gz2** - * xz: **xz -d bigfile.xz** or **unxz bigfile.xz** - - - -### Running your own compression comparisons - -If you'd like to run some tests on your own, grab a large but replaceable file and compress it using each of the commands shown above – preferably using a new subdirectory. You might have to first install **xz** if you want to include it in the tests.This script can make the comparison easier, but will likely take a few minutes to complete. - -``` -#!/bin/bash - -# ask user for filename -echo -n "filename> " -read filename - -# you need this because some commands will replace the original file -cp $filename $filename-2 - -# clean up first (in case previous results are still available) -rm $filename.* - -tar cvfz ./$filename.tgz $filename > /dev/null -zip $filename.zip $filename > /dev/null -bzip2 $filename -# recover original file -cp $filename-2 $filename -gzip $filename -# recover original file -cp $filename-2 $filename -xz $filename - -# show results -ls -l $filename.* - -# replace the original file -mv $filename-2 $filename -``` - -Join the Network World communities on [Facebook][2] and [LinkedIn][3] to comment on topics that are top of mind. - --------------------------------------------------------------------------------- - -via: https://www.networkworld.com/article/3538471/how-to-compress-files-on-linux-5-ways.html - -作者:[Sandra Henry-Stocker][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ -[b]: https://github.com/lujun9972 -[1]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy) -[2]: https://www.facebook.com/NetworkWorld/ -[3]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20200419 Getting Started With Pacman Commands in Arch-based Linux Distributions.md b/sources/tech/20200419 Getting Started With Pacman Commands in Arch-based Linux Distributions.md deleted file mode 100644 index f2fd06793f..0000000000 --- a/sources/tech/20200419 Getting Started With Pacman Commands in Arch-based Linux Distributions.md +++ /dev/null @@ -1,250 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Getting Started With Pacman Commands in Arch-based Linux Distributions) -[#]: via: (https://itsfoss.com/pacman-command/) -[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) - -Getting Started With Pacman Commands in Arch-based Linux Distributions -====== - -_**Brief: This beginner’s guide shows you what you can do with pacmancommands in Linux, how to use them to find new packages, install and upgrade new packages, and clean your system.**_ - -The [pacman][1] package manager is one of the main difference between [Arch Linux][2] and other major distributions like Red Hat and Ubuntu/Debian. It combines a simple binary package format with an easy-to-use [build system][3]. The aim of pacman is to easily manage packages, either from the [official repositories][4] or the user’s own builds. - -If you ever used Ubuntu or Debian-based distributions, you might have used the apt-get or apt commands. Pacman is the equivalent in Arch Linux. If you [just installed Arch Linux][5], one of the first few [things to do after installing Arch Linux][6] is to learn to use pacman commands. - -In this beginner’s guide, I’ll explain some of the essential usage of the pacmand command that you should know for managing your Arch-based system. - -### Essential pacman commands Arch Linux users should know - -![][7] - -Like other package managers, pacman can synchronize package lists with the software repositories to allow the user to download and install packages with a simple command by solving all required dependencies. - -#### Install packages with pacman - -You can install a single package or multiple packages using pacman command in this fashion: - -``` -pacman -S _package_name1_ _package_name2_ ... -``` - -![Installing a package][8] - -The -S stands for synchronization. It means that pacman first synchronizes - -The pacman database categorises the installed packages in two groups according to the reason why they were installed: - - * **explicitly-installed**: the packages that were installed by a generic pacman -S or -U command - * **dependencies**: the packages that were implicitly installed because [required][9] by another package that was explicitly installed. - - - -#### Remove an installed package - -To remove a single package, leaving all of its dependencies installed: - -``` -pacman -R package_name_ -``` - -![Removing a package][10] - -To remove a package and its dependencies which are not required by any other installed package: - -``` -pacman -Rs _package_name_ -``` - -To remove dependencies that are no longer needed. For example, the package which needed the dependencies was removed. - -``` -pacman -Qdtq | pacman -Rs - -``` - -#### Upgrading packages - -Pacman provides an easy way to [update Arch Linux][11]. You can update all installed packages with just one command. This could take a while depending on how up-to-date the system is. - -The following command synchronizes the repository databases _and_ updates the system’s packages, excluding “local” packages that are not in the configured repositories: - -``` -pacman -Syu -``` - - * S stands for sync - * y is for refresh (local - * u is for system update - - - -Basically it is saying that sync to central repository (master package database), refresh the local copy of the master package database and then perform the system update (by updating all packages that have a newer version available). - -![System update][12] - -Attention! - -If you are an Arch Linux user before upgrading, it is advised to visit the [Arch Linux home page][2] to check the latest news for out-of-the-ordinary updates. If manual intervention is needed an appropriate news post will be made. Alternatively you can subscribe to the [RSS feed][13] or the [arch-announce mailing list][14]. - -Be also mindful to look over the appropriate [forum][15] before upgrading fundamental software (such as the kernel, xorg, systemd, or glibc), for any reported problems. - -**Partial upgrades are unsupported** at a rolling release distribution such as Arch and Manjaro. That means when new library versions are pushed to the repositories, all the packages in the repositories need to be rebuilt against the libraries. For example, if two packages depend on the same library, upgrading only one package, might break the other package which depends on an older version of the library. - -#### Use pacman to search for packages - -Pacman queries the local package database with the -Q flag, the sync database with the -S flag and the files database with the -F flag. - -Pacman can search for packages in the database, both in packages’ names and descriptions: - -``` -pacman -Ss _string1_ _string2_ ... -``` - -![Searching for a package][16] - -To search for already installed packages: - -``` -pacman -Qs _string1_ _string2_ ... -``` - -To search for package file names in remote packages: - -``` -pacman -F _string1_ _string2_ ... -``` - -To view the dependency tree of a package: - -``` -pactree _package_naenter code hereme_ -``` - -#### Cleaning the package cache - -Pacman stores its downloaded packages in /var/cache/pacman/pkg/ and does not remove the old or uninstalled versions automatically. This has some advantages: - - 1. It allows to [downgrade][17] a package without the need to retrieve the previous version through other sources. - 2. A package that has been uninstalled can easily be reinstalled directly from the cache folder. - - - -However, it is necessary to clean up the cache periodically to prevent the folder to grow in size. - -The [paccache(8)][18] script, provided within the [pacman-contrib][19] package, deletes all cached versions of installed and uninstalled packages, except for the most recent 3, by default: - -``` -paccache -r -``` - -![Clear cache][20] - -To remove all the cached packages that are not currently installed, and the unused sync database, execute: - -``` -pacman -Sc -``` - -To remove all files from the cache, use the clean switch twice, this is the most aggressive approach and will leave nothing in the cache folder: - -``` -pacman -Scc -``` - -#### Installing local or third-party packages - -Install a ‘local’ package that is not from a remote repository: - -``` -pacman -U _/path/to/package/package_name-version.pkg.tar.xz_ -``` - -Install a ‘remote’ package, not contained in an official repository: - -``` -pacman -U http://www.example.com/repo/example.pkg.tar.xz -``` - -### Bonus: Troubleshooting common errors with pacman - -Here are some common errors you may encounter while managing packages with pacman. - -#### Failed to commit transaction (conflicting files) - -If you see the following error: - -``` -error: could not prepare transaction -error: failed to commit transaction (conflicting files) -package: /path/to/file exists in filesystem -Errors occurred, no packages were upgraded. -``` - -This is happening because pacman has detected a file conflict and will not overwrite files for you. - -A safe way to solve this is to first check if another package owns the file (pacman -Qo _/path/to/file_). If the file is owned by another package, file a bug report. If the file is not owned by another package, rename the file which ‘exists in filesystem’ and re-issue the update command. If all goes well, the file may then be removed. - -Instead of manually renaming and later removing all the files that belong to the package in question, you may explicitly run _**pacman -S –overwrite glob package**_ to force pacman to overwrite files that match _glob_. - -#### Failed to commit transaction (invalid or corrupted package) - -Look for .part files (partially downloaded packages) in /var/cache/pacman/pkg/ and remove them. It is often caused by usage of a custom XferCommand in pacman.conf. - -#### Failed to init transaction (unable to lock database) - -When pacman is about to alter the package database, for example installing a package, it creates a lock file at /var/lib/pacman/db.lck. This prevents another instance of pacman from trying to alter the package database at the same time. - -If pacman is interrupted while changing the database, this stale lock file can remain. If you are certain that no instances of pacman are running then delete the lock file. - -Check if a process is holding the lock file: - -``` -lsof /var/lib/pacman/db.lck -``` - -If the above command doesn’t return anything, you can remove the lock file: - -``` -rm /var/lib/pacman/db.lck -``` - -If you find the PID of the process holding the lock file with lsof command output, kill it first and then remove the lock file. - -I hope you like my humble effort in explaining the basic pacman commands. Please leave your comments below and don’t forget to subscribe on our social media. Stay safe! - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/pacman-command/ - -作者:[Dimitrios Savvopoulos][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/dimitrios/ -[b]: https://github.com/lujun9972 -[1]: https://www.archlinux.org/pacman/ -[2]: https://www.archlinux.org/ -[3]: https://wiki.archlinux.org/index.php/Arch_Build_System -[4]: https://wiki.archlinux.org/index.php/Official_repositories -[5]: https://itsfoss.com/install-arch-linux/ -[6]: https://itsfoss.com/things-to-do-after-installing-arch-linux/ -[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/essential-pacman-commands.jpg?ssl=1 -[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/sudo-pacman-S.png?ssl=1 -[9]: https://wiki.archlinux.org/index.php/Dependency -[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/sudo-pacman-R.png?ssl=1 -[11]: https://itsfoss.com/update-arch-linux/ -[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/sudo-pacman-Syu.png?ssl=1 -[13]: https://www.archlinux.org/feeds/news/ -[14]: https://mailman.archlinux.org/mailman/listinfo/arch-announce/ -[15]: https://bbs.archlinux.org/ -[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/sudo-pacman-Ss.png?ssl=1 -[17]: https://wiki.archlinux.org/index.php/Downgrade -[18]: https://jlk.fjfi.cvut.cz/arch/manpages/man/paccache.8 -[19]: https://www.archlinux.org/packages/?name=pacman-contrib -[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/sudo-paccache-r.png?ssl=1 diff --git a/sources/tech/20200421 How I use Python to map the global spread of COVID-19.md b/sources/tech/20200421 How I use Python to map the global spread of COVID-19.md deleted file mode 100644 index 2f5f8dbef0..0000000000 --- a/sources/tech/20200421 How I use Python to map the global spread of COVID-19.md +++ /dev/null @@ -1,170 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How I use Python to map the global spread of COVID-19) -[#]: via: (https://opensource.com/article/20/4/python-map-covid-19) -[#]: author: (AnuragGupta https://opensource.com/users/999anuraggupta) - -How I use Python to map the global spread of COVID-19 -====== -Create a color coded geographic map of the potential spread of the virus -using these open source scripts. -![Globe up in the clouds][1] - -The spread of disease is a real concern for a world in which global travel is commonplace. A few organizations track significant epidemics (and any pandemic), and fortunately, they publish their work as open data. The raw data can be difficult for humans to process, though, and that's why data science is so vital. For instance, it could be useful to visualize the worldwide spread of COVID-19 with Python and Pandas. - -It can be hard to know where to start when you're faced with large amounts of raw data. The more you do it, however, the more patterns begin to emerge. Here's a common scenario, applied to COVID-19 data: - - 1. Download COVID-19 country spread daily data into a Pandas DataFrame object from GitHub. For this, you need the Python Pandas library. - 2. Process and clean the downloaded data and make it suitable for visualizing. The downloaded data (as you will see for yourself) is in quite good condition. The one problem with this data is that it uses the names of countries, but it's better to use three-digit ISO 3 codes. To generate the three-digit ISO 3 codes, use a small Python library called pycountry. Having generated these codes, you can add an extra column to our DataFrame and populate it with these codes. - 3. Finally, for the visualization, use the **express** module of a library called Plotly. This article uses what are called choropleth maps (available in Plotly) to visualize the worldwide spread of the disease. - - - -### Step 1: Corona data - -We will download the latest corona data from: - - - -We will load the data directly into a Pandas DataFrame. Pandas provides a function, **read_csv()**, which can take a URL and return a DataFrame object as shown below: - - -``` -import pycountry -import plotly.express as px -import pandas as pd -URL_DATASET = r'' -df1 = pd.read_csv(URL_DATASET) -print(df1.head(3))  # Get first 3 entries in the dataframe -print(df1.tail(3))  # Get last 3 entries in the dataframe -``` - -The screenshot of output (on Jupyter) is: - -![Jupyter screenshot][2] - -From output, you can see that the DataFrame (df1) has the following columns: - - 1. Date - 2. Country - 3. Confirmed - 4. Recovered - 5. Dead - - - -Further, you can see that the **Date** column has entries starting from January 22 to March 31. This database is updated daily, so you will get the current values. - -### Step 2: Cleaning and modifying the data frame - -We need to add another column to this DataFrame, which has the three-letter ISO alpha-3 codes. To do this, I followed these steps: - - 1. Create a list of all countries in the database. This was required because in the **df**, in the column **Country**, each country was figuring for each date. So in effect, the **Country** column had multiple entries for each country. To do this, I used the **unique().tolist()** functions. - 2. Then I took a dictionary **d_country_code** (initially empty) and populated it with keys consisting of country names and values consisting of their three-letter ISO codes. - 3. To generate the three-letter ISO code for a country, I used the function **pycountry.countries.search_fuzzy(country)**. You need to understand that the return value of this function is a "list of **Country** objects." I passed the return value of this function to a name country_data. Further, in this list of objects, the first object i.e., at index 0, is the best fit. Further, this **\** object has an attribute **alpha_3**. So, I can "access" the 3 letter ISO code by using **country_data[0].alpha_3**. However, it is possible that some country names in the DataFrame may not have a corresponding ISO code (For example, disputed territories). So, for such countries, I gave an ISO code of "i.e. a blank string. Further, you need to wrap this code in a try-except block. The statement: **print(_‘could not add ISO 3 code for ->'_, country)** will give a printout of those countries for which the ISO 3 codes could not be found. In fact, you will find such countries as shown with white color in the final output. - 4. Having got the three-letter ISO code for each country (or an empty string for some), I added the country name (as key) and its corresponding ISO code (as value) to the dictionary **d_country_code**. For adding these, I used the **update()** method of the Python dictionary object. - 5. Having created a dictionary of country names and their codes, I added them to the DataFrame using a simple for loop. - - - -### Step 3: Visualizing the spread using Plotly - -A choropleth map is a map composed of colored polygons. It is used to represent spatial variations of a quantity. We will use the express module of Plotly conventionally called **px**. Here we show you how to create a choropleth map using the function: **px.choropleth**. - -The signature of this function is: - - -``` -`plotly.express.choropleth(data_frame=None, lat=None, lon=None, locations=None, locationmode=None, geojson=None, featureidkey=None, color=None, hover_name=None, hover_data=None, custom_data=None, animation_frame=None, animation_group=None, category_orders={}, labels={}, color_discrete_sequence=None, color_discrete_map={}, color_continuous_scale=None, range_color=None, color_continuous_midpoint=None, projection=None, scope=None, center=None, title=None, template=None, width=None, height=None)` -``` - -The noteworthy points are that the **choropleth()** function needs the following things: - - 1. A geometry in the form of a **geojson** object. This is where things are a bit confusing and not clearly mentioned in its documentation. You may or may not provide a **geojson** object. If you provide a **geojson** object, then that object will be used to plot the earth features, but if you don't provide a **geojson** object, then the function will, by default, use one of the built-in geometries. (In our example here, we will use a built-in geometry, so we won't provide any value for the **geojson** argument) - 2. A pandas DataFrame object for the attribute **data_frame**. Here we provide our DataFrame ie **df1** we created earlier. - 3. We will use the data of **Confirmed** column to decide the color of each country polygon. - 4. Further, we will use the **Date** column to create the **animation_frame**. Thus as we slide across the dates, the colors of the countries will change as per the values in the **Confirmed** column. - - - -The complete code is given below: - - -``` -import pycountry -import plotly.express as px -import pandas as pd -# ----------- Step 1 ------------ -URL_DATASET = r'' -df1 = pd.read_csv(URL_DATASET) -# print(df1.head) # Uncomment to see what the dataframe is like -# ----------- Step 2 ------------ -list_countries = df1['Country'].unique().tolist() -# print(list_countries) # Uncomment to see list of countries -d_country_code = {}  # To hold the country names and their ISO -for country in list_countries: -    try: -        country_data = pycountry.countries.search_fuzzy(country) -        # country_data is a list of objects of class pycountry.db.Country -        # The first item  ie at index 0 of list is best fit -        # object of class Country have an alpha_3 attribute -        country_code = country_data[0].alpha_3 -        d_country_code.update({country: country_code}) -    except: -        print('could not add ISO 3 code for ->', country) -        # If could not find country, make ISO code ' ' -        d_country_code.update({country: ' '}) - -# print(d_country_code) # Uncomment to check dictionary   - -# create a new column iso_alpha in the df -# and fill it with appropriate iso 3 code -for k, v in d_country_code.items(): -    df1.loc[(df1.Country == k), 'iso_alpha'] = v - -# print(df1.head)  # Uncomment to confirm that ISO codes added -# ----------- Step 3 ------------ -fig = px.choropleth(data_frame = df1, -                    locations= "iso_alpha", -                    color= "Confirmed",  # value in column 'Confirmed' determines color -                    hover_name= "Country", -                    color_continuous_scale= 'RdYlGn',  #  color scale red, yellow green -                    animation_frame= "Date") - -fig.show() -``` - -The output is something like the following: - -![Map][3] - -You can download and run the [complete code][4]. - -To wrap up, here are some excellent resources on choropleth in Plotly: - - * - * [https://plotly.com/python/reference/#choropleth][5] - - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/python-map-covid-19 - -作者:[AnuragGupta][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/999anuraggupta -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud-globe.png?itok=_drXt4Tn (Globe up in the clouds) -[2]: https://opensource.com/sites/default/files/uploads/jupyter_screenshot.png (Jupyter screenshot) -[3]: https://opensource.com/sites/default/files/uploads/map_2.png (Map) -[4]: https://github.com/ag999git/jupyter_notebooks/blob/master/corona_spread_visualization -[5]: tmp.azs72dmHFd#choropleth diff --git a/sources/tech/20200421 Using Python to visualize COVID-19 projections.md b/sources/tech/20200421 Using Python to visualize COVID-19 projections.md deleted file mode 100644 index 96fcb61521..0000000000 --- a/sources/tech/20200421 Using Python to visualize COVID-19 projections.md +++ /dev/null @@ -1,255 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Using Python to visualize COVID-19 projections) -[#]: via: (https://opensource.com/article/20/4/python-data-covid-19) -[#]: author: (AnuragGupta https://opensource.com/users/999anuraggupta) - -Using Python to visualize COVID-19 projections -====== -I'll demonstrate how to create two visualizations of the spread of a -virus across the globe, provided open data and using open source -libraries. -![Colorful sound wave graph][1] - -Using [Python][2] and some graphing libraries, you can project the total number of confirmed cases of COVID-19, and also display the total number of deaths for a country (this article uses India as an example) on a given date. Humans sometimes need help interpreting and processing the meaning of data, so this article also demonstrates how to create an animated horizontal bar graph for five countries, showing the variation of cases by date. - -### Projecting confirmed cases and deaths for India - -This is done in three steps. - -#### 1\. Download data - -Scientific data isn't always open, but fortunately, many modern science and healthcare organizations are eager to share information with each other and the public. Data about COVID-19 cases is available online, and it's updated frequently. - -To parse the data, you first must download it:  - -Load the data directly into a Pandas DataFrame. Pandas provides a function, **read_csv()**, which can take a URL and give back a DataFrame object, as shown below: - - -``` -import pycountry -import plotly.express as px -import pandas as pd -URL_DATASET = r'' -df1 = pd.read_csv(URL_DATASET) -print(df1.head(3))  # Get first 3 entries in the dataframe -print(df1.tail(3))  # Get last 3 entries in the dataframe -``` - -The top row of the data set contains column names: - - 1. Date - 2. Country - 3. Confirmed - 4. Recovered - 5. Deaths - - - -The output of the **head** query includes a unique identifier (not listed as a column) plus an entry for each column: - - -``` -0 2020-01-22 Afghanistan 0 0 0 -1 2020-01-22 Albania 0 0 0 -1 2020-01-22 Algeria 0 0 0 -``` - -The output of the **tail** query is similar but contains the tail end of the data set: - - -``` -12597 2020-03-31 West Bank and Gaza 119 18 1 -12598 2020-03-31 Zambia 35 0 0 -12599 2020-03-31 Zimbabwe 8 0 1 -``` - -From the output, you can see that the DataFrame (**df1**) has the following columns: - - 1. Date - 2. Country - 3. Confirmed - 4. Recovered - 5. Dead - - - -Further, you can see that the **Date** column has entries starting from January 22 to March 31. This database is updated daily, so you will have current values. - -#### 2\. Select data for India - -In this step, we will select only those rows in the DataFrame that include India. This is shown in the script below: - - -``` -#### ----- Step 2 (Select data for India)---- -df_india = df1[df1['Country'] == 'India'] -print(df_india.head(3)) -``` - -#### 3\. Plot data - -Here we create a bar chart. We will put the dates on the X-axis and the number of confirmed cases and the number of deaths on the Y-axis. There are a few noteworthy things about this part of the script which are as follows: - - * The line of code: **plt.rcParams["_figure.figsize"_]=20,20** is meant only for Jupyter. So remove it if you are using some other IDE. - - * Notice the line of code: **ax1 = plt.gca()**. To ensure that both the plots i.e. for confirmed cases as well as for deaths are plotted on the same graph, we need to give to the second graph the **ax** object of the plot. So we use **gca()** to do this. (By the way, 'gca' stands for 'get current axis'). - - - - -The complete script is given below: - - -``` -#  Author:- Anurag Gupta # email:- [999.anuraggupta@gmail.com][3] -%matplotlib inline -import matplotlib.pyplot as plt -import pandas as pd - -#### ----- Step 1 (Download data)---- -URL_DATASET = r'' -df1 = pd.read_csv(URL_DATASET) -# print(df1.head(3))  # Uncomment to see the dataframe - -#### ----- Step 2 (Select data for India)---- -df_india = df1[df1['Country'] == 'India'] -print(df_india.head(3)) - -#### ----- Step 3 (Plot data)---- -# Increase size of plot -plt.rcParams["figure.figsize"]=20,20  # Remove if not on Jupyter -# Plot column 'Confirmed' -df_india.plot(kind = 'bar', x = 'Date', y = 'Confirmed', color = 'blue') - -ax1 = plt.gca() -df_india.plot(kind = 'bar', x = 'Date', y = 'Deaths', color = 'red', ax = ax1) -plt.show() -``` - -The entire script is [available on GitHub][4]. - -### Creating an animated horizontal bar graph for five countries - -Note for Jupyter: To run this in Jupyter as a dynamic animation rather than as a static png, you need to add a magic command at the beginning of your cell, namely: **%matplotlib notebook**. This will keep the figure alive instead of displaying a static png file and can hence also show animations. If you are on another IDE, remove this line. - -#### 1\. Download the data - -This step is exactly the same as in the previous script, and therefore, it need not be repeated. - -#### 2\. Create a list of all dates - -If you examine the data you downloaded, you notice that it has a column **Date**. Now, this column has a date value for each country. So the same date is occurring a number of times. We need to create a list of dates with only unique values. This will be used on the X-axis of our bar charts. We have a line of code like: **list_dates = df[_‘Date’_].unique()**. The **unique()** method will pick up only the unique values for each date. - -#### 3\. Pick five countries and create an **ax** object - -Take a list of five countries. (You can choose whatever countries you prefer, or even increase or decrease the number of countries). I have also taken a list of five colors for the bars of each country. (You can change this too if you like). One important line of code here is: **fig, ax = plt.subplots(figsize=(15, 8))**. This is needed to create an **ax** object. - -#### 4\. Write the call back function - -If you want to do animation in Matplotlib, you need to create an object of a class called **matplotlib.animation.FuncAnimation**. The signature of this class is available online. The constructor of this class, apart from other parameters, also takes a parameter called **func**, and you have to give this parameter a callback function. So in this step, we will write the callback function, which is repeatedly called in order to render the animation. - -#### 5\. Create **FuncAnimation** object - -This step has partly been explained in the previous step. - -Our code to create an object of this class is: - - -``` -my_anim = animation.FuncAnimation(fig = fig, func = plot_bar, -                    frames= list_dates, blit=True, -                    interval=20) -``` - -The three important parameters to be given are: - - * **fig**, which must be given a fig object, which we created earlier. - * **func**, which must be the call back function. - * **frames**, which must contain the variable on which the animation is to be done. Here in our case, it will be the list of dates we created earlier. - - - -#### 6\. Save the animation to an mp4 file - -You can save the animation created into an mp4 file. But for this you need **ffmpeg**. You can download this using pip by **pip install ffmpeg-python**, or using conda (on Jupyter) **install -c conda-forge ffmpeg**. - -And finally, you can run the animation using **plt.show()**. Please note that on many platforms, the **ffmpeg** may not work properly and may require further "tweaking." - - -``` -%matplotlib notebook -#  Author:- Anurag Gupta # email:- [999.anuraggupta@gmail.com][3] -import pandas as pd -import matplotlib.pyplot as plt -import matplotlib.animation as animation -from time import sleep - -#### ---- Step 1:- Download data -URL_DATASET = r'' -df = pd.read_csv(URL_DATASET, usecols = ['Date', 'Country', 'Confirmed']) -# print(df.head(3)) # uncomment this to see output - -#### ---- Step 2:- Create list of all dates -list_dates = df['Date'].unique() -# print(list_dates) # Uncomment to see the dates - -#### --- Step 3:- Pick 5 countries. Also create ax object -fig, ax = plt.subplots(figsize=(15, 8)) -# We will animate for these 5 countries only -list_countries = ['India', 'China', 'US', 'Italy', 'Spain'] -# colors for the 5 horizontal bars -list_colors = ['black', 'red', 'green', 'blue', 'yellow'] - -### --- Step 4:- Write the call back function -# plot_bar() is the call back function used in FuncAnimation class object -def plot_bar(some_date): -    df2 = df[df['Date'].eq(some_date)] -    ax.clear() -    # Only take Confirmed column in descending order -    df3 = df2.sort_values(by = 'Confirmed', ascending = False) -    # Select the top 5 Confirmed countries -    df4 = df3[df3['Country'].isin(list_countries)] -    # print(df4)  # Uncomment to see that dat is only for 5 countries -    sleep(0.2)  # To slow down the animation -    # ax.barh() makes a horizontal bar plot. -    return ax.barh(df4['Country'], df4['Confirmed'], color= list_colors) - -###----Step 5:- Create FuncAnimation object--------- -my_anim = animation.FuncAnimation(fig = fig, func = plot_bar, -                    frames= list_dates, blit=True, -                    interval=20) - -### --- Step 6:- Save the animation to an mp4 -# Place where to save the mp4. Give your file path instead -path_mp4 = r'C:\Python-articles\population_covid2.mp4'   -# my_anim.save(path_mp4, fps=30, extra_args=['-vcodec', 'libx264']) -my_anim.save(filename = path_mp4, writer = 'ffmpeg', -             fps=30, -             extra_args= ['-vcodec', 'libx264', '-pix_fmt', 'yuv420p']) -plt.show() -``` - -The complete script is [available on GitHub][5]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/python-data-covid-19 - -作者:[AnuragGupta][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/999anuraggupta -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/colorful_sound_wave.png?itok=jlUJG0bM (Colorful sound wave graph) -[2]: https://opensource.com/resources/python -[3]: mailto:999.anuraggupta@gmail.com -[4]: https://raw.githubusercontent.com/ag999git/jupyter_notebooks/master/corona_bar_india -[5]: https://raw.githubusercontent.com/ag999git/jupyter_notebooks/master/corona_bar_animated diff --git a/sources/tech/20200422 How to Check the Available Network Interfaces, Associated IP Addresses, MAC Addresses, and Interface Speed on Linux.md b/sources/tech/20200422 How to Check the Available Network Interfaces, Associated IP Addresses, MAC Addresses, and Interface Speed on Linux.md deleted file mode 100644 index a16a007124..0000000000 --- a/sources/tech/20200422 How to Check the Available Network Interfaces, Associated IP Addresses, MAC Addresses, and Interface Speed on Linux.md +++ /dev/null @@ -1,202 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (geekpi) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (How to Check the Available Network Interfaces, Associated IP Addresses, MAC Addresses, and Interface Speed on Linux) -[#]: via: (https://www.2daygeek.com/linux-unix-check-network-interfaces-names-nic-speed-ip-mac-address/) -[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/) - -How to Check the Available Network Interfaces, Associated IP Addresses, MAC Addresses, and Interface Speed on Linux -====== - -By default when you set up the server you will configure the primary network interface. - -This is part of the build work that everyone does. - -Sometimes you may need to configure an additional network interface for several reasons. - -This could be a network bonding/teaming or high availability or a separate interface for application requirements or backups. - -To do so, you need to know how many interfaces your computer has and their speed to configure it. - -There are many commands to check for available network interfaces, but we only use the IP command. - -Later we will write a separate article with all these tools. - -In this tutorial, we will show you the Available Network Interface Card (NIC) information, such as the interface name, associated IP address, MAC address, and interface speed. - -### What’s IP Command - -**[IP command][1]** is similar to ifconfig, which is used to for assigning Static IP Address, Route & Default Gateway, etc., - -``` -# ip a - -1: lo: mtu 65536 qdisc noqueue state UNKNOWN - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 - inet 127.0.0.1/8 scope host lo - inet6 ::1/128 scope host - valid_lft forever preferred_lft forever -2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 - link/ether fa:16:3e:a0:7d:5a brd ff:ff:ff:ff:ff:ff - inet 192.168.1.101/24 brd 192.168.1.101 scope global eth0 - inet6 fe80::f816:3eff:fea0:7d5a/64 scope link - valid_lft forever preferred_lft forever -``` - -### What’s ethtool Command - -The ethtool is used to query or control network driver and hardware settings. - -``` -# ethtool eth0 -``` - -### 1) How to Check the Available Network Interfaces on Linux Using the IP Command - -When you run the IP command without any arguments, it gives you plenty of information, but if you only need the available network interfaces, use the following customized IP command. - -``` -# ip a |awk '/state UP/{print $2}' - -eth0: -eth1: -``` - -### 2) How to Check the IP Address of a Network Interface on Linux Using the IP Command - -If you only want to see which IP address is assigned to which interface, use the following customized IP command. - -``` -# ip -o a show | cut -d ' ' -f 2,7 -or -ip a |grep -i inet | awk '{print $7, $2}' - -lo 127.0.0.1/8 -192.168.1.101/24 -192.168.1.102/24 -``` - -### 3) How to Check the Network Interface Card MAC Address on Linux Using the IP Command - -If you only want to see the network interface name and the corresponding MAC address, use the following format. - -To check a specific network interface MAC address. - -``` -# ip link show dev eth0 |awk '/link/{print $2}' -00:00:00:55:43:5c -``` - -To check MAC address for all network interface. - -``` -# vi /opt/scripts/mac-addresses.sh - -#!/bin/sh -ip a |awk '/state UP/{print $2}' | sed 's/://' | while read output; -do -echo $output: -ethtool -P $output -done -``` - -Run the below shell script to get the MAC address for multiple network interfaces. - -``` -# sh /opt/scripts/mac-addresses.sh - -eth0: -Permanent address: 00:00:00:55:43:5c -eth1: -Permanent address: 00:00:00:55:43:5d -``` - -### 4) How to Check the Network Interface Port Speed on Linux Using the ethtool Command - -If you want to check the network interface port speed on Linux, use the ethtool command. - -To check the speed of a particular network interface port. - -``` -# ethtool eth0 |grep "Speed:" - -Speed: 10000Mb/s -``` - -To check the port speed for all network interfaces. - -``` -# vi /opt/scripts/port-speed.sh - -#!/bin/sh -ip a |awk '/state UP/{print $2}' | sed 's/://' | while read output; -do -echo $output: -ethtool $output |grep "Speed:" -done -``` - -Run the below shell script to get the port speed for multiple network interfaces. - -``` -# sh /opt/scripts/port-speed.sh - -eth0: -Speed: 10000Mb/s -eth1: -Speed: 10000Mb/s -``` - -### 5) Shell Script to Verify Network Interface Card Information - -This **[shell script][2]** allows you to gather all of the above information, such as network interface names, IP addresses of network interfaces, MAC addresses of network interfaces, and the speed of a network interface port. - -``` -# vi /opt/scripts/nic-info.sh - -#!/bin/sh -hostname -echo "-------------" -for iname in $(ip a |awk '/state UP/{print $2}') -do -echo "$iname" -ip a | grep -A2 $iname | awk '/inet/{print $2}' -ip a | grep -A2 $iname | awk '/link/{print $2}' -ethtool $iname |grep "Speed:" -done -``` - -Run the below shell script to check network card information. - -``` -# sh /opt/scripts/nic-info.sh - -vps.2daygeek.com ----------------- -eth0: -192.168.1.101/24 -00:00:00:55:43:5c -Speed: 10000Mb/s -eth1: -192.168.1.102/24 -00:00:00:55:43:5d -Speed: 10000Mb/s -``` - --------------------------------------------------------------------------------- - -via: https://www.2daygeek.com/linux-unix-check-network-interfaces-names-nic-speed-ip-mac-address/ - -作者:[Magesh Maruthamuthu][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.2daygeek.com/author/magesh/ -[b]: https://github.com/lujun9972 -[1]: https://www.2daygeek.com/ip-command-configure-network-interface-usage-linux/ -[2]: https://www.2daygeek.com/category/shell-script/ diff --git a/sources/tech/20200422 Things You Should Know About Ubuntu 20.04.md b/sources/tech/20200422 Things You Should Know About Ubuntu 20.04.md deleted file mode 100644 index 1c4a13810e..0000000000 --- a/sources/tech/20200422 Things You Should Know About Ubuntu 20.04.md +++ /dev/null @@ -1,129 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: (geekpi) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Things You Should Know About Ubuntu 20.04) -[#]: via: (https://itsfoss.com/ubuntu-20-04-faq/) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -Things You Should Know About Ubuntu 20.04 -====== - -[Ubuntu 20.04 release][1] is just around the corner and you may have a few questions and doubts regarding upgrades, installation etc. - -I hosted some Q&A sessions on various social media channels to answer doubts of readers like you. - -I am going to list these common questions about Ubuntu 20.04 with their answers. I hope it helps you clear the doubts you have. And if you still have questions, feel free to ask in the comment section below. - -### Ubuntu 20.04: Your Questions Answered - -![][2] - -Just to clarify, some of the answers here maybe influenced by my personal opinion. If you are an experienced Ubuntu user, some of the questions may sound _silly_ to you but it not to the new Ubuntu users. - -#### When will Ubuntu 20.04 be released? - -Ubuntu 20.04 LTS is releasing on 23rd April 2020. All the participating flavors like Kubuntu, Lubuntu, Xubuntu, Budgie, MATE etc will have their 20.04 release available on the same day. - -#### What are the system requirements for Ubuntu 20.04? - -For the default GNOME version, you should have a minimum 4 GB of RAM, 2 GHz dual core processor and at least 25 GB of disk space. - -Other [Ubuntu flavors][3] may have different system requirements. - -#### Can I use Ubuntu 20.04 on 32-bit systems? - -No, not at all. You cannot use Ubuntu 20.04 on 32-bit systems. Even if you are using 32-bit Ubuntu 18.04, you cannot upgrade to Ubuntu 20.04. There is ISO for 32-bit systems for past several years. - -![Error while upgrading 32-bit Ubuntu 18.04 to Ubuntu 20.04][4] - -#### Can I use Wine on Ubuntu 20.04? - -Yes, you can still use Wine on Ubuntu 20.04 as the 32-bit lib support is still there for packages needed by Wine and [Steam Play][5]. - -#### Do I have to pay for Ubuntu 20.04 or purchase a license? - -No, Ubuntu is completely free to use. You don’t have to buy a license key or activate Ubuntu like you do in Windows. - -The download section of Ubuntu requests you to donate some money but it’s up to you if you want to give some money for developing this awesome operating system. - -#### What GNOME version does it have? - -Ubuntu 20.04 has GNOME 3.36. - -#### Does Ubuntu 20.04 have better performance than Ubuntu 18.04? - -Yes, in several aspects. Ubuntu 20.04 installs faster and it even boost faster. I have shown the performance comparison in the video below at 4:40 minutes. - -The scroll, Windows animation and other UI elements are more fluid and give a smoother experience in GNOME 3.36. - -#### How long will Ubuntu 20.04 be supported? - -It is a long-term support (LTS) release and like any LTS release, it will be supported for five years. Which means that Ubuntu 20.04 will get security and maintenance updates until April 2025. - -#### Will I lose data while upgrading to Ubuntu 20.04? - -You can upgrade to Ubuntu 20.04 from Ubuntu 19.10 or Ubuntu 18.04. You don’t need to create a live USB and install from it. All you need is a good internet connection that can download around 1.5 GB of data. - -Upgrading from an existing system doesn’t harm your files. You should have all your files as it is and most of your existing software should be either have the same version or upgraded versions. - -If you have used some third-party tools or [additional PPA][6], the upgrade procedure will disable them. You can enable these additional repositories again if they are available for Ubuntu 20.04. - -Upgrading takes like an hour and after a restart, you will be logged in to the newer version. - -Though your data will not be touched and you won’t lose system files and configurations, it is always a good idea to make backup of important data externally. - -#### When will I get to upgrade to Ubuntu 20.04? - -![][7] - -If you are using Ubuntu 19.10 and have correct update settings in place (as mentioned in the earlier sections), you should be notified for upgrading to Ubuntu 20.04 within a few days of Ubuntu 18.04 release. - -For Ubuntu 18.04 users, it may take some weeks before they are officially notified of the availability of Ubuntu 18.04. Probably, you may get the prompt after the first point release of Ubuntu 20.04.1. - -#### If I upgrade to Ubuntu 20.04, can I downgrade to 19.10 or 18.04? - -No, you cannot. While upgrading to a newer version is easy, there is no option to downgrade.  If you want to go back to Ubuntu 18.04, you’ll have [install Ubuntu 18.04][8] again. - -#### I am using Ubuntu 18.04 LTS. Should I Upgrade to Ubuntu 20.04 LTS? - -That depends upon you. If you are impressed by the new features in Ubuntu 20.04 and want to get your hands on it, you should upgrade. - -If you want a more stable system, I advise waiting for the first point release Ubuntu 20.04.1 release that will have bug fixes in the new release. 20.04.1 should typically be coming approximately two months after the release of Ubuntu 20.04. - -In either case, I recommend upgrading to Ubuntu 20.04 sooner or later. Ubuntu 20.04 has newer kernel, performance improvement and above all newer versions of software available in the repository. - -Make a backup on external disk and with a good internet connectivity, the upgrade should not be an issue. - -#### Should I do a fresh install of Ubuntu 20.04 or upgrade to it from 18.04/19.10? - -If you have a choice, make a backup of your data and do a fresh install of Ubuntu 20.04. - -Upgrading to 20.04 from an existing version is a convenient option. However, in my opinion, it still keeps some traces/packages of the older version. A fresh install is always cleaner. - -#### Any other questions about Ubuntu 20.04? - -If you have any other doubts regarding Ubuntu 20.04, please feel free to leave a comment below. If you think some other information should be added to the list, please let me know. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/ubuntu-20-04-faq/ - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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-20-04-release-features/ -[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu_20_04_faq.jpg?ssl=1 -[3]: https://itsfoss.com/which-ubuntu-install/ -[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-32-bit.jpg?ssl=1 -[5]: https://itsfoss.com/steam-play/ -[6]: https://itsfoss.com/ppa-guide/ -[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/upgrade-ubuntu-20-04.jpg?ssl=1 -[8]: https://itsfoss.com/install-ubuntu/ diff --git a/sources/tech/20200423 4 open source chat applications you should use right now.md b/sources/tech/20200423 4 open source chat applications you should use right now.md deleted file mode 100644 index 25aa100c53..0000000000 --- a/sources/tech/20200423 4 open source chat applications you should use right now.md +++ /dev/null @@ -1,139 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (4 open source chat applications you should use right now) -[#]: via: (https://opensource.com/article/20/4/open-source-chat) -[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur) - -4 open source chat applications you should use right now -====== -Collaborating remotely is an essential capability now, making open -source real-time chat an essential piece of your toolbox. -![Chat bubbles][1] - -The first thing we usually do after waking up in the morning is to check our cellphone to see if there are important messages from our colleagues and friends. Whether or not it's a good idea, this behavior has become part of our daily lifestyle. - -> _"Man is a rational animal. He can think up a reason for anything he wants to believe."_ -> _– Anatole France_ - -No matter the soundness of the reason, we all have a suite of communication tools—email, phone calls, web-conferencing tools, or social networking—we use on a daily basis. Even before COVID-19, working from home already made these communication tools an essential part of our world. And as the pandemic has made working from home the new normal, we're facing unprecedented changes to how we communicate, which makes these tools not merely essential but now required. - -### Why chat? - -When working remotely as a part of a globally distributed team, we must have a collaborative environment. Chat applications play a vital role in helping us stay connected. In contrast to email, chat applications provide fast, real-time communications with colleagues around the globe. - -There are a lot of factors involved in choosing a chat application. To help you pick the right one for you, in this article, I'll explore four open source chat applications and one open source video-communication tool (for when you need to be "face-to-face" with your colleagues), then outline some of the features you should look for in an effective communication application. - -### 4 open source chat apps - -#### Rocket.Chat - -![Rocket.Chat][2] - -[Rocket.Chat][3] is a comprehensive communication platform that classifies channels as public (open to anyone who joins) or private (invitation-only) rooms. You can also send direct messages to people who are logged in; share documents, links, photos, videos, and GIFs; make video calls; and send audio messages without leaving the platform. - -Rocket.Chat is free and open source, but what makes it unique is its self-hosted chat system. You can download it onto your server, whether it's an on-premises server or a virtual private server on a public cloud. - -Rocket.Chat is completely free, and its [source code][4] is available on GitHub. Many open source projects use Rocket.Chat as their official communication platform. It is constantly evolving with new features and improvements. - -The things I like the most about Rocket.Chat are its ability to be customized according to user requirements and that it uses machine learning to do automatic, real-time message translation between users. You can also download Rocket.Chat for your mobile device and use it on the go. - -#### IRC - -![IRC on WeeChat 0.3.5][5] - -[Internet Relay Chat (IRC)][6] is a real-time, text-based form of communication. Although it's one of the oldest forms of electronic communication, it remains popular among many well-known software projects. - -IRC channels are discrete chat rooms. It allows you to have conversations with multiple people in an open channel or chat with someone privately one-on-one. If a channel name starts with a #, you can assume it to be official, whereas chat rooms that begin with ## are unofficial and usually casual. - -[Getting started with IRC][7] is easy. Your IRC handle or nickname is what allows people to find you, so it must be unique. But your choice of IRC client is completely your decision. If you want a more feature-rich application than a standard IRC client, you can connect to IRC with [Riot.im][8]. - -Given its age, why should you still be on IRC? For one reason, it remains the home for many of the free and open source projects we depend on. If you want to participate in open source software and communities, IRC is the option to get started. - -#### Zulip - -![Zulip][9] - -[Zulip][10] is a popular group-chat application that follows the topic-based threading model. In Zulip, you subscribe to streams, just like in IRC channels or Rocket.Chat. But each Zulip stream opens a topic that is unique, which helps you track conversations later, thus making it more organized. - -Like other platforms, it supports emojis, inline images, video, and tweet previews. It also supports LaTeX for sharing math formulas or equations and Markdown and syntax highlighting for sharing code. - -Zulip is cross-platform and offers APIs for building your own integrations. Something I especially like about Zulip is its integration feature with GitHub: if I'm working on an issue, I can use Zulip's marker to link back to the pull request ID. - -Zulip is open source (you can access its [source code][11] on GitHub) and free to use, but it has paid offerings for on-premises support, [LDAP][12] integration, and more storage. - -#### Let's Chat - -![Let's Chat][13] - -[Let's Chat][14] is a self-hosted chat solution for small teams. It runs on Node.js and MongoDB and can be deployed to local servers or hosted services with a few clicks. It's free and open source, with the [source code][15] available on GitHub. - -What differentiates Let's Chat from other open source chat tools is its enterprise features: it supports LDAP and [Kerberos][16] authentication. It also has all the features a new user would want: you can search message history in the archives and tag people with mentions like @username. - -What I like about Let's Chat is that it has private and password-protected rooms, image embeds, GIPHY support, and code pasting. It is constantly evolving and adding more features to its bucket. - -### Bonus: Open source video chat with Jitsi - -![Jitsi][17] - -Sometimes text chat isn't enough, and you need to talk to someone face-to-face. In times like these, when in-person meetings aren't an option, video chat is the best alternative. [Jitsi][18] is a complete, open source, multi-platform, and WebRTC-compliant videoconferencing tool. - -Jitsi began with Jitsi Desktop and has evolved into multiple [projects][19], including Jitsi Meet, Jitsi Videobridge, jibri, and libjitsi, with [source code][20] published for each on GitHub. - -Jitsi is secure and scalable and supports advanced video-routing concepts such as simulcast and bandwidth estimation, as well as typical capabilities like audio, recording, screen-sharing, and dial-in features. You can set a password to secure your video-chat room and protect it against intruders, and it also supports live-streaming over YouTube. You can also build your own Jitsi server and host it on-premises or on a virtual private server, such as a Digital Ocean Droplet. - -What I like most about Jitsi is that it is free and frictionless; anyone can start a meeting in no time by visiting [meet.jit.si][21], and users are good to go with no need for registration or installation. (However, registration gives you calendar integrations.) This low-barrier-to-entry alternative to popular videoconferencing services is helping Jitsi's popularity spread rapidly. - -### Tips for choosing a chat application - -The variety of open source chat applications can make it hard to pick one. The following are some general guidelines for choosing a chat app. - - * Tools that have an interactive interface and simple navigation are ideal. - * It's better to look for a tool that has great features and allows people to use it in various ways. - * Integrations with tools you use can play an important role in your decision. Some tools have great and seamless integrations with GitHub, GitLab, and certain applications, which is a useful feature. - * It's convenient to use tools that have a pathway to hosting on cloud-based services. - * The security of the chat service should be taken into account. The ability to host services on a private server is necessary for many organizations and individuals. - * It's best to select communication tools that have rich privacy settings and allow for both private and public chat rooms. - - - -Since people are more dependent than ever on online services, it is smart to have a backup communication platform available. For example, if a project is using Rocket.Chat, it should also have the option to hop into IRC, if necessary. Since these services are continuously updating, you may find yourself connected to multiple channels, and this is where integration becomes so valuable. - -Of the different open source chat services available, which ones do you like and use? How do these tools help you work remotely? Please share your thoughts in the comments. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/open-source-chat - -作者:[Sudeshna Sur][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/sudeshna-sur -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_communication_team.png?itok=CYfZ_gE7 (Chat bubbles) -[2]: https://opensource.com/sites/default/files/uploads/rocketchat.png (Rocket.Chat) -[3]: https://rocket.chat/ -[4]: https://github.com/RocketChat/Rocket.Chat -[5]: https://opensource.com/sites/default/files/uploads/irc.png (IRC on WeeChat 0.3.5) -[6]: https://en.wikipedia.org/wiki/Internet_Relay_Chat -[7]: https://opensource.com/article/16/6/getting-started-irc -[8]: https://opensource.com/article/17/5/introducing-riot-IRC -[9]: https://opensource.com/sites/default/files/uploads/zulip.png (Zulip) -[10]: https://zulipchat.com/ -[11]: https://github.com/zulip/zulip -[12]: https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol -[13]: https://opensource.com/sites/default/files/uploads/lets-chat.png (Let's Chat) -[14]: https://sdelements.github.io/lets-chat/ -[15]: https://github.com/sdelements/lets-chat -[16]: https://en.wikipedia.org/wiki/Kerberos_(protocol) -[17]: https://opensource.com/sites/default/files/uploads/jitsi_0_0.jpg (Jitsi) -[18]: https://jitsi.org/ -[19]: https://jitsi.org/projects/ -[20]: https://github.com/jitsi -[21]: http://meet.jit.si diff --git a/sources/tech/20200424 16 Things to do After Installing Ubuntu 20.04.md b/sources/tech/20200424 16 Things to do After Installing Ubuntu 20.04.md deleted file mode 100644 index cca31a0426..0000000000 --- a/sources/tech/20200424 16 Things to do After Installing Ubuntu 20.04.md +++ /dev/null @@ -1,283 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (16 Things to do After Installing Ubuntu 20.04) -[#]: via: (https://itsfoss.com/things-to-do-after-installing-ubuntu-20-04/) -[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) - -16 Things to do After Installing Ubuntu 20.04 -====== - -_**Here is a list of tweaks and things to do after installing Ubuntu 20.04, to get a smoother and better desktop Linux experience.**_ - -[Ubuntu 20.04 LTS brings plenty of new features][1] and visual changes. If you choose to install Ubuntu 20.04, let me show you a few recommended steps that you can follow to get started with it. - -### 16 Things to do after installing Ubuntu 20.04 LTS “Focal Fossa” - -![][2] - -The steps I am going to mention here are my recommendation. You may ignore a few customization or tweaks if they don’t suit your need and interest. - -Similarly, some steps may seem too simple but essential for someone completely new to Ubuntu. - -A number of suggestions here are suited for the default Ubuntu 20.04 with GNOME desktop. So please check [which Ubuntu version][3] and [which desktop environment][4] you are using. - -Let’s get started with the list of things to do after installing Ubuntu 20.04 LTS codenamed Focal Fossa. - -#### 1\. Get your system ready by updating and enabling additional repos - -The first thing you should do after installing Ubuntu or any other Linux distribution is to update it. Linux works on a local database of available packages. And this cache needs to be synced in order for you to be able to install any software. - -It is very easy to update Ubuntu. You can run the software updater from the menu (press Windows key and search for software updater): - -![Software Updater in Ubuntu 20.04][5] - -You may also use the following command in the terminal to update your system: - -``` -sudo apt update && sudo apt upgrade -``` - -Next, you should make sure that you have [universe and multiverse repositories enabled][6]. You’ll have access to a lot more software with these repositories. I also recommend reading about [Ubuntu repositories][6] to learn the basic concept behind it. - -Search for Software & Updates in the menu: - -![Software & Updates Settings][7] - -Make sure to check the boxes in front of the repositories: - -![Enable additional repositories][8] - -#### 2\. Install media codecs to play MP3, MPEG4 and other media files - -If you want to play media files like MP3, MPEG4, AVI etc, you’ll need to install media codecs. Ubuntu doesn’t install it by default because of copyright issues in various countries. - -As an individual, you can install these media codecs easily [using the Ubuntu Restricted Extra package][9]. This will install media codecs, Adobe Flash player and [Microsoft True Type Fonts in your Ubuntu system][10]. - -You can install it by [clicking this link][11] (it will asked to be open in software center) or use this command: - -``` -sudo apt install ubuntu-restricted-extras -``` - -If you encounter the EULA or the license screen, remember to use the tab key to select between the options and then hit enter to confirm your choice. - -![Press tab to select OK and press enter][12] - -#### 3\. Install software from the software center or the web - -Now that you have set up the repositories and updated the package cache, you should start installing software that you need. - -There are several ways of [installing applications in Ubuntu][13]. The easiest and the official way is to use the Software Center. - -![Ubuntu Software Center][14] - -If you want some recommendation about software, please refer to this extensive [list of Ubuntu applications for different purposes][15]. - -Some software vendors provide .deb files to easily install their application. You may get the deb files from their website. For example, to [install Google Chrome on Ubuntu][16], you can get the deb file from its website and double click on it to start the installation. - -#### 4\. Enjoy gaming with Steam Proton and GameMode - -[Gaming on Linux][17] has come a long way. You are not restricted to a handful of games included by default. You can [install Steam on Ubuntu][18] and enjoy a good number of games. - -[Steam’s new P][19][r][19][oton project][19] enables you to play a number of Windows-only games on Linux. In addition to that, Ubuntu 20.04 comes with [Feral Interactive’s GameMode][20] installed by default. - -The GameMode automatically adjust Linux system performance to give more priority to games than other background processes. - -This means some games that support the GameMode (like [Rise of Tomb Raiders][21]) should have improved performance on Ubuntu. - -#### 5\. Manage auto-updates (for intermediate and experts) - -Recently, Ubuntu has started to automatically download and install security updates that are essential to your system. This is a security feature as a regular user, you should leave it as it is, - -But if you like to do everything on your own and this auto-update is frequently leading you to [“Unable to lock the administration directory” error][22], maybe you can change the auto updates behavior. - -You can opt for the Show immediately so that it notifies you of security updates as soon as they are available instead of automatically installing. - -![Control the auto updates settings][23] - -#### 6\. Control automatic suspend and screenlock for laptops - -If you are using Ubuntu 20.04 on a laptop then you may want to pay attention to a few power and screenlock settings. - -If your laptop is on battery mode, Ubuntu will suspend the system after 20 minutes of inactivity. This is done to save battery power. Personally, I don’t like it and thus I disable it. - -Similarly, if you leave your system for a few minutes, it automatically locks the screen. I don’t like this behavior as well so I prefer disabling it. - -![Power Settings in Ubuntu 20.04][24] - -#### 7\. Enjoy dark mode - -One of the [most talked about features of Ubuntu 20.04][25] is the dark mode. You can enable the dark mode by going into Settings and selecting it under Appearance section. - -![Enable Dark Theme Ubuntu][26] - -You may have to do some [additional tweaking to get full dark mode in Ubuntu 20.04][27]. - -#### 8\. Control desktop icons and launcher - -If you want a minimal looking desktop, you can disable the icons on the desktop. You can also disable the launcher from the left side and the appindicators in the top panel. - -All this can be controlled via the new GNOME Extensions that is already available by default. - -![][28] - -By the way, you can also change the position of the launcher to the bottom or to the right by going to the Settings->Appearance. - -#### 9\. Use emojis (smileys) and special characters or disable it from the search - -Ubuntu provides an easy way to use smiley or the emoticons. There is a dedicated application called Characters installed by default. It basically gives you [Unicode][29] of the emojis. - -Not only emojis, you can use it to get the unicode for French, German, Russian and Latin characters. Clicking on the symbol gives you the opportunity to copy the unicode and when you paste this code, your chosen symbol should be typed. - -![Emoji Ubuntu][30] - -You’ll find these special characters and emoticons appearing in the desktop search as well. You can copy them from the search results as well. - -![Emojis appear in desktop search][31] - -If you don’t want to see them in search results, you should disable their access to the search feature. The next section discuss how to do that. - -#### 10\. Master the desktop search - -The GNOME desktop has a powerful search feature. Most people use it for searching installed applications but it is more than just that. - -Press the super key (Windows key) and search for something. It will show any applications that matches that search term, followed by system settings and matching applications available in the software center. - -![Desktop search][32] - -Not only that, the search can also find text inside files. If you are using the calendar, it can also find your meetings and reminders. You can even do quick calculations in the search and copy its result. - -![Quick Calculations Ubuntu Search][33] - -You can control what can be searched and in which order by going into Settings. - -![][34] - -#### 11\. Use nightlight feature to reduce eye strain at night - -If you use your computer or smartphone at night, you should use the night light feature to reduce eye strain. I feel that it helps a lot. - -The night light feature adds a yellow tint to the screen which is less pinching than the white light. - -You can enable night light in the Settings -> Displays and switching to Night Light tab. You can set the ‘yellowness’ as per your liking. - -![Nightlight feature][35] - -#### 12\. Got a 2K/4K screen? Use fractional scaling to get bigger icons and fonts - -If you feel that the icons, fonts, folders everything looks too small on your HiDPI screen, you can take advantage of the fractional scaling. - -Enabling fractional scaling gives you more options to increase the size between 100% to 200%. You can choose the scaling size that suits your preference. - -![Enable fractional scaling from Settings -> Displays][36] - -#### 13\. Explore GNOME Extensions to extend the usability of GNOME desktop - -The GNOME desktop has tiny plugins or add-ons called Extensions. You should [learn to use GNOME extensions][37] to extend the usability of your system. - -As you can see in the image below, the weather extension shows the weather information in the top panel. A tiny but useful thing. You may also take a look at some of [best GNOME extensions][38] here. Don’t install all of them, use only those that are useful to you. - -![Weather Extension][39] - -#### 14\. Enable ‘do not disturb’ mode and focus on work - -If you want to concentrate on work, disabling desktop notifications would come handy. You can easily enable ‘do not disturb’ mode and mute all notifications. - -![Enable ‘Do Not Disturb’ to get rid of desktop notifications][40] - -These notifications will still be in the message tray so that you can read them later but they won’t pop up on the desktop anymore. - -#### 15\. Clean your system - -This is something you don’t need to do right after installing Ubuntu. But keeping it in mind will help you. - -Over the time, your system will have significant amount of packages that won’t be needed anymore. You can remove them all in one go with this command: - -``` -sudo apt autoremove -``` - -There are other [ways to clean Ubuntu to free disk space][41] but this is the easiest and safest. - -#### 16\. Tweak and customize the GNOME desktop to your liking - -I highly recommend [installing GNOME Tweaks tool][42]. This will give you access to a few additional settings to tweak. - -![Gnome Tweaks Tool][43] - -For example, you can [display battery percentage][44], [fix right click in touchpad issue][45], change shell theme, change mouse pointer speed, display date and week numbers, change application window behavior etc. - -There is no end to customization and I cannot probably most of them here. This is why I recommend [reading these articles][42] about [customizing GNOME desktop][46]. - -You can also [install new themes in Ubuntu][47] though personally, I like the default theme in this release. This is the first time that I have stuck with the default icons and theme in an Ubuntu release. - -#### What do you do after installing Ubuntu? - -If you are an Ubuntu beginner, I recommend [going through this collection of Ubuntu tutorials][48] to get started with it. - -So these were my recommendations. What are the steps you follow after installing Ubuntu? Share your favorite things and I might update this article with your suggestions. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/things-to-do-after-installing-ubuntu-20-04/ - -作者:[Abhishek Prakash][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [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-20-04-release-features/ -[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/things-to-do-after-installing-ubuntu-20-04.jpg?ssl=1 -[3]: https://itsfoss.com/how-to-know-ubuntu-unity-version/ -[4]: https://itsfoss.com/find-desktop-environment/ -[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-updater-ubuntu-20-04.jpg?ssl=1 -[6]: https://itsfoss.com/ubuntu-repositories/ -[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-updates-settings-ubuntu-20-04.jpg?ssl=1 -[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/extra-repositories-ubuntu-20.jpg?ssl=1 -[9]: https://itsfoss.com/install-media-codecs-ubuntu/ -[10]: https://itsfoss.com/install-microsoft-fonts-ubuntu/ -[11]: https://ubuntu-restricted-extras/ -[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/installing_ubuntu_restricted_extras.jpg?ssl=1 -[13]: https://itsfoss.com/remove-install-software-ubuntu/ -[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-center-ubuntu-20.png?resize=800%2C509&ssl=1 -[15]: https://itsfoss.com/best-ubuntu-apps/ -[16]: https://itsfoss.com/install-chrome-ubuntu/ -[17]: https://itsfoss.com/linux-gaming-guide/ -[18]: https://itsfoss.com/install-steam-ubuntu-linux/ -[19]: https://itsfoss.com/steam-play/ -[20]: https://github.com/FeralInteractive/gamemode -[21]: https://en.wikipedia.org/wiki/Rise_of_the_Tomb_Raider -[22]: https://itsfoss.com/could-not-get-lock-error/ -[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/auto-updates-ubuntu.png?resize=800%2C361&ssl=1 -[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/power-settings-ubuntu-20-04.png?fit=800%2C591&ssl=1 -[25]: https://www.youtube.com/watch?v=lpq8pm_xkSE -[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/enable-dark-theme-ubuntu.png?ssl=1 -[27]: https://itsfoss.com/dark-mode-ubuntu/ -[28]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/disable-dock-ubuntu-20-04.png?ssl=1 -[29]: https://en.wikipedia.org/wiki/List_of_Unicode_characters -[30]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/emoji-ubuntu.jpg?ssl=1 -[31]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/emojis-desktop-search-ubuntu.jpg?ssl=1 -[32]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/ubuntu-desktop-search-1.jpg?ssl=1 -[33]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/quick-calculations-ubuntu-search.jpg?ssl=1 -[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/search-settings-control-ubuntu.png?resize=800%2C534&ssl=1 -[35]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/nightlight-ubuntu-20-04.png?ssl=1 -[36]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/fractional-scaling-ubuntu.jpg?ssl=1 -[37]: https://itsfoss.com/gnome-shell-extensions/ -[38]: https://itsfoss.com/best-gnome-extensions/ -[39]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/weather-extension-ubuntu.jpg?ssl=1 -[40]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/do-not-distrub-option-ubuntu-20-04.png?ssl=1 -[41]: https://itsfoss.com/free-up-space-ubuntu-linux/ -[42]: https://itsfoss.com/gnome-tweak-tool/ -[43]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/gnome-tweaks-tool-ubuntu-20-04.png?fit=800%2C551&ssl=1 -[44]: https://itsfoss.com/display-battery-ubuntu/ -[45]: https://itsfoss.com/fix-right-click-touchpad-ubuntu/ -[46]: https://itsfoss.com/gnome-tricks-ubuntu/ -[47]: https://itsfoss.com/install-themes-ubuntu/ -[48]: https://itsfoss.com/getting-started-with-ubuntu/ diff --git a/sources/tech/20200424 What you need to know about open source ad blockers.md b/sources/tech/20200424 What you need to know about open source ad blockers.md deleted file mode 100644 index c3fb98def0..0000000000 --- a/sources/tech/20200424 What you need to know about open source ad blockers.md +++ /dev/null @@ -1,55 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What you need to know about open source ad blockers) -[#]: via: (https://opensource.com/article/20/4/ad-blockers) -[#]: author: (Joshua Pearce https://opensource.com/users/jmpearce) - -What you need to know about open source ad blockers -====== -Three open source ad blockers were tested against a "no ad blocker" -control. -![Browser of things][1] - -A new [study][2] meant to investigate energy conservation of free and open source ad blockers has unexpectedly shown that Internet ads are wasting shocking amounts of your time. - -More importantly, the results show how you can get that time back. The study estimates that the average Internet user would save over 100 hours a year by using [uBlock Origi][3][n][3][,][3] a free and open source ad blocker. uBlock Origin was the most effective ad blocker tested, but all ad blockers save time, energy and money according to the study. - -![Ad blocker screen comparison][4] - -The results show that page load time dropped 11% with [AdBlock+][5], 22% with [Privacy Badger][6], and 28% with [uBlock Origi][3][n][3]. These are not significant on a single page, but Internet users spend more than half of their time online rapidly clicking through websites, spending less than 15 seconds on a given page. With all these clicks, the additional time to load ads really starts to add up. - -The article _[Energy Conservation with Open Source Ad Blockers][7]_, published in the journal _Technologies,_ was originally conceived to address rising energy consumption. Internet-related electricity consumption is rising rapidly as global Internet users spend more than 6.5 hours per day online. Americans, for example, have more than doubled the time they spend online since 2000 to almost 24 hours a week. Open source ad blockers have the potential to reduce the time, and thus the electricity, spent by eliminating ads during Internet browsing and video streaming. - -In the study, three open source ad blockers were tested against a "no ad blocker" control. Page load times were recorded for browsing a representative selection of the most-accessed websites worldwide, including web searching (Google, Yahoo, Bing), information (Weather.com, Wikipedia), and news sites (CNN, Fox, New York Times). In addition, the study analyzed the time spent watching ads on videos for both trending and non-trending content. This part of the study was more challenging due to the lack of data on the ratio of YouTube watching time spent on trending vs. non-trending content. The time wasted viewing ads per video ranged from 0.06% up to a staggering 21%. Thus, the total hours lost to loading ads was only recorded for browsing. - -Overall, the results showed that the energy wasted loading ads is not trivial. As a lot of the electricity used for running computers continues to come from coal, which causes air pollution and premature death, the study analyzed the potential for ad blockers to save American lives. The results were shocking: the energy conserved if everyone in the United States used the open source ad blocker would save over 36 American lives per year. - -Electricity costs money, so cutting ads could also save consumers money. In the United States, if all Internet users enabled Privacy Badger on their computers, Americans would save more than $91 million annually. Globally, the results of the investigation were even more striking. uBlock Origin could save global consumers more than $1.8 billion a year. - -This study was done before everyone was forced to stay home because of the COVID-19 pandemic, so all the values can be viewed as conservative underestimates. Overall, the study found open source ad blockers are a potentially effective technology for energy conservation. - -Although free and open source ad blockers save energy and are good for the environment, you are probably going to use them primarily to block annoying ads and save yourself time. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/20/4/ad-blockers - -作者:[Joshua Pearce][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/jmpearce -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_desktop_website_checklist_metrics.png?itok=OKKbl1UR (Browser of things) -[2]: https://www.mdpi.com/2227-7080/8/2/18 -[3]: https://github.com/gorhill/uBlock -[4]: https://opensource.com/sites/default/files/uploads/os_ad_blocker_story_.png (Ad blocker screen comparison) -[5]: https://adblockplus.org/ -[6]: https://privacybadger.org/ -[7]: https://www.academia.edu/42434401/Energy_Conservation_with_Open_Source_Ad_Blockers diff --git a/sources/tech/20200425 What Happened to IPv5- Why there is IPv4, IPv6 but no IPv5.md b/sources/tech/20200425 What Happened to IPv5- Why there is IPv4, IPv6 but no IPv5.md deleted file mode 100644 index ac820a3369..0000000000 --- a/sources/tech/20200425 What Happened to IPv5- Why there is IPv4, IPv6 but no IPv5.md +++ /dev/null @@ -1,76 +0,0 @@ -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (What Happened to IPv5? Why there is IPv4, IPv6 but no IPv5?) -[#]: via: (https://itsfoss.com/what-happened-to-ipv5/) -[#]: author: (John Paul https://itsfoss.com/author/john/) - -What Happened to IPv5? Why there is IPv4, IPv6 but no IPv5? -====== - -If you have spent any amount of time in the world of the internet, you should have heard about the IPv4 and IPv6 protocols that our computers use every day. - -One question that you might be asking is: Why there is no IPv5? Why IPv6 came after IPv4 and not IPv5? Was there ever a IPv5 and if yes, whatever happened to IPv5? - -The answer is yes, there was an IPv5…sort of. Let me quickly explain a few things around it. - -### The early history of the internet - -![ARPA Logical Map in 1977 | Image courtesy: Wikipedia][1] - -In the late 1960s, the US Department of Defense’s [Advanced Research Projects Agency][2] (ARPA) started a [project][3] to link computers across the country. The initial goal was to create a networked system of all of the ARPA-funded computers across the country. - -Since this was the first time a network of this scale was put together, they were also creating the technology and hardware as they went. One of the first things they worked was an internet protocol (IP) named [Transmission Control Protocol][4] (TCP). This protocol “reliable, ordered, and error-checked delivery of a stream of octets (bytes) between applications running on hosts communicating via an IP network”. Basically, it made sure data got where it needed to go safely. - -Originally, TCP was designed to be [“a host-level, end-to-end protocol and a packaging and routing protocol”][5]. However, they realized that they needed to split the protocol to make it more manageable. It was decided that IP would handle packaging and routing. - -By this time TCP had gone through three versions, so the new protocol became known as IPv4. - -### The birth of IPv5 - -IPv5 started life under a different name: Internet Stream Protocol (or ST). It was created to experiment with streaming voice and video [“by Apple, NeXT, and Sun Microsystems”][6]. - -This new protocol was capable of “transferring data packets on specific frequencies while maintaining communication”. - -### So what happened to IPv5? - -![][7] - -IPv5 was never accepted as an official internet protocol. This was mainly due to the 32-bit limitation. - -IPV5 used the same addressing system as IPv4. Each address was made up of four sets of numbers between 0 and 255. This limited the number of possible addresses to [4.3 billion][6]. - -In the early 1970s, that might have seemed like more than the world would ever need. However, the explosive growth of the Internet proved that idea wrong. In 2011, the world officially ran out of the IPv4 addresses. - -In the 1990s, a new project was started to work on the next generation of internet protocol (IPng). This led to the 128-bit IPv6. An IPv6 address contains a [“series of eight 4-character hexadecimal numbers”][6] that can contain numbers from 0 to 9 and letters from A to F. Unlike IPv4, IPv6 had trillions of possible addresses, so we should be safe for a while. - -Meanwhile, IPv5 laid the groundwork for the voice-over-IP technology that we use to communicate all over the world today. **So, I guess in some small way, you could say that IPv5 still survives to this day**. - -I hope you liked this anecdote about internet history. You may read some other [trivia article about Linux and tech in general][8]. - -If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][9]. - --------------------------------------------------------------------------------- - -via: https://itsfoss.com/what-happened-to-ipv5/ - -作者:[John Paul][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://itsfoss.com/author/john/ -[b]: https://github.com/lujun9972 -[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/Arpa_internet.png?fit=800%2C573&ssl=1 -[2]: https://en.wikipedia.org/wiki/DARPA -[3]: https://en.wikipedia.org/wiki/ARPANET -[4]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol -[5]: https://fcw.com/articles/2006/07/31/what-ever-happened-to-ipv5.aspx -[6]: https://www.lifewire.com/what-happened-to-ipv5-3971327 -[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/what-happened-to-ipv5.png?ssl=1 -[8]: https://itsfoss.com/category/story/ -[9]: https://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20200426 6 tips for securing your WordPress website.md b/sources/tech/20200426 6 tips for securing your WordPress website.md new file mode 100644 index 0000000000..757ff42d30 --- /dev/null +++ b/sources/tech/20200426 6 tips for securing your WordPress website.md @@ -0,0 +1,175 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (6 tips for securing your WordPress website) +[#]: via: (https://opensource.com/article/20/4/wordpress-security) +[#]: author: (Lucy Carney https://opensource.com/users/lucy-carney) + +6 tips for securing your WordPress website +====== +Even beginners can—and should—take these steps to protect their +WordPress sites against cyberattacks. +![A lock on the side of a building][1] + +Already powering over 30% of the internet, WordPress is the fastest-growing content management system (CMS) in the world—and it's not hard to see why. With tons of customization available through coding and plugins, top-notch SEO, and a supreme reputation for blogging, WordPress has certainly earned its popularity. + +However, with popularity comes other, less appealing attention. WordPress is a common target for intruders, malware, and cyberattacks—in fact, WordPress accounted for around [90% of hacked CMS platforms][2] in 2019. + +Whether you're a first-time WordPress user or an experienced developer, there are important steps you can take to protect your WordPress website. The following six key tips will get you started. + +### 1\. Choose reliable hosting + +Hosting is the unseen foundation of all websites—without it, you can't publish your site online. But hosting does much more than simply host your site. It's also responsible for site speed, performance, and security. + +The first thing to do is to check if a host includes SSL security in its plans. + +SSL is an essential security feature for all websites, whether you're running a small blog or a large online store. You'll need a more [advanced SSL certificate][3] if you're accepting payments, but for most sites, the basic free SSL should be fine. + +Other security features to look out for include: + + * Frequent, automatic offsite backups + * Malware and antivirus scanning and removal + * Distributed denial of service (DDoS) protection + * Real-time network monitoring + * Advanced firewall protection + + + +In addition to these digital security features, it's worth thinking about your hosting provider's _physical_ security measures as well. These include limiting access to data centers with security guards, CCTV, and two-factor or biometric authentication. + +### 2\. Use security plugins + +One of the best—and easiest—ways of protecting your website's security is to install a security plugin, such as [Sucuri][4], which is an open source, GPLv2 licensed project. Security plugins are vitally important because they automate security, which means you can focus on running your site rather than committing all your time to fighting off online threats. + +These plugins detect and block malicious attacks and alert you about any issues that require your attention. In short, they constantly work in the background to protect your site, meaning you don't have to stay awake 24/7 to fight off hackers, bugs, and other digital nasties. + +A good security plugin will provide all the essential security features you need for free, but some advanced features require a paid subscription. For example, you'll need to pay if you want to unlock [Sucuri's website firewall][5]. Enabling a web application firewall (WAF) blocks common threats and adds an extra layer of security to your site, so it's a good idea to look for this feature when choosing a security plugin. + +### 3\. Choose trustworthy plugins and themes + +The joy of WordPress is that it is open source, so anyone and everyone can pitch in with themes and plugins that they've developed. This can also pose problems when it comes to picking a high-quality theme or plugin. + +It serves to be cautious when picking a free theme or plugin, as some are poorly designed—or worse, may hide malicious code. + +To avoid this, always source free themes and plugins from reputable sources, such as the WordPress library. Always read reviews and research the developer to see if they've built any other programs. + +Outdated or poorly designed themes and plugins can leave "backdoors" open for attackers or bugs to get into your site, which is why it pays to be careful in your choices. However, you should also be wary of nulled or cracked themes. These are premium themes that have been compromised by hackers and are for sale illegally. You might buy a nulled theme believing that it's all above-board—only to have your site damaged by hidden malicious code. + +To avoid nulled themes, don't get drawn in by discounted prices, and always stick to reputable stores, such as the official [WordPress directory][6]. If you're looking elsewhere, stick to large and trusted stores, such as [Themify][7], a theme and plugin store that has been running since 2010. Themify ensures all its WordPress themes pass the [Google Mobile-Friendly][8] test and are open source under the [GNU General Public License][9]. + +### 4\. Run regular updates + +It's a fundamental WordPress rule: _always keep your site up to date._ However, it's a rule not everyone sticks to—in fact, only [43% of WordPress sites][10] are running the latest version. + +The problem is that when your site becomes outdated, it becomes susceptible to glitches, bugs, intrusions, and crashes because it falls behind on security and performance fixes. Outdated sites can't fix bugs the same way as updated sites can, and attackers can tell which sites are outdated. This means they can search for the most vulnerable sites and attack accordingly. + +This is why you should always run your site on the latest version of WordPress. And in order to keep your security at its strongest, you must update your plugins and themes as well as your core WordPress software. + +If you choose a managed WordPress hosting plan, you might find that your provider will check and run updates for you—be clear whether your host offers software _and_ plugin updates. If not, you can install an open source plugin manager, such as the GPLv2-licensed [Easy Updates Manager plugin][11], as an alternative. + +### 5\. Strengthen your logins + +Aside from creating a secure WordPress website through carefully choosing your theme and installing security plugins, you also need to safeguard against unauthorized access through logins. + +#### Password protection + +The first and simplest way to strengthen your login security is to change your password—especially if you're using an [easily guessed phrase][12] such as "123456" or "qwerty." + +Instead, try to use a long passphrase rather than a password, as they are harder to crack. The best way is to use a series of unrelated words strung together that you find easy to remember. + +Here are some other tips: + + * Never reuse passwords + * Don't include obvious words such as family members' names or your favorite football team + * Never share your login details with anyone + * Include capitals and numbers to add complexity to your passphrase + * Don't write down or store your login details anywhere + * Use a [password manager][13] + + + +#### Change your login URL + +It's a good idea to change your default login web address from the standard format: yourdomain.com/wp-admin. This is because hackers know this is the default URL, so you risk brute-force attacks by not changing it. + +To avoid this, change the URL to something different. Use an open source plugin such as the GPLv2-licensed [WPS Hide Login][14] for safe, quick, and easy customization. + +#### Apply two-factor authentication + +For extra protection against unauthorized logins and brute-force attacks, you should add two-factor authentication. This means that even if someone _does_ get access to your login details, they'll need a code that's sent directly to your phone to gain access to your WordPress site's admin. + +Adding two-factor authentication is pretty easy. Simply install yet another plugin—this time, search the WordPress Plugin Directory for "two-factor authentication," and select the plugin you want. One option is [Two Factor][15], a popular GPLv2 licensed project that has over 10,000 active installations. + +#### Limit login attempts + +WordPress tries to be helpful by letting you guess your login details as many times as you like. However, this is also helpful to hackers trying to gain unauthorized access to your WordPress site to release malicious code. + +To combat brute-force attacks, install a plugin that limits login attempts and set how many guesses you want to allow. + +### 6\. Disable file editing + +This isn't such a beginner-friendly step, so don't attempt it unless you're a confident coder—and always back up your site first! + +That said, disabling file editing _is_ an important measure if you're really serious about protecting your WordPress website. If you don't hide your files, it means anyone can edit your theme and plugin code straight from the admin area—which is dangerous if an intruder gets in. + +To deny unauthorized access, go to your **wp-config.php** file and enter: + + +``` +<Files wp-config.php> +order allow,deny +deny from all +</Files> +``` + +Or, to remove the theme and plugin editing options from your WordPress admin area completely, edit your **wp-config.php** file by adding: + + +``` +`define( 'DISALLOW_FILE_EDIT', true );` +``` + +Once you've saved and reloaded the file, the plugin and theme editors will disappear from your menus within the WordPress admin area, stopping anyone from editing your theme or plugin code—including you**.** Should you need to restore access to your theme and plugin code, just delete the code you added to your **wp-config.php** file when you disabled editing. + +Whether you block unauthorized access or totally disable file editing, it's important to take action to protect your site's code. Otherwise, it's easy for unwelcome visitors to edit your files and add new code. This means an attacker could use the editor to gather data from your WordPress site or even use your site to launch attacks on others. + +For an easier way of hiding your files, you can use a security plugin that will do it for you, such as Sucuri. + +### WordPress security recap + +WordPress is an excellent open source platform that should be enjoyed by beginners and developers alike without the fear of becoming a victim of an attack. Sadly, these threats aren't going anywhere anytime soon, so it's vital to stay on top of your site's security. + +Using the measures outlined above, you can create a stronger, more secure level of protection for your WordPress site and ensure a much more enjoyable experience for yourself. + +Staying secure is an ongoing commitment rather than a one-time checklist, so be sure to revisit these steps regularly and stay alert when building and using your CMS. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/wordpress-security + +作者:[Lucy Carney][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/lucy-carney +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_3reasons.png?itok=k6F3-BqA (A lock on the side of a building) +[2]: https://cyberforces.com/en/wordpress-most-hacked-cms +[3]: https://opensource.com/article/19/11/internet-security-tls-ssl-certificate-authority +[4]: https://wordpress.org/plugins/sucuri-scanner/ +[5]: https://sucuri.net/website-firewall/ +[6]: https://wordpress.org/themes/ +[7]: https://themify.me/ +[8]: https://developers.google.com/search/mobile-sites/ +[9]: http://www.gnu.org/licenses/gpl.html +[10]: https://wordpress.org/about/stats/ +[11]: https://wordpress.org/plugins/stops-core-theme-and-plugin-updates/ +[12]: https://www.forbes.com/sites/kateoflahertyuk/2019/04/21/these-are-the-worlds-most-hacked-passwords-is-yours-on-the-list/#4f157c2f289c +[13]: https://opensource.com/article/16/12/password-managers +[14]: https://wordpress.org/plugins/wps-hide-login/ +[15]: https://en-gb.wordpress.org/plugins/two-factor/ diff --git a/sources/tech/20200427 New zine- How Containers Work.md b/sources/tech/20200427 New zine- How Containers Work.md new file mode 100644 index 0000000000..fa2198ebbc --- /dev/null +++ b/sources/tech/20200427 New zine- How Containers Work.md @@ -0,0 +1,121 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (New zine: How Containers Work!) +[#]: via: (https://jvns.ca/blog/2020/04/27/new-zine-how-containers-work/) +[#]: author: (Julia Evans https://jvns.ca/) + +New zine: How Containers Work! +====== + +On Friday I published a new zine: “How Containers Work!”. I also launched a fun redesign of [wizardzines.com][1]. + +You can get it for $12 at . If you buy it, you’ll get a PDF that you can either print out or read on your computer. Or you can get a pack of [all 8 zines][2] so far. + +Here’s the cover and table of contents: + +[![][3]][4] + +### why containers? + +I’ve spent a lot of time [figuring][5] [out][6] [how to][7] [run][8] [things][9] [in][10] [containers][11] over the last 3-4 years. And at the beginning I was really confused! I knew a bunch of things about Linux, and containers didn’t seem to fit in with anything I thought I knew (“is it a process? what’s a network namespace? what’s happening?“). The whole thing seemed really weird. + +It turns out that containers ARE actually pretty weird. They’re not just one thing, they’re what you get when you glue together 6 different features that were mostly designed to work together but have a bunch of confusing edge cases. + +As usual, the thing that helped me the most in my container adventures is a good understanding of the **fundamentals** – what exactly is actually happening on my server when I run a container? + +So that’s what this zine is about – cgroups, namespaces, pivot_root, seccomp-bpf, and all the other Linux kernel features that make containers work. + +Once I understood those ideas, it got a **lot** easier to debug when my containers were doing surprising things in production. I learned a couple of interesting and strange things about containers while writing this zine too – I’ll probably write a blog post about one of them later this week. + +### containers aren’t magic + +This picture (page 6 of the zine) shows you how to run a fish container image with only 15 lines of bash. This is heavily inspired by [bocker][12], which “implements” Docker in about 100 lines of bash. + + + +The main things I see missing from that script compared to what Docker actually does when running a container (other than using an actual container image and not just a tarball) are: + + * it doesn’t drop any capabilities – the container is still running as root and has full root privileges (just in a different mount + PID namespace) + * it doesn’t block any system calls with seccomp-bpf + + + +### container command line tools + +The zine also goes over a bunch of command line tools & files that you can use to inspect running containers or play with Linux container features. Here’s a list: + + * `mount -t overlay` (create and view overlay filesystems) + * `unshare` (create namespaces) + * `nsenter` (use an existing namespace) + * `getpcaps` (get a process’s capabilities) + * `capsh` (drop or add capabilities, etc) + * `cgcreate` (create a cgroup) + * `cgexec` (run a command in an existing cgroup) + * `chroot` (change root directory. not actually what containers use but interesting to play with anyway) + * `/sys/fs/cgroups` (for information about cgroups, like `memory.usage_in_bytes`) + * `/proc/PID/ns` (all a process’s namespaces) + * `lsns` (another way to view namespaces) + + + +I also made a short youtube video a while back called [ways to spy on a Docker container][13] that demos some of these command line tools. + +### container runtime agnostic + +I tried to keep this zine pretty container-runtime-agnostic – I mention Docker a couple of times because it’s so widely used, but it’s about the Linux kernel features that make containers work in general, not Docker or LXC or systemd-nspawn or Kubernetes or whatever. If you understand the fundamentals you can figure all those things out! + +### we redesigned wizardzines.com! + +On Friday I also launched a redesign of [wizardzines.com][1]! [Melody Starling][14] (who is amazing) did the design. I think now it’s better organized but the tiny touch that I’m most delighted by is that now the zines jump with joy when you hover over them. + +One cool thing about working with a designer is – they don’t just make things _look_ better, they help _organize_ the information better so the website makes more sense and it’s easier to find things! This is probably obvious to anyone who knows anything about design but I haven’t worked with designers very much (or maybe ever?) so it was really cool to see. + +One tiny example of this: Melody had the idea of adding a tiny FAQ on the landing page for each zine, where I can put the answers to all the questions people always ask! Here’s what the little FAQ box looks like: + +[![][15]][4] + +I probably want to edit those questions & answers over time but it’s SO NICE to have somewhere to put them. + +### what’s next: maybe debugging! or working more on flashcards! + +The two projects I’m thinking about the most right now are + + 1. a zine about debugging, which I started last summer and haven’t gotten around to finishing yet + 2. a [flashcards project][16] that I’ve been adding to slowly over the last couple of months. I think could become a nice way to explain basic ideas. + + + +Here’s a link to where to [get the zine][4] again :) + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/04/27/new-zine-how-containers-work/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://wizardzines.com +[2]: https://wizardzines.com/zines/all-the-zines/ +[3]: https://jvns.ca/images/containers-cover.jpg +[4]: https://wizardzines.com/zines/containers +[5]: https://stripe.com/en-ca/blog/operating-kubernetes +[6]: https://jvns.ca/blog/2016/09/15/whats-up-with-containers-docker-and-rkt/ +[7]: https://jvns.ca/blog/2016/10/10/what-even-is-a-container/ +[8]: https://jvns.ca/blog/2016/12/22/container-networking/ +[9]: https://jvns.ca/blog/2016/10/26/running-container-without-docker/ +[10]: https://jvns.ca/blog/2017/02/17/mystery-swap/ +[11]: https://jvns.ca/blog/2016/10/02/a-list-of-container-software/ +[12]: https://github.com/p8952/bocker +[13]: https://www.youtube.com/watch?v=YCVSdnYzH34&t=1s +[14]: https://melody.dev +[15]: https://jvns.ca/images/wizardzines-faq.png +[16]: https://flashcards.wizardzines.com diff --git a/sources/tech/20200428 Learn Bash with this book of puzzles.md b/sources/tech/20200428 Learn Bash with this book of puzzles.md new file mode 100644 index 0000000000..08a07b93c5 --- /dev/null +++ b/sources/tech/20200428 Learn Bash with this book of puzzles.md @@ -0,0 +1,60 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Learn Bash with this book of puzzles) +[#]: via: (https://opensource.com/article/20/4/bash-it-out-book) +[#]: author: (Carlos Aguayo https://opensource.com/users/hwmaster1) + +Learn Bash with this book of puzzles +====== +'Bash it out' covers basic, medium, and advanced Bash scripting using 16 +puzzles. +![Puzzle pieces coming together to form a computer screen][1] + +Computers are both my hobby and my profession. I have about 10 of them scattered around my apartment, all running Linux (including my Macs). Since I enjoy upgrading my computers and my computer skills, when I came across [_Bash it out_][2] by Sylvain Leroux, I jumped on the chance to buy it. I use the command line a lot on Debian Linux, and it seemed like a great opportunity to expand my Bash knowledge. I smiled when the author explained in the preface that he uses Debian Linux, which is one of my two favorite distributions. + +Bash lets you automate tasks, so it's a labor-saving, interesting, and useful tool. Before reading the book, I already had a fair amount of experience with Bash on Unix and Linux. I'm not an expert, in part because the scripting language is so extensive and powerful. I first became intrigued with Bash when I saw it on the welcome screen of [EndeavourOS][3], an Arch-based Linux distribution. + +The following screenshots show some options from EndeavourOS. Beleieve it or not, these panels just point to Bash scripts, each of which accomplish some relatively complex tasks. And because it's all open source, I can modify any of these scripts if I want. + +![EndeavourOS after install][4] + +![EndeavourOS install apps][5] + +### Always something to learn + +My impressions of this book are very favorable. It's not long, but it is well-thought-out. The author has very extensive knowledge of Bash and an uncanny ability to explain how to use it. The book covers basic, medium, and advanced Bash scripting using 16 puzzles, which he calls "challenges." This taught me to see Bash scripting as a programming puzzle to solve, which makes it more interesting to play with. + +An exciting aspect of Bash is that it's deeply integrated with the Linux system. While part of its power lies in its syntax, it's also powerful because it has access to so much. You can script repetitive tasks, or tasks that are easy but you're just tired of performing manually. Nothing is too great or too small, and _Bash it out_ helps you understand both what you can do, and how to achieve it. + +This review would not be complete if I didn't mention David Both's free resource [_A sysadmin's guide to Bash scripting_][6] on Opensource.com. This 17-page PDF guide is different from _Bash it out_, but together they make a winning combination for anyone who wants to learn about it. + +I am not a computer programmer, but _Bash it out_ has increased my desire to get into more advanced levels of Bash scripting—I might inadvertently end up as a computer programmer without planning to. + +One reason I love Linux is because of how powerful and versatile the operating system is. However much I know about Linux, there is always something new to learn that makes me appreciate Linux even more. + +In a competitive and ever-changing job market, it behooves all of us to continuously update our skills. This book helped me learn Bash in a very hands-on way. It almost felt as if the author was in the same room with me, patiently guiding me in my learning. + +The author, Leroux, has an uncanny ability to engage readers. This is a rare gift that I think is even more valuable than his technical expertise. In fact, I am writing this book review to thank the author for anticipating my own learning needs; although we have never met, I have benefited in real ways from his gifts. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/bash-it-out-book + +作者:[Carlos Aguayo][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hwmaster1 +[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://www.amazon.com/Bash-Out-Strengthen-challenges-difficulties/dp/1521773262/ +[3]: https://endeavouros.com/ +[4]: https://opensource.com/sites/default/files/uploads/endeavouros-welcome.png (EndeavourOS after install) +[5]: https://opensource.com/sites/default/files/uploads/endeavouros-install-apps.png (EndeavourOS install apps) +[6]: https://opensource.com/downloads/bash-scripting-ebook diff --git a/sources/tech/20200429 Open source live streaming with Open Broadcaster Software.md b/sources/tech/20200429 Open source live streaming with Open Broadcaster Software.md new file mode 100644 index 0000000000..748786de77 --- /dev/null +++ b/sources/tech/20200429 Open source live streaming with Open Broadcaster Software.md @@ -0,0 +1,137 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Open source live streaming with Open Broadcaster Software) +[#]: via: (https://opensource.com/article/20/4/open-source-live-stream) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Open source live streaming with Open Broadcaster Software +====== +If you have something to say, a skill to teach, or just something fun to +share, broadcast it to the world with OBS. +![An old-fashioned video camera][1] + +If you have a talent you want to share with the world, whether it's making your favorite sourdough bread or speedrunning through a level of your favorite video game, live streaming is the modern show-and-tell. It's a powerful way to tell the world about your hobby through a medium once reserved for exclusive and expensive TV studios. Not only is the medium available to anyone with a relatively good internet connection, but the most popular software to make it happen is open source. + +[OBS][2] (Open Broadcaster Software) is a cross-platform application that serves as a control center for your live stream. A _stream_, strictly speaking, means _progressive and coherent data_. The data in a stream can be audio, video, graphics, text, or anything else you can represent as digital data. OBS is programmed to accept data as input, combine streams together (technically referred to as _mixing_) into one product, and then broadcast it. + +![OBS flowchart][3] + +A _broadcast_ is data that can be received by some target. If you're live streaming, your primary target is a streaming service that can host your stream, so other people can find it in a web browser or media player. A live stream is a live event, so people have to "tune in" to your stream when it's happening, or else they miss it. However, you can also target your own hard drive so you can record a presentation and then post it on the internet later for people to watch at their leisure. + +### Installing OBS + +To install OBS on Windows or macOS, download an installer package from [OBS's website][2]. + +To install OBS on Linux, either install it with your package manager (such as **dnf**, **zypper**, or **apt**) or [install it as a Flatpak][4]. + +### Join a streaming service + +In order to live stream, you must have a stream broker. That is, you need a central location on the internet for your stream to be delivered, so your viewers can get to what you're broadcasting. There are a few popular streaming services online, like YouTube and Twitch. You can also [set up your own video streaming server][5] using open source software. + +Regardless of which option you choose, before you begin streaming, you must have a destination for your stream. If you do use a streaming service, you must obtain a _streaming key_. A streaming key is a hash value (it usually looks something like **2ae2fad4e33c3a89c21**) that is private and unique to you. You use this key to authenticate yourself through your streaming software. Without it, the streaming service can't know you are who you say you are and won't let you broadcast over your user account. + +* * * + +* * * + +* * * + +**![Streaming key][6]** + + * In Twitch, your **Primary Stream Key** is available in the **Channel** panel of your **Creator Dashboard**. + * On YouTube, you must enable live streaming by verifying your account. Once you've done that, your **Stream Key** is in the **Other Features** menu option of your **Channel Dashboard**. + * If you're using your own server, there's no maze-like GUI to navigate. You just [create your own streaming key][7]. + + + +### Enter your streaming key + +Once you have a streaming key, launch OBS and go to the **File** > **Settings** menu. + +In the **Settings** window, click on the **Stream** category in the left column. Set the **Service** to your stream service (Custom, Twitch, YouTube, etc.), and enter your stream key. Click the **OK** button in the bottom right to save your changes. + +### Create sources + +In OBS, _sources_ represent any input signal you want to stream. By default, sources are listed at the bottom of the OBS window. + +![OBS sources][8] + +This might be a webcam, a microphone, an audio stream (such as the sound of a video game you're playing), a screen capture of your computer (a "screencast"), a slideshow you want to present, an image, and so on. Before you start streaming, you should define all the sources you plan on using for your stream. This means you have to do a little pre-production and consider what you anticipate for your show. Any camera you have set up must be defined as a source in OBS. Any extra media you plan on cutting to during your show must be defined as a source. Any sound effects or background music must be defined as a source. + +Not all sources "happen" at once. By adding media to your **Sources** panel in OBS, you're just assembling the raw components for your stream. Once you make devices and data available to OBS, you can create your **Scenes**. + +#### Setting up audio + +Computers have seemingly dozens of ways to route audio. Here's the workflow to follow when setting up sound for your stream: + + 1. Check your cables: verify that your microphone is plugged in. + 2. Go to your computer's sound control panel and set the input to whatever microphone you want OBS to treat as the main microphone. This might be a gaming headset or a boom mic or a desktop podcasting mic or a Bluetooth device or a fancy audio interface with XLR ports. Whatever it is, make sure your computer "hears" your main sound input. + 3. In OBS, create a source for your main microphone and name it something obvious (e.g., boom mic, master sound, or mic). + 4. Do a test. Make sure OBS "hears" your microphone by referring to the audio-level monitors at the bottom of the OBS window. If it's not responding to the input you believe you've set as input, check your cables, check your computer sound control panel, and check OBS. + + + +I've seen more people panic over audio sources than any other issue when streaming, and we've _all_ made the same dumb mistakes (several times each, probably!) when attempting to set a microphone for a live stream or videoconference call. Breathe deep, check your cables, check your inputs and outputs, and [get comfortable with audio][9]. It'll pay off in the end. + +### Create scenes + +A **Scene** in OBS is a screen layout and consists of one or more sources. + +![Scenes in OBS][10] + +For instance, you might create a scene called **Master shot** that shows you sitting at your desk in front of your computer or at the kitchen counter ready to mix ingredients together. The source could be a webcam mounted on a tripod a meter or two in front of you. Because you want to cut to a detail shot, you might create a second scene called **Close-up**, which uses the computer screen and audio as one input source and your microphone as another source, so you can narrate as you demonstrate what you're doing. If you're doing a baking show, you might want to mount a second webcam above the counter, so you can cut to an overhead shot of ingredients being mixed. Here, your source is a different webcam but probably the same microphone (to avoid making changes in the audio). + +A _scene_, in other words, is a lot like a _shot_ in traditional production vernacular, but it can be the combination of many shots. The fun thing about OBS is that you can mix and match a lot of different sources together, so when you're adding a **Scene**, you can resize and position different sources to achieve picture-in-picture, or split-screen, or any other effect you might want. It's common in video game "let's play" streams to have the video game in full-screen, with the player inset in the lower right or left. Or, if you're recording a panel or a multi-player game like D&D you might have several cameras covering several players in a _Brady Bunch_ grid. + +The possibilities are endless. During streaming, you can cut from one scene to another as needed. This is intended to be a dynamic system, so you can change scenes depending on what the viewer needs to see at any given moment. + +Generally, you want to have some preset scenes before you start to stream. Even if you have a friend willing to do video mixing as you stream, you always want a safe scene to fall back to, so take time beforehand to set up at least a master shot that shows you doing whatever it is you're doing. If all else fails, at least you'll have your main shot you can safely and reliably cut to. + +### Transitions + +When switching from one scene to another, OBS uses a transition. Once you have more than one scene, you can configure what kind of transition it uses in the **Transitions** panel. Simple transitions are usually best. By default, OBS uses a subtle crossfade, but you can experiment with others as you see fit. + +### Go live + +To start streaming, do your vocal exercises, find your motivation, and press the **Start Streaming** button. + +![Start streaming in OBS][11] + +As long as you've set up your streaming service correctly, you're on the air (or on the wires, anyway). + +If you're the talent (the person in front of the camera), it might be easiest to have someone control OBS during streaming. But if that's not possible, you can control it yourself as long as you've practiced a little in advance. If you're screencasting, it helps to have a two-monitor setup so you can control OBS without it being on screen. + +### Streaming for success + +Many of us take streaming for granted now that the internet exists and can broadcast media created by _anyone_. It's a hugely powerful means of communication, and we're all responsible for making the most of it. + +If you have something positive to say, a skill to teach, words of encouragement, or just something fun that you want to share, and you feel like you want to broadcast to the world, then take the time to learn OBS. You might not get a million viewers, but independent media is a vital part of [free culture][12]. The world can always use empowering and positive open source voices, and yours may be one of the most important of all. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/open-source-live-stream + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/LIFE_film.png?itok=aElrLLrw (An old-fashioned video camera) +[2]: http://obsproject.com +[3]: https://opensource.com/sites/default/files/obs-flowchart.jpg (OBS flowchart) +[4]: https://flatpak.org/setup +[5]: https://opensource.com/article/19/1/basic-live-video-streaming-server +[6]: https://opensource.com/sites/default/files/twitch-key.jpg (Streaming key) +[7]: https://opensource.com/article/19/1/basic-live-video-streaming-server#obs +[8]: https://opensource.com/sites/default/files/uploads/obs-sources.jpg (OBS sources) +[9]: https://opensource.com/article/17/1/linux-plays-sound +[10]: https://opensource.com/sites/default/files/uploads/obs-scenes.jpg (Scenes in OBS) +[11]: https://opensource.com/sites/default/files/uploads/obs-stream-start.jpg (Start streaming in OBS) +[12]: https://opensource.com/article/18/1/creative-commons-real-world diff --git a/sources/tech/20200430 Edit music recordings with Audacity on Linux.md b/sources/tech/20200430 Edit music recordings with Audacity on Linux.md new file mode 100644 index 0000000000..be6f68f062 --- /dev/null +++ b/sources/tech/20200430 Edit music recordings with Audacity on Linux.md @@ -0,0 +1,161 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Edit music recordings with Audacity on Linux) +[#]: via: (https://opensource.com/article/20/4/audacity) +[#]: author: (David Both https://opensource.com/users/dboth) + +Edit music recordings with Audacity on Linux +====== +How COVID-19 caused me to learn Audacity on the fly and learn to love +it. +![Bird singing and music notes][1] + +In this strange and difficult time of a global pandemic, we are all called upon to do things differently, to change our routines, and to learn new things. + +I have worked from home for many years, so that is nothing new to me. Even though I am allegedly retired, I write articles for Opensource.com and [Enable Sysadmin][2] and books. I also manage my own home network, which is larger than you might think, and my church's network and Linux hosts, and I help a few friends with Linux. All of this keeps me busy doing what I like to do, and all of it is usually well within my comfort zone. + +But COVID-19 has changed all of that. And, like many other types of organizations, my church had to move quickly to a new service-delivery paradigm. And that is what churches do—deliver a specific kind of service. As the church sysadmin and with some knowledge of audio recording and editing (back in the '70s, I mixed the sound and was the only roadie for a couple of regional folk-rock groups in Toledo, Ohio), I decided to learn the open source audio recording and editing software [Audacity][3] to help meet this challenge. + +This is not a comprehensive how-to article about using Audacity. It is about my experiences getting started with this powerful audio-editing tool, but there should be enough information here to help you get started. + +I have learned just what I need to know in order to accomplish my task: combining several separate audio clips into a single MP3 audio file. If you already know Audacity and do things differently or know things that I don't, that is expected. And if you have any suggestions to help me accomplish my task more easily, please share them in the comments. + +### The old way + +I try not to use the term "normal" now because it is hard to know exactly what that is—if such a state even exists. But our old method of producing recordings for our shut-ins, members who are traveling, and anyone else was to record the sermon portion of our regular, in-person church services and post them on our website. + +To do this, I installed a TASCAM SS-R100 solid-state recorder that stores the sermons as MP3 files on a thumb drive. We uploaded the recordings to a special directory of our website so people could download them. The recordings are uploaded using a Bash [program][4] I wrote for the task. _Automate everything!_ I trained a couple of others to perform these tasks using sudo in case I was not available. + +This all worked very well. Until it didn't. + +### The new way + +As soon as the first restrictions on large gatherings occurred, we made some changes. We could still have small gatherings, so four of us met Sunday mornings and recorded an abbreviated service using our in-house recorder and doing the upload the usual way. This worked, but as the crisis deepened and it became more of a risk to meet with even a few people, we had to make more changes. + +Like a huge number of other organizations, we realized we each needed to perform our parts of creating services in separate locations from our own homes. + +Now, depending upon the structure of the service, I receive several recordings that I need to combine to create the full church service. Our music director records each anthem and interlude using her iPhone and sends me the recordings in the M4A (MPEG-4 audio) format. They each range in length from seconds to five minutes and are up to 3MB in size. Likewise, our rector sends me two to six recordings, also in M4A format, that contains his portion of the service. Sometimes, other musicians in our church send solos or duets recorded with their significant others; these can be in MP3 or M4A formats. + +Then, I pull all of this together into a single recording that can be uploaded to our server for people to download. I use Audacity for this because it was available in my repo, and it was easy to get started. + +### Getting started with Audacity + +I had never used [Audacity][5] before this, so, like many others these days, I needed to learn something new just in time to accomplish what I needed to do. I struggled a bit at first, but it turned out to be fun and very enlightening. + +Audacity was easy to install on my Fedora 31 workstation because, as in many distros, it is available from the Fedora repository. + +The first time I opened Audacity with the program launcher icon, the application's window was empty with no projects nor tracks present. Audacity projects have an AUP extension, so if you have an existing project, you could click on the file in your favorite file manager and launch Audacity that way. + +### Convert M4A to MP3 + +As installed by Fedora, Audacity does not recognize M4A files. Regardless of how you proceed, you need to install the [LAME][6] MP3 encoder and [FFmpeg][7] import/export library, both of which are available from the Fedora repository and, most likely, any other distro's repository. + +There are websites that explain how to configure Audacity to use these tools to import and convert audio files from M4A to other types (such as MP3), but I decided to write a script to do it from the command line. For one reason, using a script is faster than doing a lot of extra clicking in a GUI interface, and for another, the file names need some work, so I already needed a script to rename the files. Many people use non-alphanumeric characters to name files, but I don't like dealing with special keyboard characters from the command line. It's easier to manage files with simple alphanumeric names, so my script removes all non-alphanumeric characters from the file names and then converts the files to MP3 format. + +You may choose a different approach, but I like the scripted solution. It is fast, and I only need to run the script once, no matter how many files need to be renamed and converted to MP3. + +### Create a new project + +You can create a new project whether or not any audio tracks are loaded. I recommend creating the project first, before importing any audio files (aka "clips"). From the Menu bar, select **File > Save Project > Save Project As**. This opens a warning dialog window that says, _"'Save project' is for an Audacity project, not an audio file."_ Click the **OK** button to continue to a standard file-save dialog. + +I found that I needed to do this twice. The first time, the warning dialog did not display any buttons, so I had to close the dialog using the window menu or the x icon in the Title bar. + +Name the project whatever you like, and Audacity automatically adds the AUP extension. You now have an empty project. + +### Add audio files to your project + +The first step is to add your audio files to the project. Using the Menu bar, open **File > Import > Audio** and then use the file dialog to select one or more files to import. For my first test project, I loaded all the files at once without sorting the tracks nor aligning the clips in the desired sequence along the timeline. This time, I started by loading the audio files one at a time in the sequence I wanted them from top to bottom. As each file is imported, it is placed into a new track below any existing tracks. The following image shows the files loaded all at one time in the sequence they appear in the working directory. + +![Tracks loaded in Audacity][8] + +There is a timeline across the top of the window's track area. There is also a scroll bar at the bottom of the window, so you can scroll along the timeline when the tracks extend beyond the width of the Audacity window. There is also a vertical scroll bar if there are more tracks than fit into the window. + +Notice the names in the upper-left corner of the waveform section of each track—they are the file names of each track without the extension. These are not there by default, but I find them helpful. To display these names, use the Menu bar to select **Edit > Preferences** and place a check in the **Show Audio Track Name As Overlay** box. + +### Order your audio clips + +Once you have some files loaded into the Audacity workspace, you can start manipulating them. To order your audio clips, select one and use the **Time-Shift** tool (↔︎) to slide them horizontally along the tracks; continue doing this until all the clips line up end to end in the order you want them. Note that the clip you are moving is book-ended by a pair of vertical alignment lines. When they line up perfectly, the end lines of the two aligned tracks change color to alert you. + +You can hover the mouse pointer over the tool icons in the Audacity toolbars to see a pop-up that displays the name of that tool. This helps beginners understand what each tool does. + +![Audacity toolbox][9] + +Here, the **Selection** tool** **is selected in the Audacity toolbar. The **Time-Shift** tool is second from the left on the bottom row. + +The following image shows what happens when you slide the audio clips into place on the project timeline without sorting the tracks into a particular sequence. This may not be optimal for how you like to work. It is not for me. + +![Audio clips in Audacity][10] + +To remove segments of (or complete) audio clips, select them with the **Selection** tool—you can also select multiple adjacent tracks. Then you can press the **Delete** button on your keyboard to delete the selected segment(s). + +In the image above, you can see a vertical black line in track 1 and a vertical green line crossing all the tracks. These are the audio cursors that show the playback positions of a track or the entire project. Choose the **Selection** tool and click the desired position within a track, then click the **Play** button on the transport controls (in the upper-left of the Audacity window) to begin playback. Playback will continue past the end of the selected track and all the way to the end of the project. If tracks overlap on the timeline, they will play simultaneously. + +To begin playback immediately, click the desired starting point on the timeline. To play part of a track, hold down the Left mouse button to select a short segment of the track, and then click the **Play** button. The other transport buttons—Pause, Stop, and so—on are identified with universal icons and work as you would expect. + +You can also click the **Silence Audio Selection** button—the fifth button from the left on the **Edit** toolbar (shown below)—to completely silence a selected segment while leaving it in place for timing purposes. This is how I silenced a number of background clicks and noises. + +![Audacity edit tools][11] + +It took me a while to figure out how to sort the tracks vertically, and it turns out there are a few different ways to accomplish the task. + +You can use the track menu to reorder arrangement. Each track has its own Control Panel on the left side (shown below). The track drop-down Menu bar at the top of the Control Panel opens a menu that provides several track-sequencing options to move a track up, down, to the top, or to the bottom. + +![Moving tracks in Audacity][12] + +The items to move a track up or down move the track one position at a time, so you have to select it as many times as necessary to get the track in the desired position. + +To drag and drop tracks, you must click on the space occupied by the track details. In this screenshot, that's "Mono, 48000Hz 32 bit float". It can be tricky, because if you click too high, you adjust the panning (the left and right stereo position) and if you click too low, you may collapse or select the track. Target the "Mono" or "Stereo" label (whatever your track happens to be) label, and then click and drag the track up or down to reposition it in your workspace. + +### Apply amplification and noise reduction effects + +Some tracks need the overall volume to be adjusted. I used the **Selection** tool to double-click and select the entire track (but you could also select a portion of a track). On the Menu bar, select **Effect > Amplify** to display a small dialog window. You can use the slider or enter a value to specify the amount of amplification. Negative numbers decrease the volume. If you try to increase the volume, you need to place a check in the **Allow Clipping** box. Then click OK. + +I found that amplification is a bit tricky; it is easy to use too much or too little. Start by using small numbers to see the results. You can always use **Ctrl+Z** to undo your changes if you go too far in either direction. + +Another effect I find useful is noise reduction. One of the tracks was recorded with a noticeable 60Hz hum, which is usually due to poor grounding of the microphone or recorder. Fortunately, there were only several seconds of hum and no other sound at the beginning of the recording. + +Applying the noise reduction effect was a little confusing at first. First, I selected a few samples of the humming sound to tell Audacity what sound needed to be reduced, and then I navigated to **Effect > Noise Reduction**. This opens the **Noise Reduction** dialog. I clicked on the **Get Noise Profile** button in the Step 1 section of the dialog, which uses the selected sample as the basis for a set of filter presets. After it gathers the selected sample, though, the dialog disappeared (this is by design). I re-opened the dialog, used the slider to select the noise reduction level in decibels (I set it to 15dB and left the other sliders alone), and then clicked **OK**. + +This worked well—you can hear the residual hum only if you know it is there. I need to experiment with this some more, but since the result was acceptable, so I did not play with the settings any further. + +The reason the dialog box closes after getting a noise profile is actually for the sake of expediency. If you're processing many tracks or segments of audio, each with a different noise profile, you can open the **Noise Reduction** effect, get the current noise profile, and then select the audio you want to clean. You can then run the Noise Reduction filter using **Ctrl+R**, the keyboard shortcut for running the most recent filter. Instead of getting a new noise profile, however, Audacity uses the one you've just stored, and performs the filter instead. This way, you can get a sample with a few clicks but clean lots of audio with just one keyboard shortcut. + +### And so much more + +I have only worked with a few of the basics and have not even begun to scratch the surface of Audacity. I can already see that it has so many more features and tools that will enable me to create even more professional-sounding projects. + +For example, in addition to working with existing audio files, Audacity can make recordings from line inputs, the desktop sound stream, and microphone inputs. It can do special effects like fade in and out and cross-fades. And I have not even tried to figure out what many of the other effects and tools are capable of. + +I have a feeling I will need to learn more in the near future. Hopefully, this story of my very limited experience with Audacity will prompt you to check it out. For much more information, you can find the [Audacity manual][13] online. + +Using Audacity, you can quickly clean up audio file so that any background noise becomes tolerable. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/4/audacity + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/music-birds-recording-520.png?itok=UoM7brl0 (Bird singing and music notes) +[2]: https://www.redhat.com/sysadmin/ +[3]: https://www.audacityteam.org/ +[4]: https://opensource.com/article/17/12/using-sudo-delegate +[5]: https://opensource.com/education/16/9/audacity-classroom +[6]: https://manual.audacityteam.org/man/installing_and_updating_audacity_on_linux.html#linlame +[7]: https://manual.audacityteam.org/man/installing_and_updating_audacity_on_linux.html#linff +[8]: https://opensource.com/sites/default/files/uploads/audacity1_tracksloaded.png (Tracks loaded in Audacity) +[9]: https://opensource.com/sites/default/files/uploads/audacity2_tools.png (Audacity toolbox) +[10]: https://opensource.com/sites/default/files/uploads/audacity3_audioclips.png (Audio clips in Audacity) +[11]: https://opensource.com/sites/default/files/uploads/audacity4_edittoolbar.png (Audacity edit tools) +[12]: https://opensource.com/sites/default/files/uploads/audacity5_trackmovement.png (Moving tracks in Audacity) +[13]: https://manual.audacityteam.org/# diff --git a/sources/tech/20200430 Linux and Kubernetes- Serving The Common Goals of Enterprises.md b/sources/tech/20200430 Linux and Kubernetes- Serving The Common Goals of Enterprises.md new file mode 100644 index 0000000000..c3c0c36b66 --- /dev/null +++ b/sources/tech/20200430 Linux and Kubernetes- Serving The Common Goals of Enterprises.md @@ -0,0 +1,77 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Linux and Kubernetes: Serving The Common Goals of Enterprises) +[#]: via: (https://www.linux.com/articles/linux-and-kubernetes-serving-the-common-goals-of-enterprises/) +[#]: author: (Swapnil Bhartiya https://www.linux.com/author/swapnil/) + +Linux and Kubernetes: Serving The Common Goals of Enterprises +====== + +[![][1]][2] + +For [Stefanie Chiras,][3] VP & GM, Red Hat Enterprise Linux (RHEL) Business Unit at [Red Hat][4], aspects such as security and resiliency have always been important for Red Hat. More so, in the current situation when everyone has gone fully remote and it’s much harder to get people in front of the hardware for carrying out updates, patching, etc. + +“As we look at our current situation, never has it been more important to have an operating system that is resilient and secure, and we’re focused on that,” she said. + +The recently released version of [Red Hat Enterprise Linux (RHEL) 8.2][5] inadvertently address these challenge as it makes it easier for technology leaders to embrace the latest, production-ready innovations swiftly which offering security and resilience that their IT teams need. + +RHEL’s embrace of a predictable 6-month minor release cycle also helped customers plan upgrades more efficiently. + +“There is value for customers in having predictability of minor releases on a six-month cycle. Without knowing when they were coming was causing disruptions for them. The launch of 8.2 is now the second time we have delivered on our commitment of having minor releases every six months,” said Stefanie Chiras. + +In addition to offering security updates, the new version adds insights capabilities and forays into newer areas of innovation. + +The upgrade has expanded the earlier capability called ‘Adviser’ dramatically. Additional functionalities such as drift monitoring and CVE coverage allow for a much deeper granularity into how the infrastructure is running. + +“It really amplifies the skills that are already present in ops and sysadmin teams, and this provides a Red Hat consultation, if you will, directly into the data center,” claimed Charis. + +As containers are increasingly being leveraged for digital transformation, RHEL 8.2 offers an updated application stream of Red Hat’s container tools. It also has new, containerized versions of Buildah and Skopeo. + +[Skopeo][6] is an open-source image copying tool, while Buildah is a tool for building Docker- and Kubernetes-compatible images easily and quickly. + +RHEL has also ensured in-place upgrades in the new version. Customers can now directly in-place upgrade from version 7 to version 8.2. + +Chiras believes Linux has emerged as the go-to-platform for innovations such as Machine Learning, Deep Learning, and Artificial Intelligence. + +“Linux has now become the springboard of innovation,” she argued. “AI, machine learning, and deep learning are driving a real change in not just the software but also the hardware. In the context of these emerging technologies, it’s all about making them consumable into an enterprise.” + +“We’re very focused on our ecosystem, making sure that we’re working in the right upstream communities with the right ISVs, with the right hardware partners to make all of that magic come together,” Chiras said. + +Towards this end, Red Hat has been partnering with multiple architectures for a long time — be it an x86 architecture, ARM, Power, or mainframe with IBM Z. Its partnership with Nvidia pulls in capabilities such as FPGAs, and GPU. + +**Synergizing Kubernetes and Linux ** + +Kubernetes is fast finding favor in enterprises.  So how do Linux and Kubernetes serve the common goals of enterprises? + +“Kubernetes is a new way to deploy Linux. We’re very focused on providing operational consistency by leveraging our technology in RHEL and then bringing in that incredible capability of Kubernetes within our OpenShift product line,” Chiras said. + +The deployment of Linux within a Kubernetes environment is much more complicated than in a traditional deployment. RHEL, therefore, made some key changes. The company created Red Hat Enterprise Linux CoreOS — an optimized version of RHEL for the OpenShift experience. + +“It’s deployed as an immutable. It’s tailored, narrow, and gets updated as part of your OpenShift update to provide consistent user experience and comprehensive security. + +The launch of the Red Hat Universal Base Image (UBI) offers users greater security, reliability, and performance of official Red Hat container images where OCI-compliant Linux containers run. + +“Kubernetes is a new way to deploy Linux. It really is a tight collaboration but what we’re really focused on is the customer experience. We want them to get easy updates with consistency and reliability, resilience and security. We’re pulling all of that together. With such advancements going on, it’s a fascinating space to watch,” added Chiras. + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/articles/linux-and-kubernetes-serving-the-common-goals-of-enterprises/ + +作者:[Swapnil Bhartiya][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/swapnil/ +[b]: https://github.com/lujun9972 +[1]: https://www.linux.com/wp-content/uploads/2019/12/computer-2930704_1280-1068x634.jpg (computer-2930704_1280) +[2]: https://www.linux.com/wp-content/uploads/2019/12/computer-2930704_1280.jpg +[3]: https://www.linkedin.com/in/stefanie-chiras-9022144/ +[4]: https://www.redhat.com/en +[5]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/8.2_release_notes/index +[6]: https://github.com/containers/skopeo diff --git a/sources/tech/20200501 Transparent, open source alternative to Google Analytics.md b/sources/tech/20200501 Transparent, open source alternative to Google Analytics.md new file mode 100644 index 0000000000..d4ce222a39 --- /dev/null +++ b/sources/tech/20200501 Transparent, open source alternative to Google Analytics.md @@ -0,0 +1,123 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Transparent, open source alternative to Google Analytics) +[#]: via: (https://opensource.com/article/20/5/plausible-analytics) +[#]: author: (Marko Saric https://opensource.com/users/markosaric) + +Transparent, open source alternative to Google Analytics +====== +Plausible Analytics is a leaner, more transparent option, with the +essential data you need but without all the privacy baggage. +![Digital creative of a browser on the internet][1] + +Google Analytics is the most popular website analytics tool. Millions of developers and creators turn to it to collect and analyze their website statistics. + +More than 53% of all sites on the web track their visitors using Google Analytics. [84%][2] of sites that do use a known analytics script use Google Analytics. + +Google Analytics has, for years, been one of the first tools I installed on a newly launched site. It is a powerful and useful analytics tool. Installing Google Analytics was a habit I didn't think much about until the introduction of the [GDPR][3] (General Data Protection Regulation) and other privacy regulations. + +Using Google Analytics these days comes with several pitfalls, including the need for a privacy policy, the need for cookie banners, and the need for a GDPR consent prompt. All these may negatively impact the site loading time and visitor experience. + +This has made me try to [de-Google-ify websites][4] that I work on, and it's made me start working on independent solutions that are open source and more privacy-friendly. This is where Plausible Analytics enters the story. + +[Plausible Analytics][5] is an open source and lightweight alternative to Google Analytics. It doesn't use cookies and it doesn't collect any personal data, so you don't need to show any cookie banners or get GDPR or CCPA consent. Let's take a closer look. + +### Main differences between Google Analytics and Plausible + +Plausible Analytics is not designed to be a clone of Google Analytics. It is meant as a simple-to-use replacement and a privacy-friendly alternative. Here are the main differences between the two web analytics tools: + +#### Open source vs. closed source + +Google Analytics may be powerful and useful, but it is closed source. It is a proprietary tool run by one of the largest companies in the world, a company that is a key player in the ad-tech industry. There's simply no way of knowing what's going on behind the scenes. You have to put your trust in Google. + +Plausible is a fully open source tool. You can read our code [on GitHub][6]. We're "open" in other ways, too, such as our [public roadmap][7], which is based around the feedback and features submitted by the members of our community. + +#### Privacy of your website visitors + +Google Analytics places [several cookies][8] on the devices of your visitors, and it tracks and collects a lot of data. This means that there are several requirements if you want to use Google Analytics and be compliant with the different regulations: + + * You need to have a privacy policy about analytics + * You need to show a cookie banner + * You need to obtain a GDPR/CCPA consent + + + +Plausible is made to be fully compliant with the privacy regulations. No cookies are used, and no personal data is collected. This means that you don't need to display the cookie banner, you don't need a privacy policy, and you don't need to ask for the GDPR/CCPA consent when using Plausible. + +#### Page weight and loading time + +The recommended way of installing Google Analytics is to use the Google Tag Manager. Google Tag Manager script weights 28 KB, and it downloads another JavaScript file called the Google Analytics tag, which adds an additional 17.7 KB to your page size. That's 45.7 KB of page weight combined. + +Plausible script weights only 1.4 KB. That's 33 times smaller than the Google Analytics Global Site Tag. Every KB matters when you want to keep your site fast to load. + +#### Accuracy of visitor stats + +Google Analytics is being blocked by an increasing number of web users. It's blocked by those who use open source browsers such as [Firefox][9] and [Brave][10]. It's also blocked by those who use open source browser add-ons such as the [uBlock Origin][11]. It's not uncommon to see 40% or more of the audience on a tech site blocking Google Analytics. + +Plausible is a new player on this market and it's privacy-friendly by default, so it doesn't see the same level of blockage. + +#### Simple vs. complex web analytics + +[Google Analytics is overkill][12] for many website owners. It's a complex tool that takes time to understand and requires training. Google Analytics presents hundreds of different reports and metrics for you to get insights from. Many users end up creating custom dashboards while ignoring all the rest. + +Plausible cuts through all the noise that Google Analytics creates. It presents everything you need to know on one single page—all the most valuable metrics at a glance. You can get an overview of the most actionable insights about your website in one minute. + +### A guided tour of Plausible Analytics + +Plausible Analytics is not a full-blown replacement and a feature-by-feature reproduction of Google Analytics. It's not designed for all the different use-cases of Google Analytics. + +It's built with simplicity and speed in mind. There is no navigational menu. There are no additional sub-menus. There is no need to create custom reports. You get one simple and useful web analytics dashboard out of the box. + +Rather than tracking every metric imaginable, many of them that you will never find a use for, Plausible focuses on the essential website stats only. It is easy to use and understand with no training or prior experience: + +![Plausible analytics in action][13] + + * Choose the time range that you want to analyze. The visitor numbers are automatically presented on an hourly, daily, or monthly graph. The default time frame is set at the last 30 days. + * See the number of unique visitors, total page views, and the bounce rate. These metrics include a percentage comparison to the previous time period, so you understand if the trends are going up or down. + * See all the referral sources of traffic and all the most visited pages on your site. Bounce rates of the individual referrals and pages are included too. + * See the list of countries your traffic is coming from. You can also see the device, browser, and operating system your visitors are using. + * Track events and goals to identify the number of converted visitors, the conversion rate, and the referral sites that send the best quality traffic. + + + +Take a look at the [live demo][14] where you can follow the traffic to the Plausible website. + +### Give Plausible Analytics a chance + +With Plausible Analytics, you get all the important web analytics at a glance so you can focus on creating a better site without needing to annoy your visitors with all the different banners and prompts. + +You can try Plausible Analytics on your site alongside Google Analytics. [Register today][15] to try it out, and see what you like and what you don't. Share your feedback with the community. This helps us learn and improve. We'd love to hear from you. + +Take a look at five great open source alternatives to Google Docs. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/plausible-analytics + +作者:[Marko Saric][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/markosaric +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet) +[2]: https://w3techs.com/technologies/details/ta-googleanalytics +[3]: https://gdpr-info.eu/ +[4]: https://markosaric.com/degoogleify/ +[5]: https://plausible.io/ +[6]: https://github.com/plausible-insights/plausible +[7]: https://feedback.plausible.io/roadmap +[8]: https://developers.google.com/analytics/devguides/collection/analyticsjs/cookie-usage +[9]: https://www.mozilla.org/en-US/firefox/new/ +[10]: https://brave.com/ +[11]: https://github.com/gorhill/uBlock +[12]: https://plausible.io/vs-google-analytics +[13]: https://opensource.com/sites/default/files/plausible-analytics.png (Plausible analytics in action) +[14]: https://plausible.io/plausible.io +[15]: https://plausible.io/register diff --git a/sources/tech/20200503 13 tips for getting your talk accepted at a tech conference.md b/sources/tech/20200503 13 tips for getting your talk accepted at a tech conference.md new file mode 100644 index 0000000000..b260116fb6 --- /dev/null +++ b/sources/tech/20200503 13 tips for getting your talk accepted at a tech conference.md @@ -0,0 +1,127 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (13 tips for getting your talk accepted at a tech conference) +[#]: via: (https://opensource.com/article/20/5/tips-conference-proposals) +[#]: author: (Todd Lewis https://opensource.com/users/toddlewis) + +13 tips for getting your talk accepted at a tech conference +====== +Before you respond to an event's call for papers, make sure your talk's +proposal aligns with these best practices. +![All Things Open check-in at registration booth][1] + +As tech conference organizers ramp up for the fall season, you may be seeing calls for papers (CFP) landing in your email box or social media feeds. We at [All Things Open][2] (ATO) have seen a lot of presentation proposals over the years, and we've learned a few things about what makes them successful. + +As we prepare for the eighth annual ATO in October 2020, we thought we'd offer a few best practices for writing successful CFP responses. If you're considering submitting a talk to ATO or another tech event, we hope these tips will help improve the chances that your proposal will be accepted. + +### 1\. Know the event you're submitting a talk to + +This seems like the proverbial _no-brainer_, but some people don't take the time to research an event before they submit a talk. Peruse the conference's website and review the talks, speakers, topics, etc. featured in the last couple of years. You can also find a lot of information simply by googling. The time you invest here will help you avoid a submission that is completely out of context for the event. + +### 2\. Understand what the event is looking for + +Look for information about what the event is looking for and what types of topics or talks it expects will be a good fit. We try to provide as much information as possible about the [ATO conference][3], [why someone would want to speak][4], and [what we're looking for][5] (both general and special interest topics). We also try to make the submission process as easy as possible (no doubt, there is room for improvement), in part because we believe this improves the quality of submissions and makes our review process go more smoothly. + +### 3\. Reach out to the organizer and ask questions + +If you're considering submitting a talk, don't hesitate to reach out and ask the event organizers any questions you have and for guidance specific to the event. If there is no or little response, that should be a red flag. If you have any questions about All Things Open, please reach out directly at [info@allthingsopen.org][6]. + +### 4\. Be clear about what attendees will learn from your talk + +This is one of the most common mistakes we see. Only about 25% of the proposals we receive clearly explain the proposed talk's takeaways. One reason you should include this is that nearly every event attendee makes their schedule based on what they will learn if they go to a session. But for organizers and proposal reviewers, having this information clearly stated upfront is pure gold. It simplifies and speeds up the assessment process, which gets you one step closer to being accepted as a speaker. A paragraph titled "Attendee Takeaways" with bullet points is the holy grail for everyone involved. + +### 5\. Keep recommended word counts in mind + +This is another mistake we see a lot. Many talks are submitted with either a single sentence description in the abstract or an extraordinary long volume of text. Neither is a good idea. The only exception we can think of is when a topic is very popular or topical, and that alone is enough to win the day even if the abstract is extremely short (but this is rare). Most abstracts should be between 75 and 250 words, and perhaps more for an extended workshop with prerequisites (e.g., preexisting knowledge or required downloads). Even then, try to keep your proposal as sharp, concise, and on-point as possible. + +Disregard this advice at your own risk; otherwise, there's a high likelihood that your proposal will be met with one of these reactions from reviewers: "They didn't take the time to write any more than this?" or "Sheesh, there's no way I have the time to read all that. I'm going to give it the lowest score and move on." + +### 6\. Choose a good title + +This is a debate we see all the time: Should a talk's title describe what the talk is about, or should it be written to stand out and get attention (e.g., evoking emotion, anchoring to a popular pop culture topic, or asking a compelling question)? There isn't a single correct answer to this question, but we definitely know when a title "works" and when it doesn't. We've seen some very creative titles work well and generate interest, and we've seen very straightforward titles work well, also. + +Here is our rule of thumb: If the talk covers a topic that has been around a while and is not particularly _hot_ right now, try getting creative and spicing it up a bit. If the topic is newer, a more straightforward title describing the talk in plain terms should be good. + +Titles on an event schedule may be the only thing attendees use to decide what talks to attend. So, run your potential talk titles by colleagues and friends, and seek their opinions. Ask: "If you were attending an event and saw this title on the schedule, would it pique your interest?" + +### 7\. Know the basic criteria that reviewers and organizers use to make decisions + +While this isn't a comprehensive list of review criteria, most reviewers and organizers consider one or more of the following when evaluating talk proposals. Therefore, at minimum, consider this list when you're creating a talk and the components that go with it. + + 1. **Timeliness of and estimated interest in the topic:** Is the topic applicable to the session's target audience? Will it deliver value? Is it timely? + 2. **Educational value:** Based on the abstract and speaker, is it clear that attendees will learn something from the talk? As mentioned in item 4 above, including an "Attendee Takeaways" section is really helpful to establish educational value. + 3. **Technical value:** Is the technology you intend to showcase applicable, unique, or being used in a new and creative way? Is there a live demo or a hands-on component? While some topics don't lend themselves to a demo, most people are visual learners and are better off if a presentation includes one (if it's relevant). For this reason, we place a lot of value on demos and hands-on content. + 4. **Diversity:** Yes, there are exceptions, but the majority of events, reviewers, and organizers agree that having a diverse speaker lineup is optimal and results in a better overall event in multiple ways. A topic delivered from a different perspective can often lead to creative breakthroughs for attendees, which is a huge value-add. See item 10 below for more on this. + 5. **Talk difficulty level:** We identify All Things Open talks as introductory, intermediate, or advanced. Having a good mix of talk levels ensures everyone in attendance can access applicable content. See item 9 below for more on this, but in general, it's smart to indicate your talk's level, whether or not the CFP requests it. + + + +### 8\. Stay current on the event's industry or sector + +Submitting a proposal on a relevant topic increases the probability your talk will be accepted. But how do you know what topics are of interest, especially if the CFP doesn't spell it out in simple terms? The best way to know what's timely and interesting is to deeply understand the sector the event focuses on. + +Yes, this requires time and effort, and it implies you enjoy the sector enough to stay current on it, but it will pay off. This knowledge will result in a higher _sector IQ_, which will be reflected in your topic, title, and abstract. It will be recognized by reviewers and immediately set you apart from others. At All Things Open, we spend the majority of our time reading about and staying current on the "open" space so that we can feature relevant, substantive, and informed content. Submitting a talk that is relevant, substantive, and informed greatly enhances the chance it will be accepted. + +### 9\. Describe whether the talk is introductory, intermediate, or advanced + +Some CFPs don't ask for this information, but you should offer it anyway. It will make the reviewers and organizer very happy for multiple reasons, including these: + + 1. Unless the event targets attendees with a certain skill or experience level (and most do not), organizers must include content that is appealing to a wide audience, including people of all skill, experience, and expertise levels. Even if an event focuses on a specific type of attendee (perhaps people with higher levels of experience or skills), most want to offer something a little different. Listing the talk level makes this much easier for organizers. + 2. News flash: Reviewers and organizers don't know everything and are not experts in every possible topic area. As a result, reviewers will sometimes look for a few keywords or other criteria, and adding the talk level can "seal the deal" and get your talk confirmed. + + + +### 10\. Tell organizers if you're a member of a historically underrepresented group + +A growing number of events are getting better at recognizing the value of diversity and ensuring their speaker lineup reflects it. If you're part of a group that hasn't typically been included in tech events and leadership, look to see if there is a place to indicate that on the submission form. If not, mention it in a conspicuous place somewhere in the abstract. This does not guarantee approval in any way—your proposal must still be well-written and relevant—but it does give reviewers and organizers pertinent information they may value and take into consideration. + +### 11\. Don't be ashamed of your credentials or speaking experience if it is light + +We talk to a lot of people who would like to deliver a presentation and have a lot to offer, but they never submit a talk because they don't feel they're qualified to speak. _Not true._ Some of the best talks we've seen are from first-time speakers or those very early in their speaking careers. Go ahead and submit the talk, and be honest when discussing your background. Most reviewers and organizers will focus on the substance of the submission over your experience and recognize that new ways of approaching and using technology often come from newbies rather than industry veterans. + +One caveat here: It still pays to know yourself. By this, we mean if you absolutely hate public speaking, have no desire to do it, and are only considering submitting a talk due to, for example, pressure from an employer, the talk is not likely to go well. It's better, to be honest, on the frontend than force something you have no desire to do. + +### 12\. Consider panel sessions carefully + +If you've got an idea for a panel session, please consider it carefully. In more than 10 years of hosting events we've seen some really good panel sessions, but we've seen far more that didn't go so well. Perhaps too many people were on the panel and not everyone had a chance to speak, perhaps a single panel member dominated the entire conversation, or perhaps the moderator didn't keep the dialogue and engagement flowing smoothly. Regardless of the issue, panels have the potential to go very wrong. + +That said, panels can still work and deliver a lot of value to attendees. If you do submit a panel session be sure to keep in mind the amount of time allotted for the session and confirm the number of panel members accordingly. Remember, less is always more when it comes to the panel format. Also, be sure the moderator understands the subject matter being discussed and doesn't mind enforcing format parameters and speaking time limits. Finally, let organizers know panel members and the moderator will engage in a pre-conference walk-through/preparation call before the event to ensure a smooth process in front of a live audience. Remember, organizers are well aware panels can be terrific but can also go in the opposite direction and very easily lead to a lot of negative feedback. + +### 13\. This is not an opportunity to sell  + +This is a sensitive topic, but one that absolutely must be mentioned. Over the years we've seen literally hundreds of talks "disqualified" by reviewers because they viewed the talk as a sales pitch. Few things evoke such a visceral response. Yes, there are events, tracks, and session slots where a sales pitch is appropriate (and maybe even required by the company paying your costs). However, make it a priority to know when and where this is appropriate and acceptable. And always, and we mean always, err on the side of making substance the focus of the talk rather than a sales angle.  + +It might sound like a cliche, but when a talk is delivered effectively with a focus on substance, people will **want** to buy what you're selling. And if you're not selling anything, they'll want to follow you on social media and generally engage with you—because you delivered value to them. Meaning: You gave them something they can apply themselves (education) or because your delivery style was entertaining and engaging. With rare exceptions, always focus any abstract on substance, and the rest will take care of itself.  + +### Go for it! + +We greatly admire and respect anyone who submits a talk for consideration—it takes a lot of time, thought, and courage. Therefore, we go to great lengths to thank everyone who goes through the process; we give free event passes to everyone who applies (regardless of approval or rejection), and we make every effort to host Q&A sessions to provide as much guidance as possible on the front end. Again, the more time and consideration speakers put into the submission process, the easier the lives of reviewers and organizers. We need to make all of this as easy as possible. + +While this is not a comprehensive list of best practices, it includes some of the things we think people can benefit from knowing before submitting a talk. There are a lot of people out there with more knowledge and experience, so please share your best tips for submitting conference proposals in the comments, so we can all learn from you. + +* * * + +_[All Things Open][2] is a universe of platforms and events focusing on open source, open tech, and the open web. It hosts the [All Things Open conference][3], the largest open source/tech/web event on the US East Coast. The conference regularly hosts thousands of attendees and many of the world's most influential companies from a wide variety of industries and sectors. In 2019, nearly 5,000 people attended from 41 US states and 24 countries. Please direct inquiries about ATO to the team at [info@allthingsopen.org][6]._ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/tips-conference-proposals + +作者:[Todd Lewis][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/toddlewis +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ato2016_checkin_conference.jpg?itok=DJtoSS6t (All Things Open check-in at registration booth) +[2]: https://www.allthingsopen.org/ +[3]: https://2020.allthingsopen.org/ +[4]: https://2020.allthingsopen.org/call-for-speakers +[5]: https://www.allthingsopen.org/what-were-looking-for/ +[6]: mailto:info@allthingsopen.org diff --git a/sources/tech/20200504 Create interactive learning games for kids with open source.md b/sources/tech/20200504 Create interactive learning games for kids with open source.md new file mode 100644 index 0000000000..f6ade34857 --- /dev/null +++ b/sources/tech/20200504 Create interactive learning games for kids with open source.md @@ -0,0 +1,123 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Create interactive learning games for kids with open source) +[#]: via: (https://opensource.com/article/20/5/jclic-games-kids) +[#]: author: (Peter Cheer https://opensource.com/users/petercheer) + +Create interactive learning games for kids with open source +====== +Help your students learn by creating fun puzzles and games in JClic, an +easy Java-based app. +![Family learning and reading together at night in a room][1] + +Schools are closed in many countries around the world to slow the spread of COVID-19. This has suddenly thrown many parents and teachers into homeschooling. Fortunately, there are plenty of educational resources on the internet to use or adapt, although their licenses vary. You can try searching for Creative Commons Open Educational Resources, but if you want to create your own materials, there are many options for that to. + +If you want to create digital educational activities with puzzles or tests, two easy-to-use, open source, cross-platform applications that fit the bill are eXeLearning and JClic. My earlier article on [eXeLearning][2] is a good introduction to that program, so here I'll look at [JClic][3]. It is an open source software project for creating various types of interactive activities such as associations, text-based activities, crosswords, and other puzzles with text, graphics, and multimedia elements. + +Although it's been around since the 1990s, JClic never developed a large user base in the English-speaking world. It was created in Catalonia by the [Catalan Educational Telematic Network][4] (XTEC). + +### About JClic + +JClic is a Java-based application that's available in many Linux repositories and can be downloaded from [GitHub][5]. It runs on Linux, macOS, and Windows, but because it is a Java program, you must have a Java runtime environment [installed][6]. + +The program's interface has not really changed much over the years, even while features have been added or dropped, such as introducing HTML5 export functionality to replace Java Applet technology for web-based deployment. It hasn't needed to change much, though, because it's very effective at what it does. + +### Creating a JClic project + +Many teachers from many countries have used JClic to create interactive materials for a wide variety of ability levels, subjects, languages, and curricula. Some of these materials have been collected in an [downloadable activities library][7]. Although few activities are in English, you can get a sense of the possibilities JClic offers. + +As JClic has a visual, point-and-click program interface, it is easy enough to learn that a new user can quickly concentrate on content creation. [Documentation][8] is available on GitHub. + +The screenshots below are from one of the JClic projects I created to teach basic Excel skills to learners in Papua New Guinea. + +A JClic project is created in its authoring tool and consists of the following four elements: + +#### 1\. Metadata about the project + +![JClic metadata][9] + +#### 2\. A library of the graphical and other resources it uses + +![JClic media][10] + +#### 3\. A series of one or more activities + +![JClic activities][11] + +JClic can produce seven different activity types: + + * Associations where the user discovers the relationships between two information sets + * Memory games where the user discovers pairs of identical elements or relations (which are hidden) between them + * Exploration activities involving the identification and information, based on a single Information set + * Puzzles where the user reconstructs information that is initially presented in a disordered form; the activity can include graphics, text, sound, or a combination of them + * Written-response activities that are solved by writing text, either a single word or a sentence + * Text activities that are based on words, phrases, letters, and paragraphs of text that need to be completed, understood, corrected, or ordered; these activities can contain images and windows with active content + * Word searches and crosswords + + + +Because of variants in the activities, there are 16 possible activity types. + +#### 4\. A timeline to sequence the activities + +![JClic timeline][12] + +### Using JClic content + +Projects can run in JClic's player (part of the Java application you used to create the project), or they can be exported to HTML5 so they can run in a web browser. + +The one thing I don't like about JClic is that its default HTML5 export function assumes you'll be online when running a project. If you want a project to work offline as needed, you must download a compiled and minified HTML5 player from [Github][13], and place it in the same folder as your JClic project. + +Next, open the **index.html** file in a text editor and replace this line: + + +``` +`` +``` + +With: + + +``` +`` +``` + +Now the HTML5 version of your project runs in a web browser, whether the user is online or not. + +JClic also provides a reports function that can store test scores in an ODBC-compliant database. I have not explored this feature, as my tests and puzzles are mostly used for self-assessment and to prompt reflection by the learner, rather than as part of a formal scheme, so the scores are not very important. If you would like to learn about it, there is [documentation][14] on running JClic Reports Server with Tomcat and MySQL (or [mariaDB][15]). + +### Conclusion + +JClic offers a wide range of activity types that provide plenty of room to be creative in designing content to fit your subject area and type of learner. JClic is a valuable addition for anyone who needs a quick and easy way to develop educational resources. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/jclic-games-kids + +作者:[Peter Cheer][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/petercheer +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/family_learning_kids_night_reading.png?itok=6K7sJVb1 (Family learning and reading together at night in a room) +[2]: https://opensource.com/article/18/5/exelearning +[3]: https://clic.xtec.cat/legacy/en/jclic/index.html +[4]: https://clic.xtec.cat/legacy/en/index.html +[5]: https://github.com/projectestac/jclic +[6]: https://adoptopenjdk.net/installation.html +[7]: https://clic.xtec.cat/repo/ +[8]: https://github.com/projectestac/jclic/wiki/JClic_Guide +[9]: https://opensource.com/sites/default/files/uploads/metadata.png (JClic metadata) +[10]: https://opensource.com/sites/default/files/uploads/media.png (JClic media) +[11]: https://opensource.com/sites/default/files/uploads/activities.png (JClic activities) +[12]: https://opensource.com/sites/default/files/uploads/sequence.png (JClic timeline) +[13]: http://projectestac.github.io/jclic.js/ +[14]: https://github.com/projectestac/jclic/wiki/Jclic-Reports-Server-with-Tomcat-and-MySQL-on-Ubuntu +[15]: https://mariadb.org/ diff --git a/sources/tech/20200504 Define and optimize data partitions in Apache Cassandra.md b/sources/tech/20200504 Define and optimize data partitions in Apache Cassandra.md new file mode 100644 index 0000000000..d28f0daee0 --- /dev/null +++ b/sources/tech/20200504 Define and optimize data partitions in Apache Cassandra.md @@ -0,0 +1,150 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Define and optimize data partitions in Apache Cassandra) +[#]: via: (https://opensource.com/article/20/5/apache-cassandra) +[#]: author: (Anil Inamdar https://opensource.com/users/anil-inamdar) + +Define and optimize data partitions in Apache Cassandra +====== +Apache Cassandra is built for speed and scalability; here's how to get +the most out of those benefits. +![Person standing in front of a giant computer screen with numbers, data][1] + +Apache Cassandra is a database. But it's not just any database; it's a replicating database designed and tuned for scalability, high availability, low-latency, and performance. Cassandra can help your data survive regional outages, hardware failure, and what many admins would consider excessive amounts of data. + +Having a thorough command of data partitions enables you to achieve superior Cassandra cluster design, performance, and scalability. In this article, I'll examine how to define partitions and how Cassandra uses them, as well as the most critical best practices and known issues you ought to be aware of. + +To set the scene: partitions are chunks of data that serve as the atomic unit for key database-related functions like data distribution, replication, and indexing. Distributed data systems commonly distribute incoming data into these partitions, performing the partitioning with simple mathematical functions such as identity or hashing, and using a "partition key" to group data by partition. For example, consider a case where server logs arrive as incoming data. Using the "identity" partitioning function and the timestamps of each log (rounded to the hour value) for the partition key, we can partition this data such that each partition holds one hour of the logs. + +### Data partitions in Cassandra + +Cassandra operates as a distributed system and adheres to the data partitioning principles described above. With Cassandra, data partitioning relies on an algorithm configured at the cluster level, and a partition key configured at the table level. + +![Cassandra data partition][2] + +Cassandra Query Language (CQL) uses the familiar SQL table, row, and column terminologies. In the example diagram above, the table configuration includes the partition key within its primary key, with the format: Primary Key = Partition Key + [Clustering Columns]. + +A primary key in Cassandra represents both a unique data partition and a data arrangement inside a partition. Data arrangement information is provided by optional clustering columns. Each unique partition key represents a set of table rows managed in a server, as well as all servers that manage its replicas. + +### Defining primary keys in CQL + +The following four examples demonstrate how a primary key can be represented in CQL syntax. The sets of rows produced by these definitions are generally considered a partition. + +#### Definition 1 (partition key: log_hour, clustering columns: none) + + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP PRIMARYKEY, +   log_level text, +   message text, +   server text +   ) +``` + +Here, all rows that share a **log_hour** go into the same partition. + +#### Definition 2 (partition key: log_hour, clustering columns: log_level) + + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP, +   log_level text, +   message text, +   server text, +   PRIMARY KEY (log_hour, log_level) +   ) +``` + +This definition uses the same partition key as Definition 1, but here all rows in each partition are arranged in ascending order by **log_level**. + +#### Definition 3 (partition key: log_hour, server, clustering columns: none) + + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP, +   log_level text, +   message text, +   server text, +   PRIMARY KEY ((log_hour, server)) +   ) +``` + +In this definition, all rows share a **log_hour** for each distinct **server** as a single partition. + +#### Definition 4 (partition key: log_hour, server, clustering columns: log_level) + + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP, +   log_level text, +   message text, +   server text, +   PRIMARY KEY ((log_hour, server),log_level) +   )WITH CLUSTERING ORDER BY (column3 DESC); +``` + +This definition uses the same partition as Definition 3 but arranges the rows within a partition in descending order by **log_level**. + +### How Cassandra uses the partition key + +Cassandra relies on the partition key to determine which node to store data on and where to locate data when it's needed. Cassandra performs these read and write operations by looking at a partition key in a table, and using tokens (a long value out of range -2^63 to +2^63-1) for data distribution and indexing. These tokens are mapped to partition keys by using a partitioner, which applies a partitioning function that converts any partition key to a token. Through this token mechanism, every node of a Cassandra cluster owns a set of data partitions. The partition key then enables data indexing on each node. + +![Cassandra cluster with 3 nodes and token-based ownership][3] + +A Cassandra cluster with three nodes and token-based ownership. This is a simplistic representation: the actual implementation uses [Vnodes][4]. + +### Data partition impacts on Cassandra clusters + +Careful partition key design is crucial to achieving the ideal partition size for the use case. Getting it right allows for even data distribution and strong I/O performance. Partition size has several impacts on Cassandra clusters you need to be aware of: + + * Read performance—In order to find partitions in SSTables files on disk, Cassandra uses data structures that include caches, indexes, and index summaries. Partitions that are too large reduce the efficiency of maintaining these data structures – and will negatively impact performance as a result. Cassandra releases have made strides in this area: in particular, version 3.6 and above of the Cassandra engine introduce storage improvements that deliver better performance for large partitions and resilience against memory issues and crashes. + * Memory usage— Large partitions place greater pressure on the JVM heap, increasing its size while also making the garbage collection mechanism less efficient. + * Cassandra repairs—Large partitions make it more difficult for Cassandra to perform its repair maintenance operations, which keep data consistent by comparing data across replicas. + * Tombstone eviction—Not as mean as it sounds, Cassandra uses unique markers known as "tombstones" to mark data for deletion. Large partitions can make that deletion process more difficult if there isn't an appropriate data deletion pattern and compaction strategy in place. + + + +While these impacts may make it tempting to simply design partition keys that yield especially small partitions, the data access pattern is also highly influential on ideal partition size (for more information, read this in-depth guide to [Cassandra data modeling][5]). The data access pattern can be defined as how a table is queried, including all of the table's **select** queries. Ideally, CQL select queries should have just one partition key in the **where** clause—that is to say, Cassandra is most efficient when queries can get needed data from a single partition, instead of many smaller ones. + +### Best practices for partition key design + +Following best practices for partition key design helps you get to an ideal partition size. As a rule of thumb, the maximum partition size in Cassandra should stay under 100MB. Ideally, it should be under 10MB. While Cassandra versions 3.6 and newer make larger partition sizes more viable, careful testing and benchmarking must be performed for each workload to ensure a partition key design supports desired cluster performance. + +Specifically, these best practices should be considered as part of any partition key design: + + * The goal for a partition key must be to fit an ideal amount of data into each partition for supporting the needs of its access pattern. + * A partition key should disallow unbounded partitions: those that may grow indefinitely in size over time. For instance, in the **server_logs** examples above, using the server column as a partition key would create unbounded partitions as the number of server logs continues to increase. In contrast, using **log_hour** limits each partition to an hour of data. + * A partition key should also avoid creating a partition skew, in which partitions grow unevenly, and some are able to grow without limit over time. In the **server_logs** examples, using the server column in a scenario where one server generates considerably more logs than others would produce a partition skew. To avoid this, a useful technique is to introduce another attribute from the table to force an even distribution, even if it's necessary to create a dummy column to do so. + * It's helpful to partition time-series data with a partition key that uses a time element as well as other attributes. This protects against unbounded partitions, enables access patterns to use the time attribute in querying specific data, and allows for time-bound data deletion. The examples above each demonstrate this by using the **log_hour** time attribute. + + + +Several tools are available to help test, analyze, and monitor Cassandra partitions to check that a chosen schema is efficient and effective. By carefully designing partition keys to align well with the data and needs of the solution at hand, and following best practices to optimize partition size, you can utilize data partitions that more fully deliver on the scalability and performance potential of a Cassandra deployment. + +Dani and Jon will give a three hour tutorial at OSCON this year called: Becoming friends with... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/apache-cassandra + +作者:[Anil Inamdar][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/anil-inamdar +[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://opensource.com/sites/default/files/uploads/apache_cassandra_1_0.png (Cassandra data partition) +[3]: https://opensource.com/sites/default/files/uploads/apache_cassandra_2_0.png (Cassandra cluster with 3 nodes and token-based ownership) +[4]: https://www.instaclustr.com/cassandra-vnodes-how-many-should-i-use/ +[5]: https://www.instaclustr.com/resource/6-step-guide-to-apache-cassandra-data-modelling-white-paper/ diff --git a/sources/tech/20200504 Understanding systemd at startup on Linux.md b/sources/tech/20200504 Understanding systemd at startup on Linux.md new file mode 100644 index 0000000000..2d0a5ef7b6 --- /dev/null +++ b/sources/tech/20200504 Understanding systemd at startup on Linux.md @@ -0,0 +1,445 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Understanding systemd at startup on Linux) +[#]: via: (https://opensource.com/article/20/5/systemd-startup) +[#]: author: (David Both https://opensource.com/users/dboth) + +Understanding systemd at startup on Linux +====== +systemd's startup provides important clues to help you solve problems +when they occur. +![People at the start line of a race][1] + +In [_Learning to love systemd_][2], the first article in this series, I looked at systemd's functions and architecture and the controversy around its role as a replacement for the old SystemV init program and startup scripts. In this second article, I'll start exploring the files and tools that manage the Linux startup sequence. I'll explain the systemd startup sequence, how to change the default startup target (runlevel in SystemV terms), and how to manually switch to a different target without going through a reboot. + +I'll also look at two important systemd tools. The first is the **systemctl** command, which is the primary means of interacting with and sending commands to systemd. The second is **journalctl**, which provides access to the systemd journals that contain huge amounts of system history data such as kernel and service messages (both informational and error messages). + +Be sure to use a non-production system for testing and experimentation in this and future articles. Your test system needs to have a GUI desktop (such as Xfce, LXDE, Gnome, KDE, or another) installed. + +I wrote in my previous article that I planned to look at creating a systemd unit and adding it to the startup sequence in this article. Because this article became longer than I anticipated, I will hold that for the next article in this series. + +### Exploring Linux startup with systemd + +Before you can observe the startup sequence, you need to do a couple of things to make the boot and startup sequences open and visible. Normally, most distributions use a startup animation or splash screen to hide the detailed messages that would otherwise be displayed during a Linux host's startup and shutdown. This is called the Plymouth boot screen on Red Hat-based distros. Those hidden messages can provide a great deal of information about startup and shutdown to a sysadmin looking for information to troubleshoot a bug or to just learn about the startup sequence. You can change this using the GRUB (Grand Unified Boot Loader) configuration. + +The main GRUB configuration file is **/boot/grub2/grub.cfg**, but, because this file can be overwritten when the kernel version is updated, you do not want to change it. Instead, modify the **/etc/default/grub** file, which is used to modify the default settings of **grub.cfg**. + +Start by looking at the current, unmodified version of the **/etc/default/grub** file: + + +``` +[root@testvm1 ~]# cd /etc/default ; cat grub +GRUB_TIMEOUT=5 +GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" +GRUB_DEFAULT=saved +GRUB_DISABLE_SUBMENU=true +GRUB_TERMINAL_OUTPUT="console" +GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm. +lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_ +testvm1/usr rhgb quiet" +GRUB_DISABLE_RECOVERY="true" +[root@testvm1 default]# +``` + +Chapter 6 of the [GRUB documentation][3] contains a list of all the possible entries in the **/etc/default/grub** file, but I focus on the following: + + * I change **GRUB_TIMEOUT**, the number of seconds for the GRUB menu countdown, from five to 10 to give a bit more time to respond to the GRUB menu before the countdown hits zero. + * I delete the last two parameters on **GRUB_CMDLINE_LINUX**, which lists the command-line parameters that are passed to the kernel at boot time. One of these parameters, **rhgb** stands for Red Hat Graphical Boot, and it displays the little Fedora icon animation during the kernel initialization instead of showing boot-time messages. The other, the **quiet** parameter, prevents displaying the startup messages that document the progress of the startup and any errors that occur. I delete both **rhgb** and **quiet** because sysadmins need to see these messages. If something goes wrong during boot, the messages displayed on the screen can point to the cause of the problem. + + + +After you make these changes, your GRUB file will look like: + + +``` +[root@testvm1 default]# cat grub +GRUB_TIMEOUT=10 +GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" +GRUB_DEFAULT=saved +GRUB_DISABLE_SUBMENU=true +GRUB_TERMINAL_OUTPUT="console" +GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm. +lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_ +testvm1/usr" +GRUB_DISABLE_RECOVERY="false" +[root@testvm1 default]# +``` + +The **grub2-mkconfig** program generates the **grub.cfg** configuration file using the contents of the **/etc/default/grub** file to modify some of the default GRUB settings. The **grub2-mkconfig** program sends its output to **STDOUT**. It has a **-o** option that allows you to specify a file to send the datastream to, but it is just as easy to use redirection. Run the following command to update the **/boot/grub2/grub.cfg** configuration file: + + +``` +[root@testvm1 grub2]# grub2-mkconfig > /boot/grub2/grub.cfg +Generating grub configuration file ... +Found linux image: /boot/vmlinuz-4.18.9-200.fc28.x86_64 +Found initrd image: /boot/initramfs-4.18.9-200.fc28.x86_64.img +Found linux image: /boot/vmlinuz-4.17.14-202.fc28.x86_64 +Found initrd image: /boot/initramfs-4.17.14-202.fc28.x86_64.img +Found linux image: /boot/vmlinuz-4.16.3-301.fc28.x86_64 +Found initrd image: /boot/initramfs-4.16.3-301.fc28.x86_64.img +Found linux image: /boot/vmlinuz-0-rescue-7f12524278bd40e9b10a085bc82dc504 +Found initrd image: /boot/initramfs-0-rescue-7f12524278bd40e9b10a085bc82dc504.img +done +[root@testvm1 grub2]# +``` + +Reboot your test system to view the startup messages that would otherwise be hidden behind the Plymouth boot animation. But what if you need to view the startup messages and have not disabled the Plymouth boot animation? Or you have, but the messages stream by too fast to read? (Which they do.) + +There are a couple of options, and both involve log files and systemd journals—which are your friends. You can use the **less** command to view the contents of the **/var/log/messages** file. This file contains boot and startup messages as well as messages generated by the operating system during normal operation. You can also use the **journalctl** command without any options to view the systemd journal, which contains essentially the same information: + + +``` +[root@testvm1 grub2]# journalctl +\-- Logs begin at Sat 2020-01-11 21:48:08 EST, end at Fri 2020-04-03 08:54:30 EDT. -- +Jan 11 21:48:08 f31vm.both.org kernel: Linux version 5.3.7-301.fc31.x86_64 ([mockbuild@bkernel03.phx2.fedoraproject.org][4]) (gcc version 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC)) #1 SMP Mon Oct > +Jan 11 21:48:08 f31vm.both.org kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.3.7-301.fc31.x86_64 root=/dev/mapper/VG01-root ro resume=/dev/mapper/VG01-swap rd.lvm.lv=VG01/root rd> +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256 +Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format. +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-provided physical RAM map: +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000dffeffff] usable +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000dfff0000-0x00000000dfffffff] ACPI data +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved +Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000100000000-0x000000041fffffff] usable +Jan 11 21:48:08 f31vm.both.org kernel: NX (Execute Disable) protection: active +Jan 11 21:48:08 f31vm.both.org kernel: SMBIOS 2.5 present. +Jan 11 21:48:08 f31vm.both.org kernel: DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 +Jan 11 21:48:08 f31vm.both.org kernel: Hypervisor detected: KVM +Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00 +Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: cpu 0, msr 30ae01001, primary cpu clock +Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: using sched offset of 8250734066 cycles +Jan 11 21:48:08 f31vm.both.org kernel: clocksource: kvm-clock: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns +Jan 11 21:48:08 f31vm.both.org kernel: tsc: Detected 2807.992 MHz processor +Jan 11 21:48:08 f31vm.both.org kernel: e820: update [mem 0x00000000-0x00000fff] usable ==> reserved +Jan 11 21:48:08 f31vm.both.org kernel: e820: remove [mem 0x000a0000-0x000fffff] usable +<snip> +``` + +I truncated this datastream because it can be hundreds of thousands or even millions of lines long. (The journal listing on my primary workstation is 1,188,482 lines long.) Be sure to try this on your test system. If it has been running for some time—even if it has been rebooted many times—huge amounts of data will be displayed. Explore this journal data because it contains a lot of information that can be very useful when doing problem determination. Knowing what this data looks like for a normal boot and startup can help you locate problems when they occur. + +I will discuss systemd journals, the **journalctl** command, and how to sort through all of that data to find what you want in more detail in a future article in this series. + +After GRUB loads the kernel into memory, it must first extract itself from the compressed version of the file before it can perform any useful work. After the kernel has extracted itself and started running, it loads systemd and turns control over to it. + +This is the end of the boot process. At this point, the Linux kernel and systemd are running but unable to perform any productive tasks for the end user because nothing else is running, there's no shell to provide a command line, no background processes to manage the network or other communication links, and nothing that enables the computer to perform any productive function. + +Systemd can now load the functional units required to bring the system up to a selected target run state. + +### Targets + +A systemd target represents a Linux system's current or desired run state. Much like SystemV start scripts, targets define the services that must be present for the system to run and be active in that state. Figure 1 shows the possible run-state targets of a Linux system using systemd. As seen in the first article of this series and in the systemd bootup man page (man bootup), there are other intermediate targets that are required to enable various necessary services. These can include **swap.target**, **timers.target**, **local-fs.target**, and more. Some targets (like **basic.target**) are used as checkpoints to ensure that all the required services are up and running before moving on to the next-higher level target. + +Unless otherwise changed at boot time in the GRUB menu, systemd always starts the **default.target**. The **default.target** file is a symbolic link to the true target file. For a desktop workstation, this is typically going to be the **graphical.target**, which is equivalent to runlevel 5 in SystemV. For a server, the default is more likely to be the **multi-user.target**, which is like runlevel 3 in SystemV. The **emergency.target** file is similar to single-user mode. Targets and services are systemd units. + +The following table, which I included in the previous article in this series, compares the systemd targets with the old SystemV startup runlevels. The systemd target aliases are provided by systemd for backward compatibility. The target aliases allow scripts—and sysadmins—to use SystemV commands like **init 3** to change runlevels. Of course, the SystemV commands are forwarded to systemd for interpretation and execution. + +**systemd targets** | **SystemV runlevel** | **target aliases** | **Description** +---|---|---|--- +default.target | | | This target is always aliased with a symbolic link to either **multi-user.target** or **graphical.target**. systemd always uses the **default.target** to start the system. The **default.target** should never be aliased to **halt.target**, **poweroff.target**, or **reboot.target**. +graphical.target | 5 | runlevel5.target | **Multi-user.target** with a GUI +| 4 | runlevel4.target | Unused. Runlevel 4 was identical to runlevel 3 in the SystemV world. This target could be created and customized to start local services without changing the default **multi-user.target**. +multi-user.target | 3 | runlevel3.target | All services running, but command-line interface (CLI) only +| 2 | runlevel2.target | Multi-user, without NFS, but all other non-GUI services running +rescue.target | 1 | runlevel1.target | A basic system, including mounting the filesystems with only the most basic services running and a rescue shell on the main console +emergency.target | S | | Single-user mode—no services are running; filesystems are not mounted. This is the most basic level of operation with only an emergency shell running on the main console for the user to interact with the system. +halt.target | | | Halts the system without powering it down +reboot.target | 6 | runlevel6.target | Reboot +poweroff.target | 0 | runlevel0.target | Halts the system and turns the power off + +Each target has a set of dependencies described in its configuration file. systemd starts the required dependencies, which are the services required to run the Linux host at a specific level of functionality. When all of the dependencies listed in the target configuration files are loaded and running, the system is running at that target level. If you want, you can review the systemd startup sequence and runtime targets in the first article in this series, [_Learning to love systemd_][2]. + +### Exploring the current target + +Many Linux distributions default to installing a GUI desktop interface so that the installed systems can be used as workstations. I always install from a Fedora Live boot USB drive with an Xfce or LXDE desktop. Even when I'm installing a server or other infrastructure type of host (such as the ones I use for routers and firewalls), I use one of these installations that installs a GUI desktop. + +I could install a server without a desktop (and that would be typical for data centers), but that does not meet my needs. It is not that I need the GUI desktop itself, but the LXDE installation includes many of the other tools I use that are not in a default server installation. This means less work for me after the initial installation. + +But just because I have a GUI desktop does not mean it makes sense to use it. I have a 16-port KVM that I can use to access the KVM interfaces of most of my Linux systems, but the vast majority of my interaction with them is via a remote SSH connection from my primary workstation. This way is more secure and uses fewer system resources to run **multi-user.target** compared to **graphical.target.** + +To begin, check the default target to verify that it is the **graphical.target**: + + +``` +[root@testvm1 ~]# systemctl get-default +graphical.target +[root@testvm1 ~]# +``` + +Now verify the currently running target. It should be the same as the default target. You can still use the old method, which displays the old SystemV runlevels. Note that the previous runlevel is on the left; it is **N** (which means None), indicating that the runlevel has not changed since the host was booted. The number 5 indicates the current target, as defined in the old SystemV terminology: + + +``` +[root@testvm1 ~]# runlevel +N 5 +[root@testvm1 ~]# +``` + +Note that the runlevel man page indicates that runlevels are obsolete and provides a conversion table. + +You can also use the systemd method. There is no one-line answer here, but it does provide the answer in systemd terms: + + +``` +[root@testvm1 ~]# systemctl list-units --type target +UNIT                   LOAD   ACTIVE SUB    DESCRIPTION                 +basic.target           loaded active active Basic System               +cryptsetup.target      loaded active active Local Encrypted Volumes     +getty.target           loaded active active Login Prompts               +graphical.target       loaded active active Graphical Interface         +local-fs-pre.target    loaded active active Local File Systems (Pre)   +local-fs.target        loaded active active Local File Systems         +multi-user.target      loaded active active Multi-User System           +network-online.target  loaded active active Network is Online           +network.target         loaded active active Network                     +nfs-client.target      loaded active active NFS client services         +nss-user-lookup.target loaded active active User and Group Name Lookups +paths.target           loaded active active Paths                       +remote-fs-pre.target   loaded active active Remote File Systems (Pre)   +remote-fs.target       loaded active active Remote File Systems         +rpc_pipefs.target      loaded active active rpc_pipefs.target           +slices.target          loaded active active Slices                     +sockets.target         loaded active active Sockets                     +sshd-keygen.target     loaded active active sshd-keygen.target         +swap.target            loaded active active Swap                       +sysinit.target         loaded active active System Initialization       +timers.target          loaded active active Timers                     + +LOAD   = Reflects whether the unit definition was properly loaded. +ACTIVE = The high-level unit activation state, i.e. generalization of SUB. +SUB    = The low-level unit activation state, values depend on unit type. + +21 loaded units listed. Pass --all to see loaded but inactive units, too. +To show all installed unit files use 'systemctl list-unit-files'. +``` + +This shows all of the currently loaded and active targets. You can also see the **graphical.target** and the **multi-user.target**. The **multi-user.target** is required before the **graphical.target** can be loaded. In this example, the **graphical.target** is active. + +### Switching to a different target + +Making the switch to the **multi-user.target** is easy: + + +``` +`[root@testvm1 ~]# systemctl isolate multi-user.target` +``` + +The display should now change from the GUI desktop or login screen to a virtual console. Log in and list the currently active systemd units to verify that **graphical.target** is no longer running: + + +``` +`[root@testvm1 ~]# systemctl list-units --type target` +``` + +Be sure to use the **runlevel** command to verify that it shows both previous and current "runlevels": + + +``` +[root@testvm1 ~]# runlevel +5 3 +``` + +### Changing the default target + +Now, change the default target to the **multi-user.target** so that it will always boot into the **multi-user.target** for a console command-line interface rather than a GUI desktop interface. As the root user on your test host, change to the directory where the systemd configuration is maintained and do a quick listing: + + +``` +[root@testvm1 ~]# cd /etc/systemd/system/ ; ll +drwxr-xr-x. 2 root root 4096 Apr 25  2018  basic.target.wants +<snip> +lrwxrwxrwx. 1 root root   36 Aug 13 16:23  default.target -> /lib/systemd/system/graphical.target +lrwxrwxrwx. 1 root root   39 Apr 25  2018  display-manager.service -> /usr/lib/systemd/system/lightdm.service +drwxr-xr-x. 2 root root 4096 Apr 25  2018  getty.target.wants +drwxr-xr-x. 2 root root 4096 Aug 18 10:16  graphical.target.wants +drwxr-xr-x. 2 root root 4096 Apr 25  2018  local-fs.target.wants +drwxr-xr-x. 2 root root 4096 Oct 30 16:54  multi-user.target.wants +<snip> +[root@testvm1 system]# +``` + +I shortened this listing to highlight a few important things that will help explain how systemd manages the boot process. You should be able to see the entire list of directories and links on your virtual machine. + +The **default.target** entry is a symbolic link (symlink, soft link) to the directory **/lib/systemd/system/graphical.target**. List that directory to see what else is there: + + +``` +`[root@testvm1 system]# ll /lib/systemd/system/ | less` +``` + +You should see files, directories, and more links in this listing, but look specifically for **multi-user.target** and **graphical.target**. Now display the contents of **default.target**, which is a link to **/lib/systemd/system/graphical.target**: + + +``` +[root@testvm1 system]# cat default.target +#  SPDX-License-Identifier: LGPL-2.1+ +# +#  This file is part of systemd. +# +#  systemd is free software; you can redistribute it and/or modify it +#  under the terms of the GNU Lesser General Public License as published by +#  the Free Software Foundation; either version 2.1 of the License, or +#  (at your option) any later version. + +[Unit] +Description=Graphical Interface +Documentation=man:systemd.special(7) +Requires=multi-user.target +Wants=display-manager.service +Conflicts=rescue.service rescue.target +After=multi-user.target rescue.service rescue.target display-manager.service +AllowIsolate=yes +[root@testvm1 system]# +``` + +This link to the **graphical.target** file describes all of the prerequisites and requirements that the graphical user interface requires. I will explore at least some of these options in the next article in this series. + +To enable the host to boot to multi-user mode, you need to delete the existing link and create a new one that points to the correct target. Make the [PWD][5] **/etc/systemd/system**, if it is not already: + + +``` +[root@testvm1 system]# rm -f default.target +[root@testvm1 system]# ln -s /lib/systemd/system/multi-user.target default.target +``` + +List the **default.target** link to verify that it links to the correct file: + + +``` +[root@testvm1 system]# ll default.target +lrwxrwxrwx 1 root root 37 Nov 28 16:08 default.target -> /lib/systemd/system/multi-user.target +[root@testvm1 system]# +``` + +If your link does not look exactly like this, delete it and try again. List the content of the **default.target** link: + + +``` +[root@testvm1 system]# cat default.target +#  SPDX-License-Identifier: LGPL-2.1+ +# +#  This file is part of systemd. +# +#  systemd is free software; you can redistribute it and/or modify it +#  under the terms of the GNU Lesser General Public License as published by +#  the Free Software Foundation; either version 2.1 of the License, or +#  (at your option) any later version. + +[Unit] +Description=Multi-User System +Documentation=man:systemd.special(7) +Requires=basic.target +Conflicts=rescue.service rescue.target +After=basic.target rescue.service rescue.target +AllowIsolate=yes +[root@testvm1 system]# +``` + +The **default.target**—which is really a link to the **multi-user.target** at this point—now has different requirements in the **[Unit]** section. It does not require the graphical display manager. + +Reboot. Your virtual machine should boot to the console login for virtual console 1, which is identified on the display as tty1. Now that you know how to change the default target, change it back to the **graphical.target** using a command designed for the purpose. + +First, check the current default target: + + +``` +[root@testvm1 ~]# systemctl get-default +multi-user.target +[root@testvm1 ~]# systemctl set-default graphical.target +Removed /etc/systemd/system/default.target. +Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target. +[root@testvm1 ~]# +``` + +Enter the following command to go directly to the **graphical.target** and the display manager login page without having to reboot: + + +``` +`[root@testvm1 system]# systemctl isolate default.target` +``` + +I do not know why the term "isolate" was chosen for this sub-command by systemd's developers. My research indicates that it may refer to running the specified target but "isolating" and terminating all other targets that are not required to support the target. However, the effect is to switch targets from one run target to another—in this case, from the multi-user target to the graphical target. The command above is equivalent to the old init 5 command in SystemV start scripts and the init program. + +Log into the GUI desktop, and verify that it is working as it should. + +### Summing up + +This article explored the Linux systemd startup sequence and started to explore two important systemd tools, **systemctl** and **journalctl**. It also explained how to switch from one target to another and to change the default target. + +The next article in this series will create a new systemd unit and configure it to run during startup. It will also look at some of the configuration options that help determine where in the sequence a particular unit will start, for example, after networking is up and running. + +### Resources + +There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup. + + * The Fedora Project has a good, practical [guide][6] [to systemd][6]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd. + * The Fedora Project also has a good [cheat sheet][7] that cross-references the old SystemV commands to comparable systemd ones. + * For detailed technical information about systemd and the reasons for creating it, check out [Freedesktop.org][8]'s [description of systemd][9]. + * [Linux.com][10]'s "More systemd fun" offers more advanced systemd [information and tips][11]. + + + +There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers. + + * [Rethinking PID 1][12] + * [systemd for Administrators, Part I][13] + * [systemd for Administrators, Part II][14] + * [systemd for Administrators, Part III][15] + * [systemd for Administrators, Part IV][16] + * [systemd for Administrators, Part V][17] + * [systemd for Administrators, Part VI][18] + * [systemd for Administrators, Part VII][19] + * [systemd for Administrators, Part VIII][20] + * [systemd for Administrators, Part IX][21] + * [systemd for Administrators, Part X][22] + * [systemd for Administrators, Part XI][23] + + + +Alison Chiaken, a Linux kernel and systems programmer at Mentor Graphics, offers a preview of her... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/systemd-startup + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/start_line.jpg?itok=9reaaW6m (People at the start line of a race) +[2]: https://opensource.com/article/20/4/systemd +[3]: http://www.gnu.org/software/grub/manual/grub +[4]: mailto:mockbuild@bkernel03.phx2.fedoraproject.org +[5]: https://en.wikipedia.org/wiki/Pwd +[6]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[7]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[8]: http://Freedesktop.org +[9]: http://www.freedesktop.org/wiki/Software/systemd +[10]: http://Linux.com +[11]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[12]: http://0pointer.de/blog/projects/systemd.html +[13]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[14]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[15]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[16]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[17]: http://0pointer.de/blog/projects/three-levels-of-off.html +[18]: http://0pointer.de/blog/projects/changing-roots +[19]: http://0pointer.de/blog/projects/blame-game.html +[20]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[21]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[22]: http://0pointer.de/blog/projects/instances.html +[23]: http://0pointer.de/blog/projects/inetd.html diff --git a/sources/tech/20200505 8 open source video games to play.md b/sources/tech/20200505 8 open source video games to play.md new file mode 100644 index 0000000000..ac0577d96b --- /dev/null +++ b/sources/tech/20200505 8 open source video games to play.md @@ -0,0 +1,116 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (8 open source video games to play) +[#]: via: (https://opensource.com/article/20/5/open-source-fps-games) +[#]: author: (Aman Gaur https://opensource.com/users/amangaur) + +8 open source video games to play +====== +These games are fun and free to play, a way to connect with friends, and +an opportunity to make an old favorite even better. +![Gaming on a grid with penguin pawns][1] + +Video games are a big business. That's great for the industry's longevity—not to mention for all the people working in programming and graphics. But it can take a lot of work, time, and money to keep up with all the latest gaming crazes. If you feel like playing a few quick rounds of a video game without investing in a new console or game franchise, then you'll be happy to know that there are plenty of open source combat games you can download, play, share, and even modify (if you're inclined to programming) for free. + +First-person shooters (FPS) are one of the most popular categories of video games. They are centered around the perspective of the protagonist (the player), and they often offer weapon-based advancement. As you get better at the game, you survive longer, you get better weapons, and you increase your power. FPS games have a distinct look and feel, which is reflected in the category's name: players see everything—their weapons and the game world—in first person, as if they're looking through their player character's eyes. + +If you want to give one a try, check out the following eight great open source FPS games. + +### Xonotic + +![Xonotic][2] + +[Xonotic][3] is a fast-paced, arena-based FPS game. It is a popular game in the open source world. One reason could be the fact that it has never been a mainstream game. It offers a variety of weapons and enemies that are thrown right at you mercilessly from the start. Demanding quick action and response, it is an experience that will keep you on the edge of your seats. The game is available under the GPLv3+ license. + +### Wolfenstein Enemy Territory + +![Wolfenstein Enemy Territory][4] + +Wolfenstein has been a major franchise in gaming for many years. If you are a fan of gore and glory, then you've probably already heard of this game (if not, you'll love it once you try it). [Wolfenstein Enemy Territory][5] is an early iteration of the popular World War II game. It became free to play in 2003, and its [source code][6] is provided under the GPLv3. To play, however, you must own the game data (or recreate it yourself) separately (which remains under its original EULA). + +### Doom + +![Doom][7] + +[Doom][8] is a wildly popular game that was also an early example of games on Linux—way back in 2004. There are many iterations of the game, many of which have been released as open source. The game is about acquiring a teleportation device that's been captured by demons, so the violence, while gory, is low on realism. The source code for the game was provided under the GPL, but many versions require that you own the game for the game assets. There are dozens of ports and adaptations, including [Freedoom][9] (with free assets), [Dhewm3][10], [RBDoom-3-BFG][11], and many more. Try a few and pick your favorite! + +### Smokin' Guns + +![Smokin' Guns][12] + +If you're a fan of the Old West and six-shooters, this FPS is for you. From cowboys to gunslingers and with a captivating background score, [Smokin' Guns][13] has it all. It's a semi-realistic simulation of the old spaghetti western. On your way through the game, you face multiple enemies and get multiple weapons, so there's always the promise of excitement and danger around the corner. The game is free and open source under the terms of the GPLv2. + +### Nexuiz + +![Nexuiz][14] + +[Nexuiz][15] (classic) is another great FPS that's free to play on multiple platforms. The game is based on the Quake engine and has been made open source under the GNU GPLv2. The game offers multiple modes, including online, LAN party, and bot training. The game features sophisticated weapons and fast action. It's brutal and exciting, with an objective: kill as many opponents as possible before they get you. + +Note that the open source version of Nexuiz is not the same as the version built on CryEngine3 that is sold on Steam. + +### .kkrieger + +![kkrieger][16] + +[.Kkrieger][17] was developed in 2004 by .theprodukkt, a German demogroup. The game was developed using an unreleased (at the time) engine known as Werkkzeug. This game might feel a little slow to many, but it still offers an intense experience. The approaching enemies are slow, but their sheer number makes it confusing to know which one to take down first. It's an onslaught, and you have to shoot through layers of enemies before you reach the final boss. It was released in a rather raw form on [GitHub][18] by its creators under a BSD license with some public domain components. + +### Warsow + +![Warsow][19] + +If you've ever played Borderlands 2, then imagine [Warsow][20] as an arena-style Borderlands. The game is built on a modernized Quake II engine, and its plot takes a simple approach: Kill as many opponents as possible. The team with the most number of kills wins. Despite its simplicity, it features amazing weaponry and lots of great trick moves, like circle jumping, bunny hopping, double jumping, ramp sliding, and so on. It makes for an engaging multiplayer session, and it's been recognized by multiple online leagues as a worthy game for their competitions. Get the source code from [GitHub][21] or install the game from your software repository. + +### World of Padman + +![World of Padman][22] + +[The World of Padman][23] may be the last game on this list, but it's one of the most unique. Designed by PadWorld Entertainment, World of Padman takes a different twist graphically and introduces you to quirky and whimsical characters in a colorful (albeit cartoonishly violent) world. It's based on the ioquake3 engine, and its unique style and uproarious gameplay have earned it a featured place in multiple gaming magazines. You can download the source code from [GitHub][24]. + +### Give one a shot + +A game that becomes open source can act as a template for something great, whether it's a wholly open source version of an old classic, a remix of a beloved game, or an entirely new platform built on an old reliable engine. + +Open source gaming is important for many reasons: it provides users with a fun diversion, a way to connect with friends, and an opportunity for programmers and designers to hack within an existing framework. If titles like Doom weren't made open source, a little bit of video game history would be lost. Instead, it endures and has the opportunity to grow even more. + +Try an open source game, and watch your six. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/open-source-fps-games + +作者:[Aman Gaur][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/amangaur +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/game_pawn_grid_linux.png?itok=4gERzRkg (Gaming on a grid with penguin pawns) +[2]: https://opensource.com/sites/default/files/uploads/xonotic.jpg (Xonotic) +[3]: https://www.xonotic.org/download/ +[4]: https://opensource.com/sites/default/files/uploads/wolfensteinenemyterritory.jpg (Wolfenstein Enemy Territory) +[5]: https://www.splashdamage.com/games/wolfenstein-enemy-territory/ +[6]: https://github.com/id-Software/Enemy-Territory +[7]: https://opensource.com/sites/default/files/uploads/doom.jpg (Doom) +[8]: https://github.com/id-Software/DOOM +[9]: https://freedoom.github.io/ +[10]: https://dhewm3.org/ +[11]: https://github.com/RobertBeckebans/RBDOOM-3-BFG/ +[12]: https://opensource.com/sites/default/files/uploads/smokinguns.jpg (Smokin' Guns) +[13]: https://www.smokin-guns.org/downloads +[14]: https://opensource.com/sites/default/files/uploads/nexuiz.jpg (Nexuiz) +[15]: https://sourceforge.net/projects/nexuiz/ +[16]: https://opensource.com/sites/default/files/uploads/kkrieger.jpg (kkrieger) +[17]: https://web.archive.org/web/20120204065621/http://www.theprodukkt.com/kkrieger +[18]: https://github.com/farbrausch/fr_public +[19]: https://opensource.com/sites/default/files/uploads/warsow.jpg (Warsow) +[20]: https://www.warsow.net/download +[21]: https://github.com/Warsow +[22]: https://opensource.com/sites/default/files/uploads/padman.jpg (World of Padman) +[23]: https://worldofpadman.net/en/ +[24]: https://github.com/PadWorld-Entertainment diff --git a/sources/tech/20200505 Analyzing data science code with R and Emacs.md b/sources/tech/20200505 Analyzing data science code with R and Emacs.md new file mode 100644 index 0000000000..ebcfadbe92 --- /dev/null +++ b/sources/tech/20200505 Analyzing data science code with R and Emacs.md @@ -0,0 +1,133 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Analyzing data science code with R and Emacs) +[#]: via: (https://opensource.com/article/20/5/r-emacs-data-science) +[#]: author: (Peter Prevos https://opensource.com/users/danderzei) + +Analyzing data science code with R and Emacs +====== +Emacs' versatility and extensibility bring the editor's full power into +play for writing data science code. +![metrics and data shown on a computer screen][1] + +Way back in 2012, _Harvard Business Review_ published an article that proclaimed "data scientist" to be the [sexiest job][2] of the 21st century. Interest in data science has exploded since then. Many great open source projects, such as [Python][3] and the [R language][4] for statistical computing, have facilitated the rapid developments in how we analyze data. + +I started my career using pencil and paper and moved to spreadsheets. Now the R language is my weapon of choice when I need to create value from data. Emacs is another one of my favorite tools. This article briefly explains how to use the [Emacs Speaks Statistics][5] (ESS) package to get started with developing R projects in this venerable editor. + +The vast majority of R developers use the [RStudio][6] IDE to manage their projects. RStudio is a powerful open source editor with specialized functionality to develop data science projects. RStudio is a great integrated development environment (IDE), but its editing functions are limited. + +Using Emacs to write data science code means that you have access to the full power of this extensible editor. I prefer using Emacs for my data science projects because I can do many other tasks within the same application, leveraging the multifunctionality of this venerable editor. If you are just getting started with Emacs, then please first read Seth Kenlon's [Emacs getting started][7] article. + +### Setting up Emacs for R + +Emacs is an almost infinitely extensible text editor, which unfortunately means that many things don't work the way you want them to out of the box. Before you can write and execute R scripts, you need to install some packages and configure them. The ESS package provides an interface between Emacs and R. Other packages, such as [Company][8] and [highlight-parentheses][9] help with completion and balancing parentheses. + +Emacs uses a version of Lisp for configuration. The lines of [Emacs Lisp][10] code below install the required extensions and define a minimal configuration to get you started. These lines were tested for GNU Emacs version 26.3. + +Copy these lines and save them in a file named **init.el** in your **.emacs.d** folder. This is the folder that Emacs uses to store configurations, including the [init file][11]. If you already have an init file, then you can append these lines to your config. This minimal configuration is enough to get you started. + + +``` +;; Elisp file for R coding with Emacs + +;; Add MELPA repository and initialise the package manager +(require 'package) +(add-to-list 'package-archives +             '("melpa" . "")) +(package-initialize) + +;; Install use-package,in case it does not exist yet +;; The use-package software will install all other packages as required +(unless (package-installed-p 'use-package) +  (package-refresh-contents) +  (package-install 'use-package)) + +;; ESS configurationEmacs Speaks Statistics +(use-package ess +  :ensure t +) + +;; Auto completion +(use-package company +  :ensure t +  :config +  (setq company-idle-delay 0) +  (setq company-minimum-prefix-length 2) +  (global-company-mode t) +) + +; Parentheses +(use-package highlight-parentheses +  :ensure t +  :config +  (progn +    (highlight-parentheses-mode) +    (global-highlight-parentheses-mode)) +  ) +``` + +### Using the R console + +To start an R console session, press **M-x R** and hit **Enter** (**M** is the Emacs way to denote the **Alt** or **Command** key). ESS will ask you to nominate a working directory, which defaults to the folder of the current buffer. You can use more than one console in the same Emacs session by repeating the R command. + +Emacs opens a new buffer for your new R console. You can also use the **Up** and **Down** arrow keys to go to previous lines and re-run them. Use the **Ctrl** and **Up/Down** arrow keys to recycle old commands. + +The Company ("complete anything") package manages autocompletion in both the console and R scripts. When entering a function, the mini-buffer at the bottom of the screen shows the relevant parameters. When the autocompletion dropdown menu appears, you can press **F1** to view the chosen option's Help file before you select it. + +The [highlight-parentheses][9] package does what its name suggests. Several other Emacs packages are available to help you balance parentheses and other structural elements in your code. + +### Writing R scripts + +Emacs recognizes R mode for any buffer with a **.R** extension (the file extension is case-sensitive). Open or create a new file with the **C-x C-f** shortcut and type the path and file name. You can start writing your code and use all of the powerful editing techniques that Emacs provides. + +Several functions are available to evaluate the code. You can evaluate each line separately with **C-<return>**, while **C-c C-c** will evaluate a contiguous region. Keying **C-c C-b** will evaluate the whole buffer. + +When you evaluate some code, Emacs will use any running console or ask you to open a new console to run the code. + +The output of any plotting functions appears in a window outside of Emacs. If you prefer to view the output within Emacs, then you need to save the output to disk and open the resulting file in a separate buffer. + +![Literate programming in Org mode, the ESS buffer, and graphics output.][12] + +Literate programming in Org mode, the ESS buffer, and graphics output. + +### Advanced use + +This article provides a brief introduction to using R in Emacs. Many parameters can be fine-tuned to make Emacs behave according to your preferences, but it would take too much space to cover them here. The [ESS manual][13] describes these in detail. You can also extend functionality with additional packages. + +Org mode can integrate R code, providing a productive platform for literate programming. If you prefer to use RMarkdown, the [Polymode][14] package has you covered. + +Emacs has various packages to make your editing experience more efficient. The best part of using Emacs to write R code is that the program is more than just an IDE; it is a malleable computer system that you can configure to match your favorite workflow. + +Learning how to configure Emacs can be daunting. The best way to learn quickly is to copy ideas from people who share their configurations. Miles McBain manages a [list of Emacs configurations][15] that could be useful if you want to explore using the R language in Emacs further. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/r-emacs-data-science + +作者:[Peter Prevos][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/danderzei +[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://hbr.org/2012/10/data-scientist-the-sexiest-job-of-the-21st-century +[3]: https://www.python.org/ +[4]: https://www.r-project.org/ +[5]: https://ess.r-project.org/ +[6]: https://opensource.com/article/18/2/getting-started-RStudio-IDE +[7]: https://opensource.com/article/20/3/getting-started-emacs +[8]: https://company-mode.github.io/ +[9]: https://github.com/tsdh/highlight-parentheses.el +[10]: https://en.wikipedia.org/wiki/Emacs_Lisp +[11]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-File.html +[12]: https://opensource.com/sites/default/files/uploads/r-ess-screenshot.jpg (Literate programming in Org mode, the ESS buffer, and graphics output.) +[13]: https://ess.r-project.org/index.php?Section=documentation&subSection=manuals +[14]: https://github.com/polymode/polymode +[15]: https://github.com/MilesMcBain/esscss diff --git a/sources/tech/20200507 Using the systemctl command to manage systemd units.md b/sources/tech/20200507 Using the systemctl command to manage systemd units.md new file mode 100644 index 0000000000..e305cee36c --- /dev/null +++ b/sources/tech/20200507 Using the systemctl command to manage systemd units.md @@ -0,0 +1,618 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Using the systemctl command to manage systemd units) +[#]: via: (https://opensource.com/article/20/5/systemd-units) +[#]: author: (David Both https://opensource.com/users/dboth) + +Using the systemctl command to manage systemd units +====== +Units are the basis of everything in systemd. +![woman on laptop sitting at the window][1] + +In the first two articles in this series, I explored the Linux systemd startup sequence. In the [first article][2], I looked at systemd's functions and architecture and the controversy around its role as a replacement for the old SystemV init program and startup scripts. And in the [second article][3], I examined two important systemd tools, systemctl and journalctl, and explained how to switch from one target to another and to change the default target. + +In this third article, I'll look at systemd units in more detail and how to use the systemctl command to explore and manage units. I'll also explain how to stop and disable units and how to create a new systemd mount unit to mount a new filesystem and enable it to initiate during startup. + +### Preparation + +All of the experiments in this article should be done as the root user (unless otherwise specified). Some of the commands that simply list various systemd units can be performed by non-root users, but the commands that make changes cannot. Make sure to do all of these experiments only on non-production hosts or virtual machines (VMs). + +One of these experiments requires the sysstat package, so install it before you move on. For Fedora and other Red Hat-based distributions you can install sysstat with: + + +``` +`dnf -y install sysstat` +``` + +The sysstat RPM installs several statistical tools that can be used for problem determination. One is [System Activity Report][4] (SAR), which records many system performance data points at regular intervals (every 10 minutes by default). Rather than run as a daemon in the background, the sysstat package installs two systemd timers. One timer runs every 10 minutes to collect data, and the other runs once a day to aggregate the daily data. In this article, I will look briefly at these timers but wait to explain how to create a timer in a future article. + +### systemd suite + +The fact is, systemd is more than just one program. It is a large suite of programs all designed to work together to manage nearly every aspect of a running Linux system. A full exposition of systemd would take a book on its own. Most of us do not need to understand all of the details about how all of systemd's components fit together, so I will focus on the programs and components that enable you to manage various Linux services and deal with log files and journals. + +### Practical structure + +The structure of systemd—outside of its executable files—is contained in its many configuration files. Although these files have different names and identifier extensions, they are all called "unit" files. Units are the basis of everything systemd. + +Unit files are ASCII plain-text files that are accessible to and can be created or modified by a sysadmin. There are a number of unit file types, and each has its own man page. Figure 1 lists some of these unit file types by their filename extensions and a short description of each. + +systemd unit | Description +---|--- +.automount | The **.automount** units are used to implement on-demand (i.e., plug and play) and mounting of filesystem units in parallel during startup. +.device | The **.device** unit files define hardware and virtual devices that are exposed to the sysadmin in the **/dev/directory**. Not all devices have unit files; typically, block devices such as hard drives, network devices, and some others have unit files. +.mount | The **.mount** unit defines a mount point on the Linux filesystem directory structure. +.scope | The **.scope** unit defines and manages a set of system processes. This unit is not configured using unit files, rather it is created programmatically. Per the **systemd.scope** man page, “The main purpose of scope units is grouping worker processes of a system service for organization and for managing resources.” +.service | The **.service** unit files define processes that are managed by systemd. These include services such as crond cups (Common Unix Printing System), iptables, multiple logical volume management (LVM) services, NetworkManager, and more. +.slice | The **.slice** unit defines a “slice,” which is a conceptual division of system resources that are related to a group of processes. You can think of all system resources as a pie and this subset of resources as a “slice” out of that pie. +.socket | The **.socket** units define interprocess communication sockets, such as network sockets. +.swap | The **.swap** units define swap devices or files. +.target | The **.target** units define groups of unit files that define startup synchronization points, runlevels, and services. Target units define the services and other units that must be active in order to start successfully. +.timer | The **.timer** unit defines timers that can initiate program execution at specified times. + +### systemctl + +I looked at systemd's startup functions in the [second article][3], and here I'll explore its service management functions a bit further. systemd provides the **systemctl** command that is used to start and stop services, configure them to launch (or not) at system startup, and monitor the current status of running services. + +In a terminal session as the root user, ensure that root's home directory ( **~** ) is the [PWD][5]. To begin looking at units in various ways, list all of the loaded and active systemd units. systemctl automatically pipes its [stdout][6] data stream through the **less** pager, so you don't have to: + + +``` +[root@testvm1 ~]# systemctl +UNIT                                       LOAD   ACTIVE SUB       DESCRIPTION               +proc-sys-fs-binfmt_misc.automount          loaded active running   Arbitrary Executable File> +sys-devices-pci0000:00-0000:00:01.1-ata7-host6-target6:0:0-6:0:0:0-block-sr0.device loaded a> +sys-devices-pci0000:00-0000:00:03.0-net-enp0s3.device loaded active plugged   82540EM Gigabi> +sys-devices-pci0000:00-0000:00:05.0-sound-card0.device loaded active plugged   82801AA AC'97> +sys-devices-pci0000:00-0000:00:08.0-net-enp0s8.device loaded active plugged   82540EM Gigabi> +sys-devices-pci0000:00-0000:00:0d.0-ata1-host0-target0:0:0-0:0:0:0-block-sda-sda1.device loa> +sys-devices-pci0000:00-0000:00:0d.0-ata1-host0-target0:0:0-0:0:0:0-block-sda-sda2.device loa> +<snip – removed lots of lines of data from here> + +LOAD   = Reflects whether the unit definition was properly loaded. +ACTIVE = The high-level unit activation state, i.e. generalization of SUB. +SUB    = The low-level unit activation state, values depend on unit type. + +206 loaded units listed. Pass --all to see loaded but inactive units, too. +To show all installed unit files use 'systemctl list-unit-files'. +``` + +As you scroll through the data in your terminal session, look for some specific things. The first section lists devices such as hard drives, sound cards, network interface cards, and TTY devices. Another section shows the filesystem mount points. Other sections include various services and a list of all loaded and active targets. + +The sysstat timers at the bottom of the output are used to collect and generate daily system activity summaries for SAR. SAR is a very useful problem-solving tool. (You can learn more about it in Chapter 13 of my book [_Using and Administering Linux: Volume 1, Zero to SysAdmin: Getting Started_][7].) + +Near the very bottom, three lines describe the meanings of the statuses (loaded, active, and sub). Press **q** to exit the pager. + +Use the following command (as suggested in the last line of the output above) to see all the units that are installed, whether or not they are loaded. I won't reproduce the output here, because you can scroll through it on your own. The systemctl program has an excellent tab-completion facility that makes it easy to enter complex commands without needing to memorize all the options: + + +``` +`[root@testvm1 ~]# systemctl list-unit-files` +``` + +You can see that some units are disabled. Table 1 in the man page for systemctl lists and provides short descriptions of the entries you might see in this listing. Use the **-t** (type) option to view just the timer units: + + +``` +[root@testvm1 ~]# systemctl list-unit-files -t timer +UNIT FILE                    STATE   +[chrony-dnssrv@.timer][8]         disabled +dnf-makecache.timer          enabled +fstrim.timer                 disabled +logrotate.timer              disabled +logwatch.timer               disabled +[mdadm-last-resort@.timer][9]     static   +mlocate-updatedb.timer       enabled +sysstat-collect.timer        enabled +sysstat-summary.timer        enabled +systemd-tmpfiles-clean.timer static   +unbound-anchor.timer         enabled +``` + +You could do the same thing with this alternative, which provides considerably more detail: + + +``` +[root@testvm1 ~]# systemctl list-timers +Thu 2020-04-16 09:06:20 EDT  3min 59s left n/a                          n/a           systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service +Thu 2020-04-16 10:02:01 EDT  59min left    Thu 2020-04-16 09:01:32 EDT  49s ago       dnf-makecache.timer          dnf-makecache.service +Thu 2020-04-16 13:00:00 EDT  3h 57min left n/a                          n/a           sysstat-collect.timer        sysstat-collect.service +Fri 2020-04-17 00:00:00 EDT  14h left      Thu 2020-04-16 12:51:37 EDT  3h 49min left mlocate-updatedb.timer       mlocate-updatedb.service +Fri 2020-04-17 00:00:00 EDT  14h left      Thu 2020-04-16 12:51:37 EDT  3h 49min left unbound-anchor.timer         unbound-anchor.service +Fri 2020-04-17 00:07:00 EDT  15h left      n/a                          n/a           sysstat-summary.timer        sysstat-summary.service + +6 timers listed. +Pass --all to see loaded but inactive timers, too. +[root@testvm1 ~]# +``` + +Although there is no option to do systemctl list-mounts, you can list the mount point unit files: + + +``` +[root@testvm1 ~]# systemctl list-unit-files -t mount +UNIT FILE                     STATE     +-.mount                       generated +boot.mount                    generated +dev-hugepages.mount           static   +dev-mqueue.mount              static   +home.mount                    generated +proc-fs-nfsd.mount            static   +proc-sys-fs-binfmt_misc.mount disabled +run-vmblock\x2dfuse.mount     disabled +sys-fs-fuse-connections.mount static   +sys-kernel-config.mount       static   +sys-kernel-debug.mount        static   +tmp.mount                     generated +usr.mount                     generated +var-lib-nfs-rpc_pipefs.mount  static   +var.mount                     generated + +15 unit files listed. +[root@testvm1 ~]# +``` + +The STATE column in this data stream is interesting and requires a bit of explanation. The "generated" states indicate that the mount unit was generated on the fly during startup using the information in **/etc/fstab**. The program that generates these mount units is **/lib/systemd/system-generators/systemd-fstab-generator,** along with other tools that generate a number of other unit types. The "static" mount units are for filesystems like **/proc** and **/sys**, and the files for these are located in the **/usr/lib/systemd/system** directory. + +Now, look at the service units. This command will show all services installed on the host, whether or not they are active: + + +``` +`[root@testvm1 ~]# systemctl --all -t service` +``` + +The bottom of this listing of service units displays 166 as the total number of loaded units on my host. Your number will probably differ. + +Unit files do not have a filename extension (such as **.unit**) to help identify them, so you can generalize that most configuration files that belong to systemd are unit files of one type or another. The few remaining files are mostly **.conf** files located in **/etc/systemd**. + +Unit files are stored in the **/usr/lib/systemd** directory and its subdirectories, while the **/etc/systemd/** directory and its subdirectories contain symbolic links to the unit files necessary to the local configuration of this host. + +To explore this, make **/etc/systemd** the PWD and list its contents. Then make **/etc/systemd/system** the PWD and list its contents, and list the contents of at least a couple of the current PWD's subdirectories. + +Take a look at the **default.target** file, which determines which runlevel target the system will boot to. In the second article in this series, I explained how to change the default target from the GUI (**graphical.target**) to the command-line only (**multi-user.target**) target. The **default.target** file on my test VM is simply a symlink to **/usr/lib/systemd/system/graphical.target**. + +Take a few minutes to examine the contents of the **/etc/systemd/system/default.target** file: + + +``` +[root@testvm1 system]# cat default.target +#  SPDX-License-Identifier: LGPL-2.1+ +# +#  This file is part of systemd. +# +#  systemd is free software; you can redistribute it and/or modify it +#  under the terms of the GNU Lesser General Public License as published by +#  the Free Software Foundation; either version 2.1 of the License, or +#  (at your option) any later version. + +[Unit] +Description=Graphical Interface +Documentation=man:systemd.special(7) +Requires=multi-user.target +Wants=display-manager.service +Conflicts=rescue.service rescue.target +After=multi-user.target rescue.service rescue.target display-manager.service +AllowIsolate=yes +``` + +Note that this requires the **multi-user.target**; the **graphical.target** cannot start if the **multi-user.target** is not already up and running. It also says it "wants" the **display-manager.service** unit. A "want" does not need to be fulfilled in order for the unit to start successfully. If the "want" cannot be fulfilled, it will be ignored by systemd, and the rest of the target will start regardless. + +The subdirectories in **/etc/systemd/system** are lists of wants for various targets. Take a few minutes to explore the files and their contents in the **/etc/systemd/system/graphical.target.wants** directory. + +The **systemd.unit** man page contains a lot of good information about unit files, their structure, the sections they can be divided into, and the options that can be used. It also lists many of the unit types, all of which have their own man pages. If you want to interpret a unit file, this would be a good place to start. + +### Service units + +A Fedora installation usually installs and enables services that particular hosts do not need for normal operation. Conversely, sometimes it doesn't include services that need to be installed, enabled, and started. Services that are not needed for the Linux host to function as desired, but which are installed and possibly running, represent a security risk and should—at minimum—be stopped and disabled and—at best—should be uninstalled. + +The systemctl command is used to manage systemd units, including services, targets, mounts, and more. Take a closer look at the list of services to identify services that will never be used: + + +``` +[root@testvm1 ~]# systemctl --all -t service +UNIT                           LOAD      ACTIVE SUB        DESCRIPTION                             +<snip> +chronyd.service                loaded    active running    NTP client/server                       +crond.service                  loaded    active running    Command Scheduler                       +cups.service                   loaded    active running    CUPS Scheduler                           +dbus-daemon.service            loaded    active running    D-Bus System Message Bus                 +<snip> +● ip6tables.service           not-found inactive dead     ip6tables.service                   +● ipset.service               not-found inactive dead     ipset.service                       +● iptables.service            not-found inactive dead     iptables.service                     +<snip> +firewalld.service              loaded    active   running  firewalld - dynamic firewall daemon +<snip> +● ntpd.service                not-found inactive dead     ntpd.service                         +● ntpdate.service             not-found inactive dead     ntpdate.service                     +pcscd.service                  loaded    active   running  PC/SC Smart Card Daemon +``` + +I have pruned out most of the output from the command to save space. The services that show "loaded active running" are obvious. The "not-found" services are ones that systemd is aware of but are not installed on the Linux host. If you want to run those services, you must install the packages that contain them. + +Note the **pcscd.service** unit. This is the PC/SC smart-card daemon. Its function is to communicate with smart-card readers. Many Linux hosts—including VMs—have no need for this reader nor the service that is loaded and taking up memory and CPU resources. You can stop this service and disable it, so it will not restart on the next boot. First, check its status: + + +``` +[root@testvm1 ~]# systemctl status pcscd.service +● pcscd.service - PC/SC Smart Card Daemon +   Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; vendor preset: disabled) +   Active: active (running) since Fri 2019-05-10 11:28:42 EDT; 3 days ago +     Docs: man:pcscd(8) + Main PID: 24706 (pcscd) +    Tasks: 6 (limit: 4694) +   Memory: 1.6M +   CGroup: /system.slice/pcscd.service +           └─24706 /usr/sbin/pcscd --foreground --auto-exit + +May 10 11:28:42 testvm1 systemd[1]: Started PC/SC Smart Card Daemon. +``` + +This data illustrates the additional information systemd provides versus SystemV, which only reports whether or not the service is running. Note that specifying the **.service** unit type is optional. Now stop and disable the service, then re-check its status: + + +``` +[root@testvm1 ~]# systemctl stop pcscd ; systemctl disable pcscd +Warning: Stopping pcscd.service, but it can still be activated by: +  pcscd.socket +Removed /etc/systemd/system/sockets.target.wants/pcscd.socket. +[root@testvm1 ~]# systemctl status pcscd +● pcscd.service - PC/SC Smart Card Daemon +   Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; vendor preset: disabled) +   Active: failed (Result: exit-code) since Mon 2019-05-13 15:23:15 EDT; 48s ago +     Docs: man:pcscd(8) + Main PID: 24706 (code=exited, status=1/FAILURE) + +May 10 11:28:42 testvm1 systemd[1]: Started PC/SC Smart Card Daemon. +May 13 15:23:15 testvm1 systemd[1]: Stopping PC/SC Smart Card Daemon... +May 13 15:23:15 testvm1 systemd[1]: pcscd.service: Main process exited, code=exited, status=1/FAIL> +May 13 15:23:15 testvm1 systemd[1]: pcscd.service: Failed with result 'exit-code'. +May 13 15:23:15 testvm1 systemd[1]: Stopped PC/SC Smart Card Daemon. +``` + +The short log entry display for most services prevents having to search through various log files to locate this type of information. Check the status of the system runlevel targets—specifying the "target" unit type is required: + + +``` +[root@testvm1 ~]# systemctl status multi-user.target +● multi-user.target - Multi-User System +   Loaded: loaded (/usr/lib/systemd/system/multi-user.target; static; vendor preset: disabled) +   Active: active since Thu 2019-05-09 13:27:22 EDT; 4 days ago +     Docs: man:systemd.special(7) + +May 09 13:27:22 testvm1 systemd[1]: Reached target Multi-User System. +[root@testvm1 ~]# systemctl status graphical.target +● graphical.target - Graphical Interface +   Loaded: loaded (/usr/lib/systemd/system/graphical.target; indirect; vendor preset: disabled) +   Active: active since Thu 2019-05-09 13:27:22 EDT; 4 days ago +     Docs: man:systemd.special(7) + +May 09 13:27:22 testvm1 systemd[1]: Reached target Graphical Interface. +[root@testvm1 ~]# systemctl status default.target +● graphical.target - Graphical Interface +   Loaded: loaded (/usr/lib/systemd/system/graphical.target; indirect; vendor preset: disabled) +   Active: active since Thu 2019-05-09 13:27:22 EDT; 4 days ago +     Docs: man:systemd.special(7) + +May 09 13:27:22 testvm1 systemd[1]: Reached target Graphical Interface. +``` + +The default target is the graphical target. The status of any unit can be checked in this way. + +### Mounts the old way + +A mount unit defines all of the parameters required to mount a filesystem on a designated mount point. systemd can manage mount units with more flexibility than those using the **/etc/fstab** filesystem configuration file. Despite this, systemd still uses the **/etc/fstab** file for filesystem configuration and mounting purposes. systemd uses the **systemd-fstab-generator** tool to create transient mount units from the data in the **fstab** file. + +I will create a new filesystem and a systemd mount unit to mount it. If you have some available disk space on your test system, you can do it along with me. + +_Note that the volume group and logical volume names may be different on your test system. Be sure to use the names that are pertinent to your system._ + +You will need to create a partition or logical volume, then make an EXT4 filesystem on it. Add a label to the filesystem, **TestFS**, and create a directory for a mount point **/TestFS**. + +To try this on your own, first, verify that you have free space on the volume group. Here is what that looks like on my VM where I have some space available on the volume group to create a new logical volume: + + +``` +[root@testvm1 ~]# lsblk +NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT +sda             8:0    0  120G  0 disk +├─sda1          8:1    0    4G  0 part /boot +└─sda2          8:2    0  116G  0 part +  ├─VG01-root 253:0    0    5G  0 lvm  / +  ├─VG01-swap 253:1    0    8G  0 lvm  [SWAP] +  ├─VG01-usr  253:2    0   30G  0 lvm  /usr +  ├─VG01-home 253:3    0   20G  0 lvm  /home +  ├─VG01-var  253:4    0   20G  0 lvm  /var +  └─VG01-tmp  253:5    0   10G  0 lvm  /tmp +sr0            11:0    1 1024M  0 rom   +[root@testvm1 ~]# vgs +  VG   #PV #LV #SN Attr   VSize    VFree   +  VG01   1   6   0 wz--n- <116.00g <23.00g +``` + +Then create a new volume on **VG01** named **TestFS**. It does not need to be large; 1GB is fine. Then create a filesystem, add the filesystem label, and create the mount point: + + +``` +[root@testvm1 ~]# lvcreate -L 1G -n TestFS VG01 +  Logical volume "TestFS" created. +[root@testvm1 ~]# mkfs -t ext4 /dev/mapper/VG01-TestFS +mke2fs 1.45.3 (14-Jul-2019) +Creating filesystem with 262144 4k blocks and 65536 inodes +Filesystem UUID: 8718fba9-419f-4915-ab2d-8edf811b5d23 +Superblock backups stored on blocks: +        32768, 98304, 163840, 229376 + +Allocating group tables: done                             +Writing inode tables: done                             +Creating journal (8192 blocks): done +Writing superblocks and filesystem accounting information: done + +[root@testvm1 ~]# e2label /dev/mapper/VG01-TestFS TestFS +[root@testvm1 ~]# mkdir /TestFS +``` + +Now, mount the new filesystem: + + +``` +[root@testvm1 ~]# mount /TestFS/ +mount: /TestFS/: can't find in /etc/fstab. +``` + +This will not work because you do not have an entry in **/etc/fstab**. You can mount the new filesystem even without the entry in **/etc/fstab** using both the device name (as it appears in **/dev**) and the mount point. Mounting in this manner is simpler than it used to be—it used to require the filesystem type as an argument. The mount command is now smart enough to detect the filesystem type and mount it accordingly. + +Try it again: + + +``` +[root@testvm1 ~]# mount /dev/mapper/VG01-TestFS /TestFS/ +[root@testvm1 ~]# lsblk +NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT +sda               8:0    0  120G  0 disk +├─sda1            8:1    0    4G  0 part /boot +└─sda2            8:2    0  116G  0 part +  ├─VG01-root   253:0    0    5G  0 lvm  / +  ├─VG01-swap   253:1    0    8G  0 lvm  [SWAP] +  ├─VG01-usr    253:2    0   30G  0 lvm  /usr +  ├─VG01-home   253:3    0   20G  0 lvm  /home +  ├─VG01-var    253:4    0   20G  0 lvm  /var +  ├─VG01-tmp    253:5    0   10G  0 lvm  /tmp +  └─VG01-TestFS 253:6    0    1G  0 lvm  /TestFS +sr0              11:0    1 1024M  0 rom   +[root@testvm1 ~]# +``` + +Now the new filesystem is mounted in the proper location. List the mount unit files: + + +``` +`[root@testvm1 ~]# systemctl list-unit-files -t mount` +``` + +This command does not show a file for the **/TestFS** filesystem because no file exists for it. The command **systemctl status TestFS.mount** does not display any information about the new filesystem either. You can try it using wildcards with the **systemctl status** command: + + +``` +[root@testvm1 ~]# systemctl status *mount +● usr.mount - /usr +   Loaded: loaded (/etc/fstab; generated) +   Active: active (mounted) +    Where: /usr +     What: /dev/mapper/VG01-usr +     Docs: man:fstab(5) +           man:systemd-fstab-generator(8) + +<SNIP> +● TestFS.mount - /TestFS +   Loaded: loaded (/proc/self/mountinfo) +   Active: active (mounted) since Fri 2020-04-17 16:02:26 EDT; 1min 18s ago +    Where: /TestFS +     What: /dev/mapper/VG01-TestFS + +● run-user-0.mount - /run/user/0 +   Loaded: loaded (/proc/self/mountinfo) +   Active: active (mounted) since Thu 2020-04-16 08:52:29 EDT; 1 day 5h ago +    Where: /run/user/0 +     What: tmpfs + +● var.mount - /var +   Loaded: loaded (/etc/fstab; generated) +   Active: active (mounted) since Thu 2020-04-16 12:51:34 EDT; 1 day 1h ago +    Where: /var +     What: /dev/mapper/VG01-var +     Docs: man:fstab(5) +           man:systemd-fstab-generator(8) +    Tasks: 0 (limit: 19166) +   Memory: 212.0K +      CPU: 5ms +   CGroup: /system.slice/var.mount +``` + +This command provides some very interesting information about your system's mounts, and your new filesystem shows up. The **/var** and **/usr** filesystems are identified as being generated from **/etc/fstab**, while your new filesystem simply shows that it is loaded and provides the location of the info file in the **/proc/self/mountinfo** file. + +Next, automate this mount. First, do it the old-fashioned way by adding an entry in **/etc/fstab**. Later, I'll show you how to do it the new way, which will teach you about creating units and integrating them into the startup sequence. + +Unmount **/TestFS** and add the following line to the **/etc/fstab** file: + + +``` +`/dev/mapper/VG01-TestFS  /TestFS       ext4    defaults        1 2` +``` + +Now, mount the filesystem with the simpler **mount** command and list the mount units again: + + +``` +[root@testvm1 ~]# mount /TestFS +[root@testvm1 ~]# systemctl status *mount +<SNIP> +● TestFS.mount - /TestFS +   Loaded: loaded (/proc/self/mountinfo) +   Active: active (mounted) since Fri 2020-04-17 16:26:44 EDT; 1min 14s ago +    Where: /TestFS +     What: /dev/mapper/VG01-TestFS +<SNIP> +``` + +This did not change the information for this mount because the filesystem was manually mounted. Reboot and run the command again, and this time specify **TestFS.mount** rather than using the wildcard. The results for this mount are now consistent with it being mounted at startup: + + +``` +[root@testvm1 ~]# systemctl status TestFS.mount +● TestFS.mount - /TestFS +   Loaded: loaded (/etc/fstab; generated) +   Active: active (mounted) since Fri 2020-04-17 16:30:21 EDT; 1min 38s ago +    Where: /TestFS +     What: /dev/mapper/VG01-TestFS +     Docs: man:fstab(5) +           man:systemd-fstab-generator(8) +    Tasks: 0 (limit: 19166) +   Memory: 72.0K +      CPU: 6ms +   CGroup: /system.slice/TestFS.mount + +Apr 17 16:30:21 testvm1 systemd[1]: Mounting /TestFS... +Apr 17 16:30:21 testvm1 systemd[1]: Mounted /TestFS. +``` + +### Creating a mount unit + +Mount units may be configured either with the traditional **/etc/fstab** file or with systemd units. Fedora uses the **fstab** file as it is created during the installation. However, systemd uses the **systemd-fstab-generator** program to translate the **fstab** file into systemd units for each entry in the **fstab** file. Now that you know you can use systemd **.mount** unit files for filesystem mounting, try it out by creating a mount unit for this filesystem. + +First, unmount **/TestFS**. Edit the **/etc/fstab** file and delete or comment out the **TestFS** line. Now, create a new file with the name **TestFS.mount** in the **/etc/systemd/system** directory. Edit it to contain the configuration data below. The unit file name and the name of the mount point _must_ be identical, or the mount will fail: + + +``` +# This mount unit is for the TestFS filesystem +# By David Both +# Licensed under GPL V2 +# This file should be located in the /etc/systemd/system directory + +[Unit] +Description=TestFS Mount + +[Mount] +What=/dev/mapper/VG01-TestFS +Where=/TestFS +Type=ext4 +Options=defaults + +[Install] +WantedBy=multi-user.target +``` + +The **Description** line in the **[Unit]** section is for us humans, and it provides the name that's shown when you list mount units with **systemctl -t mount**. The data in the **[Mount]** section of this file contains essentially the same data that would be found in the **fstab** file. + +Now enable the mount unit: + + +``` +[root@testvm1 etc]# systemctl enable TestFS.mount +Created symlink /etc/systemd/system/multi-user.target.wants/TestFS.mount → /etc/systemd/system/TestFS.mount. +``` + +This creates the symlink in the **/etc/systemd/system** directory, which will cause this mount unit to be mounted on all subsequent boots. The filesystem has not yet been mounted, so you must "start" it: + + +``` +`[root@testvm1 ~]# systemctl start TestFS.mount` +``` + +Verify that the filesystem has been mounted: + + +``` +[root@testvm1 ~]# systemctl status TestFS.mount +● TestFS.mount - TestFS Mount +   Loaded: loaded (/etc/systemd/system/TestFS.mount; enabled; vendor preset: disabled) +   Active: active (mounted) since Sat 2020-04-18 09:59:53 EDT; 14s ago +    Where: /TestFS +     What: /dev/mapper/VG01-TestFS +    Tasks: 0 (limit: 19166) +   Memory: 76.0K +      CPU: 3ms +   CGroup: /system.slice/TestFS.mount + +Apr 18 09:59:53 testvm1 systemd[1]: Mounting TestFS Mount... +Apr 18 09:59:53 testvm1 systemd[1]: Mounted TestFS Mount. +``` + +This experiment has been specifically about creating a unit file for a mount, but it can be applied to other types of unit files as well. The details will be different, but the concepts are the same. Yes, I know it is still easier to add a line to the **/etc/fstab** file than it is to create a mount unit. But this is a good example of how to create a unit file because systemd does not have generators for every type of unit. + +### In summary + +This article looked at systemd units in more detail and how to use the systemctl command to explore and manage units. It also showed how to stop and disable units and create a new systemd mount unit to mount a new filesystem and enable it to initiate during startup. + +In the next article in this series, I will take you through a recent problem I had during startup and show you how I circumvented it using systemd. + +### Resources + +There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup. + + * The Fedora Project has a good, practical [guide][10] [to systemd][10]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd. + * The Fedora Project also has a good [cheat sheet][11] that cross-references the old SystemV commands to comparable systemd ones. + * For detailed technical information about systemd and the reasons for creating it, check out [Freedesktop.org][12]'s [description of systemd][13]. + * [Linux.com][14]'s "More systemd fun" offers more advanced systemd [information and tips][15]. + + + +There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers. + + * [Rethinking PID 1][16] + * [systemd for Administrators, Part I][17] + * [systemd for Administrators, Part II][18] + * [systemd for Administrators, Part III][19] + * [systemd for Administrators, Part IV][20] + * [systemd for Administrators, Part V][21] + * [systemd for Administrators, Part VI][22] + * [systemd for Administrators, Part VII][23] + * [systemd for Administrators, Part VIII][24] + * [systemd for Administrators, Part IX][25] + * [systemd for Administrators, Part X][26] + * [systemd for Administrators, Part XI][27] + + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/systemd-units + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[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/article/20/4/systemd +[3]: https://opensource.com/article/20/4/systemd-startup +[4]: https://en.wikipedia.org/wiki/Sar_%28Unix%29 +[5]: https://en.wikipedia.org/wiki/Pwd +[6]: https://en.wikipedia.org/wiki/Standard_streams#Standard_output_(stdout) +[7]: http://www.both.org/?page_id=1183 +[8]: mailto:chrony-dnssrv@.timer +[9]: mailto:mdadm-last-resort@.timer +[10]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[11]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[12]: http://Freedesktop.org +[13]: http://www.freedesktop.org/wiki/Software/systemd +[14]: http://Linux.com +[15]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[16]: http://0pointer.de/blog/projects/systemd.html +[17]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[18]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[19]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[20]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[21]: http://0pointer.de/blog/projects/three-levels-of-off.html +[22]: http://0pointer.de/blog/projects/changing-roots +[23]: http://0pointer.de/blog/projects/blame-game.html +[24]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[25]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[26]: http://0pointer.de/blog/projects/instances.html +[27]: http://0pointer.de/blog/projects/inetd.html diff --git a/sources/tech/20200508 A guide to setting up your Open Source Program Office (OSPO) for success.md b/sources/tech/20200508 A guide to setting up your Open Source Program Office (OSPO) for success.md new file mode 100644 index 0000000000..ea3aa01866 --- /dev/null +++ b/sources/tech/20200508 A guide to setting up your Open Source Program Office (OSPO) for success.md @@ -0,0 +1,193 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A guide to setting up your Open Source Program Office (OSPO) for success) +[#]: via: (https://opensource.com/article/20/5/open-source-program-office) +[#]: author: (J. Manrique Lopez de la Fuente https://opensource.com/users/jsmanrique) + +A guide to setting up your Open Source Program Office (OSPO) for success +====== +Learn how to best grow and maintain your open source communities and +allies. +![community team brainstorming ideas][1] + +Companies create Open Source Program Offices (OSPO) to manage their relationship with the open source ecosystems they depend on. By understanding the company's open source ecosystem, an OSPO is able to maximize the company's return on investment and reduce the risks of consuming, contributing to, and releasing open source software. Additionally, since the company depends on its open source ecosystem, ensuring its health and sustainability shall ensure the company's health, sustainable growth, and evolution. + +### How has OSPO become vital to companies and their open source ecosystem? + +Marc Andreessen has said that "software is eating the world," and more recently, it could be said that open source is eating the software world. But how is that process happening? + +Companies get involved with open source projects in several ways. These projects comprise the company's open source ecosystem, and their relationships and interactions can be seen through Open Source Software's (OSS) inbound and outbound processes. + +From the OSS inbound point of view, companies use it to build their own solutions and their own infrastructure. OSS gets introduced because it's part of the code their technology providers use, or because their own developers add open source components to the company's information technology (IT) infrastructure. + +From the OSS outbound point of view, some companies contribute to OSS projects. That contribution could be part of the company's requirements for their solutions that need certain fixes in upstream projects. For example, Samsung contributes to certain graphics-related projects to ensure its hardware has software support once it gets into the market. In some other cases, contributing to OSS is a mechanism to retain talent by allowing the people to contribute to projects different from their daily work. + +Some companies release their own open source projects as an outbound OSS process. For companies like Red Hat or GitLab, it would be expected. But, there are increasingly more non-software companies releasing a lot of OSS, like Lyft. + +![OSS inbound and outbound processes][2] + +OSS inbound and outbound processes + +Ultimately, all of these projects involved in the inbound and outbound OSS flow are the company's OSS ecosystem. And like any living being, the company's health and sustainability depend on the ecosystem that surrounds it. + +### OSPO responsibilities + +Following the species and their ecosystem, people working in the OSPO team could be seen as the rangers in the organization's OSS ecosystem. They take care of the ecosystem and its relationship with the company, to keep everything healthy and sustainable. + +When the company consumes open source software projects, they need to be aware of licenses and compliance, to check the project's health, to ensure there are no security flaws, and, in some cases, to identify talented community members for potential hiring processes. + +When the company contributes to open source software projects, they need to be sure there are no Intellectual Property (IP) issues, to ensure the company contributions' footprint and its leadership in the projects, and sometimes, also to help talented people stay engaged with the company through their contributions. + +And when the company releases and maintains open source projects, they are responsible for ensuring community engagement and growth, for checking there are no IP issues, that the company maintains its footprint and leadership, and perhaps, to attract new talent to the company. + +Have you realized the whole set of skills required in an OSPO team? When I've asked people working in OSPO about the size of their teams, the number is around 1 to 5 people per 1,000 developers in the company. That's a small team to monitor a lot of people and their potential OSS related activity. + +### How to manage an OSPO + +With all these activities in OSPO people's minds and all the resources they need to worry about, how are they able to manage all of this? + +There are at least a couple of open source communities with valuable knowledge and resources available for them: + + * The [TODO Group][3] is "an open group of companies who want to collaborate on practices, tools, and other ways to run successful and effective open source projects and programs." For example, they have a complete set of [guides][4] with best practices for and from companies running OSPOS. + * The [CHAOSS (Community Health Analytics for Open Source Software)][5] community develops metrics, methodologies, and software for managing open source project health and sustainability. (See more on CHAOSS' active communities and working groups below). + + + +OSPO managers need to report a lot of information to the rest of the company to answer many questions related to their OSS inbound and outbound processes, i.e., Which projects are we using in our organization? What's the health of those projects? Who are the key people in those projects? Which projects are we contributing to? Which projects are we releasing? How are we dealing with community contributions? Who are the key contributors? + +### Data-driven OSPO + +As William Edwards Deming said, "Without data, you are just a person with an opinion." + +Having opinions is not a bad thing, but having opinions based on data certainly makes it easier to understand, discuss, and determine the processes best suited to your company and its goals. CHAOSS is the recommended community to look to for guidance about metrics strategies and tools. + +Recently, the CHAOSS community has released [a new set of metric definitions][6]. These metrics are only subsets of all the ones being discussed in the focus areas of each working group (WG): + + * [Common WG][7]: Defines the metrics that are used by both working groups or are important for community health, but that do not cleanly fit into one of the other existing working groups. Areas of interest include organizational affiliation, responsiveness, and geographic coverage. + * [Diversity and Inclusion WG][8]: Gathers experiences regarding diversity and inclusion in open source projects with the goal of understanding, from a qualitative and quantitative point of view, how diversity and inclusion can be measured. + * [Evolution WG][9]: Refines the metrics that inform evolution and works with software implementations. + * [Risk WG][10]: Refines the metrics that inform risk and works with software implementations. + * [Value WG][11]: Focuses on industry-standard metrics for economic value in open source. Their main goal is to publish trusted industry-standard value metrics—a kind of S&P for software development and an authoritative source for metrics significance and industry norms. + + + +On the tooling side, projects like [Augur][12], [Cregit][13], and [GrimoireLab][14] are the reference tools that report these metrics, but also many others related to OSPO activities. They are also the seed for new tools and solutions provided by the OSS community like [Cauldron.io][15], a SaaS open source solution to ease OSS ecosystem analysis. + +![CHAOSS Metrics for 15 years of Unity OSS activity. Source: cauldron.io][16] + +CHAOSS Metrics for 15 years of Unity OSS activity. Source: cauldron.io + +All these metrics and data are useless without a metrics strategy. Usually, the first approach is to try to measure as much as possible, producing overwhelming reports and dashboards full of charts and data. What is the value of that? + +Experience has shown that a very valid approach is the [Goal, Questions, Metrics (GQM)][17] strategy. But how do we put that in practice in an OSPO? + +First of all, we need to understand the company's goals when using, consuming, contributing to, or releasing and maintaining OSS projects. The usual goals are related to market positioning, required upstream features development, and talent attraction or retention. Based on these goals, we should write down related questions that can be answered with numbers, like the following: + +#### Who/how many are the core maintainers of my OSS ecosystem projects? + +![Uber OSS code core, regular, and casual contributors evolution. Source: uber.biterg.io][18] + +Uber OSS code core, regular, and casual contributors evolution. Source: uber.biterg.io + +People contribute through different mechanisms or tools (code, issues, comments, tests, etc.). Measuring the core contributors (those that have done 80% of the contributions), the regular ones (those that have done 15% of the contributions), and the casual ones (those have made 5% of the contributions) can answer questions related to participation over time, but also how people move between the different buckets. Adding affiliation information helps to identify external core contributors. + +#### Where are the contributions happening? + +![Uber OSS activity based on location. Source: uber.biterg.io][19] + +Uber OSS activity based on location. Source: uber.biterg.io + +The growth of OSS ecosystems is also related to OSS projects spread across the world. Understanding that spread helps OSPO, and the company, to manage actions that improve support for people from different countries and regions. + +#### What is the company's OSS network? + +![Uber OSS network. Source: uber.biterg.io][20] + +Uber OSS network. Source: uber.biterg.io + +The company's OSS ecosystem includes those projects that the company's people contribute to. Understanding which projects they contribute to offers insight into which technologies or OSS components are interesting to people, and which companies or organizations the company collaborates with. + +#### How is the company dealing with contributions? + +![Github Pull Requests backlog management index and time to close analysis. Source: uber.biterg.io][21] + +Github Pull Requests backlog management index and time to close analysis. Source: uber.biterg.io + +One of the goals when releasing OSS projects is to grow the community around them. Measuring how the company handles contributions to its projects from outside its boundaries helps to understand how "welcoming" it is and identifies mentors (or bottlenecks) and opportunities to lower the barrier to contribute. + +#### Consumers vs. maintainers + +Over the last months, we have been hearing that corporations are taking OSS for free without contributing back. The typical arguments are that these corporations are making millions of dollars thanks to free work, plus the issue of OSS project maintainer burnout due to users' complaints and requests for free support. + +The system is unbalanced; usually, the number of users exceeds the number of maintainers. Is that good or bad? Having users for our software is (or should be) good. But we need to manage expectations on both sides. + +From the corporation's point of view, consuming OSS without care is very, very risky. + +OSPO can play an important role in educating the company about the risks they are facing, and how to reduce them by contributing back to their OSS ecosystem. Remember, a company's overall sustainability could rely heavily on its ecosystem sustainability. + +A good strategy is to start shifting your company from being pure OSS consumers to becoming contributors to their OSS inbound projects. From just submitting issues and asking questions to help solve issues, answering questions, and even sending patches, contributing helps grow and maintain the project while giving back to the community. It doesn't happen immediately, but over time, the company will be perceived as an OSS ecosystem citizen. Eventually, some people from the company could end up helping to maintain those projects too. + +And what about money? There are plenty of ways to support the OSS ecosystem financially. Some examples: + + * Business initiatives like [Tidelift][22], or [OpenCollective][23] + * Foundations and their supporting mechanisms, like [Software Freedom Conservancy][24], or [CommunityBridge][25] from the Linux Foundation + * Self-funding programs (like [Indeed][26] and [Salesforce][27] have done) + * Emerging gig development approaches like [Github Sponsors][28] or [Patreon][29] + + + +Last but not least, companies need to avoid the "not invented here" syndrome. For some OSS projects, there might be companies providing consulting, customization, maintenance, and/or support services. Instead of taking OSS and spending time and people to self-host, self-customize, or try to bring those kinds of services in-house, it might be smarter and more efficient to hire some of those companies to do the thought work. + +As a final remark, I would like to emphasize the importance of an OSPO for a company to succeed and grow in the current market. As shepherds of the company's OSS ecosystem, they are the best people in the organization to understand how the ecosystem works and flows, and they should be empowered to manage, monitor, and make recommendations and decisions to ensure sustainability and growth. + +Does your organization have an OSPO yet? + +Six common traits of successful open source programs, and a look back at how the open source... + +Why would a company not in the business of software development create an open source program... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/open-source-program-office + +作者:[J. Manrique Lopez de la Fuente][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jsmanrique +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/meeting_discussion_brainstorm.png?itok=7_m4CC8S (community team brainstorming ideas) +[2]: https://opensource.com/sites/default/files/uploads/ospo_1.png (OSS inbound and outbound processes) +[3]: https://todogroup.org/ +[4]: https://todogroup.org/guides/ +[5]: https://chaoss.community/ +[6]: https://chaoss.community/metrics/ +[7]: https://github.com/chaoss/wg-common +[8]: https://github.com/chaoss/wg-diversity-inclusion +[9]: https://github.com/chaoss/wg-evolution +[10]: https://github.com/chaoss/wg-risk +[11]: https://github.com/chaoss/wg-value +[12]: https://github.com/chaoss/augur +[13]: https://github.com/cregit +[14]: https://chaoss.github.io/grimoirelab/ +[15]: https://cauldron.io/ +[16]: https://opensource.com/sites/default/files/uploads/ospo_2.png (CHAOSS Metrics for 15 years of Unity OSS activity. Source: cauldron.io) +[17]: https://en.wikipedia.org/wiki/GQM +[18]: https://opensource.com/sites/default/files/uploads/ospo_3.png (Uber OSS code core, regular, and casual contributors evolution. Source: uber.biterg.io) +[19]: https://opensource.com/sites/default/files/uploads/ospo_4.png (Uber OSS activity based on location. Source: uber.biterg.io) +[20]: https://opensource.com/sites/default/files/uploads/ospo_5_0.png (Uber OSS network. Source: uber.biterg.io) +[21]: https://opensource.com/sites/default/files/uploads/ospo_6.png (Github Pull Requests backlog management index and time to close analysis. Source: uber.biterg.io) +[22]: https://tidelift.com/ +[23]: https://opencollective.com/ +[24]: https://sfconservancy.org/ +[25]: https://funding.communitybridge.org/ +[26]: https://engineering.indeedblog.com/blog/2019/02/sponsoring-osi/ +[27]: https://sustain.codefund.fm/23 +[28]: https://help.github.com/en/github/supporting-the-open-source-community-with-github-sponsors +[29]: https://www.patreon.com/ diff --git a/sources/tech/20200508 Metaphors in man pages.md b/sources/tech/20200508 Metaphors in man pages.md new file mode 100644 index 0000000000..8a9ea9c3b9 --- /dev/null +++ b/sources/tech/20200508 Metaphors in man pages.md @@ -0,0 +1,182 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Metaphors in man pages) +[#]: via: (https://jvns.ca/blog/2020/05/08/metaphors-in-man-pages/) +[#]: author: (Julia Evans https://jvns.ca/) + +Metaphors in man pages +====== + +This morning I was watching a [great talk by Maggie Appleton][1] about metaphors. In the talk, she explains the difference between a “figurative metaphor” and a “cognitive metaphor”, and references this super interesting book called [Metaphors We Live By][2] which I immediately got and started reading. + +Here’s an example from “Metaphors We Live By” of a bunch of metaphors we use for ideas: + + * ideas as **food**: “_raw_ facts”, “_half-baked_ ideas”, “_swallow_ that claim”, “_spoon-feed_ our students”, “_meaty_ part of the paper”, “that idea has been _fermenting_ for years” + * ideas as **people**: “the theory of relativity _gave birth_ to an enormous number of ideas”, “whose _brainchild_ was that”, “those ideas _died off_ in the middle ages”, “cognitive psychology is in its _infancy_“ + * ideas as **products**: “we’ve _generated_ a lot of ideas this week”, “it needs to be _refined_”, “his _intellectual productivity_ has decreased in recent years” + * ideas as **commodities**: “he won’t _buy_ that”, “that’s a _worthless_ idea”, “she has _valuable_ ideas” + * ideas as **resources**: “he _ran out_ of ideas”, “let’s _pool_ our ideas”, “that idea will _go a long way_“ + * ideas as **cutting instruments**: “that’s an _incisive_ idea”, “that _cuts right to the heart_ of the matter”, “he’s _sharp_“ + * ideas as **fashions**: “that idea _went out of style_ years ago”, “marxism is _fashionable_ in western europe”, “berkeley is a center of _avant-garde_ thought”, “semiotics has become quite _chic_“ + + + +There’s a [long list of more English metaphors here][3], including many metaphors from the book. + +I was surprised that there were so many different metaphors for ideas, and that we’re using metaphors like this all the time in normal language. + +### let’s look for metaphors in man pages! + +Okay, let’s get to the point of this blog post, which is just a small fun exploration – there aren’t going to be any Deep Programming Insights here. + +I went through some of the examples of metaphors in Metaphors To Live By and grepped all the man pages on my computer for them. + +### processes as people + +This is one of the richer categories – a lot of different man pages seem to agree that processes are people, or at least alive in some way. + + * Hangup detected on controlling terminal or **death** of controlling process (`man 7 signal`) + * can access the local **agent** through the forwarded connection (`man ssh_config`) + * If the exit of the process causes a process group to become **orphaned** (`man exit`) + * If a parent process terminates, then its **“zombie” children** (if any) (`man wait`) + * … send SIGHUP to the **parent** process of the client (`man tmux`) + * Otherwise, it **“runs” to catch up** or waits (`man mplayer`) + * However, Git does not (and it should not) change tags **behind users back** (`man git-tag`) + * will **listen** forever for a connection (`man nc_openbsd`) + * this monitor scales badly with the number of files being **observed** (`man fswatch`) + * If you try to use the **birth** time of a reference file (`man file`) + * a program **died** due to a fatal signal (`man xargs`) + * protocol version in the TLS **handshake** (`man curl`) + * it will **look for** a debug object at… (`man valgrind`) + + + +### data as food + + * “Apparently some digital cameras get **indigestion** if you feed them a CF card) (`man mkfs`) + * “Send packets using **raw** ethernet frames or IP packets” (`man nmap`) + * “the above example can be thought of as a maximizing repeat that must **swallow** everything it can” (`man pcrepattern`) + * “This will allow you to **feed** newline-delimited name=value pairs to the script on’ (`man CGI`) + + + +### data as objects + + * Kill the tmux server and clients and **destroy** all sessions (`tmux`) + * Each command will produce one **block** of output on standard output. (`man tmux`) + * “HTTPS guarantees that the password will not **travel** in the clear” (`man Net::SSLeay`) + * “way to **pack** more than one certificate into an ASN.1 structure” (`man gpgsm`) + + + +### processes as machines/objects + + * “This is **fragile**, subject to change, and thus should not be relied upon” (`man ps`) + * “This is useful if you have to use **broken** DNS” (`man aria2c`) + * “This provides good safety measures, but **breaks down** when” (`man git-apply`) + * “debugfs is a debugging tool. It has **rough edges**!” (`man debugfs`) + + + +### containers + +There are LOTS of containers: directories, files, strings, caches, queues, buffers, etc. + + * can exploit that to **get out** of the chroot directory (`man chroot`) + * “The file **containing** the RFC 4648 Section 5 base64url encoded 128-bit secret key” + * “Keys must start with a lowercase character and **contain** only hyphens” + * “just specify an **empty** string” (`man valgrind`) + * “the cache is **full** and a new page that isn’t cached becomes visible” (`man zathurarc`) + * “Number of table **overflows**” (`man lnstat`) + * “likely **overflow** the buffer” (`man g++`) + + + +### resources + +There are also lots of kinds of resources: bandwidth, TCP sockets, session IDs, stack space, memory, disk space. + + * This is not recommended and **wastes** bitrate (`man bitrate`) + * corruption or **lost** data if the system crashes (`man btree`) + * you don’t want Wget to **consume** the entire available bandwidth (`man wget`) + * Larger values will be slower and cause x264 to **consume** more memory (`man mplayer`) + * the resulting file can **consume** some disk space (`man socat`) + * attempting to **reuse** SSL session-ID (`man curl`) + * This option controls stack space **reuse** (`man gcc`) + * Keep the TCP socket open between queries and **reuse** it rather than creating a new TCP socket (`man dig`) + * the maximum value will easily **eat up** three extra gigabytes or so of memory (`man valgrind`) + + + +### orientation (up, down, above, below) + + * Send the escape character to the **frontend** (`man qemu-system`) + * Note that TLS 1.3 is only supported by a subset of TLS **backends** (`man curl`) + * This option may be useful if you are **behind** a router (`man mplayer`) + * When a file that exists on the **lower** layer is renamed (`man rename`) + * Several of the socket options should be handled at **lower** levels (`man getsockopt`) + * while still performing such **higher** level functionality (`man nmap`) + * This is the same string passed **back to** the front end (`man sudo_plugin`) + * On Linux, `futimens` is a library function implemented **on top** of the `utimensat` system call (`man futimens`) + + + +### buildings + +Limits as rooms/buildings (which have floors, and ceilings, which you hit) are kind of fun: + + * the kernel places a **floor** of 32 pages on this size limit (`man execve`) + * This specifies a **ceiling** to which the process’s nice value can be raised (`man getrlimit`) + * If this limit is **hit** the search is aborted (`man gcc`) + * these libraries are used as the **foundation** for many of the libraries (`man Glib`) + + + +### money / wealth + + * This is a very **expensive** operation for large projects, so use it with caution (`man git-log`) + * Note that since this operation is very I/O **expensive** (`man git-filter-branch`) + * provides a **rich** interface for scripts to print disk layouts (`man fdisk`) + * The number of times the softirq handler function terminated per second because its **budget** was consumed (`man sar.sysstat`) + * the extra **cost** depends a lot on the application at hand (`man valgrind`) + + + +### more miscellaneous metaphors + +here are some more I found that didn’t fit into any of those categories yet. + + * when a thread is created under glibc, just one **big** lock is used for all thread setup (`man valgrind`) + * will likely **drop** the connection (`man x11vnc`) + * on all **paths** from the load to the function entry (`man gcc`) + * it is a very good idea to **wipe** filesystem signatures, data, etc. before (`man cryptsetup`) + * they will be **embedded** into the document + * the client should automatically **follow** referrals returned + * even if there exist mappings that **cover** the whole address space requested (`man mremap`) + * when a network interface **disappears** (`man systemd-resolve`) + + + +### we’re all using metaphors all the time + +I found a lot more metaphors than I expected, and most of them are just part of how I’d normally talk about a program. Interesting! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/05/08/metaphors-in-man-pages/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://www.youtube.com/watch?v=K8MF3aDg-bM&feature=youtu.be&t=14991 +[2]: https://www.goodreads.com/book/show/34459.Metaphors_We_Live_By +[3]: https://metaphor.icsi.berkeley.edu/pub/en/index.php/Category:Metaphor diff --git a/sources/tech/20200510 Open source underpins coronavirus IoT and robotics solutions.md b/sources/tech/20200510 Open source underpins coronavirus IoT and robotics solutions.md new file mode 100644 index 0000000000..5ce9ce0a1f --- /dev/null +++ b/sources/tech/20200510 Open source underpins coronavirus IoT and robotics solutions.md @@ -0,0 +1,86 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Open source underpins coronavirus IoT and robotics solutions) +[#]: via: (https://opensource.com/article/20/5/robotics-covid19) +[#]: author: (Sam Bocetta https://opensource.com/users/sambocetta) + +Open source underpins coronavirus IoT and robotics solutions +====== +From sanitization of equipment and facilities to plotting the spread of +the virus, robots are playing an active role in combating COVID-19. +![Three giant robots and a person][1] + +The tech sector is quietly having a boom during the COVID-19 pandemic. Open source developers are getting involved with many aspects of the fight against the coronavirus, [using Python to visualize its spread][2] and helping to repurpose data acquisition systems to perform contact tracing. + +However, one of the most exciting areas of current research is the use of robotics to contain the spread of the coronavirus. In the last few weeks, robots have been deployed in critical environments—particularly in hospitals and on airplanes—to help staff sterilize surfaces and objects. + +Most of these robots are produced by tech startups, who have seen an opportunity to prove the worth of their proprietary systems. Many of them, however, rely on [open source cloud and IoT tools][3] that have been developed by the open source community. + +In this article, we'll take a look at how robotics are being used to fight the disease, the IoT infrastructure that underpins these systems, and finally, the security and privacy concerns that their increased use is highlighting. + +### Robots and COVID-19 + +Around the world, robots are being deployed to help the fight against COVID-19. The most direct use of robots has been in healthcare facilities, and China has taken the lead when it comes to deploying robots in hospitals. + +For example, a field hospital that recently opened in Wuhan—where the virus originated—is [making extensive use of robots][4] to help healthcare workers care for patients. Some of these robots provide food, drink, and medicine to patients, and others are used to clean parts of the hospital. + +Other companies, such as the Texas startup Xenex Disinfection Services, are using robots and UV light to deactivate viruses, bacteria, and spores on surfaces in airports. Still others, like Dimer UVC Innovations, are focusing on making robots that can [improve aircraft hygiene][5]. + +Not all of the "robots" deployed against the disease are anthropomorphic, though. The same field hospital in Wuhan that is using human-like robots is also making extensive use of less obviously "robotic" IoT devices. + +Patients entering the hospital are screened by networked 5G thermometers to alert staff for anyone showing a high fever, and patients wear smart bracelets and rings equipped with sensors. These are synced with CloudMinds' AI platform, and patients' vital signs, including temperature, heart rate, and blood oxygen levels, can be monitored. + +### Robots and the IoT + +Even when these robots appear to be independent entities, they make [extensive use of the IoT][6]. In other words, although patients may feel that they are being cared for by a robot that can make its own decisions, in reality, these robots are controlled by large, distributed sensing and data processing systems. + +Although many of the robots being deployed are the proprietary property of the tech firms who produce their hardware, their functioning is based on an ecosystem of software that is largely open source. + +This observation is an important one because it overturns one of the primary misconceptions about the [way that AI is used today][7][,][7] whether in a healthcare setting or elsewhere. Most research into robotics today does not seek to embed fully intelligent AI systems into robots themselves but, instead, uses centralized AI systems to control a wide variety of far less "smart" IoT devices. + +This observation, in turn, highlights two key points about the robots currently being developed and used to fight COVID-19. One is that they rely on a software ecosystem—much of it open source—that has been developed in a truly collaborative process involving thousands of engineers. The second is that the networked nature of these robots makes them vulnerable to exploitation. + +### Security and privacy + +This vulnerability to cybersecurity threats has led some analysts to raise questions about the wisdom of widespread deployment of IoT-driven robotics, whether in the healthcare system or anywhere else. Spyware in the IoT [remains a huge problem][8], and some fear that by integrating IoT systems into healthcare, we may be exposing more data—and more sensitive data—to intruders. + +Even where developers are careful to build security into these devices, the sheer number of components they rely on makes DevSecOps processes difficult to implement. Especially in this current time of crisis, many software engineers have been forced to accelerate the release of new components, and this could lead to them being vulnerable. If a company is rushing to bring a healthcare robot onto the market in response to COVID-19, it's unlikely that the open source code that these devices run on will be [properly audited][9]. + +And even if companies are able to maintain the integrity of their DevSecOps processes while still accelerating development, it's far from certain that patients themselves understand the privacy implications of delegating their care to IoT devices. Many lack the open source privacy tools [necessary to keep their data private][10] when browsing the internet, let alone those that should be deployed to protect sensitive healthcare data. + +### The future + +In short, the deployment of robots in the fight against COVID-19 is highlighting long-standing concerns about the integrity, security, and privacy of IoT systems more generally. Professionals in this field have long argued that [IoT audits][11] and [embedded Linux systems][12] should be the standard for IoT development, but in the current crisis, their warnings are likely to be ignored. + +This is worrying because it's likely that IoT systems will be increasingly used in healthcare in the coming decade. So whilst the COVID-19 pandemic will provide a proof of their utility in this sector, it should also not be used as an excuse to roll out poorly secured, poorly audited IoT software in highly sensitive environments. + +Open source isn’t just changing the way we interact with the world, it’s changing the way the world... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/robotics-covid19 + +作者:[Sam Bocetta][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/BUSINESS_robots.png?itok=TOZgajrd (Three giant robots and a person) +[2]: https://opensource.com/article/20/4/python-data-covid-19 +[3]: https://opensource.com/article/18/7/digital-transformation-strategy-think-cloud +[4]: https://www.cnbc.com/2020/03/18/how-china-is-using-robots-and-telemedicine-to-combat-the-coronavirus.html +[5]: https://www.therobotreport.com/company-offers-germ-killing-robot-to-airports-to-address-coronavirus-outbreak/ +[6]: https://www.cloudwards.net/what-is-the-internet-of-things/ +[7]: https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives +[8]: https://blog.eccouncil.org/spyware-in-the-iot-what-does-it-mean-for-your-online-privacy/ +[9]: https://opensource.com/article/17/10/doc-audits +[10]: https://privacyaustralia.net/privacy-tools/ +[11]: https://opensource.com/article/19/11/how-many-iot-devices +[12]: https://opensource.com/article/17/3/embedded-linux-iot-ecosystem diff --git a/sources/tech/20200511 How I track my home-s energy consumption with open source.md b/sources/tech/20200511 How I track my home-s energy consumption with open source.md new file mode 100644 index 0000000000..10dfaa5f8e --- /dev/null +++ b/sources/tech/20200511 How I track my home-s energy consumption with open source.md @@ -0,0 +1,144 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How I track my home's energy consumption with open source) +[#]: via: (https://opensource.com/article/20/5/energy-monitoring) +[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99) + +How I track my home's energy consumption with open source +====== +These open source components help you find ways to save money and +conserve resources. +![lightbulb drawing outline][1] + +An important step towards optimizing energy consumption is knowing your actual consumption. My house was built during the oil crisis in the 1970s, and due to the lack of a natural gas connection, the builders decided to use electricity to do all of the heating (water and home heating). This is not unusual for this area of Germany, and it remains an appropriate solution in countries that depend highly on nuclear power. + +Electricity prices here are quite high (around € 0.28/kWh), so I decided to monitor my home's energy consumption to get a feel for areas where I could save some energy. + +I used to work for a company that sold energy-monitoring systems for industrial customers. While this company mostly used proprietary software, you can set up a similar smart monitoring and logging solution for your home based on open source components. This article will show you how. + +In Germany, the grid operator owns the electricity meter. The grid operator is obliged to provide an interface on its metering device to enable the customer to access the meter reading. Here is the metering device on my home: + +![Actaris ACE3000 electricity meter][2] + +Actaris ACE3000 Type 110 (dry contact located behind the marked cover) + +Generally, almost every metering device has at least a [dry contact][3]—as my electricity meter does—that you can use to log metering. As you can see, my electricity meter has two counters: The upper one is for the day tariff (6am to 10pm), and the lower one is for the night tariff (10pm to 6am). The night tariff is a bit cheaper. Two-tariff meters are usually found only in houses with electric heating. + +### Design + +A reliable energy-monitoring solution for private use should meet the following requirements: + + * Logging of metering impulses (dry contact) + * 24/7 operation + * Energy-saving operation + * Visualization of consumption data + * Long-term recording of consumption data + * Connectivity (e.g., Ethernet, USB, WiFi, etc.) + * Affordability + + + +I choose the Siemens SIMATIC IOT2020 as my hardware platform. This industrial-proven device is based on an Intel Quark x86 CPU, has programmable interrupts, and is compatible with many Arduino shields. + +![Siemens SIMATIC IOT2020][4] + +Siemens SIMATIC IOT2020 + +The Siemens device comes without an SD card and, therefore, without an operating system. Luckily, you can find a current Yocto-based Linux OS image and instructions on how to flash the SD card in the [Siemens forum][5]. + +In addition to the hardware platform, you also need some accessories. The following materials list shows the minimum components you need. Each item includes links to the parts I purchased, so you can get a sense of the project's costs. + +#### Materials list + + * [Siemens SIMATIC IoT2020 unit][6] + * [Siemens I/O Shield for SIMATIC IoT2000 series][7] + * [microSD card][8] (2GB or more) + * [CSL 300Mbit USB-WLAN adapter][9] + * 24V power supply (I used a 2.1A [TDK-Lambda DRB50-24-1][10], which I already owned). You could use a less expensive power supply with less power: the SIMATIC IOT2020 has a maximum current of 1.4A, and the dry contact needs an additional 0.1A (24V / 220Ω). + * 5 terminal blocks ([Weidmueller WDU 2.5mm][11]) + * 2 terminal cross-connecting bridges ([Weidmueller WQV][12]) + * [DIN rail][13] (~300 mm) + * [220Ω / 3W resistor][14] + * Wire + + + +Here is the assembled result: + +![Mounted and hooked up energy logger][15] + +Energy logger mounted and hooked up + +Unfortunately, I didn't have enough space at the rear wall of the cabinet; therefore, the DIN rail with the mounted parts lies on the ground. + +The connections between the meter and the Siemens device look like this: + +![Wiring between meter and energy logger][16] + +### How it works + +A dry contact is a current interface. When the electricity meter triggers, a current of 0.1A starts flowing between **s0+** and **s0-**. On **DI0**, the voltage rises to 24V and triggers an interrupt. When the electricity meter disconnects **s0+** and **s0-**, **DI0** is grounded over the resistor. + +On my device, the contact closes 1,000 times per kWh (this value varies between metering devices). + +To count these peaks reliably, I created [a C program][17] that registers an interrupt service routine on the DI0 input and counts upwards in memory. Once a minute, the values from memory are written to an [SQLite][18] database. + +The overall meter reading is also written to a text file and can be preset with a starting value. This acts as a copy of the overall metering value of the meter in the cabinet. + +![Energy logger architecture][19] + +Energy logger architecture + +The data is visualized using [Node-RED][20], and I can access overviews, like the daily consumption dashboard below, over a web-based GUI. + +![Node-RED based GUI][21] + +Daily overview in the Node-RED GUI + +For the daily overview, I calculate the hourly costs based on the consumption data (the large bar chart). On the top-left of the dashboard you can see the actual power; below that is the daily consumption (energy and costs). The water heater for the shower causes the large peak in the bar chart. + +### A reliable system + +Aside from a lost timestamp during a power failure (the real-time clock in the Siemens device is not backed by a battery by default), everything has been working fine for more than one-and-a-half years. + +If you can set up the whole Linux system completely from the command line, you'll get a reliable and flexible system with the ability to link interrupt service routines to the I/O level. + +Because the I/O Shield runs on standard control voltage (24V), you can extend its functionality with the whole range of standardized industrial components (e.g., relays, sensors, actors, etc.). And, due to its open architecture, this system can be extended easily and applied to other applications, like for monitoring gas or water consumption or as a weather station, a simple controller for tasks, and more. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/energy-monitoring + +作者:[Stephan Avenwedde][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/hansic99 +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/Collaboration%20for%20health%20innovation.png?itok=s4O5EX2w (lightbulb drawing outline) +[2]: https://opensource.com/sites/default/files/uploads/openenergylogger_1_electricity_meter.jpg (Actaris ACE3000 electricity meter) +[3]: https://en.wikipedia.org/wiki/Dry_contact +[4]: https://opensource.com/sites/default/files/uploads/openenergylogger_2_siemens_device.jpg (Siemens SIMATIC IOT2020) +[5]: https://support.industry.siemens.com/tf/ww/en/posts/new-example-image-version-online/189090/?page=0&pageSize=10 +[6]: https://de.rs-online.com/web/p/products/1244037 +[7]: https://de.rs-online.com/web/p/products/1354133 +[8]: https://de.rs-online.com/web/p/micro-sd-karten/7582584/ +[9]: https://www.amazon.de/300Mbit-WLAN-Adapter-Hochleistungs-Antennen-Dual-Band/dp/B00LLIOT34 +[10]: https://de.rs-online.com/web/p/products/8153133 +[11]: https://de.rs-online.com/web/p/din-schienenklemmen-ohne-sicherung/0425190/ +[12]: https://de.rs-online.com/web/p/din-schienenklemmen-zubehor/0202574/ +[13]: https://de.rs-online.com/web/p/din-schienen/2835729/ +[14]: https://de.rs-online.com/web/p/widerstande-durchsteckmontage/2142673/ +[15]: https://opensource.com/sites/default/files/uploads/openenergylogger_3_assembled_device.jpg (Mounted and hooked up energy logger) +[16]: https://opensource.com/sites/default/files/uploads/openenergylogger_4_wiring.png (Wiring between meter and energy logger) +[17]: https://github.com/hANSIc99/OpenEnergyLogger +[18]: https://www.sqlite.org/index.html +[19]: https://opensource.com/sites/default/files/uploads/openenergylogger_5_architecure.png (Energy logger architecture) +[20]: https://nodered.org/ +[21]: https://opensource.com/sites/default/files/uploads/openenergylogger_6_dashboard.png (Node-RED based GUI) diff --git a/sources/tech/20200511 Tips and tricks for optimizing container builds.md b/sources/tech/20200511 Tips and tricks for optimizing container builds.md new file mode 100644 index 0000000000..0a4fbed8cb --- /dev/null +++ b/sources/tech/20200511 Tips and tricks for optimizing container builds.md @@ -0,0 +1,201 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Tips and tricks for optimizing container builds) +[#]: via: (https://opensource.com/article/20/5/optimize-container-builds) +[#]: author: (Ravi Chandran https://opensource.com/users/ravichandran) + +Tips and tricks for optimizing container builds +====== +Try these techniques to minimize the number and length of your container +build iterations. +![Toolbox drawing of a container][1] + +How many iterations does it take to get a container configuration just right? And how long does each iteration take? Well, if you answered "too many times and too long," then my experiences are similar to yours. On the surface, creating a configuration file seems like a straightforward exercise: implement the same steps in a configuration file that you would perform if you were installing the system by hand. Unfortunately, I've found that it usually doesn't quite work that way, and a few "tricks" are handy for such DevOps exercises. + +In this article, I'll share some techniques I've found that help minimize the number and length of iterations. In addition, I'll outline a few good practices beyond the [standard ones][2]. + +In the [tutorial repository][3] from my previous article about [containerizing build systems][4], I've added a folder called **/tutorial2_docker_tricks** with an example covering some of the tricks that I'll walk through in this post. If you want to follow along and you have Git installed, you can pull it locally with: + + +``` +`$ git clone https://github.com/ravi-chandran/dockerize-tutorial` +``` + +The tutorial has been tested with Docker Desktop Edition, although it should work with any compatible Linux container system (like [Podman][5]). + +### Save time on container image build iterations + +If the Dockerfile involves downloading and installing a 5GB file, each iteration of **docker image build** could take a lot of time even with good network speeds. And forgetting to include one item to be installed can mean rebuilding all the layers after that point. + +One way around that challenge is to use a local HTTP server to avoid downloading large files from the internet multiple times during **docker image build** iterations. To illustrate this by example, say you need to create a container image with Anaconda 3 under Ubuntu 18.04. The Anaconda 3 installer is a ~0.5GB file, so this will be the "large" file for this example. + +Note that you don't want to use the **COPY** instruction, as it creates a new layer. You should also delete the large installer after using it to minimize the container image size. You could use [multi-stage builds][6], but I've found the following approach sufficient and quite effective. + +The basic idea is to use a Python-based HTTP server locally to serve the large file(s) and have the Dockerfile **wget** the large file(s) from this local server. Let's explore the details of how to set this up effectively. As a reminder, you can access the [full example][7]. + +The necessary contents of the folder **tutorial2_docker_tricks/** in this example repository are: + + +``` +tutorial2_docker_tricks/ +├── build_docker_image.sh                   # builds the docker image +├── run_container.sh                        # instantiates a container from the image +├── install_anaconda.dockerfile             # Dockerfile for creating our target docker image +├── .dockerignore                           # used to ignore contents of the installer/ folder from the docker context +├── installer                               # folder with all our large files required for creating the docker image +│   └── Anaconda3-2019.10-Linux-x86_64.sh   # from +└── workdir                                 # example folder used as a volume in the running container +``` + +The key steps of the approach are: + + * Place the large file(s) in the **installer/** folder. In this example, I have the large Anaconda installer file **Anaconda3-2019.10-Linux-x86_64.sh**. You won't find this file if you clone my [Git repository][8] because only you, as the container image creator, need this source file. The end users of the image don't. [Download the installer][9] to follow along with the example. + * Create the **.dockerignore** file and have it ignore the **installer/** folder to avoid Docker copying all the large files into the build context. + * In a terminal, **cd** into the **tutorial2_docker_tricks/** folder and execute the build script as **./build_docker_image.sh**. + * In **build_docker_image.sh**, start the Python HTTP server to serve any files from the **installer/** folder: [code] cd installer +python3 -m http.server --bind 10.0.2.15 8888 & +cd .. +``` +* If you're wondering about the strange internet protocol (IP) address, I'm working with a VirtualBox Linux VM, and **10.0.2.15** shows up as the address of the Ethernet adapter when I run **ifconfig**. This IP seems to be the convention used by VirtualBox. If your setup is different, you'll need to update this IP address to match your environment and then update **build_docker_image.sh** and **install_anaconda.dockerfile**. The server's port number is set to **8888** for this example. Note that the IP and port numbers could be passed in as build arguments, but I've hard-coded them for brevity. +* Since the HTTP server is set to run in the background, stop the server near the end of the script with the **kill -9** command using an [elegant approach][10] I found: [code]`kill -9 `ps -ef | grep http.server | grep 8888 | awk '{print $2}'` +``` + * Note that this same **kill -9** is also used earlier in the script (before starting the HTTP server). In general, when I iterate on any build script that I might deliberately interrupt, this ensures a clean start of the HTTP server each time. + * In the [Dockerfile][11], there is a **RUN wget** instruction that downloads the Anaconda installer from the local HTTP server. It also deletes the installer file and cleans up after the installation. Most importantly, all these actions are performed within the same layer to keep the image size to a minimum: [code] # install Anaconda by downloading the installer via the local http server +ARG ANACONDA +RUN wget --no-proxy -O ~/anaconda.sh \ +    && /bin/bash ~/anaconda.sh -b -p /opt/conda \ +    && rm ~/anaconda.sh \ +    && rm -fr /var/lib/apt/lists/{apt,dpkg,cache,log} /tmp/* /var/tmp/* +``` + * This file runs the wrapper script, **anaconda.sh**, and cleans up large files by removing them with **rm**. + * After the build is complete, you should see an image **anaconda_ubuntu1804:v1**. (You can list the images with **docker image ls**.) + * You can instantiate a container from this image using **./run_container.sh** at the terminal while in the folder **tutorial2_docker_tricks/**. You can verify that Anaconda is installed with: [code] $ ./run_container.sh +$ python --version +Python 3.7.5 +$ conda --version +conda 4.8.0 +$ anaconda --version +anaconda Command line client (version 1.7.2) +``` + * You'll note that **run_container.sh** sets up a volume **workdir**. In this example repository, the folder **workdir/** is empty. This is a convention I use to set up a volume where I can have my Python and other scripts that are independent of the container image. + + + +### Minimize container image size + +Each **RUN** command is equivalent to executing a new shell, and each **RUN** command creates a layer. The naive approach of mimicking installation instructions with separate **RUN** commands may eventually break at one or more interdependent steps. If it happens to work, it will typically result in a larger image. Chaining multiple installation steps in one **RUN** command and including the **autoremove**, **autoclean**, and **rm** commands (as in the example below) is useful to minimize the size of each layer. Some of these steps may not be needed, depending on what's being installed. However, since these steps take an insignificant amount of time, I always throw them in for good measure at the end of **RUN** commands invoking **apt-get**: + + +``` +RUN apt-get update \ +    && DEBIAN_FRONTEND=noninteractive \ +       apt-get -y --quiet --no-install-recommends install \ +       # list of packages being installed go here \ +    && apt-get -y autoremove \ +    && apt-get clean autoclean \ +    && rm -fr /var/lib/apt/lists/{apt,dpkg,cache,log} /tmp/* /var/tmp/* +``` + +Also, ensure that you have a **.dockerignore** file in place to ignore items that don't need to be sent to the Docker build context (such as the Anaconda installer file in the earlier example). + +### Organize the build tool I/O + +For software build systems, the build inputs and outputs—all the scripts that configure and invoke the tools—should be outside the image and the eventually running container. The container itself should remain stateless so that different users will have identical results with it. I covered this extensively in my [previous article][4] but wanted to emphasize it because it's been a useful convention for my work. These inputs and outputs are best accessed by setting up container volumes. + +I've had to use a container image that provides data in the form of source code and large pre-built binaries. As a software developer, I was expected to edit the code in the container. This was problematic, because containers are by default stateless: they don't save data within the container, because they're designed to be disposable. But I worked on it, and at the end of each day, I stopped the container and had to be careful not to remove it, because the state had to be maintained so I could continue work the next day. The disadvantage of this approach was that there would be a divergence of development state had there been more than one person working on the project. The value of having identical build systems across developers is somewhat lost with this approach. + +### Generate output as non-root user + +An important aspect of I/O concerns the ownership of the output files generated when running the tools in the container. By default, since Docker runs as **root**, the output files would be owned by **root**, which is unpleasant. You typically want to work as a non-root user. Changing the ownership after the build output is generated can be done with scripts, but it is an additional and unnecessary step. It's best to set the [**USER**][12] argument in the Dockerfile at the earliest point possible: + + +``` +ARG USERNAME +# other commands... +USER ${USERNAME} +``` + +The **USERNAME** can be passed in as a build argument (**\--build-arg**) when executing the **docker image build**. You can see an example of this in the example [Dockerfile][11] and corresponding [build script][13]. + +Some portions of the tools may also need to be installed as a non-root user. So the sequence of installations in the Dockerfile may need to be different from the way it's done if you are installing manually and directly under Linux. + +### Non-interactive installation + +Interactivity is the opposite of container automation. I've found the + + +``` +`DEBIAN_FRONTEND=noninteractive apt-get -y --quiet --no-install-recommends` +``` + +options for the **apt-get install** instruction (as in the example above) necessary to prevent the installer from opening dialog boxes. Note that these options should be used as part of the **RUN** instruction. The **DEBIAN_FRONTEND=noninteractive** should not be set as an environment variable (**ENV**) in the Dockerfile, as this [FAQ explains][14], as it will be inherited by the containers. + +### Log your build and run output + +Debugging why a build failed is a common task, and logs are a great way to do this. Save a TypeScript of everything that happened during the container image build or container run session using the **tee** utility in a Bash script. In other words, add **|& tee $BASH_SOURCE.log** to the end of the **docker image build** and the **docker image run** commands in your scripts. See the examples in the [image build][13] and [container run][15] scripts. + +What this **tee**-ing technique does is generate a file with the same name as the Bash script but with a **.log** extension appended to it so that you know which script it originated from. Everything you see printed to the terminal when running the script will get logged to this file with a similar name. + +This is especially valuable for users of your container images to report issues to you when something doesn't work. You can ask them to send you the log file to help diagnose the issue. Many tools generate so much output that it easily overwhelms the default size of the terminal's buffer. Relying only on the terminal's buffer capacity to copy-paste error messages may not be sufficient for diagnosing issues because earlier errors may have been lost. + +I've found this to be useful, even in the container image-building scripts, especially when using the Python-based HTTP server discussed above. The server generates so many lines during a download that it typically overwhelms the terminal's buffer. + +### Deal with proxies elegantly + +In my work environment, proxies are required to reach the internet for downloading the resources in **RUN apt-get** and **RUN wget** commands. The proxies are typically inferred from the environment variables **http_proxy** or **https_proxy**. While **ENV** commands can be used to hard-code such proxy settings in the Dockerfile, there are multiple issues with using **ENV** for proxies directly. + +If you are the only one who will ever build the container, then perhaps this will work. But the Dockerfile couldn't be used by someone else at a different location with a different proxy setting. Another issue is that the IT department could change the proxy at some point, resulting in a Dockerfile that won't work any longer. Furthermore, the Dockerfile is a precise document specifying a configuration-controlled system, and every change will be scrutinized by quality assurance. + +One simple approach to avoid hard-coding the proxy is to pass your local proxy setting as a build argument in the **docker image build** command: + + +``` +docker image build \ +    --build-arg MY_PROXY= +``` + +And then, in the Dockerfile, set the environment variables based on the build argument. In the example shown here, you can still set a default proxy value that can be overridden by the build argument above: + + +``` +# set a default proxy +ARG MY_PROXY=MY_PROXY= +ENV http_proxy=$MY_PROXY +ENV https_proxy=$MY_PROXY +``` + +### Summary + +These techniques have helped me significantly reduce the time it takes to create container images and debug them when they go wrong. I continue to be on the lookout for additional best practices to add to my list. I hope you find the above techniques useful. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/optimize-container-builds + +作者:[Ravi Chandran][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/ravichandran +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/toolbox-learn-draw-container-yearbook.png?itok=xDbwz1pP (Toolbox drawing of a container) +[2]: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ +[3]: https://github.com/ravi-chandran/dockerize-tutorial +[4]: https://opensource.com/article/20/4/how-containerize-build-system +[5]: https://podman.io/getting-started/installation +[6]: https://docs.docker.com/develop/develop-images/multistage-build/ +[7]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/tutorial2_docker_tricks/ +[8]: https://github.com/ravi-chandran/dockerize-tutorial/ +[9]: https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh +[10]: https://stackoverflow.com/a/37214138 +[11]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/tutorial2_docker_tricks/install_anaconda.dockerfile +[12]: https://docs.docker.com/engine/reference/builder/#user +[13]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/tutorial2_docker_tricks/build_docker_image.sh +[14]: https://docs.docker.com/engine/faq/ +[15]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/tutorial2_docker_tricks/run_container.sh diff --git a/sources/tech/20200515 How to examine processes running on Linux.md b/sources/tech/20200515 How to examine processes running on Linux.md new file mode 100644 index 0000000000..0659ab04f9 --- /dev/null +++ b/sources/tech/20200515 How to examine processes running on Linux.md @@ -0,0 +1,232 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to examine processes running on Linux) +[#]: via: (https://www.networkworld.com/article/3543232/how-to-examine-processes-running-on-linux.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +How to examine processes running on Linux +====== + +Thinkstock + +There are quite a number of ways to look at running processes on Linux systems – to see what’s running, the resources that processes are using, how the system is affected by the load and how memory is being used. Each command gives you a different view, and the range of details is considerable. In this post, we’ll run through a series of commands that can help you view process details in a number of different ways. + +### ps + +While the **ps** command is the most obvious command for examining processes, the arguments that you use when running **ps** will make a big difference in how much information will be provided. With no arguments, **ps** will only show processes associated with your current login session. Add a **-u** and you'll see extended details. + +Here is a comparison: + +``` +nemo$ ps + PID TTY TIME CMD + 45867 pts/1 00:00:00 bash + 46140 pts/1 00:00:00 ps +nemo$ ps -u +USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND +nemo 45867 0.0 0.0 11232 5636 pts/1 Ss 19:04 0:00 -bash +nemo 46141 0.0 0.0 11700 3648 pts/1 R+ 19:16 0:00 ps -u +``` + +Using **ps -ef** will display details on all of the processes running on the system but **ps -eF** will add some additional details. + +``` +$ ps -ef | head -2 +UID PID PPID C STIME TTY TIME CMD +root 1 0 0 May10 ? 00:00:06 /sbin/init splash +$ ps -eF | head -2 +UID PID PPID C SZ RSS PSR STIME TTY TIME CMD +root 1 0 0 42108 12524 0 May10 ? 00:00:06 /sbin/init splash +``` + +Both commands show who is running the process, the process and parent process IDs, process start time, accumulated run time and the task being run. The additional fields shown when you use **F** instead of **f** include: + + * SZ: the process **size** in physical pages for the core image of the process + * RSS: the **resident set size** which shows how much memory is allocated to those parts of the process in RAM. It does not include memory that is swapped out, but does include memory from shared libraries as long as the pages from those libraries are currently in memory. It also includes stack and heap memory. + * PSR: the **processor** the process is using + + + +##### ps -fU + +You can list processes for some particular user with a command like "ps -ef | grep USERNAME", but with **ps -fU** command, you’re going to see considerably more data. This is because details of processes that are being run on the user's behalf are also included. In fact, nearly all these processes shown have been kicked off by system simply to support this user’s online session. Nemo has only just logged in and is not yet running any commands or scripts. + +``` +$ ps -fU nemo +UID PID PPID C STIME TTY TIME CMD +nemo 45726 1 0 19:04 ? 00:00:00 /lib/systemd/systemd --user +nemo 45732 45726 0 19:04 ? 00:00:00 (sd-pam) +nemo 45738 45726 0 19:04 ? 00:00:00 /usr/bin/pulseaudio --daemon +nemo 45740 45726 0 19:04 ? 00:00:00 /usr/libexec/tracker-miner-f +nemo 45754 45726 0 19:04 ? 00:00:00 /usr/bin/dbus-daemon --sessi +nemo 45829 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfsd +nemo 45856 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfsd-fuse /run +nemo 45862 45706 0 19:04 ? 00:00:00 sshd: nemo@pts/1 +nemo 45864 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-udisks2-vo +nemo 45867 45862 0 19:04 pts/1 00:00:00 -bash +nemo 45878 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-afc-volume +nemo 45883 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-goa-volume +nemo 45887 45726 0 19:04 ? 00:00:00 /usr/libexec/goa-daemon +nemo 45895 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-mtp-volume +nemo 45896 45726 0 19:04 ? 00:00:00 /usr/libexec/goa-identity-se +nemo 45903 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-gphoto2-vo +nemo 45946 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfsd-metadata +``` + +Note that the only process with an assigned TTY is Nemo's shell and that the parent of all of the other processes is **systemd**. + +You can supply a comma-separated list of usernames instead of a single name. Just be prepared to be looking at quite a bit more data. + +#### top and ntop + +The **top** and **ntop** commands will help when you want to get an idea which processes are using the most resources and allow you to reorder your view depending on what criteria you want to use to rank the processes (e.g., highest CPU or memory use). + +``` +top - 11:51:27 up 1 day, 21:40, 1 user, load average: 0.08, 0.02, 0.01 +Tasks: 211 total, 1 running, 210 sleeping, 0 stopped, 0 zombie +%Cpu(s): 5.0 us, 0.5 sy, 0.0 ni, 94.3 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st +MiB Mem : 5944.4 total, 3527.4 free, 565.1 used, 1851.9 buff/cache +MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 5084.3 avail Mem + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 999 root 20 0 394660 14380 10912 S 8.0 0.2 0:46.54 udisksd + 65224 shs 20 0 314268 9824 8084 S 1.7 0.2 0:00.34 gvfs-ud+ + 2034 gdm 20 0 314264 9820 7992 S 1.3 0.2 0:06.25 gvfs-ud+ + 67909 root 20 0 0 0 0 I 0.3 0.0 0:00.09 kworker+ + 1 root 20 0 168432 12532 8564 S 0.0 0.2 0:09.93 systemd + 2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd +``` + +Use **shift+m** to sort by memory use and **shift+p** to go back to sorting by CPU usage (the default). + +#### /proc + +A tremendous amount of information is available on running processes in the **/proc** directory. In fact, if you haven't visited **/proc** quite a few times, you might be astounded by the amount of details available. Just keep in mind that **/proc** is a very different kind of file system. As an interface to kernel data, it provides a view of process details that are currently being used by the system. + +Some of the more useful **/proc** files for viewing include **cmdline**, **environ**, **fd**, **limits** and **status**. The following views provide some samples of what you might see. + +The **status** file shows the process that is running (bash), its status, the user and group ID for the person running bash, a full list of the groups the user is a member of and the process ID and parent process ID. + +``` +$ head -11 /proc/65333/status +Name: bash +Umask: 0002 +State: S (sleeping) +Tgid: 65333 +Ngid: 0 +Pid: 65333 +PPid: 65320 +TracerPid: 0 +Uid: 1000 1000 1000 1000 +Gid: 1000 1000 1000 1000 +FDSize: 256 +Groups: 4 11 24 27 30 46 118 128 500 1000 +... +``` + +The **cmdline** file shows the command line used to start the process. + +``` +$ cat /proc/65333/cmdline +-bash +``` + +The **environ** file shows the environment variables that are in effect. + +``` +$ cat environ +USER=shsLOGNAME=shsHOME=/home/shsPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/gamesSHELL=/bin/bashTERM=xtermXDG_SESSION_ID=626XDG_RUNTIME_DIR=/run/user/1000DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/busXDG_SESSION_TYPE=ttyXDG_SESSION_CLASS=userMOTD_SHOWN=pamLANG=en_US.UTF-8SSH_CLIENT=192.168.0.19 9385 22SSH_CONNECTION=192.168.0.19 9385 192.168.0.11 22SSH_TTY=/dev/pts/0$ +``` + +The **fd** file shows the file descriptors. Note how they reflect the pseudo-tty that is being used (pts/0). + +``` +$ ls -l /proc/65333/fd +total 0 +lrwx------ 1 shs shs 64 May 12 09:45 0 -> /dev/pts/0 +lrwx------ 1 shs shs 64 May 12 09:45 1 -> /dev/pts/0 +lrwx------ 1 shs shs 64 May 12 09:45 2 -> /dev/pts/0 +lrwx------ 1 shs shs 64 May 12 09:56 255 -> /dev/pts/0 +$ who +shs pts/0 2020-05-12 09:45 (192.168.0.19) +``` + +The **limits** file contains information about the limits imposed on the process. + +``` +$ cat limits +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 23554 23554 processes +Max open files 1024 1048576 files +Max locked memory 67108864 67108864 bytes +Max address space unlimited unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 23554 23554 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us +``` + +#### pmap + +The **pmap** command takes you in an entirely different direction when it comes to memory use. It provides a detailed map of a process’s memory usage. To make sense of this, you need to keep in mind that processes do not run entirely on their own. Instead, they make use of a wide range of system resources. The truncated **pmap** output below shows a portion of the memory map for a single user’s bash login along with some memory usage totals at the bottom. + +``` +$ pmap -x 43120 +43120: -bash +Address Kbytes RSS Dirty Mode Mapping +000055887655b000 180 180 0 r---- bash +0000558876588000 708 708 0 r-x-- bash +0000558876639000 220 148 0 r---- bash +0000558876670000 16 16 16 r---- bash +0000558876674000 36 36 36 rw--- bash +000055887667d000 40 28 28 rw--- [ anon ] +0000558876b96000 1328 1312 1312 rw--- [ anon ] +00007f0bd9a7e000 28 28 0 r---- libpthread-2.31.so +00007f0bd9a85000 68 68 0 r-x-- libpthread-2.31.so +00007f0bd9a96000 20 0 0 r---- libpthread-2.31.so +00007f0bd9a9b000 4 4 4 r---- libpthread-2.31.so +00007f0bd9a9c000 4 4 4 rw--- libpthread-2.31.so +00007f0bd9a9d000 16 4 4 rw--- [ anon ] +00007f0bd9aa1000 20 20 0 r---- libnss_systemd.so.2 +00007f0bd9aa6000 148 148 0 r-x-- libnss_systemd.so.2 +... +ffffffffff600000 4 0 0 --x-- [ anon ] +---------------- ------- ------- ------- +total kB 11368 5664 1656 + +Kbytes: size of map in kilobytes +RSS: resident set size in kilobytes +Dirty: dirty pages (both shared and private) in kilobytes +``` +``` + +``` + +Join the Network World communities on [Facebook][1] and [LinkedIn][2] to comment on topics that are top of mind. + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3543232/how-to-examine-processes-running-on-linux.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://www.facebook.com/NetworkWorld/ +[2]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20200515 The pieces of Fedora Silverblue.md b/sources/tech/20200515 The pieces of Fedora Silverblue.md new file mode 100644 index 0000000000..04bd4e1643 --- /dev/null +++ b/sources/tech/20200515 The pieces of Fedora Silverblue.md @@ -0,0 +1,172 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (The pieces of Fedora Silverblue) +[#]: via: (https://fedoramagazine.org/pieces-of-fedora-silverblue/) +[#]: author: (Nick Hardiman https://fedoramagazine.org/author/nickhardiman/) + +The pieces of Fedora Silverblue +====== + +![][1] + +Fedora Silverblue provides a useful workstation build on an immutable operating system. In “[What is Silverblue?][2]“, you learned about the benefits that an immutable OS provides. But what pieces go into making it? This article examines some of the technology that powers Silverblue. + +### The filesystem + +Fedora Workstation users may find the idea of an immutable OS to be the most brain-melting part of Silverblue. What does that mean? Find some answers by taking a look at the filesystem. + +At first glance, the layout looks pretty much the same as a regular Fedora file system. It has some differences, like making _/home_ a symbolic link to _/var/home_. And you can get more answers by looking at how libostree works. libostree treats the whole tree like it’s an object, checks it into a code repository, and checks out a copy for your machine to use. + +#### libostree + +The [libostree project][3] supplies the goods for managing Silverblue’s file system. It is an upgrade system that the user can control using [rpm-ostree commands][4]. + +libostree knows nothing about packages—an upgrade means replacing one complete file system with another complete file system. libostree treats the file system tree as one atomic object (an unbreakable unit). In fact, the forerunner to Silverblue was named [Project Atomic][5]. + +The libostree project provides a library and set of tools. It’s an upgrade system that carries out these tasks. + + 1. Pull in a new file system + 2. Store the new file system + 3. Deploy the new file system + + + +##### Pull in a new file system + +Pulling in a new file system means copying an object (the entire file system) from a remote source to its own store. If you’ve worked with virtual machine image files, you already understand the concept of a file system object that you can copy. + +##### Store the new file system + +The libostree store has some source code control qualities—it stores many file system objects, and checks one out to be used as the root file system. libostree’s store has two parts: + + * a repository database at _/sysroot/ostree/repo/_ + * file systems in _/sysroot/ostree/deploy/fedora/deploy/_ + + + +libostree keeps track of what’s been checked in using commit IDs. Each commit ID can be found in a directory name, nested deep inside _/sysroot_ .A libostree commit ID is a long checksum, and looks similar to a git commit ID. + +``` +$ ls -d /sysroot/ostree/deploy/fedora/deploy/*/ +/sysroot/ostree/deploy/fedora/deploy/c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4.0/ +``` + +_rpm-ostree status_ gives a little more information about that commit ID. The output is a little confusing; it can take a while to see this file system is Fedora 31. + +``` +$ rpm-ostree status +State: idle +AutomaticUpdates: disabled +Deployments: +● ostree://fedora:fedora/31/x86_64/silverblue + Version: 31.1.9 (2019-10-23T21:44:48Z) + Commit: c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4 + GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4 +``` + +##### Deploy the new filesystem + +libostree deploys a new file system by checking out the new object from its store. libostree doesn’t check out a file system by copying all the files—it uses hard links instead. If you look inside the commit ID directory, you see something that looks suspiciously like the root directory. That’s because it _is_ the root directory. You can see these two directories are pointing to the same place by checking their inodes. + +``` +$ ls -di1 / /sysroot/ostree/deploy/fedora/deploy/*/ +260102 / +260102 /sysroot/ostree/deploy/fedora/deploy/c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4.0/ +``` + +This is a fresh install, so there’s only one commit ID. After a system update, there will be two. If more copies of the file system are checked into libostree’s repo, more commit IDs appear here. + +##### Upgrade process + +Putting the pieces together, the update process looks like this: + + 1. libostree checks out a copy of the file system object from the repository + 2. DNF installs packages into the copy + 3. libostree checks in the copy as a new object + 4. libostree checks out the copy to become the new file system + 5. You reboot to pick up the new system files + + + +In addition to more safety, there is more flexibility. You can do new things with libostree’s repo, like store a few different file systems and check out whichever one you feel like using. + +#### Silverblue’s root file system + +Fedora keeps its system files in all the usual Linux places, such as _/boot_ for boot files, _/etc_ for configuration files, and _/home_ for user home directories. The root directory in Silverblue looks much like the root directory in traditional Fedora, but there are some differences. + + * The filesystem has been checked out by libostree + * Some directories are now symbolic links to new locations. For example, _/home_ is a symbolic link to _/var/home_ + * _/usr_ is a read-only directory + * There’s a new directory named _/sysroot_. This is libostree’s new home + + + +#### Juggling file systems + +You can store many file systems and switch between them. This is called _rebasing_, and it’s similar to git rebasing. In fact, upgrading Silverblue to the next Fedora version is not a big package install—it’s a pull from a remote repository and a rebase. + +You could store three copies with three different desktops: one KDE, one GNOME, and one XFCE. Or three different OS versions: how about keeping the current version, the nightly build, and an old classic? Switching between them is a matter of rebasing to the appropriate file system object. + +Rebasing is also how you upgrade from one Fedora release to the next. See “[How to rebase to Fedora 32 on Silverblue][6]” for more information. + +### Flatpak + +The [Flatpak project][7] provides a way of installing applications like LibreOffice. Applications are pulled from remote repositories like [Flathub][8]. It’s a kind of package manager, although you won’t find the word _package_ in the [docs][9]. Traditional Fedora variants like Fedora Workstation can also use Flatpak, but the sandboxed nature of flatpaks make it particularly good for Silverblue. This way you do not have to do the entire ostree update process every time you wish to install an application. + +Flatpak is well-suited to desktop applications, but also works for command line applications. You can install the [vim][10] editor with the command _flatpak install flathub org.vim.Vim_ and run it with _flatpak run org.vim.Vim_. + +### toolbox + +The [toolbox project][11] provides a traditional operating system inside a container. The idea is that you can mess with the mutable OS inside your toolbox (the Fedora container) as much as you like, and leave the immutable OS outside your toolbox untouched. You pack as many toolboxes as you want on your system, so you can keep work separated. Behind the scenes, the executable _/usr/bin/toolbox_ is a shell script that uses [podman][12]. + +A fresh install does not include a default toolbox. The _toolbox create_ command checks the OS version (by reading _/usr/lib/os-release_), looks for a matching version at the Fedora container registry, and downloads the container. + +``` +$ toolbox create +Image required to create toolbox container. +Download registry.fedoraproject.org/f31/fedora-toolbox:31 (500MB)? [y/N]: y +Created container: fedora-toolbox-31 +Enter with: toolbox enter +``` + +Hundreds of packages are installed inside the toolbox. The _dnf_ command and the usual Fedora repos are set up, ready to install more. The _ostree_ and _rpm-ostree_ commands are not included – no immutable OS here. + +Each user’s home directory is mounted on their toolbox, for storing content files outside the container. + +### Put the pieces together + +Spend some time exploring Fedora Silverblue and it will become clear how these components fit together. Like other Fedora variants, all these of tools come from open source projects. You can get as up close and personal as you want, from reading their docs to contributing code. Or you can [contribute to Silverblue][13] itself. + +Join the Fedora Silverblue conversations on [discussion.fedoraproject.org][14] or in [#silverblue on Freenode IRC][15]. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/pieces-of-fedora-silverblue/ + +作者:[Nick Hardiman][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/nickhardiman/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/04/silverblue-pieces-816x345.png +[2]: https://fedoramagazine.org/what-is-silverblue/ +[3]: https://ostree.readthedocs.io/en/latest/ +[4]: https://rpm-ostree.readthedocs.io/en/latest/manual/administrator-handbook/#administering-an-rpm-ostree-based-system +[5]: https://www.projectatomic.io/ +[6]: https://fedoramagazine.org/how-to-rebase-to-fedora-32-on-silverblue/ +[7]: https://github.com/flatpak/flatpak +[8]: https://flathub.org/ +[9]: http://docs.flatpak.org/en/latest/index.html +[10]: https://www.vim.org/ +[11]: https://github.com/containers/toolbox +[12]: https://github.com/containers/libpod +[13]: https://silverblue.fedoraproject.org/contribute +[14]: https://discussion.fedoraproject.org/c/desktop/silverblue +[15]: https://webchat.freenode.net/#silverblue diff --git a/sources/tech/20200516 Fatih-s question.md b/sources/tech/20200516 Fatih-s question.md new file mode 100644 index 0000000000..1225c624a8 --- /dev/null +++ b/sources/tech/20200516 Fatih-s question.md @@ -0,0 +1,214 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Fatih’s question) +[#]: via: (https://dave.cheney.net/2020/05/16/fatihs-question) +[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) + +Fatih’s question +====== + +A few days ago Fatih posted [this question][1] on twitter. + +I’m going to attempt to give my answer, however to do that I need to apply some simplifications as my previous attempts to answer it involved a lot of phrases like _a pointer to a pointer_, and other unhelpful waffling. Hopefully my simplified answer can be useful in building a mental framework to answer Fatih’s original question. + +### Restating the question + +Fatih’s original tweet showed [four different variations][2] of `json.Unmarshal`. I’m going to focus on the last two, which I’ll rewrite a little: + +``` +package main + +import ( + "encoding/json" + "fmt" +) + +type Result struct { + Foo string `json:"foo"` +} + +func main() { + content := []byte(`{"foo": "bar"}`) + var result1, result2 *Result + + err := json.Unmarshal(content, &result1) + fmt.Println(result1, err) // &{bar} + + err = json.Unmarshal(content, result2) + fmt.Println(result2, err) // json: Unmarshal(nil *main.Result) +} +``` + +Restated in words, `result1` and `result2` are the same type; `*Result`. Decoding into `result1` works as expected, whereas decoding into `result2` causes the `json` package to complain that the value passed to `Unmarshal` is `nil`. However, both values were declared without an initialiser so both would have taken on the type’s zero value, `nil`. + +Eagle eyed readers will have spotted that the reason for the difference is the first` `invocation is passed `&result1`, while the second is passed `result2`, but this explanation is unsatisfactory because the documentation for `json.Unmarshal` states: + +> Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v. **If v is nil or not a pointer**, Unmarshal returns an InvalidUnmarshalError. + +Which is confusing because `result1` and `result2` _are_ pointers. Furthermore, without initialisation, both _are_ `nil`. Now, the documentation is correct (as you’d expect from a package that has been hammered on for a decade), but explaining _why_ takes a little more investigation. + +### Functions receive a copy of their arguments + +Every assignment in Go is a copy, this includes function arguments and return values. + +``` +package main + +import ( + "fmt" +) + +func increment(v int) { + v++ +} + +func main() { + v := 1 + increment(v) + fmt.Println(v) // 1 +} +``` + +In this example, `increment` is operating on a _copy_ of `main`‘s `v`. This is because the `v` declared in `main` and `increment`‘s `v` parameter have different addresses in memory. Thus changes to `increment`‘s `v` cannot affect the contents of `main`‘s `v`. + +``` +package main + +import ( + "fmt" +) + +func increment(v *int) { + *v++ +} + +func main() { + v := 1 + increment(&v) + fmt.Println(v) // 2 +} +``` + +If we wanted to write `increment` in a way that it could affect the contents of its caller we would need to pass a reference, a pointer, to `main.v`.[1][3] This example demonstrates why `json.Unmarshal` needs a pointer to the value to decode JSON into. + +### Pointers to pointers + +Returning to the original question, both `result1` and `result2` are declared as `*Result`, that is, pointers to a `Result` value. We established that you have to pass the address of caller’s value to `json.Unmarshal` otherwise it won’t be able to alter the contents of the caller’s value. Why then must we pass the address of `result1`, a `**Result`, a pointer to a pointer to a `Result`, for the operation to succeed. + +To explain this another detour is required. Consider this code: + +``` +package main + +import ( + "encoding/json" + "fmt" +) + +type Result struct { + Foo *string `json:"foo"` +} + +func main() { + content := []byte(`{"foo": "bar"}`) + var result1 *Result + + err := json.Unmarshal(content, &result1) + fmt.Printf("%#v %v", result1, err) // &main.Result{Foo:(*string)(0xc0000102f0)} +} +``` + +In this example `Result` contains a pointer typed field, `Foo *string`. During JSON decoding `Unmarshal` allocated a new `string` value, stored the value `bar` in it, then placed the address of the string in `Result.Foo`. This behaviour is quite handy as it frees the caller from having to initialise `Result.Foo` and makes it easier to detect when a field was not initialised because the JSON did not contain a value. Beyond the convenience this offers for simple examples it would be prohibitively difficult for the caller to properly initialise all the reference type fields in a structure before decoding unknown JSON without first inspecting the incoming JSON which itself may be problematic if the input is coming from an `io.Reader` without the ability to rewind the input. + +> To unmarshal JSON into a pointer, Unmarshal first handles the case of the JSON being the JSON literal null. In that case, Unmarshal sets the pointer to nil. Otherwise, Unmarshal unmarshals the JSON into the value pointed at by the pointer. **If the pointer is nil, Unmarshal allocates a new value for it to point to**. + +`json.Unmarshal`‘s handling of pointer fields is clearly documented, and works as you would expect, allocating a new value whenever there is a need to decode into a pointer shaped field. It is this behaviour that gives us a hint to what is happening in the original example. + +We’ve seen that when `json.Unmarshal` encounters a field which points to `nil` it will allocate a new value of the correct type and assign its address the field before proceeding. Not only is does behaviour is applied recursively–for example in the case of a complex structure which contains pointers to other structures–but it also applies to the _value passed to `Unmarshal`._ + +``` +package main + +import ( + "encoding/json" + "fmt" +) + +func main() { + content := []byte(`1`) + var result *int + + err := json.Unmarshal(content, &result) + fmt.Println(*result, err) // 1 +} +``` + +In this example `result` is not a struct, but a simple `*int` which, lacking an initialiser, defaults to `nil`. After JSON decoding, `result` now points to an `int` with the value `1`. + +### Putting the pieces together + +Now I think I’m ready to take a shot at answering Fatih’s question. + +`json.Unmarshal` requires the address of the variable you want to decode into, otherwise it would decode into a temporary copy which would be discard on return. Normally this is done by declaring a value, then passing its address, or explicitly initialising the the value + +``` +var result1 Result +err := json.Unmarshal(content, &result1) // this is fine + +var result2 = new(Result) +err = json.Unmarshal(content, result2) // and this + +var result3 = &Result{} +err = json.Unmarshal(content, result3) // this is also fine +``` + +In all three cases the address that the `*Result` points too is not `nil`, it points to initialised memory that `json.Unmarshal` decodes into. + +Now consider what happens when `json.Unmarshal` encounters this + +``` +var result4 *Result +err = json.Unmarshal(content, result4) // err json: Unmarshal(nil *main.Result) +``` + +`result2`, `result3`, and the expression `&result1` point to a `Result`. However `result4`, even though it has the same type as the previous three, does not point to initialised memory, it points to `nil`. Thus, according to the examples we saw previously, before `json.Unmarshal` can decode into it, the memory `result4` points too must be initialised. + +However, because each function receives a copy of its arguments, the caller’s `result4` variable and the copy inside `json.Unmarshal` are unique. `json.Unmarshal` can allocate a new `Result` value and decode into it, but it cannot alter `result4` to point to this new value because it was not provided with a reference to `result4`, only a copy of its contents. + + 1. This does not violate the _everything is a copy_ rule, a copy of a pointer to `main.v` still points to `main.v`.[][4] + + + +#### Related posts: + + 1. [Should methods be declared on T or *T][5] + 2. [Ice cream makers and data races][6] + 3. [Understand Go pointers in less than 800 words or your money back][7] + 4. [Slices from the ground up][8] + + + +-------------------------------------------------------------------------------- + +via: https://dave.cheney.net/2020/05/16/fatihs-question + +作者:[Dave Cheney][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://dave.cheney.net/author/davecheney +[b]: https://github.com/lujun9972 +[1]: https://twitter.com/fatih/status/1260683136842608640 +[2]: https://play.golang.org/p/g2yUIYrV67F +[3]: tmp.dRxkHxYRQS#easy-footnote-bottom-1-4153 (This does not violate the everything is a copy rule, a copy of a pointer to main.v still points to main.v.) +[4]: tmp.dRxkHxYRQS#easy-footnote-1-4153 +[5]: https://dave.cheney.net/2016/03/19/should-methods-be-declared-on-t-or-t (Should methods be declared on T or *T) +[6]: https://dave.cheney.net/2014/06/27/ice-cream-makers-and-data-races (Ice cream makers and data races) +[7]: https://dave.cheney.net/2017/04/26/understand-go-pointers-in-less-than-800-words-or-your-money-back (Understand Go pointers in less than 800 words or your money back) +[8]: https://dave.cheney.net/2018/07/12/slices-from-the-ground-up (Slices from the ground up) diff --git a/sources/tech/20200518 Using Fedora to implement REST API in JavaScript- part 2.md b/sources/tech/20200518 Using Fedora to implement REST API in JavaScript- part 2.md new file mode 100644 index 0000000000..b02822c4fa --- /dev/null +++ b/sources/tech/20200518 Using Fedora to implement REST API in JavaScript- part 2.md @@ -0,0 +1,208 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Using Fedora to implement REST API in JavaScript: part 2) +[#]: via: (https://fedoramagazine.org/using-fedora-to-implement-rest-api-in-javascript-part-2/) +[#]: author: (Vaclav Keil https://fedoramagazine.org/author/vaclavk/) + +Using Fedora to implement REST API in JavaScript: part 2 +====== + +![][1] + +In [part 1][2] previously, you saw how to quickly create a simple API service using Fedora Workstation, Express, and JavaScript. This article shows you the simplicity of how to create a new API. This part shows you how to: + + * Install a DB server + * Build a new route + * Connect a new datasource + * Use Fedora terminal to send and receive data + + + +### Generating an app + +Please refer to the [previous article][2] for more details. But to make things simple, change to your work directory and generate an app skeleton. +``` + +``` + +$ cd our-work-directory +$ npx express-generator –no-view –git /myApp +$ cd myApp +$ npm i +``` + +``` + +### Installing a database server + +In this part, we’ll install MariaDB database. MariaDB is the Fedora default database. + +``` +$ dnf module list mariadb | sort -u ## lists the streams available +$ sudo dnf module install mariadb:10.3 ##10.4 is the latest +``` + +_Note: the default profile is mariadb/server_. + +For those who need to spin up a Docker container a ready made container with Fedora 31 is available. + +``` +$ docker pull registry.fedoraproject.org/f31/mariadb +$ docker run -d --name mariadb_database -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 registry.fedoraproject.org/f31/mariadb +``` + +Now start the MariaDB service. + +``` +$ sudo systemctl start mariadb +``` + +If you’d like the service to start at boot, you can also enable it in systemd: + +``` +$ sudo systemctl enable mariadb ## start at boot +``` + +Next, setup the database as needed: + +``` +$ mysql -u root -p ## root password is blank +MariaDB> CREATE DATABASE users; +MariaDB> create user dbuser identified by ‘123456‘; +MariaDB> grant select, insert, update, create, drop on users.* to dbuser; +MariaDB> show grants for dbuser; +MariaDB> \q +``` + +A database connector is needed to use the database with Node.js. + +``` +$ npm install mariadb ## installs MariaDB Node.js connector +``` + +We’ll leverage Sequelize in this sample API. Sequelize is a promise-based Node.js ORM (Object Relational Mapper) for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server. + +``` +$ npm install sequelize ## installs Sequelize +``` + +### Connecting a new datasource + +Now, create a new _db_ folder and create a new file _sequelize.js_ there: + +``` +const Sequelize = require('sequelize'), + sequelize = new Sequelize(process.env.db_name || 'users', process.env.db_user || 'dbuser', process.env.db_pass || '123456', { + host: 'localhost', + dialect: 'mariadb', + ssl: true +}) + +module.exports = sequelize +``` + +_Note: For the sake of completeness I‘m including a link to the related Github repo: _ + +Let‘s create a new file _models/user.js_. A nice feature of a Sequelize model is that it helps us to create the necessary tables and colums automatically. The code snippet responsible for doing this is seen below: + +``` +sequelize.sync({ +force: false +}) +``` + +Note: never switch to true with a production database – it would _drop your tables at app start_! + +We will refer to the earlier created sequelize.js this way: + +``` +const sequelize = require('../db/sequelize') +``` + +### Building new routes + +Next, you’ll create a new file _routes/user.js_. You already have _routes/users.js_ from the previous article. You can copy and paste the code in and proceed with editing it. + +You’ll also need a reference to the previously created model. + +``` +const User = require('../models/user') +``` + +Change the route path to _/users_ and also create a new **post** method route. + +Mind the async – await keywords there. An interaction with a database will take some time and this one will do the trick. Yes, an async function returns a promise and this one makes promises easy to use. + +_Note: This code is not production ready, since it would also need to include an authentication feature._ + +We‘ll make the new route working this way: + +``` +const userRouter = require('./routes/user') +app.use(userRouter) +``` + +Let‘s also remove the existing _usersRouter_. The _routes/users.js_ can be deleted too. + +``` +$ npm start +``` + +With the above command, you can launch your new app. + +### Using the terminal to send and retrieve data + +Let’s create a new database record through the post method: + +``` +$ curl -d 'name=Adam' http://localhost:3000/users +``` + +To retrieve the data created through the API, do an HTTP GET request: + +``` +$ curl http://localhost:3000/users +``` + +The console output of the curl command is a JSON array containing data of all the records in the _Users_ table. + +_Note: This is not really the usual end result — an application consumes the API finally. The API will usually also have endpoints to update and remove data._ + +### More automation + +Let‘s assume we might want to create an API serving many tables. It‘s possible and very handy to automatically generate models for Sequelize from our database. Sequelize-auto will do the heavy lifting for us. The resulting files (_models.js_) would be placed and imported within the _/models_ directory. + +``` +$ npm install sequelize-auto +``` + +A node.js connector is needed to use this one and we have it already installed for MariaDB. + +### Conclusion + +It‘s possible to develop and run an API using Fedora, Fedora default MariaDB, JavaScript and efficiently develop a solution like with a noSQL database. For those used to working with MongoDB or a similar noSQL database, Fedora and MariaDB are important open-source enablers. + +* * * + +_Photo by [Mazhar Zandsalimi][3] on [Unsplash][4]._ + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/using-fedora-to-implement-rest-api-in-javascript-part-2/ + +作者:[Vaclav Keil][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/vaclavk/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/05/javascript-api-2-816x345.jpg +[2]: https://fedoramagazine.org/using-fedora-to-quickly-implement-rest-api-with-javascript/ +[3]: https://unsplash.com/@m47h4r?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://unsplash.com/s/photos/javascript?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20200519 How to use Windows Subsystem for Linux to open Linux on Windows 10 machines.md b/sources/tech/20200519 How to use Windows Subsystem for Linux to open Linux on Windows 10 machines.md new file mode 100644 index 0000000000..e610f7eb2f --- /dev/null +++ b/sources/tech/20200519 How to use Windows Subsystem for Linux to open Linux on Windows 10 machines.md @@ -0,0 +1,153 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to use Windows Subsystem for Linux to open Linux on Windows 10 machines) +[#]: via: (https://www.networkworld.com/article/3543845/how-to-use-windows-subsystem-for-linux-to-open-linux-on-windows-10-machines.html) +[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/) + +How to use Windows Subsystem for Linux to open Linux on Windows 10 machines +====== +Opening a Linux terminal on a Windows 10 desktop can help you practice your Linux skills and explore Windows from an entirely different point of view. In this post, we look at Ubuntu 18.04 running through Windows Subsystem for Linux (WSL). +[Nicolas Solerieu modified by IDG Comm. / Linux][1] [(CC0)][2] + +Believe it or not, it's possible to open a Linux terminal on a Windows 10 system and you might be surprised how much Linux functionality you’ll be able to get by doing so. + +You can run Linux commands, traipse around the provided Linux file system and even take a novel look at Windows files. The experience isn’t altogether different than opening a terminal window on a Linux desktop, with a few interesting exceptions. + +[[Get regularly scheduled insights by signing up for Network World newsletters.]][3] + +What is needed to make this happen is something called the Windows Subsystem for Linux (WSL) and a Windows 10 x86 PC. + +### Linux versions for WSL + +There are a number of options for running Linux on top of Windows. The Linux OS choices include: + + * [Ubuntu 16.04 LTS][4] + * [Ubuntu 18.04 LTS][5] + * [openSUSE Leap 15.1][6] + * [SUSE Linux Enterprise Server 12 SP5][7] + * [SUSE Linux Enterprise Server 15 SP1][8] + * [Kali Linux][9] + * [Debian GNU/Linux][10] + * [Fedora Remix for WSL][11] + * [Pengwin][12] + * [Pengwin Enterprise][13] + * [Alpine WSL][14] + + + +Ubuntu 18.04 LTS is just one option and, in this post, we’ll take a look at how the terminal runs on Windows using this particular distribution and how much it feels like working on a Linux system directly. + +If you want to look into the process of putting an Ubuntu distribution on your Windows system, you can start with this page: + + + +As part of the initial setup of installing your Linux on Windows terminal, you’ll be asked to create your user account. Once you do that and open the terminal, you can start to explore. One of the most noticeable differences between your Linux-on-Windows terminal and a terminal window on a Linux system is that examining processes isn’t going to show you much. After all, Windows will be providing the bulk of the required OS support. You’re likely to see something like this: + +``` +myacct@hostname:~$ ps -ef +UID PID PPID C STIME TTY TIME CMD +root 1 0 0 12:45 ? 00:00:00 /init +root 7 1 0 12:45 tty1 00:00:00 /init +shs 8 7 0 12:45 tty1 00:00:00 -bash +shs 166 8 0 13:32 tty1 00:00:00 ps -ef +``` + +Yes, that's it. + +If you’re anything like me, one of your next moves might be to get a handle on the available commands. If you just count the files in the **/bin** and **/usr/bin** directories, you should see that there are a lot of commands: + +``` +myacct@hostname:~$ ls /bin | wc -l +171 +myacct@hostname:~$ ls /usr/bin | wc -l +707 +``` + +You can list available commands with commands like these (output truncated for this post): + +``` +myacct@hostname:~$ ls /bin | head -25 | column +bash btrfs-map-logical bunzip2 bzegrep bzip2recover +btrfs btrfs-select-super busybox bzexe bzless +btrfs-debug-tree btrfs-zero-log bzcat bzfgrep bzmore +btrfs-find-root btrfsck bzcmp bzgrep cat +btrfs-image btrfstune bzdiff bzip2 chacl + +myacct@hostname:~$ ls /usr/bin | head -25 | column +NF aa-exec apport-cli apt apt-extracttempl* +VGAuthService acpi_listen apport-collect apt-add-repository apt-ftparchive +X11 add-apt-repository apport-unpack apt-cache apt-get +[ addpart appres apt-cdrom apt-key +aa-enabled apport-bug apropos apt-config apt-mark +``` + +You can update the system with **apt** commands (sudo apt update, sudo apt upgrade). You can even use Linux commands to move to the Windows disk partitions as you like and . Notice the last three entries in the output below. These represent several drives on the system. + +``` +myacct@hostname:~$ df -k +Filesystem 1K-blocks Used Available Use% Mounted on +rootfs 973067784 326920584 646147200 34% / +none 973067784 326920584 646147200 34% /dev +none 973067784 326920584 646147200 34% /run +none 973067784 326920584 646147200 34% /run/lock +none 973067784 326920584 646147200 34% /run/shm +none 973067784 326920584 646147200 34% /run/user +cgroup 973067784 326920584 646147200 34% /sys/fs/cgroup +C:\ 973067784 326920584 646147200 34% /mnt/c <== C drive +I:\ 976760000 231268208 745491792 24% /mnt/I <== external drive +L:\ 409599996 159240 409440756 1% /mnt/l <== USB thumb drive +``` + +If you’re interested in moving out of the Linux space and into the Windows portion of the file system within your **WSL** session, you can do that easily. Replace “myname” with your Windows account name and a **cd /mnt/c/Users/_myname_/Desktop** will take you to your Windows desktop. From there, don’t be surprised if in listing your files you see **WRL####.tmp** files that don’t seem to exist when you look at your desktop and don’t show up if you look at your files by opening a command prompt. These appear to be temporary files used by Windows for document management. You might also see files listed that look like **‘~$nux notes.docx’** – perhaps ghosts of files that were once located on your desktop. You won’t see those files when you look at your desktop on Windows – even using a **cmd** window. + +Note that you’ll also see Windows directories such as **‘Program Files’** in single quotes when listed in your Linux terminal as you would any file with blanks included in their names. You can even start a Windows executable from your Linux terminal. For example: + +``` +myacct@hostname: $ cd /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0 +myacct@hostname: $ powershell.exe +``` + +If you do this, type **exit** when you want to end the **powershell** session. + +Linux commands all seem to work as expected, though I don’t get any output when I run the **who** command. + +Windows **.txt** files will display with **cat** commands, but the last line in a file will likely be displayed on the same line as the following shell prompt. This is because these files won’t end with a linefeed as Linux text files do. + +You can create other accounts and switch user to them (e.g., **su – nemo**) if you like, but not log into them directly. + +You can also update the system with apt commands (**sudo apt update**, **sudo apt upgrade**). + +Join the Network World communities on [Facebook][15] and [LinkedIn][16] to comment on topics that are top of mind. + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3543845/how-to-use-windows-subsystem-for-linux-to-open-linux-on-windows-10-machines.html + +作者:[Sandra Henry-Stocker][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/ +[b]: https://github.com/lujun9972 +[1]: https://unsplash.com/photos/4gRNmhGzYZE +[2]: https://creativecommons.org/publicdomain/zero/1.0/ +[3]: https://www.networkworld.com/newsletters/signup.html +[4]: https://www.microsoft.com/store/apps/9pjn388hp8c9 +[5]: https://www.microsoft.com/store/apps/9N9TNGVNDL3Q +[6]: https://www.microsoft.com/store/apps/9NJFZK00FGKV +[7]: https://www.microsoft.com/store/apps/9MZ3D1TRP8T1 +[8]: https://www.microsoft.com/store/apps/9PN498VPMF3Z +[9]: https://www.microsoft.com/store/apps/9PKR34TNCV07 +[10]: https://www.microsoft.com/store/apps/9MSVKQC78PK6 +[11]: https://www.microsoft.com/store/apps/9n6gdm4k2hnc +[12]: https://www.microsoft.com/store/apps/9NV1GV1PXZ6P +[13]: https://www.microsoft.com/store/apps/9N8LP0X93VCP +[14]: https://www.microsoft.com/store/apps/9p804crf0395 +[15]: https://www.facebook.com/NetworkWorld/ +[16]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20200520 Fedora Silverblue, an introduction for developers.md b/sources/tech/20200520 Fedora Silverblue, an introduction for developers.md new file mode 100644 index 0000000000..a112f4ca6d --- /dev/null +++ b/sources/tech/20200520 Fedora Silverblue, an introduction for developers.md @@ -0,0 +1,140 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Fedora Silverblue, an introduction for developers) +[#]: via: (https://fedoramagazine.org/fedora-silverblue-brings-future-tech-to-the-desktop/) +[#]: author: (Nick Hardiman https://fedoramagazine.org/author/nickhardiman/) + +Fedora Silverblue, an introduction for developers +====== + +![][1] + +The Fedora [Silverblue project][2] takes Fedora workstation, libostree and podman, puts them in a blender, and creates a new Immutable Fedora Workstation. Fedora Silverblue is an OS that stops you from changing the core system files arbitrarily, and readily allows you to change the environment system files. The article [What is Silverblue][3] describes the big picture, and this article drills down into details for the developer. + +Fedora Silverblue ties together a few different projects to make a system that is a git-like object, capable of layering packages, and has a container focused work flow. Silverblue is not the only distribution going down this road. It is the desktop equivalent of [CoreOS][4], the server OS used by [Red Hat Openshift][5]. + +Silverblue’s idea of ‘immutable’ has nothing to do with immutable layers in a container. Silverblue keeps system files immutable by making them read-only. + +### Why immutable? + +Has an upgrade left your system in an unusable state? Have you wondered why one server in a pool of identical machines is being weird? These problems can happen when one system library – one tiny little file out of hundreds – is corrupted, badly configured or the wrong version. Or maybe your upgrade works fine but it’s not what you’d hoped for, and you want to roll back to the previous state. + +An immutable OS is intended to stop problems like these biting you. This is not an easy thing to achieve – simple changes, like flipping the file system between read-write and read-only, may only change a fault-finding headache to a maintenance headache. + +Freezing the system is good news for sysadmins, but what about developers? Setting up a development environment means heavily customizing the system, and filling it with living code that changes over time. The answer is partly a case of combining components, and partly the ability to swap between OS versions. + +### How it works + +So how do you get the benefits of immutability without losing the ability to do your work? If you’re thinking ‘containers’, good guess – part of the solution uses [podman][6]. But much of the work happens underneath the container layer, at the OS level. + +Fedora Silverblue ties together a few different projects to turn an immutable OS into a usable workstation. Silverblue uses libostree to provide the base system, lets you edit config files in /etc/, and provides three different ways to install packages. + + * [rpm-ostree][7] installs RPM packages, similar to DNF in the traditional Fedora workstation. Use this for things that shouldn’t go in containers, like KVM/libvirt. + * [flatpak][8] installs packages from a central flathub repo. This is the one-stop shop for graphical desktop apps like LibreOffice. + * The traditional _dnf install_ still works, but only inside a [toolbox][9] (a Fedora container). A developer’s workbench goes in a toolbox. + + + +If you want to know more about these components, check out [Pieces of Silverblue][10]. + +### Rolling back and pinning upgrades + +All operating systems need upgrades. Features are added, security holes are plugged and bugs are squashed. But sometimes an upgrade is not a developer’s friend. + +A developer depends on many things to get the job done. A good development environment is stuffed with libraries, editors, toolchains and apps that are controlled by the OS, not the developer. An upgrade may cause trouble. Have any of these situations happened to you? + + * A new encryption library is too strict, and an upgrade stopped an API working. + * Code works well, but has deprecated syntax. An upgrade brought error-throwing misery. + * The development environment is lovingly hand-crafted. An upgrade broke dependencies and added conflicts. + + + +In a traditional environment, unpicking a troublesome upgrade is hard. In Silverblue, it’s easy. Silverblue keeps two copies of the OS – your current upgrade and your previous version. Point the OS at the previous version, reboot, and you’ve got your old system files back. + +You aren’t limited to two copies of your file system – you can keep more by pinning your favorite versions. Dusty Mabe, one of the engineers who has been working on the system since the [Project Atomic][11] days, describes how to pin extra copies of the OS in his article [Pinning Deployments in OSTree Based Systems][12]. + +Your home directory is not affected by rolling back. Rpm-ostree does not touch /etc/ and /var/. + +### System updates and package installs + +Silverblue’s rpm-ostree treats all the files as one object, stored in a repository. The working file system is a checked-out copy of this object. After a system update, you get two objects in that repository – one current object and one updated object. The updated object is checked out and becomes the new file system. + +You install your workhorse applications in toolboxes, which provide container isolation. And you install your desktop applications using Flatpak. + +This new OS requires a shift in approach. For instance, you don’t have to keep only one copy of your system files – you can store a few and select which one you use. That means you can swap back and forth between an old Fedora release and the rawhide (development) version in a matter of minutes. + +### Build your own Silverblue VM + +You can safely install Fedora Silverblue in a VM on your workstation. If you’ve got a hypervisor and half an hour to spare (10 minutes for ISO download, and 20 minutes for the build), you can see for yourself. + + 1. Download Fedora Silverblue ISO from + 2. (not Fedora workstation from ). + 3. Boot a VM with the Fedora Silverblue ISO. You can squeeze Fedora into compute resources of 1 CPU, 1024MiB of memory and 12GiB of storage, but bigger is better. + 4. Answer [Anaconda][13]’s questions. + 5. Wait for the [Gnome][14] desktop to appear. + 6. Answer [Initial Setup][15]’s questions. + + + +Then you’re ready to set up your developer’s tools. If you’re looking for an IDE, check these out. Use flatpak on the desktop to install them. + + * [Gnome Builder][16] (Gnome’s official IDE) + * [Eclipse][17] + * [Code::Blocks][18] + + + +Finally, use the CLI to create your first toolbox. Load it with modules using [npm][19], [gem][20], [pip][21], [git][22] or your other favorite tools. + +### Help! + +If you get stuck, ask questions at the [forum][23]. + +If you’re looking for ideas about how to use Silverblue, read articles in the [magazine][24]. + +### Is Silverblue for you? + +Silverblue is full of shiny new tech. That in itself is enough to attract the cool kids, like moths to a flame. But this OS is not for everyone. It’s a young system, so some bugs will still be lurking in there. And pioneering tech requires a change of habit – that’s extra cognitive load that the new user may not want to take on. + +The OS brings immutable benefits, like keeping your system files safe. It also brings some drawbacks, like the need to reboot after adding system packages. Silverblue also enables new ways of working. If you want to explore new directions in the OS, find out if Silverblue brings benefits to your work. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/fedora-silverblue-brings-future-tech-to-the-desktop/ + +作者:[Nick Hardiman][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/nickhardiman/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/04/silverblue-introfordev-816x345.png +[2]: https://silverblue.fedoraproject.org/ +[3]: https://fedoramagazine.org/what-is-silverblue/ +[4]: http://coreos.com/ +[5]: https://www.openshift.com/products/container-platform +[6]: https://github.com/containers/libpod +[7]: https://rpm-ostree.readthedocs.io/en/latest/ +[8]: https://docs.flatpak.org/en/latest/ +[9]: https://github.com/containers/toolbox +[10]: https://fedoramagazine.org/pieces-of-fedora-silverblue/ +[11]: https://www.projectatomic.io/ +[12]: https://www.projectatomic.io/blog/2018/05/pinning-deployments-ostree-based-systems/ +[13]: https://fedoraproject.org/wiki/Anaconda +[14]: https://www.gnome.org/ +[15]: https://fedoraproject.org/wiki/InitialSetup +[16]: https://wiki.gnome.org/Apps/Builder +[17]: https://www.eclipse.org/ide/ +[18]: http://www.codeblocks.org/ +[19]: https://www.npmjs.com/package/package +[20]: https://rubygems.org/ +[21]: https://pypi.org/ +[22]: https://git-scm.com/ +[23]: https://discussion.fedoraproject.org/c/desktop/silverblue/6 +[24]: https://fedoramagazine.org/?s=silverblue diff --git a/sources/tech/20200521 Glico (Weighted Rock Paper Scissors).md b/sources/tech/20200521 Glico (Weighted Rock Paper Scissors).md new file mode 100644 index 0000000000..77e3cfb5ed --- /dev/null +++ b/sources/tech/20200521 Glico (Weighted Rock Paper Scissors).md @@ -0,0 +1,141 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Glico (Weighted Rock Paper Scissors)) +[#]: via: (https://theartofmachinery.com/2020/05/21/glico_weighted_rock_paper_scissors.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) + +Glico (Weighted Rock Paper Scissors) +====== + +This still isn’t the blog post I said I was going to write about now, but I figured some game theory would make a good post at the moment, especially when a lot of people I know are working at home with kids who need entertaining. Here’s some stuff about a traditional Japanese kids’ game called Glico, a form of weighted Rock Paper Scissors (RPS). + +### Glico + +I’ll assume you’re familiar with regular RPS. It’s pretty obvious how to play well: the three plays, “rock”, “paper” and “scissors”, are equally strong, so the only trick is to play them unpredictably enough. + +But what happens if the three plays have different values? Weighted RPS, under the name “Glico”, has been a well-known Japanese children’s game since at least before WWII, but let me explain an English adaptation. Traditionally it’s played starting at the bottom of a flight of stairs, and the aim is to get to the top first. Players can climb up steps by winning rounds of RPS. The trick is that the number of steps depends on the winning hand in each round. A player who wins with “rock” gets to climb up four steps by spelling out R-O-C-K, and similarly “paper” is worth five steps and “scissors” worth eight. This simple twist to the game creates whole new layers of offence and defence as players struggle to win with “scissors” as much as possible, without being too predictable and vulnerable. + +(The rules for the Japanese version vary by region, but usually “rock” is worth 3 steps, while “paper” and “scissors” are worth 6. The mnemonic is that “rock”, “paper” and “scissors” are referred to as グー, パー and チョキ respectively, and the words spelled out when playing are グリコ (“Glico”, a food/confectionary brand), パイナップル (pineapple) and チョコレート (chocolate).) + +Just a few notes before getting into the maths: The game works best with two players, but in the traditional rules for three or more players, each round is handled by having multiple rematches. Each time there’s a clear winning hand (e.g., two players with “paper” beating one with “rock”) the losers are eliminated until there’s one winner. That can take a long time, so cycling systematically between pairs of players might be faster for several players. (I’ll assume two players from now on.) Also, older kids sometimes add an extra challenge by requiring an exact landing at the top of the stairs to win. For example, if you’re five steps from the top, only “paper” will win; “scissors” will overshoot by three steps, and you’ll end up three steps back down from the top. Be warned: that makes gameplay a lot harder. + +### Calculating the optimal strategy + +Simple strategies like “just play rock” are what game theorists call “pure strategies”. By design, no pure strategy in RPS is better than all others, and an adaptive opponent can quickly learn to exploit any pure strategy (e.g., by always playing “paper” against someone who always plays “rock”). Any decent player will play RPS with something like a “mixed strategy” (selecting from the pure strategies at random, maybe with different probabilities). Game theory tells us that finite, two-player, zero-sum games always have optimal mixed strategies — i.e., a mixed strategy that’s as good or better than any other, even against an adaptive opponent. You might do better by exploiting a weak opponent, but you can’t do better against a perfect one. In plain RPS, the statistically unbeatable strategy is to play each hand with equal probability (\frac{1}{3}). + +Glico is made up of multiple rounds of weighted RPS. A truly optimal player won’t just use one set of probabilities (p_{r}), (p_{p}) and (p_{s}) for playing “rock”, “paper” and “scissors” each round. The optimal probabilities will vary depending the position of both players on the stairs. For example, a player who is four steps from winning is either happy with any winning hand, or only wants “rock”, depending on the rules, and (theoretically) both players should recognise that and adapt their probabilities accordingly. However, it’s more practical to play with an optimal greedy strategy — i.e., assuming everyone is just trying to get the maximum step value each round. + +I’ll calculate an optimal greedy strategy for weighted RPS in two ways. One way is longer but uses nothing but high school algebra and logical thinking, while the other way uses the power of linear programming. + +#### The longer way + +The greedy version of Glico has no end goal; the players are just trying to win points. It helps with solving the game if we make it zero sum — any time you win (N) points, your opponent loses (N) points, and vice versa. That just scales and shifts the score per round, so it doesn’t change the optimal strategy. Why do it? We know that optimal players can’t get any advantage over each other because the game is symmetric. If the game is zero sum, that means that no strategy can have an expected value of more than 0 points. That lets us write some equations. For example, playing “rock” might win you 4 points against “scissors”, or lose you 5 against “paper”. Against an optimal opponent, we can say + +[4p_{s} - 5p_{p} \leq 0] + +Is the inequality necessary? When would a pure strategy have a negative value against a non-adaptive but optimal player? Imagine if we added a fourth pure strategy, “bomb”, that simply gave 1000 points to the opponent. Obviously no optimal player would ever play “bomb”, so (p_{b} = 0). Playing “bomb” against an optimal player would have expected value -1000. We can say that some pure strategies are just _bad_: they have suboptimal value against an optimal opponent, and an optimal player will never play them. Other pure strategies have optimal value against an optimal opponent, and they’re reasonable to include in an optimal strategy. + +Bad pure strategies aren’t always as obvious as “bomb”, but we can argue that none of the pure strategies in RPS are bad. “Rock” is the only way to beat “scissors”, and “paper” is the only way to beat “rock”, and “scissors” is the only way to beat “paper”. At least one must be in the optimal strategy, so we can expect them all to be. So let’s make that (\leq) into (=), and add the equations for playing “paper” and “scissors”, plus the fact that these are probabilities that add up to 1: + +[\begin{matrix} {4p_{s} - 5p_{p}} & {= 0} \ {5p_{r} - 8p_{s}} & {= 0} \ {8p_{p} - 4p_{r}} & {= 0} \ {p_{r} + p_{p} + p_{s}} & {= 1} \ \end{matrix}] + +That’s a system of linear equations that can be solved algorithmically using Gaussian elimination — either by hand or by using any good numerical algorithms software. I won’t go into the details, but here’s the solution: + +[\begin{matrix} p_{r} & {= 0.4706} \ p_{p} & {= 0.2353} \ p_{s} & {= 0.2941} \ \end{matrix}] + +Even though it’s worth the least, an optimal player will play “rock” almost half the time to counterattack “scissors”. The rest of the time is split between “paper” and “scissors”, with a slight bias towards “scissors”. + +#### The powerful way + +The previous solution needed special-case analysis: it exploited the symmetry of the game, and made some guesses about how good/bad the pure strategies are. What about games that are more complex, or maybe not even symmetric (say, because one player has a handicap)? There’s a more general solution using what’s called linear programming (which dates to when “programming” just meant “scheduling” or “planning”). + +By the way, linear programming (LP) has a funny place in computer science. There are some industries and academic circles where LP and generalisations like mixed integer programming are super hot. Then there are computer science textbooks that never even mention them, so there are industries where the whole topic is pretty much unheard of. It might be because it wasn’t even known for a long time if LP problems can be solved in polynomial time (they can), so LP doesn’t have the same theoretical elegance as, say, shortest path finding, even if it has a lot of practical use. + +Anyway, solving weighted RPS with LP is pretty straightforward. We just need to describe the game using a bunch of linear inequalities in multiple variables, and express strategic value as a linear function that can be optimised. That’s very similar to what was done before, but this time we won’t try to guess at the values of any strategies. We’ll just assume we’re choosing values (p_{r}), (p_{p}) and (p_{s}) to play against an opponent who scores an average (v) against us each round. The opponent is smart enough to choose a strategy that’s as least as good as any pure strategy, so we can say + +[\begin{matrix} {4p_{s} - 5p_{p}} & {\leq v} \ {5p_{r} - 8p_{s}} & {\leq v} \ {8p_{p} - 4p_{r}} & {\leq v} \ \end{matrix}] + +The opponent can only play some combination of “rock”, “paper” and “scissors”, so (v) can’t be strictly greater than all of them — at least one of the inequalities above must be tight. To model the gameplay fully, the only other constraints we need are the rules of probability: + +[\begin{matrix} {p_{r} + p_{p} + p_{s}} & {= 1} \ p_{r} & {\geq 0} \ p_{p} & {\geq 0} \ p_{s} & {\geq 0} \ \end{matrix}] + +Now we’ve modelled the problem, we just need to express what needs to be optimised. That’s actually dead simple: we just want to minimise (v), the average score the opponent can win from us. An LP solver can find a set of values for all variables that minimises (v) within the constraints, and we can read off the optimal strategy directly. + +I’ve tried a few tools, and the [Julia][1] library [JuMP][2] has my current favourite FOSS API for throwaway optimisation problems. Here’s some code: + +``` +# You might need Pkg.add("JuMP"); Pkg.add("GLPK") +using JuMP +using GLPK + +game = Model(GLPK.Optimizer) + +@variable(game, 0 <= pr <= 1) +@variable(game, 0 <= pp <= 1) +@variable(game, 0 <= ps <= 1) +@variable(game, v) + +@constraint(game, ptotal, pr + pp + ps == 1) +@constraint(game, rock, 4*ps - 5*pp <= v) +@constraint(game, paper, 5*pr - 8*ps <= v) +@constraint(game, scissors, 8*pp - 4*pr <= v) + +@objective(game, Min, v) + +println(game) +optimize!(game) + +println("Opponent's value: ", value(v)) +println("Rock: ", value(pr)) +println("Paper: ", value(pp)) +println("Scissors: ", value(ps)) +``` + +Here’s the output: + +``` +Min v +Subject to + ptotal : pr + pp + ps = 1.0 + rock : 4 ps - 5 pp - v ≤ 0.0 + paper : 5 pr - 8 ps - v ≤ 0.0 + scissors : 8 pp - 4 pr - v ≤ 0.0 + pr ≥ 0.0 + pp ≥ 0.0 + ps ≥ 0.0 + pr ≤ 1.0 + pp ≤ 1.0 + ps ≤ 1.0 + +Opponent's value: 0.0 +Rock: 0.47058823529411764 +Paper: 0.23529411764705882 +Scissors: 0.29411764705882354 +``` + +As argued in the previous solution, the best value the opponent can get against the optimal player is 0. + +### What does optimality mean? + +The optimal solution was calculated assuming an all-powerful opponent. It guarantees that even the best weighted RPS player can’t get an advantage over you, but it turns out you can’t get an advantage over a terrible player, either, if you insist on playing this “optimal” strategy. That’s because weighted RPS has no bad plays, in the sense that “bomb” is bad. _Any_ strategy played against the above “optimal” strategy will have expected value of 0, so it’s really a defensive, or “safe” strategy. To play truly optimally and win against a bad player, you’ll have to adapt your strategy. For example, if your opponent plays “scissors” too often and “paper” not enough, you should adapt by playing “rock” more often. Of course, your opponent might just be pretending to be weak, and could start taking advantage of your deviation from the safe strategy. + +Games don’t always work out like that. For example, in theory, you could derive an optimal safe strategy for more complex games like poker. Such a strategy would tend to win against normal humans because even the best normal humans make bad poker plays. On the other hand, a “shark” at the table might be able to win against the “fish” faster by exploiting their weaknesses more aggressively. If you’re thinking of using LP to directly calculate a strategy for Texas Hold’em, though, sorry, but you’ll hit a combinatorial explosion of pure strategies as you account for all the cases like “if I’m dealt AJ on the big blind and I call a four-blind raise from the button preflop and then the flop is a rainbow 3K9…”. Only heavily simplified toy poker games are solvable with the general approach. + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2020/05/21/glico_weighted_rock_paper_scissors.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://julialang.org/ +[2]: https://github.com/JuliaOpt/JuMP.jl diff --git a/sources/tech/20200522 Fast data modeling with JavaScript.md b/sources/tech/20200522 Fast data modeling with JavaScript.md new file mode 100644 index 0000000000..9c565d6e90 --- /dev/null +++ b/sources/tech/20200522 Fast data modeling with JavaScript.md @@ -0,0 +1,452 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Fast data modeling with JavaScript) +[#]: via: (https://opensource.com/article/20/5/data-modeling-javascript) +[#]: author: (Szymon https://opensource.com/users/schodevio) + +Fast data modeling with JavaScript +====== +This tutorial showcases a method to model data in just a few minutes. +![Analytics: Charts and Graphs][1] + +As a backend developer at the [Railwaymen][2], a software house in Kraków, Poland, some of my tasks rely on models that manipulate and customize data retrieved from a database. When I wanted to improve my skills in frontend frameworks, I [chose Vue][3], and I thought it would be good to have a similar way to model data in a store. I started with some libraries that I found through [NPM][4], but they offered many more features than I needed. + +So I decided to build my own solution, and I was very surprised that the base took less than 15 lines of code and is very flexible. I implemented this solution in an open source application which I developed and called [Evally][5] - a web app that helps businesses keep track of their employees' performance reviews and professional development. It reminds managers or HR representatives about employees' upcoming evaluations and gathers all of the data needed to assess their performance in the fairest way. + +### Model and list + +The only things you need to do are to create a class and use the defaultsDeep function in the [Lodash][6] JavaScript library: + + +``` +`_.defaultsDeep(object, [sources])` +``` + +Arguments: + + * `object (Object)`: The destination object + * `[sources] (...Object)`: The source objects + + + +Returns: + + * `(Object)`: Returns object + + + +This helper function: [Lodash Docs][7] + +> "Assigns recursively own and inherited enumerable string keyed properties of source objects to the destination object for all destination properties that resolve to undefined. Source objects are applied from left to right. Once a property is set, additional values of the same property are ignored." + +For example: + + +``` +_.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }) + // => { 'a': { 'b': 2, 'c': 3 } } +``` + +That's all! To try it out, create a file called **base.js** and import the defaultsDeep function from the Lodash package: + + +``` + // base.js + import defaultsDeep from "lodash/defaultsDeep"; +``` + +Next, create and export the Model class, where constructor will use the Lodash helper function to assign values to all passed attributes and initialize the attributes that were not received with default values: + + +``` + // base.js + // ... + + export class Model { +   constructor(attributes = {}) { +     defaultsDeep(this, attributes, this.defaults); +   } + } +``` + +Now, create your first real model, Employee, with attributes for firstName, lastName, position and hiredAt where "position" defines "Programmer" as the default value: + + +``` + // employee.js + import { Model } from "./base.js"; + + export class Employee extends Model { +   get defaults() { +     return { +       firstName: "", +       lastName: "", +       position: "Programmer", +       hiredAt: "" +     }; +   } + } +``` + +Next, begin creating employees: + + +``` +// app.js + import { Employee } from "./employee.js"; + + const programmer = new Employee({ +   firstName: "Will", +   lastName: "Smith" + }); + + // => Employee { + //   firstName: "Will", + //   lastName: "Smith", + //   position: "Programmer", + //   hiredAt: "", + //   constructor: Object + // } + + const techLeader = new Employee({ +   firstName: "Charles", +   lastName: "Bartowski", +   position: "Tech Leader" + }); + + // => Employee { + //   firstName: "Charles", + //   lastName: "Bartowski", + //   position: "Tech Leader", + //   hiredAt: "", + //   constructor: Object + // } +``` + +You have two employees, and the first one's position is assigned from the defaults. Here's how multiple employees can be defined: + + +``` + // base.js + + // ... + + export class List { +   constructor(items = []) { +     this.models = items.map(item => new this.model(item)); +   } + } + +[/code] [code] + + // employee.js + import { Model, List } from "./base.js"; + + // … + + export class EmployeesList extends List { +   get model() { +     return Employee; +   } + } +``` + +The List class constructor maps an array of received items into an array of desired models. The only requirement is to provide a correct model class name: + + +``` + // app.js + import { Employee, EmployeesList } from "./employee.js"; + + // … + + const employees = new EmployeesList([ +   { +     firstName: "Will", +     lastName: "Smith" +   }, +   { +     firstName: "Charles", +     lastName: "Bartowski", +     position: "Tech Leader" +   } + ]); + + // => EmployeesList {models: Array[2], constructor: Object} + //  models: Array[2] + //   0: Employee + //     firstName: "Will" + //     lastName: "Smith" + //     position: "Programmer" + //     hiredAt: "" + //     <constructor>: "Employee" + //   1: Employee + //     firstName: "Charles" + //     lastName: "Bartowski" + //     position: "Tech Leader" + //     hiredAt: "" + //     <constructor>: "Employee" + //   <constructor>: "EmployeesList" +``` + +### Ways to use this approach + +This simple solution allows you to keep your data structure in one place and avoid code repetition. The [DRY][8] principle rocks! You can also customize your models as needed, such as in the following examples. + +#### Custom getters + +Do you need one attribute to be dependent on the others? No problem; you can do this by improving your Employee model: + + +``` +// employee.js + import { Model } from "./base.js"; + + export class Employee extends Model { +   get defaults() { +     return { +       firstName: "", +       lastName: "", +       position: "Programmer", +       hiredAt: "" +     }; +   } + +   get fullName() { +     return [this.firstName, this.lastName].join(' ') +   } + + } + +[/code] [code] + +// app.js + import { Employee, EmployeesList } from "./employee.js"; + + // … + + console.log(techLeader.fullName); + // => Charles Bartowski +``` + +Now you don't have to repeat the code to do something as simple as displaying the employee's full name. + +#### Date formatting + +Model is a good place to define other formats for given attributes. The best examples are dates: + + +``` +// employee.js + import { Model } from "./base.js"; + import moment from 'moment'; + + export class Employee extends Model { +   get defaults() { +     return { +       firstName: "", +       lastName: "", +       position: "Programmer", +       hiredAt: "" +     }; +   } + +   get formattedHiredDate() { +     if (!this.hiredAt) return "---"; + +     return moment(this.hiredAt).format('MMMM DD, YYYY'); +   } + } + +[/code] [code] + +// app.js + import { Employee, EmployeesList } from "./employee.js"; + + // … + + techLeader.hiredAt = "2020-05-01"; + + console.log(techLeader.formattedHiredDate); + // => May 01, 2020 +``` + +Another case related to dates (which I discovered developing the Evally app) is the ability to operate with different date formats. Here's an example that uses datepicker: + + 1. All employees fetched from the database have the hiredAt date in the format: +YEAR-MONTH-DAY, e.g., 2020-05-01 + 2. You need to display the hiredAt date in a more friendly format: +MONTH DAY, YEAR, e.g., May 01, 2020 + 3. A datepicker uses the format: +DAY-MONTH-YEAR, e.g., 01-05-2020 + + + +Resolve this issue with: + + +``` +// employee.js + import { Model } from "./base.js"; + import moment from 'moment'; + + export class Employee extends Model { + +   // … + +   get formattedHiredDate() { +     if (!this.hiredAt) return "---"; + +     return moment(this.hiredAt).format('MMMM DD, YYYY'); +   } + +   get hiredDate() { +     return ( +       this.hiredAt +         ? moment(this.hiredAt).format('DD-MM-YYYY') +         : '' +     ); +   } + +   set hiredDate(date) { +     const mDate = moment(date, 'DD-MM-YYYY'); +  +     this.hiredAt = ( +       mDate.isValid() +         ? mDate.format('YYYY-MM-DD') +         : '' +     ); +   } + } +``` + +This adds getter and setter functions to handle datepicker's functionality. + + +``` + // Get date from server + techLeader.hiredAt = '2020-05-01'; + console.log(techLeader.formattedHiredDate); + // => May 01, 2020 + + // Datepicker gets date + console.log(techLeader.hiredDate); + // => 01-05-2020 + + // Datepicker sets new date + techLeader.hiredDate = '15-06-2020'; + + // Display new date + console.log(techLeader.formattedHiredDate); + // => June 15, 2020 +``` + +This makes it very simple to manage multiple date formats. + +#### Storage for model-related information + +Another use for a model class is storing general information related to the model, like paths for routing: + + +``` +// employee.js + import { Model } from "./base.js"; + import moment from 'moment'; + + export class Employee extends Model { + +   // … + +   static get routes() { +     return { +       employeesPath: '/api/v1/employees', +       employeePath: id => `/api/v1/employees/${id}` +     } +   } + + } + +[/code] [code] + + // Path for POST requests + console.log(Employee.routes.employeesPath) + + // Path for GET request + console.log(Employee.routes.employeePath(1)) +``` + +### Customize the list of models + +Don't forget about the List class, which you can customize as needed: + + +``` +// employee.js + import { Model, List } from "./base.js"; + + // … + + export class EmployeesList extends List { +   get model() { +     return Employee; +   } + +   findByFirstName(val) { +     return this.models.find(item => item.firstName === val); +   } + +   filterByPosition(val) { +     return this.models.filter(item => item.position === val); +   } + } + +[/code] [code] + + console.log(employees.findByFirstName('Will')) + // => Employee { + //   firstName: "Will", + //   lastName: "Smith", + //   position: "Programmer", + //   hiredAt: "", + //   constructor: Object + // } + + console.log(employees.filterByPosition('Tech Leader')) + // => [Employee] + //     0: Employee + //       firstName: "Charles" + //       lastName: "Bartowski" + //       position: "Tech Leader" + //       hiredAt: "" + //       <constructor>: "Employee" +``` + +### Summary + +This simple structure for data modeling in JavaScript should save you some development time. You can add new functions whenever you need them to keep your code cleaner and easier to maintain. All of this code is available in my [CodeSandbox][9], so try it out and let me know how it goes by leaving a comment below. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/data-modeling-javascript + +作者:[Szymon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/schodevio +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/analytics-graphs-charts.png?itok=sersoqbV (Analytics: Charts and Graphs) +[2]: https://railwaymen.org/ +[3]: https://blog.railwaymen.org/vue-vs-react-which-one-is-better-for-your-app-similarities-differences +[4]: https://www.npmjs.com/ +[5]: https://github.com/railwaymen/evally +[6]: https://lodash.com/ +[7]: https://lodash.com/docs/4.17.15 +[8]: https://en.wikipedia.org/wiki/Don%27t_repeat_yourself +[9]: https://codesandbox.io/s/02jsdatamodels-1mhtb diff --git a/sources/tech/20200524 Diamond interface composition in Go 1.14.md b/sources/tech/20200524 Diamond interface composition in Go 1.14.md new file mode 100644 index 0000000000..611bb2c39e --- /dev/null +++ b/sources/tech/20200524 Diamond interface composition in Go 1.14.md @@ -0,0 +1,124 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Diamond interface composition in Go 1.14) +[#]: via: (https://dave.cheney.net/2020/05/24/diamond-interface-composition-in-go-1-14) +[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney) + +Diamond interface composition in Go 1.14 +====== + +Per the [overlapping interfaces proposal][1], Go 1.14 now permits embedding of interfaces with overlapping method sets. This is a brief post explain what this change means: + +Let’s start with the definition of the three key interfaces from the `io` package; `io.Reader`, `io.Writer`, and `io.Closer`: + +``` +package io + +type Reader interface { + Read([]byte) (int, error) +} + +type Writer interface { + Write([]byte) (int, error) +} + +type Closer interface { + Close() error +} +``` + +Just as embedding a type inside a struct allows the embedded type’s fields and methods to be accessed as if it were declared on the embedding type[1][2], the process is true for interfaces. Thus there is no difference between explicitly declaring + +``` +type ReadCloser interface { + Read([]byte) (int, error) + Close() error +} +``` + +and using embedding to compose the interface + +``` +type ReadCloser interface { + Reader + Closer +} +``` + +You can even mix and match + +``` +type WriteCloser interface { + Write([]byte) (int, error) + Closer +} +``` + +However, prior to Go 1.14, if you continued to compose interface declarations in this manner you would likely find that something like this, + +``` +type ReadWriteCloser interface { + ReadCloser + WriterCloser +} +``` + +would fail to compile + +``` +% go build interfaces.go +command-line-arguments +./interfaces.go:27:2: duplicate method Close +``` + +Fortunately, with Go 1.14 this is no longer a limitation, thus solving problems that typically occur with diamond-shaped embedding graphs. + +However, there is a catch that I ran into attempting to demonstrate this feature to the local user group–this feature is only enabled when the Go compiler uses the 1.14 (or later) spec. + +As near as I can make out the rules for which version of the Go spec is used during compilation appear to be: + + 1. If your source code is stored inside `GOPATH` (or you have _disabled_ modules with `GO111MODULE=off`) then the version of the Go spec used to compile with matches the version of the compiler you are using. Said another way, if you have Go 1.13 installed, your Go version is 1.13. If you have Go 1.14 installed, your version is 1.14. No surprises here. + 2. If your source code is stored outside `GOPATH` (or you have forced modules on with `GO111MODULE=on`) then the `go` tool will take the Go version from the `go.mod` file. + 3. If there is no Go version listed in `go.mod` then the version of the spec will be the version of Go installed. This is identical to point 1. + 4. If you are in module mode, either by being outside `GOPATH` or with `GO111MODULE=on`, but there is no `go.mod` file in the current, or any parent, directory then the version of the Go spec used to compile your code defaults to Go 1.13. + + + +The last point caught me out. + + 1. It is said that embedding promotes the type’s fields and methods.[][3] + + + +### Related posts: + + 1. [Struct composition with Go][4] + 2. [term: low level serial with a high level interface][5] + 3. [Accidental method value][6] + 4. [How does the go build command work ?][7] + + + +-------------------------------------------------------------------------------- + +via: https://dave.cheney.net/2020/05/24/diamond-interface-composition-in-go-1-14 + +作者:[Dave Cheney][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://dave.cheney.net/author/davecheney +[b]: https://github.com/lujun9972 +[1]: https://github.com/golang/proposal/blob/master/design/6977-overlapping-interfaces.md +[2]: tmp.nUQHg5BP9T#easy-footnote-bottom-1-4179 (It is said that embedding promotes the type’s fields and methods.) +[3]: tmp.nUQHg5BP9T#easy-footnote-1-4179 +[4]: https://dave.cheney.net/2015/05/22/struct-composition-with-go (Struct composition with Go) +[5]: https://dave.cheney.net/2014/05/08/term-low-level-serial-with-a-high-level-interface (term: low level serial with a high level interface) +[6]: https://dave.cheney.net/2014/05/19/accidental-method-value (Accidental method value) +[7]: https://dave.cheney.net/2013/10/15/how-does-the-go-build-command-work (How does the go build command work ?) diff --git a/sources/tech/20200525 CopyQ Clipboard Manager for Keeping a Track of Clipboard History.md b/sources/tech/20200525 CopyQ Clipboard Manager for Keeping a Track of Clipboard History.md new file mode 100644 index 0000000000..616ee5971a --- /dev/null +++ b/sources/tech/20200525 CopyQ Clipboard Manager for Keeping a Track of Clipboard History.md @@ -0,0 +1,113 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (CopyQ Clipboard Manager for Keeping a Track of Clipboard History) +[#]: via: (https://itsfoss.com/copyq-clipboard-manager/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +CopyQ Clipboard Manager for Keeping a Track of Clipboard History +====== + +How do you copy-paste text? Let me guess. You either use the right click menu to copy-paste or use Ctrl+C to copy a text and Ctrl+V to paste the text. The text copied this way is saved to ‘clipboard’. The [clipboard][1] is a special location in the memory of your system that stores cut or copied text (and in some cases images). + +But have you ever been in a situation where you had a text copied and then you copy another text and then realize you needed the text you copied earlier? Trust me, it happens a lot. + +Instead of wondering about finding the previous text to copy again, you can use a clipboard manager. + +A clipboard manager is a handy little tool that keeps a history of the text you had copied. If you need to use the earlier copied text, you can use the clipboard manager to copy it again. + +![Clipboard][2] + +There are several clipboard managers available for Linux. In this article, I’ll cover one such tool that goes by the name CopyQ. + +### CopyQ Clipboard Manager + +[CopyQ][3] is nifty clipboard manager that has plenty of features to manage your system’s clipboard. It is an open source software available for free for major Linux distributions. + +Like any other clipboard manager, CopyQ monitors the system clipboard and saves its content. It can save both text and images from the clipboard. + +CopyQ sits in the system tray and you can easily access it from there. From the system tray, just click on the text that you want. It will automatically copy this text and you would notice that the copied text moves on to the top of the saved clipboards. + +![][4] + +In the system tray, it shows only the five recent clips. You can open the main window using the “Show/hide main window” option in the system tray. CopyQ saves up to 200 clips. You may edit the clipboard items here. + +![][5] + +You may also set a keyboard shortcut to bring the clipboard with a few key combination. This option is available in Preferences->Shortcuts. + +![][6] + +If you decide to use it, I advise enabling the autostart so that CopyQ runs automatically when you start your system. By default, it saves 200 items in the history and that’s a lot in my opinion. You may want to change that as well. + +![][7] + +CopyQ is an advanced clipboard manager with plenty of additional features. You can search for text in the saved clipboard items. You can sort, create, edit or change the order of the clipboard items. + +You can ignore clipboard copied from some windows or containing some text. You can also temporarily disable clipboard saving. CopyQ also supports [Vim][8]-like editor and shortcut for Vim fans. + +There are many more features that you may explore on your own. For me, the most notable feature is that it gives me easy access to older copied text, and I am happy with that. + +### Installing CopyQ on Linux + +CopyQ is available for Linux, Windows and macOS. You can get the executable file for Windows and macOS [from its website][3]. + +For Linux, CopyQ is available in the repositories of all major Linux distributions. Which means that you can find it in your software center or install it using your distribution’s package manager. + +Ubuntu users may find it in the software center if [universe repository is enabled][9]. + +![CopyQ in Ubuntu Software Center][10] + +Alternatively, you can use the apt command to install it: + +``` +sudo apt install copyq +``` + +Ubuntu users also have the option to [use the official PPA][11] and always get the latest stable CopyQ version. For example, at the time of writing this article, CopyQ version in Ubuntu 20.04 is 3.10 while [PPA has newer version][12] 3.11. It’s your choice really. + +``` +sudo add-apt-repository ppa:hluk/copyq +sudo apt update +sudo apt install copyq +``` + +You may also want to know [how to remove PPA][13] later. + +### Do you use a clipboard manager? + +I find it surprising that many people are not even aware of an essential utility like clipboard manager. For me, it’s one of the [essential productivity tools on Linux][14]. + +As I mentioned at the beginning of the article, there are several clipboard managers available for Linux. CopyQ is one of such tools. Do you use or know of some other similar clipboard tool? Why not let us know in the comments? + +If you started using CopyQ after reading this article, do share your experience with it. What you liked and what you didn’t like? The comment section is all yours. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/copyq-clipboard-manager/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.computerhope.com/jargon/c/clipboar.htm +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/clipboard.png?ssl=1 +[3]: https://hluk.github.io/CopyQ/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-system-tray.png?ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-main-window.png?ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-shortcuts.png?ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-auto-start.png?ssl=1 +[8]: https://itsfoss.com/vim-8-release-install/ +[9]: https://itsfoss.com/ubuntu-repositories/ +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-software-center.png?resize=800%2C474&ssl=1 +[11]: https://itsfoss.com/ppa-guide/ +[12]: https://launchpad.net/~hluk/+archive/ubuntu/copyq +[13]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ +[14]: https://itsfoss.com/productivity-tips-ubuntu/ diff --git a/sources/tech/20200525 Debian-s Decision to Drop Old Drivers has Upset Vintage Hardware Users.md b/sources/tech/20200525 Debian-s Decision to Drop Old Drivers has Upset Vintage Hardware Users.md new file mode 100644 index 0000000000..fb2b9005ea --- /dev/null +++ b/sources/tech/20200525 Debian-s Decision to Drop Old Drivers has Upset Vintage Hardware Users.md @@ -0,0 +1,85 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Debian’s Decision to Drop Old Drivers has Upset Vintage Hardware Users) +[#]: via: (https://itsfoss.com/debian-dropping-old-drivers/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Debian’s Decision to Drop Old Drivers has Upset Vintage Hardware Users +====== + +It is always a tough decision to drop support for older hardware for the latest Linux distribution releases. Just like [Ubuntu decided to drop support for 32-bit systems][1], Debian’s X Strike Force (XFS) team decided to drop a list of input and video drivers. + +### Debian is considering to drop support for really old hardware + +![][2] + +In case you didn’t know, the XFS team is responsible for maintaining packages the [X Window System][3] in [Debian][4]. And, the list of drivers that [they want to remove][5] are: + + * xserver-xorg-input-aiptek + * xserver-xorg-input-elographics + * xserver-xorg-input-mtrack + * xserver-xorg-input-mutouch + * xserver-xorg-input-void + * server-xorg-video-ast + * xserver-xorg-video-mach64 + + + * xserver-xorg-video-neomagic + * xserver-xorg-video-r128 + * xserver-xorg-video-savage + * xserver-xorg-video-siliconmotion + * xserver-xorg-video-sisusb + * xserver-xorg-video-tdfx + * xserver-xorg-video-trident + + + +So, Mach 64, [ATI Rage R128][6], Savage, Silicon Motion, SiS, Trident, and NeoMagic are some of the graphics chipsets that would be affected. The reason (as stated by them) to drop these drivers is: + +> They are either unmaintained upstream or provide no value to the distribution. + +Now, that could make sense, if the packages are no longer maintained. But, upstream some of these X.org drivers are still **maintained** even if there are no frequent updates to them. For instance, in 2018, a [new display driver update was released for the ATI RAGE 128][7], as reported by Phoronix. + +### Vintage hardware owners are going to be upset + +Obviously, the vintage hardware users aren’t quite happy with the decision because a handful of people still own (or actively use) old hardware i.e. around 20 years older. + +From the original list of drivers mentioned in the [bug report][5], **Geode display driver** was initially decided to be removed but wasn’t dropped. + +It was also reported that the “**xserver-xorg-video-r128**” driver is required for older Apple hardware (iMac). And, a user reported about the missing video driver on his iMac. + +For most of the users, this decision may not actually affect any “production” systems because I don’t think anyone is probably going to utilize 20-year old hardware for commercial purposes. + +The hobbyists and collectors who like to preserve older tech are surely going to be impacted by this decision. + +### Wrapping Up + +In my opinion, dropping the support for incredibly dated hardware is not entirely a bad move. + +But, if there is a demand for the support of vintage hardware, the fair share of users who want the drivers to be added in Debian should help maintain those packages. If not, I don’t think it won’t be a wise choice to have an unmaintained piece of code in Debian. + +What do you think about this? Feel free to share your thoughts in the comments below! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/debian-dropping-old-drivers/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/ubuntu-drops-32-bit-desktop/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/debian-bug-report-driver-drop.jpg?ssl=1 +[3]: https://en.wikipedia.org/wiki/X_Window_System +[4]: https://www.debian.org/ +[5]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=955603 +[6]: https://en.wikipedia.org/wiki/ATI_Rage_series +[7]: https://www.phoronix.com/scan.php?page=news_item&px=ATI-RAGE-128-DDX-6.11.0 diff --git a/sources/tech/20200525 EU Parliament Strongly Recommends Developing and Using Open Source Software.md b/sources/tech/20200525 EU Parliament Strongly Recommends Developing and Using Open Source Software.md new file mode 100644 index 0000000000..bfeb5635ce --- /dev/null +++ b/sources/tech/20200525 EU Parliament Strongly Recommends Developing and Using Open Source Software.md @@ -0,0 +1,84 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (EU Parliament Strongly Recommends Developing and Using Open Source Software) +[#]: via: (https://itsfoss.com/eu-parliament-recommends-open-source/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +EU Parliament Strongly Recommends Developing and Using Open Source Software +====== + +Europe is choosing open source more than ever. Not just limited to [EU Commissions’ decision to use Signal messaging app][1] but also [open science][2] and the [adoption of open source software by European universities][3]. + +Now, in a recent [press release][4] by the [European Pirate Party][5], it looks like the EU Parliament is urging EU institutions to use open-source software. All thanks to the Pirate amendments for encouraging the use of open-source software. + +The EU Parliament not just encourages the use of open-source software, but they have also advised to prioritize development of open-source software by the EU institutions. + +So, not just aiming to adopt using open-source software but to develop open-source software. And, that’s definitely good news! + +More use of open-source software, why not? To give you some more details, here’s what they mentioned in the press release: + +> **In practice, from now on, all IT solutions developed by and for the EU institutions will first need to be assessed against the possibility of using Open Source solutions. Assessments will then have to be reported back to the Budgetary Control Committee of the Parliament on an annual basis, during the discharge procedure. This is a strong call for enhancing our important citizens right to transparent and trustworthy information.** + +### Important decision to remove vendor lock-ins + +![Public Money Public Code Campaign][6] + +No matter who made this happen — this decision of preferring open-source software over proprietary will not just help the open-source community but also helps the EU institutions in a variety of ways. + +Especially, relying on open-source software removes the overhead of vendor lock-ins. In other words, an EU institution does not have to rely on vendor to manage/maintain the software. + +The press release also addressed this by mentioning: + +> It is essential for the European institutions to retain control over its own technical systems, especially in a context of disinformation and foreign interference. Open Source promotes local technical support, leads to rapid development of software and helps to avoid dependency on specific suppliers or vendor lock-in effects, which exist when only one company is in charge of software or even the entire IT infrastructure supply. + +Any responsible local organization can take up the task while the community can still help in any way it can. This could also reduce the cost of maintaining the software among other things like improving the security of a software in a collaborative manner. + +### Is this a big win for open-source community? + +![][7] + +Yes, and no. We’ve seen a lot of recommendations made by the governments (or the EU government in general) to choose open-source software to keep things more secure yet transparent. + +Pirate’s Vice-President of EU Parliament, **Marcel Kolaja**, mentions some advantages of this decision as well: + +_It’s a milestone for transparent and open digitization of the European institutions. From now on, the Open Source ecosystem has a stepping ground for offering Open Source solutions and the Pirates will gladly play the role of the guardians and will try to solve and highlight any attempt to bypass this strong recommendation. It’s a really important step to remove vendor lock-ins in the Parliament“_ + +So, this will definitely help them earn trust of their citizens by providing digital transparency while also encouraging public participation to improve the software as well. Of course, this will also help introduce the concept of open-source software to many who were unaware of it in some way. + +Also, ensuring open-source software for publicly financed software will enhance the meaning of freedom of speech/privacy/press. + +In a nutshell, these decisions do have a positive impact in one way or the other. + +But, the implementations of these decisions will decide how effective it’s going to be to put the words in action. + +### Wrapping Up + +I’m happy with the decision by EU Parliament here — even though I’m not a European. I guess, this should encourage other government bodies to take similar decisions or steps to ensure digital transparency while earning the trust of their citizens. + +To get more details on the decision, you can refer to the [official press release by the European Pirate Party][4]. + +What do you think about it? Let me know your thoughts in the comments below! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/eu-parliament-recommends-open-source/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/eu-commission-switches-to-signal/ +[2]: https://ec.europa.eu/research/openscience/index.cfm?pg=openaccess +[3]: https://opensource.com/article/20/5/open-source-higher-education +[4]: https://european-pirateparty.eu/european-parliament-strongly-recommends-any-software-developed-by-and-for-the-eu-institutions-to-be-made-publicly-available-under-free-and-open-source-software-licence/ +[5]: https://en.wikipedia.org/wiki/European_Pirate_Party +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/public-money-public-code.png?resize=800%2C420&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/eu-parliament-open-source.jpg?ssl=1 diff --git a/sources/tech/20200525 Encrypt Your Files Before Uploading it to Cloud With Cryptomator.md b/sources/tech/20200525 Encrypt Your Files Before Uploading it to Cloud With Cryptomator.md new file mode 100644 index 0000000000..eda3a2990e --- /dev/null +++ b/sources/tech/20200525 Encrypt Your Files Before Uploading it to Cloud With Cryptomator.md @@ -0,0 +1,184 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Encrypt Your Files Before Uploading it to Cloud With Cryptomator) +[#]: via: (https://itsfoss.com/cryptomator/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Encrypt Your Files Before Uploading it to Cloud With Cryptomator +====== + +_**Open source software highlight of this week is Cryptomator. It is a unique free and open-source encryption software that lets you encrypt your data before uploading it to the cloud.**_ + +There are several [cloud services available for Linux][1] and almost all of them do not offer [end to end encryption][2], at least not by default. + +Usually, the connection between your device and the server is secure. But your data stored on the server is not encrypted. Employees with direct access to the infrastructure at your cloud service providers may access this data. + +Of course, these companies have strict policies against such intrusion but a rogue employee can do a lot of damage. Remember the incident when a [departing Twitter employee deactivated the account of US President Donald Trump][3]. + +If you are one of the privacy cautious people, you would want the ease of cloud storage but with the added security layer of encrypted storage. + +Now some [services like pCloud do provide end to end encryption][4] but that comes at an additional cost. If you could afford that, well and good. If not, you can use a free and open source tool like [Cryptomator][5]. + +Cryptomator helps you secure your data by encrypting it before uploading it to any cloud storage services. In this article, I’m going to highlight the key features of Cryptomator along with instructions to use it. + +### Cryptomator: Add an encryption layer to your cloud data + +![][6] + +Cryptomator is a solution to encrypt your data locally before uploading it to the cloud. + +With this, you can create vaults locally and sync them to the cloud storage services you use. + +It’s very easy to use and you don’t need to have any specific technical knowledge to encrypt your data – that’s what Cryptomator is tailored for. + +### Features of Cryptomator + +Cryptomator is a simple encryption tool with the essential features. Here’s what it offers: + + * [AES][7] and 256-bit Encryption for files. + * Ability to create a vault and sync it with the cloud storage service + * Optional recovery key for your master password of the vault + * Cross-platform support (Linux, Windows, macOS, Android, and iOS) + * Supports the dark theme for a one-time license fee. + * Supports [WebDAV][8], [FUSE][9], and [Dokany][10] for easy integration with your operating system. + + + +Do note that the [Android][11] and [iOS][12] apps are paid apps that you have to purchase separately while the desktop program is completely free to use. Also, you need to purchase a one-time license to unlock the dark mode. Don’t blame them please. They need to make some money in order to develop this open source software. + +### Installing Cryptomator on Linux + +Cryptomater provides an AppImage file that you can download to get started on any Linux distribution. + +You can get it from its [official download page][13]. In case you don’t know, please read [how to use an AppImage file][14] to get started. + +[Download Cryptomator][5] + +### How To Use Cryptomator? + +Attention! + +Encryption is a double-edged sword. It can protect you and it can hurt you as well. +If you are encrypting your data and you forgot your encryption key, you’ll lose access to that data forever. +Cryptomator provides a recovery key option so please be careful with both password and the recovery key. Don’t forget it or lose the recovery key. + +Once you have installed Cryptomator, it’s really easy to use it following the user interface or the [official documentation][15]. + +But, to save you some time, I’ll highlight a few important things that you should know: + +#### Setup Your Vault + +![][16] + +After launching Cryptomator, you need to create the vault where you want to have your encrypted data. + +This can be an existing location or a new custom directory as per your requirements. + +Now that you proceed creating a new vault, you will also observe that you can open an existing vault as well (if you had one already). So, always have a backup of your vault, just in case. + +![][17] + +Here, I am assuming that you are a new user. So, obviously, proceed to create a new vault and give it a name: + +![][18] + +Next, you need to specify a storage location. If you already use OneDrive, Dropbox, Google Drive, or something similar, it might detect it automatically. + +![][19] + +However, if it doesn’t, like in my case (I use [pCloud][20]), you can select the cloud-synced directory or any other custom location manually. + +Once you select the location, you just need to create a password for it. It’s best to create a strong password that you can remember. + +![][21] + +Also, I’d suggest you to opt for the recovery key and store it in a separate USB drive or just print it on a paper. + +![][22] + +And, that’s it. You’re done creating your secure vault that you can sync with the cloud. + +![][23] + +Now, how do you add files to it? Let’s take a look: + +#### Adding Files To A Vault + +_**Note:** You can’t just go into the folder that you created from the file manager and files there. Follow the steps below to add files properly in your encrypted vault._ + +Once you’ve created your vault, you just need to unlock it by typing the password as shown in the image below. If you’re on your personal computer, you can choose to save the password without needing to enter it every time you access the vault. However, I advise not to do that. Manually entering the password help in remembering it. + +![][24] + +Next, after unlocking the vault, you just need to click on “**Reveal Vault**” or reveal drive to open it using **File Manager** where you can access/modify or add files to it. + +#### Backup / Recover Your Vault + +You should simply copy-paste the folder you create to another USB drive or somewhere else other than your cloud storage folder to ensure that you have a backup of your vault. + +![][25] + +It’s important to have the **masterkey.cryptomator** file of the vault in order to open it. + +#### Upgrades, Preferences & Settings + +Note + +You should enable the auto-updates feature to ensure that you will have the most stable and error-free version automatically. + +Apart from the most important functions of the Cryptomator app, you will get a couple of other features to tweak, such as: + + * Change the type of your virtual drive + * Tweak the vault to read-only mode + + + +You can explore the **Vault options** and the settings on Cryptomator to know about what else you can do. + +**Wrapping Up** + +Now that you know about Cryptomator, you can easily encrypt your important data locally before uploading them to the cloud. + +What do you think about Cryptomator? Let us know your thoughts in the comments down below! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/cryptomator/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/cloud-services-linux/ +[2]: https://en.wikipedia.org/wiki/End-to-end_encryption +[3]: https://www.theverge.com/2017/11/2/16600732/donald-trump-twitter-account-gone-realdonaldtrump +[4]: https://partner.pcloud.com/r/22317 +[5]: https://cryptomator.org/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-ft.jpg?ssl=1 +[7]: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard +[8]: https://en.wikipedia.org/wiki/WebDAV +[9]: https://en.wikipedia.org/wiki/Filesystem_in_Userspace +[10]: https://en.wikipedia.org/wiki/Dokan_Library +[11]: https://play.google.com/store/apps/details?id=org.cryptomator&hl=en_US +[12]: https://apps.apple.com/us/app/cryptomator/id953086535 +[13]: https://cryptomator.org/downloads/ +[14]: https://itsfoss.com/use-appimage-linux/ +[15]: https://docs.cryptomator.org +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-add-vault.jpg?ssl=1 +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-create-open-vault.jpg?ssl=1 +[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-add-vault-name.jpg?ssl=1 +[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-vault-location.jpg?ssl=1 +[20]: https://itsfoss.com/recommends/pcloud/ +[21]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-pass.jpg?ssl=1 +[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-recovery.jpg?ssl=1 +[23]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-vault-success.jpg?ssl=1 +[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-unlock.jpg?ssl=1 +[25]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-master.jpg?ssl=1 diff --git a/sources/tech/20200525 How to Assign Static IP Address on Ubuntu Linux.md b/sources/tech/20200525 How to Assign Static IP Address on Ubuntu Linux.md new file mode 100644 index 0000000000..87ddb6b839 --- /dev/null +++ b/sources/tech/20200525 How to Assign Static IP Address on Ubuntu Linux.md @@ -0,0 +1,179 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to Assign Static IP Address on Ubuntu Linux) +[#]: via: (https://itsfoss.com/static-ip-ubuntu/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +How to Assign Static IP Address on Ubuntu Linux +====== + +_**Brief: In this tutorial, you’ll learn how to assign static IP address on Ubuntu and other Linux distributions. Both command line and GUI methods have been discussed.**_ + +IP addresses on Linux Systems in most cases are assigned by [Dynamic Host Configuration Protocol][1] (DHCP) servers. IP addresses assigned this way are dynamic which means that the IP address might change when you [restart your Ubuntu system][2]. It’s not necessary but it may happen. + +_**Dynamic IP is not an issue for normal desktop Linux users in most cases**_. It could become an issue if you have employed some special kind of networking between your computers. + +For example, you can [share your keyboard and mouse between Ubuntu and Raspberry Pi][3]. The configuration uses IP addresses of both system. If the IP address changes dynamically, then your setup won’t work. + +Another use case is with servers or remotely administered desktops. It is easier to set static addresses on those systems for connection stability and consistency between the users and applications. + +In this tutorial, I’ll show you how to set up static IP address on Ubuntu based Linux distributions. Let me show you the command line way first and then I’ll show the graphical way of doing it on desktop. + +### Method 1: Assign static IP in Ubuntu using command line + +![][4] + +**Note for desktop users**: Use static IP only when you need it. Automatic IP saves you a lot of headache in handling network configuration. + +#### Step 1: Get the name of network interface and the default gateway + +The first thing you need to know is the name of the network interface for which you have to set up the static IP. + +You can either use ip command or the network manager CLI like this: + +``` +nmcli d +``` + +In my case, it shows my Ethernet (wired) network is called enp0s25: + +``` +Ubuntu> nmcli d +DEVICE TYPE STATE CONNECTION +enp0s25 ethernet unmanaged -- +lo loopback unmanaged -- +``` + +Next, you should note the [default gateway IP using the Linux command][5] **ip route**: + +``` +ip route +default via 192.168.31.1 dev enp0s25 proto dhcp metric 600 +169.254.0.0/16 dev enp0s25 scope link metric 1000 +192.168.31.0/24 dev enp0s25 proto kernel scope link src 192.168.31.36 metric 600 +``` + +As you can guess, the default gateway is 192.168.31.1 for me. + +#### Step 2: Locate Netplan configuration + +Ubuntu 18.04 LTS and later versions use [Netplan][6] for managing the network configuration. Netplan configuration are driven by .yaml files located in **/etc/netplan** directory. + +By default, you should see a .yaml file named something like 01-network-manager-all.yaml, 50-cloud-init.yaml, 01-netcfg.yaml. + +Whatever maybe the name, its content should look like this: + +``` +# Let NetworkManager manage all devices on this system +network: + version: 2 + renderer: NetworkManager +``` + +You need to edit this file for using static IP. + +#### Step 3: Edit Netplan configuration for assigning static IP + +_**Just for the sake of it, make a backup of your yaml file.**_ + +Please make sure to use the correct yaml file name in the commands from here onward. + +Use nano editor with sudo to open the yaml file like this: + +``` +sudo nano /etc/netplan/01-netcfg.yaml +``` + +Please note that _**yaml files use spaces for indentation**_. If you use tab or incorrect indention, your changes won’t be saved. + +You should edit the file and make it look like this by providing the actual details of your IP address, gateway, interface name etc. + +``` +network: + version: 2 + renderer: networkd + ethernets: + enp0s25: + dhcp4: no + addresses: + - 192.168.31.16/24 + gateway4: 192.168.31.1 + nameservers: + addresses: [8.8.8.8, 1.1.1.1] +``` + +In the above file, I have set the static IP to 192.168.31.16. + +Save the file and apply the changes with this command: + +``` +sudo netplan apply +``` + +You can verify it by [displaying your ip address in the terminal][7] with ‘ip a’ command. + +Revert the changes and go back to dynamic IP + +If you don’t want to use the static IP address anymore, you can revert easily. + +If you have backed up the original yaml file, you can delete the new one and use the backup one. + +Otherwise, you can change the yaml file again and make it look like this: + +``` +network: + version: 2 + renderer: networkd + ethernets: + enp0s25: + dhcp4: yes +``` + +### Method 2: Switch to static IP address in Ubuntu graphically + +If you are on desktop, using the graphical method is easier and faster. + +Go to the settings and look for network settings. Click the gear symbol adjacent to your network connection. + +![][8] + +Next, you should go to the IPv4 tab. Under the IPv4 Method section, click on Manual. + +In the Addresses section, enter the IP static IP address you want, netmask is usually 24 and you already know your gateway IP with the ip route command. + +You may also change the DNS server if you want. You can keep Routes section to Automatic. + +![][9] + +Once everything is done, click on Apply button. See, how easy it is to set a static IP address graphically. + +If you haven’t read my previous article on [how to change MAC Address][10], you may want to read in conjunction with this one. + +More networking related articles will be rolling out, let me know your thoughts at the comments below and stay connected to our social media. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/static-ip-ubuntu/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol +[2]: https://itsfoss.com/schedule-shutdown-ubuntu/ +[3]: https://itsfoss.com/keyboard-mouse-sharing-between-computers/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/static-ip-ubuntu.jpg?ssl=1 +[5]: https://linuxhandbook.com/find-gateway-linux/ +[6]: https://netplan.io/ +[7]: https://itsfoss.com/check-ip-address-ubuntu/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/assign-static-ip-1.jpg?ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/assign-static-ip-2.jpg?ssl=1 +[10]: https://itsfoss.com/change-mac-address-linux/ diff --git a/sources/tech/20200525 How to Compress PDF in Linux -GUI - Terminal.md b/sources/tech/20200525 How to Compress PDF in Linux -GUI - Terminal.md new file mode 100644 index 0000000000..eba596bcb9 --- /dev/null +++ b/sources/tech/20200525 How to Compress PDF in Linux -GUI - Terminal.md @@ -0,0 +1,99 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to Compress PDF in Linux [GUI & Terminal]) +[#]: via: (https://itsfoss.com/compress-pdf-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +How to Compress PDF in Linux [GUI & Terminal] +====== + +_**Brief: Learn how to reduce the size of a PDF file in Linux. Both command line and GUI methods have been discussed.**_ + +I was filling some application form and it asked to upload the necessary documents in PDF format. Not a big issue. I gathered all the [scanned images and combined them in one PDF using gscan2pdf tool][1]. + +The problem came when I tried to upload this PDF file. The upload failed because it exceeded the maximum file size limit. This only meant that I needed to somehow reduce the size of the PDF file. + +Now, you may use an online PDF compressing website but I don’t trust them. A file with important documents uploading to an unknown server is not a good idea. You could never be sure that they don’t keep a copy your uploaded PDF document. + +This is the reason why I prefer compressing PDF files on my system rather than uploading it to some random server. + +In this quick tutorial, I’ll show you how to reduce the size of PDF files in Linux. I’ll show both command line and GUI methods. + +### Method 1: Reduce PDF file size in Linux command line + +![][2] + +You can use [Ghostscript][3] command line tool for compressing a PDF file. Most Linux distributions include the open source version of Ghostscript already. However, you can still try to install it just to make sure. + +On Debian/Ubuntu based distributions, use the following command to install Ghostscript: + +``` +sudo apt install ghostscript +``` + +Now that you have made sure that Ghostscript is installed, you can use the following command to reduce the size of your PDF file: + +``` +gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dQUIET -dBATCH -sOutputFile=compressed_PDF_file.pdf input_PDF_file.pdf +``` + +In the above command, you should add the correct path of the input and out PDF file. + +The command looks scary and confusing. I advise copying and pasting most of it. What you need to know is the dPDFSETTINGS parameter. This is what determines the compression level and thus the quality of your compressed PDF file. + +dPDFSETTINGS | Description +---|--- +/prepress (default) | Higher quality output (300 dpi) but bigger size +/ebook | Medium quality output (150 dpi) with moderate output file size +/screen | Lower quality output (72 dpi) but smallest possible output file size + +Do keep in mind that some PDF files may not be compressed a lot or at all. Applying compression on some PDF files may even produce a file bigger than the original. There is not much you can do in such cases. + +### Method 2: Compress PDF files in Linux using GUI tool + +I understand that not everyone is comfortable with command line tool. The [PDF editors in Linux][4] doesn’t help much with compression. This is why we at It’s FOSS worked on creating a GUI version of the Ghostscript command that you saw above. + +[Panos][5] from It’s FOSS team [worked on creating a Python-Qt based GUI wrapper for the Ghostscript][6]. The tool gives you a simple UI where you can select your input file, select a compression level and click on the compress button to compress the PDF file. + +![][7] + +The compressed PDF file is saved in the same folder as the original PDF file. Your original PDF file remains untouched. The compressed file is renamed by appending -compressed to the original file name. + +If you are not satisfied with the compression, you can choose another compression level and compress the file again. + +You may find the source code of the PDF Compressor on our GitHub repository. To let you easily use the tool, we have packaged it in AppImage format. Please [refer to this guide to know how to use AppImage][8]. + +[Download PDF Compressor (AppImage)][9] + +Please keep in mind that the tool is in early stages of developments. You may experience some issues. If you do, please let us know in the comments or even better, [file a bug here][10]. + +We’ll try to add more packages (Snap, Deb, PPAs etc) in the future releases. If you have experience with the development and packaging, please feel free to give us a hand. + +Would you like It’s FOSS team to work on creating more such small desktop tools in future? Your feedback and suggestions are welcome. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/compress-pdf-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/convert-multiple-images-pdf-ubuntu-1304/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/compress-pdf-linux.jpg?ssl=1 +[3]: https://www.ghostscript.com/ +[4]: https://itsfoss.com/pdf-editors-linux/ +[5]: https://github.com/libreazer +[6]: https://github.com/itsfoss/compress-pdf +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/compress-PDF.jpg?fit=800%2C448&ssl=1 +[8]: https://itsfoss.com/use-appimage-linux/ +[9]: https://github.com/itsfoss/compress-pdf/releases/download/0.1/compress-pdf-v0.1-x86_64.AppImage +[10]: https://github.com/itsfoss/compress-pdf/issues diff --git a/sources/tech/20200525 How to Install Linux Mint in VirtualBox -Screenshot Tutorial.md b/sources/tech/20200525 How to Install Linux Mint in VirtualBox -Screenshot Tutorial.md new file mode 100644 index 0000000000..1fc324e817 --- /dev/null +++ b/sources/tech/20200525 How to Install Linux Mint in VirtualBox -Screenshot Tutorial.md @@ -0,0 +1,194 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to Install Linux Mint in VirtualBox [Screenshot Tutorial]) +[#]: via: (https://itsfoss.com/install-linux-mint-in-virtualbox/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +How to Install Linux Mint in VirtualBox [Screenshot Tutorial] +====== + +_**Brief: One of safest and easiest ways to try Linux Mint is inside a virtual machine. Your real system doesn’t change at all. Learn how to install Linux Mint in VirtualBox in this tutorial.**_ + +[Linux Mint][1] is considered one of the [best distributions for new Linux users][2]. Its flagship Cinnamon DE is one of the most popular desktop environment giving your system a look and feel of classic Window-styled desktop. + +If you want to try Linux Mint and see if it fits your need, you could try installing it in a virtual machine. This way, you run Linux Mint inside your current system without changing your system’s partition or boot order. One of the safest way out there as you get to run Linux like a regular desktop application inside your current operating system. + +![][3] + +Oracle’s open source virtualization tool [VirtualBox][4] is available for free on all major desktop operating systems i.e. Windows, Linux and macOS. + +In this beginner’s tutorial, I’ll show you the steps for installing Linux Mint in VirtualBox. I am including the screenshots for each step so that you can easily follow the tutorial. + +### Installing Linux Mint in VirtualBox + +You can follow the steps on any operating system be it Windows, Linux or macOS. You just need to install VirtualBox on your operating system and rest of the steps remain the same. + +**Step 1:** [Download VirtualBox from its website][4] and install it by double-clicking on the downloaded file. + +![][5] + +Next, install the latest version of Linux Mint’s ISO file from its website. + +[Download Linux Mint ISO][6] + +**Step 2:** Once your virtual Box is up & running we are ready to get started. Click the New button, click Next on the virtual machine wizard. + +![Create a new Virtual Machine][7] + +Initially you need to specify the following: + + * Name: Any preferred name for your VM like Linux Mint + * Type: Linux + * Version: Ubuntu (64 bit) as Linux Mint is an Ubuntu-based distribution + + + +Before configuring any hardware resource value, please make sure that are aware of the [system requirements][8]. + +2 GB RAM would be okay but won’t give you a good experience. 3 GB is a comfortable amount if your system has 8 GB of RAM. I choose to set my Virtual Machine to 4096 MB (4 GB) because my system has plenty of RAM. + +RAM consumption + +One of the common confusion is regarding the RAM consumption. Let’s say your Windows system has 8 GB of RAM and you assign 3 GB of RAM to Linux Mint in VirtualBox. + +If you are running Linux Mint inside VirtualBox, your real system (called host system) will have 5 GB of RAM available for consumption. + +If you are not running Linux Mint inside VirtualBox, at that moment, the entire 8 GB will be available to the host system. + +**Step 3:** Next, choose a Virtual Hard disk now option and click create. + +Choose the virtual storage allocation method (Recommended Dynamically allocated). Set your storage location for virtual hard disk by browsing drive and then specify the size of virtual hard disk (it could be anything from 12-20 GB). + +![Dynamic allocation can save you space if you don’t need the maximum allowance][9] + +**Step (4 (optional advanced settings):** Once Virtual machine has been created, click on the settings button in menu: + +![][10] + +Now, go to the Display section. Specify the Video memory (128 MB) and check “Enable 3D Acceleration”. + +![Don’t forget to enable the 3D Acceleration][11] + +Then click on System Tab → Processor and choose how many threads would you like to allocate. + +My system is a 4 core/4 thread system and I choose to assign half of the CPU capability i.e. 2 threads. + +![Select CPU cores as per the distribution requirements][12] + +Once you have configured everything click ok. + +**Step 5:** In the System settings, go to Storage (from the left sidebar). Click on the [Optical Drive] Empty as shown in the image below. + +You’ll be asked to browse to the Linux Mint ISO file you had downloaded earlier. + +![][13] + +Once you select your ISO, click on the start button and that’s it! Now the ISO will start running as if you are booting from a live USB. + +Next, you need to press enter whilst your option is start Linux Mint as per the picture below. + +![][14] + +**Step 6:** Let’s start the installation procedure. + +Choose the language you want for your Linux Mint virtual machine. + +![Choose your native language][15] + +I’m based in the UK, so I have a UK keyboard layout. You can choose the one you want. + +![Choose your keyboard layout according to your hardware configuration][16] + +You may check the box to download and install any third-party software during the installation. + +![You may install media codecs while installing Linux Mint][17] + +You can proceed to erase the disk and install Linux Mint. + +Erase disk? Really? + +This step may seem scary because you may think that it will harm your real system. + +Let me assure you that it won’t do any damage to your actual disk. Remember you created 10-20 GB of virtual disk in step 3? Now you are inside that disk. + +When it asks for erasing the disk, it is erasing the virtual disk created for it. It doesn’t impact your real system disk and its data. + +![It is safe to erase your disk only at a Virtual Machine level][18] + +Next, select your time zone and click continue. You may [change time zone in Linux][19] later as well. + +![][20] + +You will be prompted to create your user account, your host name (computer’s name) and to choose a password. Once done, click continue to finalize the installation. + +![][21] + +Please wait a few minutes for the process to complete. + +![Wait a few minutes for the process to finish][22] + +The installation has now finished. Click on “Restart now”. + +![Well done! You have successfully installed Linux Mint][23] + +When you reach this step, Linux Mint will be installed and ready to use! + +![][24] + +You don’t have an installation medium so just power off the virtual machine. + +![][25] + +Now to use your virtual machine, click on the start button. + +![][26] + +You can explore a fully functional system, and at this time if you shut down Linux Mint like it was physically installed, it will automatically power off the virtual machine. + +![][27] + +Enjoy Linux Mint in VirtualBox. I hope you were able to install Linux Mint in VirtualBox. If you face any issues, please let me know in the comment section. I’ll try to help you out. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-linux-mint-in-virtualbox/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://www.linuxmint.com/ +[2]: https://itsfoss.com/best-linux-beginners/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/install-linux-mint-in-virtualbox.png?ssl=1 +[4]: https://www.virtualbox.org/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/download-virtulabox.jpg?ssl=1 +[6]: https://www.linuxmint.com/download.php +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/1.-Create-new.jpg?ssl=1 +[8]: https://blog.linuxmint.com/?p=3832 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/2.-Create-virtual-hard-disk.jpg?resize=800%2C472&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/3.-settings.jpg?resize=800%2C470&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/4.-display.jpg?resize=800%2C472&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/5.-cpu.jpg?resize=800%2C468&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/6.-choose-iso.jpg?resize=800%2C472&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/7.-boot.jpg?resize=800%2C459&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/8.-choose-language.png?resize=800%2C679&ssl=1 +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/9.-English-UK.png?resize=800%2C679&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/10.-install-third-party-software.png?resize=800%2C679&ssl=1 +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/11.-installation-type.png?resize=800%2C679&ssl=1 +[19]: https://itsfoss.com/change-timezone-ubuntu/ +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/12.-timezone.png?resize=800%2C679&ssl=1 +[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/13.-user-account.png?resize=800%2C679&ssl=1 +[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/14.-installation-screen.png?resize=800%2C679&ssl=1 +[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/15.-installation-finish.png?resize=800%2C679&ssl=1 +[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/16.-remove-the-media.png?resize=800%2C679&ssl=1 +[25]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/17.-power-off.png?resize=800%2C678&ssl=1 +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/18.-init-the-fresh-installed-mint.png?resize=800%2C476&ssl=1 +[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/19.-Linux-mint-19.3-final.png?resize=800%2C469&ssl=1 diff --git a/sources/tech/20200525 LanguageTool Review- Free and Open Source Grammar Checker.md b/sources/tech/20200525 LanguageTool Review- Free and Open Source Grammar Checker.md new file mode 100644 index 0000000000..afd1a08e49 --- /dev/null +++ b/sources/tech/20200525 LanguageTool Review- Free and Open Source Grammar Checker.md @@ -0,0 +1,155 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (LanguageTool Review: Free and Open Source Grammar Checker) +[#]: via: (https://itsfoss.com/languagetool-review/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +LanguageTool Review: Free and Open Source Grammar Checker +====== + +This week’s open source software highlight is [LanguageTool][1]. It is a proofreading software that checks the grammar, style and spelling in more than 20 languages. + +I have been using it for past several days and I feel confident enough to review it and share my experience with it. I have used the popular proofreading tool [Grammarly][2] in the past and I’ll make some comparison between these two tools. + +### LanguageTool: Open source proofreading software + +![][3] + +[LanguageTool][1] grammar checker is available in [multiple formats][4]: + + * You can copy-paste your text on its website. + * You can install browser extension that will check for errors as you type anything, anywhere in the web browser. + * You can install a Java-based desktop application for offline usage. + * You can install add-on for LibreOffice and MS Office. + * Add-ons are also [available for a number of other software][5] like Sublime Text, Thunderbird, Vim, Visual Studio Code etc. + * [Android app][6] is also available. + * API is also available if you want to use LanguageTool in your software or service. API offering comes under premium services. + + + +You can find source code of LanguageTool and its related assets on [their GitHub repository][7]. + +[LanguageTool also has a premium version][8] that you can purchase. The premium version offers additional error checks. + +I am using LanguageTool premium version as a browser extension. Almost all the writing I do is online and thus the browser extension is perfect for me. + +The most convenient way to try LanguageTool is by using its browser extension. Install the browser add-on and next time you type anything in the browser, LanguageTool will start checking your text for grammatical and spelling errors. It will also check for styling errors. + +### Experience with LanguageTool: How good is it? + +LanguageTool leaves a good first impression. It starts checking for errors as you start typing. + +Different types of errors have different color codes. Spelling mistakes are highlighted in red color, grammatical mistakes are in yellow colors and styling errors have a blueish shade. + +Clicking on the error suggestion replaces your text with the suggested one. You may also ignore the suggestion. You’ll also see number of issues identified by LanguageTool in the current text check. + +![Spelling mistake identified by LanguageTool][9] + +#### Personal dictionary + +You can also create your personal directory and add words in it. This is helpful because no proofreading tool can give a green light to technical terms like systemd, iptables and brand names like [WireGuard][10]. To avoid these words labeled as spelling mistakes, add them to your personal dictionary. + +You may edit your personal dictionary from your LanguageTool account. + +![LanguageTool Personal Dictionary][11] + +#### Details on the error suggestion + +If it finds grammatical errors, it also gives a quick explanation of the error. You can get more details by clicking the tool tip which takes you to a reputable external source. + +![You can get additional details on the errors][12] + +#### Synonym suggestion (in beta) + +If you double-click on a word, it will also suggest synonyms. + +![][13] + +#### Are there any privacy issues? + +If you use the online services of LanguageTool, your text is sent to their servers over an **encrypted** connection. All their servers are hosted at Hetzner Online GmbH in Germany. + +LanguageTool states that it doesn’t store any text that you check using its services. You can read their privacy policy [here][14]. + +The free to use languagetool.org website shows ads (there are no third-party ads in the browser add-on). To test their claim of “sending text over an encrypted server”, I typed sample text containing words like vacuum cleaner, laptop etc. + +Thankfully, the displayed ad on their website was nothing related to the text I typed. I haven’t noticed any vacuum cleaner ads on the websites I visit or on Facebook. That’s a good thing. + +#### It doesn’t work flawlessly all the time + +No software is perfect and LanguageTool is not an exception. While it is helpful in finding obvious spelling and grammatical mistakes, it struggles in some simple scenario. + +For example, if a sentence contains several blank spaces together, LanguageTool failed to find an issue with that. + +![Too many whitespaces and yet it went undetected][15] + +This is weird because if I look at their ‘error rules’, I can see a [whitespace repetition rule][16]. I think this rule is applicable only for the Java-based LanguageTool apps, not the browser add-on I am using. + +I also found some other cases where LanguageTool should have identified errors but it didn’t. For example, it didn’t alert for the missing ‘to’ in the text below: + +![LanguageTool fails to find the missing “to”][17] + +When I checked it against the [Grammarly free version][2], it was able to point it out. + +![Grammarly was quick to identify it][18] + +I also found an infinite loop of suggestion. It first suggests using syntaxes as plural of syntax. + +![Suggestion for using ‘syntaxes’][19] + +And then it doesn’t accept ‘syntaxes’ as a valid word. + +![And then it doesn’t accept ‘syntaxes’][20] + +I have seen such “infinite error loop” with Grammarly as well in the past, so I won’t be too hard on LanguageTool for such issues. + +### Conclusion + +Despite some hiccups, I am satisfied with LanguageTool proofreading tool. Both free and premium version are good enough for finding obvious spelling mistakes and grammatical errors. + +The premium version offers over 2500 additional error checks and it costs around $15-$70 per year depending on your geographical region. This is a lot cheaper than [Grammarly][2] which costs $140 per year. + +I opted for the premium version because it will help this open-source project. Premium users also get email support. + +You are not forced to go premium, of course. You can use the free version and if you have some questions or need support, there is a [community forum][21] that you can join for free. + +LanguageTool can certainly be considered one of the [essential open-source tools for writers][22]. I am going to continue using LanguageTool. If you find grammatical or spelling mistakes in It’s FOSS articles in the future, blame LanguageTool, not me. Just kidding :) + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/languagetool-review/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://languagetool.org/ +[2]: https://itsfoss.com/recommends/grammarly/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool.png?fit=800%2C593&ssl=1 +[4]: https://languagetool.org/compare +[5]: http://wiki.languagetool.org/software-that-supports-languagetool-as-a-plug-in-or-add-on +[6]: https://play.google.com/store/apps/details?id=org.softcatala.corrector +[7]: https://github.com/languagetool-org/ +[8]: https://languagetoolplus.com/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/langaugetool-error-detection.png?ssl=1 +[10]: https://itsfoss.com/wireguard/ +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-personal-dictionary.png?ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-error-explanation.png?ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-synonym-suggestion.png?ssl=1 +[14]: https://languagetoolplus.com/legal/privacy +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-whitespaces.png?ssl=1 +[16]: https://community.languagetool.org/rule/show/WHITESPACE_RULE?lang=en +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-suggestion-3.jpg?fit=800%2C219&ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-suggestion-grammarly.jpg?fit=800%2C272&ssl=1 +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-suggestion.png?ssl=1 +[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-suggestion-1.png?ssl=1 +[21]: https://forum.languagetool.org/ +[22]: https://itsfoss.com/open-source-tools-writers/ diff --git a/sources/tech/20200525 Using ‘apt search- and ‘apt show- Commands to Search and Find Details of Packages in Ubuntu.md b/sources/tech/20200525 Using ‘apt search- and ‘apt show- Commands to Search and Find Details of Packages in Ubuntu.md new file mode 100644 index 0000000000..d1d80bcb5d --- /dev/null +++ b/sources/tech/20200525 Using ‘apt search- and ‘apt show- Commands to Search and Find Details of Packages in Ubuntu.md @@ -0,0 +1,172 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Using ‘apt search’ and ‘apt show’ Commands to Search and Find Details of Packages in Ubuntu) +[#]: via: (https://itsfoss.com/apt-search-command/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Using ‘apt search’ and ‘apt show’ Commands to Search and Find Details of Packages in Ubuntu +====== + +_**This is a detailed beginners guide to apt search command. Using apt search and apt show commands, you can get details of the available versions, dependencies, repositories and other important information about packages in Ubuntu.**_ + +Have you ever wondered if a certain package is available to install via [apt package manager][1]? + +Have you wondered if the package offered by [Ubuntu repositories][2] are the latest one or not? + +The apt package manager in [Ubuntu][3] and many other distribution provides two handy [apt command options][4] for this purpose. + +The apt search command looks for the provided string in the name and description of the packages. + +``` +apt search package_name +``` + +The apt show command provides detailed information on a package: + +``` +apt show package_name +``` + +The commands don’t require you to [be root in Ubuntu][5]. Here’s an example of these commands: + +![][6] + +### Why would you want to use apt search or apt show command? + +Let’s say you want to [install Gambas programming language in Ubuntu][7]. You are happy with your knowledge of the apt command so you decided to use the command line for installing application. + +You open a terminal and use the apt command to install gambas but it results in [unable to locate package error][8]. + +``` +sudo apt install gambas +Reading package lists... Done +Building dependency tree +Reading state information... Done +E: Unable to locate package gambas +``` + +Why did Ubuntu not find the gambas package? Because there is no such package called gambas. Instead, it is available as gambas3. This is a situation where you could take the advantage of the apt search command. + +Let’s move to apt show command. This command provides detailed information about a package, its repository, dependencies and a lot more. + +Knowing what version of a package is available from the official repository could help you in deciding whether you should install it from some other sources. + +Quick recall + +The apt package manager works on a local database/cache of available packages from various repositories. This database contains the information about the available package version, dependencies etc. It doesn’t contain the entire package itself. The packages are downloaded from the remote repositories. + +When you run the sudo apt update command, this cache is created/updated in the /var/lib/apt/lists/ directory. The apt search and apt show commands utilize this cache. + +The term package is used for an application, program, software. + +### Search for available packages using apt search command + +![][9] + +Let me continue the gambas example. Say, you search for + +``` +apt search gambas +``` + +It will give you a huge list of packages that have “gambas” in its name or description. This output list is in alphabetical order. + +Now, you’ll of course have to make some intelligent prediction about the package you want. In this example, the first result says “Complete visual development environment for Gambas”. This gives you a good hint that this is the main package you are looking for. + +![][10] + +Why so many packages associated with gambas? Because a number of these gambas packages are probably dependencies that will installed automatically if you install the gambas3 package. If you use the _‘apt show gambas3_‘ command, it will show all the dependencies that will be installed with gambas3 package. + +Some of these listed packages could be libraries that a developer may need in some special cases while developing her/his software. + +#### Use apt search for package name only + +By default, apt search command looks for the searched term in both the name of the package and its description. + +You may narrow down the search by instructing the apt command to search for package names only. + +``` +apt search --names-only search_term +``` + +If you are following this as a tutorial, give it a try. Check the output with search term ‘transitional’ with and without –names-only option and you’ll see how the output changes. + +``` +apt search transitional +apt search --names-only transitional +``` + +**Bonus Tip**: You can use ‘apt list –installed’ command to [look for installed packages in Ubuntu][11]. + +### Get detailed information on a package using apt show command + +The output of the apt search commands a brief introduction of the packages. If you want more details, use the apt show command. + +``` +apt show exact_package_name +``` + +The apt show command works on the exact package name and it gives you a lot more information on the package. You get: + + * Version information + * Repository information + * Origin and maintainer of the package information + * Where to file a bug + * Download and installation size + * Dependencies + * Detailed description of the package + * And a lot more + + + +Here’s an example: + +![][12] + +You need to give the exact package name otherwise the apt show won’t work. The good thing is that tab completion works apt show command. + +As you can see in the previous image, you have plenty of information that you may found helpful. + +The apt show command also works on installed packages. In that case, you can see which source the package was installed from. Was it a PPA or some third-party repository or universe or the main repository itself? + +Personally, I use apt show a lot. This helps me know if the package version provided by Ubuntu is the latest or not. Pretty handy tool! + +### Conclusion + +If you read my detailed [guide on the difference between apt and apt-get commands][13], you would know that this ‘apt search’ command works similar to ‘apt-cache search’. There is no such command as “apt-get search”. + +The purpose of creating apt command is to give you one tool with only enough option to manage the packages in your Debian/Ubuntu system. The apt-get, apt-cache and other apt tools still exist, and they can be used in scripting for more complex scenarios. + +I hope you found this introduction to **apt search** and **apt show** commands useful. I welcome your questions and suggestions on this topic. + +If you liked it, please share it on various Linux forums and communities you frequent. That helps us a lot. Thank you. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/apt-search-command/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://wiki.debian.org/Apt +[2]: https://itsfoss.com/ubuntu-repositories/ +[3]: https://ubuntu.com/ +[4]: https://itsfoss.com/apt-command-guide/ +[5]: https://itsfoss.com/root-user-ubuntu/ +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/apt-search-apt-show-example-800x493.png?resize=800%2C493&ssl=1 +[7]: https://itsfoss.com/install-gambas-ubuntu/ +[8]: https://itsfoss.com/unable-to-locate-package-error-ubuntu/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/apt-search-command.png?ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/apt-search-command-example.png?fit=800%2C297&ssl=1 +[11]: https://itsfoss.com/list-installed-packages-ubuntu/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/apt-show-command-example-800x474.png?resize=800%2C474&ssl=1 +[13]: https://itsfoss.com/apt-vs-apt-get-difference/ diff --git a/sources/tech/20200525 What to do When You See -Repository does not have a release file- Error in Ubuntu.md b/sources/tech/20200525 What to do When You See -Repository does not have a release file- Error in Ubuntu.md new file mode 100644 index 0000000000..6cfd9f34de --- /dev/null +++ b/sources/tech/20200525 What to do When You See -Repository does not have a release file- Error in Ubuntu.md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What to do When You See “Repository does not have a release file” Error in Ubuntu) +[#]: via: (https://itsfoss.com/repository-does-not-have-release-file-error-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +What to do When You See “Repository does not have a release file” Error in Ubuntu +====== + +One of the [several ways of installing software in Ubuntu][1] is by using PPA or adding third-party repositories. A few magical lines give you easy access to a software or its newer version that is not available by default in [Ubuntu][2]. + +All thing looks well and good until you get habitual of adding additional third-party repositories and one day, you see an error like this while [updating Ubuntu][3]: + +**E: The repository ‘ focal Release’ does not have a Release file. +N: Updating from such a repository can’t be done securely, and is therefore disabled by default. +N: See apt-secure(8) manpage for repository creation and user configuration details.** + +In this tutorial for Ubuntu beginners, I’ll explain what does this error mean, why do you see it and what can you do to handle this error? + +### Understanding “Repository does not have a release file” error + +![][4] + +Let’s go step by step here. The error message is: + +**E: The repository ‘ focal release’ does not have a release file** + +The important part of this error message is “focal release”. + +You probably already know that [each Ubuntu release has a codename][5]. For Ubuntu 20.04, the codename is Focal Fossa. The “focal” in the error message indicates Focal Fossa which is Ubuntu 20.04. + +The error is basically telling you that though you have added a third-party repository to your system’s sources list, this new repository is not available for your current Ubuntu version. + +_**Why so? Because probably you are using a new version of Ubuntu and the developer has not made the software available for this new version.**_ + +At this point, I highly recommend reading my detailed guides on [PPA][6] and [Ubuntu repositories][7]. These two articles will give you a better, in-depth knowledge of the topic. Trust me, you won’t be disappointed. + +### How to know if the PPA/third party is available for your Ubuntu version [Optional] + +First you should [check your Ubuntu version and its codename][8] using ‘lsb_release -a’ command: + +``` +[email protected]:~$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 20.04 LTS +Release: 20.04 +Codename: focal +``` + +As you can see, the codename it shows is focal. Now the next thing you can do is to go to the website of the software in question. + +This could be the tricky part but you can figure it out with some patience and effort. + +In the example here, the error complained about ****. It is a PPA repository and you may easily find its webpage. How, you may ask. + +Use Google or a [Google alternative search engine][9] like Duck Duck Go and search for “ppa numix”. This should give you the first result from [launchpad.net][10] which is the website used for hosting PPA related code. + +On the webpage of the PPA, you can go to the “Overview of published packages” and filter it by the codename of your Ubuntu version: + +![][11] + +For non-PPA third-party repository, you’ll have to check of the official website of the software and see if the repository is available for your Ubuntu version or not. + +### What to do if the repository is not available for your Ubuntu version + +In case when the repository in question is not available for your Ubuntu version, here’s what you can do: + + * Delete the troublesome repository from your list of repository so that you don’t see the error every time you run the update. + * Get the software from another source (if it is possible). + + + +To delete the troublesome repository, start Software & Updates tool: + +![][12] + +Go to the Other Software tab and look for the repository in question. Highlight it and then click on Remove button to delete it from your system. + +![Remove Ppa][13] + +This will [delete the PPA][14] or the repository in question. + +Next step is to get the software from some other source and that’s totally subjective. In some cases, you can still download the DEB file from the PPA website and use the software (I have explained the steps in the [PPA guide][6]). Alternatively, you can check the project’s website if there is a Snap/Flatpak or Python version of the software available. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/repository-does-not-have-release-file-error-ubuntu/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/install-remove-software-manjaro/ +[2]: https://ubuntu.com/ +[3]: https://itsfoss.com/update-ubuntu/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/Repository-does-not-have-a-release-file.png?ssl=1 +[5]: https://itsfoss.com/linux-code-names/ +[6]: https://itsfoss.com/ppa-guide/ +[7]: https://itsfoss.com/ubuntu-repositories/ +[8]: https://itsfoss.com/how-to-know-ubuntu-unity-version/ +[9]: https://itsfoss.com/privacy-search-engines/ +[10]: https://launchpad.net/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/check-repo-version.png?ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-updates-settings-ubuntu-20-04.jpg?ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/remove-ppa.jpg?ssl=1 +[14]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ diff --git a/sources/tech/20200526 Create interactive content in WordPress with the H5P plugin.md b/sources/tech/20200526 Create interactive content in WordPress with the H5P plugin.md new file mode 100644 index 0000000000..871439e73a --- /dev/null +++ b/sources/tech/20200526 Create interactive content in WordPress with the H5P plugin.md @@ -0,0 +1,130 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Create interactive content in WordPress with the H5P plugin) +[#]: via: (https://opensource.com/article/20/5/h5p-wordpress) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +Create interactive content in WordPress with the H5P plugin +====== +Turn your WordPress site into an interactive learning management system +with this open source plugin. +![Family learning and reading together at night in a room][1] + +WordPress is best known as a website content management system, but it also a great [learning management system][2] (LMS) for delivering online courses. If that is what you are looking for out of WordPress, then [H5P][3] should be the top plugin on your list. + +H5P is a way to create and share interactive HTML5 content, including presentations, games, quizzes, forms, and more, in a browser. You can download a wide variety of content types from H5P's [Examples and Downloads][4] page, or you can create unique content to embed in your WordPress site. + +H5P provides plugins and integrations for WordPress, Moodle, Drupal, Canvas, Brightspace, Blackboard, and more. In this article, I will show how to use H5P in WordPress to create a reading comprehension quiz for students. + +### Install the H5P plugin + +The first step is to install the plugin. Log into your WordPress admin panel, go to **Plugins**, select **Add New**, and search for **H5P** in the Plugins field. When you find it, select **Install Now**. + +![Adding the H5P plugin][5] + +(Don Watkins, [CC BY-SA 4.0][6]) + +H5P should now appear in the list of installed plugins. Be sure to **Activate** the plugin by going to the H5P menu at the bottom of your WordPress admin panel and clicking the button. You will see the following display—be sure to consent so you can connect to the H5P Hub. + +![H5P consent option][7] + +(Don Watkins, [CC BY-SA 4.0][6]) + +Now you can begin adding H5P content to your WordPress installation. + +### Create a quiz + +One of my favorite poems is Robert Frost's "The Road Not Taken." Suppose you are teaching a class that is studying this poem, and one of your objectives is for your students to remember the poem's author. First, create a new WordPress post on your site that contains the poem's text and its author. + +![Creating a WordPress post][8] + +(Don Watkins, [CC BY-SA 4.0][6]) + +Now you want to test your students' comprehension with an HTML5 interactive content embedded below the poem. + +In the WordPress admin panel, look near the bottom for the **H5P Content** menu and select it. In the menu that appears, click **Add New**. + +![H5P Content menu][9] + +(Don Watkins, [CC BY-SA 4.0][6]) + +You will see an array of content options that are available. Since you want to create a multiple-choice quiz, look for the **Multiple Choice** option and click **Get** to its right. + +![H5P content types][10] + +(Don Watkins, [CC BY-SA 4.0][6]) + +A form will open for you to start creating the quiz. Fill in the required fields (marked with a red asterisk)—give your quiz a title (e.g., "Road Not Taken Quiz"), enter a question (e.g., "Who wrote, 'The Road Not Taken'?") and correct and incorrect answers, and select the correct answer in the dialog box. When you finish creating the quiz, save the content. + +![H5P quiz][11] + +(Don Watkins, [CC BY-SA 4.0][6]) + +### Embed the quiz in a post + +Now you're ready to insert the quiz exactly where you want it to appear in your post. Open the post where you want to put the quiz (e.g., "The Road Not Taken" post) in your WordPress editor, and you should see an **Add H5P** button near the top of the interface. Place your cursor wherever you want the quiz to appear in the post, and click **Add H5P**. Your H5P content will appear in a dialog box like this: + +![H5P list of interactive content][12] + +(Don Watkins, [CC BY-SA 4.0][6]) + +Select the content you want, and H5P will insert an embed code (e.g., `[h5p id="1"]`) in the post, like this: + +![H5P embed code in a post][13] + +(Don Watkins, [CC BY-SA 4.0][6]) + +Save your post, then open it in your browser. The quiz is exactly where you wanted it to appear in the post: + +![H5P quiz shown in the post][14] + +(Don Watkins, [CC BY-SA 4.0][6]) + +When a student answers this question correctly, they get pleasant visual feedback: + +![Correct answer selection][15] + +(Don Watkins, [CC BY-SA 4.0][6]) + +### The possibilities are endless + +H5P offers a wide range of options to add interactivity to WordPress posts. In this example, you could have created a more complex set of multiple-choice questions. H5P also has lots of other content types, including interactive video, arithmetic quizzes, an audio recorder, image hotspots, fill-in-the-blank quizzes, and [many more][4]. + +H5P also provides [excellent documentation][16] and [great tutorials][17] to help anyone who wants to use the plugin on their WordPress site. H5P software is open source under the [MIT License][18] with the code available on [GitHub][19]. H5P also welcomes contributions to the community; check out the [developer guide][20] for more information. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/h5p-wordpress + +作者:[Don Watkins][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/family_learning_kids_night_reading.png?itok=6K7sJVb1 (Family learning and reading together at night in a room) +[2]: https://en.wikipedia.org/wiki/Learning_management_system +[3]: https://h5p.org/ +[4]: https://h5p.org/content-types-and-applications +[5]: https://opensource.com/sites/default/files/uploads/addplugins-h5p.png (Adding the H5P plugin) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/h5p-consent.png (H5P consent option) +[8]: https://opensource.com/sites/default/files/uploads/wordpress-post.png (WordPress post) +[9]: https://opensource.com/sites/default/files/uploads/h5p-content-menu.png (H5P Content menu) +[10]: https://opensource.com/sites/default/files/uploads/h5p-content-types.png (H5P content types) +[11]: https://opensource.com/sites/default/files/uploads/h5p-multiple-choice-quiz.png (H5P quiz) +[12]: https://opensource.com/sites/default/files/uploads/h5p-insert-interactive-content.png (H5P list of interactive content) +[13]: https://opensource.com/sites/default/files/uploads/h5p-embedded-content.png (H5P embed code in a post) +[14]: https://opensource.com/sites/default/files/uploads/h5p-quiz.png (H5P quiz shown in the post) +[15]: https://opensource.com/sites/default/files/uploads/h5p-correct-answer.png (Correct answer selection) +[16]: https://h5p.org/documentation/setup/wordpress +[17]: https://h5p.org/documentation/for-authors/tutorials +[18]: https://h5p.org/MIT-licensed +[19]: https://github.com/h5p +[20]: https://h5p.org/developers diff --git a/sources/tech/20200528 4 Linux distributions for gaming.md b/sources/tech/20200528 4 Linux distributions for gaming.md new file mode 100644 index 0000000000..2453d9c6a8 --- /dev/null +++ b/sources/tech/20200528 4 Linux distributions for gaming.md @@ -0,0 +1,97 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (4 Linux distributions for gaming) +[#]: via: (https://opensource.com/article/20/5/linux-gaming) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +4 Linux distributions for gaming +====== +Linux offers plenty of great options for a work/play combo or a full +gaming console setup. Take our poll to tell us your favorite. +![Gaming with penguin pawns][1] + +Gaming on Linux got a thorough kickstart in 2013 when Valve announced that their own SteamOS would be written on top of Linux. Since then, Linux users could realistically expect to play high-grade games that, in the past, required the purchase of a Windows computer or gaming console. The experience got off to a modest start, with just a few brave companies like CD Projekt Red, Deep Silver, Valve itself, and others putting the Linux penguin icon in their compatibility list, but eventually, even Gearbox and Square Enix were releasing their biggest titles on Linux. Today, [Valve's Proton project][2] helps ensure that even titles with no formal Linux release still work on SteamOS and other Linux distributions. + +Valve didn't singlehandedly drag gaming into Linux, though. Well before Valve's initiative, there have been excellent independent games, blockbusters from id Software, and open source [gaming emulators][3] for Linux. Whether you want to play the latest releases or you want to relive classics from gaming history, Linux provides the only open source platform for your game rig. Here's an overview of what you might consider running on it. + +### SteamOS + +![Steam OS][4] + +If you're looking for the full gaming PC experience—in which there's no difference between your desktop computer and a game console—then SteamOS is the obvious choice. On the one hand, there's nothing particularly special about SteamOS; it's essentially just [Debian Linux][5] with Steam set as the default startup application. When you boot your computer, Steam starts automatically, and you can interact with it using only your [Steam controller][6] or any [Xbox-style gamepad][7]. You can create the same configuration by installing Steam on any distribution and setting its "Big Picture mode" as a startup item. + +However, SteamOS is ultimately specific to its purpose as a game console. While you can treat SteamOS as a normal desktop, the design choices of the distribution make it clear that it's intended as the frontend to a dedicated gaming machine. This isn't the distribution you're likely to use for your daily office or schoolwork. It's the "firmware" (except it's actually software) of a gaming console, first and foremost. When you're looking for a seamless, reliable, self-maintaining game console, build the machine of your dreams and install SteamOS. + +### Lakka + +![Lakka OS][8] + +Similar in spirit to SteamOS, Lakka recreates the Playstation 3 interface, but for retro gaming. I installed Lakka on a Raspberry Pi Rev 1 using [Etcher][9] and was pleasantly surprised to find it ready for gaming upon bootup. Lakka loads to an interface that's eerily familiar to PS3 gamers, and, like a Playstation, you can control everything using just a [game controller][10]. + +Lakka focuses on retro gaming, meaning that, instead of Steam, it provides game emulators for old systems and engines. Provided you have ROM images, you can use the emulators to play games from Nintendo, Sega Genesis, Dreamcast, N64, or homebrew titles like [POWDER][11], [Warcraft Tower Defense][12], and others. + +Lakka doesn't ship with any games, but it makes it easy for you to add games over SSH or Samba shares. Even if you've never used SSH or set up Samba (you've probably used it without knowing it), Lakka makes it easy to find your retro gaming system over your own network, so you can add games to it using whatever OS you have handy. + +### Pop_OS! + +![PopOS][13] + +Not everyone is trying to build a game console—modern, retro, or otherwise. Sometimes, all you really want is a good computer with the ability to run games at top performance. [System76][14] maintains a desktop they call Pop_OS!, designed around the standard GNOME desktop with some custom additions. Pop_OS! doesn't do much by way of innovation, but it makes an impact in the way its designers maintain convenient defaults. For gamers, this includes easy access to Steam, Proton, WINE, game emulators, PlayOnLinux, automatic game controller recognition and configuration, and more. It's not far from its Ubuntu roots, but it has been refined just enough to make a noticeable difference. + +When you're not playing games, Pop_OS! is also a wonderful productivity-focused desktop. It uses all of GNOME's built-in conveniences (such as the quick Activities menu overlay) to maximize efficiency, and adds useful modifications to bring the desktop closer to the universal expectation that's grown from decades of traditions founded in KDE Plasma, Finder, and Explorer. Pop_OS! is an intuitive and understated environment that helps you focus on whatever you're working on, until you break out the gaming gear, and then it makes sure you spend your time on entertainment instead of configuration. + +### Drauger OS + +![Drauger OS][15] + +Situated somewhere between a dedicated gaming console and a plain old desktop is Drauger OS, with a simple interface designed to stay out of your way while also making it quick and easy to access the game applications you need. Drauger is still a young project, but it represents an interesting philosophy of computing and gaming—conserve every last resource for the task at hand. To that end, Drauger OS does away with the concept of a traditional desktop and instead provides a simplified control panel that lets you launch your game client (such as Steam, PlayOnLinux, Lutris, and so on), and configure services (such as your network) or launch an application. It's a little disorienting at first, especially because the control panel is designed to more or less disappear when in the background, but after an afternoon of interaction, you realize that the complexity of a full desktop is mostly unnecessary. The point of any computer is rarely its desktop. What you really care about is getting into an application as quickly and easily as possible, and then for that application to perform well. + +The other side of this equation is performance. While having a drastically simplified desktop helps, Drauger OS attempts to maximize game performance by using a low-latency kernel. A kernel is the part of your operating system that communicates with external devices, such as game controllers and mice and keyboards, and even hard drives, memory, and video cards. An all-purpose kernel, such as the one that ships with most Linux distributions, gives more or less equal attention to all processes. A low-latency kernel can favor specific processes, including video and graphics, to ensure that calculations performed for important tasks are returned promptly, while mundane system tasks are assigned less importance. Drauger's Linux kernel is tuned for performance, so your games get top priority over all other processes. + +### The Linux of your choice + +![Pantheon OS][16] + +Looking past the self-declared focal points of individual "gaming distributions," one Linux is ultimately essentially the same as the next Linux. Amazingly, I play games even on my RHEL laptop, a distribution famous for its enterprise IT support, thanks to the [Flatpak Steam installer][17]. If you want to game on Linux in this decade, your question isn't how to do it but which system to use. + +The easiest answer to which Linux to use is, ultimately, to choose whatever Linux works best on your hardware. When you find a Linux distribution that boots and recognizes your computer hardware, your game controllers, and lets you play your games. Once you find that, install the games of your choice and get busy playing. + +There are more great Linux distributions for gaming out there, including the [Fedora Games Spin][18], [RetroPie][19], [Clear Linux][20], [Manjaro][21], and so many more. What's your favorite? Tell us in the comments. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/linux-gaming + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/gaming_grid_penguin.png?itok=7Fv83mHR (Gaming with penguin pawns) +[2]: https://github.com/ValveSoftware/Proton +[3]: https://opensource.com/article/18/10/lutris-open-gaming-platform +[4]: https://opensource.com/sites/default/files/uploads/screenshot_from_2020-05-15_15-53-15_0.png (Steam OS) +[5]: http://debian.org +[6]: https://store.steampowered.com/app/353370/Steam_Controller/ +[7]: https://www.logitechg.com/en-nz/products/gamepads/f710-wireless-gamepad.940-000119.html +[8]: https://opensource.com/sites/default/files/uploads/os-lakka_0.png (Lakka OS) +[9]: https://www.balena.io/etcher/ +[10]: https://www.logitechg.com/en-nz/products/gamepads/f310-gamepad.940-000112.html +[11]: http://www.zincland.com/powder/index.php?pagename=about +[12]: https://ndswtd.wordpress.com/ +[13]: https://opensource.com/sites/default/files/uploads/os-pop_os_0.jpg (PopOS) +[14]: https://system76.com/ +[15]: https://opensource.com/sites/default/files/uploads/os-drauger_0.jpg (Drauger OS) +[16]: https://opensource.com/sites/default/files/uploads/os-pantheon_0.jpg (Pantheon OS) +[17]: https://flathub.org/apps/details/com.valvesoftware.Steam +[18]: https://labs.fedoraproject.org/en/games/ +[19]: https://retropie.org.uk/ +[20]: https://clearlinux.org/software/bundle/games +[21]: http://manjaro.org diff --git a/sources/tech/20200528 9 open source JavaScript frameworks for front-end web development.md b/sources/tech/20200528 9 open source JavaScript frameworks for front-end web development.md new file mode 100644 index 0000000000..7a029d71fd --- /dev/null +++ b/sources/tech/20200528 9 open source JavaScript frameworks for front-end web development.md @@ -0,0 +1,294 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (9 open source JavaScript frameworks for front-end web development) +[#]: via: (https://opensource.com/article/20/5/open-source-javascript-frameworks) +[#]: author: (Bryant Son https://opensource.com/users/brson) + +9 open source JavaScript frameworks for front-end web development +====== +A breakdown of many JavaScript options for frameworks—their strengths +and key features. +![Computer screen with files or windows open][1] + +About a decade ago, the JavaScript developer community began to witness fierce battles emerging among JavaScript frameworks. In this article, I will introduce some of the most well-known of these frameworks. And it's important to note that these are all open source JavaScript projects, meaning that you can freely utilize them under an [open source license][2] and even contribute to the source code and communities. + +If you prefer to follow along as I explore these frameworks, you can watch my video. + +Before getting started, though, it will be useful to learn some of the terminology JavaScript developers commonly use when discussing frameworks. + +Term | What It Is +---|--- +[Document Object Model (DOM)][3] | A tree-structure representation of a website where each node is an object representing part of the webpage. The World Wide Web Consortium (W3C), the international standards organization for the World Wide Web, maintains the definition of the DOM. +[Virtual DOM][4] | A "virtual" or "ideal" representation of a user interface (UI) is kept in memory and synced with the "real" DOM by a library such as [ReactDOM][5]. To explore further, please read ReactJS's virtual DOM and internals documentation. +[Data Binding][6] | A programming concept to provide a consistent interface for accessing data on websites. Web elements are associated with a property or attribute of an element maintained by the DOM. For example, when you need to fill out a password in a webpage form, the data binding mechanism can check with the password validation logic to ensure that the password is in a valid format. + +Now that we are clear about common terms, let's explore what open source JavaScript frameworks are out there. + +Framework | About | License | Release Date +---|---|---|--- +[ReactJS][7] | Created by Facebook, currently the most popular JavaScript framework | MIT License | May 24, 2013 +[Angular][8] | Popular JavaScript framework created by Google | MIT License | Jan 5, 2010 +[VueJS][9] | Rapidly growing JavaScript framework | MIT License | Jul 28, 2013 +[MeteorJS][10] | Powerful framework that is more than a JavaScript framework | MIT License | Jan 18, 2012 +[KnockoutJS][11] | Open source Model-View-ViewModel (MVVM) framework | MIT License | Jul 5, 2010 +[EmberJS][12] | Another open source Model-View-ViewModel framework | MIT License | Dec 8, 2011 +[BackboneJS][13] | JavaScript framework with RESTful JSON and Model-View-Presenter pattern | MIT License | Sep 30, 2010 +[Svelte][14] | Open source JavaScript framework not using virtual DOM | MIT License | Nov 20, 2016 +[AureliaJS][15] | A collection of Modern JavaScript modules | MIT License | Feb 14, 2018 + +For context, here is the publicly available data on popularity based on NPM package downloads per framework, thanks to [npm trends][16]. + +![Framework downloads graph][17] + +### ReactJS + +![React page][18] + +[ReactJS][19] was invented by Facebook, and it is the clear leader among JavaScript frameworks today, though it was invented well after Angular. React introduces a concept called a virtual DOM, an abstract copy where developers can utilize only the ReactJS features that they want, without having to rewrite the entire project to work within the framework. In addition, the active open source community with the React project has definitely been the workhorse behind the growth. Here are some of React's key strengths: + + * Reasonable learning curve—React developers can easily create the React components without rewriting the entire code in JavaScript. See the benefits of ReactJS and how it makes it the programming easier on ReactJS's [front page][20]. + * Highly optimized for performance—React's virtual DOM implementation and other features boost app rendering performance. See ReactJS's [description][21] of how its performance can be benchmarked and measured in terms of how the app performs. + * Excellent supporting tools—[Redux][22], [Thunk][23], and [Reselect][24] are some of the best tools for building well-structured, debuggable code. + * One way data binding—The model used in Reach flows from owner to child only making it simpler to trace cause and effect in code. Read more about it on ReactJS's [page on data binding][25]. + + + +Who is using ReactJS? Since Facebook invented it, the company itself heavily uses React for its frontpage, and [Instagram][26] is said to be completely based on the ReactJS library. You might be surprised to know that other well-known companies like [New York Times][27], [Netflix][28], and [Khan Academy][29] also implement ReactJS in their technology stacks. + +What may be even more surprising is the availability of jobs for ReactJS developers, as you can see below from research done by Stackoverflow. Hey, you can work on an open source project and get paid to do it. That is pretty cool! + +![React jobs page][30] + +Stackoverflow shows the huge demand for ReactJS developers—[Source: Developer Hiring Trends in 2017—Stackoverflow Blog][31] + +  + +[ReactJS's GitHub][7] currently shows over 13K commits and 1,377 contributors to the open source project. And it is an open source project under MIT License. + +![React GitHub page][32] + +### Angular + +![Angular homepage][33] + +React may now be the leading JavaScript framework in terms of the number of developers, but [Angular][34] is close behind. In fact, while React is the more popular choice among open source developers and startup companies, larger corporations tend to prefer Angular (a few are listed below). The main reason is that, while Angular might be more complicated, its uniformity and consistency works well for larger projects. For example, I have worked on both Angular and React throughout my career, and I observed that the larger companies generally consider Angular's strict structure a strength. Here are some other key strengths of Angular: + + * Well-designed Command Line Interface: Angular has an excellent Command Line Interface (CLI) tool to easily bootstrap and to develop with Angular. ReactJS also offers the Command Line Interface as well as other tools, but Angular has extensive support and excellent documentation, as you can see on [this page][35]. + * One way data binding—Similarly to React, the one-way data binding model makes the framework less susceptible to unwanted side effects. + * Great support for TypeScript—Angular has excellent alignment with [TypeScript][36], which is effectively JavaScript more type enforcement. It also transcompiling to JavaScript, making it a great option to enforce types for less buggy code. + + + +Well-known websites like YouTube, [Netflix][37], [IBM][38], and [Walmart][39] all have implemented Angular into their applications. I personally started front-end JavaScript development with Angular by educating myself on the subject. I have worked on quite a few personal and professional projects involving Angular, but that was Angular 1.x, which was called by AngularJS at the time. When Google decided to upgrade the version to 2.0, they completely revamped the framework, and then it became Angular. The new Angular was a complete transformation of the previous AngularJS, which drove off some existing developers while bringing new developers. + +[Angular's][8] [GitHub][8] page shows 17,781 commits and 1,133 contributors at the time of this writing. It is also an open source project with an MIT License, so you can feel free to use it for your project or to contribute. + +  + +![Angular GitHub page][40] + +### VueJS + +![Vue JS page][41] + +[VueJS][42] is a very interesting framework. It is a newcomer to the JavaScript framework scene, but its popularity has increased significantly over the course of a few years. VueJS was created by [Evan Yu][43], a former Google engineer who had worked on the Angular project. The framework got so popular that many front-end engineers now prefer VueJS over other JavaScript frameworks. The chart below depicts how fast the framework gained traction over time. + +![Vue JS popularity graph][44] + +Here are some of the key strengths of VueJS: + + * Easier learning curve—Even compared to Angular or React, many front-end developers feel that VueJS has the lowest learning curve. + * Small size—VueJS is relatively lightweight compared to Angular or React. In its [official documentation][45], its size is stated to be only about 30 KB, while the project generated by Angular, for example, is over 65 KB. + * Concise documentation—Vue has thorough but concise and clear documentation. See [its official documentation][46] for yourself. + + + +[VueJS's GitHub][9] shows 3,099 commits and 239 contributors. + +![Vue JS GitHub page][47] + +### MeteorJS + +![Meteor page][48] + +[MeteorJS][49] is a free and open source [isomorphic framework][50], which means, just like NodeJS, it runs both client and server-side JavaScript. Meteor can be used in conjunction with any other popular front-end framework like Angular, React, Vue, Svelte, etc. + +Meteor is used by several corporations such as Qualcomm, Mazda, and Ikea, and many applications like Dispatch and Rocket.Chat. [See the case studies on its official website.][51] + +![Meteor case study][52] + +Some of the key features of Meteor include: + + * Data on the wire—The server sends the data, not HTML, and the client renders it. Data on the wire refers mostly to the way that Meteor forms a WebSocket connection to the server on page load, and then transfers the data needed over that connection. + * Develop everything in JavaScript—Client-side, application server, webpage, and mobile interface can be all designed with JavaScript. + * Supports most major frameworks—Angular, React, and Vue can be all combined and used in conjunction with Meteor. Thus, you can still use your favorite framework, like React or Angular, but still leverage some of the great features that Meteor offers. + + + +As of now, [Meteor's][10] [GitHub][10] shows 22,804 commits and 428 contributors. That is quite a lot for open source activities! + +![Meteor GitHub page][53] + +### EmberJS + +![EmberJS page][54] + +[EmberJS][55] is an open source JavaScript framework based on the [Model-view-viewModel(MVVM)][56] pattern. If you've never heard about EmberJS, you'll definitely be surprised how many companies are using it. Apple Music, Square, Discourse, Groupon, LinkedIn, Twitch, Nordstorm, and Chipotle all leverage EmberJS as one of their technology stacks. Check [EmberJS's official page][57] to discover all applications and customers that use EmberJS. + +Although Ember has similar benefits to the other frameworks we've discussed, here are some of its unique differentiators: + + * Convention over configuration—Ember standardizes naming conventions and automatically generates the result code. This approach has a little more of a learning curve but ensures that programmers follow best-recommended practices. + * Fully-fledged templating mechanism—Ember relies on straight text manipulation, building the HTML document dynamically while knowing nothing about DOM. + + + +As one might expect from a framework used by many applications, [Ember's GitHub][58] page shows 19,808 commits and 785 contributors. That is huge! + +![EmberJS GitHub page][59] + +### KnockoutJS + +![KnockoutJS page][60] + +[KnockoutJS][61] is a standalone open source JavaScript framework adopting a [Model-View-ViewModel (MVVM)][56] pattern with templates. Although fewer people may have heard about this framework compared to Angular, React, or Vue, the project is still quite active among the development community and leverages features such as: + + * Declarative binding—Knockout's declarative binding system provides a concise and powerful way to link data to the UI. It's generally easy to bind to simple data properties or to use a single binding. Read more about it [here at KnockoutJS's official documentation page][62]. + * Automatic UI refresh + * Dependency tracking templating + + + +[Knockout's GitHub][11] page shows about 1,766 commits and 81 contributors. Those numbers are not as significant compared to the other frameworks, but the project is still actively maintained. + +![Knockout GitHub page][63] + +### BackboneJS + +![BackboneJS page][64] + +[BackboneJS][65] is a lightweight JavaScript framework with a RESTful JSON interface and is based on Model-View-Presenter (MVP) design paradigm. + +The framework is said to be used by [Airbnb][66], Hulu, SoundCloud, and Trello. You can find all of these case studies on [Backbone's page][67]. + +The [BackboneJS GitHub][13] page shows 3,386 commits and 289 contributors. + +![BackboneJS GitHub page][68] + +### Svelte + +![Svelte page][69] + +[Svelte][70] is an open source JavaScript framework that generates the code to manipulate DOM instead of including framework references. This process of converting an app into JavaScript at build time rather than run time might offer a slight boost in performance in some scenarios. + +[Svelte's][14] [GitHub][14] page shows 5,729 commits and 296 contributors as of this writing. + +![Svelte GitHub page][71] + +### AureliaJS + +![Aurelia page][72] + +Last on the list is [Aurelia][73]. Aurelia is a front-end JavaScript framework that is a collection of modern JavaScript modules. Aurelia has the following interesting features: + + * Fast rendering—Aurelia claims that its framework can render faster than any other framework today. + * Uni-directional data flow—Aurelia uses an observable-based binding system that pushes the data from the model to the view. + * Build with vanilla JavaScript—You can build all of the website's components with plain JavaScript. + + + +[Aurelia's][15] [GitHub][15] page shows 788 commits and 96 contributors as of this writing. + +![Aurelia GitHub page][74] + +So that is what I found when looking at what is new in the JavaScript framework world. Did I miss any interesting frameworks? Feel free to share your ideas in the comment section! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/open-source-javascript-frameworks + +作者:[Bryant Son][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/article/17/9/open-source-licensing +[3]: https://www.w3schools.com/js/js_htmldom.asp +[4]: https://reactjs.org/docs/faq-internals.html +[5]: https://reactjs.org/docs/react-dom.html +[6]: https://en.wikipedia.org/wiki/Data_binding +[7]: https://github.com/facebook/react +[8]: https://github.com/angular/angular +[9]: https://github.com/vuejs/vue +[10]: https://github.com/meteor/meteor +[11]: https://github.com/knockout/knockout +[12]: https://github.com/emberjs/ember.js +[13]: https://github.com/jashkenas/backbone +[14]: https://github.com/sveltejs/svelte +[15]: https://github.com/aurelia/framework +[16]: https://www.npmtrends.com/angular-vs-react-vs-vue-vs-meteor-vs-backbone +[17]: https://opensource.com/sites/default/files/uploads/open-source-javascript-framework-downloads-opensourcedotcom_0.png (Framework downloads graph) +[18]: https://opensource.com/sites/default/files/uploads/3_react.jpg (React page) +[19]: https://reactjs.org +[20]: https://reactjs.org/ +[21]: https://reactjs.org/docs/perf.html +[22]: https://redux.js.org/ +[23]: https://github.com/reduxjs/redux-thunk +[24]: https://github.com/reduxjs/reselect +[25]: https://reactjs.org/docs/two-way-binding-helpers.html +[26]: https://instagram-engineering.com/react-native-at-instagram-dd828a9a90c7 +[27]: https://open.nytimes.com/introducing-react-tracking-declarative-tracking-for-react-apps-2c76706bb79a +[28]: https://medium.com/dev-channel/a-netflix-web-performance-case-study-c0bcde26a9d9 +[29]: https://khan.github.io/react-components/ +[30]: https://opensource.com/sites/default/files/uploads/4_reactjobs_0.jpg (React jobs page) +[31]: https://stackoverflow.blog/2017/03/09/developer-hiring-trends-2017 +[32]: https://opensource.com/sites/default/files/uploads/5_reactgithub.jpg (React GitHub page) +[33]: https://opensource.com/sites/default/files/uploads/6_angular.jpg (Angular homepage) +[34]: https://angular.io +[35]: https://cli.angular.io/ +[36]: https://www.typescriptlang.org/ +[37]: https://netflixtechblog.com/netflix-likes-react-509675426db +[38]: https://developer.ibm.com/technologies/javascript/tutorials/wa-react-intro/ +[39]: https://medium.com/walmartlabs/tagged/react +[40]: https://opensource.com/sites/default/files/uploads/7_angulargithub.jpg (Angular GitHub page) +[41]: https://opensource.com/sites/default/files/uploads/8_vuejs.jpg (Vue JS page) +[42]: https://vuejs.org +[43]: https://www.freecodecamp.org/news/between-the-wires-an-interview-with-vue-js-creator-evan-you-e383cbf57cc4/ +[44]: https://opensource.com/sites/default/files/uploads/9_vuejspopularity.jpg (Vue JS popularity graph) +[45]: https://vuejs.org/v2/guide/comparison.html#Size +[46]: https://vuejs.org/v2/guide/ +[47]: https://opensource.com/sites/default/files/uploads/10_vuejsgithub.jpg (Vue JS GitHub page) +[48]: https://opensource.com/sites/default/files/uploads/11_meteor_0.jpg (Meteor Page) +[49]: https://www.meteor.com +[50]: https://en.wikipedia.org/wiki/Isomorphic_JavaScript +[51]: https://www.meteor.com/showcase +[52]: https://opensource.com/sites/default/files/uploads/casestudy1_meteor.jpg (Meteor case study) +[53]: https://opensource.com/sites/default/files/uploads/12_meteorgithub.jpg (Meteor GitHub page) +[54]: https://opensource.com/sites/default/files/uploads/13_emberjs.jpg (EmberJS page) +[55]: https://emberjs.com +[56]: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel +[57]: https://emberjs.com/ember-users +[58]: https://github.com/emberjs +[59]: https://opensource.com/sites/default/files/uploads/14_embergithub.jpg (EmberJS GitHub page) +[60]: https://opensource.com/sites/default/files/uploads/15_knockoutjs.jpg (KnockoutJS page) +[61]: https://knockoutjs.com +[62]: https://knockoutjs.com/documentation/binding-syntax.html +[63]: https://opensource.com/sites/default/files/uploads/16_knockoutgithub.jpg (Knockout GitHub page) +[64]: https://opensource.com/sites/default/files/uploads/17_backbonejs.jpg (BackboneJS page) +[65]: https://backbonejs.org +[66]: https://medium.com/airbnb-engineering/our-first-node-js-app-backbone-on-the-client-and-server-c659abb0e2b4 +[67]: https://sites.google.com/site/backbonejsja/examples +[68]: https://opensource.com/sites/default/files/uploads/18_backbonejsgithub.jpg (BackboneJS GitHub page) +[69]: https://opensource.com/sites/default/files/uploads/19_svelte.jpg (Svelte page) +[70]: https://svelte.dev +[71]: https://opensource.com/sites/default/files/uploads/20_svletegithub.jpg (Svelte GitHub page) +[72]: https://opensource.com/sites/default/files/uploads/21_aurelia.jpg (Aurelia page) +[73]: https://aurelia.io +[74]: https://opensource.com/sites/default/files/uploads/22_aureliagithub.jpg (Aurelia GitHub page) diff --git a/sources/tech/20200528 Getting Started With Nano Text Editor -Beginner-s Guide.md b/sources/tech/20200528 Getting Started With Nano Text Editor -Beginner-s Guide.md new file mode 100644 index 0000000000..90874df3e9 --- /dev/null +++ b/sources/tech/20200528 Getting Started With Nano Text Editor -Beginner-s Guide.md @@ -0,0 +1,246 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Getting Started With Nano Text Editor [Beginner’s Guide]) +[#]: via: (https://itsfoss.com/nano-editor-guide/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Getting Started With Nano Text Editor [Beginner’s Guide] +====== + +[Nano][1] is the default [terminal-based text editor][2] in Ubuntu and many other Linux distributions. Though it is less complicated to use than the likes of [Vim][3] and [Emacs][4], it doesn’t mean Nano cannot be overwhelming to use. + +In this beginner’s guide, I’ll show you how to use the Nano text editor. I am also going to include a downloadable PDF cheat sheet at the end of the article so that you can refer to it for practicing and mastering Nano editor commands. + +If you are just interested in a quick summary of Nano keyboard shortcuts, please expand the next section. + +Essential Nano keyboard shortcuts (click to expand) + +**Shortcut** | **Description** +---|--- +nano filename | Open file for editing in Nano +Arrow keys | Move cursor up, down, left and right +Ctrl+A, Ctrl+E | Move cursor to start and end of the line +Ctrl+Y/Ctrl+V | Move page up and down +Ctrl+_ | Move cursor to a certain location +Alt+A and then use arrow key | Set a marker and select text +Alt+6 | Copy the selected text +Ctrl+K | Cut the selected text +Ctrl+U | Paste the selected text +Ctrl+6 | Cancel the selection +Ctrl+K | Cut/delete entire line +Alt+U | Undo last action +Alt+E | Redo last action +Ctrl+W, Alt+W | Search for text, move to next match +Ctrl+\ | Search and replace +Ctrl+O | Save the modification +Ctrl+X | Exit the editor + +### How to use Nano text editor + +![][5] + +I presume that you have Nano editor installed on your system already. If not, please your distribution’s package manager to install it. + +#### Getting familiar with the Nano editor interface + +If you’ve ever [used Vim][6] or Emacs, you’ll notice that using Nano is a lot simpler. You can start writing or editing text straightaway. + +Nano editor also shows important keyboard shortcuts you need to use for editing at the bottom of the editor. This way you won’t get stuck at [exiting the editor like Vim][7]. + +The wider your terminal window, the more shortcuts it shows. + +![Nano Editor Interface][8] + +You should get familiar with the symbols in Nano. + + * The caret symbol (^) means Ctrl key + * The M character mean the Alt key + + + +When it says “^X Exit”, it means to use Ctrl+X keys to exit the editor. When it says “M-U Undo”, it means use Alt+U key to undo your last action. + +#### Open or create a file for editing in Nano + +You can open a file for editing in Nano like this: + +``` +nano my_file +``` + +If the file doesn’t exist, it will still open the editor and when you exit, you’ll have the option for saving the text to my_file. + +You may also open a new file without any name (like new document) with Nano like this: + +``` +nano +``` + +#### Basic editing + +You can start writing or modifying the text straightaway in Nano. There are no special insert mode or anything of that sort. It is almost like using a regular text editor, at least for writing and editing. + +As soon as you modify anything in the file, you’ll notice that it reflects this information on the editor. + +![][9] + +Nothing is saved immediately to the file automatically unless you explicitly do so. When you exit the editor using Ctrl+X keyboard shortcut, you’ll be asked whether you want to save your modified text to the file or not. + +#### Moving around in the editor + +Mouse click doesn’t work here. Use the arrow keys to move up and down, left and right. + +You can use the Home key or Ctrl+A to move to the beginning of a line and End key or Ctrl+E to move to the end of a line. Ctrl+Y/Page Up and Ctrl+V/Page Down keys can be used to scroll by pages. + +If you want to go a specific location like last line, first line, to a certain text, use Ctrl+_ key combination. This will show you some options you can use at the bottom of the editor. + +![Jump to a specific line in Nano][10] + +#### Cut, copy and paste in Nano editor + +If you don’t want to spend too much time remembering the shortcuts, use mouse. + +Select a text with mouse and then use the right click menu to copy the text. You may also use the Ctrl+Shift+C [keyboard shortcut in Ubuntu][11] terminal. Similarly, you can use the right click and select paste from the menu or use the Ctrl+Shift+V key combination. + +**Nano specific shortcuts for copy and pasting** + +Nano also provides its own shortcuts for cutting and pasting text but that could become confusing for beginners. + +Move your cursor to the beginning of the text you want to copy. Press Alt+A to set a marker. Now use the arrow keys to highlight the selection. Once you have selected the desired text, you can Alt+6 key to copy the selected text or use Ctrl+K to cut the selected text. Use Ctrl+6 to cancel the selection. + +Once you have copied or cut the selected text, you can use Ctrl+U to paste it. + +![][12] + +#### Delete text or lines in Nano + +There is no dedicated option for deletion in Nano. You may use the Backspace or Delete key to delete one character at a time. Press them repeatedly or hold them to delete multiple characters. + +You can also use the Ctrl+K keys that cuts the entire line. If you don’t paste it anywhere, it’s as good as deleting a line. + +If you want to delete multiple lines, you may use Ctrl+K on all of them one by one. + +Another option is to use the marker (Ctrl+a). Set the marker and move the arrow to select a portion of text. Use Ctrl+K to cut the text. No need to paste it and the selected text will be deleted (in a way). + +#### Undo or redo your last action + +Cut the wrong line? Pasted the wrong text selection? It’s easy to make such silly mistakes and it’s easy to correct those silly mistakes. + +You can undo and redo your last actions using: + + * Alt+U : Undo + * Alt +E : Redo + + + +You can repeat these key combinations to undo or redo multiple times. + +#### Search and replace + +If you want to search for a certain text, use Ctrl+W and then enter the term you want to search and press enter. The cursor will move to the first match. To go to the next match, use Alt+W keys. + +![][13] + +By default, the search is case-insensitive. You can also use regex for the search terms. + +If you want to replace the searched term, use Ctr+\ keys and then enter the search term and press enter key. Next it will ask for the term you want to replace the searched items with. + +![][14] + +The cursor will move to the first match and Nano will ask for your conformation for replacing the matched text. Use Y or N to confirm or deny respectively. Using either of Y or N will move to the next match. You may also use A to replace all matches. + +![][15] + +#### Save your file while editing (without exiting) + +In a graphical editor, you are probable used to of saving your changes from time to time. In Nano, you can use Ctrl+O to save your changes you made to the file. It also works with a new, unnamed file. + +![][16] + +Nano actually shows this keyboard shortcut at the bottom but it’s not obvious. It says “^O Write Out” which actually means to use Ctrl+O (it is letter O, not number zero) to save your current work. Not everyone can figure that out. + +In a graphical text editor, you probably use Ctrl+S to save your changes. Old habits die hard but it could cause trouble. Out of habit, if you accidentally press Ctrl+S to save your file, you’ll notice that the terminal freezes and you can do nothing. + +If you accidentally press Ctrl+S press Ctrl+Q nothing can be more scary than a frozen terminal and losing the work. + +#### Save and exit Nano editor + +To exit the editor, press Ctrl+X keys. When you do that, it will give you the option to save the file, or discard the file or cancel the exit process. + +![][17] + +If you want to save the modified file as a new file (save as function in usual editors), you can do that as well. When you press Ctrl+X to exit and then Y to save the changes, it gives the option to which file it should save the changes. You can change the file name at this point. + +You’ll need to have ‘write permission’ on the file you are editing if you want to save the modifications to the file. + +#### Forgot keyboard shortcut? Use help + +Like any other terminal based text editor, Nano relies heavily on keyboard shortcuts. Though it displays several useful shortcuts on the bottom of the editor, you cannot see all of them. + +It is not possible to remember all the shortcuts, specially in the beginning. What you can do is to use the Ctrl+G keys to bring up the detailed help menu. The help menu lists all the keyboard shortcuts. + +![][18] + +#### Always look at the bottom of the Nano editor + +If you are using Nano, you’ll notice that it displays important information at the bottom. This includes the keyboard shortcuts that will be used in the scenario. It also shows the last action you performed. + +![][19] + +If you get too comfortable with Nano, you can get more screen for editing the text by disabling the shortcuts displayed at the bottom. You can use Alt+X keys for that. I don’t recommend doing it, to be honest. Pressing Alt+X brings the shortcut display back. + +### Download Nano cheatsheet [PDF] + +There are a lot more shortcuts and editing options in Nano. I am not going to overwhelm you by mentioning them all. + +Here’s a quick summary of the important Nano keyboard shortcuts you should rememeber. Download link is under the image. + +![][20] + +[Download Nano Cheat Sheet (free PDF)][21] + +You can download the cheatsheet, print it and keep at your desk. It will help you in remembering and mastering the shortcuts. + +I hope you find this beginner’s guide to Nano text editor helpful. If you liked it, please share it on Reddit, [Hacker News][22] or in various [Linux forums][23] you frequently visit. + +I welcome your questions and suggestions. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/nano-editor-guide/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.nano-editor.org/ +[2]: https://itsfoss.com/command-line-text-editors-linux/ +[3]: https://www.vim.org/ +[4]: https://www.gnu.org/software/emacs/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-guide.png?ssl=1 +[6]: https://itsfoss.com/pro-vim-tips/ +[7]: https://itsfoss.com/how-to-exit-vim/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-interface.png?ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-modified-text.png?ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-jump-to-line.png?ssl=1 +[11]: https://itsfoss.com/ubuntu-shortcuts/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-set-mark.png?ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-search-text.png?ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-search-replace.png?ssl=1 +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-search-replace-confirm.png?ssl=1 +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-save-while-writing.png?ssl=1 +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-save-and-exit.png?ssl=1 +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-help-menu.png?ssl=1 +[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-hints.png?ssl=1 +[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-cheatsheet.png?ssl=1 +[21]: https://itsfoss.com/wp-content/uploads/2020/05/Nano-Cheat-Sheet.pdf +[22]: https://news.ycombinator.com/ +[23]: https://itsfoss.community/ diff --git a/sources/tech/20200529 Beaker Browser 1.0 Beta- One Step Forward and Two Steps Back.md b/sources/tech/20200529 Beaker Browser 1.0 Beta- One Step Forward and Two Steps Back.md new file mode 100644 index 0000000000..3b93e61af5 --- /dev/null +++ b/sources/tech/20200529 Beaker Browser 1.0 Beta- One Step Forward and Two Steps Back.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Beaker Browser 1.0 Beta: One Step Forward and Two Steps Back) +[#]: via: (https://itsfoss.com/beaker-browser-1-release/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +Beaker Browser 1.0 Beta: One Step Forward and Two Steps Back +====== + +I recently reviewed the [Beaker Browser][1]. About a week after that review was published, the devs [released Beaker 1.0 Beta][2]. And that changes almost everything I had observed in the previous article. + +This made me do an entire article on the new Beaker Browser.Here’s what’s been changed! + +### No more Dat, Beaker now uses Hypercore protocol + +![][3] + +One of the most significant changes to Beaker is the introduction of a new protocol. Up to now, Beaker has used the [Dat protocol][4] to distribute content. Beta 1.0 replaces Dat with [Hypercore][5]. + +One of the components is Hyperdrive [version 10][6], which was released the same days as Beaker. Hyperdrive is “a POSIX-like filesystem implementation, written in Node.js, that’s designed to be the storage layer for fast, scalable, and secure peer-to-peer applications.” + +Like BitTorrent, Hyperdrive can be used to share a large collection of files. However, unlike BitTorrent, the contents can be modified. + +![][7] + +Switching to the new protocol brings the following changes: + + * Performance is now vastly superior thanks to new data structures. + * Connection-reliability has improved thanks to a switch to a hole-punching DHT. + * A new “mounts” feature for composing multiple Hyperdrives into a single hierarchy. + + + +Since Beaker switched over to a new protocol, all previously created websites don’t work anymore. They did include a tool to convert sites from Dat to Hypercore. I tried it on a couple of one-page sites and it failed. It only created a new site that was totally empty of content. + +### New Beaker-website creating tools + +The Beaker devs introduced several new tools to make editing easier. Now when you edit or create a site, you will get a split-screen view with a code editor on the left and a preview window on the right. The preview is updated whenever you save your work. + +![Beaker Site Editing][8] + +Besides the editor you can also open a file manager to import and manage files and images. They also included a terminal application called [webterm][9]. This terminal can only interact with the contents of the site you are working on, but it is still pretty cool. webterm only comes with 10 simple commands. If you are adventurous you can write your own commands for it, using Javascript. + +You can pop out each of these tools into their own window. If you have all three open, the left-hand panel can get crowded very quickly. + +You can see more information about the release [here][2] + +### Final thoughts on the Beaker Browser 1.0 beta release + +When I saw the announcement for Beaker Browser 1.0 Beta, I was hopeful that some of the complaints I had in the review would be fixed. Unfortunately, that didn’t happen. + +My biggest problem with Beaker Browser was that it was hard to find `dat` powered content. In the previous version, there was a page with a list of about a dozen projects running on the Dat protocol, but that was it. + +If you dig around on the new version, you can find a list of people who have profiles created on Hypercore. Unfortunately, most of those pages are either blank or something someone quickly threw together. I imagine that this will change with the final version of 1.0 is released. + +![Beaker User Directory][10] + +I did enjoy the editing tools. It made it very easy to slap together a quick webpage with a couple of lines of Markdown. I did create a site, but I’m not going to leave Beaker Browser running 24/7 to seed it. There currently isn’t any other way to do it. + +What are your thoughts on the Beaker Browser? What are your thoughts on the peer-to-peer web? Please let us know in the comments below. + +If you found this article interesting, please take a minute to share it on social media, Hacker News, or [Reddit][11]. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/beaker-browser-1-release/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/beaker-browser/ +[2]: https://beakerbrowser.com/2020/05/14/beaker-1-0-beta.html +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/Beaker-Browser-1-beta.png?ssl=1 +[4]: https://www.datprotocol.com/ +[5]: https://hypercore-protocol.org/ +[6]: https://blog.hypercore-protocol.org/posts/announcing-hyperdrive-10/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/beaker-start-page.jpg?resize=800%2C426&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/beaker-site-editing-800x426.jpg?resize=800%2C426&ssl=1 +[9]: https://docs.beakerbrowser.com/advanced/webterm +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/beaker-user-directory.jpg?resize=800%2C426&ssl=1 +[11]: https://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20200602 Control your computer time and date with systemd.md b/sources/tech/20200602 Control your computer time and date with systemd.md new file mode 100644 index 0000000000..0047f4076d --- /dev/null +++ b/sources/tech/20200602 Control your computer time and date with systemd.md @@ -0,0 +1,356 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Control your computer time and date with systemd) +[#]: via: (https://opensource.com/article/20/6/time-date-systemd) +[#]: author: (David Both https://opensource.com/users/dboth) + +Control your computer time and date with systemd +====== +Keep your computer time in sync with NTP, Chrony, and systemd-timesyncd. +![Alarm clocks with different time][1] + +Most people are concerned with time. We get up in time to perform our morning rituals and commute to work (a short trip for many of us these days), take a break for lunch, meet a project deadline, celebrate birthdays and holidays, catch a plane, and so much more. + +Some of us are even _obsessed_ with time. My watch is solar-powered and obtains the exact time from the [National Institute of Standards and Technology][2] (NIST) in Fort Collins, Colorado, via the [WWVB][3] time signal radio station located there. The time signals are synced to the atomic clock, also located in Fort Collins. My Fitbit syncs up to my phone, which is synced to a [Network Time Protocol][4] (NTP) server, which is ultimately synced to the atomic clock. + +### Why time is important to computers + +There are many reasons our devices and computers need the exact time. For example, in banking, stock markets, and other financial businesses, transactions must be maintained in the proper order, and exact time sequences are critical for that. + +Our phones, tablets, cars, GPS systems, and computers all require precise time and date settings. I want the clock on my computer desktop to be correct, so I can count on my local calendar application to pop up reminders at the correct time. The correct time also ensures SystemV cron jobs and systemd timers trigger at the correct time. + +The correct time is also important for logging, so it is a bit easier to locate specific log entries based on the time. For one example, I once worked in DevOps (it was not called that at the time) for the State of North Carolina email system. We used to process more than 20 million emails per day. Following the trail of email through a series of servers or determining the exact sequence of events by using log files on geographically dispersed hosts can be much easier when the computers in question keep exact times. + +### Multiple times + +Linux hosts have two times to consider: system time and RTC time. RTC stands for real-time clock, which is a fancy and not particularly accurate name for the system hardware clock. + +The hardware clock runs continuously, even when the computer is turned off, by using a battery on the system motherboard. The RTC's primary function is to keep the time when a connection to a time server is not available. In the dark ages of personal computers, there was no internet to connect to a time server, so the only time a computer had available was the internal clock. Operating systems had to rely on the RTC at boot time, and the user had to manually set the system time using the hardware BIOS configuration interface to ensure it was correct. + +The hardware clock does not understand the concept of time zones; only the time is stored in the RTC, not the time zone nor an offset from UTC (Universal Coordinated Time, which is also known as GMT, or Greenwich Mean Time). You can set the RTC with a tool I will explore later in this article. + +The system time is the time known by the operating system. It is the time you see on the GUI clock on your desktop, in the output from the `date` command, in timestamps for logs, and in file access, modify, and change times. + +The [`rtc` man page][5] contains a more complete discussion of the RTC and system clocks and RTC's functionality. + +### What about NTP? + +Computers worldwide use the NTP (Network Time Protocol) to synchronize their time with internet standard reference clocks through a hierarchy of NTP servers. The primary time servers are at stratum 1, and they are connected directly to various national time services at stratum 0 via satellite, radio, or even modems over phone lines. The time services at stratum 0 may be an atomic clock, a radio receiver that is tuned to the signals broadcast by an atomic clock, or a GPS receiver using the highly accurate clock signals broadcast by GPS satellites. + +To prevent time requests from time servers or clients lower in the hierarchy (i.e., with a higher stratum number) from overwhelming the primary reference servers, several thousand public NTP stratum 2 servers are open and available for all to use. Many organizations and users (including me) with large numbers of hosts that need an NTP server choose to set up their own time servers, so only one local host accesses the stratum 2 or 3 time servers. Then they configure the remaining hosts in the network to use the local time server. In the case of my home network, that is a stratum 3 server. + +### NTP implementation options + +The original NTP implementation is **ntpd**, and it has been joined by two newer ones, **chronyd** and **systemd-timesyncd**. All three keep the local host's time synchronized with an NTP time server. The systemd-timesyncd service is not as robust as chronyd, but it is sufficient for most purposes. It can perform large time jumps if the RTC is far out of sync, and it can adjust the system time gradually to stay in sync with the NTP server if the local system time drifts a bit. The systemd-timesync service cannot be used as a time server. + +[Chrony][6] is an NTP implementation containing two programs: the chronyd daemon and a command-line interface called chronyc. As I explained in a [previous article][7], Chrony has some features that make it the best choice for many environments, chiefly: + + * Chrony can synchronize to the time server much faster than the old ntpd service. This is good for laptops or desktops that do not run constantly. + * It can compensate for fluctuating clock frequencies, such as when a host hibernates or enters sleep mode, or when the clock speed varies due to frequency stepping that slows clock speeds when loads are low. + * It handles intermittent network connections and bandwidth saturation. + * It adjusts for network delays and latency. + * After the initial time sync, Chrony never stops the clock. This ensures stable and consistent time intervals for many system services and applications. + * Chrony can work even without a network connection. In this case, the local host or server can be updated manually. + * Chrony can act as an NTP server. + + + +Just to be clear, NTP is a protocol that is implemented on a Linux host using either Chrony or the systemd-timesyncd.service. + +The NTP, Chrony, and systemd-timesyncd RPM packages are available in standard Fedora repositories. The systemd-udev RPM is a rule-based device node and kernel event manager that is installed by default with Fedora but not enabled. + +You can install all three and switch between them, but that is a pain and not worth the trouble. Modern releases of Fedora, CentOS, and RHEL have moved from NTP to Chrony as their default timekeeping implementation, and they also install systemd-timesyncd. I find that Chrony works well, provides a better interface than the NTP service, presents much more information, and increases control, which are all advantages for the sysadmin. + +### Disable other NTP services + +It's possible an NTP service is already running on your host. If so, you need to disable it before switching to something else. I have been using chronyd, so I used the following commands to stop and disable it. Run the appropriate commands for whatever NTP daemon you are using on your host: + + +``` +[root@testvm1 ~]# systemctl disable chronyd ; systemctl stop chronyd +Removed /etc/systemd/system/multi-user.target.wants/chronyd.service. +[root@testvm1 ~]# +``` + +Verify that it is both stopped and disabled: + + +``` +[root@testvm1 ~]# systemctl status chronyd +● chronyd.service - NTP client/server +     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled) +     Active: inactive (dead) +       Docs: man:chronyd(8) +             man:chrony.conf(5) +[root@testvm1 ~]# +``` + +### Check the status before starting + +The systemd timesync's status indicates whether systemd has initiated an NTP service. Because you have not yet started systemd NTP, the `timesync-status` command returns no data: + + +``` +[root@testvm1 ~]# timedatectl timesync-status +Failed to query server: Could not activate remote peer. +``` + +But a straight `status` request provides some important information. For example, the `timedatectl` command without an argument or options implies the `status` subcommand as default: + + +``` +[root@testvm1 ~]# timedatectl status +           Local time: Fri 2020-05-15 08:43:10 EDT   +           Universal time: Fri 2020-05-15 12:43:10 UTC   +                 RTC time: Fri 2020-05-15 08:43:08       +                Time zone: America/New_York (EDT, -0400) +System clock synchronized: no                           +              NTP service: inactive                     +          RTC in local TZ: yes                     + +Warning: The system is configured to read the RTC time in the local time zone. +         This mode cannot be fully supported. It will create various problems +         with time zone changes and daylight saving time adjustments. The RTC +         time is never updated, it relies on external facilities to maintain it. +         If at all possible, use RTC in UTC by calling +         'timedatectl set-local-rtc 0'. +[root@testvm1 ~]# +``` + +This returns the local time for your host, the UTC time, and the RTC time. It shows that the system time is set to the `America/New_York` time zone (`TZ`), the RTC is set to the time in the local time zone, and the NTP service is not active. The RTC time has started to drift a bit from the system time. This is normal with systems whose clocks have not been synchronized. The amount of drift on a host depends upon the amount of time since the system was last synced and the speed of the drift per unit of time. + +There is also a warning message about using local time for the RTC—this relates to time-zone changes and daylight saving time adjustments. If the computer is off when changes need to be made, the RTC time will not change. This is not an issue in servers or other hosts that are powered on 24/7. Also, any service that provides NTP time synchronization will ensure the host is set to the proper time early in the startup process, so it will be correct before it is fully up and running. + +### Set the time zone + +Usually, you set a computer's time zone during the installation procedure and never need to change it. However, there are times it is necessary to change the time zone, and there are a couple of tools to help. Linux uses time-zone files to define the local time zone in use by the host. These binary files are located in the `/usr/share/zoneinfo` directory. The default for my time zone is defined by the link `/etc/localtime -> ../usr/share/zoneinfo/America/New_York`. But you don't need to know that to change the time zone. + +But you do need to know the official time-zone name for your location. Say you want to change the time zone to Los Angeles: + + +``` +[root@testvm2 ~]# timedatectl list-timezones | column +<SNIP> +America/La_Paz                  Europe/Budapest +America/Lima                    Europe/Chisinau +America/Los_Angeles             Europe/Copenhagen +America/Maceio                  Europe/Dublin +America/Managua                 Europe/Gibraltar +America/Manaus                  Europe/Helsinki +<SNIP> +``` + +Now you can set the time zone. I used the `date` command to verify the change, but you could also use `timedatectl`: + + +``` +[root@testvm2 ~]# date +Tue 19 May 2020 04:47:49 PM EDT +[root@testvm2 ~]# timedatectl set-timezone America/Los_Angeles +[root@testvm2 ~]# date +Tue 19 May 2020 01:48:23 PM PDT +[root@testvm2 ~]# +``` + +You can now change your host's time zone back to your local one. + +### systemd-timesyncd + +The systemd timesync daemon provides an NTP implementation that is easy to manage within a systemd context. It is installed by default in Fedora and Ubuntu and started by default in Ubuntu but not in Fedora. I am unsure about other distros; you can check yours with: + + +``` +`[root@testvm1 ~]# systemctl status systemd-timesyncd` +``` + +### Configure systemd-timesyncd + +The configuration file for systemd-timesyncd is `/etc/systemd/timesyncd.conf`. It is a simple file with fewer options included than the older NTP service and chronyd. Here are the complete contents of the default version of this file on my Fedora VM: + + +``` +#  This file is part of systemd. +# +#  systemd is free software; you can redistribute it and/or modify it +#  under the terms of the GNU Lesser General Public License as published by +#  the Free Software Foundation; either version 2.1 of the License, or +#  (at your option) any later version. +# +# Entries in this file show the compile time defaults. +# You can change settings by editing this file. +# Defaults can be restored by simply deleting this file. +# +# See timesyncd.conf(5) for details. + +[Time] +#NTP= +#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org 2.fedora.pool.ntp.org 3.fedora.pool.ntp.org +#RootDistanceMaxSec=5 +#PollIntervalMinSec=32 +#PollIntervalMaxSec=2048 +``` + +The only section it contains besides comments is `[Time]`, and all the lines are commented out. These are the default values and do not need to be changed or uncommented (unless you have some reason to do so). If you do not have a specific NTP time server defined in the `NTP=` line, Fedora's default is to fall back on the Fedora pool of time servers. I like to add the time server on my network to this line: + + +``` +`NTP=myntpserver` +``` + +### Start timesync + +Starting and enabling systemd-timesyncd is just like any other service: + + +``` +[root@testvm2 ~]# systemctl enable systemd-timesyncd.service +Created symlink /etc/systemd/system/dbus-org.freedesktop.timesync1.service → /usr/lib/systemd/system/systemd-timesyncd.service. +Created symlink /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service → /usr/lib/systemd/system/systemd-timesyncd.service. +[root@testvm2 ~]# systemctl start systemd-timesyncd.service +[root@testvm2 ~]# +``` + +### Set the hardware clock + +Here's what one of my systems looked like after starting timesyncd: + + +``` +[root@testvm2 systemd]# timedatectl +               Local time: Sat 2020-05-16 14:34:54 EDT   +           Universal time: Sat 2020-05-16 18:34:54 UTC   +                 RTC time: Sat 2020-05-16 14:34:53       +                Time zone: America/New_York (EDT, -0400) +System clock synchronized: yes                           +              NTP service: active                       +          RTC in local TZ: no     +``` + +The RTC time is around a second off from local time (EDT), and the discrepancy grows by a couple more seconds over the next few days. Because RTC does not have the concept of time zones, the `timedatectl` command must do a comparison to determine which time zone is a match. If the RTC time does not match local time exactly, it is not considered to be in the local time zone. + +In search of a bit more information, I checked the status of systemd-timesync.service and found: + + +``` +[root@testvm2 systemd]# systemctl status systemd-timesyncd.service +● systemd-timesyncd.service - Network Time Synchronization +     Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: disabled) +     Active: active (running) since Sat 2020-05-16 13:56:53 EDT; 18h ago +       Docs: man:systemd-timesyncd.service(8) +   Main PID: 822 (systemd-timesyn) +     Status: "Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org)." +      Tasks: 2 (limit: 10365) +     Memory: 2.8M +        CPU: 476ms +     CGroup: /system.slice/systemd-timesyncd.service +             └─822 /usr/lib/systemd/systemd-timesyncd + +May 16 09:57:24 testvm2.both.org systemd[1]: Starting Network Time Synchronization... +May 16 09:57:24 testvm2.both.org systemd-timesyncd[822]: System clock time unset or jumped backwards, restoring from recorded timestamp: Sat 2020-05-16 13:56:53 EDT +May 16 13:56:53 testvm2.both.org systemd[1]: Started Network Time Synchronization. +May 16 13:57:56 testvm2.both.org systemd-timesyncd[822]: Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org). +[root@testvm2 systemd]# +``` + +Notice the log message that says the system clock time was unset or jumped backward. The timesync service sets the system time from a timestamp. Timestamps are maintained by the timesync daemon and are created at each successful time synchronization. + +The `timedatectl` command does not have the ability to set the value of the hardware clock from the system clock; it can only set the time and date from a value entered on the command line. However, you can set the RTC to the same value as the system time by using the `hwclock` command: + + +``` +[root@testvm2 ~]# /sbin/hwclock --systohc --localtime +[root@testvm2 ~]# timedatectl +               Local time: Mon 2020-05-18 13:56:46 EDT   +           Universal time: Mon 2020-05-18 17:56:46 UTC   +                 RTC time: Mon 2020-05-18 13:56:46       +                Time zone: America/New_York (EDT, -0400) +System clock synchronized: yes                           +              NTP service: active                       +          RTC in local TZ: yes +``` + +The `--localtime` option ensures that the hardware clock is set to local time, not UTC. + +### Do you really need RTC? + +Any NTP implementation will set the system clock during the startup sequence, so is RTC necessary? Not really, so long as you have a network connection to a time server. However, many systems do not have full-time access to a network connection, so the hardware clock is useful so that Linux can read it and set the system time. This is a better solution than having to set the time by hand, even if it might drift away from the actual time. + +### Summary + +This article explored the use of some systemd tools for managing date, time, and time zones. The systemd-timesyncd tool provides a decent NTP client that can keep time on a local host synchronized with an NTP server. However, systemd-timesyncd does not provide a server service, so if you need an NTP server on your network, you must use something else, such as Chrony, to act as a server. + +I prefer to have a single implementation for any service in my network, so I use Chrony. If you do not need a local NTP server, or if you do not mind dealing with Chrony for the server and systemd-timesyncd for the client and you do not need Chrony's additional capabilities, then systemd-timesyncd is a serviceable choice for an NTP client. + +There is another point I want to make: You do not have to use systemd tools for NTP implementation. You can use the old ntpd or Chrony or some other NTP implementation. systemd is composed of a large number of services; many of them are optional, so they can be disabled and something else used in its place. It is not the huge, monolithic monster that some make it out to be. It is OK to not like systemd or parts of it, but you should make an informed decision. + +I don't dislike systemd's implementation of NTP, but I much prefer Chrony because it meets my needs better. And that is what Linux is all about. + +### Resources + +There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup. + + * The Fedora Project has a good, practical [guide to systemd][8]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd. + * The Fedora Project also has a good [cheat sheet][9] that cross-references the old SystemV commands to comparable systemd ones. + * For detailed technical information about systemd and the reasons for creating it, check out [Freedesktop.org][10]'s [description of systemd][11]. + * [Linux.com][12]'s "More systemd fun" offers more advanced systemd [information and tips][13]. + + + +There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers. + + * [Rethinking PID 1][14] + * [systemd for Administrators, Part I][15] + * [systemd for Administrators, Part II][16] + * [systemd for Administrators, Part III][17] + * [systemd for Administrators, Part IV][18] + * [systemd for Administrators, Part V][19] + * [systemd for Administrators, Part VI][20] + * [systemd for Administrators, Part VII][21] + * [systemd for Administrators, Part VIII][22] + * [systemd for Administrators, Part IX][23] + * [systemd for Administrators, Part X][24] + * [systemd for Administrators, Part XI][25] + + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/time-date-systemd + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/clocks_time.png?itok=_ID09GDk (Alarm clocks with different time) +[2]: https://en.wikipedia.org/wiki/National_Institute_of_Standards_and_Technology +[3]: https://en.wikipedia.org/wiki/WWVB +[4]: https://en.wikipedia.org/wiki/Network_Time_Protocol +[5]: https://linux.die.net/man/4/rtc +[6]: https://chrony.tuxfamily.org/ +[7]: https://opensource.com/article/18/12/manage-ntp-chrony +[8]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[9]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[10]: http://Freedesktop.org +[11]: http://www.freedesktop.org/wiki/Software/systemd +[12]: http://Linux.com +[13]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[14]: http://0pointer.de/blog/projects/systemd.html +[15]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[16]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[17]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[18]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[19]: http://0pointer.de/blog/projects/three-levels-of-off.html +[20]: http://0pointer.de/blog/projects/changing-roots +[21]: http://0pointer.de/blog/projects/blame-game.html +[22]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[23]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[24]: http://0pointer.de/blog/projects/instances.html +[25]: http://0pointer.de/blog/projects/inetd.html diff --git a/sources/tech/20200603 Exploring Algol 68 in the 21st century.md b/sources/tech/20200603 Exploring Algol 68 in the 21st century.md new file mode 100644 index 0000000000..6e5dc9d585 --- /dev/null +++ b/sources/tech/20200603 Exploring Algol 68 in the 21st century.md @@ -0,0 +1,381 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Exploring Algol 68 in the 21st century) +[#]: via: (https://opensource.com/article/20/6/algol68) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) + +Exploring Algol 68 in the 21st century +====== +An in-depth look at a forgotten language and its modern applications. +![Old UNIX computer][1] + +In the preface to his excellent textbook _Algol 68: A First and Second Course_, Andrew McGettrick writes: + +> "This book originated from lectures first given at the University of Strathclyde in 1973-4 to first-year undergraduates, many of whom had no previous knowledge of programming. Many of the students were not taking computer science as their main subject but merely as a subsidiary subject. They, therefore, served as a suitable audience on whom to inflict lectures attempting to teach Algol 68 as a first programming language." + +Perhaps this quote carries particular weight for me as I, too, was a first-year student in 1973-1974, though at a different institution—the University of British Columbia. Moreover, "back in those days," the introductory computer science course at UBC was taught in the second year using Waterloo FORTRAN with a bit of IBM 360 Assembler thrown in; nothing so exotic as Algol 68. In my case, I didn't encounter Algol 68 until my third year. Maybe this wait, along with experiences in other programming languages, contributed to my lifelong fascination with this underrated and wonderful programming language. And thanks to Marcel van der Veer, who has created [a very fine implementation of Algol 68][2] called Algol 68 Genie, that is now in my distro's repositories, at long last, I've been able to explore Algol 68 at my leisure. I should also mention that Marcel's book, [_Learning Algol 68 Genie_][3], is of great utility both for newcomers and as a refresher course in Algol 68. + +Because I've been having so much fun rediscovering Algol 68, I thought I'd share some of my thoughts and impressions. + +### What people say about Algol 68 + +If it's worth reading [the overview of Algol 68 on Wikipedia][4], then it's really worth reading this paragraph from the [_Revised Report on the Algorithmic Language Algol 68_][5]: + +> "The original authors acknowledged with pleasure and thanks the wholehearted cooperation, support, interest, criticism, and violent objections from members of WG 2.1 and many other people interested in Algol." + +"Criticism and violent objections"—wow! In fact, some committee members were so unhappy with the direction the committee was taking that they left and started their own language definition projects, at least partly as a protest against Algol 68. Niklaus Wirth, for example, fed up with the complexity of Algol 68, [went off to design Pascal][6]. And having written and supported a fair bit of Pascal code from about 1984 through 2000 or so, I am here to tell you that Pascal is about as far from Algol 68 as it's possible to get. Which, it seems to me, was Wirth's point. + +Dennis Ritchie [gave a talk][7] at the second ACM History of Programming Languages conference in Cambridge, Massachusetts in 1993, in which he compares Bliss, Pascal, Algol 68, and C. In that talk, he made several interesting observations: + + * All of the four languages are "based on this old, old model of machines that pick up things, do operations, and put them someplace else" and "are very much influenced by Algol 60 and FORTRAN." + * "When Steve Bourne (yes, the person who created the Bourne shell) came to Bell Labs with the Algol 68C compiler, he made it do the same things that C could do; it had Unix system call interfaces and so forth." + * "I think the language really did suffer from its definition in terms of acceptance. Nevertheless, it was really quite practical." + * "In some ways, Algol 68 is the most elegant of the languages I've been discussing. I think in some ways, it's even the most influential, although as a language in itself, it has nearly gone away." + + + +There is much more opinion on Algol 68 still prominent on the Internet today. A lot of it is negative, but oh well! I suspect a great deal of it is not informed by actual use. One very interesting place to find coders just getting down to using the language (and many others, some marvelously obscure) is on [the Rosetta Code Wiki][8]. Go there and form your own opinion! Or follow me as I review what strikes me as great and not so great about Algol 68. + +### What seems important and relevant to me about Algol 68 + +Algol 68, as a programming language, offers some distinctive and useful ideas that were innovative at the time and have shown up, to some degree or the other, in other languages since then. + +#### Key design principles clearly explained in the Revised Report + +The committee that designed Algol 68 was driven by a very clear set of principles: + + * Completeness and clarity of description (aided by the use of two-level grammar, which provoked many negative opinions) + * Orthogonal design; that is, basic concepts defined in the language can be used anywhere that usage can be said to "make sense." As an example—every expression that can reasonably be expected to yield a value does, in fact, yield a value. + * Security by way of careful syntactical design (that two-level grammar again); most errors thought to be related to semantic concepts in other languages can be detected at compile time. + * Efficiency, in that programs should run efficiently (on the hardware of the day) without requiring significant efforts to optimize the generated code, and furthermore: + * No run time-type checking except in the unique case of types that present alternative configurations at run time (`united` types in Algol 68, similar to `union` types in C) + * Type-independent parsing (again, the two-level grammar at work here) and certainty that, in a finite number of steps, any input sequence can be evaluated as to whether it is a program or not + * Loop structures that encourage the use of well-known loop optimization strategies of the day + * A symbol set (with alternatives) that worked on the various different character sets available on computers at the time + + + +I find it instructive to see the emphasis on very strong static typing (50 years ago!!) and the benefits that were expected to accrue, in contrast to today's universe of dynamically-typed languages and languages with weak static typing that have helped spawn an entire industry of run-time testing. (OK maybe that's not completely fair, but it contains a certain element of truth). + +#### Structures to group statements together without extra grouping constructs + +In programs written in Algol 60 and Pascal, we see a lot of `begin` and `end` tokens; in C, C++, Java, and so forth, we see a lot of `{` and `}`. For example, the simple expression to calculate the absolute value `av` of an integer value `iv` can be written in either Algol 60 or Pascal as: + + +``` +`if iv < 0 then av := -iv else av := iv` +``` + +If we wanted to set a Boolean value stating whether `iv` was negative, then we need to start inserting `begin` and `end`: + + +``` +`if iv < 0 then begin av := -iv; negative := true end else begin av := iv; negative := false end` +``` + +Formally, Algol 68 uses boldface for tokens with special meaning like **if** or **then**, and uses italics for names of things like the _print_() procedure.  This wasn't practical back in the day when many still used keypunches for coding, and it would still be a bit weird today.  So Algol 68 implementations usually provided some method of marking special symbols (called _stropping_), leaving everything else unmarked.  By default, Algol 68 Genie uses upper case stropping, so symbols like **if** are coded as IF, and names of things can only be in lower case.  Worth noting however is that it's completely ok to have a variable named "if" should that suit the purpose at hand. Anway... in case any reader is inclined to copy / paste, I'm using the Genie convention in my code samples. + +Moreover, Algol 68 has a closed syntax, which the Bourne shell and Bash have inherited.  So the previous line of code in Algol 68 Genie would be: + + +``` +`IF iv < 0 THEN av := -iv; negative := TRUE ELSE av := iv; negative := FALSE FI` +``` + +The token `fi` closes off the preceding `if`, in case that's not obvious. Now, perhaps I'm the only person in the world who has ever written some Java that looks like this: + + +``` +if (something) +    statement; +``` + +and then found myself inserting a call to `println` to debug that code: + + +``` +if (something) +    statement; +    [System][9].err.println(stuff);  /* not in the then-part of if!!! */ +``` + +cluelessly forgetting to wrap the then-part in `{` … `}`. And of course, this isn't the end of the world, but when the insertion is something with less obvious results, well, let's just say I've spent a fair bit of time debugging this kind of thing over the years. + +But that can't happen in Algol 68. Well, mostly, anyway. Algol 68 still needs `begin` … `end` for operator and procedure declarations. But `if` … `fi`, `do` … `od` and `case` … `esac` (the Algol 68 switch statement) are all closed. + +We see this same concept in Go today; an "if" statement looks like if … { … }; the { and } are required. And as I already mentioned, the Bourne shell and its descendants use similar constructs. + +#### Almost every expression yields a value + +Look at the expression `iv < 0` above; pretty obvious that yields a value, and most likely that value is Boolean (`true` or `false`). So no big deal there. + +But an assignment statement also yields a value, namely, the left-hand side of the assignment statement after the assignment is completed. + +A sequence of statements yields whatever the final statement (or expression) yields as a value. + +An "if" statement yields either the value of the then-part or the else-part, depending on whether the expression following "if" yields `true` or `false`. + +An example: think of using the C, Java… ternary operator for our absolute value calculation: + + +``` +`av = iv < 0 ? -iv : iv;` +``` + +In Algol 68, we don't need an extra "ternary operator," as the "if" statement works just fine: + + +``` +`av := IF iv < 0 THEN -iv ELSE iv FI` +``` + +This might be a good moment to mention that Algol 68 provides "brief" versions of symbols like `begin`, `end`, `if`, `then`, `else` and so forth, using `( |` and `)`: + + +``` +`av := ( iv < 0 | -iv | iv )` +``` + +has the same meaning as the previous expression. + +One thing that surprised me when I first encountered it is that loops don't yield an expression. But loops have a few differences that end up making sense once they are fully understood. + +A loop in Algol 68 might look like this: + + +``` +`FOR lv FROM 1 BY 1 TO 1000 WHILE 2 * lv * ly < limit DO … OD` +``` + +The variable `ly` here is the loop variable, implicitly declared by the `for` as an integer. Its scope is the entire `for` … `od`**,** and its value is retained from one iteration to the next. We can declare a regular variable in the `while` … `do` part, just like in an `if` … `then` part. Its scope is the `while` … `od` part, but its value is not retained from one iteration to the next. So, for example, if we want to accumulate the sum of the elements of an array, we must write: + + +``` +`INT sum := 0; FOR ai FROM LWB array TO UPB array DO sum +:= array[ai] OD` +``` + +where the operators `lwb` and `upb` deliver the smallest and largest index values respectively defined for the array and the +:= symbol has the same meaning as += in C or Java. + +If we wanted to return the sum as a value, we would write: + + +``` +`BEGIN INT sum := 0; FOR ai FROM LWB array TO UPB array DO sum +:= array[ai] OD; sum END` +``` + +Of course, we could replace `begin` and `end` with `(` and `)` for brevity. This expression would be a reasonable implementation of a procedure (or operator) that returns the sum of the values of the elements of an array. + +#### Orthogonality—the same expression will work almost anywhere + +Look again at the expression `iv < 0` above. + +Let's step back a bit and include a definition of `iv` and the acquisition of its value. Then the code might look like: + + +``` +`INT iv; read(iv); IF iv < 0 THEN … FI` +``` + +However, we could just as well write: + + +``` +`IF INT iv; read(iv); iv < 0 THEN … FI` +``` + +Here we can see orthogonality at work - the declaration and reading of the variable can occur between the `if` and the logical expression testing the variable, because the value delivered is just that of the final expression. Moreover, this works with Algol 68 semantics to provide an interesting difference—in the first case, the scope of `iv` is the code surrounding the "if" statement; in the second, the scope is just between the `if` and the `fi`. To my way of thinking, this option means that we should have fewer variables declared far away from where they are used, and the ones that remain really do have a "long life" in the code. + +This has practical importance as well. Think, for example, of code that uses some kind of SQL interface to execute several scripts in a database and return the values for further analysis. Usually, in this case, the programmer needs to do a bit of work to set up the connection to the database, pass a query string to the execute command, and retrieve the results. Each instance requires declaring some variables to hold the connection, the query string, and the results. How nice it is when these variables can be declared locally to the results accumulation code! This also facilitates adding a new query-analysis step with a quick copy-paste. And yes, it's good to turn these code snippets into procedure calls, especially in a language that supports lambdas (anonymous procedures) so as to avoid obscuring the different analysis steps with repeated administrative steps. But having very locally-defined administrative variables facilitates the refactoring effort required. + +Another great consequence of orthogonality is that we can have the equivalent of the ternary operator on the left-hand side of an assignment statement as well as on the right-hand side. + +Let's suppose we're processing an input stream of signed integers, and we want to accumulate positive integers into gains and negative integers into losses. Then, the following Algol 68 code would work: + + +``` +`IF amount < 0 THEN losses +:= amount ELSE gains +:= amount FI` +``` + +However, there's no need to repeat the `+:= amount` here; we can move it outside the `if` … `fi` as follows: + + +``` +`IF amount < 0 THEN losses ELSE gains FI +:= amount` +``` + +This works because the "if" statement yields either the losses or gains expression as a result of the evaluation of the test, and that expression is incremented by amount. And of course, we can use the brief form, which, in my opinion at least, improves the readability in these short expressions: + + +``` +`(amount < 0 | losses | gains) +:= amount` +``` + +How about a real example to show why this expression-oriented thing is so great? + +Suppose you are writing a hash table facility. Two functions you will have to implement are "get the value associated with a given key" and "set the value associated with a given key". + +In an expression-oriented language, those can be one function. Why? Because the "get" operation returns the location where the value is found, and then the "set" operation simply uses the "get" operation to set the value at that location. Let's assume we've created an operator called `valueat` that takes two arguments—the hash table itself and the key value. Then, + + +``` +`ht VALUEAT 42` +``` + +will return the location of key 42 in the hash table ht and + + +``` +`ht VALUEAT 42 := "the meaning of everything"` +``` + +will put the string "the meaning of everything" at location 42. + +This reduces the amount of code required to support the application at hand, reducing the number of pathways and edge cases that must be tested, and just generally adds wonderfulness to the users' and maintainers' lives. + +There is a simple example of using procedures on the left-hand side of assignment statements to store values in a table on [RosettaCode][10]. + +#### Anonymous procedures (lambdas) + +Everyone seems to want anonymous procedures (or "here" procedures, or lambdas) these days. Algol 68 provided that out of the box, and it's really, truly useful. + +By way of example, imagine that you want to create a facility to read files with delimited fields and to give users a nice interaction pathway with those. Think of the fine job `awk` does on this, basically by abstracting away all the junk related to opening the file, reading the lines, splitting the lines into fields, and providing some useful collateral variables along the way, like current-line-number, number-of-fields-on-this-line, and so forth. + +It turns out that's pretty easy to do in Algol 68 as well, where the task becomes to write a procedure that takes three arguments—the first being the input file name, the second being the field separator string, and the third being a procedure that handles each line. + +The declaration of that procedure might look like this: + + +``` +PROC each line =         # 1 # +        (STRING input file name, CHAR separator, PROC (STRING, [] STRING, INT) VOID process) # 2 # +VOID: BEGIN              # 3 # +    FILE inf;            # 4 # +    open(inf, input file name, stand in channel); # 5 # +    BOOL finished reading := FALSE; +    on logical file end (inf, (REF FILE f) bool: finished reading := TRUE); # 6 # +    INT linecount := 0;  # 7 # +    WHILE                # 8 # +        string line; +        get(inf,(line, new line)); +        not finished reading +    DO                   # 9 # +        linecount +:= 1; +        FLEX [1:0] STRING fields := split(line, separator); +        process(line, fields, linecount) +    OD; +    close(inf)           # 10 # +END                      # 11 # +``` + +Here’s what’s going on above: + + 1. Comment 1 (the # 1 # above)—the declaration of the procedure `each line` (note that blanks can be inserted into the middle of names or numbers at will) + + 2. The parameters to each line—the `string` file name, the field separator `char`acter, and the `pro`cedure to be called to process each line, which itself takes a `string` (the line of input) an array of `string`s (the fields of the line) and an `int`eger (the line number) and which returns a `void` value + + 3. `each line` returns a `void` value, and the procedure body starts with a `begin`, allowing us to use several statements in its definition + + 4. Declare the input `file` + + 5. Associate the `standard input channel` with the `file`, whose name is given by `input file name` and open it (for reading) + + 6. Algol 68 handles end-of-file conditions a bit differently; here, we use the I/O event detection procedure `on logical file end` to set the flag `finished reading` that we can detect while processing the file + + 7. Create and initialize the line count (see the previous description of the nature of loops) + + 8. This `while` loop attempts to read the next line from the input file. If successful, it processes the line; otherwise, it exits + + 9. Processing the input line—increment the line count; create an array of strings corresponding to the fields of the line using the `split` procedure; call the supplied `process` procedure to consume the line, its fields and the line count + + 10. Remember to `close` the file + + 11. `end` of the procedure definition. + + + + +And we might use it like so, in order to build a lookup table (in conjunction with the hypothetical hash table facility mentioned in passing in the previous section): + + +``` +# remapping definitions in remapping.csv file # +# new-reference|old-reference # +# 093M0770371|093X0012250 # +# 093M0770375|093X0012249 # +# 093M0770370|093X0012133 # + +[/code] [code] + +HASTABLE ht := new hashtable; + +each delimited line("test.csv", "|", (STRING line, [] STRING fields, INT linecount) VOID: BEGIN +    STRING to map := fields[1], from map := fields[2]; +    ht VALUEAT from map := to map +END); +``` + +Above, we see the call to each delimited line. Of particular interest is the declaration of the "here" procedure or lambda that stows the lookup values into the hash table. From my perspective, the big lesson here is that lambdas are a consequence of Algol 68's orthogonality; I think that's pretty neat. + +One of the things I plan to dig deeper into as I continue to explore Algol 68 is how much further I can take this functional form of expression. For example, I don't see why I can't build a list or a hash table element by element and yield the finished structure as the result of the looping procedure, so the above might look more like: + + +``` +HASHTABLE ht := each delimited line as map entry("test.csv", "|", +        (STRING line, [] STRING fields, INT linecount) VOID: BEGIN +    STRING to map := fields[1], from map := fields[2]; +    (from map, to map) +END); +``` + +### In conclusion + +Why learn about old, dusty, and forgotten languages? Well, we all know about the recent interest in COBOL, but perhaps that's an outlier in the sense that there probably aren't a lot of mission-critical applications written in SNOBOL, Icon, APL, or even Algol 68. Certainly, there is George Santayana's guidance to bear in mind: ["Those who cannot remember the past are condemned to repeat it."][11] + +For me, there are a few key reasons to up my game in Algol 68 (and probably in a few other languages that don't seem to be absolutely necessary to my daily efforts): + + * Algol 68 was not defined as a reaction against some annoyances in an existing programming language; rather, according to the Revised Report: + + * The committee (Working Group 2.1 on ALGOL of the International Federation for Information Processing) "expresses its belief in the value of a common programming language serving many people in many countries." + + * "Algol 68 has not been designed as an expansion of Algol 60 but rather as a completely new language based on new insight into the essential, fundamental concepts of computing and a new description technique." + + * Whether through positive contributions copied into other languages (`do` … `od` in the Bourne shell; += in C, Java, …) or negative reactions (Pascal and all its descendants, Ada), Algol 68 can claim to have influenced computing in profound ways. + + * While Algol 68 is very much "a child of its time," being influenced by keypunches and line printers, small and diverse character sets, the wide variation in character and word sizes of computers in the 1960s and 1970s, and not explicitly incorporating object orientation or functional programming, its rather extraordinary orthogonality and expression-orientedness make up for these oddities and lacking in other useful ways. + + * Perhaps the most practical reason is having the wonderful Algol 68 Genie interpreter installed and running on my desktop, allowing me to pursue this odd small hobby! + + + + +Perhaps I should return to Santayana for a final comment: + +> ["Beauty as we feel it is something indescribable: what it is or what it means can never be said."][11] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/algol68 + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/clhermansen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/retro_old_unix_computer.png?itok=SYAb2xoW (Old UNIX computer) +[2]: https://jmvdveer.home.xs4all.nl/en.algol-68-genie.html +[3]: https://jmvdveer.home.xs4all.nl/en.download.learning-algol-68-genie-283.html +[4]: https://en.wikipedia.org/wiki/ALGOL_68 +[5]: http://www.softwarepreservation.org/projects/ALGOL/report/Algol68_revised_report-AB.pdf +[6]: https://en.wikipedia.org/wiki/Pascal_(programming_language) +[7]: https://www.bell-labs.com/usr/dmr/www/hopl.html +[8]: http://rosettacode.org/wiki/Rosetta_Code +[9]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system +[10]: https://rosettacode.org/wiki/Associative_array/Creation#ALGOL_68 +[11]: https://en.wikiquote.org/wiki/George_Santayana diff --git a/sources/tech/20200606 What are the pros and cons of virtual events.md b/sources/tech/20200606 What are the pros and cons of virtual events.md new file mode 100644 index 0000000000..4b540c180e --- /dev/null +++ b/sources/tech/20200606 What are the pros and cons of virtual events.md @@ -0,0 +1,51 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What are the pros and cons of virtual events?) +[#]: via: (https://opensource.com/article/20/6/virtual-events) +[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeo) + +What are the pros and cons of virtual events? +====== +Take our poll to tell us what you enjoy most about virtual events within +the open source community. +![Teamwork starts with communication amongst teams and across silos][1] + +The COVID-19 pandemic disturbed the work of event organizers everywhere. To slow the spread of this highly contagious virus, conferences that tend to host thousands in person faced a choice: Move entirely online, or cancel altogether. Many open source event organizers chose the latter, but not all of them. + +[Open Source 101][2] was due to be held in Austin, TX, on April 14. Instead, it hosted 1,000 attendees virtually. Later this month, the Linux Foundation will host the annual North American contingent of its [Open Source Summit][3] online. And rather than hosting DrupalCon around the world as planned, the Drupal Association [will host DrupalCon Global][4] online from July 14 - 17.  + +If there's any group that could move events online without missing a beat, it's the open source community. Open source teams are used to meeting online and working asynchronously to support diverse time zones. + +And moving community events online could make those communities more inclusive. That's because virtual events allow anyone, anywhere in the world to attend the summits and sessions that are most relevant to them, on their own schedules.  + +This decreases the costs of time and money that prevent many from attending in person. Many virtual equivalents of in-person events are being offered at drastically reduced costs, if not for free. That cost reduction in tickets, coupled with not needing to spend money on flights and hotels, goes a long way towards increasing access. + +Still, I can't help feeling like the lack of in-person events this year is a loss. I've worked on remote teams for more than five years, and on remote open source projects in my spare time. I am among the biggest advocates of remote work you'll find. That's the same reason why I look forward to my teams' in-person offsites each year. + +That time to meet in person, celebrate achievements, decide on new visions for our projects, and socialize is crucial. It plays a key role in bridging the distance gap by helping us put names to faces and getting to know each other.  + +On a personal note, I've shared before how I started [contributing to open source][5] after attending a huge conference where I met several community leaders. By meeting and making connections face to face, I got plugged in much faster than if I had stumbled onto GitHub and searched through random projects. I fully support public health efforts to keep people safe, *and *haven't found virtual events to be a strong substitute for the informal conversations in the "hallway track." + +**Have you attended a virtual open source event this spring? What were the pros and cons compared to their in-person counterparts?** + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/virtual-events + +作者:[Lauren Maffeo][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/lmaffeo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/fistbump-team-teamwork.png?itok=WuSu8-wE (Teamwork starts with communication amongst teams and across silos) +[2]: https://www.allthingsopen.org/open-source-101-at-home-2020-event-summary/?utm_source=All+Things+Open+Universe&utm_campaign=9fb4857423-EMAIL_CAMPAIGN_2020_01_15_01_25_COPY_01&utm_medium=email&utm_term=0_bcf95632f2-9fb4857423-243641509 +[3]: https://events.linuxfoundation.org/open-source-summit-north-america/ +[4]: https://events.drupal.org/global2020 +[5]: https://opensource.com/article/19/6/conference-proposal-tips diff --git a/sources/tech/20200608 A secure and private open source alternative to Alexa.md b/sources/tech/20200608 A secure and private open source alternative to Alexa.md new file mode 100644 index 0000000000..ec6a09acc0 --- /dev/null +++ b/sources/tech/20200608 A secure and private open source alternative to Alexa.md @@ -0,0 +1,95 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A secure and private open source alternative to Alexa) +[#]: via: (https://opensource.com/article/20/6/open-source-voice-assistant) +[#]: author: (Steve Ovens https://opensource.com/users/stratusss) + +A secure and private open source alternative to Alexa +====== +Mycroft brings more privacy, security, and freedom into your voice +assistant applications. +![radio communication signals][1] + +I grew up in rural towns all over Ontario, Canada. We weren't particularly well off, although, as a kid in the middle of nowhere, I wasn't really aware of our socioeconomic status. What I was aware of was this beige box called a computer that sat in my dad's office. Dad worked for the bank, and for his job, it was essential for him to have a computer. So while we never had the latest gaming console, we always had a computer. + +It's probably because of this that I developed a pretty intense relationship with all things computers. Today, I am fortunate to work for Red Hat, but that's another story altogether. Growing up in the '80s and having my teenage years in the mid-90s, I have a vivid awareness of how computers have changed. I remember watching as my dad logged online for the first time on our 9600-baud modem. I remember the first time I was able to download skins for buildings in my favorite game, Sim City 2000. + +I mention all this for a reason: I have watched computers evolve my entire life, from mashing arcane commands into DOS (ironically, some say I still perform the same tasks years later in my role at Red Hat), to GUIs of "fat" applications, to web apps, and mobile. The one commonality that has stood out has been the end user's demand for an ever-simplified interface to interact with technology. + +### From touch to voice + +For several years, the cool thing was to be able to poke at your device's screen and have it react. Touch screens were all the rage. Nowadays, the consumer space is trending towards digital assistants. Some stats say that by 2022, 55% of US households will have a voice assistant. Other sources say that Amazon sells approximately 14 million of these devices _per quarter_, while Google trails behind with around 11 million. If you want a concrete market value, MarketWatch estimates the value of this industry will be $7.8 billion by 2023. This doesn't even take into account the phones that everyone has in their pockets! Whatever metrics you use, one thing is clear: voice assistants are becoming increasingly important. + +So are your only options Google, Amazon, or Apple? _NOPE!_ If they were, I wouldn't be writing this article, where I'll introduce you to [Mycroft][2]. + +### Mycroft: An open source voice assistant for developers + +For me, Mycroft's big selling feature is that it is open source. This means that I can get in, tinker around, and contribute to the project. It's largely based in Python, which works out just fine for me. + +Before I go any further, I want to draw your attention to the subheading: "for developers." These are my words, and while I contribute to the project, I do not speak for it. However, I want to emphasize that the project is not at a state where it's ready to gain mass adoption. Mycroft's [official documentation][3] is generally very good, but there are rough edges that are being smoothed out all the time. So, if you are willing to put in some effort, perhaps file some bugs, and take the long view, this project is absolutely worth your time. If you are looking for an off-the-shelf, ready to go project, you may need to come back in a year or so. + +Here are some of the major reasons it makes sense to get involved with the Mycroft project. + +#### Privacy + +As I mentioned, voice assistants are everywhere, and that's only increasing. Although they are often forgotten, they are listening to everything. [Apple][4], [Google][5], and [Amazon][6] have all been found listening to the recordings their voice assistants capture. In [some cases][7], these recordings are even being used in courts of law. + +What if you work out of your home office (even before the world got turned upside down by COVID-19)? How can you protect the privacy of your users and clients, especially when most people don't even realize that the technology meant to make their lives easier is capturing their private conversations? + +Even if you aren't worried about exposing your conversations, are you OK with companies gathering this data for targeted advertising? Mycroft puts privacy at the forefront. Its default speech-to-text (STT) backend is Google's STT service, but you can choose from a wide variety of providers, including Google, IBM's Watson, Mozilla, Kaldi, Microsoft Azure, and more. In addition, Mycroft proxies all STT requests that go through their servers for specific providers (Google being one of them). + +#### Security + +Remember how I said Mycroft is for developers? Since you self-host Mycroft, this means its security is as good as you can make it. You can (and should) implement VLANs, routing rules, firewall rules, and whatever other security that is relevant for your environment. + +Even if your security is not top-notch, the obfuscation you receive from having such a tiny footprint means that, outside of random chance or a targeted attack, your Mycroft instance is relatively safe from the outside world. If it's on your network, you control what and who has access to your voice assistant. That's a good thing. + +#### Did I mention Python? + +I love Python. It's one of the main reasons I was able to get involved so quickly. I use Python extensively in my day-to-day, both for fun and profit. I introduced my wife to Mycroft, and she immediately started adding tasks to _my_ backlog for all the things she wants _her_ voice assistant to be able to do. + +While I was hard at work picking through my backlog, I noticed that one of the Mycroft intent parsers (which I will discuss in my next article) did not handle apostrophes properly. So, in true open source fashion, I forked the code, fixed it up, and created a pull request (PR) against the project. After some small back and forth, my PR was brought up to the project standards and voila! Mycroft now handles apostrophes better. How cool is that? + +A) I was able to fork the code, fix it, and run the fix locally and  + +B) have these changes accepted by the project to benefit everyone  + +  + +It's mind-blowing. + +Not only that, but other projects including [KDE Plasma on TV][8] have integrated Mycroft to make their projects more widely appealing. I'd love to hear about more projects that have taken advantage of Mycroft, so please reach out on Twitter or leave a comment below if you know of any. + +### Science non-fiction + +As a kid, I always loved science fiction; I still do, in fact. I wanted to be able to be like Jean-Luc Picard and say, "Computer, Earl Grey. Hot," and have things magically happen. While food replicators are still a long way off, with Mycroft and a little bit of know-how, I can say things like, "Hey, Mycroft, start the tea kettle" or "Hey, Mycroft, add bread to my shopping list," and Mycroft will make it so. + +I'm relatively new to the Mycroft developer community, but we are a small group of tightly knit folks who want to live in a world where there is an open source competitor to the Alexas, Siris, and Googles of the world. Stop by and chat with us on [Mattermost][9]. + +Need to keep your schedule straight? Learn how to do it using open source with these free... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/open-source-voice-assistant + +作者:[Steve Ovens][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/stratusss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/sound-radio-noise-communication.png?itok=KMNn9QrZ (radio communication signals) +[2]: https://mycroft.ai/ +[3]: https://mycroft-ai.gitbook.io/docs/ +[4]: https://www.forbes.com/sites/kateoflahertyuk/2019/07/28/apple-siri-eavesdropping-puts-millions-of-users-at-risk/#3eea76e6a530 +[5]: https://www.digitalmusicnews.com/2019/07/12/google-employees-google-home/ +[6]: https://www.cnbc.com/2019/04/11/how-to-stop-amazon-from-listening-to-what-you-say-to-alexa.html +[7]: https://www.cnn.com/2017/03/07/tech/amazon-echo-alexa-bentonville-arkansas-murder-case/index.html +[8]: https://dot.kde.org/2020/03/26/plasma-tv-presenting-plasma-bigscreen +[9]: https://chat.mycroft.ai/ diff --git a/sources/tech/20200608 Eliminate spam using SSL with an open source certification authority.md b/sources/tech/20200608 Eliminate spam using SSL with an open source certification authority.md new file mode 100644 index 0000000000..4f63eac8dd --- /dev/null +++ b/sources/tech/20200608 Eliminate spam using SSL with an open source certification authority.md @@ -0,0 +1,300 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Eliminate spam using SSL with an open source certification authority) +[#]: via: (https://opensource.com/article/20/6/secure-open-source-antispam) +[#]: author: (Victor Lopes https://opensource.com/users/victorlclopes) + +Eliminate spam using SSL with an open source certification authority +====== +Use a Let’s Encrypt certificate with MailCleaner for STARTTLS and SSL. +Here's how. +![Chat via email][1] + +[MailCleaner][2] is a feature-rich, open source antispam solution. Its virtual appliances (VMs) available for distribution come out-of-the-box with self-signed certificates for both the web interface and the MTA services. + +This requires you to supply your own valid, publicly trusted certificate. Using a Let's Encrypt certificate is a great way to accomplish that because it's free, safe, and automated. + +When requesting a Let's Encrypt certificate, the most important step is the hostname validation. If you don't know about it, consult the [documentation][3]. + +### Firewall requirements + +First of all, you need to define which hostnames you will use, including your MX records, and they must point to the IP address you're using to publish your MailCleaner server. + +If you choose to perform the validation using local port 80 on your MailCleaner box, you will have to include a few commands to temporarily stop the Apache service during the certificate request. That's why I recommend using an alternative port, which, in our examples, will be port TCP 8090. + +You have a few options in this scenario: + +**Option 1**: Create rules in your reverse proxy to forward Let's Encrypt validation requests to your MailCleaner server. You have to redirect every request sent to port TCP 80, whose destination hostname is your MailCleaner external FQDN, and the path starts with `/.well-known/acme-challenge/` to port TCP 8090 on your MailCleaner server. + +**Option 2**: Using a NAT rule, for example, redirect the traffic sent to port TCP 80 to port TCP 8090 on your MailCleaner server. + +**Option 3**: Redirect/allow traffic sent to port TCP 80 to the actual port TCP 80 on your MailCleaner server, which is less secure, less flexible, and not recommended. + +Alternatively, you could have the certificate request and the name validation performed somewhere else (like in your firewall) and create a routine for copying the cert files to your MailCleaner box. If you have a [pfSense][4] firewall with the [ACME][5] package, for example, you can try to merge the concepts within this article with this [how-to][6]. + +### Installing Certbot + +[Certbot][7] is an open source tool for requesting and managing Let's Encrypt certificates. + +To install Certbot on your MailCleaner server, log in as `root` (in the console or through SSH) and run: + + +``` +$ wget +$ mv certbot-auto /usr/local/bin/certbot-auto +$ chown root /usr/local/bin/certbot-auto +$ chmod 0755 /usr/local/bin/certbot-auto +``` + +### Testing certificate name validation + +If you're using an alternate port, you need to open it in the local firewall on your MailCleaner server: + + +``` +`iptables -A INPUT -p tcp -m tcp --dport 8090 -j ACCEPT` +``` + +Note: MailCleaner keeps local firewall rules in its database and sets the `iptables` config every time the server loads. It's imperative that you add port 8090 to the firewall table inside MailCleaner's MySQL database; otherwise, every renewal process will fail. To learn how to do this, take a look at the section titled "Accessing MailCleaner's MySQL database" in the article _[How to install MailCleaner 2020.01][8]._ + +Now, let's try to issue our certificate using Let's Encrypt's staging (testing) server. Please replace the appropriate values with your email address and your MailCleaner server hostname(s). + +**Option 1**: If you are using the alternative port 8090, use this command line: + + +``` +$ certbot-auto certonly --standalone --preferred-challenges http \ +\--http-01-port 8090 --email [myemail@domain.com][9] \--no-eff-email \ +\--agree-tos --staging -d myhostname.mydomain.com +``` + +If you have more than one name, just add them with "`-d`" at the end: + + +``` +-d mx1.mydomain.com \ +-d mx2.mydomain.com \ +-d spam.mydomain.com +``` + +**Option 2**: If you are using local port 80, use this command line: + + +``` +$ certbot-auto certonly --standalone --preferred-challenges http \ + --email [myemail@domain.com][9] \--no-eff-email --agree-tos --staging \ +-d myhostname.mydomain.com \ +\--pre-hook "/usr/mailcleaner/etc/init.d/apache stop" \ +\--post-hook "/usr/mailcleaner/etc/init.d/apache start" +``` + +Note: After issuing this command, you will hit a bootstrapping routine identifying missing dependencies, mostly Python packages. Let it install the necessary software. + +If everything went fine, you should see a result like this: + + +``` +root#mailcleaner:~# +root@mailcleaner:~# certbot-auto certonly \ +\--standalone --preferred-challenges http \ +\--http-01-port 8090 --email [victor@domain.com][10] \ +\--no-eff-email --agree-tos --staging \ +-d mail.example.com + +Saving debug log to /var/log/letsencrypt/ +Plugins selected: Authenticator standalone +Obtaining a new certificate +Performing the following challenges: +http-01 challenge for mail.example.com +Waiting for verification... +Cleaning up challenges + +IMPORTANT NOTES: +Your certificate and chain have been saved at: +/etc/letsencrypt/live/mail.example.com/fullchain.pem +Your key file has been saved at: +/etc/letsencrypt/ live/mail.example.com/privkey.pem +[...] +root@mailcleaner:~# +``` + +If it didn't go well, keep in mind that most errors with this process are caused by Let's Encrypt servers not being able to reach your server. Check if your firewall configuration is really OK. + +### Request your certificate + +When the certificate issuing process is working correctly with the staging server, go ahead and request your certificate for production (removing the staging parameter): + + +``` +`certbot-auto certonly --standalone --preferred-challenges http --http-01-port 8090 --email myemail@domain.com --no-eff-email --agree-tos --force-renewal -d myhostname.mydomain.com` +``` + +Note: Adapt the command line if you're not using the alternative port 8090. If that's the case, don't forget the pre-hook and post-hook. + +The result screen is pretty similar. You will now have a valid certificate at the following path: + + +``` +`/etc/letsencrypt/live/my__hostname_.yourdomain.com_/`[/code] [code] + +root#mailcleaner:~# ls /etc/letsencrypt/live/mail.example.com +cert.pem chain.pem fullchain.pem privkey.pem README +root@mailcleaner:~# +``` + +### Automate certificate assignment and renewal + +The last piece of this puzzle is the great script provided by "GRahamJB" in this [MailCleaner forum topic][11]. You can download the script from [here][12]. + +Let's save this script in our server. Create the following file: + + +``` +`$ nano /usr/local/bin/set-certificates.pl` +``` + +Then paste the contents of the script and save it (`Ctrl + X`). And give the script permission to run: + + +``` +`$ chmod +x /usr/local/bin/set-certificates.pl` +``` + +Now run the script to assign your certificate to the web interface and the MTA services: + + +``` +root@mailcleaner:~# set-certificates.pl --set_web \ +\--set_mta_in --set_mta_out \ +\--key /etc/letsencrypt/live/mail.example.com/privkey.pem \ +\--data /etc/letsencrypt/live/mail.example.com/cert.pem \ +\--chain /etc/letsencrypt/live/mail.example.com/chain.pem + +Stopping Apache: stopped. +Starting Apache: started. +Stopping Exim stage 1: stopped. +Starting Exim stage 1: started. +Stopping Exim stage 4: stopped. +Starting Exim stage 4: started. +root@mailcleaner:~# +``` + +Now that we know it works, schedule these commands to run weekly, using cron and Certbot's built-in renewal routine: + + +``` +`$ nano /etc/letsencrypt/renewal/yourhostname.yourdomain.com.conf` +``` + +Check if the options look correct and add the following line at the end (the same set-certificates.pl you just ran, preceded by `renew_hook =`): + + +``` +. +. +# Options used in the renewal process +[renewalparams] +authenticator = standalone +account = 9d670ed7c63c6238f90f042f852fc33e +pref_challs = http-01, +http01_port = 8090 +server = +# Set MailCleaner certs +renew_hook = set-certificates.pl --set_web --set_mta_in --set_mta_out --key /etc/letsencrypt/live/myhostname.mydomain.com/privkey.pem --data /etc/letsencrypt/live/myhostname.mydomain.com/cert.pem --chain /etc/letsencrypt/live/myhostname.mydomain.com/chain.pem +``` + +Note that the "`renew_hook = set-cert…`" command must be one single line. Save the file and run the following command to test it: + + +``` +`$ certbot-auto renew --force-renewal` +``` + +If the renewal succeeds, you'll see a result similar to the one below. Note how our `renew_hook` command was called. The certificate has been updated in MailCleaner and the necessary services restarted. + + +``` +root@mailcleaner:~# certbot-auto renew --force-reneval +Saving debug log to /var/log/letsencrypt/letsencrypt.log + +Processing /etc/ letsencrypt/renewal/mail.example.com.conf +Plugins selected: Authenticator standalone, Installer None +Renewing an existing certificate +Running deploy-hook command: set-certificates.pl \ +\--set_web --set_mta_in --set_mta_out \ +\--key /etc/letsencrypt/live/mail.example.com/privkey.pem \ +\--data /etc/letsencrypt/live/mail.example.com/cert.pem \ +\--chain /etc/letsencrypt/live/mail.example.com/chain.pem +Output from deploy-hook conmtwand set-certificates.pl: + +Stopping Apache: stopped. +Starting Apache: started. +Stopping Exim stage 1: stopped. +Starting Exim stage 1: started. +Stopping Exim stage 4: stopped. +Starting Exim stage 4: started. + +new certificate deployed without reload, fullchain is +/etc/letsencrypt/live/mail.example.com/fullchain.pem + +Congratulations, all renewals succeeded. +The following certs have been renewed: +/etc/letsencrypt/live/mail.example.com/fullchain.pem (success) +root@mailcleaner:~# +``` + +Now, let's add that renew command to cron: + + +``` +`$ crontab -e` +``` + +Add the following line and save the file. This will make Certbot run every Sunday at 2:00am: + + +``` +`0 2 * * 7 /usr/local/bin/certbot-auto renew` +``` + +If crontab doesn't open the way you expect, run `select-editor` to choose the editor you like (nano, for example). If you want to check the result, run `crontab -l`. + +By default, Certbot will only renew the certificate if it has less than 30 days left before its expiry date. If the cert is not due to expire, Certbot will not renew it (nor call hooks, of course). + +### Testing results + +If you access MailCleaner's web interface, you'll see that the SSL certificate is valid. And if you run the following command in your server, you can see that the certificate being presented on STARTTLS is the new Let's Encrypt cert you just set: + + +``` +`$ openssl s_client -connect localhost:25 -starttls smtp` +``` + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/secure-open-source-antispam + +作者:[Victor Lopes][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/victorlclopes +[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://www.mailcleaner.org/ +[3]: https://letsencrypt.org/docs/challenge-types +[4]: https://www.pfsense.org/ +[5]: https://docs.netgate.com/pfsense/en/latest/certificates/acme-package.html +[6]: https://medium.com/@victorlclopes/copy-pfsense-acme-certificate-to-another-server-e42c611c47ec +[7]: https://certbot.eff.org/ +[8]: https://medium.com/@victorlclopes/how-to-install-mailcleaner-2020-01-8319c83e11ee +[9]: mailto:myemail@domain.com +[10]: mailto:victor@domain.com +[11]: https://forum.mailcleaner.org/viewtopic.php?f=5&t=3035#p12532 +[12]: https://gist.github.com/victorlclopes/f5aa081f1a9c76466aaf3f3dc5bd60b7 diff --git a/sources/tech/20200609 humanID Project- Restoring Civil Discussion Through Better Online Identity.md b/sources/tech/20200609 humanID Project- Restoring Civil Discussion Through Better Online Identity.md new file mode 100644 index 0000000000..f9eeba832f --- /dev/null +++ b/sources/tech/20200609 humanID Project- Restoring Civil Discussion Through Better Online Identity.md @@ -0,0 +1,85 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (humanID Project: Restoring Civil Discussion Through Better Online Identity) +[#]: via: (https://www.linux.com/audience/developers/humanid-project-restoring-civil-discussion-through-better-online-identity/) +[#]: author: (Swapnil Bhartiya https://www.linux.com/author/swapnil/) + +humanID Project: Restoring Civil Discussion Through Better Online Identity +====== + +[![][1]][2] + +[![][1]][2] + +Every day, billions of people use social sign-ons, such as “Login with Facebook”, to access applications over the Internet. A major drawback of this system is the inability to distinguish a real human user from a bot. + +Nonprofit organization [humanID][3], a recipient of [Harvard University’s Social Impact Fund][4], came up with an innovative idea: develop a one-click anonymous sign-on that serves as an alternative to social sign-on. + +“With humanID, everyone can use services without giving up privacy or having their data sold. Bot networks are automatically excluded, while applications can easily block abusive users and trolls, creating more civil digital communities,” says [Bastian Purrer, Co-Founder of humanID][5]. + +humanID was born during Purrer’s stint in Indonesia. He was helping out a political party’s campaign and was aghast to discover how much of the political conversation during the election was controlled by bots and trolls. + +When he realized that political parties routinely deploy bots to promote propaganda and false facts, it became clear that the key to restoring civil discussion, and the vision of an internet for everyone, was better online identity. + +**The mission +** Besides Purrer, humanID’s other co-founders are [Sidiq Permana][6] and [Shuyao Kong][7]. Together, they lead a 20-person organization, with the tech team based in Indonesia while the business team is in Boston. + +“Fixing the Internet is the core mission that unites all three co-founders. Having witnessed how public opinions and sentiments are swayed by fake accounts, we believe that restoring online identity is the first step to restoring authenticity and accountability on the Internet,” says Kong. “We target consumer use cases that are currently serviced by email-and- password, or social sign-ons. This includes the majority of apps on our phones.” + +Purrer says the goal of the project is to have one humanID per person.  “We want people to have control over their own identity from a privacy perspective. We want humanID to be so intuitive and prevalent that it becomes the default identity layer for applications.” + +An identity is a permanent representation within a certain context. On the Internet, just like in real life, our identity differs from community to community. humanID enables this, by giving users a different, unique identity in every community. + +“It is, if the user chooses so, also a different identity than their offline identity. This is where anonymity comes in. Anonymity means that your offline identity, your physical self, cannot be revealed based on your digital identity,” says Kong, who has worked previously in the blockchain and privacy space. + +Permana, who’s leading humanID’s technical development, says, “We achieve this by hashing users’ phone numbers, with a unique, different hash for each user and each application — making cross-referencing between communities impossible. The irreversibility of the hashes ensures secure anonymity. The fact that we do not permanently save any unhashed information makes it impossible, not just for our partner applications but even for ourselves, to reveal a user’s offline identity in the form of his phone number.” + +The humanID team believes a persistent, safe identity will be better than any of the existing online identities that are not safe from surveillance and cannot be held accountable for their online behavior. + +**The underlying tech +** humanID reached out to the Linux Foundation because it saw “tremendous value to be part of the force that’s driving the industry standard.” + +“The Internet is built on layers of open-source, free-to-use protocols. humanID is created in this tradition. The solution hashes users’ phone numbers and email addresses, securing them safely away from hackers and media giants. Each user will have a unique hash for each application he or she signs on so there’s no cross-referencing,” explains Purrer. + +“Our database stores users’ country codes, but relinquishes access to the rest of the information we hash. We are using OAuth at the moment, but actively exploring tech that enhances the security of humanID. Developers can implement the social login within a few hours of work,” he says. + +**The use cases +** One use case they are deploying for their first client [GreenZone][8] is tracking COVID without sacrificing users’ privacy. Permana explains, “GreenZone is a tracking application that doesn’t track users’ location. Instead, it shows ‘green zones’ of low-risk areas where no symptoms are reported, therefore, alleviating anxiety by showing users whether they are in a safe zone or not. All data is entirely peer-to-peer and there is no government, police or regulators involved.” + +According to him, humanID’s first set of customers will be those that are privacy-conscious because their customers demand native privacy when using their product. These businesses include COVID-tracking, health and self-tracking apps, self-help forums, and VPNs. + +“We also target social networks, petition sites, and any site with a forum or comment section. All of these businesses suffer heavily from spam abuse and automated accounts. With humanID, everyone can use services without giving away privacy or having their data sold. Bot networks are automatically excluded, while applications can easily block abusive users and trolls,” he says. + +Purrer clarifies that humanID does not intend to replace government-issued IDs or business-internal identity management. + +“We don’t intend to compete with these existing businesses or standards, but to add a new and fresh idea in the struggle to bring back privacy, safety and accountability on the web,” he says. + +The project has been driven by open source and volunteer work for 1.5 years. “We’re actively seeking support and grants to accelerate our work to bring humanID to market and sign up clients. Beyond this, we aim to cover our cost from our client base and not be dependent on charitable donations beyond 2022,” Purrer adds. + +Check out the demo below, if you have any questions feel free to contact the team on [github][9]. + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/audience/developers/humanid-project-restoring-civil-discussion-through-better-online-identity/ + +作者:[Swapnil Bhartiya][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/swapnil/ +[b]: https://github.com/lujun9972 +[1]: https://www.linux.com/wp-content/uploads/2020/06/icon-1080750_1920-1068x1068.png (icon-1080750_1920) +[2]: https://www.linux.com/wp-content/uploads/2020/06/icon-1080750_1920.png +[3]: https://www.human-id.org/ +[4]: https://innovationlabs.harvard.edu/social-impact-fellowship-fund/#:~:text=What%20is%20the%20social%20impact,five%20years%2C%20beginning%20in%202019. +[5]: https://www.linkedin.com/in/bastianpurrer/ +[6]: https://www.linkedin.com/in/sidiqpermana/ +[7]: https://www.linkedin.com/in/shuyao-kong/ +[8]: https://greenzone.live/beta/ +[9]: https://github.com/bluenumberfoundation diff --git a/sources/tech/20200611 Nextcloud Vs ownCloud- What-s the Difference- Which one Should You Use.md b/sources/tech/20200611 Nextcloud Vs ownCloud- What-s the Difference- Which one Should You Use.md new file mode 100644 index 0000000000..0959aa2411 --- /dev/null +++ b/sources/tech/20200611 Nextcloud Vs ownCloud- What-s the Difference- Which one Should You Use.md @@ -0,0 +1,197 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Nextcloud Vs ownCloud: What’s the Difference? Which one Should You Use?) +[#]: via: (https://itsfoss.com/nextcloud-vs-owncloud/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Nextcloud Vs ownCloud: What’s the Difference? Which one Should You Use? +====== + +[Nextcloud][1] and [ownCloud][2] are two of the most popular names that you will come across when we talk about self-hosted open-source cloud storage services. + +Now, Nextcloud and ownCloud are similar in so many ways that it often confuses people. + +And this is why we at It’s FOSS thought of creating this comparison of Nextcloud and ownCloud. I’ll discuss the difference between ownCloud and Nextcloud. I’ll also share how both services are similar. + +### The history of ownCloud and Nextcloud + +In 2010, [Frank Karlitschek][3] started the ownCloud project by announcing it during a [Camp KDE keynote session][4]. + +![ownCloud interface][5] + +It started off as a personal cloud storage solution to give users the ability to have control of their own data without relying on other cloud storage providers which then translated to the start of ownCloud Inc. + +Unfortunately, Frank Karlitschek, along with several original developers left ownCloud Inc. They didn’t officially state any reason for that – but they hinted about the problem of having a business model that did not compliment an open-source solution. + +Now, ownCloud focuses primarily on Enterprise offerings and offers a separate sever edition (to self-host) for users. + +Frank Karlitschek started Nextcloud as a fork of ownCloud right after leaving ownCloud Inc. + +![Nextcloud interface][6] + +Considering that it’s a fork, you will find many similarities, however, the product has evolved a lot over the years arguably making it more popular than ownCloud. It is striving to become a collaboration platform like Microsoft Office 365 and Google Docs. + +Similar to ownCloud, you will find a self-hosted option and an enterprise-tailored solution. + +### Nextcloud vs ownCloud: Similarities + +![Nextcloud Vs Owncloud][7] + +Let’s talk about the similarities between Nextcloud and ownCloud. + +#### User Interface + +It’s safe to consider that the user interface offered by Nextcloud and ownCloud is very similar to each other. + +Yes, you might find some under-the-hood changes and maybe several subtle differences. But, overall, it looks/feels very much the same. + +#### Collaboration Features + +Unless you consider all the nitty gritty features that they both offer, fundamentally, it’s more or less the same. + +You can manage tasks, upload files, have a calendar, and do a lot of basic collaboration activities in both Nextcloud and ownCloud. + +#### Self-hosting Option + +It’s quite obvious — but just for your information, you can easily deploy either of them (Nextcloud and ownCloud) on your own server without opting for enterprise services. + +Use a cloud service like Linode or [DigitalOcean][8]. They even have one-click installer option to deploy a full-fledged Nextcloud or ownCloud server in minutes. + +#### Cross-platform support + +Both ownCloud and Nextcloud offers support for desktop clients and mobile apps (iOS & Android) to enhance the convenience of collaboration activities. + +So, you should be good to go with either of them if you’re looking for cross-platform support for yourself. + +### Nextcloud vs ownCloud: Key Differences + +Now that you are aware of the similarities, let’s see how Nextcloud and ownCloud are different. + +#### License Differences + +For most of the users, being a truly open-source solution matters a lot. And, that is why it is important to know the license a service comes under. + +ownCloud offers the standard edition (or the community edition) under the [AGPLv3 license][9] but the enterprise edition comes under [ownCloud’s commercial license][10]. + +While Nextcloud’s both enterprise and community editions come under the **APGPLv3 license.** + +So, depending on what you’re looking for, you need to make a choice here. + +#### Exclusive Features + +Sometimes it’s a deal breaker or a selling point to have a set of enterprise-exclusive features on a service. + +So, when I looked around, I found out that ownCloud does offer a set of [exclusive features][11] only for the premium subscribers. + +On the other hand, Nextcloud offers the complete set of features for both community and enterprise editions and the premium subscription only includes support or technical help for enterprise deployments. + +#### Documentation + +![Owncloud Documentation][12] + +Documentation is a very important part of a product/service like ownCloud and Nextcloud where a lot of users manage the instances themselves. + +Of course, depending on your technical expertise and preferences, you might find any of the documentations to be better than the other. + +![Nextcloud Documentation][13] + +However, in our case, [Avimanyu Bandyopadhyay][14] (Research Engineer at It’s FOSS) felt that [ownCloud’s documentation][15] is more useful and easier to follow when compared to [Nextcloud’s documentation][16]. + +_ownCloud has provided a ready-to-deploy configuration file for enterprise use at the bottom of its docker documentation page. But, Nextcloud has kept it separately on GitHub – which might be a little inconvenient_ _to find_. + +So, Nexcloud’s clarity on the documentation part could definitely improve. + +#### Pricing Plans (for enterprise edition) + +No matter how a good a service is — the pricing plans always influences the final decision for enterprises to choose a solution that suits their requirements within a budget. + +If we compare the pricing plans of [Nextcloud][17] and [ownCloud][18], you will notice that ownCloud starts offering enterprise services at **$3,600 for a team of 50 users**. + +In contrast, Nextcloud’s enterprise services **start at €1900 (which is roughly $2050)** for a team of 50 users. + +Of course, it all comes down to your preferences on what exactly are you looking for. + +#### App Marketplace + +![Nextcloud Marketplace][19] + +The availability of apps to extend the functionality of Nextcloud or ownCloud plays an important role to help you choose the best for your use-case.T + +Theoretically, you should find a bunch of useful [apps on Nextcloud][20] and [ownCloud’s marketplace][21]. + +However, you might find a few things missing on ownCloud’s app marketplace like Kanban styled board [Deck][22] and [W2G2][23] (File/Folder locking app). + +![Owncloud Marketplace][24] + +At least, depending on what I look for on a collaboration platform — I couldn’t find anything similar on ownCloud. + +Similarly, I might have missed something that’s available on ownCloud but not on Nextcloud. So, this should be one of your primary factors to consider before deploying ownCloud or Nextcloud for yourself or for your enterprise. + +#### Potential Issues or Bugs + +It’s obvious that both Nextcloud and ownCloud can have their own share of issues. So, if you’re going to self-host either of them, you should check out their GitHub pages to scroll through the active issues. + + * [Nextcloud GitHub][25] + * [ownCloud GitHub][26] + + + +For instance, while writing this article, Nextcloud has an active issue where the [files in a sub-folder of an encrypted folder are not encrypted][27]. Similarly, ownCloud also has a bug with [syncing the files when the user hits the reload button][28]. + +Of course, these are just examples that I took from their list of issues. But, you should keep an eye on some active issues before deploying it yourself that could ultimately help you decide what to choose. + +### So, which one do you choose? Nextcloud or ownCloud? + +Now that you’ve known about what’s different and what’s similar between Nextcloud and ownCloud — it should be slightly easier to choose one. + +However, given the potential of both the services and the number of add-ons they offer, I could have missed a few points here. So, I’d recommend you to go through the documentations for each of them for enterprise-use. For personal usage, you can choose either Nextcloud or ownCloud as per your preferences. + +At It’s FOSS, we [use Nextcloud][29] for storing files, task management and recently for collaborating on documentation. + +What do you think? Nextcloud or ownCloud? Do share your thoughts in the comment section. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/nextcloud-vs-owncloud/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://nextcloud.com/ +[2]: https://owncloud.com/ +[3]: https://en.wikipedia.org/wiki/Frank_Karlitschek +[4]: https://dot.kde.org/2010/01/21/camp-kde-2010-continues-more-talks +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/ownCloud-screenshot.jpg?ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/nextcloud-screenshot.jpg?ssl=1 +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Nextcloud-vs-OwnCloud-itsfoss.jpg?ssl=1 +[8]: https://itsfoss.com/recommends/digital-ocean/ +[9]: https://www.gnu.org/licenses/agpl-3.0.en.html +[10]: https://owncloud.com/licenses/owncloud-commercial/ +[11]: https://owncloud.com/enterprise-edition/ +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/owncloud-documentation.jpg?ssl=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/nextcloud-documentation.jpg?ssl=1 +[14]: https://itsfoss.com/author/avimanyu/ +[15]: https://doc.owncloud.org/server/10.4/ +[16]: https://docs.nextcloud.com/ +[17]: https://nextcloud.com/pricing/ +[18]: https://owncloud.com/pricing/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/nextcloud-marketplace.jpg?ssl=1 +[20]: https://apps.nextcloud.com/ +[21]: https://marketplace.owncloud.com +[22]: https://apps.nextcloud.com/apps/deck +[23]: https://apps.nextcloud.com/apps/w2g2 +[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/owncloud-marketplace.jpg?ssl=1 +[25]: https://github.com/nextcloud +[26]: https://github.com/owncloud +[27]: https://github.com/nextcloud/desktop/issues/774 +[28]: https://github.com/owncloud/core/issues/37170 +[29]: https://itsfoss.com/nextcloud/ diff --git a/sources/tech/20200612 Fedora 32- Simple Local File-Sharing with Samba.md b/sources/tech/20200612 Fedora 32- Simple Local File-Sharing with Samba.md new file mode 100644 index 0000000000..47263e741c --- /dev/null +++ b/sources/tech/20200612 Fedora 32- Simple Local File-Sharing with Samba.md @@ -0,0 +1,488 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Fedora 32: Simple Local File-Sharing with Samba) +[#]: via: (https://fedoramagazine.org/fedora-32-simple-local-file-sharing-with-samba/) +[#]: author: (da2ce7 https://fedoramagazine.org/author/da2ce7/) + +Fedora 32: Simple Local File-Sharing with Samba +====== + +![][1] + +Sharing files with Fedora 32 using Samba is cross-platform, convenient, reliable, and performant. + +### What is ‘Samba’? + +[Samba][2] is a high-quality implementation of [Server Message Block protocol (SMB)][3]. Originally developed by Microsoft for connecting windows computers together via local-area-networks, it is now extensively used for internal network communications. + +Apple used to maintain it’s own independent file sharing called “[Apple Filing Protocol (**AFP**)][4]“, however in [recent times][5], it also has also switched to SMB. + +**In this guide we provide the minimal instructions to enable:** + + * Public Folder Sharing (Both Read Only and Read Write) + * User Home Folder Access + + + +``` +Note about this guide: The convention '~]$' for a local user command prompt, and '~]#' for a super user prompt will be used. +``` + +### Public Sharing Folder + +Having a shared public place where authenticated users on an internal network can access files, or even modify and change files if they are given permission, can be very convenient. This part of the guide walks through the process of setting up a shared folder, ready for sharing with Samba. + +``` +Please Note: This guide assumes the public sharing folder is on a Modern Linux Filesystem; other filesystems such as NTFS or FAT32 will not work. Samba uses POSIX Access Control Lists (ACLs). + +For those who wish to learn more about Access Control Lists, please consider reading the documentation: "Red Hat Enterprise Linux 7: System Administrator's Guide: Chapter 5. Access Control Lists", as it likewise applies to Fedora 32. + +In General, this is only an issue for anyone who wishes to share a drive or filesystem that was created outside of the normal Fedora Installation process. (such as a external hard drive). + +It is possible for Samba to share filesystem paths that do not support POSIX ACLs, however this is out of the scope of this guide. +``` + +#### Create Folder + +For this guide the _**/srv/public/**_ folder for sharing will be used. + +> The _/srv/_ directory contains site-specific data served by a Red Hat Enterprise Linux system. This directory gives users the location of data files for a particular service, such as FTP, WWW, or CVS. Data that only pertains to a specific user should go in the _/home/_ directory. +> +> [Red Hat Enterprise Linux 7, Storage Administration Guide: Chapter 2. File System Structure and Maintenance: 2.1.1.8. The /srv/ Directory][6] + +``` +Make the Folder (will provide an error if the folder already exists). +~]# mkdir --verbose /srv/public + +Verify folder exists: +~]$ ls --directory /srv/public + +Expected Output: +/srv/public +``` + +#### Set Filesystem Security Context + +To have _read and write_ access to the public folder the _public_content_rw_t_ security context will be used for this guide. Those wanting _read only_ may use: _public_content_t_. + +> Label files and directories that have been created with the _public_content_rw_t_ type to share them with read and write permissions through vsftpd. Other services, such as Apache HTTP Server, Samba, and NFS, also have access to files labeled with this type. Remember that booleans for each service must be enabled before they can write to files labeled with this type. +> +> [Red Hat Enterprise Linux 7, SELinux User’s and Administrator’s Guide: Chapter 16. File Transfer Protocol: 16.1. Types: public_content_rw_t][7] + +Add _/srv/public_ as _“public_content_rw_t”_ in the system’s local filesystem security context customization registry: + +``` +Add new security filesystem security context: +~]# semanage fcontext --add --type public_content_rw_t "/srv/public(/.*)?" + +Verifiy new security filesystem security context: +~]# semanage fcontext --locallist --list + +Expected Output: (should include) +/srv/public(/.*)? all files system_u:object_r:public_content_rw_t:s0 +``` + +Now that the folder has been added to the local system’s filesystem security context registry; The **restorecon** command can be used to ‘restore’ the context to the folder: + +``` +Restore security context to the /srv/public folder: +$~]# restorecon -Rv /srv/public + +Verify security context was correctly applied: +~]$ ls --directory --context /srv/public/ + +Expected Output: +unconfined_u:object_r:public_content_rw_t:s0 /srv/public/ +``` + +#### User Permissions + +##### Creating the Sharing Groups + +To allow a user to either have _read only_, or _read and write_ accesses to the public share folder create two new groups that govern these privileges: _public_readonly_ and _public_readwrite_. + +User accounts can be granted access to _read only_, or _read and write_ by adding their account to the respective group (and allow login via Samba creating a smb password). This process is demonstrated in the section: “Test Public Sharing (localhost)”. + +``` +Create the public_readonly and public_readwrite groups: +~]# groupadd public_readonly +~]# groupadd public_readwrite + +Verify successful creation of groups: +~]$ getent group public_readonly public_readwrite + +Expected Output: (Note: x:1...: number will probability differ on your System) +public_readonly:x:1009: +public_readwrite:x:1010: +``` + +##### Set Permissions + +Now set the appropriate user permissions to the public shared folder: + +``` +Set User and Group Permissions for Folder: +~]# chmod --verbose 2700 /srv/public +~]# setfacl -m group:public_readonly:r-x /srv/public +~]# setfacl -m default:group:public_readonly:r-x /srv/public +~]# setfacl -m group:public_readwrite:rwx /srv/public +~]# setfacl -m default:group:public_readwrite:rwx /srv/public + +Verify user permissions have been correctly applied: +~]$ getfacl --absolute-names /srv/public + +Expected Output: +file: /srv/public +owner: root +group: root +flags: -s- +user::rwx +group::--- +group:public_readonly:r-x +group:public_readwrite:rwx +mask::rwx +other::--- +default:user::rwx +default:group::--- +default:group:public_readonly:r-x +default:group:public_readwrite:rwx +default:mask::rwx +default:other::--- +``` + +### Samba + +#### Installation + +``` +~]# dnf install samba +``` + +#### Hostname (systemwide) + +Samba will use the name of the computer when sharing files; it is good to set a hostname so that the computer can be found easily on the local network. + +``` +View Your Current Hostname: +~]$ hostnamectl status +``` + +If you wish to change your hostname to something more descriptive, use the command: + +``` +Modify your system's hostname (example): +~]# hostnamectl set-hostname "simple-samba-server" +``` + +``` +For a more complete overview of the hostnamectl command, please read the previous Fedora Magazine Article: "How to set the hostname on Fedora". +``` + +#### Firewall + +Configuring your firewall is a complex and involved task. This guide will just have the most minimal manipulation of the firewall to enable Samba to pass through. + +``` +For those who are interested in learning more about configuring firewalls; please consider reading the documentation: "Red Hat Enterprise Linux 8: Securing networks: Chapter 5. Using and configuring firewall", as it generally applies to Fedora 32 as well. +``` + +``` +Allow Samba access through the firewall: +~]# firewall-cmd --add-service=samba --permanent +~]# firewall-cmd --reload + +Verify Samba is included in your active firewall: +~]$ firewall-cmd --list-services + +Output (should include): +samba +``` + +#### Configuration + +##### Remove Default Configuration + +The stock configuration that is included with Fedora 32 is not required for this simple guide. In particular it includes support for sharing printers with Samba. + +For this guide make a backup of the default configuration and create a new configuration file from scratch. + +``` +Create a backup copy of the existing Samba Configuration: +~]# cp --verbose --no-clobber /etc/samba/smb.conf /etc/samba/smb.conf.fedora0 + +Empty the configuration file: +~]# > /etc/samba/smb.conf +``` + +##### Samba Configuration + +``` +Please Note: This configuration file does not contain any global definitions; the defaults provided by Samba are good for purposes of this guide. +``` + +``` +Edit the Samba Configuration File with Vim: +~]# vim /etc/samba/smb.conf +``` + +Add the following to _/etc/samba/smb.conf_ file: + +``` +# smb.conf - Samba Configuration File + +# The name of the share is in square brackets [], +# this will be shared as //hostname/sharename + +# There are a three exceptions: +# the [global] section; +# the [homes] section, that is dynamically set to the username; +# the [printers] section, same as [homes], but for printers. + +# path: the physical filesystem path (or device) +# comment: a label on the share, seen on the network. +# read only: disable writing, defaults to true. + +# For a full list of configuration options, +# please read the manual: "man smb.conf". + +[global] + +[public] +path = /srv/public +comment = Public Folder +read only = No +``` + +#### Write Permission + +By default Samba is not granted permission to modify any file of the system. Modify system’s security configuration to allow Samba to modify any filesystem path that has the security context of _public_content_rw_t_. + +For convenience, Fedora has a built-in SELinux Boolean for this purpose called: _smbd_anon_write_, setting this to _true_ will enable Samba to write in any filesystem path that has been set to the security context of _public_content_rw_t_. + +For those who are wishing Samba only have a read-only access to their public sharing folder, they may choose skip this step and not set this boolean. + +``` +There are many more SELinux boolean that are available for Samba. For those who are interested, please read the documentation: "Red Hat Enterprise Linux 7: SELinux User's and Administrator's Guide: 15.3. Samba Booleans", it also apply to Fedora 32 without any adaptation. +``` + +``` +Set SELinux Boolean allowing Samba to write to filesystem paths set with the security context public_content_rw_t: +~]# setsebool -P smbd_anon_write=1 + +Verify bool has been correctly set: +$ getsebool smbd_anon_write + +Expected Output: +smbd_anon_write --> on +``` + +### Samba Services + +The Samba service is divided into two parts that we need to start. + +#### Samba ‘smb’ Service + +The Samba “Server Message Block” (SMB) services is for sharing files and printers over the local network. + +Manual: “[smbd – server to provide SMB/CIFS services to clients][8]“ + +#### Enable and Start Services + +``` +For those who are interested in learning more about configuring, enabling, disabling, and managing services, please consider studying the documentation: "Red Hat Enterprise Linux 7: System Administrator's Guide: 10.2. Managing System Services". +``` + +``` +Enable and start smb and nmb services: +~]# systemctl enable smb.service +~]# systemctl start smb.service + +Verify smb service: +~]# systemctl status smb.service +``` + +#### Test Public Sharing (localhost) + +To demonstrate allowing and removing access to the public shared folder, create a new user called _samba_test_user_, this user will be granted permissions first to read the public folder, and then access to read and write the public folder. + +The same process demonstrated here can be used to grant access to your public shared folder to other users of your computer. + +The _samba_test_user_ will be created as a locked user account, disallowing normal login to the computer. + +``` +Create 'samba_test_user', and lock the account. +~]# useradd samba_test_user +~]# passwd --lock samba_test_user + +Set a Samba Password for this Test User (such as 'test'): +~]# smbpasswd -a samba_test_user +``` + +##### Test Read Only access to the Public Share: + +``` +Add samba_test_user to the public_readonly group: +~]# gpasswd --add samba_test_user public_readonly + +Login to the local Samba Service (public folder): +~]$ smbclient --user=samba_test_user //localhost/public + +First, the ls command should succeed, +Second, the mkdir command should not work, +and finally, exit: +smb: \> ls +smb: \> mkdir error +smb: \> exit + +Remove samba_test_user from the public_readonly group: +gpasswd --delete samba_test_user public_readonly +``` + +##### Test Read and Write access to the Public Share: + +``` +Add samba_test_user to the public_readwrite group: +~]# gpasswd --add samba_test_user public_readwrite + +Login to the local Samba Service (public folder): +~]$ smbclient --user=samba_test_user //localhost/public + +First, the ls command should succeed, +Second, the mkdir command should work, +Third, the rmdir command should work, +and finally, exit: +smb: \> ls +smb: \> mkdir success +smb: \> rmdir success +smb: \> exit + +Remove samba_test_user from the public_readwrite group: +~]# gpasswd --delete samba_test_user public_readwrite +``` + +After testing is completed, for security, disable the **samba_test_user**‘s ability to login in via samba. + +``` +Disable samba_test_user login via samba: +~]# smbpasswd -d samba_test_user +``` + +### Home Folder Sharing + +In this last section of the guide; Samba will be configured to share a user home folder. + +For example: If the user bob has been registered with _smbpasswd_, bob’s home directory _/home/bob_, would become the share _//server-name/bob_. + +This share will only be available for bob, and no other users. + +``` +This is a very convenient way of accessing your own local files; however naturally it carries at a security risk. +``` + +#### Setup Home Folder Sharing + +##### Give Samba Permission for Public Folder Sharing + +``` +Set SELinux Boolean allowing Samba to read and write to home folders: +~]# setsebool -P samba_enable_home_dirs=1 + +Verify bool has been correctly set: +$ getsebool samba_enable_home_dirs + +Expected Output: +samba_enable_home_dirs --> on +``` + +##### Add Home Sharing to the Samba Configuration + +**Append the following to the systems smb.conf file:** + +``` +# The home folder dynamically links to the user home. + +# If 'bob' user uses Samba: +# The homes section is used as the template for a new virtual share: + +# [homes] +# ... (various options) + +# A virtual section for 'bob' is made: +# Share is modified: [homes] -> [bob] +# Path is added: path = /home/bob +# Any option within the [homes] section is appended. + +# [bob] +# path = /home/bob +# ... (copy of various options) + + +# here is our share, +# same as is included in the Fedora default configuration. + +[homes] + comment = Home Directories + valid users = %S, %D%w%S + browseable = No + read only = No + inherit acls = Yes +``` + +##### Reload Samba Configuration + +``` +Tell Samba to reload it's configuration: +~]# smbcontrol all reload-config +``` + +#### Test Home Directory Sharing + +``` +Switch to samba_test_user and create a folder in it's home directory: +~]# su samba_test_user +samba_test_user:~]$ cd ~ +samba_test_user:~]$ mkdir --verbose test_folder +samba_test_user:~]$ exit + +Enable samba_test_user to login via Samba: +~]# smbpasswd -e samba_test_user + +Login to the local Samba Service (samba_test_user home folder): +$ smbclient --user=samba_test_user //localhost/samba_test_user + +Test (all commands should complete without error): +smb: \> ls +smb: \> ls test_folder +smb: \> rmdir test_folder +smb: \> mkdir home_success +smb: \> rmdir home_success +smb: \> exit + +Disable samba_test_user from login in via Samba: +~]# smbpasswd -d samba_test_user +``` + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/fedora-32-simple-local-file-sharing-with-samba/ + +作者:[da2ce7][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/da2ce7/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/06/sambabasics-816x346.png +[2]: https://www.samba.org/samba/ +[3]: https://en.wikipedia.org/wiki/Server_Message_Block +[4]: https://en.wikipedia.org/wiki/Apple_Filing_Protocol +[5]: https://appleinsider.com/articles/13/06/11/apple-shifts-from-afp-file-sharing-to-smb2-in-os-x-109-mavericks +[6]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-filesystem#s3-filesystem-srv +[7]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/chap-managing_confined_services-file_transfer_protocol#sect-Managing_Confined_Services-File_Transfer_Protocol-Types +[8]: https://www.samba.org/samba/docs/current/man-html/smbd.8.html diff --git a/sources/tech/20200612 How to Install Opera Browser on Ubuntu -Easy Way.md b/sources/tech/20200612 How to Install Opera Browser on Ubuntu -Easy Way.md new file mode 100644 index 0000000000..285a3a8e30 --- /dev/null +++ b/sources/tech/20200612 How to Install Opera Browser on Ubuntu -Easy Way.md @@ -0,0 +1,149 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to Install Opera Browser on Ubuntu [Easy Way]) +[#]: via: (https://itsfoss.com/install-opera-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +How to Install Opera Browser on Ubuntu [Easy Way] +====== + +_**Learn how to install Opera browser easily and safely on Ubuntu and Debian based distributions.**_ + +[Opera browser][1] was among the first few browsers to have a speed dial feature for quickly accessing most visited websites from the new tab. + +Opera still offers several interesting features such as a free VPN, ad-blocker, social media messengers in the sidebar, battery saver, grouping tabs in workspaces etc. + +Personally, I do not use Opera. It is not open source. It’s [so-called free-VPN is not that good][2] (it’s hardly even a VPN). After [its acquisition by a Chinese group][3], transparency took another hit. It [collects a vast amount of data][4], same as Alibaba’s UC Browser. + +Anyway, I am not here to make a case against Opera. If you want to install and use Opera on Ubuntu, let me show you how to do that easily and safely. + +Non-FOSS alert! + +Opera browser is not open source. It is covered here because it is available on Linux and the article’s focus is on Linux. + +### Installing Opera browser on Ubuntu + +Installing Opera Browser in Ubuntu and Debian-based distributions is as simple as installing the DEB file from its download page and double-clicking on it. + +Go to [Opera’s download page][5] and click on Download button to download the .DEB installer file. + +![Download Opera Browser][6] + +Once you have downloaded it, double-click on it to [install the application from deb file][7]. In Ubuntu 20.04, you may have to [right click and select “Open With Software” option][8]. + +It will open Opera in Software Center and you can just lick on the install button to install Opera. + +![][9] + +The good thing about this method is that it automatically adds an entry in the repository list. This way, you’ll get all the future updates to the Opera browser with the regular system updates. + +![Opera source added to repository list to provide you regular updates][10] + +This is same as [installing Google Chrome on Ubuntu][11] as an entry is adding for Chrome to provide you regular updates. + +See, how easy it was to install Opera? + +#### How to remove Opera browser + +You can look for the installed applications in the software center and uninstall Opera from there. + +![Remove Opera from the Software Center][12] + +You may also use terminal to remove it in this fashion: + +``` +sudo apt remove opera-stable +``` + +You may also choose to remove the additional Opera repository added in the sources list. + +![Remove Opera Repository][13] + +Installing Opera browser via command line (for intermediate to expert users) + +Installing Opera browser graphically as described above is simplest and easiest method. If you want to take the command line route, you can do that as well. + +First, make sure to [install Curl on Ubuntu][14]: + +``` +sudo apt install curl +``` + +Download and add the Opera repository key: + +``` +curl https://deb.opera.com/archive.key | sudo apt-key add - +``` + +Now add the Opera repository in your sources list directory (not file): + +``` +echo deb https://deb.opera.com/opera-stable/ stable non-free | sudo tee /etc/apt/sources.list.d/opera.list +``` + +Update the package cache so that your system is aware of the packages available by the newly added repository: + +``` +sudo apt update +``` + +Finally, install the opera-stable package to install Opera. + +``` +sudo apt install opera-stable +``` + +During the installation, you’ll be prompted for adding Opera repository to sources list. Select NO because you already did that. + +To remove Opera browser installed this way, you should use the following commands one by one: + +``` +sudo apt remove opera-stable +sudo rm -f /etc/apt/sources.list.d/opera.list +``` + +#### Opera as Snap + +Opera browser is also available as a snap package officially. If you have [Snap support enabled in your Linux distribution][15], you may install Opera via Snap: + +``` +sudo snap install opera +``` + +**Conclusion** + +One of It’s FOSS readers contacted me with a repository issue that was caused by the incorrect Opera browser installation. + +I had to write this straightforward tutorial because some other websites on the internet are suggesting methods with unnecessarily complicated commands that might end up with a corrupt sources.list. I do hope it helps new Linux users. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-opera-ubuntu/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://www.opera.com/hi +[2]: https://www.tomsguide.com/us/opera-vpn,review-4496.html +[3]: https://www.nytimes.com/2016/02/11/business/dealbook/china-opera-kunlun-qihoo-golden-brick.html +[4]: https://restoreprivacy.com/secure-browser/ +[5]: https://www.opera.com/hi/computer/opera +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/opera-browser-download.png?ssl=1 +[7]: https://itsfoss.com/install-deb-files-ubuntu/ +[8]: https://itsfoss.com/cant-install-deb-file-ubuntu/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/install-opera-ubuntu.png?ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/opera-source-added.png?ssl=1 +[11]: https://itsfoss.com/install-chrome-ubuntu/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/remove-opera-browser-ubuntu.png?ssl=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/remove-opera-repository.png?ssl=1 +[14]: https://itsfoss.com/install-curl-ubuntu/ +[15]: https://itsfoss.com/install-snap-linux/ diff --git a/sources/tech/20200613 How to Use Microsoft OneDrive in Linux With Rclone Open-Source Tool -For Intermediate to Expert Users.md b/sources/tech/20200613 How to Use Microsoft OneDrive in Linux With Rclone Open-Source Tool -For Intermediate to Expert Users.md new file mode 100644 index 0000000000..c39f2e2745 --- /dev/null +++ b/sources/tech/20200613 How to Use Microsoft OneDrive in Linux With Rclone Open-Source Tool -For Intermediate to Expert Users.md @@ -0,0 +1,194 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to Use Microsoft OneDrive in Linux With Rclone Open-Source Tool [For Intermediate to Expert Users]) +[#]: via: (https://itsfoss.com/use-onedrive-linux-rclone/) +[#]: author: (Community https://itsfoss.com/author/itsfoss/) + +How to Use Microsoft OneDrive in Linux With Rclone Open-Source Tool [For Intermediate to Expert Users] +====== + +_**Brief: A step-by-step tutorial showing how to use the rclone command line tool to synchronize OneDrive in Linux.**_ + +There are [several cloud storage services available for Linux][1]. There is [Dropbox][2] that gives 2 GB of free space. You can also use [Mega][3] where you can get 15 GB of free storage. + +Microsoft’s own Cloud storage service, OneDrive gives 5 GB of free storage to any Microsoft account holder. The one major problem is that unlike Dropbox and Mega, Microsoft does not provide a desktop client for Linux. + +This means that you’ll have to resort to using web browser for accessing your files in OneDrive which is not very convinient. + +There is a hassle-free, GUI application [Insync][4] that lets you [use OneDrive on Linux easily][5]. But it’s a premium software and not everyone would like that. + +If you are not afraid of the Linux terminal, let me show you a command line tool rclone that you can use for synchronizing Microsoft OneDrive in Linux. + +![][6] + +### What is rclone? + +Rclone is an open source command line tool that enables you to synchronize a local Linux directory with various cloud storage services. + +With rclone, you can backup files to cloud storage, restore files from cloud storage, mirror cloud data, migrate data between cloud services, use multiple cloud storage as disk. + +You can use it with Google Drive, OneDrive, Nextcloud, Amazon S3 and over [40 such cloud services][7]. + +Rclone is an extensive command line tool and using it could be confusing with so many options. This is why I wrote this tutorial to show you how to use rclone with Microsoft OneDrive. + +### Sync Microsoft OneDrive in Linux with rclone + +Using Rclone in Linux is not that complicated but requires some patience and familiarity with the Linux terminal. You need to tweak the configuration a little to make it work. Let’s see how to do that. + +#### Step 1: Install Rclone + +I am [using Ubuntu 20.04][8] in this tutorial but you should be able to follow this tutorial in pretty much any Linux distribution. Just the rclone installation instruction could be different but the rest of steps remains the same. + +In Debian/Ubuntu based distributions use: + +``` +sudo apt install rclone +``` + +For Arch-based distributions, use: + +``` +sudo pacman -S rclone +``` + +For other distributions, please use your distribution’s package manager. + +#### Step 2: Adding new remote + +Once you have installed rclone successfully, you need to configure rclone. Enter the following command in the terminal: + +``` +rclone config +``` + +If it’s your first time using rclone, you have to add a new remote to rclone. Select ‘**n**‘ to add new remote. + +![Configuring Rclone][9] + +Now you have to enter the name of remote. You can enter any name here that matches the cloud service so that it is easy to identify. I am using ‘**onedrive**‘. + +![Configuring Rclone ][10] + +#### Step 3: Select cloud service you want to sync with rclone + +After entering name and hitting enter, you will see a list of cloud services like Google cloud storage, Box, One Drive and others. + +You have to enter the number of the service you want to use. In this case, it’s ‘One Drive’. Make sure you enter the correct number. + +![Selecting Cloud Service][11] + +As you don’t need to enter client ID or secret ID hit **Enter** twice. + +Next enter **‘N’** for selecting **no** for advanced configuration. Of course, if you want to configure something very specific, you can go ahead with **Y**. + +![Configuring OneDrive][12] + +When you’re asked for **‘Use auto config’**, press **Y**. + +#### Step 4: Login to OneDrive account + +When you enter ‘y’ and hit enter, your default browser will open and here you have to log into your Microsoft account. And if it asks for permission click on **‘yes’**. + +![One Drive Logging In][13] + +#### Step 5: Enter account type + +Now you have to select account type. For most of the users it will be the first one, **‘One drive Personal or business’**. I believe it is personal so go with 1. + +![][14] + +After that, you will get a list of ‘Drives’ associated with your account. So, for the most part, you need to select ‘0’ to select your drive and enter ‘**Y**‘ for yes in next step. + +![][15] + +It will ask for one last time if this configuration is okay? Hit **‘Y’** if it is. + +![][16] + +And then enter **‘q’** to exit the Rclone configuration menu. + +![][17] + +#### Step 5: Mounting OneDrive int file manager + +Create folder in your home directory where you will mount OneDrive. I will name the folder “OneDrive”. You can name it whatever you want, but please make sure you change the name to yours in the commands. + +[Create a new folder with mkdir command][18] in your home directory or wherever you want: + +``` +mkdir ~/OneDrive +``` + +Now you have to use the following command: + +``` +rclone --vfs-cache-mode writes mount "one drive": ~/OneDrive +``` + +In above command “one drive” is the name of the “remote”, so you should use the correct name there if yours is different. You can check the name of the “remote” in step 2 of this tutorial. + +![Mounting One Drive][19] + +This command will mount one drive in given location and will continue to run in terminal. When you stop the process with,`ctrl + c` the one drive will be unmounted. + +To mount one drive on startup, follow the next step below. + +#### Step 6: Mount One Drive on startup + +Every Linux distribution gives some way to manage startup application. I am using [Ubuntu’s Startup Application Preferences tool][20] here. + +Open “**Startup Applications**“. And click on “**Add**“. Now, in the command field, enter the following: + +``` +sh -c "rclone --vfs-cache-mode writes mount onedrive: ~/OneDrive" +``` + +![Mounting OneDrive On Startup][21] + +That’s it. Now, you can easily use OneDrive on Linux without any hiccups. + +As you can see, using OneDrive in Linux with rclone takes some effort. If you want an easy way out, get a GUI tool like [Insync][4]. and use OneDrive natively in Linux. + +I hope you find this tutorial helpful. If you have any questions or suggestion, we’ll be happy to help you out. + +### Sumeet + +Computer engineer, FOSS lover, lower level computing enthusiast. Believe in helping others and spreading knowledge. When I get off from computer (it rarely happens) I do painting, reading and watching movies/series. Love the work of Sir Arthur Conan Doyle, J. R. R. Tolkien and J. K. Rowling. BTW, I use Arch. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/use-onedrive-linux-rclone/ + +作者:[Community][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/itsfoss/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/cloud-services-linux/ +[2]: https://www.dropbox.com/ +[3]: https://itsfoss.com/recommends/mega/ +[4]: https://itsfoss.com/recommends/insync/ +[5]: https://itsfoss.com/use-onedrive-on-linux/ +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/sync-onedrive-in-linux-rclone.png?ssl=1 +[7]: https://rclone.org/#providers +[8]: https://itsfoss.com/things-to-do-after-installing-ubuntu-20-04/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/Configuring-Rclone.png?resize=800%2C298&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/Configuring-Rclone-1.png?resize=800%2C303&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Selecting-cloud-service.png?resize=800%2C416&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/Configuring-OneDrive-1.png?resize=800%2C416&ssl=1 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/One-Drive-logging-in.png?resize=800%2C432&ssl=1 +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Configuring-OneDrive-2.png?resize=800%2C430&ssl=1 +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Configuring-OneDrive-3.png?resize=800%2C428&ssl=1 +[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Configuring-One-Drive.png?resize=800%2C426&ssl=1 +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Exiting-Rclone-Configuration.png?resize=800%2C255&ssl=1 +[18]: https://linuxhandbook.com/mkdir-command/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/Mounting-one-drive-1.png?fit=800%2C432&ssl=1 +[20]: https://itsfoss.com/manage-startup-applications-ubuntu/ +[21]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/Mounting-OneDrive-on-startup.png?fit=800%2C499&ssl=1 diff --git a/sources/tech/20200613 Manjaro Linux Review- ‘Arch Linux for Human Beings- Provides Rolling Release for Every User.md b/sources/tech/20200613 Manjaro Linux Review- ‘Arch Linux for Human Beings- Provides Rolling Release for Every User.md new file mode 100644 index 0000000000..c0deeab7e4 --- /dev/null +++ b/sources/tech/20200613 Manjaro Linux Review- ‘Arch Linux for Human Beings- Provides Rolling Release for Every User.md @@ -0,0 +1,219 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Manjaro Linux Review: ‘Arch Linux for Human Beings’ Provides Rolling Release for Every User) +[#]: via: (https://itsfoss.com/manjaro-linux-review/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +Manjaro Linux Review: ‘Arch Linux for Human Beings’ Provides Rolling Release for Every User +====== + +[Manjaro 20.0 Lysia][1] has been released lately. In this article, I’ll take a look at the features of [Manjaro Linux][2] in general, discuss [why people like Manjaro][3] and compare the performance of Cinnamon desktop with Linux Mint 19.3 Cinnamon edition. + +### Manjaro Linux: Why so popular? + +![Image Source][4] + +To every stereotype there is some element of truth. One of the main reasons that Manjaro is so popular has to do with its roots. Manjaro is based on Arch Linux and inherits many elements of [Arch Linux][5] but it is a very distinct project. + +Unlike Arch Linux, almost everything is pre-configured in Manjaro. This makes it one of the most [user-friendly Arch-based distributions][6]. A lot of new users get attracted to this idea and I can’t blame them. + +Will Manjaro then can be the new Ubuntu for a new comer? My answer is Yes! + +[Ubuntu][7] and [Canonical][8] will always have my utmost respect as it has a huge success on making Linux easily accessible to newcomers. + +Just as Ubuntu made “Linux for human beings”, Manjaro made “Arch Linux for human beings”. + +But his doesn’t mean Manjaro is a [Linux distribution for beginners][9] only. Manjaro can be suitable for both and experienced users. + +Let me go over some of the main features of Manjaro. + +#### Easy installation + +[Installing Arch Linux can be a nightmare][10] for many users. On the other hand, [installing Manjaro Linux][11] is easier thanks to the [Calamares][12] graphical installer. + +![Manjaro Linux graphical installer][13] + +If you want to take control in your own hands, you can use [Manjaro Architect][14]. It provides a terminal-based installer. It is still easier than installing directly through commands. + +![][15] + +#### Desktop environments and Window Managers of your choice + +Officially Manjaro Linux supports [Xfce desktop][16] as the default choice. The Xfce in Manjaro looks good thanks to the customization. Manjaro also offers GNOME and KDE Plasma variants. + +If that is not enough, Manjaro community maintains [Awesome][17], [Bspwm][18], [Budgie][19], [Cinnamon][20], [i3][21], LXDE, LXQt, [MATE][22] and [Openbox][23]. + +![Desktop flavors available via Manjaro Architect][24] + +#### X86 architecture is not a limitation for Manjaro + +You are not limited to [X86 architecture][25] with Manjaro as it is ARM architecture friendly. + +Images for [PineBook Pro][26], [Raspberry Pi][27], [Rock Pi][28] 4, Rock Pro 64, [Khadas Vim][29] 1 & 3 and [other single board computers][30] are available in Xfce and KDE Plasma flavors. + +#### Rolling release but not rolling blindly + +Manjaro is a stable bleeding edge rolling release and is claimed to be more tested than Arch Linux because it performs some [additional testing][31] before releasing the updates. + +![][32] + +#### **New** **hardware? One click and it’s done.** + +Manjaro comes with a [hardware detection tool][33] known as MHWD. If you need drivers for your hardware, just open it, click on “Auto Install” and wait until it’s finished. That’s it. + +![Manjaro hardware configuration GUI tool][34] + +#### **Ease to switch Linux kernels.** + +Power-users and people who need special features of the [Linux Kernel][35] that don’t come with the default one, can just switch to a different Kernel with one click. + + * **RT-Kernel** (Real Time) is suitable for a multimedia user and for applications real time features. + * **LTS kernel** is the way to go if stability your priority. + * **Latest kernel** has the latest features and supports the latest hardware. Did you get a recently introduced to the market graphics card? The newest kernel is for you. + + + +![Manjaro kernel GUI switch][36] + +Manjaro supports multiple installed Kernels at the same time. Just re-boot your system and make your selection in the boot menu. + +#### Access to the massive Arch User Repository (AUR) + +What doesn’t work so well with Ubuntu-based distributions is managing [Personal Package Archives (PPAs)][37]. A PPA is a repository for a single or several applications, usually from an independent developer. + +Managing PPAs can become troublesome. They should be purged as they can become abandoned and orphaned without notice. You need to reinstate them if you reinstall Ubuntu. + +If you use Manjaro, you also have access to the [Arch User Repository][38] (AUR). The [AUR is probably the largest repository][39] catering for any distribution. It’s certainly stocked with the freshest produce. + +#### Snap and Flatpack support in the Pamac software manager + +![Snap applications in Pamac][40] + +Pamac 9.4 series has enabled Snap and Flatpak support by default. You can now install snaps or flatpaks with Pamac in GUI or terminal and access an even [larger selection of the Linux applications][41]. + +#### Global set of mirrors + +No-matter your location Manjaro has a [great number of servers][42] which is known as mirrors and you can choose the closest available. + +Top tip! + +If you are a frequent traveler all you have to do is to open the terminal and run the following command: + +sudo pacman-mirrors –geoip && sudo pacman -Syyu + +This simple command will ping a list of mirrors for your country only, rating each one and reordering the list so the faster mirrors are at the top. Don’t forget to run the command once you get back home! + +#### ZFS filesystem support + +As mentioned previously, command line interface installer is called Manjaro Architect and if you are an experienced user there is a [guide to follow][14]. You can use [ZFS filesystem][43] as root in Manjaro 20.0 Lysia Architect. + +### Performance comparison of Manjaro 19 Cinnamon with Linux Mint 19.3 Cinnamon + +I am not an expert on performance comparison and other low-level stuff. So, please forgive me if you dislike this comparison. + +Manjaro feels snappier than Ubuntu and its derivatives. So, what can explain the speed benefits? +A possible explanation could be the RAM and active tasks usage on idle. + +Here are the stats for idle Manjaro Cinnamon. The idle memory usage is 577 MB. + +![htop running on Manjaro 19.0.2 – Cinnamon 4.4.8][44] + +Here are the stats for an idle Linux Mint Cinnamon. The idle memory usage is 656 MB. + +![htop running on Linux Mint 19.3 – Cinnamon 4.4.8][45] + +By running the below command you can [check the running services in Linux][46]: + +``` +systemctl list-unit-files --state=enabled --no-pager +``` + +The results on Manjaro: + +![Manjaro running services][47] + +The results on Linux Mint: + +![Linux Mint running services][48] + +Each of these services consume system resources, and more specifically system memory and kernel time. + +#### Conclusion + +Manjaro takes most of the risk out of the rolling model by delaying the release of new applications and features for several weeks. The rolling distribution, out-of-the-box Arch experience will win you over. + + * No-hassle experience + * Kernel management + * Superior packaging system + * Excellent hardware detection + * Fast & responsive + + + +Let me know your thoughts on Manjaro on the comments below and don’t forget to [subscribe to our weekly Linux newsletter][49]. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/manjaro-linux-review/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/manjaro-20-release/ +[2]: https://manjaro.org/ +[3]: https://itsfoss.com/why-use-manjaro-linux/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/manjaro_wallpaper.jpg?ssl=1 +[5]: https://www.archlinux.org/ +[6]: https://itsfoss.com/arch-based-linux-distros/ +[7]: https://ubuntu.com/ +[8]: https://canonical.com/ +[9]: https://itsfoss.com/best-linux-beginners/ +[10]: https://itsfoss.com/install-arch-linux/ +[11]: https://itsfoss.com/install-manjaro-linux/ +[12]: https://calamares.io/ +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/manjaro_install_installer_partition-1.png?resize=800%2C499&ssl=1 +[14]: https://itsfoss.com/manjaro-architect-review/ +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2017/06/manjaro-architect-main.png?ssl=1 +[16]: https://www.xfce.org/ +[17]: https://awesomewm.org/ +[18]: https://github.com/baskerville/bspwm +[19]: https://github.com/solus-project/budgie-desktop +[20]: https://github.com/linuxmint/Cinnamon +[21]: https://i3wm.org/ +[22]: https://mate-desktop.org/ +[23]: http://openbox.org/wiki/Main_Page +[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/06/manjaro-architect-de.png?ssl=1 +[25]: https://www.computerhope.com/jargon/x/x86.htm +[26]: https://itsfoss.com/pinebook-pro/ +[27]: https://itsfoss.com/raspberrypi/ +[28]: https://rockpi.org/ +[29]: https://itsfoss.com/vim3l/ +[30]: https://itsfoss.com/raspberry-pi-alternatives/ +[31]: https://manjaro.org/features/fresh-and-stable/ +[32]: https://i1.wp.com/manjaro.org/img/features/repositories.png?ssl=1 +[33]: https://wiki.manjaro.org/index.php?title=Manjaro_Hardware_Detection +[34]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/hardware-detection.png?ssl=1 +[35]: https://itsfoss.com/find-which-kernel-version-is-running-in-ubuntu/ +[36]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/Manjaro-kernel-switch.png?ssl=1 +[37]: https://itsfoss.com/ppa-guide/ +[38]: https://aur.archlinux.org/ +[39]: https://itsfoss.com/aur-arch-linux/ +[40]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/snap-app-pacman.jpg?resize=800%2C489&ssl=1 +[41]: https://itsfoss.com/essential-linux-applications/ +[42]: https://wiki.manjaro.org/Pacman-mirrors#Purpose +[43]: https://itsfoss.com/what-is-zfs/ +[44]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/htop_manjaro_cinnamon.jpg?ssl=1 +[45]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/htop_mint.png?ssl=1 +[46]: https://itsfoss.com/start-stop-restart-services-linux/ +[47]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/Manjaro-cropped.png?ssl=1 +[48]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/Mint-cropped.png?ssl=1 +[49]: https://itsfoss.com/subscribe-to-newsletter/ diff --git a/sources/tech/20200615 My Linux Story- remixing distributions at 17 years old.md b/sources/tech/20200615 My Linux Story- remixing distributions at 17 years old.md new file mode 100644 index 0000000000..1ea0af33af --- /dev/null +++ b/sources/tech/20200615 My Linux Story- remixing distributions at 17 years old.md @@ -0,0 +1,65 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (My Linux Story: remixing distributions at 17 years old) +[#]: via: (https://opensource.com/article/20/6/linux-remix) +[#]: author: (Kai Lyons https://opensource.com/users/kailikeslinux) + +My Linux Story: remixing distributions at 17 years old +====== +Open source and Linux create an environment ripe for hands-on learning +and experimentation, and it's never too early to start. +![Person programming on a laptop on a building][1] + +The [Lumina desktop][2] was originally developed by iXSystems for TrueOS, which later became Project Trident. It's well-known as the BSD desktop environment but has been ported to Linux. It introduces desktop elements like a panel, system tray, and so on, to the Fluxbox window manager, and is highly portable. It's a good desktop, and while it's generally easy to install, there aren't many distributions offering it by default. + +I'm the sole contributor and maintainer to the Ubuntu Lumina remix. My work on the Ubuntu Lumina project has been a lengthy process, and much of it has been learning along the way. As of this writing, I'm 17 years old, but I've been a technology enthusiast since age six when a friend of mine helped me write my first ever "Hello, world" script. + +### My introduction to Linux + +Although I am a distribution developer, I haven't been on Linux all that long. I didn't start using Linux until 2018 when I first got into Fedora 29. My original reason for installing Linux was to build an operating system, and Linux taught me an important lesson—in open source, you can build upon the successful work of others. You can learn the components of the existing scaffolding, which grants you a substantial headstart in reaching your ultimate goal. + +My original plan was to write a custom kernel. Once I learned what a monumental task it was, I decided to redirect that enthusiasm to working with the Linux kernel for a while, since I ultimately wanted to make an operating system. + +I got started on Fedora using the Gnome desktop. I still couldn't tell you for sure how I got it to fit on a 1GB flash drive, but that's why Fedora 29 was my pick—I fell in love with Gnome 3 immediately, and [Gnome Boxes][3] was the first virtual machine I ever used. I've found many other desktops to love, too—Pantheon, Cinnamon, LXQt, and others. After testing FreeBSD for the first time only a short three months after finding Linux, I found Lumina. + +### My first operating system attempts + +My initial attempts to design my own distribution with Lumina as the default environment were mostly exercises in experimenting with tools. The tool I used most at first was [Linux-Live][4]. I never thought of working on an operating system from anything but the live-system. It actually wouldn't be until Ubuntu Lumina that I would even try to do it with an installed system. + +My first distribution had no name, and it was a [Linux From Scratch][5] (LFS) system. It taught me a lot, but in the end, it wasn't what I really wanted; it didn't even have a proper installer. + +My second through seventh tries were random assortments of mashing software together, and only one of them ever got "shipped." I don't remember the name of it, or even whether it worked, but it was something that I had made myself, and it showed me what was possible. While the end results weren't what I ultimately wanted, I still loved the process of making them. + +I spent time reading LFS, remixing Gentoo and Arch, made a couple of weird Debian tries, and finally decided to create an Ubuntu Cinnamon remix. I soon found out that Joshua Peisach had already made one. I didn't get far on my own remix; it never booted, so I abandoned the idea. With Joshua's encouragement, there were a few intermediate attempts at remixes (a failed attempt at Pantheon, and then i3) before I settled on concentrating on Lumina. + +### Lumina desktop on Linux + +My Lumina-based distribution is still in development, meaning it's usable but has several significant omissions. The goal of the project is to provide a comfortable and lightweight OS. The Lumina desktop environment doesn't have many tools compared to a full desktop environment, including those considered to be minimal, like LXQt. And while Lumina is a little clunky, it's about as lightweight as XFCE. + +While it's true that I'm the only contributor to the project, I have gotten a lot of help along the way. Advice from Martin Wimpress, Joshua Peisach, Rik Mills, Thomas Castleman, and many other incredible distribution developers has guided me through many a twist and turn on what could have been a discouraging learning curve. + +### Open source knowledge + +This is what remixing, and indeed, open source itself, is all about—learning and helping one another while making better technology. My work builds upon the work of other distribution maintainers, packagers, a BSD desktop, an ISO-Builder developed for Budgie, and the entire Linux community. There's no question in my mind that I wouldn't have a bootable OS to call my own and to share with others without Linux and open source. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/linux-remix + +作者:[Kai Lyons][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/kailikeslinux +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_code_programming_laptop.jpg?itok=ormv35tV (Person programming on a laptop on a building) +[2]: https://opensource.com/article/19/12/linux-lumina-desktop +[3]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization +[4]: https://www.linuxliveusb.com/ +[5]: http://www.linuxfromscratch.org/ diff --git a/sources/tech/20200616 Hard lessons learned about Kubernetes garbage collection.md b/sources/tech/20200616 Hard lessons learned about Kubernetes garbage collection.md new file mode 100644 index 0000000000..dacb4d3798 --- /dev/null +++ b/sources/tech/20200616 Hard lessons learned about Kubernetes garbage collection.md @@ -0,0 +1,88 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Hard lessons learned about Kubernetes garbage collection) +[#]: via: (https://opensource.com/article/20/6/kubernetes-garbage-collection) +[#]: author: (Oleg Matskiv https://opensource.com/users/oleg-matskiv) + +Hard lessons learned about Kubernetes garbage collection +====== +Why I'll never skim Kubernetes documentation again. +![Ship captain sailing the Kubernetes seas][1] + +Some time ago, I learned an important Kubernetes lesson the hard way. The story begins with [Kubernetes Operators][2], which is a method of packaging, deploying, and managing a Kubernetes application. The thing I tripped up on was [garbage collection][3] in the cluster, which cleans up objects that no longer have an owner object (but more on that later). + +### The task + +Last year, the team I work on was assigned to develop a Kubernetes Operator. For most people on the team, this was their first experience with the [Operator SDK][4] (software development kit) and [Kubernetes controllers][5], which are the control loops that power Kubernetes. We all read some basic introductory information about Operator SDK and followed the [quickstart guide][6] for building an Operator in the Go programming language. We learned some basic principles and a few handy tricks, and we were eager to apply them. + +Our task was to develop an Operator that would install, configure, and ensure production readiness for a number of projects. The goal was to have automation for managing a fleet of instances with minimal manual work for our [site reliability engineering (SRE)][7] team. Not an easy task, but we liked the challenge and the technologies we could use, so we were moving fast and breaking some things along the way. + +### The bug + +Initially, we were chasing a proof of concept implementation, so we logged bugs with a plan to fix them later. + +![Decision-making matrix][8] + +([Davidjcmorris][9], [CC-BY-SA-4.0][10]) + +The bug I will describe fits perfectly into Quadrant II of this [Eisenhower Matrix][11] (as Stephen Covey espoused)—not urgent, but important. Very important actually—all the namespaces that our Operator created would sometimes terminate without any request from a user. It didn't happen very often, so we decided to fix it later. + +Eventually, I picked up this bug from our backlog and started looking for a root cause. The Operator definitely couldn't terminate the namespace, as we didn't have any Delete API calls written in the code at that point, which, in hindsight, was the first clue. I started my detective work by dialing up the logging on the [Kubernetes API server][12] and making sure the logs were being safely saved. Then I waited for the issue to happen again. + +Once the issue occurred in an environment I set up, I searched the logs for this combination of strings: `"requestURI":"/api/v1/namespaces/my-namespace"` \+ `"verb":"delete"`_._ + +From my search results, I found what was executing the namespace deletion: `"user":{"username":"system:serviceaccount:kube-system:generic-garbage-collector"`. + +Now I knew _how_ the namespaces were removed, but I didn't know _why_. I opened the Kubernetes [garbage collection documentation][3], but since I am not a patient man, I just skimmed through the basic information about the `ownerReference` field and continued thinking about why this was happening. + +We were using the `ownerReference` metadata field on the namespaces that we created. The owner was our own resource defined by the [custom resource API][13]. And when our custom resource was deleted, the associated namespaces that it owned through the `ownerReference` were deleted as well. This deletion of associated objects made the uninstallation step a breeze. + +I didn't see any problem with this, so I continued reading the logs for more clues. I noticed that the namespace would be removed when the `kube-controller-manager` pod restarted. The reason for the restart made sense to me: the `kube-controller-manager` pod runs on the master node, we only had one master node in our development cluster, and the load on that node was very high for the instance size we used. + +So I tried to reproduce the issue myself. I deleted the `kube-controller-manager` pod, a new one spun up, and I checked its logs. Once I saw some logs about garbage collection, I finally put two and two together and went back to the garbage collection docs. And there it was: + +> "**Note:** Cross-namespace owner references are disallowed by design. This means: 1) Namespace-scoped dependents can only specify owners in the same namespace, and owners that are cluster-scoped. 2) Cluster-scoped dependents can only specify cluster-scoped owners, but not namespace-scoped owners." + +Our custom resource was namespace-scoped, but the namespaces are cluster-scoped. And the Kubernetes API server creates namespaces even if the owner reference we use is disallowed by design. So the namespaces were created with the owner references, and then they had to be deleted since garbage collection follows the documented rules.  + +### The lessons learned + +The technical lesson I learned is simple: Don't use owner references in which a namespace-scoped resource owns a cluster-scoped resource or a resource in a different namespace. When you use these "disallowed by design" owner references, your Kubernetes resources will be deleted by the garbage-collection routine whenever the `kube-controller-manager pod` starts up. + +But the more important lesson I learned is _not to underestimate the documentation_. If I was more patient when I read the documentation the first time, I would have definitely saved myself some time. + +You might also think that we could have avoided this if we followed my advice back when the invalid owner reference was added to the codebase. But it turns out it was not documented yet. A [pull request][14] in February 2019 added this important note, long after Kubernetes was a well-established technology. + +I think this highlights the fact that there is always room for improvement in documentation. Let's do it together, starting with reading the guide to [contributing to Kubernetes docs][15]. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/kubernetes-garbage-collection + +作者:[Oleg Matskiv][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/oleg-matskiv +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek (Ship captain sailing the Kubernetes seas) +[2]: https://kubernetes.io/docs/concepts/extend-kubernetes/operator/ +[3]: https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/ +[4]: https://sdk.operatorframework.io/ +[5]: https://kubernetes.io/docs/concepts/architecture/controller/ +[6]: https://sdk.operatorframework.io/docs/golang/quickstart/ +[7]: https://www.redhat.com/en/topics/devops/what-is-sre +[8]: https://opensource.com/sites/default/files/uploads/512px-7_habits_decision-making_matrix.png (Decision-making matrix) +[9]: https://commons.wikimedia.org/wiki/File:7_habits_decision-making_matrix.png +[10]: https://creativecommons.org/licenses/by-sa/4.0/ +[11]: https://en.wikipedia.org/wiki/Time_management#The_Eisenhower_Method +[12]: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/ +[13]: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/ +[14]: https://github.com/kubernetes/website/pull/12543 +[15]: https://kubernetes.io/docs/contribute/ diff --git a/sources/tech/20200617 Internet connection sharing with NetworkManager.md b/sources/tech/20200617 Internet connection sharing with NetworkManager.md new file mode 100644 index 0000000000..cfac08c660 --- /dev/null +++ b/sources/tech/20200617 Internet connection sharing with NetworkManager.md @@ -0,0 +1,163 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Internet connection sharing with NetworkManager) +[#]: via: (https://fedoramagazine.org/internet-connection-sharing-networkmanager/) +[#]: author: (bengal https://fedoramagazine.org/author/bengal/) + +Internet connection sharing with NetworkManager +====== + +![][1] + +NetworkManager is the network configuration daemon used on Fedora and many other distributions. It provides a consistent way to configure network interfaces and other network-related aspects on a Linux machine. Among many other features, it provides a Internet connection sharing functionality that can be very useful in different situations. + +For example, suppose you are in a place without Wi-Fi and want to share your laptop’s mobile data connection with friends. Or maybe you have a laptop with broken Wi-Fi and want to connect it via Ethernet cable to another laptop; in this way the first laptop become able to reach the Internet and maybe download new Wi-Fi drivers. + +In cases like these it is useful to share Internet connectivity with other devices. On smartphones this feature is called “Tethering” and allows sharing a cellular connection via Wi-Fi, Bluetooth or a USB cable. + +This article shows how the connection sharing mode offered by NetworkManager can be set up easily; it addition, it explains how to configure some more advanced features for power users. + +### How connection sharing works + +The basic idea behind connection sharing is that there is an _upstream_ interface with Internet access and a _downstream_ interface that needs connectivity. These interfaces can be of a different type—for example, Wi-Fi and Ethernet. + +If the upstream interface is connected to a LAN, it is possible to configure our computer to act as a _bridge_; a bridge is the software version of an Ethernet switch. In this way, you “extend” the LAN to the downstream network. However this solution doesn’t always play well with all interface types; moreover, it works only if the upstream network uses private addresses. + +A more general approach consists in assigning a private IPv4 subnet to the downstream network and turning on routing between the two interfaces. In this case, NAT (Network Address Translation) is also necessary. The purpose of NAT is to modify the source of packets coming from the downstream network so that they look as if they originate from your computer. + +It would be inconvenient to configure manually all the devices in the downstream network. Therefore, you need a DHCP server to assign addresses automatically and configure hosts to route all traffic through your computer. In addition, in case the sharing happens through Wi-Fi, the wireless network adapter must be configured as an access point. + +There are many tutorials out there explaining how to achieve this, with different degrees of difficulty. NetworkManager hides all this complexity and provides a _shared_ mode that makes this configuration quick and convenient. + +### Configuring connection sharing + +The configuration paradigm of NetworkManager is based on the concept of connection (or connection profile). A connection is a group of settings to apply on a network interface. + +This article shows how to create and modify such connections using _nmcli_, the NetworkManager command line utility, and the GTK connection editor. If you prefer, other tools are available such as _nmtui_ (a text-based user interface), GNOME control center or the KDE network applet. + +A reasonable prerequisite to share Internet access is to have it available in the first place; this implies that there is already a NetworkManager connection active. If you are reading this, you probably already have a working Internet connection. If not, see [this article][2] for a more comprehensive introduction to NetworkManager. + +The rest of this article assumes you already have a Wi-Fi connection profile configured and that connectivity must be shared over an Ethernet interface _enp1s0_. + +To enable sharing, create a connection for interface enp1s0 and set the ipv4.method property to _shared_ instead of the usual _auto_: + +``` +$ nmcli connection add type ethernet ifname enp1s0 ipv4.method shared con-name local +``` + +The shared IPv4 method does multiple things: + + * enables IP forwarding for the interface; + * adds firewall rules and enables masquerading; + * starts dnsmasq as a DHCP and DNS server. + + + +NetworkManager connection profiles, unless configured otherwise, are activated automatically. The new connection you have added should be already active in the device status: + +``` +$ nmcli device +DEVICE TYPE STATE CONNECTION +enp1s0 ethernet connected local +wlp4s0 wifi connected home-wifi +``` + +If that is not the case, activate the profile manually with _nmcli connection up local_. + +### Changing the shared IP range + +Now look at how NetworkManager configured the downstream interface enp1s0: + +``` +$ ip -o addr show enp1s0 +8: enp1s0 inet 10.42.0.1/24 brd 10.42.0.255 ... +``` + +10.42.0.1/24 is the default address set by NetworkManager for a device in shared mode. Addresses in this range are also distributed via DHCP to other computers. If the range conflicts with other private networks in your environment, change it by modifying the _ipv4.addresses_ property: + +``` +$ nmcli connection modify local ipv4.addresses 192.168.42.1/24 +``` + +Remember to activate again the connection profile after any change to apply the new values: + +``` +$ nmcli connection up local + +$ ip -o addr show enp1s0 +8: enp1s0 inet 192.168.42.1/24 brd 192.168.42.255 ... +``` + +If you prefer using a graphical tool to edit connections, install the _nm-connection-editor_ package. Launch the program and open the connection to edit; then select the _Shared to other computers_ method in the _IPv4 Settings_ tab. Finally, if you want to use a specific IP subnet, click _Add_ and insert an address and a netmask. + +![][3] + +### Adding custom dnsmasq options + +In case you want to further extend the dnsmasq configuration, you can add new configuration snippets in _/etc/NetworkManager/dnsmasq-shared.d/_. For example, the following configuration: + +``` +dhcp-option=option:ntp-server,192.168.42.1 +dhcp-host=52:54:00:a4:65:c8,192.168.42.170 +``` + +tells dnsmasq to advertise a NTP server via DHCP. In addition, it assigns a static IP to a client with a certain MAC. + +There are many other useful options in the dnsmasq manual page. However, remember that some of them may conflict with the rest of the configuration; so please use custom options only if you know what you are doing. + +### Other useful tricks + +If you want to set up sharing via Wi-Fi, you could create a connection in Access Point mode, manually configure the security, and then enable connection sharing. Actually, there is a quicker way, the hotspot mode: + +``` +$ nmcli device wifi hotspot [ifname $dev] [password $pw] +``` + +This does everything needed to create a functional access point with connection sharing. The interface and password options are optional; if they are not specified, _nmcli_ chooses the first Wi-Fi device available and generates a random password. Use the ‘_nmcli device wifi show-password_‘ command to display information for the active hotspot; the output includes the password and a text-based QR code that you can scan with a phone: + +![][4] + +### What about IPv6? + +Until now this article discussed sharing IPv4 connectivity. NetworkManager also supports sharing IPv6 connectivity through DHCP prefix delegation. Using prefix delegation, a computer can request additional IPv6 prefixes from the DHCP server. Those public routable addresses are assigned to local networks via Router Advertisements. Again, NetworkManager makes all this easier through the shared IPv6 mode: + +``` +$ nmcli connection modify local ipv6.method shared +``` + +Note that IPv6 sharing requires support from the Internet Service Provider, which should give out prefix delegations through DHCP. If the ISP doesn’t provides delegations, IPv6 sharing will not work; in such case NM will report in the journal that no prefixes are available: + +``` +policy: ipv6-pd: none of 0 prefixes of wlp1s0 can be shared on enp1s0 +``` + +Also, note that the Wi-Fi hotspot command described above only enables IPv4 sharing; if you want to also use IPv6 sharing you must edit the connection manually. + +### Conclusion + +Remember, the next time you need to share your Internet connection, NetworkManager will make it easy for you. + +If you have suggestions on how to improve this feature or any other feedback, please reach out to the NM community using the [mailing list][5], the [issue tracker][6] or joining the _#nm_ IRC channel on _freenode_. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/internet-connection-sharing-networkmanager/ + +作者:[bengal][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/bengal/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/06/networkmanager-connection_sharing-816x345.png +[2]: https://www.redhat.com/sysadmin/becoming-friends-networkmanager +[3]: https://fedoramagazine.org/wp-content/uploads/2020/06/nmce.png +[4]: https://fedoramagazine.org/wp-content/uploads/2020/06/hotspot-password.png +[5]: https://mail.gnome.org/mailman/listinfo/networkmanager-list +[6]: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues diff --git a/sources/tech/20200617 What happens when you update your DNS.md b/sources/tech/20200617 What happens when you update your DNS.md new file mode 100644 index 0000000000..0a17d1d621 --- /dev/null +++ b/sources/tech/20200617 What happens when you update your DNS.md @@ -0,0 +1,236 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What happens when you update your DNS?) +[#]: via: (https://jvns.ca/blog/how-updating-dns-works/) +[#]: author: (Julia Evans https://jvns.ca/) + +What happens when you update your DNS? +====== + +I’ve seen a lot of people get confused about updating their site’s DNS records to change the IP address. Why is it slow? Do you really have to wait 2 days for everything to update? Why do some people see the new IP and some people see the old IP? What’s happening? + +So I wanted to write a quick exploration of what’s happening behind the scenes when you update a DNS record. + +### how DNS works: recursive vs authoritative DNS servers + +First, we need to explain a little bit about DNS. There are 2 kinds of DNS servers: **authoritative** and **recursive**. + +**authoritative** DNS servers (also known as **nameservers**) have a database of IP addresses for each domain they’re responsible for. For example, right now an authoritative DNS server for github.com is ns-421.awsdns-52.com. You can ask it for github.com’s IP like this; + +``` +dig @ns-421.awsdns-52.com github.com +``` + +**recursive** DNS servers, by themselves, don’t know anything about who owns what IP address. They figure out the IP address for a domain by asking the right authoritative DNS servers, and then cache that IP address in case they’re asked again. 8.8.8.8 is a recursive DNS server. + +When people visit your website, they’re probably making their DNS queries to a recursive DNS server. So, how do recursive DNS servers work? Let’s see! + +### how does a recursive DNS server query for github.com? + +Let’s go through an example of what a recursive DNS server (like 8.8.8.8) does when you ask it for an IP address (A record) for github.com. First – if it already has something cached, it’ll give you what it has cached. But what if all of its caches are expired? Here’s what happens: + +**step 1**: it has IP addresses for the root DNS servers hardcoded in its source code. You can see this in [unbound’s source code here][1]. Let’s say it picks `198.41.0.4` to start with. Here’s the [official source][2] for those hardcoded IP addresses, also known as a “root hints file”. + +**step 2**: Ask the root nameservers about `github.com`. + +We can roughly reproduce what happens with `dig`. What this gives us is a new authoritative nameserver to ask: a nameserver for `.com`, with the IP `192.5.6.30`. + +``` +$ dig @198.41.0.4 github.com +... +com. 172800 IN NS a.gtld-servers.net. +... +a.gtld-servers.net. 172800 IN A 192.5.6.30 +... +``` + +The details of the DNS response are a little more complicated than that – in this case, there’s an authority section with some NS records and an additional section with A records so you don’t need to do an extra lookup to get the IP addresses of those nameservers. + +(in practice, 99.99% of the time it’ll already have the address of the `.com` nameservers cached, but we’re pretending we’re really starting from scratch) + +**step 3**: Ask the `.com` nameservers about `github.com`. + +``` +$ dig @192.5.6.30 github.com +... +github.com. 172800 IN NS ns-421.awsdns-52.com. +ns-421.awsdns-52.com. 172800 IN A 205.251.193.165 +... +``` + +We have a new IP address to ask! This one is the nameserver for `github.com`. + +**step 4**: Ask the `github.com` nameservers about `github.com`. + +We’re almost done! + +``` +$ dig @205.251.193.165 github.com + +github.com. 60 IN A 140.82.112.4 +``` + +Hooray!! We have an `A` record for `github.com`! Now the recursive nameserver has `github.com`’s IP address and can return it back to you. And it could do all of this by only hardcoding a few IP addresses: the addresses of the root nameservers. + +### how to see all of a recursive DNS server’s steps: `dig +trace` + +When I want to see what a recursive DNS server would do when resolving a domain, I run + +``` +$ dig @8.8.8.8 +trace github.com +``` + +This shows all the DNS records that it requests, starting at the root DNS servers – all the 4 steps that we just went through. + +### let’s update some DNS records! + +Now that we know the basics of how DNS works, let’s update some DNS records and see what happens. + +When you update your DNS records, there are two main options: + + 1. keep the same nameservers + 2. change nameservers + + + +### let’s talk about TTLs + +We’ve forgotten something important though! TTLs! You know how we said earlier that the recursive DNS server will cache records until they expire? The way it decides whether the record should expire is by looking at its **TTL** or “time to live”. + +In this example, the TTL for the A record github’s nameserver returns for its DNS record is `60`, which means 60 seconds: + +``` +$ dig @205.251.193.165 github.com + +github.com. 60 IN A 140.82.112.4 +``` + +That’s a pretty short TTL, and _in theory_ if everybody’s DNS implementation followed the [DNS standard][3] it means that if Github decided to change the IP address for `github.com`, everyone should get the new IP address within 60 seconds. Let’s see how that plays out in practice + +### option 1: update a DNS record on the same nameservers + +First, I updated my nameservers (Cloudflare) to have a new DNS record: an A record that maps `test.jvns.ca` to `1.2.3.4`. + +``` +$ dig @8.8.8.8 test.jvns.ca +test.jvns.ca. 299 IN A 1.2.3.4 +``` + +This worked immediately! There was no need to wait at all, because there was no `test.jvns.ca` DNS record before that could have been cached. Great. But it looks like the new record is cached for ~5 minutes (299 seconds). + +So, what if we try to change that IP? I changed it to `5.6.7.8`, and then ran the same DNS query. + +``` +$ dig @8.8.8.8 test.jvns.ca +test.jvns.ca. 144 IN A 1.2.3.4 +``` + +Hmm, it seems like that DNS server has the `1.2.3.4` record still cached for another 144 seconds. Interestingly, if I query `8.8.8.8` multiple times I actually get inconsistent results – sometimes it’ll give me the new IP and sometimes the old IP, I guess because 8.8.8.8 actually load balances to a bunch of different backends which each have their own cache. + +After I waited 5 minutes, all of the `8.8.8.8` caches had updated and were always returning the new `5.6.7.8` record. Awesome. That was pretty fast! + +### you can’t always rely on the TTL + +As with most internet protocols, not everything obeys the DNS specification. Some ISP DNS servers will cache records for longer than the TTL specifies, like maybe for 2 days instead of 5 minutes. And people can always hardcode the old IP address in their /etc/hosts. + +What I’d expect to happen in practice when updating a DNS record with a 5 minute TTL is that a large percentage of clients will move over to the new IPs quickly (like within 15 minutes), and then there will be a bunch of stragglers that slowly update over the next few days. + +### option 2: updating your nameservers + +So we’ve seen that when you update an IP address without changing your nameservers, a lot of DNS servers will pick up the new IP pretty quickly. Great. But what happens if you change your nameservers? Let’s try it! + +I didn’t want to update the nameservers for my blog, so instead I went with a different domain I own and use in the examples for the [HTTP zine][4]: `examplecat.com`. + +Previously, my nameservers were set to dns1.p01.nsone.net. I decided to switch them over to Google’s nameservers – `ns-cloud-b1.googledomains.com` etc. + +When I made the change, my domain registrar somewhat ominiously popped up the message – “Changes to examplecat.com saved. They’ll take effect within the next 48 hours”. Then I set up a new A record for the domain, to make it point to `1.2.3.4` + +Okay, let’s see if that did anything + +``` +$ dig @8.8.8.8 examplecat.com +examplecat.com. 17 IN A 104.248.50.87 +``` + +No change. If I ask a different DNS server, it knows the new IP: + +``` +$ dig @1.1.1.1 examplecat.com +examplecat.com. 299 IN A 1.2.3.4 +``` + +but 8.8.8.8 is still clueless. The reason 1.1.1.1 sees the new IP even though I just changed it 5 minutes ago is presumably that nobody had ever queried 1.1.1.1 about examplecat.com before, so it had nothing in its cache. + +### nameserver TTLs are much longer + +The reason that my registrar was saying “THIS WILL TAKE 48 HOURS” is that the TTLs on NS records (which are how recursive nameservers know which nameserver to ask) are MUCH longer! + +The new nameserver is definitely returning the new IP address for `examplecat.com` + +``` +$ dig @ns-cloud-b1.googledomains.com examplecat.com +examplecat.com. 300 IN A 1.2.3.4 +``` + +But remember what happened when we queried for the `github.com` nameservers, way back? + +``` +$ dig @192.5.6.30 github.com +... +github.com. 172800 IN NS ns-421.awsdns-52.com. +ns-421.awsdns-52.com. 172800 IN A 205.251.193.165 +... +``` + +172800 seconds is 48 hours! So nameserver updates will in general take a lot longer to expire from caches and propagate than just updating an IP address without changing your nameserver. + +### how do your nameservers get updated? + +When I update the nameservers for `examplecat.com`, what happens is that he `.com` nameserver gets a new `NS` record with the new domain. Like this: + +``` +dig ns @j.gtld-servers.net examplecat.com + +examplecat.com. 172800 IN NS ns-cloud-b1.googledomains.com +``` + +But how does that new NS record get there? What happens is that I tell my **domain registrar** what I want the new nameservers to be by updating it on the website, and then my domain registrar tells the `.com` nameservers to make the update. + +For `.com`, these updates happen pretty fast (within a few minutes), but I think for some other TLDs the TLD nameservers might not apply updates as quickly. + +### your program’s DNS resolver library might also cache DNS records + +One more reason TTLs might not be respected in practice: many programs need to resolve DNS names, and some programs will also cache DNS records indefinitely in memory (until the program is restarted). + +For example, AWS has an article on [Setting the JVM TTL for DNS Name Lookups][5]. I haven’t written that much JVM code that does DNS lookups myself, but from a little Googling about the JVM and DNS it seems like you can configure the JVM so that it caches every DNS lookup indefinitely. (like [this elasticsearch issue][6]) + +### that’s all! + +I hope this helps you understand what’s going on when updating your DNS! + +As a disclaimer, again – TTLs definitely don’t tell the whole story about DNS propagation – some recursive DNS servers definitely don’t respect TTLs, even if the major ones like 8.8.8.8 do. So even if you’re just updating an A record with a short TTL, it’s very possible that in practice you’ll still get some requests to the old IP for a day or two. + +Also, I changed the nameservers for `examplecat.com` back to their old values after publishing this post. + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/how-updating-dns-works/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://github.com/NLnetLabs/unbound/blob/6e0756e819779d9cc2a14741b501cadffe446c93/iterator/iter_hints.c#L131 +[2]: https://www.iana.org/domains/root/files +[3]: https://tools.ietf.org/html/rfc1035 +[4]: https://wizardzines.com/zines/http/ +[5]: https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-jvm-ttl.html +[6]: https://github.com/elastic/elasticsearch/issues/16412 diff --git a/sources/tech/20200619 A little bit of plain Javascript can do a lot.md b/sources/tech/20200619 A little bit of plain Javascript can do a lot.md new file mode 100644 index 0000000000..ac36191038 --- /dev/null +++ b/sources/tech/20200619 A little bit of plain Javascript can do a lot.md @@ -0,0 +1,115 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A little bit of plain Javascript can do a lot) +[#]: via: (https://jvns.ca/blog/2020/06/19/a-little-bit-of-plain-javascript-can-do-a-lot/) +[#]: author: (Julia Evans https://jvns.ca/) + +A little bit of plain Javascript can do a lot +====== + +I’ve never worked as a professional frontend developer, so even though I’ve been writing HTML/CSS/JS for 15 years for little side projects, all of the projects have been pretty small, sometimes I don’t write any Javascript for years in between, and I often don’t quite feel like I know what I’m doing. + +Partly because of that, I’ve leaned on libraries a lot! Ten years ago I used to use jQuery, and since maybe 2017 I’ve been using a lot of vue.js for my little Javascript projects (you can see a [little whack-a-mole game I made here as an intro to Vue][1]). + +But last week, for the first time in a while, I wrote some plain Javascript without a library and it was fun so I wanted to talk about it a bit! + +### experimenting with just plain Javascript + +I really like Vue. But last week when I started building , I had slightly different constraints than usual – I wanted to use the same HTML to generate both a PDF (with [Prince][2]) and to make an interactive version of the questions. + +I couldn’t really see how that would work with Vue (because Vue wants to create all the HTML itself), and because it was a small project I decided to try writing it in plain Javascript with no libraries – just write some HTML/CSS and add a single ``. + +I hadn’t done this in a while, and I learned a few things along the way that made it easier than I thought it would be when I started. + +### do almost everything by adding & removing CSS classes + +I decided to implement almost all of the UI by just adding & removing CSS classes, and using [CSS transitions][3] if I want to animate a transition. + +here’s a small example, where clicking the “next” question button adds the “done” class to the parent div. + +``` +div.querySelector('.next-question').onclick = function () { + show_next_row(); + this.parentElement.parentElement.classList.add('done'); +} +``` + +This worked pretty well. My CSS as always is a bit of a mess but it felt manageable. + +### add/remove CSS classes with `.classList` + +I started out by editing the classes like this: `x.className = 'new list of classes'`. That felt a bit messy though and I wondered if there was a better way. And there was! + +You can also add CSS classes like this: + +``` +let x = document.querySelector('div'); +x.classList.add('hi'); +x.classList.remove('hi'); +``` + +`element.classList.remove('hi')` is way cleaner than what I was doing before. + +### find elements with `document.querySelectorAll` + +When I started learning jQuery I remember thinking that if you wanted to easily find something in the DOM you had to use jQuery (like `$('.class')`). I just learned this week that you can actually write `document.querySelectorAll('.some-class')` instead, and then you don’t need to depend on any library! + +I got curious about when `querySelectorAll` was introduced. I Googled a tiny bit and it looks like the [Selectors API was built sometime between 2008 and 2013 – I found a [post from the jQuery author discussing the proposed implementation in 2008][4], and [a blog post from 2011][5] saying it was in all major browsers by then, so maybe it didn’t exist when I started using jQuery but it’s definitely been around for quite a while :) + +### set `.innerHTML` + +In one place I wanted to change a button’s HTML contents. Creating DOM elements with `document.createElement` is pretty annoying, so I tried to do that as little as possible and instead set `.innerHTML` to the HTML string I wanted: + +``` +button.innerHTML = `I learned something! + +`; +``` + +### scroll through the page with `.scrollIntoView` + +The last fun thing I learned about is `.scrollIntoView` – I wanted to scroll down to the next question automatically when someone clicked “next question”. Turns out this is just one line of code: + +``` +row.classList.add('revealed'); +row.scrollIntoView({behavior: 'smooth', block: 'center'}); +``` + +### another vanilla JS example: peekobot + +Another small example of a plain JS library I thought was nice is [peekobot][6], which is a little chatbot interface that’s 100 lines of JS/CSS. + +Looking at [its Javascript][7], it uses some similar patterns – a lot of `.classList.add`, some adding elements to the DOM, some `.querySelectorAll`. + +I learned from reading peekobot’s source about [.closest][8] which finds the closest ancestor that matches a given selector. That seems like it would be a nice way to get rid of some of the `.parentElement.parentElement` that I was writing in my Javascript, which felt a bit fragile. + +### plain Javascript can do a lot! + +I was pretty surprised by how much I could get done with just plain JS. I ended up writing about 50 lines of JS to do everything I wanted to do, plus a bit extra to collect some anonymous metrics about what folks were learning. + +As usual with my frontend posts, this isn’t meant to be Serious Frontend Engineering Advice – my goal is to be able to write little websites with less than 200 lines of Javascript that mostly work. If you are also flailing around in frontend land I hope this helps a bit! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/06/19/a-little-bit-of-plain-javascript-can-do-a-lot/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://jvns.ca/blog/2017/06/26/vue-js-fun/ +[2]: https://www.princexml.com/ +[3]: https://3dtransforms.desandro.com/card-flip +[4]: https://johnresig.com/blog/thoughts-on-queryselectorall/ +[5]: https://tiffanybbrown.com/2011/08/12/meet-the-selectors-api/ +[6]: https://peekobot.github.io/peekobot/ +[7]: https://github.com/Peekobot/peekobot/blob/master/peekobot.js +[8]: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest diff --git a/sources/tech/20200619 Get Your Work Done Faster With These To-Do List Apps on Linux Desktop.md b/sources/tech/20200619 Get Your Work Done Faster With These To-Do List Apps on Linux Desktop.md new file mode 100644 index 0000000000..503790687a --- /dev/null +++ b/sources/tech/20200619 Get Your Work Done Faster With These To-Do List Apps on Linux Desktop.md @@ -0,0 +1,203 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Get Your Work Done Faster With These To-Do List Apps on Linux Desktop) +[#]: via: (https://itsfoss.com/to-do-list-apps-linux/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Get Your Work Done Faster With These To-Do List Apps on Linux Desktop +====== + +Getting work done is super important. If you have a planned list of things to do, it makes your work easier. So, it’s no surprise why we’re talking about to-do list apps on Linux here. + +Sure, you can easily utilize some of the [best note taking apps on Linux][1] for this purpose but using a dedicated to-do app helps you stay focused on work. + +You might be aware of some online services for that— but how about some [cool Linux apps][2] that you can use to create a to-do list? In this article, I’m going to highlight the best to-do list apps available for Linux. + +### Best To-Do List Applications For Desktop Linux Users + +![][3] + +I have tested these apps on Pop!_OS. I have also tried to mention the installation steps for the mentioned apps but you should check your distribution’s package manager for details. + +**Note:** The list is in no particular order of ranking + +#### 1\. Planner + +![][4] + +Planner is probably the best to-do list app I’ve across for Linux distributions. + +The best thing is — it is a free and open-source project. It provides a beautiful user interface that aims to give you a meaningful user experience. In other words, it’s simple and yet attractive. + +Not to forget, you get a gorgeous dark mode. As you can see in the screenshot above, you can also choose to add emojis to add some fun to your serious work tasks. + +Overall, it looks clean while offering features like the ability to add repeating tasks, creating separate folder/projects, sync with [todoist][5] etc. + +#### How to install it? + +If you’re using [elementary OS][6], you can find it listed in the app center. In either case, they also offer a [Flatpak package on Flathub][7]. + +Unless you have Flatpak integration in your software center, you should follow our guide to [use Flatpak on Linux][8] to get it installed. + +In case you want to explore the source code, take a look at its [GitHub page][9]. + +[Planner][10] + +### 2\. Go For It! + +![][11] + +Yet another impressive open-source to-do app for Linux which is based on [todotxt][12]. Even though it isn’t available for Ubuntu 20.04 (or later) at the time of writing this, you can still use it on machines with Ubuntu 19.10 or older. + +In addition to the ability to adding tasks, you can also specify the duration/interval of your break. So, with this to-do app, you will not just end up completing the tasks but also being productive without stressing out. + +The user interface is plain and simple with no fancy features. We also have a separate article on [Go][13] [For It][13] — if you’d like to know more about it. + +You can also use it on your Android phone using the [Simpletask Dropbox app][14]. + +#### How to install it? + +You can type the commands below to install it on any Ubuntu-based distro (prior to Ubuntu 20.04): + +``` +sudo add-apt-repository ppa:go-for-it-team/go-for-it-stable +sudo apt update +sudo apt install go-for-it +``` + +In case you want to install it on any other Linux distro, you can try the [Flatpak package on Flathub][15]. + +If you don’t know about Flatpak — take a look at our [complete guide on using Flatpak][8]. To explore more about it, you can also head to their [GitHub page][16]. + +[Go For It!][16] + +#### 3\. GNOME To Do + +![][17] + +If you’re [using Ubuntu][18] or other Linux distribution with GNOME desktop envioenment, you should already have it installed. Just search for “To Do” and you should find it. + +It’s a simple to-do app which presents the list in the form of cards and you can have separate set of tasks every card. You can add a schedule to the tasks as well. It supports extensions with which you can enable the support for todo.txt files and also integration with [todoist][5]. + +[GNOME To Do][19] + +#### 4\. Taskwarrior [Terminal-based] + +![][20] + +A command-line based open-source to-do list program “[Taskwarrior][21]” is an impressive tool if you don’t need a Graphical User Interface (GUI). It also provides cross-platform support (Windows and macOS). + +It’s quite easy to add and list tasks along with a due date as shown in the screenshot above. + +To make the most out of it, I would suggest you to follow the [official documentation][22] to know how to use it and the options/features that it offers. + +##### How to install it? + +You can find it in your respective package managers on any Linux distribution. To get it intalled in Ubuntu, you will have to type the following in the terminal: + +``` +sudo apt install taskwarrior +``` + +For Manjaro Linux, you can simply get it installed through [pamac][23] that you usually need to [install software in Manjaro Linux.][24] + +In case of any other Linux distributions, you should head to its [official download page][25] and follow the instructions. + +[Taskwarrior][21] + +#### 5\. Task Coach + +![][26] + +Task Coach is yet another open-source to-do list app that offers quite a lot of essential features. You can add sub-tasks, description to your task, add dates, notes, and a lot more things. It also supports tree view for the task lists you add and manage. + +It’s a good thing to see that it offers cross-platform support (Windows, macOS, and Android). + +Overall, it’s easy to use with tons of options and works well. + +#### How to install it? + +It offers both **.deb** and **.rpm** packages for Ubuntu and Fedora. In addition to that, you can also install it using PPA. + +You can find all the necessary files and instructions from its [official download page][27]. + +You may notice an installation error for its dependencies on Ubuntu 20.04. But, I believe it should work fine on the previous Ubuntu releases. + +In my case, it worked out fine for me when using the [AUR package][28] through Pamac on Manjaro Linux. + +[Task Coach][29] + +#### 6\. Todour + +![][30] + +A very simple open-source to-do list app that lets you utilize todo.txt file as well. You may not get a lot of options to choose from — but you get a couple of useful settings to tweak. + +It may not be the most actively developed to-do list app — but it does the work expected. + +#### How to install Todour? + +If you’re using Manjaro Linux, you can utilize pamac to install Todour from [AUR][28]. + +Unfortunately, it does not provide any **.deb** or **.rpm** package for Ubuntu/Fedora. So, you’ll have to build it from source or just explore more about it on its [GitHub page][31]. + +[Todour][32] + +### Wrapping Up + +As an interesting mention, I’d like you to take a look at [TodoList][33], which is an applet for KDE-powered distributions. Among mainstream to-do list applications, [Remember The Milk is the rare one that provides a Linux client][34]. It is not open source, though. + +I hope this list of to-do specific apps help you get things done on Linux. + +Did I miss any of your favorite to-do list apps on Linux? Feel free to let me know what you think! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/to-do-list-apps-linux/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/note-taking-apps-linux/ +[2]: https://itsfoss.com/essential-linux-applications/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/open-Source-to-do-list-apps.jpg?ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/planner-screenshot.jpg?ssl=1 +[5]: https://todoist.com +[6]: https://elementary.io +[7]: https://flathub.org/apps/details/com.github.alainm23.planner +[8]: https://itsfoss.com/flatpak-guide/ +[9]: https://github.com/alainm23/planner +[10]: https://planner-todo.web.app/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/01/go-for-it-reminders.jpg?ssl=1 +[12]: http://todotxt.com +[13]: https://itsfoss.com/go-for-it-to-do-app-in-linux/ +[14]: https://play.google.com/store/apps/details?id=nl.mpcjanssen.todotxtholo&hl=en +[15]: https://flathub.org/apps/details/de.manuel_kehl.go-for-it +[16]: https://github.com/JMoerman/Go-For-It +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/to-do-gnome.jpg?ssl=1 +[18]: https://itsfoss.com/getting-started-with-ubuntu/ +[19]: https://wiki.gnome.org/Apps/Todo/Download +[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/taskwarrior.png?ssl=1 +[21]: https://taskwarrior.org/ +[22]: https://taskwarrior.org/docs/start.html +[23]: https://wiki.manjaro.org/index.php?title=Pamac +[24]: https://itsfoss.com/install-remove-software-manjaro/ +[25]: https://taskwarrior.org/download/ +[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/task-coach.png?ssl=1 +[27]: https://www.taskcoach.org/download.html +[28]: https://itsfoss.com/aur-arch-linux/ +[29]: https://www.taskcoach.org/index.html +[30]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/todour.png?ssl=1 +[31]: https://github.com/SverrirValgeirsson/Todour +[32]: https://nerdur.com/todour-pl/ +[33]: https://store.kde.org/p/1152230/ +[34]: https://itsfoss.com/remember-the-milk-linux/ diff --git a/sources/tech/20200619 How to prepare to write your first Mycroft AI skill using Python.md b/sources/tech/20200619 How to prepare to write your first Mycroft AI skill using Python.md new file mode 100644 index 0000000000..0dd35e3446 --- /dev/null +++ b/sources/tech/20200619 How to prepare to write your first Mycroft AI skill using Python.md @@ -0,0 +1,338 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to prepare to write your first Mycroft AI skill using Python) +[#]: via: (https://opensource.com/article/20/6/mycroft-voice-assistant-skill) +[#]: author: (Steve Ovens https://opensource.com/users/stratusss) + +How to prepare to write your first Mycroft AI skill using Python +====== +Planning is the essential first step in writing a skill and teaching +Mycroft how to do what you want it to do. +![A person looking at a phone][1] + +With the recent worldwide pandemic and stay-at-home orders, I have been looking for things to do to replace some of my usual activities. I started to update my home electronics setup and, as part of that, to delve into home automation. Some of my friends use Amazon's Alexa to turn lights on and off in their house, and that is appealing on some level. However, I am a privacy-conscious individual, and I was never really comfortable with devices from Google or Amazon listening to my family all the time (I'll ignore cellphones for the sake of this conversation). I have known about the open source voice assistant [Mycroft][2] for about four years, but due to early struggles with the project, I'd never investigated it too closely. The project has come a very long way since I first stumbled across it, and it checks a lot of boxes for me: + + * Self-hosted + * Easy onboarding (via Python) + * Open source + * Privacy-conscious + * Interactive chat channel + + + +In the [first article][3] in this series, I introduced Mycroft, and in the [second article][3], I touched upon the concept of skills in artificial intelligence. In its most basic form, a skill is a block of code that is executed to achieve the result desired for an intent. Intents attempt to determine _what_ you want, and a skill is the way Mycroft responds. If you can think of an outcome, there is probably a way to create a skill that makes it happen. + +At their heart, Mycroft skills are just Python programs. Generically, they have three or four sections: + + 1. The **import** section is where you load any Python modules required to accomplish the task. + 2. An optional **function** section contains snippets of code that are defined outside of the main class section. + 3. The **class** section is where all the magic happens. A class should always take the `MycroftSkill` as an argument. + 4. The **create_skill()** section is what Mycroft uses to load your skill. + + + +When I write a skill, I often start by writing a standard Python file to ensure my code does what I think it does. I do this mainly because the workflow that I am used to, including debugging tools, exists outside of the Mycroft ecosystem. Therefore, if I need to step through my code, I find it much more familiar to use my IDE ([PyCharm][4]) and its built-in tools, but this is a personal preference. + +All the code for this project can be found in my [GitLab repo][5]. + +### About intent parsers + +The skill in this project uses both the [Padatious][6] and [Adapt][7] intent parsers, which I described in my [previous][3] article. Why? First of all, this tutorial is meant to provide a concrete example of some of the features you might want to consider using in your own skill. Second, Padatious intents are very straightforward but do not support [regular expressions][8], while Adapt puts regex to good use. Also, Padatious intents aren't context-aware, which means that, while you could prompt the user for a response and then parse it following some decision-tree matrix, you might be better off using the Adapt intent parser with Mycroft's built-in context handler. Note that, by default, Mycroft assumes you are using the Padatious intent handler. Finally, it's good to note that Adapt is a keyword intent parser. This can make complex parsing cumbersome if you are not a regex ninja. (I am not.) + +## Implement the 3 T's + +Before you start writing a skill, consider the 3 T's: _Think things through_! Similar to when you're writing an outline for an essay, when you're starting to develop a skill, write down what you want your skill to do. + +This tutorial will step through writing a Mycroft skill to add items to the [OurGroceries][9] app (which I am not affiliated with). In truth, this skill was my wife's idea. She wanted an application she could use on her phone to manage her shopping lists. We tried almost a dozen apps to try to meet our individual needs—I needed an API or a way to easily interact with the backend, and she had a giant list of criteria, one of the most important was that it is easy to use from her phone. After she made her list of Must-haves, Nice-to-haves, and Wish-list items, we settled on OurGroceries. It does not have an API, but it does have a way to interact with it through JSON. There is even a [handy library][10] called `py-our-groceries` in PyPI (which I have contributed some small amount to). + +Once I had an objective and a target platform, I started to outline what the skill needed to do: + + 1. Login/authenticate + 2. Get a list of the current grocery lists + 3. Add item to a specific grocery list + 4. Add item to a category under a specific list + 5. Add a category (since OurGroceries allows items to be placed in categories) + + + +With this in mind, I started to sketch out the required Python. Here is what I came up with. + +## Create the Python sketch + +By reading the examples for the `py-our-groceries` library, I figured out I needed to import just two things: `asyncio` and `ourgroceries`. + +Simple enough. Next, I knew that I needed to authenticate with `username` and `password`, and I knew what tasks the program needed to do. So my sketch ended up looking like this: + + +``` +import asyncio +from ourgroceries import OurGroceries +import datetime +import json +import os + +USERNAME = "" +PASSWORD = "" +OG = OurGroceries(USERNAME, PASSWORD) + +def fetch_list_and_categories(): +    pass + +def return_category_id(): +    pass + +def add_to_my_list(): +    pass + +def add_category(): +    pass +``` + +I won't go into the full details of what makes this sketch tick, as that is outside the scope of this series. However, if you want, you can [view the working outline][11] in its entirety. + +Before you can begin programming, you need to have your username, password, and a list ID. The username and password are obvious. The list ID can be retrieved from the URL after clicking on the link, or more programmatically, you can use the Developer Tools for your browser of choice and inspect the objects. Here is what the Developer Tools looks like [in Firefox][12]: + +![CC BY-SA Steve Ovens][13] + +Once you have a list ID, log into OurGroceries and get a cookie. To do this, create an OurGroceries _object_ and then pass it into `asyncio`. While you are at it, you might as well define your list ID, as well: + + +``` +OG = OurGroceries(USERNAME, PASSWORD) +asyncio.run(OG.login()) +MY_LIST_ID = "a1kD7kvcMPnzr9del8XMFc" +``` + +For the purposes of this project, you need to define two object types to help organize your code: `groceries` and `categories`. The `fetch_list_and_categories` method is pretty straightforward: + + +``` +def fetch_list_and_categories(object_type=None): +    if object_type == "groceries": +        list_to_return = asyncio.run(OG.get_list_items(list_id=MY_LIST_ID)) +    elif object_type == "categories": +        list_to_return = asyncio.run(OG.get_category_items()) +    else: +        list_to_return = None +    return (list_to_return) +``` + +OurGroceries allows you to add more than one category or item with the same name. For example, if you already have "Meat" on your list and you add it again, you will see a category called "Meat (2)" (this number increments whenever you create a category with the same name). For us, this was undesirable behavior. We also wanted to avoid duplication as much as possible, so I made a rudimentary attempt at detecting plurals; for example, my code checks for both "Meat" and "Meats." I am sure there is a more intelligent way of performing these checks, but this example highlights some of the things you may want to think about as you progress. For brevity, I will omit these checks, so the `return_category_id` method looks something like this: + + +``` +def return_category_id(category_to_search_for, all_categories): +    category_to_search_for_lower = category_to_search_for.lower() +    category_id = None +    if len(all_categories['list']['items']) is not 0: +        for category_heading in all_categories['list']['items']: +            # Split the heading because if there is already a duplicate it +            # presents as "{{item}} (2)" +            category_heading_lowered = category_heading['value'].lower().split()[0] +            if category_to_search_for_lower == category_heading_lowered: +                category_id = category_heading['id'] +                break +    return(category_id) +``` + +To add an item to the list, you want to: + + 1. Check that the item does not already exist + 2. Obtain the category ID + 3. Add the item to the list under a specific category (if specified) + + + +The `add_to_my_list` method ends up something like this: + + +``` +def add_to_my_list(full_list, item_name, all_categories, category="uncategorized"): +    # check to make sure the object doesn't exist +    # The groceries live in my_full_list['list']['items'] +    # Start with the assumption that the food does not exist +    food_exists = False +    toggle_crossed_off = False +    category_lowered = category.lower() +    for food_item in full_list['list']['items']: +        if item_name in food_item['value']: +            print("Already exists") +            food_exists = True +    if not food_exists: +        category_id = return_category_id(category_lowered, all_categories) +        asyncio.run(OG.add_item_to_list(MY_LIST_ID, item_name, category_id)) +        print("Added item") +``` + +Finally, `add_category` runs the `asyncio` command to create a category if it does not already exist: + + +``` +def add_category(category_name, all_categories): +    category_id = return_category_id(category_name, all_categories) +    if category_id is None: +        asyncio.run(OG.create_category(category_name)) +        refresh_lists() +        print("Added Category") +    else: +        print("Category already exists") +``` + +You should now be able to test your sketch to make sure everything in each function works. Once you are satisfied with the sketch, you can move on to thinking about how to implement it in a Mycroft skill. + +## Plan the Mycroft skill + +You can apply the same principles you used to sketch out your Python to developing a Mycroft skill. The [official documentation][14] recommends using an interactive helper program called the Mycroft Skills Kit to set up a skill. `mycroft-msk create` asks you to: + + * Name your skill + * Enter some phrases commonly used to trigger your skill + * Identify what dialog Mycroft should respond with + * Create a skill description + * Pick an icon from `fontawesome.com/cheatsheet` + * Pick a color from `mycroft.ai/colors` or `color-hex.com` + * Define a category (or categories) where the skill belongs + * Specify the code's license + * State whether the skill will have dependencies + * Indicate whether you want to create a GitHub repo + + + +Here is a demonstration of how `mycroft-msk create` works: + +![mycroft-msk create working][15] + +(Steve Ovens, [CC BY-SA 4.0][16]) + +After you answer these questions, Mycroft creates the following structure under `mycroft-core/skills/`: + + +``` +├── __init__.py +├── locale +│   └── en-us +│       ├── ourgroceries.dialog +│       └── ourgroceries.intent +├── __pycache__ +│   └── __init__.cpython-35.pyc +├── README.md +├── settings.json +└── settingsmeta.yaml +``` + +You can ignore most of these files for now. I prefer to make sure my code is working before trying to get into Mycroft-specific troubleshooting. This way, if things go wrong later, you know it is related to how your Mycroft skill is constructed and not the code itself. As with the Python sketch, take a look at the outline that Mycroft created in `__init__.py`. + +All Mycroft skills should have an `__init__.py`. By convention, all code should go in this file, although if you are a skilled Python developer and know how this file works, you could choose to break your code out. + +Inside the file Mycroft created, you can see: + + +``` +from mycroft import MycroftSkill, intent_file_handler + +class OurGroceries(MycroftSkill): +    def __init__(self): +        MycroftSkill.__init__(self) + +    @intent_file_handler('ourgroceries.intent') +    def handle_test(self, message): +        self.speak_dialog('ourgroceries') + +def create_skill(): +    return OurGroceries() +``` + +In theory, this code will execute based on the trigger(s) you create during the `msk create` process. Mycroft first tries to find a file with the `.dialog` file extension that matches the argument passed to `selfspeak_dialog()`. In the example above, Mycroft will look for a file called `ourgroceries.dialog` and then say one of the phrases it finds there. Failing that, it will say the name of the file. I'll get more into this in a follow-up article about responses. If you want to try this process, feel free to explore the various input and output phrases you can come up with during skill creation. + +While the script is a great starting point, I prefer to think through the `__init__.py` on my own. As mentioned earlier, this skill will use both the Adapt and Padatious intent handlers, and I also want to demonstrate [conversational context handling][17] (which I'll get deeper into in the next article). So start by importing them: + + +``` +from mycroft import intent_file_handler, MycroftSkill, intent_handler +from mycroft.skills.context import adds_context, removes_context +``` + +In case you are wondering, the order you specify your import statements does not matter in Python. After the imports are done, look at the class structure. If you want to learn more about classes and their uses, [Real Python][18] has a great primer on the subject. + +As above, start by mocking up your code with its intended functionality. This section uses the same goals as the Python sketch, so go ahead and plug some of that in, this time adding some comments to help guide you: + + +``` +class OurGroceriesSkill(MycroftSkill): +    def __init__(self): +        MycroftSkill.__init__(self) +    +    # Mycroft should call this function directly when the user +    # asks to create a new item +    def create_item_on_list(self, message): +        pass +    +                # Mycroft should also call this function directly +    def create_shopping_list(self, message): +        pass +    +    # This is not called directly, but instead should be triggered +    # as part of context aware decisions +    def handle_dont_create_anyways_context(self): +        pass +                +    # This function is also part of the context aware decision tree +    def handle_create_anyways_context(self): +        pass +    +    +    def stop(self): +        pass +``` + +### The `__init__` and `initialize` methods + +A skill has a few "special" functions that you should know about. The `__init__(self)` method is called when the skill is first instantiated. In Python IDEs, variables that are declared outside of the `__init__` section will often cause warnings. Therefore, they are often used to declare variables or perform setup actions. However, while you can declare variables intended to match the skills settings file (more on this later), you cannot use the Mycroft methods (such as `self.settings.get)` to retrieve the values. It is generally not appropriate to attempt to make connections to the outside world from `__init__`. Also, the `__init__` function is considered optional within Mycroft. Most skills opt to have one, and it is considered the "Pythonic" way of doing things. + +The `initialize` method is called after the skill is fully constructed and registered with the system. It is used to perform any final setup for the skill, including accessing skill settings. It is optional, however, and I opted to create a function that gets the authentication information. I called it `_create_initial_grocery_connection`, if you are curious and want to look ahead. I will revisit these two special functions in the next article when I start walking through creating the skill code. + +Finally, there is a special function called `stop()`, which I didn't use. The stop method is called anytime a user says, "stop." If you have a long-running process or audio playback, this method is useful. + +## Wrapping up + +So you now have the outline of what you want to accomplish. This will definitely grow over time. As you develop your skill, you will discover new functionality that your skill will require to work optimally. + +Next time, I will talk about the types of intents you will use, how to set them up, and how to deal with regular expressions. I'll also explore the idea of [conversational contexts][17], which are used for getting feedback from the user. + +Do you have any comments, questions, or concerns? Leave a comment, visit me on Twitter [@linuxovens][19], or stop by [Mycroft skills chat channels][20]. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/mycroft-voice-assistant-skill + +作者:[Steve Ovens][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/stratusss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/idea_innovation_mobile_phone.png?itok=RqVtvxkd (A person looking at a phone) +[2]: https://mycroft.ai/ +[3]: https://opensource.com/article/20/6/open-source-voice-assistant +[4]: https://www.jetbrains.com/pycharm/ +[5]: https://gitlab.com/stratus-ss/mycroft-ourgroceries-skill +[6]: https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/intents/padatious-intents +[7]: https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/intents/adapt-intents +[8]: https://www.computerhope.com/jargon/r/regex.htm +[9]: https://www.ourgroceries.com/overview +[10]: https://github.com/ljmerza/py-our-groceries +[11]: https://gitlab.com/stratus-ss/mycroft-ourgroceries-skill/-/blob/master/talk_to_ourgroceries.py +[12]: https://developer.mozilla.org/en-US/docs/Tools +[13]: https://opensource.com/sites/default/files/resize/ourgroceries_ids-675x201.jpg (Getting an ID) +[14]: https://mycroft-ai.gitbook.io/docs/skill-development/introduction/your-first-skill +[15]: https://opensource.com/sites/default/files/uploads/msk-create-15fps.gif (mycroft-msk create working) +[16]: https://creativecommons.org/licenses/by-sa/4.0/ +[17]: https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/conversational-context +[18]: https://realpython.com/python3-object-oriented-programming/ +[19]: https://twitter.com/linuxovens?lang=en +[20]: https://chat.mycroft.ai/community/channels/skills diff --git a/sources/tech/20200622 Manage your Kubernetes cluster with Lens.md b/sources/tech/20200622 Manage your Kubernetes cluster with Lens.md new file mode 100644 index 0000000000..beb5127a3d --- /dev/null +++ b/sources/tech/20200622 Manage your Kubernetes cluster with Lens.md @@ -0,0 +1,122 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Manage your Kubernetes cluster with Lens) +[#]: via: (https://opensource.com/article/20/6/kubernetes-lens) +[#]: author: (Chris Collins https://opensource.com/users/clcollins) + +Manage your Kubernetes cluster with Lens +====== +Lens is a useful, attractive, open source user interface for working +with Kubernetes clusters. +![Ship captain sailing the Kubernetes seas][1] + +As more workloads are migrated to containerized environments, it becomes challenging to manage those larger numbers of containers and the connections between them and other systems. As the scale and complexity of a containerized environment increase past a human's ability to manage, container orchestration platforms such as [Kubernetes][2] become increasingly important. Such platforms, however, come with their own management challenges that require metrics, observability, and a user-friendly interface to present their huge amount of complexity. + +### Enter Lens + +[Lens][3], which bills itself as "the Kubernetes IDE," is a useful, attractive, open source user interface (UI) for working with Kubernetes clusters. Out of the box, Lens can connect to Kubernetes clusters using your kubeconfig file and will display information about the cluster and the objects it contains. Lens can also connect to—or install—a Prometheus stack and use it to provide metrics about the cluster, including node information and health. + +![Lens UI displaying an overview of workloads on the cluster][4] + +An overview of workloads on the cluster. (Chris Collins, [CC BY-SA 4.0][5]) + +Like Kubernetes' dashboard and OpenShift, Lens provides live updates on the state of objects in the cluster and metrics collected by [Prometheus][6]. + +### Get started + +Installing Lens is straightforward. [AppImage][7] packages are available for Linux, and there are binaries available for macOS and Windows clients. This tutorial explains how to download and use the Lens AppImage to install and use Lens on Linux. + +According to [AppImage's FAQ][8], an AppImage is "a downloadable file for Linux that contains an application and everything the application needs to run." An application packaged as an AppImage is just that—a single executable file that can be downloaded and run. + +The AppImage for Lens can be downloaded from the [Lens Releases][9] page on GitHub. After you download it, mark the file executable with `chmod`, and then either execute it directly or copy it to a place in your `$PATH`: + + +``` +# Download the 3.4.0 AppImage for Lens, mark it executable and copy it to your $PATH +# (output omitted for brevity) + +$ wget +$ chmod +x Lens-3.4.0.AppImage +$ sudo mv Lens-3.4.0.AppImage /usr/sbin/lens +``` + +Then you can start Lens by typing `lens` on the command line. + +### Connect Lens to a Kubernetes cluster + +Once you launch Lens, connect it to a Kubernetes cluster by clicking the **+** icon in the top-left corner and selecting a kubeconfig. Next, a drop-down box will appear containing any Kubernetes contexts from your `~/.kube/config` file, or you can select a custom one. Because cluster and authentication information about the cluster for any context is included in the kubeconfig file, Lens treats each context as a different cluster, unfortunately. + +This is particularly unhelpful compared with how OpenShift creates context information in the kubeconfig file automatically for any project (namespace) you switch to. As a site-reliability engineer (SRE) working on hundreds of clusters, I had dozens and dozens of "clusters" to choose from when setting up Lens. In practice, I found it best to select the `default` context for any cluster. You can manage all namespaces and workloads once Lens has connected, and there's no need to add them all. + +Once it's connected, Lens will display a ton of information about your cluster. You can see the workloads that are running: pods and deployments, daemon sets, cron jobs, etc. You can also view information about config maps and secrets, networking information, storage, namespaces, and events. Each will let you drill down into the information about a given object, and you can even edit the objects directly in Lens. + +![Lens displaying details of pods running on the cluster, including information on a specific pod.][10] + +Details of pods running on the cluster. (Chris Collins, [CC BY-SA 4.0][5]) + +### Gather metrics about your cluster + +One of Lens' incredibly helpful features is its ability to connect to a Prometheus stack installed in your cluster to gather metrics about the cluster and its nodes for both current and historical data. This is great for getting at-a-glance information about the cluster right within the Lens UI without having to go to an external dashboard. However, the information presented is not comprehensive–it's good for an overview, but you may still wish to utilize a visualization tool such as Grafana with a more complicated dashboard to gather more specialized information. + +Along with being able to connect to an existing Prometheus stack provisioned in the cluster, Lens can install applications on your behalf, too. This is very useful for enthusiasts running Kubernetes clusters in their homelabs to be able to deploy and connect to Prometheus in a single click. + +### Install Prometheus with Lens + +If you have been following along with this series, especially [_Build a Kubernetes cluster with the Raspberry Pi_][11], you will have a Kubernetes cluster provisioned in your homelab for education and tinkering. One thing the vanilla cluster lacks is metrics, and this is a great opportunity to add Prometheus to the cluster and install the [kube-state-metrics][12] service to gather information about the cluster. + +To install it, just right-click on the cluster icon in the top-left corner of the Lens UI (after connecting to the cluster, of course) and select **Settings**. Under **Features** on the Settings page, you will find a **Metrics** section and a button to install Prometheus. Click **Install** to deploy the Prometheus stack to your cluster, and Lens will auto-detect its existence and begin displaying metrics. (It will take a minute—the new Prometheus has to collect some metrics first.) + +I also appreciate that Lens links directly to the manifests used to deploy this stack, so you can verify what will be created before doing it, if you want. + +![Lens UI, displaying hardware utilization metrics about the cluster][13] + +Hardware utilization metrics about the cluster. (Chris Collins, [CC BY-SA 4.0][5]) + +### Fix kube-state-metrics + +Unfortunately, while Prometheus will install just fine on a Raspberry Pi-based cluster, the kube-state-metrics service will fail. Currently, the kube-state-metrics project does not build an AArch64/ARM64 image, so pods created from that image will continuously crash with `exec format error` messages in the logs. + +Luckily [this issue is being tracked][14], and the kube-state-metrics project is working toward building the infrastructure to produce official ARM images. Until then, however, you can use a community-developed image and patch the kube-state-metrics deployment directly using Lens. + +Go back into the cluster information, click on **Workloads**, and select **Deployments**. A list of all the Kubernetes deployment objects in the cluster will appear in the pane on the right. You should be able to pick out the kube-state-metrics deployment easily by the angry red entry under the **Conditions** column that indicates the crash-looping pod issue. + +Select the kube-state-metrics deployment, and details of the object will slide out from the right in an overlay window. In the upper-right corner of this window is a pencil icon. Clicking that icon opens an editor window with the YAML representation of the kube-state-metrics deployment. Scroll down, and edit the `.spec.template.spec.containers.image` value. By default, this value points to the official image: `quay.io/coreos/kube-state-metrics:v1.9.5`. + +Replace this value with `'docker.io/carlosedp/kube-state-metrics:v1.9.5'`, and click **Save**. This will trigger the deployment to roll out new kube-state-metrics pods with an ARM64 architecture, and they should become ready and begin reporting the metrics directly to Prometheus. + +### Lens lets you see clearly + +Kubernetes is complex, and any tool that makes it easier to visualize and work with Kubernetes clusters can lower the barrier of entry for new folks and make life considerably easier for experienced Kubernetes administrators. Lens knocks this out of the park with an attractive, intuitive, and easy-to-use UI for managing one or more clusters, from the 10,000-foot view down into the nitty-gritty of individual Kubernetes objects. Lens also helps display metrics about the cluster and makes installing and using a Prometheus stack to display the metrics almost push-button. + +I am extremely impressed with Lens and use it to manage several Kubernetes clusters in my own homelab, and I hope you find it useful as well. Do you have tools you like for managing or visualizing what goes on in your Kubernetes clusters? Share them in the comments, so we can all try them out! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/kubernetes-lens + +作者:[Chris Collins][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/clcollins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek (Ship captain sailing the Kubernetes seas) +[2]: https://opensource.com/resources/what-is-kubernetes +[3]: https://k8slens.dev/ +[4]: https://opensource.com/sites/default/files/uploads/lens2.png (Lens UI displaying an overview of workloads on the cluster) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sitewide-search?search_api_views_fulltext=prometheus +[7]: https://opensource.com/article/20/6/appimages +[8]: https://docs.appimage.org/user-guide/faq.html#question-what-is-an-appimage +[9]: https://github.com/lensapp/lens/releases/latest +[10]: https://opensource.com/sites/default/files/uploads/lens3.png (Lens displaying details of pods running on the cluster, including information on a specific pod.) +[11]: https://opensource.com/article/20/6/kubernetes-raspberry-pi +[12]: https://github.com/kubernetes/kube-state-metrics +[13]: https://opensource.com/sites/default/files/uploads/lens1.png (Lens UI, displaying hardware utilization metrics about the cluster) +[14]: https://github.com/kubernetes/kube-state-metrics/issues/1037 diff --git a/sources/tech/20200623 Take control of your data with associative arrays in Bash.md b/sources/tech/20200623 Take control of your data with associative arrays in Bash.md new file mode 100644 index 0000000000..eb178a4677 --- /dev/null +++ b/sources/tech/20200623 Take control of your data with associative arrays in Bash.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Take control of your data with associative arrays in Bash) +[#]: via: (https://opensource.com/article/20/6/associative-arrays-bash) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Take control of your data with associative arrays in Bash +====== +Associative arrays let you create lists of key and value pairs, instead +of just numbered values. +![bash logo on green background][1] + +If you've ever written code, whether it's a shell script, a Python script, C++, or even Scratch, then you know that variables are vital. Computers and coders use variables as waystations, where they surreptitiously pass information back and forth. For instance, if you need to process a user's name in a shell script, you might set up a variable, put the username into the variable, and then instruct the computer to do something to the variable (check it against a list of authorized users, for example). Variables are important because they enable code to by dynamic: they're placeholders for information that's expected to change every time you run the code. + +But variables, because they're so common, can also become rather unwieldy. Often times, you gather so many variables in a code project that it's next to impossible to keep track of them all. You can use clever conventions, such as prefixing all related variables with a common string (user_name, user_pass, user_time, and so on), or you can create a master list of them somewhere for easy reference, but the overhead of keeping track of it all can becoming taxing. + +One answer to this problem has, traditionally, been arrays. These have worked well in most coding languages, including shell scripting languages like Bash. + +Most shells offer the ability to create, manipulate, and query indexed arrays. In plain English, an indexed array is a list of things prefixed with a number. This list of things, along with their assigned number, is conveniently wrapped up in a single variable, which makes it easy to "carry" around in your code. + +[Bash][2], however, includes the ability to create associative arrays, and it treats these arrays the same as any other array. An associative array lets you create lists of key and value pairs, instead of just numbered values. + +You can assign values to arbitrary keys: + + +``` +$ declare -A userdata +$ userdata[name]=seth +$ userdata[pass]=8eab07eb620533b083f241ec4e6b9724 +$ userdata[login]=`date --utc +%s` +``` + +Query any key: + + +``` +$ echo "${userdata[name]}" +seth +$ echo "${userdata[login]}" +1583362192 +``` + +Most of the usual array operations you'd expect from an array are available. For instance, you can list all values: + + +``` +$ echo "${userdata[*]}" +8eab07eb620533b083f241ec4e6b9724 seth 1583362192 +``` + +You can view the entire array: + + +``` +$ typeset -A +declare -A BASH_ALIASES='()' +declare -A BASH_CMDS='()' +declare -A userdata='([pass]="8eab07eb620533b083f241ec4e6b9724" +[name]="seth" +[login]="1583362192" )' +``` + +You can also remove items from your array using the **unset** command: + + +``` +$ unset userdata[pass] +$ typeset -A +[...] +declare -A userdata='([name]="seth" +[login]="1583362192" )' +``` + +Finally, you can dismiss the entire array. + + +``` +`$ unset "userdata[*]"` +``` + +### Arrays for data + +Arrays are useful tools for storing related data together. You can use a plain old variable in most cases, but sometimes it's more logical to store attributes of a singular data "object" in an array, to keep the data consolidated and indexed. For example, if you're processing login names and times taken from **utmp**, it would be more useful for you to _associate_ the login time with the user to whom the time referred, rather than just storing the two data objects as separate variables with no obvious connection. + +Furthermore, unlike variables, an entry in an array doesn't need to exist before you store data in it. You don't have to know exactly how much data is going to get stored before you store it. That can be a big advantage if you're processing data that you can't control or predict: if you don't know how many users to expect in **utmp** one day to the next, it's hard to build a script to contain all the entries. With an array, though, all you have to do is declare one array and read data into it, creating a new key and value pair until you run out of data to ingest. + +Arrays are powerful, and they're common in programming languages beyond Bash. Start using them now! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/associative-arrays-bash + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) +[2]: https://opensource.com/resources/what-bash diff --git a/sources/tech/20200624 A surprising way to do data science with Node.js.md b/sources/tech/20200624 A surprising way to do data science with Node.js.md new file mode 100644 index 0000000000..0a73306647 --- /dev/null +++ b/sources/tech/20200624 A surprising way to do data science with Node.js.md @@ -0,0 +1,450 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A surprising way to do data science with Node.js) +[#]: via: (https://opensource.com/article/20/6/server-side-data-science-nodejs) +[#]: author: (Cristiano L. Fontana https://opensource.com/users/cristianofontana) + +A surprising way to do data science with Node.js +====== +Do a common data science task with Node.js and D3.js. +![Computer screen with files or windows open][1] + +[JavaScript][2] (also known as JS) is the [lingua franca][3] of the web, as it is supported by all the major web browsers—the other languages that run in browsers are [transpiled][4] (or translated) to JavaScript. Sometimes JS [can be confusing][5], but I find it pleasant to use because I try to stick to the [good parts][6]. JavaScript was created to run in a browser, but it can also be used in other contexts, such as an [embedded language][7] or for [server-side applications][8]. + +In this tutorial, I will explain how to write a program that will run in Node.js, which is a runtime environment that can execute JavaScript applications. What I like the most about Node.js is its [event-driven architecture][9] for [asynchronous programming][10]. With this approach, functions (aka callbacks) can be attached to certain events; when the attached event occurs, the callback executes. This way, the developer does not have to write a main loop because the runtime takes care of that. + +JavaScript also has new [async functions][11] that use a different syntax, but I think they hide the event-driven architecture too well to use them in a how-to article. So, in this tutorial, I will use the traditional callbacks approach, even though it is not necessary for this case. + +### Understanding the program task + +The program task in this tutorial is to: + + * Read some data from a [CSV file][12] that contains the [Anscombe's quartet][13] dataset + * Interpolate the data with a straight line (i.e., _f(x) = m·x + q_) + * Plot the result to an image file + + + +For more details about this task, you can read the previous articles in this series, which do the same task in [Python and GNU Octave][14] and [C and C++][15]. The full source code for all the examples is available in my [polyglot_fit repository][16] on GitLab. + +### Installing + +Before you can run this example, you must install Node.js and its package manager [npm][17]. To install them on [Fedora][18], run: + + +``` +`$ sudo dnf install nodejs npm` +``` + +On Ubuntu: + + +``` +`$ sudo apt install nodejs npm` +``` + +Next, use `npm` to install the required packages. Packages are installed in a local [`node_modules` subdirectory][19], so Node.js can search for packages in that folder. The required packages are: + + * [CSV Parse][20] for parsing the CSV file + * [Simple Statistics][21] for calculating the data correlation factor + * [Regression-js][22] for determining the fitting line + * [D3-Node][23] for server-side plotting + + + +Run npm to install the packages: + + +``` +`$ npm install csv-parse simple-statistics regression d3-node` +``` + +### Commenting code + +Just like in C, in JavaScript, you can insert [comments][24] by putting `//` before your comment, and the interpreter will discard the rest of the line. Another option: JavaScript will discard anything between `/*` and `*/`: + + +``` +// This is a comment ignored by the interpreter. +/* Also this is ignored */ +``` + +### Loading modules + +You can load modules with the [`require()` function][25]. The function returns an object that contains a module's functions: + + +``` +const EventEmitter = require('events'); +const fs = require('fs'); +const csv = require('csv-parser'); +const regression = require('regression'); +const ss = require('simple-statistics'); +const D3Node = require('d3-node'); +``` + +Some of these modules are part of the Node.js standard library, so you do not need to install them with npm. + +### Defining variables + +Variables do not have to be declared before they are used, but if they are used without a declaration, they will be defined as global variables. Generally, global variables are considered bad practice, as they could lead to [bugs][26] if they're used carelessly. To declare a variable, you can use the [var][27], [let][28], and [const][29] statements. Variables can contain any kind of data (even functions!). You can create some objects by applying the [`new` operator][30] to a constructor function: + + +``` +const inputFileName = "anscombe.csv"; +const delimiter = "\t"; +const skipHeader = 3; +const columnX = String(0); +const columnY = String(1); + +const d3n = new D3Node(); +const d3 = d3n.d3; + +var data = []; +``` + +Data read from the CSV file is stored in the `data` array. Arrays are dynamic, so you do not have to decide their size beforehand. + +### Defining functions + +There are several ways to define functions in JavaScript. For example, the [function declaration][31] allows you to directly define a function: + + +``` +function triplify(x) { +    return 3 * x; +} + +// The function call is: +triplify(3); +``` + +You can also declare a function with an [expression][32] and store it in a variable: + + +``` +var triplify = function (x) { +    return 3 * x; +} + +// The function call is still: +triplify(3); +``` + +Finally, you can use the [arrow function expression][33], a syntactically short version of a function expression, but it has [some limitations][33]. It is generally used for concise functions that do simple calculations on its arguments: + + +``` +var triplify = (x) => 3 * x; + +// The function call is still: +triplify(3); +``` + +### Printing output + +In order to print on the terminal, you can use the built-in [`console` object][34] in the Node.js standard library. The [`log()` method][35] prints on the terminal (adding a newline at the end of the string): + + +``` +`console.log("#### Anscombe's first set with JavaScript in Node.js ####");` +``` + +The `console` object is a more powerful facility than just printing output; for instance, it can also print [warnings][36] and [errors][37]. If you want to print the value of a variable, you can convert it to a string and use `console.log()`: + + +``` +`console.log("Slope: " + slope.toString());` +``` + +### Reading data + +Input/output in Node.js uses a [very interesting approach][38]; you can choose either a synchronous or an asynchronous approach. The former uses blocking function calls, and the latter uses non-blocking function calls. In a blocking function, the program stops there and waits until the function finishes its task, whereas non-blocking functions do not stop the execution but continue their task somehow and somewhere else. + +You have a couple of options here: you could periodically check whether the function ended, or the function could notify you when it ends. This tutorial uses the second approach: it employs [an `EventEmitter`][39] that generates an [event][40] associated with a callback function. The callback executes when the event is triggered. + +First, generate the `EventEmitter`: + + +``` +`const myEmitter = new EventEmitter();` +``` + +Then associate the file-reading's end with an event called `myEmitter`. Although you do not need to follow this path for this simple example—you could use a simple blocking call—it is a very powerful approach that can be very useful in other situations. Before doing that, add another piece to this section for using the CSV Parse library to do the data reading. This library provides [several approaches][41] you can choose from, but this example uses the [stream API][42] with a [pipe][43]. The library needs some configuration, which is defined in an object: + + +``` +const csvOptions = {'separator': delimiter, +                    'skipLines': skipHeader, +                    'headers': false}; +``` + +Since you've defined the options, you can read the file: + + +``` +fs.createReadStream(inputFileName) +  .pipe(csv(csvOptions)) +  .on('data', (datum) => data.push({'x': Number(datum[columnX]), 'y': Number(datum[columnY])})) +  .on('end', () => myEmitter.emit('reading-end')); +``` + +I'll walk through each line of this short, dense code snippet: + + * `fs.createReadStream(inputFileName)` opens a [stream of data][44] that is read from the file. A stream gradually reads a file in chunks. + * `.pipe(csv(csvOptions))` forwards the stream to the CSV Parse library that handles the difficult task of reading the file and parsing it. + * `.on('data', (datum) => data.push({'x': Number(datum[columnX]), 'y': Number(datum[columnY])}))` is rather dense, so I will break it out: + * `(datum) => ...` defines a function to which each row of the CSV file will be passed. + * `data.push(...` adds the newly read data to the `data` array. + * `{'x': ..., 'y': ...}` constructs a new data point with `x` and `y` members. + * `Number(datum[columnX])` converts the element in `columnX` to a number. + * `.on('end', () => myEmitter.emit('reading-end'));` uses the emitter you created to notify you when the file-reading finishes. + + + +When the emitter emits the `reading-end` event, you know that the file was completely parsed and its contents are in the `data` array. + +### Fitting data + +Now that you filled the `data` array, you can analyze the data in it. The function that carries out the analysis is associated with the `reading-end` event of the emitter you defined, so you can be sure that the data is ready. The emitter associates a callback function to that event and executes the function when the event is triggered. + + +``` +myEmitter.on('reading-end', function () { +    const fit_data = data.map((datum) => [datum.x, datum.y]); + +    const result = regression.linear(fit_data); +    const slope = result.equation[0]; +    const intercept = result.equation[1]; + +    console.log("Slope: " + slope.toString()); +    console.log("Intercept: " + intercept.toString()); + +    const x = data.map((datum) => datum.x); +    const y = data.map((datum) => datum.y); + +    const r_value = ss.sampleCorrelation(x, y); + +    console.log("Correlation coefficient: " + r_value.toString()); + +    myEmitter.emit('analysis-end', data, slope, intercept); +}); +``` + +The statistics libraries expect data in different formats, so employ the [`map()` method][45] of the `data` array. `map()` creates a new array from an existing one and applies a function to each array element. The arrow functions are very practical in this context due to their conciseness. When the analysis finishes, you can trigger a new event to continue in a new callback. You could also directly plot the data in this function, but I opted to continue in a new one because the analysis could be a very lengthy process. By emitting the `analysis-end` event, you also pass the relevant data from this function to the next callback. + +### Plotting + +[D3.js][46] is a [very powerful][47] library for plotting data. The learning curve is rather steep, probably because it is a [misunderstood library][48], but it is the best open source option I've found for server-side plotting. My favorite D3.js feature is probably that it works on SVG images. D3.js was designed to run in a web browser, so it assumes it has a web page to handle. Working server-side is a very different environment, and you need a [virtual web page][49] to work on. Luckily, [D3-Node][50] makes this process very simple. + +Begin by defining some useful measurements that will be required later: + + +``` +const figDPI = 100; +const figWidth = 7 * figDPI; +const figHeight = figWidth / 16 * 9; +const margins = {top: 20, right: 20, bottom: 50, left: 50}; + +let plotWidth = figWidth - margins.left - margins.right; +let plotHeight = figHeight - margins.top - margins.bottom; + +let minX = d3.min(data, (datum) => datum.x); +let maxX = d3.max(data, (datum) => datum.x); +let minY = d3.min(data, (datum) => datum.y); +let maxY = d3.max(data, (datum) => datum.y); +``` + +You have to convert between the data coordinates and the plot (image) coordinates. You can use scales for this conversion: the scale's domain is the data space where you pick the data points, and the scale's range is the image space where you put the points: + + +``` +let scaleX = d3.scaleLinear() +               .range([0, plotWidth]) +               .domain([minX - 1, maxX + 1]); +let scaleY = d3.scaleLinear() +               .range([plotHeight, 0]) +               .domain([minY - 1, maxY + 1]); + +const axisX = d3.axisBottom(scaleX).ticks(10); +const axisY = d3.axisLeft(scaleY).ticks(10); +``` + +Note that the `y` scale has an inverted range because in the SVG standard, the `y` scale's origin is at the top. After defining the scales, start drawing the plot on a newly created SVG image: + + +``` +let svg = d3n.createSVG(figWidth, figHeight) + +svg.attr('background-color', 'white'); + +svg.append("rect") +   .attr("width", figWidth) +   .attr("height", figHeight) +   .attr("fill", 'white'); +``` + +First, draw the interpolating line appending a `line` element to the SVG image: + + +``` +svg.append("g") +   .attr('transform', `translate(${margins.left}, ${margins.top})`) +   .append("line") +   .attr("x1", scaleX(minX - 1)) +   .attr("y1", scaleY((minX - 1) * slope + intercept)) +   .attr("x2", scaleX(maxX + 1)) +   .attr("y2", scaleY((maxX + 1) * slope + intercept)) +   .attr("stroke", "#1f77b4"); +``` + +Then add a `circle` for each data point to the right location. D3.js's key point is that it associates data with SVG elements. Thus, you use the `data()` method to associate the data points to the circles you create. The [`enter()` method][51] tells the library what to do with the newly associated data: + + +``` +svg.append("g") +   .attr('transform', `translate(${margins.left}, ${margins.top})`) +   .selectAll("circle") +   .data(data) +   .enter() +   .append("circle") +   .classed("circle", true) +   .attr("cx", (d) => scaleX(d.x)) +   .attr("cy", (d) => scaleY(d.y)) +   .attr("r", 3) +   .attr("fill", "#ff7f0e"); +``` + +The last elements you draw are the axes and their labels; this is so you can be sure they overlap the plot lines and circles: + + +``` +svg.append("g") +   .attr('transform', `translate(${margins.left}, ${margins.top + plotHeight})`) +   .call(axisX); + +svg.append("g") +   .append("text") +   .attr("transform", `translate(${margins.left + 0.5 * plotWidth}, ${margins.top + plotHeight + 0.7 * margins.bottom})`) +  .style("text-anchor", "middle") +  .text("X"); + +svg.append("g") +   .attr('transform', `translate(${margins.left}, ${margins.top})`) +   .call(axisY); + +svg.append("g") +   .attr("transform", `translate(${0.5 * margins.left}, ${margins.top + 0.5 * plotHeight})`) +   .append("text") +   .attr("transform", "rotate(-90)") +  .style("text-anchor", "middle") +  .text("Y"); +``` + +Finally, save the plot to an SVG file. I opted for a synchronous write of the file, so I could show this [second approach][52]: + + +``` +`fs.writeFileSync("fit_node.svg", d3n.svgString());` +``` + +### Results + +Running the script is as simple as: + + +``` +`$ node fitting_node.js` +``` + +And the command-line output is: + + +``` +#### Anscombe's first set with JavaScript in Node.js #### +Slope: 0.5 +Intercept: 3 +Correlation coefficient: 0.8164205163448399 +``` + +Here is the image I generated with D3.js and Node.js: + +![Plot and fit of the dataset obtained with Node.js][53] + +(Cristiano Fontana, [CC BY-SA 4.0][54]) + +### Conclusion + +JavaScript is a very popular language for [serverless computing][55], so this example of server-side data analysis and plotting with Node.js is not unlikely. The two most interesting parts in this tutorial are probably the introduction to the event-driven architecture (for people getting started with Node.js) and the example of server-side plotting (for more knowledgeable readers). + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/server-side-data-science-nodejs + +作者:[Cristiano L. Fontana][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/About_JavaScript +[3]: https://en.wikipedia.org/wiki/Lingua_franca +[4]: https://en.wikipedia.org/wiki/Source-to-source_compiler +[5]: https://www.destroyallsoftware.com/talks/wat +[6]: https://www.youtube.com/watch?v=_DKkVvOt6dk +[7]: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey +[8]: https://nodejs.org/en/ +[9]: https://en.wikipedia.org/wiki/Event-driven_architecture +[10]: https://en.wikipedia.org/wiki/Asynchrony_%28computer_programming%29 +[11]: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await +[12]: https://en.wikipedia.org/wiki/Comma-separated_values +[13]: https://en.wikipedia.org/wiki/Anscombe%27s_quartet +[14]: https://opensource.com/article/20/2/python-gnu-octave-data-science +[15]: https://opensource.com/article/20/2/c-data-science +[16]: https://gitlab.com/cristiano.fontana/polyglot_fit +[17]: https://www.npmjs.com/ +[18]: https://getfedora.org/ +[19]: https://docs.npmjs.com/configuring-npm/folders.html +[20]: https://csv.js.org/parse/ +[21]: https://simplestatistics.org/ +[22]: http://tom-alexander.github.io/regression-js/ +[23]: https://bradoyler.com/projects/d3-node/ +[24]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Comments +[25]: https://nodejs.org/en/knowledge/getting-started/what-is-require/ +[26]: https://gist.github.com/hallettj/64478 +[27]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var +[28]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let +[29]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const +[30]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new +[31]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function +[32]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function +[33]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions +[34]: https://nodejs.org/api/console.html +[35]: https://nodejs.org/api/console.html#console_console_log_data_args +[36]: https://nodejs.org/api/console.html#console_console_warn_data_args +[37]: https://nodejs.org/api/console.html#console_console_error_data_args +[38]: https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/ +[39]: https://nodejs.org/api/events.html#events_class_eventemitter +[40]: https://nodejs.org/api/events.html#events_events +[41]: https://csv.js.org/parse/api/ +[42]: https://csv.js.org/parse/api/stream/ +[43]: https://csv.js.org/parse/recipies/stream_pipe/ +[44]: https://nodejs.org/api/stream.html#stream_stream +[45]: https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/map +[46]: https://d3js.org/ +[47]: https://observablehq.com/@d3/gallery +[48]: https://medium.com/dailyjs/the-trouble-with-d3-4a84f7de011f +[49]: https://github.com/jsdom/jsdom +[50]: https://github.com/d3-node/d3-node +[51]: https://www.d3indepth.com/enterexit/ +[52]: https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options +[53]: https://opensource.com/sites/default/files/uploads/fit_node.jpg (Plot and fit of the dataset obtained with Node.js) +[54]: https://creativecommons.org/licenses/by-sa/4.0/ +[55]: https://en.wikipedia.org/wiki/Serverless_computing diff --git a/sources/tech/20200624 Why you should use Node.js for data science.md b/sources/tech/20200624 Why you should use Node.js for data science.md new file mode 100644 index 0000000000..86f6f2ca43 --- /dev/null +++ b/sources/tech/20200624 Why you should use Node.js for data science.md @@ -0,0 +1,450 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Why you should use Node.js for data science) +[#]: via: (https://opensource.com/article/20/6/data-science-nodejs) +[#]: author: (Cristiano L. Fontana https://opensource.com/users/cristianofontana) + +Why you should use Node.js for data science +====== +Node.js and other JavaScript libraries are excellent choices for data +science. Here's why. +![Computer screen with files or windows open][1] + +[JavaScript][2] (also known as JS) is the [lingua franca][3] of the web, as it is supported by all the major web browsers—the other languages that run in browsers are [transpiled][4] (or translated) to JavaScript. Sometimes JS [can be confusing][5], but I find it pleasant to use because I try to stick to the [good parts][6]. JavaScript was created to run in a browser, but it can also be used in other contexts, such as an [embedded language][7] or for [server-side applications][8]. + +In this tutorial, I will explain how to write a program that will run in Node.js, which is a runtime environment that can execute JavaScript applications. What I like the most about Node.js is its [event-driven architecture][9] for [asynchronous programming][10]. With this approach, functions (aka callbacks) can be attached to certain events; when the attached event occurs, the callback executes. This way, the developer does not have to write a main loop because the runtime takes care of that. + +JavaScript also has new [async functions][11] that use a different syntax, but I think they hide the event-driven architecture too well to use them in a how-to article. So, in this tutorial, I will use the traditional callbacks approach, even though it is not necessary for this case. + +### Understanding the program task + +The program task in this tutorial is to: + + * Read some data from a [CSV file][12] that contains the [Anscombe's quartet][13] dataset + * Interpolate the data with a straight line (i.e., _f(x) = m·x + q_) + * Plot the result to an image file + + + +For more details about this task, you can read the previous articles in this series, which do the same task in [Python and GNU Octave][14] and [C and C++][15]. The full source code for all the examples is available in my [polyglot_fit repository][16] on GitLab. + +### Installing + +Before you can run this example, you must install Node.js and its package manager [npm][17]. To install them on [Fedora][18], run: + + +``` +`$ sudo dnf install nodejs npm` +``` + +On Ubuntu: + + +``` +`$ sudo apt install nodejs npm` +``` + +Next, use `npm` to install the required packages. Packages are installed in a local [`node_modules` subdirectory][19], so Node.js can search for packages in that folder. The required packages are: + + * [CSV Parse][20] for parsing the CSV file + * [Simple Statistics][21] for calculating the data correlation factor + * [Regression-js][22] for determining the fitting line + * [D3-Node][23] for server-side plotting + + + +Run npm to install the packages: + + +``` +`$ npm install csv-parse simple-statistics regression d3-node` +``` + +### Commenting code + +Just like in C, in JavaScript, you can insert [comments][24] by putting `//` before your comment, and the interpreter will discard the rest of the line. Another option: JavaScript will discard anything between `/*` and `*/`: + + +``` +// This is a comment ignored by the interpreter. +/* Also this is ignored */ +``` + +### Loading modules + +You can load modules with the [`require()` function][25]. The function returns an object that contains a module's functions: + + +``` +const EventEmitter = require('events'); +const fs = require('fs'); +const csv = require('csv-parser'); +const regression = require('regression'); +const ss = require('simple-statistics'); +const D3Node = require('d3-node'); +``` + +Some of these modules are part of the Node.js standard library, so you do not need to install them with npm. + +### Defining variables + +Variables do not have to be declared before they are used, but if they are used without a declaration, they will be defined as global variables. Generally, global variables are considered bad practice, as they could lead to [bugs][26] if they're used carelessly. To declare a variable, you can use the [var][27], [let][28], and [const][29] statements. Variables can contain any kind of data (even functions!). You can create some objects by applying the [`new` operator][30] to a constructor function: + + +``` +const inputFileName = "anscombe.csv"; +const delimiter = "\t"; +const skipHeader = 3; +const columnX = String(0); +const columnY = String(1); + +const d3n = new D3Node(); +const d3 = d3n.d3; + +var data = []; +``` + +Data read from the CSV file is stored in the `data` array. Arrays are dynamic, so you do not have to decide their size beforehand. + +### Defining functions + +There are several ways to define functions in JavaScript. For example, the [function declaration][31] allows you to directly define a function: + + +``` +function triplify(x) { +    return 3 * x; +} + +// The function call is: +triplify(3); +``` + +You can also declare a function with an [expression][32] and store it in a variable: + + +``` +var triplify = function (x) { +    return 3 * x; +} + +// The function call is still: +triplify(3); +``` + +Finally, you can use the [arrow function expression][33], a syntactically short version of a function expression, but it has [some limitations][33]. It is generally used for concise functions that do simple calculations on its arguments: + + +``` +var triplify = (x) => 3 * x; + +// The function call is still: +triplify(3); +``` + +### Printing output + +In order to print on the terminal, you can use the built-in [`console` object][34] in the Node.js standard library. The [`log()` method][35] prints on the terminal (adding a newline at the end of the string): + + +``` +`console.log("#### Anscombe's first set with JavaScript in Node.js ####");` +``` + +The `console` object is a more powerful facility than just printing output; for instance, it can also print [warnings][36] and [errors][37]. If you want to print the value of a variable, you can convert it to a string and use `console.log()`: + + +``` +`console.log("Slope: " + slope.toString());` +``` + +### Reading data + +Input/output in Node.js uses a [very interesting approach][38]; you can choose either a synchronous or an asynchronous approach. The former uses blocking function calls, and the latter uses non-blocking function calls. In a blocking function, the program stops there and waits until the function finishes its task, whereas non-blocking functions do not stop the execution but continue their task somehow and somewhere else. + +You have a couple of options here: you could periodically check whether the function ended, or the function could notify you when it ends. This tutorial uses the second approach: it employs [an `EventEmitter`][39] that generates an [event][40] associated with a callback function. The callback executes when the event is triggered. + +First, generate the `EventEmitter`: + + +``` +`const myEmitter = new EventEmitter();` +``` + +Then associate the file-reading's end with an event called `myEmitter`. Although you do not need to follow this path for this simple example—you could use a simple blocking call—it is a very powerful approach that can be very useful in other situations. Before doing that, add another piece to this section for using the CSV Parse library to do the data reading. This library provides [several approaches][41] you can choose from, but this example uses the [stream API][42] with a [pipe][43]. The library needs some configuration, which is defined in an object: + + +``` +const csvOptions = {'separator': delimiter, +                    'skipLines': skipHeader, +                    'headers': false}; +``` + +Since you've defined the options, you can read the file: + + +``` +fs.createReadStream(inputFileName) +  .pipe(csv(csvOptions)) +  .on('data', (datum) => data.push({'x': Number(datum[columnX]), 'y': Number(datum[columnY])})) +  .on('end', () => myEmitter.emit('reading-end')); +``` + +I'll walk through each line of this short, dense code snippet: + + * `fs.createReadStream(inputFileName)` opens a [stream of data][44] that is read from the file. A stream gradually reads a file in chunks. + * `.pipe(csv(csvOptions))` forwards the stream to the CSV Parse library that handles the difficult task of reading the file and parsing it. + * `.on('data', (datum) => data.push({'x': Number(datum[columnX]), 'y': Number(datum[columnY])}))` is rather dense, so I will break it out: + * `(datum) => ...` defines a function to which each row of the CSV file will be passed. + * `data.push(...` adds the newly read data to the `data` array. + * `{'x': ..., 'y': ...}` constructs a new data point with `x` and `y` members. + * `Number(datum[columnX])` converts the element in `columnX` to a number. + * `.on('end', () => myEmitter.emit('reading-end'));` uses the emitter you created to notify you when the file-reading finishes. + + + +When the emitter emits the `reading-end` event, you know that the file was completely parsed and its contents are in the `data` array. + +### Fitting data + +Now that you filled the `data` array, you can analyze the data in it. The function that carries out the analysis is associated with the `reading-end` event of the emitter you defined, so you can be sure that the data is ready. The emitter associates a callback function to that event and executes the function when the event is triggered. + + +``` +myEmitter.on('reading-end', function () { +    const fit_data = data.map((datum) => [datum.x, datum.y]); + +    const result = regression.linear(fit_data); +    const slope = result.equation[0]; +    const intercept = result.equation[1]; + +    console.log("Slope: " + slope.toString()); +    console.log("Intercept: " + intercept.toString()); + +    const x = data.map((datum) => datum.x); +    const y = data.map((datum) => datum.y); + +    const r_value = ss.sampleCorrelation(x, y); + +    console.log("Correlation coefficient: " + r_value.toString()); + +    myEmitter.emit('analysis-end', data, slope, intercept); +}); +``` + +The statistics libraries expect data in different formats, so employ the [`map()` method][45] of the `data` array. `map()` creates a new array from an existing one and applies a function to each array element. The arrow functions are very practical in this context due to their conciseness. When the analysis finishes, you can trigger a new event to continue in a new callback. You could also directly plot the data in this function, but I opted to continue in a new one because the analysis could be a very lengthy process. By emitting the `analysis-end` event, you also pass the relevant data from this function to the next callback. + +### Plotting + +[D3.js][46] is a [very powerful][47] library for plotting data. The learning curve is rather steep, probably because it is a [misunderstood library][48], but it is the best open source option I've found for server-side plotting. My favorite D3.js feature is probably that it works on SVG images. D3.js was designed to run in a web browser, so it assumes it has a web page to handle. Working server-side is a very different environment, and you need a [virtual web page][49] to work on. Luckily, [D3-Node][50] makes this process very simple. + +Begin by defining some useful measurements that will be required later: + + +``` +const figDPI = 100; +const figWidth = 7 * figDPI; +const figHeight = figWidth / 16 * 9; +const margins = {top: 20, right: 20, bottom: 50, left: 50}; + +let plotWidth = figWidth - margins.left - margins.right; +let plotHeight = figHeight - margins.top - margins.bottom; + +let minX = d3.min(data, (datum) => datum.x); +let maxX = d3.max(data, (datum) => datum.x); +let minY = d3.min(data, (datum) => datum.y); +let maxY = d3.max(data, (datum) => datum.y); +``` + +You have to convert between the data coordinates and the plot (image) coordinates. You can use scales for this conversion: the scale's domain is the data space where you pick the data points, and the scale's range is the image space where you put the points: + + +``` +let scaleX = d3.scaleLinear() +               .range([0, plotWidth]) +               .domain([minX - 1, maxX + 1]); +let scaleY = d3.scaleLinear() +               .range([plotHeight, 0]) +               .domain([minY - 1, maxY + 1]); + +const axisX = d3.axisBottom(scaleX).ticks(10); +const axisY = d3.axisLeft(scaleY).ticks(10); +``` + +Note that the `y` scale has an inverted range because in the SVG standard, the `y` scale's origin is at the top. After defining the scales, start drawing the plot on a newly created SVG image: + + +``` +let svg = d3n.createSVG(figWidth, figHeight) + +svg.attr('background-color', 'white'); + +svg.append("rect") +   .attr("width", figWidth) +   .attr("height", figHeight) +   .attr("fill", 'white'); +``` + +First, draw the interpolating line appending a `line` element to the SVG image: + + +``` +svg.append("g") +   .attr('transform', `translate(${margins.left}, ${margins.top})`) +   .append("line") +   .attr("x1", scaleX(minX - 1)) +   .attr("y1", scaleY((minX - 1) * slope + intercept)) +   .attr("x2", scaleX(maxX + 1)) +   .attr("y2", scaleY((maxX + 1) * slope + intercept)) +   .attr("stroke", "#1f77b4"); +``` + +Then add a `circle` for each data point to the right location. D3.js's key point is that it associates data with SVG elements. Thus, you use the `data()` method to associate the data points to the circles you create. The [`enter()` method][51] tells the library what to do with the newly associated data: + + +``` +svg.append("g") +   .attr('transform', `translate(${margins.left}, ${margins.top})`) +   .selectAll("circle") +   .data(data) +   .enter() +   .append("circle") +   .classed("circle", true) +   .attr("cx", (d) => scaleX(d.x)) +   .attr("cy", (d) => scaleY(d.y)) +   .attr("r", 3) +   .attr("fill", "#ff7f0e"); +``` + +The last elements you draw are the axes and their labels; this is so you can be sure they overlap the plot lines and circles: + + +``` +svg.append("g") +   .attr('transform', `translate(${margins.left}, ${margins.top + plotHeight})`) +   .call(axisX); + +svg.append("g") +   .append("text") +   .attr("transform", `translate(${margins.left + 0.5 * plotWidth}, ${margins.top + plotHeight + 0.7 * margins.bottom})`) +  .style("text-anchor", "middle") +  .text("X"); + +svg.append("g") +   .attr('transform', `translate(${margins.left}, ${margins.top})`) +   .call(axisY); + +svg.append("g") +   .attr("transform", `translate(${0.5 * margins.left}, ${margins.top + 0.5 * plotHeight})`) +   .append("text") +   .attr("transform", "rotate(-90)") +  .style("text-anchor", "middle") +  .text("Y"); +``` + +Finally, save the plot to an SVG file. I opted for a synchronous write of the file, so I could show this [second approach][52]: + + +``` +`fs.writeFileSync("fit_node.svg", d3n.svgString());` +``` + +### Results + +Running the script is as simple as: + + +``` +`$ node fitting_node.js` +``` + +And the command-line output is: + + +``` +#### Anscombe's first set with JavaScript in Node.js #### +Slope: 0.5 +Intercept: 3 +Correlation coefficient: 0.8164205163448399 +``` + +Here is the image I generated with D3.js and Node.js: + +![Plot and fit of the dataset obtained with Node.js][53] + +(Cristiano Fontana, [CC BY-SA 4.0][54]) + +### Conclusion + +JavaScript is a core technology of today, and it is well suited for data exploration with the right libraries. With this introduction to event-driven architecture and an example of how server-side plotting looks in practice, we can start to consider Node.js and D3.js as alternatives to the common programming languages associated with data science. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/data-science-nodejs + +作者:[Cristiano L. Fontana][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/About_JavaScript +[3]: https://en.wikipedia.org/wiki/Lingua_franca +[4]: https://en.wikipedia.org/wiki/Source-to-source_compiler +[5]: https://www.destroyallsoftware.com/talks/wat +[6]: https://www.youtube.com/watch?v=_DKkVvOt6dk +[7]: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey +[8]: https://nodejs.org/en/ +[9]: https://en.wikipedia.org/wiki/Event-driven_architecture +[10]: https://en.wikipedia.org/wiki/Asynchrony_%28computer_programming%29 +[11]: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await +[12]: https://en.wikipedia.org/wiki/Comma-separated_values +[13]: https://en.wikipedia.org/wiki/Anscombe%27s_quartet +[14]: https://opensource.com/article/20/2/python-gnu-octave-data-science +[15]: https://opensource.com/article/20/2/c-data-science +[16]: https://gitlab.com/cristiano.fontana/polyglot_fit +[17]: https://www.npmjs.com/ +[18]: https://getfedora.org/ +[19]: https://docs.npmjs.com/configuring-npm/folders.html +[20]: https://csv.js.org/parse/ +[21]: https://simplestatistics.org/ +[22]: http://tom-alexander.github.io/regression-js/ +[23]: https://bradoyler.com/projects/d3-node/ +[24]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Comments +[25]: https://nodejs.org/en/knowledge/getting-started/what-is-require/ +[26]: https://gist.github.com/hallettj/64478 +[27]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var +[28]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let +[29]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const +[30]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new +[31]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function +[32]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function +[33]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions +[34]: https://nodejs.org/api/console.html +[35]: https://nodejs.org/api/console.html#console_console_log_data_args +[36]: https://nodejs.org/api/console.html#console_console_warn_data_args +[37]: https://nodejs.org/api/console.html#console_console_error_data_args +[38]: https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/ +[39]: https://nodejs.org/api/events.html#events_class_eventemitter +[40]: https://nodejs.org/api/events.html#events_events +[41]: https://csv.js.org/parse/api/ +[42]: https://csv.js.org/parse/api/stream/ +[43]: https://csv.js.org/parse/recipies/stream_pipe/ +[44]: https://nodejs.org/api/stream.html#stream_stream +[45]: https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/map +[46]: https://d3js.org/ +[47]: https://observablehq.com/@d3/gallery +[48]: https://medium.com/dailyjs/the-trouble-with-d3-4a84f7de011f +[49]: https://github.com/jsdom/jsdom +[50]: https://github.com/d3-node/d3-node +[51]: https://www.d3indepth.com/enterexit/ +[52]: https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options +[53]: https://opensource.com/sites/default/files/uploads/fit_node.jpg (Plot and fit of the dataset obtained with Node.js) +[54]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/sources/tech/20200626 Advice for getting started with GNOME.md b/sources/tech/20200626 Advice for getting started with GNOME.md new file mode 100644 index 0000000000..b1d311e6a9 --- /dev/null +++ b/sources/tech/20200626 Advice for getting started with GNOME.md @@ -0,0 +1,155 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Advice for getting started with GNOME) +[#]: via: (https://opensource.com/article/20/6/gnome-users) +[#]: author: (Opensource.com https://opensource.com/users/admin) + +Advice for getting started with GNOME +====== +The GNOME desktop is a unified interface for Linux that offers lots of +extensions to customize your experience. Here's some advice from GNOME +users on how to get the most from it. +![Digital images of a computer desktop][1] + +GNOME is one of the most popular Linux desktops today. It started as a humble desktop called the GNU Network Object Model Environment (GNOME) and was built on top of the GIMP GTK libraries. Its 1.0 release [was announced in 1999][2], just two years after the project got started. + +Today, the most widely used Linux distributions provide GNOME 3 as their graphical desktop, and it's a great place to start learning Linux. As with any open source desktop, GNOME is extremely amenable to customization. You can alter and add to GNOME until it best suits your unique style of work. + +But the eternal question is: should you? + +We asked GNOME users their thoughts on this question, and some argue it's easier to learn GNOME (and Linux in the process) by using the desktop as delivered from the GNOME developers. + +> Going against the grain, I’d recommend using stock GNOME first and getting completely comfortable with it before delving into any extensions. —John Allison + +> GNOME may need some getting used to. It might turn out to be indigestible, or it might turn out to be the single best way to interact with a Linux machine. Your mileage may vary. —Alexey Rusakov + +> I don’t necessarily like the idea of recommending extensions. While they can be useful, every time someone complains about GNOME being unstable, it ends up being due to some sort of extension. Sometimes I feel as though recommending extensions to GNOME users creates the culture of installing a ginormous number of extensions to make GNOME something that it isn’t, and then the entire desktop comes crashing down. For me, my policy is to use as few extensions as possible. I really like the default GNOME layout with few or no changes. —Jay LaCroix + +It was a common theme among the responses—users new to GNOME should learn GNOME before changing it. + +### New users + +GNOME is deceptively simple—when you turn on your Linux computer, you end up on a desktop with only a few obvious prompts. There's the Activities menu in the upper left corner of the screen and a typical system tray in the upper right. + +Clicking on the Activities menu reveals an overlay containing an application dock. Clicking on the grid icon on the dock shows your installed applications. + +Default apps include the same kinds of services you'd expect from any other desktop—a file manager, PDF reader, network manager, system settings or control panel, and so on. There are also some unexpected but nice defaults. For instance, GNOME includes a robust [virtualization application][3]. + +GNOME has worked its way into becoming the unifying interface for most Linux users. While each distribution has its own convention for package management, software development practices, and nearly everything else, GNOME is a unified front. If you learn GNOME, you learn a common "language" for interacting with the graphical side of Linux. + +GNOME works hard at consistency, too. For instance, one key that is often ignored on keyboards is the Super key, which is the key with (usually) a Windows logo on it, or the Command key on Mac. GNOME uses this as a global hotkey, meaning that, no matter what application you're in, the Super key always talks to GNOME (any application can use the Super key, but few do). That means you have access to desktop functions regardless of what window is currently in focus. + +That's not true for most key combos based around Control or Alt. Being able to "jump" out of an application to access desktop functions is an underrated feature, and once you get used to it, you start to miss it when using other desktops. + +Here's some insight from our responders about acclimating to the GNOME way of doing things: + +> Learn one environment well, and then you may try other ones. —Marcin Juszkiewicz + +> Learn some of the handy shortcuts before attempting to define your own. +> +> * Super+Arrowup to maximize a window +> * Super+Arrowup to minimize a window +> * Super+Arrowleft or Super+ArrowRight to tile the window to take up half the screen +> * Super+PageUP or Super+PageDown to change workspace +> * Launch apps: Super, and then type 3-4 letters of the app you want to Launch (for example, f-i-r-e for Firefox, and so on) +> * Calculations: Super, and then type a simple equation (9*9) for a quick calculation +> + +> +> It’s a beautiful desktop, and it makes learning a new environment fun. Then again, learning something new can also be hard, so if you’re a new user, most of the people responding to us agreed that a slow and steady approach is best. Get familiar with your surroundings before jumping to change everything. —Andreas Nilsson + +> This might be a tough habit to unlearn for many users, but change from _mouse first_ to _Super key first_ for window switching, desktop navigation, launching, and searching. —Tim Quinlan + +### Built-in help + +Need help? There is a tutorial built-in. + +> We have a Help application in GNOME that gets launched at first boot. It has quick videos showing how to launch applications, manage windows and workspaces, and more. You can always find the Help application by searching for it in the Activities screen, or launch help from a terminal. —Felipe Borges + +### Get more apps + +Getting to know a desktop is one thing, but a desktop can only do so much. Obviously, at some point, you're going to want more applications so you can get work done. + +GNOME has an "app store" called Software that offers hundreds of open source applications you can install with a single click. It's topical, convenient, and easy. + +![GNOME software installer][4] + +### Experienced users + +If you're used to trying out different Linux desktops, then customizing your environment is nothing new to you. For GNOME, the easiest and most obvious way to customize the desktop beyond what GNOME provides you in Settings is [Tweaks][5], available from your Software app. + +![GNOME tweaks menu][6] + +Tweaks lets you customize practically anything—themes, the buttons that show up in your window bars, GNOME extensions, fonts, power settings, startup applications, and much more. + +Here is how some users set up their GNOME desktops: + +> [Matt Broberg][7] +> +> * Learn how to [get started with GNOME extensions][8]. +> * Customize the look of GNOME with [GNOME-look.org][9]. +> * All GNOME customizations (extensions included) are saved to a user’s `$HOME/.config` directory, so if I migrate my home directory to another computer, or I put my configs into Git management, I can keep my environment consistent. +> + + +> Daniel Alley +> +> * Install [Dash to Dock][10], [Caffeine][11], [Disconnect Wifi][12], and [Sound Input and Output Device Chooser][13] extensions. +> * Enable minimize and maximize buttons in window bars with GNOME Tweak tool. +> + + +> Grzegorz Grzybek +> +> * One of my favorite extensions is [GTK Title Bar][14], which removes title bars of non-GNOME apps when they’re put into fullscreen mode. +> + + +### Try something the same, or try something different + +GNOME was a direct response to the KDE desktop, which, at the time, was not licensed as [free software][15], and its original design played to the expectations of a KDE user. + +![GNOME desktop example with Fedora][16] + +It has come a long way since the early days and stands beside (and in many ways surpasses) the best-known desktops on other platforms. GNOME 3 is a progressive desktop, moving toward a unified interface for interfaces driven by keyboard, mouse, and touch. It's designed to balance beauty with resource requirements, innovation with familiarity, and efficiency with intuition. + +![GNOME 3 desktop][17] + +But if you're finding that you're familiar enough with GNOME but still not enjoying it, then there's nothing stopping you from trying something entirely different. In fact, it's common to try many different [desktops and window managers][18] on Linux and BSD because having choice in how you interact with your own computer is arguably the best embodiment of the open source spirit. You get to use your technology on your own terms. You never have to settle for what somebody else thinks is best. + +How do you configure GNOME? Do you use GNOME or a different desktop? Tell us in the comments! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/gnome-users + +作者:[Opensource.com][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/admin +[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://www.gnome.org/press/1999/03/gnome-1-0-released/ +[3]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization +[4]: https://opensource.com/sites/default/files/uploads/gnome-software-installer.png (GNOME software installer) +[5]: https://wiki.gnome.org/action/show/Apps/Tweaks?action=show&redirect=Apps%2FGnomeTweakTool +[6]: https://opensource.com/sites/default/files/uploads/gnome-tweaks.png (GNOME tweaks menu) +[7]: https://opensource.com/users/mbbroberg +[8]: https://extensions.gnome.org +[9]: https://www.gnome-look.org +[10]: https://extensions.gnome.org/extension/307/dash-to-dock/ +[11]: https://extensions.gnome.org/extension/517/caffeine/ +[12]: https://extensions.gnome.org/extension/904/disconnect-wifi/ +[13]: https://extensions.gnome.org/extension/906/sound-output-device-chooser/ +[14]: https://extensions.gnome.org/extension/1732/gtk-title-bar/ +[15]: https://www.fsf.org/about/what-is-free-software +[16]: https://opensource.com/sites/default/files/uploads/gnome_desktop.png (GNOME desktop example with Fedora) +[17]: https://opensource.com/sites/default/files/uploads/advent-gnome_0.jpg (GNOME 3 desktop) +[18]: https://opensource.com/article/20/5/linux-desktops diff --git a/sources/tech/20200629 Scaling a GraphQL Website.md b/sources/tech/20200629 Scaling a GraphQL Website.md new file mode 100644 index 0000000000..5434cc1032 --- /dev/null +++ b/sources/tech/20200629 Scaling a GraphQL Website.md @@ -0,0 +1,336 @@ +[#]: collector: (lujun9972) +[#]: translator: (MjSeven) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Scaling a GraphQL Website) +[#]: via: (https://theartofmachinery.com/2020/06/29/scaling_a_graphql_site.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) + +Scaling a GraphQL Website +====== + +For obvious reasons, I normally write abstractly about work I’ve done for other people, but I’ve been given permission to write about a website, [Vocal][1], that I did some SRE work on last year. I actually gave [a presentation at GraphQL Sydney back in February][2], but for various reasons it’s taken me this long to get it into a blog post. + +Vocal is a GraphQL-based website that got traction and hit scaling problems that I got called in to fix. Here’s what I did. Obviously, you’ll find this post useful if you’re scaling another GraphQL website, but most of it’s representative of what you have to deal with when a site gets enough traffic to cause technical problems. If website scalability is a key interest of yours, you might want to read [my recent post about scalability][3] first. + +### Vocal + +![][4] + +Vocal is a blogging platform publishing everything from diaries to movie reviews to opinion pieces to recipes to professional and amateur photography to beauty and lifestyle tips and poetry. Of course, there’s no shortage of proud pet owners with cute cat and dog pictures. + +![][5] + +One thing that’s a bit different about Vocal is that it lets everyday people get paid for producing works that viewers find interesting. Authors get a small amount of money per page view, and can also receive donations from other users. There are professionals using the platform to show off their work, but for most users it’s just a fun hobby that happens to make some extra pocket money as a bonus. + +Vocal is the product of [Jerrick Media][6], a New Jersey startup. Development started in 2015 in collaboration with [Thinkmill][7], a medium-sized Sydney software development consultancy that specialises in all things JavaScript, React and GraphQL. + +### Some spoilers for the rest of this post + +I was told that unfortunately I can’t give hard traffic numbers for legal reasons, but publicly available information can give an idea. Alexa ranks all websites it knows of by traffic level. Here’s a plot of Alexa rank I showed in my talk, showing growth from November 2019 up to getting ranked number 5,567 in the world by February. + +![Vocal global Alexa rank rising from#9,574 in November 2019 to #5,567 in February 2020.][8] + +It’s normal for the curve to slow down because it requires more and more traffic to win each position. Vocal is now at around #4,900. Obviously there’s a long way to go, but that’s not shabby at all for a startup. Most startups would gladly swap their Alexa rank with Vocal. + +Shortly after the site was upgraded, Jerrick Media ran a marketing campaign that doubled traffic. All we had to do on the technical side was watch numbers go up in the dashboards. In the past 9 months since launch, there have only been two platform issues needing staff intervention: [the once-in-five-years AWS RDS certificate rotation that landed in March][9], and an app rollout hitting a Terraform bug. I’ve been very happy with how little platform busywork is needed to keep Vocal running. + +Here’s an overview of the technical stuff I’ll talk about in this post: + + * Technical and historical background + * Database migration from MongoDB to Postgres + * Deployment infrastructure revamp + * Making the app compatible with scaling + * Making HTTP caching work + * Miscellaneous performances tweaks + + + +### Some background + +Thinkmill built a website using [Next.js][10] (a React-based web framework), talking to a GraphQL API provided by [Keystone][11] in front of MongoDB. Keystone is a GraphQL-based headless CMS library: you define a schema in JavaScript, hook it up to some data storage, and get an automatically generated GraphQL API for data access. It’s a free and open-source software project that’s commercially backed by Thinkmill. + +#### Vocal V2 + +The version 1 of Vocal got traction. It found a userbase that liked the product, and it grew, and eventually Jerrick Media asked Thinkmill to help develop a version 2, which was successfully launched in September last year. The Jerrick Media folk avoided the [second system effect][12] by generally basing changes on user feedback, so they were [mostly UI and feature changes that I won’t go into][13]. Instead, I’ll talk about the stuff I was brought in for: making the new site more robust and scalable. + +For the record, I’m thankful that I got to work with Jerrick Media and Thinkmill on Vocal, and that they let me present this story, but [I’m still an independent consultant][14]. I wasn’t paid or even asked to write this post, and this is still my own personal blog. + +### The database migration + +Thinkmill suffered several scalability problems with using MongoDB for Vocal, and decided to upgrade Keystone to version 5 to take advantage of its new Postgres support. + +If you’ve been in tech long enough to remember the “NoSQL” marketing from the end of the 00s, that might surprise you. The message was that relational (SQL) databases like Postgres aren’t as scalable as “webscale” NoSQL databases like MongoDB. It’s technically true, but the scalability of NoSQL databases comes from compromises in the variety of queries that can be efficiently handled. Simple, non-relational databases (like document and key-value databases) have their places, but when used as a general-purpose backend for an app, the app often outgrows the querying limitations of the database before it outgrows the theoretical scaling limit a relational database would have. Most of Vocal’s DB queries worked just fine with MongoDB, but over time more and more queries needed hacks to work at all. + +In terms of technical requirements, Vocal is very similar to Wikipedia, one of the biggest sites in the world. Wikipedia runs on MySQL (or rather, its fork, MariaDB). Sure, some significant engineering is needed to make that work, but I don’t see relational databases being a serious threat to Vocal’s scaling in the foreseeable future. + +At one point I checked, the managed AWS RDS Postgres instances cost less than a fifth of the old MongoDB instances, yet CPU usage of the Postgres instances was still under 10%, despite serving more traffic than the old site. That’s mostly because of a few important queries that just never were efficient under the document database architecture. + +The migration could be a blog post of its own, but basically a Thinkmill dev built an [ETL pipeline][15] using [MoSQL][16] to do the heavy lifting. Thanks to Keystone being a FOSS project, I was also able to contribute some performance improvements to its GraphQL to SQL mapping. For that kind of stuff, I always recommend Markus Winand’s SQL blogs: [Use the Index Luke][17] and [Modern SQL][18]. His writing is friendly and accessible to non-experts, yet has most of the theory you need for writing fast and effective SQL. A good, DB-specific book on performance gives you the rest. + +### The platform + +#### The architecture + +V1 was a couple of Node.js apps running on a single virtual private server (VPS) behind Cloudflare as a CDN. I’m a fan of avoiding overengineering as a high priority, so that gets a thumbs up from me. However, by the time V2 development started, it was obvious that Vocal had outgrown that simple architecture. It didn’t give Thinkmillers many options when handling big traffic spikes, and it made updates hard to deploy safely and without downtime. + +Here’s the new architecture for V2: + +![Architecture of Vocal V2. Requests come through a CDN to a load balancer in AWS. The load balancer distributes traffic to two apps, "Platform" and "Website". "Platform" is a Keystone app storing data in Redis and Postgres.][19] + +Basically, the two Node.js apps have been replicated and put behind a load balancer. Yes, that’s it. In my SRE work, I often meet engineers who expect a scalable architecture to be more complicated than that, but I’ve worked on sites that are orders of magnitude bigger than Vocal but are still just replicated services behind load balancers, with DB backends. If you think about it, if the platform architecture needs to keep getting significantly more complicated as the site grows, it’s not really very scalable. Website scalability is mostly about fixing the many little implementation details that prevent scaling. + +Vocal’s architecture might need a few additions if traffic grows enough, but the main reason it would get more complicated is new features. For example, if (for some reason) Vocal needed to handle real-time geospatial data in future, that would be a very different technical beast from blog posts, so I’d expect architectural changes for it. Most of the complexity in big site architecture is because of feature complexity. + +If you don’t know how to make your architecture scalable, I always recommend keeping it as simple as you can. Fixing an architecture that’s too simple is easier and cheaper than fixing an architecture that’s too complex. Also, an unnecessarily complex architecture is more likely to have mistakes, and those mistakes will be harder to debug. + +By the way, Vocal happened to be split into two apps, but that’s not important. A common scaling mistake is to prematurely split an app into smaller services in the name of scalability, but split the app in the wrong place and cause more scalability problems overall. Vocal could have scaled okay as a monolithic app, but the split is also in a good place. + +#### The infrastructure + +Thinkmill has a few people who have experience working with AWS, but it’s primarily a dev shop and needed something more “hands off” than the old Vocal deployment. I ended up deploying the new Vocal on [AWS Fargate][20], which is a relatively new backend to Elastic Container Service (ECS). In the old days, many people wanted ECS to be a simple “run my Docker container as a managed service” product, and were disappointed that they still had to build and manage their own server cluster. With ECS Fargate, AWS manages the cluster. It supports running Docker containers with the basic nice things like replication, health checking, rolling updates, autoscaling and simple alerting. + +A good alternative would have been a managed Platform-as-a-Service (PaaS) like App Engine or Heroku. Thinkmill was already using them for simple projects, but often needed more flexibility with other projects. There are much bigger sites running on PaaSes, but Vocal is at a scale where a custom cloud deployment can make sense economically. + +Another obvious alternative would have been Kubernetes. Kubernetes has a lot more features than ECS Fargate, but it’s a lot more expensive — both in resource overhead, and the staffing needed for maintenance (such as regular node upgrades). As a rule, I don’t recommend Kubernetes to any place that doesn’t have dedicated DevOps staff. Fargate has the features Vocal needs, and has let Thinkmill and Jerrick Media focus on website improvements, not infrastructure busywork. + +Yet another option was “Serverless” function products like AWS Lambda or Google Cloud Functions. They’re great for handling services with very low or highly irregular traffic, but (as I’ll explain) ECS Fargate’s autoscaling is enough for Vocal’s backend. Another plus of these products is that they allow developers to deploy things in cloud environments without needing to learn a lot about cloud environments. The tradeoff is that the Serverless product becomes tightly coupled to the development process, and to the testing and debugging processes. Thinkmill already had enough AWS expertise in-house to manage a Fargate deployment, and any dev who knows how to make a Node.js Express Hello World app can work on Vocal without learning anything about either Serverless functions or Fargate. + +An obvious downside of ECS Fargate is vendor lock-in. However, avoiding vendor lock-in is a tradeoff like avoiding downtime. If you’re worried about migrating, it doesn’t make sense to spend more on platform independence than you would on a migration. The total amount of Fargate-specific code in Vocal is <500 lines of [Terraform][21]. The most important thing is that the Vocal app code itself is platform agnostic. It can run on normal developer machines, and then be packaged up into a Docker container that can run practically anywhere a Docker container can, including ECS Fargate. + +Another downside of Fargate is that it’s not trivial to set up. Like most things in AWS, it’s in a world of VPCs, subnets, IAM policies, etc. Fortunately, that kind of stuff is quite static (unlike a server cluster that requires maintenance). + +### Making a scaling-ready app + +There’s a bunch of stuff to get right if you want to run an app painlessly at scale. You’re doing well if you follow [the Twelve-Factor App design][22], so I won’t repeat it here. + +There’s no point building a “scalable” system if staff can’t operate it at scale — that’s like putting a jet engine on a unicycle. An important part of making Vocal scalable was setting up stuff like CI/CD and [infrastructure as code][23]. Similarly, some deployment ideas aren’t worth it because they make production too different from the development environment (see also [point #10 of the Twelve-Factor App][24]). Every difference between production and development slows app development and can be expected to lead to a bug eventually. + +### Caching + +Caching is a really big topic — I once gave [a presentation on just HTTP caching][25], and that still wasn’t enough. I’ll stick to the essentials for GraphQL here. + +First, an important warning: Whenever you have performance problems, you might wonder, “Can I make this faster by putting this value into a cache for future reuse?” **Microbenchmarks will practically _always_ tell you the answer is “yes”.** However, putting caches everywhere will tend to make your overall system **slower**, thanks to problems like cache coherency. Here’s my mental checklist for caching: + + 1. Ask if the performance problem needs to be solved with caching + 2. Really ask (non-caching performance wins tend to be more robust) + 3. Ask if the problem can be solved by improving existing caches + 4. If all else fails, maybe add a new cache + + + +One cache system you’ll always have is the HTTP caching system, so a corollary is that it’s a good idea to use HTTP caching effectively before trying to add extra caches. I’ll focus on that in this post. + +Another very common trap is using a hash map or something inside the app for caching. [It works great in local development but performs badly when scaled.][26] The best thing is to use an explicit caching library that supports pluggable backends like Redis or Memcached. + +#### The basics + +There are two types of caches in the HTTP spec: private and public. Private caches are caches that don’t share data with multiple users — in practice, the user’s browser cache. Public caches are all the rest. They include ones under your control (such as CDNs or servers like Varnish or Nginx) and ones that aren’t (proxies). Proxy caches are rarer in today’s HTTPS world, but some corporate networks have them. + +![][27] + +Caching lookup keys are normally based on URLs, so caching is less painful if you stick to a “same content, same URL; different content, different URL” rule. I.e., give each page a canonical URL, and avoid “clever” tricks returning varying content from one URL. Obviously, this has implications for GraphQL API endpoints (that I’ll discuss later). + +Your servers can take custom configuration, but the primary way to configure HTTP caching is through HTTP headers you set on web responses. The most important header is `cache-control`. The following says that all caches down the line may cache the page for up to 3600 seconds (one hour): + +``` +cache-control: max-age=3600, public +``` + +For user-specific pages (such as user settings pages), it’s important to use `private` instead of `public` to tell public caches not to store the response and serve it to other users. + +Another common header is `vary`. This tells caches that the response varies based on some things other than the URL. (Effectively it adds HTTP headers to the the cache key, alongside the URL.) It’s a very blunt tool, which is why I recommend using a good URL structure instead if possible, but an important use case is telling browsers that the response depends on the login cookie, so that they update pages on login/logout. + +``` +vary: cookie +``` + +If a page can vary based on login status, you need `cache-control: private` (and `vary: cookie`) even on the public, logged out version, to make sure responses don’t get mixed up. + +Other useful headers include `etag` and `last-modified`, but I won’t cover them here. You might still see some old headers like `expires` and `pragma: cache`. They were made obsolete by HTTP/1.1 back in 1997, so I only use them if I want to disable caching and I’m feeling paranoid. + +#### Clientside headers + +Less well known is that the HTTP spec allows `cache-control` headers to be used in client requests to reduce the cache time and get a fresher response. Unfortunately `max-age` greater than 0 doesn’t seem to be widely supported by browsers, but `no-cache` can be useful if you sometimes need a fresh response after an update. + +#### HTTP caching and GraphQL + +As above, the normal cache key is the URL. But GraphQL APIs often use just one endpoint (let’s call it `/api/`). If you want a GraphQL query to be cachable, you need the query and its parameters to appear in the URL path, like `/api/?query={user{id}}&variables={"x":99}` (ignoring URL escaping). The trick is to configure your GraphQL client to use HTTP GET requests for queries (e.g., [set `useGETForQueries` for `apollo-link-http`][28]). + +Mutations mustn’t be cached, so they still need to use HTTP POST requests. With POST requests, caches will only see `/api/` as the URL path, but caches will refuse to cache POST requests outright. Remember: GET for non-mutating queries, POST for mutations. There’s a case where you might want to avoid GET for a query: if the query variables contain sensitive information. URLs have a habit of appearing in log files, browser history and chat channels, so sensitive information in URLs is usually a bad idea. Things like authentication should be done as non-cachable mutations, anyway, so this is a rare case, but one worth remembering. + +Unfortunately, there’s a problem: GraphQL queries tend to be much larger than REST API URLs. If you simply switch on GET-based queries, you’ll get some pretty big URLs, easily bigger than the ~2000 byte limit before some popular browsers and servers just won’t accept them. A solution is to send some kind of query ID, instead of sending the whole query. (I.e., something like `/api/?queryId=42&variables={"x":99}`.) Apollo GraphQL server supports two ways of doing this. + +One way is to [extract all the GraphQL queries from the code and build a lookup table that’s shared serverside and clientside][29]. One downside is that it makes the build process more complicated. Another downside is that it couples the client project to the server project, which goes against a selling point of GraphQL. Yet another downside is that version X of your code might recognise a different set of queries from version Y of your code. This is a problem because 1) your replicated app will serve multiple versions during an update rollout, or rollback, and 2) clients might use cached JavaScript, even as you upgrade or downgrade the server. + +Another way is what Apollo GraphQL calls [Automatic Persisted Queries (APQs)][30]. With APQs, the query ID is a hash of the query. The client optimistically makes a request to the server, referring to the query by hash. If the server doesn’t recognise the query, the client sends the full query in a POST request. The server stores that query by hash so that it can be recognised in future. + +![][31] + +#### HTTP caching and Keystone 5 + +As above, Vocal uses Keystone 5 for generating its GraphQL API, and Keystone 5 works with Apollo GraphQL server. How do we actually set the caching headers? + +Apollo supports cache hints on GraphQL schemas. The neat thing is that Apollo gathers all the hints for everything that’s touched by a query, and then it automatically calculates the appropriate overall cache header values. For example, take this query: + +``` +query userAvatarUrl { + authenticatedUser { + name + avatar_url + } +} +``` + +If `name` has a max age of one day, and the `avatar_url` has a max age of one hour, the overall cache max age would be the minimum, one hour. `authenticatedUser` depends on the login cookie, so it needs a `private` hint, which overrides the `public` on the other fields, so the resulting header would be `cache-control: max-age=3600, private`. + +I added [cache hint support to Keystone lists and fields][32]. Here’s a simple example of adding a cache hint to a field in the to-do list demo from the docs: + +``` +const keystone = new Keystone({ + name: 'Keystone To-Do List', + adapter: new MongooseAdapter(), +}); + +keystone.createList('Todo', { + schemaDoc: 'A list of things which need to be done', + fields: { + name: { + type: Text, + schemaDoc: 'This is the thing you need to do', + isRequired: true, + cacheHint: { + scope: 'PUBLIC', + maxAge: 3600, + }, + }, + }, +}); +``` + +#### One more problem: CORS + +Cross-Origin Resource Sharing (CORS) rules create a frustrating conflict with caching in an API-based website. + +Before getting stuck into the problem details, let me jump to the easiest solution: putting the main site and API onto one domain. If your site and API are served from one domain, you won’t have to worry about CORS rules (but you might want to consider [restricting cookies][33]). If your API is specifically for the website, this is the cleanest solution, and you can happily skip this section. + +In Vocal V1, the Website (Next.js) and Platform (Keystone GraphQL) apps were on different domains (`vocal.media` and `api.vocal.media`). To protect users from malicious websites, modern browsers don’t just let one website interact with another. So, before allowing `vocal.media` to make requests to `api.vocal.media`, the browser would make a “pre-flight” check to `api.vocal.media`. This is an HTTP request using the `OPTIONS` method that essentially asks if the cross-origin sharing of resources is okay. After getting the okay from the pre-flight check, the browser makes the normal request that was originally intended. + +The frustrating thing about pre-flight checks is that they are per-URL. The browser makes a new `OPTIONS` request for each URL, and the server response applies to that URL. [The server can’t say that `vocal.media` is a trusted origin for all `api.vocal.media` requests][34]. This wasn’t a serious problem when everything was a POST request to the one api endpoint, but after giving every query its own GET-able URL, every query got delayed by a pre-flight check. For extra frustration, the HTTP spec says `OPTIONS` requests can’t be cached, so you can find that all your GraphQL data is beautifully cached in a CDN right next to the user, but browsers still have to make pre-flight requests all the way to the origin server every time they use it. + +There are a few solutions (if you can’t just use a shared domain). + +If your API is simple enough, you might be able to exploit the [exceptions to the CORS rules][35]. + +Some cache servers can be configured to ignore the HTTP spec and cache `OPTIONS` requests anyway (e.g., Varnish-based caches and AWS CloudFront). This isn’t as efficient as avoiding the pre-flight requests completely, but it’s better than the default. + +Another (really hacky) option is [JSONP][36]. Beware: you can create security bugs if you don’t get this right. + +#### Making Vocal more cachable + +After making HTTP caching work at the low level, I needed to make the app take better advantage of it. + +A limitation of HTTP caching is that it’s all-or-nothing at the response level. Most of a response can be cachable, but if a single byte isn’t, all bets are off. As a blogging platform, most Vocal data is highly cachable, but in the old site almost no _pages_ were cachable at all because of a menu bar in the top right corner. For an anonymous user, the menu bar would show links inviting the user to log in or create an account. That bar would change to a user avatar and profile menu for signed-in users. Because the page varied based on user login status, it wasn’t possible to cache any of it in CDNs. + +![A typical page from Vocal. Most of the page is highly cachable content, but in the old site none of it was actually cachable because of a little menu in the top right corner.][37] + +These pages are generated by Server-Side Rendering (SSR) of React components. The fix was to take all the React components that depended on the login cookie, and force them to be [lazily rendered clientside only][38]. Now the server returns completely generic pages with placeholders for personalised components like the login menu bar. When a page loads in the user’s browser, these placeholders are filled in clientside by making calls to the GraphQL API. The generic pages can be safely cached in CDNs. + +Not only does this trick improve cache hit ratios, it helps improve perceived page load time thanks to human psychology. Blank screens and even spinner animations make us impatient, but once the first content appears, it distracts us for several hundred milliseconds. If people click a Vocal post link from social media and the main content appears immediately from a CDN, very few will ever notice that some components aren’t fully interactive until a few hundred milliseconds later. + +By the way, another trick for getting the first content in front of the user faster is to [stream render the SSR response as it’s generated][39], instead of waiting for the whole page to be rendered before sending it. Unfortunately, [Next.js doesn’t support that yet][40]. + +The idea of splitting responses for improved cachability also applies to GraphQL. The ability to query multiple pieces of data with one request is normally an advantage of GraphQL, but if the different parts of the response have very different cachability, it can be better overall to split them. As a simple example, Vocal’s pagination component needs to know the number of pages plus the content for the current page. Originally the component fetched both in one query, but because the total number of pages is a constant across all pages, I made it a separate query so it can be cached. + +#### Benefits of caching + +The obvious benefit of caching is that it reduces the load on Vocal’s backend servers. That’s good, but it’s dangerous to rely on caching for capacity, though, because you still need a backup plan for when you inevitably drop the cache one day. + +The improved responsiveness is a better reason for caching. + +A couple of other benefits might be less obvious. Traffic spikes tend to be highly localised. If someone with a lot of social media followers shares a link to a page, Vocal will get a big surge of traffic, but mostly to that one page and its assets. That’s why caches are good at absorbing the worst traffic spikes, making the backend traffic patterns relatively smoother and easier for autoscaling to handle. + +Another benefit is graceful degradation. Even if the backends are in serious trouble for some reason, the most popular parts of the site will still be served from the CDN cache. + +### Other performance tweaks + +As I always say, the secret to scaling isn’t making things complicated. It’s making things no more complicated than needed, and then thoroughly fixing all the things that prevent scaling. Scaling Vocal involved a lot of little things that won’t fit in this post. + +Here’s one tip: for the difficult debugging problems in distributed systems, the hardest part is usually getting the right data to see what’s going on. I can think of plenty of times that I’ve got stuck and tried to just “wing it” by guessing instead of figuring out how to find the right data. Sometimes that works, but not for the hard problems. + +A related tip is that you can learn a lot by getting real-time data (even just log files under [`tail -F`][41]) on each component in a system, displaying it in various windows in one monitor, and just clicking around the site in another. I’m talking about things like, “Hey, why does toggling this one checkbox generate dozens of DB queries in the backend?” + +Here’s an example of one fix. Some pages were taking more than a couple of seconds to render, but only in the deployment environment, and only with SSR. The monitoring dashboards didn’t show any CPU usage spikes, and the apps weren’t using disk, so it suggested that maybe the app was waiting on network requests, probably to a backend. In a dev environment I could watch how the app worked using [the sysstat tools][42] to record CPU/RAM/disk usage, along with Postgres statement logging and the usual app logs. [Node.js supports probes for tracing HTTP requests][43] using something like [bpftrace][44], but boring reasons meant they didn’t work in the dev environment, so instead I found the probes in the source code and made a custom Node.js build with request logging. I used [tcpdump][45] to record network data. That let me find the problem: for every API request made by Website, a new network connection was being created to Platform. (If that hadn’t worked, I guess I would have added request tracing to the apps.) + +Network connections are fast on a local machine, but take non-negligible time on a real network. Setting up an encrypted connection (like in the production environment) takes even longer. If you’re making lots of requests to one server (like an API), it’s important to keep the connection open and reuse it. Browsers do that automatically, but Node.js doesn’t by default because it can’t know if you’re making more requests. That’s why the problem only appeared with SSR. Like many long debugging sessions, the fix was very simple: just configure SSR to [keep connections alive][46]. The rendering time of the slower pages dropped dramatically. + +If you want to know more about this kind of stuff, I highly recommend reading [the High Performance Browser Networking book][47] (free to read online) and following up with [guides Brendan Gregg has published][48]. + +### What about your site? + +There’s actually a lot more stuff we could have done to improve Vocal, but we didn’t do it all. That’s a big difference between doing SRE work for a startup and doing it for a big company as a permanent employee. We had goals, a budget and a launch date, and now Vocal V2 has been running for 9 months with a healthy growth rate. + +Similarly, your site will have its own requirements, and is likely quite different from Vocal. However, I hope this post and its links give you at least some useful ideas to make something better for users. + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2020/06/29/scaling_a_graphql_site.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://vocal.media +[2]: https://www.meetup.com/en-AU/GraphQL-Sydney/events/267681845/ +[3]: https://theartofmachinery.com/2020/04/21/what_is_high_traffic.html +[4]: https://theartofmachinery.com/images/scaling_a_graphql_site/vocal1.png +[5]: https://theartofmachinery.com/images/scaling_a_graphql_site/vocal2.png +[6]: https://jerrick.media +[7]: https://www.thinkmill.com.au/ +[8]: https://theartofmachinery.com/images/scaling_a_graphql_site/alexa.png +[9]: https://aws.amazon.com/blogs/database/amazon-rds-customers-update-your-ssl-tls-certificates-by-february-5-2020/ +[10]: https://github.com/vercel/next.js +[11]: https://www.keystonejs.com/ +[12]: https://wiki.c2.com/?SecondSystemEffect +[13]: https://vocal.media/resources/vocal-2-0 +[14]: https://theartofmachinery.com/about.html +[15]: https://en.wikipedia.org/wiki/Extract,_transform,_load +[16]: https://github.com/stripe/mosql +[17]: https://use-the-index-luke.com/ +[18]: https://modern-sql.com/ +[19]: https://theartofmachinery.com/images/scaling_a_graphql_site/architecture.svg +[20]: https://aws.amazon.com/fargate/ +[21]: https://www.terraform.io/docs/providers/aws/r/ecs_task_definition.html +[22]: https://12factor.net/ +[23]: https://theartofmachinery.com/2019/02/16/talks.html +[24]: https://12factor.net/dev-prod-parity +[25]: https://www.meetup.com/en-AU/Port80-Sydney/events/lwcdjlyvjblb/ +[26]: https://theartofmachinery.com/2016/07/30/server_caching_architectures.html +[27]: https://theartofmachinery.com/images/scaling_a_graphql_site/http_caches.svg +[28]: https://www.apollographql.com/docs/link/links/http/#options +[29]: https://www.apollographql.com/blog/persisted-graphql-queries-with-apollo-client-119fd7e6bba5 +[30]: https://www.apollographql.com/blog/improve-graphql-performance-with-automatic-persisted-queries-c31d27b8e6ea +[31]: https://theartofmachinery.com/images/scaling_a_graphql_site/apq.png +[32]: https://www.keystonejs.com/api/create-list/#cachehint +[33]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Define_where_cookies_are_sent +[34]: https://lists.w3.org/Archives/Public/public-webapps/2012AprJun/0236.html +[35]: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests +[36]: https://en.wikipedia.org/wiki/JSONP +[37]: https://theartofmachinery.com/images/scaling_a_graphql_site/cachablepage.png +[38]: https://nextjs.org/docs/advanced-features/dynamic-import#with-no-ssr +[39]: https://medium.com/the-thinkmill/progressive-rendering-the-key-to-faster-web-ebfbbece41a4 +[40]: https://github.com/vercel/next.js/issues/1209 +[41]: https://linux.die.net/man/1/tail +[42]: https://github.com/sysstat/sysstat/ +[43]: http://www.brendangregg.com/blog/2016-10-12/linux-bcc-nodejs-usdt.html +[44]: https://theartofmachinery.com/2019/04/26/bpftrace_d_gc.html +[45]: https://danielmiessler.com/study/tcpdump/ +[46]: https://www.npmjs.com/package/agentkeepalive +[47]: https://hpbn.co/ +[48]: http://www.brendangregg.com/ diff --git a/sources/tech/20200629 Use intent parsers for your open source home automation project.md b/sources/tech/20200629 Use intent parsers for your open source home automation project.md new file mode 100644 index 0000000000..8730ac5c76 --- /dev/null +++ b/sources/tech/20200629 Use intent parsers for your open source home automation project.md @@ -0,0 +1,600 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Use intent parsers for your open source home automation project) +[#]: via: (https://opensource.com/article/20/6/mycroft-intent-parsers) +[#]: author: (Steve Ovens https://opensource.com/users/stratusss) + +Use intent parsers for your open source home automation project +====== +Use Padatious, Adapt, conversational context, and dialogs to start +programming your first voice AI. +![Working from home at a laptop][1] + +In [part 1][2] and [part 2][3] of this series on the [Mycroft][4] open source voice assistant, I laid the groundwork for learning how to create a skill. In [part 3][5], I walked through creating an outline for a skill and recommended creating the skill in pure Python first to ensure the methods work as intended. That way, when things go wrong, you know it is related to how your Mycroft skill is constructed and not the code itself. + +In this article, you will enhance the outline from part 3 by adding: + + * Mycroft entities + * Padatious intents + * Adapt intents + * Dialogs + * Conversational contexts + + + +The code for this project can be found in [my GitLab][6] repository. + +Let's get to it! + +### Improve your skill + +As a reminder, the purpose of this project is to use Mycroft to add items to shopping lists in the [OurGroceries][7] app. However, this tutorial can be applied to a variety of home automation applications like turning on your lights, getting the morning weather report, or controlling your entertainment systems. + +Here's what the skill's outline looks like so far: + + +``` +from mycroft import intent_file_handler, MycroftSkill, intent_handler +from mycroft.skills.context import adds_context, removes_context + +class OurGroceriesSkill(MycroftSkill): +    def __init__(self): +        MycroftSkill.__init__(self) + +    # Mycroft should call this function directly when the user +    # asks to create a new item +    def create_item_on_list(self, message): +        pass + +    # Mycroft should also call this function directly +    def create_shopping_list(self, message): +        pass + +    # This is not called directly, but instead should be triggered +    # as part of context aware decisions +    def handle_dont_create_anyways_context(self): +        pass + +    # This function is also part of the context aware decision tree +    def handle_create_anyways_context(self): +        pass + +    def stop(self): +        pass + +def create_skill(): +    return OurGroceriesSkill() +``` + +As it stands, Mycroft will load the skill successfully, but it won't do anything because all the methods have the command `pass` in them. For now, ignore the `__init__(self)` method and start working with the `create_item_on_list` method. From the comments, you can see the intent is for Mycroft to call this method directly. That means that you need to declare an _intent_. How do you do that? + +### Working with intents + +You may have noticed that the [outline][8] `mycroft-msk` created (in the third article) has what looks like a weird function, `@intent_file_handler('ourgroceries.intent')`, above the `handle_test` method. These are special notations in Python called decorators (if you want, head over to Real Python for a [primer on Python decorators][9]). For this tutorial, it is sufficient to know that a decorator is a way to pass your function into a prebuilt function developed by Mycroft. This saves a lot of work and boilerplate code. + +Recall from part three of this series that this project uses two intent parsers: Padacious and Adapt, which I described in the second article. + +#### Padatious intents + +So how do you know which decorator to use and where to use it? Great questions! I'll start with Padatious, which is the easier of the two to understand. If you recall from the second article, [Padatious][10] skills are _trained_ based on phrases that the skill's developer decides are relevant for the skill. As Mycroft may install many skills using the Padatious intent engine, each intent is given a score by the neural network module that Mycroft employs. Mycroft then chooses the highest-scoring intent and executes its functions. + +The phrases which Mycroft will use to train the intent are placed inside a file with a `.intent` file extension. You can have multiple `.intent` files, but you must reference each file explicitly. That means if you have `create.item.intent` and `create.category.intent`, there will be no confusion about which file your variables are populated from, as you must call them by file name. As you can see in the output from `mycroft-msk`, the decorator is intuitively named `@intent_file_handler()`. Simply use the name of the file as the argument for the decorator, such as `@intent_file_handler("create.item.intent")`. + +Think about what phrases someone might use to add an item to a shopping list. Since the motivating factor for this skill was using Mycroft to create a grocery list, the example code uses food-related terms, but you could use generic terms. With that said, here are some phrases you might say to add an item to your grocery list: + + * Add tomatoes to my shopping list + * Add tomatoes to the grocery list + * Add tomatoes to Costco list + + + +You may choose to have some grammatically incorrect phrases as well, to account for Mycroft misunderstanding the user's voice. From the list above, what pieces of information are programmatically relevant? `tomatoes`, `shopping list`, `grocery list`, and `Costco list`. The official documentation refers to this type of object as an _entity_. You can think of an entity as a variable, if that makes more sense to you. This will become clearer later when you create an intent file. While the `mycroft-msk` command will put intents in `locale/en-us` by default, I put mine under `vocab/en-us/`. Why? Well, that's because the Adapt intent parser stores its files in `vocab`, and I prefer to keep all my intent files in the same location. My file `vocab/en-us/create.item.intent` starts with: + + +``` +`add {Food} to my {ShoppingList}` +``` + +This defines the _entities_ `Food` and `ShoppingList`. + +**IMPORTANT NOTE**:  Padatious entities are **not** case-sensitive, and Padatious interprets everything in lower-case. For example, `ShoppingList` will be `shoppinglist`. + +Now that you have an intent, have Mycroft say a phrase containing your _entities_. Don't forget to add the intent decorator! Your new function will look like this: + + +``` +    @intent_file_handler("create.item.intent") +    def create_item_on_list(self, message): +        """ +        This function adds an item to the specified list + +        :param message: +        :return: Nothing +        """ +        item_to_add = message.data.get('food') +        list_name = message.data.get('shoppinglist') +        self.speak("Adding %s to %s" % (item_to_add, list_name)) +``` + +The graphic below uses three phrases: + + * Add tomatoes to my shopping list + * Add nails to my hardware list + * Add buns to groceries list + + + +Mycroft will not be able to figure out the intent behind one of these phrases. Can you guess which one and why? + +![Mycroft processing intent][11] + +(Steve Ovens, [CC BY-SA 4.0][12]) + +In case the video was a little too fast for you, here's the answer: Mycroft can't process the phrase `add buns to groceries list` because it is missing the keyword `my`. The intent explicitly says `add {Food} to my {ShoppingList}`. Without the word `my` as input from the user, the Padatious intent for the skill scores low and, therefore, Mycroft doesn't choose this skill to handle the request. The simplest solution is to add a new line to your intent file, like this: + + +``` +`add {Food} to {ShoppingList}` +``` + +Mycroft can often reload skills when it detects a change, but I prefer to restart Mycroft's skills section to make sure. I also clear the logs a lot during testing, so I run the following command to do everything in one line: + + +``` +` ./stop-mycroft.sh skills;sudo rm -f /var/log/mycroft/skills.log; ./start-mycroft.sh skills; mycroft-cli-client` +``` + +Testing the skill after Mycroft restarts yields the following results: + + +``` +add buns to groceries list                                                                 + >> Adding buns to groceries list +``` + +In case it is not clear, any response Mycroft makes in the `mycroft-cli-client` is prefixed by `>>` to indicate its response. Now that you have a basic intent, go back and review the objectives for this skill from part 3 of this series: + + 1. Login/authenticate + 2. Get a list of the current grocery lists + 3. Add item to a specific grocery list + 4. Add item to a category under a specific list + 5. Be able to add a category (since OurGroceries allows items to be placed in categories) + + + +Ignore the first two items for now—those deal with the online portion of the project, and you need to complete the other objectives first. For the third item, you have a basic intent that, in theory, should be able to take the _entities_ Mycroft detects and turn them into variables in the Python code. For the fourth item on the list, add two new lines to your intent: + + +``` +add {Food} to my {ShoppingList} under {Category} +add {Food} to {ShoppingList} under {Category} +``` + +You also need to alter your function slightly. When using the Padatious intent parser, _entities_ are returned via the `message.data.get()` function. This function will return `None` if the entity is undefined. In other words, if Mycroft cannot parse `{Category}` from an `utterance` the user makes, `message.data.get()` will return `None`. With this in mind, here is some quick test code: + + +``` +    @intent_file_handler("create.item.intent") +    def create_item_on_list(self, message): +        """ +        This function adds an item to the specified list + +        :param message: +        :return: Nothing +        """ +        item_to_add = message.data.get('food') +        list_name = message.data.get('shoppinglist') +        category_name = message.data.get('category') +        if category_name is None: +            self.speak("Adding %s to %s" % (item_to_add, list_name)) +        else: +            self.speak("Adding %s to %s under the category %s" % (item_to_add, list_name, category_name)) +``` + +Here is an example that tests these code changes: + +![Mycroft testing code changes][13] + +(Steve Ovens, [CC BY-SA 4.0][12]) + +In the example, Mycroft responds with `>> Adding nails to my hardware list under`, yet the only time you told Mycroft to say the word `under` is when `category_name` has a value other than `None`. This is because the intent parser is interpreting the word `under` as a part of the entity `ShoppingList`. Because the utterance had the word `my` in it, the sentences that matched the utterances could have been either: + + 1. `add {Food} to my {ShoppingList}` +or + 2. `add {Food} to my {ShoppingList} under {Category}` + + + +Since the user did not state the `{Category}`, Mycroft selected the first statement as the most correct. This means that anything _after_ the word `my` would be cast into the entity `{ShoppingList}`. Since, therefore, `{Category}` is `None`, Mycroft speaks, "Adding nails to my hardware list under" instead of "Adding nails to my hardware list under None." + +Padatious may seem a bit simplistic at first. For each phrase you need Mycroft to match, simply add a line to the intent file. However, with a complex intent, you could have several dozen lines attempting to cover all the different utterances you want to handle. + +There is another option that may be worth considering. Padatious intents support _parentheses expansion_. This means you can use a form of _OR_ statements to cut down on the number for lines in an intent. Going back, the example is trying to account for three cases: + + +``` +add {Food} to my {ShoppingList} +add {Food} to my {ShoppingList} under {Category} +add {Food} to the {ShoppingList} +add {Food} to the {ShoppingList} under {Category} +add {Food} to {ShoppingList} +add {Food} to {ShoppingList} under {Category} +``` + +If you want to rewrite this using an _OR_ statement to combine the `my` and `the` keywords, you could write: + + +``` +add {Food} to ( my | the ) {ShoppingList} +add {Food} to ( my | the ) {ShoppingList} under {Category} +add {Food} to {ShoppingList} +add {Food} to {ShoppingList} under {Category} +``` + +This removes two lines from the intent. Parentheses expansion also supports making something optional. So, if you want to make `the` and `my` optional and thus allow for the phrase `add {Food} to {ShoppingList}`, it would look like: + + +``` +add {Food} to ( | my | the ) {ShoppingList} +add {Food} to ( | my | the ) {ShoppingList} under {Category} +``` + +This simple change covers all three scenarios (once you restart the Mycroft skills subsystem). You can go a step further and condense this into a single line if you wish: + + +``` +`add {Food} to ( | my | the ) {ShoppingList} ( | under {Category})` +``` + +**Note:** For easier readability, use white spaces in your intent parentheses expansion. + +To summarize the important points about Padatious intent parsing: + + * You have to give several examples of phrases for Mycroft to come up with the correct match. + * Padatious intents use entities such as `{Food}` to identify object values that can be retrieved from your Python code. + * Entities are _always lower-case_ regardless of how you declare them in the intent file. + * If an entity cannot be parsed from an utterance, its value is `None`. + * The decorator for Padatious intents is `@intent_file_handler('my.intent.file.intent')`. + + + +#### Adapt intents + +Unlike Padatious intents, where you specify entities in the intent file, the Adapt intent parser works with a series of keywords that work in combination with regular expression (regex) files to attempt to capture an entity. You would use Adapt over Padatious when you: + + 1. Expect the utterance to be complex and the more robust parsing of regex is required + 2. Want or need Mycroft to be context-aware + 3. Need intents to be as lightweight as possible + + + +That said, the `voc` files Adapt uses are quite flexible. They can include a single word (as shown in the [official documentation][14]), or they can include the start of a sentence you want to react to. + +As one goal of this project is to have Mycroft create a new shopping list in the OurGroceries app, I wanted to add in some rudimentary checking so that the user is informed if a list with a similar name exists and asked if they still want to create a new list. This should cut down on list duplication and misplacement of items. + +Mock up some code, and then you can deal with the vocab and regex files. While you could use Pytest or similar unit tests to assert specific values, for the sake of simplicity, you will create a list called "shopping list." The Python mock function will look like this: + + +``` +    def create_shopping_list(self, message): +        fake_list = ["shopping list"] +        self.new_shopping_list_name = message.data['ListName'].lower() +        for current_shopping_list in fake_list: +            try: +                if self.new_shopping_list_name in current_shopping_list: +                    if self.new_shopping_list_name == current_shopping_list: +                        self.speak("The shopping list %s already exists" % self.new_shopping_list_name ) +                        break +                    else: +                        self.speak("I found a similar naming list called %s" % current_shopping_list) +                        # This hands off to either handle_dont_create_anyways_context or handle_create_anyways_context +                        # to make a context aware decision +                        self.speak("Would you like me to add your new list anyways?", expect_response=True) +                        break +                else: +                    self.speak("Ok creating a new list called %s" % self.new_shopping_list_name) +            except Exception as ex: +                print(ex) +                pass +``` + +Notice I am using a `forloop` to iterate over `fake_list`. That is because, in theory, multiple lists will be returned from the OurGroceries app. Also note the `try/except` block; I have given a general pass on the exception because, right now, I don't know what kind of exceptions I may run into. As you use and debug your code, you can tighten this up a bit. + +Another line to note is: + + +``` +`self.speak("Would you like me to add your new list anyways?", expect_response=True) ` +``` + +This bit of code will have Mycroft prompt the user for a response and store the result. I'll talk more about this bit of code in the conversational contexts section. + +#### Regular expressions, entities, and Adapt intents + +Now you have some pseudo code, but you need to add the decorator for Mycroft to action your code. You need to create three files for this to work: two vocab files and one regex file. The regex file, which I will name `add.shopping.list.rx`, looks like this: + + +``` +start a new list called (?P<ListName>.*) +create a new list called (?P<ListName>.*) +add a new list called (?P<ListName>.*) +``` + +You could make this a one-liner, but for simplicity's sake, keep it as three lines. Note this strange-looking notation: `(?P.*)`. This is the part of the code that captures and creates the entity. The entity, in this case, is called `ListName`. For checking your syntax, I recommend [Pythex][15]. It is very helpful when I am debugging my regex (I'm pretty terrible at regex). + +**IMPORTANT NOTE:** Adapt intents are case sensitive. + +#### Adapt and vocab files + +Now that your regex includes the full sentences you expect, create your two vocab files. The first file is called `CreateKeyword.voc`. As you can surmise from the file name, all the words you want to associate with the `create` action should reside here. This file is very simple: + + +``` +start a new +create a new +add a new +``` + +In the documentation, you will often see only a single word per line. However, due to some Mycroft default skills using `start` and `create`, I need to add words so that Mycroft will pick my skill appropriately. + +The second file is even easier. It's called `ListKeyword.voc` and has a single word in it: + + +``` +`list` +``` + +With these files defined, you can now construct your decorator: + + +``` +`@intent_handler(IntentBuilder('CreateShoppingIntent').require('CreateKeyword').require('ListKeyword').require("ListName"))` +``` + +The first argument in the `IntentBuilder` is `'CreateShoppingIntent'`; this is the name of the intent and is completely optional. If you want to leave this blank, you can. The `require` section is a bit confusing. When it comes to keywords, the argument for `require` is the name of the file without the file extension. In this case, one of the files is called `ListKeyword.voc`, so the argument being passed into `require` is just `'ListKeyword'`. + +While you can name your vocab files anything you want, I highly recommend using the word `Keyword` in the file so that when you are building your `intent_handler` decorator, it is clear what you are requiring. + +If `require` is actually an entity from a regex file, the argument for `require` is the name of the entity as you defined it in the regex. If your regex was `start a new list called (?P.*)`, then you would write `require('NewList')`. + +Restart the Mycroft skills subsection and try it out. You should see this in the Mycroft command-line interface: + + +``` + add a new list called hardware + >> Ok creating a new list called hardware +  + create a new list called hardware + >> Ok creating a new list called hardware +  + start a new list called hardware + >> Ok creating a new list called hardware +``` + +#### Conversational contexts + +Great, it works! Now add the following decorator to your function: + + +``` +`@adds_context("CreateAnywaysContext")` +``` + +This decorator is tied to the [conversational context][16] that Mycroft supports. Conversational contexts are essentially where you can speak normally to Mycroft and it will understand your meaning. For example, you could ask: "Who was John Quincy Adams?" After Mycroft responds, saying something like "John Quincy Adams was the sixth president of the United States," you could ask: "How old was he when he became president?" If you ask the second question first, Mycroft has no way to know who the pronoun _he_ refers to. However, in the context of this conversation, Mycroft understands that _he_ refers to John Quincy Adams. + +Getting back to creating a conversational context, the argument for its decorator is the name of the context. This example calls the context `CreateAnywaysContext` and hence, the full decorator is `@adds_context("CreateAnywaysContext")`. This mock method is now complete. However, you now need to add two simple methods to handle the user's feedback. You can simplify the grocery list skill by requiring either a yes or a no answer. Create a `YesKeyword.voc` and a `NoKeyword.voc`, and place the words `yes` and `no` in them, respectively. + +Now create two more methods in your Python: + + +``` +@intent_handler(IntentBuilder('DoNotAddIntent').require("NoKeyword").require('CreateAnywaysContext').build()) +@removes_context("CreateAnywayscontext") +def handle_dont_create_anyways_context(self): +    """ +    Does nothing but acknowledges the user does not wish to proceed +    Uses dont.add.response.dialog +    :return: +    """ +    self.speak_dialog('dont.add.response') + +    @intent_handler(IntentBuilder('AddAnywaysIntent').require("YesKeyword").require('CreateAnywaysContext').build()) +@removes_context("CreateAnywayscontext") +def handle_create_anyways_context(self): +    """ +    If the user wants to create a similarly named list, it is handled here +    Uses do.add.response.dialog +    :return: +    """ +    self.speak_dialog('do.add.response') +``` + +There are two things here you have not seen so far: + + 1. `@remove_context` + 2. `self.speak_dialog` + + + +If a method that requires `CreateAnywaysContext` is called, the decorator `@remove_context` gets rid of the context so that Mycroft does not accidentally action a context more than once. While multiple contexts can be applied to a method, this project will not use them. + +#### Dialogs + +Dialogs are files that have several prebuilt responses that Mycroft can pick from. These dialogs are stored in `dialog/{language tag}/`, and the language tag is based on the IETF standard. Examples can be found on [Venea.net][17] in the IETF LanguageTag column. + +Mycroft picks randomly from the list of sentences in a specified dialog file. Why would you use a dialog file instead of implementing `self.speak` in Python? The answer is simple: When you create and use a dialog file, you do not have to change the Python code to support other languages. + +For example, if the dialog file called `dont.add.response.dialog` exists under `en-us` with the following content: + + +``` +Ok... exiting +Gotcha I won't add it +Ok I'll disregard it +Make up your mind! +``` + +You could also create `de-de/dont.add.response.dialog` with the following content: + + +``` +Ok... Beenden +Erwischt Ich werde es nicht hinzufügen +Ok, ich werde es ignorieren. +Entscheiden Sie sich! +``` + +In your Python code, you would use `self.speak_dialog('dont.add.response')` to randomly select one of the answers for Mycroft to use. If a user's Mycroft language is set to German, Mycroft will automatically select the correct dialog and play the dialog in German instead of English. + +To wrap up this section, create two files under `dialog/en-us`. For `dont.add.response.dialog`, use the same content as in the above example. For `do.add.response.dialog`, use: + + +``` +Ok adding it now +Sure thing +Yup yup yup +``` + +At this point in this project, your tree should look something like this: + + +``` +├── dialog +│   └── en-us +│       ├── do.add.response.dialog +│       └── dont.add.response.dialog +├── __init__.py +├── regex +│   └── en-us +│       └── ADD.shopping.list.rx +└── vocab +    └── en-us +        ├── CREATE.item.intent +        ├── CreateKeyword.voc +        └── ListKeyword.voc +``` + +Note that I created the files by hand. If you used the `mycroft-msk create` method, you might have `locale` directories, `settingsmeta.yaml,` or other artifacts. + +#### Wrapping up + +We've covered a lot so far. You have implemented the Padatious intent parser to, theoretically, add a new item to a list, whether or not you put it under a category. You have also used the Adapt intent parser to add a new category. You used conversational context to prompt the user for confirmation if a similar list already exists. Finally, you learned the concept of dialogs as a way for Mycroft to provide varied confirmation responses to the user. + +Currently, the code looks like: + + +``` +from mycroft import intent_file_handler, MycroftSkill, intent_handler +from mycroft.skills.context import adds_context, removes_context +from adapt.intent import IntentBuilder + +class OurGroceriesSkill(MycroftSkill): +    def __init__(self): +        MycroftSkill.__init__(self) + +    # Mycroft should call this function directly when the user +    # asks to create a new item +    @intent_file_handler("create.item.intent") +    def create_item_on_list(self, message): +        """ +        This function adds an item to the specified list + +        :param message: +        :return: Nothing +        """ +        item_to_add = message.data.get('food') +        list_name = message.data.get('shoppinglist') +        category_name = message.data.get('category') +        if category_name is None: +            self.speak("Adding %s to %s" % (item_to_add, list_name)) +        else: +            self.speak("Adding %s to %s under the category %s" % (item_to_add, list_name, category_name)) + +    # Mycroft should also call this function directly +    @intent_handler(IntentBuilder('CreateShoppingIntent').require('CreateKeyword').require('ListKeyword').require("ListName")) +    def create_shopping_list(self, message): +        fake_list = ["shopping list"] +        self.new_shopping_list_name = message.data['ListName'].lower() +        for current_shopping_list in fake_list: +            try: +                if self.new_shopping_list_name in current_shopping_list: +                    if self.new_shopping_list_name == current_shopping_list: +                        self.speak("The shopping list %s already exists" % self.new_shopping_list_name ) +                        break +                    else: +                        self.speak("I found a similar naming list called %s" % current_shopping_list) +                        # This hands off to either handle_dont_create_anyways_context or handle_create_anyways_context +                        # to make a context aware decision +                        self.speak("Would you like me to add your new list anyways?", expect_response=True) +                        break +                else: +                    self.speak("Ok creating a new list called %s" % self.new_shopping_list_name) +            except AttributeError: +                pass +    # This is not called directly, but instead should be triggered +    # as part of context aware decisions +    @intent_handler(IntentBuilder('DoNotAddIntent').require("NoKeyword").require('CreateAnywaysContext').build()) +    @removes_context("CreateAnywayscontext") +    def handle_dont_create_anyways_context(self): +        """ +        Does nothing but acknowledges the user does not wish to proceed +        Uses dont.add.response.dialog +        :return: +        """ +        self.speak_dialog('dont.add.response') + +    # This function is also part of the context aware decision tree +    @intent_handler(IntentBuilder('AddAnywaysIntent').require("YesKeyword").require('CreateAnywaysContext').build()) +    @removes_context("CreateAnywayscontext") +    def handle_create_anyways_context(self): +        """ +        If the user wants to create a similarly named list, it is handled here +        Uses do.add.response.dialog +        :return: +        """ +        self.speak_dialog('do.add.response') + +    def stop(self): +        pass + +def create_skill(): +    return OurGroceriesSkill() +``` + +  + +In the next article, I will go into logging, getting settings from the web UI, and continuing to fill out the skill into something more useful. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/mycroft-intent-parsers + +作者:[Steve Ovens][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/stratusss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://opensource.com/article/20/6/open-source-voice-assistant +[3]: https://opensource.com/article/20/6/mycroft +[4]: https://mycroft.ai/ +[5]: https://opensource.com/article/20/6/outline-mycroft-voice-assistant-skill +[6]: https://gitlab.com/stratus-ss/mycroft-ourgroceries-skill +[7]: https://www.ourgroceries.com/overview +[8]: https://opensource.com/article/20/6/outline-mycroft-voice-assistant-skill#decorator +[9]: https://realpython.com/primer-on-python-decorators/ +[10]: https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/intents/padatious-intents +[11]: https://opensource.com/sites/default/files/uploads/mycroft-padatious-first-intent.gif (Mycroft processing intent) +[12]: https://creativecommons.org/licenses/by-sa/4.0/ +[13]: https://opensource.com/sites/default/files/uploads/mycroft-padatious-category1.gif (Mycroft testing code changes) +[14]: https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/intents/adapt-intents +[15]: https://pythex.org/ +[16]: https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/conversational-context +[17]: https://www.venea.net/web/culture_code diff --git a/sources/tech/20200630 10 ReactJS tools to boost your web development skills.md b/sources/tech/20200630 10 ReactJS tools to boost your web development skills.md new file mode 100644 index 0000000000..827b3d798b --- /dev/null +++ b/sources/tech/20200630 10 ReactJS tools to boost your web development skills.md @@ -0,0 +1,248 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (10 ReactJS tools to boost your web development skills) +[#]: via: (https://opensource.com/article/20/6/reactjs-tools) +[#]: author: (Prayaag Kasundra https://opensource.com/users/prayaag-kasundra) + +10 ReactJS tools to boost your web development skills +====== +Increase your value to employers by learning these top tools for +developing web apps in React. +![Woman sitting in front of her computer][1] + +Did you know most résumés submitted for jobs get rejected with just a single glance? That's a daunting fact if you are trying to get started in web development, but there are ways to improve what you have to offer prospective employers and clients. For application developers, now is a great time to increase your skills, and open source is the best avenue for professional development. You don't need to attend university to learn new open source skills; all you need is a sense of direction and self-discipline. + +ReactJS is one of many skills you would be wise to learn on your way to becoming a successful web developer. If you're already comfortable with JavaScript and HTML, it is a natural next technology to learn. If you're not familiar with them yet, then you'll find ReactJS a great place to start as a programmer. + +In this article, I'll share my top 10 tools and libraries that will help you qualify for a job (or be a serious hobbyist, if you prefer) as a JavaScript developer. + +### What is React, and why should you learn it? + +React is a JavaScript library for user interface (UI) development that Facebook introduced in May 2013 (and still maintains). It uses JavaScript for development and simple state machine components that render dynamic content with ease. + +Because ReactJS is one of the most powerful frontend JavaScript libraries available, you should learn how to use it if you want to build amazing applications. It's a driving force behind the interfaces of Amazon, PayPal, BBC, CNN, and many other tech giants. Furthermore, the flexible library suits any need and can be plugged into your favorite tech stack to build lightweight apps. You can [use React][2] to build anything scalable—data dashboards, messaging apps, social networking applications, single-page applications, and even personal blog sites. + +One of the most effective ways to get the hang of React is by using its tools to build web apps for real-world projects. Not only will it help you learn the framework and tools, but it also gives you something to show off to prospective employers. + +### 1\. npm + +If you want to get started with JavaScript (including the React library), you need to install Node package manager ([npm][3]). Like the package manager that ships with your Linux distribution (or [Chocolatey][4] on Windows or [Homebrew][5] on macOS), npm provides a command to query a software repository and install what you need. This includes important libraries, like ReactJS components. + +You can probably install Node.js (and npm along with it) from your Linux distribution's repository. On Fedora or Red Hat Enterprise Linux: + + +``` +`$ sudo dnf install nodejs` +``` + +On Ubuntu or Debian: + + +``` +`$ sudo apt install nodejs npm` +``` + +If your distribution doesn't offer npm in its repo, visit [Nodejs.org][6] to find out how to install Node.js and npm. + +### 2\. Create React App + +[Create React App][7] is a boilerplate project for getting started with React. Before Facebook released Create React App, setting up a working project in React was a tedious task. But with this tool, you can set up a frontend build pipeline, project structure, developer environment, and app optimization for production in seconds with zero configuration. You can achieve all this with a single command. What's more, if you need a more advanced configuration, you can "eject" from Create React App and edit its config files directly. + +Create React App is open source under the MIT License, and you can access its [source code][8] in its GitHub repo. + +Install it with: + + +``` +npm start +npm init react-app my-app +``` + +If you don't want to use Create React App, other boilerplate options are [React Boilerplate][9] and [React Slingshot][10]. Both are well-maintained and open source under the MIT License. + +### 3\. React Sight + +[React Sight][11] is a commonly used visualization tool that provides a live component hierarchy tree (like a flowchart) of your entire app. It can be added directly as a Chrome extension and needs React dev tools for reading information about your app. With its rich interface, you can even add filters to focus on the components you need to interact with the most. By hovering on the nodes, you can display the current state and props. React Sight is very helpful for debugging a large and complex project. + +React Sight is open source under the MIT License, and you can access its [source code][12] in its GitHub repo. Install React Sight from the [Chrome web store][13]. + +### 4\. React Belle + +[React Belle][14] is a configurable React component library containing reusable components like Toggle, Rating, DatePicker, Button, Card, Select, and others to provide a smooth user experience. The components are customizable and support [ARIA][15] accessibility standards. It offers different themes, like the popular Belle and Bootstrap. + +Belle is open source under the MIT License, and you can access its [source code][16] in its GitHub repo. + +Install it with: + + +``` +`npm install belle` +``` + +### 5\. Evergreen + +Built on top of the React UI primitive, [Evergreen][17] is a UI framework that contains highly polished components that you can use to build your project. One thing that developers like about this tool is its hassle-free import of components. + +Evergreen is open source under the MIT License, and you can access its [source code][18] in its GitHub repo. + +Install it with: + + +``` +`npm install --save evergreen-ui` +``` + +### 6\. Bit + +[Bit][19] offers an online platform and command-line tool for publishing and sharing React apps. It is one of the best options if you are creating and sharing components. Its marketplace is a store where people can publish their React apps and other people can search for the components they need, so they don't have to reinvent the wheel every time they need a new React app. Bit's core features include: + + * Allows code reuse + * Increases design and development efficiency + * Retains UI and UX consistency + * Increases a project's stability + + + +Bit is open source under the Apache 2.0 License, and you can access its [source code][20] in its GitHub repo. + +Install it with: + + +``` +`$ npm install bit-bin --global` +``` + +### 7\. Storybook + +[Storybook][21] lets you set up a live development server that supports hot reloading, so you can create components in isolation from your whole project. It helps with component reuse, testability, and development speed. It also offers an online UI editor that allows you to develop, inspect, and eventually showcase your creations interactively. + +What's more, Storybook's API offers myriad features and facilitates configuration like no other. It is used in production by companies like Coursera, Squarespace, and Lonely Planet. + +Storybook is open source under the MIT License, and you can access its [source code][22] in its GitHub repo. + +First, install Storybook using the following commands (note that one uses an npx command, which is related to npm but unique):  + + +``` +`$ cd my-react-app`[/code] [code]`$ npx -p @storybook/cli sb init` +``` + +Next, run it with: + + +``` +`$ npm run storybook` +``` + +### 8\. Formik + +[Formik][23] helps in creating and validating forms for debugging, testing, and reasoning in React. It allows you to generate dynamic forms, so you don't have to manually change or update the state and props of form components. It is a step towards a faster and more pleasant development experience. + +Formik is open source under the MIT License, and you can access its [source code][24] in its GitHub repo. + +Install it with: + + +``` +`$ npm install formik --save` +``` + +### 9\. Immer + +[Immer][25] is a JavaScript library that enables you to modify nested objects without fear of mutating them. Its purpose is to make immutability in your code simple. + +Here are some of Immer's top features: + + * **Immer is strongly typed**: It is useful when your state object has a type. + * **Immer reduces boilerplate code**: Most state management tools require you to write a lot of boilerplate code. Immer is different. It lets you write less (and more concise) code. + * **Immer allows you to use JS data structures:** You can produce immutable states in Immer by using basic JS data structures. + + + +Immer is open source under the MIT License, and you can access its [source code][26] in its GitHub repo. + +Install it with: + + +``` +`$ npm install immer` +``` + +### 10\. React Proto + +[React Proto][27] is an application prototyping tool for developers and designers. It helps you layout your project structure to make decisions in advance, so you don't waste time making changes later in development. This tool specifically helps people who prefer design over coding; for example, you can drag and drop elements instead of writing them. The tool helps you mark all potential components and give them names, properties, and a hierarchy for prototyping. + +React Proto is open source under the MIT License, and you can access its [source code][28] in its GitHub repo. + +To install it, first, fork the [repository][28]. Next, install dependencies with: + + +``` +`$ npm install` +``` + +Run the application with: + + +``` +`$ npm start` +``` + +To start a development environment, run: + + +``` +`$ npm run dev` +``` + +### Boost your career with ReactJS tools + +There's no shortage of resources for JavaScript. To learn more about the frameworks I've mentioned in this article, plus many more, check out the [Awesome React][29] repository on GitHub, a list of awesome things related to React. + +By learning these 10 must-have tools, you'll boost your productivity and your résumé, and more importantly, you'll have a good grasp on JavaScript-based web development. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/6/reactjs-tools + +作者:[Prayaag Kasundra][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/prayaag-kasundra +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_women_computing_3.png?itok=qw2A18BM (Woman sitting in front of her computer) +[2]: https://www.simform.com/why-use-react/ +[3]: https://www.npmjs.com/ +[4]: https://opensource.com/article/20/3/chocolatey +[5]: https://opensource.com/article/20/6/homebrew-mac +[6]: https://nodejs.org/en/download/package-manager/ +[7]: https://facebook.github.io/create-react-app/ +[8]: https://github.com/facebook/create-react-app +[9]: http://www.reactboilerplate.com/ +[10]: https://github.com/coryhouse/react-slingshot +[11]: http://www.reactsight.com/ +[12]: https://github.com/React-Sight/React-Sight +[13]: https://chrome.google.com/webstore/detail/react-sight/aalppolilappfakpmdfdkpppdnhpgifn +[14]: http://nikgraf.github.io/belle/ +[15]: https://en.wikipedia.org/wiki/WAI-ARIA +[16]: https://github.com/nikgraf/belle +[17]: https://evergreen.segment.com/ +[18]: https://github.com/segmentio/evergreen +[19]: https://github.com/teambit/bit +[20]: https://github.com/teambit/bit/blob/master/LICENSE +[21]: https://storybook.js.org/ +[22]: https://github.com/storybookjs/storybook +[23]: https://jaredpalmer.com/formik/ +[24]: https://github.com/jaredpalmer/formik +[25]: https://immerjs.github.io/immer/docs/introduction +[26]: https://github.com/immerjs/immer +[27]: https://react-proto.github.io/react-proto/ +[28]: https://github.com/React-Proto/react-proto +[29]: https://github.com/enaqx/awesome-react diff --git a/sources/tech/20200630 Using TensorFlow.js and Node-RED with image recognition applications.md b/sources/tech/20200630 Using TensorFlow.js and Node-RED with image recognition applications.md new file mode 100644 index 0000000000..cfec3f434b --- /dev/null +++ b/sources/tech/20200630 Using TensorFlow.js and Node-RED with image recognition applications.md @@ -0,0 +1,113 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Using TensorFlow.js and Node-RED with image recognition applications) +[#]: via: (https://www.linux.com/news/using-tensorflow-js-and-node-red-with-image-recognition-applications/) +[#]: author: (Linux.com Editorial Staff https://www.linux.com/author/kazuhito-yokoi/) + +Using TensorFlow.js and Node-RED with image recognition applications +====== + +_This Linux Foundation Platinum Sponsor-Contributed article from [Hitachi][1] is about how to use **TensorFlow.js** and **Node-RED** for use with image recognition applications._ + +### Using TensorFlow.js and Node-RED + +TensorFlow.js is a JavaScript implementation of the [TensorFlow open source machine learning platform][2]. By using **TensorFlow.js**, learning and inference processing can be executed in real-time on the browser or the server-side with Node.js. [Node-RED][3] is a visual programming tool mainly developed for IoT applications.  + +According to [a recent InfoQ article on 2020 JavaScript web development trends][4], **TensorFlow.js** is classified as “Early Majority”, and **Node-RED** is classified as “Early Adopters” in their adoption cycles. And they are becoming increasingly popular with open source software developers. + +![Image: InfoQ][5] + +In this article, we’ll take a look at what you can do with these two trending open source software tools in combination. + +### Creating a sample image recognition flow with Node-RED + +Our objective will be to create a flow within **Node-RED** to recognize an object in an image, as depicted in the screenshot below. + +![Flow to be created in Node-RED][6] + +This flow can be observed after you upload a file from a browser using the yellow node component. The bottom left of the user interface displays the uploaded image in the “Original image” node. In the orange “Image recognition” node, the **TensorFlow.js** trained model is used to run Analyze for what is in the uploaded image (an aircraft). Finally, we will use the green “Output result” node in the upper right corner to output what is seen in the debug tab on the right. Additionally, an image annotated with an orange square under the [Image with annotation] node is displayed, and it’s easy to see what part of the image has been recognized. + +In the following sections, we will explain the steps for creating this flow. For this demo, Node-RED can run in the local environment (in this case, a Raspberry Pi) and also in a cloud environment — it will work regardless of platform choice. For our tests, Google Chrome was chosen for use with the Node-RED web user interface. + +### Installing a TensorFlow.js node + +The **Node-RED** flow library has several TensorFlow.js-enabled nodes. One of these is [node-red-contrib-tensorflow][7], which contains the trained models.  + +We’ll begin with installing the **TensorFlow.js** node in **Node-RED**. To install the node, go to the top-right menu of the flow editor. Click **“Manage Palette”** -> Go to **“Palette”** tab -> Select **“Install”** tab. After that, enter “**node-red-contrib-tensorflow”** in the search keyword field.  + +![Installing a TensorFlow.js node][8] + +As shown in the image above, the TensorFlow.js node to be used is displayed in the search results. Click the “install” button to install the TensorFlow.js node. Once the installation is complete, orange **TensorFlow.js** nodes will appear in the Analysis category of the left side palette.  + +![Analysis palette][9] + +Each **TensorFlow.js** node is described in the following table. These are all image recognition nodes, but they can also generate image data with annotation and perform other functions like image recognition, or offline, which is necessary for edge analytics. + +**#** | **Name** | **Description** | **Annotated Image** | **Offline Use** +---|---|---|---|--- +1 | cocossd | A node that returns the name of the object in the image | YES | MAY +2 | handpose | A node that estimates the positions of fingers and joints from a hand image | NONE | CAN’T +3 | mobilenet | A node that returns the name of the object in the image | NONE | MAY +4 | posenet | A node that estimates the positions of arms, head, and legs from the image of a person | YES | MAY + +  + +In addition, the following nodes, which are required to work with image data in Node-RED, should be installed in the same way. + +– **node-red-contrib-browser-utils**: A node that uploads image files and audio files from the flow editor + +– **node-red-contrib-image-output**: A node that displays an image on the flow editor + +After installing **node-red-contrib-browser-utils**, you should see the file-inject node, microphone node, and camera node in the input category. Also, once you have installed **node-red-contrib-image-output**, you should see the image node in the output category. + +### Creating a flow + +Now that we have the necessary nodes let’s create the flow. + +From the palette on the right, place a yellow file inject node, an orange **cocossd** node, and a green debug node (which will be renamed to **msg.payload** when placed in the workspace) and connect the ports of each node with “wires”. + +To check the image data flowing through the wire, place two image nodes (named image preview when placed on the workspace) under the flow. To output the image data from the file inject node and debug node respectively, connect to the output port, as shown in the illustration. + +![Completed Node-RED flow][10] + +Only the image preview node on the right side specifies the image data variables to be displayed, so it is necessary to change the node settings. To change the settings, double-click the image preview node to open the node properties screen. On the node property screen, the image data stored in **msg.payload** is displayed by default. By changing this to **msg.annotatedInput** as shown in the screenshot below, the image preview node will display the annotated image. + +![Image properties][11] + +Give each node an appropriate name, press the red deploy button on the upper right, and then click the button on the left side of the file inject node to upload the sample image file of the airport from your PC. + +![The recognized object in Node-RED][6] + +As shown, an image with orange annotation on the aircraft is displayed under the “Image with annotation” node. Also, you can see that the debug tab on the right side correctly displayed “airplane”.  + +Feel free to try this with images you have at your disposal and experiment with them to see if they can be recognized correctly. + +*About the author: Kazuhito Yokoi is an Engineer at Hitachi’s OSS Solution Center, located in Yokohama, Japan. * + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/using-tensorflow-js-and-node-red-with-image-recognition-applications/ + +作者:[Linux.com Editorial Staff][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/kazuhito-yokoi/ +[b]: https://github.com/lujun9972 +[1]: http://www.hitachi.co.jp/ +[2]: https://www.tensorflow.org/overview +[3]: https://nodered.org/ +[4]: https://www.infoq.com/articles/javascript-web-development-trends-2020/ +[5]: https://www.linux.com/wp-content/uploads/2020/06/image1_infoq.jpg +[6]: https://www.linux.com/wp-content/uploads/2020/06/image2_flow.png +[7]: https://flows.nodered.org/node/node-red-contrib-tensorflow +[8]: https://www.linux.com/wp-content/uploads/2020/06/image3_installation.png +[9]: https://www.linux.com/wp-content/uploads/2020/06/image4_palette.png +[10]: https://www.linux.com/wp-content/uploads/2020/06/image5_flow.png +[11]: https://www.linux.com/wp-content/uploads/2020/06/image6_property.png diff --git a/sources/tech/20200630 What is End of Life in Ubuntu- Everything You Should Know About it.md b/sources/tech/20200630 What is End of Life in Ubuntu- Everything You Should Know About it.md new file mode 100644 index 0000000000..c3d67f5827 --- /dev/null +++ b/sources/tech/20200630 What is End of Life in Ubuntu- Everything You Should Know About it.md @@ -0,0 +1,182 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What is End of Life in Ubuntu? Everything You Should Know About it) +[#]: via: (https://itsfoss.com/end-of-life-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +What is End of Life in Ubuntu? Everything You Should Know About it +====== + +If you have been following It’s FOSS for some time, you might have noticed that I publish news articles like Ubuntu XYZ version has reached end of life (EoL). + +This end of life is one of those essential concepts that every Ubuntu user should be aware of. + +This is why I decided to write this detailed guide to explain what does an Ubuntu release reaching end of life means, why it matters to you and how to check when your Ubuntu install has reaches end of life. + +### What is end of life in Ubuntu? + +![][1] + +First thing first, end of life is not really an Ubuntu-specific concept. It is a generic term widely used in the software industry. + +The end of life of a software means the software has reached the end of its predefined support period. Beyond this date, the software won’t get any feature, maintenance or security updates. + +You may continue using the software past its end of life date but at your own risk. If there are security vulnerability, your system and data will be at risk. + +Compare it to the use by date or the expiry date on a food item. You may consume the yogurt one day after its use by date but can you eat it after a week or a month? + +#### Why end of life? + +Software is not a living being then why they have an end of life? Why doesn’t Ubuntu just keep on supporting one version forever? + +It is to maintain a balance between stability and features. You want new features in your system but you don’t want it to break your system. Software compatibility is complex and testing takes time. + +So what Ubuntu does is to give you a release and takes the responsibility of maintaining it by providing security and other updates for a certain time period. + +Ubuntu team and volunteers also work on the new release in parallel to add new features to the future release. + +#### Support life cycle of Ubuntu releases + +Ubuntu has two new version releases every year. These releases can be categorized into: + + * Regular release with 9 months of support period + * Long-term support (LTS) release with 5 years of support period + + + +A new LTS version is released every two years while the regular releases come every six months. + +This table should give you a better understanding: + +Ubuntu Version | Release | End of Life +---|---|--- +Ubuntu 18.04 (LTS) | April, 2018 | April, 2023 (5 years) +Ubuntu 18.10 | October, 2018 | July, 2019 (9 months) +Ubuntu 19.04 | April, 2019 | January, 2020 (9 months) +Ubuntu 19.10 | October, 2019 | July, 2020 (9 months) +Ubuntu 20.04 (LTS) | April, 2020 | April, 2025 (5 years) +Ubuntu 20.10 | October, 2020 | July, 2021 (9 months) + +The long-term support release focus on providing stability for a longer period. You probably know that Linux distributions like Ubuntu are also responsible for providing applications to you. These distributions have thousands of applications/packages in their repositories. + +The LTS versions often hold on to software versions as they cannot test every new version of so many software in the five years of support period. + +When Ubuntu releases a new LTS version, it also updates a number of software to a newer version. For example, Ubuntu 18.04 LTS has PHP 7.2 whereas Ubuntu 20.04 LTS has PHP 7.4 available. + +The regular release are short-live, but they bring new features (like newer versions of software like file managers, desktop environments, newer kernels etc). + +Personally, I think of these regular releases as a stepping platform for the next LTS releases. For examples, the features introduced in Ubuntu 18.10, 19.04, 19.10 will eventually be added in Ubuntu 20.04 (but not in 18.04). + +#### How to check how long your Ubuntu system will be supported? + +The simplest way to check the end of life support in Ubuntu is using this command in the terminal: + +``` +hwe-support-status --verbose +``` + +It will show an output that mentions the support period of your Ubuntu version. + +``` +You are not running a system with a Hardware Enablement Stack. Your system is supported until April 2025. +``` + +The [Hardware Enablement Stack in Ubuntu][2] allows you to receive the latest generic Linux kernel supported by Ubuntu. The important part is the support status date. + +If you want a detailed overview of how many software packages you have got and how long those packages will be supported, you can use the ubuntu-security-status command: + +``` +ubuntu-security-status +``` + +**In older versions of Ubuntu, the same command is known as ubuntu-support-status.** For both commands, the output is nearly identical: + +``` +[email protected]:~$ ubuntu-security-status +2242 packages installed, of which: +1695 receive package updates with LTS until 4/2025 + 510 could receive security updates with ESM Apps until 4/2030 + 30 packages are from third parties + 7 packages are no longer available for download + +Packages from third parties are not provided by the official Ubuntu +archive, for example packages from Personal Package Archives in +Launchpad. +For more information on the packages, run 'ubuntu-security-status +--thirdparty'. + +Packages that are not available for download may be left over from a +previous release of Ubuntu, may have been installed directly from a +.deb file, or are from a source which has been disabled. +For more information on the packages, run 'ubuntu-security-status +--unavailable'. + +Enable Extended Security Maintenance (ESM Apps) to get 0 security +updates (so far) and enable coverage of 510 packages. + +This machine is not attached to an Ubuntu Advantage subscription. +See https://ubuntu.com/advantage +``` + +As you can see in the above output, my system will majorly get supported till April 2025. Ubuntu can provide maintenance support for 510 packages till April 2030 but you’ll have to purchase the ESM. + +The ESM is more useful to mission-critical business infrastructure where upgrading to a newer version of the OS will impact the business. For desktop users, upgrading to a newer version is easier and more sensible thing to do. + +#### What happens when your Ubuntu install reaches end of life? What if you continue using Ubuntu even after its end of life? + +When your Ubuntu install reaches end of life, it stops getting system updates including any security updates. There won’t be updates for installed software as well. + +Without the security updates your system will become vulnerable to hacking attacks (if you connect to internet). Suppose a vulnerability gets discovered in one of the software you use or even in Linux kernel. You don’t get the update so this vulnerability is not patched and some malicious hackers take advantage of it to steal your data. + +Eventually, you’ll not be able to use the Ubuntu repositories. If you try to install a new application, you’ll see ‘[unable to locate package error][3]‘. + +So, basically, you won’t be able to install new software and your system will be at risk. Not a pretty scenario. + +The worst part is that if you wait way too long, you won’t be able to upgrade to the newer version. For example, a system running 17.04 can no longer update to 17.10 because even 17.10 is not supported anymore. A [fresh new Ubuntu installation][4] is the only suggested option in such case. + +#### What should you do when your Ubuntu install reaches end of life? + +Ubuntu doesn’t just abandon you after your system reaches end of life. It notifies you either in terminal or on the desktop that your system is no longer supported. + +![Ubuntu No Longer Supported][5] + +It even provides a mechanism to [upgrade your current Ubuntu version to the newer version][6]. Most of the software you have currently installed and your pictures, videos and other documents remain as it is. Making a backup of your important data on an external disk is still recommended. + +![Upgrade to Ubuntu 20.04 From 18.04][7] + +The rule of thumb is: + + * if you are using an LTS release, you should upgrade when the next LTS version is available. + * if you are using a regular release, you should upgrade whenever the next version is available. + + + +#### Still confused? + +I wrote this article because this is one of the most common confusion for It’s FOSS readers. I hope it clears the air and you have a better understanding of Ubuntu release cycle. + +If you still have doubts, please feel free to ask your question in the comment section. I’ll be happy to answer your queries. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/end-of-life-ubuntu/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/end-of-life-ubuntu.png?ssl=1 +[2]: https://itsfoss.com/ubuntu-hwe-kernel/ +[3]: https://itsfoss.com/unable-to-locate-package-error-ubuntu/ +[4]: https://itsfoss.com/install-ubuntu/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/ubuntu-no-longer-supported.png?ssl=1 +[6]: https://itsfoss.com/upgrade-ubuntu-version/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/upgrade-ubuntu-20-04-from-18-04.jpg?ssl=1 diff --git a/sources/tech/20200630 What-s New in Harbor 2.0.md b/sources/tech/20200630 What-s New in Harbor 2.0.md new file mode 100644 index 0000000000..d978a72d48 --- /dev/null +++ b/sources/tech/20200630 What-s New in Harbor 2.0.md @@ -0,0 +1,72 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What’s New in Harbor 2.0) +[#]: via: (https://www.linux.com/audience/developers/whats-new-in-harbor-2-0/) +[#]: author: (Swapnil Bhartiya https://www.linux.com/author/swapnil/) + +What’s New in Harbor 2.0 +====== + +[Harbor][1] is an open-source cloud native registry project that stores, signs, and scans content. Harbor was created by a team of engineers at VMware China. The project was contributed to CNCF for wider adoption and contribution. Recently the project announced its 2.0 release. [Swapnil Bhartiya, the founder of TFiR.io][2], sat down with Michael Michael, Harbor maintainer and VMware’s Director of Product Management, to talk about Harbor, community and the latest release. + +Here is a lightly edited transcript of the interview: + +**Swapnil Bhartiya: Let’s assume that you and I are stuck in an elevator and I suddenly ask you, “What is Harbor?” So please, explain what it is.** +Michael Michael: Hopefully you’re not stuck in the elevator for long; but Harbor essentially is an open source cloud-native registry. Think of this as a repository where you can store and serve all of your cloud-native assets, your container images, your Helm charts, and everything else you need to basically build cloud native applications. And then some putting posts on top of that, some very good policy engines that allow you to enforce compliance, make sure your images that you’re serving are free from vulnerabilities and making sure that you have all the guardrails in place so an operator can manage this registry and delivery it to his developers in a self-service way. + +**Swapnil Bhartiya: Harbor came out of VMware China. So I’m also curious that what was the problem that the team saw at that point? Because there were a lot of projects that were doing something similar, that you saw unique that Harbor was created?** +Michael Michael: So essentially the need there was, there wasn’t really a good way for an enterprise to have a hosted registry that has all of the enterprise capabilities they were looking for, while at the same time being able to have full control over the registry. Like a lot of the cloud providers have their own registry implementation, there’s Docker Hub out there, or you can go and purchase something at a very expensive price point. But if you’re looking for an open source solution that gives you end to end registered capabilities, like your developers can push images and pull images, and then your operators can go and put a policy that says, Hey, I want to allow this development team to create a project, but not using more than a terabyte of storage. None of those solutions had that, so there was a need, a business need here to develop a registry. And on top of that, we realized that it wasn’t just us that had the same need, there was a lot of users and enterprises out there in the cloud native ecosystem. + +**Swapnil Bhartiya: The project has been out for a while and based on what you just told me, I’m curious what kind of community the product has built around itself and how the project has evolved? Because we will also talk about the new release version 2.0 but before that, I want to talk about the volitional project and the community around it.** +Michael Michael: Project has evolved fairly well over the years we have increased our contributors. The contribution statistics are that CNCF is creating are showing that we’re growing our community. We now have maintainers in the project from multiple organizations and there are actually three organizations that have more than one maintainer on the project. So it’s kind of showing you that they’re, the ecosystem has picked up. We are adding more and more functionality into Harbor, and we’re also making Harbor pluggable. So there are areas of Harbor where we’re saying, Hey, here’s the default experience with Harbor, but if you want to extend the experience based on the needs of your users go ahead and do that and here’s an easy way to implement an interface and do that. That has really increased the popularity of Harbor. That means two things, we can give you a batteries-included version of Harbor from the community and then we’ll give you the option to extend that to fit the needs of your organization. + +And more importantly, if you have made investments in other tooling, you can plug and play Harbor in that. When I say other tooling, I mean, things like CI/CD systems, those systems are primarily driving the development life cycle. So for example, you go from source code to container image to something that’s stored in a registry like Harbor. The engine that drives the pipeline, that workflow in a lot of ways is a CI/CD engine. So how do you integrate Harbor well with such systems? We’ve made that a reality now and that has made Harbor easier to put in an organization and get it adopted with existing standards and existing investments. + +**Swapnil Bhartiya: Now let’s talk about the recently announced 2.0. Talk about some of the core features, functionalities that you are excited about in this release.** +Michael Michael: Absolutely, there’s like three or four features that really, really excite me. A long time coming is the support for OCI. The OCI is the Open Container Initiative and essentially it’s creating a standardized way to describe what an image looks like. And we in Harbor 2.0 we are able to announce that we have full OCI supporting Harbor. What does that mean for users? In previous releases of Harbor you could only put into Harbor two types of artifacts; a container image and a Helm chart. It satisfies a huge number of the use cases for customers, but it’s not enough in this new cloud native ecosystem, there are additional things that as a developer, as an operator, as a Kubernetes administrator, you might want to push into a repository like Harbor and have them also adopt a lot of the policy engine that Harbor provides. + +Give you a few examples, single bundles, the cloud native application, a bundle. You could have OPA files, you could have singularity and other OCI compliant files. So now Harbor tells you that, Hey, you have any file type out there? If it’s OCI compliant, you can push it to Harbor, you can pull it from Harbor. And then you can add things like coders and retention policies and immutability policies and replication policies on top of that. The thing about that now, just by adding a few more types of supported artifacts into Harbor, those types immediately get to use the full benefit of Harbor in terms of our entire policy engine and the compliance that do offer to administrators of Harbor. + +**Swapnil Bhartiya: What does OCI compliance mean for users? Because by being compliant, you have to be more strict about what you can and cannot do. So can you talk about that? And also how does that also affect the existing users, should they have to worry about something or it doesn’t really matter?** + +Michael Michael: Existing users shouldn’t have to worry about this, there’s fully backward compatibility that can still push their container images, which are OCI compliant. And if you’re using a Helm Chart before, you can still push it into Charts Museum, which is a key component of Harbor, but you can now also put a Helm Chart as an OCI file. So for existing users, not much difference, backward compatibility, we still support them. The users are brothers here, we’re not going to forget them. But what it means now is actually, it’s not more strict this is a lot more open. If you’re developing artifacts that are OCI compliant and they’re following the standard way of describing an image and a standard way of actually executing an image at run time; now Kubernetes is also OCI compliant at the run time. Then you’re getting the benefits of both worlds. You get Harbor as the repository where you can store your images and you also get a run time engine that’s OCI compliant that could potentially execute them. The really great benefit here for the users. + +A couple of other features that Harbor 2.0 Brings are super, super exciting. The first one is the introduction of Trivy by Aqua Security, as the batteries included built-in scanner in Harbor. Previously, we use Claire as our built-in scanner and with the release of Harbor called 1.10 that came out in December 2019, we introduced what we call a pluggable framework, think of this as a way that security vendors like Aqua and Encore can come in and create their own implementation of a security scanner to do static analysis on top of images that are deployed in Harbor. + +So we still included Claire as a built-in scanner and then we added additional extension points. Now we actually liked Trivy that much our community and our users love Trivy it’s the ability to enforce and to study analysis on top of multiple operating systems on top of multiple application managers, it’s very well aligned with the vision that you have from a security standpoint in Harbor. And now we added Trivy as the built-in scanner in Harbor, we ship with it now. A great, great achievement and kudos to the Aqua team for delivering Trivy as an open source project. + +**Swapnil Bhartiya: That’s the question I was going to ask, but I, once again, I’ll ask the same thing again, that, what does it mean for users who were using Claire?** +Michael Michael: If you’re using Claire before and you want to continue using Claire, by all means, we’re going to continue updating Claire, Claire is already included in Harbor. There’s no changes in the experience. However, if you’re thinking that Trivy is a better scanner for you, and by the way, you can use them side by side so you can compare the scanning results from each scanner. And if Trivy is a better option for you, we enabled you to make that choice. Now the way Harbor works is that you have a concept of multitenancy and we isolate a lot of the settings and the policy in the organization of images and on a per-project basis. So what does that mean? You can actually go into Harbor and you can define a project and you can say for this project I want Claire to be the built-in scanner. + +And then Claire will scan all your projects in that, all the files in that project. And you can use a second project and say, well, I now want Trivy to be the scanner for this project. And then Trivy of you will scan your images. And if you have the same set of images, you can compare them and see which scanner works best based on your needs as an organization and as a user. This phenomenal, right? To give users choice and we give them all the data, but ultimately they have to make the decision on what is the best scanner for them to use based on their scenarios, the type of application images and containers that they use and the type of libraries in they use those containers. + +**Swapnil Bhartiya: Excellent. Before we wrap this up, what kind of roadmap you have for Harbor, of course, it’s an open source project. So there’s no such thing as when the 2.0 release is coming out. But when we look at 2020, what are the major challenges that you want to address? What are the problems you want to solve and what does the basic roadmap look like?** +Michael Michael:  Absolutely, I think that one of the things that we’ve been trying to do as a maintainer team for Harbor is to kind of create some themes around the release is kind of put a blueprint down in terms of what is it that we’re trying to achieve? And then identify the features that make sense in that theme. And we’re not coming up with this from a vacuum, we’re talking to users, we’re talking to other companies where we have KubeCon events in the past where we had presentations and individuals came to us asking us sets of questions. We have existing users that give us feedback. When we gather all of that, one of the things that we came up with as the next thing for our release is what you call image distribution. So we have three key features that we’re trying to tackle in that area. + +The first one is how can Harbor act as a proxy cache? To enable organizations that are either deploying Kubernetes environments at the edge and they want a local Harbor instance to proxy or mirror images from the mothership like your main data center and where networking is at the premium. Maybe some of the Kubernetes nodes are not even connected to the network and they want to be a support to pull images from Harbor and then Harbor pulls the images from the upstream data center. Very, very important feature. Continuing down the path of image distribution. We’re integrating Harbor with both Dragonfly by Alibaba and Project Kraken by Uber to facilitate peer to peer distribution mechanisms for your container images. So how can we efficiently distribute images at the edge in multiple data centers in branch offices that don’t have a good network or thick network pipe between them? And how can Harbor make sure that the right images land at the right place? Big, big features that we’re trying to work with the community. And obviously we’re not doing this alone, we’re working with both Kraken and the Dragonfly communities to achieve that. + +And last, the next feature that we have is what you call garbage collection without downtime. Traditionally, we do garbage collection and this is kind of the process where you get to reclaim some of the files and layers of, basically container images that are no longer in use. + +Think of an organization that pushes and pulls thousands of images every day; they re-tag them, they create new versions. Sometimes you end up with layers that are no longer used, in order for those layers to be reclaimed at the storage and by the system, their registry in needs to be locked down as in nobody can be pulling or pushing images to it. In Harbor 2.0 we actually made a significant advancement where we track all the layers and the metadata of images in our database rather than depending on another tool or product to do it. So now this actually paves a road so that in the future, we could actually do garbage collection with zero downtime where Harbor can identify all the layers that are no longer in use, go reclaim them. And then that will have zero adverse impact or downtime to the users are pushing and pulling content. Huge, huge features and that’s the things that we’re working on in the future. + +**Swapnil Bhartiya: Awesome, thank you Michael for explaining things in detail and talking about Harbor. I look forward to talk to you again. Thank you.** +Michael Michael: Absolutely. Thank you so much for the opportunity. + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/audience/developers/whats-new-in-harbor-2-0/ + +作者:[Swapnil Bhartiya][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/swapnil/ +[b]: https://github.com/lujun9972 +[1]: https://goharbor.io/ +[2]: https://www.tfir.io/author/arnieswap/#:~:text=Swapnil%20Bhartiya%20Swapnil%20Bhartiya%20is%20the%20Founder%20and,audience%20for%20enterprise%20open%20source%20and%20emerging%20technologies. diff --git a/sources/tech/20200701 Install a Kubernetes load balancer on your Raspberry Pi homelab with MetalLB.md b/sources/tech/20200701 Install a Kubernetes load balancer on your Raspberry Pi homelab with MetalLB.md new file mode 100644 index 0000000000..106fc01960 --- /dev/null +++ b/sources/tech/20200701 Install a Kubernetes load balancer on your Raspberry Pi homelab with MetalLB.md @@ -0,0 +1,282 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Install a Kubernetes load balancer on your Raspberry Pi homelab with MetalLB) +[#]: via: (https://opensource.com/article/20/7/homelab-metallb) +[#]: author: (Chris Collins https://opensource.com/users/clcollins) + +Install a Kubernetes load balancer on your Raspberry Pi homelab with MetalLB +====== +Assign real IPs from your home network to services running in your +cluster and access them from other hosts on your network. +![Science lab with beakers][1] + +Kubernetes is designed to integrate with major cloud providers' load balancers to provide public IP addresses and direct traffic into a cluster. Some professional network equipment manufacturers also offer controllers to integrate their physical load-balancing products into Kubernetes installations in private data centers. For an enthusiast running a Kubernetes cluster at home, however, neither of these solutions is very helpful. + +Kubernetes does not have a built-in network load-balancer implementation. A bare-metal cluster, such as a [Kubernetes cluster installed on Raspberry Pis for a private-cloud homelab][2], or really any cluster deployed outside a public cloud and lacking expensive professional hardware, needs another solution. [MetalLB][3] fulfills this niche, both for enthusiasts and large-scale deployments. + +MetalLB is a network load balancer and can expose cluster services on a dedicated IP address on the network, allowing external clients to connect to services inside the Kubernetes cluster. It does this via either [layer 2 (data link)][4] using [Address Resolution Protocol][5] (ARP) or [layer 4 (transport)][6] using [Border Gateway Protocol][7] (BGP). + +While Kubernetes does have something called [Ingress][8], which allows HTTP and HTTPS traffic to be exposed outside the cluster, it supports _only_ HTTP or HTTPS traffic, while MetalLB can support any network traffic. It is more of an apples-to-oranges comparison, however, because MetalLB provides resolution of an unassigned IP address to a particular cluster node and assigns that IP to a Service, while Ingress uses a specific IP address and internally routes HTTP or HTTPS traffic to a Service or Services based on routing rules. + +MetalLB can be set up in just a few steps, works especially well in private homelab clusters, and within Kubernetes clusters, it behaves the same as public cloud load-balancer integrations. This is great for education purposes (i.e., learning how the technology works) and makes it easier to "lift-and-shift" workloads between on-premises and cloud environments. + +### ARP vs. BGP + +As mentioned, MetalLB works via either ARP or BGP to resolve IP addresses to specific hosts. In simplified terms, this means when a client attempts to connect to a specific IP, it will ask "which host has this IP?" and the response will point it to the correct host (i.e., the host's MAC address). + +With ARP, the request is broadcast to the entire network, and a host that knows which MAC address has that IP address responds to the request; in this case, MetalLB's answer directs the client to the correct node. + +With BGP, each "peer" maintains a table of routing information directing clients to the host handling a particular IP for IPs and the hosts the peer knows about, and it advertises this information to its peers. When configured for BGP, MetalLB peers each of the nodes in the cluster with the network's router, allowing the router to direct clients to the correct host. + +In both instances, once the traffic has arrived at a host, Kubernetes takes over directing the traffic to the correct pods. + +For the following exercise, you'll use ARP. Consumer-grade routers don't (at least easily) support BGP, and even higher-end consumer or professional routers that do support BGP can be difficult to set up. ARP, especially in a small home network, can be just as useful and requires no configuration on the network to work. It is considerably easier to implement. + +### Install MetalLB + +Installing MetalLB is straightforward. Download or copy two manifests from [MetalLB's GitHub repository][9] and apply them to Kubernetes. These two manifests create the namespace MetalLB's components will be deployed to and the components themselves: the MetalLB controller, a "speaker" daemonset, and service accounts. + +#### Install the components + +Once you create the components, a random secret is generated to allow encrypted communication between the speakers (i.e., the components that "speak" the protocol to make services reachable). + +(Note: These steps are also available on MetalLB's website.) + +The two manifests with the required MetalLB components are: + + * + * + + + +They can be downloaded and applied to the Kubernetes cluster using the `kubectl apply` command, either locally or directly from the web: + + +``` +# Verify the contents of the files, then download and pipe then to kubectl with curl +# (output omitted) +$ kubectl apply -f +$ kubectl apply -f +``` + +After applying the manifests, create a random Kubernetes secret for the speakers to use for encrypted communications: + + +``` +# Create a secret for encrypted speaker communications +$ kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)" +``` + +Completing the steps above will create and start all the MetalLB components, but they will not do anything until they are configured. To configure MetalLB, create a configMap that describes the pool of IP addresses the load balancer will use. + +#### Configure the address pools + +MetalLB needs one last bit of setup: a configMap with details of the addresses it can assign to the Kubernetes Service LoadBalancers. However, there is a small consideration. The addresses in use do not need to be bound to specific hosts in the network, but they must be free for MetalLB to use and not be assigned to other hosts. + +In my home network, IP addresses are assigned by the DHCP server my router is running. This DHCP server should not attempt to assign the addresses that MetalLB will use. Most consumer routers allow you to decide how large your subnet will be and can be configured to assign only a subset of IPs in that subnet to hosts via DHCP. + +In my network, I am using the subnet `192.168.2.1/24`, and I decided to give half the IPs to MetalLB. The first half of the subnet consists of IP addresses from `192.168.2.1` to `192.168.2.126`. This range can be represented by a `/25` subnet: `192.168.2.1/25`. The second half of the subnet can similarly be represented by a `/25` subnet: `192.168.2.128/25`. Each half contains 126 IPs—more than enough for the hosts and Kubernetes services. Make sure to decide on subnets appropriate to your own network and configure your router and MetalLB appropriately. + +After configuring the router to ignore addresses in the `192.168.2.128/25` subnet (or whatever subnet you are using), create a configMap to tell MetalLB to use that pool of addresses: + + +``` +# Create the config map +$ cat <<EOF | kubectl create -f - +apiVersion: v1 +kind: ConfigMap +metadata: +  namespace: metallb-system +  name: config +data: +  config: | +    address-pools: +    - name: address-pool-1 +      protocol: layer2 +      addresses: +      - 192.168.2.128/25 +EOF +``` + +The example configMap above uses [CIDR][10] notation, but the list of addresses can also be specified as a range: + + +``` +addresses: + - 192.168.2.128-192.168.2.254 +``` + +Once the configMap is created, MetalLB will be active. Time to try it out! + +### Test MetalLB + +You can test the new MetalLB configuration by creating an example web service, and you can use one from a [previous article][2] in this series: Kube Verify. Use the same image to test that MetalLB is working as expected: `quay.io/clcollins/kube-verify:01`. This image contains an Nginx server listening for requests on port 8080. You can [view the Containerfile][11] used to create the image. If you want, you can instead build your own container image from the Containerfile and use that for testing. + +If you previously created a Kubernetes cluster on Raspberry Pis, you may already have a Kube Verify service running and can [skip to the section][12] on creating a LoadBalancer-type of service. + +#### If you need to create a kube-verify namespace + +If you do not already have a `kube-verify` namespace, create one with the `kubectl` command: + + +``` +# Create a new namespace +$ kubectl create namespace kube-verify +# List the namespaces +$ kubectl get namespaces +NAME              STATUS   AGE +default           Active   63m +kube-node-lease   Active   63m +kube-public       Active   63m +kube-system       Active   63m +metallb-system    Active   21m +kube-verify       Active   19s +``` + +With the namespace created, create a deployment in that namespace: + + +``` +# Create a new deployment +$ cat <<EOF | kubectl create -f - +apiVersion: apps/v1 +kind: Deployment +metadata: +  name: kube-verify +  namespace: kube-verify +  labels: +    app: kube-verify +spec: +  replicas: 3 +  selector: +    matchLabels: +      app: kube-verify +  template: +    metadata: +      labels: +        app: kube-verify +    spec: +      containers: +      - name: nginx +        image: quay.io/clcollins/kube-verify:01 +        ports: +        - containerPort: 8080 +EOF +deployment.apps/kube-verify created +``` + +#### Create a LoadBalancer-type Kubernetes service + +Now expose the deployment by creating a LoadBalancer-type Kubernetes service. If you already have a service named `kube-verify`, this will replace that one: + + +``` +# Create a LoadBalancer service for the kube-verify deployment +cat <<EOF | kubectl apply -f - +apiVersion: v1 +kind: Service +metadata: +  name: kube-verify +  namespace: kube-verify +spec: +  selector: +    app: kube-verify +  ports: +    - protocol: TCP +      port: 80 +      targetPort: 8080 +  type: LoadBalancer +EOF +``` + +You could accomplish the same thing with the `kubectl expose` command: + + +``` +`kubectl expose deployment kube-verify -n kube-verify --type=LoadBalancer --target-port=8080 --port=80` +``` + +MetalLB is listening for services of type LoadBalancer and immediately assigns an external IP (an IP chosen from the range you selected when you set up MetalLB). View the new service and the external IP address MetalLB assigned to it with the `kubectl get service` command: + + +``` +# View the new kube-verify service +$ kubectl get service kube-verify -n kube-verify +NAME          TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE +kube-verify   LoadBalancer   10.105.28.147   192.168.2.129   80:31491/TCP   4m14s + +# Look at the details of the kube-verify service +$ kubectl describe service kube-verify -n kube-verify +Name:                     kube-verify +Namespace:                kube-verify +Labels:                   app=kube-verify +Annotations:              <none> +Selector:                 app=kube-verify +Type:                     LoadBalancer +IP:                       10.105.28.147 +LoadBalancer Ingress:     192.168.2.129 +Port:                     <unset>  80/TCP +TargetPort:               8080/TCP +NodePort:                 <unset>  31491/TCP +Endpoints:                10.244.1.50:8080,10.244.1.51:8080,10.244.2.36:8080 +Session Affinity:         None +External Traffic Policy:  Cluster +Events: +  Type    Reason        Age    From                Message +  ----    ------        ----   ----                ------- +  Normal  IPAllocated   5m55s  metallb-controller  Assigned IP "192.168.2.129" +  Normal  nodeAssigned  5m55s  metallb-speaker     announcing from node "gooseberry" +``` + +In the output from the `kubectl describe` command, note the events at the bottom, where MetalLB has assigned an IP address (yours will vary) and is "announcing" the assignment from one of the nodes in your cluster (again, yours will vary). It also describes the port, the external port you can access the service from (80), the target port inside the container (port 8080), and a node port through which the traffic will route (31491). The end result is that the Nginx server running in the pods of the `kube-verify` service is accessible from the load-balanced IP, on port 80, from anywhere on your home network. + +For example, on my network, the service was exposed on `http://192.168.2.129:80`, and I can `curl` that IP from my laptop on the same network: + + +``` +# Verify that you receive a response from Nginx on the load-balanced IP +$ curl 192.168.2.129 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +    "[http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"\>][13] + +<html xmlns="" xml:lang="en" lang="en"> +<head> +  <title>Test Page for the HTTP Server on Fedora</title> +(further output omitted) +``` + +### MetalLB FTW + +MetalLB is a great load balancer for a home Kubernetes cluster. It allows you to assign real IPs from your home network to services running in your cluster and access them from other hosts on your home network. These services can even be exposed outside the network by port-forwarding traffic through your home router (but please be careful with this!). MetalLB easily replicates cloud-provider-like behavior at home on bare-metal computers, Raspberry Pi-based clusters, and even virtual machines, making it easy to "lift-and-shift" workloads to the cloud or just familiarize yourself with how they work. Best of all, MetalLB is easy and convenient and makes accessing the services running in your cluster a breeze. + +Have you used MetalLB, or do you use another load-balancer solution? Are you primarily using Nginx or HAProxy Ingress? Let me know in the comments! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/homelab-metallb + +作者:[Chris Collins][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/clcollins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers) +[2]: https://opensource.com/article/20/6/kubernetes-raspberry-pi +[3]: https://metallb.universe.tf/ +[4]: https://en.wikipedia.org/wiki/Data_link_layer +[5]: https://en.wikipedia.org/wiki/Address_Resolution_Protocol +[6]: https://en.wikipedia.org/wiki/Transport_layer +[7]: https://en.wikipedia.org/wiki/Border_Gateway_Protocol +[8]: https://kubernetes.io/docs/concepts/services-networking/ingress/ +[9]: https://github.com/metallb/metallb +[10]: https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing +[11]: https://github.com/clcollins/homelabCloudInit/blob/master/simpleCloudInitService/data/Containerfile +[12]: tmp.A4L9yD76e5#loadbalancer +[13]: http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"\> diff --git a/sources/tech/20200703 Create LEGO designs in Blender with this plugin.md b/sources/tech/20200703 Create LEGO designs in Blender with this plugin.md new file mode 100644 index 0000000000..68da8f0339 --- /dev/null +++ b/sources/tech/20200703 Create LEGO designs in Blender with this plugin.md @@ -0,0 +1,100 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Create LEGO designs in Blender with this plugin) +[#]: via: (https://opensource.com/article/20/7/lego-blender-bricker) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Create LEGO designs in Blender with this plugin +====== +Convert your 3D digital models into LEGO designs with Bricker +![Open Lego CAD][1] + +I use [LEGO CAD][2] to document some of my own creations (or "MOCs," as custom sets are called in some digital LEGO communities). The advantage of computer-aided design (CAD) is precision. When you use CAD to build something in virtual space, you can reasonably expect that it can be built in the real world. While the LEGO CAD applications I use don't have simulated physics to verify the structural integrity of my designs, I do lay every brick in the software to mimic a model I've made in real life. + +LEGO bricks aren't just raw materials for design, though. They're also an aesthetic, as evident from LEGO-themed video games and movies. If you're less concerned with precision, but you still want the look of LEGO bricks, there's a great plugin for Blender called [Bricker][3] that can convert your 3D models into LEGO models with the click of a button. + +### Install Bricker + +You can buy Bricker for $65 USD from [BlenderMarket][4], and it's licensed under the GPLv3. Paying for it helps fund development and support. + +To install Bricker, launch Blender, click the **Edit** menu, and select **Preferences**. In the Preferences pane, click the **Add-ons** tab on the left.  + +![Installing an add-on in Blender][5] + +(Seth Kenlon, [CC BY-SA 4.0][6]) + +Start typing "Bricker" in the search box in the upper-right of the **Add-ons** pane, click the **Install** button, and select the Bricker ZIP file when prompted. + +### Convert a 3D model to LEGO bricks + +Whether you have the universal starting point of a plain, gray cube, an elaborate model of your own creation, or something you've downloaded from a Blender model hub, you can give Bricker a try right after installation. + +First, click on the model you want to convert into a LEGO model. With your model selected, press the **N** key on your keyboard to open the **Properties** panel. Click the **Bricker** properties tab, and click the **New Brick Model** button. + +![Bricker properties][7] + +(Seth Kenlon, [CC BY-SA 4.0][6]) + +Now that you've added the model to Bricker, click the new **Brickify Object** button in the Bricker panel. + +The default settings render a pretty blocky model, with mostly 2x10 bricks, no plates, and not much detail. + +![Blocks in Bricker][8] + +(Seth Kenlon, [CC BY-SA 4.0][6]) + +But there are plenty of options in the Bricker plugin for you to customize, and they show up in the Bricker **Properties** panel once you brickify a model. + +![Bricker settings][9] + +(Seth Kenlon, [CC BY-SA 4.0][6]) + +The most important settings in the **Model Settings** panel are: + + * **Brick height** sets the height of each brick in the model. A larger setting produces a less detailed model because fewer bricks are used for the sculpt. + * **Split model** makes every rendered brick an object you can move in Blender. Without this enabled, your model looks like lots of bricks but acts as if they are all glued together. + * **Brick types** controls whether your sculpture is made of bricks, plates, both bricks and plates, tiles, and so on. + * **Max size** sets the maximum size for bricks and plates in your sculpture. + * **Legal bricks only** ensures that all the bricks are based on real ones. For instance, enabling this prevents it from generating a 3x7 brick or a 2x11 plate because there are no such pieces in the LEGO catalog (or at least not in the [LDraw Parts][10] library). + + + +In the **Detailing** panel, you can control whether the undersides of the bricks are flat (which isn't very realistic, but "cheaper" to render) or detailed to mimic the underside of an actual LEGO piece. + +After changing a setting, you must click the **Update Model** button, near the top of the Bricker property panel, to re-render your sculpture. + +![Red dragon model in Bricker][11] + +(Seth Kenlon, [CC BY-SA 4.0][6]) + +### Brickify your designs + +Bricker is a fun stylistic plugin for Blender. While it probably won't be your go-to tool for designing real LEGO sets, it's a great way to sculpt, draw, and animate with virtual LEGO. If you've been putting off your LEGO stop-motion movie magnum opus, now's the time to get started in the virtual world. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/lego-blender-bricker + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/open-lego.tiff_.png?itok=mQglOhW_ (Open Lego CAD) +[2]: https://opensource.com/article/20/6/open-source-virtual-lego +[3]: https://github.com/bblanimation/bricker +[4]: https://www.blendermarket.com/products/bricker/docs +[5]: https://opensource.com/sites/default/files/uploads/bricker-install.jpg (Installing an add-on in Blender) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/bricker-properties.jpg (Bricker properties) +[8]: https://opensource.com/sites/default/files/uploads/bricker-blocky.jpg (Blocks in Bricker) +[9]: https://opensource.com/sites/default/files/uploads/bricker-adjust.jpg (Bricker settings) +[10]: https://www.ldraw.org/parts/official-parts.html +[11]: https://opensource.com/sites/default/files/uploads/red-dragon-bricker.jpg (Red dragon model in Bricker) diff --git a/sources/tech/20200703 How to Create a Pareto Diagram -80-20 Rule- in LibreOffice Calc.md b/sources/tech/20200703 How to Create a Pareto Diagram -80-20 Rule- in LibreOffice Calc.md new file mode 100644 index 0000000000..b001992a6c --- /dev/null +++ b/sources/tech/20200703 How to Create a Pareto Diagram -80-20 Rule- in LibreOffice Calc.md @@ -0,0 +1,146 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to Create a Pareto Diagram [80/20 Rule] in LibreOffice Calc) +[#]: via: (https://itsfoss.com/pareto-chart-libreoffice/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +How to Create a Pareto Diagram [80/20 Rule] in LibreOffice Calc +====== + +_**Brief: In this LibreOffice tip, you’ll learn to create the famous Pareto chart in Calc.**_ + +The [Pareto Principle][1], also known as the 80/20 Rule, The Law of the Vital Few and The Principle of Factor Sparsity, illustrates that 80% of effects arise from 20% of the causes – or in layman’s terms – 20% of your actions/activities will account for 80% of your results/outcomes. + +Although the original observation is related to [economics][2], it can be widely adopted and used across all aspects of business, economics, mathematics, and processes. In computer science, the Pareto principle can be used in [software optimization][3]. + +Let me show you how to create a Pareto diagram in [LibreOffice][4] spreadsheet tool, i.e. Calc. + +### Creating Pareto diagram in LibreOffice Calc + +![][5] + +To be able to create a Pareto diagram, you need these three basic elements: + + * The factors, ranked by the magnitude of their contribution + * The factors expressed numerically + * The cumulative-percent-of-total effect of the ranked factors + + + +First, enter the data in a spreadsheet. Now let’s get started! + +#### Step 1: Sort the data + +Mark all rows from first to the last and at the **Data** tab click on the Sort option. At the **Sort Criteria** tab choose **Sort key 1** and change the entry to **Number of Errors** or whichever name you choose. Make sure to tick **Descending** and finally **OK**. + +![][6] + +#### Step 2: Create the Cumulative Percentage values + +To calculate the cumulative percent of a total, you will need one formula for the first cell (C5) and a different formula for cells C6 and below. + +**Generic formula for the first cell** + +``` +=amount/total +``` + +**In the example shown, the formula in C5 is:** =B5/$B$15 + +**Generic formula for the remaining cells**: + +``` +=(amount/total)+previous cell result +``` + +**In the example shown, the formula in C6 is:** =(B6/$B$15)+C5 + +By dragging the fill handle down, you will get the correct formulas for the remaining cells. + +![][7] + +#### Step 3: Create the Pareto diagram + +To create the chart go to **Insert** tab and then click on the **Chart** option. + +In the upcoming Chart Wizard choose the chart type **Column and Line** with **Number of lines** set to 1 and click Next. + +![][8] + +Select the correct data range **$A$4:$C$14** by either using your mouse in the data range selector or by entering it manually. Leave the settings **Data series in columns**, **First row as label**, **First column as label** and click Next. + +![][9] + +The following Data Series window should have everything filled in correctly, click Next. + +![][10] + +In the last window enter titles and remove the legend: + + * Title: Pareto chart + * X axis: Error Type + * Y axis: Number of Errors + * Untick **Display legend** + * click **Finish**. + + + +![][11] + +And this is the result: + +![][12] + +If the red line appears without any value, select it, then right click > Format Data Series > Align Data Series to Secondary y-Axis > Click OK. + +#### Step 4: Fine tune the chart + +The range of the secondary y-axis is set to **0 – 120** , it needs to be up to **100**. + +Double click on the secondary y-axis . In the **Scale** tab, untick **Automatic** and **enter 100** as the maximum value. Then click ok. + +![][13] + +All done! + +![][14] + +**Conclusion** + +Using a Pareto chart to analyze problems in a business project allows focusing efforts towards the ones offering the most considerable improvement potential. + +This is one of the many real-life scenario where I have used LibreOffice instead of other proprietary office software. I hope to share more LibreOffice tutorials on It’s FOSS. Meanwhile, you can [learn these rather hidden LibreOffice tips][15]. + +Which LibreOffice functionality do you use the most? Let us know at the comments below! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/pareto-chart-libreoffice/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://betterexplained.com/articles/understanding-the-pareto-principle-the-8020-rule/ +[2]: https://en.wikipedia.org/wiki/Pareto_principle#In_economics +[3]: https://en.wikipedia.org/wiki/Program_optimization#Bottlenecks +[4]: https://www.libreoffice.org/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/pareto-libreoffice.png?ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/1.-sort-the-data.png?ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/2.-cumulative-percent.png?ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/3.chart_.png?ssl=1 +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/5.data-range.png?ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/6.data-series.png?fit=800%2C381&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/7.chart-elements.png?fit=800%2C381&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/8.Pareto-chart.png?ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/9.fine-tune.png?ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/10.final_.png?ssl=1 +[15]: https://itsfoss.com/libreoffice-tips/ diff --git a/sources/tech/20200703 What does a scrum master do.md b/sources/tech/20200703 What does a scrum master do.md new file mode 100644 index 0000000000..3bf97d6cad --- /dev/null +++ b/sources/tech/20200703 What does a scrum master do.md @@ -0,0 +1,68 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What does a scrum master do?) +[#]: via: (https://opensource.com/article/20/7/scrum-master) +[#]: author: (Taz Brown https://opensource.com/users/heronthecli) + +What does a scrum master do? +====== +Scrum master is a career path that open source enthusiasts should +consider. Here's what a day in the life of one looks like. +![Digital images of a computer desktop][1] + +Turning a love of open source communities into a career is possible, and there are plenty of directions you can take. The path I'm on these days is as a scrum master. + +[Scrum][2] is a framework in which software development teams deliver working software in increments of 30 days or less called "sprints." There are three roles: scrum master, product owner, and development team. A scrum master is a facilitator, coach, teacher/mentor, and servant/leader that guides the development team through executing the scrum framework correctly. + +The scrum master heads up the daily scrum, sprint planning, sprint review, and sprint retrospectives. As a scrum master, you also remove impediments and help the team to become self-organizing and empowered to create, innovate, and make decisions for themselves as a unit. As a scrum master with a full list of responsibilities, I appreciate a well-organized daily schedule—here's what mine looks like. + +### A day in the life of a scrum master + +5:00am—Wake up and go to the gym for at least 45 minutes, but given the fact that we are working from home now, I will either walk/run on the treadmill or jump rope for 30 minutes +5:45am—Shower and get dressed +6:15am—Have some breakfast and make coffee or espresso +6:40am—Drive into work (or go for a walk around the neighborhood when working remotely) +7:00am—I get to work and clean up the team room before the team gets in (for remote work, I clean up our team wiki) +8:00am—Read emails and respond to priority emails from the team, team manager, or agile coach +8:45am —Get a caffeine refill from the break room +9:00am—Check in with the team and review the team's scrum board in Jira (or another [open source alternative][3]) just to see if there are any patterns of behavior I might need to address. Modify the team's impediment board if any impediments have been removed. +10:00am—Daily scrum (time-boxed for 15 minutes) +10:15am—Discuss parking lot items following the scrum +11:00am—Meet with the team's manager/leadership, or facilitate a community of practice or brown bag lunch around topics such as effective engineering practices +12:00pm—Lunch meeting or coffee with a product owner +1:00pm—Lunch (30 minutes is more than enough time for me) +1:30pm—Possible tasks include facilitating a backlog refinement event leading up to sprint planning, sprint review/demo, or sprint retrospective +2:30pm—Meet with test automation or DevSecOps team +3:00pm—Facilitate a team-building workshop +4:00pm—Final check-ins with the team and then answer final emails +4:30pm—Update the team's scrum journal +5:00pm—Layout my to-do list for the next day + +![Scrum team room setup with sticky notes][4] + +I had been in traditional IT for many years prior to becoming a scrum master. I eventually decided that I could use other skills such as my business experience and management experience to work with software development and DevOps teams to create high-performing teams. + +Software/DevOps teams use scrum to deliver software incrementally, yet faster and with a high level of quality and sustainability. To me, it was a great decision. Being a scrum master is also about removing impediments. I coach the team on how to solve their own problems, but if it becomes necessary, I will step in and help resolve the issues. + +The scrum master role is fun, exciting, and fulfilling, but also pressure-filled and stressful sometimes. But it ultimately, it is worth it to me, as I get to see my teams grow and not only deliver best in class software, but become better people. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/scrum-master + +作者:[Taz Brown][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/computer_desk_home_laptop_browser.png?itok=Y3UVpY0l (Digital images of a computer desktop) +[2]: https://opensource.com/resources/scrum +[3]: https://opensource.com/business/16/2/top-issue-support-and-bug-tracking-tools +[4]: https://opensource.com/sites/default/files/uploads/scrummaster_cropped.jpg (Scrum team room setup with sticky notes ) diff --git a/sources/tech/20200704 Purism-s Ultra-Secure Linux Machine is Now Available in a New Size.md b/sources/tech/20200704 Purism-s Ultra-Secure Linux Machine is Now Available in a New Size.md new file mode 100644 index 0000000000..a85ab84d33 --- /dev/null +++ b/sources/tech/20200704 Purism-s Ultra-Secure Linux Machine is Now Available in a New Size.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Purism’s Ultra-Secure Linux Machine is Now Available in a New Size) +[#]: via: (https://itsfoss.com/purism-librem-14/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Purism’s Ultra-Secure Linux Machine is Now Available in a New Size +====== + +[Purism][1] is well-known for its privacy and security focused hardware and software while utilizing open-source technologies. Not to forget the latest [Purism Librem Mini][2]. + +After a good success with Librem 15 and 13 series laptops, Purism has unveiled Librem 14. + +![][3] + +Librem 14 looks like a perfect laptop for an open-source enthusiast who’s concerned about the security and privacy of a laptop. + +In this article, we will talk about Librem 14 specifications, pricing, and its availability. + +### Librem 14: Overview + +Similar to other variants in the series, Librem 14 offers all the essential security features like the **hardware kill switch** to disable webcam/microphone and its secure PureBoot boot firmware. + +![][4] + +Librem series is one of the rare [few laptops that come preloaded with Linux][5]. Purism uses its own custom distribution called [PureOS][6]. If you’re curious, you can also browse the [source code][7] for it. + +As a key highlight of Librem 14 laptop, here’s what [Purism mentions][8]: + +> The most distinctive feature of the Librem 14 is the new 14″ 1080p IPS matte display which, due to the smaller bezel, fits within the same footprint as the Librem 13. + +Even though that’s not something mind-blowing, it is good to see that they’ve made the laptop fit within the same footprint as its predecessor. + +It’s a great decision targeted for users who do not want a lot of changes with their laptop upgrade or may appreciate a compact dimension of the laptop. + +### Librem 14: Specifications + +![][9] + +Along with the key highlight, Purism’s Librem 14 offers an impressive set of specifications. Here’s what you get: + + * Intel Core i7-10710U (Comet Lake) + * 14″ Matte (1920×1080) Display + * Intel UHD Graphics + * RAM Up to 32GB, DDR4 at 2133 MHz + * 2 SATA + NVMe-capable M.2 slots + * 1 HDMI Port (4K capable @60Hz max) + * USB Type-C Video Out (4K capable) + * 3.5mm AudioJack + * Gigabit Ethernet Adapter with Integrated RJ45 Connector + * Atheros 802.11n w/ Two Antennas + * USB-C Power Delivery Port + * Weight: 1.4 kg + + + +It’s slightly disappointing to see Intel chipsets in 2020 — but considering the presence of PureBoot and other features that Librem 14 offers, an Intel-powered secure laptop makes sense. + +Nevertheless, it’s good to see them including USB Type-C video port. Without dedicated graphics, it may not be a steal deal for power users but it should get a lot of work done. + +Also, it’s worth noting that Purism offers [anti-interdiction services][10] to detect tampering during shipments for high-risk customers. Of course, that wouldn’t prevent tampering — but it’ll help you know about it. + +![][11] + +### Librem 14: Pricing & Availability + +For now, Librem 14 laptop is available for pre-orders with an early big base price of **$1199** ($300 off from its regular price) that features 8 Gigs of RAM and 250 GB of M.2 SATA storage. + +Depending on what you prefer, the price might go up to **$3,693.00** with the maxed out configuration with anti-interdiction services included. + +You can expect the orders to start shipping in the early Q4 2020. + +[Pre-Order Librem 14][12] + +What do you think about Purism’s Librem 14 laptop? Feel free to let me know your thoughts in the comments. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/purism-librem-14/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://puri.sm/ +[2]: https://itsfoss.com/purism-librem-mini/ +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/librem-14.jpg?ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/Hardware-Kill-Switches-librem.jpg?ssl=1 +[5]: https://itsfoss.com/get-linux-laptops/ +[6]: https://itsfoss.com/pureos-convergence/ +[7]: http://repo.pureos.net/pureos/pool/main/ +[8]: https://puri.sm/posts/purism-launches-librem-14-successor-to-security-focused-librem-13-product-line/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/librem-14-1.png?ssl=1 +[10]: https://puri.sm/posts/anti-interdiction-services/ +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/librem14-monitors-1-cropped.png?ssl=1 +[12]: https://puri.sm/products/librem-14/ diff --git a/sources/tech/20200706 A guide to Terraform for Kubernetes beginners.md b/sources/tech/20200706 A guide to Terraform for Kubernetes beginners.md new file mode 100644 index 0000000000..06635ff097 --- /dev/null +++ b/sources/tech/20200706 A guide to Terraform for Kubernetes beginners.md @@ -0,0 +1,735 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A guide to Terraform for Kubernetes beginners) +[#]: via: (https://opensource.com/article/20/7/terraform-kubernetes) +[#]: author: (Jessica Cherry https://opensource.com/users/cherrybomb) + +A guide to Terraform for Kubernetes beginners +====== +Learn how to make a Minikube cluster and deploy to it with Terraform. +![A person programming][1] + +When I build infrastructure, I do it as code. The movement toward [infrastructure as code][2] means that every change is visible, whether it's through configuration management files or full-blown [GitOps][3]. + +[Terraform][4] is a tool for building, upgrading, and maintaining your infrastructure as code. As its [GitHub page][5] explains: + +> "Terraform enables you to safely and predictably create, change, and improve infrastructure. It is an open source tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned." + +The best part is you can import your existing infrastructure into a Terraform configuration state, and all future changes will be tracked. That tracking provides a complete understanding of your production environment (and any other environments), which can be backed up to a local or remote Git repository to version-control the entire infrastructure. + +In this article, I will explain how to use Terraform to manage state in a Minikube Kubernetes cluster. + +### Prerequisites + +Terraform is cloud-agnostic, so you can run about any type of Kubernetes cluster in any cloud by using the associated providers. A [provider][6] is the core of Terraform's plugin architecture, and each provider is "responsible for understanding API interactions and exposing resources" so that the main Terraform project can remain lean, but the project can expand to any system. + +In this example, I'll use [Terraform 11][7] on a Linux desktop. To follow along, you will also need [Helm 2.16.7][8], [Minikube][9], and [kubectl][10]: + + * Download and configure Minikube by following this [documentation][11]. + * Download and configure Helm [using your package manager][12] or do it manually from the [releases][13]. + * Download and install kubectl by following [these steps][10]. + * Install Terraform by downloading the [Linux .tar file][14], untar the file, and move it to `/usr/local/bin/terraform`. + + + +Before running a build, find out what the command-line utility offers. Run `terraform`, and the output will show the execution plan and apply commands. At the bottom, there is an upgrade checklist that will come in handy if you are on an older version of Terraform. The developers have built in a great command to check compatibility between versions. + +### Getting started + +To build something in Terraform, you need to create [modules][15], which are folders with a set of configuration files that can gather information and execute the action you need to complete. Terraform files always end in the file extension `.tf`. Start with one `main.tf` file, such as: + + +``` +`jess@Athena:~/terraform_doc$ touch main.tf` +``` + +You also need to know some basic Terraform commands and requirements before you can start making anything within the cluster: + + * `terraform init`: Initializes a Terraform working directory +– It must be within the same directory as the `.tf` files or nothing will happen. + * `terraform validate`: Confirms the Terraform file's syntax is correct +– Always run this to confirm the code is built correctly and will not have errors. + * `terraform plan`: Generates and shows what will change when you run `terraform apply` +– Run this before `apply` to confirm the results are as you intend. + * `terraform apply`: Builds or changes infrastructure +– It will show the execution plan and requires a yes or no to execute unless you use the `--auto-approve` flag, which will make it execute automatically. + * `Terraform refresh`: Updates the local state file against real resources +– This ensures Terraform has an accurate view of what is in the current environment. + * `terraform destroy`: Deletes and removes Terraform-managed infrastructure +– This will permanently remove anything created and stored in the state file from the cluster. + + + +For the configuration in this example, everything controlled by Terraform is held in a local state file. According to Terraform's [docs][16]: + +> "This state is stored by default in a local file named `terraform.tfstate`, but it can also be stored remotely, which works better in a team environment. Terraform uses this local state to create plans and make changes to your infrastructure. Prior to any operation, Terraform does a refresh to update the state with the real infrastructure." + +Now that you have this background information, you can move on and edit your `main.tf` file, check your cluster, and work towards adding configurations with Terraform. + +### Prep and build Minikube + +Before getting started with Terraform, you must create a Minikube cluster. This example uses Minikube version v1.9.2. Run `minikube start`: + + +``` +jess@Athena:~/terraform_doc$ minikube start +🎉  minikube 1.11.0 is available! Download it: +💡  To disable this notice, run: 'minikube config set WantUpdateNotification false' + +🙄  minikube v1.9.2 on Ubuntu 18.04 +✨  Using the kvm2 driver based on existing profile +👍  Starting control plane node m01 in cluster minikube +🔄  Restarting existing kvm2 VM for "minikube" ... +🐳  Preparing Kubernetes v1.18.0 on Docker 19.03.8 ... +🌟  Enabling addons: default-storageclass, storage-provisioner +🏄  Done! kubectl is now configured to use "minikube" +``` + +### Check your new cluster and add a namespace + +Check your new Minikube cluster with your trusty `kubectl` commands: + + +``` +jess@Athena:~/terraform_doc$ kubectl get nodes +NAME    STATUS   ROLES  AGE     VERSION +minikube   Ready        master   4m5s   v1.18.0 +``` + +The cluster is up and running, so add configurations to your `main.tf` file. First, you'll need a [provider][6], which "is responsible for understanding API interactions and exposing resources." The provider in this example will be (aptly) named [Kubernetes][17]. Edit your `main.tf` file and add the provider: + + +``` +provider "kubernetes" { +  config_context_cluster   = "minikube" +} +``` + +This syntax tells Terraform that the cluster is running in Minikube. + +Now you will need a definition of a resource block. A resource block describes one or more infrastructure objects, such as virtual networks, compute instances, or higher-level components such as DNS records. + +Add one Kubernetes namespace to the cluster: + + +``` +resource "kubernetes_namespace" "1-minikube-namespace" { +  metadata { +        name = "my-first-terraform-namespace" +  } +} +``` + +Next, run the `terraform init` command to check your provider version and initialize Terraform: + + +``` +jess@Athena:~/terraform_doc$ terraform init + +Initializing provider plugins... + +The following providers do not have any version constraints in configuration, +so the latest version was installed. + +To prevent automatic upgrades to new major versions that may contain breaking +changes, it is recommended to add version = "..." constraints to the +corresponding provider blocks in configuration, with the constraint strings +suggested below. + +* provider.kubernetes: version = "~> 1.11" + +Terraform has been successfully initialized! + +You may now begin working with Terraform. Try running "terraform plan" to see +any changes that are required for your infrastructure. All Terraform commands +should now work. + +If you ever set or change modules or backend configuration for Terraform, +rerun this command to reinitialize your working directory. If you forget, other +commands will detect it and remind you to do so if necessary. +``` + +Run your plan to see what will be executed: + + +``` +jess@Athena:~/terraform_doc$ terraform plan +Refreshing Terraform state in-memory prior to plan... +The refreshed state will be used to calculate this plan, but will not be +persisted to local or remote state storage. + +\------------------------------------------------------------------------ + +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + +  + kubernetes_namespace.1-minikube-namespace +        id:                            <computed> +        metadata.#:                     "1" +        metadata.0.generation:         <computed> +        metadata.0.name:               "my-first-terraform-namespace" +        metadata.0.resource_version: <computed> +        metadata.0.self_link:          <computed> +        metadata.0.uid:                <computed> + +Plan: 1 to add, 0 to change, 0 to destroy. + +\------------------------------------------------------------------------ + +Note: You didn't specify an "-out" parameter to save this plan, so Terraform +can't guarantee that exactly these actions will be performed if +"terraform apply" is subsequently run. +``` + +Now that you know what Terraform will do, apply your configuration: + + +``` +jess@Athena:~/terraform_doc$ terraform apply + +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + +  + kubernetes_namespace.1-minikube-namespace +        id:                            <computed> +        metadata.#:                     "1" +        metadata.0.generation:         <computed> +        metadata.0.name:               "my-first-terraform-namespace" +        metadata.0.resource_version: <computed> +        metadata.0.self_link:          <computed> +        metadata.0.uid:                <computed> + +Plan: 1 to add, 0 to change, 0 to destroy. + +Do you want to perform these actions? +  Terraform will perform the actions described above. +  Only 'yes' will be accepted to approve. + +  Enter a value: yes + +\----------------------------------- + +kubernetes_namespace.1-minikube-namespace: Creating... +  metadata.#:                   "" => "1" +  metadata.0.generation:       "" => "<computed>" +  metadata.0.name:             "" => "my-first-terraform-namespace" +  metadata.0.resource_version: "" => "<computed>" +  metadata.0.self_link:        "" => "<computed>" +  metadata.0.uid:              "" => "<computed>" +kubernetes_namespace.1-minikube-namespace: Creation complete after 0s (ID: my-first-terraform-namespace) + +Apply complete! Resources: 1 added, 0 changed, 0 destroyed. +``` + +Finally, confirm that your new namespace exists by running `kubectl get ns`: + + +``` +jess@Athena:~/terraform_doc$ kubectl get ns +NAME                            STATUS   AGE +default                         Active   28d +kube-node-lease                 Active   28d +kube-public                     Active   28d +kube-system                     Active   28d +my-first-terraform-namespace   Active   2m19s +``` + +### Run it through a Helm chart + +The ability to manually write a Terraform configuration file, run it, and see results in Kubernetes is nice. What's even nicer? Being able to rerun the same commands through a Helm chart. + +Run the `helm create ` command to generate a chart: + + +``` +$ helm create buildachart +Creating buildachart +``` + +You need another provider block for this exercise. There is a specific Helm provider, and it requires a Kubernetes cluster name so that Helm knows where to install its chart. Add the new provider, which is shown below, to your existing `main.tf` file: + + +``` +provider "helm" { +  kubernetes { +        config_context_cluster   = "minikube" +        +  } +} +``` + +Now that Helm is configured, you need to add a Helm chart for this terraform module to install. To keep things simple, keep the Helm chart in the same folder you're using for your Terraform state: + + +``` +jess@Athena:~/terraform_doc$ ls +buildachart  main.tf  terraform.tfstate +``` + +Add the new Helm resource so that the chart can be installed and tracked through your Terraform state by using the `helm_release` resource. I named this resource `local` and imported my chart name and my chart location: + + +``` +resource "helm_release" "local" { +  name          = "buildachart" +  chart         = "./buildachart" +} +``` + +Now that you've added these pieces, run Terraform's initialization command again. It will update the state based on your changes, including downloading a new provider: + + +``` +jess@Athena:~/terraform_doc$ terraform init + +Initializing provider plugins... +\- Checking for available provider plugins on ... +\- Downloading plugin for provider "helm" (1.2.2)... + +The following providers do not have any version constraints in configuration, +so the latest version was installed. + +To prevent automatic upgrades to new major versions that may contain breaking +changes, it is recommended to add version = "..." constraints to the +corresponding provider blocks in configuration, with the constraint strings +suggested below. + +* provider.helm: version = "~> 1.2" +* provider.kubernetes: version = "~> 1.11" + +Terraform has been successfully initialized! + +You may now begin working with Terraform. Try running "terraform plan" to see +any changes that are required for your infrastructure. All Terraform commands +should now work. + +If you ever set or change modules or backend configuration for Terraform, +rerun this command to reinitialize your working directory. If you forget, other +commands will detect it and remind you to do so if necessary. +``` + +Then plan your new configurations: + + +``` +jess@Athena:~/terraform_doc$ terraform plan +Refreshing Terraform state in-memory prior to plan... +The refreshed state will be used to calculate this plan, but will not be +persisted to local or remote state storage. + +kubernetes_namespace.1-minikube-namespace: Refreshing state... (ID: my-first-terraform-namespace) + +\------------------------------------------------------------------------ + +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: +  + create + +Terraform will perform the following actions: + +  + helm_release.local +        id:                             <computed> +        atomic:                         "false" +        chart:                          "./buildachart" +        cleanup_on_fail:                "false" +        create_namespace:               "false" +        dependency_update:              "false" +        disable_crd_hooks:              "false" +        disable_openapi_validation: "false" +        disable_webhooks:               "false" +        force_update:                   "false" +        lint:                           "false" +        max_history:                    "0" +        metadata.#:                     <computed> +        name:                           "buildachart" +        namespace:                      "default" +        recreate_pods:                  "false" +        render_subchart_notes:          "true" +        replace:                        "false" +        reset_values:                   "false" +        reuse_values:                   "false" +        skip_crds:                      "false" +        status:                         "deployed" +        timeout:                        "300" +        verify:                         "false" +        version:                        "0.1.0" +        wait:                           "true" + +Plan: 1 to add, 0 to change, 0 to destroy. + +\------------------------------------------------------------------------ + +Note: You didn't specify an "-out" parameter to save this plan, so Terraform +can't guarantee that exactly these actions will be performed if +"terraform apply" is subsequently run. +``` + +Apply your configuration, only this time add the `--auto-approve` flag so it will execute without confirmation: + + +``` +jess@Athena:~/terraform_doc$ terraform apply --auto-approve +kubernetes_namespace.1-minikube-namespace: Refreshing state... (ID: my-first-terraform-namespace) +helm_release.local: Creating... +  atomic:                      "" => "false" +  chart:                       "" => "./buildachart" +  cleanup_on_fail:             "" => "false" +  create_namespace:            "" => "false" +  dependency_update:           "" => "false" +  disable_crd_hooks:           "" => "false" +  disable_openapi_validation: "" => "false" +  disable_webhooks:            "" => "false" +  force_update:                "" => "false" +  lint:                        "" => "false" +  max_history:                 "" => "0" +  metadata.#:                   "" => "<computed>" +  name:                        "" => "buildachart" +  namespace:                   "" => "default" +  recreate_pods:               "" => "false" +  render_subchart_notes:       "" => "true" +  replace:                     "" => "false" +  reset_values:                "" => "false" +  reuse_values:                "" => "false" +  skip_crds:                   "" => "false" +  status:                      "" => "deployed" +  timeout:                     "" => "300" +  verify:                      "" => "false" +  version:                     "" => "0.1.0" +  wait:                        "" => "true" +helm_release.local: Creation complete after 8s (ID: buildachart) + +Apply complete! Resources: 1 added, 0 changed, 0 destroyed. +``` + +Although it says the chart deployed, it's always nice to double-check and confirm that the new Helm chart is in place. Check to see if your pod made it by using a `kubectl` command: + + +``` +jess@Athena:~/terraform_doc$ kubectl get pods +NAME                            READY   STATUS  RESTARTS   AGE +buildachart-68c86ccf5f-lchc5   1/1      Running   0             43s +``` + +This confirms your pod is running, which means your chart deployed! You also have a new backup state file: + + +``` +jess@Athena:~/terraform_doc$ ls +buildachart  main.tf  terraform.tfstate  terraform.tfstate.backup +``` + +Terraform is protective of state, which is a great feature. It automatically generates a previous-state file after each update. This allows version control of your infrastructure, and you can always save the current and most recent state. Since this is a local build, stick with the current and previous states without version control. + +### Rollback a change and import something + +As you run Terraform commands, the backup state file is generated and updated, which means you can roll back previous changes exactly once unless you are holding state files in storage somewhere else (e.g., a database) with other configurations to manage the files. + +In this example, you need to roll back your Helm chart deployment. Why? Well, because you can. + +Before you do anything, take a minute to run the `terraform refresh` command to see if there is anything different between the cluster and the current state: + + +``` +jess@Athena:~/terraform_doc$ terraform refresh +helm_release.local: Refreshing state... (ID: buildachart) +kubernetes_namespace.1-minikube-namespace: Refreshing state... (ID: my-first-terraform-namespace) +``` + +There is a weird workaround to roll back changes: You can overwrite your state file with the backup file, or you can comment the code changes you rolled out through Terraform files and allow Terraform to destroy them. + +In this example, I'll comment-out code and rerun Terraform, so the Helm chart will be deleted. Comments begin with `//` in Terraform files: + + +``` +jess@Athena:~/terraform_doc$ cat main.tf +provider "kubernetes" { +  config_context_cluster   = "minikube" +} + +resource "kubernetes_namespace" "1-minikube-namespace" { +  metadata { +        name = "my-first-terraform-namespace" +  } +} + +//provider "helm" { +//  kubernetes { +//      config_context_cluster   = "minikube" +//  } +//} +//resource "helm_release" "local" { +//  name        = "buildachart" +//  chart       = "./buildachart" +//} +``` + +After you comment everything out, run `terraform apply`: + + +``` +jess@Athena:~/terraform_doc$ terraform apply +helm_release.local: Refreshing state... (ID: buildachart) +null_resource.minikube: Refreshing state... (ID: 4797320155365789412) +kubernetes_namespace.1-minikube-namespace: Refreshing state... (ID: my-terraform-namespace) + +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + - destroy + +Terraform will perform the following actions: + +  - helm_release.local + +Plan: 0 to add, 0 to change, 1 to destroy. + +Do you want to perform these actions? +  Terraform will perform the actions described above. +  Only 'yes' will be accepted to approve. + +  Enter a value: yes + +helm_release.local: Destroying... (ID: buildachart) +helm_release.local: Destruction complete after 0s + +Apply complete! Resources: 0 added, 0 changed, 1 destroyed. +``` + +To see what overwriting the file looks like, reapply the Helm chart and overwrite the state file. Here is a snippet of the chart being recreated (this text output can be pretty long): + + +``` +helm_release.local: Still creating... (10s elapsed) +helm_release.local: Creation complete after 15s (ID: buildachart) + +Apply complete! Resources: 1 added, 0 changed, 0 destroyed. + +Here’s the file overwrite and the plan showing that the helm chart needs to be rerun. +jess@Athena:~/terraform_doc$ cp terraform.tfstate.backup terraform.tfstate +jess@Athena:~/terraform_doc$ terraform plan +Refreshing Terraform state in-memory prior to plan... +The refreshed state will be used to calculate this plan, but will not be +persisted to local or remote state storage. + +null_resource.minikube: Refreshing state... (ID: 4797320155365789412) +kubernetes_namespace.1-minikube-namespace: Refreshing state... (ID: my-terraform-namespace) + +\------------------------------------------------------------------------ + +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + +  + helm_release.local +        id:                            <computed> +        atomic:                        "false" +        chart:                         "./buildachart" +        cleanup_on_fail:               "false" +        create_namespace:              "false" +        dependency_update:             "false" +        disable_crd_hooks:             "false" +        disable_openapi_validation: "false" +        disable_webhooks:              "false" +        force_update:                  "false" +        max_history:                   "0" +        metadata.#:                     <computed> +        name:                          "buildachart" +        namespace:                     "default" +        recreate_pods:                 "false" +        render_subchart_notes:         "true" +        replace:                       "false" +        reset_values:                  "false" +        reuse_values:                  "false" +        skip_crds:                     "false" +        status:                        "deployed" +        timeout:                       "300" +        verify:                        "false" +        version:                       "0.1.0" +        wait:                          "true" + +Plan: 1 to add, 0 to change, 0 to destroy. + +\------------------------------------------------------------------------ + +Note: You didn't specify an "-out" parameter to save this plan, so Terraform +can't guarantee that exactly these actions will be performed if +"terraform apply" is subsequently run. +``` + +Be aware that you will run into a problem if you do not clean up the environment when overwriting your state files. That problem shows up in the name usage: + + +``` +Do you want to perform these actions? +  Terraform will perform the actions described above. +  Only 'yes' will be accepted to approve. + +  Enter a value: yes + +helm_release.local: Creating... +  atomic:                      "" => "false" +  chart:                       "" => "./buildachart" +  cleanup_on_fail:             "" => "false" +  create_namespace:            "" => "false" +  dependency_update:           "" => "false" +  disable_crd_hooks:           "" => "false" +  disable_openapi_validation: "" => "false" +  disable_webhooks:            "" => "false" +  force_update:                "" => "false" +  max_history:                 "" => "0" +  metadata.#:                   "" => "<computed>" +  name:                        "" => "buildachart" +  namespace:                   "" => "default" +  recreate_pods:               "" => "false" +  render_subchart_notes:       "" => "true" +  replace:                     "" => "false" +  reset_values:                "" => "false" +  reuse_values:                "" => "false" +  skip_crds:                   "" => "false" +  status:                      "" => "deployed" +  timeout:                     "" => "300" +  verify:                      "" => "false" +  version:                     "" => "0.1.0" +  wait:                        "" => "true" + +Error: Error applying plan: + +1 error occurred: +    * helm_release.local: 1 error occurred: +    * helm_release.local: cannot re-use a name that is still in use + +Terraform does not automatically rollback in the face of errors. +Instead, your Terraform state file has been partially updated with +any resources that successfully completed. Please address the error +above and apply again to incrementally change your infrastructure. +``` + +This creates a reuse issue due to commenting out and bringing back a resource. To fix this, do a state import, which allows you to take something that is already out in the environment and let Terraform start to track it again. + +For this, you need the namespace and chart name you want to import along with the module name you are importing. The module in this case is `helm.local`, and it is generated from your resource code in the resource that begins with `"helm_release" "local"`. + +For the reimport, you will need the namespace where the resource is currently deployed, so the import will look like `default/buildachart`. This format is required for anything involving a namespace: + + +``` +jess@Athena:~/terraform_doc$ terraform import helm_release.local default/buildachart +helm_release.local: Importing from ID "default/buildachart"... +helm_release.local: Import complete! +  Imported helm_release (ID: buildachart) +helm_release.local: Refreshing state... (ID: buildachart) + +Import successful! + +The resources that were imported are shown above. These resources are now in +your Terraform state and will henceforth be managed by Terraform. +``` + +This process of reimporting can be tricky, but it's important for state management. + +### Clean up + +What's so nice about Terraform is that you can quickly clean up after yourself when you're testing. The `follow` command is another great way to ruin your day if you aren't careful about where you run it: + + +``` +jess@Athena:~/terraform_doc$ terraform destroy +helm_release.local: Refreshing state... (ID: buildachart) +kubernetes_namespace.1-minikube-namespace: Refreshing state... (ID: my-first-terraform-namespace) + +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + - destroy + +Terraform will perform the following actions: + +  - helm_release.local +  - kubernetes_namespace.1-minikube-namespace + +Plan: 0 to add, 0 to change, 2 to destroy. + +Do you really want to destroy all resources? +  Terraform will destroy all your managed infrastructure, as shown above. +  There is no undo. Only 'yes' will be accepted to confirm. + +  Enter a value: yes + +helm_release.local: Destroying... (ID: buildachart) +kubernetes_namespace.1-minikube-namespace: Destroying... (ID: my-first-terraform-namespace) +helm_release.local: Destruction complete after 1s +kubernetes_namespace.1-minikube-namespace: Destruction complete after 7s + +Destroy complete! Resources: 2 destroyed. +``` + +One run of `terraform destroy` removed your pods and namespace, but your cluster remains. You are back to square one: + + +``` +jess@Athena:~/terraform_doc$ kubectl get pods +No resources found in default namespace. + +jess@Athena:~/terraform_doc$ kubectl get ns +NAME            STATUS   AGE +default         Active   28d +kube-node-lease   Active   28d +kube-public     Active   28d +kube-system     Active   28d + +jess@Athena:~/terraform_doc$ minikube status +m01 +host: Running +kubelet: Running +apiserver: Running +kubeconfig: Configured +``` + +### Final notes + +To say you can make anything with Terraform is an understatement. It's a tool that can manage every aspect of environment creation and destruction. It has a powerful and simple concept of state management that can allow teams to stay in sync with the organization's intended infrastructure. + +However, if you are not careful, this tool can be rather unforgiving. If you are moving state files and not paying attention, you can cause a bit of an issue with what Terraform believes it needs to manage. When you are using this tool, be careful not to overextend yourself or write too much at once, as you can code yourself into a corner if you aren't paying attention. + +Terraform is best when it's used for infrastructure provisioning. It minimizes what problems happen when managing state, and allows tools designed for configuration and deployment to complement its features. + +What have you done with Terraform and Kubernetes? Share your experience in the comments below. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/terraform-kubernetes + +作者:[Jessica Cherry][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cherrybomb +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb (A person programming) +[2]: https://opensource.com/article/19/7/infrastructure-code +[3]: https://thenewstack.io/what-is-gitops-and-why-it-might-be-the-next-big-thing-for-devops/ +[4]: https://www.terraform.io/ +[5]: https://github.com/hashicorp/terraform +[6]: https://www.terraform.io/docs/providers/index.html +[7]: https://releases.hashicorp.com/terraform/0.11.14/ +[8]: https://github.com/helm/helm/releases/tag/v2.16.7 +[9]: https://opensource.com/article/18/10/getting-started-minikube +[10]: https://kubernetes.io/docs/tasks/tools/install-kubectl/ +[11]: https://kubernetes.io/docs/tasks/tools/install-minikube/ +[12]: https://github.com/helm/helm#install +[13]: https://github.com/helm/helm/releases +[14]: https://releases.hashicorp.com/terraform/ +[15]: https://www.terraform.io/docs/configuration/modules.html +[16]: https://www.terraform.io/docs/state/index.html +[17]: https://registry.terraform.io/providers/hashicorp/kubernetes diff --git a/sources/tech/20200708 A visual guide to Lens- A new way to see Kubernetes.md b/sources/tech/20200708 A visual guide to Lens- A new way to see Kubernetes.md new file mode 100644 index 0000000000..6802f641f3 --- /dev/null +++ b/sources/tech/20200708 A visual guide to Lens- A new way to see Kubernetes.md @@ -0,0 +1,246 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A visual guide to Lens: A new way to see Kubernetes) +[#]: via: (https://opensource.com/article/20/7/kubernetes-lens) +[#]: author: (Jessica Cherry https://opensource.com/users/cherrybomb) + +A visual guide to Lens: A new way to see Kubernetes +====== +Navigate advanced Kubernetes administration without the command line +with Lens, the "Kubernetes IDE." +![Cat wearing glasses][1] + +There are many [Kubernetes][2] administration tools to choose from, whether you prefer a command-line utility or a graphical user interface. I recently covered [k9s][3], a text-based interface that many day-to-day Kubernetes administrators enjoy, but you have to navigate through many Kubernetes-specific terms to use it. A lot of people who use Kubernetes less often would rather have a colorful, clean visual guide. This is where [Lens][4], an open source integrated development environment (IDE) tool for administering Kubernetes clusters, comes in. + +### Install Lens + +You can download Lens for Linux, macOS, or Windows from either its [GitHub][5] page or its [website][4]. Linux installs are offered through AppImage, and [this tutorial][6] walks you through the installation process. After installation, Lens appeared in my applications list (the blue box with the L in the center). + +![Lens app icon][7] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +### Add a cluster + +Managing Kubernetes means keeping an eye on one or more clusters. To add a cluster to Lens, click the large **+** sign, choose your cluster from the drop-down list, and click **Add Cluster**. Environments are automatically picked up from your `~/.kube/config` file. + +![Adding a cluster in Lens][9] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +### Explore Lens' menus + +Lens gives you all the information you need about a cluster it manages. To help you get started, I'll explore the Lens menu sections with screenshots to show you what information and options they offer. + +If you need a refresher on Kubernetes terminology, [_A beginner's guide to Kubernetes container orchestration_][10] is a good place to read about it. + +#### Nodes menu + +First, look at the **Nodes**. A node can be a virtual machine or physical (bare metal) machine depending on the cluster. Each node contains the services necessary to run Pods, managed by the control plane. We can start by checking if our nodes are up and running in a Ready state. If there were an issue, this page would provide details as to what is wrong with the node. + +![Lens Nodes menu][11] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +#### Workloads menu + +The **Workloads** section provides a lot of information about your cluster. You can access its subsections with either the menu on the left or at the top of the pane—both work the same way. + +##### Overview + +Click **Overview** to see the events happening in the cluster, as well as how many Pods, Deployments, StatefulSets, DaemonSets, Jobs, and CronJobs are running in it. You can select each Overview item to see details about it. + +![Lens Workloads Overview menu][12] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +##### Pods + +Click **Pods** to see a list of the pods in the cluster. + +![Lens Workloads Pods menu][13] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +Click on a pod name in the **Pods** section of **Workloads**, and it will bring up a details pane on the right with a ton of things you can do really quickly. + +![Lens Workloads Pod details][14] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +Open the pod's logs by clicking on the multi-line button (the second icon from the left) on the top-right of the pod detail window. + +![Lens Workloads Pod logs][15] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +If you need to shell into a pod, Lens has a terminal built into it. Access it by clicking the terminal button (the left-most icon) above the pod detail. + +![Shelling into a pod in Lens][16] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +A terminal will open. + +![Shelling into a pod in Lens][17] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +##### Deployments + +**Deployments** shows what Deployments are in the cluster. + +![Lens Workloads Deployments menu][18] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +#### Configuration menu + +**Configuration** shows ConfigMaps, Secrets, Resource Quotas, and Horizontal Pod Autoscalers (HPA). + +![Lens ConfigMaps menu][19] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +#### Network menu + +**Network** includes options for managing your network services, endpoints, ingresses, and network policies. + +##### Network Services + +![Lens Network Services menu][20] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +If you see a pencil icon (like the one in the top-right corner above), clicking it will open a terminal window where you can edit the configurations. + +![Editing configurations in Lens][21] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +#### Storage menu + +Storage options, including PersistentVolumes and StorageClasses, are also navigable. + +![Lens StorageClasses menu][22] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +#### Namespaces menu + +**Namespaces** shows a list of your namespaces. + +![Lens Namespaces menu][23] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +#### Apps menu + +Lens' crown jewel is its one-click (OK, more like three-click) process for installing apps with [Helm charts][24]. I would suggest using this only on your local cluster, but it's still a nice add-on in Lens. + +To install a chart, click **Apps** in the left navigation and click **Charts**. A list of all the charts available through Helm (and its stable repository) appears. + +![Helm charts in Lens' Apps menu][25] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +You can also find a chart using **Search**. Click on the chart you want, and a window will open on the right with a large **Install** button. + +![Searching for Helm charts in Lens' Apps menu][26] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +Click **Install** and a terminal will open at the bottom with another **Install** button in the lower-right. Click it. + +![Installing a Helm chart in Lens][27] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +It installs the Helm chart and tells you when it's finished. + +![Installing a Helm chart in Lens][28] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +You can double-check that the Helm chart is installed in your cluster by looking in the **Pods** section under **Workloads**. + +![Confirming Helm chart in Lens][29] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +The Helm install takes under a minute and, because Lens has an edit function in each detail window, you can manually configure the apps you install. In my opinion, this is the only downfall of this function—I prefer to use my own values because it's hard to track manual changes. Why do I consider this a problem? If you're working with a repo with versioned helm charts and need to run a manual change without checking in the changed values, you quickly run into code drift. + +#### Access Control menu + +The **Access Control** section includes Service Accounts, Roles, Role Bindings, and Pod Security Policies, so you can visualize and edit the security you have in place (as you can see in the following screenshots). Service Accounts are the equivalent of Linux user accounts, but they are intended for processes running in a cluster. Running applications are attached to Roles, which have Role Bindings to the cluster to allow pods to access certain administrative permissions. Pod Security Policies are a more glandular level of security for the pods to have access to resources like certain volume types or to set seccomp profiles used by containers.  + +##### Service Accounts + +![Lens Access Control Service Accounts menu][30] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +##### Role Bindings + +![Lens Access Control RoleBindings menu][31] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +##### Roles + +![Lens Access Control Roles menu][32] + +(Jess Cherry, [CC BY-SA 4.0][8]) + +#### Final notes + +Lens is a beautiful and powerful alternative to managing Kubernetes from the command line. There are some times when you'll want to use the command line, mostly due to the drawbacks of manually editing charts before launching them or for tracking environmental changes. If you have good log-keeping practices in your cluster, this may not be a problem. If you are a visual person, Lens is a great way to explore your Kubernetes cluster and handle 95% of your administrative tasks. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/kubernetes-lens + +作者:[Jessica Cherry][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cherrybomb +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cat-glasses-read.png?itok=BigdrxUU (Cat wearing glasses) +[2]: https://opensource.com/resources/what-is-kubernetes +[3]: https://opensource.com/article/20/5/kubernetes-administration +[4]: https://k8slens.dev/ +[5]: https://github.com/lensapp/lens +[6]: https://opensource.com/article/20/6/kubernetes-cluster-lens +[7]: https://opensource.com/sites/default/files/uploads/lens_1_homescreen.png (Lens app icon) +[8]: https://creativecommons.org/licenses/by-sa/4.0/ +[9]: https://opensource.com/sites/default/files/uploads/lens_2-addcluster.png (Adding a cluster in Lens) +[10]: https://opensource.com/article/20/6/container-orchestration +[11]: https://opensource.com/sites/default/files/uploads/lens_3-nodes.png (Lens Nodes menu) +[12]: https://opensource.com/sites/default/files/uploads/lens_4-overview.png (Lens Workloads Overview menu) +[13]: https://opensource.com/sites/default/files/uploads/lens_5-pods.png (Lens Workloads Pods menu) +[14]: https://opensource.com/sites/default/files/uploads/lens_7-poddetails.png (Lens Workloads Pod details) +[15]: https://opensource.com/sites/default/files/uploads/lens_8-podlogs.png (Lens Workloads Pod logs) +[16]: https://opensource.com/sites/default/files/uploads/lens_9-podshelling1.png (Shelling into a pod in Lens) +[17]: https://opensource.com/sites/default/files/uploads/lens_10-podshelling2.png (Shelling into a pod in Lens) +[18]: https://opensource.com/sites/default/files/uploads/lens_6-deployments.png (Lens Workloads Deployments menu) +[19]: https://opensource.com/sites/default/files/uploads/lens_12-configmaps.png (Lens ConfigMaps menu) +[20]: https://opensource.com/sites/default/files/uploads/lens_14-networkservices2.png (Lens Network Services menu) +[21]: https://opensource.com/sites/default/files/uploads/lens_15-editconfig.png (Editing configurations in Lens) +[22]: https://opensource.com/sites/default/files/uploads/lens_18-storageclass3.png (Lens StorageClasses menu) +[23]: https://opensource.com/sites/default/files/uploads/lens_11-namespaces.png (Lens Namespaces menu) +[24]: https://opensource.com/article/20/5/helm-charts +[25]: https://opensource.com/sites/default/files/uploads/lens_22_apps.png (Helm charts in Lens' Apps menu) +[26]: https://opensource.com/sites/default/files/uploads/lens_23_searchapps.png (Searching for Helm charts in Lens' Apps menu) +[27]: https://opensource.com/sites/default/files/uploads/lens_24_installapps.png (Installing a Helm chart in Lens) +[28]: https://opensource.com/sites/default/files/uploads/lens_25_helminstall.png (Installing a Helm chart in Lens) +[29]: https://opensource.com/sites/default/files/uploads/lens_26_confirminstall.png (Confirming Helm chart in Lens) +[30]: https://opensource.com/sites/default/files/uploads/lens_19-accesscontrol.png (Lens Access Control Service Accounts menu) +[31]: https://opensource.com/sites/default/files/uploads/lens_20_rolebindings.png (Lens Access Control RoleBindings menu) +[32]: https://opensource.com/sites/default/files/uploads/lens_21_roles.png (Lens Access Control Roles menu) diff --git a/sources/tech/20200709 Expand your Raspberry Pi with Arduino ports.md b/sources/tech/20200709 Expand your Raspberry Pi with Arduino ports.md new file mode 100644 index 0000000000..611b965f5b --- /dev/null +++ b/sources/tech/20200709 Expand your Raspberry Pi with Arduino ports.md @@ -0,0 +1,602 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Expand your Raspberry Pi with Arduino ports) +[#]: via: (https://opensource.com/article/20/7/arduino-raspberry-pi) +[#]: author: (Patrick Martins de Lima https://opensource.com/users/pattrickx) + +Expand your Raspberry Pi with Arduino ports +====== +For this project, explore Raspberry Pi port expansions using Java, +serial, and Arduino. +![Parts, modules, containers for software][1] + +As members of the maker community, we are always looking for creative ways to use hardware and software. This time, [Patrick Lima][2] and I decided we wanted to expand the Raspberry Pi's ports using an Arduino board, so we could access more functionality and ports and add a layer of protection to the device. There are a lot of ways to use this setup, such as building a solar panel that follows the sun, a home weather station, joystick interaction, and more. + +We decided to start by building a dashboard that allows the following serial port interactions: + + * Control three LEDs to turn them on and off + * Control three LEDs to adjust their light intensity + * Identify which ports are being used + * Show input movements on a joystick + * Measure temperature + + + +We also want to show all the interactions between ports, hardware, and sensors in a nice user interface (UI) like this: + +![UI dashboard][3] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +You can use the concepts in this article to build many different projects that use many different components. Your imagination is the limit! + +### 1\. Get started + +![Raspberry Pi and Arduino logos][5] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +The first step is to expand the Raspberry Pi's ports to also use Arduino ports. This is possible using Linux ARM's native serial communication implementation that enables you to use an Arduino's digital, analogical, and Pulse Width Modulation (PWM) ports to run an application on the Raspberry Pi. + +This project uses [TotalCross][6], an open source software development kit for building UIs for embedded devices, to execute external applications through the terminal and use the native serial communication. There are two classes you can use to achieve this: [Runtime.exec][7] and [PortConnector][8]. They represent different ways to execute these actions, so we will show how to use both in this tutorial, and you can decide which way is best for you. + +To start this project, you need: + + * 1 Raspberry Pi 3 + * 1 Arduino Uno + * 3 LEDs + * 2 resistors between 1K and 2.2K ohms + * 1 push button + * 1 potentiometer between 1K and 50K ohms + * 1 protoboard (aka breadboard) + * Jumpers + + + +### 2\. Set up the Arduino + +Create a communication protocol to receive messages, process them, execute the request, and send a response between the Raspberry Pi and the Arduino. This is done on the Arduino. + +#### 2.1 Define the message format + +Every message received will have the following format: + + * Indication of the function called + * Port used + * A char separator, if needed + * A value to be sent, if needed + * Indication of the message's end + + + +The following table presents the list of characters with their respective functions, example values, and descriptions of the example. The choice of characters used in this example is arbitrary and can be changed anytime. + +Characters | Function | Example | Description of the example +---|---|---|--- +* | End of the instruction | - | - +, | Separator | - | - +# | Set mode | #8,0* | Pin 8 input mode +< | Set digital value | <1,0* | Set pin 1 low +> | Get digital value | >13* | Get value pin 13 ++ | Get PWM value | +6,250* | Set pin 6 value 250 +- | Get analogic value | -14* | Get value pin A0 + +#### 2.2 Source code + +The following source code implements the communication protocol specified above. It must be sent to the Arduino, so it can interpret and execute messages' commands: + + +``` +void setup() { + Serial.begin(9600); + Serial.println("Connected"); + Serial.println("Waiting command..."); +} + +void loop() { +String text=""; +char character; +String pin=""; +String value="0"; +char separator='.'; +char inst='.'; + + while(Serial.available()){ // verify RX is getting data +   delay(10); +   character= Serial.read(); +   if(character=='*'){ +     action(inst,pin,value); +     break; +    } +    else { +     text.concat(character);} + +   if(character==',') { +     separator=character; +    +   if(inst=='.'){ +     inst = character;} +   else if(separator!=',' && character!=inst ){ +     pin.concat(character);} +   else if (character!=separator && character!=inst ){ +     value.concat(character);} + } +} + +void action(char instruction, String pin, String value){ + if (instruction=='#'){//pinMode +   pinMode(pin.toInt(),value.toInt()); + } + + if (instruction=='<'){//digitalWrite +   digitalWrite(pin.toInt(),value.toInt()); + } + + if (instruction=='>'){ //digitalRead +   String aux= pin+':'+String(digitalRead(pin.toInt())); +   Serial.println(aux); + } + + if (instruction=='+'){ // analogWrite = PWM +   analogWrite(pin.toInt(),value.toInt()); + } + + if (instruction=='-'){ // analogRead +   String aux= pin+':'+String(analogRead(pin.toInt())); +   Serial.println(aux); + } +} +``` + +#### 2.3 Build the electronics + +Define what you need to test to check communication with the Arduino and ensure the inputs and outputs are responding as expected: + + * LEDs are connected with positive logic. Connect to the GND pin through a resistor and activate it with the digital port I/O 2 and PWM 3. + * The button has a pull-down resistor connected to the digital port I/O 4, which sends a signal of 0 if not pressed and 1 if pressed. + * The potentiometer is connected with the central pin to the analog input A0 with one of the side pins on the positive and the other on the negative. + + + +![Connecting the hardware][9] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +#### 2.4 Test communications + +Send the code in section 2.2 to the Arduino. Open the serial monitor and check the communication protocol by sending the commands below: + + +``` +#2,1*<2,1*>2* +#3,1*+3,10* +#4,0*>4* +#14,0*-14* +``` + +This should be the result in the serial monitor: + +![Testing communications in Arduino][10] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +One LED on the device should be on at maximum intensity and the other at a lower intensity. + +![LEDs lit on board][11] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +Pressing the button and changing the position of the potentiometer when sending reading commands will display different values. For example, turn the potentiometer to the positive side and press the button. With the button still pressed, send the commands: + + +``` +>4* +-14* +``` + +Two lines should appear: + +![Testing communications in Arduino][12] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +### 3\. Set up the Raspberry Pi + +Use a Raspberry Pi to access the serial port via the terminal using the `cat` command to read the entries and the `echo` command to send the message. + +#### 3.1 Do a serial test + +Connect the Arduino to one of the USB ports on the Raspberry Pi, open the terminal, and execute this command: + + +``` +`cat /dev/ttyUSB0 9600` +``` + +This will initiate the connection with the Arduino and display what is returned to the serial. + +![Testing serial on Arduino][13] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +To test sending commands, open a new terminal window (keeping the previous one open), and send this command: + + +``` +`echo "command" > /dev/ttyUSB0 9600` +``` + +You can send the same commands used in section 2.4. + +You should see feedback in the first terminal along with the same result you got in section 2.4: + +![Testing serial on Arduino][14] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +### 4\. Create the graphical user interface + +The UI for this project will be simple, as the objective is just to show the ports expansion using the serial. Another article will use TotalCross to create a high-quality GUI for this project and start the application backend (working with sensors), as shown in the dashboard image at the top of this article. + +This first part uses two UI components: a Listbox and an Edit. These build a connection between the Raspberry Pi and the Arduino and test that everything is working as expected. + +Simulate the terminal where you put the commands and watch for answers: + + * Edit is used to send messages. Place it at the bottom with a FILL width that extends the component to the entire width of the screen. + * Listbox is used to show results, e.g., in the terminal. Add it at the TOP position, starting at the LEFT side, with a width equal to Edit and a FIT height to vertically occupy all space not filled by Edit. + + + + +``` +package com.totalcross.sample.serial; + +import totalcross.sys.Settings; +import totalcross.ui.Edit; +import totalcross.ui.ListBox; +import totalcross.ui.MainWindow; +import totalcross.ui.gfx.Color; + +public class SerialSample extends MainWindow { +   ListBox Output; +   Edit Input; +   public SerialSample() { +       setUIStyle(Settings.MATERIAL_UI); +   } + +   @Override +   public void initUI() { +       Input = new Edit(); +       add(Input, LEFT, BOTTOM, FILL, PREFERRED); +       Output = new ListBox(); +       Output.setBackForeColors([Color][15].BLACK, [Color][15].WHITE); +       add(Output, LEFT, TOP, FILL, FIT); +   } +} +``` + +It should look like this: + +![UI][16] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +### 5\. Set up serial communication + +As stated above, there are two ways to set up serial communication: Runtime.exec and PortConnector. + +#### 5.1 Option 1: Use Runtime.exec + +The `java.lang.Runtime` class allows the application to create a connection interface with the environment where it is running. It allows the program to use the Raspberry Pi's native serial communication. + +Use the same commands you used in section 3.1, but now use the Edit component on the UI to send the commands to the device. + +##### Read the serial + +The application must constantly read the serial, and if a value is returned, add it to the Listbox using threads. Threads are a great way to work with processes in the background without blocking user interaction. + +The following code creates a new process on this thread that executes the `cat` command, tests the serial, and starts an infinite loop to check if something new is received. If something is received, the value is added to the next line of the Listbox component. This process will continue to run as long as the application is running: + + +``` +new [Thread][17] () { +   @Override +   public void run() { +       try { +           [Process][18] Runexec2 = [Runtime][19].getRuntime().exec("cat /dev/ttyUSB0 9600\n"); +           LineReader lineReader = new LineReader(Stream.asStream(Runexec2.getInputStream())); +           [String][20] input; +          +           while (true) { +               if ((input = lineReader.readLine()) != null) { +                   Output.add(input); +                   Output.selectLast(); +                   Output.repaintNow(); +               } +           } +         } catch ([IOException][21] ioe) { +            ioe.printStackTrace(); +         } +       } +   }.start(); +} +``` + +##### Send commands + +Sending commands is a simpler process. It happens whenever you press **Enter** on the Edit component. + +To forward the commands to the device, as shown in section 3.1, you must instantiate a new terminal. For that, the Runtime class must execute a `sh` command on Linux: + + +``` +try{ +   Runexec = [Runtime][19].getRuntime().exec("sh").getOutputStream()        }catch ([IOException][21] ioe) { +   ioe.printStackTrace(); +} +``` + +After the user writes the command in Edit and presses **Enter**, the application triggers an event that executes the `echo` command with the value indicated in Edit: + + +``` +Input.addKeyListener(new [KeyListener][22]() { + +   @Override +   public void specialkeyPressed([KeyEvent][23] e) { +       if (e.key == SpecialKeys.ENTER) { +           [String][20] s = Input.getText(); +           Input.clear(); +           try { +               Runexec.write(("echo \"" + s + "\" > /dev/ttyUSB0 9600\n").getBytes()); +           } catch ([IOException][21] ioe) { +           ioe.printStackTrace(); +           } +       } +   } + +   @Override +   public void keyPressed([KeyEvent][23] e) {} //auto-generate code +   @Override +   public void actionkeyPressed([KeyEvent][23] e) {} //auto-generate code +}); +``` + +Run the application on the Raspberry Pi with the Arduino connected and send the commands for testing. The result should be: + +![Testing application running on Raspberry Pi][24] + +(Bruno Muniz, [CC BY-SA 4.0][4]) + +##### Runtime.exec source code + +Following is the source code with all parts explained. It includes the thread that will read the serial on line 31 and the `KeyListener` that will send the commands on line 55: + + +``` +package com.totalcross.sample.serial; +import totalcross.ui.MainWindow; +import totalcross.ui.event.KeyEvent; +import totalcross.ui.event.KeyListener; +import totalcross.ui.gfx.Color; +import totalcross.ui.Edit; +import totalcross.ui.ListBox; +import java.io.IOException; +import java.io.OutputStream; +import totalcross.io.LineReader; +import totalcross.io.Stream; +import totalcross.sys.Settings; +import totalcross.sys.SpecialKeys; + +public class SerialSample extends MainWindow { +   [OutputStream][25] Runexec; +   ListBox Output; + +   public SerialSample() { +       setUIStyle(Settings.MATERIAL_UI); +   } + +   @Override +   public void initUI() { +       Edit Input = new Edit(); +       add(Input, LEFT, BOTTOM, FILL, PREFERRED); +       Output = new ListBox(); +       Output.setBackForeColors([Color][15].BLACK, [Color][15].WHITE); +       add(Output, LEFT, TOP, FILL, FIT); +       new [Thread][17]() { +           @Override +           public void run() { +               try { +                   [Process][18] Runexec2 = [Runtime][19].getRuntime().exec("cat /dev/ttyUSB0 9600\n"); +                   LineReader lineReader = new +                   LineReader(Stream.asStream(Runexec2.getInputStream())); +                   [String][20] input; + +                   while (true) { +                       if ((input = lineReader.readLine()) != null) { +                           Output.add(input); +                           Output.selectLast(); +                           Output.repaintNow(); +                       } +                   } + +               } catch ([IOException][21] ioe) { +                   ioe.printStackTrace(); +               } +           } +       }.start(); + +       try { +           Runexec = [Runtime][19].getRuntime().exec("sh").getOutputStream(); +       } catch ([IOException][21] ioe) { +           ioe.printStackTrace(); +       } + +       Input.addKeyListener(new [KeyListener][22]() { +           @Override +           public void specialkeyPressed([KeyEvent][23] e) { +               if (e.key == SpecialKeys.ENTER) { +                   [String][20] s = Input.getText(); +                   Input.clear(); +                   try { +                       Runexec.write(("echo \"" + s + "\" > /dev/ttyUSB0 9600\n").getBytes()); +                   } catch ([IOException][21] ioe) { +                       ioe.printStackTrace(); +                   } +               } +           } + +           @Override +           public void keyPressed([KeyEvent][23] e) { +           } +           @Override +           public void actionkeyPressed([KeyEvent][23] e) { +           } +      }); +   } +} +``` + +#### 5.2 Option 2: Use PortConnector + +PortConnector is specifically for working with serial communication. If you want to follow the original example, you can skip this section, as the intention here is to show another, easier way to work with serial. + +Change the original source code to work with PortConnector: + + +``` +package com.totalcross.sample.serial; +import totalcross.io.LineReader; +import totalcross.io.device.PortConnector; +import totalcross.sys.Settings; +import totalcross.sys.SpecialKeys; +import totalcross.ui.Edit; +import totalcross.ui.ListBox; +import totalcross.ui.MainWindow; +import totalcross.ui.event.KeyEvent; +import totalcross.ui.event.KeyListener; +import totalcross.ui.gfx.Color; + +public class SerialSample extends MainWindow { +   PortConnector pc; +   ListBox Output; + +   public SerialSample() { +       setUIStyle(Settings.MATERIAL_UI); +   } + +   @Override +   public void initUI() { +       Edit Input = new Edit(); +       add(Input, LEFT, BOTTOM, FILL, PREFERRED); +       Output = new ListBox(); +       Output.setBackForeColors([Color][15].BLACK, [Color][15].WHITE); +       add(Output, LEFT, TOP, FILL, FIT); +       new [Thread][17]() { +           @Override +           public void run() { +               try { +                   pc = new PortConnector(PortConnector.USB, 9600); +                   LineReader lineReader = new LineReader(pc); +                   [String][20] input; +                   while (true) { +                       if ((input = lineReader.readLine()) != null) { +                           Output.add(input); +                           Output.selectLast(); +                           Output.repaintNow(); +                       } +                   } +               } catch (totalcross.io.[IOException][21] ioe) { +                   ioe.printStackTrace(); +               } +           } +       }.start(); +       Input.addKeyListener(new [KeyListener][22]() { +           @Override +           public void specialkeyPressed([KeyEvent][23] e) { +               if (e.key == SpecialKeys.ENTER) { +                   [String][20] s = Input.getText(); +                   Input.clear(); +                   try { +                       pc.writeBytes(s); +                   } catch (totalcross.io.[IOException][21] ioe) { +                       ioe.printStackTrace(); +                   } +               } +           } + +           @Override +           public void keyPressed([KeyEvent][23] e) { +           } + +           @Override +           public void actionkeyPressed([KeyEvent][23] e) { +           } +      }); +  } +} +``` + +You can find all the code in the [project's repository][26]. + +### 6\. Next steps + +This article shows how to use Raspberry Pi serial ports with Java by using either the Runtime or PortConnector classes. You can also call external files in other languages and create countless other projects—like a water quality monitoring system for an aquarium with temperature measurement via the analog inputs, or a chicken brooder with temperature and humidity regulation and a servo motor to rotate the eggs. + +A future article will use the PortConnector implementation (because it is focused on serial connection) to finish the communications with all sensors. It will also add a digital input and complete the UI. + +Here are some references for more reading: + + * [Get started with TotalCross][27] + * [TotalCross PortConnector class][8] + * [Running C++ applications with TotalCross][7] + * [VSCode TotalCross Project Extension plugin][28] + + + +After you connect your Arduino and Raspberry Pi, please leave comments below with your results. We'd love to read them! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/arduino-raspberry-pi + +作者:[Patrick Martins de Lima][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/pattrickx +[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://github.com/pattrickx +[3]: https://opensource.com/sites/default/files/uploads/gui-dashboard.png (UI dashboard) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/sites/default/files/uploads/raspberrypi_arduino.png (Raspberry Pi and Arduino logos) +[6]: https://totalcross.com/ +[7]: https://learn.totalcross.com/documentation/guides/running-c++-applications-with-totalcross +[8]: https://rs.totalcross.com/doc/totalcross/io/device/PortConnector.html +[9]: https://opensource.com/sites/default/files/uploads/connecting-electronics.png (Connecting the hardware) +[10]: https://opensource.com/sites/default/files/uploads/communication-test-result.png (Testing communications in Arduino) +[11]: https://opensource.com/sites/default/files/uploads/leds.jpg (LEDs lit on board) +[12]: https://opensource.com/sites/default/files/uploads/communication-test-result2.png (Testing communications in Arduino) +[13]: https://opensource.com/sites/default/files/uploads/serial-test.png (Testing serial on Arduino) +[14]: https://opensource.com/sites/default/files/uploads/serial-test2.png (Testing serial on Arduino) +[15]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+color +[16]: https://opensource.com/sites/default/files/uploads/ui_0.png (UI) +[17]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+thread +[18]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+process +[19]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+runtime +[20]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[21]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+ioexception +[22]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+keylistener +[23]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+keyevent +[24]: https://opensource.com/sites/default/files/uploads/test-commands.png (Testing application running on Raspberry Pi) +[25]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+outputstream +[26]: https://github.com/pattrickx/TotalCrossSerialCommunication +[27]: https://learn.totalcross.com/documentation/get-started/ +[28]: https://marketplace.visualstudio.com/items?itemName=Italo.totalcross diff --git a/sources/tech/20200709 Making compliance scalable in a container world.md b/sources/tech/20200709 Making compliance scalable in a container world.md new file mode 100644 index 0000000000..a32bf4e86e --- /dev/null +++ b/sources/tech/20200709 Making compliance scalable in a container world.md @@ -0,0 +1,168 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Making compliance scalable in a container world) +[#]: via: (https://opensource.com/article/20/7/compliance-containers) +[#]: author: (Scott K Peterson https://opensource.com/users/skpeterson) + +Making compliance scalable in a container world +====== +When software is distributed via container images, source code should be +made available in order to ensure seamless compliance with licensing. +![Shipping containers stacked in a yard][1] + +Software is increasingly being distributed as container images. Container images include the many software components needed to support the featured software in the container. Thus, distribution of a container image involves distribution of many software components, which typically include GPL-licensed components. We can't expect every company that distributes container images to become an open source compliance expert, so we need to build compliance into container technology. + +We should design source code availability into container tools and processes to facilitate open source license compliance that is efficient and portable: + + * Efficient—Address compliance once when a container image is created. Avoid depending on later actions, especially actions external to existing container distribution tooling. + * Portable—When an image is moved to another registry, it should be straightforward to move compliance along with it. + + + +This can be done with a registry-native approach to source code availability. This doesn't require updating all container registries to include source-code-specific features. It is possible to exploit features that registries already have. For software distributed through container registries, we can use those same registries to facilitate compliance. + +### Container technology + +Container technology helps manage the challenges of deploying and operating complex software systems. + +The word "container" refers to a runtime experience—a program, together with its dependencies, can execute in an environment that provides certain isolation from other executing programs; this is running in a container. + +The set of files that are used to provision such a container is called a "container image." While the purpose of a particular container image might be to run one application program, the container image includes much more: that application and its dependencies—the files necessary to run that application, except for the operating system kernel. A container image is a form of those files that can be stored and transferred, enabling the application to be reliably deployed again and again, and run independently of the many other programs that may be running and changing in other containers in the system. + +Distribution of software in the form of container images, which are distributed from services known as "container registries," is growing. Once one invests in organizing computing around containers, it becomes valuable to package and distribute software in container images. Those who use containers to run their software find it is useful to be able to obtain software as pre-built container images, rather than doing all of the container assembly themselves. Even when container images are customized, it is often valuable to start from a pre-built image. + +### Container images are different + +In the past, it has been common to obtain each software component separately. In contrast, a container image includes a heterogeneous collection of software–often hundreds of software components. The unit of software delivery is changing from one driven by how the software is **built** to one driven by how the software is **used**. (See [What's in a container image: Meeting the legal challenges][2].) + +Package maintainers and package management tools have played an underappreciated role in source availability for over two decades. The focused nature of a package, the role of a package maintainer, and the tooling that has been built to support package management systems results in the expectation that someone (the package maintainer) will take responsibility for seeing that the sources are available. Tools that build binaries also collect the corresponding sources into an archive that can be delivered alongside the binaries. The result is that most people don't need to think about source code availability. The sources are available in the same unit as the delivery of the executable software and via the same distribution mechanism; for software delivered as an RPM, the corresponding source is available in a source RPM. + +In contrast, there is no convention for providing the source code that corresponds to a container image. + +The many software components in a container image often include GPL-licensed software. Companies that may not have much experience with distribution of FOSS software may begin distributing GPL-licensed software when they start offering their software in the form of container images. Let's make it straightforward for everyone, including companies who may be new to FOSS, to provide source code in a consistent way. + +### Identification of the corresponding source code + +Identifying the corresponding source code is more challenging for container images than it is for packages. For packages, the source is available to the person building the package (although there can be some challenges with the source for dependencies if a package is built to include dependencies, not merely refer to them). In contrast, container images are conventionally built using, mostly, previously compiled components. When the container image is built, the source for those software components may be readily at hand or not, depending on how the binaries were acquired and how they were built. + +When we build a container image, we should collect the corresponding source code for each of the components used to build the image. If not when the image is built, then when? That collected source code should then become a logical part of the corresponding container image. + +Making the corresponding source code available as a logical part of a container image, of course, facilitates compliance in the distribution of that image. But, also, that practice supports a compliant ecosystem. If someone builds on a base image, how do they know what source code might need to be made available? If container images have corresponding source images, then the solution is straightforward. It is not necessary to start by figuring out what is in the base. Rather, start source availability for the overall image by using the source image for the base. + +Here is an opportunity to build compliance into the tools—when someone builds on a base image, the tools should make it easy for them to make the corresponding source available for the base, as well as what is built on top. Tools should create a source image corresponding to the final combined image by starting with the source image for the base and adding whatever source is appropriate for the software that is built on top of that base. + +### Delivery + +Suppose one has a list of the source code artifacts that correspond to a container image. Where is that list going to be hosted? Where are the source artifacts going to be hosted? If the container image is hosted on various registries, how is source code going to be made available for each of those distribution points? Is there work to be done in each registry or in each of the catalogs associated with the registries? How is someone pulling a container image from each of a number of different registries going to know where these materials are? How does this work at scale? How many mechanisms are needed? + +We should build a container ecosystem with compliance that is portable across registries. One shouldn't need to get a new guidebook from each registry. + +As mentioned above, the supporting software components in a container image often include software licensed under the GPL. Consider the various alternatives for meeting the source code availability requirement for commercial distribution of software via download: binaries accompanied by the source code; binaries accompanied by a written offer; or, equivalent access to copy. As to equivalent access option, let's look at [GPLv2, section 3][3], last paragraph: "If distribution of executable or object code is made by offering access to copy from a designated place, then **offering equivalent access to copy the source code from the same place** counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code." + +Why deliver the source code through a container registry? Equivalent access, efficiency, and portability. + + * **Equivalent access**—A registry-native approach to source availability (making source for container images available as container images) is a good way of providing equivalent access to the source. + * **Efficient compliance**—Creating a source availability "package" (a source image) when the executable image is built and then using the same tooling for making the source available avoids inefficiencies of maintaining additional processes and mechanisms for making the source available. + * **Portability of compliance**—The same tooling that moves the executable images can be used to move, store, and serve the source images—on all hosting registries. + + + +### A registry-native approach to source code availability + +Delivering source through container registries exploits the design of the container image format and certain related characteristics of container registries. + +A container image includes (see container image details in the two examples linked below): + + * an image manifest, which identifies the other elements of the image; + * config data, which includes metadata about the image, including information used to configure the image for execution in a container; + * a number of "layers" (each of which is a tar archive) that store the file system with which to provision a container. + + + +Consider the challenge of making the corresponding source code available—a collection of source code artifacts (RPMs, zip files, tarballs, etc.) that we would like a server to make available. A container image is a list of components that a registry makes available. If the list of source artifacts is arranged as an image manifest, then a container registry can serve the source code artifacts like it serves other container image parts. And, tools for moving container images can be directly applied to move that compliance package (manifest plus the referenced source artifacts). + +A source image (aka a source container) is simply a container image. Instead of the layers in the image being tarballs of files to provision a container for execution, each layer is a source artifact. + +This concept of delivering non-file-system content from a container registry is of interest to container registries for other purposes, too, not just for source code. An example of non-layer content being served by container registries is Helm charts (used to describe a set of Kubernetes resources). The delivery of non-layer content via a container registry is the subject of the [Open Container Initiative's artifacts project][4]. + +### Deduplication + +Container registries store and deliver an image as parts, rather than as a single digital object. This is valuable because container images are extremely redundant. Many images differ in a small fraction of their content. A container image can simplify data center operations by packaging together all of the components needed to run a particular program; as a result, container images are large, and each contains much content that is identical to other images in the registry. There can be 100-300 software components in an image, most of which are present in many other container images. Also, images are immutable. When an image needs to be updated, a new image is created that is almost identical to the prior version. This size challenge is mitigated by breaking archives for container file systems into multiple layers and using content-addressable storage. + +That deduplication capability is advantageous in source code, too. The key to taking advantage of this registry feature is to not store all of the corresponding sources for an image in a single blob. More than 100:1 deduplication can be readily achieved if the source code is stored with the granularity of a separate source artifact for each of the hundred or more software components from which the image is built. + +### Implementation + +Red Hat has started the first of a two-stage approach to implementing registry-native delivery of source code. + +In the first stage, Red Hat has started by producing source images that can be hosted on existing registries and will not confuse tools that expect all images to be executable. In this approach, source artifacts masquerade as regular layers—each source artifact is wrapped in a tar archive; the media types for the layers are the same as for a regular executable image. The source image is associated with the corresponding executable image by a naming convention. + +The second stage involves taking advantage of certain OCI image format features. + +Container images should be linked to the corresponding executable image(s) via the image index, rather than with a tag naming convention. The container image format makes it possible for a source image to literally be a part of the overall image of which the executable image is a part. Unrelated to source code, it is useful to be able to have images that are built for different processor architectures be part of a single overall image. That overall image can be managed as a single object, and a consumer of the image can select which version(s) and/or part(s) of the image to download (e.g., amd64, or arm64, or source). Thus, rather than associating the source with the corresponding executable image via a labeling convention, the source image manifest should be listed in the image index. + +In addition, in the future, source artifacts should not masquerade as executable layer tar files; the extra wrapping of source artifacts in a tar archive should be eliminated, and the source artifacts should be identified with appropriate media types. Successful deduplication requires careful, consistent tar archives. Simply storing the source artifact directly (and marking it with an appropriate media type) reduces this potential deduplication loss from inconsistent tarball wrappers. + +Finally, source artifacts in a registry should be consistent with the approach for other non-layer content in registries (such as Helm charts). Providing a consistent way to serve such content is the subject of the "artifacts" project within the Open Container Initiative. Registry-native distribution of source can be a beneficiary of that project. + +#### In summary + +The current approach (see the [current approach example][5]): + + * Source artifacts masquerade as regular layers—wrap each source artifact in a tarball and mark it with a regular layer media type. + * Identify the name of a source artifact inside the tar wrapper. + * Associate the source and executable images using a tag name convention—tag the source image manifest with the tag for the corresponding executable image extended with "-source." + + + +The future approach (see the [future approach example][6]): + + * No masquerade—store source artifacts directly in the registry (named, as other registry content, by a hash digest) and give them non-layer media type(s). + * Identify the name of a source artifact with a layer annotation in the manifest. + * Associate the source and executable images using the image index—list the source manifest in the image index, along with manifests for each machine architecture. + * Use a distinctive config. media type in source manifests (as proposed in the OCI artifacts project). + + + +#### Where are we now? + +Source "containers," which are actually images, for UBI images are in the Red Hat registry now. These source images have been built using production tools. The next step is to roll this out to other images. + +#### Where are we going? + +We need an industry-wide, consistent approach to making source code available for container images. Let's work together in the OCI's artifacts project and agree on the details of the no-masquerade approach. + +### Opportunities + +Including source code leads to opportunities. Making the full corresponding source code available as a corresponding source image can address more than merely GPL source availability: + + * The exact license for open source software can be complicated (see [Is open source software licensing broken?][7]). But, with the full source code, one can determine whatever details are important to them (see [The source code is the license][8]). + * How about license notices? You could attempt to extract all of them. Or, you could make the notices available directly via the source code (see [An economically efficient model for open source software license compliance][9]). + + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/compliance-containers + +作者:[Scott K Peterson][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/skpeterson +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bus-containers2.png?itok=idd8duC_ (Shipping containers stacked in a yard) +[2]: https://opensource.com/article/18/7/whats-container-image-meeting-legal-challenges +[3]: https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html#section3 +[4]: https://github.com/opencontainers/artifacts +[5]: https://blockchain-forensics.com/containers/current.svg +[6]: https://blockchain-forensics.com/containers/future.svg +[7]: https://opensource.com/article/20/2/open-source-licensing +[8]: https://opensource.com/article/17/12/source-code-license +[9]: https://opensource.com/article/17/9/economically-efficient-model diff --git a/sources/tech/20200712 Recovering audio from a lost format with open source.md b/sources/tech/20200712 Recovering audio from a lost format with open source.md new file mode 100644 index 0000000000..863a296817 --- /dev/null +++ b/sources/tech/20200712 Recovering audio from a lost format with open source.md @@ -0,0 +1,133 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Recovering audio from a lost format with open source) +[#]: via: (https://opensource.com/article/20/7/hdcd) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) + +Recovering audio from a lost format with open source +====== +The history of HDCD format and how I recovered lost audio on Linux. +![11 CDs in a U shape][1] + +Back in the early 2000s, we made a family decision to upgrade the living room stereo. The equipment in place at the time was based on a collection of gear that I had purchased some 20 years earlier when I first had a steady post-university income. That early collection could best be described as "industrial chic," most notably the [Hafler amplifiers][2] I had built from kits and the [Polk speakers][3] made from some kind of composite wood product and finished with an ugly faux-rosewood vinyl wrap. They produced decent sound, but the dorm-room-style decor just wasn't working out in the living room. + +Those of you who remember the early 2000s will recall that most of the world was still consuming music on CD. Our family was no exception, and we ended up with a fine CD player that had an interesting feature—it was able to decode regular CDs as well as high-definition-compatible digital (HDCD) discs. + +According to [Wikipedia][4], HDCD is a proprietary audio encode-decode process that claims to provide increased dynamic range over that of standard Red Book audio CDs, while retaining backward compatibility with existing compact disc players. + +The [manual for our CD player][5] states: "HDCD system is manufactured under license from Pacific Microsonics, Inc." and "HDCD is a digital signal processing system developed by Pacific Microsonics of California which conceals control codes into a very small fraction of the recorded CD digital audio stream. An HDCD decoder recognizes these control codes and uses them to process the digital audio to increase its dynamic range and resolution, while leaving the original digital stream compatible with conventional CD players." + +How does HDCD work this magic, you may ask? The same Wikipedia entry states, "HDCD encodes the equivalent of 20 bits worth of data in a 16-bit digital audio signal by using custom dithering, audio filters, and some reversible amplitude and gain encoding; Peak Extend, which is a reversible soft limiter; and Low-Level Range Extend, which is a reversible gain on low-level signals." + +Whatever the merits of this technology, its parent company was unable to continue business and ceased operations sometime in 2000. The Wikipedia article indicates that Microsoft acquired the company and incorporated code in Windows Media Player to allow the decoding of HDCD, but seemingly lost interest in its promotion. Perhaps this was due to the emergence of other proprietary high-resolution audio formats such as SACD and DVD-A, which were able to encode a full 24 bits of signal on a similar-looking but incompatible media. Neither of these latter formats was especially successful, at least not in commercial terms, though studios continue to release music on SACD. As it happens, SACD included a "hybrid" standard that provided both SACD and backward-compatible CD layers on the same disc, allowing the playback of those albums on regular CD players at standard CD resolution. + +How many artists and studios actually made use of HDCD? Well, Discogs offers [a list of 11,284 HDCD recordings][6] (as of this writing). [This web site][7] offers an interesting analysis of some of the facilities HDCD provided, using actual HDCD encoded music. And for those interested in the original patent, which Google Patents claims has expired, [it can be found here][8]. + +### My HDCD story + +Anyone who is interested enough in audio equipment to read promotional brochures or audiophile magazines will recognize the fascination many audiophiles have with proprietary designs—they seem to view a patent as validation of the equipment that uses that technology. + +Though now I do what I can to avoid being swayed by "proprietary technology fascination," I admit I was not such a staunch proponent of all things open back in the early 2000s. Not only did I buy the aforementioned fine CD player with its proprietary innards, but I also bought—the horror!—a few actual HDCD-encoded titles. + +This past weekend, I managed to find three of them in our collection, but I am certain there are more. The three I managed to find include Ensemble Dumont's [La Messe du Roi][9], Musica Secreta's [Dangerous Graces][10], and the Orchestra of the Age of Enlightenment's [Vivaldi Concerti][11], all from the Linn Records Linux-friendly [music store][12]. While making sure these titles were still available, I noticed that they are no longer offered in HDCD. + +Given that I have these albums on hand and that the patent seems to have expired, I decided to find out whether I could convert these discs in their full intended resolution to an open music format, and moreover, whether I could do so without using proprietary software. + +The first software I stumbled upon for decoding HDCD format was hdcd.exe., [described and offered here][13]. Since the source code for this software was not offered, and since it required Windows, or at least Wine, to run, my initial interest mostly evaporated. + +The Wikipedia article noted above mentioned that some other Windows-based music players offered HDCD decoding. Hmm. But then I spotted: + +"FFmpeg's libavfilter includes an HDCD filter as of FFmpeg 3.1 (June 2016) that will convert 16-bit PCM with HDCD data to 20-bit PCM." + +This seemed like a promising starting point, so I installed `ffmpeg` from my distro's repositories, and then went looking for some more hints, at which point I stumbled on [the very concise description on hydrogenaudio][14], which even supplies a script for finding HDCD-encoded files in one's music directory. I used the line that runs `ffmpeg` against one of the files ripped from the Musica Secreta CD mentioned previously, as follows: + + +``` +ffmpeg  -hide_banner -nostats -y -v verbose -i \ +'01 - Musica Secreta - Questi odorati fiori.flac' +-vn -af hdcd -f s24le /dev/null 2>&1 | grep "_hdcd_" +``` + +and received the following output: + + +``` +[Parsed_hdcd_0 @ 0x55b2137e2c80] Disabling automatic format conversion. +[Parsed_hdcd_0 @ 0x55b2137e2c80] Auto-convert: disabled +[Parsed_hdcd_0 @ 0x55b2137e2c80] Looking for 16-bit HDCD in sample format s16 +[Parsed_hdcd_0 @ 0x55b2137e2c80] CDT period: 2000ms (88200 samples @44100Hz) +[Parsed_hdcd_0 @ 0x55b2137e2c80] Process mode: process stereo channels together +[Parsed_hdcd_0 @ 0x55b2137e2c80] Force PE: off +[Parsed_hdcd_0 @ 0x55b2137e2c80] Analyze mode: [0] disabled +[Parsed_hdcd_0 @ 0x55b2137e2c80] Channel 0: counter A: 0, B: 1657, C: 1657 +[Parsed_hdcd_0 @ 0x55b2137e2c80] Channel 0: pe: 1657, tf: 0, almost_A: 0, checkfail_B: 0, unmatched_C: 0, cdt_expired: 0 +[Parsed_hdcd_0 @ 0x55b2137e2c80] Channel 0: tg 0.0: 1657 +[Parsed_hdcd_0 @ 0x55b2137e2c80] Channel 1: counter A: 0, B: 1657, C: 1657 +[Parsed_hdcd_0 @ 0x55b2137e2c80] Channel 1: pe: 1657, tf: 0, almost_A: 0, checkfail_B: 0, unmatched_C: 0, cdt_expired: 0 +[Parsed_hdcd_0 @ 0x55b2137e2c80] Channel 1: tg 0.0: 1657 +[Parsed_hdcd_0 @ 0x55b2137e2c80] Packets: type: B, total: 3314 +[Parsed_hdcd_0 @ 0x55b2137e2c80] HDCD detected: yes, peak_extend: enabled permanently, max_gain_adj: 0.0 dB, transient_filter: not detected, detectable errors: 0 +``` + +Note the last line above mentioning that HDCD was, in fact, detected. Also, it seems that the "peak extend" capability is enabled. As I understand this capability, it reverses the compression/limiting applied to the loudest parts of the music after dropping the overall signal level by a factor of two, thus restoring some of the original recording's extra dynamic range. Goodwin's High End's web site has a detailed description of this topic [here][15]. + +At this point, it was time to try this whole thing out. For some reason, I did not feel confident doing a one-step conversion from 16-bit undecoded FLAC to 24-bit decoded FLAC, so I ran the conversion in two steps, as follows: + + +``` +for f16 in *.flac; do +trk=`basename "$f16" .flac` +w24="$trk"_24.wav +ffmpeg -i "$f16" -af hdcd -acodec pcm_s24le "$w24" +flac "$w24" +done +``` + +This gave me a set of 24-bit 44.1kHz FLAC files, which I verified with the **file** command. At that point, all I needed to do was make sure all the tags looked good, and that was that. + +### And speaking of music… + +I've been taking a break from this music column this year, as I haven't done much except listen to things I already have on hand. But a few new items have crept into my collection. + +Emancipator's latest, [Mountain of Memory][16], is available from that great Linux-friendly and artist-friendly online store, [Bandcamp][17]. If you like Emancipator's earlier stuff, you won't be disappointed with this. + +The Choir of Clare College at Cambridge and the Dmitri Ensemble have released [a fine collection of music by Arvo Pärt, Peteris Vasks, and James MacMillan][18], entitled "Arvo Pärt Stabat." I haven't listened to this album carefully, but even so, I am struck by the similarity between the three composers' work presented here. Maybe something about the shared influence of a northern European landscape and weather? I bought this beautiful choral music as a 96/24 FLAC download from [Presto Classical][19], another fine Linux-friendly online store. For those interested in more information on this music, there is an interview on that site with Graham Ross, the conductor of the Choir of Clare College. + +Finally, some other interesting news—an online store with lots of great high-resolution downloads that has frustrated me for many years (to the point of sending them numerous whiny emails), [HDtracks][20], has finally made it possible to purchase music from them without using their download manager! I haven't actually bought anything there yet, but I will soon give it a whirl and report back. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/hdcd + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/clhermansen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life_cd_dvd.png?itok=RBwVIzmi (11 CDs in a U shape) +[2]: https://audiokarma.org/forums/index.php?threads/questions-about-hafler-dh-110-connections.790899/ +[3]: https://forum.polkaudio.com/discussion/166859/monitor-7b-question +[4]: https://en.wikipedia.org/wiki/High_Definition_Compatible_Digital +[5]: https://docs.linn.co.uk/wiki/images/0/08/Ikemi_genki_user_manual.pdf +[6]: https://www.discogs.com/search/?format_exact=HDCD +[7]: http://www.audiomisc.co.uk/HFN/HDCD/Examined.html +[8]: https://patents.google.com/patent/US5479168?oq=US5479168 +[9]: https://www.linnrecords.com/recording-la-messe-du-roi +[10]: https://www.linnrecords.com/recording-dangerous-graces-music-cipriano-de-rore-and-pupils +[11]: https://www.linnrecords.com/recording-vivaldi-concerti +[12]: https://www.linnrecords.com/ +[13]: http://forum.doom9.org/showthread.php?t=129136 +[14]: https://wiki.hydrogenaud.io/index.php?title=High_Definition_Compatible_Digital#FFmpeg +[15]: http://www.goodwinshighend.com/music/hdcd/gain_scaling.htm +[16]: https://emancipator.bandcamp.com/album/mountain-of-memory +[17]: https://bandcamp.com/ +[18]: https://www.clarecollegechoir.com/product/arvo-p%C3%A4rt-stabat +[19]: https://www.prestomusic.com/classical/products/8766094--arvo-part-stabat-mater +[20]: https://www.hdtracks.com/ diff --git a/sources/tech/20200714 5 things to look for in an open source alternative to SharePoint.md b/sources/tech/20200714 5 things to look for in an open source alternative to SharePoint.md new file mode 100644 index 0000000000..f60f1fae0e --- /dev/null +++ b/sources/tech/20200714 5 things to look for in an open source alternative to SharePoint.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (5 things to look for in an open source alternative to SharePoint) +[#]: via: (https://opensource.com/article/20/7/sharepoint-alternative) +[#]: author: (Will Kelly https://opensource.com/users/willkelly) + +5 things to look for in an open source alternative to SharePoint +====== +If you're considering an open source collaboration platform to meet your +remote workforce's needs, here are five things to keep in mind. +![Digital images of a computer desktop][1] + +We're entering a collaboration platform renaissance as remote work becomes the norm for enterprises large and small. [Microsoft SharePoint][2]—a collaboration platform available on premises or in the cloud—is the de-facto standard for corporations and government agencies. However, SharePoint implementations are infamous for the [challenges][3] that prevent their completion. Combine those common speedbumps with shrinking IT budgets and rising collaboration requirements because of remote work, and open source alternatives to SharePoint become well worth a look. + +Here are five things to consider in an open source alternative to SharePoint. + +### Is it easy to install, set up, and use in the cloud? + +Looking beyond installation and initial configuration, you want an open source alternative that's easy to set up. Treat open source collaboration tools as something you must take responsibility for, particularly in setup and user support, whether you have your IT department's approval or you're going shadow IT. + +Chances are you'll be installing the platform in a public or private cloud space, so look for an open source collaboration platform that's cloud-friendly. For example, if your organization is running Amazon Web Services (AWS), you can install open source wikis, including [MediaWiki][4], [DokuWiki][5], and [TikiWiki][6], from the AWS Marketplace. After installing them, you can get an idea of how much using the platform will affect your organization's cloud bill. + +### Is it friendly to end-users? + +Show me a complex collaboration site, and I'll show you the developers and other staff who are doing their darndest to work around it. You don't want to make this mistake. + +Keep it simple if you want to spin up an open source collaboration platform to replace or augment SharePoint for your remote workers. The easier the collaboration platform is for your users, the better chance you have of winning them over as allies. + +With features like a Configure Sites wizard, TikiWiki is an example of an open source collaboration platform that's end-user friendly. + +### Are the content-editing tools easy to use? + +Editing options are a major benefit to the diverse communities of open source contributors building these technologies. MediaWiki is one example of how open source collaboration platforms approach authoring tools. The project has an [Editing team][7] that focuses just on editing and authoring tools. Some of its projects include [WikiEditor][8], [VisualEditor][9], and [CodeEditor][10] extensions. You're bound to find an editor that fits your users' workstyle. + +This feature becomes especially important for developers, who have been known to rebel against SharePoint because it lacks Markdown support. Get feedback from your developers about their authoring needs. If Markdown is one of their requirements, make sure you choose an open source collaboration platform that supports it. + +Also be sure to follow open source adoption best practices by ensuring the technology has an active community. For example, some DokuWiki editor plugins, such as [Ace Editor][11] and [Editor Plugin][12], haven't been updated in years. + +### What kind of access control is available to protect content? + +If you're dealing with project documentation or any type of sensitive corporate information, examine the access control options in any open source collaboration platform you're considering. Look for support for read-only pages and access-control lists (ACLs). + +Open source wikis are open by default. That's not necessarily a bad thing, depending on your security posture. SharePoint permissions are a [known trouble spot][13], even in the eyes of SharePoint experts. In contrast, DokuWiki has a well-documented [ACL feature][14]. + +### Is it integration-friendly for your organization? + +Even if you're moving to an open source collaboration platform as a last-minute replacement for an ailing SharePoint implementation, you can't ignore your integration requirements. + +MediaWiki and TikiWiki use a MySQL backend. DokuWiki doesn't require a database; it uses plain text files. Databases can be an integration consideration, based on your team members' database chops. + +Integration with an authentication backend such as LDAP will also be necessary for some organizations. Security and compliance people get worried about new platforms that aren't aligned with corporate standards. Users often resent having yet another password to remember. + +### Deploy with care + +Open source collaboration alternatives have a unique growth opportunity, as organizations find their once-ignored collaboration tools aren't serving their burgeoning remote workforces. Regardless of your goals, deploy your open source SharePoint alternative with care. + +Have you moved to an open source collaboration platform to better serve your remote workers? If so, please share your experiences in the comments. + +Sandstorm's Jade Wang shares some of her favorite open source web apps that are self-hosted... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/sharepoint-alternative + +作者:[Will Kelly][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/willkelly +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_browser_web_desktop.png?itok=Bw8ykZMA (Digital images of a computer desktop) +[2]: https://www.microsoft.com/en-us/microsoft-365/sharepoint/collaboration +[3]: https://sharepointmaven.com/sharepoint-implementation-failed/ +[4]: https://www.mediawiki.org/wiki/MediaWiki +[5]: https://www.dokuwiki.org/ +[6]: https://tiki.org/HomePage +[7]: https://www.mediawiki.org/wiki/Editing_team +[8]: https://www.mediawiki.org/wiki/Extension:WikiEditor +[9]: https://www.mediawiki.org/wiki/Extension:VisualEditor +[10]: https://www.mediawiki.org/wiki/Extension:CodeEditor +[11]: https://www.dokuwiki.org/plugin:aceeditor +[12]: https://www.dokuwiki.org/plugin:editor +[13]: https://www.varonis.com/blog/why-do-sharepoint-permissions-cause-so-much-trouble/ +[14]: https://www.dokuwiki.org/acl diff --git a/sources/tech/20200717 A brief history of the Content Management System.md b/sources/tech/20200717 A brief history of the Content Management System.md new file mode 100644 index 0000000000..32ba59cdd8 --- /dev/null +++ b/sources/tech/20200717 A brief history of the Content Management System.md @@ -0,0 +1,73 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A brief history of the Content Management System) +[#]: via: (https://opensource.com/article/20/7/history-content-management-system) +[#]: author: (Pierre Burgy https://opensource.com/users/pierreburgy) + +A brief history of the Content Management System +====== +CMS have gone from static page to JAMstack, and its history is at the +heart of open source and the evolution of the web. +![Text editor on a browser, in blue][1] + +Content management system (CMS) is a prolific software category that covers all types of applications for the creation and modification of digital content. So it should come as no huge surprise that the history of the CMS traces back to the first website in history, by [Tim Berners-Lee][2] in 1990, which was modeled on an internet-based hypertext system HTML, which represented just text and links. + +![timeline of CMS market evolution][3] + +The humble beginnings of the world wide web lay in static sites that served content without the need for a back-end database. They consumed very little computing resources, so they loaded quickly—because there were no database queries, no templates to render, and no client-server requests to process. There was also little in the way of web traffic, given that few people were regular "web surfers," especially compared to today. + +And, of course, it was all open source software that facilitated this interoperability. Indeed, open source has always played an important role in the evolution of CMS. + +### Rise of the CMS + +Fast-forward to the mid-nineties, as the popularity of the world wide web grows and websites increase the need for frequent updates—a change from its origins hosting brochure-type static content. This led to the introduction of a plethora of CMS products from FileNet, StoryBuilder from Vignette, Documentum, and many others. These were all proprietary, closed source products, which was not unusual for that time period. + +However, in the early 2000s, open source CMS alternatives emerged, including WordPress, Drupal, and Joomla. WordPress included an extensible plugin architecture and provided templates that could be used to build websites without requiring users to have knowledge of HTML and CSS. The WordPress CMS software installed on a web server and typically paired with a MySQL or MariaDB database (both open source, of course). The big shift to WordPress was, in part, accelerated by the fact that the CMS is open-source. + +Even today, about one-third of websites are built using these first-generation content management systems. These traditional CMS are monolithic systems that include the back-end user interface, plugins, front-end templates, Cascading Style Sheets (CSS), a web server, and a database. With every user request for a website page, a server first queries a database, then combines the result with data from the page's markup and plugins to generate an HTML document in the browser. + +### Trend to LAMPstack + +The emergence of the open source CMS was consistent with infrastructure built on the LAMP (Linux, Apache, MySQL, and PHP/Perl/Python) stack. This new structure represented the start of monolithic web development that enabled the creation of dynamic websites that use database queries to deliver unique content for different end users. At this point, the previous model of static sites sitting on a server—where individual files (HTML, CSS, JavaScript) consisting of text and links are delivered the same way to all end users—really started to disappear. + +### Mobile web changes everything + +As we move deeper and deeper into the first decade of the 2000s, early mobile devices like Palm and Blackberry provide access to web content, then the introduction of smartphones and tablets around 2010 brings more and more users to the web via mobile devices. In 2016, the scales tip and [web access from mobile devices and tablets exceeds desktops][4] worldwide. + +The monolithic CMS wasn't suited to serving content to these different types of access devices, which necessitated different versions of websites—usually stripped-down versions of the website for mobile users. The emergence of new Web-ready device types—like smartwatches, gaming consoles, and voice assistants like [Alexa][5]—only exacerbated this problem, and the need for omnichannel content delivery became clear. + +### The emergence of headless CMS and JAMstack + +A headless CMS decouples the backend—which stores all the content, databases, and files—from the frontend. Typically, a headless CMS uses APIs so that content from databases (SQL and NoSQL) and files can be accessed for display on websites, smartphones, and even Internet of Things (IoT) devices. Additionally, a headless CMS is front-end framework-agnostic, making it compatible with a variety of static site generators and front-end frameworks (e.g., Gatsby.js, Next.js, Nuxt.js, Angular, React, and Vue.js), which gives developers the freedom to choose their favorite tools. + +Headless CMS is particularly suitable for the JAM (Javascript, API, and Markup) stack web development architecture that is emerging as a popular solution as it delivers better web performance and SEO rankings, as well as strong security considerations. JAMstack does not depend on a web server and serves static files immediately when a request is made. There is no need to query the database as the files are already compiled and served to the browser. + +The shift to headless CMS is driven by a new wave of players, either with a SaaS approach such as Contentful, or self-hosted open source alternatives such as [Strapi][6]. Headless is also disrupting the e-commerce industry, with new software editors such as Commerce Layer and [Saleor][7] (also open source) offering solutions to manage multiple SKUs, prices, and inventory data in a true omnichannel fashion. + +### Conclusion + +Throughout the evolution of the content management system, which has been driven by how information on the internet is consumed, open source software has progressed along the same trend lines, with new technologies emerging to solve arising requirements. Indeed, it seems there is an interdependency between CMS, the world wide web, and open source. The need to manage the growing volumes of content isn't going away anytime soon. There is every reason to expect even more widespread adoption of open source software in the coming ahead. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/history-content-management-system + +作者:[Pierre Burgy][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/pierreburgy +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png?itok=lcf-m6N7 (Text editor on a browser, in blue) +[2]: https://www.w3.org/People/Berners-Lee/#:~:text=A%20graduate%20of%20Oxford%20University,refined%20as%20Web%20technology%20spread. +[3]: https://opensource.com/sites/default/files/uploads/timeline.market.png (timeline of CMS market evolution) +[4]: https://techcrunch.com/2016/11/01/mobile-internet-use-passes-desktop-for-the-first-time-study-finds/ +[5]: https://opensource.com/article/20/6/open-source-voice-assistant +[6]: https://strapi.io/ +[7]: https://saleor.io/ diff --git a/sources/tech/20200718 Tricks with Pseudorandom Number Generators.md b/sources/tech/20200718 Tricks with Pseudorandom Number Generators.md new file mode 100644 index 0000000000..0fd6ccc464 --- /dev/null +++ b/sources/tech/20200718 Tricks with Pseudorandom Number Generators.md @@ -0,0 +1,123 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Tricks with Pseudorandom Number Generators) +[#]: via: (https://theartofmachinery.com/2020/07/18/prng_tricks.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) + +Tricks with Pseudorandom Number Generators +====== + +Pseudorandom number generators (PRNGs) are often treated like a compromise: their output isn’t as good as real random number generators, but they’re cheap and easy to use on computer hardware. But a special feature of PRNGs is that they’re _reproducible_ sources of random-looking data: + +``` +import std.random; +import std.stdio; + +void main() +{ + // Seed a PRNG and generate 10 pseudo-random numbers + auto rng = Random(42); + foreach (_; 0..10) write(uniform(0, 10, rng), ' '); + writeln(); + // Reset the PRNG, and the same sequence is generated again + rng = Random(42); + foreach (_; 0..10) write(uniform(0, 10, rng), ' '); + writeln(); + + // Output: + // 2 7 6 4 6 5 0 4 0 3 + // 2 7 6 4 6 5 0 4 0 3 +} +``` + +This simple fact enables a few neat tricks. + +A couple of famous examples come from the gaming industry. The classic example is the space trading game Elite, which was originally written for 8b BBC Micros in the early 80s. It was a totally revolutionary game, but just one thing that amazed fans was its complex universe of thousands of star systems. That was something you just didn’t normally get in games written for machines with kilobytes of RAM total. The trick was to generate the universe with a PRNG seeded with a small value. There was no need to store the universe in memory because the game could regenerate each star system on demand, repeatedly and deterministically. + +PRNGs are now widely exploited for recording games for replays. You don’t need to record every frame of the game world if you can just record the PRNG seed and all the player actions. (Like most things in software, [actually implementing that can be surprisingly challenging][1].) + +### Random mappings + +In machine learning, you often need a mapping from things to highly dimensional random unit vectors (random vectors of length 1). Let’s get more specific and say you’re processing documents for topic/sentiment analysis or similarity. In this case you’ll generate a random vector for each word in the dictionary. Then you can create a vector for each document by adding up the vectors for each word in it (with some kind of weighting scheme, in practice). Similar documents will end up with similar vectors, and you can use linear algebra tricks to uncover deeper patterns (read about [latent semantic analysis][2] if you’re interested). + +An obvious way to get a mapping between words and random vectors is to just initially generate a vector for each word, and create a hash table for looking them up later. Another way is to generate the random vectors on demand using a PRNG seeded by a hash of the word. Here’s a toy example: + +``` +/+ dub.sdl: + name "prngvecdemo" + dependency "mir-random" version="~>2.2.14" ++/ +// Demo of mapping words to random vectors with PRNGs +// Run me with "dub prngvecdemo.d" + +import std.algorithm; +import std.stdio; + +// Using the Mir numerical library https://www.libmir.org/ +import mir.random.engine.xoshiro; +import mir.random.ndvariable; + +enum kNumDims = 512; +alias RNG = Xoroshiro128Plus; +// D's built-in hash happens to be MurmurHash, but we just need it to be suitable for seeding the PRNG +static assert("".hashOf.sizeof == 8); + +void main() +{ + auto makeUnitVector = sphereVar!float(); + auto doc = "a lot of words"; + + float[kNumDims] doc_vec, word_vec; + + doc_vec[] = 0.0; + foreach (word; doc.splitter) // Not bothering with whitening or stop word filtering for this demo + { + // Create a PRNG seeded with the hash of the word + auto rng = RNG(word.hashOf); + // Generate a unit vector for the word using the PRNG + // We'll get the same vector every time we see the same word + makeUnitVector(rng, word_vec); + // Add it to the document vector (no weighting for simplicity) + doc_vec[] += word_vec[]; + } + + writeln(doc_vec); +} +``` + +This kind of trick isn’t the answer to everything, but it has some uses. Obviously, it can be useful if you’re working with more data than you have RAM (though you might still cache some of the generated data). Another use case is processing a large dataset with parallel workers. In the document example, you can get workers to “agree” on what the vector for each word should be, without data synchronisation, and without needing to do an initial pass over the data to build a dictionary of words. I’ve used this trick with experimental code, just because I was too lazy to add an extra stage to the data pipeline. In some applications, recomputing data on the fly can even be faster than fetching it from a very large lookup table. + +### An ode to Xorshift + +You might have noticed I used `Xoroshiro128Plus`, a variant of the Xorshift PRNG. The Mersenne Twister is a de facto standard PRNG in some computing fields, but I’m a bit of a fan of the Xorshift family. The basic Xorshift engines are fast and pretty good, and there are variants that are still fast and have excellent output quality. But the big advantage compared to the Mersenne Twister is the state size. The Mersenne Twister uses a pool of 2496 bytes of state, whereas most of the Xorshift PRNGs can fit into one or two machine `int`s. + +The small state size has a couple of advantages for this kind of “on demand” PRNG usage: One is that thoroughly initialising a big state from a small seed takes work (some people “warm up” a Mersenne Twister by throwing away several of the initial outputs, just to be sure). The second is that the small size of the PRNGs makes them cheap enough to use in places you wouldn’t think of using a Mersenne Twister. + +### Random data structures made reliable + +Some data structures and algorithms use randomisation. An example is a treap, which is a binary search tree that uses a randomised heap for balancing. Treaps are much less popular than AVL trees or red-black trees, but they’re easier to implement correctly because you end up with fewer edge cases. They’re also good enough for most use cases. That makes them a good choice for application-specific “augmented” BSTs. But for argument purposes, it’s just a real example of a data structure that happens to use randomness as an implementation detail. + +Randomisation comes with a major drawback: it’s a pain when testing and debugging. Test failures aren’t reproducible for debugging if real randomness is used. If you have any experience with testing, you’ll have seen this and you’ll know it’s a good idea to use a PRNG instead. + +Using a global PRNG mostly works, but it couples the treaps through one shared PRNG. That accidental coupling can lead to test flakes if you’re running several tests at once, unless you’re careful to use one PRNG per thread and reset it for every test. Even then you can get Heisenbugs in your non-test code. + +What about dependency injection? Making every treap method require a reference to a PRNG works, but it leaks the implementation detail throughout your code. You could make the treap take a reference to a PRNG in its constructor, but that implies adding an extra pointer to the data structure. If you’re going to do that, why not just make every treap embed its own 32b or 64b Xorshift PRNG? Embedding the PRNG into the treap makes it deterministic and reproducible in a way that’s encapsulated and decoupled from everything else. + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2020/07/18/prng_tricks.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://technology.riotgames.com/news/determinism-league-legends-introduction +[2]: https://en.wikipedia.org/wiki/Latent_semantic_analysis diff --git a/sources/tech/20200722 6 ways to contribute to an open source alternative to Slack.md b/sources/tech/20200722 6 ways to contribute to an open source alternative to Slack.md new file mode 100644 index 0000000000..4db4090fb8 --- /dev/null +++ b/sources/tech/20200722 6 ways to contribute to an open source alternative to Slack.md @@ -0,0 +1,190 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (6 ways to contribute to an open source alternative to Slack) +[#]: via: (https://opensource.com/article/20/7/mattermost) +[#]: author: (Jason Blais https://opensource.com/users/jasonblais) + +6 ways to contribute to an open source alternative to Slack +====== +Join thousands who have contributed code, translations, documentation, +and more to Mattermost, an open source messaging platform. +![Chat bubbles][1] + +[Mattermost][2] is a messaging platform built in Go and React for DevOps teams. You can discuss topics in channels, private groups, or one-to-one with rich [Markdown][3] formatting and easily share code snippets with syntax highlighting in more than 50 programming languages. You can self-host or deploy on a private cloud to connect in-house systems with plugins, Slack-compatible integrations, and extensive API support. And you can collaborate with your team using the [Linux desktop application][4]. + +![Mattermost user interface on Linux Desktop App][5] + +(Mattermost, [CC BY-SA 4.0][6]) + +The platform's open source nature offers three direct benefits over proprietary messaging platforms like Slack, Microsoft Teams, and Discord: + + 1. **No vendor lock-in:** With open source software, the code is available to everyone. Users, third-party vendors, and organizations have access to the code at all times, free of cost. Moreover, users get peace of mind with full control over their data, security, and infrastructure. + 2. **Stronger security:** With a large community of developers, security flaws are detected, fixed, and communicated quickly to all users, often before a flaw ships in the product. As highlighted in Red Hat's report on [The State of Enterprise Open Source][7], high-quality software and better security are top benefits of enterprise open source software. + 3. **Community-powered:** A growing community accelerates innovation by collaborating on problems, finding solutions, and creating new use cases, all leading to rapid feature development not possible with proprietary solutions. A thriving community is a force-multiplier for open source projects. + + + +Mattermost is no different, and the community has been a major driving force behind the project. From the 100 most popular features to the 700,000-plus translations contributed to Mattermost, the open source community's impact on the project has been enormous. We've sent swag (such as a customized mug to all first-time contributors) to more than 1,000 contributors, and our [Contributor Wall of Fame][8] keeps growing every month. + +If you are interested in contributing to open source, DevOps, or the Go and React technologies, consider joining the Mattermost community. We have [good first help-wanted issues][9] for new contributors, [contribution guidelines][10] to help get you started, and other resources at [developers.mattermost.com][11]. Moreover, you don't have to be a developer to contribute. You can help with translations, documentation, and more. + +Interested in contributing to Mattermost? To make it easier to learn about all the ways to get involved with our community, we've gathered some information from our [Handbook][12], [Contribute page][13], [Security page][14], and more to help you get started. + +### Platform + +Build new features, improve existing ones, and fix bugs across the Mattermost platform. There are a variety of technologies and frameworks to choose from: + + * **Server:** Written in Go, includes the API, data model, logging, and more + * **Webapp:** Written in React (JavaScript library), includes all components and actions of the Mattermost user interface  + * **Mobile apps:** Written in React Native (JavaScript library), includes all components and actions of the mobile apps on iOS and Android + * **Desktop apps:** Written on top of the Electron framework for Windows, macOS, and Linux clients + * **Redux:** Written in JavaScript and TypeScript, includes storage, web utilities, and logic for webapp and React Native mobile clients + + + +Contribute in four steps: + + 1. Sign up to our Mattermost community site and join the Contributors channel for questions. + 2. Set up your developer environment by following our instructions. If you're working on mobile apps, you'll also need a mobile dev environment. + 3. Choose a [help-wanted ticket][15] and comment to let people know you're working on it. If there's no ticket for what you want to work on, follow the contributions without tickets process. + 4. Start developing! Check out our [developer flow][16] for tips, and review our [checklist for pull requests][17] when your changes are ready. If it's your first contribution, there is a standard contributor license agreement ([CLA][18]) to sign. + + + +### Integrations + +Create a host of technologies to empower Mattermost to solve real-world problems. These include: + + * **Self-hosted integration solutions:** Include connectivity and integration with third-party applications such as Jira, Jitsi, GitLab, Jenkins, and other tools + * **SaaS-based integration solutions:** Include connectivity and integration with services like Twitter, Zendesk, Salesforce, and hundreds of other extensions with services like Zapier + * **Federated experiences:** Include bridges with IRC, Slack, and other messaging applications through solutions like [Matterbridge][19] + * **Programming solutions:** Include language-specific drivers and connectors to simplify the work of other developers + * **Mattermost user-experience plugins:** Include server- and client-side plugins that enhance the native capabilities of a Mattermost server, such as voice, video, and screen sharing + * **Custom user experiences:** Include integrations into Terminal like [Matterhorn][20] and [Pidgin][21] built off the same core [Mattermost APIs][22] + + + +Contribute in four steps: + + 1. Sign up to our Mattermost community site and join the [Developer Toolkit channel][23] for questions. + 2. Visit the Mattermost Integrations Directory for a current list of open source integrations and projects to get ideas on how to get started. + 3. Start developing! Read our [integrations guide][24] for tips on how to integrate with the Mattermost server. + 4. Have you built something for Mattermost? We want to hear about it! [Let us know here][25]. + + + +### Localization + +Today, Mattermost ships in 16 languages, and 26 other languages are in progress by hundreds of contributors. If you're interested in translating, here's how to get involved: + + 1. Sign up to our Mattermost community site and join the Localization channel for questions. + 2. Sign up to our translations server. + 3. Choose your language. If the language is already listed in the translations server, you can offer help by translating, reviewing, or making suggestions to existing strings. If it's not listed, ask in the Localization channel to set up your language. + 4. Start translating! Read our Localization documentation for more information on the translation rules and maintenance process. + + + +### Documentation + +Write software and troubleshooting documentation used by thousands of people across the world. These include: + + * **[Product documentation][26]:** Includes feature documentation for users and administrators, including troubleshooting notes and frequently asked questions + * **[Developer documentation][11]:** Includes documentation for contributor and developer workflows, integrations, and extensions + * **[API documentation][22]:** Includes documentation of the RESTful API used by the Mattermost platform + + + +Contribute in three steps: + + 1. Sign up to our Mattermost community site and join the [Documentation channel][27] for questions. + 2. Choose a [ticket][15] and comment to let people know you're working on it. See the [process][28] for contributing. + 3. Review our [documentation guidelines][29] for tips on how to create effective docs. Note that if it is your first pull request, you will be asked to sign a standard [CLA][18]. + + + +### Peer-to-peer support and feedback + +Not a developer but still want to contribute to open source? No problem! In addition to localization and documentation mentioned above, you can: + + * **Report bugs:** Sign up to our Mattermost community site and join the [Bugs channel][30] for questions. Then, go to our [GitHub page][2] and open a new issue in the relevant repository. Read our docs on [steps for filing bugs][31]. + * **Test and find issues:** Go to our [community test server][32] or any of Mattermost's open source codebases to test and find issues. If you find a bug, go to our GitHub page and open a new issue in the relevant repository. Read our docs on [steps for filing bugs][31]. + * **Troubleshoot issues:** Sign up to our Mattermost community site and join the [Peer-to-Peer Help channel][33] to help answer questions. Follow questions in Mattermost [Forums][34] and GitHub Issues to help others. + * **Suggest new features:** Sign up to our Mattermost community site and join the [Feature Proposals channel][35] to ask questions. Then, go to [Uservoice][36] to propose new features. Read our docs on [contributing feature proposals][37]. + * **Share feedback:** Sign up to our Mattermost community site and join the Peer-to-Peer Help channel to ask questions and share feedback about Mattermost. + + + +### Security vulnerabilities + +Safety and data security are top priorities for the Mattermost community. If you are a security researcher and discover a security vulnerability in our codebase, we appreciate your help in disclosing it to us in a responsible manner. + +If the security bug you found is valid, the fix will be posted on our [Security Updates][38] page 30 days after its release, and you will be added to our [Security Research Hall of Fame][14]. If you'd like, we will publicly acknowledge your responsible disclosure. If not, you can remain anonymous. + +Here's how to contribute through our [responsible disclosure policy][14]: + + 1. Contact us to report any security vulnerabilities found in any of Mattermost's open source codebases or any of our commercial offerings. + 2. We will let you know if your report is reproducible as an exploit and results in a change to a Mattermost product's codebase or documentation. + + + +After a fix is made, we ask security researchers to wait 30 days after a release before announcing the specific details of a vulnerability and to provide Mattermost with a link to any such announcements. + +### Getting help + +If you have any questions or need help getting started, join our [Mattermost Contributors channel][39]. You can reach me at @jason.blais. See you there! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/mattermost + +作者:[Jason Blais][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/talk_chat_communication_team.png?itok=CYfZ_gE7 (Chat bubbles) +[2]: https://github.com/mattermost +[3]: https://opensource.com/downloads/cheat-sheet-markdown +[4]: https://mattermost.com/download/#mattermostApps +[5]: https://opensource.com/sites/default/files/uploads/mattermostui.png (Mattermost user interface on Linux Desktop App) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://www.redhat.com/en/enterprise-open-source-report/2020 +[8]: https://developers.mattermost.com/contribute/team_contributions/ +[9]: https://github.com/mattermost/mattermost-server/issues?q=label%3A%22Help+Wanted%22+label%3A%22Good+First+Issue%22+label%3A%22Up+For+Grabs%22+is%3Aopen+is%3Aissue+ +[10]: https://developers.mattermost.com/contribute/getting-started/ +[11]: https://developers.mattermost.com/ +[12]: https://handbook.mattermost.com/contributors/contributors/community +[13]: https://mattermost.com/contribute/ +[14]: https://mattermost.com/security-vulnerability-report/ +[15]: https://github.com/mattermost/mattermost-server/issues?q=is%3Aissue+is%3Aopen+label%3A%22Up+For+Grabs%22 +[16]: https://developers.mattermost.com/contribute/server/developer-workflow/ +[17]: https://developers.mattermost.com/contribute/getting-started/contribution-checklist/ +[18]: https://www.mattermost.org/mattermost-contributor-agreement/ +[19]: https://github.com/42wim/matterbridge +[20]: https://github.com/matterhorn-chat/matterhorn +[21]: https://github.com/EionRobb/purple-mattermost/ +[22]: https://api.mattermost.com/ +[23]: https://community.mattermost.com/core/channels/developer-toolkit +[24]: https://developers.mattermost.com/integrate/getting-started/ +[25]: https://www.mattermost.org/share-your-mattermost-projects/ +[26]: http://docs.mattermost.com/ +[27]: https://community.mattermost.com/core/channels/documentation +[28]: https://github.com/mattermost/docs#contributing +[29]: https://handbook.mattermost.com/operations/operations/publishing/publishing-guidelines/voice-tone-and-writing-style-guidelines +[30]: https://community.mattermost.com/core/channels/bugs +[31]: https://www.mattermost.org/filing-issues/ +[32]: https://rc.test.mattermost.com/ +[33]: https://community.mattermost.com/core/channels/peer-to-peer-help +[34]: https://forum.mattermost.org/ +[35]: https://community.mattermost.com/core/channels/feature-ideas +[36]: https://mattermost.uservoice.com/forums/306457-general +[37]: https://www.mattermost.org/feature-ideas/ +[38]: https://mattermost.com/security-updates/ +[39]: https://community-release.mattermost.com/core/channels/tickets diff --git a/sources/tech/20200723 Build your own open source alternative to Google Suite with Nextcloud.md b/sources/tech/20200723 Build your own open source alternative to Google Suite with Nextcloud.md new file mode 100644 index 0000000000..87cbc1a101 --- /dev/null +++ b/sources/tech/20200723 Build your own open source alternative to Google Suite with Nextcloud.md @@ -0,0 +1,127 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Build your own open source alternative to Google Suite with Nextcloud) +[#]: via: (https://opensource.com/article/20/7/nextcloud) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +Build your own open source alternative to Google Suite with Nextcloud +====== +The open source cloud collaboration suite has made major gains in recent +years. Take a look at what you've missed. +![Digital images of a computer desktop][1] + +A few years ago, I installed [Nextcloud][2] for a local theatre and museum that was looking for an on-premises cloud solution. As an advocate for open source, I always seek out open source options first, and Nextcloud was the most-common open source cloud solution among my peers. I've also used it for some personal projects, but I hadn't looked at it in a while. + +I recently revisited Nextcloud and was amazed by all the changes I saw. The project has evolved into a complete solution that can replace big-name solutions like Google Drive and Microsoft 365. Nextcloud's new feature set, especially [Nextcloud Hub][3], is outstanding, offering collaborative documentation editing, file version control, integrated chat and video calling, and more. + +### Getting started with Nextcloud + +There are many options for [setting up a Nextcloud server on Linux][4], but I decided to run the official [container image][5]. I pulled it down to my laptop, and soon I was up and running. + + +``` +$ docker pull nextcloud +$ docker run -d -p 8080:80 nextcloud +``` + +Installation was quick on my MacBook Pro with 8GB RAM. In no time at all, I was logging into Nextcloud for the first time at `http://locahost:8080` with the default credentials of _admin_ and _password_. + +![Nextcloud login interface][6] + +(Don Watkins, [CC BY-SA 4.0][7]) + +After I entered my login credentials, it began downloading some applications, which took some time. I appreciated that Nextcloud's interface looked much the same as it did years ago, even with all the changes in the platform, because I like to feel familiar with a technology. + +![Nextcloud's UI][8] + +(Don Watkins, [CC BY-SA 4.0][7]) + +Nextcloud's controls are located in the upper-right corner. You can control settings, add apps, create and modify users, learn about Nextcloud, get help, and log out. + +Nextcloud Hub is a central collaboration platform where you can access and collaborate on files, launch, enable, and disable applications, manage your calendar, and more. + +I decided to start by exploring the apps available in Nextcloud. Some app integrations are included by default, and you can download others with a single click. For example, here is the display when I clicked the top-right icon, then selected Apps and Multimedia. + +![Nextcloud multimedia apps][9] + +(Don Watkins, [CC BY-SA 4.0][7]) + +There are hundreds of apps that can be downloaded and added to Nextcloud, and, like Nextcloud, all are licensed under the [AGPLv3][10]. Clicking on an app shows information about it, including its creator and license. I decided to look at [Audio Player][11]. + +![Nextcloud Audio Player][12] + +(Don Watkins, [CC BY-SA 4.0][7]) + +Nextcloud also comes with the [Nextcloud Talk][13] app for videoconferencing with complete end-to-end encryption to keep communication within your control. As of Nextcloud Hub 19, you can work on documents synchronously during video calls with [Collabora Online][14], which will feel familiar to Google Docs users. + +Nextcloud also has a number of important security features, including optional automatic logout, which is useful when using public computers. You can also set up passwordless authentication, automatic account locking after failed login attempts, and two-factor authentication (2FA) through mobile, email, or one-time password devices to verify users' identity before they can log in. + +### Nextcloud's advances + +Eager to learn more about Nextcloud and its new directions, I reached out to CEO [Frank Karlitschek][15] to ask him some questions by email. + +During this time of social distancing, I was curious about how the growth of remote work is fueling Nextcloud's development. Frank says the fact that the world is [working from home][16] is accelerating the adoption of content collaboration software, and Nextcloud is "in the lucky situation that we heavily invested in this fast-growing product category." He specifically cites Nextcloud's abilities to sync, share, and collaboratively view and edit files, as well as its shared calendars, contacts, email, chats, video calls, project management, notes, and many more things as features that help people work together. + +Frank adds, "Nextcloud Talk is our solution for chat and audio and video calls. It has the same benefits as the rest of Nextcloud. All data and communication stay under your control. It is fully open source; you can migrate your data and don't need to trust a third-party company." + +Open source is a key part of Nextcloud's model, Frank says. "Everything server-side is licensed AGPL, and the desktop and mobile clients are licensed GPL. We are happy to not have any proprietary pieces. Everything at Nextcloud is fully free software and open source." + +When I asked him why someone should choose Nextcloud over a proprietary cloud solution, Frank emphasizes the freedom to run where you want with 100% open source software. "Being open source has many benefits for users. It means you can keep your data under your own control. You can run Nextcloud wherever you want. Vendor lock-in is eliminated, so you can move your data around to where you need it. The open source code in Nextcloud ensures that there are no backdoors because the code can be audited. The open source angle has also empowered developers to extend Nextcloud with hundreds of apps, extensions, and plugins." + +I was also curious about Nextcloud's security, including its support for [Nitrokey][17], a feature for passwordless authentication. Frank says, "Nextcloud supports authentication from many different protocols, including LDAP, Active Directory, SAML, OAuth, OpenID connect, WebAuthn, and many more. You can use second-factor authentication methods, including Time-based One-time Password (TOTP), SMS, push notification, SecSign, and email. With the new support for [WebAuthn][18], we also support the new passwordless authentication. Nitrokey already supports this, so you can just authenticate with a Nitrokey without a password. We expect that a lot more devices and software will support this new open standard in the future." + +As I thought about all the changes in Nextcloud, I wondered about its install base. Being open source makes it impossible to know how many Nextcloud installations there are in the world. One of its [container images][19] has over 100 million downloads, and it has a strong following in its source repository on [GitHub][20]. Nextcloud estimates there are over 400,000 Nextcloud servers on the internet, and that number is growing. + +Nextcloud doesn't provide hosting options itself, but it does list service [providers][21] that offer hosted Nextcloud. There are also many options for self-hosting Nextcloud, Frank says. "A Nextcloud server can be very small or very big. Actually, Nextcloud runs fine on a Raspberry Pi for just a few users. This includes chatting and video calling. The Nextcloud server needs a decent network connection if you handle big files or video calls with a lot of users." + +### Open source to its core + +Frank was eager to thank the open source community that comes together and builds great software. He said, "open source is all about the community; no single person or company could do this alone." Therefore, Nextcloud welcomes [contributions][22] to its development. Nextcloud's code is available on [GitHub][23]. To keep up with the latest information, you can follow Nextcloud on [Twitter][24], [Instagram][25], [Facebook][26], [LinkedIn][27], [Mastodon][28], and [YouTube][29]. + +Sandstorm's Jade Wang shares some of her favorite open source web apps that are self-hosted... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/nextcloud + +作者:[Don Watkins][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_desk_home_laptop_browser.png?itok=Y3UVpY0l (Digital images of a computer desktop) +[2]: https://nextcloud.com/ +[3]: https://nextcloud.com/hub/ +[4]: https://docs.nextcloud.com/server/19/admin_manual/installation/index.html +[5]: https://hub.docker.com/_/nextcloud/ +[6]: https://opensource.com/sites/default/files/uploads/nextcloud_login.png (Nextcloud login interface) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/uploads/nextcloud_interface.png (Nextcloud's UI) +[9]: https://opensource.com/sites/default/files/uploads/nextcloud_multimedia-apps.png (Nextcloud multimedia apps) +[10]: https://www.gnu.org/licenses/agpl-3.0.en.html +[11]: https://apps.nextcloud.com/apps/audioplayer +[12]: https://opensource.com/sites/default/files/uploads/nextcloud_audio-player_0.png (Nextcloud Audio Player) +[13]: https://nextcloud.com/talk/ +[14]: https://nextcloud.com/collaboraonline/ +[15]: https://en.wikipedia.org/wiki/Frank_Karlitschek +[16]: https://opensource.com/tags/wfh +[17]: https://www.nitrokey.com/ +[18]: https://en.wikipedia.org/wiki/WebAuthn +[19]: https://hub.docker.com/r/linuxserver/nextcloud/ +[20]: https://github.com/nextcloud/server +[21]: https://nextcloud.com/providers/ +[22]: https://nextcloud.com/contribute/ +[23]: https://github.com/nextcloud +[24]: https://twitter.com/nextclouders +[25]: https://instagram.com/nextclouders +[26]: https://www.facebook.com/Nextclouders/ +[27]: https://www.linkedin.com/company/10827569/ +[28]: https://mastodon.xyz/@nextcloud +[29]: https://youtube.com/nextcloud diff --git a/sources/tech/20200726 Dreamweaver Alternatives- 5 Open Source HTML and CSS Editors for Web Developers and Designers.md b/sources/tech/20200726 Dreamweaver Alternatives- 5 Open Source HTML and CSS Editors for Web Developers and Designers.md new file mode 100644 index 0000000000..0eace81ea0 --- /dev/null +++ b/sources/tech/20200726 Dreamweaver Alternatives- 5 Open Source HTML and CSS Editors for Web Developers and Designers.md @@ -0,0 +1,203 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Dreamweaver Alternatives: 5 Open Source HTML and CSS Editors for Web Developers and Designers) +[#]: via: (https://itsfoss.com/open-source-html-editors/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Dreamweaver Alternatives: 5 Open Source HTML and CSS Editors for Web Developers and Designers +====== + +Adobe Dreamweaver is a popular tool for professionals to design websites. Even though it enjoyed all its glory in the past decade, it’s no longer the most popular tool out there (at least, as far as I’m aware of). + +Its expensive subscription plans and the availability of free and open-source alternatives has left an impact to its popularity. + +Moreover, with the growth of popular [open source CMS][1] options and drag-drop website builders, it’s really easy to build a website when compared to the previous decade. + +Unless you’re a professional with a specific set of requirements, there’s no reason to use Dreamweaver. So, here, in this article, I’m going to list some of the best free open-source Dreamweaver alternatives that lets you edit HTML/CSS. + +### Open source HTML and CSS editors for web developers + +![][2] + +I understand that some web developers and designers prefer WYSIWYG (What You See Is What You Get) feature. Not all the editors mentioned here offer this feature but when they do, I have highlighted it explicitly. + +I have used [this website template][3] for testing out the HTML editors. This _**list is in no particular order of ranking**_. + +#### 1\. Bluefish Editor + +![][4] + +**Key Highlights:** + + * Auto-completion + * Preview in browser + * Site upload/download options + * Code block folding + * Support for several programming languages + * Supports WordPress language definition files + * Cross-platform support + + + +Bluefish is a feature-rich editor that’s perfectly suitable for both beginners and experienced web designers. + +Even though it does NOT offer [WYSIWYG][5], the browser preview feature lets you make changes to the coding and see it in action quickly without any special configuration. It’s also a lightweight application – so it isn’t heavy on resources. + +Try it out to explore more about it. + +##### How to install it? + +You may find it listed in your software center. If you don’t, you can follow the [official installation instructions][6] to add the repository and install it on your Linux distribution. + +Also, there’s a [Flatpak package][7] available in case you prefer using it. I’d suggest you to refer our [Flatpak guide][8] if you don’t know about it. + +[Bluefish][9] + +#### 2\. BlueGriffon + +![][10] + +**Key** **Highlights:** + + * **WYSIWYG** editor + * Black and light theme + * Responsive Design support + * EPUB 3.1 support + * Cross-platform support + + + +BlueGriffon is an impressive WYSIWYG HTML/CSS editor. You can choose to edit the codes and check the design or simply edit it visually without needing to fiddle with the codes. + +This is especially helpful for folks who aren’t comfortable with HTML/CSS and just starting out. It makes it easy to edit while offering all the necessary features for a web designer. + +##### How to install it? + +You can download the deb package from its [official website][11] or opt for other installers and source code depending on the Linux distribution you’re using. + +You may want to read the [different ways to install a DEB file][12] if you’re on an Ubuntu-based distro. + +[BlueGriffon][13] + +#### 3\. SeaMonkey + +![][14] + +**Key Highlights:** + + * WYSIWYG Editor + * Separate browser + * HTML editing + * Cross-platform support + + + +SeaMonkey isn’t your typical code editor — but it’s a collection of Internet applications like a browser, email, IRC chat, and HTML editor. + +It does support editing the source code of a web page and the ability to edit visually without needing to know HTML. + +You can explore more about it when you get it installed. + +##### How to install it? + +You can simply download the package for Linux available on their [official site][15] and run the executable SeaMonkey application file to get started. + +[SeaMonkey][16] + +#### 4\. Brackets + +![][17] + +**Key Highlights:** + + * Live preview option + * Tailored for web design + * Auto-completion + * Cross-platform + + + +Brackets is already one of the [best modern text editors for coding][18] in Linux. It was primarily built for web developers while also supporting other programming languages. + +Surprisingly, it’s an open-source project by Adobe, which isn’t super actively maintained — but it’s there. + +##### How to install it? + +You can simply grab the deb file from its [official website][19] for Ubuntu 19.10 or lower. For Ubuntu 20.04 or any other Linux distro, you will be better off using the [Flatpak package][20] or the [Snap][21]. + +You may also explore their [GitHub releases section][22] for other downloads. + +[Brackets][19] + +#### 5\. NetBeans + +![][23] + +**Key Highlights:** + + * HTML Editor + * Cross-platform + + + +NetBean isn’t technically an out-of-the-box HTML-CSS editor. But, you can use it as an HTML editor when building an HTML5 application. + +It isn’t the go-to solution for HTML editing, but it’s an option out there for a specific group of programmers. You can give it a try to see if it does what you expect it to. + +##### How to install it? + +You can find it listed in your software center. In either case, you can just head to the [official download page][24] to get it installed. + +[NetBeans][25] + +**Which HTML editor do you use?** + +There are a few more editors that you can use for editing HTML and CSS. There is [Aloha Editor Community Edition][26] preferred by some web developers. + +You can surely use other [modern code editors][18] like Atom and VS Code or the good-old [Geany text editor][27] to edit HTML and CSS files. + +If you regularly work on web design and development, which open source HTML editor do you use and recommend? We might add your recommendation to our list here. You may also mention non-open source WYSIWYG editors but that won’t be added in the list for obvious reasons. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/open-source-html-editors/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/open-source-cms/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/Open-Source-html-editors.jpg?ssl=1 +[3]: https://www.styleshout.com/free-templates/kards/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/bluefish.png?ssl=1 +[5]: https://en.wikipedia.org/wiki/WYSIWYG +[6]: https://bfwiki.tellefsen.net/index.php/Installing_Bluefish +[7]: https://www.flathub.org/apps/details/nl.openoffice.bluefish +[8]: https://itsfoss.com/flatpak-guide/ +[9]: http://bluefish.openoffice.nl/index.html +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/bluegriffon.png?ssl=1 +[11]: http://www.bluegriffon.org/#download +[12]: https://itsfoss.com/install-deb-files-ubuntu/ +[13]: http://bluegriffon.org +[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/seamonkey.png?ssl=1 +[15]: http://www.seamonkey-project.org/releases/ +[16]: http://www.seamonkey-project.org +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/brackets-dreamweaver-alternative.png?ssl=1 +[18]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[19]: http://brackets.io/ +[20]: https://flathub.org/apps/details/io.brackets.Brackets +[21]: https://snapcraft.io/brackets +[22]: https://github.com/adobe/brackets/releases +[23]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/netbeans.jpg?ssl=1 +[24]: https://netbeans.apache.org/download/index.html +[25]: https://netbeans.apache.org/ +[26]: https://www.alohaeditor.org/ +[27]: https://www.geany.org/ diff --git a/sources/tech/20200727 What does it mean for code to -work.md b/sources/tech/20200727 What does it mean for code to -work.md new file mode 100644 index 0000000000..5dedc38a6b --- /dev/null +++ b/sources/tech/20200727 What does it mean for code to -work.md @@ -0,0 +1,91 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What does it mean for code to "work"?) +[#]: via: (https://opensource.com/article/20/7/code-tdd) +[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzic) + +What does it mean for code to "work"? +====== +Test driven development (TDD) separates computing results from actions +to ensure your code does what you expect. +![Searching for code][1] + +Extreme Programming co-founder [Ron Jeffries][2] famously wrote: "The trick is never to let the code not be working." + +Jeffries' quote points at the fact that software engineering is a very sophisticated activity with plenty of uncertainty. Software engineering also deals with issues of incompleteness—at the outset, you never seem to have all information you need to formulate an optimal approach. There always comes a time, later in the project, when you learn something that shows that several things in your initial understanding were incorrect. In addition, even when you amass sufficient useful information to orient yourself properly, that information tends to contain ambiguity—communication is seldom, if ever, clear. Ambiguity seems to prevail in both verbal and written communication. + +Because of these constraints, the only safe way to proceed when developing software is to rely on the working code. The running, working code is the final oracle. It will tell you if you're doing the right thing and going in the right direction. + +### How do you know if the code is working? + +It is impossible to know if your code is working as designed if the code isn't running. To have code that compiles without errors and always runs without exceptions doesn't mean that the code is working. It could be doing all these activities while doing nothing of use. Therefore, the definition of working code is that it runs without any problems while doing something you expect it to do. + +The only way to find out if your code is working according to expectations is to focus on observable behavior. Merely reading and analyzing the source code is not sufficiently convincing; you need to see the code executing to judge whether its execution meets your expectations. + +There are two ways to measure observable behavior: + + 1. Watch the computer that is running your code perform some actions + 2. Test the running code for the computed values + + + +The first type of observable behavior (observing some actions being performed) is not the best way to ensure that your code works according to expectations. For example, you may observe that your code performed an action, such as sending an email. But that alone is not sufficient to confirm the code works according to expectations. What if the email the code is sending contains incorrect information? + +The only way to confirm that your code is working according to expectations is to observe the computed values. And that process (i.e., observing the computed values to see if they match the expected values) is where test-driven development (TDD) shines. + +### How does it feel to write software if the code is not working? + +Before I discovered TDD, I was spending long stretches of time writing code without worrying about whether the code was working or not. Every now and then, when I felt I had reached a milestone in coding, I would run the application I was working on. I'd log in as a fictitious user and manually trigger some actions to see if the program did what I told it to do. + +This approach is similar to measuring an iceberg by just gauging its tip—the part of the iceberg visible above the water. Although my manual testing provided a clean bill of health for the app, naturally, once it went into production, all kinds of bugs and defects started showing up (caused by the "below-the-waterline" part of the iceberg). + +Looking back, it is obvious that writing code without making it work all the time is similar to flying a kite. Flying a kite in a strong wind is exciting, even exhilarating. But the kite almost never touches the ground, and it is very challenging to control its direction in the strong wind. Also, it is almost impossible to land the kite at the exact spot you aim for. + +### How does it feel to write software when doing TDD? + +TDD is based on the idea that the way the code behaves should be independent from the way the code is structured. You are aiming at a desired behavior. While you're writing code, the desired behavior is not there (that's why it is called "desired"). You implement the desired behavior by first writing a test that describes it. Then you run that test, and it fails because the expected behavior is not implemented yet. The failure prompts you to fix it, which forces you to run the code again. If the changes you make to the code satisfy the expectations described in the test, you conclude that the code works according to your expectations. + +If the changes you make to the code do not satisfy the expectations described in the test, the code does not work, and you need to make more changes to the code until it works as expected. + +This process, when done consistently, feels like riding a galloping horse. Every now and then, a galloping horse touches the ground, which is equivalent to the moment when all tests pass in TDD. While the horse is "in flight," it is charging in a straight line. The horse is advancing, but there is no way to change its course. Only when the horse touches the ground does the horse rider get a chance to change the direction they're heading. + +Similarly, when writing code, you are "in flight." While you're coding, you have no way of verifying if you're going in the right direction. It is only when you stop coding, save your changes, and run the code that you can observe if your code is doing what you expect it to do. You are touching the ground each time you run your code. + +TDD is the discipline that guides you toward performing this reality check as often as possible. This minimizes your risk of shipping incorrect code. + +### You are the first customer of your application code + +Since you're writing a test that automates your expectations, you are the first customer of the application code. Actually, it's better to say that _your test_ is the first customer of your code. The test could be viewed as a customer who walks into a restaurant, and being hungry, orders a meal. When the customer orders, she has a specific meal in mind. The kitchen staff's job is to turn that customer's desire into reality. + +If the waiter delivers the meal and, after tasting it, the customer disagrees that the meal meets her expectations, she returns it to the kitchen. The staff modifies the meal until the customer is satisfied. But kitchen staff will never know if the meal is good unless they collect feedback from the customer. + +In a similar fashion, the only way to know if the code you're writing satisfies expectations is by collecting feedback from the test. + +### Conclusion + +The only way to know if the changes you are making to the code are advancing your app in the right direction is by making the code work. Mere review of the code, the act of reading the code, is never sufficient to reach a solid conclusion that the code is correct. + +Most developers prefer writing code in long stretches. But spending hours writing code means you're wasting hours not making the code work (recall Ron Jeffries' advice "The trick is never to let the code not be working"). You're letting the code not be working if you indulge in long code-writing sessions. + +TDD helps control that by focusing your attention on observable behavior. In TDD, you define expected values and continue interrogating your code to see if it computes those expected values. To confirm or refute the expectations, you must make the code work. The more often you do these "reality checks," the higher the probability that your efforts are going in the right direction. + +The transition from a stable, steady state (being ready) to the next stable, steady state (being ready again), should be as short as possible. TDD strives to help you always travel in a ready-to-ready fashion. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/code-tdd + +作者:[Alex Bunardzic][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alex-bunardzic +[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://en.wikipedia.org/wiki/Ron_Jeffries diff --git a/sources/tech/20200728 Why now is the best time to use GNOME.md b/sources/tech/20200728 Why now is the best time to use GNOME.md new file mode 100644 index 0000000000..1a0f2ba2c9 --- /dev/null +++ b/sources/tech/20200728 Why now is the best time to use GNOME.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Why now is the best time to use GNOME) +[#]: via: (https://opensource.com/article/20/7/new-gnome-features) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +Why now is the best time to use GNOME +====== +GNOME developer Emmanuele Bassi explains the user experience updates in +the GNOME desktop environment. +![Take a look at the latest from GNOME 3][1] + +The GNOME desktop environment has been through many changes since its initial release in March 1999. For most of this time, the open source project has issued updates twice a year, which gives users predictability in when they can expect new features to land on their Linux and other Unix-like desktops. Its latest release, GNOME 3.36, came out in March, and the project is preparing to issue its next iteration in September. To learn about what's new in GNOME, I spoke with Emmanuele Bassi. + +Emmanuele has been contributing to GNOME for more than 15 years. He started as the maintainer of language bindings that allow developers to use GNOME libraries in other programming languages, then moved on to contribute to GTK (a cross-platform widget for developing GNOME apps) and other parts of GNOME. In 2018, GNOME hired Emmanuele as a full-time GTK Core Developer, where he works on GTK and the GNOME application development platform. + +**Jim Hall:** **GNOME 3.36 was released in March 2020. What are some of the major features people should know about?** + +**Emmanuele Bassi:** GNOME has followed a release schedule for the last 18 or so years. GNOME doesn't release when a new feature is ready; we release when it's time. That simplifies the new releases. There isn't a "next big thing" in GNOME. Instead, it's just a new release every six months. We always fix bugs, add new features, and polish up what's there. + +This release was really about making sure all the features were nice to use and pleasant to use. In GNOME 3.36, there's a lot that improves the user experience. One thing I like is the ability to turn off notifications. This is a feature that was available in a very old version of GNOME but was removed a while back because the mechanism underneath it wasn't very reliable. But we added it back because this feature is so useful and important to a lot of people. + +You can toggle notifications on and off for everything or set them for each application you use. You can find this setting in the GNOME Settings app, under the Applications menu. + +![GNOME "Do Not Disturb" feature][2] + +Click "Do Not Disturb" to turn off notifications. (GNOME, [CC BY-SA 4.0][3]) + +![Notifications options in GNOME Settings][4] + +You can turn off notifications for individual applications in the Settings app. (Jim Hall, [CC BY-SA 4.0][3]) + +We also added extra polish to the GNOME lock screen. This updated lock screen has been in the works for ages, and now it's ready. The new GNOME lock screen will blur the background of your current workspace but doesn't show your running applications. It's a great feature for the user experience. We've been working on that for the last three or four cycles, and we fixed a lot of things along the way to make that work well. + +Another thing that's important for user experience is that [there is a new] place to put all the extensions. [It was in] GNOME Software Center, but no one knew to look there. Now there's a separate application to manage it. + +![GNOME Extensions app][5] + +The new Extensions app lets you change extension preferences or turn off those you don't want. (GNOME, [CC BY-SA 4.0][3]) + +And there's lots of little polish added to the GNOME Shell itself. For example, the application folders in the GNOME Shell application launcher are a great new feature. It's really easy to create your own application groups or folders in the launcher. A lot of people had asked for this for a long time. Application folders actually landed in an earlier GNOME release, but [the feature] needed extra work to make it really great, and that's what you see in GNOME 3.36. + +**JH: What are some features of GNOME that more people should know about?** + +**EB:** I don't know that there are other features that are really big in GNOME 3.36. If you're already using GNOME, the biggest thing you'll see is the improved user experience. If you aren't using GNOME, then the big thing is the consistent behavior in using GNOME. It's about a smooth experience with your computer, like your computer isn't going to be bothering you. + +Password fields are easier. This used to be in a menu that you had to know existed if you wanted to use it, but now it's right there. + +**JH: This is a great feature if you use long and complex passwords, like me. In any GNOME prompt where you would type in a password, you can click a little icon to expose your password to make sure you typed it correctly.** + +![GNOME lock screen][6] + +The lock screen includes the new "show your password" feature. (GNOME, [CC BY-SA 4.0][3]) + +**EB:** The new application folders in the GNOME application launcher is another [feature to know about]. The folders are easier to see, and they look great. GNOME will suggest a name for the application folder, but it's really easy to give that folder a different name. + +And more applications in GNOME are now responsive to being resized. They changed that in the user interface. The Settings app is a good example of that. If you make it too narrow, it changes how it displays things. We've been working on this for a while because of companies like Purism that are putting GNOME on other display sizes like phones or anyone who is using GNOME on other form factors. + +You don't notice some of the changes until you use them. There are lots of great features to see and that allow you to use GNOME in different ways. + +**JH: As a GNOME developer and user, what GNOME features do you find most useful in your daily work?** + +**EB:** I get a lot of use in the keyboard navigation. I use the keyboard all the time, so I live with my hands on the keyboard. When I use the mouse, I sometimes can get RSI (repetitive strain injury) by using it too much. Being able to use the keyboard for everything is great. + +The keyboard shortcuts are part of the GNOME Accessibility. It's also part of a design direction to be able to count on keyboard shortcuts for things. Keyboard accessibility is a core part of the design language; it's not a side feature that will be dropped someday. + +And having multiple windows on the screen and being able to tile them up, so I have two windows side by side. That, and multiple workspaces. I used to micromanage my workspaces back in the 1990s with different virtual desktops. But I'd always create more virtual desktops than I needed. But in GNOME, it's easy enough to create a new workspace if you need it, and when you don't need it, it's gone. + +**JH: We're already in the GNOME 3.37 development cycle, with GNOME 3.38 planned for September 2020. What are some new features showing up that will interest people?** + +**EB:** There are new changes all the time. One thing we're working on is the application grid and making that customizable. Right now, the applications are listed alphabetically, but you will be able to drag them around in any order you want. That will finish a massive change that's been in the works for five years or more. The goal is to be less automated and more user-driven. + +Another thing happening is the GNOME Shell; developers want to do some tests on the Overview layout. Right now, you have a dashboard on the left and one on the right and windows in the center. We're trying to remove the dashboard because it's not helpful. If you want to configure it, you can. This is kind of being driven by the mobile effort. On the desktop, you're in Landscape mode and you have a lot of room to put things on the screen. But on mobile, you're probably in Portrait mode, and you have less space. So we're experimenting with new layouts and new ways to display the content. Some of that will land in GNOME 3.38, but it's been a really long project, so we'll see. + +There are more features in GNOME Settings. A multi-tasking panel is planned in GNOME 3.38. Some of these settings exist already in the GNOME Tweaks app, and some of those will move from Tweaks into the main Settings app. Like being able to disable the hot corner—some people don't like that feature. Or letting you control the user interface when it comes to multiple screens—like if you want workspaces on multiple screens or just want workspaces on your main screen. Lots of these settings are not exposed right now unless you go into GNOME Tweaks, so we're moving those. + +And I should mention that there's lots of work by everyone in GNOME to make things faster, even for people running on more limited systems like the Raspberry Pi. There's been a lot of work to get GNOME to perform better. That's a lot of work that people have been focusing on, because people really care about it. + +* * * + +You can download and learn more about GNOME, including its underlying technologies, getting involved, and more on its [website][7]. If you're curious to learn what else is new in GNOME, check out the [GNOME 3.36 release notes][8]. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/new-gnome-features + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/gnome-3-opensourcecom-lead.png?itok=FCw4KaGT (Take a look at the latest from GNOME 3) +[2]: https://opensource.com/sites/default/files/uploads/gnome-do-not-disturb.png (GNOME "Do Not Disturb" feature) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ +[4]: https://opensource.com/sites/default/files/uploads/gnome-settings-rhythmbox-notif.png (Notifications options in GNOME Settings) +[5]: https://opensource.com/sites/default/files/uploads/gnome-extensions.png (GNOME Extensions app) +[6]: https://opensource.com/sites/default/files/uploads/gnome-lock-screen.png (GNOME lock screen) +[7]: https://www.gnome.org/ +[8]: https://help.gnome.org/misc/release-notes/3.36/ diff --git a/sources/tech/20200729 Demonstrating Perl with Tic-Tac-Toe, Part 4.md b/sources/tech/20200729 Demonstrating Perl with Tic-Tac-Toe, Part 4.md new file mode 100644 index 0000000000..4c7ca4782b --- /dev/null +++ b/sources/tech/20200729 Demonstrating Perl with Tic-Tac-Toe, Part 4.md @@ -0,0 +1,144 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Demonstrating Perl with Tic-Tac-Toe, Part 4) +[#]: via: (https://fedoramagazine.org/demonstrating-perl-with-tic-tac-toe-part-4/) +[#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/) + +Demonstrating Perl with Tic-Tac-Toe, Part 4 +====== + +![][1] + +This is the final article to the series demonstrating Perl with Tic-Tac-Toe. This article provides a module that can compute better game moves than the previously presented modules. For fun, the modules _chip1.pm_ through _chip3.pm_ can be incrementally moved out of the _hal_ subdirectory in reverse order. With each chip that is removed, the game will become easier to play. The game must be restarted each time a chip is removed. + +### An example Perl program + +Copy and paste the below code into a plain text file and use the same one-liner that was provided in the [the first article][2] of this series to strip the leading numbers. Name the version without the line numbers _chip3.pm_ and move it into the _hal_ subdirectory. Use the version of the game that was provided in [the second article][3] so that the below chip will automatically load when placed in the _hal_ subdirectory. Be sure to also include both _chip1.pm_ and _chip2.pm_ from the second [and third][4] articles, respectively, in the _hal_ subdirectory. + +``` +00 # artificial intelligence chip +01 +02 package chip3; +03 require chip2; +04 require chip1; +05 +06 use strict; +07 use warnings; +08 +09 sub moverama { +10 my $game = shift; +11 my @nums = $game =~ /[1-9]/g; +12 my $rama = qr/[1973]/; +13 my %best; +14 +15 for (@nums) { +16 my $ra = $_; +17 next unless $ra =~ $rama; +18 $best{$ra} = 0; +19 for (@nums) { +20 my $ma = $_; +21 next unless $ma =~ $rama; +22 if (($ra-$ma)*(10-$ra-$ma)) { +23 $best{$ra} += 1; +24 } +25 } +26 } +27 +28 @nums = sort { $best{$b} <=> $best{$a} } keys %best; +29 +30 return $nums[0]; +31 } +32 +33 sub hal_move { +34 my $game = shift; +35 my $mark = shift; +36 my @mark = @{ shift; }; +37 my $move; +38 +39 $move = chip2::win_move $game, $mark, \@mark; +40 +41 if (not defined $move) { +42 $mark = ($mark eq $mark[0]) ? $mark[1] : $mark[0]; +43 $move = chip2::win_move $game, $mark, \@mark; +44 } +45 +46 if (not defined $move) { +47 $move = moverama $game; +48 } +49 +50 if (not defined $move) { +51 $move = chip1::hal_move $game; +52 } +53 +54 return $move; +55 } +56 +57 sub complain { +58 print 'Just what do you think you\'re doing, ', +59 ((getpwnam($ENV{'USER'}))[6]||$ENV{'USER'}) =~ s! .*!!r, "?\n"; +60 } +61 +62 sub import { +63 no strict; +64 no warnings; +65 +66 my $p = __PACKAGE__; +67 my $c = caller; +68 +69 *{ $c . '::hal_move' } = \&{ $p . '::hal_move' }; +70 *{ $c . '::complain' } = \&{ $p . '::complain' }; +71 +72 if (&::MARKS->[0] ne &::HAL9K) { +73 @{ &::MARKS } = reverse @{ &::MARKS }; +74 } +75 } +76 +77 1; +``` + +### How it works + +Rather than making a random move or making a move based on probability, this final module to the Perl Tic-Tac-Toe game uses a more [deterministic][5] algorithm to calculate the best move. + +The big takeaway from this Perl module is that it is yet another example of how references can be misused or abused, and as a consequence lead to unexpected program behavior. With the addition of this chip, the computer learns to cheat. Can you figure out how it is cheating? Hints: + + 1. Constants [are implemented as subroutines][6]. + 2. References allow data to be modified out of scope. + + + +### Final notes + +Line 12 demonstrates that a regular expression can be [pre-compiled][7] and stored in a scalar for later use. This is useful as performance optimization when you intend to re-use the same regular expression many times over. + +Line 59 demonstrates that [some system library calls][8] are available directly in Perl’s built-in core functionality. Using the built-in functions alleviates some overhead that would otherwise be required to launch an external program and setup the I/O channels to communicate with it. + +Lines 72 and 73 demonstrate the use of **&::** as [a shorthand for **&main::**][9]. + +The full source code for this Perl game can be cloned from the git repository available here: + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/demonstrating-perl-with-tic-tac-toe-part-4/ + +作者:[Gregory Bartholomew][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/glb/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/02/perl-tic-tac-toe-816x346.png +[2]: https://fedoramagazine.org/demonstrating-perl-with-tic-tac-toe-part-1/ +[3]: https://fedoramagazine.org/demonstrating-perl-with-tic-tac-toe-part-2/ +[4]: https://fedoramagazine.org/demonstrating-perl-with-tic-tac-toe-part-3/ +[5]: https://en.wikipedia.org/wiki/Deterministic_system +[6]: https://perldoc.perl.org/5.32.0/constant.html#TECHNICAL-NOTES +[7]: https://perldoc.perl.org/5.8.2/perlretut.html#Compiling-and-saving-regular-expressions +[8]: https://perldoc.perl.org/5.8.2/functions/getpwnam.html +[9]: https://perldoc.perl.org/perlmod.html#Packages diff --git a/sources/tech/20200729 How learning Linux introduced me to open source.md b/sources/tech/20200729 How learning Linux introduced me to open source.md new file mode 100644 index 0000000000..de43f960c0 --- /dev/null +++ b/sources/tech/20200729 How learning Linux introduced me to open source.md @@ -0,0 +1,78 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How learning Linux introduced me to open source) +[#]: via: (https://opensource.com/article/20/7/open-source-learning) +[#]: author: (Manaswini Das https://opensource.com/users/manaswinidas) + +How learning Linux introduced me to open source +====== +An engineering student's open source internships and volunteer +contributions helped her land a full-time developer job. +![Woman sitting in front of her computer][1] + +When I entered the engineering program as a freshman in college, I felt like a frivolous teenager. In my sophomore year, and in a fortunate stroke of serendipity, I joined [Zairza][2], a technical society for like-minded students who collaborated and built projects separate from the academic curriculum. It was right up my alley. Zairza provided me a safe space to learn and grow and discover my interests. There are different facets and roadways to development, and as a newbie, I didn't know where my interests lay. + +I made the switch to Linux then because I heard it is good for development. Fortunately, I had Ubuntu on my system. At first, I found it obnoxious to use because I was used to Windows. But I slowly got the hang of it and fell in love with it over time. I started exploring development by trying to build apps using Android and creating data visualizations using Python. I built a Wikipedia Reader app using the [Wikipedia API][3], which I thoroughly enjoyed. I learned to use Git and put my projects on GitHub, which not only helped me showcase my projects but also enabled me to store them. + +I kept juggling between Ubuntu and other Linux distributions. My machine wasn't able to handle Android Studio since it consumed a lot of RAM. I finally made a switch to Fedora in 2016, and I have not looked back since. + +At the end of my sophomore year, I applied to [Rails Girls Summer of Code][4] with another member of Zairza, [Anisha Swain][5], where we contributed to [HospitalRun][6]. I didn't know much about the tech stack, but I tagged along with her. This experience introduced me to open source. As I learned more about it, I came to realize that open source is ubiquitous. The tools I had used for a long time, like Git, Linux, and even Fedora, were open source all the while. It was fascinating! + +I made my first contribution when I participated in [Hacktoberfest][7] 2017\. I started diving deep and contributing to projects on GitHub. Slowly, I began gaining confidence. All the communities were newcomer-friendly, and I no longer felt like a fish out of water. + +In November 2017, I began learning about other open source programs like [Google Summer of Code][8] and [Outreachy][9]. I discovered that Outreachy runs twice a year and decided to apply for the December to March cohort. It was late to apply, but I wanted to participate. I chose to contribute to [Ceph][10] and built some data visualizations using JavaScript. The mentors were helpful and amiable. I wasn't able to get through the project but, to be honest, I didn't think I tried hard enough. So, I decided to participate in the next cohort and contribute to projects that piqued my interest. + +I started looking for projects as soon as they were announced on the Outreachy website. I found a Django project under the [Open Humans Foundation][11] and started contributing. I wasn't familiar with Django, but I learned it on the go. I enjoyed every bit of it! I learned about [GraphQL][12], [Django][13], and APIs in general. Three months after I started making contributions, the project announced its new interns. To my utter surprise, I got through. I was overjoyed! I learned many new things throughout my internship, and my mentor, Mike Escalante, was very supportive and helpful. I would like to extend my heartfelt gratitude to the Open Humans Foundation for extending this opportunity to me. I also attended [PyCon India][14] in Hyderabad the same year. I had never attended a conference before; it felt great to meet other passionate Pythonistas, and I could feel the power of community. + +At the end of 2018, when I was edging closer to the end of my engineering program, I started preparing for interviews. That was a roller-coaster ride. I wasn't able to get past the second technical round in most of them. + +In the meantime, I participated in the [Processing Foundation's fellowship program][15], where I worked with two other fellows, [Nancy Chauhan][16] and Shaharyar Shamshi, on promoting software literacy and making Processing's tools accessible to the Indian community. I applied as a mentor to open source programs, including [GirlScript Summer of Code][17] (GSSoC). Despite being a first-timer mentor, I found it really rewarding. + +I also delivered [a talk][18] on my Outreachy project at [DjangoCon Europe][19] in April 2019. It was my first talk and also my first time alone abroad! I got a chance to interact and connect with the larger Django community, and I'm still in touch with the Djangonaut friends I made there. In July 2019, I started a [PyLadies chapter in Bhubaneswar][20], India, which held its first meetup the same month. + +I went on job interviews relentlessly. I felt despondent and useless at times, but I realized I was getting better at them. I learned about internship openings at Red Hat in June 2019. I applied, and after several rounds, I got one! I started interning with Red Hat at the end of July and started working full time in January 2020. + +It's been a year since I joined Red Hat, and not a single day has gone by without me learning something. In the last year, I have mentored in various open source programs, including [Google Code-In][21], GSSoC, [Red Hat Open Source Contest][22], and [Mentors Without Borders][23]. I have also discovered that I love to attend and speak at conferences. So far, I have spoken at conferences including PyCon, DjangoCon, and [Git Commit Show][24] and local meetups including Rails Girls Sekondi, PyLadies Bangalore, and Women Techmakers Bhubaneswar. + +This journey from a confused teenager to a confident learner has been fulfilling in every possible way. To any student reading this, I advise: never stop learning. Even in these unprecedented times, the world is still your oyster. Participating in open source internships and other programs is not a prerequisite to becoming a successful programmer. Everyone is unique. Open source programs help boost your confidence, but they are not a must-have. And, if you do participate, even if you don't complete anything, don't worry. Believe in yourself, and keep looking for new opportunities to learn. Keep feeding your curiosity—and don't forget to pat yourself on your back for your efforts. The tassel is going to be worth the hassle. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/open-source-learning + +作者:[Manaswini Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/manaswinidas +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_women_computing_2.png?itok=JPlR5aCA (Woman sitting in front of her computer) +[2]: https://zairza.in/ +[3]: https://www.mediawiki.org/wiki/API:Main_page +[4]: https://railsgirlssummerofcode.org/ +[5]: https://github.com/Anisha1234 +[6]: https://hospitalrun.io/ +[7]: https://hacktoberfest.digitalocean.com/ +[8]: https://summerofcode.withgoogle.com/ +[9]: http://outreachy.org/ +[10]: https://ceph.io/ +[11]: http://openhumansfoundation.org/ +[12]: https://graphql.org/ +[13]: https://www.djangoproject.com/ +[14]: https://in.pycon.org/2018/ +[15]: https://medium.com/processing-foundation/meet-our-2019-fellows-9f13d4e4a68a +[16]: https://nancychauhan.in/ +[17]: https://www.gssoc.tech/ +[18]: https://www.youtube.com/watch?v=IJ3qMXBRUXo +[19]: https://2019.djangocon.eu/ +[20]: https://twitter.com/pyladiesbbsr +[21]: https://codein.withgoogle.com/archive/ +[22]: https://research.redhat.com/red-hat-open-source-contest/ +[23]: https://www.mentorswithoutborders.net/ +[24]: https://gitcommit.show/ diff --git a/sources/tech/20200729 How to Install Discord Application in Ubuntu and Other Linux Distributions -3 Methods.md b/sources/tech/20200729 How to Install Discord Application in Ubuntu and Other Linux Distributions -3 Methods.md new file mode 100644 index 0000000000..5f02972a4e --- /dev/null +++ b/sources/tech/20200729 How to Install Discord Application in Ubuntu and Other Linux Distributions -3 Methods.md @@ -0,0 +1,207 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to Install Discord Application in Ubuntu and Other Linux Distributions [3 Methods]) +[#]: via: (https://itsfoss.com/install-discord-linux/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +How to Install Discord Application in Ubuntu and Other Linux Distributions [3 Methods] +====== + +[Discord][1] is a popular messaging application. It was originally intended for gamers but these days, it is considered a [Slack alternative][2] even for team and community communication. You can use it for text, voice and video messaging. + +Several open source project use it for communicating with project members and users. + +Discord is available on various platforms including desktop Linux. In this tutorial, I’ll show you various ways of installing Discord on Ubuntu, Debian and other Linux distributions. + + * [Installing Discord via DEB file][3] (applicable to Debian, Ubuntu, Linux Mint and other Debian/Ubuntu based distributions) + * [Installing Discord via Snap or Flatpak][4] (applicable for distributions with Snap or Flatpak support) + * [Installing Discord in traditional way][5] (applicable for all distributions but need good knowledge of Linux commands) + + + +Non-FOSS alert! + +Discord application is not open source. But since they provide a Linux client and many Linux users rely on it, it’s been covered here. + +### Method 1: Installing Discord in Ubuntu and Debian-based Linux Distributions + +Go to the [download page of Discord][6] and download the deb file. Keep in mind that, Discord is only available for 64-bit systems. + +![Download Discord for Linux][7] + +[Installing deb file is easy][8]. Just double click on it to open it in the software manager and install it from there. You may also install and [use Gdebi tool][9] for this purpose. + +It will take a few seconds for installing and you should see a log in screen like this: + +![][10] + +The problem with this approach is that though you’ll have the latest Discord version, it won’t be updated to a newer version automatically in the future. + +You can either uninstall it from the software center or use this command in the terminal: + +``` +sudo apt remove discord +``` + +### Method 2: Installing Discord on Ubuntu and other Linux distributions using Snap package + +You can easily install Discord using Snap package in Ubuntu and various other Linux distributions with snap package support. + +The advantage is that you’ll always have the latest version of Discord and your installed version gets automatically updated. The downside is that Snap packages take longer to start. + +Ubuntu user can find [Discord snap package][11] in the Software Center and install from there: + +![Discord snap package is available in Ubuntu Software Center][12] + +If you have enabled Snap support on your Linux distribution, you can use the following command to install it: + +``` +sudo snap install discord +``` + +If you want to remove it, you can use the snap command to uninstall it: + +``` +sudo snap remove discord +``` + +Please note that [Discord is also available in Flatpak package format][13]. You can [use Flatpak][14] to install it in Fedora and other Linux distributions. + +### Method 3: Installing Discord in other Linux Distributions (intermediate to advanced level) + +Discord also provides a generic isntaller for using Discord on Linux. It comes in the traditional tar gz file. + +If you go for this way of installing Discord on Linux, then you should have at least a moderate [understanding of Linux directory structure][15] and Linux commands. You must also be comfortable using the terminal because this method involves using the terminal all the way. + +#### Step 1: Download Discord for Linux + +First [download the tar.gz file from Discord’s website][6]. + +I am using Discord version 0.0.10 in the tutorial. Your file name may or may not be different. Pay attention to it. + +#### Step 2: Extract the downloaded file to opt directory + +Go to directory where you have downloaded the file. Use the tar command to extract the .tar.gz file in the /opt directory. + +``` +sudo tar -xvzf discord-0.0.10.tar.gz -C /opt +``` + +Traditionally, the /opt directory is used for installing/keeping files of optional or additional Linux software. Since you opted for the traditional way, it only makes sense to use the traditional convention. + +#### Step 3: Create Discord command in bin directory + +Now you should have /opt/Discord directory with files related to Discord. You should have two important files to tackle here. A binary file named Discord and a desktop file named discord.desktop. + +Now, you should [create a symbolic link][16] to this binary file in /usr/bin directory. + +``` +sudo ln -sf /opt/Discord/Discord /usr/bin/Discord +``` + +The /usr/bin directory contains the binary executables for commands in your system. This way, any user can run the commands from anywhere in the system. + +#### Step 4: Create desktop icon and menu entry + +You have Discord available as a command for all users on the system. But you cannot find it in the system menu to launch it graphically. + +For that, you’ll have to use the discord.desktop file located in the extracted folder in the opt directory. + +You should pay attention to two lines here: Exec and Icon. + +The exec is for executable file and you can set it to /usr/bin/Discord . The Icon is for the image of Discord that will be displayed when you search for Discord in the menu. You can set it to the /opt/Discord/discord.png. This image is present in the extracted folder. + +You can [use nano editor][17] with sudo for editing this file or whichever [terminal-based text editor][18] you prefer. Your discord.desktop may look something like this: + +![][19] + +Your discord.desktop file is still in the /opt/Discord directory. You need to move it to /usr/share/applications directory so that your system can access this desktop entry. + +``` +sudo cp -r /opt/Discord/discord.desktop /usr/share/applications +``` + +Normally, you should see Discord added in the list of available applications in the menu immediately. If not, log out and log in again. + +#### Step 5: Run Discord + +You are done. Now if you search for Discord, you will find it in the menu and when you run it for the first time, it will do some configuration. + +![Running Discord for the first time][20] + +After that, it will bring you to the login screen. It automatically tried to log you in from your default browser. + +![][10] + +Enjoy Discord on Linux. If there is a new version of Discord in the future, you’ll have to remove the already installed version and then repeat the procedure with the new version. + +#### Removing Discord installed in the traditional way + +It would be unfair to just discuss how to install Discord. Let me give you some pointers about removing it as well. + +When you install Discord on Linux, it saves config file in .config/discord folder in your home directory. Delete these files: + +``` +rm -r ~/.config/discord +``` + +Next, remove the Discord directory from the /opt directory: + +``` +sudo rm -rf /usr/bin/Discord +``` + +Also delete the symbolic link you had created: + +``` +sudo rm /usr/bin/Discord +``` + +As the last step, remove the desktop file: + +``` +sudo rm /usr/share/applications/discord.desktop +``` + +**Did you manage to install Discord on Linux? Which method did you use?** + +I gave you various ways of installing Discord application on Linux. The traditional Linux way is somewhat complicated but at least this way you can install it on any Linux distribution. + +Did you manage to install it? Which method did you use and prefer? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-discord-linux/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://discord.com/ +[2]: https://itsfoss.com/open-source-slack-alternative/ +[3]: tmp.ehA52f5sBZ#via-deb +[4]: tmp.ehA52f5sBZ#via-snap +[5]: tmp.ehA52f5sBZ#traditional-method +[6]: https://discord.com/new/download +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/download-discord-linux.png?ssl=1 +[8]: https://itsfoss.com/install-deb-files-ubuntu/ +[9]: https://itsfoss.com/gdebi-default-ubuntu-software-center/ +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/discord-login-screen.jpg?ssl=1 +[11]: https://snapcraft.io/discord +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/install-discord-snap.jpg?ssl=1 +[13]: https://flathub.org/apps/details/com.discordapp.Discord +[14]: https://itsfoss.com/flatpak-guide/ +[15]: https://linuxhandbook.com/linux-directory-structure/ +[16]: https://linuxhandbook.com/symbolic-link-linux/ +[17]: https://itsfoss.com/nano-editor-guide/ +[18]: https://itsfoss.com/command-line-text-editors-linux/ +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/installing-discord-in-linux-traditional-way.png?ssl=1 +[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/discord-install.jpg?ssl=1 diff --git a/sources/tech/20200730 Monitor systemd journals via email.md b/sources/tech/20200730 Monitor systemd journals via email.md new file mode 100644 index 0000000000..ec60a5368b --- /dev/null +++ b/sources/tech/20200730 Monitor systemd journals via email.md @@ -0,0 +1,284 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Monitor systemd journals via email) +[#]: via: (https://opensource.com/article/20/7/systemd-journals-email) +[#]: author: (Kevin P. Fleming https://opensource.com/users/kpfleming) + +Monitor systemd journals via email +====== +Get a daily email with noteworthy output from your systemd journals with +journal-brief. +![Note taking hand writing][1] + +Modern Linux systems often use systemd as their init system and manager for jobs and many other functions. Services managed by systemd generally send their output (of all forms: warnings, errors, informational messages, and more) to the systemd journal, not to traditional logging systems like syslog. + +In addition to services, Linux systems often have many scheduled jobs (traditionally called cron jobs, even if the system doesn't use `cron` to run them), and these jobs may either send their output to the logging system or allow the job scheduler to capture the output and deliver it via email. + +When managing multiple systems, you can install and configure a centralized log-capture system to monitor their behavior, but the complexity of centralized systems can make them hard to manage. + +A simpler solution is to have each system directly send "interesting" output to the administrator(s) by email. For systems using systemd, this can be done using Tim Waugh's [journal-brief][2] tool. This tool _almost_ served my needs when I discovered it recently, so, in typical open source fashion, I contributed various patches to add email support to the project. Tim worked with me to get them merged, and now I can use the tool to monitor the 20-plus systems I manage as simply as possible. + +Now, early each morning, I receive between 20 and 23 email messages: most of them contain a filtered view of each machine's entire systemd journal (with warnings or more serious messages), but a few are logs generated by scheduled ZFS snapshot-replication jobs that I use for backups. In this article, I'll show you how to set up similar messages. + +### Install journal-brief + +Although journal-brief is available in many Linux package repositories, the packaged versions will not include email support because that was just added recently. That means you'll need to install it from PyPI; I'll show you how to manually install it into a Python virtual environment to avoid interfering with other parts of the installed system. If you have a favorite tool for doing this, feel free to use it. + +Choose a location for the virtual environment; in this article, I'll use `/opt/journal-brief` for simplicity. + +Nearly all the commands in this tutorial must be executed with root permissions or the equivalent (noted by the `#` prompt). However, it is possible to install the software in a user-owned directory, grant that user permission to read from the journal, and install the necessary units as systemd `user` units, but that is not covered in this article. + +Execute the following to create the virtual environment and install journal-brief and its dependencies: + + +``` +$ python3 -m venv /opt/journal-brief +$ source /opt/journal-brief/bin/activate +$ pip install ‘journal-brief>=1.1.7’ +$ deactivate +``` + +In order, these commands will: + + 1. Create `/opt/journal-brief` and set up a Python 3.x virtual environment there + 2. Activate the virtual environment so that subsequent Python commands will use it + 3. Install journal-brief; note that the single-quotes are necessary to keep the shell from interpreting the `>` character as a redirection + 4. Deactivate the virtual environment, returning the shell back to the original Python installation + + + +Also, create some directories to store journal-brief configuration and state files with: + + +``` +$ mkdir /etc/journal-brief +$ mkdir /var/lib/journal-brief +``` + +### Configure email requirements + +While configuring email clients and servers is outside the scope of this article, for journal-brief to deliver email, you will need to have one of the two supported mechanisms configured and operational. + +#### Option 1: The `mail` command + +Many systems have a `mail` command that can be used to send (and read) email. If such a command is installed on your system, you can verify that it is configured properly by executing a command like: + + +``` +`$ echo "Message body" | mail --subject="Test message" {your email address here}` +``` + +If the message arrives in your mailbox, you're ready to proceed using this type of mail delivery in journal-brief. If not, you can either troubleshoot and correct the configuration or use SMTP delivery. + +To control the generated email messages' attributes (e.g., From address, To address, Subject) with the `mail` command method, you must use the command-line options in your system's mailer program: journal-brief will only construct a message's body and pipe it to the mailer. + +#### Option 2: SMTP delivery + +If you have an SMTP server available that can accept email and forward it to your mailbox, journal-brief can communicate directly with it. In addition to plain SMTP, journal-brief supports Transport Layer Security (TLS) connections and authentication, which means it can be used with many hosted email services (like Fastmail, Gmail, Pobox, and others). You will need to obtain a few pieces of information to configure this delivery mode: + + * SMTP server hostname + * Port number to be used for message submission (it defaults to port 25, but port 587 is commonly used) + * TLS support (optional or required) + * Authentication information (username and password/token, if required) + + + +When using this delivery mode, journal-brief will construct the entire message before submitting it to the SMTP server, so the From address, To address, and Subject will be supplied in journal-brief's configuration. + +### Set up configuration and cursor files + +Journal-brief uses YAML-formatted configuration files; it uses one file per desired combination of filtering parameters, delivery options, and output formats. For this article, these files are stored in `/etc/journal-brief`, but you can store them in any location you like. + +In addition to the configuration files, journal-brief creates and manages **cursor** files, which allow it to keep track of the last message in its output. Using one cursor file for each configuration file ensures that no journal messages will be lost, in contrast to a time-based log-delivery system, which might miss messages if a scheduled delivery job can't run to completion. For this article, the cursor files will be stored in `/var/lib/journal-brief` (you can store the cursor files in any location you like, but make sure not to store them in any type of temporary filesystem, or they'll be lost). + +Finally, journal-brief has extensive filtering and formatting capabilities; I'll describe only the most basic options, and you can learn more about its capabilities in the documentation for journal-brief and [systemd.journal-fields][3]. + +### Configure a daily email with interesting journal entries + +This example will set up a daily email to a system administrator named Robin at `robin@domain.invalid` from a server named `storage`. Robin's mail provider offers SMTP message submission through port 587 on a server named `mail.server.invalid` but does not require authentication or TLS. The email will be sent from `storage-server@domain.invalid`, so Robin can easily filter the incoming messages or generate alerts from them. + +Robin has the good fortune to live in Fiji, where the workday starts rather late (around 10:00am), so there's plenty of time every morning to read emails of interesting journal entries. This example will gather the entries and deliver them at 8:30am in the local time zone (Pacific/Fiji). + +#### Step 1: Configure journal-brief + +Create a text file at `/etc/journal-brief/daily-journal-email.yml` with these contents: + + +``` +cursor-file: '/var/lib/journal-brief/daily-journal-email' +output: + - 'short' +  - ‘systemd’ +inclusions: +  - PRIORITY: 'warning' +email: +  suppress_empty: false +  smtp: +    to: '”Robin” <[robin@domain.invalid][4]>' +    from: '"Storage Server" <[storage-server@domain.invalid][5]>' +    subject: 'daily journal' +    host: 'mail.server.invalid' +    port: 587 +``` + +This configuration causes journal-brief to: + + * Store the cursor at the path configured as `cursor-file` + * Format journal entries using the `short` format (one line per entry) and provide a list of any systemd units that are in the `failed` state + * Include journal entries from _any_ service unit (even the Linux kernel) with a priority of `warning`, `error`, or `emergency` + * Send an email even if there are no matching journal entries, so Robin can be sure that the storage server is still operating and has connectivity + * Send the email using SMTP + + + +You can test this configuration file by executing a journal-brief command: + + +``` +`$ journal-brief --conf /etc/journal-brief/daily-journal-email` +``` + +Journal-brief will scan the systemd journal for all new messages (yes, _all_ of the messages it has never seen before), identify any that match the priority filter, and format them into an email that it sends to Robin. If the storage server has been operational for months (or years) and the systemd journal has never been purged, this could produce a very large email message. In addition to Robin not appreciating such a large message, Robin's email provider may not be willing to accept it, so you can generate a shorter message by executing this command: + + +``` +`$ journal-brief -b --conf /etc/journal-brief/daily-journal-email` +``` + +Adding the `-b` argument tells journal-brief to inspect only the systemd journal entries from the most recent system boot and ignore any that are older. + +After journal-brief sends the email to the SMTP server, it writes a string into the cursor file so that the next time it runs using the same cursor file, it will know where to start in the journal. If the process fails for any reason (e.g., journal entry gathering, entry formatting, or SMTP delivery), the cursor file will _not_ be updated, which means the next time it uses the cursor file, the entries that would have been in the failed email will be included in the next email instead. + +#### Step 2: Set up the systemd service unit + +Create a text file at `/etc/systemd/system/daily-journal-email.service` with: + + +``` +[Unit] +Description=Send daily journal report + +[Service] +ExecStart=/opt/journal-brief/bin/journal-brief --conf /etc/journal-brief/%N.yml +Type=oneshot +``` + +This service unit will run journal-brief and specify a configuration file with the same name as the unit file with the suffix removed, which is what `%N` supplies. Since this service will be started by a timer (see step 3), there is no need to enable or manually start it. + +#### Step 3: Set up the systemd timer unit + +Create a text file at `/etc/systemd/system/daily-journal-email.timer` with: + + +``` +[Unit] +Description=Trigger daily journal email report + +[Timer] +OnCalendar=*-*-* 08:30:00 Pacific/Fiji + +[Install] +WantedBy=multi-user.target +``` + +This timer will start the `daily-journal-email` service unit (because its name matches the timer name) every day at 8:30am in the Pacific/Fiji time zone. If the time zone was not specified, the timer would trigger the service at 8:30am in the system time zone configured on the `storage` server. + +To make this timer start every time the system boots, it is `WantedBy` by the multi-user target. To enable and start the timer: + + +``` +$ systemctl enable daily-journal-email.timer +$ systemctl start daily-journal-email.timer +$ systemctl list-timers daily-journal-email.timer +``` + +The last command will display the timer's status, and the `NEXT` column will indicate the next time the timer will start the service. + +To learn more about systemd timers and building schedules for them, read [_Use systemd timers instead of cronjobs_][6]. + +Now the configuration is complete, and Robin will receive a daily email of interesting journal entries. + +### Monitor the output of a specific service + +The `storage` server has some filesystems on solid-state storage devices (SSD) and runs Fedora Linux. Fedora has an `fstrim` service that is scheduled to run once per week (using a systemd timer, as in the example above). Robin would like to see the output generated by this service, even if it doesn't generate any warnings or errors. While this output will be included in the daily journal email, it will be intermingled with other journal entries, and Robin would prefer to have the output in its own email message. + +#### Step 1: Configure journal-brief + +Create a text file at `/etc/journal-brief/fstrim.yml` with: + + +``` +cursor-file: '/var/lib/journal-brief/fstrim' +output: 'short' +inclusions: +  - _SYSTEMD_UNIT: +   - ‘fstrim.service’ +email: +  suppress_empty: false +  smtp: +    to: '”Robin” <[robin@domain.invalid][4]>' +    from: '"Storage Server" <[storage-server@domain.invalid][5]>' +    subject: 'weekly fstrim' +    host: 'mail.server.invalid' +    port: 587 +``` + +This configuration is similar to the previous example, except that it will include _all_ entries related to a systemd unit named `fstrim.service`, regardless of their priority levels, and will include _only_ entries related to that service. + +### Step 2: Modify the systemd service unit + +Unlike in the previous example, you don't need to create a systemd service unit or timer, since they already exist. Instead, you want to add behavior to the existing service unit by using the systemd "drop-in file" mechanism (to avoid modifying the system-provided unit file). + +First, ensure that the `EDITOR` environment variable is set to your preferred text editor (otherwise you'll get the default editor on your system), and execute: + + +``` +`$ systemctl edit fstrim.service` +``` + +Note that this does not edit the existing service unit file; instead, it opens an editor session to create a drop-in file (located at `/etc/systemd/system/fstrim.service.d/override.conf`). + +Paste these contents into the editor and save the file: + + +``` +[Service] +ExecStopPost=/opt/journal-brief/bin/journal-brief --conf /etc/journal-brief/%N.yml +``` + +After you exit the editor, the systemd configuration will reload automatically (which is one benefit of using `systemctl edit` instead of creating the file directly). Like in the previous example, this drop-in uses `%N` to avoid duplicating the service name; this means that the drop-in contents can be applied to any service on the system, as long as the appropriate configuration file is created in `/etc/journal-brief`. + +Using `ExecStopPost` will make journal-brief run after any attempt to run the `fstrim.service`, whether or not it's successful. This is quite useful, as the email will be generated even if the `fstrim.service` cannot be started (for example, if the `fstrim` command is missing or not executable). + +Please note that this technique is primarily applicable to systemd services that run to completion before exiting (in other words, not background or daemon processes). If the `Type` in the `Service` section of the service's unit file is `forking`, then journal-brief will not execute until the specified service has stopped (either manually or by a system target change, like shutdown). + +The configuration is complete; Robin will receive an email after every attempt to start the `fstrim` service; if the attempt is successful, then the email will include the output generated by the service. + +### Monitor without extra effort + +With this setup, you can monitor the health of your Linux systems that use systemd without needing to set up any centralized monitoring or logging tools. I find this monitoring method quite effective, as it draws my attention to unusual events on the servers I maintain without requiring any additional effort. + +Special thanks to Tim Waugh for creating the journal-brief tool and being willing to accept a rather large patch to add direct email support rather than running journal-brief through cron. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/systemd-journals-email + +作者:[Kevin P. Fleming][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/kpfleming +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/note-taking.jpeg?itok=fiF5EBEb (Note taking hand writing) +[2]: https://github.com/twaugh/journal-brief +[3]: https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html +[4]: mailto:robin@domain.invalid +[5]: mailto:storage-server@domain.invalid +[6]: https://opensource.com/article/20/7/systemd-timers diff --git a/sources/tech/20200731 Bring your Mycroft AI voice assistant skill to life with Python.md b/sources/tech/20200731 Bring your Mycroft AI voice assistant skill to life with Python.md new file mode 100644 index 0000000000..cf69759db8 --- /dev/null +++ b/sources/tech/20200731 Bring your Mycroft AI voice assistant skill to life with Python.md @@ -0,0 +1,273 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Bring your Mycroft AI voice assistant skill to life with Python) +[#]: via: (https://opensource.com/article/20/7/mycroft-voice-skill) +[#]: author: (Steve Ovens https://opensource.com/users/stratusss) + +Bring your Mycroft AI voice assistant skill to life with Python +====== +Put the final polishes on your Mycroft skill by managing dependencies, +debugging, collecting user-specific data, and getting everything into +your Python code. +![Hands on a keyboard with a Python book ][1] + +In the first two articles of this series on [Mycroft][2], an open source, privacy-focused digital voice assistant, I covered the [background behind voice assistants][3] and some of Mycroft's [core tenets][4]. In Part 3, I started [outlining the Python code][5] required to provide some basic functionality to a skill that adds items to [OurGroceries][6], a grocery list app. And in Part 4, I talked about the different types of [intent parsers][7] (and when to use each) and expanded the Python code so Mycroft could provide audible feedback while working through the skill. + +In this fifth article, I will walk through the remaining sections required to build this skill. I'll talk about project dependencies, logging output for debugging purposes, working with the Mycroft web UI for setting values (such as usernames and passwords), and how to get this information into your Python code. + +### Dealing with project dependencies + +There are generally three sources for project dependencies when writing a Mycroft skill: + + * Python packages from [PyPI][8] + * System-level packages pulled from a repository + * Other Mycroft skills + + + +There are a couple of ways to deal with dependencies in Mycroft. You can use "requirements" files, or you can use the `manifest.yml` file. + +Since most of the skills in the Mycroft store use requirement files, I will merely touch on the `manifest.yml` file. The `manifest.yml` file is pretty straightforward. There is a `dependencies:` section, and under this are three options: `python:`, `system:`, and `skill:`. Under each heading, you should specify the names of required dependencies. An example file could look like this: + + +``` +dependencies: +  # Pip dependencies on PyPI +   python: +    - requests +     - gensim + +   system: +    # For simple packages, this is all that is necessary +     all: pianobar piano-dev + +   # Require the installation of other skills before installing this skill +   skill: +    - my-other-skill +``` + +However, since the majority of skills use requirement files, I'll use that option for this project, so you can use it as an example for other skills you may wish to use or create. + +In Python, the `requirements.txt` file, which lists all the Python dependencies a project requires, is very common. This file is pretty simple; it can either be a list of packages or a list with specific versions. I will specify a minimal version with some code I submitted to the `ourgroceries` project. There are three options for this project's `requirements.txt`: + + * `ourgroceries==1.3.5`: Specifies that the package must be version 1.3.5 + * `ourgroceries>=1.3.5`: Specifies that the package must be version 1.3.5 or higher + * `ourgroceries`: Allows any version of the package + + + +My `requirements.txt` uses `ourgroceries>=1.3.5` to allow for future updates. Following this same logic, your `requirements.txt` could list different packages instead of specifying a single package. + +The entirety of my `requirements.txt` file is one line: + + +``` +`ourgroceries>=1.3.5` +``` + +You can also opt to use `requirements.sh`. This is a shell script that can be used to install packages, download modules from Git, or do any number of things. This file executes while installing a new skill. The [Zork skill][9] has an example of a `requirements.sh` script. However, while you can use this, if you want to submit your skill to the store, the `requirements.sh` will be scrutinized fairly heavily to mitigate security issues. + +### Debug your skill + +There are a couple of ways to debug your skill. You can use the Mycroft logger, or you can use standard Python debugging tools. Both methods are available in the Mycroft command-line interface (CLI), which is very handy for debugging. + +#### Use Mycroft logger + +To get started with the Mycroft logger, you just need to have the `MycroftSkill` imported because logger is part of the base class. This means that as long as you are working inside the class for your skill, logger is available. For example, the following code demonstrates how to create a very basic skill with a log entry: + + +``` +from mycroft import MycroftSkill + +class MyFakeSkill(MycroftSkill): +                def __init__(self): +                self.log.info("Skill starting up") + +def create_skill(): +                return MyFakeSkill() +``` + +Logger has all the log levels you might expect: + + * **debug:** Provides the highest level of detail but is _not_ logged by default + * **info:** Provides general information when a skill is running as expected; it is always logged + * **warning:** Indicates something is wrong, but it is not fatal + * **error:** Fatal problems; they are displayed in red in the CLI + * **exception:** Similar to errors except they include stack traces + + + +Along with showing in the CLI, logger writes to `skills.log`. The file's location varies depending on how you installed Mycroft. Common locations are `/var/log/mycroft/skills.log`, `~/snap/mycroft/common/logs/skills.log`, and `/var/opt/mycroft/skills.log`. + +There may be times when you want to use the Mycroft logger outside the instantiated class. For example, if you have some global functions defined outside the class, you can import `LOG` specifically: + + +``` +from mycroft import MycroftSkill +from mycroft.util import LOG + +def my_global_funct(): +                LOG.info("This is being logged outside the class") + +class MyFakeSkill(MycroftSkill): +                def __init__(self): +                self.log.info("Skill starting up") + +def create_skill(): +                return MyFakeSkill() +``` + +#### Use Python's debugging tools + +If you want something that stands out more, you can use the built-in Python `print()` statements to debug. I have found that there are occasions where the Mycroft logger is slow to produce output. Other times, I just want something that jumps out at me visually. In either case, I prefer using `print()` statements when I am debugging outside an IDE. + +Take the following code, for example: + + +``` +if category_name is None: +    self.log.info("---------------> Adding %s to %s" % (item_to_add, list_name)) +    print("-------------> Adding %s to %s" % (item_to_add, list_name)) +``` + +This produces the following output in the `mycroft-cli-client`: + + +``` +~~~~ings:104 | Skill settings successfully saved to /opt/mycroft/skills/fallback-wolfram-alpha.mycroftai/settings.json +~~~~1 | mycroft.skills.mycroft_skill.mycroft_skill:handle_settings_change:272 | Updating settings for skill AlarmSkill +~~~~save_settings:104 | Skill settings successfully saved to /opt/mycroft/skills/mycroft-alarm.mycroftai/settings.json + 10:50:38.528 | INFO     | 51831 | ConfigurationSkill | Remote configuration updated + 10:50:43.862 | INFO     | 51831 | OurGroceriesSkill | ---------------> Adding hot dogs to my shopping +\---------------> Adding hot dogs to my shopping +~~~~7.654 | INFO     | 51831 | mycroft.skills.skill_loader:reload:108 | ATTEMPTING TO RELOAD SKILL: ourgroceries-skill +~~~~831 | mycroft.skills.skill_loader:_execute_instance_shutdown:146 | Skill ourgroceries-skill shut down successfully +``` + +I find that, as the text scrolls, it is much easier to visually identify a print statement that does not have the uniform header of the other messages. This is a personal preference and not meant as any sort of recommendation for programming best practices. + +### Get input from users + +Now that you know how to see output from your skill, it's time to get some environment-specific information from your users. In many cases, your skill will need some user information to function properly. Most of the time, this is a username and password. Often, this information is required for the skill to initialize properly. + +#### Get user input with internet-connected Mycroft + +If your Mycroft device has a connection to the internet, you can use Mycroft's web UI to enter user information. Log into and navigate to the [skills][10] section. Once you have configured your skill correctly, you will see something like this: + +![Mycroft Web UI][11] + +Here, you can discover which devices have your skill installed. In my case, there are two devices: `Arch Pi4` and `Asus`. There are also input text boxes to get information from the user. + +This interface is created automatically if you have configured Mycroft's Settings file. You have two choices for file types: you can create a `settingsmeta.yaml` or a `settingsmeta.json`. I prefer the YAML syntax, so that is what I used for this project. Here is my `settingsmeta.yaml` for this skill: + + +``` +skillMetadata: +  sections: +  - name: OurGroceries Account +    fields: +    - type: label +      label: "Provide your OurGroceries username/password and then Connect with the button below." +    - name: user_name +      type: text +      label: username +      value: '' +    - name: password +      type: password +      label: Ourgroceries password +      value: '' +    - name: default_list +      type: text +      label: Default Shopping List +      value: '' +``` + +The structure of this file is pretty easy to understand. Each file must start with a `skillsMetadata` heading. Next, there is a `sections` heading. Every new section is denoted by `- name:`, which is YAML syntax for an item on a list. Above, there is only a single section called `OurGroceries Account`, but you can have as many sections as you want. + +Fields are used to both convey and store information. A field can be as simple as a label, which can provide an instruction to the user. More interesting for this skill, however, are the `text` and `password` fields. Text fields allow the user to view what they are typing and are displayed in plain text. This is suitable for non-sensitive information. Password fields are not specific to passwords but are intended to hide sensitive information. After the users enter their information and click the `save` button, Mycroft replaces the `settings.json` file created the first time the skill initializes. The new file contains the values the user input in the web UI. The skill will also use this file to look up credentials and other information. If you are having problems using the correct values in your skill, take a look at the `settings.json` file for proper naming of variables and whether or not values are being stored in the JSON file. + +#### Get user input with offline Mycroft + +As you may have surmised, without internet connectivity, it is more difficult to receive information from end users. There are only a few options. First, you could write your skill such that, on the first run, it prompts the user for the information your skill requires. You could then write this out to `settings.json` if you wish to use the built-in settings parser, or you could write this to a file of your choice and your skill could handle the parsing. Be aware that if you write to `settings.json`, there is a chance that this file could be overwritten if Mycroft re-initializes your skill. + +Another method is having static values in a `settings.json` or another file that is stored with the project. This has some obvious security implications, but if your repository is secure, this is a viable option. + +The third and final option is to enable the user to edit the file directly. This could be done through Network File System (NFS) or [Samba][12] file sharing protocols, or you could simply grant the appropriate permissions to a secure shell (SSH) user who could use any Unix editor to make changes. + +Since this project requires access to the internet, I will not explore these options. If you have questions, you can always engage the community on [Mattermost][13]. + +### Access settings from your skill + +Provided that the other parts in the chain are working (i.e., the users updated their settings via the web UI, and Mycroft updated `settings.json` based on those settings), using user-provided settings is easy to understand. + +As I mentioned in the [third article][5] (where I discussed the `__init__` and `initialize` methods), it is impossible to retrieve values from `settings.json` with the `__init__(self)` method. Therefore, you must use another method to handle the settings. In my case, I created an appropriately named `_create_initial_grocery_connection` method: + + +``` +def _create_initial_grocery_connection(self): +    """ +    This gets the username/password from the config file and gets the session cookie +    for any interactions +    :return: None +    """ +    self.username = self.settings.get('user_name') +    self.password = self.settings.get('password') +    self.ourgroceries_object = OurGroceries(self.username, self.password) +    asyncio.run(self.ourgroceries_object.login()) +``` + +As you can see, you can extract information from `settings.json` by using `self.settings.get()`. The only thing to note is that the value you pass in _must_ match the name in `settingsmeta.yaml`. In this case, because I am not using the username or password outside this method, I could have opted to not make these variables part of the class scope (i.e., I could have called them `password` instead of `self.password`). This is because I am setting the `ourgroceries_object` to the class scope, and it contains all the information required for the rest of the skill to function. + +### Wrapping up + +Voice assistants are expanding into a multi-million (if not -billion) dollar business and some analysts think a majority of homes in the next few years will have one (or more). With Apple, Google, Facebook, and others frequently in the news for privacy violations, not to mention the constant stream of data breaches reported, it is important to have an open source, privacy-focused alternative to the big players. Mycroft puts your privacy first, and its small but dedicated team of contributors is making inroads into the most common scenarios for voice assistants. + +This series dove into the nitty-gritty of skill development, talking about the importance of thinking things through before you start and having a good outline. Knowing where you are going in the big picture helps you organize your code. Breaking the tasks down into individual pieces is also a key part of your strategy. Sometimes, it's a good idea to write bits or significant chunks outside the Mycroft skill environment to ensure that your code will work as expected. This is not necessary but can be a great starting point for people who are new to skill development. + +The series also explored intent parsers and how to understand when to use each one. The [Padatious][14] and [Adapt][15] parsers each have strengths and weaknesses. + + * Padatious intents rely on phrases and entities within those phrases to understand what the user is attempting to accomplish, and they are often the default used for Mycroft skills. + * On the other hand, Adapt uses regular expressions to accomplish similar goals. When you need Mycroft to be context-aware, Adapt is the only way to go. It is also extremely good at parsing complex utterances. However, you need to take great care when using regular expressions, or you will end up with unexpected results. + + + +I also covered the basics of dealing with a project. It's an important step in complex skill development to ensure that a skill has all the proper dependencies to work. Ensuring maximum portability is paramount for a skill, and dependency resolution is a key part of that, as your skill may not work properly with unsatisfied dependencies. + +Finally, I explained how to get skill-specific settings from users, whether the device is internet-connected or not. Which method you choose really depends on your use case. + +While it was not my aim to provide an encyclopedia of Mycroft skill development, by working through this series, you should have a very solid foundation for developing most skills you want to create. I hope the concrete examples in this series will show you how to handle the majority of tasks you may want to accomplish during skill development. I didn't go line-by-line through the whole skill but the code is hosted on [GitLab][16] if you'd like to explore it further. Comments and questions are always welcome. I am very much still learning and growing as a fledgling Mycroft developer, so hit me up on [Twitter][17] or the [Mycroft Mattermost][18] instance, and let's learn together! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/7/mycroft-voice-skill + +作者:[Steve Ovens][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/stratusss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python-programming-code-keyboard.png?itok=fxiSpmnd (Hands on a keyboard with a Python book ) +[2]: https://mycroft.ai/ +[3]: https://opensource.com/article/20/6/open-source-voice-assistant +[4]: https://opensource.com/article/20/6/mycroft +[5]: https://opensource.com/article/20/6/mycroft-voice-assistant-skill +[6]: https://www.ourgroceries.com/overview +[7]: https://opensource.com/article/20/6/mycroft-intent-parsers +[8]: https://pypi.org/ +[9]: https://github.com/forslund/white-house-adventure/blob/6eba5df187bc8a7735b05e93a28a6390b8c6f40c/requirements.sh +[10]: https://home.mycroft.ai/skills +[11]: https://opensource.com/sites/default/files/mycroft_skills_webui.png (Mycroft Web UI) +[12]: https://www.samba.org/ +[13]: https://chat.mycroft.ai/community/channels/skills +[14]: https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/intents/padatious-intents +[15]: https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/intents/adapt-intents +[16]: https://gitlab.com/stratus-ss/mycroft-ourgroceries-skill +[17]: https://twitter.com/linuxovens +[18]: https://chat.mycroft.ai/community/channels/town-square diff --git a/sources/tech/20200731 Real-time noise suppression for video conferencing.md b/sources/tech/20200731 Real-time noise suppression for video conferencing.md new file mode 100644 index 0000000000..baffbd0e31 --- /dev/null +++ b/sources/tech/20200731 Real-time noise suppression for video conferencing.md @@ -0,0 +1,198 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Real-time noise suppression for video conferencing) +[#]: via: (https://fedoramagazine.org/real-time-noise-suppression-for-video-conferencing/) +[#]: author: (lkiesow https://fedoramagazine.org/author/lkiesow/) + +Real-time noise suppression for video conferencing +====== + +![][1] + +With people doing video conferencing all day, good audio has recently become much more important. The best option is obviously a proper audio studio. Unfortunately, this is not something you will always have and you might need to make do with a much simpler setup. + +In such situations, a noise reduction filter that keeps your voice but filters out ambient noises (street noise, keyboard, …) can be very helpful. In this article, we will take a look at how to integrate such a filter into PulseAudio so that it can easily be used in all applications with no additional requirements on their part. + +Example of switching on noise reduction + +### The Idea + +We set up [PulseAudio][2] for live noise-reduction using [an LADSPA filter][3]. + +This creates a new PulseAudio source which can be used as a virtual microphone. Other applications will not even realize that they are not dealing with physical devices and you can select it as if you had an additional microphone connected. + +### Terminology + +Before we start, it is good to know the following two PulseAudio terms to better understand what we are doing: + + * _source_ – represents a source from which audio can be obtained. Like a microphone + * _sink_ – represents a consumer of audio like a speaker + + + +Each PulseAudio sink also has a source called monitor which can be used to get the audio put into that sink. For example, you could have audio put out by your headphones while using the monitor of your headphone device to record the output. + +### Installation + +While PulseAudio is usually pre-installed, we need to get the LADSPA filter for noise reduction. You can [build and install the filter manually][3], but it is much easier to install the filter via Fedora Copr: + +``` +sudo dnf copr enable -y lkiesow/noise-suppression-for-voice +sudo dnf install -y ladspa-realtime-noise-suppression-plugin +``` + +Note that the Copr projects are not maintained and quality-controlled by Fedora directly. + +### Enable Noise Reduction Filter + +First, you need to identify the name of the device you want to apply the noise reduction to. In this example, we’ll use the RODE NT-USB microphone as input. + +``` +$ pactl list sources short +0 alsa_input.usb-RODE_Microphones_RODE_NT-USB-00.iec958-stereo … +1 alsa_output.usb-0c76_USB_Headphone_Set-00.analog-stereo.monitor … +``` + +Next, we create a new PulseAudio sink, the filter and a loopback between microphone and filter. That way, the output from the microphone is used as input for the noise reduction filter. The output from this filter will then be available via the null sink monitor. + +To visualize this, here is the path the audio will travel from the microphone to, for example, a browser: + +``` +mic → loopback → ladspa filter → null sink [monitor] → browser +``` + +While this sounds complicated, it is set up with just a few simple commands: + +``` +pacmd load-module module-null-sink \ + sink_name=mic_denoised_out +pacmd load-module module-ladspa-sink \ + sink_name=mic_raw_in \ + sink_master=mic_denoised_out \ + label=noise_suppressor_stereo \ + plugin=librnnoise_ladspa \ + control=50 +pacmd load-module module-loopback \ + source=alsa_input.usb-RODE_Microphones_RODE_NT-USB-00.iec958-stereo \ + sink=mic_raw_in \ + channels=2 +``` + +That’s it. You should now be able to select the new device. + +![New recording devices in pavucontrol][4] + +### Chromium + +Unfortunately, browsers based on Chromium will hide monitor devices by default. This means, that we cannot select the newly created noise-reduction device in the browser. One workaround is to select another device first, then use pavucontrol to assign the noise-reduction device afterward. + +But if you do this on a regular basis, you can work around the issue by using the _remap-source_ module to convert the null sink monitor to a regular PulseAudio source. The module is actually meant for remapping audio channels – e.g. swapping left and right channel on stereo audio – but we can just ignore these additional capabilities and create a new source similar to the monitor: + +``` +pacmd load-module module-remap-source \ + source_name=denoised \ + master=mic_denoised_out.monitor \ + channels=2 +``` + +The remapped device delivers audio identical to the original one so that assigning this with PulseAudio will yield no difference. But this device does now show up in Chromium: + +![Remapped monitor device in Chrome][5] + +### Improvements + +While the guide above should help you with all the basics and will get you a working setup, there are a few things you can improve. + +But while the commands above should generally work, you might need to experiment with the following suggestions. + +#### Latency + +By default, the loopback module will introduce a slight audio latency. You can hear this by running an echo test: + +``` +gst-launch-1.0 pulsesrc ! pulsesink +``` + +You might be able to reduce this latency by using the _latency_msec_ option when loading the _loopback_ module: + +``` +pacmd load-module module-loopback \ + latency_msec=1 \ + source=alsa_input.usb-RODE_Microphones_RODE_NT- USB-00.iec958-stereo \ + sink=mic_raw_in \ + channels=2 +``` + +#### Voice Threshold + +The noise reduction library provides controls for a voice threshold. The filter will return silence if the probability for sound being voice is lower than this threshold. In other words, the higher you set this value, the more aggressive the filter becomes. + +You can pass different thresholds to the filter by supplying them as control argument when the _ladspa-sink_ module is being loaded. + +``` +pacmd load-module module-ladspa-sink \ + sink_name=mic_raw_in \ + sink_master=mic_denoised_out \ + label=noise_suppressor_stereo \ + plugin=librnnoise_ladspa \ + control=95 +``` + +#### Mono vs Stereo + +The example above will work with stereo audio. When working with a simple microphone, you may want to use a mono signal instead. + +For switching to mono, use the following values instead when loading the different modules: + + * _label=noise_suppressor_mono_ – when loading the _ladspa-sink_ module + * _channels=1_ – when loading the _loopback_ and remap-source modules + + + +#### Persistence + +Using the _pacmd_ command for the setup, settings are not persistent and will disappear if PulseAudio is restarted. You can add these commands to your PulseAudio configuration file if you want them to be persistent. For that, edit _~/.config/pulse/default.pa_ and add your commands like this: + +``` +.include /etc/pulse/default.pa + +load-module module-null-sink sink_name=mic_denoised_out +load-module module-ladspa-sink … +… +``` + +### Limitations + +If you listen to the example above, you will notice that the filter reliably reduces background noise. But unfortunately, depending on the situation, it can also cause a loss in voice quality. + +The following example shows the results with some street noise. Activating the filter reliably removes the noise, but in this example, the voice quality noticeably drops as well: + +Noise reduction of constant street noise + +As a conclusion, we can say that this can help if you find yourself in less than ideal audio scenarios. It is also very effective if you are not the main speaker in a video conference and you do not want to constantly mute yourself. + +Still, good audio equipment and a quiet environment will always be better. + +Have fun. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/real-time-noise-suppression-for-video-conferencing/ + +作者:[lkiesow][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/lkiesow/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/07/noise-reduction-816x345.png +[2]: https://freedesktop.org/wiki/Software/PulseAudio/ +[3]: https://github.com/werman/noise-suppression-for-voice +[4]: https://fedoramagazine.org/wp-content/uploads/2020/07/pavucontrol-white-1024x379.png +[5]: https://fedoramagazine.org/wp-content/uploads/2020/07/chrome-1024x243.png diff --git a/sources/tech/20200804 An open source solution for continuous testing at scale.md b/sources/tech/20200804 An open source solution for continuous testing at scale.md new file mode 100644 index 0000000000..f3bd92215b --- /dev/null +++ b/sources/tech/20200804 An open source solution for continuous testing at scale.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (An open source solution for continuous testing at scale) +[#]: via: (https://opensource.com/article/20/8/cerberus-test-automation) +[#]: author: (Antoine Craske https://opensource.com/users/acraske) + +An open source solution for continuous testing at scale +====== +Cerberus focuses on testing usability, scalability, and integration. +![Coding on a computer][1] + +In Sogeti's most recent [World Quality Report][2], software testing ranked No. 1 in terms of its contributions to business objectives and growth, making it a key enabler for business digitalization. Despite this, the software testing industry still reports major pain points related to test maintenance, automation, tooling, and skills. Most of the tooling in common use lacks capabilities, is too complex to integrate, provides insufficient intelligence, or is too difficult to use. + +[Cerberus Testing][3] provides a solution to these problems. It is a test automation solution built by retail companies to support digitalization initiatives and focuses on usability, scalability, and integration of the test lifecycle process. + +![Cerberus supports test lifecycle to accelerate feedback loops][4] + +(Cerberus, [CC BY-SA 4.0][5]) + +### What is Cerberus? + +Our IT team at La Redoute, a French clothing fashion retailer, began writing the first lines of code of what would become Cerberus in 2010. Our objectives were to automate manual non-regression tests for existing web applications to accelerate and increase the quality of software delivery. We also wanted our in-house solution to enable iterations through test management, execution, and reporting in minutes, rather than weeks. + +Cerberus is based on a Selenium web driver and a three-tier traditional architecture with a Java technology stack. A key requirement for development was to limit code to support usability, reuse, and keeping tests simple. + +At the time we developed Cerberus, most solutions were commercial and designed to address specific silos such as test repositories, execution, or analytics. Cerberus combines the three test silos and enables web, API, and database testing. This is why we chose the name Cerberus, after the [three-headed dog that guards Hades][6] in Greek mythology. + +### Releasing Cerberus as open source + +The first version automated functional testing for an internal customer-relationship management (CRM) solution, and once it was shown to successfully detect dangerous release defects, we considered it to be a product. + +Next, we began using Cerberus to test La Redoute's e-commerce platform. As we shared our experience with the industry, we learned our peers were still struggling with test automation. So, in 2013, knowing the value of open source software for product innovation and development, we released Cerberus on [SourceForge][7] and [GitHub][8] under a GNU General Public License to encourage our community to share code and ideas. As with all open source projects, we make a continuous effort to ensure code quality, documentation, and transparency. + +![Cerberus GitHub repository][9] + +(Antoine Craske, [CC BY-SA 4.0][5]) + +During this period, [digital transformation][10] was escalating, making it essential for Cerberus to enable full regression test automation and monitoring. We focused on improving flexibility in test management, execution scalability, and traceability to meet those objectives. Adding end-to-end tests alongside functional tests was key. It enabled us to accelerate the software delivery cycle by more than 10x in certain cases. We published a [case study][11] about our 96% success in daily deployments and more than 6,000 automated tests in a year. + +### Growing interest + +Other French retailers, including Decathlon, Norauto, Leroy Merlin, and Midas, became interested in Cerberus. The emerging community of testers then shared it with other organizations that used the solution to accelerate their digital transformation, primarily for e-commerce and backoffice transformations. + +![Cerberus integrations][12] + +(Cerberus, [CC BY-SA 4.0][5]) + +We added standard integrations to Cerberus to increase its usability. A [Jenkins][13] plugin was a key addition to facilitate deployment of CI/CD pipelines with test automation and feedback. Adding support for REST APIs, advanced scheduling, retries, and screenshots enabled Cerberus to further accelerate testing-cycle time. For example, French retailer Leroy Merlin uses Cerberus for [mobile testing at scale][14]. + +### Support for continuous testing + +With recent and ongoing updates, organizations can leverage Cerberus' features from development to operations. It expands digital experience test coverage by executing tests on a variety of browsers, devices, and apps. Its native connectors for APIs (including SOAP and REST), desktop applications, and [Apache Kafka][15] enable testing legacy apps, APIs, event-driven microservices, streaming services, business intelligence, data science applications, and other use cases. + +During the software development lifecycle, Cerberus supports fast iterations in test management, execution, and reporting. Users can create test specifications in plain English, compose tests using a library, execute in parallel on various devices, and do advanced reporting. Native integration with CI/CD solutions, such as Jenkins, Bitbucket, and others, combined with one-click ticket creation in Jira and other tools, makes bug resolution faster and easier. + +![Cerberus use cases][16] + +(Cerberus, [CC BY-SA 4.0][5]) + +Cerberus can also monitor customer experience and business operations. Tests can be functional and technical, allowing organizations to test complex scenarios. For example, France's leading TV channel, TF1, uses it for quality assurance on its streaming platform. + +Capabilities such as advanced scheduling, alerting, notifications, and web-performance and analytics dashboards make it easier to discover issues and identify bottlenecks with third-party integrations or customer experience problems. + +### Next steps + +We are focusing now on engaging and growing the Cerberus community to accelerate the product's development and adoption. We hold community meetings every two weeks to align the product roadmap and improvements and to balance our product vision with community needs. Improving integrations and usability is vital to producing a successful product experience. + +If you would like to try Cerberus or contribute to the community, please visit our [Cerberus Testing page][8] on GitHub. You can also find us on [LinkedIn][17], [Twitter][18], and [YouTube][19]. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/cerberus-test-automation + +作者:[Antoine Craske][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/acraske +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://www.sogeti.se/utforska/rapporter/world-quality-report-2019-2020/ +[3]: https://cerberus-testing.org/ +[4]: https://opensource.com/sites/default/files/uploads/cerberus_test-lifecycle_0.png (Cerberus supports test lifecycle to accelerate feedback loops) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://en.wikipedia.org/wiki/Cerberus +[7]: https://sourceforge.net/projects/cerberus-source/files/cerberus-testing-4.4/ +[8]: https://github.com/cerberustesting/cerberus-source +[9]: https://opensource.com/sites/default/files/uploads/cerberus_github.png (Cerberus GitHub repository) +[10]: https://enterprisersproject.com/what-is-digital-transformation +[11]: https://laredoute.io/blog/96-successful-daily-web-production-deploy/ +[12]: https://opensource.com/sites/default/files/uploads/cerberus_integrations.png (Cerberus integrations) +[13]: https://www.jenkins.io/ +[14]: https://medium.com/leroymerlin-tech-digital/on-a-construit-une-plateforme-de-test-mobile-b44e2c785c7f +[15]: https://kafka.apache.org/ +[16]: https://opensource.com/sites/default/files/uploads/cerberus_use-cases.png (Cerberus use cases) +[17]: https://www.linkedin.com/company/cerberus-testing/ +[18]: https://twitter.com/cerberustesting +[19]: https://www.youtube.com/channel/UCkG4csTjR0V5gl77BHhldBQ diff --git a/sources/tech/20200805 Matthew Arnold- Why I switched to Fedora.md b/sources/tech/20200805 Matthew Arnold- Why I switched to Fedora.md new file mode 100644 index 0000000000..3386618fdf --- /dev/null +++ b/sources/tech/20200805 Matthew Arnold- Why I switched to Fedora.md @@ -0,0 +1,100 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Matthew Arnold: Why I switched to Fedora) +[#]: via: (https://fedoramagazine.org/matthew-arnold-why-i-switched-to-fedora/) +[#]: author: (Matthew Arnold https://fedoramagazine.org/author/marnold512/) + +Matthew Arnold: Why I switched to Fedora +====== + +![][1] + +To a veteran user of other distributions, Fedora can be a challenge. Many things are not where you expect them to be. The default LVM volume allocations are a bit tricky. And packages including the kernel are frequently upgraded. So why switch after years of using other distributions? + +In my case, for a variety of technical and political reasons, Fedora was the best option if I wanted to continue using Linux as my daily driver. If you are making the transition from another distribution, here are some observations and tips to get you started. + +### Firm foundations + +In Fedora you will find a community just as fiercely dedicated to its users and free software as Debian, as fanatical about polish and design as anyone in Ubuntu, and as passionate about learning and discovery as users of Arch or Slackware. Flowing under it all you will find a welcoming community dedicated to technical excellence. The form may change, but underneath all the trappings of _systemd_, _dnf_, _rpm_, and other differences, you will find a thriving healthy and growing community of people who have gathered together to make something awesome. Welcome to Fedora, and I hope you stay awhile. + +The best way to get to know the Fedora community is to explore it for yourself. I hope a future article will highlight some of the more interesting aspects of Fedora for newcomers. Below are a few tips that I have put together to help you find your way around a new Fedora installation. + +### Install and explore + +Installation proceeds as you would expect but be aware that you might want to adjust the LVM volume allocations in the install process or shortly afterwards or you might run low on space in a key place unexpectedly! Btrfs is also a supported option that is worth a look if you have lots of small disks. + +### Freedom matters + +As stated above Fedora has a software freedom commitment similar in spirit to that of Debian. This means that you should be able to give Fedora to anyone, anywhere without violating intellectual property laws. Any software which is either not licensed in a way that Fedora [finds acceptable][2] or that bares US patent encumbrances can be found in the rpmfusion.org repository. + +After the install your next concern is undoubtedly configuring things and installing new packages. Fedora’s command-line package manager is _dnf_. It works as you would expect. + +Note also that since _rpm_ uses file-based dependency tracking instead of package-based dependency tracking, as almost all others do, there are very few traditional metapackages. There are, however, package groups. To get a list of package groups, the command is: + +``` +$ dnf group list +``` + +To get a list of all installed packages on the system, the command is: + +``` +$ rpm -qa +``` + +All _rpm_ commands are easily filterable using traditional Unix tools. So you should have no trouble adapting your workflow to the new environment. All the information gathered with the below commands can also be gathered through the _dnf_ command. For information gathering, I prefer to use the _rpm_ command because it presents information in a way that is easily parseable by commands like _grep_. But if you are making changes to the system, it is easier and safer to use _dnf_. + +To get a package’s version, description, and other metainformation the command is: + +``` +$ rpm -qi +``` + +To list the contents of an installed package the command is: + +``` +$ rpm -ql +``` + +One way in which _rpm_ is easier to use then _dpkg_ or the slack package tools is that _rpm_ stores change log information for each package in the package manager database itself so it is very easy to diagnose whether an update might have broken or changed something unexpectedly. This command is: + +``` +$ rpm -q --changes +``` + +### On the kernel + +Perhaps one of the most exciting differences between Fedora and other projects, for newcomers at least, is Fedora’s policy on the kernel. Fedora’s policy is to align the distribution’s kernel package life cycle with the upstream mainline kernel life cycle. This means that every Fedora release will have multiple major kernel versions during its lifetime. + +This offers several advantages for both users and developers. Primarily, Fedora users are among the first to receive all of the latest drivers, security fixes, new features, etc. + +If you do not have an installation that uses out-of-tree modules or custom patches this should not be much of concern to you. However, if you rely on a kernel module like _zfs_, for example. Rebuilding the filesystem module every 2-3 months can get tedious and error prone after a while. This problem only compounds if you depend upon custom patches for your system to work correctly. There is good news and bad news on this issue. + +The good news is that Fedora’s process for [building a custom kernel is well documented][3] + +The bad news is, as with all things kernel related in all projects, going the custom route means you’re on your own in terms of support. The 2-3 month lifecycle means you’ll be building modules and kernels far more often then you are used to. This may be a deal breaker for some. But even this offers an advantage to the discerning or adventuress user. You will find that being encouraged to rebase your custom kernel setup every two to three months will give you far greater insight into what is going on upstream in mainline Linux and the various out of tree projects you rely on. + +### Conclusion + +Hopefully these tips will get you started exploring and configuring your new Fedora system. Once you have done that. I urge you to explore the community. Like any other free software product of Fedora’s age and size, there are a plethora of communication channels available. You should read the [code of conduct][4] and then head over to the [communication page on the wiki][5] to get started. As with the distribution itself, for all the differences in culture you will find that much remains the same. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/matthew-arnold-why-i-switched-to-fedora/ + +作者:[Matthew Arnold][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/marnold512/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/07/fedora-switch-816x345.jpg +[2]: https://fedoraproject.org/wiki/Licensing:Main +[3]: https://fedoraproject.org/wiki/Building_a_custom_kernel +[4]: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ +[5]: https://fedoraproject.org/wiki/Communicating_and_getting_help diff --git a/sources/tech/20200806 5 reasons to run Kubernetes on your Raspberry Pi homelab.md b/sources/tech/20200806 5 reasons to run Kubernetes on your Raspberry Pi homelab.md new file mode 100644 index 0000000000..e45973855f --- /dev/null +++ b/sources/tech/20200806 5 reasons to run Kubernetes on your Raspberry Pi homelab.md @@ -0,0 +1,92 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (5 reasons to run Kubernetes on your Raspberry Pi homelab) +[#]: via: (https://opensource.com/article/20/8/kubernetes-raspberry-pi) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +5 reasons to run Kubernetes on your Raspberry Pi homelab +====== +A new free eBook offers step-by-step instructions for creating a private +cloud at home, including what you can do with it when you're done. +![Ship captain sailing the Kubernetes seas][1] + +There's a saying about the cloud, and it goes something like this: _The cloud is just somebody else's computer._ While the cloud is actually more complex than that (it's _a lot_ of computers), there's a lot of truth to the sentiment. When you move to the cloud, you're moving data and services and computing power to an entity you don't own or fully control. On the one hand, this frees you from having to perform administrative tasks you don't want to do, but, on the other hand, it could mean you no longer control your own computer. + +This is why the open source world likes to talk about an [_open hybrid cloud_][2], a model that allows you to choose your own infrastructure, select your own OS, and orchestrate your workloads as you see fit. However, if you don't happen to have an open hybrid cloud available to you, you can create your own—either to help you learn how the cloud works or to serve your local network. + +Building your own cloud requires at least three Raspberry Pi units, an Arm Linux distribution to serve as an OS, and Kubernetes to help you manage the containers your cloud will run. Chris Collins explains every step you need to take to make this happen in our new [eBook][3]. If you've ever built an array of distributed computing nodes, you'll probably be surprised at how simple it is. Sooner than you expect, you'll reach the end of the installation, and you'll inevitably be faced with this question: + +Now what? + +What's the real-world application of a private cloud running on tiny computers in your office? What do you need Kubernetes for, anyway? I used to ask myself the same questions, and I've come up with enough answers to justify a minor investment in a spare Raspberry Pi or two and the time it takes to follow the instructions in Chris' eBook. Here are some ideas for you. + +### Network-attached storage for your home + +If you're a hobbyist just looking to try out the latest tech, one of the easiest entry points is improving your network. Since the Raspberry Pi was released, I've never been without a home server—even during the times my home was just a rented room in the suburbs. My home networks weren't always very complicated, but they ran a few services that I enjoyed having available, so it suited me. + +By following along with Chris' eBook, I've recently added Kubernetes and a few nodes to my network, which give me the ability to add any number of services. I've finally got Network Filesystem (NFS) running, so my partner and I have an easy backup plan and can access shared files as if they existed locally on any computer we're using. I'm also running the open source [Kodi media server][4], so we can watch movies, listen to music, and view photos (all stored on the NFS share) anywhere in the house. A [Nextcloud][5] installation makes collaboration easy, and it also helps us keep in touch with family members in other countries without resorting to the likes of Facebook. + +In short, Kubernetes and the many container images available for easy installs have transformed my local network into my own personal internet or supercomputer. It doesn't provide all services for all people, but it provides exactly the services I want for the people who I want to have access. + +If you're duplicating media or applications across several devices or building a home server, you should consider a Kubernetes cluster. It's easy to scale for power and storage, it's easy to maintain, and it's a lot of fun. + +### Education and upskilling + +Are you considering a career in IT? Are you already in IT but want to grow as a professional? The cloud is a powerful model, and Kubernetes is an easy way to wrangle a lot of potential power. The more you learn about these concepts, the better prepared you'll be to move up in your career. + +One of the most frustrating aspects of the cloud in its early days was its inaccessibility. If you didn't own racks of servers, it was difficult to gain experience administering and maintaining a cloud infrastructure. Thanks to open source projects like [Kubernetes][6], [OKD][7], [LXC][8], and [Podman][9], building your own cloud has become possible. Thanks to the Raspberry Pi and other Arm-based system-on-a-chip (SoC) computers, it's also affordable. + +### Web server + +The internet is one of the most accessible entry points into modern technology. Since the '90s, regular folk have wandered into the strange world of computing by reading HTML in a desperate attempt to understand how to put an animated GIF onto a Myspace or Geocities page. A natural progression from rudimentary HTML and CSS is to run a web server. Admittedly, a Kubernetes cluster probably is overkill for a personal site, but it's a great project to become familiar with how Kubernetes pods work and why they're important. It's also a great way to learn about [routing][10] and load balancing. + +### Containers + +Linux containers have changed IT and computing as a whole. The original [LXC][11] toolset enabled and inspired hugely popular technologies like Docker, Flatpak, Kubernetes, Podman, and more. Containerization is a new model of running code that's showing up on operating systems for desktops and mobile devices. + +The problem is, containers are _different_ from what most users are accustomed to. Traditionally, binaries were compiled according to the operating systems, they were linked to locally available libraries, and they generally had access to everything on the hard drive. [Containers are different][12]. They're miniature runtime environments with binaries run within them, linked to other libraries in the container, and it's all kept separate from the host system unless it's granted a specific exemption. Furthermore, a container is ephemeral. You can create a container and dispose of it arbitrarily. Running a service in a container is a great way to learn how data can be persistent in an environment designed to end and respawn at any moment. + +As painful as that learning curve can be, discovering how easy containerized apps are to install opens a whole new world of possibilities. You can run the [Grafana][13] dashboard, the [Prometheus][14] monitoring software, Discourse, Nextcloud, and a dozen others from prebuilt container definitions or [Helm charts][15]. + +### Web development + +If you're a developer delivering apps for the web, [Kubernetes offers many benefits][16]. It can transform your workflow, and most importantly, it can help make your apps resilient. When you're developing for the cloud, you leverage [the best principles of microservices][17] in the context of containers, and you're able to use the advantages of distributed computing, filesystems, and databases. + +### Try Kubernetes yourself + +If you've learned [the basics][18] of Kubernetes, now's the time to take your knowledge a step further with your very own private cloud. Download our [**free eBook**][3] and start using Kubernetes today. You never know where it will take you. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/kubernetes-raspberry-pi + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek (Ship captain sailing the Kubernetes seas) +[2]: https://www.redhat.com/en/topics/cloud-computing/what-is-hybrid-cloud +[3]: https://opensource.com/downloads/kubernetes-raspberry-pi +[4]: http://kodi.tv +[5]: https://opensource.com/article/17/5/next-big-challenge-open-source-rich-collaboration-software +[6]: https://kubernetes.io +[7]: https://www.okd.io +[8]: https://linuxcontainers.org/lxc/getting-started +[9]: http://podman.io +[10]: https://opensource.com/article/20/3/kubernetes-traefik +[11]: https://opensource.com/article/18/11/behind-scenes-linux-containers +[12]: https://opensource.com/article/19/6/kubernetes-potential-run-anything +[13]: https://opensource.com/article/19/2/deploy-influxdb-grafana-kubernetes +[14]: https://opensource.com/article/19/11/introduction-monitoring-prometheus +[15]: https://opensource.com/article/20/5/helm-charts +[16]: https://opensource.com/article/19/10/kubernetes-complex-business-problem +[17]: https://opensource.com/article/19/11/microservices-cheat-sheet +[18]: https://opensource.com/article/19/6/kubernetes-basics diff --git a/sources/tech/20200807 An advanced guide to NLP analysis with Python and NLTK.md b/sources/tech/20200807 An advanced guide to NLP analysis with Python and NLTK.md new file mode 100644 index 0000000000..2f6c16a085 --- /dev/null +++ b/sources/tech/20200807 An advanced guide to NLP analysis with Python and NLTK.md @@ -0,0 +1,542 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (An advanced guide to NLP analysis with Python and NLTK) +[#]: via: (https://opensource.com/article/20/8/nlp-python-nltk) +[#]: author: (Girish Managoli https://opensource.com/users/gammay) + +An advanced guide to NLP analysis with Python and NLTK +====== +Get deeper into the foundational concepts behind natural language +processing. +![Brain on a computer screen][1] + +In my [previous article][2], I introduced natural language processing (NLP) and the Natural Language Toolkit ([NLTK][3]), the NLP toolkit created at the University of Pennsylvania. I demonstrated how to parse text and define stopwords in Python and introduced the concept of a corpus, a dataset of text that aids in text processing with out-of-the-box data. In this article, I'll continue utilizing datasets to compare and analyze natural language. + +The fundamental building blocks covered in this article are: + + * WordNet and synsets + * Similarity comparison + * Tree and treebank + * Named entity recognition + + + +### WordNet and synsets + +[WordNet][4] is a large lexical database corpus in NLTK. WordNet maintains cognitive synonyms (commonly called synsets) of words correlated by nouns, verbs, adjectives, adverbs, synonyms, antonyms, and more. + +WordNet is a very useful tool for text analysis. It is available for many languages (Chinese, English, Japanese, Russian, Spanish, and more), under many licenses (ranging from open source to commercial). The first WordNet was created by Princeton University for English under an MIT-like license. + +A word is typically associated with multiple synsets based on its meanings and parts of speech. Each synset usually provides these attributes: + +**Attribute** | **Definition** | **Example** +---|---|--- +Name | Name of the synset | Example: The word "code" has five synsets with names `code.n.01`, `code.n.02`, `code.n.03`, `code.v.01`, `code.v.02` +POS | Part of speech of the word for this synset | The word "code" has three synsets in noun form and two in verb form +Definition | Definition of the word (in POS) | One of the definitions of "code" in verb form is: "(computer science) the symbolic arrangement of data or instructions in a computer program" +Examples | Examples of word's use | One of the examples of "code": "We should encode the message for security reasons" +Lemmas | Other word synsets this word+POC is related to (not strictly synonyms, but can be considered so); lemmas are related to other lemmas, not to words directly | Lemmas of `code.v.02` (as in "convert ordinary language into code") are `code.v.02.encipher`, `code.v.02.cipher`, `code.v.02.cypher`, `code.v.02.encrypt`, `code.v.02.inscribe`, `code.v.02.write_in_code` +Antonyms | Opposites | Antonym of lemma `encode.v.01.encode` is `decode.v.01.decode` +Hypernym | A broad category that other words fall under | A hypernym of `code.v.01` (as in "Code the pieces with numbers so that you can identify them later") is `tag.v.01` +Meronym | A word that is part of (or subordinate to) a broad category | A meronym of "computer" is "chip" +Holonym | The relationship between a parent word and its subordinate parts | A hyponym of "window" is "computer screen" + +There are several other attributes, which you can find in the `nltk/corpus/reader/wordnet.py` source file in `/Lib/site-packages`. + +Some code may help this make more sense. + +This helper function: + + +``` +def synset_info(synset): +    print("Name", synset.name()) +    print("POS:", synset.pos()) +    print("Definition:", synset.definition()) +    print("Examples:", synset.examples()) +    print("Lemmas:", synset.lemmas()) +    print("Antonyms:", [lemma.antonyms() for lemma in synset.lemmas() if len(lemma.antonyms()) > 0]) +    print("Hypernyms:", synset.hypernyms()) +    print("Instance Hypernyms:", synset.instance_hypernyms()) +    print("Part Holonyms:", synset.part_holonyms()) +    print("Part Meronyms:", synset.part_meronyms()) +    print() + +[/code] [code]`synsets = wordnet.synsets('code')` +``` + +shows this: + + +``` +5 synsets: +Name code.n.01 +POS: n +Definition: a set of rules or principles or laws (especially written ones) +Examples: [] +Lemmas: [Lemma('code.n.01.code'), Lemma('code.n.01.codification')] +Antonyms: [] +Hypernyms: [Synset('written_communication.n.01')] +Instance Hpernyms: [] +Part Holonyms: [] +Part Meronyms: [] + +... + +Name code.n.03 +POS: n +Definition: (computer science) the symbolic arrangement of data or instructions in a computer program or the set of such instructions +Examples: [] +Lemmas: [Lemma('code.n.03.code'), Lemma('code.n.03.computer_code')] +Antonyms: [] +Hypernyms: [Synset('coding_system.n.01')] +Instance Hpernyms: [] +Part Holonyms: [] +Part Meronyms: [] + +... + +Name code.v.02 +POS: v +Definition: convert ordinary language into code +Examples: ['We should encode the message for security reasons'] +Lemmas: [Lemma('code.v.02.code'), Lemma('code.v.02.encipher'), Lemma('code.v.02.cipher'), Lemma('code.v.02.cypher'), Lemma('code.v.02.encrypt'), Lemma('code.v.02.inscribe'), Lemma('code.v.02.write_in_code')] +Antonyms: [] +Hypernyms: [Synset('encode.v.01')] +Instance Hpernyms: [] +Part Holonyms: [] +Part Meronyms: [] +``` + +Synsets and lemmas follow a tree structure you can visualize: + + +``` +def hypernyms(synset): +    return synset.hypernyms() + +synsets = wordnet.synsets('soccer') +for synset in synsets: +    print(synset.name() + " tree:") +    pprint(synset.tree(rel=hypernyms)) +    print() + +[/code] [code] + +code.n.01 tree: +[Synset('code.n.01'), + [Synset('written_communication.n.01'), +   ... + +code.n.02 tree: +[Synset('code.n.02'), + [Synset('coding_system.n.01'), +   ... + +code.n.03 tree: +[Synset('code.n.03'), +   ... + +code.v.01 tree: +[Synset('code.v.01'), + [Synset('tag.v.01'), +   ... + +code.v.02 tree: +[Synset('code.v.02'), + [Synset('encode.v.01'), +   ... +``` + +WordNet does not cover all words and their information (there are about 170,000 words in English today and about 155,000 in the latest version of WordNet), but it's a good starting point. After you learn the concepts of this building block, if you find it inadequate for your needs, you can migrate to another. Or, you can build your own WordNet! + +#### Try it yourself + +Using the Python libraries, download Wikipedia's page on [open source][5] and list the synsets and lemmas of all the words. + +### Similarity comparison + +Similarity comparison is a building block that identifies similarities between two pieces of text. It has many applications in search engines, chatbots, and more. + +For example, are the words "football" and "soccer" related? + + +``` +syn1 = wordnet.synsets('football') +syn2 = wordnet.synsets('soccer') + +# A word may have multiple synsets, so need to compare each synset of word1 with synset of word2 +for s1 in syn1: +    for s2 in syn2: +        print("Path similarity of: ") +        print(s1, '(', s1.pos(), ')', '[', s1.definition(), ']') +        print(s2, '(', s2.pos(), ')', '[', s2.definition(), ']') +        print("   is", s1.path_similarity(s2)) +        print() + +[/code] [code] + +Path similarity of: +Synset('football.n.01') ( n ) [ any of various games played with a ball (round or oval) in which two teams try to kick or carry or propel the ball into each other's goal ] +Synset('soccer.n.01') ( n ) [ a football game in which two teams of 11 players try to kick or head a ball into the opponents' goal ] +   is 0.5 + +Path similarity of: +Synset('football.n.02') ( n ) [ the inflated oblong ball used in playing American football ] +Synset('soccer.n.01') ( n ) [ a football game in which two teams of 11 players try to kick or head a ball into the opponents' goal ] +   is 0.05 +``` + +The highest path similarity score of the words is 0.5, indicating they are closely related. + +What about "code" and "bug"? Similarity scores for these words used in computer science are: + + +``` +Path similarity of: +Synset('code.n.01') ( n ) [ a set of rules or principles or laws (especially written ones) ] +Synset('bug.n.02') ( n ) [ a fault or defect in a computer program, system, or machine ] +   is 0.1111111111111111 +... +Path similarity of: +Synset('code.n.02') ( n ) [ a coding system used for transmitting messages requiring brevity or secrecy ] +Synset('bug.n.02') ( n ) [ a fault or defect in a computer program, system, or machine ] +   is 0.09090909090909091 +... +Path similarity of: +Synset('code.n.03') ( n ) [ (computer science) the symbolic arrangement of data or instructions in a computer program or the set of such instructions ] +Synset('bug.n.02') ( n ) [ a fault or defect in a computer program, system, or machine ] +   is 0.09090909090909091 +``` + +These are the highest similarity scores, which indicates they are related. + +NLTK provides several similarity scorers, such as: + + * path_similarity + * lch_similarity + * wup_similarity + * res_similarity + * jcn_similarity + * lin_similarity + + + +See the Similarity section of the [WordNet Interface][6] page to determine the appropriate one for your application. + +#### Try it yourself + +Using Python libraries, start from the Wikipedia [Category: Lists of computer terms][7] page and prepare a list of terminologies, then see how the words correlate. + +### Tree and treebank + +With NLTK, you can represent a text's structure in tree form to help with text analysis. + +Here is an example: + +A simple text pre-processed and part-of-speech (POS)-tagged: + + +``` +import nltk + +text = "I love open source" +# Tokenize to words +words = nltk.tokenize.word_tokenize(text) +# POS tag the words +words_tagged = nltk.pos_tag(words) +``` + +You must define a grammar to convert the text to a tree structure. This example uses a simple grammar based on the [Penn Treebank tags][8]. + + +``` +# A simple grammar to create tree +grammar = "NP: {<JJ><NN>}" +``` + +Next, use the grammar to create a tree: + + +``` +# Create tree +parser = nltk.RegexpParser(grammar) +tree = parser.parse(words_tagged) +pprint(tree) +``` + +This produces: + + +``` +`Tree('S', [('I', 'PRP'), ('love', 'VBP'), Tree('NP', [('open', 'JJ'), ('source', 'NN')])])` +``` + +You can see it better graphically. + + +``` +`tree.draw()` +``` + +![NLTK Tree][9] + +(Girish Managoli, [CC BY-SA 4.0][10]) + +This structure helps explain the text's meaning correctly. As an example, identify the [subject][11] in this text: + + +``` +subject_tags = ["NN", "NNS", "NP", "NNP", "NNPS", "PRP", "PRP$"] +def subject(sentence_tree): +    for tagged_word in sentence_tree: +        # A crude logic for this case -  first word with these tags is considered subject +        if tagged_word[1] in subject_tags: +            return tagged_word[0] + +print("Subject:", subject(tree)) +``` + +It shows "I" is the subject: + + +``` +`Subject: I` +``` + +This is a basic text analysis building block that is applicable to larger applications. For example, when a user says, "Book a flight for my mom, Jane, to NY from London on January 1st," a chatbot using this block can interpret the request as: + +**Action**: Book +**What**: Flight +**Traveler**: Jane +**From**: London +**To**: New York +**Date**: 1 Jan (of the next year) + +A treebank refers to a corpus with pre-tagged trees. Open source, conditional free-for-use, and commercial treebanks are available for many languages. The most commonly used one for English is Penn Treebank, extracted from the _Wall Street Journal_, a subset of which is included in NLTK. Some ways of using a treebank: + + +``` +words = nltk.corpus.treebank.words() +print(len(words), "words:") +print(words) + +tagged_sents = nltk.corpus.treebank.tagged_sents() +print(len(tagged_sents), "sentences:") +print(tagged_sents) + +[/code] [code] + +100676 words: +['Pierre', 'Vinken', ',', '61', 'years', 'old', ',', ...] +3914 sentences: +[[('Pierre', 'NNP'), ('Vinken', 'NNP'), (',', ','), ('61', 'CD'), ('years', 'NNS'), ('old', 'JJ'), (',', ','), ('will', 'MD'), ('join', 'VB'), ('the', 'DT'), ('board', 'NN'), ('as', 'IN'), ('a', 'DT'), ('nonexecutive', 'JJ'), ('director', 'NN'), ...] +``` + +See tags in a sentence: + + +``` +sent0 = tagged_sents[0] +pprint(sent0) + +[/code] [code] + +[('Pierre', 'NNP'), + ('Vinken', 'NNP'), + (',', ','), + ('61', 'CD'), + ('years', 'NNS'), +... +``` + +Create a grammar to convert this to a tree: + + +``` +grammar = ''' +    Subject: {<NNP><NNP>} +    SubjectInfo: {<CD><NNS><JJ>} +    Action: {<MD><VB>} +    Object: {<DT><NN>} +    Stopwords: {<IN><DT>} +    ObjectInfo: {<JJ><NN>} +    When: {<NNP><CD>} +''' +parser = nltk.RegexpParser(grammar) +tree = parser.parse(sent0) +print(tree) + +[/code] [code] + +(S +  (Subject Pierre/NNP Vinken/NNP) +  ,/, +  (SubjectInfo 61/CD years/NNS old/JJ) +  ,/, +  (Action will/MD join/VB) +  (Object the/DT board/NN) +  as/IN +  a/DT +  (ObjectInfo nonexecutive/JJ director/NN) +  (Subject Nov./NNP) +  29/CD +  ./.) +``` + +See it graphically: + + +``` +`tree.draw()` +``` + +![NLP Treebank image][12] + +(Girish Managoli, [CC BY-SA 4.0][10]) + +The concept of trees and treebanks is a powerful building block for text analysis. + +#### Try it yourself + +Using the Python libraries, download Wikipedia's page on [open source][5] and represent the text in a presentable view. + +### Named entity recognition + +Text, whether spoken or written, contains important data. One of text processing's primary goals is extracting this key data. This is needed in almost all applications, such as an airline chatbot that books tickets or a question-answering bot. NLTK provides a named entity recognition feature for this. + +Here's a code example: + + +``` +`sentence = 'Peterson first suggested the name "open source" at Palo Alto, California'` +``` + +See if name and place are recognized in this sentence. Pre-process as usual: + + +``` +import nltk + +words = nltk.word_tokenize(sentence) +pos_tagged = nltk.pos_tag(words) +``` + +Run the named-entity tagger: + + +``` +ne_tagged = nltk.ne_chunk(pos_tagged) +print("NE tagged text:") +print(ne_tagged) +print() + +[/code] [code] + +NE tagged text: +(S +  (PERSON Peterson/NNP) +  first/RB +  suggested/VBD +  the/DT +  name/NN +  ``/`` +  open/JJ +  source/NN +  ''/'' +  at/IN +  (FACILITY Palo/NNP Alto/NNP) +  ,/, +  (GPE California/NNP)) +``` + +Name tags were added; extract only the named entities from this tree: + + +``` +print("Recognized named entities:") +for ne in ne_tagged: +    if hasattr(ne, "label"): +        print(ne.label(), ne[0:]) + +[/code] [code] + +Recognized named entities: +PERSON [('Peterson', 'NNP')] +FACILITY [('Palo', 'NNP'), ('Alto', 'NNP')] +GPE [('California', 'NNP')] +``` + +See it graphically: + + +``` +`ne_tagged.draw()` +``` + +![NLTK Treebank tree][13] + +(Girish Managoli, [CC BY-SA 4.0][10]) + +NLTK's built-in named-entity tagger, using PENN's [Automatic Content Extraction][14] (ACE) program, detects common entities such as ORGANIZATION, PERSON, LOCATION, FACILITY, and GPE (geopolitical entity). + +NLTK can use other taggers, such as the [Stanford Named Entity Recognizer][15]. This trained tagger is built in Java, but NLTK provides an interface to work with it (See [nltk.parse.stanford][16] or [nltk.tag.stanford][17]). + +#### Try it yourself + +Using the Python libraries, download Wikipedia's page on [open source][5] and identify people who had an influence on open source and where and when they contributed. + +### Advanced exercise + +If you're ready for it, try building this superstructure using the building blocks discussed in these articles. + +Using Python libraries, download Wikipedia's [Category: Computer science page][18] and: + + * Identify the most-occurring unigrams, bigrams, and trigrams and publish it as a list of keywords or technologies that students and engineers need to be aware of in this domain. + * Show the names, technologies, dates, and places that matter in this field graphically. This can be a nice infographic. + * Create a search engine. Does your search engine perform better than Wikipedia's search? + + + +### What's next? + +NLP is a quintessential pillar in application building. NLTK is a classic, rich, and powerful kit that provides the bricks and mortar to build practically appealing, purposeful applications for the real world. + +In this series of articles, I explained what NLP makes possible using NLTK as an example. NLP and NLTK have a lot more to offer. This series is an inception point to help get you started. + +If your needs grow beyond NLTK's capabilities, you could train new models or add capabilities to it. New NLP libraries that build on NLTK are coming up, and machine learning is being used extensively in language processing. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/nlp-python-nltk + +作者:[Girish Managoli][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gammay +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_computer_solve_fix_tool.png?itok=okq8joti (Brain on a computer screen) +[2]: https://opensource.com/article/20/8/intro-python-nltk +[3]: http://www.nltk.org/ +[4]: https://en.wikipedia.org/wiki/WordNet +[5]: https://en.wikipedia.org/wiki/Open_source +[6]: https://www.nltk.org/howto/wordnet.html +[7]: https://en.wikipedia.org/wiki/Category:Lists_of_computer_terms +[8]: https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html +[9]: https://opensource.com/sites/default/files/uploads/nltk-tree.jpg (NLTK Tree) +[10]: https://creativecommons.org/licenses/by-sa/4.0/ +[11]: https://en.wikipedia.org/wiki/Subject_(grammar) +[12]: https://opensource.com/sites/default/files/uploads/nltk-treebank.jpg (NLP Treebank image) +[13]: https://opensource.com/sites/default/files/uploads/nltk-treebank-2a.jpg (NLTK Treebank tree) +[14]: https://www.ldc.upenn.edu/collaborations/past-projects/ace +[15]: https://nlp.stanford.edu/software/CRF-NER.html +[16]: https://www.nltk.org/_modules/nltk/parse/stanford.html +[17]: https://www.nltk.org/_modules/nltk/tag/stanford.html +[18]: https://en.wikipedia.org/wiki/Category:Computer_science diff --git a/sources/tech/20200812 Create a wifi hotspot with Raspberry Pi 3 and Fedora.md b/sources/tech/20200812 Create a wifi hotspot with Raspberry Pi 3 and Fedora.md new file mode 100644 index 0000000000..6785ed8936 --- /dev/null +++ b/sources/tech/20200812 Create a wifi hotspot with Raspberry Pi 3 and Fedora.md @@ -0,0 +1,371 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Create a wifi hotspot with Raspberry Pi 3 and Fedora) +[#]: via: (https://fedoramagazine.org/create-a-wifi-hotspot-with-raspberry-pi-3-and-fedora/) +[#]: author: (Nick Hardiman https://fedoramagazine.org/author/nickhardiman/) + +Create a wifi hotspot with Raspberry Pi 3 and Fedora +====== + +![][1] + +If you’re already [running Fedora on your Pi][2], you’re already most of the way to a wifi hotspot. A Raspberry Pi has a wifi interface that’s usually set up to join an existing wifi network. This interface can be reconfigured to provide a new wifi network. If a room has a good network cable and a bad wifi signal (a brick wall, foil-backed plasterboard, and even a window with a metal oxide coating are all obstacles), fix it with your Pi. + +This article describes the procedure for setting up the hotspot. It was tested on third generation Pis – a [Model B v1.2][3], and a [Model B+][4] (the older [2][5] and the new [4][6] weren’t tested). These are the credit-card size Pis that have been around a few years. + +This article also delves a little way into the network concepts behind the scenes. For instance, “hotspot” is the term that’s caught on in public places around the world, but it’s more accurate to use the term WLAN AP (Wireless Local Area Network Access Point).In fact, if you want to annoy your friendly neighborhood network administrator, call a hotspot a “wifi router”. The inaccuracy will make their eyes cross. + +A few _nmcli_ commands configure the Raspberry Pi as a wifi AP. The _nmcli_ command-line tool controls the NetworkManager daemon. It’s not the only network configuration system available. More complex solutions are available for the adventurous. Check out the [hostapd][7] RPM package and the [OpenWRT distro][8]. Have a look at [Internet connection sharing with NetworkManager][9] for more ideas. + +### A dive into network administration + +The hotspot is a routed AP (Access Point). It sits between two networks, the current wired network and its new wireless network, and takes care of the post-office-style forwarding of IP packets between them. + +#### Routing and interfaces + +The wireless interface on the Raspberry Pi is named **wlan0** and the wired one is **eth0**. The new wireless network uses one range of IP addresses and the current wired network uses another. In this example, the current network range is 192.168.0.0/24 and the new network range is 10.42.0.0/24. If these numbers make no sense, that’s OK. You can carry on without getting to grips with IP subnets and netmasks. The Raspberry Pi’s two interfaces have IP addresses from these ranges. + +Packets are sent to local computers or remote destinations based on their IP addresses. This is routing work, and it’s where the _routed_ part of _routed AP_ name comes from. If you’d like to build a more complex router with DHCP and DNS, pick up some tips from the article [How to use Fedora Server to create a router / gateway][10]. + +#### It’s not a bridged AP + +Netowrk bridging is another way of extending a network, but it’s not how this Pi is set up. This routed AP is not a bridged AP. To understand the difference between routing and bridging, you have to know a little about the networking layers of the OSI network model. A good place to start is the [beginner’s guide to network troubleshooting in Linux][11]. Here’s the short answer. + + * layer 3, network ← Yes, our routed AP is here. + * layer 2, data link ← No, it’s not a bridged AP. + * layer 1, physical ← Radio transmission is covered here. + + + +A [bridge][12] works at a lower layer of the network stack – it uses ethernet MAC addresses to send data. If this was a bridged AP, it wouldn’t have two sets of IP addresses; the new wireless network and the current wired network would use the same IP subnet. + +#### IP masquerading + +You won’t find an IP address starting with _10._ anywhere on the Internet. It’s a private address, not a public address. To get an IP packet routed out of the wifi network and back in again, packet addresses have to be changed. **IP masquerading** is a way of making this routing work. The masquerade name is used because the packets’ real addresses are hidden. the wired network doesn’t see any addresses from the wireless network. + +IP masquerading is set up automatically by NetworkManager. NetworkManager adds nftables rules to handle [IP masquerading][13]. + +#### The Pi’s network stack + +A stack of network hardware and software makes wifi work. + + * Network hardware + * Kernel space software + * User space software + + + +You can see the network hardware. The Raspberry Pi has two main hardware components – a tiny antenna and Broadcom wifi chip. [MagPi magazine has some great photos][14]. + +Kernel software provides the plumbing. There’s no need to work on these directly – it’s all good to go in the Fedora distribution. + + * [Broadcom driver modules][15] talk to the hardware. List these with the command _lsmod | grep brcm_. + * A TCP/IP stack handles protocols. + * The [netfilter framework][16] filters packets. + * A network system ties these all together. + + + +User space software customizes the system. It’s full of utilities that either help the user, talk to the kernel, or connect other utilities together. For instance, the [firewall-cmd][17] tool talks to the [firewalld service][18], firewalld talks to the [nftables][19] tool, and nftables talks to the netfilter framework in the kernel. The [nmcli][20] commands talk to [NetworkManager][21]. And NetworkManager talks to pretty much everything. + +### Create the AP + +That’s enough theory — let’s get practical. Fire up your Raspberry Pi running Fedora and run these commands. + +#### Install software + +Nearly all the required software is included with the Fedora Minimal image. The only thing missing is the _dnsmasq_ package. This handles the DHCP and IP address part of the new wifi network, automatically. Run this command [using sudo][22]: + +``` +$ sudo dnf install dnsmasq +``` + +#### Create a new NetworkManager connection + +NetworkManager sets up one network connection automatically, _Wired connection 1_. Use the _nmcli_ tool to tell NetworkManager how to add a wifi connection. NetworkManager saves these settings, and a bunch more, in a new config file. + +The new configuration file is created in the directory _/etc/sysconfig/network-scripts/_. At first, it’s empty; the image has no configuration files for network interfaces. If you want to find out more about how NetworkManager uses the _network-scripts_ directory, the gory details are in the [nm-settings-ifcfg-rh man page][23]. + +``` +[nick@raspi ~]$ ls /etc/sysconfig/network-scripts/ +[nick@raspi ~]$ +``` + +The first _nmcli_ command, to create a network connection, looks like this. There’s more to do — the Pi won’t work as a hotspot after running this. + +``` +nmcli con add \ + type wifi \ + ifname wlan0 \ + con-name 'raspi hotspot' \ + autoconnect yes \ + ssid 'raspi wifi' +``` + +The following commands complete several more steps: + + * Create a new connection. + * List the connections. + * Take another look at the _network-scripts_ folder. NetworkManager added a config file. + * List available APs to connect to. + + + +This requires running several commands as root [using _sudo_][22]: + +``` +$ sudo nmcli con add type wifi ifname wlan0 con-name 'raspi hotspot' autoconnect yes ssid 'raspi wifi' +Connection 'raspi wifi' (13ea67a7-a8e6-480c-8a46-3171d9f96554) successfully added. +$ sudo nmcli connection show +NAME UUID TYPE DEVICE +Wired connection 1 59b7f1b5-04e1-3ad8-bde8-386a97e5195d ethernet eth0 +raspi wifi 13ea67a7-a8e6-480c-8a46-3171d9f96554 wifi wlan0 +$ ls /etc/sysconfig/network-scripts/ +ifcfg-raspi_wifi +$ sudo nmcli device wifi list +IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY + 01:0B:03:04:C6:50 APrivateAP Infra 6 195 Mbit/s 52 ▂▄__ WPA2 + 02:B3:54:05:C8:51 SomePublicAP Infra 6 195 Mbit/s 52 ▂▄__ -- +``` + +You can remove the new config and start again with this command: + +``` +$ sudo nmcli con delete 'raspi hotspot' +``` + +#### Change the connection mode + +A NetworkManager connection has many configuration settings. You can see these with the command _nmcli con show ‘raspi hotspot’_. Some of these settings start with the label _802-11-wireless_. This is to do with industry standards that make wifi work – the IEEE organization specified many protocols for wifi, named [802.11][24]. This new wifi connection is in _infrastructure_ mode, ready to connect to a wifi access point. The Pi isn’t supposed to connect to another AP; it’s supposed to be the AP that others connect to. + +This command changes the mode from infrastructure to AP. It also sets a few other [wireless properties][25]. The **bg** value tells NetworkManager to follow two old IEEE standards – [802.11b][26] and [802.11g][27]. Basically it configures the radio to use the 2.4GHz frequency band, not the 5GHz band. **ipv4.method shared** means this connection will be shared with others. + + * Change the connection to a hotspot by changing the mode to _ap_. + + + +``` +sudo nmcli connection \ + modify "raspi hotspot" \ + 802-11-wireless.mode ap \ + 802-11-wireless.band bg \ + ipv4.method shared +``` + +The connection starts automatically. The _dnsmasq_ application gives the wlan0 interface an IP address of 10.42.0.1. The manual commands to start and stop the hotspot are: + +``` +$ sudo nmcli con up "raspi hotspot" +$ sudo nmcli con down "raspi hotspot" +``` + +#### Connect a device + +The next steps are to: + + * Watch the log. + * Connect a smartphone. + * When you’ve seen enough, type ^C ([control][c]) to stop watching the log. + + + +``` +$ journalctl --follow +-- Logs begin at Wed 2020-04-01 18:23:45 BST. -- +... +``` + +Use a wifi-enabled device, like your phone. The phone can find the new _raspi wifi_ network. + +Messages about an associating client appear in the activity log: + +``` +Jun 10 18:08:05 raspi wpa_supplicant[662]: wlan0: AP-STA-CONNECTED 94:b0:1f:2e:d2:bd +Jun 10 18:08:05 raspi wpa_supplicant[662]: wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0 +Jun 10 18:08:05 raspi dnsmasq-dhcp[713]: DHCPREQUEST(wlan0) 10.42.0.125 94:b0:1f:2e:d2:bd +Jun 10 18:08:05 raspi dnsmasq-dhcp[713]: DHCPACK(wlan0) 10.42.0.125 94:b0:1f:2e:d2:bd nick +``` + +### Examine the firewall + +A new security zone named _nm-shared_ has appeared. This is stopping some wifi access. + +``` +$ sudo firewall-cmd --get-active-zones +[sudo] password for nick: +nm-shared + interfaces: wlan0 +public + interfaces: eth0 +``` + +The new zone is set up to accept everything because the target is _ACCEPT_. Clients are able to use web, mail and SSH to get to the Internet. + +``` +$ sudo firewall-cmd --zone=nm-shared --list-all +nm-shared (active) + target: ACCEPT + icmp-block-inversion: no + interfaces: wlan0 + sources: + services: dhcp dns ssh + ports: + protocols: icmp ipv6-icmp + masquerade: no + forward-ports: + source-ports: + icmp-blocks: + rich rules: + rule priority="32767" reject +``` + +This big list of config settings takes a little examination. + +The first line, the innocent-until-proven-guilty option _target: ACCEPT_ says all traffic is allowed through, unless a rule says otherwise. It’s the same as saying these types of traffic are all OK. + + * inbound packets – requests sent from wifi clients to the Raspberry Pi + * forwarded packets – requests from wifi clients to the Internet + * outbound packets – requests sent by the PI to wifi clients + + + +However, there’s a hidden gotcha: requests from wifi clients (like your workstation) to the Raspberry Pi may be rejected. The final line — the mysterious rule in the _rich rules_ section — refers to the [routing policy database][28]. The rule stops you from connecting from your workstation to your Pi with a command like this: _ssh 10.42.0.1_. This rule only affects traffic sent to to the Raspberry Pi, not traffic sent to the Internet, so browsing the web works fine. + +If an inbound packet matches something in the _services_ and _protocols_ lists, it’s allowed through. NetworkManager automatically adds ICMP, DHCP and DNS (Internet infrastructure services and protocols). An SSH packet doesn’t match, gets as far as the [post-processing][29] stage, and is rejected — _priority=”32767″_ translates as “do this after all the processing is done.” + +If you want to know what’s happening behind the scenes, that rich rule creates an nftables rule. The nftables rule looks like this. + +``` +$ sudo nft list chain inet firewalld filter_IN_nm-shared_post +table inet firewalld { + chain filter_IN_nm-shared_post { + reject + } +} +``` + +#### Fix SSH login + +Connect from your workstation to the Raspberry Pi using SSH.This won’t work because of the rich rule. A protocol that’s not on the list gets instantly rejected. + +Check that SSH is blocked: + +``` +$ ssh 10.42.0.1 +ssh: connect to host 10.42.0.1 port 22: Connection refused +``` + +Next, add SSH to the list of allowed services. If you don’t remember what services are defined, list them all with _firewall-cmd ‐‐get-services_. For SSH, use option _‐‐add-service ssh_ or _‐‐remove-service ssh_. Don’t forget to make the change permanent. + +``` +$ sudo firewall-cmd --add-service ssh --permanent --zone=nm-shared +success +``` + +Now test with SSH again. + +``` +$ ssh 10.42.0.1 +The authenticity of host '10.42.0.1 (10.42.0.1)' can't be established. +ECDSA key fingerprint is SHA256:dDdgJpDSMNKR5h0cnpiegyFGAwGD24Dgjg82/NUC3Bc. +Are you sure you want to continue connecting (yes/no/[fingerprint])? yes +Warning: Permanently added '10.42.0.1' (ECDSA) to the list of known hosts. +Last login: Tue Jun 9 18:58:36 2020 from 10.0.1.35 +nick@10.42.0.1's password: +``` + +SSH access is no longer blocked. + +### Test as a headless computer + +The raspberry pi runs fine as a [headless computer][30]. From here on, you can use SSH to work on your Pi. + + * Power off. + * Remove keyboard and video monitor. + * Power on. + * Wait a couple minutes. + * Connect from your workstation to the Raspberry Pi using SSH. Use either the wired interface or the wireless one; both work. + + + +### Increase security with WPA-PSK + +The WPA-PSK (Wifi Protected Access with Pre-Shared Key) system is designed for home users and small offices. It is password protected. Use nmcli again to add WPA-PSK: + +``` +$ sudo nmcli con modify "raspi hotspot" wifi-sec.key-mgmt wpa-psk +$ sudo nmcli con modify "raspi hotspot" wifi-sec.psk "hotspot-password" +``` + +### Troubleshooting + +Here are a couple recommendations: + + * Mine journalctl, Google and forums. + * Join the [Fedora ARM mailing list][31]. + + + +The bad news is, there are no troubleshooting tips here. There are so many things that can go wrong, there’s no way of covering them. + +Troubleshooting a network stack is tricky. If one component goes wrong, it may all go wrong. And making changes like reloading firewall rules can upset services like NetworkManager and sshd. You know you’re in the weeds when you find yourself running [nftables commands][32] like _nft list ruleset_ and [firewalld commands][33] like _firewall-cmd ‐‐set-log-denied=all_. + +### Play with your new platform + +Add value to your new AP. Since you’re running a Pi, there are many hardware add-ons. Since it’s running Fedora, you have thousands of packages available. Try turning it into a mini-NAS, or adding battery back-up, or perhaps a music player. + +* * * + +_Photo by [Uriel SC][34] on [Unsplash][35]_. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/create-a-wifi-hotspot-with-raspberry-pi-3-and-fedora/ + +作者:[Nick Hardiman][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/nickhardiman/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/07/raspi3-wifi-816x345.jpg +[2]: https://fedoramagazine.org/install-fedora-on-a-raspberry-pi/ +[3]: https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ +[4]: https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/ +[5]: https://www.raspberrypi.org/products/raspberry-pi-2-model-b/ +[6]: https://www.raspberrypi.org/products/raspberry-pi-4-model-b/ +[7]: http://w1.fi/hostapd/ +[8]: https://openwrt.org/toh/raspberry_pi_foundation/raspberry_pi +[9]: https://fedoramagazine.org/internet-connection-sharing-networkmanager/ +[10]: https://fedoramagazine.org/use-fedora-server-create-router-gateway/ +[11]: https://www.redhat.com/sysadmin/beginners-guide-network-troubleshooting-linux +[12]: https://wiki.linuxfoundation.org/networking/bridge +[13]: https://en.wikipedia.org/wiki/Network_address_translation +[14]: https://magpi.raspberrypi.org/articles/raspberry-pi-3-specs-benchmarks +[15]: https://wireless.wiki.kernel.org/en/users/drivers/brcm80211 +[16]: https://www.netfilter.org/ +[17]: https://firewalld.org/documentation/utilities/firewall-cmd.html +[18]: https://firewalld.org/ +[19]: https://firewalld.org/2018/07/nftables-backend +[20]: https://developer.gnome.org/NetworkManager/stable/nmcli.html +[21]: https://wiki.gnome.org/Projects/NetworkManager +[22]: https://fedoramagazine.org/howto-use-sudo/ +[23]: https://people.freedesktop.org/~lkundrak/nm-docs/nm-settings-ifcfg-rh.html +[24]: https://en.wikipedia.org/wiki/IEEE_802.11 +[25]: https://developer.gnome.org/NetworkManager/stable/settings-802-11-wireless.html +[26]: https://en.wikipedia.org/wiki/IEEE_802.11#802.11b +[27]: https://en.wikipedia.org/wiki/IEEE_802.11#802.11g +[28]: https://www.man7.org/linux/man-pages/man8/ip-rule.8.html +[29]: https://firewalld.org/2018/12/rich-rule-priorities +[30]: https://en.wikipedia.org/wiki/Headless_computer +[31]: https://lists.fedoraproject.org/admin/lists/arm.lists.fedoraproject.org/ +[32]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/getting-started-with-nftables_configuring-and-managing-networking +[33]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/using-and-configuring-firewalld_configuring-and-managing-networking +[34]: https://unsplash.com/@urielsc26?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[35]: https://unsplash.com/s/photos/network?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20200812 Why I still love tcsh after all these years.md b/sources/tech/20200812 Why I still love tcsh after all these years.md new file mode 100644 index 0000000000..a11347956a --- /dev/null +++ b/sources/tech/20200812 Why I still love tcsh after all these years.md @@ -0,0 +1,152 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Why I still love tcsh after all these years) +[#]: via: (https://opensource.com/article/20/8/tcsh) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Why I still love tcsh after all these years +====== +Bash may be more popular, but tcsh has advantages that make it more +appealing in certain cases. +![Person programming on a laptop on a building][1] + +I consider myself a happy [Bash][2] user. However, when I started exploring Unix, it was on a proprietary Unix system that provided [tcsh][3] by default, so my earliest shell experiences were on a modern version of the C shell (csh). That turned out to be a fortunate accident because tcsh was also the shell of choice at the film studio where I worked later in my career. + +To this day, there are several tasks I associate with tcsh, even though there's no logical correlation there. I still use tcsh on at least one system, if only to stay in practice. I also keep it installed on all my systems to maintain compatibility with my own tcsh scripts and to ensure I can launch it when I need to write a script I prefer to have in tcsh. + +### The difference between C shell and Bash + +Tcsh is the modern continuation of csh. When the C shell was released way back in 1978, users were excited over its C-like syntax. C was a new programming language at the time, and more importantly, it was what Unix was written in, so most Unix users were more comfortable with C than an arbitrary scripting language. For instance, in Bash, this `if` loop makes a "secret" call to the `test` binary to evaluate the conditional statement (the part in brackets): + + +``` +v=1 + +if [ $v -gt 0 ] +  then +  echo "verbose" +fi +``` + +Here's the same statement in csh or tcsh, without an external call to `test` because the conditional statement (the code in parentheses) uses csh's built-in evaluation: + + +``` +set v=1 + +if ($v > 1) then +  echo "verbose" +endif +``` + +This demonstrates a few things, both good and bad. For instance, it's natural for a C programmer to type a conditional in parentheses, and it's desirable from a programmer's perspective to have math evaluation built into the executable. On the other hand, the `if` loop syntax has more in common with Lua than C, which uses braces as delimiters: + + +``` +// this does not work in Csh +if ( v>1 ) { +        [printf][4]("verbose"); +} +``` + +In a way, this nicely sums up csh: it's clean, efficient, and familiar for some, but quirky and inconsistent. + +So why use it? + +### Tcsh for precision + +I write more C++ and [Java][5] than C code, so my interest in tcsh shares little with its historical claim to fame. However, I enjoy [Lua][6], and in a way, I think of tcsh and other shells like I think of Lua and Python or even Markdown and [Docbook][7]. Both shells have merit, and it's easy to point to the one that's more popular, but there's strict clarity to the other. In fact, I feel tcsh has a precision that many other shells lack. + +### Variables + +You don't get the luxury of typed variables in shells, but with tcsh, you can at least declare them with a keyword. Strangely, there are several keywords you can use for the task, but the one I settled on was `set`: + + +``` +> set var=foo +> echo $var +foo +``` + +You can expand variables by typing the name of the variable (`var` in this example) and then pressing **Ctrl+X** followed by the **$** (dollar) key. The example above sets `var` to `foo`. + +As with many other shells, you can list all set variables using `set` alone with no arguments: + + +``` +> set +term    xterm +tty     pts/2 +uid     1000 +user    seth +var     foo +[...] +``` + +You can unset a variable using the `unset` command: + + +``` +> unset var +> set | grep var +> +``` + +### Missing features is a feature + +Maybe you've seen lines like this in a script: + + +``` +var=GitLab +${var,,} +``` + +The second line is a built-in function to transform the contents of `var` into lowercase. + +While extra functions like these are infinitely useful, I sometimes feel they're an invitation to obfuscation. Shell scripting is like the HTML of programming; it's one of the few serious languages you can teach yourself just by reading other people's code. That's not necessarily a great reason to give up useful functions, but it's the reason I try to avoid some of the cryptic shorthand popular in various languages. When writing in tcsh, I don't have the option to use as much shorthand, so complex string operations must be performed with basic Unix tools rather than by built-in shortcuts. I believe it results in code that's easier to read, and that makes a big difference to future contributors—and to future, forgetful _me_. + +### Built-in math + +One of the things I love about tcsh is its built-in **@** math shortcut. Like most self-taught Unix users, I stumbled upon [bc][8], and I've regretted it ever since. Through no fault of its own, bc is often taught to users as a command-line calculator when it's actually better suited as a calculation _language_. Workarounds include an amazing 300-line [calculator in pure Bash][9], or the **let** command in Bash, or the **@** command in tcsh. + + +``` +> @ n = ( 1 + 1 / 2 ) +> echo $n +1 +``` + +For very complex math, it may be worth [learning bc][10] or a good [Python mathematics library][11]. + +### All the essentials + +For me, tcsh strikes a perfect balance between stark simplicity and essential features. It's not a shell for all users, or even for all purposes, but if you're looking to simplify your view of your text-based world, tcsh might provide an interesting alternative. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/tcsh + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/computer_code_programming_laptop.jpg?itok=ormv35tV (Person programming on a laptop on a building) +[2]: https://opensource.com/resources/what-bash +[3]: https://github.com/tcsh-org/tcsh +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[5]: https://opensource.com/resources/java +[6]: https://opensource.com/article/20/2/lua-cheat-sheet +[7]: https://opensource.com/article/17/9/docbook +[8]: https://www.gnu.org/software/bc/ +[9]: https://raw.githubusercontent.com/bluebat/.bash/master/bashbc.sh +[10]: https://opensource.com/article/20/7/bc +[11]: https://opensource.com/alternatives/matlab diff --git a/sources/tech/20200814 7 tips for giving and receiving better feedback.md b/sources/tech/20200814 7 tips for giving and receiving better feedback.md new file mode 100644 index 0000000000..be6dc492df --- /dev/null +++ b/sources/tech/20200814 7 tips for giving and receiving better feedback.md @@ -0,0 +1,135 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (7 tips for giving and receiving better feedback) +[#]: via: (https://opensource.com/article/20/8/better-feedback) +[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) + +7 tips for giving and receiving better feedback +====== +Good feedback is important for growing, learning, and improving. +![Pair programming][1] + +Getting feedback isn't always easy to handle, but we need to hear it to grow and learn. Feedback can take many forms—from formalized feedback in performance reviews to more informal feedback such as: + + * Code reviews + * Peer reviews of writing + * Comments for a speaker + * Recommending revisions to a resume + + + +There is an art to giving, asking for, and receiving feedback in a way that is actionable and helps people improve. To narrow down this topic, I'll focus on feedback related to writing (as that is one of my specialties), but many of these lessons apply to any type of feedback you need to give or receive. + +### Tips for giving feedback + +If you've been asked to give feedback, first, confirm you understand what type of feedback is being requested. The person asking for feedback should provide guidelines for what you should focus on. If you don't know what type of feedback to give, ask. Also, make sure to ask when they need the feedback. If you can't meet their deadline, let them know. Maybe the timeline is flexible. If not, they have the opportunity to find somebody else to help. + +It's OK to say no—a short message declining the request and explaining why is much better than ignoring it and potentially making the person miss their deadline. + +#### Content vs. style + +There are many different ways to write a sentence, and everybody has their own style. Focus on the content of what was said rather than how it was said. Unless you've been explicitly asked to help rewrite an article, don't worry if you would have said something differently. If the correct meaning is conveyed, that is what matters. + +For example, these sentences all say roughly the same thing. + +> A large part of building and operating software is learning what works and what doesn't. +> +> Software engineers spend a great deal of time determining what works and what does not work when building and operating software. +> +> Software engineers expend a considerable amount of time ascertaining the effectiveness and interoperability of software and hardware. + +The "right" version has everything to do with the writer's and the audience's preferred style. + +#### Clarity + +This doesn't mean you shouldn't be concerned about clarity. If something is unclear, speak up. It helps when you provide context about why you found something confusing or vague (again, clarity matters). The writer might not know where you are getting hung up. + +This is unclear feedback: + + * "This is confusing." + * "What do you mean here?" + + + +Better feedback (this is all real feedback I've either given or received recently): + + * "I think this could use a little clarification on what you mean by 'we.'" + * "Do you mean a team with a single project, or do you mean to choose a single team?" + + + +If you have time and it's possible, provide suggestions on how it can be made clearer for you, such as: + + * "On a hasty reading, I initially misinterpreted this as claiming x (whereas obviously, you meant the opposite)." + + + +#### Twice as nice + +Read the entire content at least twice. The first time you read it, don't leave any comments or make any suggestions; just read to see what information is covered. Otherwise, you might suggest that a specific topic should be included—then see it two paragraphs later. + +#### Leave positive feedback + +Often when we give feedback, we focus only on the areas that need improvement. If there is something you like, share that feedback as well. Writers want to know what resonates, as well as what didn't quite hit the mark. What made you laugh or cringe? What did you learn? + +### Tips for getting feedback + +A great way to receive feedback is by asking for it. Here are some suggestions that will help you get feedback that's most useful to you. + +#### Be specific + +When you request feedback, tell your reviewers exactly what you are looking for, including what specific areas you want people to focus on and what not to worry about. + +This request is vague: + +> "Can you please read this and let me know what you think?" + +The reviewer doesn't know if you're asking them to review for technical accuracy, grammar, or something else. I sometimes forget to do this when I ask for feedback, and thankfully, I have a colleague who will follow-up and ask for more context by asking, "What level and depth of review are you looking for?" + +Since I'm trying to get better at giving specifics when asking for feedback, I often leave comments in my articles for my reviewers with questions I have, things I'm struggling with, or areas I think are weak and need improvement. + +Here's a good example from one of my colleagues on asking for specific feedback: + +> "I'd hugely appreciate any comments on this, especially things I have wrong, or over/understate, or other things to include (some of which may be punted to the next version, but hearing them now would still be very useful)." + +#### State your deadline + +Make sure to include a timeframe when you need their feedback. You don't want review cycles dragging on and blocking your progress while you're waiting for feedback. Give reasonable deadlines, and if there is a need for urgency, explain why. You might say: + +> "Can you review this for technical accuracy and readability by the end of the week? Don't worry about grammar. I'll make those edits later." + +Or + +> "Can you provide copy-editing by the end of the day? This needs to be published tomorrow to coincide with our launch." + +#### Decide what to include + +You may not agree with all the feedback you hear. It is up to you as the writer whether to incorporate it or not. I highly encourage you to incorporate feedback that points out blatant errors. The feedback that can be more challenging is differences of opinion, stylistic changes, etc. I often schedule meetings to review the feedback if there are differing viewpoints. Talking can often clarify things faster than writing comments back and forth. + +### Conclusion + +Asking for feedback can trigger [imposter syndrome][2]. That won't necessarily go away, but giving good feedback (even if it is negative feedback) can help a writer overcome that feeling. + +If you're interested in ways to become a better writer, I've previously written about my [writing process][3], which includes multiple feedback loops. + +As a writer, your job is to write content that people enjoy, resonates with your readers, and serves a purpose. As a reviewer, your job is to share what you learned and what was confusing. These tips can help you give and receive better feedback. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/better-feedback + +作者:[Dawn Parzych][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dawnparzych +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/collab-team-pair-programming-code-keyboard.png?itok=kBeRTFL1 (Pair programming) +[2]: https://opensource.com/article/19/11/my-first-open-source-contribution-impostor-syndrome +[3]: https://opensource.com/article/20/5/write-about-open-source-software diff --git a/sources/tech/20200814 Fixing -Unable to correct problems, you have held broken packages- Error in Ubuntu and other Linux Distributions.md b/sources/tech/20200814 Fixing -Unable to correct problems, you have held broken packages- Error in Ubuntu and other Linux Distributions.md new file mode 100644 index 0000000000..4ce4dcf89e --- /dev/null +++ b/sources/tech/20200814 Fixing -Unable to correct problems, you have held broken packages- Error in Ubuntu and other Linux Distributions.md @@ -0,0 +1,163 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Fixing “Unable to correct problems, you have held broken packages” Error in Ubuntu and other Linux Distributions) +[#]: via: (https://itsfoss.com/held-broken-packages-error/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Fixing “Unable to correct problems, you have held broken packages” Error in Ubuntu and other Linux Distributions +====== + +While there are [various ways to install applications in Ubuntu][1], I prefer to use the apt command in the terminal for installing software. + +If you do the same, you may come across a dependency error like this: + +``` +Some packages could not be installed. This may mean that you have +requested an impossible situation or if you are using the unstable +distribution that some required packages have not yet been created +or been moved out of Incoming. +The following information may help to resolve the situation: + +The following packages have unmet dependencies: + green-recorder : Depends: python-urllib3 but it is not installable +E: Unable to correct problems, you have held broken packages. +``` + +Usually on It’s FOSS, you’ll find simple and easy to follow solutions to complicated problems. Unfortunately, this one is not that straightforward. + +In this troubleshooting article, I’ll tell you why this error occurs and give some pointers on how to go about solving this issue. + +### Why do you see the “you have held broken packages” error? + +![][2] + +You were trying to install an application package, most probably from a [PPA][3] or third-party repository. + +Applications often need specific versions of libraries and software component (called dependencies). These dependencies may not be part of the application package itself, but they are expected to either be installed on your system already or installed during the installation of the application. + +Your Linux system tries to install these dependencies on its own. But if the dependency package version is not available on your system, it gets confused as it has no way to solve this dependency problem. + +This is why it informs you that the software you were trying to install depends on XYZ but this XYZ cannot be installed. + +Another usecase is when your package can be held is when you try to install two versions of the same software. Say you are installing a specific version of Wine when you have another one installed already. + +### How to go about fixing the “Unable to correct problems, you have held broken packages” error + +You can try a few things to make things work. You need to have some ideas on installing/removing packages in Linux command line to work things out here. + +#### Make sure that your system’s package cache is updated + +First, make sure that local package cache is updated. Your system checks this cache for the available packages. It’s possible (but not certain) that the dependency package is seen by the system after the cache update. + +``` +sudo apt update +``` + +Try installing the troublesome package again and see if it fixes the problem. + +#### Install the dependency + +If you try to install the troublesome package again and it still complains about the same dependency error than perhaps that dependency is not available for distribution version. + +You may [use the apt search command][4] see if you could this library from some other package or name: + +``` +sudo apt search package_name +``` + +If the package is available, is it the same version as requested by the package you were trying to install? + +Try to install the dependency package and see what happens: + +``` +sudo apt install dependency_package +``` + +You may encounter a dependency chain. You try to install dependency A but it complains of B. Then you try installing B and it complains of C. + +It may also happen that when you try to install package C, it is already installed. Check the version of package C. Is it the same version as required by package B? If yes, then removing C and installing it again could help. + +#### Can you get the missing dependency package from some other source? + +If the missing dependency package cannot be found on your system (no results in apt search), you may try to get the dependency package from some place else. I know that’s not very convenient thing to do but you don’t have many options here. + +For example, in the case of installing shutter, it complained about libgoo-canvas-perl and this library is no more available on Ubuntu system. + +``` +sudo apt install shutter +Reading package lists... Done +Building dependency tree +Reading state information... Done +Some packages could not be installed. This may mean that you have +requested an impossible situation or if you are using the unstable +distribution that some required packages have not yet been created +or been moved out of Incoming. +The following information may help to resolve the situation: + +The following packages have unmet dependencies: + shutter : Depends: libgoo-canvas-perl but it is not going to be installed +E: Unable to correct problems, you have held broken packages. +``` + +However, since it was available in the previous versions of Ubuntu, I looked for this package on Ubuntu’s package archive and found it under the listing of Ubuntu 14.04 [here][5]. I downloaded the .DEB file and installed it. + +Now that this dependency package is installed, trying to install the original application (shutter in this case) should not complain about at least this package anymore. + +#### If you cannot find the dependency package anywhere, install the troublesome package from some other source + +So in the example above, I tried to install Green Recorder application using its PPA. This application needs `python-urllib3` library but unfortunately, this library is not available in my Ubuntu 20.04 system. + +``` +[email protected]:~$ apt search python-urllib3 +Sorting... Done +Full Text Search... Done +``` + +Clearly, this is a poorly packaged application. The developer made it available for Ubuntu 20.04 without realizing that Ubuntu 20.04 doesn’t support Python 2 anymore and all the Python libs now start with python3 prefix. So the python-urllib3 should be python3-urllib3. + +If you are in such a situation, maybe check the project’s homepage or search on the internet for an alternate source for installing it. Perhaps there is a Snap/Flatpak version or some user created a PPA for it? If nothing else, you may go with source code option as well. + +#### If you see the held broken package error during update try this + +Most of the discussion so far assumed that you see this error while installing a new application. That may not always be the case. + +If you see this error when you try updating your system with sudo apt update command, then you’ll have to take a slightly different approach. + +First, check which package is being held with this command: + +``` +dpkg --get-selections | grep hold +``` + +If you see some packages being held, remove them and then go on updating your system or installing the software. + +You may also [use Synaptic package manager][6] for fixing the broken packages. + +#### Did you manage to fix the issue? + +As I had mentioned earlier, there is no straightforward fix for this problem. You’ll have to investigate on your own and see if it can be fixed or not. + +Please share in the comments if your problem gets fixed. If not, I may try to help you out. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/held-broken-packages-error/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/remove-install-software-ubuntu/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/broken-package-error-ubuntu.png?resize=800%2C450&ssl=1 +[3]: https://itsfoss.com/ppa-guide/ +[4]: https://itsfoss.com/apt-search-command/ +[5]: https://launchpad.net/ubuntu/+source/libgoo-canvas-perl +[6]: https://itsfoss.com/synaptic-package-manager/ diff --git a/sources/tech/20200818 D Declarations for C and C-- Programmers.md b/sources/tech/20200818 D Declarations for C and C-- Programmers.md new file mode 100644 index 0000000000..236458f193 --- /dev/null +++ b/sources/tech/20200818 D Declarations for C and C-- Programmers.md @@ -0,0 +1,310 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (D Declarations for C and C++ Programmers) +[#]: via: (https://theartofmachinery.com/2020/08/18/d_declarations_for_c_programmers.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) + +D Declarations for C and C++ Programmers +====== + +Because D was originally created by a C++ compiler writer, Walter Bright, [it’s an easy language for C and C++ programmers to learn][1], but there are little differences in the way declarations work. I learned them piecemeal in different places, but I’m going to dump a bunch in this one post. + +### `char* p` + +If you want to declare a pointer in C, both of the following work: + +``` +char *p; +char* p; +``` + +Some people prefer the second form because it puts all the type information to one side. At least, that’s what it looks like. Trouble is, you can fall into this trap: + +``` +char* p, q; // Gotcha! p is a pointer to a char, and q is a char in C +``` + +“Type information on the left” isn’t really how C works. D, on the other hand, _does_ put all the type information to the left, so this works the way it appears: + +``` +char* p, q; // Both p and q are of type char* in D +``` + +D also accepts the `char *p` syntax, but the rule I go by is `char *p` when writing C, and `char* p` when writing D, just because that matches how the languages actually work, so no gotchas. + +### Digression: how C declarations work + +This isn’t about D, but helps to make sense of the subtler differences between C and D declarations. + +C declarations are implicit about types. `char *p` doesn’t really say, “`p` is of type `char*`”; it says “the type of `p` is such that `*p` evaluates to a `char`”. Likewise: + +``` +int a[8]; // a[i] evaluates to an int (=> a is an array of ints) +int (*f)(double); // (*f)(0.5) evaluates to an int (=> f is a pointer to a function taking a double, returning an int) +``` + +There’s a kind of theoretical elegance to this implicit approach, but 1) it’s backwards and makes complex types confusing, 2) the theoretical elegance only goes so far because everything’s a special case. For example, `int a[8];` declares an array `a`, but makes the expression `a[8]` undefined. You can only use certain operations, so `int 2*a;` doesn’t work, and neither does `double 1.0 + sin(x);`. The expression `4[a]` is equivalent to `a[4]`, but you can’t declare an array with `int 4[a];`. C++ gave up on the theory when it introduced reference syntax like `int &x;`. + +### `function` and `delegate` + +D has a special `function` keyword for declaring function pointers using the “type information on the left” approach. It makes the declaration of function pointers use the same syntax as the declaration of a function: + +``` +int foo(); +int[] bar(); + +int function() foo_p = &foo; +int[] function() bar_p = &bar; +``` + +Note that the `&` is _required_ to get the address of a function in D (unlike in C and C++). If you want to have an array of pointers, you just add `[]` to the end of the type, just like you do with any other type. Similarly for making pointers to types: + +``` +int function()[] foo_pa = [&foo]; +int function()* foo_pp = &foo_p; +int function()[]* foo_pap = &foo_pa; +``` + +Here’s the C equivalent for comparison: + +``` +int (*foo_p)() = &foo; +int (*foo_pa[])() = {&foo}; +int (**foo_pp)() = &foo_p; +int (*(*foo_pap)[])() = &foo_pa; +``` + +It’s rare to need these complicated types, but the logic for the D declarations is much simpler. + +There’s also the `delegate` keyword, which works in exactly the same way for [“fat function pointers”][2]. + +### Arrays + +The most obvious difference from C is that D uses the “type information on the left” approach: + +``` +// int a[8]; is an error in D +int[8] a; +``` + +Another difference is in the order of indices for multidimensional arrays. E.g., this C code: + +``` +int a[4][64]; +``` + +translates to this in D: + +``` +int[64][4] a; +``` + +Here’s the rule for understanding the D ordering: + +``` +T[4] a; +static assert (is(typeof(a[0]) == T)); +``` + +If `T` represents a type, then `T[4]` is always an array of 4 `T`s. Sounds obvious, but it means that if `T` is `int[64]`, `int[64][4]` must be an array of 4 `int[64]`s. + +### `auto` + +C had `auto` as a storage class keyword since the early days, but it got mostly forgotten because it’s only allowed in the one place it’s the default, anyway. (It effectively means “this variable goes on the stack”.) C++ repurposed the keyword to enable automatic type deduction. + +You can also use `auto` with automatic type deduction in D, but it’s not actually required. Type deduction is always enabled in D; you just need to make your declaration unambiguously a type declaration. For example, these work in D (but not all in C++): + +``` +auto x1 = 42; +const x2 = 42; +static x3 = 42; +``` + +### No need for forward declarations at global scope + +This code works: + +``` +// Legal, but not required in D +// void bar(); + +void foo() +{ + bar(); +} + +void bar() +{ + // ... +} +``` + +Similarly for structs and classes. Order of definition doesn’t matter, and forward declarations aren’t required. + +Order does matter in local scope, though: + +``` +void foo() +{ + // Error! + bar(); + + void bar() + { + // ... + } +} +``` + +Either the definition of `bar()` needs to be put before its usage, or `bar()` needs a forward declaration. + +### `const()` + +The `const` keyword in C declarations can be confusing. (Think `const int *p` vs `int const *p` vs `const int const *p`.) D supports the same syntax, but also allows `const` with parentheses: + +``` +// non-constant pointer to constant int +const(int)* p1; +// constant pointer to constant int +const(int*) p2; +``` + +[`const` is transitive in D][3], anyway, and this syntax makes it much clearer. The same parenthetical syntax works with `immutable`, too. Although C-style syntax is supported by D, I always prefer the parenthetical style for a few more reasons. + +### `ref` + +`ref` is the D alternative to C++’s references. In D, `ref` doesn’t create a new type, it just controls how the instance of the type is stored in memory (i.e, it’s a storage class). C++ acts as if references are types, but references have so many special restrictions that they’re effectively like a complex version of a storage class (in Walter’s words, C++ references try to be both a floor wax and dessert topping). For example, C++ treats `int&` like a type, but forbids declaring an array of `int&`. + +As a former C++ programmer, I used to write D function arguments like this: + +``` +void foo(const ref S s); +``` + +Now I write them like this: + +``` +void foo(ref const(S) s); +``` + +The difference becomes more obvious with more complex types. Treating `ref` like a storage class ends up being cleaner because that’s the way it actually is in D. + +Currently `ref` is only supported with function arguments or `foreach` loop variables, so you can’t declare a regular local variable to be `ref`. + +### Function qualifiers + +D’s backward-compatible support for the C-style `const` keyword creates an unfortunate gotcha: + +``` +struct S +{ + // Confusing! + const int* foo() + { + // ... + } +} +``` + +`foo()` doesn’t return a `const int*`. The `const` applies to the `foo()` member function itself, meaning that it works on `const` instances of `S` and returns a (non-`const`) `int*`. To avoid that trap, I always use the D-style `const()` syntax, and write member function qualifiers on the right: + +``` +struct S +{ + const(int)* foo() + { + // ... + } + + int* bar() const + { + // ... + } +} +``` + +### Syntax ambiguities + +C++ allows initialising struct and class instances without an `=` sign: + +``` +S s(42); +``` + +This syntax famously leads to ambiguities with function declaration syntax in special cases (Scott Meyers’ “most vexing parse”). [People like Herb Sutter have written enough about it.][4] D only supports initialisation with `=`: + +``` +S s = S(42); +// Alternatively: +auto s = S(42); +``` + +C syntax has some weird corners, too. Here’s a simple one: + +``` +x*y; +``` + +That looks like a useless multiplication between two variables, but logically it could be a declaration of `y` as a pointer to a type `x`. Expression and declaration are totally different parses that depend on what the symbol `x` means in this scope. (Even worse, if it’s a declaration, then the new `y` could shadow an existing `y`, which could affect later parses.) So C compilers need to track symbols in a symbol table while parsing, which is why C has forward declarations in practice. + +D sidesteps the ambiguity by requiring a typecast to `void` if you really want to write an arithmetic expression without assigning it to anything: + +``` +int x, y; +cast(void)(x*y); +``` + +I’ve never seen useful code do that, but that rule helps D parse simply without forward declarations. + +Here’s another quirk of C syntax. Remember that C declarations work by having a basic type on the left, followed by expressions that evaluate to that type? C allows parentheses in those expressions, and doesn’t care about whitespace as long as symbols don’t run together. That means these two declarations are equivalent: + +``` +int x; +int(x); +``` + +But what if, instead of `int`, we use some symbol that might be a typedef? + +``` +int main() +{ + // Is this a declaration of x, or a function call? + t(x); +} +``` + +Just for fun, we can exploit shadowing and C’s archaic type rules: + +``` +typedef (*x)(); +main() +{ + x(x); + x(x); +} +``` + +The first line makes `x` a typedef to a function pointer type. The first `x(x);` redeclares `x` to be a function pointer variable, shadowing the typedef. The second `x(x);` is a function call that passes `x` as an argument. Yes, this code actually compiles, but it’s undefined behaviour because the function pointer is dereferenced without being initialised. + +D avoids this chaos thanks to its “all type information on the left” rule. There’s no need to put parentheses around symbols in declarations, so `x(y);` is always a function call. + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2020/08/18/d_declarations_for_c_programmers.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://ddili.org/ders/d.en/index.html +[2]: https://tour.dlang.org/tour/en/basics/delegates +[3]: https://dlang.org/articles/const-faq.html#transitive-const +[4]: https://herbsutter.com/2013/05/09/gotw-1-solution/ diff --git a/sources/tech/20200825 6 open source virtualization technologies to know in 2020.md b/sources/tech/20200825 6 open source virtualization technologies to know in 2020.md new file mode 100644 index 0000000000..445ac74641 --- /dev/null +++ b/sources/tech/20200825 6 open source virtualization technologies to know in 2020.md @@ -0,0 +1,177 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (6 open source virtualization technologies to know in 2020) +[#]: via: (https://opensource.com/article/20/8/virt-tools) +[#]: author: (Bryant Son https://opensource.com/users/brson) + +6 open source virtualization technologies to know in 2020 +====== +Run, customize, and manage your VMs with open source Virt Tools. Plus +get a glossary of key virtualization terms. +![What is virtualization][1] + +Virtualization Tools, better known as [Virt Tools][2], is a collection of six open source virtualization tools created by various contributors to make the virtualization world a better place. + +![Virt Tools website][3] + +(Bryant Son, [CC BY-SA 4.0][4]) + +Some of the tools, like KVM and QEMU, might be familiar to Linux enthusiasts, but tools like libvirt and libguestfs are probably less so. + +In case you prefer to learn through watching videos than reading, I created a [video version][5] of this article, which you can access on YouTube. + +Before walking through the tools, it's a good idea to know some essential [virtualization][6] terminology. I derived many of these definitions from Wikipedia, with pages linked in the table. + +Term | Definition +---|--- +[Virtualization][7] | In computing, virtualization refers to the act of creating a virtual (rather than physical) version of something, including virtual computer hardware platforms, storage devices, and computer network resources. +[Emulator][8] | An emulator is a hardware or software that enables one computer system (called the host) to behave like another computer system (called the guest). +[Virtual machine (VM)][9] | Also known as a "guest machine," these are emulations of real, physical hardware computers. +Hosts | In [hardware virtualization][10], a computer on which a hypervisor runs one or more VMs. +[Hypervisor][11] | This is computer software, firmware, or hardware that creates and runs a VMs. +[Kernel][12] | This is a computer program at the core of a computer's operating system with complete control over everything in the system. +[Daemon][13] | This is a computer program that runs as a background process, rather than under the direct control of an interactive user. + +This table summarizes each Virt Tool, including license information and links to each tool's website and source code. Much of this information comes from the Virt Tools website and each tool's site. + +Name | What It Is | License | Source Code +---|---|---|--- +[Kernel-based Virtual Machine (KVM)][14] | A virtualization module in the Linux kernel that allows the kernel to function as a hypervisor | GNU GPL or LGPL | [Source code][15] +[Quick Emulator (QEMU)][16] | A generic and open source machine emulator and virtualizer | GPLv2 | [Source code][17] +[Libvirt][18] | A library and daemon providing a stable, open source API for managing virtualization hosts | GNU | [Source code][19] +[Libguestfs][20] | A set of tools for accessing and modifying VM disk images | LGPL, GPL | [Source code][21] +[Virt-manager][22] | A desktop user interface for managing VMs through libvirt | GPLv2+ | [Source code][23] +[Libosinfo][24] | Provides a database of information about operating system releases to assist in optimally configuring hardware when deploying VMs | LGPLv2+ | [Source code][25] + +### Kernel-based Virtual Manager (KVM) + +![KVM website][26] + +(Bryant Son, [CC BY-SA 4.0][4]) + +KVM is a full virtualization solution for Linux on hardware containing virtualization extensions. KVM provides the hardware virtualization for a wide variety of guest operating systems, including Linux, Windows, macOS, ReactOS, and Haiku. Using KVM, you can run multiple VMs on unmodified Linux or Windows images. Each VM has private virtualized hardware: a network card, disk, graphics adapter, etc. + +Most of the time, you won't directly interact with KVM. Instead, you must use QEMU, virt-manager, or another virtualization management tool to leverage KVM. + +You can find full [documentation][27] on the KVM website, as well as access its [source code][15]. + +### Quick Emulator (QEMU) + +![QEMU website][28] + +(Bryant Son, [CC BY-SA 4.0][4]) + +QEMU is a generic, open source machine emulator and virtualizer. When used as an emulator, QEMU can run operating systems and programs made for one machine (e.g., an ARM board) on a different machine (e.g., your own x86_64 PC). When used as a virtualizer, QEMU achieves near-native performance by executing the guest code directly on the host CPU using KVM. + +QEMU is supported on multiple operating systems, and its installation process is as easy as running a few simple commands; here, you can see how to install QEMU on macOS with [Homebrew][29]. + +![QEMU macOS installation info][30] + +(Bryant Son, [CC BY-SA 4.0][4]) + +After installing, learn how to use it by reading through its [documentation][31], and you can also access its [source code][17]. + +### Libvirt + +![Libvirt website][32] + +(Bryant Son, [CC BY-SA 4.0][4]) + +Libvirt is a library and daemon that provides a stable open source API for managing virtualization hosts. It targets multiple hypervisors, including QEMU, KVM, LXC, Xen, OpenVZ, VMWare ESX, VirtualBox, and more. + +Another interesting thing about libvirt is that [KubeVirt][33], an open source project for creating and managing VMs inside the Kubernetes platform, largely utilizes Libvirt. (I'll cover KubeVirt in a future article.) Libvirt is an interesting project to explore, and you can find a plethora of information on its official [website][18] as well as download its [source code][21]. + +### Libguestfs + +![Libguestfs website][34] + +(Bryant Son, [CC BY-SA 4.0][4]) + +Libguestfs is a set of tools for accessing and modifying VM disk images. You can use it for viewing and editing files inside guests; scripting changes to VMs; monitoring disk used/free statistics; creating guests, physical to virtual (P2V), or virtual to virtual (V2V) machines; performing backups; cloning VMs; building VMs; formatting disks; resizing disks; and much more. I have been using it recently while working on a KubeVirt-based project called [OpenShift Virtualization][35], which you can learn more about in my [video tutorial][36]. + +Libguestfs' official [website][20] contains extensive documentation on how to use each command, and you can also download its [source code][21] on GitHub. + +### Virt-manager + +![Virt-manager website][37] + +(Bryant Son, [CC BY-SA 4.0][4]) + +Virt-manager is a desktop user interface for managing VMs through libvirt. It primarily targets KVM VMs but also manages Xen and LXC. It also includes the command line provisioning tool virt-install. Think of virt-manager as an easy-to-use management tool for your VMs. For example, you can use virt-manager to run a Microsoft Windows environment on a Linux workstation or vice versa. + +Virt-manager's [source code][23] is available on GitHub and [documentation][38] is on its website. At this time, virt-manager is only available for Linux platforms. + +### Libosinfo + +![Libosinfo website][39] + +(Bryant Son, [CC BY-SA 4.0][4]) + +Libosinfo provides a database of information about operating system releases to assist in configuring hardware when deploying VMs. It includes a C library for querying information in the database, which is also accessible from any language supported by GObject introspection. As you may guess, libosinfo is more of a building block to enable an operating system's functionality—but quite an important one. + +Libosinfo's [source code][25] is available on GitLab, and its [documentation][40] can be found on at its website. + +### Conclusion + +Virt-tools is a set of six powerful tools that make virtualization easier and enable important virtualization functions. All of them are open source projects, so I encourage you to explore further and maybe even contribute to them. + +What do you think? Feel free to leave a comment to share your thoughts or ask questions. + +Learn how Vagrant and Ansible can be used to provision virtual machines for web development. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/virt-tools + +作者:[Bryant Son][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/what_is_virtualization.png?itok=e4WCa7N_ (What is virtualization) +[2]: https://www.virt-tools.org/ +[3]: https://opensource.com/sites/default/files/uploads/1_virttools.jpg (Virt Tools website) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://youtu.be/E6TBDh2RLY8 +[6]: https://www.redhat.com/en/topics/virtualization/what-is-virtualization +[7]: https://en.wikipedia.org/wiki/Virtualization +[8]: https://en.wikipedia.org/wiki/Emulator +[9]: https://en.wikipedia.org/wiki/Virtual_machine +[10]: https://en.wikipedia.org/wiki/Hardware_virtualization +[11]: https://en.wikipedia.org/wiki/Hypervisor +[12]: https://en.wikipedia.org/wiki/Kernel_%28operating_system%29 +[13]: https://en.wikipedia.org/wiki/Daemon_%28computing%29 +[14]: https://www.linux-kvm.org/page/Main_Page +[15]: https://git.kernel.org/pub/scm/virt/kvm/kvm.git +[16]: https://www.qemu.org +[17]: https://git.qemu.org/git/qemu.git +[18]: https://libvirt.org +[19]: https://libvirt.org/git/?p=libvirt.git +[20]: http://libguestfs.org/ +[21]: https://github.com/libguestfs/libguestfs +[22]: https://virt-manager.org +[23]: https://github.com/virt-manager/virt-manager +[24]: https://libosinfo.org/download/ +[25]: https://gitlab.com/libosinfo/libosinfo +[26]: https://opensource.com/sites/default/files/uploads/2_kvm.jpg (KVM website) +[27]: https://www.linux-kvm.org/page/Documents +[28]: https://opensource.com/sites/default/files/uploads/3_qemu.jpg (QEMU website) +[29]: https://opensource.com/article/20/6/homebrew-mac +[30]: https://opensource.com/sites/default/files/uploads/3_1_qemuinstall.jpg (QEMU macOS installation info) +[31]: https://www.qemu.org/documentation/ +[32]: https://opensource.com/sites/default/files/uploads/4_libvirt.jpg (Libvirt website) +[33]: https://kubevirt.io/ +[34]: https://opensource.com/sites/default/files/uploads/5_libguestfs.jpg (Libguestfs website) +[35]: https://www.openshift.com/blog/blog-openshift-virtualization-whats-new-with-virtualization-from-red-hat +[36]: https://www.youtube.com/watch?v=tWPC-YER1I0 +[37]: https://opensource.com/sites/default/files/uploads/6_virtualmanager.jpg (Virt-manager website) +[38]: https://virt-manager.org/documentation/ +[39]: https://opensource.com/sites/default/files/uploads/7_libosinfo.jpg (Libosinfo website) +[40]: https://libosinfo.org/documentation/ diff --git a/sources/tech/20200825 How to choose an affordable Linux laptop for video conferencing.md b/sources/tech/20200825 How to choose an affordable Linux laptop for video conferencing.md new file mode 100644 index 0000000000..1f58942551 --- /dev/null +++ b/sources/tech/20200825 How to choose an affordable Linux laptop for video conferencing.md @@ -0,0 +1,75 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to choose an affordable Linux laptop for video conferencing) +[#]: via: (https://opensource.com/article/20/8/linux-laptop-video-conferencing) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) + +How to choose an affordable Linux laptop for video conferencing +====== +Open source can give pre-owned computers the necessary boost to make +them useful with today's popular video conferencing tools. +![Two people chatting via a video conference app][1] + +As more and more activities move online during the global pandemic, an increasing number of folks are looking for affordable and stable solutions to connect to their doctor, therapist, bank, college, and more. Many of the folks I've been working with are on limited incomes, and they're eager for any technical help they can get. + +Whether they're on a proprietary video conferencing solution or using an [open source one like Jitsi Meet][2], everyone needs a platform that's robust enough to support their needs without breaking the budget. One of the leading cloud video conferencing providers [recommends][3] that platforms should have at least an i3 processor or equivalent with a minimum of 4GB RAM. My experience has taught me that an i5 or equivalent and at least 4-8GB RAM is even better. + +I also recommend Linux for running meeting solutions. You could go out and purchase a new Linux computer. However, if you're on a limited income, then plunking down $1000 or more for a new system might not be what you had in mind. + +A more budget-friendly solution I recently put together for a friend was a 2015 MacBook Air running Elementary OS. The computer had 4GB RAM, an i5 processor, and 240GB NVMe solid-state drive. Elementary OS was a great choice for this computer, as it came with a Broadcom 4360 wireless card, which didn't play nice with other Linux distributions but was detected by Elementary. The FaceTime camera didn't work with any Linux distribution I tried, Elementary included, and no one seems to have a good solution, so I purchased a USB camera and connected it to the laptop. This fellow needed to use Zoom to connect to his church, so I downloaded the [Zoom client][4] for Linux and installed it. The software download supports .rpm, .deb, and [Flatpak][5]. + +In another case, I purchased a refurbished PC laptop from a prominent vendor. It came with 8GB RAM, i5, webcam, and 256 SSD drive. I'm going to install either Fedora or Pop!_OS on it along with the Zoom client and the usual complement of free software, including LibreOffice, Calibre, ClamAV, Gnu Chess, and other games for my friend to explore. + +### Used laptops for Linux + +When looking for a used laptop, I usually consider the reputation of the brand. I check for the same or similar models and their compatibility with Linux. Both [Fedora][6] and [Ubuntu][7] maintain lists of acceptable hardware platforms. If possible, I try to get a list of the included hardware. For example, what is the CPU model and speed? Does the unit have Bluetooth built-in? How many USB ports does it have? Does it have audio ports? Does it support Thunderbolt? Does it have built-in WiFi, and what is the chipset of the WiFi adapter? I have had good luck with Intel, Broadcom, and Realtek, though the list varies depending on your particular needs. + +There are many sources of good used laptops and desktops, but my favorites are eBay, [Dell Refurbished][8], and [PC Liquidations][9]. I look for units that are three to five years old, that are in good condition, and that have at least an Intel i3 or AMD FX-6300, or better, processor. CPU speed and at least 4 GB RAM are important if you are going to be using your Linux laptop or desktop for video conferencing. Check to make sure the unit you purchase has a power supply. It's handy to have a webcam, but that's not a dealbreaker because you can use a USB camera. I have had good experiences with Logitech web cameras. + +### Refurbishing computers + +When refurbishing older laptops or desktop computers, you'll often find older system components such as a mechanical hard drive or WiFi card that doesn't support the latest wireless technology. These can usually be remedied with a small amount of effort and a minimal budget. For instance, replacing an old hard drive with a solid-state drive (SSD) will usually provide an immediate performance boost. You can also purchase newer WiFi + Bluetooth cards. Most likely, the form factor on a laptop will be Mini PCI but do your research to be sure. This allows you to choose a brand and chipset that might be better supported by Linux. RAM can also be increased. 4GB is definitely my minimum, but I'd much rather have 8GB. I also like to install the latest BIOS, if it is available from the respective vendor, in order to have the latest fixes and features. + +A lot of this advice also applies to desktop systems. You'll generally have more flexibility with these since there are more card slots and other connectors for peripherals. For instance, an older system may not support new technology such as Bluetooth, WiFi, or USB3. Add-in PCI or PCIe cards can be installed to provide this support. + +### Choosing a Linux distribution for an old computer + +The last piece of the puzzle is choosing a Linux distribution for your rescued computer. There are many distributions out there, and though they do like to highlight their own unique spin on providing a [Linux desktop][10], at the end of the day, they're all Linux. When it comes to installing Linux on an old computer, the best one is the one that works on the computer you have. + +The key is to step through the install process (it's not much more complex than installing an office application or a new web browser) and then see how your computer responds when you reboot it. If you get a desktop to come up and you can open and run basic applications, then you're on the right track. + +Once you're satisfied that you have a working computer with a desktop and access to the Internet, give your usual video conferencing application a try. If it fails, try a lightweight Linux distribution in hopes that using fewer resources for your OS can solve any video issues. + +Also, if your camera is HiDef (high definition or HD), then try setting it to broadcast at a lower resolution. Sometimes this can improve your system's performance because you're sending less data over what's probably an old network card with a limited capacity. + +I recommend trying [Elementary OS][11] or [Fedora Linux][12] for recent computers. For very old computers, try [Peppermint OS][13], which is specifically designed for computers without many resources. The great news is there are multiple ways to use open source solutions to turn your old machine into a modern communication platform. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/linux-laptop-video-conferencing + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/chat_video_conference_talk_team.png?itok=t2_7fEH0 (Two people chatting via a video conference app) +[2]: https://opensource.com/article/20/5/open-source-video-conferencing +[3]: https://support.zoom.us/hc/en-us/articles/201362023-System-requirements-for-Windows-macOS-and-Linux +[4]: https://zoom.us/download +[5]: https://flathub.org/apps/details/us.zoom.Zoom +[6]: https://docs.fedoraproject.org/en-US/fedora/rawhide/release-notes/welcome/Hardware_Overview/ +[7]: https://certification.ubuntu.com/ +[8]: https://www.dellrefurbished.com/laptops +[9]: https://www.pcliquidations.com/ +[10]: https://opensource.com/article/20/5/linux-desktops +[11]: https://elementary.io/ +[12]: http://getfedora.org/ +[13]: https://peppermintos.com/ diff --git a/sources/tech/20200829 5 open source activities for kids to try this weekend.md b/sources/tech/20200829 5 open source activities for kids to try this weekend.md new file mode 100644 index 0000000000..a6cb0f4cb5 --- /dev/null +++ b/sources/tech/20200829 5 open source activities for kids to try this weekend.md @@ -0,0 +1,65 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (5 open source activities for kids to try this weekend) +[#]: via: (https://opensource.com/article/20/8/open-source-kids) +[#]: author: (Lauren Pritchett https://opensource.com/users/lauren-pritchett) + +5 open source activities for kids to try this weekend +====== +These open source boredom busters will keep kids of all ages busy having +fun. +![Family learning and reading together at night in a room][1] + +During the last six months or so, my family and I have enjoyed a slower pace of life. With few museums and parks open, we’ve stayed safer at home together or going on outdoor excursions. My young children are pretty good at creating their imaginary worlds where they could play for hours. I think they are adapting to this new normal better than I am to tell you the truth. However, there will be weekends when we have all run out of ideas. Luckily, Opensource.com is chock full of boredom-busters for kids of all ages. In this article, I rounded up a few of our more recent open source activities for kids.  + +## [Create coloring book pages with Jupyter][2] + +My toddler uses crayons, markers, pencils, or any other writing utensil available on every sheet of paper in the house. Being surrounded by original artwork is fabulous, but he is running out of coloring page designs! With Jupyter, you can have an endless supply of coloring sheets at the ready for kids. Browse Creative Commons for images and use the magic of Python and Jupyter to turn them into one-of-a-kind coloring pages. + +## [Go to an open source scavenger hunt][3] + +When I was a kid, my brother and I each had a massive map of the United States on our bedroom wall. Each time we visited a new state, we highlighted it on our map. Since he is a few years older than me, I was continually playing catch-up, but eventually we evened the tally. This early exposure cultivated a lifelong interest in maps for both of us. These days, we can access and contribute to maps right from the palm of our hands with OpenStreetMap. The StreetComplete mobile app makes it possible to find and complete quests the whole family can enjoy together. Go on a scavenger hunt while helping out your community! + +## [Build a video game to learn Python][4] + +Seasoned educators know that the best way to teach a new subject is to turn it into a game. Author [Moshe Zadka][5] is one of those educators. He designed a Jupyter Notebook to teach people Python by making an interactive game. With Python and Git installed on your computer, you and your child can follow the steps in his tutorial. By the end, you will be having so much fun playing a penguin video game!  + +**[Read next: [Programmable tanks and Raspberry Pi: Try these kid tech projects][6]]** + +## [Experiment with open source robotics][7] + +Last fall, author [Jess Weichler][8] shared a list of her favorite maker gifts for kids and teens. It featured [Hummingbird][9], an open source robotics kit ideal for kids ages eight and up. Since it supports several popular programming languages, kids can have fun practicing their coding skills. Hummingbird is compatible with Linux, Windows, Mac, Chromebook, Android, and iOS. + +## [Play with virtual LEGOs][10] + +Have you ever stepped on a rogue LEGO brick? It’s a pain one never forgets. I love watching my daughter build cars, ice cream stands, and castles with her LEGO bricks. Our household’s cardinal rule is to keep LEGO bricks off the floor. This is easier said than done! Playing with virtual LEGOs is a much safer route to take. [Seth Kenlon’s][11] tutorial walks LEGO lovers through using open source tools to build and play with virtual bricks. + +How have you been keeping yourself and the young people around you entertained? Share your ideas in the comments. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/8/open-source-kids + +作者:[Lauren Pritchett][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/lauren-pritchett +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/family_learning_kids_night_reading.png?itok=6K7sJVb1 (Family learning and reading together at night in a room) +[2]: https://opensource.com/article/20/8/edit-images-python +[3]: https://opensource.com/article/20/1/streetcomplete-crowdsource-maps +[4]: https://opensource.com/article/20/5/python-games +[5]: https://opensource.com/users/moshez +[6]: https://enterprisersproject.com/article/2020/7/raspberry-pi-tech-projects-kids +[7]: https://opensource.com/article/19/11/maker-gifts-kids +[8]: https://opensource.com/users/cyanide-cupcake +[9]: https://www.birdbraintechnologies.com/hummingbirdbit/ +[10]: https://opensource.com/article/20/6/open-source-virtual-lego +[11]: https://opensource.com/users/seth diff --git a/sources/tech/20200831 Tune up your sound with PulseEffects- Microphones.md b/sources/tech/20200831 Tune up your sound with PulseEffects- Microphones.md new file mode 100644 index 0000000000..a700b13747 --- /dev/null +++ b/sources/tech/20200831 Tune up your sound with PulseEffects- Microphones.md @@ -0,0 +1,90 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Tune up your sound with PulseEffects: Microphones) +[#]: via: (https://fedoramagazine.org/tune-up-your-sound-with-pulseeffects-microphones/) +[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/) + +Tune up your sound with PulseEffects: Microphones +====== + +![][1] + +The PulseEffects [app][2] is a full-featured set of modular effects you can use to adjust sound devices. In a [previous article][3], you learned how you can use PulseEffects to correct or enhance output devices like speakers. However, that’s not where its features stop. You can also enhance sound input devices such as microphones. This can help when recording sound for podcasts, videos, or the like. + +This article assumes you’ve already installed PulseEffects as shown in the [previous article][3]. It will not cover advanced topics like recording musical instruments, but it will show you how to do better voice or spoken-word recordings. + +### A word on microphones + +Microphones come in a variety of forms. The one almost every laptop user has at hand is the condenser microphone built into the hardware. These microphones are limited in terms of producing quality sound. They’re built to provide basic sound, and they will pick up a lot of environmental noise due to how they work. If you want better results for a voice recording, there are many choices available based on budget. + + * USB headset with built-in condenser microphone: Generally [budget-friendly][4] and almost always gives better results than a laptop’s built-in mic. The resulting sound can be somewhat harsh and tinny, but this can be corrected. Manufacturers such as Logitech make units that are plug-and-play ready for Linux. They show up as USB sound devices (both input and output). + * Handheld dynamic microphone: You’ll see the singer in a live band using one of these. You have to be close to them (and maintain that distance steadily) for best results, but they sound full and well-defined. These are typically [a little more expensive][5] than a USB headset. + * Large diaphragm condenser microphone: You’ll see this type used by a singer or speaker in a broadcast or recording studio. Like other condensers they pick up a lot of the surrounding environment. By being fairly close to the mic you can essentially “turn down” the rest of the room. You can find budget friendly, good quality large condensers [starting at the same price][6] as a good dynamic mic. Prices go up from there to astronomical levels! + + + +Most dynamic and large diaphragm condenser mics need to be plugged into a _digital audio interface_, using a microphone cable. This converts the signal from the mic into digital audio for the computer to use. However, you can find specialty mics made for direct connection via USB. These may be advertised as “podcaster mics,” and you can [save some money][7] using one of these, versus buying both a mic and an interface. + +### Making the mic sound better + +Effects help you improve the recorded sound of your microphone. Whether you know it or not, you hear these effects all the time in recorded sound — in music, in TV shows and movies, on professional podcasts, and via commercial and satellite radio. Engineers apply these effects using either hardware units, or via software. + +PulseEffects provides these effects in a software form, before your recording is saved on disk. Here is a list, in the order they are usually applied: + + * A _gate_ reduces or entirely mutes the microphone when sound falls below a certain level. With proper settings, when you start speaking, the gate quickly opens, unmuting the mic. When you finish, the gate closes and other environmental sound will be either silenced or much quieter. + * A _compressor_ reduces the dynamic range of the input. Louder sounds are caught by the compressor and squashed down. You then turn the entire signal up slightly to compensate. This way, quieter and louder sounds become closer in volume, making the sound more even and less “peaky.” This results in a more professional, polished sound that’s much more enjoyable for listeners. + * An _equalizer_ (EQ) tunes up the sound of the voice. Use it to mitigate tones in your voice that you find unflattering. In addition, when you speak close to a mic, the bass frequencies in the voice are unnaturally emphasized. Sound engineers call this the _proximity effect_. By using an EQ to roll off the low end frequencies, you can reduce this effect and create a more pleasant sound. + * A _limiter_ is often the last step in a signal chain. This effect puts an absolute limit on the volume of a sound, so that unexpectedly hard sounds (such as _p_ or _b_ sounds, called _plosives_) that aren’t caught by compression don’t distort and ruin your recording. + + + +### Dive into PulseEffects + +Open up the _PulseEffects_ app. In the top left corner, choose the microphone selector icon. This lets you set up the effects chain you want for the mic as an input device. As with output devices (speakers), you can save your effects chain as well. + +Use recording software that registers as a PulseAudio client to see your effects at work. The _PulseCaster_ app is one such app, but there are many others you can choose. + +### Tips from a mix engineer + +These guidelines may help you find the optimal sound. Remember that no two sound situations are ever the same. Use your ears, and do some test recordings, to figure out what’s best for your situation. + + * When you apply the gate, use a fast response of 5-10ms. The human voice has a significant “startup time,” so this speed makes the gate unnoticeable. Give the gate some time to close, though, so you don’t cut off the end of speech. Typically 100-200ms sounds fairly natural. A gain reduction of -12 or -18dB suffices to reduce environmental noise, and sounds more natural than more extreme values. + * If you find a module is overloading when you speak, either reduce the output of the effects module before it, or the input of the module itself. + * If you like the sound of your recorded voice without an EQ, use the _Filter_ module instead to simply apply a high pass filter. For male voices, use a roll-off frequency of 80-100 Hz. For female voices, use a higher value. If you set the filter too high, the recording may sound weak or nasal. + * Use a compressor ratio between 3 and 4 (this is actually 3:1 – 4:1) which works well with a human voice. An attack of 20ms and a release of 100-200ms is typical. + * You may want to try the _Deesser_ module as well, to reduce the “sizzling” of _s_, _z_, _t_, and _f_ sounds. Because voices vary so widely, you’ll need to tune this to taste. A split of 6kHz and a threshold of -18dB is a good place to start. + * A limiter setting of -1 to -3dB usually works well. Much lower settings result in a very “squashed” sounding track. In some cases that may be useful; in others it will sound unnatural. + + + +Refer to the previous article to save your effects chain. Remember, you can store multiple chains, and then select the one you want for your particular needs. + +* * * + +_Photo by [Jacek Dylag][8] on [Unsplash][9]_. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/tune-up-your-sound-with-pulseeffects-microphones/ + +作者:[Paul W. Frields][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/pfrields/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/08/pulseeffects-2-816x345.jpg +[2]: https://flathub.org/apps/details/com.github.wwmm.pulseeffects +[3]: https://fedoramagazine.org/tune-up-your-sound-with-pulseeffects-speakers/ +[4]: https://www.google.com/search?q=usb+headset+with+mic&tbm=shop +[5]: https://www.google.com/search?tbm=shop&q=handheld+dynamic+microphone +[6]: https://www.google.com/search?tbm=shop&q=large+condenser+microphone +[7]: https://www.google.com/search?tbm=shop&q=usb+microphone +[8]: https://unsplash.com/@dylu?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[9]: https://unsplash.com/s/photos/microphone?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20200901 Developing an email alert system using a surveillance camera with Node-RED and TensorFlow.js.md b/sources/tech/20200901 Developing an email alert system using a surveillance camera with Node-RED and TensorFlow.js.md new file mode 100644 index 0000000000..3733bab543 --- /dev/null +++ b/sources/tech/20200901 Developing an email alert system using a surveillance camera with Node-RED and TensorFlow.js.md @@ -0,0 +1,179 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Developing an email alert system using a surveillance camera with Node-RED and TensorFlow.js) +[#]: via: (https://www.linux.com/news/developing-an-email-alert-system-using-a-surveillance-camera-with-node-red-and-tensorflow-js/) +[#]: author: (Linux.com Editorial Staff https://www.linux.com/author/linuxdotcom/) + +Developing an email alert system using a surveillance camera with Node-RED and TensorFlow.js +====== + +## **Overview** + +In a previous article, we introduced [a procedure for developing an image recognition flow using Node-RED and TensorFlow.js.][1] Now, let’s apply those learnings from what we have done and develop an e-mail alert system that uses a surveillance camera together with image recognition. As shown in the following image, we will create a flow that automatically sends an email alert when a suspicious person is captured within a surveillance camera frame. + +![][2] + +## **Objective: Develop flow** + +In this flow, the image of the surveillance camera is periodically acquired from the webserver, and the image is displayed under the **“Original image”** node in the lower left. After that, the image is recognized using the **TensorFlow.js** node. The recognition result and the image with recognition results are displayed under the **debug** tab and the **“image with annotation”** node, respectively. + +![][3] + +If a person is detected by image recognition, an alert mail with the image file attached will be sent using the **SendGrid** node.  Since it is difficult to set up a real surveillance camera, we will use a sample [image sent by a surveillance camera in Kanagawa Prefecture of Japan][4]  to check the amount of water in the river. + +We will explain the procedure for creating this flow in the following sections. For the Node-RED environment, use your local PC, a Raspberry Pi, or a cloud-based deployment. + +## **Install the required nodes** + +Click the hamburger menu on the top right of the Node-RED flow editor, go to **“Manage palette” -> “Palette” tab -> “Install”** tab, and install the following nodes. + + * –[node-red-contrib-tensorflow][5]: Image recognition node using TensorFlow.js + * –[node-red-contrib-image-output][6]: Nodes that display images on the Flow Editor + * –[node-red-contrib-sendgrid][7]: Nodes that send mail using SendGrid + + + +## **Create a flow of acquiring image data** + +First, create a flow that acquires the image binary data from the webserver. As in the flow below, place an inject node (the name will be changed to **“timestamp”** when placed in the workspace), **http request** node, and **image preview** node, and connect them with wires in the user interface. + +![][8] + +Then double-click the **http request** node to change the node property settings. + +## **Adjust** _**http request**_ **node property settings** + +  + +Paste the URL of the surveillance camera image to the URL on the property setting screen of the **http request** node. (In Google Chrome, when you right-click on the image and select **“Copy image address”** from the menu, the URL of the image is copied to the clipboard.) Also, select **“a binary buffer”** as the output format. + +![][9] + +## **Execute the flow to acquire image data** + +Click the **Deploy** button at the top right of the flow editor, then click the button to the **inject** node’s left. Then, the message is sent from the **inject** node to the **http request** node through the wire, and the image is acquired from the web server that provides the image of the surveillance camera. After receiving the image data, a message containing the data in binary format is sent to the **image preview** node, and the image is displayed under the **image preview** node. + +![][10] + + An image of the river taken by the surveillance camera is displayed in the lower right. + +## **Create a flow for image recognition of the acquired image data** + +Next, create a flow that analyzes what is in the acquired image. Place a **cocossd** node, a **debug** node (the name will be changed to **msg.payload** when you place it), and a second **image preview** node. + +Then, connect the **output termina**l on the right side of the **http request** node, and the **input terminal** on the left side of the **cocossd** node. + +Next, connect the **output terminal** on the right side of the **cocossd** node and the debug node, the **output terminal** on the right side of the **cocossd** node, and the **input terminal** on the left side of the **image preview** node with the respective wires. + +Through the wire, the binary data of the surveillance camera image is sent to the **cocossd** node, and after the image recognition is performed using **TensorFlow.js,** the object name is displayed in the **debug** node, and the image with the image recognition result is displayed in the **image preview** node.  + +![][11] + +The **cocossd** node is designed to store the object name in the variable **msg.payload**, and the binary data of the image with the annotation in the variable **msg.annotatedInput**.  + +To make this flow work as intended, you need to double-click the **image preview** node used to display the image and change the node property settings. + +## **Adjust** _**image preview**_ **node property settings** + +By default, the **image preview** node displays the image data stored in the variable **msg.payload**. Here, change this default variable to **msg.annotatedInput**. + +![][12] + +## **Adjust** _**inject**_ **node property settings** + +Since the flow is run regularly every minute, the **inject** node’s property needs to be changed. In the **Repeat** pull-down menu, select **“interval”** and set **“1 minute”** as the time interval. Also, since we want to start the periodic run process immediately after pressing the **Deploy** button, select the checkbox on the left side of **“inject once after 0.1 seconds”.** + +![][13] + +## **Run the flow for image recognition** + +The flow process will be run immediately after pressing the **Deploy** button. When the person (author) is shown on the surveillance camera, the image recognition result **“person”** is displayed in the debug tab on the right. Also, below the **image preview** node, you will see the image annotated with an orange square. + +![][14] + +## **Create a flow of sending an email when a person caught in the surveillance camera** + +Finally, create a flow to send the annotated image by email when the object name in the image recognition result is **“person”**. As a subsequent node of the **cocossd** node, place a **switch** node that performs condition determination, a **change** node that assigns values, and a **sendgrid** node that sends an email, and connect each node with a wire. + +![][15] + +Then, change the property settings for each node, as detailed in the sections below. + +## **Adjust the** _**switch**_ **node property settings** + +Set the rule to execute the subsequent flow only if **msg.payload** contains the string **“person” ** + +To set that rule, enter **“person”** in the comparison string for the condition **“==”** (on the right side of the **“az”** UX element in the property settings dialog for the switch node). + +![][16] + +## **Adjust the** _**change**_ **node property settings** + +To attach the image with annotation to the email, substitute the image data stored in the variable **msg.annotatedInput** to the variable **msg.payload**. First, open the pull-down menu of **“az”** on the right side of the UX element of **“Target value”** and select **“msg.”**. Then enter **“annotatedInput”** in the text area on the right. + +![][17] + +If you forget to change to **“msg.”** in the pull-down menu that appears when you click **“az”,** the flow often does not work well, so check again to be sure that it is set to **“msg.”**. + +## **Adjust the** _**sendgrid**_ **node property settings** + +Set the API key from the [SendGrid management screen][18]. And then input the sender email address and recipient email address. + +![][19] + +Finally, to make it easier to see what each node is doing, open each node’s node properties, and set the appropriate name. + +## **Validate the operation of the flow to send an email when the surveillance camera captures a person in frame** + +When a person is captured in the image of the surveillance camera, the image recognition result is displayed in the debug tab the same as in the previous flow of confirmation and the orange frame is displayed in the image under the **image preview** node of **“Image with annotation”**. You can see that the person is recognized correctly. + +![][20] + +After that, if the judgment process, the substitution process, and the email transmission process works as designed, you will receive an email with the image file with the annotation attached to your smartphone as follows: + +![][21] + +## **Conclusion** + +By using the flow created in this article, you can also build a simple security system for your own garden using a camera connected to a Raspberry Pi. At a larger scale, image recognition can also be run on image data acquired using network cameras that support protocols such as [ONVIF][22]. + +*About the author: Kazuhito Yokoi is an Engineer at Hitachi’s OSS Solution Center, located in Yokohama, Japan. * + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/developing-an-email-alert-system-using-a-surveillance-camera-with-node-red-and-tensorflow-js/ + +作者:[Linux.com Editorial Staff][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/linuxdotcom/ +[b]: https://github.com/lujun9972 +[1]: https://www.linux.com/news/using-tensorflow-js-and-node-red-with-image-recognition-applications/ +[2]: https://www.linux.com/wp-content/uploads/2020/09/tensor1.png +[3]: https://www.linux.com/wp-content/uploads/2020/09/tensor2.png +[4]: http://www.pref.kanagawa.jp/sys/suibou/web_general/suibou_joho/html/camera/past0/p20102_0_6.html +[5]: https://flows.nodered.org/node/node-red-contrib-tensorflow +[6]: https://flows.nodered.org/node/node-red-contrib-image-output +[7]: https://flows.nodered.org/node/node-red-contrib-sendgrid +[8]: https://www.linux.com/wp-content/uploads/2020/09/tensor3.png +[9]: https://www.linux.com/wp-content/uploads/2020/09/tensor4.png +[10]: https://www.linux.com/wp-content/uploads/2020/09/tensor5.png +[11]: https://www.linux.com/wp-content/uploads/2020/09/tensor6.png +[12]: https://www.linux.com/wp-content/uploads/2020/09/tensor7.png +[13]: https://www.linux.com/wp-content/uploads/2020/09/tensor8.png +[14]: https://www.linux.com/wp-content/uploads/2020/09/tensor9.png +[15]: https://www.linux.com/wp-content/uploads/2020/09/tensor10.png +[16]: https://www.linux.com/wp-content/uploads/2020/09/tensor11.png +[17]: https://www.linux.com/wp-content/uploads/2020/09/tensor12.png +[18]: https://sendgrid.com/ +[19]: https://www.linux.com/wp-content/uploads/2020/09/tensor13.png +[20]: https://www.linux.com/wp-content/uploads/2020/09/tensor14.png +[21]: https://www.linux.com/wp-content/uploads/2020/09/tensor15.png +[22]: https://www.onvif.org/ diff --git a/sources/tech/20200901 How to Set Up Facial Recognition to Sign into Ubuntu and Other Linux Distributions.md b/sources/tech/20200901 How to Set Up Facial Recognition to Sign into Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..2d953732e0 --- /dev/null +++ b/sources/tech/20200901 How to Set Up Facial Recognition to Sign into Ubuntu and Other Linux Distributions.md @@ -0,0 +1,249 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to Set Up Facial Recognition to Sign into Ubuntu and Other Linux Distributions) +[#]: via: (https://itsfoss.com/face-unlock-ubuntu/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +How to Set Up Facial Recognition to Sign into Ubuntu and Other Linux Distributions +====== + +Despite all the concern, facial recognition is getting popular among consumers. Most recent Android and iOS devices have the feature to unlock the device with facial authentication. + +Once you get used to the face unlock or fingerprint unlock, typing password feels like a tedious, boring task. + +On Windows operating system, Microsoft provides the [Windows Hello][1] that allows instant authentication based on your face. + +On Linux, face unlock is not a built-in feature. No Linux distribution, as far as I know, provides face unlock feature out of the box. + +But as the saying goes, there is a shell, there is a way. In Linux, you’ll often find alternative things and tools that you can configure for a certain task. Remember the tutorial I wrote for [sharing mouse and keyboard between Linux and Raspberry Pi devices][2]? + +In this tutorial, I’ll show you how to set up face unlock in Ubuntu. You can use the tutorial for other Linux distributions as well. + +You need to be comfortable with the terminal and Linux commands because you’ll be using Linux command line tool. + +### Howdy: A Windows Hello Styled Facial Recognition Authentication System for Linux + +![][3] + +[Howdy][4] is an open source software that gives you the ability to login to your Linux system with face recognition. Consider it an open source Windows Hello alternative for Linux. Here, your data is stored locally on your computer. + +Howdy uses the built-in IR emitters and webcam combination to recognize your face. It is built using [OpenCV][5] and Python. + +Howdy uses the PAM authentication system which means not only you can login to your system with your face, you can also use it for sudo, su and in most other situations where you need to use your account password. However, in my testing, it could not unlock the [keyring in Ubuntu][6]. + +In this tutorial, I’ll show you how to install Howdy and how to set it up for facial recognition. The process is not too complicated but you should not be too uncomfortable using the terminal here. + +### Installing Howdy on Ubuntu and other Linux distributions + +The developer of [Howdy provides a handy PPA][7] that makes installing Howdy easier to install on Ubuntu-based distributions. + +Open a terminal and use the following commands on Ubuntu: + +``` +sudo add-apt-repository ppa:boltgolt/howdy +sudo apt update +sudo apt install howdy +``` + +Howdy is a big software and it installs a huge number of software libraries. For me, it showed around 140 MB of download size and 600 MB of disk size requirement after installation. + +During the installation, it asks you to choose from Fast, Balanced and Secure authentication type. I chose Balanced at this step because I don’t want to wait too long but don’t want it to be less secure as well. + +![][8] + +During the installation, it complains about adding **/usr/local/bin** in the PATH but for me it was already there. You may verify it for your system. + +#### Installing Howdy on other Linux distributions + +For Debian, you can [download the DEB file][9]. Arch/Manjaro users can install it from [AUR][10]. + +Fedora users have the option to [use COPR repository][11]: + +``` +sudo dnf copr enable luya/howdy +sudo dnf install howdy +``` + +openSUSE users can find the installation instructions [here][12]. + +As the last resort, you can get the source code on [its GitHub repository][4]. + +Since I am using Ubuntu 20.04 in this tutorial, some steps may use apt command but I believe you can use your distribution’s package manager in those steps. + +### Setting up face unlock on Ubuntu and other Linux with Howdy + +Let’s see how to set it up for facial recognition. + +#### Change config file + +Before you use Howdy, you should change the configuration file to specify your webcam device. + +On most Linux systems, /dev/video0 should be the device for webcam but you should make sure of it using v4l2-ctl command. + +Install v4l-utils first: + +``` +sudo apt install v4l-utils +``` + +Now use the v4l2-ctl command to list your devices + +``` +[email protected]:~$ v4l2-ctl --list-devices +Integrated_Webcam_HD: Integrate (usb-0000:00:14.0-5): + /dev/video0 + /dev/video1 +``` + +Why two (or more) video devices? You’ll have to check the capabilities of the device. The device should have Video Capture capability, not just Metadata Capture. + +You can check it with a command like v4l2-ctl –device=/dev/video0 –all and then look under the capability section. Most of the time, it should be the first device i.e. /dev/video0. + +Now, you need to set the device path in the Howdy config. You can do that by manually opening the **/lib/security/howdy/config.ini** file for editing or use the command below to open the config file for edit in your default terminal-based text editor: + +``` +sudo howdy config +``` + +Look for the line starting with device_path. Change its value to /dev/video0 or whatever is the path for your webcam device. + +![][13] + +Save and exit the file. You are ready to go now. + +#### Add your face for facial recognition + +Howdy is a command line tool. You have to do everything in the terminal. + +Now that you have the correct device path set, it is time to add some face in its database for the recognition. + +Use the following command to associate a face to the currently logged in user i.e. you. + +``` +sudo howdy add +``` + +It doesn’t show how your face looks like by opening a camera so you should look into the webcam to get your face captured properly. + +It will ask you to add an identifier to the face. You can name it anything you want. I used terms like glasses, with-headphones etc. + +![][14] + +I suggest adding a few more variants of your face specially if you wear glasses. Just run the sudo howdy add command each time you want to add a face. + +Howdy is ready to use as soon as you add a face. To test it, open a new terminal and run a command with sudo. You’ll notice that your webcam blinks and it tries to detect a face. If the face is not recognized, it will show an error message and ask you to use your password. + +![][15] + +To add a face for some other user, you should provide the username as well: + +``` +sudo howdy -U username add +``` + +You don’t need to worry about starting Howdy after reboot. Howdy starts automatically at each boot. + +#### List all the known face models for a user + +You can see what face models are associated to a user with the `list` option. If you don’t specify the username, it shows the output for the current user. + +``` +sudo howdy list +``` + +![][16] + +#### Clear some or all face models + +When you list all the face models for a user, you can use the remove option to delete a certain face model. You’ll have to provide the ID of the face model, not the label. + +``` +sudo howdy remove face_ID +``` + +![][17] + +You can remove all the face models with the following command: + +``` +sudo howdy clear +``` + +#### Disable and re-enable Howdy + +You can temporarily disable Howdy using this command: + +``` +sudo howdy disable 1 +``` + +You can re-enable it using the same disable option but with 0 as argument: + +``` +sudo howdy disable 0 +``` + +### Removing Howdy from your system + +You can use your distribution’s package manager to remove Howdy. + +On Ubuntu, use the following command: + +``` +sudo apt remove howdy +``` + +You should also [delete the PPA][18]: + +``` +sudo add-apt-repository -r ppa:boltgolt/howdy +``` + +For other distributions, use the uninstallation method that corresponds to the installation method you used. + +### Conclusion + +It’s fun to setup face unlock on Linux. I think this could provide base for [some good Raspberry Pi projects][19]. It’s a fun weekend exercise to do a thing like this. + +However, I won’t recommend setting up it on critical infrastructure or servers. [Facial recognition is not very secure][20]. + +Using face unlock on your personal Linux system is one thing but please don’t use it on servers or work machines. + +I hope you liked this DIY (if I may call it) tutorial. Let me know if you would like to see more such tutorials on It’s FOSS in the future. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/face-unlock-ubuntu/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://support.microsoft.com/en-in/help/4028017/windows-learn-about-windows-hello-and-set-it-up +[2]: https://itsfoss.com/keyboard-mouse-sharing-between-computers/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/Face-Unlock-in-Linux.png?resize=800%2C450&ssl=1 +[4]: https://github.com/boltgolt/howdy +[5]: https://opencv.org/ +[6]: https://itsfoss.com/ubuntu-keyring/ +[7]: https://launchpad.net/~boltgolt/+archive/ubuntu/howdy +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/select-face-unlock-level-ubuntu.png?resize=800%2C520&ssl=1 +[9]: https://github.com/boltgolt/howdy/releases +[10]: https://itsfoss.com/aur-arch-linux/ +[11]: https://copr.fedorainfracloud.org/coprs/luya/howdy/ +[12]: https://en.opensuse.org/SDB:Facial_authentication +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/setup-howdy-for-face-unlock-in-ubuntu.png?resize=794%2C511&ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/add-new-face-for-facial-recognition-linux.png?resize=799%2C225&ssl=1 +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/use-sudo-with-face-unlock.png?resize=800%2C252&ssl=1 +[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/howdy-list-face-models.png?resize=729%2C381&ssl=1 +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/remove-face-model-linux.png?resize=729%2C381&ssl=1 +[18]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ +[19]: https://itsfoss.com/raspberry-pi-projects/ +[20]: https://securitytoday.com/articles/2019/03/01/the-flaws-and-dangers-of-facial-recognition.aspx diff --git a/sources/tech/20200902 Open ports and route traffic through your firewall.md b/sources/tech/20200902 Open ports and route traffic through your firewall.md new file mode 100644 index 0000000000..643aa8c0dc --- /dev/null +++ b/sources/tech/20200902 Open ports and route traffic through your firewall.md @@ -0,0 +1,176 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Open ports and route traffic through your firewall) +[#]: via: (https://opensource.com/article/20/9/firewall) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Open ports and route traffic through your firewall +====== +Safely and securely give outside parties access to your network. +![Traffic lights at night][1] + +Ideally, most local networks are protected from the outside world. If you've ever tried installing a service, such as a web server or a [Nextcloud][2] instance at home, then you probably know from first-hand experience that, while the service is easy to reach from inside the network, it's unreachable over the worldwide web. + +There are both technical and security reasons for this, but sometimes you want to open access to something within a local network to the outside world. This means you need to be able to route traffic from the internet into your local network—correctly and safely. In this article, I'll explain how. + +### Local and public IP addresses + +The first thing you need to understand is the difference between a local internet protocol (IP) address and a public IP address. Currently, most of the world (still) uses an addressing system called IPv4, which famously has a limited pool of numbers available to assign to networked electronic devices. In fact, there are more networked devices in the world than there are IPv4 addresses, and yet IPv4 continues to function. This is possible because of local addresses. + +All local networks in the world use the _same_ address pools. For instance, my home router's local IP address is 192.168.1.1. One of those is probably the same number as your home router, yet when I navigate to 192.168.1.1, I reach _my_ router's login screen and not _your_ router's login screen. That's because your home router actually has two addresses: one public and one local, and the public one shields the local one from being detected by the internet, much less from being confused for someone else's 192.168.1.1. + +![network of networks][3] + +(Seth Kenlon, [CC BY-SA 4.0][4]) + +This, in fact, is why the internet is called the internet: it's a "web" of interconnected and otherwise self-contained networks. Each network, whether it's your workplace or your home or your school or a big data center or the "cloud" itself, is a collection of connected hosts that, in turn, communicate with a gateway (usually a router) that manages traffic from the internet and to the local network, as well as out of the local network to the internet. + +This means that if you're trying to access a computer on a network that's not the network you're currently attached to, then knowing the local address of that computer does you no good. You need to know the _public_ address of the remote network's gateway. And that's not all. You also need permission to pass through that gateway into the remote network. + +### Firewalls + +Ideally, there are firewalls all around you, even now. You don't see them (hopefully), but they're there. As technology goes, firewalls have a fun name, but they're actually a little boring. A firewall is just a computer service (also called a "daemon"), a subsystem that runs in the background of most electronic devices. There are many daemons running on your computer, including the one listening for mouse or trackpad movements, for instance. A firewall is a daemon programmed to either accept or deny certain kinds of network traffic. + +Firewalls are relatively small programs, so they are embedded in most modern devices. They're running on your mobile phone, on your router, and your computer. Firewalls are designed based on network protocols, and it's part of the specification of talking to other computers that a data packet sent over a network must announce specific pieces of information about itself (or be ignored). One thing that network data contains is a _port_ number, which is one of the primary things a firewall uses when accepting or denying traffic. + +Websites, for instance, are hosted on web servers. When you want to view a website, your computer sends network data identifying itself as traffic destined for port 80 of the web host. The web server's firewall is programmed to accept incoming traffic destined for port 80, so it accepts your request (and the web server, in turn, sends you the web page in response). However, were you to send (whether by accident or by design) network data destined for port 22 of that web server, you'd likely be denied by the firewall (and possibly banned for some time). + +This can be a strange concept to understand because, like IP addresses, ports and firewalls don't really "exist" in the physical world. These are concepts defined in software. You can't open your computer or your router to physically inspect network ports, and you can't look at a number printed on a chip to find your IP address, and you can't douse your firewall in water to put it out. But now that you know these concepts exist, you know the hurdles involved in getting from one computer in one network to another on a different network. + +Now it's time to get around those blockades. + +### Your IP address + +I assume you have control over your own network, and you're trying to open your own firewalls and route your own traffic to permit outside traffic into your network. First, you need your local and public IP addresses. + +To find your local IP address, you can use the `ip` address command on Linux: + + +``` +$ ip addr show | grep "inet " + inet 127.0.0.1/8 scope host lo + inet 192.168.1.6/27 brd 10.1.1.31 scope [...] +``` + +In this example, my local IP address is 192.168.1.6. The other address (127.0.0.1) is a special "loopback" address that your computer uses to refer to itself from within itself. + +To find your local IP address on macOS, you can use `ifconfig`: + + +``` +$ ifconfig | grep "inet " + inet 127.0.0.1 netmask 0xff000000 + inet 192.168.1.6 netmask 0xffffffe0 [...] +``` + +And on Windows, use `ipconfig`: + + +``` +`$ ipconfig` +``` + +Get the public IP address of your router at [icanhazip.com][5]. On Linux, you can get this from a terminal with the [curl command][6]: + + +``` +$ curl +93.184.216.34 +``` + +Keep these numbers handy for later. + +### Directing traffic through a router + +The first device that needs to be adjusted is the gateway device. This could be a big, physical server, or it could be a tiny router. Either way, the gateway is almost certainly performing network address translation (NAT), which is the process of accepting traffic and altering the destination IP address. + +When you generate network traffic to view an external website, your computer must send that traffic to your local network's gateway because your computer has, essentially, no knowledge of the outside world. As far as your computer knows, the entire internet is just your network router, 192.168.1.1 (or whatever your router's address). So, your computer sends everything to your gateway. It's the gateway's job to look at the traffic and determine where it's _actually_ headed, and then forward that data on to the real internet. When the gateway receives a response, it forwards the incoming data back to your computer. + +If your gateway is a router, then to expose your computer to the outside world, you must designate a port in your router to represent your computer. This configures your router to accept traffic to a specific port and direct all of that traffic straight to your computer. Depending on the brand of router you use, this process goes by a few different names, including port forwarding or virtual server or sometimes even firewall settings. + +Every device is different, so there's no way for me to tell you exactly what you need to click on to adjust your settings. Generally, you access your home router through a web browser. Your router's address is sometimes printed on the bottom of the router, and it begins with either 192.168 or 10. + +Navigate to your router's address and log in with the credentials you were provided when you got your internet service. It's often as simple as `admin` with a numeric password (sometimes, this password is printed on the router, too). If you don't know the login, call your internet provider and ask for details. + +In the graphical interface, redirect incoming traffic for one port to a port (the same one is usually easiest) of your computer's local IP address. In this example, I redirect incoming traffic destined for port 22 (used for SSH connections) of my home router to my desktop PC. + +![Example of a router configuration][7] + +(Seth Kenlon, [CC BY-SA 4.0][4]) + +You can redirect any port you want. For instance, if you're hosting a website on a spare computer, you can redirect traffic destined for port 80 of your router to port 80 of your website host. + +### Directing traffic through a server + +If your gateway is a physical server, you can direct traffic using [firewall-cmd][8]. Using the _rich rule_ option, you can have your server listen for an incoming request at a specific address (your public IP) and specific port (in this example, I use 22, which is the port used for SSH), and then direct that traffic to an IP address and port in the local network (your computer's local address). + + +``` +$ firewall-cmd --permanent --zone=public \ +\--add-rich-rule 'rule family="ipv4" destination address="93.184.216.34" forward-port port=22 protocol=tcp to-port=22 to-addr=192.168.1.6' +``` + +### Set your firewall + +Most devices have firewalls, so you might find that traffic can't get through to your local computer even after you've forwarded ports and traffic. It's possible that there's a firewall blocking traffic even within your local network. Firewalls are designed to make your computer secure, so resist the urge to deactivate your firewall entirely (except for troubleshooting). Instead, you can selectively allow traffic. + +The process of modifying your personal firewall differs according to your operating system. + +On Linux, there are many services already defined. View the ones available: + + +``` +$ sudo firewall-cmd --get-services +amanda-client amanda-k5-client bacula bacula-client +bgp bitcoin bitcoin-rpc ceph cfengine condor-collector +ctdb dhcp dhcpv6 dhcpv6-client dns elasticsearch +freeipa-ldaps ftp [...] ssh steam-streaming svdrp [...] +``` + +If the service you're trying to allow is listed, you can add it to your firewall: + + +``` +`$ sudo firewall-cmd --add-service ssh --permanent` +``` + +If your service isn't listed, you can add the port you want to open manually: + + +``` +`$ sudo firewall-cmd --add-port 22/tcp --permanent` +``` + +Opening a port in your firewall is specific to your current _zone_. For more information about firewalls, firewall-cmd, and ports, refer to my article [_Make Linux stronger with firewalls_][8], and download our [Firewall cheatsheet][9] for quick reference. + +This step is only about opening a port in your computer so that traffic destined for it on a specific port is accepted. You don't need to redirect traffic because you've already done that at your gateway. + +### Make the connection + +You've set up your gateway and your local network to route traffic for you. Now, when someone outside your network navigates to your public IP address, destined for a specific port, they'll be redirected to your computer on the same port. It's up to you to monitor and safeguard your network, so use your new knowledge with care. Too many open ports can look like invitations to bad actors and bots, so only open what you intend to use. And most of all, have fun! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/firewall + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/traffic-light-go.png?itok=nC_851ys (Traffic lights at night) +[2]: http://nextcloud.org +[3]: https://opensource.com/sites/default/files/uploads/network-of-networks.png (network of networks) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: http://icanhazip.com +[6]: https://opensource.com/article/20/5/curl-cheat-sheet +[7]: https://opensource.com/sites/default/files/uploads/port-mapping.png (Example of a router configuration) +[8]: https://opensource.com/article/19/7/make-linux-stronger-firewalls +[9]: https://opensource.com/article/20/2/firewall-cheat-sheet diff --git a/sources/tech/20200904 Managing a non-profit organization-s supply chain with Groovy.md b/sources/tech/20200904 Managing a non-profit organization-s supply chain with Groovy.md new file mode 100644 index 0000000000..e715dc47d5 --- /dev/null +++ b/sources/tech/20200904 Managing a non-profit organization-s supply chain with Groovy.md @@ -0,0 +1,229 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Managing a non-profit organization's supply chain with Groovy) +[#]: via: (https://opensource.com/article/20/9/groovy) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) + +Managing a non-profit organization's supply chain with Groovy +====== +Let's use Groovy to solve a charity's distribution problem. +![Jars with food inside on a shelf][1] + +There are many reasons I'm a big fan of [Java][2], but perhaps most of all, because of the particular combo of static typing and object-orientedness that imbues its design. However, when I need a quick solution, especially to a "solve it and forget it" problem dealing with data, I usually reach for [Groovy][3] (or sometimes [Python][4]) instead, especially if the library that addresses my problem exists and is well-documented. Sometimes even [awk][5] will do. But I keep meaning to start using [Julia][6] more, and then there's [Go][7]. + +Every so often, I run across a different kind of problem, and when it is sufficiently compact, sometimes I will solve it in a few languages, just to learn more about how each addresses the problem. + +Recently, a non-programmer colleague introduced me to just such a problem. It goes like this: + +> Many people living in community XYZ struggle to make ends meet on a daily basis. Employment opportunities in the community are limited and tend to be low-paying. The cost of living is comparatively high: water, electricity, and healthcare are expensive. Post-secondary education, whether academic or technical, means moving to the nearest city. On the plus side, the community is small and close-knit. People help each other out as much as their circumstances permit. +> +> COVID-19 has hit this community hard in the economic sense. Although there haven't been any infections yet, the two main employers in the town are facing financial ruin and have laid off almost all of their workers. The government has helped out, but the amount of help is not enough for the families struggling the hardest. +> +> A local branch of a national charity has received some funding to provide support to families in need. Seeking to stretch this funding as much as possible, the charity arranges to buy bulk lots of food and household supplies, then break up the bulk lots into family hampers of approximately equal monetary value. Their question is, how to do so? + +My colleague thought that perhaps I could help him with a spreadsheet to handle the distribution. However, to me, this seemed to be the perfect little problem to solve with a small program. What might the steps be? + + 1. Unpack the bulk packages into their individual units. + 2. While there are still units left: + 1. Grab a fresh hamper. + 2. Set the hamper value to zero. + 3. While the hamper value is less than the ideal hamper value and there are still units left: + 1. Pick a unit at random. + 2. If that unit isn't in the hamper and if the hamper value wouldn't be too high by adding it: + 1. Move the unit to the hamper. + 2. Increment the hamper value by the unit price. + + + +That seems like a good first approximation. It also seems like the perfect small algorithm to implement in Groovy. + +### The Groovy solution + +In Java, I find myself declaring utility classes to hold tuples of data (the new record feature is going to be great for that). In Groovy, I tend to use the language support for maps. Let's use a list of maps to hold the bulk items picked up from the wholesaler: + + +``` +def packs = [ +    [item:'Rice',brand:'Best Family',units:10,price:5650,quantity:1], +    [item:'Spaghetti',brand:'Best Family',units:1,price:327,quantity:10], +    [item:'Sardines',brand:'Fresh Caught',units:3,price:2727,quantity:3], +    [item:'Chickpeas',brand:'Southern Style',units:2,price:2600,quantity:5], +    [item:'Lentils',brand:'Southern Style',units:2,price:2378,quantity:5], +    [item:'Vegetable oil',brand:'Crafco',units:12,price:10020,quantity:1], +    [item:'UHT milk',brand:'Atlantic',units:6,price:4560,quantity:2], +    [item:'Flour',brand:'Neighbor Mills',units:10,price:5200,quantity:1], +    [item:'Tomato sauce',brand:'Best Family',units:1,price:190,quantity:10], +    [item:'Sugar',brand:'Good Price',units:1,price:565,quantity:10], +    [item:'Tea',brand:'Superior',units:5,price:2720,quantity:2], +    [item:'Coffee',brand:'Colombia Select',units:2,price:4180,quantity:5], +    [item:'Tofu',brand:'Gourmet Choice',units:1,price:1580,quantity:10], +    [item:'Bleach',brand:'Blanchite',units:5,price:3550,quantity:2], +    [item:'Soap',brand:'Sunny Day',units:6,price:1794,quantity:2]] +``` + +There is one bulk pack of 10 bags of rice and 10 bulk packs with one bag each of spaghetti. In the above, the variable `packs` is set to a list (actually a Java `ArrayList` underneath) of maps (actually a Java `HashMap` underneath). Because Groovy is dynamically typed (by default, anyway), I use `def` to declare the `packs` variable and am happy to have both `String` and `Integer` values in my maps. + +And yes, those prices do look a bit strange, but this problem happened in a place with a different currency. + +The next step is to unpack these bulk packages. Unpacking the single bulk package of rice yields 10 units of rice; that is, the total number of units yielded is `units * quantity`. Groovy provides a handy function called `collectMany` that can be used to flatten lists of lists, so the code to carry out the unpacking is really straightforward: + + +``` +def units = packs.collectMany { pack -> +    [[item:pack.item, brand:pack.brand, price:(pack.price / pack.units)]] * +                (pack.units * pack.quantity) +} +``` + +Note that `collectMany` takes a `Closure` as its argument; so this is a kind of locally declared function with a single parameter, `pack`, that returns a list of (`units * quantity`) maps, with each map including the item, brand, and calculated unit price from the corresponding bulk pack. Of note here is that the Groovy multiply operator (`*`) with a list on the left side and a number (`N`) on the right will produce a list with the original items replicated in order `N` times. + +The final step is to repack the units into the hampers for distribution. But first, I need to get a bit more specific about the ideal hamper value, and I might as well not be overly restrictive when there are just a few units left: + + +``` +def valueIdeal = 5000 +def valueMax = valueIdeal * 1.1 +``` + +OK! Let's repack the hampers: + + +``` +def rnd = new [Random][8]() +def hamperNumber = 0    // [1] + +while (units.size()) {  // [2] +    hamperNumber++ +    def hamper = [] +    def value = 0       // [2.1] +    for (boolean canAdd = true; canAdd; ) {        // [2.2] +        int u = rnd.nextInt(units.size())          // [2.2.1] +        canAdd = false                             // [2.2.2] +        for (int o = 0; o < units.size(); o++) {   // [2.2.3] +            int uo = (u + o) % units.size() +            def unit = units[uo]                   // [2.2.3.1] +            if (units.size() < 3 || +                        !(unit in hamper) && +                        (value + unit.price) < valueMax) { // [2.2.3.2] +                hamper.add(unit) +                value += unit.price +                units.remove(uo)                   // [2.2.3.3] +                canAdd = units.size() > 0 +                break                              // [2.2.3.4] +            } +        }                                          // [2.2.4] +    } +    println "" +    println "Hamper $hamperNumber value $value:" +    hamper.each { item -> +        printf "%-25s%-25s%7.2f\n",item.item,item.brand,item.price +    }                                                                   // [2.3] +    println "Remaining units ${units.size()} average price = $avgPrice" // [2.4] +} +``` + +Some clarification, with numbers in brackets in the comments above (e.g., _[1]_) corresponding to the clarifications below: + + * 1\. Initialize Groovy's random number generator and the hamper number. + * 2\. This `while {}` loop will redistribute units into hampers as long as there are more available: + * 2.1 Increment the hamper number, get a new empty hamper (a list of units), and set its value to 0. + * 2.2 This `for {}` loop will add as many units to the hamper as possible: + * 2.2.1 Get a random number between zero and the number of remaining units minus 1. + * 2.2.2 Assume you can't find more units to add. + * 2.2.3 This `for {}` loop, starting at the randomly chosen index, will try to find a unit that can be added to the hamper. + * 2.2.3.1 Figure out which unit to look at. + * 2.2.3.2 Add this unit to the hamper if there are only a few left or if the value of the hamper isn't too high once the unit is added. + * 2.2.3.3 Add the unit to the hamper, increment the hamper value by the unit price, and remove the unit from the available units list. + * 2.2.3.4 As long as there are units left, you can add more, so break out of this loop to keep looking. + * 2.2.4 On exit from this `for {}` loop, if you inspected every remaining unit and could not find one to add to the hamper, the hamper is complete; otherwise, you found one and can continue looking for more. + * 2.3 Print out the contents of the hamper. + * 2.4 Print out the remaining units info. + + + +When you run this code, the output looks like: + + +``` +Hamper 1 value 5414: +Vegetable oil            Crafco                    835.00 +Coffee                   Colombia Select          2090.00 +Tofu                     Gourmet Choice           1580.00 +Sardines                 Fresh Caught              909.00 +Remaing units 151 + +Hamper 2 value 5309: +Flour                    Neighbor Mills            520.00 +Sugar                    Good Price                565.00 +Vegetable oil            Crafco                    835.00 +Coffee                   Colombia Select          2090.00 +Rice                     Best Family               565.00 +Tomato sauce             Best Family               190.00 +Tea                      Superior                  544.00 +Remaing units 144 + +Hamper 3 value 5395: +Flour                    Neighbor Mills            520.00 +UHT milk                 Atlantic                  760.00 +Tomato sauce             Best Family               190.00 +Tofu                     Gourmet Choice           1580.00 +Spaghetti                Best Family               327.00 +Sugar                    Good Price                565.00 +Sardines                 Fresh Caught              909.00 +Tea                      Superior                  544.00 +Remaing units 136 + +… + +Hamper 23 value 5148: +Flour                    Neighbor Mills            520.00 +Tea                      Superior                  544.00 +Chickpeas                Southern Style           1300.00 +Lentils                  Southern Style           1189.00 +Vegetable oil            Crafco                    835.00 +UHT milk                 Atlantic                  760.00 +Remaing units 3 + +Hamper 24 value 3955: +Chickpeas                Southern Style           1300.00 +Sugar                    Good Price                565.00 +Coffee                   Colombia Select          2090.00 +Remaing units 0 +``` + +The last hamper is abbreviated in contents and value. + +### Closing thoughts + +Note there is some fiddly business about being able to add units to the hamper. Basically, you pick a random position in the list of units and, starting at that position, iterate through the list until you either find a unit whose price allows it to be included or until you exhaust the list. Also, when there are only a few items left, you just toss them into the last hamper. + +Another issue worth mentioning: This isn't a particularly efficient approach. Removing elements from `ArrayLists`, letting Groovy use its default `BigDecimal`, and a few other things make this less suitable for a huge redistribution problem. Still, it runs quite rapidly on my aging dual-core machine. + +And one final thought—using `while { … }` and `for { … }`? Really? Not some cool functional code? Afraid so. I couldn't think of a way to use map and reduce style closures in Groovy in collaboration with a random selection of units for repackaging. Can you? + +In another article article, I'll solve this in Python, and future articles will do it in Java, Julia, and Go. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/groovy + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/clhermansen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_secret_ingredient_520x292.png?itok=QbKzJq-N (Jars with food inside on a shelf) +[2]: https://www.java.com/en/ +[3]: https://groovy-lang.org/ +[4]: https://www.python.org/ +[5]: https://www.gnu.org/software/gawk/manual/gawk.html +[6]: https://julialang.org/ +[7]: https://golang.org/ +[8]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+random diff --git a/sources/tech/20200906 PCLinuxOS Review- This Classic Independent Linux Distribution is Definitely Worth a Look.md b/sources/tech/20200906 PCLinuxOS Review- This Classic Independent Linux Distribution is Definitely Worth a Look.md new file mode 100644 index 0000000000..0b5d0637a7 --- /dev/null +++ b/sources/tech/20200906 PCLinuxOS Review- This Classic Independent Linux Distribution is Definitely Worth a Look.md @@ -0,0 +1,144 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (PCLinuxOS Review: This Classic Independent Linux Distribution is Definitely Worth a Look) +[#]: via: (https://itsfoss.com/pclinuxos-review/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +PCLinuxOS Review: This Classic Independent Linux Distribution is Definitely Worth a Look +====== + +Most of the Linux distributions that we cover on It’s FOSS are based on either Ubuntu or Arch. + +No, we don’t have any affinity for either Ubuntu or Arch though personally, [I love using Manjaro][1]. It’s just that majority of new Linux distributions are based on these two. + +While discussing within the team, we thought, why fixate over new distributions. Why not go for the classic distributions? Distributions that don’t belong to DEB/Arch domain. + +So, today, we are going to be looking at an independent distro that tends to go against the flow. We’ll be looking at PCLinuxOS. + +### What is PCLinuxOS? + +![][2] + +Back in 2000, Bill Reynolds (also known as Texstar) created a series of packages to improve Mandrake Linux, which later became [Mandriva Linux][3]. [PCLinuxOS][4] first became a separate distro in 2003 when Texstar forked Mandrake. He [said][5] that he made the move because he wanted “to provide an outlet for my crazy desire to package source code without having to deal with egos, arrogance and politics”. + +As I said earlier, PCLinuxOS does not follow the rest of the Linux world. PCLinuxOS does not use systemd. Instead, it uses SysV init and “[will continue to do so for the foreseeable future][6]“. + +It also has one of the oddest package management systems, I have ever encountered. PCLinuxOS uses apt and [synaptic][7] to handle RPM packages. Unlike most distros that use either apt or rpm, PCLinuxOS is a rolling distro. It also supports [Flatpak][8]. + +The PCLinuxOS team offers [three different versions][9]: **KDE**, **MATE**, and **XFCE**. The PCLinuxOS community has also created a number of [community][10] [releases][11] with more desktop options. + +![PCLinuxOS Updater][12] + +### System requirements for PCLinuxOS + +According to the [PCLinuxOS wiki][13], the following hardware is recommended to run PCLinuxOS: + + * Modern Intel or AMD processor. + * 10 GB or more free space recommended. + * Minimum 2 GB of memory. – Recommended 4 GB or more. + * Any modern video card by Nvidia, ATI, Intel, SiS, Matrox, or VIA. + * 3D desktop support requires a 3D instructions set compatible card. + * Any Sound Blaster, AC97, or HDA compatible card. + * A CD or DVD drive. + * Flash drives can also be used to install, with PCLinuxOS-LiveUSB script just for this purpose. + * Generally any onboard network card will suffice. + * A high-speed internet connection is recommended for performing any updates/software installations as necessary. + + + +### Experience with PCLinuxOS + +I originally encountered PCLinuxOS when I was first entering the Linux world about 7+ years ago. Back then I was trying out distros like crazy. At the time, I didn’t quite understand it and ended up going with Lubuntu. + +Recently, I was reminded of the distro when [Matt Hartley][14], community manager at [OpenShot][15] mentioned it on the [Bryan Lunduke podcast][16]. PCLinuxOS is Hartley’s daily driver and has been for a while. Based on his comments, I decided to take another look at it. + +#### Smooth installation + +![PCLinuxOS installer][17] + +The majority of Linux distros use one of three installers, [Ubiquity][18], [Anaconda][19], or [Calamares][20]. PCLinuxOS is one of the few that has its own installer, which it inherited from Mandrake. The installation went quickly and without any issue. + +After the installation, I booted into the MATE [desktop environment][21] (because I had to). A dialog box asked me if I wanted to enable the update notifier. It’s always best to be up-to-date, so I did. + +#### Handy set of utilities + +Besides the usual list of utilities, office programs, and web tools, PCLinuxOS has a couple of interesting additions. Both Zoom (a videoconferencing tool) and AnyDesk (a remote desktop application) come pre-installed for your remote working needs. The menu also includes an option to install VirtualBox GuestAdditions (in case you installed PCLinuxOS on VirtualBox). + +![PCLinuxOS Control Center][22] + +PCLinuxOS comes with a control center to handle all of your system admin needs. It covers installing software, file sharing, handles network connections, handles hardware issues, and security. + +#### Create your own custom PCLinuxOS live disk + +It also comes with a couple of apps that allow you to download a new PCLinuxOS ISO, write that ISO to a disc or USB, or create [your own LiveCD][23] based on your current system. + +![It is easy to create your own custom PCLinuxOS ISO][24] + +#### No sudo in PCLinuxOS + +Interestingly, PCLinuxOS doesn’t have `sudo` installed. According to the [FAQ][6], “Some distros…leaving sudo in a default state where all administrator functions are allowed without the requirement to enter the root password. We consider this an unacceptable security risk.” Whenever you perform a task that requires admin privileges, a window appears asking for your password. + +#### Strong community + +One of the cool things about PCLinuxOS is its strong community. That community creates a monthly [e-magazine][25]. Each issue contains news, tutorials, puzzles, and even recipes. The only other distro (or family of distros) that has sustained a community publication for over 15 years is Ubuntu with the [Full Circle Magazine][26]. Be sure to check it out. + +#### No hardware issues noticed (for my system) + +This is one of the last distros I will review on my Dell Latitude D630. (I’m moving up to a newer Thinkpad.) One of the major problems I’ve had in the past was getting the Nvidia GPU to work correctly. I didn’t have any issues with PCLinuxOS. It just worked out of the box. + +### Final Thoughts + +![PCLinuxOS Desktop][27] + +PCLinuxOS also provides an easy way to remaster the system after installation. It allows you to create a live disk of PCLinuxOS with your customization. I + +PCLinuxOS feels like part of the past and part of the present. It reflects the pre-systemd days and offers a modern desktop and apps at the same time. The only thing I would complain about is that there are fewer applications available in the repos than more popular distros, but the availability of Flatpak and AppImages should fix that. + +PCLinuxOS’ tag line is: “_**So cool ice cubes are jealous**_“. It might sound corny, but I think it’s true, especially if you aren’t a fan of the direction the rest of the Linux world has taken. If you find something lacking in the big Linux distros, check out this old-little distro with a great community. + +Have you ever used PCLinuxOS? What is your favorite independent distro? Please let us know in the comments below. If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][28]. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/pclinuxos-review/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/why-use-manjaro-linux/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/PCLinuxOS-review.png?resize=800%2C450&ssl=1 +[3]: https://en.wikipedia.org/wiki/Mandriva_Linux +[4]: https://www.pclinuxos.com/ +[5]: http://linux-blog.org/Experiment-Interview-with-Texstar-of-PCLinuxOS/ +[6]: https://pclinuxoshelp.com/index.php/Frequently_Asked_Questions +[7]: https://itsfoss.com/synaptic-package-manager/ +[8]: https://pclinuxoshelp.com/index.php/Installing_Software#Using_Flatpak +[9]: https://www.pclinuxos.com/?page_id=10 +[10]: https://ftp.nluug.nl/pub/os/Linux/distr/pclinuxos/pclinuxos/live-cd/community/ +[11]: https://pclosusers.com/communityiso/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/PCLinuxOS-updater.jpg?resize=800%2C487&ssl=1 +[13]: https://pclinuxoshelp.com/index.php/Hardware_Recommendations +[14]: https://twitter.com/matthartley +[15]: https://www.openshot.org/ +[16]: http://www.lunduke.com/ +[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/PCLinuxOS-installer.jpg?resize=800%2C500&ssl=1 +[18]: http://launchpad.net/ubiquity +[19]: https://fedoraproject.org/wiki/Anaconda +[20]: https://calamares.io/ +[21]: https://itsfoss.com/what-is-desktop-environment/ +[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/08/PCLinuxOS-Control-Center.jpg?resize=800%2C585&ssl=1 +[23]: https://pclinuxoshelp.com/index.php/LiveCD,_Create_your_own +[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/PCLinuxOS-downloader.jpg?resize=800%2C608&ssl=1 +[25]: https://pclosmag.com/index.html +[26]: https://fullcirclemagazine.org/ +[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/PCLinuxOS-desktop.jpg?resize=800%2C500&ssl=1 +[28]: http://reddit.com/r/linuxusersgroup diff --git a/sources/tech/20200907 A beginner-s guide to SSH for remote connection on Linux.md b/sources/tech/20200907 A beginner-s guide to SSH for remote connection on Linux.md new file mode 100644 index 0000000000..64c7c297b7 --- /dev/null +++ b/sources/tech/20200907 A beginner-s guide to SSH for remote connection on Linux.md @@ -0,0 +1,183 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A beginner’s guide to SSH for remote connection on Linux) +[#]: via: (https://opensource.com/article/20/9/ssh) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +A beginner’s guide to SSH for remote connection on Linux +====== +Establish connections with remote computers using secure shell. +![woman on laptop sitting at the window][1] + +One of Linux's most appealing features is the ability to skillfully use a computer with nothing but commands entered into the keyboard—and better yet, to be able to do that on computers anywhere in the world. Thanks to OpenSSH, [POSIX][2] users can open a secure shell on any computer they have permission to access and use it from a remote location. It's a daily task for many Linux users, but it can be confusing for someone who has yet to try it. This article explains how to configure two computers for secure shell (SSH) connections, and how to securely connect from one to the other without a password. + +### Terminology + +When discussing more than one computer, it can be confusing to identify one from the other. The IT community has well-established terms to help clarify descriptions of the process of networking computers together. + + * **Service:** A service is software that runs in the background so it can be used by computers other than the one it's installed on. For instance, a web server hosts a web-sharing _service_. The term implies (but does not insist) that it's software without a graphical interface. + * **Host:** A host is any computer. In IT, computers are called a _host_ because technically any computer can host an application that's useful to some other computer. You might not think of your laptop as a "host," but you're likely running some service that's useful to you, your mobile, or some other computer. + * **Local:** The local computer is the one you or some software is using. Every computer refers to itself as `localhost`, for example. + * **Remote:** A remote computer is one you're not physically in front of nor physically using. It's a computer in a _remote_ location. + + + +Now that the terminology is settled, you can begin. + +### Activate SSH on each host + +For two computers to be connected over SSH, each host must have SSH installed. SSH has two components: the command you use on your local machine to start a connection, and a _server_ to accept incoming connection requests. Some computers come with one or both parts of SSH already installed. The commands vary, depending on your system, to verify whether you have both the command and the server installed, so the easiest method is to look for the relevant configuration files: + + +``` +$ file /etc/ssh/ssh_config +/etc/ssh/ssh_config: ASCII text +``` + +Should this return a `No such file or directory` error, then you don't have the SSH command installed. + +Do a similar check for the SSH service (note the `d` in the filename): + + +``` +$ file /etc/ssh/sshd_config +/etc/ssh/sshd_config: ASCII text +``` + +Install one or the other, as needed: + + +``` +`$ sudo dnf install openssh-clients openssh-server` +``` + +On the remote computer, enable the SSH service with systemd: + + +``` +`$ sudo systemctl enable --now sshd` +``` + +Alternately, you can enable the SSH service from within **System Settings** on GNOME or **System Preferences** on macOS. On the GNOME desktop, it's located in the **Sharing** panel: + +![Activate SSH in GNOME System Settings][3] + +(Seth Kenlon, [CC BY-SA 4.0][4]) + +### Start a secure shell + +Now that you've installed and enabled SSH on the remote computer, you can try logging in with a password as a test. To access the remote computer, you must have a user account and a password. + +Your remote user doesn't have to be the same as your local user. You can log in as any user on the remote machine as long as you have that user's password. For instance, I'm `sethkenlon` on my work computer, but I'm `seth` on my personal computer. If I'm on my personal computer (making it my current local machine) and I want to SSH into my work computer, I can do that by identifying myself as `sethkenlon` and using my work password. + +To SSH into the remote computer, you must know its internet protocol (IP) address or its resolvable hostname. To find the remote machine's IP address, use the `ip` command (on the remote computer): + + +``` +$ ip addr show | grep "inet " +inet 127.0.0.1/8 scope host lo +inet 10.1.1.5/27 brd 10.1.1.31 [...] +``` + +If the remote computer doesn't have the `ip` command, try `ifconfig` instead (or even `ipconfig` on Windows). + +The address 127.0.0.1 is a special one and is, in fact, the address of `localhost`. It's a "loopback" address, which your system uses to reach itself. That's not useful when logging into a remote machine, so in this example, the remote computer's correct IP address is 10.1.1.5. In real life, I would know that because my local network uses the 10.1.1.0 subnet. If the remote computer is on a different network, then the IP address could be nearly anything (never 127.0.0.1, though), and some special routing is probably necessary to reach it through various firewalls. Assume your remote computer is on the same network, but if you're interested in reaching computers more remote than your own network, [read my article about opening ports in your firewall][5]. + +If you can ping the remote machine by its IP address _or_ its hostname, and have a login account on it, then you can SSH into it: + + +``` +$ ping -c1 10.1.1.5 +PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data. +64 bytes from 10.1.1.5: icmp_seq=1 ttl=64 time=4.66 ms +$ ping -c1 akiton.local +PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data. +``` + +That's a success. Now use SSH to log in: + + +``` +$ whoami +seth +$ ssh sethkenlon@10.1.1.5 +bash$ whoami +sethkenlon +``` + +The test login works, so now you're ready to activate passwordless login. + +### Create an SSH key + +To log in securely to another computer without a password, you must have an SSH key. You may already have an SSH key, but it doesn't hurt to create a new one. An SSH key begins its life on your local machine. It consists of two components: a private key, which you never share with anyone or anything, and a public one, which you copy onto any remote machine you want to have passwordless access to. + +Some people create one SSH key and use it for everything from remote logins to GitLab authentication. However, I use different keys for different groups of tasks. For instance, I use one key at home to authenticate to local machines, a different key to authenticate to web servers I maintain, a separate one for Git hosts, another for Git repositories I host, and so on. In this example, I'll create a unique key to use on computers within my local area network. + +To create a new SSH key, use the `ssh-keygen` command: + + +``` +`$ ssh-keygen -t ed25519 -f ~/.ssh/lan` +``` + +The `-t` option stands for _type_ and ensures that the encryption used for the key is higher than the default. The `-f` option stands for _file_ and sets the key's file name and location. After running this command, you're left with an SSH private key called `lan` and an SSH public key called `lan.pub`. + +To get the public key over to your remote machine, use the `ssh-copy-id`. For this to work, you must verify that you have SSH access to the remote machine. If you can't log into the remote host with a password, you can't set up passwordless login either: + + +``` +`$ ssh-copy-id -i ~/.ssh/lan.pub sethkenlon@10.1.1.5` +``` + +During this process, you'll be prompted for your login password on the remote host. + +Upon success, try logging in again, but this time using the `-i` option to point the SSH command to the appropriate key (`lan`, in this example): + + +``` +$ ssh -i ~/.ssh/lan sethkenlon@10.1.1.5 +bash$ whoami +sethkenlon +``` + +Repeat this process for all computers on your network, and you'll be able to wander through each host without ever thinking about passwords again. In fact, once you have passwordless authentication set up, you can edit the `/etc/ssh/sshd_config` file to disallow password authentication. This prevents anyone from using SSH to authenticate to a computer unless they have your private key. To do this, open `/etc/ssh/sshd_config` in a text editor with `sudo` permissions and search for the string `PasswordAuthentication`. Change the default line to this: + + +``` +`PasswordAuthentication no` +``` + +Save it and restart the SSH server (or just reboot): + + +``` +$ sudo systemctl restart sshd && echo "OK" +OK +$ +``` + +### Using SSH every day + +OpenSSH changes your view of computing. No longer are you bound to just the computer in front of you. With SSH, you have access to any computer in your house, or servers you have accounts on, and even mobile and Internet of Things devices. Unlocking the power of SSH also unlocks the power of the Linux terminal. If you're not using SSH every day, start now. Get comfortable with it, collect some keys, live more securely, and expand your world. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/ssh + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop) +[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[3]: https://opensource.com/sites/default/files/uploads/gnome-activate-remote-login.png (Activate SSH in GNOME System Settings) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/article/20/8/open-ports-your-firewall diff --git a/sources/tech/20200908 Deploy a deep learning model on Kubernetes.md b/sources/tech/20200908 Deploy a deep learning model on Kubernetes.md new file mode 100644 index 0000000000..ca6d98438a --- /dev/null +++ b/sources/tech/20200908 Deploy a deep learning model on Kubernetes.md @@ -0,0 +1,265 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Deploy a deep learning model on Kubernetes) +[#]: via: (https://opensource.com/article/20/9/deep-learning-model-kubernetes) +[#]: author: (Chaimaa Zyani https://opensource.com/users/chaimaa) + +Deploy a deep learning model on Kubernetes +====== +Learn how to deploy, scale, and manage a deep learning model that serves +up image recognition predictions with Kubermatic Kubernetes Platform. +![Brain on a computer screen][1] + +As enterprises increase their use of artificial intelligence (AI), machine learning (ML), and deep learning (DL), a critical question arises: How can they scale and industrialize ML development? These conversations often focus on the ML model; however, this is only one step along the way to a complete solution. To achieve in-production application and scale, model development must include a repeatable process that accounts for the critical activities that precede and follow development, including getting the model into a public-facing deployment. + +This article demonstrates how to deploy, scale, and manage a deep learning model that serves up image recognition predictions using [Kubermatic Kubernetes Platform][2]. + +Kubermatic Kubernetes Platform is a production-grade, open source Kubernetes cluster-management tool that offers flexibility and automation to integrate with ML/DL workflows with full cluster lifecycle management. + +### Get started + +This example deploys a deep learning model for image recognition. It uses the [CIFAR-10][3] dataset that consists of 60,000 32x32 color images in 10 classes with the [Gluon][4] library in [Apache MXNet][5] and NVIDIA GPUs to accelerate the workload. If you want to use a pre-trained model on the CIFAR-10 dataset, check out the [getting started guide][6]. + +The model was trained over a span of 200 epochs, as long as the validation error kept decreasing slowly without causing the model to overfit. This plot shows the training process: + +![Deep learning model training plot][7] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + +After training, it's essential to save the model's parameters so they can be loaded later: + + +``` +file_name = "net.params" +net.save_parameters(file_name) +``` + +Once the model is ready, wrap your prediction code in a Flask server. This allows the server to accept an image as an argument to its request and return the model's prediction in the response: + + +``` +from gluoncv.model_zoo import get_model +import matplotlib.pyplot as plt +from mxnet import gluon, nd, image +from mxnet.gluon.data.vision import transforms +from gluoncv import utils +from PIL import Image +import io +import flask +app = flask.Flask(__name__) + +@app.route("/predict",methods=["POST"]) +def predict(): +    if flask.request.method == "POST": +        if flask.request.files.get("img"): +           img = Image.open(io.BytesIO(flask.request.files["img"].read())) +            transform_fn = transforms.Compose([ +            transforms.Resize(32), +            transforms.CenterCrop(32), +            transforms.ToTensor(), +            transforms.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])]) +            img = transform_fn(nd.array(img)) +            net = get_model('cifar_resnet20_v1', classes=10) +            net.load_parameters('net.params') +            pred = net(img.expand_dims(axis=0)) +            class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', +                       'dog', 'frog', 'horse', 'ship', 'truck'] +            ind = nd.argmax(pred, axis=1).astype('int') +            prediction = 'The input picture is classified as [%s], with probability %.3f.'% +                         (class_names[ind.asscalar()], nd.softmax(pred)[0][ind].asscalar()) +    return prediction + +if __name__ == '__main__': +   app.run(host='0.0.0.0') +``` + +### Containerize the model + +Before you can deploy your model to Kubernetes, you need to install Docker and create a container image with your model. + + 1. Download, install, and start Docker: [code] + +sudo yum install -y yum-utils device-mapper-persistent-data lvm2 + +sudo yum-config-manager --add-repo + +sudo yum install docker-ce + +sudo systemctl start docker + +``` + 2. Create a directory where you can organize your code and dependencies: [code] + +mkdir kubermatic-dl +cd kubermatic-dl +``` + + 3. Create a `requirements.txt` file to contain the packages the code needs to run: [code] + +flask +gluoncv +matplotlib +mxnet +requests +Pillow + +``` + 4. Create the Dockerfile that Docker will read to build and run the model: [code] + +FROM python:3.6 +WORKDIR /app +COPY requirements.txt /app +RUN pip install -r ./requirements.txt +COPY app.py /app +CMD ["python", "app.py"]~ + +[/code] This Dockerfile can be broken down into three steps. First, it creates the Dockerfile and instructs Docker to download a base image of Python 3. Next, it asks Docker to use the Python package manager `pip` to install the packages in `requirements.txt`. Finally, it tells Docker to run your script via `python app.py`. + + 5. Build the Docker container: [code]`sudo docker build -t kubermatic-dl:latest .`[/code] This instructs Docker to build a container for the code in your current working directory, `kubermatic-dl`. + + 6. Check that your container is working by running it on your local machine: [code]`sudo docker run -d -p 5000:5000 kubermatic-dl` +``` + + 7. Check the status of your container by running `sudo docker ps -a`: + +![Checking the container's status][9] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + + + + +### Upload the model to Docker Hub + +Before you can deploy the model on Kubernetes, it must be publicly available. Do that by adding it to [Docker Hub][10]. (You will need to create a Docker Hub account if you don't have one.) + + 1. Log into your Docker Hub account: [code]`sudo docker login` +``` + 2. Tag the image so you can refer to it for versioning when you upload it to Docker Hub: [code] + +sudo docker tag <your-image-id> <your-docker-hub-name>/<your-app-name> + +sudo docker push <your-docker-hub-name>/<your-app-name> +``` + +![Tagging the image][11] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + + 3. Check your image ID by running `sudo docker images`. + + + + +### Deploy the model to a Kubernetes cluster + + 1. Create a project on the Kubermatic Kubernetes Platform, then create a Kubernetes cluster using the [quick start tutorial][12]. + +![Create a Kubernetes cluster][13] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + + 2. Download the `kubeconfig` used to configure access to your cluster, change it into the download directory, and export it into your environment: + +![Kubernetes cluster example][14] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + + 3. Using `kubectl`, check the cluster information, such as the services that `kube-system` starts on your cluster: [code]`kubectl cluster-info` +``` +![Checking the cluster info][15] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + + 4. To run the container in the cluster, you need to create a deployment (`deployment.yaml`) and apply it to the cluster: [code] + +apiVersion: apps/v1 +kind: Deployment +metadata: +  name: kubermatic-dl-deployment +spec: +  selector: +    matchLabels: +      app: kubermatic-dl +  replicas: 3 +  template: +    metadata: +      labels: +        app: kubermatic-dl +    spec: +     containers: +     - name: kubermatic-dl +       image: kubermatic00/kubermatic-dl:latest +       imagePullPolicy: Always +       ports: +       - containerPort: 8080 + +[/code] [code]`kubectl apply -f deployment.yaml` +``` + + 5. To expose your deployment to the outside world, you need a service object that will create an externally reachable IP for your container: [code]`kubectl expose deployment kubermatic-dl-deployment  --type=LoadBalancer --port 80 --target-port 5000` +``` +6. You're almost there! Check your services to determine the status of your deployment and get the IP address to call your image recognition API: [code]`kubectl get service` +``` + +![Get the IP address to call your image recognition API][16] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + + 7. Test your API with these two images using the external IP: + +![Horse][17] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + +![Dog][18] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + +![Testing the API][19] + +(Chaimaa Zyami, [CC BY-SA 4.0][8]) + + + + +### Summary + +In this tutorial, you created a deep learning model to be served as a [REST API][20] using Flask. It put the application inside a Docker container, uploaded the container to Docker Hub, and deployed it with Kubernetes. Then, with just a few commands, Kubermatic Kubernetes Platform deployed the app and exposed it to the world. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/deep-learning-model-kubernetes + +作者:[Chaimaa Zyani][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/chaimaa +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_computer_solve_fix_tool.png?itok=okq8joti (Brain on a computer screen) +[2]: https://www.loodse.com/products/kubermatic/ +[3]: https://www.cs.toronto.edu/~kriz/cifar.html +[4]: https://gluon.mxnet.io/ +[5]: https://mxnet.apache.org/ +[6]: https://gluon-cv.mxnet.io/build/examples_classification/demo_cifar10.html +[7]: https://opensource.com/sites/default/files/uploads/trainingplot.png (Deep learning model training plot) +[8]: https://creativecommons.org/licenses/by-sa/4.0/ +[9]: https://opensource.com/sites/default/files/uploads/containerstatus.png (Checking the container's status) +[10]: https://hub.docker.com/ +[11]: https://opensource.com/sites/default/files/uploads/tagimage.png (Tagging the image) +[12]: https://docs.kubermatic.com/kubermatic/v2.13/installation/install_kubermatic/_installer/ +[13]: https://opensource.com/sites/default/files/uploads/kubernetesclusterempty.png (Create a Kubernetes cluster) +[14]: https://opensource.com/sites/default/files/uploads/kubernetesexamplecluster.png (Kubernetes cluster example) +[15]: https://opensource.com/sites/default/files/uploads/clusterinfo.png (Checking the cluster info) +[16]: https://opensource.com/sites/default/files/uploads/getservice.png (Get the IP address to call your image recognition API) +[17]: https://opensource.com/sites/default/files/uploads/horse.jpg (Horse) +[18]: https://opensource.com/sites/default/files/uploads/dog.jpg (Dog) +[19]: https://opensource.com/sites/default/files/uploads/testapi.png (Testing the API) +[20]: https://www.redhat.com/en/topics/api/what-is-a-rest-api diff --git a/sources/tech/20200908 Open source data control for cloud services with Apache Ranger.md b/sources/tech/20200908 Open source data control for cloud services with Apache Ranger.md new file mode 100644 index 0000000000..38e6da27a5 --- /dev/null +++ b/sources/tech/20200908 Open source data control for cloud services with Apache Ranger.md @@ -0,0 +1,63 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Open source data control for cloud services with Apache Ranger) +[#]: via: (https://opensource.com/article/20/9/apache-ranger) +[#]: author: (Balaji Ganesan https://opensource.com/users/balajiganesan) + +Open source data control for cloud services with Apache Ranger +====== +Comparing different approaches to make more data available to more users +while maintaining security and compliance with data privacy regulations. +![Tools in a cloud][1] + +As the movement to migrate enterprise data to the cloud gathers steam, there is an active debate on the best approach to securing and protecting it. But before we talk about the details of the various access control frameworks, let us first understand the breadth of challenges a company faces when it begins migrating its data to the cloud. First and foremost is the wide array of storage and analysis or compute services offered by cloud and third-party providers. In other words, when a company decides to move its data to the cloud, it needs to decide the type of repository in which it is going to store its data. + +Each cloud company offers many different data stores, and there are a dozen different services to analyze data once it has been migrated to the cloud. Then there are cloud-native third-party services to allow data science platforms and data warehouses to operate as part of the leading public cloud infrastructure. Each of these services offers a unique mechanism by which to administer access to data consumers such as data analysts and scientists in the organization. + +If you think this is beginning to sound a lot like Hadoop-based data lakes, you're right. Needless to say, this places a very heavy burden on the administrators that have to make data widely available in the organization and comply with privacy and industry regulations such as California Consumer Privacy Act (CCPA), General Data Protection Regulation (GDPR), and Health Insurance Portability and Accountability Act (HIPAA) at the same time. + +### The fundamentals of two popular approaches: RBAC vs. ABAC + +Access control mechanisms have been part of the enterprise IT landscape since the advent of computer systems, and there are two key aspects to controlling access to data. The first relates to authenticating the identity of the user and establishing whether the individual or system is actually who they claim to be. The second has to do with ensuring that the user has the appropriate permission to access a data system, a process known as authorization. These principles also apply to the data stored in the cloud. Today, role-based access control (RBAC) and attribute-based access control (ABAC) are the two most prevalent approaches to managing access to data in the enterprise. The goal of these approaches is to help define and enforce the policies and privileges that grant authorized users access to the required data. + +RBAC is based on the concepts of users, roles, groups, and privileges in an organization. Administrators grant privileges or permissions to pre-defined organizational roles—roles that are assigned to subjects or users based on their responsibility or area of expertise. For example, a user who is assigned the role of a manager might have access to a different set of objects and/or is given permission to perform a broader set of actions on them as compared to a user with the assigned role of an analyst. When the user generates a request to access a data object, the access control mechanism evaluates the role assigned to the user and the set of operations this role is authorized to perform on the object before deciding whether to grant or deny the request. + +RBAC simplifies the administration of data access controls because concepts such as users and roles are well-understood constructs in a majority of organizations. In addition to being based on familiar database concepts, RBAC also offers administrators the flexibility to assign users to various roles, reassign users from one role to another, and grant or revoke permissions as required. Once an RBAC framework is established, the administrator's role is primarily to assign or revoke users to specific roles. In RBAC, a user can be assigned many roles, a role can have many users, and a role/user can perform many operations. + +The concept of attribute-based access control appeared on the scene in the early 2000s. Prior to ABAC, managing access to enterprise data involved granting a user or subject permission to perform a specific action on an entity—in this case, a database, table, or column. In ABAC, the decision to grant access or request to perform an operation on an object is based on assigned attributes of the subject, object, environment conditions, and a set of policies that are specific to those attributes and conditions. Environment conditions are dynamic factors that are independent of user or object and can include things such as the time and location of the subject. Just like subjects or users have attributes, so do objects such as databases, files, or tables. Object attributes may include author, creation date, version, effective date, last update, etc. + +ABAC operates by assigning attributes to subjects and objects and developing policies that govern rules of data access. Each component in the information system is assigned attributes that are specific to the object. For example, a file can be classified as an intellectual property (IP). Similarly, each user or subject in the system can be assigned attributes that may include the user's location and time zone. Based on these attributes, an administrator can build an access policy that specifies that any document that has been classified as IP cannot be accessed by a user who is located outside the US or that it can only be accessed by users who are affiliated with the company's legal department during the hours of 8:00am and 5:00pm PST. You can now see how ABAC extends the concept of role, users, and privileges to include attributes. + +ABAC also offers several advantages to infrastructure administrators. For instance, they do not require knowledge of specific users or subjects that need access to data. The combination of user and object attributes governed by a set of policies can accommodate an unlimited number of users. As new users are added to the platform, they, too, can be governed by the same set of rules. Because ABAC does not require administrators to have prior knowledge of the users, this approach is better suited to environments where individuals are routinely added and removed from the data platform. + +### Making the right choice + +It is important to point out that the distinction between RBAC and ABAC approaches is increasingly blurred by access control platforms such as Apache Ranger, a data governance framework originally developed to manage Big Data in Hadoop data lakes. + +Today, Apache Ranger is the leading open source project for data access governance for Big Data environments, including Apache Spark. It's in use at hundreds of enterprises around the world, utilized to define and enforce data access control policies to govern sensitive data as mandated by regulations like GDPR and CCPA. + +Apache Ranger was built to centrally manage access to data used by different engines that are part of the Hadoop platforms. It is inherently architected to handle the diversity of data storage and compute environments presented by multiple cloud services in use at enterprises today. + +Apache Ranger's approach to data authorization is based on ABAC, which is a combination of the subject, action, resource, and environment. At the same time, Ranger can provide fine-grained access control to users based on the concepts of role, user, and permission. + +The best strategy for organizations migrating to the cloud is to select a data access control platform that strikes a balance between empowering administrators to make more data available to more data consumers and complying with industry and privacy regulations. More importantly, it must do this without adversely affecting the performance of the data platform or user behavior.  + +Looking for ways to draw meaningful conclusions from big data? Rommel Garcia runs through three... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/apache-ranger + +作者:[Balaji Ganesan][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/balajiganesan +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud_tools_hardware.png?itok=PGjJenqT (Tools in a cloud) diff --git a/sources/tech/20200908 Tux the Linux Penguin in its first video game.md b/sources/tech/20200908 Tux the Linux Penguin in its first video game.md new file mode 100644 index 0000000000..dbb4be38cb --- /dev/null +++ b/sources/tech/20200908 Tux the Linux Penguin in its first video game.md @@ -0,0 +1,88 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Tux the Linux Penguin in its first video game, better DNS and firewall on Android, Gitops IDE goes open source, and more open source news) +[#]: via: (https://opensource.com/article/20/9/news-sept-8) +[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeo) + +Tux the Linux Penguin in its first video game, better DNS and firewall on Android, Gitops IDE goes open source, and more open source news +====== +Catch up on the biggest open source headlines from the past two weeks. +![][1] + +In this week’s edition of our open source news roundup, Gitpod open sources its IDE platform, BraveDNS launches an all-in-one platform, and more open source news. + +### Engineers debut an open source-powered robot + +Matthias Müller and Vladlen Koltun, two engineers at Intel, have shared their new robot to tackle computer vision tasks. [The robot][2], called "OpenBot", is powered by a smartphone, which acts as a camera and computing unit.  + +The OpenBot prototype components cost $50. It's intended to be a low-cost alternative to commercially available radio-controlled models, with more computing power than educational models. + +To use OpenBot, users can connect their smartphones to an electromechanical body. They can also use Bluetooth to connect their smartphone to a video game controller like an Xbox or PlayStation.  + +Müller and Koltun say they want OpenBot to address two key issues in robotics: Scalability and accessibility. Its source code is still pending [on GitHub][3], although models for 3D-printing the case are up. + +### Tux the Linux Penguin gets his video game dues + +A new update to [a free and open source 3D kart racer][4] features an unlikely hero: Tux, the Linux penguin. + +Born in the early aughts as a project called _TuxKart_, Joerg Henrichs renamed it "Super Tux Kart" in 2006. Lux is the latest open source mascot to feature in the project: Blender and GIMP's mascots are represented as well. + +Along with adding Tux to the mix, Super Tux Kart Version 1.2 includes lots of updates. iOS users can create racing servers in-game, while all official tracks are now included in the release built on Android. And since the game is open source [on four platforms][5], all players can make their own changes to submit for review. + +### BraveDNS offers three services in one for Android users + +It's notoriously tough for Android users to find a firewall, adblocker, and DNS-over-HTTPS client in one product. But if BraveDNS lives up to the hype, this free and open source tool offers all three in one.  + +Self-described as “an [OpenSnitch][6]-inspired firewall and network monitor + a [pi-hole][7]-inspired DNS over HTTPS client with blocklists”, BraveDNS uses its own ads, trackers, and spyware-blocking DNS endpoint. Users who need features like custom blocklists and ability to store DNS logs can use the tool's DNS resolver service as a paid option. + +Along with a robust [list of firewall features][8], BraveDNS offers to backport support for dual-mode DNS and firewall execution to legacy Android versions. You'll need at least Android 8 Oreo to use the latest version of BraveDNS on their website and Google Play, but their developers pledge to make it compatible down to Android Marshmellow in the near future.  + +### Gitpod open sources its IDE platform + +With projects like Theia, Xtext, and Open VSX under its belt, Gitpod has been a strong open source presence for 10 years. Now, Gitpod -- an IDE platform for GitHub projects -- is [officially open source][9] as well. + +The move marks a big change for Gitpod, which was previously closed to community development from the start. Founders Sven Efftinge and Johannes Landgraf shared that Gitpod now meets GitHub's open source criteria under AGPL license. This allows Gitpod developers to co-collaborate on Kubernetes applications. + +Along with Gitpod's open source status, they've expanded into software as well. Self-Hosted, a private cloud platform, is now available for free to unlimited users. Designed for DevOps teams to work on enterprise projects, Self-Hosted's features include collaboration tools, analytics, dashboards, and more. + +In other news: + + * [5 open source software applications for virtualization][10] + * [Building a heavy duty open source ventilator][11] + * [China looks at Gitee as an open source alternative to Microsoft's GitHub][12] + * [The future of American industry depends on open source tech][13] + + + +Thanks, as always, to Opensource.com staff members and [Correspondents][14] for their help this week. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/news-sept-8 + +作者:[Lauren Maffeo][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/lmaffeo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/weekly_news_roundup_tv.png?itok=tibLvjBd +[2]: https://www.inceptivemind.com/openbot-open-source-low-cost-smartphone-powered-robot/15023/ +[3]: https://github.com/intel-isl/OpenBot +[4]: https://hothardware.com/news/super-tux-kart-update +[5]: https://supertuxkart.net/Download +[6]: https://github.com/evilsocket/opensnitch +[7]: https://github.com/pi-hole/pi-hole +[8]: https://www.xda-developers.com/bravedns-open-source-dns-over-https-client-firewall-adblocker-android/ +[9]: https://aithority.com/it-and-devops/gitpod-goes-open-source-with-its-ide-platform-launches-self-hosted-cloud-package/ +[10]: https://searchservervirtualization.techtarget.com/tip/5-open-source-software-applications-for-virtualization +[11]: https://hackaday.com/2020/08/28/building-a-heavy-duty-open-source-ventilator/ +[12]: https://www.scmp.com/abacus/tech/article/3099107/china-pins-its-hopes-gitee-open-source-alternative-microsofts-github +[13]: https://www.wired.com/story/opinon-the-future-of-american-industry-depends-on-open-source-tech/ +[14]: https://opensource.com/correspondent-program diff --git a/sources/tech/20200909 Create a slide deck using Jupyter Notebooks.md b/sources/tech/20200909 Create a slide deck using Jupyter Notebooks.md new file mode 100644 index 0000000000..5ba0d7fe1a --- /dev/null +++ b/sources/tech/20200909 Create a slide deck using Jupyter Notebooks.md @@ -0,0 +1,108 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Create a slide deck using Jupyter Notebooks) +[#]: via: (https://opensource.com/article/20/9/presentation-jupyter-notebooks) +[#]: author: (Moshe Zadka https://opensource.com/users/moshez) + +Create a slide deck using Jupyter Notebooks +====== +Jupyter may not be the most straightforward way to create presentation +slides and handouts, but it affords more control than simpler options. +![Person reading a book and digital copy][1] + +There are many options when it comes to creating slides for a presentation. There are straightforward ways, and generating slides directly from [Jupyter][2] is not one of them. But I was never one to do things the easy way. I also have high expectations that no other slide-generation software quite meets. + +### Why transition from slides to Jupyter? + +I want four features in my presentation software: + + 1. An environment where I can run the source code to check for errors + 2. A way to include speaker notes but hide them during the presentation + 3. To give attendees a useful handout for reading + 4. To give attendees a useful handout for exploratory learning + + + +There is nothing more uncomfortable about giving a talk than having someone in the audience point out that there is a coding mistake on one of my slides. Often, it's misspelling a word, forgetting a return statement, or doing something else that becomes invisible as soon as I leave my development environment, where I have [a linter][3] running to catch these mistakes. + +After having one too many of these moments, I decided to find a way to run the code directly from my slide editor to make sure it is correct. There are three "gotchas" I needed to consider in my solution: + + * A lot of code is boring. Nobody cares about three slides worth of `import` statements, and my hacks to mock out the `socket` module distract from my point. But it's essential that I can test the code without creating a network outage. + * Including boilerplate code is _almost_ as boring as hearing me read words directly off of the slide. We have all heard (or even given) talks where there are three bullet points, and the presenter reads them verbatim. I try to avoid this behavior by using speaker notes. + * There is nothing more annoying to the audience when the talk's reference material doesn't have any of the speaker notes. So I want to generate a beautiful handout containing all of my notes and the slides from the same source. Even better, I don't want to have slides on one handout and a separate GitHub repository for the source code. + + + +As is often the case, to solve this issue, I found myself reaching for [JupyterLab][4] and its notebook management capabilities. + +### Using Jupyter Notebooks for presentations + +I begin my presentations by using Markdown and code blocks in a Jupyter Notebook, just like I would for anything else in JupyterLab. I write out my presentation using separate Markdown sections for the text I want to show on the slides and for the speaker notes. Code snippets go into their own blocks, as you would expect. + +Because you can add a "tag" to cells, I tag any cell that has "boring" code as `no_markdown`. + +![Using tags in Jupyter Notebook][5] + +(Moshe Zadka, [CC BY-SA 4.0][6]) + +Then I convert my Notebook to Markdown with: + + +``` +`$ jupyter nbconvert presentation.ipynb --to markdown --TagRemovePreprocessor.remove_cell_tags='{"no_markdown"}'  --output build/presentation.md` +``` + +There are ways to [convert Markdown to slides][7]—but I have no idea how to use any of them and even less desire to learn. Plus, I already have my favorite presentation-creation tool: [Beamer][8]. + +But Beamer requires custom LaTeX, and that is not usually generated when you convert Markdown to LaTeX. Thankfully, one Markdown implementation–[Pandoc Markdown][9]—has a feature that lets me do what I want. Its [raw_attribute][10] extension allows including "raw" bits of the target format in the Markdown. + +This means if I run `pandoc` on the Markdown export from a notebook that includes `raw_attribute` LaTeX bits, I can have as much control over the LaTeX as I want: + + +``` +`$ pandoc --listings -o build/presentation.tex build/presentation.md` +``` + +The `--listings` makes `pandoc` use LaTeX's `listings` package, which makes code look much prettier. Putting those two pieces together, I can generate LaTeX from the notebook. + +Through a series of conversion steps, I was able to hide the parts I wanted to hide by using: + + * LaTeX `raw_attribute` bits inside Jupyter Notebook's Markdown cells + * Tagging boring cells as `no_markdown` + * Jupyter's "nbconvert" to convert the notebook to Markdown + * Pandoc to convert the Markdown to LaTeX while interpolating the `raw_attribute` bits + * Beamer to convert the Pandoc output to a PDF slide-deck + * Beamer's beamerarticle mode + + + +All combined with a little bit of duct-tape, in the form of a UNIX shell script, to produce slide-deck creation software. Ultimately, this pipeline works for me. With these tools, or similar, and some light UNIX scripting, you can make your own customized slide created pipeline, optimized to your needs and preferences. + +What is the most complicated pipeline you have ever used to build a slide deck? Let me know about it—and whether you would use it again—in the comments. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/presentation-jupyter-notebooks + +作者:[Moshe Zadka][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/read_book_guide_tutorial_teacher_student_apaper.png?itok=_GOufk6N (Person reading a book and digital copy) +[2]: https://jupyter.org/ +[3]: https://opensource.com/article/19/5/python-flake8 +[4]: https://jupyterlab.readthedocs.io/en/stable/index.html +[5]: https://opensource.com/sites/default/files/uploads/jupyter_presentations_tags.png (Using tags in Jupyter Notebook) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/article/18/5/markdown-slide-generators +[8]: https://opensource.com/article/19/1/create-presentations-beamer +[9]: https://pandoc.org/MANUAL.html#pandocs-markdown +[10]: https://pandoc.org/MANUAL.html#extension-raw_attribute diff --git a/sources/tech/20200910 How this open source test framework evolves with .NET.md b/sources/tech/20200910 How this open source test framework evolves with .NET.md new file mode 100644 index 0000000000..e9acf235d7 --- /dev/null +++ b/sources/tech/20200910 How this open source test framework evolves with .NET.md @@ -0,0 +1,156 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How this open source test framework evolves with .NET) +[#]: via: (https://opensource.com/article/20/9/testing-net-fixie) +[#]: author: (Patrick Lioi https://opensource.com/users/patricklioi) + +How this open source test framework evolves with .NET +====== +Re-evaluating and overhauling a software project's design are crucial +steps to keep up as circumstances change. +![magnifying glass on computer screen, finding a bug in the code][1] + +A software project's design is a consequence of the time it was written. As circumstances change, it's wise to take a step back and consider whether old ideas still make for a good design. If not, you risk missing out on enhancements, simplifications, new degrees of freedom, or even a project's very survival. + +This is relevant advice for [.NET][2] developers whose dependencies are subject to constant updates or are preparing for .NET 5. The [Fixie][3] project confronted this reality as we flexed to outside circumstances during the early adoption phase of .NET Core. Fixie is an open source .NET test framework similar to NUnit and xUnit with an emphasis on [developer ergonomics][4] and customization. It was developed before .NET Core and has gone through a few major design overhauls in response to platform updates. + +### The problem: Reliable assembly loading + +A .NET test project tends to feel a lot like a library: a bunch of classes with no visible entry point. The assumption is that a test runner, like Fixie's Visual Studio Test Explorer plugin, will load your test assembly, use reflection to find all the tests within it, and invoke the tests to collect results. Unlike a regular library, test projects share some similarities with regular console applications: + + 1. The test project's dependencies should be naturally loadable, as with any executable, from their own build output folder. + 2. When running multiple test projects, the loaded assemblies for test project A should be separate from the loaded assemblies for test project B. + 3. When the system under test relies on an App.config file, it should use the one local to the test project while the tests are running. + + + +I'll call these behaviors the Big Three. The Big Three are so natural that you rarely find a need to even _say_ them. A test project should resemble a console executable: It should be able to have dependencies, it should not conflict with the assemblies loaded for another project, and each project should respect its own dedicated config file. We take this all for granted. The sky is blue, water is wet, and the Big Three must be honored as tests run. + +### Fixie v1: Designing for the Big Three + +The Big Three pose a _huge_ problem for .NET test frameworks: the primary running process, such as Visual Studio Test Explorer, is nowhere near the test project's build output folder. The most natural attempt to load a test project and run it will fail all of the Big Three. + +Early alpha builds of Fixie were naive about assembly loading: The test runner .exe would load a test project and run simple tests, but it would fail as soon as a test tried to run code in another assembly—like the application being tested. By default, it searched for assemblies _near the test runner_, nowhere near the test project's build output folder. + +Once we resolved that, using that test runner to run more than one test project would result in conflicts at runtime, such as when each test project referenced different versions of the same library. + +And when we resolved that, the test runner would fail to look in the right config files, mistakenly thinking the test runner's config file was the one to use. + +In the days of the regular old .NET Framework, the solution to the Big Three came in the form of AppDomains. AppDomains are a fairly old and now-deprecated technology. Fixie v1 was developed when this was the primary solution, with no deprecation in sight, to the Big Three. _Under those circumstances_, using AppDomains to solve the Big Three was the ideal design, though it was a bit frustrating to work with them. In short, they let a single test runner carve out little pockets of loaded assemblies with rigid communication boundaries between them. + +![Fixie version 1][5] + +The Test Explorer plugin and its own dependencies (like [Mono.Cecil][6]) live in one AppDomain. The test assembly and its dependencies live in a second AppDomain. A painful serialization boundary allows requests to cross the chasm with no risk of mixing the loaded assemblies. + +AppDomains let you identify each test project's build output folder as the home of that test project's config file and dependencies. You could successfully load a test project's folder into the test runner process, call into it, and get test results while meeting the Big Three requirements. + +And then .NET Core came along. Suddenly, AppDomains were an old and deprecated concept that simply would not continue to exist in the .NET Core world. + +Circumstances had changed with a vengeance. + +### Fixie v2: Adapting to the .NET Core crisis + +At first, this seemed like the end of the Fixie project. The entire design depended on AppDomains, and if this newfangled .NET Core thing survived, Fixie would have no answer to the Big Three. Despair. Close up shop. Delete the repository. + +In these moments of despair, we were making a classic software development mistake: confusing the _solution_ with the _requirements_. The _actual requirements_ (the Big Three) had not changed. The circumstances _around_ the design had changed: AppDomains were no longer available. When people make the mistake of confusing their solution with their requirements, they may double down, grip their steering wheel tighter, and just flail around while they try to force their solution to continue working. + +Instead, we needed to recognize the plain truth: we had familiar requirements, but new circumstances, and it was time to throw out the old design for something new that met the same requirements under the new circumstances. Once we gave ourselves permission to go back to the drawing board, the solution was clear: + +The Big Three let your "library" test project feel like a console application. So, what if your test project _was_ a console application? + +A console application already has meaningful notions of loading dependencies from the right folder, distinct from the dependencies of another application, while respecting its own config file. The test runner is no longer the only process in the mix. Instead, the test runner's job is to _start_ the test project as a process of its own and communicate with it to collect results. We traded away AppDomains for interprocess communication, resulting in a new design that met all the original requirements while also working in the context of .NET Framework _and_ .NET Core projects. + +![Fixie version 2][7] + +This design kept the project alive and allowed us to serve both platforms during those shaky years when it wasn't certain which platform would survive in the long run. However, maintaining support for two worlds became increasingly painful, especially in keeping the Visual Studio Test Explorer plugin alive through every minor Visual Studio release. Every minor Fixie release involved a huge matrix of use cases to do regression testing, and every new little bump in the road brought innovation to a halt. + +On top of that, Microsoft was starting to show clear signs that it was abandoning the .NET Framework: the old Framework no longer kept up with advances in .NET Standard, ASP.NET, or C#. The .NET Framework would exist but would quickly fall by the wayside. + +Circumstances had changed again. + +### Fixie v3: Embracing One .NET + +Fixie v3 is a work in progress that we intend to release shortly after .NET 5 arrives. .NET 5 is the resolution to the .NET Framework vs. .NET Core development lines, arriving at [One .NET][8]. Instead of fighting it, we're following Microsoft's evolution: Fixie v3 will no longer run on the .NET Framework. Removing .NET Framework support allowed us to remove a lot of old, slow implementation details and dramatically simplified the regression testing scenarios we had to consider for reach release. It also allowed us to reconsider our design. + +The Big Three requirements changed only slightly: .NET Core does away with the notion of an App.config file closely tied to your executable, instead relying on a more convention-based configuration. All of Fixie's assembly-loading requirements remained. More importantly, the circumstances _around_ the design changed in a fundamental way: we were no longer limited to using types available in both .NET Framework and .NET Core. + +By promising _less_ with the removal of .NET Framework support, we _gained_ new degrees of freedom to modernize the system. + +.NET's [AssemblyLoadContext][9] is a distant cousin of AppDomains. It's not available to the .NET Framework, so it hadn't been an option for us before. AssemblyLoadContext lets you set up a dedicated loading area for an assembly and its own dependencies without polluting the surrounding process and without being limited to the original process's own folder of assemblies. In other words, it gives AppDomains' "load this folder of assemblies off to the side" behavior without the frustrating AppDomains quirks. + +We defined the concept of a **TestAssemblyLoadContext**, the little pocket of assembly-loading necessary for one test assembly folder: + + +``` +class TestAssemblyLoadContext : AssemblyLoadContext +{ +    readonly AssemblyDependencyResolver resolver; + +    public TestAssemblyLoadContext(string testAssemblyPath) +        => resolver = [new][10] AssemblyDependencyResolver(testAssemblyPath); + +    protected override Assembly? Load(AssemblyName assemblyName) +    { +        // Reuse the Fixie.dll already loaded in the containing process. +        if (assemblyName.Name == "Fixie") +            return null; + +        var assemblyPath = resolver.ResolveAssemblyToPath(assemblyName); + +        if (assemblyPath != null) +            return LoadFromAssemblyPath(assemblyPath); + +        return null; +    } + +    ... +} +``` + +Armed with this class, we can successfully load a test assembly and all its dependencies in a safe way and from the right folder. The test runner can work with the loaded Assembly directly, knowing that the loading effort won't pollute the test runner's own dependencies: + + +``` +var assemblyName = [new][10] AssemblyName(Path.GetFileNameWithoutExtension(assemblyPath)); +var testAssemblyLoadContext = [new][10] TestAssemblyLoadContext(assemblyPath); +var assembly = testAssemblyLoadContext.LoadFromAssemblyName(assemblyName); +// Use System.Reflection.* against `assembly` to find and run test methods... +``` + +We've come full circle: The Fixie v3 Visual Studio plugin uses TestAssemblyLoadContext to load test assemblies in process, similar to the way the Fixie v1 plugin did with AppDomains. The core Fixie.dll assembly need only be loaded once. Most importantly, we got to eliminate all the interprocess communication while taking advantage of the best that the new circumstances allowed. + +![Fixie version 3][11] + +### Always be designing + +When you work with any long-lived system, some of your maintenance pains are really clues that outside circumstances have changed. If your circumstances are changing, take a step back and reconsider your design. Are you mistaking your _solution_ for your _requirements_? Articulate your requirements separate from your solution, and see whether your circumstances suggest a new and perhaps even exciting direction. + +With news of Microsoft making the server side of .NET open source, we look at how the creation of... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/testing-net-fixie + +作者:[Patrick Lioi][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/patricklioi +[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://en.wikipedia.org/wiki/.NET_Framework +[3]: https://github.com/fixie/fixie +[4]: https://headspring.com/2020/04/01/fixie-test-framework-developer-ergonomics/ +[5]: https://opensource.com/sites/default/files/fixie-design-diagram-v1-cropped.jpg (Fixie version 1) +[6]: https://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/ +[7]: https://opensource.com/sites/default/files/fixie-design-diagram-v2-cropped_0.jpg (Fixie version 2) +[8]: https://channel9.msdn.com/Events/Build/2020/BOD106 +[9]: https://docs.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support +[10]: http://www.google.com/search?q=new+msdn.microsoft.com +[11]: https://opensource.com/sites/default/files/fixie-design-diagram-v3-cropped_0.jpg (Fixie version 3) diff --git a/sources/tech/20200914 The future of virtual conferences, service mesh, and more industry trends.md b/sources/tech/20200914 The future of virtual conferences, service mesh, and more industry trends.md new file mode 100644 index 0000000000..8a895eba9e --- /dev/null +++ b/sources/tech/20200914 The future of virtual conferences, service mesh, and more industry trends.md @@ -0,0 +1,69 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (The future of virtual conferences, service mesh, and more industry trends) +[#]: via: (https://opensource.com/article/20/9/virtual-conferences-service-mesh-industry-trends) +[#]: author: (Tim Hildred https://opensource.com/users/thildred) + +The future of virtual conferences, service mesh, and more industry trends +====== +A weekly look at open source community and industry trends. +![Computer laptop in space][1] + +As part of my role as a principal communication strategist at an enterprise software company with an open source development model, I publish a regular update about open source community, market, and industry trends. Here are some of my and their favorite articles from that update. + +## [Enough with the Linux security FUD][2] + +> Whether you're running Windows Server, Linux, NetBSD, whatever on your mission-critical systems, if you utterly fail at security, it doesn't matter how "secure" your operating system is. It's like leaving your car keys in an unlocked car, your system will be hacked, your car will be stolen.  + +**The impact**: I worry a bit about the organizations at the size that comes before "can afford fulltime expert IT" where you might find someone who likes computers taking on that responsibility by default. If that sounds like you or your organization, get that person some training! + +## [A look back at our FIRST KubeCon + CloudNativeCon virtual conference][3] + +> The first virtual KubeCon + CloudNativeCon just wrapped up and it was a huge success thanks to our amazing community of doers – builders, operators and advocates. We are so thrilled that the cloud native community came together with hope and positivity to make this a truly community-driven event we will remember for a long time. We may not have been able to meet in person this year but we are indomitable!  + +**The impact**: These virtual experiences keep getting better and adding to the state of the art; running them requires important muscles that have until this point gone underused. Whatever else happens as the pandemic progresses, I hope we get a sense of "if we really think hard about it, we can build powerful bonds within our communities without airfares and hotel rooms." It doesn't have to be the same as sharing a beer to be impactful. + +## [Istio 1.7: Security improvements take centre stage as users continue to speculate about the service mesh’s future][4] + +> Lately, Istio has been anything but boring, especially after originator Google came into some criticism for handing the project’s trademarks over to its recently founded [Open Usage Commons][5]. The step led to some turmoil, raising questions about how neutral OUC really was as well as basically smothering the hopes of those who had wished for Istio to become a CNCF project one day. [According to IBM][6], a founding member of the project, there had actually been an “agreement” to do so with Google, which only seems sensible, given that the Envoy proxy, which is central to Istio, has found a vendor-neutral home at the organisation. + +**The impact**: My guess is that the project has enough adoption and functionality leading over competitive projects that it would take some truly dastardly governance to blow it. + +## [Z is for Zowe–the open path to mainframe DevOps][7] + +> This article describes the framework’s ability to onboard the mainframe to enterprise DevOps, so developers, systems programmers and others who work with the mainframe can now do so the same way their peers do with other IT platforms (i.e., cloud, mobile, distributed). These shared experiences close the gap between mainframers and others while preserving the core advantages of the platform. Common tools fuel a common language that benefits all, especially when deploying hybrid applications (e.g., web front-end with mainframe back-end). + +**The impact**: The point about common tools fueling a common language is subtle but important. Tools for tools' sake won't get you very far; bringing more minds to bear on a problem will. + +## [Tiering self-service by user competence][8] + +> The degree to which each team can reasonably create its own configurations is related to the team’s competence with cloud solution architecture, cloud engineering, and cloud security. Not every person on the team may have a high level of competence; in fact, that will generally not be the case. However, the very least, for full self-service there needs to be at least one person with strong competencies in each of those areas, who has oversight responsibilities, acts an expert (provides assistance/mentorship within the team), and does any necessary code review. + +**The impact**: We do it for driving cars and learning to ski; so why shouldn't we do it when it comes to letting people deploy sometimes critical applications? + +_I hope you enjoyed this list and come back next week for more open source community, market, and industry trends._ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/virtual-conferences-service-mesh-industry-trends + +作者:[Tim Hildred][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/computer_space_graphic_cosmic.png?itok=wu493YbB (Computer laptop in space) +[2]: https://www.zdnet.com/article/enough-with-the-linux-security-fud/#ftag=RSSbaffb68 +[3]: https://www.cncf.io/blog/2020/08/26/a-look-back-at-our-first-kubecon-cloudnativecon-virtual-conference/ +[4]: https://devclass.com/2020/08/24/istio-service-mesh-1_7/ +[5]: https://istio.io/latest/blog/2020/open-usage/ +[6]: https://developer.ibm.com/blogs/istio-google-open-usage-commons/ +[7]: https://devops.com/z-is-for-zowe-the-open-path-to-mainframe-devops/ +[8]: https://cloudpundit.com/2020/08/10/tiering-self-service-by-user-competence/ diff --git a/sources/tech/20200914 Use Python to solve a charity-s business problem.md b/sources/tech/20200914 Use Python to solve a charity-s business problem.md new file mode 100644 index 0000000000..febc102037 --- /dev/null +++ b/sources/tech/20200914 Use Python to solve a charity-s business problem.md @@ -0,0 +1,215 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Use Python to solve a charity's business problem) +[#]: via: (https://opensource.com/article/20/9/solve-problem-python) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) + +Use Python to solve a charity's business problem +====== +Comparing how different programming languages solve the same problem is +fun and instructive. Next up, Python. +![Python programming language logo with question marks][1] + +In my [first article][2] in this series, I described a problem of dividing bulk supplies into hampers of similar value to distribute to struggling neighbors in your community. I also wrote about how I enjoy solving small problems like this with small programs in various languages and comparing how they do it. + +In the first article, I solved this problem with the [Groovy][3] programming language. Groovy is like [Python][4] in many ways, but syntactically it's more like C and Java. Therefore, it should be interesting and instructive to create the same solution in Python. + +### The Python solution + +In Java, I declare utility classes to hold tuples of data (the new record feature is going to be great for that). In Groovy, I use the language support for maps, and I follow the same approach in Python. + +Use a list of dictionaries to hold the bulk items picked up from the wholesaler: + + +``` +packs = [ +        {'item':'Rice','brand':'Best Family','units':10,'price':5650,'quantity':1}, +        {'item':'Spaghetti','brand':'Best Family','units':1,'price':327,'quantity':10}, +        {'item':'Sardines','brand':'Fresh Caught','units':3,'price':2727,'quantity':3}, +        {'item':'Chickpeas','brand':'Southern Style','units':2,'price':2600,'quantity':5}, +        {'item':'Lentils','brand':'Southern Style','units':2,'price':2378,'quantity':5}, +        {'item':'Vegetable oil','brand':'Crafco','units':12,'price':10020,'quantity':1}, +        {'item':'UHT milk','brand':'Atlantic','units':6,'price':4560,'quantity':2}, +        {'item':'Flour','brand':'Neighbor Mills','units':10,'price':5200,'quantity':1}, +        {'item':'Tomato sauce','brand':'Best Family','units':1,'price':190,'quantity':10}, +        {'item':'Sugar','brand':'Good Price','units':1,'price':565,'quantity':10}, +        {'item':'Tea','brand':'Superior','units':5,'price':2720,'quantity':2}, +        {'item':'Coffee','brand':'Colombia Select','units':2,'price':4180,'quantity':5}, +        {'item':'Tofu','brand':'Gourmet Choice','units':1,'price':1580,'quantity':10}, +        {'item':'Bleach','brand':'Blanchite','units':5,'price':3550,'quantity':2}, +        {'item':'Soap','brand':'Sunny Day','units':6,'price':1794,'quantity':2}] +``` + +There is one bulk pack of 10 bags of rice and 10 bulk packs with one bag each of spaghetti. In the above, the variable `packs` is set to a Python list of dictionaries. This turns out to be very similar to the Groovy approach. A few points worth noting about the difference between Groovy and Python: + + 1. In Python, there is no keyword used to define the variable `packs`; Python expects the first use to set a value. + 2. Python dictionary keys (e.g., `item`, `brand`, `units`, `price`, `quantity`) require quotes to indicate they are strings; Groovy assumes these are strings, but accepts quotes as well. + 3. In Python, the notation `{ … }` indicates a dictionary declaration; Groovy uses the same square brackets as a list, but the structure in both cases must have key-value pairs. + + + +And, yes, those prices aren't in US dollars. + +Next, unpack the bulk packages. Unpacking the single bulk package of rice, for example, will yield 10 units of rice; that is, the total number of units yielded is `units * quantity`. The Groovy script uses a handy function called `collectMany` that can be used to flatten out lists of lists. As far as I know, Python doesn't have anything similar, so use two list comprehensions to produce the same result: + + +``` +units = [[{'item':pack['item'],'brand':pack['brand'], +        'price':(pack['price'] / pack['units'])}] * +        (pack['units'] * pack['quantity']) for pack in packs] +units = [x for sublist in units for x in sublist] +``` + +The first list comprehension (assignment to units) builds the list of lists of dictionaries. The second "flattens" that into just a list of dictionaries. Note that both Python and Groovy provide an `*` operator that takes a list on the left and a number `N` on the right and replicates the list `N` times. + +The final step is to repack the units into the hampers for distribution. As in the Groovy version, you need to get a bit more specific about the ideal hamper value, and you might as well not be overly restrictive when you get down to just a few units left: + + +``` +valueIdeal = 5000 +valueMax = valueIdeal * 1.1 +``` + +OK! Repack the hampers: + + +``` +import random +hamperNumber = 0           # [1] +while len(units) > 0:      # [2] +    hamperNumber += 1 +    hamper = [] +    value = 0 +    canAdd = True              # [2.1] +    while canAdd:              # [2.2] +        u = random.randint(0,len(units)-1)  # [2.2.1] +        canAdd = False                      # [2.2.2] +        o = 0                               # [2.2.3] +        while o < len(units):               # [2.2.4] +            uo = (u + o) % len(units) +            unit = units[uo] +            unitPrice = unit['price']          # [2.2.4.1] +            if len(units) < 3 or not (unit in hamper) and (value + unitPrice) < valueMax: +                                               # [2.2.4.2] +                hamper.append(unit) +                value += unitPrice +                units.pop(u)                   # [2.2.4.3] +                canAdd = len(units) > 0 +                break                          # [2.2.4.4] +            o += 1                             # [2.2.4.5] +                                            # [2.2.5] +    print('') +    print('Hamper',hamperNumber,'value',value) +    for item in hamper: +        print('%-25s%-25s%7.2f' % (item['item'],item['brand'],item['price'])) # [2.3] +    print('Remaining units',len(units))                                       # [2.4] +``` + +Some clarification, with numbers in brackets in the comments above (e.g., _[1]_) corresponding to the clarifications below: + + * 1\. Import Python's random number generator facilities and initialize the hamper number. + * 2\. This `while` loop will redistribute units into hampers as long as there are more available: + * 2.1 Increment the hamper number, get a new empty hamper (a list of units), and set its value to 0; start off assuming you can add more items to the hamper. + * 2.2 This `while` loop will add as many units to the hamper as possible (the Groovy code used a `for` loop, but Python's `for` loops expect to iterate over something, while Groovy has the more traditional C form of `for` loop): + * 2.2.1 Get a random number between zero and the number of remaining units minus 1. + * 2.2.2 Assume you can't find more units to add. + * 2.2.3 Create a variable to be used for the offset from the starting point where you're looking for items to put in the hamper. + * 2.2.4 Starting at the randomly chosen index, this `while` loop will try to find a unit that can be added to the hamper (once again, note that the Python `for` loop probably isn't suitable here since the length of the list will change during processing). + * 2.2.4.1. Figure out which unit to look at (random starting point + offset) and get its price. + * 2.2.4.2 You can add this unit to the hamper if there are only a few left or if the value of the hamper isn't too high once the unit is added. + * 2.2.4.3 Add the unit to the hamper, increment the hamper value by the unit price, remove the unit from the available units list. + * 2.2.4.4 As long as there are units left, you can add more, so break out of this loop to keep looking. + * 2.2.4.5 Increment the offset. + * 2.2.5 On exit from this `while` loop, if you inspected every remaining unit and could not find one to add to the hamper, the hamper is complete; otherwise, you found one and can continue looking for more. + * 2.3 Print out the contents of the hamper. + * 2.4 Print out the remaining units info. + + + +When you run this code, the output looks quite similar to the output from the Groovy program: + + +``` +Hamper 1 value 5304.0 +UHT milk                 Atlantic                  760.00 +Tomato sauce             Best Family               190.00 +Rice                     Best Family               565.00 +Coffee                   Colombia Select          2090.00 +Sugar                    Good Price                565.00 +Vegetable oil            Crafco                    835.00 +Soap                     Sunny Day                 299.00 +Remaining units 148 + +Hamper 2 value 5428.0 +Tea                      Superior                  544.00 +Lentils                  Southern Style           1189.00 +Flour                    Neighbor Mills            520.00 +Tofu                     Gourmet Choice           1580.00 +Vegetable oil            Crafco                    835.00 +UHT milk                 Atlantic                  760.00 +Remaining units 142 + +Hamper 3 value 5424.0 +Soap                     Sunny Day                 299.00 +Chickpeas                Southern Style           1300.00 +Sardines                 Fresh Caught              909.00 +Rice                     Best Family               565.00 +Vegetable oil            Crafco                    835.00 +Spaghetti                Best Family               327.00 +Lentils                  Southern Style           1189.00 +Remaining units 135 + +… + +Hamper 21 value 5145.0 +Tomato sauce             Best Family               190.00 +Tea                      Superior                  544.00 +Chickpeas                Southern Style           1300.00 +Spaghetti                Best Family               327.00 +UHT milk                 Atlantic                  760.00 +Vegetable oil            Crafco                    835.00 +Lentils                  Southern Style           1189.00 +Remaining units 4 + +Hamper 22 value 2874.0 +Sardines                 Fresh Caught              909.00 +Vegetable oil            Crafco                    835.00 +Rice                     Best Family               565.00 +Rice                     Best Family               565.00 +Remaining units 0 +``` + +The last hamper is abbreviated in contents and value. + +### Closing thoughts + +At a glance, there isn't a whole lot of difference between the Python and Groovy versions of this program. Both have a similar set of constructs that make handling lists and dictionaries very straightforward. Neither requires a lot of "boilerplate code" or other "ceremonial" actions. + +Also, as in the Groovy example, there is some fiddly business about being able to add units to the hamper. Basically, you pick a random position in the list of units and, starting at that position, iterate through the list until you either find a unit whose price allows it to be included or until you exhaust the list. Also, when there are only a few items left, you just toss them into the last hamper. + +Another issue worth mentioning: This isn't a particularly efficient approach. Removing elements from lists, being careless about repeated expressions, and a few other things make this less suitable for a huge redistribution problem. Still, it runs in a blink on my old machine. + +If you are shuddering at my use of `while` loops and mutating the data in this code, you probably wish I made it more functional. I couldn't think of a way to use map and reduce features in Python in conjunction with a random selection of units for repackaging. Can you? + +In the next article, I'll re-do this in Java just to see how much less effort Groovy and Python are, and future articles will cover Julia and Go. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/solve-problem-python + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/clhermansen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_programming_question.png?itok=cOeJW-8r (Python programming language logo with question marks) +[2]: https://opensource.com/article/20/8/solving-problem-groovy +[3]: https://groovy-lang.org/ +[4]: https://www.python.org/ diff --git a/sources/tech/20200916 Analyze Linux startup performance.md b/sources/tech/20200916 Analyze Linux startup performance.md new file mode 100644 index 0000000000..855251cfc1 --- /dev/null +++ b/sources/tech/20200916 Analyze Linux startup performance.md @@ -0,0 +1,422 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Analyze Linux startup performance) +[#]: via: (https://opensource.com/article/20/9/systemd-startup-configuration) +[#]: author: (David Both https://opensource.com/users/dboth) + +Analyze Linux startup performance +====== +Use systemd-analyze to get insights and solve problems with Linux +startup performance. +![Magnifying glass on code][1] + +Part of the system administrator's job is to analyze the performance of systems and to find and resolve problems that cause poor performance and long startup times. Sysadmins also need to check other aspects of systemd configuration and usage. + +The systemd init system provides the `systemd-analyze` tool that can help uncover performance problems and other important systemd information. In a previous article, [_Analyzing systemd calendar and timespans_][2], I used `systemd-analyze` to analyze timestamps and timespans in systemd timers, but this tool has many other uses, some of which I will explore in this article. + +### Startup overview + +The Linux startup sequence is a good place to begin exploring because many `systemd-analyze` tool functions are targeted at startup. But first, it is important to understand the difference between boot and startup. The boot sequence starts with the BIOS power-on self test (POST) and ends when the kernel is finished loading and takes control of the host system, which is the beginning of startup and the point when the systemd journal begins. + +In the second article in this series, [_Understanding systemd at startup on Linux_][3], I discuss startup in a bit more detail with respect to what happens and in what sequence. In this article, I want to examine the startup sequence to look at the amount of time it takes to go through startup and which tasks take the most time. + +The results I'll show below are from my primary workstation, which is much more interesting than a virtual machine's results. This workstation consists of an ASUS TUF X299 Mark 2 motherboard, an Intel i9-7960X CPU with 16 cores and 32 CPUs (threads), and 64GB of RAM. Some of the commands below can be run by a non-root user, but I will use root in this article to prevent having to switch between users. + +There are several options for examining the startup sequence. The simplest form of the `systemd-analyze` command displays an overview of the amount of time spent in each of the main sections of startup, the kernel startup, loading and running `initrd` (i.e., initial ramdisk, a temporary system image that is used to initialize some hardware and mount the `/` [root] filesystem), and userspace (where all the programs and daemons required to bring the host up to a usable state are loaded). If no subcommand is passed to the command, `systemd-analyze time` is implied: + + +``` +[root@david ~]$ systemd-analyze +Startup finished in 53.921s (firmware) + 2.643s (loader) + 2.236s (kernel) + 4.348s (initrd) + 10.082s (userspace) = 1min 13.233s +graphical.target reached after 10.071s in userspace +[root@david ~]# +``` + +The most notable data in this output is the amount of time spent in firmware (BIOS): almost 54 seconds. This is an extraordinary amount of time, and none of my other physical systems take anywhere near as long to get through BIOS. + +My System76 Oryx Pro laptop spends only 8.506 seconds in BIOS, and all of my home-built systems take a bit less than 10 seconds. After some online searches, I found that this motherboard is known for its inordinately long BIOS boot time. My motherboard never "just boots." It always hangs, and I need to do a power off/on cycle, and then BIOS starts with an error, and I need to press F1 to enter BIOS configuration, from where I can select the boot drive and finish the boot. This is where the extra time comes from. + +Not all hosts show firmware data. My unscientific experiments lead me to believe that this data is shown only for Intel generation 9 processors or above. But that could be incorrect. + +This overview of the boot startup process is interesting and provides good (though limited) information, but there is much more information available about startup, as I'll describe below. + +### Assigning blame + +You can use `systemd-analyze blame` to discover which systemd units take the most time to initialize. The results are displayed in order by the amount of time they take to initialize, from most to least: + + +``` +[root@david ~]$ systemd-analyze blame                                                                         +       5.417s NetworkManager-wait-online.service                                                       +       3.423s dracut-initqueue.service                                                                 +       2.715s systemd-udev-settle.service                                                               +       2.519s fstrim.service                                                                           +       1.275s udisks2.service                                                                           +       1.271s smartd.service                                                                           +        996ms upower.service                                                                           +        637ms lvm2-monitor.service                                                                     +        533ms lvm2-pvscan@8:17.service                                                                 +        520ms dmraid-activation.service                                                                 +        460ms vboxdrv.service                                                                           +        396ms initrd-switch-root.service +<SNIP – removed lots of entries with increasingly small times> +``` + +Because many of these services start in parallel, the numbers may add up to significantly more than the total given by `systemd-analyze time` for everything after the BIOS. All of these are small numbers, so I cannot find any significant savings here. + +The data from this command can provide indications about which services you might consider to improve boot times. Services that are not used can be disabled. There does not appear to be any single service that is taking an excessively long time during this startup sequence. You may see different results for each boot and startup. + +### Critical chains + +Like the critical path in project management, a _critical chain_ shows the time-critical chain of events that take place during startup. These are the systemd units you want to look at if startup is slow, as they are the ones that would cause delays. This tool does not display all the units that start, only those in this critical chain of events: + + +``` +[root@david ~]# systemd-analyze critical-chain +The time when unit became active or started is printed after the "@" character. +The time the unit took to start is printed after the "+" character. + +graphical.target @10.071s +└─lxdm.service @10.071s +  └─plymouth-quit.service @10.047s +22ms +    └─systemd-user-sessions.service @10.031s +7ms +      └─remote-fs.target @10.026s +        └─remote-fs-pre.target @10.025s +          └─nfs-client.target @4.636s +            └─gssproxy.service @4.607s +28ms +              └─network.target @4.604s +                └─NetworkManager.service @4.383s +219ms +                  └─dbus-broker.service @4.434s +136ms +                    └─dbus.socket @4.369s +                      └─sysinit.target @4.354s +                        └─systemd-update-utmp.service @4.345s +9ms +                          └─auditd.service @4.301s +42ms +                            └─systemd-tmpfiles-setup.service @4.254s +42ms +                              └─import-state.service @4.233s +19ms +                                └─local-fs.target @4.229s +                                  └─Virtual.mount @4.019s +209ms +                                    └─systemd-fsck@dev-mapper-vg_david2\x2dVirtual.service @3.742s +274ms +                                      └─local-fs-pre.target @3.726s +                                        └─lvm2-monitor.service @356ms +637ms +                                          └─dm-event.socket @319ms +                                            └─-.mount +                                              └─system.slice +                                                └─-.slice +[root@david ~]# +``` + +The numbers preceded with `@` show the absolute number of seconds since startup began when the unit becomes active. The numbers preceded by `+` show the amount of time it takes for the unit to start. + +### System state + +Sometimes you need to determine the system's current state. The `systemd-analyze dump` command dumps a _massive_ amount of data about the current system state. It starts with a list of the primary boot timestamps, a list of each systemd unit, and a complete description of the state of each: + + +``` +[root@david ~]# systemd-analyze dump +Timestamp firmware: 1min 7.983523s +Timestamp loader: 3.872325s +Timestamp kernel: Wed 2020-08-26 12:33:35 EDT +Timestamp initrd: Wed 2020-08-26 12:33:38 EDT +Timestamp userspace: Wed 2020-08-26 12:33:42 EDT +Timestamp finish: Wed 2020-08-26 16:33:56 EDT +Timestamp security-start: Wed 2020-08-26 12:33:42 EDT +Timestamp security-finish: Wed 2020-08-26 12:33:42 EDT +Timestamp generators-start: Wed 2020-08-26 16:33:42 EDT +Timestamp generators-finish: Wed 2020-08-26 16:33:43 EDT +Timestamp units-load-start: Wed 2020-08-26 16:33:43 EDT +Timestamp units-load-finish: Wed 2020-08-26 16:33:43 EDT +Timestamp initrd-security-start: Wed 2020-08-26 12:33:38 EDT +Timestamp initrd-security-finish: Wed 2020-08-26 12:33:38 EDT +Timestamp initrd-generators-start: Wed 2020-08-26 12:33:38 EDT +Timestamp initrd-generators-finish: Wed 2020-08-26 12:33:38 EDT +Timestamp initrd-units-load-start: Wed 2020-08-26 12:33:38 EDT +Timestamp initrd-units-load-finish: Wed 2020-08-26 12:33:38 EDT +-> Unit system.slice: +        Description: System Slice +        Instance: n/a +        Unit Load State: loaded +        Unit Active State: active +        State Change Timestamp: Wed 2020-08-26 12:33:38 EDT +        Inactive Exit Timestamp: Wed 2020-08-26 12:33:38 EDT +        Active Enter Timestamp: Wed 2020-08-26 12:33:38 EDT +        Active Exit Timestamp: n/a +        Inactive Enter Timestamp: n/a +        May GC: no +<SNIP – Deleted a bazillion lines of output> +``` + +On my main workstation, this command generated a stream of 49,680 lines and about 1.66MB. This command is very fast, so you don't need to wait for the results. + +I do like the wealth of detail provided for the various connected devices, such as storage. Each systemd unit has a section with details such as modes for various runtimes, cache, and log directories, the command line used to start the unit, the process ID (PID), the start timestamp, as well as memory and file limits. + +The man page for `systemd-analyze` shows the `systemd-analyze --user dump` option, which is intended to display information about the internal state of the user manager. This fails for me, and internet searches indicate that there may be a problem with it. In systemd, `--user` instances are used to manage and control the resources for the hierarchy of processes belonging to each user. The processes for each user are part of a control group, which I'll cover in a future article. + +### Analytic graphs + +Most pointy-haired-bosses (PHBs) and many good managers find pretty graphs easier to read and understand than the text-based system performance data I usually prefer. Sometimes, though, even I like a good graph, and `systemd-analyze` provides the capability to display boot/startup data in an [SVG][4] vector graphics chart. + +The following command generates a vector graphics file that displays the events that take place during boot and startup. It only takes a few seconds to generate this file: + + +``` +`[root@david ~]# systemd-analyze plot > /tmp/bootup.svg` +``` + +This command creates an SVG, which is a text file that defines a series of graphic vectors that applications, including Image Viewer, Ristretto, Okular, Eye of Mate, LibreOffice Draw, and others, use to generate a graph. These applications process SVG files to create an image. + +I used LibreOffice Draw to render a graph. The graph is huge, and you need to zoom in considerably to make out any detail. Here is a small portion of it: + +![The bootup.svg file displayed in LibreOffice Draw.][5] + +(David Both, [CC BY-SA 4.0][6]) + +The bootup sequence is to the left of the zero (0) on the timeline in the graph, and the startup sequence is to the right of zero. This small portion shows the kernel, `initrd`, and the processes `initrd` started. + +This graph shows at a glance what started when, how long it took to start up, and the major dependencies. The critical path is highlighted in red. + +Another command that generates graphical output is `systemd-analyze plot`. It generates textual dependency graph descriptions in [DOT][7] format. The resulting data stream is then piped through the `dot` utility, which is part of a family of programs that can be used to generate vector graphic files from various types of data. These SVG files can also be processed by the tools listed above. + +First, generate the file. This took almost nine minutes on my primary workstation: + + +``` +[root@david ~]# time systemd-analyze dot | dot -Tsvg > /tmp/test.svg +   Color legend: black     = Requires +                 dark blue = Requisite +                 dark grey = Wants +                 red       = Conflicts +                 green     = After + +real    8m37.544s +user    8m35.375s +sys     0m0.070s +[root@david ~]# +``` + +I won't reproduce the output here because the resulting graph is pretty much spaghetti. But you should try it and view the result to see what I mean. + +### Conditionals + +One of the more interesting, yet somewhat generic, capabilities I discovered while reading the `systemd-analyze(1)` man page is the `condition` subcommand. (Yes—I do read the man pages, and it is amazing what I have learned this way!) This `condition` subcommand can be used to test the conditions and asserts that can be used in systemd unit files. + +It can also be used in scripts to evaluate one or more conditions—it returns a zero (0) if all are met or a one (1) if any condition is not met. In either case, it also spews text about its findings. + +The example below, from the man page, is a bit complex. It tests for a kernel version between 4.0 and 5.1, that the host is running on AC power, that the system architecture is anything but ARM, and that the directory `/etc/os-release` exists. I added the `echo $?` statement to print the return code. + + +``` +[root@david ~]# systemd-analyze condition 'ConditionKernelVersion = ! <4.0' \ +                    'ConditionKernelVersion = >=5.1' \ +                    'ConditionACPower=|false' \ +                    'ConditionArchitecture=|!arm' \ +                    'AssertPathExists=/etc/os-release' ; \ +echo $? +test.service: AssertPathExists=/etc/os-release succeeded. +Asserts succeeded. +test.service: ConditionArchitecture=|!arm succeeded. +test.service: ConditionACPower=|false failed. +test.service: ConditionKernelVersion=>=5.1 succeeded. +test.service: ConditionKernelVersion=!<4.0 succeeded. +Conditions succeeded. +0 +[root@david ~]# +``` + +The list of conditions and asserts starts around line 600 on the `systemd.unit(5)` man page. + +### Listing configuration files + +The `systemd-analyze` tool provides a way to send the contents of various configuration files to `STDOUT`, as shown here. The base directory is `/etc/`: + + +``` +[root@david ~]# systemd-analyze cat-config systemd/system/display-manager.service +# /etc/systemd/system/display-manager.service +[Unit] +Description=LXDM (Lightweight X11 Display Manager) +#Documentation=man:lxdm(8) +Conflicts=[getty@tty1.service][8] +After=systemd-user-sessions.service [getty@tty1.service][8] plymouth-quit.service livesys-late.service +#Conflicts=plymouth-quit.service + +[Service] +ExecStart=/usr/sbin/lxdm +Restart=always +IgnoreSIGPIPE=no +#BusName=org.freedesktop.lxdm + +[Install] +Alias=display-manager.service +[root@david ~]# +``` + +This is a lot of typing to do nothing more than a standard `cat` command does. I find the next command a tiny bit helpful. It can search out files with the specified pattern within the standard systemd locations: + + +``` +[root@david ~]# systemctl cat backup* +# /etc/systemd/system/backup.timer +# This timer unit runs the local backup program +# (C) David Both +# Licensed under GPL V2 +# + +[Unit] +Description=Perform system backups +Requires=backup.service + +[Timer] +Unit=backup.service +OnCalendar=*-*-* 00:15:30 + +[Install] +WantedBy=timers.target + +# /etc/systemd/system/backup.service +# This service unit runs the rsbu backup program +# By David Both +# Licensed under GPL V2 +# + +[Unit] +Description=Backup services using rsbu +Wants=backup.timer + +[Service] +Type=oneshot +Environment="HOME=/root" +ExecStart=/usr/local/bin/rsbu -bvd1 +ExecStart=/usr/local/bin/rsbu -buvd2 + +[Install] +WantedBy=multi-user.target + +[root@david ~]# +``` + +Both of these commands preface the contents of each file with a comment line containing the file's full path and name. + +### Unit file verification + +After creating a new unit file, it can be helpful to verify that its syntax is correct. This is what the `verify` subcommand does. It can list directives that are spelled incorrectly and call out missing service units: + + +``` +`[root@david ~]# systemd-analyze verify /etc/systemd/system/backup.service` +``` + +Adhering to the Unix/Linux philosophy that "silence is golden," a lack of output messages means that there are no errors in the scanned file. + +### Security + +The `security` subcommand checks the security level of specified services. It only works on service units and not on other types of unit files: + + +``` +[root@david ~]# systemd-analyze security display-manager +  NAME                                                        DESCRIPTION                                                     > +✗ PrivateNetwork=                                             Service has access to the host's network                        > +✗ User=/DynamicUser=                                          Service runs as root user                                       > +✗ CapabilityBoundingSet=~CAP_SET(UID|GID|PCAP)                Service may change UID/GID identities/capabilities              > +✗ CapabilityBoundingSet=~CAP_SYS_ADMIN                        Service has administrator privileges                            > +✗ CapabilityBoundingSet=~CAP_SYS_PTRACE                       Service has ptrace() debugging abilities                        > +✗ RestrictAddressFamilies=~AF_(INET|INET6)                    Service may allocate Internet sockets                           > +✗ RestrictNamespaces=~CLONE_NEWUSER                           Service may create user namespaces                              > +✗ RestrictAddressFamilies=~…                                  Service may allocate exotic sockets                             > +✗ CapabilityBoundingSet=~CAP_(CHOWN|FSETID|SETFCAP)           Service may change file ownership/access mode/capabilities unres> +✗ CapabilityBoundingSet=~CAP_(DAC_*|FOWNER|IPC_OWNER)         Service may override UNIX file/IPC permission checks            > +✗ CapabilityBoundingSet=~CAP_NET_ADMIN                        Service has network configuration privileges                    > +✗ CapabilityBoundingSet=~CAP_SYS_MODULE                       Service may load kernel modules +<SNIP> +✗ CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG                   Service may issue vhangup()                                     > +✗ CapabilityBoundingSet=~CAP_WAKE_ALARM                       Service may program timers that wake up the system              > +✗ RestrictAddressFamilies=~AF_UNIX                            Service may allocate local sockets                              > + +→ Overall exposure level for backup.service: 9.6 UNSAFE 😨 +lines 34-81/81 (END) +``` + +Yes, the emoji is part of the output. But, of course, many services need pretty much complete access to everything in order to do their work. I ran this program against several services, including my own backup service; the results may differ, but the bottom line seems to be mostly the same. + +This tool would be very useful for checking and fixing userspace service units in security-critical environments. I don't think it has much to offer for most of us. + +### Final thoughts + +This powerful tool offers some interesting and amazingly useful options. Much of what this article explores is about using `systemd-analyze` to provide insights into Linux's startup performance using systemd. It can also analyze other aspects of systemd. + +Some of these tools are of limited use, and a couple should be forgotten completely. But most can be used to good effect when resolving problems with startup and other systemd functions. + +### Resources + +There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup. This list has grown since I started this series of articles to reflect the research I have done. + + * The [systemd.unit(5) manual page][9] contains a nice list of unit file sections and their configuration options along with concise descriptions of each. + * The Fedora Project has a good, practical [guide to systemd][10]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd. + * The Fedora Project also has a good [cheat sheet][11] that cross-references the old SystemV commands to comparable systemd ones. + * Red Hat documentation contains a good description of the [Unit file structure][12] as well as other important information.   + * For detailed technical information about systemd and the reasons for creating it, check out Freedesktop.org's [description of systemd][13]. + * [Linux.com][14]'s "More systemd fun" offers more advanced systemd [information and tips][15]. + + + +There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers. + + * [Rethinking PID 1][16] + * [systemd for Administrators, Part I][17] + * [systemd for Administrators, Part II][18] + * [systemd for Administrators, Part III][19] + * [systemd for Administrators, Part IV][20] + * [systemd for Administrators, Part V][21] + * [systemd for Administrators, Part VI][22] + * [systemd for Administrators, Part VII][23] + * [systemd for Administrators, Part VIII][24] + * [systemd for Administrators, Part IX][25] + * [systemd for Administrators, Part X][26] + * [systemd for Administrators, Part XI][27] + + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/systemd-startup-configuration + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/find-file-linux-code_magnifying_glass_zero.png?itok=E2HoPDg0 (Magnifying glass on code) +[2]: https://opensource.com/article/20/7/systemd-calendar-timespans +[3]: https://opensource.com/article/20/5/systemd-startup?utm_campaign=intrel +[4]: https://en.wikipedia.org/wiki/Scalable_Vector_Graphics +[5]: https://opensource.com/sites/default/files/uploads/bootup.svg-graph.png (The bootup.svg file displayed in LibreOffice Draw.) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://en.wikipedia.org/wiki/DOT_(graph_description_language) +[8]: mailto:getty@tty1.service +[9]: https://man7.org/linux/man-pages/man5/systemd.unit.5.html +[10]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[11]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[12]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/managing-services-with-systemd_configuring-basic-system-settings#Managing_Services_with_systemd-Unit_File_Structure +[13]: https://www.freedesktop.org/wiki/Software/systemd/ +[14]: http://Linux.com +[15]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[16]: http://0pointer.de/blog/projects/systemd.html +[17]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[18]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[19]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[20]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[21]: http://0pointer.de/blog/projects/three-levels-of-off.html +[22]: http://0pointer.de/blog/projects/changing-roots +[23]: http://0pointer.de/blog/projects/blame-game.html +[24]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[25]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[26]: http://0pointer.de/blog/projects/instances.html +[27]: http://0pointer.de/blog/projects/inetd.html diff --git a/sources/tech/20200916 Manage your Raspberry Pi fleet with Ansible.md b/sources/tech/20200916 Manage your Raspberry Pi fleet with Ansible.md new file mode 100644 index 0000000000..42d39c2843 --- /dev/null +++ b/sources/tech/20200916 Manage your Raspberry Pi fleet with Ansible.md @@ -0,0 +1,229 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Manage your Raspberry Pi fleet with Ansible) +[#]: via: (https://opensource.com/article/20/9/raspberry-pi-ansible) +[#]: author: (Ken Fallon https://opensource.com/users/kenfallon) + +Manage your Raspberry Pi fleet with Ansible +====== +A solution to the problem of updating difficult-to-reach Raspberry Pis +in the enterprise. +![Raspberries with pi symbol overlay][1] + +The Raspberry Pi is a small, versatile device that makes interfacing with the real world a breeze for mere mortals. The Raspberry Pi Foundation's idea was to sell the devices at such a low cost that breaking one would be sad—but not a disaster. This is one reason it has been a massive success as an [educational tool][2]. But their usefulness has not escaped the business world, where they are becoming a valuable tool for automating the physical world. + +Whether they are used for powering information displays, automating testing, controlling machinery, monitoring an environment, or doing other tasks, enterprises see Raspberry Pis as serious devices for doing serious tasks. Each model has a long product lifecycle—even the older models ([1B+][3], [2B][4], [3A+][5], [3B][6], and [3B+][7]) will remain in production until at least January 2026. There is little risk that they will go obsolete, so you can maintain a sufficiently large stock and treat them as modular components that you replace rather than fix. + +### Stable hardware vs. changing software + +While you can rely on the hardware to remain constant, the same is not true for the software. The Raspberry Pi's official supported operating system is [Raspberry Pi OS][8] (previously called Raspbian), and it should be updated regularly to get the latest [security and bug fixes][9]. + +This presents a problem. Because Raspberry Pis provide a bridge between the physical and virtual worlds, they are often installed in difficult-to-reach locations. They also tend to be installed by hardware folks, typically electricians for plants and assembly technicians for products. You do not want to waste their time by requiring them to connect a keyboard and monitor, log in [to run `raspi-config`][10], install software with `apt-get`, and then configure the software. + +Since Raspberry Pi OS boots off an SD card, one approach is to always maintain an up-to-date version of the software on the SD card that the installer can just plug (and hot glue) in. A good quality assurance (QA) department will keep the SD cards under version control, so you can be assured that all new installations are on the latest release. But this solution is costly to maintain since every software update requires preparing a new image and burning it to all the SD cards. It also doesn't address how to fix all your existing devices. In some cases, you may need to create custom images for specific Raspberry Pis doing specific jobs, and it may be unavoidable that you need an installer to connect a keyboard and monitor to configure something. + +A better approach is to use the same minimal base operating system install and then use [network boot][11] to maintain all the customizations and updates on the network. This requires maintaining just one base image, which is easier to manage, so it is a good approach if you have a reliable network infrastructure. Unfortunately, not all networks support this method; as the Raspberry Pi's network boot documentation says: "Due to the huge range of networking devices available, we can't guarantee that network booting will work with any device." Sadly, it is no longer an option on the [Raspberry Pi 4][12]. Furthermore, this is not an option when devices are disconnected from the network for a long period of time. + +The better goal, therefore, is to produce a common base Raspberry Pi OS image that doesn't change often but, once it's installed, can automatically be customized, maintained, and managed remotely. + +### Create the base image + +Your base image will almost certainly need small changes from the default Raspberry Pi OS image. Fortunately, you only need to recreate the base image if the Raspberry Pi OS image is updated or you need to change something in your configuration. The typical time between major versions of Raspberry Pi OS is about two years, which is a good target maintenance lifecycle. It gives you plenty of time to swap out older devices for new ones while keeping things manageable for the QA department to maintain releases. Older versions will still be supported for security and bug fixes for [some time][13] after that. + +On my Hacker Public Radio episode _[Safely enabling SSH in the default Raspbian image][14]_ in 2017, I walked through the steps to automate updating the base image. The script I created: + + * Downloads the latest image ZIP file + * Verifies it is valid + * Extracts the image itself + * Enables SSH for secure remote management + * Changes the default passwords for the root and Pi users + * Secures the SSH server on the Pi + + + +Since then, I have augmented the script to: + + * Enable connections to a WiFi network (`wpa_supplicant.conf`) + * Load its configuration from an INI file, keeping sensitive information separate from the main script. + * Use [`losetup` to simplify mounting][15] the image + * Create a [firstboot script][16] + + + +These changes ensure that the devices are locked down before deploying them. You can find an updated version of the [fix-ssh-on-pi script][17] on GitHub. + +Now is a good time to modify the script for your environment and especially to add any security keys or digital certificates necessary for authentication. However, it's best to hold off adding any custom applications or configurations at this point, as they can be added later. For the most part, the image will behave like a generic Raspberry Pi OS image, meaning it will boot and resize the SD card as usual and install the typical default software and firmware. + +The notable addition is support for a firstboot script. This is the glue that makes the Raspberry Pi run your custom configuration after the first time it configures itself. Again, I encourage you to modify the script for your environment. For example, you can have the device register itself, run through a system test and diagnostic procedures, pull down a client application, etc. + +If you don't want to customize it, it will do the bare minimum needed to get your Raspberry Pi on the network so that it can be uniquely identified by the network-management software. + +### Set up automatic management + +If you're managing servers in a [DevOps][18] environment, you won't blink an eye at the idea of using [configuration management software][19] to control your Raspberry Pi devices. If you use a tool that requires an agent, you can include the agent software as part of the base image. Given the resources on the Raspberry Pi, though, an agentless solution such as [Ansible][20] might be the best option. It just uses SSH and Python, doesn't require any additional software on the client, the control software is easy to install, and it is easy to use. + +All you need is the [Ansible software][21], a list of devices you want to manage saved in an [inventory file][22], and a [playbook][23], which is a set of instructions that you want carried out. For example, you can [update][9] the base Raspberry Pi OS image using the `apt update && apt full-upgrade` equivalent [apt module][24]. The playbook would be: + + +``` + - name: Run the equivalent of "apt-get update" as a separate step +    apt: +      update_cache: true +      cache_valid_time: 3600 +  - name: Update all packages to the latest version +    apt: +      upgrade: dist +``` + +You may think installing Ansible for Raspberry Pi is overkill, but I find it is worthwhile if you need to manage more than two or three computers. Using Ansible also gives you a more hygienic network—your inventory is audited and listed in its host file, software installations are documented through its playbooks, and data and configurations are kept away from their devices, so they are easier to back up regularly. + +According to [Wikipedia][25], Ansible's design goals include: + +> * **Minimal in nature**. Management systems should not impose additional dependencies on the environment. +> * **Consistent**. With Ansible, one should be able to create consistent environments. +> * **Secure**. Ansible does not deploy agents to nodes. Only OpenSSH and Python are required on the managed nodes. +> * **Highly reliable**. When carefully written, an Ansible playbook can be [idempotent][26] to prevent unexpected side effects on the managed systems. It is entirely possible to have a poorly written playbook that is not idempotent. +> * **Minimal learning required**. Playbooks use an easy and descriptive language based on YAML and Jinja templates. +> + + +Anyone with the correct authorization can configure a device, but you can limit authorization using standard Unix permissions. You can apply granular access to playbooks so that, for example, test operators can access just the test and diagnostic tools you install. + +### How it works + +Imagine you have a widget factory that includes a Raspberry Pi in its product. Your facilities team also uses them to monitor the environmental plant and security. Likewise, the engineering team uses the devices on the production lines within the manufacturing monitoring process. And the IT department uses them as disposable dumb terminals to access the head office enterprise resource planning ([ERP][27]) system. In all of these cases, downtime needs to be kept to a minimum. + +We aim to deliver the exact same device with the exact same image to each of the teams. + +#### Preparing the image + +Common to all stages is preparing the image itself. After cloning the [fix-ssh-on-pi.bash script from github][17], a one time action is needed to edit and rename the files `fix-ssh-on-pi.ini_example` to `fix-ssh-on-pi.ini`, and `wpa_supplicant.conf_example` to `wpa_supplicant.conf`. + +You only need to run the script any time that [Raspberry Pi OS][8](Raspbian) is updated, or when you changed your configuration files. I would recommend including this as part of your devops workflow. If you don’t have that in place yet then it can be automated using a simple cron job. + +I would recommend having a Raspberry Pi Station dedicated to burning the latest SDCards in the store room. This would automatically burn the latest image from the network once a new card is inserted into the [external SD Card Reader][28]. With some imagination and a 3D printer, a nice unit could be manufactured for giving feedback on progress. + +When a Raspberry Pi is requisitioned, the store keepers can then remove one of the finished SDCards and include it with the work order. + +#### Inventory/Hosts File + +In our fictitious example, the role of the device will be determined by the location of the network that it has connected to. Therefore we need to be able to identify Raspberry Pies once they come onto the network. How you approach this will entirely depend on how your network is configured, and what tools is available to you. I would advise listening to the episode by [operat0r][29] called [hpr3090 :: Locating Computers on a Enterprise Network][30] for some great tips on how to do this. + +Each department would have their own provisioning server running the Ansible Software, which of course could be another Raspberry Pi. It is the standard unix/ssh permissions that dictate who has access to what within your organization. In episode [hpr3080 :: Ansible ping][31] I walked through the absolute basics of installing and troubleshooting [Ansible][20]. Since then [klaatu][32] added [hpr3162 :: Introduction to Ansible][33] which is a great introduction to the topic in general. + +How the provisioning server becomes aware of the new devices can be active or passive. + +You could have the [First Boot script][16] actively calling a url to register itself. You would need to have a web application listening and using the received information to register the new host in the Ansible Inventory. + +This might be a good approach for departments where devices are replaced infrequently and you want them provisioned as soon as possible. As an example when a water quality monitoring station gets replaced, it would be a good idea to have it register. The Electrician could then select the exact Playbook to deploy to the device via a smart phone app. + +On the other hand a passive approach may be better if you are going to be installing devices constantly, like on a production line. In that case we can assume that any new devices found on the production line network will have our test and diagnostic software installed at the beginning of the line. This can also be removed automatically prior to shipping. + +One of the changes that `fix-ssh-on-pi.bash` does is that it renames the hostname of each Raspberry Pi to a version based on it’s [Ethernet MAC address][34]. As an example a [Ethernet MAC address][34] of `dc:a6:32:01:23:45` will result in a [hostname][35] of `dca632012345`. + +When the Raspberry Pi finishes it’s first time boot sequence, the 3rd automatic reboot will request a IP Address from your [DHCP][36] server, that hostname will (probably) become available in the office [DNS][37] network. + +At this point your Raspberry Pi is accessible using something like `ssh dca632012345`, `ssh dca632012345.local`, `ssh dca632012345.lan`, or in our example `ssh dca632012345.production.example.com`. + +I included a small script on [github][17] to locate Raspberry Pies based on [Ethernet MAC address][34]. I discussed this recently on my Hacker Public Radio episode _[Locating computers on a network][38]_: + + +``` +# ./put-pi-in-ansible-host.bash | tee all_pies.ini +[all_pies] +b827eb012345 ansible_host=192.168.1.123 +dca632012345 ansible_host=192.168.1.127 +b827eb897654 ansible_host=192.168.1.143 +dca632897654 ansible_host=192.168.1.223 +``` + +In my _[Ansible ping][31]_ episode on Hacker Public Radio, I used a YAML inventory file instead of the INI version above. + +#### Execute a playbook + +Regardless of how the provisioning server becomes aware of the devices, you now know they exist. In this example, you would deploy different playbooks based on the subnet the device is in. + +Perhaps the simplest playbook you can try is this one (from _Ansible ping_ and available on [GitHub][17]): + + +``` +\- name: Test Ping +  hosts: all +  tasks: +  - action: ping +``` + +You should now have everything you need to communicate with the new devices: + + +``` +`ansible-playbook --inventory-file all_pies.ini ping-example-playbook.yaml` +``` + +By modifying the playbook, you can update and configure your devices any way you like. I use this to create users, update the system to the latest version, add and remove software, and do other configurations. There are several good examples available about updating your systems, such as the [Ansible apt update all packages on Ubuntu / Debian Linux][39] tutorial. + +At this point, the devices cease to be generic. You will know the exact role each Raspberry Pi should have, and you can provision it as such. How custom it is will depend on the playbook, but I advise having a specific [Ansible role][40] for each task you need a Pi to do. For example, even if your widget factory has only one water-quality monitoring station, you should still define a role for it. Not only will this allow you to quickly deploy an identical replacement if necessary, but you are also documenting the process, which may be required for certifications such as [ISO 9000][41]. + +You now have the means to audit that updates to your network are in place and being done regularly. Hopefully, this will keep your devices secure for many years of service. This method also applies to products you ship, as they can be updated via hotspots operated by field service engineers. During regular system maintenance, the Raspberry Pi is automatically updated using credentials supplied in the `wpa_supplicant.conf` file. + +### Make management easier + +I hope this has opened your mind about how to tackle managing many devices more easily. All you need to get started is your PC or laptop and a Raspberry Pi. The principles of burning a generic image, creating a device inventory, and deploying a playbook are the same whether you're working on a small scale or scaling up to hundreds of devices. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/raspberry-pi-ansible + +作者:[Ken Fallon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/kenfallon +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life-raspberrypi_0.png?itok=Kczz87J2 (Raspberries with pi symbol overlay) +[2]: https://www.raspberrypi.org/education/ +[3]: https://www.raspberrypi.org/products/raspberry-pi-1-model-b-plus/ +[4]: https://www.raspberrypi.org/products/raspberry-pi-2-model-b/ +[5]: https://www.raspberrypi.org/products/raspberry-pi-3-model-a-plus/ +[6]: https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ +[7]: https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/ +[8]: https://www.raspbian.org/ +[9]: https://www.raspberrypi.org/documentation/raspbian/updating.md +[10]: https://www.raspberrypi.org/documentation/configuration/raspi-config.md +[11]: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/net_tutorial.md +[12]: https://www.raspberrypi.org/blog/raspberry-pi-4-on-sale-now-from-35/#comment-1510410 +[13]: https://wiki.debian.org/DebianReleases +[14]: http://hackerpublicradio.org/eps.php?id=2356 +[15]: http://man7.org/linux/man-pages/man8/losetup.8.html +[16]: https://github.com/nmcclain/raspberian-firstboot +[17]: https://github.com/kenfallon/fix-ssh-on-pi +[18]: https://en.wikipedia.org/wiki/DevOps +[19]: https://en.wikipedia.org/wiki/Comparison_of_open-source_configuration_management_software +[20]: https://www.ansible.com/ +[21]: https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html +[22]: https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html +[23]: https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html +[24]: https://docs.ansible.com/ansible/latest/modules/apt_module.html +[25]: https://en.wikipedia.org/wiki/Ansible_%28software%29%23Design_goals +[26]: https://en.wikipedia.org/wiki/Idempotent +[27]: https://en.wikipedia.org/wiki/Enterprise_resource_planning +[28]: https://www.amazon.com/StarTech-com-4-Slot-USB-C-Card-Reader/dp/B07HVPNQRQ/ +[29]: http://hackerpublicradio.org/correspondents.php?hostid=36 +[30]: http://hackerpublicradio.org/eps.php?id=3090 +[31]: http://hackerpublicradio.org/eps.php?id=3080 +[32]: http://hackerpublicradio.org/correspondents.php?hostid=78 +[33]: http://hackerpublicradio.org/eps.php?id=3162 +[34]: https://en.wikipedia.org/wiki/MAC_address +[35]: https://en.wikipedia.org/wiki/Hostname +[36]: https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol +[37]: https://en.wikipedia.org/wiki/Domain_Name_System +[38]: http://hackerpublicradio.org/eps.php?id=3052 +[39]: https://www.cyberciti.biz/faq/ansible-apt-update-all-packages-on-ubuntu-debian-linux/ +[40]: https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html +[41]: https://en.wikipedia.org/wiki/ISO_9000 diff --git a/sources/tech/20200917 Open Usage Commons- Google-s Initiative to Manage Trademark for Open Source Projects Runs into Controversy.md b/sources/tech/20200917 Open Usage Commons- Google-s Initiative to Manage Trademark for Open Source Projects Runs into Controversy.md new file mode 100644 index 0000000000..1ba65ad315 --- /dev/null +++ b/sources/tech/20200917 Open Usage Commons- Google-s Initiative to Manage Trademark for Open Source Projects Runs into Controversy.md @@ -0,0 +1,83 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Open Usage Commons: Google’s Initiative to Manage Trademark for Open Source Projects Runs into Controversy) +[#]: via: (https://itsfoss.com/open-usage-commons-controversy/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Open Usage Commons: Google’s Initiative to Manage Trademark for Open Source Projects Runs into Controversy +====== + +Back in July, Google [announced][1] a new organization named Open Usage Commons. The aim of the organization is to help “projects protect their project identity through programs such as trademark management and usage guidelines”. + +Google believes that “creating a neutral, independent ownership for these trademarks gives contributors and consumers peace of mind regarding their use of project names in a fair and transparent way”. + +### Open Usage Commons and the controversy with IBM + +![][2] + +Everything seems good in theory, right? But soon after the Google’s announcement of the Open Usage Commons, [IBM made an objection][3]. + +The problem is that Google included [Istio][4] project under [Open Usage Commons][5]. IBM is one of the founding members of the Istio project and it wants the project to be under open governance with [CNCF][6]. + +On behalf of It’s FOSS, I had a quick interaction with [Heikki Nousiainen][7], CTO at [Aiven][8] to clear some air on the entire Open Usage Commons episode. + +#### What is the Open Usage Commons trying to do? + +**Heikki Nousiainen**: The stated purpose of Google’s Open Usage Commons (OUC) is to provide a neutral and independent organization for open source projects to host and manage their trademarks. By applying open source software principles to trademarks, this will provide transparency and consistency. The idea is that this will lead to a more vibrant ecosystem for end users because vendors and developers can confidently build something that relies on projects’ brands.  + +Although other foundations, such as the Cloud Native Computing Foundation (CNCF) and [Apache Foundation][9], provide some direction on trademarks, OUC provides more precision and consistency in what constitutes fair use for vendors. This avoids what has generally been left to the individual projects to decide, which has resulted in a confusing patchwork of guidelines. + +Additionally, it is likely an attempt by Google to avoid situations similar to what [Amazon Web Services (AWS) has faced with Elasticsearch][10], e.g. where trademarks have appeared to be increasingly used to prevent exactly what Google is attempting to accomplish with this foundation, _**relatively open use of project brand identifiers by competing vendors**_. + +#### What are the problems surrounding the Commons? + +**Heikki Nousiainen**: The main controversy surrounds the question as to why [Istio][11] was not placed under CNCF governance as IBM was clearly expecting it to be placed under an [Open Governance model][12] once it matured. + +However, Open Usage Commons does not touch the governance model at all. Google, of course, has incentive to be able to trust they can utilize the recognized brands and trademarks to help customers recognize the services built on top of these familiar technologies. + +#### How will it impact the open source world, both positive and negative impacts? + +**Heikki Nousiainen**: It will remain to be seen what the long-term impact will be due to the fact that the only member projects are currently driven by Google. Although controversial, it doesn’t seem like the fears that Google would be able to enact effective control over member projects will materialize. + +A more telling question is, “Who will be likely to participate?” One thing is for sure, this will spark a long overdue discussion on how Open Source trademarks should be used when moving from software bundles to services offered in the cloud. + +#### Does it sound like some big players will have control over the definition of ‘open source trademarks’?  + +**Heikki Nousiainen**: Despite all the controversy over licensing, big players in this space have been and will remain key in securing the resources and support needed for the open source community to thrive. + +Although there is some self-interest here, the creation of vehicles such as this do not necessarily constitute an attempt at imposing unjustified control over projects. As a community-driven software, all must work alongside one another to achieve success. + +* * * + +Personally, I think Google’s long term game plan is to protect its Google Cloud Platform from possible lawsuits over the use of popular source projects’ trademarks and branding. + +What do you think of the entire Open Usage Commons episode? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/open-usage-commons-controversy/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://opensource.googleblog.com/2020/07/announcing-new-kind-of-open-source.html +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/google-open-usage-commons.png?resize=800%2C450&ssl=1 +[3]: https://developer.ibm.com/components/istio/blogs/istio-google-open-usage-commons/ +[4]: https://istio.io +[5]: https://openusage.org +[6]: https://www.cncf.io/ +[7]: https://www.linkedin.com/in/heikki-nousiainen/ +[8]: https://aiven.io +[9]: http://apache.org +[10]: https://news.bloomberglaw.com/ip-law/amazon-sued-for-allegedly-infringing-elasticsearch-trademarks +[11]: https://istio.io/ +[12]: https://developer.ibm.com/articles/open-governance-community/ diff --git a/sources/tech/20200917 Update devices remotely with this open source tool.md b/sources/tech/20200917 Update devices remotely with this open source tool.md new file mode 100644 index 0000000000..5b4ee15fb4 --- /dev/null +++ b/sources/tech/20200917 Update devices remotely with this open source tool.md @@ -0,0 +1,277 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Update devices remotely with this open source tool) +[#]: via: (https://opensource.com/article/20/9/update-remote-devices-updatehub) +[#]: author: (Domarys https://opensource.com/users/domarys) + +Update devices remotely with this open source tool +====== +Handle all your complete device updates, including firmware and +bootloaders, over the air with UpdateHub Community Edition. +![Working from home at a laptop][1] + +The ability to access, connect, and [manage multiple devices remotely][2] through a single account is important. Going a step further, being able to completely update devices remotely is another way for sysadmins to reduce effort and minimize headaches. + +[UpdateHub][3] is an open source solution that allows you to do complete device updates, including firmware and bootloaders, remotely. Its goal is to make it easier to do device updates and reduce rework and risk, whether you're updating thousands of devices or managing small deployments. UpdateHub handles all aspects of over-the-air (OTA) updates, including package integrity and authenticity, while you take care of your other work. + +This step-by-step guide to UpdateHub aims to help you get started with this professional tool. There are two UpdateHub server options: [UpdateHub Cloud][4] and [UpdateHub Community Edition][3] (UpdateHub CE), a fully open source server (distributed under the MIT License), which is what this tutorial uses. + +### Check the requirements + +First, make sure your Linux distribution has installed all [the required packages][5] to build an image using the Yocto Project. + +You also need the following hardware: + + * **Target** is the development device. This tutorial uses a [Raspberry Pi 3 Model B+][6], but you could also use a Raspberry Pi 3, Model B, or Model B+. + * **Host** is the computer where you will build the image using the Yocto Project. This tutorial uses [Yocto 3.1 Dunfell][7]. + + + +To start UpdateHub CE, you must have [Docker][8] installed on the host. If you don't have it, see Docker's [orientation and setup][9] instructions. + +This tutorial uses Google's [repo tool][10] to facilitate the process, as it requires multiple repositories. You can learn more about repo in the [Android development setup guide][11]. + +On Debian and Ubuntu distros, install repo with: + + +``` +`sudo apt install repo` +``` + +If you're using another Linux distribution, download repo directly and set your distro with: + + +``` +mkdir ~/bin +curl > ~/bin/repo +chmod a+x ~/bin/repo +PATH=${PATH}:~/bin +``` + +Finally, you need network connectivity via [DHCP][12], or you must know how to change the internet protocol (IP) address or to create a Yocto Project layer that handles this configuration. + +### Prepare your environment for the build + +UpdateHub provides a repository with a manifest file used by the repo tool, which makes it easier to manage multiple layers. + +Download the source code by creating a directory and fetching the necessary Yocto Project layers: + + +``` +mkdir updatehub-platform +cd updatehub-platform +repo init -u -b dunfell +repo sync +``` + +After the `repo sync` command completes, you will see all the layers you need in the `sources` directory. + +The UpdateHub platform provides support for multiple [supported devices][13]. During the Yocto Project environment setup, it will ask if you want to accept the end-user license agreement (EULA) of the `meta-freescale` layer; this is not necessary for this project. + +Load the Yocto Project environment: + + +``` +`MACHINE="raspberrypi3" source ./setup-environment build` +``` + +Note that this command is valid only for the terminal session where you loaded the environment. If you use a new terminal, you will need to load the environment again. However, you won't need to configure the machine again because the configuration content is stored in the `conf/local.conf` file. + +### Start UpdateHub CE + +With Docker installed, download the Docker image and start the server on port 8080: + + +``` +`docker run -d -p 8080:8080 updatehub/updatehub-ce:latest` +``` + +![Installing and running the server with Docker image][14] + +(Domarys Correa, [CC BY-SA 4.0][15]) + +Access the UpdateHub CE dashboard through the host IP address and port 8080 (`http://IP_ADDRESS:8080`). The host IP in the example is 192.168.15.50, so that would be `http://192.168.15.50:8080`. + +Use the default of `admin` for the login and password, and click **Login**. + +You need to configure the `UPDATEHUB_SERVER_URL` to use the UpdateHub CE address because the device needs to know the server's IP address. By default, the `meta-updatehub` layer uses the UpdateHub Cloud address in the server URL variable. + +You should see UpdateHub CE's main interface: + +![Accessing the UpdateHub CE dashboard][16] + +(Domarys Correa, [CC BY-SA 4.0][15]) + +### Configure the environment to generate the image + +The next step is to generate the Linux image that will be used by the device. But first, you need to set up some variables in the `conf/local.conf` file: + + +``` +UPDATEHUB_SERVER_URL = "" +UPDATEHUB_PACKAGE_VERSION_SUFFIX = "-test-image-1" +ENABLE_UART = "1" +UPDATEHUB_POLLING_INTERVAL = "1m" +``` + +Going line by line in the above code: + + * `UPDATEHUB_SERVER_URL` contains the IP address where UpdateHub CE is running. + * `UPDATEHUB_PACKAGE_VERSION_SUFFIX` adds a suffix in the image version. This is useful for placing a version number and incrementing it for each new image. This variable will be the `VERSION_ID`, which is composed of the `DISTRO_VERSION` (described in the [docs][17]) plus the `UPDATEHUB_PACKAGE_VERSION_SUFFIX`. You can verify this in the `/etc/os-release` file in the target. + * `ENABLE_UART`: There are several ways to access the target device, such as using the serial console or connecting a keyboard and a monitor. This variable allows access to a serial console on a Raspberry Pi by using the serial ports available on the GPIO header. + * `UPDATEHUB_POLLING_INTERVAL`: By default, communication between UpdateHub's agent and server happens every 24 hours. Use this variable to set up a new consultation time of 1 minute. + + + +This tutorial uses [Minicom][18] to connect with the target; if you want, you can learn more about [using the serial connection in Raspberry Pi][19]. + +### Generate the image + +Now that the Yocto Project environment is ready, compile the image using the [BitBake][20] task-execution engine by running: + + +``` +`bitbake updatehub-image-base` +``` + +Image generation can take a while, depending on the host machine. If this is the first time you are building an image for `raspberrypi3` in Yocto's Dunfell branch, BitBake will download the entire source code, so your download speed will influence the time it takes to generate the image. + +Once the image is compiled, navigate to the `build/tmp/deploy/images/raspberrypi3/` host directory and verify the image file, `updatehub-image-minimal-raspberrypi3.wic.gz`, is there. + +Insert an SD card into your Raspberry Pi and check its name by running `dmesg`. Then flash the image to your SD card with the following command, but make sure to change `/dev/sdX` to your SD card name: + + +``` +`zcat updatehub-image-base-raspberrypi3.wic.gz | sudo dd of=/dev/sdX` +``` + +Insert the imaged SD card into the target device to connect to Raspberry Pi. The image has a network configured to obtain an IP address using DHCP. Access the console with user `root` and leave the password empty. + +Confirm the version of the image running on the target using `cat /etc/os-release`. + +![Viewing a version of the image with Minicom][21] + +(Domarys Correa, [CC BY-SA 4.0][15]) + +### Generate the update package + +Your device should be running and working correctly, but you need to add the feature to create an update package. This creates an image to update your target. The following example adds support for an SSH server on the target and creates an update package to install this functionality. + +Add support for the OpenSSH server by adding the following line to the `build/conf/local.conf` file: + + +``` +`IMAGE_FEATURES += "ssh-server-openssh"` +``` + +To make it clear that the updated image will have another version, put the suffix `-test-image-2` in the `UPDATEHUB_PACKAGE_VERSION_SUFFIX` variable: + + +``` +`UPDATEHUB_PACKAGE_VERSION_SUFFIX = "-test-image-2"` +``` + +Save the file and run: + + +``` +`bitbake updatehub-image-base -c uhuarchive` +``` + +This command generates a file with a `.uhupkg` extension, a format used by UpdateHub to update the system. The generated file will be in the same directory as the images are, `tmp/deploy/images/raspberrypi3`; in this example, that's `updatehub-image-base-raspberrypi3.uhupkg`. + +### Check your device + +To access the UpdateHub CE dashboard, click the **Devices** tab to see if your device is listed: + +![Device section on the UpdateHub CE][22] + +(Domarys Correa, [CC BY-SA 4.0][15]) + +### Send an update package + +UpdateHub CE dashboard's **Packages** tab shows a list of available packages, but you do not have any yet. To add a package, click the **Upload Package** button, and select the `updatehub-image-minimal-raspberrypi3.uhupkg` file. In this example, it is in `tmp/deploy/images/raspberrypi3/directory`. A screen showing the package details will appear. This shows the process of adding an update package to the dashboard: + +![Add an update package][23] + +(Domarys Correa, [CC BY-SA 4.0][15]) + +### Create a rollout + +With the device recognized and the packet sent to the server, you can create a rollout, which is essentially a deployment plan. Navigate to the **Rollouts** tab and click **Create Rollout**. Choose which package version you want to use in the upgrade. This example only has the package from the previous step, with version `20.04-test-image-2`. Choose this version, and make sure it includes the list of devices that will be updated. + +![Creating a rollout and checking the device update][24] + +(Domarys Correa, [CC BY-SA 4.0][15]) + +Previously, you configured the image running on the target to perform an update query on the UpdateHub server every minute, so within one minute of creating the rollout, the update process will start. To track the update status, check the **Rollouts** tab. + +![The update process][25] + +(Domarys Correa, [CC BY-SA 4.0][15]) + +After finishing an upgrade process, the target reboots automatically. The new image boots up and automatically queries the server for updates. The server responds that it does not have any updates and ends the update cycle. + +When the status shows `updated`, run the command below on the host to access the target over SSH: + + +``` +`ssh root@IP_DO_TARGET` +``` + +No password is required; just press **Enter**, and you will be in the target console. You can check the version in the `/etc/os-release` file to confirm. + +### Congratulations! You're done! + +Now you have access to a professional tool to update your devices remotely. This tutorial used a Raspberry Pi 3 with the Yocto Project version Dunfell 3.1.2, but [other devices and versions][13] are supported. + +If you have any questions about integrating your device, access the developers' team through [Gitter][26] or by emailing [contact@updatehub.io][27]. + +* * * + +_This article is based on [UpdateHub: Sending OTA Updates using the Yocto Project][28] on UpdateHub's blog._ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/update-remote-devices-updatehub + +作者:[Domarys][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/domarys +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://opensource.com/article/20/7/linux-shellhub +[3]: https://github.com/UpdateHub/updatehub-ce +[4]: https://updatehub.io/ +[5]: https://www.yoctoproject.org/docs/2.6.1/mega-manual/mega-manual.html#required-packages-for-the-build-host +[6]: https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/ +[7]: https://old.yoctoproject.org/yoctoproject/dunfell +[8]: https://www.docker.com/ +[9]: https://docs.docker.com/get-started/ +[10]: https://gerrit.googlesource.com/git-repo/+/refs/heads/master/README.md +[11]: https://source.android.com/setup/develop +[12]: https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol +[13]: https://docs.updatehub.io/yocto-project/supported-machines/ +[14]: https://opensource.com/sites/default/files/uploads/yocto1_installserver.gif (Installing and running the server with Docker image) +[15]: https://creativecommons.org/licenses/by-sa/4.0/ +[16]: https://opensource.com/sites/default/files/uploads/yocto2_updatehubce-dashboard.gif (Accessing the UpdateHub CE dashboard) +[17]: https://www.yoctoproject.org/docs/2.6.1/ref-manual/ref-manual.html#var-DISTRO_VERSION +[18]: https://wiki.emacinc.com/wiki/Getting_Started_With_Minicom +[19]: https://elinux.org/RPi_Serial_Connection +[20]: https://github.com/openembedded/bitbake +[21]: https://opensource.com/sites/default/files/uploads/yocto_confirm.gif (Viewing a version of the image with Minicom) +[22]: https://opensource.com/sites/default/files/uploads/yocto_device-dashboard.gif (Device section on the UpdateHub CE) +[23]: https://opensource.com/sites/default/files/uploads/yocto_addupdate.gif (Add an update package) +[24]: https://opensource.com/sites/default/files/uploads/yocto6_createrollout.gif (Creating a rollout and checking the device update) +[25]: https://opensource.com/sites/default/files/uploads/yocto7.gif (The update process) +[26]: https://gitter.im/UpdateHub +[27]: mailto:contact@updatehub.io +[28]: https://blog.updatehub.io/updatehub-sending-ota-updates-using-the-yocto-project/ diff --git a/sources/tech/20200919 3 ways to protect yourself from imposter syndrome.md b/sources/tech/20200919 3 ways to protect yourself from imposter syndrome.md new file mode 100644 index 0000000000..63d511c530 --- /dev/null +++ b/sources/tech/20200919 3 ways to protect yourself from imposter syndrome.md @@ -0,0 +1,59 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (3 ways to protect yourself from imposter syndrome) +[#]: via: (https://opensource.com/article/20/9/imposter-syndrome) +[#]: author: (Josh Atwell https://opensource.com/users/joshatwell) + +3 ways to protect yourself from imposter syndrome +====== +It can be hard to believe you deserve success, sometimes, but these tips +can help you combat impostor syndrome and accept the accolades you've +earned. +![Brain on a computer screen][1] + +Poet and activist Maya Angelou published many books throughout her storied career, but each time, she feared people would figure out that she'd "run a game on everybody, and they're going to find me out." This seems an odd response from a well-honored writer. What she is describing is her own challenge with imposter syndrome. + +Think for a moment about your own accomplishments. Being hired into a new role. Having your first [open source contribution][2] merged into the project. Receiving an award or recognition. Being invited to participate in a project or event with people you respect and look up to. Did you question whether you belonged there? Did you fear people would "know that you didn't belong?" There is an extremely high likelihood that you have also experienced imposter syndrome. Please check the survey at the end of this article to see that you're not alone. + +Imposter syndrome is a "[psychological term][3] referring to a pattern of behavior where people doubt their accomplishments and have a persistent, often internalized fear of being exposed as a fraud." It's not considered a disorder, but it's persistent and can keep you from trying new things, accepting praise, or enjoying success. It's also important to understand that imposter syndrome is indiscriminate to gender, race, or nationality. Anyone can be impacted. Fortunately, you can be prepared for when imposter syndrome rears its ugly head. + +How do you protect yourself from letting imposter syndrome limit you? Here are three techniques that you can start using right away: + +**1\. Feelings vs. facts**—It's important to understand that imposter syndrome is a feeling and doesn't represent a factual assessment of your value or acceptance. Instead of thinking, "I don't deserve to be here," say to yourself, "I'm here because I earned it," or "I trust the judgment of those who invited me here that I truly deserve to be here." Ask yourself if the negative thoughts are from facts or a story you are telling yourself. This simple shift in focus from feelings to facts can set you back on the right course. + +![3 panels, woman says "I don't deserve to be here." with red X on top, woman says "I should trust the judgment of people who invited me." with green check, woman says "I deserve to be here." with green check][4] + +**2\. "Outsider" does not equal "fraud"**—Simply because your peer group has changed does not mean that you do not belong. Inclusion in higher levels of an organization, accomplished industry peers, or a group of award recipients is almost always a result of meaningful contributions. That first day of school feeling never goes away, even if it's remote school. So, unless you are legitimately a party crasher, keep in mind that you have value to add to the group and share it, even if you are nervous at first. + +**3\. Faking it**—Unfortunately, it's not universally understood that people learn how to do the job AFTER they get the job. There are few better ways to set yourself up for continued success than first believing that additional success is possible. Just be mindful not to fall into the trap of the cognitive bias known as the Dunning-Kruger effect, which leads people to vastly overestimate their capabilities. "Fake it until you make it," but commit to continued learning. + +There are so many ways imposter syndrome can disrupt both our professional and personal lives, but with some awareness and preparation, you can avoid letting it limit your growth and success. These are just a few ways to address imposter syndrome. For more information, you can also visit . + +[In this survey][5], we'd like to ask you to provide some information based on your experiences, which we'll use to help further inform the community about imposter syndrome and how prevalent it is in our industry. + +![Green chalkboard image reading "Take the Survey!"][6] + +This post includes excerpted content from an upcoming community presentation titled "Imposter Syndrome First Aid Kit" by Josh Atwell and Amy Lewis. If you're interested in hearing the full presentation, you can check it out at Splunk .conf20 on October 20-21. Registration is available at . + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/imposter-syndrome + +作者:[Josh Atwell][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/joshatwell +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_computer_solve_fix_tool.png?itok=okq8joti (Brain on a computer screen) +[2]: https://opensource.com/article/19/11/my-first-open-source-contribution-impostor-syndrome +[3]: https://www.psychologytoday.com/us/blog/real-women/201809/the-reality-imposter-syndrome +[4]: https://opensource.com/sites/default/files/uploads/impostor_syndrome_1.png (Person progresses through stages of impostor syndrome) +[5]: https://pollev.com/amylewis963?_ga=2.60457517.1623261502.1598557790-809388036.1598557790 +[6]: https://opensource.com/sites/default/files/uploads/impostor_syndrome_survey.png (Green chalkboard image reading "Take the Survey!") diff --git a/sources/tech/20200921 Solve a real-world problem using Java.md b/sources/tech/20200921 Solve a real-world problem using Java.md new file mode 100644 index 0000000000..9ee7423818 --- /dev/null +++ b/sources/tech/20200921 Solve a real-world problem using Java.md @@ -0,0 +1,328 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Solve a real-world problem using Java) +[#]: via: (https://opensource.com/article/20/9/problem-solving-java) +[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen) + +Solve a real-world problem using Java +====== +See how Java differs from Python and Groovy as it's used to solve a +charity's real-world problem. +![Coffee beans and a cup of coffee][1] + +As I wrote in the first two articles in this series, I enjoy solving small problems by writing small programs in different languages, so I can compare the different ways they approach the solution. The example I'm using in this series is dividing bulk supplies into hampers of similar value to distribute to struggling neighbors in your community, which you can [read about][2] in the first article in this series. + +In the first article, I solved this problem [using the Groovy programming language][2], which is like Python in many ways, but syntactically it's more like C and Java. In the second article, I [solved it in Python][3] with a very similar design and effort, which demonstrates the resemblance between the languages. + +Now I'll try it in [Java][4]. + +### The Java solution + +When working in Java, I find myself declaring utility classes to hold tuples of data (the new record feature is going to be great for that), rather than using the language support for maps offered in Groovy and Python. This is because Java encourages creating maps that map one specific type to another specific type, but in Groovy or Python, it's cool to have a map with mixed-type keys and mixed-type values. + +The first task is to define these utility classes, and the first is the `Unit` class: + + +``` +class Unit { +    private [String][5] item, brand; +    private int price; + +    public Unit([String][5] item, [String][5] brand, int price) { +        this.item = item; +        this.brand = brand; +        this.price = price; +    } +    public [String][5] getItem() { return this.item; } +    public [String][5] getBrand() { return this.brand; } +    public int getPrice() { return this.price; } + +    @Override +    public [String][5] toString() { return [String][5].format("item: %s brand: %s price: %d",item,brand,price); } +} +``` + +There's nothing too startling here. I effectively created a class whose instances are immutable since there are no setters for fields `item`, `brand`, or `price` and they are declared `private`. As a general rule, I don't see value in creating a mutable data structure unless I'm going to mutate it; and in this application, I don't see any value in mutating the `Unit` class. + +While more effort is required to create these utility classes, creating them encourages a bit more design effort than just using a map, which can be a good thing. In this case, I realized that a bulk package is composed of a number of individual units, so I created the `Pack` class: + + +``` +class Pack { +    private Unit unit; +    private int count; + +    public Pack([String][5] item, [String][5] brand, int unitCount, int packPrice) { +        this.unit = new Unit(item, brand, unitCount > 0 ? packPrice / unitCount : 0); +        this.count = unitCount; +    } + +    public [String][5] getItem() { return unit.getItem(); } +    public [String][5] getBrand() { return unit.getBrand(); } +    public int getUnitPrice() { return unit.getPrice(); } +    public int getUnitCount() { return count; } +    public List<Unit> unpack() { return [Collections][6].nCopies(count, unit); } + +    @Override +    public [String][5] toString() { return [String][5].format("item: %s brand: %s unitCount: %d unitPrice: %d",unit.getItem(),unit.getBrand(),count,unit.getPrice()); } +} +``` + +Similar to the `Unit` class, the `Pack` class is immutable. A couple of things worth mentioning here: + + 1. I could have passed a `Unit` instance into the `Pack` constructor. I chose not to because the bundled, physical nature of a bulk package encouraged me to think of the "unit-ness" as an internal thing not visible from the outside but that requires unpacking to expose the units. Is this an important decision in this case? Probably not, but to me, at least, it's always good to think through this kind of consideration. + 2. Which leads to the `unpack()` method. The `Pack` class creates the list of `Unit` instances only when you call this method—that is, the class is _lazy_. As a general design principle, I've found it's worthwhile to decide whether a class' behavior should be eager or lazy, and when it doesn't seem to matter, I go with lazy. Is this an important decision in this case? Maybe—this lazy design enables a new list of `Unit` instances to be generated on every call of `unpack()`, which could prove to be a good thing down the road. In any case, getting in the habit of always thinking about eager vs. lazy behavior is a good habit. + + + +The sharp-eyed reader will note that, unlike in the Groovy and Python examples where I was mostly focused on compact code and spent way less time thinking about design decisions, here, I separated the definition of a `Pack` from the number of `Pack` instances purchased. Again, from a design perspective, this seemed like a good idea as the `Pack` is conceptually quite independent of the number of `Pack` instances acquired. + +Given this, I need one more utility class: the `Bought` class: + + +``` +class Bought { +    private Pack pack; +    private int count; + +    public Bought(Pack pack, int packCount) { +        this.pack = pack; +        this.count = packCount; +    } + +    public [String][5] getItem() { return pack.getItem(); } +    public [String][5] getBrand() { return pack.getBrand(); } +    public int getUnitPrice() { return pack.getUnitPrice(); } +    public int getUnitCount() { return pack.getUnitCount() * count; } +    public List<Unit> unpack() { return [Collections][6].nCopies(count, pack.unpack()).stream().flatMap([List][7]::stream).collect(Collectors.toList()); } + +    @Override +    public [String][5] toString() { return [String][5].format("item: %s brand: %s bought: %d pack(s) totalUnitCount: %d unitPrice: %d",pack.getItem(),pack.getBrand(),count,pack.getUnitCount() * count,pack.getUnitPrice()); } +} +``` + +Notably: + + 1. I decided to pass a `Pack` into the constructor. Why? Because to my way of thinking, the physical structure of the purchased bulk packages is external, not internal, as in the case of the individual bulk packages. Once again, it may not be important in this application, but I believe it's always good to think about these things. If nothing else, note that I am not married to symmetry! + 2. Once again the `unpack()` method demonstrates the lazy design principle. This goes to more effort to generate a list of `Unit` instances (rather than a _list of lists_ of `Unit` instances, which would be easier but require flattening further out in the code). + + + +OK! Time to move on and solve the problem. First, declare the purchased packs: + + +``` +        var packs = new Bought[] { +            new Bought(new Pack("Rice","Best Family",10,5650),1), +            new Bought(new Pack("Spaghetti","Best Family",1,327),10), +            new Bought(new Pack("Sardines","Fresh Caught",3,2727),3), +            new Bought(new Pack("Chickpeas","Southern Style",2,2600),5), +            new Bought(new Pack("Lentils","Southern Style",2,2378),5), +            new Bought(new Pack("Vegetable oil","Crafco",12,10020),1), +            new Bought(new Pack("UHT milk","Atlantic",6,4560),2), +            new Bought(new Pack("Flour","Neighbor Mills",10,5200),1), +            new Bought(new Pack("Tomato sauce","Best Family",1,190),10), +            new Bought(new Pack("Sugar","Good Price",1,565),10), +            new Bought(new Pack("Tea","Superior",5,2720),2), +            new Bought(new Pack("Coffee","Colombia Select",2,4180),5), +            new Bought(new Pack("Tofu","Gourmet Choice",1,1580),10), +            new Bought(new Pack("Bleach","Blanchite",5,3550),2), +            new Bought(new Pack("Soap","Sunny Day",6,1794),2) +        }; +``` + +This is pretty nice from a readability perspective: there is one pack of Best Family Rice containing 10 units that cost 5,650 (using those crazy monetary units, like in the other examples). It's straightforward to see that in addition to the one bulk pack of 10 bags of rice, the organization acquired 10 bulk packs of one bag each of spaghetti. The utility classes are doing some work under the covers, but that's not important at this point because of the great design job! + +Note the `var` keyword is used here; it's one of the nice features in recent versions of Java that help make the language a bit less verbose (the principle is called _DRY_—don't repeat yourself) by letting the compiler infer the variable's data type from the right-side expression's type. This looks kind of similar to the Groovy `def` keyword, but since Groovy by default is dynamically typed and Java is statically typed, the typing information inferred in Java by `var` persists throughout the lifetime of that variable. + +Finally, it's worth mentioning that `packs` here is an array and not a `List` instance. If you were reading this data from a separate file, you would probably prefer to create it as a list. + +Next, unpack the bulk packages. Because the unpacking of `Pack` instances is delegated into lists of `Unit` instances, you can use that like this: + + +``` +        var units = Stream.of(packs) +            .flatMap(bought -> { +                return bought.unpack().stream(); }) +            .collect(Collectors.toList()); +``` + +This uses some of the nice functional programming features introduced in later Java versions. Convert the array `packs` declared previously to a Java stream, use `flatmap()` with a lambda to flatten the sublists of units generated by the `unpack()` method of the `Bought` class, and collect the resulting stream elements back into a list. + +As in the Groovy and Java solutions, the final step is repacking the units into the hampers for distribution. Here's the code—it's not much wordier than the Groovy version (tiresome semicolons aside) nor really all that different: + + +``` +        var valueIdeal = 5000; +        var valueMax = [Math][8].round(valueIdeal * 1.1); +        var rnd = new [Random][9](); +        var hamperNumber = 0;                         // [1] + +        while (units.size() > 0) {                    // [2] +            hamperNumber++; +            var hamper = new ArrayList<Unit>(); +            var value = 0;                            // [2.1] +            for (boolean canAdd = true; canAdd; ) {   // [2.2] +                var u = rnd.nextInt(units.size());            // [2.2.1] +                canAdd = false;                               // [2.2.2] +                for (int o = 0; o < units.size(); o++) {      // [2.2.3] +                    var uo = (u + o) % units.size(); +                    var unit = units.get(uo);                      // [2.2.3.1] +                    if (units.size() < 3 || +                            !hamper.contains(unit) && +                            (value + unit.getPrice()) < valueMax) { // [2.2.3.2] +                        hamper.add(unit); +                        value += unit.getPrice(); +                        units.remove(uo);                           // [2.2.3.3] +                        canAdd = units.size() > 0; +                        break;                                      // [2.2.3.4] +                    } +                } +            }                                                // [2.2.4] +            [System][10].out.println(); +            [System][10].out.printf("Hamper %d value %d:\n",hamperNumber,value); +            hamper.forEach(unit -> { +                [System][10].out.printf("%-25s%-25s%7d\n", unit.getItem(), unit.getBrand(), +                       unit.getPrice()); +            });                                                      // [2.3] +            [System][10].out.printf("Remaining units %d\n",units.size());  // [2.4] +``` + +Some clarification, with numbers in brackets in the comments above (e.g., _[1]_) corresponding to the clarifications below: + + * 1\. Set up the ideal and maximum values to be loaded into any given hamper, initialize Java's random number generator and the hamper number. + * 2\. This `while {}` loop will redistribute units into hampers as long as there are more available: + * 2.1 Increment the hamper number, get a new empty hamper (a list of `Unit` instances), and set its value to 0. + * 2.2 This `for {}` loop will add as many units to the hamper as possible: + * 2.2.1 Get a random number between zero and the number of remaining units minus 1. + * 2.2.2 Assume you can't find more units to add. + * 2.2.3 This `for {}` loop, starting at the randomly chosen index, will try to find a unit that can be added to the hamper. + * 2.2.3.1 Figure out which unit to look at. + * 2.2.3.2 Add this unit to the hamper if there are only a few left or if the value of the hamper isn't too high once the unit is added _and_ that unit isn't already in the hamper. + * 2.2.3.3 Add the unit to the hamper, increment the hamper value by the unit price, and remove the unit from the available units list. + * 2.2.3.4 As long as there are units left, you can add more, so break out of this loop to keep looking. + * 2.2.4 On exit from this `for {}` loop, if you inspected every remaining unit and could not find one to add to the hamper, the hamper is complete; otherwise, you found one and can continue looking for more. + * 2.3 Print out the contents of the hamper. + * 2.4 Print out the remaining units info. + + + +When you run this code, the output looks quite similar to the output from the Groovy and Python programs: + + +``` +Hamper 1 value 5465: +Tofu                     Gourmet Choice              1580 +Bleach                   Blanchite                    710 +Coffee                   Colombia Select             2090 +Flour                    Neighbor Mills               520 +Sugar                    Good Price                   565 +Remaining units 150 + +Hamper 2 value 5482: +Sardines                 Fresh Caught                 909 +Tomato sauce             Best Family                  190 +Vegetable oil            Crafco                       835 +UHT milk                 Atlantic                     760 +Chickpeas                Southern Style              1300 +Lentils                  Southern Style              1189 +Soap                     Sunny Day                    299 +Remaining units 143 + +Hamper 3 value 5353: +Soap                     Sunny Day                    299 +Rice                     Best Family                  565 +UHT milk                 Atlantic                     760 +Flour                    Neighbor Mills               520 +Vegetable oil            Crafco                       835 +Bleach                   Blanchite                    710 +Tomato sauce             Best Family                  190 +Sardines                 Fresh Caught                 909 +Sugar                    Good Price                   565 +Remaining units 134 + +… + +Hamper 23 value 5125: +Sardines                 Fresh Caught                 909 +Rice                     Best Family                  565 +Spaghetti                Best Family                  327 +Lentils                  Southern Style              1189 +Chickpeas                Southern Style              1300 +Vegetable oil            Crafco                       835 +Remaining units 4 + +Hamper 24 value 2466: +UHT milk                 Atlantic                     760 +Spaghetti                Best Family                  327 +Vegetable oil            Crafco                       835 +Tea                      Superior                     544 +Remaining units 0 +``` + +The last hamper is abbreviated in contents and value. + +### Closing thoughts + +The similarities in the "working code" with the Groovy original are obvious—the close relationship between Groovy and Java is evident. Groovy and Java diverged in a few ways in things that were added to Java after Groovy was released, such as the `var` vs. `def` keywords and the superficial similarities and differences between Groovy closures and Java lambdas. Moreover, the whole Java streams framework adds a great deal of power and expressiveness to the Java platform (full disclosure, in case it's not obvious—I am but a babe in the Java streams woods). + +Java's intent to use maps for mapping instances of a single type to instances of another single type pushes you to use utility classes, or tuples, instead of the more inherently flexible intents in Groovy maps (which are basically just `Map` plus a lot of syntactic sugar to vanish the kinds of casting and `instanceof` hassles that you would create in Java) or in Python. The bonus from this is the opportunity to apply some real design effort to these utility classes, which pays off at least insofar as it instills good habits in the programmer. + +Aside from the utility classes, there isn't a lot of additional ceremony nor boilerplate in the Java code compared to the Groovy code. Well, except that you need to add a bunch of imports and wrap the "working code" in a class definition, which might look like this: + + +``` +import java.lang.*; +import java.util.*; +import java.util.Collections.*; +import java.util.stream.*; +import java.util.stream.Collectors.*; +import java.util.Random.*; + +public class Distribute { + +    static public void main([String][5][] args) { +        // the working code shown above +    } +} +class Unit { … } +class Pack { … } +class Bought { … } +``` + +The same fiddly bits are necessary in Java as they are in Groovy and Python when it comes to grabbing stuff out of the list of `Unit` instances for the hampers, involving random numbers, loops through remaining units, etc. + +Another issue worth mentioning—this isn't a particularly efficient approach. Removing elements from `ArrayLists`, being careless about repeated expressions, and a few other things make this less suitable for a huge redistribution problem. I've been a bit more careful here to stick with integer data. But at least it's quite quick to execute. + +Yes, I'm still using the dreaded `while { … }` and `for { … }`. I still haven't thought of a way to use map and reduce style stream processing in conjunction with a random selection of units for repackaging. Can you? + +Stay tuned for the next articles in this series, with versions in [Julia][11] and [Go][12]. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/problem-solving-java + +作者:[Chris Hermansen][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/clhermansen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/java-coffee-mug.jpg?itok=Bj6rQo8r (Coffee beans and a cup of coffee) +[2]: https://opensource.com/article/20/8/solving-problem-groovy +[3]: https://opensource.com/article/20/8/solving-problem-python +[4]: https://www.java.com/en/ +[5]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string +[6]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+collections +[7]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+list +[8]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+math +[9]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+random +[10]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system +[11]: https://julialang.org/ +[12]: https://golang.org/ diff --git a/sources/tech/20200921 Use this Python script to simulate Babbage-s Difference Engine.md b/sources/tech/20200921 Use this Python script to simulate Babbage-s Difference Engine.md new file mode 100644 index 0000000000..e6550c3b7d --- /dev/null +++ b/sources/tech/20200921 Use this Python script to simulate Babbage-s Difference Engine.md @@ -0,0 +1,91 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Use this Python script to simulate Babbage's Difference Engine) +[#]: via: (https://opensource.com/article/20/9/babbages-python) +[#]: author: (Greg Pittman https://opensource.com/users/greg-p) + +Use this Python script to simulate Babbage's Difference Engine +====== +Nineteenth-century mathematician Charles Babbage's serial calculation +machine meets its match with Python code. +![old school calculator][1] + +[Charles Babbage][2] (1791–1871) was an avid mathematician with very wide interests. He is well-known for envisioning the idea of computers and single-handedly developed what he called a [Difference Engine][3] to make serial calculations. It was a mechanical machine with a series of axles and gears to make calculations, with the output being a printed table. I recently began reading his 1864 book, _[Passages from the Life of a Philosopher][4]_, where he explains how the Difference Engines came to be. + +One of the problems his Engine was designed to solve relates to the idea of children playing with marbles and arranging them in a progressive pyramidal shape, with one marble in the top row, two in the second, three in the third, and so on. For small pyramids, you can simply count the marbles to find how many there are. But Babbage wanted to create an automatic list or table with one column showing the number of rows and another column showing the total number of marbles. + +![Pyramids of marbles][5] + +(Greg Pittman, [CC BY-SA 4.0][6]) + +The differences he talks about are first, all the successive differences in the number of rows (equal to one in this example), and second, the difference between the number of marbles added from one row to the next (also one). As I understand it, the Difference Engine successively adds the number of marbles for each new row to the previous total, creating the table in the process. + +And so I began playing with marbles in my head, so to speak. I found myself awake in bed at 5am mentally fiddling with and counting marbles. One thing that struck me was that for six rows, the total was 21, and for seven, it was 28—both evenly divisible by seven. For eight or nine rows, the total was divisible by nine. As I went higher up the number of rows, this pattern recurred. All of this was in my head (meanwhile, I was wishing it would stop so that I could get back to sleep), so it wasn't very systematized. + +When I woke up, I decided to try to figure out why this was and whether I could predict which numbers would show this phenomenon. The answer surprised me: It turns out that _every_ odd number of rows will have a number of marbles evenly divisible by that number. + +But how could I prove this? Here is an example. For the pyramid with seven rows, look first at the pyramid with six rows, with six marbles across the bottom. Create some pairs of rows: the first and the sixth, the second and the fifth, the third and the fourth. For each of these three pairs, the sum is seven; thus, the total of the three sets of pairs is 21, and if you add seven for the next row, it would also remain evenly divisible by seven. + +![Selecting pairs of rows][7] + +(Greg Pittman, [CC BY-SA 4.0][6]) + +You can keep doing this with specific examples, but the goal is to understand this phenomenon generally. Imagine some random even number of rows, _N_. Create your pairs, then add 1 to _N_, 2 to _N_-1, 3 to _N_-2, and so on. In each case, the sum will be _N_+1. The number of these pairs will be _N_/2, so the total number of marbles will be _N_/2*(_N_+1), a number evenly divisible by _N_+1. Adding _N_+1 marbles for the next row is also evenly divisible by _N_+1. + +![Pairs of N rows][8] + +(Greg Pittman, [CC BY-SA 4.0][6]) + +For example, you can say that a pyramid with 128,948 rows will have a total of 8,313,857,826 marbles; a pyramid with 128,949 rows will have 8,313,986,775, and both these totals will be evenly divisible by 128,949. + +I don't know if Babbage considered this, but chances are, even if he did, he would say this just represents mathematical problems of multiplying and dividing six-digit numbers, and he wanted a machine to do that kind of thing. He did envision and begin work on an [Analytical Engine][9], which perhaps could have done this sort of operation. + +Nowadays, this is trivial work for computers, so here's a Python script to count your marbles before you lose them—in just 4 lines of code. + + +``` +#!/usr/bin/env python +# babbage.py +""" +Using Charles Babbage's conception of a marble-counting +operation for a regular pyramid of marbles,starting with +one at the top with each successive row having one more +marble than the row above it. + +Returns total number of marbles in a pyramid of any size. +""" + +MarbRows = input("Enter the number of rows of marbles:  ") +MarbRows = int(MarbRows) + +MarbNum = int((MarbRows)*(MarbRows+1)/2) +print ("The number of marbles is "+ str(MarbNum)) +``` + +And this is how Babbage's Difference Engine meets Python. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/babbages-python + +作者:[Greg Pittman][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/greg-p +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/math_money_financial_calculator_colors.jpg?itok=_yEVTST1 (old school calculator) +[2]: https://en.wikipedia.org/wiki/Charles_Babbage +[3]: https://en.wikipedia.org/wiki/Difference_engine +[4]: http://www.gutenberg.org/ebooks/57532 +[5]: https://opensource.com/sites/default/files/images/babbage_marblepyramid.png (Pyramids of marbles) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/babbage_pyramidpairs_0.png (Selecting pairs of rows) +[8]: https://opensource.com/sites/default/files/uploads/babbage_pyramidnpairs.png (Pairs of N rows) +[9]: https://en.wikipedia.org/wiki/Analytical_Engine diff --git a/sources/tech/20200922 Run Linux apps on your Chromebook.md b/sources/tech/20200922 Run Linux apps on your Chromebook.md new file mode 100644 index 0000000000..473d455b3e --- /dev/null +++ b/sources/tech/20200922 Run Linux apps on your Chromebook.md @@ -0,0 +1,187 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Run Linux apps on your Chromebook) +[#]: via: (https://opensource.com/article/20/9/linux-chromebook) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +Run Linux apps on your Chromebook +====== +Run all the Linux apps you want using Crostini on your Chromebook. +![Person drinking a hot drink at the computer][1] + +Chromebooks have been a game-changer for PreK-12 school systems, enabling them to purchase low-cost laptop computers for students, teachers, and administrators to use. While [Chromebooks][2] have always been powered by a Linux-based operating system (Chrome OS), until recently, there was no way to run most Linux apps on one. But that changed when Google released [Crostini][3], a virtual machine that allows Chromebooks to run Linux (Beta). + +Most Chromebooks released after 2019 and some earlier models can run Crostini and Linux (Beta). Check this [list of supported devices][4] to see if your Chromebook is on it. Fortunately, my Acer Chromebook 15 with 2GB RAM and an Intel Celeron processor is supported. + +![Acer Chromebook specs][5] + +(Don Watkins, [CC BY-SA 4.0][6]) + +I recommend using a Chromebook with 4GB RAM and more disk space if you plan to install a lot of Linux applications. + +### Set up Linux (Beta) + +After you sign into your Chromebook, "mouse over" to the lower-right corner of the screen where the clock is displayed, and left-click there. A panel will open with options at the top (from left to right) to sign out, shut down, lock, and open Settings. Choose the **Settings** icon. + +![Chromebook Settings button][7] + +(Don Watkins, [CC BY-SA 4.0][6]) + +Look on the left side of the **Settings** panel, and you will see **Linux (Beta)** listed. + +![Chromebook Settings][8] + +(Don Watkins, [CC BY-SA 4.0][6]) + +Click on **Linux (Beta),** and the main panel will change to present an option to launch it. Click the **Turn on** button. + +![Turn on Linux \(Beta\)][9] + +(Don Watkins, [CC BY-SA 4.0][6]) + +It will start the process of setting up a Linux environment on your Chromebook. + +![Setting up Linux \(Beta\)][10] + +(Don Watkins, [CC BY-SA 4.0][6]) + +Next, you will be prompted to enter a **Username** and the size you want your Linux installation to be. + +![Setting up Linux \(Beta\)][11] + +(Don Watkins, [CC BY-SA 4.0][6]) + +It takes a few minutes to install Linux on your Chromebook. + +![Installing Linux \(Beta\)][12] + +(Don Watkins, [CC BY-SA 4.0][6]) + +After the installation completes, you can use Linux on your Chromebook. The menu bar on the bottom of your Chromebook's display has a shortcut to a **terminal**, a text-based interface you can use to interact with Linux. + +![Linux \(Beta\) terminal][13] + +(Don Watkins, [CC BY-SA 4.0][6]) + +You can use [common Linux commands][14] like `ls`, `lscpu`, and `top` to see more of your environment. You can install applications using `sudo apt install`. + +### Install your first Linux application + +Being able to install and run free and open source software on a Chromebook can be a real winner for financially constrained school districts. + +The first application I recommend installing is the [Mu editor][15] for Python. Install it by entering the following into your terminal: + + +``` +`$ sudo apt install mu-editor` +``` + +It takes a bit over five minutes to install, but in the end, you'll have access to a really good Python editor for students and anyone else who wants to learn Python. + +I've had great success using [Mu and Python as a learning tool][16]. For example, I have taught my students to write code for Python's turtle module and execute it to create graphics. I was disappointed that I wasn't able to use Mu with a [BBC:Microbit][17] open hardware board. Even though the Microbit connects to USB and there is USB support in the Chromebook's Linux virtual environment, I couldn't make it work. + +![Mu editor][18] + +(Don Watkins, [CC BY-SA 4.0][6]) + +Once you've installed an application, it will show up in a special **Linux Apps** menu, which you can see on the lower-right of this screenshot. + +![Linux Apps menu][19] + +(Don Watkins, [CC BY-SA 4.0][6]) + +### Install other applications + +You can install more than just a programming language and code editor. In fact, you can install most of your favorite open source applications. + +For example, you can install the LibreOffice suite with: + + +``` +`$ sudo apt install libreoffice` +``` + +The open source audio software [Audacity][20] is one of my other favorite classroom applications. My Chromebook's microphone works with Audacity, making it easy to create podcasts or edit free sounds from [Wikimedia Commons][21]. It's easy to install Audacity on a Chromebook—with the Crostini virtual environment running, open the terminal and enter: + + +``` +`$ sudo apt install audacity` +``` + +Then launch Audacity from the command line or look for it in the **Linux Apps** section of the Chromebook menu. + +![Audacity][22] + +(Don Watkins, [CC BY-SA 4.0][6]) + +I also easily installed [TuxMath][23] and [TuxType][24], a couple of great applications for education. I was even able to install and run the image editor [GIMP][25]. All the Linux applications come from Debian Linux repositories. + +![GIMP][26] + +(Don Watkins, [CC BY-SA 4.0][6]) + +### Share files + +There is a utility within Linux (Beta) to back up and restore your files. You can also share files between your Linux (Beta) virtual machine and your Chromebook by opening the **Files** app on the Chromebook and right-clicking on the folder you want to share. You can choose to share all of your Chromebook files or create a special folder for shared files. While you are in the Linux virtual machine, you can access this folder by browsing to `/mnt/chromeos`. + +![Sharing files][27] + +(Don Watkins, [CC BY-SA 4.0][6]) + +### Learn more + +The [documentation][28] for Linux (Beta) is very complete, so read it thoroughly to learn more about its capabilities. Some key takeaways from the documentation are: + + * Cameras are not yet supported. + * Android devices are supported over USB. + * Hardware acceleration is not yet supported. + * You can access the microphone. + + + +Are you using Linux applications on your Chromebook? Tell us all about it in the comments! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/linux-chromebook + +作者:[Don Watkins][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer) +[2]: https://en.wikipedia.org/wiki/Chromebook +[3]: https://chromium.googlesource.com/chromiumos/docs/+/master/containers_and_vms.md +[4]: https://www.chromium.org/chromium-os/chrome-os-systems-supporting-linux +[5]: https://opensource.com/sites/default/files/uploads/chromebook-specs.png (Acer Chromebook specs) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/chromebook-settings.png (Chromebook Settings button) +[8]: https://opensource.com/sites/default/files/uploads/chromebook-linux-beta.png (Chromebook Settings) +[9]: https://opensource.com/sites/default/files/uploads/chromebook-launch-linux-beta.png (Turn on Linux (Beta)) +[10]: https://opensource.com/sites/default/files/uploads/chromebook-setup-linux-beta_0.png (Setting up Linux (Beta)) +[11]: https://opensource.com/sites/default/files/uploads/chromebook-linux-beta-username.png (Setting up Linux (Beta)) +[12]: https://opensource.com/sites/default/files/uploads/chromebook-linux-beta-install.png (Installing Linux (Beta)) +[13]: https://opensource.com/sites/default/files/uploads/chromebook-linux-terminal.png (Linux (Beta) terminal) +[14]: https://opensource.com/downloads/linux-common-commands-cheat-sheet +[15]: https://codewith.mu +[16]: https://opensource.com/article/20/9/teaching-python-mu +[17]: https://opensource.com/article/19/8/getting-started-bbc-microbit +[18]: https://opensource.com/sites/default/files/uploads/chromebook-mu.png (Mu editor) +[19]: https://opensource.com/sites/default/files/uploads/chromebook-linux-apps.png (Linux Apps menu) +[20]: https://www.audacityteam.org/ +[21]: https://commons.wikimedia.org/wiki/Commons:Free_media_resources/Sound +[22]: https://opensource.com/sites/default/files/uploads/chromebook-audacity.png (Audacity) +[23]: https://sourceforge.net/projects/tuxmath/ +[24]: https://sourceforge.net/projects/tuxtype/ +[25]: https://www.gimp.org/ +[26]: https://opensource.com/sites/default/files/uploads/chromebook-gimp.png (GIMP) +[27]: https://opensource.com/sites/default/files/uploads/chromebook-linux-share-files.png (Sharing files) +[28]: https://support.google.com/chromebook/answer/9145439?p=chromebook_linuxapps&b=banon-signed-mpkeys&visit_id=637346541887671598-1548999339&rd=1 diff --git a/sources/tech/20200924 Manage knowledge with BlueSpice, an open source alternative to Confluence.md b/sources/tech/20200924 Manage knowledge with BlueSpice, an open source alternative to Confluence.md new file mode 100644 index 0000000000..9c5657e4e2 --- /dev/null +++ b/sources/tech/20200924 Manage knowledge with BlueSpice, an open source alternative to Confluence.md @@ -0,0 +1,107 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Manage knowledge with BlueSpice, an open source alternative to Confluence) +[#]: via: (https://opensource.com/article/20/9/bluespice) +[#]: author: (Martin Loschwitz https://opensource.com/users/martinloschwitzorg) + +Manage knowledge with BlueSpice, an open source alternative to Confluence +====== +BlueSpice is based on Wikipedia's MediaWiki but its features go far +beyond its noble ancestor. +![Digital images of a computer desktop][1] + +Knowledge management is a key to success in modern enterprises—but it is not exactly easy to achieve. Keeping track of all relevant details across all employees is a huge challenge, especially in agile environments, which most companies say they are. + +Most companies resort to buying wiki-like solutions, such as Confluence from Atlassian, which exposes them to the lock-in effect of proprietary software. But many would do well to consider [BlueSpice][2], an open source alternative to Atlassian Confluence that has a noble ancestry: it's based on Wikipedia's [MediaWiki][3]. + +### Basic and advanced features + +![BlueSpice][4] + +(Markus Feilner, [CC BY-SA 4.0][5]) + +For a wiki-like software to become a full-featured knowledge management system in an enterprise environment, it needs a lot of features. The ability to create documents is only one of them; the knowledge in them must be structured in a way that makes it easy for users to find the information they are looking for. + +In addition, most companies have complex compliance rulesets that knowledge-management software must adhere to. Confluence has gained a lot of attention because it is particularly good on these items. But BlueSpice doesn't have anything to hide. + +### Structural differences + +A quick overview reveals that BlueSpice has a fundamentally different way of organizing itself internally than Confluence. Confluence's internal structure is based on Spaces—topic-specific, separate sub-units of a Confluence installation. Typically, individual teams in an organization get their own Spaces. + +![BlueSpice Namespaces][6] + +(Markus Feilner, [CC BY-SA 4.0][5]) + +Instead, BlueSpice follows MediaWiki's principle of Namespaces. A Namespace is specific for a certain kind of file, like images or audio files or blog posts, which are put into a distinct Namespace to separate them from the other content. BlueSpice also allows users to define content categories so that every page in the wiki can belong to multiple different categories. In stark contrast to Confluence, the typical data siloing that happens almost automatically in Confluence (due to its Spaces design) doesn't happen in BlueSpace. Small wiki installation users may not notice major differences. But in large environments, users will certainly notice a difference: Content is likely easier to find in BlueSpice than it would be in a wiki scattered into small spaces. + +[BlueSpice Farm][7] is a subscription-based upgrade to the Free version that offers a nice feature for people migrating away from Confluence to BlueSpice. The Farm version allows multiple BlueSpice wikis to be connected to each other, effectively making them work like Spaces in Confluence. This will dramatically ease the burden of getting used to a new approach. + +### Search engine + +![BlueSpice search][8] + +(Markus Feilner, [CC BY-SA 4.0][5]) + +BlueSpice's search function is powered by [ElasticSearch][9] in the background and, just like Confluence, it displays search results while the user is typing in the search term. ElasticSearch may impose some serious hardware requirements for the machine hosting the wiki, but the user benefits from having a truly open source search engine maintained by a vivid community. Also, just like in Confluence, users can narrow down their results while searching by specifying parameters such as a specific kind of result or author. + +### Compliance + +Confluence comes with a large set of compliance-related functionalities. Core features include connections to existing user directories, revision-proof content storage, and risk-assessment tools. BlueSpice mimics a lot of these features. The way certain features are implemented varies because of the different internal organizational structure BlueSpice uses. + +First things first: BlueSpice not only _supports_ connections to existing user directories, including Active Directory or LDAP, it actually _requires_ using groups from these directories. Once it's connected to a central user directory, all authentication and authorization details must come out of that directory. + +Regular Wikipedia users know about the ability to access every page's history. As a MediaWiki descendant, BlueSpice inherits that page-history feature. At any point in time, you can see the different revisions of a page and also identify the person who made each change to a page. Relevant pages can be monitored for changes, and reports can be generated on the changes over a specific period of time—a feature that helps keep auditors happy. + +### WYSIWYG editor + +![BlueSpice WYSIWYG editor][10] + +(Markus Feilner, [CC BY-SA 4.0][5]) + +Central knowledge-management systems are not used only by geeks who speak markup languages; even non-technical staff must be able to use the system in an easy and concise way. While BlueSpice supports the usual [Wikipedia markup][11] editor, it also offers a WYSIWYG-like experience called VisualEditor. Its buttons and formatting tools will remind many people of familiar interfaces from tools such as LibreOffice. + +### Extensions + +Confluence users love the ability to extend the tool with external plugins. BlueSpice offers a similar capability through access to MediaWiki extensions. While BlueSpice doesn't have its own extension store just yet, it can easily use roughly 150 MediaWiki extensions for graphical highlighting, gaming, analytical functions, and more. + +### Branding + +A lot of companies want their central knowledge-management system to resemble the company's branding since it is a central place for employees. Given that MediaWiki is considered to have a rather conservative look and feel, you might wonder about adapting BlueSpice to corporate identity and corporate design requirements. Like Confluence, BlueSpice can be almost completely adapted to a company's brand standards and design requirements. While both Confluence and BlueSpice maintain a basic page structure, you can adjust central design elements such as headers, fonts, and the like. When it's done right, a BlueSpice theme will hardly remind users of MediaWiki at all. + +### BlueSpice advantages + +There are some areas where BlueSpice is superior to Confluence. For instance, many organizations need revision-proof tracking of changes in their central knowledge system for compliance reasons. This feature is built into BlueSpice, while achieving similar functionality in Confluence requires an extension. BlueSpice also comes with MediaWiki's Semantics extension built-in, effectively allowing users to query wiki pages for certain keywords. And last but not least, BlueSpice's Book extension can natively integrate manuals, product documentation, or other book contents into its contents. + +### Open source license + +Confluence has earned its merits for helping many companies introduce a central knowledge store in the form of wiki software. For open source enthusiasts, the software's proprietary nature might raise a red flag. + +BlueSpice is a functional open source alternative to Confluence based on the well-proven MediaWiki software. It provides similar functionality while maintaining MediaWiki's open license. All features relevant for small and large enterprises are in BlueSpice. Organizations planning to introduce a centralized knowledge-management system might find BlueSpice to be a good alternative to its famous commercial competitor. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/bluespice + +作者:[Martin Loschwitz][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/martinloschwitzorg +[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://bluespice.com/products/bluespice-free +[3]: https://www.mediawiki.org/wiki/MediaWiki +[4]: https://opensource.com/sites/default/files/uploads/bluespice_math-formula.jpg (BlueSpice) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/bluespice_organizationchart.jpg (BlueSpice Namespaces) +[7]: https://bluespice.com/products/bluespice-farm/ +[8]: https://opensource.com/sites/default/files/uploads/bluespice_search_fulltext.jpg (BlueSpice search) +[9]: https://www.elastic.co/elasticsearch/ +[10]: https://opensource.com/sites/default/files/uploads/bluespice_editor-2.jpg (BlueSpice WYSIWYG editor) +[11]: https://en.wikipedia.org/wiki/Help:Cheatsheet diff --git a/sources/tech/20200925 -email-protected-- Help the Fight Against COVID-19 With Your Linux System.md b/sources/tech/20200925 -email-protected-- Help the Fight Against COVID-19 With Your Linux System.md new file mode 100644 index 0000000000..8a09f63907 --- /dev/null +++ b/sources/tech/20200925 -email-protected-- Help the Fight Against COVID-19 With Your Linux System.md @@ -0,0 +1,231 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Rosetta@home: Help the Fight Against COVID-19 With Your Linux System) +[#]: via: (https://itsfoss.com/boinc-setup/) +[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/) + +Rosetta@home: Help the Fight Against COVID-19 With Your Linux System +====== + +Want to contribute to the research on coronavirus? You don’t necessarily have to be a scientist for this. You may contribute with part of your computer’s computing power thanks to Rosetta@home project. + +Sounds interesting? Let me share more details on it. + +### What is Rosetta@home? + +Rosetta@home is a [distributed computing][2] project for protein structure prediction, based at the Baker laboratory at the University of Washington and running on the Berkeley Open Infrastructure for Network Computing (BOINC) open source platform, which was originally developed to support the [Rosetta@home][3]. + +**Not enough computing power? Utilize the power of distributed computing** + +To predict and design the structures of naturally occurring proteins is very computationally intensive. To speed up the process, [Dr. David Becker][4] had filled the entire lab and the hallway with desktop computers. Then they started getting complaints of heating up the building, but still didn’t have enough computing power to accurately predict and design protein structures. + +**How does Rosetta@home work?** + +Rosetta@home uses idle computer processing power from volunteers’ computers to perform calculations on individual work units. When a requested task is being completed, the client sends the results to a central project server where they are validated and incorporated into project databases. + +![][5] + +As of 28th March 2020 the computing power of Rosetta@home has been increased up to 1.7 PetaFlops, due to the recently joined users looking to participate in the fight against the COVID-19 pandemic. Thanks to that, **On 26th June 2020, Rosetta@home researchers announced they had created antiviral proteins that neutralized SARS-CoV-2 in the lab.** + +Is BOINC platform safe? + +After few years of operation on millions of systems, there have been no security incidents reported due to BOINC. This fact doesn’t mean that there is no possibility of a security risks. + +BOINC uses a mechanism called **code signing**, based on _public-key cryptography_, that eliminates the vulnerability, as long as projects use proper practice. Each project has a code-signing key pair consisting of a public key and a private key which is used to create “signatures” for programs. The BOINC client will only run programs with valid signatures. + +Projects are instructed to keep the private key only on a computer that is permanently offline to create signatures. Therefore hackers cannot trick BOINC into running malware. + +Most BOINC projects follow these practices. If you’re concerned about security, you should attach to a project only if you know it follows the code-signing procedure correctly. If in doubt, you may ask project administrators to describe how they do code signing. + +### Contributing to Rosetta@home with BOINC platform + +![][6] + +If you are interested in contributing to the scientific research by donating some computing power, you’ll find rest of this article helpful. + +I’ll discuss the following: + + * Prerequisite for joining BOINC platform + * Using BOINC platform to donate computing power to a project of your choice via your desktop Linux + * Using Raspberry Pi to run BOINC all the time + + + +#### System Requirements of the BOINC platform + +The BOINC distributed computing platform with which you can access Rosetta@home is available on a 64bit operating system such as Windows, Linux, and macOS and FreeBSD. + +You will need a CPU of at least 500 MHz, 200 megabytes of free disk space, 512 megabytes of RAM, and Internet connectivity. + +**The more CPU cores your system has, the more RAM is required as a work unit will “feed” each core.** + +#### Create a user account on BOINC platform + +Before you configure the BOINC platform, [create an account][7] using your computer. If you will use a Raspberry Pi, you can join the “crunch-on-arm” team. + +**Please note that the same account can be used to multiple machines at a time. All of your machines will appear on your account.** + +#### **Install BOINC platform** on various Linux distributions + +BOINC application has the following element: + + * boinc-client (daemon that runs the platform) + * boinctui: terminal based interface for selecting projects and other settings + * boinc-manager: GUI-based interface for selecting projects and other settings + + + +If you are using a server, you should install boinctui. If you are using Linux desktop, you can opt for boinc-manager. + +I’ll stick with the GUI tool in this part of the tutorial. + +**On Debian/Ubuntu** + +BOINC tools are available in the universe repository in Ubuntu 20.04 so make sure that you have [universe repository enabled on your Ubuntu system][8]. + +Use the following commands to install it: + +``` +sudo apt install boinc-client boinc-manager +``` + +Install BOINC on Fedora + +Open a terminal and enter the following command: + +``` +sudo dnf install boinc-client boinc-manager +``` + +Install BOINC on RedHat/CentOS + +First, make sure that the EPEL repository is enabled, by running following command on a terminal: + +``` +sudo yum install epel-release +``` + +You can now install the necessary packages: + +``` +sudo yum install boinc-client boinc-manager +``` + +#### Open the BOINC manager and add a project + +After installing, open BOINC manager. You will be asked to add a project and to create an account or login to an existing. + +![][9] + +Add your credentials and click finish when prompted. + +![][10] + +After a few minutes, the status will change to running. + +![][11] + +You don’t need to worry if your system resources will be consumed when you want to use your computer. **By default, if the BOINC manager notices that the user needs more than the 25% of CPU resources, the BOINC computation will be suspended.** + +If you want the application to be suspended at a lower or higher CPU usage, you can change your profile settings on the website where you created your account. + +### Rosetta@home on a Raspberry Pi 4 + +An ideal device to run 24/7 the Rosetta@home application is a Raspberry Pi, which is powerful enough and with very low power consumption. + +To fight COVID-19 using a Raspberry Pi 4, you need a model with 2 GB RAM or more. My personal recommendation is the 4 GB RAM option, because with my 2 GB model one of the cores is idling as it is running out of memory. + +#### **Step 1: Install Ubuntu Server** (Recommended) + +You need to have some [operating system on your Raspberry Pi][12]. [Installing Ubuntu server on Raspberry Pi][13] is one of the most convenient choices. + +#### **Step 2: Install BOINC platform** + +To install the BOINC client and the command line management interface run the following command on server running on the Raspberry Pi. + +``` +sudo apt install boinc-client boinctui +``` + +**Additional steps for Raspberry Pi 2 GB model** + +Your account by default is set to utilize 90% of the memory when the user is idling. The Rosetta work units require 1.9gb of memory to run on the Quad core Raspberry Pi, so there is a possibility for the client not be able to start due to the initial reading. If the Raspberry Pi runs out of memory, it will suspend one of the 4 running tasks as mentioned earlier. To override the 1.9gb threshold add the following lines to the location below: + +``` +sudo nano /var/lib/boinc-client/global_prefs_override.xml +``` + +**Add now these lines** + +``` + + 100.000000 + 100.000000 + 100.000000 + +``` + +![][14] + +This setting will increase the default memory available to Rosetta to the maximum amount of memory on the board. + +#### Step 3: Add Rosetta@home project + +On your Raspberry Pi command line type ‘boinctui’ and click enter to load the terminal GUI.  + +``` +boinctui +``` + +Press **F9** on the keyboard, to bring down the menu choices. Use the arrow keys to go to Projects and press Enter. + +You may notice a few available projects to choose from but if you are interested to actively support the fight against COVID-19 choose Rosetta. You will be prompted to either create a user account or to use an existing account. + +Select “Existing User” and the enter the credentials you created on the website at the initial step.  As you can see, I have already selected the Rosetta project. + +![][15] + +It will take a moment to download the work units, and then automatically it will start crunching data on your Raspberry Pi 4! + +#### Conclusion + +_**If you want to stop using BOINC, simply delete the boinc packages you installed earlier. I believe you know how to use your distribution’s package manager for removing software.**_ + +One of the benefits of distributing computing is to allow user’s to donate their system resources for the common good. Despite the grief the pandemic has spread worldwide, it can make us also to realize the necessity of volunteering in one way or the other. + +If you ever wondered about a [good use of your Raspberry Pi][16], Rosetta@home can be included to the list. + +Let us know at the comments below if you started “cruching” and which platform you chose. Stay safe! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/boinc-setup/ + +作者:[Dimitrios Savvopoulos][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/dimitrios/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/cdn-cgi/l/email-protection +[2]: https://www.computerhope.com/jargon/d/distribs.htm +[3]: https://en.wikipedia.org/wiki/SETI@home +[4]: https://www.ipd.uw.edu/people/ipd-faculty-staff/david-baker/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/rosetta-sharing-example.jpg?resize=780%2C278&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/rosetta-home-linux.png?resize=800%2C450&ssl=1 +[7]: http://boinc.bakerlab.org +[8]: https://itsfoss.com/ubuntu-repositories/ +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/boinc-manager.png?resize=800%2C600&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/boinc-credentials.png?resize=800%2C600&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/boinc-manager-running.png?resize=800%2C800&ssl=1 +[12]: https://itsfoss.com/raspberry-pi-os/ +[13]: https://itsfoss.com/install-ubuntu-server-raspberry-pi/ +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/09/rosetta-settings-local-override.png?resize=800%2C600&ssl=1 +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/09/rosetta-add-project.png?resize=800%2C600&ssl=1 +[16]: https://itsfoss.com/raspberry-pi-projects/ diff --git a/sources/tech/20200925 Code your first algorithm in Scratch.md b/sources/tech/20200925 Code your first algorithm in Scratch.md new file mode 100644 index 0000000000..b5960d0cbb --- /dev/null +++ b/sources/tech/20200925 Code your first algorithm in Scratch.md @@ -0,0 +1,151 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Code your first algorithm in Scratch) +[#]: via: (https://opensource.com/article/20/9/scratch) +[#]: author: (Jess Weichler https://opensource.com/users/cyanide-cupcake) + +Code your first algorithm in Scratch +====== +Learn how to get started with Scratch in this article in a series about +teaching kids to code. +![The back of a kid head][1] + +With more kids learning from home this year, it's important to engage them with unique learning opportunities. The classroom looks very different than it did before, and it's going to continue to evolve. So should the lessons we teach. + +In the [first article][2] in this series, I shared how my students taught me to code. Over the next few weeks, I will be exploring how educators and parents can harness the power of coding to teach kids a wide variety of skills. + +"But I don't know anything about coding!" you may be shouting at your computer. That's one of the beauties of open source code: everyone is a learner, and everyone is a teacher. Whether you're new to coding or you've been doing it all your life, part of the process is making mistakes. It's all about problem-solving and learning how to find information. The greatest tool an educator has in a coding classroom is the phrase, "I don't know; let's find out together!" + +So, let's begin! + +### What is code? + +Code is how you get a computer to do what you want it to do. Laptops, smartphones, video-game consoles, and even washing machines use code to work. And despite advancements in machine learning and AI, somebody has to write that code. + +Coders (also known as programmers) are the people who write code. But what is code, really? What exactly are programmers writing when they create software or fine-tune hardware? + +Code is made up of _algorithms_: highly structured and ordered lists of instructions, much like a recipe. Because computers aren't actually smart, these instructions are written in _code_ that must be parsed and compiled and transformed into _machine language_. Only then can computers perform the actions that programmers dictate. The key is to learn the syntax of the code so you can write words in the required order so that computers can decipher and process them. + +### What is Scratch? + +[Scratch][3] is a great platform for kids learning to code. It is a visual programming language designed for ages 8 and up. It uses drag-and-drop blocks that snap together to create animations, quizzes, and video games. Traditional coding requires a lot of typing without making any spelling errors, and the visual nature of Scratch makes it easy for young writers to learn to code without getting bogged down with spelling errors. + +Scratch is not just about coding, though. It also encourages an open online community by empowering users to share and remix projects. There's also an offline version available for classrooms and households with limited internet connectivity. + +### Learn the lingo + +Even if a child has used Scratch before, this lesson is important for ensuring they understand coding terminology and logic. + +![Scratch interface][4] + +(Jess Weichler, [CC BY-SA 4.0][5]) + +Using Scratch, you can create video games using **code blocks** that snap together to form a script. A **script** is an ordered list of instructions, like a recipe. Another word for "script" is **algorithm**. + +A **sprite** is a character or object in the game. The **stage** is the background of the game. Scripts can be used to control sprites and the stage. + +Every script starts with a special code block called an **event hat**. These blocks have rounded tops. An event hat waits for something to happen before running all the code blocks underneath it. + +Scratch follows scripts exactly, so you must be specific when telling it what to do. + +### Get coding + +Try the following challenges to get started on your coding journey. + +#### Challenge #1: Create a simple algorithm to move a sprite right when you press the right arrow key. + +Did your algorithm work as you expected? Does your sprite move right when the right arrow is pressed? How did you do it? + +When coding, there are often multiple solutions to a problem. Here are two of the most common ways you may have coded the sprite to move when the right arrow is pressed: + +![Possibility One: When right arrow pressed, move 10 steps . Possibility Two: When right arrow pressed, change x by 10.][6] + +(Jess Weichler, [CC BY-SA 4.0][5]) + +Let's experiment. + + * What happens if you change the number? + * What happens when your sprite reaches the edge of the screen? + * What motion code block could prevent the sprite from disappearing when it reaches the edge? + + + +![Possibility One: When right arrow pressed, move 15 steps, if on edge, bounce. Possibility Two: When right arrow pressed, change x by 15, if on edge, bounce][7] + +(Jess Weichler, [CC BY-SA 4.0][5]) + +Now what happens? How can you solve it? + +To stop the sprite from flipping upside-down after hitting an edge: select the sprite and click **Direction**. Select the **Left/Right** icon or the **Do Not Rotate** icon. + +![Scratch code][8] + +(Jess Weichler, [CC BY-SA 4.0][5]) + +Errors in code, such as this, are called **bugs**. Bugs are a normal part of coding. + +Fixing code is called **debugging**. + +Test your game again. Do you notice any more bugs? + + * If your sprite is bouncing off the right side of the screen, you are ready for the next challenge. + * If, when your sprite touches the right side of the screen, it starts moving left when you press the right arrow, add one more code block to the algorithm. + + + +![Possibility One: When right arrow pressed, point in direction 90, move 15 steps, if on edge, bounce. Possibility Two: No change][9] + +(Jess Weichler, [CC BY-SA 4.0][5]) + +#### Challenge #2: Make the sprite move left when you press the left arrow. + +You have all the skills and knowledge you need to ace this challenge! How will you complete it? + +[Click here for my solution][10]. + +If you're using a screen reader, or you prefer text, select this spoiler text to reveal the answer: + +**Possibility One:** When right arrow pressed, point in direction 90, move 15 steps, if on edge, bounce +When left arrow pressed, point in direction -90, move 15 steps, if on edge, bounce + +**Possibility Two:** When right arrow pressed, change x by 15, if on edge, bounce +When left arrow pressed, change x by -15, if on edge, bounce + +When you're happy with what you've made, name and save your project. Do not select "save as" or "save a copy," as this will create a duplicate project. Just click **Save** or **Save Now**. + +Congratulations, you've created your first two algorithms! + +### Don't stop here + +Coding is all about experimenting and iterating until you get the desired result. This is one of many reasons I love it as a teaching tool. And don't stop with just this introductory lesson. + +Pose a problem and try to solve it with Scratch. For instance, can you make a game in which the Scratch cat finds an object and "eats" it? Look through the available blocks and formulate a plan, then construct a script. + +Most importantly, don't give up, and remember, there's no wrong answer! It's all about creativity, being inventive, and having fun. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/9/scratch + +作者:[Jess Weichler][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cyanide-cupcake +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/idea_innovation_kid_education.png?itok=3lRp6gFa (The back of a kid head) +[2]: https://opensource.com/article/20/9/how-my-students-taught-me-code +[3]: https://scratch.mit.edu/ +[4]: https://opensource.com/sites/default/files/uploads/codekids2_1_interface.png (Scratch interface) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/codekids2_2_code.png (Scratch code) +[7]: https://opensource.com/sites/default/files/uploads/codekids2_3_code.png (Scratch code) +[8]: https://opensource.com/sites/default/files/uploads/codekids2_4_code.png (Scratch code) +[9]: https://opensource.com/sites/default/files/uploads/codekids2_5_code.png (Scratch code) +[10]: https://opensource.com/sites/default/files/scratch3-left-right_answer.png diff --git a/sources/tech/20200926 Cisco turns out security patches 25 high-threat flaws for IOS, IOS XE.md b/sources/tech/20200926 Cisco turns out security patches 25 high-threat flaws for IOS, IOS XE.md new file mode 100644 index 0000000000..dc08d1ec01 --- /dev/null +++ b/sources/tech/20200926 Cisco turns out security patches 25 high-threat flaws for IOS, IOS XE.md @@ -0,0 +1,68 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Cisco turns out security patches 25 high-threat flaws for IOS, IOS XE) +[#]: via: (https://www.networkworld.com/article/3583654/cisco-turns-out-security-patches-25-high-threat-flaws-for-ios-ios-xe.html) +[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/) + +Cisco turns out security patches 25 high-threat flaws for IOS, IOS XE +====== +Cisco this week posted 25 security advisories defining 34 vulnerabilities rated high that should be fixed right away +[Nathan Cowley / Ivanastar / Getty Images][1] + +If you are a security admin with lots of systems running Cisco IOS and IOS XE software today is decidedly not your day. + +Cisco this week posted 25 “High” rated security advisories that stem from 34 vulnerabilities the company suggests should be fixed as soon as possible. The vulnerabilities impact a wide-range of Cisco gear as IOS and IOS XE are the company’s most widely used operating systems. The warnings affect firewalls, wireless access points and switches. + +[Network pros react to new Cisco certification curriculum][2] + +For example, one of the highest rated threats--with an 8.6 out of 10 threat level, are [multiple vulnerabilities][3] in the Zone-Based Firewall feature of Cisco IOS XE Software that could let an remote attacker to cause the device to reload or stop forwarding traffic through the [firewall][4],resulting in a denial of service (DoS). + +Cisco stated that the vulnerabilities are due to incomplete handling of Layer 4 packets through the device. An attacker could exploit these vulnerabilities by sending a certain sequence of traffic patterns through the device.  + +Another 8.6-rated vulnerability involves the [Split DNS feature][5] of Cisco IOS Software and Cisco IOS XE Software could let an unauthenticated, remote attacker cause an affected device to reload, resulting in a DoS condition. + +“The vulnerability occurs because the regular expression (regex) engine that is used with the Split [DNS][6] feature of affected releases may time out when it processes the DNS name list configuration. An attacker could exploit this vulnerability by trying to resolve an address or hostname that the affected device handles,” Cisco stated. + +Still another 8.6-rated security threat involves a vulnerability in the [DHCP][7] message handler of Cisco IOS XE Software for Cisco cBR-8 Converged Broadband Routers.  The vulnerability is due to insufficient error handling when DHCP version 4 (DHCPv4) messages are parsed. An attacker could exploit this vulnerability by sending a malicious DHCPv4 message to or through a WAN interface of an affected device. A successful exploit could allow the attacker to cause a reload of the affected device, Cisco stated. + +Some of the other threat advisories include: + + * A vulnerability in the [WPA2 and WPA3 security implementation][8] of Cisco IOS XE Wireless Controller Software for the Cisco Catalyst 9000 Family could let an unauthenticated, adjacent attacker send a crafted authentication packet to an affected device. A successful exploit could cause it to reload, resulting in a DoS condition. The vulnerability is due to incorrect packet processing during the WPA2 and WPA3 authentication handshake when configured for dot1x or pre-shared key (PSK) authentication key management (AKM) with 802.11r BSS Fast Transition (FT) enabled, Cisco stated. + * A vulnerability in the [Umbrella Connector][9] component of Cisco IOS XE Software for Cisco Catalyst 9200 Series Switches could allow an unauthenticated, remote attacker to trigger a reload, resulting in a DOS condition on an affected device. The vulnerability is due to insufficient error handling when parsing DNS requests. An attacker could exploit this vulnerability by sending a series of malicious DNS requests to an Umbrella Connector client interface of an affected device. + * Multiple vulnerabilities in the [web management framework of Cisco IOS XE][10] Software could allow an authenticated, remote attacker with read-only privileges to elevate them to _Administrator_ on an affected device. For example, a vulnerability in the APIs of the web management framework of Cisco IOS XE Software could lead to such an attack. Another weakness in the authentication controls of the web management framework of Cisco IOS XE Software could allow an authenticated, remote attacker with read-only privileges to elevate privileges to _Administrator_ on an affected device. + + + +Workarounds are not available, but patches or software updates addressing all of the vulnerabilities are [available][11], Cisco stated. + +Join the Network World communities on [Facebook][12] and [LinkedIn][13] to comment on topics that are top of mind. + +-------------------------------------------------------------------------------- + +via: https://www.networkworld.com/article/3583654/cisco-turns-out-security-patches-25-high-threat-flaws-for-ios-ios-xe.html + +作者:[Michael Cooney][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.networkworld.com/author/Michael-Cooney/ +[b]: https://github.com/lujun9972 +[1]: https://www.pexels.com/photo/man-in-blue-and-brown-plaid-dress-shirt-touching-his-hair-897817/ +[2]: https://www.networkworld.com/article/3446044/network-pros-react-to-new-cisco-certification-curriculum.html +[3]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-zbfw-94ckG4G +[4]: https://www.networkworld.com/article/3230457/what-is-a-firewall-perimeter-stateful-inspection-next-generation.html +[5]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-splitdns-SPWqpdGW +[6]: https://www.networkworld.com/article/3268449/what-is-dns-and-how-does-it-work.html +[7]: https://www.networkworld.com/article/3299438/dhcp-defined-and-how-it-works.html +[8]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-wpa-dos-cXshjerc +[9]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-iosxe-umbrella-dos-t2QMUX37 +[10]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-ios-webui-priv-esc-K8zvEWM#d +[11]: https://tools.cisco.com/security/center/home.x +[12]: https://www.facebook.com/NetworkWorld/ +[13]: https://www.linkedin.com/company/network-world diff --git a/sources/tech/20200929 This Python script mimics Babbage-s Difference Engine.md b/sources/tech/20200929 This Python script mimics Babbage-s Difference Engine.md new file mode 100644 index 0000000000..e068b55acc --- /dev/null +++ b/sources/tech/20200929 This Python script mimics Babbage-s Difference Engine.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (This Python script mimics Babbage's Difference Engine) +[#]: via: (https://opensource.com/article/20/10/babbages-python) +[#]: author: (Greg Pittman https://opensource.com/users/greg-p) + +This Python script mimics Babbage's Difference Engine +====== +Python once again takes on Charles Babbage's Difference Engine. +![Math formulas in green writing][1] + +In [_Use this Python script to simulate Babbage's Difference Engine_][2], Python offered an alternative solution to Babbage's problem of determining the number of marbles in a two-dimensional pyramid. Babbage's [Difference Engine][3] solved this using a table showing the number of marble rows and the total number of marbles. + +After some contemplation, [Charles Babbage][4]'s ghost replied, "This is all well and good, but here you only take the number of rows and give the number of marbles. With my table, I can also tell you how large a pyramid you might construct given a certain number of marbles; simply look it up in the table." + +Python had to agree that this was indeed the case, yet it knew that surely this must be solvable as well. With little delay, Python came back with another short script. The solution involves thinking through the math in reverse. + + +``` +`MarbNum = (N * (N + 1))/2` +``` + +Which I can begin to solve with: + + +``` +`N * (N + 1) = MarbNum * 2` +``` + +From which an approximate solution might be: + + +``` +`N = int(sqrt(MarbNum * 2))` +``` + +But the integer _N_ that solves this might be too large by one, so I need to test for this. In other words, the correct number of rows will either be _N_ or _N-1_. Here is the final script: + + +``` +#!/usr/bin/env python +# babbage2.py +""" +Using Charles Babbage's conception of a marble-counting operation for a regular +pyramid of marbles, starting with one at the top with each successive row having +one more marble than the row above it. +Will give you the total number of rows possible for a pyramid, given a total number +of marbles available. +As a bonus, you also learn how many are left over. +""" +import math + +MarbNum = input("Enter the number of marbles you have:  ") +MarbNum = int(MarbNum) + +firstguess = int(math.sqrt(MarbNum*2)) + +if (firstguess * (firstguess + 1) > MarbNum*2): +    correctNum = firstguess - 1 +else: +    correctNum = firstguess + +MarbRem = int(MarbNum - (correctNum * (correctNum + 1)/2)) +# some grammatical fixes +if MarbRem == 0: +    MarbRem = "no" +  +if MarbRem == 1: +    marbleword = "marble" +else: +    marbleword = "marbles" +    +print ("You can have",correctNum, "rows, with",MarbRem, marbleword, "remaining.") +``` + +The output will look something like this: + + +``` +Enter the number of marbles you have:  374865 +You can have 865 rows, with 320 marbles remaining. +``` + +And Mr. Babbage's ghost was impressed. "Ah, your Python Engine is impressive indeed! Surely it might rival my [Analytical Engine][5], had I had the time to complete that project." + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/babbages-python + +作者:[Greg Pittman][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/greg-p +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/edu_math_formulas.png?itok=B59mYTG3 (Math formulas in green writing) +[2]: https://opensource.com/article/20/9/babbages-python +[3]: https://en.wikipedia.org/wiki/Difference_engine +[4]: https://en.wikipedia.org/wiki/Charles_Babbage +[5]: https://en.wikipedia.org/wiki/Analytical_Engine diff --git a/sources/tech/20200929 Xen on Raspberry Pi 4 adventures.md b/sources/tech/20200929 Xen on Raspberry Pi 4 adventures.md new file mode 100644 index 0000000000..a21b4fca9c --- /dev/null +++ b/sources/tech/20200929 Xen on Raspberry Pi 4 adventures.md @@ -0,0 +1,156 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Xen on Raspberry Pi 4 adventures) +[#]: via: (https://www.linux.com/featured/xen-on-raspberry-pi-4-adventures/) +[#]: author: (Linux.com Editorial Staff https://www.linux.com/author/linuxdotcom/) + +Xen on Raspberry Pi 4 adventures +====== + +Written by [Stefano Stabellini][1] and [Roman Shaposhnik][2] + +![][3] + +Raspberry Pi (RPi) has been a key enabling device for the Arm community for years, given the low price and widespread adoption. According to the RPi Foundation, over 35 million have been sold, with 44% of these sold into industry. We have always been eager to get the Xen hypervisor running on it, but technical differences between RPi and other Arm platforms made it impractical for the longest time. Specifically, a non-standard interrupt controller without virtualization support. + +Then the Raspberry Pi 4 came along, together with a regular GIC-400 interrupt controller that Xen supports out of the box. Finally, we could run Xen on an RPi device. Soon Roman Shaposhnik of Project EVE and a few other community members started asking about it on the **xen-devel** mailing list. _“It should be easy,”_ we answered. _“It might even work out of the box,”_ we wrote in our reply. We were utterly oblivious that we were about to embark on an adventure deep in the belly of the Xen memory allocator and Linux address translation layers. + +The first hurdle was the availability of low memory addresses. RPi4 has devices that can only access the first 1GB of RAM. The amount of memory below 1GB in **Dom0** was not enough. Julien Grall solved this problem with a simple one-line fix to increase the memory allocation below 1GB for **Dom0** on RPi4. The patch is now present in Xen 4.14. + +_“This lower-than-1GB limitation is uncommon, but now that it is fixed, it is just going to work.”_ We were wrong again. The Xen subsystem in Linux uses _virt_to_phys_ to convert virtual addresses to physical addresses, which works for most virtual addresses but not all. It turns out that the RPi4 Linux kernel would sometimes pass virtual addresses that cannot be translated to physical addresses using _virt_to_phys_, and doing so would result in serious errors. The fix was to use a different address translation function when appropriate. The patch is now present in Linux’s master branch. + +We felt confident that we finally reached the end of the line. _“Memory allocations – check. Memory translations — check. We are good to go!”_ No, not yet. It turns out that the most significant issue was yet to be discovered. The Linux kernel has always had the concept of physical addresses and DMA addresses, where DMA addresses are used to program devices and could be different from physical addresses. In practice, none of the x86, ARM, and ARM64 platforms where Xen could run had DMA addresses different from physical addresses. The Xen subsystem in Linux is exploiting the DMA/physical address duality for its own address translations. It uses it to convert physical addresses, as seen by the guest, to physical addresses, as seen by Xen. + +To our surprise and astonishment, the Raspberry Pi 4 was the very first platform to have physical addresses different from DMA addresses, causing the Xen subsystem in Linux to break. It wasn’t easy to narrow down the issue. Once we understood the problem, a dozen patches later, we had full support for handling DMA/physical address conversions in Linux. The Linux patches are in master and will be available in Linux 5.9. + +Solving the address translation issue was the end of our fun hacking adventure. With the Xen and Linux patches applied, Xen and Dom0 work flawlessly. Once Linux 5.9 is out, we will have Xen working on RPi4 out of the box. + +We will show you how to run Xen on RPi4, the real Xen hacker way, and as part of a downstream distribution for a much easier end-user experience. + +## **Hacking Xen on Raspberry Pi 4** + +If you intend to hack on Xen on ARM and would like to use the RPi4 to do it, here is what you need to do to get Xen up and running using UBoot and TFTP. I like to use TFTP because it makes it extremely fast to update any binary during development.  See [this tutorial][4] on how to set up and configure a TFTP server. You also need a UART connection to get early output from Xen and Linux; please refer to [this article][5]. + +Use the [rpi-imager][6] to format an SD card with the regular default Raspberry Pi OS. Mount the first SD card partition and edit **config.txt**. Make sure to add the following: + +``` +kernel=u-boot.bin + +enable_uart=1 + +arm_64bit=1 +``` + +Download a suitable UBoot binary for RPi4 (u-boot.bin) from any distro, for instance [OpenSUSE][7]. Download the JeOS image, then open it and save **u-boot.bin**: + +``` +xz -d openSUSE-Tumbleweed-ARM-JeOS-raspberrypi4.aarch64.raw.xz + +kpartx -a ./openSUSE-Tumbleweed-ARM-JeOS-raspberrypi4.aarch64.raw + +mount /dev/mapper/loop0p1 /mnt + +cp /mnt/u-boot.bin /tmp +``` + +Place u-boot.bin in the first SD card partition together with config.txt. Next time the system boots, you will get a UBoot prompt that allows you to load Xen, the Linux kernel for **Dom0**, the **Dom0 rootfs**, and the device tree from a TFTP server over the network. I automated the loading steps by placing a UBoot **boot.scr** script on the SD card: + +``` +setenv serverip 192.168.0.1 + +setenv ipaddr 192.168.0.2 + +tftpb 0xC00000 boot2.scr + +source 0xC00000 +``` + +Where: + +``` +- serverip is the IP of your TFTP server + +- ipaddr is the IP of the RPi4 +``` + +Use mkimage to generate boot.scr and place it next to config.txt and u-boot.bin: + +``` +mkimage -T script -A arm64 -C none -a 0x2400000 -e 0x2400000 -d boot.source boot.scr +``` + +Where: + +``` +- boot.source is the input + +- boot.scr is the output +``` + +UBoot will automatically execute the provided boot.scr, which sets up the network and fetches a second script (boot2.scr) from the TFTP server. boot2.scr should come with all the instructions to load Xen and the other required binaries. You can generate boot2.scr using [ImageBuilder][8]. + +Make sure to use Xen 4.14 or later. The Linux kernel should be master (or 5.9 when it is out, 5.4-rc4 works.) The Linux ARM64 default config works fine as kernel config. Any 64-bit rootfs should work for Dom0. Use the device tree that comes with upstream Linux for RPi4 (**arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb**). RPi4 has two UARTs; the default is **bcm2835-aux-uart** at address **0x7e215040**. It is specified as “serial1” in the device tree instead of serial0. You can tell Xen to use serial1 by specifying on the Xen command line: + +``` +console=dtuart dtuart=serial1 sync_console +``` + + The Xen command line is provided by the **boot2.scr** script generated by ImageBuilder as “**xen,xen-bootargs**“. After editing **boot2.source** you can regenerate **boot2.scr** with **mkimage**: + +``` +mkimage -A arm64 -T script -C none -a 0xC00000 -e 0xC00000 -d boot2.source boot2.scr +``` + +## **Xen on Raspberry Pi 4: an easy button** + +Getting your hands dirty by building and booting Xen on Raspberry Pi 4 from scratch can be not only deeply satisfying but can also give you a lot of insight into how everything fits together on ARM. Sometimes, however, you just want to get a quick taste for what it would feel to have Xen on this board. This is typically not a problem for Xen, since pretty much every Linux distribution provides Xen packages and having a fully functional Xen running on your system is a mere “apt” or “zypper” invocation away. However, given that Raspberry Pi 4 support is only a few months old, the integration work hasn’t been done yet. The only operating system with fully integrated and tested support for Xen on Raspberry Pi 4 is [LF Edge’s Project EVE][9]. + +Project EVE is a secure-by-design operating system that supports running Edge Containers on compute devices deployed in the field. These devices can be IoT gateways, Industrial PCs, or general-purpose ruggedized computers. All applications running on EVE are represented as Edge Containers and are subject to container orchestration policies driven by k3s. Edge containers themselves can encapsulate Virtual Machines, Containers, or Unikernels.  + +You can find more about EVE on the project’s website at and its GitHub repo . The latest instructions for creating a bootable media for Raspberry Pi 4 are also available at:  + + + +Because EVE publishes fully baked downloadable binaries, using it to give Xen on Raspberry Pi 4 a try is as simple as: + +``` +$ docker pull lfedge/eve:5.9.0-rpi-xen-arm64 # you can pick a different 5.x.y release if you like + +$ docker run lfedge/eve:5.9.0-rpi-xen-arm64 live > live.raw +``` + +This is followed by flashing the resulting **live.raw** binary onto an SD card using your favorite tool.  + +Once those steps are done, you can insert the card into your Raspberry Pi 4, connect the keyboard and the monitor and enjoy a minimalistic Linux distribution (based on Alpine Linux and Linuxkit) that is Project EVE running as **Dom0** under Xen. + +As far as Linux distributions go, EVE presents a somewhat novel design for an operating system, but at the same time, it is heavily inspired by ideas from Qubes OS, ChromeOS, Core OS, and Smart OS. If you want to take it beyond simple console tasks and explore how to run user domains on it, we recommend heading over to EVE’s sister project Eden: and following a short tutorial over there. + +If anything goes wrong, you can always find an active community of EVE and Eden users on LF Edge’s Slack channels starting with #eve over at — we’d love to hear your feedback. + +In the meantime – happy hacking! + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/featured/xen-on-raspberry-pi-4-adventures/ + +作者:[Linux.com Editorial Staff][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/linuxdotcom/ +[b]: https://github.com/lujun9972 +[1]: https://twitter.com/stabellinist?lang=en +[2]: https://twitter.com/rhatr?lang=en +[3]: https://www.linux.com/wp-content/uploads/2020/09/xen_project_logo.jpg +[4]: https://help.ubuntu.com/community/TFTP +[5]: https://lancesimms.com/RaspberryPi/HackingRaspberryPi4WithYocto_Part1.html +[6]: https://www.raspberrypi.org/documentation/installation/installing-images/#:~:text=Using%20Raspberry%20Pi%20Imager,Pi%20Imager%20and%20install%20it +[7]: https://en.opensuse.org/HCL:Raspberry_Pi4 +[8]: https://wiki.xenproject.org/wiki/ImageBuilder +[9]: https://www.lfedge.org/projects/eve/ diff --git a/sources/tech/20201001 Akraino- An Open Source Project for the Edge.md b/sources/tech/20201001 Akraino- An Open Source Project for the Edge.md new file mode 100644 index 0000000000..9fa671bed6 --- /dev/null +++ b/sources/tech/20201001 Akraino- An Open Source Project for the Edge.md @@ -0,0 +1,63 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Akraino: An Open Source Project for the Edge) +[#]: via: (https://www.linux.com/news/akraino-an-open-source-project-for-the-edge/) +[#]: author: (Swapnil Bhartiya https://www.linux.com/author/swapnil/) + +Akraino: An Open Source Project for the Edge +====== + +Akraino is an open-source project designed for the Edge community to easily integrate open source components into their stack. It’s a set of open infrastructures and application blueprints spanning a broad variety of use cases, including 5G, AI, Edge IaaS/PaaS, IoT, for both provider and enterprise Edge domains. We sat down with Tina Tsou, TSC Co-Chair of the Akraino project to learn more about it and its community. + +Here is a lightly edited transcript of the interview: + +Swapnil Bhartiya: Today, we have with us Tina Tsou, TSC Co-Chair of the Akraino project. Tell us a bit about the Akraino project. + +Tina Tsou: Yeah, I think Akraino is an Edge Stack project under Linux Foundation Edge. Before Akraino, the developers had to go to the upstream community to download the upstream software components and integrate in-store to test. With the blueprint ideas and concept, the developers can directly do the use-case base to blueprint, do all the integration, and [have it] ready for the end-to-end deployment for Edge. + +Swapnil Bhartiya: The blueprints are the critical piece of it. What are these blueprints and how do they integrate with the whole framework? + +Tina Tsou: Based on the certain use case, we do the community CI/CD ( continuous integration and continuous deployment). We also have proven security requirements. We do the community lab and we also do the life cycle management. And then we do the production quality, which is deployment-ready. + +Swapnil Bhartiya: Can you explain what the Edge computing framework looks like? + +Tina Tsou: We have four segments: Cloud, Telco, IoT, and Enterprise. When we do the framework, it’s like we have a framework of the Edge compute in general, but for each segment, they are slightly different. You will see in the lower level, you have the network, you have the gateway, you have the switches. In the upper of it, you have all kinds of FPGA and then the data plan. Then, you have the controllers and orchestration, like the Kubernetes stuff and all kinds of applications running on bare metal, virtual machines or the containers. By the way, we also have the orchestration on the site. + +Swapnil Bhartiya: And how many blueprints are there? Can you talk about it more specifically? +Tina Tsou: I think we have around 20-ish blueprints, but they are converged into blueprint families. We have a blueprint family for telco appliances, including Radio Edge Cloud, and SEBA that has enabled broadband access. We also have a blueprint for Network Cloud. We have a blueprint for Integrated Edge Cloud. We have a blueprint for Edge Lite IoT. So, in this case, the different blueprints in the same blueprint family can share the same software framework, which saves a lot of time. That means we can deploy it at a large scale. + +Swapnil Bhartiya: The software components, which you already talked about in each blueprint, are they all in the Edge project or there are some components from external projects as well? + +Tina Tsou: We have the philosophy of upstream first. If we can find it from the upstream community, we just directly take it from the upstream community and install and integrate it. If we find something that we need, we go to the upstream community to see whether it can be changed or updated there. + +Swapnil Bhartiya: How challenging or easy it is to integrate these components together, to build the stack? + +Tina Tsou: It depends on which group and family we are talking about. I think most of them at the middle level of middle are not too easy, not too complex. But the reference has to create the installation, like the YAML files configuration and for builds on ISO images, some parts may be more complex and some parts will be easy to download and integrate. + +Swapnil Bhartiya: We have talked about the project. I want to talk about the community. So first of all, tell us what is the role of TSC? + +Tina Tsou: We have a whole bunch of documentation on how TSA runs if you want to read. I think the role for TSC is more tactical steering. We have a chair and co-chair, and there are like 6-7 subcommittees for specific topics like security, technical community, CI and documentation process. + +Swapnil Bhartiya: What kind of community is there around the Akraino project? + +Tina Tsou: I think we have a pretty diverse community. We have the end-users like the telcos and the hyperscalers, the internet companies, and also enterprise companies. Then we have the OEM/ODM vendors, the chip makers or the SoC makers. Then have the IP companies and even some universities. + +Swapnil Bhartiya: Tina, thank you so much for taking the time today to explain the Akraino project and also about the blueprints, the community, and the roadmap for the project. I look forward to seeing you again to get more updates about the project. + +Tina Tsou: Thank you for your time. I appreciate it. +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/akraino-an-open-source-project-for-the-edge/ + +作者:[Swapnil Bhartiya][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/swapnil/ +[b]: https://github.com/lujun9972 diff --git a/sources/tech/20201001 Bringing COBOL to the Modern World.md b/sources/tech/20201001 Bringing COBOL to the Modern World.md new file mode 100644 index 0000000000..2eeb097f65 --- /dev/null +++ b/sources/tech/20201001 Bringing COBOL to the Modern World.md @@ -0,0 +1,101 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Bringing COBOL to the Modern World) +[#]: via: (https://www.linux.com/news/bringing-cobol-to-the-modern-world/) +[#]: author: (Swapnil Bhartiya https://www.linux.com/author/swapnil/) + +Bringing COBOL to the Modern World +====== + +COBOL is powering most of the critical infrastructure that involves any kind of monetary transaction. In this special interview conducted during the recent Open Mainframe Summit, we talked about the relevance of COBOL today and the role of the new COBOL working group that was announced at the summit. Joining us were Cameron Seay, Adjunct Professor at East Carolina University and Derek Lisinski of the Application Modernizing Group at Micro Focus. Micro Focus recently joined the Open Mainframe Project and is now also involved with the working group. + +Here is an edited version of the discussion: + +Swapnil Bhartiya: First of all, Cam and Derek, welcome to the show. If you look at COBOL, it’s very old technology. Who is still using COBOL today? Cam, I would like to hear your insight first. + +Cameron Seay: Every large commercial bank I know of uses COBOL. Every large insurance company, every large federal agency, every large retailer uses COBOL to some degree, and it processes a large percentage of the world’s financial transactions. For example, if you go to Walmart and you make a sale, that transaction is probably recorded using a COBOL program. So, it’s used a lot, a large percentage of the global business is still done in COBOL. + +Swapnil Bhartiya: Micro Focus is I think one of the few companies that offer support around COBOL. Derek, please tell people the importance of COBOL in today’s modern world. + +Derek Lisinski: Well, if we go back in time, there weren’t that many choices on the market. If you wanted robust technology to build your business systems, COBOL was one of the very few choices and so it’s surprising when there are so many choices around today and yet, many of the world’s largest industries, largest organizations still rely on COBOL. If COBOL wasn’t being used, so many of those systems that people trust and rely on — whether you’re moving money around, whether you’re running someone’s payroll, whether you’re getting insurance quotation, shipping a parcel, booking a holiday. All of these things are happening with COVID at the backend and the value you’re getting from that is not just that it’s carried on, but it runs with the same results again and again and again, without fail. + +The importance of COBOL is not just its pervasiveness, which I think is significant and perhaps not that well understood, but also it’s reliability. And because it’s welded very closely to the mainframe environments and to CICS and some other core elements of the mainframe and other platforms as well. It uses and trusts a lot of technology that is unrivaled in terms of its reliability, scalability and its performance. That’s why it remains so important to the global economy and to so many industries. It does what it needs to do, which is business processing, so fantastically well. + +Swapnil Bhartiya: Excellent, thanks for talking about that. Now, you guys recently joined the project and the foundation as well, so talk about why you joined the Open Mainframe Project and what are the projects that you will be involved with, of course. I know you’re involved with the working group, but talk about your involvement with the project. + +Derek Lisinski: Well, our initial interest with the Open Mainframe Project goes back a couple of years. We’re longtime proponents of the mainframe platform, of course, here at Micro Focus. We’ve had a range of technologies that run on z/OS. But our interest in the wider mainframe community—and that would be the Open Mainframe Project—probably comes as a result of the time we’ve spent with the SHARE community and other IBM-sponsored communities, where the discussion was about the best way to embrace this trusted technology in the digital era. This is becoming a very topical conversation and that’s also true for COBOL, which I’m sure we’ll come back to. + +Our interest in the OMP has been going on for the last couple of years and we were finally able to reach an agreement between both organizations to join the group this year, specifically because of a number of initiatives that we have going on at Micro Focus and that a number of our customers have talked to us about specifically in the area of mainframe DevOps. As vital as the mainframe platform is, there’s a growing desire to use it to deliver greater and greater value to the business, which typically means trying to accelerate delivery cycles and get more done. + +Of course, now the mainframe is so inextricably connected with other parts of the IT ecosystem that those points of connection and the number of moving parts have to be handled, integrated with, and managed as part of a delivery process. It’s an important part of our customers’ roadmap and, therefore, our roadmap to ensure that they get the very best of technology in the mainframe world. Whether it’s tried-and-trusted technology, whether it’s new emerging vendor technology, or whether in many cases, it becomes open source technology. We wanted to play our part in those kinds of projects and a number of initiatives around. + +Swapnil Bhartiya: Is there an increase in interest in COBOL that we are seeing there now that there is a dedicated working group? And if you can also talk a bit about what will be the role of this group. + +Cameron Seay: If your question was, is there an increased interest in working in COBOL because of the working group, the working group actually came as a result of a renewed interest in the written new discovery in COBOL. The governor of New Jersey made a comment that their unemployment was not able to be processed because of COBOL’s obsolescence, or inefficiency, or inadequacy to some degree. And that sparked quite a furor in the mainframe world because it wasn’t COBOL at all. COBOL had nothing to do with the inability of New Jersey to deliver the unemployment checks. Further, we’re aware that New Jersey is just typical of every state. Every state that I know of—there may be some exceptions I’m not aware of, I know it’s certainly true for California and New York—is dependent upon COBOL to process their day-to-day business applications. + +So, then Derek and some other people inside the OMP got together and started having some conversations, myself included, and said “We maybe need to form a COBOL working group to renew this interest in COBOL and establish the facts around COBOL.” So that’s kind of what the working group is trying to do, and we’re trying to increase that familiarity, visibility and interest in COBOL. + +Swapnil Bhartiya: Derek, I want to bring the same question to you also. Is there any particular reason that we are seeing an increase in interest in COBOL and what is that reason? + +Derek Lisinski: Yeah, that’s a great question and I think there are a few reasons. First of all, I think a really important milestone for COBOL was actually last year when it turned 60 years old. I think one of your earlier questions is related to COBOL’s age being 60. Of course, COBOL isn’t a 60-year-old language but the idea is 60 years old, for sure. If you drive a 2020 motor car, you’re driving a 2020 motor car, you’re not driving a hundred-year-old idea. No one thinks a modern telephone is an old idea, either. It’s not old technology, sorry. +The idea might’ve been from a long time ago, but the technology has advanced, and the same thing is true in code. But when we celebrated COBOL’s 60th anniversary last year—a few of the vendors did and a number of organizations did, too—there was an outpouring of interest in the technology. A lot of times, COBOL just quietly goes about its business of running the world’s economy without any fuss. Like I said, it’s very, very reliable and it never really breaks. So, it was never anything to talk about. People were sort of pleasantly surprised, I think, to learn of its age, to learn of the age of the idea. Now, of course, Micro Focus and IBM and some of the other vendors continue to update and adapt COBOL so that it continues to evolve and be relevant today. + +It’s actually a 2020 technology rather than a 1960 one, but that was the first one. Secondly, the pandemic caused a lot of businesses to have to change how they process core systems and how they interact with their customers. That put extra strain on certain organizations or certain government agencies and, in a couple of cases, COBOL was incorrectly made the scapegoat for some of the challenges that those organizations face, whether it was a skills issue or whether it was a technology issue. Under the cover, COBOL was working just fine. So the interest has been positive regarding the anniversary, but I think the reports have been inaccurate and perhaps a little unkind about COBOL. Those were the two reasons they came together. + +I remember when I first spoke to Cam and to some of the other people on the working group, you said it was a very good idea once and for all that we told the truth about COBOL, that the industry finally understood how viable it is, how valuable it is, based on the facts behind COBOL’s usage. So one of the things we’re going to do is try to quantify and qualify as best we can, how widely COBOL is used, what do you use it for, who is using, and then present a more factual story about the technology so people can make a more informed decision about technical strategy. Rather than base it on hearsay or some reputation about something being a bit rusty and out-of-date, which is probably the reputation that’s being espoused by someone who would have you replace it with something else, and their motivation might be for different reasons. There’s nothing wrong with COBOL and it’s very, very viable and our job I think really is to tell that truth and make sure people understand it, + +Swapnil Bhartiya: What other projects, efforts, or initiatives are going on there at the Linux Foundation or Open Mainframe Project around COBOL? Can you talk about that? + +Cameron Seay: Well, certainly. There is currently a course being developed by folks in the community who have developed an online course in COBOL. It’s the rudiments of it. It’s for novices, but it’s great for a continuing education program. So, that’s one of the things going on around COBOL. Another thing is there’s a lot going on in mainframe development in the OMP now. There’s an application framework that has been developed called Zoe that will allow you to develop applications for z/OS. It’s interesting that the focus of the Open Mainframe Project when it first began was Linux on the mainframe, but actually the first real project that came out of it was a z/OS-based product, Zoe, and so we’re interested in that, too. Those are just a couple of peripheral projects that the COBOL working group is going to work with. + +There are other things we want to do from a curriculum standpoint down the road, but fundamentally, we just want to be a fact-finding, fact-gathering operation first, and Derek Lisinski has been taking leadership and putting together a substantial reference list so that we can get the facts about COBOL. Then, we’re going to do other things, but that we want to get that right first. + +Swapnil Bhartiya: So there are as you mentioned a couple of projects. Is there any overlap between these projects or how different they are? Do they all serve a different purpose? It looks like when you’re explaining the goal and role of the working group, it sounds like it’s also the training or education group with the same kind of activities. Let me rephrase it properly: what are some of the pressing needs you see for the COBOL community, how are these efforts/groups are trying to help them, and how are they not overlapping or stepping on each other’s toes? + +Cameron Seay: That’s an ongoing thing. Susharshna and I really work hard to make sure that we’re not working at either across purposes or there’s duplication of effort. We’re kind of clear about our roles. For the world at large, for the public at large, the working group—and Derek may have a different view on this because we all don’t think alike, we all don’t see this thing exactly the same—but I see it as information first. We want people to get accurate current information about COBOL. + +Then, we want to provide some vehicle that COBOL can be reintroduced back into the general academic curriculum because it used to be. I studied COBOL at a four-year university. Most people did when they took programming in the ’80s and the ’90s, they took COBOL, but that’s not true anymore. Our COBOL course at East Carolina this semester is the only COBOL course in the entire USC system. That’s got to change. So information, exposure, accurate information exposure, and some kind of return to the general curriculum, those are the three things that we we can provide to the community at large. + +Swapnil Bhartiya: If you look at Micro Focus, you are working in the industry, you are actually solving the problem for your customers. What role do these groups or other efforts that are going on there play for the whole ecosystem? + +Derek Lisinski: Well, I think if we go back to Cam’s answer, I think he’s absolutely right that the industry, if you project forward another generation in 25 years’ time who are going to be managing these core business systems that currently still need to run the world’s largest organizations. I know we’re in a digital era and I know that things are changing at an unprecedented pace, but most of the world’s largest organizations, successful organizations still want to be in those positions in generations to come. So who is it? Who are those practitioners that are coming through the education system right now, who are going to be leaders in those organizations’ IT departments in the future? + +And there is a concern not just for COBOL, but actually, many IT skills across the board. Is there going to be enough talent to actually run the organizations of the future? And that’s true, it’s a true question mark about COBOL. So Micro Focus, which has its own academic initiative and its own training program as does IBM as do many of the other vendors, we all applaud the work of all community groups. The OMP is obviously a fabulous example because it is genuinely an open group. Genuinely, it’s a meritocracy of people with good ideas coming together to try to do the right thing. We applaud the efforts to ensure that there continues to be enough supply of talented IT professionals in the future to meet the growing and growing demand. IT is not going away. It’s going to become strategically more and more important to these organizations. + +Our part to play in Micro Focus is really to work shoulder-to-shoulder with organizations like the OMP because between us, we will create enough groundswell of training and opportunity for that next generation. Many people will tell you there just isn’t enough of that training going on and there aren’t enough of those opportunities available, even though one survey that Micro Focus ran last year on the back of the COBOL’s 60th anniversary suggests that around 92% of all application owners of COBOL systems confirmed that those applications remain strategic to their organization. So, if the applications are not going anywhere, who’s going to be looking after them in the next generation? And that’s the real challenge that I think the industry faces as a whole, which is why Micro Focus is so committed to get behind the wheel of making sure that we can make a difference. + +Swapnil Bhartiya: We discussed that the interest in COBOL is increasing as COBOL is playing a very critical role in the modern economy. What kind of future do you see for COBOL and where do you see it going? I mean, it’s been around for 60 years, so it knows how to survive through times. Still, where do you see it go? Cam, I would love to start with you. + +Cameron Seay: Yeah, absolutely. We are trying to estimate how much COBOL is actually in use. That estimate is running into hundreds of billions of lines of code. I know that, for example, Bank of America admits to at least 50 million lines of COBOL code. That’s a lot of COBOL, and you’re not going to replace it over time, there’s no reason to. So the solution to this problem, and this is what we’re going to do, is we’re going to figure out a way to teach people COBOL. It’s not a complex language to learn. Any organization that sees lack of COBOL skills as an impediment and justification to move to another platform is [employing] a ridiculous solution, that solution is not feasible. If they try to do that, they’re going to fail because there’s too much risk and, most of all, too much expense. + +So, we’re going to figure out a way to begin to teach people COBOL again. I do it, a COBOL class at East Carolina. That is a solution to this problem because the code’s not going anywhere nor is there a reason for it to go anywhere, it works! It’s a simple language, it’s as fast as it needs to be, it’s as secure as it needs to be, and no one that I’ve talked to, computer scientists all over the world, no one can give me any application, that any language is going to work better than COBOL. There may be some that work as good or nearly as good, but you’re going to have to migrate them, but there’s nothing, there’s no improvement that you can make on these applications from a performance standpoint and from a security standpoint. The applications are going to stay where they are, and we’re just going to have to teach people COBOL. That’s the solution, that’s what’s going to happen. How and when, I don’t know, but that’s what’s going to happen. + +Swapnil Bhartiya: If you look at the crisis that we were going through, almost everything, every business is moving online to the cloud. All those transactions that people are already doing in person are all moving online, so it has become critical. From your perspective, what kind of future do you see? + +Derek Lisinski: Well, that’s a great question because the world is a very, very different place to how architecture was designed however long ago. Companies of today are not using that architecture. So there is some question mark there about what’s COBOL’s future. I agree with Cam. Anyone that has COBOL is not necessarily going to be able to throw that away anytime soon because, frankly, it might be difficult. It might be easy, but that’s not really the question, is it? Is it a good business decision? The answer is it’s a terrible business decision to throw it away. + +In addition to that, I would contend that there are a number of modern-day digital use cases where actually the usage of COBOL is going to increase rather than decrease. We see this all the time with our larger organizations who are using it for pretty much the whole of the backend of their core business. So, whether it’s a banking organization or an insurer or a logistics company, what they’re trying to do obviously is find new and exciting business opportunities. + +But, upon which they will be basing their core business systems that already run most of the business today, and then trying to use that to adapt, to enhance, to innovate. There are insurers who are selling the insurance quotation system to other smaller insurances as a service. Now, of course, their insurance quotation system is probably the version that isn’t quite as quick as the one that runs on their mainframe, but they’re making that available as a service to other organizations. Banking organizations are doing much the same thing with a range of banking services, maybe payment systems. These are all services that can be provided to other organizations. + +The same is true in the ISB market where really, really robust COBOL-based financial services, packages, ERP systems, which are COBOL based, and they have been made available as cloud-based as-a-service packages or upon other platforms to meet new market needs. The thing about COBOL that few people understand is not only is it easy to learn, but it’s easy to move to somewhere else. So, if your client is now running Linux and it says, “Well, now I want it to run these core COBOL business systems there, too.” Well, maybe they’ve taken a move to AIX to a Power system, but the same COBOL system can be reused, replicated as necessary, which is a little known secret about the language. + +This goes back to the original design, of course. Back in the day, there was no such thing as the “standard platform” in 1960. There wasn’t a single platform that you could reasonably rely on that would give you a decent answer, not very quickly anyway. So, in order for us to know that COBOL works, we have to have the same results compiled about running on different machines. It needs to be the same result running at the same speed, and from that point, that’s when the portability of the system came to life. That’s what they set out to do, built that way by design. + +Swapnil Bhartiya: Cam, Derek, thank you so much for taking the time out today to talk about COBOL, how important it is in today’s world. I’m pretty sure that when we spend our whole day, some of the activities that we have done online touch COBOL or are powered by COBOL. +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/bringing-cobol-to-the-modern-world/ + +作者:[Swapnil Bhartiya][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.linux.com/author/swapnil/ +[b]: https://github.com/lujun9972 diff --git a/sources/tech/20201006 5 Scratch code blocks to teach kids how to program a video game.md b/sources/tech/20201006 5 Scratch code blocks to teach kids how to program a video game.md new file mode 100644 index 0000000000..e8c825d5e7 --- /dev/null +++ b/sources/tech/20201006 5 Scratch code blocks to teach kids how to program a video game.md @@ -0,0 +1,165 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (5 Scratch code blocks to teach kids how to program a video game) +[#]: via: (https://opensource.com/article/20/10/advanced-scratch) +[#]: author: (Jess Weichler https://opensource.com/users/cyanide-cupcake) + +5 Scratch code blocks to teach kids how to program a video game +====== +Advance your Scratch skills with loops, conditional statements, +collision detection, and more in this article in a series about teaching +kids to code. +![Binary code on a computer screen][1] + +In the second article in this series, you [created your first few video game scripts in Scratch][2]. This article explores ways to expand programming's possibilities to create more advanced code. + +There are multiple ways to introduce these skills to kids, such as: + + 1. Introduce a task or challenge that requires children to use the skill. Use inquiry to help them find the solution, then reinforce their discoveries with a formal explanation. + 2. Encourage free experimentation by having children come up with their own projects. As they work through their code, go over skills as needed. + 3. Introduce the skill, then have children experiment with it. + + + +No matter which one you choose, always remember that the most important part of learning coding is making mistakes. Even skilled programmers don't get it right every time or know every possible line of code. It works best when educators, pupils, and peers are all learning to code together as a team. + +There are [10 categories][3] of code blocks in Scratch; here is how to use some of the most common. + +### Loops + +_This is the code that doesn't end; yes, it goes on and on, my friend!_ **Forever loops** and **repeat blocks** in [Scratch][4] are what you need to repeat lines of code automatically. Any code blocks placed inside a loop block continue to run until the game is stopped or, if you're using a repeat block, the number is reached. + +![Loops in Scratch][5] + +(Jess Weichler, [CC BY-SA 4.0][6]) + +### Conditional statements + +**Conditional statements** run only if certain conditions are met. "If you're cold, then put on a sweater" is a real-world example of a conditional statement: you put a sweater on only if you determine that it's cold. + +There are four conditional statement code blocks in Scratch: + + * if ... then  + * if ... then ... else  + * wait until...  + * repeat until...  + + + +Any code blocks placed inside a conditional statement run only if the condition is met. + +![Conditional statement blocks in Scratch][7] + +(Jess Weichler, [CC BY-SA 4.0][6]) + +Notice the diamond shapes in each conditional statement code block; can you find any code blocks that might fit inside? + +Diamond-shaped code blocks can be used to complete any of the four conditional-statement blocks. You can find diamond-shaped blocks in the [Sensing][8] and [Operators][9] block categories. + +![Diamond-shaped blocks in Scratch][10] + +(Jess Weichler, [CC BY-SA 4.0][6]) + +### Collision-detection loop + +Sometimes you may want to check to see if your sprite is touching another sprite or a specific color. To do so, use a [**collision-detection loop**][11]. + +A collision-detection loop combines loops and conditional statements to constantly check whether the sprite is touching another sprite (for example, a coin sprite). + +![Collision-detection script in Scratch][12] + +(Jess Weichler, [CC BY-SA 4.0][6]) + +Inside the inner `if ... then` block, place the action you want to happen when the condition is met. + +This type of algorithm is a **collision-detection script**. Collision-detection scripts sense when two sprites or objects are touching. A basic collision-detection script uses four main code blocks: + + * Event hat + * Forever loop + * If … then + * Touching + + + +You can place more code blocks inside the `if ... then` block. These blocks will run only if the active sprite is touching the sprite listed in the `touching` block. + +Can you figure out how to make an object "hide" when it collides with another sprite? This is a common technique to indicate that, for instance, a sprite has eaten some food or has picked up an item. + +### Variables and math + +A **variable** is a placeholder for a value, usually a number, that you don't know yet. In math, using a variable might look something like this: `x+12=15`. + +![Variables in Scratch][13] + +(Jess Weichler, [CC BY-SA 4.0][6]) + +If that doesn't make sense to you, that's okay. I didn't understand variables until I started coding as an adult. + +Here is one example of how you might use a variable in code: + +![Variables in Scratch][14] + +(Jess Weichler, [CC BY-SA 4.0][6]) + +### Coordinates + +Scratch uses a coordinate graph to measure the screen. The exact middle of the screen has a value of 0,0. The length of the screen (X-axis) is -240 to 240, the height (Y-axis) is -180 to 180. + +The X and Y **coordinates** control where each sprite is on the screen, and you can code a sprite's X and Y coordinates to set a specific place using **[motion blocks][15]**. + +![Coordinates in Scratch][16] + +(Jess Weichler, [CC BY-SA 4.0][6]) + +### Put it all together + +Think about the basics of any game; what are some elements you usually need? + +Here are some examples: + + * A goal + * A way to win + * A way to lose + * An obstacle + * A scoring system + + + +With the techniques above, you have everything you need to create a playable game with these elements and more. + +There are still heaps of code blocks in Scratch that I haven't mentioned. Keep exploring the possibilities. If you don't know what a code block does, put it in a script to see what happens! + +Coming up with an idea for a game can be difficult. The great thing about the open source community, Scratchers included, is that we love to build upon one another's work. With that in mind, in the next article, I'll look at some of my favorite user-made projects for inspiration. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/advanced-scratch + +作者:[Jess Weichler][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cyanide-cupcake +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/binary_code_computer_screen.png?itok=7IzHK1nn (Binary code on a computer screen) +[2]: https://opensource.com/article/20/9/scratch +[3]: https://en.scratch-wiki.info/wiki/Categories +[4]: https://scratch.mit.edu/ +[5]: https://opensource.com/sites/default/files/uploads/codekids3_1.png (Loops in Scratch) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://opensource.com/sites/default/files/uploads/codekids3_2.png (Conditional statement blocks in Scratch) +[8]: https://en.scratch-wiki.info/wiki/Blocks#Sensing_blocks +[9]: https://en.scratch-wiki.info/wiki/Blocks#Operators_blocks +[10]: https://opensource.com/sites/default/files/uploads/codekids3_3.png (Diamond-shaped blocks in Scratch) +[11]: https://en.scratch-wiki.info/wiki/Making_Sprites_Detect_and_Sense_Other_Sprites +[12]: https://opensource.com/sites/default/files/uploads/codekids3_4.png (Collision-detection script in Scratch) +[13]: https://opensource.com/sites/default/files/uploads/codekids3_5.png (Variables in Scratch) +[14]: https://opensource.com/sites/default/files/uploads/codekids3_6.png (Variables in Scratch) +[15]: https://en.scratch-wiki.info/wiki/Motion_Blocks +[16]: https://opensource.com/sites/default/files/uploads/codekids3_7.png (Coordinates in Scratch) diff --git a/sources/tech/20201007 Design and document APIs using an open source cross-platform tool.md b/sources/tech/20201007 Design and document APIs using an open source cross-platform tool.md new file mode 100644 index 0000000000..196df6ac22 --- /dev/null +++ b/sources/tech/20201007 Design and document APIs using an open source cross-platform tool.md @@ -0,0 +1,199 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Design and document APIs using an open source cross-platform tool) +[#]: via: (https://opensource.com/article/20/10/spec-first-development-apis) +[#]: author: (Greg Schier https://opensource.com/users/gregschier) + +Design and document APIs using an open source cross-platform tool +====== +Insomnia Designer makes spec-first development more accessible by +providing collaborative tools to organize, maintain, and validate API +specs. +![Computer laptop in space][1] + +In the world of software-as-a-service (SaaS) and service-based architectures, it's not uncommon for companies to maintain dozens or even hundreds of APIs, often spanning multiple teams, programming languages, and environments. This variability makes it extremely difficult to see what's happening at a high level to prevent changes from having negative impacts. + +It's estimated that 40% of large enterprises struggle with challenges to secure, scale, or ensure performance for APIs. Because of this, more and more companies are choosing to adopt a "spec-first development" approach by defining and documenting APIs in an external format like [OpenAPI][2]. Storing these documents together in a central location makes it much easier to design, discuss, and approve changes _before_ implementation. + +In this tutorial, you'll use the recently released [Insomnia Designer][3] to document an API, explore it, and propose a change using a spec-first approach. Designer is a cross-platform, open source REST client that builds on top of Insomnia Core—a popular app for interacting with HTTP and GraphQL APIs—aiming to make spec-first development more accessible by providing collaborative tools to organize, maintain, and validate API specs. In essence, Core is best for exploring and debugging APIs while Designer is best for designing and documenting them. + +In this how-to, you'll use the [Open Library API][4] as a base to have working examples to play with. You'll create a minimal OpenAPI spec to document the APIs, use Insomnia Designer to test and verify that what you've done is correct, and then make some design changes to the API using a spec-first approach. + +### The spec-first workflow + +Before you begin, you should understand the steps necessary to adopt a spec-first workflow. In spec-first development, a specification can be in one of two states: + + * **Published spec:** A specification that describes a currently published API exactly + * **Proposal spec:** A draft specification that contains changes that need to be implemented + + + +From this information, you can define a workflow for making changes to an API: + + 1. Start with the published specification for the API + 2. Make changes to the specification to add or modify behavior + 3. Review the proposal spec to ensure the design is sufficient + 4. Implement changes in code to match the proposal + 5. Publish the proposal spec along with the API + + + +Now that you understand the workflow for what you are trying to accomplish, open Insomnia Designer and start trying it out. + +### Define the initial specification + +Since you don't yet have a published specification for the Open Library API, you need to define one. + +Start by creating a new blank document from the **Create** menu, give it a name, then click to the document to enter **Design View**. From here, you can start editing your spec. + +![Create a new document][5] + +(Greg Schier, [CC BY-SA 4.0][6]) + +The OpenAPI spec is most commonly written in [YAML][7] format and requires four top-level blocks to get started: `openapi`, `info`, `servers`, and `paths`. The following example defines each of these blocks with helpful comments to describe the purpose of each. Also, the `paths` block defines a route for `GET /recentchanges.json`: + + +``` +# Specify that your document is the OpenAPI 3 format +openapi: 3.0.0 + +# Define high-level metadata for the API +info: +  version: 1.0.0 +  title: Open Library API +  description: Open Library has a RESTful API +  +# Specify the base URL the API can be accessed from +servers: +  - url: + +# Define operations for the API. This will be where most +# of the work is done. The first route you'll be defining +# is `GET /recentchanges.json` +paths: +  /recentchanges.json: +    get: +      summary: Recent Changes +``` + +OpenAPI provides much more than what's visible here, such as the ability to define authentication, response formats, reusable components, and more. + +After copying the specification above into Insomnia Designer, you'll see three columns: + + 1. **Navigation sidebar (left):** Nested menu to make navigating larger documents easier + 2. **Spec editor (middle):** Text editor for editing the YAML document + 3. **Documentation preview:** Generated documentation to preview the specification + + + +![Insomnia Designer UI with three columns][8] + +(Greg Schier, [CC BY-SA 4.0][6]) + +Feel free to modify different parts of the specification to see what happens. As a safeguard, Insomnia Designer alerts you when you've done something wrong. For example, if you accidentally delete the colon on line 18, an error panel will display below the editor. + +![Insomnia Designer UI error message][9] + +(Greg Schier, [CC BY-SA 4.0][6]) + +Now that you have defined a specification, you can verify that your definition is correct by switching to **Debug** mode and sending a real request to the API. In Debug mode, you can see a single route was generated for the `GET /recentchanges.json` endpoint. Click the **Send** button beside the URL to execute the request and render the response in the right panel. + +![Checking response in Insomnia Designer][10] + +(Greg Schier, [CC BY-SA 4.0][6]) + +There you have it! You've successfully verified that the API specification you created matches the production API. Now you can move to the next step in the spec-first development workflow and propose a change. + +### Create a proposal specification + +According to the workflow outlined above, changes made to your API should first be defined in the specification. This has a number of benefits: + + * Specifications can be checked into a central source-code repository + * Changes are easy to review and approve + * APIs are defined in a single, consistent format + * Unnecessary code changes are avoided + + + +Go ahead and propose a change to your API. While in Debug mode, I noticed the API returned hundreds of results. To improve performance and usability, it would be useful to limit the number of results returned to a specific amount. A common way of doing this is to accept a `limit` parameter in the query section of the URL, so go ahead and modify your specification to add a `limit` parameter. + +In OpenAPI, you can define this by adding a `parameters` block to the route**:** + + +``` +# ... +paths: +  /recentchanges.json: +    get: +      summary: Recent Changes +      +      # Add parameter to limit the number of results +      parameters: +        - name: limit +          in: query +          description: Limit number of results +          required: true +          schema: +            type: integer +            example: 1 +``` + +You can verify you defined it correctly by expanding the route within the preview and inspecting the parameters. + +![Verifying spec definition in Insomnia][11] + +(Greg Schier, [CC BY-SA 4.0][6]) + +### Review and implement the proposal + +Now that you have created a proposal spec, you can have your team review and approve the changes. Insomnia Designer provides the ability to [sync API specifications to source control][12], allowing teams to review and approve changes to API specs the same way they do with source code. + +For example, you might commit and push your proposed spec to a new branch in GitHub and create a pull request to await approval. + +Because this is a tutorial on spec-first development, you won't implement the proposal yourself. The parameter you added is already supported by the API, however, so for the purpose of this article, use your imagination and pretend that your team has implemented the change. + +### Verify the updated specification + +Once the proposal has been implemented and deployed, you can switch to Debug mode, which will regenerate the requests based on your changes, and again verify that the spec matches the production API. To ensure the new query param is being sent, click the **Query** tab within Debug mode and observe that the `limit` parameter is set to your example value of `1`. + +Once you send the request, you can verify that it returns only a single result. Change the `limit` to a different value or disable the query parameter (using the checkbox) to further verify things work as expected. + +![Verifying things work as expected in Insomnia Designer][13] + +(Greg Schier, [CC BY-SA 4.0][6]) + +### The power of spec-first development + +This tutorial walked through a simplified example of spec-first development. In it, you created an OpenAPI specification, verified the specification matched the implementation, and simulated what it's like to propose a behavior change. + +For a single API as simple as this demo, it may be difficult to see the full benefit of spec-first development. However, imagine being a product owner in a large organization managing hundreds of production APIs. Having well-documented specifications, accessible from a central location like Insomnia Designer, allows anyone within the organization to quickly get up to speed on any API. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/spec-first-development-apis + +作者:[Greg Schier][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/gregschier +[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://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md +[3]: https://insomnia.rest/products/designer +[4]: https://openlibrary.org/developers/api +[5]: https://opensource.com/sites/default/files/uploads/insomnia_newdocument.png (Create a new document) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://yaml.org/ +[8]: https://opensource.com/sites/default/files/uploads/insomnia_columns.png (Insomnia Designer UI with three columns) +[9]: https://opensource.com/sites/default/files/uploads/insomnia_error.png (Insomnia Designer UI error message) +[10]: https://opensource.com/sites/default/files/uploads/insomnia_response.png (Checking response in Insomnia Designer) +[11]: https://opensource.com/sites/default/files/uploads/insomnia_verifydefinition.png (Verifying spec definition in Insomnia) +[12]: https://support.insomnia.rest/article/96-git-sync +[13]: https://opensource.com/sites/default/files/uploads/insomnia_limit.png (Verifying things work as expected in Insomnia Designer) diff --git a/sources/tech/20201008 Protect your network with open source tools.md b/sources/tech/20201008 Protect your network with open source tools.md new file mode 100644 index 0000000000..44ab5e3216 --- /dev/null +++ b/sources/tech/20201008 Protect your network with open source tools.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Protect your network with open source tools) +[#]: via: (https://opensource.com/article/20/10/apache-security-tools) +[#]: author: (Chantale Benoit https://opensource.com/users/chantalebenoit) + +Protect your network with open source tools +====== +Apache Syncope and Metron can help you secure your network against +unauthorized access and data loss. +![A lock on the side of a building][1] + +System integrity is essential, especially when you're charged with safeguarding other people's personal details on your network. It's critical that system administrators are familiar with security tools, whether their purview is a home, a small business, or an organization with hundreds or thousands of employees. + +### How cybersecurity works + +Cybersecurity involves securing networks against unauthorized access. However, there are many attack vectors out there that most people don't consider. The cliché of a lone hacker manually dueling with firewall rules until they gain access to a network is popular—but wildly inaccurate. Security breaches happen through automation, malware, phishing, ransomware, and more. You can't directly fight every attack as it happens, and you can't count on every computer user to exercise common sense. Therefore, you have to design a system that resists intrusion and protects users against outside attacks as much as it protects them from their own mistakes. + +The advantage of open source security tools is that they keep vulnerabilities transparent. They give full visibility into their codebase and are supported by a global community of experts working together to create strong, tried-and-tested code. + +With so many domains needing protection, there's no single cybersecurity solution that fits every situation, but here are two that you should consider. + +### Apache Syncope + +[Apache Syncope][2] is an open source system for managing digital identities in an enterprise environment. From focusing on identity lifecycle management and identity storage to provisioning engines and accessing management capabilities, Apache Syncope is a comprehensive identity management solution. It also provides monitoring and security features for third-party applications. + +Apache Syncope synchronizes users, groups, and other objects. _Users_ represent the buildup of virtual identities and account information fragmented across external resources. _Groups_ are entities on external resources that support the concept of LDAP or Active Directory. _Objects_ are entities such as printers, services, and sensors. It also does full reconciliation and live synchronization from external resources with workflow-based approval. + +#### Third-party applications + +Apache Syncope also exposes a fully compliant [JAX-RS][3] 2.0 [RESTful][4] interface to enable third-party applications written in any programming language. These applications consume identity management services, such as: + + * **Logic:** Syncope implements business logic that can be triggered through REST services and controls additional features such as notifications, reports, and auditing. + * **Provisioning:** It manages the internal and external representation of users, groups, and objects through workflow and specific connectors. + * **Workflow:** Syncope supports Activiti or Flowable [business process management (BPM)][5] workflow engines and allows defining new and custom workflows when needed. + * **Persistence:** It manages all data, such as users, groups, attributes, and resources, at a high level using a standard [JPA 2.0][6] approach. The data is further persisted to an underlying database, such as internal storage. + * **Security:** Syncope defines a fine-grained set of entitlements, which are granted to administrators and enable the implementation of delegated administration scenarios. + + + +#### Syncope extensions + +Apache Syncope's features can be enhanced with [extensions][7], which add a REST endpoint and manage the persistence of additional entities, tweak the provisioning layer, and add features to the user interface. + +Some popular extensions include: + + * **Swagger UI** works as a user interface for Syncope RESTful services. + * **SSO support** provides OpenID Connect and SAML 2.0 access to administrative or end-user web interfaces. + * **Apache Camel provisioning manager** delegates the execution of the provisioning process to a group of Apache Camel routes. It can be dynamically changed at the runtime through the REST interfaces or the administrative console, and modifications are also instantly available for processing. + * **Elasticsearch** provides an alternate internal search engine for users, groups, and objects through an external [Elasticsearch][8] cluster. + + + +### Apache Metron + +Security information and event management ([SIEM][9]) gives admins insights into the activities happening within their IT environment. It combines the concepts of security event management (SEM) with security information management (SIM) into one functionality. SIEM collects security data from network devices, servers, and domain controllers, then aggregates and analyzes the data to detect malicious threats and payloads. + +[Apache Metron][10] is an advanced security analytics framework that detects cyber anomalies, such as phishing activity and malware infections. Further, it enables organizations to take corrective measures to counter the identified anomalies. + +It also interprets and normalizes security events into standard JSON language, which makes it easier to analyze security events, such as: + + * An employee flagging a suspicious email + * An authorized or unauthorized software download by an employee to a company device + * A security lapse due to a server outage + + + +Apache Metron provides security alerts, labeling, and data enrichment. It can also store and index security events. Its four key capabilities are: + + * **Security data lake:** Metron is a cost-effective way to store and combine a wide range of business and security data. The security data lake provides the amount of data required to power discovery analytics. It also provides a mechanism to search and query for operational analytics. + * **Pluggable framework:** It provides a rich set of parsers for common security data sources such as pcap, NetFlow, Zeek (formerly Bro), Snort, FireEye, and Sourcefire. You can also add custom parsers for new data sources, including enrichment services for more contextual information, to the raw streaming data. The pluggable framework provides extensions for threat-intel feeds and lets you customize security dashboards. Machine learning and other models can also be plugged into real-time streams and provide extensibility. + * **Threat detection platform:** It uses machine learning algorithms to detect anomalies in a system. It also helps analysts extract and reconstruct full packets to understand the attacker's identity, what data was leaked, and where the data was sent. + * **Incident response application:** This refers to evolved SIEM capabilities, including alerting, threat intel frameworks, and agents to ingest data sources. Incident response applications include packet replay utilities, evidence storage, and hunting services commonly used by security operations center analysts. + + + +### Security matters + +Incorporating open source security tools into your IT infrastructure is imperative to keep your organization safe and secure. Open source tools, like Syncope and Metron from Apache, can help you identify and counter security threats. Learn to use them well, file bugs as you find them, and help the open source community protect the world's data. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/apache-security-tools + +作者:[Chantale Benoit][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/chantalebenoit +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_3reasons.png?itok=k6F3-BqA (A lock on the side of a building) +[2]: https://syncope.apache.org/ +[3]: https://jax-rs.github.io/apidocs/2.0/ +[4]: https://www.redhat.com/en/topics/api/what-is-a-rest-api +[5]: https://www.redhat.com/en/topics/automation/what-is-business-process-management +[6]: http://openjpa.apache.org/openjpa-2.0.0.html +[7]: http://syncope.apache.org/docs/2.1/reference-guide.html#extensions +[8]: https://opensource.com/life/16/6/overview-elastic-stack +[9]: https://en.wikipedia.org/wiki/Security_information_and_event_management +[10]: http://metron.apache.org/ diff --git a/sources/tech/20201008 Top 5 open source alternatives to Google Analytics.md b/sources/tech/20201008 Top 5 open source alternatives to Google Analytics.md new file mode 100644 index 0000000000..b06206d8ce --- /dev/null +++ b/sources/tech/20201008 Top 5 open source alternatives to Google Analytics.md @@ -0,0 +1,104 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Top 5 open source alternatives to Google Analytics) +[#]: via: (https://opensource.com/article/18/1/top-5-open-source-analytics-tools) +[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) + +Top 5 open source alternatives to Google Analytics +====== +These four versatile web analytics tools provide valuable insights on +your customers and site visitors while keeping you in control. +![Analytics: Charts and Graphs][1] + +If you have a website or run an online business, collecting data on where your visitors or customers come from, where they land on your site, and where they leave _is vital._ Why? That information can help you better target your products and services, and beef up the pages that are turning people away. + +To gather that kind of information, you need a web analytics tool. + +Many businesses of all sizes use Google Analytics. But if you want to keep control of your data, you need a tool that _you_ can control. You won’t get that from Google Analytics. Luckily, Google Analytics isn’t the only game on the web. + +Here are four open source alternatives to Google Analytics. + +### Matomo + +Let’s start with the open source application that rivals Google Analytics for functions: [Matomo][2] (formerly known as Piwik). Matomo does most of what Google Analytics does, and chances are it offers the features that you need. + +Those features include metrics on the number of visitors hitting your site, data on where they come from (both on the web and geographically), the pages from which they leave, and the ability to track search engine referrals. Matomo also offers many reports, and you can customize the dashboard to view the metrics that you want to see. + +To make your life easier, Matomo integrates with more than 65 content management, e-commerce, and online forum systems, including WordPress, Magneto, Joomla, and vBulletin, using plugins. For any others, you can simply add a tracking code to a page on your site. + +You can [test-drive][3] Matomo or use a [hosted version][4]. + +### Open Web Analytics + +If there’s a close second to Matomo in the open source web analytics stakes, it’s [Open Web Analytics][5]. In fact, it includes key features that either rival Google Analytics or leave it in the dust. + +In addition to the usual raft of analytics and reporting functions, Open Web Analytics tracks where on a page, and on what elements, visitors click; provides [heat maps][6] that show where on a page visitors interact the most; and even does e-commerce tracking. + +Open Web Analytics has a [WordPress plugin][7] and can [integrate with MediaWiki][8] using a plugin. Or you can add a snippet of [JavaScript][9] or [PHP][10] code to your web pages to enable tracking. + +Before you [download][11] the Open Web Analytics package, you can [give the demo a try][12] to see it it’s right for you. + +### AWStats + +Web server log files provide a rich vein of information about visitors to your site, but tapping into that vein isn't always easy. That's where [AWStats][13] comes to the rescue. While it lacks the most modern look and feel, AWStats more than makes up for that with breadth of data it can present. + +That information includes the number of unique visitors, how long those visitors stay on the site, the operating system and web browsers they use, the size of a visitor's screen, and the search engines and search terms people use to find your site. AWStats can also tell you the number of times your site is bookmarked, track the pages where visitors enter and exit your sites, and keep a tally of the most popular pages on your site. + +These features only scratch the surface of AWStats's capabilities. It also works with FTP and email logs, as well as [syslog][14] files. AWStats can gives you a deep insight into what's happening on your website using data that stays under your control. + +### Countly + +[Countly][15] bills itself as a "secure web analytics" platform. While I can't vouch for its security, Countly does a solid job of collecting and presenting data about your site and its visitors. + +Heavily targeting marketing organizations, Countly tracks data that is important to marketers. That information includes site visitors' transactions, as well as which campaigns and sources led visitors to your site. You can also create metrics that are specific to your business. Countly doesn't forgo basic web analytics; it also keeps track of the number of visitors on your site, where they're from, which pages they visited, and more. + +You can use the hosted version of Countly or [grab the source code][16] from GitHub and self-host the application. And yes, there are [differences between the hosted and self-hosted versions][17] of Countly. + +### Plausible + +[Plausible][18] is a newer kid on the open source analytics tools block. It’s lean, it’s fast, and only collects a small amount of information — that includes numbers of unique visitors and the top pages they visited, the number of page views, the bounce rate, and referrers. Plausible is simple and very focused. + +What sets Plausible apart from its competitors is its heavy focus on privacy. The project creators state that the tool doesn’t collect or store any information about visitors to your website, which is particularly attractive if privacy is important to you. You can read more about that [here][19]. + +There’s a [demo instance][20] that you check out. After that, you can either [self-host][21] Plausible or sign up for a [paid, hosted account][22]. + +**Share your favorite open source web analytics tool with us in the comments.** + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/18/1/top-5-open-source-analytics-tools + +作者:[Scott Nesbitt][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/scottnesbitt +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/analytics-graphs-charts.png?itok=sersoqbV (Analytics: Charts and Graphs) +[2]: https://matomo.org/ +[3]: https://demo.matomo.org/index.php?module=CoreHome&action=index&idSite=3&period=day&date=yesterday +[4]: https://www.innocraft.cloud/ +[5]: http://www.openwebanalytics.com/ +[6]: http://en.wikipedia.org/wiki/Heat_map +[7]: https://github.com/padams/Open-Web-Analytics/wiki/WordPress-Integration +[8]: https://github.com/padams/Open-Web-Analytics/wiki/MediaWiki-Integration +[9]: https://github.com/padams/Open-Web-Analytics/wiki/Tracker +[10]: https://github.com/padams/Open-Web-Analytics/wiki/PHP-Invocation +[11]: https://github.com/padams/Open-Web-Analytics +[12]: http://demo.openwebanalytics.com/ +[13]: http://www.awstats.org +[14]: https://en.wikipedia.org/wiki/Syslog +[15]: https://count.ly/web-analytics +[16]: https://github.com/Countly +[17]: https://count.ly/pricing#compare-editions +[18]: https://plausible.io +[19]: https://plausible.io/data-policy +[20]: https://plausible.io/plausible.io +[21]: https://plausible.io/self-hosted-web-analytics +[22]: https://plausible.io/register diff --git a/sources/tech/20201009 5 ways organizations can lean into failure and transform it into success.md b/sources/tech/20201009 5 ways organizations can lean into failure and transform it into success.md new file mode 100644 index 0000000000..5a05391cd3 --- /dev/null +++ b/sources/tech/20201009 5 ways organizations can lean into failure and transform it into success.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (5 ways organizations can lean into failure and transform it into success) +[#]: via: (https://opensource.com/article/20/10/organizations-can-lean-failure) +[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych) + +5 ways organizations can lean into failure and transform it into success +====== +Removing the fear of failure fosters innovation and open-mindedness, +turning mistakes into opportunities for growth and improvement. +![failure sign at a party, celebrating failure][1] + +> "If failure is not an option, then neither is success."—Seth Godin + +Success is something we all strive toward, but the road to success has twists and turns, which are also known as our failures. But instead of giving up when things don't go my way, I have learned to look at failures as learning opportunities. In fact, I now proudly admit that I'm a failure: + + * I failed my driving test the first time I took it. + * I have not gotten every job I've ever applied or interviewed for. + * Most of the articles I've written have not gone viral. + + + +As software engineers, our industry may be competitive, but we need to remove the stigma associated with failing. One way of doing that is to talk about our failures. The more we hear and talk about failures, the more acceptable it becomes. We need to think about failures as learning opportunities, not a time to shame and ridicule others (or ourselves). + +When we have failed, or think we have made a mistake, most of us get that pit in the bottom of our stomach, and the negative self-talk can kick in almost instantly. This reaction occurs because there are often consequences for mistakes, which can impact us personally as well as the organizations we work for. + +Let's consider a hypothetical example: A software engineer submits a pull request for a new feature. It gets merged and released to production. Something goes wrong, and the application begins throwing errors. Customers can't log in. Sadly this isn't the first time this has happened. Some customers are fed up with the application breaking and have canceled their contracts. The CTO is furious. They want to know who is responsible for this feature being released. The team is understaffed because several team members have left the company, and those that remain are [burned out][2]. The incident takes way longer than usual to be resolved, and everyone is grumpy at the end. + +This worst-case scenario doesn't mean we should always play it safe and not take risks. We need to balance the risks with the rewards when making technical decisions at work and with the open source projects we work on. I like to visualize success and failure as two opposite banks of a river, connected by a bridge. That bridge is built out of knowledge, learning, and understanding. Failure is when we grow, but only if we're learning from those failures and have a good mixture of success sprinkled in. + +### What is needed to accept failure? + +Embracing failure from a personal and organizational point of view doesn't happen overnight. It takes both time and the right culture. Start with one of the five areas outlined below. + +#### Have a growth mindset + +In the book _Growth_, Carol Dweck describes two types of mindsets: growth and fixed. A person with a fixed mindset believes in innate capabilities—you're either born with it, or you're not. Failure represents a limit on one's abilities. + +A person with a growth mindset believes that individual effort and attitude determine one's abilities and that they can learn and improve as long as they put in the effort. Failure represents an opportunity to grow. + +To encourage growth means to encourage failure. But saying "it's OK to fail" is not the same as creating a culture where it honestly is OK to fail. That requires psychological safety and a blameless culture. + +#### Create a blameless culture + +A blameless culture focuses on _where_ a system or a process failed, not on _who_ is responsible. If you spend time after an incident looking for and attributing root cause to human error, you are assigning blame. Instead, look for how things can be improved. What broke? How did it break? How can you prevent it in the future? + +![Image of swampy area with overlaid quote reading "If a junior engineer asks where outages come from, I think a cute thing to tell them is 'The server is crying.' And if they ask why the server is crying, another cute thing to tell them is 'probably becaus][3] + +Published with permission from Joshua Zimmerman (@TheJewberwocky) + +#### Foster psychological safety + +A blameless culture cannot exist without psychological safety. Psychological safety is the ability to show up to work without fear; you feel included in the whole, that it is safe to learn, safe to contribute, and safe to challenge the status quo without fear of consequences. Employees need to feel empowered to speak up if they see processes that need to be improved if they are concerned with security or lack of security procedures in place. They need to feel they won't be blamed for taking a risk where the end result wasn't quite what was expected. + +One way to create a blameless culture and provide psychological safety is to eliminate the word "why" from your vocabulary. Why is used quite frequently—there are problem-solving techniques called ["The "5 Whys."][4] The problem with "why" is it is subtly coded instead as "explain yourself." Having to answer "why" questions put people on the defensive, and they spend time focusing on what the "right" answer is instead of answering honestly. Instead, switch to using "what" or "how" questions. "How" and "what" questions promote concrete action. + +Consider the difference in these questions: + + * Why did last night's release cause a series of exceptions? +vs. + * How were the exceptions triggered? + + + +> "Recently, I was asked if I was going to fire an employee who made a mistake that cost the company $600,000. 'No,' I replied, 'I just spent $600,000 training him. Why would I want somebody else to hire his experience?'"— Thomas J. Watson, Chairman & CEO of IBM, 1914-1956 + +#### Remember the importance of play + +The final aspect of embracing failure is to make time to play. Play shapes our brains and fosters empathy. From a young age, we learn to play games, play on a sports team, play on our own, etc. Chances are you didn't always play on an undefeated sports team or win every single game you've ever played, but practice helped you get better over time no matter what. These experiences teach us to be comfortable with failure and to take it in stride with growth and improvement. + +#### Experimentation leads to learning + +Now that you're ready to embrace failure in your DevOps or engineering practices, where do you start? One of the first processes to look at is the build process. As you most likely know, builds can sometimes result in failures. Changing your build process to include [progressive delivery][5] techniques helps you release features in a controlled manner as opposed to a big bang. Using ring deployments or a canary launch, you can see how a feature performs for a small group of users. If there is a failure, the blast radius has been minimized. + +Another process that can help you learn about your applications and systems is experimentation. Experiments provide a number of learning opportunities, and they don't always go as expected. Some failures can turn into wild successes; for example—[Post-it Notes][6]. Experiments allow us to test a hypothesis and learn new things. Experimenting with software can look like running an A/B test to see which look and feel leads to greater engagement or collecting page load time metrics to see if adding pagination to search results negatively impacts performance. + +A popular type of experimentation is to run a chaos day or game day. With a game day, you purposely cause a system or application to fail. This combines the notion of play, failure, and learning. During this controlled experiment, you learn how your system behaves during failure scenarios. The knowledge gained during game days can be used to put safety measures in place or define processes for what to do when a specific failure occurs. + +### Lean into failure + +Failure can be scary; it is seen as a negative and something we want to avoid. I call on you to change your perspective on this. If you're not failing, you're not learning. + +I challenge you to normalize failure and help reduce the stigma by sharing a failure of yours. Share your failures in the comments below or tag me on social media. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/organizations-can-lean-failure + +作者:[Dawn Parzych][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dawnparzych +[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://opensource.com/article/19/11/burnout-open-source-communities +[3]: https://opensource.com/sites/default/files/uploads/quote-failure-opensource_0.png +[4]: https://en.wikipedia.org/wiki/Five_whys +[5]: https://launchdarkly.com/blog/all-the-canaries-lived-its-time-to-adopt-progressive-delivery/ +[6]: https://www.ideatovalue.com/insp/nickskillicorn/2017/04/true-story-post-notes-almost-failed/ diff --git a/sources/tech/20201009 My open source video game for Open Jam.md b/sources/tech/20201009 My open source video game for Open Jam.md new file mode 100644 index 0000000000..e4929f98ab --- /dev/null +++ b/sources/tech/20201009 My open source video game for Open Jam.md @@ -0,0 +1,235 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (My open source video game for Open Jam) +[#]: via: (https://opensource.com/article/20/10/open-source-game) +[#]: author: (Klaatu https://opensource.com/users/klaatu) + +My open source video game for Open Jam +====== +Step through a game programmed for Open Jam 2020 to get tips for your +own design. +![Gaming with penguin pawns][1] + +This year, I joined in on the [Open Jam][2], a "game jam" in which programmers around the world dedicate a weekend to create open source games. The jam is essentially an excuse to spend a weekend coding, and the majority of the games that come out of the challenge are small distractions rather than something you're likely to play for hours on end. But they're fun, diverse, and open source, and that's a pretty good feature list for a game. + +The game I submitted is [Unveil][3], a calming puzzle game in which the player must first discover the goal, and then work to achieve it with the greatest number of points. Because part of the game is the discovery process, I won't reveal any more about the gameplay than that. + +![Unveil game][4] + +(Klaatu, [CC BY-SA 4.0][5]) + +The whole game is only 338 lines, written in [Python][6] using the [Pygame][6] module. It's, of course, open source, and part of it may serve as a good introduction to a few programming concepts that used to confound me (two-dimensional arrays being the most significant). For simple game design, a two-dimensional array is very useful because so many enduring games are built on them. You can probably think of several, although if you don't know what a two-dimensional array is, you may not realize it. + +### Arrays in gaming + +An array is a collection of data. An array can be listed across a page or an X-axis (in mathematical terms). For instance: + + +``` +`artichoke, lettuce, carrot, aubergine, potato` +``` + +An array may also be represented as a list or a Y-axis: + + +``` +artichoke +lettuce +carrot +aubergine +potato +``` + +This is a one-dimensional array. A two-dimensional array extends on both the X-axis and Y-axis. + +Here's a common two-dimensional array seen in the world of board games: + +![Chess][7] + +(Klaatu, [CC BY-SA 4.0][5]) + +Yes, two-dimensional arrays are used as the board for chess, draughts, noughts and crosses (also called tic-tac-toe), [RPG battle maps][8], [minesweeper][9], Carcassonne, Forbidden Island, and in slightly modified forms, games like Monopoly and even [Ur][10] (literally the oldest game we know of). + +If you can comfortably create a two-dimensional array, you have a great start at programming any number of games. + +### Creating tiles in Pygame + +If you're not familiar with Python, you should take some time to review this [Python (and Pygame) introductory series][11]. If you feel confident enough to translate code to other libraries, though, there's nothing specific to Pygame in the "important" parts of this code (the array constructor), so you can use any library or language. + +For simplicity, I'll call the individual squares in the game board array _tiles_. To construct a two-dimensional array, or game board as the case may be, you must have tiles. In object-oriented programming, you consider each component as a unique object based upon a template (or _class_, in programming terminology). So, before creating the game board, you must first create the infrastructure for the board's building blocks: tiles. + +First, set up a simple Pygame project, creating a display (your window into the game world), a group to represent the game board, and a few standard variables: + + +``` +import pygame + +pygame.init() +game_world = pygame.display.set_mode((960, 720)) +game_board = pygame.sprite.Group() + +running = True +black = (0, 0, 0) +white = (255, 255, 255) +red = (245, 22, 22) +world_x = 960 +world_y = 720 +``` + +Next, create a `Tile` class to establish the template from which each tile gets cast. The first function initializes a new tile when one is created and gives it the necessary basic fields: width, height, an image (actually, I just filled it with the color white), and whether or not it's active. In this case, I use `is_pressed`, as if the tile is a button, because that's what it'll look like when the code is finished: when the user clicks a tile, it changes color as if it were a button being lit up. For other purposes, this state needn't be visible. In chess, for example, you might instead have a field to represent whether a tile is occupied and, if so, by what kind of chess piece. + + +``` +class Tile(pygame.sprite.Sprite): +    def __init__(self, x, y, w, h, c): +        pygame.sprite.Sprite.__init__(self) +        self.image = pygame.Surface((w, h)) +        self.image.fill(c) +        self.rect = self.image.get_rect() +        self.rect.x = x +        self.rect.y = y +        self.is_pressed = False +``` + +The second function is an update function. Specifically, it checks whether a tile has been clicked by the user. This requires mouse coordinates, which you'll get later in the code during the event loop. + +For this demonstration, I'll make this function fill the tile with the color red when it's in the `is_pressed` state and back to white otherwise: + + +``` +    def was_clicked(self, mouse): +        if self.rect.collidepoint(mouse) and not self.is_pressed: +            self.image.fill(red) +            self.is_pressed = True +        elif self.rect.collidepoint(mouse) and self.is_pressed: +            self.image.fill(white) +            self.is_pressed = False +        else: +            return False +``` + +### Main loop + +This demo's main loop is simple. It checks for two kinds of input: a quit signal and a mouse down (click) event. When it detects a mouse click, it calls the `was_clicked` function to react (filling it with red or white, depending on its current state). + +Finally, the screen fills with black, the game board state is updated, and the screen is redrawn: + + +``` +""" +holding place for game board construction +""" + +while running: +    for event in pygame.event.get(): +        if event.type == pygame.QUIT: +            running = False + +        elif event.type == pygame.MOUSEBUTTONDOWN: +            for hitbox in game_board: +                hitbox.was_clicked(event.pos) + +    game_world.fill(black) +    game_board.update() +    game_board.draw(game_world) +    pygame.display.update() + +pygame.quit() +``` + +### Board construction + +To build a two-dimensional array, you must first decide how many tiles you want in both directions. I'll use eight for this example because that's how a chessboard is constructed, but you could use fewer or more. You could even accept arguments at launch to define the array's size depending on options, such as `--row` and `--column:` + + +``` +rows = 8 +columns = 8 +``` + +Because you don't know the size of the board, you must calculate the width of the rows and columns based on the size of your display. I also include one pixel of padding between each tile, because, without a gap, it looks like one big block of color: + + +``` +column_width = world_x / columns +row_height = world_y / rows +pad = 1 +``` + +Laying out tiles across the display is simple. Of course, this isn't the goal, as it only draws along the X-axis, but it's a good start: + + +``` +j = 0 + +while j < rows: +    tile = Tile(j * column_width, row_height, column_width - pad, row_height - pad, white) +    game_board.add(tile) +    j += 1 +``` + +The idea is that the variable `j` starts at 0, so the first tile is placed from 0 to `column_width`, less the value of the padding. Then the variable `j` is incremented to 1, so the next tile is placed at 1 times the value of `column_width`, and so on. + +You can run that code to see the partial success it renders. What this solution obviously lacks is any awareness of further rows. + +Use a second counter variable to track rows: + + +``` +j = 0 +k = 0 + +while j < rows: +    while k < columns: +        tile = Tile(k * column_width, j * row_height, column_width - pad, row_height - pad, white) +        game_board.add(tile) +        k += 1 +    j += 1 +    k = 0 +``` + +In this code block, which achieves the desired result, each tile is positioned in a space determined by the current value of either `j` or `k`. + +The `k` variable is incremented within its loop so that each tile is progressively placed along the X-axis. + +The `j` variable is incremented outside the nested loop so that everything gets moved down one row. + +The `k` variable is then set to 0 so that when the inner loop starts again, everything is shunted back to the far left of the screen. + +![2D array][12] + +(Klaatu, [CC BY-SA 4.0][5]) + +### Easy arrays + +Creating a grid can seem mathematically and syntactically intensive, but with this example plus a little bit of thought about what result you want, you can generate them at will. The only thing left for you to do now is to create a game around it. That's what I did, and you're welcome to play it by downloading it from its home on [Itch.io][3] or from its source repository on [git.nixnet.xyz][13]. Enjoy! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/open-source-game + +作者:[Klaatu][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/klaatu +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/gaming_grid_penguin.png?itok=7Fv83mHR (Gaming with penguin pawns) +[2]: http://openjam.io +[3]: https://notklaatu.itch.io/unveil +[4]: https://opensource.com/sites/default/files/uploads/unveil-2.jpg (Unveil game) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://www.python.org/ +[7]: https://opensource.com/sites/default/files/uploads/chess.jpg (Chess) +[8]: https://opensource.com/article/18/5/maptool +[9]: https://opensource.com/article/19/9/advanced-bash-building-minesweeper +[10]: https://otagomuseum.nz/athome/the-royal-game-of-ur +[11]: https://opensource.com/article/17/10/python-101 +[12]: https://opensource.com/sites/default/files/uploads/2darray.jpg (2D array) +[13]: https://git.nixnet.xyz/klaatu/unveil diff --git a/sources/tech/20201010 Robust and Race-free Server Logging using Named Pipes.md b/sources/tech/20201010 Robust and Race-free Server Logging using Named Pipes.md new file mode 100644 index 0000000000..f969bbac18 --- /dev/null +++ b/sources/tech/20201010 Robust and Race-free Server Logging using Named Pipes.md @@ -0,0 +1,114 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Robust and Race-free Server Logging using Named Pipes) +[#]: via: (https://theartofmachinery.com/2020/10/10/logging_with_named_pipes.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) + +Robust and Race-free Server Logging using Named Pipes +====== + +If you do any server administration work, you’ll have worked with log files. And if your servers need to be reliable, you’ll know that log files are common source of problems, especially when you need to rotate or ship them (which is practically always). In particular, moving files around causes race conditions. + +Thankfully, there are better ways. With named pipes, you can have a simple and robust logging framework, with no race conditions, and without patching your servers to support some network logging protocol. + +### The problems with rotating log files + +First, let’s talk about the problems. Race conditions are generally a problem with popular file-based logging setups, whether you’re rotating logs into archival storage, or shipping them to a remote log processing stack, or whatever. To keep things concrete, though, let me talk about [logrotate][1], just because it’s a popular tool. + +Say you have a log file at `/var/log/foo`. It gets pretty big, and you want to process the logs periodically and start with a new, empty file. So you (or your distro maintainers) set up logrotate with various rules about when to rotate the file. + +By default, logrotate will rename the file (to something like `/var/log/foo.1`) and create a new `/var/log/foo` to write to. That (mostly) works for software that runs intermittently (such as a package manager that does software updates). But it won’t do any good if the log file is generated by a long-running server. The server only uses the filename when it opens the file; after that it just keeps writing to its open file descriptor. That means it will keep writing to the old file (now named `/var/log/foo.1`), and the new `/var/log/foo` file will stay empty. + +To handle this use-case, logrotate supports another mode: `copytruncate`. In this mode, instead of renaming, logrotate will copy the contents of `/var/log/foo` to an archival file, and then truncate the original file to zero length. As long as the server has the log file open in append mode, it will automatically write new logs to the start of the file, without needing to detect the truncation and do a file seek (the kernel handles that). + +That `copytruncate` mode creates a race condition, though. Any log lines that are written after the copy but before the truncation will get destroyed. Actually, you tend to get the same race condition even with the default move-and-create mode. That’s because there’s not much point just splitting up the logs into multiple files. Most systems are configured to do something like compress the old log file, but ultimately you need to delete the old, uncompressed data, which creates the same race as truncating. (In practice, this race isn’t so likely for occasional log writers, like package managers, and the `delay` flag to logrotate makes it rarer, albeit by making the log handling a bit more complicated.) + +Some servers, like [Nginx][2], support a modification of the default logrotate mode: + + 1. Rename the old file + 2. Create the new file + 3. (New step) notify the server that it needs to reopen its log file. + + + +This works (as long as the logs processor doesn’t delete the old file before the server has finished reopening), but it requires special support from the server, and you’re out of luck with most software. There’s a lot of software out there, and log file handling just isn’t interesting enough to get high on the to-do list. This approach also only works for long-running servers. + +I think this is a good point to stop and take a step back. Having multiple processes juggle log files around on disk without any synchronisation is just an inherently painful way to do things. It causes bugs and makes logging stacks complicated ([here’s just one of many examples][3]). One alternative is to use some network protocol like MQTT or networked syslog, but, realistically, most servers won’t support the one you want. And they shouldn’t have to — log files are a great interface for log writers. + +That’s okay because *nix “everything is a file” lets us easily get a file interface on the writer side, with a streaming interface on the reader side. + +### Named pipes 101 + +Maybe you’ve seen pipes in pipelines like this: + +``` +$ sort user_log.txt | uniq +``` + +The pipe connecting `sort` and `uniq` is a temporary, anonymous communication channel that `sort` writes to and `uniq` reads from. Named pipes are less common, but they’re also communication channels. The only difference is that they persist on the filesystem as if they were files. + +Open up a terminal and `cd` into some temporary working directory. The following creates a named pipe and uses `cat` to open a writer: + +``` +$ mkfifo p +$ # This cat command will sit waiting for input +$ cat > p +``` + +Leave that `cat` command waiting, and open up another terminal in the same directory. In this terminal, start your reader: + +``` +$ # This will sit waiting for data to come over the pipe +$ cat p +``` + +Now as you type things into the writer end, you’ll see them appear in the reader end. `cat` will use line buffering in interactive mode, so data will get transferred every time you start a new line. + +`cat` doesn’t have to know anything about pipes for this to work — the pipe acts like a file as long as you just naïvely read or write to it. But if you check, you’ll see the data isn’t stored anywhere. You can pump gigabytes through a pipe without filling up any disk space. Once the data has been read once, it’s lost. (You can have multiple readers, but only one will receive any buffer-load of data.) + +Another thing that makes pipes useful for communication is their buffering and blocking. You can start writing before any readers open the pipe, and data gets temporarily buffered inside the kernel until a reader comes along. If the reader starts first, its read will block, waiting for data from the writer. (The writer will also block if the pipe buffer gets full.) If you try the two-terminal experiment again with a regular file, you’ll see that the reader `cat` will eagerly read all the data it can and then exit. + +### An annoying problem and a simple solution + +Maybe you’re seeing how named pipes can help with logging: Servers can write to log “files” that are actually named pipes, and a logging stack can read log data directly from the named pipe without letting a single line fall onto the floor. You do whatever you want with the logs, without any racey juggling of files on disk. + +There’s one annoying problem: the writer doesn’t need a reader to start writing, but if a reader opens the pipe and then closes it, the writer gets a `SIGPIPE` (“broken pipe”), which will kill it by default. (Try killing the reader `cat` while typing things into the writer to see what I mean.) Similarly, a reader can read without a writer, but if a writer opens the pipe and then closes it, that will be treated like an end of file. Although the named pipe persists on disk, it isn’t a stable communication channel if log writers and log readers can restart (as they will on a real server). + +There’s a solution that’s a bit weird but very simple. Multiple processes can open the pipe for reading and writing, and the pipe will only close when _all_ readers or _all_ writers close it. All we need for a stable logging pipe is a daemon that holds the named pipe open for both reading and writing, without doing any actual reading or writing. I set this up on my personal server last year, and I wrote [a tiny, zero-config program to act as my pipe-holding daemon][4]. It just opens every file in its current working directory for both reading and writing. I run it from a directory that has symbolic links to every named pipe in my logging stack. The program runs in a loop that ends in a `wait()` for a `SIGHUP`. If I ever update the symlinks in the directory, I give the daemon a `kill -HUP` and it reopens them all. Sure, it could do its own directory watching, but the `SIGHUP` approach is simple and predictable, and the whole thing works reliably. Thanks to the pipe buffer, log writers and log readers can be shut down and restarted independently, any time, without breakage. + +My server uses the [s6 supervision suite][5] to manage daemons, so I have s6-log reading from each logging pipe. The bottom part of the [s6-log documentation page][6] has some good insights into the problems with popular logging systems, and good ideas about better ways to do things. + +### Imagine: a world without log rotation + +Strictly speaking, named pipes aren’t necessary for race-free logs processing. The s6 suite encourages writing logs to some file descriptor (like standard error), and letting the supervision suite make sure those file descriptors point to something useful. However, the named pipe approach adds a few benefits: + + * It doesn’t require any co-ordination between writer and reader + * It integrates nicely with the software we have today + * It gives things meaningful names (rather than `/dev/fd/4`) + + + +I’ve worked with companies that spend about as much on their logging stacks as on their serving infrastructure, and, no, “we do logs processing” isn’t in their business models. Of course, log rotation and log shipping aren’t the only problems to blame, but it feels so wrong that we’ve made logs so complicated. If you work on any logging system, consider if you really need to juggle log files around. You could be helping to make the world a better place. + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2020/10/10/logging_with_named_pipes.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://github.com/logrotate/logrotate +[2]: https://www.nginx.com/resources/wiki/start/topics/examples/logrotation/ +[3]: https://community.splunk.com/t5/Getting-Data-In/Why-copytruncate-logrotate-does-not-play-well-with-splunk/td-p/196112 +[4]: https://gitlab.com/sarneaud/fileopenerd +[5]: http://www.skarnet.org/software/s6/index.html +[6]: http://www.skarnet.org/software/s6/s6-log.html diff --git a/sources/tech/20201012 Build a Kubernetes Minecraft server with Ansible-s Helm modules.md b/sources/tech/20201012 Build a Kubernetes Minecraft server with Ansible-s Helm modules.md new file mode 100644 index 0000000000..08dd088007 --- /dev/null +++ b/sources/tech/20201012 Build a Kubernetes Minecraft server with Ansible-s Helm modules.md @@ -0,0 +1,172 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Build a Kubernetes Minecraft server with Ansible's Helm modules) +[#]: via: (https://opensource.com/article/20/10/kubernetes-minecraft-ansible) +[#]: author: (Jeff Geerling https://opensource.com/users/geerlingguy) + +Build a Kubernetes Minecraft server with Ansible's Helm modules +====== +Deploy a Minecraft server into a Kubernetes cluster with Ansible's new +collections. +![Ship captain sailing the Kubernetes seas][1] + +One of the best outcomes of Ansible's [move towards content collections][2] is it spreads the thousands of modules in [Ansible][3]'s "core" repository into many more independent repositories. This means movement on issues and modules that had long been delayed (often due to the [sheer volume of issues and pull requests][4] in the repo) can progress more rapidly. + +Obviously, not all modules will get the same love and appreciation as others—that's the way open source works: more popular things flourish, as others may languish a bit—but one bright example of the positive impact has been the [Kubernetes][5] collection's ability to incorporate some long-awaited [Helm][6] modules. + +Thanks especially to the work of [LucasBoisserie][7], three new Helm modules were merged into the Kubernetes collection: + + * helm + * helm_info + * helm_repository + + + +Ansible has long had a [helm module][8], but it was fairly broken for a long time, only worked with older versions of Helm, and was slated for deprecation in Ansible 2.14. That version of the module will still work the same in the regular community distribution of Ansible, as it's now been moved to the [community.general][9] collection. + +But if you want to use these new modules to automate your Helm deployments using the Kubernetes container orchestration system, you can do it with the [community.kubernetes][10] collection. + +### What is Helm? + +Helm says it is "the best way to find, share, and use software built for Kubernetes." + +There are currently dozens of ways to deploy software into Kubernetes and [OpenShift][11] clusters (you can even do it using Ansible natively with the [k8s module][12]), but Helm is often the easiest onramp to Kubernetes deployments, especially when you're starting out on your Kubernetes journey. + +The way Helm works is that people maintain "charts," which are templates describing "how to deploy application XYZ" into Kubernetes. Charts can have "values" that override the default settings for a deployment's chart. + +There are thousands of [charts on Helm Hub][13] you can use to install popular software. If your software is not included, you can build and host your own Helm chart repositories. + +### What is Minecraft? + +For a certain generation (or their parents), this question doesn't need an answer: [Minecraft][14] is the [best-selling video game of all time][15], and it appeals to an extremely wide audience because there are so many different ways you can play it. + +I remember spending an hour here or there during my post-college years tending to a farm that I built in my little virtual Minecraft world. Minecraft can now run on almost any computing device with a screen, and networked play has become very popular. To support this, the Minecraft team maintains a [Minecraft server][16] application you can run to play networked games with your friends. + +### Where does Ansible fit in? + +I like to think of Ansible as the "glue" that holds automation together. I previously wrote about [how Ansible is useful in a cloud-native environment][17], so I won't rehash why I use Ansible to manage my Kubernetes infrastructure. + +In this article, I'll show you how to write a short Ansible playbook to manage the setup of Helm's Minecraft chart in a cluster. In a real-world infrastructure, this playbook would be one small part of a set of plays that: + + * Build or configure a Kubernetes cluster + * Deploy monitoring tools into the cluster + * Deploy applications into the cluster + + + +Before you can write the playbook, you have to install Ansible's official [Kubernetes collection][10]. You can do this either by requiring it in a **requirements.yml** file (which could be used by Ansible Tower to install the collection automatically) or by manually installing it: + + +``` +`ansible-galaxy collection install community.kubernetes` +``` + +Once you have the collection, it's time to write the playbook. To make it easy for you to view the code or download the file, I've posted my **[minecraft.yml][18] **playbook as a Gist on GitHub. + +The playbook uses many of the Kubernetes collection's modules: + + 1. The `k8s` module creates a namespace, `minecraft`. + 2. The `helm_repository` module adds the `itzg` Helm repository, which contains the Minecraft Helm chart. + 3. The `helm` module deploys the chart and creates the Minecraft server instance. + 4. The `k8s_info` module retrieves the NodePort where Minecraft is running so that you can connect to it from Minecraft. + + + +The playbook assumes you have a running Kubernetes or OpenShift cluster and a kubeconfig file that points to that cluster already. If not, create a Minikube cluster on your workstation: + + 1. Make sure you have [Minikube][19] installed. + 2. Run `minikube start`, and wait for the cluster to be created. + + + +Make sure you have [Ansible][20] and [Helm][21] installed, then run the playbook: + + +``` +`ansible-playbook minecraft.yml` +``` + +After a few minutes, the Minecraft server will generate a spawn area and be ready for connections! The playbook should provide the Minecraft NodePort at the end of its output (e.g., Minecraft NodePort: 32393). + +Get the IP address of your Minikube cluster with `minikube ip`, add the NodePort to it (in my case, 192.168.64.19:32393), then open up Minecraft and connect to it: + + 1. Click **Multiplayer**. + 2. Click **Direct Connection**. + 3. Enter the server address (the Minikube IP and Minecraft NodePort). + 4. Click **Join Server**. + + + +And voila! You should be able to play around in the little virtual Minecraft world that's running on your very own Kubernetes cluster. + +![Minecraft gameplay][22] + +(Jeff Geerling, [CC BY-SA 4.0][23]) + +View the server logs with: + + +``` +`kubectl logs -f -n minecraft -l app=minecraft-minecraft;` +``` + +In the logs, you can see that I was successful in finding many ways to die inside my little Minecraft world! + +![Minecraft server logs][24] + +(Jeff Geerling, [CC BY-SA 4.0][23]) + +### Take a step beyond + +There are dozens of ways to deploy applications like a Minecraft server into a Kubernetes cluster. Luckily for us, Ansible already supports most of those options through its Kubernetes collection! And if you want to take a step beyond simple deployments and chart updates, you can use Ansible to build a [Kubernetes operator][25] with the Operator SDK—in fact, someone already made a [community operator][26] built with Ansible that runs a Minecraft server! + +I was inspired to write this after using Ansible to manage a seven-node Kubernetes cluster built with Raspberry Pis. You can learn more about that in the [Turing Pi Cluster][27] GitHub repository. + +* * * + +If you want to learn more about Ansible, make sure to register for [AnsibleFest][28], a virtual experience on October 13-14. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/kubernetes-minecraft-ansible + +作者:[Jeff Geerling][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/geerlingguy +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_captain_devops_kubernetes_steer.png?itok=LAHfIpek (Ship captain sailing the Kubernetes seas) +[2]: https://github.com/ansible-collections/overview +[3]: https://www.ansible.com/ +[4]: https://emeraldreverie.org/2020/03/02/collections-the-backlog-view/ +[5]: https://kubernetes.io/ +[6]: https://helm.sh/ +[7]: https://github.com/LucasBoisserie +[8]: https://docs.ansible.com/ansible/2.9/modules/helm_module.html +[9]: https://github.com/ansible-collections/community.general/blob/master/plugins/modules/cloud/misc/helm.py +[10]: https://github.com/ansible-collections/community.kubernetes +[11]: https://www.openshift.com/ +[12]: https://docs.ansible.com/ansible/latest/collections/community/kubernetes/k8s_module.html#ansible-collections-community-kubernetes-k8s-module +[13]: https://hub.helm.sh/ +[14]: https://www.minecraft.net/ +[15]: https://en.wikipedia.org/wiki/List_of_best-selling_video_games#List +[16]: https://www.minecraft.net/en-us/download/server/ +[17]: https://www.ansible.com/blog/how-useful-is-ansible-in-a-cloud-native-kubernetes-environment +[18]: https://gist.github.com/geerlingguy/2f4b0c06b4b696c8983b82dda655adf3 +[19]: https://kubernetes.io/docs/tasks/tools/install-minikube/ +[20]: https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html +[21]: https://helm.sh/docs/intro/install/ +[22]: https://opensource.com/sites/default/files/uploads/minecraft.png (Minecraft gameplay) +[23]: https://creativecommons.org/licenses/by-sa/4.0/ +[24]: https://opensource.com/sites/default/files/uploads/serverlogs.png (Minecraft server logs) +[25]: https://www.redhat.com/en/topics/containers/what-is-a-kubernetes-operator +[26]: https://github.com/fabianvf/game-server-operator +[27]: https://github.com/geerlingguy/turing-pi-cluster +[28]: https://www.ansible.com/ansiblefest diff --git a/sources/tech/20201012 Create an Ansible module for integrating your Google Calendar.md b/sources/tech/20201012 Create an Ansible module for integrating your Google Calendar.md new file mode 100644 index 0000000000..3f7585f5be --- /dev/null +++ b/sources/tech/20201012 Create an Ansible module for integrating your Google Calendar.md @@ -0,0 +1,186 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Create an Ansible module for integrating your Google Calendar) +[#]: via: (https://opensource.com/article/20/10/ansible-module-go) +[#]: author: (Nicolas Leiva https://opensource.com/users/nicolas-leiva) + +Create an Ansible module for integrating your Google Calendar +====== +Learn how to write an Ansible module in Go to integrate Google Calendar +into your automation workflow. +![Business woman on laptop sitting in front of window][1] + +In a [previous article][2], I explored how [Ansible][3] can integrate with Google Calendar for change management, but I didn't get into the details of the [Ansible module][4] that was built for this purpose. In this article, I will cover the nuts and bolts of it. + +While most [Ansible modules][5]** **are written in [Python][6] (see [this example][7]), that's not the only option you have. You can use other programming languages if you prefer. And if you like [Go][8], this post is for you! + +![Gopher illustration][9] + +([Maria Letta's Free Gophers Pack][10], [Free Gophers License v1.0][11], modified with permission) + +If you are new to Go, check out these [pointers to get started][12]. + +## Ansible and Go + +There are at least four different ways that you can run a Go program from Ansible: + + 1. Install Go and run your Go code with the `go run` command from Ansible. + 2. Cross-compile your Go code for different platforms before execution. Then call the proper binary from Ansible, based on the facts you collect from the host. + 3. Run your Go code or compiled binary from a container with the `containers.podman` [collection][13]. Something along the lines of: [code] - name: Run Go container +  podman_container: +    name: go_test_container +    image: golang +    command: go version +    rm: true +    log_options: "path={{ log_file }}" +``` + 4. Create an [RPM][14] package of your Go code with something like [NFPM][15], and install it in the system of the target host. You can then call it with the Ansible modules [shell][16] or [command][17]. + + + +Running an RPM package or container is not Go-specific (cases 3 and 4), so I will focus on the first two options. + +## Google Calendar API + +You will need to interact with the [Google Calendar API][18], which provides code examples for different programming languages. The one for Go will be the base for your Ansible module. + +The tricky part is [enabling the Calendar API][19] and downloading the credentials you generate in the [Google API Console][20] (`Credentials` > `+ CREATE CREDENTIALS` > `OAuth client ID` > `Desktop App`). + +![Downloading credentials from Google API Console][21] + +(Nicolas Leiva, [CC BY-SA 4.0][22]) + +The arrow shows where to download your OAuth 2.0 client credentials (JSON file) once you create them in [API Credentials][23]. + +## Calling the module from Ansible + +The `calendar` module takes the `time` to validate as an argument. The example below provides the current time. You can typically get this from [Ansible facts][24] (`ansible_date_time`). The JSON output of the module is registered in a variable named `output` to be used in a subsequent task: +``` + + +\- name: Check if timeslot is taken +  calendar: +    time: "{{ ansible_date_time.iso8601 }}" +  register: output + +``` +You might wonder where the `calendar` module code lives and how Ansible executes it. Please bear with me for a moment; I'll get to this after I cover other pieces of the puzzle. + +## Employ the time logic + +With the Calendar API nuances out of the way, you can proceed to interact with the API and build a Go function to capture the module logic. The `time` is taken from the input arguments—in the playbook above—as the initial time (`min`) of the time window to validate (I arbitrarily chose a one-hour duration): +``` + + +func isItBusy(min string) (bool, error) { +        ... +        // max -> min.Add(1 * time.Hour) +        max, err := maxTime(min) +        // ... +        srv, err := calendar.New(client) +        // ... +        freebusyRequest := calendar.FreeBusyRequest{ +                TimeMin: min, +                TimeMax: max, +                Items:   []*calendar.FreeBusyRequestItem{&cal}, +        } +        // ... +        freebusyRequestResponse, err := freebusyRequestCall.Do() +        // ... +        if len(freebusyRequestResponse.Calendars[name].Busy) == 0 { +                return false, nil +        } +        return true, nil +} + +``` +It [sends a `FreeBusyRequest`][25] to Google Calendar with the time window's initial and finish time (`min` and `max`). It also creates a calendar [client][26] (`srv`) to authenticate the account correctly using the JSON file with the OAuth 2.0 client credentials. In return, you get a list of events during this time window. + +If you get zero events, the function returns `busy=false`. However, if there is at least one event during this time window, it means `busy=true`. You can check out the [full code][27] in my GitHub repository. + +## Process the input and creating a response + +Now, how does the Go code read the inputs arguments from Ansible and, in turn, generate a response that Ansible can process? The answer to this depends on whether you are running the [Go CLI][28] (command-line interface) or just executing a pre-compiled Go program binary (i.e., options 1 and 2 above). + +Both options have their pros and cons. If you use the Go CLI, you can pass the arguments the way you prefer. However, to make it consistent with how it works for binaries you run from Ansible, both alternatives will read a JSON file in the examples presented here. + +### Reading the arguments + +As shown in the Go code snippet below, an input file is processed, and Ansible provides a path to it when it calls a binary. + +The content of the file is unmarshaled into an instance (`moduleArg`) of a previously defined struct (`ModuleArgs`). This is how you tell the Go code which data you expect to receive. This method enables you to gain access to the `time` specified in the playbook via `moduleArg.time`, which is then passed to the time logic function (`isItBusy`) for processing: +``` + + +// ModuleArgs are the module inputs +type ModuleArgs struct { +        Time string +} + +func main() { +        ... +        argsFile := os.Args[1] +        text, err := ioutil.ReadFile(argsFile) +        ... +        var moduleArgs ModuleArgs +        err = json.Unmarshal(text, &moduleArgs) +        ... +        busy, err := isItBusy(moduleArg.time) +        ... +} + +``` +### Generating a response + +The values to return are assigned to an instance of a `Response` object. Ansible will need this response includes a couple of boolean flags (`Changed` and `Failed`). You can add any other field you need; in this case, a `Busy` boolean value is carried to signal the response of the time logic function. + +The response is marshaled into a message that you print out and Ansible can read: +``` + + +// Response are the values returned from the module +type Response struct { +        Msg     string `json:"msg"` +        Busy    bool   `json:"busy"` +        Changed bool   `json:"changed"` +        Failed  bool   `json:"failed"` +} + +func returnResponse(r Response) { +  ... +        response, err = json.Marshal(r) +        ... +        fmt.Println(string(response)) +        ... +} + +``` +You can check out the [full code][29] on GitHub. + +## Execute a binary or Go code on the fly? + +One of the cool things about Go is that you can cross-compile a Go program to run on different target operating systems and architectures. The binary files you compile can be executed in the target host without installing Go or any dependency. + +This flexibility plays nicely with Ansible, which provides the target host details (`ansible_system` and `ansible_architecture`) via Ansible facts. In this example, the target architecture is fixed when compiling (`x86_64`), but binaries for macOS, Linux, and Windows are generated (via `make compile`). This produces the three files that are included in the [`library` folder][30] of the `go_role` role with the form of: `calendar_$system`: +``` + + +⇨  tree roles/go_role/ +roles/go_role/ +├── library +│   ├── calendar_darwin +│   ├── calendar_linux +│   ├── calendar_windows +│   └── go_run +└── tasks +    ├── Darwin.yml +    ├── Go.yml +    ├── Linux.yml +    ├── main.yml +    └── Win32NT.yml + +``` +The [`go_role` role][31] that packages the `calendar` \ No newline at end of file diff --git a/sources/tech/20201012 My top 7 keywords in Rust.md b/sources/tech/20201012 My top 7 keywords in Rust.md new file mode 100644 index 0000000000..cca2eeefc1 --- /dev/null +++ b/sources/tech/20201012 My top 7 keywords in Rust.md @@ -0,0 +1,55 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (My top 7 keywords in Rust) +[#]: via: (https://opensource.com/article/20/10/keywords-rust) +[#]: author: (Mike Bursell https://opensource.com/users/mikecamel) + +My top 7 keywords in Rust +====== +Learn a handful of useful keywords from the Rust standard library. +![Rustacean t-shirt][1] + +I've been using [Rust][2] for a few months now, writing rather more of it than I expected—though quite a lot of that has been thrown away as I've learned, improved what I'm writing, and taken some more complex tasks beyond what I originally intended. + +I still love it and thought it might be good to talk about some of the important keywords that come up again and again in Rust. I'll provide my personal summary of what they do, why you need to think about how you use them, and anything else that's useful, particularly for people who are new to Rust or coming from another language (such as Java; see my article [_Why I'm enjoying learning Rust as a Java programmer_][3]). + +Without further ado, let's get going. A good place for further information is always the official Rust documentation—you'll probably want to start with the [std library][4]. + + 1. **const** – You get to declare constants with const, and you should. This isn't rocket science, but do declare with const, and if you're going to use constants across different modules, then do the right thing and create a `lib.rs` file (the Rust default) into which you can put all of them with a nicely named module. I've had clashes of const variable names (and values!) across different files in different modules simply because I was too lazy to do anything other than cut and paste across files when I could have saved myself lots of work simply by creating a shared module. + 2. **let** – You don't _always_ need to declare a variable with a let statement, but your code will be clearer when you do. What's more, always add the type if you can. Rust will do its very best to guess what it should be, but it may not always be able to do so at runtime (in which case [Cargo][5], the compiler, will tell you), or it may even not do what you expect. In the latter case, it's always simpler for Cargo to complain that the function you're assigning from (for instance) doesn't match the declaration than for Rust to try to help you do the wrong thing, only for you to have to spend ages debugging elsewhere. + 3. **match** – match was new to me, and I love it. It's not dissimilar to "switch" in other languages but is used extensively in Rust. It makes for legible code, and Cargo will have a good go at warning you if you do something foolish (such as miss possible cases). My general rule of thumb, where I'm managing different options or doing branching, is to ask whether I can use match. If I can, I will. + 4. **mut** – When declaring a variable, if it's going to change after its initialisation, then you need to declare it mutable. A common mistake is to declare something mutable when it _isn't_ changed—but the compiler will warn you about that. If you get a warning from Cargo that a mutable variable isn't changed when you think it _is_, then you may wish to check the scope of the variable and make sure that you're using the right version. + 5. **return** – I actually very rarely use return, which is for returning a value from a function, because it's usually simpler and clearer to read if you just provide the value (or the function providing the return value) at the end of the function as the last line. Warning: you _will_ forget to omit the semicolon at the end of this line on many occasions; if you do, the compiler won't be happy. + 6. **unsafe** – This does what it says on the tin: If you want to do things where Rust can't guarantee memory safety, then you're going to need to use this keyword. I have absolutely no intention of declaring any of my Rust code unsafe now or at any point in the future; one of the reasons Rust is so friendly is because it stops this sort of hackery. If you really need to do this, think again, think yet again, and then redesign. Unless you're a seriously low-level systems programmer, _avoid_ unsafe. + 7. **use** – When you want to use an item, e.g., struct, variable, function, etc. from another crate, then you need to declare it at the beginning of the block where you'll be using it. Another common mistake is to do this but fail to add the crate (preferably with a minimum version number) to the `Cargo.toml` file. + + + +This isn't the most complicated article I've ever written, I know, but it's the sort of article I would have appreciated when I was starting to learn Rust. I plan to create similar articles on key functions and other Rust must-knows: let me know if you have any requests! + +* * * + +_This article was originally published on [Alice, Eve, and Bob][6] and is reprinted with the author's permission._ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/keywords-rust + +作者:[Mike Bursell][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mikecamel +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rustacean-tshirt.jpg?itok=u7LBmyaj (Rustacean t-shirt) +[2]: https://www.rust-lang.org/ +[3]: https://opensource.com/article/20/5/rust-java +[4]: https://doc.rust-lang.org/std/ +[5]: https://doc.rust-lang.org/cargo/ +[6]: https://aliceevebob.com/2020/09/01/rust-my-top-7-keywords/ diff --git a/sources/tech/20201013 What measured boot and trusted boot means for Linux.md b/sources/tech/20201013 What measured boot and trusted boot means for Linux.md new file mode 100644 index 0000000000..a50e57bb25 --- /dev/null +++ b/sources/tech/20201013 What measured boot and trusted boot means for Linux.md @@ -0,0 +1,70 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What measured boot and trusted boot means for Linux) +[#]: via: (https://opensource.com/article/20/10/measured-trusted-boot) +[#]: author: (Mike Bursell https://opensource.com/users/mikecamel) + +What measured boot and trusted boot means for Linux +====== +When a trusted boot process is performed, the process not only measures +each value but also performs a check against a known (and expected!) +good value at the same time. +![Brain on a computer screen][1] + +Sometimes I'm looking around for a subject to write about, and realise that there's one that I assume that I've covered, but, on searching, discover that I haven't. One of those topics is measured boot and trusted boot—sometimes misleadingly referred to as "secure boot." There are specific procedures that use these terms with capital letters (e.g., Secure Boot), which I'm going to try to avoid discussing in this article. I'm more interested in the generic processes—and a major potential downfall—than in trying to go into the ins and outs of specifics. What follows is a (heavily edited) excerpt from my forthcoming book on trust in computing and the cloud for [Wiley][2]. + +In order to understand what measured boot and trusted boot aim to achieve, look at the Linux virtualisation stack: the components you run if you want to use virtual machines (VMs) on a Linux machine. This description is arguably over-simplified, but (as I noted above) I'm not interested in the specifics but in what I'm trying to achieve. I'll concentrate on the bottom four layers (at a rather simple level of abstraction): CPU/management engine; BIOS/EFI; firmware; and hypervisor, but I'll also consider a layer _just_ above the CPU/management engine, which interposes a Trusted Platform Module (TPM) and some instructions for how to perform one of the two processes (_measured boot_ and _trusted boot_). Once the system starts to boot, the TPM is triggered and starts its work. Alternative roots of trust, such as hardware security modules (HSMs), might also be used, but I will use TPMs, the most common example in this context, in my example. + +In both cases (trusted boot and the measured boot), the basic flow starts with the TPM performing a measurement of the BIOS/EFI layer. This measurement involves checking the binary instructions to be carried out by this layer and creating a cryptographic hash of the binary image. The hash that's produced is then stored in one of several Platform Configuration Register (PCR) "slots" in the TPM. These can be thought of as pieces of memory that can be read later on - either by the TPM for its purposes or by entities external to the TPM - but that cannot be changed once they have been written. These pieces of memory are integrity protected from the time of their initially being written. This provides assurances that once a value is written to a PCR by the TPM, it can be considered constant for the lifetime of the system until power off or reboot. + +After measuring the BIOS/EFI layer, the next layer (firmware) is measured. In this case, the resulting hash is combined with the previous hash (which was stored in the PCR slot) and then also stored in a PCR slot. The process continues until all the layers involved in the process have been measured and the hashes' results have been stored. There are (sometimes quite complex) processes to set up the original TPM values (I've skipped some of the more low-level steps in the process for simplicity) and to allow (hopefully authorised) changes to the layers for upgrading or security patching, for example. This "measured boot" process allows for entities to query the TPM after the process has completed and to check whether the values in the PCR slots correspond to the expected values, pre-calculated with "known good" versions of the various layers—that is, pre-checked versions whose provenance and integrity have already been established. + +Various protocols exist to allow parties _external_ to the system to check the values (e.g., via a network connection) that the TPM attests to be correct: the process of receiving and checking such values from an external system is known as "remote attestation." + +This process—measured boot—allows you to find out whether the underpinnings of your system—the lowest layers—are what you think they are. But what if they're not? Measured boot (unsurprisingly, given the name) measures but doesn't perform any other actions. + +The alternative, "trusted boot," goes a step further. When a trusted boot process is performed, the process not only measures each value but also performs a check against a known (and expected!) good value at the same time. If the check fails, then the process will halt, and the booting of the system will fail. This may sound like a rather extreme approach to take on a system, but sometimes it is absolutely the right one. Where the system under consideration may have been compromised—which is one likely inference you can make from the failure of a trusted boot process—it is better for it to not be available at all than to be running based on flawed expectations. + +This is all very well if I am the owner of the system being measured, have checked all of the various components being measured (and the measurements), and am happy that what's being booted is what I want.[1][3] But what if I'm using a system on the cloud, for instance, or any system owned and managed by someone else? In that case, I'm trusting the cloud provider (or owner/manager) with two things: + + 1. Doing all the measuring correctly and reporting correct results to me + 2. Building something I should trust in the first place + + + +This is the problem with the nomenclature "trusted boot" and, even worse, "secure boot." Both imply that an absolute, objective property of a system has been established—it is "trusted" or "secure"—when this is clearly not the case. Obviously, it would be unfair to expect the designers of such processes to name them after the failure states—"untrusted boot" or "insecure boot"—but, unless I can be very certain that I trust the owner of the system to do step two entirely correctly (and in my best interests as the user of the system, rather than theirs as the owner), then I can make no stronger assertions. + +There is an enormous temptation to take a system that has gone through a trusted boot process and label it a "trusted system" when _the very best_ assertion you can make is that the particular layers measured in the measured and/or trusted boot process have been asserted to be those the process expects to be present. Such a process says nothing at all about the fitness of the layers to provide assurances of behaviour nor about the correctness (or fitness to provide assurances of behaviour) of any subsequent layers on top of those. + +It's important to note that designers of TPMs are quite clear what is being asserted and that assertions about trust should be made carefully and sparingly. Unluckily, however, the complexities of systems, the general low level of understanding of trust, and the complexities of context and transitive trust make it very easy for systems designers and implementors to do the wrong thing and assume that any system that has successfully performed a trusted boot process can be considered "trusted." It is also extremely important to remember that TPMs, as hardware roots of trust, offer one of the best mechanisms available for establishing a chain of trust in systems that you may be designing or implementing, and I plan to write an article about them soon. + +* * * + + 1. Although this turns out to be _much_ harder to do than you might expect! + + + +* * * + +_This article was originally published on [Alice, Eve, and Bob][4] and is reprinted with the author's permission._ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/measured-trusted-boot + +作者:[Mike Bursell][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mikecamel +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_computer_solve_fix_tool.png?itok=okq8joti (Brain on a computer screen) +[2]: https://wiley.com/ +[3]: tmp.HkXCfJwlpF#1 +[4]: https://aliceevebob.com/2020/09/08/measured-and-trusted-boot/ diff --git a/sources/tech/20201014 Web of Trust, Part 1- Concept.md b/sources/tech/20201014 Web of Trust, Part 1- Concept.md new file mode 100644 index 0000000000..b9eedecb3e --- /dev/null +++ b/sources/tech/20201014 Web of Trust, Part 1- Concept.md @@ -0,0 +1,86 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Web of Trust, Part 1: Concept) +[#]: via: (https://fedoramagazine.org/web-of-trust-part-1-concept/) +[#]: author: (Kevin "Eonfge" Degeling https://fedoramagazine.org/author/eonfge/) + +Web of Trust, Part 1: Concept +====== + +![][1] + +Every day we rely on technologies who nobody can fully understand. Since well before the industrial revolution, complex and challenging tasks required an approach that broke out the different parts into smaller scale tasks. Each resulting in specialized knowledge used in some parts of our lives, leaving other parts to trust in skills that others had learned. This shared knowledge approach also applies to software. Even the most avid readers of this magazine, will likely not compile and validate every piece of code they run. This is simply because the world of computers is itself also too big for one person to grasp. + +Still, even though it is nearly impossible to understand everything that happens within your PC when you are using it, that does not leave you blind and unprotected. FLOSS software shares trust, giving protection to all users, even if individual users can’t grasp all parts in the system. This multi-part article will discuss how this ‘Web of Trust’ works and how you can get involved. + +But first we’ll have to take a step back and discuss the basic concepts, before we can delve into the details and the web. Also, a note before we start, security is not just about viruses and malware. Security also includes your privacy, your economic stability and your technological independence. + +### One-Way System + +By their design, computers can only work and function in the most rudimentary ways of logic: _True_ or _false_. _And_ or _Or._ This (boolean logic) is not readily accessible to humans, therefore we must do something special. We write applications in a code that we can (reasonably) comprehend (human readable). Once completed, we turn this human readable code into a code that the computer can comprehend (machine code). + +The step of conversion is called compilation and/or building, and it’s a one-way process. Compiled code (machine code) is not really understandable by humans, and it takes special tools to study in detail. You can understand small chunks, but on the whole, an entire application becomes a black box. + +This subtle difference shifts power. Power, in this case being the influence of one person over another person. The person who has written the human-readable version of the application and then releases it as compiled code to use by others, knows all about what the code does, while the end user knows a very limited scope. When using (software) in compiled form, it is impossible to know for certain what an application is intended to do, unless the original human readable code can be viewed. + +### **The Nature of Power** + +Spearheaded by Richard Stallman, this shift of power became a point of concern. This discussion started in the 1980s, for this was the time that computers left the world of academia and research, and entered the world of commerce and consumers. Suddenly, that power became a source of control and exploitation. + +One way to combat this imbalance of power, was with the concept of FLOSS software. FLOSS Software is built on [4-Freedoms][2], which gives you a wide array of other ‘affiliated’ rights and guarantees. In essence, FLOSS software uses copyright-licensing as a form of moral contract, that forces software developers not to leverage the one-way power against their users. The principle way of doing this, is with the the GNU General Public Licenses, which Richard Stallman created and has since been promoting. + +One of those guarantees, is that you can see the code that should be running on your device. When you get a device using FLOSS software, then the manufacturer should provide you the code that the device is using, as well as all instructions that you need to compile that code yourself. Then you can replace the code on the device with the version you can compile yourself. Even better, if you compare the version you have with the version on the device, you can see if the device manufacturer tried to cheat you or other customers. + +This is where the web of Trust comes back into the picture. The Web of Trust implies that even if the vast majority of people can’t validate the workings of a device, that others can do so on their behalf. Journalists, security analysts and hobbyists, can do the work that others might be unable to do. And if they find something, they have the power to share their findings. + +### Security by B**lind** **Trust** + +This is of course, if the application and all components underneath it, are FLOSS. Proprietary software, or even software which is merely Open Source, has compiled versions that nobody can recreate and validate. Thus, you can never truly know if that software is secure. It might have a backdoor, it might sell your personal data, or it might be pushing a closed ecosystem to create a vendor-lock. With closed-source software, your security is as good as the company making the software is trustworthy. + +For companies and developers, this actually creates another snare. While you might still care about your users and their security, you’re a liability: If a criminal can get to your official builds or supply-chain, then there is no way for anybody to discover that afterwards. An increasing number of attacks do not target users directly, but instead try to get in, by exploiting the trust the companies/developers have carefully grown. + +You should also not underestimate pressure from outside: Governments can ask you to ignore a vulnerability, or they might even demand cooperation. Investment firms or shareholders, may also insist that you create a vendor-lock for future use. The blind trust that you demand of your users, can be used against you. + +### Security by a Web of Trust + +If you are a user, FLOSS software is good because others can warn you when they find suspicious elements. You can use any FLOSS device with minimal economic risk, and there are many FLOSS developers who care for your privacy. Even if the details are beyond you, there are rules in place to facilitate trust. + +If you are a tinkerer, FLOSS is good because with a little extra work, you can check the promises of others. You can warn people when something goes wrong, and you can validate the warnings of others. You’re also able to check individual parts in a larger picture. The libraries used by FLOSS applications, are also open for review: It’s “Trust all the way down”. + +For companies and developers, FLOSS is also a great reassurance that your trust can’t be easily subverted. If malicious actors wish to attack your users, then any irregularity can quickly be spotted. Last but not least, since you also stand to defend your customers economic well-being and privacy, you can use that as an important selling point to customers who care about their own security. + +### Fedora’s case + +Fedora embraces the concept of FLOSS and it stands strong to defend it. There are comprehensive [legal guidelines][3], and Fedora’s principles are directly referencing the 4-Freedoms: [Freedom, Friends, Features, and First][4] + +![][5] + +To this end, entire systems have been set up to facilitate this kind of security. Fedora works completely in the open, and any user can check the official servers. [Koji][6] is the name of the Fedora Buildsystem, and you can see every application and it’s build logs there. For added security, there is also [Bohdi][7], which orchestrates the deployment of an application. Multiple people must approve it, before the application can become available. + +This creates the Web of Trust on which you can rely. Every package in the repository goes through the same process, and at every point somebody can intervene. There are also escalation systems in place to report issues, so that issues can quickly be tackled when they occur. Individual contributors also know that they can be reviewed at every time, which itself is already enough of a precaution to dissuade mischievous thoughts. + +You don’t have to trust Fedora (implicitly), you can get something better; trust in users like you. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/web-of-trust-part-1-concept/ + +作者:[Kevin "Eonfge" Degeling][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/09/weboftrust1-816x345.jpg +[2]: https://fsfe.org/freesoftware/freesoftware.en.html +[3]: https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing +[4]: https://docs.fedoraproject.org/en-US/project/ +[5]: https://fedoramagazine.org/wp-content/uploads/2020/09/foundations_expand_1_freedom.png +[6]: https://koji.fedoraproject.org/koji/index +[7]: https://bodhi.fedoraproject.org/ diff --git a/sources/tech/20201016 systemd-resolved- introduction to split DNS.md b/sources/tech/20201016 systemd-resolved- introduction to split DNS.md new file mode 100644 index 0000000000..0801dd90fa --- /dev/null +++ b/sources/tech/20201016 systemd-resolved- introduction to split DNS.md @@ -0,0 +1,162 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (systemd-resolved: introduction to split DNS) +[#]: via: (https://fedoramagazine.org/systemd-resolved-introduction-to-split-dns/) +[#]: author: (zbyszek https://fedoramagazine.org/author/zbyszek/) + +systemd-resolved: introduction to split DNS +====== + +![][1] + +Photo by [Ruvim Noga][2] on [Unsplash][3] + +Fedora 33 switches the default DNS resolver to [systemd-resolved][4]. In simple terms, this means that systemd-resolved will run as a daemon. All programs wanting to translate domain names to network addresses will talk to it. This replaces the current default lookup mechanism where each program individually talks to remote servers and there is no shared cache. + +If necessary, systemd-resolved will contact remote DNS servers. systemd-resolved is a “stub resolver”—it doesn’t resolve all names itself (by starting at the root of the DNS hierarchy and going down label by label), but forwards the queries to a remote server. + +A single daemon handling name lookups provides significant benefits. The daemon caches answers, which speeds answers for frequently used names. The daemon remembers which servers are non-responsive, while previously each program would have to figure this out on its own after a timeout. Individual programs only talk to the daemon over a local transport and are more isolated from the network. The daemon supports fancy rules which specify which name servers should be used for which domain names—in fact, the rest of this article is about those rules. + +### Split DNS + +Consider the scenario of a machine that is connected to two semi-trusted networks (wifi and ethernet), and also has a VPN connection to your employer. Each of those three connections has its own network interface in the kernel. And there are multiple name servers: one from a DHCP lease from the wifi hotspot, two specified by the VPN and controlled by your employer, plus some additional manually-configured name servers. _Routing_ is the process of deciding which servers to ask for a given domain name. Do not mistake this with the process of deciding where to send network packets, which is called routing too. + +The network interface is king in systemd-resolved. systemd-resolved first picks one or more interfaces which are appropriate for a given name, and then queries one of the name servers attached to that interface. This is known as “split DNS”. + +There are two flavors of domains attached to a network interface: _routing domains_ and _search domains_. They both specify that the given domain and any subdomains are appropriate for that interface. Search domains have the additional function that single-label names are suffixed with that search domain before being resolved. For example, a lookup for “server” is treated as a lookup for “server.example.com” if the search domain is “example.com.” In systemd-resolved config files, routing domains are prefixed with the tilde (~) character. + +#### Specific example + +Now consider a specific example: your VPN interface _tun0_ has a search domain _private.company.com_ and a routing domain _~company.com_. If you ask for _mail.private.company.com_, it is matched by both domains, so this name would be routed to _tun0_. + +A request for _[www.company.com][5]_ is matched by the second domain and would also go to _tun0_. If you ask for _www_, (in other words, if you specify a single-label name without any dots), the difference between routing and search domains comes into play. systemd-resolved attempts to combine the single-label name with the search domain and tries to resolve _[www.private.company.com][6]_ on _tun0_. + +If you have multiple interfaces with search domains, single-label names are suffixed with all search domains and resolved in parallel. For multi-label names, no suffixing is done; search and routing domains are are used to route the name to the appropriate interface. The longest match wins. When there are multiple matches of the same length on different interfaces, they are resolved in parallel. + +A special case is when an interface has a routing domain _~._ (a tilde for a routing domain and a dot for the root DNS label). Such an interface always matches any names, but with the shortest possible length. Any interface with a matching search or routing domain has higher priority, but the interface with _~._ is used for all other names. Finally, if no routing or search domains matched, the name is routed to all interfaces that have at least one name server attached. + +### Lookup routing in systemd-resolved + +#### Domain routing + +This seems fairly complex, partially because of the historic names which are confusing. In actual practice it’s not as complicated as it seems. + +To introspect a running system, use the _resolvectl domain_ command. For example: + +``` +$ resolvectl domain +Global: +Link 4 (wlp4s0): ~. +Link 18 (hub0): +Link 26 (tun0): redhat.com +``` + +You can see that _www_ would resolve as _[www.redhat.com][7]_. over _tun0_. Anything ending with _redhat.com_ resolves over _tun0_. Everything else would resolve over _wlp4s0_ (the wireless interface). In particular, a multi-label name like _[www.foobar][8]_ would resolve over _wlp4s0_, and most likely fail because there is no _foobar_ top-level domain (yet). + +#### Server routing + +Now that you know which _interface_ or interfaces should be queried, the _server_ or servers to query are easy to determine. Each interface has one or more name servers configured. systemd-resolved will send queries to the first of those. If the server is offline and the request times out or if the server sends a syntactically-invalid answer (which shouldn’t happen with “normal” queries, but often becomes an issue when DNSSEC is enabled), systemd-resolved switches to the next server on the list. It will use that second server as long as it keeps responding. All servers are used in a round-robin rotation. + +To introspect a running system, use the _resolvectl dns_ command: + +``` +$ resolvectl dns +Global: +Link 4 (wlp4s0): 192.168.1.1 8.8.4.4 8.8.8.8 +Link 18 (hub0): +Link 26 (tun0): 10.45.248.15 10.38.5.26 +``` + +When combined with the previous listing, you know that for _[www.redhat.com][7]_, systemd-resolved will query 10.45.248.15, and—if it doesn’t respond—10.38.5.26. For _[www.google.com][9]_, systemd-resolved will query 192.168.1.1 or the two Google servers 8.8.4.4 and 8.8.8.8. + +### Differences from nss-dns + +Before going further detail, you may ask how this differs from the previous default implementation (nss-dns). With nss-dns there is just one global list of up to three name servers and a global list of search domains (specified as _nameserver_ and _search_ in _/etc/resolv.conf_). + +Each name to query is sent to the first name server. If it doesn’t respond, the same query is sent to the second name server, and so on. systemd-resolved implements split-DNS and remembers which servers are currently considered active. + +For single-label names, the query is performed with each of the the search domains suffixed. This is the same with systemd-resolved. For multi-label names, a query for the unsuffixed name is performed first, and if that fails, a query for the name suffixed by each of the search domains in turn is performed. systemd-resolved doesn’t do that last step; it only suffixes single-label names. + +A second difference is that with _nss-dns_, this module is loaded into each process. The process itself communicates with remote servers and implements the full DNS stack internally. With systemd-resolved, the _nss-resolve_ module is loaded into the process, but it only forwards the query to systemd-resolved over a local transport (D-Bus) and doesn’t do any work itself. The systemd-resolved process is heavily sandboxed using systemd service features. + +The third difference is that with systemd-resolved all state is dynamic and can be queried and updated using D-Bus calls. This allows very strong integration with other daemons or graphical interfaces. + +### Configuring systemd-resolved + +So far, this article talked about servers and the routing of domains without explaining how to configure them. systemd-resolved has a configuration file (_/etc/systemd/resolv.conf_) where you specify name servers with _DNS=_ and routing or search domains with _Domains=_ (routing domains with _~_, search domains without). This corresponds to the _Global:_ lists in the two listings above. + +In this article’s examples, both lists are empty. Most of the time configuration is attached to specific interfaces, and “global” configuration is not very useful. Interfaces come and go and it isn’t terribly smart to contact servers on an interface which is down. As soon as you create a VPN connection, you want to use the servers configured for that connection to resolve names, and as soon as the connection goes down, you want to stop. + +How does then systemd-resolved acquire the configuration for each interface? This happens dynamically, with the network management service pushing this configuration over D-Bus into systemd-resolved. The default in Fedora is NetworkManager and it has very good integration with systemd-resolved. Alternatives like systemd’s own systemd-networkd implement similar functionality. But the [interface is open][10] and other programs can do the appropriate D-Bus calls. + +Alternatively, _resolvectl_ can be used for this (it is just a wrapper around the D-Bus API). Finally, _resolvconf_ provides similar functionality in a form compatible with a tool in Debian with the same name. + +#### Scenario: Local connection more trusted than VPN + +The important thing is that in the common scenario, systemd-resolved follows the configuration specified by other tools, in particular NetworkManager. So to understand how systemd-resolved names, you need to see what NetworkManager tells it to do. Normally NM will tell systemd-resolved to use the name servers and search domains received in a DHCP lease on some interface. For example, look at the source of configuration for the two listings shown above: + +![][11]![][12] + +There are two connections: “Parkinson” wifi and “Brno (BRQ)” VPN. In the first panel _DNS:Automatic_ is enabled, which means that the DNS server received as part of the DHCP lease (192.168.1.1) is passed to systemd-resolved. Additionally. 8.8.4.4 and 8.8.8.8 are listed as alternative name servers. This configuration is useful if you want to resolve the names of other machines in the local network, which 192.168.1.1 provides. Unfortunately the hotspot DNS server occasionally gets stuck, and the other two servers provide backup when that happens. + +The second panel is similar, but doesn’t provide any special configuration. NetworkManager combines routing domains for a given connection from DHCP, SLAAC RDNSS, and VPN, and finally manual configuration and forward this to systemd-resolved. This is the source of the search domain _redhat.com_ in the listing above. + +There is an important difference between the two interfaces though: in the second panel, “Use this connection only for resources on its network” is **checked**. This tells NetworkManager to tell systemd-resolved to only use this interface for names under the search domain received as part of the lease (_Link 26 (tun0): redhat.com_ in the first listing above). In the first panel, this checkbox is **unchecked**, and NetworkManager tells systemd-resolved to use this interface for all other names (_Link 4 (wlp4s0): ~._). This effectively means that the wireless connection is more trusted. + +#### Scenario: VPN more trusted than local network + +In a different scenario, a VPN would be more trusted than the local network and the domain routing configuration reversed. If a VPN without “Use this connection only for resources on its network” is active, NetworkManager tells systemd-resolved to attach the default routing domain to this interface. After unchecking the checkbox and restarting the VPN connection: + +``` +$ resolvectl domain +Global: +Link 4 (wlp4s0): +Link 18 (hub0): +Link 28 (tun0): ~. redhat.com +$ resolvectl dns +Global: +Link 4 (wlp4s0): +Link 18 (hub0): +Link 28 (tun0): 10.45.248.15 10.38.5.26 +``` + +Now all domain names are routed to the VPN. The network management daemon controls systemd-resolved and the user controls the network management daemon. + +### Additional systemd-resolved functionality + +As mentioned before, systemd-resolved provides a common name lookup mechanism for all programs running on the machine. Right now the effect is limited: shared resolver and cache and split DNS (the lookup routing logic described above). systemd-resolved provides additional resolution mechanisms beyond the traditional unicast DNS. These are the local resolution protocols MulticastDNS and LLMNR, and an additional remote transport DNS-over-TLS. + +Fedora 33 does not enable MulticastDNS and DNS-over-TLS in systemd-resolved. MulticastDNS is implemented by _nss-mdns4_minimal_ and Avahi. Future Fedora releases may enable these as the upstream project improves support. + +Implementing this all in a single daemon which has runtime state allows smart behaviour: DNS-over-TLS may be enabled in opportunistic mode, with automatic fallback to classic DNS if the remote server does not support it. Without the daemon which can contain complex logic and runtime state this would be much harder. When enabled, those additional features will apply to all programs on the system. + +There is more to systemd-resolved: in particular LLMNR and DNSSEC, which only received brief mention here. A future article will explore those subjects. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/systemd-resolved-introduction-to-split-dns/ + +作者:[zbyszek][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/zbyszek/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/10/systemd-resolved2-816x345.jpg +[2]: https://unsplash.com/@ruvimnogaphoto?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/colors?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html +[5]: http://www.company.com +[6]: http://www.private.company.com +[7]: http://www.redhat.com +[8]: http://www.foobar +[9]: http://www.google.com +[10]: https://www.freedesktop.org/software/systemd/man/org.freedesktop.resolve1.html +[11]: https://fedoramagazine.org/wp-content/uploads/2020/10/nm-default-network-with-additional-servers.png +[12]: https://fedoramagazine.org/wp-content/uploads/2020/10/nm-vpn-brno.png diff --git a/sources/tech/20201019 Web of Trust, Part 2- Tutorial.md b/sources/tech/20201019 Web of Trust, Part 2- Tutorial.md new file mode 100644 index 0000000000..b5e17fc7cc --- /dev/null +++ b/sources/tech/20201019 Web of Trust, Part 2- Tutorial.md @@ -0,0 +1,198 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Web of Trust, Part 2: Tutorial) +[#]: via: (https://fedoramagazine.org/web-of-trust-part-2-tutorial/) +[#]: author: (Kevin "Eonfge" Degeling https://fedoramagazine.org/author/eonfge/) + +Web of Trust, Part 2: Tutorial +====== + +![][1] + +["The spider web"][2] by [bluesbby][3] is licensed under [CC BY 2.0][4][][4] + +The [previous article][5] looked at how the Web of Trust works in concept, and how the Web of Trust is implemented at Fedora. In this article, you’ll learn how to do it yourself. The power of this system lies in everybody being able to validate the actions of others—if you know how to validate somebody’s work, you’re contributing to the strength of our shared security. + +### Choosing a project + +[Remmina][6] is a remote desktop client written in GTK+. It aims to be useful for system administrators and travelers who need to work with lots of remote computers in front of either large monitors or tiny netbooks. In the current age, where many people must work remotely or at least manage remote servers, the security of a program like Remmina is critical. Even if you do not use it yourself, you can contribute to the Web of Trust by checking it for others. + +The question is: how do you know that a given version of Remmina is good, and that the original developer—or distribution server—has not been compromised? + +For this tutorial, you’ll use [Flatpak][7] and the [Flathub][8] repository. Flatpak is intentionally well-suited for making verifiable rebuilds, which is one of the tenets of the Web of Trust. It’s easier to work with since it doesn’t require users to download independent development packages. Flatpak also uses techniques to prevent in‑flight tampering, using hashes to validate its read‑only state. As far as the Web of Trust is concerned, Flatpak is the future. + +For this guide, you use Remmina, but this guide generally applies to every application you use. It’s also not exclusive to Flatpak, and the general steps also apply to Fedora’s repositories. In fact, if you’re currently reading this article on Debian or Arch, you can still follow the instructions. If you want to follow along using traditional RPM repositories, make sure to check out [this article][9]. + +### Installing and checking + +To install Remmina, use the Software Center or run the following from a terminal: + +``` +flatpak install flathub org.remmina.Remmina -y +``` + +After installation, you’ll find the files in: + +``` +/var/lib/flatpak/app/org.remmina.Remmina/current/active/files/ +``` + +Open a terminal here and find the following directories using _ls -la_: + +``` +total 44 +drwxr-xr-x. 2 root root 4096 Jan 1 1970 bin +drwxr-xr-x. 3 root root 4096 Jan 1 1970 etc +drwxr-xr-x. 8 root root 4096 Jan 1 1970 lib +drwxr-xr-x. 2 root root 4096 Jan 1 1970 libexec +-rw-r--r--. 2 root root 18644 Aug 25 14:37 manifest.json +drwxr-xr-x. 2 root root 4096 Jan 1 1970 sbin +drwxr-xr-x. 15 root root 4096 Jan 1 1970 share +``` + +#### Getting the hashes + +In the _bin_ directory you will find the main binaries of the application, and in _lib_ you find all dependencies that Remmina uses. Now calculate a hash for _./bin/remmina_: + +``` +sha256sum ./bin/* +``` + +This will give you a list of numbers: checksums. Copy them to a temporary file, as this is the current version of Remmina that Flathub is distributing. These numbers have something special: only an exact copy of Remmina can give you the same numbers. Any change in the code—no matter how minor—will produce different numbers. + +Like Fedora’s Koji and Bodhi build and update services, Flathub has all its build servers in plain view. In the case of Flathub, look at [Buildbot][10] to see who is responsible for the official binaries of a package. Here you will find all of the logs, including all the failed builds and their paper trail. + +![][11] + +#### Getting the source + +The main Flathub project is hosted on GitHub, where the exact compile instructions (“manifest” in Flatpak terms) are visible for all to see. Open a new terminal in your Home folder. Clone the instructions, and possible submodules, using one command: + +``` +git clone --recurse-submodules https://github.com/flathub/org.remmina.Remmina +``` + +#### Developer tools + +Start off by installing the Flatpak Builder: + +``` +sudo dnf install flatpak-builder +``` + +After that, you’ll need to get the right SDK to rebuild Remmina. In the manifest, you’ll find the current SDK is. + +``` +"runtime": "org.gnome.Platform", + "runtime-version": "3.38", + "sdk": "org.gnome.Sdk", + "command": "remmina", +``` + +This indicates that you need the GNOME SDK, which you can install with: + +``` +flatpak install org.gnome.Sdk//3.38 +``` + +This provides the latest versions of the Free Desktop and GNOME SDK. There are also additional SDK’s for additional options, but those are beyond the scope of this tutorial. + +#### Generating your **own hashes** + +Now that everything is set up, compile your version of Remmina by running: + +``` +flatpak-builder build-dir org.remmina.Remmina.json --force-clean +``` + +After this, your terminal will print a lot of text, your fans will start spinning, and you’re compiling Remmina. If things do not go so smoothly, refer to the [Flatpak Documentation][12]; troubleshooting is beyond the scope of this tutorial. + +Once complete, you should have the directory ._/build-dir/files/_, which should contain the same layout as above. Now the moment of truth: it’s time to generate the hashes for the built project: + +``` +sha256sum ./bin/* +``` + +![][13] + +You should get exactly the same numbers. This proves that the version on Flathub is indeed the version that the Remmina developers and maintainers intended for you to run. This is great, because this shows that Flathub has not been compromised. The web of trust is strong, and you just made it a bit better. + +### Going deeper + +But what about the _./lib/_ directory? And what version of Remmina did you actually compile? This is where the Web of Trust starts to branch. First, you can also double-check the hashes of the _./lib/_ directory. Repeat the _sha256sum_ command using a different directory. + +But what version of Remmina did you compile? Well, that’s in the Manifest. In the text file you’ll find (usually at the bottom) the git repository and branch that you just used. At the time of this writing, that is: + +``` +"type": "git", +"url": "https://gitlab.com/Remmina/Remmina.git", +"tag": "v1.4.8", +"commit": "7ebc497062de66881b71bbe7f54dabfda0129ac2" +``` + +Here, you can decide to look at the Remmina code itself: + +``` +git clone --recurse-submodules https://gitlab.com/Remmina/Remmina.git +cd ./Remmina +git checkout tags/v1.4.8 +``` + +The last two commands are important, since they ensure that you are looking at the right version of Remmina. Make sure you use the corresponding tag of the Manifest file. you can see everything that you just built. + +### What if…? + +The question on some minds is: what if the hashes don’t match? Quoting a famous novel: “Don’t Panic.” There are multiple legitimate reasons as to why the hashes do not match. + +It might be that you are not looking at the same version. If you followed this guide to a T, it should give matching results, but minor errors will cause vastly different results. Repeat the process, and ask for help if you’re unsure if you’re making errors. Perhaps Remmina is in the process of updating. + +But if that still doesn’t justify the mismatch in hashes, go to the [maintainers of Remmina][14] on Flathub and open an issue. Assume good intentions, but you might be onto something that isn’t totally right. + +The most obvious upstream issue is that Remmina does not properly support reproducible builds yet. The code of Remmina needs to be written in such a way that repeating the same action twice, gives the same result. For developers, there is an [entire guide][15] on how to do that. If this is the case, there should be an issue on the upstream bug-tracker, and if it is not there, make sure that you create one by explaining your steps and the impact. + +If all else fails, and you’ve informed upstream about the discrepancies and they to don’t know what is happening, then it’s time to send an email to the Administrators of Flathub and the developer in question. + +### Conclusion + +At this point, you’ve gone through the entire process of validating a single piece of a bigger picture. Here, you can branch off in different directions: + + * Try another Flatpak application you like or use regularly + * Try the RPM version of Remmina + * Do a deep dive into the C code of Remmina + * Relax for a day, knowing that the Web of Trust is a collective effort + + + +In the grand scheme of things, we can all carry a small part of responsibility in the Web of Trust. By taking free/libre open source software (FLOSS) concepts and applying them in the real world, you can protect yourself and others. Last but not least, by understanding how the Web of Trust works you can see how FLOSS software provides unique protections. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/web-of-trust-part-2-tutorial/ + +作者:[Kevin "Eonfge" Degeling][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/09/weboftrust2-816x345.jpg +[2]: https://www.flickr.com/photos/17367470@N05/21329974875 +[3]: https://www.flickr.com/photos/17367470@N05 +[4]: https://creativecommons.org/licenses/by/2.0/?ref=ccsearch&atype=html +[5]: https://fedoramagazine.org/web-of-trust-part-1-concept/ +[6]: https://remmina.org/ +[7]: https://flatpak.org/ +[8]: https://flathub.org/home +[9]: https://fedoramagazine.org/how-rpm-packages-are-made-the-source-rpm/ +[10]: https://flathub.org/builds/#/ +[11]: https://fedoramagazine.org/wp-content/uploads/2020/09/Screenshot_2020-09-24-Flathub-builds-1024x434.png +[12]: https://docs.flatpak.org/en/latest/building.html +[13]: https://fedoramagazine.org/wp-content/uploads/2020/09/Screenshot-from-2020-09-22-21-49-47.png +[14]: https://github.com/flathub/org.remmina.Remmina +[15]: https://reproducible-builds.org/ diff --git a/sources/tech/20201021 Incremental backup with Butterfly Backup.md b/sources/tech/20201021 Incremental backup with Butterfly Backup.md new file mode 100644 index 0000000000..5c2b99d950 --- /dev/null +++ b/sources/tech/20201021 Incremental backup with Butterfly Backup.md @@ -0,0 +1,290 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Incremental backup with Butterfly Backup) +[#]: via: (https://fedoramagazine.org/butterfly-backup/) +[#]: author: (Matteo Guadrini https://fedoramagazine.org/author/matteoguadrini/) + +Incremental backup with Butterfly Backup +====== + +![][1] + +### Introduction + +This article explains how to make incremental or differential backups, with a catalog available to restore (or export) at the point you want, with [Butterfly Backup][2]. + +#### Requirements + +Butterfly Backup is a simple wrapper of rsync written in python; the first requirement is **[python3.3][3]** or higher (plus module [cryptography][4] for _init_ action). Other requirements are **[openssh][5]** and **[rsync][6]** (version 2.5 or higher). Ok, let’s go! + +[Editors note: rsync version 3.2.3 is already installed on Fedora 33 systems] + +``` +$ sudo dnf install python3 openssh rsync git +$ sudo pip3 install cryptography +``` + +### Installation + +After that, installing Butterfly Backup is very simple by using the following commands to clone the repository locally, and set up Butterfly Backup for use: + +``` +$ git clone https://github.com/MatteoGuadrini/Butterfly-Backup.git +$ cd Butterfly-Backup +$ sudo python3 setup.py +$ bb --help +$ man bb +``` + +To upgrade, you would use the same commands too. + +### Example + +Butterfly Backup is a server to client tool and is installed on a server (or workstation). The restore process restores the files into the specified client. This process shares some of the options available to the backup process. + +Backups are organized accord to precise catalog; this is an example: + +``` +$ tree destination/of/backup +. +├── destination +│ ├── hostname or ip of the PC under backup +│ │ ├── timestamp folder +│ │ │ ├── backup folders +│ │ │ ├── backup.log +│ │ │ └── restore.log +│ │ ├─── general.log +│ │ └─── symlink of last backup +│ +├── export.log +├── backup.list +└── .catalog.cfg +``` + +Butterfly Backup has six main operations, referred to as **actions**, you can get information about them with the _–help_ command. + +``` +$ bb --help +usage: bb [-h] [--verbose] [--log] [--dry-run] [--version] + {config,backup,restore,archive,list,export} ... + +Butterfly Backup + +optional arguments: + -h, --help show this help message and exit + --verbose, -v Enable verbosity + --log, -l Create a log + --dry-run, -N Dry run mode + --version, -V Print version + +action: + Valid action + + {config,backup,restore,archive,list,export} + Available actions + config Configuration options + backup Backup options + restore Restore options + archive Archive options + list List options + export Export options +``` + +#### Configuration + +Configuration mode is straight forward; If you’re already familiar with the exchange keys and OpenSSH, you probably won’t need it. First, you must create a configuration (rsa keys), for instance: + +``` +$ bb config --new +SUCCESS: New configuration successfully created! +``` + +After creating the configuration, the keys will be installed (copied) on the hosts you want to backup: + +``` +$ bb config --deploy host1 +Copying configuration to host1; write the password: +/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/arthur/.ssh/id_rsa.pub" +/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed +/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys +arthur@host1's password: + +Number of key(s) added: 1 + +Now try logging into the machine, with: "ssh 'arthur@host1'" +and check to make sure that only the key(s) you wanted were added. + +SUCCESS: Configuration copied successfully on host1! +``` + +#### Backup + +There are two backup modes: _single_ and _bulk_. +The most relevant features of the two backup modes are the parallelism and retention of old backups. See the two parameters _–parallel_ and _–retention_ in the [documentation][7]. + +##### Single backup + +The backup of a single machine consists in taking the files and folders indicated in the command line, and putting them into the cataloging structure indicated above. In other words, copy all file and folders of a machine into a path. + +This is an examples: + +``` +$ bb backup --computer host1 --destination /mnt/backup --data User Config --type Unix +Start backup on host1 +SUCCESS: Command rsync -ah --no-links arthur@host1:/home :/etc /mnt/backup/host1/2020_09_19__10_28 +``` + +##### Bulk backup + +Above all, bulk mode backups share the same options as single mode, with the difference that they accept a file containing a list of hostnames or ips. In this mode backups will performed in parallel (by default 5 machines at a time). Above all, if you want to run fewer or more machines in parallel, specify the _–parallel_ parameter. + +Incremental of the previous backup, for instance: + +``` +$ cat /home/arthur/pclist.txt +host1 +host2 +host3 +$ bb backup --list /home/arthur/pclist.txt --destination /mnt/backup --data User Config --type Unix +ERROR: The port 22 on host2 is closed! +ERROR: The port 22 on host3 is closed! +Start backup on host1 +SUCCESS: Command rsync -ahu --no-links --link-dest=/mnt/backup/host1/2020_09_19__10_28 arthur@host1:/home :/etc /mnt/backup/host1/2020_09_19__10_50 +``` + +There are four backup modes, which you specify with the _–mode_ flag: **Full** (backup all files) , **Mirror** (backup all files in mirror mode), **Differential** (is based on the latest _Full_ backup) and **Incremental** (is based on the latest backup). +The default mode is _Incremental_; _Full_ mode is set by default when the flag is not specified. + +#### Listing catalog + +The first time you run backup commands, the catalog is created. The catalog is used for future backups and all the restores that are made through Butterfly Backup. To query this catalog use the list command. +First, let’s query the catalog in our example: + +``` +$ bb list --catalog /mnt/backup + +BUTTERFLY BACKUP CATALOG + +Backup id: aba860b0-9944-11e8-a93f-005056a664e0 +Hostname or ip: host1 +Timestamp: 2020-09-19 10:28:12 + +Backup id: dd6de2f2-9a1e-11e8-82b0-005056a664e0 +Hostname or ip: host1 +Timestamp: 2020-09-19 10:50:59 +``` + +Press _q_ for exit and select a backup-id: + +``` +$ bb list --catalog /mnt/backup --backup-id dd6de2f2-9a1e-11e8-82b0-005056a664e0 +Backup id: dd6de2f2-9a1e-11e8-82b0-005056a664e0 +Hostname or ip: host1 +Type: Incremental +Timestamp: 2020-09-19 10:50:59 +Start: 2020-09-19 10:50:59 +Finish: 2020-09-19 11:43:51 +OS: Unix +ExitCode: 0 +Path: /mnt/backup/host1/2020_09_19__10_50 +List: backup.log +etc +home +``` + +To export the catalog list use it with an external tool like _cat_, include the _–_–_log_ flag: + +``` +$ bb list --catalog /mnt/backup --log +$ cat /mnt/backup/backup.list +``` + +#### Restore + +The restore process is the exact opposite of the backup process. It takes the files from a specific backup and push it to the destination computer. +This command perform a restore on the same machine of the backup, for instance: + +``` +$ bb restore --catalog /mnt/backup --backup-id dd6de2f2-9a1e-11e8-82b0-005056a664e0 --computer host1 --log +Want to do restore path /mnt/backup/host1/2020_09_19__10_50/etc? To continue [Y/N]? y +Want to do restore path /mnt/backup/host1/2020_09_19__10_50/home? To continue [Y/N]? y +SUCCESS: Command rsync -ahu -vP --log-file=/mnt/backup/host1/2020_09_19__10_50/restore.log /mnt/backup/host1/2020_09_19__10_50/etc arthur@host1:/restore_2020_09_19__10_50 +SUCCESS: Command rsync -ahu -vP --log-file=/mnt/backup/host1/2020_09_19__10_50/restore.log /mnt/backup/host1/2020_09_19__10_50/home/* arthur@host1:/home +``` + +> Without specifying the “_type_” flag that indicates the operating system on which the data are being retrieved, Butterfly Backup will select it directly from the catalog via the backup-id. + +#### Archive old backup + +Archive operations are used to store backups by saving disk space. + +``` +$ bb archive --catalog /mnt/backup/ --days 1 --destination /mnt/archive/ --verbose --log +INFO: Check archive this backup f65e5afe-9734-11e8-b0bb-005056a664e0. Folder /mnt/backup/host1/2020_09_18__17_50 +INFO: Check archive this backup 4f2b5f6e-9939-11e8-9ab6-005056a664e0. Folder /mnt/backup/host1/2020_09_15__07_26 +SUCCESS: Delete /mnt/backup/host1/2020_09_15__07_26 successfully. +SUCCESS: Archive /mnt/backup/host1/2020_09_15__07_26 successfully. +$ ls /mnt/archive +host1 +$ ls /mnt/archive/host1 +2020_09_15__07_26.zip +``` + +After that, look in the catalog and see that the backup was actually archived: + +``` +$ bb list --catalog /mnt/backup/ -i 4f2b5f6e-9939-11e8-9ab6-005056a664e0 +Backup id: 4f2b5f6e-9939-11e8-9ab6-005056a664e0 +Hostname or ip: host1 +Type: Incremental +Timestamp: 2020-09-15 07:26:46 +Start: 2020-09-15 07:26:46 +Finish: 2020-09-15 08:43:45 +OS: Unix +ExitCode: 0 +Path: /mnt/backup/host1/2020_09_15__07_26 +Archived: True +``` + +### Conclusion + +Butterfly Backup was born from a very complex need; this tool provides superpowers to rsync, automates the backup and restore process. In addition, the catalog allows you to have a system similar to a “time machine”. + +In conclusion, Butterfly Backup is a lightweight, versatile, simple and scriptable backup tool. + +One more thing; Easter egg: _**bb** -Vv_ + +Thank you for reading my post. + +Full documentation: [https://butterfly-backup.readthedocs.io/][7] +Github: + +* * * + +_Photo by [Manu M][8] on [Unsplash][9]_. + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/butterfly-backup/ + +作者:[Matteo Guadrini][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://fedoramagazine.org/author/matteoguadrini/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2020/09/butterfly-backup-816x345.jpg +[2]: https://matteoguadrini.github.io/Butterfly-Backup/ +[3]: https://fedoramagazine.org/help-port-python-packages-python-3/ +[4]: https://cryptography.io/en/latest/ +[5]: https://fedoramagazine.org/open-source-ssh-clients/ +[6]: https://fedoramagazine.org/scp-users-migration-guide-to-rsync/ +[7]: https://butterfly-backup.readthedocs.io/en/latest/ +[8]: https://unsplash.com/@leocub?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[9]: https://unsplash.com/s/photos/butterfly?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText diff --git a/sources/tech/20201023 New open source project crowdsources internet security.md b/sources/tech/20201023 New open source project crowdsources internet security.md new file mode 100644 index 0000000000..ae1fad82ff --- /dev/null +++ b/sources/tech/20201023 New open source project crowdsources internet security.md @@ -0,0 +1,89 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (New open source project crowdsources internet security) +[#]: via: (https://opensource.com/article/20/10/crowdsec) +[#]: author: (Philippe Humeau https://opensource.com/users/philippe-humeau) + +New open source project crowdsources internet security +====== +CrowdSec aims to leverage the power of the crowd to create a very +accurate IP reputation database +![Lots of people in a crowd.][1] + +[CrowdSec][2] is a new security project designed to protect servers, services, containers, or virtual machines exposed on the internet with a server-side agent. It was inspired by [Fail2Ban][3] and aims to be a modernized, collaborative version of that intrusion-prevention framework. + +CrowdSec is free and open source (under an MIT License), with the source code available on [GitHub][4]. It is currently is available for Linux, with ports to macOS and Windows on the roadmap. + +### How CrowdSec works + +CrowdSec is written in Golang and was designed to run on modern, complex architectures such as clouds, lambdas, and containers. To achieve this, it's "decoupled," meaning you can "detect here" (e.g., in your database logs) and "remedy there" (e.g., in your firewall or rproxy). + +The tool uses [leaky buckets][5] internally to allow for tight event control. Scenarios are written in YAML to make them as simple and readable as possible without sacrificing granularity. The inference engine lets you get insights from chain buckets or meta-buckets, meaning if several buckets (e.g., web scan, port scan, and login attempt failed) overflow into a "meta-bucket," you can trigger a "targeted attack" remediation. + +Aggressive Internet Protocols (IPs) are dealt with using bouncers. The [CrowdSec Hub][6] offers ready-to-use data connectors, bouncers (e.g., Nginx, PHP, Cloudflare, Netfilter), and scenarios to deter various attack classes. Bouncers can remedy threats in various ways. + +It works on bouncers such as Captcha, limiting applicative rights, multi-factor authentication, throttling queries, or activating Cloudflare attack mode just when needed. You can get a sense of what's happening locally (and where it's occurring) with a lightweight visualization interface and strong [Prometheus][7] observability. + +![CrowdSec's operation][8] + +(CrowdSec, [CC BY-SA 4.0][9]) + +### Crowdsourcing security + +While the software currently looks like a spruced up Fail2Ban, the goal is to leverage the power of the crowd to create a very accurate IP reputation database. When CrowdSec bounces a specific IP, the triggered scenario and the timestamp are sent to our API to be checked and integrated into the global consensus of bad IPs. + +While we are already redistributing a blocklist to our community (you can see it by entering `cscli ban list --api` on the command line), we plan to really improve this part as soon as we have dealt with other prerequisite code lines. The network already has sightings of 100,000+ IPs (refreshed daily) and is able to redistribute ~10% (10,000) of those to our community members. The project has also been designed to be [GDPR][10] compliant and privacy respectful, both in technical and legal terms. + +Our vision is that once the CrowdSec community is large enough, we will all generate, in real time, the most accurate IP reputation database available. This global reputation engine, coupled with local behavior assessment and remediation, should allow many businesses to achieve tighter security at a very low cost. + +### Case studies + +Here are two examples of what CrowdSec does. + +> A company protecting its customers from DDoS attacks set up a DDoS mitigation strategy relying on Fail2Ban. When one of its customers was attacked by a 7,000-machine botnet, CrowdSec was able to ingest all the logs and successfully banned more than 95% of the botnet, efficiently mitigating the attack, in less than five minutes. For the sake of comparison, Fail2Ban would have needed to process several thousand logs per minute, which is quite challenging and would have taken nearly 50 minutes to deal with this attack. + +> An e-commerce business was going through a massive credit card stuffing attack. The attacker was spamming the payment gateway, testing thousands of different credit card details using a sole IP address. Instead of having to amend all of its apps to try to detect the attack, by installing CrowdSec, the company could scan all the logs and block the intrusion within minutes. + +### Business model + +A common stress in open source projects is setting up a viable monetization model. So, in full transparency, we'll offer premium subscriptions to businesses that want to leverage the IP reputation database without contributing to it or sharing their banned IP data. This will allow anyone to query the IP reputation database upon receiving the first packet from an unknown IP before accepting it. + +### Getting started and getting involved + +CrowdSec's setup is quick and easy (taking just five minutes, tops). It's heavily assisted by a wizard to allow as many people and organizations as possible to use it. The project is production-grade and already runs in many places, including hosting companies, although it's still in beta. + +Currently, our community members come from 28 countries across five different continents. We are looking for more users, contributors, and ambassadors to take the project to the next level. + +![User map][11] + +We would love to hear your feedback and engage in further discussions, so please don't hesitate to comment, reach out through our [website][2], [GitHub][4], or [Discourse][12], or give us a shout on [Gitter][13]. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/crowdsec + +作者:[Philippe Humeau][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/philippe-humeau +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_community_1.png?itok=rT7EdN2m (Lots of people in a crowd.) +[2]: https://crowdsec.net/ +[3]: https://www.fail2ban.org/ +[4]: https://github.com/CrowdSecurity/crowdsec +[5]: https://en.wikipedia.org/wiki/Leaky_bucket +[6]: https://hub.crowdsec.net/ +[7]: https://opensource.com/article/19/11/introduction-monitoring-prometheus +[8]: https://opensource.com/sites/default/files/uploads/crowdsec_operation.jpg (CrowdSec's operation) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://en.wikipedia.org/wiki/General_Data_Protection_Regulation +[11]: https://opensource.com/sites/default/files/cs_user_map.png (User map) +[12]: https://discourse.crowdsec.net/ +[13]: https://gitter.im/crowdsec-project/community diff --git a/sources/tech/20201026 7 Git tricks that changed my life.md b/sources/tech/20201026 7 Git tricks that changed my life.md new file mode 100644 index 0000000000..e2b14241d4 --- /dev/null +++ b/sources/tech/20201026 7 Git tricks that changed my life.md @@ -0,0 +1,203 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (7 Git tricks that changed my life) +[#]: via: (https://opensource.com/article/20/10/advanced-git-tips) +[#]: author: (Rajeev Bera https://opensource.com/users/acompiler) + +7 Git tricks that changed my life +====== +These helpful tips will change the way you work with the popular version +control system. +![Computer screen with files or windows open][1] + +Git is one of the most common version control systems available, and it's used on private systems and publicly hosted websites for all kinds of development work. Regardless of how proficient with Git I become, it seems there are always features left to discover. Here are seven tricks that have changed the way I work with Git. + +### 1\. Autocorrection in Git + +We all make typos sometimes, but if you have Git's auto-correct feature enabled, you can let Git automatically fix a mistyped subcommand. + +Suppose you want to check the status with `git status` but you type `git stats` by accident. Under normal circumstances, Git tells you that 'stats' is not a valid command: + + +``` +$ git stats +git: ‘stats’ is not a git command. See ‘git --help’. + +The most similar command is +status +``` + +To avoid similar scenarios, enable Git autocorrection in your Git configuration: + + +``` +`$ git config --global help.autocorrect 1` +``` + +If you want this to apply only to your current repository, omit the `--global` option. + +This command enables the autocorrection feature. An in-depth tutorial is available at [Git Docs][2], but trying the same errant command as above gives you a good idea of what this configuration does: + + +``` +$ git stats +git: ‘stats’ is not a git command. See ‘git --help’. +On branch master +Your branch is up to date with ‘origin/master’. + +nothing to commit, working tree clean +``` + +Instead of suggesting an alternative subcommand, Git now just runs the top suggestion, which in this case was **git status**. + +### 2\. Count your commits + +There are many reasons you might need to count your commits. Many developers count the number of commits to judge when to increment the build number, for instance, or just to get a feel for how the project is progressing. + +To count your commits is really easy and straightforward; here is the Git command: + + +``` +`$ git rev-list --count` +``` + +In the above command, the **branch-name** should be a valid branch name in your current repository. + + +``` +$ git rev-list –count master +32 +$ git rev-list –count dev +34 +``` + +### 3\. Optimize your repo + +Your code repository is valuable not only for you but also for your organization. You can keep your repository clean and up to date with a few simple practices. One of the best practices is to [use the .gitignore file][3]. By using this file, you are telling Git not to store many unwanted files like binaries, temporary files, and so on. + +To optimize your repository further, you can use Git garbage collection. + + +``` +`$ git gc --prune=now --aggressive` +``` + +This command helps when you or your team heavily uses **pull** or **push** commands. + +This command is an internal utility that cleans up unreachable or "orphaned" Git objects in your repository. + +### 4\. Take a backup of untracked files + +Most of the time, it's safe to delete all the untracked files. But many times, there is a situation wherein you want to delete, but also to create a backup of your untracked files just in case you need them later. + +Git, along with some Bash command piping, makes it easy to create a zip archive for your untracked files. + + +``` +$ git ls-files --others --exclude-standard -z |\ +xargs -0 tar rvf ~/backup-untracked.zip +``` + +The above command makes an archive (and excludes files listed in .gitignore) with the name backup-untracked.zip + +### 5\. Know your .git folder + +Every repository has a .git folder. It is a special hidden folder. + + +``` +$ ls -a +. … .git +``` + +Git mainly works with two things: + + 1. The working tree (the state of files in your current checkout) + 2. The path of your Git repository (specifically, the location of the .git folder, which contains the versioning information) + + + +This folder stores all references and other important details like configurations, repository data, the state of HEAD, logs, and much more. + +If you delete this folder, the current state of your source code is not deleted, but your remote information, such as your project history, is. Deleting this folder means your project (at least, the local copy) isn't under version control anymore. It means you cannot track your changes; you cannot pull or push from a remote. + +Generally, there's not much you need to do, or should do, in your .git folder. It's managed by Git and is considered mostly off-limits. However, there are some interesting artifacts in this directory, including the current state of HEAD: + + +``` +$ cat .git/HEAD +ref: refs/heads/master +``` + +It also contains, potentially, a description of your repository: + + +``` +`$ cat .git/description` +``` + +This is an unnamed repository; edit this file 'description' to name the repository. + +The Git hooks folder is also here, complete with example hook files. You can read these samples to get an idea of what's possible through Git hooks, and you can also [read this Git hook introduction by Seth Kenlon][4]. + +### 6\. View a file of another branch + +Sometimes you want to view the content of the file from another branch. It's possible with a simple Git command, and without actually switching your branch. + +Suppose you have a file called [README.md][5], and it's in the **main** branch. You're working on a branch called **dev**. + +With the following Git command, you can do it from the terminal. + + +``` +`$ git show main:README.md` +``` + +Once you execute this command, you can view the content of the file in your terminal. + +### 7\. Search in Git + +You can search in Git like a pro with one simple command. Better still, you can search in Git even if you aren't sure which commit—or even branch—you made your changes. + + +``` +`$ git rev-list --all | xargs git grep -F ‘’` +``` + +For example, suppose you want to search for the string "font-size: 52 px;" in your repository: + + +``` +$ git rev-list –all | xargs git grep -F ‘font-size: 52 px;’ +F3022…9e12:HtmlTemplate/style.css: font-size: 52 px; +E9211…8244:RR.Web/Content/style/style.css: font-size: 52 px; +``` + +### Try these tips + +I hope these advanced tips are useful and boost your productivity, saving you lots of time. + +Do you have [Git tips][6] you love? Share them in the comments. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/advanced-git-tips + +作者:[Rajeev Bera][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/acompiler +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_code_help_autocorrect_code +[3]: https://opensource.com/article/20/8/dont-ignore-gitignore +[4]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6 +[5]: http://README.md +[6]: https://acompiler.com/git-tips/ diff --git a/sources/tech/20201026 Manage content using Pulp Debian.md b/sources/tech/20201026 Manage content using Pulp Debian.md new file mode 100644 index 0000000000..3000b0f2f8 --- /dev/null +++ b/sources/tech/20201026 Manage content using Pulp Debian.md @@ -0,0 +1,173 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Manage content using Pulp Debian) +[#]: via: (https://opensource.com/article/20/10/pulp-debian) +[#]: author: (Maximilian Kolb https://opensource.com/users/kolb) + +Manage content using Pulp Debian +====== +Mirror, sync, upload, and publish Debian software packages with the +pulp_deb plugin. +![Gift box opens with colors coming out][1] + +Pulp is an open source repository management tool that helps you fetch, mirror, upload, and publish content within your organization. It can be used to [manage various types of content][2] such as software packages (from RPM packages to Ruby gems), as well as Ansible collections, container images, and even arbitrary files. + +A typical workflow starts with fetching software packages from an existing repository (for example, ) or adding packages manually (for private packages built within your organization). Then Pulp helps you make arbitrary collections of software packages that are consumable by clients. With it, you: + + * Gain control over what content is available for consumers + * Can use version control + * Reduce bandwidth and storage needs by providing a local, deduplicated source + + + +If you're new to Pulp, read Melanie Corr's introductory article on [how to manage your software repositories with Pulp][3]. + +### Manage Debian packages with Pulp + +Pulp relies on plugins to adequately handle different types of content. For example, the [Pulp RPM][4] plugin enables you to manage .rpm packages. With the [Pulp Debian][5] plugin, you can mirror, sync, upload, and publish .deb packages within APT repositories. The pulp_deb plugin is essential if you want to manage and provide consumable software packages for Linux distributions such as Debian and Ubuntu, and it's free and open source software provided and maintained by the Pulp community. + +With the Pulp Debian plugin, you can manage Debian content by synchronizing remote repositories, providing an interface to upload your own content, and publishing content to repositories. + +Pulp supports several different [Debian content types][6], including packages, package indices, Release Files, and more. "Content type" refers to either a specific artifact or metadata. For example, a content unit of type `package` refers to a .deb package. + +Synchronizing a remote repository is one of Pulp Debian plugin's main features, and it's one of the ways to obtain content. The synchronization process uses a [remote][7] definition that contains a URL, [distribution][8], components, and architectures: + + * The **URL** is the path to the remote APT repository. + * The **distribution** is the path between the `dists/` directory of the APT repository and the relevant `Release` file. This is usually (but not always) the codename or suite of the Debian-based Linux distribution (`buster` for Debian 10, `stretch` for Debian 9, `focal` for Ubuntu 20.04, and so on). Running `lsb_release -cs` on any Debian or Ubuntu host shows the distribution's codename. + * **Components** describe arbitrary subsets of repositories (`main`, `contrib`, or `non-free` for Debian, or `main`, `restricted`, `universe`, and `multiverse` for Ubuntu). You can use this to filter and categorize packages within an APT repository. + * The **architecture** refers to the processor architecture a software package can run on, most commonly `i386`, `amd64`, or `arm64`. If a software package does not depend on a specific processor architecture, the architecture may be set to `all`. + + + +Specifying a distribution is mandatory, whereas defining components and architectures is optional. If undefined, Pulp automatically syncs all packages without filtering for components or architectures. Pulp automatically verifies the [GNU Privacy Guard][9] signature of the `Release` File, should the corresponding GPG public key be assigned to the remote. + +### An example workflow + +It's easy to go from a remote repository to a verbatim publication with Pulp's [REST API][10]. The following API calls assume you're using [HTTPie][11]. + +Imagine you want to provide .deb packages to hosts within your organization. The following basic workflow guides your first steps in using Pulp and the Pulp Debian plugin. + +![Pulp Debian workflow][12] + +Image by Maximilian Kolb + +#### 1\. Create a local repository + +Start by creating a local repository in Pulp with a single API call. You can do this with HTTPie or the [curl command][13]: + + +``` +`http post http://:24817/pulp/api/v3/repositories/deb/apt/ name=` +``` + +#### 2\. Create a remote + +Next, create a remote. This API call requires a URL and an arbitrary `name` value. Defining a distribution and architecture is optional: + + +``` +`http post http://:24817/pulp/api/v3/remotes/deb/apt/ name="nginx.org" url="http://nginx.org/packages/debian" distributions="buster"` +``` + +Whether you define only one or multiple distributions, Pulp will later sync packages for all architectures, as they are undefined for this remote. + +#### 3\. Synchronize + +The third and final step to fetch remote content to Pulp is to sync the remote to your local repository. You do this by making a call to the sync API endpoint of your repository: + + +``` +`http post http://:24817/pulp/api/v3/repositories/deb/apt//sync/ remote=http://:24817/pulp/api/v3/remotes/deb/apt//` +``` + +In this sample command, each of the UUIDs refers to Pulp's internal references, displayed as `pulp_href` by the API. This step may take some time, depending on your environment, the size of the repository, and the available bandwidth. + +### Make your Pulp content consumable + +After acquiring content for Pulp through synchronization, it becomes consumable by clients. + +#### 1\. Create a publication + +Publications are always based on a Pulp repository. They contain extra settings on how to publish content. You can use the `APT` publisher on any repository of the APT type containing .deb packages. + +The following API call creates a publication in verbatim mode. That is, it provides the exact same structure and content of the remote repository: + + +``` +`http post http://:24817/pulp/api/v3/publications/deb/verbatim/ repository=/pulp/api/v3/repositories/deb/apt//` +``` + +Replace the UUID with the repository you want to publish. This step may take some time, depending on the size of the repository. + +#### 2\. Create a distribution + +A distribution takes the finished publication and serves it through the Pulp content app, which makes it available (or "consumable") by your users. In the context of a Debian system, this means that the repository can be added to `/etc/apt/sources.list` and used as a way to install software. + +The following API call requires the UUID of the publication created in the first step: + + +``` +`http post http://:24817/pulp/api/v3/distributions/deb/apt/ name="name_of_the_distribution" base_path="base_path_of_the_distribution" publication=http://:24817/pulp/api/v3/publications/deb/verbatim//` +``` + +The `base_path` value is part of the URL used by clients when referring to the APT repository, and the name can be arbitrary. Calling the distribution's API endpoint on a specific published distribution returns the URL of the Pulp repository: + + +``` +`http get http://:24817/pulp/api/v3/distributions/deb/apt//` +``` + +This URL is directly consumable by APT clients. It can now be added to `/etc/apt/sources.list` as a valid repository. + +### Pulp API + +Using these API calls lets you sync an APT repository to your own Pulp instance and republish it verbatim, without touching the packages, any metadata, or signatures. Refer to the [API documentation][6] and [feature overview][14] for further information and other modes of publication. + +### Open source flexibility + +One important aspect of Pulp and its plugin structure is that it's extremely flexible, in no small part due to its open source nature. You can run Pulp as a standalone service, but you don't have to. It can be integrated into something bigger. + +I work at [ATIX][15], where we've started using Pulp and the Pulp Debian plugin in a project called [orcharhino][16]. It's based on [Foreman][17] and includes the powerful [Katello][18] plugin for additional content-management capabilities, which itself relies on Pulp for repository management. With this, we've been able to manage our data center with automated system deployment, configuration management, and patch management. + +In other words, ATIX develops the Pulp Debian plugin primarily with a Katello use case in mind. Whether you need Katello or Pulp or just a specific Pulp plugin, you can rest assured that this modularity is by design. + +Using Pulp, you can mirror remote software repositories, host private software packages, and manage different types of content on one platform. + +Try [Pulp][19] and the [Pulp Debian][5] plugin today, and don't be afraid to join and ask the [community][20] for help. We welcome any and all feedback. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/pulp-debian + +作者:[Maximilian Kolb][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/kolb +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_gift_giveaway_box_520x292.png?itok=w1YQhNH1 (Gift box opens with colors coming out) +[2]: https://pulpproject.org/content-plugins/#pulp-3-content-plugins-information +[3]: https://opensource.com/article/20/8/manage-repositories-pulp +[4]: https://github.com/pulp/pulp_rpm +[5]: https://github.com/pulp/pulp_deb +[6]: https://pulp-deb.readthedocs.io/en/latest/restapi.html +[7]: https://docs.pulpproject.org/pulpcore/glossary.html#term-Remote +[8]: https://docs.pulpproject.org/pulpcore/glossary.html#term-Distribution +[9]: https://gnupg.org/ +[10]: https://docs.pulpproject.org/pulpcore/restapi.html +[11]: https://httpie.org/ +[12]: https://opensource.com/sites/default/files/pulp-debian-workflow_0.jpg (Pulp Debian workflow) +[13]: https://www.redhat.com/sysadmin/use-curl-api +[14]: https://pulp-deb.readthedocs.io/en/latest/feature_overview.html +[15]: https://atix.de/en/ +[16]: https://orcharhino.com/ +[17]: https://theforeman.org/ +[18]: https://theforeman.org/plugins/katello +[19]: https://pulpproject.org/ +[20]: https://pulpproject.org/get_involved/ diff --git a/sources/tech/20201026 Pi from High School Maths.md b/sources/tech/20201026 Pi from High School Maths.md new file mode 100644 index 0000000000..10e972ca01 --- /dev/null +++ b/sources/tech/20201026 Pi from High School Maths.md @@ -0,0 +1,155 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Pi from High School Maths) +[#]: via: (https://theartofmachinery.com/2020/10/26/pi_from_high_school_maths.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) + +Pi from High School Maths +====== + +Warning: I don’t think the stuff in this post has any direct practical application by itself (unless you’re a nuclear war survivor and need to reconstruct maths from scratch or something). Sometimes I like to go back to basics, though. Here’s a look at (\pi) and areas of curved shapes without any calculus or transcendental functions. + +### A simple algorithm for calculating (\pi) + +This algorithm starts with simple number theoretic musing. Some whole numbers form neat Pythagorean triples ((x,y,z)) where (x^{2} + y^{2} = z^{2}). E.g., (3^{2} + 4^{2} = 5^{2}). It’s easy to find all the solutions to (x^{2} + y^{2} = 5^{2}) through brute-force search because we know that (x) and (y) can’t be bigger than (5). Here they are: + +[\begin{matrix} {0^{2} + 5^{2}} & {= 5^{2}} \ {3^{2} + 4^{2}} & {= 5^{2}} \ {4^{2} + 3^{2}} & {= 5^{2}} \ {5^{2} + 0^{2}} & {= 5^{2}} \ \end{matrix}] + +(Plus all the negative-number combinations, but let’s stick with non-negative integers and just count 4 solutions.) If we relax the equation, and count solutions to (x^{2} + y^{2} \leq 5^{2}), the answer turns out to be 26. Why care? Well, if (t) is the total number of solutions to (x^{2} + y^{2} \leq n^{2}), then + +[\lim\limits_{n\rightarrow\infty}\frac{4t}{(n + 1)^{2}} = \pi] + +Or, in code, here’s a simple program that estimates (\pi), getting more accurate for bigger values of the `n` variable: + +``` +import std; + +ulong sq(ulong x) pure +{ + return x * x; +} + +void main(string[] args) +{ + const n = args.length > 1 ? args[1].to!ulong : 20; + + ulong total; + foreach (x; 0..n+1) + { + foreach (y; 0..n+1) + { + if (sq(x) + sq(y) <= sq(n)) total++; + } + } + + /* + // Alternatively, for functional programming fans: + const total = + cartesianProduct(iota(n+1), iota(n+1)) + .filter!(p => sq(p[0]) + sq(p[1]) <= sq(n)) + .walkLength; + */ + + writef("%.12f\n", 4.0 * total / sq(n+1)); +} + +$ ./pi_calc +3.038548752834 +$ ./pi_calc 10000 +3.141362256135 +``` + +Okay, that’s a little bit more accurate than (\frac{22}{7}). Unlike most formulae for (\pi), though, there’s a simple diagram that shows how it works. Imagine we lay out the ((x,y)) integer pairs (where (x) and (y) range from (0) to (n)) on a 2D grid the obvious way. The figure below shows an example for (n = 10), with the arrow (r) pointing from the origin to ((6,8)). (r) and the (x) and (y) components make a right-angled triangle, so [Pythagoras’s theorem][1] says that (x^{2} + y^{2} = r^{2}). For ((6,8)), (r = 10 = n), so ((6,8)) is on the boundary as a solution to (x^{2} + y^{2} \leq 10^{2}). That boundary (the set of real-valued points a constant distance (n = 10) from the origin) makes a quarter circle. + +![][2] + +A circle is a simple, convex shape, and the grid points are evenly spaced, so the number of points inside the quarter circle will be roughly proportional to the area. More specifically, the fraction of all the grid points inside the quarter circle will be roughly the area of the quarter circle divided by the area of square around all points. The quarter circle area is (\pi r^{2} \div 4), inside the square of area (r^{2}) (remember, (n = r)), so (\frac{\pi}{4}) of all points represent solutions. The (x) and (y) values count from (0) to (n), so there are ((n + 1)^{2}) grid points. Rearrange the equations and you get a formula for estimating (\pi) from a solution count. The grid points keep drawing an arbitrarily more accurate circle as (n) gets bigger (just like a higher-resolution computer monitor does) so the estimate is exact in the limit. + +### A faster implementation + +The code above is simple but slow because it brute-force scans over all ((n + 1) \times (n + 1))possible (x) and (y) values. But we obviously don’t need to scan _all_ values. If we know that (x^{2} + y^{2} \leq n^{2}), then making (x) or (y) smaller will only give us another solution. We don’t need to keep testing smaller values after we find a solution. Ultimately, we only need to find the integral points around the boundary. Here’s a faster algorithm based on that idea. + +Imagine we scan along the integral (x) values and find the maximum integral (y) value that still gives us a solution. This gives us a border line marked in red in the figure below. If (y = 8) for a given (x) value, we instantly know there are (8 + 1 = 9) solutions with that given (x) value ((+ 1) to count the (y = 0) solution). + +![][3] + +Note that as (x) scans from (0) to (n), (y) starts at (n) and decreases to (0). Importantly, it _only_ decreases — it’s monotonic. So if we scan (x) from (0) to (n), we can find the next boundary (y) point by starting from the previous boundary point and searching downwards. Here’s some code: + +``` +ulong y = n, total; +foreach (x; 0..n+1) +{ + while (sq(x) + sq(y) > sq(n)) y--; + total += y + 1; +} +``` + +This version still has nested loops, so it might look like it’s still (O(n^{2})). However, the inner `while` loop executes a varying number of times for each (x) value. Often the `y--` doesn’t trigger at all. In fact, because `y` starts from `n` and monotonically decreases to 0, we know the `y--` will be executed exactly `n` times in total. There’s no instruction in that code that executes more than (O(n)) times, total, so the whole algorithm is (O(n)). + +With 64b `ulong` integers, the largest value of `n` that works before overflow is 4294967294: + +``` +$ ./pi_calc 4294967294 +3.141592653058 +``` + +There are ways to get faster convergence using numerical integration tricks, but I like the way this algorithm only uses integer arithmetic (up until the final division), and can be understood directly from simple diagrams. + +### Area of a circle without calculus + +Perhaps you feel a bit cheated because that algorithm assumes the (\pi r^{2}) formula for the area of a circle. Sure, that’s arguably included in “high school maths”, but it’s something students just get told to remember, unless they study integral calculus and derive it that way. But if we’re going to assume (\pi r^{2}), why not assume the theory of trigonometric functions as well, and just use (\pi = 4\operatorname{atan}(1))? + +The great ancient Greek mathematician Archimedes figured out the circle area over two thousand years ago without integral calculus (or trigonometric functions for that matter). He started with an elegant insight about regular (i.e., equal-sided) polygons. + +The famous [“half base times height” formula for the area of a triangle already had a well-known proof in the first book of Euclid’s Elements of Geometry][4] (easily derived from [a theorem about parallelograms][5]). Conveniently, any regular polygon can be split into equal triangles joined to the centre. For example, a regular hexagon splits into six triangles, as in the figure below. We can take any one of the triangles (they’re all the same) and call the “base” the side that’s also a side of the polygon. Then the “height” is the line from the centre of the base to the centre of the polygon. + +![][6] + +Now here’s Archimedes’s neat insight: The ratio of the triangle area to the base is (\frac{h}{2}). If you add up all the areas, you get the area of the polygon. Likewise, if you add up all the bases, you get the perimeter of the polygon. Because the triangle area/base ratio is a constant (\frac{h}{2}) for all triangles, the area/perimeter ratio for the whole polygon is the same (\frac{h}{2}). As a formula, the area of _any_ regular polygon is (P \times \frac{h}{2}) (where (P) is the perimeter). + +If you think of a circle as a regular polygon with infinitely many sides (so that (h) becomes the radius of the circle), and use the circle circumference ((2\pi r)) as your basic definition of (\pi), then that implies the area of a circle is (2\pi r \times \frac{r}{2} = \pi r^{2}). + +Of course, Archimedes was a respected mathematician who couldn’t get away with just assuming that anything true of a polygon is true of a circle (counterexample: all polygons have bumpy corners, but circles don’t). He used the kind of geometric proof by contradiction that was popular in his day. (He even took it further and analysed spheres, cylinders, parabolas and other curved objects, almost inventing something like modern real analysis a couple of millenia early.) Sadly, not all of his mathemetical work has survived, but [the key part of his Measurement of a Circle][7] has. + +Here’s the high-level version. Archimedes claimed that the area of a circle is (2\pi r \times \frac{r}{2}). Suppose you think his value is too small, and the circle is really bigger than (2\pi r \times \frac{r}{2}). That means there’s enough room inside the circle to fit a regular polygon that’s also bigger than (2\pi r \times \frac{r}{2}). But Archimedes said that’s contradictory because for any such polygon, (h < r), and (P < 2\pi r) (because each side of the polygon is a straight line that’s shorter than the circle arc that connects the same points), so the area (A = P \times \frac{h}{2} < 2\pi r \times \frac{r}{2}). The polygon’s area can’t be both bigger and smaller than (2\pi r \times \frac{r}{2}). + +![][8] + +Archimedes argued that there’s a similar contradiction if you think (2\pi r \times \frac{r}{2}) is too big, and the circle area is smaller than that. In that case he could make a polygon that’s also smaller than (2\pi r \times \frac{r}{2}), yet still wraps around the circle. For this polygon, (h = r), but he said the perimeter of the polygon must be greater than (2\pi r)[1][9], so that the polygon’s area must be bigger than (2\pi r \times \frac{r}{2}), even though it’s also meant to be smaller. + +![][10] + +If both of those cases lead to contradiction, we’re left with the only alternative that the circle area is (\pi r^{2}). + + 1. I don’t actually know how he argued this. [↩︎][11] + + + + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2020/10/26/pi_from_high_school_maths.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://www.cut-the-knot.org/pythagoras/ +[2]: https://theartofmachinery.com/images/pi_from_high_school_maths/pi_calc_grid.svg +[3]: https://theartofmachinery.com/images/pi_from_high_school_maths/pi_fast_calc_grid.svg +[4]: https://mathcs.clarku.edu/~djoyce/java/elements/bookI/propI37.html +[5]: https://mathcs.clarku.edu/~djoyce/java/elements/bookI/propI35.html +[6]: https://theartofmachinery.com/images/pi_from_high_school_maths/polygon.svg +[7]: https://flashman.neocities.org/ARCHCI1set.htm +[8]: https://theartofmachinery.com/images/pi_from_high_school_maths/polygon_inner.svg +[9]: tmp.gJlezpSbZb#fn:1 +[10]: https://theartofmachinery.com/images/pi_from_high_school_maths/polygon_outer.svg +[11]: tmp.gJlezpSbZb#fnref:1 diff --git a/sources/tech/20201027 Bring old hardware back to life with OpenBSD.md b/sources/tech/20201027 Bring old hardware back to life with OpenBSD.md new file mode 100644 index 0000000000..e2043c0f54 --- /dev/null +++ b/sources/tech/20201027 Bring old hardware back to life with OpenBSD.md @@ -0,0 +1,73 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Bring old hardware back to life with OpenBSD) +[#]: via: (https://opensource.com/article/20/10/old-hardware-openbsd) +[#]: author: (Jonathan Garrido https://opensource.com/users/jgarrido) + +Bring old hardware back to life with OpenBSD +====== +Install OpenBSD and the Xfce desktop to give a new spin to an old +machine—for free. +![Old UNIX computer][1] + +Almost everyone has (or knows someone who has) old hardware sitting around gathering dust because they believe that no modern operating system (OS) supports such a relic. I know this is wrong because I am one of those geeks who likes to use every piece of equipment as long as it is possibly functional. + +Although most modern OSes do run better on modern hardware, it is also true that there are alternatives for up-to-date 32-bit OSes to run all types of machines, including very old ones. Thanks to a bunch of people with enough determination and skills, there are different types of Linux and BSD distros that you can use, free of charge, to give a new spin to an old machine. + +## What can you do with a new OS on old hardware? + +Besides the obvious benefit of bringing back a piece of equipment that has been idle for a price that is equal to nothing, using an open source 32-bit distro to revive "antique" hardware has several benefits and purposes, including: + + * **Create single-purpose equipment:** Today's networks are complex, and there are a lot of services that interact with one another. After bringing an old machine back to life, you can set it up to fulfill one of those unique services within your infrastructure, such as DHCP, DNS, or SFTP. + * **Learn how the OS works:** I always want to know how things work under the hood. Tinkering with old hardware and tiny OSes gives you the chance to understand the interactions between hardware and software, learn how to tune the installation's default settings to make the most of a system, and much, much more. + * **Teach others about open source:** Finally, 32-bit OSes and old hardware can teach the next generation about OSes and the open source world. One of the main features of these types of OSes is their simplicity of use with fewer options to overwhelm the user. This makes them an excellent tool to teach and explore the essential components of any operating system. + + + +## Distributions to try + +To encourage you, here is a list of distros that I have tried on old hardware with very good results. These are not the only options available, but these are the ones I have used the most: + + * [Linux Lite][2] + * [FreeBSD][3] + * [OpenBSD][4] + * [Lubuntu][5] + * [Debian][6] + * [Tiny Core Linux][7] + * [Slax Linux][8] + + + +## Give it a try with OpenBSD + +OpenBSD is one of the main [BSD][9] distros. It is well-known because it is made with security in mind, with almost no security bugs in the default installation and a lot of cryptography tools available to users. Another cool feature, at least for me, is the fact that you can run it on a huge variety of hardware, from new computers to very old machines. + +For this installation, my hardware was a 2005 MacBook with the following specs: + + * A 32-bit, dual-core processor + * 2GB of RAM (with no possibility of expansion) + * A 32GB hard drive + * Two network cards + * A CD-ROM (reads only CDs) + * A few USB ports + + + +### Install OpenBSD + +The installation was very straightforward. I [downloaded][10] the most recent version of OpenBSD and created a boot CD (because there is no other way to boot my old laptop besides the internal drive). The installation went flawlessly. It recognized my hardware, network (including my access point), and time zone; let me choose the layout of my hard drive and manage my users; and asked some questions about the system's security setup. Also, even though the installation has a very small footprint, OpenBSD let me choose what to install and from where. + +I ended up with a brand-new, up-to-date operating system and a screen like this. + +![OpenBSD][11] + +(Jonathan Garrido, [CC BY-SA 4.0][12]) + +### Add a graphical desktop + +If you want your desktop to use graphical applications, a black terminal with white letters is not enough. So follow these steps to install the [Xfce desktop][13]: + + 1. As root, run: [code]`pkg_add xcfe xfce-extras slim slim-themes consolekit2 polkit`[/code] to install the Xfce environment and the login greeter. In the above, `pkg_add` is the utility to use when you want to d \ No newline at end of file diff --git a/sources/tech/20201027 Map Your Gamepad Buttons With Keyboard, Mouse, or Macros-Scripts Using AntiMicroX in Linux.md b/sources/tech/20201027 Map Your Gamepad Buttons With Keyboard, Mouse, or Macros-Scripts Using AntiMicroX in Linux.md new file mode 100644 index 0000000000..2fef431fa4 --- /dev/null +++ b/sources/tech/20201027 Map Your Gamepad Buttons With Keyboard, Mouse, or Macros-Scripts Using AntiMicroX in Linux.md @@ -0,0 +1,106 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Map Your Gamepad Buttons With Keyboard, Mouse, or Macros/Scripts Using AntiMicroX in Linux) +[#]: via: (https://itsfoss.com/antimicrox/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Map Your Gamepad Buttons With Keyboard, Mouse, or Macros/Scripts Using AntiMicroX in Linux +====== + +_**Brief: AntiMicroX is a GUI tool to map your gamepad with your keyboard, mouse, or custom macros/scripts in Linux. Let’s take a closer look at it.**_ + +Gaming peripherals on Linux do not have a great reputation, but we do have some interesting open source tools that can make things easier for you. For instance, I’ve previously covered a tool [Piper which lets you configure your gaming mouse][1]. + +This time, let me introduce you to an exciting open source tool that lets you utilize your game pad by mapping it to your keyboard, mouse, scripts, or macros. + +![][2] + +In this article, I’ll mention why you might need it and its key features to help you know more about it. + +### AntiMicroX: An open source tool to map your gamepad + +Of course, this isn’t for everyone but an open source GUI tool for something useful, why not? + +Maybe you have a system that you utilize for media consumption (or as a [media server on Linux][3]). Or, maybe you want to use a desktop application using your gamepad. + +Also, you may want to use it to play a game that does not offer gamepad support. + +For such cases, AntiMicroX is a tool that you would want to explore (even if that’s just for fun). + +### Features of AntiMicroX + +![][4] + + * Map with keyboard buttons + * Controller mapping to make sure the host detects the correct triggers + * Multiple controller profile + * Ability to launch an executable using the gamepad + * Map with mouse buttons + * Gamepad calibration option + * Tweak Gamepad poll rate (if needed) + * Auto profile support + + + +### Installing AntiMicroX on Linux + +![][5] + +AntiMicroX offers a wide range of options to get it installed on a Linux distribution. You will find a DEB package, [Flatpak package][6], and an AppImage file. + +It is easy to [install it using the deb package][7]. In addition to that, you may refer to our [Flatpak guide][8] or [AppImage guide][9] to get started installing AntiMicroX as well. + +You can also build it from source if needed. Nevertheless, you should find all the necessary instructions in its [GitHub page][10] along with the packages in its [releases section][11]. + +[AntiMicroX][12] + +**Recommended Read:** + +![][13] + +#### [How to Configure Gaming Mouse on Linux Using Piper GUI Tool][1] + +Love gaming on Linux? Take your gaming to the next level by configuring your gaming mouse in Linux using Piper GUI application. + +### My Thoughts on Using AntiMicroX on Linux + +Surprisingly, mapping the game pad buttons was easier than you would expect. I was able to map the buttons with my keyboard and assign custom macros/scripts as well. + +Mapping the buttons with the mouse isn’t that simple and may not work well if you already have the mouse buttons assigned for different macros (like in my case). For gaming, it would be nice to calibrate and map the gamepad buttons properly before pairing it up with the keyboard buttons. + +It worked just fine with my generic controller. You can definitely try it out. + +Did you know about this? Have you tried it yet? Now that we’re looking for interesting open-source tools, do you know about anything else similar to this for [gaming on Linux][14]? + +Let me know your thoughts in the comments below. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/antimicrox/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/piper-configure-gaming-mouse-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/antimicrox-mapping.png?resize=800%2C557&ssl=1 +[3]: https://itsfoss.com/best-linux-media-server/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/antimicrox-gamepad.jpg?resize=800%2C631&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/antimicrox-calibration.jpg?resize=800%2C637&ssl=1 +[6]: https://itsfoss.com/what-is-flatpak/ +[7]: https://itsfoss.com/install-deb-files-ubuntu/ +[8]: https://itsfoss.com/flatpak-guide/ +[9]: https://itsfoss.com/use-appimage-linux/ +[10]: https://github.com/AntiMicroX/antimicrox +[11]: https://github.com/AntiMicroX/antimicrox/releases +[12]: https://github.com/AntiMicroX/antimicrox/ +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/configuring-gaming-mouse-linux.png?fit=800%2C450&ssl=1 +[14]: https://itsfoss.com/linux-gaming-guide/ diff --git a/sources/tech/20201029 Managing resources with cgroups in systemd.md b/sources/tech/20201029 Managing resources with cgroups in systemd.md new file mode 100644 index 0000000000..5cb7f5c8c8 --- /dev/null +++ b/sources/tech/20201029 Managing resources with cgroups in systemd.md @@ -0,0 +1,369 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Managing resources with cgroups in systemd) +[#]: via: (https://opensource.com/article/20/10/cgroups) +[#]: author: (David Both https://opensource.com/users/dboth) + +Managing resources with cgroups in systemd +====== +Cgroups manage resources per application rather than by the individual +processes that make up an application. +![Business woman on laptop sitting in front of window][1] + +There is little more frustrating to me as a sysadmin than unexpectedly running out of a computing resource. On more than one occasion, I have filled all available disk space in a partition, run out of RAM, and not had enough CPU time to perform my tasks in a reasonable amount of time. Resource management is one of the most important tasks that sysadmins do. + +The point of resource management is to ensure that all processes have relatively equal access to the system resources they need. Resource management also involves ensuring that RAM, hard drive space, and CPU capacity are added when necessary or rationed when that is not possible. In addition, users who hog system resources, whether intentionally or accidentally, should be prevented from doing so. + +There are tools that enable sysadmins to monitor and manage various system resources. For example, [top][2] and similar tools allow you to monitor the use of memory, I/O, storage (disk, SSD, etc.), network, swap space, CPU usage, and more. These tools, particularly those that are CPU-centric, are mostly based on the paradigm that the running process is the unit of control. At best, they provide a way to adjust the nice number–and through that, the priority—or to kill a running process. (For information about nice numbers, see [_Monitoring Linux and Windows hosts with Glances_][3].) + +Other tools based on traditional resource management in a SystemV environment are managed by the `/etc/security/limits.conf` file and the local configuration files located in the `/etc/security/limits.d` directory. Resources can be limited in a fairly crude but useful manner by user or group. Resources that can be managed include various aspects of RAM, total CPU time per day, total amount of data, priority, nice number, number of concurrent logins, number of processes, maximum file size, and more. + +### Using cgroups for process management + +One major difference between [systemd and SystemV][4] is how they handle processes. SystemV treats each process as an entity unto itself. systemd collects related processes into control groups, called [cgroups][5] (short for control groups), and manages system resources for the cgroup as a whole. This means resources can be managed per application rather than by the individual processes that make up an application. + +The control units for cgroups are called slice units. Slices are a conceptualization that allows systemd to order processes in a tree format for ease of management. + +### Viewing cgroups + +I'll start with some commands that allow you to view various types of information about cgroups. The `systemctl status ` command displays slice information about a specified service, including its slice. This example shows the `at` daemon: + + +``` +[root@testvm1 ~]# systemctl status atd.service +● atd.service - Deferred execution scheduler +     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) +     Active: active (running) since Wed 2020-09-23 12:18:24 EDT; 1 day 3h ago +       Docs: man:atd(8) +   Main PID: 1010 (atd) +      Tasks: 1 (limit: 14760) +     Memory: 440.0K +        CPU: 5ms +     CGroup: /system.slice/atd.service +             └─1010 /usr/sbin/atd -f + +Sep 23 12:18:24 testvm1.both.org systemd[1]: Started Deferred execution scheduler. +[root@testvm1 ~]# +``` + +This is an excellent example of one reason that I find systemd more usable than SystemV and the old init program. There is so much more information here than SystemV could provide. The cgroup entry includes the hierarchical structure where the `system.slice` is systemd (PID 1), and the `atd.service` is one level below and part of the `system.slice`. The second line of the cgroup entry also shows the process ID (PID) and the command used to start the daemon. + +The `systemctl` command shows multiple cgroup entries. The `--all` option shows all slices, including those that are not currently active: + + +``` +[root@testvm1 ~]# systemctl -t slice --all +  UNIT                             LOAD   ACTIVE   SUB    DESCRIPTION                     +  -.slice                          loaded active   active Root Slice                       +  system-getty.slice               loaded active   active system-getty.slice               +  system-lvm2\x2dpvscan.slice      loaded active   active system-lvm2\x2dpvscan.slice     +  system-modprobe.slice            loaded active   active system-modprobe.slice           +  system-sshd\x2dkeygen.slice      loaded active   active system-sshd\x2dkeygen.slice     +  system-systemd\x2dcoredump.slice loaded inactive dead   system-systemd\x2dcoredump.slice +  system-systemd\x2dfsck.slice     loaded active   active system-systemd\x2dfsck.slice     +  system.slice                     loaded active   active System Slice                     +  user-0.slice                     loaded active   active User Slice of UID 0             +  user-1000.slice                  loaded active   active User Slice of UID 1000           +  user.slice                       loaded active   active User and Session Slice           + +LOAD   = Reflects whether the unit definition was properly loaded. +ACTIVE = The high-level unit activation state, i.e. generalization of SUB. +SUB    = The low-level unit activation state, values depend on unit type. + +11 loaded units listed. +To show all installed unit files use 'systemctl list-unit-files'. +[root@testvm1 ~]# +``` + +The first thing to notice about this data is that it shows user slices for UIDs 0 (root) and 1000, which is my user login. This shows only the slices and not the services that are part of each slice. This data shows that a slice is created for each user at the time they log in. This can provide a way to manage all of a user's tasks as a single cgroup entity. + +### Explore the cgroup hierarchy + +All is well and good so far, but cgroups are hierarchical, and all of the service units run as members of one of the cgroups. Viewing that hierarchy is easy and uses one old command and one new one that is part of systemd. + +The `ps` command can be used to map the processes and their locations in the cgroup hierarchy. Note that it is necessary to specify the desired data columns when using the `ps` command. I significantly reduced the volume of output from this command below, but I tried to leave enough so you can get a feel for what you might find on your systems: + + +``` +[root@testvm1 ~]# ps xawf -eo pid,user,cgroup,args +    PID USER     CGROUP                      COMMAND +      2 root     -                           [kthreadd] +      3 root     -                            \\_ [rcu_gp] +      4 root     -                            \\_ [rcu_par_gp] +      6 root     -                            \\_ [kworker/0:0H-kblockd] +      9 root     -                            \\_ [mm_percpu_wq] +     10 root     -                            \\_ [ksoftirqd/0] +     11 root     -                            \\_ [rcu_sched] +     12 root     -                            \\_ [migration/0] +     13 root     -                            \\_ [cpuhp/0] +     14 root     -                            \\_ [cpuhp/1] +<SNIP> + 625406 root     -                            \\_ [kworker/3:0-ata_sff] + 625409 root     -                            \\_ [kworker/u8:0-events_unbound] +      1 root     0::/init.scope              /usr/lib/systemd/systemd --switched-root --system --deserialize 30 +    588 root     0::/system.slice/systemd-jo /usr/lib/systemd/systemd-journald +    599 root     0::/system.slice/systemd-ud /usr/lib/systemd/systemd-udevd +    741 root     0::/system.slice/auditd.ser /sbin/auditd +    743 root     0::/system.slice/auditd.ser  \\_ /usr/sbin/sedispatch +    764 root     0::/system.slice/ModemManag /usr/sbin/ModemManager +    765 root     0::/system.slice/NetworkMan /usr/sbin/NetworkManager --no-daemon +    767 root     0::/system.slice/irqbalance /usr/sbin/irqbalance --foreground +    779 root     0::/system.slice/mcelog.ser /usr/sbin/mcelog --ignorenodev --daemon --foreground +    781 root     0::/system.slice/rngd.servi /sbin/rngd -f +    782 root     0::/system.slice/rsyslog.se /usr/sbin/rsyslogd -n +<SNIP> +    893 root     0::/system.slice/sshd.servi sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups +   1130 root     0::/user.slice/user-0.slice  \\_ sshd: root [priv] +   1147 root     0::/user.slice/user-0.slice  |   \\_ sshd: root@pts/0 +   1148 root     0::/user.slice/user-0.slice  |       \\_ -bash +   1321 root     0::/user.slice/user-0.slice  |           \\_ screen +   1322 root     0::/user.slice/user-0.slice  |               \\_ SCREEN +   1323 root     0::/user.slice/user-0.slice  |                   \\_ /bin/bash + 498801 root     0::/user.slice/user-0.slice  |                   |   \\_ man systemd.resource-control + 498813 root     0::/user.slice/user-0.slice  |                   |       \\_ less +   1351 root     0::/user.slice/user-0.slice  |                   \\_ /bin/bash + 123293 root     0::/user.slice/user-0.slice  |                   |   \\_ man systemd.slice + 123305 root     0::/user.slice/user-0.slice  |                   |       \\_ less +   1380 root     0::/user.slice/user-0.slice  |                   \\_ /bin/bash + 625412 root     0::/user.slice/user-0.slice  |                   |   \\_ ps xawf -eo pid,user,cgroup,args + 625413 root     0::/user.slice/user-0.slice  |                   |   \\_ less + 246795 root     0::/user.slice/user-0.slice  |                   \\_ /bin/bash + 625338 root     0::/user.slice/user-0.slice  |                       \\_ /usr/bin/mc -P /var/tmp/mc-root/mc.pwd.246795 + 625340 root     0::/user.slice/user-0.slice  |                           \\_ bash -rcfile .bashrc +   1218 root     0::/user.slice/user-1000.sl  \\_ sshd: dboth [priv] +   1233 dboth    0::/user.slice/user-1000.sl      \\_ sshd: dboth@pts/1 +   1235 dboth    0::/user.slice/user-1000.sl          \\_ -bash +<SNIP> +   1010 root     0::/system.slice/atd.servic /usr/sbin/atd -f +   1011 root     0::/system.slice/crond.serv /usr/sbin/crond -n +   1098 root     0::/system.slice/lxdm.servi /usr/sbin/lxdm-binary +   1106 root     0::/system.slice/lxdm.servi  \\_ /usr/libexec/Xorg -background none :0 vt01 -nolisten tcp -novtswitch -auth /var/run/lxdm/lxdm-:0.auth + 370621 root     0::/user.slice/user-1000.sl  \\_ /usr/libexec/lxdm-session + 370631 dboth    0::/user.slice/user-1000.sl      \\_ xfce4-session + 370841 dboth    0::/user.slice/user-1000.sl          \\_ /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4" + 370911 dboth    0::/user.slice/user-1000.sl          \\_ xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2 + 370930 dboth    0::/user.slice/user-1000.sl          \\_ xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952 + 370942 dboth    0::/user.slice/user-1000.sl          |   \\_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libsystray.so 6 23068680 systr +ay Notification Area Area where notification icons appear + 370943 dboth    0::/user.slice/user-1000.sl          |   \\_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libpulseaudio-plugin.so 8 2306 +8681 pulseaudio PulseAudio Plugin Adjust the audio volume of the PulseAudio sound system + 370944 dboth    0::/user.slice/user-1000.sl          |   \\_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libxfce4powermanager.so 9 2306 +8682 power-manager-plugin Power Manager Plugin Display the battery levels of your devices and control the brightness of your display + 370945 dboth    0::/user.slice/user-1000.sl          |   \\_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libnotification-plugin.so 10 2 +3068683 notification-plugin Notification Plugin Notification plugin for the Xfce panel + 370948 dboth    0::/user.slice/user-1000.sl          |   \\_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libactions.so 14 23068684 acti +ons Action Buttons Log out, lock or other system actions + 370934 dboth    0::/user.slice/user-1000.sl          \\_ Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon + 370939 dboth    0::/user.slice/user-1000.sl          \\_ xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324 + 370962 dboth    0::/user.slice/user-1000.sl          \\_ nm-applet +<SNIP> +``` + +You can view the entire hierarchy with the `systemd-cgls` command, which is a bit simpler because it does not require any complex options. + +I have shortened this tree view considerably. as well, but I left enough to give you some idea of the amount of data as well as the types of entries you should see when you do this on your system. I did this on one of my virtual machines, and it is about 200 lines long; the amount of data from my primary workstation is about 250 lines: + + +``` +[root@testvm1 ~]# systemd-cgls +Control group /: +-.slice +├─user.slice +│ ├─user-0.slice +│ │ ├─session-1.scope +│ │ │ ├─  1130 sshd: root [priv] +│ │ │ ├─  1147 sshd: root@pts/0 +│ │ │ ├─  1148 -bash +│ │ │ ├─  1321 screen +│ │ │ ├─  1322 SCREEN +│ │ │ ├─  1323 /bin/bash +│ │ │ ├─  1351 /bin/bash +│ │ │ ├─  1380 /bin/bash +│ │ │ ├─123293 man systemd.slice +│ │ │ ├─123305 less +│ │ │ ├─246795 /bin/bash +│ │ │ ├─371371 man systemd-cgls +│ │ │ ├─371383 less +│ │ │ ├─371469 systemd-cgls +│ │ │ └─371470 less +│ │ └─[user@0.service][6] … +│ │   ├─dbus-broker.service +│ │   │ ├─1170 /usr/bin/dbus-broker-launch --scope user +│ │   │ └─1171 dbus-broker --log 4 --controller 12 --machine-id 3bccd1140fca488187f8a1439c832f07 --max-bytes 100000000000000 --max-fds 25000000000000 --max-> +│ │   ├─gvfs-daemon.service +│ │   │ └─1173 /usr/libexec/gvfsd +│ │   └─init.scope +│ │     ├─1137 /usr/lib/systemd/systemd --user +│ │     └─1138 (sd-pam) +│ └─user-1000.slice +│   ├─[user@1000.service][7] … +│   │ ├─dbus\x2d:1.2\x2dorg.xfce.Xfconf.slice +│   │ │ └─dbus-:[1.2-org.xfce.Xfconf@0.service][8] +│   │ │   └─370748 /usr/lib64/xfce4/xfconf/xfconfd +│   │ ├─dbus\x2d:1.2\x2dca.desrt.dconf.slice +│   │ │ └─dbus-:[1.2-ca.desrt.dconf@0.service][9] +│   │ │   └─371262 /usr/libexec/dconf-service +│   │ ├─dbus-broker.service +│   │ │ ├─1260 /usr/bin/dbus-broker-launch --scope user +│   │ │ └─1261 dbus-broker --log 4 --controller 11 --machine-id +<SNIP> +│   │ └─gvfs-mtp-volume-monitor.service +│   │   └─370987 /usr/libexec/gvfs-mtp-volume-monitor +│   ├─session-3.scope +│   │ ├─1218 sshd: dboth [priv] +│   │ ├─1233 sshd: dboth@pts/1 +│   │ └─1235 -bash +│   └─session-7.scope +│     ├─370621 /usr/libexec/lxdm-session +│     ├─370631 xfce4-session +│     ├─370805 /usr/bin/VBoxClient --clipboard +│     ├─370806 /usr/bin/VBoxClient --clipboard +│     ├─370817 /usr/bin/VBoxClient --seamless +│     ├─370818 /usr/bin/VBoxClient --seamless +│     ├─370824 /usr/bin/VBoxClient --draganddrop +│     ├─370825 /usr/bin/VBoxClient --draganddrop +│     ├─370841 /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4" +│     ├─370910 /bin/gpg-agent --sh --daemon --write-env-file /home/dboth/.cache/gpg-agent-info +│     ├─370911 xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2 +│     ├─370923 xfsettingsd --display :0.0 --sm-client-id 261b4a437-3029-461c-9551-68c2c42f4fef +│     ├─370930 xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952 +│     ├─370934 Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon +│     ├─370939 xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324 +<SNIP> +└─system.slice +  ├─rngd.service +  │ └─1650 /sbin/rngd -f +  ├─irqbalance.service +  │ └─1631 /usr/sbin/irqbalance --foreground +  ├─fprintd.service +  │ └─303383 /usr/libexec/fprintd +  ├─systemd-udevd.service +  │ └─956 /usr/lib/systemd/systemd-udevd +<SNIP> +  ├─systemd-journald.service +  │ └─588 /usr/lib/systemd/systemd-journald +  ├─atd.service +  │ └─1010 /usr/sbin/atd -f +  ├─system-dbus\x2d:1.10\x2dorg.freedesktop.problems.slice +  │ └─dbus-:[1.10-org.freedesktop.problems@0.service][10] +  │   └─371197 /usr/sbin/abrt-dbus -t133 +  ├─sshd.service +  │ └─893 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups +  ├─vboxservice.service +  │ └─802 /usr/sbin/VBoxService -f +  ├─crond.service +  │ └─1011 /usr/sbin/crond -n +  ├─NetworkManager.service +  │ └─765 /usr/sbin/NetworkManager --no-daemon +  ├─switcheroo-control.service +  │ └─787 /usr/libexec/switcheroo-control + <SNIP> +``` + +This tree view shows all of the user and system slices and the services and programs running in each cgroup. Notice the units called "scopes," which group related programs into a management unit, within the `user-1000.slice` in the listing above. The `user-1000.slice/session-7.scope` cgroup contains the GUI desktop program hierarchy, starting with the LXDM display manager session and all of its subtasks, including things like the Bash shell and the Thunar GUI file manager. + +Scope units are not defined in configuration files but are generated programmatically as the result of starting groups of related programs. Scope units do not create or start the processes running as part of that cgroup. All processes within the scope are equal, and there is no internal hierarchy. The life of a scope begins when the first process is created and ends when the last process is destroyed. + +Open several windows on your desktop, such as terminal emulators, LibreOffice, or whatever you want, then switch to an available virtual console and start something like `top` or [Midnight Commander][11]. Run the `systemd-cgls` command on your host, and take note of the overall hierarchy and the scope units. + +The `systemd-cgls` command provides a more complete representation of the cgroup hierarchy (and details of the units that make it up) than any other command I have found. I prefer its cleaner representation of the tree than what the `ps` command provides. + +### With a little help from my friends + +After covering these basics, I had planned to go into more detail about cgroups and how to use them, but I discovered a series of four excellent articles by Red Hat's [Steve Ovens][12] on Opensource.com's sister site [Enable Sysadmin][13]. Rather then basically rewriting Steve's articles, I decided it would be much better to take advantage of his cgroup expertise by linking to them: + + 1. [A Linux sysadmin's introduction to cgroups][14] + 2. [How to manage cgroups with CPUShares][15] + 3. [Managing cgroups the hard way—manually][16] + 4. [Managing cgroups with systemd][17] + + + +Enjoy and learn from them, as I did. + +### Other resources + +There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup. This list has grown since I started this series of articles to reflect the research I have done. + + * The Fedora Project has a good, practical [guide][18] [to systemd][18]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd. + * The Fedora Project also has a good [cheat sheet][19] that cross-references the old SystemV commands to comparable systemd ones. + * The [systemd.unit(5) manual page][20] contains a nice list of unit file sections and their configuration options along with concise descriptions of each. + * Red Hat documentation contains a good description of the [Unit file structure][21] as well as other important information. + * For detailed technical information about systemd and the reasons for creating it, check out Freedesktop.org's [description of systemd][22]. This page is one of the best I have found because it contains many links to other important and accurate documentation. + * Linux.com's "More systemd fun" offers more advanced systemd [information and tips][23]. + * See the man page for [systemd.resource-control(5)][24]. + * In [_The Linux kernel user's and administrator's guide_][25], see the [Control Group v2][26] entry. + + + +There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers. + + * [Rethinking PID 1][27] + * [systemd for Administrators, Part I][28] + * [systemd for Administrators, Part II][29] + * [systemd for Administrators, Part III][30] + * [systemd for Administrators, Part IV][31] + * [systemd for Administrators, Part V][32] + * [systemd for Administrators, Part VI][33] + * [systemd for Administrators, Part VII][34] + * [systemd for Administrators, Part VIII][35] + * [systemd for Administrators, Part IX][36] + * [systemd for Administrators, Part X][37] + * [systemd for Administrators, Part XI][38] + + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/cgroups + +作者:[David Both][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/dboth +[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://en.wikipedia.org/wiki/Top_(software) +[3]: https://opensource.com/article/19/11/monitoring-linux-glances +[4]: https://opensource.com/article/20/4/systemd +[5]: https://en.wikipedia.org/wiki/Cgroups +[6]: mailto:user@0.service +[7]: mailto:user@1000.service +[8]: mailto:1.2-org.xfce.Xfconf@0.service +[9]: mailto:1.2-ca.desrt.dconf@0.service +[10]: mailto:1.10-org.freedesktop.problems@0.service +[11]: https://midnight-commander.org/ +[12]: https://www.redhat.com/sysadmin/users/steve-ovens +[13]: https://www.redhat.com/sysadmin/ +[14]: https://www.redhat.com/sysadmin/cgroups-part-one +[15]: https://www.redhat.com/sysadmin/cgroups-part-two +[16]: https://www.redhat.com/sysadmin/cgroups-part-three +[17]: https://www.redhat.com/sysadmin/cgroups-part-four +[18]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[19]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[20]: https://man7.org/linux/man-pages/man5/systemd.unit.5.html +[21]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/managing-services-with-systemd_configuring-basic-system-settings#Managing_Services_with_systemd-Unit_File_Structure +[22]: https://www.freedesktop.org/wiki/Software/systemd/ +[23]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[24]: https://man7.org/linux/man-pages/man5/systemd.resource-control.5.html +[25]: https://www.kernel.org/doc/html/latest/admin-guide/index.html +[26]: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html +[27]: http://0pointer.de/blog/projects/systemd.html +[28]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[29]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[30]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[31]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[32]: http://0pointer.de/blog/projects/three-levels-of-off.html +[33]: http://0pointer.de/blog/projects/changing-roots +[34]: http://0pointer.de/blog/projects/blame-game.html +[35]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[36]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[37]: http://0pointer.de/blog/projects/instances.html +[38]: http://0pointer.de/blog/projects/inetd.html diff --git a/sources/tech/20201102 5 reasons to use Linux in 2020.md b/sources/tech/20201102 5 reasons to use Linux in 2020.md new file mode 100644 index 0000000000..832ac8fd46 --- /dev/null +++ b/sources/tech/20201102 5 reasons to use Linux in 2020.md @@ -0,0 +1,87 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (5 reasons to use Linux in 2020) +[#]: via: (https://opensource.com/article/20/11/linux-2020) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +5 reasons to use Linux in 2020 +====== +Here's a look back at the year so far and a review of what you need to +know about Linux in 2020. +![Penguin driving a car with a yellow background][1] + +Some of the best technology is a moving target. When technology stagnates, society tends to outpace and outgrow it. [Linux][2], the widely used open source operating system (OS), is a foundational technology and the basis for some of the most progressive modern computing ideas. So, while it's startlingly unchanged after three decades of development, it also allows adaptation. As a result, Linux is in a unique position of being both a sound investment in skills because it doesn't change and a seemingly eternal driving force for new skills to learn. + +The year 2020 has been a strange one—by any measure—but for Linux, it's been a typical development cycle. Here's a look back at the year so far and a review of what you need to know about Linux in 2020. + +### ZFS on Linux + +The ZFS filesystem offers integrity checking for data and metadata, redundancy with mirroring, support for up to _256 trillion yobibytes_ of storage, hardware-accelerated native encryption, and efficient replication. ZFS is a Sun Microsystems innovation that, unfortunately, has a license that prohibits it from being bundled with Linux by default. However, the [OpenZFS][3] group has ported the project to BSD and Linux so that you can run ZFS on anything from your laptop to your data center. + +Getting started with ZFS is surprisingly simple on Fedora Linux, as Sheng Mao demonstrates in his article on [setting up ZFS on Linux][4]. + +### Linux interrupts + +No matter how familiar you are with Linux, there's always an opportunity to dive deeper and discover how it achieves what it does so well. Computers running stock markets, digital film studios, audio workstations, and other performance-intensive tasks need real-time processing, while other computers can afford to be a little lazy when processing requests, and it's no small task to manage the myriad loops happening on a computer at any given millisecond. Understanding how and why the Linux kernel manages interrupt requests (IRQs) may not be vital to the everyday user, but it's a fascinating study no matter what you do on computers. Read Stephan Avenwedde's article "[How the Linux kernel handles interrupts][5]" to learn more. + +### Linux in your pocket + +Since Google's Android OS runs on a Linux kernel, many of us technically have Linux in our pockets. As comforting as that might be, Android's smooth Java frontend doesn't always provide the Linux _feeling_ many Linux users long for. And some users don't have an Android phone at all. + +The good news is that you can use Linux on your Android or iOS device, complete with a terminal, Bash, Python, a package manager, and all the other things you love about your favorite open source desktop OS. + +If you're on Android, read my article about [Termux][6]. And if you're on iOS, read Lee Tusman's excellent article about [running a Linux command line on your iOS device][7]. + +### New commands on Linux + +Time marches on, and sometimes the old, quaint commands of yesteryear are insufficient for modern systems. Although your muscle memory may cling to commands like `crontab` and `ifconfig` (and `iwconfig` and `wpa_supplicant`), there are perfectly good replacements for these and more. If you can't bring yourself to abandon your old commands, get familiar with [Bash aliases][8] because these new commands are worth learning. + + * Drop `ifconfig` for `nmcli`. Look, at some point, you have to admit that the unholy combination of `ifconfig` plus `iwconfig` and a foray into `wpa_supplicant` (which you secretly dropped long ago in favor of `wicd` anyway) just isn't efficient. Linux uses `nmcli` now, and it's become a highly usable, sometimes even intuitive way to interface with your network. Read Dave McKay's excellent [nmcli tutorial][9]. + * Cronjobs, `at`, and `batch` are uniquely timeless commands that probably ought never be replaced. They're great for quick and simple scheduling, but for complex jobs, you might find some features you like in a supplement to them: systemd timers. David Both provides an extensive [systemd timers tutorial][10] that demonstrates how to write and monitor your important custom system tasks. + * `gcore` and `gdb` are important debuggers that developers may be familiar with. A new take on `gcore` functionality is Microsoft's ProcDump, which obtains a core dump of a process ID (PID) so that you can analyze it with `gdb`. It's more an alternative than a replacement, but it's worth trying if you're curious about different tools. Read Guarav Kamathe's [ProcDump tutorial][11] for more information. + + + +### The cloud runs on Linux + +As "the cloud" continues full steam ahead, Linux remains its main driving force. The cloud is a collection of computers (nodes) with a massively distributed filesystem (such as [Ceph][12]), and it's commonly managed with Kubernetes ("_KOO-burr-net-eez"_] or [OpenShift][13]. + +Regardless of how well you know Linux on your laptop or desktop or even in your private data center, there's a whole new world of Linux experimentation available in containers running on the cloud. It can take some adjustment to learn how to get comfortable in an ephemeral container, but with some practice and a little context, you can build some interesting systems and then orchestrate them (that is, cause them to update, scale, and perform as needed) with Kubernetes. + +Jiaqi Liu wrote one of the best overviews of the cloud workflow in "[A beginner's guide to Kubernetes container orchestration][14]." Read it, and then download Chris Collins' [Kubernetes eBook][15] to build your own cloud at home on a Raspberry Pi cluster. + +### Open source growth + +Linux users relish the consistency and stability of Linux, and it's a testament to the original Unix system design that the OS can stay the same while also pushing its boundaries into exciting new forms of technology. Part of the fun of Linux and open source is the sense of discovery you get when you start learning a new command and the sense of accomplishment when it works to make your life easier. Take a look at the latest Linux developments, and get started with something new today! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/linux-2020 + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background) +[2]: https://opensource.com/resources/linux +[3]: https://openzfs.org/wiki/Main_Page +[4]: https://opensource.com/article/20/10/zfs-dnf +[5]: https://opensource.com/article/20/10/linux-kernel-interrupts +[6]: https://opensource.com/article/20/8/termux +[7]: https://opensource.com/article/20/9/run-linux-ios +[8]: https://opensource.com/article/19/7/bash-aliases +[9]: https://opensource.com/article/20/7/nmcli +[10]: https://opensource.com/article/20/7/systemd-timers +[11]: https://opensource.com/article/20/7/procdump-linux +[12]: https://opensource.com/business/15/1/introduction-ceph-storage-openstack +[13]: https://www.redhat.com/en/technologies/cloud-computing/openshift +[14]: https://opensource.com/article/20/6/container-orchestration +[15]: https://opensource.com/downloads/kubernetes-raspberry-pi diff --git a/sources/tech/20201103 27 Super Cool Raspberry Pi Zero W Projects for DIY Enthusiasts.md b/sources/tech/20201103 27 Super Cool Raspberry Pi Zero W Projects for DIY Enthusiasts.md new file mode 100644 index 0000000000..e315657689 --- /dev/null +++ b/sources/tech/20201103 27 Super Cool Raspberry Pi Zero W Projects for DIY Enthusiasts.md @@ -0,0 +1,364 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (27 Super Cool Raspberry Pi Zero W Projects for DIY Enthusiasts) +[#]: via: (https://itsfoss.com/raspberry-pi-zero-projects/) +[#]: author: (Chinmay https://itsfoss.com/author/chinmay/) + +27 Super Cool Raspberry Pi Zero W Projects for DIY Enthusiasts +====== + +The small form factor of the [Raspberry Pi Zero W][1] enables a new range of projects. In fact, a lot of people use the Pi Zero in the final version of the project after prototyping on a different full-sized Pi board. And, that’s because it consumes much less power compared to the flagship Pi boards and makes it ideal to build battery powered gadgets. + +Preview | Product | Price | +---|---|---|--- +![CanaKit Raspberry Pi Zero W \(Wireless\) Complete Starter Kit - 16 GB Edition][2] ![CanaKit Raspberry Pi Zero W \(Wireless\) Complete Starter Kit - 16 GB Edition][2] | [CanaKit Raspberry Pi Zero W (Wireless) Complete Starter Kit - 16 GB Edition][3] | $32.99[][4] | [Buy on Amazon][5] + +After scouring [Instructables][6], [Reddit][7], [Hackaday][8], other maker oriented communities and my own experience with Pi, I have compiled a list of projects built around the Raspberry Pi Zero and the Raspberry Pi Zero W. The community is extremely innovative and all these projects make impressive use of various features of this maker board. + +So, in addition to the awesome list of [Raspberry Pi Projects][9] that we covered earlier, here, we will be focusing on Raspberry Pi Zero! + +### Top Creative Projects You Can Build With Raspberry Pi Zero + +![][10] + +Of course, you’re free to use some [Raspberry Pi Zero alternatives][11] and try the same project ideas mentioned below. + +#### 1\. Portable Game Console + +This is by far my favorite project built around the Raspberry Pi Zero, hence featured at the top. Today we have emulators for most of the retro games. This project puts the Pi Zero in the classic game-boy form factor. You can play most of your favorite retro games and you can play them anywhere. + +This project is also beautifully documented in YouTube video(s) and on Instructables. + +[Portable Game Console][12] + +#### 2\. DIY Smart Speaker Powered by Alexa + +Amazon’s Alexa has always been very tinkerer friendly and makers around the world have built all kinds of Alexa based devices. This project also adds RGB programmable LED’s to make it look a little more like the echo speaker. + +[DIY Smart Speaker][13] + +#### 3\. Home Network Music System + +Getting a proper home music system setup is usually expensive. However, with the inexpensive Raspberry Pi Zero, you can utilize your MP3 collection to set up a home network music system. + +This project uses the [PiDrive][14], PiDrive is basically a Raspberry Pi Zero W attached to a hard disk. Unfortunately, I think it has been discontinued but you can also build it using a normal Pi Zero W in different configurations. You can play local music or even stream from different services. + +[Pi MusicBox][15] + +#### 4\. Network Ad Blocker using Pi-Hole + +This is something I personally use on a daily basis and it has completely changed my internet experience. If you’re someone who doesn’t want to see advertisements while you browse around online, an Ad blocker using Raspberry Pi would be exciting, right? + +[Pi-Hole][16] on a Raspberry Pi can block all the ads on your entire network. Anyone on the network with an active Pi-Hole will have an ad-free experience. It also speeds up your internet experience since the bandwidth used by ads is freed up. + +You can watch Linus’ video to get an idea or refer to the detailed post in Linus Tech Tips forums linked in the button below. + +[Ad-Blocker using Pi Hole][17] + +#### 5\. AirPlay Speaker using Raspberry Pi Zero + +![][18] + +AirPlay is a chromecast equivalent in the Apple ecosystem, you can cast media from your Apple devices to an AirPlay supported speaker. + +This project is built very well with 3D printed parts and you can find detailed instructions for it. + +[AirPlay Speaker][19] + +#### 6\. DIY Google Home with a Bluetooth Speaker + +![][20] + +This is another nifty little project which is a tinkerer’s dream. Building your own smart speaker powered by the Google Assistant? Indeed, exciting! + +Here, a Pi Zero is paired with a Bluetooth speaker, microphone and the Google Assistant SDK to achieve some functionalities. You can ask questions and do most of the things you can with the official Google Home device. This project does not handle the casting part of the Google Home experience though. + +[DIY Google Home][21] + +#### 7\. Pedal Pi – Raspberry Pi Zero Guitar Pedal + +Pedal Pi is a programmable Lo-Fi guitar pedal built using the Pi Zero where you can program your own custom effects. The project is fully open source (including the hardware) as well. It goes to prove how versatile the Pi Zero can be. + +It can be an incredibly fun experience for people who are makers and also into digital music. + +[Pedal Pi][22] + +#### 8\. ZeroBot – FPV Robot + +There are a lot of different robots you can build using the Pi Zero. It is almost perfect for any kind of robot that you can think of building. It has ample amount of [GPIO][23], a decent processor, a camera interface and the choice of software stack and programming language. + +The ZeroBot is an [FPV][24] bot which also has a camera and is able to transmit what it is seeing. It even features a completely 3D printed body. + +You can find [detailed instructions here][25]. + +#### 9\. WiFi Security Camera + +Raspberry Pi Zero W comes with a CSI connector where you can connect the camera module. This compatibility also lets you easily build a WiFi-powered CCTV camera(s) for your home at a very reasonable price compared to commercial products. + +The [motionEyeOS][26] is a purposely built to convert your SBC (in this case the Pi Zero) to a surveillance system. You can find more information in the video above or head to the link below. + +[WiFi Security Camera][27] + +#### 10\. PIX-E GIF Camera + +![][28] + +GIF’s have taken over social media and all IM platforms. Just thinking of a dedicated GIF camera makes me chuckle. That’s exactly what this project is all about. I am very curious about how it would turn out with the new HQ camera which has a much better image quality. + +This [project has been documented][29] really well with accompanying videos on Hackaday + +[GIF Camera][29] + +#### 11\. Wearable Timelapse Camera + +One of the sleekest camera project I’ve seen, this is a wearable camera. You can take time-lapses, and videos from a first person’s perspective. + +This is a project by Adafruit and is documented really well. Refer to the video above to get an idea or head to the link below. + +[Wearable Timelapse Camera][30] + +#### 12\. Telescope Camera + +![][31] + +Building a telescope camera is one of the most popular camera based applications for the Pi Zero. Makers around the world have taken amazing pictures with their DIY telescope cameras. + +[Telescope Camera][32] + +#### 13\. Kodi on Pi Zero + +Kodi is one of the best open source [media server software][33] for making a media box for your TV. The amazing part is that it also runs on the Pi Zero W. + +Now you can DIY an alternative to the Amazon Fire TV Stick. + +[Kodi on Pi Zero][34] + +#### 14\. OctoPrint – Wireless 3D Printing + +![][35] + +If you are into 3D printing, you would have heard about [OctoPrint][36] at some point. OctoPrint unlocks many feature comforts we enjoy with normal printers like sending print jobs directly from the computer to the 3D printer instead of using a micro SD card. You can also attach a webcam and monitor your prints and control all aspects of the printer. + +OctoPrint is usually used with the bigger Pi’s but it can also be used with the Raspberry Pi Zero W with some soldering and mods. It is important to note that there is low WiFi interference when using the Pi Zero since it can impact prints. Here are some references talking about OctoPrint on Pi Zero to help you build it yourself: + + * [OctoPrint on Pi Zero][37] + * [OctoPrint on Pi Zero (from Prusa 3D)][38] + + + +#### 15\. Pirate Radio Station + +This seems like quite a fun idea, you can actually make the Pi Zero W broadcast using FM. + +It also happens to be a simple project and you don’t need many additional components either. You can be your own neighborhood RJ, do make sure to check out the legal aspects of a pirate radio station in your country. + +[Pirate Radio Station][39] + +#### 16\. IoT Smart Alarm Clock + +![][40] + +Here’s a project making something which might sound very trivial but nevertheless is super cool and underrated. + +The freedom of being able to program your own alarm clock, automating it with scripts and making your life a little easier and fun (and still not waking up) sounds exciting! + +[IoT Smart Alarm Clock][41] + +#### 17\. Pi Zero Tesla Coil + +This is the most unexpected yet an amazing project I’ve come across which uses the Pi Zero W. + +It doesn’t get cooler than playing music on a [tesla coil][42] using the Pi. Make sure you watch the video. + +[Tesla Coil with Pi Zero][43] + +#### 18\. Network Performance Monitoring using Pi Zero + +![][44] + +If you like to keep tabs on your network, you should check out this project. + +This is a [bandwidth monitor][45] built using the Pi Zero W that features a nifty little screen to display important stats. + +[Bandwidth Monitor][45] + +#### 19\. Pi Pod – Raspberry Pi Zero Music Player + +![][46] + +It’s 2020 and you might be thinking who would want a portable music player since mobile phones have replaced them almost entirely. But, there are always people (including myself) who would want a device dedicated to music and does not do anything else. + +This project features the Raspberry Pi Zero W in another form and looks pretty neat. It’s called the **Pi Pod**. + +You can also design your own 3D printable enclosure and customize every element of the music player. + +[Pi Pod][47] + +#### 20\. Raspberry Pi Drone + +![][48] + +The Pi Zero packs in enough features and processing power for it be at the heart of a drone. It is light weight, cheaper than some alternative drone specific boards too. You also get the freedom of using different firmware(s) or code one on your own. + +There are also many open source designs available for the frame of the drone on [Thingiverse.][49] + +[Pi Drone][50] + +#### 21\. Internet Connected Info Display + +The Pi Zero W is capable of connecting to the internet via WiFi, it also has all the GPIO and display outputs to make a highly functional device to display information from the internet. + +The freedom of programming means that you can have the display show any information you need. Your google calendar events, stock prices and anything you can find on the internet. +Here are a couple of interesting projects which are built around this idea. + + 1. [YouTube Subscriber Counter][51] + 2. [Raspberry Pi Internet Connected Information Display][52] + + + +#### 22\. Raspberry Pi Pocket Projector + +Ever since Texas Instruments came out with the mini projector evaluation board, a Raspberry Pi Zero based projector has been a very popular project. + +If you can get your hands on the projector module, this can be a very interesting build. This is not a beginner-friendly project, but a tinkerer should feel right at home. You can find all the relevant details from the video above. + +#### 23\. VPN Server + +![][53] + +In today’s world, extra care needs to be taken about companies barging into one’s privacy and using a VPN is becoming more and more commonplace. + +Fret not, you can utilize the Raspberry Pi Zero W with [OpenVPN][54] to add an extra layer of security to your home network. This can be a great for small families where everyone in the house can be protected and don’t need to separate VPN subscriptions. + +[VPN Server][55] + +#### 24\. Weather Station + +![][56] + +This is a very cool project, a complete weather station which can display various weather metrics for the day and forecasts too. It even includes a 3D printed case which looks pretty sharp. The amazing part is that you can use the display to show things other than weather as well. + +As I also noticed in another similar project on [Instructables][57], you may also tweak it with your own custom database and website. + +[Weather Station][58] + +#### 25\. Ambient Lighting System for TV + +An ambient lighting system enhances the TV experience, this is another amazing project involving the Raspberry Pi Zero. + +In real life this effect feels like a dynamic portrait mode applied to the screen and whatever is being shown on the screen, makes the experience a lot immersive. + +GreatScott (a popular YouTuber) for content based around electronics and DIY shows you around with the project in the video above. You may also refer to the written instructions from the link below. + +[Ambient Lighting System][59] + +#### 26\. Wireless Network Printer + +![][60] + +The Pi Zero W is a great board to make any old printer free from being fixed to one computer and have the freedom of placing it anywhere. + +This way print jobs can be sent from multiple computers, phones on the same network. This is a quality of life improvement which is highly underrated, even in households. + +This project utilizes [CUPS][61] running on Pi Zero W to make your printer wireless. + +[Wireless Network Printer][62] + +#### 27\. Pi Zero Cluster + +![][63] + +You can pack in 10’s of these tiny computers together to have access to massive amounts of parallel processing. The GPU’s on these SBC’s can be utilized for challenging compute needs. + +Regular Raspberry Pi’s have long been used to make clusters and Raspberry Pi based super computers consisting of 100’s – 1000’s of Pi’s. Since the introduction of the Pi Zero with it’s lower price and size, it is possible to put more of them into a small space. + +There are many custom boards which are built to hold multiple Pi Zero’s. + +[Pi Zero Cluster][64] + +#### Closing Thoughts + +The projects featured here are only a tip of the iceberg. You can find many more projects if you look around on the internet. The versatility of the Raspberry Pi Zero is unprecedented, combined with its affordability it is one of the most used SBC by makers and tinkerers around the world. + +What did you build with the Raspberry Pi Zero ? Put it in the comments below along with your favorite projects. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/raspberry-pi-zero-projects/ + +作者:[Chinmay][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/chinmay/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/raspberry-pi-zero-w/ +[2]: https://i1.wp.com/m.media-amazon.com/images/I/517BwcAPmTL._SL160_.jpg?ssl=1 +[3]: https://www.amazon.com/dp/B072N3X39J?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (CanaKit Raspberry Pi Zero W (Wireless) Complete Starter Kit - 16 GB Edition) +[4]: https://www.amazon.com/gp/prime/?tag=chmod7mediate-20 (Amazon Prime) +[5]: https://www.amazon.com/dp/B072N3X39J?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Buy on Amazon) +[6]: https://www.instructables.com +[7]: https://www.reddit.com/r/raspberry_pi +[8]: https://hackaday.com +[9]: https://itsfoss.com/raspberry-pi-projects/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/raspberry-pi-zero-w-projects.png?resize=800%2C450&ssl=1 +[11]: https://itsfoss.com/raspberry-pi-zero-alternatives/ +[12]: https://www.instructables.com/DIY-Raspberry-Pi-Zero-Handheld-Game-Console/ +[13]: https://www.instructables.com/Alexa-Assistant-With-a-10-Raspberry-Pi-Zero-W-and-/ +[14]: https://www.raspberrypi.org/blog/meet-314gb-pidrive/ +[15]: https://www.instructables.com/Raspberry-Pi-Home-Network-Music-System/ +[16]: https://pi-hole.net/ +[17]: https://linustechtips.com/main/topic/1094810-pi-hole-setup-tutorial/ +[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-airplay-speaker.png?resize=800%2C578&ssl=1 +[19]: https://www.hackster.io/fvdbosch/raspberry-pi-zero-airplay-speaker-d99feb +[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-google-home.png?resize=800%2C541&ssl=1 +[21]: https://www.instructables.com/DIY-Google-Home-With-Bluetooth-Speaker-on-Raspberr/ +[22]: https://www.instructables.com/Raspberry-Pi-Zero-Guitar-Pedal/ +[23]: https://en.wikipedia.org/wiki/General-purpose_input/output +[24]: https://en.wikipedia.org/wiki/First-person_view_(radio_control) +[25]: https://hackaday.io/project/25092-zerobot-raspberry-pi-zero-fpv-robot +[26]: https://github.com/ccrisan/motioneyeos +[27]: https://maker.pro/raspberry-pi/projects/how-to-build-a-cctv-network-camera-with-raspberry-pi-zero-w-and-motionpie +[28]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-gif-camera.jpg?resize=800%2C633&ssl=1 +[29]: https://hackaday.io/project/16358-pix-e-gif-camera +[30]: https://learn.adafruit.com/raspberry-pi-wearable-time-lapse-camera/overview +[31]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-telescope-camera.png?resize=800%2C555&ssl=1 +[32]: https://www.instructables.com/Astrophotography-With-the-Raspberry-Pi-Zero/ +[33]: https://itsfoss.com/best-linux-media-server/ +[34]: https://dronebotworkshop.com/kodi-raspberry-pi/ +[35]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/octoprint-logo.png?resize=515%2C421&ssl=1 +[36]: https://octoprint.org +[37]: https://toglefritz.com/how-to-run-octoprint-on-a-raspberry-pi-zero/ +[38]: https://help.prusa3d.com/en/article/octoprint-building-an-image-for-raspberry-pi-zero-w_2182 +[39]: https://makezine.com/projects/pirate-radio-throwies/ +[40]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-iot-clock.png?resize=800%2C472&ssl=1 +[41]: https://hackaday.io/project/19230-iot-smart-alarm-clock +[42]: https://en.wikipedia.org/wiki/Tesla_coil +[43]: https://www.extremeelectronics.co.uk/electronic-tesla-coils/pi-zero-tesla-coil/ +[44]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-network-performance.png?resize=800%2C432&ssl=1 +[45]: https://www.instructables.com/Bandwidth-Monitor/ +[46]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-pod-music-player.png?resize=743%2C542&ssl=1 +[47]: https://www.raspberrypi.org/blog/pipod-pi-zero-music-player/ +[48]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-zero-drone.png?resize=736%2C552&ssl=1 +[49]: https://thingiverse.com +[50]: https://www.hackster.io/12590/pi0drone-a-200-smart-drone-with-the-pi-zero-4fec08?f=1 +[51]: https://www.youtube.com/watch?v=afY_xHqQu-s +[52]: https://www.hackster.io/fvdbosch/raspberry-pi-zero-internet-connected-information-display-5cae96 +[53]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-open-vpn.jpg?resize=800%2C296&ssl=1 +[54]: https://openvpn.net/ +[55]: https://circuitdigest.com/microcontroller-projects/turn-your-raspberry-pi-zero-in-to-a-vpn-server-using-openvpn +[56]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-zero-weather-station.png?resize=800%2C599&ssl=1 +[57]: https://www.instructables.com/Complete-Raspberry-Pi-Weather-Station/ +[58]: https://www.hackster.io/hartmut-wendt/raspberry-pi-based-weather-station-a9a7dd +[59]: https://www.instructables.com/Make-Your-Own-Ambient-Lighting-With-the-Raspberry-/ +[60]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-wireless-printer.jpg?resize=800%2C450&ssl=1 +[61]: https://www.cups.org/ +[62]: https://maker.pro/raspberry-pi/projects/how-to-turn-a-usb-printer-into-a-wireless-printer-with-raspberry-pi-zero-w +[63]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/pi-zero-cluster.png?resize=800%2C531&ssl=1 +[64]: https://magpi.raspberrypi.org/articles/clusterhat-review-cluster-hat-kit diff --git a/sources/tech/20201103 A Brief History of Ubuntu Touch.md b/sources/tech/20201103 A Brief History of Ubuntu Touch.md new file mode 100644 index 0000000000..c770c2e613 --- /dev/null +++ b/sources/tech/20201103 A Brief History of Ubuntu Touch.md @@ -0,0 +1,154 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A Brief History of Ubuntu Touch) +[#]: via: (https://itsfoss.com/ubuntu-touch/) +[#]: author: (John Paul https://itsfoss.com/author/john/) + +A Brief History of Ubuntu Touch +====== + +Sensing the tech trend, Ubuntu tried its hands on creating a Linux-based mobile operating system. The first announcement came a decade back and six years down the line, Ubuntu closed the curtains on the project. + +What went wrong? How it started? Is Ubuntu Touch still alive? Let’s take a look at the history of Ubuntu Touch in chronological order. + +### Shuttleworth Announced Ubuntu Touch + +![][1] + +The [Ubuntu Touch project][2] began with a blog post by Canonical founder [Mark Shuttleworth][3]. The [blog post][4], dated October 31, 2011, started with a bold prediction: “By 14.04 LTS Ubuntu will power tablets, phones, TVs and smart screens from the car to the office kitchen, and it will connect those devices cleanly and seamlessly to the desktop, the server and the cloud.” + +Shuttleworth went on to explain that this move would be accomplished mainly through the use of the company’s new desktop environment, Unity. (Unity was introduced in Ubuntu 10.10.) “Unity, the desktop interface in today’s Ubuntu 11.10, was designed with this specific vision in mind.” + +The whole idea behind Unity was to create an interface that would work on different screen resolutions. + +_**“Unity’s core elements are arranged in exactly the way we need to create coherence across all of those devices. This was the origin of the name Unity – a single core interface framework, that scales across all screens, and supports all toolkits.”**_ + +Shuttleworth said that this move was motivated by the increasing use of mobile devices. “Make no mistake – just as the world is changing for manufacturers so is it changing for Linux distributions. Today, 70% of people in Egypt access the Internet solely via the phone. Even in the US that figure is a startling 25%.” + +### Ubuntu Touch is Released to the World + +![][5] + +The Unity desktop environment was originally introduced in the netbook version of Ubuntu 10.10. However, the phone interface wouldn’t be seen by the public until 2013. [Mark Shuttleworth demoed][6] it at the 2013 CES. + +Ubuntu Touch 1.0 was baked into the [Ubuntu 13.10 release][7]. This version primarily supported “Galaxy Nexus and Nexus 4 phone” with other images being available, as well. + +The [system requirements][8] for Ubuntu Touch looked a little bit like this: + +| Entry-level Ubuntu smartphone | High-end Ubuntu “superphone” +---|---|--- +Processor architecture | 1Ghz Cortex A9 | Quad-core A9 or Intel Atom +Memory | 512MB – 1GB | Min 1GB +Flash storage | 4-8GB eMMC + SD | Min 32GB eMMC + SD +Multi-touch | Yes | Yes +Desktop convergence | No | Yes + +![Convergence concept][9] + +Note: The last item on the above list (**desktop convergence**) might be a new idea to some people. This meant that you could use your Ubuntu Touch device like a phone, but you could also hook it up to a display, keyboard, and mouse to use it as a desktop. Unfortunately, Ubuntu Touch never gained this feature. + +### Ubuntu Tries to Crowdfund a Phone + +To show off what an ideal Ubuntu phone would look like, Canonical started a crowdfunding campaign to finance the [Ubuntu Edge][10] on July 22, 2013. The goal was to raise $32 million in a month to produce 40,000 devices. + +According to the campaign’s page, Canonical hoped to use the new device “to provide a low-volume, high-technology platform, crowdfunded by enthusiasts and mobile computing professionals. A pioneering project that accelerates the adoption of new technologies and drives them down into the mainstream.” + +The Ubuntu Edge was considered high-end at the time with the following specs: + +Mobile OS | Dual-boots Android and Ubuntu mobile +---|--- +Desktop OS | Ubuntu Desktop +RAM | 4GB +Internal storage | 128GB +Screen | 720 x 1,280, 4.5 inches +Protection | Sapphire Glass +Connectivity | Dual-LTE, GSM +Speakers | Stereo +Battery | Silicon-anode Li-ion +Price | $695 + +Interestingly, several large companies pledged money. For example, [Bloomberg pledged $800,000][11]. They made this pledge because they believed that Ubuntu Touch “could benefit its clients and the future of mobile Relevant Products/Services computing.” + +Ultimately, the campaign didn’t reach its goal. It only reached $12.7 million or 37% of the goal. The amount raised was the biggest a crowdfunding campaign ever saw. + +### Ubuntu Touch Goes into Production (Sort of) + +Though Canonical failed to make its own hardware, it continued working on the software part i.e., developing the Ubuntu Touch mobile operating system. + +![][12] + +Ubuntu Touch was released to device makers in 2014. That same year, [two device makers committed][13] to produce Ubuntu phones. These two companies, Chinese Meizu and Spanish BQ, weren’t exactly global household names, but Shuttleworth said that was all part of the plan. + +_“While we’re happy to work with household names, we want to be involved with partners for whom we can be a significant part of their story, rather than being appended to the more complicated story of other brands.”_ + +Both companies produced and released several phones with Ubuntu Touch as the main operating system. BQ also released an Ubuntu Touch tablet. However, no other manufacturer signed up to make Ubuntu Touch devices. + +### Canonical Discontinues Ubuntu Touch + +![Unity 8 was in beta when Ubuntu discontinued Unity and Ubuntu Touch project][14] + +In early April of 2017, Mark Shuttleworth made another [announcement][15]. After mentioning that Canonical had experienced an “excellent quarter and excellent year”, Shuttleworth [announced the end of the Ubuntu Touch and Unity][16]. “I’m writing to let you know that we will end our investment in Unity8, the phone and convergence shell.” Instead, Canonical would focus on desktop Ubuntu. + +He continued: + +> I took the view that, if convergence was the future and we could deliver it as free software, that would be widely appreciated both in the free software community and in the technology industry, where there is substantial frustration with the existing, closed, alternatives available to manufacturers. I was wrong on both counts. In the community, our efforts were seen fragmentation not innovation. And industry has not rallied to the possibility, instead taking a ‘better the devil you know’ approach to those form factors, or investing in home-grown platforms. What the Unity8 team has delivered so far is beautiful, usable and solid, but I respect that markets, and community, ultimately decide which products grow and which disappear. + +He closed by saying that it was a hard decision to make because of his strong belief in the future of convergence. + +### The Community Keeps the Project Alive + +When Shuttleworth’s announcement hit the internet, all the supporters of Ubuntu Touch were shocked. Many were unsure of what would happen to the devices that they owned. Thankfully, the community came to the rescue. + +![][17] + +Shortly after Shuttleworth’s announcement, Marius Gripsgård [announced][18] that the UBports team would be keeping Ubuntu Touch alive. UBports was already well known in the Ubuntu Touch community for their work on porting it to more devices. + +Several other projects tried to do the same with the desktop version of Unity, but most did not last long. One of them had the inventive name of Yunit but I guess it is not actively developed anymore. + +[UBports is the only project][2] that is keeping Ubuntu Touch alive by continuously working on its development. + +### Epilogue + +Ubuntu Touch was not the success that Canonical wanted it to be. It was too early for the market. However, it did lay the groundwork for the Linux phones that we have now. + +I believe that the [PinePhone][19] and the [Purism Librem 5][20] phone would not have come about without Ubuntu Touch sparking interest in a Linux phone. At the same time, the Canonical engineers and programmers solved problems that laid the groundwork for these modern phones. You don’t get successes without a few failures along the way. + +If you found this article interesting, please take a minute to share it on social media, Hacker News, or [Reddit][21]. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ubuntu-touch/ + +作者:[John Paul][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/ubuntu-touch-devices.jpg?resize=800%2C497&ssl=1 +[2]: https://ubuntu-touch.io/ +[3]: https://en.wikipedia.org/wiki/Mark_Shuttleworth +[4]: https://www.markshuttleworth.com/archives/820 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/ubuntu-touch-tablet.jpg?resize=625%2C363&ssl=1 +[6]: https://www.youtube.com/watch?v=RO7QbCqFY7Y +[7]: https://wiki.ubuntu.com/SaucySalamander/ReleaseNotes#Ubuntu_for_Phones +[8]: https://web.archive.org/web/20130326085927/http://www.ubuntu.com/devices/phone/operators-and-oems +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2016/02/convergence-ubuntu.jpg?resize=1024%2C588&ssl=1 +[10]: https://www.indiegogo.com/projects/ubuntu-edge#/ +[11]: https://web.archive.org/web/20131020144457/http://www.cio-today.com/story.xhtml?story_title=Ubuntu_Edge_Smartphone_Raises_Millions__Falls_Short&story_id=10200A158ZW0 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2015/02/image-phone-overview.jpg?resize=567%2C302&ssl=1 +[13]: https://www.cnet.com/news/ubuntu-touch-gets-grip-on-its-first-phone-makers/ +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/unity8_ubports.png?resize=800%2C450&ssl=1 +[15]: https://ubuntu.com/blog/growing-ubuntu-for-cloud-and-iot-rather-than-phone-and-convergence +[16]: https://itsfoss.com/ubuntu-unity-shutdown/ +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/ubports.jpeg?resize=720%2C480&ssl=1 +[18]: https://news.softpedia.com/news/ubuntu-touch-and-unity-8-are-not-dead-ubports-community-will-keep-them-alive-514620.shtml +[19]: https://itsfoss.com/pinephone/ +[20]: https://itsfoss.com/librem-linux-phone/ +[21]: https://%0Areddit.com/r/linuxusersgroup diff --git a/sources/tech/20201105 6 evening rituals for working in tech.md b/sources/tech/20201105 6 evening rituals for working in tech.md new file mode 100644 index 0000000000..6b999b090e --- /dev/null +++ b/sources/tech/20201105 6 evening rituals for working in tech.md @@ -0,0 +1,49 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (6 evening rituals for working in tech) +[#]: via: (https://opensource.com/article/20/11/evening-rituals-working-tech) +[#]: author: (Jen Wike Huger https://opensource.com/users/jen-wike) + +6 evening rituals for working in tech +====== +After a busy day of virtual meetings, emails, coding, and collaborating, +how do you wind down for the night? +![A farm road][1] + +This strange time has given us, on one hand, the chance to slow down, yet on the other, it's busier than ever. Especially if you have others in your life to care for in addition to yourself. But you can't give from an empty cup, so, this list of evening rituals is focused on what you can do for yourself right after you turn the computer off, shut the laptop, or say goodbye to the last virtual meeting of the day. + +1\. Head to the nearest door and take a big, deep belly breath in... and out. I don't care if it's snowing. Fill your lungs with fresh air. Stay for a while if you can -- take a lap around the yard, or walk down the street and back. + +2\. If you have some time, make a cup of tea -- black (is caffeinated, so beware), green, or herbal -- and, let it cool down while you get your shoes (and maybe a jacket) on. Pop it in a favorite thermos, and take a stroll around your neighborhood. You don't have to have a plan or a place you're walking to. Set a timer for 15 minutes if you only have a short window. + +3\. Turn on a song that pops into your head or the one you didn't get a chance to jam/relax to earlier today. + +4\. If you have some time, stand up and dance it out or lay all the way down with your feet up. No more sitting. Don't think, just listen. Research shows giving your brain blank space helps you think and deal better later. + +5\. Open your [reader app][2] or pick up a book (the latter is easier on your eyes), and fully indulge, letting the day slip away, or give yourself enough time to read at least one chapter. + +6\. Make food that feels good. Maybe that means a few basic ingredients and simple instructions. Maybe that means putting together that new, complex meal you've been excited about since you picked up the items at the grocery store. + +Can you combine some of these to get even more out of your evening ritual time? If you're working in tech, creating rituals like this—whether they're [in the morning][3], middle of your day, or evening—is critical as we live out a new normal working from home, taking meetings virtually, and missing the energy of in-person connections with colleagues.  + +What is your evening ritual? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/evening-rituals-working-tech + +作者:[Jen Wike Huger][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jen-wike +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/EDUCATION_jadud_farm-road.png?itok=of8IuSM5 (A farm road) +[2]: https://opensource.com/article/20/2/linux-ebook-readers +[3]: https://opensource.com/article/20/10/tech-morning-rituals diff --git a/sources/tech/20201106 I-m doing another Recurse Center batch.md b/sources/tech/20201106 I-m doing another Recurse Center batch.md new file mode 100644 index 0000000000..1efce36ebb --- /dev/null +++ b/sources/tech/20201106 I-m doing another Recurse Center batch.md @@ -0,0 +1,79 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (I'm doing another Recurse Center batch!) +[#]: via: (https://jvns.ca/blog/2020/11/05/i-m-doing-another-recurse-center-batch-/) +[#]: author: (Julia Evans https://jvns.ca/) + +I'm doing another Recurse Center batch! +====== + +Hello! I’m going to do a batch (virtually) at the [Recurse Center][1], starting on Monday. I’ll probably be blogging about what I learn there, so I want to talk a bit about my plans! + +I’m excited about this because: + + * I love RC, it’s my favourite programming community, and I’ve always been able to do fun programming projects there. + * they’ve put a lot of care into building a great virtual experience (including building some very fun [custom software][2]) + * there’s a pandemic, it’s going to be cold outside, and I think having a little bit more structure in my life is going to make me a lot happier this winter :) + + + +### what’s the Recurse Center? + +The Recurse Center (which I’ll abbreviate to “RC”) is a self-directed programming retreat. It’s free to attend. + +A “batch” is 1 or 6 or 12 weeks, and the idea is that during that time, you: + + 1. choose what things you want to learn + 2. come up with a plan to learn the things (often the plan is “do some kind of fun project”, like [“write a TCP stack”][3]) + 3. learn the things + + + +Also there are a bunch of other delightful people learning things, so there’s lots of inspiration for what to learn and people to collaborate with. There are always people who are early in their programming life and looking to get their first programming job, as well as people who have been programming for a long time. + +Their business model is recruiting – they [partner with][4] a bunch of companies, and if you want a job at the end of your batch, then they’ll match you with companies, and if you accept a job with one of those companies then the company pays them a fee. + +I won’t say too much more about it because I’ve written 50+ other posts about how much I love RC on this blog that probably cover it :) + +### some ideas for what I’ll do at RC + +Last time I did RC I had a bunch of plans going in and did not do any of them. I think this time it’ll probably be the same but I’ll list my ideas anyway: here are some possible things I might do. + + * learn Rails! I’ve been making small websites for a very long time but I haven’t really worked as a professional web developer, and I think it might be fun to have the superpower of being able to build websites quickly. I have an idea for a silly website that I think would be a fun starter rails project. + * experiment with generative neural networks (I’ve been curious about this for years but haven’t made any progress yet) + * maybe finish up this “incidents as a service” system that I started a year and a half ago to help people learn by practicing responding to weird computer situations + * deal with some of the [rbspy][5] issues that I’ve been ignoring for months/years + * maybe build a game! (there’s a games theme week during the batch!) + * maybe learn about graphics or shaders? + + + +In my first batch I spent a lot of time on systems / networking stuff because that felt like the hardest thing I could do. This time I feel pretty comfortable with my ability to learn about systems stuff, so I think I’ll focus on different topics! + +### so that’s what I’ll be writing about for a while! + +I’m hoping to blog more while I’m there, maybe not “every day” exactly (it turns out that blogging every day is a lot of work!), but I think it might be fun to write a bunch of tiny blog posts about things I’m learning. + +I’m also planning to release a couple of zines this month – I finished a zine about CSS, and also wrote another entire zine about bash while I was procrastinating on finishing the CSS zine in a self-imposed “write an entire zine in October” challenge, so you should see those here soon too. I’m pretty excited about both of them. + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/05/i-m-doing-another-recurse-center-batch-/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://www.recurse.com/ +[2]: https://www.recurse.com/virtual-rc +[3]: https://jvns.ca/blog/2014/08/12/what-happens-if-you-write-a-tcp-stack-in-python/ +[4]: https://www.recurse.com/hire +[5]: https://github.com/rbspy/rbspy diff --git a/sources/tech/20201109 Program your microcontroller with MicroBlocks.md b/sources/tech/20201109 Program your microcontroller with MicroBlocks.md new file mode 100644 index 0000000000..9325db5574 --- /dev/null +++ b/sources/tech/20201109 Program your microcontroller with MicroBlocks.md @@ -0,0 +1,144 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Program your microcontroller with MicroBlocks) +[#]: via: (https://opensource.com/article/20/11/microblocks) +[#]: author: (Don Watkins https://opensource.com/users/don-watkins) + +Program your microcontroller with MicroBlocks +====== +MicroBlocks brings a Scratch-like interface to programming the +Micro:bit, Circuit Playground Express, and other microcontroller boards. +![Computer hardware components, generic][1] + +If you like to tinker with technology, you may be familiar with programmable microcontroller boards, such as AdaFruit's [Circuit Playground Express][2] and the [BBC Micro:bit][3]. Now there's a new programming option for you to try: [MicroBlocks][4]. It's a simple Scratch-like programming interface that works well with several microcontrollers, including those two. + +I own both the Circuit Playground Express and the BBC Micro:bit and was eager to try MicroBlocks after discovering it on [Twitter][5]. + +### Install MicroBlocks + +To set up MicroBlocks on a Debian-based Linux distribution, [download][6] and install the .deb file. If you use an RPM-based Linux distribution, you can download the Linux [64-bit][7] or [32-bit][8] standalone executable. MicroBlocks also offers installers for [Windows][9], [macOS][10], and [Raspberry Pi][11]. + +MicroBlocks can also run in a Chrome, Chromium, or Edge [browser][12] using its experimental web platform, which enables special web serial connections. The Chrome web store also has a [browser extension][13] for MicroBlocks. + +### Connect your microcontroller + +Before you can access your microcontroller on Linux, you must add yourself to your computer's dialout group. Linux uses this group to communicate with serial devices, and if your user account isn't in that group, you won't be able to control your device. + +Run the following in a terminal to add yourself to the dialout group: + + +``` +`$ sudo usermod -G dialout -a `whoami`` +``` + +Log out of your desktop and then log back in (or just reboot). Then connect your BBC Micro:bit, Circuit Playground Express, or other microcontroller board to an available USB port on your computer. My [Intel NUC][14] recognized my microcontroller without issue. + +After connecting your microcontroller, you may be asked to update the device's firmware. It's safe to do so. + +![Update firmware option][15] + +(Don Watkins, [CC BY-SA 4.0][16]) + +Once that's done, you're all ready to go. + +### Start programming + +Use the programming interface to set what language you want to use when interacting with MicroBlocks. + +![MicroBlocks language options][17] + +(Don Watkins, [CC BY-SA 4.0][16]) + +You can verify that your microcontroller is connected by checking the Connect icon on the menu. + +![MicroBlocks Connection icon][18] + +(Don Watkins, [CC BY-SA 4.0][16]) + +Now you're ready to start exploring. One of my favorite ways to learn is to tinker with a user interface's different options. What makes MicroBlocks special is that it's a live coding environment, so you get to see changes you make right away. + +Try this: Go to the Display category (in the left-hand column) and drag the display array into the scripting area. Use the menu to change A to B in one of them. + +Click on a programming block, and your code, simple though it may be, runs immediately on the board. + +### Use programming blocks + +If you are familiar with [Scratch][19], you are likely to find MicroBlocks extremely easy to use. Students love it because of the instant feedback from the board and the program. + +My first program was very simple. I wanted to make a simple "smiley face" on my Micro:bit. + +First, I clicked on the Control block and selected: "When button 'a' is pressed." + +Then I selected a smiley face from the LED Display library and connected that to the Control block.  + +Finally, I pressed Button A on my Micro:bit. Feedback is instantaneous. + +![Smiley face displayed on Micro:bit][20] + +(Don Watkins, [CC BY-SA 4.0][16]) + +### Save your code + +Saving your program is easy. On the top menu bar, click on the third icon from the left (the document icon). Choose the Save option from the drop-down menu. + +![Save file in MicroBlocks][21] + +(Don Watkins, [CC BY-SA 4.0][16]) + +Try experimenting with the interface to program your board however you want. For my second program, I used the Control and LED Display blocks to spell out "Bills," which is my favorite NFL team. But there are lots of other functions available, so try designing something that interests you. + +!["Bills" on Micro:Bit][22] + +(Don Watkins, [CC BY-SA 4.0][16]) + +### Do more with MicroBlocks + +Be sure to check out the [quickstart][23] guide on the MicroBlocks website for more information. The site also contains [activity guides][24] with easy-to-follow code examples for students and teachers. These will help anyone get started programming the Micro:bit or the Circuit Playground Express with MicroBlocks. + +MicroBlocks is fully [open source][25] and released under the [Mozilla Public License 2.0][26]. + +MicroBlocks is still under active development by the core team, and they're not currently soliciting code contributions or pull requests. However, they are interested in any MicroBlocks tutorials, lesson plans, or examples from the community, so please [contact them][27] if you have something to share. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/microblocks + +作者:[Don Watkins][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/hardware_disk_components.png?itok=W1fhbwYp (Computer hardware components, generic) +[2]: https://opensource.com/article/19/7/circuit-playground-express +[3]: https://opensource.com/article/19/8/getting-started-bbc-microbit +[4]: https://microblocks.fun/ +[5]: https://twitter.com/microblocksfun +[6]: https://microblocks.fun/download +[7]: https://microblocks.fun/downloads/latest/standalone/ublocks-linux64bit.zip +[8]: https://microblocks.fun/downloads/latest/standalone/ublocks-linux32bit.zip +[9]: https://microblocks.fun/downloads/latest/packages/microBlocks%20setup.exe +[10]: https://microblocks.fun/downloads/latest/packages/MicroBlocks.app.zip +[11]: https://microblocks.fun/downloads/latest/packages/ublocks-armhf.deb +[12]: https://microblocks.fun/run/microblocks.html +[13]: https://chrome.google.com/webstore/detail/microblocks/cbmcbhgijipgdmlnieolilhghfmnngbb?hl=en +[14]: https://opensource.com/article/20/9/linux-intel-nuc +[15]: https://opensource.com/sites/default/files/uploads/microblocks_update-firmware.png (Update firmware option) +[16]: https://creativecommons.org/licenses/by-sa/4.0/ +[17]: https://opensource.com/sites/default/files/uploads/microblocks_set-language.png (MicroBlocks language options) +[18]: https://opensource.com/sites/default/files/uploads/microblocks_connected.png (MicroBlocks Connection icon) +[19]: https://scratch.mit.edu/ +[20]: https://opensource.com/sites/default/files/uploads/smileyface.jpg (Smiley face displayed on Micro:bit) +[21]: https://opensource.com/sites/default/files/uploads/microblocks_save.png (Save file in MicroBlocks) +[22]: https://opensource.com/sites/default/files/uploads/microblocks_bills.png ("Bills" on Micro:Bit) +[23]: https://microblocks.fun/learn#getstarted +[24]: https://microblocks.fun/learn#activity_cards +[25]: https://bitbucket.org/john_maloney/smallvm/src/master/ +[26]: https://www.mozilla.org/en-US/MPL/2.0/ +[27]: https://microblocks.fun/info#contact diff --git a/sources/tech/20201109 Set up Minishift and run Jenkins on Linux.md b/sources/tech/20201109 Set up Minishift and run Jenkins on Linux.md new file mode 100644 index 0000000000..44d5f2ca9a --- /dev/null +++ b/sources/tech/20201109 Set up Minishift and run Jenkins on Linux.md @@ -0,0 +1,311 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Set up Minishift and run Jenkins on Linux) +[#]: via: (https://opensource.com/article/20/11/minishift-linux) +[#]: author: (Jessica Cherry https://opensource.com/users/cherrybomb) + +Set up Minishift and run Jenkins on Linux +====== +Install, configure, and use Minishift to create your first pipeline. +![cubes coming together to create a larger cube][1] + +[Minishift][2] is a tool that helps you run [OKD][3] (Red Hat's open source OpenShift container platform) locally by launching a single-node OKD cluster inside a virtual machine. It is powered by [Kubernetes][4], which is one of my favorite things to talk about. + +In this article, I will demonstrate how to get started with Minishift on Linux. This was written for Ubuntu 18.04, and you'll need [sudo access][5] on your Linux machine to run some commands. + +### Prerequisites + +Before starting the installation, your Linux machine must have either [KVM][6] for Linux or [VirtualBox][7], which runs on every platform. This demo uses KVM, which you can install along with all the required dependencies: + + +``` +$ sudo apt install qemu-kvm \ +libvirt-clients libvirt-daemon-system \ +bridge-utils virt-manager   +``` + +After installing KVM, you must make some modifications to allow your user to use it. Specifically, you must add your user name to the `libvirt` group: + + +``` +$ sudo usermod --append --groups libvirt $(whoami) +$ newgrp libvirt +``` + +Next, install the Docker KVM driver, which is needed to run containers on Minishift. I downloaded the Docker machine driver directly to `/usr/local/bin`. You don't have to save it to `/usr/local/bin`, but you must ensure that its location is in your [PATH][8]: + + +``` +$ curl -L \ +-o /usr/local/bin/docker-machine-driver-kvm + +$ sudo chmod +x /usr/local/bin/docker-machine-driver-kvm +``` + +### Install Minishift + +Now that the prerequisites are in place, visit the Minishift [releases page][9] and determine which version of Minishift you want to install. I used Minishift [v1.34.3][10]. + +[Download the Linux .tar file][11] to a directory you will be able to find easily. I used the `minishift` directory: + + +``` +$ ls +Minishift-1.34.3-linux-amd64.tgz +``` + +Next, untar your new file using [the `tar` command][12]: + + +``` +$ tar zxvf minishift-1.34.3-linux-amd64.tgz +minishift-1.34.3-linux-amd64/ +minishift-1.34.3-linux-amd64/LICENSE +minishift-1.34.3-linux-amd64/README.adoc +minishift-1.34.3-linux-amd64/minishift +``` + +By using the `v` (for _verbose_) option in your command, you can see all the files and their locations in your directory structure. + +Run the `ls` command to confirm that the new directory was created: + + +``` +$ ls +minishift-1.34.3-linux-amd64 +``` + +Next, change to the new directory and find the binary file you need; it is named `minishift`: + + +``` +$ cd minishift-1.34.3-linux-amd64 +$ ls +LICENSE  minishift  README.adoc +$ +``` + +Move the `minishift `binary file to your PATH, which you can find by running the following and looking at the output: + + +``` +$ echo $PATH +/home/jess/.local/bin:/usr/local/sbin:/usr/local/bin +``` + +I used `/usr/local/bin` as the `minishift` binary file's location: + + +``` +$ sudo mv minishift /usr/local/bin +[sudo] password for jess: +$ ls /usr/local/bin +minishift +``` + +Run the `minishift` command and look at the output: + + +``` +$ minishift +Minishift is a command-line tool that provisions and manages single-node OpenShift clusters optimized for development workflows. + +Usage: +  minishift [command] + +Available Commands: +  addons        Manages Minishift add-ons. +  completion  Outputs minishift shell completion for the given shell +  config        Modifies Minishift configuration properties. +  console       Opens or displays the OpenShift Web Console URL. +[...] + +Use "minishift [command] --help" for more information about a command. +``` + +### Log into Minishift's web console + +Now that Minishift is installed, you can walk through it and play with some cool new software. Begin with `minishift start`. This, as you might guess, starts Minishift—specifically, it starts a one-node cluster on your computer: + + +``` +$ minishift start +  Starting profile 'minishift' +  Check if deprecated options are used … OK +  Checking if is reachable … OK +[...] +  Minishift will be configured with… +  Memory: 4GB +  vCPUs : 2GB +  Disk size: 20 GB +Starting Minishift VM ……….OK +``` + +This process can take a long time, depending on your hardware, so be patient. When it ends, you'll get information about where to find your imaginary cluster on your virtualized network: + + +``` +Server Information ... +MiniShift server started. +The server is accessible via web console at: + +``` + +Now, MiniShift is running, complete with a web console. You can log into the OKD console using **developer** as the user name and any password you want. I chose **developer** / **developer**. + +![Minishift web console login][13] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +The web console is an easy control panel you can use to administer your humble cluster. It's a place for you to create and load container images, add and monitor pods, and ensure your instance is healthy. + +![Minishift web console][15] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +### Build a pipeline + +To start building your first pipeline, click **Pipeline Build Example** on the console. Click **Next** to show the parameters available to create the pipeline project. + +![Pipeline Build Example][16] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +A window appears with parameters to fill in if you want; you can use what's already there for this example. Walk through the rest of the screen choices to create a sample pipeline. + +![Pipeline options][17] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +Click **Create**, and let Minishift create the project for you. It shows your success (or failure). + +![Successful pipeline build][18] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +You can also click **Show Parameters** and scroll through the list of parameters configured for this project. Click **Close** and look for a confirmation message on the left.  + +![Show Parameters Minishift][19] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +![List of projects][20] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +When you click on **My Project**, you can see the details and pods created for the project to run. + +![Project details][21] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +Open the `jenkins-ephemeral` link that was generated. Log in again with the **developer** credentials and allow access to run a pipeline in Jenkins. + +![Authorize access interface][22] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +Now you can look through the Jenkins interface to get a feel for what it has to offer. + +![Jenkins interface][23] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +Find your project. + +![Jenkins projects][24] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +When you're ready, click **Build Now**. + +![Jenkins "build now"][25] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +Then you can view the job's output in the console output. + +![Jenkins console output][26] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +Once the job completes successfully, you will see a success message at the bottom of the console. + +What did this pipeline do? It updated the deployment manually. + +![Pipeline result][27] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +Congratulations, you successfully created an example automated deployment using Minishift! + +### Clean it up + +The last thing to do is to clean up everything by running two commands: + + +``` +$ minishift stop +$ minishift delete +``` + +Why `stop` and then `delete`? Well, I like to make sure nothing is running before I run a delete command of any kind. This results in a cleaner delete without the possibility of having any leftover or hung processes. Here are the commands' output. + +![minishift stop command][28] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +![minishift delete command][29] + +(Jess Cherry, [CC BY-SA 4.0][14]) + +### Final notes + +Minishift is a great tool with great built-in automation. The user interface is comfortable to work with and easy on the eyes. I found it a fun new tool to play with at home, and if you want to dive in deeper, just look over the great [documentation][30] and many [online tutorials][3]. I recommend exploring this application in depth. Have a happy time Minishifting! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/minishift-linux + +作者:[Jessica Cherry][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cherrybomb +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cube_innovation_process_block_container.png?itok=vkPYmSRQ (cubes coming together to create a larger cube) +[2]: https://www.okd.io/minishift/ +[3]: https://www.redhat.com/sysadmin/learn-openshift-minishift +[4]: https://opensource.com/resources/what-is-kubernetes +[5]: https://en.wikipedia.org/wiki/Sudo +[6]: https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine +[7]: https://www.virtualbox.org/wiki/Downloads +[8]: https://opensource.com/article/17/6/set-path-linux +[9]: https://github.com/minishift/minishift/releases +[10]: https://github.com/minishift/minishift/releases/tag/v1.34.3 +[11]: https://github.com/minishift/minishift/releases/download/v1.34.3/minishift-1.34.3-linux-amd64.tgz +[12]: https://opensource.com/article/17/7/how-unzip-targz-file +[13]: https://opensource.com/sites/default/files/uploads/minishift_web-console-login.png (Minishift web console login) +[14]: https://creativecommons.org/licenses/by-sa/4.0/ +[15]: https://opensource.com/sites/default/files/uploads/minishift_web-console.png (Minishift web console) +[16]: https://opensource.com/sites/default/files/uploads/minishift_pipeline-build-example.png (Pipeline Build Example) +[17]: https://opensource.com/sites/default/files/uploads/minishift_pipeline-build-config.png (Pipeline options) +[18]: https://opensource.com/sites/default/files/uploads/minishift_pipeline-build-success.png (Successful pipeline build) +[19]: https://opensource.com/sites/default/files/pictures/params-minishift.jpg (Show Parameters Minishift) +[20]: https://opensource.com/sites/default/files/uploads/minishift_myprojects.png (List of projects) +[21]: https://opensource.com/sites/default/files/uploads/minishift_project-details.png (Project details) +[22]: https://opensource.com/sites/default/files/uploads/minishift_authorize-access.png (Authorize access interface) +[23]: https://opensource.com/sites/default/files/uploads/jenkins-interface.png (Jenkins interface) +[24]: https://opensource.com/sites/default/files/uploads/jenkins-project.png (Jenkins projects) +[25]: https://opensource.com/sites/default/files/uploads/jenkins_build-now.png (Jenkins "build now") +[26]: https://opensource.com/sites/default/files/uploads/jenkins_console-output.png (Jenkins console output) +[27]: https://opensource.com/sites/default/files/uploads/pipelineresult.png (Pipeline result) +[28]: https://opensource.com/sites/default/files/uploads/minishift-stop.png (minishift stop command) +[29]: https://opensource.com/sites/default/files/uploads/minishift-delete.png (minishift delete command) +[30]: https://docs.okd.io/3.11/minishift/using/index.html diff --git a/sources/tech/20201109 What-s the difference between orchestration and automation.md b/sources/tech/20201109 What-s the difference between orchestration and automation.md new file mode 100644 index 0000000000..610042b557 --- /dev/null +++ b/sources/tech/20201109 What-s the difference between orchestration and automation.md @@ -0,0 +1,78 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What's the difference between orchestration and automation?) +[#]: via: (https://opensource.com/article/20/11/orchestration-vs-automation) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +What's the difference between orchestration and automation? +====== +Both terms imply that things happen without your direct intervention. +But the way you get to those results, and the tools you use to make them +happen, differ. +![doodles of arrows moving in different directions][1] + +For the longest time, it seemed the only thing any sysadmin cared about was automation. Recently, though, the mantra seems to have changed from automation to orchestration, leading many puzzled admins to wonder: "What's the difference?" + +The difference between automation and orchestration is primarily in intent and tooling. Technically, automation can be considered a subset of orchestration. While orchestration suggests many moving parts, automation usually refers to a singular task or a small number of strongly related tasks. Orchestration works at a higher level and is expected to make decisions based on changing conditions and requirements. + +However, this view shouldn't be taken too literally because both terms—_automation_ and _orchestration_—do have implications when they're used. The results of both are functionally the same: things happen without your direct intervention. But the way you get to those results, and the tools you use to make them happen, are different, or at least the terms are used differently depending on what tools you've used. + +For instance, automation usually involves scripting, often in Bash or Python or similar, and it often suggests scheduling something to happen at either a precise time or upon a specific event. However, orchestration often begins with an application that's purpose-built for a set of tasks that may happen irregularly, on demand, or as a result of any number of trigger events, and the exact results may even depend on a variety of conditions. + +### Decisionmaking and IT orchestration + +Automation suggests that a sysadmin has invented a system to cause a computer to do something that would normally have to be done manually. In automation, the sysadmin has already made most of the decisions on what needs to be done, and all the computer must do is execute a "recipe" of tasks. + +Orchestration suggests that a sysadmin has set up a system to do something on its own based on a set of rules, parameters, and observations. In orchestration, the sysadmin knows the desired end result but leaves it up to the computer to decide what to do. + +Consider Ansible and Bash. Bash is a popular shell and scripting language used by sysadmins to accomplish practically everything they do during a given workday. Automating with Bash is straightforward: Instead of typing commands into an interactive session, you type them into a text document and save the file as a shell script. Bash runs the shell script, executing each command in succession. There's room for some conditional decisionmaking, but usually, it's no more complex than simple if-then statements, each of which must be coded into the script. + +Ansible, on the other hand, uses playbooks in which a sysadmin describes the desired state of the computer. It lists requirements that must be met before Ansible can consider the job done. When Ansible runs, it takes action based on the current state of the computer compared to the desired state, based on the computer's operating system, and so on. A playbook doesn't contain specific commands, instead leaving those decisions up to Ansible itself. + +Of course, it's particularly revealing that Ansible is referred to as an automation—not an orchestration—tool. The difference can be subtle, and the terms definitely overlap. + +### Orchestration and the cloud + +Say you need to convert a file type that's regularly uploaded to your server by your users. + +The manual solution would be to check a directory for uploaded content every morning, open the file, and then save it in a different format. This solution is slow, inefficient, and probably could happen only once every 24 hours because you're a busy person. + +**[Read next: [How to explain orchestration][2]]** + +You could automate the task. Were you to do that, you might write a PHP or a Node.js script to detect when a file has been uploaded. The script would perform the conversion and send an alert or make a log entry to confirm the conversion was successful. You could improve the script over time to allow users to interact with the upload and conversion process. + +Were you to orchestrate the process, you might instead start with an application. Your custom app would be designed to accept and convert files. You might run the application in a container on your cloud, and using OpenShift, you could launch additional instances of your app when the traffic or workload increases beyond a certain threshold. + +### Learning automation and orchestration + +There isn't just one discipline for automation or orchestration. These are broad practices that are applied to many different tasks across many different industries. The first step to learning, though, is to become proficient with the technology you're meant to orchestrate and automate. It's difficult to orchestrate (safely) the scaling a series of web servers if you don't understand how a web server works, or what ports need to be open or closed, or what a port is. In practice, you may not be the person opening ports or configuring the server; you could be tasked with administrating OpenShift without really knowing or caring what's inside a container. But basic concepts are important because they broadly apply to usability, troubleshooting, and security. + +You also need to get familiar with the most common tools of the orchestration and automation world. Learn some [Bash][3], start using [Git][4] and design some [Git hooks][5], learn some Python, get comfortable with [YAML][6] and [Ansible][7], and try out Minikube, [OKD][8], and [OpenShift][9]. + +Orchestration and automation are important skills, both to make your work more efficient and as something to bring to your team. Invest in it today, and get twice as much done tomorrow. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/orchestration-vs-automation + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/arrows_operation_direction_system_orchestrate.jpg?itok=NUgoZYY1 (doodles of arrows moving in different directions) +[2]: https://enterprisersproject.com/article/2020/8/orchestration-explained-plain-english +[3]: https://www.redhat.com/sysadmin/using-bash-automation +[4]: https://opensource.com/life/16/7/stumbling-git +[5]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6 +[6]: https://www.redhat.com/sysadmin/understanding-yaml-ansible +[7]: https://opensource.com/downloads/ansible-k8s-cheat-sheet +[8]: https://www.redhat.com/sysadmin/learn-openshift-minishift +[9]: http://openshift.io diff --git a/sources/tech/20201110 Load balance network traffic with HAProxy.md b/sources/tech/20201110 Load balance network traffic with HAProxy.md new file mode 100644 index 0000000000..cafe4f457c --- /dev/null +++ b/sources/tech/20201110 Load balance network traffic with HAProxy.md @@ -0,0 +1,249 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Load balance network traffic with HAProxy) +[#]: via: (https://opensource.com/article/20/11/load-balancing-haproxy) +[#]: author: (Jim O'Connell https://opensource.com/users/jimoconnell) + +Load balance network traffic with HAProxy +====== +Install, configure, and run HAProxy to distribute network traffic across +several web or application servers. +![eight stones balancing][1] + +You don't have to work at a huge company to justify using a load balancer. You might be a hobbyist, self-hosting a website from a couple of Raspberry Pi computers. Perhaps you're the server administrator for a small business; maybe you _do_ work for a huge company. Whatever your situation, you can benefit from using the [HAProxy][2] load balancer to manage your traffic. + +HAProxy is known as "the world's fastest and most widely used software load balancer." It packs in many features that can make your applications more secure and reliable, including built-in rate limiting, anomaly detection, connection queuing, health checks, and detailed logs and metrics. Learning the basic skills and concepts covered in this tutorial will help you use HAProxy to build a more robust, far more powerful infrastructure. + +### Why would you need a load balancer? + +A load balancer is a way to easily distribute connections across several web or application servers. In fact, HAProxy can balance any type of Transmission Control Protocol ([TCP][3]) traffic, including RDP, FTP, WebSockets, or database connections. The ability to distribute load means you don't need to purchase a massive web server with zillions of gigs of RAM just because your website gets more traffic than Google. + +A load balancer also gives you flexibility. Perhaps your existing web server isn't robust enough to meet peak demand during busy times of the year and you'd like to add another, but only temporarily. Maybe you want to add some redundancy in case one server fails. With HAProxy, you can add more servers to the backend pool when you need them and remove them when you don't. + +You can also route requests to different servers depending on the context. For example, you might want to handle your static content with a couple of cache servers, such as [Varnish][4], but route anything that requires dynamic content, such as an API endpoint, to a more powerful machine. + +In this article, I will walk through setting up a very basic HAProxy installation to use HTTPS to listen on secure port 443 and utilize a couple of backend web servers. It will even send all traffic that comes to a predefined URL (like `/api/`) to a different server or pool of servers. + +### Install HAProxy + +To get started, spin up a new CentOS 8 server or instance and bring the system up to date: + + +``` +`sudo yum update -y` +``` + +This typically runs for a while. Grab yourself a coffee while you wait. + +This installation has two parts: the first part installs the yum version of HAProxy, and the second part compiles and installs your binary from source to overwrite the previous HAProxy with the latest version. Installing with yum does a lot of the heavy lifting as far as generating systemd startup scripts, etc., so run the `yum install` and then overwrite the HAProxy binary with the latest version by compiling it from its source code: + + +``` +`sudo yum install -y haproxy` +``` + +Enable the HAProxy service: + + +``` +`sudo systemctl enable haproxy` +``` + +To upgrade to the latest version ([version 2.2][5], as of this writing), compile the source code. Many people assume that compiling and installing a program from its source code requires a high degree of technical ability, but it's a pretty straightforward process. Start by using `yum` to install a few packages that provide the tools for compiling code: + + +``` +sudo yum install dnf-plugins-core +sudo yum config-manager --set-enabled PowerTools +# (Multiline command next 3 lines. Copy and paste together:)  + +sudo yum install -y git ca-certificates gcc glibc-devel \ +  lua-devel pcre-devel openssl-devel systemd-devel \ +  make curl zlib-devel  +``` + +Use `git` to get the latest source code and change to the `haproxy` directory: + + +``` +git clone +cd haproxy +``` + +Run the following three commands to build and install HAProxy with integrated Prometheus support: + + +``` +# Multiline command next 3 lines copy and paste together:  +make TARGET=linux-glibc USE_LUA=1 USE_OPENSSL=1 USE_PCRE=1 \ +PCREDIR= USE_ZLIB=1 USE_SYSTEMD=1 \ EXTRA_OBJS="contrib/ + +sudo make PREFIX=/usr install # Install to /usr/sbin/haproxy +``` + +Test it by querying the version: + + +``` +`haproxy -v` +``` + +You should get the following output: + + +``` +`HA-Proxy version 2.2.4-b16390-23 2020/10/09 - https://haproxy.org/` +``` + +### Create the backend server + +HAProxy doesn't serve any traffic directly—this is the job of backend servers, which are typically web or application servers. For this exercise, I'm using a tool called [Ncat][6], the "Swiss Army knife" of networking, to create some exceedingly simple servers. Install it: + + +``` +`sudo yum install nc -y` +``` + +If your system has [SELinux][7] enabled, you'll need to enable port 8404, the port used for accessing the HAProxy Stats page (explained below), and the ports for your backend servers: + + +``` +sudo dnf install policycoreutils-python-utils +sudo semanage port -a -t http_port_t  -p tcp 8404 +sudo semanage port -a -t http_port_t  -p tcp 10080; +sudo semanage port -a -t http_port_t  -p tcp 10081; +sudo semanage port -a -t http_port_t  -p tcp 10082; +``` + +Create two Ncat web servers and an API server: + + +``` +while true ; +do +nc -l -p 10080 -c 'echo -e "HTTP/1.1 200 OK\n\n This is Server ONE"' ; +done & + +while true ; +do +nc -l -p 10081 -c 'echo -e "HTTP/1.1 200 OK\n\n This is Server TWO"' ; +done & + +while true ; +do +nc -l -p 10082 -c 'echo -e "HTTP/1.1 200 OK\nContent-Type: application/json\n\n { \"Message\" :\"Hello, World!\" }"' ; +done & +``` + +These simple servers print out a message (such as "This is Server ONE") and run until the server is stopped. In a real-world setup, you would use actual web and app servers. + +### Modify the HAProxy config file + +HAProxy's configuration file is `/etc/haproxy/haproxy.cfg`. This is where you make the changes to define your load balancer. This [basic configuration][8] will get you started with a working server: + + +``` +global +    log         127.0.0.1 local2 +    user        haproxy +    group       haproxy + +defaults  +    mode                    http +    log                     global +    option                  httplog + +frontend main +    bind *:80 +         +    default_backend web +    use_backend api if { path_beg -i /api/ } +     +    #------------------------- +    # SSL termination - HAProxy handles the encryption. +    #    To use it, put your PEM file in /etc/haproxy/certs   +    #    then edit and uncomment the bind line (75) +    #------------------------- +    # bind *:443 ssl crt /etc/haproxy/certs/haproxy.pem ssl-min-ver TLSv1.2 +    # redirect scheme https if !{ ssl_fc } + +#----------------------------- +# Enable stats at +#----------------------------- + +frontend stats +    bind *:8404 +    stats enable +    stats uri /stats +#----------------------------- +# round robin balancing between the various backends +#----------------------------- + +backend web +    server web1 127.0.0.1:10080 check +    server web2 127.0.0.1:10081 check + +#----------------------------- + +# API backend for serving up API content +#----------------------------- +backend api +    server api1 127.0.0.1:10082 check +``` + +### Restart and reload HAProxy + +HAProxy is probably not running yet, so issue the command `sudo systemctl restart haproxy` to start (or restart) it. The `restart` method is fine for non-production situations, but once you are up and running, you'll want to get in the habit of using `sudo systemctl reload haproxy` to avoid service interruptions, even if you have an error in your config. + +For example, after you make changes to `/etc/haproxy/haproxy.cfg`, you need to reload the daemon with `sudo systemctl reload haproxy` to effect the changes. If there is an error, it will let you know but continue running with the previous configuration. Check your HAProxy status with `sudo systemctl status haproxy`. + +If it doesn't report any errors, you have a running server. Test it with curl on the server, by typing `curl http://localhost/` on the command line. If you see "_This is Server ONE_," then it all worked! Run `curl` a few times and watch it cycle through your backend pool, then see what happens when you type `curl http://localhost/api/`. Adding `/api/` to the end of the URL will send all of that traffic to the third server in your pool. At this point, you should have a functioning load balancer! + +### Check your stats + +You may have noted that the configuration defined a frontend called `stats` that is listening on port 8404: + + +``` +frontend stats +    bind *:8404 +    stats uri /stats +    stats enable +``` + +In your browser, load up `http://localhost:8404/stats`. Read HAProxy's blog "[Exploring the HAProxy Stats page][9]" to find out what you can do here. + +### A powerful load balancer + +Although I covered just a few of HAProxy's features, you now have a server that listens on ports 80 and 443, redirecting HTTP traffic to HTTPS, balancing traffic between several backend servers, and even sending traffic matching a specific URL pattern to a different backend server. You also unlocked the very powerful HAProxy Stats page that gives you a great overview of your systems. + +This exercise might seem simple, make no mistake about it—you have just built and configured a very powerful load balancer capable of handling a significant amount of traffic. + +For your convenience, I put all the commands in this article in a [GitHub Gist][10]. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/load-balancing-haproxy + +作者:[Jim O'Connell][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jimoconnell +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/water-stone-balance-eight-8.png?itok=1aht_V5V (eight stones balancing) +[2]: https://www.haproxy.org/ +[3]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol +[4]: https://varnish-cache.org/ +[5]: https://www.haproxy.com/blog/announcing-haproxy-2-2/ +[6]: https://nmap.org/ncat +[7]: https://www.redhat.com/en/topics/linux/what-is-selinux +[8]: https://gist.github.com/haproxytechblog/38ef4b7d42f16cfe5c30f28ee3304dce +[9]: https://www.haproxy.com/blog/exploring-the-haproxy-stats-page/ +[10]: https://gist.github.com/haproxytechblog/d656422754f1b5eb1f7bbeb1452d261e diff --git a/sources/tech/20201110 Use your favorite open source apps on your Mac with MacPorts.md b/sources/tech/20201110 Use your favorite open source apps on your Mac with MacPorts.md new file mode 100644 index 0000000000..4ba1adebbd --- /dev/null +++ b/sources/tech/20201110 Use your favorite open source apps on your Mac with MacPorts.md @@ -0,0 +1,225 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Use your favorite open source apps on your Mac with MacPorts) +[#]: via: (https://opensource.com/article/20/11/macports) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Use your favorite open source apps on your Mac with MacPorts +====== +MacPorts is an easy way to get open source applications and keep them +updated on macOS. +![Coffee and laptop][1] + +"Package manager" is a generic name for software to install, upgrade, and uninstall applications. Commands like `dnf` or `apt` on Linux, or `pkg_add` on BSD, or even `pip` on Python and `luarocks` on Lua, make it trivial for users to add new applications to their system. Once you've tried it, you're likely to find it hard to live without, and it's a convenience every operating system ought to include. Not all do, but the open source community tends to ensure the best ideas in computing are propagated across all platforms. + +There are several package managers designed just for macOS, and one of the oldest is the [MacPorts][2] project. + +### Darwin and MacPorts + +When Apple shifted to Unix at the turn of the century, it essentially built a Unix operating system called [Darwin][3]. Shortly thereafter, a group of resourceful hackers promptly began work on a project called OpenDarwin, with the intent of creating an independent branch of Darwin. They hoped that OpenDarwin and Apple developers could work on related codebases, borrowing from each other whenever it was useful. Unfortunately, OpenDarwin didn't gain traction within Apple and it eventually [came to an end][4]. However, the OpenDarwin package manager project, MacPorts, is alive and well and continues to provide great open source software for macOS. + +MacOS already comes with a healthy set of default terminal commands, some borrowed from GNU, others from BSD, and still others written especially for Darwin. You can use MacPorts to add new commands and even graphical applications. + +### Install MacPorts + +Your macOS version dictates which MacPorts installer package you need. So first, get the version of macOS you're currently running: + + +``` +$ sw_vers -productVersion +10.xx.y +``` + +MacPorts releases for recent macOS versions are available on [macports.org/install.php][5]. You can download an installer from the website, or just copy the link and download using the [curl][6] command: + + +``` +$ curl \ +\--output MacPorts-2.6.3-10.14-Mojave.pkg +``` + +Once you download the installer, you can double-click to install it or install it using a terminal: + + +``` +$ sudo installer -verbose \ +-pkg MacPorts*.pkg +-tgt / +``` + +### Configure MacPorts + +Once the package is installed, you must add the relevant paths to your system so that your terminal knows where to find your new MacPorts commands. Add the path to MacPorts, and add its manual pages to your `PATH` environment variable by adding this to `~/.bashrc`: + + +``` +export PATH=/opt/local/bin:/opt/local/sbin:$PATH +export MANPATH=/opt/local/share/man:$MANPATH +``` + +Load your new environment: + + +``` +`$ source ~/.bashrc` +``` + +Run an update so your MacPorts installation has access to the latest versions of software: + + +``` +`$ sudo port -v selfupdate` +``` + +### Use MacPorts + +Some package managers install pre-built software from a server onto your local system. This is called _binary installation_ because it installs code that's been compiled into an executable binary file. Other package managers, MacPorts among them, pull source code from a server, compile it into a binary executable on your computer, and install it into the correct directories. The end result is the same: you have the software you want. + +The way they get there is different. + +There are advantages to both methods. A binary install is quicker because the only transaction required is copying files from a server onto your computer. This is something [Homebrew][7] does with its "bottles," but there are sometimes issues with [non-relocatable][8] builds. Installing from source code means it's easy for you to modify how software is built and where it gets installed. + +MacPorts provides the **port** command, and calls it packages **ports** (inherited terminology from projects like NetBSD's [Pkgsrc][9] and FreeBSD's port system.) The typical MacPorts workflow is to search for an application and then install it. + +#### Search for an application + +If you know the specific command or application you need to install, search for it to ensure it's in the MacPorts tree: + + +``` +`$ sudo port search parallel` +``` + +By default, `port` searches both the names and descriptions of packages. You can search on just the name field by adding the `--name` option: + + +``` +`$ sudo port search --name parallel` +``` + +You can make your searches "fuzzy" with common shell wildcards. For instance, to search for `parallel` only at the start of a name field: + + +``` +`$ sudo port search --name --glob "parallel*"` +``` + +List all ports + +If you don't know what you're searching for and you want to see all the packages (or "ports" in MacPorts and BSD terminology) available, use the `list` subcommand: + + +``` +`$ sudo port list` +``` + +The list is long but complete. You can, of course, redirect the output into a text for reference or pipe it to `more` or `less` for closer examination: + + +``` +$ sudo port list > all-ports.txt +$ sudo port list | less +``` + +#### Get information about a package + +You can get all the important details about a package with the `info` subcommand: + + +``` +$ sudo port info parallel +parallel @20200922 (sysutils) + +Description:          Build and execute shell command lines from standard input in parallel +Homepage:             + +Library Dependencies: perl5 +Platforms:            darwin +License:              GPL-3+ +Maintainers:          Email: [example@example.com][10] +``` + +This displays important metadata about each application, including a brief description of what it is and the project homepage, in case you need more information. It also lists dependencies, which are _other_ ports that must be on your system for a package to run correctly. Dependencies are resolved automatically by MacPorts, meaning that if you install, for example, the `parallel` package, MacPorts also installs `perl5` if it's not already on your system. Finally, it provides the license and port maintainer. + +#### Install a package + +When you're ready to install a package, use the `install` subcommand: + + +``` +`$ sudo port install parallel` +``` + +It can take some time to compile the code depending on your CPU, the size of the code base, and the number of packages being installed, so be patient. It'll be worth it. + +Once the installation is done, the new application is available immediately: + + +``` +$ parallel echo ::: "hello" "world" +hello +world +``` + +Applications installed by MacPorts are placed into `/opt/local`. + +#### View what is installed + +Once a package has been installed on your system, you can see exactly what it placed on your drive using the `contents` subcommand: + + +``` +$ sudo port contents parallel +/opt/local/bin/parallel +[...] +``` + +#### Clean up + +Installing a package with MacPorts often leaves build files in your ports tree. These files are useful for debugging a failed install, but normally you don't need to keep them lying around. Purge these files from your system with the `port clean` command: + + +``` +`$ port clean parallel` +``` + +#### Uninstall packages + +Uninstall a package with the `port uninstall` command: + + +``` +`$ port uninstall parallel` +``` + +### Open source package management + +The MacPorts project is a remnant of an early movement to build upon the open source work that served as macOS's foundation. While that effort failed, there have been efforts to revive it as a project called [PureDarwin][11]. The push to open more of Apple's code is important work, and the byproducts of this effort are beneficial to everyone running macOS. If you're looking for an easy way to get open source applications on your Mac and a reliable way to keep them up to date, install and use MacPorts. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/macports + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/coffee_cafe_brew_laptop_desktop.jpg?itok=G-n1o1-o (Coffee and laptop) +[2]: http://macports.org +[3]: https://en.wikipedia.org/wiki/Darwin_%28operating_system%29 +[4]: https://web.archive.org/web/20070111155348/opendarwin.org/en/news/shutdown.html +[5]: https://www.macports.org/install.php +[6]: https://opensource.com/article/20/5/curl-cheat-sheet +[7]: https://opensource.com/article/20/6/homebrew-linux +[8]: https://discourse.brew.sh/t/why-do-bottles-need-to-be-in-home-linuxbrew-linuxbrew/4346/3 +[9]: https://opensource.com/article/19/11/pkgsrc-netbsd-linux +[10]: mailto:example@example.com +[11]: http://www.puredarwin.org/ diff --git a/sources/tech/20201111 Create your first Knative app.md b/sources/tech/20201111 Create your first Knative app.md new file mode 100644 index 0000000000..6213ddd329 --- /dev/null +++ b/sources/tech/20201111 Create your first Knative app.md @@ -0,0 +1,469 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Create your first Knative app) +[#]: via: (https://opensource.com/article/20/11/knative) +[#]: author: (Jessica Cherry https://opensource.com/users/cherrybomb) + +Create your first Knative app +====== +Knative is a great way to get started quickly on serverless development +with Kubernetes. +![Working from home at a laptop][1] + +[Knative][2] is an open source community project that adds components to [Kubernetes][3] for deploying, running, and managing [serverless, cloud-native][4] applications. It enables more productive development with less interaction with Kubernetes' infrastructure. + +There is a large amount of information out there about Knative, networking, and serverless deployments, and this introductory tutorial covers just a bite-size amount of it. In this walkthrough, I'll use Knative with [Minikube][5] to create a Knative app—a simple container that prints messages in response to a `curl` command or in a web browser at a link provided by the deployment. + +### First, some background + +Knative uses custom resource definitions (CRDs), a network layer, and a service core. For this walkthrough, I used Ubuntu 18.04, Kubernetes 1.19.0, Knative 0.17.2, and [Kourier][6] 0.17.0 as the Knative networking layer, as well as the Knative command-line interface (CLI). + +A CRD is a custom resource definition within Kubernetes. A resource is an endpoint in the Kubernetes API that stores a collection of API objects of a certain kind; for example, the built-in pod's resource contains a collection of pod objects. This allows an expansion of the Kubernetes API with new definitions. One example is the Knative serving core, which is defined to have internal autoscaling and rapid deployment of pods with the correct roles and access predefined. + +Kourier is an [Ingress][7] (a service to let in external network traffic) for Knative serving and a lightweight alternative for the [Istio][8] ingress. Its deployment consists only of an [Envoy proxy][9] and a control plane for it. + +To understand the concepts in this tutorial, I recommend you are somewhat familiar with: + + * Serverless, cloud-native applications + * Ingress with Envoy proxies, i.e., Istio + * DNS in Kubernetes + * Kubernetes patching configurations + * Custom resource definitions in Kubernetes + * Configuring YAML files for Kubernetes + + + +### Set up and installation + +There are some prerequisites you must do before you can use Knative. + +#### Configure Minikube + +Before doing anything else, you must configure Minikube to run Knative locally in your homelab. Below are the configurations I suggest and the commands to set them: + + +``` +$ minikube config set kubernetes-version v1.19.0 +$ minikube config set memory 4000 +$ minikube config set cpus 4 +``` + +To make sure those configurations are set up correctly in your environment, run the Minikube commands to delete and start your cluster: + + +``` +$ minikube delete +$ minikube start +``` + +#### Install the Knative CLI + +You need the Knative CLI to make a deployment, and you need [Go v1.14][10] or later to work with the CLI. I created a separate directory to make it easier to find and install these tools. Use the following commands to set up the command line: + + +``` +$ mkdir knative +$ cd knative/ +$ git clone +$ cd client/ +$ hack/build.sh -f +$ sudo cp kn /usr/local/bin +$ kn version +Version:        v20201018-local-40a84036 +Build Date:   2020-10-18 20:00:37 +Git Revision: 40a84036 +Supported APIs: +* Serving +  - serving.knative.dev/v1 (knative-serving v0.18.0) +* Eventing +  - sources.knative.dev/v1alpha2 (knative-eventing v0.18.0) +  - eventing.knative.dev/v1beta1 (knative-eventing v0.18.0) +``` + +Once the CLI is installed, you can configure Knative in the Minikube cluster. + +#### Install Knative + +Since Knative is composed of CRDs, much of its installation uses YAML files with `kubectl` commands. To make this easier, set up some environment variables in the terminal so that you can get the needed YAML files a little faster and in the same version: + + +``` +`$ export KNATIVE="0.17.2"` +``` + +First, apply the service resource definitions: + + +``` +`$ kubectl apply -f https://github.com/knative/serving/releases/download/v$KNATIVE/serving-crds.yaml` +``` + +Then apply the core components to Knative: + + +``` +`$ kubectl apply -f https://github.com/knative/serving/releases/download/v$KNATIVE/serving-core.yaml` +``` + +This deploys the services and deployments to the namespace `knative-serving`. You may have to wait a couple of moments for the deployment to finish. + +To confirm the deployment finished, run the `kubectl` command to get the deployments from the namespace: + + +``` +$ kubectl get deployments -n knative-serving +NAME                    READY   UP-TO-DATE   AVAILABLE   AGE +3scale-kourier-control   1/1    1               1               107m +activator               1/1     1               1               108m +autoscaler              1/1     1               1               108m +controller              1/1     1               1               108m +webhook                 1/1     1               1               108m +``` + +#### Install Kourier + +Because you want to use a specific version and collect the correct YAML file, use another environment variable: + + +``` +`$ export KOURIER="0.17.0"` +``` + +Then apply your networking layer YAML file: + + +``` +`$ kubectl apply -f https://github.com/knative/net-kourier/releases/download/v$KOURIER/kourier.yaml` +``` + +You will find the deployment in the `kourier-system` namespace. To confirm the deployment is correctly up and functioning, use the `kubectl` command to get the deployments: + + +``` +$ kubectl get deployments -n kourier-system +NAME                    READY   UP-TO-DATE   AVAILABLE   AGE +3scale-kourier-gateway   1/1    1               1               110m +``` + +Next, configure the Knative serving to use Kourier as default. If you don't set this, the external networking traffic will not function. Set it with this `kubectl patch` command: + + +``` +$ kubectl patch configmap/config-network \ +  --namespace knative-serving \ +  --type merge \ +  --patch '{"data":{"ingress.class":"kourier.ingress.networking.knative.dev"}}' +``` + +#### Configure the DNS + +Before you can access the load balancer, you need to run the `minikube tunnel` command in a separate terminal window. This command creates a route to services deployed with type `LoadBalancer` and sets their Ingress to their `ClusterIP`. Without this command, you will never get an `External-IP` from the load balancer. Your output will look like this: + + +``` +Status:     +    machine: minikube +    pid: 57123 +    route: 10.96.0.0/12 -> 192.168.39.67 +    minikube: Running +    services: [kourier] +        errors: +         minikube: no errors +         router: no errors +         loadbalancer emulator: no errors +Status:     +    machine: minikube +    pid: 57123 +    route: 10.96.0.0/12 -> 192.168.39.67 +    minikube: Running +    services: [kourier] +        errors: +         minikube: no errors +         router: no errors +         loadbalancer emulator: no errors +``` + +Now that the services and deployments are complete, configure the DNS for the cluster. This enables your future deployable application to support DNS web addresses. To configure this, you need to get some information from your Kourier service by using the `kubectl get` command: + + +``` +$ kubectl get service kourier -n kourier-system +NAME    TYPE            CLUSTER-IP      EXTERNAL-IP     PORT(S)                         +kourier   LoadBalancer   10.103.12.15   10.103.12.15   80:32676/TCP,443:30558/TCP +``` + +Get the `CLUSTER-IP` address and save it for the next step. Next, configure the domain to determine your internal website on local DNS. (I ended mine in `nip.io`, and you can also use `xip.io`.) This requires another `kubectl patch` command: + + +``` +`$ kubectl patch configmap -n knative-serving config-domain -p "{\"data\": {\"10.103.12.15.nip.io\": \"\"}}"` +``` + +Once it's patched, you will see this output: + + +``` +`configmap/config-domain patched` +``` + +### Use the Knative CLI + +Now that your configurations are done, you can create an example application to see what happens. + +#### Deploy a service + +Earlier in this walkthrough, you installed the Knative CLI, which is used for Serving and Eventing resources in a Kubernetes cluster. This means you can deploy a sample application and manage services and routes. To bring up the command-line menu, type `kn`. Here is a snippet of the output: + + +``` +$ kn +kn is the command line interface for managing Knative Serving and Eventing resources + + Find more information about Knative at: + +Serving Commands: +  service       Manage Knative services +  revision      Manage service revisions +  route         List and describe service routes +``` + +Next, use the Knative CLI to deploy a basic "hello world" application with a web frontend. Knative provides some examples you can use; this one does a basic deployment: + + +``` +`kn service create hello --image gcr.io/knative-samples/helloworld-go` +``` + +Your output should look something like this: + + +``` +$ kn service create hello --image gcr.io/knative-samples/helloworld-go +Creating service 'hello' in namespace 'default': + +  0.032s The Configuration is still working to reflect the latest desired specification. +  0.071s The Route is still working to reflect the latest desired specification. +  0.116s Configuration "hello" is waiting for a Revision to become ready. + 34.908s ... + 34.961s Ingress has not yet been reconciled. + 35.020s unsuccessfully observed a new generation + 35.208s Ready to serve. + +Service 'hello' created to latest revision 'hello-dydlw-1' is available at URL: + +``` + +This shows that the service was deployed with a URL into the namespace default. You can deploy to another namespace by running something like the following, then look at the output: + + +``` +$ kn service create hello --image gcr.io/knative-samples/helloworld-go --namespace hello +Creating service 'hello' in namespace 'hello': + +  0.015s The Configuration is still working to reflect the latest desired specification. +  0.041s The Route is still working to reflect the latest desired specification. +  0.070s Configuration "hello" is waiting for a Revision to become ready. +  5.911s ... +  5.958s Ingress has not yet been reconciled. +  6.043s unsuccessfully observed a new generation +  6.213s Ready to serve. + +Service 'hello' created to latest revision 'hello-wpbwj-1' is available at URL: + +``` + +#### Test your new deployment + +Check to see if the new service you deployed is up and running. There are two ways to check: + + 1. Check your web address in a browser + 2. Run a `curl` command to see what returns + + + +If you check the address in a web browser, you should see something like this: + +![Checking Knative deployment][11] + +(Jess Cherry, [CC BY-SA 4.0][12]) + +Good! It looks like your application's frontend is up! + +Next, test the `curl` command to confirm everything works from the command line. Here is an example of a `curl` to my application and the output: + + +``` +$ curl +Hello World! +``` + +#### Interact with the Knative app + +From here, you can use the Knative CLI to make some basic changes and test the functionality. Describe the service and check the output: + + +``` +$ kn service describe hello +Name:           hello +Namespace:  default +Age:            12h +URL:            + +Revisions:   +  100%  @latest (hello-dydlw-1) [1] (12h) +        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b) + +Conditions:   +  OK TYPE                       AGE REASON +  ++ Ready                      12h +  ++ ConfigurationsReady        12h +  ++ RoutesReady                12h +``` + +It looks like everything is up and ready as you configured it. Some other things you can do with the Knative CLI (which won't show up now due to the minimal configuration in this example) are to describe and list the routes with the app: + + +``` +$ kn route describe hello +Name:           hello +Namespace:  default +Age:            12h +URL:            +Service:        hello + +Traffic Targets:   +  100%  @latest (hello-dydlw-1) + +Conditions:   +  OK TYPE                       AGE REASON +  ++ Ready                      12h +  ++ AllTrafficAssigned         12h +  ++ CertificateProvisioned     12h TLSNotEnabled +  ++ IngressReady               12h +jess@Athena:~/knative/client$ kn route list hello +NAME    URL                                     READY +hello     True +``` + +This can come in handy later when you need to troubleshoot issues with your deployments. + +#### Clean up + +Just as easily as you deployed your application, you can clean it up: + + +``` +$ kn service delete hello +Service 'hello' successfully deleted in namespace 'default'. + +jess@Athena:~/knative/client$ kn service delete hello --namespace hello +Service 'hello' successfully deleted in namespace 'hello'. +``` + +### Make your own app + +This walkthrough used an existing Knative example, but you are probably wondering about making something that _you_ want. You are right, so I'll provide this example YAML then explain how you can apply it with kubectl and manage it with the Knative CLI. + +**Example YAML** + + +``` +apiVersion: serving.knative.dev/v1 +kind: Service +metadata: +  name: helloworld +  namespace: default +spec: + template: +  spec: +   containers: +     - image: gcr.io/knative-samples/helloworld-go +       ports: +             - containerPort: 8080 +       env: +        - name: TARGET +          value: "This is my app" +``` + +Save this to `apps.yaml`, and then you can make changes to some things. For example, you can change your `metadata`, `name`, and `namespace`. You can also change the value of the target (which I set to `This is my app`) so that, rather than `Hello World`, you'll see a new message that says `Hello ${TARGET} !` when you deploy the file. + +To deploy a file like this, you will have to use `kubectl apply -f apps.yaml`. + +First, deploy your new service using the `apply` command: + + +``` +$ kubectl apply -f apps.yaml +service.serving.knative.dev/helloworld created +``` + +Next, you can describe your new deployment, which is the name provided in the YAML file: + + +``` +$ kn service describe helloworld +Name:           helloworld +Namespace:  default +Age:            50s +URL:            + +Revisions:   +  100%  @latest (helloworld-qfr9s) [1] (50s) +        Image:  gcr.io/knative-samples/helloworld-go (at 5ea96b) + +Conditions:   +  OK TYPE                       AGE REASON +  ++ Ready                      43s +  ++ ConfigurationsReady        43s +  ++ RoutesReady                43s +``` + +Run a `curl` command to confirm it produces the new output you defined in your YAML file: + + +``` +$ curl   +Hello This is my app! +``` + +Double-check by going to the simple web frontend. + +![Checking Knative deployment][13] + +(Jess Cherry, [CC BY-SA 4.0][12]) + +This proves your application is running! Congratulations! + +### Final thoughts + +Knative is a great way for developers to move quickly on serverless development with networking services that allow users to see changes in apps immediately. It is fun to play with and lets you take a deeper dive into serverless and other exploratory uses of Kubernetes! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/knative + +作者:[Jessica Cherry][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cherrybomb +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop) +[2]: https://knative.dev/ +[3]: https://opensource.com/resources/what-is-kubernetes +[4]: https://en.wikipedia.org/wiki/Cloud_native_computing +[5]: https://minikube.sigs.k8s.io/docs/ +[6]: https://github.com/knative-sandbox/net-kourier +[7]: https://kubernetes.io/docs/concepts/services-networking/ingress/ +[8]: https://istio.io/ +[9]: https://www.envoyproxy.io/ +[10]: https://golang.org/doc/install +[11]: https://opensource.com/sites/default/files/uploads/knative_browser-check.png (Checking Knative deployment) +[12]: https://creativecommons.org/licenses/by-sa/4.0/ +[13]: https://opensource.com/sites/default/files/uploads/knativebrowser2.png (Checking Knative deployment) diff --git a/sources/tech/20201111 Day 3- an infinitely tall fridge.md b/sources/tech/20201111 Day 3- an infinitely tall fridge.md new file mode 100644 index 0000000000..e50ce9a55d --- /dev/null +++ b/sources/tech/20201111 Day 3- an infinitely tall fridge.md @@ -0,0 +1,46 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Day 3: an infinitely tall fridge) +[#]: via: (https://jvns.ca/blog/2020/11/11/day-3--an-infinitely-tall-fridge/) +[#]: author: (Julia Evans https://jvns.ca/) + +Day 3: an infinitely tall fridge +====== + +Hello! Here are some notes from Day 3 at the Recurse Center. + +This post is an extremely short one from the toy refrigerator poetry forum website I’m working on. I needed to come up with a design for it, and finally today I came up with an idea: just put everything on an image of a fridge. + +I found a stock image of a fridge, but I ran into a problem immediately, which was that the entire website could not fit on said fridge image. + +So I figured how to make a fridge that was as tall as I wanted it to be. (not technically “infinite”, but “a fridge that is as big as required” didn’t have quite the same ring). + +### here’s the infinite fridge + +Here’s a CodePen with the HTML/CSS required to make an infinite fridge. It’s relatively simple and I’m very pleased about this. It basically has 3 images: one for the top of the fridge, a 1px line that can be repeated as much as required, and then the bottom. + +See the Pen [infinite refrigerator][1] by Julia Evans ([Julia Evans][2]) on [CodePen][3]. + +### that’s all! + +I started writing an explanation of how exactly this infinite fridge works, but I ran out of time so maybe another day :). (the main trick is that `padding-bottom` is a percentage of the parent element’s width, not its height, so you can use it to create a box with a fixed aspect ratio) + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/11/day-3--an-infinitely-tall-fridge/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://codepen.io/wizardzines/pen/bGeOdvJ +[2]: https://codepen.io/wizardzines +[3]: https://codepen.io diff --git a/sources/tech/20201111 How I use Cockpit for my home-s Linux server management.md b/sources/tech/20201111 How I use Cockpit for my home-s Linux server management.md new file mode 100644 index 0000000000..9accd1a2d0 --- /dev/null +++ b/sources/tech/20201111 How I use Cockpit for my home-s Linux server management.md @@ -0,0 +1,175 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How I use Cockpit for my home's Linux server management) +[#]: via: (https://opensource.com/article/20/11/cockpit-server-management) +[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss) + +How I use Cockpit for my home's Linux server management +====== +Anyone—from home users to large-network admins—can access +enterprise-grade server management with Cockpit. +![People work on a computer server with devices][1] + +[Cockpit][2] is a service for Linux that provides a web-based interface for managing and monitoring hosts. It can be deployed in any size organization, even a small office, and it's a great way for home users to maintain the family IT infrastructure. I use it to manage and monitor all of the computers in my house—including Raspberry Pi. + +Cockpit is a free and open source software project released under the LGPL v2.1+. It is sponsored by Red Hat and included in Red Hat Enterprise Linux as the RHEL Web Console. + +### Using Cockpit + +Cockpit allows you to manage Linux devices on your network remotely. You can add or remove users, connect Network File System (NFS) shares, and start and stop services. One of my favorite simple Cockpit tasks is doing updates. I no longer have to walk around the office or house to collect each device to log in, update, reboot, and wait. Enterprise administrators don't need to badge into a data center; instead, they can manage devices from the comfort of their office. + +This isn't all, though. Cockpit's advanced capabilities include managing an LDAP server, virtual machines, and storage. You can also use it to install Docker or Podman containers. + +In terms of monitoring, Cockpit provides visibility into the expected CPU, memory, and disk space metrics. But it also exposes information like the manufacturer, BIOS, and CPU branding and gives a detailed look at hardware elements such as the [northbridge][3] and [southbridge][4] chips and various controllers. It lists the graphics, storage, and network communications devices and the memory controller and memory type. Cockpit can also be used to review logs. + +### Install Cockpit + +Cockpit is included in most major distributions. The website provides [documentation][5] for installing on Red Hat, Fedora, Ubuntu, Debian, Arch, and several others. You can install it with the standard package management commands on your Linux distribution. You can also usually find it in your graphical utility, such as GNOME Software Center, for a one-click process. + + * **Fedora: **`dnf install cockpit` + * **Ubuntu: **`apt install cockpit` + + + +### Access and login + +The default listen port is 9090. To access the Cockpit interface on a server, just point your browser to `hostname:9090`. You can use `localhost:9090` for the local server where you are logged on. Log in with a common account, as it will be advantageous to have root privileges on this account. + +![Cockpit Login Screen][6] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +To access other servers remotely, you would use their hostname, e.g., `https://hostname:9090`. However, you could designate one host as a management server and add all your servers to the Dashboard for a unified view. + +Once you log in, the first screen you see is the Dashboard; the other option is Host view.  + +### Dashboard view + +The Dashboard view is clean and uncluttered. The image below shows a performance monitor for all of a system's connected servers. It graphs CPU, memory, network, and disk I/O. If this is your first run and you haven't yet connected any servers, you will see graphs for the local system only. + +![Cockpit Dashboard][8] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +Add a server by clicking the blue plus (**+**) button. + +![Adding a machine to Cockpit][9] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +After you add servers, scroll down to see the full list. I have a few systems set up already. + +![Cockpit server list][10] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +### Host view + +Host view is where all the fun begins. This section shows and gives access to each server added to the Dashboard. The main area of interest here is the column toward the left that includes **Overview**, **Logs**, **Storage**, **Networking**, and a few other items, with **Terminal** at the bottom. Clicking on each item enables you to manage these parts of the system. The items in this section can vary depending on other features that may be installed. + +#### Overview + +When you select a server, the Host screen opens to the **Overview** section with controls for the specific host system. The Overview screen is divided into quadrants for _Health_, _Usage_, _Configuration_, and _System information_. + +![Cockpit Host Overview][11] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +Usage links to a detailed performance graph view, and System information links to hardware details. Some management controls are directly available on this screen. For example, you can change the system hostname or join the server to an enterprise domain. + +#### Storage + +In this image of the **Storage** section, the top part has a graph of read/write activity, and below that is a list of local filesystems. Further down, you can add NFS mounts or view logs. You can even create RAID devices and volume groups. + +![Cockpit Host Storage View][12] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +#### Networking + +The **Networking** section allows you to manage firewall and network interfaces. You can edit firewall rules and zones and manipulate networking with bonding, teaming, bridges, and VLANs. + +![Cockpit Host Networking View][13] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +#### Software updates + +Being able to apply updates on servers remotely is super-convenient. Even a family may have five or 10 computers. But an enterprise with hundreds or thousands of headless servers racked in a dry, dark data center miles away definitely needs this capability. The **Software updates** section lists the updates available to you. + +![Cockpit host updates][14] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +You can select whether to install all updates or just those related to security, and Cockpit displays a progress bar while updates are installed. Once the process is complete, you can restart the system. + +#### Terminal + +The last item in Host view is a **Terminal**, where you can do all the normal command-line options. One way I've used the Terminal is to overcome inconsistencies in Cockpit feature sets, most likely due to Linux version differences. I discovered this on [my Media Center PC][15] running Ubuntu Linux 18.04. In this version of Ubuntu, the Overview section is labeled System. It indicates available bug-fix updates but does not have a button for applying updates. This is not the case with the newer Ubuntu 20.04 LTS, which has the expected Overview section and update facility. Either way, there is no need to fret because I can leverage the terminal to run the normal Apt update commands. + +![Cockpit Terminal][16] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +#### Applications + +You may have noticed that I skipped the **Applications** section in Host view. This section deserves your attention because it can manipulate the view and functionality of your Cockpit service. From here, you can install additional functionality or applications, such as 389 LDAP Server or tools for collecting diagnostic reports and kernel dumps or building server images. The _Machines_ section enables virtual machine management, and _Podman_ provides container management capabilities. Once you have Cockpit up and running, it's a good idea to explore the Applications section. + +![Cockpit Applications][17] + +(Alan Formy Duvall, [CC BY-SA 4.0][7]) + +### Final thoughts + +Cockpit uses a secure shell (SSH) client to access remote servers, so there may be some resource impact on a system where you create the unified view that I described above since each managed server will have an associated SSH connection. + + +``` +$ ps fax |grep cockpit +2064515 ?        Ssl    0:50 /usr/libexec/cockpit-tls +2064521 ?        Ssl    0:41 /usr/libexec/cockpit-ws --for-tls-proxy --port=0 +2064527 ?        S      0:00  \\_ /usr/libexec/cockpit-session localhost +2064537 ?        Sl     0:38      \\_ cockpit-bridge +2064636 ?        S      1:37          \\_ /usr/libexec/cockpit-ssh webserver +2064639 ?        S      1:37          \\_ /usr/libexec/cockpit-ssh smtpserver +2064640 ?        S      1:37          \\_ /usr/libexec/cockpit-ssh ftpserver +2064670 ?        Sl     0:02          \\_ /usr/bin/cockpit-bridge --privileged +2076607 ?        S      0:21          \\_ /usr/libexec/cockpit-ssh ldapserver +2078182 ?        S      0:10          \\_ /usr/libexec/cockpit-ssh teaserver +``` + +I've used many operations tools like this, both closed and open source, for management, monitoring, provisioning, deployment, and security tasks. Cockpit is a great tool that fits organizations of all sizes. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/cockpit-server-management + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_linux11x_cc.png?itok=XMDOouJR (People work on a computer server with devices) +[2]: https://cockpit-project.org/ +[3]: https://en.wikipedia.org/wiki/Northbridge_%28computing%29 +[4]: https://en.wikipedia.org/wiki/Southbridge_%28computing%29 +[5]: https://cockpit-project.org/running.html +[6]: https://opensource.com/sites/default/files/uploads/cockpitlogin.png (Cockpit Login Screen) +[7]: https://creativecommons.org/licenses/by-sa/4.0/ +[8]: https://opensource.com/sites/default/files/uploads/cockpitdashboard.png (Cockpit Dashboard) +[9]: https://opensource.com/sites/default/files/uploads/cockpitaddmachine.png (Adding a machine to Cockpit) +[10]: https://opensource.com/sites/default/files/uploads/cockpitservers.png (Cockpit server list) +[11]: https://opensource.com/sites/default/files/uploads/cockpithostoverview.png (Cockpit Host Overview) +[12]: https://opensource.com/sites/default/files/uploads/cockpithoststorage.png (Cockpit Host Storage View) +[13]: https://opensource.com/sites/default/files/uploads/cockpithostnetwork.png (Cockpit Host Networking View) +[14]: https://opensource.com/sites/default/files/uploads/cockpithostupdates.png (Cockpit host updates) +[15]: https://opensource.com/article/18/11/old-linux-desktop-new-home-media-center +[16]: https://opensource.com/sites/default/files/uploads/cockpitterminal.png (Cockpit Terminal) +[17]: https://opensource.com/sites/default/files/uploads/cockpitapplications.png (Cockpit Applications) diff --git a/sources/tech/20201112 MuditaOS- A Beautiful and Minimal Open Source Mobile Operating System for Feature Phones.md b/sources/tech/20201112 MuditaOS- A Beautiful and Minimal Open Source Mobile Operating System for Feature Phones.md new file mode 100644 index 0000000000..288a5b0bf8 --- /dev/null +++ b/sources/tech/20201112 MuditaOS- A Beautiful and Minimal Open Source Mobile Operating System for Feature Phones.md @@ -0,0 +1,116 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (MuditaOS: A Beautiful and Minimal Open Source Mobile Operating System for Feature Phones) +[#]: via: (https://itsfoss.com/mudita-os/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +MuditaOS: A Beautiful and Minimal Open Source Mobile Operating System for Feature Phones +====== + +_**Find the always connected smartphones too distracting and privacy invasive? Let’s go back to the pre-2010 era and enjoy the simplicity of feature phones but with a modern design with MuditaOS.**_ + +There are a [few open source mobile operating systems][1] existing already. Let me add one more to this list. + +Unlike most other mobile operating systems, MuditaOS is not interested in serving smartphones. Let’s have a look at it. + +### Meet MuditaOS: A minimalistic, yet powerful mobile operating system + +![][2] + +[MuditaOS][3] is a beautifully designed [E Ink][4] mobile operating system. You might have come across the E Ink display with electronic eBook readers like Kindle or Nook. + +The E Ink display itself is soothing to the eyes and MuditaOS makes it even more beautiful with its minimalist approach. + +Here are the components of a basic phone running MuditaOS: + + * Home Screen (with clock and notification) + * Calls + * Phonebook + * Messaging + * Settings + * Music Player (Thanks goodness!) + * Alarm clock + * Calendar + * Meditation Timer + * Tools + * Onboarding + + + +Since this is all too 2007-ish, MuditaOS has a companion desktop application available to manage the phone. + +### Mudita Center desktop app to manage your Mudita Phone + +![][5] + +Mudita Center application is available on Linux, Windows and macOS. Connecting the phone to the computer and using this application, you can do the following: + + * Update MuditaOS + * Upload and manage audio on Pure + * Export notes and voice memos + * Create longer messages and notes (because typing on phone with limited keys is a pain) + * Synchronize calendar + * Use your phone as mobile hotspot (if you have the 3G/4G data connection) + + + +### What devices are available? + +![][6] + +MuditaOS is specially created for their own [Mudita Pure phones][7] that come on pebble gray and charcoal black colors. + +The phones are water resistant with IP54 rating and though it supports 4G network, you cannot use internet on the phone. You’ll have to tether it with your computer to use the data network on the computer. + +It also has ultralow SAR antenna to minimize the mobile radiation exposure. Another good thing is that their speakers and microphones are by [Harman][8] so expect top quality audio. + +Here are more technical specifications: + + * Processor: Arm Cortex-M7 600MHz, 512KB Tightly Coupled Memory (TCM) + * Memory: 16 MB SDRAM and 16 GB eMMC flash storage + * Network and connectivity: 2G, 3G, 4G/LTE, GSM, Bluetooth 4.2, USB type-C, No WiFi, no mobile data on the phone + * Display: 2.84’’ E Ink (600x480px), 16-grayscale, scratch resistant + * Weight: 140 g + * Sim card: 2 nano SIM card slots + * Audio: Loudspeaker, earspeaker & microphone by Harman, Audio playback format: MP3, WAV, FLAC, Headphone jack, Bluetooth audio playback + * Battery: ~1600mAh, Li-Po, replacable + * Sensors: Ambient Light + + + +You can preorder a Mudita Pure phone on the link below Keep in mind that pricing is astronomical compared to other feature phones. + +[Pre-order Mudita Pure][7] + +As of now, I am not aware of any device other than the ones from Mudita running MuditaOS. This is rather new on the scene. + +### Conclusion + +The name Mudita is inspired by the Sanskrit word ‘Mudit’ which means ‘happy’. Recently when the developers open sourced their project they mentioned, “open-sourcing MuditaOS goes along the line of our “You’re happy – I’m Happy” philosophy”. + +I know that working on feature phones in the age of smartphones may sound like a bad idea but keep in mind that feature phones are still not obsolete. There is still market for these phones among older people and for people who don’t want to spend too much on phones just for making calls. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/mudita-os/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/open-source-alternatives-android/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/muditaos.jpg?resize=800%2C450&ssl=1 +[3]: https://mudita.com/products/pure/muditaos +[4]: https://www.eink.com +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/muditaos-desktop-app.jpg?resize=800%2C581&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/mudita-pure.jpg?resize=800%2C600&ssl=1 +[7]: https://mudita.com/products/pure/ +[8]: https://www.harmanaudio.com/ diff --git a/sources/tech/20201112 Quick Lookup is a Simple Open Source Word Lookup Tool to Find Meaning of Words You Come Across.md b/sources/tech/20201112 Quick Lookup is a Simple Open Source Word Lookup Tool to Find Meaning of Words You Come Across.md new file mode 100644 index 0000000000..4146d08fcf --- /dev/null +++ b/sources/tech/20201112 Quick Lookup is a Simple Open Source Word Lookup Tool to Find Meaning of Words You Come Across.md @@ -0,0 +1,133 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Quick Lookup is a Simple Open Source Word Lookup Tool to Find Meaning of Words You Come Across) +[#]: via: (https://itsfoss.com/quick-lookup/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) + +Quick Lookup is a Simple Open Source Word Lookup Tool to Find Meaning of Words You Come Across +====== + +_**It is always handy to have a quick word lookup tool while browsing the web or reading an e-book. Quick Lookup is one such free and open-source tool to try.**_ + +Whenever I come across a word that I don’t know the meaning of, I just open a new tab and search for the meaning. However, it is a hit and trial every time depending on what search engine you’re on. + +Even if you do get an idea for the meaning with a quick search, you do not get all the details required along with it. Especially, if you do not know the meaning of the word that describes your target word. You will end up performing another quick search. + +So, to get rid of all that hassle, a quick lookup tool should prove to be useful! + +### Quick Lookup: A Simple Dictionary App Powered by Wiktionary + +![][1] + +Whatever is your [idea of what is Linux][2], this is what Wiktionary thinks of Linux. + +As you might have guessed already, Quick Lookup needs an active Internet connection to give you the results for your words utilizing [Wiktionary][3]. + +It is a completely free and open-source application that offers essential features to make it a handy [productive tool for Linux users][4]. Let us take a look at what it offers. + +**Recommended Read:** + +![][5] + +#### [Artha: An Offline English Thesaurus App for Linux][6] + +Artha is a feature rich thesaurus application available for all major Linux distributions.  + +### Features of Quick Lookup + +![][7] + + * Ability to look for the definitions of the words and phrases + * It lets you manually enter the word or phrase + * Multiple languages supported but the description and meaning of words/phrases will be displayed only in English + * Open internal links from within app (if you’re curious about a related word) + * Remembers your last search with the help of the back button + * You can also launch the app in selection mode to automatically capture the word you select + + + +### Installing Quick Lookup on Linux + +Quick Look is [available primarily][8] as a [Flatpak package][9] for every Linux user. If Flatpak is integrated with your software center like Pop!_Shop on [Pop OS][10], you can find it listed there. + +If you have Flatpak enabled, you can always use this command to install it: + +``` +flatpak install flathub com.github.johnfactotum.QuickLookup +``` + +You can learn more about [using Flatpak][11] in case you don’t know how about it. + +It is worth noting that if you want to select texts on your browser (or any other app) while using a Flatpak package and have it look for the meaning, you will have to type this command (launching it in the selection mode): + +``` +flatpak run com.github.johnfactotum.QuickLookup --selection +``` + +In either case, you can simply [download the source][12] archive and get it installed using the installation script. You can also run it without needing to install it by simply navigating the source folder and typing this command: + +``` +gjs quick-lookup.js +``` + +If you’ve installed it from source and want it to automatically fetch the text that you select on any app, you will have to launch it using the following command: + +``` +quick-lookup --selection +``` + +You also get an option to use the [GNOME Builder][13] if you’re familiar with it. For more details, you can check out its [GitHub page][14]. + +[Quick Lookup][14] + +**Recommended Read:** + +![][15] + +#### [LanguageTool Review: Free and Open Source Grammar Checker][16] + +LanguageTool is a free and open source proofreading software that checks the grammar, style and spelling in more than 20 languages. + +### Closing Thoughts on Quick Look + +Quick Look is definitely a useful dictionary app (even without an offline functionality) to quickly look for the meanings of words/phrases. I’m not much into eBooks, but you can try using an [eBook reader][17] along with this app to quickly be able to decipher words. + +Personally, I like to use it while browsing the web. To make things convenient, I like to keep its Window on top of every window on my workspace. So, you can easily select a text and then click on it to get the meaning and continue working. + +An offline functionality would be great for users who do not spend most of their time online. But, for the time being, it’s only online. + +Have you tried something like Quick Look? Let us know your thoughts in the comments below. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/quick-lookup/ + +作者:[Ankush Das][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/11/quick-lookup-dictionary.jpg?resize=800%2C559&ssl=1 +[2]: https://itsfoss.com/what-is-linux/ +[3]: https://www.wiktionary.org/ +[4]: https://itsfoss.com/productivity-tips-ubuntu/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2017/08/thesaurus-app-linux.jpeg?fit=300%2C169&ssl=1 +[6]: https://itsfoss.com/artha-thesaurus-app-linux/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/quick-lookup-itsfoss.png?resize=800%2C405&ssl=1 +[8]: https://flathub.org/apps/details/com.github.johnfactotum.QuickLookup +[9]: https://itsfoss.com/what-is-flatpak/ +[10]: https://itsfoss.com/pop-os-20-04-review/ +[11]: https://itsfoss.com/flatpak-guide/ +[12]: https://github.com/johnfactotum/quick-lookup/releases/tag/1.2.0 +[13]: https://wiki.gnome.org/Apps/Builder +[14]: https://github.com/johnfactotum/quick-lookup +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/LanguageTool-grammar-checker.png?fit=800%2C450&ssl=1 +[16]: https://itsfoss.com/languagetool-review/ +[17]: https://itsfoss.com/best-ebook-readers-linux/ diff --git a/sources/tech/20201112 Test GNOME apps on this Linux reference platform.md b/sources/tech/20201112 Test GNOME apps on this Linux reference platform.md new file mode 100644 index 0000000000..ace15dfa50 --- /dev/null +++ b/sources/tech/20201112 Test GNOME apps on this Linux reference platform.md @@ -0,0 +1,70 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Test GNOME apps on this Linux reference platform) +[#]: via: (https://opensource.com/article/20/11/gnome-os) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +Test GNOME apps on this Linux reference platform +====== +Introducing GNOME OS, the plain-vanilla Linux reference platform that +makes it easier to test GNOME applications and bug reports. +![Penguin with green background][1] + +I'm very excited about [GNOME 3.38][2]. The new version of the Linux desktop environment includes [lots of new features and a noticeable performance boost][3]. But in the background, mostly unnoticed, is another neat new thing about GNOME: the development of GNOME OS. + +As you might guess from its name, GNOME OS is a Linux distribution that uses GNOME as its desktop. But unlike Pop!_OS, Fedora, or Ubuntu, GNOME OS isn't meant as a complete Linux distribution. Instead, it is a reference platform for GNOME. + +The idea is to have a standard operating system image running GNOME to give developers a consistent platform to test on. As GNOME makes new releases, the GNOME development team can share that image with testers, so they can experience the new version. + +This is significant for GNOME testing. Previously, if someone reported a bug in a GNOME application, a developer would have to dig into the bug report and determine if the bug is really in the GNOME desktop or if it happened because the distribution did something or tweaked something in GNOME that had a knockdown effect on a GNOME application. But with GNOME OS, developers have a standard reference platform that is always a _vanilla_ version of GNOME. Developers can reproduce bug reports using GNOME OS; if they can reproduce the bug, they know it's really with GNOME and not someone else's "spin" on GNOME. + +As such, GNOME OS is not meant to be a full desktop operating system. It's just meant to be a place to test GNOME and GNOME applications. + +![Installing GNOME OS][4] + +Installing GNOME OS (Jim Hall, [CC BY-SA 4.0][5]) + +GNOME OS also helps GNOME developers add new features. Imagine having a virtual machine where a developer can test new changes to GNOME Shell and the extensions. In previous GNOME releases, GNOME extensions would usually break in every release. With GNOME OS, developers can test those extensions against a full version of GNOME. Developers and testers don't have to reinstall their full desktop OS—they can just run GNOME OS in a virtual machine and test it there. + +![Booting GNOME OS][6] + +Booting GNOME OS (Jim Hall, [CC BY-SA 4.0][5]) + +That's the big value in GNOME OS. Now extension writers can do their tests using GNOME OS and don't have to wait for a new version of the full GNOME to become available in a standard distribution. This allows GNOME to better support development and testing processes. + +GNOME OS also makes it easier for testers to join the project. If you want to work on GNOME, just download the GNOME OS image and test against that. Because GNOME OS is a reference platform, you know that any bugs you find will be only against GNOME. + +![Running GNOME OS][7] + +Running GNOME OS (Jim Hall, [CC BY-SA 4.0][5]) + +GNOME OS is automatically generated from new builds, so it's always the latest version of GNOME. Whenever there's a change in GNOME, it gets pushed to the GNOME OS image. GNOME OS is managed with [OSTree][8], so you don't have to keep downloading new versions. This also makes it easy to roll back if an update is broken. + +Interested in GNOME OS? Learn more about it at [GNOME OS Nightly][9], or visit the [GitLab project][10] to download a bootable GNOME OS image. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/gnome-os + +作者:[Jim Hall][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_penguin_green.png?itok=ENdVzW22 (Penguin with green background) +[2]: https://help.gnome.org/misc/release-notes/3.38/ +[3]: https://opensource.com/article/20/10/whats-new-gnome-338 +[4]: https://opensource.com/sites/default/files/uploads/installing-gnome-os.png (Installing GNOME OS) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.com/sites/default/files/uploads/booting-gnome-os.png (Booting GNOME OS) +[7]: https://opensource.com/sites/default/files/uploads/running-gnome-os.png (Running GNOME OS) +[8]: https://ostreedev.github.io/ostree/ +[9]: https://os.gnome.org/ +[10]: https://gitlab.gnome.org/GNOME/gnome-build-meta/-/wikis/home diff --git a/sources/tech/20201114 Woothee (HTTP User Agent Parser).md b/sources/tech/20201114 Woothee (HTTP User Agent Parser).md new file mode 100644 index 0000000000..0c0806070e --- /dev/null +++ b/sources/tech/20201114 Woothee (HTTP User Agent Parser).md @@ -0,0 +1,158 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Woothee (HTTP User Agent Parser)) +[#]: via: (https://theartofmachinery.com/2020/11/14/woothee.html) +[#]: author: (Simon Arneaud https://theartofmachinery.com) + +Woothee (HTTP User Agent Parser) +====== + +I’ve written [a D implementation of the Project Woothee multi-language HTTP user agent parser][1]. Here are some notes about what it’s useful for, and few things special about the D implementation. + +### Project Woothee + +HTTP clients (like normal browsers and search engine crawlers) usually identify themselves to web servers with a user agent string. These strings often contain interesting information like the client name, client version and operating system, but the HTTP spec makes no rules about how this information should be structured (it’s free-form text). Parsing them requires a bunch of rules based on what real clients use in the wild. + +There’s a project called [ua-parser][2] that maintains a list of (currently) ~1000 regular expressions for parsing user agent strings. Project Woothee is another project that’s less comprehensive, but faster than testing 1000 regexes. Sometimes you want a more comprehensive parser, but sometimes it doesn’t really help. For example, suppose you want to estimate the proportion of your users running Firefox versus Chrome versus whatever by processing a big web log dump. The answer will never be 100% accurate (even with 100% accurate parsing) because bots pretending to be Chrome browsers will skew the results a bit anyway. + +Woothee has some quirks (e.g., it doesn’t distinguish RSS reader clients) but it has uses, too. + +### The D version + +I wanted to keep the D version code simple so that it can be easily updated when the upstream project data gets updated. I took some easy opportunities to make it faster, though. In a quick, unscientific test, it parsed ~1M strings from a web log on a five-year-old laptop in about 5s. I’m sure it could be made faster, but that’s good enough for me right now. + +#### Preprocessing regexes and HTTP client data + +Woothee still uses some regexes (about 50). In most languages, these are strings that need to be processed at runtime, every time the program is run. I don’t know if [Boost Xpressive][3] was the first to support compile-time regex parsing, but I remember being impressed by it at the time. The downside is having to use an operator overloading hack that manages to make regexes even harder to read: + +``` +sregex re = '$' >> +_d >> '.' >> _d >> _d; +``` + +We’ve come a long way since 2007. [D’s standard library has a compile-time regex][4], but it’s not even needed. This works: + +``` +void foo() +{ + import std.regex; + static immutable re = regex(`\$\d+\.\d\d`); + // ... +} +``` + +If you’re wondering: `static` puts the `re` into the same storage space as a global variable would be in (instead of the stack, which is run time only), while `immutable` allows the compiler to avoid copying the variable into thread-local storage for every thread. If you’re from C++, you might expect that `regex()` will still get called once at run time to initialise `re`, but thanks to [CTFE][5] it’s processed at compile time and turned into normal data in the compiled binary. + +There’s one big downside: this kind of complex CTFE is still slow. Compiling all the regexes using DMD takes ~10s, long enough to be annoying. So I added a [version flag][6] `WootheePrecompute`. Switching regex CTFE is simpler because the regex matching functions in `std.regex` also have overloads that take plain strings for regexes (which then get compiled and passed to the overload that takes a pre-compiled regex). `woothee-d` uses a helper function defined like this: + +``` +version(WootheePrecompute) +{ + auto buildRegex(string r) + { + return regex(r); + } +} +else +{ + auto buildRegex(string r) + { + return r; + } +} +``` + +Then regexes get used in the code like this: + +``` +static immutable version_re = buildRegex(`Sleipnir/([.0-9]+)`); +const caps = _agent.matchFirst(version_re); +``` + +Without `WootheePrecompute`, `buildRegex()` has no effect, and `version_re` is just a plain string that gets compiled on use. With `WootheePrecompute` enabled, `buildRegex()` actually compiles the regex using CTFE. + +`WootheePrecompute` also enables processing the Project Woothee HTTP client data at compile time instead of at startup. + +#### More precomputation for faster string searching + +Woothee requires a lot of searching for strings inside the user agent string. Here’s a small sample: + +``` +if (contains!"Yahoo" || contains!"help.yahoo.co.jp/help/jp/" || contains!"listing.yahoo.co.jp/support/faq/") +{ + if (contains!"compatible; Yahoo! Slurp") return populateDataset("YahooSlurp"); + if (contains!"YahooFeedSeekerJp" || contains!"YahooFeedSeekerBetaJp" || contains!"crawler (http://listing.yahoo.co.jp/support/faq/" || contains!"crawler (http://help.yahoo.co.jp/help/jp/" || contains!"Y!J-BRZ/YATSHA crawler" || contains!"Y!J-BRY/YATSH crawler") return populateDataset("YahooJP"); + if (contains!"Yahoo Pipes") return populateDataset("YahooPipes"); +} +``` + +You may have noticed that `contains` is a template function taking the “needle” string as compile-time parameter. There are many famous ways to make searching for a “needle” string in a “haystack” string faster if you can preprocess either one. The Boyer-Moore algorithm is one algorithm, and there’s actually [an implementation in Phobos][7], but sadly it doesn’t work in CTFE. + +I tried another trick that’s simple and fast for short strings. The key idea is that there’s no point searching for a needle like “foo” if the haystack doesn’t even contain both the letters “f” and “o” in the first place. We can create a 64b hash of both strings that lets us do an approximate character subset test with a super-fast bitwise operation (like a [bloom filter][8]). The hashes for all the needle strings can be calculated at compile time, and the hash for the haystack (the user agent string) only needs to calculated once. + +The hash is super simple. Each byte in the string just sets one of the 64 bits of the output. Specifically, the hash takes each byte in the string, calculates the value modulo 64 (equivalently, takes the lower 6 bits), then sets the corresponding bit of the 64b output. Here’s the code: + +``` +ulong bloomHashOf(string s) pure +{ + ulong ret; + foreach (char c; s) + { + ret |= 1UL << (c & 63); + } + return ret; +} +``` + +Here’s an example with the string, “X11; FreeBSD ”: + +![Bloom-filter-style 64b hash of the string “X11; FreeBSD ”. The string starts with the letter “X”, which has ASCII code 88, which is 64 + 24, which is why bit #24 is set.][9] + +Note that the hash doesn’t count occurrences of a character; it just flags whether a particular character occurs at all. It also loses all information about order. It’s still useful for avoiding a lot of futile searches. For example, “Tiny Tiny RSS/20.05-c8243b0 ( doesn’t contain the character “X”, so there’s no way it can contain the string “X11; FreeBSD ”, as is easily detected by the hashes: + +![Hashes of the string “Tiny Tiny RSS/20.05-c8243b0 \(http://tt-rss.org/\)” and the string “X11; FreeBSD ”. The first hash doesn't have bit #24 set, proving that the first string can't contain a letter “X”, proving that the second string can't be contained inside it.][10] + +Here’s the D code. It does a quick bitwise op to check if _all_ the bits set in the needle hash are also set in the (previously calculated) user agent string hash. `bloomHashOf(needle)` is calculated as a constant at compile time. In fact, LDC with `-O2` inlines very sensibly, basically putting some bit ops with a 64b constant in front of a conditional jump in front of the call to `canFind()`. This precomputation is dirt cheap, so I didn’t even bother putting a `version(WootheePrecompute)` in there, as you can see for yourself: + +``` +bool contains(string needle)() +{ + import std.algorithm.searching : canFind; + enum needle_bloom = bloomHashOf(needle); + if ((needle_bloom & _agent_bloom) != needle_bloom) return false; + return _agent.canFind(needle); +} +``` + +The quick check is one sided. If it fails, we know we don’t need to search. If it passes, that doesn’t prove we have a substring match because the hash doesn’t account for repeated characters, or character order, and can also have different characters colliding to set the same bit value. + +Simply taking the bottom 6 bits is a pretty unsophisticated hashing technique, but if you look at an ASCII chart (`man ascii`), most of the characters that typically appear in HTTP user agents are in the range 64-127, which all have different values in the bottom 6 bits. So collisions aren’t a real problem, and actually [most pseuodorandom hashes would do a worse job][11]. + +In a simple test with real HTTP user agents from a log, 89% of potential `canFind()` calls were skipped thanks to the quick check, 9% were followed but failed and 2% were followed and found a real match. Overall, the quick check made `woothee-d` almost twice as fast, which is a nice win for some cheap precomputation. I think there’s more performance that could be gained, but it looks like most of the low-hanging fruit for string search has been taken. + +-------------------------------------------------------------------------------- + +via: https://theartofmachinery.com/2020/11/14/woothee.html + +作者:[Simon Arneaud][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://theartofmachinery.com +[b]: https://github.com/lujun9972 +[1]: https://gitlab.com/sarneaud/woothee-d +[2]: https://github.com/ua-parser +[3]: https://www.boost.org/doc/libs/1_74_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes +[4]: https://dlang.org/phobos/std_regex.html#ctRegex +[5]: https://tour.dlang.org/tour/en/gems/compile-time-function-evaluation-ctfe +[6]: https://dlang.org/spec/version.html +[7]: https://dlang.org/phobos/std_algorithm_searching.html#boyerMooreFinder +[8]: https://en.wikipedia.org/wiki/Bloom_filter +[9]: https://theartofmachinery.com/images/woothee/bloom.svg +[10]: https://theartofmachinery.com/images/woothee/bloom_mismatch.svg +[11]: https://theartofmachinery.com/2020/01/27/systems_programming_probability.html diff --git a/sources/tech/20201116 Day 5- drawing lots of faces with sketch-rnn.md b/sources/tech/20201116 Day 5- drawing lots of faces with sketch-rnn.md new file mode 100644 index 0000000000..0b1e0a4d5f --- /dev/null +++ b/sources/tech/20201116 Day 5- drawing lots of faces with sketch-rnn.md @@ -0,0 +1,87 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Day 5: drawing lots of faces with sketch-rnn) +[#]: via: (https://jvns.ca/blog/2020/11/16/day-5--lots-of-faces-with-sketch-rnn/) +[#]: author: (Julia Evans https://jvns.ca/) + +Day 5: drawing lots of faces with sketch-rnn +====== + +Hello! This week it’s generative art week at RC, and I thought it would be fun to generate drawings of faces. + +Someone suggested the [Google Quickdraw][1] dataset, which has a lot of pictures of faces. And even though I think most of the faces in there are not really that interesting, I really quite like some of them, like these two: + +![][2] ![][3] + +So that seems like somewhere to start! + +### step 1: get the sketch-rnn model + +sketch-rnn is an RNN trained on the quickdraw dataset that generates line drawings. You can see it in action in Monica Dinculescu’s very fun [magic sketchpad][4] demo here – you start making a drawing, and it’ll complete you drawing as a cat / bridge / whatever you want. + +I figured that would be a fun place to start, and [ml5js][5] has a [tutorial showing how to write Javascript code to draw things with sketch-rnn][6], which I followed. + +### step 2: make the tutorial code use async/await + +The ml5js example had a bunch of global variables and callbacks and I found it difficult to work with, so I spent a while refactoring it to use async/await so that I could play around with it more easily. This took a while but I got it to work. + +### step 3: make sketch-rnn draw lots of faces and put them into a gallery + +I started out with making a more interactive website, but decided to instead do something really simple to start: just get the model to draw a lot of faces and see how I felt about them. + +Here’s the resulting (very janky, not responsive) website I made, which draws faces and then puts them into a little “gallery” on the right: [lots of sketch-rnn faces][7]. You can see it “live” drawing the faces which is fun. + +The set of images that comes out looks something like this: + +![][8] + +I don’t really like _any_ of these faces, but it’s a start! It’s also very slow on my 2015 laptop, but faster on the iPad. I didn’t spend a lot of time profiling it, but it seems to spend a lot of time in some function with `lstm` in its name – I don’t know what an LSTM is exactly but I know it’s a component of an RNN, so I guess (as you’d expect) it just has a lot of math to do in Javascript to calculate the next line to draw and that’s slow. + +### next step: maybe find out if sketch-rnn can tell the difference between “interesting” and “boring” faces + +I think that this face: + +![][2] + +is a lot more interesting than this face: + +![][9] + +Can I convince the neural network to distinguish between faces that I think are ‘interesting’ and ‘boring’ and maybe only generate more “interesting” faces? We’ll see! Right now I am stuck on trying to get a pre-trained model loaded into Python, so there’s a long way to go. + +I did find someone who’d done something kind of similar, on [bad flamingos vs good flamingos][10] in the quickdraw dataset. + +I still don’t really know anything about RNNs, but maybe if I can answer this question I will learn something about them. + +### also there’s a refrigerator poetry forum + +Here’s that refrigerator poetry forum I was talking about last week: . You can write magnet poetry-style poems on a refrigerator. People wrote some charming poems and I’m happy with it. I think I might use Rails for another project in the future. + +Hopefully people won’t abuse it, if there’s abuse I’ll just take it off the internet probably. + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/16/day-5--lots-of-faces-with-sketch-rnn/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://quickdraw.withgoogle.com/data/face +[2]: https://jvns.ca/images/face1.jpg +[3]: https://jvns.ca/images/face2.jpg +[4]: https://magic-sketchpad.glitch.me/ +[5]: https://learn.ml5js.org +[6]: https://github.com/ml5js/ml5-library/tree/main/examples/javascript/SketchRNN/SketchRNN_interactive +[7]: https://lots-of-sketchrnn-faces.netlify.app/ +[8]: https://jvns.ca/images/faces.png +[9]: https://jvns.ca/images/boring-face.png +[10]: https://colinmorris.github.io/blog/bad_flamingos diff --git a/sources/tech/20201116 Linux Jargon Buster- What is Grub in Linux- What is it Used for.md b/sources/tech/20201116 Linux Jargon Buster- What is Grub in Linux- What is it Used for.md new file mode 100644 index 0000000000..74dfda57dc --- /dev/null +++ b/sources/tech/20201116 Linux Jargon Buster- What is Grub in Linux- What is it Used for.md @@ -0,0 +1,130 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Linux Jargon Buster: What is Grub in Linux? What is it Used for?) +[#]: via: (https://itsfoss.com/what-is-grub/) +[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/) + +Linux Jargon Buster: What is Grub in Linux? What is it Used for? +====== + +If you ever used a desktop Linux system, you must have seen this screen. This is called the GRUB screen. Yes, it is written in all capital letters. + +![Remember this screen? This is GRUB][1] + +In this chapter of the Linux Jargon Buster series, I’ll tell you what is Grub and what is it used for. I’ll also briefly touch upon the configuration and customization part. + +### What is GRUB? + +[GRUB][2] is complete program for loading and managing boot. It is the most common bootloader for Linux distributions. A bootloader is the first software that runs when a computer starts. It loads the [kernel of the operating system][3] and then the kernel initializes the rest of the operating systems (shell, [display manager][4], [desktop environment][5] etc). + +#### Boot loader vs boot manager + +I didn’t want to confuse you at this stage but I see no option to avoid bringing this topic. There is a blur line between a bootloader and a boot manager. + +You already know that bootloader starts first and then loads the kernel into memory and executes it. A boot manager program allows you to choose between operating systems (if there are more than one OS on your system). A boot manager doesn’t load the OS directly, + +With Linux kernel version 3.3, the [Linux kernel includes a built-in EFI bootloader][6]. In fact, any operating system that is capable of working [EFI system includes an EFI bootloader][7]. In EFI capable systems, the firmware reads the EFI System Partition (ESP) for the EFI files for boot information. + +_**Insert Image: Show partition table with ESP partition.**_ + +![][8] + +GRUB is both a bootloader and a boot manager. I’ll come back to GRUB in a moment. Let’s see other GRUB like programs. + +Trivia + +GRUB is acronym for **GR**and **U**nified **B**ootloader. + +### What are some other boot managing programs like GRUB? + +GRUB is the most popular boot manager for Linux. But it is not the only one. There is this highly customizable [rEFInd boot manager][9] that some Linux users love to use. + +![Customized rEFInd Boot Manager Screen | Image Credit][10] + +There is [systemd-boot][11] text-based boot manager. You can guess that this is exclusively for systemd-based Linux distributions. Some distributions like Pop OS use the systemd-boot. + +![systemd-Boot in Pop OS | Image Credit][12] + +### Accessing or editing GRUB + +The usual GRUB screen you see is its menu interface. It allows you to choose the operating systems if there are more than one operating system. You can also choose to load a different kernel if your Linux distribution as more than one kernel installed. + +Depending upon the configuration set by the Linux distribution, you may have some other entries on the GRUB menu. + +You can edit GRUB menu entry by pressing the key `e`. This way, you can change the kernel parameters before loading it. For example, in some cases, [disabling the graphics driver from the kernel helps you with Linux system stuck at boot][13]. + +![][14] + +You can also enter the command line menu of GRUB using the key `c` at the GRUB menu interface. + +#### GRUB configuration file + +Any changes you make to the GRUB from the menu interface is temporary. If you want to make some permanent changes to GRUB like changing the default timeout, you can change the configuration file after you boot into your Linux system. + +The default GRUB configuration file is located at /etc/default/grub. There is also a /etc/default/grub.d directory. You may edit the /etc/default/grub file directly, however it is advised to make additional changes by adding config files (.cfg files) in this directory. + +![Default GRUB Config File][15] + +You must [update GRUB for the changes to take into effect][16]. + +#### GRUB customizer in Ubuntu + +If you think [editing file with a text editor in the terminal][17] is not something you feel comfortable with, you can [use a graphical tool called GRUB Customizer][18]. + +![][19] + +It allows you to change the boot order, default timeout etc. You can also use it to change the background of GRUB with a custom wallpaper. + +This tool is unfortunately available for Ubuntu-based Linux distributions only. + +### Conclusion + +I have touched everything on the surface. EFI, boot loading and GRUB itself is detailed and complicated topic and not in the scope of this article. This article intended to give you a high level overview of GRUB boot program. + +Perhaps I’ll write a detailed guide on GRUB explaining the low level details. For now, if you want to learn more on GRUB, you can access the GRUB documentation in your Linux terminal using `info grub` command. + +![GRUB Manual can be accessed via Terminal][20] + +I hope you have a tad bit better understanding of what is GRUB now. Here’s a GIF to humor you. + +![What Is GRUB? UEFI don’t hurt me, no more… :\)][21] + +I may not have answered all questions you have about GRUB. Please feel free to let me know in the comment section. I may update the article with your questions or suggestions. + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/what-is-grub/ + +作者:[Abhishek Prakash][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/abhishek/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/grub-screen-linux.png?resize=800%2C450&ssl=1 +[2]: https://www.gnu.org/software/grub/ +[3]: https://itsfoss.com/what-is-linux/ +[4]: https://itsfoss.com/display-manager/ +[5]: https://itsfoss.com/what-is-desktop-environment/ +[6]: https://www.rodsbooks.com/efi-bootloaders/efistub.html +[7]: https://jdebp.eu/FGA/efi-boot-process.html +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/disk-partition-gparted.png?resize=744%2C385&ssl=1 +[9]: https://www.rodsbooks.com/refind/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/refind-boot-manager.png?resize=800%2C602&ssl=1 +[11]: https://wiki.gentoo.org/wiki/Systemd-boot +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/systemd-boot.png?resize=714%2C333&ssl=1 +[13]: https://itsfoss.com/fix-ubuntu-freezing/ +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/04/editing-grub-to-fix-nvidia-issue.jpg?resize=800%2C343&ssl=1 +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/default-grub-config-file.png?resize=759%2C437&ssl=1 +[16]: https://itsfoss.com/update-grub/ +[17]: https://itsfoss.com/command-line-text-editors-linux/ +[18]: https://itsfoss.com/grub-customizer-ubuntu/ +[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2013/05/make-windows-default-grub-2.jpeg?resize=799%2C435&ssl=1 +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/grub-manual-Linux-terminal.png?resize=800%2C462&ssl=1 +[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/what_is_GRUB.gif?resize=500%2C343&ssl=1 diff --git a/sources/tech/20201116 Manage multiple Terraform versions with tfenv.md b/sources/tech/20201116 Manage multiple Terraform versions with tfenv.md new file mode 100644 index 0000000000..28ddcd0b4c --- /dev/null +++ b/sources/tech/20201116 Manage multiple Terraform versions with tfenv.md @@ -0,0 +1,262 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Manage multiple Terraform versions with tfenv) +[#]: via: (https://opensource.com/article/20/11/tfenv) +[#]: author: (Jessica Cherry https://opensource.com/users/cherrybomb) + +Manage multiple Terraform versions with tfenv +====== +If you use multiple Terraform versions in your environment, tfenv will +make your life much easier. +![Computer screen with files or windows open][1] + +In my [Terraform for Kubernetes beginners][2] article, I used Terraform 11, and in an upcoming article, I'll cover upgrading from Terraform 11 to 12. To prepare for that, in this article, I'll show you how to use [tfenv][3], a tool that makes it much easier to convert from one version to another, as well as to manage multiple Terraform versions in your work environment. + +### Install tfenv + +Many coding languages have tools that allow you to go back and forth between versions based on environmental rules. One example (which tfenv is based on) is [rbenv][4], which allows you to choose which version of [Ruby][5] you want to work with. + +tfenv works on Linux, macOS, and Windows; I'll cover the Linux installation using Ubuntu 18.04, but the tool's GitHub repository has [installation instructions][6] for the other operating systems. + +The Linux installation uses some Git commands (check out the [intro to Git][7] series if you're not already familiar with it). + +First, create a `.tfenv` folder in your `${HOME}` directory: + + +``` +`jess@Athena:~$ mkdir .tfenv` +``` + +Clone the `tfenv` repository: + + +``` +jess@Athena:~$ git clone ~/.tfenv +Cloning into '/home/jess/.tfenv'... +remote: Enumerating objects: 21, done. +remote: Counting objects: 100% (21/21), done. +remote: Compressing objects: 100% (19/19), done. +remote: Total 1105 (delta 8), reused 10 (delta 2), pack-reused 1084 +Receiving objects: 100% (1105/1105), 216.01 KiB | 2.84 MiB/s, done. +Resolving deltas: 100% (703/703), done. +``` + +If you prefer [Homebrew][8], you can use: + + +``` +`$ brew install tfenv` +``` + +Export your path into your Bash profile: + + +``` +`jess@Athena:~$ echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile` +``` + +If you want to use just the base commands for Ubuntu/Debian-based systems, there is another option that makes things a little easier. After doing the clone in the `.tfenv` directory, set your profile to put the `tfenv` command into your profile in your next session: + + +``` +`jess@Athena:~/.tfenv$ . ~/.profile` +``` + +Once the profile is set, you can symlink your directory to your `.local/bin` directory to make `tfenv` an executable binary: + + +``` +`jess@Athena:~/.tfenv$ ln -s ~/.tfenv/bin/* ~/.local/bin` +``` + +Run the `which` command, and you should see `tfenv`'s location: + + +``` +jess@Athena:~/.tfenv$ which tfenv +/home/jess/.local/bin/tfenv +``` + +### How to use tfenv + +Now that everything is installed, check out what commands are available: + + +``` +jess@Athena:~$ tfenv +tfenv 2.0.0-37-g0494129 +Usage: tfenv <command> [<options>] + +Commands: +   install      Install a specific version of Terraform +   use          Switch a version to use +   uninstall    Uninstall a specific version of Terraform +   list         List all installed versions +   list-remote  List all installable versions +``` + +As you can see, it's a pretty straightforward tool that enables you to install and uninstall Terraform versions as needed. + +Before you decide what to install, check which versions are available. This is a small snippet, as the list is about a mile long: + + +``` +jess@Athena:~$ tfenv list-remote +0.14.0-beta1 +0.14.0-alpha20201007 +0.14.0-alpha20200923 +0.14.0-alpha20200910 +0.13.5 +0.13.4 +0.13.3 +0.13.2 +0.13.1 +0.13.0 +0.13.0-rc1 +0.13.0-beta3 +0.13.0-beta2 +0.13.0-beta1 +0.12.29 +0.12.28 +0.12.27 +``` + +#### Install Terraform versions + +To install the latest version of Terraform: + + +``` +jess@Athena:~$ tfenv install latest +Installing Terraform v0.13.5 +Downloading release tarball from +###################################################################################################################################################################################### 100.0% +Downloading SHA hash file from +No keybase install found, skipping OpenPGP signature verification +Archive:  tfenv_download.N3bzZ2/terraform_0.13.5_linux_amd64.zip +  inflating: /home/jess/.tfenv/versions/0.13.5/terraform   +Installation of terraform v0.13.5 successful. To make this your default version, run 'tfenv use 0.13.5' +``` + +To install a specific Terraform version (in this case, 0.12.29): + + +``` +jess@Athena:~$ tfenv install 0.12.29 +Installing Terraform v0.12.29 +Downloading release tarball from +###################################################################################################################################################################################### 100.0% +Downloading SHA hash file from +No keybase install found, skipping OpenPGP signature verification +Archive:  tfenv_download.1YFOLh/terraform_0.12.29_linux_amd64.zip +  inflating: /home/jess/.tfenv/versions/0.12.29/terraform   +Installation of terraform v0.12.29 successful. To make this your default version, run 'tfenv use 0.12.29' +``` + +Finally, to install the latest version of Terraform 0.11: + + +``` +jess@Athena:~$ tfenv install latest:^0.11 +Installing Terraform v0.11.15-oci +Downloading release tarball from +###################################################################################################################################################################################### 100.0% +Downloading SHA hash file from +No keybase install found, skipping OpenPGP signature verification +Archive:  tfenv_download.8OxQ8k/terraform_0.11.15-oci_linux_amd64.zip +  inflating: /home/jess/.tfenv/versions/0.11.15-oci/terraform   +Installation of terraform v0.11.15-oci successful. To make this your default version, run 'tfenv use 0.11.15-oci' +``` + +That was simple, and now you can put them to use! + +#### Change Terraform versions + +Once you have installed several versions of Terraform, you can pick one to use. First, find out your options by listing the installed versions: + + +``` +jess@Athena:~$ tfenv list +  0.13.5 (set by /home/jess/.tfenv/version) +  0.12.29 +  0.11.15-oci +``` + +By default, tfenv chooses the most up-to-date version of Terraform you have installed. Find out the default by running the `tfenv use` command: + + +``` +jess@Athena:~$ tfenv use +Switching default version to v0.13.5 +Switching completed + +jess@Athena:~$ terraform --version +Terraform v0.13.5 +``` + +But what if you need to use an older version? This example switches to the oldest version I have installed: + + +``` +jess@Athena:~$ tfenv use 0.11.15-oci +Switching default version to v0.11.15-oci +Switching completed + +jess@Athena:~$ terraform -version +Terraform v0.11.15-oci + +Your version of Terraform is out of date! The latest version +is 0.13.5. You can update by downloading from [www.terraform.io/downloads.html][9] +``` + +It's easy as pie! Just run the `list` command and use the naming convention provided. + +#### Uninstall Terraform versions + +If you have a version of Terraform you don't want or need any more, you can remove it with the `uninstall` command. For example, I don't need Terraform version 0.13: + + +``` +jess@Athena:~$ tfenv uninstall 0.13.5 +Uninstall Terraform v0.13.5 +Terraform v0.13.5 is successfully uninstalled +``` + +To confirm it's no longer installed: + + +``` +jess@Athena:~$ tfenv list +  0.12.29 +  0.11.15-oci +``` + +### Final thoughts + +The tfenv tool is great for many reasons. If you need to update from one version of Terraform to another, this is one of the faster ways to upgrade and test the outcome. If your environment has things running on several Terraform versions, it's easy to switch back and forth as needed. If you use Terraform, try tfenv and see how it can transform your environment. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/tfenv + +作者:[Jessica Cherry][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cherrybomb +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open) +[2]: https://opensource.com/article/20/7/terraform-kubernetes +[3]: https://github.com/tfutils/tfenv +[4]: https://github.com/rbenv/rbenv +[5]: https://www.ruby-lang.org/en/ +[6]: https://github.com/tfutils/tfenv#installation +[7]: https://opensource.com/life/16/7/stumbling-git +[8]: https://opensource.com/article/20/6/homebrew-linux +[9]: http://www.terraform.io/downloads.html diff --git a/sources/tech/20201117 How to upgrade to Terraform 0.12.md b/sources/tech/20201117 How to upgrade to Terraform 0.12.md new file mode 100644 index 0000000000..6f38dd9201 --- /dev/null +++ b/sources/tech/20201117 How to upgrade to Terraform 0.12.md @@ -0,0 +1,503 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How to upgrade to Terraform 0.12) +[#]: via: (https://opensource.com/article/20/11/update-terraform) +[#]: author: (Jessica Cherry https://opensource.com/users/cherrybomb) + +How to upgrade to Terraform 0.12 +====== +Updating your environment to Terraform 0.12 is not for the faint of +heart, but this how-to will make it less painful. +![Green graph of measurements][1] + +In [getting started with Terraform][2], I used Terraform version 0.11. As some readers pointed out, this version lacks some significant features, so in this article, I'll explain how to update Terraform to the more feature-rich version 0.12. + +You may be surprised to learn that many people still use Terraform 0.11, including large organizations and stubborn users who like to stay on tried-and-true technology. Converting from Terraform 0.11 to 0.12 can be very complex. If you want to take advantage of the newer features but think you're not ready to update, this article should help make the conversion easier. + +In this article, I'll use the code from my "getting started" article and the [tfenv][3] tool, which enables you to use different versions of Terraform on the same machine. I'll also assume that you're familiar with two versions of Terraform (the one you're using, and the one you're migrating to), and how to use the `terraform` command in general. + +### Code changes needed for version 12 + +Some things work in Terraform version 0.11 that do not work in version 0.12. Here is an example of code I used in my previous article: + + +``` +resource "kubernetes_namespace" "1-minikube-namespace" { +  metadata { +        name = "my-first-terraform-namespace" +  } +} +``` + +As one reader pointed out, this code block does not work in version 0.12 due to changes in the way the latest Terraform works. This is a simple example, and it gets more complicated. Here are some examples of how much things may need to change in a production environment. + +The new Terraform needs slightly different syntax and structure. For starters, add a `vars.tf` file: + + +``` +variable "namespace" { +  type = "string" +  default = "helloworld" +} + +variable "cluster" { +  type = "string" +  default = "minikube" +} +``` + +Then, change parts of the `main.tf` file to incorporate the new `vars.tf` file. The Kubernetes provider now looks like this: + + +``` +provider "kubernetes" { +  config_context_cluster   = "${var.cluster}" +} +``` + +Here is the revised namespace resource: + + +``` +resource "kubernetes_namespace" "1-minikube-namespace" { +  metadata { +        name = "${var.namespace}" +  } +} +``` + +Finally, the changed [Helm provider][4]: + + +``` +provider "helm" { +  kubernetes { +        config_context_cluster   = "${var.cluster}" +  } +} +``` + +Beware! These small changes will matter when switching between versions. + +### Deploy before conversion + +Before moving forward, [set up tfenv][5] to use the correct version of Terraform: + + +``` +jess@Athena:~/terraform_doc$ tfenv list +  0.12.29 +  0.11.15-oci +jess@Athena:~/terraform_doc$ tfenv use 0.11.15-oci +Switching default version to v0.11.15-oci +Switching completed +jess@Athena:~/terraform_doc$ terraform --version +Terraform v0.11.15-oci +\+ provider.helm v1.2.2 +\+ provider.kubernetes v1.11.2 + +Your version of Terraform is out of date! The latest version +is 0.xx.y. You can update by downloading from [www.terraform.io/downloads.html][6] +``` + +If you (like me) have done other work with Terraform after using the code in my previous Terraform article, you need to redeploy everything. Set up the Minikube cluster for this Terraform deployment by starting a new, clean cluster: + + +``` +$ minikube delete +🔥  Deleting "minikube" in kvm2 ... +💀  Removed all traces of the "minikube" cluster. +jess@Athena:~/terraform_doc$ minikube start +😄  minikube v1.14.0 on Ubuntu 18.04 +``` + +After the cluster is set up, you can deploy your modified Terraform code. Start with the `init` command: + + +``` +$ terraform init + +Initializing provider plugins... + +The following providers do not have any version constraints in configuration, +so the latest version was installed. + +To prevent automatic upgrades to new major versions that may contain breaking +changes, it is recommended to add version = "..." constraints to the +corresponding provider blocks in configuration, with the constraint strings +suggested below. + +* provider.helm: version = "~> 1.2" +* provider.kubernetes: version = "~> 1.11" + +Terraform has been successfully initialized! + +You may now begin working with Terraform. Try running "terraform plan" to see +any changes that are required for your infrastructure. All Terraform commands +should now work. [...] +``` + +Next, run your plan: + + +``` +$ terraform plan +Refreshing Terraform state in-memory prior to plan... +helm_release.local: Refreshing state... (ID: buildachart) +kubernetes_namespace.1-minikube-namespace: Refreshing state... (ID: my-first-terraform-namespace) [...] + +Terraform will perform the following actions: + +  + helm_release.local +        id:                            <computed> +        atomic:                        "false" +        chart:                         "./buildachart" +        cleanup_on_fail:               "false" +        create_namespace:              "false" +        dependency_update:             "false" +        disable_crd_hooks:             "false" +        disable_openapi_validation: "false" +        [...] +  + kubernetes_namespace.1-minikube-namespace +        id:                            <computed> +        metadata.#:                     "1" +        [...] + +Note: You didn't specify an "-out" parameter to save this plan, so Terraform +can't guarantee that exactly these actions will be performed if +"terraform apply" is subsequently run. +``` + +Finally, apply the Terraform: + + +``` +$ terraform apply --auto-approve +helm_release.local: Refreshing state... (ID: buildachart) +kubernetes_namespace.1-minikube-namespace: Refreshing state... (ID: my-first-terraform-namespace) +kubernetes_namespace.1-minikube-namespace: Creating... +  metadata.#:                   "" => "1" +  metadata.0.generation:       "" => "<computed>" +  [...] +helm_release.local: Creating... +  atomic:                      "" => "false" +  chart:                       "" => "./buildachart" +  cleanup_on_fail:             "" => "false" +  create_namespace:            "" => "false" + [...] +  version:                     "" => "0.1.0" +  wait:                        "" => "true" +kubernetes_namespace.1-minikube-namespace: Creation complete after 1s (ID: helloworld) +helm_release.local: Still creating... (10s elapsed) +helm_release.local: Creation complete after 13s (ID: buildachart) + +Apply complete! Resources: 2 added, 0 changed, 0 destroyed. +``` + +Now you have a local backup of the Terraform state: + + +``` +$ ls -lrt + +drwxr-xr-x 6 jess jess 4096 May 16 14:15 buildachart +-rw-r--r-- 1 jess jess  363 Oct 24 13:06 main.tf +-rw-rw-r-- 1 jess jess  132 Oct 24 13:17 vars.tf +-rw-rw-r-- 1 jess jess 3897 Oct 24 13:20 terraform.tfstate.backup +-rw-rw-r-- 1 jess jess 3821 Oct 24 13:21 terraform.tfstate +``` + +### Convert from Terraform 0.11 to 0.12 + +Once everything is deployed using Terraform 0.11, you must work through the conversion process without damaging what you have in your new production cluster. First, change your Terraform version to 0.12 using tfenv: + + +``` +$ tfenv list +  0.12.29 +* 0.11.15-oci (set by /home/jess/.tfenv/version) +jess@Athena:~/terraform_doc$ tfenv use 0.12.29 +Switching default version to v0.12.29 +Switching completed +jess@Athena:~/terraform_doc$ terraform --version +Terraform v0.12.29 +\+ provider.helm v1.2.2 +\+ provider.kubernetes v1.11.2 +``` + +Now that you're on Terraform 0.12, you're ready to convert. Luckily, Terraform has a built-in command for this, as shown in this snippet from the Terraform command list: + + +``` +All other commands: +        0.12upgrade     Rewrites pre-0.12 module source code for v0.12 +``` + +Test the `upgrade` command to see what will be rewritten, then enter `yes` to do the upgrade: + + +``` +$ terraform 0.12upgrade + +This command will rewrite the configuration files in the given directory so +that they use the new syntax features from Terraform v0.12, and will identify +any constructs that may need to be adjusted for correct operation with +Terraform v0.12. +[...] +Would you like to upgrade the module in the current directory? +  Only 'yes' will be accepted to confirm. + +  Enter a value: yes + +\----------------------------------------------------------------------------- + +Upgrade complete! + +The configuration files were upgraded successfully. Use your version control +system to review the proposed changes, make any necessary adjustments, and +then commit. +``` + +It seems to have gone well. It may have rewritten some things, but that will not account for everything that needs to be changed with the Terraform files. However, it does a great job of making notes within the files. Here are the changes it made to the `vars.tf` file: + + +``` +variable "namespace" { +  type  = string +  default = "helloworld" +} + +variable "cluster" { +  type  = string +  default = "minikube" +} +``` + +The `type` changed to remove quotes around the word `string` (quoting in Terraform files has changed over time). Next, look at the `main.tf` file: + + +``` +provider "kubernetes" { +  config_context_cluster = var.cluster +} + +# TF-UPGRADE-TODO: In Terraform v0.11 and earlier, it was possible to begin a +# resource name with a number, but it is no longer possible in Terraform v0.12. +# +# Rename the resource and run `terraform state mv` to apply the rename in the +# state. Detailed information on the `state move` command can be found in the +# documentation online: +resource "kubernetes_namespace" "1-minikube-namespace" { +  metadata { +        name = var.namespace +  } +} + +provider "helm" { +  kubernetes { +        config_context_cluster = var.cluster +  } +} + +resource "helm_release" "local" { +  name  = "buildachart" +  chart = "./buildachart" +} +``` + +The quotes changed here, too, and variables are no longer wrapped in `${}` characters. The biggest section is a large TODO note that the conversion command placed in the code to show what needs to change in the resource name to be acceptable in version 0.12. Even better, it explains how to fix this issue and the command you need to run. The other major changes are the new `versions.tf` file and a new backup file: + + +``` +$ ls -lrt +drwxr-xr-x 6 jess jess 4096 May 16 14:15 buildachart +-rw-rw-r-- 1 jess jess 3897 Oct 24 13:20 terraform.tfstate.backup +-rw-r--r-- 1 jess jess   46 Oct 24 13:28 versions.tf +-rw-rw-r-- 1 jess jess  140 Oct 24 13:55 vars.tf +-rw-r--r-- 1 jess jess  369 Oct 24 13:56 main.tf +-rw-rw-r-- 1 jess jess 3821 Oct 24 13:56 terraform.tfstate.1603562212.backup +-rw-rw-r-- 1 jess jess 3827 Oct 24 13:56 terraform.tfstate +``` + +To update your production cluster, start with a different name that is better suited for this version: + + +``` +resource "kubernetes_namespace" "upgrade-minikube-namespace" { +  metadata { +        name = var.namespace +  } +} +``` + +#### Smoothing the rough edges + +After that change, you must run the `terraform state mv` command (as referenced in the large TODO note). But first, run `state list` to see what you're working with: + + +``` +$ terraform state list +helm_release.local +Kubernetes_namespace.1-minikube-namespace +``` + +The namespace is still set in the state as `1-minikube-namespace`, and that's the state you need to move. This can be done by ensuring you have the new and old resource names, then running the `terraform state mv` command. But before that, you must switch back to 0.11, using tfenv to make those changes, because this was deployed using Terraform 0.11, and 0.12 doesn't recognize the numbers at the start of the resource name (as the TODO says). You'll have to revert all the code changes the Terraform upgrade made except for the resource name change: + +**main.tf** + + +``` +provider "kubernetes" { +  config_context_cluster   = "${var.cluster}" +} + +resource "kubernetes_namespace" "upgrade-minikube-namespace" { +  metadata { +        name = "${var.namespace}" +  } +} + +provider "helm" { +  kubernetes { +        config_context_cluster   = "${var.cluster}" +  } +} +resource "helm_release" "local" { +  name          = "buildachart" +  chart         = "./buildachart" +} +``` + +**Vars.tf** + + +``` +variable "namespace" { +  type  = "string" +  default = "helloworld" +} + +variable "cluster" { +  type  = "string" +  default = "minikube" +} +``` + +Once the changes are back in place, switch tfenv back to version 0.11, and run the `state mv` command: + + +``` +$ tfenv use 0.11.15-oci +Switching default version to v0.11.15-oci +Switching completed +jess@Athena:~/terraform_doc$ terraform state mv 'kubernetes_namespace.1-minikube-namespace' 'kubernetes_namespace.upgrade-minikube-namespace' +Moved kubernetes_namespace.1-minikube-namespace to kubernetes_namespace.upgrade-minikube-namespace +``` + +### Final steps + +After this is complete, change tfenv back to version 0.12, and then remove your `versions.tf` file to make sure the conversion completes. If you don't remove this file, you'll get an error message: + + +``` +$ terraform 0.12upgrade +Error: Module already upgraded + +  on versions.tf line 3, in terraform: +   3:  required_version = ">= 0.12" + +The module in directory . has a version constraint that suggests it has +already been upgraded for v0.12. If this is incorrect, either remove this +constraint or override this heuristic with the -force argument. Upgrading a +module that was already upgraded may change the meaning of that module. +``` + +Remove the file and run the command: + + +``` +$ terraform 0.12upgrade + +This command will rewrite the configuration files in the given directory so +that they use the new syntax features from Terraform v0.12, and will identify +any constructs that may need to be adjusted for correct operation with +Terraform v0.12. [...] + +Would you like to upgrade the module in the current directory? +  Enter a value: yes + +\----------------------------------------------------------------------------- + +Upgrade complete! +``` + +#### Test the conversion with another deployment + +Test your new conversion by re-running your `init`, `plan`, and `apply` commands (I omitted chunks of the output in these snippets): + + +``` +$ terraform init + +Initializing the backend... +Initializing provider plugins... +[...] +Terraform has been successfully initialized! + +$ terraform plan +Refreshing Terraform state in-memory prior to plan... +The refreshed state will be used to calculate this plan, but will not be +persisted to local or remote state storage. + +helm_release.local: Refreshing state... [id=buildachart] +kubernetes_namespace.upgrade-minikube-namespace: Refreshing state... [id=helloworld] + +\------------------------------------------------------------------------ + +No changes. Infrastructure is up-to-date + +$ terraform apply +helm_release.local: Refreshing state... [id=buildachart] +kubernetes_namespace.upgrade-minikube-namespace: Refreshing state... [id=helloworld] + +Apply complete! Resources: 0 added, 0 changed, 0 destroyed. +``` + +As this shows, once everything was preconfigured and the state moved and reapplied during the conversion, no other changes were made because the infrastructure is in place. + +### Final thoughts + +Code and application upgrades are hard to do, especially in a live production environment. This is very true when converting from Terraform 0.11 to 0.12. I've done this on a large scale, and it involved extensive planning over a two-week timeframe. + +If you're going to do this in your production environment, make sure you: + + * Start by removing any resources or modules with prepended numbers. + * Move the state before running the upgrade. + * Keep your upgraded Terraform files in a forked repo for safety. + + + +I hope this article helps you move forward more quickly and easily than I did. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/update-terraform + +作者:[Jessica Cherry][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/cherrybomb +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_lead-steps-measure.png?itok=DG7rFZPk (Green graph of measurements) +[2]: https://opensource.com/article/20/7/terraform-kubernetes +[3]: https://github.com/tfutils/tfenv +[4]: https://opensource.com/article/20/3/helm-kubernetes-charts +[5]: https://opensource.com/article/20/11/tfenv +[6]: http://www.terraform.io/downloads.html diff --git a/sources/tech/20201117 My top 7 Rust commands for using Cargo.md b/sources/tech/20201117 My top 7 Rust commands for using Cargo.md new file mode 100644 index 0000000000..14f6672be1 --- /dev/null +++ b/sources/tech/20201117 My top 7 Rust commands for using Cargo.md @@ -0,0 +1,99 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (My top 7 Rust commands for using Cargo) +[#]: via: (https://opensource.com/article/20/11/commands-rusts-cargo) +[#]: author: (Mike Bursell https://opensource.com/users/mikecamel) + +My top 7 Rust commands for using Cargo +====== +Spend some time investigating Rust's package manager, Cargo. +![Person drinking a hot drink at the computer][1] + +I've been using Rust for a little over six months now. I'm far from an expert, but I have stumbled across many, many gotchas and learned many, many things along the way; things that I hope will be of use to those who are learning what is easily my favourite programming language. + +This is the third article in my miniseries for Rust newbs like me. You can find my other excursions into Rust in: + + * [My top 7 keywords in Rust][2] + * [My top 7 functions in Rust][3] + + + +I plan to write more, and this article is about Rust's package manager, [Cargo][4]. I'm ashamed to admit that I don't use Cargo's power as widely as I should, but researching this article gave me a better view of its commands' capabilities. In fact, I wasn't even aware of some of the options available until I started looking in more detail. + +For this list of my top seven Cargo commands, I'll assume you have basic familiarity with Cargo—that you have it installed, and you can create a package using `cargo new `, for instance. I could have provided more commands (there are many options!), but here are my "lucky 7." + + 1. **cargo help <command>:** You can always find out more about a command with the `--help` option. The same goes for Cargo itself: `cargo --help` will give you a quick intro to what's out there. To get more information on a command (more like a man page), you can try using the command `new`. For instance, `cargo help new` will give extended information about `cargo new`. This behaviour is pretty typical for command-line tools, particularly in the Linux/Unix world, but it's very expressively implemented for Cargo, and you can gain lots of quick information with it. + + 2. **cargo build --bin <target>:** What happens when you have multiple .rs files in your package, but you want to build just one of them? I have a package called `test-and-try` that I use for, well, testing and trying functionality, features, commands, and crates. It has around a dozen different files in it. By default, `cargo build` will try to build _all_ of them, and as they're often in various states of repair (some of them generating lots of warnings, some of them not even fully compiling), this can be a real pain. Instead, I place a section in my `Cargo.toml` file for each one like this: [code] + +[[bin]] +name = "warp-body" +path = "src/warp-body.rs" + +[/code] I can then use `cargo build --bin warp-body` to build _just_ this file (and any dependencies). I can then run it with a similar command: `cargo run --bin warp-body`. + + 3. **cargo test:** I have an admission; I am not as assiduous about creating automatic tests in my Rust code as I ought to be. This is because I'm currently mainly writing proof of concept rather than production code, and also because I'm lazy. Maybe changing this behaviour should be a New Year's resolution, but when I _do_ get round to writing tests, Cargo is there to help me (as it is for you). All you need to do is add a line before the test code in your .rs file: [code]`#[cfg(test)]`[/code] When you run `cargo test`, Cargo will "automagically" find these tests, run them, and tell you if you have problems. As with many of the commands here, you'll find much more information online, but it's particularly worth familiarising yourself with the basics of this capability in the relevant [Rust By Example section][5]. + + 4. **cargo search <query>:** This is one of the commands that I didn't even know existed until I started researching this article—and which would have saved me so much time over the past few months if I'd known about it. It searches [Crates.io][6], Rust's repository of public (and _sometimes_ maintained) packages and tells you which ones may be relevant. (You can specify a different repository if you want, with the intuitively named `--registry` option.) I've recently been doing some work on network protocols for non-String data, so I've been working with Concise Binary Object Representation ([CBOR][7]). Here's what happens if I use `cargo search`: + +![Cargo search output][8] + +(Mike Bursell, [CC BY-SA 4.0][9]) + +This is great! I can, of course, also combine this command with tools like grep to narrow down the search yet further, like so: `cargo search cbor --limit 70 | grep serde`. + + 5. **cargo tree:** Spoiler alert: this one may scare you. You've probably noticed that when you first build a new package, or when you add a new dependency, or just do a `cargo clean` and then `cargo build`, you see a long list of crates printed out as Cargo pulls them down from the relevant repositories and compiles them. How can you tell ahead of time, however, what will be pulled down and what version it will be? More importantly, how can you know what other dependencies a new crate has pulled into your build? The answer is `cargo tree`. Just to warn you: For any marginally complex project, you can expect to have a _lot_ of dependencies. I tried `cargo tree | wc -l` to count the number of dependent crates for a smallish project I'm working on and got an answer of 350! I tried providing an example, but it didn't display well, so I recommend that you try it yourself—be prepared for lots of output! + + 6. **cargo clippy:** If you try running this and it doesn't work, that's because I cheated a little with these last two commands: you may have to install them explicitly (depending on your setup). For this one, run `cargo install clippy`—you'll be glad you did. Clippy is Rust's linter; it goes through your code, looking at ways to reduce and declutter it by removing or changing commands. I try to run `cargo clippy` before every `git commit`—partly because the Git repositories I tend to commit to have automatic actions to reject files that need linting, and partly to keep my code generally more tidy. Here's an example: + +![Cargo clippy output][10] + +(Mike Bursell, [CC BY-SA 4.0][9]) + +Let's face it; this isn't a major issue (though clippy will find errors, too, if you run it on non-compiling code), but it's an easy fix, so you might as well deal with it—either by removing the code or prefixing the variable with an underscore. As I plan to use this variable later but haven't yet implemented the function to consume it, I will perform the latter fix. + + 7. **cargo readme:** While it's not the most earth-shattering of commands, this is another that is very useful (and that, as with `cargo clippy`, you may need to install explicitly). If you add the relevant lines to your .rs files, you can output README files from Cargo. For instance, I have the following lines at the beginning of my main.rs file: + +![Cargo readme input][11] + +(Mike Bursell, [CC BY-SA 4.0][9]) + +I'll leave the `cargo readme` command's output as an exercise for the reader, but it's interesting to me that the Licence (or "License," if you must) declaration is added. Use this to create simple documentation for your users and make them happy with minimal effort (always a good approach!). + + + + +I've just scratched the surface of Cargo's capabilities in this article; all the commands above are actually way more powerful than I described. I heartily recommend that you spend some time investigating Cargo and finding out how it can make your life better. + +* * * + +_This article was originally published on [Alice, Eve, and Bob][12] and is reprinted with the author's permission._ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/commands-rusts-cargo + +作者:[Mike Bursell][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mikecamel +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer) +[2]: https://opensource.com/article/20/10/keywords-rust +[3]: https://opensource.com/article/20/10/rust-functions +[4]: https://doc.rust-lang.org/cargo/ +[5]: https://doc.rust-lang.org/stable/rust-by-example/testing/unit_testing.html +[6]: https://crates.io/ +[7]: https://cbor.io/ +[8]: https://opensource.com/sites/default/files/uploads/cargo-search-output-5.png (Cargo search output) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://opensource.com/sites/default/files/uploads/cargo-clippy-output-1.png (Cargo clippy output) +[11]: https://opensource.com/sites/default/files/uploads/cargo-readme-input.png (Cargo readme input) +[12]: https://aliceevebob.com/2020/11/03/my-top-7-cargo-rust-commands/ diff --git a/sources/tech/20201118 Apply the Scientific Method to agile development.md b/sources/tech/20201118 Apply the Scientific Method to agile development.md new file mode 100644 index 0000000000..983e15a972 --- /dev/null +++ b/sources/tech/20201118 Apply the Scientific Method to agile development.md @@ -0,0 +1,170 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Apply the Scientific Method to agile development) +[#]: via: (https://opensource.com/article/20/11/hypothesis-driven-development) +[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzic) + +Apply the Scientific Method to agile development +====== +Hypothesis-driven development allows constant analysis of new +information to implement new insights (and deliver new customer value) +on an ongoing basis. +![Science lab with beakers][1] + +> "The only way it’s all going to go according to plan is if you don’t learn anything." —Kent Beck + +Experimentation is the foundation of the scientific method, which is a systematic means of exploring the world around us. But experimentation is not only reserved for the field of scientific research. It has a central place in the world of business too. + +Most of us are by now familiar with the business methodology called [Minimum Viable Product (MVP)][2]. This Minimum Viable Product is basically just an experiment. By building and launching MVPs, business operations are engaging in a systematic means of exploring the markets. + +If we look at market leaders today, we learn that they’re not doing projects anymore; the only thing they’re doing is experiments. Customer discovery and lean strategies are only used to test assumptions about the markets. Such an approach is equivalent to Test-Driven Development (TDD), which is the process we are intimately familiar with. In TDD, we write the hypothesis (the test) first. We then use that test to guide our implementation. Ultimately, product or service development is no different than TDD—we first write a hypothesis, then that hypothesis guides our implementation, which serves as measurable validation of the hypothesis. + +### Information discovery + +Back in the pre-agile days, requirements gathering was an important activity that used to always kick off the project. A bunch of subject matter experts (SMEs) would get assigned to the project and be tasked with gathering the requirements. After a prolonged period of upfront information discovery, the gathered requirements got reviewed and, if agreed upon, signed off and frozen. No more changes allowed! + +Back then, it seemed a perfectly reasonable thing to do. The fly in the ointment always showed up once the build phase commenced. Sooner or later, as the project progresses, new information comes to light. Suddenly, what we initially viewed as incontrovertible truth gets challenged by the newly acquired information and evidence. + +But the clincher was in the gated phases. Remember, once requirements get signed off, they get frozen—no more changes, no scope creep allowed—which means newly obtained market insights get willfully ignored. + +Well, that’s kind of foolish neglect. The newly emerging evidence could be of critical importance to the health of the business operation. Can we afford to ignore it? Absolutely not! We have no choice but to embrace the change. + +After a number of prominent fiascos in the industry, many software development projects switched to the agile approach. With agile, information discovery is partial. With agile, we never claim that we have gathered the requirements and are now ready to implement them. We discover information and implement it on an ongoing basis. We do it in tiny steps, keeping our efforts interruptible and steerable at all times. + +### How to leverage the scientific method + +The scientific method is empirical and consists of the following steps: + +Step 1: Make and record careful observations. + +Step 2: Perform orientation with regard to observed evidence. + +Step 3: Formulate a hypothesis, including measurable indicators for hypothesis evaluation. + +Step 4: Design an experiment that will enable testing of the hypothesis. + +Step 5: Conduct the experiment (i.e., release the partial implementation). + +Step 6: Collect the telemetry that results from running the experiment. + +Step 7: Evaluate the results of the experiment. + +Step 8: Accept or reject the hypothesis. + +Step 9: Return to Step 1. + +### How to formulate a hypothesis + +When switching from project to experiments, the traditional user story framework (As a__I want to__so that__) has proven insufficient. The traditional user story format does not expose the signals needed in order to evaluate the outcomes. Instead, the old school user story format is focused on outputs. + +The problem with doing an experiment without first formulating a hypothesis is that there is a danger of introducing a bias when interpreting the results of an experiment. Defining the measurable signals that will enable us to corroborate our hypothesis must be done before we conduct the experiment. That way, we can remain completely impartial when interpreting the results of the experiment. We cannot be swayed by wishful thinking. + +The best way to proceed with formulating a hypothesis is to use the following format: + +We believe [this capability] will result in [this outcome]. We will have the confidence to proceed when [we see a measurable signal]. + +### Working software is not a measure of progress + +Output-based metrics and concepts (definition of "done," acceptance criteria, burndown charts, and velocity) are good for detecting working software but fall miserably when it comes to detecting if working software adds value. + +"Done" only matters if it adds value. Working software that doesn’t add value cannot be declared "done." + +### The forgotten column + +Technology-centric projects break activities down into four columns: + + 1. Backlog of ideas + 2. Analysis + 3. In progress + 4. Shipped + + + +The above structure is based on the strong belief that all software that works is valuable. That focus must now shift toward continuously delivering real value, something that serves customers. Agilists value outcomes (value to the customers) over features. + +The new breakdown for hypothesis-driven development looks something like this: + +Ideas Backlog + +| + +Analysis + +| + +In Progress + +| + +Shipped + +| + +Achieved Desired Outcome + +---|---|---|---|--- + +Hypothesis 11 + +Hypothesis 12 + +Hypothesis 13 + +Hypothesis 14 + +Hypothesis 15 + +Hypothesis 16 + +Hypothesis 17 + +Hypothesis 18 + +Hypothesis 19 + +| + +Hypothesis 20 + +Hypothesis 21 + +| + +Hypothesis 26 + +| + +Hypothesis 2 + +Hypothesis 5 + +Hypothesis 9 + +Hypothesis 10 + +| + +Hypothesis 1 + +Hypothesis 5 + +All eyes must remain on the Achieved Desired Outcome column. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/hypothesis-driven-development + +作者:[Alex Bunardzic][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/alex-bunardzic +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers) +[2]: https://en.wikipedia.org/wiki/Minimum_viable_product#:~:text=A%20minimum%20viable%20product%20%28MVP,feedback%20for%20future%20product%20development.&text=The%20concept%20can%20be%20used,developments%20of%20an%20existing%20product. diff --git a/sources/tech/20201118 Cloud control vs local control- What to choose for your home automation.md b/sources/tech/20201118 Cloud control vs local control- What to choose for your home automation.md new file mode 100644 index 0000000000..b1d86bd080 --- /dev/null +++ b/sources/tech/20201118 Cloud control vs local control- What to choose for your home automation.md @@ -0,0 +1,134 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Cloud control vs local control: What to choose for your home automation) +[#]: via: (https://opensource.com/article/20/11/cloud-vs-local-home-automation) +[#]: author: (Steve Ovens https://opensource.com/users/stratusss) + +Cloud control vs local control: What to choose for your home automation +====== +Cloud may be more convenient, but local control gives you more privacy +and other options in your Home Assistant ecosystem. +![clouds in windows][1] + +There are a lot of factors to consider when investing in a home automation ecosystem. In my first article in this series, I explained [why I picked Home Assistant][2], and in this article, I'll explain some of the foundational issues and technologies in home automation, which may influence how you approach and configure your Internet of Things (IoT) devices. + +### Cloud connectivity + +Most devices you can buy today are tied to some type of cloud service. While the cloud brings a certain level of convenience, it also opens a host of problems. For starters, there are privacy issues related to a company having access to your personal habits—when you are home, what shows you watch, what time you go to bed, etc. Although most people are not as concerned about these issues as I am, privacy should still be a consideration, even if it is a small one. + +Cloud access also creates issues around being reliant on something outside your control. In 2019, Sonos came under fire for [remotely bricking][3] older smart speakers. Speakers usually continue to work for years after their warranty ends; in fact, they usually function until they physically break. There's also the case of Automatic, which produced a cloud-based car tracker. When it announced in May 2020 that it would be [shutting down][4] its services, it advised customers to "please discard your adapter by following standard electronic recycling procedures." + +Being dependent on a third-party provider for critical functionality can come back to bite you. [IFTTT][5], a popular service for programming events based on external conditions, recently altered its free plan's [terms and conditions][6] to severely limit the number of events you can create—from an unlimited number to three. This is even though IFTTT charges device manufacturers for certification with its system, which allows products like [Meross smart bulbs][7] to proudly display their compatibility with IFTTT. + +![Meross screenshot from Amazon][8] + +(Amazon screenshot by Steve Ovens, [CC BY-SA 4.0][9]) + +Some of these decisions are purely financial, but there are more than a few anecdotal cases where a company blocks a person's access to a device they purchased simply because they [did not like what the user said][10] about them. How crazy is that? + +Another consideration with cloud connectivity is a device's responsivity if its signals must travel from your home to a cloud server (which may be halfway around the world) and then back to the device. This can lead to a two-second (or more) delay on any action. For some people, this is not a deal-breaker. For others, that delay is unbearable. + +Finally, what happens if there is an internet outage? While most modern home internet connections are quite reliable, they do happen. [Some large][11], well-known cloud [service providers][12] have experienced outages this year. Are you OK trading convenience for possibly having your automations break and losing control of your smart devices for periods of time? + +### Local control + +There are several ways you can regain control over your smart devices. Commercially, you could try something like [Hubitat][13], which is a proprietary platform that emphasizes local control. I have no experience with these devices, as I don't like to rely on an intermediary. + +In my home, I standardized on WiFi (although I may branch out to [Zigbee][14] in the future) and [Home Assistant][15]. Using WiFi means I need to buy or make my devices based on their compatibility with alternative open source firmware, such as [Tasmota][16] or [ESPHome][17]. I admit that neither of these options is "plug-and-play friendly" unless you buy devices from sources like [Shelly][18], which is very friendly to the community, or [CloudFree][19], which has Tasmota installed by default. + +(As a small aside, I have both flashed my own devices and purchased them from CloudFree. There are some savings with the DIY approach, but I buy pre-flashed devices for my father's house because this eliminates a lot of hassle.) + +I won't go into more detail about alternative firmware, how to flash it, and so on. I simply want to introduce you to the idea that there are options for local control. + +### Achieving local control with MQTT + +A local control device probably uses either a direct [API][20] call, where Home Assistant talks directly to the device, or Message Queuing Telemetry Transport ([MQTT][21]). + +MQTT is one of the most widely used protocols for local IoT communication. I'll share some of the basics, but the Hook Up has an [in-depth video][22] you can watch if you want to learn more, and HiveMQ has an [entire series][23] on MQTT essentials. + +MQTT uses three components for communication. The first, the **sender**, is the component that triggers the action. The second, the **broker**, is kind of like a bulletin board where messages are posted. The final component is the **device** that will perform the action. This process is called the _publish-subscribe_ model. + +Say you have a button on the wall that you want to use to turn on the projector, lower the blinds, and turn on a fan. The button (sender) posts the _message_ **ON** to a specific section of the broker, called a _topic_. The topic might be something like `/livingroom/POWER`. The fan, the projector, and the blinds _subscribe_ to this topic. When the message **ON** is posted to the topic, all of the devices activate their respective functions, turning on the projector, lowering the blinds, and starting the fan. + +Unlike a message board, messages have different Quality of Service (QoS) states. The HiveMQ website has a good explanation of the [three QoS levels][24]. In short: + + * **QoS 0:** The message is sent to the broker in a fire-and-forget way. No attempt is made to verify that the broker received the message. + + + +![MQTTT QoS 0][25] + +(© 2015 [HiveMQ][24], reused with permission) + + * **QoS 1**: The message is posted, and the broker replies once the message is received. Multiple messages can be sent before the broker replies. For example, if you are trying to raise the projector's brightness, multiple brightness bars may be inadvertantly adjusted before the broker tells the sender to stop publishing messages. + + + +![MQTTT QoS 1][26] + +(© 2015 [HiveMQ][24], reused with permission) + + * **QoS 2:** This is the slowest but safest level. It guarantees that the message is received only once. Similar to TCP, if a message is lost, the sender will resend the message. + + + +![MQTTT QoS 2][27] + +(© 2015 [HiveMQ][24], reused with permission) + +In addition, MQTT has a **retain** flag that can be enabled on the messages, but it is not set by default. Going back to the bulletin board analogy, it's like if someone posts a message to a bulletin board, but another person walks up to the board, takes the message down, reads it, and throws it away. If a third person looks at the bulletin board five minutes later, they would have no knowledge of the message. However, if the **retain** flag is set to true, it's like leaving the message pinned on the board until a new message is received. This means that no matter when people come to read messages, they will all know the latest message. + +In home automation terms, whether or not the **retain** flag is set depends completely on the use case. + +In this series, I will use Home Assistant's [Mosquitto MQTT broker][28] add-on. Most of my devices use MQTT; however, I do have a couple of non-critical Tuya devices that require a cloud account. I may replace them with locally controllable ones in the future. + +### Wrapping up + +Home Assistant is a large, wonderful piece of software. It is complex in some areas, and it will help you to be familiar with these fundamental technologies when you need to troubleshoot and coordinate your setup. + +In the next article, I will talk about the "big three" wireless protocols that you are likely to encounter in smart devices: Zigbee, Z-Wave, and WiFi. Don't worry—I'm almost done with the underlying theories, and soon I'll get on with installing Home Assistant. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/cloud-vs-local-home-automation + +作者:[Steve Ovens][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/stratusss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud-windows-building-containers.png?itok=0XvZLZ8k (clouds in windows) +[2]: https://opensource.com/article/20/11/home-assistant +[3]: https://www.bbc.com/news/technology-51768574 +[4]: https://www.cnet.com/roadshow/news/automatic-connected-car-service-dead-may-coronavirus/ +[5]: https://ifttt.com/ +[6]: https://ifttt.com/plans +[7]: https://www.amazon.ca/meross-Dimmable-Equivalent-Compatible-Required/dp/B07WN2J3C7 +[8]: https://opensource.com/sites/default/files/uploads/ifttt_add.png (Meross screenshot from Amazon) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://www.techrepublic.com/article/iot-company-bricks-customers-device-after-negative-review/ +[11]: https://www.theverge.com/2020/9/28/21492688/microsoft-outlook-office-teams-azure-outage-down +[12]: https://www.cnn.com/2020/08/30/tech/internet-outage-cloudflare/index.html +[13]: https://hubitat.com/ +[14]: https://zigbeealliance.org/ +[15]: https://www.home-assistant.io/ +[16]: https://tasmota.github.io/docs/ +[17]: https://esphome.io/ +[18]: https://shelly.cloud/ +[19]: https://cloudfree.shop/ +[20]: https://en.wikipedia.org/wiki/API +[21]: https://en.wikipedia.org/wiki/MQTT +[22]: https://www.youtube.com/watch?v=NjKK5ab0-Kk +[23]: https://www.hivemq.com/tags/mqtt-essentials/ +[24]: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/ +[25]: https://opensource.com/sites/default/files/uploads/ha-config8-qos0.png (MQTTT QoS 0) +[26]: https://opensource.com/sites/default/files/uploads/ha-config8-qos1.png (MQTTT QoS 1) +[27]: https://opensource.com/sites/default/files/uploads/ha-config9-qos2.png (MQTTT QoS 2) +[28]: https://mosquitto.org/ diff --git a/sources/tech/20201118 Day 8- Start with something that works.md b/sources/tech/20201118 Day 8- Start with something that works.md new file mode 100644 index 0000000000..3ba5299dbd --- /dev/null +++ b/sources/tech/20201118 Day 8- Start with something that works.md @@ -0,0 +1,66 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Day 8: Start with something that works) +[#]: via: (https://jvns.ca/blog/2020/11/18/how-to-do-hard-projects--start-with-something-that-works/) +[#]: author: (Julia Evans https://jvns.ca/) + +Day 8: Start with something that works +====== + +Today at RC I’m a little stuck so here’s a very short reflection on how to do hard programming problems :) + +I was talking to a friend yesterday about how to do programming projects that are a bit out of your comfort zone, and I realized that there’s a pattern to how I approach new-to-me topics! Here I’m especially thinking about little side projects where you want to get the thing done pretty efficiently. + +When I start on a new project using some technology I haven’t worked with before, I often: + + 1. Find some code on the internet that already does something a little like what I want + 2. Incrementally modify that code until it does what I want, often completely changing everything about the original code in the process + + + +Here are a couple of quick thoughts about this process: + +### it’s important that the initial code _works_ + +Often when I’m out looking for examples, I’ll find a lot of code that I can’t get to work quickly, often because the code is kind of old and things have changed since then. Whenever possible, I try to find code that I can get to work on my computer pretty quickly. + +It’s been pretty helpful to me to give up relatively quickly on code that I can’t get to work right away and look for another example – often there is something out there that’s more recent and that I can get to work more quickly! + +### you have to be able to incrementally change the code into what you want + +Today I’ve been working with some neural network code, and one thing I’m really struggling with for the last couple of days is that I find it pretty easy to find somewhat relevant Jupyter notebooks that do RNN things, and pretty hard to modify those examples to do something closer to what I want. They keep breaking and I then don’t know how to fix them. + +Last week I was working on a Rails app, which I think is something that’s very easy to incrementally change into the program you want: `rails new` gives you a webserver that does almost nothing, but it works! And then you just need to change it one tiny step at a time into the website you want to build. + +### examples of “something that works” + + * If you want to write a window manager, [tinywm][1] is a window manager in 50 lines of C! + * this tiny kernel written in Rust that does nothing was a fun starting point for an operating system (probably it’s not a good starting point today) + * `rails new`, like I talked about above + * I love that projects let you “view source” on the backend of any Glitch project + * Jupyter notebooks, like [these great NLP tutorials by Allison Parrish][2] + + + +### that’s all! + +I think little starting points like this are so important and can be really magical. Finding the right starting point can be hard, but when I find a good one it makes everything so much easier! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/18/how-to-do-hard-projects--start-with-something-that-works/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: http://incise.org/tinywm.html +[2]: https://twitter.com/aparrish/status/876117075567284225 diff --git a/sources/tech/20201118 Secure your containers with SELinux.md b/sources/tech/20201118 Secure your containers with SELinux.md new file mode 100644 index 0000000000..1f63e033cc --- /dev/null +++ b/sources/tech/20201118 Secure your containers with SELinux.md @@ -0,0 +1,275 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Secure your containers with SELinux) +[#]: via: (https://opensource.com/article/20/11/selinux-containers) +[#]: author: (Mike Calizo https://opensource.com/users/mcalizo) + +Secure your containers with SELinux +====== +Hack your system to understand why it's important to configure SELinux +to be your first line of container defense. +![Three closed doors][1] + +When things aren't working correctly in your Linux environment, the easiest thing to do is disable Security-Enhanced Linux ([SELinux][2]). Things suddenly begin to work, and you forget about it—but this is a common pitfall that means you've lost a very powerful security tool. + +Threats are rising alongside the rise of containers, microservices, and distributed architecture. This is due to an old, well-known issue: velocity. The advantage of containers is that they enable you to move fast, do more, and change quickly. This means container adoption has gone off the roof, but the speed it affords also means you will encounter more issues and vulnerabilities. This happens naturally when you're doing more things faster and quicker. + +### How to mitigate threats + +As Sun Tzu said, "The wise warrior avoids the battle." This quote really resonates when it comes to containers' basic defense. To avoid problems (battles), make sure that your container host is secure and that you can use SELinux as your first line of defense. + +SELinux is an open source project released in 2000 and integrated into the Linux kernel in 2003. According to [Red Hat's explainer][3], "SELinux is a security architecture for [Linux systems][4] that allows administrators to have more control over who can access the system. It was originally developed by the United States National Security Agency (NSA) as a series of patches to the [Linux kernel][5] using Linux Security Modules (LSM)." + +### Get started + +When you think about containers, the first thing that probably comes into mind is [Docker][6]. Docker started a container adoption revolution after it emerged in 2013. It is one of the main reasons that containers exploded in popularity, but as mentioned above, the high level of adoption increased users' vulnerability to security risks. + +Before you can secure your Docker containers with SELinux, you need to set some things up. + +#### Prerequisites: + + * CentOS 8/RHEL 8 installed and configured + * Docker CE installed and configured + * Two accounts created: root and non-root (`mcalizo` in the examples below) + + + +If you need to set up Docker on your RHEL 8/CentOS 8 server, you can follow these [instructions][7]. If you're running RHEL 8, you need to remove the pre-installed Podman and runc packages before beginning. + +First, make sure SELinux is enabled: + + +``` +[mcalizo@Rhel82 ~]$ sestatus +SELinux status:                 enabled +SELinuxfs mount:                /sys/fs/selinux +SELinux root directory:         /etc/selinux +Loaded policy name:             targeted +Current mode:                   enforcing +Mode from config file:          enforcing +Policy MLS status:              enabled +Policy deny_unknown status:     allowed +Memory protection checking:     actual (secure) +Max kernel policy version:      31 +[mcalizo@Rhel82 ~]$ +``` + +Then, verify your OS version and that Docker is running. Log in as root and run: + + +``` +[root@rhel82 ~]# cat /etc/redhat-release +Red Hat Enterprise Linux release 8.2 (Ootpa) +[root@rhel82 ~]# + +[root@rhel82 ~]# systemctl status docker +● docker.service - Docker Application Container Engine +   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) +   Active: active (running) since Wed 2020-10-28 19:10:14 EDT; 15s ago +     Docs: + Main PID: 30768 (dockerd) +    Tasks: 8 +   Memory: 39.0M +   CGroup: /system.slice/docker.service +           └─30768 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock + +Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.889602941-04:00" level=error msg="> +Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903413613-04:00" level=warning msg> +Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903427451-04:00" level=warning msg> +Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903538271-04:00" level=info msg="L> +Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.132060506-04:00" level=info msg="D> +Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.308943088-04:00" level=info msg="L> +Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319438549-04:00" level=info msg="D> +Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319570298-04:00" level=info msg="D> +Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.333419209-04:00" level=info msg="A> +Oct 28 19:10:14 rhel82.home.labs.com systemd[1]: Started Docker Application Container Engine +``` + +Check your Docker version: + + +``` +[root@rhel82 ~]# docker --version +Docker version 19.03.13, build 4484c46d9d +``` + +### Hack your host + +One of the best ways to understand a problem is to experience it. So, I'll show you how easy it is to inject malicious code into a Docker host if your security is not set up properly. + +To be able to do something bad on the Docker host, the malicious non-root user (`mcalizo` in this tutorial) must be part of the group that can instantiate Docker containers. + +First, confirm what group the `mcalizo` user belongs to: + + +``` +[root@Rhel82 ~]# groups mcalizo +mcalizo : mcalizo +``` + +The output shows that `mcalizo` belongs only to its own group. This means `mcalizo` can't instantiate Docker containers and will get this error if it tries: + + +``` +[mcalizo@Rhel82 ~]$ docker run -it --rm centos:latest /bin/sh +docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied. +See 'docker run --help'. +``` + +To allow `mcalizo` to instantiate the container, add the user to the `docker` group: + + +``` +[root@Rhel82 ~]# usermod -G docker -a mcalizo +[root@Rhel82 ~]# groups mcalizo +mcalizo : mcalizo docker +``` + +Next, deploy a `fedora:latest` container and log into the instantiated container to explore it: + + +``` +[mcalizo@Rhel82 ~]$ docker run -it --rm fedora:latest /bin/sh +Unable to find image 'fedora:latest' locally +latest: Pulling from library/fedora +ee7e89337106: Pull complete +Digest: sha256:b9ec86d36fca7b1d3de39cd7c258e8d90c377d312c21a7748071ce49069b8db4 +Status: Downloaded newer image for fedora:latest +sh-5.0# cat /etc/redhat-release +Fedora release 33 (Thirty Three) +``` + +While you're logged into the newly created container, you can see you are automatically logged in as root: + + +``` +sh-5.0# whoami +root +sh-5.0# +``` + +As `root` user, you can do anything in this container, which means you can exploit the container host and do a lot of damage. Because you can instantiate a container, you can do things to the host even if you are not part of the host's sudoers account. + +Exit the container you just created, and create a new container to demonstrate the exploit: + + +``` +[mcalizo@Rhel82 ~]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash +[root@131043f2e306 /]# +``` + +The [-v option][8] mounts the Docker host's `/` directory to the container under the `/exploit` directory: + + +``` +[root@131043f2e306 /]#ls exploit/ +bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var +``` + +Because it is mounted, you can do _anything_ on the Docker host. For example, you can delete files, edit specific configurations to harm the system, or even install a Trojan horse application or other malware to steal important information. + +### Why does this happen? + +You may be wondering why this is possible since SELinux is in enforcing mode. Dig deeper into SELinux to see where things went wrong. + +Verify that SELinux has a [Docker context][9]: + + +``` +[mcalizo@Rhel82 ~]$ ps -eZ | grep docker +system_u:system_r:container_runtime_t:s0 30768 ? 00:00:04 dockerd +[mcalizo@Rhel82 ~]$ +``` + +As expected, it does. This means SELinux manages the Docker daemon. Inspect the Docker daemon to see if SELinux is enabled by default: + + +``` +[mcalizo@Rhel82 ~]$ docker info | grep Security -A3 + Security Options: +  seccomp +   Profile: default + Kernel Version: 4.18.0-193.el8.x86_64 +``` + +SELinux is _not_ enabled by default. This is the problem! To fix it, enable SELinux to control and manage Docker by updating or creating the file `/etc/docker/daemon.json` as [documented here][10] (you must have root access to do this): + + +``` +[root@Rhel82 ~]# cat /etc/docker/daemon.json +{ +  "selinux-enabled": true +} +[root@Rhel82 ~]# +[root@Rhel82 ~]# systemctl restart docker +``` + +After creating or updating the file and restarting Docker, you should see that SELinux support is enabled in the Docker daemon: + + +``` +[root@Rhel82 ~]# systemctl restart docker +[mcalizo@Rhel82 root]$ docker info | grep Security -A3 + Security Options: +  seccomp +   Profile: default +  selinux +[mcalizo@Rhel82 root]$ +``` + +While it's still possible to mount a specific filesystem in your Docker host on your Docker container, updating or accessing the file is no longer allowed: + + +``` +[mcalizo@Rhel82 root]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash +[root@ecb5836da1f6 /]# touch /exploit/etc/shadow.sh +touch: cannot touch '/exploit/etc/shadow.sh': Permission denied +[root@ecb5836da1f6 /]# +``` + +### Learn more + +Your first line of defense in the container world depends on how strongly you set up your container hosts' operating system. There are numerous ways to implement Linux security, including options available on the market to augment your security posture. + +SELinux is an additional layer of security that is built into [Linux distributions][11] by default. To take advantage of it and protect your system against compromise, make sure SELinux remains on. + +If you want to learn more, see: + + * [How to install Docker CE on CentOS 8 / RH][7] + * [Docker security cheat sheet][12] + * [dockerd documentation][10] + * [Use volumes documentation][8] + * [What is SELinux?][3] + + + +Few things in the Linux world evoke a strong reaction like SELinux , the security enhancement for... + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/selinux-containers + +作者:[Mike Calizo][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mcalizo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/EDU_UnspokenBlockers_1110_A.png?itok=x8A9mqVA (Three closed doors) +[2]: https://en.wikipedia.org/wiki/Security-Enhanced_Linux +[3]: https://www.redhat.com/en/topics/linux/what-is-selinux +[4]: https://www.redhat.com/en/topics/linux/what-is-linux +[5]: https://www.redhat.com/en/topics/linux/what-is-the-linux-kernel +[6]: https://opensource.com/resources/what-docker +[7]: https://www.linuxtechi.com/install-docker-ce-centos-8-rhel-8/ +[8]: https://docs.docker.com/storage/volumes/ +[9]: https://docs.docker.com/engine/reference/commandline/context/ +[10]: https://docs.docker.com/engine/reference/commandline/dockerd/ +[11]: https://www.redhat.com/en/topics/linux/whats-the-best-linux-distro-for-you +[12]: https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html diff --git a/sources/tech/20201119 Automate your tasks with this Ansible cheat sheet.md b/sources/tech/20201119 Automate your tasks with this Ansible cheat sheet.md new file mode 100644 index 0000000000..4ef4961a33 --- /dev/null +++ b/sources/tech/20201119 Automate your tasks with this Ansible cheat sheet.md @@ -0,0 +1,224 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Automate your tasks with this Ansible cheat sheet) +[#]: via: (https://opensource.com/article/20/11/ansible-cheat-sheet) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +Automate your tasks with this Ansible cheat sheet +====== +Start automating your repetitive tasks by getting to know Ansible's +modules, YAML structure, and more. +![Cheat Sheet cover image][1] + +Ansible is one of the primary tools in the world of [automation and orchestration][2] because of its broad usefulness and flexibility. However, those same traits are the very reason it can be difficult to get started with [Ansible][3]. It isn't a graphical application, and yet it also isn't a scripting or programming language. But like a programming language, the answer to the common question of "what can I do with it?" is "everything," which makes it difficult to know where to begin doing _anything_. + +Here's how I view Ansible: It's an "engine" that uses other people's modules to accomplish complex tasks you describe in a special "pseudo-code" text format called YAML. This means you need to have three things to get started with Ansible: + + 1. Ansible + 2. A repetitive task you want to automate + 3. A basic understanding of YAML + + + +This article aims to help you get started with these three things. + +### Install Ansible + +Part of Ansible's widespread popularity can be attributed to how it lets you (the user) completely ignore what operating system (OS) you're targeting. Generally, you don't have to think about whether your Ansible task will be executed on Linux, macOS, Windows, or BSD. Ansible takes care of the messy platform-specific bits for you. + +However, to _run_ Ansible, you do need to have Ansible installed somewhere. The computer where Ansible is installed is called the _control node_. Any computer that Ansible targets is called a _host_. + +Only the control node needs to have Ansible installed. + +If you're on Linux, you can install Ansible from your software repository with your package manager. + +As yet, Windows is unable to serve as an Ansible control node, although the more progress it makes toward [POSIX][4], the better things look for it, so keep a close watch on Microsoft's [Windows Subsystem for Linux (WSL)][5] product. + +On macOS, you can use a third-party package manager like [Homebrew][6] or [MacPorts][7]. + +### Ansible modules + +Ansible is just an engine. The parts that do 90% of the work are [Ansible modules][8]. These modules are programmed by lots of different people all over the world. Some have become so popular that the Ansible team adopts them and helps maintain them. + +As a user, much of your interaction with Ansible is directed to its modules. Choosing a module is like choosing an app on your phone or computer: you have a task you want done, so you look for an Ansible module that claims to assist. + +Most modules are tied to specific applications. For instance, the [file][9] module helps create and manage files. The [authorized_key][10] module helps manage SSH keys, [Database][11] modules help control and manipulate databases, and so on. + +Part of deciding on a task to offload onto Ansible is finding the module that will help you accomplish it. Ansible plays run _tasks_, and tasks consist of Ansible keywords or Ansible modules. + +### YAML and Ansible + +The YAML text format is a highly structured way to feed instructions to an application, making it almost a form of code. Like a programming language, you must write YAML according to a specific set of syntax rules. A YAML file intended for Ansible is called a _playbook_, and it consists of one or more Ansible _plays_. + +An Ansible play, like YAML, has a very limited structure. There are two kinds of instructions: a _sequence_ and a _mapping_. An Ansible play, as with YAML, always starts with 3 dashes (`---`). + +#### Sequences + +A _sequence_ element is a list. For example, here's a list of penguin species in YAML: + + +``` +\--- +\- Emperor +\- Gentoo +\- Yellow-eyed +\---- +``` + +#### Mapping + +A _mapping_ element consists of two parts: a key and a value. A _key_ in Ansible is usually a keyword defined by an Ansible module, and the value is sometimes Boolean (`true` or `false`) or some choice of parameters defined by the module, or something arbitrary, a variable, depending on what's being set. + +Here's a simple mapping in YAML: + + +``` +\--- +\- Name: "A list of penguin species" +\---- +``` + +#### Sequences and mapping + +These two data types aren't mutually exclusive. + +You can put a sequence into a mapping. In such a case, the sequence is a value for a mapping's key. When placing a sequence into a mapping, you indent the sequence so that it is a "descendent" (or "child") of its key: + + +``` +\--- +\- Penguins: + - Emperor +  - Gentoo +  - Yellow-eyed +\---- +``` + +You can also place mappings in a sequence: + + +``` +\--- +\- Penguin: Emperor +\- Mammal: Gnu +\- Planar: Demon +\---- +``` + +Those are all the rules you need to be familiar with to write valid YAML. + +### Write an Ansible play + +For Ansible plays, whether you use a sequence or a mapping (or a mapping in a sequence, or a sequence in a mapping) is dictated by Ansible or the Ansible module you're using. The "language" of Ansible mostly speaks to configuration options to help you determine how and where your play will run. A quick reference to all Ansible keywords is available in the [Ansible playbook documentation][12]. + +From the list of keywords, you can create an opening for your play. You start with three dashes because that's how a YAML file always starts. Then you give your play a name in a mapping block. You must also define what hosts (computers) you want the play to run on, and how Ansible is meant to reach the computer. + +For this example, I set the host to `localhost`, so the play runs only on _this_ computer, and the connection type to `local` (the default is `ssh`): + + +``` +\--- +\- name: "My first Ansible play" +  hosts: localhost +  connection: local +\---- +``` + +Most of the YAML you'll write in a play is probably configuration options for a specific Ansible module. To find out what instructions a module expects from your Ansible play, refer to that module's documentation. [Modules maintained by Ansible][8] are documented on Ansible's website. + +For this example, I'll use the debug module. + +![Documentation for Ansible debugger module][13] + +On [debug's documentation page][14], three parameters are listed: + + * `msg` is an optional string to print to the terminal. + * `var` is an optional variable, interpreted as a string. This is mutually exclusive with `msg`, so you can use one or the other—not both. + * `verbosity` is an integer you can use to control how verbose this debugger is. Its default is 0, so there is no threshold to pass. + + + +It's a simple module, but the thing to look for is the YAML data type of each parameter. Can you determine from my description whether these parameters are a sequence (a list) or a mapping (a key and value pair)? Knowing what kind of YAML block to use in your play helps you write valid plays. + +Here's a simple "hello world" Ansible play: + + +``` +\--- +\- name: "My first Ansible play" +  hosts: localhost +  connection: local +  tasks: +    - name: "Print a greeting" +      debug: +        msg: "Hello world" +\---- +``` + +Notice that the play contains a `task`. This task is a mapping that contains a sequence of exactly one item. The item in this task is `name` (and its value), the module being used by the task, and a `msg` parameter (along with its value). These are all part of the task mapping, so they're indented to show inheritance. + +You can test this Ansible play by using the `ansible-playbook` command with the `--check` option: + + +``` +$ ansible-playbook --check hello.yaml +PLAY [My first Ansible play] ************************* + +TASK [Gathering Facts] ******************************* +ok: [localhost] + +TASK [Print a greeting] ****************************** +ok: [localhost] => { +    "msg": "Hello world" +} + +PLAY RECAP ******************************************* +localhost: ok=2  changed=0  unreachable=0  failed=0 +``` + +It's verbose, but you can debug the message in your "Print a greeting" task, right where you put it. + +### Testing modules + +Using a new Ansible module is like trying out a new Linux command. You read its documentation, study its syntax, and then try some tests. + +There are at least two other modules you could use to write a "hello world" play: [assert][15] and [meta][16]. Try reading through the documentation for these modules, and see if you can create a simple test play based on what you learned above. + +For further examples of how modules are used to get work done, visit [Ansible Galaxy][17], an open source repository of community-contributed plays. + +### For a quick reference of important Ansible commands, download our [Ansible cheat sheet][18]. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/ansible-cheat-sheet + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [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/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image) +[2]: https://opensource.com/article/20/11/orchestration-vs-automation +[3]: https://opensource.com/resources/what-ansible +[4]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains +[5]: https://docs.microsoft.com/en-us/windows/wsl/install-win10 +[6]: https://opensource.com/article/20/6/homebrew-mac +[7]: https://opensource.com/article/20/11/macports +[8]: https://docs.ansible.com/ansible/2.8/modules/modules_by_category.html +[9]: https://docs.ansible.com/ansible/2.8/modules/file_module.html#file-module +[10]: https://docs.ansible.com/ansible/2.8/modules/authorized_key_module.html#authorized-key-module +[11]: https://docs.ansible.com/ansible/2.8/modules/list_of_database_modules.html +[12]: https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html +[13]: https://opensource.com/sites/default/files/screenshot_from_2020-11-13_20-44-15.png (Documentation for Ansible debugger module) +[14]: https://docs.ansible.com/ansible/2.8/modules/debug_module.html +[15]: https://docs.ansible.com/ansible/2.8/modules/assert_module.html +[16]: https://docs.ansible.com/ansible/2.8/modules/meta_module.html +[17]: https://galaxy.ansible.com/ +[18]: https://opensource.com/downloads/ansible-cheat-sheet diff --git a/sources/tech/20201119 Day 9- Generating a lot of nonsense with an RNN.md b/sources/tech/20201119 Day 9- Generating a lot of nonsense with an RNN.md new file mode 100644 index 0000000000..5b6c7c22f6 --- /dev/null +++ b/sources/tech/20201119 Day 9- Generating a lot of nonsense with an RNN.md @@ -0,0 +1,151 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Day 9: Generating a lot of nonsense with an RNN) +[#]: via: (https://jvns.ca/blog/2020/11/19/day-9--generating-a-lot-of-nonsense-with-an-rnn/) +[#]: author: (Julia Evans https://jvns.ca/) + +Day 9: Generating a lot of nonsense with an RNN +====== + +Hello! On Monday I posted about [generating faces with sketch-rnn][1], which I did using a pre-trained RNN model. + +I want to train that model to genreate more complicated faces (which may or may not work!), but I decided that since I knew literally nothing about neural networks it would be good to start with something simpler: [this char-rnn model from Karpathy that generates text that sounds vaguely Shakespearean][2]. + +After spending some time playing with Tensorflow, I decided to use PyTorch with the [fast.ai][3] helper libraries because it’s what my friend Ray was using for his project. + +Here are some initial things I’ve learned about training neural networks. All of this is pretty disjointed and I still have no idea what I’m doing. + +### there are a lot of tensors + +All the data seems to be tensors! A 1-d tensor is a vector, a 2-d tensor is a matrix, and a 3-d tensor is, well, who knows. This is a little new but I have some vague intuition about tensor products from learning about quantum computing ten [years][4] ago so this seems okay. + +They seem not too bad to manipulate, like `tensor.flatten()` will flatten a multidimensional tensor into a vector. I still feel a bit uncertain about the exact order things get flattened in, I need to experiment & think it through. + +The word “dimension” for tensors is also used in a different way than I expected, like I’d usually think that the “dimension” of a 8x9 matrix is 72 (becuase that’s the dimension of the vector space of 8x9 matrices), but in Torch land the “dimension” of a 8x9 matrix seems to be 2. That seems fine though. + +### there are a lot of dimension mismatches + +I’ve spent a lot of hours over the last couple of days staring at error messages like + +``` +ValueError: Expected target size (77, 64) got torch.Size (77, 70) +``` + +Some reasons I’ve gotten errors like this so far + + * I tried to pass a 3-dimensional tensor to a loss function that wanted a 2-dimensional tensor + * I forgot to embed my input data (which is a bunch of class labels) into a higher dimensional space so that every number turns into a 64-dimensional vector + * I multiplied a vector by a matrix with the wrong dimensions + + + +Something that I find a bit confusing about the tensors and dimension mismatches is that a lot of the time you seem to be able to pass in both a 2-dimensional tensor and a 3-dimensional tensor to the same method. For example, if I have a 2x3 matrix, I can multiply that by a 3x4 tensor, or by a 3x4x89 tensor, or by a 3x92x12x238 tensor, or whatever. This corresponds to what I remember about tensors from quantum computing, but I find a bit harder to think about in terms of numbers in a matrix on a computer. + +I tweeted about this and a bunch of people agreed with me that they have also spent a bunch of time debugging dimension mismatches so at least I’m not alone :) + +### the cross entropy loss in pytorch isn’t the cross entropy + +A “loss function” is basically a function you use to check how similar 2 vectors are. Lower is better. + +Today I got pretty confused because I was trying to compute the cross entropy loss for two identical vectors, and the result wasn’t 0! I thought that the result was going to be 0, because the vectors were identical! + +It turns out that in PyTorch the “cross entropy loss” of x and y isn’t actually the [cross entropy][5] of x and y (which would be 0 if x and y are identical!), instead it’s `cross_entropy(softmax(x), y)` – you apply a “softmax” function to x first. + +### it goes a LOT faster with a GPU + +At some point I was training a model on a CPU, and then I switched to a GPU and every batch trained literally 10x faster. + +### colab is pretty useful + +I’ve been using Google’s [Colab][6], which seems to be a fork of Jupyter notebook. It comes with some free GPUs that you can use, which is nice. + +The main annoying thing I’ve run into about Colab is that they pretty aggressively kill your running notebooks if they’re idle to reduce resource usage. This is actually fine on its own (you can save your data to Google Drive and restore it!). + +BUT as far as I can tell, if I want to use the Google Drive to get my files, I need to reauthenticate the notebook to Google Drive every single time by clicking a link and pasting in an OAuth (or something) code. I don’t really understand why it can’t just authenticate me once and then have it work forever. + +### it’s bad if your training loss never goes down + +I’ve been having the same problem for most of yesterday and today, which is that I have a model and some training data, and when I try to train the model my training loss never improves, which measn that basically the model isn’t training. + +And then when I make predictions from the model, I get results like this: + +``` +eto e enaih eet codosueonites st tne esee ob nmnoesnrertieieeu ooe +``` + +which makes it seem like it’s learned _something_ – those letters are common letters in the English language, sure! It’s better than generating `zxisqqqqxw`, which is more like the results I’d expect if the network hadn’t learned anything at all. But it definitely hasn’t learned a lot. + +### some code that does not work + +If you’re interested in what some code for an RNN that DOES NOT WORK looks like, here’s [the code I’ve written so far][7] + +the neural network part looks like this: + +``` +class RNN(nn.Module): + def __init__(self): + super().__init__() + self.i2h = nn.Linear(nv, nh) # Wxh + self.h2h = nn.Linear(nh, nh) # Whh + self.h2o = nn.Linear(nh, nv) # Why + self.hidden = torch.zeros(1, nh).cuda() + + def forward(self, input): + x = self.i2h(torch.nn.functional.one_hot(input, num_classes=nv).type(torch.FloatTensor).cuda()) + y = self.h2h(self.hidden) + hidden = torch.tanh(y + x) + self.hidden = hidden.detach() + z = self.h2o(hidden) + return z +``` + +and it basically sets up a bunch of matrices that are meant to correspond to this code from Karpathy’s blog post: + +``` +def step(self, x): + # update the hidden state + self.h = np.tanh(np.dot(self.W_hh, self.h) + np.dot(self.W_xh, x)) + # compute the output vector + y = np.dot(self.W_hy, self.h) + return y +``` + +but unlike his code, it does not generate text that looks vaguely Shakespeare after I train it, it generates gibberish! Maybe tomorrow I will find out why. + +Here’s a snippet of code that samples from the model’s output probability vector using a “temperature” – at a very low temperature it just always picks the letter that the model thinks is most likely (which by the way right now in my case is LITERALLY ALWAYS A SPACE which is also a sign that something is wrong). At higher temperatures it might pick another likely letter. + +``` +temperature = 1 +prediction_vector = F.softmax(learn.model(x)[0]/temperature) +v.textify(torch.multinomial(prediction_vector, 1).flatten(), sep='') +``` + +### that’s all! + +As usual when I learn things I am mostly trying to do it without reading any books or watching any videos – there’s this whole video course from that seems pretty good, but for whatever reason I prefer to just bang my head against a problem I’m trying to solve until I get VERY CONFUSED and then resort to reading things that might help me understand what’s going on then. So that’s the plan, we’ll see how it goes. + +It’s been pretty fun so far, I know a bunch of things about loss functions that I didn’t know before at least, and now I kind of know what a softmax is! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/19/day-9--generating-a-lot-of-nonsense-with-an-rnn/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://lots-of-sketchrnn-faces.netlify.app/ +[2]: https://karpathy.github.io/2015/05/21/rnn-effectiveness/ +[3]: https://www.fast.ai/ +[4]: https://github.com/jvns/masters-thesis/ +[5]: https://en.wikipedia.org/wiki/Cross_entropy +[6]: https://colab.research.google.com/ +[7]: https://gist.github.com/jvns/ce24d85c9d645c32b0d552b69359979f diff --git a/sources/tech/20201119 The relationship between labor and open source.md b/sources/tech/20201119 The relationship between labor and open source.md new file mode 100644 index 0000000000..bd600b76fe --- /dev/null +++ b/sources/tech/20201119 The relationship between labor and open source.md @@ -0,0 +1,51 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (The relationship between labor and open source) +[#]: via: (https://opensource.com/article/20/11/working-public-review) +[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja) + +The relationship between labor and open source +====== +Readers of all levels of involvement in open source will find value in +this informative and illustrative book. +![Stack of books for reading][1] + +The open source software ecosystem is a fascinating blend of personal passion projects and massive, collaborative corporate efforts. Sometimes there is even overlap when the passion projects are actually key components of the huge corporate projects or when a corporate project is abandoned by the original maintainers, but someone takes up the cause and makes it their personal passion project. Regardless of where an open source project falls on that spectrum, there is a lot of labor involved in the development and maintenance of open source projects. [_Working in Public: The Making and Maintenance of Open Source Software_][2] by Nadia Eghbal thoroughly examines the relationship between labor and open source. + +In addition to an introduction and conclusion, _Working in Public_ consists of five chapters split between two parts: "Part 1: How People Make" and "Part 2: How People Maintain." The first part covers "GitHub as a platform," "The Structure of an Open Source Project," and "Roles, Incentives, and Relationships." The second part explores "The Work Required by Software" and "Managing the Costs of Production." Each chapter deftly covers the topic at hand and provides copious footnotes and end-notes to support the information presented. + +** + +** + +** + +_![Book cover][3]_ + +_Working in Public_ begins with a brief overview of the history of open software development that covers the free software movement, the open source movement, and the modern, GitHub-centered version of open, which Eghbal notes is more focused on the practical aspects of open than philosophical aspects that are key parts of the free software and open source movements. The book provides a solid history of open source software development before transitioning to an examination of how things—and people—work in open source. There are many examples of the whys and the hows of working in open source, often including amusing analogies to make these complex topics easy to understand for readers who are not already enmeshed in open source. Eghbal’s writing manages to strike a balance between informative and entertaining. + +There is sometimes a tendency to treat coding as the only form of open source labor, but _Working in Public_ does not make that mistake. For example, there is an interesting discussion in the introduction about maintainers having to spend time dealing with minor pull requests instead of writing in-depth, substantive code of their own. Throughout the book, Eghbal explores labor in open source beyond just code. It provides valuable insights for readers of all levels and all manners of open source involvement—project maintainers, casual contributors, and users. + +The only flaw with _Working in Public_ is that it tries to serve as both an introduction to open source and an exploration of the labor involved in open source projects. This makes the book extremely approachable for readers with limited knowledge of open source, but that means that more experienced readers might find themselves skipping over lengthy passages that explain basic concepts. For example, half of the first full paragraph on page 12 is a parenthetical explanation of what software libraries are. The tendency to overexplain basic concepts does not distract from the overarching narrative too much, but it might turn some readers off before they get to the interesting parts. + +Overall, I really recommend picking up a copy of this book. It is enjoyable to read and does a good job of covering its topic, though there are issues brought up in some of the footnotes that are worthy of further exploration by the author or by other researchers. Even the parts of the book that overexplain basic concepts are interesting but, as noted above, may fail to capture the attention of readers who are already well versed in open source development. Minor issues aside, the book provides an engaging overview of the history of open source and an insightful examination of the labor involved in open source development. In short, _Working in Public_ is worth reading whether you are a maintainer, contributor, or user of open source. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/working-public-review + +作者:[Joshua Allen Holm][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/holmja +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/books_read_list_stack_study.png?itok=GZxb9OAv (Stack of books for reading) +[2]: https://www.amazon.com/dp/0578675862/ +[3]: https://opensource.com/sites/default/files/uploads/working_in_public.jpg (Book cover) diff --git a/sources/tech/20201120 Day 10- Training an RNN to count to three.md b/sources/tech/20201120 Day 10- Training an RNN to count to three.md new file mode 100644 index 0000000000..a8352615fb --- /dev/null +++ b/sources/tech/20201120 Day 10- Training an RNN to count to three.md @@ -0,0 +1,56 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Day 10: Training an RNN to count to three) +[#]: via: (https://jvns.ca/blog/2020/11/20/day-10--training-an-rnn-to-count-to-three/) +[#]: author: (Julia Evans https://jvns.ca/) + +Day 10: Training an RNN to count to three +====== + +Yesterday I was trying to train an RNN to generate English that sounds kind of like Shakespeare. That was not working, so today I instead tried to do something MUCH simpler: train an RNN to generate sequences like + +``` +0 1 2 0 1 2 0 1 2 0 1 2 +``` + +and slightly more complicated sequences like + +``` +0 1 2 1 0 1 2 1 0 1 2 1 0 1 2 1 0 +``` + +I used (I think) the exact same RNN that I couldn’t get to work yesterday to generate English by training it on Shakespeare, so it was cool to see that I could at least use it for this much simpler task (memorize short sequences of numbers). + +### the jupyter notebook + +It’s late so I won’t explain all the code in this blog post, but here’s the PyTorch code I wrote to train the RNN to count to three. + + * Here it is as a [github gist][1] + * and [here it is on Colab][2] if you want to run it yourself + + + +In the gist there are a few experiments with different sequence lengths, like (unsurprisingly) it takes longer to train it to memorize a sequence of length 20 than a sequence of length 5. + +### simplifying is nice + +I’m super happy that I got an RNN to do something that I actually understand! I feel pretty hopeful that on Monday I’ll be able to go back to the character RNN problem of trying to get the RNN to generate English words now that I have this simpler thing working. + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/20/day-10--training-an-rnn-to-count-to-three/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://gist.github.com/jvns/b8804fb9d0672ce147a28d22648b4bd7 +[2]: https://colab.research.google.com/gist/jvns/b8804fb9d0672ce147a28d22648b4bd7/rnn-123.ipynb diff --git a/sources/tech/20201120 How we develop success metrics for open source events.md b/sources/tech/20201120 How we develop success metrics for open source events.md new file mode 100644 index 0000000000..392164e686 --- /dev/null +++ b/sources/tech/20201120 How we develop success metrics for open source events.md @@ -0,0 +1,98 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (How we develop success metrics for open source events) +[#]: via: (https://opensource.com/article/20/11/chaoss-open-source-events) +[#]: author: (Neofytos Kolokotronis https://opensource.com/users/neofytosk) + +How we develop success metrics for open source events +====== +The CHAOSS App Ecosystem Working Group is establishing ways to measure +how well virtual and in-person events meet their goals. +![Metrics and a graph illustration][1] + +As many open source communities grow larger and older, they may face problems managing members' engagement. People turn towards metrics to understand large systems and prioritize resources, but there has not been a consensus set of metrics for understanding open source communities. + +The Community Health Analytics Open Source Software ([CHAOSS][2]) project, a Linux Foundation-sponsored community of industry professionals and academics, is working to solve this problem by defining metrics for open source projects. The CHAOSS project focused first on developing metrics for open source event organizers because open source communities often depend on events like hackathons, meetups, conferences, and user group meetings to grow their communities and work on important project updates. + +The [CHAOSS App Ecosystem Working Group][3], which developed the metrics for events and worked together on this article, is comprised of [members][4] who have organized and participated in many open source events. While we developed these metrics to help the GNOME and KDE communities, we believe they can help other open source event organizers create their own metrics strategy. We also hope that more people will be inspired by this work and join us to improve it. + +### How we began + +The CHAOSS App Ecosystem Working Group emerged from the [SCALE 18x][5] conference in March 2020, when CHAOSS and GNOME members began talking about how to measure the [Linux App Summit][6] (LAS) community, an event co-hosted by GNOME and KDE.  + +We realized that we did not have sufficient data to measure our progress towards LAS's goals, and that hindered our ability to make important decisions to support those goals. For LAS (and the whole Linux app ecosystem) to thrive, we recognized the need to be more data-driven in our approach. We also realized the importance of extending this mindset to other similarly organized communities. + +From our experience at [CHAOSScon][7], we found opportunities to partner with the CHAOSS community around open source metrics. Therefore, we organized ourselves under the CHAOSS project, which provides a platform for working on metrics. + +We chose the name App Ecosystem Working Group because one of the GNOME and KDE communities' primary goals is to grow the Linux app ecosystem. Although we had the GNOME and KDE communities in mind at the start, we are creating the metrics to help everyone involved in the effort to grow the Linux app ecosystem. + +We chose to begin with the event organizer use case because of the nature of events: Events tend to have clearly defined boundaries, with a set start and end date, a list of registered attendees, and activities like talks, presentations, and workshops. This clarity does not generally exist in open source projects and communities, where the various projects, contributors, and users are less often strictly defined. + +The GNOME and KDE communities both had events coming up in 2020, so we believed we could iterate faster using feedback gathered from the events we organized, separately and together. + +### Approach to data gathering + +The CHAOSS project uses the [goal-question-metric][8] (GQM) approach to gathering data. One problem with metrics is that often we try to measure everything without understanding how the data will be helpful. But data should help inform decisions. Therefore, the GQM approach starts with a list of high-level goals that are important to a particular persona. + +The goals are the community's strategic objectives. For each goal, we look at questions that help determine whether we are achieving the goal. Metrics then provide quantitative information that helps answer those questions. + +Before diving into metrics, the App Ecosystem Working Group brainstormed goals and the personas that those goals affect. We collected [17 different goals][9], spread across seven stakeholder personas, that a community or project ecosystem might have. + +We collected and curated these goals from community members' experience in major open source projects like GNOME and KDE. Although each community is different, we think most of these goals are relevant to and will help a wide variety of open source projects. + +### Metrics for event organizers + +The [full list of metrics for event organizers][10] focus on three goals that event organizers care about: + + * Attracting and retaining contributors + * Understanding company contributions to an event + * Ensuring events contribute towards diversity goals and closing skill gaps in the community + + + +We came up with 19 questions that event organizers have about how well they are doing in reaching these goals. The metrics are directly linked to these questions to give the event organizers actionable insights. + +### Privacy implications + +While this work was developed by and for the GNOME and KDE communities, we hope that the metrics will help other open source communities. + +While GNOME and KDE have not implemented the metrics yet (and do not yet have a timeline to do so), one known limitation is privacy concerns around data collection. Every geographic location has laws that may limit data collection, which open source and free software projects must take into account. + +Once GNOME and KDE implement these metrics in their communities, they plan to share the legal considerations they took into account. + +### Join us + +We are hopeful that these metrics will be useful to open source event organizers interested in integrating virtual and in-person events into their community-building and engagement strategies. + +If you'd like to participate in developing these metrics, we welcome your experience, insight, and voice! The CHAOSS App Ecosystem Working Group [meets biweekly][11]; please join us. + +You can also communicate with us asynchronously through our [GitHub repository][3]. For more information on other ways to contribute or connect with us, we encourage you to visit the [CHAOSS community participation page][12]. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/chaoss-open-source-events + +作者:[Neofytos Kolokotronis][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/neofytosk +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_graph_stats_blue.png?itok=OKCc_60D (Metrics and a graph illustration) +[2]: https://chaoss.community/ +[3]: https://github.com/chaoss/wg-app-ecosystem +[4]: https://github.com/chaoss/wg-app-ecosystem#contributors +[5]: https://www.socallinuxexpo.org/scale/18x +[6]: https://linuxappsummit.org/ +[7]: https://chaoss.community/chaosscon-2020-eu/ +[8]: https://en.wikipedia.org/wiki/GQM +[9]: https://docs.google.com/document/d/1ghREXIO5C9PLiwXMtouOR4AjPLGz9pD34LIxO8N2-xo/edit +[10]: https://github.com/chaoss/wg-app-ecosystem/blob/master/event-organizers.md +[11]: https://github.com/chaoss/wg-app-ecosystem#workflow +[12]: https://chaoss.community/participate diff --git a/sources/tech/20201120 What do open source product teams do.md b/sources/tech/20201120 What do open source product teams do.md new file mode 100644 index 0000000000..c227ff3b8e --- /dev/null +++ b/sources/tech/20201120 What do open source product teams do.md @@ -0,0 +1,113 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (What do open source product teams do?) +[#]: via: (https://opensource.com/article/20/11/open-source-product-teams) +[#]: author: (Scott McCarty https://opensource.com/users/fatherlinux) + +What do open source product teams do? +====== +Product managers play an essential role in creating differentiated value +that customers will pay for. +![a checklist for a team][1] + +If you go to any hip product management conference, you'll hear about product teams. At a minimum, a product team has a product manager, but it often includes roles in marketing, technical architecture, and even user experience (UX). Previous articles in this series have covered [open source as a supply chain model][2] and [defining products in the open source software supply chain][3], and this article specifically focuses on the role of product management within the product team. + +### Who's on the product team? + +Product managers and product marketing managers are the two most common product management roles, but product management can be further split into any number of roles, including competitive analysis, business strategy, sales enablement, revenue growth, content creation, sales tools, and more. With a very large product, even the product management role may be broken up into separate roles. You may even hear titles like technical marketing manager, product evangelist, and business owner, not to mention people-management roles for groups of individual contributor roles. For the purpose of this article, I refer to all of these roles collectively as "product management." + +Product management is a [tough career][4], and there are many frameworks for learning and understanding it. One of the oldest and most mature is the [Pragmatic Framework][5], which defines 37 different areas of responsibility. The Pragmatic Framework is a bit too complex for this article. Instead, I'll emphasize a subset of tasks that are applicable in open source products: + + * **Market problems:** Talk to customers and figure out what they need + * **Product roadmap:** Determine what features will be added to the product and when + * **Build:** Invest in building technology in-house + * **Buy:** Purchase technology from another company + * **Partner:** Deliver a solution to a customer by leveraging a partner's technology + * **Pricing:** Determine the price + * **Packaging:** Determine what's included in the price + * **Channel training:** Train the salespeople so that they can educate potential customers + + + +The rest of this series will look into how these different roles affect and are affected by an open source supply chain. + +### Build, buy, or partner? + +Which is more important, the business need or the technology? This is probably the classic paradox of business strategy. The answer is neither. Execution is what matters. The product management team is tasked with creating and retaining customers. This can be done by building technology, buying technology, or partnering to acquire technology or services that, when combined, provide value to customers. For example, if customers need an encryption feature that's missing from a software product, the product manager can: + + * Ask engineering to build it, test it, document it, and maintain it. + * Influence the executive team to buy a company or software package that provides it. (However, less than 2% of product managers have access to P&L data, [much less the budget to buy companies][6].) + * Deliver it to the customer through a verified partner. If a partner already provides a solution, this is the quickest way to deliver a solution, but it could raise the product's price or require the customer to purchase additional software. + + + +With traditional proprietary software products and services, this could mean building, buying, or partnering for a foundational piece of software, like a database. With products built on open source software, this can be thought of as choosing an open source project as a supplier. The purchase is made by contributing engineering time, code, documentation, testing, infrastructure, etc. Because open source is not free as in beer, somebody has to write it, test it, document it, etc. It's very difficult to provide value to customers if you don't contribute upstream. + +This combination of built, bought, and partner-delivered capabilities is what differentiates a product, whether open source or proprietary. Proprietary licensing does not differentiate a product. Let me repeat: _proprietary licensing does not differentiate a product_. People confuse proprietary licensing with providing value to a customer. Proprietary licenses are a perfectly valid and useful way to monetize users, but they do not provide customers with more value. Licenses do not create value; they help extract it. If you believe [open core][7] or hybrid licensing are the only way to make money with open source, read this paragraph five times until it sinks in (hint, focus on creating value). + +Both open source and proprietary products must create value. Customers buy capabilities as part of a solution (i.e., new things they couldn't do before). If product management spends more brainpower on delivering capabilities than determining what can be held back with proprietary licensing, the customer will be happier, more loyal, and receive more value. + +### Types of products built on open source + +Most modern software products are delivered by adding new value to the value provided by the open source supply chain. This could include extra downstream testing, documentation, quality engineering, performance testing, security testing, industry certifications, a partner ecosystem, training, professional services, or even extra proprietary code not included upstream (open core). By considering this new model, many of the old debates about open source can be clarified: + + * **Open source products:** The entire supply chain of code that goes into the product is open source. This can include multiple upstream projects like enterprise Linux distributions or sophisticated products like [Red Hat Satellite][8] or [OpenShift][9]. + * **Open core products:** Some of the supply chain of code that goes into the product is open source while other parts are proprietary. This mix of licensing can be used to control pricing, packaging, and distribution. It can also have the downside of putting engineering contributions to the product at odds with the open source supply chain (see _[Goodbye open core—good riddance to bad rubbish][10]_). + * **Paid software-as-a-service products:** The supply chain of SaaS products can be made up of open source languages and libraries, while the business logic built in-house is often proprietary. This allows product managers to tightly control pricing and packaging through very measurable distribution channels. There are many examples of online companies using this model, including customer resource management platforms, databases, caching layers, identity management, document management, and office and email solutions. + * **Free SaaS products:** The supply chain of free SaaS products (e.g., Facebook, Google Search, YouTube, etc.) is essentially the same as paid SaaS products. Instead of tightly controlling the pricing and packaging, the product is monetized through user data or advertisements. + * **Cloud providers vs. software vendors:** The recent interest in and creation of new quasi-open source licenses like the [Server Side Public License][11], [Redis Source Available License][12], or [PolyForm][13] are better understood by thinking of open source as a supply chain and SaaS as a pricing and packaging model. These new licenses exert some control on how buyers from the open source supply chain can price and package their products (e.g., limiting how a large cloud provider can deliver a service built on freely available code and binaries). This is not unheard of, even in traditional manufacturing supply chains. It's a defensive play because these licenses don't deliver new value to customers. + * **Open source as awareness:** In this model, the buzz around the upstream project is used to deliver awareness for the products built on it. In marketing, awareness of a technology is a critical first step for having a product's customers build on it. For example, if users are aware of and believe in Kubernetes, they are potential customers for products built on Kubernetes; when people looking for a Kubernetes solution hear that your product is built on Kubernetes, they immediately become potential customers. In a way, this is similar to Lenovo laptops advertising "Intel inside" or [Arm & Hammer laundry detergent advertising OxiClean][14] as part of their supply chain. If you like OxiClean, you'll love Arm & Hammer detergent. + * **Open core as marketing:** This goes a step further than open source as awareness. A single vendor almost always controls the upstream open source projects that go into open core products. They attempt to use the supply chain, often unsuccessfully, to generate market awareness in what's perceived to be free or inexpensive marketing and lead generation. Open core products advertise that they include the open source project to provide core value propositions. Going back to the Arm & Hammer example: If you like open source, you'll love our proprietary software with open source goodness inside. + + + +### The supply chain + +Continuing the analogy from my [last article][3], when General Motors develops a car, the product team doesn't tell Bosch what fuel injectors they want. They tell Bosch how much power the new vehicle will generate, how much towing capacity it needs to have, etc. They give Bosch a set of technical requirements. Then Bosch provides GM with a fuel-injection solution that not only includes the fuel injectors but also the wiring harnesses and perhaps even software that makes it run. It's cheaper and often better quality to rely on a supply chain for components that are shared among virtually every vehicle in the marketplace. + +Like an automobile, the sum of a software product is greater than the individual parts. When a manufacturer delivers a car, it's more than the braking, steering, power plant, infotainment system, financing, and mechanical service program. It has an associated brand, build quality, reliability, and an experience. Most of the parts aren't differentiated between vendors. Software products, especially ones built on an open source supply chain, are no different. Product management needs to differentiate their products from the underlying software components in the supply chain. The value of a software product is a layer of differentiation built on top of a supply chain of dependencies. This value is what product management must focus on. + +### Differentiated value + +Product management is not about picking and choosing what bugs are fixed upstream or downstream. It's not about holding back enough value in the open source project so that users purchase the product. It's not about coming up with special licenses to monetize an open source project's user base. It's about creating differentiated value that customers will pay for. It's about listening to their needs, internalizing them, and knowing them intimately. It's about influencing a supply chain, switching supply chains, and building a partner ecosystem that gives your product gravity. + +Product managers who think about differentiated value on top of an open source supply chain can easily answer the following questions: + + * As an open source product manager, should I attend conferences for the upstream projects? _Sure, because it's like attending a trade show for one of your suppliers._ + * How should product management handle a situation where the upstream project isn't delivering what their customers need? _Add more investment. If the open source community is healthy, it will produce what you need._ + * What should product management do when an upstream community is struggling with contributions or is unhealthy? _The same thing that a manufacturer would do if their supplier lost contracts with their two biggest competitors because they were failing: switch suppliers._ + + + +In the next article, I will delve into the distinct value created in products, focusing on the value that upstream projects can't provide. If product management is done well, there is no unnatural tension between upstream suppliers and downstream products. When done right, both the upstream projects and downstream products create unique and differentiated value that satisfies the needs of users and customers alike. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/open-source-product-teams + +作者:[Scott McCarty][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/fatherlinux +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_hands_team_collaboration.png?itok=u82QepPk (a checklist for a team) +[2]: https://opensource.com/article/20/10/open-source-supply-chain +[3]: https://opensource.com/article/20/10/defining-product-open-source +[4]: https://www.mindtheproduct.com/forget-product-management-tough-career/ +[5]: https://www.pragmaticinstitute.com/framework +[6]: http://developmentcorporate.com/2019/04/02/the-myth-of-the-product-management-pl/ +[7]: https://medium.com/open-consensus/2-open-core-definition-examples-tradeoffs-e4d0c044da7c +[8]: https://en.wikipedia.org/wiki/Satellite_(software) +[9]: https://en.wikipedia.org/wiki/OpenShift +[10]: https://medium.com/@adamhjk/goodbye-open-core-good-riddance-to-bad-rubbish-ae3355316494 +[11]: https://www.mongodb.com/licensing/server-side-public-license +[12]: https://redislabs.com/wp-content/uploads/2019/03/Redis-Source-Available-License-PDF-2.pdf +[13]: https://polyformproject.org/licenses/ +[14]: https://www.armandhammer.com/laundry/liquid-laundry-detergent/liquid-laundry-detergent/plus-oxiclean-with-fade-defense-liquid-laundry-detergent diff --git a/sources/tech/20201121 Open source brings musicians together virtually.md b/sources/tech/20201121 Open source brings musicians together virtually.md new file mode 100644 index 0000000000..943f21e8ad --- /dev/null +++ b/sources/tech/20201121 Open source brings musicians together virtually.md @@ -0,0 +1,67 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Open source brings musicians together virtually) +[#]: via: (https://opensource.com/article/20/11/open-source-drum-bugle-corps) +[#]: author: (Vicki Walker https://opensource.com/users/vicki-walker) + +Open source brings musicians together virtually +====== +The open source ethos is embedded in many areas of life, including music +and art. +![Drums ][1] + +When the COVID-19 pandemic began canceling live music events in spring 2020, it wasn't just the big arena shows, music festivals, and small, local venues that suffered—the big annual marching band competition leagues, like [Drum Corps International][2] (DCI) and [WGI World Championships][3], were also called off. This was a huge disappointment for the thousands of musicians and band directors who were already preparing for the spring and summer competition season. But the members of the [Drumcorps subreddit][4] saw it as an opportunity to take drum corps virtual. + +The [Open Source Drum and Bugle Corps][5] (OSDBC) is one such organization bringing open source to drum corps. The group was founded on the principles of openness, inclusiveness, and collaboration. And, like most things in open source, OSDBC was created to solve a problem. + +OSDBC launched in early April 2020, in the early weeks of US pandemic-related shutdowns, and immediately had 100 members in the group's Discord; within half a year, its membership approached 400 brass and percussion players across the United States. To date, the organization has released two performances and is working on its third. + +All of the content OSDBC produces—including guides, documentation, sheet music, clicktracks, and virtual performances—is released under [Creative Commons][6] licenses so that other groups can replicate the project if they wish. + +### Who's involved? + +Most OSDBC members are professional musicians, teachers, and high school and college students. Because the drum corps community is relatively small, there's a strong possibility that students and their teachers might be participating together on the same project, leading to uncomfortableness or even potential legal issues relating to students and teachers being in the same group chats. Therefore, OSDBC members work anonymously, wearing hats and sunglasses in their performance videos, and many use pseudonyms within the group. It's an imperfect solution, but it does provide "plausible deniability" about someone's identity, says one member, a high school senior who serves on the project's all-volunteer staff. + +Anonymity also levels the playing field among musicians with different levels of experience, which helps open up collaboration and personal growth opportunities, including the ability to ask for help without fear of embarrassment or judgment. + +Members come from multiple disciplines—musicians, artists, composers, and audio engineers—volunteering their time and talent to produce multimedia content. Because everyone is a volunteer, there is no cost to be involved in the project. + +### How it works + +Unlike a typical drum corps, OSDBC can't perform together in person, first, because of the pandemic, and second because of the members' geographical distribution. Selecting a composition is a community effort, with votes taken both to pick a public domain musical piece to play and then to choose a composer (based on members' original compositions of the selected piece). The winner of the composition contest distributes sheet music, clicktracks, and advice for playing the piece, and the audio and video editors share [submission guidelines][7] about how to record and submit videos for inclusion in the project. Approximately a fifth of the members have submitted performances for each of the first three projects. + +Once the submission deadline has passed and all the performances are collected, the design team begins to mix the individual videos into a cohesive performance. + +Because editing a performance is a significant amount of work that requires specialized audio and video production knowledge and tools, the work is distributed among section leaders (e.g., trumpets, low brass, percussion, etc.). They use a mix of open source and proprietary software, chiefly [Audacity][8], Reaper, and FL Studios, to produce the videos; while open source is the preference, the members must use the applications that they are familiar with and have access to at their universities or jobs. + +### Get involved + +OSDBC plans to continue working together even after the COVID-19 pandemic. Given the uncertainty around the 2021 drum corps season, with WGI planning a virtual season and DCI weighing the feasibility of an abbreviated season, OSDBC provides a valuable option for the tight-knit community to collaborate and make music together. + +The project eagerly welcomes new performers, organizers, arrangers, and others. If you would like to get involved, visit the [website][5] and join the project's [Discord][9] for updated information and opportunities to participate in the next project. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/open-source-drum-bugle-corps + +作者:[Vicki Walker][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/vicki-walker +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/drums-beat.png?itok=vhr6E_f1 (Drums ) +[2]: https://www.dci.org/ +[3]: https://www.wgi.org/ +[4]: https://www.reddit.com/r/drumcorps/ +[5]: https://opensourcedbc.org/ +[6]: https://creativecommons.org/ +[7]: https://opensourcedbc.org/info-for-members/ +[8]: https://opensource.com/education/16/9/audacity-classroom +[9]: https://discord.gg/6QmCSK3 diff --git a/sources/tech/20201123 A beginner-s guide to Kubernetes Jobs and CronJobs.md b/sources/tech/20201123 A beginner-s guide to Kubernetes Jobs and CronJobs.md new file mode 100644 index 0000000000..21af972870 --- /dev/null +++ b/sources/tech/20201123 A beginner-s guide to Kubernetes Jobs and CronJobs.md @@ -0,0 +1,233 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A beginner's guide to Kubernetes Jobs and CronJobs) +[#]: via: (https://opensource.com/article/20/11/kubernetes-jobs-cronjobs) +[#]: author: (Mike Calizo https://opensource.com/users/mcalizo) + +A beginner's guide to Kubernetes Jobs and CronJobs +====== +Use Jobs and CronJobs to control and manage Kubernetes pods and +containers. +![Ships at sea on the web][1] + +[Kubernetes][2] is the default orchestration engine for containers. Its options for controlling and managing pods and containers include: + + 1. Deployments + 2. StatefulSets + 3. ReplicaSets + + + +Each of these features has its own purpose, with the common function to ensure that pods run continuously. In failure scenarios, these controllers either restart or reschedule pods to ensure the services in the pods continue running. + +As the [Kubernetes documentation explains][3], a Kubernetes Job creates one or more pods and ensures that a specified number of the pods terminates when the task (Job) completes. + +Just like in a typical operating system, the ability to perform automated, scheduled jobs without user interaction is important in the Kubernetes world. But Kubernetes Jobs do more than just run automated jobs, and there are multiple ways to utilize them through: + + 1. Jobs + 2. CronJobs + 3. Work queues (this is beyond the scope of this article) + + + +Sounds simple right? Well, maybe. Anyone who works on containers and microservice applications knows that some require services to be transient so that they can do specific tasks for applications or within the Kubernetes clusters. + +In this article, I will go into why Kubernetes Jobs are important, how to create Jobs and CronJobs, and when to use them for applications running on the Kubernetes cluster. + +### Differences between Kubernetes Jobs and CronJobs + +Kubernetes Jobs are used to create transient pods that perform specific tasks they are assigned to. [CronJobs][4] do the same thing, but they run tasks based on a defined schedule. + +Jobs play an important role in Kubernetes, especially for running batch processes or important ad-hoc operations. Jobs differ from other Kubernetes controllers in that they run tasks until completion, rather than managing the desired state such as in Deployments, ReplicaSets, and StatefulSets. + +### How to create Kubernetes Jobs and CronJobs + +With that background in hand, you can start creating Jobs and CronJobs. + +#### Prerequisites + +To do this exercise, you need to have the following: + + 1. A working Kubernetes cluster; you can install it with either: + * [CentOS 8][5] + * [Minikube][6] + 2. The [kubectl][7] Kubernetes command line + + + +Here is the Minikube deployment I used for this demonstration: + + +``` +$ minikube version +minikube version: v1.8.1 + +$ kubectl cluster-info +Kubernetes master is running at +KubeDNS is running at + +$ kubectl get nodes +NAME       STATUS   ROLES    AGE   VERSION +minikube   Ready    master   88s   v1.17.3 +``` + +#### Kubernetes Jobs + +Just like anything else in the Kubernetes world, you can create Kubernetes Jobs with a definition file. Create a file called `sample-jobs.yaml` using your favorite editor. + +Here is a snippet of the file that you can use to create an example Kubernetes Job: + + +``` +apiVersion: batch/v1          ## The version of the Kubernetes API +kind: Job                     ## The type of object for jobs +metadata: + name: job-test +spec:                        ## What state you desire for the object + template: +   metadata: +     name: job-test +   spec: +     containers: +     - name: job +       image: busybox                  ##  Image used +       command: ["echo", "job-test"]   ##  Command used to create logs for verification later +     restartPolicy: OnFailure          ##  Restart Policy in case container failed +``` + +Next, apply the Jobs in the cluster: + + +``` +`$ kubectl apply -f sample-jobs.yaml` +``` + +Wait a few minutes for the pods to be created. You can view the pod creation's status: + + +``` +`$ kubectl get pod –watch` +``` + +After a few seconds, you should see your pod created successfully: + + +``` +$ kubectl get pods +  NAME                  READY   STATUS          RESTARTS         AGE +  job-test                      0/1     Completed       0            11s +``` + +Once the pods are created, verify the Job's logs: + + +``` +`$ kubectl logs job-test job-test` +``` + +You have created your first Kubernetes Job, and you can explore details about it: + + +``` +`$ kubectl describe job job-test` +``` + +Clean up the Jobs: + + +``` +`$ kubectl delete jobs job-test` +``` + +#### Kubernetes CronJobs + +You can use CronJobs for cluster tasks that need to be executed on a predefined schedule. As the [documentation explains][8], they are useful for periodic and recurring tasks, like running backups, sending emails, or scheduling individual tasks for a specific time, such as when your cluster is likely to be idle. + +As with Jobs, you can create CronJobs via a definition file. Following is a snippet of the CronJob file `cron-test.yaml`. Use this file to create an example CronJob: + + +``` +apiVersion: batch/v1beta1            ## The version of the Kubernetes API +kind: CronJob                        ## The type of object for Cron jobs +metadata: +  name: cron-test +spec: +  schedule: "*/1 * * * *"            ## Defined schedule using the *nix style cron syntax +  jobTemplate: +    spec: +      template: +        spec: +          containers: +          - name: cron-test +            image: busybox            ## Image used +            args: +           - /bin/sh +            - -c +            - date; echo Hello this is Cron test +          restartPolicy: OnFailure    ##  Restart Policy in case container failed +``` + +Apply the CronJob to your cluster: + + +``` +$ kubectl apply -f cron-test.yaml + cronjob.batch/cron-test created +``` + +Verify that the CronJob was created with the schedule in the definition file: + + +``` +$ kubectl get cronjob cron-test + NAME        SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE + cron-test   */1 * * * *   False     0        <none>          10s +``` + +After a few seconds, you can find the pods that the last scheduled job created and view the standard output of one of the pods: + + +``` +$ kubectl logs cron-test-1604870760 +  Sun Nov  8 21:26:09 UTC 2020 +  Hello from the Kubernetes cluster +``` + +You have created a Kubernetes CronJob that creates an object once per execution based on the schedule `schedule: "*/1 * * * *"`. Sometimes the creation can be missed because of environmental issues in the cluster. Therefore, they need to be [idempotent][9]. + +### Other things to know + +Unlike deployments and services in Kubernetes, you can't change the same Job configuration file and reapply it at once. When you make changes in the Job configuration file, you must delete the previous Job from the cluster before you apply it. + +Generally, creating a Job creates a single pod and performs the given task, as in the example above. But by using completions and [parallelism][10], you can initiate several pods, one after the other. + +### Use your Jobs + +You can use Kubernetes Jobs and CronJobs to manage your containerized applications. Jobs are important in Kubernetes application deployment patterns where you need a communication mechanism along with interactions between pods and the platforms. This may include cases where an application needs a "controller" or a "watcher" to complete tasks or needs to be scheduled to run periodically. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/11/kubernetes-jobs-cronjobs + +作者:[Mike Calizo][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/mcalizo +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes_containers_ship_lead.png?itok=9EUnSwci (Ships at sea on the web) +[2]: https://kubernetes.io/ +[3]: https://kubernetes.io/docs/concepts/workloads/controllers/job/ +[4]: https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ +[5]: https://phoenixnap.com/kb/how-to-install-kubernetes-on-centos +[6]: https://minikube.sigs.k8s.io/docs/start/ +[7]: https://kubernetes.io/docs/reference/kubectl/kubectl/ +[8]: https://v1-18.docs.kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ +[9]: https://en.wikipedia.org/wiki/Idempotence +[10]: https://kubernetes.io/docs/concepts/workloads/controllers/job/#parallel-jobs diff --git a/sources/tech/20201123 Day 11- learning about learning rates.md b/sources/tech/20201123 Day 11- learning about learning rates.md new file mode 100644 index 0000000000..12be99f3be --- /dev/null +++ b/sources/tech/20201123 Day 11- learning about learning rates.md @@ -0,0 +1,105 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Day 11: learning about learning rates) +[#]: via: (https://jvns.ca/blog/2020/11/23/day-11--learning-about-learning-rates/) +[#]: author: (Julia Evans https://jvns.ca/) + +Day 11: learning about learning rates +====== + +Hello! + +On Friday I trained an RNN to count to 3 (1 2 3 1 2 3 1 2 3), thanks to some great advice from another Recurser. I figured that once I got that working, I could then extend that and train the same RNN on a bunch of Shakespearean text to get it to generate vaguely Shakespeare-y text. + +But on Friday I couldn’t get that to work! I was puzzled by this, but today I figured out what was happening. + +### what’s a learning rate? + +First, here’s a very short “deep learning for math majors” explanation of how training for a deep learning model works in general. I wrote this to help consolidate my own understanding on Friday. + + * The model takes the training data and weights and outputs a single number, the output of the loss function + * The model’s “weights” are the parameters of all the matrices in the model, like if there’s a 64 x 64 matrix then there are 4096 weights + * For optimization purposes, this function should be thought of as a function of the weights (not the training data), since the weights are going to change and the function isn’t + * Training is basically gradient descent. You take the derivative of the function (aka gradient), with respect to the weights of all the matrices/various functions in the model + * The way you take this derivative is using the chain rule, the algorithm for applying the chain rule to a neural network is called “backpropagation” + * Then you adjust the parameters by a multiple of the gradient (since this is gradient descent). The multiple of the gradient that you use is called the **learning rate** – it’s basically `parameters -= learning_rate * gradient` + * machine learning model training is a lot like general continuous function optimization in that finding the “right” step size to do gradient descent is basically impossible so there are a lot of heuristics for picking step learning rates that will work. One of these heuristics is called [Adam][1] + + + +### if you set your learning rate too high, the model won’t learn anything + +So back to our original problem: when I was training my model to generate Shakespeare, I noticed that my model wasn’t learning anything! By “not learning anything”, I mean that the value of the loss function was not going down over time. + +I eventually figured out that this was because my learning rate was too high! It was 0.01 or something, and changing it to more like 0.002 resulted in more learning progress. Hooray! + +I started to generate text like this: + +``` +erlon, w oller. is. d y ivell iver ave esiheres tligh? e ispeafeink +teldenauke'envexes. h exinkes ror h. ser. sat ly. spon, exang oighis yn, y +hire aning is's es itrt. for ineull ul'cl r er. s unt. y ch er e s out twiof +uranter h measaker h exaw; speclare y towessithisil's aches? s es, tith s aat +``` + +which is a big improvement over what I had previously, which was: + +``` +kf ;o 'gen '9k ',nrhna 'v ;3; ;'rph 'g ;o kpr ;3;tavrnad 'ps ;]; ;];oraropr +;9vnotararaelpot ;9vr ;9 +``` + +But then training stalled again, and I felt like I could still do better. + +### resetting the state of the optimizer is VERY BAD + +It turned out that the reason training had stalled the second time was that my code looked like this: + +``` +for i in range(something): + optimizer = torch.optim.Adam(rnn.parameters()) + ... do training things +``` + +I’d written the code this way because I didn’t realize that the state of the optimizer (“Adam”) was important, so I just reset it sometimes because it seemed convenient at the time. + +It turns out that the optimizer’s state is very important, I think because it slowly reduces the training rate as training progresses. So I reorganized my code so that I only initialized the optimizer once at the beginning of training. + +I also made sure that when I saved my model, I also saved the optimizer’s state: + +``` +torch.save({'model_state_dict': rnn.state_dict(), 'optimizer_dict': optimizer.state_dict()}, MODEL_PATH) +``` + +Here’s the “Shakespeare” the model was generating after I stopped resetting the optimizer all the time: + +``` +at soerin, I kanth as jow gill fimes, To metes think our wink we in fatching +and, Drose, How the wit? our arpear War, our in wioken alous, To thigh dies wit +stain! navinge a sput pie, thick done a my wiscian. Hark's king, and Evit night +and find. Woman steed and oppet, I diplifire, and evole witk ud +``` + +It’s a big improvement! There are some actual English words in there! “Woman steed and oppet!” + +### that’s it for today! + +Tomorrow my goal is to learn what “BPTT” means and see if I can use it to train this model more quickly and maybe give it a bigger hidden state than 87 parameters. And once I’ve done that, maybe I can start to train more interesting models!! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2020/11/23/day-11--learning-about-learning-rates/ + +作者:[Julia Evans][a] +选题:[lujun9972][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Adam diff --git a/sources/tech/20201124 A beginner-s guide to developing with React.md b/sources/tech/20201124 A beginner-s guide to developing with React.md new file mode 100644 index 0000000000..7928fb6b43 --- /dev/null +++ b/sources/tech/20201124 A beginner-s guide to developing with React.md @@ -0,0 +1,284 @@ +[#]: collector: (lujun9972) +[#]: translator: ( ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (A beginner's guide to developing with React) +[#]: via: (https://opensource.com/article/20/11/reactjs-tutorial) +[#]: author: (Shedrack Akintayo https://opensource.com/users/shedrack-akintayo) + +A beginner's guide to developing with React +====== +A step-by-step guide to using React in your web and mobile user +interfaces. +![Gears connecting][1] + +[React][2] is a JavaScript user interface (UI) library that was built and is maintained by Facebook. React helps JavaScript developers think logically and functionally about how they want to build a UI. + +With React, you can build: + + 1. Single-page applications + 2. Applications that are easy to understand + 3. Scalable applications + 4. Cross-platform applications + + + +React allows developers to build applications declaratively and offers a unidirectional flow of data. + +### React's advantages + +The following features explain why React is one of the [most popular][3] web frameworks. + + * **It is declarative:** React makes it extremely painless to build interactive user interfaces, design basic views for your application based on various states, and update and render new views when the data in your application changes. + * **It is component-based:** React gives you the ability to build encapsulated components that can manage their own state, then puts them together to build complex UIs. The logic of these components is written in JavaScript instead of templates, so you easily pass actual data and keep state out of the [document object model][4] (DOM). + * **You can learn once, write anywhere:** React gives you the ability to build for both mobile (React Native) and the web. There's no need to rewrite your existing codebase; you can just integrate React with your existing code. + * **The virtual DOM:** React introduced a wrapper around the regular DOM called the virtual DOM (VDOM). This allows React to render elements and update its state faster than the regular DOM. + * **Performance:** React has great performance benefits due to the VDOM and one-way flow of data. + + + +### The virtual DOM + +React's VDOM is like a virtual copy of the original DOM. It offers one-way data binding, which makes manipulating and updating the VDOM quicker than updating the original DOM. The VDOM can handle multiple operations in milliseconds without affecting the general page performance. + +This VDOM supports React's declarative API: You basically tell React what state you want the UI to be in, and it ensures that the DOM matches that state. + +### Prerequisites for learning React + +Learning React requires basic knowledge of JavaScript, HTML, and CSS. To use React's power effectively, it helps to be familiar with [ECMAScript 6][5] (ES6) and functional and object-oriented programming. + +You also need the following things installed on your computer: + + * [NodeJS][6] + * [npm][7] (comes bundled with NodeJS) + * [Yarn][8] (an alternative to NPM) + + + +### Basic React concepts + +It also helps to have an understanding of React's concepts. + +#### Components + +Components are standalone, reusable pieces of code. They have the same purpose as JavaScript functions but work alone and return HTML via a built-in render function. They are two main types of components: + + * **Class components** offer more control in the form of lifecycle hooks, managing and handling state, and API calls. For example: [code] class MyComponent extends React.Component { +  render() { +    return <div>This is a class component</div>; +  } +} +``` + * **Functional components** were used for rendering just views without any form of state management or data request until [React Hooks][9] was introduced. For example: [code] Function myComponent() { +  return ( +      <div>A functional Component</div> +  ) + } +``` + + + +#### Props + +React props are like function arguments in JavaScript and attributes in HTML. They are read-only. For example: + + +``` +function Welcome(props) { +  return <h1>Hello, {props.name}</h1>; +} +``` + +#### State + +React components have a built-in object called _state_, which is where you store property values that belong to a particular component. If a component's state changes at any point in time, the component re-renders. For example: + + +``` +class Car extends React.Component { +  constructor(props) { +    super(props); +    this.state = { brand: 'Ford' }; +  } +  render() { +    return ( +      <div> +        <h1>My Car</h1> +      </div> +    ); +  } +} +``` + +#### JSX + +JSX is a syntax extension to JavaScript. It is similar to a template language but has the full power of JavaScript. JSX is compiled to `React.createElement()` calls, which return plain JavaScript objects called _React elements_. For example: + + +``` +return ( +  <div> +    <h1>My Car</h1> +  </div> +); +``` + +The code between the return method that looks like HTML is JSX. + +### How to use React + +Ready to get started? I'll go step-by-step through two options for using React in your app: + + * Adding its content delivery network (CDN) to your HTML file + * Starting a blank React app with Create React App + + + +#### Add its CDN to your HTML file + +You can quickly use React in your HTML page by adding its CDN directly to your HTML file using the following steps: + +**Step 1:** In the HTML page you want to add React to, add an empty `
            ` tag to create a container where you want to render something with React. For example: + + +``` +<!-- ... old HTML ... --> + +<[div][10] id="button_container"></[div][10]> + +<!-- ... old HTML ... --> +``` + +**Step 2:** Add three `